From d127ea5be1582cafab0a170378cd07f1d3eba610 Mon Sep 17 00:00:00 2001 From: Akhil Masihadas Date: Fri, 19 Jun 2026 14:50:37 +0530 Subject: [PATCH] Initial commit --- .../.github/workflows/dispatch-to-grader.yml | 33 + Playwright-Cucumber-Exercise-main/.gitignore | 3 + Playwright-Cucumber-Exercise-main/README.md | 58 + Playwright-Cucumber-Exercise-main/cucumber.js | 3 + .../features/login.feature | 11 + .../features/logout.feature | 10 + .../features/product.feature | 15 + .../features/purchase.feature | 12 + .../generate-report.js | 13 + .../hooks/globalHooks.ts | 17 + .../hooks/pageFixture.ts | 5 + .../package-lock.json | 2762 + .../package.json | 15 + .../pages/login.page.ts | 26 + .../pages/menu.page.ts | 17 + .../pages/product.page.ts | 47 + .../pages/purchasePage.ts | 52 + .../playwright.config.ts | 9 + .../playwrightUtilities.ts | 33 + .../steps/common.steps.ts | 6 + .../steps/login.steps.ts | 11 + .../steps/logout.steps.ts | 19 + .../steps/product.steps.ts | 17 + .../steps/purchaseSteps.ts | 25 + .../tsconfig.json | 16 + node_modules/.bin/cucumber-js | 16 + node_modules/.bin/cucumber-js.cmd | 17 + node_modules/.bin/cucumber-js.ps1 | 28 + node_modules/.bin/gherkin-javascript | 16 + node_modules/.bin/gherkin-javascript.cmd | 17 + node_modules/.bin/gherkin-javascript.ps1 | 28 + node_modules/.bin/gherkin-utils | 16 + node_modules/.bin/gherkin-utils.cmd | 17 + node_modules/.bin/gherkin-utils.ps1 | 28 + node_modules/.bin/mime | 16 + node_modules/.bin/mime.cmd | 17 + node_modules/.bin/mime.ps1 | 28 + node_modules/.bin/mkdirp | 16 + node_modules/.bin/mkdirp.cmd | 17 + node_modules/.bin/mkdirp.ps1 | 28 + node_modules/.bin/playwright | 16 + node_modules/.bin/playwright-core | 16 + node_modules/.bin/playwright-core.cmd | 17 + node_modules/.bin/playwright-core.ps1 | 28 + node_modules/.bin/playwright.cmd | 17 + node_modules/.bin/playwright.ps1 | 28 + node_modules/.bin/regexp-tree | 16 + node_modules/.bin/regexp-tree.cmd | 17 + node_modules/.bin/regexp-tree.ps1 | 28 + node_modules/.bin/semver | 16 + node_modules/.bin/semver.cmd | 17 + node_modules/.bin/semver.ps1 | 28 + node_modules/.bin/yaml | 16 + node_modules/.bin/yaml.cmd | 17 + node_modules/.bin/yaml.ps1 | 28 + node_modules/.package-lock.json | 1319 + node_modules/@babel/code-frame/LICENSE | 22 + node_modules/@babel/code-frame/README.md | 19 + node_modules/@babel/code-frame/lib/index.js | 217 + .../@babel/code-frame/lib/index.js.map | 1 + node_modules/@babel/code-frame/package.json | 32 + .../helper-validator-identifier/LICENSE | 22 + .../helper-validator-identifier/README.md | 19 + .../lib/identifier.js | 70 + .../lib/identifier.js.map | 1 + .../helper-validator-identifier/lib/index.js | 57 + .../lib/index.js.map | 1 + .../lib/keyword.js | 35 + .../lib/keyword.js.map | 1 + .../helper-validator-identifier/package.json | 31 + node_modules/@colors/colors/LICENSE | 26 + node_modules/@colors/colors/README.md | 219 + .../@colors/colors/examples/normal-usage.js | 83 + .../@colors/colors/examples/safe-string.js | 80 + node_modules/@colors/colors/index.d.ts | 136 + node_modules/@colors/colors/lib/colors.js | 211 + .../@colors/colors/lib/custom/trap.js | 46 + .../@colors/colors/lib/custom/zalgo.js | 110 + .../colors/lib/extendStringPrototype.js | 110 + node_modules/@colors/colors/lib/index.js | 13 + .../@colors/colors/lib/maps/america.js | 10 + .../@colors/colors/lib/maps/rainbow.js | 12 + .../@colors/colors/lib/maps/random.js | 11 + node_modules/@colors/colors/lib/maps/zebra.js | 5 + node_modules/@colors/colors/lib/styles.js | 95 + .../@colors/colors/lib/system/has-flag.js | 35 + .../colors/lib/system/supports-colors.js | 151 + node_modules/@colors/colors/package.json | 45 + node_modules/@colors/colors/safe.d.ts | 48 + node_modules/@colors/colors/safe.js | 10 + .../@colors/colors/themes/generic-logging.js | 12 + node_modules/@cucumber/ci-environment/LICENSE | 21 + .../ci-environment/dist/cjs/package.json | 1 + .../dist/cjs/src/CiEnvironments.d.ts | 3 + .../dist/cjs/src/CiEnvironments.d.ts.map | 1 + .../dist/cjs/src/CiEnvironments.js | 166 + .../dist/cjs/src/CiEnvironments.js.map | 1 + .../dist/cjs/src/detectCiEnvironment.d.ts | 4 + .../dist/cjs/src/detectCiEnvironment.d.ts.map | 1 + .../dist/cjs/src/detectCiEnvironment.js | 105 + .../dist/cjs/src/detectCiEnvironment.js.map | 1 + .../cjs/src/evaluateVariableExpression.d.ts | 3 + .../src/evaluateVariableExpression.d.ts.map | 1 + .../cjs/src/evaluateVariableExpression.js | 102 + .../cjs/src/evaluateVariableExpression.js.map | 1 + .../ci-environment/dist/cjs/src/index.d.ts | 4 + .../dist/cjs/src/index.d.ts.map | 1 + .../ci-environment/dist/cjs/src/index.js | 23 + .../ci-environment/dist/cjs/src/index.js.map | 1 + .../ci-environment/dist/cjs/src/types.d.ts | 17 + .../dist/cjs/src/types.d.ts.map | 1 + .../ci-environment/dist/cjs/src/types.js | 3 + .../ci-environment/dist/cjs/src/types.js.map | 1 + .../dist/cjs/test/acceptanceTest.d.ts | 2 + .../dist/cjs/test/acceptanceTest.d.ts.map | 1 + .../dist/cjs/test/acceptanceTest.js | 50 + .../dist/cjs/test/acceptanceTest.js.map | 1 + .../test/evaluateVariableExpressionTest.d.ts | 2 + .../evaluateVariableExpressionTest.d.ts.map | 1 + .../test/evaluateVariableExpressionTest.js | 40 + .../evaluateVariableExpressionTest.js.map | 1 + .../gitHubPullRequestIntegrationTest.d.ts | 2 + .../gitHubPullRequestIntegrationTest.d.ts.map | 1 + .../test/gitHubPullRequestIntegrationTest.js | 18 + .../gitHubPullRequestIntegrationTest.js.map | 1 + .../cjs/test/removeUserInfoFromUrlTest.d.ts | 2 + .../test/removeUserInfoFromUrlTest.d.ts.map | 1 + .../cjs/test/removeUserInfoFromUrlTest.js | 27 + .../cjs/test/removeUserInfoFromUrlTest.js.map | 1 + .../dist/cjs/tsconfig.build-cjs.tsbuildinfo | 1 + .../dist/esm/src/CiEnvironments.d.ts | 3 + .../dist/esm/src/CiEnvironments.d.ts.map | 1 + .../dist/esm/src/CiEnvironments.js | 163 + .../dist/esm/src/CiEnvironments.js.map | 1 + .../dist/esm/src/detectCiEnvironment.d.ts | 4 + .../dist/esm/src/detectCiEnvironment.d.ts.map | 1 + .../dist/esm/src/detectCiEnvironment.js | 66 + .../dist/esm/src/detectCiEnvironment.js.map | 1 + .../esm/src/evaluateVariableExpression.d.ts | 3 + .../src/evaluateVariableExpression.d.ts.map | 1 + .../esm/src/evaluateVariableExpression.js | 46 + .../esm/src/evaluateVariableExpression.js.map | 1 + .../ci-environment/dist/esm/src/index.d.ts | 4 + .../dist/esm/src/index.d.ts.map | 1 + .../ci-environment/dist/esm/src/index.js | 4 + .../ci-environment/dist/esm/src/index.js.map | 1 + .../ci-environment/dist/esm/src/types.d.ts | 17 + .../dist/esm/src/types.d.ts.map | 1 + .../ci-environment/dist/esm/src/types.js | 2 + .../ci-environment/dist/esm/src/types.js.map | 1 + .../dist/esm/test/acceptanceTest.d.ts | 2 + .../dist/esm/test/acceptanceTest.d.ts.map | 1 + .../dist/esm/test/acceptanceTest.js | 20 + .../dist/esm/test/acceptanceTest.js.map | 1 + .../test/evaluateVariableExpressionTest.d.ts | 2 + .../evaluateVariableExpressionTest.d.ts.map | 1 + .../test/evaluateVariableExpressionTest.js | 35 + .../evaluateVariableExpressionTest.js.map | 1 + .../gitHubPullRequestIntegrationTest.d.ts | 2 + .../gitHubPullRequestIntegrationTest.d.ts.map | 1 + .../test/gitHubPullRequestIntegrationTest.js | 13 + .../gitHubPullRequestIntegrationTest.js.map | 1 + .../esm/test/removeUserInfoFromUrlTest.d.ts | 2 + .../test/removeUserInfoFromUrlTest.d.ts.map | 1 + .../esm/test/removeUserInfoFromUrlTest.js | 22 + .../esm/test/removeUserInfoFromUrlTest.js.map | 1 + .../dist/esm/tsconfig.build-esm.tsbuildinfo | 1 + .../@cucumber/ci-environment/package.json | 69 + .../@cucumber/cucumber-expressions/LICENSE | 21 + .../dist/cjs/package.json | 4 + .../dist/cjs/src/Argument.d.ts | 16 + .../dist/cjs/src/Argument.d.ts.map | 1 + .../dist/cjs/src/Argument.js | 37 + .../dist/cjs/src/Argument.js.map | 1 + .../dist/cjs/src/Ast.d.ts | 45 + .../dist/cjs/src/Ast.d.ts.map | 1 + .../cucumber-expressions/dist/cjs/src/Ast.js | 141 + .../dist/cjs/src/Ast.js.map | 1 + ...mbinatorialGeneratedExpressionFactory.d.ts | 10 + ...atorialGeneratedExpressionFactory.d.ts.map | 1 + ...CombinatorialGeneratedExpressionFactory.js | 43 + ...inatorialGeneratedExpressionFactory.js.map | 1 + .../dist/cjs/src/CucumberExpression.d.ts | 30 + .../dist/cjs/src/CucumberExpression.d.ts.map | 1 + .../dist/cjs/src/CucumberExpression.js | 123 + .../dist/cjs/src/CucumberExpression.js.map | 1 + .../dist/cjs/src/CucumberExpressionError.d.ts | 3 + .../cjs/src/CucumberExpressionError.d.ts.map | 1 + .../dist/cjs/src/CucumberExpressionError.js | 6 + .../cjs/src/CucumberExpressionError.js.map | 1 + .../cjs/src/CucumberExpressionGenerator.d.ts | 10 + .../src/CucumberExpressionGenerator.d.ts.map | 1 + .../cjs/src/CucumberExpressionGenerator.js | 78 + .../src/CucumberExpressionGenerator.js.map | 1 + .../cjs/src/CucumberExpressionParser.d.ts | 5 + .../cjs/src/CucumberExpressionParser.d.ts.map | 1 + .../dist/cjs/src/CucumberExpressionParser.js | 240 + .../cjs/src/CucumberExpressionParser.js.map | 1 + .../cjs/src/CucumberExpressionTokenizer.d.ts | 5 + .../src/CucumberExpressionTokenizer.d.ts.map | 1 + .../cjs/src/CucumberExpressionTokenizer.js | 75 + .../src/CucumberExpressionTokenizer.js.map | 1 + .../dist/cjs/src/Errors.d.ts | 25 + .../dist/cjs/src/Errors.d.ts.map | 1 + .../dist/cjs/src/Errors.js | 113 + .../dist/cjs/src/Errors.js.map | 1 + .../dist/cjs/src/ExpressionFactory.d.ts | 8 + .../dist/cjs/src/ExpressionFactory.d.ts.map | 1 + .../dist/cjs/src/ExpressionFactory.js | 20 + .../dist/cjs/src/ExpressionFactory.js.map | 1 + .../dist/cjs/src/GeneratedExpression.d.ts | 19 + .../dist/cjs/src/GeneratedExpression.d.ts.map | 1 + .../dist/cjs/src/GeneratedExpression.js | 59 + .../dist/cjs/src/GeneratedExpression.js.map | 1 + .../dist/cjs/src/Group.d.ts | 20 + .../dist/cjs/src/Group.d.ts.map | 1 + .../dist/cjs/src/Group.js | 25 + .../dist/cjs/src/Group.js.map | 1 + .../dist/cjs/src/GroupBuilder.d.ts | 13 + .../dist/cjs/src/GroupBuilder.d.ts.map | 1 + .../dist/cjs/src/GroupBuilder.js | 34 + .../dist/cjs/src/GroupBuilder.js.map | 1 + .../dist/cjs/src/ParameterType.d.ts | 32 + .../dist/cjs/src/ParameterType.d.ts.map | 1 + .../dist/cjs/src/ParameterType.js | 101 + .../dist/cjs/src/ParameterType.js.map | 1 + .../dist/cjs/src/ParameterTypeMatcher.d.ts | 18 + .../cjs/src/ParameterTypeMatcher.d.ts.map | 1 + .../dist/cjs/src/ParameterTypeMatcher.js | 63 + .../dist/cjs/src/ParameterTypeMatcher.js.map | 1 + .../dist/cjs/src/ParameterTypeRegistry.d.ts | 12 + .../cjs/src/ParameterTypeRegistry.d.ts.map | 1 + .../dist/cjs/src/ParameterTypeRegistry.js | 70 + .../dist/cjs/src/ParameterTypeRegistry.js.map | 1 + .../dist/cjs/src/RegularExpression.d.ts | 12 + .../dist/cjs/src/RegularExpression.d.ts.map | 1 + .../dist/cjs/src/RegularExpression.js | 36 + .../dist/cjs/src/RegularExpression.js.map | 1 + .../dist/cjs/src/TreeRegexp.d.ts | 11 + .../dist/cjs/src/TreeRegexp.d.ts.map | 1 + .../dist/cjs/src/TreeRegexp.js | 89 + .../dist/cjs/src/TreeRegexp.js.map | 1 + .../cjs/src/defineDefaultParameterTypes.d.ts | 3 + .../src/defineDefaultParameterTypes.d.ts.map | 1 + .../cjs/src/defineDefaultParameterTypes.js | 26 + .../src/defineDefaultParameterTypes.js.map | 1 + .../dist/cjs/src/index.d.ts | 13 + .../dist/cjs/src/index.d.ts.map | 1 + .../dist/cjs/src/index.js | 30 + .../dist/cjs/src/index.js.map | 1 + .../dist/cjs/src/types.d.ts | 24 + .../dist/cjs/src/types.d.ts.map | 1 + .../dist/cjs/src/types.js | 3 + .../dist/cjs/src/types.js.map | 1 + .../dist/cjs/test/ArgumentTest.d.ts | 2 + .../dist/cjs/test/ArgumentTest.d.ts.map | 1 + .../dist/cjs/test/ArgumentTest.js | 53 + .../dist/cjs/test/ArgumentTest.js.map | 1 + ...atorialGeneratedExpressionFactoryTest.d.ts | 2 + ...ialGeneratedExpressionFactoryTest.d.ts.map | 1 + ...inatorialGeneratedExpressionFactoryTest.js | 34 + ...orialGeneratedExpressionFactoryTest.js.map | 1 + .../test/CucumberExpressionGeneratorTest.d.ts | 2 + .../CucumberExpressionGeneratorTest.d.ts.map | 1 + .../test/CucumberExpressionGeneratorTest.js | 232 + .../CucumberExpressionGeneratorTest.js.map | 1 + .../test/CucumberExpressionParserTest.d.ts | 2 + .../CucumberExpressionParserTest.d.ts.map | 1 + .../cjs/test/CucumberExpressionParserTest.js | 34 + .../test/CucumberExpressionParserTest.js.map | 1 + .../dist/cjs/test/CucumberExpressionTest.d.ts | 2 + .../cjs/test/CucumberExpressionTest.d.ts.map | 1 + .../dist/cjs/test/CucumberExpressionTest.js | 112 + .../cjs/test/CucumberExpressionTest.js.map | 1 + .../test/CucumberExpressionTokenizerTest.d.ts | 2 + .../CucumberExpressionTokenizerTest.d.ts.map | 1 + .../test/CucumberExpressionTokenizerTest.js | 34 + .../CucumberExpressionTokenizerTest.js.map | 1 + .../CucumberExpressionTransformationTest.d.ts | 2 + ...umberExpressionTransformationTest.d.ts.map | 1 + .../CucumberExpressionTransformationTest.js | 23 + ...ucumberExpressionTransformationTest.js.map | 1 + .../cjs/test/CustomParameterTypeTest.d.ts | 2 + .../cjs/test/CustomParameterTypeTest.d.ts.map | 1 + .../dist/cjs/test/CustomParameterTypeTest.js | 124 + .../cjs/test/CustomParameterTypeTest.js.map | 1 + .../dist/cjs/test/ExpressionFactoryTest.d.ts | 2 + .../cjs/test/ExpressionFactoryTest.d.ts.map | 1 + .../dist/cjs/test/ExpressionFactoryTest.js | 56 + .../cjs/test/ExpressionFactoryTest.js.map | 1 + .../cjs/test/ParameterTypeRegistryTest.d.ts | 2 + .../test/ParameterTypeRegistryTest.d.ts.map | 1 + .../cjs/test/ParameterTypeRegistryTest.js | 54 + .../cjs/test/ParameterTypeRegistryTest.js.map | 1 + .../dist/cjs/test/ParameterTypeTest.d.ts | 2 + .../dist/cjs/test/ParameterTypeTest.d.ts.map | 1 + .../dist/cjs/test/ParameterTypeTest.js | 65 + .../dist/cjs/test/ParameterTypeTest.js.map | 1 + .../dist/cjs/test/RegularExpressionTest.d.ts | 2 + .../cjs/test/RegularExpressionTest.d.ts.map | 1 + .../dist/cjs/test/RegularExpressionTest.js | 86 + .../cjs/test/RegularExpressionTest.js.map | 1 + .../dist/cjs/test/TreeRegexpTest.d.ts | 2 + .../dist/cjs/test/TreeRegexpTest.d.ts.map | 1 + .../dist/cjs/test/TreeRegexpTest.js | 131 + .../dist/cjs/test/TreeRegexpTest.js.map | 1 + .../dist/cjs/test/testDataDir.d.ts | 2 + .../dist/cjs/test/testDataDir.d.ts.map | 1 + .../dist/cjs/test/testDataDir.js | 5 + .../dist/cjs/test/testDataDir.js.map | 1 + .../dist/cjs/tsconfig.build-cjs.tsbuildinfo | 1 + .../dist/esm/src/Argument.d.ts | 16 + .../dist/esm/src/Argument.d.ts.map | 1 + .../dist/esm/src/Argument.js | 31 + .../dist/esm/src/Argument.js.map | 1 + .../dist/esm/src/Ast.d.ts | 45 + .../dist/esm/src/Ast.d.ts.map | 1 + .../cucumber-expressions/dist/esm/src/Ast.js | 134 + .../dist/esm/src/Ast.js.map | 1 + ...mbinatorialGeneratedExpressionFactory.d.ts | 10 + ...atorialGeneratedExpressionFactory.d.ts.map | 1 + ...CombinatorialGeneratedExpressionFactory.js | 37 + ...inatorialGeneratedExpressionFactory.js.map | 1 + .../dist/esm/src/CucumberExpression.d.ts | 30 + .../dist/esm/src/CucumberExpression.d.ts.map | 1 + .../dist/esm/src/CucumberExpression.js | 117 + .../dist/esm/src/CucumberExpression.js.map | 1 + .../dist/esm/src/CucumberExpressionError.d.ts | 3 + .../esm/src/CucumberExpressionError.d.ts.map | 1 + .../dist/esm/src/CucumberExpressionError.js | 3 + .../esm/src/CucumberExpressionError.js.map | 1 + .../esm/src/CucumberExpressionGenerator.d.ts | 10 + .../src/CucumberExpressionGenerator.d.ts.map | 1 + .../esm/src/CucumberExpressionGenerator.js | 72 + .../src/CucumberExpressionGenerator.js.map | 1 + .../esm/src/CucumberExpressionParser.d.ts | 5 + .../esm/src/CucumberExpressionParser.d.ts.map | 1 + .../dist/esm/src/CucumberExpressionParser.js | 234 + .../esm/src/CucumberExpressionParser.js.map | 1 + .../esm/src/CucumberExpressionTokenizer.d.ts | 5 + .../src/CucumberExpressionTokenizer.d.ts.map | 1 + .../esm/src/CucumberExpressionTokenizer.js | 72 + .../src/CucumberExpressionTokenizer.js.map | 1 + .../dist/esm/src/Errors.d.ts | 25 + .../dist/esm/src/Errors.d.ts.map | 1 + .../dist/esm/src/Errors.js | 94 + .../dist/esm/src/Errors.js.map | 1 + .../dist/esm/src/ExpressionFactory.d.ts | 8 + .../dist/esm/src/ExpressionFactory.d.ts.map | 1 + .../dist/esm/src/ExpressionFactory.js | 14 + .../dist/esm/src/ExpressionFactory.js.map | 1 + .../dist/esm/src/GeneratedExpression.d.ts | 19 + .../dist/esm/src/GeneratedExpression.d.ts.map | 1 + .../dist/esm/src/GeneratedExpression.js | 56 + .../dist/esm/src/GeneratedExpression.js.map | 1 + .../dist/esm/src/Group.d.ts | 20 + .../dist/esm/src/Group.d.ts.map | 1 + .../dist/esm/src/Group.js | 22 + .../dist/esm/src/Group.js.map | 1 + .../dist/esm/src/GroupBuilder.d.ts | 13 + .../dist/esm/src/GroupBuilder.d.ts.map | 1 + .../dist/esm/src/GroupBuilder.js | 28 + .../dist/esm/src/GroupBuilder.js.map | 1 + .../dist/esm/src/ParameterType.d.ts | 32 + .../dist/esm/src/ParameterType.d.ts.map | 1 + .../dist/esm/src/ParameterType.js | 95 + .../dist/esm/src/ParameterType.js.map | 1 + .../dist/esm/src/ParameterTypeMatcher.d.ts | 18 + .../esm/src/ParameterTypeMatcher.d.ts.map | 1 + .../dist/esm/src/ParameterTypeMatcher.js | 60 + .../dist/esm/src/ParameterTypeMatcher.js.map | 1 + .../dist/esm/src/ParameterTypeRegistry.d.ts | 12 + .../esm/src/ParameterTypeRegistry.d.ts.map | 1 + .../dist/esm/src/ParameterTypeRegistry.js | 64 + .../dist/esm/src/ParameterTypeRegistry.js.map | 1 + .../dist/esm/src/RegularExpression.d.ts | 12 + .../dist/esm/src/RegularExpression.d.ts.map | 1 + .../dist/esm/src/RegularExpression.js | 30 + .../dist/esm/src/RegularExpression.js.map | 1 + .../dist/esm/src/TreeRegexp.d.ts | 11 + .../dist/esm/src/TreeRegexp.d.ts.map | 1 + .../dist/esm/src/TreeRegexp.js | 83 + .../dist/esm/src/TreeRegexp.js.map | 1 + .../esm/src/defineDefaultParameterTypes.d.ts | 3 + .../src/defineDefaultParameterTypes.d.ts.map | 1 + .../esm/src/defineDefaultParameterTypes.js | 20 + .../src/defineDefaultParameterTypes.js.map | 1 + .../dist/esm/src/index.d.ts | 13 + .../dist/esm/src/index.d.ts.map | 1 + .../dist/esm/src/index.js | 12 + .../dist/esm/src/index.js.map | 1 + .../dist/esm/src/types.d.ts | 24 + .../dist/esm/src/types.d.ts.map | 1 + .../dist/esm/src/types.js | 2 + .../dist/esm/src/types.js.map | 1 + .../dist/esm/test/ArgumentTest.d.ts | 2 + .../dist/esm/test/ArgumentTest.d.ts.map | 1 + .../dist/esm/test/ArgumentTest.js | 15 + .../dist/esm/test/ArgumentTest.js.map | 1 + ...atorialGeneratedExpressionFactoryTest.d.ts | 2 + ...ialGeneratedExpressionFactoryTest.d.ts.map | 1 + ...inatorialGeneratedExpressionFactoryTest.js | 29 + ...orialGeneratedExpressionFactoryTest.js.map | 1 + .../test/CucumberExpressionGeneratorTest.d.ts | 2 + .../CucumberExpressionGeneratorTest.d.ts.map | 1 + .../test/CucumberExpressionGeneratorTest.js | 227 + .../CucumberExpressionGeneratorTest.js.map | 1 + .../test/CucumberExpressionParserTest.d.ts | 2 + .../CucumberExpressionParserTest.d.ts.map | 1 + .../esm/test/CucumberExpressionParserTest.js | 29 + .../test/CucumberExpressionParserTest.js.map | 1 + .../dist/esm/test/CucumberExpressionTest.d.ts | 2 + .../esm/test/CucumberExpressionTest.d.ts.map | 1 + .../dist/esm/test/CucumberExpressionTest.js | 107 + .../esm/test/CucumberExpressionTest.js.map | 1 + .../test/CucumberExpressionTokenizerTest.d.ts | 2 + .../CucumberExpressionTokenizerTest.d.ts.map | 1 + .../test/CucumberExpressionTokenizerTest.js | 29 + .../CucumberExpressionTokenizerTest.js.map | 1 + .../CucumberExpressionTransformationTest.d.ts | 2 + ...umberExpressionTransformationTest.d.ts.map | 1 + .../CucumberExpressionTransformationTest.js | 18 + ...ucumberExpressionTransformationTest.js.map | 1 + .../esm/test/CustomParameterTypeTest.d.ts | 2 + .../esm/test/CustomParameterTypeTest.d.ts.map | 1 + .../dist/esm/test/CustomParameterTypeTest.js | 119 + .../esm/test/CustomParameterTypeTest.js.map | 1 + .../dist/esm/test/ExpressionFactoryTest.d.ts | 2 + .../esm/test/ExpressionFactoryTest.d.ts.map | 1 + .../dist/esm/test/ExpressionFactoryTest.js | 18 + .../esm/test/ExpressionFactoryTest.js.map | 1 + .../esm/test/ParameterTypeRegistryTest.d.ts | 2 + .../test/ParameterTypeRegistryTest.d.ts.map | 1 + .../esm/test/ParameterTypeRegistryTest.js | 49 + .../esm/test/ParameterTypeRegistryTest.js.map | 1 + .../dist/esm/test/ParameterTypeTest.d.ts | 2 + .../dist/esm/test/ParameterTypeTest.d.ts.map | 1 + .../dist/esm/test/ParameterTypeTest.js | 27 + .../dist/esm/test/ParameterTypeTest.js.map | 1 + .../dist/esm/test/RegularExpressionTest.d.ts | 2 + .../esm/test/RegularExpressionTest.d.ts.map | 1 + .../dist/esm/test/RegularExpressionTest.js | 81 + .../esm/test/RegularExpressionTest.js.map | 1 + .../dist/esm/test/TreeRegexpTest.d.ts | 2 + .../dist/esm/test/TreeRegexpTest.d.ts.map | 1 + .../dist/esm/test/TreeRegexpTest.js | 126 + .../dist/esm/test/TreeRegexpTest.js.map | 1 + .../dist/esm/test/testDataDir.d.ts | 2 + .../dist/esm/test/testDataDir.d.ts.map | 1 + .../dist/esm/test/testDataDir.js | 2 + .../dist/esm/test/testDataDir.js.map | 1 + .../dist/esm/tsconfig.build-esm.tsbuildinfo | 1 + .../cucumber-expressions/package.json | 81 + .../cucumber-expressions/src/Argument.ts | 46 + .../@cucumber/cucumber-expressions/src/Ast.ts | 143 + ...CombinatorialGeneratedExpressionFactory.ts | 49 + .../src/CucumberExpression.ts | 160 + .../src/CucumberExpressionError.ts | 1 + .../src/CucumberExpressionGenerator.ts | 97 + .../src/CucumberExpressionParser.ts | 321 + .../src/CucumberExpressionTokenizer.ts | 81 + .../cucumber-expressions/src/Errors.ts | 237 + .../src/ExpressionFactory.ts | 14 + .../src/GeneratedExpression.ts | 61 + .../cucumber-expressions/src/Group.ts | 17 + .../cucumber-expressions/src/GroupBuilder.ts | 35 + .../cucumber-expressions/src/ParameterType.ts | 119 + .../src/ParameterTypeMatcher.ts | 79 + .../src/ParameterTypeRegistry.ts | 90 + .../src/RegularExpression.ts | 50 + .../cucumber-expressions/src/TreeRegexp.ts | 83 + .../src/defineDefaultParameterTypes.ts | 122 + .../cucumber-expressions/src/index.ts | 31 + .../cucumber-expressions/src/types.ts | 26 + node_modules/@cucumber/cucumber/LICENSE | 21 + node_modules/@cucumber/cucumber/README.md | 128 + .../@cucumber/cucumber/api/index.d.ts | 6 + .../@cucumber/cucumber/bin/cucumber-js | 3 + .../@cucumber/cucumber/bin/cucumber.js | 3 + .../lib/api/convert_configuration.d.ts | 4 + .../cucumber/lib/api/convert_configuration.js | 70 + .../lib/api/convert_configuration.js.map | 1 + .../lib/api/emit_support_code_messages.d.ts | 9 + .../lib/api/emit_support_code_messages.js | 180 + .../lib/api/emit_support_code_messages.js.map | 1 + .../cucumber/lib/api/formatters.d.ts | 20 + .../@cucumber/cucumber/lib/api/formatters.js | 52 + .../cucumber/lib/api/formatters.js.map | 1 + .../@cucumber/cucumber/lib/api/gherkin.d.ts | 13 + .../@cucumber/cucumber/lib/api/gherkin.js | 44 + .../@cucumber/cucumber/lib/api/gherkin.js.map | 1 + .../@cucumber/cucumber/lib/api/index.d.ts | 19 + .../@cucumber/cucumber/lib/api/index.js | 30 + .../@cucumber/cucumber/lib/api/index.js.map | 1 + .../cucumber/lib/api/load_configuration.d.ts | 10 + .../cucumber/lib/api/load_configuration.js | 51 + .../lib/api/load_configuration.js.map | 1 + .../cucumber/lib/api/load_sources.d.ts | 11 + .../cucumber/lib/api/load_sources.js | 58 + .../cucumber/lib/api/load_sources.js.map | 1 + .../cucumber/lib/api/load_support.d.ts | 10 + .../cucumber/lib/api/load_support.js | 42 + .../cucumber/lib/api/load_support.js.map | 1 + .../@cucumber/cucumber/lib/api/plugins.d.ts | 6 + .../@cucumber/cucumber/lib/api/plugins.js | 81 + .../@cucumber/cucumber/lib/api/plugins.js.map | 1 + .../cucumber/lib/api/run_cucumber.d.ts | 12 + .../cucumber/lib/api/run_cucumber.js | 127 + .../cucumber/lib/api/run_cucumber.js.map | 1 + .../@cucumber/cucumber/lib/api/support.d.ts | 12 + .../@cucumber/cucumber/lib/api/support.js | 36 + .../@cucumber/cucumber/lib/api/support.js.map | 1 + .../cucumber/lib/api/test_helpers.d.ts | 3 + .../cucumber/lib/api/test_helpers.js | 35 + .../cucumber/lib/api/test_helpers.js.map | 1 + .../@cucumber/cucumber/lib/api/types.d.ts | 330 + .../@cucumber/cucumber/lib/api/types.js | 3 + .../@cucumber/cucumber/lib/api/types.js.map | 1 + .../@cucumber/cucumber/lib/api/wrapper.mjs | 6 + .../lib/assemble/assemble_test_cases.d.ts | 5 + .../lib/assemble/assemble_test_cases.js | 89 + .../lib/assemble/assemble_test_cases.js.map | 1 + .../cucumber/lib/assemble/index.d.ts | 2 + .../@cucumber/cucumber/lib/assemble/index.js | 19 + .../cucumber/lib/assemble/index.js.map | 1 + .../cucumber/lib/assemble/types.d.ts | 10 + .../@cucumber/cucumber/lib/assemble/types.js | 3 + .../cucumber/lib/assemble/types.js.map | 1 + .../@cucumber/cucumber/lib/cli/i18n.d.ts | 2 + .../@cucumber/cucumber/lib/cli/i18n.js | 69 + .../@cucumber/cucumber/lib/cli/i18n.js.map | 1 + .../@cucumber/cucumber/lib/cli/index.d.ts | 20 + .../@cucumber/cucumber/lib/cli/index.js | 64 + .../@cucumber/cucumber/lib/cli/index.js.map | 1 + .../cucumber/lib/cli/install_validator.d.ts | 1 + .../cucumber/lib/cli/install_validator.js | 17 + .../cucumber/lib/cli/install_validator.js.map | 1 + .../@cucumber/cucumber/lib/cli/run.d.ts | 1 + .../@cucumber/cucumber/lib/cli/run.js | 43 + .../@cucumber/cucumber/lib/cli/run.js.map | 1 + .../lib/cli/validate_node_engine_version.d.ts | 10 + .../lib/cli/validate_node_engine_version.js | 23 + .../cli/validate_node_engine_version.js.map | 1 + .../lib/configuration/argv_parser.d.ts | 22 + .../cucumber/lib/configuration/argv_parser.js | 106 + .../lib/configuration/argv_parser.js.map | 1 + .../lib/configuration/check_schema.d.ts | 2 + .../lib/configuration/check_schema.js | 74 + .../lib/configuration/check_schema.js.map | 1 + .../configuration/default_configuration.d.ts | 2 + .../configuration/default_configuration.js | 30 + .../default_configuration.js.map | 1 + .../cucumber/lib/configuration/from_file.d.ts | 3 + .../cucumber/lib/configuration/from_file.js | 131 + .../lib/configuration/from_file.js.map | 1 + .../cucumber/lib/configuration/helpers.d.ts | 1 + .../cucumber/lib/configuration/helpers.js | 10 + .../cucumber/lib/configuration/helpers.js.map | 1 + .../cucumber/lib/configuration/index.d.ts | 9 + .../cucumber/lib/configuration/index.js | 31 + .../cucumber/lib/configuration/index.js.map | 1 + .../lib/configuration/locate_file.d.ts | 1 + .../cucumber/lib/configuration/locate_file.js | 20 + .../lib/configuration/locate_file.js.map | 1 + .../configuration/merge_configurations.d.ts | 2 + .../lib/configuration/merge_configurations.js | 48 + .../configuration/merge_configurations.js.map | 1 + .../configuration/parse_configuration.d.ts | 3 + .../lib/configuration/parse_configuration.js | 39 + .../configuration/parse_configuration.js.map | 1 + .../split_format_descriptor.d.ts | 2 + .../configuration/split_format_descriptor.js | 75 + .../split_format_descriptor.js.map | 1 + .../cucumber/lib/configuration/types.d.ts | 177 + .../cucumber/lib/configuration/types.js | 3 + .../cucumber/lib/configuration/types.js.map | 1 + .../configuration/validate_configuration.d.ts | 3 + .../configuration/validate_configuration.js | 23 + .../validate_configuration.js.map | 1 + .../lib/environment/console_logger.d.ts | 12 + .../lib/environment/console_logger.js | 30 + .../lib/environment/console_logger.js.map | 1 + .../cucumber/lib/environment/index.d.ts | 2 + .../cucumber/lib/environment/index.js | 19 + .../cucumber/lib/environment/index.js.map | 1 + .../lib/environment/make_environment.d.ts | 2 + .../lib/environment/make_environment.js | 20 + .../lib/environment/make_environment.js.map | 1 + .../cucumber/lib/environment/types.d.ts | 48 + .../cucumber/lib/environment/types.js | 3 + .../cucumber/lib/environment/types.js.map | 1 + .../cucumber/lib/filter/filter_plugin.d.ts | 2 + .../cucumber/lib/filter/filter_plugin.js | 32 + .../cucumber/lib/filter/filter_plugin.js.map | 1 + .../@cucumber/cucumber/lib/filter/index.d.ts | 4 + .../@cucumber/cucumber/lib/filter/index.js | 23 + .../cucumber/lib/filter/index.js.map | 1 + .../cucumber/lib/filter/order_pickles.d.ts | 3 + .../cucumber/lib/filter/order_pickles.js | 37 + .../cucumber/lib/filter/order_pickles.js.map | 1 + .../@cucumber/cucumber/lib/filter/types.d.ts | 19 + .../@cucumber/cucumber/lib/filter/types.js | 3 + .../cucumber/lib/filter/types.js.map | 1 + .../cucumber/lib/filter_stack_trace.d.ts | 3 + .../cucumber/lib/filter_stack_trace.js | 37 + .../cucumber/lib/filter_stack_trace.js.map | 1 + .../cucumber/lib/formatter/builder.d.ts | 33 + .../cucumber/lib/formatter/builder.js | 81 + .../cucumber/lib/formatter/builder.js.map | 1 + .../cucumber/lib/formatter/builtin/html.d.ts | 9 + .../cucumber/lib/formatter/builtin/html.js | 30 + .../lib/formatter/builtin/html.js.map | 1 + .../cucumber/lib/formatter/builtin/index.d.ts | 17 + .../cucumber/lib/formatter/builtin/index.js | 50 + .../lib/formatter/builtin/index.js.map | 1 + .../lib/formatter/builtin/message.d.ts | 5 + .../cucumber/lib/formatter/builtin/message.js | 9 + .../lib/formatter/builtin/message.js.map | 1 + .../cucumber/lib/formatter/create_stream.d.ts | 6 + .../cucumber/lib/formatter/create_stream.js | 31 + .../lib/formatter/create_stream.js.map | 1 + .../lib/formatter/find_class_or_plugin.d.ts | 1 + .../lib/formatter/find_class_or_plugin.js | 24 + .../lib/formatter/find_class_or_plugin.js.map | 1 + .../cucumber/lib/formatter/get_color_fns.d.ts | 13 + .../cucumber/lib/formatter/get_color_fns.js | 56 + .../lib/formatter/get_color_fns.js.map | 1 + .../formatter/helpers/duration_helpers.d.ts | 2 + .../lib/formatter/helpers/duration_helpers.js | 8 + .../formatter/helpers/duration_helpers.js.map | 1 + .../helpers/event_data_collector.d.ts | 29 + .../formatter/helpers/event_data_collector.js | 135 + .../helpers/event_data_collector.js.map | 1 + .../lib/formatter/helpers/formatters.d.ts | 5 + .../lib/formatter/helpers/formatters.js | 29 + .../lib/formatter/helpers/formatters.js.map | 1 + .../helpers/gherkin_document_parser.d.ts | 5 + .../helpers/gherkin_document_parser.js | 65 + .../helpers/gherkin_document_parser.js.map | 1 + .../cucumber/lib/formatter/helpers/index.d.ts | 10 + .../cucumber/lib/formatter/helpers/index.js | 62 + .../lib/formatter/helpers/index.js.map | 1 + .../lib/formatter/helpers/issue_helpers.d.ts | 19 + .../lib/formatter/helpers/issue_helpers.js | 58 + .../formatter/helpers/issue_helpers.js.map | 1 + .../lib/formatter/helpers/keyword_type.d.ts | 11 + .../lib/formatter/helpers/keyword_type.js | 32 + .../lib/formatter/helpers/keyword_type.js.map | 1 + .../formatter/helpers/location_helpers.d.ts | 2 + .../lib/formatter/helpers/location_helpers.js | 16 + .../formatter/helpers/location_helpers.js.map | 1 + .../lib/formatter/helpers/pickle_parser.d.ts | 17 + .../lib/formatter/helpers/pickle_parser.js | 27 + .../formatter/helpers/pickle_parser.js.map | 1 + .../helpers/step_argument_formatter.d.ts | 2 + .../helpers/step_argument_formatter.js | 47 + .../helpers/step_argument_formatter.js.map | 1 + .../formatter/helpers/summary_helpers.d.ts | 9 + .../lib/formatter/helpers/summary_helpers.js | 106 + .../formatter/helpers/summary_helpers.js.map | 1 + .../helpers/test_case_attempt_formatter.d.ts | 12 + .../helpers/test_case_attempt_formatter.js | 123 + .../test_case_attempt_formatter.js.map | 1 + .../helpers/test_case_attempt_parser.d.ts | 32 + .../helpers/test_case_attempt_parser.js | 144 + .../helpers/test_case_attempt_parser.js.map | 1 + .../helpers/usage_helpers/index.d.ts | 23 + .../formatter/helpers/usage_helpers/index.js | 120 + .../helpers/usage_helpers/index.js.map | 1 + .../cucumber/lib/formatter/import_code.d.ts | 1 + .../cucumber/lib/formatter/import_code.js | 26 + .../cucumber/lib/formatter/import_code.js.map | 1 + .../cucumber/lib/formatter/index.d.ts | 55 + .../@cucumber/cucumber/lib/formatter/index.js | 31 + .../cucumber/lib/formatter/index.js.map | 1 + .../lib/formatter/json_formatter.d.ts | 78 + .../cucumber/lib/formatter/json_formatter.js | 242 + .../lib/formatter/json_formatter.js.map | 1 + .../lib/formatter/progress_bar_formatter.d.ts | 18 + .../lib/formatter/progress_bar_formatter.js | 103 + .../formatter/progress_bar_formatter.js.map | 1 + .../lib/formatter/progress_formatter.d.ts | 9 + .../lib/formatter/progress_formatter.js | 69 + .../lib/formatter/progress_formatter.js.map | 1 + .../lib/formatter/rerun_formatter.d.ts | 13 + .../cucumber/lib/formatter/rerun_formatter.js | 91 + .../lib/formatter/rerun_formatter.js.map | 1 + .../lib/formatter/resolve_implementation.d.ts | 2 + .../lib/formatter/resolve_implementation.js | 27 + .../formatter/resolve_implementation.js.map | 1 + .../lib/formatter/snippets_formatter.d.ts | 6 + .../lib/formatter/snippets_formatter.js | 71 + .../lib/formatter/snippets_formatter.js.map | 1 + .../index.d.ts | 21 + .../step_definition_snippet_builder/index.js | 62 + .../index.js.map | 1 + .../javascript_snippet_syntax.d.ts | 7 + .../javascript_snippet_syntax.js | 47 + .../javascript_snippet_syntax.js.map | 1 + .../snippet_syntax.d.ts | 16 + .../snippet_syntax.js | 11 + .../snippet_syntax.js.map | 1 + .../lib/formatter/summary_formatter.d.ts | 14 + .../lib/formatter/summary_formatter.js | 68 + .../lib/formatter/summary_formatter.js.map | 1 + .../lib/formatter/usage_formatter.d.ts | 6 + .../cucumber/lib/formatter/usage_formatter.js | 108 + .../lib/formatter/usage_formatter.js.map | 1 + .../lib/formatter/usage_json_formatter.d.ts | 7 + .../lib/formatter/usage_json_formatter.js | 34 + .../lib/formatter/usage_json_formatter.js.map | 1 + .../@cucumber/cucumber/lib/index.d.ts | 53 + node_modules/@cucumber/cucumber/lib/index.js | 116 + .../@cucumber/cucumber/lib/index.js.map | 1 + .../cucumber/lib/models/data_table.d.ts | 10 + .../cucumber/lib/models/data_table.js | 47 + .../cucumber/lib/models/data_table.js.map | 1 + .../cucumber/lib/models/definition.d.ts | 58 + .../cucumber/lib/models/definition.js | 30 + .../cucumber/lib/models/definition.js.map | 1 + .../lib/models/gherkin_step_keyword.d.ts | 1 + .../lib/models/gherkin_step_keyword.js | 3 + .../lib/models/gherkin_step_keyword.js.map | 1 + .../cucumber/lib/models/step_definition.d.ts | 11 + .../cucumber/lib/models/step_definition.js | 40 + .../lib/models/step_definition.js.map | 1 + .../lib/models/test_case_hook_definition.d.ts | 10 + .../lib/models/test_case_hook_definition.js | 30 + .../models/test_case_hook_definition.js.map | 1 + .../lib/models/test_run_hook_definition.d.ts | 8 + .../lib/models/test_run_hook_definition.js | 15 + .../models/test_run_hook_definition.js.map | 1 + .../lib/models/test_step_hook_definition.d.ts | 9 + .../lib/models/test_step_hook_definition.js | 28 + .../models/test_step_hook_definition.js.map | 1 + .../@cucumber/cucumber/lib/paths/index.d.ts | 2 + .../@cucumber/cucumber/lib/paths/index.js | 19 + .../@cucumber/cucumber/lib/paths/index.js.map | 1 + .../@cucumber/cucumber/lib/paths/paths.d.ts | 4 + .../@cucumber/cucumber/lib/paths/paths.js | 103 + .../@cucumber/cucumber/lib/paths/paths.js.map | 1 + .../@cucumber/cucumber/lib/paths/types.d.ts | 13 + .../@cucumber/cucumber/lib/paths/types.js | 3 + .../@cucumber/cucumber/lib/paths/types.js.map | 1 + .../@cucumber/cucumber/lib/pickle_filter.d.ts | 42 + .../@cucumber/cucumber/lib/pickle_filter.js | 105 + .../cucumber/lib/pickle_filter.js.map | 1 + .../@cucumber/cucumber/lib/plugin/index.d.ts | 2 + .../@cucumber/cucumber/lib/plugin/index.js | 19 + .../cucumber/lib/plugin/index.js.map | 1 + .../cucumber/lib/plugin/plugin_manager.d.ts | 19 + .../cucumber/lib/plugin/plugin_manager.js | 132 + .../cucumber/lib/plugin/plugin_manager.js.map | 1 + .../@cucumber/cucumber/lib/plugin/types.d.ts | 157 + .../@cucumber/cucumber/lib/plugin/types.js | 3 + .../cucumber/lib/plugin/types.js.map | 1 + .../@cucumber/cucumber/lib/publish/index.d.ts | 3 + .../@cucumber/cucumber/lib/publish/index.js | 20 + .../cucumber/lib/publish/index.js.map | 1 + .../cucumber/lib/publish/publish_plugin.d.ts | 2 + .../cucumber/lib/publish/publish_plugin.js | 95 + .../lib/publish/publish_plugin.js.map | 1 + .../@cucumber/cucumber/lib/publish/types.d.ts | 14 + .../@cucumber/cucumber/lib/publish/types.js | 3 + .../cucumber/lib/publish/types.js.map | 1 + .../lib/runtime/attachment_manager/index.d.ts | 33 + .../lib/runtime/attachment_manager/index.js | 133 + .../runtime/attachment_manager/index.js.map | 1 + .../cucumber/lib/runtime/coordinator.d.ts | 16 + .../cucumber/lib/runtime/coordinator.js | 41 + .../cucumber/lib/runtime/coordinator.js.map | 1 + .../cucumber/lib/runtime/format_error.d.ts | 2 + .../cucumber/lib/runtime/format_error.js | 51 + .../cucumber/lib/runtime/format_error.js.map | 1 + .../cucumber/lib/runtime/helpers.d.ts | 6 + .../@cucumber/cucumber/lib/runtime/helpers.js | 110 + .../cucumber/lib/runtime/helpers.js.map | 1 + .../@cucumber/cucumber/lib/runtime/index.d.ts | 2 + .../@cucumber/cucumber/lib/runtime/index.js | 18 + .../cucumber/lib/runtime/index.js.map | 1 + .../cucumber/lib/runtime/make_runtime.d.ts | 18 + .../cucumber/lib/runtime/make_runtime.js | 28 + .../cucumber/lib/runtime/make_runtime.js.map | 1 + .../cucumber/lib/runtime/make_suggestion.d.ts | 7 + .../cucumber/lib/runtime/make_suggestion.js | 31 + .../lib/runtime/make_suggestion.js.map | 1 + .../lib/runtime/parallel/adapter.d.ts | 49 + .../cucumber/lib/runtime/parallel/adapter.js | 160 + .../lib/runtime/parallel/adapter.js.map | 1 + .../lib/runtime/parallel/run_worker.d.ts | 1 + .../lib/runtime/parallel/run_worker.js | 25 + .../lib/runtime/parallel/run_worker.js.map | 1 + .../cucumber/lib/runtime/parallel/types.d.ts | 35 + .../cucumber/lib/runtime/parallel/types.js | 3 + .../lib/runtime/parallel/types.js.map | 1 + .../cucumber/lib/runtime/parallel/worker.d.ts | 25 + .../cucumber/lib/runtime/parallel/worker.js | 83 + .../lib/runtime/parallel/worker.js.map | 1 + .../cucumber/lib/runtime/scope/index.d.ts | 2 + .../cucumber/lib/runtime/scope/index.js | 19 + .../cucumber/lib/runtime/scope/index.js.map | 1 + .../lib/runtime/scope/make_proxy.d.ts | 1 + .../cucumber/lib/runtime/scope/make_proxy.js | 41 + .../lib/runtime/scope/make_proxy.js.map | 1 + .../lib/runtime/scope/test_case_scope.d.ts | 17 + .../lib/runtime/scope/test_case_scope.js | 29 + .../lib/runtime/scope/test_case_scope.js.map | 1 + .../lib/runtime/scope/test_run_scope.d.ts | 16 + .../lib/runtime/scope/test_run_scope.js | 28 + .../lib/runtime/scope/test_run_scope.js.map | 1 + .../cucumber/lib/runtime/serial/adapter.d.ts | 13 + .../cucumber/lib/runtime/serial/adapter.js | 24 + .../lib/runtime/serial/adapter.js.map | 1 + .../cucumber/lib/runtime/step_runner.d.ts | 20 + .../cucumber/lib/runtime/step_runner.js | 105 + .../cucumber/lib/runtime/step_runner.js.map | 1 + .../cucumber/lib/runtime/stopwatch.d.ts | 12 + .../cucumber/lib/runtime/stopwatch.js | 35 + .../cucumber/lib/runtime/stopwatch.js.map | 1 + .../lib/runtime/test_case_runner.d.ts | 57 + .../cucumber/lib/runtime/test_case_runner.js | 327 + .../lib/runtime/test_case_runner.js.map | 1 + .../@cucumber/cucumber/lib/runtime/types.d.ts | 17 + .../@cucumber/cucumber/lib/runtime/types.js | 3 + .../cucumber/lib/runtime/types.js.map | 1 + .../cucumber/lib/runtime/worker.d.ts | 25 + .../@cucumber/cucumber/lib/runtime/worker.js | 149 + .../cucumber/lib/runtime/worker.js.map | 1 + .../cucumber/lib/sharding/index.d.ts | 2 + .../@cucumber/cucumber/lib/sharding/index.js | 5 + .../cucumber/lib/sharding/index.js.map | 1 + .../lib/sharding/sharding_plugin.d.ts | 2 + .../cucumber/lib/sharding/sharding_plugin.js | 18 + .../lib/sharding/sharding_plugin.js.map | 1 + .../cucumber/lib/step_arguments.d.ts | 6 + .../@cucumber/cucumber/lib/step_arguments.js | 18 + .../cucumber/lib/step_arguments.js.map | 1 + .../build_parameter_type.d.ts | 3 + .../build_parameter_type.js | 12 + .../build_parameter_type.js.map | 1 + .../support_code_library_builder/context.d.ts | 3 + .../support_code_library_builder/context.js | 3 + .../context.js.map | 1 + .../get_definition_line_and_uri.d.ts | 3 + .../get_definition_line_and_uri.js | 32 + .../get_definition_line_and_uri.js.map | 1 + .../support_code_library_builder/index.d.ts | 79 + .../lib/support_code_library_builder/index.js | 334 + .../support_code_library_builder/index.js.map | 1 + .../parallel_can_assign_helpers.d.ts | 2 + .../parallel_can_assign_helpers.js | 15 + .../parallel_can_assign_helpers.js.map | 1 + .../sourced_parameter_type_registry.d.ts | 9 + .../sourced_parameter_type_registry.js | 16 + .../sourced_parameter_type_registry.js.map | 1 + .../support_code_library_builder/types.d.ts | 103 + .../lib/support_code_library_builder/types.js | 3 + .../support_code_library_builder/types.js.map | 1 + .../validate_arguments.d.ts | 12 + .../validate_arguments.js | 73 + .../validate_arguments.js.map | 1 + .../support_code_library_builder/world.d.ts | 21 + .../lib/support_code_library_builder/world.js | 16 + .../support_code_library_builder/world.js.map | 1 + node_modules/@cucumber/cucumber/lib/time.d.ts | 16 + node_modules/@cucumber/cucumber/lib/time.js | 70 + .../@cucumber/cucumber/lib/time.js.map | 1 + .../@cucumber/cucumber/lib/try_require.d.ts | 7 + .../@cucumber/cucumber/lib/try_require.js | 28 + .../@cucumber/cucumber/lib/try_require.js.map | 1 + .../cucumber/lib/tsconfig.node.tsbuildinfo | 1 + .../@cucumber/cucumber/lib/types/index.d.ts | 4 + .../@cucumber/cucumber/lib/types/index.js | 3 + .../@cucumber/cucumber/lib/types/index.js.map | 1 + .../lib/uncaught_exception_manager.d.ts | 6 + .../lib/uncaught_exception_manager.js | 12 + .../lib/uncaught_exception_manager.js.map | 1 + .../cucumber/lib/user_code_runner.d.ts | 14 + .../cucumber/lib/user_code_runner.js | 82 + .../cucumber/lib/user_code_runner.js.map | 1 + .../@cucumber/cucumber/lib/value_checker.d.ts | 3 + .../@cucumber/cucumber/lib/value_checker.js | 18 + .../cucumber/lib/value_checker.js.map | 1 + .../@cucumber/cucumber/lib/version.d.ts | 1 + .../@cucumber/cucumber/lib/version.js | 6 + .../@cucumber/cucumber/lib/version.js.map | 1 + .../@cucumber/cucumber/lib/wrapper.mjs | 45 + node_modules/@cucumber/cucumber/package.json | 358 + .../gherkin-streams/.github/renovate.json | 6 + .../gherkin-streams/.github/settings.yml | 5 + .../.github/workflows/release-github.yml | 28 + .../.github/workflows/release.yml | 34 + .../.github/workflows/test.yml | 47 + .../@cucumber/gherkin-streams/.mocharc.json | 6 + .../gherkin-streams/.prettierrc.json | 5 + .../@cucumber/gherkin-streams/CHANGELOG.md | 74 + .../@cucumber/gherkin-streams/README.md | 50 + .../@cucumber/gherkin-streams/RELEASIN.md | 1 + .../@cucumber/gherkin-streams/bin/gherkin | 4 + .../gherkin-streams/dist/package.json | 62 + .../dist/src/GherkinStreams.d.ts | 14 + .../dist/src/GherkinStreams.d.ts.map | 1 + .../dist/src/GherkinStreams.js | 65 + .../dist/src/GherkinStreams.js.map | 1 + .../dist/src/ParserMessageStream.d.ts | 12 + .../dist/src/ParserMessageStream.d.ts.map | 1 + .../dist/src/ParserMessageStream.js | 24 + .../dist/src/ParserMessageStream.js.map | 1 + .../dist/src/SourceMessageStream.d.ts | 13 + .../dist/src/SourceMessageStream.d.ts.map | 1 + .../dist/src/SourceMessageStream.js | 28 + .../dist/src/SourceMessageStream.js.map | 1 + .../gherkin-streams/dist/src/cli/main.d.ts | 2 + .../dist/src/cli/main.d.ts.map | 1 + .../gherkin-streams/dist/src/cli/main.js | 31 + .../gherkin-streams/dist/src/cli/main.js.map | 1 + .../gherkin-streams/dist/src/index.d.ts | 3 + .../gherkin-streams/dist/src/index.d.ts.map | 1 + .../gherkin-streams/dist/src/index.js | 9 + .../gherkin-streams/dist/src/index.js.map | 1 + .../dist/src/makeGherkinOptions.d.ts | 3 + .../dist/src/makeGherkinOptions.d.ts.map | 1 + .../dist/src/makeGherkinOptions.js | 15 + .../dist/src/makeGherkinOptions.js.map | 1 + .../gherkin-streams/dist/test/StreamTest.d.ts | 2 + .../dist/test/StreamTest.d.ts.map | 1 + .../gherkin-streams/dist/test/StreamTest.js | 68 + .../dist/test/StreamTest.js.map | 1 + .../dist/tsconfig.build.tsbuildinfo | 1 + .../gherkin-streams/eslint.config.mjs | 66 + .../node_modules/commander/LICENSE | 22 + .../node_modules/commander/Readme.md | 1159 + .../node_modules/commander/esm.mjs | 16 + .../node_modules/commander/index.js | 24 + .../node_modules/commander/lib/argument.js | 149 + .../node_modules/commander/lib/command.js | 2778 + .../node_modules/commander/lib/error.js | 39 + .../node_modules/commander/lib/help.js | 747 + .../node_modules/commander/lib/option.js | 379 + .../commander/lib/suggestSimilar.js | 101 + .../commander/package-support.json | 16 + .../node_modules/commander/package.json | 82 + .../node_modules/commander/typings/esm.d.mts | 3 + .../node_modules/commander/typings/index.d.ts | 1113 + .../@cucumber/gherkin-streams/package.json | 62 + .../gherkin-streams/src/GherkinStreams.ts | 79 + .../src/ParserMessageStream.ts | 31 + .../src/SourceMessageStream.ts | 36 + .../@cucumber/gherkin-streams/src/cli/main.ts | 30 + .../@cucumber/gherkin-streams/src/index.ts | 3 + .../gherkin-streams/src/makeGherkinOptions.ts | 16 + .../gherkin-streams/test/StreamTest.ts | 99 + .../testdata/good/minimal.feature | 4 + .../gherkin-streams/tsconfig.base.json | 23 + .../gherkin-streams/tsconfig.build.json | 19 + .../@cucumber/gherkin-streams/tsconfig.json | 10 + .../@cucumber/gherkin-utils/.mocharc.json | 6 + node_modules/@cucumber/gherkin-utils/LICENSE | 21 + .../@cucumber/gherkin-utils/bin/gherkin-utils | 4 + .../@cucumber/gherkin-utils/dist/package.json | 72 + .../dist/src/GherkinDocumentHandlers.d.ts | 16 + .../dist/src/GherkinDocumentHandlers.d.ts.map | 1 + .../dist/src/GherkinDocumentHandlers.js | 3 + .../dist/src/GherkinDocumentHandlers.js.map | 1 + .../dist/src/GherkinDocumentWalker.d.ts | 39 + .../dist/src/GherkinDocumentWalker.d.ts.map | 1 + .../dist/src/GherkinDocumentWalker.js | 256 + .../dist/src/GherkinDocumentWalker.js.map | 1 + .../gherkin-utils/dist/src/Query.d.ts | 50 + .../gherkin-utils/dist/src/Query.d.ts.map | 1 + .../@cucumber/gherkin-utils/dist/src/Query.js | 183 + .../gherkin-utils/dist/src/Query.js.map | 1 + .../@cucumber/gherkin-utils/dist/src/cli.d.ts | 2 + .../gherkin-utils/dist/src/cli.d.ts.map | 1 + .../@cucumber/gherkin-utils/dist/src/cli.js | 30 + .../gherkin-utils/dist/src/cli.js.map | 1 + .../dist/src/commands/formatCommand.d.ts | 9 + .../dist/src/commands/formatCommand.d.ts.map | 1 + .../dist/src/commands/formatCommand.js | 172 + .../dist/src/commands/formatCommand.js.map | 1 + .../gherkin-utils/dist/src/index.d.ts | 7 + .../gherkin-utils/dist/src/index.d.ts.map | 1 + .../@cucumber/gherkin-utils/dist/src/index.js | 52 + .../gherkin-utils/dist/src/index.js.map | 1 + .../gherkin-utils/dist/src/pretty.d.ts | 5 + .../gherkin-utils/dist/src/pretty.d.ts.map | 1 + .../gherkin-utils/dist/src/pretty.js | 217 + .../gherkin-utils/dist/src/pretty.js.map | 1 + .../dist/src/walkGherkinDocument.d.ts | 12 + .../dist/src/walkGherkinDocument.d.ts.map | 1 + .../dist/src/walkGherkinDocument.js | 151 + .../dist/src/walkGherkinDocument.js.map | 1 + .../dist/test/GherkinDocumentWalkerTest.d.ts | 2 + .../test/GherkinDocumentWalkerTest.d.ts.map | 1 + .../dist/test/GherkinDocumentWalkerTest.js | 436 + .../test/GherkinDocumentWalkerTest.js.map | 1 + .../gherkin-utils/dist/test/QueryTest.d.ts | 2 + .../dist/test/QueryTest.d.ts.map | 1 + .../gherkin-utils/dist/test/QueryTest.js | 229 + .../gherkin-utils/dist/test/QueryTest.js.map | 1 + .../dist/test/commands/formatCommandTest.d.ts | 2 + .../test/commands/formatCommandTest.d.ts.map | 1 + .../dist/test/commands/formatCommandTest.js | 89 + .../test/commands/formatCommandTest.js.map | 1 + .../gherkin-utils/dist/test/messageTest.d.ts | 2 + .../dist/test/messageTest.d.ts.map | 1 + .../gherkin-utils/dist/test/messageTest.js | 54 + .../dist/test/messageTest.js.map | 1 + .../gherkin-utils/dist/test/parse.d.ts | 4 + .../gherkin-utils/dist/test/parse.d.ts.map | 1 + .../gherkin-utils/dist/test/parse.js | 52 + .../gherkin-utils/dist/test/parse.js.map | 1 + .../gherkin-utils/dist/test/prettyTest.d.ts | 2 + .../dist/test/prettyTest.d.ts.map | 1 + .../gherkin-utils/dist/test/prettyTest.js | 336 + .../gherkin-utils/dist/test/prettyTest.js.map | 1 + .../dist/test/walkGherkinDocumentTest.d.ts | 2 + .../test/walkGherkinDocumentTest.d.ts.map | 1 + .../dist/test/walkGherkinDocumentTest.js | 66 + .../dist/test/walkGherkinDocumentTest.js.map | 1 + .../dist/tsconfig.build.tsbuildinfo | 1 + .../@cucumber/gherkin-utils/eslint.config.mjs | 70 + .../node_modules/commander/LICENSE | 22 + .../node_modules/commander/Readme.md | 1159 + .../node_modules/commander/esm.mjs | 16 + .../node_modules/commander/index.js | 24 + .../node_modules/commander/lib/argument.js | 150 + .../node_modules/commander/lib/command.js | 2777 + .../node_modules/commander/lib/error.js | 39 + .../node_modules/commander/lib/help.js | 747 + .../node_modules/commander/lib/option.js | 380 + .../commander/lib/suggestSimilar.js | 101 + .../commander/package-support.json | 16 + .../node_modules/commander/package.json | 82 + .../node_modules/commander/typings/esm.d.mts | 3 + .../node_modules/commander/typings/index.d.ts | 1113 + .../@cucumber/gherkin-utils/package.json | 72 + .../gherkin-utils/scripts/gherkin-utils.sh | 10 + .../src/GherkinDocumentHandlers.ts | 17 + .../src/GherkinDocumentWalker.ts | 336 + .../@cucumber/gherkin-utils/src/Query.ts | 226 + .../@cucumber/gherkin-utils/src/cli.ts | 27 + .../src/commands/formatCommand.ts | 124 + .../@cucumber/gherkin-utils/src/index.ts | 7 + .../@cucumber/gherkin-utils/src/pretty.ts | 249 + .../gherkin-utils/src/walkGherkinDocument.ts | 165 + .../test/GherkinDocumentWalkerTest.ts | 505 + .../@cucumber/gherkin-utils/test/QueryTest.ts | 232 + .../test/commands/formatCommandTest.ts | 94 + .../gherkin-utils/test/messageTest.ts | 55 + .../gherkin-utils/test/messages/README.md | 12 + .../@cucumber/gherkin-utils/test/parse.ts | 25 + .../gherkin-utils/test/prettyTest.ts | 332 + .../test/walkGherkinDocumentTest.ts | 64 + .../gherkin-utils/tsconfig.base.json | 20 + .../gherkin-utils/tsconfig.build.json | 15 + .../@cucumber/gherkin-utils/tsconfig.json | 10 + node_modules/@cucumber/gherkin/.mocharc.json | 6 + .../@cucumber/gherkin/CONTRIBUTING.md | 16 + node_modules/@cucumber/gherkin/LICENSE | 21 + node_modules/@cucumber/gherkin/README.md | 3 + .../gherkin/dist/src/AstBuilder.d.ts | 43 + .../gherkin/dist/src/AstBuilder.d.ts.map | 1 + .../@cucumber/gherkin/dist/src/AstBuilder.js | 293 + .../gherkin/dist/src/AstBuilder.js.map | 1 + .../@cucumber/gherkin/dist/src/AstNode.d.ts | 13 + .../gherkin/dist/src/AstNode.d.ts.map | 1 + .../@cucumber/gherkin/dist/src/AstNode.js | 32 + .../@cucumber/gherkin/dist/src/AstNode.js.map | 1 + .../@cucumber/gherkin/dist/src/Dialect.d.ts | 16 + .../gherkin/dist/src/Dialect.d.ts.map | 1 + .../@cucumber/gherkin/dist/src/Dialect.js | 3 + .../@cucumber/gherkin/dist/src/Dialect.js.map | 1 + .../@cucumber/gherkin/dist/src/Errors.d.ts | 20 + .../gherkin/dist/src/Errors.d.ts.map | 1 + .../@cucumber/gherkin/dist/src/Errors.js | 57 + .../@cucumber/gherkin/dist/src/Errors.js.map | 1 + .../dist/src/GherkinClassicTokenMatcher.d.ts | 38 + .../src/GherkinClassicTokenMatcher.d.ts.map | 1 + .../dist/src/GherkinClassicTokenMatcher.js | 252 + .../src/GherkinClassicTokenMatcher.js.map | 1 + .../src/GherkinInMarkdownTokenMatcher.d.ts | 42 + .../GherkinInMarkdownTokenMatcher.d.ts.map | 1 + .../dist/src/GherkinInMarkdownTokenMatcher.js | 289 + .../src/GherkinInMarkdownTokenMatcher.js.map | 1 + .../gherkin/dist/src/GherkinLine.d.ts | 18 + .../gherkin/dist/src/GherkinLine.d.ts.map | 1 + .../@cucumber/gherkin/dist/src/GherkinLine.js | 85 + .../gherkin/dist/src/GherkinLine.js.map | 1 + .../gherkin/dist/src/IAstBuilder.d.ts | 22 + .../gherkin/dist/src/IAstBuilder.d.ts.map | 1 + .../@cucumber/gherkin/dist/src/IAstBuilder.js | 3 + .../gherkin/dist/src/IAstBuilder.js.map | 1 + .../gherkin/dist/src/IGherkinOptions.d.ts | 9 + .../gherkin/dist/src/IGherkinOptions.d.ts.map | 1 + .../gherkin/dist/src/IGherkinOptions.js | 3 + .../gherkin/dist/src/IGherkinOptions.js.map | 1 + .../@cucumber/gherkin/dist/src/IToken.d.ts | 31 + .../gherkin/dist/src/IToken.d.ts.map | 1 + .../@cucumber/gherkin/dist/src/IToken.js | 3 + .../@cucumber/gherkin/dist/src/IToken.js.map | 1 + .../gherkin/dist/src/ITokenMatcher.d.ts | 21 + .../gherkin/dist/src/ITokenMatcher.d.ts.map | 1 + .../gherkin/dist/src/ITokenMatcher.js | 3 + .../gherkin/dist/src/ITokenMatcher.js.map | 1 + .../@cucumber/gherkin/dist/src/Parser.d.ts | 148 + .../gherkin/dist/src/Parser.d.ts.map | 1 + .../@cucumber/gherkin/dist/src/Parser.js | 3297 + .../@cucumber/gherkin/dist/src/Parser.js.map | 1 + .../gherkin/dist/src/TokenExceptions.d.ts | 9 + .../gherkin/dist/src/TokenExceptions.d.ts.map | 1 + .../gherkin/dist/src/TokenExceptions.js | 31 + .../gherkin/dist/src/TokenExceptions.js.map | 1 + .../gherkin/dist/src/TokenScanner.d.ts | 17 + .../gherkin/dist/src/TokenScanner.d.ts.map | 1 + .../gherkin/dist/src/TokenScanner.js | 28 + .../gherkin/dist/src/TokenScanner.js.map | 1 + .../gherkin/dist/src/compareStepKeywords.d.ts | 9 + .../dist/src/compareStepKeywords.d.ts.map | 1 + .../gherkin/dist/src/compareStepKeywords.js | 14 + .../dist/src/compareStepKeywords.js.map | 1 + .../gherkin/dist/src/countSymbols.d.ts | 2 + .../gherkin/dist/src/countSymbols.d.ts.map | 1 + .../gherkin/dist/src/countSymbols.js | 9 + .../gherkin/dist/src/countSymbols.js.map | 1 + .../gherkin/dist/src/generateMessages.d.ts | 4 + .../dist/src/generateMessages.d.ts.map | 1 + .../gherkin/dist/src/generateMessages.js | 107 + .../gherkin/dist/src/generateMessages.js.map | 1 + .../gherkin/dist/src/gherkin-languages.json | 3833 + .../@cucumber/gherkin/dist/src/index.d.ts | 16 + .../@cucumber/gherkin/dist/src/index.d.ts.map | 1 + .../@cucumber/gherkin/dist/src/index.js | 61 + .../@cucumber/gherkin/dist/src/index.js.map | 1 + .../gherkin/dist/src/makeSourceEnvelope.d.ts | 3 + .../dist/src/makeSourceEnvelope.d.ts.map | 1 + .../gherkin/dist/src/makeSourceEnvelope.js | 56 + .../dist/src/makeSourceEnvelope.js.map | 1 + .../gherkin/dist/src/pickles/compile.d.ts | 4 + .../gherkin/dist/src/pickles/compile.d.ts.map | 1 + .../gherkin/dist/src/pickles/compile.js | 212 + .../gherkin/dist/src/pickles/compile.js.map | 1 + .../gherkin/dist/tsconfig.build.tsbuildinfo | 1 + .../gherkin/gherkin-javascript.razor | 277 + node_modules/@cucumber/gherkin/package.json | 46 + .../@cucumber/gherkin/src/AstBuilder.ts | 320 + node_modules/@cucumber/gherkin/src/AstNode.ts | 35 + node_modules/@cucumber/gherkin/src/Dialect.ts | 15 + node_modules/@cucumber/gherkin/src/Errors.ts | 59 + .../gherkin/src/GherkinClassicTokenMatcher.ts | 268 + .../src/GherkinInMarkdownTokenMatcher.ts | 351 + .../@cucumber/gherkin/src/GherkinLine.ts | 88 + .../@cucumber/gherkin/src/IAstBuilder.ts | 36 + .../@cucumber/gherkin/src/IGherkinOptions.ts | 9 + node_modules/@cucumber/gherkin/src/IToken.ts | 40 + .../@cucumber/gherkin/src/ITokenMatcher.ts | 36 + node_modules/@cucumber/gherkin/src/Parser.ts | 3354 + .../@cucumber/gherkin/src/TokenExceptions.ts | 32 + .../@cucumber/gherkin/src/TokenScanner.ts | 32 + .../gherkin/src/compareStepKeywords.ts | 10 + .../@cucumber/gherkin/src/countSymbols.ts | 6 + .../@cucumber/gherkin/src/generateMessages.ts | 81 + .../gherkin/src/gherkin-languages.json | 3833 + node_modules/@cucumber/gherkin/src/index.ts | 29 + .../gherkin/src/makeSourceEnvelope.ts | 18 + .../@cucumber/gherkin/src/pickles/compile.ts | 277 + node_modules/@cucumber/gherkin/test-cli.mjs | 25 + .../@cucumber/gherkin/tsconfig.build-cjs.json | 7 + .../@cucumber/gherkin/tsconfig.build-esm.json | 8 + .../@cucumber/gherkin/tsconfig.build.json | 18 + .../@cucumber/gherkin/tsconfig.esm.json | 14 + node_modules/@cucumber/gherkin/tsconfig.json | 23 + .../@cucumber/html-formatter/.mocharc.json | 7 + node_modules/@cucumber/html-formatter/LICENSE | 21 + .../@cucumber/html-formatter/README.md | 5 + .../@cucumber/html-formatter/biome.json | 4 + .../@cucumber/html-formatter/dist/main.css | 34 + .../@cucumber/html-formatter/dist/main.js | 2 + .../html-formatter/dist/main.js.LICENSE.txt | 64 + .../html-formatter/dist/package.json | 73 + .../dist/src/CucumberHtmlStream.d.ts | 26 + .../dist/src/CucumberHtmlStream.d.ts.map | 1 + .../dist/src/CucumberHtmlStream.js | 140 + .../dist/src/CucumberHtmlStream.js.map | 1 + .../dist/src/CucumberHtmlStream.spec.d.ts | 2 + .../dist/src/CucumberHtmlStream.spec.d.ts.map | 1 + .../dist/src/CucumberHtmlStream.spec.js | 86 + .../dist/src/CucumberHtmlStream.spec.js.map | 1 + .../html-formatter/dist/src/icon.url | 1 + .../html-formatter/dist/src/index.d.ts | 7 + .../html-formatter/dist/src/index.d.ts.map | 1 + .../html-formatter/dist/src/index.js | 23 + .../html-formatter/dist/src/index.js.map | 1 + .../html-formatter/dist/src/index.mustache | 28 + .../html-formatter/dist/src/main.d.ts | 8 + .../html-formatter/dist/src/main.d.ts.map | 1 + .../@cucumber/html-formatter/dist/src/main.js | 9 + .../html-formatter/dist/src/main.js.map | 1 + .../html-formatter/dist/src/styles.scss | 60 + .../dist/test/acceptance.spec.d.ts | 2 + .../dist/test/acceptance.spec.d.ts.map | 1 + .../dist/test/acceptance.spec.js | 39 + .../dist/test/acceptance.spec.js.map | 1 + .../dist/tsconfig.build.tsbuildinfo | 1 + .../html-formatter/docker-compose.yml | 9 + .../@cucumber/html-formatter/package.json | 73 + .../html-formatter/playwright.config.ts | 32 + .../src/CucumberHtmlStream.spec.ts | 86 + .../html-formatter/src/CucumberHtmlStream.ts | 134 + .../@cucumber/html-formatter/src/dummy.css | 0 .../@cucumber/html-formatter/src/dummy.js | 0 .../@cucumber/html-formatter/src/icon.url | 1 + .../html-formatter/src/index.mustache | 28 + .../@cucumber/html-formatter/src/index.ts | 8 + .../@cucumber/html-formatter/src/main.tsx | 23 + .../@cucumber/html-formatter/src/styles.scss | 60 + .../html-formatter/test/__output__/.gitkeep | 0 .../test/__screenshots__/all-statuses.png | Bin 0 -> 158684 bytes .../test/__screenshots__/ambiguous.png | Bin 0 -> 70476 bytes .../test/__screenshots__/attachments.png | Bin 0 -> 207214 bytes .../test/__screenshots__/backgrounds.png | Bin 0 -> 33397 bytes .../test/__screenshots__/cdata.png | Bin 0 -> 31406 bytes .../test/__screenshots__/data-tables.png | Bin 0 -> 32788 bytes .../test/__screenshots__/doc-strings.png | Bin 0 -> 33468 bytes .../test/__screenshots__/empty.png | Bin 0 -> 54799 bytes .../examples-tables-attachment.png | Bin 0 -> 32895 bytes .../examples-tables-undefined.png | Bin 0 -> 145870 bytes .../test/__screenshots__/examples-tables.png | Bin 0 -> 210431 bytes .../failedish-combinations.png | Bin 0 -> 407046 bytes .../global-hooks-afterall-error.png | Bin 0 -> 49059 bytes .../global-hooks-attachments.png | Bin 0 -> 40114 bytes .../global-hooks-beforeall-error.png | Bin 0 -> 44715 bytes .../test/__screenshots__/global-hooks.png | Bin 0 -> 77817 bytes .../test/__screenshots__/hooks-attachment.png | Bin 0 -> 33756 bytes .../__screenshots__/hooks-conditional.png | Bin 0 -> 111713 bytes .../test/__screenshots__/hooks-named.png | Bin 0 -> 32610 bytes .../test/__screenshots__/hooks-skipped.png | Bin 0 -> 109159 bytes .../test/__screenshots__/hooks-undefined.png | Bin 0 -> 63704 bytes .../test/__screenshots__/hooks.png | Bin 0 -> 69674 bytes .../test/__screenshots__/markdown.png | Bin 0 -> 141339 bytes .../test/__screenshots__/minimal.png | Bin 0 -> 31571 bytes .../multiple-features-reversed.png | Bin 0 -> 48421 bytes .../__screenshots__/multiple-features.png | Bin 0 -> 44123 bytes .../test/__screenshots__/parameter-types.png | Bin 0 -> 32688 bytes .../__screenshots__/pending-exception.png | Bin 0 -> 59792 bytes .../test/__screenshots__/pending.png | Bin 0 -> 99974 bytes .../__screenshots__/regular-expression.png | Bin 0 -> 34038 bytes .../test/__screenshots__/retry-ambiguous.png | Bin 0 -> 66861 bytes .../test/__screenshots__/retry-pending.png | Bin 0 -> 49220 bytes .../test/__screenshots__/retry-undefined.png | Bin 0 -> 59048 bytes .../test/__screenshots__/retry.png | Bin 0 -> 112552 bytes .../__screenshots__/rules-backgrounds.png | Bin 0 -> 34605 bytes .../test/__screenshots__/rules.png | Bin 0 -> 31457 bytes .../__screenshots__/skipped-exception.png | Bin 0 -> 59140 bytes .../__screenshots__/skipped-failing-hook.png | Bin 0 -> 64349 bytes .../test/__screenshots__/skipped.png | Bin 0 -> 89342 bytes .../test/__screenshots__/stack-traces.png | Bin 0 -> 71406 bytes .../__screenshots__/test-run-exception.png | Bin 0 -> 30220 bytes .../test/__screenshots__/undefined.png | Bin 0 -> 159052 bytes .../unknown-parameter-type.png | Bin 0 -> 75986 bytes .../test/__screenshots__/unused-steps.png | Bin 0 -> 32758 bytes .../html-formatter/test/acceptance.spec.ts | 41 + .../html-formatter/test/screenshot.css | 4 + .../html-formatter/tsconfig.build.json | 11 + .../@cucumber/html-formatter/tsconfig.json | 22 + .../html-formatter/webpack.config.js | 30 + .../@cucumber/junit-xml-formatter/LICENSE | 21 + .../@cucumber/junit-xml-formatter/README.md | 5 + .../dist/JUnitXmlPrinter.d.ts | 15 + .../dist/JUnitXmlPrinter.js | 124 + .../junit-xml-formatter/dist/helpers.d.ts | 6 + .../junit-xml-formatter/dist/helpers.js | 43 + .../junit-xml-formatter/dist/index.d.ts | 4 + .../junit-xml-formatter/dist/index.js | 21 + .../junit-xml-formatter/dist/plugin.d.ts | 11 + .../junit-xml-formatter/dist/plugin.js | 13 + .../dist/tsconfig.build.tsbuildinfo | 1 + .../junit-xml-formatter/dist/types.d.ts | 6 + .../junit-xml-formatter/dist/types.js | 3 + .../junit-xml-formatter/package.json | 61 + .../@cucumber/message-streams/LICENSE | 21 + .../@cucumber/message-streams/README.md | 4 + .../src/AttachmentExternalisingStream.d.ts | 38 + .../dist/src/AttachmentExternalisingStream.js | 82 + .../AttachmentExternalisingStream.spec.d.ts | 1 + .../src/AttachmentExternalisingStream.spec.js | 198 + .../dist/src/MessageToNdjsonStream.d.ts | 9 + .../dist/src/MessageToNdjsonStream.js | 18 + .../dist/src/NdjsonToMessageStream.d.ts | 17 + .../dist/src/NdjsonToMessageStream.js | 59 + .../message-streams/dist/src/index.d.ts | 4 + .../message-streams/dist/src/index.js | 26 + .../message-streams/dist/test/toArray.d.ts | 3 + .../message-streams/dist/test/toArray.js | 12 + .../dist/tsconfig.build.tsbuildinfo | 1 + .../@cucumber/message-streams/package.json | 46 + node_modules/@cucumber/messages/LICENSE | 21 + node_modules/@cucumber/messages/README.md | 2 + .../@cucumber/messages/dist/cjs/package.json | 4 + .../messages/dist/cjs/src/IdGenerator.d.ts | 4 + .../dist/cjs/src/IdGenerator.d.ts.map | 1 + .../messages/dist/cjs/src/IdGenerator.js | 12 + .../messages/dist/cjs/src/IdGenerator.js.map | 1 + .../messages/dist/cjs/src/TimeConversion.d.ts | 7 + .../dist/cjs/src/TimeConversion.d.ts.map | 1 + .../messages/dist/cjs/src/TimeConversion.js | 44 + .../dist/cjs/src/TimeConversion.js.map | 1 + .../dist/cjs/src/getWorstTestStepResult.d.ts | 7 + .../cjs/src/getWorstTestStepResult.d.ts.map | 1 + .../dist/cjs/src/getWorstTestStepResult.js | 27 + .../cjs/src/getWorstTestStepResult.js.map | 1 + .../messages/dist/cjs/src/index.d.ts | 8 + .../messages/dist/cjs/src/index.d.ts.map | 1 + .../@cucumber/messages/dist/cjs/src/index.js | 51 + .../messages/dist/cjs/src/index.js.map | 1 + .../messages/dist/cjs/src/messages.d.ts | 403 + .../messages/dist/cjs/src/messages.d.ts.map | 1 + .../messages/dist/cjs/src/messages.js | 872 + .../messages/dist/cjs/src/messages.js.map | 1 + .../messages/dist/cjs/src/parseEnvelope.d.ts | 8 + .../dist/cjs/src/parseEnvelope.d.ts.map | 1 + .../messages/dist/cjs/src/parseEnvelope.js | 15 + .../dist/cjs/src/parseEnvelope.js.map | 1 + .../messages/dist/cjs/src/version.d.ts | 2 + .../messages/dist/cjs/src/version.d.ts.map | 1 + .../messages/dist/cjs/src/version.js | 6 + .../messages/dist/cjs/src/version.js.map | 1 + .../dist/cjs/test/IdGeneratorTest.d.ts | 2 + .../dist/cjs/test/IdGeneratorTest.d.ts.map | 1 + .../messages/dist/cjs/test/IdGeneratorTest.js | 21 + .../dist/cjs/test/IdGeneratorTest.js.map | 1 + .../dist/cjs/test/TimeConversionTest.d.ts | 2 + .../dist/cjs/test/TimeConversionTest.d.ts.map | 1 + .../dist/cjs/test/TimeConversionTest.js | 67 + .../dist/cjs/test/TimeConversionTest.js.map | 1 + .../cjs/test/getWorstTestStepResultsTest.d.ts | 2 + .../test/getWorstTestStepResultsTest.d.ts.map | 1 + .../cjs/test/getWorstTestStepResultsTest.js | 28 + .../test/getWorstTestStepResultsTest.js.map | 1 + .../messages/dist/cjs/test/messagesTest.d.ts | 2 + .../dist/cjs/test/messagesTest.d.ts.map | 1 + .../messages/dist/cjs/test/messagesTest.js | 87 + .../dist/cjs/test/messagesTest.js.map | 1 + .../dist/cjs/tsconfig.build-cjs.tsbuildinfo | 1 + .../messages/dist/esm/src/IdGenerator.d.ts | 4 + .../dist/esm/src/IdGenerator.d.ts.map | 1 + .../messages/dist/esm/src/IdGenerator.js | 8 + .../messages/dist/esm/src/IdGenerator.js.map | 1 + .../messages/dist/esm/src/TimeConversion.d.ts | 7 + .../dist/esm/src/TimeConversion.d.ts.map | 1 + .../messages/dist/esm/src/TimeConversion.js | 37 + .../dist/esm/src/TimeConversion.js.map | 1 + .../dist/esm/src/getWorstTestStepResult.d.ts | 7 + .../esm/src/getWorstTestStepResult.d.ts.map | 1 + .../dist/esm/src/getWorstTestStepResult.js | 24 + .../esm/src/getWorstTestStepResult.js.map | 1 + .../messages/dist/esm/src/index.d.ts | 8 + .../messages/dist/esm/src/index.d.ts.map | 1 + .../@cucumber/messages/dist/esm/src/index.js | 8 + .../messages/dist/esm/src/index.js.map | 1 + .../messages/dist/esm/src/messages.d.ts | 403 + .../messages/dist/esm/src/messages.d.ts.map | 1 + .../messages/dist/esm/src/messages.js | 736 + .../messages/dist/esm/src/messages.js.map | 1 + .../messages/dist/esm/src/parseEnvelope.d.ts | 8 + .../dist/esm/src/parseEnvelope.d.ts.map | 1 + .../messages/dist/esm/src/parseEnvelope.js | 12 + .../dist/esm/src/parseEnvelope.js.map | 1 + .../messages/dist/esm/src/version.d.ts | 2 + .../messages/dist/esm/src/version.d.ts.map | 1 + .../messages/dist/esm/src/version.js | 3 + .../messages/dist/esm/src/version.js.map | 1 + .../dist/esm/test/IdGeneratorTest.d.ts | 2 + .../dist/esm/test/IdGeneratorTest.d.ts.map | 1 + .../messages/dist/esm/test/IdGeneratorTest.js | 16 + .../dist/esm/test/IdGeneratorTest.js.map | 1 + .../dist/esm/test/TimeConversionTest.d.ts | 2 + .../dist/esm/test/TimeConversionTest.d.ts.map | 1 + .../dist/esm/test/TimeConversionTest.js | 62 + .../dist/esm/test/TimeConversionTest.js.map | 1 + .../esm/test/getWorstTestStepResultsTest.d.ts | 2 + .../test/getWorstTestStepResultsTest.d.ts.map | 1 + .../esm/test/getWorstTestStepResultsTest.js | 23 + .../test/getWorstTestStepResultsTest.js.map | 1 + .../messages/dist/esm/test/messagesTest.d.ts | 2 + .../dist/esm/test/messagesTest.d.ts.map | 1 + .../messages/dist/esm/test/messagesTest.js | 82 + .../dist/esm/test/messagesTest.js.map | 1 + .../dist/esm/tsconfig.build-esm.tsbuildinfo | 1 + .../@cucumber/messages/messages.schema.json | 1709 + node_modules/@cucumber/messages/package.json | 60 + .../@cucumber/pretty-formatter/LICENSE | 21 + .../@cucumber/pretty-formatter/README.md | 130 + .../lib/src/indentStyleText.d.ts | 3 + .../lib/src/indentStyleText.d.ts.map | 1 + .../lib/src/indentStyleText.js | 9 + .../lib/src/indentStyleText.js.map | 1 + .../lib/src/indentStyleText.spec.d.ts | 2 + .../lib/src/indentStyleText.spec.d.ts.map | 1 + .../lib/src/indentStyleText.spec.js | 38 + .../lib/src/indentStyleText.spec.js.map | 1 + .../pretty-formatter/lib/src/index.d.ts | 24 + .../pretty-formatter/lib/src/index.d.ts.map | 1 + .../pretty-formatter/lib/src/index.js | 237 + .../pretty-formatter/lib/src/index.js.map | 1 + .../pretty-formatter/lib/src/styleText.d.ts | 4 + .../lib/src/styleText.d.ts.map | 1 + .../pretty-formatter/lib/src/styleText.js | 22 + .../pretty-formatter/lib/src/styleText.js.map | 1 + .../lib/src/styleText.spec.d.ts | 2 + .../lib/src/styleText.spec.d.ts.map | 1 + .../lib/src/styleText.spec.js | 57 + .../lib/src/styleText.spec.js.map | 1 + .../pretty-formatter/lib/src/theme.d.ts | 30 + .../pretty-formatter/lib/src/theme.d.ts.map | 1 + .../pretty-formatter/lib/src/theme.js | 60 + .../pretty-formatter/lib/src/theme.js.map | 1 + .../pretty-formatter/lib/src/theme.spec.d.ts | 2 + .../lib/src/theme.spec.d.ts.map | 1 + .../pretty-formatter/lib/src/theme.spec.js | 119 + .../lib/src/theme.spec.js.map | 1 + .../@cucumber/pretty-formatter/package.json | 67 + node_modules/@cucumber/query/.mocharc.json | 7 + node_modules/@cucumber/query/.prettierrc.json | 6 + node_modules/@cucumber/query/LICENSE | 21 + .../@cucumber/query/dist/src/Lineage.d.ts | 32 + .../@cucumber/query/dist/src/Lineage.d.ts.map | 1 + .../@cucumber/query/dist/src/Lineage.js | 78 + .../@cucumber/query/dist/src/Lineage.js.map | 1 + .../@cucumber/query/dist/src/Query.d.ts | 84 + .../@cucumber/query/dist/src/Query.d.ts.map | 1 + .../@cucumber/query/dist/src/Query.js | 422 + .../@cucumber/query/dist/src/Query.js.map | 1 + .../@cucumber/query/dist/src/helpers.d.ts | 6 + .../@cucumber/query/dist/src/helpers.d.ts.map | 1 + .../@cucumber/query/dist/src/helpers.js | 24 + .../@cucumber/query/dist/src/helpers.js.map | 1 + .../@cucumber/query/dist/src/index.d.ts | 4 + .../@cucumber/query/dist/src/index.d.ts.map | 1 + .../@cucumber/query/dist/src/index.js | 24 + .../@cucumber/query/dist/src/index.js.map | 1 + .../query/dist/tsconfig.build.tsbuildinfo | 1 + .../@cucumber/query/eslint.config.mjs | 67 + node_modules/@cucumber/query/package.json | 66 + node_modules/@cucumber/query/src/Lineage.ts | 113 + .../@cucumber/query/src/Query.spec.ts | 175 + node_modules/@cucumber/query/src/Query.ts | 584 + .../@cucumber/query/src/acceptance.spec.ts | 339 + node_modules/@cucumber/query/src/helpers.ts | 21 + node_modules/@cucumber/query/src/index.ts | 4 + .../@cucumber/query/tsconfig.base.json | 20 + .../@cucumber/query/tsconfig.build.json | 20 + node_modules/@cucumber/query/tsconfig.json | 10 + .../@cucumber/tag-expressions/LICENSE | 21 + .../@cucumber/tag-expressions/README.md | 14 + .../tag-expressions/dist/cjs/package.json | 1 + .../tag-expressions/dist/cjs/src/index.d.ts | 15 + .../dist/cjs/src/index.d.ts.map | 1 + .../tag-expressions/dist/cjs/src/index.js | 231 + .../tag-expressions/dist/cjs/src/index.js.map | 1 + .../dist/cjs/test/errors.test.d.ts | 2 + .../dist/cjs/test/errors.test.d.ts.map | 1 + .../dist/cjs/test/errors.test.js | 44 + .../dist/cjs/test/errors.test.js.map | 1 + .../dist/cjs/test/evaluations.test.d.ts | 2 + .../dist/cjs/test/evaluations.test.d.ts.map | 1 + .../dist/cjs/test/evaluations.test.js | 63 + .../dist/cjs/test/evaluations.test.js.map | 1 + .../dist/cjs/test/parsing.test.d.ts | 2 + .../dist/cjs/test/parsing.test.d.ts.map | 1 + .../dist/cjs/test/parsing.test.js | 47 + .../dist/cjs/test/parsing.test.js.map | 1 + .../dist/cjs/test/testDataDir.d.ts | 2 + .../dist/cjs/test/testDataDir.d.ts.map | 1 + .../dist/cjs/test/testDataDir.js | 5 + .../dist/cjs/test/testDataDir.js.map | 1 + .../dist/cjs/tsconfig.build-cjs.tsbuildinfo | 1 + .../tag-expressions/dist/esm/src/index.d.ts | 15 + .../dist/esm/src/index.d.ts.map | 1 + .../tag-expressions/dist/esm/src/index.js | 221 + .../tag-expressions/dist/esm/src/index.js.map | 1 + .../dist/esm/test/errors.test.d.ts | 2 + .../dist/esm/test/errors.test.d.ts.map | 1 + .../dist/esm/test/errors.test.js | 14 + .../dist/esm/test/errors.test.js.map | 1 + .../dist/esm/test/evaluations.test.d.ts | 2 + .../dist/esm/test/evaluations.test.d.ts.map | 1 + .../dist/esm/test/evaluations.test.js | 19 + .../dist/esm/test/evaluations.test.js.map | 1 + .../dist/esm/test/parsing.test.d.ts | 2 + .../dist/esm/test/parsing.test.d.ts.map | 1 + .../dist/esm/test/parsing.test.js | 17 + .../dist/esm/test/parsing.test.js.map | 1 + .../dist/esm/test/testDataDir.d.ts | 2 + .../dist/esm/test/testDataDir.d.ts.map | 1 + .../dist/esm/test/testDataDir.js | 2 + .../dist/esm/test/testDataDir.js.map | 1 + .../dist/esm/tsconfig.build-esm.tsbuildinfo | 1 + .../@cucumber/tag-expressions/package.json | 71 + node_modules/@playwright/test/LICENSE | 202 + node_modules/@playwright/test/NOTICE | 5 + node_modules/@playwright/test/README.md | 318 + node_modules/@playwright/test/cli.js | 19 + node_modules/@playwright/test/index.d.ts | 18 + node_modules/@playwright/test/index.js | 17 + node_modules/@playwright/test/index.mjs | 18 + node_modules/@playwright/test/package.json | 35 + node_modules/@playwright/test/reporter.d.ts | 17 + node_modules/@playwright/test/reporter.js | 17 + node_modules/@playwright/test/reporter.mjs | 17 + node_modules/@teppeis/multimaps/README.md | 63 + .../multimaps/dist/cjs/arraymultimap.d.ts | 5 + .../multimaps/dist/cjs/arraymultimap.js | 39 + .../@teppeis/multimaps/dist/cjs/index.d.ts | 2 + .../@teppeis/multimaps/dist/cjs/index.js | 7 + .../@teppeis/multimaps/dist/cjs/multimap.d.ts | 31 + .../@teppeis/multimaps/dist/cjs/multimap.js | 125 + .../@teppeis/multimaps/dist/cjs/package.json | 3 + .../multimaps/dist/cjs/setmultimap.d.ts | 5 + .../multimaps/dist/cjs/setmultimap.js | 35 + .../multimaps/dist/esm/arraymultimap.d.ts | 5 + .../multimaps/dist/esm/arraymultimap.js | 35 + .../@teppeis/multimaps/dist/esm/index.d.ts | 2 + .../@teppeis/multimaps/dist/esm/index.js | 2 + .../@teppeis/multimaps/dist/esm/multimap.d.ts | 31 + .../@teppeis/multimaps/dist/esm/multimap.js | 121 + .../multimaps/dist/esm/setmultimap.d.ts | 5 + .../multimaps/dist/esm/setmultimap.js | 31 + node_modules/@teppeis/multimaps/package.json | 75 + .../@types/normalize-package-data/LICENSE | 21 + .../@types/normalize-package-data/README.md | 62 + .../@types/normalize-package-data/index.d.ts | 43 + .../normalize-package-data/package.json | 25 + node_modules/ansi-regex/index.js | 14 + node_modules/ansi-regex/license | 9 + node_modules/ansi-regex/package.json | 53 + node_modules/ansi-regex/readme.md | 87 + node_modules/ansi-styles/index.d.ts | 167 + node_modules/ansi-styles/index.js | 164 + node_modules/ansi-styles/license | 9 + node_modules/ansi-styles/package.json | 52 + node_modules/ansi-styles/readme.md | 144 + node_modules/any-promise/.jshintrc | 4 + node_modules/any-promise/.npmignore | 7 + node_modules/any-promise/LICENSE | 19 + node_modules/any-promise/README.md | 161 + node_modules/any-promise/implementation.d.ts | 3 + node_modules/any-promise/implementation.js | 1 + node_modules/any-promise/index.d.ts | 73 + node_modules/any-promise/index.js | 1 + node_modules/any-promise/loader.js | 78 + node_modules/any-promise/optional.js | 6 + node_modules/any-promise/package.json | 45 + node_modules/any-promise/register-shim.js | 18 + node_modules/any-promise/register.d.ts | 17 + node_modules/any-promise/register.js | 94 + .../any-promise/register/bluebird.d.ts | 1 + node_modules/any-promise/register/bluebird.js | 2 + .../any-promise/register/es6-promise.d.ts | 1 + .../any-promise/register/es6-promise.js | 2 + node_modules/any-promise/register/lie.d.ts | 1 + node_modules/any-promise/register/lie.js | 2 + .../register/native-promise-only.d.ts | 1 + .../register/native-promise-only.js | 2 + node_modules/any-promise/register/pinkie.d.ts | 1 + node_modules/any-promise/register/pinkie.js | 2 + .../any-promise/register/promise.d.ts | 1 + node_modules/any-promise/register/promise.js | 2 + node_modules/any-promise/register/q.d.ts | 1 + node_modules/any-promise/register/q.js | 2 + node_modules/any-promise/register/rsvp.d.ts | 1 + node_modules/any-promise/register/rsvp.js | 2 + node_modules/any-promise/register/vow.d.ts | 1 + node_modules/any-promise/register/vow.js | 2 + node_modules/any-promise/register/when.d.ts | 1 + node_modules/any-promise/register/when.js | 2 + .../assertion-error-formatter/CHANGELOG.md | 38 + .../assertion-error-formatter/LICENSE | 21 + .../assertion-error-formatter/README.md | 22 + .../lib/helpers/canonicalize.js | 52 + .../lib/helpers/canonicalize_test.js | 69 + .../lib/helpers/has_property.js | 8 + .../lib/helpers/inline_diff.js | 43 + .../lib/helpers/json_stringify.js | 80 + .../lib/helpers/stringify.js | 6 + .../lib/helpers/stringify_test.js | 112 + .../lib/helpers/type.js | 13 + .../lib/helpers/type_test.js | 71 + .../lib/helpers/unified_diff.js | 40 + .../assertion-error-formatter/lib/index.js | 80 + .../lib/index_test.js | 165 + .../assertion-error-formatter/package.json | 57 + node_modules/balanced-match/LICENSE.md | 23 + node_modules/balanced-match/README.md | 57 + .../balanced-match/dist/commonjs/index.d.ts | 9 + .../dist/commonjs/index.d.ts.map | 1 + .../balanced-match/dist/commonjs/index.js | 59 + .../balanced-match/dist/commonjs/index.js.map | 1 + .../balanced-match/dist/commonjs/package.json | 3 + .../balanced-match/dist/esm/index.d.ts | 9 + .../balanced-match/dist/esm/index.d.ts.map | 1 + node_modules/balanced-match/dist/esm/index.js | 54 + .../balanced-match/dist/esm/index.js.map | 1 + .../balanced-match/dist/esm/package.json | 3 + node_modules/balanced-match/package.json | 68 + node_modules/brace-expansion/LICENSE | 23 + node_modules/brace-expansion/README.md | 94 + .../brace-expansion/dist/commonjs/index.d.ts | 6 + .../dist/commonjs/index.d.ts.map | 1 + .../brace-expansion/dist/commonjs/index.js | 201 + .../dist/commonjs/index.js.map | 1 + .../dist/commonjs/package.json | 3 + .../brace-expansion/dist/esm/index.d.ts | 6 + .../brace-expansion/dist/esm/index.d.ts.map | 1 + .../brace-expansion/dist/esm/index.js | 197 + .../brace-expansion/dist/esm/index.js.map | 1 + .../brace-expansion/dist/esm/package.json | 3 + node_modules/brace-expansion/package.json | 64 + node_modules/buffer-from/LICENSE | 21 + node_modules/buffer-from/index.js | 72 + node_modules/buffer-from/package.json | 19 + node_modules/buffer-from/readme.md | 69 + node_modules/capital-case/LICENSE | 21 + node_modules/capital-case/README.md | 37 + .../capital-case/dist.es2015/index.d.ts | 4 + .../capital-case/dist.es2015/index.js | 11 + .../capital-case/dist.es2015/index.js.map | 1 + .../capital-case/dist.es2015/index.spec.d.ts | 1 + .../capital-case/dist.es2015/index.spec.js | 22 + .../dist.es2015/index.spec.js.map | 1 + node_modules/capital-case/dist/index.d.ts | 4 + node_modules/capital-case/dist/index.js | 16 + node_modules/capital-case/dist/index.js.map | 1 + .../capital-case/dist/index.spec.d.ts | 1 + node_modules/capital-case/dist/index.spec.js | 24 + .../capital-case/dist/index.spec.js.map | 1 + node_modules/capital-case/package.json | 90 + node_modules/chalk/index.d.ts | 415 + node_modules/chalk/license | 9 + .../chalk/node_modules/ansi-styles/index.d.ts | 345 + .../chalk/node_modules/ansi-styles/index.js | 163 + .../chalk/node_modules/ansi-styles/license | 9 + .../node_modules/ansi-styles/package.json | 56 + .../chalk/node_modules/ansi-styles/readme.md | 152 + .../node_modules/supports-color/browser.js | 5 + .../node_modules/supports-color/index.js | 135 + .../chalk/node_modules/supports-color/license | 9 + .../node_modules/supports-color/package.json | 53 + .../node_modules/supports-color/readme.md | 76 + node_modules/chalk/package.json | 68 + node_modules/chalk/readme.md | 341 + node_modules/chalk/source/index.js | 229 + node_modules/chalk/source/templates.js | 134 + node_modules/chalk/source/util.js | 39 + node_modules/class-transformer/LICENSE | 21 + node_modules/class-transformer/README.md | 901 + .../bundles/class-transformer.umd.js | 1056 + .../bundles/class-transformer.umd.js.map | 1 + .../bundles/class-transformer.umd.min.js | 2 + .../bundles/class-transformer.umd.min.js.map | 1 + .../class-transformer/cjs/ClassTransformer.js | 69 + .../cjs/ClassTransformer.js.map | 1 + .../class-transformer/cjs/MetadataStorage.js | 211 + .../cjs/MetadataStorage.js.map | 1 + .../cjs/TransformOperationExecutor.js | 480 + .../cjs/TransformOperationExecutor.js.map | 1 + .../cjs/constants/default-options.constant.js | 20 + .../constants/default-options.constant.js.map | 1 + .../cjs/decorators/exclude.decorator.js | 28 + .../cjs/decorators/exclude.decorator.js.map | 1 + .../cjs/decorators/expose.decorator.js | 28 + .../cjs/decorators/expose.decorator.js.map | 1 + .../class-transformer/cjs/decorators/index.js | 20 + .../cjs/decorators/index.js.map | 1 + ...ransform-instance-to-instance.decorator.js | 24 + ...form-instance-to-instance.decorator.js.map | 1 + .../transform-instance-to-plain.decorator.js | 24 + ...ansform-instance-to-plain.decorator.js.map | 1 + .../transform-plain-to-instance.decorator.js | 24 + ...ansform-plain-to-instance.decorator.js.map | 1 + .../cjs/decorators/transform.decorator.js | 21 + .../cjs/decorators/transform.decorator.js.map | 1 + .../cjs/decorators/type.decorator.js | 24 + .../cjs/decorators/type.decorator.js.map | 1 + .../class-transformer/cjs/enums/index.js | 14 + .../class-transformer/cjs/enums/index.js.map | 1 + .../cjs/enums/transformation-type.enum.js | 10 + .../cjs/enums/transformation-type.enum.js.map | 1 + node_modules/class-transformer/cjs/index.js | 82 + .../class-transformer/cjs/index.js.map | 1 + .../cjs/interfaces/class-constructor.type.js | 3 + .../interfaces/class-constructor.type.js.map | 1 + .../class-transformer-options.interface.js | 3 + ...class-transformer-options.interface.js.map | 1 + .../exclude-options.interface.js | 3 + .../exclude-options.interface.js.map | 1 + .../expose-options.interface.js | 3 + .../expose-options.interface.js.map | 1 + .../transform-options.interface.js | 3 + .../transform-options.interface.js.map | 1 + ...type-discriminator-descriptor.interface.js | 3 + ...-discriminator-descriptor.interface.js.map | 1 + .../type-options.interface.js | 3 + .../type-options.interface.js.map | 1 + .../class-transformer/cjs/interfaces/index.js | 27 + .../cjs/interfaces/index.js.map | 1 + .../metadata/exclude-metadata.interface.js | 3 + .../exclude-metadata.interface.js.map | 1 + .../metadata/expose-metadata.interface.js | 3 + .../metadata/expose-metadata.interface.js.map | 1 + .../metadata/transform-fn-params.interface.js | 3 + .../transform-fn-params.interface.js.map | 1 + .../metadata/transform-metadata.interface.js | 3 + .../transform-metadata.interface.js.map | 1 + .../metadata/type-metadata.interface.js | 3 + .../metadata/type-metadata.interface.js.map | 1 + .../cjs/interfaces/target-map.interface.js | 3 + .../interfaces/target-map.interface.js.map | 1 + .../interfaces/type-help-options.interface.js | 3 + .../type-help-options.interface.js.map | 1 + node_modules/class-transformer/cjs/storage.js | 9 + .../class-transformer/cjs/storage.js.map | 1 + .../cjs/utils/get-global.util.js | 33 + .../cjs/utils/get-global.util.js.map | 1 + .../cjs/utils/get-global.util.spect.js | 15 + .../cjs/utils/get-global.util.spect.js.map | 1 + .../class-transformer/cjs/utils/index.js | 15 + .../class-transformer/cjs/utils/index.js.map | 1 + .../cjs/utils/is-promise.util.js | 8 + .../cjs/utils/is-promise.util.js.map | 1 + .../esm2015/ClassTransformer.js | 65 + .../esm2015/ClassTransformer.js.map | 1 + .../esm2015/MetadataStorage.js | 207 + .../esm2015/MetadataStorage.js.map | 1 + .../esm2015/TransformOperationExecutor.js | 476 + .../esm2015/TransformOperationExecutor.js.map | 1 + .../constants/default-options.constant.js | 17 + .../constants/default-options.constant.js.map | 1 + .../esm2015/decorators/exclude.decorator.js | 24 + .../decorators/exclude.decorator.js.map | 1 + .../esm2015/decorators/expose.decorator.js | 24 + .../decorators/expose.decorator.js.map | 1 + .../esm2015/decorators/index.js | 8 + .../esm2015/decorators/index.js.map | 1 + ...ransform-instance-to-instance.decorator.js | 20 + ...form-instance-to-instance.decorator.js.map | 1 + .../transform-instance-to-plain.decorator.js | 20 + ...ansform-instance-to-plain.decorator.js.map | 1 + .../transform-plain-to-instance.decorator.js | 20 + ...ansform-plain-to-instance.decorator.js.map | 1 + .../esm2015/decorators/transform.decorator.js | 17 + .../decorators/transform.decorator.js.map | 1 + .../esm2015/decorators/type.decorator.js | 20 + .../esm2015/decorators/type.decorator.js.map | 1 + .../class-transformer/esm2015/enums/index.js | 2 + .../esm2015/enums/index.js.map | 1 + .../esm2015/enums/transformation-type.enum.js | 7 + .../enums/transformation-type.enum.js.map | 1 + .../class-transformer/esm2015/index.js | 57 + .../class-transformer/esm2015/index.js.map | 1 + .../interfaces/class-constructor.type.js | 2 + .../interfaces/class-constructor.type.js.map | 1 + .../class-transformer-options.interface.js | 2 + ...class-transformer-options.interface.js.map | 1 + .../exclude-options.interface.js | 2 + .../exclude-options.interface.js.map | 1 + .../expose-options.interface.js | 2 + .../expose-options.interface.js.map | 1 + .../transform-options.interface.js | 2 + .../transform-options.interface.js.map | 1 + ...type-discriminator-descriptor.interface.js | 2 + ...-discriminator-descriptor.interface.js.map | 1 + .../type-options.interface.js | 2 + .../type-options.interface.js.map | 1 + .../esm2015/interfaces/index.js | 15 + .../esm2015/interfaces/index.js.map | 1 + .../metadata/exclude-metadata.interface.js | 2 + .../exclude-metadata.interface.js.map | 1 + .../metadata/expose-metadata.interface.js | 2 + .../metadata/expose-metadata.interface.js.map | 1 + .../metadata/transform-fn-params.interface.js | 2 + .../transform-fn-params.interface.js.map | 1 + .../metadata/transform-metadata.interface.js | 2 + .../transform-metadata.interface.js.map | 1 + .../metadata/type-metadata.interface.js | 2 + .../metadata/type-metadata.interface.js.map | 1 + .../interfaces/target-map.interface.js | 2 + .../interfaces/target-map.interface.js.map | 1 + .../interfaces/type-help-options.interface.js | 2 + .../type-help-options.interface.js.map | 1 + .../class-transformer/esm2015/storage.js | 6 + .../class-transformer/esm2015/storage.js.map | 1 + .../esm2015/utils/get-global.util.js | 29 + .../esm2015/utils/get-global.util.js.map | 1 + .../esm2015/utils/get-global.util.spect.js | 13 + .../utils/get-global.util.spect.js.map | 1 + .../class-transformer/esm2015/utils/index.js | 3 + .../esm2015/utils/index.js.map | 1 + .../esm2015/utils/is-promise.util.js | 4 + .../esm2015/utils/is-promise.util.js.map | 1 + .../esm5/ClassTransformer.js | 62 + .../esm5/ClassTransformer.js.map | 1 + .../class-transformer/esm5/MetadataStorage.js | 212 + .../esm5/MetadataStorage.js.map | 1 + .../esm5/TransformOperationExecutor.js | 499 + .../esm5/TransformOperationExecutor.js.map | 1 + .../constants/default-options.constant.js | 17 + .../constants/default-options.constant.js.map | 1 + .../esm5/decorators/exclude.decorator.js | 25 + .../esm5/decorators/exclude.decorator.js.map | 1 + .../esm5/decorators/expose.decorator.js | 25 + .../esm5/decorators/expose.decorator.js.map | 1 + .../esm5/decorators/index.js | 8 + .../esm5/decorators/index.js.map | 1 + ...ransform-instance-to-instance.decorator.js | 24 + ...form-instance-to-instance.decorator.js.map | 1 + .../transform-instance-to-plain.decorator.js | 24 + ...ansform-instance-to-plain.decorator.js.map | 1 + .../transform-plain-to-instance.decorator.js | 24 + ...ansform-plain-to-instance.decorator.js.map | 1 + .../esm5/decorators/transform.decorator.js | 18 + .../decorators/transform.decorator.js.map | 1 + .../esm5/decorators/type.decorator.js | 21 + .../esm5/decorators/type.decorator.js.map | 1 + .../class-transformer/esm5/enums/index.js | 2 + .../class-transformer/esm5/enums/index.js.map | 1 + .../esm5/enums/transformation-type.enum.js | 7 + .../enums/transformation-type.enum.js.map | 1 + node_modules/class-transformer/esm5/index.js | 57 + .../class-transformer/esm5/index.js.map | 1 + .../esm5/interfaces/class-constructor.type.js | 2 + .../interfaces/class-constructor.type.js.map | 1 + .../class-transformer-options.interface.js | 2 + ...class-transformer-options.interface.js.map | 1 + .../exclude-options.interface.js | 2 + .../exclude-options.interface.js.map | 1 + .../expose-options.interface.js | 2 + .../expose-options.interface.js.map | 1 + .../transform-options.interface.js | 2 + .../transform-options.interface.js.map | 1 + ...type-discriminator-descriptor.interface.js | 2 + ...-discriminator-descriptor.interface.js.map | 1 + .../type-options.interface.js | 2 + .../type-options.interface.js.map | 1 + .../esm5/interfaces/index.js | 15 + .../esm5/interfaces/index.js.map | 1 + .../metadata/exclude-metadata.interface.js | 2 + .../exclude-metadata.interface.js.map | 1 + .../metadata/expose-metadata.interface.js | 2 + .../metadata/expose-metadata.interface.js.map | 1 + .../metadata/transform-fn-params.interface.js | 2 + .../transform-fn-params.interface.js.map | 1 + .../metadata/transform-metadata.interface.js | 2 + .../transform-metadata.interface.js.map | 1 + .../metadata/type-metadata.interface.js | 2 + .../metadata/type-metadata.interface.js.map | 1 + .../esm5/interfaces/target-map.interface.js | 2 + .../interfaces/target-map.interface.js.map | 1 + .../interfaces/type-help-options.interface.js | 2 + .../type-help-options.interface.js.map | 1 + .../class-transformer/esm5/storage.js | 6 + .../class-transformer/esm5/storage.js.map | 1 + .../esm5/utils/get-global.util.js | 29 + .../esm5/utils/get-global.util.js.map | 1 + .../esm5/utils/get-global.util.spect.js | 13 + .../esm5/utils/get-global.util.spect.js.map | 1 + .../class-transformer/esm5/utils/index.js | 3 + .../class-transformer/esm5/utils/index.js.map | 1 + .../esm5/utils/is-promise.util.js | 4 + .../esm5/utils/is-promise.util.js.map | 1 + node_modules/class-transformer/package.json | 38 + .../types/ClassTransformer.d.ts | 53 + .../types/MetadataStorage.d.ts | 31 + .../types/TransformOperationExecutor.d.ts | 15 + .../constants/default-options.constant.d.ts | 5 + .../types/decorators/exclude.decorator.d.ts | 9 + .../types/decorators/expose.decorator.d.ts | 9 + .../types/decorators/index.d.ts | 7 + ...nsform-instance-to-instance.decorator.d.ts | 7 + ...transform-instance-to-plain.decorator.d.ts | 7 + ...transform-plain-to-instance.decorator.d.ts | 7 + .../types/decorators/transform.decorator.d.ts | 7 + .../types/decorators/type.decorator.d.ts | 8 + .../class-transformer/types/enums/index.d.ts | 1 + .../types/enums/transformation-type.enum.d.ts | 5 + .../class-transformer/types/index.d.ts | 91 + .../interfaces/class-constructor.type.d.ts | 3 + .../class-transformer-options.interface.d.ts | 68 + .../exclude-options.interface.d.ts | 13 + .../expose-options.interface.d.ts | 46 + .../transform-options.interface.d.ts | 42 + ...pe-discriminator-descriptor.interface.d.ts | 26 + .../type-options.interface.d.ts | 18 + .../types/interfaces/index.d.ts | 14 + .../metadata/exclude-metadata.interface.d.ts | 17 + .../metadata/expose-metadata.interface.d.ts | 17 + .../transform-fn-params.interface.d.ts | 9 + .../transform-metadata.interface.d.ts | 20 + .../metadata/type-metadata.interface.d.ts | 24 + .../interfaces/target-map.interface.d.ts | 16 + .../type-help-options.interface.d.ts | 5 + .../class-transformer/types/storage.d.ts | 5 + .../types/utils/get-global.util.d.ts | 7 + .../types/utils/get-global.util.spect.d.ts | 1 + .../class-transformer/types/utils/index.d.ts | 2 + .../types/utils/is-promise.util.d.ts | 1 + node_modules/cli-table3/LICENSE | 21 + node_modules/cli-table3/README.md | 236 + node_modules/cli-table3/index.d.ts | 96 + node_modules/cli-table3/index.js | 1 + node_modules/cli-table3/package.json | 100 + node_modules/cli-table3/src/cell.js | 409 + node_modules/cli-table3/src/debug.js | 28 + node_modules/cli-table3/src/layout-manager.js | 254 + node_modules/cli-table3/src/table.js | 106 + node_modules/cli-table3/src/utils.js | 344 + node_modules/color-convert/CHANGELOG.md | 54 + node_modules/color-convert/LICENSE | 21 + node_modules/color-convert/README.md | 68 + node_modules/color-convert/conversions.js | 839 + node_modules/color-convert/index.js | 81 + node_modules/color-convert/package.json | 48 + node_modules/color-convert/route.js | 97 + node_modules/color-name/LICENSE | 8 + node_modules/color-name/README.md | 11 + node_modules/color-name/index.js | 152 + node_modules/color-name/package.json | 28 + node_modules/commander/LICENSE | 22 + node_modules/commander/Readme.md | 1176 + node_modules/commander/esm.mjs | 16 + node_modules/commander/index.js | 24 + node_modules/commander/lib/argument.js | 150 + node_modules/commander/lib/command.js | 2777 + node_modules/commander/lib/error.js | 39 + node_modules/commander/lib/help.js | 747 + node_modules/commander/lib/option.js | 380 + node_modules/commander/lib/suggestSimilar.js | 101 + node_modules/commander/package-support.json | 19 + node_modules/commander/package.json | 82 + node_modules/commander/typings/esm.d.mts | 3 + node_modules/commander/typings/index.d.ts | 1113 + node_modules/debug/LICENSE | 20 + node_modules/debug/README.md | 481 + node_modules/debug/package.json | 64 + node_modules/debug/src/browser.js | 272 + node_modules/debug/src/common.js | 292 + node_modules/debug/src/index.js | 10 + node_modules/debug/src/node.js | 263 + node_modules/diff/CONTRIBUTING.md | 39 + node_modules/diff/LICENSE | 31 + node_modules/diff/README.md | 207 + node_modules/diff/dist/diff.js | 1548 + node_modules/diff/dist/diff.min.js | 1 + node_modules/diff/lib/convert/dmp.js | 32 + node_modules/diff/lib/convert/xml.js | 42 + node_modules/diff/lib/diff/array.js | 45 + node_modules/diff/lib/diff/base.js | 304 + node_modules/diff/lib/diff/character.js | 37 + node_modules/diff/lib/diff/css.js | 41 + node_modules/diff/lib/diff/json.js | 163 + node_modules/diff/lib/diff/line.js | 89 + node_modules/diff/lib/diff/sentence.js | 41 + node_modules/diff/lib/diff/word.js | 107 + node_modules/diff/lib/index.es6.js | 1519 + node_modules/diff/lib/index.js | 216 + node_modules/diff/lib/patch/apply.js | 243 + node_modules/diff/lib/patch/create.js | 247 + node_modules/diff/lib/patch/merge.js | 609 + node_modules/diff/lib/patch/parse.js | 156 + node_modules/diff/lib/util/array.js | 32 + .../diff/lib/util/distance-iterator.js | 57 + node_modules/diff/lib/util/params.js | 24 + node_modules/diff/package.json | 74 + node_modules/diff/release-notes.md | 261 + node_modules/diff/runtime.js | 3 + node_modules/emoji-regex/LICENSE-MIT.txt | 20 + node_modules/emoji-regex/README.md | 73 + node_modules/emoji-regex/es2015/index.js | 6 + node_modules/emoji-regex/es2015/text.js | 6 + node_modules/emoji-regex/index.d.ts | 23 + node_modules/emoji-regex/index.js | 6 + node_modules/emoji-regex/package.json | 50 + node_modules/emoji-regex/text.js | 6 + node_modules/error-stack-parser/LICENSE | 19 + node_modules/error-stack-parser/README.md | 44 + .../dist/error-stack-parser.js | 202 + .../dist/error-stack-parser.min.js | 2 + .../dist/error-stack-parser.min.js.map | 1 + .../error-stack-parser.d.ts | 19 + .../error-stack-parser/error-stack-parser.js | 202 + node_modules/error-stack-parser/package.json | 63 + node_modules/escape-string-regexp/index.js | 11 + node_modules/escape-string-regexp/license | 21 + .../escape-string-regexp/package.json | 41 + node_modules/escape-string-regexp/readme.md | 27 + node_modules/figures/index.d.ts | 96 + node_modules/figures/index.js | 151 + node_modules/figures/license | 9 + node_modules/figures/package.json | 45 + node_modules/figures/readme.md | 139 + node_modules/find-up-simple/index.d.ts | 74 + node_modules/find-up-simple/index.js | 62 + node_modules/find-up-simple/license | 9 + node_modules/find-up-simple/package.json | 54 + node_modules/find-up-simple/readme.md | 92 + node_modules/glob/LICENSE.md | 63 + node_modules/glob/README.md | 1203 + node_modules/glob/dist/commonjs/glob.d.ts | 396 + node_modules/glob/dist/commonjs/glob.d.ts.map | 1 + node_modules/glob/dist/commonjs/glob.js | 248 + node_modules/glob/dist/commonjs/glob.js.map | 1 + .../glob/dist/commonjs/has-magic.d.ts | 14 + .../glob/dist/commonjs/has-magic.d.ts.map | 1 + node_modules/glob/dist/commonjs/has-magic.js | 27 + .../glob/dist/commonjs/has-magic.js.map | 1 + node_modules/glob/dist/commonjs/ignore.d.ts | 24 + .../glob/dist/commonjs/ignore.d.ts.map | 1 + node_modules/glob/dist/commonjs/ignore.js | 119 + node_modules/glob/dist/commonjs/ignore.js.map | 1 + node_modules/glob/dist/commonjs/index.d.ts | 97 + .../glob/dist/commonjs/index.d.ts.map | 1 + node_modules/glob/dist/commonjs/index.js | 68 + node_modules/glob/dist/commonjs/index.js.map | 1 + node_modules/glob/dist/commonjs/index.min.js | 4 + .../glob/dist/commonjs/index.min.js.map | 7 + node_modules/glob/dist/commonjs/package.json | 3 + node_modules/glob/dist/commonjs/pattern.d.ts | 79 + .../glob/dist/commonjs/pattern.d.ts.map | 1 + node_modules/glob/dist/commonjs/pattern.js | 223 + .../glob/dist/commonjs/pattern.js.map | 1 + .../glob/dist/commonjs/processor.d.ts | 59 + .../glob/dist/commonjs/processor.d.ts.map | 1 + node_modules/glob/dist/commonjs/processor.js | 301 + .../glob/dist/commonjs/processor.js.map | 1 + node_modules/glob/dist/commonjs/walker.d.ts | 97 + .../glob/dist/commonjs/walker.d.ts.map | 1 + node_modules/glob/dist/commonjs/walker.js | 387 + node_modules/glob/dist/commonjs/walker.js.map | 1 + node_modules/glob/dist/esm/glob.d.ts | 396 + node_modules/glob/dist/esm/glob.d.ts.map | 1 + node_modules/glob/dist/esm/glob.js | 244 + node_modules/glob/dist/esm/glob.js.map | 1 + node_modules/glob/dist/esm/has-magic.d.ts | 14 + node_modules/glob/dist/esm/has-magic.d.ts.map | 1 + node_modules/glob/dist/esm/has-magic.js | 23 + node_modules/glob/dist/esm/has-magic.js.map | 1 + node_modules/glob/dist/esm/ignore.d.ts | 24 + node_modules/glob/dist/esm/ignore.d.ts.map | 1 + node_modules/glob/dist/esm/ignore.js | 115 + node_modules/glob/dist/esm/ignore.js.map | 1 + node_modules/glob/dist/esm/index.d.ts | 97 + node_modules/glob/dist/esm/index.d.ts.map | 1 + node_modules/glob/dist/esm/index.js | 55 + node_modules/glob/dist/esm/index.js.map | 1 + node_modules/glob/dist/esm/index.min.js | 4 + node_modules/glob/dist/esm/index.min.js.map | 7 + node_modules/glob/dist/esm/package.json | 3 + node_modules/glob/dist/esm/pattern.d.ts | 79 + node_modules/glob/dist/esm/pattern.d.ts.map | 1 + node_modules/glob/dist/esm/pattern.js | 219 + node_modules/glob/dist/esm/pattern.js.map | 1 + node_modules/glob/dist/esm/processor.d.ts | 59 + node_modules/glob/dist/esm/processor.d.ts.map | 1 + node_modules/glob/dist/esm/processor.js | 294 + node_modules/glob/dist/esm/processor.js.map | 1 + node_modules/glob/dist/esm/walker.d.ts | 97 + node_modules/glob/dist/esm/walker.d.ts.map | 1 + node_modules/glob/dist/esm/walker.js | 381 + node_modules/glob/dist/esm/walker.js.map | 1 + node_modules/glob/package.json | 98 + node_modules/global-dirs/index.d.ts | 60 + node_modules/global-dirs/index.js | 121 + node_modules/global-dirs/license | 9 + node_modules/global-dirs/package.json | 56 + node_modules/global-dirs/readme.md | 72 + node_modules/has-ansi/index.js | 6 + node_modules/has-ansi/license | 9 + node_modules/has-ansi/package.json | 51 + node_modules/has-ansi/readme.md | 50 + node_modules/has-flag/index.d.ts | 39 + node_modules/has-flag/index.js | 8 + node_modules/has-flag/license | 9 + node_modules/has-flag/package.json | 46 + node_modules/has-flag/readme.md | 89 + node_modules/hosted-git-info/LICENSE | 13 + node_modules/hosted-git-info/README.md | 138 + node_modules/hosted-git-info/lib/from-url.js | 122 + node_modules/hosted-git-info/lib/hosts.js | 229 + node_modules/hosted-git-info/lib/index.js | 227 + node_modules/hosted-git-info/lib/parse-url.js | 81 + node_modules/hosted-git-info/package.json | 57 + node_modules/indent-string/index.d.ts | 42 + node_modules/indent-string/index.js | 35 + node_modules/indent-string/license | 9 + node_modules/indent-string/package.json | 37 + node_modules/indent-string/readme.md | 70 + node_modules/index-to-position/index.d.ts | 35 + node_modules/index-to-position/index.js | 33 + node_modules/index-to-position/license | 9 + node_modules/index-to-position/package.json | 47 + node_modules/index-to-position/readme.md | 59 + node_modules/ini/LICENSE | 15 + node_modules/ini/README.md | 102 + node_modules/ini/ini.js | 206 + node_modules/ini/package.json | 36 + .../is-fullwidth-code-point/index.d.ts | 17 + node_modules/is-fullwidth-code-point/index.js | 50 + node_modules/is-fullwidth-code-point/license | 9 + .../is-fullwidth-code-point/package.json | 42 + .../is-fullwidth-code-point/readme.md | 39 + node_modules/is-installed-globally/index.d.ts | 19 + node_modules/is-installed-globally/index.js | 15 + node_modules/is-installed-globally/license | 9 + .../is-installed-globally/package.json | 54 + node_modules/is-installed-globally/readme.md | 31 + node_modules/is-path-inside/index.d.ts | 27 + node_modules/is-path-inside/index.js | 12 + node_modules/is-path-inside/license | 9 + node_modules/is-path-inside/package.json | 36 + node_modules/is-path-inside/readme.md | 63 + node_modules/is-stream/index.d.ts | 79 + node_modules/is-stream/index.js | 28 + node_modules/is-stream/license | 9 + node_modules/is-stream/package.json | 42 + node_modules/is-stream/readme.md | 60 + node_modules/js-tokens/CHANGELOG.md | 151 + node_modules/js-tokens/LICENSE | 21 + node_modules/js-tokens/README.md | 240 + node_modules/js-tokens/index.js | 23 + node_modules/js-tokens/package.json | 30 + node_modules/knuth-shuffle-seeded/.jsdoc.conf | 3 + node_modules/knuth-shuffle-seeded/.npmignore | 17 + node_modules/knuth-shuffle-seeded/.travis.yml | 16 + .../knuth-shuffle-seeded/CHANGELOG.md | 45 + node_modules/knuth-shuffle-seeded/LICENSE | 202 + node_modules/knuth-shuffle-seeded/README.md | 72 + node_modules/knuth-shuffle-seeded/bower.json | 7 + node_modules/knuth-shuffle-seeded/browser.js | 10 + node_modules/knuth-shuffle-seeded/example.js | 37 + node_modules/knuth-shuffle-seeded/index.html | 104 + node_modules/knuth-shuffle-seeded/index.js | 69 + .../knuth-shuffle-seeded/package.json | 50 + .../knuth-shuffle-seeded/test/test.js | 119 + node_modules/lodash.merge/LICENSE | 47 + node_modules/lodash.merge/README.md | 18 + node_modules/lodash.merge/index.js | 1977 + node_modules/lodash.merge/package.json | 16 + node_modules/lodash.mergewith/LICENSE | 47 + node_modules/lodash.mergewith/README.md | 18 + node_modules/lodash.mergewith/index.js | 1977 + node_modules/lodash.mergewith/package.json | 16 + node_modules/lodash.sortby/LICENSE | 47 + node_modules/lodash.sortby/README.md | 18 + node_modules/lodash.sortby/index.js | 2630 + node_modules/lodash.sortby/package.json | 17 + node_modules/lower-case/LICENSE | 21 + node_modules/lower-case/README.md | 35 + .../lower-case/dist.es2015/index.d.ts | 8 + node_modules/lower-case/dist.es2015/index.js | 48 + .../lower-case/dist.es2015/index.js.map | 1 + .../lower-case/dist.es2015/index.spec.d.ts | 1 + .../lower-case/dist.es2015/index.spec.js | 34 + .../lower-case/dist.es2015/index.spec.js.map | 1 + node_modules/lower-case/dist/index.d.ts | 8 + node_modules/lower-case/dist/index.js | 53 + node_modules/lower-case/dist/index.js.map | 1 + node_modules/lower-case/dist/index.spec.d.ts | 1 + node_modules/lower-case/dist/index.spec.js | 36 + .../lower-case/dist/index.spec.js.map | 1 + node_modules/lower-case/package.json | 87 + node_modules/lru-cache/LICENSE.md | 55 + node_modules/lru-cache/README.md | 469 + .../diagnostics-channel-browser.d.ts.map | 1 + .../diagnostics-channel-browser.js.map | 1 + .../commonjs/browser/diagnostics-channel.d.ts | 5 + .../commonjs/browser/diagnostics-channel.js | 7 + .../dist/commonjs/browser/index.d.ts | 1400 + .../dist/commonjs/browser/index.d.ts.map | 1 + .../lru-cache/dist/commonjs/browser/index.js | 1726 + .../dist/commonjs/browser/index.js.map | 1 + .../dist/commonjs/browser/index.min.js | 2 + .../dist/commonjs/browser/index.min.js.map | 7 + .../lru-cache/dist/commonjs/browser/perf.d.ts | 12 + .../dist/commonjs/browser/perf.d.ts.map | 1 + .../lru-cache/dist/commonjs/browser/perf.js | 10 + .../dist/commonjs/browser/perf.js.map | 1 + .../commonjs/diagnostics-channel-cjs.cjs.map | 1 + .../diagnostics-channel-cjs.d.cts.map | 1 + .../dist/commonjs/diagnostics-channel.d.ts | 5 + .../dist/commonjs/diagnostics-channel.js | 7 + .../lru-cache/dist/commonjs/index.d.ts | 1400 + .../lru-cache/dist/commonjs/index.d.ts.map | 1 + node_modules/lru-cache/dist/commonjs/index.js | 1726 + .../lru-cache/dist/commonjs/index.js.map | 1 + .../lru-cache/dist/commonjs/index.min.js | 2 + .../lru-cache/dist/commonjs/index.min.js.map | 7 + .../node/diagnostics-channel-node.d.ts.map | 1 + .../node/diagnostics-channel-node.js.map | 1 + .../commonjs/node/diagnostics-channel.d.ts | 5 + .../dist/commonjs/node/diagnostics-channel.js | 9 + .../lru-cache/dist/commonjs/node/index.d.ts | 1400 + .../dist/commonjs/node/index.d.ts.map | 1 + .../lru-cache/dist/commonjs/node/index.js | 1726 + .../lru-cache/dist/commonjs/node/index.js.map | 1 + .../lru-cache/dist/commonjs/node/index.min.js | 2 + .../dist/commonjs/node/index.min.js.map | 7 + .../lru-cache/dist/commonjs/node/perf.d.ts | 12 + .../dist/commonjs/node/perf.d.ts.map | 1 + .../lru-cache/dist/commonjs/node/perf.js | 10 + .../lru-cache/dist/commonjs/node/perf.js.map | 1 + .../lru-cache/dist/commonjs/package.json | 3 + .../lru-cache/dist/commonjs/perf.d.ts | 12 + .../lru-cache/dist/commonjs/perf.d.ts.map | 1 + node_modules/lru-cache/dist/commonjs/perf.js | 10 + .../lru-cache/dist/commonjs/perf.js.map | 1 + .../diagnostics-channel-browser.d.ts.map | 1 + .../diagnostics-channel-browser.js.map | 1 + .../dist/esm/browser/diagnostics-channel.d.ts | 5 + .../dist/esm/browser/diagnostics-channel.js | 4 + .../lru-cache/dist/esm/browser/index.d.ts | 1400 + .../lru-cache/dist/esm/browser/index.d.ts.map | 1 + .../lru-cache/dist/esm/browser/index.js | 1722 + .../lru-cache/dist/esm/browser/index.js.map | 1 + .../lru-cache/dist/esm/browser/index.min.js | 2 + .../dist/esm/browser/index.min.js.map | 7 + .../lru-cache/dist/esm/browser/perf.d.ts | 12 + .../lru-cache/dist/esm/browser/perf.d.ts.map | 1 + .../lru-cache/dist/esm/browser/perf.js | 7 + .../lru-cache/dist/esm/browser/perf.js.map | 1 + .../esm/diagnostics-channel-esm.d.mts.map | 1 + .../dist/esm/diagnostics-channel-esm.mjs.map | 1 + .../dist/esm/diagnostics-channel.d.ts | 5 + .../lru-cache/dist/esm/diagnostics-channel.js | 19 + node_modules/lru-cache/dist/esm/index.d.ts | 1400 + .../lru-cache/dist/esm/index.d.ts.map | 1 + node_modules/lru-cache/dist/esm/index.js | 1722 + node_modules/lru-cache/dist/esm/index.js.map | 1 + node_modules/lru-cache/dist/esm/index.min.js | 2 + .../lru-cache/dist/esm/index.min.js.map | 7 + .../node/diagnostics-channel-node.d.ts.map | 1 + .../esm/node/diagnostics-channel-node.js.map | 1 + .../dist/esm/node/diagnostics-channel.d.ts | 5 + .../dist/esm/node/diagnostics-channel.js | 6 + .../lru-cache/dist/esm/node/index.d.ts | 1400 + .../lru-cache/dist/esm/node/index.d.ts.map | 1 + node_modules/lru-cache/dist/esm/node/index.js | 1722 + .../lru-cache/dist/esm/node/index.js.map | 1 + .../lru-cache/dist/esm/node/index.min.js | 2 + .../lru-cache/dist/esm/node/index.min.js.map | 7 + .../lru-cache/dist/esm/node/perf.d.ts | 12 + .../lru-cache/dist/esm/node/perf.d.ts.map | 1 + node_modules/lru-cache/dist/esm/node/perf.js | 7 + .../lru-cache/dist/esm/node/perf.js.map | 1 + node_modules/lru-cache/dist/esm/package.json | 3 + node_modules/lru-cache/dist/esm/perf.d.ts | 12 + node_modules/lru-cache/dist/esm/perf.d.ts.map | 1 + node_modules/lru-cache/dist/esm/perf.js | 7 + node_modules/lru-cache/dist/esm/perf.js.map | 1 + node_modules/lru-cache/package.json | 154 + node_modules/luxon/LICENSE.md | 7 + node_modules/luxon/README.md | 55 + node_modules/luxon/build/amd/luxon.js | 8741 ++ node_modules/luxon/build/amd/luxon.js.map | 1 + node_modules/luxon/build/cjs-browser/luxon.js | 8739 ++ .../luxon/build/cjs-browser/luxon.js.map | 1 + node_modules/luxon/build/es6/luxon.mjs | 8133 ++ node_modules/luxon/build/es6/luxon.mjs.map | 1 + node_modules/luxon/build/global/luxon.js | 8744 ++ node_modules/luxon/build/global/luxon.js.map | 1 + node_modules/luxon/build/global/luxon.min.js | 1 + .../luxon/build/global/luxon.min.js.map | 1 + node_modules/luxon/build/node/luxon.js | 7792 ++ node_modules/luxon/build/node/luxon.js.map | 1 + node_modules/luxon/package.json | 87 + node_modules/luxon/src/datetime.js | 2603 + node_modules/luxon/src/duration.js | 1009 + node_modules/luxon/src/errors.js | 61 + node_modules/luxon/src/impl/conversions.js | 206 + node_modules/luxon/src/impl/diff.js | 95 + node_modules/luxon/src/impl/digits.js | 94 + node_modules/luxon/src/impl/english.js | 233 + node_modules/luxon/src/impl/formats.js | 176 + node_modules/luxon/src/impl/formatter.js | 434 + node_modules/luxon/src/impl/invalid.js | 14 + node_modules/luxon/src/impl/locale.js | 569 + node_modules/luxon/src/impl/regexParser.js | 335 + node_modules/luxon/src/impl/tokenParser.js | 505 + node_modules/luxon/src/impl/util.js | 330 + node_modules/luxon/src/impl/zoneUtil.js | 34 + node_modules/luxon/src/info.js | 205 + node_modules/luxon/src/interval.js | 669 + node_modules/luxon/src/luxon.js | 26 + node_modules/luxon/src/package.json | 4 + node_modules/luxon/src/settings.js | 180 + node_modules/luxon/src/zone.js | 97 + node_modules/luxon/src/zones/IANAZone.js | 235 + .../luxon/src/zones/fixedOffsetZone.js | 150 + node_modules/luxon/src/zones/invalidZone.js | 53 + node_modules/luxon/src/zones/systemZone.js | 61 + node_modules/mime/CHANGELOG.md | 312 + node_modules/mime/LICENSE | 21 + node_modules/mime/Mime.js | 97 + node_modules/mime/README.md | 178 + node_modules/mime/cli.js | 46 + node_modules/mime/index.js | 4 + node_modules/mime/lite.js | 4 + node_modules/mime/package.json | 52 + node_modules/mime/types/other.js | 1 + node_modules/mime/types/standard.js | 1 + node_modules/minimatch/LICENSE.md | 55 + node_modules/minimatch/README.md | 528 + .../dist/commonjs/assert-valid-pattern.d.ts | 2 + .../commonjs/assert-valid-pattern.d.ts.map | 1 + .../dist/commonjs/assert-valid-pattern.js | 14 + .../dist/commonjs/assert-valid-pattern.js.map | 1 + node_modules/minimatch/dist/commonjs/ast.d.ts | 22 + .../minimatch/dist/commonjs/ast.d.ts.map | 1 + node_modules/minimatch/dist/commonjs/ast.js | 845 + .../minimatch/dist/commonjs/ast.js.map | 1 + .../dist/commonjs/brace-expressions.d.ts | 8 + .../dist/commonjs/brace-expressions.d.ts.map | 1 + .../dist/commonjs/brace-expressions.js | 150 + .../dist/commonjs/brace-expressions.js.map | 1 + .../minimatch/dist/commonjs/escape.d.ts | 15 + .../minimatch/dist/commonjs/escape.d.ts.map | 1 + .../minimatch/dist/commonjs/escape.js | 30 + .../minimatch/dist/commonjs/escape.js.map | 1 + .../minimatch/dist/commonjs/index.d.ts | 174 + .../minimatch/dist/commonjs/index.d.ts.map | 1 + node_modules/minimatch/dist/commonjs/index.js | 1127 + .../minimatch/dist/commonjs/index.js.map | 1 + .../minimatch/dist/commonjs/package.json | 3 + .../minimatch/dist/commonjs/unescape.d.ts | 22 + .../minimatch/dist/commonjs/unescape.d.ts.map | 1 + .../minimatch/dist/commonjs/unescape.js | 38 + .../minimatch/dist/commonjs/unescape.js.map | 1 + .../dist/esm/assert-valid-pattern.d.ts | 2 + .../dist/esm/assert-valid-pattern.d.ts.map | 1 + .../dist/esm/assert-valid-pattern.js | 10 + .../dist/esm/assert-valid-pattern.js.map | 1 + node_modules/minimatch/dist/esm/ast.d.ts | 22 + node_modules/minimatch/dist/esm/ast.d.ts.map | 1 + node_modules/minimatch/dist/esm/ast.js | 841 + node_modules/minimatch/dist/esm/ast.js.map | 1 + .../minimatch/dist/esm/brace-expressions.d.ts | 8 + .../dist/esm/brace-expressions.d.ts.map | 1 + .../minimatch/dist/esm/brace-expressions.js | 146 + .../dist/esm/brace-expressions.js.map | 1 + node_modules/minimatch/dist/esm/escape.d.ts | 15 + .../minimatch/dist/esm/escape.d.ts.map | 1 + node_modules/minimatch/dist/esm/escape.js | 26 + node_modules/minimatch/dist/esm/escape.js.map | 1 + node_modules/minimatch/dist/esm/index.d.ts | 174 + .../minimatch/dist/esm/index.d.ts.map | 1 + node_modules/minimatch/dist/esm/index.js | 1114 + node_modules/minimatch/dist/esm/index.js.map | 1 + node_modules/minimatch/dist/esm/package.json | 3 + node_modules/minimatch/dist/esm/unescape.d.ts | 22 + .../minimatch/dist/esm/unescape.d.ts.map | 1 + node_modules/minimatch/dist/esm/unescape.js | 34 + .../minimatch/dist/esm/unescape.js.map | 1 + node_modules/minimatch/package.json | 73 + node_modules/minipass/LICENSE.md | 55 + node_modules/minipass/README.md | 825 + .../minipass/dist/commonjs/index.d.ts | 545 + .../minipass/dist/commonjs/index.d.ts.map | 1 + node_modules/minipass/dist/commonjs/index.js | 1038 + .../minipass/dist/commonjs/index.js.map | 1 + .../minipass/dist/commonjs/package.json | 3 + node_modules/minipass/dist/esm/index.d.ts | 545 + node_modules/minipass/dist/esm/index.d.ts.map | 1 + node_modules/minipass/dist/esm/index.js | 1020 + node_modules/minipass/dist/esm/index.js.map | 1 + node_modules/minipass/dist/esm/package.json | 3 + node_modules/minipass/package.json | 77 + node_modules/mkdirp/LICENSE | 21 + node_modules/mkdirp/dist/cjs/package.json | 91 + node_modules/mkdirp/dist/cjs/src/bin.d.ts | 3 + node_modules/mkdirp/dist/cjs/src/bin.d.ts.map | 1 + node_modules/mkdirp/dist/cjs/src/bin.js | 80 + node_modules/mkdirp/dist/cjs/src/bin.js.map | 1 + .../mkdirp/dist/cjs/src/find-made.d.ts | 4 + .../mkdirp/dist/cjs/src/find-made.d.ts.map | 1 + node_modules/mkdirp/dist/cjs/src/find-made.js | 35 + .../mkdirp/dist/cjs/src/find-made.js.map | 1 + node_modules/mkdirp/dist/cjs/src/index.d.ts | 39 + .../mkdirp/dist/cjs/src/index.d.ts.map | 1 + node_modules/mkdirp/dist/cjs/src/index.js | 53 + node_modules/mkdirp/dist/cjs/src/index.js.map | 1 + .../mkdirp/dist/cjs/src/mkdirp-manual.d.ts | 6 + .../dist/cjs/src/mkdirp-manual.d.ts.map | 1 + .../mkdirp/dist/cjs/src/mkdirp-manual.js | 79 + .../mkdirp/dist/cjs/src/mkdirp-manual.js.map | 1 + .../mkdirp/dist/cjs/src/mkdirp-native.d.ts | 6 + .../dist/cjs/src/mkdirp-native.d.ts.map | 1 + .../mkdirp/dist/cjs/src/mkdirp-native.js | 50 + .../mkdirp/dist/cjs/src/mkdirp-native.js.map | 1 + .../mkdirp/dist/cjs/src/opts-arg.d.ts | 42 + .../mkdirp/dist/cjs/src/opts-arg.d.ts.map | 1 + node_modules/mkdirp/dist/cjs/src/opts-arg.js | 38 + .../mkdirp/dist/cjs/src/opts-arg.js.map | 1 + .../mkdirp/dist/cjs/src/path-arg.d.ts | 2 + .../mkdirp/dist/cjs/src/path-arg.d.ts.map | 1 + node_modules/mkdirp/dist/cjs/src/path-arg.js | 28 + .../mkdirp/dist/cjs/src/path-arg.js.map | 1 + .../mkdirp/dist/cjs/src/use-native.d.ts | 6 + .../mkdirp/dist/cjs/src/use-native.d.ts.map | 1 + .../mkdirp/dist/cjs/src/use-native.js | 17 + .../mkdirp/dist/cjs/src/use-native.js.map | 1 + node_modules/mkdirp/dist/mjs/find-made.d.ts | 4 + .../mkdirp/dist/mjs/find-made.d.ts.map | 1 + node_modules/mkdirp/dist/mjs/find-made.js | 30 + node_modules/mkdirp/dist/mjs/find-made.js.map | 1 + node_modules/mkdirp/dist/mjs/index.d.ts | 39 + node_modules/mkdirp/dist/mjs/index.d.ts.map | 1 + node_modules/mkdirp/dist/mjs/index.js | 43 + node_modules/mkdirp/dist/mjs/index.js.map | 1 + .../mkdirp/dist/mjs/mkdirp-manual.d.ts | 6 + .../mkdirp/dist/mjs/mkdirp-manual.d.ts.map | 1 + node_modules/mkdirp/dist/mjs/mkdirp-manual.js | 75 + .../mkdirp/dist/mjs/mkdirp-manual.js.map | 1 + .../mkdirp/dist/mjs/mkdirp-native.d.ts | 6 + .../mkdirp/dist/mjs/mkdirp-native.d.ts.map | 1 + node_modules/mkdirp/dist/mjs/mkdirp-native.js | 46 + .../mkdirp/dist/mjs/mkdirp-native.js.map | 1 + node_modules/mkdirp/dist/mjs/opts-arg.d.ts | 42 + .../mkdirp/dist/mjs/opts-arg.d.ts.map | 1 + node_modules/mkdirp/dist/mjs/opts-arg.js | 34 + node_modules/mkdirp/dist/mjs/opts-arg.js.map | 1 + node_modules/mkdirp/dist/mjs/package.json | 3 + node_modules/mkdirp/dist/mjs/path-arg.d.ts | 2 + .../mkdirp/dist/mjs/path-arg.d.ts.map | 1 + node_modules/mkdirp/dist/mjs/path-arg.js | 24 + node_modules/mkdirp/dist/mjs/path-arg.js.map | 1 + node_modules/mkdirp/dist/mjs/use-native.d.ts | 6 + .../mkdirp/dist/mjs/use-native.d.ts.map | 1 + node_modules/mkdirp/dist/mjs/use-native.js | 14 + .../mkdirp/dist/mjs/use-native.js.map | 1 + node_modules/mkdirp/package.json | 91 + node_modules/mkdirp/readme.markdown | 281 + node_modules/ms/index.js | 162 + node_modules/ms/license.md | 21 + node_modules/ms/package.json | 38 + node_modules/ms/readme.md | 59 + node_modules/mz/HISTORY.md | 66 + node_modules/mz/LICENSE | 22 + node_modules/mz/README.md | 106 + node_modules/mz/child_process.js | 8 + node_modules/mz/crypto.js | 9 + node_modules/mz/dns.js | 16 + node_modules/mz/fs.js | 62 + node_modules/mz/index.js | 8 + node_modules/mz/package.json | 44 + node_modules/mz/readline.js | 64 + node_modules/mz/zlib.js | 13 + node_modules/no-case/LICENSE | 21 + node_modules/no-case/README.md | 37 + node_modules/no-case/dist.es2015/index.d.ts | 10 + node_modules/no-case/dist.es2015/index.js | 31 + node_modules/no-case/dist.es2015/index.js.map | 1 + .../no-case/dist.es2015/index.spec.d.ts | 1 + .../no-case/dist.es2015/index.spec.js | 57 + .../no-case/dist.es2015/index.spec.js.map | 1 + node_modules/no-case/dist/index.d.ts | 10 + node_modules/no-case/dist/index.js | 35 + node_modules/no-case/dist/index.js.map | 1 + node_modules/no-case/dist/index.spec.d.ts | 1 + node_modules/no-case/dist/index.spec.js | 59 + node_modules/no-case/dist/index.spec.js.map | 1 + node_modules/no-case/package.json | 85 + node_modules/normalize-package-data/LICENSE | 15 + node_modules/normalize-package-data/README.md | 108 + .../lib/extract_description.js | 24 + .../normalize-package-data/lib/fixer.js | 472 + .../lib/make_warning.js | 22 + .../normalize-package-data/lib/normalize.js | 48 + .../normalize-package-data/lib/safe_format.js | 11 + .../normalize-package-data/lib/typos.json | 25 + .../lib/warning_messages.json | 30 + .../normalize-package-data/package.json | 56 + node_modules/object-assign/index.js | 90 + node_modules/object-assign/license | 21 + node_modules/object-assign/package.json | 42 + node_modules/object-assign/readme.md | 61 + node_modules/pad-right/LICENSE | 21 + node_modules/pad-right/README.md | 71 + node_modules/pad-right/index.js | 20 + node_modules/pad-right/package.json | 64 + node_modules/parse-json/index.d.ts | 144 + node_modules/parse-json/index.js | 110 + node_modules/parse-json/license | 9 + node_modules/parse-json/package.json | 53 + node_modules/parse-json/readme.md | 119 + node_modules/path-scurry/LICENSE.md | 55 + node_modules/path-scurry/README.md | 636 + .../path-scurry/dist/commonjs/index.d.ts | 1115 + .../path-scurry/dist/commonjs/index.d.ts.map | 1 + .../path-scurry/dist/commonjs/index.js | 2018 + .../path-scurry/dist/commonjs/index.js.map | 1 + .../path-scurry/dist/commonjs/package.json | 3 + node_modules/path-scurry/dist/esm/index.d.ts | 1115 + .../path-scurry/dist/esm/index.d.ts.map | 1 + node_modules/path-scurry/dist/esm/index.js | 1983 + .../path-scurry/dist/esm/index.js.map | 1 + .../path-scurry/dist/esm/package.json | 3 + node_modules/path-scurry/package.json | 72 + node_modules/picocolors/LICENSE | 15 + node_modules/picocolors/README.md | 21 + node_modules/picocolors/package.json | 25 + node_modules/picocolors/picocolors.browser.js | 4 + node_modules/picocolors/picocolors.d.ts | 5 + node_modules/picocolors/picocolors.js | 75 + node_modules/picocolors/types.d.ts | 51 + node_modules/playwright-core/LICENSE | 202 + node_modules/playwright-core/NOTICE | 5 + node_modules/playwright-core/README.md | 3 + .../playwright-core/ThirdPartyNotices.txt | 13 + .../bin/install_media_pack.ps1 | 5 + .../bin/install_webkit_wsl.ps1 | 33 + .../bin/reinstall_chrome_beta_linux.sh | 42 + .../bin/reinstall_chrome_beta_mac.sh | 13 + .../bin/reinstall_chrome_beta_win.ps1 | 24 + .../bin/reinstall_chrome_stable_linux.sh | 42 + .../bin/reinstall_chrome_stable_mac.sh | 12 + .../bin/reinstall_chrome_stable_win.ps1 | 24 + .../bin/reinstall_msedge_beta_linux.sh | 48 + .../bin/reinstall_msedge_beta_mac.sh | 11 + .../bin/reinstall_msedge_beta_win.ps1 | 23 + .../bin/reinstall_msedge_dev_linux.sh | 48 + .../bin/reinstall_msedge_dev_mac.sh | 11 + .../bin/reinstall_msedge_dev_win.ps1 | 23 + .../bin/reinstall_msedge_stable_linux.sh | 48 + .../bin/reinstall_msedge_stable_mac.sh | 11 + .../bin/reinstall_msedge_stable_win.ps1 | 24 + node_modules/playwright-core/browsers.json | 81 + node_modules/playwright-core/cli.js | 21 + node_modules/playwright-core/index.d.ts | 17 + node_modules/playwright-core/index.js | 17 + node_modules/playwright-core/index.mjs | 28 + node_modules/playwright-core/lib/bootstrap.js | 88 + .../playwright-core/lib/coreBundle.js | 73385 +++++++++++++ .../playwright-core/lib/entry/cliDaemon.js | 5 + .../playwright-core/lib/entry/dashboardApp.js | 3 + node_modules/playwright-core/lib/entry/mcp.js | 10 + .../lib/entry/oopBrowserDownload.js | 3 + node_modules/playwright-core/lib/package.js | 50 + .../lib/server/chromium/appIcon.png | Bin 0 -> 16565 bytes .../lib/server/deviceDescriptorsSource.json | 2739 + .../lib/server/electron/loader.js | 115 + .../playwright-core/lib/serverRegistry.js | 7343 ++ .../lib/serverRegistry.js.LICENSE | 354 + .../lib/tools/cli-client/channelSessions.js | 141 + .../lib/tools/cli-client/cli.js | 6 + .../lib/tools/cli-client/help.json | 693 + .../lib/tools/cli-client/minimist.js | 128 + .../lib/tools/cli-client/output.js | 343 + .../lib/tools/cli-client/program.js | 404 + .../lib/tools/cli-client/registry.js | 176 + .../lib/tools/cli-client/session.js | 254 + .../lib/tools/cli-client/skill/SKILL.md | 404 + .../skill/references/element-attributes.md | 23 + .../skill/references/playwright-tests.md | 39 + .../skill/references/request-mocking.md | 87 + .../skill/references/running-code.md | 241 + .../skill/references/session-management.md | 225 + .../skill/references/spec-driven-testing.md | 305 + .../skill/references/storage-state.md | 275 + .../skill/references/test-generation.md | 134 + .../cli-client/skill/references/tracing.md | 139 + .../skill/references/video-recording.md | 143 + .../lib/tools/dashboard/appIcon.png | Bin 0 -> 18945 bytes .../playwright-core/lib/tools/trace/SKILL.md | 171 + .../lib/tools/utils/extension.js | 78 + .../lib/tools/utils/socketConnection.js | 108 + .../playwright-core/lib/utilsBundle.js | 86736 ++++++++++++++++ .../lib/utilsBundle.js.LICENSE | 2056 + .../dashboard/assets/codicon-DCmgc-ay.ttf | Bin 0 -> 80340 bytes .../dashboard/assets/firefox-1bWoP6pv.svg | 1 + .../assets/firefox-beta-k3eOH_eK.svg | 1 + .../assets/firefox-nightly-Cp5nfeDT.svg | 1 + .../vite/dashboard/assets/index-BY2S1tHT.css | 1 + .../vite/dashboard/assets/index-C_5TMfeg.js | 52 + .../vite/dashboard/assets/safari-na3_-uQk.svg | 1 + .../lib/vite/dashboard/index.html | 29 + .../lib/vite/dashboard/playwright-logo.svg | 24 + .../lib/vite/htmlReport/index.html | 16 + .../lib/vite/htmlReport/report.css | 1 + .../lib/vite/htmlReport/report.js | 72 + .../assets/codeMirrorModule-DYBRYzYX.css | 1 + .../assets/codeMirrorModule-DeBYQozu.js | 32 + .../vite/recorder/assets/codicon-DCmgc-ay.ttf | Bin 0 -> 80340 bytes .../vite/recorder/assets/index-4ZiSSCmn.css | 1 + .../vite/recorder/assets/index-Bq-mQf8S.js | 193 + .../lib/vite/recorder/index.html | 29 + .../lib/vite/recorder/playwright-logo.svg | 9 + .../assets/codeMirrorModule-LEHpjmcn.js | 32 + .../assets/defaultSettingsView-BNmKHKpQ.js | 264 + .../traceViewer/assets/urlMatch-BYQrIQwR.js | 1 + .../assets/xtermModule-CsJ4vdCR.js | 9 + .../traceViewer/codeMirrorModule.DYBRYzYX.css | 1 + .../lib/vite/traceViewer/codicon.DCmgc-ay.ttf | Bin 0 -> 80340 bytes .../defaultSettingsView.CjdS-WJx.css | 1 + .../lib/vite/traceViewer/index.CzXZzn5A.css | 1 + .../lib/vite/traceViewer/index.DEBl1tfz.js | 2 + .../lib/vite/traceViewer/index.html | 44 + .../lib/vite/traceViewer/manifest.webmanifest | 16 + .../lib/vite/traceViewer/playwright-logo.svg | 9 + .../lib/vite/traceViewer/snapshot.html | 10 + .../lib/vite/traceViewer/snapshot.v8KI4P3m.js | 2 + .../lib/vite/traceViewer/sw.bundle.js | 5 + .../lib/vite/traceViewer/uiMode.BZQ54Kgt.css | 1 + .../lib/vite/traceViewer/uiMode.Ut8wwJNp.js | 6 + .../lib/vite/traceViewer/uiMode.html | 18 + .../vite/traceViewer/xtermModule.DYP7pi_n.css | 32 + node_modules/playwright-core/lib/xdg-open | 1066 + node_modules/playwright-core/package.json | 34 + .../playwright-core/types/protocol.d.ts | 24629 +++++ .../playwright-core/types/structs.d.ts | 45 + node_modules/playwright-core/types/types.d.ts | 24445 +++++ node_modules/playwright/LICENSE | 202 + node_modules/playwright/NOTICE | 5 + node_modules/playwright/README.md | 318 + node_modules/playwright/ThirdPartyNotices.txt | 14 + node_modules/playwright/cli.js | 19 + node_modules/playwright/index.d.ts | 17 + node_modules/playwright/index.js | 17 + node_modules/playwright/index.mjs | 18 + node_modules/playwright/jsx-runtime.js | 42 + node_modules/playwright/jsx-runtime.mjs | 21 + .../playwright/lib/agents/agentParser.js | 89 + .../lib/agents/copilot-setup-steps.yml | 34 + .../playwright/lib/agents/generateAgents.js | 395 + .../agents/playwright-test-coverage.prompt.md | 31 + .../agents/playwright-test-generate.prompt.md | 8 + .../agents/playwright-test-generator.agent.md | 88 + .../lib/agents/playwright-test-heal.prompt.md | 6 + .../agents/playwright-test-healer.agent.md | 56 + .../lib/agents/playwright-test-plan.prompt.md | 9 + .../agents/playwright-test-planner.agent.md | 74 + .../playwright/lib/cli/reportActions.js | 78 + .../playwright/lib/cli/testActions.js | 213 + node_modules/playwright/lib/common/index.js | 2931 + .../playwright/lib/common/index.js.txt | 35 + node_modules/playwright/lib/errorContext.js | 130 + node_modules/playwright/lib/globals.js | 58 + node_modules/playwright/lib/index.js | 784 + node_modules/playwright/lib/isomorphic.js | 260 + node_modules/playwright/lib/isomorphic.js.txt | 9 + .../lib/loader/loaderProcessEntry.js | 34 + .../lib/loader/loaderProcessEntry.js.txt | 9 + .../playwright/lib/matchers/expect.js | 13052 +++ .../playwright/lib/matchers/expect.js.LICENSE | 693 + .../playwright/lib/matchers/expect.js.txt | 72 + .../playwright/lib/mcp/test/browserBackend.js | 125 + .../playwright/lib/mcp/test/generatorTools.js | 122 + .../playwright/lib/mcp/test/plannerTools.js | 150 + node_modules/playwright/lib/mcp/test/seed.js | 82 + .../playwright/lib/mcp/test/streams.js | 44 + .../playwright/lib/mcp/test/testBackend.js | 99 + .../playwright/lib/mcp/test/testContext.js | 306 + .../playwright/lib/mcp/test/testTool.js | 30 + .../playwright/lib/mcp/test/testTools.js | 98 + node_modules/playwright/lib/package.js | 47 + node_modules/playwright/lib/program.js | 223 + node_modules/playwright/lib/runner/index.js | 8085 ++ .../playwright/lib/runner/index.js.txt | 59 + .../playwright/lib/transform/babelBundle.js | 71030 +++++++++++++ .../lib/transform/babelBundle.js.LICENSE | 2359 + .../lib/transform/babelBundle.js.txt | 325 + .../playwright/lib/transform/esmLoader.js | 6064 ++ .../lib/transform/esmLoader.js.LICENSE | 335 + .../playwright/lib/transform/esmLoader.js.txt | 57 + node_modules/playwright/lib/util.js | 400 + .../lib/worker/workerProcessEntry.js | 1868 + .../lib/worker/workerProcessEntry.js.txt | 20 + node_modules/playwright/package.json | 61 + node_modules/playwright/test.d.ts | 18 + node_modules/playwright/test.js | 24 + node_modules/playwright/test.mjs | 35 + node_modules/playwright/types/test.d.ts | 10461 ++ .../playwright/types/testReporter.d.ts | 824 + node_modules/progress/CHANGELOG.md | 115 + node_modules/progress/LICENSE | 22 + node_modules/progress/Makefile | 8 + node_modules/progress/Readme.md | 146 + node_modules/progress/index.js | 1 + node_modules/progress/lib/node-progress.js | 236 + node_modules/progress/package.json | 26 + node_modules/property-expr/LICENSE.txt | 21 + node_modules/property-expr/README.md | 104 + node_modules/property-expr/compiler.js | 67 + node_modules/property-expr/index.d.ts | 31 + node_modules/property-expr/index.js | 158 + node_modules/property-expr/package.json | 36 + node_modules/read-package-up/index.d.ts | 81 + node_modules/read-package-up/index.js | 27 + node_modules/read-package-up/license | 9 + .../node_modules/type-fest/index.d.ts | 223 + .../node_modules/type-fest/license-cc0 | 121 + .../node_modules/type-fest/license-mit | 9 + .../node_modules/type-fest/package.json | 75 + .../node_modules/type-fest/readme.md | 1081 + .../type-fest/source/absolute.d.ts | 52 + .../type-fest/source/all-extend.d.ts | 119 + .../type-fest/source/all-union-fields.d.ts | 91 + .../type-fest/source/and-all.d.ts | 76 + .../node_modules/type-fest/source/and.d.ts | 82 + .../type-fest/source/array-element.d.ts | 46 + .../type-fest/source/array-indices.d.ts | 25 + .../type-fest/source/array-length.d.ts | 36 + .../type-fest/source/array-reverse.d.ts | 84 + .../type-fest/source/array-slice.d.ts | 132 + .../type-fest/source/array-splice.d.ts | 104 + .../type-fest/source/array-tail.d.ts | 70 + .../type-fest/source/array-values.d.ts | 24 + .../type-fest/source/arrayable.d.ts | 31 + .../type-fest/source/async-return-type.d.ts | 28 + .../type-fest/source/asyncify.d.ts | 25 + .../node_modules/type-fest/source/basic.d.ts | 38 + .../type-fest/source/camel-case.d.ts | 125 + .../source/camel-cased-properties-deep.d.ts | 106 + .../source/camel-cased-properties.d.ts | 49 + .../type-fest/source/characters.d.ts | 67 + .../type-fest/source/conditional-except.d.ts | 47 + .../type-fest/source/conditional-keys.d.ts | 63 + .../source/conditional-pick-deep.d.ts | 122 + .../type-fest/source/conditional-pick.d.ts | 48 + .../source/conditional-simplify-deep.d.ts | 73 + .../source/conditional-simplify.d.ts | 50 + .../type-fest/source/delimiter-case.d.ts | 79 + .../delimiter-cased-properties-deep.d.ts | 115 + .../source/delimiter-cased-properties.d.ts | 52 + .../type-fest/source/distributed-omit.d.ts | 96 + .../type-fest/source/distributed-pick.d.ts | 92 + .../type-fest/source/empty-object.d.ts | 51 + .../type-fest/source/entries.d.ts | 64 + .../node_modules/type-fest/source/entry.d.ts | 67 + .../node_modules/type-fest/source/exact.d.ts | 73 + .../node_modules/type-fest/source/except.d.ts | 112 + .../type-fest/source/exclude-exactly.d.ts | 57 + .../source/exclude-rest-element.d.ts | 40 + .../type-fest/source/exclude-strict.d.ts | 51 + .../type-fest/source/exclusify-union.d.ts | 147 + .../type-fest/source/extends-strict.d.ts | 151 + .../source/extract-rest-element.d.ts | 30 + .../type-fest/source/extract-strict.d.ts | 51 + .../type-fest/source/find-global-type.d.ts | 68 + .../type-fest/source/fixed-length-array.d.ts | 97 + .../node_modules/type-fest/source/get.d.ts | 227 + .../type-fest/source/global-this.d.ts | 24 + .../type-fest/source/globals/index.d.ts | 3 + .../source/globals/observable-like.d.ts | 78 + .../source/greater-than-or-equal.d.ts | 63 + .../type-fest/source/greater-than.d.ts | 92 + .../type-fest/source/has-optional-keys.d.ts | 23 + .../type-fest/source/has-readonly-keys.d.ts | 23 + .../type-fest/source/has-required-keys.d.ts | 61 + .../type-fest/source/has-writable-keys.d.ts | 23 + .../node_modules/type-fest/source/if-any.d.ts | 28 + .../type-fest/source/if-empty-object.d.ts | 30 + .../type-fest/source/if-never.d.ts | 28 + .../type-fest/source/if-null.d.ts | 28 + .../type-fest/source/if-unknown.d.ts | 28 + .../node_modules/type-fest/source/if.d.ts | 102 + .../type-fest/source/includes.d.ts | 24 + .../type-fest/source/int-closed-range.d.ts | 45 + .../type-fest/source/int-range.d.ts | 67 + .../type-fest/source/internal/array.d.ts | 144 + .../type-fest/source/internal/characters.d.ts | 65 + .../source/internal/enforce-optional.d.ts | 49 + .../type-fest/source/internal/index.d.ts | 11 + .../type-fest/source/internal/keys.d.ts | 100 + .../type-fest/source/internal/numeric.d.ts | 141 + .../type-fest/source/internal/object.d.ts | 300 + .../type-fest/source/internal/string.d.ts | 202 + .../type-fest/source/internal/tuple.d.ts | 79 + .../type-fest/source/internal/type.d.ts | 165 + .../type-fest/source/invariant-of.d.ts | 85 + .../node_modules/type-fest/source/is-any.d.ts | 31 + .../type-fest/source/is-equal.d.ts | 41 + .../type-fest/source/is-float.d.ts | 43 + .../type-fest/source/is-integer.d.ts | 60 + .../type-fest/source/is-literal.d.ts | 315 + .../type-fest/source/is-lowercase.d.ts | 38 + .../type-fest/source/is-never.d.ts | 56 + .../type-fest/source/is-null.d.ts | 22 + .../type-fest/source/is-nullable.d.ts | 30 + .../type-fest/source/is-optional-key-of.d.ts | 51 + .../type-fest/source/is-optional.d.ts | 28 + .../type-fest/source/is-readonly-key-of.d.ts | 55 + .../type-fest/source/is-required-key-of.d.ts | 51 + .../type-fest/source/is-tuple.d.ts | 92 + .../type-fest/source/is-undefined.d.ts | 22 + .../type-fest/source/is-union.d.ts | 40 + .../type-fest/source/is-unknown.d.ts | 43 + .../type-fest/source/is-uppercase.d.ts | 38 + .../type-fest/source/is-writable-key-of.d.ts | 51 + .../type-fest/source/iterable-element.d.ts | 66 + .../node_modules/type-fest/source/join.d.ts | 79 + .../type-fest/source/json-value.d.ts | 33 + .../type-fest/source/jsonifiable.d.ts | 37 + .../type-fest/source/jsonify.d.ts | 127 + .../type-fest/source/kebab-case.d.ts | 47 + .../source/kebab-cased-properties-deep.d.ts | 72 + .../source/kebab-cased-properties.d.ts | 46 + .../type-fest/source/key-as-string.d.ts | 27 + .../type-fest/source/keys-of-union.d.ts | 44 + .../type-fest/source/last-array-element.d.ts | 36 + .../type-fest/source/less-than-or-equal.d.ts | 60 + .../type-fest/source/less-than.d.ts | 60 + .../source/literal-to-primitive-deep.d.ts | 71 + .../source/literal-to-primitive.d.ts | 38 + .../type-fest/source/literal-union.d.ts | 39 + .../type-fest/source/merge-deep.d.ts | 495 + .../type-fest/source/merge-exclusive.d.ts | 45 + .../node_modules/type-fest/source/merge.d.ts | 87 + .../source/multidimensional-array.d.ts | 38 + .../multidimensional-readonly-array.d.ts | 38 + .../type-fest/source/non-empty-object.d.ts | 38 + .../type-fest/source/non-empty-string.d.ts | 32 + .../type-fest/source/non-empty-tuple.d.ts | 24 + .../type-fest/source/non-nullable-deep.d.ts | 102 + .../type-fest/source/numeric.d.ts | 226 + .../type-fest/source/object-merge.d.ts | 194 + .../type-fest/source/omit-deep.d.ts | 153 + .../source/omit-index-signature.d.ts | 98 + .../node_modules/type-fest/source/opaque.d.ts | 3 + .../type-fest/source/optional-keys-of.d.ts | 46 + .../type-fest/source/optional.d.ts | 31 + .../node_modules/type-fest/source/or-all.d.ts | 73 + .../node_modules/type-fest/source/or.d.ts | 82 + .../type-fest/source/override-properties.d.ts | 43 + .../type-fest/source/package-json.d.ts | 710 + .../type-fest/source/partial-deep.d.ts | 157 + .../source/partial-on-undefined-deep.d.ts | 81 + .../type-fest/source/pascal-case.d.ts | 52 + .../source/pascal-cased-properties-deep.d.ts | 79 + .../source/pascal-cased-properties.d.ts | 46 + .../node_modules/type-fest/source/paths.d.ts | 241 + .../type-fest/source/pick-deep.d.ts | 139 + .../source/pick-index-signature.d.ts | 52 + .../type-fest/source/primitive.d.ts | 15 + .../type-fest/source/promisable.d.ts | 27 + .../type-fest/source/readonly-deep.d.ts | 118 + .../type-fest/source/readonly-keys-of.d.ts | 38 + .../type-fest/source/readonly-tuple.d.ts | 34 + .../type-fest/source/remove-prefix.d.ts | 115 + .../type-fest/source/remove-suffix.d.ts | 115 + .../type-fest/source/replace.d.ts | 87 + .../type-fest/source/require-all-or-none.d.ts | 54 + .../source/require-at-least-one.d.ts | 48 + .../type-fest/source/require-exactly-one.d.ts | 48 + .../type-fest/source/require-one-or-none.d.ts | 49 + .../type-fest/source/required-deep.d.ts | 78 + .../type-fest/source/required-keys-of.d.ts | 38 + .../node_modules/type-fest/source/schema.d.ts | 119 + .../source/screaming-snake-case.d.ts | 31 + .../type-fest/source/set-field-type.d.ts | 67 + .../source/set-non-nullable-deep.d.ts | 88 + .../type-fest/source/set-non-nullable.d.ts | 34 + .../type-fest/source/set-optional.d.ts | 42 + .../type-fest/source/set-parameter-type.d.ts | 125 + .../type-fest/source/set-readonly.d.ts | 40 + .../type-fest/source/set-required-deep.d.ts | 64 + .../type-fest/source/set-required.d.ts | 75 + .../type-fest/source/set-return-type.d.ts | 31 + .../source/shared-union-fields-deep.d.ts | 180 + .../type-fest/source/shared-union-fields.d.ts | 79 + .../type-fest/source/simplify-deep.d.ts | 117 + .../type-fest/source/simplify.d.ts | 61 + .../type-fest/source/single-key-object.d.ts | 28 + .../type-fest/source/snake-case.d.ts | 48 + .../source/snake-cased-properties-deep.d.ts | 72 + .../source/snake-cased-properties.d.ts | 46 + .../type-fest/source/some-extend.d.ts | 113 + .../source/split-on-rest-element.d.ts | 106 + .../node_modules/type-fest/source/split.d.ts | 90 + .../node_modules/type-fest/source/spread.d.ts | 78 + .../type-fest/source/string-repeat.d.ts | 49 + .../type-fest/source/string-slice.d.ts | 39 + .../type-fest/source/stringified.d.ts | 25 + .../source/structured-cloneable.d.ts | 89 + .../type-fest/source/subtract.d.ts | 87 + .../node_modules/type-fest/source/sum.d.ts | 82 + .../type-fest/source/tagged-union.d.ts | 53 + .../node_modules/type-fest/source/tagged.d.ts | 261 + .../node_modules/type-fest/source/trim.d.ts | 29 + .../type-fest/source/tsconfig-json.d.ts | 1356 + .../type-fest/source/tuple-of.d.ts | 112 + .../type-fest/source/tuple-to-object.d.ts | 47 + .../type-fest/source/tuple-to-union.d.ts | 54 + .../type-fest/source/typed-array.d.ts | 19 + .../source/undefined-on-partial-deep.d.ts | 83 + .../type-fest/source/union-length.d.ts | 27 + .../type-fest/source/union-member.d.ts | 65 + .../source/union-to-intersection.d.ts | 35 + .../type-fest/source/union-to-tuple.d.ts | 49 + .../type-fest/source/unknown-array.d.ts | 27 + .../type-fest/source/unknown-map.d.ts | 26 + .../type-fest/source/unknown-record.d.ts | 33 + .../type-fest/source/unknown-set.d.ts | 26 + .../type-fest/source/unwrap-partial.d.ts | 33 + .../type-fest/source/unwrap-required.d.ts | 37 + .../type-fest/source/value-of.d.ts | 24 + .../node_modules/type-fest/source/words.d.ts | 148 + .../type-fest/source/writable-deep.d.ts | 84 + .../type-fest/source/writable-keys-of.d.ts | 34 + .../type-fest/source/writable.d.ts | 68 + .../node_modules/type-fest/source/xor.d.ts | 83 + node_modules/read-package-up/package.json | 64 + node_modules/read-package-up/readme.md | 68 + node_modules/read-pkg/index.d.ts | 68 + node_modules/read-pkg/index.js | 43 + node_modules/read-pkg/license | 9 + .../node_modules/type-fest/index.d.ts | 223 + .../node_modules/type-fest/license-cc0 | 121 + .../node_modules/type-fest/license-mit | 9 + .../node_modules/type-fest/package.json | 75 + .../read-pkg/node_modules/type-fest/readme.md | 1081 + .../type-fest/source/absolute.d.ts | 52 + .../type-fest/source/all-extend.d.ts | 119 + .../type-fest/source/all-union-fields.d.ts | 91 + .../type-fest/source/and-all.d.ts | 76 + .../node_modules/type-fest/source/and.d.ts | 82 + .../type-fest/source/array-element.d.ts | 46 + .../type-fest/source/array-indices.d.ts | 25 + .../type-fest/source/array-length.d.ts | 36 + .../type-fest/source/array-reverse.d.ts | 84 + .../type-fest/source/array-slice.d.ts | 132 + .../type-fest/source/array-splice.d.ts | 104 + .../type-fest/source/array-tail.d.ts | 70 + .../type-fest/source/array-values.d.ts | 24 + .../type-fest/source/arrayable.d.ts | 31 + .../type-fest/source/async-return-type.d.ts | 28 + .../type-fest/source/asyncify.d.ts | 25 + .../node_modules/type-fest/source/basic.d.ts | 38 + .../type-fest/source/camel-case.d.ts | 125 + .../source/camel-cased-properties-deep.d.ts | 106 + .../source/camel-cased-properties.d.ts | 49 + .../type-fest/source/characters.d.ts | 67 + .../type-fest/source/conditional-except.d.ts | 47 + .../type-fest/source/conditional-keys.d.ts | 63 + .../source/conditional-pick-deep.d.ts | 122 + .../type-fest/source/conditional-pick.d.ts | 48 + .../source/conditional-simplify-deep.d.ts | 73 + .../source/conditional-simplify.d.ts | 50 + .../type-fest/source/delimiter-case.d.ts | 79 + .../delimiter-cased-properties-deep.d.ts | 115 + .../source/delimiter-cased-properties.d.ts | 52 + .../type-fest/source/distributed-omit.d.ts | 96 + .../type-fest/source/distributed-pick.d.ts | 92 + .../type-fest/source/empty-object.d.ts | 51 + .../type-fest/source/entries.d.ts | 64 + .../node_modules/type-fest/source/entry.d.ts | 67 + .../node_modules/type-fest/source/exact.d.ts | 73 + .../node_modules/type-fest/source/except.d.ts | 112 + .../type-fest/source/exclude-exactly.d.ts | 57 + .../source/exclude-rest-element.d.ts | 40 + .../type-fest/source/exclude-strict.d.ts | 51 + .../type-fest/source/exclusify-union.d.ts | 147 + .../type-fest/source/extends-strict.d.ts | 151 + .../source/extract-rest-element.d.ts | 30 + .../type-fest/source/extract-strict.d.ts | 51 + .../type-fest/source/find-global-type.d.ts | 68 + .../type-fest/source/fixed-length-array.d.ts | 97 + .../node_modules/type-fest/source/get.d.ts | 227 + .../type-fest/source/global-this.d.ts | 24 + .../type-fest/source/globals/index.d.ts | 3 + .../source/globals/observable-like.d.ts | 78 + .../source/greater-than-or-equal.d.ts | 63 + .../type-fest/source/greater-than.d.ts | 92 + .../type-fest/source/has-optional-keys.d.ts | 23 + .../type-fest/source/has-readonly-keys.d.ts | 23 + .../type-fest/source/has-required-keys.d.ts | 61 + .../type-fest/source/has-writable-keys.d.ts | 23 + .../node_modules/type-fest/source/if-any.d.ts | 28 + .../type-fest/source/if-empty-object.d.ts | 30 + .../type-fest/source/if-never.d.ts | 28 + .../type-fest/source/if-null.d.ts | 28 + .../type-fest/source/if-unknown.d.ts | 28 + .../node_modules/type-fest/source/if.d.ts | 102 + .../type-fest/source/includes.d.ts | 24 + .../type-fest/source/int-closed-range.d.ts | 45 + .../type-fest/source/int-range.d.ts | 67 + .../type-fest/source/internal/array.d.ts | 144 + .../type-fest/source/internal/characters.d.ts | 65 + .../source/internal/enforce-optional.d.ts | 49 + .../type-fest/source/internal/index.d.ts | 11 + .../type-fest/source/internal/keys.d.ts | 100 + .../type-fest/source/internal/numeric.d.ts | 141 + .../type-fest/source/internal/object.d.ts | 300 + .../type-fest/source/internal/string.d.ts | 202 + .../type-fest/source/internal/tuple.d.ts | 79 + .../type-fest/source/internal/type.d.ts | 165 + .../type-fest/source/invariant-of.d.ts | 85 + .../node_modules/type-fest/source/is-any.d.ts | 31 + .../type-fest/source/is-equal.d.ts | 41 + .../type-fest/source/is-float.d.ts | 43 + .../type-fest/source/is-integer.d.ts | 60 + .../type-fest/source/is-literal.d.ts | 315 + .../type-fest/source/is-lowercase.d.ts | 38 + .../type-fest/source/is-never.d.ts | 56 + .../type-fest/source/is-null.d.ts | 22 + .../type-fest/source/is-nullable.d.ts | 30 + .../type-fest/source/is-optional-key-of.d.ts | 51 + .../type-fest/source/is-optional.d.ts | 28 + .../type-fest/source/is-readonly-key-of.d.ts | 55 + .../type-fest/source/is-required-key-of.d.ts | 51 + .../type-fest/source/is-tuple.d.ts | 92 + .../type-fest/source/is-undefined.d.ts | 22 + .../type-fest/source/is-union.d.ts | 40 + .../type-fest/source/is-unknown.d.ts | 43 + .../type-fest/source/is-uppercase.d.ts | 38 + .../type-fest/source/is-writable-key-of.d.ts | 51 + .../type-fest/source/iterable-element.d.ts | 66 + .../node_modules/type-fest/source/join.d.ts | 79 + .../type-fest/source/json-value.d.ts | 33 + .../type-fest/source/jsonifiable.d.ts | 37 + .../type-fest/source/jsonify.d.ts | 127 + .../type-fest/source/kebab-case.d.ts | 47 + .../source/kebab-cased-properties-deep.d.ts | 72 + .../source/kebab-cased-properties.d.ts | 46 + .../type-fest/source/key-as-string.d.ts | 27 + .../type-fest/source/keys-of-union.d.ts | 44 + .../type-fest/source/last-array-element.d.ts | 36 + .../type-fest/source/less-than-or-equal.d.ts | 60 + .../type-fest/source/less-than.d.ts | 60 + .../source/literal-to-primitive-deep.d.ts | 71 + .../source/literal-to-primitive.d.ts | 38 + .../type-fest/source/literal-union.d.ts | 39 + .../type-fest/source/merge-deep.d.ts | 495 + .../type-fest/source/merge-exclusive.d.ts | 45 + .../node_modules/type-fest/source/merge.d.ts | 87 + .../source/multidimensional-array.d.ts | 38 + .../multidimensional-readonly-array.d.ts | 38 + .../type-fest/source/non-empty-object.d.ts | 38 + .../type-fest/source/non-empty-string.d.ts | 32 + .../type-fest/source/non-empty-tuple.d.ts | 24 + .../type-fest/source/non-nullable-deep.d.ts | 102 + .../type-fest/source/numeric.d.ts | 226 + .../type-fest/source/object-merge.d.ts | 194 + .../type-fest/source/omit-deep.d.ts | 153 + .../source/omit-index-signature.d.ts | 98 + .../node_modules/type-fest/source/opaque.d.ts | 3 + .../type-fest/source/optional-keys-of.d.ts | 46 + .../type-fest/source/optional.d.ts | 31 + .../node_modules/type-fest/source/or-all.d.ts | 73 + .../node_modules/type-fest/source/or.d.ts | 82 + .../type-fest/source/override-properties.d.ts | 43 + .../type-fest/source/package-json.d.ts | 710 + .../type-fest/source/partial-deep.d.ts | 157 + .../source/partial-on-undefined-deep.d.ts | 81 + .../type-fest/source/pascal-case.d.ts | 52 + .../source/pascal-cased-properties-deep.d.ts | 79 + .../source/pascal-cased-properties.d.ts | 46 + .../node_modules/type-fest/source/paths.d.ts | 241 + .../type-fest/source/pick-deep.d.ts | 139 + .../source/pick-index-signature.d.ts | 52 + .../type-fest/source/primitive.d.ts | 15 + .../type-fest/source/promisable.d.ts | 27 + .../type-fest/source/readonly-deep.d.ts | 118 + .../type-fest/source/readonly-keys-of.d.ts | 38 + .../type-fest/source/readonly-tuple.d.ts | 34 + .../type-fest/source/remove-prefix.d.ts | 115 + .../type-fest/source/remove-suffix.d.ts | 115 + .../type-fest/source/replace.d.ts | 87 + .../type-fest/source/require-all-or-none.d.ts | 54 + .../source/require-at-least-one.d.ts | 48 + .../type-fest/source/require-exactly-one.d.ts | 48 + .../type-fest/source/require-one-or-none.d.ts | 49 + .../type-fest/source/required-deep.d.ts | 78 + .../type-fest/source/required-keys-of.d.ts | 38 + .../node_modules/type-fest/source/schema.d.ts | 119 + .../source/screaming-snake-case.d.ts | 31 + .../type-fest/source/set-field-type.d.ts | 67 + .../source/set-non-nullable-deep.d.ts | 88 + .../type-fest/source/set-non-nullable.d.ts | 34 + .../type-fest/source/set-optional.d.ts | 42 + .../type-fest/source/set-parameter-type.d.ts | 125 + .../type-fest/source/set-readonly.d.ts | 40 + .../type-fest/source/set-required-deep.d.ts | 64 + .../type-fest/source/set-required.d.ts | 75 + .../type-fest/source/set-return-type.d.ts | 31 + .../source/shared-union-fields-deep.d.ts | 180 + .../type-fest/source/shared-union-fields.d.ts | 79 + .../type-fest/source/simplify-deep.d.ts | 117 + .../type-fest/source/simplify.d.ts | 61 + .../type-fest/source/single-key-object.d.ts | 28 + .../type-fest/source/snake-case.d.ts | 48 + .../source/snake-cased-properties-deep.d.ts | 72 + .../source/snake-cased-properties.d.ts | 46 + .../type-fest/source/some-extend.d.ts | 113 + .../source/split-on-rest-element.d.ts | 106 + .../node_modules/type-fest/source/split.d.ts | 90 + .../node_modules/type-fest/source/spread.d.ts | 78 + .../type-fest/source/string-repeat.d.ts | 49 + .../type-fest/source/string-slice.d.ts | 39 + .../type-fest/source/stringified.d.ts | 25 + .../source/structured-cloneable.d.ts | 89 + .../type-fest/source/subtract.d.ts | 87 + .../node_modules/type-fest/source/sum.d.ts | 82 + .../type-fest/source/tagged-union.d.ts | 53 + .../node_modules/type-fest/source/tagged.d.ts | 261 + .../node_modules/type-fest/source/trim.d.ts | 29 + .../type-fest/source/tsconfig-json.d.ts | 1356 + .../type-fest/source/tuple-of.d.ts | 112 + .../type-fest/source/tuple-to-object.d.ts | 47 + .../type-fest/source/tuple-to-union.d.ts | 54 + .../type-fest/source/typed-array.d.ts | 19 + .../source/undefined-on-partial-deep.d.ts | 83 + .../type-fest/source/union-length.d.ts | 27 + .../type-fest/source/union-member.d.ts | 65 + .../source/union-to-intersection.d.ts | 35 + .../type-fest/source/union-to-tuple.d.ts | 49 + .../type-fest/source/unknown-array.d.ts | 27 + .../type-fest/source/unknown-map.d.ts | 26 + .../type-fest/source/unknown-record.d.ts | 33 + .../type-fest/source/unknown-set.d.ts | 26 + .../type-fest/source/unwrap-partial.d.ts | 33 + .../type-fest/source/unwrap-required.d.ts | 37 + .../type-fest/source/value-of.d.ts | 24 + .../node_modules/type-fest/source/words.d.ts | 148 + .../type-fest/source/writable-deep.d.ts | 84 + .../type-fest/source/writable-keys-of.d.ts | 34 + .../type-fest/source/writable.d.ts | 68 + .../node_modules/type-fest/source/xor.d.ts | 83 + node_modules/read-pkg/package.json | 50 + node_modules/read-pkg/readme.md | 81 + node_modules/reflect-metadata/AUTHORS.md | 5 + .../reflect-metadata/CopyrightNotice.txt | 15 + node_modules/reflect-metadata/LICENSE | 55 + node_modules/reflect-metadata/README.md | 232 + node_modules/reflect-metadata/Reflect.js | 1415 + node_modules/reflect-metadata/ReflectLite.js | 1137 + .../reflect-metadata/ReflectNoConflict.js | 1111 + node_modules/reflect-metadata/index.d.ts | 491 + .../reflect-metadata/no-conflict.d.ts | 484 + node_modules/reflect-metadata/package.json | 68 + node_modules/reflect-metadata/standalone.d.ts | 485 + node_modules/regexp-match-indices/LICENSE | 201 + node_modules/regexp-match-indices/README.md | 51 + node_modules/regexp-match-indices/auto.d.ts | 16 + node_modules/regexp-match-indices/auto.js | 24 + node_modules/regexp-match-indices/auto.js.map | 1 + node_modules/regexp-match-indices/config.d.ts | 28 + node_modules/regexp-match-indices/config.js | 21 + .../regexp-match-indices/config.js.map | 1 + .../regexp-match-indices/external.d.ts | 296 + .../regexp-match-indices/implementation.d.ts | 18 + .../regexp-match-indices/implementation.js | 276 + .../implementation.js.map | 1 + node_modules/regexp-match-indices/index.d.ts | 31 + node_modules/regexp-match-indices/index.js | 34 + .../regexp-match-indices/index.js.map | 1 + node_modules/regexp-match-indices/native.d.ts | 17 + node_modules/regexp-match-indices/native.js | 19 + .../regexp-match-indices/native.js.map | 1 + .../regexp-match-indices/package.json | 54 + .../regexp-match-indices/polyfill.d.ts | 18 + node_modules/regexp-match-indices/polyfill.js | 35 + .../regexp-match-indices/polyfill.js.map | 1 + node_modules/regexp-match-indices/shim.d.ts | 17 + node_modules/regexp-match-indices/shim.js | 29 + node_modules/regexp-match-indices/shim.js.map | 1 + .../regexp-match-indices/shim/types.d.ts | 26 + .../regexp-match-indices/shim/types.js | 18 + .../regexp-match-indices/shim/types.js.map | 1 + .../regexp-match-indices/tsconfig.build.json | 20 + node_modules/regexp-match-indices/types.d.ts | 26 + node_modules/regexp-match-indices/types.js | 18 + .../regexp-match-indices/types.js.map | 1 + node_modules/regexp-tree/LICENSE | 21 + node_modules/regexp-tree/README.md | 2124 + node_modules/regexp-tree/bin/regexp-tree | 5 + .../regexp-tree/dist/bin/regexp-tree.js | 16 + .../dist/compat-transpiler/index.js | 50 + .../dist/compat-transpiler/runtime/index.js | 123 + .../transforms/compat-dotall-s-transform.js | 69 + ...compat-named-capturing-groups-transform.js | 59 + .../transforms/compat-x-flag-transform.js | 23 + .../compat-transpiler/transforms/index.js | 17 + .../regexp-tree/dist/generator/index.js | 177 + .../finite-automaton/dfa/dfa-minimizer.js | 412 + .../interpreter/finite-automaton/dfa/dfa.js | 380 + .../interpreter/finite-automaton/index.js | 59 + .../finite-automaton/nfa/builders.js | 227 + .../finite-automaton/nfa/nfa-from-regexp.js | 94 + .../finite-automaton/nfa/nfa-state.js | 220 + .../interpreter/finite-automaton/nfa/nfa.js | 234 + .../finite-automaton/special-symbols.js | 22 + .../interpreter/finite-automaton/state.js | 81 + .../regexp-tree/dist/optimizer/index.js | 91 + ...ar-case-insensitive-lowercase-transform.js | 110 + .../char-class-classranges-merge-transform.js | 341 + ...ar-class-classranges-to-chars-transform.js | 30 + .../char-class-remove-duplicates-transform.js | 33 + .../char-class-to-meta-transform.js | 197 + .../char-class-to-single-char-transform.js | 98 + .../char-code-to-simple-char-transform.js | 84 + .../char-escape-unescape-transform.js | 150 + ...rogate-pair-to-single-unicode-transform.js | 27 + .../combine-repeating-patterns-transform.js | 194 + ...disjunction-remove-duplicates-transform.js | 44 + .../group-single-chars-to-char-class.js | 96 + .../dist/optimizer/transforms/index.js | 55 + .../quantifier-range-to-symbol-transform.js | 74 + .../transforms/quantifiers-merge-transform.js | 113 + .../remove-empty-group-transform.js | 34 + .../optimizer/transforms/ungroup-transform.js | 86 + .../dist/parser/generated/regexp-tree.js | 1405 + node_modules/regexp-tree/dist/parser/index.js | 28 + .../unicode/parser-unicode-properties.js | 379 + node_modules/regexp-tree/dist/regexp-tree.js | 181 + .../regexp-tree/dist/transform/index.js | 138 + .../regexp-tree/dist/transform/utils.js | 88 + .../regexp-tree/dist/traverse/index.js | 313 + .../regexp-tree/dist/traverse/node-path.js | 426 + node_modules/regexp-tree/dist/utils/clone.js | 29 + node_modules/regexp-tree/index.d.ts | 303 + node_modules/regexp-tree/index.js | 8 + node_modules/regexp-tree/package.json | 38 + node_modules/repeat-string/LICENSE | 21 + node_modules/repeat-string/README.md | 136 + node_modules/repeat-string/index.js | 70 + node_modules/repeat-string/package.json | 77 + node_modules/seed-random/.npmignore | 2 + node_modules/seed-random/.travis.yml | 3 + node_modules/seed-random/History.md | 0 node_modules/seed-random/LICENSE | 50 + node_modules/seed-random/Readme.md | 44 + node_modules/seed-random/component.json | 13 + node_modules/seed-random/index.js | 173 + node_modules/seed-random/package.json | 15 + node_modules/seed-random/test/index.js | 27 + node_modules/semver/LICENSE | 15 + node_modules/semver/README.md | 665 + node_modules/semver/bin/semver.js | 191 + node_modules/semver/classes/comparator.js | 143 + node_modules/semver/classes/index.js | 7 + node_modules/semver/classes/range.js | 557 + node_modules/semver/classes/semver.js | 333 + node_modules/semver/functions/clean.js | 8 + node_modules/semver/functions/cmp.js | 54 + node_modules/semver/functions/coerce.js | 62 + .../semver/functions/compare-build.js | 9 + .../semver/functions/compare-loose.js | 5 + node_modules/semver/functions/compare.js | 7 + node_modules/semver/functions/diff.js | 60 + node_modules/semver/functions/eq.js | 5 + node_modules/semver/functions/gt.js | 5 + node_modules/semver/functions/gte.js | 5 + node_modules/semver/functions/inc.js | 21 + node_modules/semver/functions/lt.js | 5 + node_modules/semver/functions/lte.js | 5 + node_modules/semver/functions/major.js | 5 + node_modules/semver/functions/minor.js | 5 + node_modules/semver/functions/neq.js | 5 + node_modules/semver/functions/parse.js | 18 + node_modules/semver/functions/patch.js | 5 + node_modules/semver/functions/prerelease.js | 8 + node_modules/semver/functions/rcompare.js | 5 + node_modules/semver/functions/rsort.js | 5 + node_modules/semver/functions/satisfies.js | 12 + node_modules/semver/functions/sort.js | 5 + node_modules/semver/functions/valid.js | 8 + node_modules/semver/index.js | 91 + node_modules/semver/internal/constants.js | 37 + node_modules/semver/internal/debug.js | 11 + node_modules/semver/internal/identifiers.js | 29 + node_modules/semver/internal/lrucache.js | 42 + node_modules/semver/internal/parse-options.js | 17 + node_modules/semver/internal/re.js | 223 + node_modules/semver/package.json | 78 + node_modules/semver/preload.js | 4 + node_modules/semver/range.bnf | 16 + node_modules/semver/ranges/gtr.js | 6 + node_modules/semver/ranges/intersects.js | 9 + node_modules/semver/ranges/ltr.js | 6 + node_modules/semver/ranges/max-satisfying.js | 27 + node_modules/semver/ranges/min-satisfying.js | 26 + node_modules/semver/ranges/min-version.js | 63 + node_modules/semver/ranges/outside.js | 82 + node_modules/semver/ranges/simplify.js | 49 + node_modules/semver/ranges/subset.js | 249 + node_modules/semver/ranges/to-comparators.js | 10 + node_modules/semver/ranges/valid.js | 13 + node_modules/source-map-support/LICENSE.md | 21 + node_modules/source-map-support/README.md | 284 + .../browser-source-map-support.js | 114 + node_modules/source-map-support/package.json | 31 + .../register-hook-require.js | 1 + node_modules/source-map-support/register.js | 1 + .../source-map-support/source-map-support.js | 625 + node_modules/source-map/CHANGELOG.md | 301 + node_modules/source-map/LICENSE | 28 + node_modules/source-map/README.md | 742 + .../source-map/dist/source-map.debug.js | 3234 + node_modules/source-map/dist/source-map.js | 3233 + .../source-map/dist/source-map.min.js | 2 + .../source-map/dist/source-map.min.js.map | 1 + node_modules/source-map/lib/array-set.js | 121 + node_modules/source-map/lib/base64-vlq.js | 140 + node_modules/source-map/lib/base64.js | 67 + node_modules/source-map/lib/binary-search.js | 111 + node_modules/source-map/lib/mapping-list.js | 79 + node_modules/source-map/lib/quick-sort.js | 114 + .../source-map/lib/source-map-consumer.js | 1145 + .../source-map/lib/source-map-generator.js | 425 + node_modules/source-map/lib/source-node.js | 413 + node_modules/source-map/lib/util.js | 488 + node_modules/source-map/package.json | 73 + node_modules/source-map/source-map.d.ts | 98 + node_modules/source-map/source-map.js | 8 + node_modules/spdx-correct/LICENSE | 202 + node_modules/spdx-correct/README.md | 22 + node_modules/spdx-correct/index.js | 386 + node_modules/spdx-correct/package.json | 32 + node_modules/spdx-exceptions/README.md | 36 + node_modules/spdx-exceptions/deprecated.json | 3 + node_modules/spdx-exceptions/index.json | 68 + node_modules/spdx-exceptions/package.json | 19 + node_modules/spdx-expression-parse/AUTHORS | 4 + node_modules/spdx-expression-parse/LICENSE | 22 + node_modules/spdx-expression-parse/README.md | 91 + node_modules/spdx-expression-parse/index.js | 8 + .../spdx-expression-parse/package.json | 39 + node_modules/spdx-expression-parse/parse.js | 138 + node_modules/spdx-expression-parse/scan.js | 131 + node_modules/spdx-license-ids/README.md | 51 + node_modules/spdx-license-ids/deprecated.json | 28 + node_modules/spdx-license-ids/index.json | 697 + node_modules/spdx-license-ids/package.json | 29 + node_modules/stackframe/LICENSE | 19 + node_modules/stackframe/README.md | 79 + node_modules/stackframe/dist/stackframe.js | 143 + .../stackframe/dist/stackframe.min.js | 2 + .../stackframe/dist/stackframe.min.js.map | 1 + node_modules/stackframe/package.json | 59 + node_modules/stackframe/stackframe.d.ts | 74 + node_modules/stackframe/stackframe.js | 143 + node_modules/string-argv/CHANGELOG.md | 9 + node_modules/string-argv/LICENSE | 21 + node_modules/string-argv/README.md | 58 + node_modules/string-argv/index.d.ts | 2 + node_modules/string-argv/index.js | 44 + node_modules/string-argv/package.json | 43 + node_modules/string-width/index.d.ts | 29 + node_modules/string-width/index.js | 47 + node_modules/string-width/license | 9 + node_modules/string-width/package.json | 56 + node_modules/string-width/readme.md | 50 + node_modules/strip-ansi/index.d.ts | 17 + node_modules/strip-ansi/index.js | 4 + node_modules/strip-ansi/license | 9 + .../node_modules/ansi-regex/index.d.ts | 37 + .../node_modules/ansi-regex/index.js | 10 + .../node_modules/ansi-regex/license | 9 + .../node_modules/ansi-regex/package.json | 55 + .../node_modules/ansi-regex/readme.md | 78 + node_modules/strip-ansi/package.json | 54 + node_modules/strip-ansi/readme.md | 46 + node_modules/supports-color/browser.js | 24 + node_modules/supports-color/index.js | 152 + node_modules/supports-color/license | 9 + node_modules/supports-color/package.json | 58 + node_modules/supports-color/readme.md | 77 + node_modules/tagged-tag/index.d.ts | 3 + node_modules/tagged-tag/license | 9 + node_modules/tagged-tag/package.json | 36 + node_modules/tagged-tag/readme.md | 5 + node_modules/thenify-all/History.md | 11 + node_modules/thenify-all/LICENSE | 22 + node_modules/thenify-all/README.md | 66 + node_modules/thenify-all/index.js | 73 + node_modules/thenify-all/package.json | 34 + node_modules/thenify/History.md | 11 + node_modules/thenify/LICENSE | 22 + node_modules/thenify/README.md | 120 + node_modules/thenify/index.js | 77 + node_modules/thenify/package.json | 31 + node_modules/tiny-case/README.md | 26 + node_modules/tiny-case/index.d.ts | 15 + node_modules/tiny-case/index.js | 39 + node_modules/tiny-case/package.json | 13 + node_modules/tiny-case/test.js | 82 + node_modules/tiny-case/tsconfig.json | 1 + node_modules/toposort/.npmignore | 1 + node_modules/toposort/.travis.yml | 5 + node_modules/toposort/License | 21 + node_modules/toposort/Makefile | 11 + node_modules/toposort/README.md | 98 + node_modules/toposort/component.json | 24 + node_modules/toposort/graph.svg | 1 + node_modules/toposort/index.js | 98 + node_modules/toposort/package.json | 29 + node_modules/toposort/test.js | 171 + node_modules/ts-dedent/LICENSE | 21 + node_modules/ts-dedent/README.md | 154 + node_modules/ts-dedent/dist/index.d.ts | 2 + node_modules/ts-dedent/dist/index.js | 41 + node_modules/ts-dedent/dist/index.js.map | 1 + node_modules/ts-dedent/dist/package.json | 3 + node_modules/ts-dedent/esm/index.d.ts | 2 + node_modules/ts-dedent/esm/index.js | 38 + node_modules/ts-dedent/esm/index.js.map | 1 + node_modules/ts-dedent/esm/package.json | 3 + node_modules/ts-dedent/package.json | 85 + .../ts-dedent/src/__tests__/index.spec.ts | 596 + node_modules/ts-dedent/src/index.ts | 58 + node_modules/tslib/CopyrightNotice.txt | 15 + node_modules/tslib/LICENSE.txt | 12 + node_modules/tslib/README.md | 164 + node_modules/tslib/SECURITY.md | 41 + node_modules/tslib/modules/index.d.ts | 38 + node_modules/tslib/modules/index.js | 70 + node_modules/tslib/modules/package.json | 3 + node_modules/tslib/package.json | 47 + node_modules/tslib/tslib.d.ts | 460 + node_modules/tslib/tslib.es6.html | 1 + node_modules/tslib/tslib.es6.js | 402 + node_modules/tslib/tslib.es6.mjs | 401 + node_modules/tslib/tslib.html | 1 + node_modules/tslib/tslib.js | 484 + node_modules/type-fest/index.d.ts | 178 + node_modules/type-fest/license-cc0 | 121 + node_modules/type-fest/license-mit | 9 + node_modules/type-fest/package.json | 91 + node_modules/type-fest/readme.md | 1060 + .../type-fest/source/all-union-fields.d.ts | 88 + node_modules/type-fest/source/and.d.ts | 25 + .../type-fest/source/array-indices.d.ts | 23 + .../type-fest/source/array-slice.d.ts | 109 + .../type-fest/source/array-splice.d.ts | 99 + node_modules/type-fest/source/array-tail.d.ts | 76 + .../type-fest/source/array-values.d.ts | 22 + node_modules/type-fest/source/arrayable.d.ts | 29 + .../type-fest/source/async-return-type.d.ts | 23 + node_modules/type-fest/source/asyncify.d.ts | 32 + node_modules/type-fest/source/basic.d.ts | 68 + node_modules/type-fest/source/camel-case.d.ts | 89 + .../source/camel-cased-properties-deep.d.ts | 97 + .../source/camel-cased-properties.d.ts | 43 + .../type-fest/source/conditional-except.d.ts | 45 + .../type-fest/source/conditional-keys.d.ts | 47 + .../source/conditional-pick-deep.d.ts | 118 + .../type-fest/source/conditional-pick.d.ts | 44 + .../source/conditional-simplify.d.ts | 32 + .../type-fest/source/delimiter-case.d.ts | 78 + .../delimiter-cased-properties-deep.d.ts | 106 + .../source/delimiter-cased-properties.d.ts | 46 + .../type-fest/source/distributed-omit.d.ts | 89 + .../type-fest/source/distributed-pick.d.ts | 85 + .../type-fest/source/empty-object.d.ts | 46 + .../type-fest/source/enforce-optional.d.ts | 47 + node_modules/type-fest/source/entries.d.ts | 62 + node_modules/type-fest/source/entry.d.ts | 65 + node_modules/type-fest/source/exact.d.ts | 68 + node_modules/type-fest/source/except.d.ts | 108 + .../type-fest/source/find-global-type.d.ts | 64 + .../type-fest/source/fixed-length-array.d.ts | 43 + node_modules/type-fest/source/get.d.ts | 219 + .../type-fest/source/global-this.d.ts | 21 + .../source/greater-than-or-equal.d.ts | 22 + .../type-fest/source/greater-than.d.ts | 56 + .../type-fest/source/has-optional-keys.d.ts | 21 + .../type-fest/source/has-readonly-keys.d.ts | 21 + .../type-fest/source/has-required-keys.d.ts | 59 + .../type-fest/source/has-writable-keys.d.ts | 21 + node_modules/type-fest/source/if-any.d.ts | 24 + .../type-fest/source/if-empty-object.d.ts | 26 + node_modules/type-fest/source/if-never.d.ts | 24 + node_modules/type-fest/source/if-null.d.ts | 24 + node_modules/type-fest/source/if-unknown.d.ts | 24 + node_modules/type-fest/source/includes.d.ts | 22 + .../type-fest/source/int-closed-range.d.ts | 35 + node_modules/type-fest/source/int-range.d.ts | 55 + .../type-fest/source/internal/array.d.ts | 126 + .../type-fest/source/internal/characters.d.ts | 67 + .../type-fest/source/internal/index.d.ts | 8 + .../type-fest/source/internal/keys.d.ts | 97 + .../type-fest/source/internal/numeric.d.ts | 118 + .../type-fest/source/internal/object.d.ts | 236 + .../type-fest/source/internal/string.d.ts | 210 + .../type-fest/source/internal/tuple.d.ts | 90 + .../type-fest/source/internal/type.d.ts | 139 + .../type-fest/source/invariant-of.d.ts | 76 + node_modules/type-fest/source/is-any.d.ts | 33 + node_modules/type-fest/source/is-equal.d.ts | 31 + node_modules/type-fest/source/is-float.d.ts | 41 + node_modules/type-fest/source/is-integer.d.ts | 58 + node_modules/type-fest/source/is-literal.d.ts | 296 + node_modules/type-fest/source/is-never.d.ts | 42 + node_modules/type-fest/source/is-null.d.ts | 20 + node_modules/type-fest/source/is-tuple.d.ts | 89 + node_modules/type-fest/source/is-unknown.d.ts | 52 + .../type-fest/source/iterable-element.d.ts | 64 + node_modules/type-fest/source/join.d.ts | 68 + .../type-fest/source/jsonifiable.d.ts | 37 + node_modules/type-fest/source/jsonify.d.ts | 122 + node_modules/type-fest/source/kebab-case.d.ts | 44 + .../source/kebab-cased-properties-deep.d.ts | 63 + .../source/kebab-cased-properties.d.ts | 40 + .../type-fest/source/keys-of-union.d.ts | 42 + .../type-fest/source/last-array-element.d.ts | 38 + .../type-fest/source/less-than-or-equal.d.ts | 22 + node_modules/type-fest/source/less-than.d.ts | 26 + .../source/literal-to-primitive-deep.d.ts | 36 + .../source/literal-to-primitive.d.ts | 36 + .../type-fest/source/literal-union.d.ts | 37 + node_modules/type-fest/source/merge-deep.d.ts | 486 + .../type-fest/source/merge-exclusive.d.ts | 41 + node_modules/type-fest/source/merge.d.ts | 48 + .../source/multidimensional-array.d.ts | 44 + .../multidimensional-readonly-array.d.ts | 48 + .../type-fest/source/non-empty-object.d.ts | 35 + .../type-fest/source/non-empty-string.d.ts | 28 + .../type-fest/source/non-empty-tuple.d.ts | 21 + node_modules/type-fest/source/numeric.d.ts | 222 + .../type-fest/source/observable-like.d.ts | 63 + node_modules/type-fest/source/omit-deep.d.ts | 167 + .../source/omit-index-signature.d.ts | 95 + node_modules/type-fest/source/opaque.d.ts | 1 + .../type-fest/source/optional-keys-of.d.ts | 39 + node_modules/type-fest/source/or.d.ts | 25 + .../type-fest/source/override-properties.d.ts | 36 + .../type-fest/source/package-json.d.ts | 676 + .../type-fest/source/partial-deep.d.ts | 151 + .../source/partial-on-undefined-deep.d.ts | 78 + .../type-fest/source/pascal-case.d.ts | 42 + .../source/pascal-cased-properties-deep.d.ts | 62 + .../source/pascal-cased-properties.d.ts | 36 + node_modules/type-fest/source/paths.d.ts | 262 + node_modules/type-fest/source/pick-deep.d.ts | 149 + .../source/pick-index-signature.d.ts | 50 + node_modules/type-fest/source/primitive.d.ts | 13 + node_modules/type-fest/source/promisable.d.ts | 25 + .../type-fest/source/readonly-deep.d.ts | 81 + .../type-fest/source/readonly-keys-of.d.ts | 30 + .../type-fest/source/readonly-tuple.d.ts | 41 + node_modules/type-fest/source/replace.d.ts | 85 + .../type-fest/source/require-all-or-none.d.ts | 51 + .../source/require-at-least-one.d.ts | 47 + .../type-fest/source/require-exactly-one.d.ts | 45 + .../type-fest/source/require-one-or-none.d.ts | 46 + .../type-fest/source/required-deep.d.ts | 78 + .../type-fest/source/required-keys-of.d.ts | 30 + node_modules/type-fest/source/schema.d.ts | 114 + .../source/screaming-snake-case.d.ts | 28 + .../type-fest/source/set-field-type.d.ts | 65 + .../source/set-non-nullable-deep.d.ts | 83 + .../type-fest/source/set-non-nullable.d.ts | 39 + .../type-fest/source/set-optional.d.ts | 38 + .../type-fest/source/set-parameter-type.d.ts | 117 + .../type-fest/source/set-readonly.d.ts | 39 + .../type-fest/source/set-required-deep.d.ts | 68 + .../type-fest/source/set-required.d.ts | 70 + .../type-fest/source/set-return-type.d.ts | 29 + .../source/shared-union-fields-deep.d.ts | 178 + .../type-fest/source/shared-union-fields.d.ts | 76 + .../type-fest/source/simplify-deep.d.ts | 115 + node_modules/type-fest/source/simplify.d.ts | 58 + .../type-fest/source/single-key-object.d.ts | 29 + node_modules/type-fest/source/snake-case.d.ts | 45 + .../source/snake-cased-properties-deep.d.ts | 63 + .../source/snake-cased-properties.d.ts | 40 + node_modules/type-fest/source/split.d.ts | 88 + node_modules/type-fest/source/spread.d.ts | 84 + .../type-fest/source/string-key-of.d.ts | 25 + .../type-fest/source/string-repeat.d.ts | 47 + .../type-fest/source/string-slice.d.ts | 37 + .../type-fest/source/stringified.d.ts | 23 + .../source/structured-cloneable.d.ts | 92 + node_modules/type-fest/source/subtract.d.ts | 83 + node_modules/type-fest/source/sum.d.ts | 78 + .../type-fest/source/tagged-union.d.ts | 51 + node_modules/type-fest/source/tagged.d.ts | 256 + node_modules/type-fest/source/trim.d.ts | 27 + .../type-fest/source/tsconfig-json.d.ts | 1294 + .../type-fest/source/tuple-to-object.d.ts | 42 + .../type-fest/source/tuple-to-union.d.ts | 51 + .../type-fest/source/typed-array.d.ts | 17 + .../source/undefined-on-partial-deep.d.ts | 80 + .../source/union-to-intersection.d.ts | 61 + .../type-fest/source/union-to-tuple.d.ts | 56 + .../type-fest/source/unknown-array.d.ts | 25 + .../type-fest/source/unknown-map.d.ts | 24 + .../type-fest/source/unknown-record.d.ts | 31 + .../type-fest/source/unknown-set.d.ts | 24 + node_modules/type-fest/source/value-of.d.ts | 42 + node_modules/type-fest/source/words.d.ts | 118 + .../type-fest/source/writable-deep.d.ts | 83 + .../type-fest/source/writable-keys-of.d.ts | 33 + node_modules/type-fest/source/writable.d.ts | 68 + node_modules/unicorn-magic/default.d.ts | 13 + node_modules/unicorn-magic/default.js | 14 + node_modules/unicorn-magic/license | 9 + node_modules/unicorn-magic/node.d.ts | 125 + node_modules/unicorn-magic/node.js | 49 + node_modules/unicorn-magic/package.json | 68 + node_modules/unicorn-magic/readme.md | 31 + node_modules/upper-case-first/LICENSE | 21 + node_modules/upper-case-first/README.md | 32 + .../upper-case-first/dist.es2015/index.d.ts | 4 + .../upper-case-first/dist.es2015/index.js | 7 + .../upper-case-first/dist.es2015/index.js.map | 1 + .../dist.es2015/index.spec.d.ts | 1 + .../dist.es2015/index.spec.js | 18 + .../dist.es2015/index.spec.js.map | 1 + node_modules/upper-case-first/dist/index.d.ts | 4 + node_modules/upper-case-first/dist/index.js | 11 + .../upper-case-first/dist/index.js.map | 1 + .../upper-case-first/dist/index.spec.d.ts | 1 + .../upper-case-first/dist/index.spec.js | 20 + .../upper-case-first/dist/index.spec.js.map | 1 + node_modules/upper-case-first/package.json | 87 + node_modules/util-arity/LICENSE | 21 + node_modules/util-arity/README.md | 52 + node_modules/util-arity/arity.d.ts | 3 + node_modules/util-arity/arity.js | 29 + node_modules/util-arity/package.json | 39 + .../validate-npm-package-license/LICENSE | 202 + .../validate-npm-package-license/README.md | 113 + .../validate-npm-package-license/index.js | 86 + .../validate-npm-package-license/package.json | 28 + node_modules/xmlbuilder/.nycrc | 6 + node_modules/xmlbuilder/.vscode/launch.json | 23 + node_modules/xmlbuilder/CHANGELOG.md | 593 + node_modules/xmlbuilder/LICENSE | 21 + node_modules/xmlbuilder/README.md | 103 + node_modules/xmlbuilder/lib/Derivation.js | 10 + .../xmlbuilder/lib/DocumentPosition.js | 12 + node_modules/xmlbuilder/lib/NodeType.js | 25 + node_modules/xmlbuilder/lib/OperationType.js | 11 + node_modules/xmlbuilder/lib/Utility.js | 88 + node_modules/xmlbuilder/lib/WriterState.js | 10 + node_modules/xmlbuilder/lib/XMLAttribute.js | 130 + node_modules/xmlbuilder/lib/XMLCData.js | 41 + .../xmlbuilder/lib/XMLCharacterData.js | 86 + node_modules/xmlbuilder/lib/XMLComment.js | 41 + .../xmlbuilder/lib/XMLDOMConfiguration.js | 80 + .../xmlbuilder/lib/XMLDOMErrorHandler.js | 20 + .../xmlbuilder/lib/XMLDOMImplementation.js | 55 + .../xmlbuilder/lib/XMLDOMStringList.js | 44 + node_modules/xmlbuilder/lib/XMLDTDAttList.js | 66 + node_modules/xmlbuilder/lib/XMLDTDElement.js | 44 + node_modules/xmlbuilder/lib/XMLDTDEntity.js | 115 + node_modules/xmlbuilder/lib/XMLDTDNotation.js | 66 + node_modules/xmlbuilder/lib/XMLDeclaration.js | 51 + node_modules/xmlbuilder/lib/XMLDocType.js | 235 + node_modules/xmlbuilder/lib/XMLDocument.js | 282 + node_modules/xmlbuilder/lib/XMLDocumentCB.js | 650 + .../xmlbuilder/lib/XMLDocumentFragment.js | 21 + node_modules/xmlbuilder/lib/XMLDummy.js | 39 + node_modules/xmlbuilder/lib/XMLElement.js | 334 + .../xmlbuilder/lib/XMLNamedNodeMap.js | 77 + node_modules/xmlbuilder/lib/XMLNode.js | 999 + node_modules/xmlbuilder/lib/XMLNodeFilter.js | 51 + node_modules/xmlbuilder/lib/XMLNodeList.js | 45 + .../lib/XMLProcessingInstruction.js | 56 + node_modules/xmlbuilder/lib/XMLRaw.js | 40 + .../xmlbuilder/lib/XMLStreamWriter.js | 209 + .../xmlbuilder/lib/XMLStringWriter.js | 40 + node_modules/xmlbuilder/lib/XMLStringifier.js | 291 + node_modules/xmlbuilder/lib/XMLText.js | 82 + node_modules/xmlbuilder/lib/XMLTypeInfo.js | 23 + .../xmlbuilder/lib/XMLUserDataHandler.js | 27 + node_modules/xmlbuilder/lib/XMLWriterBase.js | 485 + node_modules/xmlbuilder/lib/index.js | 120 + node_modules/xmlbuilder/package.json | 51 + .../xmlbuilder/perf/basic/escaping.coffee | 244 + .../xmlbuilder/perf/basic/object.coffee | 21 + node_modules/xmlbuilder/perf/index.coffee | 161 + node_modules/xmlbuilder/perf/perf.list | 11 + node_modules/xmlbuilder/typings/index.d.ts | 1771 + node_modules/yaml/LICENSE | 13 + node_modules/yaml/README.md | 172 + node_modules/yaml/bin.mjs | 11 + .../dist/compose/compose-collection.js | 88 + .../yaml/browser/dist/compose/compose-doc.js | 43 + .../yaml/browser/dist/compose/compose-node.js | 109 + .../browser/dist/compose/compose-scalar.js | 86 + .../yaml/browser/dist/compose/composer.js | 219 + .../browser/dist/compose/resolve-block-map.js | 115 + .../dist/compose/resolve-block-scalar.js | 198 + .../browser/dist/compose/resolve-block-seq.js | 49 + .../yaml/browser/dist/compose/resolve-end.js | 37 + .../dist/compose/resolve-flow-collection.js | 207 + .../dist/compose/resolve-flow-scalar.js | 225 + .../browser/dist/compose/resolve-props.js | 146 + .../dist/compose/util-contains-newline.js | 34 + .../compose/util-empty-scalar-position.js | 26 + .../dist/compose/util-flow-indent-check.js | 15 + .../browser/dist/compose/util-map-includes.js | 13 + .../yaml/browser/dist/doc/Document.js | 335 + node_modules/yaml/browser/dist/doc/anchors.js | 71 + .../yaml/browser/dist/doc/applyReviver.js | 55 + .../yaml/browser/dist/doc/createNode.js | 88 + .../yaml/browser/dist/doc/directives.js | 176 + node_modules/yaml/browser/dist/errors.js | 57 + node_modules/yaml/browser/dist/index.js | 17 + node_modules/yaml/browser/dist/log.js | 11 + node_modules/yaml/browser/dist/nodes/Alias.js | 116 + .../yaml/browser/dist/nodes/Collection.js | 147 + node_modules/yaml/browser/dist/nodes/Node.js | 38 + node_modules/yaml/browser/dist/nodes/Pair.js | 36 + .../yaml/browser/dist/nodes/Scalar.js | 24 + .../yaml/browser/dist/nodes/YAMLMap.js | 144 + .../yaml/browser/dist/nodes/YAMLSeq.js | 113 + .../yaml/browser/dist/nodes/addPairToJSMap.js | 63 + .../yaml/browser/dist/nodes/identity.js | 36 + node_modules/yaml/browser/dist/nodes/toJS.js | 37 + .../yaml/browser/dist/parse/cst-scalar.js | 214 + .../yaml/browser/dist/parse/cst-stringify.js | 61 + .../yaml/browser/dist/parse/cst-visit.js | 97 + node_modules/yaml/browser/dist/parse/cst.js | 98 + node_modules/yaml/browser/dist/parse/lexer.js | 721 + .../yaml/browser/dist/parse/line-counter.js | 39 + .../yaml/browser/dist/parse/parser.js | 975 + node_modules/yaml/browser/dist/public-api.js | 102 + .../yaml/browser/dist/schema/Schema.js | 37 + .../yaml/browser/dist/schema/common/map.js | 17 + .../yaml/browser/dist/schema/common/null.js | 15 + .../yaml/browser/dist/schema/common/seq.js | 17 + .../yaml/browser/dist/schema/common/string.js | 14 + .../yaml/browser/dist/schema/core/bool.js | 19 + .../yaml/browser/dist/schema/core/float.js | 43 + .../yaml/browser/dist/schema/core/int.js | 38 + .../yaml/browser/dist/schema/core/schema.js | 23 + .../yaml/browser/dist/schema/json/schema.js | 62 + node_modules/yaml/browser/dist/schema/tags.js | 96 + .../browser/dist/schema/yaml-1.1/binary.js | 58 + .../yaml/browser/dist/schema/yaml-1.1/bool.js | 26 + .../browser/dist/schema/yaml-1.1/float.js | 46 + .../yaml/browser/dist/schema/yaml-1.1/int.js | 71 + .../browser/dist/schema/yaml-1.1/merge.js | 67 + .../yaml/browser/dist/schema/yaml-1.1/omap.js | 74 + .../browser/dist/schema/yaml-1.1/pairs.js | 78 + .../browser/dist/schema/yaml-1.1/schema.js | 39 + .../yaml/browser/dist/schema/yaml-1.1/set.js | 93 + .../browser/dist/schema/yaml-1.1/timestamp.js | 101 + .../browser/dist/stringify/foldFlowLines.js | 146 + .../yaml/browser/dist/stringify/stringify.js | 129 + .../dist/stringify/stringifyCollection.js | 153 + .../dist/stringify/stringifyComment.js | 20 + .../dist/stringify/stringifyDocument.js | 85 + .../browser/dist/stringify/stringifyNumber.js | 25 + .../browser/dist/stringify/stringifyPair.js | 150 + .../browser/dist/stringify/stringifyString.js | 336 + node_modules/yaml/browser/dist/util.js | 11 + node_modules/yaml/browser/dist/visit.js | 233 + node_modules/yaml/browser/index.js | 5 + node_modules/yaml/browser/package.json | 3 + node_modules/yaml/dist/cli.d.ts | 8 + node_modules/yaml/dist/cli.mjs | 201 + .../yaml/dist/compose/compose-collection.d.ts | 11 + .../yaml/dist/compose/compose-collection.js | 90 + .../yaml/dist/compose/compose-doc.d.ts | 7 + node_modules/yaml/dist/compose/compose-doc.js | 45 + .../yaml/dist/compose/compose-node.d.ts | 29 + .../yaml/dist/compose/compose-node.js | 112 + .../yaml/dist/compose/compose-scalar.d.ts | 5 + .../yaml/dist/compose/compose-scalar.js | 88 + node_modules/yaml/dist/compose/composer.d.ts | 63 + node_modules/yaml/dist/compose/composer.js | 224 + .../yaml/dist/compose/resolve-block-map.d.ts | 6 + .../yaml/dist/compose/resolve-block-map.js | 117 + .../dist/compose/resolve-block-scalar.d.ts | 11 + .../yaml/dist/compose/resolve-block-scalar.js | 200 + .../yaml/dist/compose/resolve-block-seq.d.ts | 6 + .../yaml/dist/compose/resolve-block-seq.js | 51 + .../yaml/dist/compose/resolve-end.d.ts | 6 + node_modules/yaml/dist/compose/resolve-end.js | 39 + .../dist/compose/resolve-flow-collection.d.ts | 7 + .../dist/compose/resolve-flow-collection.js | 209 + .../dist/compose/resolve-flow-scalar.d.ts | 10 + .../yaml/dist/compose/resolve-flow-scalar.js | 227 + .../yaml/dist/compose/resolve-props.d.ts | 23 + .../yaml/dist/compose/resolve-props.js | 148 + .../dist/compose/util-contains-newline.d.ts | 2 + .../dist/compose/util-contains-newline.js | 36 + .../compose/util-empty-scalar-position.d.ts | 2 + .../compose/util-empty-scalar-position.js | 28 + .../dist/compose/util-flow-indent-check.d.ts | 3 + .../dist/compose/util-flow-indent-check.js | 17 + .../yaml/dist/compose/util-map-includes.d.ts | 4 + .../yaml/dist/compose/util-map-includes.js | 15 + node_modules/yaml/dist/doc/Document.d.ts | 141 + node_modules/yaml/dist/doc/Document.js | 337 + node_modules/yaml/dist/doc/anchors.d.ts | 24 + node_modules/yaml/dist/doc/anchors.js | 76 + node_modules/yaml/dist/doc/applyReviver.d.ts | 9 + node_modules/yaml/dist/doc/applyReviver.js | 57 + node_modules/yaml/dist/doc/createNode.d.ts | 17 + node_modules/yaml/dist/doc/createNode.js | 90 + node_modules/yaml/dist/doc/directives.d.ts | 49 + node_modules/yaml/dist/doc/directives.js | 178 + node_modules/yaml/dist/errors.d.ts | 21 + node_modules/yaml/dist/errors.js | 62 + node_modules/yaml/dist/index.d.ts | 25 + node_modules/yaml/dist/index.js | 50 + node_modules/yaml/dist/log.d.ts | 3 + node_modules/yaml/dist/log.js | 19 + node_modules/yaml/dist/nodes/Alias.d.ts | 29 + node_modules/yaml/dist/nodes/Alias.js | 118 + node_modules/yaml/dist/nodes/Collection.d.ts | 73 + node_modules/yaml/dist/nodes/Collection.js | 151 + node_modules/yaml/dist/nodes/Node.d.ts | 53 + node_modules/yaml/dist/nodes/Node.js | 40 + node_modules/yaml/dist/nodes/Pair.d.ts | 22 + node_modules/yaml/dist/nodes/Pair.js | 39 + node_modules/yaml/dist/nodes/Scalar.d.ts | 47 + node_modules/yaml/dist/nodes/Scalar.js | 27 + node_modules/yaml/dist/nodes/YAMLMap.d.ts | 53 + node_modules/yaml/dist/nodes/YAMLMap.js | 147 + node_modules/yaml/dist/nodes/YAMLSeq.d.ts | 60 + node_modules/yaml/dist/nodes/YAMLSeq.js | 115 + .../yaml/dist/nodes/addPairToJSMap.d.ts | 4 + .../yaml/dist/nodes/addPairToJSMap.js | 65 + node_modules/yaml/dist/nodes/identity.d.ts | 23 + node_modules/yaml/dist/nodes/identity.js | 53 + node_modules/yaml/dist/nodes/toJS.d.ts | 29 + node_modules/yaml/dist/nodes/toJS.js | 39 + node_modules/yaml/dist/options.d.ts | 350 + node_modules/yaml/dist/parse/cst-scalar.d.ts | 64 + node_modules/yaml/dist/parse/cst-scalar.js | 218 + .../yaml/dist/parse/cst-stringify.d.ts | 8 + node_modules/yaml/dist/parse/cst-stringify.js | 63 + node_modules/yaml/dist/parse/cst-visit.d.ts | 39 + node_modules/yaml/dist/parse/cst-visit.js | 99 + node_modules/yaml/dist/parse/cst.d.ts | 109 + node_modules/yaml/dist/parse/cst.js | 112 + node_modules/yaml/dist/parse/lexer.d.ts | 87 + node_modules/yaml/dist/parse/lexer.js | 723 + .../yaml/dist/parse/line-counter.d.ts | 22 + node_modules/yaml/dist/parse/line-counter.js | 41 + node_modules/yaml/dist/parse/parser.d.ts | 84 + node_modules/yaml/dist/parse/parser.js | 980 + node_modules/yaml/dist/public-api.d.ts | 44 + node_modules/yaml/dist/public-api.js | 107 + node_modules/yaml/dist/schema/Schema.d.ts | 17 + node_modules/yaml/dist/schema/Schema.js | 39 + node_modules/yaml/dist/schema/common/map.d.ts | 2 + node_modules/yaml/dist/schema/common/map.js | 19 + .../yaml/dist/schema/common/null.d.ts | 4 + node_modules/yaml/dist/schema/common/null.js | 17 + node_modules/yaml/dist/schema/common/seq.d.ts | 2 + node_modules/yaml/dist/schema/common/seq.js | 19 + .../yaml/dist/schema/common/string.d.ts | 2 + .../yaml/dist/schema/common/string.js | 16 + node_modules/yaml/dist/schema/core/bool.d.ts | 4 + node_modules/yaml/dist/schema/core/bool.js | 21 + node_modules/yaml/dist/schema/core/float.d.ts | 4 + node_modules/yaml/dist/schema/core/float.js | 47 + node_modules/yaml/dist/schema/core/int.d.ts | 4 + node_modules/yaml/dist/schema/core/int.js | 42 + .../yaml/dist/schema/core/schema.d.ts | 1 + node_modules/yaml/dist/schema/core/schema.js | 25 + .../yaml/dist/schema/json-schema.d.ts | 69 + .../yaml/dist/schema/json/schema.d.ts | 2 + node_modules/yaml/dist/schema/json/schema.js | 64 + node_modules/yaml/dist/schema/tags.d.ts | 48 + node_modules/yaml/dist/schema/tags.js | 99 + node_modules/yaml/dist/schema/types.d.ts | 92 + .../yaml/dist/schema/yaml-1.1/binary.d.ts | 2 + .../yaml/dist/schema/yaml-1.1/binary.js | 70 + .../yaml/dist/schema/yaml-1.1/bool.d.ts | 7 + .../yaml/dist/schema/yaml-1.1/bool.js | 29 + .../yaml/dist/schema/yaml-1.1/float.d.ts | 4 + .../yaml/dist/schema/yaml-1.1/float.js | 50 + .../yaml/dist/schema/yaml-1.1/int.d.ts | 5 + node_modules/yaml/dist/schema/yaml-1.1/int.js | 76 + .../yaml/dist/schema/yaml-1.1/merge.d.ts | 9 + .../yaml/dist/schema/yaml-1.1/merge.js | 71 + .../yaml/dist/schema/yaml-1.1/omap.d.ts | 22 + .../yaml/dist/schema/yaml-1.1/omap.js | 77 + .../yaml/dist/schema/yaml-1.1/pairs.d.ts | 10 + .../yaml/dist/schema/yaml-1.1/pairs.js | 82 + .../yaml/dist/schema/yaml-1.1/schema.d.ts | 1 + .../yaml/dist/schema/yaml-1.1/schema.js | 41 + .../yaml/dist/schema/yaml-1.1/set.d.ts | 28 + node_modules/yaml/dist/schema/yaml-1.1/set.js | 96 + .../yaml/dist/schema/yaml-1.1/timestamp.d.ts | 6 + .../yaml/dist/schema/yaml-1.1/timestamp.js | 105 + .../yaml/dist/stringify/foldFlowLines.d.ts | 34 + .../yaml/dist/stringify/foldFlowLines.js | 151 + .../yaml/dist/stringify/stringify.d.ts | 21 + node_modules/yaml/dist/stringify/stringify.js | 132 + .../dist/stringify/stringifyCollection.d.ts | 17 + .../dist/stringify/stringifyCollection.js | 155 + .../yaml/dist/stringify/stringifyComment.d.ts | 10 + .../yaml/dist/stringify/stringifyComment.js | 24 + .../dist/stringify/stringifyDocument.d.ts | 4 + .../yaml/dist/stringify/stringifyDocument.js | 87 + .../yaml/dist/stringify/stringifyNumber.d.ts | 2 + .../yaml/dist/stringify/stringifyNumber.js | 27 + .../yaml/dist/stringify/stringifyPair.d.ts | 3 + .../yaml/dist/stringify/stringifyPair.js | 152 + .../yaml/dist/stringify/stringifyString.d.ts | 9 + .../yaml/dist/stringify/stringifyString.js | 338 + node_modules/yaml/dist/test-events.d.ts | 4 + node_modules/yaml/dist/test-events.js | 134 + node_modules/yaml/dist/util.d.ts | 16 + node_modules/yaml/dist/util.js | 28 + node_modules/yaml/dist/visit.d.ts | 102 + node_modules/yaml/dist/visit.js | 236 + node_modules/yaml/package.json | 97 + node_modules/yaml/util.js | 2 + node_modules/yup/LICENSE.md | 21 + node_modules/yup/README.md | 1758 + node_modules/yup/index.d.ts | 946 + node_modules/yup/index.esm.js | 2602 + node_modules/yup/index.js | 2638 + .../yup/node_modules/type-fest/index.d.ts | 95 + .../yup/node_modules/type-fest/package.json | 52 + .../yup/node_modules/type-fest/readme.md | 905 + .../type-fest/source/async-return-type.d.ts | 25 + .../type-fest/source/asyncify.d.ts | 33 + .../node_modules/type-fest/source/basic.d.ts | 45 + .../type-fest/source/camel-case.d.ts | 73 + .../source/camel-cased-properties-deep.d.ts | 54 + .../source/camel-cased-properties.d.ts | 36 + .../type-fest/source/conditional-except.d.ts | 45 + .../type-fest/source/conditional-keys.d.ts | 47 + .../type-fest/source/conditional-pick.d.ts | 44 + .../type-fest/source/delimiter-case.d.ts | 93 + .../delimiter-cased-properties-deep.d.ts | 60 + .../source/delimiter-cased-properties.d.ts | 37 + .../type-fest/source/entries.d.ts | 62 + .../node_modules/type-fest/source/entry.d.ts | 65 + .../node_modules/type-fest/source/exact.d.ts | 73 + .../node_modules/type-fest/source/except.d.ts | 57 + .../type-fest/source/fixed-length-array.d.ts | 43 + .../node_modules/type-fest/source/get.d.ts | 184 + .../type-fest/source/has-optional-keys.d.ts | 21 + .../type-fest/source/has-required-keys.d.ts | 59 + .../type-fest/source/includes.d.ts | 22 + .../type-fest/source/internal.d.ts | 59 + .../type-fest/source/invariant-of.d.ts | 76 + .../type-fest/source/iterable-element.d.ts | 54 + .../node_modules/type-fest/source/join.d.ts | 30 + .../type-fest/source/jsonify.d.ts | 90 + .../type-fest/source/kebab-case.d.ts | 38 + .../source/kebab-cased-properties-deep.d.ts | 47 + .../source/kebab-cased-properties.d.ts | 30 + .../type-fest/source/last-array-element.d.ts | 28 + .../source/literal-to-primitive.d.ts | 36 + .../type-fest/source/literal-union.d.ts | 35 + .../type-fest/source/merge-exclusive.d.ts | 41 + .../node_modules/type-fest/source/merge.d.ts | 27 + .../source/multidimensional-array.d.ts | 43 + .../multidimensional-readonly-array.d.ts | 47 + .../type-fest/source/mutable.d.ts | 5 + .../type-fest/source/numeric.d.ts | 170 + .../type-fest/source/observable-like.d.ts | 62 + .../node_modules/type-fest/source/opaque.d.ts | 107 + .../type-fest/source/optional-keys-of.d.ts | 38 + .../type-fest/source/package-json.d.ts | 663 + .../type-fest/source/partial-deep.d.ts | 113 + .../source/partial-on-undefined-deep.d.ts | 70 + .../type-fest/source/pascal-case.d.ts | 38 + .../source/pascal-cased-properties-deep.d.ts | 54 + .../source/pascal-cased-properties.d.ts | 34 + .../type-fest/source/primitive.d.ts | 13 + .../type-fest/source/promisable.d.ts | 25 + .../type-fest/source/promise-value.d.ts | 29 + .../type-fest/source/readonly-deep.d.ts | 85 + .../type-fest/source/readonly-tuple.d.ts | 41 + .../source/remove-index-signature.d.ts | 104 + .../type-fest/source/replace.d.ts | 67 + .../type-fest/source/require-all-or-none.d.ts | 36 + .../source/require-at-least-one.d.ts | 35 + .../type-fest/source/require-exactly-one.d.ts | 34 + .../type-fest/source/required-keys-of.d.ts | 29 + .../node_modules/type-fest/source/schema.d.ts | 72 + .../source/screaming-snake-case.d.ts | 33 + .../type-fest/source/set-non-nullable.d.ts | 35 + .../type-fest/source/set-optional.d.ts | 35 + .../type-fest/source/set-required.d.ts | 35 + .../type-fest/source/set-return-type.d.ts | 31 + .../type-fest/source/simplify.d.ts | 83 + .../type-fest/source/snake-case.d.ts | 38 + .../source/snake-cased-properties-deep.d.ts | 47 + .../source/snake-cased-properties.d.ts | 30 + .../node_modules/type-fest/source/split.d.ts | 29 + .../node_modules/type-fest/source/spread.d.ts | 85 + .../type-fest/source/string-key-of.d.ts | 25 + .../type-fest/source/stringified.d.ts | 23 + .../node_modules/type-fest/source/trim.d.ts | 25 + .../type-fest/source/tsconfig-json.d.ts | 1172 + .../type-fest/source/typed-array.d.ts | 17 + .../source/union-to-intersection.d.ts | 60 + .../type-fest/source/value-of.d.ts | 42 + .../type-fest/source/writable.d.ts | 40 + node_modules/yup/package.json | 44 + test-results/.last-run.json | 4 + 3995 files changed, 704074 insertions(+) create mode 100644 Playwright-Cucumber-Exercise-main/.github/workflows/dispatch-to-grader.yml create mode 100644 Playwright-Cucumber-Exercise-main/.gitignore create mode 100644 Playwright-Cucumber-Exercise-main/README.md create mode 100644 Playwright-Cucumber-Exercise-main/cucumber.js create mode 100644 Playwright-Cucumber-Exercise-main/features/login.feature create mode 100644 Playwright-Cucumber-Exercise-main/features/logout.feature create mode 100644 Playwright-Cucumber-Exercise-main/features/product.feature create mode 100644 Playwright-Cucumber-Exercise-main/features/purchase.feature create mode 100644 Playwright-Cucumber-Exercise-main/generate-report.js create mode 100644 Playwright-Cucumber-Exercise-main/hooks/globalHooks.ts create mode 100644 Playwright-Cucumber-Exercise-main/hooks/pageFixture.ts create mode 100644 Playwright-Cucumber-Exercise-main/package-lock.json create mode 100644 Playwright-Cucumber-Exercise-main/package.json create mode 100644 Playwright-Cucumber-Exercise-main/pages/login.page.ts create mode 100644 Playwright-Cucumber-Exercise-main/pages/menu.page.ts create mode 100644 Playwright-Cucumber-Exercise-main/pages/product.page.ts create mode 100644 Playwright-Cucumber-Exercise-main/pages/purchasePage.ts create mode 100644 Playwright-Cucumber-Exercise-main/playwright.config.ts create mode 100644 Playwright-Cucumber-Exercise-main/playwrightUtilities.ts create mode 100644 Playwright-Cucumber-Exercise-main/steps/common.steps.ts create mode 100644 Playwright-Cucumber-Exercise-main/steps/login.steps.ts create mode 100644 Playwright-Cucumber-Exercise-main/steps/logout.steps.ts create mode 100644 Playwright-Cucumber-Exercise-main/steps/product.steps.ts create mode 100644 Playwright-Cucumber-Exercise-main/steps/purchaseSteps.ts create mode 100644 Playwright-Cucumber-Exercise-main/tsconfig.json create mode 100644 node_modules/.bin/cucumber-js create mode 100644 node_modules/.bin/cucumber-js.cmd create mode 100644 node_modules/.bin/cucumber-js.ps1 create mode 100644 node_modules/.bin/gherkin-javascript create mode 100644 node_modules/.bin/gherkin-javascript.cmd create mode 100644 node_modules/.bin/gherkin-javascript.ps1 create mode 100644 node_modules/.bin/gherkin-utils create mode 100644 node_modules/.bin/gherkin-utils.cmd create mode 100644 node_modules/.bin/gherkin-utils.ps1 create mode 100644 node_modules/.bin/mime create mode 100644 node_modules/.bin/mime.cmd create mode 100644 node_modules/.bin/mime.ps1 create mode 100644 node_modules/.bin/mkdirp create mode 100644 node_modules/.bin/mkdirp.cmd create mode 100644 node_modules/.bin/mkdirp.ps1 create mode 100644 node_modules/.bin/playwright create mode 100644 node_modules/.bin/playwright-core create mode 100644 node_modules/.bin/playwright-core.cmd create mode 100644 node_modules/.bin/playwright-core.ps1 create mode 100644 node_modules/.bin/playwright.cmd create mode 100644 node_modules/.bin/playwright.ps1 create mode 100644 node_modules/.bin/regexp-tree create mode 100644 node_modules/.bin/regexp-tree.cmd create mode 100644 node_modules/.bin/regexp-tree.ps1 create mode 100644 node_modules/.bin/semver create mode 100644 node_modules/.bin/semver.cmd create mode 100644 node_modules/.bin/semver.ps1 create mode 100644 node_modules/.bin/yaml create mode 100644 node_modules/.bin/yaml.cmd create mode 100644 node_modules/.bin/yaml.ps1 create mode 100644 node_modules/.package-lock.json create mode 100644 node_modules/@babel/code-frame/LICENSE create mode 100644 node_modules/@babel/code-frame/README.md create mode 100644 node_modules/@babel/code-frame/lib/index.js create mode 100644 node_modules/@babel/code-frame/lib/index.js.map create mode 100644 node_modules/@babel/code-frame/package.json create mode 100644 node_modules/@babel/helper-validator-identifier/LICENSE create mode 100644 node_modules/@babel/helper-validator-identifier/README.md create mode 100644 node_modules/@babel/helper-validator-identifier/lib/identifier.js create mode 100644 node_modules/@babel/helper-validator-identifier/lib/identifier.js.map create mode 100644 node_modules/@babel/helper-validator-identifier/lib/index.js create mode 100644 node_modules/@babel/helper-validator-identifier/lib/index.js.map create mode 100644 node_modules/@babel/helper-validator-identifier/lib/keyword.js create mode 100644 node_modules/@babel/helper-validator-identifier/lib/keyword.js.map create mode 100644 node_modules/@babel/helper-validator-identifier/package.json create mode 100644 node_modules/@colors/colors/LICENSE create mode 100644 node_modules/@colors/colors/README.md create mode 100644 node_modules/@colors/colors/examples/normal-usage.js create mode 100644 node_modules/@colors/colors/examples/safe-string.js create mode 100644 node_modules/@colors/colors/index.d.ts create mode 100644 node_modules/@colors/colors/lib/colors.js create mode 100644 node_modules/@colors/colors/lib/custom/trap.js create mode 100644 node_modules/@colors/colors/lib/custom/zalgo.js create mode 100644 node_modules/@colors/colors/lib/extendStringPrototype.js create mode 100644 node_modules/@colors/colors/lib/index.js create mode 100644 node_modules/@colors/colors/lib/maps/america.js create mode 100644 node_modules/@colors/colors/lib/maps/rainbow.js create mode 100644 node_modules/@colors/colors/lib/maps/random.js create mode 100644 node_modules/@colors/colors/lib/maps/zebra.js create mode 100644 node_modules/@colors/colors/lib/styles.js create mode 100644 node_modules/@colors/colors/lib/system/has-flag.js create mode 100644 node_modules/@colors/colors/lib/system/supports-colors.js create mode 100644 node_modules/@colors/colors/package.json create mode 100644 node_modules/@colors/colors/safe.d.ts create mode 100644 node_modules/@colors/colors/safe.js create mode 100644 node_modules/@colors/colors/themes/generic-logging.js create mode 100644 node_modules/@cucumber/ci-environment/LICENSE create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/package.json create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/src/CiEnvironments.d.ts create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/src/CiEnvironments.d.ts.map create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/src/CiEnvironments.js create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/src/CiEnvironments.js.map create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/src/detectCiEnvironment.d.ts create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/src/detectCiEnvironment.d.ts.map create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/src/detectCiEnvironment.js create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/src/detectCiEnvironment.js.map create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/src/evaluateVariableExpression.d.ts create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/src/evaluateVariableExpression.d.ts.map create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/src/evaluateVariableExpression.js create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/src/evaluateVariableExpression.js.map create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/src/index.d.ts create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/src/index.d.ts.map create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/src/index.js create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/src/index.js.map create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/src/types.d.ts create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/src/types.d.ts.map create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/src/types.js create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/src/types.js.map create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/test/acceptanceTest.d.ts create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/test/acceptanceTest.d.ts.map create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/test/acceptanceTest.js create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/test/acceptanceTest.js.map create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/test/evaluateVariableExpressionTest.d.ts create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/test/evaluateVariableExpressionTest.d.ts.map create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/test/evaluateVariableExpressionTest.js create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/test/evaluateVariableExpressionTest.js.map create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/test/gitHubPullRequestIntegrationTest.d.ts create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/test/gitHubPullRequestIntegrationTest.d.ts.map create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/test/gitHubPullRequestIntegrationTest.js create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/test/gitHubPullRequestIntegrationTest.js.map create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/test/removeUserInfoFromUrlTest.d.ts create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/test/removeUserInfoFromUrlTest.d.ts.map create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/test/removeUserInfoFromUrlTest.js create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/test/removeUserInfoFromUrlTest.js.map create mode 100644 node_modules/@cucumber/ci-environment/dist/cjs/tsconfig.build-cjs.tsbuildinfo create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/src/CiEnvironments.d.ts create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/src/CiEnvironments.d.ts.map create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/src/CiEnvironments.js create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/src/CiEnvironments.js.map create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/src/detectCiEnvironment.d.ts create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/src/detectCiEnvironment.d.ts.map create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/src/detectCiEnvironment.js create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/src/detectCiEnvironment.js.map create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/src/evaluateVariableExpression.d.ts create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/src/evaluateVariableExpression.d.ts.map create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/src/evaluateVariableExpression.js create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/src/evaluateVariableExpression.js.map create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/src/index.d.ts create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/src/index.d.ts.map create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/src/index.js create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/src/index.js.map create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/src/types.d.ts create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/src/types.d.ts.map create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/src/types.js create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/src/types.js.map create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/test/acceptanceTest.d.ts create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/test/acceptanceTest.d.ts.map create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/test/acceptanceTest.js create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/test/acceptanceTest.js.map create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/test/evaluateVariableExpressionTest.d.ts create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/test/evaluateVariableExpressionTest.d.ts.map create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/test/evaluateVariableExpressionTest.js create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/test/evaluateVariableExpressionTest.js.map create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/test/gitHubPullRequestIntegrationTest.d.ts create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/test/gitHubPullRequestIntegrationTest.d.ts.map create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/test/gitHubPullRequestIntegrationTest.js create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/test/gitHubPullRequestIntegrationTest.js.map create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/test/removeUserInfoFromUrlTest.d.ts create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/test/removeUserInfoFromUrlTest.d.ts.map create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/test/removeUserInfoFromUrlTest.js create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/test/removeUserInfoFromUrlTest.js.map create mode 100644 node_modules/@cucumber/ci-environment/dist/esm/tsconfig.build-esm.tsbuildinfo create mode 100644 node_modules/@cucumber/ci-environment/package.json create mode 100644 node_modules/@cucumber/cucumber-expressions/LICENSE create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/package.json create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Argument.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Argument.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Argument.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Argument.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Ast.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Ast.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Ast.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Ast.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CombinatorialGeneratedExpressionFactory.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CombinatorialGeneratedExpressionFactory.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CombinatorialGeneratedExpressionFactory.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CombinatorialGeneratedExpressionFactory.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpression.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpression.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpression.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpression.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionError.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionError.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionError.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionError.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionGenerator.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionGenerator.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionGenerator.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionGenerator.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionParser.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionParser.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionParser.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionParser.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionTokenizer.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionTokenizer.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionTokenizer.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionTokenizer.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Errors.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Errors.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Errors.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Errors.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ExpressionFactory.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ExpressionFactory.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ExpressionFactory.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ExpressionFactory.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GeneratedExpression.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GeneratedExpression.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GeneratedExpression.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GeneratedExpression.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Group.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Group.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Group.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Group.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GroupBuilder.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GroupBuilder.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GroupBuilder.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GroupBuilder.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterType.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterType.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterType.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterType.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeMatcher.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeMatcher.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeMatcher.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeMatcher.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeRegistry.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeRegistry.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeRegistry.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeRegistry.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/RegularExpression.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/RegularExpression.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/RegularExpression.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/RegularExpression.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/TreeRegexp.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/TreeRegexp.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/TreeRegexp.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/TreeRegexp.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/defineDefaultParameterTypes.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/defineDefaultParameterTypes.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/defineDefaultParameterTypes.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/defineDefaultParameterTypes.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/index.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/index.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/index.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/index.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/types.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/types.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/types.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/src/types.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ArgumentTest.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ArgumentTest.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ArgumentTest.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ArgumentTest.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CombinatorialGeneratedExpressionFactoryTest.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CombinatorialGeneratedExpressionFactoryTest.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CombinatorialGeneratedExpressionFactoryTest.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CombinatorialGeneratedExpressionFactoryTest.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionGeneratorTest.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionGeneratorTest.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionGeneratorTest.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionGeneratorTest.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionParserTest.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionParserTest.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionParserTest.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionParserTest.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTest.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTest.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTest.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTest.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTokenizerTest.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTokenizerTest.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTokenizerTest.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTokenizerTest.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTransformationTest.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTransformationTest.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTransformationTest.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTransformationTest.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CustomParameterTypeTest.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CustomParameterTypeTest.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CustomParameterTypeTest.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CustomParameterTypeTest.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ExpressionFactoryTest.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ExpressionFactoryTest.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ExpressionFactoryTest.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ExpressionFactoryTest.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeRegistryTest.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeRegistryTest.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeRegistryTest.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeRegistryTest.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeTest.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeTest.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeTest.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeTest.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/RegularExpressionTest.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/RegularExpressionTest.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/RegularExpressionTest.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/RegularExpressionTest.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/TreeRegexpTest.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/TreeRegexpTest.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/TreeRegexpTest.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/TreeRegexpTest.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/testDataDir.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/testDataDir.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/testDataDir.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/test/testDataDir.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/cjs/tsconfig.build-cjs.tsbuildinfo create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/Argument.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/Argument.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/Argument.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/Argument.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/Ast.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/Ast.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/Ast.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/Ast.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/CombinatorialGeneratedExpressionFactory.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/CombinatorialGeneratedExpressionFactory.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/CombinatorialGeneratedExpressionFactory.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/CombinatorialGeneratedExpressionFactory.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpression.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpression.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpression.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpression.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionError.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionError.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionError.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionError.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionGenerator.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionGenerator.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionGenerator.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionGenerator.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionParser.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionParser.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionParser.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionParser.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionTokenizer.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionTokenizer.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionTokenizer.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionTokenizer.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/Errors.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/Errors.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/Errors.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/Errors.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/ExpressionFactory.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/ExpressionFactory.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/ExpressionFactory.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/ExpressionFactory.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/GeneratedExpression.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/GeneratedExpression.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/GeneratedExpression.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/GeneratedExpression.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/Group.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/Group.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/Group.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/Group.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/GroupBuilder.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/GroupBuilder.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/GroupBuilder.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/GroupBuilder.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterType.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterType.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterType.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterType.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeMatcher.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeMatcher.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeMatcher.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeMatcher.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeRegistry.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeRegistry.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeRegistry.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeRegistry.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/RegularExpression.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/RegularExpression.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/RegularExpression.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/RegularExpression.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/TreeRegexp.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/TreeRegexp.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/TreeRegexp.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/TreeRegexp.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/defineDefaultParameterTypes.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/defineDefaultParameterTypes.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/defineDefaultParameterTypes.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/defineDefaultParameterTypes.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/index.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/index.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/index.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/index.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/types.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/types.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/types.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/src/types.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/ArgumentTest.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/ArgumentTest.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/ArgumentTest.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/ArgumentTest.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/CombinatorialGeneratedExpressionFactoryTest.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/CombinatorialGeneratedExpressionFactoryTest.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/CombinatorialGeneratedExpressionFactoryTest.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/CombinatorialGeneratedExpressionFactoryTest.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionGeneratorTest.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionGeneratorTest.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionGeneratorTest.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionGeneratorTest.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionParserTest.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionParserTest.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionParserTest.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionParserTest.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTest.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTest.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTest.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTest.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTokenizerTest.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTokenizerTest.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTokenizerTest.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTokenizerTest.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTransformationTest.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTransformationTest.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTransformationTest.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTransformationTest.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/CustomParameterTypeTest.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/CustomParameterTypeTest.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/CustomParameterTypeTest.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/CustomParameterTypeTest.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/ExpressionFactoryTest.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/ExpressionFactoryTest.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/ExpressionFactoryTest.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/ExpressionFactoryTest.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeRegistryTest.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeRegistryTest.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeRegistryTest.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeRegistryTest.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeTest.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeTest.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeTest.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeTest.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/RegularExpressionTest.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/RegularExpressionTest.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/RegularExpressionTest.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/RegularExpressionTest.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/TreeRegexpTest.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/TreeRegexpTest.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/TreeRegexpTest.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/TreeRegexpTest.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/testDataDir.d.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/testDataDir.d.ts.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/testDataDir.js create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/test/testDataDir.js.map create mode 100644 node_modules/@cucumber/cucumber-expressions/dist/esm/tsconfig.build-esm.tsbuildinfo create mode 100644 node_modules/@cucumber/cucumber-expressions/package.json create mode 100644 node_modules/@cucumber/cucumber-expressions/src/Argument.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/src/Ast.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/src/CombinatorialGeneratedExpressionFactory.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/src/CucumberExpression.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/src/CucumberExpressionError.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/src/CucumberExpressionGenerator.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/src/CucumberExpressionParser.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/src/CucumberExpressionTokenizer.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/src/Errors.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/src/ExpressionFactory.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/src/GeneratedExpression.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/src/Group.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/src/GroupBuilder.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/src/ParameterType.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/src/ParameterTypeMatcher.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/src/ParameterTypeRegistry.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/src/RegularExpression.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/src/TreeRegexp.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/src/defineDefaultParameterTypes.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/src/index.ts create mode 100644 node_modules/@cucumber/cucumber-expressions/src/types.ts create mode 100644 node_modules/@cucumber/cucumber/LICENSE create mode 100644 node_modules/@cucumber/cucumber/README.md create mode 100644 node_modules/@cucumber/cucumber/api/index.d.ts create mode 100644 node_modules/@cucumber/cucumber/bin/cucumber-js create mode 100644 node_modules/@cucumber/cucumber/bin/cucumber.js create mode 100644 node_modules/@cucumber/cucumber/lib/api/convert_configuration.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/api/convert_configuration.js create mode 100644 node_modules/@cucumber/cucumber/lib/api/convert_configuration.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/api/emit_support_code_messages.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/api/emit_support_code_messages.js create mode 100644 node_modules/@cucumber/cucumber/lib/api/emit_support_code_messages.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/api/formatters.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/api/formatters.js create mode 100644 node_modules/@cucumber/cucumber/lib/api/formatters.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/api/gherkin.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/api/gherkin.js create mode 100644 node_modules/@cucumber/cucumber/lib/api/gherkin.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/api/index.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/api/index.js create mode 100644 node_modules/@cucumber/cucumber/lib/api/index.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/api/load_configuration.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/api/load_configuration.js create mode 100644 node_modules/@cucumber/cucumber/lib/api/load_configuration.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/api/load_sources.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/api/load_sources.js create mode 100644 node_modules/@cucumber/cucumber/lib/api/load_sources.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/api/load_support.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/api/load_support.js create mode 100644 node_modules/@cucumber/cucumber/lib/api/load_support.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/api/plugins.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/api/plugins.js create mode 100644 node_modules/@cucumber/cucumber/lib/api/plugins.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/api/run_cucumber.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/api/run_cucumber.js create mode 100644 node_modules/@cucumber/cucumber/lib/api/run_cucumber.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/api/support.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/api/support.js create mode 100644 node_modules/@cucumber/cucumber/lib/api/support.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/api/test_helpers.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/api/test_helpers.js create mode 100644 node_modules/@cucumber/cucumber/lib/api/test_helpers.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/api/types.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/api/types.js create mode 100644 node_modules/@cucumber/cucumber/lib/api/types.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/api/wrapper.mjs create mode 100644 node_modules/@cucumber/cucumber/lib/assemble/assemble_test_cases.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/assemble/assemble_test_cases.js create mode 100644 node_modules/@cucumber/cucumber/lib/assemble/assemble_test_cases.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/assemble/index.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/assemble/index.js create mode 100644 node_modules/@cucumber/cucumber/lib/assemble/index.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/assemble/types.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/assemble/types.js create mode 100644 node_modules/@cucumber/cucumber/lib/assemble/types.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/cli/i18n.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/cli/i18n.js create mode 100644 node_modules/@cucumber/cucumber/lib/cli/i18n.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/cli/index.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/cli/index.js create mode 100644 node_modules/@cucumber/cucumber/lib/cli/index.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/cli/install_validator.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/cli/install_validator.js create mode 100644 node_modules/@cucumber/cucumber/lib/cli/install_validator.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/cli/run.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/cli/run.js create mode 100644 node_modules/@cucumber/cucumber/lib/cli/run.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/cli/validate_node_engine_version.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/cli/validate_node_engine_version.js create mode 100644 node_modules/@cucumber/cucumber/lib/cli/validate_node_engine_version.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/argv_parser.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/argv_parser.js create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/argv_parser.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/check_schema.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/check_schema.js create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/check_schema.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/default_configuration.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/default_configuration.js create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/default_configuration.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/from_file.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/from_file.js create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/from_file.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/helpers.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/helpers.js create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/helpers.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/index.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/index.js create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/index.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/locate_file.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/locate_file.js create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/locate_file.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/merge_configurations.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/merge_configurations.js create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/merge_configurations.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/parse_configuration.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/parse_configuration.js create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/parse_configuration.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/split_format_descriptor.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/split_format_descriptor.js create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/split_format_descriptor.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/types.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/types.js create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/types.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/validate_configuration.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/validate_configuration.js create mode 100644 node_modules/@cucumber/cucumber/lib/configuration/validate_configuration.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/environment/console_logger.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/environment/console_logger.js create mode 100644 node_modules/@cucumber/cucumber/lib/environment/console_logger.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/environment/index.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/environment/index.js create mode 100644 node_modules/@cucumber/cucumber/lib/environment/index.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/environment/make_environment.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/environment/make_environment.js create mode 100644 node_modules/@cucumber/cucumber/lib/environment/make_environment.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/environment/types.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/environment/types.js create mode 100644 node_modules/@cucumber/cucumber/lib/environment/types.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/filter/filter_plugin.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/filter/filter_plugin.js create mode 100644 node_modules/@cucumber/cucumber/lib/filter/filter_plugin.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/filter/index.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/filter/index.js create mode 100644 node_modules/@cucumber/cucumber/lib/filter/index.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/filter/order_pickles.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/filter/order_pickles.js create mode 100644 node_modules/@cucumber/cucumber/lib/filter/order_pickles.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/filter/types.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/filter/types.js create mode 100644 node_modules/@cucumber/cucumber/lib/filter/types.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/filter_stack_trace.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/filter_stack_trace.js create mode 100644 node_modules/@cucumber/cucumber/lib/filter_stack_trace.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/builder.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/builder.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/builder.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/builtin/html.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/builtin/html.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/builtin/html.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/builtin/index.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/builtin/index.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/builtin/index.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/builtin/message.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/builtin/message.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/builtin/message.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/create_stream.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/create_stream.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/create_stream.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/find_class_or_plugin.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/find_class_or_plugin.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/find_class_or_plugin.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/get_color_fns.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/get_color_fns.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/get_color_fns.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/duration_helpers.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/duration_helpers.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/duration_helpers.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/event_data_collector.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/event_data_collector.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/event_data_collector.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/formatters.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/formatters.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/formatters.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/gherkin_document_parser.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/gherkin_document_parser.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/gherkin_document_parser.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/index.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/index.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/index.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/issue_helpers.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/issue_helpers.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/issue_helpers.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/keyword_type.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/keyword_type.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/keyword_type.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/location_helpers.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/location_helpers.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/location_helpers.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/pickle_parser.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/pickle_parser.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/pickle_parser.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/step_argument_formatter.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/step_argument_formatter.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/step_argument_formatter.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/summary_helpers.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/summary_helpers.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/summary_helpers.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/test_case_attempt_formatter.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/test_case_attempt_formatter.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/test_case_attempt_formatter.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/test_case_attempt_parser.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/test_case_attempt_parser.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/test_case_attempt_parser.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/usage_helpers/index.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/usage_helpers/index.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/helpers/usage_helpers/index.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/import_code.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/import_code.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/import_code.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/index.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/index.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/index.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/json_formatter.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/json_formatter.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/json_formatter.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/progress_bar_formatter.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/progress_bar_formatter.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/progress_bar_formatter.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/progress_formatter.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/progress_formatter.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/progress_formatter.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/rerun_formatter.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/rerun_formatter.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/rerun_formatter.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/resolve_implementation.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/resolve_implementation.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/resolve_implementation.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/snippets_formatter.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/snippets_formatter.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/snippets_formatter.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/index.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/index.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/index.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/snippet_syntax.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/snippet_syntax.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/snippet_syntax.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/summary_formatter.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/summary_formatter.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/summary_formatter.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/usage_formatter.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/usage_formatter.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/usage_formatter.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/usage_json_formatter.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/usage_json_formatter.js create mode 100644 node_modules/@cucumber/cucumber/lib/formatter/usage_json_formatter.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/index.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/index.js create mode 100644 node_modules/@cucumber/cucumber/lib/index.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/models/data_table.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/models/data_table.js create mode 100644 node_modules/@cucumber/cucumber/lib/models/data_table.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/models/definition.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/models/definition.js create mode 100644 node_modules/@cucumber/cucumber/lib/models/definition.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/models/gherkin_step_keyword.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/models/gherkin_step_keyword.js create mode 100644 node_modules/@cucumber/cucumber/lib/models/gherkin_step_keyword.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/models/step_definition.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/models/step_definition.js create mode 100644 node_modules/@cucumber/cucumber/lib/models/step_definition.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/models/test_case_hook_definition.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/models/test_case_hook_definition.js create mode 100644 node_modules/@cucumber/cucumber/lib/models/test_case_hook_definition.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/models/test_run_hook_definition.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/models/test_run_hook_definition.js create mode 100644 node_modules/@cucumber/cucumber/lib/models/test_run_hook_definition.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/models/test_step_hook_definition.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/models/test_step_hook_definition.js create mode 100644 node_modules/@cucumber/cucumber/lib/models/test_step_hook_definition.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/paths/index.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/paths/index.js create mode 100644 node_modules/@cucumber/cucumber/lib/paths/index.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/paths/paths.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/paths/paths.js create mode 100644 node_modules/@cucumber/cucumber/lib/paths/paths.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/paths/types.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/paths/types.js create mode 100644 node_modules/@cucumber/cucumber/lib/paths/types.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/pickle_filter.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/pickle_filter.js create mode 100644 node_modules/@cucumber/cucumber/lib/pickle_filter.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/plugin/index.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/plugin/index.js create mode 100644 node_modules/@cucumber/cucumber/lib/plugin/index.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/plugin/plugin_manager.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/plugin/plugin_manager.js create mode 100644 node_modules/@cucumber/cucumber/lib/plugin/plugin_manager.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/plugin/types.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/plugin/types.js create mode 100644 node_modules/@cucumber/cucumber/lib/plugin/types.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/publish/index.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/publish/index.js create mode 100644 node_modules/@cucumber/cucumber/lib/publish/index.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/publish/publish_plugin.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/publish/publish_plugin.js create mode 100644 node_modules/@cucumber/cucumber/lib/publish/publish_plugin.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/publish/types.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/publish/types.js create mode 100644 node_modules/@cucumber/cucumber/lib/publish/types.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/attachment_manager/index.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/attachment_manager/index.js create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/attachment_manager/index.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/coordinator.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/coordinator.js create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/coordinator.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/format_error.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/format_error.js create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/format_error.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/helpers.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/helpers.js create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/helpers.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/index.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/index.js create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/index.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/make_runtime.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/make_runtime.js create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/make_runtime.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/make_suggestion.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/make_suggestion.js create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/make_suggestion.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/parallel/adapter.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/parallel/adapter.js create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/parallel/adapter.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/parallel/run_worker.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/parallel/run_worker.js create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/parallel/run_worker.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/parallel/types.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/parallel/types.js create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/parallel/types.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/parallel/worker.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/parallel/worker.js create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/parallel/worker.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/scope/index.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/scope/index.js create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/scope/index.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/scope/make_proxy.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/scope/make_proxy.js create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/scope/make_proxy.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/scope/test_case_scope.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/scope/test_case_scope.js create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/scope/test_case_scope.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/scope/test_run_scope.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/scope/test_run_scope.js create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/scope/test_run_scope.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/serial/adapter.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/serial/adapter.js create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/serial/adapter.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/step_runner.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/step_runner.js create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/step_runner.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/stopwatch.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/stopwatch.js create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/stopwatch.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/test_case_runner.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/test_case_runner.js create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/test_case_runner.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/types.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/types.js create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/types.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/worker.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/worker.js create mode 100644 node_modules/@cucumber/cucumber/lib/runtime/worker.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/sharding/index.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/sharding/index.js create mode 100644 node_modules/@cucumber/cucumber/lib/sharding/index.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/sharding/sharding_plugin.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/sharding/sharding_plugin.js create mode 100644 node_modules/@cucumber/cucumber/lib/sharding/sharding_plugin.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/step_arguments.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/step_arguments.js create mode 100644 node_modules/@cucumber/cucumber/lib/step_arguments.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/support_code_library_builder/build_parameter_type.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/support_code_library_builder/build_parameter_type.js create mode 100644 node_modules/@cucumber/cucumber/lib/support_code_library_builder/build_parameter_type.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/support_code_library_builder/context.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/support_code_library_builder/context.js create mode 100644 node_modules/@cucumber/cucumber/lib/support_code_library_builder/context.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/support_code_library_builder/get_definition_line_and_uri.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/support_code_library_builder/get_definition_line_and_uri.js create mode 100644 node_modules/@cucumber/cucumber/lib/support_code_library_builder/get_definition_line_and_uri.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/support_code_library_builder/index.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/support_code_library_builder/index.js create mode 100644 node_modules/@cucumber/cucumber/lib/support_code_library_builder/index.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/support_code_library_builder/parallel_can_assign_helpers.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/support_code_library_builder/parallel_can_assign_helpers.js create mode 100644 node_modules/@cucumber/cucumber/lib/support_code_library_builder/parallel_can_assign_helpers.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/support_code_library_builder/sourced_parameter_type_registry.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/support_code_library_builder/sourced_parameter_type_registry.js create mode 100644 node_modules/@cucumber/cucumber/lib/support_code_library_builder/sourced_parameter_type_registry.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/support_code_library_builder/types.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/support_code_library_builder/types.js create mode 100644 node_modules/@cucumber/cucumber/lib/support_code_library_builder/types.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/support_code_library_builder/validate_arguments.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/support_code_library_builder/validate_arguments.js create mode 100644 node_modules/@cucumber/cucumber/lib/support_code_library_builder/validate_arguments.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/support_code_library_builder/world.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/support_code_library_builder/world.js create mode 100644 node_modules/@cucumber/cucumber/lib/support_code_library_builder/world.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/time.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/time.js create mode 100644 node_modules/@cucumber/cucumber/lib/time.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/try_require.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/try_require.js create mode 100644 node_modules/@cucumber/cucumber/lib/try_require.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/tsconfig.node.tsbuildinfo create mode 100644 node_modules/@cucumber/cucumber/lib/types/index.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/types/index.js create mode 100644 node_modules/@cucumber/cucumber/lib/types/index.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/uncaught_exception_manager.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/uncaught_exception_manager.js create mode 100644 node_modules/@cucumber/cucumber/lib/uncaught_exception_manager.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/user_code_runner.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/user_code_runner.js create mode 100644 node_modules/@cucumber/cucumber/lib/user_code_runner.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/value_checker.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/value_checker.js create mode 100644 node_modules/@cucumber/cucumber/lib/value_checker.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/version.d.ts create mode 100644 node_modules/@cucumber/cucumber/lib/version.js create mode 100644 node_modules/@cucumber/cucumber/lib/version.js.map create mode 100644 node_modules/@cucumber/cucumber/lib/wrapper.mjs create mode 100644 node_modules/@cucumber/cucumber/package.json create mode 100644 node_modules/@cucumber/gherkin-streams/.github/renovate.json create mode 100644 node_modules/@cucumber/gherkin-streams/.github/settings.yml create mode 100644 node_modules/@cucumber/gherkin-streams/.github/workflows/release-github.yml create mode 100644 node_modules/@cucumber/gherkin-streams/.github/workflows/release.yml create mode 100644 node_modules/@cucumber/gherkin-streams/.github/workflows/test.yml create mode 100644 node_modules/@cucumber/gherkin-streams/.mocharc.json create mode 100644 node_modules/@cucumber/gherkin-streams/.prettierrc.json create mode 100644 node_modules/@cucumber/gherkin-streams/CHANGELOG.md create mode 100644 node_modules/@cucumber/gherkin-streams/README.md create mode 100644 node_modules/@cucumber/gherkin-streams/RELEASIN.md create mode 100644 node_modules/@cucumber/gherkin-streams/bin/gherkin create mode 100644 node_modules/@cucumber/gherkin-streams/dist/package.json create mode 100644 node_modules/@cucumber/gherkin-streams/dist/src/GherkinStreams.d.ts create mode 100644 node_modules/@cucumber/gherkin-streams/dist/src/GherkinStreams.d.ts.map create mode 100644 node_modules/@cucumber/gherkin-streams/dist/src/GherkinStreams.js create mode 100644 node_modules/@cucumber/gherkin-streams/dist/src/GherkinStreams.js.map create mode 100644 node_modules/@cucumber/gherkin-streams/dist/src/ParserMessageStream.d.ts create mode 100644 node_modules/@cucumber/gherkin-streams/dist/src/ParserMessageStream.d.ts.map create mode 100644 node_modules/@cucumber/gherkin-streams/dist/src/ParserMessageStream.js create mode 100644 node_modules/@cucumber/gherkin-streams/dist/src/ParserMessageStream.js.map create mode 100644 node_modules/@cucumber/gherkin-streams/dist/src/SourceMessageStream.d.ts create mode 100644 node_modules/@cucumber/gherkin-streams/dist/src/SourceMessageStream.d.ts.map create mode 100644 node_modules/@cucumber/gherkin-streams/dist/src/SourceMessageStream.js create mode 100644 node_modules/@cucumber/gherkin-streams/dist/src/SourceMessageStream.js.map create mode 100644 node_modules/@cucumber/gherkin-streams/dist/src/cli/main.d.ts create mode 100644 node_modules/@cucumber/gherkin-streams/dist/src/cli/main.d.ts.map create mode 100644 node_modules/@cucumber/gherkin-streams/dist/src/cli/main.js create mode 100644 node_modules/@cucumber/gherkin-streams/dist/src/cli/main.js.map create mode 100644 node_modules/@cucumber/gherkin-streams/dist/src/index.d.ts create mode 100644 node_modules/@cucumber/gherkin-streams/dist/src/index.d.ts.map create mode 100644 node_modules/@cucumber/gherkin-streams/dist/src/index.js create mode 100644 node_modules/@cucumber/gherkin-streams/dist/src/index.js.map create mode 100644 node_modules/@cucumber/gherkin-streams/dist/src/makeGherkinOptions.d.ts create mode 100644 node_modules/@cucumber/gherkin-streams/dist/src/makeGherkinOptions.d.ts.map create mode 100644 node_modules/@cucumber/gherkin-streams/dist/src/makeGherkinOptions.js create mode 100644 node_modules/@cucumber/gherkin-streams/dist/src/makeGherkinOptions.js.map create mode 100644 node_modules/@cucumber/gherkin-streams/dist/test/StreamTest.d.ts create mode 100644 node_modules/@cucumber/gherkin-streams/dist/test/StreamTest.d.ts.map create mode 100644 node_modules/@cucumber/gherkin-streams/dist/test/StreamTest.js create mode 100644 node_modules/@cucumber/gherkin-streams/dist/test/StreamTest.js.map create mode 100644 node_modules/@cucumber/gherkin-streams/dist/tsconfig.build.tsbuildinfo create mode 100644 node_modules/@cucumber/gherkin-streams/eslint.config.mjs create mode 100644 node_modules/@cucumber/gherkin-streams/node_modules/commander/LICENSE create mode 100644 node_modules/@cucumber/gherkin-streams/node_modules/commander/Readme.md create mode 100644 node_modules/@cucumber/gherkin-streams/node_modules/commander/esm.mjs create mode 100644 node_modules/@cucumber/gherkin-streams/node_modules/commander/index.js create mode 100644 node_modules/@cucumber/gherkin-streams/node_modules/commander/lib/argument.js create mode 100644 node_modules/@cucumber/gherkin-streams/node_modules/commander/lib/command.js create mode 100644 node_modules/@cucumber/gherkin-streams/node_modules/commander/lib/error.js create mode 100644 node_modules/@cucumber/gherkin-streams/node_modules/commander/lib/help.js create mode 100644 node_modules/@cucumber/gherkin-streams/node_modules/commander/lib/option.js create mode 100644 node_modules/@cucumber/gherkin-streams/node_modules/commander/lib/suggestSimilar.js create mode 100644 node_modules/@cucumber/gherkin-streams/node_modules/commander/package-support.json create mode 100644 node_modules/@cucumber/gherkin-streams/node_modules/commander/package.json create mode 100644 node_modules/@cucumber/gherkin-streams/node_modules/commander/typings/esm.d.mts create mode 100644 node_modules/@cucumber/gherkin-streams/node_modules/commander/typings/index.d.ts create mode 100644 node_modules/@cucumber/gherkin-streams/package.json create mode 100644 node_modules/@cucumber/gherkin-streams/src/GherkinStreams.ts create mode 100644 node_modules/@cucumber/gherkin-streams/src/ParserMessageStream.ts create mode 100644 node_modules/@cucumber/gherkin-streams/src/SourceMessageStream.ts create mode 100644 node_modules/@cucumber/gherkin-streams/src/cli/main.ts create mode 100644 node_modules/@cucumber/gherkin-streams/src/index.ts create mode 100644 node_modules/@cucumber/gherkin-streams/src/makeGherkinOptions.ts create mode 100644 node_modules/@cucumber/gherkin-streams/test/StreamTest.ts create mode 100644 node_modules/@cucumber/gherkin-streams/testdata/good/minimal.feature create mode 100644 node_modules/@cucumber/gherkin-streams/tsconfig.base.json create mode 100644 node_modules/@cucumber/gherkin-streams/tsconfig.build.json create mode 100644 node_modules/@cucumber/gherkin-streams/tsconfig.json create mode 100644 node_modules/@cucumber/gherkin-utils/.mocharc.json create mode 100644 node_modules/@cucumber/gherkin-utils/LICENSE create mode 100644 node_modules/@cucumber/gherkin-utils/bin/gherkin-utils create mode 100644 node_modules/@cucumber/gherkin-utils/dist/package.json create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/GherkinDocumentHandlers.d.ts create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/GherkinDocumentHandlers.d.ts.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/GherkinDocumentHandlers.js create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/GherkinDocumentHandlers.js.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/GherkinDocumentWalker.d.ts create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/GherkinDocumentWalker.d.ts.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/GherkinDocumentWalker.js create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/GherkinDocumentWalker.js.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/Query.d.ts create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/Query.d.ts.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/Query.js create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/Query.js.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/cli.d.ts create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/cli.d.ts.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/cli.js create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/cli.js.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/commands/formatCommand.d.ts create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/commands/formatCommand.d.ts.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/commands/formatCommand.js create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/commands/formatCommand.js.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/index.d.ts create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/index.d.ts.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/index.js create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/index.js.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/pretty.d.ts create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/pretty.d.ts.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/pretty.js create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/pretty.js.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/walkGherkinDocument.d.ts create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/walkGherkinDocument.d.ts.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/walkGherkinDocument.js create mode 100644 node_modules/@cucumber/gherkin-utils/dist/src/walkGherkinDocument.js.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/test/GherkinDocumentWalkerTest.d.ts create mode 100644 node_modules/@cucumber/gherkin-utils/dist/test/GherkinDocumentWalkerTest.d.ts.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/test/GherkinDocumentWalkerTest.js create mode 100644 node_modules/@cucumber/gherkin-utils/dist/test/GherkinDocumentWalkerTest.js.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/test/QueryTest.d.ts create mode 100644 node_modules/@cucumber/gherkin-utils/dist/test/QueryTest.d.ts.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/test/QueryTest.js create mode 100644 node_modules/@cucumber/gherkin-utils/dist/test/QueryTest.js.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/test/commands/formatCommandTest.d.ts create mode 100644 node_modules/@cucumber/gherkin-utils/dist/test/commands/formatCommandTest.d.ts.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/test/commands/formatCommandTest.js create mode 100644 node_modules/@cucumber/gherkin-utils/dist/test/commands/formatCommandTest.js.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/test/messageTest.d.ts create mode 100644 node_modules/@cucumber/gherkin-utils/dist/test/messageTest.d.ts.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/test/messageTest.js create mode 100644 node_modules/@cucumber/gherkin-utils/dist/test/messageTest.js.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/test/parse.d.ts create mode 100644 node_modules/@cucumber/gherkin-utils/dist/test/parse.d.ts.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/test/parse.js create mode 100644 node_modules/@cucumber/gherkin-utils/dist/test/parse.js.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/test/prettyTest.d.ts create mode 100644 node_modules/@cucumber/gherkin-utils/dist/test/prettyTest.d.ts.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/test/prettyTest.js create mode 100644 node_modules/@cucumber/gherkin-utils/dist/test/prettyTest.js.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/test/walkGherkinDocumentTest.d.ts create mode 100644 node_modules/@cucumber/gherkin-utils/dist/test/walkGherkinDocumentTest.d.ts.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/test/walkGherkinDocumentTest.js create mode 100644 node_modules/@cucumber/gherkin-utils/dist/test/walkGherkinDocumentTest.js.map create mode 100644 node_modules/@cucumber/gherkin-utils/dist/tsconfig.build.tsbuildinfo create mode 100644 node_modules/@cucumber/gherkin-utils/eslint.config.mjs create mode 100644 node_modules/@cucumber/gherkin-utils/node_modules/commander/LICENSE create mode 100644 node_modules/@cucumber/gherkin-utils/node_modules/commander/Readme.md create mode 100644 node_modules/@cucumber/gherkin-utils/node_modules/commander/esm.mjs create mode 100644 node_modules/@cucumber/gherkin-utils/node_modules/commander/index.js create mode 100644 node_modules/@cucumber/gherkin-utils/node_modules/commander/lib/argument.js create mode 100644 node_modules/@cucumber/gherkin-utils/node_modules/commander/lib/command.js create mode 100644 node_modules/@cucumber/gherkin-utils/node_modules/commander/lib/error.js create mode 100644 node_modules/@cucumber/gherkin-utils/node_modules/commander/lib/help.js create mode 100644 node_modules/@cucumber/gherkin-utils/node_modules/commander/lib/option.js create mode 100644 node_modules/@cucumber/gherkin-utils/node_modules/commander/lib/suggestSimilar.js create mode 100644 node_modules/@cucumber/gherkin-utils/node_modules/commander/package-support.json create mode 100644 node_modules/@cucumber/gherkin-utils/node_modules/commander/package.json create mode 100644 node_modules/@cucumber/gherkin-utils/node_modules/commander/typings/esm.d.mts create mode 100644 node_modules/@cucumber/gherkin-utils/node_modules/commander/typings/index.d.ts create mode 100644 node_modules/@cucumber/gherkin-utils/package.json create mode 100644 node_modules/@cucumber/gherkin-utils/scripts/gherkin-utils.sh create mode 100644 node_modules/@cucumber/gherkin-utils/src/GherkinDocumentHandlers.ts create mode 100644 node_modules/@cucumber/gherkin-utils/src/GherkinDocumentWalker.ts create mode 100644 node_modules/@cucumber/gherkin-utils/src/Query.ts create mode 100644 node_modules/@cucumber/gherkin-utils/src/cli.ts create mode 100644 node_modules/@cucumber/gherkin-utils/src/commands/formatCommand.ts create mode 100644 node_modules/@cucumber/gherkin-utils/src/index.ts create mode 100644 node_modules/@cucumber/gherkin-utils/src/pretty.ts create mode 100644 node_modules/@cucumber/gherkin-utils/src/walkGherkinDocument.ts create mode 100644 node_modules/@cucumber/gherkin-utils/test/GherkinDocumentWalkerTest.ts create mode 100644 node_modules/@cucumber/gherkin-utils/test/QueryTest.ts create mode 100644 node_modules/@cucumber/gherkin-utils/test/commands/formatCommandTest.ts create mode 100644 node_modules/@cucumber/gherkin-utils/test/messageTest.ts create mode 100644 node_modules/@cucumber/gherkin-utils/test/messages/README.md create mode 100644 node_modules/@cucumber/gherkin-utils/test/parse.ts create mode 100644 node_modules/@cucumber/gherkin-utils/test/prettyTest.ts create mode 100644 node_modules/@cucumber/gherkin-utils/test/walkGherkinDocumentTest.ts create mode 100644 node_modules/@cucumber/gherkin-utils/tsconfig.base.json create mode 100644 node_modules/@cucumber/gherkin-utils/tsconfig.build.json create mode 100644 node_modules/@cucumber/gherkin-utils/tsconfig.json create mode 100644 node_modules/@cucumber/gherkin/.mocharc.json create mode 100644 node_modules/@cucumber/gherkin/CONTRIBUTING.md create mode 100644 node_modules/@cucumber/gherkin/LICENSE create mode 100644 node_modules/@cucumber/gherkin/README.md create mode 100644 node_modules/@cucumber/gherkin/dist/src/AstBuilder.d.ts create mode 100644 node_modules/@cucumber/gherkin/dist/src/AstBuilder.d.ts.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/AstBuilder.js create mode 100644 node_modules/@cucumber/gherkin/dist/src/AstBuilder.js.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/AstNode.d.ts create mode 100644 node_modules/@cucumber/gherkin/dist/src/AstNode.d.ts.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/AstNode.js create mode 100644 node_modules/@cucumber/gherkin/dist/src/AstNode.js.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/Dialect.d.ts create mode 100644 node_modules/@cucumber/gherkin/dist/src/Dialect.d.ts.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/Dialect.js create mode 100644 node_modules/@cucumber/gherkin/dist/src/Dialect.js.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/Errors.d.ts create mode 100644 node_modules/@cucumber/gherkin/dist/src/Errors.d.ts.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/Errors.js create mode 100644 node_modules/@cucumber/gherkin/dist/src/Errors.js.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/GherkinClassicTokenMatcher.d.ts create mode 100644 node_modules/@cucumber/gherkin/dist/src/GherkinClassicTokenMatcher.d.ts.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/GherkinClassicTokenMatcher.js create mode 100644 node_modules/@cucumber/gherkin/dist/src/GherkinClassicTokenMatcher.js.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/GherkinInMarkdownTokenMatcher.d.ts create mode 100644 node_modules/@cucumber/gherkin/dist/src/GherkinInMarkdownTokenMatcher.d.ts.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/GherkinInMarkdownTokenMatcher.js create mode 100644 node_modules/@cucumber/gherkin/dist/src/GherkinInMarkdownTokenMatcher.js.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/GherkinLine.d.ts create mode 100644 node_modules/@cucumber/gherkin/dist/src/GherkinLine.d.ts.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/GherkinLine.js create mode 100644 node_modules/@cucumber/gherkin/dist/src/GherkinLine.js.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/IAstBuilder.d.ts create mode 100644 node_modules/@cucumber/gherkin/dist/src/IAstBuilder.d.ts.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/IAstBuilder.js create mode 100644 node_modules/@cucumber/gherkin/dist/src/IAstBuilder.js.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/IGherkinOptions.d.ts create mode 100644 node_modules/@cucumber/gherkin/dist/src/IGherkinOptions.d.ts.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/IGherkinOptions.js create mode 100644 node_modules/@cucumber/gherkin/dist/src/IGherkinOptions.js.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/IToken.d.ts create mode 100644 node_modules/@cucumber/gherkin/dist/src/IToken.d.ts.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/IToken.js create mode 100644 node_modules/@cucumber/gherkin/dist/src/IToken.js.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/ITokenMatcher.d.ts create mode 100644 node_modules/@cucumber/gherkin/dist/src/ITokenMatcher.d.ts.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/ITokenMatcher.js create mode 100644 node_modules/@cucumber/gherkin/dist/src/ITokenMatcher.js.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/Parser.d.ts create mode 100644 node_modules/@cucumber/gherkin/dist/src/Parser.d.ts.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/Parser.js create mode 100644 node_modules/@cucumber/gherkin/dist/src/Parser.js.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/TokenExceptions.d.ts create mode 100644 node_modules/@cucumber/gherkin/dist/src/TokenExceptions.d.ts.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/TokenExceptions.js create mode 100644 node_modules/@cucumber/gherkin/dist/src/TokenExceptions.js.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/TokenScanner.d.ts create mode 100644 node_modules/@cucumber/gherkin/dist/src/TokenScanner.d.ts.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/TokenScanner.js create mode 100644 node_modules/@cucumber/gherkin/dist/src/TokenScanner.js.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/compareStepKeywords.d.ts create mode 100644 node_modules/@cucumber/gherkin/dist/src/compareStepKeywords.d.ts.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/compareStepKeywords.js create mode 100644 node_modules/@cucumber/gherkin/dist/src/compareStepKeywords.js.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/countSymbols.d.ts create mode 100644 node_modules/@cucumber/gherkin/dist/src/countSymbols.d.ts.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/countSymbols.js create mode 100644 node_modules/@cucumber/gherkin/dist/src/countSymbols.js.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/generateMessages.d.ts create mode 100644 node_modules/@cucumber/gherkin/dist/src/generateMessages.d.ts.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/generateMessages.js create mode 100644 node_modules/@cucumber/gherkin/dist/src/generateMessages.js.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/gherkin-languages.json create mode 100644 node_modules/@cucumber/gherkin/dist/src/index.d.ts create mode 100644 node_modules/@cucumber/gherkin/dist/src/index.d.ts.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/index.js create mode 100644 node_modules/@cucumber/gherkin/dist/src/index.js.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/makeSourceEnvelope.d.ts create mode 100644 node_modules/@cucumber/gherkin/dist/src/makeSourceEnvelope.d.ts.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/makeSourceEnvelope.js create mode 100644 node_modules/@cucumber/gherkin/dist/src/makeSourceEnvelope.js.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/pickles/compile.d.ts create mode 100644 node_modules/@cucumber/gherkin/dist/src/pickles/compile.d.ts.map create mode 100644 node_modules/@cucumber/gherkin/dist/src/pickles/compile.js create mode 100644 node_modules/@cucumber/gherkin/dist/src/pickles/compile.js.map create mode 100644 node_modules/@cucumber/gherkin/dist/tsconfig.build.tsbuildinfo create mode 100644 node_modules/@cucumber/gherkin/gherkin-javascript.razor create mode 100644 node_modules/@cucumber/gherkin/package.json create mode 100644 node_modules/@cucumber/gherkin/src/AstBuilder.ts create mode 100644 node_modules/@cucumber/gherkin/src/AstNode.ts create mode 100644 node_modules/@cucumber/gherkin/src/Dialect.ts create mode 100644 node_modules/@cucumber/gherkin/src/Errors.ts create mode 100644 node_modules/@cucumber/gherkin/src/GherkinClassicTokenMatcher.ts create mode 100644 node_modules/@cucumber/gherkin/src/GherkinInMarkdownTokenMatcher.ts create mode 100644 node_modules/@cucumber/gherkin/src/GherkinLine.ts create mode 100644 node_modules/@cucumber/gherkin/src/IAstBuilder.ts create mode 100644 node_modules/@cucumber/gherkin/src/IGherkinOptions.ts create mode 100644 node_modules/@cucumber/gherkin/src/IToken.ts create mode 100644 node_modules/@cucumber/gherkin/src/ITokenMatcher.ts create mode 100644 node_modules/@cucumber/gherkin/src/Parser.ts create mode 100644 node_modules/@cucumber/gherkin/src/TokenExceptions.ts create mode 100644 node_modules/@cucumber/gherkin/src/TokenScanner.ts create mode 100644 node_modules/@cucumber/gherkin/src/compareStepKeywords.ts create mode 100644 node_modules/@cucumber/gherkin/src/countSymbols.ts create mode 100644 node_modules/@cucumber/gherkin/src/generateMessages.ts create mode 100644 node_modules/@cucumber/gherkin/src/gherkin-languages.json create mode 100644 node_modules/@cucumber/gherkin/src/index.ts create mode 100644 node_modules/@cucumber/gherkin/src/makeSourceEnvelope.ts create mode 100644 node_modules/@cucumber/gherkin/src/pickles/compile.ts create mode 100644 node_modules/@cucumber/gherkin/test-cli.mjs create mode 100644 node_modules/@cucumber/gherkin/tsconfig.build-cjs.json create mode 100644 node_modules/@cucumber/gherkin/tsconfig.build-esm.json create mode 100644 node_modules/@cucumber/gherkin/tsconfig.build.json create mode 100644 node_modules/@cucumber/gherkin/tsconfig.esm.json create mode 100644 node_modules/@cucumber/gherkin/tsconfig.json create mode 100644 node_modules/@cucumber/html-formatter/.mocharc.json create mode 100644 node_modules/@cucumber/html-formatter/LICENSE create mode 100644 node_modules/@cucumber/html-formatter/README.md create mode 100644 node_modules/@cucumber/html-formatter/biome.json create mode 100644 node_modules/@cucumber/html-formatter/dist/main.css create mode 100644 node_modules/@cucumber/html-formatter/dist/main.js create mode 100644 node_modules/@cucumber/html-formatter/dist/main.js.LICENSE.txt create mode 100644 node_modules/@cucumber/html-formatter/dist/package.json create mode 100644 node_modules/@cucumber/html-formatter/dist/src/CucumberHtmlStream.d.ts create mode 100644 node_modules/@cucumber/html-formatter/dist/src/CucumberHtmlStream.d.ts.map create mode 100644 node_modules/@cucumber/html-formatter/dist/src/CucumberHtmlStream.js create mode 100644 node_modules/@cucumber/html-formatter/dist/src/CucumberHtmlStream.js.map create mode 100644 node_modules/@cucumber/html-formatter/dist/src/CucumberHtmlStream.spec.d.ts create mode 100644 node_modules/@cucumber/html-formatter/dist/src/CucumberHtmlStream.spec.d.ts.map create mode 100644 node_modules/@cucumber/html-formatter/dist/src/CucumberHtmlStream.spec.js create mode 100644 node_modules/@cucumber/html-formatter/dist/src/CucumberHtmlStream.spec.js.map create mode 100644 node_modules/@cucumber/html-formatter/dist/src/icon.url create mode 100644 node_modules/@cucumber/html-formatter/dist/src/index.d.ts create mode 100644 node_modules/@cucumber/html-formatter/dist/src/index.d.ts.map create mode 100644 node_modules/@cucumber/html-formatter/dist/src/index.js create mode 100644 node_modules/@cucumber/html-formatter/dist/src/index.js.map create mode 100644 node_modules/@cucumber/html-formatter/dist/src/index.mustache create mode 100644 node_modules/@cucumber/html-formatter/dist/src/main.d.ts create mode 100644 node_modules/@cucumber/html-formatter/dist/src/main.d.ts.map create mode 100644 node_modules/@cucumber/html-formatter/dist/src/main.js create mode 100644 node_modules/@cucumber/html-formatter/dist/src/main.js.map create mode 100644 node_modules/@cucumber/html-formatter/dist/src/styles.scss create mode 100644 node_modules/@cucumber/html-formatter/dist/test/acceptance.spec.d.ts create mode 100644 node_modules/@cucumber/html-formatter/dist/test/acceptance.spec.d.ts.map create mode 100644 node_modules/@cucumber/html-formatter/dist/test/acceptance.spec.js create mode 100644 node_modules/@cucumber/html-formatter/dist/test/acceptance.spec.js.map create mode 100644 node_modules/@cucumber/html-formatter/dist/tsconfig.build.tsbuildinfo create mode 100644 node_modules/@cucumber/html-formatter/docker-compose.yml create mode 100644 node_modules/@cucumber/html-formatter/package.json create mode 100644 node_modules/@cucumber/html-formatter/playwright.config.ts create mode 100644 node_modules/@cucumber/html-formatter/src/CucumberHtmlStream.spec.ts create mode 100644 node_modules/@cucumber/html-formatter/src/CucumberHtmlStream.ts create mode 100644 node_modules/@cucumber/html-formatter/src/dummy.css create mode 100644 node_modules/@cucumber/html-formatter/src/dummy.js create mode 100644 node_modules/@cucumber/html-formatter/src/icon.url create mode 100644 node_modules/@cucumber/html-formatter/src/index.mustache create mode 100644 node_modules/@cucumber/html-formatter/src/index.ts create mode 100644 node_modules/@cucumber/html-formatter/src/main.tsx create mode 100644 node_modules/@cucumber/html-formatter/src/styles.scss create mode 100644 node_modules/@cucumber/html-formatter/test/__output__/.gitkeep create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/all-statuses.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/ambiguous.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/attachments.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/backgrounds.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/cdata.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/data-tables.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/doc-strings.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/empty.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/examples-tables-attachment.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/examples-tables-undefined.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/examples-tables.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/failedish-combinations.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/global-hooks-afterall-error.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/global-hooks-attachments.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/global-hooks-beforeall-error.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/global-hooks.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/hooks-attachment.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/hooks-conditional.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/hooks-named.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/hooks-skipped.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/hooks-undefined.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/hooks.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/markdown.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/minimal.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/multiple-features-reversed.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/multiple-features.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/parameter-types.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/pending-exception.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/pending.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/regular-expression.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/retry-ambiguous.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/retry-pending.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/retry-undefined.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/retry.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/rules-backgrounds.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/rules.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/skipped-exception.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/skipped-failing-hook.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/skipped.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/stack-traces.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/test-run-exception.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/undefined.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/unknown-parameter-type.png create mode 100644 node_modules/@cucumber/html-formatter/test/__screenshots__/unused-steps.png create mode 100644 node_modules/@cucumber/html-formatter/test/acceptance.spec.ts create mode 100644 node_modules/@cucumber/html-formatter/test/screenshot.css create mode 100644 node_modules/@cucumber/html-formatter/tsconfig.build.json create mode 100644 node_modules/@cucumber/html-formatter/tsconfig.json create mode 100644 node_modules/@cucumber/html-formatter/webpack.config.js create mode 100644 node_modules/@cucumber/junit-xml-formatter/LICENSE create mode 100644 node_modules/@cucumber/junit-xml-formatter/README.md create mode 100644 node_modules/@cucumber/junit-xml-formatter/dist/JUnitXmlPrinter.d.ts create mode 100644 node_modules/@cucumber/junit-xml-formatter/dist/JUnitXmlPrinter.js create mode 100644 node_modules/@cucumber/junit-xml-formatter/dist/helpers.d.ts create mode 100644 node_modules/@cucumber/junit-xml-formatter/dist/helpers.js create mode 100644 node_modules/@cucumber/junit-xml-formatter/dist/index.d.ts create mode 100644 node_modules/@cucumber/junit-xml-formatter/dist/index.js create mode 100644 node_modules/@cucumber/junit-xml-formatter/dist/plugin.d.ts create mode 100644 node_modules/@cucumber/junit-xml-formatter/dist/plugin.js create mode 100644 node_modules/@cucumber/junit-xml-formatter/dist/tsconfig.build.tsbuildinfo create mode 100644 node_modules/@cucumber/junit-xml-formatter/dist/types.d.ts create mode 100644 node_modules/@cucumber/junit-xml-formatter/dist/types.js create mode 100644 node_modules/@cucumber/junit-xml-formatter/package.json create mode 100644 node_modules/@cucumber/message-streams/LICENSE create mode 100644 node_modules/@cucumber/message-streams/README.md create mode 100644 node_modules/@cucumber/message-streams/dist/src/AttachmentExternalisingStream.d.ts create mode 100644 node_modules/@cucumber/message-streams/dist/src/AttachmentExternalisingStream.js create mode 100644 node_modules/@cucumber/message-streams/dist/src/AttachmentExternalisingStream.spec.d.ts create mode 100644 node_modules/@cucumber/message-streams/dist/src/AttachmentExternalisingStream.spec.js create mode 100644 node_modules/@cucumber/message-streams/dist/src/MessageToNdjsonStream.d.ts create mode 100644 node_modules/@cucumber/message-streams/dist/src/MessageToNdjsonStream.js create mode 100644 node_modules/@cucumber/message-streams/dist/src/NdjsonToMessageStream.d.ts create mode 100644 node_modules/@cucumber/message-streams/dist/src/NdjsonToMessageStream.js create mode 100644 node_modules/@cucumber/message-streams/dist/src/index.d.ts create mode 100644 node_modules/@cucumber/message-streams/dist/src/index.js create mode 100644 node_modules/@cucumber/message-streams/dist/test/toArray.d.ts create mode 100644 node_modules/@cucumber/message-streams/dist/test/toArray.js create mode 100644 node_modules/@cucumber/message-streams/dist/tsconfig.build.tsbuildinfo create mode 100644 node_modules/@cucumber/message-streams/package.json create mode 100644 node_modules/@cucumber/messages/LICENSE create mode 100644 node_modules/@cucumber/messages/README.md create mode 100644 node_modules/@cucumber/messages/dist/cjs/package.json create mode 100644 node_modules/@cucumber/messages/dist/cjs/src/IdGenerator.d.ts create mode 100644 node_modules/@cucumber/messages/dist/cjs/src/IdGenerator.d.ts.map create mode 100644 node_modules/@cucumber/messages/dist/cjs/src/IdGenerator.js create mode 100644 node_modules/@cucumber/messages/dist/cjs/src/IdGenerator.js.map create mode 100644 node_modules/@cucumber/messages/dist/cjs/src/TimeConversion.d.ts create mode 100644 node_modules/@cucumber/messages/dist/cjs/src/TimeConversion.d.ts.map create mode 100644 node_modules/@cucumber/messages/dist/cjs/src/TimeConversion.js create mode 100644 node_modules/@cucumber/messages/dist/cjs/src/TimeConversion.js.map create mode 100644 node_modules/@cucumber/messages/dist/cjs/src/getWorstTestStepResult.d.ts create mode 100644 node_modules/@cucumber/messages/dist/cjs/src/getWorstTestStepResult.d.ts.map create mode 100644 node_modules/@cucumber/messages/dist/cjs/src/getWorstTestStepResult.js create mode 100644 node_modules/@cucumber/messages/dist/cjs/src/getWorstTestStepResult.js.map create mode 100644 node_modules/@cucumber/messages/dist/cjs/src/index.d.ts create mode 100644 node_modules/@cucumber/messages/dist/cjs/src/index.d.ts.map create mode 100644 node_modules/@cucumber/messages/dist/cjs/src/index.js create mode 100644 node_modules/@cucumber/messages/dist/cjs/src/index.js.map create mode 100644 node_modules/@cucumber/messages/dist/cjs/src/messages.d.ts create mode 100644 node_modules/@cucumber/messages/dist/cjs/src/messages.d.ts.map create mode 100644 node_modules/@cucumber/messages/dist/cjs/src/messages.js create mode 100644 node_modules/@cucumber/messages/dist/cjs/src/messages.js.map create mode 100644 node_modules/@cucumber/messages/dist/cjs/src/parseEnvelope.d.ts create mode 100644 node_modules/@cucumber/messages/dist/cjs/src/parseEnvelope.d.ts.map create mode 100644 node_modules/@cucumber/messages/dist/cjs/src/parseEnvelope.js create mode 100644 node_modules/@cucumber/messages/dist/cjs/src/parseEnvelope.js.map create mode 100644 node_modules/@cucumber/messages/dist/cjs/src/version.d.ts create mode 100644 node_modules/@cucumber/messages/dist/cjs/src/version.d.ts.map create mode 100644 node_modules/@cucumber/messages/dist/cjs/src/version.js create mode 100644 node_modules/@cucumber/messages/dist/cjs/src/version.js.map create mode 100644 node_modules/@cucumber/messages/dist/cjs/test/IdGeneratorTest.d.ts create mode 100644 node_modules/@cucumber/messages/dist/cjs/test/IdGeneratorTest.d.ts.map create mode 100644 node_modules/@cucumber/messages/dist/cjs/test/IdGeneratorTest.js create mode 100644 node_modules/@cucumber/messages/dist/cjs/test/IdGeneratorTest.js.map create mode 100644 node_modules/@cucumber/messages/dist/cjs/test/TimeConversionTest.d.ts create mode 100644 node_modules/@cucumber/messages/dist/cjs/test/TimeConversionTest.d.ts.map create mode 100644 node_modules/@cucumber/messages/dist/cjs/test/TimeConversionTest.js create mode 100644 node_modules/@cucumber/messages/dist/cjs/test/TimeConversionTest.js.map create mode 100644 node_modules/@cucumber/messages/dist/cjs/test/getWorstTestStepResultsTest.d.ts create mode 100644 node_modules/@cucumber/messages/dist/cjs/test/getWorstTestStepResultsTest.d.ts.map create mode 100644 node_modules/@cucumber/messages/dist/cjs/test/getWorstTestStepResultsTest.js create mode 100644 node_modules/@cucumber/messages/dist/cjs/test/getWorstTestStepResultsTest.js.map create mode 100644 node_modules/@cucumber/messages/dist/cjs/test/messagesTest.d.ts create mode 100644 node_modules/@cucumber/messages/dist/cjs/test/messagesTest.d.ts.map create mode 100644 node_modules/@cucumber/messages/dist/cjs/test/messagesTest.js create mode 100644 node_modules/@cucumber/messages/dist/cjs/test/messagesTest.js.map create mode 100644 node_modules/@cucumber/messages/dist/cjs/tsconfig.build-cjs.tsbuildinfo create mode 100644 node_modules/@cucumber/messages/dist/esm/src/IdGenerator.d.ts create mode 100644 node_modules/@cucumber/messages/dist/esm/src/IdGenerator.d.ts.map create mode 100644 node_modules/@cucumber/messages/dist/esm/src/IdGenerator.js create mode 100644 node_modules/@cucumber/messages/dist/esm/src/IdGenerator.js.map create mode 100644 node_modules/@cucumber/messages/dist/esm/src/TimeConversion.d.ts create mode 100644 node_modules/@cucumber/messages/dist/esm/src/TimeConversion.d.ts.map create mode 100644 node_modules/@cucumber/messages/dist/esm/src/TimeConversion.js create mode 100644 node_modules/@cucumber/messages/dist/esm/src/TimeConversion.js.map create mode 100644 node_modules/@cucumber/messages/dist/esm/src/getWorstTestStepResult.d.ts create mode 100644 node_modules/@cucumber/messages/dist/esm/src/getWorstTestStepResult.d.ts.map create mode 100644 node_modules/@cucumber/messages/dist/esm/src/getWorstTestStepResult.js create mode 100644 node_modules/@cucumber/messages/dist/esm/src/getWorstTestStepResult.js.map create mode 100644 node_modules/@cucumber/messages/dist/esm/src/index.d.ts create mode 100644 node_modules/@cucumber/messages/dist/esm/src/index.d.ts.map create mode 100644 node_modules/@cucumber/messages/dist/esm/src/index.js create mode 100644 node_modules/@cucumber/messages/dist/esm/src/index.js.map create mode 100644 node_modules/@cucumber/messages/dist/esm/src/messages.d.ts create mode 100644 node_modules/@cucumber/messages/dist/esm/src/messages.d.ts.map create mode 100644 node_modules/@cucumber/messages/dist/esm/src/messages.js create mode 100644 node_modules/@cucumber/messages/dist/esm/src/messages.js.map create mode 100644 node_modules/@cucumber/messages/dist/esm/src/parseEnvelope.d.ts create mode 100644 node_modules/@cucumber/messages/dist/esm/src/parseEnvelope.d.ts.map create mode 100644 node_modules/@cucumber/messages/dist/esm/src/parseEnvelope.js create mode 100644 node_modules/@cucumber/messages/dist/esm/src/parseEnvelope.js.map create mode 100644 node_modules/@cucumber/messages/dist/esm/src/version.d.ts create mode 100644 node_modules/@cucumber/messages/dist/esm/src/version.d.ts.map create mode 100644 node_modules/@cucumber/messages/dist/esm/src/version.js create mode 100644 node_modules/@cucumber/messages/dist/esm/src/version.js.map create mode 100644 node_modules/@cucumber/messages/dist/esm/test/IdGeneratorTest.d.ts create mode 100644 node_modules/@cucumber/messages/dist/esm/test/IdGeneratorTest.d.ts.map create mode 100644 node_modules/@cucumber/messages/dist/esm/test/IdGeneratorTest.js create mode 100644 node_modules/@cucumber/messages/dist/esm/test/IdGeneratorTest.js.map create mode 100644 node_modules/@cucumber/messages/dist/esm/test/TimeConversionTest.d.ts create mode 100644 node_modules/@cucumber/messages/dist/esm/test/TimeConversionTest.d.ts.map create mode 100644 node_modules/@cucumber/messages/dist/esm/test/TimeConversionTest.js create mode 100644 node_modules/@cucumber/messages/dist/esm/test/TimeConversionTest.js.map create mode 100644 node_modules/@cucumber/messages/dist/esm/test/getWorstTestStepResultsTest.d.ts create mode 100644 node_modules/@cucumber/messages/dist/esm/test/getWorstTestStepResultsTest.d.ts.map create mode 100644 node_modules/@cucumber/messages/dist/esm/test/getWorstTestStepResultsTest.js create mode 100644 node_modules/@cucumber/messages/dist/esm/test/getWorstTestStepResultsTest.js.map create mode 100644 node_modules/@cucumber/messages/dist/esm/test/messagesTest.d.ts create mode 100644 node_modules/@cucumber/messages/dist/esm/test/messagesTest.d.ts.map create mode 100644 node_modules/@cucumber/messages/dist/esm/test/messagesTest.js create mode 100644 node_modules/@cucumber/messages/dist/esm/test/messagesTest.js.map create mode 100644 node_modules/@cucumber/messages/dist/esm/tsconfig.build-esm.tsbuildinfo create mode 100644 node_modules/@cucumber/messages/messages.schema.json create mode 100644 node_modules/@cucumber/messages/package.json create mode 100644 node_modules/@cucumber/pretty-formatter/LICENSE create mode 100644 node_modules/@cucumber/pretty-formatter/README.md create mode 100644 node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.d.ts create mode 100644 node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.d.ts.map create mode 100644 node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.js create mode 100644 node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.js.map create mode 100644 node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.spec.d.ts create mode 100644 node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.spec.d.ts.map create mode 100644 node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.spec.js create mode 100644 node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.spec.js.map create mode 100644 node_modules/@cucumber/pretty-formatter/lib/src/index.d.ts create mode 100644 node_modules/@cucumber/pretty-formatter/lib/src/index.d.ts.map create mode 100644 node_modules/@cucumber/pretty-formatter/lib/src/index.js create mode 100644 node_modules/@cucumber/pretty-formatter/lib/src/index.js.map create mode 100644 node_modules/@cucumber/pretty-formatter/lib/src/styleText.d.ts create mode 100644 node_modules/@cucumber/pretty-formatter/lib/src/styleText.d.ts.map create mode 100644 node_modules/@cucumber/pretty-formatter/lib/src/styleText.js create mode 100644 node_modules/@cucumber/pretty-formatter/lib/src/styleText.js.map create mode 100644 node_modules/@cucumber/pretty-formatter/lib/src/styleText.spec.d.ts create mode 100644 node_modules/@cucumber/pretty-formatter/lib/src/styleText.spec.d.ts.map create mode 100644 node_modules/@cucumber/pretty-formatter/lib/src/styleText.spec.js create mode 100644 node_modules/@cucumber/pretty-formatter/lib/src/styleText.spec.js.map create mode 100644 node_modules/@cucumber/pretty-formatter/lib/src/theme.d.ts create mode 100644 node_modules/@cucumber/pretty-formatter/lib/src/theme.d.ts.map create mode 100644 node_modules/@cucumber/pretty-formatter/lib/src/theme.js create mode 100644 node_modules/@cucumber/pretty-formatter/lib/src/theme.js.map create mode 100644 node_modules/@cucumber/pretty-formatter/lib/src/theme.spec.d.ts create mode 100644 node_modules/@cucumber/pretty-formatter/lib/src/theme.spec.d.ts.map create mode 100644 node_modules/@cucumber/pretty-formatter/lib/src/theme.spec.js create mode 100644 node_modules/@cucumber/pretty-formatter/lib/src/theme.spec.js.map create mode 100644 node_modules/@cucumber/pretty-formatter/package.json create mode 100644 node_modules/@cucumber/query/.mocharc.json create mode 100644 node_modules/@cucumber/query/.prettierrc.json create mode 100644 node_modules/@cucumber/query/LICENSE create mode 100644 node_modules/@cucumber/query/dist/src/Lineage.d.ts create mode 100644 node_modules/@cucumber/query/dist/src/Lineage.d.ts.map create mode 100644 node_modules/@cucumber/query/dist/src/Lineage.js create mode 100644 node_modules/@cucumber/query/dist/src/Lineage.js.map create mode 100644 node_modules/@cucumber/query/dist/src/Query.d.ts create mode 100644 node_modules/@cucumber/query/dist/src/Query.d.ts.map create mode 100644 node_modules/@cucumber/query/dist/src/Query.js create mode 100644 node_modules/@cucumber/query/dist/src/Query.js.map create mode 100644 node_modules/@cucumber/query/dist/src/helpers.d.ts create mode 100644 node_modules/@cucumber/query/dist/src/helpers.d.ts.map create mode 100644 node_modules/@cucumber/query/dist/src/helpers.js create mode 100644 node_modules/@cucumber/query/dist/src/helpers.js.map create mode 100644 node_modules/@cucumber/query/dist/src/index.d.ts create mode 100644 node_modules/@cucumber/query/dist/src/index.d.ts.map create mode 100644 node_modules/@cucumber/query/dist/src/index.js create mode 100644 node_modules/@cucumber/query/dist/src/index.js.map create mode 100644 node_modules/@cucumber/query/dist/tsconfig.build.tsbuildinfo create mode 100644 node_modules/@cucumber/query/eslint.config.mjs create mode 100644 node_modules/@cucumber/query/package.json create mode 100644 node_modules/@cucumber/query/src/Lineage.ts create mode 100644 node_modules/@cucumber/query/src/Query.spec.ts create mode 100644 node_modules/@cucumber/query/src/Query.ts create mode 100644 node_modules/@cucumber/query/src/acceptance.spec.ts create mode 100644 node_modules/@cucumber/query/src/helpers.ts create mode 100644 node_modules/@cucumber/query/src/index.ts create mode 100644 node_modules/@cucumber/query/tsconfig.base.json create mode 100644 node_modules/@cucumber/query/tsconfig.build.json create mode 100644 node_modules/@cucumber/query/tsconfig.json create mode 100644 node_modules/@cucumber/tag-expressions/LICENSE create mode 100644 node_modules/@cucumber/tag-expressions/README.md create mode 100644 node_modules/@cucumber/tag-expressions/dist/cjs/package.json create mode 100644 node_modules/@cucumber/tag-expressions/dist/cjs/src/index.d.ts create mode 100644 node_modules/@cucumber/tag-expressions/dist/cjs/src/index.d.ts.map create mode 100644 node_modules/@cucumber/tag-expressions/dist/cjs/src/index.js create mode 100644 node_modules/@cucumber/tag-expressions/dist/cjs/src/index.js.map create mode 100644 node_modules/@cucumber/tag-expressions/dist/cjs/test/errors.test.d.ts create mode 100644 node_modules/@cucumber/tag-expressions/dist/cjs/test/errors.test.d.ts.map create mode 100644 node_modules/@cucumber/tag-expressions/dist/cjs/test/errors.test.js create mode 100644 node_modules/@cucumber/tag-expressions/dist/cjs/test/errors.test.js.map create mode 100644 node_modules/@cucumber/tag-expressions/dist/cjs/test/evaluations.test.d.ts create mode 100644 node_modules/@cucumber/tag-expressions/dist/cjs/test/evaluations.test.d.ts.map create mode 100644 node_modules/@cucumber/tag-expressions/dist/cjs/test/evaluations.test.js create mode 100644 node_modules/@cucumber/tag-expressions/dist/cjs/test/evaluations.test.js.map create mode 100644 node_modules/@cucumber/tag-expressions/dist/cjs/test/parsing.test.d.ts create mode 100644 node_modules/@cucumber/tag-expressions/dist/cjs/test/parsing.test.d.ts.map create mode 100644 node_modules/@cucumber/tag-expressions/dist/cjs/test/parsing.test.js create mode 100644 node_modules/@cucumber/tag-expressions/dist/cjs/test/parsing.test.js.map create mode 100644 node_modules/@cucumber/tag-expressions/dist/cjs/test/testDataDir.d.ts create mode 100644 node_modules/@cucumber/tag-expressions/dist/cjs/test/testDataDir.d.ts.map create mode 100644 node_modules/@cucumber/tag-expressions/dist/cjs/test/testDataDir.js create mode 100644 node_modules/@cucumber/tag-expressions/dist/cjs/test/testDataDir.js.map create mode 100644 node_modules/@cucumber/tag-expressions/dist/cjs/tsconfig.build-cjs.tsbuildinfo create mode 100644 node_modules/@cucumber/tag-expressions/dist/esm/src/index.d.ts create mode 100644 node_modules/@cucumber/tag-expressions/dist/esm/src/index.d.ts.map create mode 100644 node_modules/@cucumber/tag-expressions/dist/esm/src/index.js create mode 100644 node_modules/@cucumber/tag-expressions/dist/esm/src/index.js.map create mode 100644 node_modules/@cucumber/tag-expressions/dist/esm/test/errors.test.d.ts create mode 100644 node_modules/@cucumber/tag-expressions/dist/esm/test/errors.test.d.ts.map create mode 100644 node_modules/@cucumber/tag-expressions/dist/esm/test/errors.test.js create mode 100644 node_modules/@cucumber/tag-expressions/dist/esm/test/errors.test.js.map create mode 100644 node_modules/@cucumber/tag-expressions/dist/esm/test/evaluations.test.d.ts create mode 100644 node_modules/@cucumber/tag-expressions/dist/esm/test/evaluations.test.d.ts.map create mode 100644 node_modules/@cucumber/tag-expressions/dist/esm/test/evaluations.test.js create mode 100644 node_modules/@cucumber/tag-expressions/dist/esm/test/evaluations.test.js.map create mode 100644 node_modules/@cucumber/tag-expressions/dist/esm/test/parsing.test.d.ts create mode 100644 node_modules/@cucumber/tag-expressions/dist/esm/test/parsing.test.d.ts.map create mode 100644 node_modules/@cucumber/tag-expressions/dist/esm/test/parsing.test.js create mode 100644 node_modules/@cucumber/tag-expressions/dist/esm/test/parsing.test.js.map create mode 100644 node_modules/@cucumber/tag-expressions/dist/esm/test/testDataDir.d.ts create mode 100644 node_modules/@cucumber/tag-expressions/dist/esm/test/testDataDir.d.ts.map create mode 100644 node_modules/@cucumber/tag-expressions/dist/esm/test/testDataDir.js create mode 100644 node_modules/@cucumber/tag-expressions/dist/esm/test/testDataDir.js.map create mode 100644 node_modules/@cucumber/tag-expressions/dist/esm/tsconfig.build-esm.tsbuildinfo create mode 100644 node_modules/@cucumber/tag-expressions/package.json create mode 100644 node_modules/@playwright/test/LICENSE create mode 100644 node_modules/@playwright/test/NOTICE create mode 100644 node_modules/@playwright/test/README.md create mode 100644 node_modules/@playwright/test/cli.js create mode 100644 node_modules/@playwright/test/index.d.ts create mode 100644 node_modules/@playwright/test/index.js create mode 100644 node_modules/@playwright/test/index.mjs create mode 100644 node_modules/@playwright/test/package.json create mode 100644 node_modules/@playwright/test/reporter.d.ts create mode 100644 node_modules/@playwright/test/reporter.js create mode 100644 node_modules/@playwright/test/reporter.mjs create mode 100644 node_modules/@teppeis/multimaps/README.md create mode 100644 node_modules/@teppeis/multimaps/dist/cjs/arraymultimap.d.ts create mode 100644 node_modules/@teppeis/multimaps/dist/cjs/arraymultimap.js create mode 100644 node_modules/@teppeis/multimaps/dist/cjs/index.d.ts create mode 100644 node_modules/@teppeis/multimaps/dist/cjs/index.js create mode 100644 node_modules/@teppeis/multimaps/dist/cjs/multimap.d.ts create mode 100644 node_modules/@teppeis/multimaps/dist/cjs/multimap.js create mode 100644 node_modules/@teppeis/multimaps/dist/cjs/package.json create mode 100644 node_modules/@teppeis/multimaps/dist/cjs/setmultimap.d.ts create mode 100644 node_modules/@teppeis/multimaps/dist/cjs/setmultimap.js create mode 100644 node_modules/@teppeis/multimaps/dist/esm/arraymultimap.d.ts create mode 100644 node_modules/@teppeis/multimaps/dist/esm/arraymultimap.js create mode 100644 node_modules/@teppeis/multimaps/dist/esm/index.d.ts create mode 100644 node_modules/@teppeis/multimaps/dist/esm/index.js create mode 100644 node_modules/@teppeis/multimaps/dist/esm/multimap.d.ts create mode 100644 node_modules/@teppeis/multimaps/dist/esm/multimap.js create mode 100644 node_modules/@teppeis/multimaps/dist/esm/setmultimap.d.ts create mode 100644 node_modules/@teppeis/multimaps/dist/esm/setmultimap.js create mode 100644 node_modules/@teppeis/multimaps/package.json create mode 100644 node_modules/@types/normalize-package-data/LICENSE create mode 100644 node_modules/@types/normalize-package-data/README.md create mode 100644 node_modules/@types/normalize-package-data/index.d.ts create mode 100644 node_modules/@types/normalize-package-data/package.json create mode 100644 node_modules/ansi-regex/index.js create mode 100644 node_modules/ansi-regex/license create mode 100644 node_modules/ansi-regex/package.json create mode 100644 node_modules/ansi-regex/readme.md create mode 100644 node_modules/ansi-styles/index.d.ts create mode 100644 node_modules/ansi-styles/index.js create mode 100644 node_modules/ansi-styles/license create mode 100644 node_modules/ansi-styles/package.json create mode 100644 node_modules/ansi-styles/readme.md create mode 100644 node_modules/any-promise/.jshintrc create mode 100644 node_modules/any-promise/.npmignore create mode 100644 node_modules/any-promise/LICENSE create mode 100644 node_modules/any-promise/README.md create mode 100644 node_modules/any-promise/implementation.d.ts create mode 100644 node_modules/any-promise/implementation.js create mode 100644 node_modules/any-promise/index.d.ts create mode 100644 node_modules/any-promise/index.js create mode 100644 node_modules/any-promise/loader.js create mode 100644 node_modules/any-promise/optional.js create mode 100644 node_modules/any-promise/package.json create mode 100644 node_modules/any-promise/register-shim.js create mode 100644 node_modules/any-promise/register.d.ts create mode 100644 node_modules/any-promise/register.js create mode 100644 node_modules/any-promise/register/bluebird.d.ts create mode 100644 node_modules/any-promise/register/bluebird.js create mode 100644 node_modules/any-promise/register/es6-promise.d.ts create mode 100644 node_modules/any-promise/register/es6-promise.js create mode 100644 node_modules/any-promise/register/lie.d.ts create mode 100644 node_modules/any-promise/register/lie.js create mode 100644 node_modules/any-promise/register/native-promise-only.d.ts create mode 100644 node_modules/any-promise/register/native-promise-only.js create mode 100644 node_modules/any-promise/register/pinkie.d.ts create mode 100644 node_modules/any-promise/register/pinkie.js create mode 100644 node_modules/any-promise/register/promise.d.ts create mode 100644 node_modules/any-promise/register/promise.js create mode 100644 node_modules/any-promise/register/q.d.ts create mode 100644 node_modules/any-promise/register/q.js create mode 100644 node_modules/any-promise/register/rsvp.d.ts create mode 100644 node_modules/any-promise/register/rsvp.js create mode 100644 node_modules/any-promise/register/vow.d.ts create mode 100644 node_modules/any-promise/register/vow.js create mode 100644 node_modules/any-promise/register/when.d.ts create mode 100644 node_modules/any-promise/register/when.js create mode 100644 node_modules/assertion-error-formatter/CHANGELOG.md create mode 100644 node_modules/assertion-error-formatter/LICENSE create mode 100644 node_modules/assertion-error-formatter/README.md create mode 100644 node_modules/assertion-error-formatter/lib/helpers/canonicalize.js create mode 100644 node_modules/assertion-error-formatter/lib/helpers/canonicalize_test.js create mode 100644 node_modules/assertion-error-formatter/lib/helpers/has_property.js create mode 100644 node_modules/assertion-error-formatter/lib/helpers/inline_diff.js create mode 100644 node_modules/assertion-error-formatter/lib/helpers/json_stringify.js create mode 100644 node_modules/assertion-error-formatter/lib/helpers/stringify.js create mode 100644 node_modules/assertion-error-formatter/lib/helpers/stringify_test.js create mode 100644 node_modules/assertion-error-formatter/lib/helpers/type.js create mode 100644 node_modules/assertion-error-formatter/lib/helpers/type_test.js create mode 100644 node_modules/assertion-error-formatter/lib/helpers/unified_diff.js create mode 100644 node_modules/assertion-error-formatter/lib/index.js create mode 100644 node_modules/assertion-error-formatter/lib/index_test.js create mode 100644 node_modules/assertion-error-formatter/package.json create mode 100644 node_modules/balanced-match/LICENSE.md create mode 100644 node_modules/balanced-match/README.md create mode 100644 node_modules/balanced-match/dist/commonjs/index.d.ts create mode 100644 node_modules/balanced-match/dist/commonjs/index.d.ts.map create mode 100644 node_modules/balanced-match/dist/commonjs/index.js create mode 100644 node_modules/balanced-match/dist/commonjs/index.js.map create mode 100644 node_modules/balanced-match/dist/commonjs/package.json create mode 100644 node_modules/balanced-match/dist/esm/index.d.ts create mode 100644 node_modules/balanced-match/dist/esm/index.d.ts.map create mode 100644 node_modules/balanced-match/dist/esm/index.js create mode 100644 node_modules/balanced-match/dist/esm/index.js.map create mode 100644 node_modules/balanced-match/dist/esm/package.json create mode 100644 node_modules/balanced-match/package.json create mode 100644 node_modules/brace-expansion/LICENSE create mode 100644 node_modules/brace-expansion/README.md create mode 100644 node_modules/brace-expansion/dist/commonjs/index.d.ts create mode 100644 node_modules/brace-expansion/dist/commonjs/index.d.ts.map create mode 100644 node_modules/brace-expansion/dist/commonjs/index.js create mode 100644 node_modules/brace-expansion/dist/commonjs/index.js.map create mode 100644 node_modules/brace-expansion/dist/commonjs/package.json create mode 100644 node_modules/brace-expansion/dist/esm/index.d.ts create mode 100644 node_modules/brace-expansion/dist/esm/index.d.ts.map create mode 100644 node_modules/brace-expansion/dist/esm/index.js create mode 100644 node_modules/brace-expansion/dist/esm/index.js.map create mode 100644 node_modules/brace-expansion/dist/esm/package.json create mode 100644 node_modules/brace-expansion/package.json create mode 100644 node_modules/buffer-from/LICENSE create mode 100644 node_modules/buffer-from/index.js create mode 100644 node_modules/buffer-from/package.json create mode 100644 node_modules/buffer-from/readme.md create mode 100644 node_modules/capital-case/LICENSE create mode 100644 node_modules/capital-case/README.md create mode 100644 node_modules/capital-case/dist.es2015/index.d.ts create mode 100644 node_modules/capital-case/dist.es2015/index.js create mode 100644 node_modules/capital-case/dist.es2015/index.js.map create mode 100644 node_modules/capital-case/dist.es2015/index.spec.d.ts create mode 100644 node_modules/capital-case/dist.es2015/index.spec.js create mode 100644 node_modules/capital-case/dist.es2015/index.spec.js.map create mode 100644 node_modules/capital-case/dist/index.d.ts create mode 100644 node_modules/capital-case/dist/index.js create mode 100644 node_modules/capital-case/dist/index.js.map create mode 100644 node_modules/capital-case/dist/index.spec.d.ts create mode 100644 node_modules/capital-case/dist/index.spec.js create mode 100644 node_modules/capital-case/dist/index.spec.js.map create mode 100644 node_modules/capital-case/package.json create mode 100644 node_modules/chalk/index.d.ts create mode 100644 node_modules/chalk/license create mode 100644 node_modules/chalk/node_modules/ansi-styles/index.d.ts create mode 100644 node_modules/chalk/node_modules/ansi-styles/index.js create mode 100644 node_modules/chalk/node_modules/ansi-styles/license create mode 100644 node_modules/chalk/node_modules/ansi-styles/package.json create mode 100644 node_modules/chalk/node_modules/ansi-styles/readme.md create mode 100644 node_modules/chalk/node_modules/supports-color/browser.js create mode 100644 node_modules/chalk/node_modules/supports-color/index.js create mode 100644 node_modules/chalk/node_modules/supports-color/license create mode 100644 node_modules/chalk/node_modules/supports-color/package.json create mode 100644 node_modules/chalk/node_modules/supports-color/readme.md create mode 100644 node_modules/chalk/package.json create mode 100644 node_modules/chalk/readme.md create mode 100644 node_modules/chalk/source/index.js create mode 100644 node_modules/chalk/source/templates.js create mode 100644 node_modules/chalk/source/util.js create mode 100644 node_modules/class-transformer/LICENSE create mode 100644 node_modules/class-transformer/README.md create mode 100644 node_modules/class-transformer/bundles/class-transformer.umd.js create mode 100644 node_modules/class-transformer/bundles/class-transformer.umd.js.map create mode 100644 node_modules/class-transformer/bundles/class-transformer.umd.min.js create mode 100644 node_modules/class-transformer/bundles/class-transformer.umd.min.js.map create mode 100644 node_modules/class-transformer/cjs/ClassTransformer.js create mode 100644 node_modules/class-transformer/cjs/ClassTransformer.js.map create mode 100644 node_modules/class-transformer/cjs/MetadataStorage.js create mode 100644 node_modules/class-transformer/cjs/MetadataStorage.js.map create mode 100644 node_modules/class-transformer/cjs/TransformOperationExecutor.js create mode 100644 node_modules/class-transformer/cjs/TransformOperationExecutor.js.map create mode 100644 node_modules/class-transformer/cjs/constants/default-options.constant.js create mode 100644 node_modules/class-transformer/cjs/constants/default-options.constant.js.map create mode 100644 node_modules/class-transformer/cjs/decorators/exclude.decorator.js create mode 100644 node_modules/class-transformer/cjs/decorators/exclude.decorator.js.map create mode 100644 node_modules/class-transformer/cjs/decorators/expose.decorator.js create mode 100644 node_modules/class-transformer/cjs/decorators/expose.decorator.js.map create mode 100644 node_modules/class-transformer/cjs/decorators/index.js create mode 100644 node_modules/class-transformer/cjs/decorators/index.js.map create mode 100644 node_modules/class-transformer/cjs/decorators/transform-instance-to-instance.decorator.js create mode 100644 node_modules/class-transformer/cjs/decorators/transform-instance-to-instance.decorator.js.map create mode 100644 node_modules/class-transformer/cjs/decorators/transform-instance-to-plain.decorator.js create mode 100644 node_modules/class-transformer/cjs/decorators/transform-instance-to-plain.decorator.js.map create mode 100644 node_modules/class-transformer/cjs/decorators/transform-plain-to-instance.decorator.js create mode 100644 node_modules/class-transformer/cjs/decorators/transform-plain-to-instance.decorator.js.map create mode 100644 node_modules/class-transformer/cjs/decorators/transform.decorator.js create mode 100644 node_modules/class-transformer/cjs/decorators/transform.decorator.js.map create mode 100644 node_modules/class-transformer/cjs/decorators/type.decorator.js create mode 100644 node_modules/class-transformer/cjs/decorators/type.decorator.js.map create mode 100644 node_modules/class-transformer/cjs/enums/index.js create mode 100644 node_modules/class-transformer/cjs/enums/index.js.map create mode 100644 node_modules/class-transformer/cjs/enums/transformation-type.enum.js create mode 100644 node_modules/class-transformer/cjs/enums/transformation-type.enum.js.map create mode 100644 node_modules/class-transformer/cjs/index.js create mode 100644 node_modules/class-transformer/cjs/index.js.map create mode 100644 node_modules/class-transformer/cjs/interfaces/class-constructor.type.js create mode 100644 node_modules/class-transformer/cjs/interfaces/class-constructor.type.js.map create mode 100644 node_modules/class-transformer/cjs/interfaces/class-transformer-options.interface.js create mode 100644 node_modules/class-transformer/cjs/interfaces/class-transformer-options.interface.js.map create mode 100644 node_modules/class-transformer/cjs/interfaces/decorator-options/exclude-options.interface.js create mode 100644 node_modules/class-transformer/cjs/interfaces/decorator-options/exclude-options.interface.js.map create mode 100644 node_modules/class-transformer/cjs/interfaces/decorator-options/expose-options.interface.js create mode 100644 node_modules/class-transformer/cjs/interfaces/decorator-options/expose-options.interface.js.map create mode 100644 node_modules/class-transformer/cjs/interfaces/decorator-options/transform-options.interface.js create mode 100644 node_modules/class-transformer/cjs/interfaces/decorator-options/transform-options.interface.js.map create mode 100644 node_modules/class-transformer/cjs/interfaces/decorator-options/type-discriminator-descriptor.interface.js create mode 100644 node_modules/class-transformer/cjs/interfaces/decorator-options/type-discriminator-descriptor.interface.js.map create mode 100644 node_modules/class-transformer/cjs/interfaces/decorator-options/type-options.interface.js create mode 100644 node_modules/class-transformer/cjs/interfaces/decorator-options/type-options.interface.js.map create mode 100644 node_modules/class-transformer/cjs/interfaces/index.js create mode 100644 node_modules/class-transformer/cjs/interfaces/index.js.map create mode 100644 node_modules/class-transformer/cjs/interfaces/metadata/exclude-metadata.interface.js create mode 100644 node_modules/class-transformer/cjs/interfaces/metadata/exclude-metadata.interface.js.map create mode 100644 node_modules/class-transformer/cjs/interfaces/metadata/expose-metadata.interface.js create mode 100644 node_modules/class-transformer/cjs/interfaces/metadata/expose-metadata.interface.js.map create mode 100644 node_modules/class-transformer/cjs/interfaces/metadata/transform-fn-params.interface.js create mode 100644 node_modules/class-transformer/cjs/interfaces/metadata/transform-fn-params.interface.js.map create mode 100644 node_modules/class-transformer/cjs/interfaces/metadata/transform-metadata.interface.js create mode 100644 node_modules/class-transformer/cjs/interfaces/metadata/transform-metadata.interface.js.map create mode 100644 node_modules/class-transformer/cjs/interfaces/metadata/type-metadata.interface.js create mode 100644 node_modules/class-transformer/cjs/interfaces/metadata/type-metadata.interface.js.map create mode 100644 node_modules/class-transformer/cjs/interfaces/target-map.interface.js create mode 100644 node_modules/class-transformer/cjs/interfaces/target-map.interface.js.map create mode 100644 node_modules/class-transformer/cjs/interfaces/type-help-options.interface.js create mode 100644 node_modules/class-transformer/cjs/interfaces/type-help-options.interface.js.map create mode 100644 node_modules/class-transformer/cjs/storage.js create mode 100644 node_modules/class-transformer/cjs/storage.js.map create mode 100644 node_modules/class-transformer/cjs/utils/get-global.util.js create mode 100644 node_modules/class-transformer/cjs/utils/get-global.util.js.map create mode 100644 node_modules/class-transformer/cjs/utils/get-global.util.spect.js create mode 100644 node_modules/class-transformer/cjs/utils/get-global.util.spect.js.map create mode 100644 node_modules/class-transformer/cjs/utils/index.js create mode 100644 node_modules/class-transformer/cjs/utils/index.js.map create mode 100644 node_modules/class-transformer/cjs/utils/is-promise.util.js create mode 100644 node_modules/class-transformer/cjs/utils/is-promise.util.js.map create mode 100644 node_modules/class-transformer/esm2015/ClassTransformer.js create mode 100644 node_modules/class-transformer/esm2015/ClassTransformer.js.map create mode 100644 node_modules/class-transformer/esm2015/MetadataStorage.js create mode 100644 node_modules/class-transformer/esm2015/MetadataStorage.js.map create mode 100644 node_modules/class-transformer/esm2015/TransformOperationExecutor.js create mode 100644 node_modules/class-transformer/esm2015/TransformOperationExecutor.js.map create mode 100644 node_modules/class-transformer/esm2015/constants/default-options.constant.js create mode 100644 node_modules/class-transformer/esm2015/constants/default-options.constant.js.map create mode 100644 node_modules/class-transformer/esm2015/decorators/exclude.decorator.js create mode 100644 node_modules/class-transformer/esm2015/decorators/exclude.decorator.js.map create mode 100644 node_modules/class-transformer/esm2015/decorators/expose.decorator.js create mode 100644 node_modules/class-transformer/esm2015/decorators/expose.decorator.js.map create mode 100644 node_modules/class-transformer/esm2015/decorators/index.js create mode 100644 node_modules/class-transformer/esm2015/decorators/index.js.map create mode 100644 node_modules/class-transformer/esm2015/decorators/transform-instance-to-instance.decorator.js create mode 100644 node_modules/class-transformer/esm2015/decorators/transform-instance-to-instance.decorator.js.map create mode 100644 node_modules/class-transformer/esm2015/decorators/transform-instance-to-plain.decorator.js create mode 100644 node_modules/class-transformer/esm2015/decorators/transform-instance-to-plain.decorator.js.map create mode 100644 node_modules/class-transformer/esm2015/decorators/transform-plain-to-instance.decorator.js create mode 100644 node_modules/class-transformer/esm2015/decorators/transform-plain-to-instance.decorator.js.map create mode 100644 node_modules/class-transformer/esm2015/decorators/transform.decorator.js create mode 100644 node_modules/class-transformer/esm2015/decorators/transform.decorator.js.map create mode 100644 node_modules/class-transformer/esm2015/decorators/type.decorator.js create mode 100644 node_modules/class-transformer/esm2015/decorators/type.decorator.js.map create mode 100644 node_modules/class-transformer/esm2015/enums/index.js create mode 100644 node_modules/class-transformer/esm2015/enums/index.js.map create mode 100644 node_modules/class-transformer/esm2015/enums/transformation-type.enum.js create mode 100644 node_modules/class-transformer/esm2015/enums/transformation-type.enum.js.map create mode 100644 node_modules/class-transformer/esm2015/index.js create mode 100644 node_modules/class-transformer/esm2015/index.js.map create mode 100644 node_modules/class-transformer/esm2015/interfaces/class-constructor.type.js create mode 100644 node_modules/class-transformer/esm2015/interfaces/class-constructor.type.js.map create mode 100644 node_modules/class-transformer/esm2015/interfaces/class-transformer-options.interface.js create mode 100644 node_modules/class-transformer/esm2015/interfaces/class-transformer-options.interface.js.map create mode 100644 node_modules/class-transformer/esm2015/interfaces/decorator-options/exclude-options.interface.js create mode 100644 node_modules/class-transformer/esm2015/interfaces/decorator-options/exclude-options.interface.js.map create mode 100644 node_modules/class-transformer/esm2015/interfaces/decorator-options/expose-options.interface.js create mode 100644 node_modules/class-transformer/esm2015/interfaces/decorator-options/expose-options.interface.js.map create mode 100644 node_modules/class-transformer/esm2015/interfaces/decorator-options/transform-options.interface.js create mode 100644 node_modules/class-transformer/esm2015/interfaces/decorator-options/transform-options.interface.js.map create mode 100644 node_modules/class-transformer/esm2015/interfaces/decorator-options/type-discriminator-descriptor.interface.js create mode 100644 node_modules/class-transformer/esm2015/interfaces/decorator-options/type-discriminator-descriptor.interface.js.map create mode 100644 node_modules/class-transformer/esm2015/interfaces/decorator-options/type-options.interface.js create mode 100644 node_modules/class-transformer/esm2015/interfaces/decorator-options/type-options.interface.js.map create mode 100644 node_modules/class-transformer/esm2015/interfaces/index.js create mode 100644 node_modules/class-transformer/esm2015/interfaces/index.js.map create mode 100644 node_modules/class-transformer/esm2015/interfaces/metadata/exclude-metadata.interface.js create mode 100644 node_modules/class-transformer/esm2015/interfaces/metadata/exclude-metadata.interface.js.map create mode 100644 node_modules/class-transformer/esm2015/interfaces/metadata/expose-metadata.interface.js create mode 100644 node_modules/class-transformer/esm2015/interfaces/metadata/expose-metadata.interface.js.map create mode 100644 node_modules/class-transformer/esm2015/interfaces/metadata/transform-fn-params.interface.js create mode 100644 node_modules/class-transformer/esm2015/interfaces/metadata/transform-fn-params.interface.js.map create mode 100644 node_modules/class-transformer/esm2015/interfaces/metadata/transform-metadata.interface.js create mode 100644 node_modules/class-transformer/esm2015/interfaces/metadata/transform-metadata.interface.js.map create mode 100644 node_modules/class-transformer/esm2015/interfaces/metadata/type-metadata.interface.js create mode 100644 node_modules/class-transformer/esm2015/interfaces/metadata/type-metadata.interface.js.map create mode 100644 node_modules/class-transformer/esm2015/interfaces/target-map.interface.js create mode 100644 node_modules/class-transformer/esm2015/interfaces/target-map.interface.js.map create mode 100644 node_modules/class-transformer/esm2015/interfaces/type-help-options.interface.js create mode 100644 node_modules/class-transformer/esm2015/interfaces/type-help-options.interface.js.map create mode 100644 node_modules/class-transformer/esm2015/storage.js create mode 100644 node_modules/class-transformer/esm2015/storage.js.map create mode 100644 node_modules/class-transformer/esm2015/utils/get-global.util.js create mode 100644 node_modules/class-transformer/esm2015/utils/get-global.util.js.map create mode 100644 node_modules/class-transformer/esm2015/utils/get-global.util.spect.js create mode 100644 node_modules/class-transformer/esm2015/utils/get-global.util.spect.js.map create mode 100644 node_modules/class-transformer/esm2015/utils/index.js create mode 100644 node_modules/class-transformer/esm2015/utils/index.js.map create mode 100644 node_modules/class-transformer/esm2015/utils/is-promise.util.js create mode 100644 node_modules/class-transformer/esm2015/utils/is-promise.util.js.map create mode 100644 node_modules/class-transformer/esm5/ClassTransformer.js create mode 100644 node_modules/class-transformer/esm5/ClassTransformer.js.map create mode 100644 node_modules/class-transformer/esm5/MetadataStorage.js create mode 100644 node_modules/class-transformer/esm5/MetadataStorage.js.map create mode 100644 node_modules/class-transformer/esm5/TransformOperationExecutor.js create mode 100644 node_modules/class-transformer/esm5/TransformOperationExecutor.js.map create mode 100644 node_modules/class-transformer/esm5/constants/default-options.constant.js create mode 100644 node_modules/class-transformer/esm5/constants/default-options.constant.js.map create mode 100644 node_modules/class-transformer/esm5/decorators/exclude.decorator.js create mode 100644 node_modules/class-transformer/esm5/decorators/exclude.decorator.js.map create mode 100644 node_modules/class-transformer/esm5/decorators/expose.decorator.js create mode 100644 node_modules/class-transformer/esm5/decorators/expose.decorator.js.map create mode 100644 node_modules/class-transformer/esm5/decorators/index.js create mode 100644 node_modules/class-transformer/esm5/decorators/index.js.map create mode 100644 node_modules/class-transformer/esm5/decorators/transform-instance-to-instance.decorator.js create mode 100644 node_modules/class-transformer/esm5/decorators/transform-instance-to-instance.decorator.js.map create mode 100644 node_modules/class-transformer/esm5/decorators/transform-instance-to-plain.decorator.js create mode 100644 node_modules/class-transformer/esm5/decorators/transform-instance-to-plain.decorator.js.map create mode 100644 node_modules/class-transformer/esm5/decorators/transform-plain-to-instance.decorator.js create mode 100644 node_modules/class-transformer/esm5/decorators/transform-plain-to-instance.decorator.js.map create mode 100644 node_modules/class-transformer/esm5/decorators/transform.decorator.js create mode 100644 node_modules/class-transformer/esm5/decorators/transform.decorator.js.map create mode 100644 node_modules/class-transformer/esm5/decorators/type.decorator.js create mode 100644 node_modules/class-transformer/esm5/decorators/type.decorator.js.map create mode 100644 node_modules/class-transformer/esm5/enums/index.js create mode 100644 node_modules/class-transformer/esm5/enums/index.js.map create mode 100644 node_modules/class-transformer/esm5/enums/transformation-type.enum.js create mode 100644 node_modules/class-transformer/esm5/enums/transformation-type.enum.js.map create mode 100644 node_modules/class-transformer/esm5/index.js create mode 100644 node_modules/class-transformer/esm5/index.js.map create mode 100644 node_modules/class-transformer/esm5/interfaces/class-constructor.type.js create mode 100644 node_modules/class-transformer/esm5/interfaces/class-constructor.type.js.map create mode 100644 node_modules/class-transformer/esm5/interfaces/class-transformer-options.interface.js create mode 100644 node_modules/class-transformer/esm5/interfaces/class-transformer-options.interface.js.map create mode 100644 node_modules/class-transformer/esm5/interfaces/decorator-options/exclude-options.interface.js create mode 100644 node_modules/class-transformer/esm5/interfaces/decorator-options/exclude-options.interface.js.map create mode 100644 node_modules/class-transformer/esm5/interfaces/decorator-options/expose-options.interface.js create mode 100644 node_modules/class-transformer/esm5/interfaces/decorator-options/expose-options.interface.js.map create mode 100644 node_modules/class-transformer/esm5/interfaces/decorator-options/transform-options.interface.js create mode 100644 node_modules/class-transformer/esm5/interfaces/decorator-options/transform-options.interface.js.map create mode 100644 node_modules/class-transformer/esm5/interfaces/decorator-options/type-discriminator-descriptor.interface.js create mode 100644 node_modules/class-transformer/esm5/interfaces/decorator-options/type-discriminator-descriptor.interface.js.map create mode 100644 node_modules/class-transformer/esm5/interfaces/decorator-options/type-options.interface.js create mode 100644 node_modules/class-transformer/esm5/interfaces/decorator-options/type-options.interface.js.map create mode 100644 node_modules/class-transformer/esm5/interfaces/index.js create mode 100644 node_modules/class-transformer/esm5/interfaces/index.js.map create mode 100644 node_modules/class-transformer/esm5/interfaces/metadata/exclude-metadata.interface.js create mode 100644 node_modules/class-transformer/esm5/interfaces/metadata/exclude-metadata.interface.js.map create mode 100644 node_modules/class-transformer/esm5/interfaces/metadata/expose-metadata.interface.js create mode 100644 node_modules/class-transformer/esm5/interfaces/metadata/expose-metadata.interface.js.map create mode 100644 node_modules/class-transformer/esm5/interfaces/metadata/transform-fn-params.interface.js create mode 100644 node_modules/class-transformer/esm5/interfaces/metadata/transform-fn-params.interface.js.map create mode 100644 node_modules/class-transformer/esm5/interfaces/metadata/transform-metadata.interface.js create mode 100644 node_modules/class-transformer/esm5/interfaces/metadata/transform-metadata.interface.js.map create mode 100644 node_modules/class-transformer/esm5/interfaces/metadata/type-metadata.interface.js create mode 100644 node_modules/class-transformer/esm5/interfaces/metadata/type-metadata.interface.js.map create mode 100644 node_modules/class-transformer/esm5/interfaces/target-map.interface.js create mode 100644 node_modules/class-transformer/esm5/interfaces/target-map.interface.js.map create mode 100644 node_modules/class-transformer/esm5/interfaces/type-help-options.interface.js create mode 100644 node_modules/class-transformer/esm5/interfaces/type-help-options.interface.js.map create mode 100644 node_modules/class-transformer/esm5/storage.js create mode 100644 node_modules/class-transformer/esm5/storage.js.map create mode 100644 node_modules/class-transformer/esm5/utils/get-global.util.js create mode 100644 node_modules/class-transformer/esm5/utils/get-global.util.js.map create mode 100644 node_modules/class-transformer/esm5/utils/get-global.util.spect.js create mode 100644 node_modules/class-transformer/esm5/utils/get-global.util.spect.js.map create mode 100644 node_modules/class-transformer/esm5/utils/index.js create mode 100644 node_modules/class-transformer/esm5/utils/index.js.map create mode 100644 node_modules/class-transformer/esm5/utils/is-promise.util.js create mode 100644 node_modules/class-transformer/esm5/utils/is-promise.util.js.map create mode 100644 node_modules/class-transformer/package.json create mode 100644 node_modules/class-transformer/types/ClassTransformer.d.ts create mode 100644 node_modules/class-transformer/types/MetadataStorage.d.ts create mode 100644 node_modules/class-transformer/types/TransformOperationExecutor.d.ts create mode 100644 node_modules/class-transformer/types/constants/default-options.constant.d.ts create mode 100644 node_modules/class-transformer/types/decorators/exclude.decorator.d.ts create mode 100644 node_modules/class-transformer/types/decorators/expose.decorator.d.ts create mode 100644 node_modules/class-transformer/types/decorators/index.d.ts create mode 100644 node_modules/class-transformer/types/decorators/transform-instance-to-instance.decorator.d.ts create mode 100644 node_modules/class-transformer/types/decorators/transform-instance-to-plain.decorator.d.ts create mode 100644 node_modules/class-transformer/types/decorators/transform-plain-to-instance.decorator.d.ts create mode 100644 node_modules/class-transformer/types/decorators/transform.decorator.d.ts create mode 100644 node_modules/class-transformer/types/decorators/type.decorator.d.ts create mode 100644 node_modules/class-transformer/types/enums/index.d.ts create mode 100644 node_modules/class-transformer/types/enums/transformation-type.enum.d.ts create mode 100644 node_modules/class-transformer/types/index.d.ts create mode 100644 node_modules/class-transformer/types/interfaces/class-constructor.type.d.ts create mode 100644 node_modules/class-transformer/types/interfaces/class-transformer-options.interface.d.ts create mode 100644 node_modules/class-transformer/types/interfaces/decorator-options/exclude-options.interface.d.ts create mode 100644 node_modules/class-transformer/types/interfaces/decorator-options/expose-options.interface.d.ts create mode 100644 node_modules/class-transformer/types/interfaces/decorator-options/transform-options.interface.d.ts create mode 100644 node_modules/class-transformer/types/interfaces/decorator-options/type-discriminator-descriptor.interface.d.ts create mode 100644 node_modules/class-transformer/types/interfaces/decorator-options/type-options.interface.d.ts create mode 100644 node_modules/class-transformer/types/interfaces/index.d.ts create mode 100644 node_modules/class-transformer/types/interfaces/metadata/exclude-metadata.interface.d.ts create mode 100644 node_modules/class-transformer/types/interfaces/metadata/expose-metadata.interface.d.ts create mode 100644 node_modules/class-transformer/types/interfaces/metadata/transform-fn-params.interface.d.ts create mode 100644 node_modules/class-transformer/types/interfaces/metadata/transform-metadata.interface.d.ts create mode 100644 node_modules/class-transformer/types/interfaces/metadata/type-metadata.interface.d.ts create mode 100644 node_modules/class-transformer/types/interfaces/target-map.interface.d.ts create mode 100644 node_modules/class-transformer/types/interfaces/type-help-options.interface.d.ts create mode 100644 node_modules/class-transformer/types/storage.d.ts create mode 100644 node_modules/class-transformer/types/utils/get-global.util.d.ts create mode 100644 node_modules/class-transformer/types/utils/get-global.util.spect.d.ts create mode 100644 node_modules/class-transformer/types/utils/index.d.ts create mode 100644 node_modules/class-transformer/types/utils/is-promise.util.d.ts create mode 100644 node_modules/cli-table3/LICENSE create mode 100644 node_modules/cli-table3/README.md create mode 100644 node_modules/cli-table3/index.d.ts create mode 100644 node_modules/cli-table3/index.js create mode 100644 node_modules/cli-table3/package.json create mode 100644 node_modules/cli-table3/src/cell.js create mode 100644 node_modules/cli-table3/src/debug.js create mode 100644 node_modules/cli-table3/src/layout-manager.js create mode 100644 node_modules/cli-table3/src/table.js create mode 100644 node_modules/cli-table3/src/utils.js create mode 100644 node_modules/color-convert/CHANGELOG.md create mode 100644 node_modules/color-convert/LICENSE create mode 100644 node_modules/color-convert/README.md create mode 100644 node_modules/color-convert/conversions.js create mode 100644 node_modules/color-convert/index.js create mode 100644 node_modules/color-convert/package.json create mode 100644 node_modules/color-convert/route.js create mode 100644 node_modules/color-name/LICENSE create mode 100644 node_modules/color-name/README.md create mode 100644 node_modules/color-name/index.js create mode 100644 node_modules/color-name/package.json create mode 100644 node_modules/commander/LICENSE create mode 100644 node_modules/commander/Readme.md create mode 100644 node_modules/commander/esm.mjs create mode 100644 node_modules/commander/index.js create mode 100644 node_modules/commander/lib/argument.js create mode 100644 node_modules/commander/lib/command.js create mode 100644 node_modules/commander/lib/error.js create mode 100644 node_modules/commander/lib/help.js create mode 100644 node_modules/commander/lib/option.js create mode 100644 node_modules/commander/lib/suggestSimilar.js create mode 100644 node_modules/commander/package-support.json create mode 100644 node_modules/commander/package.json create mode 100644 node_modules/commander/typings/esm.d.mts create mode 100644 node_modules/commander/typings/index.d.ts create mode 100644 node_modules/debug/LICENSE create mode 100644 node_modules/debug/README.md create mode 100644 node_modules/debug/package.json create mode 100644 node_modules/debug/src/browser.js create mode 100644 node_modules/debug/src/common.js create mode 100644 node_modules/debug/src/index.js create mode 100644 node_modules/debug/src/node.js create mode 100644 node_modules/diff/CONTRIBUTING.md create mode 100644 node_modules/diff/LICENSE create mode 100644 node_modules/diff/README.md create mode 100644 node_modules/diff/dist/diff.js create mode 100644 node_modules/diff/dist/diff.min.js create mode 100644 node_modules/diff/lib/convert/dmp.js create mode 100644 node_modules/diff/lib/convert/xml.js create mode 100644 node_modules/diff/lib/diff/array.js create mode 100644 node_modules/diff/lib/diff/base.js create mode 100644 node_modules/diff/lib/diff/character.js create mode 100644 node_modules/diff/lib/diff/css.js create mode 100644 node_modules/diff/lib/diff/json.js create mode 100644 node_modules/diff/lib/diff/line.js create mode 100644 node_modules/diff/lib/diff/sentence.js create mode 100644 node_modules/diff/lib/diff/word.js create mode 100644 node_modules/diff/lib/index.es6.js create mode 100644 node_modules/diff/lib/index.js create mode 100644 node_modules/diff/lib/patch/apply.js create mode 100644 node_modules/diff/lib/patch/create.js create mode 100644 node_modules/diff/lib/patch/merge.js create mode 100644 node_modules/diff/lib/patch/parse.js create mode 100644 node_modules/diff/lib/util/array.js create mode 100644 node_modules/diff/lib/util/distance-iterator.js create mode 100644 node_modules/diff/lib/util/params.js create mode 100644 node_modules/diff/package.json create mode 100644 node_modules/diff/release-notes.md create mode 100644 node_modules/diff/runtime.js create mode 100644 node_modules/emoji-regex/LICENSE-MIT.txt create mode 100644 node_modules/emoji-regex/README.md create mode 100644 node_modules/emoji-regex/es2015/index.js create mode 100644 node_modules/emoji-regex/es2015/text.js create mode 100644 node_modules/emoji-regex/index.d.ts create mode 100644 node_modules/emoji-regex/index.js create mode 100644 node_modules/emoji-regex/package.json create mode 100644 node_modules/emoji-regex/text.js create mode 100644 node_modules/error-stack-parser/LICENSE create mode 100644 node_modules/error-stack-parser/README.md create mode 100644 node_modules/error-stack-parser/dist/error-stack-parser.js create mode 100644 node_modules/error-stack-parser/dist/error-stack-parser.min.js create mode 100644 node_modules/error-stack-parser/dist/error-stack-parser.min.js.map create mode 100644 node_modules/error-stack-parser/error-stack-parser.d.ts create mode 100644 node_modules/error-stack-parser/error-stack-parser.js create mode 100644 node_modules/error-stack-parser/package.json create mode 100644 node_modules/escape-string-regexp/index.js create mode 100644 node_modules/escape-string-regexp/license create mode 100644 node_modules/escape-string-regexp/package.json create mode 100644 node_modules/escape-string-regexp/readme.md create mode 100644 node_modules/figures/index.d.ts create mode 100644 node_modules/figures/index.js create mode 100644 node_modules/figures/license create mode 100644 node_modules/figures/package.json create mode 100644 node_modules/figures/readme.md create mode 100644 node_modules/find-up-simple/index.d.ts create mode 100644 node_modules/find-up-simple/index.js create mode 100644 node_modules/find-up-simple/license create mode 100644 node_modules/find-up-simple/package.json create mode 100644 node_modules/find-up-simple/readme.md create mode 100644 node_modules/glob/LICENSE.md create mode 100644 node_modules/glob/README.md create mode 100644 node_modules/glob/dist/commonjs/glob.d.ts create mode 100644 node_modules/glob/dist/commonjs/glob.d.ts.map create mode 100644 node_modules/glob/dist/commonjs/glob.js create mode 100644 node_modules/glob/dist/commonjs/glob.js.map create mode 100644 node_modules/glob/dist/commonjs/has-magic.d.ts create mode 100644 node_modules/glob/dist/commonjs/has-magic.d.ts.map create mode 100644 node_modules/glob/dist/commonjs/has-magic.js create mode 100644 node_modules/glob/dist/commonjs/has-magic.js.map create mode 100644 node_modules/glob/dist/commonjs/ignore.d.ts create mode 100644 node_modules/glob/dist/commonjs/ignore.d.ts.map create mode 100644 node_modules/glob/dist/commonjs/ignore.js create mode 100644 node_modules/glob/dist/commonjs/ignore.js.map create mode 100644 node_modules/glob/dist/commonjs/index.d.ts create mode 100644 node_modules/glob/dist/commonjs/index.d.ts.map create mode 100644 node_modules/glob/dist/commonjs/index.js create mode 100644 node_modules/glob/dist/commonjs/index.js.map create mode 100644 node_modules/glob/dist/commonjs/index.min.js create mode 100644 node_modules/glob/dist/commonjs/index.min.js.map create mode 100644 node_modules/glob/dist/commonjs/package.json create mode 100644 node_modules/glob/dist/commonjs/pattern.d.ts create mode 100644 node_modules/glob/dist/commonjs/pattern.d.ts.map create mode 100644 node_modules/glob/dist/commonjs/pattern.js create mode 100644 node_modules/glob/dist/commonjs/pattern.js.map create mode 100644 node_modules/glob/dist/commonjs/processor.d.ts create mode 100644 node_modules/glob/dist/commonjs/processor.d.ts.map create mode 100644 node_modules/glob/dist/commonjs/processor.js create mode 100644 node_modules/glob/dist/commonjs/processor.js.map create mode 100644 node_modules/glob/dist/commonjs/walker.d.ts create mode 100644 node_modules/glob/dist/commonjs/walker.d.ts.map create mode 100644 node_modules/glob/dist/commonjs/walker.js create mode 100644 node_modules/glob/dist/commonjs/walker.js.map create mode 100644 node_modules/glob/dist/esm/glob.d.ts create mode 100644 node_modules/glob/dist/esm/glob.d.ts.map create mode 100644 node_modules/glob/dist/esm/glob.js create mode 100644 node_modules/glob/dist/esm/glob.js.map create mode 100644 node_modules/glob/dist/esm/has-magic.d.ts create mode 100644 node_modules/glob/dist/esm/has-magic.d.ts.map create mode 100644 node_modules/glob/dist/esm/has-magic.js create mode 100644 node_modules/glob/dist/esm/has-magic.js.map create mode 100644 node_modules/glob/dist/esm/ignore.d.ts create mode 100644 node_modules/glob/dist/esm/ignore.d.ts.map create mode 100644 node_modules/glob/dist/esm/ignore.js create mode 100644 node_modules/glob/dist/esm/ignore.js.map create mode 100644 node_modules/glob/dist/esm/index.d.ts create mode 100644 node_modules/glob/dist/esm/index.d.ts.map create mode 100644 node_modules/glob/dist/esm/index.js create mode 100644 node_modules/glob/dist/esm/index.js.map create mode 100644 node_modules/glob/dist/esm/index.min.js create mode 100644 node_modules/glob/dist/esm/index.min.js.map create mode 100644 node_modules/glob/dist/esm/package.json create mode 100644 node_modules/glob/dist/esm/pattern.d.ts create mode 100644 node_modules/glob/dist/esm/pattern.d.ts.map create mode 100644 node_modules/glob/dist/esm/pattern.js create mode 100644 node_modules/glob/dist/esm/pattern.js.map create mode 100644 node_modules/glob/dist/esm/processor.d.ts create mode 100644 node_modules/glob/dist/esm/processor.d.ts.map create mode 100644 node_modules/glob/dist/esm/processor.js create mode 100644 node_modules/glob/dist/esm/processor.js.map create mode 100644 node_modules/glob/dist/esm/walker.d.ts create mode 100644 node_modules/glob/dist/esm/walker.d.ts.map create mode 100644 node_modules/glob/dist/esm/walker.js create mode 100644 node_modules/glob/dist/esm/walker.js.map create mode 100644 node_modules/glob/package.json create mode 100644 node_modules/global-dirs/index.d.ts create mode 100644 node_modules/global-dirs/index.js create mode 100644 node_modules/global-dirs/license create mode 100644 node_modules/global-dirs/package.json create mode 100644 node_modules/global-dirs/readme.md create mode 100644 node_modules/has-ansi/index.js create mode 100644 node_modules/has-ansi/license create mode 100644 node_modules/has-ansi/package.json create mode 100644 node_modules/has-ansi/readme.md create mode 100644 node_modules/has-flag/index.d.ts create mode 100644 node_modules/has-flag/index.js create mode 100644 node_modules/has-flag/license create mode 100644 node_modules/has-flag/package.json create mode 100644 node_modules/has-flag/readme.md create mode 100644 node_modules/hosted-git-info/LICENSE create mode 100644 node_modules/hosted-git-info/README.md create mode 100644 node_modules/hosted-git-info/lib/from-url.js create mode 100644 node_modules/hosted-git-info/lib/hosts.js create mode 100644 node_modules/hosted-git-info/lib/index.js create mode 100644 node_modules/hosted-git-info/lib/parse-url.js create mode 100644 node_modules/hosted-git-info/package.json create mode 100644 node_modules/indent-string/index.d.ts create mode 100644 node_modules/indent-string/index.js create mode 100644 node_modules/indent-string/license create mode 100644 node_modules/indent-string/package.json create mode 100644 node_modules/indent-string/readme.md create mode 100644 node_modules/index-to-position/index.d.ts create mode 100644 node_modules/index-to-position/index.js create mode 100644 node_modules/index-to-position/license create mode 100644 node_modules/index-to-position/package.json create mode 100644 node_modules/index-to-position/readme.md create mode 100644 node_modules/ini/LICENSE create mode 100644 node_modules/ini/README.md create mode 100644 node_modules/ini/ini.js create mode 100644 node_modules/ini/package.json create mode 100644 node_modules/is-fullwidth-code-point/index.d.ts create mode 100644 node_modules/is-fullwidth-code-point/index.js create mode 100644 node_modules/is-fullwidth-code-point/license create mode 100644 node_modules/is-fullwidth-code-point/package.json create mode 100644 node_modules/is-fullwidth-code-point/readme.md create mode 100644 node_modules/is-installed-globally/index.d.ts create mode 100644 node_modules/is-installed-globally/index.js create mode 100644 node_modules/is-installed-globally/license create mode 100644 node_modules/is-installed-globally/package.json create mode 100644 node_modules/is-installed-globally/readme.md create mode 100644 node_modules/is-path-inside/index.d.ts create mode 100644 node_modules/is-path-inside/index.js create mode 100644 node_modules/is-path-inside/license create mode 100644 node_modules/is-path-inside/package.json create mode 100644 node_modules/is-path-inside/readme.md create mode 100644 node_modules/is-stream/index.d.ts create mode 100644 node_modules/is-stream/index.js create mode 100644 node_modules/is-stream/license create mode 100644 node_modules/is-stream/package.json create mode 100644 node_modules/is-stream/readme.md create mode 100644 node_modules/js-tokens/CHANGELOG.md create mode 100644 node_modules/js-tokens/LICENSE create mode 100644 node_modules/js-tokens/README.md create mode 100644 node_modules/js-tokens/index.js create mode 100644 node_modules/js-tokens/package.json create mode 100644 node_modules/knuth-shuffle-seeded/.jsdoc.conf create mode 100644 node_modules/knuth-shuffle-seeded/.npmignore create mode 100644 node_modules/knuth-shuffle-seeded/.travis.yml create mode 100644 node_modules/knuth-shuffle-seeded/CHANGELOG.md create mode 100644 node_modules/knuth-shuffle-seeded/LICENSE create mode 100644 node_modules/knuth-shuffle-seeded/README.md create mode 100644 node_modules/knuth-shuffle-seeded/bower.json create mode 100644 node_modules/knuth-shuffle-seeded/browser.js create mode 100644 node_modules/knuth-shuffle-seeded/example.js create mode 100644 node_modules/knuth-shuffle-seeded/index.html create mode 100644 node_modules/knuth-shuffle-seeded/index.js create mode 100644 node_modules/knuth-shuffle-seeded/package.json create mode 100644 node_modules/knuth-shuffle-seeded/test/test.js create mode 100644 node_modules/lodash.merge/LICENSE create mode 100644 node_modules/lodash.merge/README.md create mode 100644 node_modules/lodash.merge/index.js create mode 100644 node_modules/lodash.merge/package.json create mode 100644 node_modules/lodash.mergewith/LICENSE create mode 100644 node_modules/lodash.mergewith/README.md create mode 100644 node_modules/lodash.mergewith/index.js create mode 100644 node_modules/lodash.mergewith/package.json create mode 100644 node_modules/lodash.sortby/LICENSE create mode 100644 node_modules/lodash.sortby/README.md create mode 100644 node_modules/lodash.sortby/index.js create mode 100644 node_modules/lodash.sortby/package.json create mode 100644 node_modules/lower-case/LICENSE create mode 100644 node_modules/lower-case/README.md create mode 100644 node_modules/lower-case/dist.es2015/index.d.ts create mode 100644 node_modules/lower-case/dist.es2015/index.js create mode 100644 node_modules/lower-case/dist.es2015/index.js.map create mode 100644 node_modules/lower-case/dist.es2015/index.spec.d.ts create mode 100644 node_modules/lower-case/dist.es2015/index.spec.js create mode 100644 node_modules/lower-case/dist.es2015/index.spec.js.map create mode 100644 node_modules/lower-case/dist/index.d.ts create mode 100644 node_modules/lower-case/dist/index.js create mode 100644 node_modules/lower-case/dist/index.js.map create mode 100644 node_modules/lower-case/dist/index.spec.d.ts create mode 100644 node_modules/lower-case/dist/index.spec.js create mode 100644 node_modules/lower-case/dist/index.spec.js.map create mode 100644 node_modules/lower-case/package.json create mode 100644 node_modules/lru-cache/LICENSE.md create mode 100644 node_modules/lru-cache/README.md create mode 100644 node_modules/lru-cache/dist/commonjs/browser/diagnostics-channel-browser.d.ts.map create mode 100644 node_modules/lru-cache/dist/commonjs/browser/diagnostics-channel-browser.js.map create mode 100644 node_modules/lru-cache/dist/commonjs/browser/diagnostics-channel.d.ts create mode 100644 node_modules/lru-cache/dist/commonjs/browser/diagnostics-channel.js create mode 100644 node_modules/lru-cache/dist/commonjs/browser/index.d.ts create mode 100644 node_modules/lru-cache/dist/commonjs/browser/index.d.ts.map create mode 100644 node_modules/lru-cache/dist/commonjs/browser/index.js create mode 100644 node_modules/lru-cache/dist/commonjs/browser/index.js.map create mode 100644 node_modules/lru-cache/dist/commonjs/browser/index.min.js create mode 100644 node_modules/lru-cache/dist/commonjs/browser/index.min.js.map create mode 100644 node_modules/lru-cache/dist/commonjs/browser/perf.d.ts create mode 100644 node_modules/lru-cache/dist/commonjs/browser/perf.d.ts.map create mode 100644 node_modules/lru-cache/dist/commonjs/browser/perf.js create mode 100644 node_modules/lru-cache/dist/commonjs/browser/perf.js.map create mode 100644 node_modules/lru-cache/dist/commonjs/diagnostics-channel-cjs.cjs.map create mode 100644 node_modules/lru-cache/dist/commonjs/diagnostics-channel-cjs.d.cts.map create mode 100644 node_modules/lru-cache/dist/commonjs/diagnostics-channel.d.ts create mode 100644 node_modules/lru-cache/dist/commonjs/diagnostics-channel.js create mode 100644 node_modules/lru-cache/dist/commonjs/index.d.ts create mode 100644 node_modules/lru-cache/dist/commonjs/index.d.ts.map create mode 100644 node_modules/lru-cache/dist/commonjs/index.js create mode 100644 node_modules/lru-cache/dist/commonjs/index.js.map create mode 100644 node_modules/lru-cache/dist/commonjs/index.min.js create mode 100644 node_modules/lru-cache/dist/commonjs/index.min.js.map create mode 100644 node_modules/lru-cache/dist/commonjs/node/diagnostics-channel-node.d.ts.map create mode 100644 node_modules/lru-cache/dist/commonjs/node/diagnostics-channel-node.js.map create mode 100644 node_modules/lru-cache/dist/commonjs/node/diagnostics-channel.d.ts create mode 100644 node_modules/lru-cache/dist/commonjs/node/diagnostics-channel.js create mode 100644 node_modules/lru-cache/dist/commonjs/node/index.d.ts create mode 100644 node_modules/lru-cache/dist/commonjs/node/index.d.ts.map create mode 100644 node_modules/lru-cache/dist/commonjs/node/index.js create mode 100644 node_modules/lru-cache/dist/commonjs/node/index.js.map create mode 100644 node_modules/lru-cache/dist/commonjs/node/index.min.js create mode 100644 node_modules/lru-cache/dist/commonjs/node/index.min.js.map create mode 100644 node_modules/lru-cache/dist/commonjs/node/perf.d.ts create mode 100644 node_modules/lru-cache/dist/commonjs/node/perf.d.ts.map create mode 100644 node_modules/lru-cache/dist/commonjs/node/perf.js create mode 100644 node_modules/lru-cache/dist/commonjs/node/perf.js.map create mode 100644 node_modules/lru-cache/dist/commonjs/package.json create mode 100644 node_modules/lru-cache/dist/commonjs/perf.d.ts create mode 100644 node_modules/lru-cache/dist/commonjs/perf.d.ts.map create mode 100644 node_modules/lru-cache/dist/commonjs/perf.js create mode 100644 node_modules/lru-cache/dist/commonjs/perf.js.map create mode 100644 node_modules/lru-cache/dist/esm/browser/diagnostics-channel-browser.d.ts.map create mode 100644 node_modules/lru-cache/dist/esm/browser/diagnostics-channel-browser.js.map create mode 100644 node_modules/lru-cache/dist/esm/browser/diagnostics-channel.d.ts create mode 100644 node_modules/lru-cache/dist/esm/browser/diagnostics-channel.js create mode 100644 node_modules/lru-cache/dist/esm/browser/index.d.ts create mode 100644 node_modules/lru-cache/dist/esm/browser/index.d.ts.map create mode 100644 node_modules/lru-cache/dist/esm/browser/index.js create mode 100644 node_modules/lru-cache/dist/esm/browser/index.js.map create mode 100644 node_modules/lru-cache/dist/esm/browser/index.min.js create mode 100644 node_modules/lru-cache/dist/esm/browser/index.min.js.map create mode 100644 node_modules/lru-cache/dist/esm/browser/perf.d.ts create mode 100644 node_modules/lru-cache/dist/esm/browser/perf.d.ts.map create mode 100644 node_modules/lru-cache/dist/esm/browser/perf.js create mode 100644 node_modules/lru-cache/dist/esm/browser/perf.js.map create mode 100644 node_modules/lru-cache/dist/esm/diagnostics-channel-esm.d.mts.map create mode 100644 node_modules/lru-cache/dist/esm/diagnostics-channel-esm.mjs.map create mode 100644 node_modules/lru-cache/dist/esm/diagnostics-channel.d.ts create mode 100644 node_modules/lru-cache/dist/esm/diagnostics-channel.js create mode 100644 node_modules/lru-cache/dist/esm/index.d.ts create mode 100644 node_modules/lru-cache/dist/esm/index.d.ts.map create mode 100644 node_modules/lru-cache/dist/esm/index.js create mode 100644 node_modules/lru-cache/dist/esm/index.js.map create mode 100644 node_modules/lru-cache/dist/esm/index.min.js create mode 100644 node_modules/lru-cache/dist/esm/index.min.js.map create mode 100644 node_modules/lru-cache/dist/esm/node/diagnostics-channel-node.d.ts.map create mode 100644 node_modules/lru-cache/dist/esm/node/diagnostics-channel-node.js.map create mode 100644 node_modules/lru-cache/dist/esm/node/diagnostics-channel.d.ts create mode 100644 node_modules/lru-cache/dist/esm/node/diagnostics-channel.js create mode 100644 node_modules/lru-cache/dist/esm/node/index.d.ts create mode 100644 node_modules/lru-cache/dist/esm/node/index.d.ts.map create mode 100644 node_modules/lru-cache/dist/esm/node/index.js create mode 100644 node_modules/lru-cache/dist/esm/node/index.js.map create mode 100644 node_modules/lru-cache/dist/esm/node/index.min.js create mode 100644 node_modules/lru-cache/dist/esm/node/index.min.js.map create mode 100644 node_modules/lru-cache/dist/esm/node/perf.d.ts create mode 100644 node_modules/lru-cache/dist/esm/node/perf.d.ts.map create mode 100644 node_modules/lru-cache/dist/esm/node/perf.js create mode 100644 node_modules/lru-cache/dist/esm/node/perf.js.map create mode 100644 node_modules/lru-cache/dist/esm/package.json create mode 100644 node_modules/lru-cache/dist/esm/perf.d.ts create mode 100644 node_modules/lru-cache/dist/esm/perf.d.ts.map create mode 100644 node_modules/lru-cache/dist/esm/perf.js create mode 100644 node_modules/lru-cache/dist/esm/perf.js.map create mode 100644 node_modules/lru-cache/package.json create mode 100644 node_modules/luxon/LICENSE.md create mode 100644 node_modules/luxon/README.md create mode 100644 node_modules/luxon/build/amd/luxon.js create mode 100644 node_modules/luxon/build/amd/luxon.js.map create mode 100644 node_modules/luxon/build/cjs-browser/luxon.js create mode 100644 node_modules/luxon/build/cjs-browser/luxon.js.map create mode 100644 node_modules/luxon/build/es6/luxon.mjs create mode 100644 node_modules/luxon/build/es6/luxon.mjs.map create mode 100644 node_modules/luxon/build/global/luxon.js create mode 100644 node_modules/luxon/build/global/luxon.js.map create mode 100644 node_modules/luxon/build/global/luxon.min.js create mode 100644 node_modules/luxon/build/global/luxon.min.js.map create mode 100644 node_modules/luxon/build/node/luxon.js create mode 100644 node_modules/luxon/build/node/luxon.js.map create mode 100644 node_modules/luxon/package.json create mode 100644 node_modules/luxon/src/datetime.js create mode 100644 node_modules/luxon/src/duration.js create mode 100644 node_modules/luxon/src/errors.js create mode 100644 node_modules/luxon/src/impl/conversions.js create mode 100644 node_modules/luxon/src/impl/diff.js create mode 100644 node_modules/luxon/src/impl/digits.js create mode 100644 node_modules/luxon/src/impl/english.js create mode 100644 node_modules/luxon/src/impl/formats.js create mode 100644 node_modules/luxon/src/impl/formatter.js create mode 100644 node_modules/luxon/src/impl/invalid.js create mode 100644 node_modules/luxon/src/impl/locale.js create mode 100644 node_modules/luxon/src/impl/regexParser.js create mode 100644 node_modules/luxon/src/impl/tokenParser.js create mode 100644 node_modules/luxon/src/impl/util.js create mode 100644 node_modules/luxon/src/impl/zoneUtil.js create mode 100644 node_modules/luxon/src/info.js create mode 100644 node_modules/luxon/src/interval.js create mode 100644 node_modules/luxon/src/luxon.js create mode 100644 node_modules/luxon/src/package.json create mode 100644 node_modules/luxon/src/settings.js create mode 100644 node_modules/luxon/src/zone.js create mode 100644 node_modules/luxon/src/zones/IANAZone.js create mode 100644 node_modules/luxon/src/zones/fixedOffsetZone.js create mode 100644 node_modules/luxon/src/zones/invalidZone.js create mode 100644 node_modules/luxon/src/zones/systemZone.js create mode 100644 node_modules/mime/CHANGELOG.md create mode 100644 node_modules/mime/LICENSE create mode 100644 node_modules/mime/Mime.js create mode 100644 node_modules/mime/README.md create mode 100644 node_modules/mime/cli.js create mode 100644 node_modules/mime/index.js create mode 100644 node_modules/mime/lite.js create mode 100644 node_modules/mime/package.json create mode 100644 node_modules/mime/types/other.js create mode 100644 node_modules/mime/types/standard.js create mode 100644 node_modules/minimatch/LICENSE.md create mode 100644 node_modules/minimatch/README.md create mode 100644 node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts create mode 100644 node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map create mode 100644 node_modules/minimatch/dist/commonjs/assert-valid-pattern.js create mode 100644 node_modules/minimatch/dist/commonjs/assert-valid-pattern.js.map create mode 100644 node_modules/minimatch/dist/commonjs/ast.d.ts create mode 100644 node_modules/minimatch/dist/commonjs/ast.d.ts.map create mode 100644 node_modules/minimatch/dist/commonjs/ast.js create mode 100644 node_modules/minimatch/dist/commonjs/ast.js.map create mode 100644 node_modules/minimatch/dist/commonjs/brace-expressions.d.ts create mode 100644 node_modules/minimatch/dist/commonjs/brace-expressions.d.ts.map create mode 100644 node_modules/minimatch/dist/commonjs/brace-expressions.js create mode 100644 node_modules/minimatch/dist/commonjs/brace-expressions.js.map create mode 100644 node_modules/minimatch/dist/commonjs/escape.d.ts create mode 100644 node_modules/minimatch/dist/commonjs/escape.d.ts.map create mode 100644 node_modules/minimatch/dist/commonjs/escape.js create mode 100644 node_modules/minimatch/dist/commonjs/escape.js.map create mode 100644 node_modules/minimatch/dist/commonjs/index.d.ts create mode 100644 node_modules/minimatch/dist/commonjs/index.d.ts.map create mode 100644 node_modules/minimatch/dist/commonjs/index.js create mode 100644 node_modules/minimatch/dist/commonjs/index.js.map create mode 100644 node_modules/minimatch/dist/commonjs/package.json create mode 100644 node_modules/minimatch/dist/commonjs/unescape.d.ts create mode 100644 node_modules/minimatch/dist/commonjs/unescape.d.ts.map create mode 100644 node_modules/minimatch/dist/commonjs/unescape.js create mode 100644 node_modules/minimatch/dist/commonjs/unescape.js.map create mode 100644 node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts create mode 100644 node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts.map create mode 100644 node_modules/minimatch/dist/esm/assert-valid-pattern.js create mode 100644 node_modules/minimatch/dist/esm/assert-valid-pattern.js.map create mode 100644 node_modules/minimatch/dist/esm/ast.d.ts create mode 100644 node_modules/minimatch/dist/esm/ast.d.ts.map create mode 100644 node_modules/minimatch/dist/esm/ast.js create mode 100644 node_modules/minimatch/dist/esm/ast.js.map create mode 100644 node_modules/minimatch/dist/esm/brace-expressions.d.ts create mode 100644 node_modules/minimatch/dist/esm/brace-expressions.d.ts.map create mode 100644 node_modules/minimatch/dist/esm/brace-expressions.js create mode 100644 node_modules/minimatch/dist/esm/brace-expressions.js.map create mode 100644 node_modules/minimatch/dist/esm/escape.d.ts create mode 100644 node_modules/minimatch/dist/esm/escape.d.ts.map create mode 100644 node_modules/minimatch/dist/esm/escape.js create mode 100644 node_modules/minimatch/dist/esm/escape.js.map create mode 100644 node_modules/minimatch/dist/esm/index.d.ts create mode 100644 node_modules/minimatch/dist/esm/index.d.ts.map create mode 100644 node_modules/minimatch/dist/esm/index.js create mode 100644 node_modules/minimatch/dist/esm/index.js.map create mode 100644 node_modules/minimatch/dist/esm/package.json create mode 100644 node_modules/minimatch/dist/esm/unescape.d.ts create mode 100644 node_modules/minimatch/dist/esm/unescape.d.ts.map create mode 100644 node_modules/minimatch/dist/esm/unescape.js create mode 100644 node_modules/minimatch/dist/esm/unescape.js.map create mode 100644 node_modules/minimatch/package.json create mode 100644 node_modules/minipass/LICENSE.md create mode 100644 node_modules/minipass/README.md create mode 100644 node_modules/minipass/dist/commonjs/index.d.ts create mode 100644 node_modules/minipass/dist/commonjs/index.d.ts.map create mode 100644 node_modules/minipass/dist/commonjs/index.js create mode 100644 node_modules/minipass/dist/commonjs/index.js.map create mode 100644 node_modules/minipass/dist/commonjs/package.json create mode 100644 node_modules/minipass/dist/esm/index.d.ts create mode 100644 node_modules/minipass/dist/esm/index.d.ts.map create mode 100644 node_modules/minipass/dist/esm/index.js create mode 100644 node_modules/minipass/dist/esm/index.js.map create mode 100644 node_modules/minipass/dist/esm/package.json create mode 100644 node_modules/minipass/package.json create mode 100644 node_modules/mkdirp/LICENSE create mode 100644 node_modules/mkdirp/dist/cjs/package.json create mode 100644 node_modules/mkdirp/dist/cjs/src/bin.d.ts create mode 100644 node_modules/mkdirp/dist/cjs/src/bin.d.ts.map create mode 100644 node_modules/mkdirp/dist/cjs/src/bin.js create mode 100644 node_modules/mkdirp/dist/cjs/src/bin.js.map create mode 100644 node_modules/mkdirp/dist/cjs/src/find-made.d.ts create mode 100644 node_modules/mkdirp/dist/cjs/src/find-made.d.ts.map create mode 100644 node_modules/mkdirp/dist/cjs/src/find-made.js create mode 100644 node_modules/mkdirp/dist/cjs/src/find-made.js.map create mode 100644 node_modules/mkdirp/dist/cjs/src/index.d.ts create mode 100644 node_modules/mkdirp/dist/cjs/src/index.d.ts.map create mode 100644 node_modules/mkdirp/dist/cjs/src/index.js create mode 100644 node_modules/mkdirp/dist/cjs/src/index.js.map create mode 100644 node_modules/mkdirp/dist/cjs/src/mkdirp-manual.d.ts create mode 100644 node_modules/mkdirp/dist/cjs/src/mkdirp-manual.d.ts.map create mode 100644 node_modules/mkdirp/dist/cjs/src/mkdirp-manual.js create mode 100644 node_modules/mkdirp/dist/cjs/src/mkdirp-manual.js.map create mode 100644 node_modules/mkdirp/dist/cjs/src/mkdirp-native.d.ts create mode 100644 node_modules/mkdirp/dist/cjs/src/mkdirp-native.d.ts.map create mode 100644 node_modules/mkdirp/dist/cjs/src/mkdirp-native.js create mode 100644 node_modules/mkdirp/dist/cjs/src/mkdirp-native.js.map create mode 100644 node_modules/mkdirp/dist/cjs/src/opts-arg.d.ts create mode 100644 node_modules/mkdirp/dist/cjs/src/opts-arg.d.ts.map create mode 100644 node_modules/mkdirp/dist/cjs/src/opts-arg.js create mode 100644 node_modules/mkdirp/dist/cjs/src/opts-arg.js.map create mode 100644 node_modules/mkdirp/dist/cjs/src/path-arg.d.ts create mode 100644 node_modules/mkdirp/dist/cjs/src/path-arg.d.ts.map create mode 100644 node_modules/mkdirp/dist/cjs/src/path-arg.js create mode 100644 node_modules/mkdirp/dist/cjs/src/path-arg.js.map create mode 100644 node_modules/mkdirp/dist/cjs/src/use-native.d.ts create mode 100644 node_modules/mkdirp/dist/cjs/src/use-native.d.ts.map create mode 100644 node_modules/mkdirp/dist/cjs/src/use-native.js create mode 100644 node_modules/mkdirp/dist/cjs/src/use-native.js.map create mode 100644 node_modules/mkdirp/dist/mjs/find-made.d.ts create mode 100644 node_modules/mkdirp/dist/mjs/find-made.d.ts.map create mode 100644 node_modules/mkdirp/dist/mjs/find-made.js create mode 100644 node_modules/mkdirp/dist/mjs/find-made.js.map create mode 100644 node_modules/mkdirp/dist/mjs/index.d.ts create mode 100644 node_modules/mkdirp/dist/mjs/index.d.ts.map create mode 100644 node_modules/mkdirp/dist/mjs/index.js create mode 100644 node_modules/mkdirp/dist/mjs/index.js.map create mode 100644 node_modules/mkdirp/dist/mjs/mkdirp-manual.d.ts create mode 100644 node_modules/mkdirp/dist/mjs/mkdirp-manual.d.ts.map create mode 100644 node_modules/mkdirp/dist/mjs/mkdirp-manual.js create mode 100644 node_modules/mkdirp/dist/mjs/mkdirp-manual.js.map create mode 100644 node_modules/mkdirp/dist/mjs/mkdirp-native.d.ts create mode 100644 node_modules/mkdirp/dist/mjs/mkdirp-native.d.ts.map create mode 100644 node_modules/mkdirp/dist/mjs/mkdirp-native.js create mode 100644 node_modules/mkdirp/dist/mjs/mkdirp-native.js.map create mode 100644 node_modules/mkdirp/dist/mjs/opts-arg.d.ts create mode 100644 node_modules/mkdirp/dist/mjs/opts-arg.d.ts.map create mode 100644 node_modules/mkdirp/dist/mjs/opts-arg.js create mode 100644 node_modules/mkdirp/dist/mjs/opts-arg.js.map create mode 100644 node_modules/mkdirp/dist/mjs/package.json create mode 100644 node_modules/mkdirp/dist/mjs/path-arg.d.ts create mode 100644 node_modules/mkdirp/dist/mjs/path-arg.d.ts.map create mode 100644 node_modules/mkdirp/dist/mjs/path-arg.js create mode 100644 node_modules/mkdirp/dist/mjs/path-arg.js.map create mode 100644 node_modules/mkdirp/dist/mjs/use-native.d.ts create mode 100644 node_modules/mkdirp/dist/mjs/use-native.d.ts.map create mode 100644 node_modules/mkdirp/dist/mjs/use-native.js create mode 100644 node_modules/mkdirp/dist/mjs/use-native.js.map create mode 100644 node_modules/mkdirp/package.json create mode 100644 node_modules/mkdirp/readme.markdown create mode 100644 node_modules/ms/index.js create mode 100644 node_modules/ms/license.md create mode 100644 node_modules/ms/package.json create mode 100644 node_modules/ms/readme.md create mode 100644 node_modules/mz/HISTORY.md create mode 100644 node_modules/mz/LICENSE create mode 100644 node_modules/mz/README.md create mode 100644 node_modules/mz/child_process.js create mode 100644 node_modules/mz/crypto.js create mode 100644 node_modules/mz/dns.js create mode 100644 node_modules/mz/fs.js create mode 100644 node_modules/mz/index.js create mode 100644 node_modules/mz/package.json create mode 100644 node_modules/mz/readline.js create mode 100644 node_modules/mz/zlib.js create mode 100644 node_modules/no-case/LICENSE create mode 100644 node_modules/no-case/README.md create mode 100644 node_modules/no-case/dist.es2015/index.d.ts create mode 100644 node_modules/no-case/dist.es2015/index.js create mode 100644 node_modules/no-case/dist.es2015/index.js.map create mode 100644 node_modules/no-case/dist.es2015/index.spec.d.ts create mode 100644 node_modules/no-case/dist.es2015/index.spec.js create mode 100644 node_modules/no-case/dist.es2015/index.spec.js.map create mode 100644 node_modules/no-case/dist/index.d.ts create mode 100644 node_modules/no-case/dist/index.js create mode 100644 node_modules/no-case/dist/index.js.map create mode 100644 node_modules/no-case/dist/index.spec.d.ts create mode 100644 node_modules/no-case/dist/index.spec.js create mode 100644 node_modules/no-case/dist/index.spec.js.map create mode 100644 node_modules/no-case/package.json create mode 100644 node_modules/normalize-package-data/LICENSE create mode 100644 node_modules/normalize-package-data/README.md create mode 100644 node_modules/normalize-package-data/lib/extract_description.js create mode 100644 node_modules/normalize-package-data/lib/fixer.js create mode 100644 node_modules/normalize-package-data/lib/make_warning.js create mode 100644 node_modules/normalize-package-data/lib/normalize.js create mode 100644 node_modules/normalize-package-data/lib/safe_format.js create mode 100644 node_modules/normalize-package-data/lib/typos.json create mode 100644 node_modules/normalize-package-data/lib/warning_messages.json create mode 100644 node_modules/normalize-package-data/package.json create mode 100644 node_modules/object-assign/index.js create mode 100644 node_modules/object-assign/license create mode 100644 node_modules/object-assign/package.json create mode 100644 node_modules/object-assign/readme.md create mode 100644 node_modules/pad-right/LICENSE create mode 100644 node_modules/pad-right/README.md create mode 100644 node_modules/pad-right/index.js create mode 100644 node_modules/pad-right/package.json create mode 100644 node_modules/parse-json/index.d.ts create mode 100644 node_modules/parse-json/index.js create mode 100644 node_modules/parse-json/license create mode 100644 node_modules/parse-json/package.json create mode 100644 node_modules/parse-json/readme.md create mode 100644 node_modules/path-scurry/LICENSE.md create mode 100644 node_modules/path-scurry/README.md create mode 100644 node_modules/path-scurry/dist/commonjs/index.d.ts create mode 100644 node_modules/path-scurry/dist/commonjs/index.d.ts.map create mode 100644 node_modules/path-scurry/dist/commonjs/index.js create mode 100644 node_modules/path-scurry/dist/commonjs/index.js.map create mode 100644 node_modules/path-scurry/dist/commonjs/package.json create mode 100644 node_modules/path-scurry/dist/esm/index.d.ts create mode 100644 node_modules/path-scurry/dist/esm/index.d.ts.map create mode 100644 node_modules/path-scurry/dist/esm/index.js create mode 100644 node_modules/path-scurry/dist/esm/index.js.map create mode 100644 node_modules/path-scurry/dist/esm/package.json create mode 100644 node_modules/path-scurry/package.json create mode 100644 node_modules/picocolors/LICENSE create mode 100644 node_modules/picocolors/README.md create mode 100644 node_modules/picocolors/package.json create mode 100644 node_modules/picocolors/picocolors.browser.js create mode 100644 node_modules/picocolors/picocolors.d.ts create mode 100644 node_modules/picocolors/picocolors.js create mode 100644 node_modules/picocolors/types.d.ts create mode 100644 node_modules/playwright-core/LICENSE create mode 100644 node_modules/playwright-core/NOTICE create mode 100644 node_modules/playwright-core/README.md create mode 100644 node_modules/playwright-core/ThirdPartyNotices.txt create mode 100644 node_modules/playwright-core/bin/install_media_pack.ps1 create mode 100644 node_modules/playwright-core/bin/install_webkit_wsl.ps1 create mode 100644 node_modules/playwright-core/bin/reinstall_chrome_beta_linux.sh create mode 100644 node_modules/playwright-core/bin/reinstall_chrome_beta_mac.sh create mode 100644 node_modules/playwright-core/bin/reinstall_chrome_beta_win.ps1 create mode 100644 node_modules/playwright-core/bin/reinstall_chrome_stable_linux.sh create mode 100644 node_modules/playwright-core/bin/reinstall_chrome_stable_mac.sh create mode 100644 node_modules/playwright-core/bin/reinstall_chrome_stable_win.ps1 create mode 100644 node_modules/playwright-core/bin/reinstall_msedge_beta_linux.sh create mode 100644 node_modules/playwright-core/bin/reinstall_msedge_beta_mac.sh create mode 100644 node_modules/playwright-core/bin/reinstall_msedge_beta_win.ps1 create mode 100644 node_modules/playwright-core/bin/reinstall_msedge_dev_linux.sh create mode 100644 node_modules/playwright-core/bin/reinstall_msedge_dev_mac.sh create mode 100644 node_modules/playwright-core/bin/reinstall_msedge_dev_win.ps1 create mode 100644 node_modules/playwright-core/bin/reinstall_msedge_stable_linux.sh create mode 100644 node_modules/playwright-core/bin/reinstall_msedge_stable_mac.sh create mode 100644 node_modules/playwright-core/bin/reinstall_msedge_stable_win.ps1 create mode 100644 node_modules/playwright-core/browsers.json create mode 100644 node_modules/playwright-core/cli.js create mode 100644 node_modules/playwright-core/index.d.ts create mode 100644 node_modules/playwright-core/index.js create mode 100644 node_modules/playwright-core/index.mjs create mode 100644 node_modules/playwright-core/lib/bootstrap.js create mode 100644 node_modules/playwright-core/lib/coreBundle.js create mode 100644 node_modules/playwright-core/lib/entry/cliDaemon.js create mode 100644 node_modules/playwright-core/lib/entry/dashboardApp.js create mode 100644 node_modules/playwright-core/lib/entry/mcp.js create mode 100644 node_modules/playwright-core/lib/entry/oopBrowserDownload.js create mode 100644 node_modules/playwright-core/lib/package.js create mode 100644 node_modules/playwright-core/lib/server/chromium/appIcon.png create mode 100644 node_modules/playwright-core/lib/server/deviceDescriptorsSource.json create mode 100644 node_modules/playwright-core/lib/server/electron/loader.js create mode 100644 node_modules/playwright-core/lib/serverRegistry.js create mode 100644 node_modules/playwright-core/lib/serverRegistry.js.LICENSE create mode 100644 node_modules/playwright-core/lib/tools/cli-client/channelSessions.js create mode 100644 node_modules/playwright-core/lib/tools/cli-client/cli.js create mode 100644 node_modules/playwright-core/lib/tools/cli-client/help.json create mode 100644 node_modules/playwright-core/lib/tools/cli-client/minimist.js create mode 100644 node_modules/playwright-core/lib/tools/cli-client/output.js create mode 100644 node_modules/playwright-core/lib/tools/cli-client/program.js create mode 100644 node_modules/playwright-core/lib/tools/cli-client/registry.js create mode 100644 node_modules/playwright-core/lib/tools/cli-client/session.js create mode 100644 node_modules/playwright-core/lib/tools/cli-client/skill/SKILL.md create mode 100644 node_modules/playwright-core/lib/tools/cli-client/skill/references/element-attributes.md create mode 100644 node_modules/playwright-core/lib/tools/cli-client/skill/references/playwright-tests.md create mode 100644 node_modules/playwright-core/lib/tools/cli-client/skill/references/request-mocking.md create mode 100644 node_modules/playwright-core/lib/tools/cli-client/skill/references/running-code.md create mode 100644 node_modules/playwright-core/lib/tools/cli-client/skill/references/session-management.md create mode 100644 node_modules/playwright-core/lib/tools/cli-client/skill/references/spec-driven-testing.md create mode 100644 node_modules/playwright-core/lib/tools/cli-client/skill/references/storage-state.md create mode 100644 node_modules/playwright-core/lib/tools/cli-client/skill/references/test-generation.md create mode 100644 node_modules/playwright-core/lib/tools/cli-client/skill/references/tracing.md create mode 100644 node_modules/playwright-core/lib/tools/cli-client/skill/references/video-recording.md create mode 100644 node_modules/playwright-core/lib/tools/dashboard/appIcon.png create mode 100644 node_modules/playwright-core/lib/tools/trace/SKILL.md create mode 100644 node_modules/playwright-core/lib/tools/utils/extension.js create mode 100644 node_modules/playwright-core/lib/tools/utils/socketConnection.js create mode 100644 node_modules/playwright-core/lib/utilsBundle.js create mode 100644 node_modules/playwright-core/lib/utilsBundle.js.LICENSE create mode 100644 node_modules/playwright-core/lib/vite/dashboard/assets/codicon-DCmgc-ay.ttf create mode 100644 node_modules/playwright-core/lib/vite/dashboard/assets/firefox-1bWoP6pv.svg create mode 100644 node_modules/playwright-core/lib/vite/dashboard/assets/firefox-beta-k3eOH_eK.svg create mode 100644 node_modules/playwright-core/lib/vite/dashboard/assets/firefox-nightly-Cp5nfeDT.svg create mode 100644 node_modules/playwright-core/lib/vite/dashboard/assets/index-BY2S1tHT.css create mode 100644 node_modules/playwright-core/lib/vite/dashboard/assets/index-C_5TMfeg.js create mode 100644 node_modules/playwright-core/lib/vite/dashboard/assets/safari-na3_-uQk.svg create mode 100644 node_modules/playwright-core/lib/vite/dashboard/index.html create mode 100644 node_modules/playwright-core/lib/vite/dashboard/playwright-logo.svg create mode 100644 node_modules/playwright-core/lib/vite/htmlReport/index.html create mode 100644 node_modules/playwright-core/lib/vite/htmlReport/report.css create mode 100644 node_modules/playwright-core/lib/vite/htmlReport/report.js create mode 100644 node_modules/playwright-core/lib/vite/recorder/assets/codeMirrorModule-DYBRYzYX.css create mode 100644 node_modules/playwright-core/lib/vite/recorder/assets/codeMirrorModule-DeBYQozu.js create mode 100644 node_modules/playwright-core/lib/vite/recorder/assets/codicon-DCmgc-ay.ttf create mode 100644 node_modules/playwright-core/lib/vite/recorder/assets/index-4ZiSSCmn.css create mode 100644 node_modules/playwright-core/lib/vite/recorder/assets/index-Bq-mQf8S.js create mode 100644 node_modules/playwright-core/lib/vite/recorder/index.html create mode 100644 node_modules/playwright-core/lib/vite/recorder/playwright-logo.svg create mode 100644 node_modules/playwright-core/lib/vite/traceViewer/assets/codeMirrorModule-LEHpjmcn.js create mode 100644 node_modules/playwright-core/lib/vite/traceViewer/assets/defaultSettingsView-BNmKHKpQ.js create mode 100644 node_modules/playwright-core/lib/vite/traceViewer/assets/urlMatch-BYQrIQwR.js create mode 100644 node_modules/playwright-core/lib/vite/traceViewer/assets/xtermModule-CsJ4vdCR.js create mode 100644 node_modules/playwright-core/lib/vite/traceViewer/codeMirrorModule.DYBRYzYX.css create mode 100644 node_modules/playwright-core/lib/vite/traceViewer/codicon.DCmgc-ay.ttf create mode 100644 node_modules/playwright-core/lib/vite/traceViewer/defaultSettingsView.CjdS-WJx.css create mode 100644 node_modules/playwright-core/lib/vite/traceViewer/index.CzXZzn5A.css create mode 100644 node_modules/playwright-core/lib/vite/traceViewer/index.DEBl1tfz.js create mode 100644 node_modules/playwright-core/lib/vite/traceViewer/index.html create mode 100644 node_modules/playwright-core/lib/vite/traceViewer/manifest.webmanifest create mode 100644 node_modules/playwright-core/lib/vite/traceViewer/playwright-logo.svg create mode 100644 node_modules/playwright-core/lib/vite/traceViewer/snapshot.html create mode 100644 node_modules/playwright-core/lib/vite/traceViewer/snapshot.v8KI4P3m.js create mode 100644 node_modules/playwright-core/lib/vite/traceViewer/sw.bundle.js create mode 100644 node_modules/playwright-core/lib/vite/traceViewer/uiMode.BZQ54Kgt.css create mode 100644 node_modules/playwright-core/lib/vite/traceViewer/uiMode.Ut8wwJNp.js create mode 100644 node_modules/playwright-core/lib/vite/traceViewer/uiMode.html create mode 100644 node_modules/playwright-core/lib/vite/traceViewer/xtermModule.DYP7pi_n.css create mode 100644 node_modules/playwright-core/lib/xdg-open create mode 100644 node_modules/playwright-core/package.json create mode 100644 node_modules/playwright-core/types/protocol.d.ts create mode 100644 node_modules/playwright-core/types/structs.d.ts create mode 100644 node_modules/playwright-core/types/types.d.ts create mode 100644 node_modules/playwright/LICENSE create mode 100644 node_modules/playwright/NOTICE create mode 100644 node_modules/playwright/README.md create mode 100644 node_modules/playwright/ThirdPartyNotices.txt create mode 100644 node_modules/playwright/cli.js create mode 100644 node_modules/playwright/index.d.ts create mode 100644 node_modules/playwright/index.js create mode 100644 node_modules/playwright/index.mjs create mode 100644 node_modules/playwright/jsx-runtime.js create mode 100644 node_modules/playwright/jsx-runtime.mjs create mode 100644 node_modules/playwright/lib/agents/agentParser.js create mode 100644 node_modules/playwright/lib/agents/copilot-setup-steps.yml create mode 100644 node_modules/playwright/lib/agents/generateAgents.js create mode 100644 node_modules/playwright/lib/agents/playwright-test-coverage.prompt.md create mode 100644 node_modules/playwright/lib/agents/playwright-test-generate.prompt.md create mode 100644 node_modules/playwright/lib/agents/playwright-test-generator.agent.md create mode 100644 node_modules/playwright/lib/agents/playwright-test-heal.prompt.md create mode 100644 node_modules/playwright/lib/agents/playwright-test-healer.agent.md create mode 100644 node_modules/playwright/lib/agents/playwright-test-plan.prompt.md create mode 100644 node_modules/playwright/lib/agents/playwright-test-planner.agent.md create mode 100644 node_modules/playwright/lib/cli/reportActions.js create mode 100644 node_modules/playwright/lib/cli/testActions.js create mode 100644 node_modules/playwright/lib/common/index.js create mode 100644 node_modules/playwright/lib/common/index.js.txt create mode 100644 node_modules/playwright/lib/errorContext.js create mode 100644 node_modules/playwright/lib/globals.js create mode 100644 node_modules/playwright/lib/index.js create mode 100644 node_modules/playwright/lib/isomorphic.js create mode 100644 node_modules/playwright/lib/isomorphic.js.txt create mode 100644 node_modules/playwright/lib/loader/loaderProcessEntry.js create mode 100644 node_modules/playwright/lib/loader/loaderProcessEntry.js.txt create mode 100644 node_modules/playwright/lib/matchers/expect.js create mode 100644 node_modules/playwright/lib/matchers/expect.js.LICENSE create mode 100644 node_modules/playwright/lib/matchers/expect.js.txt create mode 100644 node_modules/playwright/lib/mcp/test/browserBackend.js create mode 100644 node_modules/playwright/lib/mcp/test/generatorTools.js create mode 100644 node_modules/playwright/lib/mcp/test/plannerTools.js create mode 100644 node_modules/playwright/lib/mcp/test/seed.js create mode 100644 node_modules/playwright/lib/mcp/test/streams.js create mode 100644 node_modules/playwright/lib/mcp/test/testBackend.js create mode 100644 node_modules/playwright/lib/mcp/test/testContext.js create mode 100644 node_modules/playwright/lib/mcp/test/testTool.js create mode 100644 node_modules/playwright/lib/mcp/test/testTools.js create mode 100644 node_modules/playwright/lib/package.js create mode 100644 node_modules/playwright/lib/program.js create mode 100644 node_modules/playwright/lib/runner/index.js create mode 100644 node_modules/playwright/lib/runner/index.js.txt create mode 100644 node_modules/playwright/lib/transform/babelBundle.js create mode 100644 node_modules/playwright/lib/transform/babelBundle.js.LICENSE create mode 100644 node_modules/playwright/lib/transform/babelBundle.js.txt create mode 100644 node_modules/playwright/lib/transform/esmLoader.js create mode 100644 node_modules/playwright/lib/transform/esmLoader.js.LICENSE create mode 100644 node_modules/playwright/lib/transform/esmLoader.js.txt create mode 100644 node_modules/playwright/lib/util.js create mode 100644 node_modules/playwright/lib/worker/workerProcessEntry.js create mode 100644 node_modules/playwright/lib/worker/workerProcessEntry.js.txt create mode 100644 node_modules/playwright/package.json create mode 100644 node_modules/playwright/test.d.ts create mode 100644 node_modules/playwright/test.js create mode 100644 node_modules/playwright/test.mjs create mode 100644 node_modules/playwright/types/test.d.ts create mode 100644 node_modules/playwright/types/testReporter.d.ts create mode 100644 node_modules/progress/CHANGELOG.md create mode 100644 node_modules/progress/LICENSE create mode 100644 node_modules/progress/Makefile create mode 100644 node_modules/progress/Readme.md create mode 100644 node_modules/progress/index.js create mode 100644 node_modules/progress/lib/node-progress.js create mode 100644 node_modules/progress/package.json create mode 100644 node_modules/property-expr/LICENSE.txt create mode 100644 node_modules/property-expr/README.md create mode 100644 node_modules/property-expr/compiler.js create mode 100644 node_modules/property-expr/index.d.ts create mode 100644 node_modules/property-expr/index.js create mode 100644 node_modules/property-expr/package.json create mode 100644 node_modules/read-package-up/index.d.ts create mode 100644 node_modules/read-package-up/index.js create mode 100644 node_modules/read-package-up/license create mode 100644 node_modules/read-package-up/node_modules/type-fest/index.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/license-cc0 create mode 100644 node_modules/read-package-up/node_modules/type-fest/license-mit create mode 100644 node_modules/read-package-up/node_modules/type-fest/package.json create mode 100644 node_modules/read-package-up/node_modules/type-fest/readme.md create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/absolute.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/all-extend.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/all-union-fields.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/and-all.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/and.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/array-element.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/array-indices.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/array-length.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/array-reverse.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/array-slice.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/array-splice.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/array-tail.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/array-values.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/arrayable.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/async-return-type.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/asyncify.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/basic.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/camel-case.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/camel-cased-properties-deep.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/camel-cased-properties.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/characters.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/conditional-except.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/conditional-keys.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/conditional-pick-deep.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/conditional-pick.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/conditional-simplify-deep.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/conditional-simplify.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/delimiter-case.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/delimiter-cased-properties-deep.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/delimiter-cased-properties.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/distributed-omit.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/distributed-pick.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/empty-object.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/entries.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/entry.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/exact.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/except.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/exclude-exactly.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/exclude-rest-element.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/exclude-strict.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/exclusify-union.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/extends-strict.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/extract-rest-element.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/extract-strict.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/find-global-type.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/fixed-length-array.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/get.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/global-this.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/globals/index.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/globals/observable-like.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/greater-than-or-equal.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/greater-than.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/has-optional-keys.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/has-readonly-keys.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/has-required-keys.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/has-writable-keys.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/if-any.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/if-empty-object.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/if-never.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/if-null.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/if-unknown.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/if.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/includes.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/int-closed-range.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/int-range.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/internal/array.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/internal/characters.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/internal/enforce-optional.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/internal/index.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/internal/keys.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/internal/numeric.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/internal/object.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/internal/string.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/internal/tuple.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/internal/type.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/invariant-of.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/is-any.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/is-equal.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/is-float.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/is-integer.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/is-literal.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/is-lowercase.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/is-never.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/is-null.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/is-nullable.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/is-optional-key-of.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/is-optional.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/is-readonly-key-of.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/is-required-key-of.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/is-tuple.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/is-undefined.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/is-union.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/is-unknown.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/is-uppercase.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/is-writable-key-of.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/iterable-element.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/join.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/json-value.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/jsonifiable.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/jsonify.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/kebab-case.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/kebab-cased-properties-deep.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/kebab-cased-properties.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/key-as-string.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/keys-of-union.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/last-array-element.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/less-than-or-equal.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/less-than.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/literal-to-primitive-deep.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/literal-to-primitive.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/literal-union.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/merge-deep.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/merge-exclusive.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/merge.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/multidimensional-array.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/multidimensional-readonly-array.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/non-empty-object.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/non-empty-string.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/non-empty-tuple.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/non-nullable-deep.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/numeric.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/object-merge.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/omit-deep.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/omit-index-signature.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/opaque.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/optional-keys-of.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/optional.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/or-all.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/or.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/override-properties.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/package-json.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/partial-deep.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/partial-on-undefined-deep.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/pascal-case.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/pascal-cased-properties-deep.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/pascal-cased-properties.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/paths.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/pick-deep.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/pick-index-signature.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/primitive.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/promisable.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/readonly-deep.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/readonly-keys-of.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/readonly-tuple.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/remove-prefix.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/remove-suffix.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/replace.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/require-all-or-none.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/require-at-least-one.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/require-exactly-one.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/require-one-or-none.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/required-deep.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/required-keys-of.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/schema.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/screaming-snake-case.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/set-field-type.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/set-non-nullable-deep.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/set-non-nullable.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/set-optional.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/set-parameter-type.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/set-readonly.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/set-required-deep.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/set-required.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/set-return-type.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/shared-union-fields-deep.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/shared-union-fields.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/simplify-deep.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/simplify.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/single-key-object.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/snake-case.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/snake-cased-properties-deep.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/snake-cased-properties.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/some-extend.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/split-on-rest-element.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/split.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/spread.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/string-repeat.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/string-slice.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/stringified.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/structured-cloneable.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/subtract.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/sum.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/tagged-union.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/tagged.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/trim.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/tsconfig-json.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/tuple-of.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/tuple-to-object.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/tuple-to-union.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/typed-array.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/undefined-on-partial-deep.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/union-length.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/union-member.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/union-to-intersection.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/union-to-tuple.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/unknown-array.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/unknown-map.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/unknown-record.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/unknown-set.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/unwrap-partial.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/unwrap-required.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/value-of.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/words.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/writable-deep.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/writable-keys-of.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/writable.d.ts create mode 100644 node_modules/read-package-up/node_modules/type-fest/source/xor.d.ts create mode 100644 node_modules/read-package-up/package.json create mode 100644 node_modules/read-package-up/readme.md create mode 100644 node_modules/read-pkg/index.d.ts create mode 100644 node_modules/read-pkg/index.js create mode 100644 node_modules/read-pkg/license create mode 100644 node_modules/read-pkg/node_modules/type-fest/index.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/license-cc0 create mode 100644 node_modules/read-pkg/node_modules/type-fest/license-mit create mode 100644 node_modules/read-pkg/node_modules/type-fest/package.json create mode 100644 node_modules/read-pkg/node_modules/type-fest/readme.md create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/absolute.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/all-extend.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/all-union-fields.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/and-all.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/and.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/array-element.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/array-indices.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/array-length.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/array-reverse.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/array-slice.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/array-splice.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/array-tail.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/array-values.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/arrayable.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/async-return-type.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/asyncify.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/basic.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/camel-case.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/camel-cased-properties-deep.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/camel-cased-properties.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/characters.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/conditional-except.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/conditional-keys.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/conditional-pick-deep.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/conditional-pick.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/conditional-simplify-deep.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/conditional-simplify.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/delimiter-case.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/delimiter-cased-properties-deep.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/delimiter-cased-properties.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/distributed-omit.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/distributed-pick.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/empty-object.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/entries.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/entry.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/exact.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/except.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/exclude-exactly.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/exclude-rest-element.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/exclude-strict.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/exclusify-union.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/extends-strict.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/extract-rest-element.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/extract-strict.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/find-global-type.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/fixed-length-array.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/get.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/global-this.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/globals/index.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/globals/observable-like.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/greater-than-or-equal.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/greater-than.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/has-optional-keys.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/has-readonly-keys.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/has-required-keys.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/has-writable-keys.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/if-any.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/if-empty-object.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/if-never.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/if-null.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/if-unknown.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/if.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/includes.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/int-closed-range.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/int-range.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/internal/array.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/internal/characters.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/internal/enforce-optional.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/internal/index.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/internal/keys.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/internal/numeric.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/internal/object.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/internal/string.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/internal/tuple.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/internal/type.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/invariant-of.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/is-any.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/is-equal.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/is-float.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/is-integer.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/is-literal.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/is-lowercase.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/is-never.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/is-null.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/is-nullable.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/is-optional-key-of.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/is-optional.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/is-readonly-key-of.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/is-required-key-of.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/is-tuple.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/is-undefined.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/is-union.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/is-unknown.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/is-uppercase.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/is-writable-key-of.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/iterable-element.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/join.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/json-value.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/jsonifiable.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/jsonify.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/kebab-case.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/kebab-cased-properties-deep.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/kebab-cased-properties.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/key-as-string.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/keys-of-union.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/last-array-element.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/less-than-or-equal.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/less-than.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/literal-to-primitive-deep.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/literal-to-primitive.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/literal-union.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/merge-deep.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/merge-exclusive.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/merge.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/multidimensional-array.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/multidimensional-readonly-array.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/non-empty-object.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/non-empty-string.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/non-empty-tuple.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/non-nullable-deep.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/numeric.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/object-merge.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/omit-deep.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/omit-index-signature.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/opaque.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/optional-keys-of.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/optional.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/or-all.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/or.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/override-properties.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/package-json.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/partial-deep.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/partial-on-undefined-deep.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/pascal-case.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/pascal-cased-properties-deep.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/pascal-cased-properties.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/paths.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/pick-deep.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/pick-index-signature.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/primitive.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/promisable.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/readonly-deep.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/readonly-keys-of.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/readonly-tuple.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/remove-prefix.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/remove-suffix.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/replace.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/require-all-or-none.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/require-at-least-one.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/require-exactly-one.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/require-one-or-none.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/required-deep.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/required-keys-of.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/schema.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/screaming-snake-case.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/set-field-type.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/set-non-nullable-deep.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/set-non-nullable.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/set-optional.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/set-parameter-type.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/set-readonly.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/set-required-deep.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/set-required.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/set-return-type.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/shared-union-fields-deep.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/shared-union-fields.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/simplify-deep.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/simplify.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/single-key-object.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/snake-case.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/snake-cased-properties-deep.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/snake-cased-properties.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/some-extend.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/split-on-rest-element.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/split.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/spread.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/string-repeat.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/string-slice.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/stringified.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/structured-cloneable.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/subtract.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/sum.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/tagged-union.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/tagged.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/trim.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/tsconfig-json.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/tuple-of.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/tuple-to-object.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/tuple-to-union.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/typed-array.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/undefined-on-partial-deep.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/union-length.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/union-member.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/union-to-intersection.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/union-to-tuple.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/unknown-array.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/unknown-map.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/unknown-record.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/unknown-set.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/unwrap-partial.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/unwrap-required.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/value-of.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/words.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/writable-deep.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/writable-keys-of.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/writable.d.ts create mode 100644 node_modules/read-pkg/node_modules/type-fest/source/xor.d.ts create mode 100644 node_modules/read-pkg/package.json create mode 100644 node_modules/read-pkg/readme.md create mode 100644 node_modules/reflect-metadata/AUTHORS.md create mode 100644 node_modules/reflect-metadata/CopyrightNotice.txt create mode 100644 node_modules/reflect-metadata/LICENSE create mode 100644 node_modules/reflect-metadata/README.md create mode 100644 node_modules/reflect-metadata/Reflect.js create mode 100644 node_modules/reflect-metadata/ReflectLite.js create mode 100644 node_modules/reflect-metadata/ReflectNoConflict.js create mode 100644 node_modules/reflect-metadata/index.d.ts create mode 100644 node_modules/reflect-metadata/no-conflict.d.ts create mode 100644 node_modules/reflect-metadata/package.json create mode 100644 node_modules/reflect-metadata/standalone.d.ts create mode 100644 node_modules/regexp-match-indices/LICENSE create mode 100644 node_modules/regexp-match-indices/README.md create mode 100644 node_modules/regexp-match-indices/auto.d.ts create mode 100644 node_modules/regexp-match-indices/auto.js create mode 100644 node_modules/regexp-match-indices/auto.js.map create mode 100644 node_modules/regexp-match-indices/config.d.ts create mode 100644 node_modules/regexp-match-indices/config.js create mode 100644 node_modules/regexp-match-indices/config.js.map create mode 100644 node_modules/regexp-match-indices/external.d.ts create mode 100644 node_modules/regexp-match-indices/implementation.d.ts create mode 100644 node_modules/regexp-match-indices/implementation.js create mode 100644 node_modules/regexp-match-indices/implementation.js.map create mode 100644 node_modules/regexp-match-indices/index.d.ts create mode 100644 node_modules/regexp-match-indices/index.js create mode 100644 node_modules/regexp-match-indices/index.js.map create mode 100644 node_modules/regexp-match-indices/native.d.ts create mode 100644 node_modules/regexp-match-indices/native.js create mode 100644 node_modules/regexp-match-indices/native.js.map create mode 100644 node_modules/regexp-match-indices/package.json create mode 100644 node_modules/regexp-match-indices/polyfill.d.ts create mode 100644 node_modules/regexp-match-indices/polyfill.js create mode 100644 node_modules/regexp-match-indices/polyfill.js.map create mode 100644 node_modules/regexp-match-indices/shim.d.ts create mode 100644 node_modules/regexp-match-indices/shim.js create mode 100644 node_modules/regexp-match-indices/shim.js.map create mode 100644 node_modules/regexp-match-indices/shim/types.d.ts create mode 100644 node_modules/regexp-match-indices/shim/types.js create mode 100644 node_modules/regexp-match-indices/shim/types.js.map create mode 100644 node_modules/regexp-match-indices/tsconfig.build.json create mode 100644 node_modules/regexp-match-indices/types.d.ts create mode 100644 node_modules/regexp-match-indices/types.js create mode 100644 node_modules/regexp-match-indices/types.js.map create mode 100644 node_modules/regexp-tree/LICENSE create mode 100644 node_modules/regexp-tree/README.md create mode 100644 node_modules/regexp-tree/bin/regexp-tree create mode 100644 node_modules/regexp-tree/dist/bin/regexp-tree.js create mode 100644 node_modules/regexp-tree/dist/compat-transpiler/index.js create mode 100644 node_modules/regexp-tree/dist/compat-transpiler/runtime/index.js create mode 100644 node_modules/regexp-tree/dist/compat-transpiler/transforms/compat-dotall-s-transform.js create mode 100644 node_modules/regexp-tree/dist/compat-transpiler/transforms/compat-named-capturing-groups-transform.js create mode 100644 node_modules/regexp-tree/dist/compat-transpiler/transforms/compat-x-flag-transform.js create mode 100644 node_modules/regexp-tree/dist/compat-transpiler/transforms/index.js create mode 100644 node_modules/regexp-tree/dist/generator/index.js create mode 100644 node_modules/regexp-tree/dist/interpreter/finite-automaton/dfa/dfa-minimizer.js create mode 100644 node_modules/regexp-tree/dist/interpreter/finite-automaton/dfa/dfa.js create mode 100644 node_modules/regexp-tree/dist/interpreter/finite-automaton/index.js create mode 100644 node_modules/regexp-tree/dist/interpreter/finite-automaton/nfa/builders.js create mode 100644 node_modules/regexp-tree/dist/interpreter/finite-automaton/nfa/nfa-from-regexp.js create mode 100644 node_modules/regexp-tree/dist/interpreter/finite-automaton/nfa/nfa-state.js create mode 100644 node_modules/regexp-tree/dist/interpreter/finite-automaton/nfa/nfa.js create mode 100644 node_modules/regexp-tree/dist/interpreter/finite-automaton/special-symbols.js create mode 100644 node_modules/regexp-tree/dist/interpreter/finite-automaton/state.js create mode 100644 node_modules/regexp-tree/dist/optimizer/index.js create mode 100644 node_modules/regexp-tree/dist/optimizer/transforms/char-case-insensitive-lowercase-transform.js create mode 100644 node_modules/regexp-tree/dist/optimizer/transforms/char-class-classranges-merge-transform.js create mode 100644 node_modules/regexp-tree/dist/optimizer/transforms/char-class-classranges-to-chars-transform.js create mode 100644 node_modules/regexp-tree/dist/optimizer/transforms/char-class-remove-duplicates-transform.js create mode 100644 node_modules/regexp-tree/dist/optimizer/transforms/char-class-to-meta-transform.js create mode 100644 node_modules/regexp-tree/dist/optimizer/transforms/char-class-to-single-char-transform.js create mode 100644 node_modules/regexp-tree/dist/optimizer/transforms/char-code-to-simple-char-transform.js create mode 100644 node_modules/regexp-tree/dist/optimizer/transforms/char-escape-unescape-transform.js create mode 100644 node_modules/regexp-tree/dist/optimizer/transforms/char-surrogate-pair-to-single-unicode-transform.js create mode 100644 node_modules/regexp-tree/dist/optimizer/transforms/combine-repeating-patterns-transform.js create mode 100644 node_modules/regexp-tree/dist/optimizer/transforms/disjunction-remove-duplicates-transform.js create mode 100644 node_modules/regexp-tree/dist/optimizer/transforms/group-single-chars-to-char-class.js create mode 100644 node_modules/regexp-tree/dist/optimizer/transforms/index.js create mode 100644 node_modules/regexp-tree/dist/optimizer/transforms/quantifier-range-to-symbol-transform.js create mode 100644 node_modules/regexp-tree/dist/optimizer/transforms/quantifiers-merge-transform.js create mode 100644 node_modules/regexp-tree/dist/optimizer/transforms/remove-empty-group-transform.js create mode 100644 node_modules/regexp-tree/dist/optimizer/transforms/ungroup-transform.js create mode 100644 node_modules/regexp-tree/dist/parser/generated/regexp-tree.js create mode 100644 node_modules/regexp-tree/dist/parser/index.js create mode 100644 node_modules/regexp-tree/dist/parser/unicode/parser-unicode-properties.js create mode 100644 node_modules/regexp-tree/dist/regexp-tree.js create mode 100644 node_modules/regexp-tree/dist/transform/index.js create mode 100644 node_modules/regexp-tree/dist/transform/utils.js create mode 100644 node_modules/regexp-tree/dist/traverse/index.js create mode 100644 node_modules/regexp-tree/dist/traverse/node-path.js create mode 100644 node_modules/regexp-tree/dist/utils/clone.js create mode 100644 node_modules/regexp-tree/index.d.ts create mode 100644 node_modules/regexp-tree/index.js create mode 100644 node_modules/regexp-tree/package.json create mode 100644 node_modules/repeat-string/LICENSE create mode 100644 node_modules/repeat-string/README.md create mode 100644 node_modules/repeat-string/index.js create mode 100644 node_modules/repeat-string/package.json create mode 100644 node_modules/seed-random/.npmignore create mode 100644 node_modules/seed-random/.travis.yml create mode 100644 node_modules/seed-random/History.md create mode 100644 node_modules/seed-random/LICENSE create mode 100644 node_modules/seed-random/Readme.md create mode 100644 node_modules/seed-random/component.json create mode 100644 node_modules/seed-random/index.js create mode 100644 node_modules/seed-random/package.json create mode 100644 node_modules/seed-random/test/index.js create mode 100644 node_modules/semver/LICENSE create mode 100644 node_modules/semver/README.md create mode 100644 node_modules/semver/bin/semver.js create mode 100644 node_modules/semver/classes/comparator.js create mode 100644 node_modules/semver/classes/index.js create mode 100644 node_modules/semver/classes/range.js create mode 100644 node_modules/semver/classes/semver.js create mode 100644 node_modules/semver/functions/clean.js create mode 100644 node_modules/semver/functions/cmp.js create mode 100644 node_modules/semver/functions/coerce.js create mode 100644 node_modules/semver/functions/compare-build.js create mode 100644 node_modules/semver/functions/compare-loose.js create mode 100644 node_modules/semver/functions/compare.js create mode 100644 node_modules/semver/functions/diff.js create mode 100644 node_modules/semver/functions/eq.js create mode 100644 node_modules/semver/functions/gt.js create mode 100644 node_modules/semver/functions/gte.js create mode 100644 node_modules/semver/functions/inc.js create mode 100644 node_modules/semver/functions/lt.js create mode 100644 node_modules/semver/functions/lte.js create mode 100644 node_modules/semver/functions/major.js create mode 100644 node_modules/semver/functions/minor.js create mode 100644 node_modules/semver/functions/neq.js create mode 100644 node_modules/semver/functions/parse.js create mode 100644 node_modules/semver/functions/patch.js create mode 100644 node_modules/semver/functions/prerelease.js create mode 100644 node_modules/semver/functions/rcompare.js create mode 100644 node_modules/semver/functions/rsort.js create mode 100644 node_modules/semver/functions/satisfies.js create mode 100644 node_modules/semver/functions/sort.js create mode 100644 node_modules/semver/functions/valid.js create mode 100644 node_modules/semver/index.js create mode 100644 node_modules/semver/internal/constants.js create mode 100644 node_modules/semver/internal/debug.js create mode 100644 node_modules/semver/internal/identifiers.js create mode 100644 node_modules/semver/internal/lrucache.js create mode 100644 node_modules/semver/internal/parse-options.js create mode 100644 node_modules/semver/internal/re.js create mode 100644 node_modules/semver/package.json create mode 100644 node_modules/semver/preload.js create mode 100644 node_modules/semver/range.bnf create mode 100644 node_modules/semver/ranges/gtr.js create mode 100644 node_modules/semver/ranges/intersects.js create mode 100644 node_modules/semver/ranges/ltr.js create mode 100644 node_modules/semver/ranges/max-satisfying.js create mode 100644 node_modules/semver/ranges/min-satisfying.js create mode 100644 node_modules/semver/ranges/min-version.js create mode 100644 node_modules/semver/ranges/outside.js create mode 100644 node_modules/semver/ranges/simplify.js create mode 100644 node_modules/semver/ranges/subset.js create mode 100644 node_modules/semver/ranges/to-comparators.js create mode 100644 node_modules/semver/ranges/valid.js create mode 100644 node_modules/source-map-support/LICENSE.md create mode 100644 node_modules/source-map-support/README.md create mode 100644 node_modules/source-map-support/browser-source-map-support.js create mode 100644 node_modules/source-map-support/package.json create mode 100644 node_modules/source-map-support/register-hook-require.js create mode 100644 node_modules/source-map-support/register.js create mode 100644 node_modules/source-map-support/source-map-support.js create mode 100644 node_modules/source-map/CHANGELOG.md create mode 100644 node_modules/source-map/LICENSE create mode 100644 node_modules/source-map/README.md create mode 100644 node_modules/source-map/dist/source-map.debug.js create mode 100644 node_modules/source-map/dist/source-map.js create mode 100644 node_modules/source-map/dist/source-map.min.js create mode 100644 node_modules/source-map/dist/source-map.min.js.map create mode 100644 node_modules/source-map/lib/array-set.js create mode 100644 node_modules/source-map/lib/base64-vlq.js create mode 100644 node_modules/source-map/lib/base64.js create mode 100644 node_modules/source-map/lib/binary-search.js create mode 100644 node_modules/source-map/lib/mapping-list.js create mode 100644 node_modules/source-map/lib/quick-sort.js create mode 100644 node_modules/source-map/lib/source-map-consumer.js create mode 100644 node_modules/source-map/lib/source-map-generator.js create mode 100644 node_modules/source-map/lib/source-node.js create mode 100644 node_modules/source-map/lib/util.js create mode 100644 node_modules/source-map/package.json create mode 100644 node_modules/source-map/source-map.d.ts create mode 100644 node_modules/source-map/source-map.js create mode 100644 node_modules/spdx-correct/LICENSE create mode 100644 node_modules/spdx-correct/README.md create mode 100644 node_modules/spdx-correct/index.js create mode 100644 node_modules/spdx-correct/package.json create mode 100644 node_modules/spdx-exceptions/README.md create mode 100644 node_modules/spdx-exceptions/deprecated.json create mode 100644 node_modules/spdx-exceptions/index.json create mode 100644 node_modules/spdx-exceptions/package.json create mode 100644 node_modules/spdx-expression-parse/AUTHORS create mode 100644 node_modules/spdx-expression-parse/LICENSE create mode 100644 node_modules/spdx-expression-parse/README.md create mode 100644 node_modules/spdx-expression-parse/index.js create mode 100644 node_modules/spdx-expression-parse/package.json create mode 100644 node_modules/spdx-expression-parse/parse.js create mode 100644 node_modules/spdx-expression-parse/scan.js create mode 100644 node_modules/spdx-license-ids/README.md create mode 100644 node_modules/spdx-license-ids/deprecated.json create mode 100644 node_modules/spdx-license-ids/index.json create mode 100644 node_modules/spdx-license-ids/package.json create mode 100644 node_modules/stackframe/LICENSE create mode 100644 node_modules/stackframe/README.md create mode 100644 node_modules/stackframe/dist/stackframe.js create mode 100644 node_modules/stackframe/dist/stackframe.min.js create mode 100644 node_modules/stackframe/dist/stackframe.min.js.map create mode 100644 node_modules/stackframe/package.json create mode 100644 node_modules/stackframe/stackframe.d.ts create mode 100644 node_modules/stackframe/stackframe.js create mode 100644 node_modules/string-argv/CHANGELOG.md create mode 100644 node_modules/string-argv/LICENSE create mode 100644 node_modules/string-argv/README.md create mode 100644 node_modules/string-argv/index.d.ts create mode 100644 node_modules/string-argv/index.js create mode 100644 node_modules/string-argv/package.json create mode 100644 node_modules/string-width/index.d.ts create mode 100644 node_modules/string-width/index.js create mode 100644 node_modules/string-width/license create mode 100644 node_modules/string-width/package.json create mode 100644 node_modules/string-width/readme.md create mode 100644 node_modules/strip-ansi/index.d.ts create mode 100644 node_modules/strip-ansi/index.js create mode 100644 node_modules/strip-ansi/license create mode 100644 node_modules/strip-ansi/node_modules/ansi-regex/index.d.ts create mode 100644 node_modules/strip-ansi/node_modules/ansi-regex/index.js create mode 100644 node_modules/strip-ansi/node_modules/ansi-regex/license create mode 100644 node_modules/strip-ansi/node_modules/ansi-regex/package.json create mode 100644 node_modules/strip-ansi/node_modules/ansi-regex/readme.md create mode 100644 node_modules/strip-ansi/package.json create mode 100644 node_modules/strip-ansi/readme.md create mode 100644 node_modules/supports-color/browser.js create mode 100644 node_modules/supports-color/index.js create mode 100644 node_modules/supports-color/license create mode 100644 node_modules/supports-color/package.json create mode 100644 node_modules/supports-color/readme.md create mode 100644 node_modules/tagged-tag/index.d.ts create mode 100644 node_modules/tagged-tag/license create mode 100644 node_modules/tagged-tag/package.json create mode 100644 node_modules/tagged-tag/readme.md create mode 100644 node_modules/thenify-all/History.md create mode 100644 node_modules/thenify-all/LICENSE create mode 100644 node_modules/thenify-all/README.md create mode 100644 node_modules/thenify-all/index.js create mode 100644 node_modules/thenify-all/package.json create mode 100644 node_modules/thenify/History.md create mode 100644 node_modules/thenify/LICENSE create mode 100644 node_modules/thenify/README.md create mode 100644 node_modules/thenify/index.js create mode 100644 node_modules/thenify/package.json create mode 100644 node_modules/tiny-case/README.md create mode 100644 node_modules/tiny-case/index.d.ts create mode 100644 node_modules/tiny-case/index.js create mode 100644 node_modules/tiny-case/package.json create mode 100644 node_modules/tiny-case/test.js create mode 100644 node_modules/tiny-case/tsconfig.json create mode 100644 node_modules/toposort/.npmignore create mode 100644 node_modules/toposort/.travis.yml create mode 100644 node_modules/toposort/License create mode 100644 node_modules/toposort/Makefile create mode 100644 node_modules/toposort/README.md create mode 100644 node_modules/toposort/component.json create mode 100644 node_modules/toposort/graph.svg create mode 100644 node_modules/toposort/index.js create mode 100644 node_modules/toposort/package.json create mode 100644 node_modules/toposort/test.js create mode 100644 node_modules/ts-dedent/LICENSE create mode 100644 node_modules/ts-dedent/README.md create mode 100644 node_modules/ts-dedent/dist/index.d.ts create mode 100644 node_modules/ts-dedent/dist/index.js create mode 100644 node_modules/ts-dedent/dist/index.js.map create mode 100644 node_modules/ts-dedent/dist/package.json create mode 100644 node_modules/ts-dedent/esm/index.d.ts create mode 100644 node_modules/ts-dedent/esm/index.js create mode 100644 node_modules/ts-dedent/esm/index.js.map create mode 100644 node_modules/ts-dedent/esm/package.json create mode 100644 node_modules/ts-dedent/package.json create mode 100644 node_modules/ts-dedent/src/__tests__/index.spec.ts create mode 100644 node_modules/ts-dedent/src/index.ts create mode 100644 node_modules/tslib/CopyrightNotice.txt create mode 100644 node_modules/tslib/LICENSE.txt create mode 100644 node_modules/tslib/README.md create mode 100644 node_modules/tslib/SECURITY.md create mode 100644 node_modules/tslib/modules/index.d.ts create mode 100644 node_modules/tslib/modules/index.js create mode 100644 node_modules/tslib/modules/package.json create mode 100644 node_modules/tslib/package.json create mode 100644 node_modules/tslib/tslib.d.ts create mode 100644 node_modules/tslib/tslib.es6.html create mode 100644 node_modules/tslib/tslib.es6.js create mode 100644 node_modules/tslib/tslib.es6.mjs create mode 100644 node_modules/tslib/tslib.html create mode 100644 node_modules/tslib/tslib.js create mode 100644 node_modules/type-fest/index.d.ts create mode 100644 node_modules/type-fest/license-cc0 create mode 100644 node_modules/type-fest/license-mit create mode 100644 node_modules/type-fest/package.json create mode 100644 node_modules/type-fest/readme.md create mode 100644 node_modules/type-fest/source/all-union-fields.d.ts create mode 100644 node_modules/type-fest/source/and.d.ts create mode 100644 node_modules/type-fest/source/array-indices.d.ts create mode 100644 node_modules/type-fest/source/array-slice.d.ts create mode 100644 node_modules/type-fest/source/array-splice.d.ts create mode 100644 node_modules/type-fest/source/array-tail.d.ts create mode 100644 node_modules/type-fest/source/array-values.d.ts create mode 100644 node_modules/type-fest/source/arrayable.d.ts create mode 100644 node_modules/type-fest/source/async-return-type.d.ts create mode 100644 node_modules/type-fest/source/asyncify.d.ts create mode 100644 node_modules/type-fest/source/basic.d.ts create mode 100644 node_modules/type-fest/source/camel-case.d.ts create mode 100644 node_modules/type-fest/source/camel-cased-properties-deep.d.ts create mode 100644 node_modules/type-fest/source/camel-cased-properties.d.ts create mode 100644 node_modules/type-fest/source/conditional-except.d.ts create mode 100644 node_modules/type-fest/source/conditional-keys.d.ts create mode 100644 node_modules/type-fest/source/conditional-pick-deep.d.ts create mode 100644 node_modules/type-fest/source/conditional-pick.d.ts create mode 100644 node_modules/type-fest/source/conditional-simplify.d.ts create mode 100644 node_modules/type-fest/source/delimiter-case.d.ts create mode 100644 node_modules/type-fest/source/delimiter-cased-properties-deep.d.ts create mode 100644 node_modules/type-fest/source/delimiter-cased-properties.d.ts create mode 100644 node_modules/type-fest/source/distributed-omit.d.ts create mode 100644 node_modules/type-fest/source/distributed-pick.d.ts create mode 100644 node_modules/type-fest/source/empty-object.d.ts create mode 100644 node_modules/type-fest/source/enforce-optional.d.ts create mode 100644 node_modules/type-fest/source/entries.d.ts create mode 100644 node_modules/type-fest/source/entry.d.ts create mode 100644 node_modules/type-fest/source/exact.d.ts create mode 100644 node_modules/type-fest/source/except.d.ts create mode 100644 node_modules/type-fest/source/find-global-type.d.ts create mode 100644 node_modules/type-fest/source/fixed-length-array.d.ts create mode 100644 node_modules/type-fest/source/get.d.ts create mode 100644 node_modules/type-fest/source/global-this.d.ts create mode 100644 node_modules/type-fest/source/greater-than-or-equal.d.ts create mode 100644 node_modules/type-fest/source/greater-than.d.ts create mode 100644 node_modules/type-fest/source/has-optional-keys.d.ts create mode 100644 node_modules/type-fest/source/has-readonly-keys.d.ts create mode 100644 node_modules/type-fest/source/has-required-keys.d.ts create mode 100644 node_modules/type-fest/source/has-writable-keys.d.ts create mode 100644 node_modules/type-fest/source/if-any.d.ts create mode 100644 node_modules/type-fest/source/if-empty-object.d.ts create mode 100644 node_modules/type-fest/source/if-never.d.ts create mode 100644 node_modules/type-fest/source/if-null.d.ts create mode 100644 node_modules/type-fest/source/if-unknown.d.ts create mode 100644 node_modules/type-fest/source/includes.d.ts create mode 100644 node_modules/type-fest/source/int-closed-range.d.ts create mode 100644 node_modules/type-fest/source/int-range.d.ts create mode 100644 node_modules/type-fest/source/internal/array.d.ts create mode 100644 node_modules/type-fest/source/internal/characters.d.ts create mode 100644 node_modules/type-fest/source/internal/index.d.ts create mode 100644 node_modules/type-fest/source/internal/keys.d.ts create mode 100644 node_modules/type-fest/source/internal/numeric.d.ts create mode 100644 node_modules/type-fest/source/internal/object.d.ts create mode 100644 node_modules/type-fest/source/internal/string.d.ts create mode 100644 node_modules/type-fest/source/internal/tuple.d.ts create mode 100644 node_modules/type-fest/source/internal/type.d.ts create mode 100644 node_modules/type-fest/source/invariant-of.d.ts create mode 100644 node_modules/type-fest/source/is-any.d.ts create mode 100644 node_modules/type-fest/source/is-equal.d.ts create mode 100644 node_modules/type-fest/source/is-float.d.ts create mode 100644 node_modules/type-fest/source/is-integer.d.ts create mode 100644 node_modules/type-fest/source/is-literal.d.ts create mode 100644 node_modules/type-fest/source/is-never.d.ts create mode 100644 node_modules/type-fest/source/is-null.d.ts create mode 100644 node_modules/type-fest/source/is-tuple.d.ts create mode 100644 node_modules/type-fest/source/is-unknown.d.ts create mode 100644 node_modules/type-fest/source/iterable-element.d.ts create mode 100644 node_modules/type-fest/source/join.d.ts create mode 100644 node_modules/type-fest/source/jsonifiable.d.ts create mode 100644 node_modules/type-fest/source/jsonify.d.ts create mode 100644 node_modules/type-fest/source/kebab-case.d.ts create mode 100644 node_modules/type-fest/source/kebab-cased-properties-deep.d.ts create mode 100644 node_modules/type-fest/source/kebab-cased-properties.d.ts create mode 100644 node_modules/type-fest/source/keys-of-union.d.ts create mode 100644 node_modules/type-fest/source/last-array-element.d.ts create mode 100644 node_modules/type-fest/source/less-than-or-equal.d.ts create mode 100644 node_modules/type-fest/source/less-than.d.ts create mode 100644 node_modules/type-fest/source/literal-to-primitive-deep.d.ts create mode 100644 node_modules/type-fest/source/literal-to-primitive.d.ts create mode 100644 node_modules/type-fest/source/literal-union.d.ts create mode 100644 node_modules/type-fest/source/merge-deep.d.ts create mode 100644 node_modules/type-fest/source/merge-exclusive.d.ts create mode 100644 node_modules/type-fest/source/merge.d.ts create mode 100644 node_modules/type-fest/source/multidimensional-array.d.ts create mode 100644 node_modules/type-fest/source/multidimensional-readonly-array.d.ts create mode 100644 node_modules/type-fest/source/non-empty-object.d.ts create mode 100644 node_modules/type-fest/source/non-empty-string.d.ts create mode 100644 node_modules/type-fest/source/non-empty-tuple.d.ts create mode 100644 node_modules/type-fest/source/numeric.d.ts create mode 100644 node_modules/type-fest/source/observable-like.d.ts create mode 100644 node_modules/type-fest/source/omit-deep.d.ts create mode 100644 node_modules/type-fest/source/omit-index-signature.d.ts create mode 100644 node_modules/type-fest/source/opaque.d.ts create mode 100644 node_modules/type-fest/source/optional-keys-of.d.ts create mode 100644 node_modules/type-fest/source/or.d.ts create mode 100644 node_modules/type-fest/source/override-properties.d.ts create mode 100644 node_modules/type-fest/source/package-json.d.ts create mode 100644 node_modules/type-fest/source/partial-deep.d.ts create mode 100644 node_modules/type-fest/source/partial-on-undefined-deep.d.ts create mode 100644 node_modules/type-fest/source/pascal-case.d.ts create mode 100644 node_modules/type-fest/source/pascal-cased-properties-deep.d.ts create mode 100644 node_modules/type-fest/source/pascal-cased-properties.d.ts create mode 100644 node_modules/type-fest/source/paths.d.ts create mode 100644 node_modules/type-fest/source/pick-deep.d.ts create mode 100644 node_modules/type-fest/source/pick-index-signature.d.ts create mode 100644 node_modules/type-fest/source/primitive.d.ts create mode 100644 node_modules/type-fest/source/promisable.d.ts create mode 100644 node_modules/type-fest/source/readonly-deep.d.ts create mode 100644 node_modules/type-fest/source/readonly-keys-of.d.ts create mode 100644 node_modules/type-fest/source/readonly-tuple.d.ts create mode 100644 node_modules/type-fest/source/replace.d.ts create mode 100644 node_modules/type-fest/source/require-all-or-none.d.ts create mode 100644 node_modules/type-fest/source/require-at-least-one.d.ts create mode 100644 node_modules/type-fest/source/require-exactly-one.d.ts create mode 100644 node_modules/type-fest/source/require-one-or-none.d.ts create mode 100644 node_modules/type-fest/source/required-deep.d.ts create mode 100644 node_modules/type-fest/source/required-keys-of.d.ts create mode 100644 node_modules/type-fest/source/schema.d.ts create mode 100644 node_modules/type-fest/source/screaming-snake-case.d.ts create mode 100644 node_modules/type-fest/source/set-field-type.d.ts create mode 100644 node_modules/type-fest/source/set-non-nullable-deep.d.ts create mode 100644 node_modules/type-fest/source/set-non-nullable.d.ts create mode 100644 node_modules/type-fest/source/set-optional.d.ts create mode 100644 node_modules/type-fest/source/set-parameter-type.d.ts create mode 100644 node_modules/type-fest/source/set-readonly.d.ts create mode 100644 node_modules/type-fest/source/set-required-deep.d.ts create mode 100644 node_modules/type-fest/source/set-required.d.ts create mode 100644 node_modules/type-fest/source/set-return-type.d.ts create mode 100644 node_modules/type-fest/source/shared-union-fields-deep.d.ts create mode 100644 node_modules/type-fest/source/shared-union-fields.d.ts create mode 100644 node_modules/type-fest/source/simplify-deep.d.ts create mode 100644 node_modules/type-fest/source/simplify.d.ts create mode 100644 node_modules/type-fest/source/single-key-object.d.ts create mode 100644 node_modules/type-fest/source/snake-case.d.ts create mode 100644 node_modules/type-fest/source/snake-cased-properties-deep.d.ts create mode 100644 node_modules/type-fest/source/snake-cased-properties.d.ts create mode 100644 node_modules/type-fest/source/split.d.ts create mode 100644 node_modules/type-fest/source/spread.d.ts create mode 100644 node_modules/type-fest/source/string-key-of.d.ts create mode 100644 node_modules/type-fest/source/string-repeat.d.ts create mode 100644 node_modules/type-fest/source/string-slice.d.ts create mode 100644 node_modules/type-fest/source/stringified.d.ts create mode 100644 node_modules/type-fest/source/structured-cloneable.d.ts create mode 100644 node_modules/type-fest/source/subtract.d.ts create mode 100644 node_modules/type-fest/source/sum.d.ts create mode 100644 node_modules/type-fest/source/tagged-union.d.ts create mode 100644 node_modules/type-fest/source/tagged.d.ts create mode 100644 node_modules/type-fest/source/trim.d.ts create mode 100644 node_modules/type-fest/source/tsconfig-json.d.ts create mode 100644 node_modules/type-fest/source/tuple-to-object.d.ts create mode 100644 node_modules/type-fest/source/tuple-to-union.d.ts create mode 100644 node_modules/type-fest/source/typed-array.d.ts create mode 100644 node_modules/type-fest/source/undefined-on-partial-deep.d.ts create mode 100644 node_modules/type-fest/source/union-to-intersection.d.ts create mode 100644 node_modules/type-fest/source/union-to-tuple.d.ts create mode 100644 node_modules/type-fest/source/unknown-array.d.ts create mode 100644 node_modules/type-fest/source/unknown-map.d.ts create mode 100644 node_modules/type-fest/source/unknown-record.d.ts create mode 100644 node_modules/type-fest/source/unknown-set.d.ts create mode 100644 node_modules/type-fest/source/value-of.d.ts create mode 100644 node_modules/type-fest/source/words.d.ts create mode 100644 node_modules/type-fest/source/writable-deep.d.ts create mode 100644 node_modules/type-fest/source/writable-keys-of.d.ts create mode 100644 node_modules/type-fest/source/writable.d.ts create mode 100644 node_modules/unicorn-magic/default.d.ts create mode 100644 node_modules/unicorn-magic/default.js create mode 100644 node_modules/unicorn-magic/license create mode 100644 node_modules/unicorn-magic/node.d.ts create mode 100644 node_modules/unicorn-magic/node.js create mode 100644 node_modules/unicorn-magic/package.json create mode 100644 node_modules/unicorn-magic/readme.md create mode 100644 node_modules/upper-case-first/LICENSE create mode 100644 node_modules/upper-case-first/README.md create mode 100644 node_modules/upper-case-first/dist.es2015/index.d.ts create mode 100644 node_modules/upper-case-first/dist.es2015/index.js create mode 100644 node_modules/upper-case-first/dist.es2015/index.js.map create mode 100644 node_modules/upper-case-first/dist.es2015/index.spec.d.ts create mode 100644 node_modules/upper-case-first/dist.es2015/index.spec.js create mode 100644 node_modules/upper-case-first/dist.es2015/index.spec.js.map create mode 100644 node_modules/upper-case-first/dist/index.d.ts create mode 100644 node_modules/upper-case-first/dist/index.js create mode 100644 node_modules/upper-case-first/dist/index.js.map create mode 100644 node_modules/upper-case-first/dist/index.spec.d.ts create mode 100644 node_modules/upper-case-first/dist/index.spec.js create mode 100644 node_modules/upper-case-first/dist/index.spec.js.map create mode 100644 node_modules/upper-case-first/package.json create mode 100644 node_modules/util-arity/LICENSE create mode 100644 node_modules/util-arity/README.md create mode 100644 node_modules/util-arity/arity.d.ts create mode 100644 node_modules/util-arity/arity.js create mode 100644 node_modules/util-arity/package.json create mode 100644 node_modules/validate-npm-package-license/LICENSE create mode 100644 node_modules/validate-npm-package-license/README.md create mode 100644 node_modules/validate-npm-package-license/index.js create mode 100644 node_modules/validate-npm-package-license/package.json create mode 100644 node_modules/xmlbuilder/.nycrc create mode 100644 node_modules/xmlbuilder/.vscode/launch.json create mode 100644 node_modules/xmlbuilder/CHANGELOG.md create mode 100644 node_modules/xmlbuilder/LICENSE create mode 100644 node_modules/xmlbuilder/README.md create mode 100644 node_modules/xmlbuilder/lib/Derivation.js create mode 100644 node_modules/xmlbuilder/lib/DocumentPosition.js create mode 100644 node_modules/xmlbuilder/lib/NodeType.js create mode 100644 node_modules/xmlbuilder/lib/OperationType.js create mode 100644 node_modules/xmlbuilder/lib/Utility.js create mode 100644 node_modules/xmlbuilder/lib/WriterState.js create mode 100644 node_modules/xmlbuilder/lib/XMLAttribute.js create mode 100644 node_modules/xmlbuilder/lib/XMLCData.js create mode 100644 node_modules/xmlbuilder/lib/XMLCharacterData.js create mode 100644 node_modules/xmlbuilder/lib/XMLComment.js create mode 100644 node_modules/xmlbuilder/lib/XMLDOMConfiguration.js create mode 100644 node_modules/xmlbuilder/lib/XMLDOMErrorHandler.js create mode 100644 node_modules/xmlbuilder/lib/XMLDOMImplementation.js create mode 100644 node_modules/xmlbuilder/lib/XMLDOMStringList.js create mode 100644 node_modules/xmlbuilder/lib/XMLDTDAttList.js create mode 100644 node_modules/xmlbuilder/lib/XMLDTDElement.js create mode 100644 node_modules/xmlbuilder/lib/XMLDTDEntity.js create mode 100644 node_modules/xmlbuilder/lib/XMLDTDNotation.js create mode 100644 node_modules/xmlbuilder/lib/XMLDeclaration.js create mode 100644 node_modules/xmlbuilder/lib/XMLDocType.js create mode 100644 node_modules/xmlbuilder/lib/XMLDocument.js create mode 100644 node_modules/xmlbuilder/lib/XMLDocumentCB.js create mode 100644 node_modules/xmlbuilder/lib/XMLDocumentFragment.js create mode 100644 node_modules/xmlbuilder/lib/XMLDummy.js create mode 100644 node_modules/xmlbuilder/lib/XMLElement.js create mode 100644 node_modules/xmlbuilder/lib/XMLNamedNodeMap.js create mode 100644 node_modules/xmlbuilder/lib/XMLNode.js create mode 100644 node_modules/xmlbuilder/lib/XMLNodeFilter.js create mode 100644 node_modules/xmlbuilder/lib/XMLNodeList.js create mode 100644 node_modules/xmlbuilder/lib/XMLProcessingInstruction.js create mode 100644 node_modules/xmlbuilder/lib/XMLRaw.js create mode 100644 node_modules/xmlbuilder/lib/XMLStreamWriter.js create mode 100644 node_modules/xmlbuilder/lib/XMLStringWriter.js create mode 100644 node_modules/xmlbuilder/lib/XMLStringifier.js create mode 100644 node_modules/xmlbuilder/lib/XMLText.js create mode 100644 node_modules/xmlbuilder/lib/XMLTypeInfo.js create mode 100644 node_modules/xmlbuilder/lib/XMLUserDataHandler.js create mode 100644 node_modules/xmlbuilder/lib/XMLWriterBase.js create mode 100644 node_modules/xmlbuilder/lib/index.js create mode 100644 node_modules/xmlbuilder/package.json create mode 100644 node_modules/xmlbuilder/perf/basic/escaping.coffee create mode 100644 node_modules/xmlbuilder/perf/basic/object.coffee create mode 100644 node_modules/xmlbuilder/perf/index.coffee create mode 100644 node_modules/xmlbuilder/perf/perf.list create mode 100644 node_modules/xmlbuilder/typings/index.d.ts create mode 100644 node_modules/yaml/LICENSE create mode 100644 node_modules/yaml/README.md create mode 100644 node_modules/yaml/bin.mjs create mode 100644 node_modules/yaml/browser/dist/compose/compose-collection.js create mode 100644 node_modules/yaml/browser/dist/compose/compose-doc.js create mode 100644 node_modules/yaml/browser/dist/compose/compose-node.js create mode 100644 node_modules/yaml/browser/dist/compose/compose-scalar.js create mode 100644 node_modules/yaml/browser/dist/compose/composer.js create mode 100644 node_modules/yaml/browser/dist/compose/resolve-block-map.js create mode 100644 node_modules/yaml/browser/dist/compose/resolve-block-scalar.js create mode 100644 node_modules/yaml/browser/dist/compose/resolve-block-seq.js create mode 100644 node_modules/yaml/browser/dist/compose/resolve-end.js create mode 100644 node_modules/yaml/browser/dist/compose/resolve-flow-collection.js create mode 100644 node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js create mode 100644 node_modules/yaml/browser/dist/compose/resolve-props.js create mode 100644 node_modules/yaml/browser/dist/compose/util-contains-newline.js create mode 100644 node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js create mode 100644 node_modules/yaml/browser/dist/compose/util-flow-indent-check.js create mode 100644 node_modules/yaml/browser/dist/compose/util-map-includes.js create mode 100644 node_modules/yaml/browser/dist/doc/Document.js create mode 100644 node_modules/yaml/browser/dist/doc/anchors.js create mode 100644 node_modules/yaml/browser/dist/doc/applyReviver.js create mode 100644 node_modules/yaml/browser/dist/doc/createNode.js create mode 100644 node_modules/yaml/browser/dist/doc/directives.js create mode 100644 node_modules/yaml/browser/dist/errors.js create mode 100644 node_modules/yaml/browser/dist/index.js create mode 100644 node_modules/yaml/browser/dist/log.js create mode 100644 node_modules/yaml/browser/dist/nodes/Alias.js create mode 100644 node_modules/yaml/browser/dist/nodes/Collection.js create mode 100644 node_modules/yaml/browser/dist/nodes/Node.js create mode 100644 node_modules/yaml/browser/dist/nodes/Pair.js create mode 100644 node_modules/yaml/browser/dist/nodes/Scalar.js create mode 100644 node_modules/yaml/browser/dist/nodes/YAMLMap.js create mode 100644 node_modules/yaml/browser/dist/nodes/YAMLSeq.js create mode 100644 node_modules/yaml/browser/dist/nodes/addPairToJSMap.js create mode 100644 node_modules/yaml/browser/dist/nodes/identity.js create mode 100644 node_modules/yaml/browser/dist/nodes/toJS.js create mode 100644 node_modules/yaml/browser/dist/parse/cst-scalar.js create mode 100644 node_modules/yaml/browser/dist/parse/cst-stringify.js create mode 100644 node_modules/yaml/browser/dist/parse/cst-visit.js create mode 100644 node_modules/yaml/browser/dist/parse/cst.js create mode 100644 node_modules/yaml/browser/dist/parse/lexer.js create mode 100644 node_modules/yaml/browser/dist/parse/line-counter.js create mode 100644 node_modules/yaml/browser/dist/parse/parser.js create mode 100644 node_modules/yaml/browser/dist/public-api.js create mode 100644 node_modules/yaml/browser/dist/schema/Schema.js create mode 100644 node_modules/yaml/browser/dist/schema/common/map.js create mode 100644 node_modules/yaml/browser/dist/schema/common/null.js create mode 100644 node_modules/yaml/browser/dist/schema/common/seq.js create mode 100644 node_modules/yaml/browser/dist/schema/common/string.js create mode 100644 node_modules/yaml/browser/dist/schema/core/bool.js create mode 100644 node_modules/yaml/browser/dist/schema/core/float.js create mode 100644 node_modules/yaml/browser/dist/schema/core/int.js create mode 100644 node_modules/yaml/browser/dist/schema/core/schema.js create mode 100644 node_modules/yaml/browser/dist/schema/json/schema.js create mode 100644 node_modules/yaml/browser/dist/schema/tags.js create mode 100644 node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js create mode 100644 node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js create mode 100644 node_modules/yaml/browser/dist/schema/yaml-1.1/float.js create mode 100644 node_modules/yaml/browser/dist/schema/yaml-1.1/int.js create mode 100644 node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js create mode 100644 node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js create mode 100644 node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js create mode 100644 node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js create mode 100644 node_modules/yaml/browser/dist/schema/yaml-1.1/set.js create mode 100644 node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js create mode 100644 node_modules/yaml/browser/dist/stringify/foldFlowLines.js create mode 100644 node_modules/yaml/browser/dist/stringify/stringify.js create mode 100644 node_modules/yaml/browser/dist/stringify/stringifyCollection.js create mode 100644 node_modules/yaml/browser/dist/stringify/stringifyComment.js create mode 100644 node_modules/yaml/browser/dist/stringify/stringifyDocument.js create mode 100644 node_modules/yaml/browser/dist/stringify/stringifyNumber.js create mode 100644 node_modules/yaml/browser/dist/stringify/stringifyPair.js create mode 100644 node_modules/yaml/browser/dist/stringify/stringifyString.js create mode 100644 node_modules/yaml/browser/dist/util.js create mode 100644 node_modules/yaml/browser/dist/visit.js create mode 100644 node_modules/yaml/browser/index.js create mode 100644 node_modules/yaml/browser/package.json create mode 100644 node_modules/yaml/dist/cli.d.ts create mode 100644 node_modules/yaml/dist/cli.mjs create mode 100644 node_modules/yaml/dist/compose/compose-collection.d.ts create mode 100644 node_modules/yaml/dist/compose/compose-collection.js create mode 100644 node_modules/yaml/dist/compose/compose-doc.d.ts create mode 100644 node_modules/yaml/dist/compose/compose-doc.js create mode 100644 node_modules/yaml/dist/compose/compose-node.d.ts create mode 100644 node_modules/yaml/dist/compose/compose-node.js create mode 100644 node_modules/yaml/dist/compose/compose-scalar.d.ts create mode 100644 node_modules/yaml/dist/compose/compose-scalar.js create mode 100644 node_modules/yaml/dist/compose/composer.d.ts create mode 100644 node_modules/yaml/dist/compose/composer.js create mode 100644 node_modules/yaml/dist/compose/resolve-block-map.d.ts create mode 100644 node_modules/yaml/dist/compose/resolve-block-map.js create mode 100644 node_modules/yaml/dist/compose/resolve-block-scalar.d.ts create mode 100644 node_modules/yaml/dist/compose/resolve-block-scalar.js create mode 100644 node_modules/yaml/dist/compose/resolve-block-seq.d.ts create mode 100644 node_modules/yaml/dist/compose/resolve-block-seq.js create mode 100644 node_modules/yaml/dist/compose/resolve-end.d.ts create mode 100644 node_modules/yaml/dist/compose/resolve-end.js create mode 100644 node_modules/yaml/dist/compose/resolve-flow-collection.d.ts create mode 100644 node_modules/yaml/dist/compose/resolve-flow-collection.js create mode 100644 node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts create mode 100644 node_modules/yaml/dist/compose/resolve-flow-scalar.js create mode 100644 node_modules/yaml/dist/compose/resolve-props.d.ts create mode 100644 node_modules/yaml/dist/compose/resolve-props.js create mode 100644 node_modules/yaml/dist/compose/util-contains-newline.d.ts create mode 100644 node_modules/yaml/dist/compose/util-contains-newline.js create mode 100644 node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts create mode 100644 node_modules/yaml/dist/compose/util-empty-scalar-position.js create mode 100644 node_modules/yaml/dist/compose/util-flow-indent-check.d.ts create mode 100644 node_modules/yaml/dist/compose/util-flow-indent-check.js create mode 100644 node_modules/yaml/dist/compose/util-map-includes.d.ts create mode 100644 node_modules/yaml/dist/compose/util-map-includes.js create mode 100644 node_modules/yaml/dist/doc/Document.d.ts create mode 100644 node_modules/yaml/dist/doc/Document.js create mode 100644 node_modules/yaml/dist/doc/anchors.d.ts create mode 100644 node_modules/yaml/dist/doc/anchors.js create mode 100644 node_modules/yaml/dist/doc/applyReviver.d.ts create mode 100644 node_modules/yaml/dist/doc/applyReviver.js create mode 100644 node_modules/yaml/dist/doc/createNode.d.ts create mode 100644 node_modules/yaml/dist/doc/createNode.js create mode 100644 node_modules/yaml/dist/doc/directives.d.ts create mode 100644 node_modules/yaml/dist/doc/directives.js create mode 100644 node_modules/yaml/dist/errors.d.ts create mode 100644 node_modules/yaml/dist/errors.js create mode 100644 node_modules/yaml/dist/index.d.ts create mode 100644 node_modules/yaml/dist/index.js create mode 100644 node_modules/yaml/dist/log.d.ts create mode 100644 node_modules/yaml/dist/log.js create mode 100644 node_modules/yaml/dist/nodes/Alias.d.ts create mode 100644 node_modules/yaml/dist/nodes/Alias.js create mode 100644 node_modules/yaml/dist/nodes/Collection.d.ts create mode 100644 node_modules/yaml/dist/nodes/Collection.js create mode 100644 node_modules/yaml/dist/nodes/Node.d.ts create mode 100644 node_modules/yaml/dist/nodes/Node.js create mode 100644 node_modules/yaml/dist/nodes/Pair.d.ts create mode 100644 node_modules/yaml/dist/nodes/Pair.js create mode 100644 node_modules/yaml/dist/nodes/Scalar.d.ts create mode 100644 node_modules/yaml/dist/nodes/Scalar.js create mode 100644 node_modules/yaml/dist/nodes/YAMLMap.d.ts create mode 100644 node_modules/yaml/dist/nodes/YAMLMap.js create mode 100644 node_modules/yaml/dist/nodes/YAMLSeq.d.ts create mode 100644 node_modules/yaml/dist/nodes/YAMLSeq.js create mode 100644 node_modules/yaml/dist/nodes/addPairToJSMap.d.ts create mode 100644 node_modules/yaml/dist/nodes/addPairToJSMap.js create mode 100644 node_modules/yaml/dist/nodes/identity.d.ts create mode 100644 node_modules/yaml/dist/nodes/identity.js create mode 100644 node_modules/yaml/dist/nodes/toJS.d.ts create mode 100644 node_modules/yaml/dist/nodes/toJS.js create mode 100644 node_modules/yaml/dist/options.d.ts create mode 100644 node_modules/yaml/dist/parse/cst-scalar.d.ts create mode 100644 node_modules/yaml/dist/parse/cst-scalar.js create mode 100644 node_modules/yaml/dist/parse/cst-stringify.d.ts create mode 100644 node_modules/yaml/dist/parse/cst-stringify.js create mode 100644 node_modules/yaml/dist/parse/cst-visit.d.ts create mode 100644 node_modules/yaml/dist/parse/cst-visit.js create mode 100644 node_modules/yaml/dist/parse/cst.d.ts create mode 100644 node_modules/yaml/dist/parse/cst.js create mode 100644 node_modules/yaml/dist/parse/lexer.d.ts create mode 100644 node_modules/yaml/dist/parse/lexer.js create mode 100644 node_modules/yaml/dist/parse/line-counter.d.ts create mode 100644 node_modules/yaml/dist/parse/line-counter.js create mode 100644 node_modules/yaml/dist/parse/parser.d.ts create mode 100644 node_modules/yaml/dist/parse/parser.js create mode 100644 node_modules/yaml/dist/public-api.d.ts create mode 100644 node_modules/yaml/dist/public-api.js create mode 100644 node_modules/yaml/dist/schema/Schema.d.ts create mode 100644 node_modules/yaml/dist/schema/Schema.js create mode 100644 node_modules/yaml/dist/schema/common/map.d.ts create mode 100644 node_modules/yaml/dist/schema/common/map.js create mode 100644 node_modules/yaml/dist/schema/common/null.d.ts create mode 100644 node_modules/yaml/dist/schema/common/null.js create mode 100644 node_modules/yaml/dist/schema/common/seq.d.ts create mode 100644 node_modules/yaml/dist/schema/common/seq.js create mode 100644 node_modules/yaml/dist/schema/common/string.d.ts create mode 100644 node_modules/yaml/dist/schema/common/string.js create mode 100644 node_modules/yaml/dist/schema/core/bool.d.ts create mode 100644 node_modules/yaml/dist/schema/core/bool.js create mode 100644 node_modules/yaml/dist/schema/core/float.d.ts create mode 100644 node_modules/yaml/dist/schema/core/float.js create mode 100644 node_modules/yaml/dist/schema/core/int.d.ts create mode 100644 node_modules/yaml/dist/schema/core/int.js create mode 100644 node_modules/yaml/dist/schema/core/schema.d.ts create mode 100644 node_modules/yaml/dist/schema/core/schema.js create mode 100644 node_modules/yaml/dist/schema/json-schema.d.ts create mode 100644 node_modules/yaml/dist/schema/json/schema.d.ts create mode 100644 node_modules/yaml/dist/schema/json/schema.js create mode 100644 node_modules/yaml/dist/schema/tags.d.ts create mode 100644 node_modules/yaml/dist/schema/tags.js create mode 100644 node_modules/yaml/dist/schema/types.d.ts create mode 100644 node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts create mode 100644 node_modules/yaml/dist/schema/yaml-1.1/binary.js create mode 100644 node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts create mode 100644 node_modules/yaml/dist/schema/yaml-1.1/bool.js create mode 100644 node_modules/yaml/dist/schema/yaml-1.1/float.d.ts create mode 100644 node_modules/yaml/dist/schema/yaml-1.1/float.js create mode 100644 node_modules/yaml/dist/schema/yaml-1.1/int.d.ts create mode 100644 node_modules/yaml/dist/schema/yaml-1.1/int.js create mode 100644 node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts create mode 100644 node_modules/yaml/dist/schema/yaml-1.1/merge.js create mode 100644 node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts create mode 100644 node_modules/yaml/dist/schema/yaml-1.1/omap.js create mode 100644 node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts create mode 100644 node_modules/yaml/dist/schema/yaml-1.1/pairs.js create mode 100644 node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts create mode 100644 node_modules/yaml/dist/schema/yaml-1.1/schema.js create mode 100644 node_modules/yaml/dist/schema/yaml-1.1/set.d.ts create mode 100644 node_modules/yaml/dist/schema/yaml-1.1/set.js create mode 100644 node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts create mode 100644 node_modules/yaml/dist/schema/yaml-1.1/timestamp.js create mode 100644 node_modules/yaml/dist/stringify/foldFlowLines.d.ts create mode 100644 node_modules/yaml/dist/stringify/foldFlowLines.js create mode 100644 node_modules/yaml/dist/stringify/stringify.d.ts create mode 100644 node_modules/yaml/dist/stringify/stringify.js create mode 100644 node_modules/yaml/dist/stringify/stringifyCollection.d.ts create mode 100644 node_modules/yaml/dist/stringify/stringifyCollection.js create mode 100644 node_modules/yaml/dist/stringify/stringifyComment.d.ts create mode 100644 node_modules/yaml/dist/stringify/stringifyComment.js create mode 100644 node_modules/yaml/dist/stringify/stringifyDocument.d.ts create mode 100644 node_modules/yaml/dist/stringify/stringifyDocument.js create mode 100644 node_modules/yaml/dist/stringify/stringifyNumber.d.ts create mode 100644 node_modules/yaml/dist/stringify/stringifyNumber.js create mode 100644 node_modules/yaml/dist/stringify/stringifyPair.d.ts create mode 100644 node_modules/yaml/dist/stringify/stringifyPair.js create mode 100644 node_modules/yaml/dist/stringify/stringifyString.d.ts create mode 100644 node_modules/yaml/dist/stringify/stringifyString.js create mode 100644 node_modules/yaml/dist/test-events.d.ts create mode 100644 node_modules/yaml/dist/test-events.js create mode 100644 node_modules/yaml/dist/util.d.ts create mode 100644 node_modules/yaml/dist/util.js create mode 100644 node_modules/yaml/dist/visit.d.ts create mode 100644 node_modules/yaml/dist/visit.js create mode 100644 node_modules/yaml/package.json create mode 100644 node_modules/yaml/util.js create mode 100644 node_modules/yup/LICENSE.md create mode 100644 node_modules/yup/README.md create mode 100644 node_modules/yup/index.d.ts create mode 100644 node_modules/yup/index.esm.js create mode 100644 node_modules/yup/index.js create mode 100644 node_modules/yup/node_modules/type-fest/index.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/package.json create mode 100644 node_modules/yup/node_modules/type-fest/readme.md create mode 100644 node_modules/yup/node_modules/type-fest/source/async-return-type.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/asyncify.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/basic.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/camel-case.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/camel-cased-properties-deep.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/camel-cased-properties.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/conditional-except.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/conditional-keys.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/conditional-pick.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/delimiter-case.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/delimiter-cased-properties-deep.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/delimiter-cased-properties.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/entries.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/entry.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/exact.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/except.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/fixed-length-array.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/get.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/has-optional-keys.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/has-required-keys.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/includes.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/internal.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/invariant-of.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/iterable-element.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/join.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/jsonify.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/kebab-case.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/kebab-cased-properties-deep.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/kebab-cased-properties.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/last-array-element.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/literal-to-primitive.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/literal-union.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/merge-exclusive.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/merge.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/multidimensional-array.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/multidimensional-readonly-array.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/mutable.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/numeric.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/observable-like.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/opaque.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/optional-keys-of.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/package-json.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/partial-deep.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/partial-on-undefined-deep.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/pascal-case.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/pascal-cased-properties-deep.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/pascal-cased-properties.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/primitive.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/promisable.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/promise-value.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/readonly-deep.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/readonly-tuple.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/remove-index-signature.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/replace.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/require-all-or-none.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/require-at-least-one.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/require-exactly-one.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/required-keys-of.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/schema.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/screaming-snake-case.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/set-non-nullable.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/set-optional.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/set-required.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/set-return-type.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/simplify.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/snake-case.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/snake-cased-properties-deep.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/snake-cased-properties.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/split.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/spread.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/string-key-of.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/stringified.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/trim.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/tsconfig-json.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/typed-array.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/union-to-intersection.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/value-of.d.ts create mode 100644 node_modules/yup/node_modules/type-fest/source/writable.d.ts create mode 100644 node_modules/yup/package.json create mode 100644 test-results/.last-run.json diff --git a/Playwright-Cucumber-Exercise-main/.github/workflows/dispatch-to-grader.yml b/Playwright-Cucumber-Exercise-main/.github/workflows/dispatch-to-grader.yml new file mode 100644 index 00000000..c72def8b --- /dev/null +++ b/Playwright-Cucumber-Exercise-main/.github/workflows/dispatch-to-grader.yml @@ -0,0 +1,33 @@ +name: Dispatch to Grader + +on: + pull_request_target: + types: [opened, synchronize, reopened] + workflow_dispatch: + inputs: + pr_number: + description: 'PR number in this repo (e.g., 119)' + required: true + +jobs: + notify-grader: + runs-on: ubuntu-latest + steps: + - name: Verify token can access private grader repo + run: | + code=$(curl -s -o /dev/null -w "%{http_code}\n" \ + -H "Authorization: token ${{ secrets.GRADER_REPO_PAT }}" \ + https://api.github.com/repos/automationExamples/Playwright-Cucumber-Exercise-Eval) + echo "HTTP $code"; test "$code" = "200" + + - name: Send repository_dispatch to grader + uses: peter-evans/repository-dispatch@v3 + with: + token: ${{ secrets.GRADER_REPO_PAT }} + repository: automationExamples/Playwright-Cucumber-Exercise-Eval + event-type: grade-assessment + client-payload: > + { + "pr_number": "${{ github.event_name == 'workflow_dispatch' && github.event.inputs.pr_number || github.event.pull_request.number }}", + "repo_full": "${{ github.repository }}" + } diff --git a/Playwright-Cucumber-Exercise-main/.gitignore b/Playwright-Cucumber-Exercise-main/.gitignore new file mode 100644 index 00000000..9fd66896 --- /dev/null +++ b/Playwright-Cucumber-Exercise-main/.gitignore @@ -0,0 +1,3 @@ +report.json +cucumber_report.html +/node_modules \ No newline at end of file diff --git a/Playwright-Cucumber-Exercise-main/README.md b/Playwright-Cucumber-Exercise-main/README.md new file mode 100644 index 00000000..b9111057 --- /dev/null +++ b/Playwright-Cucumber-Exercise-main/README.md @@ -0,0 +1,58 @@ +# Sample Playwright Automation Test + +## System Requirements + +node >= v18.5.x + +npm >= v7 + + +## Setup + +// Install Visual Studio Code (or any editor) + +https://code.visualstudio.com/download + + +// Install Node.js + +https://nodejs.org/en/download + + +```bash +git clone https://github.com/automationExamples/Playwright-Cucumber-Exercise.git +npm install +npx playwright install +``` + +### Recommended vscode extensions + +Cucumber v1.7.0 + +Cucumber (Gherkin) Support enhanced for Behat + + +## Instructions +To run the test +```bash +npm run test +``` + +After running, to generate the cucumber report (cucumber_report.html) +```bash +npm run report +``` + +It is not expected that you complete every task, however, please give your best effort + +You will be scored based on your ability to complete the following tasks: + +- [ ] Install and setup this repository on your personal computer +- [ ] Complete the automation tasks listed below + +### Tasks +- [ ] Modify the scenario 'Validate the login page title' from [login.feature](features/login.feature#8) which runs but fails. Determine the cause of the failure and update the scenario to pass in the test +- [ ] Extend the scenario 'Validate login error message' from [login.feature](features/login.feature#10) which runs and passes but is missing a step. Extend the scenario to validate the error message received. +- [ ] Modify and extend the 'Validate successful purchase text' from [purchase.feature](features/purchase.feature#6) with steps for each comment listed. Consider writing a new steps.ts file along with an appropriate page.ts +- [ ] Modify and extend the 'Validate product sort by price sort' from [product.feature](features/product.feature#6) with steps for each comment listed. Utilize the Scenario Outline and Examples table to parameterize the test +- [ ] Extend the testing coverage with anything you believe would be beneficial diff --git a/Playwright-Cucumber-Exercise-main/cucumber.js b/Playwright-Cucumber-Exercise-main/cucumber.js new file mode 100644 index 00000000..e8192d63 --- /dev/null +++ b/Playwright-Cucumber-Exercise-main/cucumber.js @@ -0,0 +1,3 @@ +module.exports = { + default: `--require-module ts-node/register --require './steps/**/*.ts' --require './hooks/**/*.ts --format @cucumber/pretty-formatter` +}; \ No newline at end of file diff --git a/Playwright-Cucumber-Exercise-main/features/login.feature b/Playwright-Cucumber-Exercise-main/features/login.feature new file mode 100644 index 00000000..6f253a1b --- /dev/null +++ b/Playwright-Cucumber-Exercise-main/features/login.feature @@ -0,0 +1,11 @@ +Feature: Login Feature + + Background: + Given I open the "https://www.saucedemo.com/" page + + Scenario: Validate the login page title + Then I should see the title "Swag Labs" + + Scenario: Validate login error message + Then I will login as 'locked_out_user' + And I should see the error message "Epic sadface: Sorry, this user has been locked out." \ No newline at end of file diff --git a/Playwright-Cucumber-Exercise-main/features/logout.feature b/Playwright-Cucumber-Exercise-main/features/logout.feature new file mode 100644 index 00000000..274bbafc --- /dev/null +++ b/Playwright-Cucumber-Exercise-main/features/logout.feature @@ -0,0 +1,10 @@ +Feature: Logout Feature + + Background: + Given I open the "https://www.saucedemo.com/" page + + Scenario: Validate user logout + Then I will login as 'standard_user' + And I open the menu + And I click logout + Then I should be redirected to login page \ No newline at end of file diff --git a/Playwright-Cucumber-Exercise-main/features/product.feature b/Playwright-Cucumber-Exercise-main/features/product.feature new file mode 100644 index 00000000..58a1ccf9 --- /dev/null +++ b/Playwright-Cucumber-Exercise-main/features/product.feature @@ -0,0 +1,15 @@ +Feature: Product Feature + + Background: + Given I open the "https://www.saucedemo.com/" page + + # Validate sorting using Scenario Outline + Scenario Outline: Validate product sort by price + Then I will login as 'standard_user' + And I sort the products by "" + Then I validate products are sorted by price "" + + Examples: + | sort | + | Price (low to high) | + | Price (high to low) | \ No newline at end of file diff --git a/Playwright-Cucumber-Exercise-main/features/purchase.feature b/Playwright-Cucumber-Exercise-main/features/purchase.feature new file mode 100644 index 00000000..aae7dcd0 --- /dev/null +++ b/Playwright-Cucumber-Exercise-main/features/purchase.feature @@ -0,0 +1,12 @@ +Scenario: Validate successful purchase text + Then I will login as 'standard_user' + Then I will add the backpack to the cart + And I select the cart (top-right) + And I select Checkout + And I fill in checkout details "John" "Doe" "12345" + And I select Continue + And I select Finish + + Then I should see the confirmation header + And I should see the confirmation message + And I should be on the checkout complete page \ No newline at end of file diff --git a/Playwright-Cucumber-Exercise-main/generate-report.js b/Playwright-Cucumber-Exercise-main/generate-report.js new file mode 100644 index 00000000..2df1cc40 --- /dev/null +++ b/Playwright-Cucumber-Exercise-main/generate-report.js @@ -0,0 +1,13 @@ +const reporter = require('cucumber-html-reporter'); + +const options = { + theme: 'bootstrap', + jsonFile: 'report.json', + output: 'cucumber_report.html', + reportSuiteAsScenarios: true, + scenarioTimestamp: true, + launchReport: true, + metadata: {} +}; + +reporter.generate(options); \ No newline at end of file diff --git a/Playwright-Cucumber-Exercise-main/hooks/globalHooks.ts b/Playwright-Cucumber-Exercise-main/hooks/globalHooks.ts new file mode 100644 index 00000000..d0be8f55 --- /dev/null +++ b/Playwright-Cucumber-Exercise-main/hooks/globalHooks.ts @@ -0,0 +1,17 @@ +import { Before, After } from '@cucumber/cucumber'; +import { chromium, Browser, Page } from '@playwright/test'; +import { pageFixture } from './pageFixture'; + +let browser: Browser; +let page: Page; + +Before(async () => { + browser = await chromium.launch({ headless: false }); + page = await browser.newPage(); + pageFixture.page = page; +}); + +After(async () => { + await page.close(); + await browser.close(); +}); \ No newline at end of file diff --git a/Playwright-Cucumber-Exercise-main/hooks/pageFixture.ts b/Playwright-Cucumber-Exercise-main/hooks/pageFixture.ts new file mode 100644 index 00000000..1f1ab673 --- /dev/null +++ b/Playwright-Cucumber-Exercise-main/hooks/pageFixture.ts @@ -0,0 +1,5 @@ +import { Page } from '@playwright/test'; + +export const pageFixture = { + page: undefined as unknown as Page +}; \ No newline at end of file diff --git a/Playwright-Cucumber-Exercise-main/package-lock.json b/Playwright-Cucumber-Exercise-main/package-lock.json new file mode 100644 index 00000000..b90d7c6c --- /dev/null +++ b/Playwright-Cucumber-Exercise-main/package-lock.json @@ -0,0 +1,2762 @@ +{ + "name": "Playwright-Project", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "@cucumber/cucumber": "^10.0.1", + "@cucumber/pretty-formatter": "^1.0.0", + "@playwright/test": "^1.40.1", + "@types/node": "^20.10.3", + "cucumber-html-reporter": "^7.1.1", + "ts-node": "^10.9.1", + "typescript": "^5.3.2" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.23.4", + "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/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": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "dependencies": { + "@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": { + "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/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/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/runtime": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.5.tgz", + "integrity": "sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "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/@cucumber/ci-environment": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@cucumber/ci-environment/-/ci-environment-9.2.0.tgz", + "integrity": "sha512-jLzRtVwdtNt+uAmTwvXwW9iGYLEOJFpDSmnx/dgoMGKXUWRx1UHT86Q696CLdgXO8kyTwsgJY0c6n5SW9VitAA==", + "dev": true + }, + "node_modules/@cucumber/cucumber": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/cucumber/-/cucumber-10.0.1.tgz", + "integrity": "sha512-g7W7SQnNMSNnMRQVGubjefCxdgNFyq4P3qxT2Ve7Xhh8ZLoNkoRDcWsyfKQVWnxNfgW3aGJmxbucWRoTi+ZUqg==", + "dev": true, + "dependencies": { + "@cucumber/ci-environment": "9.2.0", + "@cucumber/cucumber-expressions": "16.1.2", + "@cucumber/gherkin": "26.2.0", + "@cucumber/gherkin-streams": "5.0.1", + "@cucumber/gherkin-utils": "8.0.2", + "@cucumber/html-formatter": "20.4.0", + "@cucumber/message-streams": "4.0.1", + "@cucumber/messages": "22.0.0", + "@cucumber/tag-expressions": "5.0.1", + "assertion-error-formatter": "^3.0.0", + "capital-case": "^1.0.4", + "chalk": "^4.1.2", + "cli-table3": "0.6.3", + "commander": "^10.0.0", + "debug": "^4.3.4", + "error-stack-parser": "^2.1.4", + "figures": "^3.2.0", + "glob": "^10.3.10", + "has-ansi": "^4.0.1", + "indent-string": "^4.0.0", + "is-installed-globally": "^0.4.0", + "is-stream": "^2.0.0", + "knuth-shuffle-seeded": "^1.0.6", + "lodash.merge": "^4.6.2", + "lodash.mergewith": "^4.6.2", + "luxon": "3.2.1", + "mkdirp": "^2.1.5", + "mz": "^2.7.0", + "progress": "^2.0.3", + "read-pkg-up": "^7.0.1", + "resolve-pkg": "^2.0.0", + "semver": "7.5.3", + "string-argv": "^0.3.1", + "strip-ansi": "6.0.1", + "supports-color": "^8.1.1", + "tmp": "^0.2.1", + "util-arity": "^1.1.0", + "verror": "^1.10.0", + "xmlbuilder": "^15.1.1", + "yaml": "^2.2.2", + "yup": "1.2.0" + }, + "bin": { + "cucumber-js": "bin/cucumber.js" + }, + "engines": { + "node": "18 || >=20" + } + }, + "node_modules/@cucumber/cucumber-expressions": { + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/@cucumber/cucumber-expressions/-/cucumber-expressions-16.1.2.tgz", + "integrity": "sha512-CfHEbxJ5FqBwF6mJyLLz4B353gyHkoi6cCL4J0lfDZ+GorpcWw4n2OUAdxJmP7ZlREANWoTFlp4FhmkLKrCfUA==", + "dev": true, + "dependencies": { + "regexp-match-indices": "1.0.2" + } + }, + "node_modules/@cucumber/gherkin": { + "version": "26.2.0", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-26.2.0.tgz", + "integrity": "sha512-iRSiK8YAIHAmLrn/mUfpAx7OXZ7LyNlh1zT89RoziSVCbqSVDxJS6ckEzW8loxs+EEXl0dKPQOXiDmbHV+C/fA==", + "dev": true, + "dependencies": { + "@cucumber/messages": ">=19.1.4 <=22" + } + }, + "node_modules/@cucumber/gherkin-streams": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin-streams/-/gherkin-streams-5.0.1.tgz", + "integrity": "sha512-/7VkIE/ASxIP/jd4Crlp4JHXqdNFxPGQokqWqsaCCiqBiu5qHoKMxcWNlp9njVL/n9yN4S08OmY3ZR8uC5x74Q==", + "dev": true, + "dependencies": { + "commander": "9.1.0", + "source-map-support": "0.5.21" + }, + "bin": { + "gherkin-javascript": "bin/gherkin" + }, + "peerDependencies": { + "@cucumber/gherkin": ">=22.0.0", + "@cucumber/message-streams": ">=4.0.0", + "@cucumber/messages": ">=17.1.1" + } + }, + "node_modules/@cucumber/gherkin-streams/node_modules/commander": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.1.0.tgz", + "integrity": "sha512-i0/MaqBtdbnJ4XQs4Pmyb+oFQl+q0lsAmokVUH92SlSw4fkeAcG3bVon+Qt7hmtF+u3Het6o4VgrcY3qAoEB6w==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/@cucumber/gherkin-utils": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin-utils/-/gherkin-utils-8.0.2.tgz", + "integrity": "sha512-aQlziN3r3cTwprEDbLEcFoMRQajb9DTOu2OZZp5xkuNz6bjSTowSY90lHUD2pWT7jhEEckZRIREnk7MAwC2d1A==", + "dev": true, + "dependencies": { + "@cucumber/gherkin": "^25.0.0", + "@cucumber/messages": "^19.1.4", + "@teppeis/multimaps": "2.0.0", + "commander": "9.4.1", + "source-map-support": "^0.5.21" + }, + "bin": { + "gherkin-utils": "bin/gherkin-utils" + } + }, + "node_modules/@cucumber/gherkin-utils/node_modules/@cucumber/gherkin": { + "version": "25.0.2", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-25.0.2.tgz", + "integrity": "sha512-EdsrR33Y5GjuOoe2Kq5Y9DYwgNRtUD32H4y2hCrT6+AWo7ibUQu7H+oiWTgfVhwbkHsZmksxHSxXz/AwqqyCRQ==", + "dev": true, + "dependencies": { + "@cucumber/messages": "^19.1.4" + } + }, + "node_modules/@cucumber/gherkin-utils/node_modules/@cucumber/messages": { + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-19.1.4.tgz", + "integrity": "sha512-Pksl0pnDz2l1+L5Ug85NlG6LWrrklN9qkMxN5Mv+1XZ3T6u580dnE6mVaxjJRdcOq4tR17Pc0RqIDZMyVY1FlA==", + "dev": true, + "dependencies": { + "@types/uuid": "8.3.4", + "class-transformer": "0.5.1", + "reflect-metadata": "0.1.13", + "uuid": "9.0.0" + } + }, + "node_modules/@cucumber/gherkin-utils/node_modules/@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", + "dev": true + }, + "node_modules/@cucumber/gherkin-utils/node_modules/commander": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", + "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/@cucumber/html-formatter": { + "version": "20.4.0", + "resolved": "https://registry.npmjs.org/@cucumber/html-formatter/-/html-formatter-20.4.0.tgz", + "integrity": "sha512-TnLSXC5eJd8AXHENo69f5z+SixEVtQIf7Q2dZuTpT/Y8AOkilGpGl1MQR1Vp59JIw+fF3EQSUKdf+DAThCxUNg==", + "dev": true, + "peerDependencies": { + "@cucumber/messages": ">=18" + } + }, + "node_modules/@cucumber/message-streams": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/message-streams/-/message-streams-4.0.1.tgz", + "integrity": "sha512-Kxap9uP5jD8tHUZVjTWgzxemi/0uOsbGjd4LBOSxcJoOCRbESFwemUzilJuzNTB8pcTQUh8D5oudUyxfkJOKmA==", + "dev": true, + "peerDependencies": { + "@cucumber/messages": ">=17.1.1" + } + }, + "node_modules/@cucumber/messages": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-22.0.0.tgz", + "integrity": "sha512-EuaUtYte9ilkxcKmfqGF9pJsHRUU0jwie5ukuZ/1NPTuHS1LxHPsGEODK17RPRbZHOFhqybNzG2rHAwThxEymg==", + "dev": true, + "dependencies": { + "@types/uuid": "9.0.1", + "class-transformer": "0.5.1", + "reflect-metadata": "0.1.13", + "uuid": "9.0.0" + } + }, + "node_modules/@cucumber/pretty-formatter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@cucumber/pretty-formatter/-/pretty-formatter-1.0.0.tgz", + "integrity": "sha512-wcnIMN94HyaHGsfq72dgCvr1d8q6VGH4Y6Gl5weJ2TNZw1qn2UY85Iki4c9VdaLUONYnyYH3+178YB+9RFe/Hw==", + "dev": true, + "dependencies": { + "ansi-styles": "^5.0.0", + "cli-table3": "^0.6.0", + "figures": "^3.2.0", + "ts-dedent": "^2.0.0" + }, + "peerDependencies": { + "@cucumber/cucumber": ">=7.0.0", + "@cucumber/messages": "*" + } + }, + "node_modules/@cucumber/tag-expressions": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/tag-expressions/-/tag-expressions-5.0.1.tgz", + "integrity": "sha512-N43uWud8ZXuVjza423T9ZCIJsaZhFekmakt7S9bvogTxqdVGbRobjR663s0+uW0Rz9e+Pa8I6jUuWtoBLQD2Mw==", + "dev": true + }, + "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/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/@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/@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/@playwright/test": { + "version": "1.40.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.40.1.tgz", + "integrity": "sha512-EaaawMTOeEItCRvfmkI9v6rBkF1svM8wjl/YPRrg2N2Wmp+4qJYkWtJsbew1szfKKDm6fPLy4YAanBhIlf9dWw==", + "dev": true, + "dependencies": { + "playwright": "1.40.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@teppeis/multimaps": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@teppeis/multimaps/-/multimaps-2.0.0.tgz", + "integrity": "sha512-TL1adzq1HdxUf9WYduLcQ/DNGYiz71U31QRgbnr0Ef1cPyOUOsBojxHVWpFeOSUucB6Lrs0LxFRA14ntgtkc9w==", + "dev": true, + "engines": { + "node": ">=10.17" + } + }, + "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/lodash": { + "version": "4.14.202", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.10.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.3.tgz", + "integrity": "sha512-XJavIpZqiXID5Yxnxv3RUDKTN5b81ddNC3ecsA0SoFXz/QU8OGBwZGMomiq0zw+uuqbL/krztv/DINAQ/EV4gg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true + }, + "node_modules/@types/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", + "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "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/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assertion-error-formatter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/assertion-error-formatter/-/assertion-error-formatter-3.0.0.tgz", + "integrity": "sha512-6YyAVLrEze0kQ7CmJfUgrLHb+Y7XghmL2Ie7ijVa2Y9ynP3LV+VDiwFk62Dn0qtqbmY0BT0ss6p1xxpiF2PYbQ==", + "dev": true, + "dependencies": { + "diff": "^4.0.1", + "pad-right": "^0.2.2", + "repeat-string": "^1.6.1" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "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/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 + }, + "node_modules/capital-case": { + "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", + "upper-case-first": "^2.0.2" + } + }, + "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/chalk/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/chalk/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/chalk/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/chalk/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/class-transformer": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", + "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==", + "dev": true + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "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/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/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "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": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "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", + "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/cucumber-html-reporter": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/cucumber-html-reporter/-/cucumber-html-reporter-7.1.1.tgz", + "integrity": "sha512-v1OUqM2aSoC27Dt/mUJfh0uxiyUWjfl/9wu7HqHpeT8ojZbTepPpmvYCmM84VGOU5LnyqGclab00mchetzqEEQ==", + "dev": true, + "dependencies": { + "@cucumber/cucumber": "9.1.2", + "chalk": "^2.4.2", + "find": "^0.3.0", + "fs-extra": "^8.1.0", + "js-base64": "^2.3.2", + "jsonfile": "^5.0.0", + "lodash": "^4.17.11", + "node-emoji": "^1.10.0", + "open": "^6.4.0", + "uuid": "^3.3.3" + } + }, + "node_modules/cucumber-html-reporter/node_modules/@cucumber/ci-environment": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@cucumber/ci-environment/-/ci-environment-9.1.0.tgz", + "integrity": "sha512-jdnF6APXP3GawMue8kdMxhu6TBhyRUO4KDRxTowf06NtclLjIw2Ybpo9IcIOMvE8kHukvJyM00uxWX+CfS7JgQ==", + "dev": true + }, + "node_modules/cucumber-html-reporter/node_modules/@cucumber/cucumber": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@cucumber/cucumber/-/cucumber-9.1.2.tgz", + "integrity": "sha512-0V96qH4Uozfu68vm6BY3DA8ZqbnQWgz8N3rnqw/geOG9sY05QeLUQ1PRGDZCznluqEdxt8iEu/QzoGwR7EjDcg==", + "dev": true, + "dependencies": { + "@cucumber/ci-environment": "9.1.0", + "@cucumber/cucumber-expressions": "16.1.1", + "@cucumber/gherkin": "26.0.3", + "@cucumber/gherkin-streams": "5.0.1", + "@cucumber/gherkin-utils": "8.0.2", + "@cucumber/html-formatter": "20.2.1", + "@cucumber/message-streams": "4.0.1", + "@cucumber/messages": "21.0.1", + "@cucumber/tag-expressions": "5.0.1", + "assertion-error-formatter": "^3.0.0", + "capital-case": "^1.0.4", + "chalk": "^4.1.2", + "cli-table3": "0.6.3", + "commander": "^10.0.0", + "debug": "^4.3.4", + "error-stack-parser": "^2.1.4", + "figures": "^3.2.0", + "glob": "^7.1.6", + "has-ansi": "^4.0.1", + "indent-string": "^4.0.0", + "is-installed-globally": "^0.4.0", + "is-stream": "^2.0.0", + "knuth-shuffle-seeded": "^1.0.6", + "lodash.merge": "^4.6.2", + "lodash.mergewith": "^4.6.2", + "luxon": "3.2.1", + "mkdirp": "^2.1.5", + "mz": "^2.7.0", + "progress": "^2.0.3", + "resolve-pkg": "^2.0.0", + "semver": "7.3.8", + "string-argv": "^0.3.1", + "strip-ansi": "6.0.1", + "supports-color": "^8.1.1", + "tmp": "^0.2.1", + "util-arity": "^1.1.0", + "verror": "^1.10.0", + "xmlbuilder": "^15.1.1", + "yaml": "^2.2.2", + "yup": "^0.32.11" + }, + "bin": { + "cucumber-js": "bin/cucumber.js" + }, + "engines": { + "node": "14 || 16 || >=18" + } + }, + "node_modules/cucumber-html-reporter/node_modules/@cucumber/cucumber-expressions": { + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/@cucumber/cucumber-expressions/-/cucumber-expressions-16.1.1.tgz", + "integrity": "sha512-Ugsb9qxfgrgfUKsGvbx0awVk+69NIFjWfxNT+dnm62YrF2gdTHYxAOzOLuPgvE0yqYTh+3otrFLDDfkHGThM1g==", + "dev": true, + "dependencies": { + "regexp-match-indices": "1.0.2" + } + }, + "node_modules/cucumber-html-reporter/node_modules/@cucumber/cucumber/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/cucumber-html-reporter/node_modules/@cucumber/cucumber/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/cucumber-html-reporter/node_modules/@cucumber/cucumber/node_modules/chalk/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/cucumber-html-reporter/node_modules/@cucumber/cucumber/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/cucumber-html-reporter/node_modules/@cucumber/gherkin": { + "version": "26.0.3", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-26.0.3.tgz", + "integrity": "sha512-xwJHi//bLFEU1drIyw2yswwUHnnVWO4XcyVBbCTDs6DkSh262GkogFI/IWwChZqJfOXnPglzLGxR1DibcZsILA==", + "dev": true, + "dependencies": { + "@cucumber/messages": "19.1.4 - 21" + } + }, + "node_modules/cucumber-html-reporter/node_modules/@cucumber/html-formatter": { + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/@cucumber/html-formatter/-/html-formatter-20.2.1.tgz", + "integrity": "sha512-bwwyr1WjlOJ5dEFOLGbtYWbUprloB2eymqXBmmTC10s0xapZXkFn4VfHgMshaH91XiCIY/MoabWNAau3AeMHkQ==", + "dev": true, + "peerDependencies": { + "@cucumber/messages": ">=18" + } + }, + "node_modules/cucumber-html-reporter/node_modules/@cucumber/messages": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-21.0.1.tgz", + "integrity": "sha512-pGR7iURM4SF9Qp1IIpNiVQ77J9kfxMkPOEbyy+zRmGABnWWCsqMpJdfHeh9Mb3VskemVw85++e15JT0PYdcR3g==", + "dev": true, + "dependencies": { + "@types/uuid": "8.3.4", + "class-transformer": "0.5.1", + "reflect-metadata": "0.1.13", + "uuid": "9.0.0" + } + }, + "node_modules/cucumber-html-reporter/node_modules/@cucumber/messages/node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/cucumber-html-reporter/node_modules/@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", + "dev": true + }, + "node_modules/cucumber-html-reporter/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/cucumber-html-reporter/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/cucumber-html-reporter/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/cucumber-html-reporter/node_modules/chalk/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/cucumber-html-reporter/node_modules/chalk/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/cucumber-html-reporter/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/cucumber-html-reporter/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cucumber-html-reporter/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/cucumber-html-reporter/node_modules/minimatch": { + "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" + }, + "engines": { + "node": "*" + } + }, + "node_modules/cucumber-html-reporter/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cucumber-html-reporter/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/cucumber-html-reporter/node_modules/yup": { + "version": "0.32.11", + "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz", + "integrity": "sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.15.4", + "@types/lodash": "^4.14.175", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "nanoclone": "^0.2.1", + "property-expr": "^2.0.4", + "toposort": "^2.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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/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/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/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/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dev": true, + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "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/extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/figures": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/find/-/find-0.3.0.tgz", + "integrity": "sha512-iSd+O4OEYV/I36Zl8MdYJO0xD82wH528SaCieTVHhclgiYNe9y+yPKSwK+A7/WsmHL1EZ+pYUJBXWTL5qofksw==", + "dev": true, + "dependencies": { + "traverse-chain": "~0.1.0" + } + }, + "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/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/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-extra/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "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, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dev": true, + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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 + }, + "node_modules/has-ansi": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-4.0.1.tgz", + "integrity": "sha512-Qr4RtTm30xvEdqUXbSBVWDu+PrTokJOwe/FU+VdfJPk+MXAPoeOzKpRyrDTnZIJwAkQ4oBLTU53nu0HrkF/Z2A==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "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/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/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 + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "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/js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "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/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/jsonfile": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-5.0.0.tgz", + "integrity": "sha512-NQRZ5CRo74MhMMC3/3r5g2k4fjodJ/wh8MxjFbCViWKFjxrnudWSY5vomh+23ZaXzAS7J3fBZIR2dV6WbmfM0w==", + "dev": true, + "dependencies": { + "universalify": "^0.1.2" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/knuth-shuffle-seeded": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/knuth-shuffle-seeded/-/knuth-shuffle-seeded-1.0.6.tgz", + "integrity": "sha512-9pFH0SplrfyKyojCLxZfMcvkhf5hH0d+UwR9nTVJ/DDQJGuzcXjTwB7TP7sDfehSudlGGaOLblmEWqv04ERVWg==", + "dev": true, + "dependencies": { + "seed-random": "~2.2.0" + } + }, + "node_modules/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 + }, + "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-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/luxon": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.2.1.tgz", + "integrity": "sha512-QrwPArQCNLAKGO/C+ZIilgIuDnEnKx5QYODdDtbFaxzsbZcc/a7WFq7MhsVYgRlwawLtvOUESTlfJ+hc/USqPg==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "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/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", + "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", + "dev": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/nanoclone": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz", + "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==", + "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==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, + "dependencies": { + "lodash": "^4.17.21" + } + }, + "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-package-data/node_modules/semver": { + "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" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/pad-right": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/pad-right/-/pad-right-0.2.2.tgz", + "integrity": "sha512-4cy8M95ioIGolCoMmm2cMntGR1lPLEbOMzOKu8bzjuJP6JpzEMQcDHmh7hHLYGgob+nKe1YHFMaG4V59HQa89g==", + "dev": true, + "dependencies": { + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "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/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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "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/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/playwright": { + "version": "1.40.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.40.1.tgz", + "integrity": "sha512-2eHI7IioIpQ0bS1Ovg/HszsN/XKNwEG1kbzSDDmADpclKc7CyqkHw7Mg2JCz/bbCxg25QUPcjksoMW7JcIFQmw==", + "dev": true, + "dependencies": { + "playwright-core": "1.40.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.40.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.40.1.tgz", + "integrity": "sha512-+hkOycxPiV534c4HhpfX6yrlawqVUzITRKwHAmYfmsVreltEl6fAZJ3DPfLMOODw0H3s1Itd6MDCWmP1fl/QvQ==", + "dev": true, + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/property-expr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz", + "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==", + "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/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/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", + "dev": true + }, + "node_modules/regexp-match-indices": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regexp-match-indices/-/regexp-match-indices-1.0.2.tgz", + "integrity": "sha512-DwZuAkt8NF5mKwGGER1EGh2PRqyvhRhhLviH+R8y8dIuaQROlUfXjt4s9ZTXstIsSkptf06BSvwcEmmfheJJWQ==", + "dev": true, + "dependencies": { + "regexp-tree": "^0.1.11" + } + }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "dev": true, + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-2.0.0.tgz", + "integrity": "sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/rimraf/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/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "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" + }, + "engines": { + "node": "*" + } + }, + "node_modules/seed-random": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/seed-random/-/seed-random-2.2.0.tgz", + "integrity": "sha512-34EQV6AAHQGhoc0tn/96a9Fsi6v2xdqe/dMUwljGRaFOzR3EgRmECvD0O8vi8X+/uQ50LGHfkNu/Eue5TPKZkQ==", + "dev": true + }, + "node_modules/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/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/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/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "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.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "dev": true + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "dev": true + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/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/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", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "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-ansi-cjs/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "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/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, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tiny-case": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz", + "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==", + "dev": true + }, + "node_modules/traverse-chain": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/traverse-chain/-/traverse-chain-0.1.0.tgz", + "integrity": "sha512-up6Yvai4PYKhpNp5PkYtx50m3KbwQrqDwbuZP/ItyL64YEWHAvH6Md83LFLV/GRSk/BoUVwwgUzX6SOQSbsfAg==", + "dev": true + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "dev": true, + "engines": { + "node": ">=6.10" + } + }, + "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/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "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/typescript": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", + "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "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/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, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/util-arity": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/util-arity/-/util-arity-1.1.0.tgz", + "integrity": "sha512-kkyIsXKwemfSy8ZEoaIz06ApApnWsk5hQO0vLjZS6UkBiGiW++Jsyb8vSBoc0WKlffGoGs5yYy/j5pp8zckrFA==", + "dev": true + }, + "node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "dev": true, + "bin": { + "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/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.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "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/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/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi/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/wrap-ansi/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/wrap-ansi/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/wrap-ansi/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/wrap-ansi/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/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "engines": { + "node": ">=8.0" + } + }, + "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/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "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" + } + }, + "node_modules/yup": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/yup/-/yup-1.2.0.tgz", + "integrity": "sha512-PPqYKSAXjpRCgLgLKVGPA33v5c/WgEx3wi6NFjIiegz90zSwyMpvTFp/uGcVnnbx6to28pgnzp/q8ih3QRjLMQ==", + "dev": true, + "dependencies": { + "property-expr": "^2.0.5", + "tiny-case": "^1.0.3", + "toposort": "^2.0.2", + "type-fest": "^2.19.0" + } + }, + "node_modules/yup/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/Playwright-Cucumber-Exercise-main/package.json b/Playwright-Cucumber-Exercise-main/package.json new file mode 100644 index 00000000..ed38f6f5 --- /dev/null +++ b/Playwright-Cucumber-Exercise-main/package.json @@ -0,0 +1,15 @@ +{ + "scripts": { + "test": "cucumber-js --format json:report.json --exit", + "report": "node generate-report.js" + }, + "devDependencies": { + "@cucumber/cucumber": "^10.0.1", + "@cucumber/pretty-formatter": "^1.0.0", + "@playwright/test": "^1.40.1", + "@types/node": "^20.10.3", + "cucumber-html-reporter": "^7.1.1", + "ts-node": "^10.9.1", + "typescript": "^5.3.2" + } +} diff --git a/Playwright-Cucumber-Exercise-main/pages/login.page.ts b/Playwright-Cucumber-Exercise-main/pages/login.page.ts new file mode 100644 index 00000000..5a01614b --- /dev/null +++ b/Playwright-Cucumber-Exercise-main/pages/login.page.ts @@ -0,0 +1,26 @@ +import { Page } from "@playwright/test" + +export class Login { + private readonly page: Page + private readonly password: string = 'secret_sauce' + private readonly passwordField: string = 'input[id="password"]' + private readonly userNameField: string = 'input[id="user-name"]' + private readonly loginButton: string = 'input[id="login-button"]' + + constructor(page: Page) { + this.page = page; + } + + public async validateTitle(expectedTitle: string) { + const pageTitle = await this.page.title(); + if (pageTitle !== expectedTitle) { + throw new Error(`Expected title to be ${expectedTitle} but found ${pageTitle}`); + } + } + + public async loginAsUser(userName: string) { + await this.page.locator(this.userNameField).fill(userName) + await this.page.locator(this.passwordField).fill(this.password) + await this.page.locator(this.loginButton).click() + } +} \ No newline at end of file diff --git a/Playwright-Cucumber-Exercise-main/pages/menu.page.ts b/Playwright-Cucumber-Exercise-main/pages/menu.page.ts new file mode 100644 index 00000000..c39dafaa --- /dev/null +++ b/Playwright-Cucumber-Exercise-main/pages/menu.page.ts @@ -0,0 +1,17 @@ +import { Page } from '@playwright/test'; + +export class MenuPage { + private page: Page; + + constructor(page: Page) { + this.page = page; + } + + async openMenu() { + await this.page.locator('#react-burger-menu-btn').click(); + } + + async clickLogout() { + await this.page.locator('#logout_sidebar_link').click(); + } +} \ No newline at end of file diff --git a/Playwright-Cucumber-Exercise-main/pages/product.page.ts b/Playwright-Cucumber-Exercise-main/pages/product.page.ts new file mode 100644 index 00000000..7e2bc5c2 --- /dev/null +++ b/Playwright-Cucumber-Exercise-main/pages/product.page.ts @@ -0,0 +1,47 @@ +import { Page } from '@playwright/test'; +import { expect } from '@playwright/test'; + +export class ProductPage { + private page: Page; + + constructor(page: Page) { + this.page = page; + } + + async selectSortOption(sortOption: string) { + await this.page.selectOption('.product_sort_container', { + label: sortOption, + }); + } + + async getProductPrices(): Promise { + const priceElements = this.page.locator('.inventory_item_price'); + const count = await priceElements.count(); + + const prices: number[] = []; + + for (let i = 0; i < count; i++) { + const text = await priceElements.nth(i).innerText(); + prices.push(parseFloat(text.replace('$', ''))); + } + + return prices; + } + + async validateProductSorting(sortOption: string) { + const actualPrices = await this.getProductPrices(); + + // Create a sorted copy + const sortedPrices = [...actualPrices]; + + if (sortOption === 'Price (low to high)') { + sortedPrices.sort((a, b) => a - b); + } else if (sortOption === 'Price (high to low)') { + sortedPrices.sort((a, b) => b - a); + } + + // Validate all 6 items are sorted correctly + expect(actualPrices.length).toBe(6); + expect(actualPrices).toEqual(sortedPrices); + } +} \ No newline at end of file diff --git a/Playwright-Cucumber-Exercise-main/pages/purchasePage.ts b/Playwright-Cucumber-Exercise-main/pages/purchasePage.ts new file mode 100644 index 00000000..85c880eb --- /dev/null +++ b/Playwright-Cucumber-Exercise-main/pages/purchasePage.ts @@ -0,0 +1,52 @@ +import { expect, Page, Locator } from '@playwright/test'; + +export class PurchasePage { + private page: Page; + + private completeHeader: Locator; + private completeMessage: Locator; + + constructor(page: Page) { + this.page = page; + this.completeHeader = page.locator('.complete-header'); + this.completeMessage = page.locator('.complete-text'); + } + + async clickCart() { + await this.page.locator('.shopping_cart_link').click(); + } + + async clickCheckout() { + await this.page.locator('#checkout').click(); + } + + async fillDetails(firstName: string, lastName: string, zip: string) { + await this.page.locator('#first-name').fill(firstName); + await this.page.locator('#last-name').fill(lastName); + await this.page.locator('#postal-code').fill(zip); + } + + async clickContinue() { + await this.page.locator('#continue').click(); + } + + async clickFinish() { + await this.page.locator('#finish').click(); + } + + async validateConfirmation(expectedText: string) { + await expect(this.completeHeader).toHaveText(expectedText); + } + + getConfirmationHeader(): Locator { + return this.completeHeader; + } + + getConfirmationMessage(): Locator { + return this.completeMessage; + } + + getCurrentUrl(): string { + return this.page.url(); + } +} \ No newline at end of file diff --git a/Playwright-Cucumber-Exercise-main/playwright.config.ts b/Playwright-Cucumber-Exercise-main/playwright.config.ts new file mode 100644 index 00000000..7adb387b --- /dev/null +++ b/Playwright-Cucumber-Exercise-main/playwright.config.ts @@ -0,0 +1,9 @@ +import { PlaywrightTestConfig } from '@playwright/test'; + +const config: PlaywrightTestConfig = { + use: { + headless: false, + }, +}; + +export default config; \ No newline at end of file diff --git a/Playwright-Cucumber-Exercise-main/playwrightUtilities.ts b/Playwright-Cucumber-Exercise-main/playwrightUtilities.ts new file mode 100644 index 00000000..93244a29 --- /dev/null +++ b/Playwright-Cucumber-Exercise-main/playwrightUtilities.ts @@ -0,0 +1,33 @@ +import { Browser, chromium, Page } from 'playwright'; + +let browser: Browser | null = null; +let page: Page | null = null; +const DEFAULT_TIMEOUT = 30000; + +export const initializeBrowser = async () => { + if (!browser) { + browser = await chromium.launch({ headless: false }); + } +}; + +export const initializePage = async () => { + if (browser && !page) { + page = await browser.newPage(); + page.setDefaultTimeout(DEFAULT_TIMEOUT); + } +}; + +export const getPage = (): Page => { + if (!page) { + throw new Error('Page has not been initialized. Please call initializePage first.'); + } + return page; +}; + +export const closeBrowser = async () => { + if (browser) { + await browser.close(); + browser = null; + page = null; + } +}; \ No newline at end of file diff --git a/Playwright-Cucumber-Exercise-main/steps/common.steps.ts b/Playwright-Cucumber-Exercise-main/steps/common.steps.ts new file mode 100644 index 00000000..c4bee79b --- /dev/null +++ b/Playwright-Cucumber-Exercise-main/steps/common.steps.ts @@ -0,0 +1,6 @@ +import { Given } from "@cucumber/cucumber"; +import { getPage } from "../playwrightUtilities"; + +Given('I open the {string} page', async (url) => { + await getPage().goto(url); + }); \ No newline at end of file diff --git a/Playwright-Cucumber-Exercise-main/steps/login.steps.ts b/Playwright-Cucumber-Exercise-main/steps/login.steps.ts new file mode 100644 index 00000000..c2aa0d80 --- /dev/null +++ b/Playwright-Cucumber-Exercise-main/steps/login.steps.ts @@ -0,0 +1,11 @@ +import { Then } from '@cucumber/cucumber'; +import { getPage } from '../playwrightUtilities'; +import { Login } from '../pages/login.page'; + +Then('I should see the title {string}', async (expectedTitle) => { + await new Login(getPage()).validateTitle(expectedTitle); +}); + +Then('I will login as {string}', async (userName) => { + await new Login(getPage()).loginAsUser(userName); +}); \ No newline at end of file diff --git a/Playwright-Cucumber-Exercise-main/steps/logout.steps.ts b/Playwright-Cucumber-Exercise-main/steps/logout.steps.ts new file mode 100644 index 00000000..add75a63 --- /dev/null +++ b/Playwright-Cucumber-Exercise-main/steps/logout.steps.ts @@ -0,0 +1,19 @@ +import { Then } from '@cucumber/cucumber'; +import { pageFixture } from '../hooks/pageFixture'; +import { expect } from '@playwright/test'; +import { MenuPage } from '../pages/menu.page'; + +let menuPage: MenuPage; + +Then('I open the menu', async () => { + menuPage = new MenuPage(pageFixture.page); + await menuPage.openMenu(); +}); + +Then('I click logout', async () => { + await menuPage.clickLogout(); +}); + +Then('I should be redirected to login page', async () => { + await expect(pageFixture.page).toHaveURL('https://www.saucedemo.com/'); +}); \ No newline at end of file diff --git a/Playwright-Cucumber-Exercise-main/steps/product.steps.ts b/Playwright-Cucumber-Exercise-main/steps/product.steps.ts new file mode 100644 index 00000000..d9d3ab8b --- /dev/null +++ b/Playwright-Cucumber-Exercise-main/steps/product.steps.ts @@ -0,0 +1,17 @@ +import { Then } from '@cucumber/cucumber'; +import { ProductPage } from '../pages/product.page'; +import { pageFixture } from '../hooks/pageFixture'; + +let productPage: ProductPage; + +Then('I sort the products by {string}', async (sortOption: string) => { + productPage = new ProductPage(pageFixture.page); + await productPage.selectSortOption(sortOption); +}); + +Then( + 'I validate products are sorted by price {string}', + async (sortOption: string) => { + await productPage.validateProductSorting(sortOption); + } +); \ No newline at end of file diff --git a/Playwright-Cucumber-Exercise-main/steps/purchaseSteps.ts b/Playwright-Cucumber-Exercise-main/steps/purchaseSteps.ts new file mode 100644 index 00000000..3caf34d6 --- /dev/null +++ b/Playwright-Cucumber-Exercise-main/steps/purchaseSteps.ts @@ -0,0 +1,25 @@ +import { Then } from '@cucumber/cucumber'; +import { PurchasePage } from '../pages/purchasePage'; +import { pageFixture } from '../hooks/pageFixture'; +import { expect } from '@playwright/test'; +import { Product } from '../pages/product.page'; + +let purchasePage: PurchasePage; + +Then('I should see the confirmation header', async () => { + purchasePage = new PurchasePage(pageFixture.page); + const header = await purchasePage.getConfirmationHeader(); + await expect(header).toHaveText('Thank you for your order!'); +}); + +Then('I should see the confirmation message', async () => { + const message = await purchasePage.getConfirmationMessage(); + await expect(message).toContainText( + 'Your order has been dispatched' + ); +}); + +Then('I should be on the checkout complete page', async () => { + const url = await purchasePage.getCurrentUrl(); + await expect(url).toContain('checkout-complete'); +}); \ No newline at end of file diff --git a/Playwright-Cucumber-Exercise-main/tsconfig.json b/Playwright-Cucumber-Exercise-main/tsconfig.json new file mode 100644 index 00000000..9776ba97 --- /dev/null +++ b/Playwright-Cucumber-Exercise-main/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "CommonJS", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true + }, + "include": [ + "**/*.ts" + ], + "exclude": [ + "node_modules" + ] + } \ No newline at end of file diff --git a/node_modules/.bin/cucumber-js b/node_modules/.bin/cucumber-js new file mode 100644 index 00000000..6c626054 --- /dev/null +++ b/node_modules/.bin/cucumber-js @@ -0,0 +1,16 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*|*MINGW*|*MSYS*) + if command -v cygpath > /dev/null 2>&1; then + basedir=`cygpath -w "$basedir"` + fi + ;; +esac + +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../@cucumber/cucumber/bin/cucumber.js" "$@" +else + exec node "$basedir/../@cucumber/cucumber/bin/cucumber.js" "$@" +fi diff --git a/node_modules/.bin/cucumber-js.cmd b/node_modules/.bin/cucumber-js.cmd new file mode 100644 index 00000000..15e2ea34 --- /dev/null +++ b/node_modules/.bin/cucumber-js.cmd @@ -0,0 +1,17 @@ +@ECHO off +GOTO start +:find_dp0 +SET dp0=%~dp0 +EXIT /b +:start +SETLOCAL +CALL :find_dp0 + +IF EXIST "%dp0%\node.exe" ( + SET "_prog=%dp0%\node.exe" +) ELSE ( + SET "_prog=node" + SET PATHEXT=%PATHEXT:;.JS;=;% +) + +endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\@cucumber\cucumber\bin\cucumber.js" %* diff --git a/node_modules/.bin/cucumber-js.ps1 b/node_modules/.bin/cucumber-js.ps1 new file mode 100644 index 00000000..753f14f3 --- /dev/null +++ b/node_modules/.bin/cucumber-js.ps1 @@ -0,0 +1,28 @@ +#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + # Fix case when both the Windows and Linux builds of Node + # are installed in the same directory + $exe=".exe" +} +$ret=0 +if (Test-Path "$basedir/node$exe") { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "$basedir/node$exe" "$basedir/../@cucumber/cucumber/bin/cucumber.js" $args + } else { + & "$basedir/node$exe" "$basedir/../@cucumber/cucumber/bin/cucumber.js" $args + } + $ret=$LASTEXITCODE +} else { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "node$exe" "$basedir/../@cucumber/cucumber/bin/cucumber.js" $args + } else { + & "node$exe" "$basedir/../@cucumber/cucumber/bin/cucumber.js" $args + } + $ret=$LASTEXITCODE +} +exit $ret diff --git a/node_modules/.bin/gherkin-javascript b/node_modules/.bin/gherkin-javascript new file mode 100644 index 00000000..861df298 --- /dev/null +++ b/node_modules/.bin/gherkin-javascript @@ -0,0 +1,16 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*|*MINGW*|*MSYS*) + if command -v cygpath > /dev/null 2>&1; then + basedir=`cygpath -w "$basedir"` + fi + ;; +esac + +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../@cucumber/gherkin-streams/bin/gherkin" "$@" +else + exec node "$basedir/../@cucumber/gherkin-streams/bin/gherkin" "$@" +fi diff --git a/node_modules/.bin/gherkin-javascript.cmd b/node_modules/.bin/gherkin-javascript.cmd new file mode 100644 index 00000000..92a8f2f4 --- /dev/null +++ b/node_modules/.bin/gherkin-javascript.cmd @@ -0,0 +1,17 @@ +@ECHO off +GOTO start +:find_dp0 +SET dp0=%~dp0 +EXIT /b +:start +SETLOCAL +CALL :find_dp0 + +IF EXIST "%dp0%\node.exe" ( + SET "_prog=%dp0%\node.exe" +) ELSE ( + SET "_prog=node" + SET PATHEXT=%PATHEXT:;.JS;=;% +) + +endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\@cucumber\gherkin-streams\bin\gherkin" %* diff --git a/node_modules/.bin/gherkin-javascript.ps1 b/node_modules/.bin/gherkin-javascript.ps1 new file mode 100644 index 00000000..6849c23a --- /dev/null +++ b/node_modules/.bin/gherkin-javascript.ps1 @@ -0,0 +1,28 @@ +#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + # Fix case when both the Windows and Linux builds of Node + # are installed in the same directory + $exe=".exe" +} +$ret=0 +if (Test-Path "$basedir/node$exe") { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "$basedir/node$exe" "$basedir/../@cucumber/gherkin-streams/bin/gherkin" $args + } else { + & "$basedir/node$exe" "$basedir/../@cucumber/gherkin-streams/bin/gherkin" $args + } + $ret=$LASTEXITCODE +} else { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "node$exe" "$basedir/../@cucumber/gherkin-streams/bin/gherkin" $args + } else { + & "node$exe" "$basedir/../@cucumber/gherkin-streams/bin/gherkin" $args + } + $ret=$LASTEXITCODE +} +exit $ret diff --git a/node_modules/.bin/gherkin-utils b/node_modules/.bin/gherkin-utils new file mode 100644 index 00000000..6e87fdc2 --- /dev/null +++ b/node_modules/.bin/gherkin-utils @@ -0,0 +1,16 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*|*MINGW*|*MSYS*) + if command -v cygpath > /dev/null 2>&1; then + basedir=`cygpath -w "$basedir"` + fi + ;; +esac + +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../@cucumber/gherkin-utils/bin/gherkin-utils" "$@" +else + exec node "$basedir/../@cucumber/gherkin-utils/bin/gherkin-utils" "$@" +fi diff --git a/node_modules/.bin/gherkin-utils.cmd b/node_modules/.bin/gherkin-utils.cmd new file mode 100644 index 00000000..b855b05f --- /dev/null +++ b/node_modules/.bin/gherkin-utils.cmd @@ -0,0 +1,17 @@ +@ECHO off +GOTO start +:find_dp0 +SET dp0=%~dp0 +EXIT /b +:start +SETLOCAL +CALL :find_dp0 + +IF EXIST "%dp0%\node.exe" ( + SET "_prog=%dp0%\node.exe" +) ELSE ( + SET "_prog=node" + SET PATHEXT=%PATHEXT:;.JS;=;% +) + +endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\@cucumber\gherkin-utils\bin\gherkin-utils" %* diff --git a/node_modules/.bin/gherkin-utils.ps1 b/node_modules/.bin/gherkin-utils.ps1 new file mode 100644 index 00000000..5b7d071b --- /dev/null +++ b/node_modules/.bin/gherkin-utils.ps1 @@ -0,0 +1,28 @@ +#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + # Fix case when both the Windows and Linux builds of Node + # are installed in the same directory + $exe=".exe" +} +$ret=0 +if (Test-Path "$basedir/node$exe") { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "$basedir/node$exe" "$basedir/../@cucumber/gherkin-utils/bin/gherkin-utils" $args + } else { + & "$basedir/node$exe" "$basedir/../@cucumber/gherkin-utils/bin/gherkin-utils" $args + } + $ret=$LASTEXITCODE +} else { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "node$exe" "$basedir/../@cucumber/gherkin-utils/bin/gherkin-utils" $args + } else { + & "node$exe" "$basedir/../@cucumber/gherkin-utils/bin/gherkin-utils" $args + } + $ret=$LASTEXITCODE +} +exit $ret diff --git a/node_modules/.bin/mime b/node_modules/.bin/mime new file mode 100644 index 00000000..7751de3c --- /dev/null +++ b/node_modules/.bin/mime @@ -0,0 +1,16 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*|*MINGW*|*MSYS*) + if command -v cygpath > /dev/null 2>&1; then + basedir=`cygpath -w "$basedir"` + fi + ;; +esac + +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../mime/cli.js" "$@" +else + exec node "$basedir/../mime/cli.js" "$@" +fi diff --git a/node_modules/.bin/mime.cmd b/node_modules/.bin/mime.cmd new file mode 100644 index 00000000..54491f12 --- /dev/null +++ b/node_modules/.bin/mime.cmd @@ -0,0 +1,17 @@ +@ECHO off +GOTO start +:find_dp0 +SET dp0=%~dp0 +EXIT /b +:start +SETLOCAL +CALL :find_dp0 + +IF EXIST "%dp0%\node.exe" ( + SET "_prog=%dp0%\node.exe" +) ELSE ( + SET "_prog=node" + SET PATHEXT=%PATHEXT:;.JS;=;% +) + +endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\mime\cli.js" %* diff --git a/node_modules/.bin/mime.ps1 b/node_modules/.bin/mime.ps1 new file mode 100644 index 00000000..2222f40b --- /dev/null +++ b/node_modules/.bin/mime.ps1 @@ -0,0 +1,28 @@ +#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + # Fix case when both the Windows and Linux builds of Node + # are installed in the same directory + $exe=".exe" +} +$ret=0 +if (Test-Path "$basedir/node$exe") { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "$basedir/node$exe" "$basedir/../mime/cli.js" $args + } else { + & "$basedir/node$exe" "$basedir/../mime/cli.js" $args + } + $ret=$LASTEXITCODE +} else { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "node$exe" "$basedir/../mime/cli.js" $args + } else { + & "node$exe" "$basedir/../mime/cli.js" $args + } + $ret=$LASTEXITCODE +} +exit $ret diff --git a/node_modules/.bin/mkdirp b/node_modules/.bin/mkdirp new file mode 100644 index 00000000..df9a9a4e --- /dev/null +++ b/node_modules/.bin/mkdirp @@ -0,0 +1,16 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*|*MINGW*|*MSYS*) + if command -v cygpath > /dev/null 2>&1; then + basedir=`cygpath -w "$basedir"` + fi + ;; +esac + +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../mkdirp/dist/cjs/src/bin.js" "$@" +else + exec node "$basedir/../mkdirp/dist/cjs/src/bin.js" "$@" +fi diff --git a/node_modules/.bin/mkdirp.cmd b/node_modules/.bin/mkdirp.cmd new file mode 100644 index 00000000..90e19d51 --- /dev/null +++ b/node_modules/.bin/mkdirp.cmd @@ -0,0 +1,17 @@ +@ECHO off +GOTO start +:find_dp0 +SET dp0=%~dp0 +EXIT /b +:start +SETLOCAL +CALL :find_dp0 + +IF EXIST "%dp0%\node.exe" ( + SET "_prog=%dp0%\node.exe" +) ELSE ( + SET "_prog=node" + SET PATHEXT=%PATHEXT:;.JS;=;% +) + +endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\mkdirp\dist\cjs\src\bin.js" %* diff --git a/node_modules/.bin/mkdirp.ps1 b/node_modules/.bin/mkdirp.ps1 new file mode 100644 index 00000000..6d3467bc --- /dev/null +++ b/node_modules/.bin/mkdirp.ps1 @@ -0,0 +1,28 @@ +#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + # Fix case when both the Windows and Linux builds of Node + # are installed in the same directory + $exe=".exe" +} +$ret=0 +if (Test-Path "$basedir/node$exe") { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "$basedir/node$exe" "$basedir/../mkdirp/dist/cjs/src/bin.js" $args + } else { + & "$basedir/node$exe" "$basedir/../mkdirp/dist/cjs/src/bin.js" $args + } + $ret=$LASTEXITCODE +} else { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "node$exe" "$basedir/../mkdirp/dist/cjs/src/bin.js" $args + } else { + & "node$exe" "$basedir/../mkdirp/dist/cjs/src/bin.js" $args + } + $ret=$LASTEXITCODE +} +exit $ret diff --git a/node_modules/.bin/playwright b/node_modules/.bin/playwright new file mode 100644 index 00000000..8e4988eb --- /dev/null +++ b/node_modules/.bin/playwright @@ -0,0 +1,16 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*|*MINGW*|*MSYS*) + if command -v cygpath > /dev/null 2>&1; then + basedir=`cygpath -w "$basedir"` + fi + ;; +esac + +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../@playwright/test/cli.js" "$@" +else + exec node "$basedir/../@playwright/test/cli.js" "$@" +fi diff --git a/node_modules/.bin/playwright-core b/node_modules/.bin/playwright-core new file mode 100644 index 00000000..bc2c5c8a --- /dev/null +++ b/node_modules/.bin/playwright-core @@ -0,0 +1,16 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*|*MINGW*|*MSYS*) + if command -v cygpath > /dev/null 2>&1; then + basedir=`cygpath -w "$basedir"` + fi + ;; +esac + +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../playwright-core/cli.js" "$@" +else + exec node "$basedir/../playwright-core/cli.js" "$@" +fi diff --git a/node_modules/.bin/playwright-core.cmd b/node_modules/.bin/playwright-core.cmd new file mode 100644 index 00000000..11282048 --- /dev/null +++ b/node_modules/.bin/playwright-core.cmd @@ -0,0 +1,17 @@ +@ECHO off +GOTO start +:find_dp0 +SET dp0=%~dp0 +EXIT /b +:start +SETLOCAL +CALL :find_dp0 + +IF EXIST "%dp0%\node.exe" ( + SET "_prog=%dp0%\node.exe" +) ELSE ( + SET "_prog=node" + SET PATHEXT=%PATHEXT:;.JS;=;% +) + +endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\playwright-core\cli.js" %* diff --git a/node_modules/.bin/playwright-core.ps1 b/node_modules/.bin/playwright-core.ps1 new file mode 100644 index 00000000..e914b999 --- /dev/null +++ b/node_modules/.bin/playwright-core.ps1 @@ -0,0 +1,28 @@ +#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + # Fix case when both the Windows and Linux builds of Node + # are installed in the same directory + $exe=".exe" +} +$ret=0 +if (Test-Path "$basedir/node$exe") { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "$basedir/node$exe" "$basedir/../playwright-core/cli.js" $args + } else { + & "$basedir/node$exe" "$basedir/../playwright-core/cli.js" $args + } + $ret=$LASTEXITCODE +} else { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "node$exe" "$basedir/../playwright-core/cli.js" $args + } else { + & "node$exe" "$basedir/../playwright-core/cli.js" $args + } + $ret=$LASTEXITCODE +} +exit $ret diff --git a/node_modules/.bin/playwright.cmd b/node_modules/.bin/playwright.cmd new file mode 100644 index 00000000..ab9fe6af --- /dev/null +++ b/node_modules/.bin/playwright.cmd @@ -0,0 +1,17 @@ +@ECHO off +GOTO start +:find_dp0 +SET dp0=%~dp0 +EXIT /b +:start +SETLOCAL +CALL :find_dp0 + +IF EXIST "%dp0%\node.exe" ( + SET "_prog=%dp0%\node.exe" +) ELSE ( + SET "_prog=node" + SET PATHEXT=%PATHEXT:;.JS;=;% +) + +endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\@playwright\test\cli.js" %* diff --git a/node_modules/.bin/playwright.ps1 b/node_modules/.bin/playwright.ps1 new file mode 100644 index 00000000..ccb3b8d9 --- /dev/null +++ b/node_modules/.bin/playwright.ps1 @@ -0,0 +1,28 @@ +#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + # Fix case when both the Windows and Linux builds of Node + # are installed in the same directory + $exe=".exe" +} +$ret=0 +if (Test-Path "$basedir/node$exe") { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "$basedir/node$exe" "$basedir/../@playwright/test/cli.js" $args + } else { + & "$basedir/node$exe" "$basedir/../@playwright/test/cli.js" $args + } + $ret=$LASTEXITCODE +} else { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "node$exe" "$basedir/../@playwright/test/cli.js" $args + } else { + & "node$exe" "$basedir/../@playwright/test/cli.js" $args + } + $ret=$LASTEXITCODE +} +exit $ret diff --git a/node_modules/.bin/regexp-tree b/node_modules/.bin/regexp-tree new file mode 100644 index 00000000..e8956074 --- /dev/null +++ b/node_modules/.bin/regexp-tree @@ -0,0 +1,16 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*|*MINGW*|*MSYS*) + if command -v cygpath > /dev/null 2>&1; then + basedir=`cygpath -w "$basedir"` + fi + ;; +esac + +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../regexp-tree/bin/regexp-tree" "$@" +else + exec node "$basedir/../regexp-tree/bin/regexp-tree" "$@" +fi diff --git a/node_modules/.bin/regexp-tree.cmd b/node_modules/.bin/regexp-tree.cmd new file mode 100644 index 00000000..7fde5dc4 --- /dev/null +++ b/node_modules/.bin/regexp-tree.cmd @@ -0,0 +1,17 @@ +@ECHO off +GOTO start +:find_dp0 +SET dp0=%~dp0 +EXIT /b +:start +SETLOCAL +CALL :find_dp0 + +IF EXIST "%dp0%\node.exe" ( + SET "_prog=%dp0%\node.exe" +) ELSE ( + SET "_prog=node" + SET PATHEXT=%PATHEXT:;.JS;=;% +) + +endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\regexp-tree\bin\regexp-tree" %* diff --git a/node_modules/.bin/regexp-tree.ps1 b/node_modules/.bin/regexp-tree.ps1 new file mode 100644 index 00000000..afc76394 --- /dev/null +++ b/node_modules/.bin/regexp-tree.ps1 @@ -0,0 +1,28 @@ +#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + # Fix case when both the Windows and Linux builds of Node + # are installed in the same directory + $exe=".exe" +} +$ret=0 +if (Test-Path "$basedir/node$exe") { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "$basedir/node$exe" "$basedir/../regexp-tree/bin/regexp-tree" $args + } else { + & "$basedir/node$exe" "$basedir/../regexp-tree/bin/regexp-tree" $args + } + $ret=$LASTEXITCODE +} else { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "node$exe" "$basedir/../regexp-tree/bin/regexp-tree" $args + } else { + & "node$exe" "$basedir/../regexp-tree/bin/regexp-tree" $args + } + $ret=$LASTEXITCODE +} +exit $ret diff --git a/node_modules/.bin/semver b/node_modules/.bin/semver new file mode 100644 index 00000000..97c53279 --- /dev/null +++ b/node_modules/.bin/semver @@ -0,0 +1,16 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*|*MINGW*|*MSYS*) + if command -v cygpath > /dev/null 2>&1; then + basedir=`cygpath -w "$basedir"` + fi + ;; +esac + +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../semver/bin/semver.js" "$@" +else + exec node "$basedir/../semver/bin/semver.js" "$@" +fi diff --git a/node_modules/.bin/semver.cmd b/node_modules/.bin/semver.cmd new file mode 100644 index 00000000..9913fa9d --- /dev/null +++ b/node_modules/.bin/semver.cmd @@ -0,0 +1,17 @@ +@ECHO off +GOTO start +:find_dp0 +SET dp0=%~dp0 +EXIT /b +:start +SETLOCAL +CALL :find_dp0 + +IF EXIST "%dp0%\node.exe" ( + SET "_prog=%dp0%\node.exe" +) ELSE ( + SET "_prog=node" + SET PATHEXT=%PATHEXT:;.JS;=;% +) + +endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\semver\bin\semver.js" %* diff --git a/node_modules/.bin/semver.ps1 b/node_modules/.bin/semver.ps1 new file mode 100644 index 00000000..314717ad --- /dev/null +++ b/node_modules/.bin/semver.ps1 @@ -0,0 +1,28 @@ +#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + # Fix case when both the Windows and Linux builds of Node + # are installed in the same directory + $exe=".exe" +} +$ret=0 +if (Test-Path "$basedir/node$exe") { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "$basedir/node$exe" "$basedir/../semver/bin/semver.js" $args + } else { + & "$basedir/node$exe" "$basedir/../semver/bin/semver.js" $args + } + $ret=$LASTEXITCODE +} else { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "node$exe" "$basedir/../semver/bin/semver.js" $args + } else { + & "node$exe" "$basedir/../semver/bin/semver.js" $args + } + $ret=$LASTEXITCODE +} +exit $ret diff --git a/node_modules/.bin/yaml b/node_modules/.bin/yaml new file mode 100644 index 00000000..c68b081f --- /dev/null +++ b/node_modules/.bin/yaml @@ -0,0 +1,16 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*|*MINGW*|*MSYS*) + if command -v cygpath > /dev/null 2>&1; then + basedir=`cygpath -w "$basedir"` + fi + ;; +esac + +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../yaml/bin.mjs" "$@" +else + exec node "$basedir/../yaml/bin.mjs" "$@" +fi diff --git a/node_modules/.bin/yaml.cmd b/node_modules/.bin/yaml.cmd new file mode 100644 index 00000000..f76090fc --- /dev/null +++ b/node_modules/.bin/yaml.cmd @@ -0,0 +1,17 @@ +@ECHO off +GOTO start +:find_dp0 +SET dp0=%~dp0 +EXIT /b +:start +SETLOCAL +CALL :find_dp0 + +IF EXIST "%dp0%\node.exe" ( + SET "_prog=%dp0%\node.exe" +) ELSE ( + SET "_prog=node" + SET PATHEXT=%PATHEXT:;.JS;=;% +) + +endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\yaml\bin.mjs" %* diff --git a/node_modules/.bin/yaml.ps1 b/node_modules/.bin/yaml.ps1 new file mode 100644 index 00000000..68205828 --- /dev/null +++ b/node_modules/.bin/yaml.ps1 @@ -0,0 +1,28 @@ +#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + # Fix case when both the Windows and Linux builds of Node + # are installed in the same directory + $exe=".exe" +} +$ret=0 +if (Test-Path "$basedir/node$exe") { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "$basedir/node$exe" "$basedir/../yaml/bin.mjs" $args + } else { + & "$basedir/node$exe" "$basedir/../yaml/bin.mjs" $args + } + $ret=$LASTEXITCODE +} else { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "node$exe" "$basedir/../yaml/bin.mjs" $args + } else { + & "node$exe" "$basedir/../yaml/bin.mjs" $args + } + $ret=$LASTEXITCODE +} +exit $ret diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json new file mode 100644 index 00000000..668b8290 --- /dev/null +++ b/node_modules/.package-lock.json @@ -0,0 +1,1319 @@ +{ + "name": "playwrightcheck2", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cucumber/ci-environment": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@cucumber/ci-environment/-/ci-environment-13.0.0.tgz", + "integrity": "sha512-cs+3NzfNkGbcmHPddjEv4TKFiBpZRQ6WJEEufB9mw+ExS22V/4R/zpDSEG+fsJ/iSNCd6A2sATdY8PFOyY3YnA==", + "license": "MIT" + }, + "node_modules/@cucumber/cucumber": { + "version": "12.9.0", + "resolved": "https://registry.npmjs.org/@cucumber/cucumber/-/cucumber-12.9.0.tgz", + "integrity": "sha512-QbgEo/DcKFMRGL+yULh8Kw6peEfdPJjhYjpKp0dYc+6Dv1Bmp6hvxIdTi2CIinYBCXhvCZzNO1Ct/n6Dk1yAtA==", + "license": "MIT", + "dependencies": { + "@cucumber/ci-environment": "13.0.0", + "@cucumber/cucumber-expressions": "19.0.0", + "@cucumber/gherkin": "38.0.0", + "@cucumber/gherkin-streams": "6.0.0", + "@cucumber/gherkin-utils": "11.0.0", + "@cucumber/html-formatter": "23.1.0", + "@cucumber/junit-xml-formatter": "0.13.3", + "@cucumber/message-streams": "4.1.1", + "@cucumber/messages": "32.3.1", + "@cucumber/pretty-formatter": "1.0.1", + "@cucumber/tag-expressions": "9.1.0", + "assertion-error-formatter": "^3.0.0", + "capital-case": "^1.0.4", + "chalk": "^4.1.2", + "cli-table3": "0.6.5", + "commander": "^14.0.0", + "debug": "^4.3.4", + "error-stack-parser": "^2.1.4", + "figures": "^3.2.0", + "glob": "^13.0.0", + "has-ansi": "^4.0.1", + "indent-string": "^4.0.0", + "is-installed-globally": "^0.4.0", + "is-stream": "^2.0.0", + "knuth-shuffle-seeded": "^1.0.6", + "lodash.merge": "^4.6.2", + "lodash.mergewith": "^4.6.2", + "luxon": "3.7.2", + "mkdirp": "^3.0.0", + "mz": "^2.7.0", + "progress": "^2.0.3", + "read-package-up": "^12.0.0", + "semver": "7.7.4", + "string-argv": "0.3.1", + "supports-color": "^8.1.1", + "type-fest": "^4.41.0", + "util-arity": "^1.1.0", + "yaml": "^2.2.2", + "yup": "1.7.1" + }, + "bin": { + "cucumber-js": "bin/cucumber.js" + }, + "engines": { + "node": "20 || 22 || >=24" + }, + "funding": { + "url": "https://opencollective.com/cucumber" + } + }, + "node_modules/@cucumber/cucumber-expressions": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@cucumber/cucumber-expressions/-/cucumber-expressions-19.0.0.tgz", + "integrity": "sha512-4FKoOQh2Uf6F6/Ln+1OxuK8LkTg6PyAqekhf2Ix8zqV2M54sH+m7XNJNLhOFOAW/t9nxzRbw2CcvXbCLjcvHZg==", + "license": "MIT", + "dependencies": { + "regexp-match-indices": "1.0.2" + } + }, + "node_modules/@cucumber/gherkin": { + "version": "38.0.0", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-38.0.0.tgz", + "integrity": "sha512-duEXK+KDfQUzu3vsSzXjkxQ2tirF5PRsc1Xrts6THKHJO6mjw4RjM8RV+vliuDasmhhrmdLcOcM7d9nurNTJKw==", + "license": "MIT", + "dependencies": { + "@cucumber/messages": ">=31.0.0 <33" + } + }, + "node_modules/@cucumber/gherkin-streams": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin-streams/-/gherkin-streams-6.0.0.tgz", + "integrity": "sha512-HLSHMmdDH0vCr7vsVEURcDA4WwnRLdjkhqr6a4HQ3i4RFK1wiDGPjBGVdGJLyuXuRdJpJbFc6QxHvT8pU4t6jw==", + "license": "MIT", + "dependencies": { + "commander": "14.0.0", + "source-map-support": "0.5.21" + }, + "bin": { + "gherkin-javascript": "bin/gherkin" + }, + "peerDependencies": { + "@cucumber/gherkin": ">=22.0.0", + "@cucumber/message-streams": ">=4.0.0", + "@cucumber/messages": ">=17.1.1" + } + }, + "node_modules/@cucumber/gherkin-streams/node_modules/commander": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz", + "integrity": "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cucumber/gherkin-utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin-utils/-/gherkin-utils-11.0.0.tgz", + "integrity": "sha512-LJ+s4+TepHTgdKWDR4zbPyT7rQjmYIcukTwNbwNwgqr6i8Gjcmzf6NmtbYDA19m1ZFg6kWbFsmHnj37ZuX+kZA==", + "license": "MIT", + "dependencies": { + "@cucumber/gherkin": "^38.0.0", + "@cucumber/messages": "^32.0.0", + "@teppeis/multimaps": "3.0.0", + "commander": "14.0.2", + "source-map-support": "^0.5.21" + }, + "bin": { + "gherkin-utils": "bin/gherkin-utils" + } + }, + "node_modules/@cucumber/gherkin-utils/node_modules/commander": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", + "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cucumber/html-formatter": { + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/@cucumber/html-formatter/-/html-formatter-23.1.0.tgz", + "integrity": "sha512-DcCSFoGs6jbwzXPgX1CwgJKEE+ZMcIEzq/0Memg0o24maNn9NJizBFHmoFWG4iv/OxHza+mvc+56cTHetfHndw==", + "license": "MIT", + "peerDependencies": { + "@cucumber/messages": ">=18" + } + }, + "node_modules/@cucumber/junit-xml-formatter": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/@cucumber/junit-xml-formatter/-/junit-xml-formatter-0.13.3.tgz", + "integrity": "sha512-w9ujOxiuKDtU6fLzJz+wp4Sgp5Xu6ba7ls00LHJccVmQU0Ba7zs+AHnv3iIgPjKZAQe1w8x93dr8Gaubh7Vqkg==", + "license": "MIT", + "dependencies": { + "@cucumber/query": "^15.0.1", + "@teppeis/multimaps": "^3.0.0", + "luxon": "^3.5.0", + "xmlbuilder": "^15.1.1" + }, + "peerDependencies": { + "@cucumber/messages": "*" + } + }, + "node_modules/@cucumber/message-streams": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cucumber/message-streams/-/message-streams-4.1.1.tgz", + "integrity": "sha512-QCAntLajesWMyX+mZKrj63YghVAts7yKFlZe46XprLbdJZN0ddB+f/Mr9OnyWKC2DHhJ18jzCfKIFCaqpAmUxg==", + "license": "MIT", + "dependencies": { + "mime": "^3.0.0" + }, + "peerDependencies": { + "@cucumber/messages": ">=17.1.1" + } + }, + "node_modules/@cucumber/messages": { + "version": "32.3.1", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-32.3.1.tgz", + "integrity": "sha512-yNQq1KoXRYaEKrWMFmpUQX7TdeQuU9jeGgJAZ3dArTsC/T4NpJ6DnqaJIIgwPnz/wtQIQTNX7/h0rOuF5xY4qQ==", + "license": "MIT", + "dependencies": { + "class-transformer": "0.5.1", + "reflect-metadata": "0.2.2" + } + }, + "node_modules/@cucumber/pretty-formatter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/pretty-formatter/-/pretty-formatter-1.0.1.tgz", + "integrity": "sha512-A1lU4VVP0aUWdOTmpdzvXOyEYuPtBDI0xYwYJnmoMDplzxMdhcHk86lyyvYDoMoPzzq6OkOE3isuosvUU4X7IQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^5.0.0", + "cli-table3": "^0.6.0", + "figures": "^3.2.0", + "ts-dedent": "^2.0.0" + }, + "peerDependencies": { + "@cucumber/cucumber": ">=7.0.0", + "@cucumber/messages": "*" + } + }, + "node_modules/@cucumber/query": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/query/-/query-15.0.1.tgz", + "integrity": "sha512-FMfT3orJblRsOxvU2doECBvQmauizYlj+5JsM8atAKKPbnQTj7v2/OrnuykvQpfZNBf19DYbRq1e832vllRP/g==", + "license": "MIT", + "dependencies": { + "@teppeis/multimaps": "3.0.0", + "lodash.sortby": "^4.7.0" + }, + "peerDependencies": { + "@cucumber/messages": "*" + } + }, + "node_modules/@cucumber/tag-expressions": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@cucumber/tag-expressions/-/tag-expressions-9.1.0.tgz", + "integrity": "sha512-bvHjcRFZ+J1TqIa9eFNO1wGHqwx4V9ZKV3hYgkuK/VahHx73uiP4rKV3JVrvWSMrwrFvJG6C8aEwnCWSvbyFdQ==", + "license": "MIT" + }, + "node_modules/@playwright/test": { + "version": "1.61.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.61.0.tgz", + "integrity": "sha512-cKA5B6lpFEMyMGjxF54QihfYpB4FkEGH+qZhtArDEG+wezQAJY8Pq6C7T1SjWz+FFzt3TbyoXBQYk/0292TdJA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.61.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@teppeis/multimaps": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@teppeis/multimaps/-/multimaps-3.0.0.tgz", + "integrity": "sha512-ID7fosbc50TbT0MK0EG12O+gAP3W3Aa/Pz4DaTtQtEvlc9Odaqi0de+xuZ7Li2GtK4HzEX7IuRWS/JmZLksR3Q==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "license": "MIT" + }, + "node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "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": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" + }, + "node_modules/assertion-error-formatter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/assertion-error-formatter/-/assertion-error-formatter-3.0.0.tgz", + "integrity": "sha512-6YyAVLrEze0kQ7CmJfUgrLHb+Y7XghmL2Ie7ijVa2Y9ynP3LV+VDiwFk62Dn0qtqbmY0BT0ss6p1xxpiF2PYbQ==", + "license": "MIT", + "dependencies": { + "diff": "^4.0.1", + "pad-right": "^0.2.2", + "repeat-string": "^1.6.1" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/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==", + "license": "MIT" + }, + "node_modules/capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "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/chalk/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/chalk/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/class-transformer": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", + "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==", + "license": "MIT" + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.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==", + "license": "MIT", + "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==", + "license": "MIT" + }, + "node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/diff": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.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==", + "license": "MIT" + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/has-ansi": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-4.0.1.tgz", + "integrity": "sha512-Qr4RtTm30xvEdqUXbSBVWDu+PrTokJOwe/FU+VdfJPk+MXAPoeOzKpRyrDTnZIJwAkQ4oBLTU53nu0HrkF/Z2A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hosted-git-info": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.3.tgz", + "integrity": "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==", + "license": "ISC", + "dependencies": { + "lru-cache": "^11.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/index-to-position": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz", + "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/knuth-shuffle-seeded": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/knuth-shuffle-seeded/-/knuth-shuffle-seeded-1.0.6.tgz", + "integrity": "sha512-9pFH0SplrfyKyojCLxZfMcvkhf5hH0d+UwR9nTVJ/DDQJGuzcXjTwB7TP7sDfehSudlGGaOLblmEWqv04ERVWg==", + "license": "Apache-2.0", + "dependencies": { + "seed-random": "~2.2.0" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "license": "MIT" + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "license": "MIT" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/luxon": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", + "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/normalize-package-data": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-8.0.0.tgz", + "integrity": "sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ==", + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^9.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pad-right": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/pad-right/-/pad-right-0.2.2.tgz", + "integrity": "sha512-4cy8M95ioIGolCoMmm2cMntGR1lPLEbOMzOKu8bzjuJP6JpzEMQcDHmh7hHLYGgob+nKe1YHFMaG4V59HQa89g==", + "license": "MIT", + "dependencies": { + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/playwright": { + "version": "1.61.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.61.0.tgz", + "integrity": "sha512-Z+7BeeqQPRRzklHsVFP4KTGIyMxKUmfeRA4WisM6G3/XW6nwGeX6fX9qYaDa+CiUqpOkb2f6X3nar05R3kSuJQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.61.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.61.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.61.0.tgz", + "integrity": "sha512-caX7TrY3Ml6egyDX0WUcTHDxodl/b51y5wJOdCEA36QviK/s2g081hvmGs8eaE3DWb6NYZQ6BjO/QkNRPenoPA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/property-expr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz", + "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==", + "license": "MIT" + }, + "node_modules/read-package-up": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-12.0.0.tgz", + "integrity": "sha512-Q5hMVBYur/eQNWDdbF4/Wqqr9Bjvtrw2kjGxxBbKLbx8bVCL8gcArjTy8zDUuLGQicftpMuU0riQNcAsbtOVsw==", + "license": "MIT", + "dependencies": { + "find-up-simple": "^1.0.1", + "read-pkg": "^10.0.0", + "type-fest": "^5.2.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-package-up/node_modules/type-fest": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.7.0.tgz", + "integrity": "sha512-1URUxUqfHFM1c+zfSPsa3gnkO7Aq21qyH75SIduNYz4SzY964rn1X2vCMQaHSHhktiw+0kPa2iyb6PUpXqB6Vg==", + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-10.1.0.tgz", + "integrity": "sha512-I8g2lArQiP78ll51UeMZojewtYgIRCKCWqZEgOO8c/uefTI+XDXvCSXu3+YNUaTNvZzobrL5+SqHjBrByRRTdg==", + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.4", + "normalize-package-data": "^8.0.0", + "parse-json": "^8.3.0", + "type-fest": "^5.4.4", + "unicorn-magic": "^0.4.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.7.0.tgz", + "integrity": "sha512-1URUxUqfHFM1c+zfSPsa3gnkO7Aq21qyH75SIduNYz4SzY964rn1X2vCMQaHSHhktiw+0kPa2iyb6PUpXqB6Vg==", + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "license": "Apache-2.0" + }, + "node_modules/regexp-match-indices": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regexp-match-indices/-/regexp-match-indices-1.0.2.tgz", + "integrity": "sha512-DwZuAkt8NF5mKwGGER1EGh2PRqyvhRhhLviH+R8y8dIuaQROlUfXjt4s9ZTXstIsSkptf06BSvwcEmmfheJJWQ==", + "license": "Apache-2.0", + "dependencies": { + "regexp-tree": "^0.1.11" + } + }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "license": "MIT", + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/seed-random": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/seed-random/-/seed-random-2.2.0.tgz", + "integrity": "sha512-34EQV6AAHQGhoc0tn/96a9Fsi6v2xdqe/dMUwljGRaFOzR3EgRmECvD0O8vi8X+/uQ50LGHfkNu/Eue5TPKZkQ==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "license": "CC-BY-3.0" + }, + "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==", + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", + "license": "CC0-1.0" + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "license": "MIT" + }, + "node_modules/string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/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==", + "license": "MIT", + "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", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", + "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": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tiny-case": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz", + "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==", + "license": "MIT" + }, + "node_modules/toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==", + "license": "MIT" + }, + "node_modules/ts-dedent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.3.0.tgz", + "integrity": "sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==", + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unicorn-magic": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz", + "integrity": "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/util-arity": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/util-arity/-/util-arity-1.1.0.tgz", + "integrity": "sha512-kkyIsXKwemfSy8ZEoaIz06ApApnWsk5hQO0vLjZS6UkBiGiW++Jsyb8vSBoc0WKlffGoGs5yYy/j5pp8zckrFA==", + "license": "MIT" + }, + "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==", + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yup": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/yup/-/yup-1.7.1.tgz", + "integrity": "sha512-GKHFX2nXul2/4Dtfxhozv701jLQHdf6J34YDh2cEkpqoo8le5Mg6/LrdseVLrFarmFygZTlfIhHx/QKfb/QWXw==", + "license": "MIT", + "dependencies": { + "property-expr": "^2.0.5", + "tiny-case": "^1.0.3", + "toposort": "^2.0.2", + "type-fest": "^2.19.0" + } + }, + "node_modules/yup/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/node_modules/@babel/code-frame/LICENSE b/node_modules/@babel/code-frame/LICENSE new file mode 100644 index 00000000..f31575ec --- /dev/null +++ b/node_modules/@babel/code-frame/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2014-present Sebastian McKenzie and other contributors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/@babel/code-frame/README.md b/node_modules/@babel/code-frame/README.md new file mode 100644 index 00000000..71607551 --- /dev/null +++ b/node_modules/@babel/code-frame/README.md @@ -0,0 +1,19 @@ +# @babel/code-frame + +> Generate errors that contain a code frame that point to source locations. + +See our website [@babel/code-frame](https://babeljs.io/docs/babel-code-frame) for more information. + +## Install + +Using npm: + +```sh +npm install --save-dev @babel/code-frame +``` + +or using yarn: + +```sh +yarn add @babel/code-frame --dev +``` diff --git a/node_modules/@babel/code-frame/lib/index.js b/node_modules/@babel/code-frame/lib/index.js new file mode 100644 index 00000000..9c5db406 --- /dev/null +++ b/node_modules/@babel/code-frame/lib/index.js @@ -0,0 +1,217 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var picocolors = require('picocolors'); +var jsTokens = require('js-tokens'); +var helperValidatorIdentifier = require('@babel/helper-validator-identifier'); + +function isColorSupported() { + return (typeof process === "object" && (process.env.FORCE_COLOR === "0" || process.env.FORCE_COLOR === "false") ? false : picocolors.isColorSupported + ); +} +const compose = (f, g) => v => f(g(v)); +function buildDefs(colors) { + return { + keyword: colors.cyan, + capitalized: colors.yellow, + jsxIdentifier: colors.yellow, + punctuator: colors.yellow, + number: colors.magenta, + string: colors.green, + regex: colors.magenta, + comment: colors.gray, + invalid: compose(compose(colors.white, colors.bgRed), colors.bold), + gutter: colors.gray, + marker: compose(colors.red, colors.bold), + message: compose(colors.red, colors.bold), + reset: colors.reset + }; +} +const defsOn = buildDefs(picocolors.createColors(true)); +const defsOff = buildDefs(picocolors.createColors(false)); +function getDefs(enabled) { + return enabled ? defsOn : defsOff; +} + +const sometimesKeywords = new Set(["as", "async", "from", "get", "of", "set"]); +const NEWLINE$1 = /\r\n|[\n\r\u2028\u2029]/; +const BRACKET = /^[()[\]{}]$/; +let tokenize; +const JSX_TAG = /^[a-z][\w-]*$/i; +const getTokenType = function (token, offset, text) { + if (token.type === "name") { + const tokenValue = token.value; + if (helperValidatorIdentifier.isKeyword(tokenValue) || helperValidatorIdentifier.isStrictReservedWord(tokenValue, true) || sometimesKeywords.has(tokenValue)) { + return "keyword"; + } + if (JSX_TAG.test(tokenValue) && (text[offset - 1] === "<" || text.slice(offset - 2, offset) === " defs[type](str)).join("\n"); + } else { + highlighted += value; + } + } + return highlighted; +} + +let deprecationWarningShown = false; +const NEWLINE = /\r\n|[\n\r\u2028\u2029]/; +function getMarkerLines(loc, source, opts, startLineBaseZero) { + const startLoc = Object.assign({ + column: 0, + line: -1 + }, loc.start); + const endLoc = Object.assign({}, startLoc, loc.end); + const { + linesAbove = 2, + linesBelow = 3 + } = opts || {}; + const startLine = startLoc.line - startLineBaseZero; + const startColumn = startLoc.column; + const endLine = endLoc.line - startLineBaseZero; + const endColumn = endLoc.column; + let start = Math.max(startLine - (linesAbove + 1), 0); + let end = Math.min(source.length, endLine + linesBelow); + if (startLine === -1) { + start = 0; + } + if (endLine === -1) { + end = source.length; + } + const lineDiff = endLine - startLine; + const markerLines = {}; + if (lineDiff) { + for (let i = 0; i <= lineDiff; i++) { + const lineNumber = i + startLine; + if (!startColumn) { + markerLines[lineNumber] = true; + } else if (i === 0) { + const sourceLength = source[lineNumber - 1].length; + markerLines[lineNumber] = [startColumn, sourceLength - startColumn + 1]; + } else if (i === lineDiff) { + markerLines[lineNumber] = [0, endColumn]; + } else { + const sourceLength = source[lineNumber - i].length; + markerLines[lineNumber] = [0, sourceLength]; + } + } + } else { + if (startColumn === endColumn) { + if (startColumn) { + markerLines[startLine] = [startColumn, 0]; + } else { + markerLines[startLine] = true; + } + } else { + markerLines[startLine] = [startColumn, endColumn - startColumn]; + } + } + return { + start, + end, + markerLines + }; +} +function codeFrameColumns(rawLines, loc, opts = {}) { + const shouldHighlight = opts.forceColor || isColorSupported() && opts.highlightCode; + const startLineBaseZero = (opts.startLine || 1) - 1; + const defs = getDefs(shouldHighlight); + const lines = rawLines.split(NEWLINE); + const { + start, + end, + markerLines + } = getMarkerLines(loc, lines, opts, startLineBaseZero); + const hasColumns = loc.start && typeof loc.start.column === "number"; + const numberMaxWidth = String(end + startLineBaseZero).length; + const highlightedLines = shouldHighlight ? highlight(rawLines) : rawLines; + let frame = highlightedLines.split(NEWLINE, end).slice(start, end).map((line, index) => { + const number = start + 1 + index; + const paddedNumber = ` ${number + startLineBaseZero}`.slice(-numberMaxWidth); + const gutter = ` ${paddedNumber} |`; + const hasMarker = markerLines[number]; + const lastMarkerLine = !markerLines[number + 1]; + if (hasMarker) { + let markerLine = ""; + if (Array.isArray(hasMarker)) { + const markerSpacing = line.slice(0, Math.max(hasMarker[0] - 1, 0)).replace(/[^\t]/g, " "); + const numberOfMarkers = hasMarker[1] || 1; + markerLine = ["\n ", defs.gutter(gutter.replace(/\d/g, " ")), " ", markerSpacing, defs.marker("^").repeat(numberOfMarkers)].join(""); + if (lastMarkerLine && opts.message) { + markerLine += " " + defs.message(opts.message); + } + } + return [defs.marker(">"), defs.gutter(gutter), line.length > 0 ? ` ${line}` : "", markerLine].join(""); + } else { + return ` ${defs.gutter(gutter)}${line.length > 0 ? ` ${line}` : ""}`; + } + }).join("\n"); + if (opts.message && !hasColumns) { + frame = `${" ".repeat(numberMaxWidth + 1)}${opts.message}\n${frame}`; + } + if (shouldHighlight) { + return defs.reset(frame); + } else { + return frame; + } +} +function index (rawLines, lineNumber, colNumber, opts = {}) { + if (!deprecationWarningShown) { + deprecationWarningShown = true; + const message = "Passing lineNumber and colNumber is deprecated to @babel/code-frame. Please use `codeFrameColumns`."; + if (process.emitWarning) { + process.emitWarning(message, "DeprecationWarning"); + } else { + const deprecationError = new Error(message); + deprecationError.name = "DeprecationWarning"; + console.warn(new Error(message)); + } + } + colNumber = Math.max(colNumber, 0); + const location = { + start: { + column: colNumber, + line: lineNumber + } + }; + return codeFrameColumns(rawLines, location, opts); +} + +exports.codeFrameColumns = codeFrameColumns; +exports.default = index; +exports.highlight = highlight; +//# sourceMappingURL=index.js.map diff --git a/node_modules/@babel/code-frame/lib/index.js.map b/node_modules/@babel/code-frame/lib/index.js.map new file mode 100644 index 00000000..6b85ae49 --- /dev/null +++ b/node_modules/@babel/code-frame/lib/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sources":["../src/defs.ts","../src/highlight.ts","../src/index.ts"],"sourcesContent":["import picocolors, { createColors } from \"picocolors\";\nimport type { Colors, Formatter } from \"picocolors/types\";\n\nexport function isColorSupported() {\n return (\n // See https://github.com/alexeyraspopov/picocolors/issues/62\n typeof process === \"object\" &&\n (process.env.FORCE_COLOR === \"0\" || process.env.FORCE_COLOR === \"false\")\n ? false\n : picocolors.isColorSupported\n );\n}\n\nexport type InternalTokenType =\n | \"keyword\"\n | \"capitalized\"\n | \"jsxIdentifier\"\n | \"punctuator\"\n | \"number\"\n | \"string\"\n | \"regex\"\n | \"comment\"\n | \"invalid\";\n\ntype UITokens = \"gutter\" | \"marker\" | \"message\";\n\nexport type Defs = Record;\n\nconst compose: (f: (gv: U) => V, g: (v: T) => U) => (v: T) => V =\n (f, g) => v =>\n f(g(v));\n\n/**\n * Styles for token types.\n */\nfunction buildDefs(colors: Colors): Defs {\n return {\n keyword: colors.cyan,\n capitalized: colors.yellow,\n jsxIdentifier: colors.yellow,\n punctuator: colors.yellow,\n number: colors.magenta,\n string: colors.green,\n regex: colors.magenta,\n comment: colors.gray,\n invalid: compose(compose(colors.white, colors.bgRed), colors.bold),\n\n gutter: colors.gray,\n marker: compose(colors.red, colors.bold),\n message: compose(colors.red, colors.bold),\n\n reset: colors.reset,\n };\n}\n\nconst defsOn = buildDefs(createColors(true));\nconst defsOff = buildDefs(createColors(false));\n\nexport function getDefs(enabled: boolean): Defs {\n return enabled ? defsOn : defsOff;\n}\n","import type { Token as JSToken, JSXToken } from \"js-tokens\";\nimport jsTokens from \"js-tokens\";\n// We inline this package\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport * as charCodes from \"charcodes\";\n\nimport {\n isStrictReservedWord,\n isKeyword,\n} from \"@babel/helper-validator-identifier\";\n\nimport { getDefs, type InternalTokenType } from \"./defs.ts\";\n\n/**\n * Names that are always allowed as identifiers, but also appear as keywords\n * within certain syntactic productions.\n *\n * https://tc39.es/ecma262/#sec-keywords-and-reserved-words\n *\n * `target` has been omitted since it is very likely going to be a false\n * positive.\n */\nconst sometimesKeywords = new Set([\"as\", \"async\", \"from\", \"get\", \"of\", \"set\"]);\n\ntype Token = {\n type: InternalTokenType | \"uncolored\";\n value: string;\n};\n\n/**\n * RegExp to test for newlines in terminal.\n */\nconst NEWLINE = /\\r\\n|[\\n\\r\\u2028\\u2029]/;\n\n/**\n * RegExp to test for the three types of brackets.\n */\nconst BRACKET = /^[()[\\]{}]$/;\n\nlet tokenize: (\n text: string,\n) => Generator<{ type: InternalTokenType | \"uncolored\"; value: string }>;\n\nif (process.env.BABEL_8_BREAKING) {\n /**\n * Get the type of token, specifying punctuator type.\n */\n const getTokenType = function (\n token: JSToken | JSXToken,\n ): InternalTokenType | \"uncolored\" {\n if (token.type === \"IdentifierName\") {\n const tokenValue = token.value;\n if (\n isKeyword(tokenValue) ||\n isStrictReservedWord(tokenValue, true) ||\n sometimesKeywords.has(tokenValue)\n ) {\n return \"keyword\";\n }\n\n const firstChar = tokenValue.charCodeAt(0);\n if (firstChar < 128) {\n // ASCII characters\n if (\n firstChar >= charCodes.uppercaseA &&\n firstChar <= charCodes.uppercaseZ\n ) {\n return \"capitalized\";\n }\n } else {\n const firstChar = String.fromCodePoint(tokenValue.codePointAt(0));\n if (firstChar !== firstChar.toLowerCase()) {\n return \"capitalized\";\n }\n }\n }\n\n if (token.type === \"Punctuator\" && BRACKET.test(token.value)) {\n return \"uncolored\";\n }\n\n if (token.type === \"Invalid\" && token.value === \"@\") {\n return \"punctuator\";\n }\n\n switch (token.type) {\n case \"NumericLiteral\":\n return \"number\";\n\n case \"StringLiteral\":\n case \"JSXString\":\n case \"NoSubstitutionTemplate\":\n return \"string\";\n\n case \"RegularExpressionLiteral\":\n return \"regex\";\n\n case \"Punctuator\":\n case \"JSXPunctuator\":\n return \"punctuator\";\n\n case \"MultiLineComment\":\n case \"SingleLineComment\":\n return \"comment\";\n\n case \"Invalid\":\n case \"JSXInvalid\":\n return \"invalid\";\n\n case \"JSXIdentifier\":\n return \"jsxIdentifier\";\n\n default:\n return \"uncolored\";\n }\n };\n\n /**\n * Turn a string of JS into an array of objects.\n */\n tokenize = function* (text: string): Generator {\n for (const token of jsTokens(text, { jsx: true })) {\n switch (token.type) {\n case \"TemplateHead\":\n yield { type: \"string\", value: token.value.slice(0, -2) };\n yield { type: \"punctuator\", value: \"${\" };\n break;\n\n case \"TemplateMiddle\":\n yield { type: \"punctuator\", value: \"}\" };\n yield { type: \"string\", value: token.value.slice(1, -2) };\n yield { type: \"punctuator\", value: \"${\" };\n break;\n\n case \"TemplateTail\":\n yield { type: \"punctuator\", value: \"}\" };\n yield { type: \"string\", value: token.value.slice(1) };\n break;\n\n default:\n yield {\n type: getTokenType(token),\n value: token.value,\n };\n }\n }\n };\n} else {\n /**\n * RegExp to test for what seems to be a JSX tag name.\n */\n const JSX_TAG = /^[a-z][\\w-]*$/i;\n\n // The token here is defined in js-tokens@4. However we don't bother\n // typing it since the whole block will be removed in Babel 8\n const getTokenType = function (token: any, offset: number, text: string) {\n if (token.type === \"name\") {\n const tokenValue = token.value;\n if (\n isKeyword(tokenValue) ||\n isStrictReservedWord(tokenValue, true) ||\n sometimesKeywords.has(tokenValue)\n ) {\n return \"keyword\";\n }\n\n if (\n JSX_TAG.test(tokenValue) &&\n (text[offset - 1] === \"<\" || text.slice(offset - 2, offset) === \" defs[type as InternalTokenType](str))\n .join(\"\\n\");\n } else {\n highlighted += value;\n }\n }\n\n return highlighted;\n}\n","import { getDefs, isColorSupported } from \"./defs.ts\";\nimport { highlight } from \"./highlight.ts\";\n\nexport { highlight };\n\nlet deprecationWarningShown = false;\n\ntype Location = {\n column: number;\n line: number;\n};\n\ntype NodeLocation = {\n end?: Location;\n start: Location;\n};\n\nexport interface Options {\n /** Syntax highlight the code as JavaScript for terminals. default: false */\n highlightCode?: boolean;\n /** The number of lines to show above the error. default: 2 */\n linesAbove?: number;\n /** The number of lines to show below the error. default: 3 */\n linesBelow?: number;\n /** The line number corresponding to the first line in `rawLines`. default: 1 */\n startLine?: number;\n /**\n * Forcibly syntax highlight the code as JavaScript (for non-terminals);\n * overrides highlightCode.\n * default: false\n */\n forceColor?: boolean;\n /**\n * Pass in a string to be displayed inline (if possible) next to the\n * highlighted location in the code. If it can't be positioned inline,\n * it will be placed above the code frame.\n * default: nothing\n */\n message?: string;\n}\n\n/**\n * RegExp to test for newlines in terminal.\n */\n\nconst NEWLINE = /\\r\\n|[\\n\\r\\u2028\\u2029]/;\n\n/**\n * Extract what lines should be marked and highlighted.\n */\n\ntype MarkerLines = Record;\n\nfunction getMarkerLines(\n loc: NodeLocation,\n source: string[],\n opts: Options,\n startLineBaseZero: number,\n): {\n start: number;\n end: number;\n markerLines: MarkerLines;\n} {\n const startLoc: Location = {\n column: 0,\n line: -1,\n ...loc.start,\n };\n const endLoc: Location = {\n ...startLoc,\n ...loc.end,\n };\n const { linesAbove = 2, linesBelow = 3 } = opts || {};\n const startLine = startLoc.line - startLineBaseZero;\n const startColumn = startLoc.column;\n const endLine = endLoc.line - startLineBaseZero;\n const endColumn = endLoc.column;\n\n let start = Math.max(startLine - (linesAbove + 1), 0);\n let end = Math.min(source.length, endLine + linesBelow);\n\n if (startLine === -1) {\n start = 0;\n }\n\n if (endLine === -1) {\n end = source.length;\n }\n\n const lineDiff = endLine - startLine;\n const markerLines: MarkerLines = {};\n\n if (lineDiff) {\n for (let i = 0; i <= lineDiff; i++) {\n const lineNumber = i + startLine;\n\n if (!startColumn) {\n markerLines[lineNumber] = true;\n } else if (i === 0) {\n const sourceLength = source[lineNumber - 1].length;\n\n markerLines[lineNumber] = [startColumn, sourceLength - startColumn + 1];\n } else if (i === lineDiff) {\n markerLines[lineNumber] = [0, endColumn];\n } else {\n const sourceLength = source[lineNumber - i].length;\n\n markerLines[lineNumber] = [0, sourceLength];\n }\n }\n } else {\n if (startColumn === endColumn) {\n if (startColumn) {\n markerLines[startLine] = [startColumn, 0];\n } else {\n markerLines[startLine] = true;\n }\n } else {\n markerLines[startLine] = [startColumn, endColumn - startColumn];\n }\n }\n\n return { start, end, markerLines };\n}\n\nexport function codeFrameColumns(\n rawLines: string,\n loc: NodeLocation,\n opts: Options = {},\n): string {\n const shouldHighlight =\n opts.forceColor || (isColorSupported() && opts.highlightCode);\n const startLineBaseZero = (opts.startLine || 1) - 1;\n const defs = getDefs(shouldHighlight);\n\n const lines = rawLines.split(NEWLINE);\n const { start, end, markerLines } = getMarkerLines(\n loc,\n lines,\n opts,\n startLineBaseZero,\n );\n const hasColumns = loc.start && typeof loc.start.column === \"number\";\n\n const numberMaxWidth = String(end + startLineBaseZero).length;\n\n const highlightedLines = shouldHighlight ? highlight(rawLines) : rawLines;\n\n let frame = highlightedLines\n .split(NEWLINE, end)\n .slice(start, end)\n .map((line, index) => {\n const number = start + 1 + index;\n const paddedNumber = ` ${number + startLineBaseZero}`.slice(\n -numberMaxWidth,\n );\n const gutter = ` ${paddedNumber} |`;\n const hasMarker = markerLines[number];\n const lastMarkerLine = !markerLines[number + 1];\n if (hasMarker) {\n let markerLine = \"\";\n if (Array.isArray(hasMarker)) {\n const markerSpacing = line\n .slice(0, Math.max(hasMarker[0] - 1, 0))\n .replace(/[^\\t]/g, \" \");\n const numberOfMarkers = hasMarker[1] || 1;\n\n markerLine = [\n \"\\n \",\n defs.gutter(gutter.replace(/\\d/g, \" \")),\n \" \",\n markerSpacing,\n defs.marker(\"^\").repeat(numberOfMarkers),\n ].join(\"\");\n\n if (lastMarkerLine && opts.message) {\n markerLine += \" \" + defs.message(opts.message);\n }\n }\n return [\n defs.marker(\">\"),\n defs.gutter(gutter),\n line.length > 0 ? ` ${line}` : \"\",\n markerLine,\n ].join(\"\");\n } else {\n return ` ${defs.gutter(gutter)}${line.length > 0 ? ` ${line}` : \"\"}`;\n }\n })\n .join(\"\\n\");\n\n if (opts.message && !hasColumns) {\n frame = `${\" \".repeat(numberMaxWidth + 1)}${opts.message}\\n${frame}`;\n }\n\n if (shouldHighlight) {\n return defs.reset(frame);\n } else {\n return frame;\n }\n}\n\n/**\n * Create a code frame, adding line numbers, code highlighting, and pointing to a given position.\n */\n\nexport default function (\n rawLines: string,\n lineNumber: number,\n colNumber?: number | null,\n opts: Options = {},\n): string {\n if (!deprecationWarningShown) {\n deprecationWarningShown = true;\n\n const message =\n \"Passing lineNumber and colNumber is deprecated to @babel/code-frame. Please use `codeFrameColumns`.\";\n\n if (process.emitWarning) {\n // A string is directly supplied to emitWarning, because when supplying an\n // Error object node throws in the tests because of different contexts\n process.emitWarning(message, \"DeprecationWarning\");\n } else {\n const deprecationError = new Error(message);\n deprecationError.name = \"DeprecationWarning\";\n console.warn(new Error(message));\n }\n }\n\n colNumber = Math.max(colNumber, 0);\n\n const location: NodeLocation = {\n start: { column: colNumber, line: lineNumber },\n };\n\n return codeFrameColumns(rawLines, location, opts);\n}\n"],"names":["isColorSupported","process","env","FORCE_COLOR","picocolors","compose","f","g","v","buildDefs","colors","keyword","cyan","capitalized","yellow","jsxIdentifier","punctuator","number","magenta","string","green","regex","comment","gray","invalid","white","bgRed","bold","gutter","marker","red","message","reset","defsOn","createColors","defsOff","getDefs","enabled","sometimesKeywords","Set","NEWLINE","BRACKET","tokenize","JSX_TAG","getTokenType","token","offset","text","type","tokenValue","value","isKeyword","isStrictReservedWord","has","test","slice","firstChar","String","fromCodePoint","codePointAt","toLowerCase","match","jsTokens","default","exec","matchToToken","index","highlight","defs","highlighted","split","map","str","join","deprecationWarningShown","getMarkerLines","loc","source","opts","startLineBaseZero","startLoc","Object","assign","column","line","start","endLoc","end","linesAbove","linesBelow","startLine","startColumn","endLine","endColumn","Math","max","min","length","lineDiff","markerLines","i","lineNumber","sourceLength","codeFrameColumns","rawLines","shouldHighlight","forceColor","highlightCode","lines","hasColumns","numberMaxWidth","highlightedLines","frame","paddedNumber","hasMarker","lastMarkerLine","markerLine","Array","isArray","markerSpacing","replace","numberOfMarkers","repeat","colNumber","emitWarning","deprecationError","Error","name","console","warn","location"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@babel/code-frame/package.json b/node_modules/@babel/code-frame/package.json new file mode 100644 index 00000000..1f21a379 --- /dev/null +++ b/node_modules/@babel/code-frame/package.json @@ -0,0 +1,32 @@ +{ + "name": "@babel/code-frame", + "version": "7.29.7", + "description": "Generate errors that contain a code frame that point to source locations.", + "author": "The Babel Team (https://babel.dev/team)", + "homepage": "https://babel.dev/docs/en/next/babel-code-frame", + "bugs": "https://github.com/babel/babel/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen", + "license": "MIT", + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "https://github.com/babel/babel.git", + "directory": "packages/babel-code-frame" + }, + "main": "./lib/index.js", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "devDependencies": { + "charcodes": "^0.2.0", + "import-meta-resolve": "^4.1.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "type": "commonjs" +} \ No newline at end of file diff --git a/node_modules/@babel/helper-validator-identifier/LICENSE b/node_modules/@babel/helper-validator-identifier/LICENSE new file mode 100644 index 00000000..f31575ec --- /dev/null +++ b/node_modules/@babel/helper-validator-identifier/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2014-present Sebastian McKenzie and other contributors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/@babel/helper-validator-identifier/README.md b/node_modules/@babel/helper-validator-identifier/README.md new file mode 100644 index 00000000..05c19e64 --- /dev/null +++ b/node_modules/@babel/helper-validator-identifier/README.md @@ -0,0 +1,19 @@ +# @babel/helper-validator-identifier + +> Validate identifier/keywords name + +See our website [@babel/helper-validator-identifier](https://babeljs.io/docs/babel-helper-validator-identifier) for more information. + +## Install + +Using npm: + +```sh +npm install --save @babel/helper-validator-identifier +``` + +or using yarn: + +```sh +yarn add @babel/helper-validator-identifier +``` diff --git a/node_modules/@babel/helper-validator-identifier/lib/identifier.js b/node_modules/@babel/helper-validator-identifier/lib/identifier.js new file mode 100644 index 00000000..b12e6e4b --- /dev/null +++ b/node_modules/@babel/helper-validator-identifier/lib/identifier.js @@ -0,0 +1,70 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.isIdentifierChar = isIdentifierChar; +exports.isIdentifierName = isIdentifierName; +exports.isIdentifierStart = isIdentifierStart; +let nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088f\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5c\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdc-\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c8a\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7dc\ua7f1-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; +let nonASCIIidentifierChars = "\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0897-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1add\u1ae0-\u1aeb\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\u30fb\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f\uff65"; +const nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]"); +const nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]"); +nonASCIIidentifierStartChars = nonASCIIidentifierChars = null; +const astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 4, 51, 13, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 7, 25, 39, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 39, 27, 10, 22, 251, 41, 7, 1, 17, 5, 57, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 31, 9, 2, 0, 3, 0, 2, 37, 2, 0, 26, 0, 2, 0, 45, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 200, 32, 32, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 24, 43, 261, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 26, 3994, 6, 582, 6842, 29, 1763, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 433, 44, 212, 63, 33, 24, 3, 24, 45, 74, 6, 0, 67, 12, 65, 1, 2, 0, 15, 4, 10, 7381, 42, 31, 98, 114, 8702, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 229, 29, 3, 0, 208, 30, 2, 2, 2, 1, 2, 6, 3, 4, 10, 1, 225, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4381, 3, 5773, 3, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 8489]; +const astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 7, 9, 32, 4, 318, 1, 78, 5, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 68, 8, 2, 0, 3, 0, 2, 3, 2, 4, 2, 0, 15, 1, 83, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 7, 19, 58, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 199, 7, 137, 9, 54, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 55, 9, 266, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 10, 5350, 0, 7, 14, 11465, 27, 2343, 9, 87, 9, 39, 4, 60, 6, 26, 9, 535, 9, 470, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4178, 9, 519, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 245, 1, 2, 9, 233, 0, 3, 0, 8, 1, 6, 0, 475, 6, 110, 6, 6, 9, 4759, 9, 787719, 239]; +function isInAstralSet(code, set) { + let pos = 0x10000; + for (let i = 0, length = set.length; i < length; i += 2) { + pos += set[i]; + if (pos > code) return false; + pos += set[i + 1]; + if (pos >= code) return true; + } + return false; +} +function isIdentifierStart(code) { + if (code < 65) return code === 36; + if (code <= 90) return true; + if (code < 97) return code === 95; + if (code <= 122) return true; + if (code <= 0xffff) { + return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code)); + } + return isInAstralSet(code, astralIdentifierStartCodes); +} +function isIdentifierChar(code) { + if (code < 48) return code === 36; + if (code < 58) return true; + if (code < 65) return false; + if (code <= 90) return true; + if (code < 97) return code === 95; + if (code <= 122) return true; + if (code <= 0xffff) { + return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code)); + } + return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes); +} +function isIdentifierName(name) { + let isFirst = true; + for (let i = 0; i < name.length; i++) { + let cp = name.charCodeAt(i); + if ((cp & 0xfc00) === 0xd800 && i + 1 < name.length) { + const trail = name.charCodeAt(++i); + if ((trail & 0xfc00) === 0xdc00) { + cp = 0x10000 + ((cp & 0x3ff) << 10) + (trail & 0x3ff); + } + } + if (isFirst) { + isFirst = false; + if (!isIdentifierStart(cp)) { + return false; + } + } else if (!isIdentifierChar(cp)) { + return false; + } + } + return !isFirst; +} + +//# sourceMappingURL=identifier.js.map diff --git a/node_modules/@babel/helper-validator-identifier/lib/identifier.js.map b/node_modules/@babel/helper-validator-identifier/lib/identifier.js.map new file mode 100644 index 00000000..71d32ff2 --- /dev/null +++ b/node_modules/@babel/helper-validator-identifier/lib/identifier.js.map @@ -0,0 +1 @@ +{"version":3,"names":["nonASCIIidentifierStartChars","nonASCIIidentifierChars","nonASCIIidentifierStart","RegExp","nonASCIIidentifier","astralIdentifierStartCodes","astralIdentifierCodes","isInAstralSet","code","set","pos","i","length","isIdentifierStart","test","String","fromCharCode","isIdentifierChar","isIdentifierName","name","isFirst","cp","charCodeAt","trail"],"sources":["../src/identifier.ts"],"sourcesContent":["// We inline this package\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport * as charCodes from \"charcodes\";\n\n// ## Character categories\n\n// Big ugly regular expressions that match characters in the\n// whitespace, identifier, and identifier-start categories. These\n// are only applied when a character is found to actually have a\n// code point between 0x80 and 0xffff.\n// Generated by `scripts/generate-identifier-regex.cjs`.\n\n/* prettier-ignore */\nlet nonASCIIidentifierStartChars = \"\\xaa\\xb5\\xba\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\u02c1\\u02c6-\\u02d1\\u02e0-\\u02e4\\u02ec\\u02ee\\u0370-\\u0374\\u0376\\u0377\\u037a-\\u037d\\u037f\\u0386\\u0388-\\u038a\\u038c\\u038e-\\u03a1\\u03a3-\\u03f5\\u03f7-\\u0481\\u048a-\\u052f\\u0531-\\u0556\\u0559\\u0560-\\u0588\\u05d0-\\u05ea\\u05ef-\\u05f2\\u0620-\\u064a\\u066e\\u066f\\u0671-\\u06d3\\u06d5\\u06e5\\u06e6\\u06ee\\u06ef\\u06fa-\\u06fc\\u06ff\\u0710\\u0712-\\u072f\\u074d-\\u07a5\\u07b1\\u07ca-\\u07ea\\u07f4\\u07f5\\u07fa\\u0800-\\u0815\\u081a\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086a\\u0870-\\u0887\\u0889-\\u088f\\u08a0-\\u08c9\\u0904-\\u0939\\u093d\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098c\\u098f\\u0990\\u0993-\\u09a8\\u09aa-\\u09b0\\u09b2\\u09b6-\\u09b9\\u09bd\\u09ce\\u09dc\\u09dd\\u09df-\\u09e1\\u09f0\\u09f1\\u09fc\\u0a05-\\u0a0a\\u0a0f\\u0a10\\u0a13-\\u0a28\\u0a2a-\\u0a30\\u0a32\\u0a33\\u0a35\\u0a36\\u0a38\\u0a39\\u0a59-\\u0a5c\\u0a5e\\u0a72-\\u0a74\\u0a85-\\u0a8d\\u0a8f-\\u0a91\\u0a93-\\u0aa8\\u0aaa-\\u0ab0\\u0ab2\\u0ab3\\u0ab5-\\u0ab9\\u0abd\\u0ad0\\u0ae0\\u0ae1\\u0af9\\u0b05-\\u0b0c\\u0b0f\\u0b10\\u0b13-\\u0b28\\u0b2a-\\u0b30\\u0b32\\u0b33\\u0b35-\\u0b39\\u0b3d\\u0b5c\\u0b5d\\u0b5f-\\u0b61\\u0b71\\u0b83\\u0b85-\\u0b8a\\u0b8e-\\u0b90\\u0b92-\\u0b95\\u0b99\\u0b9a\\u0b9c\\u0b9e\\u0b9f\\u0ba3\\u0ba4\\u0ba8-\\u0baa\\u0bae-\\u0bb9\\u0bd0\\u0c05-\\u0c0c\\u0c0e-\\u0c10\\u0c12-\\u0c28\\u0c2a-\\u0c39\\u0c3d\\u0c58-\\u0c5a\\u0c5c\\u0c5d\\u0c60\\u0c61\\u0c80\\u0c85-\\u0c8c\\u0c8e-\\u0c90\\u0c92-\\u0ca8\\u0caa-\\u0cb3\\u0cb5-\\u0cb9\\u0cbd\\u0cdc-\\u0cde\\u0ce0\\u0ce1\\u0cf1\\u0cf2\\u0d04-\\u0d0c\\u0d0e-\\u0d10\\u0d12-\\u0d3a\\u0d3d\\u0d4e\\u0d54-\\u0d56\\u0d5f-\\u0d61\\u0d7a-\\u0d7f\\u0d85-\\u0d96\\u0d9a-\\u0db1\\u0db3-\\u0dbb\\u0dbd\\u0dc0-\\u0dc6\\u0e01-\\u0e30\\u0e32\\u0e33\\u0e40-\\u0e46\\u0e81\\u0e82\\u0e84\\u0e86-\\u0e8a\\u0e8c-\\u0ea3\\u0ea5\\u0ea7-\\u0eb0\\u0eb2\\u0eb3\\u0ebd\\u0ec0-\\u0ec4\\u0ec6\\u0edc-\\u0edf\\u0f00\\u0f40-\\u0f47\\u0f49-\\u0f6c\\u0f88-\\u0f8c\\u1000-\\u102a\\u103f\\u1050-\\u1055\\u105a-\\u105d\\u1061\\u1065\\u1066\\u106e-\\u1070\\u1075-\\u1081\\u108e\\u10a0-\\u10c5\\u10c7\\u10cd\\u10d0-\\u10fa\\u10fc-\\u1248\\u124a-\\u124d\\u1250-\\u1256\\u1258\\u125a-\\u125d\\u1260-\\u1288\\u128a-\\u128d\\u1290-\\u12b0\\u12b2-\\u12b5\\u12b8-\\u12be\\u12c0\\u12c2-\\u12c5\\u12c8-\\u12d6\\u12d8-\\u1310\\u1312-\\u1315\\u1318-\\u135a\\u1380-\\u138f\\u13a0-\\u13f5\\u13f8-\\u13fd\\u1401-\\u166c\\u166f-\\u167f\\u1681-\\u169a\\u16a0-\\u16ea\\u16ee-\\u16f8\\u1700-\\u1711\\u171f-\\u1731\\u1740-\\u1751\\u1760-\\u176c\\u176e-\\u1770\\u1780-\\u17b3\\u17d7\\u17dc\\u1820-\\u1878\\u1880-\\u18a8\\u18aa\\u18b0-\\u18f5\\u1900-\\u191e\\u1950-\\u196d\\u1970-\\u1974\\u1980-\\u19ab\\u19b0-\\u19c9\\u1a00-\\u1a16\\u1a20-\\u1a54\\u1aa7\\u1b05-\\u1b33\\u1b45-\\u1b4c\\u1b83-\\u1ba0\\u1bae\\u1baf\\u1bba-\\u1be5\\u1c00-\\u1c23\\u1c4d-\\u1c4f\\u1c5a-\\u1c7d\\u1c80-\\u1c8a\\u1c90-\\u1cba\\u1cbd-\\u1cbf\\u1ce9-\\u1cec\\u1cee-\\u1cf3\\u1cf5\\u1cf6\\u1cfa\\u1d00-\\u1dbf\\u1e00-\\u1f15\\u1f18-\\u1f1d\\u1f20-\\u1f45\\u1f48-\\u1f4d\\u1f50-\\u1f57\\u1f59\\u1f5b\\u1f5d\\u1f5f-\\u1f7d\\u1f80-\\u1fb4\\u1fb6-\\u1fbc\\u1fbe\\u1fc2-\\u1fc4\\u1fc6-\\u1fcc\\u1fd0-\\u1fd3\\u1fd6-\\u1fdb\\u1fe0-\\u1fec\\u1ff2-\\u1ff4\\u1ff6-\\u1ffc\\u2071\\u207f\\u2090-\\u209c\\u2102\\u2107\\u210a-\\u2113\\u2115\\u2118-\\u211d\\u2124\\u2126\\u2128\\u212a-\\u2139\\u213c-\\u213f\\u2145-\\u2149\\u214e\\u2160-\\u2188\\u2c00-\\u2ce4\\u2ceb-\\u2cee\\u2cf2\\u2cf3\\u2d00-\\u2d25\\u2d27\\u2d2d\\u2d30-\\u2d67\\u2d6f\\u2d80-\\u2d96\\u2da0-\\u2da6\\u2da8-\\u2dae\\u2db0-\\u2db6\\u2db8-\\u2dbe\\u2dc0-\\u2dc6\\u2dc8-\\u2dce\\u2dd0-\\u2dd6\\u2dd8-\\u2dde\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303c\\u3041-\\u3096\\u309b-\\u309f\\u30a1-\\u30fa\\u30fc-\\u30ff\\u3105-\\u312f\\u3131-\\u318e\\u31a0-\\u31bf\\u31f0-\\u31ff\\u3400-\\u4dbf\\u4e00-\\ua48c\\ua4d0-\\ua4fd\\ua500-\\ua60c\\ua610-\\ua61f\\ua62a\\ua62b\\ua640-\\ua66e\\ua67f-\\ua69d\\ua6a0-\\ua6ef\\ua717-\\ua71f\\ua722-\\ua788\\ua78b-\\ua7dc\\ua7f1-\\ua801\\ua803-\\ua805\\ua807-\\ua80a\\ua80c-\\ua822\\ua840-\\ua873\\ua882-\\ua8b3\\ua8f2-\\ua8f7\\ua8fb\\ua8fd\\ua8fe\\ua90a-\\ua925\\ua930-\\ua946\\ua960-\\ua97c\\ua984-\\ua9b2\\ua9cf\\ua9e0-\\ua9e4\\ua9e6-\\ua9ef\\ua9fa-\\ua9fe\\uaa00-\\uaa28\\uaa40-\\uaa42\\uaa44-\\uaa4b\\uaa60-\\uaa76\\uaa7a\\uaa7e-\\uaaaf\\uaab1\\uaab5\\uaab6\\uaab9-\\uaabd\\uaac0\\uaac2\\uaadb-\\uaadd\\uaae0-\\uaaea\\uaaf2-\\uaaf4\\uab01-\\uab06\\uab09-\\uab0e\\uab11-\\uab16\\uab20-\\uab26\\uab28-\\uab2e\\uab30-\\uab5a\\uab5c-\\uab69\\uab70-\\uabe2\\uac00-\\ud7a3\\ud7b0-\\ud7c6\\ud7cb-\\ud7fb\\uf900-\\ufa6d\\ufa70-\\ufad9\\ufb00-\\ufb06\\ufb13-\\ufb17\\ufb1d\\ufb1f-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40\\ufb41\\ufb43\\ufb44\\ufb46-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uffbe\\uffc2-\\uffc7\\uffca-\\uffcf\\uffd2-\\uffd7\\uffda-\\uffdc\";\n/* prettier-ignore */\nlet nonASCIIidentifierChars = \"\\xb7\\u0300-\\u036f\\u0387\\u0483-\\u0487\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u0669\\u0670\\u06d6-\\u06dc\\u06df-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u06f0-\\u06f9\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07c0-\\u07c9\\u07eb-\\u07f3\\u07fd\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0859-\\u085b\\u0897-\\u089f\\u08ca-\\u08e1\\u08e3-\\u0903\\u093a-\\u093c\\u093e-\\u094f\\u0951-\\u0957\\u0962\\u0963\\u0966-\\u096f\\u0981-\\u0983\\u09bc\\u09be-\\u09c4\\u09c7\\u09c8\\u09cb-\\u09cd\\u09d7\\u09e2\\u09e3\\u09e6-\\u09ef\\u09fe\\u0a01-\\u0a03\\u0a3c\\u0a3e-\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a66-\\u0a71\\u0a75\\u0a81-\\u0a83\\u0abc\\u0abe-\\u0ac5\\u0ac7-\\u0ac9\\u0acb-\\u0acd\\u0ae2\\u0ae3\\u0ae6-\\u0aef\\u0afa-\\u0aff\\u0b01-\\u0b03\\u0b3c\\u0b3e-\\u0b44\\u0b47\\u0b48\\u0b4b-\\u0b4d\\u0b55-\\u0b57\\u0b62\\u0b63\\u0b66-\\u0b6f\\u0b82\\u0bbe-\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcd\\u0bd7\\u0be6-\\u0bef\\u0c00-\\u0c04\\u0c3c\\u0c3e-\\u0c44\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0c66-\\u0c6f\\u0c81-\\u0c83\\u0cbc\\u0cbe-\\u0cc4\\u0cc6-\\u0cc8\\u0cca-\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0ce6-\\u0cef\\u0cf3\\u0d00-\\u0d03\\u0d3b\\u0d3c\\u0d3e-\\u0d44\\u0d46-\\u0d48\\u0d4a-\\u0d4d\\u0d57\\u0d62\\u0d63\\u0d66-\\u0d6f\\u0d81-\\u0d83\\u0dca\\u0dcf-\\u0dd4\\u0dd6\\u0dd8-\\u0ddf\\u0de6-\\u0def\\u0df2\\u0df3\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0e50-\\u0e59\\u0eb1\\u0eb4-\\u0ebc\\u0ec8-\\u0ece\\u0ed0-\\u0ed9\\u0f18\\u0f19\\u0f20-\\u0f29\\u0f35\\u0f37\\u0f39\\u0f3e\\u0f3f\\u0f71-\\u0f84\\u0f86\\u0f87\\u0f8d-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102b-\\u103e\\u1040-\\u1049\\u1056-\\u1059\\u105e-\\u1060\\u1062-\\u1064\\u1067-\\u106d\\u1071-\\u1074\\u1082-\\u108d\\u108f-\\u109d\\u135d-\\u135f\\u1369-\\u1371\\u1712-\\u1715\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b4-\\u17d3\\u17dd\\u17e0-\\u17e9\\u180b-\\u180d\\u180f-\\u1819\\u18a9\\u1920-\\u192b\\u1930-\\u193b\\u1946-\\u194f\\u19d0-\\u19da\\u1a17-\\u1a1b\\u1a55-\\u1a5e\\u1a60-\\u1a7c\\u1a7f-\\u1a89\\u1a90-\\u1a99\\u1ab0-\\u1abd\\u1abf-\\u1add\\u1ae0-\\u1aeb\\u1b00-\\u1b04\\u1b34-\\u1b44\\u1b50-\\u1b59\\u1b6b-\\u1b73\\u1b80-\\u1b82\\u1ba1-\\u1bad\\u1bb0-\\u1bb9\\u1be6-\\u1bf3\\u1c24-\\u1c37\\u1c40-\\u1c49\\u1c50-\\u1c59\\u1cd0-\\u1cd2\\u1cd4-\\u1ce8\\u1ced\\u1cf4\\u1cf7-\\u1cf9\\u1dc0-\\u1dff\\u200c\\u200d\\u203f\\u2040\\u2054\\u20d0-\\u20dc\\u20e1\\u20e5-\\u20f0\\u2cef-\\u2cf1\\u2d7f\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\u30fb\\ua620-\\ua629\\ua66f\\ua674-\\ua67d\\ua69e\\ua69f\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua823-\\ua827\\ua82c\\ua880\\ua881\\ua8b4-\\ua8c5\\ua8d0-\\ua8d9\\ua8e0-\\ua8f1\\ua8ff-\\ua909\\ua926-\\ua92d\\ua947-\\ua953\\ua980-\\ua983\\ua9b3-\\ua9c0\\ua9d0-\\ua9d9\\ua9e5\\ua9f0-\\ua9f9\\uaa29-\\uaa36\\uaa43\\uaa4c\\uaa4d\\uaa50-\\uaa59\\uaa7b-\\uaa7d\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uaaeb-\\uaaef\\uaaf5\\uaaf6\\uabe3-\\uabea\\uabec\\uabed\\uabf0-\\uabf9\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe2f\\ufe33\\ufe34\\ufe4d-\\ufe4f\\uff10-\\uff19\\uff3f\\uff65\";\n\nconst nonASCIIidentifierStart = new RegExp(\n \"[\" + nonASCIIidentifierStartChars + \"]\",\n);\nconst nonASCIIidentifier = new RegExp(\n \"[\" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + \"]\",\n);\n\nnonASCIIidentifierStartChars = nonASCIIidentifierChars = null;\n\n// These are a run-length and offset-encoded representation of the\n// >0xffff code points that are a valid part of identifiers. The\n// offset starts at 0x10000, and each pair of numbers represents an\n// offset to the next range, and then a size of the range. They were\n// generated by `scripts/generate-identifier-regex.cjs`.\n/* prettier-ignore */\nconst astralIdentifierStartCodes = [0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,14,29,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,13,10,2,14,2,6,2,1,2,10,2,14,2,6,2,1,4,51,13,310,10,21,11,7,25,5,2,41,2,8,70,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,7,25,39,55,7,1,65,0,16,3,2,2,2,28,43,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,14,35,39,27,10,22,251,41,7,1,17,5,57,28,11,0,9,21,43,17,47,20,28,22,13,52,58,1,3,0,14,44,33,24,27,35,30,0,3,0,9,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,20,1,64,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,31,9,2,0,3,0,2,37,2,0,26,0,2,0,45,52,19,3,21,2,31,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,14,0,72,26,38,6,186,43,117,63,32,7,3,0,3,7,2,1,2,23,16,0,2,0,95,7,3,38,17,0,2,0,29,0,11,39,8,0,22,0,12,45,20,0,19,72,200,32,32,8,2,36,18,0,50,29,113,6,2,1,2,37,22,0,26,5,2,1,2,31,15,0,24,43,261,18,16,0,2,12,2,33,125,0,80,921,103,110,18,195,2637,96,16,1071,18,5,26,3994,6,582,6842,29,1763,568,8,30,18,78,18,29,19,47,17,3,32,20,6,18,433,44,212,63,33,24,3,24,45,74,6,0,67,12,65,1,2,0,15,4,10,7381,42,31,98,114,8702,3,2,6,2,1,2,290,16,0,30,2,3,0,15,3,9,395,2309,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,1845,30,7,5,262,61,147,44,11,6,17,0,322,29,19,43,485,27,229,29,3,0,208,30,2,2,2,1,2,6,3,4,10,1,225,6,2,3,2,1,2,14,2,196,60,67,8,0,1205,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42719,33,4381,3,5773,3,7472,16,621,2467,541,1507,4938,6,8489];\n/* prettier-ignore */\nconst astralIdentifierCodes = [509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,574,3,9,9,7,9,32,4,318,1,78,5,71,10,50,3,123,2,54,14,32,10,3,1,11,3,46,10,8,0,46,9,7,2,37,13,2,9,6,1,45,0,13,2,49,13,9,3,2,11,83,11,7,0,3,0,158,11,6,9,7,3,56,1,2,6,3,1,3,2,10,0,11,1,3,6,4,4,68,8,2,0,3,0,2,3,2,4,2,0,15,1,83,17,10,9,5,0,82,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,7,19,58,14,5,9,243,14,166,9,71,5,2,1,3,3,2,0,2,1,13,9,120,6,3,6,4,0,29,9,41,6,2,3,9,0,10,10,47,15,199,7,137,9,54,7,2,7,17,9,57,21,2,13,123,5,4,0,2,1,2,6,2,0,9,9,49,4,2,1,2,4,9,9,55,9,266,3,10,1,2,0,49,6,4,4,14,10,5350,0,7,14,11465,27,2343,9,87,9,39,4,60,6,26,9,535,9,470,0,2,54,8,3,82,0,12,1,19628,1,4178,9,519,45,3,22,543,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,101,0,161,6,10,9,357,0,62,13,499,13,245,1,2,9,233,0,3,0,8,1,6,0,475,6,110,6,6,9,4759,9,787719,239];\n\n// This has a complexity linear to the value of the code. The\n// assumption is that looking up astral identifier characters is\n// rare.\nfunction isInAstralSet(code: number, set: readonly number[]): boolean {\n let pos = 0x10000;\n for (let i = 0, length = set.length; i < length; i += 2) {\n pos += set[i];\n if (pos > code) return false;\n\n pos += set[i + 1];\n if (pos >= code) return true;\n }\n return false;\n}\n\n// Test whether a given character code starts an identifier.\n\nexport function isIdentifierStart(code: number): boolean {\n if (code < charCodes.uppercaseA) return code === charCodes.dollarSign;\n if (code <= charCodes.uppercaseZ) return true;\n if (code < charCodes.lowercaseA) return code === charCodes.underscore;\n if (code <= charCodes.lowercaseZ) return true;\n if (code <= 0xffff) {\n return (\n code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code))\n );\n }\n return isInAstralSet(code, astralIdentifierStartCodes);\n}\n\n// Test whether a given character is part of an identifier.\n\nexport function isIdentifierChar(code: number): boolean {\n if (code < charCodes.digit0) return code === charCodes.dollarSign;\n if (code < charCodes.colon) return true;\n if (code < charCodes.uppercaseA) return false;\n if (code <= charCodes.uppercaseZ) return true;\n if (code < charCodes.lowercaseA) return code === charCodes.underscore;\n if (code <= charCodes.lowercaseZ) return true;\n if (code <= 0xffff) {\n return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code));\n }\n return (\n isInAstralSet(code, astralIdentifierStartCodes) ||\n isInAstralSet(code, astralIdentifierCodes)\n );\n}\n\n// Test whether a given string is a valid identifier name\n\nexport function isIdentifierName(name: string): boolean {\n let isFirst = true;\n for (let i = 0; i < name.length; i++) {\n // The implementation is based on\n // https://source.chromium.org/chromium/chromium/src/+/master:v8/src/builtins/builtins-string-gen.cc;l=1455;drc=221e331b49dfefadbc6fa40b0c68e6f97606d0b3;bpv=0;bpt=1\n // We reimplement `codePointAt` because `codePointAt` is a V8 builtin which is not inlined by TurboFan (as of M91)\n // since `name` is mostly ASCII, an inlined `charCodeAt` wins here\n let cp = name.charCodeAt(i);\n if ((cp & 0xfc00) === 0xd800 && i + 1 < name.length) {\n const trail = name.charCodeAt(++i);\n if ((trail & 0xfc00) === 0xdc00) {\n cp = 0x10000 + ((cp & 0x3ff) << 10) + (trail & 0x3ff);\n }\n }\n if (isFirst) {\n isFirst = false;\n if (!isIdentifierStart(cp)) {\n return false;\n }\n } else if (!isIdentifierChar(cp)) {\n return false;\n }\n }\n return !isFirst;\n}\n"],"mappings":";;;;;;;;AAaA,IAAIA,4BAA4B,GAAG,spIAAspI;AAEzrI,IAAIC,uBAAuB,GAAG,4lFAA4lF;AAE1nF,MAAMC,uBAAuB,GAAG,IAAIC,MAAM,CACxC,GAAG,GAAGH,4BAA4B,GAAG,GACvC,CAAC;AACD,MAAMI,kBAAkB,GAAG,IAAID,MAAM,CACnC,GAAG,GAAGH,4BAA4B,GAAGC,uBAAuB,GAAG,GACjE,CAAC;AAEDD,4BAA4B,GAAGC,uBAAuB,GAAG,IAAI;AAQ7D,MAAMI,0BAA0B,GAAG,CAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,IAAI,EAAC,EAAE,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,GAAG,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,IAAI,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,IAAI,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,IAAI,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,IAAI,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,IAAI,EAAC,KAAK,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,IAAI,EAAC,CAAC,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,CAAC,EAAC,IAAI,CAAC;AAEjnD,MAAMC,qBAAqB,GAAG,CAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,IAAI,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,KAAK,EAAC,CAAC,EAAC,IAAI,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAA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","ignoreList":[]} \ No newline at end of file diff --git a/node_modules/@babel/helper-validator-identifier/lib/index.js b/node_modules/@babel/helper-validator-identifier/lib/index.js new file mode 100644 index 00000000..76b22822 --- /dev/null +++ b/node_modules/@babel/helper-validator-identifier/lib/index.js @@ -0,0 +1,57 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "isIdentifierChar", { + enumerable: true, + get: function () { + return _identifier.isIdentifierChar; + } +}); +Object.defineProperty(exports, "isIdentifierName", { + enumerable: true, + get: function () { + return _identifier.isIdentifierName; + } +}); +Object.defineProperty(exports, "isIdentifierStart", { + enumerable: true, + get: function () { + return _identifier.isIdentifierStart; + } +}); +Object.defineProperty(exports, "isKeyword", { + enumerable: true, + get: function () { + return _keyword.isKeyword; + } +}); +Object.defineProperty(exports, "isReservedWord", { + enumerable: true, + get: function () { + return _keyword.isReservedWord; + } +}); +Object.defineProperty(exports, "isStrictBindOnlyReservedWord", { + enumerable: true, + get: function () { + return _keyword.isStrictBindOnlyReservedWord; + } +}); +Object.defineProperty(exports, "isStrictBindReservedWord", { + enumerable: true, + get: function () { + return _keyword.isStrictBindReservedWord; + } +}); +Object.defineProperty(exports, "isStrictReservedWord", { + enumerable: true, + get: function () { + return _keyword.isStrictReservedWord; + } +}); +var _identifier = require("./identifier.js"); +var _keyword = require("./keyword.js"); + +//# sourceMappingURL=index.js.map diff --git a/node_modules/@babel/helper-validator-identifier/lib/index.js.map b/node_modules/@babel/helper-validator-identifier/lib/index.js.map new file mode 100644 index 00000000..d985f3b9 --- /dev/null +++ b/node_modules/@babel/helper-validator-identifier/lib/index.js.map @@ -0,0 +1 @@ +{"version":3,"names":["_identifier","require","_keyword"],"sources":["../src/index.ts"],"sourcesContent":["export {\n isIdentifierName,\n isIdentifierChar,\n isIdentifierStart,\n} from \"./identifier.ts\";\nexport {\n isReservedWord,\n isStrictBindOnlyReservedWord,\n isStrictBindReservedWord,\n isStrictReservedWord,\n isKeyword,\n} from \"./keyword.ts\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,WAAA,GAAAC,OAAA;AAKA,IAAAC,QAAA,GAAAD,OAAA","ignoreList":[]} \ No newline at end of file diff --git a/node_modules/@babel/helper-validator-identifier/lib/keyword.js b/node_modules/@babel/helper-validator-identifier/lib/keyword.js new file mode 100644 index 00000000..054cf847 --- /dev/null +++ b/node_modules/@babel/helper-validator-identifier/lib/keyword.js @@ -0,0 +1,35 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.isKeyword = isKeyword; +exports.isReservedWord = isReservedWord; +exports.isStrictBindOnlyReservedWord = isStrictBindOnlyReservedWord; +exports.isStrictBindReservedWord = isStrictBindReservedWord; +exports.isStrictReservedWord = isStrictReservedWord; +const reservedWords = { + keyword: ["break", "case", "catch", "continue", "debugger", "default", "do", "else", "finally", "for", "function", "if", "return", "switch", "throw", "try", "var", "const", "while", "with", "new", "this", "super", "class", "extends", "export", "import", "null", "true", "false", "in", "instanceof", "typeof", "void", "delete"], + strict: ["implements", "interface", "let", "package", "private", "protected", "public", "static", "yield"], + strictBind: ["eval", "arguments"] +}; +const keywords = new Set(reservedWords.keyword); +const reservedWordsStrictSet = new Set(reservedWords.strict); +const reservedWordsStrictBindSet = new Set(reservedWords.strictBind); +function isReservedWord(word, inModule) { + return inModule && word === "await" || word === "enum"; +} +function isStrictReservedWord(word, inModule) { + return isReservedWord(word, inModule) || reservedWordsStrictSet.has(word); +} +function isStrictBindOnlyReservedWord(word) { + return reservedWordsStrictBindSet.has(word); +} +function isStrictBindReservedWord(word, inModule) { + return isStrictReservedWord(word, inModule) || isStrictBindOnlyReservedWord(word); +} +function isKeyword(word) { + return keywords.has(word); +} + +//# sourceMappingURL=keyword.js.map diff --git a/node_modules/@babel/helper-validator-identifier/lib/keyword.js.map b/node_modules/@babel/helper-validator-identifier/lib/keyword.js.map new file mode 100644 index 00000000..3471f78c --- /dev/null +++ b/node_modules/@babel/helper-validator-identifier/lib/keyword.js.map @@ -0,0 +1 @@ +{"version":3,"names":["reservedWords","keyword","strict","strictBind","keywords","Set","reservedWordsStrictSet","reservedWordsStrictBindSet","isReservedWord","word","inModule","isStrictReservedWord","has","isStrictBindOnlyReservedWord","isStrictBindReservedWord","isKeyword"],"sources":["../src/keyword.ts"],"sourcesContent":["const reservedWords = {\n keyword: [\n \"break\",\n \"case\",\n \"catch\",\n \"continue\",\n \"debugger\",\n \"default\",\n \"do\",\n \"else\",\n \"finally\",\n \"for\",\n \"function\",\n \"if\",\n \"return\",\n \"switch\",\n \"throw\",\n \"try\",\n \"var\",\n \"const\",\n \"while\",\n \"with\",\n \"new\",\n \"this\",\n \"super\",\n \"class\",\n \"extends\",\n \"export\",\n \"import\",\n \"null\",\n \"true\",\n \"false\",\n \"in\",\n \"instanceof\",\n \"typeof\",\n \"void\",\n \"delete\",\n ],\n strict: [\n \"implements\",\n \"interface\",\n \"let\",\n \"package\",\n \"private\",\n \"protected\",\n \"public\",\n \"static\",\n \"yield\",\n ],\n strictBind: [\"eval\", \"arguments\"],\n};\nconst keywords = new Set(reservedWords.keyword);\nconst reservedWordsStrictSet = new Set(reservedWords.strict);\nconst reservedWordsStrictBindSet = new Set(reservedWords.strictBind);\n\n/**\n * Checks if word is a reserved word in non-strict mode\n */\nexport function isReservedWord(word: string, inModule: boolean): boolean {\n return (inModule && word === \"await\") || word === \"enum\";\n}\n\n/**\n * Checks if word is a reserved word in non-binding strict mode\n *\n * Includes non-strict reserved words\n */\nexport function isStrictReservedWord(word: string, inModule: boolean): boolean {\n return isReservedWord(word, inModule) || reservedWordsStrictSet.has(word);\n}\n\n/**\n * Checks if word is a reserved word in binding strict mode, but it is allowed as\n * a normal identifier.\n */\nexport function isStrictBindOnlyReservedWord(word: string): boolean {\n return reservedWordsStrictBindSet.has(word);\n}\n\n/**\n * Checks if word is a reserved word in binding strict mode\n *\n * Includes non-strict reserved words and non-binding strict reserved words\n */\nexport function isStrictBindReservedWord(\n word: string,\n inModule: boolean,\n): boolean {\n return (\n isStrictReservedWord(word, inModule) || isStrictBindOnlyReservedWord(word)\n );\n}\n\nexport function isKeyword(word: string): boolean {\n return keywords.has(word);\n}\n"],"mappings":";;;;;;;;;;AAAA,MAAMA,aAAa,GAAG;EACpBC,OAAO,EAAE,CACP,OAAO,EACP,MAAM,EACN,OAAO,EACP,UAAU,EACV,UAAU,EACV,SAAS,EACT,IAAI,EACJ,MAAM,EACN,SAAS,EACT,KAAK,EACL,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,KAAK,EACL,KAAK,EACL,OAAO,EACP,OAAO,EACP,MAAM,EACN,KAAK,EACL,MAAM,EACN,OAAO,EACP,OAAO,EACP,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,MAAM,EACN,OAAO,EACP,IAAI,EACJ,YAAY,EACZ,QAAQ,EACR,MAAM,EACN,QAAQ,CACT;EACDC,MAAM,EAAE,CACN,YAAY,EACZ,WAAW,EACX,KAAK,EACL,SAAS,EACT,SAAS,EACT,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,OAAO,CACR;EACDC,UAAU,EAAE,CAAC,MAAM,EAAE,WAAW;AAClC,CAAC;AACD,MAAMC,QAAQ,GAAG,IAAIC,GAAG,CAACL,aAAa,CAACC,OAAO,CAAC;AAC/C,MAAMK,sBAAsB,GAAG,IAAID,GAAG,CAACL,aAAa,CAACE,MAAM,CAAC;AAC5D,MAAMK,0BAA0B,GAAG,IAAIF,GAAG,CAACL,aAAa,CAACG,UAAU,CAAC;AAK7D,SAASK,cAAcA,CAACC,IAAY,EAAEC,QAAiB,EAAW;EACvE,OAAQA,QAAQ,IAAID,IAAI,KAAK,OAAO,IAAKA,IAAI,KAAK,MAAM;AAC1D;AAOO,SAASE,oBAAoBA,CAACF,IAAY,EAAEC,QAAiB,EAAW;EAC7E,OAAOF,cAAc,CAACC,IAAI,EAAEC,QAAQ,CAAC,IAAIJ,sBAAsB,CAACM,GAAG,CAACH,IAAI,CAAC;AAC3E;AAMO,SAASI,4BAA4BA,CAACJ,IAAY,EAAW;EAClE,OAAOF,0BAA0B,CAACK,GAAG,CAACH,IAAI,CAAC;AAC7C;AAOO,SAASK,wBAAwBA,CACtCL,IAAY,EACZC,QAAiB,EACR;EACT,OACEC,oBAAoB,CAACF,IAAI,EAAEC,QAAQ,CAAC,IAAIG,4BAA4B,CAACJ,IAAI,CAAC;AAE9E;AAEO,SAASM,SAASA,CAACN,IAAY,EAAW;EAC/C,OAAOL,QAAQ,CAACQ,GAAG,CAACH,IAAI,CAAC;AAC3B","ignoreList":[]} \ No newline at end of file diff --git a/node_modules/@babel/helper-validator-identifier/package.json b/node_modules/@babel/helper-validator-identifier/package.json new file mode 100644 index 00000000..9904752a --- /dev/null +++ b/node_modules/@babel/helper-validator-identifier/package.json @@ -0,0 +1,31 @@ +{ + "name": "@babel/helper-validator-identifier", + "version": "7.29.7", + "description": "Validate identifier/keywords name", + "repository": { + "type": "git", + "url": "https://github.com/babel/babel.git", + "directory": "packages/babel-helper-validator-identifier" + }, + "license": "MIT", + "publishConfig": { + "access": "public" + }, + "main": "./lib/index.js", + "exports": { + ".": { + "types": "./lib/index.d.ts", + "default": "./lib/index.js" + }, + "./package.json": "./package.json" + }, + "devDependencies": { + "@unicode/unicode-17.0.0": "^1.6.10", + "charcodes": "^0.2.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "author": "The Babel Team (https://babel.dev/team)", + "type": "commonjs" +} \ No newline at end of file diff --git a/node_modules/@colors/colors/LICENSE b/node_modules/@colors/colors/LICENSE new file mode 100644 index 00000000..6b860561 --- /dev/null +++ b/node_modules/@colors/colors/LICENSE @@ -0,0 +1,26 @@ +MIT License + +Original Library + - Copyright (c) Marak Squires + +Additional Functionality + - Copyright (c) Sindre Sorhus (sindresorhus.com) + - Copyright (c) DABH (https://github.com/DABH) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/@colors/colors/README.md b/node_modules/@colors/colors/README.md new file mode 100644 index 00000000..e2479ce5 --- /dev/null +++ b/node_modules/@colors/colors/README.md @@ -0,0 +1,219 @@ +# @colors/colors ("colors.js") +[![Build Status](https://github.com/DABH/colors.js/actions/workflows/ci.yml/badge.svg)](https://github.com/DABH/colors.js/actions/workflows/ci.yml) +[![version](https://img.shields.io/npm/v/@colors/colors.svg)](https://www.npmjs.org/package/@colors/colors) + +Please check out the [roadmap](ROADMAP.md) for upcoming features and releases. Please open Issues to provide feedback. + +## get color and style in your node.js console + +![Demo](https://raw.githubusercontent.com/DABH/colors.js/master/screenshots/colors.png) + +## Installation + + npm install @colors/colors + +## colors and styles! + +### text colors + + - black + - red + - green + - yellow + - blue + - magenta + - cyan + - white + - gray + - grey + +### bright text colors + + - brightRed + - brightGreen + - brightYellow + - brightBlue + - brightMagenta + - brightCyan + - brightWhite + +### background colors + + - bgBlack + - bgRed + - bgGreen + - bgYellow + - bgBlue + - bgMagenta + - bgCyan + - bgWhite + - bgGray + - bgGrey + +### bright background colors + + - bgBrightRed + - bgBrightGreen + - bgBrightYellow + - bgBrightBlue + - bgBrightMagenta + - bgBrightCyan + - bgBrightWhite + +### styles + + - reset + - bold + - dim + - italic + - underline + - inverse + - hidden + - strikethrough + +### extras + + - rainbow + - zebra + - america + - trap + - random + + +## Usage + +By popular demand, `@colors/colors` now ships with two types of usages! + +The super nifty way + +```js +var colors = require('@colors/colors'); + +console.log('hello'.green); // outputs green text +console.log('i like cake and pies'.underline.red); // outputs red underlined text +console.log('inverse the color'.inverse); // inverses the color +console.log('OMG Rainbows!'.rainbow); // rainbow +console.log('Run the trap'.trap); // Drops the bass + +``` + +or a slightly less nifty way which doesn't extend `String.prototype` + +```js +var colors = require('@colors/colors/safe'); + +console.log(colors.green('hello')); // outputs green text +console.log(colors.red.underline('i like cake and pies')); // outputs red underlined text +console.log(colors.inverse('inverse the color')); // inverses the color +console.log(colors.rainbow('OMG Rainbows!')); // rainbow +console.log(colors.trap('Run the trap')); // Drops the bass + +``` + +I prefer the first way. Some people seem to be afraid of extending `String.prototype` and prefer the second way. + +If you are writing good code you will never have an issue with the first approach. If you really don't want to touch `String.prototype`, the second usage will not touch `String` native object. + +## Enabling/Disabling Colors + +The package will auto-detect whether your terminal can use colors and enable/disable accordingly. When colors are disabled, the color functions do nothing. You can override this with a command-line flag: + +```bash +node myapp.js --no-color +node myapp.js --color=false + +node myapp.js --color +node myapp.js --color=true +node myapp.js --color=always + +FORCE_COLOR=1 node myapp.js +``` + +Or in code: + +```javascript +var colors = require('@colors/colors'); +colors.enable(); +colors.disable(); +``` + +## Console.log [string substitution](http://nodejs.org/docs/latest/api/console.html#console_console_log_data) + +```js +var name = 'Beowulf'; +console.log(colors.green('Hello %s'), name); +// outputs -> 'Hello Beowulf' +``` + +## Custom themes + +### Using standard API + +```js + +var colors = require('@colors/colors'); + +colors.setTheme({ + silly: 'rainbow', + input: 'grey', + verbose: 'cyan', + prompt: 'grey', + info: 'green', + data: 'grey', + help: 'cyan', + warn: 'yellow', + debug: 'blue', + error: 'red' +}); + +// outputs red text +console.log("this is an error".error); + +// outputs yellow text +console.log("this is a warning".warn); +``` + +### Using string safe API + +```js +var colors = require('@colors/colors/safe'); + +// set single property +var error = colors.red; +error('this is red'); + +// set theme +colors.setTheme({ + silly: 'rainbow', + input: 'grey', + verbose: 'cyan', + prompt: 'grey', + info: 'green', + data: 'grey', + help: 'cyan', + warn: 'yellow', + debug: 'blue', + error: 'red' +}); + +// outputs red text +console.log(colors.error("this is an error")); + +// outputs yellow text +console.log(colors.warn("this is a warning")); + +``` + +### Combining Colors + +```javascript +var colors = require('@colors/colors'); + +colors.setTheme({ + custom: ['red', 'underline'] +}); + +console.log('test'.custom); +``` + +*Protip: There is a secret undocumented style in `colors`. If you find the style you can summon him.* diff --git a/node_modules/@colors/colors/examples/normal-usage.js b/node_modules/@colors/colors/examples/normal-usage.js new file mode 100644 index 00000000..a4bfe7b7 --- /dev/null +++ b/node_modules/@colors/colors/examples/normal-usage.js @@ -0,0 +1,83 @@ +var colors = require('../lib/index'); + +console.log('First some yellow text'.yellow); + +console.log('Underline that text'.yellow.underline); + +console.log('Make it bold and red'.red.bold); + +console.log(('Double Raindows All Day Long').rainbow); + +console.log('Drop the bass'.trap); + +console.log('DROP THE RAINBOW BASS'.trap.rainbow); + +// styles not widely supported +console.log('Chains are also cool.'.bold.italic.underline.red); + +// styles not widely supported +console.log('So '.green + 'are'.underline + ' ' + 'inverse'.inverse + + ' styles! '.yellow.bold); +console.log('Zebras are so fun!'.zebra); + +// +// Remark: .strikethrough may not work with Mac OS Terminal App +// +console.log('This is ' + 'not'.strikethrough + ' fun.'); + +console.log('Background color attack!'.black.bgWhite); +console.log('Use random styles on everything!'.random); +console.log('America, Heck Yeah!'.america); + +// eslint-disable-next-line max-len +console.log('Blindingly '.brightCyan + 'bright? '.brightRed + 'Why '.brightYellow + 'not?!'.brightGreen); + +console.log('Setting themes is useful'); + +// +// Custom themes +// +console.log('Generic logging theme as JSON'.green.bold.underline); +// Load theme with JSON literal +colors.setTheme({ + silly: 'rainbow', + input: 'grey', + verbose: 'cyan', + prompt: 'grey', + info: 'green', + data: 'grey', + help: 'cyan', + warn: 'yellow', + debug: 'blue', + error: 'red', +}); + +// outputs red text +console.log('this is an error'.error); + +// outputs yellow text +console.log('this is a warning'.warn); + +// outputs grey text +console.log('this is an input'.input); + +console.log('Generic logging theme as file'.green.bold.underline); + +// Load a theme from file +try { + colors.setTheme(require(__dirname + '/../themes/generic-logging.js')); +} catch (err) { + console.log(err); +} + +// outputs red text +console.log('this is an error'.error); + +// outputs yellow text +console.log('this is a warning'.warn); + +// outputs grey text +console.log('this is an input'.input); + +// console.log("Don't summon".zalgo) + diff --git a/node_modules/@colors/colors/examples/safe-string.js b/node_modules/@colors/colors/examples/safe-string.js new file mode 100644 index 00000000..fc664745 --- /dev/null +++ b/node_modules/@colors/colors/examples/safe-string.js @@ -0,0 +1,80 @@ +var colors = require('../safe'); + +console.log(colors.yellow('First some yellow text')); + +console.log(colors.yellow.underline('Underline that text')); + +console.log(colors.red.bold('Make it bold and red')); + +console.log(colors.rainbow('Double Raindows All Day Long')); + +console.log(colors.trap('Drop the bass')); + +console.log(colors.rainbow(colors.trap('DROP THE RAINBOW BASS'))); + +// styles not widely supported +console.log(colors.bold.italic.underline.red('Chains are also cool.')); + +// styles not widely supported +console.log(colors.green('So ') + colors.underline('are') + ' ' + + colors.inverse('inverse') + colors.yellow.bold(' styles! ')); + +console.log(colors.zebra('Zebras are so fun!')); + +console.log('This is ' + colors.strikethrough('not') + ' fun.'); + + +console.log(colors.black.bgWhite('Background color attack!')); +console.log(colors.random('Use random styles on everything!')); +console.log(colors.america('America, Heck Yeah!')); + +// eslint-disable-next-line max-len +console.log(colors.brightCyan('Blindingly ') + colors.brightRed('bright? ') + colors.brightYellow('Why ') + colors.brightGreen('not?!')); + +console.log('Setting themes is useful'); + +// +// Custom themes +// +// console.log('Generic logging theme as JSON'.green.bold.underline); +// Load theme with JSON literal +colors.setTheme({ + silly: 'rainbow', + input: 'blue', + verbose: 'cyan', + prompt: 'grey', + info: 'green', + data: 'grey', + help: 'cyan', + warn: 'yellow', + debug: 'blue', + error: 'red', +}); + +// outputs red text +console.log(colors.error('this is an error')); + +// outputs yellow text +console.log(colors.warn('this is a warning')); + +// outputs blue text +console.log(colors.input('this is an input')); + + +// console.log('Generic logging theme as file'.green.bold.underline); + +// Load a theme from file +colors.setTheme(require(__dirname + '/../themes/generic-logging.js')); + +// outputs red text +console.log(colors.error('this is an error')); + +// outputs yellow text +console.log(colors.warn('this is a warning')); + +// outputs grey text +console.log(colors.input('this is an input')); + +// console.log(colors.zalgo("Don't summon him")) + + diff --git a/node_modules/@colors/colors/index.d.ts b/node_modules/@colors/colors/index.d.ts new file mode 100644 index 00000000..df3f2e6a --- /dev/null +++ b/node_modules/@colors/colors/index.d.ts @@ -0,0 +1,136 @@ +// Type definitions for @colors/colors 1.4+ +// Project: https://github.com/Marak/colors.js +// Definitions by: Bart van der Schoor , Staffan Eketorp +// Definitions: https://github.com/DABH/colors.js + +export interface Color { + (text: string): string; + + strip: Color; + stripColors: Color; + + black: Color; + red: Color; + green: Color; + yellow: Color; + blue: Color; + magenta: Color; + cyan: Color; + white: Color; + gray: Color; + grey: Color; + + bgBlack: Color; + bgRed: Color; + bgGreen: Color; + bgYellow: Color; + bgBlue: Color; + bgMagenta: Color; + bgCyan: Color; + bgWhite: Color; + + reset: Color; + bold: Color; + dim: Color; + italic: Color; + underline: Color; + inverse: Color; + hidden: Color; + strikethrough: Color; + + rainbow: Color; + zebra: Color; + america: Color; + trap: Color; + random: Color; + zalgo: Color; +} + +export function enable(): void; +export function disable(): void; +export function setTheme(theme: any): void; + +export let enabled: boolean; + +export const strip: Color; +export const stripColors: Color; + +export const black: Color; +export const red: Color; +export const green: Color; +export const yellow: Color; +export const blue: Color; +export const magenta: Color; +export const cyan: Color; +export const white: Color; +export const gray: Color; +export const grey: Color; + +export const bgBlack: Color; +export const bgRed: Color; +export const bgGreen: Color; +export const bgYellow: Color; +export const bgBlue: Color; +export const bgMagenta: Color; +export const bgCyan: Color; +export const bgWhite: Color; + +export const reset: Color; +export const bold: Color; +export const dim: Color; +export const italic: Color; +export const underline: Color; +export const inverse: Color; +export const hidden: Color; +export const strikethrough: Color; + +export const rainbow: Color; +export const zebra: Color; +export const america: Color; +export const trap: Color; +export const random: Color; +export const zalgo: Color; + +declare global { + interface String { + strip: string; + stripColors: string; + + black: string; + red: string; + green: string; + yellow: string; + blue: string; + magenta: string; + cyan: string; + white: string; + gray: string; + grey: string; + + bgBlack: string; + bgRed: string; + bgGreen: string; + bgYellow: string; + bgBlue: string; + bgMagenta: string; + bgCyan: string; + bgWhite: string; + + reset: string; + // @ts-ignore + bold: string; + dim: string; + italic: string; + underline: string; + inverse: string; + hidden: string; + strikethrough: string; + + rainbow: string; + zebra: string; + america: string; + trap: string; + random: string; + zalgo: string; + } +} diff --git a/node_modules/@colors/colors/lib/colors.js b/node_modules/@colors/colors/lib/colors.js new file mode 100644 index 00000000..d9fb0876 --- /dev/null +++ b/node_modules/@colors/colors/lib/colors.js @@ -0,0 +1,211 @@ +/* + +The MIT License (MIT) + +Original Library + - Copyright (c) Marak Squires + +Additional functionality + - Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +var colors = {}; +module['exports'] = colors; + +colors.themes = {}; + +var util = require('util'); +var ansiStyles = colors.styles = require('./styles'); +var defineProps = Object.defineProperties; +var newLineRegex = new RegExp(/[\r\n]+/g); + +colors.supportsColor = require('./system/supports-colors').supportsColor; + +if (typeof colors.enabled === 'undefined') { + colors.enabled = colors.supportsColor() !== false; +} + +colors.enable = function() { + colors.enabled = true; +}; + +colors.disable = function() { + colors.enabled = false; +}; + +colors.stripColors = colors.strip = function(str) { + return ('' + str).replace(/\x1B\[\d+m/g, ''); +}; + +// eslint-disable-next-line no-unused-vars +var stylize = colors.stylize = function stylize(str, style) { + if (!colors.enabled) { + return str+''; + } + + var styleMap = ansiStyles[style]; + + // Stylize should work for non-ANSI styles, too + if (!styleMap && style in colors) { + // Style maps like trap operate as functions on strings; + // they don't have properties like open or close. + return colors[style](str); + } + + return styleMap.open + str + styleMap.close; +}; + +var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; +var escapeStringRegexp = function(str) { + if (typeof str !== 'string') { + throw new TypeError('Expected a string'); + } + return str.replace(matchOperatorsRe, '\\$&'); +}; + +function build(_styles) { + var builder = function builder() { + return applyStyle.apply(builder, arguments); + }; + builder._styles = _styles; + // __proto__ is used because we must return a function, but there is + // no way to create a function with a different prototype. + builder.__proto__ = proto; + return builder; +} + +var styles = (function() { + var ret = {}; + ansiStyles.grey = ansiStyles.gray; + Object.keys(ansiStyles).forEach(function(key) { + ansiStyles[key].closeRe = + new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); + ret[key] = { + get: function() { + return build(this._styles.concat(key)); + }, + }; + }); + return ret; +})(); + +var proto = defineProps(function colors() {}, styles); + +function applyStyle() { + var args = Array.prototype.slice.call(arguments); + + var str = args.map(function(arg) { + // Use weak equality check so we can colorize null/undefined in safe mode + if (arg != null && arg.constructor === String) { + return arg; + } else { + return util.inspect(arg); + } + }).join(' '); + + if (!colors.enabled || !str) { + return str; + } + + var newLinesPresent = str.indexOf('\n') != -1; + + var nestedStyles = this._styles; + + var i = nestedStyles.length; + while (i--) { + var code = ansiStyles[nestedStyles[i]]; + str = code.open + str.replace(code.closeRe, code.open) + code.close; + if (newLinesPresent) { + str = str.replace(newLineRegex, function(match) { + return code.close + match + code.open; + }); + } + } + + return str; +} + +colors.setTheme = function(theme) { + if (typeof theme === 'string') { + console.log('colors.setTheme now only accepts an object, not a string. ' + + 'If you are trying to set a theme from a file, it is now your (the ' + + 'caller\'s) responsibility to require the file. The old syntax ' + + 'looked like colors.setTheme(__dirname + ' + + '\'/../themes/generic-logging.js\'); The new syntax looks like '+ + 'colors.setTheme(require(__dirname + ' + + '\'/../themes/generic-logging.js\'));'); + return; + } + for (var style in theme) { + (function(style) { + colors[style] = function(str) { + if (typeof theme[style] === 'object') { + var out = str; + for (var i in theme[style]) { + out = colors[theme[style][i]](out); + } + return out; + } + return colors[theme[style]](str); + }; + })(style); + } +}; + +function init() { + var ret = {}; + Object.keys(styles).forEach(function(name) { + ret[name] = { + get: function() { + return build([name]); + }, + }; + }); + return ret; +} + +var sequencer = function sequencer(map, str) { + var exploded = str.split(''); + exploded = exploded.map(map); + return exploded.join(''); +}; + +// custom formatter methods +colors.trap = require('./custom/trap'); +colors.zalgo = require('./custom/zalgo'); + +// maps +colors.maps = {}; +colors.maps.america = require('./maps/america')(colors); +colors.maps.zebra = require('./maps/zebra')(colors); +colors.maps.rainbow = require('./maps/rainbow')(colors); +colors.maps.random = require('./maps/random')(colors); + +for (var map in colors.maps) { + (function(map) { + colors[map] = function(str) { + return sequencer(colors.maps[map], str); + }; + })(map); +} + +defineProps(colors, init()); diff --git a/node_modules/@colors/colors/lib/custom/trap.js b/node_modules/@colors/colors/lib/custom/trap.js new file mode 100644 index 00000000..fbccf88d --- /dev/null +++ b/node_modules/@colors/colors/lib/custom/trap.js @@ -0,0 +1,46 @@ +module['exports'] = function runTheTrap(text, options) { + var result = ''; + text = text || 'Run the trap, drop the bass'; + text = text.split(''); + var trap = { + a: ['\u0040', '\u0104', '\u023a', '\u0245', '\u0394', '\u039b', '\u0414'], + b: ['\u00df', '\u0181', '\u0243', '\u026e', '\u03b2', '\u0e3f'], + c: ['\u00a9', '\u023b', '\u03fe'], + d: ['\u00d0', '\u018a', '\u0500', '\u0501', '\u0502', '\u0503'], + e: ['\u00cb', '\u0115', '\u018e', '\u0258', '\u03a3', '\u03be', '\u04bc', + '\u0a6c'], + f: ['\u04fa'], + g: ['\u0262'], + h: ['\u0126', '\u0195', '\u04a2', '\u04ba', '\u04c7', '\u050a'], + i: ['\u0f0f'], + j: ['\u0134'], + k: ['\u0138', '\u04a0', '\u04c3', '\u051e'], + l: ['\u0139'], + m: ['\u028d', '\u04cd', '\u04ce', '\u0520', '\u0521', '\u0d69'], + n: ['\u00d1', '\u014b', '\u019d', '\u0376', '\u03a0', '\u048a'], + o: ['\u00d8', '\u00f5', '\u00f8', '\u01fe', '\u0298', '\u047a', '\u05dd', + '\u06dd', '\u0e4f'], + p: ['\u01f7', '\u048e'], + q: ['\u09cd'], + r: ['\u00ae', '\u01a6', '\u0210', '\u024c', '\u0280', '\u042f'], + s: ['\u00a7', '\u03de', '\u03df', '\u03e8'], + t: ['\u0141', '\u0166', '\u0373'], + u: ['\u01b1', '\u054d'], + v: ['\u05d8'], + w: ['\u0428', '\u0460', '\u047c', '\u0d70'], + x: ['\u04b2', '\u04fe', '\u04fc', '\u04fd'], + y: ['\u00a5', '\u04b0', '\u04cb'], + z: ['\u01b5', '\u0240'], + }; + text.forEach(function(c) { + c = c.toLowerCase(); + var chars = trap[c] || [' ']; + var rand = Math.floor(Math.random() * chars.length); + if (typeof trap[c] !== 'undefined') { + result += trap[c][rand]; + } else { + result += c; + } + }); + return result; +}; diff --git a/node_modules/@colors/colors/lib/custom/zalgo.js b/node_modules/@colors/colors/lib/custom/zalgo.js new file mode 100644 index 00000000..0ef2b011 --- /dev/null +++ b/node_modules/@colors/colors/lib/custom/zalgo.js @@ -0,0 +1,110 @@ +// please no +module['exports'] = function zalgo(text, options) { + text = text || ' he is here '; + var soul = { + 'up': [ + '̍', '̎', '̄', '̅', + '̿', '̑', '̆', '̐', + '͒', '͗', '͑', '̇', + '̈', '̊', '͂', '̓', + '̈', '͊', '͋', '͌', + '̃', '̂', '̌', '͐', + '̀', '́', '̋', '̏', + '̒', '̓', '̔', '̽', + '̉', 'ͣ', 'ͤ', 'ͥ', + 'ͦ', 'ͧ', 'ͨ', 'ͩ', + 'ͪ', 'ͫ', 'ͬ', 'ͭ', + 'ͮ', 'ͯ', '̾', '͛', + '͆', '̚', + ], + 'down': [ + '̖', '̗', '̘', '̙', + '̜', '̝', '̞', '̟', + '̠', '̤', '̥', '̦', + '̩', '̪', '̫', '̬', + '̭', '̮', '̯', '̰', + '̱', '̲', '̳', '̹', + '̺', '̻', '̼', 'ͅ', + '͇', '͈', '͉', '͍', + '͎', '͓', '͔', '͕', + '͖', '͙', '͚', '̣', + ], + 'mid': [ + '̕', '̛', '̀', '́', + '͘', '̡', '̢', '̧', + '̨', '̴', '̵', '̶', + '͜', '͝', '͞', + '͟', '͠', '͢', '̸', + '̷', '͡', ' ҉', + ], + }; + var all = [].concat(soul.up, soul.down, soul.mid); + + function randomNumber(range) { + var r = Math.floor(Math.random() * range); + return r; + } + + function isChar(character) { + var bool = false; + all.filter(function(i) { + bool = (i === character); + }); + return bool; + } + + + function heComes(text, options) { + var result = ''; + var counts; + var l; + options = options || {}; + options['up'] = + typeof options['up'] !== 'undefined' ? options['up'] : true; + options['mid'] = + typeof options['mid'] !== 'undefined' ? options['mid'] : true; + options['down'] = + typeof options['down'] !== 'undefined' ? options['down'] : true; + options['size'] = + typeof options['size'] !== 'undefined' ? options['size'] : 'maxi'; + text = text.split(''); + for (l in text) { + if (isChar(l)) { + continue; + } + result = result + text[l]; + counts = {'up': 0, 'down': 0, 'mid': 0}; + switch (options.size) { + case 'mini': + counts.up = randomNumber(8); + counts.mid = randomNumber(2); + counts.down = randomNumber(8); + break; + case 'maxi': + counts.up = randomNumber(16) + 3; + counts.mid = randomNumber(4) + 1; + counts.down = randomNumber(64) + 3; + break; + default: + counts.up = randomNumber(8) + 1; + counts.mid = randomNumber(6) / 2; + counts.down = randomNumber(8) + 1; + break; + } + + var arr = ['up', 'mid', 'down']; + for (var d in arr) { + var index = arr[d]; + for (var i = 0; i <= counts[index]; i++) { + if (options[index]) { + result = result + soul[index][randomNumber(soul[index].length)]; + } + } + } + } + return result; + } + // don't summon him + return heComes(text, options); +}; + diff --git a/node_modules/@colors/colors/lib/extendStringPrototype.js b/node_modules/@colors/colors/lib/extendStringPrototype.js new file mode 100644 index 00000000..46fd386a --- /dev/null +++ b/node_modules/@colors/colors/lib/extendStringPrototype.js @@ -0,0 +1,110 @@ +var colors = require('./colors'); + +module['exports'] = function() { + // + // Extends prototype of native string object to allow for "foo".red syntax + // + var addProperty = function(color, func) { + String.prototype.__defineGetter__(color, func); + }; + + addProperty('strip', function() { + return colors.strip(this); + }); + + addProperty('stripColors', function() { + return colors.strip(this); + }); + + addProperty('trap', function() { + return colors.trap(this); + }); + + addProperty('zalgo', function() { + return colors.zalgo(this); + }); + + addProperty('zebra', function() { + return colors.zebra(this); + }); + + addProperty('rainbow', function() { + return colors.rainbow(this); + }); + + addProperty('random', function() { + return colors.random(this); + }); + + addProperty('america', function() { + return colors.america(this); + }); + + // + // Iterate through all default styles and colors + // + var x = Object.keys(colors.styles); + x.forEach(function(style) { + addProperty(style, function() { + return colors.stylize(this, style); + }); + }); + + function applyTheme(theme) { + // + // Remark: This is a list of methods that exist + // on String that you should not overwrite. + // + var stringPrototypeBlacklist = [ + '__defineGetter__', '__defineSetter__', '__lookupGetter__', + '__lookupSetter__', 'charAt', 'constructor', 'hasOwnProperty', + 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', + 'valueOf', 'charCodeAt', 'indexOf', 'lastIndexOf', 'length', + 'localeCompare', 'match', 'repeat', 'replace', 'search', 'slice', + 'split', 'substring', 'toLocaleLowerCase', 'toLocaleUpperCase', + 'toLowerCase', 'toUpperCase', 'trim', 'trimLeft', 'trimRight', + ]; + + Object.keys(theme).forEach(function(prop) { + if (stringPrototypeBlacklist.indexOf(prop) !== -1) { + console.log('warn: '.red + ('String.prototype' + prop).magenta + + ' is probably something you don\'t want to override. ' + + 'Ignoring style name'); + } else { + if (typeof(theme[prop]) === 'string') { + colors[prop] = colors[theme[prop]]; + addProperty(prop, function() { + return colors[prop](this); + }); + } else { + var themePropApplicator = function(str) { + var ret = str || this; + for (var t = 0; t < theme[prop].length; t++) { + ret = colors[theme[prop][t]](ret); + } + return ret; + }; + addProperty(prop, themePropApplicator); + colors[prop] = function(str) { + return themePropApplicator(str); + }; + } + } + }); + } + + colors.setTheme = function(theme) { + if (typeof theme === 'string') { + console.log('colors.setTheme now only accepts an object, not a string. ' + + 'If you are trying to set a theme from a file, it is now your (the ' + + 'caller\'s) responsibility to require the file. The old syntax ' + + 'looked like colors.setTheme(__dirname + ' + + '\'/../themes/generic-logging.js\'); The new syntax looks like '+ + 'colors.setTheme(require(__dirname + ' + + '\'/../themes/generic-logging.js\'));'); + return; + } else { + applyTheme(theme); + } + }; +}; diff --git a/node_modules/@colors/colors/lib/index.js b/node_modules/@colors/colors/lib/index.js new file mode 100644 index 00000000..9df5ab7d --- /dev/null +++ b/node_modules/@colors/colors/lib/index.js @@ -0,0 +1,13 @@ +var colors = require('./colors'); +module['exports'] = colors; + +// Remark: By default, colors will add style properties to String.prototype. +// +// If you don't wish to extend String.prototype, you can do this instead and +// native String will not be touched: +// +// var colors = require('colors/safe); +// colors.red("foo") +// +// +require('./extendStringPrototype')(); diff --git a/node_modules/@colors/colors/lib/maps/america.js b/node_modules/@colors/colors/lib/maps/america.js new file mode 100644 index 00000000..dc969033 --- /dev/null +++ b/node_modules/@colors/colors/lib/maps/america.js @@ -0,0 +1,10 @@ +module['exports'] = function(colors) { + return function(letter, i, exploded) { + if (letter === ' ') return letter; + switch (i%3) { + case 0: return colors.red(letter); + case 1: return colors.white(letter); + case 2: return colors.blue(letter); + } + }; +}; diff --git a/node_modules/@colors/colors/lib/maps/rainbow.js b/node_modules/@colors/colors/lib/maps/rainbow.js new file mode 100644 index 00000000..2b00ac0a --- /dev/null +++ b/node_modules/@colors/colors/lib/maps/rainbow.js @@ -0,0 +1,12 @@ +module['exports'] = function(colors) { + // RoY G BiV + var rainbowColors = ['red', 'yellow', 'green', 'blue', 'magenta']; + return function(letter, i, exploded) { + if (letter === ' ') { + return letter; + } else { + return colors[rainbowColors[i++ % rainbowColors.length]](letter); + } + }; +}; + diff --git a/node_modules/@colors/colors/lib/maps/random.js b/node_modules/@colors/colors/lib/maps/random.js new file mode 100644 index 00000000..3d82a39e --- /dev/null +++ b/node_modules/@colors/colors/lib/maps/random.js @@ -0,0 +1,11 @@ +module['exports'] = function(colors) { + var available = ['underline', 'inverse', 'grey', 'yellow', 'red', 'green', + 'blue', 'white', 'cyan', 'magenta', 'brightYellow', 'brightRed', + 'brightGreen', 'brightBlue', 'brightWhite', 'brightCyan', 'brightMagenta']; + return function(letter, i, exploded) { + return letter === ' ' ? letter : + colors[ + available[Math.round(Math.random() * (available.length - 2))] + ](letter); + }; +}; diff --git a/node_modules/@colors/colors/lib/maps/zebra.js b/node_modules/@colors/colors/lib/maps/zebra.js new file mode 100644 index 00000000..fa736235 --- /dev/null +++ b/node_modules/@colors/colors/lib/maps/zebra.js @@ -0,0 +1,5 @@ +module['exports'] = function(colors) { + return function(letter, i, exploded) { + return i % 2 === 0 ? letter : colors.inverse(letter); + }; +}; diff --git a/node_modules/@colors/colors/lib/styles.js b/node_modules/@colors/colors/lib/styles.js new file mode 100644 index 00000000..011dafd8 --- /dev/null +++ b/node_modules/@colors/colors/lib/styles.js @@ -0,0 +1,95 @@ +/* +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +var styles = {}; +module['exports'] = styles; + +var codes = { + reset: [0, 0], + + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29], + + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + gray: [90, 39], + grey: [90, 39], + + brightRed: [91, 39], + brightGreen: [92, 39], + brightYellow: [93, 39], + brightBlue: [94, 39], + brightMagenta: [95, 39], + brightCyan: [96, 39], + brightWhite: [97, 39], + + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], + bgGray: [100, 49], + bgGrey: [100, 49], + + bgBrightRed: [101, 49], + bgBrightGreen: [102, 49], + bgBrightYellow: [103, 49], + bgBrightBlue: [104, 49], + bgBrightMagenta: [105, 49], + bgBrightCyan: [106, 49], + bgBrightWhite: [107, 49], + + // legacy styles for colors pre v1.0.0 + blackBG: [40, 49], + redBG: [41, 49], + greenBG: [42, 49], + yellowBG: [43, 49], + blueBG: [44, 49], + magentaBG: [45, 49], + cyanBG: [46, 49], + whiteBG: [47, 49], + +}; + +Object.keys(codes).forEach(function(key) { + var val = codes[key]; + var style = styles[key] = []; + style.open = '\u001b[' + val[0] + 'm'; + style.close = '\u001b[' + val[1] + 'm'; +}); diff --git a/node_modules/@colors/colors/lib/system/has-flag.js b/node_modules/@colors/colors/lib/system/has-flag.js new file mode 100644 index 00000000..a347dd4d --- /dev/null +++ b/node_modules/@colors/colors/lib/system/has-flag.js @@ -0,0 +1,35 @@ +/* +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +'use strict'; + +module.exports = function(flag, argv) { + argv = argv || process.argv; + + var terminatorPos = argv.indexOf('--'); + var prefix = /^-{1,2}/.test(flag) ? '' : '--'; + var pos = argv.indexOf(prefix + flag); + + return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos); +}; diff --git a/node_modules/@colors/colors/lib/system/supports-colors.js b/node_modules/@colors/colors/lib/system/supports-colors.js new file mode 100644 index 00000000..f1f9c8ff --- /dev/null +++ b/node_modules/@colors/colors/lib/system/supports-colors.js @@ -0,0 +1,151 @@ +/* +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +'use strict'; + +var os = require('os'); +var hasFlag = require('./has-flag.js'); + +var env = process.env; + +var forceColor = void 0; +if (hasFlag('no-color') || hasFlag('no-colors') || hasFlag('color=false')) { + forceColor = false; +} else if (hasFlag('color') || hasFlag('colors') || hasFlag('color=true') + || hasFlag('color=always')) { + forceColor = true; +} +if ('FORCE_COLOR' in env) { + forceColor = env.FORCE_COLOR.length === 0 + || parseInt(env.FORCE_COLOR, 10) !== 0; +} + +function translateLevel(level) { + if (level === 0) { + return false; + } + + return { + level: level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3, + }; +} + +function supportsColor(stream) { + if (forceColor === false) { + return 0; + } + + if (hasFlag('color=16m') || hasFlag('color=full') + || hasFlag('color=truecolor')) { + return 3; + } + + if (hasFlag('color=256')) { + return 2; + } + + if (stream && !stream.isTTY && forceColor !== true) { + return 0; + } + + var min = forceColor ? 1 : 0; + + if (process.platform === 'win32') { + // Node.js 7.5.0 is the first version of Node.js to include a patch to + // libuv that enables 256 color output on Windows. Anything earlier and it + // won't work. However, here we target Node.js 8 at minimum as it is an LTS + // release, and Node.js 7 is not. Windows 10 build 10586 is the first + // Windows release that supports 256 colors. Windows 10 build 14931 is the + // first release that supports 16m/TrueColor. + var osRelease = os.release().split('.'); + if (Number(process.versions.node.split('.')[0]) >= 8 + && Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) { + return Number(osRelease[2]) >= 14931 ? 3 : 2; + } + + return 1; + } + + if ('CI' in env) { + if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(function(sign) { + return sign in env; + }) || env.CI_NAME === 'codeship') { + return 1; + } + + return min; + } + + if ('TEAMCITY_VERSION' in env) { + return (/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0 + ); + } + + if ('TERM_PROGRAM' in env) { + var version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); + + switch (env.TERM_PROGRAM) { + case 'iTerm.app': + return version >= 3 ? 3 : 2; + case 'Hyper': + return 3; + case 'Apple_Terminal': + return 2; + // No default + } + } + + if (/-256(color)?$/i.test(env.TERM)) { + return 2; + } + + if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; + } + + if ('COLORTERM' in env) { + return 1; + } + + if (env.TERM === 'dumb') { + return min; + } + + return min; +} + +function getSupportLevel(stream) { + var level = supportsColor(stream); + return translateLevel(level); +} + +module.exports = { + supportsColor: getSupportLevel, + stdout: getSupportLevel(process.stdout), + stderr: getSupportLevel(process.stderr), +}; diff --git a/node_modules/@colors/colors/package.json b/node_modules/@colors/colors/package.json new file mode 100644 index 00000000..cb87f209 --- /dev/null +++ b/node_modules/@colors/colors/package.json @@ -0,0 +1,45 @@ +{ + "name": "@colors/colors", + "description": "get colors in your node.js console", + "version": "1.5.0", + "author": "DABH", + "contributors": [ + { + "name": "DABH", + "url": "https://github.com/DABH" + } + ], + "homepage": "https://github.com/DABH/colors.js", + "bugs": "https://github.com/DABH/colors.js/issues", + "keywords": [ + "ansi", + "terminal", + "colors" + ], + "repository": { + "type": "git", + "url": "http://github.com/DABH/colors.js.git" + }, + "license": "MIT", + "scripts": { + "lint": "eslint . --fix", + "test": "export FORCE_COLOR=1 && node tests/basic-test.js && node tests/safe-test.js" + }, + "engines": { + "node": ">=0.1.90" + }, + "main": "lib/index.js", + "files": [ + "examples", + "lib", + "LICENSE", + "safe.js", + "themes", + "index.d.ts", + "safe.d.ts" + ], + "devDependencies": { + "eslint": "^5.2.0", + "eslint-config-google": "^0.11.0" + } +} diff --git a/node_modules/@colors/colors/safe.d.ts b/node_modules/@colors/colors/safe.d.ts new file mode 100644 index 00000000..2bafc279 --- /dev/null +++ b/node_modules/@colors/colors/safe.d.ts @@ -0,0 +1,48 @@ +// Type definitions for Colors.js 1.2 +// Project: https://github.com/Marak/colors.js +// Definitions by: Bart van der Schoor , Staffan Eketorp +// Definitions: https://github.com/Marak/colors.js + +export const enabled: boolean; +export function enable(): void; +export function disable(): void; +export function setTheme(theme: any): void; + +export function strip(str: string): string; +export function stripColors(str: string): string; + +export function black(str: string): string; +export function red(str: string): string; +export function green(str: string): string; +export function yellow(str: string): string; +export function blue(str: string): string; +export function magenta(str: string): string; +export function cyan(str: string): string; +export function white(str: string): string; +export function gray(str: string): string; +export function grey(str: string): string; + +export function bgBlack(str: string): string; +export function bgRed(str: string): string; +export function bgGreen(str: string): string; +export function bgYellow(str: string): string; +export function bgBlue(str: string): string; +export function bgMagenta(str: string): string; +export function bgCyan(str: string): string; +export function bgWhite(str: string): string; + +export function reset(str: string): string; +export function bold(str: string): string; +export function dim(str: string): string; +export function italic(str: string): string; +export function underline(str: string): string; +export function inverse(str: string): string; +export function hidden(str: string): string; +export function strikethrough(str: string): string; + +export function rainbow(str: string): string; +export function zebra(str: string): string; +export function america(str: string): string; +export function trap(str: string): string; +export function random(str: string): string; +export function zalgo(str: string): string; diff --git a/node_modules/@colors/colors/safe.js b/node_modules/@colors/colors/safe.js new file mode 100644 index 00000000..a013d542 --- /dev/null +++ b/node_modules/@colors/colors/safe.js @@ -0,0 +1,10 @@ +// +// Remark: Requiring this file will use the "safe" colors API, +// which will not touch String.prototype. +// +// var colors = require('colors/safe'); +// colors.red("foo") +// +// +var colors = require('./lib/colors'); +module['exports'] = colors; diff --git a/node_modules/@colors/colors/themes/generic-logging.js b/node_modules/@colors/colors/themes/generic-logging.js new file mode 100644 index 00000000..63adfe4a --- /dev/null +++ b/node_modules/@colors/colors/themes/generic-logging.js @@ -0,0 +1,12 @@ +module['exports'] = { + silly: 'rainbow', + input: 'grey', + verbose: 'cyan', + prompt: 'grey', + info: 'green', + data: 'grey', + help: 'cyan', + warn: 'yellow', + debug: 'blue', + error: 'red', +}; diff --git a/node_modules/@cucumber/ci-environment/LICENSE b/node_modules/@cucumber/ci-environment/LICENSE new file mode 100644 index 00000000..d23a133d --- /dev/null +++ b/node_modules/@cucumber/ci-environment/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Cucumber Ltd and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/package.json b/node_modules/@cucumber/ci-environment/dist/cjs/package.json new file mode 100644 index 00000000..b731bd61 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/package.json @@ -0,0 +1 @@ +{"type": "commonjs"} diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/src/CiEnvironments.d.ts b/node_modules/@cucumber/ci-environment/dist/cjs/src/CiEnvironments.d.ts new file mode 100644 index 00000000..0dd3c516 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/src/CiEnvironments.d.ts @@ -0,0 +1,3 @@ +import { CiEnvironment } from './types.js'; +export declare const CiEnvironments: readonly CiEnvironment[]; +//# sourceMappingURL=CiEnvironments.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/src/CiEnvironments.d.ts.map b/node_modules/@cucumber/ci-environment/dist/cjs/src/CiEnvironments.d.ts.map new file mode 100644 index 00000000..8315e4ab --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/src/CiEnvironments.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"CiEnvironments.d.ts","sourceRoot":"","sources":["../../../src/CiEnvironments.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE1C,eAAO,MAAM,cAAc,EAAE,SAAS,aAAa,EAgKlD,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/src/CiEnvironments.js b/node_modules/@cucumber/ci-environment/dist/cjs/src/CiEnvironments.js new file mode 100644 index 00000000..054507cc --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/src/CiEnvironments.js @@ -0,0 +1,166 @@ +"use strict"; +/* This file is auto-generated using npm run build-ci-environments */ +/* eslint-disable no-useless-escape */ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CiEnvironments = void 0; +exports.CiEnvironments = [ + { + name: 'Azure Pipelines', + url: '${BUILD_BUILDURI}', + buildNumber: '${BUILD_BUILDNUMBER}', + git: { + remote: '${BUILD_REPOSITORY_URI}', + revision: '${BUILD_SOURCEVERSION}', + branch: '${BUILD_SOURCEBRANCH/refs\/heads\/(.*)/\\1}', + tag: '${BUILD_SOURCEBRANCH/refs\/tags\/(.*)/\\1}', + }, + }, + { + name: 'Bamboo', + url: '${bamboo_buildResultsUrl}', + buildNumber: '${bamboo_buildNumber}', + git: { + remote: '${bamboo_planRepository_repositoryUrl}', + revision: '${bamboo_planRepository_revision}', + branch: '${bamboo_planRepository_branch}', + }, + }, + { + name: 'Buddy', + url: '${BUDDY_EXECUTION_URL}', + buildNumber: '${BUDDY_EXECUTION_ID}', + git: { + remote: '${BUDDY_SCM_URL}', + revision: '${BUDDY_EXECUTION_REVISION}', + branch: '${BUDDY_EXECUTION_BRANCH}', + tag: '${BUDDY_EXECUTION_TAG}', + }, + }, + { + name: 'Bitrise', + url: '${BITRISE_BUILD_URL}', + buildNumber: '${BITRISE_BUILD_NUMBER}', + git: { + remote: '${GIT_REPOSITORY_URL}', + revision: '${BITRISE_GIT_COMMIT}', + branch: '${BITRISE_GIT_BRANCH}', + tag: '${BITRISE_GIT_TAG}', + }, + }, + { + name: 'CircleCI', + url: '${CIRCLE_BUILD_URL}', + buildNumber: '${CIRCLE_BUILD_NUM}', + git: { + remote: '${CIRCLE_REPOSITORY_URL}', + revision: '${CIRCLE_SHA1}', + branch: '${CIRCLE_BRANCH}', + tag: '${CIRCLE_TAG}', + }, + }, + { + name: 'CodeFresh', + url: '${CF_BUILD_URL}', + buildNumber: '${CF_BUILD_ID}', + git: { + remote: '${CF_COMMIT_URL/(.*)\\/commit.+$/\\1}.git', + revision: '${CF_REVISION}', + branch: '${CF_BRANCH}', + }, + }, + { + name: 'CodeShip', + url: '${CI_BUILD_URL}', + buildNumber: '${CI_BUILD_NUMBER}', + git: { + remote: '${CI_PULL_REQUEST/(.*)\\/pull\\/\\d+/\\1.git}', + revision: '${CI_COMMIT_ID}', + branch: '${CI_BRANCH}', + }, + }, + { + name: 'GitHub Actions', + url: '${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}', + buildNumber: '${GITHUB_RUN_ID}', + git: { + remote: '${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}.git', + revision: '${GITHUB_SHA}', + branch: '${GITHUB_HEAD_REF}', + tag: '${GITHUB_REF/refs\/tags\/(.*)/\\1}', + }, + }, + { + name: 'GitLab', + url: '${CI_JOB_URL}', + buildNumber: '${CI_JOB_ID}', + git: { + remote: '${CI_REPOSITORY_URL}', + revision: '${CI_COMMIT_SHA}', + branch: '${CI_COMMIT_BRANCH}', + tag: '${CI_COMMIT_TAG}', + }, + }, + { + name: 'GoCD', + url: '${GO_SERVER_URL}/pipelines/${GO_PIPELINE_NAME}/${GO_PIPELINE_COUNTER}/${GO_STAGE_NAME}/${GO_STAGE_COUNTER}', + buildNumber: '${GO_PIPELINE_NAME}/${GO_PIPELINE_COUNTER}/${GO_STAGE_NAME}/${GO_STAGE_COUNTER}', + git: { + remote: '${GO_SCM_*_PR_URL/(.*)\\/pull\\/\\d+/\\1.git}', + revision: '${GO_REVISION}', + branch: '${GO_SCM_*_PR_BRANCH/.*:(.*)/\\1}', + }, + }, + { + name: 'Jenkins', + url: '${BUILD_URL}', + buildNumber: '${BUILD_NUMBER}', + git: { + remote: '${GIT_URL}', + revision: '${GIT_COMMIT}', + branch: '${GIT_LOCAL_BRANCH}', + }, + }, + { + name: 'JetBrains Space', + url: '${JB_SPACE_EXECUTION_URL}', + buildNumber: '${JB_SPACE_EXECUTION_NUMBER}', + git: { + remote: 'https://${JB_SPACE_API_URL}/p/${JB_SPACE_PROJECT_KEY}/repositories/${JB_SPACE_GIT_REPOSITORY_NAME}', + revision: '${JB_SPACE_GIT_REVISION}', + branch: '${JB_SPACE_GIT_BRANCH}', + }, + }, + { + name: 'Semaphore', + url: '${SEMAPHORE_ORGANIZATION_URL}/jobs/${SEMAPHORE_JOB_ID}', + buildNumber: '${SEMAPHORE_JOB_ID}', + git: { + remote: '${SEMAPHORE_GIT_URL}', + revision: '${SEMAPHORE_GIT_SHA}', + branch: '${SEMAPHORE_GIT_BRANCH}', + tag: '${SEMAPHORE_GIT_TAG_NAME}', + }, + }, + { + name: 'Travis CI', + url: '${TRAVIS_BUILD_WEB_URL}', + buildNumber: '${TRAVIS_JOB_NUMBER}', + git: { + remote: 'https://github.com/${TRAVIS_REPO_SLUG}.git', + revision: '${TRAVIS_COMMIT}', + branch: '${TRAVIS_BRANCH}', + tag: '${TRAVIS_TAG}', + }, + }, + { + name: 'Wercker', + url: '${WERCKER_RUN_URL}', + buildNumber: '${WERCKER_RUN_URL/.*\\/([^\\/]+)$/\\1}', + git: { + remote: 'https://${WERCKER_GIT_DOMAIN}/${WERCKER_GIT_OWNER}/${WERCKER_GIT_REPOSITORY}.git', + revision: '${WERCKER_GIT_COMMIT}', + branch: '${WERCKER_GIT_BRANCH}', + }, + }, +]; +//# sourceMappingURL=CiEnvironments.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/src/CiEnvironments.js.map b/node_modules/@cucumber/ci-environment/dist/cjs/src/CiEnvironments.js.map new file mode 100644 index 00000000..b3517138 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/src/CiEnvironments.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CiEnvironments.js","sourceRoot":"","sources":["../../../src/CiEnvironments.ts"],"names":[],"mappings":";AAAA,qEAAqE;AACrE,sCAAsC;;;AAIzB,QAAA,cAAc,GAA6B;IACtD;QACE,IAAI,EAAE,iBAAiB;QACvB,GAAG,EAAE,mBAAmB;QACxB,WAAW,EAAE,sBAAsB;QACnC,GAAG,EAAE;YACH,MAAM,EAAE,yBAAyB;YACjC,QAAQ,EAAE,wBAAwB;YAClC,MAAM,EAAE,6CAA6C;YACrD,GAAG,EAAE,4CAA4C;SAClD;KACF;IACD;QACE,IAAI,EAAE,QAAQ;QACd,GAAG,EAAE,2BAA2B;QAChC,WAAW,EAAE,uBAAuB;QACpC,GAAG,EAAE;YACH,MAAM,EAAE,wCAAwC;YAChD,QAAQ,EAAE,mCAAmC;YAC7C,MAAM,EAAE,iCAAiC;SAC1C;KACF;IACD;QACE,IAAI,EAAE,OAAO;QACb,GAAG,EAAE,wBAAwB;QAC7B,WAAW,EAAE,uBAAuB;QACpC,GAAG,EAAE;YACH,MAAM,EAAE,kBAAkB;YAC1B,QAAQ,EAAE,6BAA6B;YACvC,MAAM,EAAE,2BAA2B;YACnC,GAAG,EAAE,wBAAwB;SAC9B;KACF;IACD;QACE,IAAI,EAAE,SAAS;QACf,GAAG,EAAE,sBAAsB;QAC3B,WAAW,EAAE,yBAAyB;QACtC,GAAG,EAAE;YACH,MAAM,EAAE,uBAAuB;YAC/B,QAAQ,EAAE,uBAAuB;YACjC,MAAM,EAAE,uBAAuB;YAC/B,GAAG,EAAE,oBAAoB;SAC1B;KACF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,GAAG,EAAE,qBAAqB;QAC1B,WAAW,EAAE,qBAAqB;QAClC,GAAG,EAAE;YACH,MAAM,EAAE,0BAA0B;YAClC,QAAQ,EAAE,gBAAgB;YAC1B,MAAM,EAAE,kBAAkB;YAC1B,GAAG,EAAE,eAAe;SACrB;KACF;IACD;QACE,IAAI,EAAE,WAAW;QACjB,GAAG,EAAE,iBAAiB;QACtB,WAAW,EAAE,gBAAgB;QAC7B,GAAG,EAAE;YACH,MAAM,EAAE,2CAA2C;YACnD,QAAQ,EAAE,gBAAgB;YAC1B,MAAM,EAAE,cAAc;SACvB;KACF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,GAAG,EAAE,iBAAiB;QACtB,WAAW,EAAE,oBAAoB;QACjC,GAAG,EAAE;YACH,MAAM,EAAE,+CAA+C;YACvD,QAAQ,EAAE,iBAAiB;YAC3B,MAAM,EAAE,cAAc;SACvB;KACF;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,GAAG,EAAE,yEAAyE;QAC9E,WAAW,EAAE,kBAAkB;QAC/B,GAAG,EAAE;YACH,MAAM,EAAE,+CAA+C;YACvD,QAAQ,EAAE,eAAe;YACzB,MAAM,EAAE,oBAAoB;YAC5B,GAAG,EAAE,oCAAoC;SAC1C;KACF;IACD;QACE,IAAI,EAAE,QAAQ;QACd,GAAG,EAAE,eAAe;QACpB,WAAW,EAAE,cAAc;QAC3B,GAAG,EAAE;YACH,MAAM,EAAE,sBAAsB;YAC9B,QAAQ,EAAE,kBAAkB;YAC5B,MAAM,EAAE,qBAAqB;YAC7B,GAAG,EAAE,kBAAkB;SACxB;KACF;IACD;QACE,IAAI,EAAE,MAAM;QACZ,GAAG,EAAE,4GAA4G;QACjH,WAAW,EAAE,iFAAiF;QAC9F,GAAG,EAAE;YACH,MAAM,EAAE,+CAA+C;YACvD,QAAQ,EAAE,gBAAgB;YAC1B,MAAM,EAAE,mCAAmC;SAC5C;KACF;IACD;QACE,IAAI,EAAE,SAAS;QACf,GAAG,EAAE,cAAc;QACnB,WAAW,EAAE,iBAAiB;QAC9B,GAAG,EAAE;YACH,MAAM,EAAE,YAAY;YACpB,QAAQ,EAAE,eAAe;YACzB,MAAM,EAAE,qBAAqB;SAC9B;KACF;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,GAAG,EAAE,2BAA2B;QAChC,WAAW,EAAE,8BAA8B;QAC3C,GAAG,EAAE;YACH,MAAM,EACJ,oGAAoG;YACtG,QAAQ,EAAE,0BAA0B;YACpC,MAAM,EAAE,wBAAwB;SACjC;KACF;IACD;QACE,IAAI,EAAE,WAAW;QACjB,GAAG,EAAE,wDAAwD;QAC7D,WAAW,EAAE,qBAAqB;QAClC,GAAG,EAAE;YACH,MAAM,EAAE,sBAAsB;YAC9B,QAAQ,EAAE,sBAAsB;YAChC,MAAM,EAAE,yBAAyB;YACjC,GAAG,EAAE,2BAA2B;SACjC;KACF;IACD;QACE,IAAI,EAAE,WAAW;QACjB,GAAG,EAAE,yBAAyB;QAC9B,WAAW,EAAE,sBAAsB;QACnC,GAAG,EAAE;YACH,MAAM,EAAE,4CAA4C;YACpD,QAAQ,EAAE,kBAAkB;YAC5B,MAAM,EAAE,kBAAkB;YAC1B,GAAG,EAAE,eAAe;SACrB;KACF;IACD;QACE,IAAI,EAAE,SAAS;QACf,GAAG,EAAE,oBAAoB;QACzB,WAAW,EAAE,wCAAwC;QACrD,GAAG,EAAE;YACH,MAAM,EAAE,kFAAkF;YAC1F,QAAQ,EAAE,uBAAuB;YACjC,MAAM,EAAE,uBAAuB;SAChC;KACF;CACF,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/src/detectCiEnvironment.d.ts b/node_modules/@cucumber/ci-environment/dist/cjs/src/detectCiEnvironment.d.ts new file mode 100644 index 00000000..1ca9a50b --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/src/detectCiEnvironment.d.ts @@ -0,0 +1,4 @@ +import { CiEnvironment, Env } from './types.js'; +export default function detectCiEnvironment(env: Env): CiEnvironment | undefined; +export declare function removeUserInfoFromUrl(value: string): string; +//# sourceMappingURL=detectCiEnvironment.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/src/detectCiEnvironment.d.ts.map b/node_modules/@cucumber/ci-environment/dist/cjs/src/detectCiEnvironment.d.ts.map new file mode 100644 index 00000000..989bad7b --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/src/detectCiEnvironment.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"detectCiEnvironment.d.ts","sourceRoot":"","sources":["../../../src/detectCiEnvironment.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,GAAG,EAAO,MAAM,YAAY,CAAA;AAEpD,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,GAAG,EAAE,GAAG,GAAG,aAAa,GAAG,SAAS,CAO/E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAU3D"} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/src/detectCiEnvironment.js b/node_modules/@cucumber/ci-environment/dist/cjs/src/detectCiEnvironment.js new file mode 100644 index 00000000..e7dde9dd --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/src/detectCiEnvironment.js @@ -0,0 +1,105 @@ +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +var __values = (this && this.__values) || function(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = detectCiEnvironment; +exports.removeUserInfoFromUrl = removeUserInfoFromUrl; +var fs_1 = require("fs"); +var CiEnvironments_js_1 = require("./CiEnvironments.js"); +var evaluateVariableExpression_js_1 = __importDefault(require("./evaluateVariableExpression.js")); +function detectCiEnvironment(env) { + var e_1, _a; + try { + for (var CiEnvironments_1 = __values(CiEnvironments_js_1.CiEnvironments), CiEnvironments_1_1 = CiEnvironments_1.next(); !CiEnvironments_1_1.done; CiEnvironments_1_1 = CiEnvironments_1.next()) { + var ciEnvironment = CiEnvironments_1_1.value; + var detected = detect(ciEnvironment, env); + if (detected) { + return detected; + } + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (CiEnvironments_1_1 && !CiEnvironments_1_1.done && (_a = CiEnvironments_1.return)) _a.call(CiEnvironments_1); + } + finally { if (e_1) throw e_1.error; } + } +} +function removeUserInfoFromUrl(value) { + if (!value) + return value; + try { + var url = new URL(value); + url.password = ''; + url.username = ''; + return url.toString(); + } + catch (_) { + return value; + } +} +function detectGit(ciEnvironment, env) { + var _a, _b, _c; + var revision = detectRevision(ciEnvironment, env); + if (!revision) { + return undefined; + } + var remote = (0, evaluateVariableExpression_js_1.default)((_a = ciEnvironment.git) === null || _a === void 0 ? void 0 : _a.remote, env); + if (!remote) { + return undefined; + } + var tag = (0, evaluateVariableExpression_js_1.default)((_b = ciEnvironment.git) === null || _b === void 0 ? void 0 : _b.tag, env); + var branch = (0, evaluateVariableExpression_js_1.default)((_c = ciEnvironment.git) === null || _c === void 0 ? void 0 : _c.branch, env); + return __assign(__assign({ revision: revision, remote: removeUserInfoFromUrl(remote) }, (tag && { tag: tag })), (branch && { branch: branch })); +} +function detectRevision(ciEnvironment, env) { + var _a, _b, _c; + if (env.GITHUB_EVENT_NAME === 'pull_request') { + if (!env.GITHUB_EVENT_PATH) + throw new Error('GITHUB_EVENT_PATH not set'); + var json = (0, fs_1.readFileSync)(env.GITHUB_EVENT_PATH, 'utf-8'); + var event_1 = JSON.parse(json); + var revision = (_b = (_a = event_1.pull_request) === null || _a === void 0 ? void 0 : _a.head) === null || _b === void 0 ? void 0 : _b.sha; + if (!revision) { + throw new Error("Could not find .pull_request.head.sha in ".concat(env.GITHUB_EVENT_PATH, ":\n").concat(JSON.stringify(event_1, null, 2))); + } + return revision; + } + return (0, evaluateVariableExpression_js_1.default)((_c = ciEnvironment.git) === null || _c === void 0 ? void 0 : _c.revision, env); +} +function detect(ciEnvironment, env) { + var url = (0, evaluateVariableExpression_js_1.default)(ciEnvironment.url, env); + if (url === undefined) { + // The url is what consumers will use as the primary key for a build + // If this cannot be determined, we return nothing. + return undefined; + } + var buildNumber = (0, evaluateVariableExpression_js_1.default)(ciEnvironment.buildNumber, env); + var git = detectGit(ciEnvironment, env); + return __assign({ name: ciEnvironment.name, url: url, buildNumber: buildNumber }, (git && { git: git })); +} +//# sourceMappingURL=detectCiEnvironment.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/src/detectCiEnvironment.js.map b/node_modules/@cucumber/ci-environment/dist/cjs/src/detectCiEnvironment.js.map new file mode 100644 index 00000000..96de07a6 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/src/detectCiEnvironment.js.map @@ -0,0 +1 @@ +{"version":3,"file":"detectCiEnvironment.js","sourceRoot":"","sources":["../../../src/detectCiEnvironment.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,sCAOC;AAED,sDAUC;AAzBD,yBAAiC;AAEjC,yDAAoD;AACpD,kGAAwE;AAGxE,SAAwB,mBAAmB,CAAC,GAAQ;;;QAClD,KAA4B,IAAA,mBAAA,SAAA,kCAAc,CAAA,8CAAA,0EAAE,CAAC;YAAxC,IAAM,aAAa,2BAAA;YACtB,IAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,EAAE,GAAG,CAAC,CAAA;YAC3C,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,QAAQ,CAAA;YACjB,CAAC;QACH,CAAC;;;;;;;;;AACH,CAAC;AAED,SAAgB,qBAAqB,CAAC,KAAa;IACjD,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAA;IACxB,IAAI,CAAC;QACH,IAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAA;QAC1B,GAAG,CAAC,QAAQ,GAAG,EAAE,CAAA;QACjB,GAAG,CAAC,QAAQ,GAAG,EAAE,CAAA;QACjB,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAA;IACvB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,aAA4B,EAAE,GAAQ;;IACvD,IAAM,QAAQ,GAAG,cAAc,CAAC,aAAa,EAAE,GAAG,CAAC,CAAA;IACnD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAM,MAAM,GAAG,IAAA,uCAA0B,EAAC,MAAA,aAAa,CAAC,GAAG,0CAAE,MAAM,EAAE,GAAG,CAAC,CAAA;IACzE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAM,GAAG,GAAG,IAAA,uCAA0B,EAAC,MAAA,aAAa,CAAC,GAAG,0CAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IACnE,IAAM,MAAM,GAAG,IAAA,uCAA0B,EAAC,MAAA,aAAa,CAAC,GAAG,0CAAE,MAAM,EAAE,GAAG,CAAC,CAAA;IAEzE,2BACE,QAAQ,UAAA,EACR,MAAM,EAAE,qBAAqB,CAAC,MAAM,CAAC,IAClC,CAAC,GAAG,IAAI,EAAE,GAAG,KAAA,EAAE,CAAC,GAChB,CAAC,MAAM,IAAI,EAAE,MAAM,QAAA,EAAE,CAAC,EAC1B;AACH,CAAC;AAED,SAAS,cAAc,CAAC,aAA4B,EAAE,GAAQ;;IAC5D,IAAI,GAAG,CAAC,iBAAiB,KAAK,cAAc,EAAE,CAAC;QAC7C,IAAI,CAAC,GAAG,CAAC,iBAAiB;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;QACxE,IAAM,IAAI,GAAG,IAAA,iBAAY,EAAC,GAAG,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAA;QACzD,IAAM,OAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC9B,IAAM,QAAQ,GAAG,MAAA,MAAA,OAAK,CAAC,YAAY,0CAAE,IAAI,0CAAE,GAAG,CAAA;QAC9C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,mDAA4C,GAAG,CAAC,iBAAiB,gBAAM,IAAI,CAAC,SAAS,CACnF,OAAK,EACL,IAAI,EACJ,CAAC,CACF,CAAE,CACJ,CAAA;QACH,CAAC;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,OAAO,IAAA,uCAA0B,EAAC,MAAA,aAAa,CAAC,GAAG,0CAAE,QAAQ,EAAE,GAAG,CAAC,CAAA;AACrE,CAAC;AAED,SAAS,MAAM,CAAC,aAA4B,EAAE,GAAQ;IACpD,IAAM,GAAG,GAAG,IAAA,uCAA0B,EAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAC9D,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,oEAAoE;QACpE,mDAAmD;QACnD,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IAAM,WAAW,GAAG,IAAA,uCAA0B,EAAC,aAAa,CAAC,WAAW,EAAE,GAAG,CAAC,CAAA;IAC9E,IAAM,GAAG,GAAG,SAAS,CAAC,aAAa,EAAE,GAAG,CAAC,CAAA;IAEzC,kBACE,IAAI,EAAE,aAAa,CAAC,IAAI,EACxB,GAAG,KAAA,EACH,WAAW,aAAA,IACR,CAAC,GAAG,IAAI,EAAE,GAAG,KAAA,EAAE,CAAC,EACpB;AACH,CAAC"} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/src/evaluateVariableExpression.d.ts b/node_modules/@cucumber/ci-environment/dist/cjs/src/evaluateVariableExpression.d.ts new file mode 100644 index 00000000..d0faefb6 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/src/evaluateVariableExpression.d.ts @@ -0,0 +1,3 @@ +import { Env } from './types.js'; +export default function evaluateVariableExpression(expression: string | undefined, env: Env): string | undefined; +//# sourceMappingURL=evaluateVariableExpression.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/src/evaluateVariableExpression.d.ts.map b/node_modules/@cucumber/ci-environment/dist/cjs/src/evaluateVariableExpression.d.ts.map new file mode 100644 index 00000000..15f17eab --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/src/evaluateVariableExpression.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"evaluateVariableExpression.d.ts","sourceRoot":"","sources":["../../../src/evaluateVariableExpression.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAA;AAEhC,MAAM,CAAC,OAAO,UAAU,0BAA0B,CAChD,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,GAAG,EAAE,GAAG,GACP,MAAM,GAAG,SAAS,CAgCpB"} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/src/evaluateVariableExpression.js b/node_modules/@cucumber/ci-environment/dist/cjs/src/evaluateVariableExpression.js new file mode 100644 index 00000000..427943d8 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/src/evaluateVariableExpression.js @@ -0,0 +1,102 @@ +"use strict"; +var __values = (this && this.__values) || function(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); +}; +var __read = (this && this.__read) || function (o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } + catch (error) { e = { error: error }; } + finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } + finally { if (e) throw e.error; } + } + return ar; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = evaluateVariableExpression; +function evaluateVariableExpression(expression, env) { + if (expression === undefined) { + return undefined; + } + try { + var re = new RegExp('\\${(.*?)(?:(?; +//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/src/types.d.ts.map b/node_modules/@cucumber/ci-environment/dist/cjs/src/types.d.ts.map new file mode 100644 index 00000000..a78aa282 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/src/types.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,GAAG,CAAC,EAAE,GAAG,CAAA;CACV,CAAA;AAED,MAAM,MAAM,GAAG,GAAG;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,cAAc,EAAE,SAAS,aAAa,EAAE,CAAA;CACzC,CAAA;AAED,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/src/types.js b/node_modules/@cucumber/ci-environment/dist/cjs/src/types.js new file mode 100644 index 00000000..11e638d1 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/src/types.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/src/types.js.map b/node_modules/@cucumber/ci-environment/dist/cjs/src/types.js.map new file mode 100644 index 00000000..70453b7a --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/src/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/test/acceptanceTest.d.ts b/node_modules/@cucumber/ci-environment/dist/cjs/test/acceptanceTest.d.ts new file mode 100644 index 00000000..d74d9980 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/test/acceptanceTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=acceptanceTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/test/acceptanceTest.d.ts.map b/node_modules/@cucumber/ci-environment/dist/cjs/test/acceptanceTest.d.ts.map new file mode 100644 index 00000000..2fe39e4a --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/test/acceptanceTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"acceptanceTest.d.ts","sourceRoot":"","sources":["../../../test/acceptanceTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/test/acceptanceTest.js b/node_modules/@cucumber/ci-environment/dist/cjs/test/acceptanceTest.js new file mode 100644 index 00000000..c19a618e --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/test/acceptanceTest.js @@ -0,0 +1,50 @@ +"use strict"; +var __values = (this && this.__values) || function(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var assert_1 = __importDefault(require("assert")); +var fs_1 = __importDefault(require("fs")); +var glob_1 = require("glob"); +var path_1 = __importDefault(require("path")); +var index_js_1 = __importDefault(require("../src/index.js")); +describe('detectCiEnvironment', function () { + var e_1, _a; + var _loop_1 = function (txt) { + it("detects ".concat(path_1.default.basename(txt, '.txt')), function () { + var envData = fs_1.default.readFileSync(txt, { encoding: 'utf8' }); + var entries = envData.split(/\n/).map(function (line) { return line.split(/=/); }); + var env = Object.fromEntries(entries); + var ciEnvironment = (0, index_js_1.default)(env); + var expectedJson = fs_1.default.readFileSync("".concat(txt, ".json"), { + encoding: 'utf8', + }); + assert_1.default.deepStrictEqual(ciEnvironment, JSON.parse(expectedJson)); + }); + }; + try { + for (var _b = __values((0, glob_1.sync)("../testdata/src/*.txt")), _c = _b.next(); !_c.done; _c = _b.next()) { + var txt = _c.value; + _loop_1(txt); + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (_c && !_c.done && (_a = _b.return)) _a.call(_b); + } + finally { if (e_1) throw e_1.error; } + } +}); +//# sourceMappingURL=acceptanceTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/test/acceptanceTest.js.map b/node_modules/@cucumber/ci-environment/dist/cjs/test/acceptanceTest.js.map new file mode 100644 index 00000000..f62c4753 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/test/acceptanceTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"acceptanceTest.js","sourceRoot":"","sources":["../../../test/acceptanceTest.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAA2B;AAC3B,0CAAmB;AACnB,6BAA2B;AAC3B,8CAAuB;AAEvB,6DAA+D;AAE/D,QAAQ,CAAC,qBAAqB,EAAE;;4BACnB,GAAG;QACZ,EAAE,CAAC,kBAAW,cAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAE,EAAE;YAC1C,IAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAA;YAC1D,IAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,UAAC,IAAI,IAAK,OAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAf,CAAe,CAAC,CAAA;YAClE,IAAM,GAAG,GAAQ,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;YAC5C,IAAM,aAAa,GAAG,IAAA,kBAAmB,EAAC,GAAG,CAAC,CAAA;YAE9C,IAAM,YAAY,GAAG,YAAE,CAAC,YAAY,CAAC,UAAG,GAAG,UAAO,EAAE;gBAClD,QAAQ,EAAE,MAAM;aACjB,CAAC,CAAA;YACF,gBAAM,CAAC,eAAe,CAAC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAA;QACjE,CAAC,CAAC,CAAA;;;QAXJ,KAAkB,IAAA,KAAA,SAAA,IAAA,WAAI,EAAC,uBAAuB,CAAC,CAAA,gBAAA;YAA1C,IAAM,GAAG,WAAA;oBAAH,GAAG;SAYb;;;;;;;;;AACH,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/test/evaluateVariableExpressionTest.d.ts b/node_modules/@cucumber/ci-environment/dist/cjs/test/evaluateVariableExpressionTest.d.ts new file mode 100644 index 00000000..2f18d359 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/test/evaluateVariableExpressionTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=evaluateVariableExpressionTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/test/evaluateVariableExpressionTest.d.ts.map b/node_modules/@cucumber/ci-environment/dist/cjs/test/evaluateVariableExpressionTest.d.ts.map new file mode 100644 index 00000000..0b9c4b5e --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/test/evaluateVariableExpressionTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"evaluateVariableExpressionTest.d.ts","sourceRoot":"","sources":["../../../test/evaluateVariableExpressionTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/test/evaluateVariableExpressionTest.js b/node_modules/@cucumber/ci-environment/dist/cjs/test/evaluateVariableExpressionTest.js new file mode 100644 index 00000000..34fdb9b9 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/test/evaluateVariableExpressionTest.js @@ -0,0 +1,40 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var assert_1 = __importDefault(require("assert")); +var evaluateVariableExpression_js_1 = __importDefault(require("../src/evaluateVariableExpression.js")); +describe('createMeta', function () { + it('returns undefined when a variable is undefined', function () { + var expression = 'hello-${SOME_VAR}'; + var result = (0, evaluateVariableExpression_js_1.default)(expression, {}); + assert_1.default.strictEqual(result, undefined); + }); + it('gets a value without replacement', function () { + var expression = '${SOME_VAR}'; + var result = (0, evaluateVariableExpression_js_1.default)(expression, { SOME_VAR: 'some_value' }); + assert_1.default.strictEqual(result, 'some_value'); + }); + it('captures a group', function () { + var expression = '${SOME_REF/refs\\/heads\\/(.*)/\\1}'; + var result = (0, evaluateVariableExpression_js_1.default)(expression, { SOME_REF: 'refs/heads/main' }); + assert_1.default.strictEqual(result, 'main'); + }); + it('works with star wildcard in var', function () { + var expression = '${GO_SCM_*_PR_BRANCH/.*:(.*)/\\1}'; + var result = (0, evaluateVariableExpression_js_1.default)(expression, { + GO_SCM_MY_MATERIAL_PR_BRANCH: 'ashwankthkumar:feature-1', + }); + assert_1.default.strictEqual(result, 'feature-1'); + }); + it('evaluates a complex expression', function () { + var expression = 'hello-${VAR1}-${VAR2/(.*) (.*)/\\2-\\1}-world'; + var result = (0, evaluateVariableExpression_js_1.default)(expression, { + VAR1: 'amazing', + VAR2: 'gorgeous beautiful', + }); + assert_1.default.strictEqual(result, 'hello-amazing-beautiful-gorgeous-world'); + }); +}); +//# sourceMappingURL=evaluateVariableExpressionTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/test/evaluateVariableExpressionTest.js.map b/node_modules/@cucumber/ci-environment/dist/cjs/test/evaluateVariableExpressionTest.js.map new file mode 100644 index 00000000..be1e6e26 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/test/evaluateVariableExpressionTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"evaluateVariableExpressionTest.js","sourceRoot":"","sources":["../../../test/evaluateVariableExpressionTest.ts"],"names":[],"mappings":";;;;;AAAA,kDAA2B;AAE3B,uGAA6E;AAE7E,QAAQ,CAAC,YAAY,EAAE;IACrB,EAAE,CAAC,gDAAgD,EAAE;QACnD,IAAM,UAAU,GAAG,mBAAmB,CAAA;QACtC,IAAM,MAAM,GAAG,IAAA,uCAA0B,EAAC,UAAU,EAAE,EAAE,CAAC,CAAA;QACzD,gBAAM,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kCAAkC,EAAE;QACrC,IAAM,UAAU,GAAG,aAAa,CAAA;QAChC,IAAM,MAAM,GAAG,IAAA,uCAA0B,EAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAA;QACjF,gBAAM,CAAC,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kBAAkB,EAAE;QACrB,IAAM,UAAU,GAAG,qCAAqC,CAAA;QACxD,IAAM,MAAM,GAAG,IAAA,uCAA0B,EAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAA;QACtF,gBAAM,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iCAAiC,EAAE;QACpC,IAAM,UAAU,GAAG,mCAAmC,CAAA;QACtD,IAAM,MAAM,GAAG,IAAA,uCAA0B,EAAC,UAAU,EAAE;YACpD,4BAA4B,EAAE,0BAA0B;SACzD,CAAC,CAAA;QACF,gBAAM,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gCAAgC,EAAE;QACnC,IAAM,UAAU,GAAG,+CAA+C,CAAA;QAClE,IAAM,MAAM,GAAG,IAAA,uCAA0B,EAAC,UAAU,EAAE;YACpD,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,oBAAoB;SAC3B,CAAC,CAAA;QACF,gBAAM,CAAC,WAAW,CAAC,MAAM,EAAE,wCAAwC,CAAC,CAAA;IACtE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/test/gitHubPullRequestIntegrationTest.d.ts b/node_modules/@cucumber/ci-environment/dist/cjs/test/gitHubPullRequestIntegrationTest.d.ts new file mode 100644 index 00000000..c2fcb4c7 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/test/gitHubPullRequestIntegrationTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=gitHubPullRequestIntegrationTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/test/gitHubPullRequestIntegrationTest.d.ts.map b/node_modules/@cucumber/ci-environment/dist/cjs/test/gitHubPullRequestIntegrationTest.d.ts.map new file mode 100644 index 00000000..695ecca3 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/test/gitHubPullRequestIntegrationTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"gitHubPullRequestIntegrationTest.d.ts","sourceRoot":"","sources":["../../../test/gitHubPullRequestIntegrationTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/test/gitHubPullRequestIntegrationTest.js b/node_modules/@cucumber/ci-environment/dist/cjs/test/gitHubPullRequestIntegrationTest.js new file mode 100644 index 00000000..578eca46 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/test/gitHubPullRequestIntegrationTest.js @@ -0,0 +1,18 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var assert_1 = __importDefault(require("assert")); +var index_js_1 = __importDefault(require("../src/index.js")); +describe('GitHub', function () { + if (process.env.GITHUB_EVENT_NAME === 'pull_request') { + it('detects the correct revision for pull requests', function () { + var ciEnvironment = (0, index_js_1.default)(process.env); + (0, assert_1.default)(ciEnvironment); + console.log('Manually verify that the revision is correct'); + console.log(JSON.stringify(ciEnvironment, null, 2)); + }); + } +}); +//# sourceMappingURL=gitHubPullRequestIntegrationTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/test/gitHubPullRequestIntegrationTest.js.map b/node_modules/@cucumber/ci-environment/dist/cjs/test/gitHubPullRequestIntegrationTest.js.map new file mode 100644 index 00000000..910b493c --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/test/gitHubPullRequestIntegrationTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"gitHubPullRequestIntegrationTest.js","sourceRoot":"","sources":["../../../test/gitHubPullRequestIntegrationTest.ts"],"names":[],"mappings":";;;;;AAAA,kDAA2B;AAE3B,6DAAiD;AAEjD,QAAQ,CAAC,QAAQ,EAAE;IACjB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,cAAc,EAAE,CAAC;QACrD,EAAE,CAAC,gDAAgD,EAAE;YACnD,IAAM,aAAa,GAAG,IAAA,kBAAmB,EAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YACtD,IAAA,gBAAM,EAAC,aAAa,CAAC,CAAA;YACrB,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAA;YAC3D,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QACrD,CAAC,CAAC,CAAA;IACJ,CAAC;AACH,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/test/removeUserInfoFromUrlTest.d.ts b/node_modules/@cucumber/ci-environment/dist/cjs/test/removeUserInfoFromUrlTest.d.ts new file mode 100644 index 00000000..e0ae5847 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/test/removeUserInfoFromUrlTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=removeUserInfoFromUrlTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/test/removeUserInfoFromUrlTest.d.ts.map b/node_modules/@cucumber/ci-environment/dist/cjs/test/removeUserInfoFromUrlTest.d.ts.map new file mode 100644 index 00000000..7e1331b1 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/test/removeUserInfoFromUrlTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"removeUserInfoFromUrlTest.d.ts","sourceRoot":"","sources":["../../../test/removeUserInfoFromUrlTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/test/removeUserInfoFromUrlTest.js b/node_modules/@cucumber/ci-environment/dist/cjs/test/removeUserInfoFromUrlTest.js new file mode 100644 index 00000000..4fef2322 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/test/removeUserInfoFromUrlTest.js @@ -0,0 +1,27 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var assert_1 = __importDefault(require("assert")); +var detectCiEnvironment_js_1 = require("../src/detectCiEnvironment.js"); +describe('removeUserInfoFromUrl', function () { + it('returns empty string for empty string', function () { + assert_1.default.strictEqual((0, detectCiEnvironment_js_1.removeUserInfoFromUrl)(''), ''); + }); + it('leaves the data intact when no sensitive information is detected', function () { + assert_1.default.strictEqual((0, detectCiEnvironment_js_1.removeUserInfoFromUrl)('pretty safe'), 'pretty safe'); + }); + context('with URLs', function () { + it('leaves intact when no password is found', function () { + assert_1.default.strictEqual((0, detectCiEnvironment_js_1.removeUserInfoFromUrl)('https://example.com/git/repo.git'), 'https://example.com/git/repo.git'); + }); + it('removes credentials when found', function () { + assert_1.default.strictEqual((0, detectCiEnvironment_js_1.removeUserInfoFromUrl)('http://aslak@example.com/git/repo.git'), 'http://example.com/git/repo.git'); + }); + it('removes credentials and passwords when found', function () { + assert_1.default.strictEqual((0, detectCiEnvironment_js_1.removeUserInfoFromUrl)('ssh://login:password@example.com/git/repo.git'), 'ssh://example.com/git/repo.git'); + }); + }); +}); +//# sourceMappingURL=removeUserInfoFromUrlTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/test/removeUserInfoFromUrlTest.js.map b/node_modules/@cucumber/ci-environment/dist/cjs/test/removeUserInfoFromUrlTest.js.map new file mode 100644 index 00000000..ee4f102d --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/test/removeUserInfoFromUrlTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"removeUserInfoFromUrlTest.js","sourceRoot":"","sources":["../../../test/removeUserInfoFromUrlTest.ts"],"names":[],"mappings":";;;;;AAAA,kDAA2B;AAE3B,wEAAqE;AAErE,QAAQ,CAAC,uBAAuB,EAAE;IAChC,EAAE,CAAC,uCAAuC,EAAE;QAC1C,gBAAM,CAAC,WAAW,CAAC,IAAA,8CAAqB,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kEAAkE,EAAE;QACrE,gBAAM,CAAC,WAAW,CAAC,IAAA,8CAAqB,EAAC,aAAa,CAAC,EAAE,aAAa,CAAC,CAAA;IACzE,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,WAAW,EAAE;QACnB,EAAE,CAAC,yCAAyC,EAAE;YAC5C,gBAAM,CAAC,WAAW,CAChB,IAAA,8CAAqB,EAAC,kCAAkC,CAAC,EACzD,kCAAkC,CACnC,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,gCAAgC,EAAE;YACnC,gBAAM,CAAC,WAAW,CAChB,IAAA,8CAAqB,EAAC,uCAAuC,CAAC,EAC9D,iCAAiC,CAClC,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8CAA8C,EAAE;YACjD,gBAAM,CAAC,WAAW,CAChB,IAAA,8CAAqB,EAAC,+CAA+C,CAAC,EACtE,gCAAgC,CACjC,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/cjs/tsconfig.build-cjs.tsbuildinfo b/node_modules/@cucumber/ci-environment/dist/cjs/tsconfig.build-cjs.tsbuildinfo new file mode 100644 index 00000000..f5d315fc --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/cjs/tsconfig.build-cjs.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../src/types.ts","../../src/CiEnvironments.ts","../../src/evaluateVariableExpression.ts","../../src/detectCiEnvironment.ts","../../src/index.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/@types/node/web-globals/events.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/inspector.generated.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/minipass/dist/commonjs/index.d.ts","../../node_modules/lru-cache/dist/commonjs/index.d.ts","../../node_modules/path-scurry/dist/commonjs/index.d.ts","../../node_modules/glob/node_modules/minimatch/dist/commonjs/ast.d.ts","../../node_modules/glob/node_modules/minimatch/dist/commonjs/escape.d.ts","../../node_modules/glob/node_modules/minimatch/dist/commonjs/unescape.d.ts","../../node_modules/glob/node_modules/minimatch/dist/commonjs/index.d.ts","../../node_modules/glob/dist/commonjs/pattern.d.ts","../../node_modules/glob/dist/commonjs/processor.d.ts","../../node_modules/glob/dist/commonjs/walker.d.ts","../../node_modules/glob/dist/commonjs/ignore.d.ts","../../node_modules/glob/dist/commonjs/glob.d.ts","../../node_modules/glob/dist/commonjs/has-magic.d.ts","../../node_modules/glob/dist/commonjs/index.d.ts","../../test/acceptanceTest.ts","../../test/evaluateVariableExpressionTest.ts","../../test/gitHubPullRequestIntegrationTest.ts","../../test/removeUserInfoFromUrlTest.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/json5/index.d.ts","../../node_modules/@types/mocha/index.d.ts"],"fileIdsList":[[57,105,122,123],[57,102,103,105,122,123],[57,104,105,122,123],[105,122,123],[57,105,110,122,123,140],[57,105,106,111,116,122,123,125,137,148],[57,105,106,107,116,122,123,125],[52,53,54,57,105,122,123],[57,105,108,122,123,149],[57,105,109,110,117,122,123,126],[57,105,110,122,123,137,145],[57,105,111,113,116,122,123,125],[57,104,105,112,122,123],[57,105,113,114,122,123],[57,105,115,116,122,123],[57,104,105,116,122,123],[57,105,116,117,118,122,123,137,148],[57,105,116,117,118,122,123,132,137,140],[57,98,105,113,116,119,122,123,125,137,148],[57,105,116,117,119,120,122,123,125,137,145,148],[57,105,119,121,122,123,137,145,148],[55,56,57,58,59,60,61,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154],[57,105,116,122,123],[57,105,122,123,124,148],[57,105,113,116,122,123,125,137],[57,105,122,123,126],[57,105,122,123,127],[57,104,105,122,123,128],[57,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154],[57,105,122,123,130],[57,105,122,123,131],[57,105,116,122,123,132,133],[57,105,122,123,132,134,149,151],[57,105,117,122,123],[57,105,116,122,123,137,138,140],[57,105,122,123,139,140],[57,105,122,123,137,138],[57,105,122,123,140],[57,105,122,123,141],[57,102,105,122,123,137,142],[57,105,116,122,123,143,144],[57,105,122,123,143,144],[57,105,110,122,123,125,137,145],[57,105,122,123,146],[57,105,122,123,125,147],[57,105,119,122,123,131,148],[57,105,110,122,123,149],[57,105,122,123,137,150],[57,105,122,123,124,151],[57,105,122,123,152],[57,98,105,122,123],[57,98,105,116,118,122,123,128,137,140,148,150,151,153],[57,105,122,123,137,154],[57,105,122,123,156,158,162,163,166],[57,105,122,123,167],[57,105,122,123,158,162,165],[57,105,122,123,156,158,162,165,166,167,168],[57,105,122,123,162],[57,105,122,123,158,162,163,165],[57,105,122,123,156,158,163,164,166],[57,105,122,123,159,160,161],[57,105,116,122,123,141,155],[57,105,117,122,123,127,156,157],[57,70,74,105,122,123,148],[57,70,105,122,123,137,148],[57,65,105,122,123],[57,67,70,105,122,123,145,148],[57,105,122,123,125,145],[57,105,122,123,155],[57,65,105,122,123,155],[57,67,70,105,122,123,125,148],[57,62,63,66,69,105,116,122,123,137,148],[57,70,77,105,122,123],[57,62,68,105,122,123],[57,70,91,92,105,122,123],[57,66,70,105,122,123,140,148,155],[57,91,105,122,123,155],[57,64,65,105,122,123,155],[57,70,105,122,123],[57,64,65,66,67,68,69,70,71,72,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,92,93,94,95,96,97,105,122,123],[57,70,85,105,122,123],[57,70,77,78,105,122,123],[57,68,70,78,79,105,122,123],[57,69,105,122,123],[57,62,65,70,105,122,123],[57,70,74,78,79,105,122,123],[57,74,105,122,123],[57,68,70,73,105,122,123,148],[57,62,67,70,77,105,122,123],[57,105,122,123,137],[57,65,70,91,105,122,123,153,155],[47,57,105,122,123],[47,48,49,57,105,117,122,123],[47,50,57,105,122,123],[51,57,102,105,117,122,123,127,169],[49,57,102,105,122,123],[51,57,102,105,122,123],[50,57,102,105,122,123]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"9584227b611f65058fdf9d04b648f35b6d05441582b8586d96a356ac19448c0a","signature":"8be2a46b61cf1681e570b70c8a9c6ab5b4beef825836b02e33da0d1de98fcf83"},{"version":"be2d886af4020bb2146c78876c2846769b7d52afe668005644c0bdc5a554453d","signature":"afa45ce668f64ede390cdc539249afa1f79a80550e79a12cee545ac05a0ddd20"},{"version":"74c947a817aa4d532ca74bc47f913a44591f47ac52c95a704670c89ba9b94211","signature":"ddf341c36cecf3851b23139d9cbecba36388984de004e786bd19fb6ed62ea1d2"},{"version":"4262c45efb4852f9f59f5ca4d2fd6795860f60bd325d5d66487f37bd74b4e2f7","signature":"9177d9f96314c05220cd62c56196487853d3678605d745e78a7407072a8cf7d8"},{"version":"09b50c5632abc08b7c1ffaade3d118602a3b8d20564dd659cd6e28b54c88f083","signature":"6deeb17028e6d068f9018204cdf2f4bc465b20f44b7dd2b9cdad41e43bef2237"},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"2cbe0621042e2a68c7cbce5dfed3906a1862a16a7d496010636cdbdb91341c0f","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"bb45cd435da536500f1d9692a9b49d0c570b763ccbf00473248b777f5c1f353b","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"83e63d6ccf8ec004a3bb6d58b9bb0104f60e002754b1e968024b320730cc5311","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d2bc7425ef40526650d6db7e072c1ff4a51101c3ac2cc4b666623b19496a6e27","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"f27524f4bef4b6519c604bdb23bf4465bddcccbf3f003abb901acbd0d7404d99","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"dba28a419aec76ed864ef43e5f577a5c99a010c32e5949fe4e17a4d57c58dd11","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c959a391a75be9789b43c8468f71e3fa06488b4d691d5729dde1416dcd38225b","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"0dba70b3fb0dcd713fda33c2df64fa6751fff6460e536971cee917260fb17882","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"9f663c2f91127ef7024e8ca4b3b4383ff2770e5f826696005de382282794b127","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1},{"version":"041597c12abeaa2ef07766775955fc87cfc65c43e0fe86c836071bea787e967c","impliedFormat":1},{"version":"0838507efff4f479c6f603ec812810ddfe14ab32abf8f4a8def140be970fe439","impliedFormat":1},{"version":"072f583571d6e3d30cd9760ee3485d29484fb7b54ba772ac135c747a380096a1","impliedFormat":1},{"version":"7212c2d58855b8df35275180e97903a4b6093d4fbaefea863d8d028da63938c6","impliedFormat":1},{"version":"d8a6b3f899917210f00ddf13b564a2a4fdcf1e50c5a22e8d3abcfd4f1c4f9ae1","impliedFormat":1},{"version":"fd5eab954b31e761a72234031dadc3aab768763942a9637e380aed441cc94f59","impliedFormat":1},{"version":"c7aaac3119acf27e03190cc4224f1d81c7498cf6b36fa72d10d99f2c41d1bbc0","impliedFormat":1},{"version":"dd9faff42b456b5f03b85d8fbd64838eb92f6f7b03b36322cbc59c005b7033d3","impliedFormat":1},{"version":"6ff702721d87c0ba8e7f8950e7b0a3b009dfd912fab3997e0b63fab8d83919c3","impliedFormat":1},{"version":"9dce9fc12e9a79d1135699d525aa6b44b71a45e32e3fa0cf331060b980b16317","impliedFormat":1},{"version":"586b2fd8a7d582329658aaceec22f8a5399e05013deb49bcfde28f95f093c8ee","impliedFormat":1},{"version":"59c44b081724d4ab8039988aba34ee6b3bd41c30fc2d8686f4ed06588397b2f7","impliedFormat":1},{"version":"ef1f3eadd7bed282de45bafd7c2c00105cf1db93e22f6cd763bec8a9c2cf6df1","impliedFormat":1},{"version":"2b90463c902dbe4f5bbb9eae084c05de37477c17a5de1e342eb7cbc9410dc6a1","impliedFormat":1},{"version":"7f85e915e642bfc7f4fcaf10c174b12d4156e330e8377dfacd094bde441fe96c","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"f625adde8864834f8467ca8c51a91ebb7104f53b16cf8ebd8130b0279f55a9e3","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"e1cc9b7856fba8e77b161e3f9369830b76798139db320cdf92cc35f67e4006d6","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"dda4432f51c9958410acdf1b09a2d3cb898222d318ba188e8754234533a3e39d","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"785b9d575b49124ce01b46f5b9402157c7611e6532effa562ac6aebec0074dfc","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","impliedFormat":1},{"version":"29f72ec1289ae3aeda78bf14b38086d3d803262ac13904b400422941a26a3636","affectsGlobalScope":true,"impliedFormat":1}],"root":[[47,51],[170,173]],"options":{"allowJs":false,"composite":true,"declaration":true,"declarationMap":true,"downlevelIteration":true,"esModuleInterop":true,"experimentalDecorators":true,"jsx":2,"module":1,"noImplicitAny":true,"outDir":"./","rootDir":"../..","skipLibCheck":true,"sourceMap":true,"strictNullChecks":true,"target":1},"referencedMap":[[174,1],[175,1],[176,1],[177,1],[102,2],[103,2],[104,3],[57,4],[105,5],[106,6],[107,7],[52,1],[55,8],[53,1],[54,1],[108,9],[109,10],[110,11],[111,12],[112,13],[113,14],[114,14],[115,15],[116,16],[117,17],[118,18],[58,1],[56,1],[119,19],[120,20],[121,21],[155,22],[122,23],[123,1],[124,24],[125,25],[126,26],[127,27],[128,28],[129,29],[130,30],[131,31],[132,32],[133,32],[134,33],[135,1],[136,34],[137,35],[139,36],[138,37],[140,38],[141,39],[142,40],[143,41],[144,42],[145,43],[146,44],[147,45],[148,46],[149,47],[150,48],[151,49],[152,50],[59,1],[60,1],[61,1],[99,51],[100,1],[101,1],[153,52],[154,53],[167,54],[168,55],[166,56],[169,57],[163,58],[164,59],[165,60],[159,58],[160,58],[162,61],[161,58],[157,1],[156,62],[158,63],[45,1],[46,1],[8,1],[10,1],[9,1],[2,1],[11,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[18,1],[3,1],[19,1],[20,1],[4,1],[21,1],[25,1],[22,1],[23,1],[24,1],[26,1],[27,1],[28,1],[5,1],[29,1],[30,1],[31,1],[32,1],[6,1],[36,1],[33,1],[34,1],[35,1],[37,1],[7,1],[38,1],[43,1],[44,1],[39,1],[40,1],[41,1],[42,1],[1,1],[77,64],[87,65],[76,64],[97,66],[68,67],[67,68],[96,69],[90,70],[95,71],[70,72],[84,73],[69,74],[93,75],[65,76],[64,69],[94,77],[66,78],[71,79],[72,1],[75,79],[62,1],[98,80],[88,81],[79,82],[80,83],[82,84],[78,85],[81,86],[91,69],[73,87],[74,88],[83,89],[63,90],[86,81],[85,79],[89,1],[92,91],[48,92],[50,93],[49,92],[51,94],[47,1],[170,95],[171,96],[172,97],[173,98]],"latestChangedDtsFile":"./test/removeUserInfoFromUrlTest.d.ts","version":"5.9.3"} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/src/CiEnvironments.d.ts b/node_modules/@cucumber/ci-environment/dist/esm/src/CiEnvironments.d.ts new file mode 100644 index 00000000..0dd3c516 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/src/CiEnvironments.d.ts @@ -0,0 +1,3 @@ +import { CiEnvironment } from './types.js'; +export declare const CiEnvironments: readonly CiEnvironment[]; +//# sourceMappingURL=CiEnvironments.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/src/CiEnvironments.d.ts.map b/node_modules/@cucumber/ci-environment/dist/esm/src/CiEnvironments.d.ts.map new file mode 100644 index 00000000..8315e4ab --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/src/CiEnvironments.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"CiEnvironments.d.ts","sourceRoot":"","sources":["../../../src/CiEnvironments.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE1C,eAAO,MAAM,cAAc,EAAE,SAAS,aAAa,EAgKlD,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/src/CiEnvironments.js b/node_modules/@cucumber/ci-environment/dist/esm/src/CiEnvironments.js new file mode 100644 index 00000000..aaa5c87a --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/src/CiEnvironments.js @@ -0,0 +1,163 @@ +/* This file is auto-generated using npm run build-ci-environments */ +/* eslint-disable no-useless-escape */ +export const CiEnvironments = [ + { + name: 'Azure Pipelines', + url: '${BUILD_BUILDURI}', + buildNumber: '${BUILD_BUILDNUMBER}', + git: { + remote: '${BUILD_REPOSITORY_URI}', + revision: '${BUILD_SOURCEVERSION}', + branch: '${BUILD_SOURCEBRANCH/refs\/heads\/(.*)/\\1}', + tag: '${BUILD_SOURCEBRANCH/refs\/tags\/(.*)/\\1}', + }, + }, + { + name: 'Bamboo', + url: '${bamboo_buildResultsUrl}', + buildNumber: '${bamboo_buildNumber}', + git: { + remote: '${bamboo_planRepository_repositoryUrl}', + revision: '${bamboo_planRepository_revision}', + branch: '${bamboo_planRepository_branch}', + }, + }, + { + name: 'Buddy', + url: '${BUDDY_EXECUTION_URL}', + buildNumber: '${BUDDY_EXECUTION_ID}', + git: { + remote: '${BUDDY_SCM_URL}', + revision: '${BUDDY_EXECUTION_REVISION}', + branch: '${BUDDY_EXECUTION_BRANCH}', + tag: '${BUDDY_EXECUTION_TAG}', + }, + }, + { + name: 'Bitrise', + url: '${BITRISE_BUILD_URL}', + buildNumber: '${BITRISE_BUILD_NUMBER}', + git: { + remote: '${GIT_REPOSITORY_URL}', + revision: '${BITRISE_GIT_COMMIT}', + branch: '${BITRISE_GIT_BRANCH}', + tag: '${BITRISE_GIT_TAG}', + }, + }, + { + name: 'CircleCI', + url: '${CIRCLE_BUILD_URL}', + buildNumber: '${CIRCLE_BUILD_NUM}', + git: { + remote: '${CIRCLE_REPOSITORY_URL}', + revision: '${CIRCLE_SHA1}', + branch: '${CIRCLE_BRANCH}', + tag: '${CIRCLE_TAG}', + }, + }, + { + name: 'CodeFresh', + url: '${CF_BUILD_URL}', + buildNumber: '${CF_BUILD_ID}', + git: { + remote: '${CF_COMMIT_URL/(.*)\\/commit.+$/\\1}.git', + revision: '${CF_REVISION}', + branch: '${CF_BRANCH}', + }, + }, + { + name: 'CodeShip', + url: '${CI_BUILD_URL}', + buildNumber: '${CI_BUILD_NUMBER}', + git: { + remote: '${CI_PULL_REQUEST/(.*)\\/pull\\/\\d+/\\1.git}', + revision: '${CI_COMMIT_ID}', + branch: '${CI_BRANCH}', + }, + }, + { + name: 'GitHub Actions', + url: '${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}', + buildNumber: '${GITHUB_RUN_ID}', + git: { + remote: '${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}.git', + revision: '${GITHUB_SHA}', + branch: '${GITHUB_HEAD_REF}', + tag: '${GITHUB_REF/refs\/tags\/(.*)/\\1}', + }, + }, + { + name: 'GitLab', + url: '${CI_JOB_URL}', + buildNumber: '${CI_JOB_ID}', + git: { + remote: '${CI_REPOSITORY_URL}', + revision: '${CI_COMMIT_SHA}', + branch: '${CI_COMMIT_BRANCH}', + tag: '${CI_COMMIT_TAG}', + }, + }, + { + name: 'GoCD', + url: '${GO_SERVER_URL}/pipelines/${GO_PIPELINE_NAME}/${GO_PIPELINE_COUNTER}/${GO_STAGE_NAME}/${GO_STAGE_COUNTER}', + buildNumber: '${GO_PIPELINE_NAME}/${GO_PIPELINE_COUNTER}/${GO_STAGE_NAME}/${GO_STAGE_COUNTER}', + git: { + remote: '${GO_SCM_*_PR_URL/(.*)\\/pull\\/\\d+/\\1.git}', + revision: '${GO_REVISION}', + branch: '${GO_SCM_*_PR_BRANCH/.*:(.*)/\\1}', + }, + }, + { + name: 'Jenkins', + url: '${BUILD_URL}', + buildNumber: '${BUILD_NUMBER}', + git: { + remote: '${GIT_URL}', + revision: '${GIT_COMMIT}', + branch: '${GIT_LOCAL_BRANCH}', + }, + }, + { + name: 'JetBrains Space', + url: '${JB_SPACE_EXECUTION_URL}', + buildNumber: '${JB_SPACE_EXECUTION_NUMBER}', + git: { + remote: 'https://${JB_SPACE_API_URL}/p/${JB_SPACE_PROJECT_KEY}/repositories/${JB_SPACE_GIT_REPOSITORY_NAME}', + revision: '${JB_SPACE_GIT_REVISION}', + branch: '${JB_SPACE_GIT_BRANCH}', + }, + }, + { + name: 'Semaphore', + url: '${SEMAPHORE_ORGANIZATION_URL}/jobs/${SEMAPHORE_JOB_ID}', + buildNumber: '${SEMAPHORE_JOB_ID}', + git: { + remote: '${SEMAPHORE_GIT_URL}', + revision: '${SEMAPHORE_GIT_SHA}', + branch: '${SEMAPHORE_GIT_BRANCH}', + tag: '${SEMAPHORE_GIT_TAG_NAME}', + }, + }, + { + name: 'Travis CI', + url: '${TRAVIS_BUILD_WEB_URL}', + buildNumber: '${TRAVIS_JOB_NUMBER}', + git: { + remote: 'https://github.com/${TRAVIS_REPO_SLUG}.git', + revision: '${TRAVIS_COMMIT}', + branch: '${TRAVIS_BRANCH}', + tag: '${TRAVIS_TAG}', + }, + }, + { + name: 'Wercker', + url: '${WERCKER_RUN_URL}', + buildNumber: '${WERCKER_RUN_URL/.*\\/([^\\/]+)$/\\1}', + git: { + remote: 'https://${WERCKER_GIT_DOMAIN}/${WERCKER_GIT_OWNER}/${WERCKER_GIT_REPOSITORY}.git', + revision: '${WERCKER_GIT_COMMIT}', + branch: '${WERCKER_GIT_BRANCH}', + }, + }, +]; +//# sourceMappingURL=CiEnvironments.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/src/CiEnvironments.js.map b/node_modules/@cucumber/ci-environment/dist/esm/src/CiEnvironments.js.map new file mode 100644 index 00000000..b01443b0 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/src/CiEnvironments.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CiEnvironments.js","sourceRoot":"","sources":["../../../src/CiEnvironments.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/src/detectCiEnvironment.d.ts b/node_modules/@cucumber/ci-environment/dist/esm/src/detectCiEnvironment.d.ts new file mode 100644 index 00000000..1ca9a50b --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/src/detectCiEnvironment.d.ts @@ -0,0 +1,4 @@ +import { CiEnvironment, Env } from './types.js'; +export default function detectCiEnvironment(env: Env): CiEnvironment | undefined; +export declare function removeUserInfoFromUrl(value: string): string; +//# sourceMappingURL=detectCiEnvironment.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/src/detectCiEnvironment.d.ts.map b/node_modules/@cucumber/ci-environment/dist/esm/src/detectCiEnvironment.d.ts.map new file mode 100644 index 00000000..989bad7b --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/src/detectCiEnvironment.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"detectCiEnvironment.d.ts","sourceRoot":"","sources":["../../../src/detectCiEnvironment.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,GAAG,EAAO,MAAM,YAAY,CAAA;AAEpD,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,GAAG,EAAE,GAAG,GAAG,aAAa,GAAG,SAAS,CAO/E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAU3D"} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/src/detectCiEnvironment.js b/node_modules/@cucumber/ci-environment/dist/esm/src/detectCiEnvironment.js new file mode 100644 index 00000000..61d74f8c --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/src/detectCiEnvironment.js @@ -0,0 +1,66 @@ +import { readFileSync } from 'fs'; +import { CiEnvironments } from './CiEnvironments.js'; +import evaluateVariableExpression from './evaluateVariableExpression.js'; +export default function detectCiEnvironment(env) { + for (const ciEnvironment of CiEnvironments) { + const detected = detect(ciEnvironment, env); + if (detected) { + return detected; + } + } +} +export function removeUserInfoFromUrl(value) { + if (!value) + return value; + try { + const url = new URL(value); + url.password = ''; + url.username = ''; + return url.toString(); + } + catch (_) { + return value; + } +} +function detectGit(ciEnvironment, env) { + var _a, _b, _c; + const revision = detectRevision(ciEnvironment, env); + if (!revision) { + return undefined; + } + const remote = evaluateVariableExpression((_a = ciEnvironment.git) === null || _a === void 0 ? void 0 : _a.remote, env); + if (!remote) { + return undefined; + } + const tag = evaluateVariableExpression((_b = ciEnvironment.git) === null || _b === void 0 ? void 0 : _b.tag, env); + const branch = evaluateVariableExpression((_c = ciEnvironment.git) === null || _c === void 0 ? void 0 : _c.branch, env); + return Object.assign(Object.assign({ revision, remote: removeUserInfoFromUrl(remote) }, (tag && { tag })), (branch && { branch })); +} +function detectRevision(ciEnvironment, env) { + var _a, _b, _c; + if (env.GITHUB_EVENT_NAME === 'pull_request') { + if (!env.GITHUB_EVENT_PATH) + throw new Error('GITHUB_EVENT_PATH not set'); + const json = readFileSync(env.GITHUB_EVENT_PATH, 'utf-8'); + const event = JSON.parse(json); + const revision = (_b = (_a = event.pull_request) === null || _a === void 0 ? void 0 : _a.head) === null || _b === void 0 ? void 0 : _b.sha; + if (!revision) { + throw new Error(`Could not find .pull_request.head.sha in ${env.GITHUB_EVENT_PATH}:\n${JSON.stringify(event, null, 2)}`); + } + return revision; + } + return evaluateVariableExpression((_c = ciEnvironment.git) === null || _c === void 0 ? void 0 : _c.revision, env); +} +function detect(ciEnvironment, env) { + const url = evaluateVariableExpression(ciEnvironment.url, env); + if (url === undefined) { + // The url is what consumers will use as the primary key for a build + // If this cannot be determined, we return nothing. + return undefined; + } + const buildNumber = evaluateVariableExpression(ciEnvironment.buildNumber, env); + const git = detectGit(ciEnvironment, env); + return Object.assign({ name: ciEnvironment.name, url, + buildNumber }, (git && { git })); +} +//# sourceMappingURL=detectCiEnvironment.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/src/detectCiEnvironment.js.map b/node_modules/@cucumber/ci-environment/dist/esm/src/detectCiEnvironment.js.map new file mode 100644 index 00000000..c402a5ac --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/src/detectCiEnvironment.js.map @@ -0,0 +1 @@ +{"version":3,"file":"detectCiEnvironment.js","sourceRoot":"","sources":["../../../src/detectCiEnvironment.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/src/evaluateVariableExpression.d.ts b/node_modules/@cucumber/ci-environment/dist/esm/src/evaluateVariableExpression.d.ts new file mode 100644 index 00000000..d0faefb6 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/src/evaluateVariableExpression.d.ts @@ -0,0 +1,3 @@ +import { Env } from './types.js'; +export default function evaluateVariableExpression(expression: string | undefined, env: Env): string | undefined; +//# sourceMappingURL=evaluateVariableExpression.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/src/evaluateVariableExpression.d.ts.map b/node_modules/@cucumber/ci-environment/dist/esm/src/evaluateVariableExpression.d.ts.map new file mode 100644 index 00000000..15f17eab --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/src/evaluateVariableExpression.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"evaluateVariableExpression.d.ts","sourceRoot":"","sources":["../../../src/evaluateVariableExpression.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAA;AAEhC,MAAM,CAAC,OAAO,UAAU,0BAA0B,CAChD,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,GAAG,EAAE,GAAG,GACP,MAAM,GAAG,SAAS,CAgCpB"} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/src/evaluateVariableExpression.js b/node_modules/@cucumber/ci-environment/dist/esm/src/evaluateVariableExpression.js new file mode 100644 index 00000000..abc2d652 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/src/evaluateVariableExpression.js @@ -0,0 +1,46 @@ +export default function evaluateVariableExpression(expression, env) { + if (expression === undefined) { + return undefined; + } + try { + const re = new RegExp('\\${(.*?)(?:(? { + const variable = args[0]; + const value = getValue(env, variable); + if (value === undefined) { + throw new Error(`Undefined variable: ${variable}`); + } + const pattern = args[1]; + if (!pattern) { + return value; + } + const regExp = new RegExp(pattern.replace('/', '/')); + const match = regExp.exec(value); + if (!match) { + throw new Error(`No match for: ${variable}`); + } + let replacement = args[2]; + let ref = 1; + for (const group of match.slice(1)) { + replacement = replacement.replace(`\\${ref++}`, group); + } + return replacement; + }); + } + catch (_) { + // There was an undefined variable + return undefined; + } +} +function getValue(env, variable) { + if (variable.includes('*')) { + const regexp = new RegExp(variable.replace('*', '.*')); + for (const [name, value] of Object.entries(env)) { + if (regexp.exec(name)) { + return value; + } + } + } + return env[variable]; +} +//# sourceMappingURL=evaluateVariableExpression.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/src/evaluateVariableExpression.js.map b/node_modules/@cucumber/ci-environment/dist/esm/src/evaluateVariableExpression.js.map new file mode 100644 index 00000000..afb96782 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/src/evaluateVariableExpression.js.map @@ -0,0 +1 @@ +{"version":3,"file":"evaluateVariableExpression.js","sourceRoot":"","sources":["../../../src/evaluateVariableExpression.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,UAAU,0BAA0B,CAChD,UAA8B,EAC9B,GAAQ;IAER,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAA;QAChE,OAAO,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,SAAS,EAAE,GAAG,IAAI,EAAU,EAAE;YAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;YACxB,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;YACrC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,EAAE,CAAC,CAAA;YACpD,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;YACvB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,KAAK,CAAA;YACd,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;YACpD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAChC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAA;YAC9C,CAAC;YACD,IAAI,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;YACzB,IAAI,GAAG,GAAG,CAAC,CAAA;YACX,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnC,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,CAAA;YACxD,CAAC;YACD,OAAO,WAAW,CAAA;QACpB,CAAC,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,kCAAkC;QAClC,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,GAAQ,EAAE,QAAgB;IAC1C,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAA;QACtD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAChD,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtB,OAAO,KAAK,CAAA;YACd,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAA;AACtB,CAAC"} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/src/index.d.ts b/node_modules/@cucumber/ci-environment/dist/esm/src/index.d.ts new file mode 100644 index 00000000..3c2b8b37 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/src/index.d.ts @@ -0,0 +1,4 @@ +import detectCiEnvironment from './detectCiEnvironment.js'; +export * from './types.js'; +export default detectCiEnvironment; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/src/index.d.ts.map b/node_modules/@cucumber/ci-environment/dist/esm/src/index.d.ts.map new file mode 100644 index 00000000..bbd53591 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/src/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,MAAM,0BAA0B,CAAA;AAE1D,cAAc,YAAY,CAAA;AAC1B,eAAe,mBAAmB,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/src/index.js b/node_modules/@cucumber/ci-environment/dist/esm/src/index.js new file mode 100644 index 00000000..e85cea61 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/src/index.js @@ -0,0 +1,4 @@ +import detectCiEnvironment from './detectCiEnvironment.js'; +export * from './types.js'; +export default detectCiEnvironment; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/src/index.js.map b/node_modules/@cucumber/ci-environment/dist/esm/src/index.js.map new file mode 100644 index 00000000..f9648dc7 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/src/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,MAAM,0BAA0B,CAAA;AAE1D,cAAc,YAAY,CAAA;AAC1B,eAAe,mBAAmB,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/src/types.d.ts b/node_modules/@cucumber/ci-environment/dist/esm/src/types.d.ts new file mode 100644 index 00000000..a653b27c --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/src/types.d.ts @@ -0,0 +1,17 @@ +export type CiEnvironment = { + name: string; + url: string; + buildNumber?: string; + git?: Git; +}; +export type Git = { + remote: string; + revision: string; + branch?: string; + tag?: string; +}; +export type CiEnvironments = { + ciEnvironments: readonly CiEnvironment[]; +}; +export type Env = Record; +//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/src/types.d.ts.map b/node_modules/@cucumber/ci-environment/dist/esm/src/types.d.ts.map new file mode 100644 index 00000000..a78aa282 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/src/types.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,GAAG,CAAC,EAAE,GAAG,CAAA;CACV,CAAA;AAED,MAAM,MAAM,GAAG,GAAG;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,cAAc,EAAE,SAAS,aAAa,EAAE,CAAA;CACzC,CAAA;AAED,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/src/types.js b/node_modules/@cucumber/ci-environment/dist/esm/src/types.js new file mode 100644 index 00000000..718fd38a --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/src/types.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/src/types.js.map b/node_modules/@cucumber/ci-environment/dist/esm/src/types.js.map new file mode 100644 index 00000000..70453b7a --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/src/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/test/acceptanceTest.d.ts b/node_modules/@cucumber/ci-environment/dist/esm/test/acceptanceTest.d.ts new file mode 100644 index 00000000..d74d9980 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/test/acceptanceTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=acceptanceTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/test/acceptanceTest.d.ts.map b/node_modules/@cucumber/ci-environment/dist/esm/test/acceptanceTest.d.ts.map new file mode 100644 index 00000000..2fe39e4a --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/test/acceptanceTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"acceptanceTest.d.ts","sourceRoot":"","sources":["../../../test/acceptanceTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/test/acceptanceTest.js b/node_modules/@cucumber/ci-environment/dist/esm/test/acceptanceTest.js new file mode 100644 index 00000000..71687923 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/test/acceptanceTest.js @@ -0,0 +1,20 @@ +import assert from 'assert'; +import fs from 'fs'; +import { sync } from 'glob'; +import path from 'path'; +import detectCiEnvironment from '../src/index.js'; +describe('detectCiEnvironment', () => { + for (const txt of sync(`../testdata/src/*.txt`)) { + it(`detects ${path.basename(txt, '.txt')}`, () => { + const envData = fs.readFileSync(txt, { encoding: 'utf8' }); + const entries = envData.split(/\n/).map((line) => line.split(/=/)); + const env = Object.fromEntries(entries); + const ciEnvironment = detectCiEnvironment(env); + const expectedJson = fs.readFileSync(`${txt}.json`, { + encoding: 'utf8', + }); + assert.deepStrictEqual(ciEnvironment, JSON.parse(expectedJson)); + }); + } +}); +//# sourceMappingURL=acceptanceTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/test/acceptanceTest.js.map b/node_modules/@cucumber/ci-environment/dist/esm/test/acceptanceTest.js.map new file mode 100644 index 00000000..7b811234 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/test/acceptanceTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"acceptanceTest.js","sourceRoot":"","sources":["../../../test/acceptanceTest.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,OAAO,mBAAiC,MAAM,iBAAiB,CAAA;AAE/D,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC;QAChD,EAAE,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE;YAC/C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAA;YAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;YAClE,MAAM,GAAG,GAAQ,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;YAC5C,MAAM,aAAa,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAA;YAE9C,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,GAAG,OAAO,EAAE;gBAClD,QAAQ,EAAE,MAAM;aACjB,CAAC,CAAA;YACF,MAAM,CAAC,eAAe,CAAC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAA;QACjE,CAAC,CAAC,CAAA;IACJ,CAAC;AACH,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/test/evaluateVariableExpressionTest.d.ts b/node_modules/@cucumber/ci-environment/dist/esm/test/evaluateVariableExpressionTest.d.ts new file mode 100644 index 00000000..2f18d359 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/test/evaluateVariableExpressionTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=evaluateVariableExpressionTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/test/evaluateVariableExpressionTest.d.ts.map b/node_modules/@cucumber/ci-environment/dist/esm/test/evaluateVariableExpressionTest.d.ts.map new file mode 100644 index 00000000..0b9c4b5e --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/test/evaluateVariableExpressionTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"evaluateVariableExpressionTest.d.ts","sourceRoot":"","sources":["../../../test/evaluateVariableExpressionTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/test/evaluateVariableExpressionTest.js b/node_modules/@cucumber/ci-environment/dist/esm/test/evaluateVariableExpressionTest.js new file mode 100644 index 00000000..ee511c18 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/test/evaluateVariableExpressionTest.js @@ -0,0 +1,35 @@ +import assert from 'assert'; +import evaluateVariableExpression from '../src/evaluateVariableExpression.js'; +describe('createMeta', () => { + it('returns undefined when a variable is undefined', () => { + const expression = 'hello-${SOME_VAR}'; + const result = evaluateVariableExpression(expression, {}); + assert.strictEqual(result, undefined); + }); + it('gets a value without replacement', () => { + const expression = '${SOME_VAR}'; + const result = evaluateVariableExpression(expression, { SOME_VAR: 'some_value' }); + assert.strictEqual(result, 'some_value'); + }); + it('captures a group', () => { + const expression = '${SOME_REF/refs\\/heads\\/(.*)/\\1}'; + const result = evaluateVariableExpression(expression, { SOME_REF: 'refs/heads/main' }); + assert.strictEqual(result, 'main'); + }); + it('works with star wildcard in var', () => { + const expression = '${GO_SCM_*_PR_BRANCH/.*:(.*)/\\1}'; + const result = evaluateVariableExpression(expression, { + GO_SCM_MY_MATERIAL_PR_BRANCH: 'ashwankthkumar:feature-1', + }); + assert.strictEqual(result, 'feature-1'); + }); + it('evaluates a complex expression', () => { + const expression = 'hello-${VAR1}-${VAR2/(.*) (.*)/\\2-\\1}-world'; + const result = evaluateVariableExpression(expression, { + VAR1: 'amazing', + VAR2: 'gorgeous beautiful', + }); + assert.strictEqual(result, 'hello-amazing-beautiful-gorgeous-world'); + }); +}); +//# sourceMappingURL=evaluateVariableExpressionTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/test/evaluateVariableExpressionTest.js.map b/node_modules/@cucumber/ci-environment/dist/esm/test/evaluateVariableExpressionTest.js.map new file mode 100644 index 00000000..4fe03d45 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/test/evaluateVariableExpressionTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"evaluateVariableExpressionTest.js","sourceRoot":"","sources":["../../../test/evaluateVariableExpressionTest.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAE3B,OAAO,0BAA0B,MAAM,sCAAsC,CAAA;AAE7E,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,UAAU,GAAG,mBAAmB,CAAA;QACtC,MAAM,MAAM,GAAG,0BAA0B,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;QACzD,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,UAAU,GAAG,aAAa,CAAA;QAChC,MAAM,MAAM,GAAG,0BAA0B,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAA;QACjF,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC1B,MAAM,UAAU,GAAG,qCAAqC,CAAA;QACxD,MAAM,MAAM,GAAG,0BAA0B,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAA;QACtF,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,UAAU,GAAG,mCAAmC,CAAA;QACtD,MAAM,MAAM,GAAG,0BAA0B,CAAC,UAAU,EAAE;YACpD,4BAA4B,EAAE,0BAA0B;SACzD,CAAC,CAAA;QACF,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,UAAU,GAAG,+CAA+C,CAAA;QAClE,MAAM,MAAM,GAAG,0BAA0B,CAAC,UAAU,EAAE;YACpD,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,oBAAoB;SAC3B,CAAC,CAAA;QACF,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,wCAAwC,CAAC,CAAA;IACtE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/test/gitHubPullRequestIntegrationTest.d.ts b/node_modules/@cucumber/ci-environment/dist/esm/test/gitHubPullRequestIntegrationTest.d.ts new file mode 100644 index 00000000..c2fcb4c7 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/test/gitHubPullRequestIntegrationTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=gitHubPullRequestIntegrationTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/test/gitHubPullRequestIntegrationTest.d.ts.map b/node_modules/@cucumber/ci-environment/dist/esm/test/gitHubPullRequestIntegrationTest.d.ts.map new file mode 100644 index 00000000..695ecca3 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/test/gitHubPullRequestIntegrationTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"gitHubPullRequestIntegrationTest.d.ts","sourceRoot":"","sources":["../../../test/gitHubPullRequestIntegrationTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/test/gitHubPullRequestIntegrationTest.js b/node_modules/@cucumber/ci-environment/dist/esm/test/gitHubPullRequestIntegrationTest.js new file mode 100644 index 00000000..adae2fe4 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/test/gitHubPullRequestIntegrationTest.js @@ -0,0 +1,13 @@ +import assert from 'assert'; +import detectCiEnvironment from '../src/index.js'; +describe('GitHub', () => { + if (process.env.GITHUB_EVENT_NAME === 'pull_request') { + it('detects the correct revision for pull requests', () => { + const ciEnvironment = detectCiEnvironment(process.env); + assert(ciEnvironment); + console.log('Manually verify that the revision is correct'); + console.log(JSON.stringify(ciEnvironment, null, 2)); + }); + } +}); +//# sourceMappingURL=gitHubPullRequestIntegrationTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/test/gitHubPullRequestIntegrationTest.js.map b/node_modules/@cucumber/ci-environment/dist/esm/test/gitHubPullRequestIntegrationTest.js.map new file mode 100644 index 00000000..3aeff37c --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/test/gitHubPullRequestIntegrationTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"gitHubPullRequestIntegrationTest.js","sourceRoot":"","sources":["../../../test/gitHubPullRequestIntegrationTest.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAE3B,OAAO,mBAAmB,MAAM,iBAAiB,CAAA;AAEjD,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,cAAc,EAAE,CAAC;QACrD,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,aAAa,GAAG,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YACtD,MAAM,CAAC,aAAa,CAAC,CAAA;YACrB,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAA;YAC3D,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QACrD,CAAC,CAAC,CAAA;IACJ,CAAC;AACH,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/test/removeUserInfoFromUrlTest.d.ts b/node_modules/@cucumber/ci-environment/dist/esm/test/removeUserInfoFromUrlTest.d.ts new file mode 100644 index 00000000..e0ae5847 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/test/removeUserInfoFromUrlTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=removeUserInfoFromUrlTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/test/removeUserInfoFromUrlTest.d.ts.map b/node_modules/@cucumber/ci-environment/dist/esm/test/removeUserInfoFromUrlTest.d.ts.map new file mode 100644 index 00000000..7e1331b1 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/test/removeUserInfoFromUrlTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"removeUserInfoFromUrlTest.d.ts","sourceRoot":"","sources":["../../../test/removeUserInfoFromUrlTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/test/removeUserInfoFromUrlTest.js b/node_modules/@cucumber/ci-environment/dist/esm/test/removeUserInfoFromUrlTest.js new file mode 100644 index 00000000..6cba8aa7 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/test/removeUserInfoFromUrlTest.js @@ -0,0 +1,22 @@ +import assert from 'assert'; +import { removeUserInfoFromUrl } from '../src/detectCiEnvironment.js'; +describe('removeUserInfoFromUrl', () => { + it('returns empty string for empty string', () => { + assert.strictEqual(removeUserInfoFromUrl(''), ''); + }); + it('leaves the data intact when no sensitive information is detected', () => { + assert.strictEqual(removeUserInfoFromUrl('pretty safe'), 'pretty safe'); + }); + context('with URLs', () => { + it('leaves intact when no password is found', () => { + assert.strictEqual(removeUserInfoFromUrl('https://example.com/git/repo.git'), 'https://example.com/git/repo.git'); + }); + it('removes credentials when found', () => { + assert.strictEqual(removeUserInfoFromUrl('http://aslak@example.com/git/repo.git'), 'http://example.com/git/repo.git'); + }); + it('removes credentials and passwords when found', () => { + assert.strictEqual(removeUserInfoFromUrl('ssh://login:password@example.com/git/repo.git'), 'ssh://example.com/git/repo.git'); + }); + }); +}); +//# sourceMappingURL=removeUserInfoFromUrlTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/test/removeUserInfoFromUrlTest.js.map b/node_modules/@cucumber/ci-environment/dist/esm/test/removeUserInfoFromUrlTest.js.map new file mode 100644 index 00000000..3754aa3a --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/test/removeUserInfoFromUrlTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"removeUserInfoFromUrlTest.js","sourceRoot":"","sources":["../../../test/removeUserInfoFromUrlTest.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAE3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAA;AAErE,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,WAAW,CAAC,qBAAqB,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,CAAC,WAAW,CAAC,qBAAqB,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC,CAAA;IACzE,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,WAAW,EAAE,GAAG,EAAE;QACxB,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,CAAC,WAAW,CAChB,qBAAqB,CAAC,kCAAkC,CAAC,EACzD,kCAAkC,CACnC,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,CAAC,WAAW,CAChB,qBAAqB,CAAC,uCAAuC,CAAC,EAC9D,iCAAiC,CAClC,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,CAAC,WAAW,CAChB,qBAAqB,CAAC,+CAA+C,CAAC,EACtE,gCAAgC,CACjC,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/dist/esm/tsconfig.build-esm.tsbuildinfo b/node_modules/@cucumber/ci-environment/dist/esm/tsconfig.build-esm.tsbuildinfo new file mode 100644 index 00000000..4fcaa8ba --- /dev/null +++ b/node_modules/@cucumber/ci-environment/dist/esm/tsconfig.build-esm.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../src/types.ts","../../src/CiEnvironments.ts","../../src/evaluateVariableExpression.ts","../../src/detectCiEnvironment.ts","../../src/index.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/@types/node/web-globals/events.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/inspector.generated.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/minipass/dist/commonjs/index.d.ts","../../node_modules/lru-cache/dist/commonjs/index.d.ts","../../node_modules/path-scurry/dist/commonjs/index.d.ts","../../node_modules/glob/node_modules/minimatch/dist/commonjs/ast.d.ts","../../node_modules/glob/node_modules/minimatch/dist/commonjs/escape.d.ts","../../node_modules/glob/node_modules/minimatch/dist/commonjs/unescape.d.ts","../../node_modules/glob/node_modules/minimatch/dist/commonjs/index.d.ts","../../node_modules/glob/dist/commonjs/pattern.d.ts","../../node_modules/glob/dist/commonjs/processor.d.ts","../../node_modules/glob/dist/commonjs/walker.d.ts","../../node_modules/glob/dist/commonjs/ignore.d.ts","../../node_modules/glob/dist/commonjs/glob.d.ts","../../node_modules/glob/dist/commonjs/has-magic.d.ts","../../node_modules/glob/dist/commonjs/index.d.ts","../../test/acceptanceTest.ts","../../test/evaluateVariableExpressionTest.ts","../../test/gitHubPullRequestIntegrationTest.ts","../../test/removeUserInfoFromUrlTest.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/json5/index.d.ts","../../node_modules/@types/mocha/index.d.ts"],"fileIdsList":[[57,105,122,123],[57,102,103,105,122,123],[57,104,105,122,123],[105,122,123],[57,105,110,122,123,140],[57,105,106,111,116,122,123,125,137,148],[57,105,106,107,116,122,123,125],[52,53,54,57,105,122,123],[57,105,108,122,123,149],[57,105,109,110,117,122,123,126],[57,105,110,122,123,137,145],[57,105,111,113,116,122,123,125],[57,104,105,112,122,123],[57,105,113,114,122,123],[57,105,115,116,122,123],[57,104,105,116,122,123],[57,105,116,117,118,122,123,137,148],[57,105,116,117,118,122,123,132,137,140],[57,98,105,113,116,119,122,123,125,137,148],[57,105,116,117,119,120,122,123,125,137,145,148],[57,105,119,121,122,123,137,145,148],[55,56,57,58,59,60,61,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154],[57,105,116,122,123],[57,105,122,123,124,148],[57,105,113,116,122,123,125,137],[57,105,122,123,126],[57,105,122,123,127],[57,104,105,122,123,128],[57,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154],[57,105,122,123,130],[57,105,122,123,131],[57,105,116,122,123,132,133],[57,105,122,123,132,134,149,151],[57,105,117,122,123],[57,105,116,122,123,137,138,140],[57,105,122,123,139,140],[57,105,122,123,137,138],[57,105,122,123,140],[57,105,122,123,141],[57,102,105,122,123,137,142],[57,105,116,122,123,143,144],[57,105,122,123,143,144],[57,105,110,122,123,125,137,145],[57,105,122,123,146],[57,105,122,123,125,147],[57,105,119,122,123,131,148],[57,105,110,122,123,149],[57,105,122,123,137,150],[57,105,122,123,124,151],[57,105,122,123,152],[57,98,105,122,123],[57,98,105,116,118,122,123,128,137,140,148,150,151,153],[57,105,122,123,137,154],[57,105,122,123,156,158,162,163,166],[57,105,122,123,167],[57,105,122,123,158,162,165],[57,105,122,123,156,158,162,165,166,167,168],[57,105,122,123,162],[57,105,122,123,158,162,163,165],[57,105,122,123,156,158,163,164,166],[57,105,122,123,159,160,161],[57,105,116,122,123,141,155],[57,105,117,122,123,127,156,157],[57,70,74,105,122,123,148],[57,70,105,122,123,137,148],[57,65,105,122,123],[57,67,70,105,122,123,145,148],[57,105,122,123,125,145],[57,105,122,123,155],[57,65,105,122,123,155],[57,67,70,105,122,123,125,148],[57,62,63,66,69,105,116,122,123,137,148],[57,70,77,105,122,123],[57,62,68,105,122,123],[57,70,91,92,105,122,123],[57,66,70,105,122,123,140,148,155],[57,91,105,122,123,155],[57,64,65,105,122,123,155],[57,70,105,122,123],[57,64,65,66,67,68,69,70,71,72,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,92,93,94,95,96,97,105,122,123],[57,70,85,105,122,123],[57,70,77,78,105,122,123],[57,68,70,78,79,105,122,123],[57,69,105,122,123],[57,62,65,70,105,122,123],[57,70,74,78,79,105,122,123],[57,74,105,122,123],[57,68,70,73,105,122,123,148],[57,62,67,70,77,105,122,123],[57,105,122,123,137],[57,65,70,91,105,122,123,153,155],[47,57,105,122,123],[47,48,49,57,105,117,122,123],[47,50,57,105,122,123],[51,57,102,105,117,122,123,127,169],[49,57,102,105,122,123],[51,57,102,105,122,123],[50,57,102,105,122,123]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"9584227b611f65058fdf9d04b648f35b6d05441582b8586d96a356ac19448c0a","signature":"8be2a46b61cf1681e570b70c8a9c6ab5b4beef825836b02e33da0d1de98fcf83"},{"version":"be2d886af4020bb2146c78876c2846769b7d52afe668005644c0bdc5a554453d","signature":"afa45ce668f64ede390cdc539249afa1f79a80550e79a12cee545ac05a0ddd20"},{"version":"74c947a817aa4d532ca74bc47f913a44591f47ac52c95a704670c89ba9b94211","signature":"ddf341c36cecf3851b23139d9cbecba36388984de004e786bd19fb6ed62ea1d2"},{"version":"4262c45efb4852f9f59f5ca4d2fd6795860f60bd325d5d66487f37bd74b4e2f7","signature":"9177d9f96314c05220cd62c56196487853d3678605d745e78a7407072a8cf7d8"},{"version":"09b50c5632abc08b7c1ffaade3d118602a3b8d20564dd659cd6e28b54c88f083","signature":"6deeb17028e6d068f9018204cdf2f4bc465b20f44b7dd2b9cdad41e43bef2237"},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"2cbe0621042e2a68c7cbce5dfed3906a1862a16a7d496010636cdbdb91341c0f","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"bb45cd435da536500f1d9692a9b49d0c570b763ccbf00473248b777f5c1f353b","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"83e63d6ccf8ec004a3bb6d58b9bb0104f60e002754b1e968024b320730cc5311","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d2bc7425ef40526650d6db7e072c1ff4a51101c3ac2cc4b666623b19496a6e27","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"f27524f4bef4b6519c604bdb23bf4465bddcccbf3f003abb901acbd0d7404d99","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"dba28a419aec76ed864ef43e5f577a5c99a010c32e5949fe4e17a4d57c58dd11","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c959a391a75be9789b43c8468f71e3fa06488b4d691d5729dde1416dcd38225b","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"0dba70b3fb0dcd713fda33c2df64fa6751fff6460e536971cee917260fb17882","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"9f663c2f91127ef7024e8ca4b3b4383ff2770e5f826696005de382282794b127","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1},{"version":"041597c12abeaa2ef07766775955fc87cfc65c43e0fe86c836071bea787e967c","impliedFormat":1},{"version":"0838507efff4f479c6f603ec812810ddfe14ab32abf8f4a8def140be970fe439","impliedFormat":1},{"version":"072f583571d6e3d30cd9760ee3485d29484fb7b54ba772ac135c747a380096a1","impliedFormat":1},{"version":"7212c2d58855b8df35275180e97903a4b6093d4fbaefea863d8d028da63938c6","impliedFormat":1},{"version":"d8a6b3f899917210f00ddf13b564a2a4fdcf1e50c5a22e8d3abcfd4f1c4f9ae1","impliedFormat":1},{"version":"fd5eab954b31e761a72234031dadc3aab768763942a9637e380aed441cc94f59","impliedFormat":1},{"version":"c7aaac3119acf27e03190cc4224f1d81c7498cf6b36fa72d10d99f2c41d1bbc0","impliedFormat":1},{"version":"dd9faff42b456b5f03b85d8fbd64838eb92f6f7b03b36322cbc59c005b7033d3","impliedFormat":1},{"version":"6ff702721d87c0ba8e7f8950e7b0a3b009dfd912fab3997e0b63fab8d83919c3","impliedFormat":1},{"version":"9dce9fc12e9a79d1135699d525aa6b44b71a45e32e3fa0cf331060b980b16317","impliedFormat":1},{"version":"586b2fd8a7d582329658aaceec22f8a5399e05013deb49bcfde28f95f093c8ee","impliedFormat":1},{"version":"59c44b081724d4ab8039988aba34ee6b3bd41c30fc2d8686f4ed06588397b2f7","impliedFormat":1},{"version":"ef1f3eadd7bed282de45bafd7c2c00105cf1db93e22f6cd763bec8a9c2cf6df1","impliedFormat":1},{"version":"2b90463c902dbe4f5bbb9eae084c05de37477c17a5de1e342eb7cbc9410dc6a1","impliedFormat":1},{"version":"7f85e915e642bfc7f4fcaf10c174b12d4156e330e8377dfacd094bde441fe96c","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"f625adde8864834f8467ca8c51a91ebb7104f53b16cf8ebd8130b0279f55a9e3","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"e1cc9b7856fba8e77b161e3f9369830b76798139db320cdf92cc35f67e4006d6","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"dda4432f51c9958410acdf1b09a2d3cb898222d318ba188e8754234533a3e39d","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"785b9d575b49124ce01b46f5b9402157c7611e6532effa562ac6aebec0074dfc","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","impliedFormat":1},{"version":"29f72ec1289ae3aeda78bf14b38086d3d803262ac13904b400422941a26a3636","affectsGlobalScope":true,"impliedFormat":1}],"root":[[47,51],[170,173]],"options":{"allowJs":false,"composite":true,"declaration":true,"declarationMap":true,"downlevelIteration":true,"esModuleInterop":true,"experimentalDecorators":true,"jsx":2,"module":5,"noImplicitAny":true,"outDir":"./","rootDir":"../..","skipLibCheck":true,"sourceMap":true,"strictNullChecks":true,"target":2},"referencedMap":[[174,1],[175,1],[176,1],[177,1],[102,2],[103,2],[104,3],[57,4],[105,5],[106,6],[107,7],[52,1],[55,8],[53,1],[54,1],[108,9],[109,10],[110,11],[111,12],[112,13],[113,14],[114,14],[115,15],[116,16],[117,17],[118,18],[58,1],[56,1],[119,19],[120,20],[121,21],[155,22],[122,23],[123,1],[124,24],[125,25],[126,26],[127,27],[128,28],[129,29],[130,30],[131,31],[132,32],[133,32],[134,33],[135,1],[136,34],[137,35],[139,36],[138,37],[140,38],[141,39],[142,40],[143,41],[144,42],[145,43],[146,44],[147,45],[148,46],[149,47],[150,48],[151,49],[152,50],[59,1],[60,1],[61,1],[99,51],[100,1],[101,1],[153,52],[154,53],[167,54],[168,55],[166,56],[169,57],[163,58],[164,59],[165,60],[159,58],[160,58],[162,61],[161,58],[157,1],[156,62],[158,63],[45,1],[46,1],[8,1],[10,1],[9,1],[2,1],[11,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[18,1],[3,1],[19,1],[20,1],[4,1],[21,1],[25,1],[22,1],[23,1],[24,1],[26,1],[27,1],[28,1],[5,1],[29,1],[30,1],[31,1],[32,1],[6,1],[36,1],[33,1],[34,1],[35,1],[37,1],[7,1],[38,1],[43,1],[44,1],[39,1],[40,1],[41,1],[42,1],[1,1],[77,64],[87,65],[76,64],[97,66],[68,67],[67,68],[96,69],[90,70],[95,71],[70,72],[84,73],[69,74],[93,75],[65,76],[64,69],[94,77],[66,78],[71,79],[72,1],[75,79],[62,1],[98,80],[88,81],[79,82],[80,83],[82,84],[78,85],[81,86],[91,69],[73,87],[74,88],[83,89],[63,90],[86,81],[85,79],[89,1],[92,91],[48,92],[50,93],[49,92],[51,94],[47,1],[170,95],[171,96],[172,97],[173,98]],"latestChangedDtsFile":"./test/removeUserInfoFromUrlTest.d.ts","version":"5.9.3"} \ No newline at end of file diff --git a/node_modules/@cucumber/ci-environment/package.json b/node_modules/@cucumber/ci-environment/package.json new file mode 100644 index 00000000..84d820c6 --- /dev/null +++ b/node_modules/@cucumber/ci-environment/package.json @@ -0,0 +1,69 @@ +{ + "name": "@cucumber/ci-environment", + "version": "13.0.0", + "description": "Detect CI Environment from environment variables", + "type": "module", + "main": "dist/cjs/src/index.js", + "types": "dist/cjs/src/index.d.ts", + "files": [ + "dist/cjs", + "dist/esm" + ], + "module": "dist/esm/src/index.js", + "jsnext:main": "dist/esm/src/index.js", + "exports": { + ".": { + "import": "./dist/esm/src/index.js", + "require": "./dist/cjs/src/index.js" + } + }, + "scripts": { + "build:cjs": "tsc --build tsconfig.build-cjs.json && shx cp package.cjs.json dist/cjs/package.json", + "build:esm": "tsc --build tsconfig.build-esm.json", + "build": "npm run build:cjs && npm run build:esm", + "pretest": "npm run generate-ci-environments-ts", + "test": "mocha && npm run test:cjs", + "test:cjs": "npm run build:cjs && mocha --no-config dist/cjs/test", + "prepublishOnly": "npm run build", + "fix": "eslint --max-warnings 0 --fix src test && prettier --write src test", + "lint": "eslint --max-warnings 0 src test && prettier --check src test", + "generate-ci-environments-ts": "shx cat CiEnvironments.ts.header ../CiEnvironments.json > src/CiEnvironments.ts && eslint --fix src/CiEnvironments.ts && prettier --write src/CiEnvironments.ts" + }, + "repository": { + "type": "git", + "url": "git://github.com/cucumber/ci-environment.git" + }, + "keywords": [ + "cucumber" + ], + "author": "Cucumber Limited ", + "license": "MIT", + "bugs": { + "url": "https://github.com/cucumber/ci-environment/issues" + }, + "homepage": "https://github.com/cucumber/ci-environment", + "devDependencies": { + "@eslint/compat": "^2.0.0", + "@eslint/eslintrc": "^3.3.0", + "@eslint/js": "^9.21.0", + "@types/glob": "9.0.0", + "@types/mocha": "10.0.10", + "@types/node": "22.19.7", + "@typescript-eslint/eslint-plugin": "^8.43.0", + "@typescript-eslint/parser": "^8.43.0", + "eslint": "^9.21.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-n": "^17.15.1", + "eslint-plugin-simple-import-sort": "^12.1.1", + "glob": "^13.0.0", + "globals": "^17.0.0", + "mocha": "11.7.5", + "prettier": "^3.5.2", + "shx": "0.4.0", + "ts-node": "10.9.2", + "typescript": "5.9.3" + }, + "directories": { + "test": "test" + } +} diff --git a/node_modules/@cucumber/cucumber-expressions/LICENSE b/node_modules/@cucumber/cucumber-expressions/LICENSE new file mode 100644 index 00000000..a5e1512d --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016 Cucumber Ltd and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/package.json b/node_modules/@cucumber/cucumber-expressions/dist/cjs/package.json new file mode 100644 index 00000000..b589b71f --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/package.json @@ -0,0 +1,4 @@ +{ + "name": "@cucumber/cucumber-expressions", + "type": "commonjs" +} diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Argument.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Argument.d.ts new file mode 100644 index 00000000..a18f65d2 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Argument.d.ts @@ -0,0 +1,16 @@ +import Group from './Group.js'; +import ParameterType from './ParameterType.js'; +export default class Argument { + readonly group: Group; + readonly parameterType: ParameterType; + static build(group: Group, parameterTypes: readonly ParameterType[]): readonly Argument[]; + constructor(group: Group, parameterType: ParameterType); + /** + * Get the value returned by the parameter type's transformer function. + * + * @param thisObj the object in which the transformer function is applied. + */ + getValue(thisObj: unknown): T | null; + getParameterType(): ParameterType; +} +//# sourceMappingURL=Argument.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Argument.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Argument.d.ts.map new file mode 100644 index 00000000..a7280d54 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Argument.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"Argument.d.ts","sourceRoot":"","sources":["../../../src/Argument.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,YAAY,CAAA;AAC9B,OAAO,aAAa,MAAM,oBAAoB,CAAA;AAE9C,MAAM,CAAC,OAAO,OAAO,QAAQ;aAqBT,KAAK,EAAE,KAAK;aACZ,aAAa,EAAE,aAAa,CAAC,OAAO,CAAC;WArBzC,KAAK,CACjB,KAAK,EAAE,KAAK,EACZ,cAAc,EAAE,SAAS,aAAa,CAAC,OAAO,CAAC,EAAE,GAChD,SAAS,QAAQ,EAAE;gBAiBJ,KAAK,EAAE,KAAK,EACZ,aAAa,EAAE,aAAa,CAAC,OAAO,CAAC;IAMvD;;;;OAIG;IACI,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,GAAG,IAAI;IAKvC,gBAAgB;CAGxB"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Argument.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Argument.js new file mode 100644 index 00000000..8769cc66 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Argument.js @@ -0,0 +1,37 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const CucumberExpressionError_js_1 = __importDefault(require("./CucumberExpressionError.js")); +class Argument { + group; + parameterType; + static build(group, parameterTypes) { + const argGroups = group.children || []; + if (argGroups.length !== parameterTypes.length) { + throw new CucumberExpressionError_js_1.default(`Group has ${argGroups.length} capture groups (${argGroups.map((g) => g.value)}), but there were ${parameterTypes.length} parameter types (${parameterTypes.map((p) => p.name)})`); + } + return parameterTypes.map((parameterType, i) => new Argument(argGroups[i], parameterType)); + } + constructor(group, parameterType) { + this.group = group; + this.parameterType = parameterType; + this.group = group; + this.parameterType = parameterType; + } + /** + * Get the value returned by the parameter type's transformer function. + * + * @param thisObj the object in which the transformer function is applied. + */ + getValue(thisObj) { + const groupValues = this.group ? this.group.values : null; + return this.parameterType.transform(thisObj, groupValues); + } + getParameterType() { + return this.parameterType; + } +} +exports.default = Argument; +//# sourceMappingURL=Argument.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Argument.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Argument.js.map new file mode 100644 index 00000000..7b1707f7 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Argument.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Argument.js","sourceRoot":"","sources":["../../../src/Argument.ts"],"names":[],"mappings":";;;;;AAAA,8FAAkE;AAIlE,MAAqB,QAAQ;IAqBT;IACA;IArBX,MAAM,CAAC,KAAK,CACjB,KAAY,EACZ,cAAiD;QAEjD,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAA;QAEtC,IAAI,SAAS,CAAC,MAAM,KAAK,cAAc,CAAC,MAAM,EAAE,CAAC;YAC/C,MAAM,IAAI,oCAAuB,CAC/B,aAAa,SAAS,CAAC,MAAM,oBAAoB,SAAS,CAAC,GAAG,CAC5D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CACf,qBAAqB,cAAc,CAAC,MAAM,qBAAqB,cAAc,CAAC,GAAG,CAChF,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CACd,GAAG,CACL,CAAA;QACH,CAAC;QAED,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAA;IAC5F,CAAC;IAED,YACkB,KAAY,EACZ,aAAqC;QADrC,UAAK,GAAL,KAAK,CAAO;QACZ,kBAAa,GAAb,aAAa,CAAwB;QAErD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;IACpC,CAAC;IAED;;;;OAIG;IACI,QAAQ,CAAI,OAAgB;QACjC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;QACzD,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IAC3D,CAAC;IAEM,gBAAgB;QACrB,OAAO,IAAI,CAAC,aAAa,CAAA;IAC3B,CAAC;CACF;AAzCD,2BAyCC"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Ast.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Ast.d.ts new file mode 100644 index 00000000..ced45a69 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Ast.d.ts @@ -0,0 +1,45 @@ +export declare function symbolOf(token: TokenType): string; +export declare function purposeOf(token: TokenType): string; +export interface Located { + readonly start: number; + readonly end: number; +} +export declare class Node implements Located { + readonly type: NodeType; + readonly nodes: readonly Node[] | undefined; + private readonly token; + readonly start: number; + readonly end: number; + constructor(type: NodeType, nodes: readonly Node[] | undefined, token: string | undefined, start: number, end: number); + text(): string; +} +export declare enum NodeType { + text = "TEXT_NODE", + optional = "OPTIONAL_NODE", + alternation = "ALTERNATION_NODE", + alternative = "ALTERNATIVE_NODE", + parameter = "PARAMETER_NODE", + expression = "EXPRESSION_NODE" +} +export declare class Token implements Located { + readonly type: TokenType; + readonly text: string; + readonly start: number; + readonly end: number; + constructor(type: TokenType, text: string, start: number, end: number); + static isEscapeCharacter(codePoint: string): boolean; + static canEscape(codePoint: string): boolean; + static typeOf(codePoint: string): TokenType; +} +export declare enum TokenType { + startOfLine = "START_OF_LINE", + endOfLine = "END_OF_LINE", + whiteSpace = "WHITE_SPACE", + beginOptional = "BEGIN_OPTIONAL", + endOptional = "END_OPTIONAL", + beginParameter = "BEGIN_PARAMETER", + endParameter = "END_PARAMETER", + alternation = "ALTERNATION", + text = "TEXT" +} +//# sourceMappingURL=Ast.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Ast.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Ast.d.ts.map new file mode 100644 index 00000000..5f18d7a9 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Ast.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"Ast.d.ts","sourceRoot":"","sources":["../../../src/Ast.ts"],"names":[],"mappings":"AAOA,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAcjD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAYlD;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACrB;AAED,qBAAa,IAAK,YAAW,OAAO;aAEhB,IAAI,EAAE,QAAQ;aACd,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,SAAS;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK;aACN,KAAK,EAAE,MAAM;aACb,GAAG,EAAE,MAAM;gBAJX,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,SAAS,EACjC,KAAK,EAAE,MAAM,GAAG,SAAS,EAC1B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM;IAO7B,IAAI,IAAI,MAAM;CAMf;AAED,oBAAY,QAAQ;IAClB,IAAI,cAAc;IAClB,QAAQ,kBAAkB;IAC1B,WAAW,qBAAqB;IAChC,WAAW,qBAAqB;IAChC,SAAS,mBAAmB;IAC5B,UAAU,oBAAoB;CAC/B;AAED,qBAAa,KAAM,YAAW,OAAO;IACnC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;gBAER,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAOrE,MAAM,CAAC,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIpD,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAsB5C,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS;CAmB5C;AAED,oBAAY,SAAS;IACnB,WAAW,kBAAkB;IAC7B,SAAS,gBAAgB;IACzB,UAAU,gBAAgB;IAC1B,aAAa,mBAAmB;IAChC,WAAW,iBAAiB;IAC5B,cAAc,oBAAoB;IAClC,YAAY,kBAAkB;IAC9B,WAAW,gBAAgB;IAC3B,IAAI,SAAS;CACd"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Ast.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Ast.js new file mode 100644 index 00000000..a87eabad --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Ast.js @@ -0,0 +1,141 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TokenType = exports.Token = exports.NodeType = exports.Node = void 0; +exports.symbolOf = symbolOf; +exports.purposeOf = purposeOf; +const escapeCharacter = '\\'; +const alternationCharacter = '/'; +const beginParameterCharacter = '{'; +const endParameterCharacter = '}'; +const beginOptionalCharacter = '('; +const endOptionalCharacter = ')'; +function symbolOf(token) { + switch (token) { + case TokenType.beginOptional: + return beginOptionalCharacter; + case TokenType.endOptional: + return endOptionalCharacter; + case TokenType.beginParameter: + return beginParameterCharacter; + case TokenType.endParameter: + return endParameterCharacter; + case TokenType.alternation: + return alternationCharacter; + } + return ''; +} +function purposeOf(token) { + switch (token) { + case TokenType.beginOptional: + case TokenType.endOptional: + return 'optional text'; + case TokenType.beginParameter: + case TokenType.endParameter: + return 'a parameter'; + case TokenType.alternation: + return 'alternation'; + } + return ''; +} +class Node { + type; + nodes; + token; + start; + end; + constructor(type, nodes, token, start, end) { + this.type = type; + this.nodes = nodes; + this.token = token; + this.start = start; + this.end = end; + if (nodes === undefined && token === undefined) { + throw new Error('Either nodes or token must be defined'); + } + } + text() { + if (this.nodes && this.nodes.length > 0) { + return this.nodes.map((value) => value.text()).join(''); + } + return this.token || ''; + } +} +exports.Node = Node; +var NodeType; +(function (NodeType) { + NodeType["text"] = "TEXT_NODE"; + NodeType["optional"] = "OPTIONAL_NODE"; + NodeType["alternation"] = "ALTERNATION_NODE"; + NodeType["alternative"] = "ALTERNATIVE_NODE"; + NodeType["parameter"] = "PARAMETER_NODE"; + NodeType["expression"] = "EXPRESSION_NODE"; +})(NodeType || (exports.NodeType = NodeType = {})); +class Token { + type; + text; + start; + end; + constructor(type, text, start, end) { + this.type = type; + this.text = text; + this.start = start; + this.end = end; + } + static isEscapeCharacter(codePoint) { + return codePoint == escapeCharacter; + } + static canEscape(codePoint) { + if (codePoint == ' ') { + // TODO: Unicode whitespace? + return true; + } + switch (codePoint) { + case escapeCharacter: + return true; + case alternationCharacter: + return true; + case beginParameterCharacter: + return true; + case endParameterCharacter: + return true; + case beginOptionalCharacter: + return true; + case endOptionalCharacter: + return true; + } + return false; + } + static typeOf(codePoint) { + if (codePoint == ' ') { + // TODO: Unicode whitespace? + return TokenType.whiteSpace; + } + switch (codePoint) { + case alternationCharacter: + return TokenType.alternation; + case beginParameterCharacter: + return TokenType.beginParameter; + case endParameterCharacter: + return TokenType.endParameter; + case beginOptionalCharacter: + return TokenType.beginOptional; + case endOptionalCharacter: + return TokenType.endOptional; + } + return TokenType.text; + } +} +exports.Token = Token; +var TokenType; +(function (TokenType) { + TokenType["startOfLine"] = "START_OF_LINE"; + TokenType["endOfLine"] = "END_OF_LINE"; + TokenType["whiteSpace"] = "WHITE_SPACE"; + TokenType["beginOptional"] = "BEGIN_OPTIONAL"; + TokenType["endOptional"] = "END_OPTIONAL"; + TokenType["beginParameter"] = "BEGIN_PARAMETER"; + TokenType["endParameter"] = "END_PARAMETER"; + TokenType["alternation"] = "ALTERNATION"; + TokenType["text"] = "TEXT"; +})(TokenType || (exports.TokenType = TokenType = {})); +//# sourceMappingURL=Ast.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Ast.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Ast.js.map new file mode 100644 index 00000000..1adfb674 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Ast.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Ast.js","sourceRoot":"","sources":["../../../src/Ast.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CombinatorialGeneratedExpressionFactory.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CombinatorialGeneratedExpressionFactory.d.ts new file mode 100644 index 00000000..249f995f --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CombinatorialGeneratedExpressionFactory.d.ts @@ -0,0 +1,10 @@ +import GeneratedExpression from './GeneratedExpression.js'; +import ParameterType from './ParameterType.js'; +export default class CombinatorialGeneratedExpressionFactory { + private readonly expressionTemplate; + private readonly parameterTypeCombinations; + constructor(expressionTemplate: string, parameterTypeCombinations: Array>>); + generateExpressions(): readonly GeneratedExpression[]; + private generatePermutations; +} +//# sourceMappingURL=CombinatorialGeneratedExpressionFactory.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CombinatorialGeneratedExpressionFactory.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CombinatorialGeneratedExpressionFactory.d.ts.map new file mode 100644 index 00000000..85ea904c --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CombinatorialGeneratedExpressionFactory.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"CombinatorialGeneratedExpressionFactory.d.ts","sourceRoot":"","sources":["../../../src/CombinatorialGeneratedExpressionFactory.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,MAAM,0BAA0B,CAAA;AAC1D,OAAO,aAAa,MAAM,oBAAoB,CAAA;AAK9C,MAAM,CAAC,OAAO,OAAO,uCAAuC;IAExD,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,yBAAyB;gBADzB,kBAAkB,EAAE,MAAM,EAC1B,yBAAyB,EAAE,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IAK3E,mBAAmB,IAAI,SAAS,mBAAmB,EAAE;IAM5D,OAAO,CAAC,oBAAoB;CA4B7B"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CombinatorialGeneratedExpressionFactory.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CombinatorialGeneratedExpressionFactory.js new file mode 100644 index 00000000..9fafe005 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CombinatorialGeneratedExpressionFactory.js @@ -0,0 +1,43 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const GeneratedExpression_js_1 = __importDefault(require("./GeneratedExpression.js")); +// 256 generated expressions ought to be enough for anybody +const MAX_EXPRESSIONS = 256; +class CombinatorialGeneratedExpressionFactory { + expressionTemplate; + parameterTypeCombinations; + constructor(expressionTemplate, parameterTypeCombinations) { + this.expressionTemplate = expressionTemplate; + this.parameterTypeCombinations = parameterTypeCombinations; + this.expressionTemplate = expressionTemplate; + } + generateExpressions() { + const generatedExpressions = []; + this.generatePermutations(generatedExpressions, 0, []); + return generatedExpressions; + } + generatePermutations(generatedExpressions, depth, currentParameterTypes) { + if (generatedExpressions.length >= MAX_EXPRESSIONS) { + return; + } + if (depth === this.parameterTypeCombinations.length) { + generatedExpressions.push(new GeneratedExpression_js_1.default(this.expressionTemplate, currentParameterTypes)); + return; + } + // tslint:disable-next-line:prefer-for-of + for (let i = 0; i < this.parameterTypeCombinations[depth].length; ++i) { + // Avoid recursion if no elements can be added. + if (generatedExpressions.length >= MAX_EXPRESSIONS) { + return; + } + const newCurrentParameterTypes = currentParameterTypes.slice(); // clone + newCurrentParameterTypes.push(this.parameterTypeCombinations[depth][i]); + this.generatePermutations(generatedExpressions, depth + 1, newCurrentParameterTypes); + } + } +} +exports.default = CombinatorialGeneratedExpressionFactory; +//# sourceMappingURL=CombinatorialGeneratedExpressionFactory.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CombinatorialGeneratedExpressionFactory.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CombinatorialGeneratedExpressionFactory.js.map new file mode 100644 index 00000000..d36908cc --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CombinatorialGeneratedExpressionFactory.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CombinatorialGeneratedExpressionFactory.js","sourceRoot":"","sources":["../../../src/CombinatorialGeneratedExpressionFactory.ts"],"names":[],"mappings":";;;;;AAAA,sFAA0D;AAG1D,2DAA2D;AAC3D,MAAM,eAAe,GAAG,GAAG,CAAA;AAE3B,MAAqB,uCAAuC;IAEvC;IACA;IAFnB,YACmB,kBAA0B,EAC1B,yBAA+D;QAD/D,uBAAkB,GAAlB,kBAAkB,CAAQ;QAC1B,8BAAyB,GAAzB,yBAAyB,CAAsC;QAEhF,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAA;IAC9C,CAAC;IAEM,mBAAmB;QACxB,MAAM,oBAAoB,GAA0B,EAAE,CAAA;QACtD,IAAI,CAAC,oBAAoB,CAAC,oBAAoB,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QACtD,OAAO,oBAAoB,CAAA;IAC7B,CAAC;IAEO,oBAAoB,CAC1B,oBAA2C,EAC3C,KAAa,EACb,qBAAoD;QAEpD,IAAI,oBAAoB,CAAC,MAAM,IAAI,eAAe,EAAE,CAAC;YACnD,OAAM;QACR,CAAC;QAED,IAAI,KAAK,KAAK,IAAI,CAAC,yBAAyB,CAAC,MAAM,EAAE,CAAC;YACpD,oBAAoB,CAAC,IAAI,CACvB,IAAI,gCAAmB,CAAC,IAAI,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,CACxE,CAAA;YACD,OAAM;QACR,CAAC;QAED,yCAAyC;QACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YACtE,+CAA+C;YAC/C,IAAI,oBAAoB,CAAC,MAAM,IAAI,eAAe,EAAE,CAAC;gBACnD,OAAM;YACR,CAAC;YAED,MAAM,wBAAwB,GAAG,qBAAqB,CAAC,KAAK,EAAE,CAAA,CAAC,QAAQ;YACvE,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACvE,IAAI,CAAC,oBAAoB,CAAC,oBAAoB,EAAE,KAAK,GAAG,CAAC,EAAE,wBAAwB,CAAC,CAAA;QACtF,CAAC;IACH,CAAC;CACF;AA1CD,0DA0CC"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpression.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpression.d.ts new file mode 100644 index 00000000..28ff23fa --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpression.d.ts @@ -0,0 +1,30 @@ +import Argument from './Argument.js'; +import { Node } from './Ast.js'; +import ParameterTypeRegistry from './ParameterTypeRegistry.js'; +import { Expression } from './types.js'; +export default class CucumberExpression implements Expression { + private readonly expression; + private readonly parameterTypeRegistry; + private readonly parameterTypes; + private readonly treeRegexp; + readonly ast: Node; + /** + * @param expression + * @param parameterTypeRegistry + */ + constructor(expression: string, parameterTypeRegistry: ParameterTypeRegistry); + private rewriteToRegex; + private static escapeRegex; + private rewriteOptional; + private rewriteAlternation; + private rewriteAlternative; + private rewriteParameter; + private rewriteExpression; + private assertNotEmpty; + private assertNoParameters; + private assertNoOptionals; + match(text: string): readonly Argument[] | null; + get regexp(): RegExp; + get source(): string; +} +//# sourceMappingURL=CucumberExpression.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpression.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpression.d.ts.map new file mode 100644 index 00000000..a3c229ec --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpression.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpression.d.ts","sourceRoot":"","sources":["../../../src/CucumberExpression.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAA;AACpC,OAAO,EAAE,IAAI,EAAY,MAAM,UAAU,CAAA;AAYzC,OAAO,qBAAqB,MAAM,4BAA4B,CAAA;AAE9D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAIvC,MAAM,CAAC,OAAO,OAAO,kBAAmB,YAAW,UAAU;IAUzD,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IAVxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAoC;IACnE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,SAAgB,GAAG,EAAE,IAAI,CAAA;IAEzB;;;OAGG;gBAEgB,UAAU,EAAE,MAAM,EAClB,qBAAqB,EAAE,qBAAqB;IAQ/D,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,MAAM,CAAC,WAAW;IAI1B,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,iBAAiB;IAUlB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,QAAQ,EAAE,GAAG,IAAI;IAQtD,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;CACF"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpression.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpression.js new file mode 100644 index 00000000..5917c250 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpression.js @@ -0,0 +1,123 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const Argument_js_1 = __importDefault(require("./Argument.js")); +const Ast_js_1 = require("./Ast.js"); +const CucumberExpressionParser_js_1 = __importDefault(require("./CucumberExpressionParser.js")); +const Errors_js_1 = require("./Errors.js"); +const TreeRegexp_js_1 = __importDefault(require("./TreeRegexp.js")); +const ESCAPE_PATTERN = () => /([\\^[({$.|?*+})\]])/g; +class CucumberExpression { + expression; + parameterTypeRegistry; + parameterTypes = []; + treeRegexp; + ast; + /** + * @param expression + * @param parameterTypeRegistry + */ + constructor(expression, parameterTypeRegistry) { + this.expression = expression; + this.parameterTypeRegistry = parameterTypeRegistry; + const parser = new CucumberExpressionParser_js_1.default(); + this.ast = parser.parse(expression); + const pattern = this.rewriteToRegex(this.ast); + this.treeRegexp = new TreeRegexp_js_1.default(pattern); + } + rewriteToRegex(node) { + switch (node.type) { + case Ast_js_1.NodeType.text: + return CucumberExpression.escapeRegex(node.text()); + case Ast_js_1.NodeType.optional: + return this.rewriteOptional(node); + case Ast_js_1.NodeType.alternation: + return this.rewriteAlternation(node); + case Ast_js_1.NodeType.alternative: + return this.rewriteAlternative(node); + case Ast_js_1.NodeType.parameter: + return this.rewriteParameter(node); + case Ast_js_1.NodeType.expression: + return this.rewriteExpression(node); + default: + // Can't happen as long as the switch case is exhaustive + throw new Error(node.type); + } + } + static escapeRegex(expression) { + return expression.replace(ESCAPE_PATTERN(), '\\$1'); + } + rewriteOptional(node) { + this.assertNoParameters(node, (astNode) => (0, Errors_js_1.createParameterIsNotAllowedInOptional)(astNode, this.expression)); + this.assertNoOptionals(node, (astNode) => (0, Errors_js_1.createOptionalIsNotAllowedInOptional)(astNode, this.expression)); + this.assertNotEmpty(node, (astNode) => (0, Errors_js_1.createOptionalMayNotBeEmpty)(astNode, this.expression)); + const regex = (node.nodes || []).map((node) => this.rewriteToRegex(node)).join(''); + return `(?:${regex})?`; + } + rewriteAlternation(node) { + // Make sure the alternative parts aren't empty and don't contain parameter types + for (const alternative of node.nodes || []) { + if (!alternative.nodes || alternative.nodes.length == 0) { + throw (0, Errors_js_1.createAlternativeMayNotBeEmpty)(alternative, this.expression); + } + this.assertNotEmpty(alternative, (astNode) => (0, Errors_js_1.createAlternativeMayNotExclusivelyContainOptionals)(astNode, this.expression)); + } + const regex = (node.nodes || []).map((node) => this.rewriteToRegex(node)).join('|'); + return `(?:${regex})`; + } + rewriteAlternative(node) { + return (node.nodes || []).map((lastNode) => this.rewriteToRegex(lastNode)).join(''); + } + rewriteParameter(node) { + const name = node.text(); + const parameterType = this.parameterTypeRegistry.lookupByTypeName(name); + if (!parameterType) { + throw (0, Errors_js_1.createUndefinedParameterType)(node, this.expression, name); + } + this.parameterTypes.push(parameterType); + const regexps = parameterType.regexpStrings; + if (regexps.length == 1) { + return `(${regexps[0]})`; + } + return `((?:${regexps.join(')|(?:')}))`; + } + rewriteExpression(node) { + const regex = (node.nodes || []).map((node) => this.rewriteToRegex(node)).join(''); + return `^${regex}$`; + } + assertNotEmpty(node, createNodeWasNotEmptyException) { + const textNodes = (node.nodes || []).filter((astNode) => Ast_js_1.NodeType.text == astNode.type); + if (textNodes.length == 0) { + throw createNodeWasNotEmptyException(node); + } + } + assertNoParameters(node, createNodeContainedAParameterError) { + const parameterNodes = (node.nodes || []).filter((astNode) => Ast_js_1.NodeType.parameter == astNode.type); + if (parameterNodes.length > 0) { + throw createNodeContainedAParameterError(parameterNodes[0]); + } + } + assertNoOptionals(node, createNodeContainedAnOptionalError) { + const parameterNodes = (node.nodes || []).filter((astNode) => Ast_js_1.NodeType.optional == astNode.type); + if (parameterNodes.length > 0) { + throw createNodeContainedAnOptionalError(parameterNodes[0]); + } + } + match(text) { + const group = this.treeRegexp.match(text); + if (!group) { + return null; + } + return Argument_js_1.default.build(group, this.parameterTypes); + } + get regexp() { + return this.treeRegexp.regexp; + } + get source() { + return this.expression; + } +} +exports.default = CucumberExpression; +//# sourceMappingURL=CucumberExpression.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpression.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpression.js.map new file mode 100644 index 00000000..dd924ec3 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpression.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpression.js","sourceRoot":"","sources":["../../../src/CucumberExpression.ts"],"names":[],"mappings":";;;;;AAAA,gEAAoC;AACpC,qCAAyC;AAEzC,gGAAoE;AACpE,2CAOoB;AAGpB,oEAAwC;AAGxC,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,uBAAuB,CAAA;AAEpD,MAAqB,kBAAkB;IAUlB;IACA;IAVF,cAAc,GAAkC,EAAE,CAAA;IAClD,UAAU,CAAY;IACvB,GAAG,CAAM;IAEzB;;;OAGG;IACH,YACmB,UAAkB,EAClB,qBAA4C;QAD5C,eAAU,GAAV,UAAU,CAAQ;QAClB,0BAAqB,GAArB,qBAAqB,CAAuB;QAE7D,MAAM,MAAM,GAAG,IAAI,qCAAwB,EAAE,CAAA;QAC7C,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC7C,IAAI,CAAC,UAAU,GAAG,IAAI,uBAAU,CAAC,OAAO,CAAC,CAAA;IAC3C,CAAC;IAEO,cAAc,CAAC,IAAU;QAC/B,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,iBAAQ,CAAC,IAAI;gBAChB,OAAO,kBAAkB,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;YACpD,KAAK,iBAAQ,CAAC,QAAQ;gBACpB,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;YACnC,KAAK,iBAAQ,CAAC,WAAW;gBACvB,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAA;YACtC,KAAK,iBAAQ,CAAC,WAAW;gBACvB,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAA;YACtC,KAAK,iBAAQ,CAAC,SAAS;gBACrB,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAA;YACpC,KAAK,iBAAQ,CAAC,UAAU;gBACtB,OAAO,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAA;YACrC;gBACE,wDAAwD;gBACxD,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9B,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,WAAW,CAAC,UAAkB;QAC3C,OAAO,UAAU,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,MAAM,CAAC,CAAA;IACrD,CAAC;IAEO,eAAe,CAAC,IAAU;QAChC,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CACxC,IAAA,iDAAqC,EAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAChE,CAAA;QACD,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CACvC,IAAA,gDAAoC,EAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAC/D,CAAA;QACD,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAA,uCAA2B,EAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;QAC7F,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAClF,OAAO,MAAM,KAAK,IAAI,CAAA;IACxB,CAAC;IAEO,kBAAkB,CAAC,IAAU;QACnC,iFAAiF;QACjF,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;YAC3C,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACxD,MAAM,IAAA,0CAA8B,EAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;YACpE,CAAC;YACD,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE,CAC3C,IAAA,8DAAkD,EAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAC7E,CAAA;QACH,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACnF,OAAO,MAAM,KAAK,GAAG,CAAA;IACvB,CAAC;IAEO,kBAAkB,CAAC,IAAU;QACnC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACrF,CAAC;IAEO,gBAAgB,CAAC,IAAU;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QACxB,MAAM,aAAa,GAAG,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAA;QACvE,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAA,wCAA4B,EAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;QACjE,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QACvC,MAAM,OAAO,GAAG,aAAa,CAAC,aAAa,CAAA;QAC3C,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CAAA;QAC1B,CAAC;QACD,OAAO,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAA;IACzC,CAAC;IAEO,iBAAiB,CAAC,IAAU;QAClC,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAClF,OAAO,IAAI,KAAK,GAAG,CAAA;IACrB,CAAC;IAEO,cAAc,CACpB,IAAU,EACV,8BAA0E;QAE1E,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;QAEvF,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,8BAA8B,CAAC,IAAI,CAAC,CAAA;QAC5C,CAAC;IACH,CAAC;IAEO,kBAAkB,CACxB,IAAU,EACV,kCAA8E;QAE9E,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAC9C,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAQ,CAAC,SAAS,IAAI,OAAO,CAAC,IAAI,CAChD,CAAA;QACD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,kCAAkC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;QAC7D,CAAC;IACH,CAAC;IAEO,iBAAiB,CACvB,IAAU,EACV,kCAA8E;QAE9E,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAQ,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;QAChG,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,kCAAkC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;QAC7D,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,IAAY;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,qBAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,CAAA;IACnD,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAA;IAC/B,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,UAAU,CAAA;IACxB,CAAC;CACF;AA5ID,qCA4IC"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionError.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionError.d.ts new file mode 100644 index 00000000..aab86932 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionError.d.ts @@ -0,0 +1,3 @@ +export default class CucumberExpressionError extends Error { +} +//# sourceMappingURL=CucumberExpressionError.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionError.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionError.d.ts.map new file mode 100644 index 00000000..94200c43 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionError.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionError.d.ts","sourceRoot":"","sources":["../../../src/CucumberExpressionError.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,uBAAwB,SAAQ,KAAK;CAAG"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionError.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionError.js new file mode 100644 index 00000000..8e059878 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionError.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class CucumberExpressionError extends Error { +} +exports.default = CucumberExpressionError; +//# sourceMappingURL=CucumberExpressionError.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionError.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionError.js.map new file mode 100644 index 00000000..1e0b638f --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionError.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionError.js","sourceRoot":"","sources":["../../../src/CucumberExpressionError.ts"],"names":[],"mappings":";;AAAA,MAAqB,uBAAwB,SAAQ,KAAK;CAAG;AAA7D,0CAA6D"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionGenerator.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionGenerator.d.ts new file mode 100644 index 00000000..980dce66 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionGenerator.d.ts @@ -0,0 +1,10 @@ +import GeneratedExpression from './GeneratedExpression.js'; +import ParameterType from './ParameterType.js'; +export default class CucumberExpressionGenerator { + private readonly parameterTypes; + constructor(parameterTypes: () => Iterable>); + generateExpressions(text: string): readonly GeneratedExpression[]; + private createParameterTypeMatchers; + private static createParameterTypeMatchers2; +} +//# sourceMappingURL=CucumberExpressionGenerator.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionGenerator.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionGenerator.d.ts.map new file mode 100644 index 00000000..9d2d10ff --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionGenerator.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionGenerator.d.ts","sourceRoot":"","sources":["../../../src/CucumberExpressionGenerator.ts"],"names":[],"mappings":"AACA,OAAO,mBAAmB,MAAM,0BAA0B,CAAA;AAC1D,OAAO,aAAa,MAAM,oBAAoB,CAAA;AAG9C,MAAM,CAAC,OAAO,OAAO,2BAA2B;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAAd,cAAc,EAAE,MAAM,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAE5E,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,mBAAmB,EAAE;IAgExE,OAAO,CAAC,2BAA2B;IAYnC,OAAO,CAAC,MAAM,CAAC,4BAA4B;CAQ5C"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionGenerator.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionGenerator.js new file mode 100644 index 00000000..5b4e783e --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionGenerator.js @@ -0,0 +1,78 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const CombinatorialGeneratedExpressionFactory_js_1 = __importDefault(require("./CombinatorialGeneratedExpressionFactory.js")); +const ParameterType_js_1 = __importDefault(require("./ParameterType.js")); +const ParameterTypeMatcher_js_1 = __importDefault(require("./ParameterTypeMatcher.js")); +class CucumberExpressionGenerator { + parameterTypes; + constructor(parameterTypes) { + this.parameterTypes = parameterTypes; + } + generateExpressions(text) { + const parameterTypeCombinations = []; + const parameterTypeMatchers = this.createParameterTypeMatchers(text); + let expressionTemplate = ''; + let pos = 0; + let counter = 0; + while (true) { + let matchingParameterTypeMatchers = []; + for (const parameterTypeMatcher of parameterTypeMatchers) { + const advancedParameterTypeMatcher = parameterTypeMatcher.advanceTo(pos); + if (advancedParameterTypeMatcher.find) { + matchingParameterTypeMatchers.push(advancedParameterTypeMatcher); + } + } + if (matchingParameterTypeMatchers.length > 0) { + matchingParameterTypeMatchers = matchingParameterTypeMatchers.sort(ParameterTypeMatcher_js_1.default.compare); + // Find all the best parameter type matchers, they are all candidates. + const bestParameterTypeMatcher = matchingParameterTypeMatchers[0]; + const bestParameterTypeMatchers = matchingParameterTypeMatchers.filter((m) => ParameterTypeMatcher_js_1.default.compare(m, bestParameterTypeMatcher) === 0); + // Build a list of parameter types without duplicates. The reason there + // might be duplicates is that some parameter types have more than one regexp, + // which means multiple ParameterTypeMatcher objects will have a reference to the + // same ParameterType. + // We're sorting the list so preferential parameter types are listed first. + // Users are most likely to want these, so they should be listed at the top. + let parameterTypes = []; + for (const parameterTypeMatcher of bestParameterTypeMatchers) { + if (parameterTypes.indexOf(parameterTypeMatcher.parameterType) === -1) { + parameterTypes.push(parameterTypeMatcher.parameterType); + } + } + parameterTypes = parameterTypes.sort(ParameterType_js_1.default.compare); + parameterTypeCombinations.push(parameterTypes); + expressionTemplate += escape(text.slice(pos, bestParameterTypeMatcher.start)); + expressionTemplate += `{{${counter++}}}`; + pos = bestParameterTypeMatcher.start + bestParameterTypeMatcher.group.length; + } + else { + break; + } + if (pos >= text.length) { + break; + } + } + expressionTemplate += escape(text.slice(pos)); + return new CombinatorialGeneratedExpressionFactory_js_1.default(expressionTemplate, parameterTypeCombinations).generateExpressions(); + } + createParameterTypeMatchers(text) { + let parameterMatchers = []; + for (const parameterType of this.parameterTypes()) { + if (parameterType.useForSnippets) { + parameterMatchers = parameterMatchers.concat(CucumberExpressionGenerator.createParameterTypeMatchers2(parameterType, text)); + } + } + return parameterMatchers; + } + static createParameterTypeMatchers2(parameterType, text) { + return parameterType.regexpStrings.map((regexp) => new ParameterTypeMatcher_js_1.default(parameterType, regexp, text)); + } +} +exports.default = CucumberExpressionGenerator; +function escape(s) { + return s.replace(/\(/g, '\\(').replace(/{/g, '\\{').replace(/\//g, '\\/'); +} +//# sourceMappingURL=CucumberExpressionGenerator.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionGenerator.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionGenerator.js.map new file mode 100644 index 00000000..ef57c804 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionGenerator.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionGenerator.js","sourceRoot":"","sources":["../../../src/CucumberExpressionGenerator.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionParser.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionParser.d.ts new file mode 100644 index 00000000..07e3527b --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionParser.d.ts @@ -0,0 +1,5 @@ +import { Node } from './Ast.js'; +export default class CucumberExpressionParser { + parse(expression: string): Node; +} +//# sourceMappingURL=CucumberExpressionParser.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionParser.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionParser.d.ts.map new file mode 100644 index 00000000..dcdedb74 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionParser.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionParser.d.ts","sourceRoot":"","sources":["../../../src/CucumberExpressionParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAA8B,MAAM,UAAU,CAAA;AAmK3D,MAAM,CAAC,OAAO,OAAO,wBAAwB;IAC3C,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;CAMhC"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionParser.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionParser.js new file mode 100644 index 00000000..71b70df8 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionParser.js @@ -0,0 +1,240 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const Ast_js_1 = require("./Ast.js"); +const CucumberExpressionTokenizer_js_1 = __importDefault(require("./CucumberExpressionTokenizer.js")); +const Errors_js_1 = require("./Errors.js"); +/* + * text := whitespace | ')' | '}' | . + */ +function parseText(expression, tokens, current) { + const token = tokens[current]; + switch (token.type) { + case Ast_js_1.TokenType.whiteSpace: + case Ast_js_1.TokenType.text: + case Ast_js_1.TokenType.endParameter: + case Ast_js_1.TokenType.endOptional: + return { + consumed: 1, + ast: [new Ast_js_1.Node(Ast_js_1.NodeType.text, undefined, token.text, token.start, token.end)], + }; + case Ast_js_1.TokenType.alternation: + throw (0, Errors_js_1.createAlternationNotAllowedInOptional)(expression, token); + case Ast_js_1.TokenType.startOfLine: + case Ast_js_1.TokenType.endOfLine: + case Ast_js_1.TokenType.beginOptional: + case Ast_js_1.TokenType.beginParameter: + default: + // If configured correctly this will never happen + return { consumed: 0, ast: [] }; + } +} +/* + * parameter := '{' + name* + '}' + */ +function parseName(expression, tokens, current) { + const token = tokens[current]; + switch (token.type) { + case Ast_js_1.TokenType.whiteSpace: + case Ast_js_1.TokenType.text: + return { + consumed: 1, + ast: [new Ast_js_1.Node(Ast_js_1.NodeType.text, undefined, token.text, token.start, token.end)], + }; + case Ast_js_1.TokenType.beginOptional: + case Ast_js_1.TokenType.endOptional: + case Ast_js_1.TokenType.beginParameter: + case Ast_js_1.TokenType.endParameter: + case Ast_js_1.TokenType.alternation: + throw (0, Errors_js_1.createInvalidParameterTypeNameInNode)(token, expression); + case Ast_js_1.TokenType.startOfLine: + case Ast_js_1.TokenType.endOfLine: + default: + // If configured correctly this will never happen + return { consumed: 0, ast: [] }; + } +} +/* + * parameter := '{' + text* + '}' + */ +const parseParameter = parseBetween(Ast_js_1.NodeType.parameter, Ast_js_1.TokenType.beginParameter, Ast_js_1.TokenType.endParameter, [parseName]); +/* + * optional := '(' + option* + ')' + * option := optional | parameter | text + */ +const optionalSubParsers = []; +const parseOptional = parseBetween(Ast_js_1.NodeType.optional, Ast_js_1.TokenType.beginOptional, Ast_js_1.TokenType.endOptional, optionalSubParsers); +optionalSubParsers.push(parseOptional, parseParameter, parseText); +/* + * alternation := alternative* + ( '/' + alternative* )+ + */ +function parseAlternativeSeparator(expression, tokens, current) { + if (!lookingAt(tokens, current, Ast_js_1.TokenType.alternation)) { + return { consumed: 0, ast: [] }; + } + const token = tokens[current]; + return { + consumed: 1, + ast: [new Ast_js_1.Node(Ast_js_1.NodeType.alternative, undefined, token.text, token.start, token.end)], + }; +} +const alternativeParsers = [ + parseAlternativeSeparator, + parseOptional, + parseParameter, + parseText, +]; +/* + * alternation := (?<=left-boundary) + alternative* + ( '/' + alternative* )+ + (?=right-boundary) + * left-boundary := whitespace | } | ^ + * right-boundary := whitespace | { | $ + * alternative: = optional | parameter | text + */ +const parseAlternation = (expression, tokens, current) => { + const previous = current - 1; + if (!lookingAtAny(tokens, previous, [ + Ast_js_1.TokenType.startOfLine, + Ast_js_1.TokenType.whiteSpace, + Ast_js_1.TokenType.endParameter, + ])) { + return { consumed: 0, ast: [] }; + } + const result = parseTokensUntil(expression, alternativeParsers, tokens, current, [ + Ast_js_1.TokenType.whiteSpace, + Ast_js_1.TokenType.endOfLine, + Ast_js_1.TokenType.beginParameter, + ]); + const subCurrent = current + result.consumed; + if (!result.ast.some((astNode) => astNode.type == Ast_js_1.NodeType.alternative)) { + return { consumed: 0, ast: [] }; + } + const start = tokens[current].start; + const end = tokens[subCurrent].start; + // Does not consume right hand boundary token + return { + consumed: result.consumed, + ast: [ + new Ast_js_1.Node(Ast_js_1.NodeType.alternation, splitAlternatives(start, end, result.ast), undefined, start, end), + ], + }; +}; +/* + * cucumber-expression := ( alternation | optional | parameter | text )* + */ +const parseCucumberExpression = parseBetween(Ast_js_1.NodeType.expression, Ast_js_1.TokenType.startOfLine, Ast_js_1.TokenType.endOfLine, [parseAlternation, parseOptional, parseParameter, parseText]); +class CucumberExpressionParser { + parse(expression) { + const tokenizer = new CucumberExpressionTokenizer_js_1.default(); + const tokens = tokenizer.tokenize(expression); + const result = parseCucumberExpression(expression, tokens, 0); + return result.ast[0]; + } +} +exports.default = CucumberExpressionParser; +function parseBetween(type, beginToken, endToken, parsers) { + return (expression, tokens, current) => { + if (!lookingAt(tokens, current, beginToken)) { + return { consumed: 0, ast: [] }; + } + let subCurrent = current + 1; + const result = parseTokensUntil(expression, parsers, tokens, subCurrent, [ + endToken, + Ast_js_1.TokenType.endOfLine, + ]); + subCurrent += result.consumed; + // endToken not found + if (!lookingAt(tokens, subCurrent, endToken)) { + throw (0, Errors_js_1.createMissingEndToken)(expression, beginToken, endToken, tokens[current]); + } + // consumes endToken + const start = tokens[current].start; + const end = tokens[subCurrent].end; + const consumed = subCurrent + 1 - current; + const ast = [new Ast_js_1.Node(type, result.ast, undefined, start, end)]; + return { consumed, ast }; + }; +} +function parseToken(expression, parsers, tokens, startAt) { + for (let i = 0; i < parsers.length; i++) { + const parse = parsers[i]; + const result = parse(expression, tokens, startAt); + if (result.consumed != 0) { + return result; + } + } + // If configured correctly this will never happen + throw new Error('No eligible parsers for ' + tokens); +} +function parseTokensUntil(expression, parsers, tokens, startAt, endTokens) { + let current = startAt; + const size = tokens.length; + const ast = []; + while (current < size) { + if (lookingAtAny(tokens, current, endTokens)) { + break; + } + const result = parseToken(expression, parsers, tokens, current); + if (result.consumed == 0) { + // If configured correctly this will never happen + // Keep to avoid infinite loops + throw new Error('No eligible parsers for ' + tokens); + } + current += result.consumed; + ast.push(...result.ast); + } + return { consumed: current - startAt, ast }; +} +function lookingAtAny(tokens, at, tokenTypes) { + return tokenTypes.some((tokenType) => lookingAt(tokens, at, tokenType)); +} +function lookingAt(tokens, at, token) { + if (at < 0) { + // If configured correctly this will never happen + // Keep for completeness + return token == Ast_js_1.TokenType.startOfLine; + } + if (at >= tokens.length) { + return token == Ast_js_1.TokenType.endOfLine; + } + return tokens[at].type == token; +} +function splitAlternatives(start, end, alternation) { + const separators = []; + const alternatives = []; + let alternative = []; + alternation.forEach((n) => { + if (Ast_js_1.NodeType.alternative == n.type) { + separators.push(n); + alternatives.push(alternative); + alternative = []; + } + else { + alternative.push(n); + } + }); + alternatives.push(alternative); + return createAlternativeNodes(start, end, separators, alternatives); +} +function createAlternativeNodes(start, end, separators, alternatives) { + const nodes = []; + for (let i = 0; i < alternatives.length; i++) { + const n = alternatives[i]; + if (i == 0) { + const rightSeparator = separators[i]; + nodes.push(new Ast_js_1.Node(Ast_js_1.NodeType.alternative, n, undefined, start, rightSeparator.start)); + } + else if (i == alternatives.length - 1) { + const leftSeparator = separators[i - 1]; + nodes.push(new Ast_js_1.Node(Ast_js_1.NodeType.alternative, n, undefined, leftSeparator.end, end)); + } + else { + const leftSeparator = separators[i - 1]; + const rightSeparator = separators[i]; + nodes.push(new Ast_js_1.Node(Ast_js_1.NodeType.alternative, n, undefined, leftSeparator.end, rightSeparator.start)); + } + } + return nodes; +} +//# sourceMappingURL=CucumberExpressionParser.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionParser.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionParser.js.map new file mode 100644 index 00000000..8a304be9 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionParser.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionParser.js","sourceRoot":"","sources":["../../../src/CucumberExpressionParser.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionTokenizer.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionTokenizer.d.ts new file mode 100644 index 00000000..f58b05de --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionTokenizer.d.ts @@ -0,0 +1,5 @@ +import { Token } from './Ast.js'; +export default class CucumberExpressionTokenizer { + tokenize(expression: string): readonly Token[]; +} +//# sourceMappingURL=CucumberExpressionTokenizer.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionTokenizer.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionTokenizer.d.ts.map new file mode 100644 index 00000000..7e76f67a --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionTokenizer.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionTokenizer.d.ts","sourceRoot":"","sources":["../../../src/CucumberExpressionTokenizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAa,MAAM,UAAU,CAAA;AAG3C,MAAM,CAAC,OAAO,OAAO,2BAA2B;IAC9C,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,KAAK,EAAE;CA4E/C"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionTokenizer.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionTokenizer.js new file mode 100644 index 00000000..afc6c2c9 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionTokenizer.js @@ -0,0 +1,75 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const Ast_js_1 = require("./Ast.js"); +const Errors_js_1 = require("./Errors.js"); +class CucumberExpressionTokenizer { + tokenize(expression) { + const codePoints = Array.from(expression); + const tokens = []; + let buffer = []; + let previousTokenType = Ast_js_1.TokenType.startOfLine; + let treatAsText = false; + let escaped = 0; + let bufferStartIndex = 0; + function convertBufferToToken(tokenType) { + let escapeTokens = 0; + if (tokenType == Ast_js_1.TokenType.text) { + escapeTokens = escaped; + escaped = 0; + } + const consumedIndex = bufferStartIndex + buffer.length + escapeTokens; + const t = new Ast_js_1.Token(tokenType, buffer.join(''), bufferStartIndex, consumedIndex); + buffer = []; + bufferStartIndex = consumedIndex; + return t; + } + function tokenTypeOf(codePoint, treatAsText) { + if (!treatAsText) { + return Ast_js_1.Token.typeOf(codePoint); + } + if (Ast_js_1.Token.canEscape(codePoint)) { + return Ast_js_1.TokenType.text; + } + throw (0, Errors_js_1.createCantEscaped)(expression, bufferStartIndex + buffer.length + escaped); + } + function shouldCreateNewToken(previousTokenType, currentTokenType) { + if (currentTokenType != previousTokenType) { + return true; + } + return currentTokenType != Ast_js_1.TokenType.whiteSpace && currentTokenType != Ast_js_1.TokenType.text; + } + if (codePoints.length == 0) { + tokens.push(new Ast_js_1.Token(Ast_js_1.TokenType.startOfLine, '', 0, 0)); + } + codePoints.forEach((codePoint) => { + if (!treatAsText && Ast_js_1.Token.isEscapeCharacter(codePoint)) { + escaped++; + treatAsText = true; + return; + } + const currentTokenType = tokenTypeOf(codePoint, treatAsText); + treatAsText = false; + if (shouldCreateNewToken(previousTokenType, currentTokenType)) { + const token = convertBufferToToken(previousTokenType); + previousTokenType = currentTokenType; + buffer.push(codePoint); + tokens.push(token); + } + else { + previousTokenType = currentTokenType; + buffer.push(codePoint); + } + }); + if (buffer.length > 0) { + const token = convertBufferToToken(previousTokenType); + tokens.push(token); + } + if (treatAsText) { + throw (0, Errors_js_1.createTheEndOfLIneCanNotBeEscaped)(expression); + } + tokens.push(new Ast_js_1.Token(Ast_js_1.TokenType.endOfLine, '', codePoints.length, codePoints.length)); + return tokens; + } +} +exports.default = CucumberExpressionTokenizer; +//# sourceMappingURL=CucumberExpressionTokenizer.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionTokenizer.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionTokenizer.js.map new file mode 100644 index 00000000..3f1d94c0 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/CucumberExpressionTokenizer.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionTokenizer.js","sourceRoot":"","sources":["../../../src/CucumberExpressionTokenizer.ts"],"names":[],"mappings":";;AAAA,qCAA2C;AAC3C,2CAAkF;AAElF,MAAqB,2BAA2B;IAC9C,QAAQ,CAAC,UAAkB;QACzB,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACzC,MAAM,MAAM,GAAiB,EAAE,CAAA;QAC/B,IAAI,MAAM,GAAkB,EAAE,CAAA;QAC9B,IAAI,iBAAiB,GAAG,kBAAS,CAAC,WAAW,CAAA;QAC7C,IAAI,WAAW,GAAG,KAAK,CAAA;QACvB,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,IAAI,gBAAgB,GAAG,CAAC,CAAA;QAExB,SAAS,oBAAoB,CAAC,SAAoB;YAChD,IAAI,YAAY,GAAG,CAAC,CAAA;YACpB,IAAI,SAAS,IAAI,kBAAS,CAAC,IAAI,EAAE,CAAC;gBAChC,YAAY,GAAG,OAAO,CAAA;gBACtB,OAAO,GAAG,CAAC,CAAA;YACb,CAAC;YAED,MAAM,aAAa,GAAG,gBAAgB,GAAG,MAAM,CAAC,MAAM,GAAG,YAAY,CAAA;YACrE,MAAM,CAAC,GAAG,IAAI,cAAK,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAA;YAChF,MAAM,GAAG,EAAE,CAAA;YACX,gBAAgB,GAAG,aAAa,CAAA;YAChC,OAAO,CAAC,CAAA;QACV,CAAC;QAED,SAAS,WAAW,CAAC,SAAiB,EAAE,WAAoB;YAC1D,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,OAAO,cAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;YAChC,CAAC;YACD,IAAI,cAAK,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC/B,OAAO,kBAAS,CAAC,IAAI,CAAA;YACvB,CAAC;YACD,MAAM,IAAA,6BAAiB,EAAC,UAAU,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,CAAA;QACjF,CAAC;QAED,SAAS,oBAAoB,CAAC,iBAA4B,EAAE,gBAA2B;YACrF,IAAI,gBAAgB,IAAI,iBAAiB,EAAE,CAAC;gBAC1C,OAAO,IAAI,CAAA;YACb,CAAC;YACD,OAAO,gBAAgB,IAAI,kBAAS,CAAC,UAAU,IAAI,gBAAgB,IAAI,kBAAS,CAAC,IAAI,CAAA;QACvF,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,IAAI,cAAK,CAAC,kBAAS,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACzD,CAAC;QAED,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;YAC/B,IAAI,CAAC,WAAW,IAAI,cAAK,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,CAAC;gBACvD,OAAO,EAAE,CAAA;gBACT,WAAW,GAAG,IAAI,CAAA;gBAClB,OAAM;YACR,CAAC;YACD,MAAM,gBAAgB,GAAG,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;YAC5D,WAAW,GAAG,KAAK,CAAA;YAEnB,IAAI,oBAAoB,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,EAAE,CAAC;gBAC9D,MAAM,KAAK,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,CAAA;gBACrD,iBAAiB,GAAG,gBAAgB,CAAA;gBACpC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;gBACtB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACpB,CAAC;iBAAM,CAAC;gBACN,iBAAiB,GAAG,gBAAgB,CAAA;gBACpC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YACxB,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,CAAA;YACrD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACpB,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,IAAA,6CAAiC,EAAC,UAAU,CAAC,CAAA;QACrD,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,IAAI,cAAK,CAAC,kBAAS,CAAC,SAAS,EAAE,EAAE,EAAE,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAA;QACrF,OAAO,MAAM,CAAA;IACf,CAAC;CACF;AA7ED,8CA6EC"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Errors.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Errors.d.ts new file mode 100644 index 00000000..3ec2128d --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Errors.d.ts @@ -0,0 +1,25 @@ +import { Node, Token, TokenType } from './Ast.js'; +import CucumberExpressionError from './CucumberExpressionError.js'; +import GeneratedExpression from './GeneratedExpression.js'; +import ParameterType from './ParameterType.js'; +export declare function createAlternativeMayNotExclusivelyContainOptionals(node: Node, expression: string): CucumberExpressionError; +export declare function createAlternativeMayNotBeEmpty(node: Node, expression: string): CucumberExpressionError; +export declare function createOptionalMayNotBeEmpty(node: Node, expression: string): CucumberExpressionError; +export declare function createParameterIsNotAllowedInOptional(node: Node, expression: string): CucumberExpressionError; +export declare function createOptionalIsNotAllowedInOptional(node: Node, expression: string): CucumberExpressionError; +export declare function createTheEndOfLIneCanNotBeEscaped(expression: string): CucumberExpressionError; +export declare function createMissingEndToken(expression: string, beginToken: TokenType, endToken: TokenType, current: Token): CucumberExpressionError; +export declare function createAlternationNotAllowedInOptional(expression: string, current: Token): CucumberExpressionError; +export declare function createCantEscaped(expression: string, index: number): CucumberExpressionError; +export declare function createInvalidParameterTypeNameInNode(token: Token, expression: string): CucumberExpressionError; +export declare class AmbiguousParameterTypeError extends CucumberExpressionError { + static forRegExp(parameterTypeRegexp: string, expressionRegexp: RegExp, parameterTypes: readonly ParameterType[], generatedExpressions: readonly GeneratedExpression[]): AmbiguousParameterTypeError; + static _parameterTypeNames(parameterTypes: readonly ParameterType[]): string; + static _expressions(generatedExpressions: readonly GeneratedExpression[]): string; +} +export declare class UndefinedParameterTypeError extends CucumberExpressionError { + readonly undefinedParameterTypeName: string; + constructor(undefinedParameterTypeName: string, message: string); +} +export declare function createUndefinedParameterType(node: Node, expression: string, undefinedParameterTypeName: string): UndefinedParameterTypeError; +//# sourceMappingURL=Errors.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Errors.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Errors.d.ts.map new file mode 100644 index 00000000..3e9a8b30 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Errors.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"Errors.d.ts","sourceRoot":"","sources":["../../../src/Errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,IAAI,EAAuB,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAC/E,OAAO,uBAAuB,MAAM,8BAA8B,CAAA;AAClE,OAAO,mBAAmB,MAAM,0BAA0B,CAAA;AAC1D,OAAO,aAAa,MAAM,oBAAoB,CAAA;AAE9C,wBAAgB,kDAAkD,CAChE,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,GACjB,uBAAuB,CAUzB;AACD,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,GACjB,uBAAuB,CAUzB;AACD,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,GACjB,uBAAuB,CAUzB;AACD,wBAAgB,qCAAqC,CACnD,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,GACjB,uBAAuB,CAUzB;AAED,wBAAgB,oCAAoC,CAClD,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,GACjB,uBAAuB,CAUzB;AAED,wBAAgB,iCAAiC,CAAC,UAAU,EAAE,MAAM,GAAG,uBAAuB,CAW7F;AAED,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,SAAS,EACrB,QAAQ,EAAE,SAAS,EACnB,OAAO,EAAE,KAAK,2BAcf;AAED,wBAAgB,qCAAqC,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,2BAUvF;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,2BAUlE;AAED,wBAAgB,oCAAoC,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,2BAUpF;AAqCD,qBAAa,2BAA4B,SAAQ,uBAAuB;WACxD,SAAS,CACrB,mBAAmB,EAAE,MAAM,EAC3B,gBAAgB,EAAE,MAAM,EACxB,cAAc,EAAE,SAAS,aAAa,CAAC,OAAO,CAAC,EAAE,EACjD,oBAAoB,EAAE,SAAS,mBAAmB,EAAE;WAiBxC,mBAAmB,CAAC,cAAc,EAAE,SAAS,aAAa,CAAC,OAAO,CAAC,EAAE;WAIrE,YAAY,CAAC,oBAAoB,EAAE,SAAS,mBAAmB,EAAE;CAGhF;AAED,qBAAa,2BAA4B,SAAQ,uBAAuB;aAEpD,0BAA0B,EAAE,MAAM;gBAAlC,0BAA0B,EAAE,MAAM,EAClD,OAAO,EAAE,MAAM;CAIlB;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,0BAA0B,EAAE,MAAM,+BAYnC"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Errors.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Errors.js new file mode 100644 index 00000000..7b298039 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Errors.js @@ -0,0 +1,113 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UndefinedParameterTypeError = exports.AmbiguousParameterTypeError = void 0; +exports.createAlternativeMayNotExclusivelyContainOptionals = createAlternativeMayNotExclusivelyContainOptionals; +exports.createAlternativeMayNotBeEmpty = createAlternativeMayNotBeEmpty; +exports.createOptionalMayNotBeEmpty = createOptionalMayNotBeEmpty; +exports.createParameterIsNotAllowedInOptional = createParameterIsNotAllowedInOptional; +exports.createOptionalIsNotAllowedInOptional = createOptionalIsNotAllowedInOptional; +exports.createTheEndOfLIneCanNotBeEscaped = createTheEndOfLIneCanNotBeEscaped; +exports.createMissingEndToken = createMissingEndToken; +exports.createAlternationNotAllowedInOptional = createAlternationNotAllowedInOptional; +exports.createCantEscaped = createCantEscaped; +exports.createInvalidParameterTypeNameInNode = createInvalidParameterTypeNameInNode; +exports.createUndefinedParameterType = createUndefinedParameterType; +const Ast_js_1 = require("./Ast.js"); +const CucumberExpressionError_js_1 = __importDefault(require("./CucumberExpressionError.js")); +function createAlternativeMayNotExclusivelyContainOptionals(node, expression) { + return new CucumberExpressionError_js_1.default(message(node.start, expression, pointAtLocated(node), 'An alternative may not exclusively contain optionals', "If you did not mean to use an optional you can use '\\(' to escape the '('")); +} +function createAlternativeMayNotBeEmpty(node, expression) { + return new CucumberExpressionError_js_1.default(message(node.start, expression, pointAtLocated(node), 'Alternative may not be empty', "If you did not mean to use an alternative you can use '\\/' to escape the '/'")); +} +function createOptionalMayNotBeEmpty(node, expression) { + return new CucumberExpressionError_js_1.default(message(node.start, expression, pointAtLocated(node), 'An optional must contain some text', "If you did not mean to use an optional you can use '\\(' to escape the '('")); +} +function createParameterIsNotAllowedInOptional(node, expression) { + return new CucumberExpressionError_js_1.default(message(node.start, expression, pointAtLocated(node), 'An optional may not contain a parameter type', "If you did not mean to use an parameter type you can use '\\{' to escape the '{'")); +} +function createOptionalIsNotAllowedInOptional(node, expression) { + return new CucumberExpressionError_js_1.default(message(node.start, expression, pointAtLocated(node), 'An optional may not contain an other optional', "If you did not mean to use an optional type you can use '\\(' to escape the '('. For more complicated expressions consider using a regular expression instead.")); +} +function createTheEndOfLIneCanNotBeEscaped(expression) { + const index = Array.from(expression).length - 1; + return new CucumberExpressionError_js_1.default(message(index, expression, pointAt(index), 'The end of line can not be escaped', "You can use '\\\\' to escape the '\\'")); +} +function createMissingEndToken(expression, beginToken, endToken, current) { + const beginSymbol = (0, Ast_js_1.symbolOf)(beginToken); + const endSymbol = (0, Ast_js_1.symbolOf)(endToken); + const purpose = (0, Ast_js_1.purposeOf)(beginToken); + return new CucumberExpressionError_js_1.default(message(current.start, expression, pointAtLocated(current), `The '${beginSymbol}' does not have a matching '${endSymbol}'`, `If you did not intend to use ${purpose} you can use '\\${beginSymbol}' to escape the ${purpose}`)); +} +function createAlternationNotAllowedInOptional(expression, current) { + return new CucumberExpressionError_js_1.default(message(current.start, expression, pointAtLocated(current), 'An alternation can not be used inside an optional', "If you did not mean to use an alternation you can use '\\/' to escape the '/'. Otherwise rephrase your expression or consider using a regular expression instead.")); +} +function createCantEscaped(expression, index) { + return new CucumberExpressionError_js_1.default(message(index, expression, pointAt(index), "Only the characters '{', '}', '(', ')', '\\', '/' and whitespace can be escaped", "If you did mean to use an '\\' you can use '\\\\' to escape it")); +} +function createInvalidParameterTypeNameInNode(token, expression) { + return new CucumberExpressionError_js_1.default(message(token.start, expression, pointAtLocated(token), "Parameter names may not contain '{', '}', '(', ')', '\\' or '/'", 'Did you mean to use a regular expression?')); +} +function message(index, expression, pointer, problem, solution) { + return `This Cucumber Expression has a problem at column ${index + 1}: + +${expression} +${pointer} +${problem}. +${solution}`; +} +function pointAt(index) { + const pointer = []; + for (let i = 0; i < index; i++) { + pointer.push(' '); + } + pointer.push('^'); + return pointer.join(''); +} +function pointAtLocated(node) { + const pointer = [pointAt(node.start)]; + if (node.start + 1 < node.end) { + for (let i = node.start + 1; i < node.end - 1; i++) { + pointer.push('-'); + } + pointer.push('^'); + } + return pointer.join(''); +} +class AmbiguousParameterTypeError extends CucumberExpressionError_js_1.default { + static forRegExp(parameterTypeRegexp, expressionRegexp, parameterTypes, generatedExpressions) { + return new this(`Your Regular Expression ${expressionRegexp} +matches multiple parameter types with regexp ${parameterTypeRegexp}: + ${this._parameterTypeNames(parameterTypes)} + +I couldn't decide which one to use. You have two options: + +1) Use a Cucumber Expression instead of a Regular Expression. Try one of these: + ${this._expressions(generatedExpressions)} + +2) Make one of the parameter types preferential and continue to use a Regular Expression. +`); + } + static _parameterTypeNames(parameterTypes) { + return parameterTypes.map((p) => `{${p.name}}`).join('\n '); + } + static _expressions(generatedExpressions) { + return generatedExpressions.map((e) => e.source).join('\n '); + } +} +exports.AmbiguousParameterTypeError = AmbiguousParameterTypeError; +class UndefinedParameterTypeError extends CucumberExpressionError_js_1.default { + undefinedParameterTypeName; + constructor(undefinedParameterTypeName, message) { + super(message); + this.undefinedParameterTypeName = undefinedParameterTypeName; + } +} +exports.UndefinedParameterTypeError = UndefinedParameterTypeError; +function createUndefinedParameterType(node, expression, undefinedParameterTypeName) { + return new UndefinedParameterTypeError(undefinedParameterTypeName, message(node.start, expression, pointAtLocated(node), `Undefined parameter type '${undefinedParameterTypeName}'`, `Please register a ParameterType for '${undefinedParameterTypeName}'`)); +} +//# sourceMappingURL=Errors.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Errors.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Errors.js.map new file mode 100644 index 00000000..573bbd0a --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Errors.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Errors.js","sourceRoot":"","sources":["../../../src/Errors.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ExpressionFactory.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ExpressionFactory.d.ts new file mode 100644 index 00000000..ae75fd08 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ExpressionFactory.d.ts @@ -0,0 +1,8 @@ +import ParameterTypeRegistry from './ParameterTypeRegistry.js'; +import { Expression } from './types.js'; +export default class ExpressionFactory { + private readonly parameterTypeRegistry; + constructor(parameterTypeRegistry: ParameterTypeRegistry); + createExpression(expression: string | RegExp): Expression; +} +//# sourceMappingURL=ExpressionFactory.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ExpressionFactory.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ExpressionFactory.d.ts.map new file mode 100644 index 00000000..01f33472 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ExpressionFactory.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ExpressionFactory.d.ts","sourceRoot":"","sources":["../../../src/ExpressionFactory.ts"],"names":[],"mappings":"AACA,OAAO,qBAAqB,MAAM,4BAA4B,CAAA;AAE9D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvC,MAAM,CAAC,OAAO,OAAO,iBAAiB;IACjB,OAAO,CAAC,QAAQ,CAAC,qBAAqB;gBAArB,qBAAqB,EAAE,qBAAqB;IAEzE,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU;CAKjE"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ExpressionFactory.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ExpressionFactory.js new file mode 100644 index 00000000..55e37699 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ExpressionFactory.js @@ -0,0 +1,20 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const CucumberExpression_js_1 = __importDefault(require("./CucumberExpression.js")); +const RegularExpression_js_1 = __importDefault(require("./RegularExpression.js")); +class ExpressionFactory { + parameterTypeRegistry; + constructor(parameterTypeRegistry) { + this.parameterTypeRegistry = parameterTypeRegistry; + } + createExpression(expression) { + return typeof expression === 'string' + ? new CucumberExpression_js_1.default(expression, this.parameterTypeRegistry) + : new RegularExpression_js_1.default(expression, this.parameterTypeRegistry); + } +} +exports.default = ExpressionFactory; +//# sourceMappingURL=ExpressionFactory.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ExpressionFactory.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ExpressionFactory.js.map new file mode 100644 index 00000000..1609342b --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ExpressionFactory.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ExpressionFactory.js","sourceRoot":"","sources":["../../../src/ExpressionFactory.ts"],"names":[],"mappings":";;;;;AAAA,oFAAwD;AAExD,kFAAsD;AAGtD,MAAqB,iBAAiB;IACA;IAApC,YAAoC,qBAA4C;QAA5C,0BAAqB,GAArB,qBAAqB,CAAuB;IAAG,CAAC;IAE7E,gBAAgB,CAAC,UAA2B;QACjD,OAAO,OAAO,UAAU,KAAK,QAAQ;YACnC,CAAC,CAAC,IAAI,+BAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,qBAAqB,CAAC;YAChE,CAAC,CAAC,IAAI,8BAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAA;IACnE,CAAC;CACF;AARD,oCAQC"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GeneratedExpression.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GeneratedExpression.d.ts new file mode 100644 index 00000000..da55600b --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GeneratedExpression.d.ts @@ -0,0 +1,19 @@ +import ParameterType from './ParameterType.js'; +import { ParameterInfo } from './types.js'; +export default class GeneratedExpression { + private readonly expressionTemplate; + readonly parameterTypes: readonly ParameterType[]; + constructor(expressionTemplate: string, parameterTypes: readonly ParameterType[]); + get source(): string; + /** + * Returns an array of parameter names to use in generated function/method signatures + * + * @returns {ReadonlyArray.} + */ + get parameterNames(): readonly string[]; + /** + * Returns an array of ParameterInfo to use in generated function/method signatures + */ + get parameterInfos(): readonly ParameterInfo[]; +} +//# sourceMappingURL=GeneratedExpression.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GeneratedExpression.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GeneratedExpression.d.ts.map new file mode 100644 index 00000000..4fdd5888 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GeneratedExpression.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"GeneratedExpression.d.ts","sourceRoot":"","sources":["../../../src/GeneratedExpression.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE1C,MAAM,CAAC,OAAO,OAAO,mBAAmB;IAEpC,OAAO,CAAC,QAAQ,CAAC,kBAAkB;aACnB,cAAc,EAAE,SAAS,aAAa,CAAC,OAAO,CAAC,EAAE;gBADhD,kBAAkB,EAAE,MAAM,EAC3B,cAAc,EAAE,SAAS,aAAa,CAAC,OAAO,CAAC,EAAE;IAGnE,IAAI,MAAM,WAET;IAED;;;;OAIG;IACH,IAAI,cAAc,IAAI,SAAS,MAAM,EAAE,CAEtC;IAED;;OAEG;IACH,IAAI,cAAc,IAAI,SAAS,aAAa,EAAE,CAG7C;CACF"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GeneratedExpression.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GeneratedExpression.js new file mode 100644 index 00000000..3bf945c1 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GeneratedExpression.js @@ -0,0 +1,59 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class GeneratedExpression { + expressionTemplate; + parameterTypes; + constructor(expressionTemplate, parameterTypes) { + this.expressionTemplate = expressionTemplate; + this.parameterTypes = parameterTypes; + } + get source() { + return format(this.expressionTemplate, ...this.parameterTypes.map((t) => t.name || '')); + } + /** + * Returns an array of parameter names to use in generated function/method signatures + * + * @returns {ReadonlyArray.} + */ + get parameterNames() { + return this.parameterInfos.map((i) => `${i.name}${i.count === 1 ? '' : i.count.toString()}`); + } + /** + * Returns an array of ParameterInfo to use in generated function/method signatures + */ + get parameterInfos() { + const usageByTypeName = {}; + return this.parameterTypes.map((t) => getParameterInfo(t, usageByTypeName)); + } +} +exports.default = GeneratedExpression; +function getParameterInfo(parameterType, usageByName) { + const name = parameterType.name || ''; + let counter = usageByName[name]; + counter = counter ? counter + 1 : 1; + usageByName[name] = counter; + let type; + if (parameterType.type) { + if (typeof parameterType.type === 'string') { + type = parameterType.type; + } + else if ('name' in parameterType.type) { + type = parameterType.type.name; + } + else { + type = null; + } + } + else { + type = null; + } + return { + type, + name, + count: counter, + }; +} +function format(pattern, ...args) { + return pattern.replace(/{(\d+)}/g, (match, number) => args[number]); +} +//# sourceMappingURL=GeneratedExpression.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GeneratedExpression.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GeneratedExpression.js.map new file mode 100644 index 00000000..baccb610 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GeneratedExpression.js.map @@ -0,0 +1 @@ +{"version":3,"file":"GeneratedExpression.js","sourceRoot":"","sources":["../../../src/GeneratedExpression.ts"],"names":[],"mappings":";;AAGA,MAAqB,mBAAmB;IAEnB;IACD;IAFlB,YACmB,kBAA0B,EAC3B,cAAiD;QADhD,uBAAkB,GAAlB,kBAAkB,CAAQ;QAC3B,mBAAc,GAAd,cAAc,CAAmC;IAChE,CAAC;IAEJ,IAAI,MAAM;QACR,OAAO,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAA;IACzF,CAAC;IAED;;;;OAIG;IACH,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;IAC9F,CAAC;IAED;;OAEG;IACH,IAAI,cAAc;QAChB,MAAM,eAAe,GAA8B,EAAE,CAAA;QACrD,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAA;IAC7E,CAAC;CACF;AA1BD,sCA0BC;AAED,SAAS,gBAAgB,CACvB,aAAqC,EACrC,WAAsC;IAEtC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,IAAI,EAAE,CAAA;IACrC,IAAI,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;IAC/B,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACnC,WAAW,CAAC,IAAI,CAAC,GAAG,OAAO,CAAA;IAC3B,IAAI,IAAmB,CAAA;IACvB,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC;QACvB,IAAI,OAAO,aAAa,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3C,IAAI,GAAG,aAAa,CAAC,IAAI,CAAA;QAC3B,CAAC;aAAM,IAAI,MAAM,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC;YACxC,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAA;QAChC,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,IAAI,CAAA;QACb,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,IAAI,CAAA;IACb,CAAC;IACD,OAAO;QACL,IAAI;QACJ,IAAI;QACJ,KAAK,EAAE,OAAO;KACf,CAAA;AACH,CAAC;AAED,SAAS,MAAM,CAAC,OAAe,EAAE,GAAG,IAAuB;IACzD,OAAO,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;AACrE,CAAC"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Group.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Group.d.ts new file mode 100644 index 00000000..f4f4bbfc --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Group.d.ts @@ -0,0 +1,20 @@ +export default class Group { + readonly value: string; + readonly start: number | undefined; + readonly end: number | undefined; + /** + * A groups children. + * + * There are either one or more children or the attribute is undefined. + */ + readonly children: readonly Group[] | undefined; + constructor(value: string, start: number | undefined, end: number | undefined, + /** + * A groups children. + * + * There are either one or more children or the attribute is undefined. + */ + children: readonly Group[] | undefined); + get values(): string[] | null; +} +//# sourceMappingURL=Group.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Group.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Group.d.ts.map new file mode 100644 index 00000000..e735b88e --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Group.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"Group.d.ts","sourceRoot":"","sources":["../../../src/Group.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,KAAK;aAEN,KAAK,EAAE,MAAM;aACb,KAAK,EAAE,MAAM,GAAG,SAAS;aACzB,GAAG,EAAE,MAAM,GAAG,SAAS;IACvC;;;;OAIG;aACa,QAAQ,EAAE,SAAS,KAAK,EAAE,GAAG,SAAS;gBARtC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,GAAG,EAAE,MAAM,GAAG,SAAS;IACvC;;;;OAIG;IACa,QAAQ,EAAE,SAAS,KAAK,EAAE,GAAG,SAAS;IAGxD,IAAI,MAAM,IAAI,MAAM,EAAE,GAAG,IAAI,CAE5B;CACF"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Group.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Group.js new file mode 100644 index 00000000..14148bae --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Group.js @@ -0,0 +1,25 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class Group { + value; + start; + end; + children; + constructor(value, start, end, + /** + * A groups children. + * + * There are either one or more children or the attribute is undefined. + */ + children) { + this.value = value; + this.start = start; + this.end = end; + this.children = children; + } + get values() { + return (this.children === undefined ? [this] : this.children).map((g) => g.value); + } +} +exports.default = Group; +//# sourceMappingURL=Group.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Group.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Group.js.map new file mode 100644 index 00000000..1fc69f77 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/Group.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Group.js","sourceRoot":"","sources":["../../../src/Group.ts"],"names":[],"mappings":";;AAAA,MAAqB,KAAK;IAEN;IACA;IACA;IAMA;IATlB,YACkB,KAAa,EACb,KAAyB,EACzB,GAAuB;IACvC;;;;OAIG;IACa,QAAsC;QARtC,UAAK,GAAL,KAAK,CAAQ;QACb,UAAK,GAAL,KAAK,CAAoB;QACzB,QAAG,GAAH,GAAG,CAAoB;QAMvB,aAAQ,GAAR,QAAQ,CAA8B;IACrD,CAAC;IAEJ,IAAI,MAAM;QACR,OAAO,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IACnF,CAAC;CACF;AAhBD,wBAgBC"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GroupBuilder.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GroupBuilder.d.ts new file mode 100644 index 00000000..d929deb1 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GroupBuilder.d.ts @@ -0,0 +1,13 @@ +import { RegExpExecArray } from 'regexp-match-indices'; +import Group from './Group.js'; +export default class GroupBuilder { + source: string; + capturing: boolean; + private readonly groupBuilders; + add(groupBuilder: GroupBuilder): void; + build(match: RegExpExecArray, nextGroupIndex: () => number): Group; + setNonCapturing(): void; + get children(): GroupBuilder[]; + moveChildrenTo(groupBuilder: GroupBuilder): void; +} +//# sourceMappingURL=GroupBuilder.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GroupBuilder.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GroupBuilder.d.ts.map new file mode 100644 index 00000000..2fd69d03 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GroupBuilder.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"GroupBuilder.d.ts","sourceRoot":"","sources":["../../../src/GroupBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD,OAAO,KAAK,MAAM,YAAY,CAAA;AAE9B,MAAM,CAAC,OAAO,OAAO,YAAY;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,UAAO;IACvB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IAE5C,GAAG,CAAC,YAAY,EAAE,YAAY;IAI9B,KAAK,CAAC,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,GAAG,KAAK;IAUlE,eAAe;IAItB,IAAI,QAAQ,mBAEX;IAEM,cAAc,CAAC,YAAY,EAAE,YAAY;CAGjD"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GroupBuilder.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GroupBuilder.js new file mode 100644 index 00000000..95a3f0b9 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GroupBuilder.js @@ -0,0 +1,34 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const Group_js_1 = __importDefault(require("./Group.js")); +class GroupBuilder { + source; + capturing = true; + groupBuilders = []; + add(groupBuilder) { + this.groupBuilders.push(groupBuilder); + } + build(match, nextGroupIndex) { + const groupIndex = nextGroupIndex(); + const children = this.groupBuilders.map((gb) => gb.build(match, nextGroupIndex)); + const value = match[groupIndex]; + const index = match.indices[groupIndex]; + const start = index ? index[0] : undefined; + const end = index ? index[1] : undefined; + return new Group_js_1.default(value, start, end, children.length === 0 ? undefined : children); + } + setNonCapturing() { + this.capturing = false; + } + get children() { + return this.groupBuilders; + } + moveChildrenTo(groupBuilder) { + this.groupBuilders.forEach((child) => groupBuilder.add(child)); + } +} +exports.default = GroupBuilder; +//# sourceMappingURL=GroupBuilder.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GroupBuilder.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GroupBuilder.js.map new file mode 100644 index 00000000..5dc9ee1b --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/GroupBuilder.js.map @@ -0,0 +1 @@ +{"version":3,"file":"GroupBuilder.js","sourceRoot":"","sources":["../../../src/GroupBuilder.ts"],"names":[],"mappings":";;;;;AAEA,0DAA8B;AAE9B,MAAqB,YAAY;IACxB,MAAM,CAAQ;IACd,SAAS,GAAG,IAAI,CAAA;IACN,aAAa,GAAmB,EAAE,CAAA;IAE5C,GAAG,CAAC,YAA0B;QACnC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACvC,CAAC;IAEM,KAAK,CAAC,KAAsB,EAAE,cAA4B;QAC/D,MAAM,UAAU,GAAG,cAAc,EAAE,CAAA;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAA;QAChF,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,CAAA;QAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QACvC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAC1C,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACxC,OAAO,IAAI,kBAAK,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;IACnF,CAAC;IAEM,eAAe;QACpB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;IACxB,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,aAAa,CAAA;IAC3B,CAAC;IAEM,cAAc,CAAC,YAA0B;QAC9C,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;IAChE,CAAC;CACF;AA9BD,+BA8BC"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterType.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterType.d.ts new file mode 100644 index 00000000..e11660f1 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterType.d.ts @@ -0,0 +1,32 @@ +interface Constructor { + new (...args: unknown[]): T; + prototype: T; +} +type Factory = (...args: unknown[]) => T; +export type RegExps = StringOrRegExp | readonly StringOrRegExp[]; +export type StringOrRegExp = string | RegExp; +export default class ParameterType { + readonly name: string | undefined; + readonly type: Constructor | Factory | null; + readonly useForSnippets?: boolean | undefined; + readonly preferForRegexpMatch?: boolean | undefined; + readonly builtin?: boolean | undefined; + private transformFn; + static compare(pt1: ParameterType, pt2: ParameterType): number; + static checkParameterTypeName(typeName: string): void; + static isValidParameterTypeName(typeName: string): boolean; + regexpStrings: readonly string[]; + /** + * @param name {String} the name of the type + * @param regexps {Array.,RegExp,String} that matche the type + * @param type {Function} the prototype (constructor) of the type. May be null. + * @param transform {Function} function transforming string to another type. May be null. + * @param useForSnippets {boolean} true if this should be used for snippets. Defaults to true. + * @param preferForRegexpMatch {boolean} true if this is a preferential type. Defaults to false. + * @param builtin whether or not this is a built-in type + */ + constructor(name: string | undefined, regexps: RegExps, type: Constructor | Factory | null, transform?: (...match: string[]) => T | PromiseLike, useForSnippets?: boolean | undefined, preferForRegexpMatch?: boolean | undefined, builtin?: boolean | undefined); + transform(thisObj: unknown, groupValues: string[] | null): any; +} +export {}; +//# sourceMappingURL=ParameterType.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterType.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterType.d.ts.map new file mode 100644 index 00000000..131dba66 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterType.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ParameterType.d.ts","sourceRoot":"","sources":["../../../src/ParameterType.ts"],"names":[],"mappings":"AAKA,UAAU,WAAW,CAAC,CAAC;IACrB,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAA;IAC3B,SAAS,EAAE,CAAC,CAAA;CACb;AAED,KAAK,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;AAE3C,MAAM,MAAM,OAAO,GAAG,cAAc,GAAG,SAAS,cAAc,EAAE,CAAA;AAEhE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,CAAA;AAE5C,MAAM,CAAC,OAAO,OAAO,aAAa,CAAC,CAAC;aAsChB,IAAI,EAAE,MAAM,GAAG,SAAS;aAExB,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;aAExC,cAAc,CAAC,EAAE,OAAO;aACxB,oBAAoB,CAAC,EAAE,OAAO;aAC9B,OAAO,CAAC,EAAE,OAAO;IA3CnC,OAAO,CAAC,WAAW,CAAqD;WAE1D,OAAO,CAAC,GAAG,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,OAAO,CAAC;WAUhE,sBAAsB,CAAC,QAAQ,EAAE,MAAM;WAQvC,wBAAwB,CAAC,QAAQ,EAAE,MAAM;IAKhD,aAAa,EAAE,SAAS,MAAM,EAAE,CAAA;IAEvC;;;;;;;;OAQG;gBAEe,IAAI,EAAE,MAAM,GAAG,SAAS,EACxC,OAAO,EAAE,OAAO,EACA,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,EACxD,SAAS,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,EACtC,cAAc,CAAC,EAAE,OAAO,YAAA,EACxB,oBAAoB,CAAC,EAAE,OAAO,YAAA,EAC9B,OAAO,CAAC,EAAE,OAAO,YAAA;IAoB5B,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI;CAGhE"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterType.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterType.js new file mode 100644 index 00000000..fb8b7eb1 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterType.js @@ -0,0 +1,101 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const CucumberExpressionError_js_1 = __importDefault(require("./CucumberExpressionError.js")); +const ILLEGAL_PARAMETER_NAME_PATTERN = /([[\]()$.|?*+])/; +const UNESCAPE_PATTERN = () => /(\\([[$.|?*+\]]))/g; +class ParameterType { + name; + type; + useForSnippets; + preferForRegexpMatch; + builtin; + transformFn; + static compare(pt1, pt2) { + if (pt1.preferForRegexpMatch && !pt2.preferForRegexpMatch) { + return -1; + } + if (pt2.preferForRegexpMatch && !pt1.preferForRegexpMatch) { + return 1; + } + return (pt1.name || '').localeCompare(pt2.name || ''); + } + static checkParameterTypeName(typeName) { + if (!this.isValidParameterTypeName(typeName)) { + throw new CucumberExpressionError_js_1.default(`Illegal character in parameter name {${typeName}}. Parameter names may not contain '{', '}', '(', ')', '\\' or '/'`); + } + } + static isValidParameterTypeName(typeName) { + const unescapedTypeName = typeName.replace(UNESCAPE_PATTERN(), '$2'); + return !unescapedTypeName.match(ILLEGAL_PARAMETER_NAME_PATTERN); + } + regexpStrings; + /** + * @param name {String} the name of the type + * @param regexps {Array.,RegExp,String} that matche the type + * @param type {Function} the prototype (constructor) of the type. May be null. + * @param transform {Function} function transforming string to another type. May be null. + * @param useForSnippets {boolean} true if this should be used for snippets. Defaults to true. + * @param preferForRegexpMatch {boolean} true if this is a preferential type. Defaults to false. + * @param builtin whether or not this is a built-in type + */ + constructor(name, regexps, type, transform, useForSnippets, preferForRegexpMatch, builtin) { + this.name = name; + this.type = type; + this.useForSnippets = useForSnippets; + this.preferForRegexpMatch = preferForRegexpMatch; + this.builtin = builtin; + if (transform === undefined) { + transform = (s) => s; + } + if (useForSnippets === undefined) { + this.useForSnippets = true; + } + if (preferForRegexpMatch === undefined) { + this.preferForRegexpMatch = false; + } + if (name) { + ParameterType.checkParameterTypeName(name); + } + this.regexpStrings = stringArray(regexps); + this.transformFn = transform; + } + transform(thisObj, groupValues) { + return this.transformFn.apply(thisObj, groupValues); + } +} +exports.default = ParameterType; +function stringArray(regexps) { + const array = Array.isArray(regexps) ? regexps : [regexps]; + return array.map((r) => (r instanceof RegExp ? regexpSource(r) : r)); +} +function regexpSource(regexp) { + const flags = regexpFlags(regexp); + for (const flag of ['g', 'i', 'm', 'y']) { + if (flags.indexOf(flag) !== -1) { + throw new CucumberExpressionError_js_1.default(`ParameterType Regexps can't use flag '${flag}'`); + } + } + return regexp.source; +} +// Backport RegExp.flags for Node 4.x +// https://github.com/nodejs/node/issues/8390 +function regexpFlags(regexp) { + let flags = regexp.flags; + if (flags === undefined) { + flags = ''; + if (regexp.ignoreCase) { + flags += 'i'; + } + if (regexp.global) { + flags += 'g'; + } + if (regexp.multiline) { + flags += 'm'; + } + } + return flags; +} +//# sourceMappingURL=ParameterType.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterType.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterType.js.map new file mode 100644 index 00000000..790af88a --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterType.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ParameterType.js","sourceRoot":"","sources":["../../../src/ParameterType.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeMatcher.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeMatcher.d.ts new file mode 100644 index 00000000..67de4fca --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeMatcher.d.ts @@ -0,0 +1,18 @@ +import ParameterType from './ParameterType.js'; +export default class ParameterTypeMatcher { + readonly parameterType: ParameterType; + private readonly regexpString; + private readonly text; + private matchPosition; + private readonly match; + constructor(parameterType: ParameterType, regexpString: string, text: string, matchPosition?: number); + advanceTo(newMatchPosition: number): ParameterTypeMatcher; + get find(): boolean | RegExpMatchArray | null; + get start(): number; + get fullWord(): true | RegExpMatchArray | null; + get matchStartWord(): true | RegExpMatchArray | null; + get matchEndWord(): true | RegExpMatchArray | null; + get group(): string; + static compare(a: ParameterTypeMatcher, b: ParameterTypeMatcher): number; +} +//# sourceMappingURL=ParameterTypeMatcher.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeMatcher.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeMatcher.d.ts.map new file mode 100644 index 00000000..6801207f --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeMatcher.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ParameterTypeMatcher.d.ts","sourceRoot":"","sources":["../../../src/ParameterTypeMatcher.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,oBAAoB,CAAA;AAE9C,MAAM,CAAC,OAAO,OAAO,oBAAoB;aAIrB,aAAa,EAAE,aAAa,CAAC,OAAO,CAAC;IACrD,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,aAAa;IANvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwB;gBAG5B,aAAa,EAAE,aAAa,CAAC,OAAO,CAAC,EACpC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACrB,aAAa,GAAE,MAAU;IAM5B,SAAS,CAAC,gBAAgB,EAAE,MAAM;IAsBzC,IAAI,IAAI,sCAEP;IAED,IAAI,KAAK,WAGR;IAED,IAAI,QAAQ,mCAEX;IAED,IAAI,cAAc,mCAEjB;IAED,IAAI,YAAY,mCAMf;IAED,IAAI,KAAK,WAGR;WAEa,OAAO,CAAC,CAAC,EAAE,oBAAoB,EAAE,CAAC,EAAE,oBAAoB;CAWvE"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeMatcher.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeMatcher.js new file mode 100644 index 00000000..e97e39bd --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeMatcher.js @@ -0,0 +1,63 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class ParameterTypeMatcher { + parameterType; + regexpString; + text; + matchPosition; + match; + constructor(parameterType, regexpString, text, matchPosition = 0) { + this.parameterType = parameterType; + this.regexpString = regexpString; + this.text = text; + this.matchPosition = matchPosition; + const captureGroupRegexp = new RegExp(`(${regexpString})`); + this.match = captureGroupRegexp.exec(text.slice(this.matchPosition)); + } + advanceTo(newMatchPosition) { + for (let advancedPos = newMatchPosition; advancedPos < this.text.length; advancedPos++) { + const matcher = new ParameterTypeMatcher(this.parameterType, this.regexpString, this.text, advancedPos); + if (matcher.find) { + return matcher; + } + } + return new ParameterTypeMatcher(this.parameterType, this.regexpString, this.text, this.text.length); + } + get find() { + return this.match && this.group !== '' && this.fullWord; + } + get start() { + if (!this.match) + throw new Error('No match'); + return this.matchPosition + this.match.index; + } + get fullWord() { + return this.matchStartWord && this.matchEndWord; + } + get matchStartWord() { + return this.start === 0 || this.text[this.start - 1].match(/\p{Z}|\p{P}|\p{S}/u); + } + get matchEndWord() { + const nextCharacterIndex = this.start + this.group.length; + return (nextCharacterIndex === this.text.length || + this.text[nextCharacterIndex].match(/\p{Z}|\p{P}|\p{S}/u)); + } + get group() { + if (!this.match) + throw new Error('No match'); + return this.match[0]; + } + static compare(a, b) { + const posComparison = a.start - b.start; + if (posComparison !== 0) { + return posComparison; + } + const lengthComparison = b.group.length - a.group.length; + if (lengthComparison !== 0) { + return lengthComparison; + } + return 0; + } +} +exports.default = ParameterTypeMatcher; +//# sourceMappingURL=ParameterTypeMatcher.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeMatcher.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeMatcher.js.map new file mode 100644 index 00000000..06276849 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeMatcher.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ParameterTypeMatcher.js","sourceRoot":"","sources":["../../../src/ParameterTypeMatcher.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeRegistry.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeRegistry.d.ts new file mode 100644 index 00000000..e0d4a6c2 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeRegistry.d.ts @@ -0,0 +1,12 @@ +import ParameterType from './ParameterType.js'; +import { DefinesParameterType } from './types.js'; +export default class ParameterTypeRegistry implements DefinesParameterType { + private readonly parameterTypeByName; + private readonly parameterTypesByRegexp; + constructor(); + get parameterTypes(): IterableIterator>; + lookupByTypeName(typeName: string): ParameterType | undefined; + lookupByRegexp(parameterTypeRegexp: string, expressionRegexp: RegExp, text: string): ParameterType | undefined; + defineParameterType(parameterType: ParameterType): void; +} +//# sourceMappingURL=ParameterTypeRegistry.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeRegistry.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeRegistry.d.ts.map new file mode 100644 index 00000000..2d43a6d3 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeRegistry.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ParameterTypeRegistry.d.ts","sourceRoot":"","sources":["../../../src/ParameterTypeRegistry.ts"],"names":[],"mappings":"AAIA,OAAO,aAAa,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAEjD,MAAM,CAAC,OAAO,OAAO,qBAAsB,YAAW,oBAAoB;IACxE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA4C;IAChF,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAmD;;IAM1F,IAAI,cAAc,IAAI,gBAAgB,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAE7D;IAEM,gBAAgB,CAAC,QAAQ,EAAE,MAAM;IAIjC,cAAc,CACnB,mBAAmB,EAAE,MAAM,EAC3B,gBAAgB,EAAE,MAAM,EACxB,IAAI,EAAE,MAAM,GACX,aAAa,CAAC,OAAO,CAAC,GAAG,SAAS;IAsB9B,mBAAmB,CAAC,aAAa,EAAE,aAAa,CAAC,OAAO,CAAC;CAwCjE"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeRegistry.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeRegistry.js new file mode 100644 index 00000000..78f8d9f6 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeRegistry.js @@ -0,0 +1,70 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const CucumberExpressionError_js_1 = __importDefault(require("./CucumberExpressionError.js")); +const CucumberExpressionGenerator_js_1 = __importDefault(require("./CucumberExpressionGenerator.js")); +const defineDefaultParameterTypes_js_1 = __importDefault(require("./defineDefaultParameterTypes.js")); +const Errors_js_1 = require("./Errors.js"); +const ParameterType_js_1 = __importDefault(require("./ParameterType.js")); +class ParameterTypeRegistry { + parameterTypeByName = new Map(); + parameterTypesByRegexp = new Map(); + constructor() { + (0, defineDefaultParameterTypes_js_1.default)(this); + } + get parameterTypes() { + return this.parameterTypeByName.values(); + } + lookupByTypeName(typeName) { + return this.parameterTypeByName.get(typeName); + } + lookupByRegexp(parameterTypeRegexp, expressionRegexp, text) { + const parameterTypes = this.parameterTypesByRegexp.get(parameterTypeRegexp); + if (!parameterTypes) { + return undefined; + } + if (parameterTypes.length > 1 && !parameterTypes[0].preferForRegexpMatch) { + // We don't do this check on insertion because we only want to restrict + // ambiguity when we look up by Regexp. Users of CucumberExpression should + // not be restricted. + const generatedExpressions = new CucumberExpressionGenerator_js_1.default(() => this.parameterTypes).generateExpressions(text); + throw Errors_js_1.AmbiguousParameterTypeError.forRegExp(parameterTypeRegexp, expressionRegexp, parameterTypes, generatedExpressions); + } + return parameterTypes[0]; + } + defineParameterType(parameterType) { + if (parameterType.name !== undefined) { + if (this.parameterTypeByName.has(parameterType.name)) { + if (parameterType.name.length === 0) { + throw new CucumberExpressionError_js_1.default(`The anonymous parameter type has already been defined`); + } + else { + throw new CucumberExpressionError_js_1.default(`There is already a parameter type with name ${parameterType.name}`); + } + } + this.parameterTypeByName.set(parameterType.name, parameterType); + } + for (const parameterTypeRegexp of parameterType.regexpStrings) { + if (!this.parameterTypesByRegexp.has(parameterTypeRegexp)) { + this.parameterTypesByRegexp.set(parameterTypeRegexp, []); + } + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const parameterTypes = this.parameterTypesByRegexp.get(parameterTypeRegexp); + const existingParameterType = parameterTypes[0]; + if (parameterTypes.length > 0 && + existingParameterType.preferForRegexpMatch && + parameterType.preferForRegexpMatch) { + throw new CucumberExpressionError_js_1.default('There can only be one preferential parameter type per regexp. ' + + `The regexp /${parameterTypeRegexp}/ is used for two preferential parameter types, {${existingParameterType.name}} and {${parameterType.name}}`); + } + if (parameterTypes.indexOf(parameterType) === -1) { + parameterTypes.push(parameterType); + this.parameterTypesByRegexp.set(parameterTypeRegexp, parameterTypes.sort(ParameterType_js_1.default.compare)); + } + } + } +} +exports.default = ParameterTypeRegistry; +//# sourceMappingURL=ParameterTypeRegistry.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeRegistry.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeRegistry.js.map new file mode 100644 index 00000000..2ceeca57 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/ParameterTypeRegistry.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ParameterTypeRegistry.js","sourceRoot":"","sources":["../../../src/ParameterTypeRegistry.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/RegularExpression.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/RegularExpression.d.ts new file mode 100644 index 00000000..84ced213 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/RegularExpression.d.ts @@ -0,0 +1,12 @@ +import Argument from './Argument.js'; +import ParameterTypeRegistry from './ParameterTypeRegistry.js'; +import { Expression } from './types.js'; +export default class RegularExpression implements Expression { + readonly regexp: RegExp; + private readonly parameterTypeRegistry; + private readonly treeRegexp; + constructor(regexp: RegExp, parameterTypeRegistry: ParameterTypeRegistry); + match(text: string): readonly Argument[] | null; + get source(): string; +} +//# sourceMappingURL=RegularExpression.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/RegularExpression.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/RegularExpression.d.ts.map new file mode 100644 index 00000000..8d317137 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/RegularExpression.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"RegularExpression.d.ts","sourceRoot":"","sources":["../../../src/RegularExpression.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAA;AAEpC,OAAO,qBAAqB,MAAM,4BAA4B,CAAA;AAE9D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvC,MAAM,CAAC,OAAO,OAAO,iBAAkB,YAAW,UAAU;aAIxC,MAAM,EAAE,MAAM;IAC9B,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IAJxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;gBAGrB,MAAM,EAAE,MAAM,EACb,qBAAqB,EAAE,qBAAqB;IAKxD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,QAAQ,EAAE,GAAG,IAAI;IA8BtD,IAAI,MAAM,IAAI,MAAM,CAEnB;CACF"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/RegularExpression.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/RegularExpression.js new file mode 100644 index 00000000..6c9f02dd --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/RegularExpression.js @@ -0,0 +1,36 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const Argument_js_1 = __importDefault(require("./Argument.js")); +const ParameterType_js_1 = __importDefault(require("./ParameterType.js")); +const TreeRegexp_js_1 = __importDefault(require("./TreeRegexp.js")); +class RegularExpression { + regexp; + parameterTypeRegistry; + treeRegexp; + constructor(regexp, parameterTypeRegistry) { + this.regexp = regexp; + this.parameterTypeRegistry = parameterTypeRegistry; + this.treeRegexp = new TreeRegexp_js_1.default(regexp); + } + match(text) { + const group = this.treeRegexp.match(text); + if (!group) { + return null; + } + const parameterTypes = this.treeRegexp.groupBuilder.children.map((groupBuilder) => { + const parameterTypeRegexp = groupBuilder.source; + const parameterType = this.parameterTypeRegistry.lookupByRegexp(parameterTypeRegexp, this.regexp, text); + return (parameterType || + new ParameterType_js_1.default(undefined, parameterTypeRegexp, String, (s) => (s === undefined ? null : s), false, false)); + }); + return Argument_js_1.default.build(group, parameterTypes); + } + get source() { + return this.regexp.source; + } +} +exports.default = RegularExpression; +//# sourceMappingURL=RegularExpression.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/RegularExpression.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/RegularExpression.js.map new file mode 100644 index 00000000..718185b5 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/RegularExpression.js.map @@ -0,0 +1 @@ +{"version":3,"file":"RegularExpression.js","sourceRoot":"","sources":["../../../src/RegularExpression.ts"],"names":[],"mappings":";;;;;AAAA,gEAAoC;AACpC,0EAA8C;AAE9C,oEAAwC;AAGxC,MAAqB,iBAAiB;IAIlB;IACC;IAJF,UAAU,CAAY;IAEvC,YACkB,MAAc,EACb,qBAA4C;QAD7C,WAAM,GAAN,MAAM,CAAQ;QACb,0BAAqB,GAArB,qBAAqB,CAAuB;QAE7D,IAAI,CAAC,UAAU,GAAG,IAAI,uBAAU,CAAC,MAAM,CAAC,CAAA;IAC1C,CAAC;IAEM,KAAK,CAAC,IAAY;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE;YAChF,MAAM,mBAAmB,GAAG,YAAY,CAAC,MAAM,CAAA;YAE/C,MAAM,aAAa,GAAG,IAAI,CAAC,qBAAqB,CAAC,cAAc,CAC7D,mBAAmB,EACnB,IAAI,CAAC,MAAM,EACX,IAAI,CACL,CAAA;YACD,OAAO,CACL,aAAa;gBACb,IAAI,0BAAa,CACf,SAAS,EACT,mBAAmB,EACnB,MAAM,EACN,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EACnC,KAAK,EACL,KAAK,CACN,CACF,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,OAAO,qBAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,cAAc,CAAC,CAAA;IAC9C,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;IAC3B,CAAC;CACF;AA3CD,oCA2CC"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/TreeRegexp.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/TreeRegexp.d.ts new file mode 100644 index 00000000..ca190cd0 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/TreeRegexp.d.ts @@ -0,0 +1,11 @@ +import Group from './Group.js'; +import GroupBuilder from './GroupBuilder.js'; +export default class TreeRegexp { + readonly regexp: RegExp; + readonly groupBuilder: GroupBuilder; + constructor(regexp: RegExp | string); + private static createGroupBuilder; + private static isNonCapturing; + match(s: string): Group | null; +} +//# sourceMappingURL=TreeRegexp.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/TreeRegexp.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/TreeRegexp.d.ts.map new file mode 100644 index 00000000..f38c2f39 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/TreeRegexp.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"TreeRegexp.d.ts","sourceRoot":"","sources":["../../../src/TreeRegexp.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,YAAY,CAAA;AAC9B,OAAO,YAAY,MAAM,mBAAmB,CAAA;AAE5C,MAAM,CAAC,OAAO,OAAO,UAAU;IAC7B,SAAgB,MAAM,EAAE,MAAM,CAAA;IAC9B,SAAgB,YAAY,EAAE,YAAY,CAAA;gBAE9B,MAAM,EAAE,MAAM,GAAG,MAAM;IASnC,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAuCjC,OAAO,CAAC,MAAM,CAAC,cAAc;IAgBtB,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI;CAStC"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/TreeRegexp.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/TreeRegexp.js new file mode 100644 index 00000000..d4472d5c --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/TreeRegexp.js @@ -0,0 +1,89 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const regexp_match_indices_1 = __importDefault(require("regexp-match-indices")); +const GroupBuilder_js_1 = __importDefault(require("./GroupBuilder.js")); +class TreeRegexp { + regexp; + groupBuilder; + constructor(regexp) { + if (regexp instanceof RegExp) { + this.regexp = regexp; + } + else { + this.regexp = new RegExp(regexp); + } + this.groupBuilder = TreeRegexp.createGroupBuilder(this.regexp); + } + static createGroupBuilder(regexp) { + const source = regexp.source; + const stack = [new GroupBuilder_js_1.default()]; + const groupStartStack = []; + let escaping = false; + let charClass = false; + for (let i = 0; i < source.length; i++) { + const c = source[i]; + if (c === '[' && !escaping) { + charClass = true; + } + else if (c === ']' && !escaping) { + charClass = false; + } + else if (c === '(' && !escaping && !charClass) { + groupStartStack.push(i); + const nonCapturing = TreeRegexp.isNonCapturing(source, i); + const groupBuilder = new GroupBuilder_js_1.default(); + if (nonCapturing) { + groupBuilder.setNonCapturing(); + } + stack.push(groupBuilder); + } + else if (c === ')' && !escaping && !charClass) { + const gb = stack.pop(); + if (!gb) + throw new Error('Empty stack'); + const groupStart = groupStartStack.pop(); + if (gb.capturing) { + gb.source = source.substring((groupStart || 0) + 1, i); + stack[stack.length - 1].add(gb); + } + else { + gb.moveChildrenTo(stack[stack.length - 1]); + } + } + escaping = c === '\\' && !escaping; + } + const result = stack.pop(); + if (!result) + throw new Error('Empty stack'); + return result; + } + static isNonCapturing(source, i) { + // Regex is valid. Bounds check not required. + if (source[i + 1] !== '?') { + // (X) + return false; + } + if (source[i + 2] !== '<') { + // (?:X) + // (?=X) + // (?!X) + return true; + } + // (?<=X) or (?X) + return source[i + 3] === '=' || source[i + 3] === '!'; + } + match(s) { + const match = (0, regexp_match_indices_1.default)(this.regexp, s); + if (!match) { + return null; + } + let groupIndex = 0; + const nextGroupIndex = () => groupIndex++; + return this.groupBuilder.build(match, nextGroupIndex); + } +} +exports.default = TreeRegexp; +//# sourceMappingURL=TreeRegexp.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/TreeRegexp.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/TreeRegexp.js.map new file mode 100644 index 00000000..764aa409 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/TreeRegexp.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TreeRegexp.js","sourceRoot":"","sources":["../../../src/TreeRegexp.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/defineDefaultParameterTypes.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/defineDefaultParameterTypes.d.ts new file mode 100644 index 00000000..3d7a27cb --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/defineDefaultParameterTypes.d.ts @@ -0,0 +1,3 @@ +import { DefinesParameterType } from './types.js'; +export default function defineDefaultParameterTypes(registry: DefinesParameterType): void; +//# sourceMappingURL=defineDefaultParameterTypes.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/defineDefaultParameterTypes.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/defineDefaultParameterTypes.d.ts.map new file mode 100644 index 00000000..8f8dde56 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/defineDefaultParameterTypes.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"defineDefaultParameterTypes.d.ts","sourceRoot":"","sources":["../../../src/defineDefaultParameterTypes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAQjD,MAAM,CAAC,OAAO,UAAU,2BAA2B,CAAC,QAAQ,EAAE,oBAAoB,QAgHjF"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/defineDefaultParameterTypes.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/defineDefaultParameterTypes.js new file mode 100644 index 00000000..dc8a78a9 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/defineDefaultParameterTypes.js @@ -0,0 +1,26 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = defineDefaultParameterTypes; +const ParameterType_js_1 = __importDefault(require("./ParameterType.js")); +const INTEGER_REGEXPS = [/-?\d+/, /\d+/]; +const FLOAT_REGEXP = /(?=.*\d.*)[-+]?\d*(?:\.(?=\d.*))?\d*(?:\d+[E][+-]?\d+)?/; +const WORD_REGEXP = /[^\s]+/; +const STRING_REGEXP = /"([^"\\]*(\\.[^"\\]*)*)"|'([^'\\]*(\\.[^'\\]*)*)'/; +const ANONYMOUS_REGEXP = /.*/; +function defineDefaultParameterTypes(registry) { + registry.defineParameterType(new ParameterType_js_1.default('int', INTEGER_REGEXPS, Number, (s) => (s === undefined ? null : Number(s)), true, true, true)); + registry.defineParameterType(new ParameterType_js_1.default('float', FLOAT_REGEXP, Number, (s) => (s === undefined ? null : parseFloat(s)), true, false, true)); + registry.defineParameterType(new ParameterType_js_1.default('word', WORD_REGEXP, String, (s) => s, false, false, true)); + registry.defineParameterType(new ParameterType_js_1.default('string', STRING_REGEXP, String, (s1, s2) => (s1 || s2 || '').replace(/\\"/g, '"').replace(/\\'/g, "'"), true, false, true)); + registry.defineParameterType(new ParameterType_js_1.default('', ANONYMOUS_REGEXP, String, (s) => s, false, true, true)); + registry.defineParameterType(new ParameterType_js_1.default('double', FLOAT_REGEXP, Number, (s) => (s === undefined ? null : parseFloat(s)), false, false, true)); + registry.defineParameterType(new ParameterType_js_1.default('bigdecimal', FLOAT_REGEXP, String, (s) => (s === undefined ? null : s), false, false, true)); + registry.defineParameterType(new ParameterType_js_1.default('byte', INTEGER_REGEXPS, Number, (s) => (s === undefined ? null : Number(s)), false, false, true)); + registry.defineParameterType(new ParameterType_js_1.default('short', INTEGER_REGEXPS, Number, (s) => (s === undefined ? null : Number(s)), false, false, true)); + registry.defineParameterType(new ParameterType_js_1.default('long', INTEGER_REGEXPS, Number, (s) => (s === undefined ? null : Number(s)), false, false, true)); + registry.defineParameterType(new ParameterType_js_1.default('biginteger', INTEGER_REGEXPS, BigInt, (s) => (s === undefined ? null : BigInt(s)), false, false, true)); +} +//# sourceMappingURL=defineDefaultParameterTypes.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/defineDefaultParameterTypes.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/defineDefaultParameterTypes.js.map new file mode 100644 index 00000000..757082e6 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/defineDefaultParameterTypes.js.map @@ -0,0 +1 @@ +{"version":3,"file":"defineDefaultParameterTypes.js","sourceRoot":"","sources":["../../../src/defineDefaultParameterTypes.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/index.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/index.d.ts new file mode 100644 index 00000000..73496764 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/index.d.ts @@ -0,0 +1,13 @@ +import Argument from './Argument.js'; +import { Located, Node, NodeType, Token, TokenType } from './Ast.js'; +import CucumberExpression from './CucumberExpression.js'; +import CucumberExpressionGenerator from './CucumberExpressionGenerator.js'; +import ExpressionFactory from './ExpressionFactory.js'; +import GeneratedExpression from './GeneratedExpression.js'; +import Group from './Group.js'; +import ParameterType, { RegExps, StringOrRegExp } from './ParameterType.js'; +import ParameterTypeRegistry from './ParameterTypeRegistry.js'; +import RegularExpression from './RegularExpression.js'; +import { Expression } from './types.js'; +export { Argument, CucumberExpression, CucumberExpressionGenerator, Expression, ExpressionFactory, GeneratedExpression, Group, Located, Node, NodeType, ParameterType, ParameterTypeRegistry, RegExps, RegularExpression, StringOrRegExp, Token, TokenType, }; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/index.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/index.d.ts.map new file mode 100644 index 00000000..3faf31a4 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACpE,OAAO,kBAAkB,MAAM,yBAAyB,CAAA;AACxD,OAAO,2BAA2B,MAAM,kCAAkC,CAAA;AAC1E,OAAO,iBAAiB,MAAM,wBAAwB,CAAA;AACtD,OAAO,mBAAmB,MAAM,0BAA0B,CAAA;AAC1D,OAAO,KAAK,MAAM,YAAY,CAAA;AAC9B,OAAO,aAAa,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAC3E,OAAO,qBAAqB,MAAM,4BAA4B,CAAA;AAC9D,OAAO,iBAAiB,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvC,OAAO,EACL,QAAQ,EACR,kBAAkB,EAClB,2BAA2B,EAC3B,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,EACL,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,qBAAqB,EACrB,OAAO,EACP,iBAAiB,EACjB,cAAc,EACd,KAAK,EACL,SAAS,GACV,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/index.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/index.js new file mode 100644 index 00000000..343e9167 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/index.js @@ -0,0 +1,30 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TokenType = exports.Token = exports.RegularExpression = exports.ParameterTypeRegistry = exports.ParameterType = exports.NodeType = exports.Node = exports.Group = exports.GeneratedExpression = exports.ExpressionFactory = exports.CucumberExpressionGenerator = exports.CucumberExpression = exports.Argument = void 0; +const Argument_js_1 = __importDefault(require("./Argument.js")); +exports.Argument = Argument_js_1.default; +const Ast_js_1 = require("./Ast.js"); +Object.defineProperty(exports, "Node", { enumerable: true, get: function () { return Ast_js_1.Node; } }); +Object.defineProperty(exports, "NodeType", { enumerable: true, get: function () { return Ast_js_1.NodeType; } }); +Object.defineProperty(exports, "Token", { enumerable: true, get: function () { return Ast_js_1.Token; } }); +Object.defineProperty(exports, "TokenType", { enumerable: true, get: function () { return Ast_js_1.TokenType; } }); +const CucumberExpression_js_1 = __importDefault(require("./CucumberExpression.js")); +exports.CucumberExpression = CucumberExpression_js_1.default; +const CucumberExpressionGenerator_js_1 = __importDefault(require("./CucumberExpressionGenerator.js")); +exports.CucumberExpressionGenerator = CucumberExpressionGenerator_js_1.default; +const ExpressionFactory_js_1 = __importDefault(require("./ExpressionFactory.js")); +exports.ExpressionFactory = ExpressionFactory_js_1.default; +const GeneratedExpression_js_1 = __importDefault(require("./GeneratedExpression.js")); +exports.GeneratedExpression = GeneratedExpression_js_1.default; +const Group_js_1 = __importDefault(require("./Group.js")); +exports.Group = Group_js_1.default; +const ParameterType_js_1 = __importDefault(require("./ParameterType.js")); +exports.ParameterType = ParameterType_js_1.default; +const ParameterTypeRegistry_js_1 = __importDefault(require("./ParameterTypeRegistry.js")); +exports.ParameterTypeRegistry = ParameterTypeRegistry_js_1.default; +const RegularExpression_js_1 = __importDefault(require("./RegularExpression.js")); +exports.RegularExpression = RegularExpression_js_1.default; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/index.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/index.js.map new file mode 100644 index 00000000..3f5fe93c --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,gEAAoC;AAalC,mBAbK,qBAAQ,CAaL;AAZV,qCAAoE;AAoBlE,qFApBgB,aAAI,OAoBhB;AACJ,yFArBsB,iBAAQ,OAqBtB;AAMR,sFA3BgC,cAAK,OA2BhC;AACL,0FA5BuC,kBAAS,OA4BvC;AA3BX,oFAAwD;AAYtD,6BAZK,+BAAkB,CAYL;AAXpB,sGAA0E;AAYxE,sCAZK,wCAA2B,CAYL;AAX7B,kFAAsD;AAapD,4BAbK,8BAAiB,CAaL;AAZnB,sFAA0D;AAaxD,8BAbK,gCAAmB,CAaL;AAZrB,0DAA8B;AAa5B,gBAbK,kBAAK,CAaL;AAZP,0EAA2E;AAgBzE,wBAhBK,0BAAa,CAgBL;AAff,0FAA8D;AAgB5D,gCAhBK,kCAAqB,CAgBL;AAfvB,kFAAsD;AAiBpD,4BAjBK,8BAAiB,CAiBL"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/types.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/types.d.ts new file mode 100644 index 00000000..cfcd803d --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/types.d.ts @@ -0,0 +1,24 @@ +import Argument from './Argument.js'; +import ParameterType from './ParameterType.js'; +export interface DefinesParameterType { + defineParameterType(parameterType: ParameterType): void; +} +export interface Expression { + readonly source: string; + match(text: string): readonly Argument[] | null; +} +export type ParameterInfo = { + /** + * The string representation of the original ParameterType#type property + */ + type: string | null; + /** + * The parameter type name + */ + name: string; + /** + * The number of times this name has been used so far + */ + count: number; +}; +//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/types.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/types.d.ts.map new file mode 100644 index 00000000..fd76cf2e --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/types.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAA;AACpC,OAAO,aAAa,MAAM,oBAAoB,CAAA;AAE9C,MAAM,WAAW,oBAAoB;IACnC,mBAAmB,CAAC,CAAC,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;CAC9D;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,QAAQ,EAAE,GAAG,IAAI,CAAA;CAChD;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B;;OAEG;IACH,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ;;OAEG;IACH,KAAK,EAAE,MAAM,CAAA;CACd,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/types.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/types.js new file mode 100644 index 00000000..11e638d1 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/types.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/types.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/types.js.map new file mode 100644 index 00000000..70453b7a --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/src/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ArgumentTest.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ArgumentTest.d.ts new file mode 100644 index 00000000..713608c4 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ArgumentTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=ArgumentTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ArgumentTest.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ArgumentTest.d.ts.map new file mode 100644 index 00000000..9d10004b --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ArgumentTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ArgumentTest.d.ts","sourceRoot":"","sources":["../../../test/ArgumentTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ArgumentTest.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ArgumentTest.js new file mode 100644 index 00000000..4179275e --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ArgumentTest.js @@ -0,0 +1,53 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const assert = __importStar(require("assert")); +const Argument_js_1 = __importDefault(require("../src/Argument.js")); +const ParameterTypeRegistry_js_1 = __importDefault(require("../src/ParameterTypeRegistry.js")); +const TreeRegexp_js_1 = __importDefault(require("../src/TreeRegexp.js")); +describe('Argument', () => { + it('exposes getParameterTypeName()', () => { + const treeRegexp = new TreeRegexp_js_1.default('three (.*) mice'); + const parameterTypeRegistry = new ParameterTypeRegistry_js_1.default(); + const group = treeRegexp.match('three blind mice'); + const args = Argument_js_1.default.build(group, [parameterTypeRegistry.lookupByTypeName('string')]); + const argument = args[0]; + assert.strictEqual(argument.getParameterType().name, 'string'); + }); +}); +//# sourceMappingURL=ArgumentTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ArgumentTest.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ArgumentTest.js.map new file mode 100644 index 00000000..f19607ed --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ArgumentTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ArgumentTest.js","sourceRoot":"","sources":["../../../test/ArgumentTest.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAgC;AAEhC,qEAAyC;AACzC,+FAAmE;AACnE,yEAA6C;AAE7C,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,UAAU,GAAG,IAAI,uBAAU,CAAC,iBAAiB,CAAC,CAAA;QACpD,MAAM,qBAAqB,GAAG,IAAI,kCAAqB,EAAE,CAAA;QACzD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,kBAAkB,CAAE,CAAA;QACnD,MAAM,IAAI,GAAG,qBAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,QAAQ,CAAE,CAAC,CAAC,CAAA;QACvF,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QACxB,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CombinatorialGeneratedExpressionFactoryTest.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CombinatorialGeneratedExpressionFactoryTest.d.ts new file mode 100644 index 00000000..a9066926 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CombinatorialGeneratedExpressionFactoryTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=CombinatorialGeneratedExpressionFactoryTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CombinatorialGeneratedExpressionFactoryTest.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CombinatorialGeneratedExpressionFactoryTest.d.ts.map new file mode 100644 index 00000000..768e8461 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CombinatorialGeneratedExpressionFactoryTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"CombinatorialGeneratedExpressionFactoryTest.d.ts","sourceRoot":"","sources":["../../../test/CombinatorialGeneratedExpressionFactoryTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CombinatorialGeneratedExpressionFactoryTest.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CombinatorialGeneratedExpressionFactoryTest.js new file mode 100644 index 00000000..21050e28 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CombinatorialGeneratedExpressionFactoryTest.js @@ -0,0 +1,34 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const assert_1 = __importDefault(require("assert")); +const CombinatorialGeneratedExpressionFactory_js_1 = __importDefault(require("../src/CombinatorialGeneratedExpressionFactory.js")); +const ParameterType_js_1 = __importDefault(require("../src/ParameterType.js")); +describe('CucumberExpressionGenerator', () => { + it('generates multiple expressions', () => { + const parameterTypeCombinations = [ + [ + new ParameterType_js_1.default('color', /red|blue|yellow/, null, (s) => s, false, true), + new ParameterType_js_1.default('csscolor', /red|blue|yellow/, null, (s) => s, false, true), + ], + [ + new ParameterType_js_1.default('date', /\d{4}-\d{2}-\d{2}/, null, (s) => s, false, true), + new ParameterType_js_1.default('datetime', /\d{4}-\d{2}-\d{2}/, null, (s) => s, false, true), + new ParameterType_js_1.default('timestamp', /\d{4}-\d{2}-\d{2}/, null, (s) => s, false, true), + ], + ]; + const factory = new CombinatorialGeneratedExpressionFactory_js_1.default('I bought a {{0}} ball on {{1}}', parameterTypeCombinations); + const expressions = factory.generateExpressions().map((ge) => ge.source); + assert_1.default.deepStrictEqual(expressions, [ + 'I bought a {color} ball on {date}', + 'I bought a {color} ball on {datetime}', + 'I bought a {color} ball on {timestamp}', + 'I bought a {csscolor} ball on {date}', + 'I bought a {csscolor} ball on {datetime}', + 'I bought a {csscolor} ball on {timestamp}', + ]); + }); +}); +//# sourceMappingURL=CombinatorialGeneratedExpressionFactoryTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CombinatorialGeneratedExpressionFactoryTest.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CombinatorialGeneratedExpressionFactoryTest.js.map new file mode 100644 index 00000000..641c38c1 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CombinatorialGeneratedExpressionFactoryTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CombinatorialGeneratedExpressionFactoryTest.js","sourceRoot":"","sources":["../../../test/CombinatorialGeneratedExpressionFactoryTest.ts"],"names":[],"mappings":";;;;;AAAA,oDAA2B;AAE3B,mIAAuG;AACvG,+EAAmD;AAEnD,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,yBAAyB,GAAG;YAChC;gBACE,IAAI,0BAAa,CAAC,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC;gBAC1E,IAAI,0BAAa,CAAC,UAAU,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC;aAC9E;YACD;gBACE,IAAI,0BAAa,CAAC,MAAM,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC;gBAC3E,IAAI,0BAAa,CAAC,UAAU,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC;gBAC/E,IAAI,0BAAa,CAAC,WAAW,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC;aACjF;SACF,CAAA;QAED,MAAM,OAAO,GAAG,IAAI,oDAAuC,CACzD,gCAAgC,EAChC,yBAAyB,CAC1B,CAAA;QACD,MAAM,WAAW,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAA;QACxE,gBAAM,CAAC,eAAe,CAAC,WAAW,EAAE;YAClC,mCAAmC;YACnC,uCAAuC;YACvC,wCAAwC;YACxC,sCAAsC;YACtC,0CAA0C;YAC1C,2CAA2C;SAC5C,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionGeneratorTest.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionGeneratorTest.d.ts new file mode 100644 index 00000000..f959dbd8 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionGeneratorTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=CucumberExpressionGeneratorTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionGeneratorTest.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionGeneratorTest.d.ts.map new file mode 100644 index 00000000..034e0052 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionGeneratorTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionGeneratorTest.d.ts","sourceRoot":"","sources":["../../../test/CucumberExpressionGeneratorTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionGeneratorTest.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionGeneratorTest.js new file mode 100644 index 00000000..fe216ad1 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionGeneratorTest.js @@ -0,0 +1,232 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const assert_1 = __importDefault(require("assert")); +const CucumberExpression_js_1 = __importDefault(require("../src/CucumberExpression.js")); +const CucumberExpressionGenerator_js_1 = __importDefault(require("../src/CucumberExpressionGenerator.js")); +const ParameterType_js_1 = __importDefault(require("../src/ParameterType.js")); +const ParameterTypeRegistry_js_1 = __importDefault(require("../src/ParameterTypeRegistry.js")); +class Currency { + s; + constructor(s) { + this.s = s; + } +} +describe('CucumberExpressionGenerator', () => { + let parameterTypeRegistry; + let generator; + function assertExpression(expectedExpression, expectedParameterInfo, text) { + const generatedExpression = generator.generateExpressions(text)[0]; + assert_1.default.deepStrictEqual(generatedExpression.parameterInfos, expectedParameterInfo); + assert_1.default.strictEqual(generatedExpression.source, expectedExpression); + const cucumberExpression = new CucumberExpression_js_1.default(generatedExpression.source, parameterTypeRegistry); + const match = cucumberExpression.match(text); + if (match === null) { + assert_1.default.fail(`Expected text '${text}' to match generated expression '${generatedExpression.source}'`); + } + assert_1.default.strictEqual(match.length, expectedParameterInfo.length); + } + beforeEach(() => { + parameterTypeRegistry = new ParameterTypeRegistry_js_1.default(); + generator = new CucumberExpressionGenerator_js_1.default(() => parameterTypeRegistry.parameterTypes); + }); + it('documents expression generation', () => { + parameterTypeRegistry = new ParameterTypeRegistry_js_1.default(); + generator = new CucumberExpressionGenerator_js_1.default(() => parameterTypeRegistry.parameterTypes); + const undefinedStepText = 'I have 2 cucumbers and 1.5 tomato'; + const generatedExpression = generator.generateExpressions(undefinedStepText)[0]; + assert_1.default.strictEqual(generatedExpression.source, 'I have {int} cucumbers and {float} tomato'); + assert_1.default.strictEqual(generatedExpression.parameterNames[0], 'int'); + assert_1.default.strictEqual(generatedExpression.parameterTypes[1].name, 'float'); + }); + it('generates expression for no args', () => { + assertExpression('hello', [], 'hello'); + }); + it('generates expression with escaped left parenthesis', () => { + assertExpression('\\(iii)', [], '(iii)'); + }); + it('generates expression with escaped left curly brace', () => { + assertExpression('\\{iii}', [], '{iii}'); + }); + it('generates expression with escaped slashes', () => { + assertExpression('The {int}\\/{int}\\/{int} hey', [ + { + type: 'Number', + name: 'int', + count: 1, + }, + { + type: 'Number', + name: 'int', + count: 2, + }, + { + type: 'Number', + name: 'int', + count: 3, + }, + ], 'The 1814/05/17 hey'); + }); + it('generates expression for int float arg', () => { + assertExpression('I have {int} cukes and {float} euro', [ + { + type: 'Number', + name: 'int', + count: 1, + }, + { + type: 'Number', + name: 'float', + count: 1, + }, + ], 'I have 2 cukes and 1.5 euro'); + }); + it('generates expression for strings', () => { + assertExpression('I like {string} and {string}', [ + { + type: 'String', + name: 'string', + count: 1, + }, + { + type: 'String', + name: 'string', + count: 2, + }, + ], 'I like "bangers" and \'mash\''); + }); + it('generates expression with % sign', () => { + assertExpression('I am {int}%% foobar', [ + { + type: 'Number', + name: 'int', + count: 1, + }, + ], 'I am 20%% foobar'); + }); + it('generates expression for just int', () => { + assertExpression('{int}', [ + { + type: 'Number', + name: 'int', + count: 1, + }, + ], '99999'); + }); + it('numbers only second argument when builtin type is not reserved keyword', () => { + assertExpression('I have {float} cukes and {float} euro', [ + { + type: 'Number', + name: 'float', + count: 1, + }, + { + type: 'Number', + name: 'float', + count: 2, + }, + ], 'I have 2.5 cukes and 1.5 euro'); + }); + it('generates expression for custom type', () => { + parameterTypeRegistry.defineParameterType(new ParameterType_js_1.default('currency', /[A-Z]{3}/, Currency, (s) => new Currency(s), true, false)); + assertExpression('I have a {currency} account', [ + { + type: 'Currency', + name: 'currency', + count: 1, + }, + ], 'I have a EUR account'); + }); + it('prefers leftmost match when there is overlap', () => { + parameterTypeRegistry.defineParameterType(new ParameterType_js_1.default('currency', /c d/, Currency, (s) => new Currency(s), true, false)); + parameterTypeRegistry.defineParameterType(new ParameterType_js_1.default('date', /b c/, Date, (s) => new Date(s), true, false)); + assertExpression('a {date} d e f g', [ + { + type: 'Date', + name: 'date', + count: 1, + }, + ], 'a b c d e f g'); + }); + // TODO: prefers widest match + it('generates all combinations of expressions when several parameter types match', () => { + parameterTypeRegistry.defineParameterType(new ParameterType_js_1.default('currency', /x/, null, (s) => new Currency(s), true, false)); + parameterTypeRegistry.defineParameterType(new ParameterType_js_1.default('date', /x/, null, (s) => new Date(s), true, false)); + const generatedExpressions = generator.generateExpressions('I have x and x and another x'); + const expressions = generatedExpressions.map((e) => e.source); + assert_1.default.deepStrictEqual(expressions, [ + 'I have {currency} and {currency} and another {currency}', + 'I have {currency} and {currency} and another {date}', + 'I have {currency} and {date} and another {currency}', + 'I have {currency} and {date} and another {date}', + 'I have {date} and {currency} and another {currency}', + 'I have {date} and {currency} and another {date}', + 'I have {date} and {date} and another {currency}', + 'I have {date} and {date} and another {date}', + ]); + }); + it('exposes parameter type names in generated expression', () => { + const expression = generator.generateExpressions('I have 2 cukes and 1.5 euro')[0]; + const typeNames = expression.parameterTypes.map((parameter) => parameter.name); + assert_1.default.deepStrictEqual(typeNames, ['int', 'float']); + }); + it('matches parameter types with optional capture groups', () => { + parameterTypeRegistry.defineParameterType(new ParameterType_js_1.default('optional-flight', /(1st flight)?/, null, (s) => s, true, false)); + parameterTypeRegistry.defineParameterType(new ParameterType_js_1.default('optional-hotel', /(1 hotel)?/, null, (s) => s, true, false)); + const expression = generator.generateExpressions('I reach Stage 4: 1st flight -1 hotel')[0]; + // While you would expect this to be `I reach Stage {int}: {optional-flight} -{optional-hotel}` the `-1` causes + // {int} to match just before {optional-hotel}. + assert_1.default.strictEqual(expression.source, 'I reach Stage {int}: {optional-flight} {int} hotel'); + }); + it('generates at most 256 expressions', () => { + for (let i = 0; i < 4; i++) { + parameterTypeRegistry.defineParameterType(new ParameterType_js_1.default('my-type-' + i, /([a-z] )*?[a-z]/, null, (s) => s, true, false)); + } + // This would otherwise generate 4^11=419430 expressions and consume just shy of 1.5GB. + const expressions = generator.generateExpressions('a s i m p l e s t e p'); + assert_1.default.strictEqual(expressions.length, 256); + }); + it('prefers expression with longest non empty match', () => { + parameterTypeRegistry.defineParameterType(new ParameterType_js_1.default('zero-or-more', /[a-z]*/, null, (s) => s, true, false)); + parameterTypeRegistry.defineParameterType(new ParameterType_js_1.default('exactly-one', /[a-z]/, null, (s) => s, true, false)); + const expressions = generator.generateExpressions('a simple step'); + assert_1.default.strictEqual(expressions.length, 2); + assert_1.default.strictEqual(expressions[0].source, '{exactly-one} {zero-or-more} {zero-or-more}'); + assert_1.default.strictEqual(expressions[1].source, '{zero-or-more} {zero-or-more} {zero-or-more}'); + }); + it('does not suggest parameter included at the beginning of a word', () => { + parameterTypeRegistry.defineParameterType(new ParameterType_js_1.default('direction', /(up|down)/, null, (s) => s, true, false)); + const expressions = generator.generateExpressions('I download a picture'); + assert_1.default.strictEqual(expressions.length, 1); + assert_1.default.notStrictEqual(expressions[0].source, 'I {direction}load a picture'); + assert_1.default.strictEqual(expressions[0].source, 'I download a picture'); + }); + it('does not suggest parameter included inside a word', () => { + parameterTypeRegistry.defineParameterType(new ParameterType_js_1.default('direction', /(up|down)/, null, (s) => s, true, false)); + const expressions = generator.generateExpressions('I watch the muppet show'); + assert_1.default.strictEqual(expressions.length, 1); + assert_1.default.notStrictEqual(expressions[0].source, 'I watch the m{direction}pet show'); + assert_1.default.strictEqual(expressions[0].source, 'I watch the muppet show'); + }); + it('does not suggest parameter at the end of a word', () => { + parameterTypeRegistry.defineParameterType(new ParameterType_js_1.default('direction', /(up|down)/, null, (s) => s, true, false)); + const expressions = generator.generateExpressions('I create a group'); + assert_1.default.strictEqual(expressions.length, 1); + assert_1.default.notStrictEqual(expressions[0].source, 'I create a gro{direction}'); + assert_1.default.strictEqual(expressions[0].source, 'I create a group'); + }); + it('does suggest parameter that are a full word', () => { + parameterTypeRegistry.defineParameterType(new ParameterType_js_1.default('direction', /(up|down)/, null, (s) => s, true, false)); + assert_1.default.strictEqual(generator.generateExpressions('When I go down the road')[0].source, 'When I go {direction} the road'); + assert_1.default.strictEqual(generator.generateExpressions('When I walk up the hill')[0].source, 'When I walk {direction} the hill'); + assert_1.default.strictEqual(generator.generateExpressions('up the hill, the road goes down')[0].source, '{direction} the hill, the road goes {direction}'); + }); + it('does not consider punctuation as being part of a word', () => { + parameterTypeRegistry.defineParameterType(new ParameterType_js_1.default('direction', /(up|down)/, null, (s) => s, true, false)); + assert_1.default.strictEqual(generator.generateExpressions('direction is:down')[0].source, 'direction is:{direction}'); + assert_1.default.strictEqual(generator.generateExpressions('direction is down.')[0].source, 'direction is {direction}.'); + }); +}); +//# sourceMappingURL=CucumberExpressionGeneratorTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionGeneratorTest.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionGeneratorTest.js.map new file mode 100644 index 00000000..cd3a2f4a --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionGeneratorTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionGeneratorTest.js","sourceRoot":"","sources":["../../../test/CucumberExpressionGeneratorTest.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionParserTest.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionParserTest.d.ts new file mode 100644 index 00000000..7d0e84e1 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionParserTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=CucumberExpressionParserTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionParserTest.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionParserTest.d.ts.map new file mode 100644 index 00000000..e454179b --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionParserTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionParserTest.d.ts","sourceRoot":"","sources":["../../../test/CucumberExpressionParserTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionParserTest.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionParserTest.js new file mode 100644 index 00000000..e28c5ef5 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionParserTest.js @@ -0,0 +1,34 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const assert_1 = __importDefault(require("assert")); +const fs_1 = __importDefault(require("fs")); +const glob_1 = require("glob"); +const js_yaml_1 = __importDefault(require("js-yaml")); +const CucumberExpressionError_js_1 = __importDefault(require("../src/CucumberExpressionError.js")); +const CucumberExpressionParser_js_1 = __importDefault(require("../src/CucumberExpressionParser.js")); +const testDataDir_js_1 = require("./testDataDir.js"); +describe('CucumberExpressionParser', () => { + for (const path of glob_1.glob.sync(`${testDataDir_js_1.testDataDir}/cucumber-expression/parser/*.yaml`)) { + const expectation = js_yaml_1.default.load(fs_1.default.readFileSync(path, 'utf-8')); + it(`parses ${path}`, () => { + const parser = new CucumberExpressionParser_js_1.default(); + if (expectation.expected_ast !== undefined) { + const node = parser.parse(expectation.expression); + assert_1.default.deepStrictEqual(JSON.parse(JSON.stringify(node)), // Removes type information. + expectation.expected_ast); + } + else if (expectation.exception !== undefined) { + assert_1.default.throws(() => { + parser.parse(expectation.expression); + }, new CucumberExpressionError_js_1.default(expectation.exception)); + } + else { + throw new Error(`Expectation must have expected or exception: ${JSON.stringify(expectation)}`); + } + }); + } +}); +//# sourceMappingURL=CucumberExpressionParserTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionParserTest.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionParserTest.js.map new file mode 100644 index 00000000..6806c0bd --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionParserTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionParserTest.js","sourceRoot":"","sources":["../../../test/CucumberExpressionParserTest.ts"],"names":[],"mappings":";;;;;AAAA,oDAA2B;AAC3B,4CAAmB;AACnB,+BAA2B;AAC3B,sDAA0B;AAE1B,mGAAuE;AACvE,qGAAyE;AACzE,qDAA8C;AAQ9C,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,KAAK,MAAM,IAAI,IAAI,WAAI,CAAC,IAAI,CAAC,GAAG,4BAAW,oCAAoC,CAAC,EAAE,CAAC;QACjF,MAAM,WAAW,GAAG,iBAAI,CAAC,IAAI,CAAC,YAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAgB,CAAA;QAC5E,EAAE,CAAC,UAAU,IAAI,EAAE,EAAE,GAAG,EAAE;YACxB,MAAM,MAAM,GAAG,IAAI,qCAAwB,EAAE,CAAA;YAC7C,IAAI,WAAW,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;gBAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;gBACjD,gBAAM,CAAC,eAAe,CACpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,4BAA4B;gBAC9D,WAAW,CAAC,YAAY,CACzB,CAAA;YACH,CAAC;iBAAM,IAAI,WAAW,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC/C,gBAAM,CAAC,MAAM,CAAC,GAAG,EAAE;oBACjB,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;gBACtC,CAAC,EAAE,IAAI,oCAAuB,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAA;YACxD,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CACb,gDAAgD,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAC9E,CAAA;YACH,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;AACH,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTest.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTest.d.ts new file mode 100644 index 00000000..ed6984c8 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=CucumberExpressionTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTest.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTest.d.ts.map new file mode 100644 index 00000000..e1689a5a --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionTest.d.ts","sourceRoot":"","sources":["../../../test/CucumberExpressionTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTest.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTest.js new file mode 100644 index 00000000..afb7dec7 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTest.js @@ -0,0 +1,112 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const assert_1 = __importDefault(require("assert")); +const fs_1 = __importDefault(require("fs")); +const glob_1 = require("glob"); +const js_yaml_1 = __importDefault(require("js-yaml")); +const CucumberExpression_js_1 = __importDefault(require("../src/CucumberExpression.js")); +const CucumberExpressionError_js_1 = __importDefault(require("../src/CucumberExpressionError.js")); +const ParameterType_js_1 = __importDefault(require("../src/ParameterType.js")); +const ParameterTypeRegistry_js_1 = __importDefault(require("../src/ParameterTypeRegistry.js")); +const testDataDir_js_1 = require("./testDataDir.js"); +describe('CucumberExpression', () => { + for (const path of glob_1.glob.sync(`${testDataDir_js_1.testDataDir}/cucumber-expression/matching/*.yaml`)) { + const expectation = js_yaml_1.default.load(fs_1.default.readFileSync(path, 'utf-8')); + it(`matches ${path}`, () => { + const parameterTypeRegistry = new ParameterTypeRegistry_js_1.default(); + if (expectation.expected_args !== undefined) { + const expression = new CucumberExpression_js_1.default(expectation.expression, parameterTypeRegistry); + const matches = expression.match(expectation.text); + assert_1.default.deepStrictEqual(JSON.parse(JSON.stringify(matches ? matches.map((value) => value.getValue(null)) : null, (key, value) => { + return typeof value === 'bigint' ? value.toString() : value; + })), // Removes type information. + expectation.expected_args); + } + else if (expectation.exception !== undefined) { + assert_1.default.throws(() => { + const expression = new CucumberExpression_js_1.default(expectation.expression, parameterTypeRegistry); + expression.match(expectation.text); + }, new CucumberExpressionError_js_1.default(expectation.exception)); + } + else { + throw new Error(`Expectation must have expected or exception: ${JSON.stringify(expectation)}`); + } + }); + } + it('matches float', () => { + assert_1.default.deepStrictEqual(match('{float}', ''), null); + assert_1.default.deepStrictEqual(match('{float}', '.'), null); + assert_1.default.deepStrictEqual(match('{float}', ','), null); + assert_1.default.deepStrictEqual(match('{float}', '-'), null); + assert_1.default.deepStrictEqual(match('{float}', 'E'), null); + assert_1.default.deepStrictEqual(match('{float}', '1,'), null); + assert_1.default.deepStrictEqual(match('{float}', ',1'), null); + assert_1.default.deepStrictEqual(match('{float}', '1.'), null); + assert_1.default.deepStrictEqual(match('{float}', '1'), [1]); + assert_1.default.deepStrictEqual(match('{float}', '-1'), [-1]); + assert_1.default.deepStrictEqual(match('{float}', '1.1'), [1.1]); + assert_1.default.deepStrictEqual(match('{float}', '1,000'), null); + assert_1.default.deepStrictEqual(match('{float}', '1,000,0'), null); + assert_1.default.deepStrictEqual(match('{float}', '1,000.1'), null); + assert_1.default.deepStrictEqual(match('{float}', '1,000,10'), null); + assert_1.default.deepStrictEqual(match('{float}', '1,0.1'), null); + assert_1.default.deepStrictEqual(match('{float}', '1,000,000.1'), null); + assert_1.default.deepStrictEqual(match('{float}', '-1.1'), [-1.1]); + assert_1.default.deepStrictEqual(match('{float}', '.1'), [0.1]); + assert_1.default.deepStrictEqual(match('{float}', '-.1'), [-0.1]); + assert_1.default.deepStrictEqual(match('{float}', '-.10000001'), [-0.10000001]); + assert_1.default.deepStrictEqual(match('{float}', '1E1'), [1e1]); // precision 1 with scale -1, can not be expressed as a decimal + assert_1.default.deepStrictEqual(match('{float}', '.1E1'), [1]); + assert_1.default.deepStrictEqual(match('{float}', 'E1'), null); + assert_1.default.deepStrictEqual(match('{float}', '-.1E-1'), [-0.01]); + assert_1.default.deepStrictEqual(match('{float}', '-.1E-2'), [-0.001]); + assert_1.default.deepStrictEqual(match('{float}', '-.1E+1'), [-1]); + assert_1.default.deepStrictEqual(match('{float}', '-.1E+2'), [-10]); + assert_1.default.deepStrictEqual(match('{float}', '-.1E1'), [-1]); + assert_1.default.deepStrictEqual(match('{float}', '-.10E2'), [-10]); + }); + it('matches float with zero', () => { + assert_1.default.deepEqual(match('{float}', '0'), [0]); + }); + it('exposes source', () => { + const expr = 'I have {int} cuke(s)'; + assert_1.default.strictEqual(new CucumberExpression_js_1.default(expr, new ParameterTypeRegistry_js_1.default()).source, expr); + }); + it('unmatched optional groups have undefined values', () => { + const parameterTypeRegistry = new ParameterTypeRegistry_js_1.default(); + parameterTypeRegistry.defineParameterType(new ParameterType_js_1.default('textAndOrNumber', /([A-Z]+)?(?: )?([0-9]+)?/, null, function (s1, s2) { + return [s1, s2]; + }, false, true)); + const expression = new CucumberExpression_js_1.default('{textAndOrNumber}', parameterTypeRegistry); + const world = {}; + assert_1.default.deepStrictEqual(expression.match(`TLA`)[0].getValue(world), ['TLA', undefined]); + assert_1.default.deepStrictEqual(expression.match(`123`)[0].getValue(world), [undefined, '123']); + }); + // JavaScript-specific + it('delegates transform to custom object', () => { + const parameterTypeRegistry = new ParameterTypeRegistry_js_1.default(); + parameterTypeRegistry.defineParameterType(new ParameterType_js_1.default('widget', /\w+/, null, function (s) { + return this.createWidget(s); + }, false, true)); + const expression = new CucumberExpression_js_1.default('I have a {widget}', parameterTypeRegistry); + const world = { + createWidget(s) { + return `widget:${s}`; + }, + }; + const args = expression.match(`I have a bolt`); + assert_1.default.strictEqual(args[0].getValue(world), 'widget:bolt'); + }); +}); +const match = (expression, text) => { + const cucumberExpression = new CucumberExpression_js_1.default(expression, new ParameterTypeRegistry_js_1.default()); + const args = cucumberExpression.match(text); + if (!args) { + return null; + } + return args.map((arg) => arg.getValue(null)); +}; +//# sourceMappingURL=CucumberExpressionTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTest.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTest.js.map new file mode 100644 index 00000000..96c6540e --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionTest.js","sourceRoot":"","sources":["../../../test/CucumberExpressionTest.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTokenizerTest.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTokenizerTest.d.ts new file mode 100644 index 00000000..6df46a1e --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTokenizerTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=CucumberExpressionTokenizerTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTokenizerTest.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTokenizerTest.d.ts.map new file mode 100644 index 00000000..883ddf20 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTokenizerTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionTokenizerTest.d.ts","sourceRoot":"","sources":["../../../test/CucumberExpressionTokenizerTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTokenizerTest.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTokenizerTest.js new file mode 100644 index 00000000..bbdf8104 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTokenizerTest.js @@ -0,0 +1,34 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const assert_1 = __importDefault(require("assert")); +const fs_1 = __importDefault(require("fs")); +const glob_1 = require("glob"); +const js_yaml_1 = __importDefault(require("js-yaml")); +const CucumberExpressionError_js_1 = __importDefault(require("../src/CucumberExpressionError.js")); +const CucumberExpressionTokenizer_js_1 = __importDefault(require("../src/CucumberExpressionTokenizer.js")); +const testDataDir_js_1 = require("./testDataDir.js"); +describe('CucumberExpressionTokenizer', () => { + for (const path of glob_1.glob.sync(`${testDataDir_js_1.testDataDir}/cucumber-expression/tokenizer/*.yaml`)) { + const expectation = js_yaml_1.default.load(fs_1.default.readFileSync(path, 'utf-8')); + it(`tokenizes ${path}`, () => { + const tokenizer = new CucumberExpressionTokenizer_js_1.default(); + if (expectation.expected_tokens !== undefined) { + const tokens = tokenizer.tokenize(expectation.expression); + assert_1.default.deepStrictEqual(JSON.parse(JSON.stringify(tokens)), // Removes type information. + expectation.expected_tokens); + } + else if (expectation.exception !== undefined) { + assert_1.default.throws(() => { + tokenizer.tokenize(expectation.expression); + }, new CucumberExpressionError_js_1.default(expectation.exception)); + } + else { + throw new Error(`Expectation must have expected_tokens or exception: ${JSON.stringify(expectation)}`); + } + }); + } +}); +//# sourceMappingURL=CucumberExpressionTokenizerTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTokenizerTest.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTokenizerTest.js.map new file mode 100644 index 00000000..34496010 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTokenizerTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionTokenizerTest.js","sourceRoot":"","sources":["../../../test/CucumberExpressionTokenizerTest.ts"],"names":[],"mappings":";;;;;AAAA,oDAA2B;AAC3B,4CAAmB;AACnB,+BAA2B;AAC3B,sDAA0B;AAE1B,mGAAuE;AACvE,2GAA+E;AAC/E,qDAA8C;AAQ9C,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,KAAK,MAAM,IAAI,IAAI,WAAI,CAAC,IAAI,CAAC,GAAG,4BAAW,uCAAuC,CAAC,EAAE,CAAC;QACpF,MAAM,WAAW,GAAG,iBAAI,CAAC,IAAI,CAAC,YAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAgB,CAAA;QAC5E,EAAE,CAAC,aAAa,IAAI,EAAE,EAAE,GAAG,EAAE;YAC3B,MAAM,SAAS,GAAG,IAAI,wCAA2B,EAAE,CAAA;YACnD,IAAI,WAAW,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;gBAC9C,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;gBACzD,gBAAM,CAAC,eAAe,CACpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,4BAA4B;gBAChE,WAAW,CAAC,eAAe,CAC5B,CAAA;YACH,CAAC;iBAAM,IAAI,WAAW,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC/C,gBAAM,CAAC,MAAM,CAAC,GAAG,EAAE;oBACjB,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;gBAC5C,CAAC,EAAE,IAAI,oCAAuB,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAA;YACxD,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CACb,uDAAuD,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CACrF,CAAA;YACH,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;AACH,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTransformationTest.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTransformationTest.d.ts new file mode 100644 index 00000000..6919a5a0 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTransformationTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=CucumberExpressionTransformationTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTransformationTest.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTransformationTest.d.ts.map new file mode 100644 index 00000000..152ad37a --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTransformationTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionTransformationTest.d.ts","sourceRoot":"","sources":["../../../test/CucumberExpressionTransformationTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTransformationTest.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTransformationTest.js new file mode 100644 index 00000000..d0c1a2e7 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTransformationTest.js @@ -0,0 +1,23 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const assert_1 = __importDefault(require("assert")); +const fs_1 = __importDefault(require("fs")); +const glob_1 = require("glob"); +const js_yaml_1 = __importDefault(require("js-yaml")); +const CucumberExpression_js_1 = __importDefault(require("../src/CucumberExpression.js")); +const ParameterTypeRegistry_js_1 = __importDefault(require("../src/ParameterTypeRegistry.js")); +const testDataDir_js_1 = require("./testDataDir.js"); +describe('CucumberExpression', () => { + for (const path of glob_1.glob.sync(`${testDataDir_js_1.testDataDir}/cucumber-expression/transformation/*.yaml`)) { + const expectation = js_yaml_1.default.load(fs_1.default.readFileSync(path, 'utf-8')); + it(`transforms ${path}`, () => { + const parameterTypeRegistry = new ParameterTypeRegistry_js_1.default(); + const expression = new CucumberExpression_js_1.default(expectation.expression, parameterTypeRegistry); + assert_1.default.deepStrictEqual(expression.regexp.source, expectation.expected_regex); + }); + } +}); +//# sourceMappingURL=CucumberExpressionTransformationTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTransformationTest.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTransformationTest.js.map new file mode 100644 index 00000000..02452944 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CucumberExpressionTransformationTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionTransformationTest.js","sourceRoot":"","sources":["../../../test/CucumberExpressionTransformationTest.ts"],"names":[],"mappings":";;;;;AAAA,oDAA2B;AAC3B,4CAAmB;AACnB,+BAA2B;AAC3B,sDAA0B;AAE1B,yFAA6D;AAC7D,+FAAmE;AACnE,qDAA8C;AAO9C,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,KAAK,MAAM,IAAI,IAAI,WAAI,CAAC,IAAI,CAAC,GAAG,4BAAW,4CAA4C,CAAC,EAAE,CAAC;QACzF,MAAM,WAAW,GAAG,iBAAI,CAAC,IAAI,CAAC,YAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAgB,CAAA;QAC5E,EAAE,CAAC,cAAc,IAAI,EAAE,EAAE,GAAG,EAAE;YAC5B,MAAM,qBAAqB,GAAG,IAAI,kCAAqB,EAAE,CAAA;YACzD,MAAM,UAAU,GAAG,IAAI,+BAAkB,CAAC,WAAW,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAA;YACxF,gBAAM,CAAC,eAAe,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,cAAc,CAAC,CAAA;QAC9E,CAAC,CAAC,CAAA;IACJ,CAAC;AACH,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CustomParameterTypeTest.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CustomParameterTypeTest.d.ts new file mode 100644 index 00000000..f68fbc26 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CustomParameterTypeTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=CustomParameterTypeTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CustomParameterTypeTest.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CustomParameterTypeTest.d.ts.map new file mode 100644 index 00000000..33ae8a62 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CustomParameterTypeTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"CustomParameterTypeTest.d.ts","sourceRoot":"","sources":["../../../test/CustomParameterTypeTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CustomParameterTypeTest.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CustomParameterTypeTest.js new file mode 100644 index 00000000..a9378a6e --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CustomParameterTypeTest.js @@ -0,0 +1,124 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const assert_1 = __importDefault(require("assert")); +const CucumberExpression_js_1 = __importDefault(require("../src/CucumberExpression.js")); +const ParameterType_js_1 = __importDefault(require("../src/ParameterType.js")); +const ParameterTypeRegistry_js_1 = __importDefault(require("../src/ParameterTypeRegistry.js")); +const RegularExpression_js_1 = __importDefault(require("../src/RegularExpression.js")); +class Color { + name; + constructor(name) { + this.name = name; + } +} +class CssColor { + name; + constructor(name) { + this.name = name; + } +} +describe('Custom parameter type', () => { + let parameterTypeRegistry; + beforeEach(() => { + parameterTypeRegistry = new ParameterTypeRegistry_js_1.default(); + parameterTypeRegistry.defineParameterType(new ParameterType_js_1.default('color', /red|blue|yellow/, Color, (s) => new Color(s), false, true)); + }); + describe('CucumberExpression', () => { + it('throws exception for illegal character in parameter name', () => { + assert_1.default.throws(() => new ParameterType_js_1.default('[string]', /.*/, String, (s) => s, false, true), { + message: "Illegal character in parameter name {[string]}. Parameter names may not contain '{', '}', '(', ')', '\\' or '/'", + }); + }); + it('matches parameters with custom parameter type', () => { + const expression = new CucumberExpression_js_1.default('I have a {color} ball', parameterTypeRegistry); + const value = expression.match('I have a red ball')?.[0].getValue(null); + assert_1.default.strictEqual(value?.name, 'red'); + }); + it('matches parameters with multiple capture groups', () => { + class Coordinate { + x; + y; + z; + constructor(x, y, z) { + this.x = x; + this.y = y; + this.z = z; + } + } + parameterTypeRegistry.defineParameterType(new ParameterType_js_1.default('coordinate', /(\d+),\s*(\d+),\s*(\d+)/, Coordinate, (x, y, z) => new Coordinate(Number(x), Number(y), Number(z)), true, true)); + const expression = new CucumberExpression_js_1.default('A {int} thick line from {coordinate} to {coordinate}', parameterTypeRegistry); + const args = expression.match('A 5 thick line from 10,20,30 to 40,50,60'); + const thick = args?.[0].getValue(null); + assert_1.default.strictEqual(thick, 5); + const from = args?.[1].getValue(null); + assert_1.default.strictEqual(from?.x, 10); + assert_1.default.strictEqual(from?.y, 20); + assert_1.default.strictEqual(from?.z, 30); + const to = args?.[2].getValue(null); + assert_1.default.strictEqual(to?.x, 40); + assert_1.default.strictEqual(to?.y, 50); + assert_1.default.strictEqual(to?.z, 60); + }); + it('matches parameters with custom parameter type using optional capture group', () => { + parameterTypeRegistry = new ParameterTypeRegistry_js_1.default(); + parameterTypeRegistry.defineParameterType(new ParameterType_js_1.default('color', [/red|blue|yellow/, /(?:dark|light) (?:red|blue|yellow)/], Color, (s) => new Color(s), false, true)); + const expression = new CucumberExpression_js_1.default('I have a {color} ball', parameterTypeRegistry); + const value = expression.match('I have a dark red ball')?.[0].getValue(null); + assert_1.default.strictEqual(value?.name, 'dark red'); + }); + it('defers transformation until queried from argument', () => { + parameterTypeRegistry.defineParameterType(new ParameterType_js_1.default('throwing', /bad/, null, (s) => { + throw new Error(`Can't transform [${s}]`); + }, false, true)); + const expression = new CucumberExpression_js_1.default('I have a {throwing} parameter', parameterTypeRegistry); + const args = expression.match('I have a bad parameter'); + assert_1.default.throws(() => args[0].getValue(null), { + message: "Can't transform [bad]", + }); + }); + describe('conflicting parameter type', () => { + it('is detected for type name', () => { + assert_1.default.throws(() => parameterTypeRegistry.defineParameterType(new ParameterType_js_1.default('color', /.*/, CssColor, (s) => new CssColor(s), false, true)), { message: 'There is already a parameter type with name color' }); + }); + it('is not detected for type', () => { + parameterTypeRegistry.defineParameterType(new ParameterType_js_1.default('whatever', /.*/, Color, (s) => new Color(s), false, false)); + }); + it('is not detected for regexp', () => { + parameterTypeRegistry.defineParameterType(new ParameterType_js_1.default('css-color', /red|blue|yellow/, CssColor, (s) => new CssColor(s), true, false)); + assert_1.default.strictEqual(new CucumberExpression_js_1.default('I have a {css-color} ball', parameterTypeRegistry) + .match('I have a blue ball')?.[0] + .getValue(null)?.constructor, CssColor); + assert_1.default.strictEqual(new CucumberExpression_js_1.default('I have a {css-color} ball', parameterTypeRegistry) + .match('I have a blue ball')?.[0] + .getValue(null)?.name, 'blue'); + assert_1.default.strictEqual(new CucumberExpression_js_1.default('I have a {color} ball', parameterTypeRegistry) + .match('I have a blue ball')?.[0] + .getValue(null)?.constructor, Color); + assert_1.default.strictEqual(new CucumberExpression_js_1.default('I have a {color} ball', parameterTypeRegistry) + .match('I have a blue ball')?.[0] + .getValue(null)?.name, 'blue'); + }); + }); + // JavaScript-specific + it('creates arguments using async transform', async () => { + parameterTypeRegistry = new ParameterTypeRegistry_js_1.default(); + parameterTypeRegistry.defineParameterType(new ParameterType_js_1.default('asyncColor', /red|blue|yellow/, Color, async (s) => new Color(s), false, true)); + const expression = new CucumberExpression_js_1.default('I have a {asyncColor} ball', parameterTypeRegistry); + const args = expression.match('I have a red ball'); + const value = await args?.[0].getValue(null); + assert_1.default.strictEqual(value?.name, 'red'); + }); + }); + describe('RegularExpression', () => { + it('matches arguments with custom parameter type', () => { + const expression = new RegularExpression_js_1.default(/I have a (red|blue|yellow) ball/, parameterTypeRegistry); + const value = expression.match('I have a red ball')?.[0].getValue(null); + assert_1.default.strictEqual(value?.constructor, Color); + assert_1.default.strictEqual(value?.name, 'red'); + }); + }); +}); +//# sourceMappingURL=CustomParameterTypeTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CustomParameterTypeTest.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CustomParameterTypeTest.js.map new file mode 100644 index 00000000..5e5b0be1 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/CustomParameterTypeTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CustomParameterTypeTest.js","sourceRoot":"","sources":["../../../test/CustomParameterTypeTest.ts"],"names":[],"mappings":";;;;;AAAA,oDAA2B;AAE3B,yFAA6D;AAC7D,+EAAmD;AACnD,+FAAmE;AACnE,uFAA2D;AAE3D,MAAM,KAAK;IACmB;IAA5B,YAA4B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;CAC7C;AAED,MAAM,QAAQ;IACgB;IAA5B,YAA4B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;CAC7C;AAED,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAI,qBAA4C,CAAA;IAEhD,UAAU,CAAC,GAAG,EAAE;QACd,qBAAqB,GAAG,IAAI,kCAAqB,EAAE,CAAA;QACnD,qBAAqB,CAAC,mBAAmB,CACvC,IAAI,0BAAa,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CACvF,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,gBAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,0BAAa,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE;gBACtF,OAAO,EACL,iHAAiH;aACpH,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,UAAU,GAAG,IAAI,+BAAkB,CAAC,uBAAuB,EAAE,qBAAqB,CAAC,CAAA;YACzF,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAQ,IAAI,CAAC,CAAA;YAC9E,gBAAM,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;QACxC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,UAAU;gBAEI;gBACA;gBACA;gBAHlB,YACkB,CAAS,EACT,CAAS,EACT,CAAS;oBAFT,MAAC,GAAD,CAAC,CAAQ;oBACT,MAAC,GAAD,CAAC,CAAQ;oBACT,MAAC,GAAD,CAAC,CAAQ;gBACxB,CAAC;aACL;YAED,qBAAqB,CAAC,mBAAmB,CACvC,IAAI,0BAAa,CACf,YAAY,EACZ,yBAAyB,EACzB,UAAU,EACV,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EACpF,IAAI,EACJ,IAAI,CACL,CACF,CAAA;YACD,MAAM,UAAU,GAAG,IAAI,+BAAkB,CACvC,sDAAsD,EACtD,qBAAqB,CACtB,CAAA;YACD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAA;YAEzE,MAAM,KAAK,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAS,IAAI,CAAC,CAAA;YAC9C,gBAAM,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;YAE5B,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAa,IAAI,CAAC,CAAA;YACjD,gBAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;YAC/B,gBAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;YAC/B,gBAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;YAE/B,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAa,IAAI,CAAC,CAAA;YAC/C,gBAAM,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;YAC7B,gBAAM,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;YAC7B,gBAAM,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAC/B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;YACpF,qBAAqB,GAAG,IAAI,kCAAqB,EAAE,CAAA;YACnD,qBAAqB,CAAC,mBAAmB,CACvC,IAAI,0BAAa,CACf,OAAO,EACP,CAAC,iBAAiB,EAAE,oCAAoC,CAAC,EACzD,KAAK,EACL,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EACnB,KAAK,EACL,IAAI,CACL,CACF,CAAA;YACD,MAAM,UAAU,GAAG,IAAI,+BAAkB,CAAC,uBAAuB,EAAE,qBAAqB,CAAC,CAAA;YACzF,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAQ,IAAI,CAAC,CAAA;YACnF,gBAAM,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAA;QAC7C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,qBAAqB,CAAC,mBAAmB,CACvC,IAAI,0BAAa,CACf,UAAU,EACV,KAAK,EACL,IAAI,EACJ,CAAC,CAAC,EAAE,EAAE;gBACJ,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAA;YAC3C,CAAC,EACD,KAAK,EACL,IAAI,CACL,CACF,CAAA;YAED,MAAM,UAAU,GAAG,IAAI,+BAAkB,CACvC,+BAA+B,EAC/B,qBAAqB,CACtB,CAAA;YAED,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,wBAAwB,CAAE,CAAA;YACxD,gBAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;gBAC1C,OAAO,EAAE,uBAAuB;aACjC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;YAC1C,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;gBACnC,gBAAM,CAAC,MAAM,CACX,GAAG,EAAE,CACH,qBAAqB,CAAC,mBAAmB,CACvC,IAAI,0BAAa,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAChF,EACH,EAAE,OAAO,EAAE,mDAAmD,EAAE,CACjE,CAAA;YACH,CAAC,CAAC,CAAA;YAEF,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;gBAClC,qBAAqB,CAAC,mBAAmB,CACvC,IAAI,0BAAa,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAC9E,CAAA;YACH,CAAC,CAAC,CAAA;YAEF,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;gBACpC,qBAAqB,CAAC,mBAAmB,CACvC,IAAI,0BAAa,CACf,WAAW,EACX,iBAAiB,EACjB,QAAQ,EACR,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EACtB,IAAI,EACJ,KAAK,CACN,CACF,CAAA;gBAED,gBAAM,CAAC,WAAW,CAChB,IAAI,+BAAkB,CAAC,2BAA2B,EAAE,qBAAqB,CAAC;qBACvE,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC;qBAChC,QAAQ,CAAW,IAAI,CAAC,EAAE,WAAW,EACxC,QAAQ,CACT,CAAA;gBACD,gBAAM,CAAC,WAAW,CAChB,IAAI,+BAAkB,CAAC,2BAA2B,EAAE,qBAAqB,CAAC;qBACvE,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC;qBAChC,QAAQ,CAAW,IAAI,CAAC,EAAE,IAAI,EACjC,MAAM,CACP,CAAA;gBACD,gBAAM,CAAC,WAAW,CAChB,IAAI,+BAAkB,CAAC,uBAAuB,EAAE,qBAAqB,CAAC;qBACnE,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC;qBAChC,QAAQ,CAAQ,IAAI,CAAC,EAAE,WAAW,EACrC,KAAK,CACN,CAAA;gBACD,gBAAM,CAAC,WAAW,CAChB,IAAI,+BAAkB,CAAC,uBAAuB,EAAE,qBAAqB,CAAC;qBACnE,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC;qBAChC,QAAQ,CAAQ,IAAI,CAAC,EAAE,IAAI,EAC9B,MAAM,CACP,CAAA;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,sBAAsB;QACtB,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,qBAAqB,GAAG,IAAI,kCAAqB,EAAE,CAAA;YACnD,qBAAqB,CAAC,mBAAmB,CACvC,IAAI,0BAAa,CACf,YAAY,EACZ,iBAAiB,EACjB,KAAK,EACL,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EACzB,KAAK,EACL,IAAI,CACL,CACF,CAAA;YAED,MAAM,UAAU,GAAG,IAAI,+BAAkB,CAAC,4BAA4B,EAAE,qBAAqB,CAAC,CAAA;YAC9F,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;YAClD,MAAM,KAAK,GAAG,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAiB,IAAI,CAAC,CAAA;YAC5D,gBAAM,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;QACxC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,UAAU,GAAG,IAAI,8BAAiB,CACtC,iCAAiC,EACjC,qBAAqB,CACtB,CAAA;YACD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAQ,IAAI,CAAC,CAAA;YAC9E,gBAAM,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,CAAC,CAAA;YAC7C,gBAAM,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;QACxC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ExpressionFactoryTest.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ExpressionFactoryTest.d.ts new file mode 100644 index 00000000..e96f5c0f --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ExpressionFactoryTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=ExpressionFactoryTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ExpressionFactoryTest.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ExpressionFactoryTest.d.ts.map new file mode 100644 index 00000000..31895988 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ExpressionFactoryTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ExpressionFactoryTest.d.ts","sourceRoot":"","sources":["../../../test/ExpressionFactoryTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ExpressionFactoryTest.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ExpressionFactoryTest.js new file mode 100644 index 00000000..53a62c80 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ExpressionFactoryTest.js @@ -0,0 +1,56 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const assert = __importStar(require("assert")); +const CucumberExpression_js_1 = __importDefault(require("../src/CucumberExpression.js")); +const ExpressionFactory_js_1 = __importDefault(require("../src/ExpressionFactory.js")); +const ParameterTypeRegistry_js_1 = __importDefault(require("../src/ParameterTypeRegistry.js")); +const RegularExpression_js_1 = __importDefault(require("../src/RegularExpression.js")); +describe('ExpressionFactory', () => { + let expressionFactory; + beforeEach(() => { + expressionFactory = new ExpressionFactory_js_1.default(new ParameterTypeRegistry_js_1.default()); + }); + it('creates a RegularExpression', () => { + assert.strictEqual(expressionFactory.createExpression(/x/).constructor, RegularExpression_js_1.default); + }); + it('creates a CucumberExpression', () => { + assert.strictEqual(expressionFactory.createExpression('x').constructor, CucumberExpression_js_1.default); + }); +}); +//# sourceMappingURL=ExpressionFactoryTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ExpressionFactoryTest.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ExpressionFactoryTest.js.map new file mode 100644 index 00000000..66d90ed8 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ExpressionFactoryTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ExpressionFactoryTest.js","sourceRoot":"","sources":["../../../test/ExpressionFactoryTest.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAgC;AAEhC,yFAA6D;AAC7D,uFAA2D;AAC3D,+FAAmE;AACnE,uFAA2D;AAE3D,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,iBAAoC,CAAA;IACxC,UAAU,CAAC,GAAG,EAAE;QACd,iBAAiB,GAAG,IAAI,8BAAiB,CAAC,IAAI,kCAAqB,EAAE,CAAC,CAAA;IACxE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,WAAW,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,8BAAiB,CAAC,CAAA;IAC5F,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,WAAW,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,+BAAkB,CAAC,CAAA;IAC7F,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeRegistryTest.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeRegistryTest.d.ts new file mode 100644 index 00000000..5cd0c9cc --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeRegistryTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=ParameterTypeRegistryTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeRegistryTest.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeRegistryTest.d.ts.map new file mode 100644 index 00000000..c1402f0b --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeRegistryTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ParameterTypeRegistryTest.d.ts","sourceRoot":"","sources":["../../../test/ParameterTypeRegistryTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeRegistryTest.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeRegistryTest.js new file mode 100644 index 00000000..3fed70cf --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeRegistryTest.js @@ -0,0 +1,54 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const assert_1 = __importDefault(require("assert")); +const ParameterType_js_1 = __importDefault(require("../src/ParameterType.js")); +const ParameterTypeRegistry_js_1 = __importDefault(require("../src/ParameterTypeRegistry.js")); +class Name { + name; + constructor(name) { + this.name = name; + } +} +class Person { + name; + constructor(name) { + this.name = name; + } +} +class Place { + name; + constructor(name) { + this.name = name; + } +} +const CAPITALISED_WORD = /[A-Z]+\w+/; +describe('ParameterTypeRegistry', () => { + let registry; + beforeEach(() => { + registry = new ParameterTypeRegistry_js_1.default(); + }); + it('does not allow more than one preferential parameter type for each regexp', () => { + registry.defineParameterType(new ParameterType_js_1.default('name', CAPITALISED_WORD, Name, (s) => new Name(s), true, true)); + registry.defineParameterType(new ParameterType_js_1.default('person', CAPITALISED_WORD, Person, (s) => new Person(s), true, false)); + try { + registry.defineParameterType(new ParameterType_js_1.default('place', CAPITALISED_WORD, Place, (s) => new Place(s), true, true)); + throw new Error('Should have failed'); + } + catch (err) { + assert_1.default.strictEqual(err.message, `There can only be one preferential parameter type per regexp. The regexp ${CAPITALISED_WORD} is used for two preferential parameter types, {name} and {place}`); + } + }); + it('looks up preferential parameter type by regexp', () => { + const name = new ParameterType_js_1.default('name', /[A-Z]+\w+/, null, (s) => new Name(s), true, false); + const person = new ParameterType_js_1.default('person', /[A-Z]+\w+/, null, (s) => new Person(s), true, true); + const place = new ParameterType_js_1.default('place', /[A-Z]+\w+/, null, (s) => new Place(s), true, false); + registry.defineParameterType(name); + registry.defineParameterType(person); + registry.defineParameterType(place); + assert_1.default.strictEqual(registry.lookupByRegexp('[A-Z]+\\w+', /([A-Z]+\w+) and ([A-Z]+\w+)/, 'Lisa and Bob'), person); + }); +}); +//# sourceMappingURL=ParameterTypeRegistryTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeRegistryTest.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeRegistryTest.js.map new file mode 100644 index 00000000..500224ec --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeRegistryTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ParameterTypeRegistryTest.js","sourceRoot":"","sources":["../../../test/ParameterTypeRegistryTest.ts"],"names":[],"mappings":";;;;;AAAA,oDAA2B;AAE3B,+EAAmD;AACnD,+FAAmE;AAEnE,MAAM,IAAI;IACoB;IAA5B,YAA4B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;CAC7C;AACD,MAAM,MAAM;IACkB;IAA5B,YAA4B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;CAC7C;AACD,MAAM,KAAK;IACmB;IAA5B,YAA4B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;CAC7C;AAED,MAAM,gBAAgB,GAAG,WAAW,CAAA;AAEpC,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAI,QAA+B,CAAA;IACnC,UAAU,CAAC,GAAG,EAAE;QACd,QAAQ,GAAG,IAAI,kCAAqB,EAAE,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,QAAQ,CAAC,mBAAmB,CAC1B,IAAI,0BAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAClF,CAAA;QACD,QAAQ,CAAC,mBAAmB,CAC1B,IAAI,0BAAa,CAAC,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CACzF,CAAA;QACD,IAAI,CAAC;YACH,QAAQ,CAAC,mBAAmB,CAC1B,IAAI,0BAAa,CAAC,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CACrF,CAAA;YACD,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,gBAAM,CAAC,WAAW,CAChB,GAAG,CAAC,OAAO,EACX,4EAA4E,gBAAgB,mEAAmE,CAChK,CAAA;QACH,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,IAAI,GAAG,IAAI,0BAAa,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;QAC1F,MAAM,MAAM,GAAG,IAAI,0BAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QAC/F,MAAM,KAAK,GAAG,IAAI,0BAAa,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;QAE7F,QAAQ,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAA;QAClC,QAAQ,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAA;QACpC,QAAQ,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAA;QAEnC,gBAAM,CAAC,WAAW,CAChB,QAAQ,CAAC,cAAc,CAAC,YAAY,EAAE,6BAA6B,EAAE,cAAc,CAAC,EACpF,MAAM,CACP,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeTest.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeTest.d.ts new file mode 100644 index 00000000..1d9d221f --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=ParameterTypeTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeTest.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeTest.d.ts.map new file mode 100644 index 00000000..745f4bd9 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ParameterTypeTest.d.ts","sourceRoot":"","sources":["../../../test/ParameterTypeTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeTest.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeTest.js new file mode 100644 index 00000000..1f6870ec --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeTest.js @@ -0,0 +1,65 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const assert = __importStar(require("assert")); +const ParameterType_js_1 = __importDefault(require("../src/ParameterType.js")); +const ParameterTypeRegistry_js_1 = __importDefault(require("../src/ParameterTypeRegistry.js")); +describe('ParameterType', () => { + it('does not allow ignore flag on regexp', () => { + assert.throws(() => new ParameterType_js_1.default('case-insensitive', /[a-z]+/i, String, (s) => s, true, true), { message: "ParameterType Regexps can't use flag 'i'" }); + }); + it('has a type name for {int}', () => { + const r = new ParameterTypeRegistry_js_1.default(); + const t = r.lookupByTypeName('int'); + // @ts-ignore + assert.strictEqual(t.type.name, 'Number'); + }); + it('has a type name for {bigint}', () => { + const r = new ParameterTypeRegistry_js_1.default(); + const t = r.lookupByTypeName('biginteger'); + // @ts-ignore + assert.strictEqual(t.type.name, 'BigInt'); + }); + it('has a type name for {word}', () => { + const r = new ParameterTypeRegistry_js_1.default(); + const t = r.lookupByTypeName('word'); + // @ts-ignore + assert.strictEqual(t.type.name, 'String'); + }); +}); +//# sourceMappingURL=ParameterTypeTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeTest.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeTest.js.map new file mode 100644 index 00000000..d9de4697 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/ParameterTypeTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ParameterTypeTest.js","sourceRoot":"","sources":["../../../test/ParameterTypeTest.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAgC;AAEhC,+EAAmD;AACnD,+FAAmE;AAEnE,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,IAAI,0BAAa,CAAC,kBAAkB,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,EACpF,EAAE,OAAO,EAAE,0CAA0C,EAAE,CACxD,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,GAAG,IAAI,kCAAqB,EAAE,CAAA;QACrC,MAAM,CAAC,GAAG,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAE,CAAA;QACpC,aAAa;QACb,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,GAAG,IAAI,kCAAqB,EAAE,CAAA;QACrC,MAAM,CAAC,GAAG,CAAC,CAAC,gBAAgB,CAAC,YAAY,CAAE,CAAA;QAC3C,aAAa;QACb,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,GAAG,IAAI,kCAAqB,EAAE,CAAA;QACrC,MAAM,CAAC,GAAG,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAE,CAAA;QACrC,aAAa;QACb,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/RegularExpressionTest.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/RegularExpressionTest.d.ts new file mode 100644 index 00000000..92e9ce8f --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/RegularExpressionTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=RegularExpressionTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/RegularExpressionTest.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/RegularExpressionTest.d.ts.map new file mode 100644 index 00000000..f3a8391e --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/RegularExpressionTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"RegularExpressionTest.d.ts","sourceRoot":"","sources":["../../../test/RegularExpressionTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/RegularExpressionTest.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/RegularExpressionTest.js new file mode 100644 index 00000000..c950c249 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/RegularExpressionTest.js @@ -0,0 +1,86 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const assert_1 = __importDefault(require("assert")); +const fs_1 = __importDefault(require("fs")); +const glob_1 = require("glob"); +const js_yaml_1 = __importDefault(require("js-yaml")); +const ParameterTypeRegistry_js_1 = __importDefault(require("../src/ParameterTypeRegistry.js")); +const RegularExpression_js_1 = __importDefault(require("../src/RegularExpression.js")); +const testDataDir_js_1 = require("./testDataDir.js"); +describe('RegularExpression', () => { + for (const path of glob_1.glob.sync(`${testDataDir_js_1.testDataDir}/regular-expression/matching/*.yaml`)) { + const expectation = js_yaml_1.default.load(fs_1.default.readFileSync(path, 'utf-8')); + it(`matches ${path}`, () => { + const parameterTypeRegistry = new ParameterTypeRegistry_js_1.default(); + const expression = new RegularExpression_js_1.default(new RegExp(expectation.expression), parameterTypeRegistry); + const matches = expression.match(expectation.text); + assert_1.default.deepStrictEqual(JSON.parse(JSON.stringify(matches ? matches.map((value) => value.getValue(null)) : null)), // Removes type information. + expectation.expected_args); + }); + } + it('does no transform by default', () => { + assert_1.default.deepStrictEqual(match(/(\d\d)/, '22'), ['22']); + }); + it('does not transform anonymous', () => { + assert_1.default.deepStrictEqual(match(/(.*)/, '22'), ['22']); + }); + it('transforms negative int', () => { + assert_1.default.deepStrictEqual(match(/(-?\d+)/, '-22'), [-22]); + }); + it('transforms positive int', () => { + assert_1.default.deepStrictEqual(match(/(\d+)/, '22'), [22]); + }); + it('returns null when there is no match', () => { + assert_1.default.strictEqual(match(/hello/, 'world'), null); + }); + it('matches empty string', () => { + assert_1.default.deepStrictEqual(match(/^The value equals "([^"]*)"$/, 'The value equals ""'), ['']); + }); + it('matches nested capture group without match', () => { + assert_1.default.deepStrictEqual(match(/^a user( named "([^"]*)")?$/, 'a user'), [null]); + }); + it('matches nested capture group with match', () => { + assert_1.default.deepStrictEqual(match(/^a user( named "([^"]*)")?$/, 'a user named "Charlie"'), [ + 'Charlie', + ]); + }); + it('matches capture group nested in optional one', () => { + const regexp = /^a (pre-commercial transaction |pre buyer fee model )?purchase(?: for \$(\d+))?$/; + assert_1.default.deepStrictEqual(match(regexp, 'a purchase'), [null, null]); + assert_1.default.deepStrictEqual(match(regexp, 'a purchase for $33'), [null, 33]); + assert_1.default.deepStrictEqual(match(regexp, 'a pre buyer fee model purchase'), [ + 'pre buyer fee model ', + null, + ]); + }); + it('ignores non capturing groups', () => { + assert_1.default.deepStrictEqual(match(/(\S+) ?(can|cannot)? (?:delete|cancel) the (\d+)(?:st|nd|rd|th) (attachment|slide) ?(?:upload)?/, 'I can cancel the 1st slide upload'), ['I', 'can', 1, 'slide']); + }); + it('works with escaped parenthesis', () => { + assert_1.default.deepStrictEqual(match(/Across the line\(s\)/, 'Across the line(s)'), []); + }); + it('exposes regexp and source', () => { + const regexp = /I have (\d+) cukes? in my (.+) now/; + const expression = new RegularExpression_js_1.default(regexp, new ParameterTypeRegistry_js_1.default()); + assert_1.default.deepStrictEqual(expression.regexp, regexp); + assert_1.default.deepStrictEqual(expression.source, regexp.source); + }); + it('does not take consider parenthesis in character class as group', function () { + const expression = new RegularExpression_js_1.default(/^drawings: ([A-Z_, ()]+)$/, new ParameterTypeRegistry_js_1.default()); + const args = expression.match('drawings: ONE, TWO(ABC)'); + assert_1.default.strictEqual(args[0].getValue(this), 'ONE, TWO(ABC)'); + }); +}); +const match = (regexp, text) => { + const parameterRegistry = new ParameterTypeRegistry_js_1.default(); + const regularExpression = new RegularExpression_js_1.default(regexp, parameterRegistry); + const args = regularExpression.match(text); + if (!args) { + return null; + } + return args.map((arg) => arg.getValue(null)); +}; +//# sourceMappingURL=RegularExpressionTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/RegularExpressionTest.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/RegularExpressionTest.js.map new file mode 100644 index 00000000..9a2796a9 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/RegularExpressionTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"RegularExpressionTest.js","sourceRoot":"","sources":["../../../test/RegularExpressionTest.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/TreeRegexpTest.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/TreeRegexpTest.d.ts new file mode 100644 index 00000000..396124aa --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/TreeRegexpTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=TreeRegexpTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/TreeRegexpTest.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/TreeRegexpTest.d.ts.map new file mode 100644 index 00000000..240c5f41 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/TreeRegexpTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"TreeRegexpTest.d.ts","sourceRoot":"","sources":["../../../test/TreeRegexpTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/TreeRegexpTest.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/TreeRegexpTest.js new file mode 100644 index 00000000..bb474cb0 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/TreeRegexpTest.js @@ -0,0 +1,131 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const assert_1 = __importDefault(require("assert")); +const TreeRegexp_js_1 = __importDefault(require("../src/TreeRegexp.js")); +describe('TreeRegexp', () => { + it('exposes group source', () => { + const tr = new TreeRegexp_js_1.default(/(a(?:b)?)(c)/); + assert_1.default.deepStrictEqual(tr.groupBuilder.children.map((gb) => gb.source), ['a(?:b)?', 'c']); + }); + it('builds tree', () => { + const tr = new TreeRegexp_js_1.default(/(a(?:b)?)(c)/); + const group = tr.match('ac'); + assert_1.default.strictEqual(group.value, 'ac'); + assert_1.default.strictEqual(group.children?.[0].value, 'a'); + assert_1.default.deepStrictEqual(group.children[0].children, undefined); + assert_1.default.strictEqual(group.children[1].value, 'c'); + }); + it('ignores `?:` as a non-capturing group', () => { + const tr = new TreeRegexp_js_1.default(/a(?:b)(c)/); + const group = tr.match('abc'); + assert_1.default.strictEqual(group.value, 'abc'); + assert_1.default.strictEqual(group.children?.length, 1); + }); + it('ignores `?!` as a non-capturing group', () => { + const tr = new TreeRegexp_js_1.default(/a(?!b)(.+)/); + const group = tr.match('aBc'); + assert_1.default.strictEqual(group.value, 'aBc'); + assert_1.default.strictEqual(group.children?.length, 1); + }); + it('ignores `?=` as a non-capturing group', () => { + const tr = new TreeRegexp_js_1.default(/a(?=[b])(.+)/); + const group = tr.match('abc'); + assert_1.default.strictEqual(group.value, 'abc'); + assert_1.default.strictEqual(group.children?.length, 1); + assert_1.default.strictEqual(group.children[0].value, 'bc'); + }); + it('ignores `?<=` as a non-capturing group', () => { + const tr = new TreeRegexp_js_1.default(/a(.+)(?<=c)$/); + const group = tr.match('abc'); + assert_1.default.strictEqual(group.value, 'abc'); + assert_1.default.strictEqual(group.children?.length, 1); + assert_1.default.strictEqual(group.children[0].value, 'bc'); + }); + it('ignores `? { + const tr = new TreeRegexp_js_1.default(/a(.+?)(? { + const tr = new TreeRegexp_js_1.default(/a(?b)c/); + const group = tr.match('abc'); + assert_1.default.strictEqual(group.value, 'abc'); + assert_1.default.strictEqual(group.children?.length, 1); + assert_1.default.strictEqual(group.children[0].value, 'b'); + }); + it('matches optional group', () => { + const tr = new TreeRegexp_js_1.default(/^Something( with an optional argument)?/); + const group = tr.match('Something'); + assert_1.default.strictEqual(group.children?.[0].value, undefined); + }); + it('matches nested groups', () => { + const tr = new TreeRegexp_js_1.default(/^A (\d+) thick line from ((\d+),\s*(\d+),\s*(\d+)) to ((\d+),\s*(\d+),\s*(\d+))/); + const group = tr.match('A 5 thick line from 10,20,30 to 40,50,60'); + assert_1.default.strictEqual(group.children?.[0].value, '5'); + assert_1.default.strictEqual(group.children?.[1].value, '10,20,30'); + assert_1.default.strictEqual(group.children?.[1].children?.[0].value, '10'); + assert_1.default.strictEqual(group.children?.[1].children?.[1].value, '20'); + assert_1.default.strictEqual(group.children?.[1].children?.[2].value, '30'); + assert_1.default.strictEqual(group.children?.[2].value, '40,50,60'); + assert_1.default.strictEqual(group.children?.[2].children?.[0].value, '40'); + assert_1.default.strictEqual(group.children?.[2].children?.[1].value, '50'); + assert_1.default.strictEqual(group.children?.[2].children?.[2].value, '60'); + }); + it('detects multiple non capturing groups', () => { + const tr = new TreeRegexp_js_1.default(/(?:a)(:b)(\?c)(d)/); + const group = tr.match('a:b?cd'); + assert_1.default.strictEqual(group.children?.length, 3); + }); + it('works with escaped backslash', () => { + const tr = new TreeRegexp_js_1.default(/foo\\(bar|baz)/); + const group = tr.match('foo\\bar'); + assert_1.default.strictEqual(group.children?.length, 1); + }); + it('works with escaped slash', () => { + const tr = new TreeRegexp_js_1.default(/^I go to '\/(.+)'$/); + const group = tr.match("I go to '/hello'"); + assert_1.default.strictEqual(group.children?.length, 1); + }); + it('works with digit and word', () => { + const tr = new TreeRegexp_js_1.default(/^(\d) (\w+)$/); + const group = tr.match('2 you'); + assert_1.default.strictEqual(group.children?.length, 2); + }); + it('captures non capturing groups with capturing groups inside', () => { + const tr = new TreeRegexp_js_1.default('the stdout(?: from "(.*?)")?'); + const group = tr.match('the stdout'); + assert_1.default.strictEqual(group.value, 'the stdout'); + assert_1.default.strictEqual(group.children?.[0].value, undefined); + assert_1.default.strictEqual(group.children?.length, 1); + }); + it('works with case insensitive flag', () => { + const tr = new TreeRegexp_js_1.default(/HELLO/i); + const group = tr.match('hello'); + assert_1.default.strictEqual(group.value, 'hello'); + }); + it('empty capturing group', () => { + const tr = new TreeRegexp_js_1.default(/()/); + const group = tr.match(''); + assert_1.default.strictEqual(group.value, ''); + assert_1.default.strictEqual(group.children?.length, 1); + }); + it('empty look ahead', () => { + const tr = new TreeRegexp_js_1.default(/(?<=)/); + const group = tr.match(''); + assert_1.default.strictEqual(group.value, ''); + assert_1.default.strictEqual(group.children, undefined); + }); + it('does not consider parenthesis in character class as group', () => { + const tr = new TreeRegexp_js_1.default(/^drawings: ([A-Z, ()]+)$/); + const group = tr.match('drawings: ONE(TWO)'); + assert_1.default.strictEqual(group.value, 'drawings: ONE(TWO)'); + assert_1.default.strictEqual(group.children?.length, 1); + assert_1.default.strictEqual(group.children[0].value, 'ONE(TWO)'); + }); +}); +//# sourceMappingURL=TreeRegexpTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/TreeRegexpTest.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/TreeRegexpTest.js.map new file mode 100644 index 00000000..7ac9c58d --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/TreeRegexpTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TreeRegexpTest.js","sourceRoot":"","sources":["../../../test/TreeRegexpTest.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/testDataDir.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/testDataDir.d.ts new file mode 100644 index 00000000..d1ff6beb --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/testDataDir.d.ts @@ -0,0 +1,2 @@ +export declare const testDataDir: string; +//# sourceMappingURL=testDataDir.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/testDataDir.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/testDataDir.d.ts.map new file mode 100644 index 00000000..8e3eda32 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/testDataDir.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"testDataDir.d.ts","sourceRoot":"","sources":["../../../test/testDataDir.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,QAAkE,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/testDataDir.js b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/testDataDir.js new file mode 100644 index 00000000..05ee5b84 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/testDataDir.js @@ -0,0 +1,5 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.testDataDir = void 0; +exports.testDataDir = process.env.CUCUMBER_EXPRESSIONS_TEST_DATA_DIR || '../testdata'; +//# sourceMappingURL=testDataDir.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/testDataDir.js.map b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/testDataDir.js.map new file mode 100644 index 00000000..2c00500a --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/test/testDataDir.js.map @@ -0,0 +1 @@ +{"version":3,"file":"testDataDir.js","sourceRoot":"","sources":["../../../test/testDataDir.ts"],"names":[],"mappings":";;;AAAa,QAAA,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,kCAAkC,IAAI,aAAa,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/cjs/tsconfig.build-cjs.tsbuildinfo b/node_modules/@cucumber/cucumber-expressions/dist/cjs/tsconfig.build-cjs.tsbuildinfo new file mode 100644 index 00000000..eabb21a5 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/cjs/tsconfig.build-cjs.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../src/CucumberExpressionError.ts","../../src/Group.ts","../../src/ParameterType.ts","../../src/Argument.ts","../../src/Ast.ts","../../src/types.ts","../../src/GeneratedExpression.ts","../../src/CombinatorialGeneratedExpressionFactory.ts","../../src/Errors.ts","../../src/CucumberExpressionTokenizer.ts","../../src/CucumberExpressionParser.ts","../../src/ParameterTypeMatcher.ts","../../src/CucumberExpressionGenerator.ts","../../src/defineDefaultParameterTypes.ts","../../src/ParameterTypeRegistry.ts","../../node_modules/regexp-match-indices/types.d.ts","../../node_modules/regexp-match-indices/index.d.ts","../../src/GroupBuilder.ts","../../src/TreeRegexp.ts","../../src/CucumberExpression.ts","../../src/RegularExpression.ts","../../src/ExpressionFactory.ts","../../src/index.ts","../../test/ArgumentTest.ts","../../test/CombinatorialGeneratedExpressionFactoryTest.ts","../../test/CucumberExpressionGeneratorTest.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/@types/node/web-globals/events.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/inspector.generated.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/minipass/dist/commonjs/index.d.ts","../../node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.d.ts","../../node_modules/path-scurry/dist/commonjs/index.d.ts","../../node_modules/glob/node_modules/minimatch/dist/commonjs/ast.d.ts","../../node_modules/glob/node_modules/minimatch/dist/commonjs/escape.d.ts","../../node_modules/glob/node_modules/minimatch/dist/commonjs/unescape.d.ts","../../node_modules/glob/node_modules/minimatch/dist/commonjs/index.d.ts","../../node_modules/glob/dist/commonjs/pattern.d.ts","../../node_modules/glob/dist/commonjs/processor.d.ts","../../node_modules/glob/dist/commonjs/walker.d.ts","../../node_modules/glob/dist/commonjs/ignore.d.ts","../../node_modules/glob/dist/commonjs/glob.d.ts","../../node_modules/glob/dist/commonjs/has-magic.d.ts","../../node_modules/glob/dist/commonjs/index.d.ts","../../node_modules/@types/js-yaml/index.d.ts","../../test/testDataDir.ts","../../test/CucumberExpressionParserTest.ts","../../test/CucumberExpressionTest.ts","../../test/CucumberExpressionTokenizerTest.ts","../../test/CucumberExpressionTransformationTest.ts","../../test/CustomParameterTypeTest.ts","../../test/ExpressionFactoryTest.ts","../../test/ParameterTypeRegistryTest.ts","../../test/ParameterTypeTest.ts","../../test/RegularExpressionTest.ts","../../test/TreeRegexpTest.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/json5/index.d.ts","../../node_modules/@types/mocha/index.d.ts"],"fileIdsList":[[89,137,154,155],[89,134,135,137,154,155],[89,136,137,154,155],[137,154,155],[89,137,142,154,155,172],[89,137,138,143,148,154,155,157,169,180],[89,137,138,139,148,154,155,157],[84,85,86,89,137,154,155],[89,137,140,154,155,181],[89,137,141,142,149,154,155,158],[89,137,142,154,155,169,177],[89,137,143,145,148,154,155,157],[89,136,137,144,154,155],[89,137,145,146,154,155],[89,137,147,148,154,155],[89,136,137,148,154,155],[89,137,148,149,150,154,155,169,180],[89,137,148,149,150,154,155,164,169,172],[89,130,137,145,148,151,154,155,157,169,180],[89,137,148,149,151,152,154,155,157,169,177,180],[89,137,151,153,154,155,169,177,180],[87,88,89,90,91,92,93,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186],[89,137,148,154,155],[89,137,154,155,156,180],[89,137,145,148,154,155,157,169],[89,137,154,155,158],[89,137,154,155,159],[89,136,137,154,155,160],[89,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186],[89,137,154,155,162],[89,137,154,155,163],[89,137,148,154,155,164,165],[89,137,154,155,164,166,181,183],[89,137,149,154,155],[89,137,148,154,155,169,170,172],[89,137,154,155,171,172],[89,137,154,155,169,170],[89,137,154,155,172],[89,137,154,155,173],[89,134,137,154,155,169,174],[89,137,148,154,155,175,176],[89,137,154,155,175,176],[89,137,142,154,155,157,169,177],[89,137,154,155,178],[89,137,154,155,157,179],[89,137,151,154,155,163,180],[89,137,142,154,155,181],[89,137,154,155,169,182],[89,137,154,155,156,183],[89,137,154,155,184],[89,130,137,154,155],[89,130,137,148,150,154,155,160,169,172,180,182,183,185],[89,137,154,155,169,186],[89,137,154,155,188,190,194,195,198],[89,137,154,155,199],[89,137,154,155,190,194,197],[89,137,154,155,188,190,194,197,198,199,200],[89,137,154,155,194],[89,137,154,155,190,194,195,197],[89,137,154,155,188,190,195,196,198],[89,137,154,155,191,192,193],[89,137,148,154,155,173,187],[89,137,149,154,155,159,188,189],[73,89,137,154,155],[89,102,106,137,154,155,180],[89,102,137,154,155,169,180],[89,97,137,154,155],[89,99,102,137,154,155,177,180],[89,137,154,155,157,177],[89,137,154,155,187],[89,97,137,154,155,187],[89,99,102,137,154,155,157,180],[89,94,95,98,101,137,148,154,155,169,180],[89,102,109,137,154,155],[89,94,100,137,154,155],[89,102,123,124,137,154,155],[89,98,102,137,154,155,172,180,187],[89,123,137,154,155,187],[89,96,97,137,154,155,187],[89,102,137,154,155],[89,96,97,98,99,100,101,102,103,104,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,137,154,155],[89,102,117,137,154,155],[89,102,109,110,137,154,155],[89,100,102,110,111,137,154,155],[89,101,137,154,155],[89,94,97,102,137,154,155],[89,102,106,110,111,137,154,155],[89,106,137,154,155],[89,100,102,105,137,154,155,180],[89,94,99,102,109,137,154,155],[89,137,154,155,169],[89,97,102,123,137,154,155,185,187],[58,59,60,89,137,154,155],[60,64,89,137,154,155],[58,60,61,62,63,66,68,72,76,89,137,154,155],[60,64,65,69,89,137,154,155],[62,66,67,89,137,154,155],[62,66,89,137,154,155],[58,60,62,64,89,137,154,155],[63,72,77,78,89,137,154,155],[60,63,89,137,154,155],[59,74,89,137,154,155],[58,89,137,154,155],[60,89,137,154,155],[58,60,63,66,70,71,89,137,154,155],[60,61,63,72,76,89,137,154,155],[59,74,75,89,137,154,155],[59,60,61,62,63,64,70,72,77,78,79,89,137,154,155],[60,61,89,137,154,155],[61,72,76,89,134,137,154,155],[60,65,89,134,137,154,155],[60,63,70,72,77,89,134,137,154,155],[58,68,89,134,137,149,154,155,201,202,203],[58,60,72,77,89,134,137,149,154,155,201,202,203],[58,67,89,134,137,149,154,155,201,202,203],[72,77,89,134,137,149,154,155,201,202,203],[60,72,77,78,89,134,137,154,155],[72,77,78,79,89,134,137,154,155],[60,72,89,134,137,154,155],[72,78,89,134,137,149,154,155,201,202,203],[76,89,134,137,154,155]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"06da0313a696d2e58f6a6addb168a1faa1407045975ff672d492b233e0d03d18","signature":"e19e037d802f1c50c9342228dd2efc1588da9c715c091b7eadc0162c8503d967"},{"version":"9ede140de3bd446edc8f0504efc8dd890233bff149e3e391d9bc4d9aa9d90b26","signature":"24ef89d81df156d80bde512dd17090b7d27d09020287f28760ac078be9bebf4c"},{"version":"c7df0f4ab2534847f922c0ebf91a9e4ee33e4bd4164027ccbd5e27175e35519d","signature":"57490d02476c72fe9cae1b34584e123676a0348dea80e4812a4e250c52c38468"},{"version":"48b35c8418e69a7860c9de016a31d6182a4ea0e6d8b7a76eecb147c35800385f","signature":"b95293f52864ea44926cb1d1e32b48b68b8b332458da73c58b1e987571158974"},{"version":"a39b2332d4b3b34a0bc15ede317e26df01db21ca91ed5b65d46d01959d1c5b96","signature":"dd82562bcc9bed49db1280d7df870c4b820b5a5919298dc1e3f1eb1d739224ba"},{"version":"3ff166ec4e9b528423ee62aac60c9ac8be821e7bf4518ce90a4700c9b21258e7","signature":"6726ccf9600c6d389280f6ea05c73aee451921d77cb5a3bb49bbbaf86b0a38fa"},{"version":"6f1bd6cf08275bee0efc51828ba69467f323b9d50fb452b3a16d4efd9db60921","signature":"c1dd30504a69bd635e607aaf09b8fda675d27695b625968e13abbbe48917481f"},{"version":"4e7ac7085ebf893ed30952e9d2f2b4d5c377bf23f27d3a13b592e81e501a7a15","signature":"0eb46bea5c59364676679c8c4a83284a9fefecb1b77dcef37063001e6635ddd2"},{"version":"15050d75e57b9c0c7af24607306345edc2a754d13226ff0660c6f27e9513877b","signature":"5bdd2ecd3a23eb6ea616dbde6af2f8ce53e6a475d71702be34c3507373e482ab"},{"version":"02ceec18f2977ea36bec3811ce368fc98e06fff7cb0b11d7c9643209353990d2","signature":"2138c76a0f136863b80ffe260c911617b4005089249d69c73852c125bc8d9ab4"},{"version":"92c2ef0cae2f23efbfe8297128ad0e7afb966180a190e45ebc235971e5095166","signature":"ee114ff5f88e7ee60e64b3161a1ee0579a7d04e0558c82af84788f38996f3f81"},{"version":"3f1f10e6e19a5b539236e29ef5d8318d23d2a67af3223dd0d9ca946da46aef6f","signature":"c5ad640bad7e50aad9f2557b75f64343104edf224ec3ceda26bb12c8a4a84afe"},{"version":"3216975032fc1c8bfbb5cec14b889253b161f9d07be73656cb04b4bff823d2a7","signature":"82d252437544aa799caa000db1444f0b7c98db797c2afaab02942e0a073a47d5"},{"version":"be7b6e29bef5c9d2f26580920f5cb7aeee545797ef3e46dc2e566c9459141c6c","signature":"4398e3d5a86dbe1dc3402c571726c7628955c6300fc653cdf0746780c961c957"},{"version":"690a8b7244f18c8eba19571af5c7be77515b7d751cfedebafc68dc017f06655e","signature":"8cff33b8ea70c630b18f450058ef452f0f0e1a90729cb370c41caab99e498af4"},{"version":"9aa137f97595ff06582fdb09968f1e5fb52f95cb908c6698f462898f82a0bba6","impliedFormat":1},{"version":"b3f65f9c303e875847a2fbe493a34cffdb670370f9d4fd45454f4d80f8077e92","impliedFormat":1},{"version":"cacf93178175c185d8029588737861735bc326aaefb9a5a41f16f117475d8c57","signature":"28e640b5eec581a031f5ae17928fd1bfcaabd3a724b720ee9f8a92af8c351001"},{"version":"f63cb2e3ab889485ee76b4c582af1e1dc68141def643c863072bcc3ce474e598","signature":"50427d3f68d0d5587ce95805b1a305cb644eabd24581b7b5174290bbbe99275a"},{"version":"929e9d63cbd3f3ffd9dc5b5cb42584eeba8d74213ae2c73db2593b1f1cd3204f","signature":"b69216b9607b65105ec37d75b761a66b89302243f6ff8973cb3a04cb44f10919"},{"version":"ee3cfcd57f3fd496857657db2cba3fe23b44a33208be1da2fefeae1737b59566","signature":"c917934380703484415937e8b21b1d797c413728825d2091ddfbd6df615a6e1e"},{"version":"251936125619b35babf300d0fca313df31be9f4ffb5d08ec9f79e11f5f318175","signature":"4bc26751aef71adea01a2c9cc13edf25f0c49d4c8840f4923b31eb34141d2f99"},{"version":"b7472159e705d18142777b49b2cb366fd47ff02f1eec67c1ca348a3823eb7dd5","signature":"73a104ea71e78302bb48a144e71aaef7df820cdbfa3446ffe12ad8315df8c1f3"},{"version":"4ab1230aa0c2d915e82587964b57b233a9eb1445c833550f5d55c62840f92069","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"66d910a4c1cdc79314fdeecf414e2b28527d1ff83191a1afce484b5d2c75e082","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"7bd1d50838e19b47cdf378b8925153d89d66cc9294a84162e79b48d94ca59d83","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"2cbe0621042e2a68c7cbce5dfed3906a1862a16a7d496010636cdbdb91341c0f","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"bb45cd435da536500f1d9692a9b49d0c570b763ccbf00473248b777f5c1f353b","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"83e63d6ccf8ec004a3bb6d58b9bb0104f60e002754b1e968024b320730cc5311","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d2bc7425ef40526650d6db7e072c1ff4a51101c3ac2cc4b666623b19496a6e27","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"f27524f4bef4b6519c604bdb23bf4465bddcccbf3f003abb901acbd0d7404d99","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"dba28a419aec76ed864ef43e5f577a5c99a010c32e5949fe4e17a4d57c58dd11","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c959a391a75be9789b43c8468f71e3fa06488b4d691d5729dde1416dcd38225b","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"0dba70b3fb0dcd713fda33c2df64fa6751fff6460e536971cee917260fb17882","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"9f663c2f91127ef7024e8ca4b3b4383ff2770e5f826696005de382282794b127","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1},{"version":"041597c12abeaa2ef07766775955fc87cfc65c43e0fe86c836071bea787e967c","impliedFormat":1},{"version":"0838507efff4f479c6f603ec812810ddfe14ab32abf8f4a8def140be970fe439","impliedFormat":1},{"version":"072f583571d6e3d30cd9760ee3485d29484fb7b54ba772ac135c747a380096a1","impliedFormat":1},{"version":"7212c2d58855b8df35275180e97903a4b6093d4fbaefea863d8d028da63938c6","impliedFormat":1},{"version":"d8a6b3f899917210f00ddf13b564a2a4fdcf1e50c5a22e8d3abcfd4f1c4f9ae1","impliedFormat":1},{"version":"fd5eab954b31e761a72234031dadc3aab768763942a9637e380aed441cc94f59","impliedFormat":1},{"version":"c7aaac3119acf27e03190cc4224f1d81c7498cf6b36fa72d10d99f2c41d1bbc0","impliedFormat":1},{"version":"dd9faff42b456b5f03b85d8fbd64838eb92f6f7b03b36322cbc59c005b7033d3","impliedFormat":1},{"version":"6ff702721d87c0ba8e7f8950e7b0a3b009dfd912fab3997e0b63fab8d83919c3","impliedFormat":1},{"version":"9dce9fc12e9a79d1135699d525aa6b44b71a45e32e3fa0cf331060b980b16317","impliedFormat":1},{"version":"586b2fd8a7d582329658aaceec22f8a5399e05013deb49bcfde28f95f093c8ee","impliedFormat":1},{"version":"59c44b081724d4ab8039988aba34ee6b3bd41c30fc2d8686f4ed06588397b2f7","impliedFormat":1},{"version":"ef1f3eadd7bed282de45bafd7c2c00105cf1db93e22f6cd763bec8a9c2cf6df1","impliedFormat":1},{"version":"2b90463c902dbe4f5bbb9eae084c05de37477c17a5de1e342eb7cbc9410dc6a1","impliedFormat":1},{"version":"7a1dd1e9c8bf5e23129495b10718b280340c7500570e0cfe5cffcdee51e13e48","impliedFormat":1},{"version":"70eb87bf376ae18494fb327896dc04d556a65c41340a2f5b35d6e10cc7075afa","signature":"bd6640feffbb44ade7ce92bd1353f4ca41107af7bc1a05b290e1344854e60fcf"},{"version":"78c612ac6dd0b1ca0e84909ce3d1911b7d80770dfa8aa34958d2d649055b8f3c","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"546f00a65afbab43856de4ce377a216b46eb4a0561b92c1c1c045bc61664a14d","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"c9df1727c08e547a6868f4926623ed20ab46fe8d6785a1de752ea2893e521a48","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"3103fa8e4fc36db909e5d60d457c852ecffbfda0a59844fcaf5f4ad154259733","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"ff9e3afda6d0a0c4194f07192f026e04916ec75da062daf75507774e06554ec6","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"afc239b67160dbb808d7dbd7bb29ad575b5fbf1b89b95622a7eaef332f07c8c4","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"3b0142c0b79b03f4d0b2e585b1f1885313e6a736a70e8fde352acf2554220ca4","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"dcb32fa9db22b6581af2a8ea72302a7d9282bd09138069d875d88dc874abf506","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"a96d1dcfe2725b2438877eefe2be8e310aa56c387f6ba974f3e222e6a5f67254","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"9ad8981ef9c1e9c275f6a6e703761243664f43921d71ed6c5fb89ca50b0cc5bf","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"785b9d575b49124ce01b46f5b9402157c7611e6532effa562ac6aebec0074dfc","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","impliedFormat":1},{"version":"29f72ec1289ae3aeda78bf14b38086d3d803262ac13904b400422941a26a3636","affectsGlobalScope":true,"impliedFormat":1}],"root":[[58,72],[75,83],[203,213]],"options":{"allowJs":false,"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"declarationMap":true,"downlevelIteration":true,"esModuleInterop":true,"experimentalDecorators":true,"module":1,"noImplicitAny":true,"outDir":"./","rootDir":"../..","skipLibCheck":true,"sourceMap":true,"strictNullChecks":true,"target":9},"referencedMap":[[214,1],[202,1],[215,1],[216,1],[217,1],[134,2],[135,2],[136,3],[89,4],[137,5],[138,6],[139,7],[84,1],[87,8],[85,1],[86,1],[140,9],[141,10],[142,11],[143,12],[144,13],[145,14],[146,14],[147,15],[148,16],[149,17],[150,18],[90,1],[88,1],[151,19],[152,20],[153,21],[187,22],[154,23],[155,1],[156,24],[157,25],[158,26],[159,27],[160,28],[161,29],[162,30],[163,31],[164,32],[165,32],[166,33],[167,1],[168,34],[169,35],[171,36],[170,37],[172,38],[173,39],[174,40],[175,41],[176,42],[177,43],[178,44],[179,45],[180,46],[181,47],[182,48],[183,49],[184,50],[91,1],[92,1],[93,1],[131,51],[132,1],[133,1],[185,52],[186,53],[199,54],[200,55],[198,56],[201,57],[195,58],[196,59],[197,60],[191,58],[192,58],[194,61],[193,58],[188,62],[190,63],[189,1],[74,64],[73,1],[56,1],[57,1],[11,1],[10,1],[2,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[18,1],[19,1],[3,1],[20,1],[21,1],[4,1],[22,1],[26,1],[23,1],[24,1],[25,1],[27,1],[28,1],[29,1],[5,1],[30,1],[31,1],[32,1],[33,1],[6,1],[37,1],[34,1],[35,1],[36,1],[38,1],[7,1],[39,1],[44,1],[45,1],[40,1],[41,1],[42,1],[43,1],[8,1],[49,1],[46,1],[47,1],[48,1],[50,1],[9,1],[51,1],[52,1],[53,1],[55,1],[54,1],[1,1],[109,65],[119,66],[108,65],[129,67],[100,68],[99,69],[128,70],[122,71],[127,72],[102,73],[116,74],[101,75],[125,76],[97,77],[96,70],[126,78],[98,79],[103,80],[104,1],[107,80],[94,1],[130,81],[120,82],[111,83],[112,84],[114,85],[110,86],[113,87],[123,70],[105,88],[106,89],[115,90],[95,91],[118,82],[117,80],[121,1],[124,92],[61,93],[62,1],[65,94],[77,95],[58,1],[70,96],[68,97],[67,98],[66,99],[79,100],[64,101],[59,1],[75,102],[60,103],[69,104],[72,105],[78,106],[76,107],[71,101],[80,108],[63,109],[81,110],[82,111],[83,112],[204,113],[205,114],[206,115],[207,116],[208,117],[209,118],[210,119],[211,119],[212,120],[213,121],[203,1]],"latestChangedDtsFile":"./test/TreeRegexpTest.d.ts","version":"5.9.3"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Argument.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Argument.d.ts new file mode 100644 index 00000000..a18f65d2 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Argument.d.ts @@ -0,0 +1,16 @@ +import Group from './Group.js'; +import ParameterType from './ParameterType.js'; +export default class Argument { + readonly group: Group; + readonly parameterType: ParameterType; + static build(group: Group, parameterTypes: readonly ParameterType[]): readonly Argument[]; + constructor(group: Group, parameterType: ParameterType); + /** + * Get the value returned by the parameter type's transformer function. + * + * @param thisObj the object in which the transformer function is applied. + */ + getValue(thisObj: unknown): T | null; + getParameterType(): ParameterType; +} +//# sourceMappingURL=Argument.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Argument.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Argument.d.ts.map new file mode 100644 index 00000000..a7280d54 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Argument.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"Argument.d.ts","sourceRoot":"","sources":["../../../src/Argument.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,YAAY,CAAA;AAC9B,OAAO,aAAa,MAAM,oBAAoB,CAAA;AAE9C,MAAM,CAAC,OAAO,OAAO,QAAQ;aAqBT,KAAK,EAAE,KAAK;aACZ,aAAa,EAAE,aAAa,CAAC,OAAO,CAAC;WArBzC,KAAK,CACjB,KAAK,EAAE,KAAK,EACZ,cAAc,EAAE,SAAS,aAAa,CAAC,OAAO,CAAC,EAAE,GAChD,SAAS,QAAQ,EAAE;gBAiBJ,KAAK,EAAE,KAAK,EACZ,aAAa,EAAE,aAAa,CAAC,OAAO,CAAC;IAMvD;;;;OAIG;IACI,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,GAAG,IAAI;IAKvC,gBAAgB;CAGxB"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Argument.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Argument.js new file mode 100644 index 00000000..f7a2ea08 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Argument.js @@ -0,0 +1,31 @@ +import CucumberExpressionError from './CucumberExpressionError.js'; +export default class Argument { + group; + parameterType; + static build(group, parameterTypes) { + const argGroups = group.children || []; + if (argGroups.length !== parameterTypes.length) { + throw new CucumberExpressionError(`Group has ${argGroups.length} capture groups (${argGroups.map((g) => g.value)}), but there were ${parameterTypes.length} parameter types (${parameterTypes.map((p) => p.name)})`); + } + return parameterTypes.map((parameterType, i) => new Argument(argGroups[i], parameterType)); + } + constructor(group, parameterType) { + this.group = group; + this.parameterType = parameterType; + this.group = group; + this.parameterType = parameterType; + } + /** + * Get the value returned by the parameter type's transformer function. + * + * @param thisObj the object in which the transformer function is applied. + */ + getValue(thisObj) { + const groupValues = this.group ? this.group.values : null; + return this.parameterType.transform(thisObj, groupValues); + } + getParameterType() { + return this.parameterType; + } +} +//# sourceMappingURL=Argument.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Argument.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Argument.js.map new file mode 100644 index 00000000..90459a65 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Argument.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Argument.js","sourceRoot":"","sources":["../../../src/Argument.ts"],"names":[],"mappings":"AAAA,OAAO,uBAAuB,MAAM,8BAA8B,CAAA;AAIlE,MAAM,CAAC,OAAO,OAAO,QAAQ;IAqBT;IACA;IArBX,MAAM,CAAC,KAAK,CACjB,KAAY,EACZ,cAAiD;QAEjD,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAA;QAEtC,IAAI,SAAS,CAAC,MAAM,KAAK,cAAc,CAAC,MAAM,EAAE,CAAC;YAC/C,MAAM,IAAI,uBAAuB,CAC/B,aAAa,SAAS,CAAC,MAAM,oBAAoB,SAAS,CAAC,GAAG,CAC5D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CACf,qBAAqB,cAAc,CAAC,MAAM,qBAAqB,cAAc,CAAC,GAAG,CAChF,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CACd,GAAG,CACL,CAAA;QACH,CAAC;QAED,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAA;IAC5F,CAAC;IAED,YACkB,KAAY,EACZ,aAAqC;QADrC,UAAK,GAAL,KAAK,CAAO;QACZ,kBAAa,GAAb,aAAa,CAAwB;QAErD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;IACpC,CAAC;IAED;;;;OAIG;IACI,QAAQ,CAAI,OAAgB;QACjC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;QACzD,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IAC3D,CAAC;IAEM,gBAAgB;QACrB,OAAO,IAAI,CAAC,aAAa,CAAA;IAC3B,CAAC;CACF"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Ast.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Ast.d.ts new file mode 100644 index 00000000..ced45a69 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Ast.d.ts @@ -0,0 +1,45 @@ +export declare function symbolOf(token: TokenType): string; +export declare function purposeOf(token: TokenType): string; +export interface Located { + readonly start: number; + readonly end: number; +} +export declare class Node implements Located { + readonly type: NodeType; + readonly nodes: readonly Node[] | undefined; + private readonly token; + readonly start: number; + readonly end: number; + constructor(type: NodeType, nodes: readonly Node[] | undefined, token: string | undefined, start: number, end: number); + text(): string; +} +export declare enum NodeType { + text = "TEXT_NODE", + optional = "OPTIONAL_NODE", + alternation = "ALTERNATION_NODE", + alternative = "ALTERNATIVE_NODE", + parameter = "PARAMETER_NODE", + expression = "EXPRESSION_NODE" +} +export declare class Token implements Located { + readonly type: TokenType; + readonly text: string; + readonly start: number; + readonly end: number; + constructor(type: TokenType, text: string, start: number, end: number); + static isEscapeCharacter(codePoint: string): boolean; + static canEscape(codePoint: string): boolean; + static typeOf(codePoint: string): TokenType; +} +export declare enum TokenType { + startOfLine = "START_OF_LINE", + endOfLine = "END_OF_LINE", + whiteSpace = "WHITE_SPACE", + beginOptional = "BEGIN_OPTIONAL", + endOptional = "END_OPTIONAL", + beginParameter = "BEGIN_PARAMETER", + endParameter = "END_PARAMETER", + alternation = "ALTERNATION", + text = "TEXT" +} +//# sourceMappingURL=Ast.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Ast.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Ast.d.ts.map new file mode 100644 index 00000000..5f18d7a9 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Ast.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"Ast.d.ts","sourceRoot":"","sources":["../../../src/Ast.ts"],"names":[],"mappings":"AAOA,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAcjD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAYlD;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACrB;AAED,qBAAa,IAAK,YAAW,OAAO;aAEhB,IAAI,EAAE,QAAQ;aACd,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,SAAS;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK;aACN,KAAK,EAAE,MAAM;aACb,GAAG,EAAE,MAAM;gBAJX,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,SAAS,EACjC,KAAK,EAAE,MAAM,GAAG,SAAS,EAC1B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM;IAO7B,IAAI,IAAI,MAAM;CAMf;AAED,oBAAY,QAAQ;IAClB,IAAI,cAAc;IAClB,QAAQ,kBAAkB;IAC1B,WAAW,qBAAqB;IAChC,WAAW,qBAAqB;IAChC,SAAS,mBAAmB;IAC5B,UAAU,oBAAoB;CAC/B;AAED,qBAAa,KAAM,YAAW,OAAO;IACnC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;gBAER,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAOrE,MAAM,CAAC,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIpD,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAsB5C,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS;CAmB5C;AAED,oBAAY,SAAS;IACnB,WAAW,kBAAkB;IAC7B,SAAS,gBAAgB;IACzB,UAAU,gBAAgB;IAC1B,aAAa,mBAAmB;IAChC,WAAW,iBAAiB;IAC5B,cAAc,oBAAoB;IAClC,YAAY,kBAAkB;IAC9B,WAAW,gBAAgB;IAC3B,IAAI,SAAS;CACd"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Ast.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Ast.js new file mode 100644 index 00000000..b08cf699 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Ast.js @@ -0,0 +1,134 @@ +const escapeCharacter = '\\'; +const alternationCharacter = '/'; +const beginParameterCharacter = '{'; +const endParameterCharacter = '}'; +const beginOptionalCharacter = '('; +const endOptionalCharacter = ')'; +export function symbolOf(token) { + switch (token) { + case TokenType.beginOptional: + return beginOptionalCharacter; + case TokenType.endOptional: + return endOptionalCharacter; + case TokenType.beginParameter: + return beginParameterCharacter; + case TokenType.endParameter: + return endParameterCharacter; + case TokenType.alternation: + return alternationCharacter; + } + return ''; +} +export function purposeOf(token) { + switch (token) { + case TokenType.beginOptional: + case TokenType.endOptional: + return 'optional text'; + case TokenType.beginParameter: + case TokenType.endParameter: + return 'a parameter'; + case TokenType.alternation: + return 'alternation'; + } + return ''; +} +export class Node { + type; + nodes; + token; + start; + end; + constructor(type, nodes, token, start, end) { + this.type = type; + this.nodes = nodes; + this.token = token; + this.start = start; + this.end = end; + if (nodes === undefined && token === undefined) { + throw new Error('Either nodes or token must be defined'); + } + } + text() { + if (this.nodes && this.nodes.length > 0) { + return this.nodes.map((value) => value.text()).join(''); + } + return this.token || ''; + } +} +export var NodeType; +(function (NodeType) { + NodeType["text"] = "TEXT_NODE"; + NodeType["optional"] = "OPTIONAL_NODE"; + NodeType["alternation"] = "ALTERNATION_NODE"; + NodeType["alternative"] = "ALTERNATIVE_NODE"; + NodeType["parameter"] = "PARAMETER_NODE"; + NodeType["expression"] = "EXPRESSION_NODE"; +})(NodeType || (NodeType = {})); +export class Token { + type; + text; + start; + end; + constructor(type, text, start, end) { + this.type = type; + this.text = text; + this.start = start; + this.end = end; + } + static isEscapeCharacter(codePoint) { + return codePoint == escapeCharacter; + } + static canEscape(codePoint) { + if (codePoint == ' ') { + // TODO: Unicode whitespace? + return true; + } + switch (codePoint) { + case escapeCharacter: + return true; + case alternationCharacter: + return true; + case beginParameterCharacter: + return true; + case endParameterCharacter: + return true; + case beginOptionalCharacter: + return true; + case endOptionalCharacter: + return true; + } + return false; + } + static typeOf(codePoint) { + if (codePoint == ' ') { + // TODO: Unicode whitespace? + return TokenType.whiteSpace; + } + switch (codePoint) { + case alternationCharacter: + return TokenType.alternation; + case beginParameterCharacter: + return TokenType.beginParameter; + case endParameterCharacter: + return TokenType.endParameter; + case beginOptionalCharacter: + return TokenType.beginOptional; + case endOptionalCharacter: + return TokenType.endOptional; + } + return TokenType.text; + } +} +export var TokenType; +(function (TokenType) { + TokenType["startOfLine"] = "START_OF_LINE"; + TokenType["endOfLine"] = "END_OF_LINE"; + TokenType["whiteSpace"] = "WHITE_SPACE"; + TokenType["beginOptional"] = "BEGIN_OPTIONAL"; + TokenType["endOptional"] = "END_OPTIONAL"; + TokenType["beginParameter"] = "BEGIN_PARAMETER"; + TokenType["endParameter"] = "END_PARAMETER"; + TokenType["alternation"] = "ALTERNATION"; + TokenType["text"] = "TEXT"; +})(TokenType || (TokenType = {})); +//# sourceMappingURL=Ast.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Ast.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Ast.js.map new file mode 100644 index 00000000..686943d2 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Ast.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Ast.js","sourceRoot":"","sources":["../../../src/Ast.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAAG,IAAI,CAAA;AAC5B,MAAM,oBAAoB,GAAG,GAAG,CAAA;AAChC,MAAM,uBAAuB,GAAG,GAAG,CAAA;AACnC,MAAM,qBAAqB,GAAG,GAAG,CAAA;AACjC,MAAM,sBAAsB,GAAG,GAAG,CAAA;AAClC,MAAM,oBAAoB,GAAG,GAAG,CAAA;AAEhC,MAAM,UAAU,QAAQ,CAAC,KAAgB;IACvC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,SAAS,CAAC,aAAa;YAC1B,OAAO,sBAAsB,CAAA;QAC/B,KAAK,SAAS,CAAC,WAAW;YACxB,OAAO,oBAAoB,CAAA;QAC7B,KAAK,SAAS,CAAC,cAAc;YAC3B,OAAO,uBAAuB,CAAA;QAChC,KAAK,SAAS,CAAC,YAAY;YACzB,OAAO,qBAAqB,CAAA;QAC9B,KAAK,SAAS,CAAC,WAAW;YACxB,OAAO,oBAAoB,CAAA;IAC/B,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAgB;IACxC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,SAAS,CAAC,aAAa,CAAC;QAC7B,KAAK,SAAS,CAAC,WAAW;YACxB,OAAO,eAAe,CAAA;QACxB,KAAK,SAAS,CAAC,cAAc,CAAC;QAC9B,KAAK,SAAS,CAAC,YAAY;YACzB,OAAO,aAAa,CAAA;QACtB,KAAK,SAAS,CAAC,WAAW;YACxB,OAAO,aAAa,CAAA;IACxB,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC;AAOD,MAAM,OAAO,IAAI;IAEG;IACA;IACC;IACD;IACA;IALlB,YACkB,IAAc,EACd,KAAkC,EACjC,KAAyB,EAC1B,KAAa,EACb,GAAW;QAJX,SAAI,GAAJ,IAAI,CAAU;QACd,UAAK,GAAL,KAAK,CAA6B;QACjC,UAAK,GAAL,KAAK,CAAoB;QAC1B,UAAK,GAAL,KAAK,CAAQ;QACb,QAAG,GAAH,GAAG,CAAQ;QAE3B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;QAC1D,CAAC;IACH,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACzD,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,IAAI,EAAE,CAAA;IACzB,CAAC;CACF;AAED,MAAM,CAAN,IAAY,QAOX;AAPD,WAAY,QAAQ;IAClB,8BAAkB,CAAA;IAClB,sCAA0B,CAAA;IAC1B,4CAAgC,CAAA;IAChC,4CAAgC,CAAA;IAChC,wCAA4B,CAAA;IAC5B,0CAA8B,CAAA;AAChC,CAAC,EAPW,QAAQ,KAAR,QAAQ,QAOnB;AAED,MAAM,OAAO,KAAK;IACP,IAAI,CAAW;IACf,IAAI,CAAQ;IACZ,KAAK,CAAQ;IACb,GAAG,CAAQ;IAEpB,YAAY,IAAe,EAAE,IAAY,EAAE,KAAa,EAAE,GAAW;QACnE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;IAChB,CAAC;IAED,MAAM,CAAC,iBAAiB,CAAC,SAAiB;QACxC,OAAO,SAAS,IAAI,eAAe,CAAA;IACrC,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,SAAiB;QAChC,IAAI,SAAS,IAAI,GAAG,EAAE,CAAC;YACrB,4BAA4B;YAC5B,OAAO,IAAI,CAAA;QACb,CAAC;QACD,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,eAAe;gBAClB,OAAO,IAAI,CAAA;YACb,KAAK,oBAAoB;gBACvB,OAAO,IAAI,CAAA;YACb,KAAK,uBAAuB;gBAC1B,OAAO,IAAI,CAAA;YACb,KAAK,qBAAqB;gBACxB,OAAO,IAAI,CAAA;YACb,KAAK,sBAAsB;gBACzB,OAAO,IAAI,CAAA;YACb,KAAK,oBAAoB;gBACvB,OAAO,IAAI,CAAA;QACf,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,SAAiB;QAC7B,IAAI,SAAS,IAAI,GAAG,EAAE,CAAC;YACrB,4BAA4B;YAC5B,OAAO,SAAS,CAAC,UAAU,CAAA;QAC7B,CAAC;QACD,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,oBAAoB;gBACvB,OAAO,SAAS,CAAC,WAAW,CAAA;YAC9B,KAAK,uBAAuB;gBAC1B,OAAO,SAAS,CAAC,cAAc,CAAA;YACjC,KAAK,qBAAqB;gBACxB,OAAO,SAAS,CAAC,YAAY,CAAA;YAC/B,KAAK,sBAAsB;gBACzB,OAAO,SAAS,CAAC,aAAa,CAAA;YAChC,KAAK,oBAAoB;gBACvB,OAAO,SAAS,CAAC,WAAW,CAAA;QAChC,CAAC;QACD,OAAO,SAAS,CAAC,IAAI,CAAA;IACvB,CAAC;CACF;AAED,MAAM,CAAN,IAAY,SAUX;AAVD,WAAY,SAAS;IACnB,0CAA6B,CAAA;IAC7B,sCAAyB,CAAA;IACzB,uCAA0B,CAAA;IAC1B,6CAAgC,CAAA;IAChC,yCAA4B,CAAA;IAC5B,+CAAkC,CAAA;IAClC,2CAA8B,CAAA;IAC9B,wCAA2B,CAAA;IAC3B,0BAAa,CAAA;AACf,CAAC,EAVW,SAAS,KAAT,SAAS,QAUpB"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CombinatorialGeneratedExpressionFactory.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CombinatorialGeneratedExpressionFactory.d.ts new file mode 100644 index 00000000..249f995f --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CombinatorialGeneratedExpressionFactory.d.ts @@ -0,0 +1,10 @@ +import GeneratedExpression from './GeneratedExpression.js'; +import ParameterType from './ParameterType.js'; +export default class CombinatorialGeneratedExpressionFactory { + private readonly expressionTemplate; + private readonly parameterTypeCombinations; + constructor(expressionTemplate: string, parameterTypeCombinations: Array>>); + generateExpressions(): readonly GeneratedExpression[]; + private generatePermutations; +} +//# sourceMappingURL=CombinatorialGeneratedExpressionFactory.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CombinatorialGeneratedExpressionFactory.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CombinatorialGeneratedExpressionFactory.d.ts.map new file mode 100644 index 00000000..85ea904c --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CombinatorialGeneratedExpressionFactory.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"CombinatorialGeneratedExpressionFactory.d.ts","sourceRoot":"","sources":["../../../src/CombinatorialGeneratedExpressionFactory.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,MAAM,0BAA0B,CAAA;AAC1D,OAAO,aAAa,MAAM,oBAAoB,CAAA;AAK9C,MAAM,CAAC,OAAO,OAAO,uCAAuC;IAExD,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,yBAAyB;gBADzB,kBAAkB,EAAE,MAAM,EAC1B,yBAAyB,EAAE,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IAK3E,mBAAmB,IAAI,SAAS,mBAAmB,EAAE;IAM5D,OAAO,CAAC,oBAAoB;CA4B7B"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CombinatorialGeneratedExpressionFactory.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CombinatorialGeneratedExpressionFactory.js new file mode 100644 index 00000000..20dfbee2 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CombinatorialGeneratedExpressionFactory.js @@ -0,0 +1,37 @@ +import GeneratedExpression from './GeneratedExpression.js'; +// 256 generated expressions ought to be enough for anybody +const MAX_EXPRESSIONS = 256; +export default class CombinatorialGeneratedExpressionFactory { + expressionTemplate; + parameterTypeCombinations; + constructor(expressionTemplate, parameterTypeCombinations) { + this.expressionTemplate = expressionTemplate; + this.parameterTypeCombinations = parameterTypeCombinations; + this.expressionTemplate = expressionTemplate; + } + generateExpressions() { + const generatedExpressions = []; + this.generatePermutations(generatedExpressions, 0, []); + return generatedExpressions; + } + generatePermutations(generatedExpressions, depth, currentParameterTypes) { + if (generatedExpressions.length >= MAX_EXPRESSIONS) { + return; + } + if (depth === this.parameterTypeCombinations.length) { + generatedExpressions.push(new GeneratedExpression(this.expressionTemplate, currentParameterTypes)); + return; + } + // tslint:disable-next-line:prefer-for-of + for (let i = 0; i < this.parameterTypeCombinations[depth].length; ++i) { + // Avoid recursion if no elements can be added. + if (generatedExpressions.length >= MAX_EXPRESSIONS) { + return; + } + const newCurrentParameterTypes = currentParameterTypes.slice(); // clone + newCurrentParameterTypes.push(this.parameterTypeCombinations[depth][i]); + this.generatePermutations(generatedExpressions, depth + 1, newCurrentParameterTypes); + } + } +} +//# sourceMappingURL=CombinatorialGeneratedExpressionFactory.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CombinatorialGeneratedExpressionFactory.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CombinatorialGeneratedExpressionFactory.js.map new file mode 100644 index 00000000..d8b28550 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CombinatorialGeneratedExpressionFactory.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CombinatorialGeneratedExpressionFactory.js","sourceRoot":"","sources":["../../../src/CombinatorialGeneratedExpressionFactory.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,MAAM,0BAA0B,CAAA;AAG1D,2DAA2D;AAC3D,MAAM,eAAe,GAAG,GAAG,CAAA;AAE3B,MAAM,CAAC,OAAO,OAAO,uCAAuC;IAEvC;IACA;IAFnB,YACmB,kBAA0B,EAC1B,yBAA+D;QAD/D,uBAAkB,GAAlB,kBAAkB,CAAQ;QAC1B,8BAAyB,GAAzB,yBAAyB,CAAsC;QAEhF,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAA;IAC9C,CAAC;IAEM,mBAAmB;QACxB,MAAM,oBAAoB,GAA0B,EAAE,CAAA;QACtD,IAAI,CAAC,oBAAoB,CAAC,oBAAoB,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QACtD,OAAO,oBAAoB,CAAA;IAC7B,CAAC;IAEO,oBAAoB,CAC1B,oBAA2C,EAC3C,KAAa,EACb,qBAAoD;QAEpD,IAAI,oBAAoB,CAAC,MAAM,IAAI,eAAe,EAAE,CAAC;YACnD,OAAM;QACR,CAAC;QAED,IAAI,KAAK,KAAK,IAAI,CAAC,yBAAyB,CAAC,MAAM,EAAE,CAAC;YACpD,oBAAoB,CAAC,IAAI,CACvB,IAAI,mBAAmB,CAAC,IAAI,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,CACxE,CAAA;YACD,OAAM;QACR,CAAC;QAED,yCAAyC;QACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YACtE,+CAA+C;YAC/C,IAAI,oBAAoB,CAAC,MAAM,IAAI,eAAe,EAAE,CAAC;gBACnD,OAAM;YACR,CAAC;YAED,MAAM,wBAAwB,GAAG,qBAAqB,CAAC,KAAK,EAAE,CAAA,CAAC,QAAQ;YACvE,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACvE,IAAI,CAAC,oBAAoB,CAAC,oBAAoB,EAAE,KAAK,GAAG,CAAC,EAAE,wBAAwB,CAAC,CAAA;QACtF,CAAC;IACH,CAAC;CACF"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpression.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpression.d.ts new file mode 100644 index 00000000..28ff23fa --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpression.d.ts @@ -0,0 +1,30 @@ +import Argument from './Argument.js'; +import { Node } from './Ast.js'; +import ParameterTypeRegistry from './ParameterTypeRegistry.js'; +import { Expression } from './types.js'; +export default class CucumberExpression implements Expression { + private readonly expression; + private readonly parameterTypeRegistry; + private readonly parameterTypes; + private readonly treeRegexp; + readonly ast: Node; + /** + * @param expression + * @param parameterTypeRegistry + */ + constructor(expression: string, parameterTypeRegistry: ParameterTypeRegistry); + private rewriteToRegex; + private static escapeRegex; + private rewriteOptional; + private rewriteAlternation; + private rewriteAlternative; + private rewriteParameter; + private rewriteExpression; + private assertNotEmpty; + private assertNoParameters; + private assertNoOptionals; + match(text: string): readonly Argument[] | null; + get regexp(): RegExp; + get source(): string; +} +//# sourceMappingURL=CucumberExpression.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpression.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpression.d.ts.map new file mode 100644 index 00000000..a3c229ec --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpression.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpression.d.ts","sourceRoot":"","sources":["../../../src/CucumberExpression.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAA;AACpC,OAAO,EAAE,IAAI,EAAY,MAAM,UAAU,CAAA;AAYzC,OAAO,qBAAqB,MAAM,4BAA4B,CAAA;AAE9D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAIvC,MAAM,CAAC,OAAO,OAAO,kBAAmB,YAAW,UAAU;IAUzD,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IAVxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAoC;IACnE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,SAAgB,GAAG,EAAE,IAAI,CAAA;IAEzB;;;OAGG;gBAEgB,UAAU,EAAE,MAAM,EAClB,qBAAqB,EAAE,qBAAqB;IAQ/D,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,MAAM,CAAC,WAAW;IAI1B,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,iBAAiB;IAUlB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,QAAQ,EAAE,GAAG,IAAI;IAQtD,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;CACF"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpression.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpression.js new file mode 100644 index 00000000..ad487016 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpression.js @@ -0,0 +1,117 @@ +import Argument from './Argument.js'; +import { NodeType } from './Ast.js'; +import CucumberExpressionParser from './CucumberExpressionParser.js'; +import { createAlternativeMayNotBeEmpty, createAlternativeMayNotExclusivelyContainOptionals, createOptionalIsNotAllowedInOptional, createOptionalMayNotBeEmpty, createParameterIsNotAllowedInOptional, createUndefinedParameterType, } from './Errors.js'; +import TreeRegexp from './TreeRegexp.js'; +const ESCAPE_PATTERN = () => /([\\^[({$.|?*+})\]])/g; +export default class CucumberExpression { + expression; + parameterTypeRegistry; + parameterTypes = []; + treeRegexp; + ast; + /** + * @param expression + * @param parameterTypeRegistry + */ + constructor(expression, parameterTypeRegistry) { + this.expression = expression; + this.parameterTypeRegistry = parameterTypeRegistry; + const parser = new CucumberExpressionParser(); + this.ast = parser.parse(expression); + const pattern = this.rewriteToRegex(this.ast); + this.treeRegexp = new TreeRegexp(pattern); + } + rewriteToRegex(node) { + switch (node.type) { + case NodeType.text: + return CucumberExpression.escapeRegex(node.text()); + case NodeType.optional: + return this.rewriteOptional(node); + case NodeType.alternation: + return this.rewriteAlternation(node); + case NodeType.alternative: + return this.rewriteAlternative(node); + case NodeType.parameter: + return this.rewriteParameter(node); + case NodeType.expression: + return this.rewriteExpression(node); + default: + // Can't happen as long as the switch case is exhaustive + throw new Error(node.type); + } + } + static escapeRegex(expression) { + return expression.replace(ESCAPE_PATTERN(), '\\$1'); + } + rewriteOptional(node) { + this.assertNoParameters(node, (astNode) => createParameterIsNotAllowedInOptional(astNode, this.expression)); + this.assertNoOptionals(node, (astNode) => createOptionalIsNotAllowedInOptional(astNode, this.expression)); + this.assertNotEmpty(node, (astNode) => createOptionalMayNotBeEmpty(astNode, this.expression)); + const regex = (node.nodes || []).map((node) => this.rewriteToRegex(node)).join(''); + return `(?:${regex})?`; + } + rewriteAlternation(node) { + // Make sure the alternative parts aren't empty and don't contain parameter types + for (const alternative of node.nodes || []) { + if (!alternative.nodes || alternative.nodes.length == 0) { + throw createAlternativeMayNotBeEmpty(alternative, this.expression); + } + this.assertNotEmpty(alternative, (astNode) => createAlternativeMayNotExclusivelyContainOptionals(astNode, this.expression)); + } + const regex = (node.nodes || []).map((node) => this.rewriteToRegex(node)).join('|'); + return `(?:${regex})`; + } + rewriteAlternative(node) { + return (node.nodes || []).map((lastNode) => this.rewriteToRegex(lastNode)).join(''); + } + rewriteParameter(node) { + const name = node.text(); + const parameterType = this.parameterTypeRegistry.lookupByTypeName(name); + if (!parameterType) { + throw createUndefinedParameterType(node, this.expression, name); + } + this.parameterTypes.push(parameterType); + const regexps = parameterType.regexpStrings; + if (regexps.length == 1) { + return `(${regexps[0]})`; + } + return `((?:${regexps.join(')|(?:')}))`; + } + rewriteExpression(node) { + const regex = (node.nodes || []).map((node) => this.rewriteToRegex(node)).join(''); + return `^${regex}$`; + } + assertNotEmpty(node, createNodeWasNotEmptyException) { + const textNodes = (node.nodes || []).filter((astNode) => NodeType.text == astNode.type); + if (textNodes.length == 0) { + throw createNodeWasNotEmptyException(node); + } + } + assertNoParameters(node, createNodeContainedAParameterError) { + const parameterNodes = (node.nodes || []).filter((astNode) => NodeType.parameter == astNode.type); + if (parameterNodes.length > 0) { + throw createNodeContainedAParameterError(parameterNodes[0]); + } + } + assertNoOptionals(node, createNodeContainedAnOptionalError) { + const parameterNodes = (node.nodes || []).filter((astNode) => NodeType.optional == astNode.type); + if (parameterNodes.length > 0) { + throw createNodeContainedAnOptionalError(parameterNodes[0]); + } + } + match(text) { + const group = this.treeRegexp.match(text); + if (!group) { + return null; + } + return Argument.build(group, this.parameterTypes); + } + get regexp() { + return this.treeRegexp.regexp; + } + get source() { + return this.expression; + } +} +//# sourceMappingURL=CucumberExpression.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpression.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpression.js.map new file mode 100644 index 00000000..4664f122 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpression.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpression.js","sourceRoot":"","sources":["../../../src/CucumberExpression.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionError.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionError.d.ts new file mode 100644 index 00000000..aab86932 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionError.d.ts @@ -0,0 +1,3 @@ +export default class CucumberExpressionError extends Error { +} +//# sourceMappingURL=CucumberExpressionError.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionError.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionError.d.ts.map new file mode 100644 index 00000000..94200c43 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionError.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionError.d.ts","sourceRoot":"","sources":["../../../src/CucumberExpressionError.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,uBAAwB,SAAQ,KAAK;CAAG"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionError.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionError.js new file mode 100644 index 00000000..d8c39c19 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionError.js @@ -0,0 +1,3 @@ +export default class CucumberExpressionError extends Error { +} +//# sourceMappingURL=CucumberExpressionError.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionError.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionError.js.map new file mode 100644 index 00000000..1a726d22 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionError.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionError.js","sourceRoot":"","sources":["../../../src/CucumberExpressionError.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,uBAAwB,SAAQ,KAAK;CAAG"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionGenerator.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionGenerator.d.ts new file mode 100644 index 00000000..980dce66 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionGenerator.d.ts @@ -0,0 +1,10 @@ +import GeneratedExpression from './GeneratedExpression.js'; +import ParameterType from './ParameterType.js'; +export default class CucumberExpressionGenerator { + private readonly parameterTypes; + constructor(parameterTypes: () => Iterable>); + generateExpressions(text: string): readonly GeneratedExpression[]; + private createParameterTypeMatchers; + private static createParameterTypeMatchers2; +} +//# sourceMappingURL=CucumberExpressionGenerator.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionGenerator.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionGenerator.d.ts.map new file mode 100644 index 00000000..9d2d10ff --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionGenerator.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionGenerator.d.ts","sourceRoot":"","sources":["../../../src/CucumberExpressionGenerator.ts"],"names":[],"mappings":"AACA,OAAO,mBAAmB,MAAM,0BAA0B,CAAA;AAC1D,OAAO,aAAa,MAAM,oBAAoB,CAAA;AAG9C,MAAM,CAAC,OAAO,OAAO,2BAA2B;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAAd,cAAc,EAAE,MAAM,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAE5E,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,mBAAmB,EAAE;IAgExE,OAAO,CAAC,2BAA2B;IAYnC,OAAO,CAAC,MAAM,CAAC,4BAA4B;CAQ5C"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionGenerator.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionGenerator.js new file mode 100644 index 00000000..aa92e376 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionGenerator.js @@ -0,0 +1,72 @@ +import CombinatorialGeneratedExpressionFactory from './CombinatorialGeneratedExpressionFactory.js'; +import ParameterType from './ParameterType.js'; +import ParameterTypeMatcher from './ParameterTypeMatcher.js'; +export default class CucumberExpressionGenerator { + parameterTypes; + constructor(parameterTypes) { + this.parameterTypes = parameterTypes; + } + generateExpressions(text) { + const parameterTypeCombinations = []; + const parameterTypeMatchers = this.createParameterTypeMatchers(text); + let expressionTemplate = ''; + let pos = 0; + let counter = 0; + while (true) { + let matchingParameterTypeMatchers = []; + for (const parameterTypeMatcher of parameterTypeMatchers) { + const advancedParameterTypeMatcher = parameterTypeMatcher.advanceTo(pos); + if (advancedParameterTypeMatcher.find) { + matchingParameterTypeMatchers.push(advancedParameterTypeMatcher); + } + } + if (matchingParameterTypeMatchers.length > 0) { + matchingParameterTypeMatchers = matchingParameterTypeMatchers.sort(ParameterTypeMatcher.compare); + // Find all the best parameter type matchers, they are all candidates. + const bestParameterTypeMatcher = matchingParameterTypeMatchers[0]; + const bestParameterTypeMatchers = matchingParameterTypeMatchers.filter((m) => ParameterTypeMatcher.compare(m, bestParameterTypeMatcher) === 0); + // Build a list of parameter types without duplicates. The reason there + // might be duplicates is that some parameter types have more than one regexp, + // which means multiple ParameterTypeMatcher objects will have a reference to the + // same ParameterType. + // We're sorting the list so preferential parameter types are listed first. + // Users are most likely to want these, so they should be listed at the top. + let parameterTypes = []; + for (const parameterTypeMatcher of bestParameterTypeMatchers) { + if (parameterTypes.indexOf(parameterTypeMatcher.parameterType) === -1) { + parameterTypes.push(parameterTypeMatcher.parameterType); + } + } + parameterTypes = parameterTypes.sort(ParameterType.compare); + parameterTypeCombinations.push(parameterTypes); + expressionTemplate += escape(text.slice(pos, bestParameterTypeMatcher.start)); + expressionTemplate += `{{${counter++}}}`; + pos = bestParameterTypeMatcher.start + bestParameterTypeMatcher.group.length; + } + else { + break; + } + if (pos >= text.length) { + break; + } + } + expressionTemplate += escape(text.slice(pos)); + return new CombinatorialGeneratedExpressionFactory(expressionTemplate, parameterTypeCombinations).generateExpressions(); + } + createParameterTypeMatchers(text) { + let parameterMatchers = []; + for (const parameterType of this.parameterTypes()) { + if (parameterType.useForSnippets) { + parameterMatchers = parameterMatchers.concat(CucumberExpressionGenerator.createParameterTypeMatchers2(parameterType, text)); + } + } + return parameterMatchers; + } + static createParameterTypeMatchers2(parameterType, text) { + return parameterType.regexpStrings.map((regexp) => new ParameterTypeMatcher(parameterType, regexp, text)); + } +} +function escape(s) { + return s.replace(/\(/g, '\\(').replace(/{/g, '\\{').replace(/\//g, '\\/'); +} +//# sourceMappingURL=CucumberExpressionGenerator.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionGenerator.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionGenerator.js.map new file mode 100644 index 00000000..f400d8d1 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionGenerator.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionGenerator.js","sourceRoot":"","sources":["../../../src/CucumberExpressionGenerator.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionParser.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionParser.d.ts new file mode 100644 index 00000000..07e3527b --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionParser.d.ts @@ -0,0 +1,5 @@ +import { Node } from './Ast.js'; +export default class CucumberExpressionParser { + parse(expression: string): Node; +} +//# sourceMappingURL=CucumberExpressionParser.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionParser.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionParser.d.ts.map new file mode 100644 index 00000000..dcdedb74 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionParser.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionParser.d.ts","sourceRoot":"","sources":["../../../src/CucumberExpressionParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAA8B,MAAM,UAAU,CAAA;AAmK3D,MAAM,CAAC,OAAO,OAAO,wBAAwB;IAC3C,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;CAMhC"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionParser.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionParser.js new file mode 100644 index 00000000..66808b03 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionParser.js @@ -0,0 +1,234 @@ +import { Node, NodeType, TokenType } from './Ast.js'; +import CucumberExpressionTokenizer from './CucumberExpressionTokenizer.js'; +import { createAlternationNotAllowedInOptional, createInvalidParameterTypeNameInNode, createMissingEndToken, } from './Errors.js'; +/* + * text := whitespace | ')' | '}' | . + */ +function parseText(expression, tokens, current) { + const token = tokens[current]; + switch (token.type) { + case TokenType.whiteSpace: + case TokenType.text: + case TokenType.endParameter: + case TokenType.endOptional: + return { + consumed: 1, + ast: [new Node(NodeType.text, undefined, token.text, token.start, token.end)], + }; + case TokenType.alternation: + throw createAlternationNotAllowedInOptional(expression, token); + case TokenType.startOfLine: + case TokenType.endOfLine: + case TokenType.beginOptional: + case TokenType.beginParameter: + default: + // If configured correctly this will never happen + return { consumed: 0, ast: [] }; + } +} +/* + * parameter := '{' + name* + '}' + */ +function parseName(expression, tokens, current) { + const token = tokens[current]; + switch (token.type) { + case TokenType.whiteSpace: + case TokenType.text: + return { + consumed: 1, + ast: [new Node(NodeType.text, undefined, token.text, token.start, token.end)], + }; + case TokenType.beginOptional: + case TokenType.endOptional: + case TokenType.beginParameter: + case TokenType.endParameter: + case TokenType.alternation: + throw createInvalidParameterTypeNameInNode(token, expression); + case TokenType.startOfLine: + case TokenType.endOfLine: + default: + // If configured correctly this will never happen + return { consumed: 0, ast: [] }; + } +} +/* + * parameter := '{' + text* + '}' + */ +const parseParameter = parseBetween(NodeType.parameter, TokenType.beginParameter, TokenType.endParameter, [parseName]); +/* + * optional := '(' + option* + ')' + * option := optional | parameter | text + */ +const optionalSubParsers = []; +const parseOptional = parseBetween(NodeType.optional, TokenType.beginOptional, TokenType.endOptional, optionalSubParsers); +optionalSubParsers.push(parseOptional, parseParameter, parseText); +/* + * alternation := alternative* + ( '/' + alternative* )+ + */ +function parseAlternativeSeparator(expression, tokens, current) { + if (!lookingAt(tokens, current, TokenType.alternation)) { + return { consumed: 0, ast: [] }; + } + const token = tokens[current]; + return { + consumed: 1, + ast: [new Node(NodeType.alternative, undefined, token.text, token.start, token.end)], + }; +} +const alternativeParsers = [ + parseAlternativeSeparator, + parseOptional, + parseParameter, + parseText, +]; +/* + * alternation := (?<=left-boundary) + alternative* + ( '/' + alternative* )+ + (?=right-boundary) + * left-boundary := whitespace | } | ^ + * right-boundary := whitespace | { | $ + * alternative: = optional | parameter | text + */ +const parseAlternation = (expression, tokens, current) => { + const previous = current - 1; + if (!lookingAtAny(tokens, previous, [ + TokenType.startOfLine, + TokenType.whiteSpace, + TokenType.endParameter, + ])) { + return { consumed: 0, ast: [] }; + } + const result = parseTokensUntil(expression, alternativeParsers, tokens, current, [ + TokenType.whiteSpace, + TokenType.endOfLine, + TokenType.beginParameter, + ]); + const subCurrent = current + result.consumed; + if (!result.ast.some((astNode) => astNode.type == NodeType.alternative)) { + return { consumed: 0, ast: [] }; + } + const start = tokens[current].start; + const end = tokens[subCurrent].start; + // Does not consume right hand boundary token + return { + consumed: result.consumed, + ast: [ + new Node(NodeType.alternation, splitAlternatives(start, end, result.ast), undefined, start, end), + ], + }; +}; +/* + * cucumber-expression := ( alternation | optional | parameter | text )* + */ +const parseCucumberExpression = parseBetween(NodeType.expression, TokenType.startOfLine, TokenType.endOfLine, [parseAlternation, parseOptional, parseParameter, parseText]); +export default class CucumberExpressionParser { + parse(expression) { + const tokenizer = new CucumberExpressionTokenizer(); + const tokens = tokenizer.tokenize(expression); + const result = parseCucumberExpression(expression, tokens, 0); + return result.ast[0]; + } +} +function parseBetween(type, beginToken, endToken, parsers) { + return (expression, tokens, current) => { + if (!lookingAt(tokens, current, beginToken)) { + return { consumed: 0, ast: [] }; + } + let subCurrent = current + 1; + const result = parseTokensUntil(expression, parsers, tokens, subCurrent, [ + endToken, + TokenType.endOfLine, + ]); + subCurrent += result.consumed; + // endToken not found + if (!lookingAt(tokens, subCurrent, endToken)) { + throw createMissingEndToken(expression, beginToken, endToken, tokens[current]); + } + // consumes endToken + const start = tokens[current].start; + const end = tokens[subCurrent].end; + const consumed = subCurrent + 1 - current; + const ast = [new Node(type, result.ast, undefined, start, end)]; + return { consumed, ast }; + }; +} +function parseToken(expression, parsers, tokens, startAt) { + for (let i = 0; i < parsers.length; i++) { + const parse = parsers[i]; + const result = parse(expression, tokens, startAt); + if (result.consumed != 0) { + return result; + } + } + // If configured correctly this will never happen + throw new Error('No eligible parsers for ' + tokens); +} +function parseTokensUntil(expression, parsers, tokens, startAt, endTokens) { + let current = startAt; + const size = tokens.length; + const ast = []; + while (current < size) { + if (lookingAtAny(tokens, current, endTokens)) { + break; + } + const result = parseToken(expression, parsers, tokens, current); + if (result.consumed == 0) { + // If configured correctly this will never happen + // Keep to avoid infinite loops + throw new Error('No eligible parsers for ' + tokens); + } + current += result.consumed; + ast.push(...result.ast); + } + return { consumed: current - startAt, ast }; +} +function lookingAtAny(tokens, at, tokenTypes) { + return tokenTypes.some((tokenType) => lookingAt(tokens, at, tokenType)); +} +function lookingAt(tokens, at, token) { + if (at < 0) { + // If configured correctly this will never happen + // Keep for completeness + return token == TokenType.startOfLine; + } + if (at >= tokens.length) { + return token == TokenType.endOfLine; + } + return tokens[at].type == token; +} +function splitAlternatives(start, end, alternation) { + const separators = []; + const alternatives = []; + let alternative = []; + alternation.forEach((n) => { + if (NodeType.alternative == n.type) { + separators.push(n); + alternatives.push(alternative); + alternative = []; + } + else { + alternative.push(n); + } + }); + alternatives.push(alternative); + return createAlternativeNodes(start, end, separators, alternatives); +} +function createAlternativeNodes(start, end, separators, alternatives) { + const nodes = []; + for (let i = 0; i < alternatives.length; i++) { + const n = alternatives[i]; + if (i == 0) { + const rightSeparator = separators[i]; + nodes.push(new Node(NodeType.alternative, n, undefined, start, rightSeparator.start)); + } + else if (i == alternatives.length - 1) { + const leftSeparator = separators[i - 1]; + nodes.push(new Node(NodeType.alternative, n, undefined, leftSeparator.end, end)); + } + else { + const leftSeparator = separators[i - 1]; + const rightSeparator = separators[i]; + nodes.push(new Node(NodeType.alternative, n, undefined, leftSeparator.end, rightSeparator.start)); + } + } + return nodes; +} +//# sourceMappingURL=CucumberExpressionParser.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionParser.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionParser.js.map new file mode 100644 index 00000000..fbce0c39 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionParser.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionParser.js","sourceRoot":"","sources":["../../../src/CucumberExpressionParser.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionTokenizer.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionTokenizer.d.ts new file mode 100644 index 00000000..f58b05de --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionTokenizer.d.ts @@ -0,0 +1,5 @@ +import { Token } from './Ast.js'; +export default class CucumberExpressionTokenizer { + tokenize(expression: string): readonly Token[]; +} +//# sourceMappingURL=CucumberExpressionTokenizer.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionTokenizer.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionTokenizer.d.ts.map new file mode 100644 index 00000000..7e76f67a --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionTokenizer.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionTokenizer.d.ts","sourceRoot":"","sources":["../../../src/CucumberExpressionTokenizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAa,MAAM,UAAU,CAAA;AAG3C,MAAM,CAAC,OAAO,OAAO,2BAA2B;IAC9C,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,KAAK,EAAE;CA4E/C"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionTokenizer.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionTokenizer.js new file mode 100644 index 00000000..de10a573 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionTokenizer.js @@ -0,0 +1,72 @@ +import { Token, TokenType } from './Ast.js'; +import { createCantEscaped, createTheEndOfLIneCanNotBeEscaped } from './Errors.js'; +export default class CucumberExpressionTokenizer { + tokenize(expression) { + const codePoints = Array.from(expression); + const tokens = []; + let buffer = []; + let previousTokenType = TokenType.startOfLine; + let treatAsText = false; + let escaped = 0; + let bufferStartIndex = 0; + function convertBufferToToken(tokenType) { + let escapeTokens = 0; + if (tokenType == TokenType.text) { + escapeTokens = escaped; + escaped = 0; + } + const consumedIndex = bufferStartIndex + buffer.length + escapeTokens; + const t = new Token(tokenType, buffer.join(''), bufferStartIndex, consumedIndex); + buffer = []; + bufferStartIndex = consumedIndex; + return t; + } + function tokenTypeOf(codePoint, treatAsText) { + if (!treatAsText) { + return Token.typeOf(codePoint); + } + if (Token.canEscape(codePoint)) { + return TokenType.text; + } + throw createCantEscaped(expression, bufferStartIndex + buffer.length + escaped); + } + function shouldCreateNewToken(previousTokenType, currentTokenType) { + if (currentTokenType != previousTokenType) { + return true; + } + return currentTokenType != TokenType.whiteSpace && currentTokenType != TokenType.text; + } + if (codePoints.length == 0) { + tokens.push(new Token(TokenType.startOfLine, '', 0, 0)); + } + codePoints.forEach((codePoint) => { + if (!treatAsText && Token.isEscapeCharacter(codePoint)) { + escaped++; + treatAsText = true; + return; + } + const currentTokenType = tokenTypeOf(codePoint, treatAsText); + treatAsText = false; + if (shouldCreateNewToken(previousTokenType, currentTokenType)) { + const token = convertBufferToToken(previousTokenType); + previousTokenType = currentTokenType; + buffer.push(codePoint); + tokens.push(token); + } + else { + previousTokenType = currentTokenType; + buffer.push(codePoint); + } + }); + if (buffer.length > 0) { + const token = convertBufferToToken(previousTokenType); + tokens.push(token); + } + if (treatAsText) { + throw createTheEndOfLIneCanNotBeEscaped(expression); + } + tokens.push(new Token(TokenType.endOfLine, '', codePoints.length, codePoints.length)); + return tokens; + } +} +//# sourceMappingURL=CucumberExpressionTokenizer.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionTokenizer.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionTokenizer.js.map new file mode 100644 index 00000000..6d0101d7 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/CucumberExpressionTokenizer.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionTokenizer.js","sourceRoot":"","sources":["../../../src/CucumberExpressionTokenizer.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Errors.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Errors.d.ts new file mode 100644 index 00000000..3ec2128d --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Errors.d.ts @@ -0,0 +1,25 @@ +import { Node, Token, TokenType } from './Ast.js'; +import CucumberExpressionError from './CucumberExpressionError.js'; +import GeneratedExpression from './GeneratedExpression.js'; +import ParameterType from './ParameterType.js'; +export declare function createAlternativeMayNotExclusivelyContainOptionals(node: Node, expression: string): CucumberExpressionError; +export declare function createAlternativeMayNotBeEmpty(node: Node, expression: string): CucumberExpressionError; +export declare function createOptionalMayNotBeEmpty(node: Node, expression: string): CucumberExpressionError; +export declare function createParameterIsNotAllowedInOptional(node: Node, expression: string): CucumberExpressionError; +export declare function createOptionalIsNotAllowedInOptional(node: Node, expression: string): CucumberExpressionError; +export declare function createTheEndOfLIneCanNotBeEscaped(expression: string): CucumberExpressionError; +export declare function createMissingEndToken(expression: string, beginToken: TokenType, endToken: TokenType, current: Token): CucumberExpressionError; +export declare function createAlternationNotAllowedInOptional(expression: string, current: Token): CucumberExpressionError; +export declare function createCantEscaped(expression: string, index: number): CucumberExpressionError; +export declare function createInvalidParameterTypeNameInNode(token: Token, expression: string): CucumberExpressionError; +export declare class AmbiguousParameterTypeError extends CucumberExpressionError { + static forRegExp(parameterTypeRegexp: string, expressionRegexp: RegExp, parameterTypes: readonly ParameterType[], generatedExpressions: readonly GeneratedExpression[]): AmbiguousParameterTypeError; + static _parameterTypeNames(parameterTypes: readonly ParameterType[]): string; + static _expressions(generatedExpressions: readonly GeneratedExpression[]): string; +} +export declare class UndefinedParameterTypeError extends CucumberExpressionError { + readonly undefinedParameterTypeName: string; + constructor(undefinedParameterTypeName: string, message: string); +} +export declare function createUndefinedParameterType(node: Node, expression: string, undefinedParameterTypeName: string): UndefinedParameterTypeError; +//# sourceMappingURL=Errors.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Errors.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Errors.d.ts.map new file mode 100644 index 00000000..3e9a8b30 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Errors.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"Errors.d.ts","sourceRoot":"","sources":["../../../src/Errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,IAAI,EAAuB,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAC/E,OAAO,uBAAuB,MAAM,8BAA8B,CAAA;AAClE,OAAO,mBAAmB,MAAM,0BAA0B,CAAA;AAC1D,OAAO,aAAa,MAAM,oBAAoB,CAAA;AAE9C,wBAAgB,kDAAkD,CAChE,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,GACjB,uBAAuB,CAUzB;AACD,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,GACjB,uBAAuB,CAUzB;AACD,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,GACjB,uBAAuB,CAUzB;AACD,wBAAgB,qCAAqC,CACnD,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,GACjB,uBAAuB,CAUzB;AAED,wBAAgB,oCAAoC,CAClD,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,GACjB,uBAAuB,CAUzB;AAED,wBAAgB,iCAAiC,CAAC,UAAU,EAAE,MAAM,GAAG,uBAAuB,CAW7F;AAED,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,SAAS,EACrB,QAAQ,EAAE,SAAS,EACnB,OAAO,EAAE,KAAK,2BAcf;AAED,wBAAgB,qCAAqC,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,2BAUvF;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,2BAUlE;AAED,wBAAgB,oCAAoC,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,2BAUpF;AAqCD,qBAAa,2BAA4B,SAAQ,uBAAuB;WACxD,SAAS,CACrB,mBAAmB,EAAE,MAAM,EAC3B,gBAAgB,EAAE,MAAM,EACxB,cAAc,EAAE,SAAS,aAAa,CAAC,OAAO,CAAC,EAAE,EACjD,oBAAoB,EAAE,SAAS,mBAAmB,EAAE;WAiBxC,mBAAmB,CAAC,cAAc,EAAE,SAAS,aAAa,CAAC,OAAO,CAAC,EAAE;WAIrE,YAAY,CAAC,oBAAoB,EAAE,SAAS,mBAAmB,EAAE;CAGhF;AAED,qBAAa,2BAA4B,SAAQ,uBAAuB;aAEpD,0BAA0B,EAAE,MAAM;gBAAlC,0BAA0B,EAAE,MAAM,EAClD,OAAO,EAAE,MAAM;CAIlB;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,0BAA0B,EAAE,MAAM,+BAYnC"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Errors.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Errors.js new file mode 100644 index 00000000..1925a2af --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Errors.js @@ -0,0 +1,94 @@ +import { purposeOf, symbolOf } from './Ast.js'; +import CucumberExpressionError from './CucumberExpressionError.js'; +export function createAlternativeMayNotExclusivelyContainOptionals(node, expression) { + return new CucumberExpressionError(message(node.start, expression, pointAtLocated(node), 'An alternative may not exclusively contain optionals', "If you did not mean to use an optional you can use '\\(' to escape the '('")); +} +export function createAlternativeMayNotBeEmpty(node, expression) { + return new CucumberExpressionError(message(node.start, expression, pointAtLocated(node), 'Alternative may not be empty', "If you did not mean to use an alternative you can use '\\/' to escape the '/'")); +} +export function createOptionalMayNotBeEmpty(node, expression) { + return new CucumberExpressionError(message(node.start, expression, pointAtLocated(node), 'An optional must contain some text', "If you did not mean to use an optional you can use '\\(' to escape the '('")); +} +export function createParameterIsNotAllowedInOptional(node, expression) { + return new CucumberExpressionError(message(node.start, expression, pointAtLocated(node), 'An optional may not contain a parameter type', "If you did not mean to use an parameter type you can use '\\{' to escape the '{'")); +} +export function createOptionalIsNotAllowedInOptional(node, expression) { + return new CucumberExpressionError(message(node.start, expression, pointAtLocated(node), 'An optional may not contain an other optional', "If you did not mean to use an optional type you can use '\\(' to escape the '('. For more complicated expressions consider using a regular expression instead.")); +} +export function createTheEndOfLIneCanNotBeEscaped(expression) { + const index = Array.from(expression).length - 1; + return new CucumberExpressionError(message(index, expression, pointAt(index), 'The end of line can not be escaped', "You can use '\\\\' to escape the '\\'")); +} +export function createMissingEndToken(expression, beginToken, endToken, current) { + const beginSymbol = symbolOf(beginToken); + const endSymbol = symbolOf(endToken); + const purpose = purposeOf(beginToken); + return new CucumberExpressionError(message(current.start, expression, pointAtLocated(current), `The '${beginSymbol}' does not have a matching '${endSymbol}'`, `If you did not intend to use ${purpose} you can use '\\${beginSymbol}' to escape the ${purpose}`)); +} +export function createAlternationNotAllowedInOptional(expression, current) { + return new CucumberExpressionError(message(current.start, expression, pointAtLocated(current), 'An alternation can not be used inside an optional', "If you did not mean to use an alternation you can use '\\/' to escape the '/'. Otherwise rephrase your expression or consider using a regular expression instead.")); +} +export function createCantEscaped(expression, index) { + return new CucumberExpressionError(message(index, expression, pointAt(index), "Only the characters '{', '}', '(', ')', '\\', '/' and whitespace can be escaped", "If you did mean to use an '\\' you can use '\\\\' to escape it")); +} +export function createInvalidParameterTypeNameInNode(token, expression) { + return new CucumberExpressionError(message(token.start, expression, pointAtLocated(token), "Parameter names may not contain '{', '}', '(', ')', '\\' or '/'", 'Did you mean to use a regular expression?')); +} +function message(index, expression, pointer, problem, solution) { + return `This Cucumber Expression has a problem at column ${index + 1}: + +${expression} +${pointer} +${problem}. +${solution}`; +} +function pointAt(index) { + const pointer = []; + for (let i = 0; i < index; i++) { + pointer.push(' '); + } + pointer.push('^'); + return pointer.join(''); +} +function pointAtLocated(node) { + const pointer = [pointAt(node.start)]; + if (node.start + 1 < node.end) { + for (let i = node.start + 1; i < node.end - 1; i++) { + pointer.push('-'); + } + pointer.push('^'); + } + return pointer.join(''); +} +export class AmbiguousParameterTypeError extends CucumberExpressionError { + static forRegExp(parameterTypeRegexp, expressionRegexp, parameterTypes, generatedExpressions) { + return new this(`Your Regular Expression ${expressionRegexp} +matches multiple parameter types with regexp ${parameterTypeRegexp}: + ${this._parameterTypeNames(parameterTypes)} + +I couldn't decide which one to use. You have two options: + +1) Use a Cucumber Expression instead of a Regular Expression. Try one of these: + ${this._expressions(generatedExpressions)} + +2) Make one of the parameter types preferential and continue to use a Regular Expression. +`); + } + static _parameterTypeNames(parameterTypes) { + return parameterTypes.map((p) => `{${p.name}}`).join('\n '); + } + static _expressions(generatedExpressions) { + return generatedExpressions.map((e) => e.source).join('\n '); + } +} +export class UndefinedParameterTypeError extends CucumberExpressionError { + undefinedParameterTypeName; + constructor(undefinedParameterTypeName, message) { + super(message); + this.undefinedParameterTypeName = undefinedParameterTypeName; + } +} +export function createUndefinedParameterType(node, expression, undefinedParameterTypeName) { + return new UndefinedParameterTypeError(undefinedParameterTypeName, message(node.start, expression, pointAtLocated(node), `Undefined parameter type '${undefinedParameterTypeName}'`, `Please register a ParameterType for '${undefinedParameterTypeName}'`)); +} +//# sourceMappingURL=Errors.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Errors.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Errors.js.map new file mode 100644 index 00000000..f642fa8f --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Errors.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Errors.js","sourceRoot":"","sources":["../../../src/Errors.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ExpressionFactory.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ExpressionFactory.d.ts new file mode 100644 index 00000000..ae75fd08 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ExpressionFactory.d.ts @@ -0,0 +1,8 @@ +import ParameterTypeRegistry from './ParameterTypeRegistry.js'; +import { Expression } from './types.js'; +export default class ExpressionFactory { + private readonly parameterTypeRegistry; + constructor(parameterTypeRegistry: ParameterTypeRegistry); + createExpression(expression: string | RegExp): Expression; +} +//# sourceMappingURL=ExpressionFactory.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ExpressionFactory.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ExpressionFactory.d.ts.map new file mode 100644 index 00000000..01f33472 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ExpressionFactory.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ExpressionFactory.d.ts","sourceRoot":"","sources":["../../../src/ExpressionFactory.ts"],"names":[],"mappings":"AACA,OAAO,qBAAqB,MAAM,4BAA4B,CAAA;AAE9D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvC,MAAM,CAAC,OAAO,OAAO,iBAAiB;IACjB,OAAO,CAAC,QAAQ,CAAC,qBAAqB;gBAArB,qBAAqB,EAAE,qBAAqB;IAEzE,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU;CAKjE"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ExpressionFactory.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ExpressionFactory.js new file mode 100644 index 00000000..aa27cf07 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ExpressionFactory.js @@ -0,0 +1,14 @@ +import CucumberExpression from './CucumberExpression.js'; +import RegularExpression from './RegularExpression.js'; +export default class ExpressionFactory { + parameterTypeRegistry; + constructor(parameterTypeRegistry) { + this.parameterTypeRegistry = parameterTypeRegistry; + } + createExpression(expression) { + return typeof expression === 'string' + ? new CucumberExpression(expression, this.parameterTypeRegistry) + : new RegularExpression(expression, this.parameterTypeRegistry); + } +} +//# sourceMappingURL=ExpressionFactory.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ExpressionFactory.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ExpressionFactory.js.map new file mode 100644 index 00000000..9f72c88c --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ExpressionFactory.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ExpressionFactory.js","sourceRoot":"","sources":["../../../src/ExpressionFactory.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,MAAM,yBAAyB,CAAA;AAExD,OAAO,iBAAiB,MAAM,wBAAwB,CAAA;AAGtD,MAAM,CAAC,OAAO,OAAO,iBAAiB;IACA;IAApC,YAAoC,qBAA4C;QAA5C,0BAAqB,GAArB,qBAAqB,CAAuB;IAAG,CAAC;IAE7E,gBAAgB,CAAC,UAA2B;QACjD,OAAO,OAAO,UAAU,KAAK,QAAQ;YACnC,CAAC,CAAC,IAAI,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,qBAAqB,CAAC;YAChE,CAAC,CAAC,IAAI,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAA;IACnE,CAAC;CACF"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/GeneratedExpression.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/GeneratedExpression.d.ts new file mode 100644 index 00000000..da55600b --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/GeneratedExpression.d.ts @@ -0,0 +1,19 @@ +import ParameterType from './ParameterType.js'; +import { ParameterInfo } from './types.js'; +export default class GeneratedExpression { + private readonly expressionTemplate; + readonly parameterTypes: readonly ParameterType[]; + constructor(expressionTemplate: string, parameterTypes: readonly ParameterType[]); + get source(): string; + /** + * Returns an array of parameter names to use in generated function/method signatures + * + * @returns {ReadonlyArray.} + */ + get parameterNames(): readonly string[]; + /** + * Returns an array of ParameterInfo to use in generated function/method signatures + */ + get parameterInfos(): readonly ParameterInfo[]; +} +//# sourceMappingURL=GeneratedExpression.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/GeneratedExpression.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/GeneratedExpression.d.ts.map new file mode 100644 index 00000000..4fdd5888 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/GeneratedExpression.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"GeneratedExpression.d.ts","sourceRoot":"","sources":["../../../src/GeneratedExpression.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE1C,MAAM,CAAC,OAAO,OAAO,mBAAmB;IAEpC,OAAO,CAAC,QAAQ,CAAC,kBAAkB;aACnB,cAAc,EAAE,SAAS,aAAa,CAAC,OAAO,CAAC,EAAE;gBADhD,kBAAkB,EAAE,MAAM,EAC3B,cAAc,EAAE,SAAS,aAAa,CAAC,OAAO,CAAC,EAAE;IAGnE,IAAI,MAAM,WAET;IAED;;;;OAIG;IACH,IAAI,cAAc,IAAI,SAAS,MAAM,EAAE,CAEtC;IAED;;OAEG;IACH,IAAI,cAAc,IAAI,SAAS,aAAa,EAAE,CAG7C;CACF"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/GeneratedExpression.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/GeneratedExpression.js new file mode 100644 index 00000000..2c541dc5 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/GeneratedExpression.js @@ -0,0 +1,56 @@ +export default class GeneratedExpression { + expressionTemplate; + parameterTypes; + constructor(expressionTemplate, parameterTypes) { + this.expressionTemplate = expressionTemplate; + this.parameterTypes = parameterTypes; + } + get source() { + return format(this.expressionTemplate, ...this.parameterTypes.map((t) => t.name || '')); + } + /** + * Returns an array of parameter names to use in generated function/method signatures + * + * @returns {ReadonlyArray.} + */ + get parameterNames() { + return this.parameterInfos.map((i) => `${i.name}${i.count === 1 ? '' : i.count.toString()}`); + } + /** + * Returns an array of ParameterInfo to use in generated function/method signatures + */ + get parameterInfos() { + const usageByTypeName = {}; + return this.parameterTypes.map((t) => getParameterInfo(t, usageByTypeName)); + } +} +function getParameterInfo(parameterType, usageByName) { + const name = parameterType.name || ''; + let counter = usageByName[name]; + counter = counter ? counter + 1 : 1; + usageByName[name] = counter; + let type; + if (parameterType.type) { + if (typeof parameterType.type === 'string') { + type = parameterType.type; + } + else if ('name' in parameterType.type) { + type = parameterType.type.name; + } + else { + type = null; + } + } + else { + type = null; + } + return { + type, + name, + count: counter, + }; +} +function format(pattern, ...args) { + return pattern.replace(/{(\d+)}/g, (match, number) => args[number]); +} +//# sourceMappingURL=GeneratedExpression.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/GeneratedExpression.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/GeneratedExpression.js.map new file mode 100644 index 00000000..f30b5763 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/GeneratedExpression.js.map @@ -0,0 +1 @@ +{"version":3,"file":"GeneratedExpression.js","sourceRoot":"","sources":["../../../src/GeneratedExpression.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,OAAO,OAAO,mBAAmB;IAEnB;IACD;IAFlB,YACmB,kBAA0B,EAC3B,cAAiD;QADhD,uBAAkB,GAAlB,kBAAkB,CAAQ;QAC3B,mBAAc,GAAd,cAAc,CAAmC;IAChE,CAAC;IAEJ,IAAI,MAAM;QACR,OAAO,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAA;IACzF,CAAC;IAED;;;;OAIG;IACH,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;IAC9F,CAAC;IAED;;OAEG;IACH,IAAI,cAAc;QAChB,MAAM,eAAe,GAA8B,EAAE,CAAA;QACrD,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAA;IAC7E,CAAC;CACF;AAED,SAAS,gBAAgB,CACvB,aAAqC,EACrC,WAAsC;IAEtC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,IAAI,EAAE,CAAA;IACrC,IAAI,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;IAC/B,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACnC,WAAW,CAAC,IAAI,CAAC,GAAG,OAAO,CAAA;IAC3B,IAAI,IAAmB,CAAA;IACvB,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC;QACvB,IAAI,OAAO,aAAa,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3C,IAAI,GAAG,aAAa,CAAC,IAAI,CAAA;QAC3B,CAAC;aAAM,IAAI,MAAM,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC;YACxC,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAA;QAChC,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,IAAI,CAAA;QACb,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,IAAI,CAAA;IACb,CAAC;IACD,OAAO;QACL,IAAI;QACJ,IAAI;QACJ,KAAK,EAAE,OAAO;KACf,CAAA;AACH,CAAC;AAED,SAAS,MAAM,CAAC,OAAe,EAAE,GAAG,IAAuB;IACzD,OAAO,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;AACrE,CAAC"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Group.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Group.d.ts new file mode 100644 index 00000000..f4f4bbfc --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Group.d.ts @@ -0,0 +1,20 @@ +export default class Group { + readonly value: string; + readonly start: number | undefined; + readonly end: number | undefined; + /** + * A groups children. + * + * There are either one or more children or the attribute is undefined. + */ + readonly children: readonly Group[] | undefined; + constructor(value: string, start: number | undefined, end: number | undefined, + /** + * A groups children. + * + * There are either one or more children or the attribute is undefined. + */ + children: readonly Group[] | undefined); + get values(): string[] | null; +} +//# sourceMappingURL=Group.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Group.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Group.d.ts.map new file mode 100644 index 00000000..e735b88e --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Group.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"Group.d.ts","sourceRoot":"","sources":["../../../src/Group.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,KAAK;aAEN,KAAK,EAAE,MAAM;aACb,KAAK,EAAE,MAAM,GAAG,SAAS;aACzB,GAAG,EAAE,MAAM,GAAG,SAAS;IACvC;;;;OAIG;aACa,QAAQ,EAAE,SAAS,KAAK,EAAE,GAAG,SAAS;gBARtC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,GAAG,EAAE,MAAM,GAAG,SAAS;IACvC;;;;OAIG;IACa,QAAQ,EAAE,SAAS,KAAK,EAAE,GAAG,SAAS;IAGxD,IAAI,MAAM,IAAI,MAAM,EAAE,GAAG,IAAI,CAE5B;CACF"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Group.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Group.js new file mode 100644 index 00000000..fe8ca0e8 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Group.js @@ -0,0 +1,22 @@ +export default class Group { + value; + start; + end; + children; + constructor(value, start, end, + /** + * A groups children. + * + * There are either one or more children or the attribute is undefined. + */ + children) { + this.value = value; + this.start = start; + this.end = end; + this.children = children; + } + get values() { + return (this.children === undefined ? [this] : this.children).map((g) => g.value); + } +} +//# sourceMappingURL=Group.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Group.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Group.js.map new file mode 100644 index 00000000..eb6b23f9 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/Group.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Group.js","sourceRoot":"","sources":["../../../src/Group.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,KAAK;IAEN;IACA;IACA;IAMA;IATlB,YACkB,KAAa,EACb,KAAyB,EACzB,GAAuB;IACvC;;;;OAIG;IACa,QAAsC;QARtC,UAAK,GAAL,KAAK,CAAQ;QACb,UAAK,GAAL,KAAK,CAAoB;QACzB,QAAG,GAAH,GAAG,CAAoB;QAMvB,aAAQ,GAAR,QAAQ,CAA8B;IACrD,CAAC;IAEJ,IAAI,MAAM;QACR,OAAO,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IACnF,CAAC;CACF"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/GroupBuilder.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/GroupBuilder.d.ts new file mode 100644 index 00000000..d929deb1 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/GroupBuilder.d.ts @@ -0,0 +1,13 @@ +import { RegExpExecArray } from 'regexp-match-indices'; +import Group from './Group.js'; +export default class GroupBuilder { + source: string; + capturing: boolean; + private readonly groupBuilders; + add(groupBuilder: GroupBuilder): void; + build(match: RegExpExecArray, nextGroupIndex: () => number): Group; + setNonCapturing(): void; + get children(): GroupBuilder[]; + moveChildrenTo(groupBuilder: GroupBuilder): void; +} +//# sourceMappingURL=GroupBuilder.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/GroupBuilder.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/GroupBuilder.d.ts.map new file mode 100644 index 00000000..2fd69d03 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/GroupBuilder.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"GroupBuilder.d.ts","sourceRoot":"","sources":["../../../src/GroupBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD,OAAO,KAAK,MAAM,YAAY,CAAA;AAE9B,MAAM,CAAC,OAAO,OAAO,YAAY;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,UAAO;IACvB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IAE5C,GAAG,CAAC,YAAY,EAAE,YAAY;IAI9B,KAAK,CAAC,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,GAAG,KAAK;IAUlE,eAAe;IAItB,IAAI,QAAQ,mBAEX;IAEM,cAAc,CAAC,YAAY,EAAE,YAAY;CAGjD"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/GroupBuilder.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/GroupBuilder.js new file mode 100644 index 00000000..99e450c5 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/GroupBuilder.js @@ -0,0 +1,28 @@ +import Group from './Group.js'; +export default class GroupBuilder { + source; + capturing = true; + groupBuilders = []; + add(groupBuilder) { + this.groupBuilders.push(groupBuilder); + } + build(match, nextGroupIndex) { + const groupIndex = nextGroupIndex(); + const children = this.groupBuilders.map((gb) => gb.build(match, nextGroupIndex)); + const value = match[groupIndex]; + const index = match.indices[groupIndex]; + const start = index ? index[0] : undefined; + const end = index ? index[1] : undefined; + return new Group(value, start, end, children.length === 0 ? undefined : children); + } + setNonCapturing() { + this.capturing = false; + } + get children() { + return this.groupBuilders; + } + moveChildrenTo(groupBuilder) { + this.groupBuilders.forEach((child) => groupBuilder.add(child)); + } +} +//# sourceMappingURL=GroupBuilder.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/GroupBuilder.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/GroupBuilder.js.map new file mode 100644 index 00000000..a476bcc7 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/GroupBuilder.js.map @@ -0,0 +1 @@ +{"version":3,"file":"GroupBuilder.js","sourceRoot":"","sources":["../../../src/GroupBuilder.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,YAAY,CAAA;AAE9B,MAAM,CAAC,OAAO,OAAO,YAAY;IACxB,MAAM,CAAQ;IACd,SAAS,GAAG,IAAI,CAAA;IACN,aAAa,GAAmB,EAAE,CAAA;IAE5C,GAAG,CAAC,YAA0B;QACnC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACvC,CAAC;IAEM,KAAK,CAAC,KAAsB,EAAE,cAA4B;QAC/D,MAAM,UAAU,GAAG,cAAc,EAAE,CAAA;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAA;QAChF,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,CAAA;QAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QACvC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAC1C,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACxC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;IACnF,CAAC;IAEM,eAAe;QACpB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;IACxB,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,aAAa,CAAA;IAC3B,CAAC;IAEM,cAAc,CAAC,YAA0B;QAC9C,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;IAChE,CAAC;CACF"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterType.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterType.d.ts new file mode 100644 index 00000000..e11660f1 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterType.d.ts @@ -0,0 +1,32 @@ +interface Constructor { + new (...args: unknown[]): T; + prototype: T; +} +type Factory = (...args: unknown[]) => T; +export type RegExps = StringOrRegExp | readonly StringOrRegExp[]; +export type StringOrRegExp = string | RegExp; +export default class ParameterType { + readonly name: string | undefined; + readonly type: Constructor | Factory | null; + readonly useForSnippets?: boolean | undefined; + readonly preferForRegexpMatch?: boolean | undefined; + readonly builtin?: boolean | undefined; + private transformFn; + static compare(pt1: ParameterType, pt2: ParameterType): number; + static checkParameterTypeName(typeName: string): void; + static isValidParameterTypeName(typeName: string): boolean; + regexpStrings: readonly string[]; + /** + * @param name {String} the name of the type + * @param regexps {Array.,RegExp,String} that matche the type + * @param type {Function} the prototype (constructor) of the type. May be null. + * @param transform {Function} function transforming string to another type. May be null. + * @param useForSnippets {boolean} true if this should be used for snippets. Defaults to true. + * @param preferForRegexpMatch {boolean} true if this is a preferential type. Defaults to false. + * @param builtin whether or not this is a built-in type + */ + constructor(name: string | undefined, regexps: RegExps, type: Constructor | Factory | null, transform?: (...match: string[]) => T | PromiseLike, useForSnippets?: boolean | undefined, preferForRegexpMatch?: boolean | undefined, builtin?: boolean | undefined); + transform(thisObj: unknown, groupValues: string[] | null): any; +} +export {}; +//# sourceMappingURL=ParameterType.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterType.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterType.d.ts.map new file mode 100644 index 00000000..131dba66 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterType.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ParameterType.d.ts","sourceRoot":"","sources":["../../../src/ParameterType.ts"],"names":[],"mappings":"AAKA,UAAU,WAAW,CAAC,CAAC;IACrB,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAA;IAC3B,SAAS,EAAE,CAAC,CAAA;CACb;AAED,KAAK,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;AAE3C,MAAM,MAAM,OAAO,GAAG,cAAc,GAAG,SAAS,cAAc,EAAE,CAAA;AAEhE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,CAAA;AAE5C,MAAM,CAAC,OAAO,OAAO,aAAa,CAAC,CAAC;aAsChB,IAAI,EAAE,MAAM,GAAG,SAAS;aAExB,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;aAExC,cAAc,CAAC,EAAE,OAAO;aACxB,oBAAoB,CAAC,EAAE,OAAO;aAC9B,OAAO,CAAC,EAAE,OAAO;IA3CnC,OAAO,CAAC,WAAW,CAAqD;WAE1D,OAAO,CAAC,GAAG,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,OAAO,CAAC;WAUhE,sBAAsB,CAAC,QAAQ,EAAE,MAAM;WAQvC,wBAAwB,CAAC,QAAQ,EAAE,MAAM;IAKhD,aAAa,EAAE,SAAS,MAAM,EAAE,CAAA;IAEvC;;;;;;;;OAQG;gBAEe,IAAI,EAAE,MAAM,GAAG,SAAS,EACxC,OAAO,EAAE,OAAO,EACA,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,EACxD,SAAS,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,EACtC,cAAc,CAAC,EAAE,OAAO,YAAA,EACxB,oBAAoB,CAAC,EAAE,OAAO,YAAA,EAC9B,OAAO,CAAC,EAAE,OAAO,YAAA;IAoB5B,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI;CAGhE"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterType.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterType.js new file mode 100644 index 00000000..421e83fd --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterType.js @@ -0,0 +1,95 @@ +import CucumberExpressionError from './CucumberExpressionError.js'; +const ILLEGAL_PARAMETER_NAME_PATTERN = /([[\]()$.|?*+])/; +const UNESCAPE_PATTERN = () => /(\\([[$.|?*+\]]))/g; +export default class ParameterType { + name; + type; + useForSnippets; + preferForRegexpMatch; + builtin; + transformFn; + static compare(pt1, pt2) { + if (pt1.preferForRegexpMatch && !pt2.preferForRegexpMatch) { + return -1; + } + if (pt2.preferForRegexpMatch && !pt1.preferForRegexpMatch) { + return 1; + } + return (pt1.name || '').localeCompare(pt2.name || ''); + } + static checkParameterTypeName(typeName) { + if (!this.isValidParameterTypeName(typeName)) { + throw new CucumberExpressionError(`Illegal character in parameter name {${typeName}}. Parameter names may not contain '{', '}', '(', ')', '\\' or '/'`); + } + } + static isValidParameterTypeName(typeName) { + const unescapedTypeName = typeName.replace(UNESCAPE_PATTERN(), '$2'); + return !unescapedTypeName.match(ILLEGAL_PARAMETER_NAME_PATTERN); + } + regexpStrings; + /** + * @param name {String} the name of the type + * @param regexps {Array.,RegExp,String} that matche the type + * @param type {Function} the prototype (constructor) of the type. May be null. + * @param transform {Function} function transforming string to another type. May be null. + * @param useForSnippets {boolean} true if this should be used for snippets. Defaults to true. + * @param preferForRegexpMatch {boolean} true if this is a preferential type. Defaults to false. + * @param builtin whether or not this is a built-in type + */ + constructor(name, regexps, type, transform, useForSnippets, preferForRegexpMatch, builtin) { + this.name = name; + this.type = type; + this.useForSnippets = useForSnippets; + this.preferForRegexpMatch = preferForRegexpMatch; + this.builtin = builtin; + if (transform === undefined) { + transform = (s) => s; + } + if (useForSnippets === undefined) { + this.useForSnippets = true; + } + if (preferForRegexpMatch === undefined) { + this.preferForRegexpMatch = false; + } + if (name) { + ParameterType.checkParameterTypeName(name); + } + this.regexpStrings = stringArray(regexps); + this.transformFn = transform; + } + transform(thisObj, groupValues) { + return this.transformFn.apply(thisObj, groupValues); + } +} +function stringArray(regexps) { + const array = Array.isArray(regexps) ? regexps : [regexps]; + return array.map((r) => (r instanceof RegExp ? regexpSource(r) : r)); +} +function regexpSource(regexp) { + const flags = regexpFlags(regexp); + for (const flag of ['g', 'i', 'm', 'y']) { + if (flags.indexOf(flag) !== -1) { + throw new CucumberExpressionError(`ParameterType Regexps can't use flag '${flag}'`); + } + } + return regexp.source; +} +// Backport RegExp.flags for Node 4.x +// https://github.com/nodejs/node/issues/8390 +function regexpFlags(regexp) { + let flags = regexp.flags; + if (flags === undefined) { + flags = ''; + if (regexp.ignoreCase) { + flags += 'i'; + } + if (regexp.global) { + flags += 'g'; + } + if (regexp.multiline) { + flags += 'm'; + } + } + return flags; +} +//# sourceMappingURL=ParameterType.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterType.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterType.js.map new file mode 100644 index 00000000..bb377636 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterType.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ParameterType.js","sourceRoot":"","sources":["../../../src/ParameterType.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeMatcher.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeMatcher.d.ts new file mode 100644 index 00000000..67de4fca --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeMatcher.d.ts @@ -0,0 +1,18 @@ +import ParameterType from './ParameterType.js'; +export default class ParameterTypeMatcher { + readonly parameterType: ParameterType; + private readonly regexpString; + private readonly text; + private matchPosition; + private readonly match; + constructor(parameterType: ParameterType, regexpString: string, text: string, matchPosition?: number); + advanceTo(newMatchPosition: number): ParameterTypeMatcher; + get find(): boolean | RegExpMatchArray | null; + get start(): number; + get fullWord(): true | RegExpMatchArray | null; + get matchStartWord(): true | RegExpMatchArray | null; + get matchEndWord(): true | RegExpMatchArray | null; + get group(): string; + static compare(a: ParameterTypeMatcher, b: ParameterTypeMatcher): number; +} +//# sourceMappingURL=ParameterTypeMatcher.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeMatcher.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeMatcher.d.ts.map new file mode 100644 index 00000000..6801207f --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeMatcher.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ParameterTypeMatcher.d.ts","sourceRoot":"","sources":["../../../src/ParameterTypeMatcher.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,oBAAoB,CAAA;AAE9C,MAAM,CAAC,OAAO,OAAO,oBAAoB;aAIrB,aAAa,EAAE,aAAa,CAAC,OAAO,CAAC;IACrD,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,aAAa;IANvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwB;gBAG5B,aAAa,EAAE,aAAa,CAAC,OAAO,CAAC,EACpC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACrB,aAAa,GAAE,MAAU;IAM5B,SAAS,CAAC,gBAAgB,EAAE,MAAM;IAsBzC,IAAI,IAAI,sCAEP;IAED,IAAI,KAAK,WAGR;IAED,IAAI,QAAQ,mCAEX;IAED,IAAI,cAAc,mCAEjB;IAED,IAAI,YAAY,mCAMf;IAED,IAAI,KAAK,WAGR;WAEa,OAAO,CAAC,CAAC,EAAE,oBAAoB,EAAE,CAAC,EAAE,oBAAoB;CAWvE"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeMatcher.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeMatcher.js new file mode 100644 index 00000000..5698d993 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeMatcher.js @@ -0,0 +1,60 @@ +export default class ParameterTypeMatcher { + parameterType; + regexpString; + text; + matchPosition; + match; + constructor(parameterType, regexpString, text, matchPosition = 0) { + this.parameterType = parameterType; + this.regexpString = regexpString; + this.text = text; + this.matchPosition = matchPosition; + const captureGroupRegexp = new RegExp(`(${regexpString})`); + this.match = captureGroupRegexp.exec(text.slice(this.matchPosition)); + } + advanceTo(newMatchPosition) { + for (let advancedPos = newMatchPosition; advancedPos < this.text.length; advancedPos++) { + const matcher = new ParameterTypeMatcher(this.parameterType, this.regexpString, this.text, advancedPos); + if (matcher.find) { + return matcher; + } + } + return new ParameterTypeMatcher(this.parameterType, this.regexpString, this.text, this.text.length); + } + get find() { + return this.match && this.group !== '' && this.fullWord; + } + get start() { + if (!this.match) + throw new Error('No match'); + return this.matchPosition + this.match.index; + } + get fullWord() { + return this.matchStartWord && this.matchEndWord; + } + get matchStartWord() { + return this.start === 0 || this.text[this.start - 1].match(/\p{Z}|\p{P}|\p{S}/u); + } + get matchEndWord() { + const nextCharacterIndex = this.start + this.group.length; + return (nextCharacterIndex === this.text.length || + this.text[nextCharacterIndex].match(/\p{Z}|\p{P}|\p{S}/u)); + } + get group() { + if (!this.match) + throw new Error('No match'); + return this.match[0]; + } + static compare(a, b) { + const posComparison = a.start - b.start; + if (posComparison !== 0) { + return posComparison; + } + const lengthComparison = b.group.length - a.group.length; + if (lengthComparison !== 0) { + return lengthComparison; + } + return 0; + } +} +//# sourceMappingURL=ParameterTypeMatcher.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeMatcher.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeMatcher.js.map new file mode 100644 index 00000000..9621543d --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeMatcher.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ParameterTypeMatcher.js","sourceRoot":"","sources":["../../../src/ParameterTypeMatcher.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeRegistry.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeRegistry.d.ts new file mode 100644 index 00000000..e0d4a6c2 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeRegistry.d.ts @@ -0,0 +1,12 @@ +import ParameterType from './ParameterType.js'; +import { DefinesParameterType } from './types.js'; +export default class ParameterTypeRegistry implements DefinesParameterType { + private readonly parameterTypeByName; + private readonly parameterTypesByRegexp; + constructor(); + get parameterTypes(): IterableIterator>; + lookupByTypeName(typeName: string): ParameterType | undefined; + lookupByRegexp(parameterTypeRegexp: string, expressionRegexp: RegExp, text: string): ParameterType | undefined; + defineParameterType(parameterType: ParameterType): void; +} +//# sourceMappingURL=ParameterTypeRegistry.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeRegistry.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeRegistry.d.ts.map new file mode 100644 index 00000000..2d43a6d3 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeRegistry.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ParameterTypeRegistry.d.ts","sourceRoot":"","sources":["../../../src/ParameterTypeRegistry.ts"],"names":[],"mappings":"AAIA,OAAO,aAAa,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAEjD,MAAM,CAAC,OAAO,OAAO,qBAAsB,YAAW,oBAAoB;IACxE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA4C;IAChF,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAmD;;IAM1F,IAAI,cAAc,IAAI,gBAAgB,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAE7D;IAEM,gBAAgB,CAAC,QAAQ,EAAE,MAAM;IAIjC,cAAc,CACnB,mBAAmB,EAAE,MAAM,EAC3B,gBAAgB,EAAE,MAAM,EACxB,IAAI,EAAE,MAAM,GACX,aAAa,CAAC,OAAO,CAAC,GAAG,SAAS;IAsB9B,mBAAmB,CAAC,aAAa,EAAE,aAAa,CAAC,OAAO,CAAC;CAwCjE"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeRegistry.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeRegistry.js new file mode 100644 index 00000000..4720c4e4 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeRegistry.js @@ -0,0 +1,64 @@ +import CucumberExpressionError from './CucumberExpressionError.js'; +import CucumberExpressionGenerator from './CucumberExpressionGenerator.js'; +import defineDefaultParameterTypes from './defineDefaultParameterTypes.js'; +import { AmbiguousParameterTypeError } from './Errors.js'; +import ParameterType from './ParameterType.js'; +export default class ParameterTypeRegistry { + parameterTypeByName = new Map(); + parameterTypesByRegexp = new Map(); + constructor() { + defineDefaultParameterTypes(this); + } + get parameterTypes() { + return this.parameterTypeByName.values(); + } + lookupByTypeName(typeName) { + return this.parameterTypeByName.get(typeName); + } + lookupByRegexp(parameterTypeRegexp, expressionRegexp, text) { + const parameterTypes = this.parameterTypesByRegexp.get(parameterTypeRegexp); + if (!parameterTypes) { + return undefined; + } + if (parameterTypes.length > 1 && !parameterTypes[0].preferForRegexpMatch) { + // We don't do this check on insertion because we only want to restrict + // ambiguity when we look up by Regexp. Users of CucumberExpression should + // not be restricted. + const generatedExpressions = new CucumberExpressionGenerator(() => this.parameterTypes).generateExpressions(text); + throw AmbiguousParameterTypeError.forRegExp(parameterTypeRegexp, expressionRegexp, parameterTypes, generatedExpressions); + } + return parameterTypes[0]; + } + defineParameterType(parameterType) { + if (parameterType.name !== undefined) { + if (this.parameterTypeByName.has(parameterType.name)) { + if (parameterType.name.length === 0) { + throw new CucumberExpressionError(`The anonymous parameter type has already been defined`); + } + else { + throw new CucumberExpressionError(`There is already a parameter type with name ${parameterType.name}`); + } + } + this.parameterTypeByName.set(parameterType.name, parameterType); + } + for (const parameterTypeRegexp of parameterType.regexpStrings) { + if (!this.parameterTypesByRegexp.has(parameterTypeRegexp)) { + this.parameterTypesByRegexp.set(parameterTypeRegexp, []); + } + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const parameterTypes = this.parameterTypesByRegexp.get(parameterTypeRegexp); + const existingParameterType = parameterTypes[0]; + if (parameterTypes.length > 0 && + existingParameterType.preferForRegexpMatch && + parameterType.preferForRegexpMatch) { + throw new CucumberExpressionError('There can only be one preferential parameter type per regexp. ' + + `The regexp /${parameterTypeRegexp}/ is used for two preferential parameter types, {${existingParameterType.name}} and {${parameterType.name}}`); + } + if (parameterTypes.indexOf(parameterType) === -1) { + parameterTypes.push(parameterType); + this.parameterTypesByRegexp.set(parameterTypeRegexp, parameterTypes.sort(ParameterType.compare)); + } + } + } +} +//# sourceMappingURL=ParameterTypeRegistry.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeRegistry.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeRegistry.js.map new file mode 100644 index 00000000..9f0056d3 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/ParameterTypeRegistry.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ParameterTypeRegistry.js","sourceRoot":"","sources":["../../../src/ParameterTypeRegistry.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/RegularExpression.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/RegularExpression.d.ts new file mode 100644 index 00000000..84ced213 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/RegularExpression.d.ts @@ -0,0 +1,12 @@ +import Argument from './Argument.js'; +import ParameterTypeRegistry from './ParameterTypeRegistry.js'; +import { Expression } from './types.js'; +export default class RegularExpression implements Expression { + readonly regexp: RegExp; + private readonly parameterTypeRegistry; + private readonly treeRegexp; + constructor(regexp: RegExp, parameterTypeRegistry: ParameterTypeRegistry); + match(text: string): readonly Argument[] | null; + get source(): string; +} +//# sourceMappingURL=RegularExpression.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/RegularExpression.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/RegularExpression.d.ts.map new file mode 100644 index 00000000..8d317137 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/RegularExpression.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"RegularExpression.d.ts","sourceRoot":"","sources":["../../../src/RegularExpression.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAA;AAEpC,OAAO,qBAAqB,MAAM,4BAA4B,CAAA;AAE9D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvC,MAAM,CAAC,OAAO,OAAO,iBAAkB,YAAW,UAAU;aAIxC,MAAM,EAAE,MAAM;IAC9B,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IAJxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;gBAGrB,MAAM,EAAE,MAAM,EACb,qBAAqB,EAAE,qBAAqB;IAKxD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,QAAQ,EAAE,GAAG,IAAI;IA8BtD,IAAI,MAAM,IAAI,MAAM,CAEnB;CACF"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/RegularExpression.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/RegularExpression.js new file mode 100644 index 00000000..c9dd53f4 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/RegularExpression.js @@ -0,0 +1,30 @@ +import Argument from './Argument.js'; +import ParameterType from './ParameterType.js'; +import TreeRegexp from './TreeRegexp.js'; +export default class RegularExpression { + regexp; + parameterTypeRegistry; + treeRegexp; + constructor(regexp, parameterTypeRegistry) { + this.regexp = regexp; + this.parameterTypeRegistry = parameterTypeRegistry; + this.treeRegexp = new TreeRegexp(regexp); + } + match(text) { + const group = this.treeRegexp.match(text); + if (!group) { + return null; + } + const parameterTypes = this.treeRegexp.groupBuilder.children.map((groupBuilder) => { + const parameterTypeRegexp = groupBuilder.source; + const parameterType = this.parameterTypeRegistry.lookupByRegexp(parameterTypeRegexp, this.regexp, text); + return (parameterType || + new ParameterType(undefined, parameterTypeRegexp, String, (s) => (s === undefined ? null : s), false, false)); + }); + return Argument.build(group, parameterTypes); + } + get source() { + return this.regexp.source; + } +} +//# sourceMappingURL=RegularExpression.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/RegularExpression.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/RegularExpression.js.map new file mode 100644 index 00000000..79358318 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/RegularExpression.js.map @@ -0,0 +1 @@ +{"version":3,"file":"RegularExpression.js","sourceRoot":"","sources":["../../../src/RegularExpression.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAA;AACpC,OAAO,aAAa,MAAM,oBAAoB,CAAA;AAE9C,OAAO,UAAU,MAAM,iBAAiB,CAAA;AAGxC,MAAM,CAAC,OAAO,OAAO,iBAAiB;IAIlB;IACC;IAJF,UAAU,CAAY;IAEvC,YACkB,MAAc,EACb,qBAA4C;QAD7C,WAAM,GAAN,MAAM,CAAQ;QACb,0BAAqB,GAArB,qBAAqB,CAAuB;QAE7D,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAA;IAC1C,CAAC;IAEM,KAAK,CAAC,IAAY;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE;YAChF,MAAM,mBAAmB,GAAG,YAAY,CAAC,MAAM,CAAA;YAE/C,MAAM,aAAa,GAAG,IAAI,CAAC,qBAAqB,CAAC,cAAc,CAC7D,mBAAmB,EACnB,IAAI,CAAC,MAAM,EACX,IAAI,CACL,CAAA;YACD,OAAO,CACL,aAAa;gBACb,IAAI,aAAa,CACf,SAAS,EACT,mBAAmB,EACnB,MAAM,EACN,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EACnC,KAAK,EACL,KAAK,CACN,CACF,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,cAAc,CAAC,CAAA;IAC9C,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;IAC3B,CAAC;CACF"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/TreeRegexp.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/TreeRegexp.d.ts new file mode 100644 index 00000000..ca190cd0 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/TreeRegexp.d.ts @@ -0,0 +1,11 @@ +import Group from './Group.js'; +import GroupBuilder from './GroupBuilder.js'; +export default class TreeRegexp { + readonly regexp: RegExp; + readonly groupBuilder: GroupBuilder; + constructor(regexp: RegExp | string); + private static createGroupBuilder; + private static isNonCapturing; + match(s: string): Group | null; +} +//# sourceMappingURL=TreeRegexp.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/TreeRegexp.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/TreeRegexp.d.ts.map new file mode 100644 index 00000000..f38c2f39 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/TreeRegexp.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"TreeRegexp.d.ts","sourceRoot":"","sources":["../../../src/TreeRegexp.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,YAAY,CAAA;AAC9B,OAAO,YAAY,MAAM,mBAAmB,CAAA;AAE5C,MAAM,CAAC,OAAO,OAAO,UAAU;IAC7B,SAAgB,MAAM,EAAE,MAAM,CAAA;IAC9B,SAAgB,YAAY,EAAE,YAAY,CAAA;gBAE9B,MAAM,EAAE,MAAM,GAAG,MAAM;IASnC,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAuCjC,OAAO,CAAC,MAAM,CAAC,cAAc;IAgBtB,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI;CAStC"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/TreeRegexp.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/TreeRegexp.js new file mode 100644 index 00000000..66bdaa9d --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/TreeRegexp.js @@ -0,0 +1,83 @@ +import execWithIndices from 'regexp-match-indices'; +import GroupBuilder from './GroupBuilder.js'; +export default class TreeRegexp { + regexp; + groupBuilder; + constructor(regexp) { + if (regexp instanceof RegExp) { + this.regexp = regexp; + } + else { + this.regexp = new RegExp(regexp); + } + this.groupBuilder = TreeRegexp.createGroupBuilder(this.regexp); + } + static createGroupBuilder(regexp) { + const source = regexp.source; + const stack = [new GroupBuilder()]; + const groupStartStack = []; + let escaping = false; + let charClass = false; + for (let i = 0; i < source.length; i++) { + const c = source[i]; + if (c === '[' && !escaping) { + charClass = true; + } + else if (c === ']' && !escaping) { + charClass = false; + } + else if (c === '(' && !escaping && !charClass) { + groupStartStack.push(i); + const nonCapturing = TreeRegexp.isNonCapturing(source, i); + const groupBuilder = new GroupBuilder(); + if (nonCapturing) { + groupBuilder.setNonCapturing(); + } + stack.push(groupBuilder); + } + else if (c === ')' && !escaping && !charClass) { + const gb = stack.pop(); + if (!gb) + throw new Error('Empty stack'); + const groupStart = groupStartStack.pop(); + if (gb.capturing) { + gb.source = source.substring((groupStart || 0) + 1, i); + stack[stack.length - 1].add(gb); + } + else { + gb.moveChildrenTo(stack[stack.length - 1]); + } + } + escaping = c === '\\' && !escaping; + } + const result = stack.pop(); + if (!result) + throw new Error('Empty stack'); + return result; + } + static isNonCapturing(source, i) { + // Regex is valid. Bounds check not required. + if (source[i + 1] !== '?') { + // (X) + return false; + } + if (source[i + 2] !== '<') { + // (?:X) + // (?=X) + // (?!X) + return true; + } + // (?<=X) or (?X) + return source[i + 3] === '=' || source[i + 3] === '!'; + } + match(s) { + const match = execWithIndices(this.regexp, s); + if (!match) { + return null; + } + let groupIndex = 0; + const nextGroupIndex = () => groupIndex++; + return this.groupBuilder.build(match, nextGroupIndex); + } +} +//# sourceMappingURL=TreeRegexp.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/TreeRegexp.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/TreeRegexp.js.map new file mode 100644 index 00000000..552d8780 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/TreeRegexp.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TreeRegexp.js","sourceRoot":"","sources":["../../../src/TreeRegexp.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/defineDefaultParameterTypes.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/defineDefaultParameterTypes.d.ts new file mode 100644 index 00000000..3d7a27cb --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/defineDefaultParameterTypes.d.ts @@ -0,0 +1,3 @@ +import { DefinesParameterType } from './types.js'; +export default function defineDefaultParameterTypes(registry: DefinesParameterType): void; +//# sourceMappingURL=defineDefaultParameterTypes.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/defineDefaultParameterTypes.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/defineDefaultParameterTypes.d.ts.map new file mode 100644 index 00000000..8f8dde56 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/defineDefaultParameterTypes.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"defineDefaultParameterTypes.d.ts","sourceRoot":"","sources":["../../../src/defineDefaultParameterTypes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAQjD,MAAM,CAAC,OAAO,UAAU,2BAA2B,CAAC,QAAQ,EAAE,oBAAoB,QAgHjF"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/defineDefaultParameterTypes.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/defineDefaultParameterTypes.js new file mode 100644 index 00000000..b2f22739 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/defineDefaultParameterTypes.js @@ -0,0 +1,20 @@ +import ParameterType from './ParameterType.js'; +const INTEGER_REGEXPS = [/-?\d+/, /\d+/]; +const FLOAT_REGEXP = /(?=.*\d.*)[-+]?\d*(?:\.(?=\d.*))?\d*(?:\d+[E][+-]?\d+)?/; +const WORD_REGEXP = /[^\s]+/; +const STRING_REGEXP = /"([^"\\]*(\\.[^"\\]*)*)"|'([^'\\]*(\\.[^'\\]*)*)'/; +const ANONYMOUS_REGEXP = /.*/; +export default function defineDefaultParameterTypes(registry) { + registry.defineParameterType(new ParameterType('int', INTEGER_REGEXPS, Number, (s) => (s === undefined ? null : Number(s)), true, true, true)); + registry.defineParameterType(new ParameterType('float', FLOAT_REGEXP, Number, (s) => (s === undefined ? null : parseFloat(s)), true, false, true)); + registry.defineParameterType(new ParameterType('word', WORD_REGEXP, String, (s) => s, false, false, true)); + registry.defineParameterType(new ParameterType('string', STRING_REGEXP, String, (s1, s2) => (s1 || s2 || '').replace(/\\"/g, '"').replace(/\\'/g, "'"), true, false, true)); + registry.defineParameterType(new ParameterType('', ANONYMOUS_REGEXP, String, (s) => s, false, true, true)); + registry.defineParameterType(new ParameterType('double', FLOAT_REGEXP, Number, (s) => (s === undefined ? null : parseFloat(s)), false, false, true)); + registry.defineParameterType(new ParameterType('bigdecimal', FLOAT_REGEXP, String, (s) => (s === undefined ? null : s), false, false, true)); + registry.defineParameterType(new ParameterType('byte', INTEGER_REGEXPS, Number, (s) => (s === undefined ? null : Number(s)), false, false, true)); + registry.defineParameterType(new ParameterType('short', INTEGER_REGEXPS, Number, (s) => (s === undefined ? null : Number(s)), false, false, true)); + registry.defineParameterType(new ParameterType('long', INTEGER_REGEXPS, Number, (s) => (s === undefined ? null : Number(s)), false, false, true)); + registry.defineParameterType(new ParameterType('biginteger', INTEGER_REGEXPS, BigInt, (s) => (s === undefined ? null : BigInt(s)), false, false, true)); +} +//# sourceMappingURL=defineDefaultParameterTypes.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/defineDefaultParameterTypes.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/defineDefaultParameterTypes.js.map new file mode 100644 index 00000000..549fcd51 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/defineDefaultParameterTypes.js.map @@ -0,0 +1 @@ +{"version":3,"file":"defineDefaultParameterTypes.js","sourceRoot":"","sources":["../../../src/defineDefaultParameterTypes.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/index.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/index.d.ts new file mode 100644 index 00000000..73496764 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/index.d.ts @@ -0,0 +1,13 @@ +import Argument from './Argument.js'; +import { Located, Node, NodeType, Token, TokenType } from './Ast.js'; +import CucumberExpression from './CucumberExpression.js'; +import CucumberExpressionGenerator from './CucumberExpressionGenerator.js'; +import ExpressionFactory from './ExpressionFactory.js'; +import GeneratedExpression from './GeneratedExpression.js'; +import Group from './Group.js'; +import ParameterType, { RegExps, StringOrRegExp } from './ParameterType.js'; +import ParameterTypeRegistry from './ParameterTypeRegistry.js'; +import RegularExpression from './RegularExpression.js'; +import { Expression } from './types.js'; +export { Argument, CucumberExpression, CucumberExpressionGenerator, Expression, ExpressionFactory, GeneratedExpression, Group, Located, Node, NodeType, ParameterType, ParameterTypeRegistry, RegExps, RegularExpression, StringOrRegExp, Token, TokenType, }; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/index.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/index.d.ts.map new file mode 100644 index 00000000..3faf31a4 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACpE,OAAO,kBAAkB,MAAM,yBAAyB,CAAA;AACxD,OAAO,2BAA2B,MAAM,kCAAkC,CAAA;AAC1E,OAAO,iBAAiB,MAAM,wBAAwB,CAAA;AACtD,OAAO,mBAAmB,MAAM,0BAA0B,CAAA;AAC1D,OAAO,KAAK,MAAM,YAAY,CAAA;AAC9B,OAAO,aAAa,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAC3E,OAAO,qBAAqB,MAAM,4BAA4B,CAAA;AAC9D,OAAO,iBAAiB,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvC,OAAO,EACL,QAAQ,EACR,kBAAkB,EAClB,2BAA2B,EAC3B,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,EACL,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,qBAAqB,EACrB,OAAO,EACP,iBAAiB,EACjB,cAAc,EACd,KAAK,EACL,SAAS,GACV,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/index.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/index.js new file mode 100644 index 00000000..da2d755a --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/index.js @@ -0,0 +1,12 @@ +import Argument from './Argument.js'; +import { Node, NodeType, Token, TokenType } from './Ast.js'; +import CucumberExpression from './CucumberExpression.js'; +import CucumberExpressionGenerator from './CucumberExpressionGenerator.js'; +import ExpressionFactory from './ExpressionFactory.js'; +import GeneratedExpression from './GeneratedExpression.js'; +import Group from './Group.js'; +import ParameterType from './ParameterType.js'; +import ParameterTypeRegistry from './ParameterTypeRegistry.js'; +import RegularExpression from './RegularExpression.js'; +export { Argument, CucumberExpression, CucumberExpressionGenerator, ExpressionFactory, GeneratedExpression, Group, Node, NodeType, ParameterType, ParameterTypeRegistry, RegularExpression, Token, TokenType, }; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/index.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/index.js.map new file mode 100644 index 00000000..99c86949 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAA;AACpC,OAAO,EAAW,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACpE,OAAO,kBAAkB,MAAM,yBAAyB,CAAA;AACxD,OAAO,2BAA2B,MAAM,kCAAkC,CAAA;AAC1E,OAAO,iBAAiB,MAAM,wBAAwB,CAAA;AACtD,OAAO,mBAAmB,MAAM,0BAA0B,CAAA;AAC1D,OAAO,KAAK,MAAM,YAAY,CAAA;AAC9B,OAAO,aAA0C,MAAM,oBAAoB,CAAA;AAC3E,OAAO,qBAAqB,MAAM,4BAA4B,CAAA;AAC9D,OAAO,iBAAiB,MAAM,wBAAwB,CAAA;AAGtD,OAAO,EACL,QAAQ,EACR,kBAAkB,EAClB,2BAA2B,EAE3B,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,EAEL,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,qBAAqB,EAErB,iBAAiB,EAEjB,KAAK,EACL,SAAS,GACV,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/types.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/types.d.ts new file mode 100644 index 00000000..cfcd803d --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/types.d.ts @@ -0,0 +1,24 @@ +import Argument from './Argument.js'; +import ParameterType from './ParameterType.js'; +export interface DefinesParameterType { + defineParameterType(parameterType: ParameterType): void; +} +export interface Expression { + readonly source: string; + match(text: string): readonly Argument[] | null; +} +export type ParameterInfo = { + /** + * The string representation of the original ParameterType#type property + */ + type: string | null; + /** + * The parameter type name + */ + name: string; + /** + * The number of times this name has been used so far + */ + count: number; +}; +//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/types.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/types.d.ts.map new file mode 100644 index 00000000..fd76cf2e --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/types.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAA;AACpC,OAAO,aAAa,MAAM,oBAAoB,CAAA;AAE9C,MAAM,WAAW,oBAAoB;IACnC,mBAAmB,CAAC,CAAC,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;CAC9D;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,QAAQ,EAAE,GAAG,IAAI,CAAA;CAChD;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B;;OAEG;IACH,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ;;OAEG;IACH,KAAK,EAAE,MAAM,CAAA;CACd,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/types.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/types.js new file mode 100644 index 00000000..718fd38a --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/types.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/src/types.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/types.js.map new file mode 100644 index 00000000..70453b7a --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/src/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ArgumentTest.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ArgumentTest.d.ts new file mode 100644 index 00000000..713608c4 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ArgumentTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=ArgumentTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ArgumentTest.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ArgumentTest.d.ts.map new file mode 100644 index 00000000..9d10004b --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ArgumentTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ArgumentTest.d.ts","sourceRoot":"","sources":["../../../test/ArgumentTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ArgumentTest.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ArgumentTest.js new file mode 100644 index 00000000..0132bae7 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ArgumentTest.js @@ -0,0 +1,15 @@ +import * as assert from 'assert'; +import Argument from '../src/Argument.js'; +import ParameterTypeRegistry from '../src/ParameterTypeRegistry.js'; +import TreeRegexp from '../src/TreeRegexp.js'; +describe('Argument', () => { + it('exposes getParameterTypeName()', () => { + const treeRegexp = new TreeRegexp('three (.*) mice'); + const parameterTypeRegistry = new ParameterTypeRegistry(); + const group = treeRegexp.match('three blind mice'); + const args = Argument.build(group, [parameterTypeRegistry.lookupByTypeName('string')]); + const argument = args[0]; + assert.strictEqual(argument.getParameterType().name, 'string'); + }); +}); +//# sourceMappingURL=ArgumentTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ArgumentTest.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ArgumentTest.js.map new file mode 100644 index 00000000..a1d3dbfd --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ArgumentTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ArgumentTest.js","sourceRoot":"","sources":["../../../test/ArgumentTest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAA;AAEhC,OAAO,QAAQ,MAAM,oBAAoB,CAAA;AACzC,OAAO,qBAAqB,MAAM,iCAAiC,CAAA;AACnE,OAAO,UAAU,MAAM,sBAAsB,CAAA;AAE7C,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,iBAAiB,CAAC,CAAA;QACpD,MAAM,qBAAqB,GAAG,IAAI,qBAAqB,EAAE,CAAA;QACzD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,kBAAkB,CAAE,CAAA;QACnD,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,QAAQ,CAAE,CAAC,CAAC,CAAA;QACvF,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QACxB,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CombinatorialGeneratedExpressionFactoryTest.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CombinatorialGeneratedExpressionFactoryTest.d.ts new file mode 100644 index 00000000..a9066926 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CombinatorialGeneratedExpressionFactoryTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=CombinatorialGeneratedExpressionFactoryTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CombinatorialGeneratedExpressionFactoryTest.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CombinatorialGeneratedExpressionFactoryTest.d.ts.map new file mode 100644 index 00000000..768e8461 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CombinatorialGeneratedExpressionFactoryTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"CombinatorialGeneratedExpressionFactoryTest.d.ts","sourceRoot":"","sources":["../../../test/CombinatorialGeneratedExpressionFactoryTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CombinatorialGeneratedExpressionFactoryTest.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CombinatorialGeneratedExpressionFactoryTest.js new file mode 100644 index 00000000..0e91f843 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CombinatorialGeneratedExpressionFactoryTest.js @@ -0,0 +1,29 @@ +import assert from 'assert'; +import CombinatorialGeneratedExpressionFactory from '../src/CombinatorialGeneratedExpressionFactory.js'; +import ParameterType from '../src/ParameterType.js'; +describe('CucumberExpressionGenerator', () => { + it('generates multiple expressions', () => { + const parameterTypeCombinations = [ + [ + new ParameterType('color', /red|blue|yellow/, null, (s) => s, false, true), + new ParameterType('csscolor', /red|blue|yellow/, null, (s) => s, false, true), + ], + [ + new ParameterType('date', /\d{4}-\d{2}-\d{2}/, null, (s) => s, false, true), + new ParameterType('datetime', /\d{4}-\d{2}-\d{2}/, null, (s) => s, false, true), + new ParameterType('timestamp', /\d{4}-\d{2}-\d{2}/, null, (s) => s, false, true), + ], + ]; + const factory = new CombinatorialGeneratedExpressionFactory('I bought a {{0}} ball on {{1}}', parameterTypeCombinations); + const expressions = factory.generateExpressions().map((ge) => ge.source); + assert.deepStrictEqual(expressions, [ + 'I bought a {color} ball on {date}', + 'I bought a {color} ball on {datetime}', + 'I bought a {color} ball on {timestamp}', + 'I bought a {csscolor} ball on {date}', + 'I bought a {csscolor} ball on {datetime}', + 'I bought a {csscolor} ball on {timestamp}', + ]); + }); +}); +//# sourceMappingURL=CombinatorialGeneratedExpressionFactoryTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CombinatorialGeneratedExpressionFactoryTest.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CombinatorialGeneratedExpressionFactoryTest.js.map new file mode 100644 index 00000000..aed60fd3 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CombinatorialGeneratedExpressionFactoryTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CombinatorialGeneratedExpressionFactoryTest.js","sourceRoot":"","sources":["../../../test/CombinatorialGeneratedExpressionFactoryTest.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAE3B,OAAO,uCAAuC,MAAM,mDAAmD,CAAA;AACvG,OAAO,aAAa,MAAM,yBAAyB,CAAA;AAEnD,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,yBAAyB,GAAG;YAChC;gBACE,IAAI,aAAa,CAAC,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC;gBAC1E,IAAI,aAAa,CAAC,UAAU,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC;aAC9E;YACD;gBACE,IAAI,aAAa,CAAC,MAAM,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC;gBAC3E,IAAI,aAAa,CAAC,UAAU,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC;gBAC/E,IAAI,aAAa,CAAC,WAAW,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC;aACjF;SACF,CAAA;QAED,MAAM,OAAO,GAAG,IAAI,uCAAuC,CACzD,gCAAgC,EAChC,yBAAyB,CAC1B,CAAA;QACD,MAAM,WAAW,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAA;QACxE,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE;YAClC,mCAAmC;YACnC,uCAAuC;YACvC,wCAAwC;YACxC,sCAAsC;YACtC,0CAA0C;YAC1C,2CAA2C;SAC5C,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionGeneratorTest.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionGeneratorTest.d.ts new file mode 100644 index 00000000..f959dbd8 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionGeneratorTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=CucumberExpressionGeneratorTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionGeneratorTest.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionGeneratorTest.d.ts.map new file mode 100644 index 00000000..034e0052 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionGeneratorTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionGeneratorTest.d.ts","sourceRoot":"","sources":["../../../test/CucumberExpressionGeneratorTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionGeneratorTest.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionGeneratorTest.js new file mode 100644 index 00000000..e0306f3c --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionGeneratorTest.js @@ -0,0 +1,227 @@ +import assert from 'assert'; +import CucumberExpression from '../src/CucumberExpression.js'; +import CucumberExpressionGenerator from '../src/CucumberExpressionGenerator.js'; +import ParameterType from '../src/ParameterType.js'; +import ParameterTypeRegistry from '../src/ParameterTypeRegistry.js'; +class Currency { + s; + constructor(s) { + this.s = s; + } +} +describe('CucumberExpressionGenerator', () => { + let parameterTypeRegistry; + let generator; + function assertExpression(expectedExpression, expectedParameterInfo, text) { + const generatedExpression = generator.generateExpressions(text)[0]; + assert.deepStrictEqual(generatedExpression.parameterInfos, expectedParameterInfo); + assert.strictEqual(generatedExpression.source, expectedExpression); + const cucumberExpression = new CucumberExpression(generatedExpression.source, parameterTypeRegistry); + const match = cucumberExpression.match(text); + if (match === null) { + assert.fail(`Expected text '${text}' to match generated expression '${generatedExpression.source}'`); + } + assert.strictEqual(match.length, expectedParameterInfo.length); + } + beforeEach(() => { + parameterTypeRegistry = new ParameterTypeRegistry(); + generator = new CucumberExpressionGenerator(() => parameterTypeRegistry.parameterTypes); + }); + it('documents expression generation', () => { + parameterTypeRegistry = new ParameterTypeRegistry(); + generator = new CucumberExpressionGenerator(() => parameterTypeRegistry.parameterTypes); + const undefinedStepText = 'I have 2 cucumbers and 1.5 tomato'; + const generatedExpression = generator.generateExpressions(undefinedStepText)[0]; + assert.strictEqual(generatedExpression.source, 'I have {int} cucumbers and {float} tomato'); + assert.strictEqual(generatedExpression.parameterNames[0], 'int'); + assert.strictEqual(generatedExpression.parameterTypes[1].name, 'float'); + }); + it('generates expression for no args', () => { + assertExpression('hello', [], 'hello'); + }); + it('generates expression with escaped left parenthesis', () => { + assertExpression('\\(iii)', [], '(iii)'); + }); + it('generates expression with escaped left curly brace', () => { + assertExpression('\\{iii}', [], '{iii}'); + }); + it('generates expression with escaped slashes', () => { + assertExpression('The {int}\\/{int}\\/{int} hey', [ + { + type: 'Number', + name: 'int', + count: 1, + }, + { + type: 'Number', + name: 'int', + count: 2, + }, + { + type: 'Number', + name: 'int', + count: 3, + }, + ], 'The 1814/05/17 hey'); + }); + it('generates expression for int float arg', () => { + assertExpression('I have {int} cukes and {float} euro', [ + { + type: 'Number', + name: 'int', + count: 1, + }, + { + type: 'Number', + name: 'float', + count: 1, + }, + ], 'I have 2 cukes and 1.5 euro'); + }); + it('generates expression for strings', () => { + assertExpression('I like {string} and {string}', [ + { + type: 'String', + name: 'string', + count: 1, + }, + { + type: 'String', + name: 'string', + count: 2, + }, + ], 'I like "bangers" and \'mash\''); + }); + it('generates expression with % sign', () => { + assertExpression('I am {int}%% foobar', [ + { + type: 'Number', + name: 'int', + count: 1, + }, + ], 'I am 20%% foobar'); + }); + it('generates expression for just int', () => { + assertExpression('{int}', [ + { + type: 'Number', + name: 'int', + count: 1, + }, + ], '99999'); + }); + it('numbers only second argument when builtin type is not reserved keyword', () => { + assertExpression('I have {float} cukes and {float} euro', [ + { + type: 'Number', + name: 'float', + count: 1, + }, + { + type: 'Number', + name: 'float', + count: 2, + }, + ], 'I have 2.5 cukes and 1.5 euro'); + }); + it('generates expression for custom type', () => { + parameterTypeRegistry.defineParameterType(new ParameterType('currency', /[A-Z]{3}/, Currency, (s) => new Currency(s), true, false)); + assertExpression('I have a {currency} account', [ + { + type: 'Currency', + name: 'currency', + count: 1, + }, + ], 'I have a EUR account'); + }); + it('prefers leftmost match when there is overlap', () => { + parameterTypeRegistry.defineParameterType(new ParameterType('currency', /c d/, Currency, (s) => new Currency(s), true, false)); + parameterTypeRegistry.defineParameterType(new ParameterType('date', /b c/, Date, (s) => new Date(s), true, false)); + assertExpression('a {date} d e f g', [ + { + type: 'Date', + name: 'date', + count: 1, + }, + ], 'a b c d e f g'); + }); + // TODO: prefers widest match + it('generates all combinations of expressions when several parameter types match', () => { + parameterTypeRegistry.defineParameterType(new ParameterType('currency', /x/, null, (s) => new Currency(s), true, false)); + parameterTypeRegistry.defineParameterType(new ParameterType('date', /x/, null, (s) => new Date(s), true, false)); + const generatedExpressions = generator.generateExpressions('I have x and x and another x'); + const expressions = generatedExpressions.map((e) => e.source); + assert.deepStrictEqual(expressions, [ + 'I have {currency} and {currency} and another {currency}', + 'I have {currency} and {currency} and another {date}', + 'I have {currency} and {date} and another {currency}', + 'I have {currency} and {date} and another {date}', + 'I have {date} and {currency} and another {currency}', + 'I have {date} and {currency} and another {date}', + 'I have {date} and {date} and another {currency}', + 'I have {date} and {date} and another {date}', + ]); + }); + it('exposes parameter type names in generated expression', () => { + const expression = generator.generateExpressions('I have 2 cukes and 1.5 euro')[0]; + const typeNames = expression.parameterTypes.map((parameter) => parameter.name); + assert.deepStrictEqual(typeNames, ['int', 'float']); + }); + it('matches parameter types with optional capture groups', () => { + parameterTypeRegistry.defineParameterType(new ParameterType('optional-flight', /(1st flight)?/, null, (s) => s, true, false)); + parameterTypeRegistry.defineParameterType(new ParameterType('optional-hotel', /(1 hotel)?/, null, (s) => s, true, false)); + const expression = generator.generateExpressions('I reach Stage 4: 1st flight -1 hotel')[0]; + // While you would expect this to be `I reach Stage {int}: {optional-flight} -{optional-hotel}` the `-1` causes + // {int} to match just before {optional-hotel}. + assert.strictEqual(expression.source, 'I reach Stage {int}: {optional-flight} {int} hotel'); + }); + it('generates at most 256 expressions', () => { + for (let i = 0; i < 4; i++) { + parameterTypeRegistry.defineParameterType(new ParameterType('my-type-' + i, /([a-z] )*?[a-z]/, null, (s) => s, true, false)); + } + // This would otherwise generate 4^11=419430 expressions and consume just shy of 1.5GB. + const expressions = generator.generateExpressions('a s i m p l e s t e p'); + assert.strictEqual(expressions.length, 256); + }); + it('prefers expression with longest non empty match', () => { + parameterTypeRegistry.defineParameterType(new ParameterType('zero-or-more', /[a-z]*/, null, (s) => s, true, false)); + parameterTypeRegistry.defineParameterType(new ParameterType('exactly-one', /[a-z]/, null, (s) => s, true, false)); + const expressions = generator.generateExpressions('a simple step'); + assert.strictEqual(expressions.length, 2); + assert.strictEqual(expressions[0].source, '{exactly-one} {zero-or-more} {zero-or-more}'); + assert.strictEqual(expressions[1].source, '{zero-or-more} {zero-or-more} {zero-or-more}'); + }); + it('does not suggest parameter included at the beginning of a word', () => { + parameterTypeRegistry.defineParameterType(new ParameterType('direction', /(up|down)/, null, (s) => s, true, false)); + const expressions = generator.generateExpressions('I download a picture'); + assert.strictEqual(expressions.length, 1); + assert.notStrictEqual(expressions[0].source, 'I {direction}load a picture'); + assert.strictEqual(expressions[0].source, 'I download a picture'); + }); + it('does not suggest parameter included inside a word', () => { + parameterTypeRegistry.defineParameterType(new ParameterType('direction', /(up|down)/, null, (s) => s, true, false)); + const expressions = generator.generateExpressions('I watch the muppet show'); + assert.strictEqual(expressions.length, 1); + assert.notStrictEqual(expressions[0].source, 'I watch the m{direction}pet show'); + assert.strictEqual(expressions[0].source, 'I watch the muppet show'); + }); + it('does not suggest parameter at the end of a word', () => { + parameterTypeRegistry.defineParameterType(new ParameterType('direction', /(up|down)/, null, (s) => s, true, false)); + const expressions = generator.generateExpressions('I create a group'); + assert.strictEqual(expressions.length, 1); + assert.notStrictEqual(expressions[0].source, 'I create a gro{direction}'); + assert.strictEqual(expressions[0].source, 'I create a group'); + }); + it('does suggest parameter that are a full word', () => { + parameterTypeRegistry.defineParameterType(new ParameterType('direction', /(up|down)/, null, (s) => s, true, false)); + assert.strictEqual(generator.generateExpressions('When I go down the road')[0].source, 'When I go {direction} the road'); + assert.strictEqual(generator.generateExpressions('When I walk up the hill')[0].source, 'When I walk {direction} the hill'); + assert.strictEqual(generator.generateExpressions('up the hill, the road goes down')[0].source, '{direction} the hill, the road goes {direction}'); + }); + it('does not consider punctuation as being part of a word', () => { + parameterTypeRegistry.defineParameterType(new ParameterType('direction', /(up|down)/, null, (s) => s, true, false)); + assert.strictEqual(generator.generateExpressions('direction is:down')[0].source, 'direction is:{direction}'); + assert.strictEqual(generator.generateExpressions('direction is down.')[0].source, 'direction is {direction}.'); + }); +}); +//# sourceMappingURL=CucumberExpressionGeneratorTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionGeneratorTest.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionGeneratorTest.js.map new file mode 100644 index 00000000..1395b7a7 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionGeneratorTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionGeneratorTest.js","sourceRoot":"","sources":["../../../test/CucumberExpressionGeneratorTest.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionParserTest.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionParserTest.d.ts new file mode 100644 index 00000000..7d0e84e1 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionParserTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=CucumberExpressionParserTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionParserTest.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionParserTest.d.ts.map new file mode 100644 index 00000000..e454179b --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionParserTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionParserTest.d.ts","sourceRoot":"","sources":["../../../test/CucumberExpressionParserTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionParserTest.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionParserTest.js new file mode 100644 index 00000000..9b2b7c46 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionParserTest.js @@ -0,0 +1,29 @@ +import assert from 'assert'; +import fs from 'fs'; +import { glob } from 'glob'; +import yaml from 'js-yaml'; +import CucumberExpressionError from '../src/CucumberExpressionError.js'; +import CucumberExpressionParser from '../src/CucumberExpressionParser.js'; +import { testDataDir } from './testDataDir.js'; +describe('CucumberExpressionParser', () => { + for (const path of glob.sync(`${testDataDir}/cucumber-expression/parser/*.yaml`)) { + const expectation = yaml.load(fs.readFileSync(path, 'utf-8')); + it(`parses ${path}`, () => { + const parser = new CucumberExpressionParser(); + if (expectation.expected_ast !== undefined) { + const node = parser.parse(expectation.expression); + assert.deepStrictEqual(JSON.parse(JSON.stringify(node)), // Removes type information. + expectation.expected_ast); + } + else if (expectation.exception !== undefined) { + assert.throws(() => { + parser.parse(expectation.expression); + }, new CucumberExpressionError(expectation.exception)); + } + else { + throw new Error(`Expectation must have expected or exception: ${JSON.stringify(expectation)}`); + } + }); + } +}); +//# sourceMappingURL=CucumberExpressionParserTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionParserTest.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionParserTest.js.map new file mode 100644 index 00000000..5c9d7250 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionParserTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionParserTest.js","sourceRoot":"","sources":["../../../test/CucumberExpressionParserTest.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,IAAI,MAAM,SAAS,CAAA;AAE1B,OAAO,uBAAuB,MAAM,mCAAmC,CAAA;AACvE,OAAO,wBAAwB,MAAM,oCAAoC,CAAA;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAQ9C,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,WAAW,oCAAoC,CAAC,EAAE,CAAC;QACjF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAgB,CAAA;QAC5E,EAAE,CAAC,UAAU,IAAI,EAAE,EAAE,GAAG,EAAE;YACxB,MAAM,MAAM,GAAG,IAAI,wBAAwB,EAAE,CAAA;YAC7C,IAAI,WAAW,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;gBAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;gBACjD,MAAM,CAAC,eAAe,CACpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,4BAA4B;gBAC9D,WAAW,CAAC,YAAY,CACzB,CAAA;YACH,CAAC;iBAAM,IAAI,WAAW,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC/C,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;oBACjB,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;gBACtC,CAAC,EAAE,IAAI,uBAAuB,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAA;YACxD,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CACb,gDAAgD,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAC9E,CAAA;YACH,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;AACH,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTest.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTest.d.ts new file mode 100644 index 00000000..ed6984c8 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=CucumberExpressionTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTest.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTest.d.ts.map new file mode 100644 index 00000000..e1689a5a --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionTest.d.ts","sourceRoot":"","sources":["../../../test/CucumberExpressionTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTest.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTest.js new file mode 100644 index 00000000..2b956e11 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTest.js @@ -0,0 +1,107 @@ +import assert from 'assert'; +import fs from 'fs'; +import { glob } from 'glob'; +import yaml from 'js-yaml'; +import CucumberExpression from '../src/CucumberExpression.js'; +import CucumberExpressionError from '../src/CucumberExpressionError.js'; +import ParameterType from '../src/ParameterType.js'; +import ParameterTypeRegistry from '../src/ParameterTypeRegistry.js'; +import { testDataDir } from './testDataDir.js'; +describe('CucumberExpression', () => { + for (const path of glob.sync(`${testDataDir}/cucumber-expression/matching/*.yaml`)) { + const expectation = yaml.load(fs.readFileSync(path, 'utf-8')); + it(`matches ${path}`, () => { + const parameterTypeRegistry = new ParameterTypeRegistry(); + if (expectation.expected_args !== undefined) { + const expression = new CucumberExpression(expectation.expression, parameterTypeRegistry); + const matches = expression.match(expectation.text); + assert.deepStrictEqual(JSON.parse(JSON.stringify(matches ? matches.map((value) => value.getValue(null)) : null, (key, value) => { + return typeof value === 'bigint' ? value.toString() : value; + })), // Removes type information. + expectation.expected_args); + } + else if (expectation.exception !== undefined) { + assert.throws(() => { + const expression = new CucumberExpression(expectation.expression, parameterTypeRegistry); + expression.match(expectation.text); + }, new CucumberExpressionError(expectation.exception)); + } + else { + throw new Error(`Expectation must have expected or exception: ${JSON.stringify(expectation)}`); + } + }); + } + it('matches float', () => { + assert.deepStrictEqual(match('{float}', ''), null); + assert.deepStrictEqual(match('{float}', '.'), null); + assert.deepStrictEqual(match('{float}', ','), null); + assert.deepStrictEqual(match('{float}', '-'), null); + assert.deepStrictEqual(match('{float}', 'E'), null); + assert.deepStrictEqual(match('{float}', '1,'), null); + assert.deepStrictEqual(match('{float}', ',1'), null); + assert.deepStrictEqual(match('{float}', '1.'), null); + assert.deepStrictEqual(match('{float}', '1'), [1]); + assert.deepStrictEqual(match('{float}', '-1'), [-1]); + assert.deepStrictEqual(match('{float}', '1.1'), [1.1]); + assert.deepStrictEqual(match('{float}', '1,000'), null); + assert.deepStrictEqual(match('{float}', '1,000,0'), null); + assert.deepStrictEqual(match('{float}', '1,000.1'), null); + assert.deepStrictEqual(match('{float}', '1,000,10'), null); + assert.deepStrictEqual(match('{float}', '1,0.1'), null); + assert.deepStrictEqual(match('{float}', '1,000,000.1'), null); + assert.deepStrictEqual(match('{float}', '-1.1'), [-1.1]); + assert.deepStrictEqual(match('{float}', '.1'), [0.1]); + assert.deepStrictEqual(match('{float}', '-.1'), [-0.1]); + assert.deepStrictEqual(match('{float}', '-.10000001'), [-0.10000001]); + assert.deepStrictEqual(match('{float}', '1E1'), [1e1]); // precision 1 with scale -1, can not be expressed as a decimal + assert.deepStrictEqual(match('{float}', '.1E1'), [1]); + assert.deepStrictEqual(match('{float}', 'E1'), null); + assert.deepStrictEqual(match('{float}', '-.1E-1'), [-0.01]); + assert.deepStrictEqual(match('{float}', '-.1E-2'), [-0.001]); + assert.deepStrictEqual(match('{float}', '-.1E+1'), [-1]); + assert.deepStrictEqual(match('{float}', '-.1E+2'), [-10]); + assert.deepStrictEqual(match('{float}', '-.1E1'), [-1]); + assert.deepStrictEqual(match('{float}', '-.10E2'), [-10]); + }); + it('matches float with zero', () => { + assert.deepEqual(match('{float}', '0'), [0]); + }); + it('exposes source', () => { + const expr = 'I have {int} cuke(s)'; + assert.strictEqual(new CucumberExpression(expr, new ParameterTypeRegistry()).source, expr); + }); + it('unmatched optional groups have undefined values', () => { + const parameterTypeRegistry = new ParameterTypeRegistry(); + parameterTypeRegistry.defineParameterType(new ParameterType('textAndOrNumber', /([A-Z]+)?(?: )?([0-9]+)?/, null, function (s1, s2) { + return [s1, s2]; + }, false, true)); + const expression = new CucumberExpression('{textAndOrNumber}', parameterTypeRegistry); + const world = {}; + assert.deepStrictEqual(expression.match(`TLA`)[0].getValue(world), ['TLA', undefined]); + assert.deepStrictEqual(expression.match(`123`)[0].getValue(world), [undefined, '123']); + }); + // JavaScript-specific + it('delegates transform to custom object', () => { + const parameterTypeRegistry = new ParameterTypeRegistry(); + parameterTypeRegistry.defineParameterType(new ParameterType('widget', /\w+/, null, function (s) { + return this.createWidget(s); + }, false, true)); + const expression = new CucumberExpression('I have a {widget}', parameterTypeRegistry); + const world = { + createWidget(s) { + return `widget:${s}`; + }, + }; + const args = expression.match(`I have a bolt`); + assert.strictEqual(args[0].getValue(world), 'widget:bolt'); + }); +}); +const match = (expression, text) => { + const cucumberExpression = new CucumberExpression(expression, new ParameterTypeRegistry()); + const args = cucumberExpression.match(text); + if (!args) { + return null; + } + return args.map((arg) => arg.getValue(null)); +}; +//# sourceMappingURL=CucumberExpressionTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTest.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTest.js.map new file mode 100644 index 00000000..ccd01597 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionTest.js","sourceRoot":"","sources":["../../../test/CucumberExpressionTest.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTokenizerTest.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTokenizerTest.d.ts new file mode 100644 index 00000000..6df46a1e --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTokenizerTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=CucumberExpressionTokenizerTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTokenizerTest.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTokenizerTest.d.ts.map new file mode 100644 index 00000000..883ddf20 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTokenizerTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionTokenizerTest.d.ts","sourceRoot":"","sources":["../../../test/CucumberExpressionTokenizerTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTokenizerTest.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTokenizerTest.js new file mode 100644 index 00000000..1a84b354 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTokenizerTest.js @@ -0,0 +1,29 @@ +import assert from 'assert'; +import fs from 'fs'; +import { glob } from 'glob'; +import yaml from 'js-yaml'; +import CucumberExpressionError from '../src/CucumberExpressionError.js'; +import CucumberExpressionTokenizer from '../src/CucumberExpressionTokenizer.js'; +import { testDataDir } from './testDataDir.js'; +describe('CucumberExpressionTokenizer', () => { + for (const path of glob.sync(`${testDataDir}/cucumber-expression/tokenizer/*.yaml`)) { + const expectation = yaml.load(fs.readFileSync(path, 'utf-8')); + it(`tokenizes ${path}`, () => { + const tokenizer = new CucumberExpressionTokenizer(); + if (expectation.expected_tokens !== undefined) { + const tokens = tokenizer.tokenize(expectation.expression); + assert.deepStrictEqual(JSON.parse(JSON.stringify(tokens)), // Removes type information. + expectation.expected_tokens); + } + else if (expectation.exception !== undefined) { + assert.throws(() => { + tokenizer.tokenize(expectation.expression); + }, new CucumberExpressionError(expectation.exception)); + } + else { + throw new Error(`Expectation must have expected_tokens or exception: ${JSON.stringify(expectation)}`); + } + }); + } +}); +//# sourceMappingURL=CucumberExpressionTokenizerTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTokenizerTest.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTokenizerTest.js.map new file mode 100644 index 00000000..0d2cf579 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTokenizerTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionTokenizerTest.js","sourceRoot":"","sources":["../../../test/CucumberExpressionTokenizerTest.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,IAAI,MAAM,SAAS,CAAA;AAE1B,OAAO,uBAAuB,MAAM,mCAAmC,CAAA;AACvE,OAAO,2BAA2B,MAAM,uCAAuC,CAAA;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAQ9C,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,WAAW,uCAAuC,CAAC,EAAE,CAAC;QACpF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAgB,CAAA;QAC5E,EAAE,CAAC,aAAa,IAAI,EAAE,EAAE,GAAG,EAAE;YAC3B,MAAM,SAAS,GAAG,IAAI,2BAA2B,EAAE,CAAA;YACnD,IAAI,WAAW,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;gBAC9C,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;gBACzD,MAAM,CAAC,eAAe,CACpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,4BAA4B;gBAChE,WAAW,CAAC,eAAe,CAC5B,CAAA;YACH,CAAC;iBAAM,IAAI,WAAW,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC/C,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;oBACjB,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;gBAC5C,CAAC,EAAE,IAAI,uBAAuB,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAA;YACxD,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CACb,uDAAuD,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CACrF,CAAA;YACH,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;AACH,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTransformationTest.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTransformationTest.d.ts new file mode 100644 index 00000000..6919a5a0 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTransformationTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=CucumberExpressionTransformationTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTransformationTest.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTransformationTest.d.ts.map new file mode 100644 index 00000000..152ad37a --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTransformationTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionTransformationTest.d.ts","sourceRoot":"","sources":["../../../test/CucumberExpressionTransformationTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTransformationTest.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTransformationTest.js new file mode 100644 index 00000000..3071a8ef --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTransformationTest.js @@ -0,0 +1,18 @@ +import assert from 'assert'; +import fs from 'fs'; +import { glob } from 'glob'; +import yaml from 'js-yaml'; +import CucumberExpression from '../src/CucumberExpression.js'; +import ParameterTypeRegistry from '../src/ParameterTypeRegistry.js'; +import { testDataDir } from './testDataDir.js'; +describe('CucumberExpression', () => { + for (const path of glob.sync(`${testDataDir}/cucumber-expression/transformation/*.yaml`)) { + const expectation = yaml.load(fs.readFileSync(path, 'utf-8')); + it(`transforms ${path}`, () => { + const parameterTypeRegistry = new ParameterTypeRegistry(); + const expression = new CucumberExpression(expectation.expression, parameterTypeRegistry); + assert.deepStrictEqual(expression.regexp.source, expectation.expected_regex); + }); + } +}); +//# sourceMappingURL=CucumberExpressionTransformationTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTransformationTest.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTransformationTest.js.map new file mode 100644 index 00000000..ea707cf4 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CucumberExpressionTransformationTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberExpressionTransformationTest.js","sourceRoot":"","sources":["../../../test/CucumberExpressionTransformationTest.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,IAAI,MAAM,SAAS,CAAA;AAE1B,OAAO,kBAAkB,MAAM,8BAA8B,CAAA;AAC7D,OAAO,qBAAqB,MAAM,iCAAiC,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAO9C,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,WAAW,4CAA4C,CAAC,EAAE,CAAC;QACzF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAgB,CAAA;QAC5E,EAAE,CAAC,cAAc,IAAI,EAAE,EAAE,GAAG,EAAE;YAC5B,MAAM,qBAAqB,GAAG,IAAI,qBAAqB,EAAE,CAAA;YACzD,MAAM,UAAU,GAAG,IAAI,kBAAkB,CAAC,WAAW,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAA;YACxF,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,cAAc,CAAC,CAAA;QAC9E,CAAC,CAAC,CAAA;IACJ,CAAC;AACH,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CustomParameterTypeTest.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CustomParameterTypeTest.d.ts new file mode 100644 index 00000000..f68fbc26 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CustomParameterTypeTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=CustomParameterTypeTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CustomParameterTypeTest.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CustomParameterTypeTest.d.ts.map new file mode 100644 index 00000000..33ae8a62 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CustomParameterTypeTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"CustomParameterTypeTest.d.ts","sourceRoot":"","sources":["../../../test/CustomParameterTypeTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CustomParameterTypeTest.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CustomParameterTypeTest.js new file mode 100644 index 00000000..89649375 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CustomParameterTypeTest.js @@ -0,0 +1,119 @@ +import assert from 'assert'; +import CucumberExpression from '../src/CucumberExpression.js'; +import ParameterType from '../src/ParameterType.js'; +import ParameterTypeRegistry from '../src/ParameterTypeRegistry.js'; +import RegularExpression from '../src/RegularExpression.js'; +class Color { + name; + constructor(name) { + this.name = name; + } +} +class CssColor { + name; + constructor(name) { + this.name = name; + } +} +describe('Custom parameter type', () => { + let parameterTypeRegistry; + beforeEach(() => { + parameterTypeRegistry = new ParameterTypeRegistry(); + parameterTypeRegistry.defineParameterType(new ParameterType('color', /red|blue|yellow/, Color, (s) => new Color(s), false, true)); + }); + describe('CucumberExpression', () => { + it('throws exception for illegal character in parameter name', () => { + assert.throws(() => new ParameterType('[string]', /.*/, String, (s) => s, false, true), { + message: "Illegal character in parameter name {[string]}. Parameter names may not contain '{', '}', '(', ')', '\\' or '/'", + }); + }); + it('matches parameters with custom parameter type', () => { + const expression = new CucumberExpression('I have a {color} ball', parameterTypeRegistry); + const value = expression.match('I have a red ball')?.[0].getValue(null); + assert.strictEqual(value?.name, 'red'); + }); + it('matches parameters with multiple capture groups', () => { + class Coordinate { + x; + y; + z; + constructor(x, y, z) { + this.x = x; + this.y = y; + this.z = z; + } + } + parameterTypeRegistry.defineParameterType(new ParameterType('coordinate', /(\d+),\s*(\d+),\s*(\d+)/, Coordinate, (x, y, z) => new Coordinate(Number(x), Number(y), Number(z)), true, true)); + const expression = new CucumberExpression('A {int} thick line from {coordinate} to {coordinate}', parameterTypeRegistry); + const args = expression.match('A 5 thick line from 10,20,30 to 40,50,60'); + const thick = args?.[0].getValue(null); + assert.strictEqual(thick, 5); + const from = args?.[1].getValue(null); + assert.strictEqual(from?.x, 10); + assert.strictEqual(from?.y, 20); + assert.strictEqual(from?.z, 30); + const to = args?.[2].getValue(null); + assert.strictEqual(to?.x, 40); + assert.strictEqual(to?.y, 50); + assert.strictEqual(to?.z, 60); + }); + it('matches parameters with custom parameter type using optional capture group', () => { + parameterTypeRegistry = new ParameterTypeRegistry(); + parameterTypeRegistry.defineParameterType(new ParameterType('color', [/red|blue|yellow/, /(?:dark|light) (?:red|blue|yellow)/], Color, (s) => new Color(s), false, true)); + const expression = new CucumberExpression('I have a {color} ball', parameterTypeRegistry); + const value = expression.match('I have a dark red ball')?.[0].getValue(null); + assert.strictEqual(value?.name, 'dark red'); + }); + it('defers transformation until queried from argument', () => { + parameterTypeRegistry.defineParameterType(new ParameterType('throwing', /bad/, null, (s) => { + throw new Error(`Can't transform [${s}]`); + }, false, true)); + const expression = new CucumberExpression('I have a {throwing} parameter', parameterTypeRegistry); + const args = expression.match('I have a bad parameter'); + assert.throws(() => args[0].getValue(null), { + message: "Can't transform [bad]", + }); + }); + describe('conflicting parameter type', () => { + it('is detected for type name', () => { + assert.throws(() => parameterTypeRegistry.defineParameterType(new ParameterType('color', /.*/, CssColor, (s) => new CssColor(s), false, true)), { message: 'There is already a parameter type with name color' }); + }); + it('is not detected for type', () => { + parameterTypeRegistry.defineParameterType(new ParameterType('whatever', /.*/, Color, (s) => new Color(s), false, false)); + }); + it('is not detected for regexp', () => { + parameterTypeRegistry.defineParameterType(new ParameterType('css-color', /red|blue|yellow/, CssColor, (s) => new CssColor(s), true, false)); + assert.strictEqual(new CucumberExpression('I have a {css-color} ball', parameterTypeRegistry) + .match('I have a blue ball')?.[0] + .getValue(null)?.constructor, CssColor); + assert.strictEqual(new CucumberExpression('I have a {css-color} ball', parameterTypeRegistry) + .match('I have a blue ball')?.[0] + .getValue(null)?.name, 'blue'); + assert.strictEqual(new CucumberExpression('I have a {color} ball', parameterTypeRegistry) + .match('I have a blue ball')?.[0] + .getValue(null)?.constructor, Color); + assert.strictEqual(new CucumberExpression('I have a {color} ball', parameterTypeRegistry) + .match('I have a blue ball')?.[0] + .getValue(null)?.name, 'blue'); + }); + }); + // JavaScript-specific + it('creates arguments using async transform', async () => { + parameterTypeRegistry = new ParameterTypeRegistry(); + parameterTypeRegistry.defineParameterType(new ParameterType('asyncColor', /red|blue|yellow/, Color, async (s) => new Color(s), false, true)); + const expression = new CucumberExpression('I have a {asyncColor} ball', parameterTypeRegistry); + const args = expression.match('I have a red ball'); + const value = await args?.[0].getValue(null); + assert.strictEqual(value?.name, 'red'); + }); + }); + describe('RegularExpression', () => { + it('matches arguments with custom parameter type', () => { + const expression = new RegularExpression(/I have a (red|blue|yellow) ball/, parameterTypeRegistry); + const value = expression.match('I have a red ball')?.[0].getValue(null); + assert.strictEqual(value?.constructor, Color); + assert.strictEqual(value?.name, 'red'); + }); + }); +}); +//# sourceMappingURL=CustomParameterTypeTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CustomParameterTypeTest.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CustomParameterTypeTest.js.map new file mode 100644 index 00000000..ee66c8c7 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/CustomParameterTypeTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CustomParameterTypeTest.js","sourceRoot":"","sources":["../../../test/CustomParameterTypeTest.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ExpressionFactoryTest.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ExpressionFactoryTest.d.ts new file mode 100644 index 00000000..e96f5c0f --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ExpressionFactoryTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=ExpressionFactoryTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ExpressionFactoryTest.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ExpressionFactoryTest.d.ts.map new file mode 100644 index 00000000..31895988 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ExpressionFactoryTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ExpressionFactoryTest.d.ts","sourceRoot":"","sources":["../../../test/ExpressionFactoryTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ExpressionFactoryTest.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ExpressionFactoryTest.js new file mode 100644 index 00000000..ecbff0c6 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ExpressionFactoryTest.js @@ -0,0 +1,18 @@ +import * as assert from 'assert'; +import CucumberExpression from '../src/CucumberExpression.js'; +import ExpressionFactory from '../src/ExpressionFactory.js'; +import ParameterTypeRegistry from '../src/ParameterTypeRegistry.js'; +import RegularExpression from '../src/RegularExpression.js'; +describe('ExpressionFactory', () => { + let expressionFactory; + beforeEach(() => { + expressionFactory = new ExpressionFactory(new ParameterTypeRegistry()); + }); + it('creates a RegularExpression', () => { + assert.strictEqual(expressionFactory.createExpression(/x/).constructor, RegularExpression); + }); + it('creates a CucumberExpression', () => { + assert.strictEqual(expressionFactory.createExpression('x').constructor, CucumberExpression); + }); +}); +//# sourceMappingURL=ExpressionFactoryTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ExpressionFactoryTest.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ExpressionFactoryTest.js.map new file mode 100644 index 00000000..4ed228b9 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ExpressionFactoryTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ExpressionFactoryTest.js","sourceRoot":"","sources":["../../../test/ExpressionFactoryTest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAA;AAEhC,OAAO,kBAAkB,MAAM,8BAA8B,CAAA;AAC7D,OAAO,iBAAiB,MAAM,6BAA6B,CAAA;AAC3D,OAAO,qBAAqB,MAAM,iCAAiC,CAAA;AACnE,OAAO,iBAAiB,MAAM,6BAA6B,CAAA;AAE3D,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,iBAAoC,CAAA;IACxC,UAAU,CAAC,GAAG,EAAE;QACd,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,IAAI,qBAAqB,EAAE,CAAC,CAAA;IACxE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,WAAW,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAA;IAC5F,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,WAAW,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAA;IAC7F,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeRegistryTest.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeRegistryTest.d.ts new file mode 100644 index 00000000..5cd0c9cc --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeRegistryTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=ParameterTypeRegistryTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeRegistryTest.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeRegistryTest.d.ts.map new file mode 100644 index 00000000..c1402f0b --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeRegistryTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ParameterTypeRegistryTest.d.ts","sourceRoot":"","sources":["../../../test/ParameterTypeRegistryTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeRegistryTest.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeRegistryTest.js new file mode 100644 index 00000000..caf76b41 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeRegistryTest.js @@ -0,0 +1,49 @@ +import assert from 'assert'; +import ParameterType from '../src/ParameterType.js'; +import ParameterTypeRegistry from '../src/ParameterTypeRegistry.js'; +class Name { + name; + constructor(name) { + this.name = name; + } +} +class Person { + name; + constructor(name) { + this.name = name; + } +} +class Place { + name; + constructor(name) { + this.name = name; + } +} +const CAPITALISED_WORD = /[A-Z]+\w+/; +describe('ParameterTypeRegistry', () => { + let registry; + beforeEach(() => { + registry = new ParameterTypeRegistry(); + }); + it('does not allow more than one preferential parameter type for each regexp', () => { + registry.defineParameterType(new ParameterType('name', CAPITALISED_WORD, Name, (s) => new Name(s), true, true)); + registry.defineParameterType(new ParameterType('person', CAPITALISED_WORD, Person, (s) => new Person(s), true, false)); + try { + registry.defineParameterType(new ParameterType('place', CAPITALISED_WORD, Place, (s) => new Place(s), true, true)); + throw new Error('Should have failed'); + } + catch (err) { + assert.strictEqual(err.message, `There can only be one preferential parameter type per regexp. The regexp ${CAPITALISED_WORD} is used for two preferential parameter types, {name} and {place}`); + } + }); + it('looks up preferential parameter type by regexp', () => { + const name = new ParameterType('name', /[A-Z]+\w+/, null, (s) => new Name(s), true, false); + const person = new ParameterType('person', /[A-Z]+\w+/, null, (s) => new Person(s), true, true); + const place = new ParameterType('place', /[A-Z]+\w+/, null, (s) => new Place(s), true, false); + registry.defineParameterType(name); + registry.defineParameterType(person); + registry.defineParameterType(place); + assert.strictEqual(registry.lookupByRegexp('[A-Z]+\\w+', /([A-Z]+\w+) and ([A-Z]+\w+)/, 'Lisa and Bob'), person); + }); +}); +//# sourceMappingURL=ParameterTypeRegistryTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeRegistryTest.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeRegistryTest.js.map new file mode 100644 index 00000000..80f3a27d --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeRegistryTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ParameterTypeRegistryTest.js","sourceRoot":"","sources":["../../../test/ParameterTypeRegistryTest.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAE3B,OAAO,aAAa,MAAM,yBAAyB,CAAA;AACnD,OAAO,qBAAqB,MAAM,iCAAiC,CAAA;AAEnE,MAAM,IAAI;IACoB;IAA5B,YAA4B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;CAC7C;AACD,MAAM,MAAM;IACkB;IAA5B,YAA4B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;CAC7C;AACD,MAAM,KAAK;IACmB;IAA5B,YAA4B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;CAC7C;AAED,MAAM,gBAAgB,GAAG,WAAW,CAAA;AAEpC,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAI,QAA+B,CAAA;IACnC,UAAU,CAAC,GAAG,EAAE;QACd,QAAQ,GAAG,IAAI,qBAAqB,EAAE,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,QAAQ,CAAC,mBAAmB,CAC1B,IAAI,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAClF,CAAA;QACD,QAAQ,CAAC,mBAAmB,CAC1B,IAAI,aAAa,CAAC,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CACzF,CAAA;QACD,IAAI,CAAC;YACH,QAAQ,CAAC,mBAAmB,CAC1B,IAAI,aAAa,CAAC,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CACrF,CAAA;YACD,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,WAAW,CAChB,GAAG,CAAC,OAAO,EACX,4EAA4E,gBAAgB,mEAAmE,CAChK,CAAA;QACH,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,IAAI,GAAG,IAAI,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;QAC1F,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QAC/F,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;QAE7F,QAAQ,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAA;QAClC,QAAQ,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAA;QACpC,QAAQ,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAA;QAEnC,MAAM,CAAC,WAAW,CAChB,QAAQ,CAAC,cAAc,CAAC,YAAY,EAAE,6BAA6B,EAAE,cAAc,CAAC,EACpF,MAAM,CACP,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeTest.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeTest.d.ts new file mode 100644 index 00000000..1d9d221f --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=ParameterTypeTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeTest.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeTest.d.ts.map new file mode 100644 index 00000000..745f4bd9 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ParameterTypeTest.d.ts","sourceRoot":"","sources":["../../../test/ParameterTypeTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeTest.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeTest.js new file mode 100644 index 00000000..cf1ee131 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeTest.js @@ -0,0 +1,27 @@ +import * as assert from 'assert'; +import ParameterType from '../src/ParameterType.js'; +import ParameterTypeRegistry from '../src/ParameterTypeRegistry.js'; +describe('ParameterType', () => { + it('does not allow ignore flag on regexp', () => { + assert.throws(() => new ParameterType('case-insensitive', /[a-z]+/i, String, (s) => s, true, true), { message: "ParameterType Regexps can't use flag 'i'" }); + }); + it('has a type name for {int}', () => { + const r = new ParameterTypeRegistry(); + const t = r.lookupByTypeName('int'); + // @ts-ignore + assert.strictEqual(t.type.name, 'Number'); + }); + it('has a type name for {bigint}', () => { + const r = new ParameterTypeRegistry(); + const t = r.lookupByTypeName('biginteger'); + // @ts-ignore + assert.strictEqual(t.type.name, 'BigInt'); + }); + it('has a type name for {word}', () => { + const r = new ParameterTypeRegistry(); + const t = r.lookupByTypeName('word'); + // @ts-ignore + assert.strictEqual(t.type.name, 'String'); + }); +}); +//# sourceMappingURL=ParameterTypeTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeTest.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeTest.js.map new file mode 100644 index 00000000..153f6a49 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/ParameterTypeTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ParameterTypeTest.js","sourceRoot":"","sources":["../../../test/ParameterTypeTest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAA;AAEhC,OAAO,aAAa,MAAM,yBAAyB,CAAA;AACnD,OAAO,qBAAqB,MAAM,iCAAiC,CAAA;AAEnE,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,IAAI,aAAa,CAAC,kBAAkB,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,EACpF,EAAE,OAAO,EAAE,0CAA0C,EAAE,CACxD,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,GAAG,IAAI,qBAAqB,EAAE,CAAA;QACrC,MAAM,CAAC,GAAG,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAE,CAAA;QACpC,aAAa;QACb,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,GAAG,IAAI,qBAAqB,EAAE,CAAA;QACrC,MAAM,CAAC,GAAG,CAAC,CAAC,gBAAgB,CAAC,YAAY,CAAE,CAAA;QAC3C,aAAa;QACb,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,GAAG,IAAI,qBAAqB,EAAE,CAAA;QACrC,MAAM,CAAC,GAAG,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAE,CAAA;QACrC,aAAa;QACb,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/RegularExpressionTest.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/RegularExpressionTest.d.ts new file mode 100644 index 00000000..92e9ce8f --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/RegularExpressionTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=RegularExpressionTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/RegularExpressionTest.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/RegularExpressionTest.d.ts.map new file mode 100644 index 00000000..f3a8391e --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/RegularExpressionTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"RegularExpressionTest.d.ts","sourceRoot":"","sources":["../../../test/RegularExpressionTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/RegularExpressionTest.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/RegularExpressionTest.js new file mode 100644 index 00000000..b369e291 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/RegularExpressionTest.js @@ -0,0 +1,81 @@ +import assert from 'assert'; +import fs from 'fs'; +import { glob } from 'glob'; +import yaml from 'js-yaml'; +import ParameterTypeRegistry from '../src/ParameterTypeRegistry.js'; +import RegularExpression from '../src/RegularExpression.js'; +import { testDataDir } from './testDataDir.js'; +describe('RegularExpression', () => { + for (const path of glob.sync(`${testDataDir}/regular-expression/matching/*.yaml`)) { + const expectation = yaml.load(fs.readFileSync(path, 'utf-8')); + it(`matches ${path}`, () => { + const parameterTypeRegistry = new ParameterTypeRegistry(); + const expression = new RegularExpression(new RegExp(expectation.expression), parameterTypeRegistry); + const matches = expression.match(expectation.text); + assert.deepStrictEqual(JSON.parse(JSON.stringify(matches ? matches.map((value) => value.getValue(null)) : null)), // Removes type information. + expectation.expected_args); + }); + } + it('does no transform by default', () => { + assert.deepStrictEqual(match(/(\d\d)/, '22'), ['22']); + }); + it('does not transform anonymous', () => { + assert.deepStrictEqual(match(/(.*)/, '22'), ['22']); + }); + it('transforms negative int', () => { + assert.deepStrictEqual(match(/(-?\d+)/, '-22'), [-22]); + }); + it('transforms positive int', () => { + assert.deepStrictEqual(match(/(\d+)/, '22'), [22]); + }); + it('returns null when there is no match', () => { + assert.strictEqual(match(/hello/, 'world'), null); + }); + it('matches empty string', () => { + assert.deepStrictEqual(match(/^The value equals "([^"]*)"$/, 'The value equals ""'), ['']); + }); + it('matches nested capture group without match', () => { + assert.deepStrictEqual(match(/^a user( named "([^"]*)")?$/, 'a user'), [null]); + }); + it('matches nested capture group with match', () => { + assert.deepStrictEqual(match(/^a user( named "([^"]*)")?$/, 'a user named "Charlie"'), [ + 'Charlie', + ]); + }); + it('matches capture group nested in optional one', () => { + const regexp = /^a (pre-commercial transaction |pre buyer fee model )?purchase(?: for \$(\d+))?$/; + assert.deepStrictEqual(match(regexp, 'a purchase'), [null, null]); + assert.deepStrictEqual(match(regexp, 'a purchase for $33'), [null, 33]); + assert.deepStrictEqual(match(regexp, 'a pre buyer fee model purchase'), [ + 'pre buyer fee model ', + null, + ]); + }); + it('ignores non capturing groups', () => { + assert.deepStrictEqual(match(/(\S+) ?(can|cannot)? (?:delete|cancel) the (\d+)(?:st|nd|rd|th) (attachment|slide) ?(?:upload)?/, 'I can cancel the 1st slide upload'), ['I', 'can', 1, 'slide']); + }); + it('works with escaped parenthesis', () => { + assert.deepStrictEqual(match(/Across the line\(s\)/, 'Across the line(s)'), []); + }); + it('exposes regexp and source', () => { + const regexp = /I have (\d+) cukes? in my (.+) now/; + const expression = new RegularExpression(regexp, new ParameterTypeRegistry()); + assert.deepStrictEqual(expression.regexp, regexp); + assert.deepStrictEqual(expression.source, regexp.source); + }); + it('does not take consider parenthesis in character class as group', function () { + const expression = new RegularExpression(/^drawings: ([A-Z_, ()]+)$/, new ParameterTypeRegistry()); + const args = expression.match('drawings: ONE, TWO(ABC)'); + assert.strictEqual(args[0].getValue(this), 'ONE, TWO(ABC)'); + }); +}); +const match = (regexp, text) => { + const parameterRegistry = new ParameterTypeRegistry(); + const regularExpression = new RegularExpression(regexp, parameterRegistry); + const args = regularExpression.match(text); + if (!args) { + return null; + } + return args.map((arg) => arg.getValue(null)); +}; +//# sourceMappingURL=RegularExpressionTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/RegularExpressionTest.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/RegularExpressionTest.js.map new file mode 100644 index 00000000..15206ecd --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/RegularExpressionTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"RegularExpressionTest.js","sourceRoot":"","sources":["../../../test/RegularExpressionTest.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/TreeRegexpTest.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/TreeRegexpTest.d.ts new file mode 100644 index 00000000..396124aa --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/TreeRegexpTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=TreeRegexpTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/TreeRegexpTest.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/TreeRegexpTest.d.ts.map new file mode 100644 index 00000000..240c5f41 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/TreeRegexpTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"TreeRegexpTest.d.ts","sourceRoot":"","sources":["../../../test/TreeRegexpTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/TreeRegexpTest.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/TreeRegexpTest.js new file mode 100644 index 00000000..097943dc --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/TreeRegexpTest.js @@ -0,0 +1,126 @@ +import assert from 'assert'; +import TreeRegexp from '../src/TreeRegexp.js'; +describe('TreeRegexp', () => { + it('exposes group source', () => { + const tr = new TreeRegexp(/(a(?:b)?)(c)/); + assert.deepStrictEqual(tr.groupBuilder.children.map((gb) => gb.source), ['a(?:b)?', 'c']); + }); + it('builds tree', () => { + const tr = new TreeRegexp(/(a(?:b)?)(c)/); + const group = tr.match('ac'); + assert.strictEqual(group.value, 'ac'); + assert.strictEqual(group.children?.[0].value, 'a'); + assert.deepStrictEqual(group.children[0].children, undefined); + assert.strictEqual(group.children[1].value, 'c'); + }); + it('ignores `?:` as a non-capturing group', () => { + const tr = new TreeRegexp(/a(?:b)(c)/); + const group = tr.match('abc'); + assert.strictEqual(group.value, 'abc'); + assert.strictEqual(group.children?.length, 1); + }); + it('ignores `?!` as a non-capturing group', () => { + const tr = new TreeRegexp(/a(?!b)(.+)/); + const group = tr.match('aBc'); + assert.strictEqual(group.value, 'aBc'); + assert.strictEqual(group.children?.length, 1); + }); + it('ignores `?=` as a non-capturing group', () => { + const tr = new TreeRegexp(/a(?=[b])(.+)/); + const group = tr.match('abc'); + assert.strictEqual(group.value, 'abc'); + assert.strictEqual(group.children?.length, 1); + assert.strictEqual(group.children[0].value, 'bc'); + }); + it('ignores `?<=` as a non-capturing group', () => { + const tr = new TreeRegexp(/a(.+)(?<=c)$/); + const group = tr.match('abc'); + assert.strictEqual(group.value, 'abc'); + assert.strictEqual(group.children?.length, 1); + assert.strictEqual(group.children[0].value, 'bc'); + }); + it('ignores `? { + const tr = new TreeRegexp(/a(.+?)(? { + const tr = new TreeRegexp(/a(?b)c/); + const group = tr.match('abc'); + assert.strictEqual(group.value, 'abc'); + assert.strictEqual(group.children?.length, 1); + assert.strictEqual(group.children[0].value, 'b'); + }); + it('matches optional group', () => { + const tr = new TreeRegexp(/^Something( with an optional argument)?/); + const group = tr.match('Something'); + assert.strictEqual(group.children?.[0].value, undefined); + }); + it('matches nested groups', () => { + const tr = new TreeRegexp(/^A (\d+) thick line from ((\d+),\s*(\d+),\s*(\d+)) to ((\d+),\s*(\d+),\s*(\d+))/); + const group = tr.match('A 5 thick line from 10,20,30 to 40,50,60'); + assert.strictEqual(group.children?.[0].value, '5'); + assert.strictEqual(group.children?.[1].value, '10,20,30'); + assert.strictEqual(group.children?.[1].children?.[0].value, '10'); + assert.strictEqual(group.children?.[1].children?.[1].value, '20'); + assert.strictEqual(group.children?.[1].children?.[2].value, '30'); + assert.strictEqual(group.children?.[2].value, '40,50,60'); + assert.strictEqual(group.children?.[2].children?.[0].value, '40'); + assert.strictEqual(group.children?.[2].children?.[1].value, '50'); + assert.strictEqual(group.children?.[2].children?.[2].value, '60'); + }); + it('detects multiple non capturing groups', () => { + const tr = new TreeRegexp(/(?:a)(:b)(\?c)(d)/); + const group = tr.match('a:b?cd'); + assert.strictEqual(group.children?.length, 3); + }); + it('works with escaped backslash', () => { + const tr = new TreeRegexp(/foo\\(bar|baz)/); + const group = tr.match('foo\\bar'); + assert.strictEqual(group.children?.length, 1); + }); + it('works with escaped slash', () => { + const tr = new TreeRegexp(/^I go to '\/(.+)'$/); + const group = tr.match("I go to '/hello'"); + assert.strictEqual(group.children?.length, 1); + }); + it('works with digit and word', () => { + const tr = new TreeRegexp(/^(\d) (\w+)$/); + const group = tr.match('2 you'); + assert.strictEqual(group.children?.length, 2); + }); + it('captures non capturing groups with capturing groups inside', () => { + const tr = new TreeRegexp('the stdout(?: from "(.*?)")?'); + const group = tr.match('the stdout'); + assert.strictEqual(group.value, 'the stdout'); + assert.strictEqual(group.children?.[0].value, undefined); + assert.strictEqual(group.children?.length, 1); + }); + it('works with case insensitive flag', () => { + const tr = new TreeRegexp(/HELLO/i); + const group = tr.match('hello'); + assert.strictEqual(group.value, 'hello'); + }); + it('empty capturing group', () => { + const tr = new TreeRegexp(/()/); + const group = tr.match(''); + assert.strictEqual(group.value, ''); + assert.strictEqual(group.children?.length, 1); + }); + it('empty look ahead', () => { + const tr = new TreeRegexp(/(?<=)/); + const group = tr.match(''); + assert.strictEqual(group.value, ''); + assert.strictEqual(group.children, undefined); + }); + it('does not consider parenthesis in character class as group', () => { + const tr = new TreeRegexp(/^drawings: ([A-Z, ()]+)$/); + const group = tr.match('drawings: ONE(TWO)'); + assert.strictEqual(group.value, 'drawings: ONE(TWO)'); + assert.strictEqual(group.children?.length, 1); + assert.strictEqual(group.children[0].value, 'ONE(TWO)'); + }); +}); +//# sourceMappingURL=TreeRegexpTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/TreeRegexpTest.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/TreeRegexpTest.js.map new file mode 100644 index 00000000..16846228 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/TreeRegexpTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TreeRegexpTest.js","sourceRoot":"","sources":["../../../test/TreeRegexpTest.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAE3B,OAAO,UAAU,MAAM,sBAAsB,CAAA;AAE7C,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,cAAc,CAAC,CAAA;QACzC,MAAM,CAAC,eAAe,CACpB,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,EAC/C,CAAC,SAAS,EAAE,GAAG,CAAC,CACjB,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE;QACrB,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,cAAc,CAAC,CAAA;QACzC,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAE,CAAA;QAC7B,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QACrC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAClD,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;QAC7D,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAA;QACtC,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAE,CAAA;QAC9B,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;QACtC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC,CAAA;QACvC,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAE,CAAA;QAC9B,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;QACtC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,cAAc,CAAC,CAAA;QACzC,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAE,CAAA;QAC9B,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;QACtC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;QAC7C,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,cAAc,CAAC,CAAA;QACzC,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAE,CAAA;QAC9B,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;QACtC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;QAC7C,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,eAAe,CAAC,CAAA;QAC1C,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAE,CAAA;QAC9B,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;QACtC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;QAC7C,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,cAAc,CAAC,CAAA;QACzC,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAE,CAAA;QAC9B,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;QACtC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;QAC7C,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,yCAAyC,CAAC,CAAA;QACpE,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,CAAE,CAAA;QACpC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;IAC1D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,EAAE,GAAG,IAAI,UAAU,CACvB,iFAAiF,CAClF,CAAA;QACD,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,0CAA0C,CAAE,CAAA;QAEnE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAClD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;QACzD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QACjE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QACjE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QACjE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;QACzD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QACjE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QACjE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IACnE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,mBAAmB,CAAC,CAAA;QAC9C,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAE,CAAA;QACjC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,gBAAgB,CAAC,CAAA;QAC3C,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,CAAE,CAAA;QACnC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,oBAAoB,CAAC,CAAA;QAC/C,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAE,CAAA;QAC3C,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,cAAc,CAAC,CAAA;QACzC,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAE,CAAA;QAChC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,8BAA8B,CAAC,CAAA;QACzD,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,CAAE,CAAA;QACrC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,YAAY,CAAC,CAAA;QAC7C,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;QACxD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAA;QACnC,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAE,CAAA;QAChC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAA;QAC/B,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,CAAE,CAAA;QAC3B,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QACnC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC1B,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,CAAA;QAClC,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,CAAE,CAAA;QAC3B,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QACnC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,0BAA0B,CAAC,CAAA;QACrD,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAE,CAAA;QAC7C,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAA;QACrD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;QAC7C,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;IACzD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/testDataDir.d.ts b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/testDataDir.d.ts new file mode 100644 index 00000000..d1ff6beb --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/testDataDir.d.ts @@ -0,0 +1,2 @@ +export declare const testDataDir: string; +//# sourceMappingURL=testDataDir.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/testDataDir.d.ts.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/testDataDir.d.ts.map new file mode 100644 index 00000000..8e3eda32 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/testDataDir.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"testDataDir.d.ts","sourceRoot":"","sources":["../../../test/testDataDir.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,QAAkE,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/testDataDir.js b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/testDataDir.js new file mode 100644 index 00000000..5e11eb03 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/testDataDir.js @@ -0,0 +1,2 @@ +export const testDataDir = process.env.CUCUMBER_EXPRESSIONS_TEST_DATA_DIR || '../testdata'; +//# sourceMappingURL=testDataDir.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/test/testDataDir.js.map b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/testDataDir.js.map new file mode 100644 index 00000000..76559cbc --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/test/testDataDir.js.map @@ -0,0 +1 @@ +{"version":3,"file":"testDataDir.js","sourceRoot":"","sources":["../../../test/testDataDir.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,kCAAkC,IAAI,aAAa,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/dist/esm/tsconfig.build-esm.tsbuildinfo b/node_modules/@cucumber/cucumber-expressions/dist/esm/tsconfig.build-esm.tsbuildinfo new file mode 100644 index 00000000..9b55229c --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/dist/esm/tsconfig.build-esm.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../src/CucumberExpressionError.ts","../../src/Group.ts","../../src/ParameterType.ts","../../src/Argument.ts","../../src/Ast.ts","../../src/types.ts","../../src/GeneratedExpression.ts","../../src/CombinatorialGeneratedExpressionFactory.ts","../../src/Errors.ts","../../src/CucumberExpressionTokenizer.ts","../../src/CucumberExpressionParser.ts","../../src/ParameterTypeMatcher.ts","../../src/CucumberExpressionGenerator.ts","../../src/defineDefaultParameterTypes.ts","../../src/ParameterTypeRegistry.ts","../../node_modules/regexp-match-indices/types.d.ts","../../node_modules/regexp-match-indices/index.d.ts","../../src/GroupBuilder.ts","../../src/TreeRegexp.ts","../../src/CucumberExpression.ts","../../src/RegularExpression.ts","../../src/ExpressionFactory.ts","../../src/index.ts","../../test/ArgumentTest.ts","../../test/CombinatorialGeneratedExpressionFactoryTest.ts","../../test/CucumberExpressionGeneratorTest.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/@types/node/web-globals/events.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/inspector.generated.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/minipass/dist/commonjs/index.d.ts","../../node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.d.ts","../../node_modules/path-scurry/dist/commonjs/index.d.ts","../../node_modules/glob/node_modules/minimatch/dist/commonjs/ast.d.ts","../../node_modules/glob/node_modules/minimatch/dist/commonjs/escape.d.ts","../../node_modules/glob/node_modules/minimatch/dist/commonjs/unescape.d.ts","../../node_modules/glob/node_modules/minimatch/dist/commonjs/index.d.ts","../../node_modules/glob/dist/commonjs/pattern.d.ts","../../node_modules/glob/dist/commonjs/processor.d.ts","../../node_modules/glob/dist/commonjs/walker.d.ts","../../node_modules/glob/dist/commonjs/ignore.d.ts","../../node_modules/glob/dist/commonjs/glob.d.ts","../../node_modules/glob/dist/commonjs/has-magic.d.ts","../../node_modules/glob/dist/commonjs/index.d.ts","../../node_modules/@types/js-yaml/index.d.ts","../../test/testDataDir.ts","../../test/CucumberExpressionParserTest.ts","../../test/CucumberExpressionTest.ts","../../test/CucumberExpressionTokenizerTest.ts","../../test/CucumberExpressionTransformationTest.ts","../../test/CustomParameterTypeTest.ts","../../test/ExpressionFactoryTest.ts","../../test/ParameterTypeRegistryTest.ts","../../test/ParameterTypeTest.ts","../../test/RegularExpressionTest.ts","../../test/TreeRegexpTest.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/json5/index.d.ts","../../node_modules/@types/mocha/index.d.ts"],"fileIdsList":[[89,137,154,155],[89,134,135,137,154,155],[89,136,137,154,155],[137,154,155],[89,137,142,154,155,172],[89,137,138,143,148,154,155,157,169,180],[89,137,138,139,148,154,155,157],[84,85,86,89,137,154,155],[89,137,140,154,155,181],[89,137,141,142,149,154,155,158],[89,137,142,154,155,169,177],[89,137,143,145,148,154,155,157],[89,136,137,144,154,155],[89,137,145,146,154,155],[89,137,147,148,154,155],[89,136,137,148,154,155],[89,137,148,149,150,154,155,169,180],[89,137,148,149,150,154,155,164,169,172],[89,130,137,145,148,151,154,155,157,169,180],[89,137,148,149,151,152,154,155,157,169,177,180],[89,137,151,153,154,155,169,177,180],[87,88,89,90,91,92,93,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186],[89,137,148,154,155],[89,137,154,155,156,180],[89,137,145,148,154,155,157,169],[89,137,154,155,158],[89,137,154,155,159],[89,136,137,154,155,160],[89,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186],[89,137,154,155,162],[89,137,154,155,163],[89,137,148,154,155,164,165],[89,137,154,155,164,166,181,183],[89,137,149,154,155],[89,137,148,154,155,169,170,172],[89,137,154,155,171,172],[89,137,154,155,169,170],[89,137,154,155,172],[89,137,154,155,173],[89,134,137,154,155,169,174],[89,137,148,154,155,175,176],[89,137,154,155,175,176],[89,137,142,154,155,157,169,177],[89,137,154,155,178],[89,137,154,155,157,179],[89,137,151,154,155,163,180],[89,137,142,154,155,181],[89,137,154,155,169,182],[89,137,154,155,156,183],[89,137,154,155,184],[89,130,137,154,155],[89,130,137,148,150,154,155,160,169,172,180,182,183,185],[89,137,154,155,169,186],[89,137,154,155,188,190,194,195,198],[89,137,154,155,199],[89,137,154,155,190,194,197],[89,137,154,155,188,190,194,197,198,199,200],[89,137,154,155,194],[89,137,154,155,190,194,195,197],[89,137,154,155,188,190,195,196,198],[89,137,154,155,191,192,193],[89,137,148,154,155,173,187],[89,137,149,154,155,159,188,189],[73,89,137,154,155],[89,102,106,137,154,155,180],[89,102,137,154,155,169,180],[89,97,137,154,155],[89,99,102,137,154,155,177,180],[89,137,154,155,157,177],[89,137,154,155,187],[89,97,137,154,155,187],[89,99,102,137,154,155,157,180],[89,94,95,98,101,137,148,154,155,169,180],[89,102,109,137,154,155],[89,94,100,137,154,155],[89,102,123,124,137,154,155],[89,98,102,137,154,155,172,180,187],[89,123,137,154,155,187],[89,96,97,137,154,155,187],[89,102,137,154,155],[89,96,97,98,99,100,101,102,103,104,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,137,154,155],[89,102,117,137,154,155],[89,102,109,110,137,154,155],[89,100,102,110,111,137,154,155],[89,101,137,154,155],[89,94,97,102,137,154,155],[89,102,106,110,111,137,154,155],[89,106,137,154,155],[89,100,102,105,137,154,155,180],[89,94,99,102,109,137,154,155],[89,137,154,155,169],[89,97,102,123,137,154,155,185,187],[58,59,60,89,137,154,155],[60,64,89,137,154,155],[58,60,61,62,63,66,68,72,76,89,137,154,155],[60,64,65,69,89,137,154,155],[62,66,67,89,137,154,155],[62,66,89,137,154,155],[58,60,62,64,89,137,154,155],[63,72,77,78,89,137,154,155],[60,63,89,137,154,155],[59,74,89,137,154,155],[58,89,137,154,155],[60,89,137,154,155],[58,60,63,66,70,71,89,137,154,155],[60,61,63,72,76,89,137,154,155],[59,74,75,89,137,154,155],[59,60,61,62,63,64,70,72,77,78,79,89,137,154,155],[60,61,89,137,154,155],[61,72,76,89,134,137,154,155],[60,65,89,134,137,154,155],[60,63,70,72,77,89,134,137,154,155],[58,68,89,134,137,149,154,155,201,202,203],[58,60,72,77,89,134,137,149,154,155,201,202,203],[58,67,89,134,137,149,154,155,201,202,203],[72,77,89,134,137,149,154,155,201,202,203],[60,72,77,78,89,134,137,154,155],[72,77,78,79,89,134,137,154,155],[60,72,89,134,137,154,155],[72,78,89,134,137,149,154,155,201,202,203],[76,89,134,137,154,155]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"06da0313a696d2e58f6a6addb168a1faa1407045975ff672d492b233e0d03d18","signature":"e19e037d802f1c50c9342228dd2efc1588da9c715c091b7eadc0162c8503d967"},{"version":"9ede140de3bd446edc8f0504efc8dd890233bff149e3e391d9bc4d9aa9d90b26","signature":"24ef89d81df156d80bde512dd17090b7d27d09020287f28760ac078be9bebf4c"},{"version":"c7df0f4ab2534847f922c0ebf91a9e4ee33e4bd4164027ccbd5e27175e35519d","signature":"57490d02476c72fe9cae1b34584e123676a0348dea80e4812a4e250c52c38468"},{"version":"48b35c8418e69a7860c9de016a31d6182a4ea0e6d8b7a76eecb147c35800385f","signature":"b95293f52864ea44926cb1d1e32b48b68b8b332458da73c58b1e987571158974"},{"version":"a39b2332d4b3b34a0bc15ede317e26df01db21ca91ed5b65d46d01959d1c5b96","signature":"dd82562bcc9bed49db1280d7df870c4b820b5a5919298dc1e3f1eb1d739224ba"},{"version":"3ff166ec4e9b528423ee62aac60c9ac8be821e7bf4518ce90a4700c9b21258e7","signature":"6726ccf9600c6d389280f6ea05c73aee451921d77cb5a3bb49bbbaf86b0a38fa"},{"version":"6f1bd6cf08275bee0efc51828ba69467f323b9d50fb452b3a16d4efd9db60921","signature":"c1dd30504a69bd635e607aaf09b8fda675d27695b625968e13abbbe48917481f"},{"version":"4e7ac7085ebf893ed30952e9d2f2b4d5c377bf23f27d3a13b592e81e501a7a15","signature":"0eb46bea5c59364676679c8c4a83284a9fefecb1b77dcef37063001e6635ddd2"},{"version":"15050d75e57b9c0c7af24607306345edc2a754d13226ff0660c6f27e9513877b","signature":"5bdd2ecd3a23eb6ea616dbde6af2f8ce53e6a475d71702be34c3507373e482ab"},{"version":"02ceec18f2977ea36bec3811ce368fc98e06fff7cb0b11d7c9643209353990d2","signature":"2138c76a0f136863b80ffe260c911617b4005089249d69c73852c125bc8d9ab4"},{"version":"92c2ef0cae2f23efbfe8297128ad0e7afb966180a190e45ebc235971e5095166","signature":"ee114ff5f88e7ee60e64b3161a1ee0579a7d04e0558c82af84788f38996f3f81"},{"version":"3f1f10e6e19a5b539236e29ef5d8318d23d2a67af3223dd0d9ca946da46aef6f","signature":"c5ad640bad7e50aad9f2557b75f64343104edf224ec3ceda26bb12c8a4a84afe"},{"version":"3216975032fc1c8bfbb5cec14b889253b161f9d07be73656cb04b4bff823d2a7","signature":"82d252437544aa799caa000db1444f0b7c98db797c2afaab02942e0a073a47d5"},{"version":"be7b6e29bef5c9d2f26580920f5cb7aeee545797ef3e46dc2e566c9459141c6c","signature":"4398e3d5a86dbe1dc3402c571726c7628955c6300fc653cdf0746780c961c957"},{"version":"690a8b7244f18c8eba19571af5c7be77515b7d751cfedebafc68dc017f06655e","signature":"8cff33b8ea70c630b18f450058ef452f0f0e1a90729cb370c41caab99e498af4"},{"version":"9aa137f97595ff06582fdb09968f1e5fb52f95cb908c6698f462898f82a0bba6","impliedFormat":1},{"version":"b3f65f9c303e875847a2fbe493a34cffdb670370f9d4fd45454f4d80f8077e92","impliedFormat":1},{"version":"cacf93178175c185d8029588737861735bc326aaefb9a5a41f16f117475d8c57","signature":"28e640b5eec581a031f5ae17928fd1bfcaabd3a724b720ee9f8a92af8c351001"},{"version":"f63cb2e3ab889485ee76b4c582af1e1dc68141def643c863072bcc3ce474e598","signature":"50427d3f68d0d5587ce95805b1a305cb644eabd24581b7b5174290bbbe99275a"},{"version":"929e9d63cbd3f3ffd9dc5b5cb42584eeba8d74213ae2c73db2593b1f1cd3204f","signature":"b69216b9607b65105ec37d75b761a66b89302243f6ff8973cb3a04cb44f10919"},{"version":"ee3cfcd57f3fd496857657db2cba3fe23b44a33208be1da2fefeae1737b59566","signature":"c917934380703484415937e8b21b1d797c413728825d2091ddfbd6df615a6e1e"},{"version":"251936125619b35babf300d0fca313df31be9f4ffb5d08ec9f79e11f5f318175","signature":"4bc26751aef71adea01a2c9cc13edf25f0c49d4c8840f4923b31eb34141d2f99"},{"version":"b7472159e705d18142777b49b2cb366fd47ff02f1eec67c1ca348a3823eb7dd5","signature":"73a104ea71e78302bb48a144e71aaef7df820cdbfa3446ffe12ad8315df8c1f3"},{"version":"4ab1230aa0c2d915e82587964b57b233a9eb1445c833550f5d55c62840f92069","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"66d910a4c1cdc79314fdeecf414e2b28527d1ff83191a1afce484b5d2c75e082","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"7bd1d50838e19b47cdf378b8925153d89d66cc9294a84162e79b48d94ca59d83","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"2cbe0621042e2a68c7cbce5dfed3906a1862a16a7d496010636cdbdb91341c0f","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"bb45cd435da536500f1d9692a9b49d0c570b763ccbf00473248b777f5c1f353b","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"83e63d6ccf8ec004a3bb6d58b9bb0104f60e002754b1e968024b320730cc5311","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d2bc7425ef40526650d6db7e072c1ff4a51101c3ac2cc4b666623b19496a6e27","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"f27524f4bef4b6519c604bdb23bf4465bddcccbf3f003abb901acbd0d7404d99","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"dba28a419aec76ed864ef43e5f577a5c99a010c32e5949fe4e17a4d57c58dd11","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c959a391a75be9789b43c8468f71e3fa06488b4d691d5729dde1416dcd38225b","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"0dba70b3fb0dcd713fda33c2df64fa6751fff6460e536971cee917260fb17882","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"9f663c2f91127ef7024e8ca4b3b4383ff2770e5f826696005de382282794b127","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1},{"version":"041597c12abeaa2ef07766775955fc87cfc65c43e0fe86c836071bea787e967c","impliedFormat":1},{"version":"0838507efff4f479c6f603ec812810ddfe14ab32abf8f4a8def140be970fe439","impliedFormat":1},{"version":"072f583571d6e3d30cd9760ee3485d29484fb7b54ba772ac135c747a380096a1","impliedFormat":1},{"version":"7212c2d58855b8df35275180e97903a4b6093d4fbaefea863d8d028da63938c6","impliedFormat":1},{"version":"d8a6b3f899917210f00ddf13b564a2a4fdcf1e50c5a22e8d3abcfd4f1c4f9ae1","impliedFormat":1},{"version":"fd5eab954b31e761a72234031dadc3aab768763942a9637e380aed441cc94f59","impliedFormat":1},{"version":"c7aaac3119acf27e03190cc4224f1d81c7498cf6b36fa72d10d99f2c41d1bbc0","impliedFormat":1},{"version":"dd9faff42b456b5f03b85d8fbd64838eb92f6f7b03b36322cbc59c005b7033d3","impliedFormat":1},{"version":"6ff702721d87c0ba8e7f8950e7b0a3b009dfd912fab3997e0b63fab8d83919c3","impliedFormat":1},{"version":"9dce9fc12e9a79d1135699d525aa6b44b71a45e32e3fa0cf331060b980b16317","impliedFormat":1},{"version":"586b2fd8a7d582329658aaceec22f8a5399e05013deb49bcfde28f95f093c8ee","impliedFormat":1},{"version":"59c44b081724d4ab8039988aba34ee6b3bd41c30fc2d8686f4ed06588397b2f7","impliedFormat":1},{"version":"ef1f3eadd7bed282de45bafd7c2c00105cf1db93e22f6cd763bec8a9c2cf6df1","impliedFormat":1},{"version":"2b90463c902dbe4f5bbb9eae084c05de37477c17a5de1e342eb7cbc9410dc6a1","impliedFormat":1},{"version":"7a1dd1e9c8bf5e23129495b10718b280340c7500570e0cfe5cffcdee51e13e48","impliedFormat":1},{"version":"70eb87bf376ae18494fb327896dc04d556a65c41340a2f5b35d6e10cc7075afa","signature":"bd6640feffbb44ade7ce92bd1353f4ca41107af7bc1a05b290e1344854e60fcf"},{"version":"78c612ac6dd0b1ca0e84909ce3d1911b7d80770dfa8aa34958d2d649055b8f3c","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"546f00a65afbab43856de4ce377a216b46eb4a0561b92c1c1c045bc61664a14d","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"c9df1727c08e547a6868f4926623ed20ab46fe8d6785a1de752ea2893e521a48","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"3103fa8e4fc36db909e5d60d457c852ecffbfda0a59844fcaf5f4ad154259733","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"ff9e3afda6d0a0c4194f07192f026e04916ec75da062daf75507774e06554ec6","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"afc239b67160dbb808d7dbd7bb29ad575b5fbf1b89b95622a7eaef332f07c8c4","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"3b0142c0b79b03f4d0b2e585b1f1885313e6a736a70e8fde352acf2554220ca4","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"dcb32fa9db22b6581af2a8ea72302a7d9282bd09138069d875d88dc874abf506","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"a96d1dcfe2725b2438877eefe2be8e310aa56c387f6ba974f3e222e6a5f67254","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"9ad8981ef9c1e9c275f6a6e703761243664f43921d71ed6c5fb89ca50b0cc5bf","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"785b9d575b49124ce01b46f5b9402157c7611e6532effa562ac6aebec0074dfc","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","impliedFormat":1},{"version":"29f72ec1289ae3aeda78bf14b38086d3d803262ac13904b400422941a26a3636","affectsGlobalScope":true,"impliedFormat":1}],"root":[[58,72],[75,83],[203,213]],"options":{"allowJs":false,"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"declarationMap":true,"downlevelIteration":true,"esModuleInterop":true,"experimentalDecorators":true,"module":5,"noImplicitAny":true,"outDir":"./","rootDir":"../..","skipLibCheck":true,"sourceMap":true,"strictNullChecks":true,"target":9},"referencedMap":[[214,1],[202,1],[215,1],[216,1],[217,1],[134,2],[135,2],[136,3],[89,4],[137,5],[138,6],[139,7],[84,1],[87,8],[85,1],[86,1],[140,9],[141,10],[142,11],[143,12],[144,13],[145,14],[146,14],[147,15],[148,16],[149,17],[150,18],[90,1],[88,1],[151,19],[152,20],[153,21],[187,22],[154,23],[155,1],[156,24],[157,25],[158,26],[159,27],[160,28],[161,29],[162,30],[163,31],[164,32],[165,32],[166,33],[167,1],[168,34],[169,35],[171,36],[170,37],[172,38],[173,39],[174,40],[175,41],[176,42],[177,43],[178,44],[179,45],[180,46],[181,47],[182,48],[183,49],[184,50],[91,1],[92,1],[93,1],[131,51],[132,1],[133,1],[185,52],[186,53],[199,54],[200,55],[198,56],[201,57],[195,58],[196,59],[197,60],[191,58],[192,58],[194,61],[193,58],[188,62],[190,63],[189,1],[74,64],[73,1],[56,1],[57,1],[11,1],[10,1],[2,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[18,1],[19,1],[3,1],[20,1],[21,1],[4,1],[22,1],[26,1],[23,1],[24,1],[25,1],[27,1],[28,1],[29,1],[5,1],[30,1],[31,1],[32,1],[33,1],[6,1],[37,1],[34,1],[35,1],[36,1],[38,1],[7,1],[39,1],[44,1],[45,1],[40,1],[41,1],[42,1],[43,1],[8,1],[49,1],[46,1],[47,1],[48,1],[50,1],[9,1],[51,1],[52,1],[53,1],[55,1],[54,1],[1,1],[109,65],[119,66],[108,65],[129,67],[100,68],[99,69],[128,70],[122,71],[127,72],[102,73],[116,74],[101,75],[125,76],[97,77],[96,70],[126,78],[98,79],[103,80],[104,1],[107,80],[94,1],[130,81],[120,82],[111,83],[112,84],[114,85],[110,86],[113,87],[123,70],[105,88],[106,89],[115,90],[95,91],[118,82],[117,80],[121,1],[124,92],[61,93],[62,1],[65,94],[77,95],[58,1],[70,96],[68,97],[67,98],[66,99],[79,100],[64,101],[59,1],[75,102],[60,103],[69,104],[72,105],[78,106],[76,107],[71,101],[80,108],[63,109],[81,110],[82,111],[83,112],[204,113],[205,114],[206,115],[207,116],[208,117],[209,118],[210,119],[211,119],[212,120],[213,121],[203,1]],"latestChangedDtsFile":"./test/TreeRegexpTest.d.ts","version":"5.9.3"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber-expressions/package.json b/node_modules/@cucumber/cucumber-expressions/package.json new file mode 100644 index 00000000..d0ba192d --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/package.json @@ -0,0 +1,81 @@ +{ + "name": "@cucumber/cucumber-expressions", + "version": "19.0.0", + "description": "Cucumber Expressions - a simpler alternative to Regular Expressions", + "type": "module", + "main": "dist/cjs/src/index.js", + "types": "dist/cjs/src/index.d.ts", + "files": [ + "dist/cjs", + "dist/esm", + "src" + ], + "module": "dist/esm/src/index.js", + "jsnext:main": "dist/esm/src/index.js", + "exports": { + ".": { + "import": "./dist/esm/src/index.js", + "require": "./dist/cjs/src/index.js" + } + }, + "scripts": { + "build:cjs": "tsc --build tsconfig.build-cjs.json && cp package.cjs.json dist/cjs/package.json", + "build:esm": "tsc --build tsconfig.build-esm.json", + "build": "npm run build:cjs && npm run build:esm && cp ../README.md dist", + "test": "mocha && npm run test:cjs", + "test:cjs": "npm run build:cjs && mocha --no-config dist/cjs/test", + "stryker": "cross-env CUCUMBER_EXPRESSIONS_TEST_DATA_DIR=$(pwd)/../testdata stryker run", + "prepublishOnly": "npm run build", + "fix": "eslint --max-warnings 0 --fix src test && prettier --write src test", + "lint": "eslint --max-warnings 0 src test && prettier --check src test" + }, + "repository": { + "type": "git", + "url": "git://github.com/cucumber/cucumber-expressions.git" + }, + "keywords": [ + "cucumber", + "steps", + "regexp", + "regex" + ], + "author": "Cucumber Limited ", + "license": "MIT", + "bugs": { + "url": "https://github.com/cucumber/cucumber-expressions/issues" + }, + "homepage": "https://github.com/cucumber/cucumber-expressions#readme", + "devDependencies": { + "@eslint/compat": "^2.0.0", + "@eslint/eslintrc": "^3.3.0", + "@eslint/js": "^9.21.0", + "@stryker-mutator/core": "9.4.0", + "@stryker-mutator/mocha-runner": "9.4.0", + "@types/glob": "9.0.0", + "@types/js-yaml": "4.0.9", + "@types/mocha": "10.0.10", + "@types/node": "22.19.7", + "@typescript-eslint/eslint-plugin": "^8.43.0", + "@typescript-eslint/parser": "^8.43.0", + "cross-env": "10.1.0", + "esbuild": "0.27.2", + "eslint": "^9.21.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-n": "^17.15.1", + "eslint-plugin-simple-import-sort": "^12.1.1", + "glob": "13.0.0", + "globals": "^17.0.0", + "js-yaml": "4.1.1", + "mocha": "11.7.5", + "prettier": "^3.5.2", + "pretty-quick": "4.2.2", + "ts-node": "10.9.2", + "typescript": "5.9.3" + }, + "dependencies": { + "regexp-match-indices": "1.0.2" + }, + "directories": { + "test": "test" + } +} diff --git a/node_modules/@cucumber/cucumber-expressions/src/Argument.ts b/node_modules/@cucumber/cucumber-expressions/src/Argument.ts new file mode 100644 index 00000000..72d39141 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/src/Argument.ts @@ -0,0 +1,46 @@ +import CucumberExpressionError from './CucumberExpressionError.js' +import Group from './Group.js' +import ParameterType from './ParameterType.js' + +export default class Argument { + public static build( + group: Group, + parameterTypes: readonly ParameterType[] + ): readonly Argument[] { + const argGroups = group.children || [] + + if (argGroups.length !== parameterTypes.length) { + throw new CucumberExpressionError( + `Group has ${argGroups.length} capture groups (${argGroups.map( + (g) => g.value + )}), but there were ${parameterTypes.length} parameter types (${parameterTypes.map( + (p) => p.name + )})` + ) + } + + return parameterTypes.map((parameterType, i) => new Argument(argGroups[i], parameterType)) + } + + constructor( + public readonly group: Group, + public readonly parameterType: ParameterType + ) { + this.group = group + this.parameterType = parameterType + } + + /** + * Get the value returned by the parameter type's transformer function. + * + * @param thisObj the object in which the transformer function is applied. + */ + public getValue(thisObj: unknown): T | null { + const groupValues = this.group ? this.group.values : null + return this.parameterType.transform(thisObj, groupValues) + } + + public getParameterType() { + return this.parameterType + } +} diff --git a/node_modules/@cucumber/cucumber-expressions/src/Ast.ts b/node_modules/@cucumber/cucumber-expressions/src/Ast.ts new file mode 100644 index 00000000..44d9e18f --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/src/Ast.ts @@ -0,0 +1,143 @@ +const escapeCharacter = '\\' +const alternationCharacter = '/' +const beginParameterCharacter = '{' +const endParameterCharacter = '}' +const beginOptionalCharacter = '(' +const endOptionalCharacter = ')' + +export function symbolOf(token: TokenType): string { + switch (token) { + case TokenType.beginOptional: + return beginOptionalCharacter + case TokenType.endOptional: + return endOptionalCharacter + case TokenType.beginParameter: + return beginParameterCharacter + case TokenType.endParameter: + return endParameterCharacter + case TokenType.alternation: + return alternationCharacter + } + return '' +} + +export function purposeOf(token: TokenType): string { + switch (token) { + case TokenType.beginOptional: + case TokenType.endOptional: + return 'optional text' + case TokenType.beginParameter: + case TokenType.endParameter: + return 'a parameter' + case TokenType.alternation: + return 'alternation' + } + return '' +} + +export interface Located { + readonly start: number + readonly end: number +} + +export class Node implements Located { + constructor( + public readonly type: NodeType, + public readonly nodes: readonly Node[] | undefined, + private readonly token: string | undefined, + public readonly start: number, + public readonly end: number + ) { + if (nodes === undefined && token === undefined) { + throw new Error('Either nodes or token must be defined') + } + } + + text(): string { + if (this.nodes && this.nodes.length > 0) { + return this.nodes.map((value) => value.text()).join('') + } + return this.token || '' + } +} + +export enum NodeType { + text = 'TEXT_NODE', + optional = 'OPTIONAL_NODE', + alternation = 'ALTERNATION_NODE', + alternative = 'ALTERNATIVE_NODE', + parameter = 'PARAMETER_NODE', + expression = 'EXPRESSION_NODE', +} + +export class Token implements Located { + readonly type: TokenType + readonly text: string + readonly start: number + readonly end: number + + constructor(type: TokenType, text: string, start: number, end: number) { + this.type = type + this.text = text + this.start = start + this.end = end + } + + static isEscapeCharacter(codePoint: string): boolean { + return codePoint == escapeCharacter + } + + static canEscape(codePoint: string): boolean { + if (codePoint == ' ') { + // TODO: Unicode whitespace? + return true + } + switch (codePoint) { + case escapeCharacter: + return true + case alternationCharacter: + return true + case beginParameterCharacter: + return true + case endParameterCharacter: + return true + case beginOptionalCharacter: + return true + case endOptionalCharacter: + return true + } + return false + } + + static typeOf(codePoint: string): TokenType { + if (codePoint == ' ') { + // TODO: Unicode whitespace? + return TokenType.whiteSpace + } + switch (codePoint) { + case alternationCharacter: + return TokenType.alternation + case beginParameterCharacter: + return TokenType.beginParameter + case endParameterCharacter: + return TokenType.endParameter + case beginOptionalCharacter: + return TokenType.beginOptional + case endOptionalCharacter: + return TokenType.endOptional + } + return TokenType.text + } +} + +export enum TokenType { + startOfLine = 'START_OF_LINE', + endOfLine = 'END_OF_LINE', + whiteSpace = 'WHITE_SPACE', + beginOptional = 'BEGIN_OPTIONAL', + endOptional = 'END_OPTIONAL', + beginParameter = 'BEGIN_PARAMETER', + endParameter = 'END_PARAMETER', + alternation = 'ALTERNATION', + text = 'TEXT', +} diff --git a/node_modules/@cucumber/cucumber-expressions/src/CombinatorialGeneratedExpressionFactory.ts b/node_modules/@cucumber/cucumber-expressions/src/CombinatorialGeneratedExpressionFactory.ts new file mode 100644 index 00000000..51866482 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/src/CombinatorialGeneratedExpressionFactory.ts @@ -0,0 +1,49 @@ +import GeneratedExpression from './GeneratedExpression.js' +import ParameterType from './ParameterType.js' + +// 256 generated expressions ought to be enough for anybody +const MAX_EXPRESSIONS = 256 + +export default class CombinatorialGeneratedExpressionFactory { + constructor( + private readonly expressionTemplate: string, + private readonly parameterTypeCombinations: Array>> + ) { + this.expressionTemplate = expressionTemplate + } + + public generateExpressions(): readonly GeneratedExpression[] { + const generatedExpressions: GeneratedExpression[] = [] + this.generatePermutations(generatedExpressions, 0, []) + return generatedExpressions + } + + private generatePermutations( + generatedExpressions: GeneratedExpression[], + depth: number, + currentParameterTypes: Array> + ) { + if (generatedExpressions.length >= MAX_EXPRESSIONS) { + return + } + + if (depth === this.parameterTypeCombinations.length) { + generatedExpressions.push( + new GeneratedExpression(this.expressionTemplate, currentParameterTypes) + ) + return + } + + // tslint:disable-next-line:prefer-for-of + for (let i = 0; i < this.parameterTypeCombinations[depth].length; ++i) { + // Avoid recursion if no elements can be added. + if (generatedExpressions.length >= MAX_EXPRESSIONS) { + return + } + + const newCurrentParameterTypes = currentParameterTypes.slice() // clone + newCurrentParameterTypes.push(this.parameterTypeCombinations[depth][i]) + this.generatePermutations(generatedExpressions, depth + 1, newCurrentParameterTypes) + } + } +} diff --git a/node_modules/@cucumber/cucumber-expressions/src/CucumberExpression.ts b/node_modules/@cucumber/cucumber-expressions/src/CucumberExpression.ts new file mode 100644 index 00000000..d1da0589 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/src/CucumberExpression.ts @@ -0,0 +1,160 @@ +import Argument from './Argument.js' +import { Node, NodeType } from './Ast.js' +import CucumberExpressionError from './CucumberExpressionError.js' +import CucumberExpressionParser from './CucumberExpressionParser.js' +import { + createAlternativeMayNotBeEmpty, + createAlternativeMayNotExclusivelyContainOptionals, + createOptionalIsNotAllowedInOptional, + createOptionalMayNotBeEmpty, + createParameterIsNotAllowedInOptional, + createUndefinedParameterType, +} from './Errors.js' +import ParameterType from './ParameterType.js' +import ParameterTypeRegistry from './ParameterTypeRegistry.js' +import TreeRegexp from './TreeRegexp.js' +import { Expression } from './types.js' + +const ESCAPE_PATTERN = () => /([\\^[({$.|?*+})\]])/g + +export default class CucumberExpression implements Expression { + private readonly parameterTypes: Array> = [] + private readonly treeRegexp: TreeRegexp + public readonly ast: Node + + /** + * @param expression + * @param parameterTypeRegistry + */ + constructor( + private readonly expression: string, + private readonly parameterTypeRegistry: ParameterTypeRegistry + ) { + const parser = new CucumberExpressionParser() + this.ast = parser.parse(expression) + const pattern = this.rewriteToRegex(this.ast) + this.treeRegexp = new TreeRegexp(pattern) + } + + private rewriteToRegex(node: Node): string { + switch (node.type) { + case NodeType.text: + return CucumberExpression.escapeRegex(node.text()) + case NodeType.optional: + return this.rewriteOptional(node) + case NodeType.alternation: + return this.rewriteAlternation(node) + case NodeType.alternative: + return this.rewriteAlternative(node) + case NodeType.parameter: + return this.rewriteParameter(node) + case NodeType.expression: + return this.rewriteExpression(node) + default: + // Can't happen as long as the switch case is exhaustive + throw new Error(node.type) + } + } + + private static escapeRegex(expression: string) { + return expression.replace(ESCAPE_PATTERN(), '\\$1') + } + + private rewriteOptional(node: Node): string { + this.assertNoParameters(node, (astNode) => + createParameterIsNotAllowedInOptional(astNode, this.expression) + ) + this.assertNoOptionals(node, (astNode) => + createOptionalIsNotAllowedInOptional(astNode, this.expression) + ) + this.assertNotEmpty(node, (astNode) => createOptionalMayNotBeEmpty(astNode, this.expression)) + const regex = (node.nodes || []).map((node) => this.rewriteToRegex(node)).join('') + return `(?:${regex})?` + } + + private rewriteAlternation(node: Node) { + // Make sure the alternative parts aren't empty and don't contain parameter types + for (const alternative of node.nodes || []) { + if (!alternative.nodes || alternative.nodes.length == 0) { + throw createAlternativeMayNotBeEmpty(alternative, this.expression) + } + this.assertNotEmpty(alternative, (astNode) => + createAlternativeMayNotExclusivelyContainOptionals(astNode, this.expression) + ) + } + const regex = (node.nodes || []).map((node) => this.rewriteToRegex(node)).join('|') + return `(?:${regex})` + } + + private rewriteAlternative(node: Node) { + return (node.nodes || []).map((lastNode) => this.rewriteToRegex(lastNode)).join('') + } + + private rewriteParameter(node: Node) { + const name = node.text() + const parameterType = this.parameterTypeRegistry.lookupByTypeName(name) + if (!parameterType) { + throw createUndefinedParameterType(node, this.expression, name) + } + this.parameterTypes.push(parameterType) + const regexps = parameterType.regexpStrings + if (regexps.length == 1) { + return `(${regexps[0]})` + } + return `((?:${regexps.join(')|(?:')}))` + } + + private rewriteExpression(node: Node) { + const regex = (node.nodes || []).map((node) => this.rewriteToRegex(node)).join('') + return `^${regex}$` + } + + private assertNotEmpty( + node: Node, + createNodeWasNotEmptyException: (astNode: Node) => CucumberExpressionError + ) { + const textNodes = (node.nodes || []).filter((astNode) => NodeType.text == astNode.type) + + if (textNodes.length == 0) { + throw createNodeWasNotEmptyException(node) + } + } + + private assertNoParameters( + node: Node, + createNodeContainedAParameterError: (astNode: Node) => CucumberExpressionError + ) { + const parameterNodes = (node.nodes || []).filter( + (astNode) => NodeType.parameter == astNode.type + ) + if (parameterNodes.length > 0) { + throw createNodeContainedAParameterError(parameterNodes[0]) + } + } + + private assertNoOptionals( + node: Node, + createNodeContainedAnOptionalError: (astNode: Node) => CucumberExpressionError + ) { + const parameterNodes = (node.nodes || []).filter((astNode) => NodeType.optional == astNode.type) + if (parameterNodes.length > 0) { + throw createNodeContainedAnOptionalError(parameterNodes[0]) + } + } + + public match(text: string): readonly Argument[] | null { + const group = this.treeRegexp.match(text) + if (!group) { + return null + } + return Argument.build(group, this.parameterTypes) + } + + get regexp(): RegExp { + return this.treeRegexp.regexp + } + + get source(): string { + return this.expression + } +} diff --git a/node_modules/@cucumber/cucumber-expressions/src/CucumberExpressionError.ts b/node_modules/@cucumber/cucumber-expressions/src/CucumberExpressionError.ts new file mode 100644 index 00000000..5fc12cfa --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/src/CucumberExpressionError.ts @@ -0,0 +1 @@ +export default class CucumberExpressionError extends Error {} diff --git a/node_modules/@cucumber/cucumber-expressions/src/CucumberExpressionGenerator.ts b/node_modules/@cucumber/cucumber-expressions/src/CucumberExpressionGenerator.ts new file mode 100644 index 00000000..75aa59c7 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/src/CucumberExpressionGenerator.ts @@ -0,0 +1,97 @@ +import CombinatorialGeneratedExpressionFactory from './CombinatorialGeneratedExpressionFactory.js' +import GeneratedExpression from './GeneratedExpression.js' +import ParameterType from './ParameterType.js' +import ParameterTypeMatcher from './ParameterTypeMatcher.js' + +export default class CucumberExpressionGenerator { + constructor(private readonly parameterTypes: () => Iterable>) {} + + public generateExpressions(text: string): readonly GeneratedExpression[] { + const parameterTypeCombinations: Array>> = [] + const parameterTypeMatchers = this.createParameterTypeMatchers(text) + let expressionTemplate = '' + let pos = 0 + let counter = 0 + + while (true) { + let matchingParameterTypeMatchers = [] + + for (const parameterTypeMatcher of parameterTypeMatchers) { + const advancedParameterTypeMatcher = parameterTypeMatcher.advanceTo(pos) + if (advancedParameterTypeMatcher.find) { + matchingParameterTypeMatchers.push(advancedParameterTypeMatcher) + } + } + + if (matchingParameterTypeMatchers.length > 0) { + matchingParameterTypeMatchers = matchingParameterTypeMatchers.sort( + ParameterTypeMatcher.compare + ) + + // Find all the best parameter type matchers, they are all candidates. + const bestParameterTypeMatcher = matchingParameterTypeMatchers[0] + const bestParameterTypeMatchers = matchingParameterTypeMatchers.filter( + (m) => ParameterTypeMatcher.compare(m, bestParameterTypeMatcher) === 0 + ) + + // Build a list of parameter types without duplicates. The reason there + // might be duplicates is that some parameter types have more than one regexp, + // which means multiple ParameterTypeMatcher objects will have a reference to the + // same ParameterType. + // We're sorting the list so preferential parameter types are listed first. + // Users are most likely to want these, so they should be listed at the top. + let parameterTypes = [] + for (const parameterTypeMatcher of bestParameterTypeMatchers) { + if (parameterTypes.indexOf(parameterTypeMatcher.parameterType) === -1) { + parameterTypes.push(parameterTypeMatcher.parameterType) + } + } + parameterTypes = parameterTypes.sort(ParameterType.compare) + + parameterTypeCombinations.push(parameterTypes) + + expressionTemplate += escape(text.slice(pos, bestParameterTypeMatcher.start)) + expressionTemplate += `{{${counter++}}}` + + pos = bestParameterTypeMatcher.start + bestParameterTypeMatcher.group.length + } else { + break + } + + if (pos >= text.length) { + break + } + } + + expressionTemplate += escape(text.slice(pos)) + return new CombinatorialGeneratedExpressionFactory( + expressionTemplate, + parameterTypeCombinations + ).generateExpressions() + } + + private createParameterTypeMatchers(text: string): ParameterTypeMatcher[] { + let parameterMatchers: ParameterTypeMatcher[] = [] + for (const parameterType of this.parameterTypes()) { + if (parameterType.useForSnippets) { + parameterMatchers = parameterMatchers.concat( + CucumberExpressionGenerator.createParameterTypeMatchers2(parameterType, text) + ) + } + } + return parameterMatchers + } + + private static createParameterTypeMatchers2( + parameterType: ParameterType, + text: string + ): ParameterTypeMatcher[] { + return parameterType.regexpStrings.map( + (regexp) => new ParameterTypeMatcher(parameterType, regexp, text) + ) + } +} + +function escape(s: string): string { + return s.replace(/\(/g, '\\(').replace(/{/g, '\\{').replace(/\//g, '\\/') +} diff --git a/node_modules/@cucumber/cucumber-expressions/src/CucumberExpressionParser.ts b/node_modules/@cucumber/cucumber-expressions/src/CucumberExpressionParser.ts new file mode 100644 index 00000000..747c1b80 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/src/CucumberExpressionParser.ts @@ -0,0 +1,321 @@ +import { Node, NodeType, Token, TokenType } from './Ast.js' +import CucumberExpressionTokenizer from './CucumberExpressionTokenizer.js' +import { + createAlternationNotAllowedInOptional, + createInvalidParameterTypeNameInNode, + createMissingEndToken, +} from './Errors.js' + +/* + * text := whitespace | ')' | '}' | . + */ +function parseText(expression: string, tokens: readonly Token[], current: number): Result { + const token = tokens[current] + switch (token.type) { + case TokenType.whiteSpace: + case TokenType.text: + case TokenType.endParameter: + case TokenType.endOptional: + return { + consumed: 1, + ast: [new Node(NodeType.text, undefined, token.text, token.start, token.end)], + } + case TokenType.alternation: + throw createAlternationNotAllowedInOptional(expression, token) + case TokenType.startOfLine: + case TokenType.endOfLine: + case TokenType.beginOptional: + case TokenType.beginParameter: + default: + // If configured correctly this will never happen + return { consumed: 0, ast: [] } + } +} + +/* + * parameter := '{' + name* + '}' + */ +function parseName(expression: string, tokens: readonly Token[], current: number): Result { + const token = tokens[current] + switch (token.type) { + case TokenType.whiteSpace: + case TokenType.text: + return { + consumed: 1, + ast: [new Node(NodeType.text, undefined, token.text, token.start, token.end)], + } + case TokenType.beginOptional: + case TokenType.endOptional: + case TokenType.beginParameter: + case TokenType.endParameter: + case TokenType.alternation: + throw createInvalidParameterTypeNameInNode(token, expression) + case TokenType.startOfLine: + case TokenType.endOfLine: + default: + // If configured correctly this will never happen + return { consumed: 0, ast: [] } + } +} + +/* + * parameter := '{' + text* + '}' + */ +const parseParameter = parseBetween( + NodeType.parameter, + TokenType.beginParameter, + TokenType.endParameter, + [parseName] +) + +/* + * optional := '(' + option* + ')' + * option := optional | parameter | text + */ +const optionalSubParsers: Array = [] +const parseOptional = parseBetween( + NodeType.optional, + TokenType.beginOptional, + TokenType.endOptional, + optionalSubParsers +) +optionalSubParsers.push(parseOptional, parseParameter, parseText) + +/* + * alternation := alternative* + ( '/' + alternative* )+ + */ +function parseAlternativeSeparator( + expression: string, + tokens: readonly Token[], + current: number +): Result { + if (!lookingAt(tokens, current, TokenType.alternation)) { + return { consumed: 0, ast: [] } + } + const token = tokens[current] + return { + consumed: 1, + ast: [new Node(NodeType.alternative, undefined, token.text, token.start, token.end)], + } +} + +const alternativeParsers: readonly Parser[] = [ + parseAlternativeSeparator, + parseOptional, + parseParameter, + parseText, +] + +/* + * alternation := (?<=left-boundary) + alternative* + ( '/' + alternative* )+ + (?=right-boundary) + * left-boundary := whitespace | } | ^ + * right-boundary := whitespace | { | $ + * alternative: = optional | parameter | text + */ +const parseAlternation: Parser = (expression, tokens, current) => { + const previous = current - 1 + if ( + !lookingAtAny(tokens, previous, [ + TokenType.startOfLine, + TokenType.whiteSpace, + TokenType.endParameter, + ]) + ) { + return { consumed: 0, ast: [] } + } + + const result = parseTokensUntil(expression, alternativeParsers, tokens, current, [ + TokenType.whiteSpace, + TokenType.endOfLine, + TokenType.beginParameter, + ]) + const subCurrent = current + result.consumed + if (!result.ast.some((astNode) => astNode.type == NodeType.alternative)) { + return { consumed: 0, ast: [] } + } + + const start = tokens[current].start + const end = tokens[subCurrent].start + // Does not consume right hand boundary token + return { + consumed: result.consumed, + ast: [ + new Node( + NodeType.alternation, + splitAlternatives(start, end, result.ast), + undefined, + start, + end + ), + ], + } +} + +/* + * cucumber-expression := ( alternation | optional | parameter | text )* + */ +const parseCucumberExpression = parseBetween( + NodeType.expression, + TokenType.startOfLine, + TokenType.endOfLine, + [parseAlternation, parseOptional, parseParameter, parseText] +) + +export default class CucumberExpressionParser { + parse(expression: string): Node { + const tokenizer = new CucumberExpressionTokenizer() + const tokens = tokenizer.tokenize(expression) + const result = parseCucumberExpression(expression, tokens, 0) + return result.ast[0] + } +} + +interface Parser { + (expression: string, tokens: readonly Token[], current: number): Result +} + +type Result = { + readonly consumed: number + readonly ast: readonly Node[] +} + +function parseBetween( + type: NodeType, + beginToken: TokenType, + endToken: TokenType, + parsers: Array +): Parser { + return (expression, tokens, current) => { + if (!lookingAt(tokens, current, beginToken)) { + return { consumed: 0, ast: [] } + } + let subCurrent = current + 1 + const result = parseTokensUntil(expression, parsers, tokens, subCurrent, [ + endToken, + TokenType.endOfLine, + ]) + subCurrent += result.consumed + + // endToken not found + if (!lookingAt(tokens, subCurrent, endToken)) { + throw createMissingEndToken(expression, beginToken, endToken, tokens[current]) + } + // consumes endToken + const start = tokens[current].start + const end = tokens[subCurrent].end + const consumed = subCurrent + 1 - current + const ast = [new Node(type, result.ast, undefined, start, end)] + return { consumed, ast } + } +} + +function parseToken( + expression: string, + parsers: readonly Parser[], + tokens: readonly Token[], + startAt: number +): Result { + for (let i = 0; i < parsers.length; i++) { + const parse = parsers[i] + const result = parse(expression, tokens, startAt) + if (result.consumed != 0) { + return result + } + } + // If configured correctly this will never happen + throw new Error('No eligible parsers for ' + tokens) +} + +function parseTokensUntil( + expression: string, + parsers: readonly Parser[], + tokens: readonly Token[], + startAt: number, + endTokens: readonly TokenType[] +): Result { + let current = startAt + const size = tokens.length + const ast: Node[] = [] + while (current < size) { + if (lookingAtAny(tokens, current, endTokens)) { + break + } + const result = parseToken(expression, parsers, tokens, current) + if (result.consumed == 0) { + // If configured correctly this will never happen + // Keep to avoid infinite loops + throw new Error('No eligible parsers for ' + tokens) + } + current += result.consumed + ast.push(...result.ast) + } + return { consumed: current - startAt, ast } +} + +function lookingAtAny( + tokens: readonly Token[], + at: number, + tokenTypes: readonly TokenType[] +): boolean { + return tokenTypes.some((tokenType) => lookingAt(tokens, at, tokenType)) +} + +function lookingAt(tokens: readonly Token[], at: number, token: TokenType): boolean { + if (at < 0) { + // If configured correctly this will never happen + // Keep for completeness + return token == TokenType.startOfLine + } + if (at >= tokens.length) { + return token == TokenType.endOfLine + } + return tokens[at].type == token +} + +function splitAlternatives( + start: number, + end: number, + alternation: readonly Node[] +): readonly Node[] { + const separators: Node[] = [] + const alternatives: Node[][] = [] + let alternative: Node[] = [] + alternation.forEach((n) => { + if (NodeType.alternative == n.type) { + separators.push(n) + alternatives.push(alternative) + alternative = [] + } else { + alternative.push(n) + } + }) + alternatives.push(alternative) + return createAlternativeNodes(start, end, separators, alternatives) +} + +function createAlternativeNodes( + start: number, + end: number, + separators: readonly Node[], + alternatives: readonly ReadonlyArray[] +): readonly Node[] { + const nodes: Node[] = [] + + for (let i = 0; i < alternatives.length; i++) { + const n = alternatives[i] + if (i == 0) { + const rightSeparator = separators[i] + nodes.push(new Node(NodeType.alternative, n, undefined, start, rightSeparator.start)) + } else if (i == alternatives.length - 1) { + const leftSeparator = separators[i - 1] + nodes.push(new Node(NodeType.alternative, n, undefined, leftSeparator.end, end)) + } else { + const leftSeparator = separators[i - 1] + const rightSeparator = separators[i] + nodes.push( + new Node(NodeType.alternative, n, undefined, leftSeparator.end, rightSeparator.start) + ) + } + } + return nodes +} diff --git a/node_modules/@cucumber/cucumber-expressions/src/CucumberExpressionTokenizer.ts b/node_modules/@cucumber/cucumber-expressions/src/CucumberExpressionTokenizer.ts new file mode 100644 index 00000000..0b1714d4 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/src/CucumberExpressionTokenizer.ts @@ -0,0 +1,81 @@ +import { Token, TokenType } from './Ast.js' +import { createCantEscaped, createTheEndOfLIneCanNotBeEscaped } from './Errors.js' + +export default class CucumberExpressionTokenizer { + tokenize(expression: string): readonly Token[] { + const codePoints = Array.from(expression) + const tokens: Array = [] + let buffer: Array = [] + let previousTokenType = TokenType.startOfLine + let treatAsText = false + let escaped = 0 + let bufferStartIndex = 0 + + function convertBufferToToken(tokenType: TokenType): Token { + let escapeTokens = 0 + if (tokenType == TokenType.text) { + escapeTokens = escaped + escaped = 0 + } + + const consumedIndex = bufferStartIndex + buffer.length + escapeTokens + const t = new Token(tokenType, buffer.join(''), bufferStartIndex, consumedIndex) + buffer = [] + bufferStartIndex = consumedIndex + return t + } + + function tokenTypeOf(codePoint: string, treatAsText: boolean): TokenType { + if (!treatAsText) { + return Token.typeOf(codePoint) + } + if (Token.canEscape(codePoint)) { + return TokenType.text + } + throw createCantEscaped(expression, bufferStartIndex + buffer.length + escaped) + } + + function shouldCreateNewToken(previousTokenType: TokenType, currentTokenType: TokenType) { + if (currentTokenType != previousTokenType) { + return true + } + return currentTokenType != TokenType.whiteSpace && currentTokenType != TokenType.text + } + + if (codePoints.length == 0) { + tokens.push(new Token(TokenType.startOfLine, '', 0, 0)) + } + + codePoints.forEach((codePoint) => { + if (!treatAsText && Token.isEscapeCharacter(codePoint)) { + escaped++ + treatAsText = true + return + } + const currentTokenType = tokenTypeOf(codePoint, treatAsText) + treatAsText = false + + if (shouldCreateNewToken(previousTokenType, currentTokenType)) { + const token = convertBufferToToken(previousTokenType) + previousTokenType = currentTokenType + buffer.push(codePoint) + tokens.push(token) + } else { + previousTokenType = currentTokenType + buffer.push(codePoint) + } + }) + + if (buffer.length > 0) { + const token = convertBufferToToken(previousTokenType) + tokens.push(token) + } + + if (treatAsText) { + throw createTheEndOfLIneCanNotBeEscaped(expression) + } + + tokens.push(new Token(TokenType.endOfLine, '', codePoints.length, codePoints.length)) + return tokens + } +} diff --git a/node_modules/@cucumber/cucumber-expressions/src/Errors.ts b/node_modules/@cucumber/cucumber-expressions/src/Errors.ts new file mode 100644 index 00000000..3bef9173 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/src/Errors.ts @@ -0,0 +1,237 @@ +import { Located, Node, purposeOf, symbolOf, Token, TokenType } from './Ast.js' +import CucumberExpressionError from './CucumberExpressionError.js' +import GeneratedExpression from './GeneratedExpression.js' +import ParameterType from './ParameterType.js' + +export function createAlternativeMayNotExclusivelyContainOptionals( + node: Node, + expression: string +): CucumberExpressionError { + return new CucumberExpressionError( + message( + node.start, + expression, + pointAtLocated(node), + 'An alternative may not exclusively contain optionals', + "If you did not mean to use an optional you can use '\\(' to escape the '('" + ) + ) +} +export function createAlternativeMayNotBeEmpty( + node: Node, + expression: string +): CucumberExpressionError { + return new CucumberExpressionError( + message( + node.start, + expression, + pointAtLocated(node), + 'Alternative may not be empty', + "If you did not mean to use an alternative you can use '\\/' to escape the '/'" + ) + ) +} +export function createOptionalMayNotBeEmpty( + node: Node, + expression: string +): CucumberExpressionError { + return new CucumberExpressionError( + message( + node.start, + expression, + pointAtLocated(node), + 'An optional must contain some text', + "If you did not mean to use an optional you can use '\\(' to escape the '('" + ) + ) +} +export function createParameterIsNotAllowedInOptional( + node: Node, + expression: string +): CucumberExpressionError { + return new CucumberExpressionError( + message( + node.start, + expression, + pointAtLocated(node), + 'An optional may not contain a parameter type', + "If you did not mean to use an parameter type you can use '\\{' to escape the '{'" + ) + ) +} + +export function createOptionalIsNotAllowedInOptional( + node: Node, + expression: string +): CucumberExpressionError { + return new CucumberExpressionError( + message( + node.start, + expression, + pointAtLocated(node), + 'An optional may not contain an other optional', + "If you did not mean to use an optional type you can use '\\(' to escape the '('. For more complicated expressions consider using a regular expression instead." + ) + ) +} + +export function createTheEndOfLIneCanNotBeEscaped(expression: string): CucumberExpressionError { + const index = Array.from(expression).length - 1 + return new CucumberExpressionError( + message( + index, + expression, + pointAt(index), + 'The end of line can not be escaped', + "You can use '\\\\' to escape the '\\'" + ) + ) +} + +export function createMissingEndToken( + expression: string, + beginToken: TokenType, + endToken: TokenType, + current: Token +) { + const beginSymbol = symbolOf(beginToken) + const endSymbol = symbolOf(endToken) + const purpose = purposeOf(beginToken) + return new CucumberExpressionError( + message( + current.start, + expression, + pointAtLocated(current), + `The '${beginSymbol}' does not have a matching '${endSymbol}'`, + `If you did not intend to use ${purpose} you can use '\\${beginSymbol}' to escape the ${purpose}` + ) + ) +} + +export function createAlternationNotAllowedInOptional(expression: string, current: Token) { + return new CucumberExpressionError( + message( + current.start, + expression, + pointAtLocated(current), + 'An alternation can not be used inside an optional', + "If you did not mean to use an alternation you can use '\\/' to escape the '/'. Otherwise rephrase your expression or consider using a regular expression instead." + ) + ) +} + +export function createCantEscaped(expression: string, index: number) { + return new CucumberExpressionError( + message( + index, + expression, + pointAt(index), + "Only the characters '{', '}', '(', ')', '\\', '/' and whitespace can be escaped", + "If you did mean to use an '\\' you can use '\\\\' to escape it" + ) + ) +} + +export function createInvalidParameterTypeNameInNode(token: Token, expression: string) { + return new CucumberExpressionError( + message( + token.start, + expression, + pointAtLocated(token), + "Parameter names may not contain '{', '}', '(', ')', '\\' or '/'", + 'Did you mean to use a regular expression?' + ) + ) +} + +function message( + index: number, + expression: string, + pointer: string, + problem: string, + solution: string +): string { + return `This Cucumber Expression has a problem at column ${index + 1}: + +${expression} +${pointer} +${problem}. +${solution}` +} + +function pointAt(index: number): string { + const pointer: Array = [] + for (let i = 0; i < index; i++) { + pointer.push(' ') + } + pointer.push('^') + return pointer.join('') +} + +function pointAtLocated(node: Located): string { + const pointer = [pointAt(node.start)] + if (node.start + 1 < node.end) { + for (let i = node.start + 1; i < node.end - 1; i++) { + pointer.push('-') + } + pointer.push('^') + } + return pointer.join('') +} + +export class AmbiguousParameterTypeError extends CucumberExpressionError { + public static forRegExp( + parameterTypeRegexp: string, + expressionRegexp: RegExp, + parameterTypes: readonly ParameterType[], + generatedExpressions: readonly GeneratedExpression[] + ) { + return new this( + `Your Regular Expression ${expressionRegexp} +matches multiple parameter types with regexp ${parameterTypeRegexp}: + ${this._parameterTypeNames(parameterTypes)} + +I couldn't decide which one to use. You have two options: + +1) Use a Cucumber Expression instead of a Regular Expression. Try one of these: + ${this._expressions(generatedExpressions)} + +2) Make one of the parameter types preferential and continue to use a Regular Expression. +` + ) + } + + public static _parameterTypeNames(parameterTypes: readonly ParameterType[]) { + return parameterTypes.map((p) => `{${p.name}}`).join('\n ') + } + + public static _expressions(generatedExpressions: readonly GeneratedExpression[]) { + return generatedExpressions.map((e) => e.source).join('\n ') + } +} + +export class UndefinedParameterTypeError extends CucumberExpressionError { + constructor( + public readonly undefinedParameterTypeName: string, + message: string + ) { + super(message) + } +} + +export function createUndefinedParameterType( + node: Node, + expression: string, + undefinedParameterTypeName: string +) { + return new UndefinedParameterTypeError( + undefinedParameterTypeName, + message( + node.start, + expression, + pointAtLocated(node), + `Undefined parameter type '${undefinedParameterTypeName}'`, + `Please register a ParameterType for '${undefinedParameterTypeName}'` + ) + ) +} diff --git a/node_modules/@cucumber/cucumber-expressions/src/ExpressionFactory.ts b/node_modules/@cucumber/cucumber-expressions/src/ExpressionFactory.ts new file mode 100644 index 00000000..c33261e3 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/src/ExpressionFactory.ts @@ -0,0 +1,14 @@ +import CucumberExpression from './CucumberExpression.js' +import ParameterTypeRegistry from './ParameterTypeRegistry.js' +import RegularExpression from './RegularExpression.js' +import { Expression } from './types.js' + +export default class ExpressionFactory { + public constructor(private readonly parameterTypeRegistry: ParameterTypeRegistry) {} + + public createExpression(expression: string | RegExp): Expression { + return typeof expression === 'string' + ? new CucumberExpression(expression, this.parameterTypeRegistry) + : new RegularExpression(expression, this.parameterTypeRegistry) + } +} diff --git a/node_modules/@cucumber/cucumber-expressions/src/GeneratedExpression.ts b/node_modules/@cucumber/cucumber-expressions/src/GeneratedExpression.ts new file mode 100644 index 00000000..18e950d5 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/src/GeneratedExpression.ts @@ -0,0 +1,61 @@ +import ParameterType from './ParameterType.js' +import { ParameterInfo } from './types.js' + +export default class GeneratedExpression { + constructor( + private readonly expressionTemplate: string, + public readonly parameterTypes: readonly ParameterType[] + ) {} + + get source() { + return format(this.expressionTemplate, ...this.parameterTypes.map((t) => t.name || '')) + } + + /** + * Returns an array of parameter names to use in generated function/method signatures + * + * @returns {ReadonlyArray.} + */ + get parameterNames(): readonly string[] { + return this.parameterInfos.map((i) => `${i.name}${i.count === 1 ? '' : i.count.toString()}`) + } + + /** + * Returns an array of ParameterInfo to use in generated function/method signatures + */ + get parameterInfos(): readonly ParameterInfo[] { + const usageByTypeName: { [key: string]: number } = {} + return this.parameterTypes.map((t) => getParameterInfo(t, usageByTypeName)) + } +} + +function getParameterInfo( + parameterType: ParameterType, + usageByName: { [key: string]: number } +): ParameterInfo { + const name = parameterType.name || '' + let counter = usageByName[name] + counter = counter ? counter + 1 : 1 + usageByName[name] = counter + let type: string | null + if (parameterType.type) { + if (typeof parameterType.type === 'string') { + type = parameterType.type + } else if ('name' in parameterType.type) { + type = parameterType.type.name + } else { + type = null + } + } else { + type = null + } + return { + type, + name, + count: counter, + } +} + +function format(pattern: string, ...args: readonly string[]): string { + return pattern.replace(/{(\d+)}/g, (match, number) => args[number]) +} diff --git a/node_modules/@cucumber/cucumber-expressions/src/Group.ts b/node_modules/@cucumber/cucumber-expressions/src/Group.ts new file mode 100644 index 00000000..657a0699 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/src/Group.ts @@ -0,0 +1,17 @@ +export default class Group { + constructor( + public readonly value: string, + public readonly start: number | undefined, + public readonly end: number | undefined, + /** + * A groups children. + * + * There are either one or more children or the attribute is undefined. + */ + public readonly children: readonly Group[] | undefined + ) {} + + get values(): string[] | null { + return (this.children === undefined ? [this] : this.children).map((g) => g.value) + } +} diff --git a/node_modules/@cucumber/cucumber-expressions/src/GroupBuilder.ts b/node_modules/@cucumber/cucumber-expressions/src/GroupBuilder.ts new file mode 100644 index 00000000..e34ede32 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/src/GroupBuilder.ts @@ -0,0 +1,35 @@ +import { RegExpExecArray } from 'regexp-match-indices' + +import Group from './Group.js' + +export default class GroupBuilder { + public source: string + public capturing = true + private readonly groupBuilders: GroupBuilder[] = [] + + public add(groupBuilder: GroupBuilder) { + this.groupBuilders.push(groupBuilder) + } + + public build(match: RegExpExecArray, nextGroupIndex: () => number): Group { + const groupIndex = nextGroupIndex() + const children = this.groupBuilders.map((gb) => gb.build(match, nextGroupIndex)) + const value = match[groupIndex] + const index = match.indices[groupIndex] + const start = index ? index[0] : undefined + const end = index ? index[1] : undefined + return new Group(value, start, end, children.length === 0 ? undefined : children) + } + + public setNonCapturing() { + this.capturing = false + } + + get children() { + return this.groupBuilders + } + + public moveChildrenTo(groupBuilder: GroupBuilder) { + this.groupBuilders.forEach((child) => groupBuilder.add(child)) + } +} diff --git a/node_modules/@cucumber/cucumber-expressions/src/ParameterType.ts b/node_modules/@cucumber/cucumber-expressions/src/ParameterType.ts new file mode 100644 index 00000000..c11c7b43 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/src/ParameterType.ts @@ -0,0 +1,119 @@ +import CucumberExpressionError from './CucumberExpressionError.js' + +const ILLEGAL_PARAMETER_NAME_PATTERN = /([[\]()$.|?*+])/ +const UNESCAPE_PATTERN = () => /(\\([[$.|?*+\]]))/g + +interface Constructor { + new (...args: unknown[]): T + prototype: T +} + +type Factory = (...args: unknown[]) => T + +export type RegExps = StringOrRegExp | readonly StringOrRegExp[] + +export type StringOrRegExp = string | RegExp + +export default class ParameterType { + private transformFn: (...match: readonly string[]) => T | PromiseLike + + public static compare(pt1: ParameterType, pt2: ParameterType) { + if (pt1.preferForRegexpMatch && !pt2.preferForRegexpMatch) { + return -1 + } + if (pt2.preferForRegexpMatch && !pt1.preferForRegexpMatch) { + return 1 + } + return (pt1.name || '').localeCompare(pt2.name || '') + } + + public static checkParameterTypeName(typeName: string) { + if (!this.isValidParameterTypeName(typeName)) { + throw new CucumberExpressionError( + `Illegal character in parameter name {${typeName}}. Parameter names may not contain '{', '}', '(', ')', '\\' or '/'` + ) + } + } + + public static isValidParameterTypeName(typeName: string) { + const unescapedTypeName = typeName.replace(UNESCAPE_PATTERN(), '$2') + return !unescapedTypeName.match(ILLEGAL_PARAMETER_NAME_PATTERN) + } + + public regexpStrings: readonly string[] + + /** + * @param name {String} the name of the type + * @param regexps {Array.,RegExp,String} that matche the type + * @param type {Function} the prototype (constructor) of the type. May be null. + * @param transform {Function} function transforming string to another type. May be null. + * @param useForSnippets {boolean} true if this should be used for snippets. Defaults to true. + * @param preferForRegexpMatch {boolean} true if this is a preferential type. Defaults to false. + * @param builtin whether or not this is a built-in type + */ + constructor( + public readonly name: string | undefined, + regexps: RegExps, + public readonly type: Constructor | Factory | null, + transform?: (...match: string[]) => T | PromiseLike, + public readonly useForSnippets?: boolean, + public readonly preferForRegexpMatch?: boolean, + public readonly builtin?: boolean + ) { + if (transform === undefined) { + transform = (s) => s as unknown as T + } + if (useForSnippets === undefined) { + this.useForSnippets = true + } + if (preferForRegexpMatch === undefined) { + this.preferForRegexpMatch = false + } + + if (name) { + ParameterType.checkParameterTypeName(name) + } + + this.regexpStrings = stringArray(regexps) + this.transformFn = transform + } + + public transform(thisObj: unknown, groupValues: string[] | null) { + return this.transformFn.apply(thisObj, groupValues) + } +} + +function stringArray(regexps: RegExps): string[] { + const array: StringOrRegExp[] = Array.isArray(regexps) ? regexps : [regexps] + return array.map((r) => (r instanceof RegExp ? regexpSource(r) : r)) +} + +function regexpSource(regexp: RegExp): string { + const flags = regexpFlags(regexp) + + for (const flag of ['g', 'i', 'm', 'y']) { + if (flags.indexOf(flag) !== -1) { + throw new CucumberExpressionError(`ParameterType Regexps can't use flag '${flag}'`) + } + } + return regexp.source +} + +// Backport RegExp.flags for Node 4.x +// https://github.com/nodejs/node/issues/8390 +function regexpFlags(regexp: RegExp) { + let flags = regexp.flags + if (flags === undefined) { + flags = '' + if (regexp.ignoreCase) { + flags += 'i' + } + if (regexp.global) { + flags += 'g' + } + if (regexp.multiline) { + flags += 'm' + } + } + return flags +} diff --git a/node_modules/@cucumber/cucumber-expressions/src/ParameterTypeMatcher.ts b/node_modules/@cucumber/cucumber-expressions/src/ParameterTypeMatcher.ts new file mode 100644 index 00000000..58882536 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/src/ParameterTypeMatcher.ts @@ -0,0 +1,79 @@ +import ParameterType from './ParameterType.js' + +export default class ParameterTypeMatcher { + private readonly match: RegExpExecArray | null + + constructor( + public readonly parameterType: ParameterType, + private readonly regexpString: string, + private readonly text: string, + private matchPosition: number = 0 + ) { + const captureGroupRegexp = new RegExp(`(${regexpString})`) + this.match = captureGroupRegexp.exec(text.slice(this.matchPosition)) + } + + public advanceTo(newMatchPosition: number) { + for (let advancedPos = newMatchPosition; advancedPos < this.text.length; advancedPos++) { + const matcher = new ParameterTypeMatcher( + this.parameterType, + this.regexpString, + this.text, + advancedPos + ) + + if (matcher.find) { + return matcher + } + } + + return new ParameterTypeMatcher( + this.parameterType, + this.regexpString, + this.text, + this.text.length + ) + } + + get find() { + return this.match && this.group !== '' && this.fullWord + } + + get start() { + if (!this.match) throw new Error('No match') + return this.matchPosition + this.match.index + } + + get fullWord() { + return this.matchStartWord && this.matchEndWord + } + + get matchStartWord() { + return this.start === 0 || this.text[this.start - 1].match(/\p{Z}|\p{P}|\p{S}/u) + } + + get matchEndWord() { + const nextCharacterIndex = this.start + this.group.length + return ( + nextCharacterIndex === this.text.length || + this.text[nextCharacterIndex].match(/\p{Z}|\p{P}|\p{S}/u) + ) + } + + get group() { + if (!this.match) throw new Error('No match') + return this.match[0] + } + + public static compare(a: ParameterTypeMatcher, b: ParameterTypeMatcher) { + const posComparison = a.start - b.start + if (posComparison !== 0) { + return posComparison + } + const lengthComparison = b.group.length - a.group.length + if (lengthComparison !== 0) { + return lengthComparison + } + return 0 + } +} diff --git a/node_modules/@cucumber/cucumber-expressions/src/ParameterTypeRegistry.ts b/node_modules/@cucumber/cucumber-expressions/src/ParameterTypeRegistry.ts new file mode 100644 index 00000000..fb5a15b3 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/src/ParameterTypeRegistry.ts @@ -0,0 +1,90 @@ +import CucumberExpressionError from './CucumberExpressionError.js' +import CucumberExpressionGenerator from './CucumberExpressionGenerator.js' +import defineDefaultParameterTypes from './defineDefaultParameterTypes.js' +import { AmbiguousParameterTypeError } from './Errors.js' +import ParameterType from './ParameterType.js' +import { DefinesParameterType } from './types.js' + +export default class ParameterTypeRegistry implements DefinesParameterType { + private readonly parameterTypeByName = new Map>() + private readonly parameterTypesByRegexp = new Map>>() + + constructor() { + defineDefaultParameterTypes(this) + } + + get parameterTypes(): IterableIterator> { + return this.parameterTypeByName.values() + } + + public lookupByTypeName(typeName: string) { + return this.parameterTypeByName.get(typeName) + } + + public lookupByRegexp( + parameterTypeRegexp: string, + expressionRegexp: RegExp, + text: string + ): ParameterType | undefined { + const parameterTypes = this.parameterTypesByRegexp.get(parameterTypeRegexp) + if (!parameterTypes) { + return undefined + } + if (parameterTypes.length > 1 && !parameterTypes[0].preferForRegexpMatch) { + // We don't do this check on insertion because we only want to restrict + // ambiguity when we look up by Regexp. Users of CucumberExpression should + // not be restricted. + const generatedExpressions = new CucumberExpressionGenerator( + () => this.parameterTypes + ).generateExpressions(text) + throw AmbiguousParameterTypeError.forRegExp( + parameterTypeRegexp, + expressionRegexp, + parameterTypes, + generatedExpressions + ) + } + return parameterTypes[0] + } + + public defineParameterType(parameterType: ParameterType) { + if (parameterType.name !== undefined) { + if (this.parameterTypeByName.has(parameterType.name)) { + if (parameterType.name.length === 0) { + throw new CucumberExpressionError(`The anonymous parameter type has already been defined`) + } else { + throw new CucumberExpressionError( + `There is already a parameter type with name ${parameterType.name}` + ) + } + } + this.parameterTypeByName.set(parameterType.name, parameterType) + } + + for (const parameterTypeRegexp of parameterType.regexpStrings) { + if (!this.parameterTypesByRegexp.has(parameterTypeRegexp)) { + this.parameterTypesByRegexp.set(parameterTypeRegexp, []) + } + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const parameterTypes = this.parameterTypesByRegexp.get(parameterTypeRegexp)! + const existingParameterType = parameterTypes[0] + if ( + parameterTypes.length > 0 && + existingParameterType.preferForRegexpMatch && + parameterType.preferForRegexpMatch + ) { + throw new CucumberExpressionError( + 'There can only be one preferential parameter type per regexp. ' + + `The regexp /${parameterTypeRegexp}/ is used for two preferential parameter types, {${existingParameterType.name}} and {${parameterType.name}}` + ) + } + if (parameterTypes.indexOf(parameterType) === -1) { + parameterTypes.push(parameterType) + this.parameterTypesByRegexp.set( + parameterTypeRegexp, + parameterTypes.sort(ParameterType.compare) + ) + } + } + } +} diff --git a/node_modules/@cucumber/cucumber-expressions/src/RegularExpression.ts b/node_modules/@cucumber/cucumber-expressions/src/RegularExpression.ts new file mode 100644 index 00000000..40880512 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/src/RegularExpression.ts @@ -0,0 +1,50 @@ +import Argument from './Argument.js' +import ParameterType from './ParameterType.js' +import ParameterTypeRegistry from './ParameterTypeRegistry.js' +import TreeRegexp from './TreeRegexp.js' +import { Expression } from './types.js' + +export default class RegularExpression implements Expression { + private readonly treeRegexp: TreeRegexp + + constructor( + public readonly regexp: RegExp, + private readonly parameterTypeRegistry: ParameterTypeRegistry + ) { + this.treeRegexp = new TreeRegexp(regexp) + } + + public match(text: string): readonly Argument[] | null { + const group = this.treeRegexp.match(text) + if (!group) { + return null + } + + const parameterTypes = this.treeRegexp.groupBuilder.children.map((groupBuilder) => { + const parameterTypeRegexp = groupBuilder.source + + const parameterType = this.parameterTypeRegistry.lookupByRegexp( + parameterTypeRegexp, + this.regexp, + text + ) + return ( + parameterType || + new ParameterType( + undefined, + parameterTypeRegexp, + String, + (s) => (s === undefined ? null : s), + false, + false + ) + ) + }) + + return Argument.build(group, parameterTypes) + } + + get source(): string { + return this.regexp.source + } +} diff --git a/node_modules/@cucumber/cucumber-expressions/src/TreeRegexp.ts b/node_modules/@cucumber/cucumber-expressions/src/TreeRegexp.ts new file mode 100644 index 00000000..d5f46b61 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/src/TreeRegexp.ts @@ -0,0 +1,83 @@ +import execWithIndices from 'regexp-match-indices' + +import Group from './Group.js' +import GroupBuilder from './GroupBuilder.js' + +export default class TreeRegexp { + public readonly regexp: RegExp + public readonly groupBuilder: GroupBuilder + + constructor(regexp: RegExp | string) { + if (regexp instanceof RegExp) { + this.regexp = regexp + } else { + this.regexp = new RegExp(regexp) + } + this.groupBuilder = TreeRegexp.createGroupBuilder(this.regexp) + } + + private static createGroupBuilder(regexp: RegExp): GroupBuilder { + const source = regexp.source + const stack: GroupBuilder[] = [new GroupBuilder()] + const groupStartStack: number[] = [] + let escaping = false + let charClass = false + + for (let i = 0; i < source.length; i++) { + const c = source[i] + if (c === '[' && !escaping) { + charClass = true + } else if (c === ']' && !escaping) { + charClass = false + } else if (c === '(' && !escaping && !charClass) { + groupStartStack.push(i) + const nonCapturing = TreeRegexp.isNonCapturing(source, i) + const groupBuilder = new GroupBuilder() + if (nonCapturing) { + groupBuilder.setNonCapturing() + } + stack.push(groupBuilder) + } else if (c === ')' && !escaping && !charClass) { + const gb = stack.pop() + if (!gb) throw new Error('Empty stack') + const groupStart = groupStartStack.pop() + if (gb.capturing) { + gb.source = source.substring((groupStart || 0) + 1, i) + stack[stack.length - 1].add(gb) + } else { + gb.moveChildrenTo(stack[stack.length - 1]) + } + } + escaping = c === '\\' && !escaping + } + const result = stack.pop() + if (!result) throw new Error('Empty stack') + return result + } + + private static isNonCapturing(source: string, i: number): boolean { + // Regex is valid. Bounds check not required. + if (source[i + 1] !== '?') { + // (X) + return false + } + if (source[i + 2] !== '<') { + // (?:X) + // (?=X) + // (?!X) + return true + } + // (?<=X) or (?X) + return source[i + 3] === '=' || source[i + 3] === '!' + } + + public match(s: string): Group | null { + const match = execWithIndices(this.regexp, s) + if (!match) { + return null + } + let groupIndex = 0 + const nextGroupIndex = () => groupIndex++ + return this.groupBuilder.build(match, nextGroupIndex) + } +} diff --git a/node_modules/@cucumber/cucumber-expressions/src/defineDefaultParameterTypes.ts b/node_modules/@cucumber/cucumber-expressions/src/defineDefaultParameterTypes.ts new file mode 100644 index 00000000..045ec21d --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/src/defineDefaultParameterTypes.ts @@ -0,0 +1,122 @@ +import ParameterType from './ParameterType.js' +import { DefinesParameterType } from './types.js' + +const INTEGER_REGEXPS = [/-?\d+/, /\d+/] +const FLOAT_REGEXP = /(?=.*\d.*)[-+]?\d*(?:\.(?=\d.*))?\d*(?:\d+[E][+-]?\d+)?/ +const WORD_REGEXP = /[^\s]+/ +const STRING_REGEXP = /"([^"\\]*(\\.[^"\\]*)*)"|'([^'\\]*(\\.[^'\\]*)*)'/ +const ANONYMOUS_REGEXP = /.*/ + +export default function defineDefaultParameterTypes(registry: DefinesParameterType) { + registry.defineParameterType( + new ParameterType( + 'int', + INTEGER_REGEXPS, + Number, + (s) => (s === undefined ? null : Number(s)), + true, + true, + true + ) + ) + registry.defineParameterType( + new ParameterType( + 'float', + FLOAT_REGEXP, + Number, + (s) => (s === undefined ? null : parseFloat(s)), + true, + false, + true + ) + ) + registry.defineParameterType( + new ParameterType('word', WORD_REGEXP, String, (s) => s, false, false, true) + ) + registry.defineParameterType( + new ParameterType( + 'string', + STRING_REGEXP, + String, + (s1, s2) => (s1 || s2 || '').replace(/\\"/g, '"').replace(/\\'/g, "'"), + true, + false, + true + ) + ) + registry.defineParameterType( + new ParameterType('', ANONYMOUS_REGEXP, String, (s) => s, false, true, true) + ) + + registry.defineParameterType( + new ParameterType( + 'double', + FLOAT_REGEXP, + Number, + (s) => (s === undefined ? null : parseFloat(s)), + false, + false, + true + ) + ) + + registry.defineParameterType( + new ParameterType( + 'bigdecimal', + FLOAT_REGEXP, + String, + (s) => (s === undefined ? null : s), + false, + false, + true + ) + ) + + registry.defineParameterType( + new ParameterType( + 'byte', + INTEGER_REGEXPS, + Number, + (s) => (s === undefined ? null : Number(s)), + false, + false, + true + ) + ) + + registry.defineParameterType( + new ParameterType( + 'short', + INTEGER_REGEXPS, + Number, + (s) => (s === undefined ? null : Number(s)), + false, + false, + true + ) + ) + + registry.defineParameterType( + new ParameterType( + 'long', + INTEGER_REGEXPS, + Number, + (s) => (s === undefined ? null : Number(s)), + false, + false, + true + ) + ) + + registry.defineParameterType( + new ParameterType( + 'biginteger', + INTEGER_REGEXPS, + BigInt, + (s) => (s === undefined ? null : BigInt(s)), + false, + false, + true + ) + ) +} diff --git a/node_modules/@cucumber/cucumber-expressions/src/index.ts b/node_modules/@cucumber/cucumber-expressions/src/index.ts new file mode 100644 index 00000000..8e2563ae --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/src/index.ts @@ -0,0 +1,31 @@ +import Argument from './Argument.js' +import { Located, Node, NodeType, Token, TokenType } from './Ast.js' +import CucumberExpression from './CucumberExpression.js' +import CucumberExpressionGenerator from './CucumberExpressionGenerator.js' +import ExpressionFactory from './ExpressionFactory.js' +import GeneratedExpression from './GeneratedExpression.js' +import Group from './Group.js' +import ParameterType, { RegExps, StringOrRegExp } from './ParameterType.js' +import ParameterTypeRegistry from './ParameterTypeRegistry.js' +import RegularExpression from './RegularExpression.js' +import { Expression } from './types.js' + +export { + Argument, + CucumberExpression, + CucumberExpressionGenerator, + Expression, + ExpressionFactory, + GeneratedExpression, + Group, + Located, + Node, + NodeType, + ParameterType, + ParameterTypeRegistry, + RegExps, + RegularExpression, + StringOrRegExp, + Token, + TokenType, +} diff --git a/node_modules/@cucumber/cucumber-expressions/src/types.ts b/node_modules/@cucumber/cucumber-expressions/src/types.ts new file mode 100644 index 00000000..1a3db787 --- /dev/null +++ b/node_modules/@cucumber/cucumber-expressions/src/types.ts @@ -0,0 +1,26 @@ +import Argument from './Argument.js' +import ParameterType from './ParameterType.js' + +export interface DefinesParameterType { + defineParameterType(parameterType: ParameterType): void +} + +export interface Expression { + readonly source: string + match(text: string): readonly Argument[] | null +} + +export type ParameterInfo = { + /** + * The string representation of the original ParameterType#type property + */ + type: string | null + /** + * The parameter type name + */ + name: string + /** + * The number of times this name has been used so far + */ + count: number +} diff --git a/node_modules/@cucumber/cucumber/LICENSE b/node_modules/@cucumber/cucumber/LICENSE new file mode 100644 index 00000000..9251d8e6 --- /dev/null +++ b/node_modules/@cucumber/cucumber/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Julien Biezemans and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/@cucumber/cucumber/README.md b/node_modules/@cucumber/cucumber/README.md new file mode 100644 index 00000000..12e6a79a --- /dev/null +++ b/node_modules/@cucumber/cucumber/README.md @@ -0,0 +1,128 @@ +

+ +
+ Cucumber +

+

+ Automated tests in plain language, for Node.js +

+ +

+ Latest version on npm + Build status + Coverage + Backers + Sponsors + Ukraine solidarity +

+ +[Cucumber](https://github.com/cucumber) is a tool for running automated tests written in plain language. Because they're +written in plain language, they can be read by anyone on your team. Because they can be +read by anyone, you can use them to help improve communication, collaboration and trust on +your team. + +This is the JavaScript implementation of Cucumber. It runs on [maintained versions](https://github.com/nodejs/Release) of Node.js. You can [quickly try it via CodeSandbox](https://codesandbox.io/s/cucumber-js-demo-2p3vrl?file=/features/greeting.feature), or read on to get started locally in a couple of minutes. + +Looking to contribute? Read our [code of conduct](https://github.com/cucumber/.github/blob/main/CODE_OF_CONDUCT.md) first, then check the [contributing guide](./CONTRIBUTING.md) to get up and running. + +## Install + +Cucumber is [available on npm](https://www.npmjs.com/package/@cucumber/cucumber): + +```shell +npm install @cucumber/cucumber +``` + +## Get Started + +Let's take this example of something to test: + + +First, write your main code in `src/index.js`: + +```js +class Greeter { + sayHello() { + return 'hello' + } +} + +module.exports = { + Greeter +} +``` + +Then, write your feature in `features/greeting.feature`: + +```gherkin +Feature: Greeting + + Scenario: Say hello + When the greeter says hello + Then I should have heard "hello" +``` + +Next, implement your steps in `features/support/steps.js`: + +```js +const assert = require('assert') +const { When, Then } = require('@cucumber/cucumber') +const { Greeter } = require('../../src') + +When('the greeter says hello', function () { + this.whatIHeard = new Greeter().sayHello() +}); + +Then('I should have heard {string}', function (expectedResponse) { + assert.equal(this.whatIHeard, expectedResponse) +}); +``` + +Finally, run Cucumber: + +```shell +npx cucumber-js +``` + +And see the output: + +![Terminal output showing a successful test run with 1 scenario and 2 steps, all passing](./docs/images/readme-output.png) + +If you learn best by example, we have [a repo with several example projects](https://github.com/cucumber/cucumber-js-examples), that might help you get going. + +## Documentation + +The following documentation is for `main`, which might contain some unreleased features. See [documentation for older versions](./docs/older_versions.md) if you need it. + +* [Installation](./docs/installation.md) +* [CLI](./docs/cli.md) +* [Configuration](./docs/configuration.md) +* Support Code + * [API Reference](./docs/support_files/api_reference.md) + * [Attachments](./docs/support_files/attachments.md) + * [Data Tables](./docs/support_files/data_table_interface.md) + * [Hooks](./docs/support_files/hooks.md) + * [Step Definitions](./docs/support_files/step_definitions.md) + * [Timeouts](./docs/support_files/timeouts.md) + * [World](./docs/support_files/world.md) +* Guides + * [Debugging](./docs/debugging.md) + * [Dry run](./docs/dry_run.md) + * [ES Modules](./docs/esm.md) + * [Failing fast](./docs/fail_fast.md) + * [Filtering which scenarios run](./docs/filtering.md) + * [Formatters for feedback and reporting](./docs/formatters.md) + * [Parallel running for speed](./docs/parallel.md) + * [Plugins for extending functionality](./docs/plugins.md) + * [Profiles for composable configuration](./docs/profiles.md) + * [Rerunning just failures](./docs/rerun.md) + * [Retrying flaky scenarios](./docs/retry.md) + * [Sharding to split tests across machines](./docs/sharding.md) + * [JavaScript API for running programmatically](./docs/javascript_api.md) + * [Snippets for undefined steps](./docs/snippets.md) + * [Transpiling (from TypeScript etc)](./docs/transpiling.md) +* [FAQ](./docs/faq.md) + +## Support + +Support is [available from the community](https://cucumber.io/tools/cucumber-open/support/) if you need it. diff --git a/node_modules/@cucumber/cucumber/api/index.d.ts b/node_modules/@cucumber/cucumber/api/index.d.ts new file mode 100644 index 00000000..ade5a81b --- /dev/null +++ b/node_modules/@cucumber/cucumber/api/index.d.ts @@ -0,0 +1,6 @@ +/* +allows TypeScript to see `@cucumber/cucumber/api` where it doesn't yet support +subpath exports, see + */ + +export * from '../lib/api' diff --git a/node_modules/@cucumber/cucumber/bin/cucumber-js b/node_modules/@cucumber/cucumber/bin/cucumber-js new file mode 100644 index 00000000..2460cb26 --- /dev/null +++ b/node_modules/@cucumber/cucumber/bin/cucumber-js @@ -0,0 +1,3 @@ +#!/usr/bin/env node + +require('../lib/cli/run.js').default(); diff --git a/node_modules/@cucumber/cucumber/bin/cucumber.js b/node_modules/@cucumber/cucumber/bin/cucumber.js new file mode 100644 index 00000000..2460cb26 --- /dev/null +++ b/node_modules/@cucumber/cucumber/bin/cucumber.js @@ -0,0 +1,3 @@ +#!/usr/bin/env node + +require('../lib/cli/run.js').default(); diff --git a/node_modules/@cucumber/cucumber/lib/api/convert_configuration.d.ts b/node_modules/@cucumber/cucumber/lib/api/convert_configuration.d.ts new file mode 100644 index 00000000..843e0c77 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/convert_configuration.d.ts @@ -0,0 +1,4 @@ +import { IConfiguration } from '../configuration'; +import { ILogger } from '../environment'; +import { IRunConfiguration } from './types'; +export declare function convertConfiguration(logger: ILogger, flatConfiguration: IConfiguration, env: NodeJS.ProcessEnv): Promise; diff --git a/node_modules/@cucumber/cucumber/lib/api/convert_configuration.js b/node_modules/@cucumber/cucumber/lib/api/convert_configuration.js new file mode 100644 index 00000000..a0cad041 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/convert_configuration.js @@ -0,0 +1,70 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.convertConfiguration = convertConfiguration; +const configuration_1 = require("../configuration"); +async function convertConfiguration(logger, flatConfiguration, env) { + return { + sources: { + paths: flatConfiguration.paths, + defaultDialect: flatConfiguration.language, + names: flatConfiguration.name, + tagExpression: flatConfiguration.tags, + order: flatConfiguration.order, + shard: flatConfiguration.shard, + }, + support: { + requireModules: flatConfiguration.requireModule, + requirePaths: flatConfiguration.require, + importPaths: flatConfiguration.import, + loaders: flatConfiguration.loader, + }, + runtime: { + dryRun: flatConfiguration.dryRun, + failFast: flatConfiguration.failFast, + filterStacktraces: !flatConfiguration.backtrace, + parallel: flatConfiguration.parallel, + retry: flatConfiguration.retry, + retryTagFilter: flatConfiguration.retryTagFilter, + strict: flatConfiguration.strict, + worldParameters: flatConfiguration.worldParameters, + }, + formats: convertFormats(logger, flatConfiguration, env), + plugins: { + specifiers: flatConfiguration.plugin, + options: flatConfiguration.pluginOptions, + }, + }; +} +function convertFormats(logger, flatConfiguration, env) { + const splitFormats = flatConfiguration.format.map((item) => Array.isArray(item) ? item : (0, configuration_1.splitFormatDescriptor)(logger, item)); + return { + stdout: [...splitFormats].reverse().find(([, target]) => !target)?.[0] ?? + 'progress', + files: splitFormats + .filter(([, target]) => !!target) + .reduce((mapped, [type, target]) => { + return { + ...mapped, + [target]: type, + }; + }, {}), + publish: makePublishConfig(flatConfiguration, env), + options: flatConfiguration.formatOptions, + }; +} +function makePublishConfig(flatConfiguration, env) { + const enabled = isPublishing(flatConfiguration, env); + if (!enabled) { + return false; + } + return { + url: env.CUCUMBER_PUBLISH_URL, + token: env.CUCUMBER_PUBLISH_TOKEN, + }; +} +function isPublishing(flatConfiguration, env) { + return (flatConfiguration.publish || + (0, configuration_1.isTruthyString)(env.CUCUMBER_PUBLISH_ENABLED) || + env.CUCUMBER_PUBLISH_TOKEN !== undefined); +} +//# sourceMappingURL=convert_configuration.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/api/convert_configuration.js.map b/node_modules/@cucumber/cucumber/lib/api/convert_configuration.js.map new file mode 100644 index 00000000..f5dcd179 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/convert_configuration.js.map @@ -0,0 +1 @@ +{"version":3,"file":"convert_configuration.js","sourceRoot":"","sources":["../../src/api/convert_configuration.ts"],"names":[],"mappings":";;AASA,oDAoCC;AA7CD,oDAIyB;AAKlB,KAAK,UAAU,oBAAoB,CACxC,MAAe,EACf,iBAAiC,EACjC,GAAsB;IAEtB,OAAO;QACL,OAAO,EAAE;YACP,KAAK,EAAE,iBAAiB,CAAC,KAAK;YAC9B,cAAc,EAAE,iBAAiB,CAAC,QAAQ;YAC1C,KAAK,EAAE,iBAAiB,CAAC,IAAI;YAC7B,aAAa,EAAE,iBAAiB,CAAC,IAAI;YACrC,KAAK,EAAE,iBAAiB,CAAC,KAAK;YAC9B,KAAK,EAAE,iBAAiB,CAAC,KAAK;SAC/B;QACD,OAAO,EAAE;YACP,cAAc,EAAE,iBAAiB,CAAC,aAAa;YAC/C,YAAY,EAAE,iBAAiB,CAAC,OAAO;YACvC,WAAW,EAAE,iBAAiB,CAAC,MAAM;YACrC,OAAO,EAAE,iBAAiB,CAAC,MAAM;SAClC;QACD,OAAO,EAAE;YACP,MAAM,EAAE,iBAAiB,CAAC,MAAM;YAChC,QAAQ,EAAE,iBAAiB,CAAC,QAAQ;YACpC,iBAAiB,EAAE,CAAC,iBAAiB,CAAC,SAAS;YAC/C,QAAQ,EAAE,iBAAiB,CAAC,QAAQ;YACpC,KAAK,EAAE,iBAAiB,CAAC,KAAK;YAC9B,cAAc,EAAE,iBAAiB,CAAC,cAAc;YAChD,MAAM,EAAE,iBAAiB,CAAC,MAAM;YAChC,eAAe,EAAE,iBAAiB,CAAC,eAAe;SACnD;QACD,OAAO,EAAE,cAAc,CAAC,MAAM,EAAE,iBAAiB,EAAE,GAAG,CAAC;QACvD,OAAO,EAAE;YACP,UAAU,EAAE,iBAAiB,CAAC,MAAM;YACpC,OAAO,EAAE,iBAAiB,CAAC,aAAa;SACzC;KACF,CAAA;AACH,CAAC;AAED,SAAS,cAAc,CACrB,MAAe,EACf,iBAAiC,EACjC,GAAsB;IAEtB,MAAM,YAAY,GAAe,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACrE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAA,qCAAqB,EAAC,MAAM,EAAE,IAAI,CAAC,CACjE,CAAA;IACD,OAAO;QACL,MAAM,EACJ,CAAC,GAAG,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9D,UAAU;QACZ,KAAK,EAAE,YAAY;aAChB,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;aAChC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE;YACjC,OAAO;gBACL,GAAG,MAAM;gBACT,CAAC,MAAM,CAAC,EAAE,IAAI;aACf,CAAA;QACH,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,EAAE,iBAAiB,CAAC,iBAAiB,EAAE,GAAG,CAAC;QAClD,OAAO,EAAE,iBAAiB,CAAC,aAAa;KACzC,CAAA;AACH,CAAC;AAED,SAAS,iBAAiB,CACxB,iBAAiC,EACjC,GAAsB;IAEtB,MAAM,OAAO,GAAG,YAAY,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAA;IACpD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO;QACL,GAAG,EAAE,GAAG,CAAC,oBAAoB;QAC7B,KAAK,EAAE,GAAG,CAAC,sBAAsB;KAClC,CAAA;AACH,CAAC;AAED,SAAS,YAAY,CACnB,iBAAiC,EACjC,GAAsB;IAEtB,OAAO,CACL,iBAAiB,CAAC,OAAO;QACzB,IAAA,8BAAc,EAAC,GAAG,CAAC,wBAAwB,CAAC;QAC5C,GAAG,CAAC,sBAAsB,KAAK,SAAS,CACzC,CAAA;AACH,CAAC","sourcesContent":["import {\n IConfiguration,\n isTruthyString,\n splitFormatDescriptor,\n} from '../configuration'\nimport { IPublishConfig } from '../publish'\nimport { ILogger } from '../environment'\nimport { IRunConfiguration } from './types'\n\nexport async function convertConfiguration(\n logger: ILogger,\n flatConfiguration: IConfiguration,\n env: NodeJS.ProcessEnv\n): Promise {\n return {\n sources: {\n paths: flatConfiguration.paths,\n defaultDialect: flatConfiguration.language,\n names: flatConfiguration.name,\n tagExpression: flatConfiguration.tags,\n order: flatConfiguration.order,\n shard: flatConfiguration.shard,\n },\n support: {\n requireModules: flatConfiguration.requireModule,\n requirePaths: flatConfiguration.require,\n importPaths: flatConfiguration.import,\n loaders: flatConfiguration.loader,\n },\n runtime: {\n dryRun: flatConfiguration.dryRun,\n failFast: flatConfiguration.failFast,\n filterStacktraces: !flatConfiguration.backtrace,\n parallel: flatConfiguration.parallel,\n retry: flatConfiguration.retry,\n retryTagFilter: flatConfiguration.retryTagFilter,\n strict: flatConfiguration.strict,\n worldParameters: flatConfiguration.worldParameters,\n },\n formats: convertFormats(logger, flatConfiguration, env),\n plugins: {\n specifiers: flatConfiguration.plugin,\n options: flatConfiguration.pluginOptions,\n },\n }\n}\n\nfunction convertFormats(\n logger: ILogger,\n flatConfiguration: IConfiguration,\n env: NodeJS.ProcessEnv\n) {\n const splitFormats: string[][] = flatConfiguration.format.map((item) =>\n Array.isArray(item) ? item : splitFormatDescriptor(logger, item)\n )\n return {\n stdout:\n [...splitFormats].reverse().find(([, target]) => !target)?.[0] ??\n 'progress',\n files: splitFormats\n .filter(([, target]) => !!target)\n .reduce((mapped, [type, target]) => {\n return {\n ...mapped,\n [target]: type,\n }\n }, {}),\n publish: makePublishConfig(flatConfiguration, env),\n options: flatConfiguration.formatOptions,\n }\n}\n\nfunction makePublishConfig(\n flatConfiguration: IConfiguration,\n env: NodeJS.ProcessEnv\n): IPublishConfig | false {\n const enabled = isPublishing(flatConfiguration, env)\n if (!enabled) {\n return false\n }\n return {\n url: env.CUCUMBER_PUBLISH_URL,\n token: env.CUCUMBER_PUBLISH_TOKEN,\n }\n}\n\nfunction isPublishing(\n flatConfiguration: IConfiguration,\n env: NodeJS.ProcessEnv\n): boolean {\n return (\n flatConfiguration.publish ||\n isTruthyString(env.CUCUMBER_PUBLISH_ENABLED) ||\n env.CUCUMBER_PUBLISH_TOKEN !== undefined\n )\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/api/emit_support_code_messages.d.ts b/node_modules/@cucumber/cucumber/lib/api/emit_support_code_messages.d.ts new file mode 100644 index 00000000..e1c4e9f6 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/emit_support_code_messages.d.ts @@ -0,0 +1,9 @@ +import { EventEmitter } from 'node:events'; +import { IdGenerator } from '@cucumber/messages'; +import { SupportCodeLibrary } from '../support_code_library_builder/types'; +export declare function emitMetaMessage(eventBroadcaster: EventEmitter, env: NodeJS.ProcessEnv): Promise; +export declare function emitSupportCodeMessages({ eventBroadcaster, supportCodeLibrary, newId, }: { + eventBroadcaster: EventEmitter; + supportCodeLibrary: SupportCodeLibrary; + newId: IdGenerator.NewId; +}): void; diff --git a/node_modules/@cucumber/cucumber/lib/api/emit_support_code_messages.js b/node_modules/@cucumber/cucumber/lib/api/emit_support_code_messages.js new file mode 100644 index 00000000..41544a1b --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/emit_support_code_messages.js @@ -0,0 +1,180 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.emitMetaMessage = emitMetaMessage; +exports.emitSupportCodeMessages = emitSupportCodeMessages; +const node_os_1 = __importDefault(require("node:os")); +const messages = __importStar(require("@cucumber/messages")); +const messages_1 = require("@cucumber/messages"); +const ci_environment_1 = __importDefault(require("@cucumber/ci-environment")); +const version_1 = require("../version"); +async function emitMetaMessage(eventBroadcaster, env) { + const meta = { + protocolVersion: messages.version, + implementation: { + version: version_1.version, + name: 'cucumber-js', + }, + cpu: { + name: node_os_1.default.arch(), + }, + os: { + name: node_os_1.default.platform(), + version: node_os_1.default.release(), + }, + runtime: { + name: 'node.js', + version: process.versions.node, + }, + ci: (0, ci_environment_1.default)(env), + }; + eventBroadcaster.emit('envelope', { + meta, + }); +} +function makeSourceReference(source) { + return { + uri: source.uri, + location: { + line: source.line, + }, + }; +} +function extractPatternSource(pattern) { + if (pattern instanceof RegExp) { + return pattern.flags ? pattern.toString() : pattern.source; + } + return pattern; +} +function collectParameterTypeEnvelopes(supportCodeLibrary, newId) { + const ordered = []; + for (const parameterType of supportCodeLibrary.parameterTypeRegistry + .parameterTypes) { + if (parameterType.builtin) { + continue; + } + const source = supportCodeLibrary.parameterTypeRegistry.lookupSource(parameterType); + ordered.push({ + order: source.order, + envelope: { + parameterType: { + id: newId(), + name: parameterType.name, + preferForRegularExpressionMatch: parameterType.preferForRegexpMatch, + regularExpressions: parameterType.regexpStrings, + useForSnippets: parameterType.useForSnippets, + sourceReference: makeSourceReference(source), + }, + }, + }); + } + return ordered; +} +function collectStepDefinitionEnvelopes(supportCodeLibrary) { + return supportCodeLibrary.stepDefinitions.map((stepDefinition) => ({ + order: stepDefinition.order, + envelope: { + stepDefinition: { + id: stepDefinition.id, + pattern: { + source: extractPatternSource(stepDefinition.pattern), + type: typeof stepDefinition.pattern === 'string' + ? messages.StepDefinitionPatternType.CUCUMBER_EXPRESSION + : messages.StepDefinitionPatternType.REGULAR_EXPRESSION, + }, + sourceReference: makeSourceReference(stepDefinition), + }, + }, + })); +} +function collectHookEnvelopes(supportCodeLibrary) { + const allHooks = [ + [ + supportCodeLibrary.beforeTestCaseHookDefinitions, + messages_1.HookType.BEFORE_TEST_CASE, + ], + [ + supportCodeLibrary.afterTestCaseHookDefinitions, + messages_1.HookType.AFTER_TEST_CASE, + ], + [ + supportCodeLibrary.beforeTestRunHookDefinitions, + messages_1.HookType.BEFORE_TEST_RUN, + ], + [ + supportCodeLibrary.afterTestRunHookDefinitions, + messages_1.HookType.AFTER_TEST_RUN, + ], + ]; + const ordered = []; + allHooks.forEach(([hooks, type]) => { + hooks.forEach((hook) => { + ordered.push({ + order: hook.order, + envelope: { + hook: { + id: hook.id, + type, + name: hook.name, + ...('tagExpression' in hook && { + tagExpression: hook.tagExpression, + }), + sourceReference: makeSourceReference(hook), + }, + }, + }); + }); + }); + return ordered; +} +function emitSupportCodeMessages({ eventBroadcaster, supportCodeLibrary, newId, }) { + const orderedEnvelopes = [ + ...collectParameterTypeEnvelopes(supportCodeLibrary, newId), + ...collectStepDefinitionEnvelopes(supportCodeLibrary), + ...collectHookEnvelopes(supportCodeLibrary), + ]; + orderedEnvelopes + .sort((a, b) => a.order - b.order) + .forEach(({ envelope }) => eventBroadcaster.emit('envelope', envelope)); + supportCodeLibrary.undefinedParameterTypes + .map((undefinedParameterType) => ({ + undefinedParameterType, + })) + .forEach((envelope) => eventBroadcaster.emit('envelope', envelope)); +} +//# sourceMappingURL=emit_support_code_messages.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/api/emit_support_code_messages.js.map b/node_modules/@cucumber/cucumber/lib/api/emit_support_code_messages.js.map new file mode 100644 index 00000000..1fa14936 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/emit_support_code_messages.js.map @@ -0,0 +1 @@ +{"version":3,"file":"emit_support_code_messages.js","sourceRoot":"","sources":["../../src/api/emit_support_code_messages.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventEmitter } from 'node:events'\nimport os from 'node:os'\nimport * as messages from '@cucumber/messages'\nimport { Envelope, HookType, IdGenerator } from '@cucumber/messages'\nimport detectCiEnvironment from '@cucumber/ci-environment'\nimport { SupportCodeLibrary } from '../support_code_library_builder/types'\nimport { version } from '../version'\nimport { ILineAndUri } from '../types'\n\ninterface OrderedEnvelope {\n order: number\n envelope: messages.Envelope\n}\n\nexport async function emitMetaMessage(\n eventBroadcaster: EventEmitter,\n env: NodeJS.ProcessEnv\n): Promise {\n const meta: messages.Meta = {\n protocolVersion: messages.version,\n implementation: {\n version,\n name: 'cucumber-js',\n },\n cpu: {\n name: os.arch(),\n },\n os: {\n name: os.platform(),\n version: os.release(),\n },\n runtime: {\n name: 'node.js',\n version: process.versions.node,\n },\n ci: detectCiEnvironment(env),\n }\n eventBroadcaster.emit('envelope', {\n meta,\n })\n}\n\nfunction makeSourceReference(source: ILineAndUri) {\n return {\n uri: source.uri,\n location: {\n line: source.line,\n },\n }\n}\n\nfunction extractPatternSource(pattern: string | RegExp) {\n if (pattern instanceof RegExp) {\n return pattern.flags ? pattern.toString() : pattern.source\n }\n return pattern\n}\n\nfunction collectParameterTypeEnvelopes(\n supportCodeLibrary: SupportCodeLibrary,\n newId: IdGenerator.NewId\n): ReadonlyArray {\n const ordered: Array = []\n for (const parameterType of supportCodeLibrary.parameterTypeRegistry\n .parameterTypes) {\n if (parameterType.builtin) {\n continue\n }\n const source =\n supportCodeLibrary.parameterTypeRegistry.lookupSource(parameterType)\n ordered.push({\n order: source.order,\n envelope: {\n parameterType: {\n id: newId(),\n name: parameterType.name,\n preferForRegularExpressionMatch: parameterType.preferForRegexpMatch,\n regularExpressions: parameterType.regexpStrings,\n useForSnippets: parameterType.useForSnippets,\n sourceReference: makeSourceReference(source),\n },\n },\n })\n }\n return ordered\n}\n\nfunction collectStepDefinitionEnvelopes(\n supportCodeLibrary: SupportCodeLibrary\n): ReadonlyArray {\n return supportCodeLibrary.stepDefinitions.map((stepDefinition) => ({\n order: stepDefinition.order,\n envelope: {\n stepDefinition: {\n id: stepDefinition.id,\n pattern: {\n source: extractPatternSource(stepDefinition.pattern),\n type:\n typeof stepDefinition.pattern === 'string'\n ? messages.StepDefinitionPatternType.CUCUMBER_EXPRESSION\n : messages.StepDefinitionPatternType.REGULAR_EXPRESSION,\n },\n sourceReference: makeSourceReference(stepDefinition),\n },\n },\n }))\n}\n\nfunction collectHookEnvelopes(\n supportCodeLibrary: SupportCodeLibrary\n): ReadonlyArray {\n const allHooks = [\n [\n supportCodeLibrary.beforeTestCaseHookDefinitions,\n HookType.BEFORE_TEST_CASE,\n ] as const,\n [\n supportCodeLibrary.afterTestCaseHookDefinitions,\n HookType.AFTER_TEST_CASE,\n ] as const,\n [\n supportCodeLibrary.beforeTestRunHookDefinitions,\n HookType.BEFORE_TEST_RUN,\n ] as const,\n [\n supportCodeLibrary.afterTestRunHookDefinitions,\n HookType.AFTER_TEST_RUN,\n ] as const,\n ]\n const ordered: Array = []\n allHooks.forEach(([hooks, type]) => {\n hooks.forEach((hook) => {\n ordered.push({\n order: hook.order,\n envelope: {\n hook: {\n id: hook.id,\n type,\n name: hook.name,\n ...('tagExpression' in hook && {\n tagExpression: hook.tagExpression,\n }),\n sourceReference: makeSourceReference(hook),\n },\n } satisfies Envelope,\n })\n })\n })\n return ordered\n}\n\nexport function emitSupportCodeMessages({\n eventBroadcaster,\n supportCodeLibrary,\n newId,\n}: {\n eventBroadcaster: EventEmitter\n supportCodeLibrary: SupportCodeLibrary\n newId: IdGenerator.NewId\n}): void {\n const orderedEnvelopes = [\n ...collectParameterTypeEnvelopes(supportCodeLibrary, newId),\n ...collectStepDefinitionEnvelopes(supportCodeLibrary),\n ...collectHookEnvelopes(supportCodeLibrary),\n ]\n orderedEnvelopes\n .sort((a, b) => a.order - b.order)\n .forEach(({ envelope }) => eventBroadcaster.emit('envelope', envelope))\n\n supportCodeLibrary.undefinedParameterTypes\n .map((undefinedParameterType) => ({\n undefinedParameterType,\n }))\n .forEach((envelope) => eventBroadcaster.emit('envelope', envelope))\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/api/formatters.d.ts b/node_modules/@cucumber/cucumber/lib/api/formatters.d.ts new file mode 100644 index 00000000..703d2c17 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/formatters.d.ts @@ -0,0 +1,20 @@ +import { EventEmitter } from 'node:events'; +import { IFormatterStream } from '../formatter'; +import { EventDataCollector } from '../formatter/helpers'; +import { SupportCodeLibrary } from '../support_code_library_builder/types'; +import { ILogger } from '../environment'; +import { PluginManager } from '../plugin'; +import { IRunOptionsFormats } from './types'; +export declare function initializeFormatters({ env, cwd, stdout, logger, onStreamError, eventBroadcaster, eventDataCollector, configuration, supportCodeLibrary, pluginManager, }: { + env: NodeJS.ProcessEnv; + cwd: string; + stdout: IFormatterStream; + stderr: IFormatterStream; + logger: ILogger; + onStreamError: () => void; + eventBroadcaster: EventEmitter; + eventDataCollector: EventDataCollector; + configuration: IRunOptionsFormats; + supportCodeLibrary: SupportCodeLibrary; + pluginManager: PluginManager; +}): Promise<() => Promise>; diff --git a/node_modules/@cucumber/cucumber/lib/api/formatters.js b/node_modules/@cucumber/cucumber/lib/api/formatters.js new file mode 100644 index 00000000..54ba2c3b --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/formatters.js @@ -0,0 +1,52 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.initializeFormatters = initializeFormatters; +const node_util_1 = require("node:util"); +const builder_1 = __importDefault(require("../formatter/builder")); +const create_stream_1 = require("../formatter/create_stream"); +const resolve_implementation_1 = require("../formatter/resolve_implementation"); +async function initializeFormatters({ env, cwd, stdout, logger, onStreamError, eventBroadcaster, eventDataCollector, configuration, supportCodeLibrary, pluginManager, }) { + const cleanupFns = []; + async function initializeFormatter(stream, directory, target, specifier) { + if (specifier === 'progress-bar' && !stream.isTTY) { + logger.warn(`Cannot use 'progress-bar' formatter for output to '${target}' as not a TTY. Switching to 'progress' formatter.`); + specifier = 'progress'; + } + const implementation = await (0, resolve_implementation_1.resolveImplementation)(specifier, cwd); + if (typeof implementation === 'function') { + const typeOptions = { + env, + cwd, + eventBroadcaster, + eventDataCollector, + log: stream.write.bind(stream), + parsedArgvOptions: configuration.options, + stream, + cleanup: stream === stdout + ? async () => await Promise.resolve() + : (0, node_util_1.promisify)(stream.end.bind(stream)), + supportCodeLibrary, + }; + const formatter = await builder_1.default.build(implementation, typeOptions); + cleanupFns.push(async () => formatter.finished()); + } + else { + await pluginManager.initFormatter(implementation, configuration.options, stream, stream.write.bind(stream), directory); + if (stream !== stdout) { + cleanupFns.push((0, node_util_1.promisify)(stream.end.bind(stream))); + } + } + } + await initializeFormatter(stdout, undefined, 'stdout', configuration.stdout); + for (const [target, specifier] of Object.entries(configuration.files)) { + const { stream, directory } = await (0, create_stream_1.createStream)(target, onStreamError, cwd, logger); + await initializeFormatter(stream, directory, target, specifier); + } + return async function () { + await Promise.all(cleanupFns.map((cleanupFn) => cleanupFn())); + }; +} +//# sourceMappingURL=formatters.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/api/formatters.js.map b/node_modules/@cucumber/cucumber/lib/api/formatters.js.map new file mode 100644 index 00000000..388f825b --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/formatters.js.map @@ -0,0 +1 @@ +{"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../src/api/formatters.ts"],"names":[],"mappings":";;;;;AAaA,oDAuFC;AAnGD,yCAAqC;AAKrC,mEAAmD;AAEnD,8DAAyD;AACzD,gFAA2E;AAIpE,KAAK,UAAU,oBAAoB,CAAC,EACzC,GAAG,EACH,GAAG,EACH,MAAM,EACN,MAAM,EACN,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,aAAa,GAad;IACC,MAAM,UAAU,GAA+B,EAAE,CAAA;IAEjD,KAAK,UAAU,mBAAmB,CAChC,MAAwB,EACxB,SAA6B,EAC7B,MAAc,EACd,SAAiB;QAEjB,IAAI,SAAS,KAAK,cAAc,IAAI,CAAE,MAAyB,CAAC,KAAK,EAAE,CAAC;YACtE,MAAM,CAAC,IAAI,CACT,sDAAsD,MAAM,oDAAoD,CACjH,CAAA;YACD,SAAS,GAAG,UAAU,CAAA;QACxB,CAAC;QACD,MAAM,cAAc,GAAG,MAAM,IAAA,8CAAqB,EAAC,SAAS,EAAE,GAAG,CAAC,CAAA;QAClE,IAAI,OAAO,cAAc,KAAK,UAAU,EAAE,CAAC;YACzC,MAAM,WAAW,GAAG;gBAClB,GAAG;gBACH,GAAG;gBACH,gBAAgB;gBAChB,kBAAkB;gBAClB,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC9B,iBAAiB,EAAE,aAAa,CAAC,OAAO;gBACxC,MAAM;gBACN,OAAO,EACL,MAAM,KAAK,MAAM;oBACf,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE;oBACrC,CAAC,CAAC,IAAA,qBAAS,EAAM,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC7C,kBAAkB;aACnB,CAAA;YACD,MAAM,SAAS,GAAG,MAAM,iBAAgB,CAAC,KAAK,CAC5C,cAAc,EACd,WAAW,CACZ,CAAA;YACD,UAAU,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAA;QACnD,CAAC;aAAM,CAAC;YACN,MAAM,aAAa,CAAC,aAAa,CAC/B,cAAc,EACd,aAAa,CAAC,OAAO,EACrB,MAAM,EACN,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EACzB,SAAS,CACV,CAAA;YACD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACtB,UAAU,CAAC,IAAI,CAAC,IAAA,qBAAS,EAAM,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;YAC1D,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IAC5E,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QACtE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAA,4BAAY,EAC9C,MAAM,EACN,aAAa,EACb,GAAG,EACH,MAAM,CACP,CAAA;QACD,MAAM,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;IACjE,CAAC;IAED,OAAO,KAAK;QACV,MAAM,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;IAC/D,CAAC,CAAA;AACH,CAAC","sourcesContent":["import { EventEmitter } from 'node:events'\nimport { promisify } from 'node:util'\nimport { WriteStream as TtyWriteStream } from 'node:tty'\nimport { IFormatterStream } from '../formatter'\nimport { EventDataCollector } from '../formatter/helpers'\nimport { SupportCodeLibrary } from '../support_code_library_builder/types'\nimport FormatterBuilder from '../formatter/builder'\nimport { ILogger } from '../environment'\nimport { createStream } from '../formatter/create_stream'\nimport { resolveImplementation } from '../formatter/resolve_implementation'\nimport { PluginManager } from '../plugin'\nimport { IRunOptionsFormats } from './types'\n\nexport async function initializeFormatters({\n env,\n cwd,\n stdout,\n logger,\n onStreamError,\n eventBroadcaster,\n eventDataCollector,\n configuration,\n supportCodeLibrary,\n pluginManager,\n}: {\n env: NodeJS.ProcessEnv\n cwd: string\n stdout: IFormatterStream\n stderr: IFormatterStream\n logger: ILogger\n onStreamError: () => void\n eventBroadcaster: EventEmitter\n eventDataCollector: EventDataCollector\n configuration: IRunOptionsFormats\n supportCodeLibrary: SupportCodeLibrary\n pluginManager: PluginManager\n}): Promise<() => Promise> {\n const cleanupFns: Array<() => Promise> = []\n\n async function initializeFormatter(\n stream: IFormatterStream,\n directory: string | undefined,\n target: string,\n specifier: string\n ): Promise {\n if (specifier === 'progress-bar' && !(stream as TtyWriteStream).isTTY) {\n logger.warn(\n `Cannot use 'progress-bar' formatter for output to '${target}' as not a TTY. Switching to 'progress' formatter.`\n )\n specifier = 'progress'\n }\n const implementation = await resolveImplementation(specifier, cwd)\n if (typeof implementation === 'function') {\n const typeOptions = {\n env,\n cwd,\n eventBroadcaster,\n eventDataCollector,\n log: stream.write.bind(stream),\n parsedArgvOptions: configuration.options,\n stream,\n cleanup:\n stream === stdout\n ? async () => await Promise.resolve()\n : promisify(stream.end.bind(stream)),\n supportCodeLibrary,\n }\n const formatter = await FormatterBuilder.build(\n implementation,\n typeOptions\n )\n cleanupFns.push(async () => formatter.finished())\n } else {\n await pluginManager.initFormatter(\n implementation,\n configuration.options,\n stream,\n stream.write.bind(stream),\n directory\n )\n if (stream !== stdout) {\n cleanupFns.push(promisify(stream.end.bind(stream)))\n }\n }\n }\n\n await initializeFormatter(stdout, undefined, 'stdout', configuration.stdout)\n for (const [target, specifier] of Object.entries(configuration.files)) {\n const { stream, directory } = await createStream(\n target,\n onStreamError,\n cwd,\n logger\n )\n await initializeFormatter(stream, directory, target, specifier)\n }\n\n return async function () {\n await Promise.all(cleanupFns.map((cleanupFn) => cleanupFn()))\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/api/gherkin.d.ts b/node_modules/@cucumber/cucumber/lib/api/gherkin.d.ts new file mode 100644 index 00000000..ad60c927 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/gherkin.d.ts @@ -0,0 +1,13 @@ +import { Envelope, IdGenerator, ParseError } from '@cucumber/messages'; +import { IFilterablePickle } from '../filter'; +import { ISourcesCoordinates } from './types'; +export declare function getPicklesAndErrors({ newId, cwd, sourcePaths, coordinates, onEnvelope, }: { + newId: IdGenerator.NewId; + cwd: string; + sourcePaths: string[]; + coordinates: ISourcesCoordinates; + onEnvelope?: (envelope: Envelope) => void; +}): Promise<{ + filterablePickles: readonly IFilterablePickle[]; + parseErrors: ParseError[]; +}>; diff --git a/node_modules/@cucumber/cucumber/lib/api/gherkin.js b/node_modules/@cucumber/cucumber/lib/api/gherkin.js new file mode 100644 index 00000000..086eae1b --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/gherkin.js @@ -0,0 +1,44 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getPicklesAndErrors = getPicklesAndErrors; +const gherkin_streams_1 = require("@cucumber/gherkin-streams"); +const gherkin_utils_1 = require("@cucumber/gherkin-utils"); +async function getPicklesAndErrors({ newId, cwd, sourcePaths, coordinates, onEnvelope, }) { + const gherkinQuery = new gherkin_utils_1.Query(); + const parseErrors = []; + await gherkinFromPaths(sourcePaths, { + newId, + relativeTo: cwd, + defaultDialect: coordinates.defaultDialect, + }, (envelope) => { + gherkinQuery.update(envelope); + if (envelope.parseError) { + parseErrors.push(envelope.parseError); + } + onEnvelope?.(envelope); + }); + const filterablePickles = gherkinQuery.getPickles().map((pickle) => { + const gherkinDocument = gherkinQuery + .getGherkinDocuments() + .find((doc) => doc.uri === pickle.uri); + const location = gherkinQuery.getLocation(pickle.astNodeIds[pickle.astNodeIds.length - 1]); + return { + gherkinDocument, + location, + pickle, + }; + }); + return { + filterablePickles, + parseErrors, + }; +} +async function gherkinFromPaths(paths, options, onEnvelope) { + return new Promise((resolve, reject) => { + const gherkinMessageStream = gherkin_streams_1.GherkinStreams.fromPaths(paths, options); + gherkinMessageStream.on('data', onEnvelope); + gherkinMessageStream.on('end', resolve); + gherkinMessageStream.on('error', reject); + }); +} +//# sourceMappingURL=gherkin.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/api/gherkin.js.map b/node_modules/@cucumber/cucumber/lib/api/gherkin.js.map new file mode 100644 index 00000000..e28a643c --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/gherkin.js.map @@ -0,0 +1 @@ +{"version":3,"file":"gherkin.js","sourceRoot":"","sources":["../../src/api/gherkin.ts"],"names":[],"mappings":";;AASA,kDAkDC;AA3DD,+DAGkC;AAElC,2DAA+D;AAIxD,KAAK,UAAU,mBAAmB,CAAC,EACxC,KAAK,EACL,GAAG,EACH,WAAW,EACX,WAAW,EACX,UAAU,GAOX;IAIC,MAAM,YAAY,GAAG,IAAI,qBAAY,EAAE,CAAA;IACvC,MAAM,WAAW,GAAiB,EAAE,CAAA;IACpC,MAAM,gBAAgB,CACpB,WAAW,EACX;QACE,KAAK;QACL,UAAU,EAAE,GAAG;QACf,cAAc,EAAE,WAAW,CAAC,cAAc;KAC3C,EACD,CAAC,QAAQ,EAAE,EAAE;QACX,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAC7B,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;YACxB,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;QACvC,CAAC;QACD,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAA;IACxB,CAAC,CACF,CAAA;IACD,MAAM,iBAAiB,GAAG,YAAY,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACjE,MAAM,eAAe,GAAG,YAAY;aACjC,mBAAmB,EAAE;aACrB,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC,CAAA;QACxC,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,CACvC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAChD,CAAA;QACD,OAAO;YACL,eAAe;YACf,QAAQ;YACR,MAAM;SACP,CAAA;IACH,CAAC,CAAC,CAAA;IACF,OAAO;QACL,iBAAiB;QACjB,WAAW;KACZ,CAAA;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,KAAe,EACf,OAA8B,EAC9B,UAAwC;IAExC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,oBAAoB,GAAG,gCAAc,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QACrE,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;QAC3C,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QACvC,oBAAoB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import {\n GherkinStreams,\n IGherkinStreamOptions,\n} from '@cucumber/gherkin-streams'\nimport { Envelope, IdGenerator, ParseError } from '@cucumber/messages'\nimport { Query as GherkinQuery } from '@cucumber/gherkin-utils'\nimport { IFilterablePickle } from '../filter'\nimport { ISourcesCoordinates } from './types'\n\nexport async function getPicklesAndErrors({\n newId,\n cwd,\n sourcePaths,\n coordinates,\n onEnvelope,\n}: {\n newId: IdGenerator.NewId\n cwd: string\n sourcePaths: string[]\n coordinates: ISourcesCoordinates\n onEnvelope?: (envelope: Envelope) => void\n}): Promise<{\n filterablePickles: readonly IFilterablePickle[]\n parseErrors: ParseError[]\n}> {\n const gherkinQuery = new GherkinQuery()\n const parseErrors: ParseError[] = []\n await gherkinFromPaths(\n sourcePaths,\n {\n newId,\n relativeTo: cwd,\n defaultDialect: coordinates.defaultDialect,\n },\n (envelope) => {\n gherkinQuery.update(envelope)\n if (envelope.parseError) {\n parseErrors.push(envelope.parseError)\n }\n onEnvelope?.(envelope)\n }\n )\n const filterablePickles = gherkinQuery.getPickles().map((pickle) => {\n const gherkinDocument = gherkinQuery\n .getGherkinDocuments()\n .find((doc) => doc.uri === pickle.uri)\n const location = gherkinQuery.getLocation(\n pickle.astNodeIds[pickle.astNodeIds.length - 1]\n )\n return {\n gherkinDocument,\n location,\n pickle,\n }\n })\n return {\n filterablePickles,\n parseErrors,\n }\n}\n\nasync function gherkinFromPaths(\n paths: string[],\n options: IGherkinStreamOptions,\n onEnvelope: (envelope: Envelope) => void\n): Promise {\n return new Promise((resolve, reject) => {\n const gherkinMessageStream = GherkinStreams.fromPaths(paths, options)\n gherkinMessageStream.on('data', onEnvelope)\n gherkinMessageStream.on('end', resolve)\n gherkinMessageStream.on('error', reject)\n })\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/api/index.d.ts b/node_modules/@cucumber/cucumber/lib/api/index.d.ts new file mode 100644 index 00000000..71e13938 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/index.d.ts @@ -0,0 +1,19 @@ +/** + * JavaScript API for running and extending Cucumber + * + * @packageDocumentation + * @module api + * @remarks + * These docs cover the API used for running Cucumber programmatically. The entry point is `@cucumber/cucumber/api`. + */ +export { IConfiguration } from '../configuration'; +export { ILogger, IRunEnvironment } from '../environment'; +export { IFilterablePickle, IPickleOrder } from '../filter'; +export { IResolvedPaths } from '../paths'; +export { CoordinatorEventKey, CoordinatorEventValues, CoordinatorEventHandler, CoordinatorTransformKey, CoordinatorTransformValues, CoordinatorTransformer, CoordinatorContext, CoordinatorEnvironment, Plugin, PluginCleanup, PluginOperation, } from '../plugin'; +export { IPublishConfig } from '../publish'; +export * from './load_configuration'; +export * from './load_sources'; +export * from './load_support'; +export * from './run_cucumber'; +export * from './types'; diff --git a/node_modules/@cucumber/cucumber/lib/api/index.js b/node_modules/@cucumber/cucumber/lib/api/index.js new file mode 100644 index 00000000..475b0865 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/index.js @@ -0,0 +1,30 @@ +"use strict"; +/** + * JavaScript API for running and extending Cucumber + * + * @packageDocumentation + * @module api + * @remarks + * These docs cover the API used for running Cucumber programmatically. The entry point is `@cucumber/cucumber/api`. + */ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +__exportStar(require("./load_configuration"), exports); +__exportStar(require("./load_sources"), exports); +__exportStar(require("./load_support"), exports); +__exportStar(require("./run_cucumber"), exports); +__exportStar(require("./types"), exports); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/api/index.js.map b/node_modules/@cucumber/cucumber/lib/api/index.js.map new file mode 100644 index 00000000..f7446d0e --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;;;;;;;;;;;;;;AAoBH,uDAAoC;AACpC,iDAA8B;AAC9B,iDAA8B;AAC9B,iDAA8B;AAC9B,0CAAuB","sourcesContent":["/**\n * JavaScript API for running and extending Cucumber\n *\n * @packageDocumentation\n * @module api\n * @remarks\n * These docs cover the API used for running Cucumber programmatically. The entry point is `@cucumber/cucumber/api`.\n */\n\nexport { IConfiguration } from '../configuration'\nexport { ILogger, IRunEnvironment } from '../environment'\nexport { IFilterablePickle, IPickleOrder } from '../filter'\nexport { IResolvedPaths } from '../paths'\nexport {\n CoordinatorEventKey,\n CoordinatorEventValues,\n CoordinatorEventHandler,\n CoordinatorTransformKey,\n CoordinatorTransformValues,\n CoordinatorTransformer,\n CoordinatorContext,\n CoordinatorEnvironment,\n Plugin,\n PluginCleanup,\n PluginOperation,\n} from '../plugin'\nexport { IPublishConfig } from '../publish'\nexport * from './load_configuration'\nexport * from './load_sources'\nexport * from './load_support'\nexport * from './run_cucumber'\nexport * from './types'\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/api/load_configuration.d.ts b/node_modules/@cucumber/cucumber/lib/api/load_configuration.d.ts new file mode 100644 index 00000000..6b97e493 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/load_configuration.d.ts @@ -0,0 +1,10 @@ +import { IRunEnvironment } from '../environment'; +import { ILoadConfigurationOptions, IResolvedConfiguration } from './types'; +/** + * Load user-authored configuration to be used in a test run + * + * @public + * @param options - Coordinates required to find configuration + * @param environment - Project environment + */ +export declare function loadConfiguration(options?: ILoadConfigurationOptions, environment?: IRunEnvironment): Promise; diff --git a/node_modules/@cucumber/cucumber/lib/api/load_configuration.js b/node_modules/@cucumber/cucumber/lib/api/load_configuration.js new file mode 100644 index 00000000..99b0aba7 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/load_configuration.js @@ -0,0 +1,51 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.loadConfiguration = loadConfiguration; +const locate_file_1 = require("../configuration/locate_file"); +const configuration_1 = require("../configuration"); +const environment_1 = require("../environment"); +const convert_configuration_1 = require("./convert_configuration"); +/** + * Load user-authored configuration to be used in a test run + * + * @public + * @param options - Coordinates required to find configuration + * @param environment - Project environment + */ +async function loadConfiguration(options = {}, environment = {}) { + const { cwd, env, logger } = (0, environment_1.makeEnvironment)(environment); + const configFile = options.file ?? (0, locate_file_1.locateFile)(cwd); + if (configFile) { + logger.debug(`Configuration will be loaded from "${configFile}"`); + } + else if (configFile === false) { + logger.debug('Skipping configuration file resolution'); + } + else { + logger.debug('No configuration file found'); + } + const profileConfiguration = configFile + ? await (0, configuration_1.fromFile)(logger, cwd, configFile, options.profiles) + : {}; + const providedConfiguration = (0, configuration_1.parseConfiguration)(logger, 'Provided', options.provided); + if (profileConfiguration.paths?.length > 0 && + providedConfiguration.paths?.length > 0) { + const configPaths = profileConfiguration.paths; + const cliPaths = providedConfiguration.paths; + const mergedPaths = [...configPaths, ...cliPaths]; + logger.warn(`You have specified paths in both your configuration file and as CLI arguments.\n` + + `In a future major version, the CLI argument will override the configuration file instead of being merged.\n` + + `To prepare for this change, see https://github.com/cucumber/cucumber-js/blob/main/docs/deprecations.md\n` + + ` Current result: ${mergedPaths.join(', ')}\n` + + ` Future result: ${cliPaths.join(', ')}`); + } + const original = (0, configuration_1.mergeConfigurations)(configuration_1.DEFAULT_CONFIGURATION, profileConfiguration, providedConfiguration); + logger.debug('Resolved configuration:', original); + (0, configuration_1.validateConfiguration)(original, logger); + const runnable = await (0, convert_configuration_1.convertConfiguration)(logger, original, env); + return { + useConfiguration: original, + runConfiguration: runnable, + }; +} +//# sourceMappingURL=load_configuration.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/api/load_configuration.js.map b/node_modules/@cucumber/cucumber/lib/api/load_configuration.js.map new file mode 100644 index 00000000..18f522a1 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/load_configuration.js.map @@ -0,0 +1 @@ +{"version":3,"file":"load_configuration.js","sourceRoot":"","sources":["../../src/api/load_configuration.ts"],"names":[],"mappings":";;AAmBA,8CAgDC;AAnED,8DAAyD;AACzD,oDAMyB;AACzB,gDAAiE;AACjE,mEAA8D;AAG9D;;;;;;GAMG;AACI,KAAK,UAAU,iBAAiB,CACrC,UAAqC,EAAE,EACvC,cAA+B,EAAE;IAEjC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAA,6BAAe,EAAC,WAAW,CAAC,CAAA;IACzD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,IAAI,IAAA,wBAAU,EAAC,GAAG,CAAC,CAAA;IAClD,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,sCAAsC,UAAU,GAAG,CAAC,CAAA;IACnE,CAAC;SAAM,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAA;IACxD,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAC7C,CAAC;IACD,MAAM,oBAAoB,GAAG,UAAU;QACrC,CAAC,CAAC,MAAM,IAAA,wBAAQ,EAAC,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC;QAC3D,CAAC,CAAC,EAAE,CAAA;IACN,MAAM,qBAAqB,GAAG,IAAA,kCAAkB,EAC9C,MAAM,EACN,UAAU,EACV,OAAO,CAAC,QAAQ,CACjB,CAAA;IACD,IACE,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC;QACtC,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,EACvC,CAAC;QACD,MAAM,WAAW,GAAG,oBAAoB,CAAC,KAAK,CAAA;QAC9C,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,CAAA;QAC5C,MAAM,WAAW,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,QAAQ,CAAC,CAAA;QACjD,MAAM,CAAC,IAAI,CACT,kFAAkF;YAChF,6GAA6G;YAC7G,0GAA0G;YAC1G,yBAAyB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YACnD,yBAAyB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACjD,CAAA;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,IAAA,mCAAmB,EAClC,qCAAqB,EACrB,oBAAoB,EACpB,qBAAqB,CACtB,CAAA;IACD,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,QAAQ,CAAC,CAAA;IACjD,IAAA,qCAAqB,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IACvC,MAAM,QAAQ,GAAG,MAAM,IAAA,4CAAoB,EAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAA;IAClE,OAAO;QACL,gBAAgB,EAAE,QAAQ;QAC1B,gBAAgB,EAAE,QAAQ;KAC3B,CAAA;AACH,CAAC","sourcesContent":["import { locateFile } from '../configuration/locate_file'\nimport {\n DEFAULT_CONFIGURATION,\n fromFile,\n mergeConfigurations,\n parseConfiguration,\n validateConfiguration,\n} from '../configuration'\nimport { IRunEnvironment, makeEnvironment } from '../environment'\nimport { convertConfiguration } from './convert_configuration'\nimport { ILoadConfigurationOptions, IResolvedConfiguration } from './types'\n\n/**\n * Load user-authored configuration to be used in a test run\n *\n * @public\n * @param options - Coordinates required to find configuration\n * @param environment - Project environment\n */\nexport async function loadConfiguration(\n options: ILoadConfigurationOptions = {},\n environment: IRunEnvironment = {}\n): Promise {\n const { cwd, env, logger } = makeEnvironment(environment)\n const configFile = options.file ?? locateFile(cwd)\n if (configFile) {\n logger.debug(`Configuration will be loaded from \"${configFile}\"`)\n } else if (configFile === false) {\n logger.debug('Skipping configuration file resolution')\n } else {\n logger.debug('No configuration file found')\n }\n const profileConfiguration = configFile\n ? await fromFile(logger, cwd, configFile, options.profiles)\n : {}\n const providedConfiguration = parseConfiguration(\n logger,\n 'Provided',\n options.provided\n )\n if (\n profileConfiguration.paths?.length > 0 &&\n providedConfiguration.paths?.length > 0\n ) {\n const configPaths = profileConfiguration.paths\n const cliPaths = providedConfiguration.paths\n const mergedPaths = [...configPaths, ...cliPaths]\n logger.warn(\n `You have specified paths in both your configuration file and as CLI arguments.\\n` +\n `In a future major version, the CLI argument will override the configuration file instead of being merged.\\n` +\n `To prepare for this change, see https://github.com/cucumber/cucumber-js/blob/main/docs/deprecations.md\\n` +\n ` Current result: ${mergedPaths.join(', ')}\\n` +\n ` Future result: ${cliPaths.join(', ')}`\n )\n }\n const original = mergeConfigurations(\n DEFAULT_CONFIGURATION,\n profileConfiguration,\n providedConfiguration\n )\n logger.debug('Resolved configuration:', original)\n validateConfiguration(original, logger)\n const runnable = await convertConfiguration(logger, original, env)\n return {\n useConfiguration: original,\n runConfiguration: runnable,\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/api/load_sources.d.ts b/node_modules/@cucumber/cucumber/lib/api/load_sources.d.ts new file mode 100644 index 00000000..2a5ad8e1 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/load_sources.d.ts @@ -0,0 +1,11 @@ +import { IRunEnvironment } from '../environment'; +import { ILoadSourcesResult, ISourcesCoordinates } from './types'; +/** + * Load and parse features, produce a filtered and ordered test plan and/or + * parse errors + * + * @public + * @param coordinates - Coordinates required to find and process features + * @param environment - Project environment + */ +export declare function loadSources(coordinates: ISourcesCoordinates, environment?: IRunEnvironment): Promise; diff --git a/node_modules/@cucumber/cucumber/lib/api/load_sources.js b/node_modules/@cucumber/cucumber/lib/api/load_sources.js new file mode 100644 index 00000000..db7e4e56 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/load_sources.js @@ -0,0 +1,58 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.loadSources = loadSources; +const messages_1 = require("@cucumber/messages"); +const paths_1 = require("../paths"); +const environment_1 = require("../environment"); +const gherkin_1 = require("./gherkin"); +const plugins_1 = require("./plugins"); +/** + * Load and parse features, produce a filtered and ordered test plan and/or + * parse errors + * + * @public + * @param coordinates - Coordinates required to find and process features + * @param environment - Project environment + */ +async function loadSources(coordinates, environment = {}) { + const mergedEnvironment = (0, environment_1.makeEnvironment)(environment); + const { cwd, logger } = mergedEnvironment; + const newId = messages_1.IdGenerator.uuid(); + const pluginManager = await (0, plugins_1.initializeForLoadSources)(coordinates, mergedEnvironment); + const resolvedPaths = await (0, paths_1.resolvePaths)(logger, cwd, coordinates); + pluginManager.emit('paths:resolve', resolvedPaths); + const { sourcePaths } = resolvedPaths; + if (sourcePaths.length === 0) { + return { + plan: [], + errors: [], + }; + } + const { filterablePickles, parseErrors } = await (0, gherkin_1.getPicklesAndErrors)({ + newId, + cwd, + sourcePaths, + coordinates, + onEnvelope: (envelope) => pluginManager.emit('message', envelope), + }); + const filteredPickles = await pluginManager.transform('pickles:filter', filterablePickles); + const orderedPickles = await pluginManager.transform('pickles:order', filteredPickles); + const plan = orderedPickles.map(({ location, pickle }) => ({ + name: pickle.name, + uri: pickle.uri, + location, + })); + const errors = parseErrors.map(({ source, message }) => { + return { + uri: source.uri, + location: source.location, + message, + }; + }); + await pluginManager.cleanup(); + return { + plan, + errors, + }; +} +//# sourceMappingURL=load_sources.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/api/load_sources.js.map b/node_modules/@cucumber/cucumber/lib/api/load_sources.js.map new file mode 100644 index 00000000..3ebc8914 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/load_sources.js.map @@ -0,0 +1 @@ +{"version":3,"file":"load_sources.js","sourceRoot":"","sources":["../../src/api/load_sources.ts"],"names":[],"mappings":";;AAoBA,kCAoDC;AAxED,iDAAgD;AAChD,oCAAuC;AACvC,gDAAiE;AAOjE,uCAA+C;AAC/C,uCAAoD;AAEpD;;;;;;;GAOG;AACI,KAAK,UAAU,WAAW,CAC/B,WAAgC,EAChC,cAA+B,EAAE;IAEjC,MAAM,iBAAiB,GAAG,IAAA,6BAAe,EAAC,WAAW,CAAC,CAAA;IACtD,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAAA;IACzC,MAAM,KAAK,GAAG,sBAAW,CAAC,IAAI,EAAE,CAAA;IAChC,MAAM,aAAa,GAAG,MAAM,IAAA,kCAAwB,EAClD,WAAW,EACX,iBAAiB,CAClB,CAAA;IACD,MAAM,aAAa,GAAG,MAAM,IAAA,oBAAY,EAAC,MAAM,EAAE,GAAG,EAAE,WAAW,CAAC,CAAA;IAClE,aAAa,CAAC,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,CAAA;IAClD,MAAM,EAAE,WAAW,EAAE,GAAG,aAAa,CAAA;IACrC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO;YACL,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,EAAE;SACX,CAAA;IACH,CAAC;IACD,MAAM,EAAE,iBAAiB,EAAE,WAAW,EAAE,GAAG,MAAM,IAAA,6BAAmB,EAAC;QACnE,KAAK;QACL,GAAG;QACH,WAAW;QACX,WAAW;QACX,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC;KAClE,CAAC,CAAA;IACF,MAAM,eAAe,GAAG,MAAM,aAAa,CAAC,SAAS,CACnD,gBAAgB,EAChB,iBAAiB,CAClB,CAAA;IACD,MAAM,cAAc,GAAG,MAAM,aAAa,CAAC,SAAS,CAClD,eAAe,EACf,eAAe,CAChB,CAAA;IACD,MAAM,IAAI,GAAqB,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3E,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,QAAQ;KACT,CAAC,CAAC,CAAA;IACH,MAAM,MAAM,GAAoB,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;QACtE,OAAO;YACL,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO;SACR,CAAA;IACH,CAAC,CAAC,CAAA;IACF,MAAM,aAAa,CAAC,OAAO,EAAE,CAAA;IAC7B,OAAO;QACL,IAAI;QACJ,MAAM;KACP,CAAA;AACH,CAAC","sourcesContent":["import { IdGenerator } from '@cucumber/messages'\nimport { resolvePaths } from '../paths'\nimport { IRunEnvironment, makeEnvironment } from '../environment'\nimport {\n ILoadSourcesResult,\n IPlannedPickle,\n ISourcesCoordinates,\n ISourcesError,\n} from './types'\nimport { getPicklesAndErrors } from './gherkin'\nimport { initializeForLoadSources } from './plugins'\n\n/**\n * Load and parse features, produce a filtered and ordered test plan and/or\n * parse errors\n *\n * @public\n * @param coordinates - Coordinates required to find and process features\n * @param environment - Project environment\n */\nexport async function loadSources(\n coordinates: ISourcesCoordinates,\n environment: IRunEnvironment = {}\n): Promise {\n const mergedEnvironment = makeEnvironment(environment)\n const { cwd, logger } = mergedEnvironment\n const newId = IdGenerator.uuid()\n const pluginManager = await initializeForLoadSources(\n coordinates,\n mergedEnvironment\n )\n const resolvedPaths = await resolvePaths(logger, cwd, coordinates)\n pluginManager.emit('paths:resolve', resolvedPaths)\n const { sourcePaths } = resolvedPaths\n if (sourcePaths.length === 0) {\n return {\n plan: [],\n errors: [],\n }\n }\n const { filterablePickles, parseErrors } = await getPicklesAndErrors({\n newId,\n cwd,\n sourcePaths,\n coordinates,\n onEnvelope: (envelope) => pluginManager.emit('message', envelope),\n })\n const filteredPickles = await pluginManager.transform(\n 'pickles:filter',\n filterablePickles\n )\n const orderedPickles = await pluginManager.transform(\n 'pickles:order',\n filteredPickles\n )\n const plan: IPlannedPickle[] = orderedPickles.map(({ location, pickle }) => ({\n name: pickle.name,\n uri: pickle.uri,\n location,\n }))\n const errors: ISourcesError[] = parseErrors.map(({ source, message }) => {\n return {\n uri: source.uri,\n location: source.location,\n message,\n }\n })\n await pluginManager.cleanup()\n return {\n plan,\n errors,\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/api/load_support.d.ts b/node_modules/@cucumber/cucumber/lib/api/load_support.d.ts new file mode 100644 index 00000000..b49e1c08 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/load_support.d.ts @@ -0,0 +1,10 @@ +import { IRunEnvironment } from '../environment'; +import { ILoadSupportOptions, ISupportCodeLibrary } from './types'; +/** + * Load support code for use in test runs + * + * @public + * @param options - Options required to find the support code + * @param environment - Project environment + */ +export declare function loadSupport(options: ILoadSupportOptions, environment?: IRunEnvironment): Promise; diff --git a/node_modules/@cucumber/cucumber/lib/api/load_support.js b/node_modules/@cucumber/cucumber/lib/api/load_support.js new file mode 100644 index 00000000..adf7ae52 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/load_support.js @@ -0,0 +1,42 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.loadSupport = loadSupport; +const messages_1 = require("@cucumber/messages"); +const paths_1 = require("../paths"); +const environment_1 = require("../environment"); +const support_1 = require("./support"); +const plugins_1 = require("./plugins"); +/** + * Load support code for use in test runs + * + * @public + * @param options - Options required to find the support code + * @param environment - Project environment + */ +async function loadSupport(options, environment = {}) { + const mergedEnvironment = (0, environment_1.makeEnvironment)(environment); + const { cwd, logger } = mergedEnvironment; + const newId = messages_1.IdGenerator.uuid(); + const supportCoordinates = Object.assign({ + requireModules: [], + requirePaths: [], + loaders: [], + importPaths: [], + }, options.support); + const pluginManager = await (0, plugins_1.initializeForLoadSupport)(mergedEnvironment); + const resolvedPaths = await (0, paths_1.resolvePaths)(logger, cwd, options.sources, supportCoordinates); + pluginManager.emit('paths:resolve', resolvedPaths); + const { requirePaths, importPaths } = resolvedPaths; + const supportCodeLibrary = await (0, support_1.getSupportCodeLibrary)({ + logger, + cwd, + newId, + requireModules: supportCoordinates.requireModules, + requirePaths, + loaders: supportCoordinates.loaders, + importPaths, + }); + await pluginManager.cleanup(); + return supportCodeLibrary; +} +//# sourceMappingURL=load_support.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/api/load_support.js.map b/node_modules/@cucumber/cucumber/lib/api/load_support.js.map new file mode 100644 index 00000000..664a8649 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/load_support.js.map @@ -0,0 +1 @@ +{"version":3,"file":"load_support.js","sourceRoot":"","sources":["../../src/api/load_support.ts"],"names":[],"mappings":";;AAcA,kCAoCC;AAlDD,iDAAgD;AAChD,oCAAuC;AACvC,gDAAiE;AAEjE,uCAAiD;AACjD,uCAAoD;AAEpD;;;;;;GAMG;AACI,KAAK,UAAU,WAAW,CAC/B,OAA4B,EAC5B,cAA+B,EAAE;IAEjC,MAAM,iBAAiB,GAAG,IAAA,6BAAe,EAAC,WAAW,CAAC,CAAA;IACtD,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAAA;IACzC,MAAM,KAAK,GAAG,sBAAW,CAAC,IAAI,EAAE,CAAA;IAChC,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CACtC;QACE,cAAc,EAAE,EAAE;QAClB,YAAY,EAAE,EAAE;QAChB,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,EAAE;KAChB,EACD,OAAO,CAAC,OAAO,CAChB,CAAA;IACD,MAAM,aAAa,GAAG,MAAM,IAAA,kCAAwB,EAAC,iBAAiB,CAAC,CAAA;IACvE,MAAM,aAAa,GAAG,MAAM,IAAA,oBAAY,EACtC,MAAM,EACN,GAAG,EACH,OAAO,CAAC,OAAO,EACf,kBAAkB,CACnB,CAAA;IACD,aAAa,CAAC,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,CAAA;IAClD,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,aAAa,CAAA;IACnD,MAAM,kBAAkB,GAAG,MAAM,IAAA,+BAAqB,EAAC;QACrD,MAAM;QACN,GAAG;QACH,KAAK;QACL,cAAc,EAAE,kBAAkB,CAAC,cAAc;QACjD,YAAY;QACZ,OAAO,EAAE,kBAAkB,CAAC,OAAO;QACnC,WAAW;KACZ,CAAC,CAAA;IACF,MAAM,aAAa,CAAC,OAAO,EAAE,CAAA;IAC7B,OAAO,kBAAkB,CAAA;AAC3B,CAAC","sourcesContent":["import { IdGenerator } from '@cucumber/messages'\nimport { resolvePaths } from '../paths'\nimport { IRunEnvironment, makeEnvironment } from '../environment'\nimport { ILoadSupportOptions, ISupportCodeLibrary } from './types'\nimport { getSupportCodeLibrary } from './support'\nimport { initializeForLoadSupport } from './plugins'\n\n/**\n * Load support code for use in test runs\n *\n * @public\n * @param options - Options required to find the support code\n * @param environment - Project environment\n */\nexport async function loadSupport(\n options: ILoadSupportOptions,\n environment: IRunEnvironment = {}\n): Promise {\n const mergedEnvironment = makeEnvironment(environment)\n const { cwd, logger } = mergedEnvironment\n const newId = IdGenerator.uuid()\n const supportCoordinates = Object.assign(\n {\n requireModules: [],\n requirePaths: [],\n loaders: [],\n importPaths: [],\n },\n options.support\n )\n const pluginManager = await initializeForLoadSupport(mergedEnvironment)\n const resolvedPaths = await resolvePaths(\n logger,\n cwd,\n options.sources,\n supportCoordinates\n )\n pluginManager.emit('paths:resolve', resolvedPaths)\n const { requirePaths, importPaths } = resolvedPaths\n const supportCodeLibrary = await getSupportCodeLibrary({\n logger,\n cwd,\n newId,\n requireModules: supportCoordinates.requireModules,\n requirePaths,\n loaders: supportCoordinates.loaders,\n importPaths,\n })\n await pluginManager.cleanup()\n return supportCodeLibrary\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/api/plugins.d.ts b/node_modules/@cucumber/cucumber/lib/api/plugins.d.ts new file mode 100644 index 00000000..ecac9448 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/plugins.d.ts @@ -0,0 +1,6 @@ +import { UsableEnvironment } from '../environment'; +import { PluginManager } from '../plugin'; +import { IRunConfiguration, ISourcesCoordinates } from './types'; +export declare function initializeForLoadSources(coordinates: ISourcesCoordinates, environment: UsableEnvironment): Promise; +export declare function initializeForLoadSupport(environment: UsableEnvironment): Promise; +export declare function initializeForRunCucumber(configuration: IRunConfiguration, environment: UsableEnvironment): Promise; diff --git a/node_modules/@cucumber/cucumber/lib/api/plugins.js b/node_modules/@cucumber/cucumber/lib/api/plugins.js new file mode 100644 index 00000000..c3ac3b29 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/plugins.js @@ -0,0 +1,81 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.initializeForLoadSources = initializeForLoadSources; +exports.initializeForLoadSupport = initializeForLoadSupport; +exports.initializeForRunCucumber = initializeForRunCucumber; +const node_url_1 = require("node:url"); +const node_path_1 = __importDefault(require("node:path")); +const filter_1 = __importDefault(require("../filter")); +const plugin_1 = require("../plugin"); +const publish_1 = __importDefault(require("../publish")); +const sharding_1 = __importDefault(require("../sharding")); +const value_checker_1 = require("../value_checker"); +async function importPlugin(specifier, cwd) { + try { + let normalized = specifier; + if (specifier.startsWith('.')) { + normalized = (0, node_url_1.pathToFileURL)(node_path_1.default.resolve(cwd, specifier)); + } + else if (specifier.startsWith('file://')) { + normalized = new URL(specifier); + } + return await import(normalized.toString()); + } + catch (e) { + throw new Error(`Failed to import plugin ${specifier}`, { + cause: e, + }); + } +} +function findPlugin(imported) { + return findPluginRecursive(imported, 3); +} +function findPluginRecursive(thing, depth) { + if ((0, value_checker_1.doesNotHaveValue)(thing)) { + return null; + } + if (typeof thing === 'object' && thing.type === 'plugin') { + return thing; + } + depth--; + if (depth > 0) { + return findPluginRecursive(thing.default, depth); + } + return null; +} +async function loadPlugin(specifier, cwd) { + const imported = await importPlugin(specifier, cwd); + const found = findPlugin(imported); + if (!found) { + throw new Error(`${specifier} does not export a plugin`); + } + return found; +} +async function initializeForLoadSources(coordinates, environment) { + // eventually we'll load plugin packages here + const pluginManager = new plugin_1.PluginManager(environment); + await pluginManager.initCoordinatorInternal('loadSources', filter_1.default, coordinates); + return pluginManager; +} +async function initializeForLoadSupport(environment) { + // eventually we'll load plugin packages here + return new plugin_1.PluginManager(environment); +} +async function initializeForRunCucumber(configuration, environment) { + const pluginManager = new plugin_1.PluginManager(environment); + await pluginManager.initCoordinatorInternal('runCucumber', filter_1.default, configuration.sources); + await pluginManager.initCoordinatorInternal('runCucumber', sharding_1.default, configuration.sources); + if (configuration.plugins) { + for (const specifier of configuration.plugins.specifiers) { + const plugin = await loadPlugin(specifier, environment.cwd); + await pluginManager.initCoordinatorExternal('runCucumber', plugin, configuration.plugins.options, specifier); + } + } + // internal plugins that `emit` go last so consumers have a chance to `on` + await pluginManager.initCoordinatorInternal('runCucumber', publish_1.default, configuration.formats.publish); + return pluginManager; +} +//# sourceMappingURL=plugins.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/api/plugins.js.map b/node_modules/@cucumber/cucumber/lib/api/plugins.js.map new file mode 100644 index 00000000..133ca43a --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/plugins.js.map @@ -0,0 +1 @@ +{"version":3,"file":"plugins.js","sourceRoot":"","sources":["../../src/api/plugins.ts"],"names":[],"mappings":"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","sourcesContent":["import { pathToFileURL } from 'node:url'\nimport path from 'node:path'\nimport { UsableEnvironment } from '../environment'\nimport filterPlugin from '../filter'\nimport { PluginManager, Plugin } from '../plugin'\nimport publishPlugin from '../publish'\nimport shardingPlugin from '../sharding'\nimport { doesNotHaveValue } from '../value_checker'\nimport { IRunConfiguration, ISourcesCoordinates } from './types'\n\nasync function importPlugin(specifier: string, cwd: string): Promise {\n try {\n let normalized: URL | string = specifier\n if (specifier.startsWith('.')) {\n normalized = pathToFileURL(path.resolve(cwd, specifier))\n } else if (specifier.startsWith('file://')) {\n normalized = new URL(specifier)\n }\n return await import(normalized.toString())\n } catch (e) {\n throw new Error(`Failed to import plugin ${specifier}`, {\n cause: e,\n })\n }\n}\n\nfunction findPlugin(imported: any): Plugin | null {\n return findPluginRecursive(imported, 3)\n}\n\nfunction findPluginRecursive(thing: any, depth: number): Plugin | null {\n if (doesNotHaveValue(thing)) {\n return null\n }\n if (typeof thing === 'object' && thing.type === 'plugin') {\n return thing\n }\n depth--\n if (depth > 0) {\n return findPluginRecursive(thing.default, depth)\n }\n return null\n}\n\nasync function loadPlugin(specifier: string, cwd: string): Promise {\n const imported = await importPlugin(specifier, cwd)\n const found = findPlugin(imported)\n if (!found) {\n throw new Error(`${specifier} does not export a plugin`)\n }\n return found\n}\n\nexport async function initializeForLoadSources(\n coordinates: ISourcesCoordinates,\n environment: UsableEnvironment\n): Promise {\n // eventually we'll load plugin packages here\n const pluginManager = new PluginManager(environment)\n await pluginManager.initCoordinatorInternal(\n 'loadSources',\n filterPlugin,\n coordinates\n )\n return pluginManager\n}\n\nexport async function initializeForLoadSupport(\n environment: UsableEnvironment\n): Promise {\n // eventually we'll load plugin packages here\n return new PluginManager(environment)\n}\n\nexport async function initializeForRunCucumber(\n configuration: IRunConfiguration,\n environment: UsableEnvironment\n): Promise {\n const pluginManager = new PluginManager(environment)\n\n await pluginManager.initCoordinatorInternal(\n 'runCucumber',\n filterPlugin,\n configuration.sources\n )\n await pluginManager.initCoordinatorInternal(\n 'runCucumber',\n shardingPlugin,\n configuration.sources\n )\n\n if (configuration.plugins) {\n for (const specifier of configuration.plugins.specifiers) {\n const plugin = await loadPlugin(specifier, environment.cwd)\n await pluginManager.initCoordinatorExternal(\n 'runCucumber',\n plugin,\n configuration.plugins.options,\n specifier\n )\n }\n }\n\n // internal plugins that `emit` go last so consumers have a chance to `on`\n await pluginManager.initCoordinatorInternal(\n 'runCucumber',\n publishPlugin,\n configuration.formats.publish\n )\n\n return pluginManager\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/api/run_cucumber.d.ts b/node_modules/@cucumber/cucumber/lib/api/run_cucumber.d.ts new file mode 100644 index 00000000..03d2d5ab --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/run_cucumber.d.ts @@ -0,0 +1,12 @@ +import { Envelope } from '@cucumber/messages'; +import { IRunEnvironment } from '../environment'; +import { IRunOptions, IRunResult } from './types'; +/** + * Execute a Cucumber test run and return the overall result + * + * @public + * @param options - Options for the run, obtainable via {@link loadConfiguration} + * @param environment - Project environment + * @param onMessage - Callback fired each time Cucumber emits a message + */ +export declare function runCucumber(options: IRunOptions, environment?: IRunEnvironment, onMessage?: (message: Envelope) => void): Promise; diff --git a/node_modules/@cucumber/cucumber/lib/api/run_cucumber.js b/node_modules/@cucumber/cucumber/lib/api/run_cucumber.js new file mode 100644 index 00000000..c6ee9dcc --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/run_cucumber.js @@ -0,0 +1,127 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.runCucumber = runCucumber; +const node_events_1 = require("node:events"); +const messages_1 = require("@cucumber/messages"); +const environment_1 = require("../environment"); +const helpers_1 = require("../formatter/helpers"); +const paths_1 = require("../paths"); +const runtime_1 = require("../runtime"); +const version_1 = require("../version"); +const emit_support_code_messages_1 = require("./emit_support_code_messages"); +const formatters_1 = require("./formatters"); +const gherkin_1 = require("./gherkin"); +const plugins_1 = require("./plugins"); +const support_1 = require("./support"); +/** + * Execute a Cucumber test run and return the overall result + * + * @public + * @param options - Options for the run, obtainable via {@link loadConfiguration} + * @param environment - Project environment + * @param onMessage - Callback fired each time Cucumber emits a message + */ +async function runCucumber(options, environment = {}, onMessage) { + const mergedEnvironment = (0, environment_1.makeEnvironment)(environment); + const { cwd, stdout, stderr, env, logger } = mergedEnvironment; + logger.debug(`Running cucumber-js ${version_1.version} +Working directory: ${cwd} +Running from: ${__dirname} +`); + const newId = messages_1.IdGenerator.uuid(); + const supportCoordinates = 'originalCoordinates' in options.support + ? options.support.originalCoordinates + : Object.assign({ + requireModules: [], + requirePaths: [], + loaders: [], + importPaths: [], + }, options.support); + const pluginManager = await (0, plugins_1.initializeForRunCucumber)({ + ...options, + support: supportCoordinates, + }, mergedEnvironment); + const resolvedPaths = await (0, paths_1.resolvePaths)(logger, cwd, options.sources, supportCoordinates); + pluginManager.emit('paths:resolve', resolvedPaths); + const { sourcePaths, requirePaths, importPaths } = resolvedPaths; + const supportCodeLibrary = 'originalCoordinates' in options.support + ? options.support + : await (0, support_1.getSupportCodeLibrary)({ + logger, + cwd, + newId, + requirePaths, + requireModules: supportCoordinates.requireModules, + importPaths, + loaders: supportCoordinates.loaders, + }); + const eventBroadcaster = new node_events_1.EventEmitter(); + if (onMessage) { + eventBroadcaster.on('envelope', onMessage); + } + eventBroadcaster.on('envelope', (value) => pluginManager.emit('message', value)); + const eventDataCollector = new helpers_1.EventDataCollector(eventBroadcaster); + let formatterStreamError = false; + const cleanupFormatters = await (0, formatters_1.initializeFormatters)({ + env, + cwd, + stdout, + stderr, + logger, + onStreamError: () => (formatterStreamError = true), + eventBroadcaster, + eventDataCollector, + configuration: options.formats, + supportCodeLibrary, + pluginManager, + }); + await (0, emit_support_code_messages_1.emitMetaMessage)(eventBroadcaster, env); + let filteredPickles = []; + let parseErrors = []; + if (sourcePaths.length > 0) { + const gherkinResult = await (0, gherkin_1.getPicklesAndErrors)({ + newId, + cwd, + sourcePaths, + coordinates: options.sources, + onEnvelope: (envelope) => eventBroadcaster.emit('envelope', envelope), + }); + filteredPickles = await pluginManager.transform('pickles:filter', gherkinResult.filterablePickles); + filteredPickles = await pluginManager.transform('pickles:order', filteredPickles); + parseErrors = gherkinResult.parseErrors; + } + if (parseErrors.length) { + parseErrors.forEach((parseError) => { + logger.error(`Parse error in "${parseError.source.uri}" ${parseError.message}`); + }); + await cleanupFormatters(); + await pluginManager.cleanup(); + return { + success: false, + support: supportCodeLibrary, + }; + } + (0, emit_support_code_messages_1.emitSupportCodeMessages)({ + eventBroadcaster, + supportCodeLibrary, + newId, + }); + const runtime = await (0, runtime_1.makeRuntime)({ + environment: mergedEnvironment, + logger, + eventBroadcaster, + sourcedPickles: filteredPickles, + newId, + supportCodeLibrary, + options: options.runtime, + snippetOptions: options.formats.options, + }); + const success = await runtime.run(); + await pluginManager.cleanup(); + await cleanupFormatters(); + return { + success: success && !formatterStreamError, + support: supportCodeLibrary, + }; +} +//# sourceMappingURL=run_cucumber.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/api/run_cucumber.js.map b/node_modules/@cucumber/cucumber/lib/api/run_cucumber.js.map new file mode 100644 index 00000000..faee7c35 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/run_cucumber.js.map @@ -0,0 +1 @@ +{"version":3,"file":"run_cucumber.js","sourceRoot":"","sources":["../../src/api/run_cucumber.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventEmitter } from 'node:events'\nimport { Envelope, IdGenerator, ParseError } from '@cucumber/messages'\nimport { IRunEnvironment, makeEnvironment } from '../environment'\nimport { IFilterablePickle } from '../filter'\nimport { EventDataCollector } from '../formatter/helpers'\nimport { resolvePaths } from '../paths'\nimport { makeRuntime } from '../runtime'\nimport { SupportCodeLibrary } from '../support_code_library_builder/types'\nimport { version } from '../version'\nimport {\n emitMetaMessage,\n emitSupportCodeMessages,\n} from './emit_support_code_messages'\nimport { initializeFormatters } from './formatters'\nimport { getPicklesAndErrors } from './gherkin'\nimport { initializeForRunCucumber } from './plugins'\nimport { getSupportCodeLibrary } from './support'\nimport { IRunOptions, IRunResult } from './types'\n\n/**\n * Execute a Cucumber test run and return the overall result\n *\n * @public\n * @param options - Options for the run, obtainable via {@link loadConfiguration}\n * @param environment - Project environment\n * @param onMessage - Callback fired each time Cucumber emits a message\n */\nexport async function runCucumber(\n options: IRunOptions,\n environment: IRunEnvironment = {},\n onMessage?: (message: Envelope) => void\n): Promise {\n const mergedEnvironment = makeEnvironment(environment)\n const { cwd, stdout, stderr, env, logger } = mergedEnvironment\n\n logger.debug(`Running cucumber-js ${version} \nWorking directory: ${cwd}\nRunning from: ${__dirname} \n`)\n\n const newId = IdGenerator.uuid()\n\n const supportCoordinates =\n 'originalCoordinates' in options.support\n ? options.support.originalCoordinates\n : Object.assign(\n {\n requireModules: [],\n requirePaths: [],\n loaders: [],\n importPaths: [],\n },\n options.support\n )\n\n const pluginManager = await initializeForRunCucumber(\n {\n ...options,\n support: supportCoordinates,\n },\n mergedEnvironment\n )\n\n const resolvedPaths = await resolvePaths(\n logger,\n cwd,\n options.sources,\n supportCoordinates\n )\n pluginManager.emit('paths:resolve', resolvedPaths)\n const { sourcePaths, requirePaths, importPaths } = resolvedPaths\n\n const supportCodeLibrary =\n 'originalCoordinates' in options.support\n ? (options.support as SupportCodeLibrary)\n : await getSupportCodeLibrary({\n logger,\n cwd,\n newId,\n requirePaths,\n requireModules: supportCoordinates.requireModules,\n importPaths,\n loaders: supportCoordinates.loaders,\n })\n\n const eventBroadcaster = new EventEmitter()\n if (onMessage) {\n eventBroadcaster.on('envelope', onMessage)\n }\n eventBroadcaster.on('envelope', (value) =>\n pluginManager.emit('message', value)\n )\n const eventDataCollector = new EventDataCollector(eventBroadcaster)\n\n let formatterStreamError = false\n const cleanupFormatters = await initializeFormatters({\n env,\n cwd,\n stdout,\n stderr,\n logger,\n onStreamError: () => (formatterStreamError = true),\n eventBroadcaster,\n eventDataCollector,\n configuration: options.formats,\n supportCodeLibrary,\n pluginManager,\n })\n await emitMetaMessage(eventBroadcaster, env)\n\n let filteredPickles: ReadonlyArray = []\n let parseErrors: ParseError[] = []\n if (sourcePaths.length > 0) {\n const gherkinResult = await getPicklesAndErrors({\n newId,\n cwd,\n sourcePaths,\n coordinates: options.sources,\n onEnvelope: (envelope) => eventBroadcaster.emit('envelope', envelope),\n })\n filteredPickles = await pluginManager.transform(\n 'pickles:filter',\n gherkinResult.filterablePickles\n )\n filteredPickles = await pluginManager.transform(\n 'pickles:order',\n filteredPickles\n )\n parseErrors = gherkinResult.parseErrors\n }\n if (parseErrors.length) {\n parseErrors.forEach((parseError) => {\n logger.error(\n `Parse error in \"${parseError.source.uri}\" ${parseError.message}`\n )\n })\n await cleanupFormatters()\n await pluginManager.cleanup()\n return {\n success: false,\n support: supportCodeLibrary,\n }\n }\n\n emitSupportCodeMessages({\n eventBroadcaster,\n supportCodeLibrary,\n newId,\n })\n\n const runtime = await makeRuntime({\n environment: mergedEnvironment,\n logger,\n eventBroadcaster,\n sourcedPickles: filteredPickles,\n newId,\n supportCodeLibrary,\n options: options.runtime,\n snippetOptions: options.formats.options,\n })\n const success = await runtime.run()\n await pluginManager.cleanup()\n await cleanupFormatters()\n\n return {\n success: success && !formatterStreamError,\n support: supportCodeLibrary,\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/api/support.d.ts b/node_modules/@cucumber/cucumber/lib/api/support.d.ts new file mode 100644 index 00000000..a1913915 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/support.d.ts @@ -0,0 +1,12 @@ +import { IdGenerator } from '@cucumber/messages'; +import { SupportCodeLibrary } from '../support_code_library_builder/types'; +import { ILogger } from '../environment'; +export declare function getSupportCodeLibrary({ logger, cwd, newId, requireModules, requirePaths, importPaths, loaders, }: { + logger: ILogger; + cwd: string; + newId: IdGenerator.NewId; + requireModules: string[]; + requirePaths: string[]; + importPaths: string[]; + loaders: string[]; +}): Promise; diff --git a/node_modules/@cucumber/cucumber/lib/api/support.js b/node_modules/@cucumber/cucumber/lib/api/support.js new file mode 100644 index 00000000..cae1308f --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/support.js @@ -0,0 +1,36 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getSupportCodeLibrary = getSupportCodeLibrary; +const node_module_1 = require("node:module"); +const node_url_1 = require("node:url"); +const support_code_library_builder_1 = __importDefault(require("../support_code_library_builder")); +const try_require_1 = __importDefault(require("../try_require")); +async function getSupportCodeLibrary({ logger, cwd, newId, requireModules, requirePaths, importPaths, loaders, }) { + support_code_library_builder_1.default.reset(cwd, newId, { + requireModules, + requirePaths, + importPaths, + loaders, + }); + requireModules.map((path) => { + logger.debug(`Attempting to require code from "${path}"`); + (0, try_require_1.default)(path); + }); + requirePaths.map((path) => { + logger.debug(`Attempting to require code from "${path}"`); + (0, try_require_1.default)(path); + }); + for (const specifier of loaders) { + logger.debug(`Attempting to register loader "${specifier}"`); + (0, node_module_1.register)(specifier, (0, node_url_1.pathToFileURL)('./')); + } + for (const path of importPaths) { + logger.debug(`Attempting to import code from "${path}"`); + await import((0, node_url_1.pathToFileURL)(path).toString()); + } + return support_code_library_builder_1.default.finalize(); +} +//# sourceMappingURL=support.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/api/support.js.map b/node_modules/@cucumber/cucumber/lib/api/support.js.map new file mode 100644 index 00000000..9103a0bb --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/support.js.map @@ -0,0 +1 @@ +{"version":3,"file":"support.js","sourceRoot":"","sources":["../../src/api/support.ts"],"names":[],"mappings":";;;;;AAQA,sDA4CC;AApDD,6CAAsC;AACtC,uCAAwC;AAGxC,mGAAuE;AACvE,iEAAuC;AAGhC,KAAK,UAAU,qBAAqB,CAAC,EAC1C,MAAM,EACN,GAAG,EACH,KAAK,EACL,cAAc,EACd,YAAY,EACZ,WAAW,EACX,OAAO,GASR;IACC,sCAAyB,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE;QAC1C,cAAc;QACd,YAAY;QACZ,WAAW;QACX,OAAO;KACR,CAAC,CAAA;IAEF,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC1B,MAAM,CAAC,KAAK,CAAC,oCAAoC,IAAI,GAAG,CAAC,CAAA;QACzD,IAAA,qBAAU,EAAC,IAAI,CAAC,CAAA;IAClB,CAAC,CAAC,CAAA;IACF,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACxB,MAAM,CAAC,KAAK,CAAC,oCAAoC,IAAI,GAAG,CAAC,CAAA;QACzD,IAAA,qBAAU,EAAC,IAAI,CAAC,CAAA;IAClB,CAAC,CAAC,CAAA;IAEF,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,kCAAkC,SAAS,GAAG,CAAC,CAAA;QAC5D,IAAA,sBAAQ,EAAC,SAAS,EAAE,IAAA,wBAAa,EAAC,IAAI,CAAC,CAAC,CAAA;IAC1C,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,mCAAmC,IAAI,GAAG,CAAC,CAAA;QACxD,MAAM,MAAM,CAAC,IAAA,wBAAa,EAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC9C,CAAC;IAED,OAAO,sCAAyB,CAAC,QAAQ,EAAE,CAAA;AAC7C,CAAC","sourcesContent":["import { register } from 'node:module'\nimport { pathToFileURL } from 'node:url'\nimport { IdGenerator } from '@cucumber/messages'\nimport { SupportCodeLibrary } from '../support_code_library_builder/types'\nimport supportCodeLibraryBuilder from '../support_code_library_builder'\nimport tryRequire from '../try_require'\nimport { ILogger } from '../environment'\n\nexport async function getSupportCodeLibrary({\n logger,\n cwd,\n newId,\n requireModules,\n requirePaths,\n importPaths,\n loaders,\n}: {\n logger: ILogger\n cwd: string\n newId: IdGenerator.NewId\n requireModules: string[]\n requirePaths: string[]\n importPaths: string[]\n loaders: string[]\n}): Promise {\n supportCodeLibraryBuilder.reset(cwd, newId, {\n requireModules,\n requirePaths,\n importPaths,\n loaders,\n })\n\n requireModules.map((path) => {\n logger.debug(`Attempting to require code from \"${path}\"`)\n tryRequire(path)\n })\n requirePaths.map((path) => {\n logger.debug(`Attempting to require code from \"${path}\"`)\n tryRequire(path)\n })\n\n for (const specifier of loaders) {\n logger.debug(`Attempting to register loader \"${specifier}\"`)\n register(specifier, pathToFileURL('./'))\n }\n\n for (const path of importPaths) {\n logger.debug(`Attempting to import code from \"${path}\"`)\n await import(pathToFileURL(path).toString())\n }\n\n return supportCodeLibraryBuilder.finalize()\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/api/test_helpers.d.ts b/node_modules/@cucumber/cucumber/lib/api/test_helpers.d.ts new file mode 100644 index 00000000..487e467b --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/test_helpers.d.ts @@ -0,0 +1,3 @@ +import { IRunEnvironment } from '../environment'; +export declare function setupEnvironment(): Promise>; +export declare function teardownEnvironment(environment: IRunEnvironment): Promise; diff --git a/node_modules/@cucumber/cucumber/lib/api/test_helpers.js b/node_modules/@cucumber/cucumber/lib/api/test_helpers.js new file mode 100644 index 00000000..b8678be3 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/test_helpers.js @@ -0,0 +1,35 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.setupEnvironment = setupEnvironment; +exports.teardownEnvironment = teardownEnvironment; +const node_path_1 = __importDefault(require("node:path")); +const node_stream_1 = require("node:stream"); +const fs_1 = __importDefault(require("mz/fs")); +const reindent_template_literals_1 = require("reindent-template-literals"); +const messages_1 = require("@cucumber/messages"); +const newId = messages_1.IdGenerator.uuid(); +async function setupEnvironment() { + const cwd = node_path_1.default.join(__dirname, '..', '..', 'tmp', `api_${newId()}`); + await fs_1.default.mkdir(node_path_1.default.join(cwd, 'features'), { recursive: true }); + await fs_1.default.writeFile(node_path_1.default.join(cwd, 'features', 'test.feature'), (0, reindent_template_literals_1.reindent)(`Feature: test fixture + Scenario: one + Given a step + Then another step`)); + await fs_1.default.writeFile(node_path_1.default.join(cwd, 'features', 'steps.ts'), (0, reindent_template_literals_1.reindent)(`import { Given, Then } from '../../../src' + Given('a step', function () {}) + Then('another step', function () {})`)); + await fs_1.default.writeFile(node_path_1.default.join(cwd, 'cucumber.mjs'), `export default {paths: ['features/test.feature'], requireModule: ['ts-node/register'], require: ['features/steps.ts']}`); + const stdout = new node_stream_1.PassThrough(); + return { cwd, stdout }; +} +async function teardownEnvironment(environment) { + return new Promise((resolve) => { + fs_1.default.rm(environment.cwd, { recursive: true }, resolve); + }).then(() => { + environment.stdout.end(); + }); +} +//# sourceMappingURL=test_helpers.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/api/test_helpers.js.map b/node_modules/@cucumber/cucumber/lib/api/test_helpers.js.map new file mode 100644 index 00000000..c5cc7936 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/test_helpers.js.map @@ -0,0 +1 @@ +{"version":3,"file":"test_helpers.js","sourceRoot":"","sources":["../../src/api/test_helpers.ts"],"names":[],"mappings":";;;;;AASA,4CAsBC;AAED,kDAMC;AAvCD,0DAA4B;AAC5B,6CAAyC;AACzC,+CAAsB;AACtB,2EAAqD;AACrD,iDAAgD;AAGhD,MAAM,KAAK,GAAG,sBAAW,CAAC,IAAI,EAAE,CAAA;AAEzB,KAAK,UAAU,gBAAgB;IACpC,MAAM,GAAG,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,KAAK,EAAE,EAAE,CAAC,CAAA;IACrE,MAAM,YAAE,CAAC,KAAK,CAAC,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC/D,MAAM,YAAE,CAAC,SAAS,CAChB,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,cAAc,CAAC,EAC1C,IAAA,qCAAQ,EAAC;;;0BAGa,CAAC,CACxB,CAAA;IACD,MAAM,YAAE,CAAC,SAAS,CAChB,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,UAAU,CAAC,EACtC,IAAA,qCAAQ,EAAC;;yCAE4B,CAAC,CACvC,CAAA;IACD,MAAM,YAAE,CAAC,SAAS,CAChB,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAC9B,wHAAwH,CACzH,CAAA;IACD,MAAM,MAAM,GAAG,IAAI,yBAAW,EAAE,CAAA;IAChC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAA;AACxB,CAAC;AAEM,KAAK,UAAU,mBAAmB,CAAC,WAA4B;IACpE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,YAAE,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,CAAA;IACtD,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;QACX,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,CAAA;IAC1B,CAAC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import path from 'node:path'\nimport { PassThrough } from 'node:stream'\nimport fs from 'mz/fs'\nimport { reindent } from 'reindent-template-literals'\nimport { IdGenerator } from '@cucumber/messages'\nimport { IRunEnvironment } from '../environment'\n\nconst newId = IdGenerator.uuid()\n\nexport async function setupEnvironment(): Promise> {\n const cwd = path.join(__dirname, '..', '..', 'tmp', `api_${newId()}`)\n await fs.mkdir(path.join(cwd, 'features'), { recursive: true })\n await fs.writeFile(\n path.join(cwd, 'features', 'test.feature'),\n reindent(`Feature: test fixture\n Scenario: one\n Given a step\n Then another step`)\n )\n await fs.writeFile(\n path.join(cwd, 'features', 'steps.ts'),\n reindent(`import { Given, Then } from '../../../src'\n Given('a step', function () {})\n Then('another step', function () {})`)\n )\n await fs.writeFile(\n path.join(cwd, 'cucumber.mjs'),\n `export default {paths: ['features/test.feature'], requireModule: ['ts-node/register'], require: ['features/steps.ts']}`\n )\n const stdout = new PassThrough()\n return { cwd, stdout }\n}\n\nexport async function teardownEnvironment(environment: IRunEnvironment) {\n return new Promise((resolve) => {\n fs.rm(environment.cwd, { recursive: true }, resolve)\n }).then(() => {\n environment.stdout.end()\n })\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/api/types.d.ts b/node_modules/@cucumber/cucumber/lib/api/types.d.ts new file mode 100644 index 00000000..d50c839d --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/types.d.ts @@ -0,0 +1,330 @@ +import { JsonObject } from 'type-fest'; +import { IPublishConfig } from '../publish'; +import { IConfiguration } from '../configuration'; +import { IPickleOrder } from '../filter'; +/** + * Options for {@link loadConfiguration} + * @public + */ +export interface ILoadConfigurationOptions { + /** + * Path to load configuration file from, or `false` to skip + * @default `cucumber.(json|yaml|yml|js|cjs|mjs)` + */ + file?: string | false; + /** + * Zero or more profile names from which to source configuration in the file + * @remarks + * If omitted or empty, the `default` profile will be used. + */ + profiles?: string[]; + /** + * Ad-hoc configuration options to be merged over the top of whatever is + * loaded from the configuration file/profiles + * @example + * \{ + * failFast: true, + * parallel: 2 + * \} + * @example ["--fail-fast", "--parallel", "2"] + * @example "--fail-fast --parallel 2" + * @remarks + * This can also be provided as an array or single string of argv-style + * arguments. + */ + provided?: Partial | string[] | string; +} +/** + * Response from {@link loadConfiguration} + * @public + */ +export interface IResolvedConfiguration { + /** + * The final flat configuration object resolved from the configuration + * file/profiles plus any extra provided + */ + useConfiguration: IConfiguration; + /** + * The format that can be passed into {@link runCucumber} + */ + runConfiguration: IRunConfiguration; +} +/** + * Options relating to sources (i.e. feature files) - where to load them from, + * how to interpret, filter and order them + * @public + */ +export interface ISourcesCoordinates { + /** + * Default Gherkin dialect + * @remarks + * Used if no dialect is specified in the feature file itself. + */ + defaultDialect: string; + /** + * Paths and/or glob expressions to feature files + */ + paths: string[]; + /** + * Regular expressions of which scenario names should match one of to be run + */ + names: string[]; + /** + * Tag expression to filter which scenarios should be run + */ + tagExpression: string; + /** + * Run in the order defined, or in a random order + */ + order: IPickleOrder; + /** + * Shard tests and execute only the selected shard, format `/` + * @example 1/4 + * @remarks + * Shards use 1-based numbering + */ + shard?: string; +} +/** + * A pickle that has been successfully compiled from a source + * @public + */ +export interface IPlannedPickle { + /** + * Name of the pickle (after parameter resolution) + */ + name: string; + uri: string; + location: { + line: number; + column?: number; + }; +} +/** + * An error encountered when parsing a source + * @public + */ +export interface ISourcesError { + uri: string; + location: { + line: number; + column?: number; + }; + /** + * Error message explaining what went wrong with the parse + */ + message: string; +} +/** + * Response from {@link loadSources} + * @public + */ +export interface ILoadSourcesResult { + /** + * Pickles that have been successfully compiled, in the order they would be + * run in + */ + plan: IPlannedPickle[]; + /** + * Any errors encountered when parsing sources + */ + errors: ISourcesError[]; +} +/** + * Options relating to user code (aka support code) - where to load it from and + * how to preprocess it + * @public + */ +export interface ISupportCodeCoordinates { + /** + * Names of transpilation modules to load, via `require()` + */ + requireModules: string[]; + /** + * Paths and/or glob expressions of user code to load, via `require()` + */ + requirePaths: string[]; + /** + * Paths and/or glob expressions of user code to load, via `import()` + */ + importPaths: string[]; + /** + * Specifiers of loaders to register, via `register()` + */ + loaders: string[]; +} +/** + * Options for {@link loadSupport} + * @public + * @remarks + * A subset of {@link IRunConfiguration} + */ +export interface ILoadSupportOptions { + /** + * @remarks + * This is needed because the default support path locations are derived from + * feature file locations. + */ + sources: ISourcesCoordinates; + support: Partial; +} +/** + * Options relating to behaviour when actually running tests + * @public + */ +export interface IRunOptionsRuntime { + /** + * Perform a dry run, where a test run is prepared but nothing is executed + */ + dryRun: boolean; + /** + * Stop running tests when a test fails + */ + failFast: boolean; + /** + * Filter out stack frames from Cucumber's code when formatting stack traces + */ + filterStacktraces: boolean; + /** + * Run tests in parallel with the given number of worker processes + */ + parallel: number; + /** + * Retry failing tests up to the given number of times + */ + retry: number; + /** + * Tag expression to filter which scenarios can be retried + */ + retryTagFilter: string; + /** + * Fail the test run if there are pending steps + */ + strict: boolean; + /** + * Parameters to be passed to the World + * @remarks + * The value must be a JSON-serializable object. + */ + worldParameters: JsonObject; +} +/** + * Options relating to formatters - which ones to use, where to write their + * output, how they should behave + * @public + */ +export interface IRunOptionsFormats { + /** + * Name/path of the formatter to use for `stdout` output + */ + stdout: string; + /** + * Zero or more mappings of file output path (key) to name/path of the + * formatter to use (value) + * @example + * \{ + * "./reports/cucumber.html": "html", + * "./reports/custom.txt": "./custom-formatter.js" + * \} + */ + files: Record; + /** + * Options for report publication, or `false` to disable publication + */ + publish: IPublishConfig | false; + /** + * Options to be provided to formatters + * @remarks + * The value must be a JSON-serializable object. + */ + options: JsonObject; +} +/** + * Options relating to plugins - which ones to use and how they should behave + * @public + */ +export interface IRunOptionsPlugins { + /** + * Specifiers of plugins to load + * @example + * [ + * "\@cucumber/my-plugin", + * "./custom-plugin.js" + * ] + * @remarks + * Each item is a module specifier for a plugin to be loaded. + */ + specifiers: string[]; + /** + * Options to be provided to plugins + * @remarks + * The value must be a JSON-serializable object. + */ + options: JsonObject; +} +/** + * Structured configuration object suitable for passing to {@link runCucumber} + * @public + */ +export interface IRunConfiguration { + sources: ISourcesCoordinates; + support: Partial; + runtime: IRunOptionsRuntime; + formats: IRunOptionsFormats; + plugins?: IRunOptionsPlugins; +} +/** + * A collection of user-defined code and setup ("support code") that can be + * used for a test run + * @public + * @remarks + * This is mostly a marker interface. The actual instance is a complex object + * that you shouldn't interact with directly, but some functions return and/or + * accept it as a means of optimising a test workflow. + */ +export interface ISupportCodeLibrary { + readonly originalCoordinates: ISupportCodeCoordinates; +} +/** + * Either an actual {@link ISupportCodeLibrary | support code library}, or the + * {@link ISupportCodeCoordinates | coordinates} required to create and + * populate one + * @public + * @remarks + * This alias exists because {@link runCucumber} will accept an existing + * support code library in its options and thus avoid trying to load it again, + * improving performance and avoiding cache issues for use cases where multiple + * test runs happen within the same process. Note this is only useful in serial + * mode, as parallel workers will each load the support code themselves anyway. + */ +export type ISupportCodeCoordinatesOrLibrary = Partial | ISupportCodeLibrary; +/** + * Options for {@link runCucumber} + * @public + */ +export interface IRunOptions { + sources: ISourcesCoordinates; + support: ISupportCodeCoordinatesOrLibrary; + runtime: IRunOptionsRuntime; + formats: IRunOptionsFormats; + plugins?: IRunOptionsPlugins; +} +/** + * Response from {@link runCucumber} + * @public + */ +export interface IRunResult { + /** + * Whether the test run was overall successful + * @remarks + * The exact meaning can vary based on the `strict` configuration option. + */ + success: boolean; + /** + * The support code library that was used in the test run + * @remarks + * This can be reused in subsequent {@link runCucumber} calls, + * see {@link ISupportCodeCoordinatesOrLibrary} + */ + support: ISupportCodeLibrary; +} diff --git a/node_modules/@cucumber/cucumber/lib/api/types.js b/node_modules/@cucumber/cucumber/lib/api/types.js new file mode 100644 index 00000000..11e638d1 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/types.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/api/types.js.map b/node_modules/@cucumber/cucumber/lib/api/types.js.map new file mode 100644 index 00000000..a01b4f0e --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"","sourcesContent":["import { JsonObject } from 'type-fest'\nimport { IPublishConfig } from '../publish'\nimport { IConfiguration } from '../configuration'\nimport { IPickleOrder } from '../filter'\n\n/**\n * Options for {@link loadConfiguration}\n * @public\n */\nexport interface ILoadConfigurationOptions {\n /**\n * Path to load configuration file from, or `false` to skip\n * @default `cucumber.(json|yaml|yml|js|cjs|mjs)`\n */\n file?: string | false\n /**\n * Zero or more profile names from which to source configuration in the file\n * @remarks\n * If omitted or empty, the `default` profile will be used.\n */\n profiles?: string[]\n /**\n * Ad-hoc configuration options to be merged over the top of whatever is\n * loaded from the configuration file/profiles\n * @example\n * \\{\n * failFast: true,\n * parallel: 2\n * \\}\n * @example [\"--fail-fast\", \"--parallel\", \"2\"]\n * @example \"--fail-fast --parallel 2\"\n * @remarks\n * This can also be provided as an array or single string of argv-style\n * arguments.\n */\n provided?: Partial | string[] | string\n}\n\n/**\n * Response from {@link loadConfiguration}\n * @public\n */\nexport interface IResolvedConfiguration {\n /**\n * The final flat configuration object resolved from the configuration\n * file/profiles plus any extra provided\n */\n useConfiguration: IConfiguration\n /**\n * The format that can be passed into {@link runCucumber}\n */\n runConfiguration: IRunConfiguration\n}\n\n/**\n * Options relating to sources (i.e. feature files) - where to load them from,\n * how to interpret, filter and order them\n * @public\n */\nexport interface ISourcesCoordinates {\n /**\n * Default Gherkin dialect\n * @remarks\n * Used if no dialect is specified in the feature file itself.\n */\n defaultDialect: string\n /**\n * Paths and/or glob expressions to feature files\n */\n paths: string[]\n /**\n * Regular expressions of which scenario names should match one of to be run\n */\n names: string[]\n /**\n * Tag expression to filter which scenarios should be run\n */\n tagExpression: string\n /**\n * Run in the order defined, or in a random order\n */\n order: IPickleOrder\n /**\n * Shard tests and execute only the selected shard, format `/`\n * @example 1/4\n * @remarks\n * Shards use 1-based numbering\n */\n shard?: string\n}\n\n/**\n * A pickle that has been successfully compiled from a source\n * @public\n */\nexport interface IPlannedPickle {\n /**\n * Name of the pickle (after parameter resolution)\n */\n name: string\n uri: string\n location: {\n line: number\n column?: number\n }\n}\n\n/**\n * An error encountered when parsing a source\n * @public\n */\nexport interface ISourcesError {\n uri: string\n location: {\n line: number\n column?: number\n }\n /**\n * Error message explaining what went wrong with the parse\n */\n message: string\n}\n\n/**\n * Response from {@link loadSources}\n * @public\n */\nexport interface ILoadSourcesResult {\n /**\n * Pickles that have been successfully compiled, in the order they would be\n * run in\n */\n plan: IPlannedPickle[]\n /**\n * Any errors encountered when parsing sources\n */\n errors: ISourcesError[]\n}\n\n/**\n * Options relating to user code (aka support code) - where to load it from and\n * how to preprocess it\n * @public\n */\nexport interface ISupportCodeCoordinates {\n /**\n * Names of transpilation modules to load, via `require()`\n */\n requireModules: string[]\n /**\n * Paths and/or glob expressions of user code to load, via `require()`\n */\n requirePaths: string[]\n /**\n * Paths and/or glob expressions of user code to load, via `import()`\n */\n importPaths: string[]\n /**\n * Specifiers of loaders to register, via `register()`\n */\n loaders: string[]\n}\n\n/**\n * Options for {@link loadSupport}\n * @public\n * @remarks\n * A subset of {@link IRunConfiguration}\n */\nexport interface ILoadSupportOptions {\n /**\n * @remarks\n * This is needed because the default support path locations are derived from\n * feature file locations.\n */\n sources: ISourcesCoordinates\n support: Partial\n}\n\n/**\n * Options relating to behaviour when actually running tests\n * @public\n */\nexport interface IRunOptionsRuntime {\n /**\n * Perform a dry run, where a test run is prepared but nothing is executed\n */\n dryRun: boolean\n /**\n * Stop running tests when a test fails\n */\n failFast: boolean\n /**\n * Filter out stack frames from Cucumber's code when formatting stack traces\n */\n filterStacktraces: boolean\n /**\n * Run tests in parallel with the given number of worker processes\n */\n parallel: number\n /**\n * Retry failing tests up to the given number of times\n */\n retry: number\n /**\n * Tag expression to filter which scenarios can be retried\n */\n retryTagFilter: string\n /**\n * Fail the test run if there are pending steps\n */\n strict: boolean\n /**\n * Parameters to be passed to the World\n * @remarks\n * The value must be a JSON-serializable object.\n */\n worldParameters: JsonObject\n}\n\n/**\n * Options relating to formatters - which ones to use, where to write their\n * output, how they should behave\n * @public\n */\nexport interface IRunOptionsFormats {\n /**\n * Name/path of the formatter to use for `stdout` output\n */\n stdout: string\n /**\n * Zero or more mappings of file output path (key) to name/path of the\n * formatter to use (value)\n * @example\n * \\{\n * \"./reports/cucumber.html\": \"html\",\n * \"./reports/custom.txt\": \"./custom-formatter.js\"\n * \\}\n */\n files: Record\n /**\n * Options for report publication, or `false` to disable publication\n */\n publish: IPublishConfig | false\n /**\n * Options to be provided to formatters\n * @remarks\n * The value must be a JSON-serializable object.\n */\n options: JsonObject\n}\n\n/**\n * Options relating to plugins - which ones to use and how they should behave\n * @public\n */\nexport interface IRunOptionsPlugins {\n /**\n * Specifiers of plugins to load\n * @example\n * [\n * \"\\@cucumber/my-plugin\",\n * \"./custom-plugin.js\"\n * ]\n * @remarks\n * Each item is a module specifier for a plugin to be loaded.\n */\n specifiers: string[]\n /**\n * Options to be provided to plugins\n * @remarks\n * The value must be a JSON-serializable object.\n */\n options: JsonObject\n}\n\n/**\n * Structured configuration object suitable for passing to {@link runCucumber}\n * @public\n */\nexport interface IRunConfiguration {\n sources: ISourcesCoordinates\n support: Partial\n runtime: IRunOptionsRuntime\n formats: IRunOptionsFormats\n plugins?: IRunOptionsPlugins\n}\n\n/**\n * A collection of user-defined code and setup (\"support code\") that can be\n * used for a test run\n * @public\n * @remarks\n * This is mostly a marker interface. The actual instance is a complex object\n * that you shouldn't interact with directly, but some functions return and/or\n * accept it as a means of optimising a test workflow.\n */\nexport interface ISupportCodeLibrary {\n readonly originalCoordinates: ISupportCodeCoordinates\n}\n\n/**\n * Either an actual {@link ISupportCodeLibrary | support code library}, or the\n * {@link ISupportCodeCoordinates | coordinates} required to create and\n * populate one\n * @public\n * @remarks\n * This alias exists because {@link runCucumber} will accept an existing\n * support code library in its options and thus avoid trying to load it again,\n * improving performance and avoiding cache issues for use cases where multiple\n * test runs happen within the same process. Note this is only useful in serial\n * mode, as parallel workers will each load the support code themselves anyway.\n */\nexport type ISupportCodeCoordinatesOrLibrary =\n | Partial\n | ISupportCodeLibrary\n\n/**\n * Options for {@link runCucumber}\n * @public\n */\nexport interface IRunOptions {\n sources: ISourcesCoordinates\n support: ISupportCodeCoordinatesOrLibrary\n runtime: IRunOptionsRuntime\n formats: IRunOptionsFormats\n plugins?: IRunOptionsPlugins\n}\n\n/**\n * Response from {@link runCucumber}\n * @public\n */\nexport interface IRunResult {\n /**\n * Whether the test run was overall successful\n * @remarks\n * The exact meaning can vary based on the `strict` configuration option.\n */\n success: boolean\n /**\n * The support code library that was used in the test run\n * @remarks\n * This can be reused in subsequent {@link runCucumber} calls,\n * see {@link ISupportCodeCoordinatesOrLibrary}\n */\n support: ISupportCodeLibrary\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/api/wrapper.mjs b/node_modules/@cucumber/cucumber/lib/api/wrapper.mjs new file mode 100644 index 00000000..7f111949 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/api/wrapper.mjs @@ -0,0 +1,6 @@ +import api from './index.js' + +export const loadConfiguration = api.loadConfiguration +export const loadSupport = api.loadSupport +export const loadSources = api.loadSources +export const runCucumber = api.runCucumber diff --git a/node_modules/@cucumber/cucumber/lib/assemble/assemble_test_cases.d.ts b/node_modules/@cucumber/cucumber/lib/assemble/assemble_test_cases.d.ts new file mode 100644 index 00000000..6da45a4e --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/assemble/assemble_test_cases.d.ts @@ -0,0 +1,5 @@ +import { EventEmitter } from 'node:events'; +import { IdGenerator } from '@cucumber/messages'; +import { SupportCodeLibrary } from '../support_code_library_builder/types'; +import { AssembledTestCase, SourcedPickle } from './types'; +export declare function assembleTestCases(testRunStartedId: string, eventBroadcaster: EventEmitter, newId: IdGenerator.NewId, sourcedPickles: ReadonlyArray, supportCodeLibrary: SupportCodeLibrary): Promise>; diff --git a/node_modules/@cucumber/cucumber/lib/assemble/assemble_test_cases.js b/node_modules/@cucumber/cucumber/lib/assemble/assemble_test_cases.js new file mode 100644 index 00000000..ad3d2ea6 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/assemble/assemble_test_cases.js @@ -0,0 +1,89 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.assembleTestCases = assembleTestCases; +const value_checker_1 = require("../value_checker"); +async function assembleTestCases(testRunStartedId, eventBroadcaster, newId, sourcedPickles, supportCodeLibrary) { + return sourcedPickles.map(({ gherkinDocument, pickle }) => { + const testCaseId = newId(); + const fromBeforeHooks = makeBeforeHookSteps({ + supportCodeLibrary, + pickle, + newId, + }); + const fromStepDefinitions = makeSteps({ + pickle, + supportCodeLibrary, + newId, + }); + const fromAfterHooks = makeAfterHookSteps({ + supportCodeLibrary, + pickle, + newId, + }); + const testCase = { + testRunStartedId, + pickleId: pickle.id, + id: testCaseId, + testSteps: [ + ...fromBeforeHooks, + ...fromStepDefinitions, + ...fromAfterHooks, + ], + }; + eventBroadcaster.emit('envelope', { testCase }); + return { + gherkinDocument, + pickle, + testCase, + }; + }); +} +function makeAfterHookSteps({ supportCodeLibrary, pickle, newId, }) { + return supportCodeLibrary.afterTestCaseHookDefinitions + .slice(0) + .reverse() + .filter((hookDefinition) => hookDefinition.appliesToTestCase(pickle)) + .map((hookDefinition) => ({ + id: newId(), + hookId: hookDefinition.id, + })); +} +function makeBeforeHookSteps({ supportCodeLibrary, pickle, newId, }) { + return supportCodeLibrary.beforeTestCaseHookDefinitions + .filter((hookDefinition) => hookDefinition.appliesToTestCase(pickle)) + .map((hookDefinition) => ({ + id: newId(), + hookId: hookDefinition.id, + })); +} +function makeSteps({ pickle, supportCodeLibrary, newId, }) { + return pickle.steps.map((pickleStep) => { + const stepDefinitions = supportCodeLibrary.stepDefinitions.filter((stepDefinition) => stepDefinition.matchesStepName(pickleStep.text)); + return { + id: newId(), + pickleStepId: pickleStep.id, + stepDefinitionIds: stepDefinitions.map((stepDefinition) => stepDefinition.id), + stepMatchArgumentsLists: stepDefinitions.map((stepDefinition) => { + const result = stepDefinition.expression.match(pickleStep.text); + return { + stepMatchArguments: result.map((arg) => { + return { + group: mapArgumentGroup(arg.group), + parameterTypeName: arg.parameterType.name, + }; + }), + }; + }), + }; + }); +} +function mapArgumentGroup(group) { + return { + start: group.start, + value: group.value, + children: (0, value_checker_1.doesHaveValue)(group.children) + ? group.children.map((child) => mapArgumentGroup(child)) + : undefined, + }; +} +//# sourceMappingURL=assemble_test_cases.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/assemble/assemble_test_cases.js.map b/node_modules/@cucumber/cucumber/lib/assemble/assemble_test_cases.js.map new file mode 100644 index 00000000..55ab2831 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/assemble/assemble_test_cases.js.map @@ -0,0 +1 @@ +{"version":3,"file":"assemble_test_cases.js","sourceRoot":"","sources":["../../src/assemble/assemble_test_cases.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventEmitter } from 'node:events'\nimport {\n Envelope,\n IdGenerator,\n Pickle,\n TestCase,\n TestStep,\n Group as MessagesGroup,\n} from '@cucumber/messages'\nimport { Group } from '@cucumber/cucumber-expressions'\nimport { SupportCodeLibrary } from '../support_code_library_builder/types'\nimport { doesHaveValue } from '../value_checker'\nimport { AssembledTestCase, SourcedPickle } from './types'\n\nexport async function assembleTestCases(\n testRunStartedId: string,\n eventBroadcaster: EventEmitter,\n newId: IdGenerator.NewId,\n sourcedPickles: ReadonlyArray,\n supportCodeLibrary: SupportCodeLibrary\n): Promise> {\n return sourcedPickles.map(({ gherkinDocument, pickle }) => {\n const testCaseId = newId()\n const fromBeforeHooks: TestStep[] = makeBeforeHookSteps({\n supportCodeLibrary,\n pickle,\n newId,\n })\n const fromStepDefinitions: TestStep[] = makeSteps({\n pickle,\n supportCodeLibrary,\n newId,\n })\n const fromAfterHooks: TestStep[] = makeAfterHookSteps({\n supportCodeLibrary,\n pickle,\n newId,\n })\n const testCase: TestCase = {\n testRunStartedId,\n pickleId: pickle.id,\n id: testCaseId,\n testSteps: [\n ...fromBeforeHooks,\n ...fromStepDefinitions,\n ...fromAfterHooks,\n ],\n }\n eventBroadcaster.emit('envelope', { testCase } satisfies Envelope)\n return {\n gherkinDocument,\n pickle,\n testCase,\n }\n })\n}\n\nfunction makeAfterHookSteps({\n supportCodeLibrary,\n pickle,\n newId,\n}: {\n supportCodeLibrary: SupportCodeLibrary\n pickle: Pickle\n newId: IdGenerator.NewId\n}): TestStep[] {\n return supportCodeLibrary.afterTestCaseHookDefinitions\n .slice(0)\n .reverse()\n .filter((hookDefinition) => hookDefinition.appliesToTestCase(pickle))\n .map((hookDefinition) => ({\n id: newId(),\n hookId: hookDefinition.id,\n }))\n}\n\nfunction makeBeforeHookSteps({\n supportCodeLibrary,\n pickle,\n newId,\n}: {\n supportCodeLibrary: SupportCodeLibrary\n pickle: Pickle\n newId: IdGenerator.NewId\n}): TestStep[] {\n return supportCodeLibrary.beforeTestCaseHookDefinitions\n .filter((hookDefinition) => hookDefinition.appliesToTestCase(pickle))\n .map((hookDefinition) => ({\n id: newId(),\n hookId: hookDefinition.id,\n }))\n}\n\nfunction makeSteps({\n pickle,\n supportCodeLibrary,\n newId,\n}: {\n pickle: Pickle\n supportCodeLibrary: SupportCodeLibrary\n newId: () => string\n}): TestStep[] {\n return pickle.steps.map((pickleStep) => {\n const stepDefinitions = supportCodeLibrary.stepDefinitions.filter(\n (stepDefinition) => stepDefinition.matchesStepName(pickleStep.text)\n )\n return {\n id: newId(),\n pickleStepId: pickleStep.id,\n stepDefinitionIds: stepDefinitions.map(\n (stepDefinition) => stepDefinition.id\n ),\n stepMatchArgumentsLists: stepDefinitions.map((stepDefinition) => {\n const result = stepDefinition.expression.match(pickleStep.text)\n return {\n stepMatchArguments: result.map((arg) => {\n return {\n group: mapArgumentGroup(arg.group),\n parameterTypeName: arg.parameterType.name,\n }\n }),\n }\n }),\n }\n })\n}\n\nfunction mapArgumentGroup(group: Group): MessagesGroup {\n return {\n start: group.start,\n value: group.value,\n children: doesHaveValue(group.children)\n ? group.children.map((child) => mapArgumentGroup(child))\n : undefined,\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/assemble/index.d.ts b/node_modules/@cucumber/cucumber/lib/assemble/index.d.ts new file mode 100644 index 00000000..c697b8f0 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/assemble/index.d.ts @@ -0,0 +1,2 @@ +export * from './assemble_test_cases'; +export * from './types'; diff --git a/node_modules/@cucumber/cucumber/lib/assemble/index.js b/node_modules/@cucumber/cucumber/lib/assemble/index.js new file mode 100644 index 00000000..d5065a32 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/assemble/index.js @@ -0,0 +1,19 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +__exportStar(require("./assemble_test_cases"), exports); +__exportStar(require("./types"), exports); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/assemble/index.js.map b/node_modules/@cucumber/cucumber/lib/assemble/index.js.map new file mode 100644 index 00000000..4f76d585 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/assemble/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/assemble/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wDAAqC;AACrC,0CAAuB","sourcesContent":["export * from './assemble_test_cases'\nexport * from './types'\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/assemble/types.d.ts b/node_modules/@cucumber/cucumber/lib/assemble/types.d.ts new file mode 100644 index 00000000..2cbef07e --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/assemble/types.d.ts @@ -0,0 +1,10 @@ +import { GherkinDocument, Pickle, TestCase } from '@cucumber/messages'; +export interface SourcedPickle { + gherkinDocument: GherkinDocument; + pickle: Pickle; +} +export interface AssembledTestCase { + gherkinDocument: GherkinDocument; + pickle: Pickle; + testCase: TestCase; +} diff --git a/node_modules/@cucumber/cucumber/lib/assemble/types.js b/node_modules/@cucumber/cucumber/lib/assemble/types.js new file mode 100644 index 00000000..11e638d1 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/assemble/types.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/assemble/types.js.map b/node_modules/@cucumber/cucumber/lib/assemble/types.js.map new file mode 100644 index 00000000..41322ba3 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/assemble/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/assemble/types.ts"],"names":[],"mappings":"","sourcesContent":["import { GherkinDocument, Pickle, TestCase } from '@cucumber/messages'\n\nexport interface SourcedPickle {\n gherkinDocument: GherkinDocument\n pickle: Pickle\n}\n\nexport interface AssembledTestCase {\n gherkinDocument: GherkinDocument\n pickle: Pickle\n testCase: TestCase\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/cli/i18n.d.ts b/node_modules/@cucumber/cucumber/lib/cli/i18n.d.ts new file mode 100644 index 00000000..82dc3b04 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/cli/i18n.d.ts @@ -0,0 +1,2 @@ +export declare function getLanguages(): string; +export declare function getKeywords(isoCode: string): string; diff --git a/node_modules/@cucumber/cucumber/lib/cli/i18n.js b/node_modules/@cucumber/cucumber/lib/cli/i18n.js new file mode 100644 index 00000000..d79b2dc1 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/cli/i18n.js @@ -0,0 +1,69 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getLanguages = getLanguages; +exports.getKeywords = getKeywords; +const gherkin_1 = require("@cucumber/gherkin"); +const cli_table3_1 = __importDefault(require("cli-table3")); +const capital_case_1 = require("capital-case"); +const keywords = [ + 'feature', + 'rule', + 'background', + 'scenario', + 'scenarioOutline', + 'examples', + 'given', + 'when', + 'then', + 'and', + 'but', +]; +function getAsTable(header, rows) { + const table = new cli_table3_1.default({ + chars: { + bottom: '', + 'bottom-left': '', + 'bottom-mid': '', + 'bottom-right': '', + left: '', + 'left-mid': '', + mid: '', + 'mid-mid': '', + middle: ' | ', + right: '', + 'right-mid': '', + top: '', + 'top-left': '', + 'top-mid': '', + 'top-right': '', + }, + style: { + border: [], + 'padding-left': 0, + 'padding-right': 0, + }, + }); + table.push(header); + table.push(...rows); + return table.toString(); +} +function getLanguages() { + const rows = Object.keys(gherkin_1.dialects).map((isoCode) => [ + isoCode, + gherkin_1.dialects[isoCode].name, + gherkin_1.dialects[isoCode].native, + ]); + return getAsTable(['ISO 639-1', 'ENGLISH NAME', 'NATIVE NAME'], rows); +} +function getKeywords(isoCode) { + const language = gherkin_1.dialects[isoCode]; + const rows = keywords.map((keyword) => { + const words = language[keyword].map((s) => `"${s}"`).join(', '); + return [(0, capital_case_1.capitalCase)(keyword), words]; + }); + return getAsTable(['ENGLISH KEYWORD', 'NATIVE KEYWORDS'], rows); +} +//# sourceMappingURL=i18n.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/cli/i18n.js.map b/node_modules/@cucumber/cucumber/lib/cli/i18n.js.map new file mode 100644 index 00000000..f545dd4f --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/cli/i18n.js.map @@ -0,0 +1 @@ +{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/cli/i18n.ts"],"names":[],"mappings":";;;;;AAgDA,oCAOC;AAED,kCAOC;AAhED,+CAA4C;AAC5C,4DAA8B;AAC9B,+CAA0C;AAE1C,MAAM,QAAQ,GAAG;IACf,SAAS;IACT,MAAM;IACN,YAAY;IACZ,UAAU;IACV,iBAAiB;IACjB,UAAU;IACV,OAAO;IACP,MAAM;IACN,MAAM;IACN,KAAK;IACL,KAAK;CACG,CAAA;AAEV,SAAS,UAAU,CAAC,MAAgB,EAAE,IAAgB;IACpD,MAAM,KAAK,GAAG,IAAI,oBAAK,CAAC;QACtB,KAAK,EAAE;YACL,MAAM,EAAE,EAAE;YACV,aAAa,EAAE,EAAE;YACjB,YAAY,EAAE,EAAE;YAChB,cAAc,EAAE,EAAE;YAClB,IAAI,EAAE,EAAE;YACR,UAAU,EAAE,EAAE;YACd,GAAG,EAAE,EAAE;YACP,SAAS,EAAE,EAAE;YACb,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,EAAE;YACT,WAAW,EAAE,EAAE;YACf,GAAG,EAAE,EAAE;YACP,UAAU,EAAE,EAAE;YACd,SAAS,EAAE,EAAE;YACb,WAAW,EAAE,EAAE;SAChB;QACD,KAAK,EAAE;YACL,MAAM,EAAE,EAAE;YACV,cAAc,EAAE,CAAC;YACjB,eAAe,EAAE,CAAC;SACnB;KACF,CAAC,CAAA;IACF,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAClB,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAA;IACnB,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAA;AACzB,CAAC;AAED,SAAgB,YAAY;IAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,kBAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAClD,OAAO;QACP,kBAAQ,CAAC,OAAO,CAAC,CAAC,IAAI;QACtB,kBAAQ,CAAC,OAAO,CAAC,CAAC,MAAM;KACzB,CAAC,CAAA;IACF,OAAO,UAAU,CAAC,CAAC,WAAW,EAAE,cAAc,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,CAAA;AACvE,CAAC;AAED,SAAgB,WAAW,CAAC,OAAe;IACzC,MAAM,QAAQ,GAAG,kBAAQ,CAAC,OAAO,CAAC,CAAA;IAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC/D,OAAO,CAAC,IAAA,0BAAW,EAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IACF,OAAO,UAAU,CAAC,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,EAAE,IAAI,CAAC,CAAA;AACjE,CAAC","sourcesContent":["import { dialects } from '@cucumber/gherkin'\nimport Table from 'cli-table3'\nimport { capitalCase } from 'capital-case'\n\nconst keywords = [\n 'feature',\n 'rule',\n 'background',\n 'scenario',\n 'scenarioOutline',\n 'examples',\n 'given',\n 'when',\n 'then',\n 'and',\n 'but',\n] as const\n\nfunction getAsTable(header: string[], rows: string[][]): string {\n const table = new Table({\n chars: {\n bottom: '',\n 'bottom-left': '',\n 'bottom-mid': '',\n 'bottom-right': '',\n left: '',\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n middle: ' | ',\n right: '',\n 'right-mid': '',\n top: '',\n 'top-left': '',\n 'top-mid': '',\n 'top-right': '',\n },\n style: {\n border: [],\n 'padding-left': 0,\n 'padding-right': 0,\n },\n })\n table.push(header)\n table.push(...rows)\n return table.toString()\n}\n\nexport function getLanguages(): string {\n const rows = Object.keys(dialects).map((isoCode) => [\n isoCode,\n dialects[isoCode].name,\n dialects[isoCode].native,\n ])\n return getAsTable(['ISO 639-1', 'ENGLISH NAME', 'NATIVE NAME'], rows)\n}\n\nexport function getKeywords(isoCode: string): string {\n const language = dialects[isoCode]\n const rows = keywords.map((keyword) => {\n const words = language[keyword].map((s) => `\"${s}\"`).join(', ')\n return [capitalCase(keyword), words]\n })\n return getAsTable(['ENGLISH KEYWORD', 'NATIVE KEYWORDS'], rows)\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/cli/index.d.ts b/node_modules/@cucumber/cucumber/lib/cli/index.d.ts new file mode 100644 index 00000000..60cf7bfc --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/cli/index.d.ts @@ -0,0 +1,20 @@ +import { IFormatterStream } from '../formatter'; +export interface ICliRunResult { + shouldExitImmediately: boolean; + success: boolean; +} +export default class Cli { + private readonly argv; + private readonly cwd; + private readonly stdout; + private readonly stderr; + private readonly env; + constructor({ argv, cwd, stdout, stderr, env, }: { + argv: string[]; + cwd: string; + stdout: IFormatterStream; + stderr?: IFormatterStream; + env: NodeJS.ProcessEnv; + }); + run(): Promise; +} diff --git a/node_modules/@cucumber/cucumber/lib/cli/index.js b/node_modules/@cucumber/cucumber/lib/cli/index.js new file mode 100644 index 00000000..aefa5ca8 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/cli/index.js @@ -0,0 +1,64 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const debug_1 = __importDefault(require("debug")); +const configuration_1 = require("../configuration"); +const api_1 = require("../api"); +const i18n_1 = require("./i18n"); +const install_validator_1 = require("./install_validator"); +class Cli { + argv; + cwd; + stdout; + stderr; + env; + constructor({ argv, cwd, stdout, stderr = process.stderr, env, }) { + this.argv = argv; + this.cwd = cwd; + this.stdout = stdout; + this.stderr = stderr; + this.env = env; + } + async run() { + const debugEnabled = debug_1.default.enabled('cucumber'); + if (debugEnabled) { + await (0, install_validator_1.validateInstall)(); + } + const { options, configuration: argvConfiguration } = configuration_1.ArgvParser.parse(this.argv); + if (options.i18nLanguages) { + this.stdout.write((0, i18n_1.getLanguages)()); + return { + shouldExitImmediately: true, + success: true, + }; + } + if (options.i18nKeywords) { + this.stdout.write((0, i18n_1.getKeywords)(options.i18nKeywords)); + return { + shouldExitImmediately: true, + success: true, + }; + } + const environment = { + cwd: this.cwd, + stdout: this.stdout, + stderr: this.stderr, + env: this.env, + debug: debugEnabled, + }; + const { useConfiguration: configuration, runConfiguration } = await (0, api_1.loadConfiguration)({ + file: options.config, + profiles: options.profile, + provided: argvConfiguration, + }, environment); + const { success } = await (0, api_1.runCucumber)(runConfiguration, environment); + return { + shouldExitImmediately: configuration.forceExit, + success, + }; + } +} +exports.default = Cli; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/cli/index.js.map b/node_modules/@cucumber/cucumber/lib/cli/index.js.map new file mode 100644 index 00000000..5e952d35 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/cli/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;;AAAA,kDAAyB;AACzB,oDAA6C;AAE7C,gCAAuD;AACvD,iCAAkD;AAClD,2DAAqD;AAOrD,MAAqB,GAAG;IACL,IAAI,CAAU;IACd,GAAG,CAAQ;IACX,MAAM,CAAkB;IACxB,MAAM,CAAkB;IACxB,GAAG,CAAmB;IAEvC,YAAY,EACV,IAAI,EACJ,GAAG,EACH,MAAM,EACN,MAAM,GAAG,OAAO,CAAC,MAAM,EACvB,GAAG,GAOJ;QACC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,GAAG;QACP,MAAM,YAAY,GAAG,eAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QAC9C,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,IAAA,mCAAe,GAAE,CAAA;QACzB,CAAC;QACD,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,GAAG,0BAAU,CAAC,KAAK,CACpE,IAAI,CAAC,IAAI,CACV,CAAA;QACD,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,mBAAY,GAAE,CAAC,CAAA;YACjC,OAAO;gBACL,qBAAqB,EAAE,IAAI;gBAC3B,OAAO,EAAE,IAAI;aACd,CAAA;QACH,CAAC;QACD,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,kBAAW,EAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAA;YACpD,OAAO;gBACL,qBAAqB,EAAE,IAAI;gBAC3B,OAAO,EAAE,IAAI;aACd,CAAA;QACH,CAAC;QAED,MAAM,WAAW,GAAG;YAClB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,KAAK,EAAE,YAAY;SACpB,CAAA;QACD,MAAM,EAAE,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,EAAE,GACzD,MAAM,IAAA,uBAAiB,EACrB;YACE,IAAI,EAAE,OAAO,CAAC,MAAM;YACpB,QAAQ,EAAE,OAAO,CAAC,OAAO;YACzB,QAAQ,EAAE,iBAAiB;SAC5B,EACD,WAAW,CACZ,CAAA;QACH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAA,iBAAW,EAAC,gBAAgB,EAAE,WAAW,CAAC,CAAA;QACpE,OAAO;YACL,qBAAqB,EAAE,aAAa,CAAC,SAAS;YAC9C,OAAO;SACR,CAAA;IACH,CAAC;CACF;AAxED,sBAwEC","sourcesContent":["import debug from 'debug'\nimport { ArgvParser } from '../configuration'\nimport { IFormatterStream } from '../formatter'\nimport { loadConfiguration, runCucumber } from '../api'\nimport { getKeywords, getLanguages } from './i18n'\nimport { validateInstall } from './install_validator'\n\nexport interface ICliRunResult {\n shouldExitImmediately: boolean\n success: boolean\n}\n\nexport default class Cli {\n private readonly argv: string[]\n private readonly cwd: string\n private readonly stdout: IFormatterStream\n private readonly stderr: IFormatterStream\n private readonly env: NodeJS.ProcessEnv\n\n constructor({\n argv,\n cwd,\n stdout,\n stderr = process.stderr,\n env,\n }: {\n argv: string[]\n cwd: string\n stdout: IFormatterStream\n stderr?: IFormatterStream\n env: NodeJS.ProcessEnv\n }) {\n this.argv = argv\n this.cwd = cwd\n this.stdout = stdout\n this.stderr = stderr\n this.env = env\n }\n\n async run(): Promise {\n const debugEnabled = debug.enabled('cucumber')\n if (debugEnabled) {\n await validateInstall()\n }\n const { options, configuration: argvConfiguration } = ArgvParser.parse(\n this.argv\n )\n if (options.i18nLanguages) {\n this.stdout.write(getLanguages())\n return {\n shouldExitImmediately: true,\n success: true,\n }\n }\n if (options.i18nKeywords) {\n this.stdout.write(getKeywords(options.i18nKeywords))\n return {\n shouldExitImmediately: true,\n success: true,\n }\n }\n\n const environment = {\n cwd: this.cwd,\n stdout: this.stdout,\n stderr: this.stderr,\n env: this.env,\n debug: debugEnabled,\n }\n const { useConfiguration: configuration, runConfiguration } =\n await loadConfiguration(\n {\n file: options.config,\n profiles: options.profile,\n provided: argvConfiguration,\n },\n environment\n )\n const { success } = await runCucumber(runConfiguration, environment)\n return {\n shouldExitImmediately: configuration.forceExit,\n success,\n }\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/cli/install_validator.d.ts b/node_modules/@cucumber/cucumber/lib/cli/install_validator.d.ts new file mode 100644 index 00000000..c299da65 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/cli/install_validator.d.ts @@ -0,0 +1 @@ +export declare function validateInstall(): Promise; diff --git a/node_modules/@cucumber/cucumber/lib/cli/install_validator.js b/node_modules/@cucumber/cucumber/lib/cli/install_validator.js new file mode 100644 index 00000000..c378bbbb --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/cli/install_validator.js @@ -0,0 +1,17 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.validateInstall = validateInstall; +/* eslint-disable no-console */ +const is_installed_globally_1 = __importDefault(require("is-installed-globally")); +async function validateInstall() { + if (is_installed_globally_1.default) + console.warn(` + It looks like you're running Cucumber from a global installation. + If so, you'll likely see issues - you need to have Cucumber installed as a local dependency in your project. + See https://github.com/cucumber/cucumber-js/blob/main/docs/installation.md#invalid-installations + `); +} +//# sourceMappingURL=install_validator.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/cli/install_validator.js.map b/node_modules/@cucumber/cucumber/lib/cli/install_validator.js.map new file mode 100644 index 00000000..0e1bcea9 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/cli/install_validator.js.map @@ -0,0 +1 @@ +{"version":3,"file":"install_validator.js","sourceRoot":"","sources":["../../src/cli/install_validator.ts"],"names":[],"mappings":";;;;;AAGA,0CASC;AAZD,+BAA+B;AAC/B,kFAAuD;AAEhD,KAAK,UAAU,eAAe;IACnC,IAAI,+BAAmB;QACrB,OAAO,CAAC,IAAI,CACV;;;;OAIC,CACF,CAAA;AACL,CAAC","sourcesContent":["/* eslint-disable no-console */\nimport isInstalledGlobally from 'is-installed-globally'\n\nexport async function validateInstall(): Promise {\n if (isInstalledGlobally)\n console.warn(\n `\n It looks like you're running Cucumber from a global installation.\n If so, you'll likely see issues - you need to have Cucumber installed as a local dependency in your project.\n See https://github.com/cucumber/cucumber-js/blob/main/docs/installation.md#invalid-installations\n `\n )\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/cli/run.d.ts b/node_modules/@cucumber/cucumber/lib/cli/run.d.ts new file mode 100644 index 00000000..b3c9871c --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/cli/run.d.ts @@ -0,0 +1 @@ +export default function run(): Promise; diff --git a/node_modules/@cucumber/cucumber/lib/cli/run.js b/node_modules/@cucumber/cucumber/lib/cli/run.js new file mode 100644 index 00000000..7bdf6ce8 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/cli/run.js @@ -0,0 +1,43 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = run; +/* eslint-disable no-console */ +/* This is one rare place where we're fine to use process/console directly, + * but other code abstracts those to remain composable and testable. */ +const validate_node_engine_version_1 = require("./validate_node_engine_version"); +const _1 = __importDefault(require("./")); +function logErrorMessageAndExit(message) { + console.error(message); + process.exit(1); +} +async function run() { + (0, validate_node_engine_version_1.validateNodeEngineVersion)(process.version, (error) => { + console.error(error); + process.exit(1); + }, console.warn); + const cli = new _1.default({ + argv: process.argv, + cwd: process.cwd(), + stdout: process.stdout, + stderr: process.stderr, + env: process.env, + }); + let result; + try { + result = await cli.run(); + } + catch (error) { + logErrorMessageAndExit(error); + } + const exitCode = result.success ? 0 : 1; + if (result.shouldExitImmediately) { + process.exit(exitCode); + } + else { + process.exitCode = exitCode; + } +} +//# sourceMappingURL=run.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/cli/run.js.map b/node_modules/@cucumber/cucumber/lib/cli/run.js.map new file mode 100644 index 00000000..12ac449f --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/cli/run.js.map @@ -0,0 +1 @@ +{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":";;;;;AAWA,sBA+BC;AA1CD,+BAA+B;AAC/B;uEACuE;AACvE,iFAA0E;AAC1E,0CAAuC;AAEvC,SAAS,sBAAsB,CAAC,OAAe;IAC7C,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AAEc,KAAK,UAAU,GAAG;IAC/B,IAAA,wDAAyB,EACvB,OAAO,CAAC,OAAO,EACf,CAAC,KAAK,EAAE,EAAE;QACR,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,EACD,OAAO,CAAC,IAAI,CACb,CAAA;IAED,MAAM,GAAG,GAAG,IAAI,UAAG,CAAC;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAA;IAEF,IAAI,MAAqB,CAAA;IACzB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,CAAA;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sBAAsB,CAAC,KAAK,CAAC,CAAA;IAC/B,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACvC,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACxB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC7B,CAAC;AACH,CAAC","sourcesContent":["/* eslint-disable no-console */\n/* This is one rare place where we're fine to use process/console directly,\n * but other code abstracts those to remain composable and testable. */\nimport { validateNodeEngineVersion } from './validate_node_engine_version'\nimport Cli, { ICliRunResult } from './'\n\nfunction logErrorMessageAndExit(message: string): void {\n console.error(message)\n process.exit(1)\n}\n\nexport default async function run(): Promise {\n validateNodeEngineVersion(\n process.version,\n (error) => {\n console.error(error)\n process.exit(1)\n },\n console.warn\n )\n\n const cli = new Cli({\n argv: process.argv,\n cwd: process.cwd(),\n stdout: process.stdout,\n stderr: process.stderr,\n env: process.env,\n })\n\n let result: ICliRunResult\n try {\n result = await cli.run()\n } catch (error) {\n logErrorMessageAndExit(error)\n }\n\n const exitCode = result.success ? 0 : 1\n if (result.shouldExitImmediately) {\n process.exit(exitCode)\n } else {\n process.exitCode = exitCode\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/cli/validate_node_engine_version.d.ts b/node_modules/@cucumber/cucumber/lib/cli/validate_node_engine_version.d.ts new file mode 100644 index 00000000..52063343 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/cli/validate_node_engine_version.d.ts @@ -0,0 +1,10 @@ +type PackageJSON = { + engines: { + node: string; + }; + enginesTested: { + node: string; + }; +}; +export declare function validateNodeEngineVersion(currentVersion: string, onError: (message: string) => void, onWarning: (message: string) => void, readPackageJSON?: () => PackageJSON): void; +export {}; diff --git a/node_modules/@cucumber/cucumber/lib/cli/validate_node_engine_version.js b/node_modules/@cucumber/cucumber/lib/cli/validate_node_engine_version.js new file mode 100644 index 00000000..74186121 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/cli/validate_node_engine_version.js @@ -0,0 +1,23 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.validateNodeEngineVersion = validateNodeEngineVersion; +const node_fs_1 = __importDefault(require("node:fs")); +const node_path_1 = __importDefault(require("node:path")); +const semver_1 = __importDefault(require("semver")); +const readActualPackageJSON = () => JSON.parse(node_fs_1.default + .readFileSync(node_path_1.default.resolve(__dirname, '..', '..', 'package.json')) + .toString()); +function validateNodeEngineVersion(currentVersion, onError, onWarning, readPackageJSON = readActualPackageJSON) { + const requiredVersions = readPackageJSON().engines.node; + const testedVersions = readPackageJSON().enginesTested.node; + if (!semver_1.default.satisfies(currentVersion, requiredVersions)) { + onError(`Cucumber can only run on Node.js versions ${requiredVersions}. This Node.js version is ${currentVersion}`); + } + else if (!semver_1.default.satisfies(currentVersion, testedVersions)) { + onWarning(`This Node.js version (${currentVersion}) has not been tested with this version of Cucumber; it should work normally, but please raise an issue if you see anything unexpected.`); + } +} +//# sourceMappingURL=validate_node_engine_version.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/cli/validate_node_engine_version.js.map b/node_modules/@cucumber/cucumber/lib/cli/validate_node_engine_version.js.map new file mode 100644 index 00000000..4665bdad --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/cli/validate_node_engine_version.js.map @@ -0,0 +1 @@ +{"version":3,"file":"validate_node_engine_version.js","sourceRoot":"","sources":["../../src/cli/validate_node_engine_version.ts"],"names":[],"mappings":";;;;;AAgBA,8DAiBC;AAjCD,sDAAwB;AACxB,0DAA4B;AAC5B,oDAA2B;AAO3B,MAAM,qBAAqB,GAAsB,GAAG,EAAE,CACpD,IAAI,CAAC,KAAK,CACR,iBAAE;KACC,YAAY,CAAC,mBAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;KACjE,QAAQ,EAAE,CACd,CAAA;AAEH,SAAgB,yBAAyB,CACvC,cAAsB,EACtB,OAAkC,EAClC,SAAoC,EACpC,kBAAqC,qBAAqB;IAE1D,MAAM,gBAAgB,GAAG,eAAe,EAAE,CAAC,OAAO,CAAC,IAAI,CAAA;IACvD,MAAM,cAAc,GAAG,eAAe,EAAE,CAAC,aAAa,CAAC,IAAI,CAAA;IAC3D,IAAI,CAAC,gBAAM,CAAC,SAAS,CAAC,cAAc,EAAE,gBAAgB,CAAC,EAAE,CAAC;QACxD,OAAO,CACL,6CAA6C,gBAAgB,6BAA6B,cAAc,EAAE,CAC3G,CAAA;IACH,CAAC;SAAM,IAAI,CAAC,gBAAM,CAAC,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC,EAAE,CAAC;QAC7D,SAAS,CACP,yBAAyB,cAAc,yIAAyI,CACjL,CAAA;IACH,CAAC;AACH,CAAC","sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\nimport semver from 'semver'\n\ntype PackageJSON = {\n engines: { node: string }\n enginesTested: { node: string }\n}\n\nconst readActualPackageJSON: () => PackageJSON = () =>\n JSON.parse(\n fs\n .readFileSync(path.resolve(__dirname, '..', '..', 'package.json'))\n .toString()\n )\n\nexport function validateNodeEngineVersion(\n currentVersion: string,\n onError: (message: string) => void,\n onWarning: (message: string) => void,\n readPackageJSON: () => PackageJSON = readActualPackageJSON\n): void {\n const requiredVersions = readPackageJSON().engines.node\n const testedVersions = readPackageJSON().enginesTested.node\n if (!semver.satisfies(currentVersion, requiredVersions)) {\n onError(\n `Cucumber can only run on Node.js versions ${requiredVersions}. This Node.js version is ${currentVersion}`\n )\n } else if (!semver.satisfies(currentVersion, testedVersions)) {\n onWarning(\n `This Node.js version (${currentVersion}) has not been tested with this version of Cucumber; it should work normally, but please raise an issue if you see anything unexpected.`\n )\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/configuration/argv_parser.d.ts b/node_modules/@cucumber/cucumber/lib/configuration/argv_parser.d.ts new file mode 100644 index 00000000..92a59cb2 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/argv_parser.d.ts @@ -0,0 +1,22 @@ +import { IConfiguration } from './types'; +export interface IParsedArgvOptions { + config?: string; + i18nKeywords?: string; + i18nLanguages?: boolean; + profile: string[]; + plugin?: string[]; + pluginOptions?: object; +} +export interface IParsedArgv { + options: IParsedArgvOptions; + configuration: Partial; +} +declare const ArgvParser: { + collect(val: T, memo?: T[]): T[]; + mergeJson(option: string): (str: string, memo?: object) => object; + mergeTags(value: string, memo?: string): string; + validateCountOption(value: string, optionName: string): number; + validateLanguage(value: string): string; + parse(argv: string[]): IParsedArgv; +}; +export default ArgvParser; diff --git a/node_modules/@cucumber/cucumber/lib/configuration/argv_parser.js b/node_modules/@cucumber/cucumber/lib/configuration/argv_parser.js new file mode 100644 index 00000000..221ec21f --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/argv_parser.js @@ -0,0 +1,106 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const commander_1 = require("commander"); +const lodash_merge_1 = __importDefault(require("lodash.merge")); +const gherkin_1 = require("@cucumber/gherkin"); +const version_1 = require("../version"); +const builtin_1 = require("../formatter/builtin"); +const ArgvParser = { + collect(val, memo = []) { + if (val) { + return [...memo, val]; + } + return undefined; + }, + mergeJson(option) { + return function (str, memo = {}) { + let val; + try { + val = JSON.parse(str); + } + catch (error) { + const e = error; + throw new Error(`${option} passed invalid JSON: ${e.message}: ${str}`); + } + if (typeof val !== 'object' || Array.isArray(val)) { + throw new Error(`${option} must be passed JSON of an object: ${str}`); + } + return (0, lodash_merge_1.default)(memo, val); + }; + }, + mergeTags(value, memo) { + return memo ? `${memo} and (${value})` : `(${value})`; + }, + validateCountOption(value, optionName) { + const numericValue = parseInt(value); + if (isNaN(numericValue) || numericValue < 0) { + throw new Error(`${optionName} must be a non negative integer`); + } + return numericValue; + }, + validateLanguage(value) { + if (!Object.keys(gherkin_1.dialects).includes(value)) { + throw new Error(`Unsupported ISO 639-1: ${value}`); + } + return value; + }, + parse(argv) { + const program = new commander_1.Command('cucumber-js'); + program + .allowExcessArguments(true) + .storeOptionsAsProperties(false) + .usage('[options] [...]') + .version(version_1.version, '-v, --version') + .option('-b, --backtrace', 'show full backtrace for errors') + .option('-c, --config ', 'specify configuration file') + .option('-d, --dry-run', 'invoke formatters without executing steps') + .option('--exit, --force-exit', 'force shutdown of the event loop when the test run has finished: cucumber will call process.exit') + .option('--fail-fast', 'abort the run on first failure') + .option('-f, --format ', 'specify the output format, optionally supply PATH to redirect formatter output (repeatable). Available formats:\n' + + Object.entries(builtin_1.documentation).reduce((previous, [key, description]) => previous + ` ${key}: ${description}\n`, ''), ArgvParser.collect) + .option('--format-options ', 'provide options for formatters (repeatable)', ArgvParser.mergeJson('--format-options')) + .option('--i18n-keywords ', 'list language keywords', ArgvParser.validateLanguage) + .option('--i18n-languages', 'list languages') + .option('-i, --import ', 'import files before executing features (repeatable)', ArgvParser.collect) + .option('-l, --loader ', 'module specifier(s) for loaders to be registered ahead of loading support code', ArgvParser.collect) + .option('--language ', 'provide the default language for feature files') + .option('--name ', 'only execute the scenarios with name matching the expression (repeatable)', ArgvParser.collect) + .option('--order ', 'run scenarios in the specified order. Type should be `defined`, `reverse` or `random`') + .option('-p, --profile ', 'specify the profile to use (repeatable)', ArgvParser.collect, []) + .option('--parallel ', 'run in parallel with the given number of workers', (val) => ArgvParser.validateCountOption(val, '--parallel')) + .option('--plugin ', 'load a plugin (repeatable)', ArgvParser.collect) + .option('--plugin-options ', 'provide options for plugins (repeatable)', ArgvParser.mergeJson('--plugin-options')) + .option('--publish', 'Publish a report to https://reports.cucumber.io') + .option('-r, --require ', 'require files before executing features (repeatable)', ArgvParser.collect) + .option('--require-module ', 'require node modules before requiring files (repeatable)', ArgvParser.collect) + .option('--retry ', 'specify the number of times to retry failing test cases (default: 0)', (val) => ArgvParser.validateCountOption(val, '--retry')) + .option('--retry-tag-filter ', `only retries the features or scenarios with tags matching the expression (repeatable). + This option requires '--retry' to be specified.`, ArgvParser.mergeTags) + .option('--shard ', 'run shard INDEX of TOTAL shards. The index starts at 1') + .option('--strict', 'fail if there are pending steps') + .option('--no-strict', 'succeed even if there are pending steps') + .option('-t, --tags ', 'only execute the features or scenarios with tags matching the expression (repeatable)', ArgvParser.mergeTags) + .option('--world-parameters ', 'provide parameters that will be passed to the world constructor (repeatable)', ArgvParser.mergeJson('--world-parameters')); + program.addHelpText('afterAll', 'For more details please visit https://github.com/cucumber/cucumber-js/blob/main/docs/cli.md'); + program.parse(argv); + const { config, i18nKeywords, i18nLanguages, profile, ...regularStuff } = program.opts(); + const configuration = regularStuff; + if (program.args.length > 0) { + configuration.paths = program.args; + } + return { + options: { + config, + i18nKeywords, + i18nLanguages, + profile, + }, + configuration, + }; + }, +}; +exports.default = ArgvParser; +//# sourceMappingURL=argv_parser.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/configuration/argv_parser.js.map b/node_modules/@cucumber/cucumber/lib/configuration/argv_parser.js.map new file mode 100644 index 00000000..a576eb34 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/argv_parser.js.map @@ -0,0 +1 @@ +{"version":3,"file":"argv_parser.js","sourceRoot":"","sources":["../../src/configuration/argv_parser.ts"],"names":[],"mappings":"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","sourcesContent":["import { Command } from 'commander'\nimport merge from 'lodash.merge'\nimport { dialects } from '@cucumber/gherkin'\nimport { version } from '../version'\nimport { documentation } from '../formatter/builtin'\nimport { IConfiguration } from './types'\n\nexport interface IParsedArgvOptions {\n config?: string\n i18nKeywords?: string\n i18nLanguages?: boolean\n profile: string[]\n plugin?: string[]\n pluginOptions?: object\n}\n\nexport interface IParsedArgv {\n options: IParsedArgvOptions\n configuration: Partial\n}\n\ntype IRawArgvOptions = Partial> &\n IParsedArgvOptions\n\nconst ArgvParser = {\n collect(val: T, memo: T[] = []): T[] {\n if (val) {\n return [...memo, val]\n }\n return undefined\n },\n\n mergeJson(option: string): (str: string, memo?: object) => object {\n return function (str: string, memo: object = {}) {\n let val: object\n try {\n val = JSON.parse(str)\n } catch (error) {\n const e: Error = error\n throw new Error(`${option} passed invalid JSON: ${e.message}: ${str}`)\n }\n if (typeof val !== 'object' || Array.isArray(val)) {\n throw new Error(`${option} must be passed JSON of an object: ${str}`)\n }\n return merge(memo, val)\n }\n },\n\n mergeTags(value: string, memo?: string): string {\n return memo ? `${memo} and (${value})` : `(${value})`\n },\n\n validateCountOption(value: string, optionName: string): number {\n const numericValue = parseInt(value)\n if (isNaN(numericValue) || numericValue < 0) {\n throw new Error(`${optionName} must be a non negative integer`)\n }\n return numericValue\n },\n\n validateLanguage(value: string): string {\n if (!Object.keys(dialects).includes(value)) {\n throw new Error(`Unsupported ISO 639-1: ${value}`)\n }\n return value\n },\n\n parse(argv: string[]): IParsedArgv {\n const program = new Command('cucumber-js')\n\n program\n .allowExcessArguments(true)\n .storeOptionsAsProperties(false)\n .usage('[options] [...]')\n .version(version, '-v, --version')\n .option('-b, --backtrace', 'show full backtrace for errors')\n .option('-c, --config ', 'specify configuration file')\n .option('-d, --dry-run', 'invoke formatters without executing steps')\n .option(\n '--exit, --force-exit',\n 'force shutdown of the event loop when the test run has finished: cucumber will call process.exit'\n )\n .option('--fail-fast', 'abort the run on first failure')\n .option(\n '-f, --format ',\n 'specify the output format, optionally supply PATH to redirect formatter output (repeatable). Available formats:\\n' +\n Object.entries(documentation).reduce(\n (previous, [key, description]) =>\n previous + ` ${key}: ${description}\\n`,\n ''\n ),\n ArgvParser.collect\n )\n .option(\n '--format-options ',\n 'provide options for formatters (repeatable)',\n ArgvParser.mergeJson('--format-options')\n )\n .option(\n '--i18n-keywords ',\n 'list language keywords',\n ArgvParser.validateLanguage\n )\n .option('--i18n-languages', 'list languages')\n .option(\n '-i, --import ',\n 'import files before executing features (repeatable)',\n ArgvParser.collect\n )\n .option(\n '-l, --loader ',\n 'module specifier(s) for loaders to be registered ahead of loading support code',\n ArgvParser.collect\n )\n .option(\n '--language ',\n 'provide the default language for feature files'\n )\n .option(\n '--name ',\n 'only execute the scenarios with name matching the expression (repeatable)',\n ArgvParser.collect\n )\n .option(\n '--order ',\n 'run scenarios in the specified order. Type should be `defined`, `reverse` or `random`'\n )\n .option(\n '-p, --profile ',\n 'specify the profile to use (repeatable)',\n ArgvParser.collect,\n []\n )\n .option(\n '--parallel ',\n 'run in parallel with the given number of workers',\n (val) => ArgvParser.validateCountOption(val, '--parallel')\n )\n .option(\n '--plugin ',\n 'load a plugin (repeatable)',\n ArgvParser.collect\n )\n .option(\n '--plugin-options ',\n 'provide options for plugins (repeatable)',\n ArgvParser.mergeJson('--plugin-options')\n )\n .option('--publish', 'Publish a report to https://reports.cucumber.io')\n .option(\n '-r, --require ',\n 'require files before executing features (repeatable)',\n ArgvParser.collect\n )\n .option(\n '--require-module ',\n 'require node modules before requiring files (repeatable)',\n ArgvParser.collect\n )\n .option(\n '--retry ',\n 'specify the number of times to retry failing test cases (default: 0)',\n (val) => ArgvParser.validateCountOption(val, '--retry')\n )\n .option(\n '--retry-tag-filter ',\n `only retries the features or scenarios with tags matching the expression (repeatable).\n This option requires '--retry' to be specified.`,\n ArgvParser.mergeTags\n )\n .option(\n '--shard ',\n 'run shard INDEX of TOTAL shards. The index starts at 1'\n )\n .option('--strict', 'fail if there are pending steps')\n .option('--no-strict', 'succeed even if there are pending steps')\n .option(\n '-t, --tags ',\n 'only execute the features or scenarios with tags matching the expression (repeatable)',\n ArgvParser.mergeTags\n )\n .option(\n '--world-parameters ',\n 'provide parameters that will be passed to the world constructor (repeatable)',\n ArgvParser.mergeJson('--world-parameters')\n )\n\n program.addHelpText(\n 'afterAll',\n 'For more details please visit https://github.com/cucumber/cucumber-js/blob/main/docs/cli.md'\n )\n\n program.parse(argv)\n const {\n config,\n i18nKeywords,\n i18nLanguages,\n profile,\n ...regularStuff\n }: IRawArgvOptions = program.opts()\n const configuration: Partial = regularStuff\n if (program.args.length > 0) {\n configuration.paths = program.args\n }\n\n return {\n options: {\n config,\n i18nKeywords,\n i18nLanguages,\n profile,\n },\n configuration,\n }\n },\n}\n\nexport default ArgvParser\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/configuration/check_schema.d.ts b/node_modules/@cucumber/cucumber/lib/configuration/check_schema.d.ts new file mode 100644 index 00000000..802fd3bc --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/check_schema.d.ts @@ -0,0 +1,2 @@ +import { IConfiguration } from './types'; +export declare function checkSchema(configuration: any): Partial; diff --git a/node_modules/@cucumber/cucumber/lib/configuration/check_schema.js b/node_modules/@cucumber/cucumber/lib/configuration/check_schema.js new file mode 100644 index 00000000..e11ecb04 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/check_schema.js @@ -0,0 +1,74 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.checkSchema = checkSchema; +const yup = __importStar(require("yup")); +const gherkin_1 = require("@cucumber/gherkin"); +const schema = yup.object().shape({ + backtrace: yup.boolean(), + dryRun: yup.boolean(), + exit: yup.boolean(), + failFast: yup.boolean(), + format: yup + .array() + .of(yup.lazy((val) => Array.isArray(val) + ? yup.array().of(yup.string()).min(1).max(2) + : yup.string())), + formatOptions: yup.object(), + import: yup.array().of(yup.string()), + language: yup.string().oneOf(Object.keys(gherkin_1.dialects)), + name: yup.array().of(yup.string()), + order: yup.string().matches(/^random:.*|random|defined$/), + paths: yup.array().of(yup.string()), + parallel: yup.number().integer().min(0), + plugin: yup.array().of(yup.string().trim().required()), + pluginOptions: yup.object(), + publish: yup.boolean(), + require: yup.array().of(yup.string()), + requireModule: yup.array().of(yup.string()), + retry: yup.number().integer().min(0), + retryTagFilter: yup.string(), + strict: yup.boolean(), + tags: yup.string(), + worldParameters: yup.object(), +}); +function checkSchema(configuration) { + return schema.validateSync(configuration, { + abortEarly: false, + strict: true, + stripUnknown: true, + }); +} +//# sourceMappingURL=check_schema.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/configuration/check_schema.js.map b/node_modules/@cucumber/cucumber/lib/configuration/check_schema.js.map new file mode 100644 index 00000000..8821ecbc --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/check_schema.js.map @@ -0,0 +1 @@ +{"version":3,"file":"check_schema.js","sourceRoot":"","sources":["../../src/configuration/check_schema.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA,kCAMC;AA3CD,yCAA0B;AAC1B,+CAA4C;AAG5C,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC;IAChC,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE;IACxB,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE;IACrB,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE;IACnB,QAAQ,EAAE,GAAG,CAAC,OAAO,EAAE;IACvB,MAAM,EAAE,GAAG;SACR,KAAK,EAAE;SACP,EAAE,CACD,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CACf,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAChB,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CACjB,CACF;IACH,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE;IAC3B,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;IACpC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAQ,CAAC,CAAC;IACnD,IAAI,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;IAClC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,4BAA4B,CAAC;IACzD,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;IACnC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;IACtD,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE;IAC3B,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE;IACtB,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;IACrC,aAAa,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;IAC3C,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE;IAC5B,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE;IACrB,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE;IAClB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE;CAC9B,CAAC,CAAA;AAEF,SAAgB,WAAW,CAAC,aAAkB;IAC5C,OAAO,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE;QACxC,UAAU,EAAE,KAAK;QACjB,MAAM,EAAE,IAAI;QACZ,YAAY,EAAE,IAAI;KACnB,CAA4B,CAAA;AAC/B,CAAC","sourcesContent":["import * as yup from 'yup'\nimport { dialects } from '@cucumber/gherkin'\nimport { IConfiguration } from './types'\n\nconst schema = yup.object().shape({\n backtrace: yup.boolean(),\n dryRun: yup.boolean(),\n exit: yup.boolean(),\n failFast: yup.boolean(),\n format: yup\n .array()\n .of(\n yup.lazy((val) =>\n Array.isArray(val)\n ? yup.array().of(yup.string()).min(1).max(2)\n : yup.string()\n )\n ),\n formatOptions: yup.object(),\n import: yup.array().of(yup.string()),\n language: yup.string().oneOf(Object.keys(dialects)),\n name: yup.array().of(yup.string()),\n order: yup.string().matches(/^random:.*|random|defined$/),\n paths: yup.array().of(yup.string()),\n parallel: yup.number().integer().min(0),\n plugin: yup.array().of(yup.string().trim().required()),\n pluginOptions: yup.object(),\n publish: yup.boolean(),\n require: yup.array().of(yup.string()),\n requireModule: yup.array().of(yup.string()),\n retry: yup.number().integer().min(0),\n retryTagFilter: yup.string(),\n strict: yup.boolean(),\n tags: yup.string(),\n worldParameters: yup.object(),\n})\n\nexport function checkSchema(configuration: any): Partial {\n return schema.validateSync(configuration, {\n abortEarly: false,\n strict: true,\n stripUnknown: true,\n }) as Partial\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/configuration/default_configuration.d.ts b/node_modules/@cucumber/cucumber/lib/configuration/default_configuration.d.ts new file mode 100644 index 00000000..1f48c843 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/default_configuration.d.ts @@ -0,0 +1,2 @@ +import { IConfiguration } from './types'; +export declare const DEFAULT_CONFIGURATION: IConfiguration; diff --git a/node_modules/@cucumber/cucumber/lib/configuration/default_configuration.js b/node_modules/@cucumber/cucumber/lib/configuration/default_configuration.js new file mode 100644 index 00000000..a132da07 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/default_configuration.js @@ -0,0 +1,30 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DEFAULT_CONFIGURATION = void 0; +exports.DEFAULT_CONFIGURATION = { + backtrace: false, + dryRun: false, + forceExit: false, + failFast: false, + format: [], + formatOptions: {}, + plugin: [], + pluginOptions: {}, + import: [], + language: 'en', + loader: [], + name: [], + order: 'defined', + paths: [], + parallel: 0, + publish: false, + require: [], + requireModule: [], + retry: 0, + retryTagFilter: '', + shard: '', + strict: true, + tags: '', + worldParameters: {}, +}; +//# sourceMappingURL=default_configuration.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/configuration/default_configuration.js.map b/node_modules/@cucumber/cucumber/lib/configuration/default_configuration.js.map new file mode 100644 index 00000000..202da6d7 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/default_configuration.js.map @@ -0,0 +1 @@ +{"version":3,"file":"default_configuration.js","sourceRoot":"","sources":["../../src/configuration/default_configuration.ts"],"names":[],"mappings":";;;AAEa,QAAA,qBAAqB,GAAmB;IACnD,SAAS,EAAE,KAAK;IAChB,MAAM,EAAE,KAAK;IACb,SAAS,EAAE,KAAK;IAChB,QAAQ,EAAE,KAAK;IACf,MAAM,EAAE,EAAE;IACV,aAAa,EAAE,EAAE;IACjB,MAAM,EAAE,EAAE;IACV,aAAa,EAAE,EAAE;IACjB,MAAM,EAAE,EAAE;IACV,QAAQ,EAAE,IAAI;IACd,MAAM,EAAE,EAAE;IACV,IAAI,EAAE,EAAE;IACR,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,EAAE;IACT,QAAQ,EAAE,CAAC;IACX,OAAO,EAAE,KAAK;IACd,OAAO,EAAE,EAAE;IACX,aAAa,EAAE,EAAE;IACjB,KAAK,EAAE,CAAC;IACR,cAAc,EAAE,EAAE;IAClB,KAAK,EAAE,EAAE;IACT,MAAM,EAAE,IAAI;IACZ,IAAI,EAAE,EAAE;IACR,eAAe,EAAE,EAAE;CACpB,CAAA","sourcesContent":["import { IConfiguration } from './types'\n\nexport const DEFAULT_CONFIGURATION: IConfiguration = {\n backtrace: false,\n dryRun: false,\n forceExit: false,\n failFast: false,\n format: [],\n formatOptions: {},\n plugin: [],\n pluginOptions: {},\n import: [],\n language: 'en',\n loader: [],\n name: [],\n order: 'defined',\n paths: [],\n parallel: 0,\n publish: false,\n require: [],\n requireModule: [],\n retry: 0,\n retryTagFilter: '',\n shard: '',\n strict: true,\n tags: '',\n worldParameters: {},\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/configuration/from_file.d.ts b/node_modules/@cucumber/cucumber/lib/configuration/from_file.d.ts new file mode 100644 index 00000000..d5b3dffb --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/from_file.d.ts @@ -0,0 +1,3 @@ +import { ILogger } from '../environment'; +import { IConfiguration } from './types'; +export declare function fromFile(logger: ILogger, cwd: string, file: string, profiles?: string[]): Promise>; diff --git a/node_modules/@cucumber/cucumber/lib/configuration/from_file.js b/node_modules/@cucumber/cucumber/lib/configuration/from_file.js new file mode 100644 index 00000000..d959318c --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/from_file.js @@ -0,0 +1,131 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.fromFile = fromFile; +const node_fs_1 = __importDefault(require("node:fs")); +const node_path_1 = __importDefault(require("node:path")); +const node_util_1 = require("node:util"); +const node_url_1 = require("node:url"); +const yaml_1 = __importDefault(require("yaml")); +const merge_configurations_1 = require("./merge_configurations"); +const parse_configuration_1 = require("./parse_configuration"); +const SUPPORTED_EXTENSIONS = [ + '.json', + '.yaml', + '.yml', + '.js', + '.cjs', + '.mjs', + '.ts', + '.cts', + '.mts', +]; +async function fromFile(logger, cwd, file, profiles = []) { + let definitions = await loadFile(logger, cwd, file); + const defaultDefinition = definitions.default; + if (defaultDefinition) { + if (typeof defaultDefinition === 'function') { + logger.debug('Default function found; loading profiles'); + definitions = await handleDefaultFunctionDefinition(definitions, defaultDefinition); + } + } + else { + logger.debug('No default profile defined in configuration file'); + definitions.default = {}; + } + if (profiles.length < 1) { + logger.debug('No profiles specified; using default profile'); + profiles = ['default']; + } + const definedKeys = Object.keys(definitions); + profiles.forEach((profileKey) => { + if (!definedKeys.includes(profileKey)) { + throw new Error(`Requested profile "${profileKey}" doesn't exist`); + } + }); + return (0, merge_configurations_1.mergeConfigurations)({}, ...profiles.map((profileKey) => (0, parse_configuration_1.parseConfiguration)(logger, `Profile "${profileKey}"`, definitions[profileKey]))); +} +async function handleDefaultFunctionDefinition(definitions, defaultDefinition) { + if (Object.keys(definitions).length > 1) { + throw new Error('Invalid profiles specified: if a default function definition is provided, no other static profiles should be specified'); + } + const definitionsFromDefault = await defaultDefinition(); + return { + default: {}, + ...definitionsFromDefault, + }; +} +async function loadFile(logger, cwd, file) { + const filePath = node_path_1.default.join(cwd, file); + const extension = node_path_1.default.extname(filePath); + if (!SUPPORTED_EXTENSIONS.includes(extension)) { + throw new Error(`Unsupported configuration file extension "${extension}"`); + } + let definitions; + try { + switch (extension) { + case '.json': + definitions = JSON.parse(await (0, node_util_1.promisify)(node_fs_1.default.readFile)(filePath, { encoding: 'utf-8' })); + break; + case '.yaml': + case '.yml': + definitions = yaml_1.default.parse(await (0, node_util_1.promisify)(node_fs_1.default.readFile)(filePath, { encoding: 'utf-8' })); + break; + case '.cjs': + logger.debug(`Loading configuration file "${file}" as CommonJS based on extension`); + // eslint-disable-next-line @typescript-eslint/no-require-imports + definitions = require(filePath); + break; + case '.cts': + logger.debug(`Loading configuration file "${file}" as TypeScript based on extension`); + // eslint-disable-next-line @typescript-eslint/no-require-imports + definitions = require(filePath); + break; + case '.mjs': + logger.debug(`Loading configuration file "${file}" as ESM based on extension`); + definitions = await import((0, node_url_1.pathToFileURL)(filePath).toString()); + break; + case '.mts': + case '.ts': + logger.debug(`Loading configuration file "${file}" as TypeScript based on extension`); + definitions = await import((0, node_url_1.pathToFileURL)(filePath).toString()); + break; + case '.js': + { + const parentPackage = await readPackageJson(filePath); + if (!parentPackage) { + logger.debug(`Loading configuration file "${file}" as CommonJS based on absence of a parent package`); + // eslint-disable-next-line @typescript-eslint/no-require-imports + definitions = require(filePath); + } + else if (parentPackage.type === 'module') { + logger.debug(`Loading configuration file "${file}" as ESM based on "${parentPackage.name}" package type`); + definitions = await import((0, node_url_1.pathToFileURL)(filePath).toString()); + } + else { + logger.debug(`Loading configuration file "${file}" as CommonJS based on "${parentPackage.name}" package type`); + // eslint-disable-next-line @typescript-eslint/no-require-imports + definitions = require(filePath); + } + } + break; + } + } + catch (error) { + throw new Error(`Configuration file "${file}" failed to load/parse`, { + cause: error, + }); + } + if (typeof definitions !== 'object') { + throw new Error(`Configuration file ${filePath} does not export an object`); + } + return definitions; +} +async function readPackageJson(filePath) { + const { readPackageUp } = await import('read-package-up'); + const parentPackage = await readPackageUp({ cwd: node_path_1.default.dirname(filePath) }); + return parentPackage?.packageJson; +} +//# sourceMappingURL=from_file.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/configuration/from_file.js.map b/node_modules/@cucumber/cucumber/lib/configuration/from_file.js.map new file mode 100644 index 00000000..58e4cbe0 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/from_file.js.map @@ -0,0 +1 @@ +{"version":3,"file":"from_file.js","sourceRoot":"","sources":["../../src/configuration/from_file.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\nimport { promisify } from 'node:util'\nimport { pathToFileURL } from 'node:url'\nimport YAML from 'yaml'\nimport { ILogger } from '../environment'\nimport { IConfiguration } from './types'\nimport { mergeConfigurations } from './merge_configurations'\nimport { parseConfiguration } from './parse_configuration'\n\nconst SUPPORTED_EXTENSIONS = [\n '.json',\n '.yaml',\n '.yml',\n '.js',\n '.cjs',\n '.mjs',\n '.ts',\n '.cts',\n '.mts',\n]\n\nexport async function fromFile(\n logger: ILogger,\n cwd: string,\n file: string,\n profiles: string[] = []\n): Promise> {\n let definitions = await loadFile(logger, cwd, file)\n\n const defaultDefinition: unknown = definitions.default\n\n if (defaultDefinition) {\n if (typeof defaultDefinition === 'function') {\n logger.debug('Default function found; loading profiles')\n definitions = await handleDefaultFunctionDefinition(\n definitions,\n defaultDefinition\n )\n }\n } else {\n logger.debug('No default profile defined in configuration file')\n definitions.default = {}\n }\n\n if (profiles.length < 1) {\n logger.debug('No profiles specified; using default profile')\n profiles = ['default']\n }\n\n const definedKeys = Object.keys(definitions)\n profiles.forEach((profileKey) => {\n if (!definedKeys.includes(profileKey)) {\n throw new Error(`Requested profile \"${profileKey}\" doesn't exist`)\n }\n })\n return mergeConfigurations(\n {},\n ...profiles.map((profileKey) =>\n parseConfiguration(\n logger,\n `Profile \"${profileKey}\"`,\n definitions[profileKey]\n )\n )\n )\n}\n\nasync function handleDefaultFunctionDefinition(\n definitions: Record,\n defaultDefinition: Function\n): Promise> {\n if (Object.keys(definitions).length > 1) {\n throw new Error(\n 'Invalid profiles specified: if a default function definition is provided, no other static profiles should be specified'\n )\n }\n\n const definitionsFromDefault = await defaultDefinition()\n\n return {\n default: {},\n ...definitionsFromDefault,\n }\n}\n\nasync function loadFile(\n logger: ILogger,\n cwd: string,\n file: string\n): Promise> {\n const filePath: string = path.join(cwd, file)\n const extension = path.extname(filePath)\n if (!SUPPORTED_EXTENSIONS.includes(extension)) {\n throw new Error(`Unsupported configuration file extension \"${extension}\"`)\n }\n let definitions\n try {\n switch (extension) {\n case '.json':\n definitions = JSON.parse(\n await promisify(fs.readFile)(filePath, { encoding: 'utf-8' })\n )\n break\n case '.yaml':\n case '.yml':\n definitions = YAML.parse(\n await promisify(fs.readFile)(filePath, { encoding: 'utf-8' })\n )\n break\n case '.cjs':\n logger.debug(\n `Loading configuration file \"${file}\" as CommonJS based on extension`\n )\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n definitions = require(filePath)\n break\n case '.cts':\n logger.debug(\n `Loading configuration file \"${file}\" as TypeScript based on extension`\n )\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n definitions = require(filePath)\n break\n case '.mjs':\n logger.debug(\n `Loading configuration file \"${file}\" as ESM based on extension`\n )\n definitions = await import(pathToFileURL(filePath).toString())\n break\n case '.mts':\n case '.ts':\n logger.debug(\n `Loading configuration file \"${file}\" as TypeScript based on extension`\n )\n definitions = await import(pathToFileURL(filePath).toString())\n break\n case '.js':\n {\n const parentPackage = await readPackageJson(filePath)\n if (!parentPackage) {\n logger.debug(\n `Loading configuration file \"${file}\" as CommonJS based on absence of a parent package`\n )\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n definitions = require(filePath)\n } else if (parentPackage.type === 'module') {\n logger.debug(\n `Loading configuration file \"${file}\" as ESM based on \"${parentPackage.name}\" package type`\n )\n definitions = await import(pathToFileURL(filePath).toString())\n } else {\n logger.debug(\n `Loading configuration file \"${file}\" as CommonJS based on \"${parentPackage.name}\" package type`\n )\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n definitions = require(filePath)\n }\n }\n break\n }\n } catch (error) {\n throw new Error(`Configuration file \"${file}\" failed to load/parse`, {\n cause: error,\n })\n }\n\n if (typeof definitions !== 'object') {\n throw new Error(`Configuration file ${filePath} does not export an object`)\n }\n return definitions\n}\n\nasync function readPackageJson(filePath: string) {\n const { readPackageUp } = await import('read-package-up')\n const parentPackage = await readPackageUp({ cwd: path.dirname(filePath) })\n return parentPackage?.packageJson\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/configuration/helpers.d.ts b/node_modules/@cucumber/cucumber/lib/configuration/helpers.d.ts new file mode 100644 index 00000000..11025f1d --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/helpers.d.ts @@ -0,0 +1 @@ +export declare function isTruthyString(s: string | undefined): boolean; diff --git a/node_modules/@cucumber/cucumber/lib/configuration/helpers.js b/node_modules/@cucumber/cucumber/lib/configuration/helpers.js new file mode 100644 index 00000000..e5c9a9b2 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/helpers.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isTruthyString = isTruthyString; +function isTruthyString(s) { + if (s === undefined) { + return false; + } + return s.match(/^(false|no|0)$/i) === null; +} +//# sourceMappingURL=helpers.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/configuration/helpers.js.map b/node_modules/@cucumber/cucumber/lib/configuration/helpers.js.map new file mode 100644 index 00000000..0ecfc913 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/helpers.js.map @@ -0,0 +1 @@ +{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/configuration/helpers.ts"],"names":[],"mappings":";;AAAA,wCAKC;AALD,SAAgB,cAAc,CAAC,CAAqB;IAClD,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QACpB,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAA;AAC5C,CAAC","sourcesContent":["export function isTruthyString(s: string | undefined): boolean {\n if (s === undefined) {\n return false\n }\n return s.match(/^(false|no|0)$/i) === null\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/configuration/index.d.ts b/node_modules/@cucumber/cucumber/lib/configuration/index.d.ts new file mode 100644 index 00000000..ed3f906f --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/index.d.ts @@ -0,0 +1,9 @@ +export { default as ArgvParser } from './argv_parser'; +export * from './default_configuration'; +export * from './from_file'; +export * from './helpers'; +export * from './merge_configurations'; +export * from './parse_configuration'; +export * from './split_format_descriptor'; +export * from './types'; +export * from './validate_configuration'; diff --git a/node_modules/@cucumber/cucumber/lib/configuration/index.js b/node_modules/@cucumber/cucumber/lib/configuration/index.js new file mode 100644 index 00000000..70efb0e4 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/index.js @@ -0,0 +1,31 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ArgvParser = void 0; +var argv_parser_1 = require("./argv_parser"); +Object.defineProperty(exports, "ArgvParser", { enumerable: true, get: function () { return __importDefault(argv_parser_1).default; } }); +__exportStar(require("./default_configuration"), exports); +__exportStar(require("./from_file"), exports); +__exportStar(require("./helpers"), exports); +__exportStar(require("./merge_configurations"), exports); +__exportStar(require("./parse_configuration"), exports); +__exportStar(require("./split_format_descriptor"), exports); +__exportStar(require("./types"), exports); +__exportStar(require("./validate_configuration"), exports); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/configuration/index.js.map b/node_modules/@cucumber/cucumber/lib/configuration/index.js.map new file mode 100644 index 00000000..c83b9751 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/configuration/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,6CAAqD;AAA5C,0HAAA,OAAO,OAAc;AAC9B,0DAAuC;AACvC,8CAA2B;AAC3B,4CAAyB;AACzB,yDAAsC;AACtC,wDAAqC;AACrC,4DAAyC;AACzC,0CAAuB;AACvB,2DAAwC","sourcesContent":["export { default as ArgvParser } from './argv_parser'\nexport * from './default_configuration'\nexport * from './from_file'\nexport * from './helpers'\nexport * from './merge_configurations'\nexport * from './parse_configuration'\nexport * from './split_format_descriptor'\nexport * from './types'\nexport * from './validate_configuration'\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/configuration/locate_file.d.ts b/node_modules/@cucumber/cucumber/lib/configuration/locate_file.d.ts new file mode 100644 index 00000000..b1b9e69e --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/locate_file.d.ts @@ -0,0 +1 @@ +export declare function locateFile(cwd: string): string | undefined; diff --git a/node_modules/@cucumber/cucumber/lib/configuration/locate_file.js b/node_modules/@cucumber/cucumber/lib/configuration/locate_file.js new file mode 100644 index 00000000..5f29cca5 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/locate_file.js @@ -0,0 +1,20 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.locateFile = locateFile; +const node_path_1 = __importDefault(require("node:path")); +const fs_1 = __importDefault(require("mz/fs")); +const DEFAULT_FILENAMES = [ + 'cucumber.js', + 'cucumber.cjs', + 'cucumber.mjs', + 'cucumber.json', + 'cucumber.yaml', + 'cucumber.yml', +]; +function locateFile(cwd) { + return DEFAULT_FILENAMES.find((filename) => fs_1.default.existsSync(node_path_1.default.join(cwd, filename))); +} +//# sourceMappingURL=locate_file.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/configuration/locate_file.js.map b/node_modules/@cucumber/cucumber/lib/configuration/locate_file.js.map new file mode 100644 index 00000000..b418b803 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/locate_file.js.map @@ -0,0 +1 @@ +{"version":3,"file":"locate_file.js","sourceRoot":"","sources":["../../src/configuration/locate_file.ts"],"names":[],"mappings":";;;;;AAYA,gCAIC;AAhBD,0DAA4B;AAC5B,+CAAsB;AAEtB,MAAM,iBAAiB,GAAG;IACxB,aAAa;IACb,cAAc;IACd,cAAc;IACd,eAAe;IACf,eAAe;IACf,cAAc;CACf,CAAA;AAED,SAAgB,UAAU,CAAC,GAAW;IACpC,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CACzC,YAAE,CAAC,UAAU,CAAC,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CACxC,CAAA;AACH,CAAC","sourcesContent":["import path from 'node:path'\nimport fs from 'mz/fs'\n\nconst DEFAULT_FILENAMES = [\n 'cucumber.js',\n 'cucumber.cjs',\n 'cucumber.mjs',\n 'cucumber.json',\n 'cucumber.yaml',\n 'cucumber.yml',\n]\n\nexport function locateFile(cwd: string): string | undefined {\n return DEFAULT_FILENAMES.find((filename) =>\n fs.existsSync(path.join(cwd, filename))\n )\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/configuration/merge_configurations.d.ts b/node_modules/@cucumber/cucumber/lib/configuration/merge_configurations.d.ts new file mode 100644 index 00000000..94558fdb --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/merge_configurations.d.ts @@ -0,0 +1,2 @@ +import { IConfiguration } from './types'; +export declare function mergeConfigurations>(source: T, ...configurations: Partial[]): T; diff --git a/node_modules/@cucumber/cucumber/lib/configuration/merge_configurations.js b/node_modules/@cucumber/cucumber/lib/configuration/merge_configurations.js new file mode 100644 index 00000000..a9aad013 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/merge_configurations.js @@ -0,0 +1,48 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.mergeConfigurations = mergeConfigurations; +const lodash_mergewith_1 = __importDefault(require("lodash.mergewith")); +const ADDITIVE_ARRAYS = [ + 'format', + 'import', + 'loader', + 'name', + 'paths', + 'require', + 'requireModule', +]; +const TAG_EXPRESSIONS = ['tags', 'retryTagFilter']; +function mergeArrays(objValue, srcValue) { + if (objValue && srcValue) { + return [].concat(objValue, srcValue); + } + return undefined; +} +function mergeTagExpressions(objValue, srcValue) { + if (objValue && srcValue) { + return `${wrapTagExpression(objValue)} and ${wrapTagExpression(srcValue)}`; + } + return undefined; +} +function wrapTagExpression(raw) { + if (raw.startsWith('(') && raw.endsWith(')')) { + return raw; + } + return `(${raw})`; +} +function customizer(objValue, srcValue, key) { + if (ADDITIVE_ARRAYS.includes(key)) { + return mergeArrays(objValue, srcValue); + } + if (TAG_EXPRESSIONS.includes(key)) { + return mergeTagExpressions(objValue, srcValue); + } + return undefined; +} +function mergeConfigurations(source, ...configurations) { + return (0, lodash_mergewith_1.default)({}, source, ...configurations, customizer); +} +//# sourceMappingURL=merge_configurations.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/configuration/merge_configurations.js.map b/node_modules/@cucumber/cucumber/lib/configuration/merge_configurations.js.map new file mode 100644 index 00000000..5c5dc020 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/merge_configurations.js.map @@ -0,0 +1 @@ +{"version":3,"file":"merge_configurations.js","sourceRoot":"","sources":["../../src/configuration/merge_configurations.ts"],"names":[],"mappings":";;;;;AA6CA,kDAKC;AAlDD,wEAAwC;AAGxC,MAAM,eAAe,GAAG;IACtB,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,OAAO;IACP,SAAS;IACT,eAAe;CAChB,CAAA;AACD,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;AAElD,SAAS,WAAW,CAAC,QAAe,EAAE,QAAe;IACnD,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAAC;QACzB,OAAO,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IACtC,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAgB,EAAE,QAAgB;IAC7D,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAAC;QACzB,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAA;IAC5E,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7C,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,OAAO,IAAI,GAAG,GAAG,CAAA;AACnB,CAAC;AAED,SAAS,UAAU,CAAC,QAAa,EAAE,QAAa,EAAE,GAAW;IAC3D,IAAI,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IACxC,CAAC;IACD,IAAI,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IAChD,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAgB,mBAAmB,CACjC,MAAS,EACT,GAAG,cAAyC;IAE5C,OAAO,IAAA,0BAAS,EAAC,EAAE,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,UAAU,CAAC,CAAA;AAC7D,CAAC","sourcesContent":["import mergeWith from 'lodash.mergewith'\nimport { IConfiguration } from './types'\n\nconst ADDITIVE_ARRAYS = [\n 'format',\n 'import',\n 'loader',\n 'name',\n 'paths',\n 'require',\n 'requireModule',\n]\nconst TAG_EXPRESSIONS = ['tags', 'retryTagFilter']\n\nfunction mergeArrays(objValue: any[], srcValue: any[]) {\n if (objValue && srcValue) {\n return [].concat(objValue, srcValue)\n }\n return undefined\n}\n\nfunction mergeTagExpressions(objValue: string, srcValue: string) {\n if (objValue && srcValue) {\n return `${wrapTagExpression(objValue)} and ${wrapTagExpression(srcValue)}`\n }\n return undefined\n}\n\nfunction wrapTagExpression(raw: string) {\n if (raw.startsWith('(') && raw.endsWith(')')) {\n return raw\n }\n return `(${raw})`\n}\n\nfunction customizer(objValue: any, srcValue: any, key: string): any {\n if (ADDITIVE_ARRAYS.includes(key)) {\n return mergeArrays(objValue, srcValue)\n }\n if (TAG_EXPRESSIONS.includes(key)) {\n return mergeTagExpressions(objValue, srcValue)\n }\n return undefined\n}\n\nexport function mergeConfigurations>(\n source: T,\n ...configurations: Partial[]\n): T {\n return mergeWith({}, source, ...configurations, customizer)\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/configuration/parse_configuration.d.ts b/node_modules/@cucumber/cucumber/lib/configuration/parse_configuration.d.ts new file mode 100644 index 00000000..3b6b7a91 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/parse_configuration.d.ts @@ -0,0 +1,3 @@ +import { ILogger } from '../environment'; +import { IConfiguration } from './types'; +export declare function parseConfiguration(logger: ILogger, source: string, definition: Partial | string[] | string | undefined): Partial; diff --git a/node_modules/@cucumber/cucumber/lib/configuration/parse_configuration.js b/node_modules/@cucumber/cucumber/lib/configuration/parse_configuration.js new file mode 100644 index 00000000..10f3b430 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/parse_configuration.js @@ -0,0 +1,39 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseConfiguration = parseConfiguration; +const string_argv_1 = __importDefault(require("string-argv")); +const argv_parser_1 = __importDefault(require("./argv_parser")); +const check_schema_1 = require("./check_schema"); +function parseConfiguration(logger, source, definition) { + if (!definition) { + return {}; + } + if (Array.isArray(definition)) { + logger.debug(`${source} configuration value is an array; parsing as argv`); + const { configuration } = argv_parser_1.default.parse([ + 'node', + 'cucumber-js', + ...definition, + ]); + return configuration; + } + if (typeof definition === 'string') { + logger.debug(`${source} configuration value is a string; parsing as argv`); + const { configuration } = argv_parser_1.default.parse([ + 'node', + 'cucumber-js', + ...(0, string_argv_1.default)(definition), + ]); + return configuration; + } + try { + return (0, check_schema_1.checkSchema)(definition); + } + catch (error) { + throw new Error(`${source} configuration value failed schema validation: ${error.errors.join(' ')}`); + } +} +//# sourceMappingURL=parse_configuration.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/configuration/parse_configuration.js.map b/node_modules/@cucumber/cucumber/lib/configuration/parse_configuration.js.map new file mode 100644 index 00000000..c0691203 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/parse_configuration.js.map @@ -0,0 +1 @@ +{"version":3,"file":"parse_configuration.js","sourceRoot":"","sources":["../../src/configuration/parse_configuration.ts"],"names":[],"mappings":";;;;;AAMA,gDAmCC;AAzCD,8DAAoC;AAGpC,gEAAsC;AACtC,iDAA4C;AAE5C,SAAgB,kBAAkB,CAChC,MAAe,EACf,MAAc,EACd,UAAmE;IAEnE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,CAAA;IACX,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,mDAAmD,CAAC,CAAA;QAC1E,MAAM,EAAE,aAAa,EAAE,GAAG,qBAAU,CAAC,KAAK,CAAC;YACzC,MAAM;YACN,aAAa;YACb,GAAG,UAAU;SACd,CAAC,CAAA;QACF,OAAO,aAAa,CAAA;IACtB,CAAC;IACD,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,mDAAmD,CAAC,CAAA;QAC1E,MAAM,EAAE,aAAa,EAAE,GAAG,qBAAU,CAAC,KAAK,CAAC;YACzC,MAAM;YACN,aAAa;YACb,GAAG,IAAA,qBAAU,EAAC,UAAU,CAAC;SAC1B,CAAC,CAAA;QACF,OAAO,aAAa,CAAA;IACtB,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAA,0BAAW,EAAC,UAAU,CAAC,CAAA;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,GAAG,MAAM,kDAAkD,KAAK,CAAC,MAAM,CAAC,IAAI,CAC1E,GAAG,CACJ,EAAE,CACJ,CAAA;IACH,CAAC;AACH,CAAC","sourcesContent":["import stringArgv from 'string-argv'\nimport { ILogger } from '../environment'\nimport { IConfiguration } from './types'\nimport ArgvParser from './argv_parser'\nimport { checkSchema } from './check_schema'\n\nexport function parseConfiguration(\n logger: ILogger,\n source: string,\n definition: Partial | string[] | string | undefined\n): Partial {\n if (!definition) {\n return {}\n }\n if (Array.isArray(definition)) {\n logger.debug(`${source} configuration value is an array; parsing as argv`)\n const { configuration } = ArgvParser.parse([\n 'node',\n 'cucumber-js',\n ...definition,\n ])\n return configuration\n }\n if (typeof definition === 'string') {\n logger.debug(`${source} configuration value is a string; parsing as argv`)\n const { configuration } = ArgvParser.parse([\n 'node',\n 'cucumber-js',\n ...stringArgv(definition),\n ])\n return configuration\n }\n try {\n return checkSchema(definition)\n } catch (error) {\n throw new Error(\n `${source} configuration value failed schema validation: ${error.errors.join(\n ' '\n )}`\n )\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/configuration/split_format_descriptor.d.ts b/node_modules/@cucumber/cucumber/lib/configuration/split_format_descriptor.d.ts new file mode 100644 index 00000000..52d8e4fc --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/split_format_descriptor.d.ts @@ -0,0 +1,2 @@ +import { ILogger } from '../environment'; +export declare function splitFormatDescriptor(logger: ILogger, option: string): string[]; diff --git a/node_modules/@cucumber/cucumber/lib/configuration/split_format_descriptor.js b/node_modules/@cucumber/cucumber/lib/configuration/split_format_descriptor.js new file mode 100644 index 00000000..53005cd5 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/split_format_descriptor.js @@ -0,0 +1,75 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.splitFormatDescriptor = splitFormatDescriptor; +function splitFormatDescriptor(logger, option) { + const doWarning = (result) => { + let expected = `"${result[0]}"`; + if (result[1]) { + expected += `:"${result[1]}"`; + } + logger.warn(`Each part of a user-specified format should be quoted; see https://github.com/cucumber/cucumber-js/blob/main/docs/deprecations.md#ambiguous-colons-in-formats +Change to ${expected}`); + }; + let result; + let match1, match2; + // "foo":"bar" or "foo":bar + if ((match1 = option.match(/^"([^"]*)":(.*)$/)) !== null) { + // "foo":"bar" + if ((match2 = match1[2].match(/^"([^"]*)"$/)) !== null) { + result = [match1[1], match2[1]]; + } + // "foo":bar + else { + result = [match1[1], match1[2]]; + if (result[1].includes(':')) { + doWarning(result); + } + } + } + // foo:"bar" + else if ((match1 = option.match(/^(.*):"([^"]*)"$/)) !== null) { + result = [match1[1], match1[2]]; + if (result[0].includes(':')) { + doWarning(result); + } + } + // "foo" + else if ((match1 = option.match(/^"([^"]*)"$/)) !== null) { + result = [match1[1], '']; + } + // file://foo or file:///foo or file://C:/foo or file://C:\foo or file:///C:/foo or file:///C:\foo + else if ((match1 = option.match(/^(file:\/{2,3}(?:[a-zA-Z]:[/\\])?)(.*)$/)) !== null) { + // file://foo:bar + if ((match2 = match1[2].match(/^([^:]*):(.*)$/)) !== null) { + result = [match1[1] + match2[1], match2[2]]; + } + else { + result = [option, '']; + } + doWarning(result); + } + // C:\foo or C:/foo + else if ((match1 = option.match(/^([a-zA-Z]:[/\\])(.*)$/)) !== null) { + // C:\foo:bar or C:/foo:bar + if ((match2 = match1[2].match(/^([^:]*):(.*)$/)) !== null) { + result = [match1[1] + match2[1], match2[2]]; + } + else { + result = [option, '']; + } + doWarning(result); + } + // foo:bar + else if ((match1 = option.match(/^([^:]*):(.*)$/)) !== null) { + result = [match1[1], match1[2]]; + if (option.split(':').length > 2) { + doWarning(result); + } + } + // foo + else { + result = [option, '']; + } + return result; +} +//# sourceMappingURL=split_format_descriptor.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/configuration/split_format_descriptor.js.map b/node_modules/@cucumber/cucumber/lib/configuration/split_format_descriptor.js.map new file mode 100644 index 00000000..f41fc7e3 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/split_format_descriptor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"split_format_descriptor.js","sourceRoot":"","sources":["../../src/configuration/split_format_descriptor.ts"],"names":[],"mappings":"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","sourcesContent":["import { ILogger } from '../environment'\n\nexport function splitFormatDescriptor(\n logger: ILogger,\n option: string\n): string[] {\n const doWarning = (result: string[]) => {\n let expected = `\"${result[0]}\"`\n if (result[1]) {\n expected += `:\"${result[1]}\"`\n }\n logger.warn(\n `Each part of a user-specified format should be quoted; see https://github.com/cucumber/cucumber-js/blob/main/docs/deprecations.md#ambiguous-colons-in-formats\nChange to ${expected}`\n )\n }\n let result: string[]\n let match1, match2\n\n // \"foo\":\"bar\" or \"foo\":bar\n if ((match1 = option.match(/^\"([^\"]*)\":(.*)$/)) !== null) {\n // \"foo\":\"bar\"\n if ((match2 = match1[2].match(/^\"([^\"]*)\"$/)) !== null) {\n result = [match1[1], match2[1]]\n }\n // \"foo\":bar\n else {\n result = [match1[1], match1[2]]\n if (result[1].includes(':')) {\n doWarning(result)\n }\n }\n }\n // foo:\"bar\"\n else if ((match1 = option.match(/^(.*):\"([^\"]*)\"$/)) !== null) {\n result = [match1[1], match1[2]]\n if (result[0].includes(':')) {\n doWarning(result)\n }\n }\n // \"foo\"\n else if ((match1 = option.match(/^\"([^\"]*)\"$/)) !== null) {\n result = [match1[1], '']\n }\n // file://foo or file:///foo or file://C:/foo or file://C:\\foo or file:///C:/foo or file:///C:\\foo\n else if (\n (match1 = option.match(/^(file:\\/{2,3}(?:[a-zA-Z]:[/\\\\])?)(.*)$/)) !== null\n ) {\n // file://foo:bar\n if ((match2 = match1[2].match(/^([^:]*):(.*)$/)) !== null) {\n result = [match1[1] + match2[1], match2[2]]\n } else {\n result = [option, '']\n }\n doWarning(result)\n }\n // C:\\foo or C:/foo\n else if ((match1 = option.match(/^([a-zA-Z]:[/\\\\])(.*)$/)) !== null) {\n // C:\\foo:bar or C:/foo:bar\n if ((match2 = match1[2].match(/^([^:]*):(.*)$/)) !== null) {\n result = [match1[1] + match2[1], match2[2]]\n } else {\n result = [option, '']\n }\n doWarning(result)\n }\n // foo:bar\n else if ((match1 = option.match(/^([^:]*):(.*)$/)) !== null) {\n result = [match1[1], match1[2]]\n if (option.split(':').length > 2) {\n doWarning(result)\n }\n }\n // foo\n else {\n result = [option, '']\n }\n\n return result\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/configuration/types.d.ts b/node_modules/@cucumber/cucumber/lib/configuration/types.d.ts new file mode 100644 index 00000000..08848007 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/types.d.ts @@ -0,0 +1,177 @@ +import { JsonObject } from 'type-fest'; +import { IPickleOrder } from '../filter'; +/** + * User-defined configuration + * + * @public + */ +export interface IConfiguration { + /** + * Paths to where your feature files are + * @default [] + * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/configuration.md#finding-your-features} + */ + paths: string[]; + /** + * Show the full backtrace for errors + * @default false + */ + backtrace: boolean; + /** + * Perform a dry run, where a test run is prepared but nothing is executed + * @default false + * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/dry_run.md} + */ + dryRun: boolean; + /** + * Explicitly call `process.exit()` after the test run + * @default false + * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/cli.md#exiting} + * @remarks + * This option is only used by the CLI. + */ + forceExit: boolean; + /** + * Stop running tests when a test fails + * @default false + * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/fail_fast.md} + */ + failFast: boolean; + /** + * Name/path and (optionally) output file path of each formatter to use + * + * @example + * [ + * "\@cucumber/pretty-formatter", + * ["html", "./reports/cucumber.html"], + * ["./custom-formatter.js", "./reports/custom.txt"] + * ] + * @default [] + * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/formatters.md} + * @remarks + * Each item has one or two values. The first (required) identifies the + * formatter to be used. The second (optional) specifies where the output + * should be written. + */ + format: Array; + /** + * Options to be provided to formatters + * @default \{\} + * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/formatters.md#options} + * @remarks + * The value must be a JSON-serializable object. + */ + formatOptions: JsonObject; + /** + * Name/path of each plugin to use + * + * @example + * [ + * "\@cucumber/my-plugin", + * "./custom-plugin.js" + * ] + * @default [] + * @remarks + * Each item is a module specifier for a plugin to be loaded. + */ + plugin: string[]; + /** + * Options to be provided to plugins + * @default \{\} + * @remarks + * The value must be a JSON-serializable object. + */ + pluginOptions: JsonObject; + /** + * Paths to where your support code is + * @default [] + * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/configuration.md#finding-your-code} + */ + import: string[]; + /** + * Default language for your feature files + * @default "en" + */ + language: string; + /** + * Module specifier(s) for loaders to be registered ahead of loading support code + * @default [] + */ + loader: string[]; + /** + * Regular expressions of which scenario names should match one of to be run + * @default [] + * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/filtering.md#names} + */ + name: string[]; + /** + * Run in the order defined, or in a random order + * @default "defined" + * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/filtering.md#order} + */ + order: IPickleOrder; + /** + * Run tests in parallel with the given number of worker processes + * @default 0 + * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/parallel.md} + */ + parallel: number; + /** + * Shard tests and execute only the selected shard, format `/` + * @default "" + */ + shard: string; + /** + * Publish a report of your test run to https://reports.cucumber.io/ + * @default false + */ + publish: boolean; + /** + * Paths to where your support code is, for CommonJS + * @default [] + * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/configuration.md#finding-your-code} + */ + require: string[]; + /** + * Names of transpilation modules to load, via `require()` + * @default [] + * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/transpiling.md} + */ + requireModule: string[]; + /** + * Retry failing tests up to the given number of times + * @default 0 + * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/retry.md} + */ + retry: number; + /** + * Tag expression to filter which scenarios can be retried + * @default "" + * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/retry.md} + */ + retryTagFilter: string; + /** + * Fail the test run if there are pending steps + * @default true + */ + strict: boolean; + /** + * Tag expression to filter which scenarios should be run + * @default "" + * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/filtering.md#tags} + */ + tags: string; + /** + * Parameters to be passed to your World + * @default \{\} + * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/support_files/world.md} + * @remarks + * The value must be a JSON-serializable object. + */ + worldParameters: JsonObject; +} +/** + * Collection of named configuration profiles + * @public + */ +export type IProfiles = Record>; diff --git a/node_modules/@cucumber/cucumber/lib/configuration/types.js b/node_modules/@cucumber/cucumber/lib/configuration/types.js new file mode 100644 index 00000000..11e638d1 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/types.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/configuration/types.js.map b/node_modules/@cucumber/cucumber/lib/configuration/types.js.map new file mode 100644 index 00000000..97564fb1 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/configuration/types.ts"],"names":[],"mappings":"","sourcesContent":["import { JsonObject } from 'type-fest'\nimport { IPickleOrder } from '../filter'\n\n/**\n * User-defined configuration\n *\n * @public\n */\nexport interface IConfiguration {\n /**\n * Paths to where your feature files are\n * @default []\n * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/configuration.md#finding-your-features}\n */\n paths: string[]\n /**\n * Show the full backtrace for errors\n * @default false\n */\n backtrace: boolean\n /**\n * Perform a dry run, where a test run is prepared but nothing is executed\n * @default false\n * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/dry_run.md}\n */\n dryRun: boolean\n /**\n * Explicitly call `process.exit()` after the test run\n * @default false\n * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/cli.md#exiting}\n * @remarks\n * This option is only used by the CLI.\n */\n forceExit: boolean\n /**\n * Stop running tests when a test fails\n * @default false\n * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/fail_fast.md}\n */\n failFast: boolean\n /**\n * Name/path and (optionally) output file path of each formatter to use\n *\n * @example\n * [\n * \"\\@cucumber/pretty-formatter\",\n * [\"html\", \"./reports/cucumber.html\"],\n * [\"./custom-formatter.js\", \"./reports/custom.txt\"]\n * ]\n * @default []\n * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/formatters.md}\n * @remarks\n * Each item has one or two values. The first (required) identifies the\n * formatter to be used. The second (optional) specifies where the output\n * should be written.\n */\n format: Array\n /**\n * Options to be provided to formatters\n * @default \\{\\}\n * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/formatters.md#options}\n * @remarks\n * The value must be a JSON-serializable object.\n */\n formatOptions: JsonObject\n /**\n * Name/path of each plugin to use\n *\n * @example\n * [\n * \"\\@cucumber/my-plugin\",\n * \"./custom-plugin.js\"\n * ]\n * @default []\n * @remarks\n * Each item is a module specifier for a plugin to be loaded.\n */\n plugin: string[]\n /**\n * Options to be provided to plugins\n * @default \\{\\}\n * @remarks\n * The value must be a JSON-serializable object.\n */\n pluginOptions: JsonObject\n /**\n * Paths to where your support code is\n * @default []\n * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/configuration.md#finding-your-code}\n */\n import: string[]\n /**\n * Default language for your feature files\n * @default \"en\"\n */\n language: string\n /**\n * Module specifier(s) for loaders to be registered ahead of loading support code\n * @default []\n */\n loader: string[]\n /**\n * Regular expressions of which scenario names should match one of to be run\n * @default []\n * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/filtering.md#names}\n */\n name: string[]\n /**\n * Run in the order defined, or in a random order\n * @default \"defined\"\n * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/filtering.md#order}\n */\n order: IPickleOrder\n /**\n * Run tests in parallel with the given number of worker processes\n * @default 0\n * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/parallel.md}\n */\n parallel: number\n /**\n * Shard tests and execute only the selected shard, format `/`\n * @default \"\"\n */\n shard: string\n /**\n * Publish a report of your test run to https://reports.cucumber.io/\n * @default false\n */\n publish: boolean\n /**\n * Paths to where your support code is, for CommonJS\n * @default []\n * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/configuration.md#finding-your-code}\n */\n require: string[]\n /**\n * Names of transpilation modules to load, via `require()`\n * @default []\n * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/transpiling.md}\n */\n requireModule: string[]\n /**\n * Retry failing tests up to the given number of times\n * @default 0\n * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/retry.md}\n */\n retry: number\n /**\n * Tag expression to filter which scenarios can be retried\n * @default \"\"\n * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/retry.md}\n */\n retryTagFilter: string\n /**\n * Fail the test run if there are pending steps\n * @default true\n */\n strict: boolean\n /**\n * Tag expression to filter which scenarios should be run\n * @default \"\"\n * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/filtering.md#tags}\n */\n tags: string\n /**\n * Parameters to be passed to your World\n * @default \\{\\}\n * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/support_files/world.md}\n * @remarks\n * The value must be a JSON-serializable object.\n */\n worldParameters: JsonObject\n}\n\n/**\n * Collection of named configuration profiles\n * @public\n */\nexport type IProfiles = Record>\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/configuration/validate_configuration.d.ts b/node_modules/@cucumber/cucumber/lib/configuration/validate_configuration.d.ts new file mode 100644 index 00000000..c3bbb7ca --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/validate_configuration.d.ts @@ -0,0 +1,3 @@ +import { ILogger } from '../environment'; +import { IConfiguration } from './types'; +export declare function validateConfiguration(configuration: IConfiguration, logger: ILogger): void; diff --git a/node_modules/@cucumber/cucumber/lib/configuration/validate_configuration.js b/node_modules/@cucumber/cucumber/lib/configuration/validate_configuration.js new file mode 100644 index 00000000..29554ce7 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/validate_configuration.js @@ -0,0 +1,23 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.validateConfiguration = validateConfiguration; +function validateConfiguration(configuration, logger) { + if (configuration.requireModule.length && !configuration.require.length) { + logger.warn('Use of `require-module` option normally means you should specify your support code paths with `require`; see https://github.com/cucumber/cucumber-js/blob/main/docs/configuration.md#finding-your-code'); + } + if (configuration.loader.length && !configuration.import.length) { + logger.warn('Use of `loader` option normally means you should specify your support code paths with `import`; see https://github.com/cucumber/cucumber-js/blob/main/docs/configuration.md#finding-your-code'); + } + if (configuration.formatOptions.colorsEnabled !== undefined) { + logger.warn(`The 'colorsEnabled' format option is deprecated and will be removed in a future major version. ` + + `Use the FORCE_COLOR environment variable instead (FORCE_COLOR=1 to enable, FORCE_COLOR=0 to disable); ` + + `see https://github.com/cucumber/cucumber-js/blob/main/docs/deprecations.md`); + } + if (configuration.retryTagFilter && !configuration.retry) { + throw new Error('a positive `retry` count must be specified when setting `retryTagFilter`'); + } + if (configuration.shard && !/^\d+\/\d+$/.test(configuration.shard)) { + throw new Error('the shard option must be in the format / (e.g. 1/3)'); + } +} +//# sourceMappingURL=validate_configuration.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/configuration/validate_configuration.js.map b/node_modules/@cucumber/cucumber/lib/configuration/validate_configuration.js.map new file mode 100644 index 00000000..c5800afc --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/configuration/validate_configuration.js.map @@ -0,0 +1 @@ +{"version":3,"file":"validate_configuration.js","sourceRoot":"","sources":["../../src/configuration/validate_configuration.ts"],"names":[],"mappings":";;AAGA,sDA+BC;AA/BD,SAAgB,qBAAqB,CACnC,aAA6B,EAC7B,MAAe;IAEf,IAAI,aAAa,CAAC,aAAa,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACxE,MAAM,CAAC,IAAI,CACT,wMAAwM,CACzM,CAAA;IACH,CAAC;IACD,IAAI,aAAa,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAChE,MAAM,CAAC,IAAI,CACT,+LAA+L,CAChM,CAAA;IACH,CAAC;IACD,IAAI,aAAa,CAAC,aAAa,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QAC5D,MAAM,CAAC,IAAI,CACT,iGAAiG;YAC/F,wGAAwG;YACxG,4EAA4E,CAC/E,CAAA;IACH,CAAC;IACD,IAAI,aAAa,CAAC,cAAc,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CACb,0EAA0E,CAC3E,CAAA;IACH,CAAC;IACD,IAAI,aAAa,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAA;IACH,CAAC;AACH,CAAC","sourcesContent":["import { ILogger } from '../environment'\nimport { IConfiguration } from './types'\n\nexport function validateConfiguration(\n configuration: IConfiguration,\n logger: ILogger\n): void {\n if (configuration.requireModule.length && !configuration.require.length) {\n logger.warn(\n 'Use of `require-module` option normally means you should specify your support code paths with `require`; see https://github.com/cucumber/cucumber-js/blob/main/docs/configuration.md#finding-your-code'\n )\n }\n if (configuration.loader.length && !configuration.import.length) {\n logger.warn(\n 'Use of `loader` option normally means you should specify your support code paths with `import`; see https://github.com/cucumber/cucumber-js/blob/main/docs/configuration.md#finding-your-code'\n )\n }\n if (configuration.formatOptions.colorsEnabled !== undefined) {\n logger.warn(\n `The 'colorsEnabled' format option is deprecated and will be removed in a future major version. ` +\n `Use the FORCE_COLOR environment variable instead (FORCE_COLOR=1 to enable, FORCE_COLOR=0 to disable); ` +\n `see https://github.com/cucumber/cucumber-js/blob/main/docs/deprecations.md`\n )\n }\n if (configuration.retryTagFilter && !configuration.retry) {\n throw new Error(\n 'a positive `retry` count must be specified when setting `retryTagFilter`'\n )\n }\n if (configuration.shard && !/^\\d+\\/\\d+$/.test(configuration.shard)) {\n throw new Error(\n 'the shard option must be in the format / (e.g. 1/3)'\n )\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/environment/console_logger.d.ts b/node_modules/@cucumber/cucumber/lib/environment/console_logger.d.ts new file mode 100644 index 00000000..203f7606 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/environment/console_logger.d.ts @@ -0,0 +1,12 @@ +import { Writable } from 'node:stream'; +import { ILogger } from './types'; +export declare class ConsoleLogger implements ILogger { + private stream; + private debugEnabled; + private readonly console; + constructor(stream: Writable, debugEnabled: boolean); + debug(message?: any, ...optionalParams: any[]): void; + error(message?: any, ...optionalParams: any[]): void; + warn(message?: any, ...optionalParams: any[]): void; + info(message?: any, ...optionalParams: any[]): void; +} diff --git a/node_modules/@cucumber/cucumber/lib/environment/console_logger.js b/node_modules/@cucumber/cucumber/lib/environment/console_logger.js new file mode 100644 index 00000000..77ba893a --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/environment/console_logger.js @@ -0,0 +1,30 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ConsoleLogger = void 0; +const node_console_1 = require("node:console"); +class ConsoleLogger { + stream; + debugEnabled; + console; + constructor(stream, debugEnabled) { + this.stream = stream; + this.debugEnabled = debugEnabled; + this.console = new node_console_1.Console(this.stream); + } + debug(message, ...optionalParams) { + if (this.debugEnabled) { + this.console.debug(message, ...optionalParams); + } + } + error(message, ...optionalParams) { + this.console.error(message, ...optionalParams); + } + warn(message, ...optionalParams) { + this.console.warn(message, ...optionalParams); + } + info(message, ...optionalParams) { + this.console.info(message, ...optionalParams); + } +} +exports.ConsoleLogger = ConsoleLogger; +//# sourceMappingURL=console_logger.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/environment/console_logger.js.map b/node_modules/@cucumber/cucumber/lib/environment/console_logger.js.map new file mode 100644 index 00000000..3f4f6234 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/environment/console_logger.js.map @@ -0,0 +1 @@ +{"version":3,"file":"console_logger.js","sourceRoot":"","sources":["../../src/environment/console_logger.ts"],"names":[],"mappings":";;;AAAA,+CAAsC;AAItC,MAAa,aAAa;IAId;IACA;IAJO,OAAO,CAAS;IAEjC,YACU,MAAgB,EAChB,YAAqB;QADrB,WAAM,GAAN,MAAM,CAAU;QAChB,iBAAY,GAAZ,YAAY,CAAS;QAE7B,IAAI,CAAC,OAAO,GAAG,IAAI,sBAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACzC,CAAC;IAED,KAAK,CAAC,OAAa,EAAE,GAAG,cAAqB;QAC3C,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,cAAc,CAAC,CAAA;QAChD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAa,EAAE,GAAG,cAAqB;QAC3C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,cAAc,CAAC,CAAA;IAChD,CAAC;IAED,IAAI,CAAC,OAAa,EAAE,GAAG,cAAqB;QAC1C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,cAAc,CAAC,CAAA;IAC/C,CAAC;IAED,IAAI,CAAC,OAAa,EAAE,GAAG,cAAqB;QAC1C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,cAAc,CAAC,CAAA;IAC/C,CAAC;CACF;AA3BD,sCA2BC","sourcesContent":["import { Console } from 'node:console'\nimport { Writable } from 'node:stream'\nimport { ILogger } from './types'\n\nexport class ConsoleLogger implements ILogger {\n private readonly console: Console\n\n constructor(\n private stream: Writable,\n private debugEnabled: boolean\n ) {\n this.console = new Console(this.stream)\n }\n\n debug(message?: any, ...optionalParams: any[]): void {\n if (this.debugEnabled) {\n this.console.debug(message, ...optionalParams)\n }\n }\n\n error(message?: any, ...optionalParams: any[]): void {\n this.console.error(message, ...optionalParams)\n }\n\n warn(message?: any, ...optionalParams: any[]): void {\n this.console.warn(message, ...optionalParams)\n }\n\n info(message?: any, ...optionalParams: any[]): void {\n this.console.info(message, ...optionalParams)\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/environment/index.d.ts b/node_modules/@cucumber/cucumber/lib/environment/index.d.ts new file mode 100644 index 00000000..006f4d96 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/environment/index.d.ts @@ -0,0 +1,2 @@ +export * from './make_environment'; +export * from './types'; diff --git a/node_modules/@cucumber/cucumber/lib/environment/index.js b/node_modules/@cucumber/cucumber/lib/environment/index.js new file mode 100644 index 00000000..fda5966c --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/environment/index.js @@ -0,0 +1,19 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +__exportStar(require("./make_environment"), exports); +__exportStar(require("./types"), exports); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/environment/index.js.map b/node_modules/@cucumber/cucumber/lib/environment/index.js.map new file mode 100644 index 00000000..e2fc65c2 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/environment/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/environment/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAkC;AAClC,0CAAuB","sourcesContent":["export * from './make_environment'\nexport * from './types'\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/environment/make_environment.d.ts b/node_modules/@cucumber/cucumber/lib/environment/make_environment.d.ts new file mode 100644 index 00000000..570db890 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/environment/make_environment.d.ts @@ -0,0 +1,2 @@ +import { UsableEnvironment, IRunEnvironment } from './types'; +export declare function makeEnvironment(provided: IRunEnvironment): UsableEnvironment; diff --git a/node_modules/@cucumber/cucumber/lib/environment/make_environment.js b/node_modules/@cucumber/cucumber/lib/environment/make_environment.js new file mode 100644 index 00000000..9e0027dd --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/environment/make_environment.js @@ -0,0 +1,20 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.makeEnvironment = makeEnvironment; +const console_logger_1 = require("./console_logger"); +function makeEnvironment(provided) { + const fullEnvironment = Object.assign({}, { + cwd: process.cwd(), + stdout: process.stdout, + stderr: process.stderr, + env: process.env, + debug: false, + }, provided); + const logger = new console_logger_1.ConsoleLogger(fullEnvironment.stderr, fullEnvironment.debug); + logger.debug('Resolved environment:', fullEnvironment); + return { + ...fullEnvironment, + logger: logger, + }; +} +//# sourceMappingURL=make_environment.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/environment/make_environment.js.map b/node_modules/@cucumber/cucumber/lib/environment/make_environment.js.map new file mode 100644 index 00000000..1ea42353 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/environment/make_environment.js.map @@ -0,0 +1 @@ +{"version":3,"file":"make_environment.js","sourceRoot":"","sources":["../../src/environment/make_environment.ts"],"names":[],"mappings":";;AAGA,0CAqBC;AAxBD,qDAAgD;AAGhD,SAAgB,eAAe,CAAC,QAAyB;IACvD,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CACnC,EAAE,EACF;QACE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,KAAK,EAAE,KAAK;KACb,EACD,QAAQ,CACT,CAAA;IACD,MAAM,MAAM,GAAG,IAAI,8BAAa,CAC9B,eAAe,CAAC,MAAM,EACtB,eAAe,CAAC,KAAK,CACtB,CAAA;IACD,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,eAAe,CAAC,CAAA;IACtD,OAAO;QACL,GAAG,eAAe;QAClB,MAAM,EAAE,MAAM;KACf,CAAA;AACH,CAAC","sourcesContent":["import { ConsoleLogger } from './console_logger'\nimport { UsableEnvironment, IRunEnvironment } from './types'\n\nexport function makeEnvironment(provided: IRunEnvironment): UsableEnvironment {\n const fullEnvironment = Object.assign(\n {},\n {\n cwd: process.cwd(),\n stdout: process.stdout,\n stderr: process.stderr,\n env: process.env,\n debug: false,\n },\n provided\n )\n const logger = new ConsoleLogger(\n fullEnvironment.stderr,\n fullEnvironment.debug\n )\n logger.debug('Resolved environment:', fullEnvironment)\n return {\n ...fullEnvironment,\n logger: logger,\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/environment/types.d.ts b/node_modules/@cucumber/cucumber/lib/environment/types.d.ts new file mode 100644 index 00000000..677d2395 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/environment/types.d.ts @@ -0,0 +1,48 @@ +import { Writable } from 'node:stream'; +/** + * A logger that can be used to direct messages to stderr or similar + * @public + * @remarks + * Matches the interface of Node.js Console, for the methods it has. + */ +export interface ILogger { + debug: (message?: any, ...optionalParams: any[]) => void; + error: (message?: any, ...optionalParams: any[]) => void; + warn: (message?: any, ...optionalParams: any[]) => void; + info: (message?: any, ...optionalParams: any[]) => void; +} +/** + * Contextual data about the project environment + * @public + */ +export interface IRunEnvironment { + /** + * Working directory for the project + * @default process.cwd() + */ + cwd?: string; + /** + * Writable stream where the test run's main formatter output is written + * @default process.stdout + */ + stdout?: Writable; + /** + * Writable stream where the test run's warning/error output is written + * @default process.stderr + */ + stderr?: Writable; + /** + * Environment variables + * @default process.env + */ + env?: Record; + /** + * Whether debug logging should be emitted to {@link IRunEnvironment.stderr} + * @default false + * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/debugging.md} + */ + debug?: boolean; +} +export type UsableEnvironment = Required & { + logger: ILogger; +}; diff --git a/node_modules/@cucumber/cucumber/lib/environment/types.js b/node_modules/@cucumber/cucumber/lib/environment/types.js new file mode 100644 index 00000000..11e638d1 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/environment/types.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/environment/types.js.map b/node_modules/@cucumber/cucumber/lib/environment/types.js.map new file mode 100644 index 00000000..90ca980e --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/environment/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/environment/types.ts"],"names":[],"mappings":"","sourcesContent":["import { Writable } from 'node:stream'\n\n/**\n * A logger that can be used to direct messages to stderr or similar\n * @public\n * @remarks\n * Matches the interface of Node.js Console, for the methods it has.\n */\nexport interface ILogger {\n debug: (message?: any, ...optionalParams: any[]) => void\n error: (message?: any, ...optionalParams: any[]) => void\n warn: (message?: any, ...optionalParams: any[]) => void\n info: (message?: any, ...optionalParams: any[]) => void\n}\n\n/**\n * Contextual data about the project environment\n * @public\n */\nexport interface IRunEnvironment {\n /**\n * Working directory for the project\n * @default process.cwd()\n */\n cwd?: string\n /**\n * Writable stream where the test run's main formatter output is written\n * @default process.stdout\n */\n stdout?: Writable\n /**\n * Writable stream where the test run's warning/error output is written\n * @default process.stderr\n */\n stderr?: Writable\n /**\n * Environment variables\n * @default process.env\n */\n env?: Record\n /**\n * Whether debug logging should be emitted to {@link IRunEnvironment.stderr}\n * @default false\n * @see {@link https://github.com/cucumber/cucumber-js/blob/main/docs/debugging.md}\n */\n debug?: boolean\n}\n\nexport type UsableEnvironment = Required & {\n logger: ILogger\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/filter/filter_plugin.d.ts b/node_modules/@cucumber/cucumber/lib/filter/filter_plugin.d.ts new file mode 100644 index 00000000..c52063a1 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/filter/filter_plugin.d.ts @@ -0,0 +1,2 @@ +import { InternalPlugin } from '../plugin'; +export declare const filterPlugin: InternalPlugin; diff --git a/node_modules/@cucumber/cucumber/lib/filter/filter_plugin.js b/node_modules/@cucumber/cucumber/lib/filter/filter_plugin.js new file mode 100644 index 00000000..82f59ccd --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/filter/filter_plugin.js @@ -0,0 +1,32 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.filterPlugin = void 0; +const pickle_filter_1 = __importDefault(require("../pickle_filter")); +const order_pickles_1 = require("./order_pickles"); +exports.filterPlugin = { + type: 'plugin', + coordinator: async ({ on, transform, options, logger, environment }) => { + let unexpandedSourcePaths = []; + on('paths:resolve', (paths) => { + unexpandedSourcePaths = paths.unexpandedSourcePaths; + }); + transform('pickles:filter', async (allPickles) => { + const pickleFilter = new pickle_filter_1.default({ + cwd: environment.cwd, + featurePaths: unexpandedSourcePaths, + names: options.names, + tagExpression: options.tagExpression, + }); + return allPickles.filter((pickle) => pickleFilter.matches(pickle)); + }); + transform('pickles:order', async (unorderedPickles) => { + const orderedPickles = [...unorderedPickles]; + (0, order_pickles_1.orderPickles)(orderedPickles, options.order, logger); + return orderedPickles; + }); + }, +}; +//# sourceMappingURL=filter_plugin.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/filter/filter_plugin.js.map b/node_modules/@cucumber/cucumber/lib/filter/filter_plugin.js.map new file mode 100644 index 00000000..bd27cbfe --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/filter/filter_plugin.js.map @@ -0,0 +1 @@ +{"version":3,"file":"filter_plugin.js","sourceRoot":"","sources":["../../src/filter/filter_plugin.ts"],"names":[],"mappings":";;;;;;AACA,qEAA2C;AAC3C,mDAA8C;AAEjC,QAAA,YAAY,GAAmB;IAC1C,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE;QACrE,IAAI,qBAAqB,GAAa,EAAE,CAAA;QACxC,EAAE,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE;YAC5B,qBAAqB,GAAG,KAAK,CAAC,qBAAqB,CAAA;QACrD,CAAC,CAAC,CAAA;QAEF,SAAS,CAAC,gBAAgB,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;YAC/C,MAAM,YAAY,GAAG,IAAI,uBAAY,CAAC;gBACpC,GAAG,EAAE,WAAW,CAAC,GAAG;gBACpB,YAAY,EAAE,qBAAqB;gBACnC,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,aAAa,EAAE,OAAO,CAAC,aAAa;aACrC,CAAC,CAAA;YAEF,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;QACpE,CAAC,CAAC,CAAA;QAEF,SAAS,CAAC,eAAe,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE;YACpD,MAAM,cAAc,GAAG,CAAC,GAAG,gBAAgB,CAAC,CAAA;YAC5C,IAAA,4BAAY,EAAC,cAAc,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;YACnD,OAAO,cAAc,CAAA;QACvB,CAAC,CAAC,CAAA;IACJ,CAAC;CACF,CAAA","sourcesContent":["import { InternalPlugin } from '../plugin'\nimport PickleFilter from '../pickle_filter'\nimport { orderPickles } from './order_pickles'\n\nexport const filterPlugin: InternalPlugin = {\n type: 'plugin',\n coordinator: async ({ on, transform, options, logger, environment }) => {\n let unexpandedSourcePaths: string[] = []\n on('paths:resolve', (paths) => {\n unexpandedSourcePaths = paths.unexpandedSourcePaths\n })\n\n transform('pickles:filter', async (allPickles) => {\n const pickleFilter = new PickleFilter({\n cwd: environment.cwd,\n featurePaths: unexpandedSourcePaths,\n names: options.names,\n tagExpression: options.tagExpression,\n })\n\n return allPickles.filter((pickle) => pickleFilter.matches(pickle))\n })\n\n transform('pickles:order', async (unorderedPickles) => {\n const orderedPickles = [...unorderedPickles]\n orderPickles(orderedPickles, options.order, logger)\n return orderedPickles\n })\n },\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/filter/index.d.ts b/node_modules/@cucumber/cucumber/lib/filter/index.d.ts new file mode 100644 index 00000000..e67b8ea0 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/filter/index.d.ts @@ -0,0 +1,4 @@ +import { filterPlugin } from './filter_plugin'; +export * from './types'; +export { orderPickles } from './order_pickles'; +export default filterPlugin; diff --git a/node_modules/@cucumber/cucumber/lib/filter/index.js b/node_modules/@cucumber/cucumber/lib/filter/index.js new file mode 100644 index 00000000..e279d019 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/filter/index.js @@ -0,0 +1,23 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.orderPickles = void 0; +const filter_plugin_1 = require("./filter_plugin"); +__exportStar(require("./types"), exports); +var order_pickles_1 = require("./order_pickles"); +Object.defineProperty(exports, "orderPickles", { enumerable: true, get: function () { return order_pickles_1.orderPickles; } }); +exports.default = filter_plugin_1.filterPlugin; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/filter/index.js.map b/node_modules/@cucumber/cucumber/lib/filter/index.js.map new file mode 100644 index 00000000..17db04fd --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/filter/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/filter/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,mDAA8C;AAC9C,0CAAuB;AACvB,iDAA8C;AAArC,6GAAA,YAAY,OAAA;AAErB,kBAAe,4BAAY,CAAA","sourcesContent":["import { filterPlugin } from './filter_plugin'\nexport * from './types'\nexport { orderPickles } from './order_pickles'\n\nexport default filterPlugin\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/filter/order_pickles.d.ts b/node_modules/@cucumber/cucumber/lib/filter/order_pickles.d.ts new file mode 100644 index 00000000..83b29b58 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/filter/order_pickles.d.ts @@ -0,0 +1,3 @@ +import { ILogger } from '../environment'; +import { IPickleOrder } from './types'; +export declare function orderPickles(pickleIds: T[], order: IPickleOrder, logger: ILogger): void; diff --git a/node_modules/@cucumber/cucumber/lib/filter/order_pickles.js b/node_modules/@cucumber/cucumber/lib/filter/order_pickles.js new file mode 100644 index 00000000..f33c7186 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/filter/order_pickles.js @@ -0,0 +1,37 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.orderPickles = orderPickles; +const knuth_shuffle_seeded_1 = __importDefault(require("knuth-shuffle-seeded")); +// Orders the pickleIds in place - morphs input +function orderPickles(pickleIds, order, logger) { + const [type, seed] = splitOrder(order); + switch (type) { + case 'defined': + break; + case 'reverse': + pickleIds.reverse(); + break; + case 'random': + if (seed === '') { + const newSeed = Math.floor(Math.random() * 1000 * 1000).toString(); + logger.warn(`Random order using seed: ${newSeed}`); + (0, knuth_shuffle_seeded_1.default)(pickleIds, newSeed); + } + else { + (0, knuth_shuffle_seeded_1.default)(pickleIds, seed); + } + break; + default: + throw new Error('Unrecognized order type. Should be `defined` or `random`'); + } +} +function splitOrder(order) { + if (!order.includes(':')) { + return [order, '']; + } + return order.split(':'); +} +//# sourceMappingURL=order_pickles.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/filter/order_pickles.js.map b/node_modules/@cucumber/cucumber/lib/filter/order_pickles.js.map new file mode 100644 index 00000000..e3f36d72 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/filter/order_pickles.js.map @@ -0,0 +1 @@ +{"version":3,"file":"order_pickles.js","sourceRoot":"","sources":["../../src/filter/order_pickles.ts"],"names":[],"mappings":";;;;;AAKA,oCA0BC;AA/BD,gFAA0C;AAI1C,+CAA+C;AAC/C,SAAgB,YAAY,CAC1B,SAAc,EACd,KAAmB,EACnB,MAAe;IAEf,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;IACtC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,SAAS;YACZ,MAAK;QACP,KAAK,SAAS;YACZ,SAAS,CAAC,OAAO,EAAE,CAAA;YACnB,MAAK;QACP,KAAK,QAAQ;YACX,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;gBAChB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAA;gBAClE,MAAM,CAAC,IAAI,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAA;gBAClD,IAAA,8BAAO,EAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YAC7B,CAAC;iBAAM,CAAC;gBACN,IAAA,8BAAO,EAAC,SAAS,EAAE,IAAI,CAAC,CAAA;YAC1B,CAAC;YACD,MAAK;QACP;YACE,MAAM,IAAI,KAAK,CACb,0DAA0D,CAC3D,CAAA;IACL,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IACpB,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AACzB,CAAC","sourcesContent":["import shuffle from 'knuth-shuffle-seeded'\nimport { ILogger } from '../environment'\nimport { IPickleOrder } from './types'\n\n// Orders the pickleIds in place - morphs input\nexport function orderPickles(\n pickleIds: T[],\n order: IPickleOrder,\n logger: ILogger\n): void {\n const [type, seed] = splitOrder(order)\n switch (type) {\n case 'defined':\n break\n case 'reverse':\n pickleIds.reverse()\n break\n case 'random':\n if (seed === '') {\n const newSeed = Math.floor(Math.random() * 1000 * 1000).toString()\n logger.warn(`Random order using seed: ${newSeed}`)\n shuffle(pickleIds, newSeed)\n } else {\n shuffle(pickleIds, seed)\n }\n break\n default:\n throw new Error(\n 'Unrecognized order type. Should be `defined` or `random`'\n )\n }\n}\n\nfunction splitOrder(order: string) {\n if (!order.includes(':')) {\n return [order, '']\n }\n return order.split(':')\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/filter/types.d.ts b/node_modules/@cucumber/cucumber/lib/filter/types.d.ts new file mode 100644 index 00000000..11b54b0e --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/filter/types.d.ts @@ -0,0 +1,19 @@ +import { GherkinDocument, Location, Pickle } from '@cucumber/messages'; +/** + * The ordering strategy for pickles + * @public + * @example "defined" + * @example "reverse" + * @example "random" + * @example "random:234119" + */ +export type IPickleOrder = 'defined' | 'reverse' | 'random' | `random:${string}`; +/** + * A Pickle decorated with relevant context that can be filtered or sorted + * @public + */ +export interface IFilterablePickle { + pickle: Pickle; + gherkinDocument: GherkinDocument; + location: Location; +} diff --git a/node_modules/@cucumber/cucumber/lib/filter/types.js b/node_modules/@cucumber/cucumber/lib/filter/types.js new file mode 100644 index 00000000..11e638d1 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/filter/types.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/filter/types.js.map b/node_modules/@cucumber/cucumber/lib/filter/types.js.map new file mode 100644 index 00000000..d0bb9046 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/filter/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/filter/types.ts"],"names":[],"mappings":"","sourcesContent":["import { GherkinDocument, Location, Pickle } from '@cucumber/messages'\n\n/**\n * The ordering strategy for pickles\n * @public\n * @example \"defined\"\n * @example \"reverse\"\n * @example \"random\"\n * @example \"random:234119\"\n */\nexport type IPickleOrder = 'defined' | 'reverse' | 'random' | `random:${string}`\n\n/**\n * A Pickle decorated with relevant context that can be filtered or sorted\n * @public\n */\nexport interface IFilterablePickle {\n pickle: Pickle\n gherkinDocument: GherkinDocument\n location: Location\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/filter_stack_trace.d.ts b/node_modules/@cucumber/cucumber/lib/filter_stack_trace.d.ts new file mode 100644 index 00000000..b1cb2037 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/filter_stack_trace.d.ts @@ -0,0 +1,3 @@ +import { StackFrame } from 'error-stack-parser'; +export declare function isFileNameInCucumber(fileName: string): boolean; +export declare function filterStackTrace(frames: StackFrame[]): StackFrame[]; diff --git a/node_modules/@cucumber/cucumber/lib/filter_stack_trace.js b/node_modules/@cucumber/cucumber/lib/filter_stack_trace.js new file mode 100644 index 00000000..4c102c09 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/filter_stack_trace.js @@ -0,0 +1,37 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isFileNameInCucumber = isFileNameInCucumber; +exports.filterStackTrace = filterStackTrace; +const node_path_1 = __importDefault(require("node:path")); +const value_checker_1 = require("./value_checker"); +const projectRootPath = node_path_1.default.join(__dirname, '..'); +const projectChildDirs = ['src', 'lib', 'node_modules']; +function isFileNameInCucumber(fileName) { + return projectChildDirs.some((dir) => fileName.startsWith(node_path_1.default.join(projectRootPath, dir))); +} +function filterStackTrace(frames) { + if (isErrorInCucumber(frames)) { + return frames; + } + const index = frames.findIndex((x) => isFrameInCucumber(x)); + if (index === -1) { + return frames; + } + return frames.slice(0, index); +} +function isErrorInCucumber(frames) { + const filteredFrames = frames.filter((x) => !isFrameInNode(x)); + return filteredFrames.length > 0 && isFrameInCucumber(filteredFrames[0]); +} +function isFrameInCucumber(frame) { + const fileName = (0, value_checker_1.valueOrDefault)(frame.getFileName(), ''); + return isFileNameInCucumber(fileName); +} +function isFrameInNode(frame) { + const fileName = (0, value_checker_1.valueOrDefault)(frame.getFileName(), ''); + return !fileName.includes(node_path_1.default.sep); +} +//# sourceMappingURL=filter_stack_trace.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/filter_stack_trace.js.map b/node_modules/@cucumber/cucumber/lib/filter_stack_trace.js.map new file mode 100644 index 00000000..4472b792 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/filter_stack_trace.js.map @@ -0,0 +1 @@ +{"version":3,"file":"filter_stack_trace.js","sourceRoot":"","sources":["../src/filter_stack_trace.ts"],"names":[],"mappings":";;;;;AAOA,oDAIC;AAED,4CASC;AAtBD,0DAA4B;AAE5B,mDAAgD;AAEhD,MAAM,eAAe,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;AAClD,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,cAAc,CAAC,CAAA;AAEvD,SAAgB,oBAAoB,CAAC,QAAgB;IACnD,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CACnC,QAAQ,CAAC,UAAU,CAAC,mBAAI,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,CACrD,CAAA;AACH,CAAC;AAED,SAAgB,gBAAgB,CAAC,MAAoB;IACnD,IAAI,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAA;IACf,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3D,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,OAAO,MAAM,CAAA;IACf,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;AAC/B,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAoB;IAC7C,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9D,OAAO,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,iBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;AAC1E,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAiB;IAC1C,MAAM,QAAQ,GAAG,IAAA,8BAAc,EAAC,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAA;IACxD,OAAO,oBAAoB,CAAC,QAAQ,CAAC,CAAA;AACvC,CAAC;AAED,SAAS,aAAa,CAAC,KAAiB;IACtC,MAAM,QAAQ,GAAG,IAAA,8BAAc,EAAC,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAA;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,mBAAI,CAAC,GAAG,CAAC,CAAA;AACrC,CAAC","sourcesContent":["import path from 'node:path'\nimport { StackFrame } from 'error-stack-parser'\nimport { valueOrDefault } from './value_checker'\n\nconst projectRootPath = path.join(__dirname, '..')\nconst projectChildDirs = ['src', 'lib', 'node_modules']\n\nexport function isFileNameInCucumber(fileName: string): boolean {\n return projectChildDirs.some((dir) =>\n fileName.startsWith(path.join(projectRootPath, dir))\n )\n}\n\nexport function filterStackTrace(frames: StackFrame[]): StackFrame[] {\n if (isErrorInCucumber(frames)) {\n return frames\n }\n const index = frames.findIndex((x) => isFrameInCucumber(x))\n if (index === -1) {\n return frames\n }\n return frames.slice(0, index)\n}\n\nfunction isErrorInCucumber(frames: StackFrame[]): boolean {\n const filteredFrames = frames.filter((x) => !isFrameInNode(x))\n return filteredFrames.length > 0 && isFrameInCucumber(filteredFrames[0])\n}\n\nfunction isFrameInCucumber(frame: StackFrame): boolean {\n const fileName = valueOrDefault(frame.getFileName(), '')\n return isFileNameInCucumber(fileName)\n}\n\nfunction isFrameInNode(frame: StackFrame): boolean {\n const fileName = valueOrDefault(frame.getFileName(), '')\n return !fileName.includes(path.sep)\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/builder.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/builder.d.ts new file mode 100644 index 00000000..be18d271 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/builder.d.ts @@ -0,0 +1,33 @@ +import { EventEmitter } from 'node:events'; +import { Writable as WritableStream } from 'node:stream'; +import { SupportCodeLibrary } from '../support_code_library_builder/types'; +import { SnippetInterface } from './step_definition_snippet_builder/snippet_syntax'; +import EventDataCollector from './helpers/event_data_collector'; +import StepDefinitionSnippetBuilder from './step_definition_snippet_builder'; +import Formatter, { FormatOptions, IFormatterCleanupFn, IFormatterLogFn } from '.'; +interface IGetStepDefinitionSnippetBuilderOptions { + cwd: string; + snippetInterface?: SnippetInterface; + snippetSyntax?: string; + supportCodeLibrary: SupportCodeLibrary; +} +export interface IBuildOptions { + env: NodeJS.ProcessEnv; + cwd: string; + eventBroadcaster: EventEmitter; + eventDataCollector: EventDataCollector; + log: IFormatterLogFn; + parsedArgvOptions: FormatOptions; + stream: WritableStream; + cleanup: IFormatterCleanupFn; + supportCodeLibrary: SupportCodeLibrary; +} +declare const FormatterBuilder: { + build(FormatterConstructor: string | typeof Formatter, options: IBuildOptions): Promise; + getConstructorByType(type: string, cwd: string): Promise; + getStepDefinitionSnippetBuilder({ cwd, snippetInterface, snippetSyntax, supportCodeLibrary, }: IGetStepDefinitionSnippetBuilderOptions): Promise; + loadCustomClass(type: "formatter" | "syntax", descriptor: string, cwd: string): Promise; + loadFile(urlOrName: URL | string): Promise; + resolveConstructor(ImportedCode: any): any; +}; +export default FormatterBuilder; diff --git a/node_modules/@cucumber/cucumber/lib/formatter/builder.js b/node_modules/@cucumber/cucumber/lib/formatter/builder.js new file mode 100644 index 00000000..aad8dd8c --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/builder.js @@ -0,0 +1,81 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const value_checker_1 = require("../value_checker"); +const snippet_syntax_1 = require("./step_definition_snippet_builder/snippet_syntax"); +const step_definition_snippet_builder_1 = __importDefault(require("./step_definition_snippet_builder")); +const javascript_snippet_syntax_1 = __importDefault(require("./step_definition_snippet_builder/javascript_snippet_syntax")); +const get_color_fns_1 = __importDefault(require("./get_color_fns")); +const formatters_1 = __importDefault(require("./helpers/formatters")); +const import_code_1 = require("./import_code"); +const FormatterBuilder = { + async build(FormatterConstructor, options) { + if (typeof FormatterConstructor === 'string') { + FormatterConstructor = await FormatterBuilder.getConstructorByType(FormatterConstructor, options.cwd); + } + const colorFns = (0, get_color_fns_1.default)(options.stream, options.env, options.parsedArgvOptions.colorsEnabled); + const snippetBuilder = await FormatterBuilder.getStepDefinitionSnippetBuilder({ + cwd: options.cwd, + snippetInterface: options.parsedArgvOptions.snippetInterface, + snippetSyntax: options.parsedArgvOptions.snippetSyntax, + supportCodeLibrary: options.supportCodeLibrary, + }); + return new FormatterConstructor({ + colorFns, + snippetBuilder, + ...options, + }); + }, + async getConstructorByType(type, cwd) { + const formatters = formatters_1.default.getFormatters(); + return formatters[type] + ? formatters[type] + : await FormatterBuilder.loadCustomClass('formatter', type, cwd); + }, + async getStepDefinitionSnippetBuilder({ cwd, snippetInterface, snippetSyntax, supportCodeLibrary, }) { + if ((0, value_checker_1.doesNotHaveValue)(snippetInterface)) { + snippetInterface = snippet_syntax_1.SnippetInterface.Synchronous; + } + let Syntax = javascript_snippet_syntax_1.default; + if ((0, value_checker_1.doesHaveValue)(snippetSyntax)) { + Syntax = await FormatterBuilder.loadCustomClass('syntax', snippetSyntax, cwd); + } + return new step_definition_snippet_builder_1.default({ + snippetSyntax: new Syntax(snippetInterface), + parameterTypeRegistry: supportCodeLibrary.parameterTypeRegistry, + }); + }, + async loadCustomClass(type, descriptor, cwd) { + const CustomClass = FormatterBuilder.resolveConstructor(await (0, import_code_1.importCode)(descriptor, cwd)); + if ((0, value_checker_1.doesHaveValue)(CustomClass)) { + return CustomClass; + } + else { + throw new Error(`Custom ${type} (${descriptor}) does not export a function/class`); + } + }, + async loadFile(urlOrName) { + return await import(urlOrName.toString()); + }, + resolveConstructor(ImportedCode) { + if ((0, value_checker_1.doesNotHaveValue)(ImportedCode)) { + return null; + } + if (typeof ImportedCode === 'function') { + return ImportedCode; + } + else if (typeof ImportedCode === 'object' && + typeof ImportedCode.default === 'function') { + return ImportedCode.default; + } + else if (typeof ImportedCode.default === 'object' && + typeof ImportedCode.default.default === 'function') { + return ImportedCode.default.default; + } + return null; + }, +}; +exports.default = FormatterBuilder; +//# sourceMappingURL=builder.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/builder.js.map b/node_modules/@cucumber/cucumber/lib/formatter/builder.js.map new file mode 100644 index 00000000..4cc2ec60 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/builder.js.map @@ -0,0 +1 @@ +{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/formatter/builder.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventEmitter } from 'node:events'\nimport { Writable as WritableStream } from 'node:stream'\nimport { doesHaveValue, doesNotHaveValue } from '../value_checker'\nimport { SupportCodeLibrary } from '../support_code_library_builder/types'\nimport { SnippetInterface } from './step_definition_snippet_builder/snippet_syntax'\nimport EventDataCollector from './helpers/event_data_collector'\nimport StepDefinitionSnippetBuilder from './step_definition_snippet_builder'\nimport JavascriptSnippetSyntax from './step_definition_snippet_builder/javascript_snippet_syntax'\nimport getColorFns from './get_color_fns'\nimport Formatters from './helpers/formatters'\nimport { importCode } from './import_code'\nimport Formatter, {\n FormatOptions,\n IFormatterCleanupFn,\n IFormatterLogFn,\n} from '.'\n\ninterface IGetStepDefinitionSnippetBuilderOptions {\n cwd: string\n snippetInterface?: SnippetInterface\n snippetSyntax?: string\n supportCodeLibrary: SupportCodeLibrary\n}\n\nexport interface IBuildOptions {\n env: NodeJS.ProcessEnv\n cwd: string\n eventBroadcaster: EventEmitter\n eventDataCollector: EventDataCollector\n log: IFormatterLogFn\n parsedArgvOptions: FormatOptions\n stream: WritableStream\n cleanup: IFormatterCleanupFn\n supportCodeLibrary: SupportCodeLibrary\n}\n\nconst FormatterBuilder = {\n async build(\n FormatterConstructor: string | typeof Formatter,\n options: IBuildOptions\n ): Promise {\n if (typeof FormatterConstructor === 'string') {\n FormatterConstructor = await FormatterBuilder.getConstructorByType(\n FormatterConstructor,\n options.cwd\n )\n }\n const colorFns = getColorFns(\n options.stream,\n options.env,\n options.parsedArgvOptions.colorsEnabled\n )\n const snippetBuilder =\n await FormatterBuilder.getStepDefinitionSnippetBuilder({\n cwd: options.cwd,\n snippetInterface: options.parsedArgvOptions.snippetInterface,\n snippetSyntax: options.parsedArgvOptions.snippetSyntax,\n supportCodeLibrary: options.supportCodeLibrary,\n })\n return new FormatterConstructor({\n colorFns,\n snippetBuilder,\n ...options,\n })\n },\n\n async getConstructorByType(\n type: string,\n cwd: string\n ): Promise {\n const formatters: Record =\n Formatters.getFormatters()\n\n return formatters[type]\n ? formatters[type]\n : await FormatterBuilder.loadCustomClass('formatter', type, cwd)\n },\n\n async getStepDefinitionSnippetBuilder({\n cwd,\n snippetInterface,\n snippetSyntax,\n supportCodeLibrary,\n }: IGetStepDefinitionSnippetBuilderOptions) {\n if (doesNotHaveValue(snippetInterface)) {\n snippetInterface = SnippetInterface.Synchronous\n }\n let Syntax = JavascriptSnippetSyntax\n if (doesHaveValue(snippetSyntax)) {\n Syntax = await FormatterBuilder.loadCustomClass(\n 'syntax',\n snippetSyntax,\n cwd\n )\n }\n return new StepDefinitionSnippetBuilder({\n snippetSyntax: new Syntax(snippetInterface),\n parameterTypeRegistry: supportCodeLibrary.parameterTypeRegistry,\n })\n },\n\n async loadCustomClass(\n type: 'formatter' | 'syntax',\n descriptor: string,\n cwd: string\n ) {\n const CustomClass = FormatterBuilder.resolveConstructor(\n await importCode(descriptor, cwd)\n )\n if (doesHaveValue(CustomClass)) {\n return CustomClass\n } else {\n throw new Error(\n `Custom ${type} (${descriptor}) does not export a function/class`\n )\n }\n },\n\n async loadFile(urlOrName: URL | string) {\n return await import(urlOrName.toString())\n },\n\n resolveConstructor(ImportedCode: any) {\n if (doesNotHaveValue(ImportedCode)) {\n return null\n }\n if (typeof ImportedCode === 'function') {\n return ImportedCode\n } else if (\n typeof ImportedCode === 'object' &&\n typeof ImportedCode.default === 'function'\n ) {\n return ImportedCode.default\n } else if (\n typeof ImportedCode.default === 'object' &&\n typeof ImportedCode.default.default === 'function'\n ) {\n return ImportedCode.default.default\n }\n return null\n },\n}\n\nexport default FormatterBuilder\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/builtin/html.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/builtin/html.d.ts new file mode 100644 index 00000000..4875e352 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/builtin/html.d.ts @@ -0,0 +1,9 @@ +interface Options { + externalAttachments?: boolean | ReadonlyArray; +} +declare const _default: { + type: "formatter"; + formatter({ on, options, write, directory }: import("../../plugin").FormatterPluginContext): () => Promise; + optionsKey: string; +}; +export default _default; diff --git a/node_modules/@cucumber/cucumber/lib/formatter/builtin/html.js b/node_modules/@cucumber/cucumber/lib/formatter/builtin/html.js new file mode 100644 index 00000000..a7a98446 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/builtin/html.js @@ -0,0 +1,30 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const node_util_1 = require("node:util"); +const node_stream_1 = require("node:stream"); +const html_formatter_1 = require("@cucumber/html-formatter"); +const message_streams_1 = require("@cucumber/message-streams"); +exports.default = { + type: 'formatter', + formatter({ on, options, write, directory }) { + if (!directory && options.externalAttachments) { + throw new Error('Unable to externalise attachments when formatter is not writing to a file'); + } + const externaliseStream = new message_streams_1.AttachmentExternalisingStream({ + behaviour: options.externalAttachments, + directory, + }); + const htmlStream = new html_formatter_1.CucumberHtmlStream(); + externaliseStream.pipe(htmlStream); + on('message', (message) => { + externaliseStream.write(message); + }); + htmlStream.on('data', (chunk) => write(chunk)); + return async () => { + externaliseStream.end(); + await (0, node_util_1.promisify)(node_stream_1.finished)(htmlStream); + }; + }, + optionsKey: 'html', +}; +//# sourceMappingURL=html.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/builtin/html.js.map b/node_modules/@cucumber/cucumber/lib/formatter/builtin/html.js.map new file mode 100644 index 00000000..f5574b5d --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/builtin/html.js.map @@ -0,0 +1 @@ +{"version":3,"file":"html.js","sourceRoot":"","sources":["../../../src/formatter/builtin/html.ts"],"names":[],"mappings":";;AAAA,yCAAqC;AACrC,6CAAsC;AACtC,6DAA6D;AAC7D,+DAAyE;AAOzE,kBAAe;IACb,IAAI,EAAE,WAAW;IACjB,SAAS,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;QACzC,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAA;QACH,CAAC;QACD,MAAM,iBAAiB,GAAG,IAAI,+CAA6B,CAAC;YAC1D,SAAS,EAAE,OAAO,CAAC,mBAAmB;YACtC,SAAS;SACV,CAAC,CAAA;QACF,MAAM,UAAU,GAAG,IAAI,mCAAkB,EAAE,CAAA;QAC3C,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAClC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;YACxB,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAClC,CAAC,CAAC,CAAA;QACF,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;QAE9C,OAAO,KAAK,IAAI,EAAE;YAChB,iBAAiB,CAAC,GAAG,EAAE,CAAA;YACvB,MAAM,IAAA,qBAAS,EAAC,sBAAQ,CAAC,CAAC,UAAU,CAAC,CAAA;QACvC,CAAC,CAAA;IACH,CAAC;IACD,UAAU,EAAE,MAAM;CACgB,CAAA","sourcesContent":["import { promisify } from 'node:util'\nimport { finished } from 'node:stream'\nimport { CucumberHtmlStream } from '@cucumber/html-formatter'\nimport { AttachmentExternalisingStream } from '@cucumber/message-streams'\nimport { FormatterPlugin } from '../../plugin'\n\ninterface Options {\n externalAttachments?: boolean | ReadonlyArray\n}\n\nexport default {\n type: 'formatter',\n formatter({ on, options, write, directory }) {\n if (!directory && options.externalAttachments) {\n throw new Error(\n 'Unable to externalise attachments when formatter is not writing to a file'\n )\n }\n const externaliseStream = new AttachmentExternalisingStream({\n behaviour: options.externalAttachments,\n directory,\n })\n const htmlStream = new CucumberHtmlStream()\n externaliseStream.pipe(htmlStream)\n on('message', (message) => {\n externaliseStream.write(message)\n })\n htmlStream.on('data', (chunk) => write(chunk))\n\n return async () => {\n externaliseStream.end()\n await promisify(finished)(htmlStream)\n }\n },\n optionsKey: 'html',\n} satisfies FormatterPlugin\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/builtin/index.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/builtin/index.d.ts new file mode 100644 index 00000000..a86fa282 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/builtin/index.d.ts @@ -0,0 +1,17 @@ +import { FormatterImplementation } from '../index'; +declare const _default: Record; +export default _default; +export declare const documentation: { + html: string; + junit: string; + pretty: string; + message: string; + json: string; + progress: string; + 'progress-bar': string; + rerun: string; + snippets: string; + summary: string; + usage: string; + 'usage-json': string; +}; diff --git a/node_modules/@cucumber/cucumber/lib/formatter/builtin/index.js b/node_modules/@cucumber/cucumber/lib/formatter/builtin/index.js new file mode 100644 index 00000000..9f635e71 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/builtin/index.js @@ -0,0 +1,50 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.documentation = void 0; +const json_formatter_1 = __importDefault(require("../json_formatter")); +const progress_formatter_1 = __importDefault(require("../progress_formatter")); +const progress_bar_formatter_1 = __importDefault(require("../progress_bar_formatter")); +const rerun_formatter_1 = __importDefault(require("../rerun_formatter")); +const snippets_formatter_1 = __importDefault(require("../snippets_formatter")); +const summary_formatter_1 = __importDefault(require("../summary_formatter")); +const usage_formatter_1 = __importDefault(require("../usage_formatter")); +const usage_json_formatter_1 = __importDefault(require("../usage_json_formatter")); +const message_1 = __importDefault(require("./message")); +const html_1 = __importDefault(require("./html")); +const builtin = { + // new plugin-based formatters + html: html_1.default, + junit: '@cucumber/junit-xml-formatter', + pretty: '@cucumber/pretty-formatter', + message: message_1.default, + // legacy class-based formatters + json: json_formatter_1.default, + progress: progress_formatter_1.default, + 'progress-bar': progress_bar_formatter_1.default, + rerun: rerun_formatter_1.default, + snippets: snippets_formatter_1.default, + summary: summary_formatter_1.default, + usage: usage_formatter_1.default, + 'usage-json': usage_json_formatter_1.default, +}; +exports.default = builtin; +exports.documentation = { + // new plugin-based formatters + html: 'Outputs a HTML report', + junit: 'Produces a JUnit XML report', + pretty: 'Writes a rich report of the scenario and example execution as it happens', + message: 'Emits Cucumber messages in newline-delimited JSON', + // legacy class-based formatters + json: json_formatter_1.default.documentation, + progress: progress_formatter_1.default.documentation, + 'progress-bar': progress_bar_formatter_1.default.documentation, + rerun: rerun_formatter_1.default.documentation, + snippets: snippets_formatter_1.default.documentation, + summary: summary_formatter_1.default.documentation, + usage: usage_formatter_1.default.documentation, + 'usage-json': usage_json_formatter_1.default.documentation, +}; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/builtin/index.js.map b/node_modules/@cucumber/cucumber/lib/formatter/builtin/index.js.map new file mode 100644 index 00000000..c88aaebb --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/builtin/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/formatter/builtin/index.ts"],"names":[],"mappings":";;;;;;AACA,uEAA6C;AAC7C,+EAAqD;AACrD,uFAA4D;AAC5D,yEAA+C;AAC/C,+EAAqD;AACrD,6EAAmD;AACnD,yEAA+C;AAC/C,mFAAwD;AACxD,wDAAwC;AACxC,kDAAkC;AAElC,MAAM,OAAO,GAAG;IACd,8BAA8B;IAC9B,IAAI,EAAE,cAAa;IACnB,KAAK,EAAE,+BAA+B;IACtC,MAAM,EAAE,4BAA4B;IACpC,OAAO,EAAE,iBAAgB;IACzB,gCAAgC;IAChC,IAAI,EAAE,wBAAa;IACnB,QAAQ,EAAE,4BAAiB;IAC3B,cAAc,EAAE,gCAAoB;IACpC,KAAK,EAAE,yBAAc;IACrB,QAAQ,EAAE,4BAAiB;IAC3B,OAAO,EAAE,2BAAgB;IACzB,KAAK,EAAE,yBAAc;IACrB,YAAY,EAAE,8BAAkB;CACmC,CAAA;AAErE,kBAAe,OAA2D,CAAA;AAE7D,QAAA,aAAa,GAAG;IAC3B,8BAA8B;IAC9B,IAAI,EAAE,uBAAuB;IAC7B,KAAK,EAAE,6BAA6B;IACpC,MAAM,EACJ,0EAA0E;IAC5E,OAAO,EAAE,mDAAmD;IAC5D,gCAAgC;IAChC,IAAI,EAAE,wBAAa,CAAC,aAAa;IACjC,QAAQ,EAAE,4BAAiB,CAAC,aAAa;IACzC,cAAc,EAAE,gCAAoB,CAAC,aAAa;IAClD,KAAK,EAAE,yBAAc,CAAC,aAAa;IACnC,QAAQ,EAAE,4BAAiB,CAAC,aAAa;IACzC,OAAO,EAAE,2BAAgB,CAAC,aAAa;IACvC,KAAK,EAAE,yBAAc,CAAC,aAAa;IACnC,YAAY,EAAE,8BAAkB,CAAC,aAAa;CACA,CAAA","sourcesContent":["import { FormatterImplementation } from '../index'\nimport JsonFormatter from '../json_formatter'\nimport ProgressFormatter from '../progress_formatter'\nimport ProgressBarFormatter from '../progress_bar_formatter'\nimport RerunFormatter from '../rerun_formatter'\nimport SnippetsFormatter from '../snippets_formatter'\nimport SummaryFormatter from '../summary_formatter'\nimport UsageFormatter from '../usage_formatter'\nimport UsageJsonFormatter from '../usage_json_formatter'\nimport messageFormatter from './message'\nimport htmlFormatter from './html'\n\nconst builtin = {\n // new plugin-based formatters\n html: htmlFormatter,\n junit: '@cucumber/junit-xml-formatter',\n pretty: '@cucumber/pretty-formatter',\n message: messageFormatter,\n // legacy class-based formatters\n json: JsonFormatter,\n progress: ProgressFormatter,\n 'progress-bar': ProgressBarFormatter,\n rerun: RerunFormatter,\n snippets: SnippetsFormatter,\n summary: SummaryFormatter,\n usage: UsageFormatter,\n 'usage-json': UsageJsonFormatter,\n} as const satisfies Record\n\nexport default builtin as Record\n\nexport const documentation = {\n // new plugin-based formatters\n html: 'Outputs a HTML report',\n junit: 'Produces a JUnit XML report',\n pretty:\n 'Writes a rich report of the scenario and example execution as it happens',\n message: 'Emits Cucumber messages in newline-delimited JSON',\n // legacy class-based formatters\n json: JsonFormatter.documentation,\n progress: ProgressFormatter.documentation,\n 'progress-bar': ProgressBarFormatter.documentation,\n rerun: RerunFormatter.documentation,\n snippets: SnippetsFormatter.documentation,\n summary: SummaryFormatter.documentation,\n usage: UsageFormatter.documentation,\n 'usage-json': UsageJsonFormatter.documentation,\n} satisfies Record\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/builtin/message.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/builtin/message.d.ts new file mode 100644 index 00000000..172c1676 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/builtin/message.d.ts @@ -0,0 +1,5 @@ +declare const _default: { + type: "formatter"; + formatter({ on, write }: import("../../plugin").FormatterPluginContext): void; +}; +export default _default; diff --git a/node_modules/@cucumber/cucumber/lib/formatter/builtin/message.js b/node_modules/@cucumber/cucumber/lib/formatter/builtin/message.js new file mode 100644 index 00000000..51dfdc75 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/builtin/message.js @@ -0,0 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = { + type: 'formatter', + formatter({ on, write }) { + on('message', (message) => write(JSON.stringify(message) + '\n')); + }, +}; +//# sourceMappingURL=message.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/builtin/message.js.map b/node_modules/@cucumber/cucumber/lib/formatter/builtin/message.js.map new file mode 100644 index 00000000..a606b5b7 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/builtin/message.js.map @@ -0,0 +1 @@ +{"version":3,"file":"message.js","sourceRoot":"","sources":["../../../src/formatter/builtin/message.ts"],"names":[],"mappings":";;AAEA,kBAAe;IACb,IAAI,EAAE,WAAW;IACjB,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE;QACrB,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;IACnE,CAAC;CACwB,CAAA","sourcesContent":["import { FormatterPlugin } from '../../plugin'\n\nexport default {\n type: 'formatter',\n formatter({ on, write }) {\n on('message', (message) => write(JSON.stringify(message) + '\\n'))\n },\n} satisfies FormatterPlugin\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/create_stream.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/create_stream.d.ts new file mode 100644 index 00000000..01733c21 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/create_stream.d.ts @@ -0,0 +1,6 @@ +import { Writable } from 'node:stream'; +import { ILogger } from '../environment'; +export declare function createStream(target: string, onStreamError: () => void, cwd: string, logger: ILogger): Promise<{ + directory: string; + stream: Writable; +}>; diff --git a/node_modules/@cucumber/cucumber/lib/formatter/create_stream.js b/node_modules/@cucumber/cucumber/lib/formatter/create_stream.js new file mode 100644 index 00000000..e5c86e13 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/create_stream.js @@ -0,0 +1,31 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createStream = createStream; +const node_path_1 = __importDefault(require("node:path")); +const mkdirp_1 = require("mkdirp"); +const fs_1 = __importDefault(require("mz/fs")); +async function createStream(target, onStreamError, cwd, logger) { + const absoluteTarget = node_path_1.default.resolve(cwd, target); + const directory = node_path_1.default.dirname(absoluteTarget); + try { + await (0, mkdirp_1.mkdirp)(directory); + } + catch (e) { + logger.warn('Failed to ensure directory for formatter target exists', e); + } + const stream = fs_1.default.createWriteStream(null, { + fd: await fs_1.default.open(absoluteTarget, 'w'), + }); + stream.on('error', (error) => { + logger.error(error.message); + onStreamError(); + }); + return { + directory, + stream, + }; +} +//# sourceMappingURL=create_stream.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/create_stream.js.map b/node_modules/@cucumber/cucumber/lib/formatter/create_stream.js.map new file mode 100644 index 00000000..034e171f --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/create_stream.js.map @@ -0,0 +1 @@ +{"version":3,"file":"create_stream.js","sourceRoot":"","sources":["../../src/formatter/create_stream.ts"],"names":[],"mappings":";;;;;AAMA,oCA4BC;AAlCD,0DAA4B;AAE5B,mCAA+B;AAC/B,+CAAsB;AAGf,KAAK,UAAU,YAAY,CAChC,MAAc,EACd,aAAyB,EACzB,GAAW,EACX,MAAe;IAEf,MAAM,cAAc,GAAG,mBAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;IAChD,MAAM,SAAS,GAAG,mBAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;IAE9C,IAAI,CAAC;QACH,MAAM,IAAA,eAAM,EAAC,SAAS,CAAC,CAAA;IACzB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,wDAAwD,EAAE,CAAC,CAAC,CAAA;IAC1E,CAAC;IAED,MAAM,MAAM,GAAa,YAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE;QAClD,EAAE,EAAE,MAAM,YAAE,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC;KACvC,CAAC,CAAA;IAEF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;QAClC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAC3B,aAAa,EAAE,CAAA;IACjB,CAAC,CAAC,CAAA;IAEF,OAAO;QACL,SAAS;QACT,MAAM;KACP,CAAA;AACH,CAAC","sourcesContent":["import path from 'node:path'\nimport { Writable } from 'node:stream'\nimport { mkdirp } from 'mkdirp'\nimport fs from 'mz/fs'\nimport { ILogger } from '../environment'\n\nexport async function createStream(\n target: string,\n onStreamError: () => void,\n cwd: string,\n logger: ILogger\n) {\n const absoluteTarget = path.resolve(cwd, target)\n const directory = path.dirname(absoluteTarget)\n\n try {\n await mkdirp(directory)\n } catch (e) {\n logger.warn('Failed to ensure directory for formatter target exists', e)\n }\n\n const stream: Writable = fs.createWriteStream(null, {\n fd: await fs.open(absoluteTarget, 'w'),\n })\n\n stream.on('error', (error: Error) => {\n logger.error(error.message)\n onStreamError()\n })\n\n return {\n directory,\n stream,\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/find_class_or_plugin.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/find_class_or_plugin.d.ts new file mode 100644 index 00000000..1e47c298 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/find_class_or_plugin.d.ts @@ -0,0 +1 @@ +export declare function findClassOrPlugin(imported: any): any; diff --git a/node_modules/@cucumber/cucumber/lib/formatter/find_class_or_plugin.js b/node_modules/@cucumber/cucumber/lib/formatter/find_class_or_plugin.js new file mode 100644 index 00000000..c6a08461 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/find_class_or_plugin.js @@ -0,0 +1,24 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.findClassOrPlugin = findClassOrPlugin; +const value_checker_1 = require("../value_checker"); +function findClassOrPlugin(imported) { + return findRecursive(imported, 3); +} +function findRecursive(thing, depth) { + if ((0, value_checker_1.doesNotHaveValue)(thing)) { + return null; + } + if (typeof thing === 'function') { + return thing; + } + if (typeof thing === 'object' && thing.type === 'formatter') { + return thing; + } + depth--; + if (depth > 0) { + return findRecursive(thing.default, depth); + } + return null; +} +//# sourceMappingURL=find_class_or_plugin.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/find_class_or_plugin.js.map b/node_modules/@cucumber/cucumber/lib/formatter/find_class_or_plugin.js.map new file mode 100644 index 00000000..2ccd24db --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/find_class_or_plugin.js.map @@ -0,0 +1 @@ +{"version":3,"file":"find_class_or_plugin.js","sourceRoot":"","sources":["../../src/formatter/find_class_or_plugin.ts"],"names":[],"mappings":";;AAEA,8CAEC;AAJD,oDAAmD;AAEnD,SAAgB,iBAAiB,CAAC,QAAa;IAC7C,OAAO,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;AACnC,CAAC;AAED,SAAS,aAAa,CAAC,KAAU,EAAE,KAAa;IAC9C,IAAI,IAAA,gCAAgB,EAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;QAChC,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC5D,OAAO,KAAK,CAAA;IACd,CAAC;IACD,KAAK,EAAE,CAAA;IACP,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,OAAO,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IAC5C,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC","sourcesContent":["import { doesNotHaveValue } from '../value_checker'\n\nexport function findClassOrPlugin(imported: any) {\n return findRecursive(imported, 3)\n}\n\nfunction findRecursive(thing: any, depth: number): any {\n if (doesNotHaveValue(thing)) {\n return null\n }\n if (typeof thing === 'function') {\n return thing\n }\n if (typeof thing === 'object' && thing.type === 'formatter') {\n return thing\n }\n depth--\n if (depth > 0) {\n return findRecursive(thing.default, depth)\n }\n return null\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/get_color_fns.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/get_color_fns.d.ts new file mode 100644 index 00000000..83ef29c8 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/get_color_fns.d.ts @@ -0,0 +1,13 @@ +import { Writable } from 'node:stream'; +import { TestStepResultStatus } from '@cucumber/messages'; +export type IColorFn = (text: string) => string; +export interface IColorFns { + forStatus: (status: TestStepResultStatus) => IColorFn; + location: IColorFn; + tag: IColorFn; + diffAdded: IColorFn; + diffRemoved: IColorFn; + errorMessage: IColorFn; + errorStack: IColorFn; +} +export default function getColorFns(stream: Writable, env: NodeJS.ProcessEnv, enabled?: boolean): IColorFns; diff --git a/node_modules/@cucumber/cucumber/lib/formatter/get_color_fns.js b/node_modules/@cucumber/cucumber/lib/formatter/get_color_fns.js new file mode 100644 index 00000000..9f1795ce --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/get_color_fns.js @@ -0,0 +1,56 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = getColorFns; +const chalk_1 = __importDefault(require("chalk")); +const supports_color_1 = require("supports-color"); +const value_checker_1 = require("../value_checker"); +function getColorFns(stream, env, enabled) { + const support = detectSupport(stream, env, enabled); + if (support) { + const chalkInstance = new chalk_1.default.Instance(support); + return { + forStatus(status) { + return { + AMBIGUOUS: chalkInstance.red.bind(chalk_1.default), + FAILED: chalkInstance.red.bind(chalk_1.default), + PASSED: chalkInstance.green.bind(chalk_1.default), + PENDING: chalkInstance.yellow.bind(chalk_1.default), + SKIPPED: chalkInstance.cyan.bind(chalk_1.default), + UNDEFINED: chalkInstance.yellow.bind(chalk_1.default), + UNKNOWN: chalkInstance.yellow.bind(chalk_1.default), + }[status]; + }, + location: chalkInstance.gray.bind(chalk_1.default), + tag: chalkInstance.cyan.bind(chalk_1.default), + diffAdded: chalkInstance.green.bind(chalk_1.default), + diffRemoved: chalkInstance.red.bind(chalk_1.default), + errorMessage: chalkInstance.red.bind(chalk_1.default), + errorStack: chalkInstance.grey.bind(chalk_1.default), + }; + } + else { + return { + forStatus(_status) { + return (x) => x; + }, + location: (x) => x, + tag: (x) => x, + diffAdded: (x) => x, + diffRemoved: (x) => x, + errorMessage: (x) => x, + errorStack: (x) => x, + }; + } +} +function detectSupport(stream, env, enabled) { + const support = (0, supports_color_1.supportsColor)(stream); + // if we find FORCE_COLOR, we can let the supports-color library handle that + if ('FORCE_COLOR' in env || (0, value_checker_1.doesNotHaveValue)(enabled)) { + return support; + } + return enabled ? support || { level: 1 } : false; +} +//# sourceMappingURL=get_color_fns.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/get_color_fns.js.map b/node_modules/@cucumber/cucumber/lib/formatter/get_color_fns.js.map new file mode 100644 index 00000000..2c59cb6a --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/get_color_fns.js.map @@ -0,0 +1 @@ +{"version":3,"file":"get_color_fns.js","sourceRoot":"","sources":["../../src/formatter/get_color_fns.ts"],"names":[],"mappings":";;;;;AAkBA,8BAwCC;AAzDD,kDAAyB;AACzB,mDAAyD;AAEzD,oDAAmD;AAcnD,SAAwB,WAAW,CACjC,MAAgB,EAChB,GAAsB,EACtB,OAAiB;IAEjB,MAAM,OAAO,GAAc,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,CAAA;IAC9D,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,aAAa,GAAG,IAAI,eAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QACjD,OAAO;YACL,SAAS,CAAC,MAA4B;gBACpC,OAAO;oBACL,SAAS,EAAE,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,eAAK,CAAC;oBACxC,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,eAAK,CAAC;oBACrC,MAAM,EAAE,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,eAAK,CAAC;oBACvC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,eAAK,CAAC;oBACzC,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,eAAK,CAAC;oBACvC,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,eAAK,CAAC;oBAC3C,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,eAAK,CAAC;iBAC1C,CAAC,MAAM,CAAC,CAAA;YACX,CAAC;YACD,QAAQ,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,eAAK,CAAC;YACxC,GAAG,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,eAAK,CAAC;YACnC,SAAS,EAAE,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,eAAK,CAAC;YAC1C,WAAW,EAAE,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,eAAK,CAAC;YAC1C,YAAY,EAAE,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,eAAK,CAAC;YAC3C,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,eAAK,CAAC;SAC3C,CAAA;IACH,CAAC;SAAM,CAAC;QACN,OAAO;YACL,SAAS,CAAC,OAA6B;gBACrC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;YACjB,CAAC;YACD,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAClB,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACb,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnB,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACrB,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtB,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;SACrB,CAAA;IACH,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CACpB,MAAgB,EAChB,GAAsB,EACtB,OAAiB;IAEjB,MAAM,OAAO,GAAc,IAAA,8BAAa,EAAC,MAAM,CAAC,CAAA;IAChD,4EAA4E;IAC5E,IAAI,aAAa,IAAI,GAAG,IAAI,IAAA,gCAAgB,EAAC,OAAO,CAAC,EAAE,CAAC;QACtD,OAAO,OAAO,CAAA;IAChB,CAAC;IACD,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;AAClD,CAAC","sourcesContent":["import { Writable } from 'node:stream'\nimport chalk from 'chalk'\nimport { ColorInfo, supportsColor } from 'supports-color'\nimport { TestStepResultStatus } from '@cucumber/messages'\nimport { doesNotHaveValue } from '../value_checker'\n\nexport type IColorFn = (text: string) => string\n\nexport interface IColorFns {\n forStatus: (status: TestStepResultStatus) => IColorFn\n location: IColorFn\n tag: IColorFn\n diffAdded: IColorFn\n diffRemoved: IColorFn\n errorMessage: IColorFn\n errorStack: IColorFn\n}\n\nexport default function getColorFns(\n stream: Writable,\n env: NodeJS.ProcessEnv,\n enabled?: boolean\n): IColorFns {\n const support: ColorInfo = detectSupport(stream, env, enabled)\n if (support) {\n const chalkInstance = new chalk.Instance(support)\n return {\n forStatus(status: TestStepResultStatus) {\n return {\n AMBIGUOUS: chalkInstance.red.bind(chalk),\n FAILED: chalkInstance.red.bind(chalk),\n PASSED: chalkInstance.green.bind(chalk),\n PENDING: chalkInstance.yellow.bind(chalk),\n SKIPPED: chalkInstance.cyan.bind(chalk),\n UNDEFINED: chalkInstance.yellow.bind(chalk),\n UNKNOWN: chalkInstance.yellow.bind(chalk),\n }[status]\n },\n location: chalkInstance.gray.bind(chalk),\n tag: chalkInstance.cyan.bind(chalk),\n diffAdded: chalkInstance.green.bind(chalk),\n diffRemoved: chalkInstance.red.bind(chalk),\n errorMessage: chalkInstance.red.bind(chalk),\n errorStack: chalkInstance.grey.bind(chalk),\n }\n } else {\n return {\n forStatus(_status: TestStepResultStatus) {\n return (x) => x\n },\n location: (x) => x,\n tag: (x) => x,\n diffAdded: (x) => x,\n diffRemoved: (x) => x,\n errorMessage: (x) => x,\n errorStack: (x) => x,\n }\n }\n}\n\nfunction detectSupport(\n stream: Writable,\n env: NodeJS.ProcessEnv,\n enabled?: boolean\n): ColorInfo {\n const support: ColorInfo = supportsColor(stream)\n // if we find FORCE_COLOR, we can let the supports-color library handle that\n if ('FORCE_COLOR' in env || doesNotHaveValue(enabled)) {\n return support\n }\n return enabled ? support || { level: 1 } : false\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/duration_helpers.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/helpers/duration_helpers.d.ts new file mode 100644 index 00000000..72a896d0 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/duration_helpers.d.ts @@ -0,0 +1,2 @@ +import { Duration } from '@cucumber/messages'; +export declare function durationToNanoseconds(duration: Duration): number; diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/duration_helpers.js b/node_modules/@cucumber/cucumber/lib/formatter/helpers/duration_helpers.js new file mode 100644 index 00000000..1916f7e8 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/duration_helpers.js @@ -0,0 +1,8 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.durationToNanoseconds = durationToNanoseconds; +const NANOS_IN_SECOND = 1_000_000_000; +function durationToNanoseconds(duration) { + return Math.floor(duration.seconds * NANOS_IN_SECOND + duration.nanos); +} +//# sourceMappingURL=duration_helpers.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/duration_helpers.js.map b/node_modules/@cucumber/cucumber/lib/formatter/helpers/duration_helpers.js.map new file mode 100644 index 00000000..f513a80a --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/duration_helpers.js.map @@ -0,0 +1 @@ +{"version":3,"file":"duration_helpers.js","sourceRoot":"","sources":["../../../src/formatter/helpers/duration_helpers.ts"],"names":[],"mappings":";;AAIA,sDAEC;AAJD,MAAM,eAAe,GAAG,aAAa,CAAA;AAErC,SAAgB,qBAAqB,CAAC,QAAkB;IACtD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,GAAG,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;AACxE,CAAC","sourcesContent":["import { Duration } from '@cucumber/messages'\n\nconst NANOS_IN_SECOND = 1_000_000_000\n\nexport function durationToNanoseconds(duration: Duration): number {\n return Math.floor(duration.seconds * NANOS_IN_SECOND + duration.nanos)\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/event_data_collector.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/helpers/event_data_collector.d.ts new file mode 100644 index 00000000..26e75557 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/event_data_collector.d.ts @@ -0,0 +1,29 @@ +import { EventEmitter } from 'node:events'; +import * as messages from '@cucumber/messages'; +export interface ITestCaseAttempt { + attempt: number; + willBeRetried: boolean; + gherkinDocument: messages.GherkinDocument; + pickle: messages.Pickle; + stepAttachments: Record; + stepResults: Record; + testCase: messages.TestCase; + worstTestStepResult: messages.TestStepResult; +} +export default class EventDataCollector { + private gherkinDocumentMap; + private pickleMap; + private testCaseMap; + private testCaseAttemptDataMap; + readonly undefinedParameterTypes: messages.UndefinedParameterType[]; + constructor(eventBroadcaster: EventEmitter); + getGherkinDocument(uri: string): messages.GherkinDocument; + getPickle(pickleId: string): messages.Pickle; + getTestCaseAttempts(): ITestCaseAttempt[]; + getTestCaseAttempt(testCaseStartedId: string): ITestCaseAttempt; + parseEnvelope(envelope: messages.Envelope): void; + private initTestCaseAttempt; + storeAttachment(attachment: messages.Attachment): void; + storeTestStepResult({ testCaseStartedId, testStepId, testStepResult, }: messages.TestStepFinished): void; + storeTestCaseResult({ testCaseStartedId, willBeRetried, }: messages.TestCaseFinished): void; +} diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/event_data_collector.js b/node_modules/@cucumber/cucumber/lib/formatter/helpers/event_data_collector.js new file mode 100644 index 00000000..dd1df65c --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/event_data_collector.js @@ -0,0 +1,135 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +const messages = __importStar(require("@cucumber/messages")); +const value_checker_1 = require("../../value_checker"); +class EventDataCollector { + gherkinDocumentMap = {}; + pickleMap = {}; + testCaseMap = {}; + testCaseAttemptDataMap = {}; + undefinedParameterTypes = []; + constructor(eventBroadcaster) { + eventBroadcaster.on('envelope', this.parseEnvelope.bind(this)); + } + getGherkinDocument(uri) { + return this.gherkinDocumentMap[uri]; + } + getPickle(pickleId) { + return this.pickleMap[pickleId]; + } + getTestCaseAttempts() { + return Object.keys(this.testCaseAttemptDataMap).map((testCaseStartedId) => { + return this.getTestCaseAttempt(testCaseStartedId); + }); + } + getTestCaseAttempt(testCaseStartedId) { + const testCaseAttemptData = this.testCaseAttemptDataMap[testCaseStartedId]; + const testCase = this.testCaseMap[testCaseAttemptData.testCaseId]; + const pickle = this.pickleMap[testCase.pickleId]; + return { + gherkinDocument: this.gherkinDocumentMap[pickle.uri], + pickle, + testCase, + attempt: testCaseAttemptData.attempt, + willBeRetried: testCaseAttemptData.willBeRetried, + stepAttachments: testCaseAttemptData.stepAttachments, + stepResults: testCaseAttemptData.stepResults, + worstTestStepResult: testCaseAttemptData.worstTestStepResult, + }; + } + parseEnvelope(envelope) { + if ((0, value_checker_1.doesHaveValue)(envelope.gherkinDocument)) { + this.gherkinDocumentMap[envelope.gherkinDocument.uri] = + envelope.gherkinDocument; + } + else if ((0, value_checker_1.doesHaveValue)(envelope.pickle)) { + this.pickleMap[envelope.pickle.id] = envelope.pickle; + } + else if ((0, value_checker_1.doesHaveValue)(envelope.undefinedParameterType)) { + this.undefinedParameterTypes.push(envelope.undefinedParameterType); + } + else if ((0, value_checker_1.doesHaveValue)(envelope.testCase)) { + this.testCaseMap[envelope.testCase.id] = envelope.testCase; + } + else if ((0, value_checker_1.doesHaveValue)(envelope.testCaseStarted)) { + this.initTestCaseAttempt(envelope.testCaseStarted); + } + else if ((0, value_checker_1.doesHaveValue)(envelope.attachment)) { + this.storeAttachment(envelope.attachment); + } + else if ((0, value_checker_1.doesHaveValue)(envelope.testStepFinished)) { + this.storeTestStepResult(envelope.testStepFinished); + } + else if ((0, value_checker_1.doesHaveValue)(envelope.testCaseFinished)) { + this.storeTestCaseResult(envelope.testCaseFinished); + } + } + initTestCaseAttempt(testCaseStarted) { + this.testCaseAttemptDataMap[testCaseStarted.id] = { + attempt: testCaseStarted.attempt, + willBeRetried: false, + testCaseId: testCaseStarted.testCaseId, + stepAttachments: {}, + stepResults: {}, + worstTestStepResult: { + duration: { seconds: 0, nanos: 0 }, + status: messages.TestStepResultStatus.UNKNOWN, + }, + }; + } + storeAttachment(attachment) { + const { testCaseStartedId, testStepId } = attachment; + if ((0, value_checker_1.doesHaveValue)(testCaseStartedId) && (0, value_checker_1.doesHaveValue)(testStepId)) { + const { stepAttachments } = this.testCaseAttemptDataMap[testCaseStartedId]; + if ((0, value_checker_1.doesNotHaveValue)(stepAttachments[testStepId])) { + stepAttachments[testStepId] = []; + } + stepAttachments[testStepId].push(attachment); + } + } + storeTestStepResult({ testCaseStartedId, testStepId, testStepResult, }) { + this.testCaseAttemptDataMap[testCaseStartedId].stepResults[testStepId] = + testStepResult; + } + storeTestCaseResult({ testCaseStartedId, willBeRetried, }) { + const stepResults = Object.values(this.testCaseAttemptDataMap[testCaseStartedId].stepResults); + this.testCaseAttemptDataMap[testCaseStartedId].worstTestStepResult = + messages.getWorstTestStepResult(stepResults); + this.testCaseAttemptDataMap[testCaseStartedId].willBeRetried = willBeRetried; + } +} +exports.default = EventDataCollector; +//# sourceMappingURL=event_data_collector.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/event_data_collector.js.map b/node_modules/@cucumber/cucumber/lib/formatter/helpers/event_data_collector.js.map new file mode 100644 index 00000000..a05c7dc7 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/event_data_collector.js.map @@ -0,0 +1 @@ +{"version":3,"file":"event_data_collector.js","sourceRoot":"","sources":["../../../src/formatter/helpers/event_data_collector.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventEmitter } from 'node:events'\nimport * as messages from '@cucumber/messages'\nimport { doesHaveValue, doesNotHaveValue } from '../../value_checker'\n\ninterface ITestCaseAttemptData {\n attempt: number\n willBeRetried: boolean\n testCaseId: string\n stepAttachments: Record\n stepResults: Record\n worstTestStepResult: messages.TestStepResult\n}\n\nexport interface ITestCaseAttempt {\n attempt: number\n willBeRetried: boolean\n gherkinDocument: messages.GherkinDocument\n pickle: messages.Pickle\n stepAttachments: Record\n stepResults: Record\n testCase: messages.TestCase\n worstTestStepResult: messages.TestStepResult\n}\n\nexport default class EventDataCollector {\n private gherkinDocumentMap: Record = {}\n private pickleMap: Record = {}\n private testCaseMap: Record = {}\n private testCaseAttemptDataMap: Record = {}\n readonly undefinedParameterTypes: messages.UndefinedParameterType[] = []\n\n constructor(eventBroadcaster: EventEmitter) {\n eventBroadcaster.on('envelope', this.parseEnvelope.bind(this))\n }\n\n getGherkinDocument(uri: string): messages.GherkinDocument {\n return this.gherkinDocumentMap[uri]\n }\n\n getPickle(pickleId: string): messages.Pickle {\n return this.pickleMap[pickleId]\n }\n\n getTestCaseAttempts(): ITestCaseAttempt[] {\n return Object.keys(this.testCaseAttemptDataMap).map((testCaseStartedId) => {\n return this.getTestCaseAttempt(testCaseStartedId)\n })\n }\n\n getTestCaseAttempt(testCaseStartedId: string): ITestCaseAttempt {\n const testCaseAttemptData = this.testCaseAttemptDataMap[testCaseStartedId]\n const testCase = this.testCaseMap[testCaseAttemptData.testCaseId]\n const pickle = this.pickleMap[testCase.pickleId]\n return {\n gherkinDocument: this.gherkinDocumentMap[pickle.uri],\n pickle,\n testCase,\n attempt: testCaseAttemptData.attempt,\n willBeRetried: testCaseAttemptData.willBeRetried,\n stepAttachments: testCaseAttemptData.stepAttachments,\n stepResults: testCaseAttemptData.stepResults,\n worstTestStepResult: testCaseAttemptData.worstTestStepResult,\n }\n }\n\n parseEnvelope(envelope: messages.Envelope): void {\n if (doesHaveValue(envelope.gherkinDocument)) {\n this.gherkinDocumentMap[envelope.gherkinDocument.uri] =\n envelope.gherkinDocument\n } else if (doesHaveValue(envelope.pickle)) {\n this.pickleMap[envelope.pickle.id] = envelope.pickle\n } else if (doesHaveValue(envelope.undefinedParameterType)) {\n this.undefinedParameterTypes.push(envelope.undefinedParameterType)\n } else if (doesHaveValue(envelope.testCase)) {\n this.testCaseMap[envelope.testCase.id] = envelope.testCase\n } else if (doesHaveValue(envelope.testCaseStarted)) {\n this.initTestCaseAttempt(envelope.testCaseStarted)\n } else if (doesHaveValue(envelope.attachment)) {\n this.storeAttachment(envelope.attachment)\n } else if (doesHaveValue(envelope.testStepFinished)) {\n this.storeTestStepResult(envelope.testStepFinished)\n } else if (doesHaveValue(envelope.testCaseFinished)) {\n this.storeTestCaseResult(envelope.testCaseFinished)\n }\n }\n\n private initTestCaseAttempt(testCaseStarted: messages.TestCaseStarted): void {\n this.testCaseAttemptDataMap[testCaseStarted.id] = {\n attempt: testCaseStarted.attempt,\n willBeRetried: false,\n testCaseId: testCaseStarted.testCaseId,\n stepAttachments: {},\n stepResults: {},\n worstTestStepResult: {\n duration: { seconds: 0, nanos: 0 },\n status: messages.TestStepResultStatus.UNKNOWN,\n },\n }\n }\n\n storeAttachment(attachment: messages.Attachment): void {\n const { testCaseStartedId, testStepId } = attachment\n if (doesHaveValue(testCaseStartedId) && doesHaveValue(testStepId)) {\n const { stepAttachments } = this.testCaseAttemptDataMap[testCaseStartedId]\n if (doesNotHaveValue(stepAttachments[testStepId])) {\n stepAttachments[testStepId] = []\n }\n stepAttachments[testStepId].push(attachment)\n }\n }\n\n storeTestStepResult({\n testCaseStartedId,\n testStepId,\n testStepResult,\n }: messages.TestStepFinished): void {\n this.testCaseAttemptDataMap[testCaseStartedId].stepResults[testStepId] =\n testStepResult\n }\n\n storeTestCaseResult({\n testCaseStartedId,\n willBeRetried,\n }: messages.TestCaseFinished): void {\n const stepResults = Object.values(\n this.testCaseAttemptDataMap[testCaseStartedId].stepResults\n )\n this.testCaseAttemptDataMap[testCaseStartedId].worstTestStepResult =\n messages.getWorstTestStepResult(stepResults)\n this.testCaseAttemptDataMap[testCaseStartedId].willBeRetried = willBeRetried\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/formatters.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/helpers/formatters.d.ts new file mode 100644 index 00000000..e93f0c14 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/formatters.d.ts @@ -0,0 +1,5 @@ +import Formatter from '../.'; +declare const Formatters: { + getFormatters(): Record; +}; +export default Formatters; diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/formatters.js b/node_modules/@cucumber/cucumber/lib/formatter/helpers/formatters.js new file mode 100644 index 00000000..1c6454a5 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/formatters.js @@ -0,0 +1,29 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const json_formatter_1 = __importDefault(require("../json_formatter")); +const progress_bar_formatter_1 = __importDefault(require("../progress_bar_formatter")); +const progress_formatter_1 = __importDefault(require("../progress_formatter")); +const rerun_formatter_1 = __importDefault(require("../rerun_formatter")); +const snippets_formatter_1 = __importDefault(require("../snippets_formatter")); +const summary_formatter_1 = __importDefault(require("../summary_formatter")); +const usage_formatter_1 = __importDefault(require("../usage_formatter")); +const usage_json_formatter_1 = __importDefault(require("../usage_json_formatter")); +const Formatters = { + getFormatters() { + return { + json: json_formatter_1.default, + progress: progress_formatter_1.default, + 'progress-bar': progress_bar_formatter_1.default, + rerun: rerun_formatter_1.default, + snippets: snippets_formatter_1.default, + summary: summary_formatter_1.default, + usage: usage_formatter_1.default, + 'usage-json': usage_json_formatter_1.default, + }; + }, +}; +exports.default = Formatters; +//# sourceMappingURL=formatters.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/formatters.js.map b/node_modules/@cucumber/cucumber/lib/formatter/helpers/formatters.js.map new file mode 100644 index 00000000..67e6ec7d --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/formatters.js.map @@ -0,0 +1 @@ +{"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../../src/formatter/helpers/formatters.ts"],"names":[],"mappings":";;;;;AACA,uEAA6C;AAC7C,uFAA4D;AAC5D,+EAAqD;AACrD,yEAA+C;AAC/C,+EAAqD;AACrD,6EAAmD;AACnD,yEAA+C;AAC/C,mFAAwD;AAExD,MAAM,UAAU,GAAG;IACjB,aAAa;QACX,OAAO;YACL,IAAI,EAAE,wBAAa;YACnB,QAAQ,EAAE,4BAAiB;YAC3B,cAAc,EAAE,gCAAoB;YACpC,KAAK,EAAE,yBAAc;YACrB,QAAQ,EAAE,4BAAiB;YAC3B,OAAO,EAAE,2BAAgB;YACzB,KAAK,EAAE,yBAAc;YACrB,YAAY,EAAE,8BAAkB;SACjC,CAAA;IACH,CAAC;CACF,CAAA;AAED,kBAAe,UAAU,CAAA","sourcesContent":["import Formatter from '../.'\nimport JsonFormatter from '../json_formatter'\nimport ProgressBarFormatter from '../progress_bar_formatter'\nimport ProgressFormatter from '../progress_formatter'\nimport RerunFormatter from '../rerun_formatter'\nimport SnippetsFormatter from '../snippets_formatter'\nimport SummaryFormatter from '../summary_formatter'\nimport UsageFormatter from '../usage_formatter'\nimport UsageJsonFormatter from '../usage_json_formatter'\n\nconst Formatters = {\n getFormatters(): Record {\n return {\n json: JsonFormatter,\n progress: ProgressFormatter,\n 'progress-bar': ProgressBarFormatter,\n rerun: RerunFormatter,\n snippets: SnippetsFormatter,\n summary: SummaryFormatter,\n usage: UsageFormatter,\n 'usage-json': UsageJsonFormatter,\n }\n },\n}\n\nexport default Formatters\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/gherkin_document_parser.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/helpers/gherkin_document_parser.d.ts new file mode 100644 index 00000000..ddf50837 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/gherkin_document_parser.d.ts @@ -0,0 +1,5 @@ +import * as messages from '@cucumber/messages'; +export declare function getGherkinStepMap(gherkinDocument: messages.GherkinDocument): Record; +export declare function getGherkinScenarioMap(gherkinDocument: messages.GherkinDocument): Record; +export declare function getGherkinExampleRuleMap(gherkinDocument: messages.GherkinDocument): Record; +export declare function getGherkinScenarioLocationMap(gherkinDocument: messages.GherkinDocument): Record; diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/gherkin_document_parser.js b/node_modules/@cucumber/cucumber/lib/formatter/helpers/gherkin_document_parser.js new file mode 100644 index 00000000..8b42215d --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/gherkin_document_parser.js @@ -0,0 +1,65 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getGherkinStepMap = getGherkinStepMap; +exports.getGherkinScenarioMap = getGherkinScenarioMap; +exports.getGherkinExampleRuleMap = getGherkinExampleRuleMap; +exports.getGherkinScenarioLocationMap = getGherkinScenarioLocationMap; +const value_checker_1 = require("../../value_checker"); +function getGherkinStepMap(gherkinDocument) { + const result = {}; + gherkinDocument.feature.children + .map(extractStepContainers) + .flat() + .forEach((x) => x.steps.forEach((step) => (result[step.id] = step))); + return result; +} +function extractStepContainers(child) { + if ((0, value_checker_1.doesHaveValue)(child.background)) { + return [child.background]; + } + else if ((0, value_checker_1.doesHaveValue)(child.rule)) { + return child.rule.children.map((ruleChild) => (0, value_checker_1.doesHaveValue)(ruleChild.background) + ? ruleChild.background + : ruleChild.scenario); + } + return [child.scenario]; +} +function getGherkinScenarioMap(gherkinDocument) { + const result = {}; + gherkinDocument.feature.children + .map((child) => { + if ((0, value_checker_1.doesHaveValue)(child.rule)) { + return child.rule.children; + } + return [child]; + }) + .flat() + .forEach((x) => { + if (x.scenario != null) { + result[x.scenario.id] = x.scenario; + } + }); + return result; +} +function getGherkinExampleRuleMap(gherkinDocument) { + const result = {}; + gherkinDocument.feature.children + .filter((x) => x.rule != null) + .forEach((x) => x.rule.children + .filter((child) => (0, value_checker_1.doesHaveValue)(child.scenario)) + .forEach((child) => (result[child.scenario.id] = x.rule))); + return result; +} +function getGherkinScenarioLocationMap(gherkinDocument) { + const locationMap = {}; + const scenarioMap = getGherkinScenarioMap(gherkinDocument); + Object.keys(scenarioMap).forEach((id) => { + const scenario = scenarioMap[id]; + locationMap[id] = scenario.location; + if ((0, value_checker_1.doesHaveValue)(scenario.examples)) { + scenario.examples.forEach((x) => x.tableBody.forEach((tableRow) => (locationMap[tableRow.id] = tableRow.location))); + } + }); + return locationMap; +} +//# sourceMappingURL=gherkin_document_parser.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/gherkin_document_parser.js.map b/node_modules/@cucumber/cucumber/lib/formatter/helpers/gherkin_document_parser.js.map new file mode 100644 index 00000000..8a52dd35 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/gherkin_document_parser.js.map @@ -0,0 +1 @@ +{"version":3,"file":"gherkin_document_parser.js","sourceRoot":"","sources":["../../../src/formatter/helpers/gherkin_document_parser.ts"],"names":[],"mappings":"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","sourcesContent":["import * as messages from '@cucumber/messages'\nimport { doesHaveValue } from '../../value_checker'\n\nexport function getGherkinStepMap(\n gherkinDocument: messages.GherkinDocument\n): Record {\n const result: Record = {}\n gherkinDocument.feature.children\n .map(extractStepContainers)\n .flat()\n .forEach((x) =>\n x.steps.forEach((step: messages.Step) => (result[step.id] = step))\n )\n return result\n}\n\nfunction extractStepContainers(\n child: messages.FeatureChild\n): Array {\n if (doesHaveValue(child.background)) {\n return [child.background]\n } else if (doesHaveValue(child.rule)) {\n return child.rule.children.map((ruleChild) =>\n doesHaveValue(ruleChild.background)\n ? ruleChild.background\n : ruleChild.scenario\n )\n }\n return [child.scenario]\n}\n\nexport function getGherkinScenarioMap(\n gherkinDocument: messages.GherkinDocument\n): Record {\n const result: Record = {}\n gherkinDocument.feature.children\n .map((child: messages.FeatureChild) => {\n if (doesHaveValue(child.rule)) {\n return child.rule.children\n }\n return [child]\n })\n .flat()\n .forEach((x) => {\n if (x.scenario != null) {\n result[x.scenario.id] = x.scenario\n }\n })\n return result\n}\n\nexport function getGherkinExampleRuleMap(\n gherkinDocument: messages.GherkinDocument\n): Record {\n const result: Record = {}\n gherkinDocument.feature.children\n .filter((x) => x.rule != null)\n .forEach((x) =>\n x.rule.children\n .filter((child) => doesHaveValue(child.scenario))\n .forEach((child) => (result[child.scenario.id] = x.rule))\n )\n return result\n}\n\nexport function getGherkinScenarioLocationMap(\n gherkinDocument: messages.GherkinDocument\n): Record {\n const locationMap: Record = {}\n const scenarioMap: Record =\n getGherkinScenarioMap(gherkinDocument)\n Object.keys(scenarioMap).forEach((id) => {\n const scenario = scenarioMap[id]\n locationMap[id] = scenario.location\n if (doesHaveValue(scenario.examples)) {\n scenario.examples.forEach((x) =>\n x.tableBody.forEach(\n (tableRow) => (locationMap[tableRow.id] = tableRow.location)\n )\n )\n }\n })\n return locationMap\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/index.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/helpers/index.d.ts new file mode 100644 index 00000000..52958260 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/index.d.ts @@ -0,0 +1,10 @@ +import * as GherkinDocumentParser from './gherkin_document_parser'; +import * as PickleParser from './pickle_parser'; +export { parseTestCaseAttempt } from './test_case_attempt_parser'; +export { default as EventDataCollector } from './event_data_collector'; +export { KeywordType, getStepKeywordType } from './keyword_type'; +export { formatIssue, isWarning, isFailure, isIssue } from './issue_helpers'; +export { formatLocation } from './location_helpers'; +export { formatSummary } from './summary_helpers'; +export { getUsage } from './usage_helpers'; +export { GherkinDocumentParser, PickleParser }; diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/index.js b/node_modules/@cucumber/cucumber/lib/formatter/helpers/index.js new file mode 100644 index 00000000..26fde02e --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/index.js @@ -0,0 +1,62 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PickleParser = exports.GherkinDocumentParser = exports.getUsage = exports.formatSummary = exports.formatLocation = exports.isIssue = exports.isFailure = exports.isWarning = exports.formatIssue = exports.getStepKeywordType = exports.KeywordType = exports.EventDataCollector = exports.parseTestCaseAttempt = void 0; +const GherkinDocumentParser = __importStar(require("./gherkin_document_parser")); +exports.GherkinDocumentParser = GherkinDocumentParser; +const PickleParser = __importStar(require("./pickle_parser")); +exports.PickleParser = PickleParser; +var test_case_attempt_parser_1 = require("./test_case_attempt_parser"); +Object.defineProperty(exports, "parseTestCaseAttempt", { enumerable: true, get: function () { return test_case_attempt_parser_1.parseTestCaseAttempt; } }); +var event_data_collector_1 = require("./event_data_collector"); +Object.defineProperty(exports, "EventDataCollector", { enumerable: true, get: function () { return __importDefault(event_data_collector_1).default; } }); +var keyword_type_1 = require("./keyword_type"); +Object.defineProperty(exports, "KeywordType", { enumerable: true, get: function () { return keyword_type_1.KeywordType; } }); +Object.defineProperty(exports, "getStepKeywordType", { enumerable: true, get: function () { return keyword_type_1.getStepKeywordType; } }); +var issue_helpers_1 = require("./issue_helpers"); +Object.defineProperty(exports, "formatIssue", { enumerable: true, get: function () { return issue_helpers_1.formatIssue; } }); +Object.defineProperty(exports, "isWarning", { enumerable: true, get: function () { return issue_helpers_1.isWarning; } }); +Object.defineProperty(exports, "isFailure", { enumerable: true, get: function () { return issue_helpers_1.isFailure; } }); +Object.defineProperty(exports, "isIssue", { enumerable: true, get: function () { return issue_helpers_1.isIssue; } }); +var location_helpers_1 = require("./location_helpers"); +Object.defineProperty(exports, "formatLocation", { enumerable: true, get: function () { return location_helpers_1.formatLocation; } }); +var summary_helpers_1 = require("./summary_helpers"); +Object.defineProperty(exports, "formatSummary", { enumerable: true, get: function () { return summary_helpers_1.formatSummary; } }); +var usage_helpers_1 = require("./usage_helpers"); +Object.defineProperty(exports, "getUsage", { enumerable: true, get: function () { return usage_helpers_1.getUsage; } }); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/index.js.map b/node_modules/@cucumber/cucumber/lib/formatter/helpers/index.js.map new file mode 100644 index 00000000..d8328572 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/formatter/helpers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iFAAkE;AAUzD,sDAAqB;AAT9B,8DAA+C;AASf,oCAAY;AAP5C,uEAAiE;AAAxD,gIAAA,oBAAoB,OAAA;AAC7B,+DAAsE;AAA7D,2IAAA,OAAO,OAAsB;AACtC,+CAAgE;AAAvD,2GAAA,WAAW,OAAA;AAAE,kHAAA,kBAAkB,OAAA;AACxC,iDAA4E;AAAnE,4GAAA,WAAW,OAAA;AAAE,0GAAA,SAAS,OAAA;AAAE,0GAAA,SAAS,OAAA;AAAE,wGAAA,OAAO,OAAA;AACnD,uDAAmD;AAA1C,kHAAA,cAAc,OAAA;AACvB,qDAAiD;AAAxC,gHAAA,aAAa,OAAA;AACtB,iDAA0C;AAAjC,yGAAA,QAAQ,OAAA","sourcesContent":["import * as GherkinDocumentParser from './gherkin_document_parser'\nimport * as PickleParser from './pickle_parser'\n\nexport { parseTestCaseAttempt } from './test_case_attempt_parser'\nexport { default as EventDataCollector } from './event_data_collector'\nexport { KeywordType, getStepKeywordType } from './keyword_type'\nexport { formatIssue, isWarning, isFailure, isIssue } from './issue_helpers'\nexport { formatLocation } from './location_helpers'\nexport { formatSummary } from './summary_helpers'\nexport { getUsage } from './usage_helpers'\nexport { GherkinDocumentParser, PickleParser }\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/issue_helpers.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/helpers/issue_helpers.d.ts new file mode 100644 index 00000000..3c6c3fd6 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/issue_helpers.d.ts @@ -0,0 +1,19 @@ +import * as messages from '@cucumber/messages'; +import { IColorFns } from '../get_color_fns'; +import StepDefinitionSnippetBuilder from '../step_definition_snippet_builder'; +import { SupportCodeLibrary } from '../../support_code_library_builder/types'; +import { ITestCaseAttempt } from './event_data_collector'; +export declare function isFailure(result: messages.TestStepResult, willBeRetried?: boolean): boolean; +export declare function isWarning(result: messages.TestStepResult, willBeRetried?: boolean): boolean; +export declare function isIssue(result: messages.TestStepResult): boolean; +export interface IFormatIssueRequest { + colorFns: IColorFns; + number: number; + snippetBuilder: StepDefinitionSnippetBuilder; + testCaseAttempt: ITestCaseAttempt; + supportCodeLibrary: SupportCodeLibrary; + printAttachments?: boolean; +} +export declare function formatIssue({ colorFns, number, snippetBuilder, testCaseAttempt, supportCodeLibrary, printAttachments, }: IFormatIssueRequest): string; +export declare function formatUndefinedParameterTypes(undefinedParameterTypes: messages.UndefinedParameterType[]): string; +export declare function formatUndefinedParameterType(parameterType: messages.UndefinedParameterType): string; diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/issue_helpers.js b/node_modules/@cucumber/cucumber/lib/formatter/helpers/issue_helpers.js new file mode 100644 index 00000000..e06ed656 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/issue_helpers.js @@ -0,0 +1,58 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isFailure = isFailure; +exports.isWarning = isWarning; +exports.isIssue = isIssue; +exports.formatIssue = formatIssue; +exports.formatUndefinedParameterTypes = formatUndefinedParameterTypes; +exports.formatUndefinedParameterType = formatUndefinedParameterType; +const indent_string_1 = __importDefault(require("indent-string")); +const test_case_attempt_formatter_1 = require("./test_case_attempt_formatter"); +function isFailure(result, willBeRetried = false) { + return (result.status === 'AMBIGUOUS' || + result.status === 'UNDEFINED' || + (result.status === 'FAILED' && !willBeRetried)); +} +function isWarning(result, willBeRetried = false) { + return (result.status === 'PENDING' || (result.status === 'FAILED' && willBeRetried)); +} +function isIssue(result) { + return isFailure(result) || isWarning(result); +} +function formatIssue({ colorFns, number, snippetBuilder, testCaseAttempt, supportCodeLibrary, printAttachments = true, }) { + const prefix = `${number.toString()}) `; + const formattedTestCaseAttempt = (0, test_case_attempt_formatter_1.formatTestCaseAttempt)({ + colorFns, + snippetBuilder, + testCaseAttempt, + supportCodeLibrary, + printAttachments, + }); + const lines = formattedTestCaseAttempt.split('\n'); + const updatedLines = lines.map((line, index) => { + if (index === 0) { + return `${prefix}${line}`; + } + return (0, indent_string_1.default)(line, prefix.length); + }); + return updatedLines.join('\n'); +} +function formatUndefinedParameterTypes(undefinedParameterTypes) { + const output = [`Undefined parameter types:\n\n`]; + const withLatest = {}; + undefinedParameterTypes.forEach((parameterType) => { + withLatest[parameterType.name] = parameterType; + }); + output.push(Object.values(withLatest) + .map((parameterType) => `- ${formatUndefinedParameterType(parameterType)}`) + .join('\n')); + output.push('\n\n'); + return output.join(''); +} +function formatUndefinedParameterType(parameterType) { + return `"${parameterType.name}" e.g. \`${parameterType.expression}\``; +} +//# sourceMappingURL=issue_helpers.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/issue_helpers.js.map b/node_modules/@cucumber/cucumber/lib/formatter/helpers/issue_helpers.js.map new file mode 100644 index 00000000..947882ef --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/issue_helpers.js.map @@ -0,0 +1 @@ +{"version":3,"file":"issue_helpers.js","sourceRoot":"","sources":["../../../src/formatter/helpers/issue_helpers.ts"],"names":[],"mappings":";;;;;AAQA,8BASC;AAED,8BAOC;AAED,0BAEC;AAWD,kCAwBC;AAED,sEAiBC;AAED,oEAIC;AA1FD,kEAAwC;AAKxC,+EAAqE;AAGrE,SAAgB,SAAS,CACvB,MAA+B,EAC/B,gBAAyB,KAAK;IAE9B,OAAO,CACL,MAAM,CAAC,MAAM,KAAK,WAAW;QAC7B,MAAM,CAAC,MAAM,KAAK,WAAW;QAC7B,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,aAAa,CAAC,CAC/C,CAAA;AACH,CAAC;AAED,SAAgB,SAAS,CACvB,MAA+B,EAC/B,gBAAyB,KAAK;IAE9B,OAAO,CACL,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,aAAa,CAAC,CAC7E,CAAA;AACH,CAAC;AAED,SAAgB,OAAO,CAAC,MAA+B;IACrD,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,CAAA;AAC/C,CAAC;AAWD,SAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,MAAM,EACN,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,gBAAgB,GAAG,IAAI,GACH;IACpB,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAA;IACvC,MAAM,wBAAwB,GAAG,IAAA,mDAAqB,EAAC;QACrD,QAAQ;QACR,cAAc;QACd,eAAe;QACf,kBAAkB;QAClB,gBAAgB;KACjB,CAAC,CAAA;IACF,MAAM,KAAK,GAAG,wBAAwB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAClD,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC7C,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,OAAO,GAAG,MAAM,GAAG,IAAI,EAAE,CAAA;QAC3B,CAAC;QACD,OAAO,IAAA,uBAAY,EAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IACF,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAChC,CAAC;AAED,SAAgB,6BAA6B,CAC3C,uBAA0D;IAE1D,MAAM,MAAM,GAAG,CAAC,gCAAgC,CAAC,CAAA;IACjD,MAAM,UAAU,GAAoD,EAAE,CAAA;IACtE,uBAAuB,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,EAAE;QAChD,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,aAAa,CAAA;IAChD,CAAC,CAAC,CAAA;IACF,MAAM,CAAC,IAAI,CACT,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;SACtB,GAAG,CACF,CAAC,aAAa,EAAE,EAAE,CAAC,KAAK,4BAA4B,CAAC,aAAa,CAAC,EAAE,CACtE;SACA,IAAI,CAAC,IAAI,CAAC,CACd,CAAA;IACD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACnB,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AACxB,CAAC;AAED,SAAgB,4BAA4B,CAC1C,aAA8C;IAE9C,OAAO,IAAI,aAAa,CAAC,IAAI,YAAY,aAAa,CAAC,UAAU,IAAI,CAAA;AACvE,CAAC","sourcesContent":["import indentString from 'indent-string'\nimport * as messages from '@cucumber/messages'\nimport { IColorFns } from '../get_color_fns'\nimport StepDefinitionSnippetBuilder from '../step_definition_snippet_builder'\nimport { SupportCodeLibrary } from '../../support_code_library_builder/types'\nimport { formatTestCaseAttempt } from './test_case_attempt_formatter'\nimport { ITestCaseAttempt } from './event_data_collector'\n\nexport function isFailure(\n result: messages.TestStepResult,\n willBeRetried: boolean = false\n): boolean {\n return (\n result.status === 'AMBIGUOUS' ||\n result.status === 'UNDEFINED' ||\n (result.status === 'FAILED' && !willBeRetried)\n )\n}\n\nexport function isWarning(\n result: messages.TestStepResult,\n willBeRetried: boolean = false\n): boolean {\n return (\n result.status === 'PENDING' || (result.status === 'FAILED' && willBeRetried)\n )\n}\n\nexport function isIssue(result: messages.TestStepResult): boolean {\n return isFailure(result) || isWarning(result)\n}\n\nexport interface IFormatIssueRequest {\n colorFns: IColorFns\n number: number\n snippetBuilder: StepDefinitionSnippetBuilder\n testCaseAttempt: ITestCaseAttempt\n supportCodeLibrary: SupportCodeLibrary\n printAttachments?: boolean\n}\n\nexport function formatIssue({\n colorFns,\n number,\n snippetBuilder,\n testCaseAttempt,\n supportCodeLibrary,\n printAttachments = true,\n}: IFormatIssueRequest): string {\n const prefix = `${number.toString()}) `\n const formattedTestCaseAttempt = formatTestCaseAttempt({\n colorFns,\n snippetBuilder,\n testCaseAttempt,\n supportCodeLibrary,\n printAttachments,\n })\n const lines = formattedTestCaseAttempt.split('\\n')\n const updatedLines = lines.map((line, index) => {\n if (index === 0) {\n return `${prefix}${line}`\n }\n return indentString(line, prefix.length)\n })\n return updatedLines.join('\\n')\n}\n\nexport function formatUndefinedParameterTypes(\n undefinedParameterTypes: messages.UndefinedParameterType[]\n): string {\n const output = [`Undefined parameter types:\\n\\n`]\n const withLatest: Record = {}\n undefinedParameterTypes.forEach((parameterType) => {\n withLatest[parameterType.name] = parameterType\n })\n output.push(\n Object.values(withLatest)\n .map(\n (parameterType) => `- ${formatUndefinedParameterType(parameterType)}`\n )\n .join('\\n')\n )\n output.push('\\n\\n')\n return output.join('')\n}\n\nexport function formatUndefinedParameterType(\n parameterType: messages.UndefinedParameterType\n): string {\n return `\"${parameterType.name}\" e.g. \\`${parameterType.expression}\\``\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/keyword_type.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/helpers/keyword_type.d.ts new file mode 100644 index 00000000..e38f64eb --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/keyword_type.d.ts @@ -0,0 +1,11 @@ +export declare enum KeywordType { + Precondition = "precondition", + Event = "event", + Outcome = "outcome" +} +export interface IGetStepKeywordTypeOptions { + keyword: string; + language: string; + previousKeywordType?: KeywordType; +} +export declare function getStepKeywordType({ keyword, language, previousKeywordType, }: IGetStepKeywordTypeOptions): KeywordType; diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/keyword_type.js b/node_modules/@cucumber/cucumber/lib/formatter/helpers/keyword_type.js new file mode 100644 index 00000000..2ebf06c7 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/keyword_type.js @@ -0,0 +1,32 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.KeywordType = void 0; +exports.getStepKeywordType = getStepKeywordType; +const gherkin_1 = require("@cucumber/gherkin"); +const value_checker_1 = require("../../value_checker"); +var KeywordType; +(function (KeywordType) { + KeywordType["Precondition"] = "precondition"; + KeywordType["Event"] = "event"; + KeywordType["Outcome"] = "outcome"; +})(KeywordType || (exports.KeywordType = KeywordType = {})); +function getStepKeywordType({ keyword, language, previousKeywordType, }) { + const dialect = gherkin_1.dialects[language]; + const stepKeywords = ['given', 'when', 'then', 'and', 'but']; + const type = stepKeywords.find((key) => dialect[key].includes(keyword)); + switch (type) { + case 'when': + return KeywordType.Event; + case 'then': + return KeywordType.Outcome; + case 'and': + case 'but': + if ((0, value_checker_1.doesHaveValue)(previousKeywordType)) { + return previousKeywordType; + } + // fallthrough + default: + return KeywordType.Precondition; + } +} +//# sourceMappingURL=keyword_type.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/keyword_type.js.map b/node_modules/@cucumber/cucumber/lib/formatter/helpers/keyword_type.js.map new file mode 100644 index 00000000..8a436f05 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/keyword_type.js.map @@ -0,0 +1 @@ +{"version":3,"file":"keyword_type.js","sourceRoot":"","sources":["../../../src/formatter/helpers/keyword_type.ts"],"names":[],"mappings":";;;AAeA,gDAsBC;AArCD,+CAAqD;AACrD,uDAAmD;AAEnD,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,4CAA6B,CAAA;IAC7B,8BAAe,CAAA;IACf,kCAAmB,CAAA;AACrB,CAAC,EAJW,WAAW,2BAAX,WAAW,QAItB;AAQD,SAAgB,kBAAkB,CAAC,EACjC,OAAO,EACP,QAAQ,EACR,mBAAmB,GACQ;IAC3B,MAAM,OAAO,GAAY,kBAAQ,CAAC,QAAQ,CAAC,CAAA;IAC3C,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAU,CAAA;IACrE,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;IACvE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,OAAO,WAAW,CAAC,KAAK,CAAA;QAC1B,KAAK,MAAM;YACT,OAAO,WAAW,CAAC,OAAO,CAAA;QAC5B,KAAK,KAAK,CAAC;QACX,KAAK,KAAK;YACR,IAAI,IAAA,6BAAa,EAAC,mBAAmB,CAAC,EAAE,CAAC;gBACvC,OAAO,mBAAmB,CAAA;YAC5B,CAAC;QACH,cAAc;QACd;YACE,OAAO,WAAW,CAAC,YAAY,CAAA;IACnC,CAAC;AACH,CAAC","sourcesContent":["import { Dialect, dialects } from '@cucumber/gherkin'\nimport { doesHaveValue } from '../../value_checker'\n\nexport enum KeywordType {\n Precondition = 'precondition',\n Event = 'event',\n Outcome = 'outcome',\n}\n\nexport interface IGetStepKeywordTypeOptions {\n keyword: string\n language: string\n previousKeywordType?: KeywordType\n}\n\nexport function getStepKeywordType({\n keyword,\n language,\n previousKeywordType,\n}: IGetStepKeywordTypeOptions): KeywordType {\n const dialect: Dialect = dialects[language]\n const stepKeywords = ['given', 'when', 'then', 'and', 'but'] as const\n const type = stepKeywords.find((key) => dialect[key].includes(keyword))\n switch (type) {\n case 'when':\n return KeywordType.Event\n case 'then':\n return KeywordType.Outcome\n case 'and':\n case 'but':\n if (doesHaveValue(previousKeywordType)) {\n return previousKeywordType\n }\n // fallthrough\n default:\n return KeywordType.Precondition\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/location_helpers.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/helpers/location_helpers.d.ts new file mode 100644 index 00000000..4936e2de --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/location_helpers.d.ts @@ -0,0 +1,2 @@ +import { ILineAndUri } from '../../types'; +export declare function formatLocation(obj: ILineAndUri, cwd?: string): string; diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/location_helpers.js b/node_modules/@cucumber/cucumber/lib/formatter/helpers/location_helpers.js new file mode 100644 index 00000000..1759c508 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/location_helpers.js @@ -0,0 +1,16 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.formatLocation = formatLocation; +const node_path_1 = __importDefault(require("node:path")); +const value_checker_1 = require("../../value_checker"); +function formatLocation(obj, cwd) { + let uri = obj.uri; + if ((0, value_checker_1.doesHaveValue)(cwd)) { + uri = node_path_1.default.relative(cwd, uri); + } + return `${uri}:${obj.line.toString()}`; +} +//# sourceMappingURL=location_helpers.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/location_helpers.js.map b/node_modules/@cucumber/cucumber/lib/formatter/helpers/location_helpers.js.map new file mode 100644 index 00000000..624373ab --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/location_helpers.js.map @@ -0,0 +1 @@ +{"version":3,"file":"location_helpers.js","sourceRoot":"","sources":["../../../src/formatter/helpers/location_helpers.ts"],"names":[],"mappings":";;;;;AAIA,wCAMC;AAVD,0DAA4B;AAC5B,uDAAmD;AAGnD,SAAgB,cAAc,CAAC,GAAgB,EAAE,GAAY;IAC3D,IAAI,GAAG,GAAG,GAAG,CAAC,GAAG,CAAA;IACjB,IAAI,IAAA,6BAAa,EAAC,GAAG,CAAC,EAAE,CAAC;QACvB,GAAG,GAAG,mBAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAC/B,CAAC;IACD,OAAO,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAA;AACxC,CAAC","sourcesContent":["import path from 'node:path'\nimport { doesHaveValue } from '../../value_checker'\nimport { ILineAndUri } from '../../types'\n\nexport function formatLocation(obj: ILineAndUri, cwd?: string): string {\n let uri = obj.uri\n if (doesHaveValue(cwd)) {\n uri = path.relative(cwd, uri)\n }\n return `${uri}:${obj.line.toString()}`\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/pickle_parser.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/helpers/pickle_parser.d.ts new file mode 100644 index 00000000..1deedcb0 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/pickle_parser.d.ts @@ -0,0 +1,17 @@ +import * as messages from '@cucumber/messages'; +export interface IGetPickleLocationRequest { + gherkinDocument: messages.GherkinDocument; + pickle: messages.Pickle; +} +export interface IGetStepKeywordRequest { + pickleStep: messages.PickleStep; + gherkinStepMap: Record; +} +export interface IGetScenarioDescriptionRequest { + pickle: messages.Pickle; + gherkinScenarioMap: Record; +} +export declare function getScenarioDescription({ pickle, gherkinScenarioMap, }: IGetScenarioDescriptionRequest): string; +export declare function getStepKeyword({ pickleStep, gherkinStepMap, }: IGetStepKeywordRequest): string; +export declare function getPickleStepMap(pickle: messages.Pickle): Record; +export declare function getPickleLocation({ gherkinDocument, pickle, }: IGetPickleLocationRequest): messages.Location; diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/pickle_parser.js b/node_modules/@cucumber/cucumber/lib/formatter/helpers/pickle_parser.js new file mode 100644 index 00000000..ecf6bfdb --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/pickle_parser.js @@ -0,0 +1,27 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getScenarioDescription = getScenarioDescription; +exports.getStepKeyword = getStepKeyword; +exports.getPickleStepMap = getPickleStepMap; +exports.getPickleLocation = getPickleLocation; +const gherkin_document_parser_1 = require("./gherkin_document_parser"); +function getScenarioDescription({ pickle, gherkinScenarioMap, }) { + return pickle.astNodeIds + .map((id) => gherkinScenarioMap[id]) + .filter((x) => x != null)[0].description; +} +function getStepKeyword({ pickleStep, gherkinStepMap, }) { + return pickleStep.astNodeIds + .map((id) => gherkinStepMap[id]) + .filter((x) => x != null)[0].keyword; +} +function getPickleStepMap(pickle) { + const result = {}; + pickle.steps.forEach((pickleStep) => (result[pickleStep.id] = pickleStep)); + return result; +} +function getPickleLocation({ gherkinDocument, pickle, }) { + const gherkinScenarioLocationMap = (0, gherkin_document_parser_1.getGherkinScenarioLocationMap)(gherkinDocument); + return gherkinScenarioLocationMap[pickle.astNodeIds[pickle.astNodeIds.length - 1]]; +} +//# sourceMappingURL=pickle_parser.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/pickle_parser.js.map b/node_modules/@cucumber/cucumber/lib/formatter/helpers/pickle_parser.js.map new file mode 100644 index 00000000..bbe741f5 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/pickle_parser.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pickle_parser.js","sourceRoot":"","sources":["../../../src/formatter/helpers/pickle_parser.ts"],"names":[],"mappings":";;AAkBA,wDAOC;AAED,wCAOC;AAED,4CAMC;AAED,8CASC;AApDD,uEAAyE;AAiBzE,SAAgB,sBAAsB,CAAC,EACrC,MAAM,EACN,kBAAkB,GACa;IAC/B,OAAO,MAAM,CAAC,UAAU;SACrB,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;SACnC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAA;AAC5C,CAAC;AAED,SAAgB,cAAc,CAAC,EAC7B,UAAU,EACV,cAAc,GACS;IACvB,OAAO,UAAU,CAAC,UAAU;SACzB,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;SAC/B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;AACxC,CAAC;AAED,SAAgB,gBAAgB,CAC9B,MAAuB;IAEvB,MAAM,MAAM,GAAwC,EAAE,CAAA;IACtD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAA;IAC1E,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAgB,iBAAiB,CAAC,EAChC,eAAe,EACf,MAAM,GACoB;IAC1B,MAAM,0BAA0B,GAC9B,IAAA,uDAA6B,EAAC,eAAe,CAAC,CAAA;IAChD,OAAO,0BAA0B,CAC/B,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAChD,CAAA;AACH,CAAC","sourcesContent":["import * as messages from '@cucumber/messages'\nimport { getGherkinScenarioLocationMap } from './gherkin_document_parser'\n\nexport interface IGetPickleLocationRequest {\n gherkinDocument: messages.GherkinDocument\n pickle: messages.Pickle\n}\n\nexport interface IGetStepKeywordRequest {\n pickleStep: messages.PickleStep\n gherkinStepMap: Record\n}\n\nexport interface IGetScenarioDescriptionRequest {\n pickle: messages.Pickle\n gherkinScenarioMap: Record\n}\n\nexport function getScenarioDescription({\n pickle,\n gherkinScenarioMap,\n}: IGetScenarioDescriptionRequest): string {\n return pickle.astNodeIds\n .map((id) => gherkinScenarioMap[id])\n .filter((x) => x != null)[0].description\n}\n\nexport function getStepKeyword({\n pickleStep,\n gherkinStepMap,\n}: IGetStepKeywordRequest): string {\n return pickleStep.astNodeIds\n .map((id) => gherkinStepMap[id])\n .filter((x) => x != null)[0].keyword\n}\n\nexport function getPickleStepMap(\n pickle: messages.Pickle\n): Record {\n const result: Record = {}\n pickle.steps.forEach((pickleStep) => (result[pickleStep.id] = pickleStep))\n return result\n}\n\nexport function getPickleLocation({\n gherkinDocument,\n pickle,\n}: IGetPickleLocationRequest): messages.Location {\n const gherkinScenarioLocationMap =\n getGherkinScenarioLocationMap(gherkinDocument)\n return gherkinScenarioLocationMap[\n pickle.astNodeIds[pickle.astNodeIds.length - 1]\n ]\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/step_argument_formatter.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/helpers/step_argument_formatter.d.ts new file mode 100644 index 00000000..6fc23cc4 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/step_argument_formatter.d.ts @@ -0,0 +1,2 @@ +import * as messages from '@cucumber/messages'; +export declare function formatStepArgument(arg: messages.PickleStepArgument): string; diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/step_argument_formatter.js b/node_modules/@cucumber/cucumber/lib/formatter/helpers/step_argument_formatter.js new file mode 100644 index 00000000..560b9438 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/step_argument_formatter.js @@ -0,0 +1,47 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.formatStepArgument = formatStepArgument; +const cli_table3_1 = __importDefault(require("cli-table3")); +const step_arguments_1 = require("../../step_arguments"); +function formatDataTable(dataTable) { + const table = new cli_table3_1.default({ + chars: { + bottom: '', + 'bottom-left': '', + 'bottom-mid': '', + 'bottom-right': '', + left: '|', + 'left-mid': '', + mid: '', + 'mid-mid': '', + middle: '|', + right: '|', + 'right-mid': '', + top: '', + 'top-left': '', + 'top-mid': '', + 'top-right': '', + }, + style: { + border: [], + 'padding-left': 1, + 'padding-right': 1, + }, + }); + const rows = dataTable.rows.map((row) => row.cells.map((cell) => cell.value.replace(/\\/g, '\\\\').replace(/\n/g, '\\n'))); + table.push(...rows); + return table.toString(); +} +function formatDocString(docString) { + return `"""\n${docString.content}\n"""`; +} +function formatStepArgument(arg) { + return (0, step_arguments_1.parseStepArgument)(arg, { + dataTable: formatDataTable, + docString: formatDocString, + }); +} +//# sourceMappingURL=step_argument_formatter.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/step_argument_formatter.js.map b/node_modules/@cucumber/cucumber/lib/formatter/helpers/step_argument_formatter.js.map new file mode 100644 index 00000000..038c1024 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/step_argument_formatter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"step_argument_formatter.js","sourceRoot":"","sources":["../../../src/formatter/helpers/step_argument_formatter.ts"],"names":[],"mappings":";;;;;AA0CA,gDAKC;AA/CD,4DAA8B;AAE9B,yDAAwD;AAExD,SAAS,eAAe,CAAC,SAA+B;IACtD,MAAM,KAAK,GAAG,IAAI,oBAAK,CAAC;QACtB,KAAK,EAAE;YACL,MAAM,EAAE,EAAE;YACV,aAAa,EAAE,EAAE;YACjB,YAAY,EAAE,EAAE;YAChB,cAAc,EAAE,EAAE;YAClB,IAAI,EAAE,GAAG;YACT,UAAU,EAAE,EAAE;YACd,GAAG,EAAE,EAAE;YACP,SAAS,EAAE,EAAE;YACb,MAAM,EAAE,GAAG;YACX,KAAK,EAAE,GAAG;YACV,WAAW,EAAE,EAAE;YACf,GAAG,EAAE,EAAE;YACP,UAAU,EAAE,EAAE;YACd,SAAS,EAAE,EAAE;YACb,WAAW,EAAE,EAAE;SAChB;QACD,KAAK,EAAE;YACL,MAAM,EAAE,EAAE;YACV,cAAc,EAAE,CAAC;YACjB,eAAe,EAAE,CAAC;SACnB;KACF,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACtC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACrB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CACxD,CACF,CAAA;IACD,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAA;IACnB,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAA;AACzB,CAAC;AAED,SAAS,eAAe,CAAC,SAAmC;IAC1D,OAAO,QAAQ,SAAS,CAAC,OAAO,OAAO,CAAA;AACzC,CAAC;AAED,SAAgB,kBAAkB,CAAC,GAAgC;IACjE,OAAO,IAAA,kCAAiB,EAAC,GAAG,EAAE;QAC5B,SAAS,EAAE,eAAe;QAC1B,SAAS,EAAE,eAAe;KAC3B,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import Table from 'cli-table3'\nimport * as messages from '@cucumber/messages'\nimport { parseStepArgument } from '../../step_arguments'\n\nfunction formatDataTable(dataTable: messages.PickleTable): string {\n const table = new Table({\n chars: {\n bottom: '',\n 'bottom-left': '',\n 'bottom-mid': '',\n 'bottom-right': '',\n left: '|',\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n middle: '|',\n right: '|',\n 'right-mid': '',\n top: '',\n 'top-left': '',\n 'top-mid': '',\n 'top-right': '',\n },\n style: {\n border: [],\n 'padding-left': 1,\n 'padding-right': 1,\n },\n })\n const rows = dataTable.rows.map((row) =>\n row.cells.map((cell) =>\n cell.value.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\n')\n )\n )\n table.push(...rows)\n return table.toString()\n}\n\nfunction formatDocString(docString: messages.PickleDocString): string {\n return `\"\"\"\\n${docString.content}\\n\"\"\"`\n}\n\nexport function formatStepArgument(arg: messages.PickleStepArgument): string {\n return parseStepArgument(arg, {\n dataTable: formatDataTable,\n docString: formatDocString,\n })\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/summary_helpers.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/helpers/summary_helpers.d.ts new file mode 100644 index 00000000..60f11e98 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/summary_helpers.d.ts @@ -0,0 +1,9 @@ +import * as messages from '@cucumber/messages'; +import { IColorFns } from '../get_color_fns'; +import { ITestCaseAttempt } from './event_data_collector'; +export interface IFormatSummaryRequest { + colorFns: IColorFns; + testCaseAttempts: ITestCaseAttempt[]; + testRunDuration: messages.Duration; +} +export declare function formatSummary({ colorFns, testCaseAttempts, testRunDuration, }: IFormatSummaryRequest): string; diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/summary_helpers.js b/node_modules/@cucumber/cucumber/lib/formatter/helpers/summary_helpers.js new file mode 100644 index 00000000..74fe84f6 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/summary_helpers.js @@ -0,0 +1,106 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.formatSummary = formatSummary; +const messages = __importStar(require("@cucumber/messages")); +const luxon_1 = require("luxon"); +const value_checker_1 = require("../../value_checker"); +const STATUS_REPORT_ORDER = [ + messages.TestStepResultStatus.FAILED, + messages.TestStepResultStatus.AMBIGUOUS, + messages.TestStepResultStatus.UNDEFINED, + messages.TestStepResultStatus.PENDING, + messages.TestStepResultStatus.SKIPPED, + messages.TestStepResultStatus.PASSED, + messages.TestStepResultStatus.UNKNOWN, +]; +function formatSummary({ colorFns, testCaseAttempts, testRunDuration, }) { + const testCaseResults = []; + const testStepResults = []; + let totalStepDuration = messages.TimeConversion.millisecondsToDuration(0); + testCaseAttempts.forEach(({ testCase, willBeRetried, worstTestStepResult, stepResults }) => { + Object.values(stepResults).forEach((stepResult) => { + totalStepDuration = messages.TimeConversion.addDurations(totalStepDuration, stepResult.duration); + }); + if (!willBeRetried) { + testCaseResults.push(worstTestStepResult); + testCase.testSteps.forEach((testStep) => { + if ((0, value_checker_1.doesHaveValue)(testStep.pickleStepId)) { + testStepResults.push(stepResults[testStep.id]); + } + }); + } + }); + const scenarioSummary = getCountSummary({ + colorFns, + objects: testCaseResults, + type: 'scenario', + }); + const stepSummary = getCountSummary({ + colorFns, + objects: testStepResults, + type: 'step', + }); + const durationSummary = `${getDurationSummary(testRunDuration)} (executing steps: ${getDurationSummary(totalStepDuration)})\n`; + return [scenarioSummary, stepSummary, durationSummary].join('\n'); +} +function getCountSummary({ colorFns, objects, type, }) { + const counts = {}; + STATUS_REPORT_ORDER.forEach((x) => (counts[x] = 0)); + objects.forEach((x) => (counts[x.status] += 1)); + const total = Object.values(counts).reduce((acc, x) => acc + x, 0); + let text = `${total.toString()} ${type}${total === 1 ? '' : 's'}`; + if (total > 0) { + const details = []; + STATUS_REPORT_ORDER.forEach((status) => { + if (counts[status] > 0) { + details.push(colorFns.forStatus(status)(`${counts[status].toString()} ${status.toLowerCase()}`)); + } + }); + text += ` (${details.join(', ')})`; + } + return text; +} +function getDurationSummary(durationMsg) { + const start = new Date(0); + const end = new Date(messages.TimeConversion.durationToMilliseconds(durationMsg)); + const duration = luxon_1.Interval.fromDateTimes(start, end).toDuration([ + 'minutes', + 'seconds', + 'milliseconds', + ]); + return duration.toFormat("m'm'ss.SSS's'"); +} +//# sourceMappingURL=summary_helpers.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/summary_helpers.js.map b/node_modules/@cucumber/cucumber/lib/formatter/helpers/summary_helpers.js.map new file mode 100644 index 00000000..ab384f70 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/summary_helpers.js.map @@ -0,0 +1 @@ +{"version":3,"file":"summary_helpers.js","sourceRoot":"","sources":["../../../src/formatter/helpers/summary_helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import * as messages from '@cucumber/messages'\nimport { Interval } from 'luxon'\nimport { IColorFns } from '../get_color_fns'\nimport { doesHaveValue } from '../../value_checker'\nimport { ITestCaseAttempt } from './event_data_collector'\n\nconst STATUS_REPORT_ORDER = [\n messages.TestStepResultStatus.FAILED,\n messages.TestStepResultStatus.AMBIGUOUS,\n messages.TestStepResultStatus.UNDEFINED,\n messages.TestStepResultStatus.PENDING,\n messages.TestStepResultStatus.SKIPPED,\n messages.TestStepResultStatus.PASSED,\n messages.TestStepResultStatus.UNKNOWN,\n]\n\nexport interface IFormatSummaryRequest {\n colorFns: IColorFns\n testCaseAttempts: ITestCaseAttempt[]\n testRunDuration: messages.Duration\n}\n\nexport function formatSummary({\n colorFns,\n testCaseAttempts,\n testRunDuration,\n}: IFormatSummaryRequest): string {\n const testCaseResults: messages.TestStepResult[] = []\n const testStepResults: messages.TestStepResult[] = []\n let totalStepDuration = messages.TimeConversion.millisecondsToDuration(0)\n testCaseAttempts.forEach(\n ({ testCase, willBeRetried, worstTestStepResult, stepResults }) => {\n Object.values(stepResults).forEach((stepResult) => {\n totalStepDuration = messages.TimeConversion.addDurations(\n totalStepDuration,\n stepResult.duration\n )\n })\n if (!willBeRetried) {\n testCaseResults.push(worstTestStepResult)\n testCase.testSteps.forEach((testStep) => {\n if (doesHaveValue(testStep.pickleStepId)) {\n testStepResults.push(stepResults[testStep.id])\n }\n })\n }\n }\n )\n const scenarioSummary = getCountSummary({\n colorFns,\n objects: testCaseResults,\n type: 'scenario',\n })\n const stepSummary = getCountSummary({\n colorFns,\n objects: testStepResults,\n type: 'step',\n })\n const durationSummary = `${getDurationSummary(\n testRunDuration\n )} (executing steps: ${getDurationSummary(totalStepDuration)})\\n`\n return [scenarioSummary, stepSummary, durationSummary].join('\\n')\n}\n\ninterface IGetCountSummaryRequest {\n colorFns: IColorFns\n objects: messages.TestStepResult[]\n type: string\n}\n\nfunction getCountSummary({\n colorFns,\n objects,\n type,\n}: IGetCountSummaryRequest): string {\n const counts: Record = {}\n STATUS_REPORT_ORDER.forEach((x) => (counts[x] = 0))\n objects.forEach((x) => (counts[x.status] += 1))\n const total = Object.values(counts).reduce((acc, x) => acc + x, 0)\n let text = `${total.toString()} ${type}${total === 1 ? '' : 's'}`\n if (total > 0) {\n const details: string[] = []\n STATUS_REPORT_ORDER.forEach((status) => {\n if (counts[status] > 0) {\n details.push(\n colorFns.forStatus(status)(\n `${counts[status].toString()} ${status.toLowerCase()}`\n )\n )\n }\n })\n text += ` (${details.join(', ')})`\n }\n return text\n}\n\nfunction getDurationSummary(durationMsg: messages.Duration): string {\n const start = new Date(0)\n const end = new Date(\n messages.TimeConversion.durationToMilliseconds(durationMsg)\n )\n const duration = Interval.fromDateTimes(start, end).toDuration([\n 'minutes',\n 'seconds',\n 'milliseconds',\n ])\n return duration.toFormat(\"m'm'ss.SSS's'\")\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/test_case_attempt_formatter.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/helpers/test_case_attempt_formatter.d.ts new file mode 100644 index 00000000..1f664b0a --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/test_case_attempt_formatter.d.ts @@ -0,0 +1,12 @@ +import { IColorFns } from '../get_color_fns'; +import StepDefinitionSnippetBuilder from '../step_definition_snippet_builder'; +import { SupportCodeLibrary } from '../../support_code_library_builder/types'; +import { ITestCaseAttempt } from './event_data_collector'; +export interface IFormatTestCaseAttemptRequest { + colorFns: IColorFns; + testCaseAttempt: ITestCaseAttempt; + snippetBuilder: StepDefinitionSnippetBuilder; + supportCodeLibrary: SupportCodeLibrary; + printAttachments?: boolean; +} +export declare function formatTestCaseAttempt({ colorFns, snippetBuilder, supportCodeLibrary, testCaseAttempt, printAttachments, }: IFormatTestCaseAttemptRequest): string; diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/test_case_attempt_formatter.js b/node_modules/@cucumber/cucumber/lib/formatter/helpers/test_case_attempt_formatter.js new file mode 100644 index 00000000..d28ab2eb --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/test_case_attempt_formatter.js @@ -0,0 +1,123 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.formatTestCaseAttempt = formatTestCaseAttempt; +const indent_string_1 = __importDefault(require("indent-string")); +const messages = __importStar(require("@cucumber/messages")); +const figures_1 = __importDefault(require("figures")); +const value_checker_1 = require("../../value_checker"); +const location_helpers_1 = require("./location_helpers"); +const test_case_attempt_parser_1 = require("./test_case_attempt_parser"); +const step_argument_formatter_1 = require("./step_argument_formatter"); +const CHARACTERS = new Map([ + [messages.TestStepResultStatus.AMBIGUOUS, figures_1.default.cross], + [messages.TestStepResultStatus.FAILED, figures_1.default.cross], + [messages.TestStepResultStatus.PASSED, figures_1.default.tick], + [messages.TestStepResultStatus.PENDING, '?'], + [messages.TestStepResultStatus.SKIPPED, '-'], + [messages.TestStepResultStatus.UNDEFINED, '?'], +]); +function getStepMessage(testStep) { + switch (testStep.result.status) { + case messages.TestStepResultStatus.AMBIGUOUS: + case messages.TestStepResultStatus.FAILED: + return testStep.result.message; + case messages.TestStepResultStatus.UNDEFINED: + return `${'Undefined. Implement with the following snippet:' + '\n\n'}${(0, indent_string_1.default)(testStep.snippet, 2)}\n`; + case messages.TestStepResultStatus.PENDING: + return 'Pending'; + } + return ''; +} +function formatStep({ colorFns, testStep, printAttachments, }) { + const { name, result: { status }, actionLocation, attachments, } = testStep; + const colorFn = colorFns.forStatus(status); + const identifier = testStep.keyword + (0, value_checker_1.valueOrDefault)(testStep.text, ''); + let text = colorFn(`${CHARACTERS.get(status)} ${identifier}`); + if ((0, value_checker_1.doesHaveValue)(name)) { + text += colorFn(` (${name})`); + } + if ((0, value_checker_1.doesHaveValue)(actionLocation)) { + text += ` # ${colorFns.location((0, location_helpers_1.formatLocation)(actionLocation))}`; + } + text += '\n'; + if ((0, value_checker_1.doesHaveValue)(testStep.argument)) { + const argumentsText = (0, step_argument_formatter_1.formatStepArgument)(testStep.argument); + text += (0, indent_string_1.default)(`${colorFn(argumentsText)}\n`, 4); + } + if ((0, value_checker_1.valueOrDefault)(printAttachments, true)) { + attachments.forEach(({ body, mediaType, fileName }) => { + let message = ''; + if (mediaType === 'text/plain') { + message = `: ${body}`; + } + else if (fileName) { + message = `: ${fileName}`; + } + text += (0, indent_string_1.default)(`Attachment (${mediaType})${message}\n`, 4); + }); + } + const message = getStepMessage(testStep); + if (message !== '') { + text += `${(0, indent_string_1.default)(colorFn(message), 4)}\n`; + } + return text; +} +function formatTestCaseAttempt({ colorFns, snippetBuilder, supportCodeLibrary, testCaseAttempt, printAttachments, }) { + const parsed = (0, test_case_attempt_parser_1.parseTestCaseAttempt)({ + snippetBuilder, + testCaseAttempt, + supportCodeLibrary, + }); + let text = `Scenario: ${parsed.testCase.name}`; + text += getAttemptText(parsed.testCase.attempt, testCaseAttempt.willBeRetried); + text += ` # ${colorFns.location((0, location_helpers_1.formatLocation)(parsed.testCase.sourceLocation))}\n`; + parsed.testSteps.forEach((testStep) => { + text += formatStep({ colorFns, testStep, printAttachments }); + }); + return `${text}\n`; +} +function getAttemptText(attempt, willBeRetried) { + if (attempt > 0 || willBeRetried) { + const numberStr = (attempt + 1).toString(); + const retriedStr = willBeRetried ? ', retried' : ''; + return ` (attempt ${numberStr}${retriedStr})`; + } + return ''; +} +//# sourceMappingURL=test_case_attempt_formatter.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/test_case_attempt_formatter.js.map b/node_modules/@cucumber/cucumber/lib/formatter/helpers/test_case_attempt_formatter.js.map new file mode 100644 index 00000000..bd77e4c4 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/test_case_attempt_formatter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"test_case_attempt_formatter.js","sourceRoot":"","sources":["../../../src/formatter/helpers/test_case_attempt_formatter.ts"],"names":[],"mappings":"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","sourcesContent":["import indentString from 'indent-string'\nimport * as messages from '@cucumber/messages'\nimport figures from 'figures'\nimport { IColorFns } from '../get_color_fns'\nimport { doesHaveValue, valueOrDefault } from '../../value_checker'\nimport StepDefinitionSnippetBuilder from '../step_definition_snippet_builder'\nimport { SupportCodeLibrary } from '../../support_code_library_builder/types'\nimport { formatLocation } from './location_helpers'\nimport {\n IParsedTestStep,\n parseTestCaseAttempt,\n} from './test_case_attempt_parser'\nimport { formatStepArgument } from './step_argument_formatter'\nimport { ITestCaseAttempt } from './event_data_collector'\n\nconst CHARACTERS: Map = new Map([\n [messages.TestStepResultStatus.AMBIGUOUS, figures.cross],\n [messages.TestStepResultStatus.FAILED, figures.cross],\n [messages.TestStepResultStatus.PASSED, figures.tick],\n [messages.TestStepResultStatus.PENDING, '?'],\n [messages.TestStepResultStatus.SKIPPED, '-'],\n [messages.TestStepResultStatus.UNDEFINED, '?'],\n])\n\nfunction getStepMessage(testStep: IParsedTestStep): string {\n switch (testStep.result.status) {\n case messages.TestStepResultStatus.AMBIGUOUS:\n case messages.TestStepResultStatus.FAILED:\n return testStep.result.message\n case messages.TestStepResultStatus.UNDEFINED:\n return `${\n 'Undefined. Implement with the following snippet:' + '\\n\\n'\n }${indentString(testStep.snippet, 2)}\\n`\n case messages.TestStepResultStatus.PENDING:\n return 'Pending'\n }\n return ''\n}\n\ninterface IFormatStepRequest {\n colorFns: IColorFns\n testStep: IParsedTestStep\n printAttachments?: boolean\n}\n\nfunction formatStep({\n colorFns,\n testStep,\n printAttachments,\n}: IFormatStepRequest): string {\n const {\n name,\n result: { status },\n actionLocation,\n attachments,\n } = testStep\n const colorFn = colorFns.forStatus(status)\n const identifier = testStep.keyword + valueOrDefault(testStep.text, '')\n let text = colorFn(`${CHARACTERS.get(status)} ${identifier}`)\n if (doesHaveValue(name)) {\n text += colorFn(` (${name})`)\n }\n if (doesHaveValue(actionLocation)) {\n text += ` # ${colorFns.location(formatLocation(actionLocation))}`\n }\n text += '\\n'\n if (doesHaveValue(testStep.argument)) {\n const argumentsText = formatStepArgument(testStep.argument)\n text += indentString(`${colorFn(argumentsText)}\\n`, 4)\n }\n if (valueOrDefault(printAttachments, true)) {\n attachments.forEach(({ body, mediaType, fileName }) => {\n let message = ''\n if (mediaType === 'text/plain') {\n message = `: ${body}`\n } else if (fileName) {\n message = `: ${fileName}`\n }\n text += indentString(`Attachment (${mediaType})${message}\\n`, 4)\n })\n }\n const message = getStepMessage(testStep)\n if (message !== '') {\n text += `${indentString(colorFn(message), 4)}\\n`\n }\n return text\n}\n\nexport interface IFormatTestCaseAttemptRequest {\n colorFns: IColorFns\n testCaseAttempt: ITestCaseAttempt\n snippetBuilder: StepDefinitionSnippetBuilder\n supportCodeLibrary: SupportCodeLibrary\n printAttachments?: boolean\n}\n\nexport function formatTestCaseAttempt({\n colorFns,\n snippetBuilder,\n supportCodeLibrary,\n testCaseAttempt,\n printAttachments,\n}: IFormatTestCaseAttemptRequest): string {\n const parsed = parseTestCaseAttempt({\n snippetBuilder,\n testCaseAttempt,\n supportCodeLibrary,\n })\n let text = `Scenario: ${parsed.testCase.name}`\n text += getAttemptText(parsed.testCase.attempt, testCaseAttempt.willBeRetried)\n text += ` # ${colorFns.location(\n formatLocation(parsed.testCase.sourceLocation)\n )}\\n`\n parsed.testSteps.forEach((testStep) => {\n text += formatStep({ colorFns, testStep, printAttachments })\n })\n return `${text}\\n`\n}\n\nfunction getAttemptText(attempt: number, willBeRetried: boolean): string {\n if (attempt > 0 || willBeRetried) {\n const numberStr = (attempt + 1).toString()\n const retriedStr = willBeRetried ? ', retried' : ''\n return ` (attempt ${numberStr}${retriedStr})`\n }\n return ''\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/test_case_attempt_parser.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/helpers/test_case_attempt_parser.d.ts new file mode 100644 index 00000000..50bcef01 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/test_case_attempt_parser.d.ts @@ -0,0 +1,32 @@ +import * as messages from '@cucumber/messages'; +import StepDefinitionSnippetBuilder from '../step_definition_snippet_builder'; +import { SupportCodeLibrary } from '../../support_code_library_builder/types'; +import { ILineAndUri } from '../../types'; +import { ITestCaseAttempt } from './event_data_collector'; +export interface IParsedTestStep { + actionLocation?: ILineAndUri; + argument?: messages.PickleStepArgument; + attachments: messages.Attachment[]; + keyword: string; + name?: string; + result: messages.TestStepResult; + snippet?: string; + sourceLocation?: ILineAndUri; + text?: string; +} +export interface IParsedTestCase { + attempt: number; + name: string; + sourceLocation?: ILineAndUri; + worstTestStepResult: messages.TestStepResult; +} +export interface IParsedTestCaseAttempt { + testCase: IParsedTestCase; + testSteps: IParsedTestStep[]; +} +export interface IParseTestCaseAttemptRequest { + testCaseAttempt: ITestCaseAttempt; + snippetBuilder: StepDefinitionSnippetBuilder; + supportCodeLibrary: SupportCodeLibrary; +} +export declare function parseTestCaseAttempt({ testCaseAttempt, snippetBuilder, supportCodeLibrary, }: IParseTestCaseAttemptRequest): IParsedTestCaseAttempt; diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/test_case_attempt_parser.js b/node_modules/@cucumber/cucumber/lib/formatter/helpers/test_case_attempt_parser.js new file mode 100644 index 00000000..2987c4b6 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/test_case_attempt_parser.js @@ -0,0 +1,144 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseTestCaseAttempt = parseTestCaseAttempt; +const messages = __importStar(require("@cucumber/messages")); +const messages_1 = require("@cucumber/messages"); +const value_checker_1 = require("../../value_checker"); +const keyword_type_1 = require("./keyword_type"); +const gherkin_document_parser_1 = require("./gherkin_document_parser"); +const pickle_parser_1 = require("./pickle_parser"); +function parseStep({ isBeforeHook, gherkinStepMap, keyword, keywordType, pickleStep, pickleUri, snippetBuilder, supportCodeLibrary, testStep, testStepResult, testStepAttachments, }) { + const out = { + attachments: testStepAttachments, + keyword: (0, value_checker_1.doesHaveValue)(testStep.pickleStepId) + ? keyword + : isBeforeHook + ? 'Before' + : 'After', + result: testStepResult, + }; + if ((0, value_checker_1.doesHaveValue)(testStep.hookId)) { + let hookDefinition; + if (isBeforeHook) { + hookDefinition = supportCodeLibrary.beforeTestCaseHookDefinitions.find((x) => x.id === testStep.hookId); + } + else { + hookDefinition = supportCodeLibrary.afterTestCaseHookDefinitions.find((x) => x.id === testStep.hookId); + } + out.actionLocation = { + uri: hookDefinition.uri, + line: hookDefinition.line, + }; + out.name = hookDefinition.name; + } + if ((0, value_checker_1.doesHaveValue)(testStep.stepDefinitionIds) && + testStep.stepDefinitionIds.length === 1) { + const stepDefinition = supportCodeLibrary.stepDefinitions.find((x) => x.id === testStep.stepDefinitionIds[0]); + out.actionLocation = { + uri: stepDefinition.uri, + line: stepDefinition.line, + }; + } + if ((0, value_checker_1.doesHaveValue)(testStep.pickleStepId)) { + out.sourceLocation = { + uri: pickleUri, + line: gherkinStepMap[pickleStep.astNodeIds[0]].location.line, + }; + out.text = pickleStep.text; + if ((0, value_checker_1.doesHaveValue)(pickleStep.argument)) { + out.argument = pickleStep.argument; + } + } + if (testStepResult.status === messages.TestStepResultStatus.UNDEFINED) { + out.snippet = snippetBuilder.build({ keywordType, pickleStep }); + } + return out; +} +// Converts a testCaseAttempt into a json object with all data needed for +// displaying it in a pretty format +function parseTestCaseAttempt({ testCaseAttempt, snippetBuilder, supportCodeLibrary, }) { + const { testCase, pickle, gherkinDocument } = testCaseAttempt; + const gherkinStepMap = (0, gherkin_document_parser_1.getGherkinStepMap)(gherkinDocument); + const gherkinScenarioLocationMap = (0, gherkin_document_parser_1.getGherkinScenarioLocationMap)(gherkinDocument); + const pickleStepMap = (0, pickle_parser_1.getPickleStepMap)(pickle); + const relativePickleUri = pickle.uri; + const parsedTestCase = { + attempt: testCaseAttempt.attempt, + name: pickle.name, + sourceLocation: { + uri: relativePickleUri, + line: gherkinScenarioLocationMap[pickle.astNodeIds[pickle.astNodeIds.length - 1]].line, + }, + worstTestStepResult: testCaseAttempt.worstTestStepResult, + }; + const parsedTestSteps = []; + let isBeforeHook = true; + let previousKeywordType = keyword_type_1.KeywordType.Precondition; + testCase.testSteps.forEach((testStep) => { + const testStepResult = testCaseAttempt.stepResults[testStep.id] || new messages_1.TestStepResult(); + isBeforeHook = isBeforeHook && (0, value_checker_1.doesHaveValue)(testStep.hookId); + let keyword, keywordType, pickleStep; + if ((0, value_checker_1.doesHaveValue)(testStep.pickleStepId)) { + pickleStep = pickleStepMap[testStep.pickleStepId]; + keyword = (0, pickle_parser_1.getStepKeyword)({ pickleStep, gherkinStepMap }); + keywordType = (0, keyword_type_1.getStepKeywordType)({ + keyword, + language: gherkinDocument.feature.language, + previousKeywordType, + }); + } + const parsedStep = parseStep({ + isBeforeHook, + gherkinStepMap, + keyword, + keywordType, + pickleStep, + pickleUri: relativePickleUri, + snippetBuilder, + supportCodeLibrary, + testStep, + testStepResult, + testStepAttachments: (0, value_checker_1.valueOrDefault)(testCaseAttempt.stepAttachments[testStep.id], []), + }); + parsedTestSteps.push(parsedStep); + previousKeywordType = keywordType; + }); + return { + testCase: parsedTestCase, + testSteps: parsedTestSteps, + }; +} +//# sourceMappingURL=test_case_attempt_parser.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/test_case_attempt_parser.js.map b/node_modules/@cucumber/cucumber/lib/formatter/helpers/test_case_attempt_parser.js.map new file mode 100644 index 00000000..672d7c38 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/test_case_attempt_parser.js.map @@ -0,0 +1 @@ +{"version":3,"file":"test_case_attempt_parser.js","sourceRoot":"","sources":["../../../src/formatter/helpers/test_case_attempt_parser.ts"],"names":[],"mappings":"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","sourcesContent":["import * as messages from '@cucumber/messages'\nimport { TestStepResult } from '@cucumber/messages'\nimport StepDefinitionSnippetBuilder from '../step_definition_snippet_builder'\nimport { SupportCodeLibrary } from '../../support_code_library_builder/types'\nimport { doesHaveValue, valueOrDefault } from '../../value_checker'\nimport TestCaseHookDefinition from '../../models/test_case_hook_definition'\nimport { ILineAndUri } from '../../types'\nimport { getStepKeywordType, KeywordType } from './keyword_type'\nimport {\n getGherkinScenarioLocationMap,\n getGherkinStepMap,\n} from './gherkin_document_parser'\nimport { getPickleStepMap, getStepKeyword } from './pickle_parser'\nimport { ITestCaseAttempt } from './event_data_collector'\n\nexport interface IParsedTestStep {\n actionLocation?: ILineAndUri\n argument?: messages.PickleStepArgument\n attachments: messages.Attachment[]\n keyword: string\n name?: string\n result: messages.TestStepResult\n snippet?: string\n sourceLocation?: ILineAndUri\n text?: string\n}\n\nexport interface IParsedTestCase {\n attempt: number\n name: string\n sourceLocation?: ILineAndUri\n worstTestStepResult: messages.TestStepResult\n}\n\nexport interface IParsedTestCaseAttempt {\n testCase: IParsedTestCase\n testSteps: IParsedTestStep[]\n}\n\ninterface IParseStepRequest {\n isBeforeHook: boolean\n gherkinStepMap: Record\n keyword: string\n keywordType: KeywordType\n pickleStep: messages.PickleStep\n pickleUri: string\n snippetBuilder: StepDefinitionSnippetBuilder\n supportCodeLibrary: SupportCodeLibrary\n testStep: messages.TestStep\n testStepResult: messages.TestStepResult\n testStepAttachments: messages.Attachment[]\n}\n\nfunction parseStep({\n isBeforeHook,\n gherkinStepMap,\n keyword,\n keywordType,\n pickleStep,\n pickleUri,\n snippetBuilder,\n supportCodeLibrary,\n testStep,\n testStepResult,\n testStepAttachments,\n}: IParseStepRequest): IParsedTestStep {\n const out: IParsedTestStep = {\n attachments: testStepAttachments,\n keyword: doesHaveValue(testStep.pickleStepId)\n ? keyword\n : isBeforeHook\n ? 'Before'\n : 'After',\n result: testStepResult,\n }\n if (doesHaveValue(testStep.hookId)) {\n let hookDefinition: TestCaseHookDefinition\n if (isBeforeHook) {\n hookDefinition = supportCodeLibrary.beforeTestCaseHookDefinitions.find(\n (x) => x.id === testStep.hookId\n )\n } else {\n hookDefinition = supportCodeLibrary.afterTestCaseHookDefinitions.find(\n (x) => x.id === testStep.hookId\n )\n }\n out.actionLocation = {\n uri: hookDefinition.uri,\n line: hookDefinition.line,\n }\n out.name = hookDefinition.name\n }\n if (\n doesHaveValue(testStep.stepDefinitionIds) &&\n testStep.stepDefinitionIds.length === 1\n ) {\n const stepDefinition = supportCodeLibrary.stepDefinitions.find(\n (x) => x.id === testStep.stepDefinitionIds[0]\n )\n out.actionLocation = {\n uri: stepDefinition.uri,\n line: stepDefinition.line,\n }\n }\n if (doesHaveValue(testStep.pickleStepId)) {\n out.sourceLocation = {\n uri: pickleUri,\n line: gherkinStepMap[pickleStep.astNodeIds[0]].location.line,\n }\n out.text = pickleStep.text\n if (doesHaveValue(pickleStep.argument)) {\n out.argument = pickleStep.argument\n }\n }\n if (testStepResult.status === messages.TestStepResultStatus.UNDEFINED) {\n out.snippet = snippetBuilder.build({ keywordType, pickleStep })\n }\n return out\n}\n\nexport interface IParseTestCaseAttemptRequest {\n testCaseAttempt: ITestCaseAttempt\n snippetBuilder: StepDefinitionSnippetBuilder\n supportCodeLibrary: SupportCodeLibrary\n}\n\n// Converts a testCaseAttempt into a json object with all data needed for\n// displaying it in a pretty format\nexport function parseTestCaseAttempt({\n testCaseAttempt,\n snippetBuilder,\n supportCodeLibrary,\n}: IParseTestCaseAttemptRequest): IParsedTestCaseAttempt {\n const { testCase, pickle, gherkinDocument } = testCaseAttempt\n const gherkinStepMap = getGherkinStepMap(gherkinDocument)\n const gherkinScenarioLocationMap =\n getGherkinScenarioLocationMap(gherkinDocument)\n const pickleStepMap = getPickleStepMap(pickle)\n const relativePickleUri = pickle.uri\n const parsedTestCase: IParsedTestCase = {\n attempt: testCaseAttempt.attempt,\n name: pickle.name,\n sourceLocation: {\n uri: relativePickleUri,\n line: gherkinScenarioLocationMap[\n pickle.astNodeIds[pickle.astNodeIds.length - 1]\n ].line,\n },\n worstTestStepResult: testCaseAttempt.worstTestStepResult,\n }\n const parsedTestSteps: IParsedTestStep[] = []\n let isBeforeHook = true\n let previousKeywordType = KeywordType.Precondition\n\n testCase.testSteps.forEach((testStep) => {\n const testStepResult =\n testCaseAttempt.stepResults[testStep.id] || new TestStepResult()\n\n isBeforeHook = isBeforeHook && doesHaveValue(testStep.hookId)\n\n let keyword, keywordType, pickleStep\n if (doesHaveValue(testStep.pickleStepId)) {\n pickleStep = pickleStepMap[testStep.pickleStepId]\n keyword = getStepKeyword({ pickleStep, gherkinStepMap })\n keywordType = getStepKeywordType({\n keyword,\n language: gherkinDocument.feature.language,\n previousKeywordType,\n })\n }\n const parsedStep = parseStep({\n isBeforeHook,\n gherkinStepMap,\n keyword,\n keywordType,\n pickleStep,\n pickleUri: relativePickleUri,\n snippetBuilder,\n supportCodeLibrary,\n testStep,\n testStepResult,\n testStepAttachments: valueOrDefault(\n testCaseAttempt.stepAttachments[testStep.id],\n []\n ),\n })\n parsedTestSteps.push(parsedStep)\n previousKeywordType = keywordType\n })\n return {\n testCase: parsedTestCase,\n testSteps: parsedTestSteps,\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/usage_helpers/index.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/helpers/usage_helpers/index.d.ts new file mode 100644 index 00000000..5463d6e8 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/usage_helpers/index.d.ts @@ -0,0 +1,23 @@ +import * as messages from '@cucumber/messages'; +import StepDefinition from '../../../models/step_definition'; +import EventDataCollector from '../event_data_collector'; +export interface IUsageMatch { + duration?: messages.Duration; + line: number; + text: string; + uri: string; +} +export interface IUsage { + code: string; + line: number; + matches: IUsageMatch[]; + meanDuration?: messages.Duration; + pattern: string; + patternType: string; + uri: string; +} +export interface IGetUsageRequest { + eventDataCollector: EventDataCollector; + stepDefinitions: StepDefinition[]; +} +export declare function getUsage({ stepDefinitions, eventDataCollector, }: IGetUsageRequest): IUsage[]; diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/usage_helpers/index.js b/node_modules/@cucumber/cucumber/lib/formatter/helpers/usage_helpers/index.js new file mode 100644 index 00000000..3e60f676 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/usage_helpers/index.js @@ -0,0 +1,120 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getUsage = getUsage; +const messages = __importStar(require("@cucumber/messages")); +const pickle_parser_1 = require("../pickle_parser"); +const gherkin_document_parser_1 = require("../gherkin_document_parser"); +const value_checker_1 = require("../../../value_checker"); +function buildEmptyMapping(stepDefinitions) { + const mapping = {}; + stepDefinitions.forEach((stepDefinition) => { + mapping[stepDefinition.id] = { + code: stepDefinition.unwrappedCode.toString(), + line: stepDefinition.line, + pattern: stepDefinition.expression.source, + patternType: stepDefinition.expression.constructor.name, + matches: [], + uri: stepDefinition.uri, + }; + }); + return mapping; +} +const unexecutedStatuses = [ + messages.TestStepResultStatus.AMBIGUOUS, + messages.TestStepResultStatus.SKIPPED, + messages.TestStepResultStatus.UNDEFINED, +]; +function buildMapping({ stepDefinitions, eventDataCollector, }) { + const mapping = buildEmptyMapping(stepDefinitions); + eventDataCollector.getTestCaseAttempts().forEach((testCaseAttempt) => { + const pickleStepMap = (0, pickle_parser_1.getPickleStepMap)(testCaseAttempt.pickle); + const gherkinStepMap = (0, gherkin_document_parser_1.getGherkinStepMap)(testCaseAttempt.gherkinDocument); + testCaseAttempt.testCase.testSteps.forEach((testStep) => { + if ((0, value_checker_1.doesHaveValue)(testStep.pickleStepId) && + testStep.stepDefinitionIds.length === 1) { + const stepDefinitionId = testStep.stepDefinitionIds[0]; + const pickleStep = pickleStepMap[testStep.pickleStepId]; + const gherkinStep = gherkinStepMap[pickleStep.astNodeIds[0]]; + const match = { + line: gherkinStep.location.line, + text: pickleStep.text, + uri: testCaseAttempt.pickle.uri, + }; + const { duration, status } = testCaseAttempt.stepResults[testStep.id]; + if (!unexecutedStatuses.includes(status) && (0, value_checker_1.doesHaveValue)(duration)) { + match.duration = duration; + } + if ((0, value_checker_1.doesHaveValue)(mapping[stepDefinitionId])) { + mapping[stepDefinitionId].matches.push(match); + } + } + }); + }); + return mapping; +} +function normalizeDuration(duration) { + if (duration == null) { + return Number.MIN_SAFE_INTEGER; + } + return messages.TimeConversion.durationToMilliseconds(duration); +} +function buildResult(mapping) { + return Object.keys(mapping) + .map((stepDefinitionId) => { + const { matches, ...rest } = mapping[stepDefinitionId]; + const sortedMatches = matches.sort((a, b) => { + if (a.duration === b.duration) { + return a.text < b.text ? -1 : 1; + } + return normalizeDuration(b.duration) - normalizeDuration(a.duration); + }); + const result = { matches: sortedMatches, ...rest }; + const durations = matches + .filter((m) => m.duration != null) + .map((m) => m.duration); + if (durations.length > 0) { + const totalMilliseconds = durations.reduce((acc, x) => acc + messages.TimeConversion.durationToMilliseconds(x), 0); + result.meanDuration = messages.TimeConversion.millisecondsToDuration(totalMilliseconds / durations.length); + } + return result; + }) + .sort((a, b) => normalizeDuration(b.meanDuration) - normalizeDuration(a.meanDuration)); +} +function getUsage({ stepDefinitions, eventDataCollector, }) { + const mapping = buildMapping({ stepDefinitions, eventDataCollector }); + return buildResult(mapping); +} +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/helpers/usage_helpers/index.js.map b/node_modules/@cucumber/cucumber/lib/formatter/helpers/usage_helpers/index.js.map new file mode 100644 index 00000000..52ece834 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/helpers/usage_helpers/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/formatter/helpers/usage_helpers/index.ts"],"names":[],"mappings":"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","sourcesContent":["import * as messages from '@cucumber/messages'\nimport { getPickleStepMap } from '../pickle_parser'\nimport { getGherkinStepMap } from '../gherkin_document_parser'\nimport StepDefinition from '../../../models/step_definition'\nimport { doesHaveValue } from '../../../value_checker'\nimport EventDataCollector from '../event_data_collector'\n\nexport interface IUsageMatch {\n duration?: messages.Duration\n line: number\n text: string\n uri: string\n}\n\nexport interface IUsage {\n code: string\n line: number\n matches: IUsageMatch[]\n meanDuration?: messages.Duration\n pattern: string\n patternType: string\n uri: string\n}\n\nexport interface IGetUsageRequest {\n eventDataCollector: EventDataCollector\n stepDefinitions: StepDefinition[]\n}\n\nfunction buildEmptyMapping(\n stepDefinitions: StepDefinition[]\n): Record {\n const mapping: Record = {}\n stepDefinitions.forEach((stepDefinition) => {\n mapping[stepDefinition.id] = {\n code: stepDefinition.unwrappedCode.toString(),\n line: stepDefinition.line,\n pattern: stepDefinition.expression.source,\n patternType: stepDefinition.expression.constructor.name,\n matches: [],\n uri: stepDefinition.uri,\n }\n })\n return mapping\n}\n\nconst unexecutedStatuses: readonly messages.TestStepResultStatus[] = [\n messages.TestStepResultStatus.AMBIGUOUS,\n messages.TestStepResultStatus.SKIPPED,\n messages.TestStepResultStatus.UNDEFINED,\n]\n\nfunction buildMapping({\n stepDefinitions,\n eventDataCollector,\n}: IGetUsageRequest): Record {\n const mapping = buildEmptyMapping(stepDefinitions)\n eventDataCollector.getTestCaseAttempts().forEach((testCaseAttempt) => {\n const pickleStepMap = getPickleStepMap(testCaseAttempt.pickle)\n const gherkinStepMap = getGherkinStepMap(testCaseAttempt.gherkinDocument)\n testCaseAttempt.testCase.testSteps.forEach((testStep) => {\n if (\n doesHaveValue(testStep.pickleStepId) &&\n testStep.stepDefinitionIds.length === 1\n ) {\n const stepDefinitionId = testStep.stepDefinitionIds[0]\n const pickleStep = pickleStepMap[testStep.pickleStepId]\n const gherkinStep = gherkinStepMap[pickleStep.astNodeIds[0]]\n const match: IUsageMatch = {\n line: gherkinStep.location.line,\n text: pickleStep.text,\n uri: testCaseAttempt.pickle.uri,\n }\n const { duration, status } = testCaseAttempt.stepResults[testStep.id]\n if (!unexecutedStatuses.includes(status) && doesHaveValue(duration)) {\n match.duration = duration\n }\n if (doesHaveValue(mapping[stepDefinitionId])) {\n mapping[stepDefinitionId].matches.push(match)\n }\n }\n })\n })\n return mapping\n}\n\nfunction normalizeDuration(duration?: messages.Duration): number {\n if (duration == null) {\n return Number.MIN_SAFE_INTEGER\n }\n return messages.TimeConversion.durationToMilliseconds(duration)\n}\n\nfunction buildResult(mapping: Record): IUsage[] {\n return Object.keys(mapping)\n .map((stepDefinitionId) => {\n const { matches, ...rest } = mapping[stepDefinitionId]\n const sortedMatches = matches.sort((a: IUsageMatch, b: IUsageMatch) => {\n if (a.duration === b.duration) {\n return a.text < b.text ? -1 : 1\n }\n return normalizeDuration(b.duration) - normalizeDuration(a.duration)\n })\n const result = { matches: sortedMatches, ...rest }\n const durations: messages.Duration[] = matches\n .filter((m) => m.duration != null)\n .map((m) => m.duration)\n if (durations.length > 0) {\n const totalMilliseconds = durations.reduce(\n (acc, x) => acc + messages.TimeConversion.durationToMilliseconds(x),\n 0\n )\n result.meanDuration = messages.TimeConversion.millisecondsToDuration(\n totalMilliseconds / durations.length\n )\n }\n return result\n })\n .sort(\n (a: IUsage, b: IUsage) =>\n normalizeDuration(b.meanDuration) - normalizeDuration(a.meanDuration)\n )\n}\n\nexport function getUsage({\n stepDefinitions,\n eventDataCollector,\n}: IGetUsageRequest): IUsage[] {\n const mapping = buildMapping({ stepDefinitions, eventDataCollector })\n return buildResult(mapping)\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/import_code.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/import_code.d.ts new file mode 100644 index 00000000..bff1096e --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/import_code.d.ts @@ -0,0 +1 @@ +export declare function importCode(specifier: string, cwd: string): Promise; diff --git a/node_modules/@cucumber/cucumber/lib/formatter/import_code.js b/node_modules/@cucumber/cucumber/lib/formatter/import_code.js new file mode 100644 index 00000000..3158a235 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/import_code.js @@ -0,0 +1,26 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.importCode = importCode; +const node_url_1 = require("node:url"); +const node_path_1 = __importDefault(require("node:path")); +async function importCode(specifier, cwd) { + try { + let normalized = specifier; + if (specifier.startsWith('.')) { + normalized = (0, node_url_1.pathToFileURL)(node_path_1.default.resolve(cwd, specifier)); + } + else if (specifier.startsWith('file://')) { + normalized = new URL(specifier); + } + return await import(normalized.toString()); + } + catch (e) { + throw new Error(`Failed to import formatter ${specifier}`, { + cause: e, + }); + } +} +//# sourceMappingURL=import_code.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/import_code.js.map b/node_modules/@cucumber/cucumber/lib/formatter/import_code.js.map new file mode 100644 index 00000000..73517e21 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/import_code.js.map @@ -0,0 +1 @@ +{"version":3,"file":"import_code.js","sourceRoot":"","sources":["../../src/formatter/import_code.ts"],"names":[],"mappings":";;;;;AAGA,gCAcC;AAjBD,uCAAwC;AACxC,0DAA4B;AAErB,KAAK,UAAU,UAAU,CAAC,SAAiB,EAAE,GAAW;IAC7D,IAAI,CAAC;QACH,IAAI,UAAU,GAAiB,SAAS,CAAA;QACxC,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,UAAU,GAAG,IAAA,wBAAa,EAAC,mBAAI,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAA;QAC1D,CAAC;aAAM,IAAI,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3C,UAAU,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAA;QACjC,CAAC;QACD,OAAO,MAAM,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC5C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,8BAA8B,SAAS,EAAE,EAAE;YACzD,KAAK,EAAE,CAAC;SACT,CAAC,CAAA;IACJ,CAAC;AACH,CAAC","sourcesContent":["import { pathToFileURL } from 'node:url'\nimport path from 'node:path'\n\nexport async function importCode(specifier: string, cwd: string): Promise {\n try {\n let normalized: URL | string = specifier\n if (specifier.startsWith('.')) {\n normalized = pathToFileURL(path.resolve(cwd, specifier))\n } else if (specifier.startsWith('file://')) {\n normalized = new URL(specifier)\n }\n return await import(normalized.toString())\n } catch (e) {\n throw new Error(`Failed to import formatter ${specifier}`, {\n cause: e,\n })\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/index.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/index.d.ts new file mode 100644 index 00000000..cdb4d094 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/index.d.ts @@ -0,0 +1,55 @@ +import { Writable } from 'node:stream'; +import { EventEmitter } from 'node:events'; +import { SupportCodeLibrary } from '../support_code_library_builder/types'; +import { FormatterPlugin } from '../plugin'; +import { IColorFns } from './get_color_fns'; +import { EventDataCollector } from './helpers'; +import StepDefinitionSnippetBuilder from './step_definition_snippet_builder'; +import { SnippetInterface } from './step_definition_snippet_builder/snippet_syntax'; +export interface FormatRerunOptions { + separator?: string; +} +export interface FormatOptions { + /** + * @deprecated use `FORCE_COLOR` instead; see https://github.com/cucumber/cucumber-js/blob/main/docs/deprecations.md + */ + colorsEnabled?: boolean; + html?: { + externalAttachments?: boolean | ReadonlyArray; + }; + rerun?: FormatRerunOptions; + snippetInterface?: SnippetInterface; + snippetSyntax?: string; + printAttachments?: boolean; + [customKey: string]: any; +} +export type FormatterImplementation = typeof Formatter | FormatterPlugin; +export type IFormatterStream = Writable; +export type IFormatterLogFn = (buffer: string | Uint8Array) => void; +export type IFormatterCleanupFn = () => Promise; +export interface IFormatterOptions { + colorFns: IColorFns; + cwd: string; + eventBroadcaster: EventEmitter; + eventDataCollector: EventDataCollector; + log: IFormatterLogFn; + parsedArgvOptions: FormatOptions; + snippetBuilder: StepDefinitionSnippetBuilder; + stream: Writable; + cleanup: IFormatterCleanupFn; + supportCodeLibrary: SupportCodeLibrary; +} +export default class Formatter { + protected colorFns: IColorFns; + protected cwd: string; + protected eventDataCollector: EventDataCollector; + protected log: IFormatterLogFn; + protected snippetBuilder: StepDefinitionSnippetBuilder; + protected stream: Writable; + protected supportCodeLibrary: SupportCodeLibrary; + protected printAttachments: boolean; + private readonly cleanup; + static readonly documentation: string; + constructor(options: IFormatterOptions); + finished(): Promise; +} diff --git a/node_modules/@cucumber/cucumber/lib/formatter/index.js b/node_modules/@cucumber/cucumber/lib/formatter/index.js new file mode 100644 index 00000000..a80e3f60 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/index.js @@ -0,0 +1,31 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const value_checker_1 = require("../value_checker"); +class Formatter { + colorFns; + cwd; + eventDataCollector; + log; + snippetBuilder; + stream; + supportCodeLibrary; + printAttachments; + cleanup; + static documentation; + constructor(options) { + this.colorFns = options.colorFns; + this.cwd = options.cwd; + this.eventDataCollector = options.eventDataCollector; + this.log = options.log; + this.snippetBuilder = options.snippetBuilder; + this.stream = options.stream; + this.supportCodeLibrary = options.supportCodeLibrary; + this.cleanup = options.cleanup; + this.printAttachments = (0, value_checker_1.valueOrDefault)(options.parsedArgvOptions.printAttachments, true); + } + async finished() { + await this.cleanup(); + } +} +exports.default = Formatter; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/index.js.map b/node_modules/@cucumber/cucumber/lib/formatter/index.js.map new file mode 100644 index 00000000..f330f734 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/formatter/index.ts"],"names":[],"mappings":";;AAGA,oDAAiD;AA4CjD,MAAqB,SAAS;IAClB,QAAQ,CAAW;IACnB,GAAG,CAAQ;IACX,kBAAkB,CAAoB;IACtC,GAAG,CAAiB;IACpB,cAAc,CAA8B;IAC5C,MAAM,CAAU;IAChB,kBAAkB,CAAoB;IACtC,gBAAgB,CAAS;IAClB,OAAO,CAAqB;IAC7C,MAAM,CAAU,aAAa,CAAQ;IAErC,YAAY,OAA0B;QACpC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAA;QAChC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAA;QACtB,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAA;QACpD,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAA;QACtB,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAA;QAC5C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;QAC5B,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAA;QACpD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAA;QAC9B,IAAI,CAAC,gBAAgB,GAAG,IAAA,8BAAc,EACpC,OAAO,CAAC,iBAAiB,CAAC,gBAAgB,EAC1C,IAAI,CACL,CAAA;IACH,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;IACtB,CAAC;CACF;AA9BD,4BA8BC","sourcesContent":["import { Writable } from 'node:stream'\nimport { EventEmitter } from 'node:events'\nimport { SupportCodeLibrary } from '../support_code_library_builder/types'\nimport { valueOrDefault } from '../value_checker'\nimport { FormatterPlugin } from '../plugin'\nimport { IColorFns } from './get_color_fns'\nimport { EventDataCollector } from './helpers'\nimport StepDefinitionSnippetBuilder from './step_definition_snippet_builder'\nimport { SnippetInterface } from './step_definition_snippet_builder/snippet_syntax'\n\nexport interface FormatRerunOptions {\n separator?: string\n}\n\nexport interface FormatOptions {\n /**\n * @deprecated use `FORCE_COLOR` instead; see https://github.com/cucumber/cucumber-js/blob/main/docs/deprecations.md\n */\n colorsEnabled?: boolean\n html?: {\n externalAttachments?: boolean | ReadonlyArray\n }\n rerun?: FormatRerunOptions\n snippetInterface?: SnippetInterface\n snippetSyntax?: string\n printAttachments?: boolean\n [customKey: string]: any\n}\n\nexport type FormatterImplementation = typeof Formatter | FormatterPlugin\nexport type IFormatterStream = Writable\nexport type IFormatterLogFn = (buffer: string | Uint8Array) => void\nexport type IFormatterCleanupFn = () => Promise\n\nexport interface IFormatterOptions {\n colorFns: IColorFns\n cwd: string\n eventBroadcaster: EventEmitter\n eventDataCollector: EventDataCollector\n log: IFormatterLogFn\n parsedArgvOptions: FormatOptions\n snippetBuilder: StepDefinitionSnippetBuilder\n stream: Writable\n cleanup: IFormatterCleanupFn\n supportCodeLibrary: SupportCodeLibrary\n}\n\nexport default class Formatter {\n protected colorFns: IColorFns\n protected cwd: string\n protected eventDataCollector: EventDataCollector\n protected log: IFormatterLogFn\n protected snippetBuilder: StepDefinitionSnippetBuilder\n protected stream: Writable\n protected supportCodeLibrary: SupportCodeLibrary\n protected printAttachments: boolean\n private readonly cleanup: IFormatterCleanupFn\n static readonly documentation: string\n\n constructor(options: IFormatterOptions) {\n this.colorFns = options.colorFns\n this.cwd = options.cwd\n this.eventDataCollector = options.eventDataCollector\n this.log = options.log\n this.snippetBuilder = options.snippetBuilder\n this.stream = options.stream\n this.supportCodeLibrary = options.supportCodeLibrary\n this.cleanup = options.cleanup\n this.printAttachments = valueOrDefault(\n options.parsedArgvOptions.printAttachments,\n true\n )\n }\n\n async finished(): Promise {\n await this.cleanup()\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/json_formatter.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/json_formatter.d.ts new file mode 100644 index 00000000..7083a929 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/json_formatter.d.ts @@ -0,0 +1,78 @@ +import * as messages from '@cucumber/messages'; +import Formatter, { IFormatterOptions } from './'; +export interface IJsonFeature { + description: string; + elements: IJsonScenario[]; + id: string; + keyword: string; + line: number; + name: string; + tags: IJsonTag[]; + uri: string; +} +export interface IJsonScenario { + description: string; + id: string; + keyword: string; + line: number; + name: string; + steps: IJsonStep[]; + tags: IJsonTag[]; + type: string; +} +export interface IJsonStep { + arguments?: any; + embeddings?: any; + hidden?: boolean; + keyword?: string; + line?: number; + match?: any; + name?: string; + result?: any; +} +export interface IJsonTag { + name: string; + line: number; +} +interface IBuildJsonFeatureOptions { + feature: messages.Feature; + elements: IJsonScenario[]; + uri: string; +} +interface IBuildJsonScenarioOptions { + feature: messages.Feature; + gherkinScenarioMap: Record; + gherkinExampleRuleMap: Record; + gherkinScenarioLocationMap: Record; + pickle: messages.Pickle; + steps: IJsonStep[]; +} +interface IBuildJsonStepOptions { + isBeforeHook: boolean; + gherkinStepMap: Record; + pickleStepMap: Record; + testStep: messages.TestStep; + testStepAttachments: messages.Attachment[]; + testStepResult: messages.TestStepResult; +} +export default class JsonFormatter extends Formatter { + static readonly documentation: string; + constructor(options: IFormatterOptions); + convertNameToId(obj: messages.Feature | messages.Pickle): string; + formatDataTable(dataTable: messages.PickleTable): any; + formatDocString(docString: messages.PickleDocString, gherkinStep: messages.Step): any; + formatStepArgument(stepArgument: messages.PickleStepArgument, gherkinStep: messages.Step): any; + onTestRunFinished(): void; + getFeatureData({ feature, elements, uri, }: IBuildJsonFeatureOptions): IJsonFeature; + getScenarioData({ feature, gherkinScenarioLocationMap, gherkinExampleRuleMap, gherkinScenarioMap, pickle, steps, }: IBuildJsonScenarioOptions): IJsonScenario; + private formatScenarioId; + getStepData({ isBeforeHook, gherkinStepMap, pickleStepMap, testStep, testStepAttachments, testStepResult, }: IBuildJsonStepOptions): IJsonStep; + getFeatureTags(feature: messages.Feature): IJsonTag[]; + getScenarioTags({ feature, pickle, gherkinScenarioMap, }: { + feature: messages.Feature; + pickle: messages.Pickle; + gherkinScenarioMap: Record; + }): IJsonTag[]; + private getScenarioTag; +} +export {}; diff --git a/node_modules/@cucumber/cucumber/lib/formatter/json_formatter.js b/node_modules/@cucumber/cucumber/lib/formatter/json_formatter.js new file mode 100644 index 00000000..ff2191e0 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/json_formatter.js @@ -0,0 +1,242 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const messages = __importStar(require("@cucumber/messages")); +const value_checker_1 = require("../value_checker"); +const step_arguments_1 = require("../step_arguments"); +const helpers_1 = require("./helpers"); +const gherkin_document_parser_1 = require("./helpers/gherkin_document_parser"); +const duration_helpers_1 = require("./helpers/duration_helpers"); +const _1 = __importDefault(require("./")); +const { getGherkinStepMap, getGherkinScenarioMap } = helpers_1.GherkinDocumentParser; +const { getScenarioDescription, getPickleStepMap, getStepKeyword } = helpers_1.PickleParser; +class JsonFormatter extends _1.default { + static documentation = 'Prints the feature as JSON. The JSON format is in maintenance mode. Please consider using the message formatter with the standalone json-formatter (https://github.com/cucumber/json-formatter).'; + constructor(options) { + super(options); + options.eventBroadcaster.on('envelope', (envelope) => { + if ((0, value_checker_1.doesHaveValue)(envelope.testRunFinished)) { + this.onTestRunFinished(); + } + }); + } + convertNameToId(obj) { + return obj.name.replace(/ /g, '-').toLowerCase(); + } + formatDataTable(dataTable) { + return { + rows: dataTable.rows.map((row) => ({ + cells: row.cells.map((x) => x.value), + })), + }; + } + formatDocString(docString, gherkinStep) { + return { + content: docString.content, + line: gherkinStep.docString.location.line, + }; + } + formatStepArgument(stepArgument, gherkinStep) { + if ((0, value_checker_1.doesNotHaveValue)(stepArgument)) { + return []; + } + return [ + (0, step_arguments_1.parseStepArgument)(stepArgument, { + dataTable: (dataTable) => this.formatDataTable(dataTable), + docString: (docString) => this.formatDocString(docString, gherkinStep), + }), + ]; + } + onTestRunFinished() { + const groupedTestCaseAttempts = {}; + this.eventDataCollector + .getTestCaseAttempts() + .forEach((testCaseAttempt) => { + if (!testCaseAttempt.willBeRetried) { + const uri = testCaseAttempt.pickle.uri; + if ((0, value_checker_1.doesNotHaveValue)(groupedTestCaseAttempts[uri])) { + groupedTestCaseAttempts[uri] = []; + } + groupedTestCaseAttempts[uri].push(testCaseAttempt); + } + }); + const features = Object.keys(groupedTestCaseAttempts).map((uri) => { + const group = groupedTestCaseAttempts[uri]; + const { gherkinDocument } = group[0]; + const gherkinStepMap = getGherkinStepMap(gherkinDocument); + const gherkinScenarioMap = getGherkinScenarioMap(gherkinDocument); + const gherkinExampleRuleMap = (0, gherkin_document_parser_1.getGherkinExampleRuleMap)(gherkinDocument); + const gherkinScenarioLocationMap = (0, gherkin_document_parser_1.getGherkinScenarioLocationMap)(gherkinDocument); + const elements = group.map((testCaseAttempt) => { + const { pickle } = testCaseAttempt; + const pickleStepMap = getPickleStepMap(pickle); + let isBeforeHook = true; + const steps = testCaseAttempt.testCase.testSteps.map((testStep) => { + isBeforeHook = isBeforeHook && !(0, value_checker_1.doesHaveValue)(testStep.pickleStepId); + return this.getStepData({ + isBeforeHook, + gherkinStepMap, + pickleStepMap, + testStep, + testStepAttachments: testCaseAttempt.stepAttachments[testStep.id], + testStepResult: testCaseAttempt.stepResults[testStep.id], + }); + }); + return this.getScenarioData({ + feature: gherkinDocument.feature, + gherkinScenarioLocationMap, + gherkinExampleRuleMap, + gherkinScenarioMap, + pickle, + steps, + }); + }); + return this.getFeatureData({ + feature: gherkinDocument.feature, + elements, + uri, + }); + }); + this.log(JSON.stringify(features, null, 2)); + } + getFeatureData({ feature, elements, uri, }) { + return { + description: feature.description, + elements, + id: this.convertNameToId(feature), + line: feature.location.line, + keyword: feature.keyword, + name: feature.name, + tags: this.getFeatureTags(feature), + uri, + }; + } + getScenarioData({ feature, gherkinScenarioLocationMap, gherkinExampleRuleMap, gherkinScenarioMap, pickle, steps, }) { + const description = getScenarioDescription({ + pickle, + gherkinScenarioMap, + }); + return { + description, + id: this.formatScenarioId({ feature, pickle, gherkinExampleRuleMap }), + keyword: gherkinScenarioMap[pickle.astNodeIds[0]].keyword, + line: gherkinScenarioLocationMap[pickle.astNodeIds[pickle.astNodeIds.length - 1]].line, + name: pickle.name, + steps, + tags: this.getScenarioTags({ feature, pickle, gherkinScenarioMap }), + type: 'scenario', + }; + } + formatScenarioId({ feature, pickle, gherkinExampleRuleMap, }) { + let parts; + const rule = gherkinExampleRuleMap[pickle.astNodeIds[0]]; + if ((0, value_checker_1.doesHaveValue)(rule)) { + parts = [feature, rule, pickle]; + } + else { + parts = [feature, pickle]; + } + return parts.map((part) => this.convertNameToId(part)).join(';'); + } + getStepData({ isBeforeHook, gherkinStepMap, pickleStepMap, testStep, testStepAttachments, testStepResult, }) { + const data = {}; + if ((0, value_checker_1.doesHaveValue)(testStep.pickleStepId)) { + const pickleStep = pickleStepMap[testStep.pickleStepId]; + data.arguments = this.formatStepArgument(pickleStep.argument, gherkinStepMap[pickleStep.astNodeIds[0]]); + data.keyword = getStepKeyword({ pickleStep, gherkinStepMap }); + data.line = gherkinStepMap[pickleStep.astNodeIds[0]].location.line; + data.name = pickleStep.text; + } + else { + data.keyword = isBeforeHook ? 'Before' : 'After'; + data.hidden = true; + } + if ((0, value_checker_1.doesHaveValue)(testStep.stepDefinitionIds) && + testStep.stepDefinitionIds.length === 1) { + const stepDefinition = this.supportCodeLibrary.stepDefinitions.find((s) => s.id === testStep.stepDefinitionIds[0]); + data.match = { location: (0, helpers_1.formatLocation)(stepDefinition) }; + } + const { message, status } = testStepResult; + data.result = { + status: messages.TestStepResultStatus[status].toLowerCase(), + }; + if ((0, value_checker_1.doesHaveValue)(testStepResult.duration)) { + data.result.duration = (0, duration_helpers_1.durationToNanoseconds)(testStepResult.duration); + } + if (status === messages.TestStepResultStatus.FAILED && + (0, value_checker_1.doesHaveValue)(message)) { + data.result.error_message = message; + } + if (testStepAttachments?.length > 0) { + data.embeddings = testStepAttachments.map((attachment) => ({ + data: attachment.contentEncoding === + messages.AttachmentContentEncoding.IDENTITY + ? Buffer.from(attachment.body).toString('base64') + : attachment.body, + mime_type: attachment.mediaType, + })); + } + return data; + } + getFeatureTags(feature) { + return feature.tags.map((tagData) => ({ + name: tagData.name, + line: tagData.location.line, + })); + } + getScenarioTags({ feature, pickle, gherkinScenarioMap, }) { + const scenario = gherkinScenarioMap[pickle.astNodeIds[0]]; + return pickle.tags.map((tagData) => this.getScenarioTag(tagData, feature, scenario)); + } + getScenarioTag(tagData, feature, scenario) { + const byAstNodeId = (tag) => tag.id === tagData.astNodeId; + const flatten = (acc, val) => acc.concat(val); + const tag = feature.tags.find(byAstNodeId) || + scenario.tags.find(byAstNodeId) || + scenario.examples + .map((e) => e.tags) + .reduce(flatten, []) + .find(byAstNodeId); + return { + name: tagData.name, + line: tag?.location?.line, + }; + } +} +exports.default = JsonFormatter; +//# sourceMappingURL=json_formatter.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/json_formatter.js.map b/node_modules/@cucumber/cucumber/lib/formatter/json_formatter.js.map new file mode 100644 index 00000000..e1ce3ff4 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/json_formatter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"json_formatter.js","sourceRoot":"","sources":["../../src/formatter/json_formatter.ts"],"names":[],"mappings":"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","sourcesContent":["import * as messages from '@cucumber/messages'\nimport { doesHaveValue, doesNotHaveValue } from '../value_checker'\nimport { parseStepArgument } from '../step_arguments'\nimport { formatLocation, GherkinDocumentParser, PickleParser } from './helpers'\nimport {\n getGherkinExampleRuleMap,\n getGherkinScenarioLocationMap,\n} from './helpers/gherkin_document_parser'\nimport { ITestCaseAttempt } from './helpers/event_data_collector'\nimport { durationToNanoseconds } from './helpers/duration_helpers'\nimport Formatter, { IFormatterOptions } from './'\n\nconst { getGherkinStepMap, getGherkinScenarioMap } = GherkinDocumentParser\n\nconst { getScenarioDescription, getPickleStepMap, getStepKeyword } =\n PickleParser\n\nexport interface IJsonFeature {\n description: string\n elements: IJsonScenario[]\n id: string\n keyword: string\n line: number\n name: string\n tags: IJsonTag[]\n uri: string\n}\n\nexport interface IJsonScenario {\n description: string\n id: string\n keyword: string\n line: number\n name: string\n steps: IJsonStep[]\n tags: IJsonTag[]\n type: string\n}\n\nexport interface IJsonStep {\n arguments?: any // TODO\n embeddings?: any // TODO\n hidden?: boolean\n keyword?: string // TODO, not optional\n line?: number\n match?: any // TODO\n name?: string\n result?: any // TODO\n}\n\nexport interface IJsonTag {\n name: string\n line: number\n}\n\ninterface IBuildJsonFeatureOptions {\n feature: messages.Feature\n elements: IJsonScenario[]\n uri: string\n}\n\ninterface IBuildJsonScenarioOptions {\n feature: messages.Feature\n gherkinScenarioMap: Record\n gherkinExampleRuleMap: Record\n gherkinScenarioLocationMap: Record\n pickle: messages.Pickle\n steps: IJsonStep[]\n}\n\ninterface IBuildJsonStepOptions {\n isBeforeHook: boolean\n gherkinStepMap: Record\n pickleStepMap: Record\n testStep: messages.TestStep\n testStepAttachments: messages.Attachment[]\n testStepResult: messages.TestStepResult\n}\n\ninterface UriToTestCaseAttemptsMap {\n [uri: string]: ITestCaseAttempt[]\n}\n\nexport default class JsonFormatter extends Formatter {\n public static readonly documentation: string =\n 'Prints the feature as JSON. The JSON format is in maintenance mode. Please consider using the message formatter with the standalone json-formatter (https://github.com/cucumber/json-formatter).'\n\n constructor(options: IFormatterOptions) {\n super(options)\n options.eventBroadcaster.on('envelope', (envelope: messages.Envelope) => {\n if (doesHaveValue(envelope.testRunFinished)) {\n this.onTestRunFinished()\n }\n })\n }\n\n convertNameToId(obj: messages.Feature | messages.Pickle): string {\n return obj.name.replace(/ /g, '-').toLowerCase()\n }\n\n formatDataTable(dataTable: messages.PickleTable): any {\n return {\n rows: dataTable.rows.map((row) => ({\n cells: row.cells.map((x) => x.value),\n })),\n }\n }\n\n formatDocString(\n docString: messages.PickleDocString,\n gherkinStep: messages.Step\n ): any {\n return {\n content: docString.content,\n line: gherkinStep.docString.location.line,\n }\n }\n\n formatStepArgument(\n stepArgument: messages.PickleStepArgument,\n gherkinStep: messages.Step\n ): any {\n if (doesNotHaveValue(stepArgument)) {\n return []\n }\n return [\n parseStepArgument(stepArgument, {\n dataTable: (dataTable) => this.formatDataTable(dataTable),\n docString: (docString) => this.formatDocString(docString, gherkinStep),\n }),\n ]\n }\n\n onTestRunFinished(): void {\n const groupedTestCaseAttempts: UriToTestCaseAttemptsMap = {}\n this.eventDataCollector\n .getTestCaseAttempts()\n .forEach((testCaseAttempt: ITestCaseAttempt) => {\n if (!testCaseAttempt.willBeRetried) {\n const uri = testCaseAttempt.pickle.uri\n if (doesNotHaveValue(groupedTestCaseAttempts[uri])) {\n groupedTestCaseAttempts[uri] = []\n }\n groupedTestCaseAttempts[uri].push(testCaseAttempt)\n }\n })\n const features = Object.keys(groupedTestCaseAttempts).map((uri) => {\n const group = groupedTestCaseAttempts[uri]\n const { gherkinDocument } = group[0]\n const gherkinStepMap = getGherkinStepMap(gherkinDocument)\n const gherkinScenarioMap = getGherkinScenarioMap(gherkinDocument)\n const gherkinExampleRuleMap = getGherkinExampleRuleMap(gherkinDocument)\n const gherkinScenarioLocationMap =\n getGherkinScenarioLocationMap(gherkinDocument)\n const elements = group.map((testCaseAttempt: ITestCaseAttempt) => {\n const { pickle } = testCaseAttempt\n const pickleStepMap = getPickleStepMap(pickle)\n let isBeforeHook = true\n const steps = testCaseAttempt.testCase.testSteps.map((testStep) => {\n isBeforeHook = isBeforeHook && !doesHaveValue(testStep.pickleStepId)\n return this.getStepData({\n isBeforeHook,\n gherkinStepMap,\n pickleStepMap,\n testStep,\n testStepAttachments: testCaseAttempt.stepAttachments[testStep.id],\n testStepResult: testCaseAttempt.stepResults[testStep.id],\n })\n })\n return this.getScenarioData({\n feature: gherkinDocument.feature,\n gherkinScenarioLocationMap,\n gherkinExampleRuleMap,\n gherkinScenarioMap,\n pickle,\n steps,\n })\n })\n return this.getFeatureData({\n feature: gherkinDocument.feature,\n elements,\n uri,\n })\n })\n this.log(JSON.stringify(features, null, 2))\n }\n\n getFeatureData({\n feature,\n elements,\n uri,\n }: IBuildJsonFeatureOptions): IJsonFeature {\n return {\n description: feature.description,\n elements,\n id: this.convertNameToId(feature),\n line: feature.location.line,\n keyword: feature.keyword,\n name: feature.name,\n tags: this.getFeatureTags(feature),\n uri,\n }\n }\n\n getScenarioData({\n feature,\n gherkinScenarioLocationMap,\n gherkinExampleRuleMap,\n gherkinScenarioMap,\n pickle,\n steps,\n }: IBuildJsonScenarioOptions): IJsonScenario {\n const description = getScenarioDescription({\n pickle,\n gherkinScenarioMap,\n })\n return {\n description,\n id: this.formatScenarioId({ feature, pickle, gherkinExampleRuleMap }),\n keyword: gherkinScenarioMap[pickle.astNodeIds[0]].keyword,\n line: gherkinScenarioLocationMap[\n pickle.astNodeIds[pickle.astNodeIds.length - 1]\n ].line,\n name: pickle.name,\n steps,\n tags: this.getScenarioTags({ feature, pickle, gherkinScenarioMap }),\n type: 'scenario',\n }\n }\n\n private formatScenarioId({\n feature,\n pickle,\n gherkinExampleRuleMap,\n }: {\n feature: messages.Feature\n pickle: messages.Pickle\n gherkinExampleRuleMap: Record\n }): string {\n let parts: any[]\n const rule = gherkinExampleRuleMap[pickle.astNodeIds[0]]\n if (doesHaveValue(rule)) {\n parts = [feature, rule, pickle]\n } else {\n parts = [feature, pickle]\n }\n return parts.map((part) => this.convertNameToId(part)).join(';')\n }\n\n getStepData({\n isBeforeHook,\n gherkinStepMap,\n pickleStepMap,\n testStep,\n testStepAttachments,\n testStepResult,\n }: IBuildJsonStepOptions): IJsonStep {\n const data: IJsonStep = {}\n if (doesHaveValue(testStep.pickleStepId)) {\n const pickleStep = pickleStepMap[testStep.pickleStepId]\n data.arguments = this.formatStepArgument(\n pickleStep.argument,\n gherkinStepMap[pickleStep.astNodeIds[0]]\n )\n data.keyword = getStepKeyword({ pickleStep, gherkinStepMap })\n data.line = gherkinStepMap[pickleStep.astNodeIds[0]].location.line\n data.name = pickleStep.text\n } else {\n data.keyword = isBeforeHook ? 'Before' : 'After'\n data.hidden = true\n }\n if (\n doesHaveValue(testStep.stepDefinitionIds) &&\n testStep.stepDefinitionIds.length === 1\n ) {\n const stepDefinition = this.supportCodeLibrary.stepDefinitions.find(\n (s) => s.id === testStep.stepDefinitionIds[0]\n )\n data.match = { location: formatLocation(stepDefinition) }\n }\n const { message, status } = testStepResult\n data.result = {\n status: messages.TestStepResultStatus[status].toLowerCase(),\n }\n if (doesHaveValue(testStepResult.duration)) {\n data.result.duration = durationToNanoseconds(testStepResult.duration)\n }\n if (\n status === messages.TestStepResultStatus.FAILED &&\n doesHaveValue(message)\n ) {\n data.result.error_message = message\n }\n if (testStepAttachments?.length > 0) {\n data.embeddings = testStepAttachments.map((attachment) => ({\n data:\n attachment.contentEncoding ===\n messages.AttachmentContentEncoding.IDENTITY\n ? Buffer.from(attachment.body).toString('base64')\n : attachment.body,\n mime_type: attachment.mediaType,\n }))\n }\n return data\n }\n\n getFeatureTags(feature: messages.Feature): IJsonTag[] {\n return feature.tags.map((tagData) => ({\n name: tagData.name,\n line: tagData.location.line,\n }))\n }\n\n getScenarioTags({\n feature,\n pickle,\n gherkinScenarioMap,\n }: {\n feature: messages.Feature\n pickle: messages.Pickle\n gherkinScenarioMap: Record\n }): IJsonTag[] {\n const scenario = gherkinScenarioMap[pickle.astNodeIds[0]]\n\n return pickle.tags.map(\n (tagData: messages.PickleTag): IJsonTag =>\n this.getScenarioTag(tagData, feature, scenario)\n )\n }\n\n private getScenarioTag(\n tagData: messages.PickleTag,\n feature: messages.Feature,\n scenario: messages.Scenario\n ): IJsonTag {\n const byAstNodeId = (tag: messages.Tag): boolean =>\n tag.id === tagData.astNodeId\n const flatten = (\n acc: messages.Tag[],\n val: messages.Tag[]\n ): messages.Tag[] => acc.concat(val)\n\n const tag =\n feature.tags.find(byAstNodeId) ||\n scenario.tags.find(byAstNodeId) ||\n scenario.examples\n .map((e) => e.tags)\n .reduce(flatten, [])\n .find(byAstNodeId)\n\n return {\n name: tagData.name,\n line: tag?.location?.line,\n }\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/progress_bar_formatter.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/progress_bar_formatter.d.ts new file mode 100644 index 00000000..1c91a23c --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/progress_bar_formatter.d.ts @@ -0,0 +1,18 @@ +import ProgressBar from 'progress'; +import * as messages from '@cucumber/messages'; +import Formatter, { IFormatterOptions } from './'; +export default class ProgressBarFormatter extends Formatter { + private numberOfSteps; + private testRunStarted; + private issueCount; + progressBar: ProgressBar; + static readonly documentation: string; + constructor(options: IFormatterOptions); + incrementStepCount(pickleId: string): void; + initializeProgressBar(): void; + logProgress({ testStepId, testCaseStartedId, }: messages.TestStepFinished): void; + logUndefinedParametertype(parameterType: messages.UndefinedParameterType): void; + logErrorIfNeeded(testCaseFinished: messages.TestCaseFinished): void; + logSummary(testRunFinished: messages.TestRunFinished): void; + parseEnvelope(envelope: messages.Envelope): void; +} diff --git a/node_modules/@cucumber/cucumber/lib/formatter/progress_bar_formatter.js b/node_modules/@cucumber/cucumber/lib/formatter/progress_bar_formatter.js new file mode 100644 index 00000000..a79125de --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/progress_bar_formatter.js @@ -0,0 +1,103 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const progress_1 = __importDefault(require("progress")); +const value_checker_1 = require("../value_checker"); +const time_1 = require("../time"); +const issue_helpers_1 = require("./helpers/issue_helpers"); +const helpers_1 = require("./helpers"); +const _1 = __importDefault(require("./")); +// Inspired by https://github.com/thekompanee/fuubar and https://github.com/martinciu/fuubar-cucumber +class ProgressBarFormatter extends _1.default { + numberOfSteps; + testRunStarted; + issueCount; + progressBar; + static documentation = 'Similar to the Progress Formatter, but provides a real-time updating progress bar based on the total number of steps to be executed in the test run'; + constructor(options) { + super(options); + options.eventBroadcaster.on('envelope', this.parseEnvelope.bind(this)); + this.numberOfSteps = 0; + this.issueCount = 0; + } + incrementStepCount(pickleId) { + const pickle = this.eventDataCollector.getPickle(pickleId); + this.numberOfSteps += pickle.steps.length; + } + initializeProgressBar() { + if ((0, value_checker_1.doesHaveValue)(this.progressBar)) { + return; + } + this.progressBar = new progress_1.default(':current/:total steps [:bar] ', { + clear: true, + incomplete: ' ', + stream: this.stream, + total: this.numberOfSteps, + width: (0, value_checker_1.valueOrDefault)(this.stream.columns, 80), + }); + } + logProgress({ testStepId, testCaseStartedId, }) { + const { testCase } = this.eventDataCollector.getTestCaseAttempt(testCaseStartedId); + const testStep = testCase.testSteps.find((s) => s.id === testStepId); + if ((0, value_checker_1.doesHaveValue)(testStep.pickleStepId)) { + this.progressBar.tick(); + } + } + logUndefinedParametertype(parameterType) { + this.log(`Undefined parameter type: ${(0, issue_helpers_1.formatUndefinedParameterType)(parameterType)}\n`); + } + logErrorIfNeeded(testCaseFinished) { + const { worstTestStepResult } = this.eventDataCollector.getTestCaseAttempt(testCaseFinished.testCaseStartedId); + if ((0, helpers_1.isIssue)(worstTestStepResult)) { + this.issueCount += 1; + const testCaseAttempt = this.eventDataCollector.getTestCaseAttempt(testCaseFinished.testCaseStartedId); + this.progressBar.interrupt((0, helpers_1.formatIssue)({ + colorFns: this.colorFns, + number: this.issueCount, + snippetBuilder: this.snippetBuilder, + supportCodeLibrary: this.supportCodeLibrary, + testCaseAttempt, + printAttachments: this.printAttachments, + })); + if (testCaseFinished.willBeRetried) { + const stepsToRetry = testCaseAttempt.pickle.steps.length; + this.progressBar.tick(-stepsToRetry); + } + } + } + logSummary(testRunFinished) { + const testRunDuration = (0, time_1.durationBetweenTimestamps)(this.testRunStarted.timestamp, testRunFinished.timestamp); + this.log((0, helpers_1.formatSummary)({ + colorFns: this.colorFns, + testCaseAttempts: this.eventDataCollector.getTestCaseAttempts(), + testRunDuration, + })); + } + parseEnvelope(envelope) { + if ((0, value_checker_1.doesHaveValue)(envelope.undefinedParameterType)) { + this.logUndefinedParametertype(envelope.undefinedParameterType); + } + else if ((0, value_checker_1.doesHaveValue)(envelope.testCase)) { + this.incrementStepCount(envelope.testCase.pickleId); + } + else if ((0, value_checker_1.doesHaveValue)(envelope.testStepStarted)) { + this.initializeProgressBar(); + } + else if ((0, value_checker_1.doesHaveValue)(envelope.testStepFinished)) { + this.logProgress(envelope.testStepFinished); + } + else if ((0, value_checker_1.doesHaveValue)(envelope.testCaseFinished)) { + this.logErrorIfNeeded(envelope.testCaseFinished); + } + else if ((0, value_checker_1.doesHaveValue)(envelope.testRunStarted)) { + this.testRunStarted = envelope.testRunStarted; + } + else if ((0, value_checker_1.doesHaveValue)(envelope.testRunFinished)) { + this.logSummary(envelope.testRunFinished); + } + } +} +exports.default = ProgressBarFormatter; +//# sourceMappingURL=progress_bar_formatter.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/progress_bar_formatter.js.map b/node_modules/@cucumber/cucumber/lib/formatter/progress_bar_formatter.js.map new file mode 100644 index 00000000..e43ca245 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/progress_bar_formatter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"progress_bar_formatter.js","sourceRoot":"","sources":["../../src/formatter/progress_bar_formatter.ts"],"names":[],"mappings":";;;;;AACA,wDAAkC;AAElC,oDAAgE;AAChE,kCAAmD;AACnD,2DAAsE;AACtE,uCAA+D;AAC/D,0CAAiD;AAEjD,qGAAqG;AACrG,MAAqB,oBAAqB,SAAQ,UAAS;IACjD,aAAa,CAAQ;IACrB,cAAc,CAAyB;IACvC,UAAU,CAAQ;IACnB,WAAW,CAAa;IACxB,MAAM,CAAU,aAAa,GAClC,qJAAqJ,CAAA;IAEvJ,YAAY,OAA0B;QACpC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACtE,IAAI,CAAC,aAAa,GAAG,CAAC,CAAA;QACtB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAA;IACrB,CAAC;IAED,kBAAkB,CAAC,QAAgB;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QAC1D,IAAI,CAAC,aAAa,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAA;IAC3C,CAAC;IAED,qBAAqB;QACnB,IAAI,IAAA,6BAAa,EAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACpC,OAAM;QACR,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,kBAAW,CAAC,+BAA+B,EAAE;YAClE,KAAK,EAAE,IAAI;YACX,UAAU,EAAE,GAAG;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,aAAa;YACzB,KAAK,EAAE,IAAA,8BAAc,EAAE,IAAI,CAAC,MAAyB,CAAC,OAAO,EAAE,EAAE,CAAC;SACnE,CAAC,CAAA;IACJ,CAAC;IAED,WAAW,CAAC,EACV,UAAU,EACV,iBAAiB,GACS;QAC1B,MAAM,EAAE,QAAQ,EAAE,GAChB,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAA;QAC/D,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,CAAA;QACpE,IAAI,IAAA,6BAAa,EAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAA;QACzB,CAAC;IACH,CAAC;IAED,yBAAyB,CACvB,aAA8C;QAE9C,IAAI,CAAC,GAAG,CACN,6BAA6B,IAAA,4CAA4B,EACvD,aAAa,CACd,IAAI,CACN,CAAA;IACH,CAAC;IAED,gBAAgB,CAAC,gBAA2C;QAC1D,MAAM,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,CACxE,gBAAgB,CAAC,iBAAiB,CACnC,CAAA;QACD,IAAI,IAAA,iBAAO,EAAC,mBAAmB,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,UAAU,IAAI,CAAC,CAAA;YACpB,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,CAChE,gBAAgB,CAAC,iBAAiB,CACnC,CAAA;YACD,IAAI,CAAC,WAAW,CAAC,SAAS,CACxB,IAAA,qBAAW,EAAC;gBACV,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,MAAM,EAAE,IAAI,CAAC,UAAU;gBACvB,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;gBAC3C,eAAe;gBACf,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;aACxC,CAAC,CACH,CAAA;YACD,IAAI,gBAAgB,CAAC,aAAa,EAAE,CAAC;gBACnC,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAA;gBACxD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAA;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IAED,UAAU,CAAC,eAAyC;QAClD,MAAM,eAAe,GAAG,IAAA,gCAAyB,EAC/C,IAAI,CAAC,cAAc,CAAC,SAAS,EAC7B,eAAe,CAAC,SAAS,CAC1B,CAAA;QACD,IAAI,CAAC,GAAG,CACN,IAAA,uBAAa,EAAC;YACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,gBAAgB,EAAE,IAAI,CAAC,kBAAkB,CAAC,mBAAmB,EAAE;YAC/D,eAAe;SAChB,CAAC,CACH,CAAA;IACH,CAAC;IAED,aAAa,CAAC,QAA2B;QACvC,IAAI,IAAA,6BAAa,EAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAA;QACjE,CAAC;aAAM,IAAI,IAAA,6BAAa,EAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QACrD,CAAC;aAAM,IAAI,IAAA,6BAAa,EAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,qBAAqB,EAAE,CAAA;QAC9B,CAAC;aAAM,IAAI,IAAA,6BAAa,EAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAA;QAC7C,CAAC;aAAM,IAAI,IAAA,6BAAa,EAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAA;QAClD,CAAC;aAAM,IAAI,IAAA,6BAAa,EAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAA;QAC/C,CAAC;aAAM,IAAI,IAAA,6BAAa,EAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAA;QAC3C,CAAC;IACH,CAAC;;AA/GH,uCAgHC","sourcesContent":["import { WriteStream as TtyWriteStream } from 'node:tty'\nimport ProgressBar from 'progress'\nimport * as messages from '@cucumber/messages'\nimport { doesHaveValue, valueOrDefault } from '../value_checker'\nimport { durationBetweenTimestamps } from '../time'\nimport { formatUndefinedParameterType } from './helpers/issue_helpers'\nimport { formatIssue, formatSummary, isIssue } from './helpers'\nimport Formatter, { IFormatterOptions } from './'\n\n// Inspired by https://github.com/thekompanee/fuubar and https://github.com/martinciu/fuubar-cucumber\nexport default class ProgressBarFormatter extends Formatter {\n private numberOfSteps: number\n private testRunStarted: messages.TestRunStarted\n private issueCount: number\n public progressBar: ProgressBar\n public static readonly documentation: string =\n 'Similar to the Progress Formatter, but provides a real-time updating progress bar based on the total number of steps to be executed in the test run'\n\n constructor(options: IFormatterOptions) {\n super(options)\n options.eventBroadcaster.on('envelope', this.parseEnvelope.bind(this))\n this.numberOfSteps = 0\n this.issueCount = 0\n }\n\n incrementStepCount(pickleId: string): void {\n const pickle = this.eventDataCollector.getPickle(pickleId)\n this.numberOfSteps += pickle.steps.length\n }\n\n initializeProgressBar(): void {\n if (doesHaveValue(this.progressBar)) {\n return\n }\n this.progressBar = new ProgressBar(':current/:total steps [:bar] ', {\n clear: true,\n incomplete: ' ',\n stream: this.stream,\n total: this.numberOfSteps,\n width: valueOrDefault((this.stream as TtyWriteStream).columns, 80),\n })\n }\n\n logProgress({\n testStepId,\n testCaseStartedId,\n }: messages.TestStepFinished): void {\n const { testCase } =\n this.eventDataCollector.getTestCaseAttempt(testCaseStartedId)\n const testStep = testCase.testSteps.find((s) => s.id === testStepId)\n if (doesHaveValue(testStep.pickleStepId)) {\n this.progressBar.tick()\n }\n }\n\n logUndefinedParametertype(\n parameterType: messages.UndefinedParameterType\n ): void {\n this.log(\n `Undefined parameter type: ${formatUndefinedParameterType(\n parameterType\n )}\\n`\n )\n }\n\n logErrorIfNeeded(testCaseFinished: messages.TestCaseFinished): void {\n const { worstTestStepResult } = this.eventDataCollector.getTestCaseAttempt(\n testCaseFinished.testCaseStartedId\n )\n if (isIssue(worstTestStepResult)) {\n this.issueCount += 1\n const testCaseAttempt = this.eventDataCollector.getTestCaseAttempt(\n testCaseFinished.testCaseStartedId\n )\n this.progressBar.interrupt(\n formatIssue({\n colorFns: this.colorFns,\n number: this.issueCount,\n snippetBuilder: this.snippetBuilder,\n supportCodeLibrary: this.supportCodeLibrary,\n testCaseAttempt,\n printAttachments: this.printAttachments,\n })\n )\n if (testCaseFinished.willBeRetried) {\n const stepsToRetry = testCaseAttempt.pickle.steps.length\n this.progressBar.tick(-stepsToRetry)\n }\n }\n }\n\n logSummary(testRunFinished: messages.TestRunFinished): void {\n const testRunDuration = durationBetweenTimestamps(\n this.testRunStarted.timestamp,\n testRunFinished.timestamp\n )\n this.log(\n formatSummary({\n colorFns: this.colorFns,\n testCaseAttempts: this.eventDataCollector.getTestCaseAttempts(),\n testRunDuration,\n })\n )\n }\n\n parseEnvelope(envelope: messages.Envelope): void {\n if (doesHaveValue(envelope.undefinedParameterType)) {\n this.logUndefinedParametertype(envelope.undefinedParameterType)\n } else if (doesHaveValue(envelope.testCase)) {\n this.incrementStepCount(envelope.testCase.pickleId)\n } else if (doesHaveValue(envelope.testStepStarted)) {\n this.initializeProgressBar()\n } else if (doesHaveValue(envelope.testStepFinished)) {\n this.logProgress(envelope.testStepFinished)\n } else if (doesHaveValue(envelope.testCaseFinished)) {\n this.logErrorIfNeeded(envelope.testCaseFinished)\n } else if (doesHaveValue(envelope.testRunStarted)) {\n this.testRunStarted = envelope.testRunStarted\n } else if (doesHaveValue(envelope.testRunFinished)) {\n this.logSummary(envelope.testRunFinished)\n }\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/progress_formatter.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/progress_formatter.d.ts new file mode 100644 index 00000000..c2b1fb64 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/progress_formatter.d.ts @@ -0,0 +1,9 @@ +import * as messages from '@cucumber/messages'; +import SummaryFormatter from './summary_formatter'; +import { IFormatterOptions } from './index'; +import ITestStepFinished = messages.TestStepFinished; +export default class ProgressFormatter extends SummaryFormatter { + static readonly documentation: string; + constructor(options: IFormatterOptions); + logProgress({ testStepResult: { status } }: ITestStepFinished): void; +} diff --git a/node_modules/@cucumber/cucumber/lib/formatter/progress_formatter.js b/node_modules/@cucumber/cucumber/lib/formatter/progress_formatter.js new file mode 100644 index 00000000..64903c46 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/progress_formatter.js @@ -0,0 +1,69 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const messages = __importStar(require("@cucumber/messages")); +const value_checker_1 = require("../value_checker"); +const summary_formatter_1 = __importDefault(require("./summary_formatter")); +const STATUS_CHARACTER_MAPPING = new Map([ + [messages.TestStepResultStatus.AMBIGUOUS, 'A'], + [messages.TestStepResultStatus.FAILED, 'F'], + [messages.TestStepResultStatus.PASSED, '.'], + [messages.TestStepResultStatus.PENDING, 'P'], + [messages.TestStepResultStatus.SKIPPED, '-'], + [messages.TestStepResultStatus.UNDEFINED, 'U'], +]); +class ProgressFormatter extends summary_formatter_1.default { + static documentation = 'Prints one character per scenario.'; + constructor(options) { + options.eventBroadcaster.on('envelope', (envelope) => { + if ((0, value_checker_1.doesHaveValue)(envelope.testRunFinished)) { + this.log('\n\n'); + } + else if ((0, value_checker_1.doesHaveValue)(envelope.testStepFinished)) { + this.logProgress(envelope.testStepFinished); + } + }); + super(options); + } + logProgress({ testStepResult: { status } }) { + const character = this.colorFns.forStatus(status)(STATUS_CHARACTER_MAPPING.get(status)); + this.log(character); + } +} +exports.default = ProgressFormatter; +//# sourceMappingURL=progress_formatter.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/progress_formatter.js.map b/node_modules/@cucumber/cucumber/lib/formatter/progress_formatter.js.map new file mode 100644 index 00000000..f998573e --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/progress_formatter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"progress_formatter.js","sourceRoot":"","sources":["../../src/formatter/progress_formatter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6DAA8C;AAC9C,oDAAgD;AAChD,4EAAkD;AAKlD,MAAM,wBAAwB,GAC5B,IAAI,GAAG,CAAC;IACN,CAAC,QAAQ,CAAC,oBAAoB,CAAC,SAAS,EAAE,GAAG,CAAC;IAC9C,CAAC,QAAQ,CAAC,oBAAoB,CAAC,MAAM,EAAE,GAAG,CAAC;IAC3C,CAAC,QAAQ,CAAC,oBAAoB,CAAC,MAAM,EAAE,GAAG,CAAC;IAC3C,CAAC,QAAQ,CAAC,oBAAoB,CAAC,OAAO,EAAE,GAAG,CAAC;IAC5C,CAAC,QAAQ,CAAC,oBAAoB,CAAC,OAAO,EAAE,GAAG,CAAC;IAC5C,CAAC,QAAQ,CAAC,oBAAoB,CAAC,SAAS,EAAE,GAAG,CAAC;CAC/C,CAAC,CAAA;AAEJ,MAAqB,iBAAkB,SAAQ,2BAAgB;IACtD,MAAM,CAAU,aAAa,GAClC,oCAAoC,CAAA;IAEtC,YAAY,OAA0B;QACpC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,QAAmB,EAAE,EAAE;YAC9D,IAAI,IAAA,6BAAa,EAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YAClB,CAAC;iBAAM,IAAI,IAAA,6BAAa,EAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACpD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAA;YAC7C,CAAC;QACH,CAAC,CAAC,CAAA;QACF,KAAK,CAAC,OAAO,CAAC,CAAA;IAChB,CAAC;IAED,WAAW,CAAC,EAAE,cAAc,EAAE,EAAE,MAAM,EAAE,EAAqB;QAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAC/C,wBAAwB,CAAC,GAAG,CAAC,MAAM,CAAC,CACrC,CAAA;QACD,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACrB,CAAC;;AApBH,oCAqBC","sourcesContent":["import * as messages from '@cucumber/messages'\nimport { doesHaveValue } from '../value_checker'\nimport SummaryFormatter from './summary_formatter'\nimport { IFormatterOptions } from './index'\nimport IEnvelope = messages.Envelope\nimport ITestStepFinished = messages.TestStepFinished\n\nconst STATUS_CHARACTER_MAPPING: Map =\n new Map([\n [messages.TestStepResultStatus.AMBIGUOUS, 'A'],\n [messages.TestStepResultStatus.FAILED, 'F'],\n [messages.TestStepResultStatus.PASSED, '.'],\n [messages.TestStepResultStatus.PENDING, 'P'],\n [messages.TestStepResultStatus.SKIPPED, '-'],\n [messages.TestStepResultStatus.UNDEFINED, 'U'],\n ])\n\nexport default class ProgressFormatter extends SummaryFormatter {\n public static readonly documentation: string =\n 'Prints one character per scenario.'\n\n constructor(options: IFormatterOptions) {\n options.eventBroadcaster.on('envelope', (envelope: IEnvelope) => {\n if (doesHaveValue(envelope.testRunFinished)) {\n this.log('\\n\\n')\n } else if (doesHaveValue(envelope.testStepFinished)) {\n this.logProgress(envelope.testStepFinished)\n }\n })\n super(options)\n }\n\n logProgress({ testStepResult: { status } }: ITestStepFinished): void {\n const character = this.colorFns.forStatus(status)(\n STATUS_CHARACTER_MAPPING.get(status)\n )\n this.log(character)\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/rerun_formatter.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/rerun_formatter.d.ts new file mode 100644 index 00000000..96474e27 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/rerun_formatter.d.ts @@ -0,0 +1,13 @@ +import Formatter, { IFormatterOptions } from './'; +interface UriToLinesMap { + [uri: string]: number[]; +} +export default class RerunFormatter extends Formatter { + protected readonly separator: string; + static readonly documentation: string; + constructor(options: IFormatterOptions); + getFailureMap(): UriToLinesMap; + formatFailedTestCases(): string; + logFailedTestCases(): void; +} +export {}; diff --git a/node_modules/@cucumber/cucumber/lib/formatter/rerun_formatter.js b/node_modules/@cucumber/cucumber/lib/formatter/rerun_formatter.js new file mode 100644 index 00000000..c019fa8f --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/rerun_formatter.js @@ -0,0 +1,91 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const messages = __importStar(require("@cucumber/messages")); +const value_checker_1 = require("../value_checker"); +const gherkin_document_parser_1 = require("./helpers/gherkin_document_parser"); +const _1 = __importDefault(require("./")); +const DEFAULT_SEPARATOR = '\n'; +function isFailedAttempt(worstTestStepResult) { + return worstTestStepResult.status !== messages.TestStepResultStatus.PASSED; +} +class RerunFormatter extends _1.default { + separator; + static documentation = 'Prints failing files with line numbers.'; + constructor(options) { + super(options); + options.eventBroadcaster.on('envelope', (envelope) => { + if ((0, value_checker_1.doesHaveValue)(envelope.testRunFinished)) { + this.logFailedTestCases(); + } + }); + const rerunOptions = (0, value_checker_1.valueOrDefault)(options.parsedArgvOptions.rerun, {}); + this.separator = (0, value_checker_1.valueOrDefault)(rerunOptions.separator, DEFAULT_SEPARATOR); + } + getFailureMap() { + const mapping = {}; + this.eventDataCollector + .getTestCaseAttempts() + .forEach(({ gherkinDocument, pickle, worstTestStepResult, willBeRetried }) => { + if (isFailedAttempt(worstTestStepResult) && !willBeRetried) { + const relativeUri = pickle.uri; + const line = (0, gherkin_document_parser_1.getGherkinScenarioLocationMap)(gherkinDocument)[pickle.astNodeIds[pickle.astNodeIds.length - 1]].line; + if ((0, value_checker_1.doesNotHaveValue)(mapping[relativeUri])) { + mapping[relativeUri] = []; + } + mapping[relativeUri].push(line); + } + }); + return mapping; + } + formatFailedTestCases() { + const mapping = this.getFailureMap(); + return Object.keys(mapping) + .map((uri) => { + const lines = mapping[uri]; + return `${uri}:${lines.join(':')}`; + }) + .join(this.separator); + } + logFailedTestCases() { + const failedTestCases = this.formatFailedTestCases(); + this.log(failedTestCases); + } +} +exports.default = RerunFormatter; +//# sourceMappingURL=rerun_formatter.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/rerun_formatter.js.map b/node_modules/@cucumber/cucumber/lib/formatter/rerun_formatter.js.map new file mode 100644 index 00000000..5b373766 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/rerun_formatter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"rerun_formatter.js","sourceRoot":"","sources":["../../src/formatter/rerun_formatter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6DAA8C;AAC9C,oDAIyB;AACzB,+EAAiF;AACjF,0CAAiD;AAEjD,MAAM,iBAAiB,GAAG,IAAI,CAAA;AAM9B,SAAS,eAAe,CAAC,mBAA4C;IACnE,OAAO,mBAAmB,CAAC,MAAM,KAAK,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAA;AAC5E,CAAC;AAED,MAAqB,cAAe,SAAQ,UAAS;IAChC,SAAS,CAAQ;IAC7B,MAAM,CAAU,aAAa,GAClC,yCAAyC,CAAA;IAE3C,YAAY,OAA0B;QACpC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,QAA2B,EAAE,EAAE;YACtE,IAAI,IAAA,6BAAa,EAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,kBAAkB,EAAE,CAAA;YAC3B,CAAC;QACH,CAAC,CAAC,CAAA;QACF,MAAM,YAAY,GAAG,IAAA,8BAAc,EAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QACxE,IAAI,CAAC,SAAS,GAAG,IAAA,8BAAc,EAAC,YAAY,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAA;IAC5E,CAAC;IAED,aAAa;QACX,MAAM,OAAO,GAAkB,EAAE,CAAA;QACjC,IAAI,CAAC,kBAAkB;aACpB,mBAAmB,EAAE;aACrB,OAAO,CACN,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,mBAAmB,EAAE,aAAa,EAAE,EAAE,EAAE;YAClE,IAAI,eAAe,CAAC,mBAAmB,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBAC3D,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAA;gBAC9B,MAAM,IAAI,GACR,IAAA,uDAA6B,EAAC,eAAe,CAAC,CAC5C,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAChD,CAAC,IAAI,CAAA;gBACR,IAAI,IAAA,gCAAgB,EAAC,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;oBAC3C,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,CAAA;gBAC3B,CAAC;gBACD,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACjC,CAAC;QACH,CAAC,CACF,CAAA;QAEH,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,qBAAqB;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAA;QAEpC,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;aACxB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACX,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;YAC1B,OAAO,GAAG,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAA;QACpC,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACzB,CAAC;IAED,kBAAkB;QAChB,MAAM,eAAe,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAA;QACpD,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;IAC3B,CAAC;;AArDH,iCAsDC","sourcesContent":["import * as messages from '@cucumber/messages'\nimport {\n doesHaveValue,\n doesNotHaveValue,\n valueOrDefault,\n} from '../value_checker'\nimport { getGherkinScenarioLocationMap } from './helpers/gherkin_document_parser'\nimport Formatter, { IFormatterOptions } from './'\n\nconst DEFAULT_SEPARATOR = '\\n'\n\ninterface UriToLinesMap {\n [uri: string]: number[]\n}\n\nfunction isFailedAttempt(worstTestStepResult: messages.TestStepResult) {\n return worstTestStepResult.status !== messages.TestStepResultStatus.PASSED\n}\n\nexport default class RerunFormatter extends Formatter {\n protected readonly separator: string\n public static readonly documentation: string =\n 'Prints failing files with line numbers.'\n\n constructor(options: IFormatterOptions) {\n super(options)\n options.eventBroadcaster.on('envelope', (envelope: messages.Envelope) => {\n if (doesHaveValue(envelope.testRunFinished)) {\n this.logFailedTestCases()\n }\n })\n const rerunOptions = valueOrDefault(options.parsedArgvOptions.rerun, {})\n this.separator = valueOrDefault(rerunOptions.separator, DEFAULT_SEPARATOR)\n }\n\n getFailureMap(): UriToLinesMap {\n const mapping: UriToLinesMap = {}\n this.eventDataCollector\n .getTestCaseAttempts()\n .forEach(\n ({ gherkinDocument, pickle, worstTestStepResult, willBeRetried }) => {\n if (isFailedAttempt(worstTestStepResult) && !willBeRetried) {\n const relativeUri = pickle.uri\n const line =\n getGherkinScenarioLocationMap(gherkinDocument)[\n pickle.astNodeIds[pickle.astNodeIds.length - 1]\n ].line\n if (doesNotHaveValue(mapping[relativeUri])) {\n mapping[relativeUri] = []\n }\n mapping[relativeUri].push(line)\n }\n }\n )\n\n return mapping\n }\n\n formatFailedTestCases(): string {\n const mapping = this.getFailureMap()\n\n return Object.keys(mapping)\n .map((uri) => {\n const lines = mapping[uri]\n return `${uri}:${lines.join(':')}`\n })\n .join(this.separator)\n }\n\n logFailedTestCases(): void {\n const failedTestCases = this.formatFailedTestCases()\n this.log(failedTestCases)\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/resolve_implementation.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/resolve_implementation.d.ts new file mode 100644 index 00000000..e268add1 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/resolve_implementation.d.ts @@ -0,0 +1,2 @@ +import { FormatterImplementation } from './index'; +export declare function resolveImplementation(specifier: string, cwd: string): Promise; diff --git a/node_modules/@cucumber/cucumber/lib/formatter/resolve_implementation.js b/node_modules/@cucumber/cucumber/lib/formatter/resolve_implementation.js new file mode 100644 index 00000000..0712c774 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/resolve_implementation.js @@ -0,0 +1,27 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.resolveImplementation = resolveImplementation; +const builtin_1 = __importDefault(require("./builtin")); +const import_code_1 = require("./import_code"); +const find_class_or_plugin_1 = require("./find_class_or_plugin"); +async function resolveImplementation(specifier, cwd) { + const fromBuiltin = builtin_1.default[specifier]; + if (fromBuiltin) { + if (typeof fromBuiltin !== 'string') { + return fromBuiltin; + } + else { + specifier = fromBuiltin; + } + } + const imported = await (0, import_code_1.importCode)(specifier, cwd); + const found = (0, find_class_or_plugin_1.findClassOrPlugin)(imported); + if (!found) { + throw new Error(`${specifier} does not export a function/class`); + } + return found; +} +//# sourceMappingURL=resolve_implementation.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/resolve_implementation.js.map b/node_modules/@cucumber/cucumber/lib/formatter/resolve_implementation.js.map new file mode 100644 index 00000000..4dc73ab5 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/resolve_implementation.js.map @@ -0,0 +1 @@ +{"version":3,"file":"resolve_implementation.js","sourceRoot":"","sources":["../../src/formatter/resolve_implementation.ts"],"names":[],"mappings":";;;;;AAKA,sDAkBC;AAvBD,wDAA+B;AAC/B,+CAA0C;AAC1C,iEAA0D;AAGnD,KAAK,UAAU,qBAAqB,CACzC,SAAiB,EACjB,GAAW;IAEX,MAAM,WAAW,GAAG,iBAAO,CAAC,SAAS,CAAC,CAAA;IACtC,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;YACpC,OAAO,WAAW,CAAA;QACpB,CAAC;aAAM,CAAC;YACN,SAAS,GAAG,WAAW,CAAA;QACzB,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,IAAA,wBAAU,EAAC,SAAS,EAAE,GAAG,CAAC,CAAA;IACjD,MAAM,KAAK,GAAG,IAAA,wCAAiB,EAAC,QAAQ,CAAC,CAAA;IACzC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,GAAG,SAAS,mCAAmC,CAAC,CAAA;IAClE,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC","sourcesContent":["import builtin from './builtin'\nimport { importCode } from './import_code'\nimport { findClassOrPlugin } from './find_class_or_plugin'\nimport { FormatterImplementation } from './index'\n\nexport async function resolveImplementation(\n specifier: string,\n cwd: string\n): Promise {\n const fromBuiltin = builtin[specifier]\n if (fromBuiltin) {\n if (typeof fromBuiltin !== 'string') {\n return fromBuiltin\n } else {\n specifier = fromBuiltin\n }\n }\n const imported = await importCode(specifier, cwd)\n const found = findClassOrPlugin(imported)\n if (!found) {\n throw new Error(`${specifier} does not export a function/class`)\n }\n return found\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/snippets_formatter.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/snippets_formatter.d.ts new file mode 100644 index 00000000..2b61762b --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/snippets_formatter.d.ts @@ -0,0 +1,6 @@ +import Formatter, { IFormatterOptions } from './'; +export default class SnippetsFormatter extends Formatter { + static readonly documentation: string; + constructor(options: IFormatterOptions); + logSnippets(): void; +} diff --git a/node_modules/@cucumber/cucumber/lib/formatter/snippets_formatter.js b/node_modules/@cucumber/cucumber/lib/formatter/snippets_formatter.js new file mode 100644 index 00000000..49933c70 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/snippets_formatter.js @@ -0,0 +1,71 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const messages = __importStar(require("@cucumber/messages")); +const value_checker_1 = require("../value_checker"); +const helpers_1 = require("./helpers"); +const _1 = __importDefault(require("./")); +class SnippetsFormatter extends _1.default { + static documentation = "The Snippets Formatter doesn't output anything regarding the test run; it just prints snippets to implement any undefined steps"; + constructor(options) { + super(options); + options.eventBroadcaster.on('envelope', (envelope) => { + if ((0, value_checker_1.doesHaveValue)(envelope.testRunFinished)) { + this.logSnippets(); + } + }); + } + logSnippets() { + const snippets = []; + this.eventDataCollector.getTestCaseAttempts().forEach((testCaseAttempt) => { + const parsed = (0, helpers_1.parseTestCaseAttempt)({ + snippetBuilder: this.snippetBuilder, + supportCodeLibrary: this.supportCodeLibrary, + testCaseAttempt, + }); + parsed.testSteps.forEach((testStep) => { + if (testStep.result.status === messages.TestStepResultStatus.UNDEFINED) { + snippets.push(testStep.snippet); + } + }); + }); + this.log(snippets.join('\n\n')); + } +} +exports.default = SnippetsFormatter; +//# sourceMappingURL=snippets_formatter.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/snippets_formatter.js.map b/node_modules/@cucumber/cucumber/lib/formatter/snippets_formatter.js.map new file mode 100644 index 00000000..93cce5cb --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/snippets_formatter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"snippets_formatter.js","sourceRoot":"","sources":["../../src/formatter/snippets_formatter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6DAA8C;AAC9C,oDAAgD;AAChD,uCAAgD;AAChD,0CAAiD;AAGjD,MAAqB,iBAAkB,SAAQ,UAAS;IAC/C,MAAM,CAAU,aAAa,GAClC,iIAAiI,CAAA;IAEnI,YAAY,OAA0B;QACpC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,QAAmB,EAAE,EAAE;YAC9D,IAAI,IAAA,6BAAa,EAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,WAAW,EAAE,CAAA;YACpB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,WAAW;QACT,MAAM,QAAQ,GAAa,EAAE,CAAA;QAC7B,IAAI,CAAC,kBAAkB,CAAC,mBAAmB,EAAE,CAAC,OAAO,CAAC,CAAC,eAAe,EAAE,EAAE;YACxE,MAAM,MAAM,GAAG,IAAA,8BAAoB,EAAC;gBAClC,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;gBAC3C,eAAe;aAChB,CAAC,CAAA;YACF,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACpC,IACE,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,oBAAoB,CAAC,SAAS,EAClE,CAAC;oBACD,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;gBACjC,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;IACjC,CAAC;;AA9BH,oCA+BC","sourcesContent":["import * as messages from '@cucumber/messages'\nimport { doesHaveValue } from '../value_checker'\nimport { parseTestCaseAttempt } from './helpers'\nimport Formatter, { IFormatterOptions } from './'\nimport IEnvelope = messages.Envelope\n\nexport default class SnippetsFormatter extends Formatter {\n public static readonly documentation: string =\n \"The Snippets Formatter doesn't output anything regarding the test run; it just prints snippets to implement any undefined steps\"\n\n constructor(options: IFormatterOptions) {\n super(options)\n options.eventBroadcaster.on('envelope', (envelope: IEnvelope) => {\n if (doesHaveValue(envelope.testRunFinished)) {\n this.logSnippets()\n }\n })\n }\n\n logSnippets(): void {\n const snippets: string[] = []\n this.eventDataCollector.getTestCaseAttempts().forEach((testCaseAttempt) => {\n const parsed = parseTestCaseAttempt({\n snippetBuilder: this.snippetBuilder,\n supportCodeLibrary: this.supportCodeLibrary,\n testCaseAttempt,\n })\n parsed.testSteps.forEach((testStep) => {\n if (\n testStep.result.status === messages.TestStepResultStatus.UNDEFINED\n ) {\n snippets.push(testStep.snippet)\n }\n })\n })\n this.log(snippets.join('\\n\\n'))\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/index.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/index.d.ts new file mode 100644 index 00000000..c1bc5e81 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/index.d.ts @@ -0,0 +1,21 @@ +import { ParameterTypeRegistry } from '@cucumber/cucumber-expressions'; +import * as messages from '@cucumber/messages'; +import { KeywordType } from '../helpers'; +import { ISnippetSnytax } from './snippet_syntax'; +export interface INewStepDefinitionSnippetBuilderOptions { + snippetSyntax: ISnippetSnytax; + parameterTypeRegistry: ParameterTypeRegistry; +} +export interface IBuildRequest { + keywordType: KeywordType; + pickleStep: messages.PickleStep; +} +export default class StepDefinitionSnippetBuilder { + private readonly snippetSyntax; + private readonly cucumberExpressionGenerator; + constructor({ snippetSyntax, parameterTypeRegistry, }: INewStepDefinitionSnippetBuilderOptions); + build({ keywordType, pickleStep }: IBuildRequest): string; + buildMultiple({ keywordType, pickleStep }: IBuildRequest): string[]; + getFunctionName(keywordType: KeywordType): string; + getStepParameterNames(step: messages.PickleStep): string[]; +} diff --git a/node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/index.js b/node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/index.js new file mode 100644 index 00000000..c08c8f18 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/index.js @@ -0,0 +1,62 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const cucumber_expressions_1 = require("@cucumber/cucumber-expressions"); +const helpers_1 = require("../helpers"); +const step_arguments_1 = require("../../step_arguments"); +const value_checker_1 = require("../../value_checker"); +class StepDefinitionSnippetBuilder { + snippetSyntax; + cucumberExpressionGenerator; + constructor({ snippetSyntax, parameterTypeRegistry, }) { + this.snippetSyntax = snippetSyntax; + this.cucumberExpressionGenerator = new cucumber_expressions_1.CucumberExpressionGenerator(() => parameterTypeRegistry.parameterTypes); + } + build({ keywordType, pickleStep }) { + const comment = 'Write code here that turns the phrase above into concrete actions'; + const functionName = this.getFunctionName(keywordType); + const generatedExpressions = this.cucumberExpressionGenerator.generateExpressions(pickleStep.text); + const stepParameterNames = this.getStepParameterNames(pickleStep); + return this.snippetSyntax.build({ + comment, + functionName, + generatedExpressions, + stepParameterNames, + }); + } + buildMultiple({ keywordType, pickleStep }) { + const comment = 'Write code here that turns the phrase above into concrete actions'; + const functionName = this.getFunctionName(keywordType); + const generatedExpressions = this.cucumberExpressionGenerator.generateExpressions(pickleStep.text); + const stepParameterNames = this.getStepParameterNames(pickleStep); + return generatedExpressions.map((generatedExpression) => { + return this.snippetSyntax.build({ + comment, + functionName, + generatedExpressions: [generatedExpression], + stepParameterNames, + }); + }); + } + getFunctionName(keywordType) { + switch (keywordType) { + case helpers_1.KeywordType.Event: + return 'When'; + case helpers_1.KeywordType.Outcome: + return 'Then'; + case helpers_1.KeywordType.Precondition: + return 'Given'; + } + } + getStepParameterNames(step) { + if ((0, value_checker_1.doesHaveValue)(step.argument)) { + const argumentName = (0, step_arguments_1.parseStepArgument)(step.argument, { + dataTable: () => 'dataTable', + docString: () => 'docString', + }); + return [argumentName]; + } + return []; + } +} +exports.default = StepDefinitionSnippetBuilder; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/index.js.map b/node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/index.js.map new file mode 100644 index 00000000..fa588455 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/formatter/step_definition_snippet_builder/index.ts"],"names":[],"mappings":";;AAAA,yEAGuC;AAEvC,wCAAwC;AACxC,yDAAwD;AACxD,uDAAmD;AAanD,MAAqB,4BAA4B;IAC9B,aAAa,CAAgB;IAC7B,2BAA2B,CAA6B;IAEzE,YAAY,EACV,aAAa,EACb,qBAAqB,GACmB;QACxC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;QAClC,IAAI,CAAC,2BAA2B,GAAG,IAAI,kDAA2B,CAChE,GAAG,EAAE,CAAC,qBAAqB,CAAC,cAAc,CAC3C,CAAA;IACH,CAAC;IAED,KAAK,CAAC,EAAE,WAAW,EAAE,UAAU,EAAiB;QAC9C,MAAM,OAAO,GACX,mEAAmE,CAAA;QACrE,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAA;QACtD,MAAM,oBAAoB,GACxB,IAAI,CAAC,2BAA2B,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACvE,MAAM,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAA;QACjE,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;YAC9B,OAAO;YACP,YAAY;YACZ,oBAAoB;YACpB,kBAAkB;SACnB,CAAC,CAAA;IACJ,CAAC;IAED,aAAa,CAAC,EAAE,WAAW,EAAE,UAAU,EAAiB;QACtD,MAAM,OAAO,GACX,mEAAmE,CAAA;QACrE,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAA;QACtD,MAAM,oBAAoB,GACxB,IAAI,CAAC,2BAA2B,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACvE,MAAM,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAA;QACjE,OAAO,oBAAoB,CAAC,GAAG,CAAC,CAAC,mBAAmB,EAAE,EAAE;YACtD,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;gBAC9B,OAAO;gBACP,YAAY;gBACZ,oBAAoB,EAAE,CAAC,mBAAmB,CAAC;gBAC3C,kBAAkB;aACnB,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,eAAe,CAAC,WAAwB;QACtC,QAAQ,WAAW,EAAE,CAAC;YACpB,KAAK,qBAAW,CAAC,KAAK;gBACpB,OAAO,MAAM,CAAA;YACf,KAAK,qBAAW,CAAC,OAAO;gBACtB,OAAO,MAAM,CAAA;YACf,KAAK,qBAAW,CAAC,YAAY;gBAC3B,OAAO,OAAO,CAAA;QAClB,CAAC;IACH,CAAC;IAED,qBAAqB,CAAC,IAAyB;QAC7C,IAAI,IAAA,6BAAa,EAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjC,MAAM,YAAY,GAAG,IAAA,kCAAiB,EAAC,IAAI,CAAC,QAAQ,EAAE;gBACpD,SAAS,EAAE,GAAG,EAAE,CAAC,WAAW;gBAC5B,SAAS,EAAE,GAAG,EAAE,CAAC,WAAW;aAC7B,CAAC,CAAA;YACF,OAAO,CAAC,YAAY,CAAC,CAAA;QACvB,CAAC;QACD,OAAO,EAAE,CAAA;IACX,CAAC;CACF;AAnED,+CAmEC","sourcesContent":["import {\n CucumberExpressionGenerator,\n ParameterTypeRegistry,\n} from '@cucumber/cucumber-expressions'\nimport * as messages from '@cucumber/messages'\nimport { KeywordType } from '../helpers'\nimport { parseStepArgument } from '../../step_arguments'\nimport { doesHaveValue } from '../../value_checker'\nimport { ISnippetSnytax } from './snippet_syntax'\n\nexport interface INewStepDefinitionSnippetBuilderOptions {\n snippetSyntax: ISnippetSnytax\n parameterTypeRegistry: ParameterTypeRegistry\n}\n\nexport interface IBuildRequest {\n keywordType: KeywordType\n pickleStep: messages.PickleStep\n}\n\nexport default class StepDefinitionSnippetBuilder {\n private readonly snippetSyntax: ISnippetSnytax\n private readonly cucumberExpressionGenerator: CucumberExpressionGenerator\n\n constructor({\n snippetSyntax,\n parameterTypeRegistry,\n }: INewStepDefinitionSnippetBuilderOptions) {\n this.snippetSyntax = snippetSyntax\n this.cucumberExpressionGenerator = new CucumberExpressionGenerator(\n () => parameterTypeRegistry.parameterTypes\n )\n }\n\n build({ keywordType, pickleStep }: IBuildRequest): string {\n const comment =\n 'Write code here that turns the phrase above into concrete actions'\n const functionName = this.getFunctionName(keywordType)\n const generatedExpressions =\n this.cucumberExpressionGenerator.generateExpressions(pickleStep.text)\n const stepParameterNames = this.getStepParameterNames(pickleStep)\n return this.snippetSyntax.build({\n comment,\n functionName,\n generatedExpressions,\n stepParameterNames,\n })\n }\n\n buildMultiple({ keywordType, pickleStep }: IBuildRequest): string[] {\n const comment =\n 'Write code here that turns the phrase above into concrete actions'\n const functionName = this.getFunctionName(keywordType)\n const generatedExpressions =\n this.cucumberExpressionGenerator.generateExpressions(pickleStep.text)\n const stepParameterNames = this.getStepParameterNames(pickleStep)\n return generatedExpressions.map((generatedExpression) => {\n return this.snippetSyntax.build({\n comment,\n functionName,\n generatedExpressions: [generatedExpression],\n stepParameterNames,\n })\n })\n }\n\n getFunctionName(keywordType: KeywordType): string {\n switch (keywordType) {\n case KeywordType.Event:\n return 'When'\n case KeywordType.Outcome:\n return 'Then'\n case KeywordType.Precondition:\n return 'Given'\n }\n }\n\n getStepParameterNames(step: messages.PickleStep): string[] {\n if (doesHaveValue(step.argument)) {\n const argumentName = parseStepArgument(step.argument, {\n dataTable: () => 'dataTable',\n docString: () => 'docString',\n })\n return [argumentName]\n }\n return []\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.d.ts new file mode 100644 index 00000000..172b1bc2 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.d.ts @@ -0,0 +1,7 @@ +import { ISnippetSnytax, ISnippetSyntaxBuildOptions, SnippetInterface } from './snippet_syntax'; +export default class JavaScriptSnippetSyntax implements ISnippetSnytax { + private readonly snippetInterface; + constructor(snippetInterface: SnippetInterface); + build({ comment, generatedExpressions, functionName, stepParameterNames, }: ISnippetSyntaxBuildOptions): string; + private escapeSpecialCharacters; +} diff --git a/node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js b/node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js new file mode 100644 index 00000000..670dcbc9 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js @@ -0,0 +1,47 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const snippet_syntax_1 = require("./snippet_syntax"); +const CALLBACK_NAME = 'callback'; +class JavaScriptSnippetSyntax { + snippetInterface; + constructor(snippetInterface) { + this.snippetInterface = snippetInterface; + } + build({ comment, generatedExpressions, functionName, stepParameterNames, }) { + let functionKeyword = 'function '; + if (this.snippetInterface === snippet_syntax_1.SnippetInterface.AsyncAwait) { + functionKeyword = 'async ' + functionKeyword; + } + let implementation; + if (this.snippetInterface === snippet_syntax_1.SnippetInterface.Callback) { + implementation = `${CALLBACK_NAME}(null, 'pending');`; + } + else if (this.snippetInterface === snippet_syntax_1.SnippetInterface.Promise) { + implementation = "return Promise.resolve('pending');"; + } + else { + implementation = "return 'pending';"; + } + const definitionChoices = generatedExpressions.map((generatedExpression, index) => { + const prefix = index === 0 ? '' : '// '; + const allParameterNames = generatedExpression.parameterNames.concat(stepParameterNames); + if (this.snippetInterface === snippet_syntax_1.SnippetInterface.Callback) { + allParameterNames.push(CALLBACK_NAME); + } + return `${prefix + functionName}('${this.escapeSpecialCharacters(generatedExpression)}', ${functionKeyword}(${allParameterNames.join(', ')}) {\n`; + }); + return (`${definitionChoices.join('')} // ${comment}\n` + + ` ${implementation}\n` + + '});'); + } + escapeSpecialCharacters(generatedExpression) { + let source = generatedExpression.source; + // double up any backslashes because we're in a javascript string + source = source.replace(/\\/g, '\\\\'); + // escape any single quotes because that's our quote delimiter + source = source.replace(/'/g, "\\'"); + return source; + } +} +exports.default = JavaScriptSnippetSyntax; +//# sourceMappingURL=javascript_snippet_syntax.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js.map b/node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js.map new file mode 100644 index 00000000..46b4179a --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js.map @@ -0,0 +1 @@ +{"version":3,"file":"javascript_snippet_syntax.js","sourceRoot":"","sources":["../../../src/formatter/step_definition_snippet_builder/javascript_snippet_syntax.ts"],"names":[],"mappings":";;AACA,qDAIyB;AAEzB,MAAM,aAAa,GAAG,UAAU,CAAA;AAEhC,MAAqB,uBAAuB;IACzB,gBAAgB,CAAkB;IAEnD,YAAY,gBAAkC;QAC5C,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAA;IAC1C,CAAC;IAED,KAAK,CAAC,EACJ,OAAO,EACP,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,GACS;QAC3B,IAAI,eAAe,GAAG,WAAW,CAAA;QACjC,IAAI,IAAI,CAAC,gBAAgB,KAAK,iCAAgB,CAAC,UAAU,EAAE,CAAC;YAC1D,eAAe,GAAG,QAAQ,GAAG,eAAe,CAAA;QAC9C,CAAC;QAED,IAAI,cAAsB,CAAA;QAC1B,IAAI,IAAI,CAAC,gBAAgB,KAAK,iCAAgB,CAAC,QAAQ,EAAE,CAAC;YACxD,cAAc,GAAG,GAAG,aAAa,oBAAoB,CAAA;QACvD,CAAC;aAAM,IAAI,IAAI,CAAC,gBAAgB,KAAK,iCAAgB,CAAC,OAAO,EAAE,CAAC;YAC9D,cAAc,GAAG,oCAAoC,CAAA;QACvD,CAAC;aAAM,CAAC;YACN,cAAc,GAAG,mBAAmB,CAAA;QACtC,CAAC;QAED,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,GAAG,CAChD,CAAC,mBAAmB,EAAE,KAAK,EAAE,EAAE;YAC7B,MAAM,MAAM,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;YACvC,MAAM,iBAAiB,GACrB,mBAAmB,CAAC,cAAc,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAA;YAC/D,IAAI,IAAI,CAAC,gBAAgB,KAAK,iCAAgB,CAAC,QAAQ,EAAE,CAAC;gBACxD,iBAAiB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;YACvC,CAAC;YACD,OAAO,GAAG,MAAM,GAAG,YAAY,KAAK,IAAI,CAAC,uBAAuB,CAC9D,mBAAmB,CACpB,MAAM,eAAe,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAA;QAC/D,CAAC,CACF,CAAA;QAED,OAAO,CACL,GAAG,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,OAAO,IAAI;YAChD,KAAK,cAAc,IAAI;YACvB,KAAK,CACN,CAAA;IACH,CAAC;IAEO,uBAAuB,CAAC,mBAAwC;QACtE,IAAI,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAA;QACvC,iEAAiE;QACjE,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QACtC,8DAA8D;QAC9D,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACpC,OAAO,MAAM,CAAA;IACf,CAAC;CACF;AAxDD,0CAwDC","sourcesContent":["import { GeneratedExpression } from '@cucumber/cucumber-expressions'\nimport {\n ISnippetSnytax,\n ISnippetSyntaxBuildOptions,\n SnippetInterface,\n} from './snippet_syntax'\n\nconst CALLBACK_NAME = 'callback'\n\nexport default class JavaScriptSnippetSyntax implements ISnippetSnytax {\n private readonly snippetInterface: SnippetInterface\n\n constructor(snippetInterface: SnippetInterface) {\n this.snippetInterface = snippetInterface\n }\n\n build({\n comment,\n generatedExpressions,\n functionName,\n stepParameterNames,\n }: ISnippetSyntaxBuildOptions): string {\n let functionKeyword = 'function '\n if (this.snippetInterface === SnippetInterface.AsyncAwait) {\n functionKeyword = 'async ' + functionKeyword\n }\n\n let implementation: string\n if (this.snippetInterface === SnippetInterface.Callback) {\n implementation = `${CALLBACK_NAME}(null, 'pending');`\n } else if (this.snippetInterface === SnippetInterface.Promise) {\n implementation = \"return Promise.resolve('pending');\"\n } else {\n implementation = \"return 'pending';\"\n }\n\n const definitionChoices = generatedExpressions.map(\n (generatedExpression, index) => {\n const prefix = index === 0 ? '' : '// '\n const allParameterNames =\n generatedExpression.parameterNames.concat(stepParameterNames)\n if (this.snippetInterface === SnippetInterface.Callback) {\n allParameterNames.push(CALLBACK_NAME)\n }\n return `${prefix + functionName}('${this.escapeSpecialCharacters(\n generatedExpression\n )}', ${functionKeyword}(${allParameterNames.join(', ')}) {\\n`\n }\n )\n\n return (\n `${definitionChoices.join('')} // ${comment}\\n` +\n ` ${implementation}\\n` +\n '});'\n )\n }\n\n private escapeSpecialCharacters(generatedExpression: GeneratedExpression) {\n let source = generatedExpression.source\n // double up any backslashes because we're in a javascript string\n source = source.replace(/\\\\/g, '\\\\\\\\')\n // escape any single quotes because that's our quote delimiter\n source = source.replace(/'/g, \"\\\\'\")\n return source\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/snippet_syntax.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/snippet_syntax.d.ts new file mode 100644 index 00000000..53d7d025 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/snippet_syntax.d.ts @@ -0,0 +1,16 @@ +import { GeneratedExpression } from '@cucumber/cucumber-expressions'; +export declare enum SnippetInterface { + AsyncAwait = "async-await", + Callback = "callback", + Promise = "promise", + Synchronous = "synchronous" +} +export interface ISnippetSyntaxBuildOptions { + comment: string; + functionName: string; + generatedExpressions: readonly GeneratedExpression[]; + stepParameterNames: string[]; +} +export interface ISnippetSnytax { + build: (options: ISnippetSyntaxBuildOptions) => string; +} diff --git a/node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/snippet_syntax.js b/node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/snippet_syntax.js new file mode 100644 index 00000000..2c59940b --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/snippet_syntax.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SnippetInterface = void 0; +var SnippetInterface; +(function (SnippetInterface) { + SnippetInterface["AsyncAwait"] = "async-await"; + SnippetInterface["Callback"] = "callback"; + SnippetInterface["Promise"] = "promise"; + SnippetInterface["Synchronous"] = "synchronous"; +})(SnippetInterface || (exports.SnippetInterface = SnippetInterface = {})); +//# sourceMappingURL=snippet_syntax.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/snippet_syntax.js.map b/node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/snippet_syntax.js.map new file mode 100644 index 00000000..f067aa40 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/step_definition_snippet_builder/snippet_syntax.js.map @@ -0,0 +1 @@ +{"version":3,"file":"snippet_syntax.js","sourceRoot":"","sources":["../../../src/formatter/step_definition_snippet_builder/snippet_syntax.ts"],"names":[],"mappings":";;;AAEA,IAAY,gBAKX;AALD,WAAY,gBAAgB;IAC1B,8CAA0B,CAAA;IAC1B,yCAAqB,CAAA;IACrB,uCAAmB,CAAA;IACnB,+CAA2B,CAAA;AAC7B,CAAC,EALW,gBAAgB,gCAAhB,gBAAgB,QAK3B","sourcesContent":["import { GeneratedExpression } from '@cucumber/cucumber-expressions'\n\nexport enum SnippetInterface {\n AsyncAwait = 'async-await',\n Callback = 'callback',\n Promise = 'promise',\n Synchronous = 'synchronous',\n}\n\nexport interface ISnippetSyntaxBuildOptions {\n comment: string\n functionName: string\n generatedExpressions: readonly GeneratedExpression[]\n stepParameterNames: string[]\n}\n\nexport interface ISnippetSnytax {\n build: (options: ISnippetSyntaxBuildOptions) => string\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/summary_formatter.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/summary_formatter.d.ts new file mode 100644 index 00000000..e3288657 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/summary_formatter.d.ts @@ -0,0 +1,14 @@ +import * as messages from '@cucumber/messages'; +import { ITestCaseAttempt } from './helpers/event_data_collector'; +import Formatter, { IFormatterOptions } from './'; +interface ILogIssuesRequest { + issues: ITestCaseAttempt[]; + title: string; +} +export default class SummaryFormatter extends Formatter { + static readonly documentation: string; + constructor(options: IFormatterOptions); + logSummary(testRunDuration: messages.Duration): void; + logIssues({ issues, title }: ILogIssuesRequest): void; +} +export {}; diff --git a/node_modules/@cucumber/cucumber/lib/formatter/summary_formatter.js b/node_modules/@cucumber/cucumber/lib/formatter/summary_formatter.js new file mode 100644 index 00000000..e0fce672 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/summary_formatter.js @@ -0,0 +1,68 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const value_checker_1 = require("../value_checker"); +const time_1 = require("../time"); +const helpers_1 = require("./helpers"); +const issue_helpers_1 = require("./helpers/issue_helpers"); +const _1 = __importDefault(require("./")); +class SummaryFormatter extends _1.default { + static documentation = 'Summary output of feature and scenarios'; + constructor(options) { + super(options); + let testRunStartedTimestamp; + options.eventBroadcaster.on('envelope', (envelope) => { + if ((0, value_checker_1.doesHaveValue)(envelope.testRunStarted)) { + testRunStartedTimestamp = envelope.testRunStarted.timestamp; + } + if ((0, value_checker_1.doesHaveValue)(envelope.testRunFinished)) { + const testRunFinishedTimestamp = envelope.testRunFinished.timestamp; + this.logSummary((0, time_1.durationBetweenTimestamps)(testRunStartedTimestamp, testRunFinishedTimestamp)); + } + }); + } + logSummary(testRunDuration) { + const failures = []; + const warnings = []; + const testCaseAttempts = this.eventDataCollector.getTestCaseAttempts(); + testCaseAttempts.forEach((testCaseAttempt) => { + if ((0, helpers_1.isFailure)(testCaseAttempt.worstTestStepResult, testCaseAttempt.willBeRetried)) { + failures.push(testCaseAttempt); + } + else if ((0, helpers_1.isWarning)(testCaseAttempt.worstTestStepResult, testCaseAttempt.willBeRetried)) { + warnings.push(testCaseAttempt); + } + }); + if (this.eventDataCollector.undefinedParameterTypes.length > 0) { + this.log((0, issue_helpers_1.formatUndefinedParameterTypes)(this.eventDataCollector.undefinedParameterTypes)); + } + if (failures.length > 0) { + this.logIssues({ issues: failures, title: 'Failures' }); + } + if (warnings.length > 0) { + this.logIssues({ issues: warnings, title: 'Warnings' }); + } + this.log((0, helpers_1.formatSummary)({ + colorFns: this.colorFns, + testCaseAttempts, + testRunDuration, + })); + } + logIssues({ issues, title }) { + this.log(`${title}:\n\n`); + issues.forEach((testCaseAttempt, index) => { + this.log((0, helpers_1.formatIssue)({ + colorFns: this.colorFns, + number: index + 1, + snippetBuilder: this.snippetBuilder, + supportCodeLibrary: this.supportCodeLibrary, + testCaseAttempt, + printAttachments: this.printAttachments, + })); + }); + } +} +exports.default = SummaryFormatter; +//# sourceMappingURL=summary_formatter.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/summary_formatter.js.map b/node_modules/@cucumber/cucumber/lib/formatter/summary_formatter.js.map new file mode 100644 index 00000000..3e3c06dd --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/summary_formatter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"summary_formatter.js","sourceRoot":"","sources":["../../src/formatter/summary_formatter.ts"],"names":[],"mappings":"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","sourcesContent":["import * as messages from '@cucumber/messages'\nimport { doesHaveValue } from '../value_checker'\nimport { durationBetweenTimestamps } from '../time'\nimport { formatIssue, formatSummary, isFailure, isWarning } from './helpers'\nimport { ITestCaseAttempt } from './helpers/event_data_collector'\nimport { formatUndefinedParameterTypes } from './helpers/issue_helpers'\nimport Formatter, { IFormatterOptions } from './'\n\ninterface ILogIssuesRequest {\n issues: ITestCaseAttempt[]\n title: string\n}\n\nexport default class SummaryFormatter extends Formatter {\n public static readonly documentation: string =\n 'Summary output of feature and scenarios'\n\n constructor(options: IFormatterOptions) {\n super(options)\n let testRunStartedTimestamp: messages.Timestamp\n options.eventBroadcaster.on('envelope', (envelope: messages.Envelope) => {\n if (doesHaveValue(envelope.testRunStarted)) {\n testRunStartedTimestamp = envelope.testRunStarted.timestamp\n }\n if (doesHaveValue(envelope.testRunFinished)) {\n const testRunFinishedTimestamp = envelope.testRunFinished.timestamp\n this.logSummary(\n durationBetweenTimestamps(\n testRunStartedTimestamp,\n testRunFinishedTimestamp\n )\n )\n }\n })\n }\n\n logSummary(testRunDuration: messages.Duration): void {\n const failures: ITestCaseAttempt[] = []\n const warnings: ITestCaseAttempt[] = []\n const testCaseAttempts = this.eventDataCollector.getTestCaseAttempts()\n testCaseAttempts.forEach((testCaseAttempt) => {\n if (\n isFailure(\n testCaseAttempt.worstTestStepResult,\n testCaseAttempt.willBeRetried\n )\n ) {\n failures.push(testCaseAttempt)\n } else if (\n isWarning(\n testCaseAttempt.worstTestStepResult,\n testCaseAttempt.willBeRetried\n )\n ) {\n warnings.push(testCaseAttempt)\n }\n })\n if (this.eventDataCollector.undefinedParameterTypes.length > 0) {\n this.log(\n formatUndefinedParameterTypes(\n this.eventDataCollector.undefinedParameterTypes\n )\n )\n }\n if (failures.length > 0) {\n this.logIssues({ issues: failures, title: 'Failures' })\n }\n if (warnings.length > 0) {\n this.logIssues({ issues: warnings, title: 'Warnings' })\n }\n this.log(\n formatSummary({\n colorFns: this.colorFns,\n testCaseAttempts,\n testRunDuration,\n })\n )\n }\n\n logIssues({ issues, title }: ILogIssuesRequest): void {\n this.log(`${title}:\\n\\n`)\n issues.forEach((testCaseAttempt, index) => {\n this.log(\n formatIssue({\n colorFns: this.colorFns,\n number: index + 1,\n snippetBuilder: this.snippetBuilder,\n supportCodeLibrary: this.supportCodeLibrary,\n testCaseAttempt,\n printAttachments: this.printAttachments,\n })\n )\n })\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/usage_formatter.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/usage_formatter.d.ts new file mode 100644 index 00000000..517909a7 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/usage_formatter.d.ts @@ -0,0 +1,6 @@ +import Formatter, { IFormatterOptions } from './'; +export default class UsageFormatter extends Formatter { + static readonly documentation: string; + constructor(options: IFormatterOptions); + logUsage(): void; +} diff --git a/node_modules/@cucumber/cucumber/lib/formatter/usage_formatter.js b/node_modules/@cucumber/cucumber/lib/formatter/usage_formatter.js new file mode 100644 index 00000000..28b5e948 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/usage_formatter.js @@ -0,0 +1,108 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const cli_table3_1 = __importDefault(require("cli-table3")); +const messages = __importStar(require("@cucumber/messages")); +const value_checker_1 = require("../value_checker"); +const helpers_1 = require("./helpers"); +const _1 = __importDefault(require("./")); +class UsageFormatter extends _1.default { + static documentation = 'Prints where step definitions are used. The slowest step definitions (with duration) are listed first. If --dry-run is used the duration is not shown, and step definitions are sorted by filename instead.'; + constructor(options) { + super(options); + options.eventBroadcaster.on('envelope', (envelope) => { + if ((0, value_checker_1.doesHaveValue)(envelope.testRunFinished)) { + this.logUsage(); + } + }); + } + logUsage() { + const usage = (0, helpers_1.getUsage)({ + stepDefinitions: this.supportCodeLibrary.stepDefinitions, + eventDataCollector: this.eventDataCollector, + }); + if (usage.length === 0) { + this.log('No step definitions'); + return; + } + const table = new cli_table3_1.default({ + head: ['Pattern / Text', 'Duration', 'Location'], + style: { + border: [], + head: [], + }, + }); + usage.forEach(({ line, matches, meanDuration, pattern, patternType, uri }) => { + let formattedPattern = pattern; + if (patternType === 'RegularExpression') { + formattedPattern = '/' + formattedPattern + '/'; + } + const col1 = [formattedPattern]; + const col2 = []; + if (matches.length > 0) { + if ((0, value_checker_1.doesHaveValue)(meanDuration)) { + col2.push(`${messages.TimeConversion.durationToMilliseconds(meanDuration).toFixed(2)}ms`); + } + else { + col2.push('-'); + } + } + else { + col2.push('UNUSED'); + } + const col3 = [(0, helpers_1.formatLocation)({ line, uri })]; + matches.slice(0, 5).forEach((match) => { + col1.push(` ${match.text}`); + if ((0, value_checker_1.doesHaveValue)(match.duration)) { + col2.push(`${messages.TimeConversion.durationToMilliseconds(match.duration).toFixed(2)}ms`); + } + else { + col2.push('-'); + } + col3.push((0, helpers_1.formatLocation)(match)); + }); + if (matches.length > 5) { + col1.push(` ${(matches.length - 5).toString()} more`); + } + table.push([col1.join('\n'), col2.join('\n'), col3.join('\n')]); + }); + this.log(`${table.toString()}\n`); + } +} +exports.default = UsageFormatter; +//# sourceMappingURL=usage_formatter.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/usage_formatter.js.map b/node_modules/@cucumber/cucumber/lib/formatter/usage_formatter.js.map new file mode 100644 index 00000000..ba17e044 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/usage_formatter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"usage_formatter.js","sourceRoot":"","sources":["../../src/formatter/usage_formatter.ts"],"names":[],"mappings":"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","sourcesContent":["import Table from 'cli-table3'\nimport * as messages from '@cucumber/messages'\nimport { doesHaveValue } from '../value_checker'\nimport { formatLocation, getUsage } from './helpers'\nimport Formatter, { IFormatterOptions } from './'\nimport IEnvelope = messages.Envelope\n\nexport default class UsageFormatter extends Formatter {\n public static readonly documentation: string =\n 'Prints where step definitions are used. The slowest step definitions (with duration) are listed first. If --dry-run is used the duration is not shown, and step definitions are sorted by filename instead.'\n\n constructor(options: IFormatterOptions) {\n super(options)\n options.eventBroadcaster.on('envelope', (envelope: IEnvelope) => {\n if (doesHaveValue(envelope.testRunFinished)) {\n this.logUsage()\n }\n })\n }\n\n logUsage(): void {\n const usage = getUsage({\n stepDefinitions: this.supportCodeLibrary.stepDefinitions,\n eventDataCollector: this.eventDataCollector,\n })\n if (usage.length === 0) {\n this.log('No step definitions')\n return\n }\n const table = new Table({\n head: ['Pattern / Text', 'Duration', 'Location'],\n style: {\n border: [],\n head: [],\n },\n })\n usage.forEach(\n ({ line, matches, meanDuration, pattern, patternType, uri }) => {\n let formattedPattern = pattern\n if (patternType === 'RegularExpression') {\n formattedPattern = '/' + formattedPattern + '/'\n }\n const col1 = [formattedPattern]\n const col2 = []\n if (matches.length > 0) {\n if (doesHaveValue(meanDuration)) {\n col2.push(\n `${messages.TimeConversion.durationToMilliseconds(\n meanDuration\n ).toFixed(2)}ms`\n )\n } else {\n col2.push('-')\n }\n } else {\n col2.push('UNUSED')\n }\n const col3 = [formatLocation({ line, uri })]\n matches.slice(0, 5).forEach((match) => {\n col1.push(` ${match.text}`)\n if (doesHaveValue(match.duration)) {\n col2.push(\n `${messages.TimeConversion.durationToMilliseconds(\n match.duration\n ).toFixed(2)}ms`\n )\n } else {\n col2.push('-')\n }\n col3.push(formatLocation(match))\n })\n if (matches.length > 5) {\n col1.push(` ${(matches.length - 5).toString()} more`)\n }\n table.push([col1.join('\\n'), col2.join('\\n'), col3.join('\\n')] as any)\n }\n )\n this.log(`${table.toString()}\\n`)\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/usage_json_formatter.d.ts b/node_modules/@cucumber/cucumber/lib/formatter/usage_json_formatter.d.ts new file mode 100644 index 00000000..a77a035f --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/usage_json_formatter.d.ts @@ -0,0 +1,7 @@ +import Formatter, { IFormatterOptions } from './'; +export default class UsageJsonFormatter extends Formatter { + static readonly documentation: string; + constructor(options: IFormatterOptions); + logUsage(): void; + replacer(key: string, value: any): any; +} diff --git a/node_modules/@cucumber/cucumber/lib/formatter/usage_json_formatter.js b/node_modules/@cucumber/cucumber/lib/formatter/usage_json_formatter.js new file mode 100644 index 00000000..4b21750d --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/usage_json_formatter.js @@ -0,0 +1,34 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const value_checker_1 = require("../value_checker"); +const helpers_1 = require("./helpers"); +const _1 = __importDefault(require("./")); +class UsageJsonFormatter extends _1.default { + static documentation = 'Does what the Usage Formatter does, but outputs JSON, which can be output to a file and then consumed by other tools.'; + constructor(options) { + super(options); + options.eventBroadcaster.on('envelope', (envelope) => { + if ((0, value_checker_1.doesHaveValue)(envelope.testRunFinished)) { + this.logUsage(); + } + }); + } + logUsage() { + const usage = (0, helpers_1.getUsage)({ + stepDefinitions: this.supportCodeLibrary.stepDefinitions, + eventDataCollector: this.eventDataCollector, + }); + this.log(JSON.stringify(usage, this.replacer, 2)); + } + replacer(key, value) { + if (key === 'seconds') { + return parseInt(value); + } + return value; + } +} +exports.default = UsageJsonFormatter; +//# sourceMappingURL=usage_json_formatter.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/formatter/usage_json_formatter.js.map b/node_modules/@cucumber/cucumber/lib/formatter/usage_json_formatter.js.map new file mode 100644 index 00000000..bd0b723e --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/formatter/usage_json_formatter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"usage_json_formatter.js","sourceRoot":"","sources":["../../src/formatter/usage_json_formatter.ts"],"names":[],"mappings":";;;;;AACA,oDAAgD;AAChD,uCAAoC;AACpC,0CAAiD;AAGjD,MAAqB,kBAAmB,SAAQ,UAAS;IAChD,MAAM,CAAU,aAAa,GAClC,uHAAuH,CAAA;IAEzH,YAAY,OAA0B;QACpC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,QAAmB,EAAE,EAAE;YAC9D,IAAI,IAAA,6BAAa,EAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,QAAQ,EAAE,CAAA;YACjB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,QAAQ;QACN,MAAM,KAAK,GAAG,IAAA,kBAAQ,EAAC;YACrB,eAAe,EAAE,IAAI,CAAC,kBAAkB,CAAC,eAAe;YACxD,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;SAC5C,CAAC,CAAA;QACF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAA;IACnD,CAAC;IAED,QAAQ,CAAC,GAAW,EAAE,KAAU;QAC9B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAA;QACxB,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;;AA1BH,qCA2BC","sourcesContent":["import * as messages from '@cucumber/messages'\nimport { doesHaveValue } from '../value_checker'\nimport { getUsage } from './helpers'\nimport Formatter, { IFormatterOptions } from './'\nimport IEnvelope = messages.Envelope\n\nexport default class UsageJsonFormatter extends Formatter {\n public static readonly documentation: string =\n 'Does what the Usage Formatter does, but outputs JSON, which can be output to a file and then consumed by other tools.'\n\n constructor(options: IFormatterOptions) {\n super(options)\n options.eventBroadcaster.on('envelope', (envelope: IEnvelope) => {\n if (doesHaveValue(envelope.testRunFinished)) {\n this.logUsage()\n }\n })\n }\n\n logUsage(): void {\n const usage = getUsage({\n stepDefinitions: this.supportCodeLibrary.stepDefinitions,\n eventDataCollector: this.eventDataCollector,\n })\n this.log(JSON.stringify(usage, this.replacer, 2))\n }\n\n replacer(key: string, value: any): any {\n if (key === 'seconds') {\n return parseInt(value)\n }\n return value\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/index.d.ts b/node_modules/@cucumber/cucumber/lib/index.d.ts new file mode 100644 index 00000000..1ad7aa72 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/index.d.ts @@ -0,0 +1,53 @@ +/** + * User code functions and helpers + * + * @packageDocumentation + * @module (root) + * @remarks + * These docs cover the functions and helpers for user code registration and test setup. The entry point is `@cucumber/cucumber`. + */ +import * as messages from '@cucumber/messages'; +import { default as _Cli } from './cli'; +import * as formatterHelpers from './formatter/helpers'; +import * as parallelCanAssignHelpers from './support_code_library_builder/parallel_can_assign_helpers'; +export declare const version: string; +export { IConfiguration, IProfiles } from './configuration'; +export { default as supportCodeLibraryBuilder } from './support_code_library_builder'; +export { default as DataTable } from './models/data_table'; +export { default as TestCaseHookDefinition } from './models/test_case_hook_definition'; +export { default as Formatter, IFormatterOptions } from './formatter'; +export { default as FormatterBuilder } from './formatter/builder'; +export { default as JsonFormatter } from './formatter/json_formatter'; +export { default as ProgressFormatter } from './formatter/progress_formatter'; +export { default as RerunFormatter } from './formatter/rerun_formatter'; +export { default as SnippetsFormatter } from './formatter/snippets_formatter'; +export { default as SummaryFormatter } from './formatter/summary_formatter'; +export { default as UsageFormatter } from './formatter/usage_formatter'; +export { default as UsageJsonFormatter } from './formatter/usage_json_formatter'; +export { formatterHelpers }; +export declare const After: (>(code: import("./support_code_library_builder/types").TestCaseHookFunction) => void) & (>(tags: string, code: import("./support_code_library_builder/types").TestCaseHookFunction) => void) & (>(options: import("./support_code_library_builder/types").IDefineTestCaseHookOptions, code: import("./support_code_library_builder/types").TestCaseHookFunction) => void); +export declare const AfterAll: ((code: import("./support_code_library_builder/types").TestRunHookFunction) => void) & ((options: import("./support_code_library_builder/types").IDefineTestRunHookOptions, code: import("./support_code_library_builder/types").TestRunHookFunction) => void); +export declare const AfterStep: (>(code: import("./support_code_library_builder/types").TestStepHookFunction) => void) & (>(tags: string, code: import("./support_code_library_builder/types").TestStepHookFunction) => void) & (>(options: import("./support_code_library_builder/types").IDefineTestStepHookOptions, code: import("./support_code_library_builder/types").TestStepHookFunction) => void); +export declare const Before: (>(code: import("./support_code_library_builder/types").TestCaseHookFunction) => void) & (>(tags: string, code: import("./support_code_library_builder/types").TestCaseHookFunction) => void) & (>(options: import("./support_code_library_builder/types").IDefineTestCaseHookOptions, code: import("./support_code_library_builder/types").TestCaseHookFunction) => void); +export declare const BeforeAll: ((code: import("./support_code_library_builder/types").TestRunHookFunction) => void) & ((options: import("./support_code_library_builder/types").IDefineTestRunHookOptions, code: import("./support_code_library_builder/types").TestRunHookFunction) => void); +export declare const BeforeStep: (>(code: import("./support_code_library_builder/types").TestStepHookFunction) => void) & (>(tags: string, code: import("./support_code_library_builder/types").TestStepHookFunction) => void) & (>(options: import("./support_code_library_builder/types").IDefineTestStepHookOptions, code: import("./support_code_library_builder/types").TestStepHookFunction) => void); +export declare const defineStep: import("./support_code_library_builder/types").IDefineStep; +export declare const defineParameterType: (options: import("./support_code_library_builder/types").IParameterTypeDefinition) => void; +export declare const Given: import("./support_code_library_builder/types").IDefineStep; +export declare const setDefaultTimeout: (milliseconds: number) => void; +export declare const setDefinitionFunctionWrapper: (fn: Function) => void; +export declare const setWorldConstructor: (fn: any) => void; +export declare const setParallelCanAssign: (fn: import("./support_code_library_builder/types").ParallelAssignmentValidator) => void; +export declare const Then: import("./support_code_library_builder/types").IDefineStep; +export declare const When: import("./support_code_library_builder/types").IDefineStep; +export { default as World, IWorld, IWorldOptions, } from './support_code_library_builder/world'; +export { IContext } from './support_code_library_builder/context'; +export { worldProxy as world, contextProxy as context } from './runtime/scope'; +export { parallelCanAssignHelpers }; +export { ITestCaseHookParameter, ITestStepHookParameter, } from './support_code_library_builder/types'; +export declare const Status: typeof messages.TestStepResultStatus; +export { wrapPromiseWithTimeout } from './time'; +/** + * @deprecated use `runCucumber` instead; see https://github.com/cucumber/cucumber-js/blob/main/docs/deprecations.md + */ +export declare const Cli: typeof _Cli; diff --git a/node_modules/@cucumber/cucumber/lib/index.js b/node_modules/@cucumber/cucumber/lib/index.js new file mode 100644 index 00000000..94e49abe --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/index.js @@ -0,0 +1,116 @@ +"use strict"; +/** + * User code functions and helpers + * + * @packageDocumentation + * @module (root) + * @remarks + * These docs cover the functions and helpers for user code registration and test setup. The entry point is `@cucumber/cucumber`. + */ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Cli = exports.wrapPromiseWithTimeout = exports.Status = exports.parallelCanAssignHelpers = exports.context = exports.world = exports.World = exports.When = exports.Then = exports.setParallelCanAssign = exports.setWorldConstructor = exports.setDefinitionFunctionWrapper = exports.setDefaultTimeout = exports.Given = exports.defineParameterType = exports.defineStep = exports.BeforeStep = exports.BeforeAll = exports.Before = exports.AfterStep = exports.AfterAll = exports.After = exports.formatterHelpers = exports.UsageJsonFormatter = exports.UsageFormatter = exports.SummaryFormatter = exports.SnippetsFormatter = exports.RerunFormatter = exports.ProgressFormatter = exports.JsonFormatter = exports.FormatterBuilder = exports.Formatter = exports.TestCaseHookDefinition = exports.DataTable = exports.supportCodeLibraryBuilder = exports.version = void 0; +const node_util_1 = require("node:util"); +const messages = __importStar(require("@cucumber/messages")); +const cli_1 = __importDefault(require("./cli")); +const formatterHelpers = __importStar(require("./formatter/helpers")); +exports.formatterHelpers = formatterHelpers; +const parallelCanAssignHelpers = __importStar(require("./support_code_library_builder/parallel_can_assign_helpers")); +exports.parallelCanAssignHelpers = parallelCanAssignHelpers; +const support_code_library_builder_1 = __importDefault(require("./support_code_library_builder")); +const version_1 = require("./version"); +// type version as string to avoid tripping api-extractor every release +exports.version = version_1.version; +// Top level +var support_code_library_builder_2 = require("./support_code_library_builder"); +Object.defineProperty(exports, "supportCodeLibraryBuilder", { enumerable: true, get: function () { return __importDefault(support_code_library_builder_2).default; } }); +var data_table_1 = require("./models/data_table"); +Object.defineProperty(exports, "DataTable", { enumerable: true, get: function () { return __importDefault(data_table_1).default; } }); +var test_case_hook_definition_1 = require("./models/test_case_hook_definition"); +Object.defineProperty(exports, "TestCaseHookDefinition", { enumerable: true, get: function () { return __importDefault(test_case_hook_definition_1).default; } }); +// Formatters +var formatter_1 = require("./formatter"); +Object.defineProperty(exports, "Formatter", { enumerable: true, get: function () { return __importDefault(formatter_1).default; } }); +var builder_1 = require("./formatter/builder"); +Object.defineProperty(exports, "FormatterBuilder", { enumerable: true, get: function () { return __importDefault(builder_1).default; } }); +var json_formatter_1 = require("./formatter/json_formatter"); +Object.defineProperty(exports, "JsonFormatter", { enumerable: true, get: function () { return __importDefault(json_formatter_1).default; } }); +var progress_formatter_1 = require("./formatter/progress_formatter"); +Object.defineProperty(exports, "ProgressFormatter", { enumerable: true, get: function () { return __importDefault(progress_formatter_1).default; } }); +var rerun_formatter_1 = require("./formatter/rerun_formatter"); +Object.defineProperty(exports, "RerunFormatter", { enumerable: true, get: function () { return __importDefault(rerun_formatter_1).default; } }); +var snippets_formatter_1 = require("./formatter/snippets_formatter"); +Object.defineProperty(exports, "SnippetsFormatter", { enumerable: true, get: function () { return __importDefault(snippets_formatter_1).default; } }); +var summary_formatter_1 = require("./formatter/summary_formatter"); +Object.defineProperty(exports, "SummaryFormatter", { enumerable: true, get: function () { return __importDefault(summary_formatter_1).default; } }); +var usage_formatter_1 = require("./formatter/usage_formatter"); +Object.defineProperty(exports, "UsageFormatter", { enumerable: true, get: function () { return __importDefault(usage_formatter_1).default; } }); +var usage_json_formatter_1 = require("./formatter/usage_json_formatter"); +Object.defineProperty(exports, "UsageJsonFormatter", { enumerable: true, get: function () { return __importDefault(usage_json_formatter_1).default; } }); +// Support Code Functions +const { methods } = support_code_library_builder_1.default; +exports.After = methods.After; +exports.AfterAll = methods.AfterAll; +exports.AfterStep = methods.AfterStep; +exports.Before = methods.Before; +exports.BeforeAll = methods.BeforeAll; +exports.BeforeStep = methods.BeforeStep; +exports.defineStep = methods.defineStep; +exports.defineParameterType = methods.defineParameterType; +exports.Given = methods.Given; +exports.setDefaultTimeout = methods.setDefaultTimeout; +exports.setDefinitionFunctionWrapper = methods.setDefinitionFunctionWrapper; +exports.setWorldConstructor = methods.setWorldConstructor; +exports.setParallelCanAssign = methods.setParallelCanAssign; +exports.Then = methods.Then; +exports.When = methods.When; +var world_1 = require("./support_code_library_builder/world"); +Object.defineProperty(exports, "World", { enumerable: true, get: function () { return __importDefault(world_1).default; } }); +var scope_1 = require("./runtime/scope"); +Object.defineProperty(exports, "world", { enumerable: true, get: function () { return scope_1.worldProxy; } }); +Object.defineProperty(exports, "context", { enumerable: true, get: function () { return scope_1.contextProxy; } }); +exports.Status = messages.TestStepResultStatus; +// Time helpers +var time_1 = require("./time"); +Object.defineProperty(exports, "wrapPromiseWithTimeout", { enumerable: true, get: function () { return time_1.wrapPromiseWithTimeout; } }); +// Deprecated +/** + * @deprecated use `runCucumber` instead; see https://github.com/cucumber/cucumber-js/blob/main/docs/deprecations.md + */ +exports.Cli = (0, node_util_1.deprecate)(cli_1.default, '`Cli` is deprecated, use `runCucumber` instead; see https://github.com/cucumber/cucumber-js/blob/main/docs/deprecations.md'); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/index.js.map b/node_modules/@cucumber/cucumber/lib/index.js.map new file mode 100644 index 00000000..bd69f4b1 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,yCAAqC;AACrC,6DAA8C;AAC9C,gDAAuC;AACvC,sEAAuD;AA0B9C,4CAAgB;AAzBzB,qHAAsG;AAmD7F,4DAAwB;AAlDjC,kGAAsE;AACtE,uCAA+C;AAE/C,uEAAuE;AAC1D,QAAA,OAAO,GAAG,iBAAkB,CAAA;AAKzC,YAAY;AACZ,+EAAqF;AAA5E,0JAAA,OAAO,OAA6B;AAC7C,kDAA0D;AAAjD,wHAAA,OAAO,OAAa;AAC7B,gFAAsF;AAA7E,oJAAA,OAAO,OAA0B;AAE1C,aAAa;AACb,yCAAqE;AAA5D,uHAAA,OAAO,OAAa;AAC7B,+CAAiE;AAAxD,4HAAA,OAAO,OAAoB;AACpC,6DAAqE;AAA5D,gIAAA,OAAO,OAAiB;AACjC,qEAA6E;AAApE,wIAAA,OAAO,OAAqB;AACrC,+DAAuE;AAA9D,kIAAA,OAAO,OAAkB;AAClC,qEAA6E;AAApE,wIAAA,OAAO,OAAqB;AACrC,mEAA2E;AAAlE,sIAAA,OAAO,OAAoB;AACpC,+DAAuE;AAA9D,kIAAA,OAAO,OAAkB;AAClC,yEAAgF;AAAvE,2IAAA,OAAO,OAAsB;AAGtC,yBAAyB;AACzB,MAAM,EAAE,OAAO,EAAE,GAAG,sCAAyB,CAAA;AAChC,QAAA,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;AACrB,QAAA,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAA;AAC3B,QAAA,SAAS,GAAG,OAAO,CAAC,SAAS,CAAA;AAC7B,QAAA,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;AACvB,QAAA,SAAS,GAAG,OAAO,CAAC,SAAS,CAAA;AAC7B,QAAA,UAAU,GAAG,OAAO,CAAC,UAAU,CAAA;AAC/B,QAAA,UAAU,GAAG,OAAO,CAAC,UAAU,CAAA;AAC/B,QAAA,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAA;AACjD,QAAA,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;AACrB,QAAA,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAA;AAC7C,QAAA,4BAA4B,GAAG,OAAO,CAAC,4BAA4B,CAAA;AACnE,QAAA,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAA;AACjD,QAAA,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAA;AACnD,QAAA,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;AACnB,QAAA,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;AAChC,8DAI6C;AAH3C,+GAAA,OAAO,OAAS;AAKlB,yCAA8E;AAArE,8FAAA,UAAU,OAAS;AAAE,gGAAA,YAAY,OAAW;AAOxC,QAAA,MAAM,GAAG,QAAQ,CAAC,oBAAoB,CAAA;AAEnD,eAAe;AACf,+BAA+C;AAAtC,8GAAA,sBAAsB,OAAA;AAE/B,aAAa;AACb;;GAEG;AACU,QAAA,GAAG,GAAG,IAAA,qBAAS,EAC1B,aAAI,EACJ,4HAA4H,CAC7H,CAAA","sourcesContent":["/**\n * User code functions and helpers\n *\n * @packageDocumentation\n * @module (root)\n * @remarks\n * These docs cover the functions and helpers for user code registration and test setup. The entry point is `@cucumber/cucumber`.\n */\n\nimport { deprecate } from 'node:util'\nimport * as messages from '@cucumber/messages'\nimport { default as _Cli } from './cli'\nimport * as formatterHelpers from './formatter/helpers'\nimport * as parallelCanAssignHelpers from './support_code_library_builder/parallel_can_assign_helpers'\nimport supportCodeLibraryBuilder from './support_code_library_builder'\nimport { version as _version } from './version'\n\n// type version as string to avoid tripping api-extractor every release\nexport const version = _version as string\n\n// Configuration\nexport { IConfiguration, IProfiles } from './configuration'\n\n// Top level\nexport { default as supportCodeLibraryBuilder } from './support_code_library_builder'\nexport { default as DataTable } from './models/data_table'\nexport { default as TestCaseHookDefinition } from './models/test_case_hook_definition'\n\n// Formatters\nexport { default as Formatter, IFormatterOptions } from './formatter'\nexport { default as FormatterBuilder } from './formatter/builder'\nexport { default as JsonFormatter } from './formatter/json_formatter'\nexport { default as ProgressFormatter } from './formatter/progress_formatter'\nexport { default as RerunFormatter } from './formatter/rerun_formatter'\nexport { default as SnippetsFormatter } from './formatter/snippets_formatter'\nexport { default as SummaryFormatter } from './formatter/summary_formatter'\nexport { default as UsageFormatter } from './formatter/usage_formatter'\nexport { default as UsageJsonFormatter } from './formatter/usage_json_formatter'\nexport { formatterHelpers }\n\n// Support Code Functions\nconst { methods } = supportCodeLibraryBuilder\nexport const After = methods.After\nexport const AfterAll = methods.AfterAll\nexport const AfterStep = methods.AfterStep\nexport const Before = methods.Before\nexport const BeforeAll = methods.BeforeAll\nexport const BeforeStep = methods.BeforeStep\nexport const defineStep = methods.defineStep\nexport const defineParameterType = methods.defineParameterType\nexport const Given = methods.Given\nexport const setDefaultTimeout = methods.setDefaultTimeout\nexport const setDefinitionFunctionWrapper = methods.setDefinitionFunctionWrapper\nexport const setWorldConstructor = methods.setWorldConstructor\nexport const setParallelCanAssign = methods.setParallelCanAssign\nexport const Then = methods.Then\nexport const When = methods.When\nexport {\n default as World,\n IWorld,\n IWorldOptions,\n} from './support_code_library_builder/world'\nexport { IContext } from './support_code_library_builder/context'\nexport { worldProxy as world, contextProxy as context } from './runtime/scope'\nexport { parallelCanAssignHelpers }\n\nexport {\n ITestCaseHookParameter,\n ITestStepHookParameter,\n} from './support_code_library_builder/types'\nexport const Status = messages.TestStepResultStatus\n\n// Time helpers\nexport { wrapPromiseWithTimeout } from './time'\n\n// Deprecated\n/**\n * @deprecated use `runCucumber` instead; see https://github.com/cucumber/cucumber-js/blob/main/docs/deprecations.md\n */\nexport const Cli = deprecate(\n _Cli,\n '`Cli` is deprecated, use `runCucumber` instead; see https://github.com/cucumber/cucumber-js/blob/main/docs/deprecations.md'\n)\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/models/data_table.d.ts b/node_modules/@cucumber/cucumber/lib/models/data_table.d.ts new file mode 100644 index 00000000..f42a7051 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/models/data_table.d.ts @@ -0,0 +1,10 @@ +import * as messages from '@cucumber/messages'; +export default class DataTable { + private readonly rawTable; + constructor(sourceTable: messages.PickleTable | string[][]); + hashes(): Record[]; + raw(): string[][]; + rows(): string[][]; + rowsHash(): Record; + transpose(): DataTable; +} diff --git a/node_modules/@cucumber/cucumber/lib/models/data_table.js b/node_modules/@cucumber/cucumber/lib/models/data_table.js new file mode 100644 index 00000000..d9c02cae --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/models/data_table.js @@ -0,0 +1,47 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class DataTable { + rawTable; + constructor(sourceTable) { + if (sourceTable instanceof Array) { + this.rawTable = sourceTable; + } + else { + this.rawTable = sourceTable.rows.map((row) => row.cells.map((cell) => cell.value)); + } + } + hashes() { + const copy = this.raw(); + const keys = copy[0]; + const valuesArray = copy.slice(1); + return valuesArray.map((values) => { + const rowObject = {}; + keys.forEach((key, index) => (rowObject[key] = values[index])); + return rowObject; + }); + } + raw() { + return this.rawTable.slice(0); + } + rows() { + const copy = this.raw(); + copy.shift(); + return copy; + } + rowsHash() { + const rows = this.raw(); + const everyRowHasTwoColumns = rows.every((row) => row.length === 2); + if (!everyRowHasTwoColumns) { + throw new Error('rowsHash can only be called on a data table where all rows have exactly two columns'); + } + const result = {}; + rows.forEach((x) => (result[x[0]] = x[1])); + return result; + } + transpose() { + const transposed = this.rawTable[0].map((x, i) => this.rawTable.map((y) => y[i])); + return new DataTable(transposed); + } +} +exports.default = DataTable; +//# sourceMappingURL=data_table.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/models/data_table.js.map b/node_modules/@cucumber/cucumber/lib/models/data_table.js.map new file mode 100644 index 00000000..24f7e6d5 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/models/data_table.js.map @@ -0,0 +1 @@ +{"version":3,"file":"data_table.js","sourceRoot":"","sources":["../../src/models/data_table.ts"],"names":[],"mappings":";;AAEA,MAAqB,SAAS;IACX,QAAQ,CAAY;IAErC,YAAY,WAA8C;QACxD,IAAI,WAAW,YAAY,KAAK,EAAE,CAAC;YACjC,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAA;QAC7B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC3C,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CACpC,CAAA;QACH,CAAC;IACH,CAAC;IAED,MAAM;QACJ,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QACpB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACjC,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YAChC,MAAM,SAAS,GAA2B,EAAE,CAAA;YAC5C,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YAC9D,OAAO,SAAS,CAAA;QAClB,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,GAAG;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC/B,CAAC;IAED,IAAI;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACvB,IAAI,CAAC,KAAK,EAAE,CAAA;QACZ,OAAO,IAAI,CAAA;IACb,CAAC;IAED,QAAQ;QACN,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACvB,MAAM,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAA;QACnE,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACb,qFAAqF,CACtF,CAAA;QACH,CAAC;QACD,MAAM,MAAM,GAA2B,EAAE,CAAA;QACzC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC1C,OAAO,MAAM,CAAA;IACf,CAAC;IAED,SAAS;QACP,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC/C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC/B,CAAA;QACD,OAAO,IAAI,SAAS,CAAC,UAAU,CAAC,CAAA;IAClC,CAAC;CACF;AArDD,4BAqDC","sourcesContent":["import * as messages from '@cucumber/messages'\n\nexport default class DataTable {\n private readonly rawTable: string[][]\n\n constructor(sourceTable: messages.PickleTable | string[][]) {\n if (sourceTable instanceof Array) {\n this.rawTable = sourceTable\n } else {\n this.rawTable = sourceTable.rows.map((row) =>\n row.cells.map((cell) => cell.value)\n )\n }\n }\n\n hashes(): Record[] {\n const copy = this.raw()\n const keys = copy[0]\n const valuesArray = copy.slice(1)\n return valuesArray.map((values) => {\n const rowObject: Record = {}\n keys.forEach((key, index) => (rowObject[key] = values[index]))\n return rowObject\n })\n }\n\n raw(): string[][] {\n return this.rawTable.slice(0)\n }\n\n rows(): string[][] {\n const copy = this.raw()\n copy.shift()\n return copy\n }\n\n rowsHash(): Record {\n const rows = this.raw()\n const everyRowHasTwoColumns = rows.every((row) => row.length === 2)\n if (!everyRowHasTwoColumns) {\n throw new Error(\n 'rowsHash can only be called on a data table where all rows have exactly two columns'\n )\n }\n const result: Record = {}\n rows.forEach((x) => (result[x[0]] = x[1]))\n return result\n }\n\n transpose(): DataTable {\n const transposed = this.rawTable[0].map((x, i) =>\n this.rawTable.map((y) => y[i])\n )\n return new DataTable(transposed)\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/models/definition.d.ts b/node_modules/@cucumber/cucumber/lib/models/definition.d.ts new file mode 100644 index 00000000..87d3cebc --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/models/definition.d.ts @@ -0,0 +1,58 @@ +import * as messages from '@cucumber/messages'; +import { Expression } from '@cucumber/cucumber-expressions'; +import { ITestCaseHookParameter } from '../support_code_library_builder/types'; +import { GherkinStepKeyword } from './gherkin_step_keyword'; +export interface IGetInvocationDataRequest { + hookParameter: ITestCaseHookParameter; + step: messages.PickleStep; + world: any; +} +export interface IGetInvocationDataResponse { + getInvalidCodeLengthMessage: () => string; + parameters: any[]; + validCodeLengths: number[]; +} +export interface IDefinitionOptions { + timeout?: number; + wrapperOptions?: any; +} +export interface IHookDefinitionOptions extends IDefinitionOptions { + name?: string; + tags?: string; +} +export interface IDefinitionParameters { + code: Function; + id: string; + line: number; + options: T; + order: number; + unwrappedCode?: Function; + uri: string; +} +export interface IStepDefinitionParameters extends IDefinitionParameters { + keyword: GherkinStepKeyword; + pattern: string | RegExp; + expression: Expression; +} +export interface IDefinition { + readonly code: Function; + readonly id: string; + readonly line: number; + readonly options: IDefinitionOptions; + readonly order: number; + readonly unwrappedCode: Function; + readonly uri: string; + getInvocationParameters: (options: IGetInvocationDataRequest) => Promise; +} +export default abstract class Definition { + readonly code: Function; + readonly id: string; + readonly line: number; + readonly options: IDefinitionOptions; + readonly order: number; + readonly unwrappedCode: Function; + readonly uri: string; + constructor({ code, id, line, options, order, unwrappedCode, uri, }: IDefinitionParameters); + buildInvalidCodeLengthMessage(syncOrPromiseLength: number | string, callbackLength: number | string): string; + baseGetInvalidCodeLengthMessage(parameters: any[]): string; +} diff --git a/node_modules/@cucumber/cucumber/lib/models/definition.js b/node_modules/@cucumber/cucumber/lib/models/definition.js new file mode 100644 index 00000000..80d28bc1 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/models/definition.js @@ -0,0 +1,30 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class Definition { + code; + id; + line; + options; + order; + unwrappedCode; + uri; + constructor({ code, id, line, options, order, unwrappedCode, uri, }) { + this.code = code; + this.id = id; + this.line = line; + this.options = options; + this.order = order; + this.unwrappedCode = unwrappedCode; + this.uri = uri; + } + buildInvalidCodeLengthMessage(syncOrPromiseLength, callbackLength) { + return (`function has ${this.code.length.toString()} arguments` + + `, should have ${syncOrPromiseLength.toString()} (if synchronous or returning a promise)` + + ` or ${callbackLength.toString()} (if accepting a callback)`); + } + baseGetInvalidCodeLengthMessage(parameters) { + return this.buildInvalidCodeLengthMessage(parameters.length, parameters.length + 1); + } +} +exports.default = Definition; +//# sourceMappingURL=definition.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/models/definition.js.map b/node_modules/@cucumber/cucumber/lib/models/definition.js.map new file mode 100644 index 00000000..a304aeeb --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/models/definition.js.map @@ -0,0 +1 @@ +{"version":3,"file":"definition.js","sourceRoot":"","sources":["../../src/models/definition.ts"],"names":[],"mappings":";;AA0DA,MAA8B,UAAU;IACtB,IAAI,CAAU;IACd,EAAE,CAAQ;IACV,IAAI,CAAQ;IACZ,OAAO,CAAoB;IAC3B,KAAK,CAAQ;IACb,aAAa,CAAU;IACvB,GAAG,CAAQ;IAE3B,YAAY,EACV,IAAI,EACJ,EAAE,EACF,IAAI,EACJ,OAAO,EACP,KAAK,EACL,aAAa,EACb,GAAG,GACuC;QAC1C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;QACZ,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;QAClC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;IAChB,CAAC;IAED,6BAA6B,CAC3B,mBAAoC,EACpC,cAA+B;QAE/B,OAAO,CACL,gBAAgB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,YAAY;YACvD,iBAAiB,mBAAmB,CAAC,QAAQ,EAAE,0CAA0C;YACzF,OAAO,cAAc,CAAC,QAAQ,EAAE,4BAA4B,CAC7D,CAAA;IACH,CAAC;IAED,+BAA+B,CAAC,UAAiB;QAC/C,OAAO,IAAI,CAAC,6BAA6B,CACvC,UAAU,CAAC,MAAM,EACjB,UAAU,CAAC,MAAM,GAAG,CAAC,CACtB,CAAA;IACH,CAAC;CACF;AA5CD,6BA4CC","sourcesContent":["import * as messages from '@cucumber/messages'\nimport { Expression } from '@cucumber/cucumber-expressions'\nimport { ITestCaseHookParameter } from '../support_code_library_builder/types'\nimport { GherkinStepKeyword } from './gherkin_step_keyword'\n\nexport interface IGetInvocationDataRequest {\n hookParameter: ITestCaseHookParameter\n step: messages.PickleStep\n world: any\n}\n\nexport interface IGetInvocationDataResponse {\n getInvalidCodeLengthMessage: () => string\n parameters: any[]\n validCodeLengths: number[]\n}\n\nexport interface IDefinitionOptions {\n timeout?: number\n wrapperOptions?: any\n}\n\nexport interface IHookDefinitionOptions extends IDefinitionOptions {\n name?: string\n tags?: string\n}\n\nexport interface IDefinitionParameters {\n code: Function\n id: string\n line: number\n options: T\n order: number\n unwrappedCode?: Function\n uri: string\n}\n\nexport interface IStepDefinitionParameters\n extends IDefinitionParameters {\n keyword: GherkinStepKeyword\n pattern: string | RegExp\n expression: Expression\n}\n\nexport interface IDefinition {\n readonly code: Function\n readonly id: string\n readonly line: number\n readonly options: IDefinitionOptions\n readonly order: number\n readonly unwrappedCode: Function\n readonly uri: string\n\n getInvocationParameters: (\n options: IGetInvocationDataRequest\n ) => Promise\n}\n\nexport default abstract class Definition {\n public readonly code: Function\n public readonly id: string\n public readonly line: number\n public readonly options: IDefinitionOptions\n public readonly order: number\n public readonly unwrappedCode: Function\n public readonly uri: string\n\n constructor({\n code,\n id,\n line,\n options,\n order,\n unwrappedCode,\n uri,\n }: IDefinitionParameters) {\n this.code = code\n this.id = id\n this.line = line\n this.options = options\n this.order = order\n this.unwrappedCode = unwrappedCode\n this.uri = uri\n }\n\n buildInvalidCodeLengthMessage(\n syncOrPromiseLength: number | string,\n callbackLength: number | string\n ): string {\n return (\n `function has ${this.code.length.toString()} arguments` +\n `, should have ${syncOrPromiseLength.toString()} (if synchronous or returning a promise)` +\n ` or ${callbackLength.toString()} (if accepting a callback)`\n )\n }\n\n baseGetInvalidCodeLengthMessage(parameters: any[]): string {\n return this.buildInvalidCodeLengthMessage(\n parameters.length,\n parameters.length + 1\n )\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/models/gherkin_step_keyword.d.ts b/node_modules/@cucumber/cucumber/lib/models/gherkin_step_keyword.d.ts new file mode 100644 index 00000000..7cb63d6e --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/models/gherkin_step_keyword.d.ts @@ -0,0 +1 @@ +export type GherkinStepKeyword = 'Unknown' | 'Given' | 'When' | 'Then'; diff --git a/node_modules/@cucumber/cucumber/lib/models/gherkin_step_keyword.js b/node_modules/@cucumber/cucumber/lib/models/gherkin_step_keyword.js new file mode 100644 index 00000000..3e3d74eb --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/models/gherkin_step_keyword.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=gherkin_step_keyword.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/models/gherkin_step_keyword.js.map b/node_modules/@cucumber/cucumber/lib/models/gherkin_step_keyword.js.map new file mode 100644 index 00000000..adad1a2e --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/models/gherkin_step_keyword.js.map @@ -0,0 +1 @@ +{"version":3,"file":"gherkin_step_keyword.js","sourceRoot":"","sources":["../../src/models/gherkin_step_keyword.ts"],"names":[],"mappings":"","sourcesContent":["export type GherkinStepKeyword = 'Unknown' | 'Given' | 'When' | 'Then'\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/models/step_definition.d.ts b/node_modules/@cucumber/cucumber/lib/models/step_definition.d.ts new file mode 100644 index 00000000..9c3f2886 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/models/step_definition.d.ts @@ -0,0 +1,11 @@ +import { Expression } from '@cucumber/cucumber-expressions'; +import Definition, { IDefinition, IGetInvocationDataRequest, IGetInvocationDataResponse, IStepDefinitionParameters } from './definition'; +import { GherkinStepKeyword } from './gherkin_step_keyword'; +export default class StepDefinition extends Definition implements IDefinition { + readonly keyword: GherkinStepKeyword; + readonly pattern: string | RegExp; + readonly expression: Expression; + constructor(data: IStepDefinitionParameters); + getInvocationParameters({ step, world, }: IGetInvocationDataRequest): Promise; + matchesStepName(stepName: string): boolean; +} diff --git a/node_modules/@cucumber/cucumber/lib/models/step_definition.js b/node_modules/@cucumber/cucumber/lib/models/step_definition.js new file mode 100644 index 00000000..051789ae --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/models/step_definition.js @@ -0,0 +1,40 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const step_arguments_1 = require("../step_arguments"); +const value_checker_1 = require("../value_checker"); +const data_table_1 = __importDefault(require("./data_table")); +const definition_1 = __importDefault(require("./definition")); +class StepDefinition extends definition_1.default { + keyword; + pattern; + expression; + constructor(data) { + super(data); + this.keyword = data.keyword; + this.pattern = data.pattern; + this.expression = data.expression; + } + async getInvocationParameters({ step, world, }) { + const parameters = await Promise.all(this.expression.match(step.text).map((arg) => arg.getValue(world))); + if ((0, value_checker_1.doesHaveValue)(step.argument)) { + const argumentParameter = (0, step_arguments_1.parseStepArgument)(step.argument, { + dataTable: (arg) => new data_table_1.default(arg), + docString: (arg) => arg.content, + }); + parameters.push(argumentParameter); + } + return { + getInvalidCodeLengthMessage: () => this.baseGetInvalidCodeLengthMessage(parameters), + parameters, + validCodeLengths: [parameters.length, parameters.length + 1], + }; + } + matchesStepName(stepName) { + return (0, value_checker_1.doesHaveValue)(this.expression.match(stepName)); + } +} +exports.default = StepDefinition; +//# sourceMappingURL=step_definition.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/models/step_definition.js.map b/node_modules/@cucumber/cucumber/lib/models/step_definition.js.map new file mode 100644 index 00000000..f760b61c --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/models/step_definition.js.map @@ -0,0 +1 @@ +{"version":3,"file":"step_definition.js","sourceRoot":"","sources":["../../src/models/step_definition.ts"],"names":[],"mappings":";;;;;AACA,sDAAqD;AACrD,oDAAgD;AAChD,8DAAoC;AACpC,8DAKqB;AAGrB,MAAqB,cAAe,SAAQ,oBAAU;IACpC,OAAO,CAAoB;IAC3B,OAAO,CAAiB;IACxB,UAAU,CAAY;IAEtC,YAAY,IAA+B;QACzC,KAAK,CAAC,IAAI,CAAC,CAAA;QACX,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAC3B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,EAC5B,IAAI,EACJ,KAAK,GACqB;QAC1B,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,GAAG,CAClC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CACnE,CAAA;QACD,IAAI,IAAA,6BAAa,EAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjC,MAAM,iBAAiB,GAAG,IAAA,kCAAiB,EAAM,IAAI,CAAC,QAAQ,EAAE;gBAC9D,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,oBAAS,CAAC,GAAG,CAAC;gBACtC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO;aAChC,CAAC,CAAA;YACF,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;QACpC,CAAC;QACD,OAAO;YACL,2BAA2B,EAAE,GAAG,EAAE,CAChC,IAAI,CAAC,+BAA+B,CAAC,UAAU,CAAC;YAClD,UAAU;YACV,gBAAgB,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;SAC7D,CAAA;IACH,CAAC;IAED,eAAe,CAAC,QAAgB;QAC9B,OAAO,IAAA,6BAAa,EAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAA;IACvD,CAAC;CACF;AArCD,iCAqCC","sourcesContent":["import { Expression } from '@cucumber/cucumber-expressions'\nimport { parseStepArgument } from '../step_arguments'\nimport { doesHaveValue } from '../value_checker'\nimport DataTable from './data_table'\nimport Definition, {\n IDefinition,\n IGetInvocationDataRequest,\n IGetInvocationDataResponse,\n IStepDefinitionParameters,\n} from './definition'\nimport { GherkinStepKeyword } from './gherkin_step_keyword'\n\nexport default class StepDefinition extends Definition implements IDefinition {\n public readonly keyword: GherkinStepKeyword\n public readonly pattern: string | RegExp\n public readonly expression: Expression\n\n constructor(data: IStepDefinitionParameters) {\n super(data)\n this.keyword = data.keyword\n this.pattern = data.pattern\n this.expression = data.expression\n }\n\n async getInvocationParameters({\n step,\n world,\n }: IGetInvocationDataRequest): Promise {\n const parameters = await Promise.all(\n this.expression.match(step.text).map((arg) => arg.getValue(world))\n )\n if (doesHaveValue(step.argument)) {\n const argumentParameter = parseStepArgument(step.argument, {\n dataTable: (arg) => new DataTable(arg),\n docString: (arg) => arg.content,\n })\n parameters.push(argumentParameter)\n }\n return {\n getInvalidCodeLengthMessage: () =>\n this.baseGetInvalidCodeLengthMessage(parameters),\n parameters,\n validCodeLengths: [parameters.length, parameters.length + 1],\n }\n }\n\n matchesStepName(stepName: string): boolean {\n return doesHaveValue(this.expression.match(stepName))\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/models/test_case_hook_definition.d.ts b/node_modules/@cucumber/cucumber/lib/models/test_case_hook_definition.d.ts new file mode 100644 index 00000000..c905a31c --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/models/test_case_hook_definition.d.ts @@ -0,0 +1,10 @@ +import * as messages from '@cucumber/messages'; +import Definition, { IDefinition, IDefinitionParameters, IGetInvocationDataRequest, IGetInvocationDataResponse, IHookDefinitionOptions } from './definition'; +export default class TestCaseHookDefinition extends Definition implements IDefinition { + readonly name: string; + readonly tagExpression: string; + private readonly pickleTagFilter; + constructor(data: IDefinitionParameters); + appliesToTestCase(pickle: messages.Pickle): boolean; + getInvocationParameters({ hookParameter, }: IGetInvocationDataRequest): Promise; +} diff --git a/node_modules/@cucumber/cucumber/lib/models/test_case_hook_definition.js b/node_modules/@cucumber/cucumber/lib/models/test_case_hook_definition.js new file mode 100644 index 00000000..65162e17 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/models/test_case_hook_definition.js @@ -0,0 +1,30 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const pickle_filter_1 = require("../pickle_filter"); +const definition_1 = __importDefault(require("./definition")); +class TestCaseHookDefinition extends definition_1.default { + name; + tagExpression; + pickleTagFilter; + constructor(data) { + super(data); + this.name = data.options.name; + this.tagExpression = data.options.tags; + this.pickleTagFilter = new pickle_filter_1.PickleTagFilter(data.options.tags); + } + appliesToTestCase(pickle) { + return this.pickleTagFilter.matchesAllTagExpressions(pickle); + } + async getInvocationParameters({ hookParameter, }) { + return { + getInvalidCodeLengthMessage: () => this.buildInvalidCodeLengthMessage('0 or 1', '2'), + parameters: [hookParameter], + validCodeLengths: [0, 1, 2], + }; + } +} +exports.default = TestCaseHookDefinition; +//# sourceMappingURL=test_case_hook_definition.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/models/test_case_hook_definition.js.map b/node_modules/@cucumber/cucumber/lib/models/test_case_hook_definition.js.map new file mode 100644 index 00000000..35ce4419 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/models/test_case_hook_definition.js.map @@ -0,0 +1 @@ +{"version":3,"file":"test_case_hook_definition.js","sourceRoot":"","sources":["../../src/models/test_case_hook_definition.ts"],"names":[],"mappings":";;;;;AACA,oDAAkD;AAClD,8DAMqB;AAErB,MAAqB,sBACnB,SAAQ,oBAAU;IAGF,IAAI,CAAQ;IACZ,aAAa,CAAQ;IACpB,eAAe,CAAiB;IAEjD,YAAY,IAAmD;QAC7D,KAAK,CAAC,IAAI,CAAC,CAAA;QACX,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAA;QAC7B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAA;QACtC,IAAI,CAAC,eAAe,GAAG,IAAI,+BAAe,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/D,CAAC;IAED,iBAAiB,CAAC,MAAuB;QACvC,OAAO,IAAI,CAAC,eAAe,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAA;IAC9D,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,EAC5B,aAAa,GACa;QAC1B,OAAO;YACL,2BAA2B,EAAE,GAAG,EAAE,CAChC,IAAI,CAAC,6BAA6B,CAAC,QAAQ,EAAE,GAAG,CAAC;YACnD,UAAU,EAAE,CAAC,aAAa,CAAC;YAC3B,gBAAgB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SAC5B,CAAA;IACH,CAAC;CACF;AA7BD,yCA6BC","sourcesContent":["import * as messages from '@cucumber/messages'\nimport { PickleTagFilter } from '../pickle_filter'\nimport Definition, {\n IDefinition,\n IDefinitionParameters,\n IGetInvocationDataRequest,\n IGetInvocationDataResponse,\n IHookDefinitionOptions,\n} from './definition'\n\nexport default class TestCaseHookDefinition\n extends Definition\n implements IDefinition\n{\n public readonly name: string\n public readonly tagExpression: string\n private readonly pickleTagFilter: PickleTagFilter\n\n constructor(data: IDefinitionParameters) {\n super(data)\n this.name = data.options.name\n this.tagExpression = data.options.tags\n this.pickleTagFilter = new PickleTagFilter(data.options.tags)\n }\n\n appliesToTestCase(pickle: messages.Pickle): boolean {\n return this.pickleTagFilter.matchesAllTagExpressions(pickle)\n }\n\n async getInvocationParameters({\n hookParameter,\n }: IGetInvocationDataRequest): Promise {\n return {\n getInvalidCodeLengthMessage: () =>\n this.buildInvalidCodeLengthMessage('0 or 1', '2'),\n parameters: [hookParameter],\n validCodeLengths: [0, 1, 2],\n }\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/models/test_run_hook_definition.d.ts b/node_modules/@cucumber/cucumber/lib/models/test_run_hook_definition.d.ts new file mode 100644 index 00000000..5ed30026 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/models/test_run_hook_definition.d.ts @@ -0,0 +1,8 @@ +import Definition, { IDefinitionParameters, IDefinitionOptions } from './definition'; +export interface ITestRunHookDefinitionOptions extends IDefinitionOptions { + name?: string; +} +export default class TestRunHookDefinition extends Definition { + readonly name: string; + constructor(data: IDefinitionParameters); +} diff --git a/node_modules/@cucumber/cucumber/lib/models/test_run_hook_definition.js b/node_modules/@cucumber/cucumber/lib/models/test_run_hook_definition.js new file mode 100644 index 00000000..82fc1f27 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/models/test_run_hook_definition.js @@ -0,0 +1,15 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const definition_1 = __importDefault(require("./definition")); +class TestRunHookDefinition extends definition_1.default { + name; + constructor(data) { + super(data); + this.name = data.options.name; + } +} +exports.default = TestRunHookDefinition; +//# sourceMappingURL=test_run_hook_definition.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/models/test_run_hook_definition.js.map b/node_modules/@cucumber/cucumber/lib/models/test_run_hook_definition.js.map new file mode 100644 index 00000000..f907a331 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/models/test_run_hook_definition.js.map @@ -0,0 +1 @@ +{"version":3,"file":"test_run_hook_definition.js","sourceRoot":"","sources":["../../src/models/test_run_hook_definition.ts"],"names":[],"mappings":";;;;;AAAA,8DAGqB;AAMrB,MAAqB,qBAAsB,SAAQ,oBAAU;IAC3C,IAAI,CAAQ;IAE5B,YAAY,IAA0D;QACpE,KAAK,CAAC,IAAI,CAAC,CAAA;QACX,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAA;IAC/B,CAAC;CACF;AAPD,wCAOC","sourcesContent":["import Definition, {\n IDefinitionParameters,\n IDefinitionOptions,\n} from './definition'\n\nexport interface ITestRunHookDefinitionOptions extends IDefinitionOptions {\n name?: string\n}\n\nexport default class TestRunHookDefinition extends Definition {\n public readonly name: string\n\n constructor(data: IDefinitionParameters) {\n super(data)\n this.name = data.options.name\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/models/test_step_hook_definition.d.ts b/node_modules/@cucumber/cucumber/lib/models/test_step_hook_definition.d.ts new file mode 100644 index 00000000..c56ebc40 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/models/test_step_hook_definition.d.ts @@ -0,0 +1,9 @@ +import * as messages from '@cucumber/messages'; +import Definition, { IDefinition, IGetInvocationDataResponse, IGetInvocationDataRequest, IDefinitionParameters, IHookDefinitionOptions } from './definition'; +export default class TestStepHookDefinition extends Definition implements IDefinition { + readonly tagExpression: string; + private readonly pickleTagFilter; + constructor(data: IDefinitionParameters); + appliesToTestCase(pickle: messages.Pickle): boolean; + getInvocationParameters({ hookParameter, }: IGetInvocationDataRequest): Promise; +} diff --git a/node_modules/@cucumber/cucumber/lib/models/test_step_hook_definition.js b/node_modules/@cucumber/cucumber/lib/models/test_step_hook_definition.js new file mode 100644 index 00000000..6102ce82 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/models/test_step_hook_definition.js @@ -0,0 +1,28 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const pickle_filter_1 = require("../pickle_filter"); +const definition_1 = __importDefault(require("./definition")); +class TestStepHookDefinition extends definition_1.default { + tagExpression; + pickleTagFilter; + constructor(data) { + super(data); + this.tagExpression = data.options.tags; + this.pickleTagFilter = new pickle_filter_1.PickleTagFilter(data.options.tags); + } + appliesToTestCase(pickle) { + return this.pickleTagFilter.matchesAllTagExpressions(pickle); + } + async getInvocationParameters({ hookParameter, }) { + return { + getInvalidCodeLengthMessage: () => this.buildInvalidCodeLengthMessage('0 or 1', '2'), + parameters: [hookParameter], + validCodeLengths: [0, 1, 2], + }; + } +} +exports.default = TestStepHookDefinition; +//# sourceMappingURL=test_step_hook_definition.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/models/test_step_hook_definition.js.map b/node_modules/@cucumber/cucumber/lib/models/test_step_hook_definition.js.map new file mode 100644 index 00000000..cf87d659 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/models/test_step_hook_definition.js.map @@ -0,0 +1 @@ +{"version":3,"file":"test_step_hook_definition.js","sourceRoot":"","sources":["../../src/models/test_step_hook_definition.ts"],"names":[],"mappings":";;;;;AACA,oDAAkD;AAClD,8DAMqB;AAErB,MAAqB,sBACnB,SAAQ,oBAAU;IAGF,aAAa,CAAQ;IACpB,eAAe,CAAiB;IAEjD,YAAY,IAAmD;QAC7D,KAAK,CAAC,IAAI,CAAC,CAAA;QACX,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAA;QACtC,IAAI,CAAC,eAAe,GAAG,IAAI,+BAAe,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/D,CAAC;IAED,iBAAiB,CAAC,MAAuB;QACvC,OAAO,IAAI,CAAC,eAAe,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAA;IAC9D,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,EAC5B,aAAa,GACa;QAC1B,OAAO;YACL,2BAA2B,EAAE,GAAG,EAAE,CAChC,IAAI,CAAC,6BAA6B,CAAC,QAAQ,EAAE,GAAG,CAAC;YACnD,UAAU,EAAE,CAAC,aAAa,CAAC;YAC3B,gBAAgB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SAC5B,CAAA;IACH,CAAC;CACF;AA3BD,yCA2BC","sourcesContent":["import * as messages from '@cucumber/messages'\nimport { PickleTagFilter } from '../pickle_filter'\nimport Definition, {\n IDefinition,\n IGetInvocationDataResponse,\n IGetInvocationDataRequest,\n IDefinitionParameters,\n IHookDefinitionOptions,\n} from './definition'\n\nexport default class TestStepHookDefinition\n extends Definition\n implements IDefinition\n{\n public readonly tagExpression: string\n private readonly pickleTagFilter: PickleTagFilter\n\n constructor(data: IDefinitionParameters) {\n super(data)\n this.tagExpression = data.options.tags\n this.pickleTagFilter = new PickleTagFilter(data.options.tags)\n }\n\n appliesToTestCase(pickle: messages.Pickle): boolean {\n return this.pickleTagFilter.matchesAllTagExpressions(pickle)\n }\n\n async getInvocationParameters({\n hookParameter,\n }: IGetInvocationDataRequest): Promise {\n return {\n getInvalidCodeLengthMessage: () =>\n this.buildInvalidCodeLengthMessage('0 or 1', '2'),\n parameters: [hookParameter],\n validCodeLengths: [0, 1, 2],\n }\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/paths/index.d.ts b/node_modules/@cucumber/cucumber/lib/paths/index.d.ts new file mode 100644 index 00000000..e7a3adde --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/paths/index.d.ts @@ -0,0 +1,2 @@ +export * from './paths'; +export * from './types'; diff --git a/node_modules/@cucumber/cucumber/lib/paths/index.js b/node_modules/@cucumber/cucumber/lib/paths/index.js new file mode 100644 index 00000000..d8078cfe --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/paths/index.js @@ -0,0 +1,19 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +__exportStar(require("./paths"), exports); +__exportStar(require("./types"), exports); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/paths/index.js.map b/node_modules/@cucumber/cucumber/lib/paths/index.js.map new file mode 100644 index 00000000..6fc0a7d2 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/paths/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/paths/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAuB;AACvB,0CAAuB","sourcesContent":["export * from './paths'\nexport * from './types'\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/paths/paths.d.ts b/node_modules/@cucumber/cucumber/lib/paths/paths.d.ts new file mode 100644 index 00000000..6b8a9013 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/paths/paths.d.ts @@ -0,0 +1,4 @@ +import { ILogger } from '../environment'; +import { ISourcesCoordinates, ISupportCodeCoordinates } from '../api'; +import { IResolvedPaths } from './types'; +export declare function resolvePaths(logger: ILogger, cwd: string, sources: Pick, support?: ISupportCodeCoordinates): Promise; diff --git a/node_modules/@cucumber/cucumber/lib/paths/paths.js b/node_modules/@cucumber/cucumber/lib/paths/paths.js new file mode 100644 index 00000000..e666b803 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/paths/paths.js @@ -0,0 +1,103 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.resolvePaths = resolvePaths; +const node_path_1 = __importDefault(require("node:path")); +const glob_1 = require("glob"); +const fs_1 = __importDefault(require("mz/fs")); +async function resolvePaths(logger, cwd, sources, support = { + requireModules: [], + requirePaths: [], + importPaths: [], + loaders: [], +}) { + const unexpandedSourcePaths = await getUnexpandedSourcePaths(cwd, sources.paths); + const sourcePaths = await expandSourcePaths(cwd, unexpandedSourcePaths); + logger.debug('Found source files based on configuration:', sourcePaths); + const { requirePaths, importPaths } = await deriveSupportPaths(cwd, sourcePaths, support.requirePaths, support.importPaths); + logger.debug('Found support files to load via `require` based on configuration:', requirePaths); + logger.debug('Found support files to load via `import` based on configuration:', importPaths); + return { + unexpandedSourcePaths: unexpandedSourcePaths, + sourcePaths: sourcePaths, + requirePaths, + importPaths, + }; +} +async function expandPaths(cwd, unexpandedPaths, defaultExtension) { + const expandedPaths = await Promise.all(unexpandedPaths.map(async (unexpandedPath) => { + const matches = await (0, glob_1.glob)(unexpandedPath, { + absolute: true, + windowsPathsNoEscape: true, + cwd, + }); + const expanded = await Promise.all(matches.map(async (match) => { + if (node_path_1.default.extname(match) === '') { + return (0, glob_1.glob)(`${match}/**/*${defaultExtension}`, { + windowsPathsNoEscape: true, + }); + } + return [match]; + })); + return expanded.flat().sort(); + })); + const normalized = expandedPaths.flat().map((x) => node_path_1.default.normalize(x)); + return [...new Set(normalized)]; +} +async function getUnexpandedSourcePaths(cwd, args) { + if (args.length > 0) { + const nestedFeaturePaths = await Promise.all(args.map(async (arg) => { + const filename = node_path_1.default.basename(arg); + if (filename[0] === '@') { + const filePath = node_path_1.default.join(cwd, arg); + const content = await fs_1.default.readFile(filePath, 'utf8'); + return content.split('\n').map((x) => x.trim()); + } + return [arg]; + })); + const featurePaths = nestedFeaturePaths.flat(); + if (featurePaths.length > 0) { + return featurePaths.filter((x) => x !== ''); + } + } + return ['features/**/*.{feature,feature.md}']; +} +function getFeatureDirectoryPaths(cwd, featurePaths) { + const featureDirs = featurePaths.map((featurePath) => { + let featureDir = node_path_1.default.dirname(featurePath); + let childDir; + let parentDir = featureDir; + while (childDir !== parentDir) { + childDir = parentDir; + parentDir = node_path_1.default.dirname(childDir); + if (node_path_1.default.basename(parentDir) === 'features') { + featureDir = parentDir; + break; + } + } + return node_path_1.default.relative(cwd, featureDir); + }); + return [...new Set(featureDirs)]; +} +async function expandSourcePaths(cwd, featurePaths) { + featurePaths = featurePaths.map((p) => p.replace(/(:\d+)*$/g, '')); // Strip line numbers + return await expandPaths(cwd, featurePaths, '.feature'); +} +async function deriveSupportPaths(cwd, featurePaths, unexpandedRequirePaths, unexpandedImportPaths) { + if (unexpandedRequirePaths.length === 0 && + unexpandedImportPaths.length === 0) { + const defaultPaths = getFeatureDirectoryPaths(cwd, featurePaths); + const importPaths = await expandPaths(cwd, defaultPaths, '.@(js|cjs|mjs)'); + return { requirePaths: [], importPaths }; + } + const requirePaths = unexpandedRequirePaths.length > 0 + ? await expandPaths(cwd, unexpandedRequirePaths, '.js') + : []; + const importPaths = unexpandedImportPaths.length > 0 + ? await expandPaths(cwd, unexpandedImportPaths, '.@(js|cjs|mjs)') + : []; + return { requirePaths, importPaths }; +} +//# sourceMappingURL=paths.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/paths/paths.js.map b/node_modules/@cucumber/cucumber/lib/paths/paths.js.map new file mode 100644 index 00000000..9f65c483 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/paths/paths.js.map @@ -0,0 +1 @@ +{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/paths/paths.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'node:path'\nimport { glob } from 'glob'\nimport fs from 'mz/fs'\nimport { ILogger } from '../environment'\nimport { ISourcesCoordinates, ISupportCodeCoordinates } from '../api'\nimport { IResolvedPaths } from './types'\n\nexport async function resolvePaths(\n logger: ILogger,\n cwd: string,\n sources: Pick,\n support: ISupportCodeCoordinates = {\n requireModules: [],\n requirePaths: [],\n importPaths: [],\n loaders: [],\n }\n): Promise {\n const unexpandedSourcePaths = await getUnexpandedSourcePaths(\n cwd,\n sources.paths\n )\n const sourcePaths: string[] = await expandSourcePaths(\n cwd,\n unexpandedSourcePaths\n )\n logger.debug('Found source files based on configuration:', sourcePaths)\n const { requirePaths, importPaths } = await deriveSupportPaths(\n cwd,\n sourcePaths,\n support.requirePaths,\n support.importPaths\n )\n logger.debug(\n 'Found support files to load via `require` based on configuration:',\n requirePaths\n )\n logger.debug(\n 'Found support files to load via `import` based on configuration:',\n importPaths\n )\n return {\n unexpandedSourcePaths: unexpandedSourcePaths,\n sourcePaths: sourcePaths,\n requirePaths,\n importPaths,\n }\n}\n\nasync function expandPaths(\n cwd: string,\n unexpandedPaths: string[],\n defaultExtension: string\n): Promise {\n const expandedPaths = await Promise.all(\n unexpandedPaths.map(async (unexpandedPath) => {\n const matches = await glob(unexpandedPath, {\n absolute: true,\n windowsPathsNoEscape: true,\n cwd,\n })\n const expanded = await Promise.all(\n matches.map(async (match) => {\n if (path.extname(match) === '') {\n return glob(`${match}/**/*${defaultExtension}`, {\n windowsPathsNoEscape: true,\n })\n }\n return [match]\n })\n )\n return expanded.flat().sort()\n })\n )\n const normalized = expandedPaths.flat().map((x) => path.normalize(x))\n return [...new Set(normalized)]\n}\n\nasync function getUnexpandedSourcePaths(\n cwd: string,\n args: string[]\n): Promise {\n if (args.length > 0) {\n const nestedFeaturePaths = await Promise.all(\n args.map(async (arg) => {\n const filename = path.basename(arg)\n if (filename[0] === '@') {\n const filePath = path.join(cwd, arg)\n const content = await fs.readFile(filePath, 'utf8')\n return content.split('\\n').map((x) => x.trim())\n }\n return [arg]\n })\n )\n const featurePaths = nestedFeaturePaths.flat()\n if (featurePaths.length > 0) {\n return featurePaths.filter((x) => x !== '')\n }\n }\n return ['features/**/*.{feature,feature.md}']\n}\n\nfunction getFeatureDirectoryPaths(\n cwd: string,\n featurePaths: string[]\n): string[] {\n const featureDirs = featurePaths.map((featurePath) => {\n let featureDir = path.dirname(featurePath)\n let childDir: string\n let parentDir = featureDir\n while (childDir !== parentDir) {\n childDir = parentDir\n parentDir = path.dirname(childDir)\n if (path.basename(parentDir) === 'features') {\n featureDir = parentDir\n break\n }\n }\n return path.relative(cwd, featureDir)\n })\n return [...new Set(featureDirs)]\n}\n\nasync function expandSourcePaths(\n cwd: string,\n featurePaths: string[]\n): Promise {\n featurePaths = featurePaths.map((p) => p.replace(/(:\\d+)*$/g, '')) // Strip line numbers\n return await expandPaths(cwd, featurePaths, '.feature')\n}\n\nasync function deriveSupportPaths(\n cwd: string,\n featurePaths: string[],\n unexpandedRequirePaths: string[],\n unexpandedImportPaths: string[]\n): Promise<{\n requirePaths: string[]\n importPaths: string[]\n}> {\n if (\n unexpandedRequirePaths.length === 0 &&\n unexpandedImportPaths.length === 0\n ) {\n const defaultPaths = getFeatureDirectoryPaths(cwd, featurePaths)\n const importPaths = await expandPaths(cwd, defaultPaths, '.@(js|cjs|mjs)')\n return { requirePaths: [], importPaths }\n }\n const requirePaths =\n unexpandedRequirePaths.length > 0\n ? await expandPaths(cwd, unexpandedRequirePaths, '.js')\n : []\n const importPaths =\n unexpandedImportPaths.length > 0\n ? await expandPaths(cwd, unexpandedImportPaths, '.@(js|cjs|mjs)')\n : []\n return { requirePaths, importPaths }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/paths/types.d.ts b/node_modules/@cucumber/cucumber/lib/paths/types.d.ts new file mode 100644 index 00000000..e31b814e --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/paths/types.d.ts @@ -0,0 +1,13 @@ +/** + * Paths that woll be used to load feature files and user code + * @public + * @remarks + * These values are the result of pre-processing to expand globs, expand + * directory references, and apply defaults where applicable. + */ +export interface IResolvedPaths { + unexpandedSourcePaths: string[]; + sourcePaths: string[]; + requirePaths: string[]; + importPaths: string[]; +} diff --git a/node_modules/@cucumber/cucumber/lib/paths/types.js b/node_modules/@cucumber/cucumber/lib/paths/types.js new file mode 100644 index 00000000..11e638d1 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/paths/types.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/paths/types.js.map b/node_modules/@cucumber/cucumber/lib/paths/types.js.map new file mode 100644 index 00000000..9c8717e4 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/paths/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/paths/types.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Paths that woll be used to load feature files and user code\n * @public\n * @remarks\n * These values are the result of pre-processing to expand globs, expand\n * directory references, and apply defaults where applicable.\n */\nexport interface IResolvedPaths {\n unexpandedSourcePaths: string[]\n sourcePaths: string[]\n requirePaths: string[]\n importPaths: string[]\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/pickle_filter.d.ts b/node_modules/@cucumber/cucumber/lib/pickle_filter.d.ts new file mode 100644 index 00000000..635dd794 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/pickle_filter.d.ts @@ -0,0 +1,42 @@ +import * as messages from '@cucumber/messages'; +import IGherkinDocument = messages.GherkinDocument; +import IPickle = messages.Pickle; +export interface IPickleFilterOptions { + cwd: string; + featurePaths?: string[]; + names?: string[]; + tagExpression?: string; +} +export interface IMatchesAnyLineRequest { + gherkinDocument: messages.GherkinDocument; + pickle: messages.Pickle; +} +export default class PickleFilter { + private readonly lineFilter; + private readonly nameFilter; + private readonly tagFilter; + constructor({ cwd, featurePaths, names, tagExpression, }: IPickleFilterOptions); + matches({ gherkinDocument, pickle, }: { + gherkinDocument: IGherkinDocument; + pickle: IPickle; + }): boolean; +} +export declare class PickleLineFilter { + private readonly featureUriToLinesMapping; + constructor(cwd: string, featurePaths?: string[]); + getFeatureUriToLinesMapping({ cwd, featurePaths, }: { + cwd: string; + featurePaths: string[]; + }): Record; + matchesAnyLine({ gherkinDocument, pickle }: IMatchesAnyLineRequest): boolean; +} +export declare class PickleNameFilter { + private readonly names; + constructor(names?: string[]); + matchesAnyName(pickle: messages.Pickle): boolean; +} +export declare class PickleTagFilter { + private readonly tagExpressionNode; + constructor(tagExpression: string); + matchesAllTagExpressions(pickle: messages.Pickle): boolean; +} diff --git a/node_modules/@cucumber/cucumber/lib/pickle_filter.js b/node_modules/@cucumber/cucumber/lib/pickle_filter.js new file mode 100644 index 00000000..438e2c7b --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/pickle_filter.js @@ -0,0 +1,105 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PickleTagFilter = exports.PickleNameFilter = exports.PickleLineFilter = void 0; +const node_path_1 = __importDefault(require("node:path")); +const tag_expressions_1 = require("@cucumber/tag-expressions"); +const gherkin_document_parser_1 = require("./formatter/helpers/gherkin_document_parser"); +const value_checker_1 = require("./value_checker"); +const FEATURE_LINENUM_REGEXP = /^(.*?)((?::[\d]+)+)?$/; +class PickleFilter { + lineFilter; + nameFilter; + tagFilter; + constructor({ cwd, featurePaths, names, tagExpression, }) { + this.lineFilter = new PickleLineFilter(cwd, featurePaths); + this.nameFilter = new PickleNameFilter(names); + this.tagFilter = new PickleTagFilter(tagExpression); + } + matches({ gherkinDocument, pickle, }) { + return (this.lineFilter.matchesAnyLine({ gherkinDocument, pickle }) && + this.nameFilter.matchesAnyName(pickle) && + this.tagFilter.matchesAllTagExpressions(pickle)); + } +} +exports.default = PickleFilter; +class PickleLineFilter { + featureUriToLinesMapping; + constructor(cwd, featurePaths = []) { + this.featureUriToLinesMapping = this.getFeatureUriToLinesMapping({ + cwd, + featurePaths, + }); + } + getFeatureUriToLinesMapping({ cwd, featurePaths, }) { + const mapping = {}; + featurePaths.forEach((featurePath) => { + const match = FEATURE_LINENUM_REGEXP.exec(featurePath); + if ((0, value_checker_1.doesHaveValue)(match)) { + let uri = match[1]; + if (node_path_1.default.isAbsolute(uri)) { + uri = node_path_1.default.relative(cwd, uri); + } + else { + uri = node_path_1.default.normalize(uri); + } + const linesExpression = match[2]; + if ((0, value_checker_1.doesHaveValue)(linesExpression)) { + if ((0, value_checker_1.doesNotHaveValue)(mapping[uri])) { + mapping[uri] = []; + } + linesExpression + .slice(1) + .split(':') + .forEach((line) => { + mapping[uri].push(parseInt(line)); + }); + } + } + }); + return mapping; + } + matchesAnyLine({ gherkinDocument, pickle }) { + const uri = node_path_1.default.normalize(pickle.uri); + const linesToMatch = this.featureUriToLinesMapping[uri]; + if ((0, value_checker_1.doesHaveValue)(linesToMatch)) { + const gherkinScenarioLocationMap = (0, gherkin_document_parser_1.getGherkinScenarioLocationMap)(gherkinDocument); + const pickleLines = new Set(pickle.astNodeIds.map((sourceId) => gherkinScenarioLocationMap[sourceId].line)); + const linesIntersection = linesToMatch.filter((x) => pickleLines.has(x)); + return linesIntersection.length > 0; + } + return true; + } +} +exports.PickleLineFilter = PickleLineFilter; +class PickleNameFilter { + names; + constructor(names = []) { + this.names = names; + } + matchesAnyName(pickle) { + if (this.names.length === 0) { + return true; + } + return this.names.some((name) => pickle.name.match(name)); + } +} +exports.PickleNameFilter = PickleNameFilter; +class PickleTagFilter { + tagExpressionNode; + constructor(tagExpression) { + if ((0, value_checker_1.doesHaveValue)(tagExpression) && tagExpression !== '') { + this.tagExpressionNode = (0, tag_expressions_1.parse)(tagExpression); + } + } + matchesAllTagExpressions(pickle) { + if ((0, value_checker_1.doesNotHaveValue)(this.tagExpressionNode)) { + return true; + } + return this.tagExpressionNode.evaluate(pickle.tags.map((x) => x.name)); + } +} +exports.PickleTagFilter = PickleTagFilter; +//# sourceMappingURL=pickle_filter.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/pickle_filter.js.map b/node_modules/@cucumber/cucumber/lib/pickle_filter.js.map new file mode 100644 index 00000000..046b1d69 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/pickle_filter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pickle_filter.js","sourceRoot":"","sources":["../src/pickle_filter.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'node:path'\nimport { Node, parse } from '@cucumber/tag-expressions'\nimport * as messages from '@cucumber/messages'\nimport { getGherkinScenarioLocationMap } from './formatter/helpers/gherkin_document_parser'\nimport { doesHaveValue, doesNotHaveValue } from './value_checker'\nimport IGherkinDocument = messages.GherkinDocument\nimport IPickle = messages.Pickle\n\nconst FEATURE_LINENUM_REGEXP = /^(.*?)((?::[\\d]+)+)?$/\n\nexport interface IPickleFilterOptions {\n cwd: string\n featurePaths?: string[]\n names?: string[]\n tagExpression?: string\n}\n\nexport interface IMatchesAnyLineRequest {\n gherkinDocument: messages.GherkinDocument\n pickle: messages.Pickle\n}\n\nexport default class PickleFilter {\n private readonly lineFilter: PickleLineFilter\n private readonly nameFilter: PickleNameFilter\n private readonly tagFilter: PickleTagFilter\n\n constructor({\n cwd,\n featurePaths,\n names,\n tagExpression,\n }: IPickleFilterOptions) {\n this.lineFilter = new PickleLineFilter(cwd, featurePaths)\n this.nameFilter = new PickleNameFilter(names)\n this.tagFilter = new PickleTagFilter(tagExpression)\n }\n\n matches({\n gherkinDocument,\n pickle,\n }: {\n gherkinDocument: IGherkinDocument\n pickle: IPickle\n }): boolean {\n return (\n this.lineFilter.matchesAnyLine({ gherkinDocument, pickle }) &&\n this.nameFilter.matchesAnyName(pickle) &&\n this.tagFilter.matchesAllTagExpressions(pickle)\n )\n }\n}\n\nexport class PickleLineFilter {\n private readonly featureUriToLinesMapping: Record\n\n constructor(cwd: string, featurePaths: string[] = []) {\n this.featureUriToLinesMapping = this.getFeatureUriToLinesMapping({\n cwd,\n featurePaths,\n })\n }\n\n getFeatureUriToLinesMapping({\n cwd,\n featurePaths,\n }: {\n cwd: string\n featurePaths: string[]\n }): Record {\n const mapping: Record = {}\n featurePaths.forEach((featurePath) => {\n const match = FEATURE_LINENUM_REGEXP.exec(featurePath)\n if (doesHaveValue(match)) {\n let uri = match[1]\n if (path.isAbsolute(uri)) {\n uri = path.relative(cwd, uri)\n } else {\n uri = path.normalize(uri)\n }\n const linesExpression = match[2]\n if (doesHaveValue(linesExpression)) {\n if (doesNotHaveValue(mapping[uri])) {\n mapping[uri] = []\n }\n linesExpression\n .slice(1)\n .split(':')\n .forEach((line) => {\n mapping[uri].push(parseInt(line))\n })\n }\n }\n })\n return mapping\n }\n\n matchesAnyLine({ gherkinDocument, pickle }: IMatchesAnyLineRequest): boolean {\n const uri = path.normalize(pickle.uri)\n const linesToMatch = this.featureUriToLinesMapping[uri]\n if (doesHaveValue(linesToMatch)) {\n const gherkinScenarioLocationMap =\n getGherkinScenarioLocationMap(gherkinDocument)\n const pickleLines = new Set(\n pickle.astNodeIds.map(\n (sourceId) => gherkinScenarioLocationMap[sourceId].line\n )\n )\n const linesIntersection = linesToMatch.filter((x) => pickleLines.has(x))\n return linesIntersection.length > 0\n }\n return true\n }\n}\n\nexport class PickleNameFilter {\n private readonly names: string[]\n\n constructor(names: string[] = []) {\n this.names = names\n }\n\n matchesAnyName(pickle: messages.Pickle): boolean {\n if (this.names.length === 0) {\n return true\n }\n return this.names.some((name) => pickle.name.match(name))\n }\n}\n\nexport class PickleTagFilter {\n private readonly tagExpressionNode: Node\n\n constructor(tagExpression: string) {\n if (doesHaveValue(tagExpression) && tagExpression !== '') {\n this.tagExpressionNode = parse(tagExpression)\n }\n }\n\n matchesAllTagExpressions(pickle: messages.Pickle): boolean {\n if (doesNotHaveValue(this.tagExpressionNode)) {\n return true\n }\n return this.tagExpressionNode.evaluate(pickle.tags.map((x) => x.name))\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/plugin/index.d.ts b/node_modules/@cucumber/cucumber/lib/plugin/index.d.ts new file mode 100644 index 00000000..b92ba5d1 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/plugin/index.d.ts @@ -0,0 +1,2 @@ +export * from './types'; +export * from './plugin_manager'; diff --git a/node_modules/@cucumber/cucumber/lib/plugin/index.js b/node_modules/@cucumber/cucumber/lib/plugin/index.js new file mode 100644 index 00000000..35f0f710 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/plugin/index.js @@ -0,0 +1,19 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +__exportStar(require("./types"), exports); +__exportStar(require("./plugin_manager"), exports); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/plugin/index.js.map b/node_modules/@cucumber/cucumber/lib/plugin/index.js.map new file mode 100644 index 00000000..4bb79ed3 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/plugin/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAuB;AACvB,mDAAgC","sourcesContent":["export * from './types'\nexport * from './plugin_manager'\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/plugin/plugin_manager.d.ts b/node_modules/@cucumber/cucumber/lib/plugin/plugin_manager.d.ts new file mode 100644 index 00000000..7e26994d --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/plugin/plugin_manager.d.ts @@ -0,0 +1,19 @@ +import { UsableEnvironment } from '../environment'; +import { CoordinatorEventKey, CoordinatorEventValues, CoordinatorTransformKey, CoordinatorTransformValues, FormatterPlugin, Plugin, PluginOperation } from './types'; +export declare class PluginManager { + private readonly environment; + private readonly handlers; + private readonly transformers; + private cleanupFns; + constructor(environment: UsableEnvironment); + private registerHandler; + private registerTransformer; + initFormatter(plugin: FormatterPlugin, options: OptionsType, stream: NodeJS.WritableStream, write: (buffer: string | Uint8Array) => void, directory?: string, specifier?: string): Promise; + initCoordinatorExternal(operation: PluginOperation, plugin: Plugin, options: OptionsType, specifier?: string): Promise; + initCoordinatorInternal(operation: PluginOperation, plugin: Plugin, options: OptionsType): Promise; + private initCoordinator; + private makeCoordinatorContext; + emit(event: K, value: CoordinatorEventValues[K]): void; + transform(event: K, value: CoordinatorTransformValues[K]): Promise; + cleanup(): Promise; +} diff --git a/node_modules/@cucumber/cucumber/lib/plugin/plugin_manager.js b/node_modules/@cucumber/cucumber/lib/plugin/plugin_manager.js new file mode 100644 index 00000000..4e56a7a0 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/plugin/plugin_manager.js @@ -0,0 +1,132 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PluginManager = void 0; +class PluginManager { + environment; + handlers = { + message: [], + 'paths:resolve': [], + 'publish:url': [], + }; + transformers = { + 'pickles:filter': [], + 'pickles:order': [], + }; + cleanupFns = []; + constructor(environment) { + this.environment = environment; + } + async registerHandler(event, handler, specifier) { + if (!this.handlers[event]) { + throw new Error(`Cannot register handler for unknown event "${event}"`); + } + this.handlers[event].push({ + handler, + specifier, + }); + } + async registerTransformer(event, transformer, specifier) { + if (!this.transformers[event]) { + throw new Error(`Cannot register transformer for unknown event "${event}"`); + } + this.transformers[event].push({ + transformer, + specifier, + }); + } + async initFormatter(plugin, options, stream, write, directory, specifier) { + const cleanupFn = await plugin.formatter({ + on: (key, handler) => this.registerHandler(key, handler, specifier), + options: plugin.optionsKey + ? (options[plugin.optionsKey] ?? {}) + : options, + logger: this.environment.logger, + stream, + write, + directory, + }); + if (typeof cleanupFn === 'function') { + this.cleanupFns.push({ + cleanupFn: cleanupFn, + specifier, + }); + } + } + async initCoordinatorExternal(operation, plugin, options, specifier) { + const context = this.makeCoordinatorContext(operation, plugin, options, specifier); + await this.initCoordinator(plugin, context, specifier); + } + async initCoordinatorInternal(operation, plugin, options) { + const context = { + ...this.makeCoordinatorContext(operation, plugin, options), + emit: this.emit.bind(this), + }; + await this.initCoordinator(plugin, context); + } + async initCoordinator(plugin, context, specifier) { + const cleanupFn = await wrapErrorAsync(async () => await plugin.coordinator(context), `${formatCulprit(specifier)} errored when trying to init`); + if (typeof cleanupFn === 'function') { + this.cleanupFns.push({ + cleanupFn: cleanupFn, + specifier, + }); + } + } + makeCoordinatorContext(operation, plugin, options, specifier) { + return { + operation, + on: (event, handler) => this.registerHandler(event, handler, specifier), + transform: (event, transformer) => this.registerTransformer(event, transformer, specifier), + options: 'optionsKey' in plugin && plugin.optionsKey + ? (options[plugin.optionsKey] ?? {}) + : options, + logger: this.environment.logger, + environment: { + cwd: this.environment.cwd, + stderr: this.environment.stderr, + env: { ...this.environment.env }, + }, + }; + } + emit(event, value) { + this.handlers[event].forEach(({ handler, specifier }) => { + wrapError(() => handler(value), `${formatCulprit(specifier)} errored when trying to handle a "${event}" event`); + }); + } + async transform(event, value) { + let transformed = value; + for (const { transformer, specifier } of this.transformers[event]) { + const returned = await wrapErrorAsync(async () => await transformer(transformed), `${formatCulprit(specifier)} errored when trying to do a "${event}" transform`); + if (typeof returned !== 'undefined') { + transformed = returned; + } + } + return transformed; + } + async cleanup() { + for (const { cleanupFn, specifier } of this.cleanupFns) { + await wrapErrorAsync(async () => await cleanupFn(), `${formatCulprit(specifier)} errored when trying to cleanup`); + } + } +} +exports.PluginManager = PluginManager; +function formatCulprit(specifier) { + return specifier ? `Plugin "${specifier}"` : 'Cucumber'; +} +function wrapError(fn, message) { + try { + return fn(); + } + catch (error) { + throw new Error(message, { cause: error }); + } +} +async function wrapErrorAsync(fn, message) { + try { + return await fn(); + } + catch (error) { + throw new Error(message, { cause: error }); + } +} +//# sourceMappingURL=plugin_manager.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/plugin/plugin_manager.js.map b/node_modules/@cucumber/cucumber/lib/plugin/plugin_manager.js.map new file mode 100644 index 00000000..37363f6d --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/plugin/plugin_manager.js.map @@ -0,0 +1 @@ +{"version":3,"file":"plugin_manager.js","sourceRoot":"","sources":["../../src/plugin/plugin_manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { UsableEnvironment } from '../environment'\nimport {\n CoordinatorContext,\n CoordinatorEventHandler,\n CoordinatorEventKey,\n CoordinatorEventValues,\n CoordinatorTransformer,\n CoordinatorTransformKey,\n CoordinatorTransformValues,\n FormatterPlugin,\n InternalPlugin,\n Plugin,\n PluginCleanup,\n PluginOperation,\n} from './types'\n\ntype SourcedEventHandler = {\n handler: CoordinatorEventHandler\n specifier?: string\n}\n\ntype SourcedTransformer = {\n transformer: CoordinatorTransformer\n specifier?: string\n}\n\ntype SourcedCleanup = {\n cleanupFn: PluginCleanup\n specifier?: string\n}\n\ntype HandlerRegistry = {\n [K in CoordinatorEventKey]: Array>\n}\n\ntype TransformerRegistry = {\n [K in CoordinatorTransformKey]: Array>\n}\n\nexport class PluginManager {\n private readonly handlers: HandlerRegistry = {\n message: [],\n 'paths:resolve': [],\n 'publish:url': [],\n }\n private readonly transformers: TransformerRegistry = {\n 'pickles:filter': [],\n 'pickles:order': [],\n }\n private cleanupFns: SourcedCleanup[] = []\n\n constructor(private readonly environment: UsableEnvironment) {}\n\n private async registerHandler(\n event: K,\n handler: CoordinatorEventHandler,\n specifier?: string\n ) {\n if (!this.handlers[event]) {\n throw new Error(`Cannot register handler for unknown event \"${event}\"`)\n }\n this.handlers[event].push({\n handler,\n specifier,\n })\n }\n\n private async registerTransformer(\n event: K,\n transformer: CoordinatorTransformer,\n specifier?: string\n ) {\n if (!this.transformers[event]) {\n throw new Error(\n `Cannot register transformer for unknown event \"${event}\"`\n )\n }\n this.transformers[event].push({\n transformer,\n specifier,\n })\n }\n\n async initFormatter(\n plugin: FormatterPlugin,\n options: OptionsType,\n stream: NodeJS.WritableStream,\n write: (buffer: string | Uint8Array) => void,\n directory?: string,\n specifier?: string\n ) {\n const cleanupFn = await plugin.formatter({\n on: (key, handler) => this.registerHandler(key, handler, specifier),\n options: plugin.optionsKey\n ? ((options as any)[plugin.optionsKey] ?? ({} as OptionsType))\n : options,\n logger: this.environment.logger,\n stream,\n write,\n directory,\n })\n if (typeof cleanupFn === 'function') {\n this.cleanupFns.push({\n cleanupFn: cleanupFn,\n specifier,\n })\n }\n }\n\n async initCoordinatorExternal(\n operation: PluginOperation,\n plugin: Plugin,\n options: OptionsType,\n specifier?: string\n ) {\n const context = this.makeCoordinatorContext(\n operation,\n plugin,\n options,\n specifier\n )\n await this.initCoordinator(plugin, context, specifier)\n }\n\n async initCoordinatorInternal(\n operation: PluginOperation,\n plugin: Plugin,\n options: OptionsType\n ) {\n const context = {\n ...this.makeCoordinatorContext(operation, plugin, options),\n emit: this.emit.bind(this),\n }\n await this.initCoordinator(plugin, context)\n }\n\n private async initCoordinator(\n plugin: Plugin,\n context: CoordinatorContext,\n specifier?: string\n ) {\n const cleanupFn = await wrapErrorAsync(\n async () => await plugin.coordinator(context),\n `${formatCulprit(specifier)} errored when trying to init`\n )\n if (typeof cleanupFn === 'function') {\n this.cleanupFns.push({\n cleanupFn: cleanupFn,\n specifier,\n })\n }\n }\n\n private makeCoordinatorContext(\n operation: PluginOperation,\n plugin: Plugin | InternalPlugin,\n options: OptionsType,\n specifier?: string\n ) {\n return {\n operation,\n on: (\n event: K,\n handler: CoordinatorEventHandler\n ) => this.registerHandler(event, handler, specifier),\n transform: (\n event: K,\n transformer: CoordinatorTransformer\n ) => this.registerTransformer(event, transformer, specifier),\n options:\n 'optionsKey' in plugin && plugin.optionsKey\n ? ((options as any)[plugin.optionsKey] ?? ({} as OptionsType))\n : options,\n logger: this.environment.logger,\n environment: {\n cwd: this.environment.cwd,\n stderr: this.environment.stderr,\n env: { ...this.environment.env },\n },\n }\n }\n\n emit(\n event: K,\n value: CoordinatorEventValues[K]\n ): void {\n this.handlers[event].forEach(({ handler, specifier }) => {\n wrapError(\n () => handler(value),\n `${formatCulprit(specifier)} errored when trying to handle a \"${event}\" event`\n )\n })\n }\n\n async transform(\n event: K,\n value: CoordinatorTransformValues[K]\n ): Promise {\n let transformed = value\n for (const { transformer, specifier } of this.transformers[event]) {\n const returned = await wrapErrorAsync(\n async () => await transformer(transformed),\n `${formatCulprit(specifier)} errored when trying to do a \"${event}\" transform`\n )\n if (typeof returned !== 'undefined') {\n transformed = returned\n }\n }\n return transformed\n }\n\n async cleanup(): Promise {\n for (const { cleanupFn, specifier } of this.cleanupFns) {\n await wrapErrorAsync(\n async () => await cleanupFn(),\n `${formatCulprit(specifier)} errored when trying to cleanup`\n )\n }\n }\n}\n\nfunction formatCulprit(specifier?: string) {\n return specifier ? `Plugin \"${specifier}\"` : 'Cucumber'\n}\n\nfunction wrapError(fn: () => T, message: string): T {\n try {\n return fn()\n } catch (error) {\n throw new Error(message, { cause: error })\n }\n}\n\nasync function wrapErrorAsync(\n fn: () => Promise,\n message: string\n): Promise {\n try {\n return await fn()\n } catch (error) {\n throw new Error(message, { cause: error })\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/plugin/types.d.ts b/node_modules/@cucumber/cucumber/lib/plugin/types.d.ts new file mode 100644 index 00000000..0e1246ac --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/plugin/types.d.ts @@ -0,0 +1,157 @@ +import { Writable } from 'node:stream'; +import { Envelope } from '@cucumber/messages'; +import { ILogger } from '../environment'; +import { IFilterablePickle } from '../filter'; +import { IResolvedPaths } from '../paths'; +/** + * The operation Cucumber is doing in this process + * @public + * @remarks + * `loadSources` and `loadSupport` are generally used as preflight operations + * for complex use cases. `runCucumber` is the one where tests are actually + * executed. + */ +export type PluginOperation = 'loadSources' | 'loadSupport' | 'runCucumber'; +/** + * Subset of the environment available to plugins + * @public + */ +export type CoordinatorEnvironment = { + /** + * Working directory for the project + */ + cwd: string; + /** + * Writable stream where the test run's warning/error output is written + * and plugins can write to directly if required + */ + stderr: Writable; + /** + * Environment variables + */ + env: Record; +}; +/** + * Keys for event handlers that plugins can register + * @public + */ +export type CoordinatorEventKey = 'message' | 'paths:resolve' | 'publish:url'; +/** + * Keys for transforms that plugins can register + * @public + */ +export type CoordinatorTransformKey = 'pickles:filter' | 'pickles:order'; +/** + * Mapping of event keys to their value types + * @public + */ +export type CoordinatorEventValues = { + message: Readonly; + 'paths:resolve': Readonly; + 'publish:url': string; +}; +/** + * Mapping of transform keys to their value types + * @public + */ +export type CoordinatorTransformValues = { + 'pickles:filter': Readonly>; + 'pickles:order': Readonly>; +}; +/** + * Handler function for a coordinator event + * @public + * @remarks + * You can do async work here, but Cucumber will not await the Promise. + */ +export type CoordinatorEventHandler = (value: CoordinatorEventValues[K]) => void; +/** + * Transformer function for a coordinator transform + * @remarks + * Don't try to modify the original value. Return a transformed value, or + * `undefined` to pass through unchanged. + * @public + */ +export type CoordinatorTransformer = (value: CoordinatorTransformValues[K]) => PromiseLike | CoordinatorTransformValues[K]; +/** + * Context object passed to a plugin's coordinator function + * @public + */ +export type CoordinatorContext = { + /** + * The operation Cucumber is doing in this process + */ + operation: PluginOperation; + /** + * Register an event handler + */ + on: (event: EventKey, handler: CoordinatorEventHandler) => void; + /** + * Register a transformer + */ + transform: (event: EventKey, handler: CoordinatorTransformer) => void; + /** + * Options for the plugin + */ + options: OptionsType; + /** + * Logger for emitting user-facing messages or diagnostics + */ + logger: ILogger; + /** + * Subset of the environment + */ + environment: CoordinatorEnvironment; +}; +/** + * Optional cleanup function returned by a plugin coordinator + * @public + */ +export type PluginCleanup = () => PromiseLike | void; +/** + * A plugin that can subscribe to events and register transforms + * @public + */ +export type Plugin = { + type: 'plugin'; + /** + * Coordinator function called during initialization + * @remarks + * Can do async work, and the Promise will be awaited. Can optionally return + * a cleanup function to be called when Cucumber is about to exit. + */ + coordinator: (context: CoordinatorContext) => PromiseLike | PluginCleanup | void; + /** + * Optional key to extract plugin-specific options from the root options object + */ + optionsKey?: string; +}; +/** + * Context object passed to an internal plugin's coordinator function + * @internal + */ +export type InternalCoordinatorContext = CoordinatorContext & { + emit: (event: EventKey, value: CoordinatorEventValues[EventKey]) => void; +}; +/** + * A built-in plugin with the additional ability to emit events + * @internal + */ +export type InternalPlugin = { + type: 'plugin'; + coordinator: (context: InternalCoordinatorContext) => PromiseLike | PluginCleanup | void; +}; +export type FormatterPluginContext = { + on: (key: 'message', handler: (value: Envelope) => void) => void; + options: OptionsType; + logger: ILogger; + stream: NodeJS.WritableStream; + write: (buffer: string | Uint8Array) => void; + directory?: string; +}; +export type FormatterPluginFunction = (context: FormatterPluginContext) => PromiseLike | PluginCleanup | void; +export type FormatterPlugin = { + type: 'formatter'; + formatter: FormatterPluginFunction; + optionsKey?: string; +}; diff --git a/node_modules/@cucumber/cucumber/lib/plugin/types.js b/node_modules/@cucumber/cucumber/lib/plugin/types.js new file mode 100644 index 00000000..11e638d1 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/plugin/types.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/plugin/types.js.map b/node_modules/@cucumber/cucumber/lib/plugin/types.js.map new file mode 100644 index 00000000..63d127af --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/plugin/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/plugin/types.ts"],"names":[],"mappings":"","sourcesContent":["import { Writable } from 'node:stream'\nimport { Envelope } from '@cucumber/messages'\nimport { ILogger } from '../environment'\nimport { IFilterablePickle } from '../filter'\nimport { IResolvedPaths } from '../paths'\n\n/**\n * The operation Cucumber is doing in this process\n * @public\n * @remarks\n * `loadSources` and `loadSupport` are generally used as preflight operations\n * for complex use cases. `runCucumber` is the one where tests are actually\n * executed.\n */\nexport type PluginOperation = 'loadSources' | 'loadSupport' | 'runCucumber'\n\n/**\n * Subset of the environment available to plugins\n * @public\n */\nexport type CoordinatorEnvironment = {\n /**\n * Working directory for the project\n */\n cwd: string\n /**\n * Writable stream where the test run's warning/error output is written\n * and plugins can write to directly if required\n */\n stderr: Writable\n /**\n * Environment variables\n */\n env: Record\n}\n\n/**\n * Keys for event handlers that plugins can register\n * @public\n */\nexport type CoordinatorEventKey = 'message' | 'paths:resolve' | 'publish:url'\n\n/**\n * Keys for transforms that plugins can register\n * @public\n */\nexport type CoordinatorTransformKey = 'pickles:filter' | 'pickles:order'\n\n/**\n * Mapping of event keys to their value types\n * @public\n */\nexport type CoordinatorEventValues = {\n message: Readonly\n 'paths:resolve': Readonly\n 'publish:url': string\n}\n\n/**\n * Mapping of transform keys to their value types\n * @public\n */\nexport type CoordinatorTransformValues = {\n 'pickles:filter': Readonly>\n 'pickles:order': Readonly>\n}\n\n/**\n * Handler function for a coordinator event\n * @public\n * @remarks\n * You can do async work here, but Cucumber will not await the Promise.\n */\nexport type CoordinatorEventHandler = (\n value: CoordinatorEventValues[K]\n) => void\n\n/**\n * Transformer function for a coordinator transform\n * @remarks\n * Don't try to modify the original value. Return a transformed value, or\n * `undefined` to pass through unchanged.\n * @public\n */\nexport type CoordinatorTransformer = (\n value: CoordinatorTransformValues[K]\n) => PromiseLike | CoordinatorTransformValues[K]\n\n/**\n * Context object passed to a plugin's coordinator function\n * @public\n */\nexport type CoordinatorContext = {\n /**\n * The operation Cucumber is doing in this process\n */\n operation: PluginOperation\n /**\n * Register an event handler\n */\n on: (\n event: EventKey,\n handler: CoordinatorEventHandler\n ) => void\n /**\n * Register a transformer\n */\n transform: (\n event: EventKey,\n handler: CoordinatorTransformer\n ) => void\n /**\n * Options for the plugin\n */\n options: OptionsType\n /**\n * Logger for emitting user-facing messages or diagnostics\n */\n logger: ILogger\n /**\n * Subset of the environment\n */\n environment: CoordinatorEnvironment\n}\n\n/**\n * Optional cleanup function returned by a plugin coordinator\n * @public\n */\nexport type PluginCleanup = () => PromiseLike | void\n\n/**\n * A plugin that can subscribe to events and register transforms\n * @public\n */\nexport type Plugin = {\n type: 'plugin'\n /**\n * Coordinator function called during initialization\n * @remarks\n * Can do async work, and the Promise will be awaited. Can optionally return\n * a cleanup function to be called when Cucumber is about to exit.\n */\n coordinator: (\n context: CoordinatorContext\n ) => PromiseLike | PluginCleanup | void\n /**\n * Optional key to extract plugin-specific options from the root options object\n */\n optionsKey?: string\n}\n\n/**\n * Context object passed to an internal plugin's coordinator function\n * @internal\n */\nexport type InternalCoordinatorContext =\n CoordinatorContext & {\n emit: (\n event: EventKey,\n value: CoordinatorEventValues[EventKey]\n ) => void\n }\n\n/**\n * A built-in plugin with the additional ability to emit events\n * @internal\n */\nexport type InternalPlugin = {\n type: 'plugin'\n coordinator: (\n context: InternalCoordinatorContext\n ) => PromiseLike | PluginCleanup | void\n}\n\nexport type FormatterPluginContext = {\n on: (key: 'message', handler: (value: Envelope) => void) => void\n options: OptionsType\n logger: ILogger\n stream: NodeJS.WritableStream\n write: (buffer: string | Uint8Array) => void\n directory?: string\n}\n\nexport type FormatterPluginFunction = (\n context: FormatterPluginContext\n) => PromiseLike | PluginCleanup | void\n\nexport type FormatterPlugin = {\n type: 'formatter'\n formatter: FormatterPluginFunction\n optionsKey?: string\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/publish/index.d.ts b/node_modules/@cucumber/cucumber/lib/publish/index.d.ts new file mode 100644 index 00000000..c7e67b48 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/publish/index.d.ts @@ -0,0 +1,3 @@ +import { publishPlugin } from './publish_plugin'; +export default publishPlugin; +export * from './types'; diff --git a/node_modules/@cucumber/cucumber/lib/publish/index.js b/node_modules/@cucumber/cucumber/lib/publish/index.js new file mode 100644 index 00000000..5074801b --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/publish/index.js @@ -0,0 +1,20 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const publish_plugin_1 = require("./publish_plugin"); +exports.default = publish_plugin_1.publishPlugin; +__exportStar(require("./types"), exports); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/publish/index.js.map b/node_modules/@cucumber/cucumber/lib/publish/index.js.map new file mode 100644 index 00000000..d92fa2ec --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/publish/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/publish/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAgD;AAEhD,kBAAe,8BAAa,CAAA;AAC5B,0CAAuB","sourcesContent":["import { publishPlugin } from './publish_plugin'\n\nexport default publishPlugin\nexport * from './types'\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/publish/publish_plugin.d.ts b/node_modules/@cucumber/cucumber/lib/publish/publish_plugin.d.ts new file mode 100644 index 00000000..63320493 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/publish/publish_plugin.d.ts @@ -0,0 +1,2 @@ +import { InternalPlugin } from '../plugin'; +export declare const publishPlugin: InternalPlugin; diff --git a/node_modules/@cucumber/cucumber/lib/publish/publish_plugin.js b/node_modules/@cucumber/cucumber/lib/publish/publish_plugin.js new file mode 100644 index 00000000..125782e3 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/publish/publish_plugin.js @@ -0,0 +1,95 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.publishPlugin = void 0; +const promises_1 = require("node:stream/promises"); +const node_util_1 = require("node:util"); +const promises_2 = require("node:fs/promises"); +const node_path_1 = __importDefault(require("node:path")); +const node_os_1 = require("node:os"); +const node_fs_1 = require("node:fs"); +const node_zlib_1 = require("node:zlib"); +const supports_color_1 = require("supports-color"); +const has_ansi_1 = __importDefault(require("has-ansi")); +const DEFAULT_CUCUMBER_PUBLISH_URL = 'https://reports.cucumber.io/api/reports'; +exports.publishPlugin = { + type: 'plugin', + coordinator: async ({ on, emit, logger, options, environment }) => { + if (!options) { + return undefined; + } + const { url = DEFAULT_CUCUMBER_PUBLISH_URL, token } = options; + const headers = { + Accept: 'application/json', + }; + if (token !== undefined) { + headers.Authorization = `Bearer ${token}`; + } + const touchResponse = await fetch(url, { headers }); + if (touchResponse.status >= 500) { + return () => { + logger.error(`Failed to publish report to ${new URL(url).origin} with status ${touchResponse.status}`); + logger.debug(touchResponse); + }; + } + const touchResult = (await touchResponse.json()); + if (!touchResponse.ok) { + return () => { + environment.stderr.write(sanitisePublishOutput(touchResult.banner, environment.stderr) + '\n'); + }; + } + if (touchResult.url) { + emit('publish:url', touchResult.url); + } + const uploadUrl = touchResponse.headers.get('Location'); + const tempDir = await (0, promises_2.mkdtemp)(node_path_1.default.join((0, node_os_1.tmpdir)(), `cucumber-js-publish-`)); + const tempFilePath = node_path_1.default.join(tempDir, 'envelopes.jsonl.gz'); + const writeStream = (0, node_zlib_1.createGzip)(); + const finishedWriting = (0, promises_1.pipeline)(writeStream, (0, node_fs_1.createWriteStream)(tempFilePath)); + on('message', (value) => writeStream.write(JSON.stringify(value) + '\n')); + return () => { + return new Promise((resolve) => { + writeStream.end(async () => { + await finishedWriting; + const stats = await (0, promises_2.stat)(tempFilePath); + const contentLength = stats.size.toString(); + logger.debug('Uploading envelopes to Cucumber Reports with content length:', contentLength); + const uploadResponse = await fetch(uploadUrl, { + method: 'PUT', + headers: { + 'Content-Type': 'application/jsonl', + 'Content-Encoding': 'gzip', + 'Content-Length': contentLength, + }, + body: (0, node_fs_1.createReadStream)(tempFilePath), + duplex: 'half', + }); + if (uploadResponse.ok) { + environment.stderr.write(sanitisePublishOutput(touchResult.banner, environment.stderr) + + '\n'); + } + else { + logger.error(`Failed to upload report to ${new URL(uploadUrl).origin} with status ${uploadResponse.status}`); + logger.debug(await uploadResponse.text()); + } + resolve(); + }); + }); + }; + }, +}; +/* +This is because the Cucumber Reports service returns a pre-formatted console message +including ANSI escapes, so if our stderr stream doesn't support those we need to +strip them back out. Ideally we should get structured data from the service and +compose the console message on this end. + */ +function sanitisePublishOutput(raw, stderr) { + if (!(0, supports_color_1.supportsColor)(stderr) && (0, has_ansi_1.default)(raw)) { + return (0, node_util_1.stripVTControlCharacters)(raw); + } + return raw; +} +//# sourceMappingURL=publish_plugin.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/publish/publish_plugin.js.map b/node_modules/@cucumber/cucumber/lib/publish/publish_plugin.js.map new file mode 100644 index 00000000..aaa1bf73 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/publish/publish_plugin.js.map @@ -0,0 +1 @@ +{"version":3,"file":"publish_plugin.js","sourceRoot":"","sources":["../../src/publish/publish_plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { Writable } from 'node:stream'\nimport { pipeline } from 'node:stream/promises'\nimport { stripVTControlCharacters } from 'node:util'\nimport { mkdtemp, stat } from 'node:fs/promises'\nimport path from 'node:path'\nimport { tmpdir } from 'node:os'\nimport { createReadStream, createWriteStream } from 'node:fs'\nimport { createGzip } from 'node:zlib'\nimport { supportsColor } from 'supports-color'\nimport hasAnsi from 'has-ansi'\nimport { InternalPlugin } from '../plugin'\n\ntype TouchResult = {\n banner: string\n url?: string\n}\n\nconst DEFAULT_CUCUMBER_PUBLISH_URL = 'https://reports.cucumber.io/api/reports'\n\nexport const publishPlugin: InternalPlugin = {\n type: 'plugin',\n coordinator: async ({ on, emit, logger, options, environment }) => {\n if (!options) {\n return undefined\n }\n const { url = DEFAULT_CUCUMBER_PUBLISH_URL, token } = options\n const headers: { [key: string]: string } = {\n Accept: 'application/json',\n }\n if (token !== undefined) {\n headers.Authorization = `Bearer ${token}`\n }\n const touchResponse = await fetch(url, { headers })\n\n if (touchResponse.status >= 500) {\n return () => {\n logger.error(\n `Failed to publish report to ${new URL(url).origin} with status ${\n touchResponse.status\n }`\n )\n logger.debug(touchResponse)\n }\n }\n\n const touchResult = (await touchResponse.json()) as TouchResult\n\n if (!touchResponse.ok) {\n return () => {\n environment.stderr.write(\n sanitisePublishOutput(touchResult.banner, environment.stderr) + '\\n'\n )\n }\n }\n\n if (touchResult.url) {\n emit('publish:url', touchResult.url)\n }\n\n const uploadUrl = touchResponse.headers.get('Location')\n const tempDir = await mkdtemp(path.join(tmpdir(), `cucumber-js-publish-`))\n const tempFilePath = path.join(tempDir, 'envelopes.jsonl.gz')\n const writeStream = createGzip()\n const finishedWriting = pipeline(\n writeStream,\n createWriteStream(tempFilePath)\n )\n on('message', (value) => writeStream.write(JSON.stringify(value) + '\\n'))\n\n return () => {\n return new Promise((resolve) => {\n writeStream.end(async () => {\n await finishedWriting\n const stats = await stat(tempFilePath)\n const contentLength = stats.size.toString()\n logger.debug(\n 'Uploading envelopes to Cucumber Reports with content length:',\n contentLength\n )\n const uploadResponse = await fetch(uploadUrl, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/jsonl',\n 'Content-Encoding': 'gzip',\n 'Content-Length': contentLength,\n },\n body: createReadStream(tempFilePath),\n duplex: 'half',\n })\n if (uploadResponse.ok) {\n environment.stderr.write(\n sanitisePublishOutput(touchResult.banner, environment.stderr) +\n '\\n'\n )\n } else {\n logger.error(\n `Failed to upload report to ${\n new URL(uploadUrl).origin\n } with status ${uploadResponse.status}`\n )\n logger.debug(await uploadResponse.text())\n }\n resolve()\n })\n })\n }\n },\n}\n\n/*\nThis is because the Cucumber Reports service returns a pre-formatted console message\nincluding ANSI escapes, so if our stderr stream doesn't support those we need to\nstrip them back out. Ideally we should get structured data from the service and\ncompose the console message on this end.\n */\nfunction sanitisePublishOutput(raw: string, stderr: Writable) {\n if (!supportsColor(stderr) && hasAnsi(raw)) {\n return stripVTControlCharacters(raw)\n }\n return raw\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/publish/types.d.ts b/node_modules/@cucumber/cucumber/lib/publish/types.d.ts new file mode 100644 index 00000000..3a7713b4 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/publish/types.d.ts @@ -0,0 +1,14 @@ +/** + * Options relating to publication to https://reports.cucumber.io + * @public + */ +export interface IPublishConfig { + /** + * Base URL for the Cucumber Reports service + */ + url: string; + /** + * Access token for the Cucumber Reports service + */ + token: string; +} diff --git a/node_modules/@cucumber/cucumber/lib/publish/types.js b/node_modules/@cucumber/cucumber/lib/publish/types.js new file mode 100644 index 00000000..11e638d1 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/publish/types.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/publish/types.js.map b/node_modules/@cucumber/cucumber/lib/publish/types.js.map new file mode 100644 index 00000000..625f0040 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/publish/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/publish/types.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Options relating to publication to https://reports.cucumber.io\n * @public\n */\nexport interface IPublishConfig {\n /**\n * Base URL for the Cucumber Reports service\n */\n url: string\n /**\n * Access token for the Cucumber Reports service\n */\n token: string\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/attachment_manager/index.d.ts b/node_modules/@cucumber/cucumber/lib/runtime/attachment_manager/index.d.ts new file mode 100644 index 00000000..ede67bf3 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/attachment_manager/index.d.ts @@ -0,0 +1,33 @@ +import { Readable } from 'node:stream'; +import * as messages from '@cucumber/messages'; +export interface IAttachmentMedia { + encoding: messages.AttachmentContentEncoding; + contentType: string; +} +export interface IAttachment { + data: string; + media: IAttachmentMedia; + fileName?: string; +} +export type IAttachFunction = (attachment: IAttachment) => void; +export interface ICreateAttachmentOptions { + mediaType: string; + fileName?: string; +} +export type ICreateStringAttachment = (data: string, mediaTypeOrOptions?: string | ICreateAttachmentOptions) => void; +export type ICreateBufferAttachment = (data: Buffer, mediaTypeOrOptions: string | ICreateAttachmentOptions) => void; +export type ICreateStreamAttachment = (data: Readable, mediaTypeOrOptions: string | ICreateAttachmentOptions) => Promise; +export type ICreateStreamAttachmentWithCallback = (data: Readable, mediaTypeOrOptions: string | ICreateAttachmentOptions, callback: () => void) => void; +export type ICreateAttachment = ICreateStringAttachment & ICreateBufferAttachment & ICreateStreamAttachment & ICreateStreamAttachmentWithCallback; +export type ICreateLog = (text: string) => void; +export type ICreateLink = (text: string) => void; +export default class AttachmentManager { + private readonly onAttachment; + constructor(onAttachment: IAttachFunction); + log(text: string): void | Promise; + link(...url: string[]): void | Promise; + create(data: Buffer | Readable | string, mediaTypeOrOptions?: string | ICreateAttachmentOptions, callback?: () => void): void | Promise; + createBufferAttachment(data: Buffer, mediaType: string, fileName?: string): void; + createStreamAttachment(data: Readable, mediaType: string, fileName?: string, callback?: () => void): void | Promise; + createStringAttachment(data: string, media: IAttachmentMedia, fileName?: string): void; +} diff --git a/node_modules/@cucumber/cucumber/lib/runtime/attachment_manager/index.js b/node_modules/@cucumber/cucumber/lib/runtime/attachment_manager/index.js new file mode 100644 index 00000000..3dcfe306 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/attachment_manager/index.js @@ -0,0 +1,133 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const is_stream_1 = __importDefault(require("is-stream")); +const messages = __importStar(require("@cucumber/messages")); +const value_checker_1 = require("../../value_checker"); +class AttachmentManager { + onAttachment; + constructor(onAttachment) { + this.onAttachment = onAttachment; + } + log(text) { + return this.create(text, 'text/x.cucumber.log+plain'); + } + link(...url) { + return this.create(url.join('\n'), 'text/uri-list'); + } + create(data, mediaTypeOrOptions, callback) { + const options = normaliseOptions(mediaTypeOrOptions); + if (Buffer.isBuffer(data)) { + if ((0, value_checker_1.doesNotHaveValue)(options.mediaType)) { + throw Error('Buffer attachments must specify a media type'); + } + this.createBufferAttachment(data, options.mediaType, options.fileName); + } + else if (is_stream_1.default.readable(data)) { + if ((0, value_checker_1.doesNotHaveValue)(options.mediaType)) { + throw Error('Stream attachments must specify a media type'); + } + return this.createStreamAttachment(data, options.mediaType, options.fileName, callback); + } + else if (typeof data === 'string') { + if ((0, value_checker_1.doesNotHaveValue)(options.mediaType)) { + options.mediaType = 'text/plain'; + } + if (options.mediaType.startsWith('base64:')) { + this.createStringAttachment(data, { + encoding: messages.AttachmentContentEncoding.BASE64, + contentType: options.mediaType.replace('base64:', ''), + }, options.fileName); + } + else { + this.createStringAttachment(data, { + encoding: messages.AttachmentContentEncoding.IDENTITY, + contentType: options.mediaType, + }, options.fileName); + } + } + else { + throw Error('Invalid attachment data: must be a buffer, readable stream, or string'); + } + } + createBufferAttachment(data, mediaType, fileName) { + this.createStringAttachment(data.toString('base64'), { + encoding: messages.AttachmentContentEncoding.BASE64, + contentType: mediaType, + }, fileName); + } + createStreamAttachment(data, mediaType, fileName, callback) { + const promise = new Promise((resolve, reject) => { + const buffers = []; + data.on('data', (chunk) => { + buffers.push(chunk); + }); + data.on('end', () => { + this.createBufferAttachment(Buffer.concat(buffers), mediaType, fileName); + resolve(); + }); + data.on('error', reject); + }); + if ((0, value_checker_1.doesHaveValue)(callback)) { + promise.then(callback, callback); + } + else { + return promise; + } + } + createStringAttachment(data, media, fileName) { + this.onAttachment({ + data, + media, + ...(fileName ? { fileName } : {}), + }); + } +} +exports.default = AttachmentManager; +function normaliseOptions(mediaTypeOrOptions) { + if (!mediaTypeOrOptions) { + return {}; + } + if (typeof mediaTypeOrOptions === 'string') { + return { + mediaType: mediaTypeOrOptions, + }; + } + return mediaTypeOrOptions; +} +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/attachment_manager/index.js.map b/node_modules/@cucumber/cucumber/lib/runtime/attachment_manager/index.js.map new file mode 100644 index 00000000..66af556f --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/attachment_manager/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/attachment_manager/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,0DAAgC;AAChC,6DAA8C;AAC9C,uDAAqE;AA2CrE,MAAqB,iBAAiB;IACnB,YAAY,CAAiB;IAE9C,YAAY,YAA6B;QACvC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;IAClC,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,2BAA2B,CAAC,CAAA;IACvD,CAAC;IAED,IAAI,CAAC,GAAG,GAAa;QACnB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC,CAAA;IACrD,CAAC;IAED,MAAM,CACJ,IAAgC,EAChC,kBAAsD,EACtD,QAAqB;QAErB,MAAM,OAAO,GAAG,gBAAgB,CAAC,kBAAkB,CAAC,CAAA;QACpD,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,IAAI,IAAA,gCAAgB,EAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBACxC,MAAM,KAAK,CAAC,8CAA8C,CAAC,CAAA;YAC7D,CAAC;YACD,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;QACxE,CAAC;aAAM,IAAI,mBAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,IAAI,IAAA,gCAAgB,EAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBACxC,MAAM,KAAK,CAAC,8CAA8C,CAAC,CAAA;YAC7D,CAAC;YACD,OAAO,IAAI,CAAC,sBAAsB,CAChC,IAAI,EACJ,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,QAAQ,EAChB,QAAQ,CACT,CAAA;QACH,CAAC;aAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACpC,IAAI,IAAA,gCAAgB,EAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBACxC,OAAO,CAAC,SAAS,GAAG,YAAY,CAAA;YAClC,CAAC;YACD,IAAI,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,sBAAsB,CACzB,IAAI,EACJ;oBACE,QAAQ,EAAE,QAAQ,CAAC,yBAAyB,CAAC,MAAM;oBACnD,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;iBACtD,EACD,OAAO,CAAC,QAAQ,CACjB,CAAA;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,sBAAsB,CACzB,IAAI,EACJ;oBACE,QAAQ,EAAE,QAAQ,CAAC,yBAAyB,CAAC,QAAQ;oBACrD,WAAW,EAAE,OAAO,CAAC,SAAS;iBAC/B,EACD,OAAO,CAAC,QAAQ,CACjB,CAAA;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,CACT,uEAAuE,CACxE,CAAA;QACH,CAAC;IACH,CAAC;IAED,sBAAsB,CACpB,IAAY,EACZ,SAAiB,EACjB,QAAiB;QAEjB,IAAI,CAAC,sBAAsB,CACzB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EACvB;YACE,QAAQ,EAAE,QAAQ,CAAC,yBAAyB,CAAC,MAAM;YACnD,WAAW,EAAE,SAAS;SACvB,EACD,QAAQ,CACT,CAAA;IACH,CAAC;IAED,sBAAsB,CACpB,IAAc,EACd,SAAiB,EACjB,QAAiB,EACjB,QAAqB;QAErB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACpD,MAAM,OAAO,GAAiB,EAAE,CAAA;YAChC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBACxB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACrB,CAAC,CAAC,CAAA;YACF,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBAClB,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAA;gBACxE,OAAO,EAAE,CAAA;YACX,CAAC,CAAC,CAAA;YACF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAC1B,CAAC,CAAC,CAAA;QACF,IAAI,IAAA,6BAAa,EAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;QAClC,CAAC;aAAM,CAAC;YACN,OAAO,OAAO,CAAA;QAChB,CAAC;IACH,CAAC;IAED,sBAAsB,CACpB,IAAY,EACZ,KAAuB,EACvB,QAAiB;QAEjB,IAAI,CAAC,YAAY,CAAC;YAChB,IAAI;YACJ,KAAK;YACL,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClC,CAAC,CAAA;IACJ,CAAC;CACF;AApHD,oCAoHC;AAED,SAAS,gBAAgB,CACvB,kBAAsD;IAEtD,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,OAAO,EAAE,CAAA;IACX,CAAC;IACD,IAAI,OAAO,kBAAkB,KAAK,QAAQ,EAAE,CAAC;QAC3C,OAAO;YACL,SAAS,EAAE,kBAAkB;SAC9B,CAAA;IACH,CAAC;IACD,OAAO,kBAAkB,CAAA;AAC3B,CAAC","sourcesContent":["import { Readable } from 'node:stream'\nimport isStream from 'is-stream'\nimport * as messages from '@cucumber/messages'\nimport { doesHaveValue, doesNotHaveValue } from '../../value_checker'\n\nexport interface IAttachmentMedia {\n encoding: messages.AttachmentContentEncoding\n contentType: string\n}\n\nexport interface IAttachment {\n data: string\n media: IAttachmentMedia\n fileName?: string\n}\n\nexport type IAttachFunction = (attachment: IAttachment) => void\n\nexport interface ICreateAttachmentOptions {\n mediaType: string\n fileName?: string\n}\nexport type ICreateStringAttachment = (\n data: string,\n mediaTypeOrOptions?: string | ICreateAttachmentOptions\n) => void\nexport type ICreateBufferAttachment = (\n data: Buffer,\n mediaTypeOrOptions: string | ICreateAttachmentOptions\n) => void\nexport type ICreateStreamAttachment = (\n data: Readable,\n mediaTypeOrOptions: string | ICreateAttachmentOptions\n) => Promise\nexport type ICreateStreamAttachmentWithCallback = (\n data: Readable,\n mediaTypeOrOptions: string | ICreateAttachmentOptions,\n callback: () => void\n) => void\nexport type ICreateAttachment = ICreateStringAttachment &\n ICreateBufferAttachment &\n ICreateStreamAttachment &\n ICreateStreamAttachmentWithCallback\nexport type ICreateLog = (text: string) => void\nexport type ICreateLink = (text: string) => void\n\nexport default class AttachmentManager {\n private readonly onAttachment: IAttachFunction\n\n constructor(onAttachment: IAttachFunction) {\n this.onAttachment = onAttachment\n }\n\n log(text: string): void | Promise {\n return this.create(text, 'text/x.cucumber.log+plain')\n }\n\n link(...url: string[]): void | Promise {\n return this.create(url.join('\\n'), 'text/uri-list')\n }\n\n create(\n data: Buffer | Readable | string,\n mediaTypeOrOptions?: string | ICreateAttachmentOptions,\n callback?: () => void\n ): void | Promise {\n const options = normaliseOptions(mediaTypeOrOptions)\n if (Buffer.isBuffer(data)) {\n if (doesNotHaveValue(options.mediaType)) {\n throw Error('Buffer attachments must specify a media type')\n }\n this.createBufferAttachment(data, options.mediaType, options.fileName)\n } else if (isStream.readable(data)) {\n if (doesNotHaveValue(options.mediaType)) {\n throw Error('Stream attachments must specify a media type')\n }\n return this.createStreamAttachment(\n data,\n options.mediaType,\n options.fileName,\n callback\n )\n } else if (typeof data === 'string') {\n if (doesNotHaveValue(options.mediaType)) {\n options.mediaType = 'text/plain'\n }\n if (options.mediaType.startsWith('base64:')) {\n this.createStringAttachment(\n data,\n {\n encoding: messages.AttachmentContentEncoding.BASE64,\n contentType: options.mediaType.replace('base64:', ''),\n },\n options.fileName\n )\n } else {\n this.createStringAttachment(\n data,\n {\n encoding: messages.AttachmentContentEncoding.IDENTITY,\n contentType: options.mediaType,\n },\n options.fileName\n )\n }\n } else {\n throw Error(\n 'Invalid attachment data: must be a buffer, readable stream, or string'\n )\n }\n }\n\n createBufferAttachment(\n data: Buffer,\n mediaType: string,\n fileName?: string\n ): void {\n this.createStringAttachment(\n data.toString('base64'),\n {\n encoding: messages.AttachmentContentEncoding.BASE64,\n contentType: mediaType,\n },\n fileName\n )\n }\n\n createStreamAttachment(\n data: Readable,\n mediaType: string,\n fileName?: string,\n callback?: () => void\n ): void | Promise {\n const promise = new Promise((resolve, reject) => {\n const buffers: Uint8Array[] = []\n data.on('data', (chunk) => {\n buffers.push(chunk)\n })\n data.on('end', () => {\n this.createBufferAttachment(Buffer.concat(buffers), mediaType, fileName)\n resolve()\n })\n data.on('error', reject)\n })\n if (doesHaveValue(callback)) {\n promise.then(callback, callback)\n } else {\n return promise\n }\n }\n\n createStringAttachment(\n data: string,\n media: IAttachmentMedia,\n fileName?: string\n ): void {\n this.onAttachment({\n data,\n media,\n ...(fileName ? { fileName } : {}),\n })\n }\n}\n\nfunction normaliseOptions(\n mediaTypeOrOptions?: string | ICreateAttachmentOptions\n): Partial {\n if (!mediaTypeOrOptions) {\n return {}\n }\n if (typeof mediaTypeOrOptions === 'string') {\n return {\n mediaType: mediaTypeOrOptions,\n }\n }\n return mediaTypeOrOptions\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/coordinator.d.ts b/node_modules/@cucumber/cucumber/lib/runtime/coordinator.d.ts new file mode 100644 index 00000000..afb18fc6 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/coordinator.d.ts @@ -0,0 +1,16 @@ +import { EventEmitter } from 'node:events'; +import { IdGenerator } from '@cucumber/messages'; +import { SourcedPickle } from '../assemble'; +import { SupportCodeLibrary } from '../support_code_library_builder/types'; +import { RuntimeAdapter } from './types'; +import { Runtime } from './index'; +export declare class Coordinator implements Runtime { + private testRunStartedId; + private eventBroadcaster; + private newId; + private sourcedPickles; + private supportCodeLibrary; + private adapter; + constructor(testRunStartedId: string, eventBroadcaster: EventEmitter, newId: IdGenerator.NewId, sourcedPickles: ReadonlyArray, supportCodeLibrary: SupportCodeLibrary, adapter: RuntimeAdapter); + run(): Promise; +} diff --git a/node_modules/@cucumber/cucumber/lib/runtime/coordinator.js b/node_modules/@cucumber/cucumber/lib/runtime/coordinator.js new file mode 100644 index 00000000..ad3fb595 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/coordinator.js @@ -0,0 +1,41 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Coordinator = void 0; +const assemble_1 = require("../assemble"); +const stopwatch_1 = require("./stopwatch"); +class Coordinator { + testRunStartedId; + eventBroadcaster; + newId; + sourcedPickles; + supportCodeLibrary; + adapter; + constructor(testRunStartedId, eventBroadcaster, newId, sourcedPickles, supportCodeLibrary, adapter) { + this.testRunStartedId = testRunStartedId; + this.eventBroadcaster = eventBroadcaster; + this.newId = newId; + this.sourcedPickles = sourcedPickles; + this.supportCodeLibrary = supportCodeLibrary; + this.adapter = adapter; + } + async run() { + this.eventBroadcaster.emit('envelope', { + testRunStarted: { + id: this.testRunStartedId, + timestamp: (0, stopwatch_1.timestamp)(), + }, + }); + const assembledTestCases = await (0, assemble_1.assembleTestCases)(this.testRunStartedId, this.eventBroadcaster, this.newId, this.sourcedPickles, this.supportCodeLibrary); + const success = await this.adapter.run(assembledTestCases); + this.eventBroadcaster.emit('envelope', { + testRunFinished: { + testRunStartedId: this.testRunStartedId, + timestamp: (0, stopwatch_1.timestamp)(), + success, + }, + }); + return success; + } +} +exports.Coordinator = Coordinator; +//# sourceMappingURL=coordinator.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/coordinator.js.map b/node_modules/@cucumber/cucumber/lib/runtime/coordinator.js.map new file mode 100644 index 00000000..e26d6d70 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/coordinator.js.map @@ -0,0 +1 @@ +{"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../src/runtime/coordinator.ts"],"names":[],"mappings":";;;AAEA,0CAA8D;AAG9D,2CAAuC;AAGvC,MAAa,WAAW;IAEZ;IACA;IACA;IACA;IACA;IACA;IANV,YACU,gBAAwB,EACxB,gBAA8B,EAC9B,KAAwB,EACxB,cAA4C,EAC5C,kBAAsC,EACtC,OAAuB;QALvB,qBAAgB,GAAhB,gBAAgB,CAAQ;QACxB,qBAAgB,GAAhB,gBAAgB,CAAc;QAC9B,UAAK,GAAL,KAAK,CAAmB;QACxB,mBAAc,GAAd,cAAc,CAA8B;QAC5C,uBAAkB,GAAlB,kBAAkB,CAAoB;QACtC,YAAO,GAAP,OAAO,CAAgB;IAC9B,CAAC;IAEJ,KAAK,CAAC,GAAG;QACP,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE;YACrC,cAAc,EAAE;gBACd,EAAE,EAAE,IAAI,CAAC,gBAAgB;gBACzB,SAAS,EAAE,IAAA,qBAAS,GAAE;aACvB;SACiB,CAAC,CAAA;QAErB,MAAM,kBAAkB,GAAG,MAAM,IAAA,4BAAiB,EAChD,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,kBAAkB,CACxB,CAAA;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;QAE1D,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE;YACrC,eAAe,EAAE;gBACf,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;gBACvC,SAAS,EAAE,IAAA,qBAAS,GAAE;gBACtB,OAAO;aACR;SACiB,CAAC,CAAA;QAErB,OAAO,OAAO,CAAA;IAChB,CAAC;CACF;AAtCD,kCAsCC","sourcesContent":["import { EventEmitter } from 'node:events'\nimport { Envelope, IdGenerator } from '@cucumber/messages'\nimport { assembleTestCases, SourcedPickle } from '../assemble'\nimport { SupportCodeLibrary } from '../support_code_library_builder/types'\nimport { RuntimeAdapter } from './types'\nimport { timestamp } from './stopwatch'\nimport { Runtime } from './index'\n\nexport class Coordinator implements Runtime {\n constructor(\n private testRunStartedId: string,\n private eventBroadcaster: EventEmitter,\n private newId: IdGenerator.NewId,\n private sourcedPickles: ReadonlyArray,\n private supportCodeLibrary: SupportCodeLibrary,\n private adapter: RuntimeAdapter\n ) {}\n\n async run(): Promise {\n this.eventBroadcaster.emit('envelope', {\n testRunStarted: {\n id: this.testRunStartedId,\n timestamp: timestamp(),\n },\n } satisfies Envelope)\n\n const assembledTestCases = await assembleTestCases(\n this.testRunStartedId,\n this.eventBroadcaster,\n this.newId,\n this.sourcedPickles,\n this.supportCodeLibrary\n )\n\n const success = await this.adapter.run(assembledTestCases)\n\n this.eventBroadcaster.emit('envelope', {\n testRunFinished: {\n testRunStartedId: this.testRunStartedId,\n timestamp: timestamp(),\n success,\n },\n } satisfies Envelope)\n\n return success\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/format_error.d.ts b/node_modules/@cucumber/cucumber/lib/runtime/format_error.d.ts new file mode 100644 index 00000000..815c7894 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/format_error.d.ts @@ -0,0 +1,2 @@ +import { TestStepResult } from '@cucumber/messages'; +export declare function formatError(error: Error | string, filterStackTraces: boolean): Pick; diff --git a/node_modules/@cucumber/cucumber/lib/runtime/format_error.js b/node_modules/@cucumber/cucumber/lib/runtime/format_error.js new file mode 100644 index 00000000..b52aa092 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/format_error.js @@ -0,0 +1,51 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.formatError = formatError; +const assertion_error_formatter_1 = require("assertion-error-formatter"); +const error_stack_parser_1 = __importDefault(require("error-stack-parser")); +const filter_stack_trace_1 = require("../filter_stack_trace"); +function formatError(error, filterStackTraces) { + if (typeof error === 'string') { + const stackTrace = `Error: ${error}`; + return { + message: stackTrace, + exception: { + type: 'Error', + message: error, + stackTrace, + }, + }; + } + let processedStackTrace = error.stack; + try { + const parsedStack = error_stack_parser_1.default.parse(error); + const filteredStack = filterStackTraces + ? (0, filter_stack_trace_1.filterStackTrace)(parsedStack) + : parsedStack; + processedStackTrace = filteredStack.map((f) => f.source).join('\n'); + } + catch { + // if we weren't able to parse and process, we'll settle for the original + } + const stackTrace = (0, assertion_error_formatter_1.format)(error, { + colorFns: { + errorStack: (stack) => { + return processedStackTrace ? `\n${processedStackTrace}` : stack; + }, + }, + }); + const type = error.constructor.name; + const message = typeof error === 'string' ? error : error.message; + return { + message: stackTrace, + exception: { + type, + message, + stackTrace, + }, + }; +} +//# sourceMappingURL=format_error.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/format_error.js.map b/node_modules/@cucumber/cucumber/lib/runtime/format_error.js.map new file mode 100644 index 00000000..40d526e9 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/format_error.js.map @@ -0,0 +1 @@ +{"version":3,"file":"format_error.js","sourceRoot":"","sources":["../../src/runtime/format_error.ts"],"names":[],"mappings":";;;;;AAKA,kCA0CC;AA9CD,yEAAkD;AAClD,4EAAiD;AACjD,8DAAwD;AAExD,SAAgB,WAAW,CACzB,KAAqB,EACrB,iBAA0B;IAE1B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAG,UAAU,KAAK,EAAE,CAAA;QACpC,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,SAAS,EAAE;gBACT,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,KAAK;gBACd,UAAU;aACX;SACF,CAAA;IACH,CAAC;IACD,IAAI,mBAAmB,GAAW,KAAK,CAAC,KAAK,CAAA;IAC7C,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,4BAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACjD,MAAM,aAAa,GAAG,iBAAiB;YACrC,CAAC,CAAC,IAAA,qCAAgB,EAAC,WAAW,CAAC;YAC/B,CAAC,CAAC,WAAW,CAAA;QACf,mBAAmB,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;IAC3E,CAAC;IACD,MAAM,UAAU,GAAG,IAAA,kCAAM,EAAC,KAAK,EAAE;QAC/B,QAAQ,EAAE;YACR,UAAU,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC5B,OAAO,mBAAmB,CAAC,CAAC,CAAC,KAAK,mBAAmB,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;YACjE,CAAC;SACF;KACF,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAA;IACnC,MAAM,OAAO,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAA;IACjE,OAAO;QACL,OAAO,EAAE,UAAU;QACnB,SAAS,EAAE;YACT,IAAI;YACJ,OAAO;YACP,UAAU;SACX;KACF,CAAA;AACH,CAAC","sourcesContent":["import { TestStepResult } from '@cucumber/messages'\nimport { format } from 'assertion-error-formatter'\nimport errorStackParser from 'error-stack-parser'\nimport { filterStackTrace } from '../filter_stack_trace'\n\nexport function formatError(\n error: Error | string,\n filterStackTraces: boolean\n): Pick {\n if (typeof error === 'string') {\n const stackTrace = `Error: ${error}`\n return {\n message: stackTrace,\n exception: {\n type: 'Error',\n message: error,\n stackTrace,\n },\n }\n }\n let processedStackTrace: string = error.stack\n try {\n const parsedStack = errorStackParser.parse(error)\n const filteredStack = filterStackTraces\n ? filterStackTrace(parsedStack)\n : parsedStack\n processedStackTrace = filteredStack.map((f) => f.source).join('\\n')\n } catch {\n // if we weren't able to parse and process, we'll settle for the original\n }\n const stackTrace = format(error, {\n colorFns: {\n errorStack: (stack: string) => {\n return processedStackTrace ? `\\n${processedStackTrace}` : stack\n },\n },\n })\n const type = error.constructor.name\n const message = typeof error === 'string' ? error : error.message\n return {\n message: stackTrace,\n exception: {\n type,\n message,\n stackTrace,\n },\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/helpers.d.ts b/node_modules/@cucumber/cucumber/lib/runtime/helpers.d.ts new file mode 100644 index 00000000..b24212f1 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/helpers.d.ts @@ -0,0 +1,6 @@ +import * as messages from '@cucumber/messages'; +import StepDefinition from '../models/step_definition'; +import { RuntimeOptions } from '.'; +export declare function getAmbiguousStepException(stepDefinitions: StepDefinition[]): string; +export declare function retriesForPickle(pickle: messages.Pickle, options: RuntimeOptions): number; +export declare function shouldCauseFailure(status: messages.TestStepResultStatus, options: RuntimeOptions): boolean; diff --git a/node_modules/@cucumber/cucumber/lib/runtime/helpers.js b/node_modules/@cucumber/cucumber/lib/runtime/helpers.js new file mode 100644 index 00000000..b1e5810e --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/helpers.js @@ -0,0 +1,110 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getAmbiguousStepException = getAmbiguousStepException; +exports.retriesForPickle = retriesForPickle; +exports.shouldCauseFailure = shouldCauseFailure; +const cli_table3_1 = __importDefault(require("cli-table3")); +const indent_string_1 = __importDefault(require("indent-string")); +const messages = __importStar(require("@cucumber/messages")); +const location_helpers_1 = require("../formatter/helpers/location_helpers"); +const pickle_filter_1 = require("../pickle_filter"); +function getAmbiguousStepException(stepDefinitions) { + const table = new cli_table3_1.default({ + chars: { + bottom: '', + 'bottom-left': '', + 'bottom-mid': '', + 'bottom-right': '', + left: '', + 'left-mid': '', + mid: '', + 'mid-mid': '', + middle: ' - ', + right: '', + 'right-mid': '', + top: '', + 'top-left': '', + 'top-mid': '', + 'top-right': '', + }, + style: { + border: [], + 'padding-left': 0, + 'padding-right': 0, + }, + }); + table.push(...stepDefinitions.map((stepDefinition) => { + const pattern = stepDefinition.pattern.toString(); + return [pattern, (0, location_helpers_1.formatLocation)(stepDefinition)]; + })); + return `${'Multiple step definitions match:' + '\n'}${(0, indent_string_1.default)(table.toString(), 2)}`; +} +function retriesForPickle(pickle, options) { + if (!options.retry) { + return 0; + } + const retries = options.retry; + if (retries === 0) { + return 0; + } + const retryTagFilter = options.retryTagFilter; + if (!retryTagFilter) { + return retries; + } + const pickleTagFilter = new pickle_filter_1.PickleTagFilter(retryTagFilter); + if (pickleTagFilter.matchesAllTagExpressions(pickle)) { + return retries; + } + return 0; +} +function shouldCauseFailure(status, options) { + if (options.dryRun) { + return false; + } + const failureStatuses = [ + messages.TestStepResultStatus.AMBIGUOUS, + messages.TestStepResultStatus.FAILED, + messages.TestStepResultStatus.UNDEFINED, + ]; + if (options.strict) { + failureStatuses.push(messages.TestStepResultStatus.PENDING); + } + return failureStatuses.includes(status); +} +//# sourceMappingURL=helpers.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/helpers.js.map b/node_modules/@cucumber/cucumber/lib/runtime/helpers.js.map new file mode 100644 index 00000000..f198afc4 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/helpers.js.map @@ -0,0 +1 @@ +{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/runtime/helpers.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,8DAqCC;AAED,4CAoBC;AAED,gDAgBC;AArFD,4DAA8B;AAC9B,kEAAwC;AACxC,6DAA8C;AAC9C,4EAAsE;AACtE,oDAAkD;AAIlD,SAAgB,yBAAyB,CACvC,eAAiC;IAEjC,MAAM,KAAK,GAAG,IAAI,oBAAK,CAAC;QACtB,KAAK,EAAE;YACL,MAAM,EAAE,EAAE;YACV,aAAa,EAAE,EAAE;YACjB,YAAY,EAAE,EAAE;YAChB,cAAc,EAAE,EAAE;YAClB,IAAI,EAAE,EAAE;YACR,UAAU,EAAE,EAAE;YACd,GAAG,EAAE,EAAE;YACP,SAAS,EAAE,EAAE;YACb,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,EAAE;YACT,WAAW,EAAE,EAAE;YACf,GAAG,EAAE,EAAE;YACP,UAAU,EAAE,EAAE;YACd,SAAS,EAAE,EAAE;YACb,WAAW,EAAE,EAAE;SAChB;QACD,KAAK,EAAE;YACL,MAAM,EAAE,EAAE;YACV,cAAc,EAAE,CAAC;YACjB,eAAe,EAAE,CAAC;SACnB;KACF,CAAC,CAAA;IACF,KAAK,CAAC,IAAI,CACR,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,EAAE;QACxC,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAA;QACjD,OAAO,CAAC,OAAO,EAAE,IAAA,iCAAc,EAAC,cAAc,CAAC,CAAC,CAAA;IAClD,CAAC,CAAC,CACH,CAAA;IACD,OAAO,GAAG,kCAAkC,GAAG,IAAI,GAAG,IAAA,uBAAY,EAChE,KAAK,CAAC,QAAQ,EAAE,EAChB,CAAC,CACF,EAAE,CAAA;AACL,CAAC;AAED,SAAgB,gBAAgB,CAC9B,MAAuB,EACvB,OAAuB;IAEvB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,CAAC,CAAA;IACV,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAA;IAC7B,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QAClB,OAAO,CAAC,CAAA;IACV,CAAC;IACD,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,CAAA;IAC7C,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,OAAO,CAAA;IAChB,CAAC;IACD,MAAM,eAAe,GAAG,IAAI,+BAAe,CAAC,cAAc,CAAC,CAAA;IAC3D,IAAI,eAAe,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,OAAO,OAAO,CAAA;IAChB,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAED,SAAgB,kBAAkB,CAChC,MAAqC,EACrC,OAAuB;IAEvB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,KAAK,CAAA;IACd,CAAC;IACD,MAAM,eAAe,GAAoC;QACvD,QAAQ,CAAC,oBAAoB,CAAC,SAAS;QACvC,QAAQ,CAAC,oBAAoB,CAAC,MAAM;QACpC,QAAQ,CAAC,oBAAoB,CAAC,SAAS;KACxC,CAAA;IACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAA;IAC7D,CAAC;IACD,OAAO,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;AACzC,CAAC","sourcesContent":["import Table from 'cli-table3'\nimport indentString from 'indent-string'\nimport * as messages from '@cucumber/messages'\nimport { formatLocation } from '../formatter/helpers/location_helpers'\nimport { PickleTagFilter } from '../pickle_filter'\nimport StepDefinition from '../models/step_definition'\nimport { RuntimeOptions } from '.'\n\nexport function getAmbiguousStepException(\n stepDefinitions: StepDefinition[]\n): string {\n const table = new Table({\n chars: {\n bottom: '',\n 'bottom-left': '',\n 'bottom-mid': '',\n 'bottom-right': '',\n left: '',\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n middle: ' - ',\n right: '',\n 'right-mid': '',\n top: '',\n 'top-left': '',\n 'top-mid': '',\n 'top-right': '',\n },\n style: {\n border: [],\n 'padding-left': 0,\n 'padding-right': 0,\n },\n })\n table.push(\n ...stepDefinitions.map((stepDefinition) => {\n const pattern = stepDefinition.pattern.toString()\n return [pattern, formatLocation(stepDefinition)]\n })\n )\n return `${'Multiple step definitions match:' + '\\n'}${indentString(\n table.toString(),\n 2\n )}`\n}\n\nexport function retriesForPickle(\n pickle: messages.Pickle,\n options: RuntimeOptions\n): number {\n if (!options.retry) {\n return 0\n }\n const retries = options.retry\n if (retries === 0) {\n return 0\n }\n const retryTagFilter = options.retryTagFilter\n if (!retryTagFilter) {\n return retries\n }\n const pickleTagFilter = new PickleTagFilter(retryTagFilter)\n if (pickleTagFilter.matchesAllTagExpressions(pickle)) {\n return retries\n }\n return 0\n}\n\nexport function shouldCauseFailure(\n status: messages.TestStepResultStatus,\n options: RuntimeOptions\n): boolean {\n if (options.dryRun) {\n return false\n }\n const failureStatuses: messages.TestStepResultStatus[] = [\n messages.TestStepResultStatus.AMBIGUOUS,\n messages.TestStepResultStatus.FAILED,\n messages.TestStepResultStatus.UNDEFINED,\n ]\n if (options.strict) {\n failureStatuses.push(messages.TestStepResultStatus.PENDING)\n }\n return failureStatuses.includes(status)\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/index.d.ts b/node_modules/@cucumber/cucumber/lib/runtime/index.d.ts new file mode 100644 index 00000000..fd9a4675 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/index.d.ts @@ -0,0 +1,2 @@ +export * from './make_runtime'; +export { Runtime, RuntimeOptions } from './types'; diff --git a/node_modules/@cucumber/cucumber/lib/runtime/index.js b/node_modules/@cucumber/cucumber/lib/runtime/index.js new file mode 100644 index 00000000..97ac4590 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/index.js @@ -0,0 +1,18 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +__exportStar(require("./make_runtime"), exports); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/index.js.map b/node_modules/@cucumber/cucumber/lib/runtime/index.js.map new file mode 100644 index 00000000..4a9e5324 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA8B","sourcesContent":["export * from './make_runtime'\nexport { Runtime, RuntimeOptions } from './types'\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/make_runtime.d.ts b/node_modules/@cucumber/cucumber/lib/runtime/make_runtime.d.ts new file mode 100644 index 00000000..56bf3eb9 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/make_runtime.d.ts @@ -0,0 +1,18 @@ +import { EventEmitter } from 'node:events'; +import { IdGenerator } from '@cucumber/messages'; +import { IRunOptionsRuntime } from '../api'; +import { ILogger, IRunEnvironment } from '../environment'; +import { SourcedPickle } from '../assemble'; +import { SupportCodeLibrary } from '../support_code_library_builder/types'; +import { FormatOptions } from '../formatter'; +import { Runtime } from './types'; +export declare function makeRuntime({ environment, logger, eventBroadcaster, sourcedPickles, newId, supportCodeLibrary, options, snippetOptions, }: { + environment: IRunEnvironment; + logger: ILogger; + eventBroadcaster: EventEmitter; + newId: IdGenerator.NewId; + sourcedPickles: ReadonlyArray; + supportCodeLibrary: SupportCodeLibrary; + options: IRunOptionsRuntime; + snippetOptions: Pick; +}): Promise; diff --git a/node_modules/@cucumber/cucumber/lib/runtime/make_runtime.js b/node_modules/@cucumber/cucumber/lib/runtime/make_runtime.js new file mode 100644 index 00000000..53bee0fd --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/make_runtime.js @@ -0,0 +1,28 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.makeRuntime = makeRuntime; +const builder_1 = __importDefault(require("../formatter/builder")); +const adapter_1 = require("./parallel/adapter"); +const adapter_2 = require("./serial/adapter"); +const coordinator_1 = require("./coordinator"); +async function makeRuntime({ environment, logger, eventBroadcaster, sourcedPickles, newId, supportCodeLibrary, options, snippetOptions, }) { + const testRunStartedId = newId(); + const adapter = await makeAdapter(options, snippetOptions, testRunStartedId, environment, logger, eventBroadcaster, supportCodeLibrary, newId); + return new coordinator_1.Coordinator(testRunStartedId, eventBroadcaster, newId, sourcedPickles, supportCodeLibrary, adapter); +} +async function makeAdapter(options, snippetOptions, testRunStartedId, environment, logger, eventBroadcaster, supportCodeLibrary, newId) { + if (options.parallel > 0) { + return new adapter_1.ChildProcessAdapter(testRunStartedId, environment, logger, eventBroadcaster, options, snippetOptions, supportCodeLibrary); + } + const snippetBuilder = await builder_1.default.getStepDefinitionSnippetBuilder({ + cwd: environment.cwd, + snippetInterface: snippetOptions.snippetInterface, + snippetSyntax: snippetOptions.snippetSyntax, + supportCodeLibrary, + }); + return new adapter_2.InProcessAdapter(testRunStartedId, eventBroadcaster, newId, options, supportCodeLibrary, snippetBuilder); +} +//# sourceMappingURL=make_runtime.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/make_runtime.js.map b/node_modules/@cucumber/cucumber/lib/runtime/make_runtime.js.map new file mode 100644 index 00000000..f1144038 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/make_runtime.js.map @@ -0,0 +1 @@ +{"version":3,"file":"make_runtime.js","sourceRoot":"","sources":["../../src/runtime/make_runtime.ts"],"names":[],"mappings":";;;;;AAaA,kCAsCC;AA7CD,mEAAmD;AAGnD,gDAAwD;AACxD,8CAAmD;AACnD,+CAA2C;AAEpC,KAAK,UAAU,WAAW,CAAC,EAChC,WAAW,EACX,MAAM,EACN,gBAAgB,EAChB,cAAc,EACd,KAAK,EACL,kBAAkB,EAClB,OAAO,EACP,cAAc,GAUf;IACC,MAAM,gBAAgB,GAAG,KAAK,EAAE,CAAA;IAChC,MAAM,OAAO,GAAG,MAAM,WAAW,CAC/B,OAAO,EACP,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,MAAM,EACN,gBAAgB,EAChB,kBAAkB,EAClB,KAAK,CACN,CAAA;IACD,OAAO,IAAI,yBAAW,CACpB,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,EACL,cAAc,EACd,kBAAkB,EAClB,OAAO,CACR,CAAA;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,OAA2B,EAC3B,cAAyE,EACzE,gBAAwB,EACxB,WAA4B,EAC5B,MAAe,EACf,gBAA8B,EAC9B,kBAAsC,EACtC,KAAmB;IAEnB,IAAI,OAAO,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,6BAAmB,CAC5B,gBAAgB,EAChB,WAAW,EACX,MAAM,EACN,gBAAgB,EAChB,OAAO,EACP,cAAc,EACd,kBAAkB,CACnB,CAAA;IACH,CAAC;IACD,MAAM,cAAc,GAAG,MAAM,iBAAgB,CAAC,+BAA+B,CAC3E;QACE,GAAG,EAAE,WAAW,CAAC,GAAG;QACpB,gBAAgB,EAAE,cAAc,CAAC,gBAAgB;QACjD,aAAa,EAAE,cAAc,CAAC,aAAa;QAC3C,kBAAkB;KACnB,CACF,CAAA;IACD,OAAO,IAAI,0BAAgB,CACzB,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,EACL,OAAO,EACP,kBAAkB,EAClB,cAAc,CACf,CAAA;AACH,CAAC","sourcesContent":["import { EventEmitter } from 'node:events'\nimport { IdGenerator } from '@cucumber/messages'\nimport { IRunOptionsRuntime } from '../api'\nimport { ILogger, IRunEnvironment } from '../environment'\nimport { SourcedPickle } from '../assemble'\nimport { SupportCodeLibrary } from '../support_code_library_builder/types'\nimport FormatterBuilder from '../formatter/builder'\nimport { FormatOptions } from '../formatter'\nimport { Runtime } from './types'\nimport { ChildProcessAdapter } from './parallel/adapter'\nimport { InProcessAdapter } from './serial/adapter'\nimport { Coordinator } from './coordinator'\n\nexport async function makeRuntime({\n environment,\n logger,\n eventBroadcaster,\n sourcedPickles,\n newId,\n supportCodeLibrary,\n options,\n snippetOptions,\n}: {\n environment: IRunEnvironment\n logger: ILogger\n eventBroadcaster: EventEmitter\n newId: IdGenerator.NewId\n sourcedPickles: ReadonlyArray\n supportCodeLibrary: SupportCodeLibrary\n options: IRunOptionsRuntime\n snippetOptions: Pick\n}): Promise {\n const testRunStartedId = newId()\n const adapter = await makeAdapter(\n options,\n snippetOptions,\n testRunStartedId,\n environment,\n logger,\n eventBroadcaster,\n supportCodeLibrary,\n newId\n )\n return new Coordinator(\n testRunStartedId,\n eventBroadcaster,\n newId,\n sourcedPickles,\n supportCodeLibrary,\n adapter\n )\n}\n\nasync function makeAdapter(\n options: IRunOptionsRuntime,\n snippetOptions: Pick,\n testRunStartedId: string,\n environment: IRunEnvironment,\n logger: ILogger,\n eventBroadcaster: EventEmitter,\n supportCodeLibrary: SupportCodeLibrary,\n newId: () => string\n) {\n if (options.parallel > 0) {\n return new ChildProcessAdapter(\n testRunStartedId,\n environment,\n logger,\n eventBroadcaster,\n options,\n snippetOptions,\n supportCodeLibrary\n )\n }\n const snippetBuilder = await FormatterBuilder.getStepDefinitionSnippetBuilder(\n {\n cwd: environment.cwd,\n snippetInterface: snippetOptions.snippetInterface,\n snippetSyntax: snippetOptions.snippetSyntax,\n supportCodeLibrary,\n }\n )\n return new InProcessAdapter(\n testRunStartedId,\n eventBroadcaster,\n newId,\n options,\n supportCodeLibrary,\n snippetBuilder\n )\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/make_suggestion.d.ts b/node_modules/@cucumber/cucumber/lib/runtime/make_suggestion.d.ts new file mode 100644 index 00000000..2bae0f2f --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/make_suggestion.d.ts @@ -0,0 +1,7 @@ +import { IdGenerator, PickleStep, Suggestion } from '@cucumber/messages'; +import StepDefinitionSnippetBuilder from '../formatter/step_definition_snippet_builder'; +export declare function makeSuggestion({ newId, snippetBuilder, pickleStep, }: { + newId: IdGenerator.NewId; + snippetBuilder: StepDefinitionSnippetBuilder; + pickleStep: PickleStep; +}): Suggestion; diff --git a/node_modules/@cucumber/cucumber/lib/runtime/make_suggestion.js b/node_modules/@cucumber/cucumber/lib/runtime/make_suggestion.js new file mode 100644 index 00000000..0d00fda6 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/make_suggestion.js @@ -0,0 +1,31 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.makeSuggestion = makeSuggestion; +const messages_1 = require("@cucumber/messages"); +const helpers_1 = require("../formatter/helpers"); +function mapPickleStepTypeToKeywordType(type) { + switch (type) { + case messages_1.PickleStepType.CONTEXT: + return helpers_1.KeywordType.Precondition; + case messages_1.PickleStepType.ACTION: + return helpers_1.KeywordType.Event; + case messages_1.PickleStepType.OUTCOME: + return helpers_1.KeywordType.Outcome; + default: + return helpers_1.KeywordType.Precondition; + } +} +function makeSuggestion({ newId, snippetBuilder, pickleStep, }) { + const keywordType = mapPickleStepTypeToKeywordType(pickleStep.type); + const codes = snippetBuilder.buildMultiple({ keywordType, pickleStep }); + const snippets = codes.map((code) => ({ + code, + language: 'javascript', + })); + return { + id: newId(), + pickleStepId: pickleStep.id, + snippets, + }; +} +//# sourceMappingURL=make_suggestion.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/make_suggestion.js.map b/node_modules/@cucumber/cucumber/lib/runtime/make_suggestion.js.map new file mode 100644 index 00000000..66f40528 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/make_suggestion.js.map @@ -0,0 +1 @@ +{"version":3,"file":"make_suggestion.js","sourceRoot":"","sources":["../../src/runtime/make_suggestion.ts"],"names":[],"mappings":";;AAsBA,wCAqBC;AA3CD,iDAK2B;AAE3B,kDAAkD;AAElD,SAAS,8BAA8B,CAAC,IAAqB;IAC3D,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,yBAAc,CAAC,OAAO;YACzB,OAAO,qBAAW,CAAC,YAAY,CAAA;QACjC,KAAK,yBAAc,CAAC,MAAM;YACxB,OAAO,qBAAW,CAAC,KAAK,CAAA;QAC1B,KAAK,yBAAc,CAAC,OAAO;YACzB,OAAO,qBAAW,CAAC,OAAO,CAAA;QAC5B;YACE,OAAO,qBAAW,CAAC,YAAY,CAAA;IACnC,CAAC;AACH,CAAC;AAED,SAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,cAAc,EACd,UAAU,GAKX;IACC,MAAM,WAAW,GAAG,8BAA8B,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IACnE,MAAM,KAAK,GAAG,cAAc,CAAC,aAAa,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAA;IACvE,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACpC,IAAI;QACJ,QAAQ,EAAE,YAAY;KACvB,CAAC,CAAC,CAAA;IAEH,OAAO;QACL,EAAE,EAAE,KAAK,EAAE;QACX,YAAY,EAAE,UAAU,CAAC,EAAE;QAC3B,QAAQ;KACT,CAAA;AACH,CAAC","sourcesContent":["import {\n IdGenerator,\n PickleStep,\n PickleStepType,\n Suggestion,\n} from '@cucumber/messages'\nimport StepDefinitionSnippetBuilder from '../formatter/step_definition_snippet_builder'\nimport { KeywordType } from '../formatter/helpers'\n\nfunction mapPickleStepTypeToKeywordType(type?: PickleStepType): KeywordType {\n switch (type) {\n case PickleStepType.CONTEXT:\n return KeywordType.Precondition\n case PickleStepType.ACTION:\n return KeywordType.Event\n case PickleStepType.OUTCOME:\n return KeywordType.Outcome\n default:\n return KeywordType.Precondition\n }\n}\n\nexport function makeSuggestion({\n newId,\n snippetBuilder,\n pickleStep,\n}: {\n newId: IdGenerator.NewId\n snippetBuilder: StepDefinitionSnippetBuilder\n pickleStep: PickleStep\n}): Suggestion {\n const keywordType = mapPickleStepTypeToKeywordType(pickleStep.type)\n const codes = snippetBuilder.buildMultiple({ keywordType, pickleStep })\n const snippets = codes.map((code) => ({\n code,\n language: 'javascript',\n }))\n\n return {\n id: newId(),\n pickleStepId: pickleStep.id,\n snippets,\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/parallel/adapter.d.ts b/node_modules/@cucumber/cucumber/lib/runtime/parallel/adapter.d.ts new file mode 100644 index 00000000..b25d185d --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/parallel/adapter.d.ts @@ -0,0 +1,49 @@ +import { ChildProcess } from 'node:child_process'; +import { EventEmitter } from 'node:events'; +import { SupportCodeLibrary } from '../../support_code_library_builder/types'; +import { AssembledTestCase } from '../../assemble'; +import { ILogger, IRunEnvironment } from '../../environment'; +import { RuntimeAdapter } from '../types'; +import { IRunOptionsRuntime } from '../../api'; +import { FormatOptions } from '../../formatter'; +import { WorkerToCoordinatorEvent } from './types'; +declare const enum WorkerState { + 'idle' = 0, + 'closed' = 1, + 'running' = 2, + 'new' = 3 +} +interface ManagedWorker { + state: WorkerState; + process: ChildProcess; + id: string; +} +interface WorkPlacement { + index: number; + item: AssembledTestCase; +} +export declare class ChildProcessAdapter implements RuntimeAdapter { + private readonly testRunStartedId; + private readonly environment; + private readonly logger; + private readonly eventBroadcaster; + private readonly options; + private readonly snippetOptions; + private readonly supportCodeLibrary; + private idleInterventions; + private failing; + private onFinish; + private todo; + private readonly inProgress; + private readonly workers; + constructor(testRunStartedId: string, environment: IRunEnvironment, logger: ILogger, eventBroadcaster: EventEmitter, options: IRunOptionsRuntime, snippetOptions: Pick, supportCodeLibrary: SupportCodeLibrary); + parseWorkerMessage(worker: ManagedWorker, message: WorkerToCoordinatorEvent): void; + awakenWorkers(triggeringWorker: ManagedWorker): void; + startWorker(id: string, total: number): void; + onWorkerProcessClose(exitCode: number): void; + run(assembledTestCases: ReadonlyArray): Promise; + nextWorkPlacement(): WorkPlacement; + placementAt(index: number): WorkPlacement; + giveWork(worker: ManagedWorker, force?: boolean): void; +} +export {}; diff --git a/node_modules/@cucumber/cucumber/lib/runtime/parallel/adapter.js b/node_modules/@cucumber/cucumber/lib/runtime/parallel/adapter.js new file mode 100644 index 00000000..1ba71cce --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/parallel/adapter.js @@ -0,0 +1,160 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ChildProcessAdapter = void 0; +const node_child_process_1 = require("node:child_process"); +const node_path_1 = __importDefault(require("node:path")); +const runWorkerPath = node_path_1.default.resolve(__dirname, 'run_worker.js'); +class ChildProcessAdapter { + testRunStartedId; + environment; + logger; + eventBroadcaster; + options; + snippetOptions; + supportCodeLibrary; + idleInterventions = 0; + failing = false; + onFinish; + todo = []; + inProgress = {}; + workers = {}; + constructor(testRunStartedId, environment, logger, eventBroadcaster, options, snippetOptions, supportCodeLibrary) { + this.testRunStartedId = testRunStartedId; + this.environment = environment; + this.logger = logger; + this.eventBroadcaster = eventBroadcaster; + this.options = options; + this.snippetOptions = snippetOptions; + this.supportCodeLibrary = supportCodeLibrary; + } + parseWorkerMessage(worker, message) { + switch (message.type) { + case 'READY': + worker.state = 0 /* WorkerState.idle */; + this.awakenWorkers(worker); + break; + case 'ENVELOPE': + this.eventBroadcaster.emit('envelope', message.envelope); + break; + case 'FINISHED': + if (!message.success) { + this.failing = true; + } + delete this.inProgress[worker.id]; + worker.state = 0 /* WorkerState.idle */; + this.awakenWorkers(worker); + break; + default: + throw new Error(`Unexpected message from worker: ${JSON.stringify(message)}`); + } + } + awakenWorkers(triggeringWorker) { + Object.values(this.workers).forEach((worker) => { + if (worker.state === 0 /* WorkerState.idle */) { + this.giveWork(worker); + } + return worker.state !== 0 /* WorkerState.idle */; + }); + if (Object.keys(this.inProgress).length == 0 && this.todo.length > 0) { + this.giveWork(triggeringWorker, true); + this.idleInterventions++; + } + } + startWorker(id, total) { + const workerProcess = (0, node_child_process_1.fork)(runWorkerPath, [], { + cwd: this.environment.cwd, + env: { + ...this.environment.env, + CUCUMBER_PARALLEL: 'true', + CUCUMBER_TOTAL_WORKERS: total.toString(), + CUCUMBER_WORKER_ID: id, + }, + stdio: ['inherit', 'inherit', 'inherit', 'ipc'], + }); + const worker = { state: 3 /* WorkerState.new */, process: workerProcess, id }; + this.workers[id] = worker; + worker.process.on('message', (message) => { + this.parseWorkerMessage(worker, message); + }); + worker.process.on('close', (exitCode) => { + worker.state = 1 /* WorkerState.closed */; + this.onWorkerProcessClose(exitCode); + }); + worker.process.send({ + type: 'INITIALIZE', + testRunStartedId: this.testRunStartedId, + supportCodeCoordinates: this.supportCodeLibrary.originalCoordinates, + supportCodeIds: { + stepDefinitionIds: this.supportCodeLibrary.stepDefinitions.map((s) => s.id), + beforeTestCaseHookDefinitionIds: this.supportCodeLibrary.beforeTestCaseHookDefinitions.map((h) => h.id), + afterTestCaseHookDefinitionIds: this.supportCodeLibrary.afterTestCaseHookDefinitions.map((h) => h.id), + beforeTestRunHookDefinitionIds: this.supportCodeLibrary.beforeTestRunHookDefinitions.map((h) => h.id), + afterTestRunHookDefinitionIds: this.supportCodeLibrary.afterTestRunHookDefinitions.map((h) => h.id), + }, + options: this.options, + snippetOptions: this.snippetOptions, + }); + } + onWorkerProcessClose(exitCode) { + if (exitCode !== 0) { + this.failing = true; + } + if (Object.values(this.workers).every((x) => x.state === 1 /* WorkerState.closed */)) { + this.onFinish(!this.failing); + } + } + async run(assembledTestCases) { + this.todo = Array.from(assembledTestCases); + return await new Promise((resolve) => { + for (let i = 0; i < this.options.parallel; i++) { + this.startWorker(i.toString(), this.options.parallel); + } + this.onFinish = (status) => { + if (this.idleInterventions > 0) { + this.logger.warn(`WARNING: All workers went idle ${this.idleInterventions} time(s). Consider revising handler passed to setParallelCanAssign.`); + } + resolve(status); + }; + }); + } + nextWorkPlacement() { + for (let index = 0; index < this.todo.length; index++) { + const placement = this.placementAt(index); + if (this.supportCodeLibrary.parallelCanAssign(placement.item.pickle, Object.values(this.inProgress).map(({ pickle }) => pickle))) { + return placement; + } + } + return null; + } + placementAt(index) { + return { + index, + item: this.todo[index], + }; + } + giveWork(worker, force = false) { + if (this.todo.length < 1) { + worker.state = 2 /* WorkerState.running */; + worker.process.send({ type: 'FINALIZE' }); + return; + } + const workPlacement = force ? this.placementAt(0) : this.nextWorkPlacement(); + if (workPlacement === null) { + return; + } + const { index: nextIndex, item } = workPlacement; + this.todo.splice(nextIndex, 1); + this.inProgress[worker.id] = item; + worker.state = 2 /* WorkerState.running */; + worker.process.send({ + type: 'RUN', + assembledTestCase: item, + failing: this.failing, + }); + } +} +exports.ChildProcessAdapter = ChildProcessAdapter; +//# sourceMappingURL=adapter.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/parallel/adapter.js.map b/node_modules/@cucumber/cucumber/lib/runtime/parallel/adapter.js.map new file mode 100644 index 00000000..f2868edf --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/parallel/adapter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/runtime/parallel/adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChildProcess, fork } from 'node:child_process'\nimport path from 'node:path'\nimport { EventEmitter } from 'node:events'\nimport { SupportCodeLibrary } from '../../support_code_library_builder/types'\nimport { AssembledTestCase } from '../../assemble'\nimport { ILogger, IRunEnvironment } from '../../environment'\nimport { RuntimeAdapter } from '../types'\nimport { IRunOptionsRuntime } from '../../api'\nimport { FormatOptions } from '../../formatter'\nimport {\n FinalizeCommand,\n InitializeCommand,\n RunCommand,\n WorkerToCoordinatorEvent,\n} from './types'\n\nconst runWorkerPath = path.resolve(__dirname, 'run_worker.js')\n\nconst enum WorkerState {\n 'idle',\n 'closed',\n 'running',\n 'new',\n}\n\ninterface ManagedWorker {\n state: WorkerState\n process: ChildProcess\n id: string\n}\n\ninterface WorkPlacement {\n index: number\n item: AssembledTestCase\n}\n\nexport class ChildProcessAdapter implements RuntimeAdapter {\n private idleInterventions: number = 0\n private failing: boolean = false\n private onFinish: (success: boolean) => void\n private todo: Array = []\n private readonly inProgress: Record = {}\n private readonly workers: Record = {}\n\n constructor(\n private readonly testRunStartedId: string,\n private readonly environment: IRunEnvironment,\n private readonly logger: ILogger,\n private readonly eventBroadcaster: EventEmitter,\n private readonly options: IRunOptionsRuntime,\n private readonly snippetOptions: Pick<\n FormatOptions,\n 'snippetInterface' | 'snippetSyntax'\n >,\n private readonly supportCodeLibrary: SupportCodeLibrary\n ) {}\n\n parseWorkerMessage(\n worker: ManagedWorker,\n message: WorkerToCoordinatorEvent\n ): void {\n switch (message.type) {\n case 'READY':\n worker.state = WorkerState.idle\n this.awakenWorkers(worker)\n break\n case 'ENVELOPE':\n this.eventBroadcaster.emit('envelope', message.envelope)\n break\n case 'FINISHED':\n if (!message.success) {\n this.failing = true\n }\n delete this.inProgress[worker.id]\n worker.state = WorkerState.idle\n this.awakenWorkers(worker)\n break\n default:\n throw new Error(\n `Unexpected message from worker: ${JSON.stringify(message)}`\n )\n }\n }\n\n awakenWorkers(triggeringWorker: ManagedWorker): void {\n Object.values(this.workers).forEach((worker) => {\n if (worker.state === WorkerState.idle) {\n this.giveWork(worker)\n }\n return worker.state !== WorkerState.idle\n })\n\n if (Object.keys(this.inProgress).length == 0 && this.todo.length > 0) {\n this.giveWork(triggeringWorker, true)\n this.idleInterventions++\n }\n }\n\n startWorker(id: string, total: number): void {\n const workerProcess = fork(runWorkerPath, [], {\n cwd: this.environment.cwd,\n env: {\n ...this.environment.env,\n CUCUMBER_PARALLEL: 'true',\n CUCUMBER_TOTAL_WORKERS: total.toString(),\n CUCUMBER_WORKER_ID: id,\n },\n stdio: ['inherit', 'inherit', 'inherit', 'ipc'],\n })\n const worker = { state: WorkerState.new, process: workerProcess, id }\n this.workers[id] = worker\n worker.process.on('message', (message: WorkerToCoordinatorEvent) => {\n this.parseWorkerMessage(worker, message)\n })\n worker.process.on('close', (exitCode) => {\n worker.state = WorkerState.closed\n this.onWorkerProcessClose(exitCode)\n })\n worker.process.send({\n type: 'INITIALIZE',\n testRunStartedId: this.testRunStartedId,\n supportCodeCoordinates: this.supportCodeLibrary.originalCoordinates,\n supportCodeIds: {\n stepDefinitionIds: this.supportCodeLibrary.stepDefinitions.map(\n (s) => s.id\n ),\n beforeTestCaseHookDefinitionIds:\n this.supportCodeLibrary.beforeTestCaseHookDefinitions.map(\n (h) => h.id\n ),\n afterTestCaseHookDefinitionIds:\n this.supportCodeLibrary.afterTestCaseHookDefinitions.map((h) => h.id),\n beforeTestRunHookDefinitionIds:\n this.supportCodeLibrary.beforeTestRunHookDefinitions.map((h) => h.id),\n afterTestRunHookDefinitionIds:\n this.supportCodeLibrary.afterTestRunHookDefinitions.map((h) => h.id),\n },\n options: this.options,\n snippetOptions: this.snippetOptions,\n } satisfies InitializeCommand)\n }\n\n onWorkerProcessClose(exitCode: number): void {\n if (exitCode !== 0) {\n this.failing = true\n }\n\n if (\n Object.values(this.workers).every((x) => x.state === WorkerState.closed)\n ) {\n this.onFinish(!this.failing)\n }\n }\n\n async run(\n assembledTestCases: ReadonlyArray\n ): Promise {\n this.todo = Array.from(assembledTestCases)\n return await new Promise((resolve) => {\n for (let i = 0; i < this.options.parallel; i++) {\n this.startWorker(i.toString(), this.options.parallel)\n }\n this.onFinish = (status) => {\n if (this.idleInterventions > 0) {\n this.logger.warn(\n `WARNING: All workers went idle ${this.idleInterventions} time(s). Consider revising handler passed to setParallelCanAssign.`\n )\n }\n\n resolve(status)\n }\n })\n }\n\n nextWorkPlacement(): WorkPlacement {\n for (let index = 0; index < this.todo.length; index++) {\n const placement = this.placementAt(index)\n if (\n this.supportCodeLibrary.parallelCanAssign(\n placement.item.pickle,\n Object.values(this.inProgress).map(({ pickle }) => pickle)\n )\n ) {\n return placement\n }\n }\n\n return null\n }\n\n placementAt(index: number): WorkPlacement {\n return {\n index,\n item: this.todo[index],\n }\n }\n\n giveWork(worker: ManagedWorker, force: boolean = false): void {\n if (this.todo.length < 1) {\n worker.state = WorkerState.running\n worker.process.send({ type: 'FINALIZE' } satisfies FinalizeCommand)\n return\n }\n\n const workPlacement = force ? this.placementAt(0) : this.nextWorkPlacement()\n\n if (workPlacement === null) {\n return\n }\n\n const { index: nextIndex, item } = workPlacement\n\n this.todo.splice(nextIndex, 1)\n this.inProgress[worker.id] = item\n worker.state = WorkerState.running\n worker.process.send({\n type: 'RUN',\n assembledTestCase: item,\n failing: this.failing,\n } satisfies RunCommand)\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/parallel/run_worker.d.ts b/node_modules/@cucumber/cucumber/lib/runtime/parallel/run_worker.d.ts new file mode 100644 index 00000000..cb0ff5c3 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/parallel/run_worker.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/@cucumber/cucumber/lib/runtime/parallel/run_worker.js b/node_modules/@cucumber/cucumber/lib/runtime/parallel/run_worker.js new file mode 100644 index 00000000..32a93c8a --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/parallel/run_worker.js @@ -0,0 +1,25 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const value_checker_1 = require("../../value_checker"); +const worker_1 = require("./worker"); +function run() { + const exit = (exitCode, error, message) => { + if ((0, value_checker_1.doesHaveValue)(error)) { + console.error(new Error(message, { cause: error })); // eslint-disable-line no-console + } + process.exit(exitCode); + }; + const worker = new worker_1.ChildProcessWorker({ + id: process.env.CUCUMBER_WORKER_ID, + sendMessage: (message) => process.send(message), + cwd: process.cwd(), + exit, + }); + process.on('message', (m) => { + worker + .receiveMessage(m) + .catch((error) => exit(1, error, 'Unexpected error on worker.receiveMessage')); + }); +} +run(); +//# sourceMappingURL=run_worker.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/parallel/run_worker.js.map b/node_modules/@cucumber/cucumber/lib/runtime/parallel/run_worker.js.map new file mode 100644 index 00000000..b5242b91 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/parallel/run_worker.js.map @@ -0,0 +1 @@ +{"version":3,"file":"run_worker.js","sourceRoot":"","sources":["../../../src/runtime/parallel/run_worker.ts"],"names":[],"mappings":";;AAAA,uDAAmD;AACnD,qCAA6C;AAE7C,SAAS,GAAG;IACV,MAAM,IAAI,GAAG,CAAC,QAAgB,EAAE,KAAa,EAAE,OAAgB,EAAQ,EAAE;QACvE,IAAI,IAAA,6BAAa,EAAC,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA,CAAC,iCAAiC;QACvF,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACxB,CAAC,CAAA;IACD,MAAM,MAAM,GAAG,IAAI,2BAAkB,CAAC;QACpC,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB;QAClC,WAAW,EAAE,CAAC,OAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QACpD,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,IAAI;KACL,CAAC,CAAA;IACF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAM,EAAQ,EAAE;QACrC,MAAM;aACH,cAAc,CAAC,CAAC,CAAC;aACjB,KAAK,CAAC,CAAC,KAAY,EAAE,EAAE,CACtB,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,2CAA2C,CAAC,CAC5D,CAAA;IACL,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,GAAG,EAAE,CAAA","sourcesContent":["import { doesHaveValue } from '../../value_checker'\nimport { ChildProcessWorker } from './worker'\n\nfunction run(): void {\n const exit = (exitCode: number, error?: Error, message?: string): void => {\n if (doesHaveValue(error)) {\n console.error(new Error(message, { cause: error })) // eslint-disable-line no-console\n }\n process.exit(exitCode)\n }\n const worker = new ChildProcessWorker({\n id: process.env.CUCUMBER_WORKER_ID,\n sendMessage: (message: any) => process.send(message),\n cwd: process.cwd(),\n exit,\n })\n process.on('message', (m: any): void => {\n worker\n .receiveMessage(m)\n .catch((error: Error) =>\n exit(1, error, 'Unexpected error on worker.receiveMessage')\n )\n })\n}\n\nrun()\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/parallel/types.d.ts b/node_modules/@cucumber/cucumber/lib/runtime/parallel/types.d.ts new file mode 100644 index 00000000..4f77b097 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/parallel/types.d.ts @@ -0,0 +1,35 @@ +import { Envelope } from '@cucumber/messages'; +import { RuntimeOptions } from '../index'; +import { ISupportCodeCoordinates } from '../../api'; +import { AssembledTestCase } from '../../assemble'; +import { CanonicalSupportCodeIds } from '../../support_code_library_builder/types'; +import { FormatOptions } from '../../formatter'; +export type CoordinatorToWorkerCommand = InitializeCommand | RunCommand | FinalizeCommand; +export interface InitializeCommand { + type: 'INITIALIZE'; + testRunStartedId: string; + supportCodeCoordinates: ISupportCodeCoordinates; + supportCodeIds: CanonicalSupportCodeIds; + options: RuntimeOptions; + snippetOptions: Pick; +} +export interface RunCommand { + type: 'RUN'; + assembledTestCase: AssembledTestCase; + failing: boolean; +} +export interface FinalizeCommand { + type: 'FINALIZE'; +} +export type WorkerToCoordinatorEvent = ReadyEvent | EnvelopeEvent | FinishedEvent; +export interface ReadyEvent { + type: 'READY'; +} +export interface EnvelopeEvent { + type: 'ENVELOPE'; + envelope: Envelope; +} +export interface FinishedEvent { + type: 'FINISHED'; + success: boolean; +} diff --git a/node_modules/@cucumber/cucumber/lib/runtime/parallel/types.js b/node_modules/@cucumber/cucumber/lib/runtime/parallel/types.js new file mode 100644 index 00000000..11e638d1 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/parallel/types.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/parallel/types.js.map b/node_modules/@cucumber/cucumber/lib/runtime/parallel/types.js.map new file mode 100644 index 00000000..95add3ab --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/parallel/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/runtime/parallel/types.ts"],"names":[],"mappings":"","sourcesContent":["import { Envelope } from '@cucumber/messages'\nimport { RuntimeOptions } from '../index'\nimport { ISupportCodeCoordinates } from '../../api'\nimport { AssembledTestCase } from '../../assemble'\nimport { CanonicalSupportCodeIds } from '../../support_code_library_builder/types'\nimport { FormatOptions } from '../../formatter'\n\n// Messages from Coordinator to Worker\n\nexport type CoordinatorToWorkerCommand =\n | InitializeCommand\n | RunCommand\n | FinalizeCommand\n\nexport interface InitializeCommand {\n type: 'INITIALIZE'\n testRunStartedId: string\n supportCodeCoordinates: ISupportCodeCoordinates\n supportCodeIds: CanonicalSupportCodeIds\n options: RuntimeOptions\n snippetOptions: Pick\n}\n\nexport interface RunCommand {\n type: 'RUN'\n assembledTestCase: AssembledTestCase\n failing: boolean\n}\n\nexport interface FinalizeCommand {\n type: 'FINALIZE'\n}\n\n// Messages from Worker to Coordinator\n\nexport type WorkerToCoordinatorEvent =\n | ReadyEvent\n | EnvelopeEvent\n | FinishedEvent\n\nexport interface ReadyEvent {\n type: 'READY'\n}\n\nexport interface EnvelopeEvent {\n type: 'ENVELOPE'\n envelope: Envelope\n}\n\nexport interface FinishedEvent {\n type: 'FINISHED'\n success: boolean\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/parallel/worker.d.ts b/node_modules/@cucumber/cucumber/lib/runtime/parallel/worker.d.ts new file mode 100644 index 00000000..46399629 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/parallel/worker.d.ts @@ -0,0 +1,25 @@ +import { WorkerToCoordinatorEvent, CoordinatorToWorkerCommand, InitializeCommand, RunCommand } from './types'; +type IExitFunction = (exitCode: number, error?: Error, message?: string) => void; +type IMessageSender = (command: WorkerToCoordinatorEvent) => void; +export declare class ChildProcessWorker { + private readonly cwd; + private readonly exit; + private readonly id; + private readonly eventBroadcaster; + private readonly newId; + private readonly sendMessage; + private options; + private supportCodeLibrary; + private worker; + constructor({ cwd, exit, id, sendMessage, }: { + cwd: string; + exit: IExitFunction; + id: string; + sendMessage: IMessageSender; + }); + initialize({ testRunStartedId, supportCodeCoordinates, supportCodeIds, options, snippetOptions, }: InitializeCommand): Promise; + finalize(): Promise; + receiveMessage(command: CoordinatorToWorkerCommand): Promise; + runTestCase(command: RunCommand): Promise; +} +export {}; diff --git a/node_modules/@cucumber/cucumber/lib/runtime/parallel/worker.js b/node_modules/@cucumber/cucumber/lib/runtime/parallel/worker.js new file mode 100644 index 00000000..da88a874 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/parallel/worker.js @@ -0,0 +1,83 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ChildProcessWorker = void 0; +const node_events_1 = require("node:events"); +const node_url_1 = require("node:url"); +const node_module_1 = require("node:module"); +const messages_1 = require("@cucumber/messages"); +const support_code_library_builder_1 = __importDefault(require("../../support_code_library_builder")); +const try_require_1 = __importDefault(require("../../try_require")); +const worker_1 = require("../worker"); +const builder_1 = __importDefault(require("../../formatter/builder")); +const { uuid } = messages_1.IdGenerator; +class ChildProcessWorker { + cwd; + exit; + id; + eventBroadcaster; + newId; + sendMessage; + options; + supportCodeLibrary; + worker; + constructor({ cwd, exit, id, sendMessage, }) { + this.id = id; + this.newId = uuid(); + this.cwd = cwd; + this.exit = exit; + this.sendMessage = sendMessage; + this.eventBroadcaster = new node_events_1.EventEmitter(); + this.eventBroadcaster.on('envelope', (envelope) => this.sendMessage({ type: 'ENVELOPE', envelope })); + } + async initialize({ testRunStartedId, supportCodeCoordinates, supportCodeIds, options, snippetOptions, }) { + support_code_library_builder_1.default.reset(this.cwd, this.newId, supportCodeCoordinates); + supportCodeCoordinates.requireModules.map((module) => (0, try_require_1.default)(module)); + supportCodeCoordinates.requirePaths.map((module) => (0, try_require_1.default)(module)); + for (const specifier of supportCodeCoordinates.loaders) { + (0, node_module_1.register)(specifier, (0, node_url_1.pathToFileURL)('./')); + } + for (const path of supportCodeCoordinates.importPaths) { + await import((0, node_url_1.pathToFileURL)(path).toString()); + } + this.supportCodeLibrary = support_code_library_builder_1.default.finalize(supportCodeIds); + this.options = options; + const snippetBuilder = await builder_1.default.getStepDefinitionSnippetBuilder({ + cwd: this.cwd, + snippetInterface: snippetOptions.snippetInterface, + snippetSyntax: snippetOptions.snippetSyntax, + supportCodeLibrary: this.supportCodeLibrary, + }); + this.worker = new worker_1.Worker(testRunStartedId, this.id, this.eventBroadcaster, this.newId, this.options, this.supportCodeLibrary, snippetBuilder); + await this.worker.runBeforeAllHooks(); + this.sendMessage({ type: 'READY' }); + } + async finalize() { + await this.worker.runAfterAllHooks(); + this.exit(0); + } + async receiveMessage(command) { + switch (command.type) { + case 'INITIALIZE': + await this.initialize(command); + break; + case 'RUN': + await this.runTestCase(command); + break; + case 'FINALIZE': + await this.finalize(); + break; + } + } + async runTestCase(command) { + const success = await this.worker.runTestCase(command.assembledTestCase, command.failing); + this.sendMessage({ + type: 'FINISHED', + success, + }); + } +} +exports.ChildProcessWorker = ChildProcessWorker; +//# sourceMappingURL=worker.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/parallel/worker.js.map b/node_modules/@cucumber/cucumber/lib/runtime/parallel/worker.js.map new file mode 100644 index 00000000..a66e27e3 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/parallel/worker.js.map @@ -0,0 +1 @@ +{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/runtime/parallel/worker.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventEmitter } from 'node:events'\nimport { pathToFileURL } from 'node:url'\nimport { register } from 'node:module'\nimport { Envelope, IdGenerator } from '@cucumber/messages'\nimport supportCodeLibraryBuilder from '../../support_code_library_builder'\nimport { SupportCodeLibrary } from '../../support_code_library_builder/types'\nimport tryRequire from '../../try_require'\nimport { Worker } from '../worker'\nimport { RuntimeOptions } from '../index'\nimport FormatterBuilder from '../../formatter/builder'\nimport {\n WorkerToCoordinatorEvent,\n CoordinatorToWorkerCommand,\n InitializeCommand,\n RunCommand,\n} from './types'\n\nconst { uuid } = IdGenerator\n\ntype IExitFunction = (exitCode: number, error?: Error, message?: string) => void\ntype IMessageSender = (command: WorkerToCoordinatorEvent) => void\n\nexport class ChildProcessWorker {\n private readonly cwd: string\n private readonly exit: IExitFunction\n\n private readonly id: string\n private readonly eventBroadcaster: EventEmitter\n private readonly newId: IdGenerator.NewId\n private readonly sendMessage: IMessageSender\n private options: RuntimeOptions\n private supportCodeLibrary: SupportCodeLibrary\n private worker: Worker\n\n constructor({\n cwd,\n exit,\n id,\n sendMessage,\n }: {\n cwd: string\n exit: IExitFunction\n id: string\n sendMessage: IMessageSender\n }) {\n this.id = id\n this.newId = uuid()\n this.cwd = cwd\n this.exit = exit\n this.sendMessage = sendMessage\n this.eventBroadcaster = new EventEmitter()\n this.eventBroadcaster.on('envelope', (envelope: Envelope) =>\n this.sendMessage({ type: 'ENVELOPE', envelope })\n )\n }\n\n async initialize({\n testRunStartedId,\n supportCodeCoordinates,\n supportCodeIds,\n options,\n snippetOptions,\n }: InitializeCommand): Promise {\n supportCodeLibraryBuilder.reset(\n this.cwd,\n this.newId,\n supportCodeCoordinates\n )\n supportCodeCoordinates.requireModules.map((module) => tryRequire(module))\n supportCodeCoordinates.requirePaths.map((module) => tryRequire(module))\n for (const specifier of supportCodeCoordinates.loaders) {\n register(specifier, pathToFileURL('./'))\n }\n for (const path of supportCodeCoordinates.importPaths) {\n await import(pathToFileURL(path).toString())\n }\n this.supportCodeLibrary = supportCodeLibraryBuilder.finalize(supportCodeIds)\n\n this.options = options\n\n const snippetBuilder =\n await FormatterBuilder.getStepDefinitionSnippetBuilder({\n cwd: this.cwd,\n snippetInterface: snippetOptions.snippetInterface,\n snippetSyntax: snippetOptions.snippetSyntax,\n supportCodeLibrary: this.supportCodeLibrary,\n })\n\n this.worker = new Worker(\n testRunStartedId,\n this.id,\n this.eventBroadcaster,\n this.newId,\n this.options,\n this.supportCodeLibrary,\n snippetBuilder\n )\n await this.worker.runBeforeAllHooks()\n this.sendMessage({ type: 'READY' })\n }\n\n async finalize(): Promise {\n await this.worker.runAfterAllHooks()\n this.exit(0)\n }\n\n async receiveMessage(command: CoordinatorToWorkerCommand): Promise {\n switch (command.type) {\n case 'INITIALIZE':\n await this.initialize(command)\n break\n case 'RUN':\n await this.runTestCase(command)\n break\n case 'FINALIZE':\n await this.finalize()\n break\n }\n }\n\n async runTestCase(command: RunCommand): Promise {\n const success = await this.worker.runTestCase(\n command.assembledTestCase,\n command.failing\n )\n this.sendMessage({\n type: 'FINISHED',\n success,\n })\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/scope/index.d.ts b/node_modules/@cucumber/cucumber/lib/runtime/scope/index.d.ts new file mode 100644 index 00000000..03e4b998 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/scope/index.d.ts @@ -0,0 +1,2 @@ +export * from './test_case_scope'; +export * from './test_run_scope'; diff --git a/node_modules/@cucumber/cucumber/lib/runtime/scope/index.js b/node_modules/@cucumber/cucumber/lib/runtime/scope/index.js new file mode 100644 index 00000000..1fdbcf2b --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/scope/index.js @@ -0,0 +1,19 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +__exportStar(require("./test_case_scope"), exports); +__exportStar(require("./test_run_scope"), exports); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/scope/index.js.map b/node_modules/@cucumber/cucumber/lib/runtime/scope/index.js.map new file mode 100644 index 00000000..7d9adb41 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/scope/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/scope/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAiC;AACjC,mDAAgC","sourcesContent":["export * from './test_case_scope'\nexport * from './test_run_scope'\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/scope/make_proxy.d.ts b/node_modules/@cucumber/cucumber/lib/runtime/scope/make_proxy.d.ts new file mode 100644 index 00000000..395a3eec --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/scope/make_proxy.d.ts @@ -0,0 +1 @@ +export declare function makeProxy(getThing: () => any): T; diff --git a/node_modules/@cucumber/cucumber/lib/runtime/scope/make_proxy.js b/node_modules/@cucumber/cucumber/lib/runtime/scope/make_proxy.js new file mode 100644 index 00000000..b5234edb --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/scope/make_proxy.js @@ -0,0 +1,41 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.makeProxy = makeProxy; +function makeProxy(getThing) { + return new Proxy({}, { + defineProperty(_, property, attributes) { + return Reflect.defineProperty(getThing(), property, attributes); + }, + deleteProperty(_, property) { + return Reflect.get(getThing(), property); + }, + get(_, property) { + return Reflect.get(getThing(), property, getThing()); + }, + getOwnPropertyDescriptor(_, property) { + return Reflect.getOwnPropertyDescriptor(getThing(), property); + }, + getPrototypeOf(_) { + return Reflect.getPrototypeOf(getThing()); + }, + has(_, key) { + return Reflect.has(getThing(), key); + }, + isExtensible(_) { + return Reflect.isExtensible(getThing()); + }, + ownKeys(_) { + return Reflect.ownKeys(getThing()); + }, + preventExtensions(_) { + return Reflect.preventExtensions(getThing()); + }, + set(_, property, value) { + return Reflect.set(getThing(), property, value, getThing()); + }, + setPrototypeOf(_, proto) { + return Reflect.setPrototypeOf(getThing(), proto); + }, + }); +} +//# sourceMappingURL=make_proxy.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/scope/make_proxy.js.map b/node_modules/@cucumber/cucumber/lib/runtime/scope/make_proxy.js.map new file mode 100644 index 00000000..f542c117 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/scope/make_proxy.js.map @@ -0,0 +1 @@ +{"version":3,"file":"make_proxy.js","sourceRoot":"","sources":["../../../src/runtime/scope/make_proxy.ts"],"names":[],"mappings":";;AAAA,8BAuCC;AAvCD,SAAgB,SAAS,CAAI,QAAmB;IAC9C,OAAO,IAAI,KAAK,CACd,EAAE,EACF;QACE,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU;YACpC,OAAO,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;QACjE,CAAC;QACD,cAAc,CAAC,CAAC,EAAE,QAAQ;YACxB,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAA;QAC1C,CAAC;QACD,GAAG,CAAC,CAAC,EAAE,QAAQ;YACb,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAA;QACtD,CAAC;QACD,wBAAwB,CAAC,CAAC,EAAE,QAAQ;YAClC,OAAO,OAAO,CAAC,wBAAwB,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAA;QAC/D,CAAC;QACD,cAAc,CAAC,CAAC;YACd,OAAO,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC3C,CAAC;QACD,GAAG,CAAC,CAAC,EAAE,GAAG;YACR,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,CAAA;QACrC,CAAC;QACD,YAAY,CAAC,CAAC;YACZ,OAAO,OAAO,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAA;QACzC,CAAC;QACD,OAAO,CAAC,CAAC;YACP,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;QACpC,CAAC;QACD,iBAAiB,CAAC,CAAC;YACjB,OAAO,OAAO,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC9C,CAAC;QACD,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK;YACpB,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;QAC7D,CAAC;QACD,cAAc,CAAC,CAAC,EAAE,KAAK;YACrB,OAAO,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAA;QAClD,CAAC;KACF,CACG,CAAA;AACR,CAAC","sourcesContent":["export function makeProxy(getThing: () => any): T {\n return new Proxy(\n {},\n {\n defineProperty(_, property, attributes) {\n return Reflect.defineProperty(getThing(), property, attributes)\n },\n deleteProperty(_, property) {\n return Reflect.get(getThing(), property)\n },\n get(_, property) {\n return Reflect.get(getThing(), property, getThing())\n },\n getOwnPropertyDescriptor(_, property) {\n return Reflect.getOwnPropertyDescriptor(getThing(), property)\n },\n getPrototypeOf(_) {\n return Reflect.getPrototypeOf(getThing())\n },\n has(_, key) {\n return Reflect.has(getThing(), key)\n },\n isExtensible(_) {\n return Reflect.isExtensible(getThing())\n },\n ownKeys(_) {\n return Reflect.ownKeys(getThing())\n },\n preventExtensions(_) {\n return Reflect.preventExtensions(getThing())\n },\n set(_, property, value) {\n return Reflect.set(getThing(), property, value, getThing())\n },\n setPrototypeOf(_, proto) {\n return Reflect.setPrototypeOf(getThing(), proto)\n },\n }\n ) as T\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/scope/test_case_scope.d.ts b/node_modules/@cucumber/cucumber/lib/runtime/scope/test_case_scope.d.ts new file mode 100644 index 00000000..5db08278 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/scope/test_case_scope.d.ts @@ -0,0 +1,17 @@ +import { IWorld } from '../../support_code_library_builder/world'; +interface TestCaseScopeStore { + world: IWorld; +} +export declare function runInTestCaseScope(store: TestCaseScopeStore, callback: () => ResponseType): Promise; +/** + * A proxy to the World instance for the currently-executing test case + * + * @beta + * @remarks + * Useful for getting a handle on the World when using arrow functions and thus + * being unable to rely on the value of `this`. Only callable from the body of a + * step or a `Before`, `After`, `BeforeStep` or `AfterStep` hook (will throw + * otherwise). + */ +export declare const worldProxy: IWorld; +export {}; diff --git a/node_modules/@cucumber/cucumber/lib/runtime/scope/test_case_scope.js b/node_modules/@cucumber/cucumber/lib/runtime/scope/test_case_scope.js new file mode 100644 index 00000000..78bae391 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/scope/test_case_scope.js @@ -0,0 +1,29 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.worldProxy = void 0; +exports.runInTestCaseScope = runInTestCaseScope; +const node_async_hooks_1 = require("node:async_hooks"); +const make_proxy_1 = require("./make_proxy"); +const testCaseScope = new node_async_hooks_1.AsyncLocalStorage(); +async function runInTestCaseScope(store, callback) { + return testCaseScope.run(store, callback); +} +function getWorld() { + const store = testCaseScope.getStore(); + if (!store) { + throw new Error('Attempted to access `world` from incorrect scope; only applicable to steps and case-level hooks'); + } + return store.world; +} +/** + * A proxy to the World instance for the currently-executing test case + * + * @beta + * @remarks + * Useful for getting a handle on the World when using arrow functions and thus + * being unable to rely on the value of `this`. Only callable from the body of a + * step or a `Before`, `After`, `BeforeStep` or `AfterStep` hook (will throw + * otherwise). + */ +exports.worldProxy = (0, make_proxy_1.makeProxy)(getWorld); +//# sourceMappingURL=test_case_scope.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/scope/test_case_scope.js.map b/node_modules/@cucumber/cucumber/lib/runtime/scope/test_case_scope.js.map new file mode 100644 index 00000000..499ebc27 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/scope/test_case_scope.js.map @@ -0,0 +1 @@ +{"version":3,"file":"test_case_scope.js","sourceRoot":"","sources":["../../../src/runtime/scope/test_case_scope.ts"],"names":[],"mappings":";;;AAUA,gDAKC;AAfD,uDAAoD;AAEpD,6CAAwC;AAMxC,MAAM,aAAa,GAAG,IAAI,oCAAiB,EAAsB,CAAA;AAE1D,KAAK,UAAU,kBAAkB,CACtC,KAAyB,EACzB,QAA4B;IAE5B,OAAO,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;AAC3C,CAAC;AAED,SAAS,QAAQ;IACf,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAA;IACtC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,iGAAiG,CAClG,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAC,KAA+B,CAAA;AAC9C,CAAC;AAED;;;;;;;;;GASG;AACU,QAAA,UAAU,GAAG,IAAA,sBAAS,EAAS,QAAQ,CAAC,CAAA","sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks'\nimport { IWorld } from '../../support_code_library_builder/world'\nimport { makeProxy } from './make_proxy'\n\ninterface TestCaseScopeStore {\n world: IWorld\n}\n\nconst testCaseScope = new AsyncLocalStorage()\n\nexport async function runInTestCaseScope(\n store: TestCaseScopeStore,\n callback: () => ResponseType\n) {\n return testCaseScope.run(store, callback)\n}\n\nfunction getWorld(): IWorld {\n const store = testCaseScope.getStore()\n if (!store) {\n throw new Error(\n 'Attempted to access `world` from incorrect scope; only applicable to steps and case-level hooks'\n )\n }\n return store.world as IWorld\n}\n\n/**\n * A proxy to the World instance for the currently-executing test case\n *\n * @beta\n * @remarks\n * Useful for getting a handle on the World when using arrow functions and thus\n * being unable to rely on the value of `this`. Only callable from the body of a\n * step or a `Before`, `After`, `BeforeStep` or `AfterStep` hook (will throw\n * otherwise).\n */\nexport const worldProxy = makeProxy(getWorld)\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/scope/test_run_scope.d.ts b/node_modules/@cucumber/cucumber/lib/runtime/scope/test_run_scope.d.ts new file mode 100644 index 00000000..8be4a9b6 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/scope/test_run_scope.d.ts @@ -0,0 +1,16 @@ +import { IContext } from '../../support_code_library_builder/context'; +interface TestRunScopeStore { + context: IContext; +} +export declare function runInTestRunScope(store: TestRunScopeStore, callback: () => ResponseType): Promise; +/** + * A proxy to the context for the currently-executing test run. + * + * @beta + * @remarks + * Useful for getting a handle on the context when using arrow functions and thus + * being unable to rely on the value of `this`. Only callable from the body of a + * `BeforeAll` or `AfterAll` hook (will throw otherwise). + */ +export declare const contextProxy: IContext; +export {}; diff --git a/node_modules/@cucumber/cucumber/lib/runtime/scope/test_run_scope.js b/node_modules/@cucumber/cucumber/lib/runtime/scope/test_run_scope.js new file mode 100644 index 00000000..860eb120 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/scope/test_run_scope.js @@ -0,0 +1,28 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.contextProxy = void 0; +exports.runInTestRunScope = runInTestRunScope; +const node_async_hooks_1 = require("node:async_hooks"); +const make_proxy_1 = require("./make_proxy"); +const testRunScope = new node_async_hooks_1.AsyncLocalStorage(); +async function runInTestRunScope(store, callback) { + return testRunScope.run(store, callback); +} +function getContext() { + const store = testRunScope.getStore(); + if (!store) { + throw new Error('Attempted to access `context` from incorrect scope; only applicable to run-level hooks'); + } + return store.context; +} +/** + * A proxy to the context for the currently-executing test run. + * + * @beta + * @remarks + * Useful for getting a handle on the context when using arrow functions and thus + * being unable to rely on the value of `this`. Only callable from the body of a + * `BeforeAll` or `AfterAll` hook (will throw otherwise). + */ +exports.contextProxy = (0, make_proxy_1.makeProxy)(getContext); +//# sourceMappingURL=test_run_scope.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/scope/test_run_scope.js.map b/node_modules/@cucumber/cucumber/lib/runtime/scope/test_run_scope.js.map new file mode 100644 index 00000000..3b716ed8 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/scope/test_run_scope.js.map @@ -0,0 +1 @@ +{"version":3,"file":"test_run_scope.js","sourceRoot":"","sources":["../../../src/runtime/scope/test_run_scope.ts"],"names":[],"mappings":";;;AAUA,8CAKC;AAfD,uDAAoD;AAEpD,6CAAwC;AAMxC,MAAM,YAAY,GAAG,IAAI,oCAAiB,EAAqB,CAAA;AAExD,KAAK,UAAU,iBAAiB,CACrC,KAAwB,EACxB,QAA4B;IAE5B,OAAO,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;AAC1C,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAA;IACrC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,wFAAwF,CACzF,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAC,OAAmC,CAAA;AAClD,CAAC;AAED;;;;;;;;GAQG;AACU,QAAA,YAAY,GAAG,IAAA,sBAAS,EAAW,UAAU,CAAC,CAAA","sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks'\nimport { IContext } from '../../support_code_library_builder/context'\nimport { makeProxy } from './make_proxy'\n\ninterface TestRunScopeStore {\n context: IContext\n}\n\nconst testRunScope = new AsyncLocalStorage()\n\nexport async function runInTestRunScope(\n store: TestRunScopeStore,\n callback: () => ResponseType\n) {\n return testRunScope.run(store, callback)\n}\n\nfunction getContext(): IContext {\n const store = testRunScope.getStore()\n if (!store) {\n throw new Error(\n 'Attempted to access `context` from incorrect scope; only applicable to run-level hooks'\n )\n }\n return store.context as IContext\n}\n\n/**\n * A proxy to the context for the currently-executing test run.\n *\n * @beta\n * @remarks\n * Useful for getting a handle on the context when using arrow functions and thus\n * being unable to rely on the value of `this`. Only callable from the body of a\n * `BeforeAll` or `AfterAll` hook (will throw otherwise).\n */\nexport const contextProxy = makeProxy(getContext)\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/serial/adapter.d.ts b/node_modules/@cucumber/cucumber/lib/runtime/serial/adapter.d.ts new file mode 100644 index 00000000..2f01da37 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/serial/adapter.d.ts @@ -0,0 +1,13 @@ +import { EventEmitter } from 'node:events'; +import { IdGenerator } from '@cucumber/messages'; +import { RuntimeAdapter } from '../types'; +import { AssembledTestCase } from '../../assemble'; +import { RuntimeOptions } from '../index'; +import { SupportCodeLibrary } from '../../support_code_library_builder/types'; +import StepDefinitionSnippetBuilder from '../../formatter/step_definition_snippet_builder'; +export declare class InProcessAdapter implements RuntimeAdapter { + private readonly worker; + private failing; + constructor(testRunStartedId: string, eventBroadcaster: EventEmitter, newId: IdGenerator.NewId, options: RuntimeOptions, supportCodeLibrary: SupportCodeLibrary, snippetBuilder: StepDefinitionSnippetBuilder); + run(assembledTestCases: ReadonlyArray): Promise; +} diff --git a/node_modules/@cucumber/cucumber/lib/runtime/serial/adapter.js b/node_modules/@cucumber/cucumber/lib/runtime/serial/adapter.js new file mode 100644 index 00000000..61a5e800 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/serial/adapter.js @@ -0,0 +1,24 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.InProcessAdapter = void 0; +const worker_1 = require("../worker"); +class InProcessAdapter { + worker; + failing = false; + constructor(testRunStartedId, eventBroadcaster, newId, options, supportCodeLibrary, snippetBuilder) { + this.worker = new worker_1.Worker(testRunStartedId, undefined, eventBroadcaster, newId, options, supportCodeLibrary, snippetBuilder); + } + async run(assembledTestCases) { + await this.worker.runBeforeAllHooks(); + for (const item of assembledTestCases) { + const success = await this.worker.runTestCase(item, this.failing); + if (!success) { + this.failing = true; + } + } + await this.worker.runAfterAllHooks(); + return !this.failing; + } +} +exports.InProcessAdapter = InProcessAdapter; +//# sourceMappingURL=adapter.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/serial/adapter.js.map b/node_modules/@cucumber/cucumber/lib/runtime/serial/adapter.js.map new file mode 100644 index 00000000..e69cbe8a --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/serial/adapter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/runtime/serial/adapter.ts"],"names":[],"mappings":";;;AAIA,sCAAkC;AAKlC,MAAa,gBAAgB;IACV,MAAM,CAAQ;IACvB,OAAO,GAAY,KAAK,CAAA;IAEhC,YACE,gBAAwB,EACxB,gBAA8B,EAC9B,KAAwB,EACxB,OAAuB,EACvB,kBAAsC,EACtC,cAA4C;QAE5C,IAAI,CAAC,MAAM,GAAG,IAAI,eAAM,CACtB,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EAChB,KAAK,EACL,OAAO,EACP,kBAAkB,EAClB,cAAc,CACf,CAAA;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CACP,kBAAoD;QAEpD,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAA;QACrC,KAAK,MAAM,IAAI,IAAI,kBAAkB,EAAE,CAAC;YACtC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;YACjE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;YACrB,CAAC;QACH,CAAC;QACD,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAA;QACpC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAA;IACtB,CAAC;CACF;AApCD,4CAoCC","sourcesContent":["import { EventEmitter } from 'node:events'\nimport { IdGenerator } from '@cucumber/messages'\nimport { RuntimeAdapter } from '../types'\nimport { AssembledTestCase } from '../../assemble'\nimport { Worker } from '../worker'\nimport { RuntimeOptions } from '../index'\nimport { SupportCodeLibrary } from '../../support_code_library_builder/types'\nimport StepDefinitionSnippetBuilder from '../../formatter/step_definition_snippet_builder'\n\nexport class InProcessAdapter implements RuntimeAdapter {\n private readonly worker: Worker\n private failing: boolean = false\n\n constructor(\n testRunStartedId: string,\n eventBroadcaster: EventEmitter,\n newId: IdGenerator.NewId,\n options: RuntimeOptions,\n supportCodeLibrary: SupportCodeLibrary,\n snippetBuilder: StepDefinitionSnippetBuilder\n ) {\n this.worker = new Worker(\n testRunStartedId,\n undefined,\n eventBroadcaster,\n newId,\n options,\n supportCodeLibrary,\n snippetBuilder\n )\n }\n\n async run(\n assembledTestCases: ReadonlyArray\n ): Promise {\n await this.worker.runBeforeAllHooks()\n for (const item of assembledTestCases) {\n const success = await this.worker.runTestCase(item, this.failing)\n if (!success) {\n this.failing = true\n }\n }\n await this.worker.runAfterAllHooks()\n return !this.failing\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/step_runner.d.ts b/node_modules/@cucumber/cucumber/lib/runtime/step_runner.d.ts new file mode 100644 index 00000000..fbd1167b --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/step_runner.d.ts @@ -0,0 +1,20 @@ +import * as messages from '@cucumber/messages'; +import { ITestCaseHookParameter } from '../support_code_library_builder/types'; +import { IDefinition } from '../models/definition'; +export interface IRunOptions { + defaultTimeout: number; + filterStackTraces: boolean; + hookParameter: ITestCaseHookParameter; + step: messages.PickleStep; + stepDefinition: IDefinition; + world: any; +} +export interface RunStepResult { + result: messages.TestStepResult; + error?: any; +} +export declare function run({ defaultTimeout, filterStackTraces, hookParameter, step, stepDefinition, world, }: IRunOptions): Promise; +declare const _default: { + run: typeof run; +}; +export default _default; diff --git a/node_modules/@cucumber/cucumber/lib/runtime/step_runner.js b/node_modules/@cucumber/cucumber/lib/runtime/step_runner.js new file mode 100644 index 00000000..d810ca82 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/step_runner.js @@ -0,0 +1,105 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.run = run; +const messages = __importStar(require("@cucumber/messages")); +const user_code_runner_1 = __importDefault(require("../user_code_runner")); +const value_checker_1 = require("../value_checker"); +const scope_1 = require("./scope"); +const stopwatch_1 = require("./stopwatch"); +const format_error_1 = require("./format_error"); +async function run({ defaultTimeout, filterStackTraces, hookParameter, step, stepDefinition, world, }) { + const stopwatch = (0, stopwatch_1.create)().start(); + let error, result, invocationData; + try { + await (0, scope_1.runInTestCaseScope)({ world }, async () => { + invocationData = await stepDefinition.getInvocationParameters({ + hookParameter, + step, + world, + }); + }); + } + catch (err) { + error = err; + } + if ((0, value_checker_1.doesNotHaveValue)(error)) { + const timeoutInMilliseconds = (0, value_checker_1.valueOrDefault)(stepDefinition.options.timeout, defaultTimeout); + if (invocationData.validCodeLengths.includes(stepDefinition.code.length)) { + const data = await (0, scope_1.runInTestCaseScope)({ world }, async () => user_code_runner_1.default.run({ + argsArray: invocationData.parameters, + fn: stepDefinition.code, + thisArg: world, + timeoutInMilliseconds, + })); + error = data.error; + result = data.result; + } + else { + error = invocationData.getInvalidCodeLengthMessage(); + } + } + const duration = stopwatch.stop().duration(); + let status; + let details = {}; + if (result === 'skipped') { + status = messages.TestStepResultStatus.SKIPPED; + } + else if (result === 'pending') { + status = messages.TestStepResultStatus.PENDING; + } + else if ((0, value_checker_1.doesHaveValue)(error)) { + status = messages.TestStepResultStatus.FAILED; + } + else { + status = messages.TestStepResultStatus.PASSED; + } + if ((0, value_checker_1.doesHaveValue)(error)) { + details = (0, format_error_1.formatError)(error, filterStackTraces); + } + return { + result: { + duration, + status, + ...details, + }, + error, + }; +} +exports.default = { run }; +//# sourceMappingURL=step_runner.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/step_runner.js.map b/node_modules/@cucumber/cucumber/lib/runtime/step_runner.js.map new file mode 100644 index 00000000..7b4d1907 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/step_runner.js.map @@ -0,0 +1 @@ +{"version":3,"file":"step_runner.js","sourceRoot":"","sources":["../../src/runtime/step_runner.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,kBAsEC;AAjGD,6DAA8C;AAC9C,2EAAgD;AAGhD,oDAIyB;AACzB,mCAA4C;AAC5C,2CAAoC;AACpC,iDAA4C;AAgBrC,KAAK,UAAU,GAAG,CAAC,EACxB,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,IAAI,EACJ,cAAc,EACd,KAAK,GACO;IACZ,MAAM,SAAS,GAAG,IAAA,kBAAM,GAAE,CAAC,KAAK,EAAE,CAAA;IAClC,IAAI,KAAU,EAAE,MAAW,EAAE,cAA0C,CAAA;IAEvE,IAAI,CAAC;QACH,MAAM,IAAA,0BAAkB,EAAC,EAAE,KAAK,EAAE,EAAE,KAAK,IAAI,EAAE;YAC7C,cAAc,GAAG,MAAM,cAAc,CAAC,uBAAuB,CAAC;gBAC5D,aAAa;gBACb,IAAI;gBACJ,KAAK;aACN,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,GAAG,GAAG,CAAA;IACb,CAAC;IAED,IAAI,IAAA,gCAAgB,EAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,qBAAqB,GAAG,IAAA,8BAAc,EAC1C,cAAc,CAAC,OAAO,CAAC,OAAO,EAC9B,cAAc,CACf,CAAA;QAED,IAAI,cAAc,CAAC,gBAAgB,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACzE,MAAM,IAAI,GAAG,MAAM,IAAA,0BAAkB,EAAC,EAAE,KAAK,EAAE,EAAE,KAAK,IAAI,EAAE,CAC1D,0BAAc,CAAC,GAAG,CAAC;gBACjB,SAAS,EAAE,cAAc,CAAC,UAAU;gBACpC,EAAE,EAAE,cAAc,CAAC,IAAI;gBACvB,OAAO,EAAE,KAAK;gBACd,qBAAqB;aACtB,CAAC,CACH,CAAA;YACD,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;YAClB,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QACtB,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,cAAc,CAAC,2BAA2B,EAAE,CAAA;QACtD,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAA;IAC5C,IAAI,MAAqC,CAAA;IACzC,IAAI,OAAO,GAAG,EAAE,CAAA;IAChB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,GAAG,QAAQ,CAAC,oBAAoB,CAAC,OAAO,CAAA;IAChD,CAAC;SAAM,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,GAAG,QAAQ,CAAC,oBAAoB,CAAC,OAAO,CAAA;IAChD,CAAC;SAAM,IAAI,IAAA,6BAAa,EAAC,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,GAAG,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAA;IAC/C,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAA;IAC/C,CAAC;IAED,IAAI,IAAA,6BAAa,EAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,IAAA,0BAAW,EAAC,KAAK,EAAE,iBAAiB,CAAC,CAAA;IACjD,CAAC;IAED,OAAO;QACL,MAAM,EAAE;YACN,QAAQ;YACR,MAAM;YACN,GAAG,OAAO;SACX;QACD,KAAK;KACN,CAAA;AACH,CAAC;AAED,kBAAe,EAAE,GAAG,EAAE,CAAA","sourcesContent":["import * as messages from '@cucumber/messages'\nimport UserCodeRunner from '../user_code_runner'\nimport { ITestCaseHookParameter } from '../support_code_library_builder/types'\nimport { IDefinition, IGetInvocationDataResponse } from '../models/definition'\nimport {\n doesHaveValue,\n doesNotHaveValue,\n valueOrDefault,\n} from '../value_checker'\nimport { runInTestCaseScope } from './scope'\nimport { create } from './stopwatch'\nimport { formatError } from './format_error'\n\nexport interface IRunOptions {\n defaultTimeout: number\n filterStackTraces: boolean\n hookParameter: ITestCaseHookParameter\n step: messages.PickleStep\n stepDefinition: IDefinition\n world: any\n}\n\nexport interface RunStepResult {\n result: messages.TestStepResult\n error?: any\n}\n\nexport async function run({\n defaultTimeout,\n filterStackTraces,\n hookParameter,\n step,\n stepDefinition,\n world,\n}: IRunOptions): Promise {\n const stopwatch = create().start()\n let error: any, result: any, invocationData: IGetInvocationDataResponse\n\n try {\n await runInTestCaseScope({ world }, async () => {\n invocationData = await stepDefinition.getInvocationParameters({\n hookParameter,\n step,\n world,\n })\n })\n } catch (err) {\n error = err\n }\n\n if (doesNotHaveValue(error)) {\n const timeoutInMilliseconds = valueOrDefault(\n stepDefinition.options.timeout,\n defaultTimeout\n )\n\n if (invocationData.validCodeLengths.includes(stepDefinition.code.length)) {\n const data = await runInTestCaseScope({ world }, async () =>\n UserCodeRunner.run({\n argsArray: invocationData.parameters,\n fn: stepDefinition.code,\n thisArg: world,\n timeoutInMilliseconds,\n })\n )\n error = data.error\n result = data.result\n } else {\n error = invocationData.getInvalidCodeLengthMessage()\n }\n }\n\n const duration = stopwatch.stop().duration()\n let status: messages.TestStepResultStatus\n let details = {}\n if (result === 'skipped') {\n status = messages.TestStepResultStatus.SKIPPED\n } else if (result === 'pending') {\n status = messages.TestStepResultStatus.PENDING\n } else if (doesHaveValue(error)) {\n status = messages.TestStepResultStatus.FAILED\n } else {\n status = messages.TestStepResultStatus.PASSED\n }\n\n if (doesHaveValue(error)) {\n details = formatError(error, filterStackTraces)\n }\n\n return {\n result: {\n duration,\n status,\n ...details,\n },\n error,\n }\n}\n\nexport default { run }\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/stopwatch.d.ts b/node_modules/@cucumber/cucumber/lib/runtime/stopwatch.d.ts new file mode 100644 index 00000000..c9606a67 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/stopwatch.d.ts @@ -0,0 +1,12 @@ +import { Duration } from '@cucumber/messages'; +/** + * A utility for timing test run operations and returning duration and + * timestamp objects in messages-compatible formats + */ +export interface IStopwatch { + start: () => IStopwatch; + stop: () => IStopwatch; + duration: () => Duration; +} +export declare const create: (base?: Duration) => IStopwatch; +export declare const timestamp: () => import("@cucumber/messages").Timestamp; diff --git a/node_modules/@cucumber/cucumber/lib/runtime/stopwatch.js b/node_modules/@cucumber/cucumber/lib/runtime/stopwatch.js new file mode 100644 index 00000000..3999b2a2 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/stopwatch.js @@ -0,0 +1,35 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.timestamp = exports.create = void 0; +const messages_1 = require("@cucumber/messages"); +const time_1 = __importDefault(require("../time")); +class StopwatchImpl { + base; + started; + constructor(base = { seconds: 0, nanos: 0 }) { + this.base = base; + } + start() { + this.started = time_1.default.performance.now(); + return this; + } + stop() { + this.base = this.duration(); + this.started = undefined; + return this; + } + duration() { + if (typeof this.started !== 'number') { + return this.base; + } + return messages_1.TimeConversion.addDurations(this.base, messages_1.TimeConversion.millisecondsToDuration(time_1.default.performance.now() - this.started)); + } +} +const create = (base) => new StopwatchImpl(base); +exports.create = create; +const timestamp = () => messages_1.TimeConversion.millisecondsSinceEpochToTimestamp(time_1.default.Date.now()); +exports.timestamp = timestamp; +//# sourceMappingURL=stopwatch.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/stopwatch.js.map b/node_modules/@cucumber/cucumber/lib/runtime/stopwatch.js.map new file mode 100644 index 00000000..489acc51 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/stopwatch.js.map @@ -0,0 +1 @@ +{"version":3,"file":"stopwatch.js","sourceRoot":"","sources":["../../src/runtime/stopwatch.ts"],"names":[],"mappings":";;;;;;AAAA,iDAA6D;AAC7D,mDAA6B;AAY7B,MAAM,aAAa;IAGG;IAFZ,OAAO,CAAQ;IAEvB,YAAoB,OAAiB,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;QAAzC,SAAI,GAAJ,IAAI,CAAqC;IAAG,CAAC;IAEjE,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,cAAO,CAAC,WAAW,CAAC,GAAG,EAAE,CAAA;QACxC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI;QACF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAC3B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAA;QACxB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,QAAQ;QACN,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACrC,OAAO,IAAI,CAAC,IAAI,CAAA;QAClB,CAAC;QACD,OAAO,yBAAc,CAAC,YAAY,CAChC,IAAI,CAAC,IAAI,EACT,yBAAc,CAAC,sBAAsB,CACnC,cAAO,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CACzC,CACF,CAAA;IACH,CAAC;CACF;AAEM,MAAM,MAAM,GAAG,CAAC,IAAe,EAAc,EAAE,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,CAAA;AAAjE,QAAA,MAAM,UAA2D;AAEvE,MAAM,SAAS,GAAG,GAAG,EAAE,CAC5B,yBAAc,CAAC,iCAAiC,CAAC,cAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;AADzD,QAAA,SAAS,aACgD","sourcesContent":["import { Duration, TimeConversion } from '@cucumber/messages'\nimport methods from '../time'\n\n/**\n * A utility for timing test run operations and returning duration and\n * timestamp objects in messages-compatible formats\n */\nexport interface IStopwatch {\n start: () => IStopwatch\n stop: () => IStopwatch\n duration: () => Duration\n}\n\nclass StopwatchImpl implements IStopwatch {\n private started: number\n\n constructor(private base: Duration = { seconds: 0, nanos: 0 }) {}\n\n start(): IStopwatch {\n this.started = methods.performance.now()\n return this\n }\n\n stop(): IStopwatch {\n this.base = this.duration()\n this.started = undefined\n return this\n }\n\n duration(): Duration {\n if (typeof this.started !== 'number') {\n return this.base\n }\n return TimeConversion.addDurations(\n this.base,\n TimeConversion.millisecondsToDuration(\n methods.performance.now() - this.started\n )\n )\n }\n}\n\nexport const create = (base?: Duration): IStopwatch => new StopwatchImpl(base)\n\nexport const timestamp = () =>\n TimeConversion.millisecondsSinceEpochToTimestamp(methods.Date.now())\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/test_case_runner.d.ts b/node_modules/@cucumber/cucumber/lib/runtime/test_case_runner.d.ts new file mode 100644 index 00000000..992f694d --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/test_case_runner.d.ts @@ -0,0 +1,57 @@ +import { EventEmitter } from 'node:events'; +import * as messages from '@cucumber/messages'; +import { IdGenerator } from '@cucumber/messages'; +import { JsonObject } from 'type-fest'; +import { ITestCaseHookParameter, SupportCodeLibrary } from '../support_code_library_builder/types'; +import TestCaseHookDefinition from '../models/test_case_hook_definition'; +import TestStepHookDefinition from '../models/test_step_hook_definition'; +import { IDefinition } from '../models/definition'; +import StepDefinitionSnippetBuilder from '../formatter/step_definition_snippet_builder'; +import { RunStepResult } from './step_runner'; +export interface INewTestCaseRunnerOptions { + workerId?: string; + eventBroadcaster: EventEmitter; + gherkinDocument: messages.GherkinDocument; + newId: IdGenerator.NewId; + pickle: messages.Pickle; + testCase: messages.TestCase; + retries: number; + skip: boolean; + filterStackTraces: boolean; + supportCodeLibrary: SupportCodeLibrary; + worldParameters: JsonObject; + snippetBuilder: StepDefinitionSnippetBuilder; +} +export default class TestCaseRunner { + private readonly workerId; + private readonly attachmentManager; + private currentTestCaseStartedId; + private currentTestStepId; + private readonly eventBroadcaster; + private readonly gherkinDocument; + private readonly newId; + private readonly pickle; + private readonly testCase; + private readonly maxAttempts; + private readonly skip; + private readonly filterStackTraces; + private readonly supportCodeLibrary; + private readonly snippetBuilder; + private testStepResults; + private world; + private readonly worldParameters; + constructor({ workerId, eventBroadcaster, gherkinDocument, newId, pickle, testCase, retries, skip, filterStackTraces, supportCodeLibrary, worldParameters, snippetBuilder, }: INewTestCaseRunnerOptions); + resetTestProgressData(): void; + getBeforeStepHookDefinitions(): TestStepHookDefinition[]; + getAfterStepHookDefinitions(): TestStepHookDefinition[]; + getWorstStepResult(): messages.TestStepResult; + invokeStep(step: messages.PickleStep, stepDefinition: IDefinition, hookParameter?: ITestCaseHookParameter): Promise; + isSkippingSteps(): boolean; + shouldSkipHook(isBeforeHook: boolean): boolean; + aroundTestStep(testStepId: string, runStepFn: () => Promise): Promise; + run(): Promise; + runAttempt(attempt: number, moreAttemptsRemaining: boolean): Promise; + runHook(hookDefinition: TestCaseHookDefinition, hookParameter: ITestCaseHookParameter, isBeforeHook: boolean): Promise; + runStepHooks(stepHooks: TestStepHookDefinition[], pickleStep: messages.PickleStep, stepResult?: RunStepResult): Promise; + runStep(pickleStep: messages.PickleStep, testStep: messages.TestStep): Promise; +} diff --git a/node_modules/@cucumber/cucumber/lib/runtime/test_case_runner.js b/node_modules/@cucumber/cucumber/lib/runtime/test_case_runner.js new file mode 100644 index 00000000..ad9ba4b8 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/test_case_runner.js @@ -0,0 +1,327 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const messages = __importStar(require("@cucumber/messages")); +const messages_1 = require("@cucumber/messages"); +const value_checker_1 = require("../value_checker"); +const stopwatch_1 = require("./stopwatch"); +const step_runner_1 = __importDefault(require("./step_runner")); +const attachment_manager_1 = __importDefault(require("./attachment_manager")); +const helpers_1 = require("./helpers"); +const make_suggestion_1 = require("./make_suggestion"); +class TestCaseRunner { + workerId; + attachmentManager; + currentTestCaseStartedId; + currentTestStepId; + eventBroadcaster; + gherkinDocument; + newId; + pickle; + testCase; + maxAttempts; + skip; + filterStackTraces; + supportCodeLibrary; + snippetBuilder; + testStepResults; + world; + worldParameters; + constructor({ workerId, eventBroadcaster, gherkinDocument, newId, pickle, testCase, retries = 0, skip, filterStackTraces, supportCodeLibrary, worldParameters, snippetBuilder, }) { + this.workerId = workerId; + this.attachmentManager = new attachment_manager_1.default(({ data, media, fileName }) => { + if ((0, value_checker_1.doesNotHaveValue)(this.currentTestStepId)) { + throw new Error('Cannot attach when a step/hook is not running. Ensure your step/hook waits for the attach to finish.'); + } + const attachment = { + attachment: { + body: data, + contentEncoding: media.encoding, + mediaType: media.contentType, + fileName, + testCaseStartedId: this.currentTestCaseStartedId, + testStepId: this.currentTestStepId, + timestamp: (0, stopwatch_1.timestamp)(), + }, + }; + this.eventBroadcaster.emit('envelope', attachment); + }); + this.eventBroadcaster = eventBroadcaster; + this.gherkinDocument = gherkinDocument; + this.maxAttempts = 1 + (skip ? 0 : retries); + this.newId = newId; + this.pickle = pickle; + this.testCase = testCase; + this.skip = skip; + this.filterStackTraces = filterStackTraces; + this.supportCodeLibrary = supportCodeLibrary; + this.worldParameters = worldParameters; + this.snippetBuilder = snippetBuilder; + this.resetTestProgressData(); + } + resetTestProgressData() { + this.world = new this.supportCodeLibrary.World({ + attach: this.attachmentManager.create.bind(this.attachmentManager), + log: this.attachmentManager.log.bind(this.attachmentManager), + link: this.attachmentManager.link.bind(this.attachmentManager), + parameters: structuredClone(this.worldParameters), + }); + this.testStepResults = []; + } + getBeforeStepHookDefinitions() { + return this.supportCodeLibrary.beforeTestStepHookDefinitions.filter((hookDefinition) => hookDefinition.appliesToTestCase(this.pickle)); + } + getAfterStepHookDefinitions() { + return this.supportCodeLibrary.afterTestStepHookDefinitions + .slice(0) + .reverse() + .filter((hookDefinition) => hookDefinition.appliesToTestCase(this.pickle)); + } + getWorstStepResult() { + if (this.testStepResults.length === 0) { + return { + status: this.skip + ? messages.TestStepResultStatus.SKIPPED + : messages.TestStepResultStatus.PASSED, + duration: messages.TimeConversion.millisecondsToDuration(0), + }; + } + return (0, messages_1.getWorstTestStepResult)(this.testStepResults); + } + async invokeStep(step, stepDefinition, hookParameter) { + return await step_runner_1.default.run({ + defaultTimeout: this.supportCodeLibrary.defaultTimeout, + filterStackTraces: this.filterStackTraces, + hookParameter, + step, + stepDefinition, + world: this.world, + }); + } + isSkippingSteps() { + return (this.getWorstStepResult().status !== messages.TestStepResultStatus.PASSED); + } + shouldSkipHook(isBeforeHook) { + return this.skip || (this.isSkippingSteps() && isBeforeHook); + } + async aroundTestStep(testStepId, runStepFn) { + const testStepStarted = { + testStepStarted: { + testCaseStartedId: this.currentTestCaseStartedId, + testStepId, + timestamp: (0, stopwatch_1.timestamp)(), + }, + }; + this.eventBroadcaster.emit('envelope', testStepStarted); + this.currentTestStepId = testStepId; + const testStepResult = await runStepFn(); + this.currentTestStepId = null; + this.testStepResults.push(testStepResult); + const testStepFinished = { + testStepFinished: { + testCaseStartedId: this.currentTestCaseStartedId, + testStepId, + testStepResult, + timestamp: (0, stopwatch_1.timestamp)(), + }, + }; + this.eventBroadcaster.emit('envelope', testStepFinished); + } + async run() { + for (let attempt = 0; attempt < this.maxAttempts; attempt++) { + const moreAttemptsRemaining = attempt + 1 < this.maxAttempts; + const willBeRetried = await this.runAttempt(attempt, moreAttemptsRemaining); + if (!willBeRetried) { + break; + } + this.resetTestProgressData(); + } + return this.getWorstStepResult().status; + } + async runAttempt(attempt, moreAttemptsRemaining) { + this.currentTestCaseStartedId = this.newId(); + const testCaseStarted = { + testCaseStarted: { + attempt, + testCaseId: this.testCase.id, + id: this.currentTestCaseStartedId, + timestamp: (0, stopwatch_1.timestamp)(), + }, + }; + if (this.workerId) { + testCaseStarted.testCaseStarted.workerId = this.workerId; + } + this.eventBroadcaster.emit('envelope', testCaseStarted); + // used to determine whether a hook is a Before or After + let didWeRunStepsYet = false; + let error = false; + for (const testStep of this.testCase.testSteps) { + await this.aroundTestStep(testStep.id, async () => { + if ((0, value_checker_1.doesHaveValue)(testStep.hookId)) { + const hookParameter = { + gherkinDocument: this.gherkinDocument, + pickle: this.pickle, + testCaseStartedId: this.currentTestCaseStartedId, + }; + if (didWeRunStepsYet) { + hookParameter.result = this.getWorstStepResult(); + hookParameter.error = error; + hookParameter.willBeRetried = + this.getWorstStepResult().status === + messages.TestStepResultStatus.FAILED && moreAttemptsRemaining; + } + return await this.runHook(findHookDefinition(testStep.hookId, this.supportCodeLibrary), hookParameter, !didWeRunStepsYet); + } + else { + const pickleStep = this.pickle.steps.find((pickleStep) => pickleStep.id === testStep.pickleStepId); + const testStepResult = await this.runStep(pickleStep, testStep); + didWeRunStepsYet = true; + error = testStepResult.error; + return testStepResult.result; + } + }); + } + const willBeRetried = this.getWorstStepResult().status === + messages.TestStepResultStatus.FAILED && moreAttemptsRemaining; + const testCaseFinished = { + testCaseFinished: { + testCaseStartedId: this.currentTestCaseStartedId, + timestamp: (0, stopwatch_1.timestamp)(), + willBeRetried, + }, + }; + this.eventBroadcaster.emit('envelope', testCaseFinished); + return willBeRetried; + } + async runHook(hookDefinition, hookParameter, isBeforeHook) { + if (this.shouldSkipHook(isBeforeHook)) { + return { + status: messages.TestStepResultStatus.SKIPPED, + duration: messages.TimeConversion.millisecondsToDuration(0), + }; + } + const { result } = await this.invokeStep(null, hookDefinition, hookParameter); + return result; + } + async runStepHooks(stepHooks, pickleStep, stepResult) { + const stepHooksResult = []; + const hookParameter = { + gherkinDocument: this.gherkinDocument, + pickle: this.pickle, + pickleStep, + testCaseStartedId: this.currentTestCaseStartedId, + testStepId: this.currentTestStepId, + result: stepResult?.result, + error: stepResult?.error, + }; + for (const stepHookDefinition of stepHooks) { + const { result } = await this.invokeStep(null, stepHookDefinition, hookParameter); + stepHooksResult.push(result); + } + return stepHooksResult; + } + async runStep(pickleStep, testStep) { + const stepDefinitions = testStep.stepDefinitionIds.map((stepDefinitionId) => { + return findStepDefinition(stepDefinitionId, this.supportCodeLibrary); + }); + if (stepDefinitions.length === 0) { + this.eventBroadcaster.emit('envelope', { + suggestion: (0, make_suggestion_1.makeSuggestion)({ + newId: this.newId, + snippetBuilder: this.snippetBuilder, + pickleStep, + }), + }); + return { + result: { + status: messages.TestStepResultStatus.UNDEFINED, + duration: messages.TimeConversion.millisecondsToDuration(0), + }, + }; + } + else if (stepDefinitions.length > 1) { + return { + result: { + message: (0, helpers_1.getAmbiguousStepException)(stepDefinitions), + status: messages.TestStepResultStatus.AMBIGUOUS, + duration: messages.TimeConversion.millisecondsToDuration(0), + }, + }; + } + else if (this.isSkippingSteps()) { + return { + result: { + status: messages.TestStepResultStatus.SKIPPED, + duration: messages.TimeConversion.millisecondsToDuration(0), + }, + }; + } + let stepResult; + let error; + let stepResults = await this.runStepHooks(this.getBeforeStepHookDefinitions(), pickleStep); + if ((0, messages_1.getWorstTestStepResult)(stepResults).status !== + messages.TestStepResultStatus.FAILED) { + stepResult = await this.invokeStep(pickleStep, stepDefinitions[0]); + stepResults.push(stepResult.result); + error = stepResult.error; + } + const afterStepHookResults = await this.runStepHooks(this.getAfterStepHookDefinitions(), pickleStep, stepResult); + stepResults = stepResults.concat(afterStepHookResults); + const finalStepResult = (0, messages_1.getWorstTestStepResult)(stepResults); + let finalDuration = messages.TimeConversion.millisecondsToDuration(0); + for (const result of stepResults) { + finalDuration = messages.TimeConversion.addDurations(finalDuration, result.duration); + } + finalStepResult.duration = finalDuration; + return { + result: finalStepResult, + error, + }; + } +} +exports.default = TestCaseRunner; +function findHookDefinition(id, supportCodeLibrary) { + return [ + ...supportCodeLibrary.beforeTestCaseHookDefinitions, + ...supportCodeLibrary.afterTestCaseHookDefinitions, + ].find((definition) => definition.id === id); +} +function findStepDefinition(id, supportCodeLibrary) { + return supportCodeLibrary.stepDefinitions.find((definition) => definition.id === id); +} +//# sourceMappingURL=test_case_runner.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/test_case_runner.js.map b/node_modules/@cucumber/cucumber/lib/runtime/test_case_runner.js.map new file mode 100644 index 00000000..6cc4112a --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/test_case_runner.js.map @@ -0,0 +1 @@ +{"version":3,"file":"test_case_runner.js","sourceRoot":"","sources":["../../src/runtime/test_case_runner.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventEmitter } from 'node:events'\nimport * as messages from '@cucumber/messages'\nimport {\n Envelope,\n getWorstTestStepResult,\n IdGenerator,\n} from '@cucumber/messages'\nimport { JsonObject } from 'type-fest'\nimport {\n ITestCaseHookParameter,\n ITestStepHookParameter,\n SupportCodeLibrary,\n} from '../support_code_library_builder/types'\nimport TestCaseHookDefinition from '../models/test_case_hook_definition'\nimport TestStepHookDefinition from '../models/test_step_hook_definition'\nimport { IDefinition } from '../models/definition'\nimport { doesHaveValue, doesNotHaveValue } from '../value_checker'\nimport StepDefinition from '../models/step_definition'\nimport { IWorldOptions } from '../support_code_library_builder/world'\nimport StepDefinitionSnippetBuilder from '../formatter/step_definition_snippet_builder'\nimport { timestamp } from './stopwatch'\nimport StepRunner, { RunStepResult } from './step_runner'\nimport AttachmentManager from './attachment_manager'\nimport { getAmbiguousStepException } from './helpers'\nimport { makeSuggestion } from './make_suggestion'\n\nexport interface INewTestCaseRunnerOptions {\n workerId?: string\n eventBroadcaster: EventEmitter\n gherkinDocument: messages.GherkinDocument\n newId: IdGenerator.NewId\n pickle: messages.Pickle\n testCase: messages.TestCase\n retries: number\n skip: boolean\n filterStackTraces: boolean\n supportCodeLibrary: SupportCodeLibrary\n worldParameters: JsonObject\n snippetBuilder: StepDefinitionSnippetBuilder\n}\n\nexport default class TestCaseRunner {\n private readonly workerId: string | undefined\n private readonly attachmentManager: AttachmentManager\n private currentTestCaseStartedId: string\n private currentTestStepId: string\n private readonly eventBroadcaster: EventEmitter\n private readonly gherkinDocument: messages.GherkinDocument\n private readonly newId: IdGenerator.NewId\n private readonly pickle: messages.Pickle\n private readonly testCase: messages.TestCase\n private readonly maxAttempts: number\n private readonly skip: boolean\n private readonly filterStackTraces: boolean\n private readonly supportCodeLibrary: SupportCodeLibrary\n private readonly snippetBuilder: StepDefinitionSnippetBuilder\n private testStepResults: messages.TestStepResult[]\n private world: any\n private readonly worldParameters: JsonObject\n\n constructor({\n workerId,\n eventBroadcaster,\n gherkinDocument,\n newId,\n pickle,\n testCase,\n retries = 0,\n skip,\n filterStackTraces,\n supportCodeLibrary,\n worldParameters,\n snippetBuilder,\n }: INewTestCaseRunnerOptions) {\n this.workerId = workerId\n this.attachmentManager = new AttachmentManager(\n ({ data, media, fileName }) => {\n if (doesNotHaveValue(this.currentTestStepId)) {\n throw new Error(\n 'Cannot attach when a step/hook is not running. Ensure your step/hook waits for the attach to finish.'\n )\n }\n const attachment: messages.Envelope = {\n attachment: {\n body: data,\n contentEncoding: media.encoding,\n mediaType: media.contentType,\n fileName,\n testCaseStartedId: this.currentTestCaseStartedId,\n testStepId: this.currentTestStepId,\n timestamp: timestamp(),\n },\n }\n this.eventBroadcaster.emit('envelope', attachment)\n }\n )\n this.eventBroadcaster = eventBroadcaster\n this.gherkinDocument = gherkinDocument\n this.maxAttempts = 1 + (skip ? 0 : retries)\n this.newId = newId\n this.pickle = pickle\n this.testCase = testCase\n this.skip = skip\n this.filterStackTraces = filterStackTraces\n this.supportCodeLibrary = supportCodeLibrary\n this.worldParameters = worldParameters\n this.snippetBuilder = snippetBuilder\n this.resetTestProgressData()\n }\n\n resetTestProgressData(): void {\n this.world = new this.supportCodeLibrary.World({\n attach: this.attachmentManager.create.bind(this.attachmentManager),\n log: this.attachmentManager.log.bind(this.attachmentManager),\n link: this.attachmentManager.link.bind(this.attachmentManager),\n parameters: structuredClone(this.worldParameters),\n } satisfies IWorldOptions)\n this.testStepResults = []\n }\n\n getBeforeStepHookDefinitions(): TestStepHookDefinition[] {\n return this.supportCodeLibrary.beforeTestStepHookDefinitions.filter(\n (hookDefinition) => hookDefinition.appliesToTestCase(this.pickle)\n )\n }\n\n getAfterStepHookDefinitions(): TestStepHookDefinition[] {\n return this.supportCodeLibrary.afterTestStepHookDefinitions\n .slice(0)\n .reverse()\n .filter((hookDefinition) => hookDefinition.appliesToTestCase(this.pickle))\n }\n\n getWorstStepResult(): messages.TestStepResult {\n if (this.testStepResults.length === 0) {\n return {\n status: this.skip\n ? messages.TestStepResultStatus.SKIPPED\n : messages.TestStepResultStatus.PASSED,\n duration: messages.TimeConversion.millisecondsToDuration(0),\n }\n }\n return getWorstTestStepResult(this.testStepResults)\n }\n\n async invokeStep(\n step: messages.PickleStep,\n stepDefinition: IDefinition,\n hookParameter?: ITestCaseHookParameter\n ): Promise {\n return await StepRunner.run({\n defaultTimeout: this.supportCodeLibrary.defaultTimeout,\n filterStackTraces: this.filterStackTraces,\n hookParameter,\n step,\n stepDefinition,\n world: this.world,\n })\n }\n\n isSkippingSteps(): boolean {\n return (\n this.getWorstStepResult().status !== messages.TestStepResultStatus.PASSED\n )\n }\n\n shouldSkipHook(isBeforeHook: boolean): boolean {\n return this.skip || (this.isSkippingSteps() && isBeforeHook)\n }\n\n async aroundTestStep(\n testStepId: string,\n runStepFn: () => Promise\n ): Promise {\n const testStepStarted: messages.Envelope = {\n testStepStarted: {\n testCaseStartedId: this.currentTestCaseStartedId,\n testStepId,\n timestamp: timestamp(),\n },\n }\n this.eventBroadcaster.emit('envelope', testStepStarted)\n this.currentTestStepId = testStepId\n const testStepResult = await runStepFn()\n this.currentTestStepId = null\n this.testStepResults.push(testStepResult)\n const testStepFinished: messages.Envelope = {\n testStepFinished: {\n testCaseStartedId: this.currentTestCaseStartedId,\n testStepId,\n testStepResult,\n timestamp: timestamp(),\n },\n }\n this.eventBroadcaster.emit('envelope', testStepFinished)\n }\n\n async run(): Promise {\n for (let attempt = 0; attempt < this.maxAttempts; attempt++) {\n const moreAttemptsRemaining = attempt + 1 < this.maxAttempts\n\n const willBeRetried = await this.runAttempt(\n attempt,\n moreAttemptsRemaining\n )\n\n if (!willBeRetried) {\n break\n }\n this.resetTestProgressData()\n }\n return this.getWorstStepResult().status\n }\n\n async runAttempt(\n attempt: number,\n moreAttemptsRemaining: boolean\n ): Promise {\n this.currentTestCaseStartedId = this.newId()\n const testCaseStarted: messages.Envelope = {\n testCaseStarted: {\n attempt,\n testCaseId: this.testCase.id,\n id: this.currentTestCaseStartedId,\n timestamp: timestamp(),\n },\n }\n if (this.workerId) {\n testCaseStarted.testCaseStarted.workerId = this.workerId\n }\n this.eventBroadcaster.emit('envelope', testCaseStarted)\n // used to determine whether a hook is a Before or After\n let didWeRunStepsYet = false\n let error = false\n for (const testStep of this.testCase.testSteps) {\n await this.aroundTestStep(testStep.id, async () => {\n if (doesHaveValue(testStep.hookId)) {\n const hookParameter: ITestCaseHookParameter = {\n gherkinDocument: this.gherkinDocument,\n pickle: this.pickle,\n testCaseStartedId: this.currentTestCaseStartedId,\n }\n if (didWeRunStepsYet) {\n hookParameter.result = this.getWorstStepResult()\n hookParameter.error = error\n hookParameter.willBeRetried =\n this.getWorstStepResult().status ===\n messages.TestStepResultStatus.FAILED && moreAttemptsRemaining\n }\n return await this.runHook(\n findHookDefinition(testStep.hookId, this.supportCodeLibrary),\n hookParameter,\n !didWeRunStepsYet\n )\n } else {\n const pickleStep = this.pickle.steps.find(\n (pickleStep) => pickleStep.id === testStep.pickleStepId\n )\n const testStepResult = await this.runStep(pickleStep, testStep)\n didWeRunStepsYet = true\n error = testStepResult.error\n return testStepResult.result\n }\n })\n }\n\n const willBeRetried =\n this.getWorstStepResult().status ===\n messages.TestStepResultStatus.FAILED && moreAttemptsRemaining\n const testCaseFinished: messages.Envelope = {\n testCaseFinished: {\n testCaseStartedId: this.currentTestCaseStartedId,\n timestamp: timestamp(),\n willBeRetried,\n },\n }\n this.eventBroadcaster.emit('envelope', testCaseFinished)\n\n return willBeRetried\n }\n\n async runHook(\n hookDefinition: TestCaseHookDefinition,\n hookParameter: ITestCaseHookParameter,\n isBeforeHook: boolean\n ): Promise {\n if (this.shouldSkipHook(isBeforeHook)) {\n return {\n status: messages.TestStepResultStatus.SKIPPED,\n duration: messages.TimeConversion.millisecondsToDuration(0),\n }\n }\n const { result } = await this.invokeStep(\n null,\n hookDefinition,\n hookParameter\n )\n return result\n }\n\n async runStepHooks(\n stepHooks: TestStepHookDefinition[],\n pickleStep: messages.PickleStep,\n stepResult?: RunStepResult\n ): Promise {\n const stepHooksResult = []\n const hookParameter: ITestStepHookParameter = {\n gherkinDocument: this.gherkinDocument,\n pickle: this.pickle,\n pickleStep,\n testCaseStartedId: this.currentTestCaseStartedId,\n testStepId: this.currentTestStepId,\n result: stepResult?.result,\n error: stepResult?.error,\n }\n for (const stepHookDefinition of stepHooks) {\n const { result } = await this.invokeStep(\n null,\n stepHookDefinition,\n hookParameter\n )\n stepHooksResult.push(result)\n }\n return stepHooksResult\n }\n\n async runStep(\n pickleStep: messages.PickleStep,\n testStep: messages.TestStep\n ): Promise {\n const stepDefinitions = testStep.stepDefinitionIds.map(\n (stepDefinitionId) => {\n return findStepDefinition(stepDefinitionId, this.supportCodeLibrary)\n }\n )\n if (stepDefinitions.length === 0) {\n this.eventBroadcaster.emit('envelope', {\n suggestion: makeSuggestion({\n newId: this.newId,\n snippetBuilder: this.snippetBuilder,\n pickleStep,\n }),\n } satisfies Envelope)\n return {\n result: {\n status: messages.TestStepResultStatus.UNDEFINED,\n duration: messages.TimeConversion.millisecondsToDuration(0),\n },\n }\n } else if (stepDefinitions.length > 1) {\n return {\n result: {\n message: getAmbiguousStepException(stepDefinitions),\n status: messages.TestStepResultStatus.AMBIGUOUS,\n duration: messages.TimeConversion.millisecondsToDuration(0),\n },\n }\n } else if (this.isSkippingSteps()) {\n return {\n result: {\n status: messages.TestStepResultStatus.SKIPPED,\n duration: messages.TimeConversion.millisecondsToDuration(0),\n },\n }\n }\n\n let stepResult\n let error\n let stepResults = await this.runStepHooks(\n this.getBeforeStepHookDefinitions(),\n pickleStep\n )\n if (\n getWorstTestStepResult(stepResults).status !==\n messages.TestStepResultStatus.FAILED\n ) {\n stepResult = await this.invokeStep(pickleStep, stepDefinitions[0])\n stepResults.push(stepResult.result)\n error = stepResult.error\n }\n const afterStepHookResults = await this.runStepHooks(\n this.getAfterStepHookDefinitions(),\n pickleStep,\n stepResult\n )\n stepResults = stepResults.concat(afterStepHookResults)\n\n const finalStepResult = getWorstTestStepResult(stepResults)\n let finalDuration = messages.TimeConversion.millisecondsToDuration(0)\n for (const result of stepResults) {\n finalDuration = messages.TimeConversion.addDurations(\n finalDuration,\n result.duration\n )\n }\n finalStepResult.duration = finalDuration\n return {\n result: finalStepResult,\n error,\n }\n }\n}\n\nfunction findHookDefinition(\n id: string,\n supportCodeLibrary: SupportCodeLibrary\n): TestCaseHookDefinition {\n return [\n ...supportCodeLibrary.beforeTestCaseHookDefinitions,\n ...supportCodeLibrary.afterTestCaseHookDefinitions,\n ].find((definition) => definition.id === id)\n}\n\nfunction findStepDefinition(\n id: string,\n supportCodeLibrary: SupportCodeLibrary\n): StepDefinition {\n return supportCodeLibrary.stepDefinitions.find(\n (definition) => definition.id === id\n )\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/types.d.ts b/node_modules/@cucumber/cucumber/lib/runtime/types.d.ts new file mode 100644 index 00000000..3bb9aaeb --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/types.d.ts @@ -0,0 +1,17 @@ +import { JsonObject } from 'type-fest'; +import { AssembledTestCase } from '../assemble'; +export interface RuntimeOptions { + dryRun: boolean; + failFast: boolean; + filterStacktraces: boolean; + retry: number; + retryTagFilter: string; + strict: boolean; + worldParameters: JsonObject; +} +export interface Runtime { + run: () => Promise; +} +export interface RuntimeAdapter { + run(assembledTestCases: ReadonlyArray): Promise; +} diff --git a/node_modules/@cucumber/cucumber/lib/runtime/types.js b/node_modules/@cucumber/cucumber/lib/runtime/types.js new file mode 100644 index 00000000..11e638d1 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/types.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/types.js.map b/node_modules/@cucumber/cucumber/lib/runtime/types.js.map new file mode 100644 index 00000000..373de433 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"","sourcesContent":["import { JsonObject } from 'type-fest'\nimport { AssembledTestCase } from '../assemble'\n\nexport interface RuntimeOptions {\n dryRun: boolean\n failFast: boolean\n filterStacktraces: boolean\n retry: number\n retryTagFilter: string\n strict: boolean\n worldParameters: JsonObject\n}\n\nexport interface Runtime {\n run: () => Promise\n}\n\nexport interface RuntimeAdapter {\n run(assembledTestCases: ReadonlyArray): Promise\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/worker.d.ts b/node_modules/@cucumber/cucumber/lib/runtime/worker.d.ts new file mode 100644 index 00000000..61fd8f4a --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/worker.d.ts @@ -0,0 +1,25 @@ +import { EventEmitter } from 'node:events'; +import { IdGenerator, TestStepResult } from '@cucumber/messages'; +import { AssembledTestCase } from '../assemble'; +import { SupportCodeLibrary } from '../support_code_library_builder/types'; +import StepDefinitionSnippetBuilder from '../formatter/step_definition_snippet_builder'; +import { RuntimeOptions } from './types'; +export interface RunHookResult { + result: TestStepResult; + error?: any; +} +export declare class Worker { + private readonly testRunStartedId; + private readonly workerId; + private readonly eventBroadcaster; + private readonly newId; + private readonly options; + private readonly supportCodeLibrary; + private readonly snippetBuilder; + constructor(testRunStartedId: string, workerId: string | undefined, eventBroadcaster: EventEmitter, newId: IdGenerator.NewId, options: RuntimeOptions, supportCodeLibrary: SupportCodeLibrary, snippetBuilder: StepDefinitionSnippetBuilder); + private runTestRunHook; + private wrapTestRunHookError; + runBeforeAllHooks(): Promise; + runTestCase({ gherkinDocument, pickle, testCase }: AssembledTestCase, failing: boolean): Promise; + runAfterAllHooks(): Promise; +} diff --git a/node_modules/@cucumber/cucumber/lib/runtime/worker.js b/node_modules/@cucumber/cucumber/lib/runtime/worker.js new file mode 100644 index 00000000..e4f9e336 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/worker.js @@ -0,0 +1,149 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Worker = void 0; +const messages_1 = require("@cucumber/messages"); +const user_code_runner_1 = __importDefault(require("../user_code_runner")); +const value_checker_1 = require("../value_checker"); +const helpers_1 = require("../formatter/helpers"); +const helpers_2 = require("./helpers"); +const test_case_runner_1 = __importDefault(require("./test_case_runner")); +const scope_1 = require("./scope"); +const format_error_1 = require("./format_error"); +const stopwatch_1 = require("./stopwatch"); +class Worker { + testRunStartedId; + workerId; + eventBroadcaster; + newId; + options; + supportCodeLibrary; + snippetBuilder; + constructor(testRunStartedId, workerId, eventBroadcaster, newId, options, supportCodeLibrary, snippetBuilder) { + this.testRunStartedId = testRunStartedId; + this.workerId = workerId; + this.eventBroadcaster = eventBroadcaster; + this.newId = newId; + this.options = options; + this.supportCodeLibrary = supportCodeLibrary; + this.snippetBuilder = snippetBuilder; + } + async runTestRunHook(hookDefinition) { + const testRunHookStartedId = this.newId(); + this.eventBroadcaster.emit('envelope', { + testRunHookStarted: { + testRunStartedId: this.testRunStartedId, + workerId: this.workerId, + id: testRunHookStartedId, + hookId: hookDefinition.id, + timestamp: (0, stopwatch_1.timestamp)(), + }, + }); + let result; + let error; + if (this.options.dryRun) { + result = { + duration: { + seconds: 0, + nanos: 0, + }, + status: messages_1.TestStepResultStatus.SKIPPED, + }; + } + else { + const stopwatch = (0, stopwatch_1.create)().start(); + const context = { parameters: this.options.worldParameters }; + const { error: rawError } = await (0, scope_1.runInTestRunScope)({ context }, () => user_code_runner_1.default.run({ + argsArray: [], + fn: hookDefinition.code, + thisArg: context, + timeoutInMilliseconds: (0, value_checker_1.valueOrDefault)(hookDefinition.options.timeout, this.supportCodeLibrary.defaultTimeout), + })); + const duration = stopwatch.stop().duration(); + if ((0, value_checker_1.doesHaveValue)(rawError)) { + result = { + duration, + status: messages_1.TestStepResultStatus.FAILED, + ...(0, format_error_1.formatError)(rawError, this.options.filterStacktraces), + }; + error = this.wrapTestRunHookError('a BeforeAll', (0, helpers_1.formatLocation)(hookDefinition), rawError); + } + else { + result = { + duration, + status: messages_1.TestStepResultStatus.PASSED, + }; + } + } + this.eventBroadcaster.emit('envelope', { + testRunHookFinished: { + testRunHookStartedId, + result, + timestamp: (0, stopwatch_1.timestamp)(), + }, + }); + return { + result, + error, + }; + } + wrapTestRunHookError(name, location, error) { + if (!(0, value_checker_1.doesHaveValue)(error)) { + return undefined; + } + let message = `${name} hook errored`; + if (this.workerId) { + message += ` on worker ${this.workerId}`; + } + message += `, process exiting: ${location}`; + return new Error(message, { cause: error }); + } + async runBeforeAllHooks() { + const results = []; + for (const hookDefinition of this.supportCodeLibrary + .beforeTestRunHookDefinitions) { + const result = await this.runTestRunHook(hookDefinition); + results.push(result); + if ((0, value_checker_1.doesHaveValue)(result.error)) { + throw result.error; + } + } + return results; + } + async runTestCase({ gherkinDocument, pickle, testCase }, failing) { + const testCaseRunner = new test_case_runner_1.default({ + workerId: this.workerId, + eventBroadcaster: this.eventBroadcaster, + newId: this.newId, + gherkinDocument, + pickle, + testCase, + retries: (0, helpers_2.retriesForPickle)(pickle, this.options), + skip: this.options.dryRun || (this.options.failFast && failing), + filterStackTraces: this.options.filterStacktraces, + supportCodeLibrary: this.supportCodeLibrary, + worldParameters: this.options.worldParameters, + snippetBuilder: this.snippetBuilder, + }); + const status = await testCaseRunner.run(); + return !(0, helpers_2.shouldCauseFailure)(status, this.options); + } + async runAfterAllHooks() { + const results = []; + const reversed = [ + ...this.supportCodeLibrary.afterTestRunHookDefinitions, + ].reverse(); + for (const hookDefinition of reversed) { + const result = await this.runTestRunHook(hookDefinition); + results.push(result); + if ((0, value_checker_1.doesHaveValue)(result.error)) { + throw result.error; + } + } + return results; + } +} +exports.Worker = Worker; +//# sourceMappingURL=worker.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/runtime/worker.js.map b/node_modules/@cucumber/cucumber/lib/runtime/worker.js.map new file mode 100644 index 00000000..a4895d39 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/runtime/worker.js.map @@ -0,0 +1 @@ +{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/runtime/worker.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventEmitter } from 'node:events'\nimport {\n Envelope,\n IdGenerator,\n TestStepResult,\n TestStepResultStatus,\n} from '@cucumber/messages'\nimport { AssembledTestCase } from '../assemble'\nimport { SupportCodeLibrary } from '../support_code_library_builder/types'\nimport UserCodeRunner from '../user_code_runner'\nimport { doesHaveValue, valueOrDefault } from '../value_checker'\nimport TestRunHookDefinition from '../models/test_run_hook_definition'\nimport { formatLocation } from '../formatter/helpers'\nimport StepDefinitionSnippetBuilder from '../formatter/step_definition_snippet_builder'\nimport { retriesForPickle, shouldCauseFailure } from './helpers'\nimport TestCaseRunner from './test_case_runner'\nimport { runInTestRunScope } from './scope'\nimport { formatError } from './format_error'\nimport { create, timestamp } from './stopwatch'\nimport { RuntimeOptions } from './types'\n\nexport interface RunHookResult {\n result: TestStepResult\n error?: any\n}\n\nexport class Worker {\n constructor(\n private readonly testRunStartedId: string,\n private readonly workerId: string | undefined,\n private readonly eventBroadcaster: EventEmitter,\n private readonly newId: IdGenerator.NewId,\n private readonly options: RuntimeOptions,\n private readonly supportCodeLibrary: SupportCodeLibrary,\n private readonly snippetBuilder: StepDefinitionSnippetBuilder\n ) {}\n\n private async runTestRunHook(\n hookDefinition: TestRunHookDefinition\n ): Promise {\n const testRunHookStartedId = this.newId()\n this.eventBroadcaster.emit('envelope', {\n testRunHookStarted: {\n testRunStartedId: this.testRunStartedId,\n workerId: this.workerId,\n id: testRunHookStartedId,\n hookId: hookDefinition.id,\n timestamp: timestamp(),\n },\n } satisfies Envelope)\n\n let result: TestStepResult\n let error: any\n if (this.options.dryRun) {\n result = {\n duration: {\n seconds: 0,\n nanos: 0,\n },\n status: TestStepResultStatus.SKIPPED,\n }\n } else {\n const stopwatch = create().start()\n const context = { parameters: this.options.worldParameters }\n const { error: rawError } = await runInTestRunScope({ context }, () =>\n UserCodeRunner.run({\n argsArray: [],\n fn: hookDefinition.code,\n thisArg: context,\n timeoutInMilliseconds: valueOrDefault(\n hookDefinition.options.timeout,\n this.supportCodeLibrary.defaultTimeout\n ),\n })\n )\n const duration = stopwatch.stop().duration()\n\n if (doesHaveValue(rawError)) {\n result = {\n duration,\n status: TestStepResultStatus.FAILED,\n ...formatError(rawError, this.options.filterStacktraces),\n }\n error = this.wrapTestRunHookError(\n 'a BeforeAll',\n formatLocation(hookDefinition),\n rawError\n )\n } else {\n result = {\n duration,\n status: TestStepResultStatus.PASSED,\n }\n }\n }\n\n this.eventBroadcaster.emit('envelope', {\n testRunHookFinished: {\n testRunHookStartedId,\n result,\n timestamp: timestamp(),\n },\n } satisfies Envelope)\n\n return {\n result,\n error,\n }\n }\n\n private wrapTestRunHookError(\n name: string,\n location: string,\n error: any\n ): any | undefined {\n if (!doesHaveValue(error)) {\n return undefined\n }\n let message = `${name} hook errored`\n if (this.workerId) {\n message += ` on worker ${this.workerId}`\n }\n message += `, process exiting: ${location}`\n return new Error(message, { cause: error })\n }\n\n async runBeforeAllHooks(): Promise {\n const results: RunHookResult[] = []\n for (const hookDefinition of this.supportCodeLibrary\n .beforeTestRunHookDefinitions) {\n const result = await this.runTestRunHook(hookDefinition)\n results.push(result)\n if (doesHaveValue(result.error)) {\n throw result.error\n }\n }\n return results\n }\n\n async runTestCase(\n { gherkinDocument, pickle, testCase }: AssembledTestCase,\n failing: boolean\n ): Promise {\n const testCaseRunner = new TestCaseRunner({\n workerId: this.workerId,\n eventBroadcaster: this.eventBroadcaster,\n newId: this.newId,\n gherkinDocument,\n pickle,\n testCase,\n retries: retriesForPickle(pickle, this.options),\n skip: this.options.dryRun || (this.options.failFast && failing),\n filterStackTraces: this.options.filterStacktraces,\n supportCodeLibrary: this.supportCodeLibrary,\n worldParameters: this.options.worldParameters,\n snippetBuilder: this.snippetBuilder,\n })\n\n const status = await testCaseRunner.run()\n\n return !shouldCauseFailure(status, this.options)\n }\n\n async runAfterAllHooks(): Promise {\n const results: RunHookResult[] = []\n const reversed = [\n ...this.supportCodeLibrary.afterTestRunHookDefinitions,\n ].reverse()\n for (const hookDefinition of reversed) {\n const result = await this.runTestRunHook(hookDefinition)\n results.push(result)\n if (doesHaveValue(result.error)) {\n throw result.error\n }\n }\n return results\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/sharding/index.d.ts b/node_modules/@cucumber/cucumber/lib/sharding/index.d.ts new file mode 100644 index 00000000..4ac5bd01 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/sharding/index.d.ts @@ -0,0 +1,2 @@ +import { shardingPlugin } from './sharding_plugin'; +export default shardingPlugin; diff --git a/node_modules/@cucumber/cucumber/lib/sharding/index.js b/node_modules/@cucumber/cucumber/lib/sharding/index.js new file mode 100644 index 00000000..57b06103 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/sharding/index.js @@ -0,0 +1,5 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const sharding_plugin_1 = require("./sharding_plugin"); +exports.default = sharding_plugin_1.shardingPlugin; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/sharding/index.js.map b/node_modules/@cucumber/cucumber/lib/sharding/index.js.map new file mode 100644 index 00000000..05b49c0c --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/sharding/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sharding/index.ts"],"names":[],"mappings":";;AAAA,uDAAkD;AAElD,kBAAe,gCAAc,CAAA","sourcesContent":["import { shardingPlugin } from './sharding_plugin'\n\nexport default shardingPlugin\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/sharding/sharding_plugin.d.ts b/node_modules/@cucumber/cucumber/lib/sharding/sharding_plugin.d.ts new file mode 100644 index 00000000..b7706a95 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/sharding/sharding_plugin.d.ts @@ -0,0 +1,2 @@ +import { InternalPlugin } from '../plugin'; +export declare const shardingPlugin: InternalPlugin; diff --git a/node_modules/@cucumber/cucumber/lib/sharding/sharding_plugin.js b/node_modules/@cucumber/cucumber/lib/sharding/sharding_plugin.js new file mode 100644 index 00000000..ac637238 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/sharding/sharding_plugin.js @@ -0,0 +1,18 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.shardingPlugin = void 0; +exports.shardingPlugin = { + type: 'plugin', + coordinator: async ({ transform, options }) => { + transform('pickles:filter', async (allPickles) => { + if (!options.shard) { + return allPickles; + } + const [shardIndexStr, shardTotalStr] = options.shard.split('/'); + const shardIndex = parseInt(shardIndexStr, 10) - 1; + const shardTotal = parseInt(shardTotalStr, 10); + return allPickles.filter((_, i) => i % shardTotal === shardIndex); + }); + }, +}; +//# sourceMappingURL=sharding_plugin.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/sharding/sharding_plugin.js.map b/node_modules/@cucumber/cucumber/lib/sharding/sharding_plugin.js.map new file mode 100644 index 00000000..ec17448e --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/sharding/sharding_plugin.js.map @@ -0,0 +1 @@ +{"version":3,"file":"sharding_plugin.js","sourceRoot":"","sources":["../../src/sharding/sharding_plugin.ts"],"names":[],"mappings":";;;AAEa,QAAA,cAAc,GAAmB;IAC5C,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE;QAC5C,SAAS,CAAC,gBAAgB,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;YAC/C,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACnB,OAAO,UAAU,CAAA;YACnB,CAAC;YAED,MAAM,CAAC,aAAa,EAAE,aAAa,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAC/D,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC,GAAG,CAAC,CAAA;YAClD,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC,CAAA;YAE9C,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,UAAU,KAAK,UAAU,CAAC,CAAA;QACnE,CAAC,CAAC,CAAA;IACJ,CAAC;CACF,CAAA","sourcesContent":["import { InternalPlugin } from '../plugin'\n\nexport const shardingPlugin: InternalPlugin = {\n type: 'plugin',\n coordinator: async ({ transform, options }) => {\n transform('pickles:filter', async (allPickles) => {\n if (!options.shard) {\n return allPickles\n }\n\n const [shardIndexStr, shardTotalStr] = options.shard.split('/')\n const shardIndex = parseInt(shardIndexStr, 10) - 1\n const shardTotal = parseInt(shardTotalStr, 10)\n\n return allPickles.filter((_, i) => i % shardTotal === shardIndex)\n })\n },\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/step_arguments.d.ts b/node_modules/@cucumber/cucumber/lib/step_arguments.d.ts new file mode 100644 index 00000000..522016d6 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/step_arguments.d.ts @@ -0,0 +1,6 @@ +import * as messages from '@cucumber/messages'; +export interface IPickleStepArgumentFunctionMap { + dataTable: (arg: messages.PickleTable) => T; + docString: (arg: messages.PickleDocString) => T; +} +export declare function parseStepArgument(arg: messages.PickleStepArgument, mapping: IPickleStepArgumentFunctionMap): T; diff --git a/node_modules/@cucumber/cucumber/lib/step_arguments.js b/node_modules/@cucumber/cucumber/lib/step_arguments.js new file mode 100644 index 00000000..8a81c2a7 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/step_arguments.js @@ -0,0 +1,18 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseStepArgument = parseStepArgument; +const node_util_1 = __importDefault(require("node:util")); +const value_checker_1 = require("./value_checker"); +function parseStepArgument(arg, mapping) { + if ((0, value_checker_1.doesHaveValue)(arg.dataTable)) { + return mapping.dataTable(arg.dataTable); + } + else if ((0, value_checker_1.doesHaveValue)(arg.docString)) { + return mapping.docString(arg.docString); + } + throw new Error(`Unknown step argument: ${node_util_1.default.inspect(arg)}`); +} +//# sourceMappingURL=step_arguments.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/step_arguments.js.map b/node_modules/@cucumber/cucumber/lib/step_arguments.js.map new file mode 100644 index 00000000..a01e21b0 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/step_arguments.js.map @@ -0,0 +1 @@ +{"version":3,"file":"step_arguments.js","sourceRoot":"","sources":["../src/step_arguments.ts"],"names":[],"mappings":";;;;;AASA,8CAUC;AAnBD,0DAA4B;AAE5B,mDAA+C;AAO/C,SAAgB,iBAAiB,CAC/B,GAAgC,EAChC,OAA0C;IAE1C,IAAI,IAAA,6BAAa,EAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACzC,CAAC;SAAM,IAAI,IAAA,6BAAa,EAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACxC,OAAO,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACzC,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,0BAA0B,mBAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AAChE,CAAC","sourcesContent":["import util from 'node:util'\nimport * as messages from '@cucumber/messages'\nimport { doesHaveValue } from './value_checker'\n\nexport interface IPickleStepArgumentFunctionMap {\n dataTable: (arg: messages.PickleTable) => T\n docString: (arg: messages.PickleDocString) => T\n}\n\nexport function parseStepArgument(\n arg: messages.PickleStepArgument,\n mapping: IPickleStepArgumentFunctionMap\n): T {\n if (doesHaveValue(arg.dataTable)) {\n return mapping.dataTable(arg.dataTable)\n } else if (doesHaveValue(arg.docString)) {\n return mapping.docString(arg.docString)\n }\n throw new Error(`Unknown step argument: ${util.inspect(arg)}`)\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/support_code_library_builder/build_parameter_type.d.ts b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/build_parameter_type.d.ts new file mode 100644 index 00000000..2704de0a --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/build_parameter_type.d.ts @@ -0,0 +1,3 @@ +import { ParameterType } from '@cucumber/cucumber-expressions'; +import { IParameterTypeDefinition } from './types'; +export declare function buildParameterType({ name, regexp, transformer, useForSnippets, preferForRegexpMatch, }: IParameterTypeDefinition): ParameterType; diff --git a/node_modules/@cucumber/cucumber/lib/support_code_library_builder/build_parameter_type.js b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/build_parameter_type.js new file mode 100644 index 00000000..1997d3fc --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/build_parameter_type.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.buildParameterType = buildParameterType; +const cucumber_expressions_1 = require("@cucumber/cucumber-expressions"); +function buildParameterType({ name, regexp, transformer, useForSnippets, preferForRegexpMatch, }) { + if (typeof useForSnippets !== 'boolean') + useForSnippets = true; + if (typeof preferForRegexpMatch !== 'boolean') + preferForRegexpMatch = false; + return new cucumber_expressions_1.ParameterType(name, regexp, null, transformer, useForSnippets, preferForRegexpMatch); +} +//# sourceMappingURL=build_parameter_type.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/support_code_library_builder/build_parameter_type.js.map b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/build_parameter_type.js.map new file mode 100644 index 00000000..ffbe0409 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/build_parameter_type.js.map @@ -0,0 +1 @@ +{"version":3,"file":"build_parameter_type.js","sourceRoot":"","sources":["../../src/support_code_library_builder/build_parameter_type.ts"],"names":[],"mappings":";;AAGA,gDAiBC;AApBD,yEAA8D;AAG9D,SAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,MAAM,EACN,WAAW,EACX,cAAc,EACd,oBAAoB,GACU;IAC9B,IAAI,OAAO,cAAc,KAAK,SAAS;QAAE,cAAc,GAAG,IAAI,CAAA;IAC9D,IAAI,OAAO,oBAAoB,KAAK,SAAS;QAAE,oBAAoB,GAAG,KAAK,CAAA;IAC3E,OAAO,IAAI,oCAAa,CACtB,IAAI,EACJ,MAAM,EACN,IAAI,EACJ,WAAW,EACX,cAAc,EACd,oBAAoB,CACrB,CAAA;AACH,CAAC","sourcesContent":["import { ParameterType } from '@cucumber/cucumber-expressions'\nimport { IParameterTypeDefinition } from './types'\n\nexport function buildParameterType({\n name,\n regexp,\n transformer,\n useForSnippets,\n preferForRegexpMatch,\n}: IParameterTypeDefinition): ParameterType {\n if (typeof useForSnippets !== 'boolean') useForSnippets = true\n if (typeof preferForRegexpMatch !== 'boolean') preferForRegexpMatch = false\n return new ParameterType(\n name,\n regexp,\n null,\n transformer,\n useForSnippets,\n preferForRegexpMatch\n )\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/support_code_library_builder/context.d.ts b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/context.d.ts new file mode 100644 index 00000000..5efc5c05 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/context.d.ts @@ -0,0 +1,3 @@ +export interface IContext { + readonly parameters: ParametersType; +} diff --git a/node_modules/@cucumber/cucumber/lib/support_code_library_builder/context.js b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/context.js new file mode 100644 index 00000000..9de85337 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/context.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=context.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/support_code_library_builder/context.js.map b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/context.js.map new file mode 100644 index 00000000..2f5c15c6 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/context.js.map @@ -0,0 +1 @@ +{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/support_code_library_builder/context.ts"],"names":[],"mappings":"","sourcesContent":["export interface IContext {\n readonly parameters: ParametersType\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/support_code_library_builder/get_definition_line_and_uri.d.ts b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/get_definition_line_and_uri.d.ts new file mode 100644 index 00000000..49b8f43b --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/get_definition_line_and_uri.d.ts @@ -0,0 +1,3 @@ +import { isFileNameInCucumber } from '../filter_stack_trace'; +import { ILineAndUri } from '../types'; +export declare function getDefinitionLineAndUri(cwd: string, isExcluded?: typeof isFileNameInCucumber): ILineAndUri; diff --git a/node_modules/@cucumber/cucumber/lib/support_code_library_builder/get_definition_line_and_uri.js b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/get_definition_line_and_uri.js new file mode 100644 index 00000000..941c0bb7 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/get_definition_line_and_uri.js @@ -0,0 +1,32 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getDefinitionLineAndUri = getDefinitionLineAndUri; +const node_path_1 = __importDefault(require("node:path")); +const node_url_1 = require("node:url"); +const error_stack_parser_1 = __importDefault(require("error-stack-parser")); +const filter_stack_trace_1 = require("../filter_stack_trace"); +const value_checker_1 = require("../value_checker"); +function getDefinitionLineAndUri(cwd, isExcluded = filter_stack_trace_1.isFileNameInCucumber) { + let line; + let uri; + const stackframes = error_stack_parser_1.default.parse(new Error()); + const stackframe = stackframes.find((frame) => frame.fileName !== __filename && !isExcluded(frame.fileName)); + if (stackframe != null) { + line = stackframe.getLineNumber(); + uri = stackframe.getFileName(); + if ((0, value_checker_1.doesHaveValue)(uri)) { + if (uri.startsWith('file://')) { + uri = (0, node_url_1.fileURLToPath)(uri); + } + uri = node_path_1.default.relative(cwd, uri); + } + } + return { + line: (0, value_checker_1.valueOrDefault)(line, 0), + uri: (0, value_checker_1.valueOrDefault)(uri, 'unknown'), + }; +} +//# sourceMappingURL=get_definition_line_and_uri.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/support_code_library_builder/get_definition_line_and_uri.js.map b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/get_definition_line_and_uri.js.map new file mode 100644 index 00000000..db8af056 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/get_definition_line_and_uri.js.map @@ -0,0 +1 @@ +{"version":3,"file":"get_definition_line_and_uri.js","sourceRoot":"","sources":["../../src/support_code_library_builder/get_definition_line_and_uri.ts"],"names":[],"mappings":";;;;;AAOA,0DA0BC;AAjCD,0DAA4B;AAC5B,uCAAwC;AACxC,4EAAiE;AACjE,8DAA4D;AAC5D,oDAAgE;AAGhE,SAAgB,uBAAuB,CACrC,GAAW,EACX,UAAU,GAAG,yCAAoB;IAEjC,IAAI,IAAY,CAAA;IAChB,IAAI,GAAW,CAAA;IACf,MAAM,WAAW,GAAiB,4BAAgB,CAAC,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC,CAAA;IACrE,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CACjC,CAAC,KAAiB,EAAE,EAAE,CACpB,KAAK,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAC/D,CAAA;IACD,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,UAAU,CAAC,aAAa,EAAE,CAAA;QACjC,GAAG,GAAG,UAAU,CAAC,WAAW,EAAE,CAAA;QAC9B,IAAI,IAAA,6BAAa,EAAC,GAAG,CAAC,EAAE,CAAC;YACvB,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC9B,GAAG,GAAG,IAAA,wBAAa,EAAC,GAAG,CAAC,CAAA;YAC1B,CAAC;YACD,GAAG,GAAG,mBAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QAC/B,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,IAAA,8BAAc,EAAC,IAAI,EAAE,CAAC,CAAC;QAC7B,GAAG,EAAE,IAAA,8BAAc,EAAC,GAAG,EAAE,SAAS,CAAC;KACpC,CAAA;AACH,CAAC","sourcesContent":["import path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport errorStackParser, { StackFrame } from 'error-stack-parser'\nimport { isFileNameInCucumber } from '../filter_stack_trace'\nimport { doesHaveValue, valueOrDefault } from '../value_checker'\nimport { ILineAndUri } from '../types'\n\nexport function getDefinitionLineAndUri(\n cwd: string,\n isExcluded = isFileNameInCucumber\n): ILineAndUri {\n let line: number\n let uri: string\n const stackframes: StackFrame[] = errorStackParser.parse(new Error())\n const stackframe = stackframes.find(\n (frame: StackFrame) =>\n frame.fileName !== __filename && !isExcluded(frame.fileName)\n )\n if (stackframe != null) {\n line = stackframe.getLineNumber()\n uri = stackframe.getFileName()\n if (doesHaveValue(uri)) {\n if (uri.startsWith('file://')) {\n uri = fileURLToPath(uri)\n }\n uri = path.relative(cwd, uri)\n }\n }\n\n return {\n line: valueOrDefault(line, 0),\n uri: valueOrDefault(uri, 'unknown'),\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/support_code_library_builder/index.d.ts b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/index.d.ts new file mode 100644 index 00000000..c59ee931 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/index.d.ts @@ -0,0 +1,79 @@ +import { IdGenerator } from '@cucumber/messages'; +import * as messages from '@cucumber/messages'; +import TestCaseHookDefinition from '../models/test_case_hook_definition'; +import TestStepHookDefinition from '../models/test_step_hook_definition'; +import TestRunHookDefinition from '../models/test_run_hook_definition'; +import StepDefinition from '../models/step_definition'; +import { GherkinStepKeyword } from '../models/gherkin_step_keyword'; +import { IDefineSupportCodeMethods, IDefineTestCaseHookOptions, IDefineTestStepHookOptions, IDefineTestRunHookOptions, IParameterTypeDefinition, SupportCodeLibrary, TestCaseHookFunction, TestStepHookFunction, ISupportCodeCoordinates, IDefineStep, CanonicalSupportCodeIds } from './types'; +interface IStepDefinitionConfig { + code: Function; + line: number; + options: any; + order: number; + keyword: GherkinStepKeyword; + pattern: string | RegExp; + uri: string; +} +interface ITestCaseHookDefinitionConfig { + code: any; + line: number; + options: any; + order: number; + uri: string; +} +interface ITestStepHookDefinitionConfig { + code: Function; + line: number; + options: any; + order: number; + uri: string; +} +interface ITestRunHookDefinitionConfig { + code: Function; + line: number; + options: any; + order: number; + uri: string; +} +export declare class SupportCodeLibraryBuilder { + readonly methods: IDefineSupportCodeMethods; + private originalCoordinates; + private afterTestCaseHookDefinitionConfigs; + private afterTestRunHookDefinitionConfigs; + private afterTestStepHookDefinitionConfigs; + private beforeTestCaseHookDefinitionConfigs; + private beforeTestRunHookDefinitionConfigs; + private beforeTestStepHookDefinitionConfigs; + private cwd; + private defaultTimeout; + private definitionFunctionWrapper; + private definitionOrder; + private newId; + private parameterTypeRegistry; + private stepDefinitionConfigs; + private World; + private parallelCanAssign; + private status; + constructor(); + defineParameterType(options: IParameterTypeDefinition): void; + defineStep(keyword: GherkinStepKeyword, getCollection: () => IStepDefinitionConfig[]): IDefineStep; + defineTestCaseHook(getCollection: () => ITestCaseHookDefinitionConfig[]): (options: string | IDefineTestCaseHookOptions | TestCaseHookFunction, code?: TestCaseHookFunction) => void; + defineTestStepHook(getCollection: () => ITestStepHookDefinitionConfig[]): (options: string | IDefineTestStepHookOptions | TestStepHookFunction, code?: TestStepHookFunction) => void; + defineTestRunHook(getCollection: () => ITestRunHookDefinitionConfig[]): (options: IDefineTestRunHookOptions | Function, code?: Function) => void; + wrapCode({ code, wrapperOptions, }: { + code: Function; + wrapperOptions: any; + }): Function; + buildTestCaseHookDefinitions(configs: ITestCaseHookDefinitionConfig[], canonicalIds?: string[]): TestCaseHookDefinition[]; + buildTestStepHookDefinitions(configs: ITestStepHookDefinitionConfig[]): TestStepHookDefinition[]; + buildTestRunHookDefinitions(configs: ITestRunHookDefinitionConfig[], canonicalIds?: string[]): TestRunHookDefinition[]; + buildStepDefinitions(canonicalIds?: string[]): { + stepDefinitions: StepDefinition[]; + undefinedParameterTypes: messages.UndefinedParameterType[]; + }; + finalize(canonicalIds?: CanonicalSupportCodeIds): SupportCodeLibrary; + reset(cwd: string, newId: IdGenerator.NewId, originalCoordinates?: ISupportCodeCoordinates): void; +} +declare const _default: SupportCodeLibraryBuilder; +export default _default; diff --git a/node_modules/@cucumber/cucumber/lib/support_code_library_builder/index.js b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/index.js new file mode 100644 index 00000000..7e5ad7ab --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/index.js @@ -0,0 +1,334 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SupportCodeLibraryBuilder = void 0; +const util_arity_1 = __importDefault(require("util-arity")); +const cucumber_expressions_1 = require("@cucumber/cucumber-expressions"); +const test_case_hook_definition_1 = __importDefault(require("../models/test_case_hook_definition")); +const test_step_hook_definition_1 = __importDefault(require("../models/test_step_hook_definition")); +const test_run_hook_definition_1 = __importDefault(require("../models/test_run_hook_definition")); +const step_definition_1 = __importDefault(require("../models/step_definition")); +const helpers_1 = require("../formatter/helpers"); +const value_checker_1 = require("../value_checker"); +const validate_arguments_1 = __importDefault(require("./validate_arguments")); +const world_1 = __importDefault(require("./world")); +const get_definition_line_and_uri_1 = require("./get_definition_line_and_uri"); +const build_parameter_type_1 = require("./build_parameter_type"); +const sourced_parameter_type_registry_1 = require("./sourced_parameter_type_registry"); +class SupportCodeLibraryBuilder { + methods; + originalCoordinates; + afterTestCaseHookDefinitionConfigs; + afterTestRunHookDefinitionConfigs; + afterTestStepHookDefinitionConfigs; + beforeTestCaseHookDefinitionConfigs; + beforeTestRunHookDefinitionConfigs; + beforeTestStepHookDefinitionConfigs; + cwd; + defaultTimeout; + definitionFunctionWrapper; + definitionOrder; + newId; + parameterTypeRegistry; + stepDefinitionConfigs; + World; + parallelCanAssign; + status = 'PENDING'; + constructor() { + const methods = { + After: this.defineTestCaseHook(() => this.afterTestCaseHookDefinitionConfigs), + AfterAll: this.defineTestRunHook(() => this.afterTestRunHookDefinitionConfigs), + AfterStep: this.defineTestStepHook(() => this.afterTestStepHookDefinitionConfigs), + Before: this.defineTestCaseHook(() => this.beforeTestCaseHookDefinitionConfigs), + BeforeAll: this.defineTestRunHook(() => this.beforeTestRunHookDefinitionConfigs), + BeforeStep: this.defineTestStepHook(() => this.beforeTestStepHookDefinitionConfigs), + defineParameterType: this.defineParameterType.bind(this), + defineStep: this.defineStep('Unknown', () => this.stepDefinitionConfigs), + Given: this.defineStep('Given', () => this.stepDefinitionConfigs), + setDefaultTimeout: (milliseconds) => { + this.defaultTimeout = milliseconds; + }, + setDefinitionFunctionWrapper: (fn) => { + this.definitionFunctionWrapper = fn; + }, + setWorldConstructor: (fn) => { + this.World = fn; + }, + setParallelCanAssign: (fn) => { + this.parallelCanAssign = fn; + }, + Then: this.defineStep('Then', () => this.stepDefinitionConfigs), + When: this.defineStep('When', () => this.stepDefinitionConfigs), + }; + const checkInstall = (method) => { + if (this.status === 'PENDING') { + throw new Error(` + You're calling functions (e.g. "${method}") on an instance of Cucumber that isn't running (status: ${this.status}). + This means you may have an invalid installation, potentially due to: + - Cucumber being installed globally + - A project structure where your support code is depending on a different instance of Cucumber + Either way, you'll need to address this in order for Cucumber to work. + See https://github.com/cucumber/cucumber-js/blob/main/docs/installation.md#invalid-installations + `); + } + }; + this.methods = new Proxy(methods, { + get(target, method) { + return (...args) => { + checkInstall(method); + // @ts-expect-error difficult to type this correctly + return target[method](...args); + }; + }, + }); + } + defineParameterType(options) { + const parameterType = (0, build_parameter_type_1.buildParameterType)(options); + const source = (0, get_definition_line_and_uri_1.getDefinitionLineAndUri)(this.cwd); + this.parameterTypeRegistry.defineSourcedParameterType(parameterType, source, this.definitionOrder++); + } + defineStep(keyword, getCollection) { + return (pattern, options, code) => { + if (typeof options === 'function') { + code = options; + options = {}; + } + const { line, uri } = (0, get_definition_line_and_uri_1.getDefinitionLineAndUri)(this.cwd); + (0, validate_arguments_1.default)({ + args: { code, pattern, options }, + fnName: 'defineStep', + location: (0, helpers_1.formatLocation)({ line, uri }), + }); + getCollection().push({ + code, + line, + options, + order: this.definitionOrder++, + keyword, + pattern, + uri, + }); + }; + } + defineTestCaseHook(getCollection) { + return (options, code) => { + if (typeof options === 'string') { + options = { tags: options }; + } + else if (typeof options === 'function') { + code = options; + options = {}; + } + const { line, uri } = (0, get_definition_line_and_uri_1.getDefinitionLineAndUri)(this.cwd); + (0, validate_arguments_1.default)({ + args: { code, options }, + fnName: 'defineTestCaseHook', + location: (0, helpers_1.formatLocation)({ line, uri }), + }); + getCollection().push({ + code, + line, + options, + order: this.definitionOrder++, + uri, + }); + }; + } + defineTestStepHook(getCollection) { + return (options, code) => { + if (typeof options === 'string') { + options = { tags: options }; + } + else if (typeof options === 'function') { + code = options; + options = {}; + } + const { line, uri } = (0, get_definition_line_and_uri_1.getDefinitionLineAndUri)(this.cwd); + (0, validate_arguments_1.default)({ + args: { code, options }, + fnName: 'defineTestStepHook', + location: (0, helpers_1.formatLocation)({ line, uri }), + }); + getCollection().push({ + code, + line, + options, + order: this.definitionOrder++, + uri, + }); + }; + } + defineTestRunHook(getCollection) { + return (options, code) => { + if (typeof options === 'function') { + code = options; + options = {}; + } + const { line, uri } = (0, get_definition_line_and_uri_1.getDefinitionLineAndUri)(this.cwd); + (0, validate_arguments_1.default)({ + args: { code, options }, + fnName: 'defineTestRunHook', + location: (0, helpers_1.formatLocation)({ line, uri }), + }); + getCollection().push({ + code, + line, + options, + order: this.definitionOrder++, + uri, + }); + }; + } + wrapCode({ code, wrapperOptions, }) { + if ((0, value_checker_1.doesHaveValue)(this.definitionFunctionWrapper)) { + const codeLength = code.length; + const wrappedCode = this.definitionFunctionWrapper(code, wrapperOptions); + if (wrappedCode !== code) { + return (0, util_arity_1.default)(codeLength, wrappedCode); + } + return wrappedCode; + } + return code; + } + buildTestCaseHookDefinitions(configs, canonicalIds) { + return configs.map(({ code, line, options, order, uri }, index) => { + const wrappedCode = this.wrapCode({ + code, + wrapperOptions: options.wrapperOptions, + }); + return new test_case_hook_definition_1.default({ + code: wrappedCode, + id: canonicalIds ? canonicalIds[index] : this.newId(), + line, + options, + order, + unwrappedCode: code, + uri, + }); + }); + } + buildTestStepHookDefinitions(configs) { + return configs.map(({ code, line, options, order, uri }) => { + const wrappedCode = this.wrapCode({ + code, + wrapperOptions: options.wrapperOptions, + }); + return new test_step_hook_definition_1.default({ + code: wrappedCode, + id: this.newId(), + line, + options, + order, + unwrappedCode: code, + uri, + }); + }); + } + buildTestRunHookDefinitions(configs, canonicalIds) { + return configs.map(({ code, line, options, order, uri }, index) => { + const wrappedCode = this.wrapCode({ + code, + wrapperOptions: options.wrapperOptions, + }); + return new test_run_hook_definition_1.default({ + code: wrappedCode, + id: canonicalIds ? canonicalIds[index] : this.newId(), + line, + options: options, + order, + unwrappedCode: code, + uri, + }); + }); + } + buildStepDefinitions(canonicalIds) { + const stepDefinitions = []; + const undefinedParameterTypes = []; + this.stepDefinitionConfigs.forEach(({ code, line, options, order, keyword, pattern, uri }, index) => { + let expression; + if (typeof pattern === 'string') { + try { + expression = new cucumber_expressions_1.CucumberExpression(pattern, this.parameterTypeRegistry); + } + catch (e) { + if ((0, value_checker_1.doesHaveValue)(e.undefinedParameterTypeName)) { + undefinedParameterTypes.push({ + name: e.undefinedParameterTypeName, + expression: pattern, + }); + return; + } + throw e; + } + } + else { + expression = new cucumber_expressions_1.RegularExpression(pattern, this.parameterTypeRegistry); + } + const wrappedCode = this.wrapCode({ + code, + wrapperOptions: options.wrapperOptions, + }); + stepDefinitions.push(new step_definition_1.default({ + code: wrappedCode, + expression, + id: canonicalIds ? canonicalIds[index] : this.newId(), + line, + options, + order, + keyword, + pattern, + unwrappedCode: code, + uri, + })); + }); + return { stepDefinitions, undefinedParameterTypes }; + } + finalize(canonicalIds) { + this.status = 'FINALIZED'; + const stepDefinitionsResult = this.buildStepDefinitions(canonicalIds?.stepDefinitionIds); + return { + originalCoordinates: this.originalCoordinates, + afterTestCaseHookDefinitions: this.buildTestCaseHookDefinitions(this.afterTestCaseHookDefinitionConfigs, canonicalIds?.afterTestCaseHookDefinitionIds), + afterTestRunHookDefinitions: this.buildTestRunHookDefinitions(this.afterTestRunHookDefinitionConfigs, canonicalIds?.afterTestRunHookDefinitionIds), + afterTestStepHookDefinitions: this.buildTestStepHookDefinitions(this.afterTestStepHookDefinitionConfigs), + beforeTestCaseHookDefinitions: this.buildTestCaseHookDefinitions(this.beforeTestCaseHookDefinitionConfigs, canonicalIds?.beforeTestCaseHookDefinitionIds), + beforeTestRunHookDefinitions: this.buildTestRunHookDefinitions(this.beforeTestRunHookDefinitionConfigs, canonicalIds?.beforeTestRunHookDefinitionIds), + beforeTestStepHookDefinitions: this.buildTestStepHookDefinitions(this.beforeTestStepHookDefinitionConfigs), + defaultTimeout: this.defaultTimeout, + parameterTypeRegistry: this.parameterTypeRegistry, + undefinedParameterTypes: stepDefinitionsResult.undefinedParameterTypes, + stepDefinitions: stepDefinitionsResult.stepDefinitions, + World: this.World, + parallelCanAssign: this.parallelCanAssign, + }; + } + reset(cwd, newId, originalCoordinates = { + requireModules: [], + requirePaths: [], + importPaths: [], + loaders: [], + }) { + this.cwd = cwd; + this.newId = newId; + this.originalCoordinates = originalCoordinates; + this.afterTestCaseHookDefinitionConfigs = []; + this.afterTestRunHookDefinitionConfigs = []; + this.afterTestStepHookDefinitionConfigs = []; + this.beforeTestCaseHookDefinitionConfigs = []; + this.beforeTestRunHookDefinitionConfigs = []; + this.beforeTestStepHookDefinitionConfigs = []; + this.definitionFunctionWrapper = null; + this.definitionOrder = 0; + this.defaultTimeout = 5000; + this.parameterTypeRegistry = new sourced_parameter_type_registry_1.SourcedParameterTypeRegistry(); + this.stepDefinitionConfigs = []; + this.parallelCanAssign = () => true; + this.World = world_1.default; + this.status = 'OPEN'; + } +} +exports.SupportCodeLibraryBuilder = SupportCodeLibraryBuilder; +exports.default = new SupportCodeLibraryBuilder(); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/support_code_library_builder/index.js.map b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/index.js.map new file mode 100644 index 00000000..a2007fc6 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/support_code_library_builder/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { IdGenerator } from '@cucumber/messages'\nimport * as messages from '@cucumber/messages'\nimport arity from 'util-arity'\nimport {\n CucumberExpression,\n RegularExpression,\n} from '@cucumber/cucumber-expressions'\nimport TestCaseHookDefinition from '../models/test_case_hook_definition'\nimport TestStepHookDefinition from '../models/test_step_hook_definition'\nimport TestRunHookDefinition, {\n ITestRunHookDefinitionOptions,\n} from '../models/test_run_hook_definition'\nimport StepDefinition from '../models/step_definition'\nimport { formatLocation } from '../formatter/helpers'\nimport { doesHaveValue } from '../value_checker'\nimport { GherkinStepKeyword } from '../models/gherkin_step_keyword'\nimport validateArguments from './validate_arguments'\n\nimport {\n DefineStepPattern,\n IDefineStepOptions,\n IDefineSupportCodeMethods,\n IDefineTestCaseHookOptions,\n IDefineTestStepHookOptions,\n IDefineTestRunHookOptions,\n IParameterTypeDefinition,\n SupportCodeLibrary,\n TestCaseHookFunction,\n TestStepHookFunction,\n ParallelAssignmentValidator,\n ISupportCodeCoordinates,\n IDefineStep,\n CanonicalSupportCodeIds,\n} from './types'\nimport World from './world'\nimport { getDefinitionLineAndUri } from './get_definition_line_and_uri'\nimport { buildParameterType } from './build_parameter_type'\nimport { SourcedParameterTypeRegistry } from './sourced_parameter_type_registry'\n\ninterface IStepDefinitionConfig {\n code: Function\n line: number\n options: any\n order: number\n keyword: GherkinStepKeyword\n pattern: string | RegExp\n uri: string\n}\n\ninterface ITestCaseHookDefinitionConfig {\n code: any\n line: number\n options: any\n order: number\n uri: string\n}\n\ninterface ITestStepHookDefinitionConfig {\n code: Function\n line: number\n options: any\n order: number\n uri: string\n}\n\ninterface ITestRunHookDefinitionConfig {\n code: Function\n line: number\n options: any\n order: number\n uri: string\n}\n\ntype LibraryStatus = 'PENDING' | 'OPEN' | 'FINALIZED'\n\nexport class SupportCodeLibraryBuilder {\n public readonly methods: IDefineSupportCodeMethods\n private originalCoordinates: ISupportCodeCoordinates\n private afterTestCaseHookDefinitionConfigs: ITestCaseHookDefinitionConfig[]\n private afterTestRunHookDefinitionConfigs: ITestRunHookDefinitionConfig[]\n private afterTestStepHookDefinitionConfigs: ITestStepHookDefinitionConfig[]\n private beforeTestCaseHookDefinitionConfigs: ITestCaseHookDefinitionConfig[]\n private beforeTestRunHookDefinitionConfigs: ITestRunHookDefinitionConfig[]\n private beforeTestStepHookDefinitionConfigs: ITestStepHookDefinitionConfig[]\n private cwd: string\n private defaultTimeout: number\n private definitionFunctionWrapper: any\n private definitionOrder: number\n private newId: IdGenerator.NewId\n private parameterTypeRegistry: SourcedParameterTypeRegistry\n private stepDefinitionConfigs: IStepDefinitionConfig[]\n private World: any\n private parallelCanAssign: ParallelAssignmentValidator\n private status: LibraryStatus = 'PENDING'\n\n constructor() {\n const methods: IDefineSupportCodeMethods = {\n After: this.defineTestCaseHook(\n () => this.afterTestCaseHookDefinitionConfigs\n ),\n AfterAll: this.defineTestRunHook(\n () => this.afterTestRunHookDefinitionConfigs\n ),\n AfterStep: this.defineTestStepHook(\n () => this.afterTestStepHookDefinitionConfigs\n ),\n Before: this.defineTestCaseHook(\n () => this.beforeTestCaseHookDefinitionConfigs\n ),\n BeforeAll: this.defineTestRunHook(\n () => this.beforeTestRunHookDefinitionConfigs\n ),\n BeforeStep: this.defineTestStepHook(\n () => this.beforeTestStepHookDefinitionConfigs\n ),\n defineParameterType: this.defineParameterType.bind(this),\n defineStep: this.defineStep('Unknown', () => this.stepDefinitionConfigs),\n Given: this.defineStep('Given', () => this.stepDefinitionConfigs),\n setDefaultTimeout: (milliseconds) => {\n this.defaultTimeout = milliseconds\n },\n setDefinitionFunctionWrapper: (fn) => {\n this.definitionFunctionWrapper = fn\n },\n setWorldConstructor: (fn) => {\n this.World = fn\n },\n setParallelCanAssign: (fn: ParallelAssignmentValidator): void => {\n this.parallelCanAssign = fn\n },\n Then: this.defineStep('Then', () => this.stepDefinitionConfigs),\n When: this.defineStep('When', () => this.stepDefinitionConfigs),\n }\n const checkInstall = (method: string) => {\n if (this.status === 'PENDING') {\n throw new Error(\n `\n You're calling functions (e.g. \"${method}\") on an instance of Cucumber that isn't running (status: ${this.status}).\n This means you may have an invalid installation, potentially due to:\n - Cucumber being installed globally\n - A project structure where your support code is depending on a different instance of Cucumber\n Either way, you'll need to address this in order for Cucumber to work.\n See https://github.com/cucumber/cucumber-js/blob/main/docs/installation.md#invalid-installations\n `\n )\n }\n }\n this.methods = new Proxy(methods, {\n get(\n target: IDefineSupportCodeMethods,\n method: keyof IDefineSupportCodeMethods\n ): any {\n return (...args: any[]) => {\n checkInstall(method)\n // @ts-expect-error difficult to type this correctly\n return target[method](...args)\n }\n },\n })\n }\n\n defineParameterType(options: IParameterTypeDefinition): void {\n const parameterType = buildParameterType(options)\n const source = getDefinitionLineAndUri(this.cwd)\n this.parameterTypeRegistry.defineSourcedParameterType(\n parameterType,\n source,\n this.definitionOrder++\n )\n }\n\n defineStep(\n keyword: GherkinStepKeyword,\n getCollection: () => IStepDefinitionConfig[]\n ): IDefineStep {\n return (\n pattern: DefineStepPattern,\n options: IDefineStepOptions | Function,\n code?: Function\n ) => {\n if (typeof options === 'function') {\n code = options\n options = {}\n }\n const { line, uri } = getDefinitionLineAndUri(this.cwd)\n validateArguments({\n args: { code, pattern, options },\n fnName: 'defineStep',\n location: formatLocation({ line, uri }),\n })\n getCollection().push({\n code,\n line,\n options,\n order: this.definitionOrder++,\n keyword,\n pattern,\n uri,\n })\n }\n }\n\n defineTestCaseHook(\n getCollection: () => ITestCaseHookDefinitionConfig[]\n ): (\n options:\n | string\n | IDefineTestCaseHookOptions\n | TestCaseHookFunction,\n code?: TestCaseHookFunction\n ) => void {\n return (\n options:\n | string\n | IDefineTestCaseHookOptions\n | TestCaseHookFunction,\n code?: TestCaseHookFunction\n ) => {\n if (typeof options === 'string') {\n options = { tags: options }\n } else if (typeof options === 'function') {\n code = options\n options = {}\n }\n const { line, uri } = getDefinitionLineAndUri(this.cwd)\n validateArguments({\n args: { code, options },\n fnName: 'defineTestCaseHook',\n location: formatLocation({ line, uri }),\n })\n getCollection().push({\n code,\n line,\n options,\n order: this.definitionOrder++,\n uri,\n })\n }\n }\n\n defineTestStepHook(\n getCollection: () => ITestStepHookDefinitionConfig[]\n ): (\n options:\n | string\n | IDefineTestStepHookOptions\n | TestStepHookFunction,\n code?: TestStepHookFunction\n ) => void {\n return (\n options:\n | string\n | IDefineTestStepHookOptions\n | TestStepHookFunction,\n code?: TestStepHookFunction\n ) => {\n if (typeof options === 'string') {\n options = { tags: options }\n } else if (typeof options === 'function') {\n code = options\n options = {}\n }\n const { line, uri } = getDefinitionLineAndUri(this.cwd)\n validateArguments({\n args: { code, options },\n fnName: 'defineTestStepHook',\n location: formatLocation({ line, uri }),\n })\n getCollection().push({\n code,\n line,\n options,\n order: this.definitionOrder++,\n uri,\n })\n }\n }\n\n defineTestRunHook(\n getCollection: () => ITestRunHookDefinitionConfig[]\n ): (options: IDefineTestRunHookOptions | Function, code?: Function) => void {\n return (options: IDefineTestRunHookOptions | Function, code?: Function) => {\n if (typeof options === 'function') {\n code = options\n options = {}\n }\n const { line, uri } = getDefinitionLineAndUri(this.cwd)\n validateArguments({\n args: { code, options },\n fnName: 'defineTestRunHook',\n location: formatLocation({ line, uri }),\n })\n getCollection().push({\n code,\n line,\n options,\n order: this.definitionOrder++,\n uri,\n })\n }\n }\n\n wrapCode({\n code,\n wrapperOptions,\n }: {\n code: Function\n wrapperOptions: any\n }): Function {\n if (doesHaveValue(this.definitionFunctionWrapper)) {\n const codeLength = code.length\n const wrappedCode = this.definitionFunctionWrapper(code, wrapperOptions)\n if (wrappedCode !== code) {\n return arity(codeLength, wrappedCode)\n }\n return wrappedCode\n }\n return code\n }\n\n buildTestCaseHookDefinitions(\n configs: ITestCaseHookDefinitionConfig[],\n canonicalIds?: string[]\n ): TestCaseHookDefinition[] {\n return configs.map(({ code, line, options, order, uri }, index) => {\n const wrappedCode = this.wrapCode({\n code,\n wrapperOptions: options.wrapperOptions,\n })\n return new TestCaseHookDefinition({\n code: wrappedCode,\n id: canonicalIds ? canonicalIds[index] : this.newId(),\n line,\n options,\n order,\n unwrappedCode: code,\n uri,\n })\n })\n }\n\n buildTestStepHookDefinitions(\n configs: ITestStepHookDefinitionConfig[]\n ): TestStepHookDefinition[] {\n return configs.map(({ code, line, options, order, uri }) => {\n const wrappedCode = this.wrapCode({\n code,\n wrapperOptions: options.wrapperOptions,\n })\n return new TestStepHookDefinition({\n code: wrappedCode,\n id: this.newId(),\n line,\n options,\n order,\n unwrappedCode: code,\n uri,\n })\n })\n }\n\n buildTestRunHookDefinitions(\n configs: ITestRunHookDefinitionConfig[],\n canonicalIds?: string[]\n ): TestRunHookDefinition[] {\n return configs.map(({ code, line, options, order, uri }, index) => {\n const wrappedCode = this.wrapCode({\n code,\n wrapperOptions: options.wrapperOptions,\n })\n return new TestRunHookDefinition({\n code: wrappedCode,\n id: canonicalIds ? canonicalIds[index] : this.newId(),\n line,\n options: options as ITestRunHookDefinitionOptions,\n order,\n unwrappedCode: code,\n uri,\n })\n })\n }\n\n buildStepDefinitions(canonicalIds?: string[]): {\n stepDefinitions: StepDefinition[]\n undefinedParameterTypes: messages.UndefinedParameterType[]\n } {\n const stepDefinitions: StepDefinition[] = []\n const undefinedParameterTypes: messages.UndefinedParameterType[] = []\n this.stepDefinitionConfigs.forEach(\n ({ code, line, options, order, keyword, pattern, uri }, index) => {\n let expression\n if (typeof pattern === 'string') {\n try {\n expression = new CucumberExpression(\n pattern,\n this.parameterTypeRegistry\n )\n } catch (e) {\n if (doesHaveValue(e.undefinedParameterTypeName)) {\n undefinedParameterTypes.push({\n name: e.undefinedParameterTypeName,\n expression: pattern,\n })\n return\n }\n throw e\n }\n } else {\n expression = new RegularExpression(\n pattern,\n this.parameterTypeRegistry\n )\n }\n\n const wrappedCode = this.wrapCode({\n code,\n wrapperOptions: options.wrapperOptions,\n })\n stepDefinitions.push(\n new StepDefinition({\n code: wrappedCode,\n expression,\n id: canonicalIds ? canonicalIds[index] : this.newId(),\n line,\n options,\n order,\n keyword,\n pattern,\n unwrappedCode: code,\n uri,\n })\n )\n }\n )\n return { stepDefinitions, undefinedParameterTypes }\n }\n\n finalize(canonicalIds?: CanonicalSupportCodeIds): SupportCodeLibrary {\n this.status = 'FINALIZED'\n const stepDefinitionsResult = this.buildStepDefinitions(\n canonicalIds?.stepDefinitionIds\n )\n return {\n originalCoordinates: this.originalCoordinates,\n afterTestCaseHookDefinitions: this.buildTestCaseHookDefinitions(\n this.afterTestCaseHookDefinitionConfigs,\n canonicalIds?.afterTestCaseHookDefinitionIds\n ),\n afterTestRunHookDefinitions: this.buildTestRunHookDefinitions(\n this.afterTestRunHookDefinitionConfigs,\n canonicalIds?.afterTestRunHookDefinitionIds\n ),\n afterTestStepHookDefinitions: this.buildTestStepHookDefinitions(\n this.afterTestStepHookDefinitionConfigs\n ),\n beforeTestCaseHookDefinitions: this.buildTestCaseHookDefinitions(\n this.beforeTestCaseHookDefinitionConfigs,\n canonicalIds?.beforeTestCaseHookDefinitionIds\n ),\n beforeTestRunHookDefinitions: this.buildTestRunHookDefinitions(\n this.beforeTestRunHookDefinitionConfigs,\n canonicalIds?.beforeTestRunHookDefinitionIds\n ),\n beforeTestStepHookDefinitions: this.buildTestStepHookDefinitions(\n this.beforeTestStepHookDefinitionConfigs\n ),\n defaultTimeout: this.defaultTimeout,\n parameterTypeRegistry: this.parameterTypeRegistry,\n undefinedParameterTypes: stepDefinitionsResult.undefinedParameterTypes,\n stepDefinitions: stepDefinitionsResult.stepDefinitions,\n World: this.World,\n parallelCanAssign: this.parallelCanAssign,\n }\n }\n\n reset(\n cwd: string,\n newId: IdGenerator.NewId,\n originalCoordinates: ISupportCodeCoordinates = {\n requireModules: [],\n requirePaths: [],\n importPaths: [],\n loaders: [],\n }\n ): void {\n this.cwd = cwd\n this.newId = newId\n this.originalCoordinates = originalCoordinates\n this.afterTestCaseHookDefinitionConfigs = []\n this.afterTestRunHookDefinitionConfigs = []\n this.afterTestStepHookDefinitionConfigs = []\n this.beforeTestCaseHookDefinitionConfigs = []\n this.beforeTestRunHookDefinitionConfigs = []\n this.beforeTestStepHookDefinitionConfigs = []\n this.definitionFunctionWrapper = null\n this.definitionOrder = 0\n this.defaultTimeout = 5000\n this.parameterTypeRegistry = new SourcedParameterTypeRegistry()\n this.stepDefinitionConfigs = []\n this.parallelCanAssign = () => true\n this.World = World\n this.status = 'OPEN'\n }\n}\n\nexport default new SupportCodeLibraryBuilder()\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/support_code_library_builder/parallel_can_assign_helpers.d.ts b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/parallel_can_assign_helpers.d.ts new file mode 100644 index 00000000..2d15e252 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/parallel_can_assign_helpers.d.ts @@ -0,0 +1,2 @@ +import { ParallelAssignmentValidator } from './types'; +export declare function atMostOnePicklePerTag(tagNames: string[]): ParallelAssignmentValidator; diff --git a/node_modules/@cucumber/cucumber/lib/support_code_library_builder/parallel_can_assign_helpers.js b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/parallel_can_assign_helpers.js new file mode 100644 index 00000000..067b9ddd --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/parallel_can_assign_helpers.js @@ -0,0 +1,15 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.atMostOnePicklePerTag = atMostOnePicklePerTag; +function hasTag(pickle, tagName) { + return pickle.tags.some((t) => t.name == tagName); +} +function atMostOnePicklePerTag(tagNames) { + return (inQuestion, inProgress) => { + return tagNames.every((tagName) => { + return (!hasTag(inQuestion, tagName) || + inProgress.every((p) => !hasTag(p, tagName))); + }); + }; +} +//# sourceMappingURL=parallel_can_assign_helpers.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/support_code_library_builder/parallel_can_assign_helpers.js.map b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/parallel_can_assign_helpers.js.map new file mode 100644 index 00000000..205b9a9a --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/parallel_can_assign_helpers.js.map @@ -0,0 +1 @@ +{"version":3,"file":"parallel_can_assign_helpers.js","sourceRoot":"","sources":["../../src/support_code_library_builder/parallel_can_assign_helpers.ts"],"names":[],"mappings":";;AAOA,sDAWC;AAfD,SAAS,MAAM,CAAC,MAAuB,EAAE,OAAe;IACtD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,CAAA;AACnD,CAAC;AAED,SAAgB,qBAAqB,CACnC,QAAkB;IAElB,OAAO,CAAC,UAA2B,EAAE,UAA6B,EAAE,EAAE;QACpE,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE;YAChC,OAAO,CACL,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC;gBAC5B,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAC7C,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;AACH,CAAC","sourcesContent":["import * as messages from '@cucumber/messages'\nimport { ParallelAssignmentValidator } from './types'\n\nfunction hasTag(pickle: messages.Pickle, tagName: string): boolean {\n return pickle.tags.some((t) => t.name == tagName)\n}\n\nexport function atMostOnePicklePerTag(\n tagNames: string[]\n): ParallelAssignmentValidator {\n return (inQuestion: messages.Pickle, inProgress: messages.Pickle[]) => {\n return tagNames.every((tagName) => {\n return (\n !hasTag(inQuestion, tagName) ||\n inProgress.every((p) => !hasTag(p, tagName))\n )\n })\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/support_code_library_builder/sourced_parameter_type_registry.d.ts b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/sourced_parameter_type_registry.d.ts new file mode 100644 index 00000000..a1961aff --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/sourced_parameter_type_registry.d.ts @@ -0,0 +1,9 @@ +import { ParameterType, ParameterTypeRegistry } from '@cucumber/cucumber-expressions'; +import { ILineAndUri } from '../types'; +export declare class SourcedParameterTypeRegistry extends ParameterTypeRegistry { + private parameterTypeToSource; + defineSourcedParameterType(parameterType: ParameterType, source: ILineAndUri, order: number): void; + lookupSource(parameterType: ParameterType): ILineAndUri & { + order: number; + }; +} diff --git a/node_modules/@cucumber/cucumber/lib/support_code_library_builder/sourced_parameter_type_registry.js b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/sourced_parameter_type_registry.js new file mode 100644 index 00000000..8792bd08 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/sourced_parameter_type_registry.js @@ -0,0 +1,16 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SourcedParameterTypeRegistry = void 0; +const cucumber_expressions_1 = require("@cucumber/cucumber-expressions"); +class SourcedParameterTypeRegistry extends cucumber_expressions_1.ParameterTypeRegistry { + parameterTypeToSource = new WeakMap(); + defineSourcedParameterType(parameterType, source, order) { + this.defineParameterType(parameterType); + this.parameterTypeToSource.set(parameterType, { ...source, order }); + } + lookupSource(parameterType) { + return this.parameterTypeToSource.get(parameterType); + } +} +exports.SourcedParameterTypeRegistry = SourcedParameterTypeRegistry; +//# sourceMappingURL=sourced_parameter_type_registry.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/support_code_library_builder/sourced_parameter_type_registry.js.map b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/sourced_parameter_type_registry.js.map new file mode 100644 index 00000000..346ebd66 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/sourced_parameter_type_registry.js.map @@ -0,0 +1 @@ +{"version":3,"file":"sourced_parameter_type_registry.js","sourceRoot":"","sources":["../../src/support_code_library_builder/sourced_parameter_type_registry.ts"],"names":[],"mappings":";;;AAAA,yEAGuC;AAGvC,MAAa,4BAA6B,SAAQ,4CAAqB;IAC7D,qBAAqB,GAGzB,IAAI,OAAO,EAAE,CAAA;IAEjB,0BAA0B,CACxB,aAAqC,EACrC,MAAmB,EACnB,KAAa;QAEb,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAA;QACvC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;IACrE,CAAC;IAED,YAAY,CAAC,aAAqC;QAChD,OAAO,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;IACtD,CAAC;CACF;AAlBD,oEAkBC","sourcesContent":["import {\n ParameterType,\n ParameterTypeRegistry,\n} from '@cucumber/cucumber-expressions'\nimport { ILineAndUri } from '../types'\n\nexport class SourcedParameterTypeRegistry extends ParameterTypeRegistry {\n private parameterTypeToSource: WeakMap<\n ParameterType,\n ILineAndUri & { order: number }\n > = new WeakMap()\n\n defineSourcedParameterType(\n parameterType: ParameterType,\n source: ILineAndUri,\n order: number\n ) {\n this.defineParameterType(parameterType)\n this.parameterTypeToSource.set(parameterType, { ...source, order })\n }\n\n lookupSource(parameterType: ParameterType) {\n return this.parameterTypeToSource.get(parameterType)\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/support_code_library_builder/types.d.ts b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/types.d.ts new file mode 100644 index 00000000..4b55160f --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/types.d.ts @@ -0,0 +1,103 @@ +import * as messages from '@cucumber/messages'; +import { JsonObject } from 'type-fest'; +import TestCaseHookDefinition from '../models/test_case_hook_definition'; +import TestStepHookDefinition from '../models/test_step_hook_definition'; +import TestRunHookDefinition from '../models/test_run_hook_definition'; +import StepDefinition from '../models/step_definition'; +import { IWorld } from './world'; +import { SourcedParameterTypeRegistry } from './sourced_parameter_type_registry'; +export type DefineStepPattern = string | RegExp; +export type ParallelAssignmentValidator = (pickle: messages.Pickle, runningPickles: messages.Pickle[]) => boolean; +export interface ITestCaseHookParameter { + gherkinDocument: messages.GherkinDocument; + pickle: messages.Pickle; + result?: messages.TestStepResult; + error?: any; + willBeRetried?: boolean; + testCaseStartedId: string; +} +export interface ITestStepHookParameter { + gherkinDocument: messages.GherkinDocument; + pickle: messages.Pickle; + pickleStep: messages.PickleStep; + result: messages.TestStepResult; + error?: any; + testCaseStartedId: string; + testStepId: string; +} +export type TestRunHookFunction = (this: { + parameters: JsonObject; +}) => any | Promise; +export type TestCaseHookFunction = (this: WorldType, arg: ITestCaseHookParameter) => any | Promise; +export type TestStepHookFunction = (this: WorldType, arg: ITestStepHookParameter) => any | Promise; +export type TestStepFunction = (this: WorldType, ...args: any[]) => any | Promise; +export interface IDefineStepOptions { + timeout?: number; + wrapperOptions?: any; +} +export interface IDefineTestCaseHookOptions { + name?: string; + tags?: string; + timeout?: number; +} +export interface IDefineTestStepHookOptions { + tags?: string; + timeout?: number; +} +export interface IDefineTestRunHookOptions { + name?: string; + timeout?: number; +} +export interface IParameterTypeDefinition { + name: string; + regexp: readonly RegExp[] | readonly string[] | RegExp | string; + transformer?: (...match: string[]) => T; + useForSnippets?: boolean; + preferForRegexpMatch?: boolean; +} +export type IDefineStep = ((pattern: DefineStepPattern, code: TestStepFunction) => void) & ((pattern: DefineStepPattern, options: IDefineStepOptions, code: TestStepFunction) => void); +export interface IDefineSupportCodeMethods { + defineParameterType: (options: IParameterTypeDefinition) => void; + defineStep: IDefineStep; + setDefaultTimeout: (milliseconds: number) => void; + setDefinitionFunctionWrapper: (fn: Function) => void; + setParallelCanAssign: (fn: ParallelAssignmentValidator) => void; + setWorldConstructor: (fn: any) => void; + After: ((code: TestCaseHookFunction) => void) & ((tags: string, code: TestCaseHookFunction) => void) & ((options: IDefineTestCaseHookOptions, code: TestCaseHookFunction) => void); + AfterStep: ((code: TestStepHookFunction) => void) & ((tags: string, code: TestStepHookFunction) => void) & ((options: IDefineTestStepHookOptions, code: TestStepHookFunction) => void); + AfterAll: ((code: TestRunHookFunction) => void) & ((options: IDefineTestRunHookOptions, code: TestRunHookFunction) => void); + Before: ((code: TestCaseHookFunction) => void) & ((tags: string, code: TestCaseHookFunction) => void) & ((options: IDefineTestCaseHookOptions, code: TestCaseHookFunction) => void); + BeforeStep: ((code: TestStepHookFunction) => void) & ((tags: string, code: TestStepHookFunction) => void) & ((options: IDefineTestStepHookOptions, code: TestStepHookFunction) => void); + BeforeAll: ((code: TestRunHookFunction) => void) & ((options: IDefineTestRunHookOptions, code: TestRunHookFunction) => void); + Given: IDefineStep; + Then: IDefineStep; + When: IDefineStep; +} +export interface ISupportCodeCoordinates { + requireModules: string[]; + requirePaths: string[]; + importPaths: string[]; + loaders: string[]; +} +export interface CanonicalSupportCodeIds { + stepDefinitionIds: string[]; + beforeTestCaseHookDefinitionIds: string[]; + afterTestCaseHookDefinitionIds: string[]; + beforeTestRunHookDefinitionIds: string[]; + afterTestRunHookDefinitionIds: string[]; +} +export interface SupportCodeLibrary { + readonly originalCoordinates: ISupportCodeCoordinates; + readonly afterTestCaseHookDefinitions: TestCaseHookDefinition[]; + readonly afterTestStepHookDefinitions: TestStepHookDefinition[]; + readonly afterTestRunHookDefinitions: TestRunHookDefinition[]; + readonly beforeTestCaseHookDefinitions: TestCaseHookDefinition[]; + readonly beforeTestStepHookDefinitions: TestStepHookDefinition[]; + readonly beforeTestRunHookDefinitions: TestRunHookDefinition[]; + readonly defaultTimeout: number; + readonly stepDefinitions: StepDefinition[]; + readonly undefinedParameterTypes: messages.UndefinedParameterType[]; + readonly parameterTypeRegistry: SourcedParameterTypeRegistry; + readonly World: any; + readonly parallelCanAssign: ParallelAssignmentValidator; +} diff --git a/node_modules/@cucumber/cucumber/lib/support_code_library_builder/types.js b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/types.js new file mode 100644 index 00000000..11e638d1 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/types.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/support_code_library_builder/types.js.map b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/types.js.map new file mode 100644 index 00000000..c95da1f9 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/support_code_library_builder/types.ts"],"names":[],"mappings":"","sourcesContent":["import * as messages from '@cucumber/messages'\nimport { JsonObject } from 'type-fest'\nimport TestCaseHookDefinition from '../models/test_case_hook_definition'\nimport TestStepHookDefinition from '../models/test_step_hook_definition'\nimport TestRunHookDefinition from '../models/test_run_hook_definition'\nimport StepDefinition from '../models/step_definition'\nimport { IWorld } from './world'\nimport { SourcedParameterTypeRegistry } from './sourced_parameter_type_registry'\n\nexport type DefineStepPattern = string | RegExp\nexport type ParallelAssignmentValidator = (\n pickle: messages.Pickle,\n runningPickles: messages.Pickle[]\n) => boolean\nexport interface ITestCaseHookParameter {\n gherkinDocument: messages.GherkinDocument\n pickle: messages.Pickle\n result?: messages.TestStepResult\n error?: any\n willBeRetried?: boolean\n testCaseStartedId: string\n}\n\nexport interface ITestStepHookParameter {\n gherkinDocument: messages.GherkinDocument\n pickle: messages.Pickle\n pickleStep: messages.PickleStep\n result: messages.TestStepResult\n error?: any\n testCaseStartedId: string\n testStepId: string\n}\n\nexport type TestRunHookFunction = (this: {\n parameters: JsonObject\n}) => any | Promise\n\nexport type TestCaseHookFunction = (\n this: WorldType,\n arg: ITestCaseHookParameter\n) => any | Promise\n\nexport type TestStepHookFunction = (\n this: WorldType,\n arg: ITestStepHookParameter\n) => any | Promise\n\nexport type TestStepFunction = (\n this: WorldType,\n ...args: any[]\n) => any | Promise\n\nexport interface IDefineStepOptions {\n timeout?: number\n wrapperOptions?: any\n}\n\nexport interface IDefineTestCaseHookOptions {\n name?: string\n tags?: string\n timeout?: number\n}\n\nexport interface IDefineTestStepHookOptions {\n tags?: string\n timeout?: number\n}\n\nexport interface IDefineTestRunHookOptions {\n name?: string\n timeout?: number\n}\n\nexport interface IParameterTypeDefinition {\n name: string\n regexp: readonly RegExp[] | readonly string[] | RegExp | string\n transformer?: (...match: string[]) => T\n useForSnippets?: boolean\n preferForRegexpMatch?: boolean\n}\n\nexport type IDefineStep = ((\n pattern: DefineStepPattern,\n code: TestStepFunction\n) => void) &\n ((\n pattern: DefineStepPattern,\n options: IDefineStepOptions,\n code: TestStepFunction\n ) => void)\n\nexport interface IDefineSupportCodeMethods {\n defineParameterType: (options: IParameterTypeDefinition) => void\n defineStep: IDefineStep\n setDefaultTimeout: (milliseconds: number) => void\n setDefinitionFunctionWrapper: (fn: Function) => void\n setParallelCanAssign: (fn: ParallelAssignmentValidator) => void\n setWorldConstructor: (fn: any) => void\n After: ((code: TestCaseHookFunction) => void) &\n ((\n tags: string,\n code: TestCaseHookFunction\n ) => void) &\n ((\n options: IDefineTestCaseHookOptions,\n code: TestCaseHookFunction\n ) => void)\n AfterStep: ((\n code: TestStepHookFunction\n ) => void) &\n ((\n tags: string,\n code: TestStepHookFunction\n ) => void) &\n ((\n options: IDefineTestStepHookOptions,\n code: TestStepHookFunction\n ) => void)\n AfterAll: ((code: TestRunHookFunction) => void) &\n ((options: IDefineTestRunHookOptions, code: TestRunHookFunction) => void)\n Before: ((\n code: TestCaseHookFunction\n ) => void) &\n ((\n tags: string,\n code: TestCaseHookFunction\n ) => void) &\n ((\n options: IDefineTestCaseHookOptions,\n code: TestCaseHookFunction\n ) => void)\n BeforeStep: ((\n code: TestStepHookFunction\n ) => void) &\n ((\n tags: string,\n code: TestStepHookFunction\n ) => void) &\n ((\n options: IDefineTestStepHookOptions,\n code: TestStepHookFunction\n ) => void)\n BeforeAll: ((code: TestRunHookFunction) => void) &\n ((options: IDefineTestRunHookOptions, code: TestRunHookFunction) => void)\n Given: IDefineStep\n Then: IDefineStep\n When: IDefineStep\n}\n\nexport interface ISupportCodeCoordinates {\n requireModules: string[]\n requirePaths: string[]\n importPaths: string[]\n loaders: string[]\n}\n\nexport interface CanonicalSupportCodeIds {\n stepDefinitionIds: string[]\n beforeTestCaseHookDefinitionIds: string[]\n afterTestCaseHookDefinitionIds: string[]\n beforeTestRunHookDefinitionIds: string[]\n afterTestRunHookDefinitionIds: string[]\n}\n\nexport interface SupportCodeLibrary {\n readonly originalCoordinates: ISupportCodeCoordinates\n readonly afterTestCaseHookDefinitions: TestCaseHookDefinition[]\n readonly afterTestStepHookDefinitions: TestStepHookDefinition[]\n readonly afterTestRunHookDefinitions: TestRunHookDefinition[]\n readonly beforeTestCaseHookDefinitions: TestCaseHookDefinition[]\n readonly beforeTestStepHookDefinitions: TestStepHookDefinition[]\n readonly beforeTestRunHookDefinitions: TestRunHookDefinition[]\n readonly defaultTimeout: number\n readonly stepDefinitions: StepDefinition[]\n readonly undefinedParameterTypes: messages.UndefinedParameterType[]\n readonly parameterTypeRegistry: SourcedParameterTypeRegistry\n readonly World: any\n readonly parallelCanAssign: ParallelAssignmentValidator\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/support_code_library_builder/validate_arguments.d.ts b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/validate_arguments.d.ts new file mode 100644 index 00000000..740a472e --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/validate_arguments.d.ts @@ -0,0 +1,12 @@ +import { DefineStepPattern, IDefineStepOptions } from './types'; +interface IDefineStepArguments { + pattern?: DefineStepPattern; + options?: IDefineStepOptions; + code?: Function; +} +export default function validateArguments({ args, fnName, location, }: { + args?: IDefineStepArguments; + fnName: string; + location: string; +}): void; +export {}; diff --git a/node_modules/@cucumber/cucumber/lib/support_code_library_builder/validate_arguments.js b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/validate_arguments.js new file mode 100644 index 00000000..4e3f3cfd --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/validate_arguments.js @@ -0,0 +1,73 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = validateArguments; +const optionsValidation = { + expectedType: 'object or function', + predicate({ options }) { + return typeof options === 'object'; + }, +}; +const optionsTimeoutValidation = { + identifier: '"options.timeout"', + expectedType: 'integer', + predicate({ options }) { + return options.timeout == null || typeof options.timeout === 'number'; + }, +}; +const fnValidation = { + expectedType: 'function', + predicate({ code }) { + return typeof code === 'function'; + }, +}; +const validations = { + defineTestRunHook: [ + { identifier: 'first argument', ...optionsValidation }, + optionsTimeoutValidation, + { identifier: 'second argument', ...fnValidation }, + ], + defineTestCaseHook: [ + { identifier: 'first argument', ...optionsValidation }, + { + identifier: '"options.tags"', + expectedType: 'string', + predicate({ options }) { + return options.tags == null || typeof options.tags === 'string'; + }, + }, + optionsTimeoutValidation, + { identifier: 'second argument', ...fnValidation }, + ], + defineTestStepHook: [ + { identifier: 'first argument', ...optionsValidation }, + { + identifier: '"options.tags"', + expectedType: 'string', + predicate({ options }) { + return options.tags == null || typeof options.tags === 'string'; + }, + }, + optionsTimeoutValidation, + { identifier: 'second argument', ...fnValidation }, + ], + defineStep: [ + { + identifier: 'first argument', + expectedType: 'string or regular expression', + predicate({ pattern }) { + return pattern instanceof RegExp || typeof pattern === 'string'; + }, + }, + { identifier: 'second argument', ...optionsValidation }, + optionsTimeoutValidation, + { identifier: 'third argument', ...fnValidation }, + ], +}; +function validateArguments({ args, fnName, location, }) { + validations[fnName].forEach(({ identifier, expectedType, predicate }) => { + if (!predicate(args)) { + throw new Error(`${location}: Invalid ${identifier}: should be a ${expectedType}`); + } + }); +} +//# sourceMappingURL=validate_arguments.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/support_code_library_builder/validate_arguments.js.map b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/validate_arguments.js.map new file mode 100644 index 00000000..292dd254 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/validate_arguments.js.map @@ -0,0 +1 @@ +{"version":3,"file":"validate_arguments.js","sourceRoot":"","sources":["../../src/support_code_library_builder/validate_arguments.ts"],"names":[],"mappings":";;AAgFA,oCAgBC;AAlFD,MAAM,iBAAiB,GAAG;IACxB,YAAY,EAAE,oBAAoB;IAClC,SAAS,CAAC,EAAE,OAAO,EAAwB;QACzC,OAAO,OAAO,OAAO,KAAK,QAAQ,CAAA;IACpC,CAAC;CACF,CAAA;AAED,MAAM,wBAAwB,GAAG;IAC/B,UAAU,EAAE,mBAAmB;IAC/B,YAAY,EAAE,SAAS;IACvB,SAAS,CAAC,EAAE,OAAO,EAAwB;QACzC,OAAO,OAAO,CAAC,OAAO,IAAI,IAAI,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAA;IACvE,CAAC;CACF,CAAA;AAED,MAAM,YAAY,GAAG;IACnB,YAAY,EAAE,UAAU;IACxB,SAAS,CAAC,EAAE,IAAI,EAAwB;QACtC,OAAO,OAAO,IAAI,KAAK,UAAU,CAAA;IACnC,CAAC;CACF,CAAA;AAED,MAAM,WAAW,GAAkC;IACjD,iBAAiB,EAAE;QACjB,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,iBAAiB,EAAE;QACtD,wBAAwB;QACxB,EAAE,UAAU,EAAE,iBAAiB,EAAE,GAAG,YAAY,EAAE;KACnD;IACD,kBAAkB,EAAE;QAClB,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,iBAAiB,EAAE;QACtD;YACE,UAAU,EAAE,gBAAgB;YAC5B,YAAY,EAAE,QAAQ;YACtB,SAAS,CAAC,EAAE,OAAO,EAAE;gBACnB,OAAO,OAAO,CAAC,IAAI,IAAI,IAAI,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAA;YACjE,CAAC;SACF;QACD,wBAAwB;QACxB,EAAE,UAAU,EAAE,iBAAiB,EAAE,GAAG,YAAY,EAAE;KACnD;IACD,kBAAkB,EAAE;QAClB,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,iBAAiB,EAAE;QACtD;YACE,UAAU,EAAE,gBAAgB;YAC5B,YAAY,EAAE,QAAQ;YACtB,SAAS,CAAC,EAAE,OAAO,EAAE;gBACnB,OAAO,OAAO,CAAC,IAAI,IAAI,IAAI,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAA;YACjE,CAAC;SACF;QACD,wBAAwB;QACxB,EAAE,UAAU,EAAE,iBAAiB,EAAE,GAAG,YAAY,EAAE;KACnD;IACD,UAAU,EAAE;QACV;YACE,UAAU,EAAE,gBAAgB;YAC5B,YAAY,EAAE,8BAA8B;YAC5C,SAAS,CAAC,EAAE,OAAO,EAAE;gBACnB,OAAO,OAAO,YAAY,MAAM,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAA;YACjE,CAAC;SACF;QACD,EAAE,UAAU,EAAE,iBAAiB,EAAE,GAAG,iBAAiB,EAAE;QACvD,wBAAwB;QACxB,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,YAAY,EAAE;KAClD;CACF,CAAA;AAED,SAAwB,iBAAiB,CAAC,EACxC,IAAI,EACJ,MAAM,EACN,QAAQ,GAKT;IACC,WAAW,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,EAAE;QACtE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CACb,GAAG,QAAQ,aAAa,UAAU,iBAAiB,YAAY,EAAE,CAClE,CAAA;QACH,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import { DefineStepPattern, IDefineStepOptions } from './types'\n\ninterface IValidation {\n identifier: string\n expectedType: string\n predicate: (args: any) => boolean\n}\n\ninterface IDefineStepArguments {\n pattern?: DefineStepPattern\n options?: IDefineStepOptions\n code?: Function\n}\n\nconst optionsValidation = {\n expectedType: 'object or function',\n predicate({ options }: IDefineStepArguments) {\n return typeof options === 'object'\n },\n}\n\nconst optionsTimeoutValidation = {\n identifier: '\"options.timeout\"',\n expectedType: 'integer',\n predicate({ options }: IDefineStepArguments) {\n return options.timeout == null || typeof options.timeout === 'number'\n },\n}\n\nconst fnValidation = {\n expectedType: 'function',\n predicate({ code }: IDefineStepArguments) {\n return typeof code === 'function'\n },\n}\n\nconst validations: Record = {\n defineTestRunHook: [\n { identifier: 'first argument', ...optionsValidation },\n optionsTimeoutValidation,\n { identifier: 'second argument', ...fnValidation },\n ],\n defineTestCaseHook: [\n { identifier: 'first argument', ...optionsValidation },\n {\n identifier: '\"options.tags\"',\n expectedType: 'string',\n predicate({ options }) {\n return options.tags == null || typeof options.tags === 'string'\n },\n },\n optionsTimeoutValidation,\n { identifier: 'second argument', ...fnValidation },\n ],\n defineTestStepHook: [\n { identifier: 'first argument', ...optionsValidation },\n {\n identifier: '\"options.tags\"',\n expectedType: 'string',\n predicate({ options }) {\n return options.tags == null || typeof options.tags === 'string'\n },\n },\n optionsTimeoutValidation,\n { identifier: 'second argument', ...fnValidation },\n ],\n defineStep: [\n {\n identifier: 'first argument',\n expectedType: 'string or regular expression',\n predicate({ pattern }) {\n return pattern instanceof RegExp || typeof pattern === 'string'\n },\n },\n { identifier: 'second argument', ...optionsValidation },\n optionsTimeoutValidation,\n { identifier: 'third argument', ...fnValidation },\n ],\n}\n\nexport default function validateArguments({\n args,\n fnName,\n location,\n}: {\n args?: IDefineStepArguments\n fnName: string\n location: string\n}): void {\n validations[fnName].forEach(({ identifier, expectedType, predicate }) => {\n if (!predicate(args)) {\n throw new Error(\n `${location}: Invalid ${identifier}: should be a ${expectedType}`\n )\n }\n })\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/support_code_library_builder/world.d.ts b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/world.d.ts new file mode 100644 index 00000000..432ffd6d --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/world.d.ts @@ -0,0 +1,21 @@ +import { ICreateAttachment, ICreateLink, ICreateLog } from '../runtime/attachment_manager'; +export interface IWorldOptions { + attach: ICreateAttachment; + log: ICreateLog; + link: ICreateLink; + parameters: ParametersType; +} +export interface IWorld { + readonly attach: ICreateAttachment; + readonly log: ICreateLog; + readonly link: ICreateLink; + readonly parameters: ParametersType; + [key: string]: any; +} +export default class World implements IWorld { + readonly attach: ICreateAttachment; + readonly log: ICreateLog; + readonly link: ICreateLink; + readonly parameters: ParametersType; + constructor({ attach, log, link, parameters, }: IWorldOptions); +} diff --git a/node_modules/@cucumber/cucumber/lib/support_code_library_builder/world.js b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/world.js new file mode 100644 index 00000000..7de9c403 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/world.js @@ -0,0 +1,16 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class World { + attach; + log; + link; + parameters; + constructor({ attach, log, link, parameters, }) { + this.attach = attach; + this.log = log; + this.link = link; + this.parameters = parameters; + } +} +exports.default = World; +//# sourceMappingURL=world.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/support_code_library_builder/world.js.map b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/world.js.map new file mode 100644 index 00000000..f350b54e --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/support_code_library_builder/world.js.map @@ -0,0 +1 @@ +{"version":3,"file":"world.js","sourceRoot":"","sources":["../../src/support_code_library_builder/world.ts"],"names":[],"mappings":";;AAsBA,MAAqB,KAAK;IAGR,MAAM,CAAmB;IACzB,GAAG,CAAY;IACf,IAAI,CAAa;IACjB,UAAU,CAAgB;IAE1C,YAAY,EACV,MAAM,EACN,GAAG,EACH,IAAI,EACJ,UAAU,GACoB;QAC9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;IAC9B,CAAC;CACF;AAnBD,wBAmBC","sourcesContent":["import {\n ICreateAttachment,\n ICreateLink,\n ICreateLog,\n} from '../runtime/attachment_manager'\n\nexport interface IWorldOptions {\n attach: ICreateAttachment\n log: ICreateLog\n link: ICreateLink\n parameters: ParametersType\n}\n\nexport interface IWorld {\n readonly attach: ICreateAttachment\n readonly log: ICreateLog\n readonly link: ICreateLink\n readonly parameters: ParametersType\n\n [key: string]: any\n}\n\nexport default class World\n implements IWorld\n{\n public readonly attach: ICreateAttachment\n public readonly log: ICreateLog\n public readonly link: ICreateLink\n public readonly parameters: ParametersType\n\n constructor({\n attach,\n log,\n link,\n parameters,\n }: IWorldOptions) {\n this.attach = attach\n this.log = log\n this.link = link\n this.parameters = parameters\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/time.d.ts b/node_modules/@cucumber/cucumber/lib/time.d.ts new file mode 100644 index 00000000..779ef85a --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/time.d.ts @@ -0,0 +1,16 @@ +import { performance } from 'node:perf_hooks'; +import * as messages from '@cucumber/messages'; +interface ProtectedTimingBuiltins { + clearImmediate: typeof clearImmediate; + clearInterval: typeof clearInterval; + clearTimeout: typeof clearTimeout; + Date: typeof Date; + setImmediate: typeof setImmediate; + setInterval: typeof setInterval; + setTimeout: typeof setTimeout; + performance: typeof performance; +} +declare const methods: Partial; +export declare function durationBetweenTimestamps(startedTimestamp: messages.Timestamp, finishedTimestamp: messages.Timestamp): messages.Duration; +export declare function wrapPromiseWithTimeout(promise: Promise, timeoutInMilliseconds: number, timeoutMessage?: string): Promise; +export default methods; diff --git a/node_modules/@cucumber/cucumber/lib/time.js b/node_modules/@cucumber/cucumber/lib/time.js new file mode 100644 index 00000000..b5d72d12 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/time.js @@ -0,0 +1,70 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.durationBetweenTimestamps = durationBetweenTimestamps; +exports.wrapPromiseWithTimeout = wrapPromiseWithTimeout; +const node_perf_hooks_1 = require("node:perf_hooks"); +const messages = __importStar(require("@cucumber/messages")); +const methods = { + clearInterval: clearInterval.bind(global), + clearTimeout: clearTimeout.bind(global), + Date, + setInterval: setInterval.bind(global), + setTimeout: setTimeout.bind(global), + performance: node_perf_hooks_1.performance, +}; +if (typeof setImmediate !== 'undefined') { + methods.setImmediate = setImmediate.bind(global); + methods.clearImmediate = clearImmediate.bind(global); +} +function durationBetweenTimestamps(startedTimestamp, finishedTimestamp) { + const durationMillis = messages.TimeConversion.timestampToMillisecondsSinceEpoch(finishedTimestamp) - + messages.TimeConversion.timestampToMillisecondsSinceEpoch(startedTimestamp); + return messages.TimeConversion.millisecondsToDuration(durationMillis); +} +async function wrapPromiseWithTimeout(promise, timeoutInMilliseconds, timeoutMessage = '') { + let timeoutId; + if (timeoutMessage === '') { + timeoutMessage = `Action did not complete within ${timeoutInMilliseconds} milliseconds`; + } + const timeoutPromise = new Promise((resolve, reject) => { + timeoutId = methods.setTimeout(() => { + reject(new Error(timeoutMessage)); + }, timeoutInMilliseconds); + }); + return await Promise.race([promise, timeoutPromise]).finally(() => methods.clearTimeout(timeoutId)); +} +exports.default = methods; +//# sourceMappingURL=time.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/time.js.map b/node_modules/@cucumber/cucumber/lib/time.js.map new file mode 100644 index 00000000..4aa6cc98 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/time.js.map @@ -0,0 +1 @@ +{"version":3,"file":"time.js","sourceRoot":"","sources":["../src/time.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,8DAUC;AAED,wDAiBC;AAzDD,qDAA6C;AAC7C,6DAA8C;AAa9C,MAAM,OAAO,GAAqC;IAChD,aAAa,EAAE,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;IACzC,YAAY,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;IACvC,IAAI;IACJ,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;IACrC,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;IACnC,WAAW,EAAX,6BAAW;CACZ,CAAA;AAED,IAAI,OAAO,YAAY,KAAK,WAAW,EAAE,CAAC;IACxC,OAAO,CAAC,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAChD,OAAO,CAAC,cAAc,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AACtD,CAAC;AAED,SAAgB,yBAAyB,CACvC,gBAAoC,EACpC,iBAAqC;IAErC,MAAM,cAAc,GAClB,QAAQ,CAAC,cAAc,CAAC,iCAAiC,CACvD,iBAAiB,CAClB;QACD,QAAQ,CAAC,cAAc,CAAC,iCAAiC,CAAC,gBAAgB,CAAC,CAAA;IAC7E,OAAO,QAAQ,CAAC,cAAc,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAA;AACvE,CAAC;AAEM,KAAK,UAAU,sBAAsB,CAC1C,OAAmB,EACnB,qBAA6B,EAC7B,iBAAyB,EAAE;IAE3B,IAAI,SAAwC,CAAA;IAC5C,IAAI,cAAc,KAAK,EAAE,EAAE,CAAC;QAC1B,cAAc,GAAG,kCAAkC,qBAAqB,eAAe,CAAA;IACzF,CAAC;IACD,MAAM,cAAc,GAAG,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACxD,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE;YAClC,MAAM,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC,CAAA;QACnC,CAAC,EAAE,qBAAqB,CAAC,CAAA;IAC3B,CAAC,CAAC,CAAA;IACF,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAChE,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAChC,CAAA;AACH,CAAC;AAED,kBAAe,OAAO,CAAA","sourcesContent":["import { performance } from 'node:perf_hooks'\nimport * as messages from '@cucumber/messages'\n\ninterface ProtectedTimingBuiltins {\n clearImmediate: typeof clearImmediate\n clearInterval: typeof clearInterval\n clearTimeout: typeof clearTimeout\n Date: typeof Date\n setImmediate: typeof setImmediate\n setInterval: typeof setInterval\n setTimeout: typeof setTimeout\n performance: typeof performance\n}\n\nconst methods: Partial = {\n clearInterval: clearInterval.bind(global),\n clearTimeout: clearTimeout.bind(global),\n Date,\n setInterval: setInterval.bind(global),\n setTimeout: setTimeout.bind(global),\n performance,\n}\n\nif (typeof setImmediate !== 'undefined') {\n methods.setImmediate = setImmediate.bind(global)\n methods.clearImmediate = clearImmediate.bind(global)\n}\n\nexport function durationBetweenTimestamps(\n startedTimestamp: messages.Timestamp,\n finishedTimestamp: messages.Timestamp\n): messages.Duration {\n const durationMillis =\n messages.TimeConversion.timestampToMillisecondsSinceEpoch(\n finishedTimestamp\n ) -\n messages.TimeConversion.timestampToMillisecondsSinceEpoch(startedTimestamp)\n return messages.TimeConversion.millisecondsToDuration(durationMillis)\n}\n\nexport async function wrapPromiseWithTimeout(\n promise: Promise,\n timeoutInMilliseconds: number,\n timeoutMessage: string = ''\n): Promise {\n let timeoutId: ReturnType\n if (timeoutMessage === '') {\n timeoutMessage = `Action did not complete within ${timeoutInMilliseconds} milliseconds`\n }\n const timeoutPromise = new Promise((resolve, reject) => {\n timeoutId = methods.setTimeout(() => {\n reject(new Error(timeoutMessage))\n }, timeoutInMilliseconds)\n })\n return await Promise.race([promise, timeoutPromise]).finally(() =>\n methods.clearTimeout(timeoutId)\n )\n}\n\nexport default methods\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/try_require.d.ts b/node_modules/@cucumber/cucumber/lib/try_require.d.ts new file mode 100644 index 00000000..6bc320ec --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/try_require.d.ts @@ -0,0 +1,7 @@ +/** + * Provides a try guarded require call that will throw a more detailed error when + * the ERR_REQUIRE_ESM error code is encountered. + * + * @param {string} path File path to require from. + */ +export default function tryRequire(path: string): any; diff --git a/node_modules/@cucumber/cucumber/lib/try_require.js b/node_modules/@cucumber/cucumber/lib/try_require.js new file mode 100644 index 00000000..213afec6 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/try_require.js @@ -0,0 +1,28 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = tryRequire; +/** + * Provides a try guarded require call that will throw a more detailed error when + * the ERR_REQUIRE_ESM error code is encountered. + * + * @param {string} path File path to require from. + */ +function tryRequire(path) { + try { + return require(path); // eslint-disable-line @typescript-eslint/no-require-imports + } + catch (error) { + if (error.code === 'ERR_REQUIRE_ESM') { + throw Error(`Cucumber expected a CommonJS module at '${path}' but found an ES module. + Either change the file to CommonJS syntax or use the --import directive instead of --require.`, { cause: error }); + } + else if (error.code === 'ERR_REQUIRE_ASYNC_MODULE') { + throw Error(`Cucumber expected a CommonJS module or simple ES module at '${path}' but found an async ES module. + Either change the file so it can be required or use the --import directive instead of --require.`, { cause: error }); + } + else { + throw error; + } + } +} +//# sourceMappingURL=try_require.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/try_require.js.map b/node_modules/@cucumber/cucumber/lib/try_require.js.map new file mode 100644 index 00000000..f37cf670 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/try_require.js.map @@ -0,0 +1 @@ +{"version":3,"file":"try_require.js","sourceRoot":"","sources":["../src/try_require.ts"],"names":[],"mappings":";;AAMA,6BAoBC;AA1BD;;;;;GAKG;AACH,SAAwB,UAAU,CAAC,IAAY;IAC7C,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,IAAI,CAAC,CAAA,CAAC,4DAA4D;IACnF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YACrC,MAAM,KAAK,CACT,2CAA2C,IAAI;oGAC6C,EAC5F,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAA;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,0BAA0B,EAAE,CAAC;YACrD,MAAM,KAAK,CACT,+DAA+D,IAAI;uGAC4B,EAC/F,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAA;QACH,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["/**\n * Provides a try guarded require call that will throw a more detailed error when\n * the ERR_REQUIRE_ESM error code is encountered.\n *\n * @param {string} path File path to require from.\n */\nexport default function tryRequire(path: string) {\n try {\n return require(path) // eslint-disable-line @typescript-eslint/no-require-imports\n } catch (error) {\n if (error.code === 'ERR_REQUIRE_ESM') {\n throw Error(\n `Cucumber expected a CommonJS module at '${path}' but found an ES module.\n Either change the file to CommonJS syntax or use the --import directive instead of --require.`,\n { cause: error }\n )\n } else if (error.code === 'ERR_REQUIRE_ASYNC_MODULE') {\n throw Error(\n `Cucumber expected a CommonJS module or simple ES module at '${path}' but found an async ES module.\n Either change the file so it can be required or use the --import directive instead of --require.`,\n { cause: error }\n )\n } else {\n throw error\n }\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/tsconfig.node.tsbuildinfo b/node_modules/@cucumber/cucumber/lib/tsconfig.node.tsbuildinfo new file mode 100644 index 00000000..d1c1b27b --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/tsconfig.node.tsbuildinfo @@ -0,0 +1 @@ +{"root":["../src/filter_stack_trace.ts","../src/index.ts","../src/pickle_filter.ts","../src/step_arguments.ts","../src/time.ts","../src/try_require.ts","../src/uncaught_exception_manager.ts","../src/user_code_runner.ts","../src/value_checker.ts","../src/version.ts","../src/api/convert_configuration.ts","../src/api/emit_support_code_messages.ts","../src/api/formatters.ts","../src/api/gherkin.ts","../src/api/index.ts","../src/api/load_configuration.ts","../src/api/load_sources.ts","../src/api/load_support.ts","../src/api/plugins.ts","../src/api/run_cucumber.ts","../src/api/support.ts","../src/api/test_helpers.ts","../src/api/types.ts","../src/assemble/assemble_test_cases.ts","../src/assemble/index.ts","../src/assemble/types.ts","../src/cli/i18n.ts","../src/cli/index.ts","../src/cli/install_validator.ts","../src/cli/run.ts","../src/cli/validate_node_engine_version.ts","../src/configuration/argv_parser.ts","../src/configuration/check_schema.ts","../src/configuration/default_configuration.ts","../src/configuration/from_file.ts","../src/configuration/helpers.ts","../src/configuration/index.ts","../src/configuration/locate_file.ts","../src/configuration/merge_configurations.ts","../src/configuration/parse_configuration.ts","../src/configuration/split_format_descriptor.ts","../src/configuration/types.ts","../src/configuration/validate_configuration.ts","../src/environment/console_logger.ts","../src/environment/index.ts","../src/environment/make_environment.ts","../src/environment/types.ts","../src/filter/filter_plugin.ts","../src/filter/index.ts","../src/filter/order_pickles.ts","../src/filter/types.ts","../src/formatter/builder.ts","../src/formatter/create_stream.ts","../src/formatter/find_class_or_plugin.ts","../src/formatter/get_color_fns.ts","../src/formatter/import_code.ts","../src/formatter/index.ts","../src/formatter/json_formatter.ts","../src/formatter/progress_bar_formatter.ts","../src/formatter/progress_formatter.ts","../src/formatter/rerun_formatter.ts","../src/formatter/resolve_implementation.ts","../src/formatter/snippets_formatter.ts","../src/formatter/summary_formatter.ts","../src/formatter/usage_formatter.ts","../src/formatter/usage_json_formatter.ts","../src/formatter/builtin/html.ts","../src/formatter/builtin/index.ts","../src/formatter/builtin/message.ts","../src/formatter/helpers/duration_helpers.ts","../src/formatter/helpers/event_data_collector.ts","../src/formatter/helpers/formatters.ts","../src/formatter/helpers/gherkin_document_parser.ts","../src/formatter/helpers/index.ts","../src/formatter/helpers/issue_helpers.ts","../src/formatter/helpers/keyword_type.ts","../src/formatter/helpers/location_helpers.ts","../src/formatter/helpers/pickle_parser.ts","../src/formatter/helpers/step_argument_formatter.ts","../src/formatter/helpers/summary_helpers.ts","../src/formatter/helpers/test_case_attempt_formatter.ts","../src/formatter/helpers/test_case_attempt_parser.ts","../src/formatter/helpers/usage_helpers/index.ts","../src/formatter/step_definition_snippet_builder/index.ts","../src/formatter/step_definition_snippet_builder/javascript_snippet_syntax.ts","../src/formatter/step_definition_snippet_builder/snippet_syntax.ts","../src/models/data_table.ts","../src/models/definition.ts","../src/models/gherkin_step_keyword.ts","../src/models/step_definition.ts","../src/models/test_case_hook_definition.ts","../src/models/test_run_hook_definition.ts","../src/models/test_step_hook_definition.ts","../src/paths/index.ts","../src/paths/paths.ts","../src/paths/types.ts","../src/plugin/index.ts","../src/plugin/plugin_manager.ts","../src/plugin/types.ts","../src/publish/index.ts","../src/publish/publish_plugin.ts","../src/publish/types.ts","../src/runtime/coordinator.ts","../src/runtime/format_error.ts","../src/runtime/helpers.ts","../src/runtime/index.ts","../src/runtime/make_runtime.ts","../src/runtime/make_suggestion.ts","../src/runtime/step_runner.ts","../src/runtime/stopwatch.ts","../src/runtime/test_case_runner.ts","../src/runtime/types.ts","../src/runtime/worker.ts","../src/runtime/attachment_manager/index.ts","../src/runtime/parallel/adapter.ts","../src/runtime/parallel/run_worker.ts","../src/runtime/parallel/types.ts","../src/runtime/parallel/worker.ts","../src/runtime/scope/index.ts","../src/runtime/scope/make_proxy.ts","../src/runtime/scope/test_case_scope.ts","../src/runtime/scope/test_run_scope.ts","../src/runtime/serial/adapter.ts","../src/sharding/index.ts","../src/sharding/sharding_plugin.ts","../src/support_code_library_builder/build_parameter_type.ts","../src/support_code_library_builder/context.ts","../src/support_code_library_builder/get_definition_line_and_uri.ts","../src/support_code_library_builder/index.ts","../src/support_code_library_builder/parallel_can_assign_helpers.ts","../src/support_code_library_builder/sourced_parameter_type_registry.ts","../src/support_code_library_builder/types.ts","../src/support_code_library_builder/validate_arguments.ts","../src/support_code_library_builder/world.ts","../src/types/index.ts","../src/types/assertion-error-formatter/index.d.ts","../src/types/is-generator/index.d.ts","../src/types/knuth-shuffle-seeded/index.d.ts","../src/types/stack-chain/index.d.ts","../src/types/supports-color/index.d.ts"],"version":"5.9.3"} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/types/index.d.ts b/node_modules/@cucumber/cucumber/lib/types/index.d.ts new file mode 100644 index 00000000..6385fb70 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/types/index.d.ts @@ -0,0 +1,4 @@ +export interface ILineAndUri { + line: number; + uri: string; +} diff --git a/node_modules/@cucumber/cucumber/lib/types/index.js b/node_modules/@cucumber/cucumber/lib/types/index.js new file mode 100644 index 00000000..aa219d8f --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/types/index.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/types/index.js.map b/node_modules/@cucumber/cucumber/lib/types/index.js.map new file mode 100644 index 00000000..f3470a85 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/types/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"","sourcesContent":["export interface ILineAndUri {\n line: number\n uri: string\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/uncaught_exception_manager.d.ts b/node_modules/@cucumber/cucumber/lib/uncaught_exception_manager.d.ts new file mode 100644 index 00000000..6a7dbb8b --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/uncaught_exception_manager.d.ts @@ -0,0 +1,6 @@ +import UncaughtExceptionListener = NodeJS.UncaughtExceptionListener; +declare const UncaughtExceptionManager: { + registerHandler(handler: UncaughtExceptionListener): void; + unregisterHandler(handler: UncaughtExceptionListener): void; +}; +export default UncaughtExceptionManager; diff --git a/node_modules/@cucumber/cucumber/lib/uncaught_exception_manager.js b/node_modules/@cucumber/cucumber/lib/uncaught_exception_manager.js new file mode 100644 index 00000000..cbc8db08 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/uncaught_exception_manager.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const UncaughtExceptionManager = { + registerHandler(handler) { + process.addListener('uncaughtException', handler); + }, + unregisterHandler(handler) { + process.removeListener('uncaughtException', handler); + }, +}; +exports.default = UncaughtExceptionManager; +//# sourceMappingURL=uncaught_exception_manager.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/uncaught_exception_manager.js.map b/node_modules/@cucumber/cucumber/lib/uncaught_exception_manager.js.map new file mode 100644 index 00000000..bee08805 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/uncaught_exception_manager.js.map @@ -0,0 +1 @@ +{"version":3,"file":"uncaught_exception_manager.js","sourceRoot":"","sources":["../src/uncaught_exception_manager.ts"],"names":[],"mappings":";;AAEA,MAAM,wBAAwB,GAAG;IAC/B,eAAe,CAAC,OAAkC;QAChD,OAAO,CAAC,WAAW,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAA;IACnD,CAAC;IAED,iBAAiB,CAAC,OAAkC;QAClD,OAAO,CAAC,cAAc,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAA;IACtD,CAAC;CACF,CAAA;AAED,kBAAe,wBAAwB,CAAA","sourcesContent":["import UncaughtExceptionListener = NodeJS.UncaughtExceptionListener\n\nconst UncaughtExceptionManager = {\n registerHandler(handler: UncaughtExceptionListener): void {\n process.addListener('uncaughtException', handler)\n },\n\n unregisterHandler(handler: UncaughtExceptionListener): void {\n process.removeListener('uncaughtException', handler)\n },\n}\n\nexport default UncaughtExceptionManager\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/user_code_runner.d.ts b/node_modules/@cucumber/cucumber/lib/user_code_runner.d.ts new file mode 100644 index 00000000..0edb3f31 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/user_code_runner.d.ts @@ -0,0 +1,14 @@ +export interface IRunRequest { + argsArray: any[]; + thisArg: any; + fn: Function; + timeoutInMilliseconds: number; +} +export interface IRunResponse { + error?: any; + result?: any; +} +declare const UserCodeRunner: { + run({ argsArray, thisArg, fn, timeoutInMilliseconds, }: IRunRequest): Promise; +}; +export default UserCodeRunner; diff --git a/node_modules/@cucumber/cucumber/lib/user_code_runner.js b/node_modules/@cucumber/cucumber/lib/user_code_runner.js new file mode 100644 index 00000000..51039456 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/user_code_runner.js @@ -0,0 +1,82 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const node_util_1 = __importDefault(require("node:util")); +const time_1 = require("./time"); +const uncaught_exception_manager_1 = __importDefault(require("./uncaught_exception_manager")); +const value_checker_1 = require("./value_checker"); +const UserCodeRunner = { + async run({ argsArray, thisArg, fn, timeoutInMilliseconds, }) { + const callbackPromise = new Promise((resolve, reject) => { + argsArray.push((error, result) => { + if ((0, value_checker_1.doesHaveValue)(error)) { + reject(error); + } + else { + resolve(result); + } + }); + }); + let fnReturn; + try { + fnReturn = fn.apply(thisArg, argsArray); + } + catch (e) { + const error = e instanceof Error ? e : node_util_1.default.format(e); + return { error }; + } + const racingPromises = []; + const callbackInterface = fn.length === argsArray.length; + const promiseInterface = (0, value_checker_1.doesHaveValue)(fnReturn) && typeof fnReturn.then === 'function'; + if (callbackInterface && promiseInterface) { + return { + error: new Error('function uses multiple asynchronous interfaces: callback and promise\n' + + 'to use the callback interface: do not return a promise\n' + + 'to use the promise interface: remove the last argument to the function'), + }; + } + else if (callbackInterface) { + racingPromises.push(callbackPromise); + } + else if (promiseInterface) { + racingPromises.push(fnReturn); + } + else { + return { result: fnReturn }; + } + let exceptionHandler; + const uncaughtExceptionPromise = new Promise((resolve, reject) => { + exceptionHandler = reject; + uncaught_exception_manager_1.default.registerHandler(exceptionHandler); + }); + racingPromises.push(uncaughtExceptionPromise); + let finalPromise = Promise.race(racingPromises); + if (timeoutInMilliseconds >= 0) { + const timeoutMessage = 'function timed out, ensure the ' + + (callbackInterface ? 'callback is executed' : 'promise resolves') + + ` within ${timeoutInMilliseconds.toString()} milliseconds`; + finalPromise = (0, time_1.wrapPromiseWithTimeout)(finalPromise, timeoutInMilliseconds, timeoutMessage); + } + let error, result; + try { + result = await finalPromise; + } + catch (e) { + if (e instanceof Error) { + error = e; + } + else if ((0, value_checker_1.doesHaveValue)(e)) { + error = node_util_1.default.format(e); + } + else { + error = new Error('Promise rejected without a reason'); + } + } + uncaught_exception_manager_1.default.unregisterHandler(exceptionHandler); + return { error, result }; + }, +}; +exports.default = UserCodeRunner; +//# sourceMappingURL=user_code_runner.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/user_code_runner.js.map b/node_modules/@cucumber/cucumber/lib/user_code_runner.js.map new file mode 100644 index 00000000..9b25ac52 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/user_code_runner.js.map @@ -0,0 +1 @@ +{"version":3,"file":"user_code_runner.js","sourceRoot":"","sources":["../src/user_code_runner.ts"],"names":[],"mappings":";;;;;AAAA,0DAA4B;AAC5B,iCAA+C;AAC/C,8FAAmE;AACnE,mDAA+C;AAc/C,MAAM,cAAc,GAAG;IACrB,KAAK,CAAC,GAAG,CAAC,EACR,SAAS,EACT,OAAO,EACP,EAAE,EACF,qBAAqB,GACT;QACZ,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtD,SAAS,CAAC,IAAI,CAAC,CAAC,KAAY,EAAE,MAAoB,EAAE,EAAE;gBACpD,IAAI,IAAA,6BAAa,EAAC,KAAK,CAAC,EAAE,CAAC;oBACzB,MAAM,CAAC,KAAK,CAAC,CAAA;gBACf,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,MAAM,CAAC,CAAA;gBACjB,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,IAAI,QAAQ,CAAA;QACZ,IAAI,CAAC;YACH,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;QACzC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,KAAK,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;YACrD,OAAO,EAAE,KAAK,EAAE,CAAA;QAClB,CAAC;QAED,MAAM,cAAc,GAAG,EAAE,CAAA;QACzB,MAAM,iBAAiB,GAAG,EAAE,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,CAAA;QACxD,MAAM,gBAAgB,GACpB,IAAA,6BAAa,EAAC,QAAQ,CAAC,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,UAAU,CAAA;QAEhE,IAAI,iBAAiB,IAAI,gBAAgB,EAAE,CAAC;YAC1C,OAAO;gBACL,KAAK,EAAE,IAAI,KAAK,CACd,wEAAwE;oBACtE,0DAA0D;oBAC1D,wEAAwE,CAC3E;aACF,CAAA;QACH,CAAC;aAAM,IAAI,iBAAiB,EAAE,CAAC;YAC7B,cAAc,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QACtC,CAAC;aAAM,IAAI,gBAAgB,EAAE,CAAC;YAC5B,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC/B,CAAC;aAAM,CAAC;YACN,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAA;QAC7B,CAAC;QAED,IAAI,gBAAgB,CAAA;QACpB,MAAM,wBAAwB,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC/D,gBAAgB,GAAG,MAAM,CAAA;YACzB,oCAAwB,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAA;QAC5D,CAAC,CAAC,CAAA;QACF,cAAc,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;QAE7C,IAAI,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAC/C,IAAI,qBAAqB,IAAI,CAAC,EAAE,CAAC;YAC/B,MAAM,cAAc,GAClB,iCAAiC;gBACjC,CAAC,iBAAiB,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,kBAAkB,CAAC;gBACjE,WAAW,qBAAqB,CAAC,QAAQ,EAAE,eAAe,CAAA;YAC5D,YAAY,GAAG,IAAA,6BAAsB,EACnC,YAAY,EACZ,qBAAqB,EACrB,cAAc,CACf,CAAA;QACH,CAAC;QAED,IAAI,KAAK,EAAE,MAAM,CAAA;QACjB,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,YAAY,CAAA;QAC7B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC;gBACvB,KAAK,GAAG,CAAC,CAAA;YACX,CAAC;iBAAM,IAAI,IAAA,6BAAa,EAAC,CAAC,CAAC,EAAE,CAAC;gBAC5B,KAAK,GAAG,mBAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;YACxB,CAAC;iBAAM,CAAC;gBACN,KAAK,GAAG,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;YACxD,CAAC;QACH,CAAC;QAED,oCAAwB,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAA;QAE5D,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;IAC1B,CAAC;CACF,CAAA;AAED,kBAAe,cAAc,CAAA","sourcesContent":["import util from 'node:util'\nimport { wrapPromiseWithTimeout } from './time'\nimport UncaughtExceptionManager from './uncaught_exception_manager'\nimport { doesHaveValue } from './value_checker'\n\nexport interface IRunRequest {\n argsArray: any[]\n thisArg: any\n fn: Function\n timeoutInMilliseconds: number\n}\n\nexport interface IRunResponse {\n error?: any\n result?: any\n}\n\nconst UserCodeRunner = {\n async run({\n argsArray,\n thisArg,\n fn,\n timeoutInMilliseconds,\n }: IRunRequest): Promise {\n const callbackPromise = new Promise((resolve, reject) => {\n argsArray.push((error: Error, result: IRunResponse) => {\n if (doesHaveValue(error)) {\n reject(error)\n } else {\n resolve(result)\n }\n })\n })\n\n let fnReturn\n try {\n fnReturn = fn.apply(thisArg, argsArray)\n } catch (e) {\n const error = e instanceof Error ? e : util.format(e)\n return { error }\n }\n\n const racingPromises = []\n const callbackInterface = fn.length === argsArray.length\n const promiseInterface =\n doesHaveValue(fnReturn) && typeof fnReturn.then === 'function'\n\n if (callbackInterface && promiseInterface) {\n return {\n error: new Error(\n 'function uses multiple asynchronous interfaces: callback and promise\\n' +\n 'to use the callback interface: do not return a promise\\n' +\n 'to use the promise interface: remove the last argument to the function'\n ),\n }\n } else if (callbackInterface) {\n racingPromises.push(callbackPromise)\n } else if (promiseInterface) {\n racingPromises.push(fnReturn)\n } else {\n return { result: fnReturn }\n }\n\n let exceptionHandler\n const uncaughtExceptionPromise = new Promise((resolve, reject) => {\n exceptionHandler = reject\n UncaughtExceptionManager.registerHandler(exceptionHandler)\n })\n racingPromises.push(uncaughtExceptionPromise)\n\n let finalPromise = Promise.race(racingPromises)\n if (timeoutInMilliseconds >= 0) {\n const timeoutMessage =\n 'function timed out, ensure the ' +\n (callbackInterface ? 'callback is executed' : 'promise resolves') +\n ` within ${timeoutInMilliseconds.toString()} milliseconds`\n finalPromise = wrapPromiseWithTimeout(\n finalPromise,\n timeoutInMilliseconds,\n timeoutMessage\n )\n }\n\n let error, result\n try {\n result = await finalPromise\n } catch (e) {\n if (e instanceof Error) {\n error = e\n } else if (doesHaveValue(e)) {\n error = util.format(e)\n } else {\n error = new Error('Promise rejected without a reason')\n }\n }\n\n UncaughtExceptionManager.unregisterHandler(exceptionHandler)\n\n return { error, result }\n },\n}\n\nexport default UserCodeRunner\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/value_checker.d.ts b/node_modules/@cucumber/cucumber/lib/value_checker.d.ts new file mode 100644 index 00000000..0d6f6f41 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/value_checker.d.ts @@ -0,0 +1,3 @@ +export declare function doesHaveValue(value: T): boolean; +export declare function doesNotHaveValue(value: T): boolean; +export declare function valueOrDefault(value: T, defaultValue: T): T; diff --git a/node_modules/@cucumber/cucumber/lib/value_checker.js b/node_modules/@cucumber/cucumber/lib/value_checker.js new file mode 100644 index 00000000..9eb9e954 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/value_checker.js @@ -0,0 +1,18 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.doesHaveValue = doesHaveValue; +exports.doesNotHaveValue = doesNotHaveValue; +exports.valueOrDefault = valueOrDefault; +function doesHaveValue(value) { + return !doesNotHaveValue(value); +} +function doesNotHaveValue(value) { + return value === null || value === undefined; +} +function valueOrDefault(value, defaultValue) { + if (doesHaveValue(value)) { + return value; + } + return defaultValue; +} +//# sourceMappingURL=value_checker.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/value_checker.js.map b/node_modules/@cucumber/cucumber/lib/value_checker.js.map new file mode 100644 index 00000000..9a246809 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/value_checker.js.map @@ -0,0 +1 @@ +{"version":3,"file":"value_checker.js","sourceRoot":"","sources":["../src/value_checker.ts"],"names":[],"mappings":";;AAAA,sCAEC;AAED,4CAEC;AAED,wCAKC;AAbD,SAAgB,aAAa,CAAI,KAAQ;IACvC,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;AACjC,CAAC;AAED,SAAgB,gBAAgB,CAAI,KAAQ;IAC1C,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAA;AAC9C,CAAC;AAED,SAAgB,cAAc,CAAI,KAAQ,EAAE,YAAe;IACzD,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,YAAY,CAAA;AACrB,CAAC","sourcesContent":["export function doesHaveValue(value: T): boolean {\n return !doesNotHaveValue(value)\n}\n\nexport function doesNotHaveValue(value: T): boolean {\n return value === null || value === undefined\n}\n\nexport function valueOrDefault(value: T, defaultValue: T): T {\n if (doesHaveValue(value)) {\n return value\n }\n return defaultValue\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/version.d.ts b/node_modules/@cucumber/cucumber/lib/version.d.ts new file mode 100644 index 00000000..4de75ede --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/version.d.ts @@ -0,0 +1 @@ +export declare const version = "12.9.0"; diff --git a/node_modules/@cucumber/cucumber/lib/version.js b/node_modules/@cucumber/cucumber/lib/version.js new file mode 100644 index 00000000..dbb1c559 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/version.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = void 0; +// Generated by genversion. +exports.version = '12.9.0'; +//# sourceMappingURL=version.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/version.js.map b/node_modules/@cucumber/cucumber/lib/version.js.map new file mode 100644 index 00000000..d92e23e7 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/version.js.map @@ -0,0 +1 @@ +{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":";;;AAAA,2BAA2B;AACd,QAAA,OAAO,GAAG,QAAQ,CAAA","sourcesContent":["// Generated by genversion.\nexport const version = '12.9.0'\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/cucumber/lib/wrapper.mjs b/node_modules/@cucumber/cucumber/lib/wrapper.mjs new file mode 100644 index 00000000..b9a72cf7 --- /dev/null +++ b/node_modules/@cucumber/cucumber/lib/wrapper.mjs @@ -0,0 +1,45 @@ +import cucumber from './index.js' + +export const version = cucumber.version + +export const supportCodeLibraryBuilder = cucumber.supportCodeLibraryBuilder +export const Status = cucumber.Status +export const DataTable = cucumber.DataTable +export const TestCaseHookDefinition = cucumber.TestCaseHookDefinition + +export const Formatter = cucumber.Formatter +export const FormatterBuilder = cucumber.FormatterBuilder +export const JsonFormatter = cucumber.JsonFormatter +export const ProgressFormatter = cucumber.ProgressFormatter +export const RerunFormatter = cucumber.RerunFormatter +export const SnippetsFormatter = cucumber.SnippetsFormatter +export const SummaryFormatter = cucumber.SummaryFormatter +export const UsageFormatter = cucumber.UsageFormatter +export const UsageJsonFormatter = cucumber.UsageJsonFormatter +export const formatterHelpers = cucumber.formatterHelpers + +export const After = cucumber.After +export const AfterAll = cucumber.AfterAll +export const AfterStep = cucumber.AfterStep +export const Before = cucumber.Before +export const BeforeAll = cucumber.BeforeAll +export const BeforeStep = cucumber.BeforeStep +export const defineStep = cucumber.defineStep +export const defineParameterType = cucumber.defineParameterType +export const Given = cucumber.Given +export const setDefaultTimeout = cucumber.setDefaultTimeout +export const setDefinitionFunctionWrapper = + cucumber.setDefinitionFunctionWrapper +export const setWorldConstructor = cucumber.setWorldConstructor +export const setParallelCanAssign = cucumber.setParallelCanAssign +export const Then = cucumber.Then +export const When = cucumber.When +export const World = cucumber.World +export const world = cucumber.world +export const context = cucumber.context +export const parallelCanAssignHelpers = cucumber.parallelCanAssignHelpers + +export const wrapPromiseWithTimeout = cucumber.wrapPromiseWithTimeout + +// Deprecated +export const Cli = cucumber.Cli diff --git a/node_modules/@cucumber/cucumber/package.json b/node_modules/@cucumber/cucumber/package.json new file mode 100644 index 00000000..121b8cd0 --- /dev/null +++ b/node_modules/@cucumber/cucumber/package.json @@ -0,0 +1,358 @@ +{ + "name": "@cucumber/cucumber", + "description": "The official JavaScript implementation of Cucumber.", + "keywords": [ + "testing", + "bdd", + "cucumber", + "gherkin", + "tests" + ], + "version": "12.9.0", + "funding": "https://opencollective.com/cucumber", + "homepage": "https://github.com/cucumber/cucumber-js", + "author": "Julien Biezemans ", + "contributors": [ + "Aaron Garvey", + "abelalmeida ", + "Adam Ark ", + "Ádám Gólya ", + "Ahmed Ashour (https://github.com/asashour)", + "ahulab ", + "Alexandru Gologan (https://github.com/agologan)", + "Artem Bronitsky ", + "Artem Repko ", + "Artur Kania ", + "Artur Neumann ", + "Artur Pomadowski ", + "Aslak Hellesøy ", + "Auke van Leeuwen (https://github.com/aukevanleeuwen)", + "Aurélien Reeves ", + "basemmerink ", + "Ben Van Treese ", + "Benjamín Eidelman ", + "Brian Clozel ", + "Bruce Lindsay ", + "Charles Rudolph ", + "Chris Young ", + "chrismilleruk ", + "Cody Ray Hoeft ", + "Craig Morris ", + "Dale Gardner ", + "Darrin Holst ", + "David Godfrey ", + "David Goss ", + "David H. Gutteridge ", + "Dawn Minion <35529725+dawn-minion@users.noreply.github.com>", + "dbillingham ", + "DevSide ", + "Diego Di Mauro ", + "Dmitry Shirokov ", + "Dmytro Shpakovskyi ", + "Douglas Eggleton (https://github.com/douglaseggleton)", + "Eddie Loeffen ", + "efokschaner ", + "Elwyn ", + "Fedotov Daniil ", + "Fernando Acorreia ", + "Florian Ribon ", + "Gabe Hayes ", + "Gary Taylor ", + "gforceg ", + "Giuseppe DiBella ", + "Greg Knaddison ", + "Honza Javorek ", + "Hugues Malphettes ", + "Ilya Kozhevnikov ", + "Israel Halle ", + "Izhaki ", + "Jan Molak ", + "Jan-Eric Duden ", + "Jaryk (https://github.com/Ugzuzg)", + "Jayson Smith ", + "Jeff Tian (https://github.com/Jeff-Tian)", + "Jesse Harlin ", + "João Guilherme Farias Duda ", + "Joaquín Sorianello ", + "Joey Jan ", + "John Krull ", + "John McLaughlin ", + "John Wright ", + "Johny Jose ", + "Jonathan Gomez ", + "Jonathan Kim ", + "Josh Chisholm ", + "Josh Goldberg ", + "Josua Schmid ", + "jshifflet ", + "Julian ", + "Julian ", + "Julien Biezemans ", + "Julien Gonzalez (https://github.com/customcommander)", + "Karine Pires ", + "Kārlis Amoliņš ", + "Karthik Viswanath ", + "Kevin Goslar ", + "Kevin Kirsche ", + "Kim, Jang-hwan ", + "Konstantin Epishev ", + "kostya.misura ", + "Krispin Schulz ", + "Kushal Pisavadia", + "Kyle Moore ", + "lackita (https://github.com/lackita)", + "Leonardo ", + "Long Nguyen (https://github.com/zcmgyu)", + "lopesc ", + "Lucas Cimon ", + "Ludek", + "Lukas Degener ", + "Łukasz Gandecki ", + "M.P. Korstanje ", + "mannyluvstacos ", + "Manny Pamintuan ", + "Marat Dyatko ", + "Marc Burton ", + "Marcel Hoyer ", + "Marco Muller ", + "Mark Amery ", + "Mark Stein (https://github.com/markstein)", + "Martin Delille ", + "Máté Karácsony ", + "Mateusz Derks ", + "Matt Travi (https://github.com/travi)", + "Matteo Collina ", + "Maxim Koretskiy ", + "mgonnet ", + "Michael Lloyd Morris (https://github.com/michael-lloyd-morris)", + "Michael Mathews (https://github.com/micmath)", + "Michael Zedeler ", + "Miika Hänninen ", + "Mona Ghassemi (https://github.com/BlueMona)", + "Namchee (https://github.com/Namchee)", + "nebehr ", + "Nico Jansen ", + "Niklas Närhinen ", + "Niyaz Akhmetov ", + "Noah Davis ", + "notaphplover (https://github.com/notaphplover)", + "Oliver Odo (https://github.com/olivierodo)", + "Oliver Rogers ", + "Olivier Melcher ", + "Olle Jonsson ", + "Omar Gonzalez ", + "Paul Jensen ", + "Paul Shannon (https://devpaul.com)", + "please-rewrite ", + "plocket ", + "Raphael Gaschignard (https://github.com/rtpg)", + "Renier Morales ", + "Ricardo Albuquerque (https://github.com/ricalbuquerque)", + "Rick Lee-Morlang ", + "RolandArgos ", + "Ronald Chen (https://github.com/Pyrolistical)", + "Sam Saccone ", + "Scott Deakin (https://github.com/GeekyDeaks)", + "seantdg ", + "Seb Rose ", + "Sérgio Junior ", + "Simon Dean ", + "Simon Lampen ", + "Sonny Piers ", + "Stanley Shyiko ", + "Steve Hynding (https://github.com/hynding)", + "Steve Tooke ", + "szymonprz ", + "Ted de Koning", + "temyers ", + "Tim Perry ", + "Toluwap (https://github.com/harcop)", + "Tom V ", + "Tomer Ben-Rachel ", + "Tristan Dunn ", + "Tristan Zander ", + "unknown ", + "Valerio Innocenti Sedili ", + "Vasily Shelkov ", + "vincent.capicotto ", + "vincent-psarga ", + "Warren ", + "Will Farrell ", + "yaronassa ", + "Yohan Siguret ", + "Zearin ", + "zs-zs " + ], + "repository": { + "type": "git", + "url": "git://github.com/cucumber/cucumber-js.git" + }, + "bugs": { + "email": "cukes@googlegroups.com", + "url": "https://github.com/cucumber/cucumber-js/issues" + }, + "directories": { + "lib": "./lib" + }, + "main": "./lib/index.js", + "exports": { + ".": { + "import": "./lib/wrapper.mjs", + "require": "./lib/index.js", + "types": "./lib/index.d.ts" + }, + "./api": { + "import": "./lib/api/wrapper.mjs", + "require": "./lib/api/index.js", + "types": "./lib/api/index.d.ts" + }, + "./lib/*": { + "require": "./lib/*.js" + }, + "./package.json": "./package.json" + }, + "types": "./lib/index.d.ts", + "engines": { + "node": "20 || 22 || >=24" + }, + "enginesTested": { + "node": "20 || 22 || 24 || 25" + }, + "dependencies": { + "@cucumber/ci-environment": "13.0.0", + "@cucumber/cucumber-expressions": "19.0.0", + "@cucumber/gherkin": "38.0.0", + "@cucumber/gherkin-streams": "6.0.0", + "@cucumber/gherkin-utils": "11.0.0", + "@cucumber/html-formatter": "23.1.0", + "@cucumber/junit-xml-formatter": "0.13.3", + "@cucumber/message-streams": "4.1.1", + "@cucumber/messages": "32.3.1", + "@cucumber/pretty-formatter": "1.0.1", + "@cucumber/tag-expressions": "9.1.0", + "assertion-error-formatter": "^3.0.0", + "capital-case": "^1.0.4", + "chalk": "^4.1.2", + "cli-table3": "0.6.5", + "commander": "^14.0.0", + "debug": "^4.3.4", + "error-stack-parser": "^2.1.4", + "figures": "^3.2.0", + "glob": "^13.0.0", + "has-ansi": "^4.0.1", + "indent-string": "^4.0.0", + "is-installed-globally": "^0.4.0", + "is-stream": "^2.0.0", + "knuth-shuffle-seeded": "^1.0.6", + "lodash.merge": "^4.6.2", + "lodash.mergewith": "^4.6.2", + "luxon": "3.7.2", + "mkdirp": "^3.0.0", + "mz": "^2.7.0", + "progress": "^2.0.3", + "read-package-up": "^12.0.0", + "semver": "7.7.4", + "string-argv": "0.3.1", + "supports-color": "^8.1.1", + "type-fest": "^4.41.0", + "util-arity": "^1.1.0", + "yaml": "^2.2.2", + "yup": "1.7.1" + }, + "devDependencies": { + "@cucumber/compatibility-kit": "^28.0.0", + "@cucumber/query": "^15.0.1", + "@eslint/compat": "^2.0.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "^9.29.0", + "@microsoft/api-extractor": "7.58.5", + "@sinonjs/fake-timers": "15.3.2", + "@types/chai": "4.3.20", + "@types/debug": "4.1.13", + "@types/dirty-chai": "2.0.5", + "@types/express": "5.0.6", + "@types/fs-extra": "11.0.4", + "@types/has-ansi": "5.0.2", + "@types/lodash.merge": "4.6.9", + "@types/lodash.mergewith": "4.6.9", + "@types/luxon": "3.7.1", + "@types/mocha": "10.0.10", + "@types/mustache": "4.2.6", + "@types/mz": "2.7.9", + "@types/node": "^20.11.25", + "@types/progress": "2.0.7", + "@types/semver": "7.7.1", + "@types/sinon-chai": "3.2.12", + "@types/sinonjs__fake-timers": "15.0.1", + "@types/stream-buffers": "3.0.8", + "@types/tmp": "0.2.6", + "@typescript-eslint/eslint-plugin": "^8.34.0", + "@typescript-eslint/parser": "^8.34.0", + "chai": "4.5.0", + "chai-exclude": "2.1.1", + "coffeescript": "2.7.0", + "dependency-lint": "7.1.0", + "dirty-chai": "2.0.1", + "eslint": "^9.29.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-n": "^17.20.0", + "eslint-plugin-unicorn": "^63.0.0", + "express": "^5.0.0", + "fs-extra": "11.3.4", + "genversion": "3.2.0", + "mocha": "^11.0.1", + "mustache": "4.2.0", + "nyc": "18.0.0", + "prettier": "^3.5.3", + "reindent-template-literals": "1.1.0", + "shx": "0.4.0", + "sinon": "21.1.2", + "sinon-chai": "3.7.0", + "stream-to-string": "1.2.1", + "tmp": "0.2.5", + "ts-node": "10.9.2", + "tsd": "0.33.0", + "typedoc": "^0.28.0", + "typescript": "^5.8.3" + }, + "overrides": { + "ansi-regex": "^5.0.1" + }, + "scripts": { + "build-local": "genversion --es6 src/version.ts && tsc --build tsconfig.node.json && shx cp src/wrapper.mjs lib/ && shx cp src/api/wrapper.mjs lib/api/", + "cck-test": "mocha \"compatibility/**/*_spec.ts\"", + "exports-generate-docs": "typedoc", + "exports-test": "api-extractor run --config exports/api/api-extractor.json --verbose && api-extractor run --config exports/root/api-extractor.json --verbose", + "exports-update": "api-extractor run --config exports/api/api-extractor.json --verbose --local && api-extractor run --config exports/root/api-extractor.json --verbose --local", + "feature-test": "node bin/cucumber.js", + "lint-code-autofix": "eslint --fix \"{compatibility,example,features,scripts,src,test}/**/*.ts\"", + "lint-code": "eslint \"{compatibility,example,features,scripts,src,test}/**/*.ts\"", + "lint-dependencies": "dependency-lint", + "lint-format-autofix": "prettier --write .", + "lint-format": "prettier --check .", + "lint": "npm run lint-code && npm run lint-format && npm run lint-dependencies", + "preexports-generate-docs": "npm run build-local", + "preexports-test": "npm run build-local", + "preexports-update": "npm run build-local", + "prelint-autofix": "npm run build-local", + "prelint-code": "npm run build-local", + "precck-test": "npm run build-local", + "prefeature-test": "npm run build-local", + "prepublishOnly": "rm -rf lib && npm run build-local", + "pretest-coverage": "npm run build-local", + "pretypes-test": "npm run build-local", + "test-coverage": "nyc --silent mocha \"src/**/*_spec.ts\" \"compatibility/**/*_spec.ts\" && nyc --silent --no-clean node bin/cucumber.js --tags \"not @source-mapping\" && nyc report --reporter=lcov", + "test": "npm run lint && npm run exports-test && npm run types-test && npm run unit-test && npm run cck-test && npm run feature-test", + "types-test": "tsd", + "unit-test": "mocha \"src/**/*_spec.ts\"" + }, + "bin": { + "cucumber-js": "bin/cucumber.js" + }, + "license": "MIT", + "files": [ + "api/", + "bin/", + "lib/" + ] +} diff --git a/node_modules/@cucumber/gherkin-streams/.github/renovate.json b/node_modules/@cucumber/gherkin-streams/.github/renovate.json new file mode 100644 index 00000000..1975114f --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/.github/renovate.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "github>cucumber/renovate-config" + ] +} diff --git a/node_modules/@cucumber/gherkin-streams/.github/settings.yml b/node_modules/@cucumber/gherkin-streams/.github/settings.yml new file mode 100644 index 00000000..87a02423 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/.github/settings.yml @@ -0,0 +1,5 @@ +_extends: .github + +repository: + name: gherkin-streams + description: Stream utilities to read Gherkin parser output. diff --git a/node_modules/@cucumber/gherkin-streams/.github/workflows/release-github.yml b/node_modules/@cucumber/gherkin-streams/.github/workflows/release-github.yml new file mode 100644 index 00000000..fc8f2d0d --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/.github/workflows/release-github.yml @@ -0,0 +1,28 @@ +name: Release on github + +on: + push: + branches: + - release/* + +jobs: + + pre-release-check: + uses: cucumber/.github/.github/workflows/prerelease-checks.yml@main + + test-javascript: + uses: ./.github/workflows/test.yml + + create-github-release: + name: Create GitHub Release and Git tag + needs: [pre-release-check, test-javascript] + runs-on: ubuntu-latest + environment: Release + permissions: + contents: write + + steps: + - uses: actions/checkout@v5 + - uses: cucumber/action-create-github-release@v1.1.1 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/node_modules/@cucumber/gherkin-streams/.github/workflows/release.yml b/node_modules/@cucumber/gherkin-streams/.github/workflows/release.yml new file mode 100644 index 00000000..b019bf70 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/.github/workflows/release.yml @@ -0,0 +1,34 @@ +name: Release npm module + +on: + push: + branches: + - release/* + +jobs: + pre-release-check: + uses: cucumber/.github/.github/workflows/prerelease-checks.yml@main + + test-javascript: + uses: ./.github/workflows/test.yml + + publish-npm: + name: Publish NPM module + needs: [pre-release-check, test-javascript] + runs-on: ubuntu-latest + environment: Release + + steps: + - uses: actions/checkout@v5 + + - uses: actions/setup-node@v5 + with: + node-version: 22.x + cache: "npm" + cache-dependency-path: package-lock.json + + - run: npm install-ci-test + + - uses: cucumber/action-publish-npm@v1.1.1 + with: + npm-token: ${{ secrets.NPM_TOKEN }} diff --git a/node_modules/@cucumber/gherkin-streams/.github/workflows/test.yml b/node_modules/@cucumber/gherkin-streams/.github/workflows/test.yml new file mode 100644 index 00000000..af6a10c6 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/.github/workflows/test.yml @@ -0,0 +1,47 @@ +name: test-javascript + +on: + push: + branches: + - main + - renovate/** + pull_request: + branches: + - main + workflow_call: + +jobs: + test-javascript: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: + - ubuntu-latest + node-version: ["20.x", "22.x", "24.x"] + include: + - os: windows-latest + node-version: "22.x" + - os: macos-latest + node-version: "22.x" + + steps: + - name: set git core.autocrlf to 'input' + run: git config --global core.autocrlf input + + - uses: actions/checkout@v5 + + - name: with Node.js ${{ matrix.node-version }} on ${{ matrix.os }} + uses: actions/setup-node@v5 + with: + node-version: ${{ matrix.node-version }} + cache: "npm" + cache-dependency-path: package-lock.json + + - run: npm --version + + - run: npm install-ci-test + + - run: npm run build + + - run: npm run lint diff --git a/node_modules/@cucumber/gherkin-streams/.mocharc.json b/node_modules/@cucumber/gherkin-streams/.mocharc.json new file mode 100644 index 00000000..b0833b9c --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/.mocharc.json @@ -0,0 +1,6 @@ +{ + "require": ["ts-node/register", "source-map-support/register"], + "extension": ["ts", "tsx"], + "recursive": true, + "timeout": 10000 +} diff --git a/node_modules/@cucumber/gherkin-streams/.prettierrc.json b/node_modules/@cucumber/gherkin-streams/.prettierrc.json new file mode 100644 index 00000000..b4dbbdc1 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/.prettierrc.json @@ -0,0 +1,5 @@ +{ + "trailingComma": "es5", + "singleQuote": true, + "semi": false +} \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/CHANGELOG.md b/node_modules/@cucumber/gherkin-streams/CHANGELOG.md new file mode 100644 index 00000000..aa9426d9 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/CHANGELOG.md @@ -0,0 +1,74 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/) +and this project adheres to [Semantic Versioning](http://semver.org/). + +## [Unreleased] + +## [6.0.0] - 2025-09-12 +### Added +- Add support for Node.js 24.x ([#111](https://github.com/cucumber/gherkin-streams/pull/111)) + +### Removed +- Drop support for Node.js 18.x, 22.x ([#111](https://github.com/cucumber/gherkin-streams/pull/111)) + +## [5.0.1] - 2022-03-31 +### Changed +- Peer dependencies are now more permissive and simply request any version greater than: + - @cucumber/gherkin: >=22.0.0 + - @cucumber/messages: >=17.1.1 + - @cucumber/message-streams: >=4.0.0 + +## [5.0.0] - 2022-03-07 +### Changed +- `@cucumber/gherkin`, `@cucumber/messages` and `@cucumber/message-streams` are now +peer dependencies. You now have to add `@cucumber/gherkin` in your dependencies: +```diff +{ +"dependencies": { + - "@cucumber/gherkin": "22.0.0", +"@cucumber/gherkin-streams": "5.0.0", +} +} +``` +([PR#5](https://github.com/cucumber/gherkin-streams/pull/5)) + +## [4.0.0] - 2021-09-01 +### Changed +- Upgrade to `@cucumber/messages` `17.1.0` +- Upgrade to `@cucumber/gherkin` `21.0.0` + +## [3.0.0] - 2021-07-08 +### Changed +- Upgrade to `@cucumber/messages` `17.0.0` +- Upgrade to `@cucumber/gherkin` `20.0.0` + +## [2.0.2] - 2021-05-17 +### Changed +- Upgrade to `@cucumber/message-streams` `2.0.0` + +## [2.0.1] - 2021-05-17 +### Fixed +- Use `^x.y.z` version for `@cucumber/*` dependencies, allowing minor and patch releases to be picked up. + +## [2.0.0] - 2021-05-15 +### Added +- Add ability to specify a `relativeTo` path for cleaner emitted `uri`s [#1510](https://github.com/cucumber/cucumber/pull/1510) + +### Changed +- Upgrade to gherkin 19.0.0 + +## [1.0.0] - 2021-03-24 + +[Unreleased]: https://github.com/cucumber/gherkin-streams/compare/v6.0.0...HEAD +[6.0.0]: https://github.com/cucumber/gherkin-streams/compare/v5.0.1...v6.0.0 +[5.0.1]: https://github.com/cucumber/gherkin-streams/compare/v5.0.0...v5.0.1 +[5.0.0]: https://github.com/cucumber/gherkin-streams/compare/v4.0.0...v5.0.0 +[4.0.0]: https://github.com/cucumber/gherkin-streams/releases/tag/v3.0.0 +[3.0.0]: https://github.com/cucumber/gherkin-streams/releases/tag/v2.0.2 +[2.0.2]: https://github.com/cucumber/gherkin-streams/releases/tag/v2.0.1 +[2.0.1]: https://github.com/cucumber/gherkin-streams/releases/tag/v2.0.0 +[2.0.0]: https://github.com/cucumber/gherkin-streams/releases/tag/v1.0.0 +[1.0.0]: https://github.com/cucumber/gherkin-streams/releases/tag/v1.0.0 diff --git a/node_modules/@cucumber/gherkin-streams/README.md b/node_modules/@cucumber/gherkin-streams/README.md new file mode 100644 index 00000000..4b9c0c85 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/README.md @@ -0,0 +1,50 @@ +# Gherkin Streams + +This module contains utilities to use the Gherkin library with streams. + +## Installation + +`gherkin-streams` has 3 peer dependencies: `@cucumber/gherkin`, `@cucumber/messages` +and `@cucumber/message-streams`. + +You need to have `@cucumber/gherkin` and`@cucumber/message-streams` in your dependencies, +`@cucumber/messages` is actually installed automatically with `@cucumber/gherkin`. + + npm install @cucumber/gherkin-streams @cucumber/gherkin @cucumber/message-streams + +## Usage + +```javascript +const { GherkinStreams } = require('@cucumber/gherkin-streams') + +const options = { + includeSource: true, + includeGherkinDocument: true, + includePickles: true, +} +const stream = GherkinStreams.fromPaths(['features/hello.feature']) + +// Pipe the stream to another stream that can read messages. +stream.pipe(...) +``` + +### Shortening URIs with `relativeTo` + +You can include `relativeTo` option to avoid emitting longer or absolute URIs, instead making them only relative to the current working directory (or whatever makes sense for your use case): + +```javascript +const { GherkinStreams } = require('@cucumber/gherkin-streams') + +// imagine `discoverPaths()` is a function that returns absolute paths +const paths = discoverPaths(); +const options = { + includeSource: true, + includeGherkinDocument: true, + includePickles: true, + relativeTo: process.cwd() +} +const stream = GherkinStreams.fromPaths(paths) + +// Pipe the stream to another stream that can read messages. +stream.pipe(...) +``` diff --git a/node_modules/@cucumber/gherkin-streams/RELEASIN.md b/node_modules/@cucumber/gherkin-streams/RELEASIN.md new file mode 100644 index 00000000..71e0bb87 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/RELEASIN.md @@ -0,0 +1 @@ +See [.github/RELEASING](https://github.com/cucumber/.github/blob/main/RELEASING.md). diff --git a/node_modules/@cucumber/gherkin-streams/bin/gherkin b/node_modules/@cucumber/gherkin-streams/bin/gherkin new file mode 100644 index 00000000..f03cb990 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/bin/gherkin @@ -0,0 +1,4 @@ +#!/usr/bin/env node +'use strict' +require('source-map-support').install() +require('../dist/src/cli/main') diff --git a/node_modules/@cucumber/gherkin-streams/dist/package.json b/node_modules/@cucumber/gherkin-streams/dist/package.json new file mode 100644 index 00000000..51ff0737 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/package.json @@ -0,0 +1,62 @@ +{ + "name": "@cucumber/gherkin-streams", + "version": "6.0.0", + "description": "Streams for reading Gherkin parser output", + "main": "dist/src/index.js", + "types": "dist/src/index.d.ts", + "bin": { + "gherkin-javascript": "bin/gherkin" + }, + "repository": { + "type": "git", + "url": "git://github.com/cucumber/gherkin-streams.git" + }, + "author": "Cucumber Limited ", + "license": "MIT", + "scripts": { + "test": "mocha", + "build": "tsc --build tsconfig.build.json", + "prepublishOnly": "npm run build", + "fix": "eslint --max-warnings 0 --fix src test && prettier --write src test", + "lint": "eslint --max-warnings 0 src test && prettier --check src test" + }, + "dependencies": { + "commander": "14.0.0", + "source-map-support": "0.5.21" + }, + "devDependencies": { + "@cucumber/gherkin": "^34.0.0", + "@cucumber/message-streams": "^4.0.1", + "@cucumber/messages": "^29.0.0", + "@eslint/compat": "^1.2.7", + "@eslint/eslintrc": "^3.3.0", + "@eslint/js": "^9.21.0", + "@types/mocha": "10.0.10", + "@types/node": "22.18.1", + "@typescript-eslint/eslint-plugin": "^8.43.0", + "@typescript-eslint/parser": "^8.43.0", + "eslint": "^9.21.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-n": "^17.15.1", + "eslint-plugin-simple-import-sort": "^12.1.1", + "globals": "^16.0.0", + "mocha": "11.7.2", + "nyc": "17.1.0", + "prettier": "^3.5.2", + "ts-node": "^10.7.0", + "typescript": "5.9.2" + }, + "peerDependencies": { + "@cucumber/gherkin": ">=22.0.0", + "@cucumber/message-streams": ">=4.0.0", + "@cucumber/messages": ">=17.1.1" + }, + "bugs": { + "url": "https://github.com/cucumber/gherkin-streams/issues" + }, + "homepage": "https://github.com/cucumber/gherkin-streams#readme", + "directories": { + "test": "test" + }, + "keywords": [] +} diff --git a/node_modules/@cucumber/gherkin-streams/dist/src/GherkinStreams.d.ts b/node_modules/@cucumber/gherkin-streams/dist/src/GherkinStreams.d.ts new file mode 100644 index 00000000..7d0bd36c --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/src/GherkinStreams.d.ts @@ -0,0 +1,14 @@ +import { IGherkinOptions } from '@cucumber/gherkin'; +import * as messages from '@cucumber/messages'; +import { Readable } from 'stream'; +export interface IGherkinStreamOptions extends IGherkinOptions { + relativeTo?: string; +} +declare function fromPaths(paths: readonly string[], options: IGherkinStreamOptions): Readable; +declare function fromSources(envelopes: readonly messages.Envelope[], options: IGherkinOptions): Readable; +declare const _default: { + fromPaths: typeof fromPaths; + fromSources: typeof fromSources; +}; +export default _default; +//# sourceMappingURL=GherkinStreams.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/dist/src/GherkinStreams.d.ts.map b/node_modules/@cucumber/gherkin-streams/dist/src/GherkinStreams.d.ts.map new file mode 100644 index 00000000..8aa770aa --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/src/GherkinStreams.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"GherkinStreams.d.ts","sourceRoot":"","sources":["../../src/GherkinStreams.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,KAAK,QAAQ,MAAM,oBAAoB,CAAA;AAE9C,OAAO,EAAe,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAM9C,MAAM,WAAW,qBAAsB,SAAQ,eAAe;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,iBAAS,SAAS,CAChB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,OAAO,EAAE,qBAAqB,GAC7B,QAAQ,CA8BV;AAED,iBAAS,WAAW,CAClB,SAAS,EAAE,SAAS,QAAQ,CAAC,QAAQ,EAAE,EACvC,OAAO,EAAE,eAAe,GACvB,QAAQ,CAsBV;;;;;AAED,wBAGC"} \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/dist/src/GherkinStreams.js b/node_modules/@cucumber/gherkin-streams/dist/src/GherkinStreams.js new file mode 100644 index 00000000..99040def --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/src/GherkinStreams.js @@ -0,0 +1,65 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const fs_1 = __importDefault(require("fs")); +const stream_1 = require("stream"); +const makeGherkinOptions_1 = __importDefault(require("./makeGherkinOptions")); +const ParserMessageStream_1 = __importDefault(require("./ParserMessageStream")); +const SourceMessageStream_1 = __importDefault(require("./SourceMessageStream")); +function fromPaths(paths, options) { + const pathsCopy = paths.slice(); + options = (0, makeGherkinOptions_1.default)(options); + const combinedMessageStream = new stream_1.PassThrough({ + writableObjectMode: true, + readableObjectMode: true, + }); + function pipeSequentially() { + const path = pathsCopy.shift(); + if (path !== undefined) { + const parserMessageStream = new ParserMessageStream_1.default(options); + parserMessageStream.on('end', () => { + pipeSequentially(); + }); + const end = pathsCopy.length === 0; + // Can't use pipeline here because of the { end } argument, + // so we have to manually propagate errors. + fs_1.default.createReadStream(path, { encoding: 'utf-8' }) + .on('error', (err) => combinedMessageStream.emit('error', err)) + .pipe(new SourceMessageStream_1.default(path, options.relativeTo)) + .on('error', (err) => combinedMessageStream.emit('error', err)) + .pipe(parserMessageStream) + .on('error', (err) => combinedMessageStream.emit('error', err)) + .pipe(combinedMessageStream, { end }); + } + } + pipeSequentially(); + return combinedMessageStream; +} +function fromSources(envelopes, options) { + const envelopesCopy = envelopes.slice(); + options = (0, makeGherkinOptions_1.default)(options); + const combinedMessageStream = new stream_1.PassThrough({ + writableObjectMode: true, + readableObjectMode: true, + }); + function pipeSequentially() { + const envelope = envelopesCopy.shift(); + if (envelope !== undefined && envelope.source) { + const parserMessageStream = new ParserMessageStream_1.default(options); + parserMessageStream.pipe(combinedMessageStream, { + end: envelopesCopy.length === 0, + }); + parserMessageStream.on('end', pipeSequentially); + parserMessageStream.end(envelope); + } + } + pipeSequentially(); + return combinedMessageStream; +} +exports.default = { + fromPaths, + fromSources, +}; +//# sourceMappingURL=GherkinStreams.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/dist/src/GherkinStreams.js.map b/node_modules/@cucumber/gherkin-streams/dist/src/GherkinStreams.js.map new file mode 100644 index 00000000..9e36dc16 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/src/GherkinStreams.js.map @@ -0,0 +1 @@ +{"version":3,"file":"GherkinStreams.js","sourceRoot":"","sources":["../../src/GherkinStreams.ts"],"names":[],"mappings":";;;;;AAEA,4CAAmB;AACnB,mCAA8C;AAE9C,8EAAqD;AACrD,gFAAuD;AACvD,gFAAuD;AAMvD,SAAS,SAAS,CAChB,KAAwB,EACxB,OAA8B;IAE9B,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,EAAE,CAAA;IAC/B,OAAO,GAAG,IAAA,4BAAkB,EAAC,OAAO,CAAC,CAAA;IACrC,MAAM,qBAAqB,GAAG,IAAI,oBAAW,CAAC;QAC5C,kBAAkB,EAAE,IAAI;QACxB,kBAAkB,EAAE,IAAI;KACzB,CAAC,CAAA;IAEF,SAAS,gBAAgB;QACvB,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAA;QAC9B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,mBAAmB,GAAG,IAAI,6BAAmB,CAAC,OAAO,CAAC,CAAA;YAC5D,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjC,gBAAgB,EAAE,CAAA;YACpB,CAAC,CAAC,CAAA;YAEF,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,KAAK,CAAC,CAAA;YAClC,2DAA2D;YAC3D,2CAA2C;YAC3C,YAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;iBAC7C,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;iBAC9D,IAAI,CAAC,IAAI,6BAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;iBACvD,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;iBAC9D,IAAI,CAAC,mBAAmB,CAAC;iBACzB,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;iBAC9D,IAAI,CAAC,qBAAqB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;QACzC,CAAC;IACH,CAAC;IACD,gBAAgB,EAAE,CAAA;IAClB,OAAO,qBAAqB,CAAA;AAC9B,CAAC;AAED,SAAS,WAAW,CAClB,SAAuC,EACvC,OAAwB;IAExB,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,EAAE,CAAA;IACvC,OAAO,GAAG,IAAA,4BAAkB,EAAC,OAAO,CAAC,CAAA;IACrC,MAAM,qBAAqB,GAAG,IAAI,oBAAW,CAAC;QAC5C,kBAAkB,EAAE,IAAI;QACxB,kBAAkB,EAAE,IAAI;KACzB,CAAC,CAAA;IAEF,SAAS,gBAAgB;QACvB,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,CAAA;QACtC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC9C,MAAM,mBAAmB,GAAG,IAAI,6BAAmB,CAAC,OAAO,CAAC,CAAA;YAC5D,mBAAmB,CAAC,IAAI,CAAC,qBAAqB,EAAE;gBAC9C,GAAG,EAAE,aAAa,CAAC,MAAM,KAAK,CAAC;aAChC,CAAC,CAAA;YACF,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAA;YAC/C,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACnC,CAAC;IACH,CAAC;IACD,gBAAgB,EAAE,CAAA;IAElB,OAAO,qBAAqB,CAAA;AAC9B,CAAC;AAED,kBAAe;IACb,SAAS;IACT,WAAW;CACZ,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/dist/src/ParserMessageStream.d.ts b/node_modules/@cucumber/gherkin-streams/dist/src/ParserMessageStream.d.ts new file mode 100644 index 00000000..4bbfddc4 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/src/ParserMessageStream.d.ts @@ -0,0 +1,12 @@ +import { IGherkinOptions } from '@cucumber/gherkin'; +import * as messages from '@cucumber/messages'; +import { Transform, TransformCallback } from 'stream'; +/** + * Stream that reads Source messages and writes GherkinDocument and Pickle messages. + */ +export default class ParserMessageStream extends Transform { + private readonly options; + constructor(options: IGherkinOptions); + _transform(envelope: messages.Envelope, encoding: string, callback: TransformCallback): void; +} +//# sourceMappingURL=ParserMessageStream.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/dist/src/ParserMessageStream.d.ts.map b/node_modules/@cucumber/gherkin-streams/dist/src/ParserMessageStream.d.ts.map new file mode 100644 index 00000000..12528253 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/src/ParserMessageStream.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ParserMessageStream.d.ts","sourceRoot":"","sources":["../../src/ParserMessageStream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACrE,OAAO,KAAK,QAAQ,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AAErD;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,SAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,eAAe;IAI9C,UAAU,CACf,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAC3B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,iBAAiB;CAe9B"} \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/dist/src/ParserMessageStream.js b/node_modules/@cucumber/gherkin-streams/dist/src/ParserMessageStream.js new file mode 100644 index 00000000..75dbc874 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/src/ParserMessageStream.js @@ -0,0 +1,24 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const gherkin_1 = require("@cucumber/gherkin"); +const stream_1 = require("stream"); +/** + * Stream that reads Source messages and writes GherkinDocument and Pickle messages. + */ +class ParserMessageStream extends stream_1.Transform { + constructor(options) { + super({ writableObjectMode: true, readableObjectMode: true }); + this.options = options; + } + _transform(envelope, encoding, callback) { + if (envelope.source) { + const messageList = (0, gherkin_1.generateMessages)(envelope.source.data, envelope.source.uri, envelope.source.mediaType, this.options); + for (const message of messageList) { + this.push(message); + } + } + callback(); + } +} +exports.default = ParserMessageStream; +//# sourceMappingURL=ParserMessageStream.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/dist/src/ParserMessageStream.js.map b/node_modules/@cucumber/gherkin-streams/dist/src/ParserMessageStream.js.map new file mode 100644 index 00000000..c7719a34 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/src/ParserMessageStream.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ParserMessageStream.js","sourceRoot":"","sources":["../../src/ParserMessageStream.ts"],"names":[],"mappings":";;AAAA,+CAAqE;AAErE,mCAAqD;AAErD;;GAEG;AACH,MAAqB,mBAAoB,SAAQ,kBAAS;IACxD,YAA6B,OAAwB;QACnD,KAAK,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAA;QADlC,YAAO,GAAP,OAAO,CAAiB;IAErD,CAAC;IAEM,UAAU,CACf,QAA2B,EAC3B,QAAgB,EAChB,QAA2B;QAE3B,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,WAAW,GAAG,IAAA,0BAAgB,EAClC,QAAQ,CAAC,MAAM,CAAC,IAAI,EACpB,QAAQ,CAAC,MAAM,CAAC,GAAG,EACnB,QAAQ,CAAC,MAAM,CAAC,SAAS,EACzB,IAAI,CAAC,OAAO,CACb,CAAA;YACD,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;gBAClC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACpB,CAAC;QACH,CAAC;QACD,QAAQ,EAAE,CAAA;IACZ,CAAC;CACF;AAvBD,sCAuBC"} \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/dist/src/SourceMessageStream.d.ts b/node_modules/@cucumber/gherkin-streams/dist/src/SourceMessageStream.d.ts new file mode 100644 index 00000000..d83ebaaa --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/src/SourceMessageStream.d.ts @@ -0,0 +1,13 @@ +import { Transform, TransformCallback } from 'stream'; +/** + * Stream that reads a string and writes a single Source message. + */ +export default class SourceMessageStream extends Transform { + private readonly uri; + private readonly relativeTo?; + private buffer; + constructor(uri: string, relativeTo?: string); + _transform(chunk: Buffer, encoding: string, callback: TransformCallback): void; + _flush(callback: TransformCallback): void; +} +//# sourceMappingURL=SourceMessageStream.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/dist/src/SourceMessageStream.d.ts.map b/node_modules/@cucumber/gherkin-streams/dist/src/SourceMessageStream.d.ts.map new file mode 100644 index 00000000..7918c0f3 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/src/SourceMessageStream.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"SourceMessageStream.d.ts","sourceRoot":"","sources":["../../src/SourceMessageStream.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AAErD;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,SAAS;IAItD,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;IAJ9B,OAAO,CAAC,MAAM,CAAkB;gBAGb,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE,MAAM;IAK/B,UAAU,CACf,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,iBAAiB;IAMtB,MAAM,CAAC,QAAQ,EAAE,iBAAiB;CAS1C"} \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/dist/src/SourceMessageStream.js b/node_modules/@cucumber/gherkin-streams/dist/src/SourceMessageStream.js new file mode 100644 index 00000000..332bcae9 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/src/SourceMessageStream.js @@ -0,0 +1,28 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const gherkin_1 = require("@cucumber/gherkin"); +const path_1 = require("path"); +const stream_1 = require("stream"); +/** + * Stream that reads a string and writes a single Source message. + */ +class SourceMessageStream extends stream_1.Transform { + constructor(uri, relativeTo) { + super({ readableObjectMode: true, writableObjectMode: false }); + this.uri = uri; + this.relativeTo = relativeTo; + this.buffer = Buffer.alloc(0); + } + _transform(chunk, encoding, callback) { + this.buffer = Buffer.concat([this.buffer, chunk]); + callback(); + } + _flush(callback) { + const data = this.buffer.toString('utf-8'); + const chunk = (0, gherkin_1.makeSourceEnvelope)(data, this.relativeTo ? (0, path_1.relative)(this.relativeTo, this.uri) : this.uri); + this.push(chunk); + callback(); + } +} +exports.default = SourceMessageStream; +//# sourceMappingURL=SourceMessageStream.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/dist/src/SourceMessageStream.js.map b/node_modules/@cucumber/gherkin-streams/dist/src/SourceMessageStream.js.map new file mode 100644 index 00000000..84fe13e1 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/src/SourceMessageStream.js.map @@ -0,0 +1 @@ +{"version":3,"file":"SourceMessageStream.js","sourceRoot":"","sources":["../../src/SourceMessageStream.ts"],"names":[],"mappings":";;AAAA,+CAAsD;AACtD,+BAA+B;AAC/B,mCAAqD;AAErD;;GAEG;AACH,MAAqB,mBAAoB,SAAQ,kBAAS;IAGxD,YACmB,GAAW,EACX,UAAmB;QAEpC,KAAK,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,CAAA;QAH7C,QAAG,GAAH,GAAG,CAAQ;QACX,eAAU,GAAV,UAAU,CAAS;QAJ9B,WAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAOhC,CAAC;IAEM,UAAU,CACf,KAAa,EACb,QAAgB,EAChB,QAA2B;QAE3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAA;QACjD,QAAQ,EAAE,CAAA;IACZ,CAAC;IAEM,MAAM,CAAC,QAA2B;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QAC1C,MAAM,KAAK,GAAG,IAAA,4BAAkB,EAC9B,IAAI,EACJ,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAA,eAAQ,EAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CACjE,CAAA;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAChB,QAAQ,EAAE,CAAA;IACZ,CAAC;CACF;AA5BD,sCA4BC"} \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/dist/src/cli/main.d.ts b/node_modules/@cucumber/gherkin-streams/dist/src/cli/main.d.ts new file mode 100644 index 00000000..371115b3 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/src/cli/main.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=main.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/dist/src/cli/main.d.ts.map b/node_modules/@cucumber/gherkin-streams/dist/src/cli/main.d.ts.map new file mode 100644 index 00000000..f39e3296 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/src/cli/main.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../src/cli/main.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/dist/src/cli/main.js b/node_modules/@cucumber/gherkin-streams/dist/src/cli/main.js new file mode 100644 index 00000000..c8db8a3e --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/src/cli/main.js @@ -0,0 +1,31 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const message_streams_1 = require("@cucumber/message-streams"); +const messages_1 = require("@cucumber/messages"); +const commander_1 = require("commander"); +const package_json_1 = __importDefault(require("../../package.json")); +const GherkinStreams_1 = __importDefault(require("../GherkinStreams")); +const program = new commander_1.Command(); +program.version(package_json_1.default.version); +program.option('--no-source', 'Do not output Source messages'); +program.option('--no-ast', 'Do not output GherkinDocument messages'); +program.option('--no-pickles', 'Do not output Pickle messages'); +program.option('--predictable-ids', 'Use predictable ids', false); +program.parse(process.argv); +const paths = program.args; +const options = { + defaultDialect: 'en', + includeSource: program.opts().source, + includeGherkinDocument: program.opts().ast, + includePickles: program.opts().pickles, + newId: program.opts().predictableIds + ? messages_1.IdGenerator.incrementing() + : messages_1.IdGenerator.uuid(), +}; +GherkinStreams_1.default.fromPaths(paths, options) + .pipe(new message_streams_1.MessageToNdjsonStream()) + .pipe(process.stdout); +//# sourceMappingURL=main.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/dist/src/cli/main.js.map b/node_modules/@cucumber/gherkin-streams/dist/src/cli/main.js.map new file mode 100644 index 00000000..12c4ffd5 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/src/cli/main.js.map @@ -0,0 +1 @@ +{"version":3,"file":"main.js","sourceRoot":"","sources":["../../../src/cli/main.ts"],"names":[],"mappings":";;;;;AACA,+DAAiE;AACjE,iDAAgD;AAChD,yCAAmC;AAEnC,sEAA4C;AAC5C,uEAA8C;AAE9C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAA;AAC7B,OAAO,CAAC,OAAO,CAAC,sBAAW,CAAC,OAAO,CAAC,CAAA;AACpC,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,+BAA+B,CAAC,CAAA;AAC9D,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,wCAAwC,CAAC,CAAA;AACpE,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,+BAA+B,CAAC,CAAA;AAC/D,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,qBAAqB,EAAE,KAAK,CAAC,CAAA;AACjE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAA;AAE1B,MAAM,OAAO,GAAoB;IAC/B,cAAc,EAAE,IAAI;IACpB,aAAa,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM;IACpC,sBAAsB,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG;IAC1C,cAAc,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO;IACtC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,cAAc;QAClC,CAAC,CAAC,sBAAW,CAAC,YAAY,EAAE;QAC5B,CAAC,CAAC,sBAAW,CAAC,IAAI,EAAE;CACvB,CAAA;AAED,wBAAc,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC;KACrC,IAAI,CAAC,IAAI,uCAAqB,EAAE,CAAC;KACjC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/dist/src/index.d.ts b/node_modules/@cucumber/gherkin-streams/dist/src/index.d.ts new file mode 100644 index 00000000..bee0c0c4 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/src/index.d.ts @@ -0,0 +1,3 @@ +import GherkinStreams, { IGherkinStreamOptions } from './GherkinStreams'; +export { GherkinStreams, IGherkinStreamOptions }; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/dist/src/index.d.ts.map b/node_modules/@cucumber/gherkin-streams/dist/src/index.d.ts.map new file mode 100644 index 00000000..d3151268 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/src/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,EAAE,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAExE,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/dist/src/index.js b/node_modules/@cucumber/gherkin-streams/dist/src/index.js new file mode 100644 index 00000000..39256a3c --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/src/index.js @@ -0,0 +1,9 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GherkinStreams = void 0; +const GherkinStreams_1 = __importDefault(require("./GherkinStreams")); +exports.GherkinStreams = GherkinStreams_1.default; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/dist/src/index.js.map b/node_modules/@cucumber/gherkin-streams/dist/src/index.js.map new file mode 100644 index 00000000..a75b4f2d --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/src/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,sEAAwE;AAE/D,yBAFF,wBAAc,CAEE"} \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/dist/src/makeGherkinOptions.d.ts b/node_modules/@cucumber/gherkin-streams/dist/src/makeGherkinOptions.d.ts new file mode 100644 index 00000000..d8c4795a --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/src/makeGherkinOptions.d.ts @@ -0,0 +1,3 @@ +import { IGherkinOptions } from '@cucumber/gherkin'; +export default function gherkinOptions(options: IGherkinOptions): IGherkinOptions; +//# sourceMappingURL=makeGherkinOptions.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/dist/src/makeGherkinOptions.d.ts.map b/node_modules/@cucumber/gherkin-streams/dist/src/makeGherkinOptions.d.ts.map new file mode 100644 index 00000000..adff1f88 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/src/makeGherkinOptions.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"makeGherkinOptions.d.ts","sourceRoot":"","sources":["../../src/makeGherkinOptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAWnD,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,OAAO,EAAE,eAAe,GACvB,eAAe,CAEjB"} \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/dist/src/makeGherkinOptions.js b/node_modules/@cucumber/gherkin-streams/dist/src/makeGherkinOptions.js new file mode 100644 index 00000000..cd0e3ecb --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/src/makeGherkinOptions.js @@ -0,0 +1,15 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = gherkinOptions; +const messages_1 = require("@cucumber/messages"); +const defaultOptions = { + defaultDialect: 'en', + includeSource: true, + includeGherkinDocument: true, + includePickles: true, + newId: messages_1.IdGenerator.uuid(), +}; +function gherkinOptions(options) { + return Object.assign(Object.assign({}, defaultOptions), options); +} +//# sourceMappingURL=makeGherkinOptions.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/dist/src/makeGherkinOptions.js.map b/node_modules/@cucumber/gherkin-streams/dist/src/makeGherkinOptions.js.map new file mode 100644 index 00000000..2768edb7 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/src/makeGherkinOptions.js.map @@ -0,0 +1 @@ +{"version":3,"file":"makeGherkinOptions.js","sourceRoot":"","sources":["../../src/makeGherkinOptions.ts"],"names":[],"mappings":";;AAWA,iCAIC;AAdD,iDAAgD;AAEhD,MAAM,cAAc,GAAoB;IACtC,cAAc,EAAE,IAAI;IACpB,aAAa,EAAE,IAAI;IACnB,sBAAsB,EAAE,IAAI;IAC5B,cAAc,EAAE,IAAI;IACpB,KAAK,EAAE,sBAAW,CAAC,IAAI,EAAE;CAC1B,CAAA;AAED,SAAwB,cAAc,CACpC,OAAwB;IAExB,uCAAY,cAAc,GAAK,OAAO,EAAE;AAC1C,CAAC"} \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/dist/test/StreamTest.d.ts b/node_modules/@cucumber/gherkin-streams/dist/test/StreamTest.d.ts new file mode 100644 index 00000000..9434fdb6 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/test/StreamTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=StreamTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/dist/test/StreamTest.d.ts.map b/node_modules/@cucumber/gherkin-streams/dist/test/StreamTest.d.ts.map new file mode 100644 index 00000000..155e0247 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/test/StreamTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"StreamTest.d.ts","sourceRoot":"","sources":["../../test/StreamTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/dist/test/StreamTest.js b/node_modules/@cucumber/gherkin-streams/dist/test/StreamTest.js new file mode 100644 index 00000000..49d72137 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/test/StreamTest.js @@ -0,0 +1,68 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const gherkin_1 = require("@cucumber/gherkin"); +const assert_1 = __importDefault(require("assert")); +const src_1 = require("../src"); +const defaultOptions = {}; +describe('gherkin', () => { + it('parses gherkin from the file system', () => __awaiter(void 0, void 0, void 0, function* () { + const envelopes = yield streamToArray(src_1.GherkinStreams.fromPaths(['testdata/good/minimal.feature'], defaultOptions)); + assert_1.default.strictEqual(envelopes.length, 3); + assert_1.default.strictEqual(envelopes[0].source.uri, 'testdata/good/minimal.feature'); + assert_1.default.strictEqual(envelopes[1].gherkinDocument.uri, 'testdata/good/minimal.feature'); + assert_1.default.strictEqual(envelopes[2].pickle.uri, 'testdata/good/minimal.feature'); + })); + it('throws an error when the path is a directory', () => __awaiter(void 0, void 0, void 0, function* () { + assert_1.default.rejects(() => __awaiter(void 0, void 0, void 0, function* () { return streamToArray(src_1.GherkinStreams.fromPaths(['testdata/good'], defaultOptions)); })); + })); + it('emits uris relative to a given path', () => __awaiter(void 0, void 0, void 0, function* () { + const envelopes = yield streamToArray(src_1.GherkinStreams.fromPaths(['testdata/good/minimal.feature'], Object.assign(Object.assign({}, defaultOptions), { relativeTo: 'testdata/good' }))); + assert_1.default.strictEqual(envelopes.length, 3); + assert_1.default.strictEqual(envelopes[0].source.uri, 'minimal.feature'); + assert_1.default.strictEqual(envelopes[1].gherkinDocument.uri, 'minimal.feature'); + assert_1.default.strictEqual(envelopes[2].pickle.uri, 'minimal.feature'); + })); + it('parses gherkin from STDIN', () => __awaiter(void 0, void 0, void 0, function* () { + const source = (0, gherkin_1.makeSourceEnvelope)(`Feature: Minimal + + Scenario: minimalistic + Given the minimalism +`, 'test.feature'); + const envelopes = yield streamToArray(src_1.GherkinStreams.fromSources([source], defaultOptions)); + assert_1.default.strictEqual(envelopes.length, 3); + })); + it('parses gherkin using the provided default language', () => __awaiter(void 0, void 0, void 0, function* () { + const source = (0, gherkin_1.makeSourceEnvelope)(`Fonctionnalité: i18n support + Scénario: Support des caractères spéciaux + Soit un exemple de scénario en français +`, 'test.feature'); + const envelopes = yield streamToArray(src_1.GherkinStreams.fromSources([source], { defaultDialect: 'fr' })); + assert_1.default.strictEqual(envelopes.length, 3); + })); + it('outputs dialects', () => __awaiter(void 0, void 0, void 0, function* () { + assert_1.default.strictEqual(gherkin_1.dialects.en.name, 'English'); + })); +}); +function streamToArray(readableStream) { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve, reject) => { + const items = []; + readableStream.on('data', items.push.bind(items)); + readableStream.on('error', (err) => reject(err)); + readableStream.on('end', () => resolve(items)); + }); + }); +} +//# sourceMappingURL=StreamTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/dist/test/StreamTest.js.map b/node_modules/@cucumber/gherkin-streams/dist/test/StreamTest.js.map new file mode 100644 index 00000000..dce5d412 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/test/StreamTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"StreamTest.js","sourceRoot":"","sources":["../../test/StreamTest.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/dist/tsconfig.build.tsbuildinfo b/node_modules/@cucumber/gherkin-streams/dist/tsconfig.build.tsbuildinfo new file mode 100644 index 00000000..e1635798 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/dist/tsconfig.build.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["../node_modules/typescript/lib/lib.es5.d.ts","../node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/typescript/lib/lib.dom.d.ts","../node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/typescript/lib/lib.es2016.intl.d.ts","../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../node_modules/typescript/lib/lib.es2017.date.d.ts","../node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/typescript/lib/lib.es2019.intl.d.ts","../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/typescript/lib/lib.decorators.d.ts","../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../node_modules/reflect-metadata/index.d.ts","../node_modules/@cucumber/gherkin/node_modules/@cucumber/messages/dist/cjs/src/messages.d.ts","../node_modules/@cucumber/gherkin/node_modules/@cucumber/messages/dist/cjs/src/TimeConversion.d.ts","../node_modules/@cucumber/gherkin/node_modules/@cucumber/messages/dist/cjs/src/IdGenerator.d.ts","../node_modules/@cucumber/gherkin/node_modules/@cucumber/messages/dist/cjs/src/parseEnvelope.d.ts","../node_modules/@cucumber/gherkin/node_modules/@cucumber/messages/dist/cjs/src/getWorstTestStepResult.d.ts","../node_modules/@cucumber/gherkin/node_modules/@cucumber/messages/dist/cjs/src/version.d.ts","../node_modules/@cucumber/gherkin/node_modules/@cucumber/messages/dist/cjs/src/index.d.ts","../node_modules/@cucumber/gherkin/dist/src/IGherkinOptions.d.ts","../node_modules/@cucumber/gherkin/dist/src/generateMessages.d.ts","../node_modules/@cucumber/gherkin/dist/src/makeSourceEnvelope.d.ts","../node_modules/@cucumber/gherkin/dist/src/Dialect.d.ts","../node_modules/@cucumber/gherkin/dist/src/IToken.d.ts","../node_modules/@cucumber/gherkin/dist/src/ITokenMatcher.d.ts","../node_modules/@cucumber/gherkin/dist/src/GherkinLine.d.ts","../node_modules/@cucumber/gherkin/dist/src/IAstBuilder.d.ts","../node_modules/@cucumber/gherkin/dist/src/Parser.d.ts","../node_modules/@cucumber/gherkin/dist/src/AstNode.d.ts","../node_modules/@cucumber/gherkin/dist/src/AstBuilder.d.ts","../node_modules/@cucumber/gherkin/dist/src/TokenScanner.d.ts","../node_modules/@cucumber/gherkin/dist/src/Errors.d.ts","../node_modules/@cucumber/gherkin/dist/src/pickles/compile.d.ts","../node_modules/@cucumber/gherkin/dist/src/GherkinClassicTokenMatcher.d.ts","../node_modules/@cucumber/gherkin/dist/src/GherkinInMarkdownTokenMatcher.d.ts","../node_modules/@cucumber/gherkin/dist/src/index.d.ts","../node_modules/@cucumber/messages/dist/cjs/src/messages.d.ts","../node_modules/@cucumber/messages/dist/cjs/src/TimeConversion.d.ts","../node_modules/@cucumber/messages/dist/cjs/src/IdGenerator.d.ts","../node_modules/@cucumber/messages/dist/cjs/src/parseEnvelope.d.ts","../node_modules/@cucumber/messages/dist/cjs/src/getWorstTestStepResult.d.ts","../node_modules/@cucumber/messages/dist/cjs/src/version.d.ts","../node_modules/@cucumber/messages/dist/cjs/src/index.d.ts","../src/makeGherkinOptions.ts","../src/ParserMessageStream.ts","../src/SourceMessageStream.ts","../src/GherkinStreams.ts","../src/index.ts","../node_modules/@types/node/compatibility/disposable.d.ts","../node_modules/@types/node/compatibility/indexable.d.ts","../node_modules/@types/node/compatibility/iterators.d.ts","../node_modules/@types/node/compatibility/index.d.ts","../node_modules/@types/node/globals.typedarray.d.ts","../node_modules/@types/node/buffer.buffer.d.ts","../node_modules/@types/node/globals.d.ts","../node_modules/@types/node/web-globals/abortcontroller.d.ts","../node_modules/@types/node/web-globals/domexception.d.ts","../node_modules/@types/node/web-globals/events.d.ts","../node_modules/undici-types/header.d.ts","../node_modules/undici-types/readable.d.ts","../node_modules/undici-types/file.d.ts","../node_modules/undici-types/fetch.d.ts","../node_modules/undici-types/formdata.d.ts","../node_modules/undici-types/connector.d.ts","../node_modules/undici-types/client.d.ts","../node_modules/undici-types/errors.d.ts","../node_modules/undici-types/dispatcher.d.ts","../node_modules/undici-types/global-dispatcher.d.ts","../node_modules/undici-types/global-origin.d.ts","../node_modules/undici-types/pool-stats.d.ts","../node_modules/undici-types/pool.d.ts","../node_modules/undici-types/handlers.d.ts","../node_modules/undici-types/balanced-pool.d.ts","../node_modules/undici-types/agent.d.ts","../node_modules/undici-types/mock-interceptor.d.ts","../node_modules/undici-types/mock-agent.d.ts","../node_modules/undici-types/mock-client.d.ts","../node_modules/undici-types/mock-pool.d.ts","../node_modules/undici-types/mock-errors.d.ts","../node_modules/undici-types/proxy-agent.d.ts","../node_modules/undici-types/env-http-proxy-agent.d.ts","../node_modules/undici-types/retry-handler.d.ts","../node_modules/undici-types/retry-agent.d.ts","../node_modules/undici-types/api.d.ts","../node_modules/undici-types/interceptors.d.ts","../node_modules/undici-types/util.d.ts","../node_modules/undici-types/cookies.d.ts","../node_modules/undici-types/patch.d.ts","../node_modules/undici-types/websocket.d.ts","../node_modules/undici-types/eventsource.d.ts","../node_modules/undici-types/filereader.d.ts","../node_modules/undici-types/diagnostics-channel.d.ts","../node_modules/undici-types/content-type.d.ts","../node_modules/undici-types/cache.d.ts","../node_modules/undici-types/index.d.ts","../node_modules/@types/node/web-globals/fetch.d.ts","../node_modules/@types/node/web-globals/navigator.d.ts","../node_modules/@types/node/web-globals/storage.d.ts","../node_modules/@types/node/assert.d.ts","../node_modules/@types/node/assert/strict.d.ts","../node_modules/@types/node/async_hooks.d.ts","../node_modules/@types/node/buffer.d.ts","../node_modules/@types/node/child_process.d.ts","../node_modules/@types/node/cluster.d.ts","../node_modules/@types/node/console.d.ts","../node_modules/@types/node/constants.d.ts","../node_modules/@types/node/crypto.d.ts","../node_modules/@types/node/dgram.d.ts","../node_modules/@types/node/diagnostics_channel.d.ts","../node_modules/@types/node/dns.d.ts","../node_modules/@types/node/dns/promises.d.ts","../node_modules/@types/node/domain.d.ts","../node_modules/@types/node/events.d.ts","../node_modules/@types/node/fs.d.ts","../node_modules/@types/node/fs/promises.d.ts","../node_modules/@types/node/http.d.ts","../node_modules/@types/node/http2.d.ts","../node_modules/@types/node/https.d.ts","../node_modules/@types/node/inspector.d.ts","../node_modules/@types/node/module.d.ts","../node_modules/@types/node/net.d.ts","../node_modules/@types/node/os.d.ts","../node_modules/@types/node/path.d.ts","../node_modules/@types/node/perf_hooks.d.ts","../node_modules/@types/node/process.d.ts","../node_modules/@types/node/punycode.d.ts","../node_modules/@types/node/querystring.d.ts","../node_modules/@types/node/readline.d.ts","../node_modules/@types/node/readline/promises.d.ts","../node_modules/@types/node/repl.d.ts","../node_modules/@types/node/sea.d.ts","../node_modules/@types/node/sqlite.d.ts","../node_modules/@types/node/stream.d.ts","../node_modules/@types/node/stream/promises.d.ts","../node_modules/@types/node/stream/consumers.d.ts","../node_modules/@types/node/stream/web.d.ts","../node_modules/@types/node/string_decoder.d.ts","../node_modules/@types/node/test.d.ts","../node_modules/@types/node/timers.d.ts","../node_modules/@types/node/timers/promises.d.ts","../node_modules/@types/node/tls.d.ts","../node_modules/@types/node/trace_events.d.ts","../node_modules/@types/node/tty.d.ts","../node_modules/@types/node/url.d.ts","../node_modules/@types/node/util.d.ts","../node_modules/@types/node/v8.d.ts","../node_modules/@types/node/vm.d.ts","../node_modules/@types/node/wasi.d.ts","../node_modules/@types/node/worker_threads.d.ts","../node_modules/@types/node/zlib.d.ts","../node_modules/@types/node/index.d.ts","../node_modules/@cucumber/message-streams/dist/cjs/src/MessageToNdjsonStream.d.ts","../node_modules/@cucumber/message-streams/dist/cjs/src/NdjsonToMessageStream.d.ts","../node_modules/@cucumber/message-streams/dist/cjs/src/index.d.ts","../node_modules/commander/typings/index.d.ts","../package.json","../src/cli/main.ts","../test/StreamTest.ts","../node_modules/@types/estree/index.d.ts","../node_modules/@types/json-schema/index.d.ts","../node_modules/@types/json5/index.d.ts","../node_modules/@types/mocha/index.d.ts","../node_modules/@types/uuid/index.d.ts"],"fileIdsList":[[54,59,62,63,64,89,137],[59,63,89,137],[89,137],[54,89,137],[54,59,60,63,89,137],[54,60,63,89,137],[59,89,137],[54,59,89,137],[54,59,60,61,62,89,137],[54,55,89,137],[55,56,57,58,63,65,66,67,68,69,70,89,137],[48,89,137],[48,49,50,51,52,53,89,137],[47,89,137],[78,89,137,168,186],[89,137,187,188],[72,89,137],[72,73,74,75,76,77,89,137],[89,134,137],[89,136,137],[137],[89,137,142,171],[89,137,138,143,148,156,168,179],[89,137,138,139,148,156],[84,85,86,89,137],[89,137,140,180],[89,137,141,142,149,157],[89,137,142,168,176],[89,137,143,145,148,156],[89,136,137,144],[89,137,145,146],[89,137,147,148],[89,136,137,148],[89,137,148,149,150,168,179],[89,137,148,149,150,163,168,171],[89,130,137,145,148,151,156,168,179],[89,137,148,149,151,152,156,168,176,179],[89,137,151,153,168,176,179],[87,88,89,90,91,92,93,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185],[89,137,148,154],[89,137,155,179],[89,137,145,148,156,168],[89,137,157],[89,137,158],[89,136,137,159],[89,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185],[89,137,161],[89,137,162],[89,137,148,163,164],[89,137,163,165,180,182],[89,137,148,168,169,171],[89,137,170,171],[89,137,168,169],[89,137,171],[89,137,172],[89,134,137,168,173],[89,137,148,174,175],[89,137,174,175],[89,137,142,156,168,176],[89,137,177],[89,137,156,178],[89,137,151,162,179],[89,137,142,180],[89,137,168,181],[89,137,155,182],[89,137,183],[89,130,137],[89,137,148,150,159,168,171,179,181,182,184],[89,137,168,185],[89,102,106,137,179],[89,102,137,168,179],[89,97,137],[89,99,102,137,176,179],[89,137,156,176],[89,137,186],[89,97,137,186],[89,99,102,137,156,179],[89,94,95,98,101,137,148,168,179],[89,102,109,137],[89,94,100,137],[89,102,123,124,137],[89,98,102,137,171,179,186],[89,123,137,186],[89,96,97,137,186],[89,102,137],[89,96,97,98,99,100,101,102,103,104,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,137],[89,102,117,137],[89,102,109,110,137],[89,100,102,110,111,137],[89,101,137],[89,94,97,102,137],[89,102,106,110,111,137],[89,106,137],[89,100,102,105,137,179],[89,94,99,102,109,137],[89,137,168],[89,97,102,123,137,184,186],[71,78,79,80,81,89,137,149,168],[71,78,89,137,168],[71,89,137,158,168],[71,78,82,89,137,189,190,191],[82,89,137],[71,78,89,137],[71,78,83,89,134,137,168]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d6d51a5118d000ed3bfe6e1dd1335bebfff3fef23cd2af2f84a24d30f90cc90","affectsGlobalScope":true,"impliedFormat":1},{"version":"935811369c7018772fd8ab4f904b0f07d22920a5cb74c254b03f3cdb6968dd75","impliedFormat":1},{"version":"d9f4ec5156491a24eee340452d7e87e432512d5ebde23fe18c2ceb5a31c1720b","impliedFormat":1},{"version":"44716259b743dacde932f7f1922ac85f533af74e3ed82a078ba505414f6f6b53","impliedFormat":1},{"version":"653dc417862cf079d590653212a8d48ace7c89ff7b73c239791099afc25dca96","impliedFormat":1},{"version":"497efde09001124a1bfab8ea16409b6908fe8a49ae8d5d69082910838150fbfd","impliedFormat":1},{"version":"9d7424de16fc06f2c76b4aa27394d5f7f80a7933122120c3c5b115baf18fd9b4","impliedFormat":1},{"version":"5ed925f9d0dfcb0fde32518c7ae42f88461fd8eabb015a35183fac5ce95bbc6c","impliedFormat":1},{"version":"c889230d56462fe05b70ab6fd53acdef388c4ccc473cf90f4cb32ecd2b962b4d","impliedFormat":1},{"version":"28993cc461214aae66c110c1cf28fc8077fe8f05057049337ac72f5a7c98fca5","impliedFormat":1},{"version":"506bb887b7df4ffad6f6fa63d24411619e0a03b7665683ec3d3a4973063886e6","impliedFormat":1},{"version":"afbea638922aaca9d9cc8b65a02a520c7454229903871fbb04e2a348bf836828","impliedFormat":1},{"version":"b7f1672ce9af85034cdb8c5b04dcedd6c0452c96eba0571c096298aaeedfdff5","impliedFormat":1},{"version":"d2f5dc88e221ccdfe47023e718cb4ceaffd20feb86fb9e13b05820e2b0f85c56","impliedFormat":1},{"version":"cd2a5f46beacf5c57cef4fe0da2d794187be79bf748e94c641b190d69cebe132","impliedFormat":1},{"version":"18719ba62b0021a65fe4b5cd42e158faa6b41c0da08adb3325c9d9a18f35bab7","impliedFormat":1},{"version":"1683703acf57f406b362f5bb60a3478b38270966d045c1f9ded2748e5a4d574a","impliedFormat":1},{"version":"489b692d9023b2e840ce27625d3f20d60bd170db210fb0b82d8e297b85d43819","impliedFormat":1},{"version":"17af13f4f5416e01af722b89816c7a44a1e5b1c4c05decabc498c382b9ef5e03","impliedFormat":1},{"version":"2ec2927513bae24e1cde365bac84039ed143c4459431d626515ffef83417f1e4","impliedFormat":1},{"version":"8219ac333bd9febd8967d0a4c7e4913dc22761f5adbb154b1a9cc56356d2ac49","impliedFormat":1},{"version":"bbf12932d8dd583fe79ef95796e43e9d4fb12e34c5e4e40b698adb635a7ea6cc","impliedFormat":1},{"version":"5e76dd5c9f1030abb47b45638f31b795b4ec415eaadfbee6e83677e538814ac9","impliedFormat":1},{"version":"06a17bb1e15c642821467026b33933540ccba1250c42941ee96017e700de4663","impliedFormat":1},{"version":"0dc7806e087842cd9634419c63fa8f31c08a2bcdb47f7a06ed303ada9c7d685e","impliedFormat":1},{"version":"79a2c87885335374cb777e1f91677d0825d16afe4fda35b4df5ea99560929676","impliedFormat":1},{"version":"d9f4ec5156491a24eee340452d7e87e432512d5ebde23fe18c2ceb5a31c1720b","impliedFormat":1},{"version":"44716259b743dacde932f7f1922ac85f533af74e3ed82a078ba505414f6f6b53","impliedFormat":1},{"version":"653dc417862cf079d590653212a8d48ace7c89ff7b73c239791099afc25dca96","impliedFormat":1},{"version":"497efde09001124a1bfab8ea16409b6908fe8a49ae8d5d69082910838150fbfd","impliedFormat":1},{"version":"d428ae549f714c7e4ad9a3c2b4929d6e6f96176d11d6535c614d4a9927612d28","impliedFormat":1},{"version":"5ed925f9d0dfcb0fde32518c7ae42f88461fd8eabb015a35183fac5ce95bbc6c","impliedFormat":1},{"version":"7db9c81c16018e103ef20023e5f369f861f74a83fdbe17feefb23a0a9ae5439c","signature":"b7858b9fded3b1f7f706f48f3f0db792ee9c477b86926163bb5be9a683030426"},{"version":"9685a11d8f38478f85c899f5d27bc26f9f36336b8ae3b938a64fe39a26a6b2b5","signature":"5723558c796773cf44f1c65f3abf64d6aede7462ac5b2dc8b12a579e3163cdf6"},{"version":"614c2c87ded5814a4202a1d66ac9e25014da483e77d1199ae7fdd479b3b9408b","signature":"c859174831bac13c0e7e1c36039110728dfafccd6a275af194ff9132967e9ec8"},{"version":"05d6a5c1fc6bfb5f55b95cb15338bd412d5729286b5c9f3489027daea543349d","signature":"4ce1c827b3ee552d549c8ed1507a60a3d3c1cd2aaba114e8a335f034484e7dc9"},{"version":"99adb65fb1c5a83d3935a92dec1edc150de1ec617618aea823c29ed22f5d4382","signature":"6b58a277793c4ad8547cd9716e41fd0030f7a302e250fc8d2a1fba2b5e0bc2ae"},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"17bb4105d0ea2ab2bfcb4f77ff8585691d5569c90ae15f4fa8d5ff9fb42b910b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"456fa0c0ab68731564917642b977c71c3b7682240685b118652fb9253c9a6429","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"2cbe0621042e2a68c7cbce5dfed3906a1862a16a7d496010636cdbdb91341c0f","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"7b988bc259155186e6b09dd8b32856d9e45c8d261e63c19abaf590bb6550f922","affectsGlobalScope":true,"impliedFormat":1},{"version":"fe7b52f993f9336b595190f3c1fcc259bb2cf6dcb4ac8fdb1e0454cc5df7301e","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"81711af669f63d43ccb4c08e15beda796656dd46673d0def001c7055db53852d","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"bdba81959361810be44bcfdd283f4d601e406ab5ad1d2bdff0ed480cf983c9d7","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"b326f4813b90d230ec3950f66bd5b5ce3971aac5fac67cfafc54aa07b39fd07f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c8420c7c2b778b334587a4c0311833b5212ff2f684ea37b2f0e2b117f1d7210d","impliedFormat":1},{"version":"b6b08215821c9833b0e8e30ea1ed178009f2f3ff5d7fae3865ee42f97cc87784","impliedFormat":1},{"version":"b795c3e47a26be91ac33d8115acdc37bfa41ecc701fb237c64a23da4d2b7e1d8","impliedFormat":1},{"version":"73cf6cc19f16c0191e4e9d497ab0c11c7b38f1ca3f01ad0f09a3a5a971aac4b8","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"ed58b9974bb3114f39806c9c2c6258c4ffa6a255921976a7c53dfa94bf178f42","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"915e18c559321c0afaa8d34674d3eb77e1ded12c3e85bf2a9891ec48b07a1ca5","affectsGlobalScope":true,"impliedFormat":1},{"version":"e9727a118ce60808e62457c89762fe5a4e2be8e9fd0112d12432d1bafdba942f","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"70b57b5529051497e9f6482b76d91c0dcbb103d9ead8a0549f5bab8f65e5d031","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"3a90b9beac4c2bfdf6517faae0940a042b81652badf747df0a7c7593456f6ebe","impliedFormat":1},{"version":"8302157cd431b3943eed09ad439b4441826c673d9f870dcb0e1f48e891a4211e","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"dba28a419aec76ed864ef43e5f577a5c99a010c32e5949fe4e17a4d57c58dd11","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"a5890565ed564c7b29eb1b1038d4e10c03a3f5231b0a8d48fea4b41ab19f4f46","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"cee74f5970ffc01041e5bffc3f324c20450534af4054d2c043cb49dbbd4ec8f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"1a654e0d950353614ba4637a8de4f9d367903a0692b748e11fccf8c880c99735","affectsGlobalScope":true,"impliedFormat":1},{"version":"42da246c46ca3fd421b6fd88bb4466cda7137cf33e87ba5ceeded30219c428bd","impliedFormat":1},{"version":"3a051941721a7f905544732b0eb819c8d88333a96576b13af08b82c4f17581e4","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"f2feb9696208311cdcf1936df2b7cbec96a3f0ab9d403952bf170546d4253a90","affectsGlobalScope":true,"impliedFormat":1},{"version":"db3d77167a7da6c5ba0c51c5b654820e3464093f21724ccd774c0b9bc3f81bc0","impliedFormat":1},{"version":"d9b6fd8640f6ad3f13ce9ce47d91061a698cf7763fed7f668e4f89709989aae5","impliedFormat":1},{"version":"429520b04f37103b6679c58549cec683402da8c18fbc0e3963d8a55e43138350","impliedFormat":1},{"version":"72810281e445fc86709330305b0d66a6a82d992d062c75d839a01a98888390a6","impliedFormat":1},{"version":"8a2fe38797fbf3eb75d872133872ec9a3c09bda7a3f3a5b7084d77899411b11c","impliedFormat":1},{"version":"1a2ae3df505891912038749a39e434643cf1f91a578475ae049f36e35c870c58","impliedFormat":1},"eddcfc9bcd244626e7f87e7717c844deb3e040c88ce19ccd10debfc8cc280142",{"version":"49bf8a1e108ccdc5166207e6711c06c13b8bdb51d0a649f22b90d4eb09b1ece7","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"67dd9582c2aa54891d78df04ca4dbbc40b1223631329ac978b5eb378eb9bb940","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"785b9d575b49124ce01b46f5b9402157c7611e6532effa562ac6aebec0074dfc","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","impliedFormat":1},{"version":"29f72ec1289ae3aeda78bf14b38086d3d803262ac13904b400422941a26a3636","affectsGlobalScope":true,"impliedFormat":1},{"version":"f874ea4d0091b0a44362a5f74d26caab2e66dec306c2bf7e8965f5106e784c3b","impliedFormat":1}],"root":[[79,83],[191,193]],"options":{"allowJs":false,"composite":true,"declaration":true,"declarationMap":true,"downlevelIteration":true,"esModuleInterop":true,"experimentalDecorators":true,"jsx":2,"module":1,"noImplicitAny":true,"outDir":"./","rootDir":"..","skipLibCheck":true,"sourceMap":true,"strictNullChecks":false,"target":2},"referencedMap":[[65,1],[64,2],[58,3],[67,4],[69,5],[70,6],[61,7],[62,8],[55,4],[59,4],[60,8],[63,9],[66,8],[56,10],[71,11],[57,4],[68,4],[50,3],[49,12],[52,12],[54,13],[48,14],[51,12],[53,3],[187,15],[188,15],[189,16],[74,3],[73,17],[76,17],[78,18],[72,14],[75,17],[77,3],[194,3],[195,3],[196,3],[197,3],[134,19],[135,19],[136,20],[89,21],[137,22],[138,23],[139,24],[84,3],[87,25],[85,3],[86,3],[140,26],[141,27],[142,28],[143,29],[144,30],[145,31],[146,31],[147,32],[148,33],[149,34],[150,35],[90,3],[88,3],[151,36],[152,37],[153,38],[186,39],[154,40],[155,41],[156,42],[157,43],[158,44],[159,45],[160,46],[161,47],[162,48],[163,49],[164,49],[165,50],[166,3],[167,3],[168,51],[170,52],[169,53],[171,54],[172,55],[173,56],[174,57],[175,58],[176,59],[177,60],[178,61],[179,62],[180,63],[181,64],[182,65],[183,66],[91,3],[92,3],[93,3],[131,67],[132,3],[133,3],[184,68],[185,69],[198,3],[190,3],[47,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[20,3],[4,3],[21,3],[25,3],[22,3],[23,3],[24,3],[26,3],[27,3],[28,3],[5,3],[29,3],[30,3],[31,3],[32,3],[6,3],[36,3],[33,3],[34,3],[35,3],[37,3],[7,3],[38,3],[43,3],[44,3],[39,3],[40,3],[41,3],[42,3],[1,3],[109,70],[119,71],[108,70],[129,72],[100,73],[99,74],[128,75],[122,76],[127,77],[102,78],[116,79],[101,80],[125,81],[97,82],[96,75],[126,83],[98,84],[103,85],[104,3],[107,85],[94,3],[130,86],[120,87],[111,88],[112,89],[114,90],[110,91],[113,92],[123,75],[105,93],[106,94],[115,95],[95,96],[118,87],[117,85],[121,3],[124,97],[191,3],[82,98],[80,99],[81,100],[192,101],[83,102],[79,103],[193,104]],"latestChangedDtsFile":"./test/StreamTest.d.ts","version":"5.9.2"} \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/eslint.config.mjs b/node_modules/@cucumber/gherkin-streams/eslint.config.mjs new file mode 100644 index 00000000..249bbd32 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/eslint.config.mjs @@ -0,0 +1,66 @@ +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +import { fixupConfigRules, fixupPluginRules } from "@eslint/compat"; +import { FlatCompat } from "@eslint/eslintrc"; +import js from "@eslint/js"; +import typescriptEslint from "@typescript-eslint/eslint-plugin"; +import tsParser from "@typescript-eslint/parser"; +import _import from "eslint-plugin-import"; +import n from "eslint-plugin-n"; +import simpleImportSort from "eslint-plugin-simple-import-sort"; +import globals from "globals"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all +}); + +export default [...fixupConfigRules(compat.extends( + "eslint:recommended", + "plugin:import/typescript", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", +)), { + plugins: { + import: fixupPluginRules(_import), + "simple-import-sort": simpleImportSort, + n, + "@typescript-eslint": fixupPluginRules(typescriptEslint), + }, + + languageOptions: { + globals: { + ...globals.node, + }, + + parser: tsParser, + ecmaVersion: 5, + sourceType: "module", + }, + + rules: { + "import/no-cycle": "error", + "n/no-extraneous-import": "error", + "@typescript-eslint/ban-ts-ignore": "off", + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/no-use-before-define": "off", + "@typescript-eslint/interface-name-prefix": "off", + "@typescript-eslint/member-delimiter-style": "off", + "@typescript-eslint/no-explicit-any": "error", + "@typescript-eslint/no-non-null-assertion": "error", + "simple-import-sort/imports": "error", + "simple-import-sort/exports": "error", + }, +}, { + files: ["test/**"], + + rules: { + "@typescript-eslint/no-non-null-assertion": "off", + }, +}]; \ No newline at end of file diff --git a/node_modules/@cucumber/gherkin-streams/node_modules/commander/LICENSE b/node_modules/@cucumber/gherkin-streams/node_modules/commander/LICENSE new file mode 100644 index 00000000..10f997ab --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/node_modules/commander/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2011 TJ Holowaychuk + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/@cucumber/gherkin-streams/node_modules/commander/Readme.md b/node_modules/@cucumber/gherkin-streams/node_modules/commander/Readme.md new file mode 100644 index 00000000..b4f81f16 --- /dev/null +++ b/node_modules/@cucumber/gherkin-streams/node_modules/commander/Readme.md @@ -0,0 +1,1159 @@ +# Commander.js + +[![Build Status](https://github.com/tj/commander.js/workflows/build/badge.svg)](https://github.com/tj/commander.js/actions?query=workflow%3A%22build%22) +[![NPM Version](http://img.shields.io/npm/v/commander.svg?style=flat)](https://www.npmjs.org/package/commander) +[![NPM Downloads](https://img.shields.io/npm/dm/commander.svg?style=flat)](https://npmcharts.com/compare/commander?minimal=true) +[![Install Size](https://packagephobia.now.sh/badge?p=commander)](https://packagephobia.now.sh/result?p=commander) + +The complete solution for [node.js](http://nodejs.org) command-line interfaces. + +Read this in other languages: English | [简体中文](./Readme_zh-CN.md) + +- [Commander.js](#commanderjs) + - [Installation](#installation) + - [Quick Start](#quick-start) + - [Declaring _program_ variable](#declaring-program-variable) + - [Options](#options) + - [Common option types, boolean and value](#common-option-types-boolean-and-value) + - [Default option value](#default-option-value) + - [Other option types, negatable boolean and boolean|value](#other-option-types-negatable-boolean-and-booleanvalue) + - [Required option](#required-option) + - [Variadic option](#variadic-option) + - [Version option](#version-option) + - [More configuration](#more-configuration) + - [Custom option processing](#custom-option-processing) + - [Commands](#commands) + - [Command-arguments](#command-arguments) + - [More configuration](#more-configuration-1) + - [Custom argument processing](#custom-argument-processing) + - [Action handler](#action-handler) + - [Stand-alone executable (sub)commands](#stand-alone-executable-subcommands) + - [Life cycle hooks](#life-cycle-hooks) + - [Automated help](#automated-help) + - [Custom help](#custom-help) + - [Display help after errors](#display-help-after-errors) + - [Display help from code](#display-help-from-code) + - [.name](#name) + - [.usage](#usage) + - [.description and .summary](#description-and-summary) + - [.helpOption(flags, description)](#helpoptionflags-description) + - [.helpCommand()](#helpcommand) + - [Help Groups](#help-groups) + - [More configuration](#more-configuration-2) + - [Custom event listeners](#custom-event-listeners) + - [Bits and pieces](#bits-and-pieces) + - [.parse() and .parseAsync()](#parse-and-parseasync) + - [Parsing Configuration](#parsing-configuration) + - [Legacy options as properties](#legacy-options-as-properties) + - [TypeScript](#typescript) + - [createCommand()](#createcommand) + - [Node options such as `--harmony`](#node-options-such-as---harmony) + - [Debugging stand-alone executable subcommands](#debugging-stand-alone-executable-subcommands) + - [npm run-script](#npm-run-script) + - [Display error](#display-error) + - [Override exit and output handling](#override-exit-and-output-handling) + - [Additional documentation](#additional-documentation) + - [Support](#support) + - [Commander for enterprise](#commander-for-enterprise) + +For information about terms used in this document see: [terminology](./docs/terminology.md) + +## Installation + +```sh +npm install commander +``` + +## Quick Start + +You write code to describe your command line interface. +Commander looks after parsing the arguments into options and command-arguments, +displays usage errors for problems, and implements a help system. + +Commander is strict and displays an error for unrecognised options. +The two most used option types are a boolean option, and an option which takes its value from the following argument. + +Example file: [split.js](./examples/split.js) + +```js +const { program } = require('commander'); + +program + .option('--first') + .option('-s, --separator ') + .argument(''); + +program.parse(); + +const options = program.opts(); +const limit = options.first ? 1 : undefined; +console.log(program.args[0].split(options.separator, limit)); +``` + +```console +$ node split.js -s / --fits a/b/c +error: unknown option '--fits' +(Did you mean --first?) +$ node split.js -s / --first a/b/c +[ 'a' ] +``` + +Here is a more complete program using a subcommand and with descriptions for the help. In a multi-command program, you have an action handler for each command (or stand-alone executables for the commands). + +Example file: [string-util.js](./examples/string-util.js) + +```js +const { Command } = require('commander'); +const program = new Command(); + +program + .name('string-util') + .description('CLI to some JavaScript string utilities') + .version('0.8.0'); + +program.command('split') + .description('Split a string into substrings and display as an array') + .argument('', 'string to split') + .option('--first', 'display just the first substring') + .option('-s, --separator ', 'separator character', ',') + .action((str, options) => { + const limit = options.first ? 1 : undefined; + console.log(str.split(options.separator, limit)); + }); + +program.parse(); +``` + +```console +$ node string-util.js help split +Usage: string-util split [options] + +Split a string into substrings and display as an array. + +Arguments: + string string to split + +Options: + --first display just the first substring + -s, --separator separator character (default: ",") + -h, --help display help for command + +$ node string-util.js split --separator=/ a/b/c +[ 'a', 'b', 'c' ] +``` + +More samples can be found in the [examples](https://github.com/tj/commander.js/tree/master/examples) directory. + +## Declaring _program_ variable + +Commander exports a global object which is convenient for quick programs. +This is used in the examples in this README for brevity. + +```js +// CommonJS (.cjs) +const { program } = require('commander'); +``` + +For larger programs which may use commander in multiple ways, including unit testing, it is better to create a local Command object to use. + +```js +// CommonJS (.cjs) +const { Command } = require('commander'); +const program = new Command(); +``` + +```js +// ECMAScript (.mjs) +import { Command } from 'commander'; +const program = new Command(); +``` + +```ts +// TypeScript (.ts) +import { Command } from 'commander'; +const program = new Command(); +``` + +## Options + +Options are defined with the `.option()` method, also serving as documentation for the options. Each option can have a short flag (single character) and a long name, separated by a comma or space or vertical bar ('|'). To allow a wider range of short-ish flags than just +single characters, you may also have two long options. Examples: + +```js +program + .option('-p, --port ', 'server port number') + .option('--trace', 'add extra debugging output') + .option('--ws, --workspace ', 'use a custom workspace') +``` + +The parsed options can be accessed by calling `.opts()` on a `Command` object, and are passed to the action handler. + +Multi-word options such as "--template-engine" are camel-cased, becoming `program.opts().templateEngine` etc. + +An option and its option-argument can be separated by a space, or combined into the same argument. The option-argument can follow the short option directly or follow an `=` for a long option. + +```sh +serve -p 80 +serve -p80 +serve --port 80 +serve --port=80 +``` + +You can use `--` to indicate the end of the options, and any remaining arguments will be used without being interpreted. + +By default, options on the command line are not positional, and can be specified before or after other arguments. + +There are additional related routines for when `.opts()` is not enough: + +- `.optsWithGlobals()` returns merged local and global option values +- `.getOptionValue()` and `.setOptionValue()` work with a single option value +- `.getOptionValueSource()` and `.setOptionValueWithSource()` include where the option value came from + +### Common option types, boolean and value + +The two most used option types are a boolean option, and an option which takes its value +from the following argument (declared with angle brackets like `--expect `). Both are `undefined` unless specified on command line. + +Example file: [options-common.js](./examples/options-common.js) + +```js +program + .option('-d, --debug', 'output extra debugging') + .option('-s, --small', 'small pizza size') + .option('-p, --pizza-type ', 'flavour of pizza'); + +program.parse(process.argv); + +const options = program.opts(); +if (options.debug) console.log(options); +console.log('pizza details:'); +if (options.small) console.log('- small pizza size'); +if (options.pizzaType) console.log(`- ${options.pizzaType}`); +``` + +```console +$ pizza-options -p +error: option '-p, --pizza-type ' argument missing +$ pizza-options -d -s -p vegetarian +{ debug: true, small: true, pizzaType: 'vegetarian' } +pizza details: +- small pizza size +- vegetarian +$ pizza-options --pizza-type=cheese +pizza details: +- cheese +``` + +Multiple boolean short options may be combined following the dash, and may be followed by a single short option taking a value. +For example `-d -s -p cheese` may be written as `-ds -p cheese` or even `-dsp cheese`. + +Options with an expected option-argument are greedy and will consume the following argument whatever the value. +So `--id -xyz` reads `-xyz` as the option-argument. + +`program.parse(arguments)` processes the arguments, leaving any args not consumed by the program options in the `program.args` array. The parameter is optional and defaults to `process.argv`. + +### Default option value + +You can specify a default value for an option. + +Example file: [options-defaults.js](./examples/options-defaults.js) + +```js +program + .option('-c, --cheese ', 'add the specified type of cheese', 'blue'); + +program.parse(); + +console.log(`cheese: ${program.opts().cheese}`); +``` + +```console +$ pizza-options +cheese: blue +$ pizza-options --cheese stilton +cheese: stilton +``` + +### Other option types, negatable boolean and boolean|value + +You can define a boolean option long name with a leading `no-` to set the option value to false when used. +Defined alone this also makes the option true by default. + +If you define `--foo` first, adding `--no-foo` does not change the default value from what it would +otherwise be. + +Example file: [options-negatable.js](./examples/options-negatable.js) + +```js +program + .option('--no-sauce', 'Remove sauce') + .option('--cheese ', 'cheese flavour', 'mozzarella') + .option('--no-cheese', 'plain with no cheese') + .parse(); + +const options = program.opts(); +const sauceStr = options.sauce ? 'sauce' : 'no sauce'; +const cheeseStr = (options.cheese === false) ? 'no cheese' : `${options.cheese} cheese`; +console.log(`You ordered a pizza with ${sauceStr} and ${cheeseStr}`); +``` + +```console +$ pizza-options +You ordered a pizza with sauce and mozzarella cheese +$ pizza-options --sauce +error: unknown option '--sauce' +$ pizza-options --cheese=blue +You ordered a pizza with sauce and blue cheese +$ pizza-options --no-sauce --no-cheese +You ordered a pizza with no sauce and no cheese +``` + +You can specify an option which may be used as a boolean option but may optionally take an option-argument +(declared with square brackets like `--optional [value]`). + +Example file: [options-boolean-or-value.js](./examples/options-boolean-or-value.js) + +```js +program + .option('-c, --cheese [type]', 'Add cheese with optional type'); + +program.parse(process.argv); + +const options = program.opts(); +if (options.cheese === undefined) console.log('no cheese'); +else if (options.cheese === true) console.log('add cheese'); +else console.log(`add cheese type ${options.cheese}`); +``` + +```console +$ pizza-options +no cheese +$ pizza-options --cheese +add cheese +$ pizza-options --cheese mozzarella +add cheese type mozzarella +``` + +Options with an optional option-argument are not greedy and will ignore arguments starting with a dash. +So `id` behaves as a boolean option for `--id -ABCD`, but you can use a combined form if needed like `--id=-ABCD`. +Negative numbers are special and are accepted as an option-argument. + +For information about possible ambiguous cases, see [options taking varying arguments](./docs/options-in-depth.md). + +### Required option + +You may specify a required (mandatory) option using `.requiredOption()`. The option must have a value after parsing, usually specified on the command line, or perhaps from a default value (say from environment). The method is otherwise the same as `.option()` in format, taking flags and description, and optional default value or custom processing. + +Example file: [options-required.js](./examples/options-required.js) + +```js +program + .requiredOption('-c, --cheese ', 'pizza must have cheese'); + +program.parse(); +``` + +```console +$ pizza +error: required option '-c, --cheese ' not specified +``` + +### Variadic option + +You may make an option variadic by appending `...` to the value placeholder when declaring the option. On the command line you +can then specify multiple option-arguments, and the parsed option value will be an array. The extra arguments +are read until the first argument starting with a dash. The special argument `--` stops option processing entirely. If a value +is specified in the same argument as the option then no further values are read. + +Example file: [options-variadic.js](./examples/options-variadic.js) + +```js +program + .option('-n, --number ', 'specify numbers') + .option('-l, --letter [letters...]', 'specify letters'); + +program.parse(); + +console.log('Options: ', program.opts()); +console.log('Remaining arguments: ', program.args); +``` + +```console +$ collect -n 1 2 3 --letter a b c +Options: { number: [ '1', '2', '3' ], letter: [ 'a', 'b', 'c' ] } +Remaining arguments: [] +$ collect --letter=A -n80 operand +Options: { number: [ '80' ], letter: [ 'A' ] } +Remaining arguments: [ 'operand' ] +$ collect --letter -n 1 -n 2 3 -- operand +Options: { number: [ '1', '2', '3' ], letter: true } +Remaining arguments: [ 'operand' ] +``` + +For information about possible ambiguous cases, see [options taking varying arguments](./docs/options-in-depth.md). + +### Version option + +The optional `version` method adds handling for displaying the command version. The default option flags are `-V` and `--version`, and when present the command prints the version number and exits. + +```js +program.version('0.0.1'); +``` + +```console +$ ./examples/pizza -V +0.0.1 +``` + +You may change the flags and description by passing additional parameters to the `version` method, using +the same syntax for flags as the `option` method. + +```js +program.version('0.0.1', '-v, --vers', 'output the current version'); +``` + +### More configuration + +You can add most options using the `.option()` method, but there are some additional features available +by constructing an `Option` explicitly for less common cases. + +Example files: [options-extra.js](./examples/options-extra.js), [options-env.js](./examples/options-env.js), [options-conflicts.js](./examples/options-conflicts.js), [options-implies.js](./examples/options-implies.js) + +```js +program + .addOption(new Option('-s, --secret').hideHelp()) + .addOption(new Option('-t, --timeout ', 'timeout in seconds').default(60, 'one minute')) + .addOption(new Option('-d, --drink ', 'drink size').choices(['small', 'medium', 'large'])) + .addOption(new Option('-p, --port ', 'port number').env('PORT')) + .addOption(new Option('--donate [amount]', 'optional donation in dollars').preset('20').argParser(parseFloat)) + .addOption(new Option('--disable-server', 'disables the server').conflicts('port')) + .addOption(new Option('--free-drink', 'small drink included free ').implies({ drink: 'small' })); +``` + +```console +$ extra --help +Usage: help [options] + +Options: + -t, --timeout timeout in seconds (default: one minute) + -d, --drink drink cup size (choices: "small", "medium", "large") + -p, --port port number (env: PORT) + --donate [amount] optional donation in dollars (preset: "20") + --disable-server disables the server + --free-drink small drink included free + -h, --help display help for command + +$ extra --drink huge +error: option '-d, --drink ' argument 'huge' is invalid. Allowed choices are small, medium, large. + +$ PORT=80 extra --donate --free-drink +Options: { timeout: 60, donate: 20, port: '80', freeDrink: true, drink: 'small' } + +$ extra --disable-server --port 8000 +error: option '--disable-server' cannot be used with option '-p, --port ' +``` + +Specify a required (mandatory) option using the `Option` method `.makeOptionMandatory()`. This matches the `Command` method [.requiredOption()](#required-option). + +### Custom option processing + +You may specify a function to do custom processing of option-arguments. The callback function receives two parameters, +the user specified option-argument and the previous value for the option. It returns the new value for the option. + +This allows you to coerce the option-argument to the desired type, or accumulate values, or do entirely custom processing. + +You can optionally specify the default/starting value for the option after the function parameter. + +Example file: [options-custom-processing.js](./examples/options-custom-processing.js) + +```js +function myParseInt(value, dummyPrevious) { + // parseInt takes a string and a radix + const parsedValue = parseInt(value, 10); + if (isNaN(parsedValue)) { + throw new commander.InvalidArgumentError('Not a number.'); + } + return parsedValue; +} + +function increaseVerbosity(dummyValue, previous) { + return previous + 1; +} + +function collect(value, previous) { + return previous.concat([value]); +} + +function commaSeparatedList(value, dummyPrevious) { + return value.split(','); +} + +program + .option('-f, --float ', 'float argument', parseFloat) + .option('-i, --integer ', 'integer argument', myParseInt) + .option('-v, --verbose', 'verbosity that can be increased', increaseVerbosity, 0) + .option('-c, --collect ', 'repeatable value', collect, []) + .option('-l, --list ', 'comma separated list', commaSeparatedList) +; + +program.parse(); + +const options = program.opts(); +if (options.float !== undefined) console.log(`float: ${options.float}`); +if (options.integer !== undefined) console.log(`integer: ${options.integer}`); +if (options.verbose > 0) console.log(`verbosity: ${options.verbose}`); +if (options.collect.length > 0) console.log(options.collect); +if (options.list !== undefined) console.log(options.list); +``` + +```console +$ custom -f 1e2 +float: 100 +$ custom --integer 2 +integer: 2 +$ custom -v -v -v +verbose: 3 +$ custom -c a -c b -c c +[ 'a', 'b', 'c' ] +$ custom --list x,y,z +[ 'x', 'y', 'z' ] +``` + +## Commands + +You can specify (sub)commands using `.command()` or `.addCommand()`. There are two ways these can be implemented: using an action handler attached to the command, or as a stand-alone executable file (described in more detail later). The subcommands may be nested ([example](./examples/nestedCommands.js)). + +In the first parameter to `.command()` you specify the command name. You may append the command-arguments after the command name, or specify them separately using `.argument()`. The arguments may be `` or `[optional]`, and the last argument may also be `variadic...`. + +You can use `.addCommand()` to add an already configured subcommand to the program. + +For example: + +```js +// Command implemented using action handler (description is supplied separately to `.command`) +// Returns new command for configuring. +program + .command('clone [destination]') + .description('clone a repository into a newly created directory') + .action((source, destination) => { + console.log('clone command called'); + }); + +// Command implemented using stand-alone executable file, indicated by adding description as second parameter to `.command`. +// Returns `this` for adding more commands. +program + .command('start ', 'start named service') + .command('stop [service]', 'stop named service, or all if no name supplied'); + +// Command prepared separately. +// Returns `this` for adding more commands. +program + .addCommand(build.makeBuildCommand()); +``` + +Configuration options can be passed with the call to `.command()` and `.addCommand()`. Specifying `hidden: true` will +remove the command from the generated help output. Specifying `isDefault: true` will run the subcommand if no other +subcommand is specified ([example](./examples/defaultCommand.js)). + +You can add alternative names for a command with `.alias()`. ([example](./examples/alias.js)) + +`.command()` automatically copies the inherited settings from the parent command to the newly created subcommand. This is only done during creation, any later setting changes to the parent are not inherited. + +For safety, `.addCommand()` does not automatically copy the inherited settings from the parent command. There is a helper routine `.copyInheritedSettings()` for copying the settings when they are wanted. + +### Command-arguments + +For subcommands, you can specify the argument syntax in the call to `.command()` (as shown above). This +is the only method usable for subcommands implemented using a stand-alone executable, but for other subcommands +you can instead use the following method. + +To configure a command, you can use `.argument()` to specify each expected command-argument. +You supply the argument name and an optional description. The argument may be `` or `[optional]`. +You can specify a default value for an optional command-argument. + +Example file: [argument.js](./examples/argument.js) + +```js +program + .version('0.1.0') + .argument('', 'user to login') + .argument('[password]', 'password for user, if required', 'no password given') + .action((username, password) => { + console.log('username:', username); + console.log('password:', password); + }); +``` + + The last argument of a command can be variadic, and only the last argument. To make an argument variadic you + append `...` to the argument name. A variadic argument is passed to the action handler as an array. For example: + +```js +program + .version('0.1.0') + .command('rmdir') + .argument('') + .action(function (dirs) { + dirs.forEach((dir) => { + console.log('rmdir %s', dir); + }); + }); +``` + +There is a convenience method to add multiple arguments at once, but without descriptions: + +```js +program + .arguments(' '); +``` + +#### More configuration + +There are some additional features available by constructing an `Argument` explicitly for less common cases. + +Example file: [arguments-extra.js](./examples/arguments-extra.js) + +```js +program + .addArgument(new commander.Argument('', 'drink cup size').choices(['small', 'medium', 'large'])) + .addArgument(new commander.Argument('[timeout]', 'timeout in seconds').default(60, 'one minute')) +``` + +#### Custom argument processing + +You may specify a function to do custom processing of command-arguments (like for option-arguments). +The callback function receives two parameters, the user specified command-argument and the previous value for the argument. +It returns the new value for the argument. + +The processed argument values are passed to the action handler, and saved as `.processedArgs`. + +You can optionally specify the default/starting value for the argument after the function parameter. + +Example file: [arguments-custom-processing.js](./examples/arguments-custom-processing.js) + +```js +program + .command('add') + .argument('', 'integer argument', myParseInt) + .argument('[second]', 'integer argument', myParseInt, 1000) + .action((first, second) => { + console.log(`${first} + ${second} = ${first + second}`); + }) +; +``` + +### Action handler + +The action handler gets passed a parameter for each command-argument you declared, and two additional parameters +which are the parsed options and the command object itself. + +Example file: [thank.js](./examples/thank.js) + +```js +program + .argument('') + .option('-t, --title ', 'title to use before name') + .option('-d, --debug', 'display some debugging') + .action((name, options, command) => { + if (options.debug) { + console.error('Called %s with options %o', command.name(), options); + } + const title = options.title ? `${options.title} ` : ''; + console.log(`Thank-you ${title}${name}`); + }); +``` + +If you prefer, you can work with the command directly and skip declaring the parameters for the action handler. The `this` keyword is set to the running command and can be used from a function expression (but not from an arrow function). + +Example file: [action-this.js](./examples/action-this.js) + +```js +program + .command('serve') + .argument('`, + }, + ], + }, + }; + const html = yield renderAsHtml(e1); + (0, node_assert_1.default)(html.indexOf(`window.CUCUMBER_MESSAGES = [{"gherkinDocument":{"comments":[{"location":{"line":0,"column":0},"text":"\\x3C/script>\\x3Cscript>alert('Hello')\\x3C/script>"}]}}];`) >= 0); + })); +}); +//# sourceMappingURL=CucumberHtmlStream.spec.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/html-formatter/dist/src/CucumberHtmlStream.spec.js.map b/node_modules/@cucumber/html-formatter/dist/src/CucumberHtmlStream.spec.js.map new file mode 100644 index 00000000..c5718465 --- /dev/null +++ b/node_modules/@cucumber/html-formatter/dist/src/CucumberHtmlStream.spec.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CucumberHtmlStream.spec.js","sourceRoot":"","sources":["../../src/CucumberHtmlStream.spec.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/html-formatter/dist/src/icon.url b/node_modules/@cucumber/html-formatter/dist/src/icon.url new file mode 100644 index 00000000..9d5009c8 --- /dev/null +++ b/node_modules/@cucumber/html-formatter/dist/src/icon.url @@ -0,0 +1 @@ +data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAuMDYgMC41NiAzMi41IDM3LjEzIj4KICAgIDxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPHBhdGggZD0iTS00LTFoNDB2NDBILTR6Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iIzAwYTgxOCIKICAgICAgICAgICAgICBkPSJNMTYuNDM4LjU2M0M3LjM4Ni41NjMuMDYzIDcuODg2LjA2MyAxNi45MzhjMCA3Ljk2OCA1LjcxMiAxNC41ODkgMTMuMjUgMTYuMDYydjQuNjg4YzkuOC0xLjQ3OCAxOC40NzctOS4yNTcgMTkuMTI0LTE5LjQ3LjM5LTYuMTQ2LTIuNjc0LTEyLjQyMS03Ljg0My0xNS40NjhhMTMuNjIgMTMuNjIgMCAwIDAtMS44NzUtLjkzOGwtLjMxMy0uMTI1Yy0uMjg3LS4xMDYtLjU3Ny0uMjI1LS44NzUtLjMxMmExNi4yNDYgMTYuMjQ2IDAgMCAwLTUuMDkzLS44MTN2LjAwMXoiLz4KICAgICAgICA8cGF0aCBmaWxsPSIjZmZmIgogICAgICAgICAgICAgIGQ9Ik0xOS44MTMgNi42MjVhMS43ODcgMS43ODcgMCAwIDAtMS41NjMuNjI1Yy0uMy40LS40ODguNzg3LS42ODggMS4xODgtLjYgMS40LS40IDIuOS41IDQgMS40LS4zIDIuNTg4LTEuMTk0IDMuMTg4LTIuNTk0LjItLjQuMzEzLS45MTMuMzEzLTEuMzEzLjA2Mi0xLjA2Mi0uODE3LTEuODEtMS43NS0xLjkwNnptLTcuMjgyLjA5NGMtLjkxMy4wODctMS43ODEuODEyLTEuNzgxIDEuODEyIDAgLjQuMTEzLjkxMy4zMTMgMS4zMTMuNiAxLjQgMS44OCAyLjI5MyAzLjI4IDIuNTk0LjgtMS4xIDEuMDA3LTIuNi40MDctNC0uMi0uNC0uMzg3LS43OTQtLjY4OC0xLjA5NGExLjc1NyAxLjc1NyAwIDAgMC0xLjUzLS42MjVoLS4wMDF6TTcuNjI1IDExLjUzYy0xLjU3Ny4wODEtMi4yODEgMi4wNjMtLjk2OSAzLjA5NC40LjMuNzg4LjUxOSAxLjE4OC43MTkgMS40LjYgMy4wMTkuMzk0IDQuMjE4LS40MDYtLjMtMS4zLTEuMzE4LTIuNDk0LTIuNzE4LTMuMDk0LS41LS4yLS45MDYtLjMxMy0xLjQwNi0uMzEzLS4xMTMtLjAxMi0uMjA4LS4wMDUtLjMxMyAwem0xNS40MDYgNi4wNjNhNC41NzQgNC41NzQgMCAwIDAtMi41OTMuNzVjLjMgMS4zIDEuMzE4IDIuNDkzIDIuNzE4IDMuMDkzLjUuMi45MDcuMzEzIDEuNDA3LjMxMyAxLjguMSAyLjY4LTIuMTI1IDEuMjgtMy4xMjUtLjQtLjMtLjc4Ny0uNDg4LTEuMTg3LS42ODhhNC4zMiA0LjMyIDAgMCAwLTEuNjI1LS4zNDN6bS0xMy42NTYuMDkzYy0uNTUuMDExLTEuMS4xMi0xLjYyNS4zNDQtLjUuMi0uODg4LjQxOS0xLjE4OC43MTktMS4zIDEuMS0uNDI1IDMuMTk0IDEuMzc1IDMuMDk0LjUgMCAxLjAwNy0uMTEzIDEuNDA3LS4zMTMgMS40LS42IDIuMzk0LTEuNzkzIDIuNTk0LTMuMDkzYTQuNDc1IDQuNDc1IDAgMCAwLTIuNTYzLS43NXYtLjAwMXptNS4wNjMgMy4wNjNjLTEuNC4zLTIuNTg4IDEuMTk0LTMuMTg4IDIuNTk0LS4yLjQtLjMxMy44ODEtLjMxMyAxLjI4MS0uMSAxLjcgMi4yMiAyLjYxMyAzLjIyIDEuMzEzLjMtLjQuNDg3LS43ODguNjg3LTEuMTg4LjYtMS4zLjM5NC0yLjgtLjQwNi00em0zLjcxOC4wOTRjLS44IDEuMS0xLjAwNiAyLjYtLjQwNiA0IC4yLjQuMzg3Ljc5My42ODggMS4wOTMgMS4xIDEuMiAzLjQxMi4zMTMgMy4zMTItMS4xODcgMC0uNC0uMTEzLS45MTMtLjMxMy0xLjMxMy0uNi0xLjQtMS44OC0yLjI5My0zLjI4LTIuNTkzaC0uMDAxeiIvPgogICAgPC9nPgo8L3N2Zz4K \ No newline at end of file diff --git a/node_modules/@cucumber/html-formatter/dist/src/index.d.ts b/node_modules/@cucumber/html-formatter/dist/src/index.d.ts new file mode 100644 index 00000000..b68d58d5 --- /dev/null +++ b/node_modules/@cucumber/html-formatter/dist/src/index.d.ts @@ -0,0 +1,7 @@ +import { CucumberHtmlStream } from './CucumberHtmlStream'; +export * from './CucumberHtmlStream'; +/** + * @deprecated use the named export `CucumberHtmlStream` instead + */ +export default CucumberHtmlStream; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/html-formatter/dist/src/index.d.ts.map b/node_modules/@cucumber/html-formatter/dist/src/index.d.ts.map new file mode 100644 index 00000000..7b60f9cb --- /dev/null +++ b/node_modules/@cucumber/html-formatter/dist/src/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAEzD,cAAc,sBAAsB,CAAA;AAEpC;;GAEG;AACH,eAAe,kBAAkB,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/html-formatter/dist/src/index.js b/node_modules/@cucumber/html-formatter/dist/src/index.js new file mode 100644 index 00000000..eccef2c3 --- /dev/null +++ b/node_modules/@cucumber/html-formatter/dist/src/index.js @@ -0,0 +1,23 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const CucumberHtmlStream_1 = require("./CucumberHtmlStream"); +__exportStar(require("./CucumberHtmlStream"), exports); +/** + * @deprecated use the named export `CucumberHtmlStream` instead + */ +exports.default = CucumberHtmlStream_1.CucumberHtmlStream; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/html-formatter/dist/src/index.js.map b/node_modules/@cucumber/html-formatter/dist/src/index.js.map new file mode 100644 index 00000000..abf50279 --- /dev/null +++ b/node_modules/@cucumber/html-formatter/dist/src/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6DAAyD;AAEzD,uDAAoC;AAEpC;;GAEG;AACH,kBAAe,uCAAkB,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/html-formatter/dist/src/index.mustache b/node_modules/@cucumber/html-formatter/dist/src/index.mustache new file mode 100644 index 00000000..80572ab6 --- /dev/null +++ b/node_modules/@cucumber/html-formatter/dist/src/index.mustache @@ -0,0 +1,28 @@ + + + + {{title}} + + + + + + + +
+
+ + + + + diff --git a/node_modules/@cucumber/html-formatter/dist/src/main.d.ts b/node_modules/@cucumber/html-formatter/dist/src/main.d.ts new file mode 100644 index 00000000..ad504b3b --- /dev/null +++ b/node_modules/@cucumber/html-formatter/dist/src/main.d.ts @@ -0,0 +1,8 @@ +import './styles.scss'; +import type { Envelope } from '@cucumber/messages'; +declare global { + interface Window { + CUCUMBER_MESSAGES: Envelope[]; + } +} +//# sourceMappingURL=main.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/html-formatter/dist/src/main.d.ts.map b/node_modules/@cucumber/html-formatter/dist/src/main.d.ts.map new file mode 100644 index 00000000..56c53391 --- /dev/null +++ b/node_modules/@cucumber/html-formatter/dist/src/main.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/main.tsx"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAA;AAEtB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAIlD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,iBAAiB,EAAE,QAAQ,EAAE,CAAA;KAC9B;CACF"} \ No newline at end of file diff --git a/node_modules/@cucumber/html-formatter/dist/src/main.js b/node_modules/@cucumber/html-formatter/dist/src/main.js new file mode 100644 index 00000000..59d357ed --- /dev/null +++ b/node_modules/@cucumber/html-formatter/dist/src/main.js @@ -0,0 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const jsx_runtime_1 = require("react/jsx-runtime"); +require("./styles.scss"); +const react_components_1 = require("@cucumber/react-components"); +const client_1 = require("react-dom/client"); +const root = (0, client_1.createRoot)(document.getElementById('content')); +root.render((0, jsx_runtime_1.jsx)(react_components_1.EnvelopesProvider, { envelopes: window.CUCUMBER_MESSAGES, children: (0, jsx_runtime_1.jsx)(react_components_1.UrlSearchProvider, { children: (0, jsx_runtime_1.jsx)("div", { id: "report", className: "html-formatter", children: (0, jsx_runtime_1.jsx)(react_components_1.Report, {}) }) }) })); +//# sourceMappingURL=main.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/html-formatter/dist/src/main.js.map b/node_modules/@cucumber/html-formatter/dist/src/main.js.map new file mode 100644 index 00000000..4ff01a52 --- /dev/null +++ b/node_modules/@cucumber/html-formatter/dist/src/main.js.map @@ -0,0 +1 @@ +{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.tsx"],"names":[],"mappings":";;;AAAA,yBAAsB;AAGtB,iEAAyF;AACzF,6CAA6C;AAQ7C,MAAM,IAAI,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAgB,CAAC,CAAA;AAE1E,IAAI,CAAC,MAAM,CACT,uBAAC,oCAAiB,IAAC,SAAS,EAAE,MAAM,CAAC,iBAAiB,YACpD,uBAAC,oCAAiB,cAChB,gCAAK,EAAE,EAAC,QAAQ,EAAC,SAAS,EAAC,gBAAgB,YACzC,uBAAC,yBAAM,KAAG,GACN,GACY,GACF,CACrB,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/html-formatter/dist/src/styles.scss b/node_modules/@cucumber/html-formatter/dist/src/styles.scss new file mode 100644 index 00000000..79544ea1 --- /dev/null +++ b/node_modules/@cucumber/html-formatter/dist/src/styles.scss @@ -0,0 +1,60 @@ +$sansFamily: + 'Inter var', + ui-sans-serif, + system-ui, + -apple-system, + BlinkMacSystemFont, + 'Segoe UI', + Roboto, + 'Helvetica Neue', + Arial, + 'Noto Sans', + sans-serif, + 'Apple Color Emoji', + 'Segoe UI Emoji', + 'Segoe UI Symbol', + 'Noto Color Emoji'; +$monoFamily: + ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', + 'Courier New', monospace; + +:root { + background-color: white; + color: #222; +} + +body { + font-family: $sansFamily; + padding: 0; + margin: 0; +} + +pre, +code { + font-family: $monoFamily; +} + +.html-formatter { + max-width: 1600px; + min-height: 100vh; + margin: 0 auto; +} + +@media all and (prefers-color-scheme: dark) { + :root { + background-color: #1d1d26; + color: #c9c9d1; + --cucumber-anchor-color: #4caaee; + --cucumber-keyword-color: #d89077; + --cucumber-parameter-color: #4caaee; + --cucumber-tag-color: #85a658; + --cucumber-docstring-color: #66a565; + --cucumber-error-background-color: #cf6679; + --cucumber-error-text-color: #222; + --cucumber-code-background-color: #282a36; + --cucumber-code-text-color: #f8f8f2; + --cucumber-panel-background-color: #282a36; + --cucumber-panel-accent-color: #313442; + --cucumber-panel-text-color: #f8f8f2; + } +} diff --git a/node_modules/@cucumber/html-formatter/dist/test/acceptance.spec.d.ts b/node_modules/@cucumber/html-formatter/dist/test/acceptance.spec.d.ts new file mode 100644 index 00000000..98456317 --- /dev/null +++ b/node_modules/@cucumber/html-formatter/dist/test/acceptance.spec.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=acceptance.spec.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/html-formatter/dist/test/acceptance.spec.d.ts.map b/node_modules/@cucumber/html-formatter/dist/test/acceptance.spec.d.ts.map new file mode 100644 index 00000000..0a05fc77 --- /dev/null +++ b/node_modules/@cucumber/html-formatter/dist/test/acceptance.spec.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"acceptance.spec.d.ts","sourceRoot":"","sources":["../../test/acceptance.spec.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/html-formatter/dist/test/acceptance.spec.js b/node_modules/@cucumber/html-formatter/dist/test/acceptance.spec.js new file mode 100644 index 00000000..eba5ffad --- /dev/null +++ b/node_modules/@cucumber/html-formatter/dist/test/acceptance.spec.js @@ -0,0 +1,39 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const node_fs_1 = __importDefault(require("node:fs")); +const node_path_1 = __importDefault(require("node:path")); +const promises_1 = require("node:stream/promises"); +const message_streams_1 = require("@cucumber/message-streams"); +const test_1 = require("@playwright/test"); +const glob_1 = require("glob"); +const src_1 = require("../src"); +const fixtures = (0, glob_1.sync)(`./node_modules/@cucumber/compatibility-kit/features/**/*.ndjson`); +test_1.test.beforeAll(() => __awaiter(void 0, void 0, void 0, function* () { + const outputDir = node_path_1.default.join(__dirname, './__output__'); + for (const fixture of fixtures) { + const name = node_path_1.default.basename(fixture, '.ndjson'); + const outputFile = node_path_1.default.join(outputDir, `${name}.html`); + yield (0, promises_1.pipeline)(node_fs_1.default.createReadStream(fixture, { encoding: 'utf-8' }), new message_streams_1.NdjsonToMessageStream(), new src_1.CucumberHtmlStream(node_path_1.default.join(__dirname, '../dist/main.css'), node_path_1.default.join(__dirname, '../dist/main.js'), node_path_1.default.join(__dirname, '../dist/src/icon.url')), node_fs_1.default.createWriteStream(outputFile)); + } +})); +for (const fixture of fixtures) { + const name = node_path_1.default.basename(fixture, '.ndjson'); + (0, test_1.test)(`can render ${name}`, (_a) => __awaiter(void 0, [_a], void 0, function* ({ page }) { + yield page.goto(`/${name}.html`); + yield page.waitForSelector('#report', { timeout: 3000 }); + yield (0, test_1.expect)(page).toHaveScreenshot(`${name}.png`, { fullPage: true }); + })); +} +//# sourceMappingURL=acceptance.spec.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/html-formatter/dist/test/acceptance.spec.js.map b/node_modules/@cucumber/html-formatter/dist/test/acceptance.spec.js.map new file mode 100644 index 00000000..1b78145c --- /dev/null +++ b/node_modules/@cucumber/html-formatter/dist/test/acceptance.spec.js.map @@ -0,0 +1 @@ +{"version":3,"file":"acceptance.spec.js","sourceRoot":"","sources":["../../test/acceptance.spec.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,sDAAwB;AACxB,0DAA4B;AAC5B,mDAA+C;AAE/C,+DAAiE;AACjE,2CAA+C;AAC/C,+BAA2B;AAE3B,gCAA2C;AAE3C,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,iEAAiE,CAAC,CAAA;AAExF,WAAI,CAAC,SAAS,CAAC,GAAS,EAAE;IACxB,MAAM,SAAS,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;IAEtD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,mBAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;QAC9C,MAAM,UAAU,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,OAAO,CAAC,CAAA;QAEvD,MAAM,IAAA,mBAAQ,EACZ,iBAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EACnD,IAAI,uCAAqB,EAAE,EAC3B,IAAI,wBAAkB,CACpB,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,EACxC,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EACvC,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAC7C,EACD,iBAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC,CACjC,CAAA;IACH,CAAC;AACH,CAAC,CAAA,CAAC,CAAA;AAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,mBAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IAE9C,IAAA,WAAI,EAAC,cAAc,IAAI,EAAE,EAAE,KAAiB,EAAE,4CAAZ,EAAE,IAAI,EAAE;QACxC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,CAAA;QAChC,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;QACxD,MAAM,IAAA,aAAM,EAAC,IAAI,CAAC,CAAC,gBAAgB,CAAC,GAAG,IAAI,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IACxE,CAAC,CAAA,CAAC,CAAA;AACJ,CAAC"} \ No newline at end of file diff --git a/node_modules/@cucumber/html-formatter/dist/tsconfig.build.tsbuildinfo b/node_modules/@cucumber/html-formatter/dist/tsconfig.build.tsbuildinfo new file mode 100644 index 00000000..c3661650 --- /dev/null +++ b/node_modules/@cucumber/html-formatter/dist/tsconfig.build.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["../node_modules/typescript/lib/lib.es5.d.ts","../node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/typescript/lib/lib.dom.d.ts","../node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/typescript/lib/lib.es2016.intl.d.ts","../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../node_modules/typescript/lib/lib.es2017.date.d.ts","../node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/typescript/lib/lib.es2019.intl.d.ts","../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/typescript/lib/lib.decorators.d.ts","../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../node_modules/@types/react/global.d.ts","../node_modules/csstype/index.d.ts","../node_modules/@types/react/index.d.ts","../node_modules/@types/react/jsx-runtime.d.ts","../node_modules/reflect-metadata/index.d.ts","../node_modules/@cucumber/messages/dist/cjs/src/messages.d.ts","../node_modules/@cucumber/messages/dist/cjs/src/TimeConversion.d.ts","../node_modules/@cucumber/messages/dist/cjs/src/IdGenerator.d.ts","../node_modules/@cucumber/messages/dist/cjs/src/parseEnvelope.d.ts","../node_modules/@cucumber/messages/dist/cjs/src/getWorstTestStepResult.d.ts","../node_modules/@cucumber/messages/dist/cjs/src/version.d.ts","../node_modules/@cucumber/messages/dist/cjs/src/index.d.ts","../src/CucumberHtmlStream.ts","../src/CucumberHtmlStream.spec.ts","../src/index.ts","../node_modules/@cucumber/react-components/node_modules/@cucumber/messages/dist/cjs/src/messages.d.ts","../node_modules/@cucumber/react-components/node_modules/@cucumber/messages/dist/cjs/src/TimeConversion.d.ts","../node_modules/@cucumber/react-components/node_modules/@cucumber/messages/dist/cjs/src/IdGenerator.d.ts","../node_modules/@cucumber/react-components/node_modules/@cucumber/messages/dist/cjs/src/parseEnvelope.d.ts","../node_modules/@cucumber/react-components/node_modules/@cucumber/messages/dist/cjs/src/getWorstTestStepResult.d.ts","../node_modules/@cucumber/react-components/node_modules/@cucumber/messages/dist/cjs/src/version.d.ts","../node_modules/@cucumber/react-components/node_modules/@cucumber/messages/dist/cjs/src/index.d.ts","../node_modules/@cucumber/react-components/dist/src/components/app/CICommitLink.d.ts","../node_modules/@cucumber/tag-expressions/dist/cjs/src/index.d.ts","../node_modules/@cucumber/react-components/dist/src/SearchContext.d.ts","../node_modules/@cucumber/react-components/dist/src/components/app/ControlledSearchProvider.d.ts","../node_modules/@cucumber/react-components/dist/src/components/app/EnvelopesProvider.d.ts","../node_modules/@cucumber/react-components/dist/src/components/app/ExecutionSummary.d.ts","../node_modules/@cucumber/react-components/dist/src/components/app/FilteredDocuments.d.ts","../node_modules/@cucumber/react-components/dist/src/components/app/GherkinDocumentList.d.ts","../node_modules/@cucumber/react-components/dist/src/components/app/HighLight.d.ts","../node_modules/@cucumber/react-components/dist/src/components/app/InMemorySearchProvider.d.ts","../node_modules/@cucumber/gherkin-utils/dist/src/GherkinDocumentHandlers.d.ts","../node_modules/@cucumber/gherkin-utils/dist/src/walkGherkinDocument.d.ts","../node_modules/@cucumber/gherkin-utils/dist/src/GherkinDocumentWalker.d.ts","../node_modules/@cucumber/gherkin-utils/dist/src/pretty.d.ts","../node_modules/@cucumber/gherkin-utils/dist/src/Query.d.ts","../node_modules/@cucumber/gherkin-utils/dist/src/index.d.ts","../node_modules/@cucumber/query/dist/src/Lineage.d.ts","../node_modules/@cucumber/query/dist/src/Query.d.ts","../node_modules/@cucumber/query/dist/src/index.d.ts","../node_modules/@cucumber/react-components/dist/src/components/app/QueriesProvider.d.ts","../node_modules/@cucumber/react-components/dist/src/components/app/Report.d.ts","../node_modules/@cucumber/react-components/dist/src/components/app/SearchBar.d.ts","../node_modules/@cucumber/react-components/dist/src/components/app/StatusesSummary.d.ts","../node_modules/@cucumber/react-components/dist/src/components/app/TestRunHooks.d.ts","../node_modules/@cucumber/react-components/dist/src/components/app/UrlSearchProvider.d.ts","../node_modules/@cucumber/react-components/dist/src/components/app/index.d.ts","../node_modules/@cucumber/react-components/dist/src/components/customise/CustomRendering.d.ts","../node_modules/@cucumber/react-components/dist/src/components/customise/theming.d.ts","../node_modules/@cucumber/react-components/dist/src/components/customise/index.d.ts","../node_modules/@cucumber/react-components/dist/src/components/gherkin/Anchor.d.ts","../node_modules/@cucumber/react-components/dist/src/components/gherkin/attachment/Attachment.d.ts","../node_modules/@cucumber/react-components/dist/src/components/gherkin/Background.d.ts","../node_modules/@cucumber/react-components/dist/src/components/gherkin/Children.d.ts","../node_modules/@cucumber/react-components/dist/src/components/gherkin/DataTable.d.ts","../node_modules/@cucumber/react-components/dist/src/components/gherkin/Description.d.ts","../node_modules/@cucumber/react-components/dist/src/components/gherkin/DocString.d.ts","../node_modules/@cucumber/react-components/dist/src/components/gherkin/ErrorMessage.d.ts","../node_modules/@cucumber/react-components/dist/src/components/gherkin/Examples.d.ts","../node_modules/@cucumber/react-components/dist/src/components/gherkin/Feature.d.ts","../node_modules/@cucumber/react-components/dist/src/components/gherkin/GherkinDocument.d.ts","../node_modules/@cucumber/react-components/dist/src/components/gherkin/Keyword.d.ts","../node_modules/@cucumber/react-components/dist/src/components/gherkin/Parameter.d.ts","../node_modules/@cucumber/react-components/dist/src/components/gherkin/Rule.d.ts","../node_modules/@cucumber/react-components/dist/src/components/gherkin/Scenario.d.ts","../node_modules/@cucumber/react-components/dist/src/components/gherkin/StatusIcon.d.ts","../node_modules/@cucumber/react-components/dist/src/components/gherkin/Tags.d.ts","../node_modules/@cucumber/react-components/dist/src/components/gherkin/Title.d.ts","../node_modules/@cucumber/react-components/dist/src/components/gherkin/index.d.ts","../node_modules/@cucumber/react-components/dist/src/components/index.d.ts","../node_modules/@cucumber/react-components/dist/src/hooks/useQueries.d.ts","../node_modules/@cucumber/react-components/dist/src/hooks/useSearch.d.ts","../node_modules/@cucumber/react-components/dist/src/hooks/index.d.ts","../node_modules/@cucumber/react-components/dist/src/index.d.ts","../node_modules/@types/react-dom/client.d.ts","../src/main.tsx","../node_modules/@cucumber/message-streams/dist/src/MessageToNdjsonStream.d.ts","../node_modules/@cucumber/message-streams/dist/src/NdjsonToMessageStream.d.ts","../node_modules/@cucumber/message-streams/dist/src/AttachmentExternalisingStream.d.ts","../node_modules/@cucumber/message-streams/dist/src/index.d.ts","../node_modules/playwright-core/types/protocol.d.ts","../node_modules/playwright-core/types/structs.d.ts","../node_modules/playwright-core/types/types.d.ts","../node_modules/playwright/types/test.d.ts","../node_modules/playwright/test.d.ts","../node_modules/@playwright/test/index.d.ts","../node_modules/minipass/dist/commonjs/index.d.ts","../node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.d.ts","../node_modules/path-scurry/dist/commonjs/index.d.ts","../node_modules/glob/node_modules/minimatch/dist/commonjs/ast.d.ts","../node_modules/glob/node_modules/minimatch/dist/commonjs/escape.d.ts","../node_modules/glob/node_modules/minimatch/dist/commonjs/unescape.d.ts","../node_modules/glob/node_modules/minimatch/dist/commonjs/index.d.ts","../node_modules/glob/dist/commonjs/pattern.d.ts","../node_modules/glob/dist/commonjs/processor.d.ts","../node_modules/glob/dist/commonjs/walker.d.ts","../node_modules/glob/dist/commonjs/ignore.d.ts","../node_modules/glob/dist/commonjs/glob.d.ts","../node_modules/glob/dist/commonjs/has-magic.d.ts","../node_modules/glob/dist/commonjs/index.d.ts","../test/acceptance.spec.ts","../package.json","../node_modules/@types/ms/index.d.ts","../node_modules/@types/debug/index.d.ts","../node_modules/@types/eslint/helpers.d.ts","../node_modules/@types/json-schema/index.d.ts","../node_modules/@types/estree/index.d.ts","../node_modules/@types/eslint/index.d.ts","../node_modules/@types/eslint-scope/index.d.ts","../node_modules/@types/estree-jsx/index.d.ts","../node_modules/@types/unist/index.d.ts","../node_modules/@types/hast/index.d.ts","../node_modules/@types/mdast/index.d.ts","../node_modules/@types/mocha/index.d.ts","../node_modules/@types/node/compatibility/disposable.d.ts","../node_modules/@types/node/compatibility/indexable.d.ts","../node_modules/@types/node/compatibility/iterators.d.ts","../node_modules/@types/node/compatibility/index.d.ts","../node_modules/@types/node/globals.typedarray.d.ts","../node_modules/@types/node/buffer.buffer.d.ts","../node_modules/@types/node/globals.d.ts","../node_modules/@types/node/web-globals/abortcontroller.d.ts","../node_modules/@types/node/web-globals/domexception.d.ts","../node_modules/@types/node/web-globals/events.d.ts","../node_modules/undici-types/header.d.ts","../node_modules/undici-types/readable.d.ts","../node_modules/undici-types/file.d.ts","../node_modules/undici-types/fetch.d.ts","../node_modules/undici-types/formdata.d.ts","../node_modules/undici-types/connector.d.ts","../node_modules/undici-types/client.d.ts","../node_modules/undici-types/errors.d.ts","../node_modules/undici-types/dispatcher.d.ts","../node_modules/undici-types/global-dispatcher.d.ts","../node_modules/undici-types/global-origin.d.ts","../node_modules/undici-types/pool-stats.d.ts","../node_modules/undici-types/pool.d.ts","../node_modules/undici-types/handlers.d.ts","../node_modules/undici-types/balanced-pool.d.ts","../node_modules/undici-types/agent.d.ts","../node_modules/undici-types/mock-interceptor.d.ts","../node_modules/undici-types/mock-agent.d.ts","../node_modules/undici-types/mock-client.d.ts","../node_modules/undici-types/mock-pool.d.ts","../node_modules/undici-types/mock-errors.d.ts","../node_modules/undici-types/proxy-agent.d.ts","../node_modules/undici-types/env-http-proxy-agent.d.ts","../node_modules/undici-types/retry-handler.d.ts","../node_modules/undici-types/retry-agent.d.ts","../node_modules/undici-types/api.d.ts","../node_modules/undici-types/interceptors.d.ts","../node_modules/undici-types/util.d.ts","../node_modules/undici-types/cookies.d.ts","../node_modules/undici-types/patch.d.ts","../node_modules/undici-types/websocket.d.ts","../node_modules/undici-types/eventsource.d.ts","../node_modules/undici-types/filereader.d.ts","../node_modules/undici-types/diagnostics-channel.d.ts","../node_modules/undici-types/content-type.d.ts","../node_modules/undici-types/cache.d.ts","../node_modules/undici-types/index.d.ts","../node_modules/@types/node/web-globals/fetch.d.ts","../node_modules/@types/node/web-globals/navigator.d.ts","../node_modules/@types/node/web-globals/storage.d.ts","../node_modules/@types/node/assert.d.ts","../node_modules/@types/node/assert/strict.d.ts","../node_modules/@types/node/async_hooks.d.ts","../node_modules/@types/node/buffer.d.ts","../node_modules/@types/node/child_process.d.ts","../node_modules/@types/node/cluster.d.ts","../node_modules/@types/node/console.d.ts","../node_modules/@types/node/constants.d.ts","../node_modules/@types/node/crypto.d.ts","../node_modules/@types/node/dgram.d.ts","../node_modules/@types/node/diagnostics_channel.d.ts","../node_modules/@types/node/dns.d.ts","../node_modules/@types/node/dns/promises.d.ts","../node_modules/@types/node/domain.d.ts","../node_modules/@types/node/events.d.ts","../node_modules/@types/node/fs.d.ts","../node_modules/@types/node/fs/promises.d.ts","../node_modules/@types/node/http.d.ts","../node_modules/@types/node/http2.d.ts","../node_modules/@types/node/https.d.ts","../node_modules/@types/node/inspector.d.ts","../node_modules/@types/node/inspector.generated.d.ts","../node_modules/@types/node/module.d.ts","../node_modules/@types/node/net.d.ts","../node_modules/@types/node/os.d.ts","../node_modules/@types/node/path.d.ts","../node_modules/@types/node/perf_hooks.d.ts","../node_modules/@types/node/process.d.ts","../node_modules/@types/node/punycode.d.ts","../node_modules/@types/node/querystring.d.ts","../node_modules/@types/node/readline.d.ts","../node_modules/@types/node/readline/promises.d.ts","../node_modules/@types/node/repl.d.ts","../node_modules/@types/node/sea.d.ts","../node_modules/@types/node/sqlite.d.ts","../node_modules/@types/node/stream.d.ts","../node_modules/@types/node/stream/promises.d.ts","../node_modules/@types/node/stream/consumers.d.ts","../node_modules/@types/node/stream/web.d.ts","../node_modules/@types/node/string_decoder.d.ts","../node_modules/@types/node/test.d.ts","../node_modules/@types/node/timers.d.ts","../node_modules/@types/node/timers/promises.d.ts","../node_modules/@types/node/tls.d.ts","../node_modules/@types/node/trace_events.d.ts","../node_modules/@types/node/tty.d.ts","../node_modules/@types/node/url.d.ts","../node_modules/@types/node/util.d.ts","../node_modules/@types/node/v8.d.ts","../node_modules/@types/node/vm.d.ts","../node_modules/@types/node/wasi.d.ts","../node_modules/@types/node/worker_threads.d.ts","../node_modules/@types/node/zlib.d.ts","../node_modules/@types/node/index.d.ts","../node_modules/@types/react-dom/index.d.ts"],"fileIdsList":[[58,167,215,232,233],[79,80,81,82,83,167,215,232,233],[58,79,167,215,232,233],[58,167,215,232,233,247],[124,125,126,167,215,232,233],[167,215,232,233],[52,167,215,232,233],[52,53,54,55,56,57,167,215,232,233],[51,167,215,232,233],[58,85,167,215,232,233],[85,86,167,215,232,233],[49,68,70,167,215,232,233],[49,68,167,215,232,233],[49,71,167,215,232,233],[49,167,215,232,233],[49,84,87,167,215,232,233],[69,72,73,74,75,76,77,78,88,89,90,91,92,93,167,215,232,233],[95,96,167,215,232,233],[49,97,167,215,232,233],[98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,167,215,232,233],[94,97,116,167,215,232,233],[118,119,167,215,232,233],[84,87,167,215,232,233],[71,167,215,232,233],[117,120,167,215,232,233],[62,167,215,232,233],[62,63,64,65,66,67,167,215,232,233],[132,167,215,232,233],[150,167,215,232,233],[154,155,157,167,215,232,233],[152,153,154,157,167,215,232,233],[154,157,167,215,232,233],[158,167,215,232,233],[167,212,213,215,232,233],[167,214,215,232,233],[215,232,233],[167,215,220,232,233,250],[167,215,216,221,226,232,233,235,247,258],[167,215,216,217,226,232,233,235],[162,163,164,167,215,232,233],[167,215,218,232,233,259],[167,215,219,220,227,232,233,236],[167,215,220,232,233,247,255],[167,215,221,223,226,232,233,235],[167,214,215,222,232,233],[167,215,223,224,232,233],[167,215,225,226,232,233],[167,214,215,226,232,233],[167,215,226,227,228,232,233,247,258],[167,215,226,227,228,232,233,242,247,250],[167,208,215,223,226,229,232,233,235,247,258],[167,215,226,227,229,230,232,233,235,247,255,258],[167,215,229,231,232,233,247,255,258],[165,166,167,168,169,170,171,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264],[167,215,226,232,233],[167,215,232,233,234,258],[167,215,223,226,232,233,235,247],[167,215,232,233,236],[167,215,232,233,237],[167,214,215,232,233,238],[167,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264],[167,215,232,233,240],[167,215,232,233,241],[167,215,226,232,233,242,243],[167,215,232,233,242,244,259,261],[167,215,227,232,233],[167,215,226,232,233,247,248,250],[167,215,232,233,249,250],[167,215,232,233,247,248],[167,215,232,233,250],[167,215,232,233,251],[167,212,215,232,233,247,252,258],[167,215,226,232,233,253,254],[167,215,232,233,253,254],[167,215,220,232,233,235,247,255],[167,215,232,233,256],[167,215,232,233,235,257],[167,215,229,232,233,241,258],[167,215,220,232,233,259],[167,215,232,233,247,260],[167,215,232,233,234,261],[167,215,232,233,262],[167,208,215,232,233],[167,208,215,226,228,232,233,238,247,250,258,260,261,263],[167,215,232,233,247,264],[47,48,167,215,232,233],[134,136,140,141,144,167,215,232,233],[145,167,215,232,233],[136,140,143,167,215,232,233],[134,136,140,143,144,145,146,167,215,232,233],[140,167,215,232,233],[136,140,141,143,167,215,232,233],[134,136,141,142,144,167,215,232,233],[137,138,139,167,215,232,233],[167,215,226,232,233,251],[134,135,167,215,227,232,233,237],[130,167,215,232,233],[128,129,167,215,216,227,232,233,247],[131,167,215,232,233],[167,180,184,215,232,233,258],[167,180,215,232,233,247,258],[167,175,215,232,233],[167,177,180,215,232,233,255,258],[167,215,232,233,235,255],[167,215,232,233,265],[167,175,215,232,233,265],[167,177,180,215,232,233,235,258],[167,172,173,176,179,215,226,232,233,247,258],[167,180,187,215,232,233],[167,172,178,215,232,233],[167,180,201,202,215,232,233],[167,176,180,215,232,233,250,258,265],[167,201,215,232,233,265],[167,174,175,215,232,233,265],[167,180,215,232,233],[167,174,175,176,177,178,179,180,181,182,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,202,203,204,205,206,207,215,232,233],[167,180,195,215,232,233],[167,180,187,188,215,232,233],[167,178,180,188,189,215,232,233],[167,179,215,232,233],[167,172,175,180,215,232,233],[167,180,184,188,189,215,232,233],[167,184,215,232,233],[167,178,180,183,215,232,233,258],[167,172,177,180,187,215,232,233],[167,215,232,233,247],[167,175,180,201,215,232,233,263,265],[50,167,215,232,233],[50,58,59,167,212,215,232,233,247],[50,58,167,215,227,232,233,237,247],[50,59,167,215,232,233],[50,58,121,122,167,215,232,233],[50,61,127,133,147,167,215,227,232,233,237,248]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"7e29f41b158de217f94cb9676bf9cbd0cd9b5a46e1985141ed36e075c52bf6ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"dc0a7f107690ee5cd8afc8dbf05c4df78085471ce16bdd9881642ec738bc81fe","impliedFormat":1},{"version":"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3","impliedFormat":1},{"version":"8d6d51a5118d000ed3bfe6e1dd1335bebfff3fef23cd2af2f84a24d30f90cc90","affectsGlobalScope":true,"impliedFormat":1},{"version":"a1387533f292cc1377923ba182557241ca949a2ca8495866dec169038c9e45a2","impliedFormat":1},{"version":"d9f4ec5156491a24eee340452d7e87e432512d5ebde23fe18c2ceb5a31c1720b","impliedFormat":1},{"version":"44716259b743dacde932f7f1922ac85f533af74e3ed82a078ba505414f6f6b53","impliedFormat":1},{"version":"653dc417862cf079d590653212a8d48ace7c89ff7b73c239791099afc25dca96","impliedFormat":1},{"version":"497efde09001124a1bfab8ea16409b6908fe8a49ae8d5d69082910838150fbfd","impliedFormat":1},{"version":"881d8c5d323b9a03009e467e1fb7bc2a32da16a567ca29c9d484518cb02ce3f7","impliedFormat":1},{"version":"5ed925f9d0dfcb0fde32518c7ae42f88461fd8eabb015a35183fac5ce95bbc6c","impliedFormat":1},{"version":"6ec2b44c0ec47a902ff373791d06826440a745d0eb7b284f504b1c4767493193","signature":"f7bdc9cea3eda01c487b962cca7cc15b811ae58fb8fa73fafc04a14ef07f0fa9"},{"version":"925197d3e9c833dc838b15e92bc18256dfc78e76849dea6238ef48ad0250c7c9","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"82008c79e53bddd417f96a32a0be7fa625e5a4fd4a650e0dd56ac83d44671981","signature":"c818fe5b5454b9fd01d04a3dc5df6c49f15444c82051693a41b9f8e69bb29fc0"},{"version":"a1387533f292cc1377923ba182557241ca949a2ca8495866dec169038c9e45a2","impliedFormat":1},{"version":"d9f4ec5156491a24eee340452d7e87e432512d5ebde23fe18c2ceb5a31c1720b","impliedFormat":1},{"version":"44716259b743dacde932f7f1922ac85f533af74e3ed82a078ba505414f6f6b53","impliedFormat":1},{"version":"653dc417862cf079d590653212a8d48ace7c89ff7b73c239791099afc25dca96","impliedFormat":1},{"version":"497efde09001124a1bfab8ea16409b6908fe8a49ae8d5d69082910838150fbfd","impliedFormat":1},{"version":"881d8c5d323b9a03009e467e1fb7bc2a32da16a567ca29c9d484518cb02ce3f7","impliedFormat":1},{"version":"5ed925f9d0dfcb0fde32518c7ae42f88461fd8eabb015a35183fac5ce95bbc6c","impliedFormat":1},{"version":"edb57b27d48489baf5a87ce96836f1528a321ba457f041d2ac0547695e7b834d","impliedFormat":99},{"version":"ff7ffac8d9efc0c3c21083324e96d40aae6debeff7599af97ea19510391236bc","impliedFormat":1},{"version":"528478c48719597726719b0c02c9933bf30c4d08240379df2737b0855acf3a90","impliedFormat":99},{"version":"1c818600f03ad929f377da68467907829a798274bb0b39de15eacdb1241003b6","impliedFormat":99},{"version":"15e2142e16301eca8fb366111117768b44154c8128a61496a8b0af17008239e8","impliedFormat":99},{"version":"0d37c43ae51d1b13017bf50618a62552e882ae1a9c0d4425e86a034e3781c509","impliedFormat":99},{"version":"e3f13b824c948792bb46b2859d7c5eb30efd0d50d9af7e83764b227f845050da","impliedFormat":99},{"version":"f2ed3f8d9c948390ed90b0d7127fda3c0ce07b18d21e48168dd5fd73670e988f","impliedFormat":99},{"version":"14b7f2e37bf42ab1f0b45d01443710c31b0f9cbba6f725cd1aa496859c765db0","impliedFormat":99},{"version":"1306c87ada55f6d882bd105e63a35fd500963af597985455255f915a3181673b","impliedFormat":99},{"version":"2e1188831736864fbd665075a904657abb32d408d0f5ff8a602b199629da318c","impliedFormat":1},{"version":"5ae76ad70cfa4018ee68c99dc54f5e61e6121e21e6225e0743df0abb92c95405","impliedFormat":1},{"version":"12898267ff8712ba92472197c6c3564bc6df883b07d38abe40051354b58fee43","impliedFormat":1},{"version":"5bb7aa46ccff237fa042d687bdea3772e5d3306dab25867d8810a8b14996e295","impliedFormat":1},{"version":"738d4339dab94f3d956302ebe262550cc55ae1e2325aa3c07f67cfd2dfd4f2f7","impliedFormat":1},{"version":"18483e142d029a403d4af3017f0b42047cf523f5644993bf06e3c7168d30efec","impliedFormat":1},{"version":"f91fa6b7d7b917cb13abba172f09cb9322c4d4c6d3235c57fbd54a2db497efa0","impliedFormat":1},{"version":"0b17ba1214d60974a7f28729da417368ba63d6ffd622b6d2935005e4ced5da68","impliedFormat":1},{"version":"7ea405f18742e9ca5cdea12c391b58a16a5f12e2a8faf29f1af8da53b49d5adc","impliedFormat":1},{"version":"f0009b468a30c32db6ef3b58aea8293a5dcbf7be105e38c4599438fc76b38394","impliedFormat":99},{"version":"06a06b5047ff381fe6f45076532f73b9a5b3c9f453a7ac7e401781bd95672c32","impliedFormat":99},{"version":"6ccbcfbcab033b9b7ab70739bfeb95e7472ddfcb94b0729d2cdc1021e20f9399","impliedFormat":99},{"version":"d85fc88fe1ff8eca1ea1b58f75730b0ff27b8000529ab8c57ebe409e32e593ca","impliedFormat":99},{"version":"73216471057e2581feec6d718232836d6998a793dd8d5d0b88b8b2a80bf344be","impliedFormat":99},{"version":"4e9062342cc5aed8828fc8ee0e04a0ba42cc52a390ac3f899d987eabd245697b","impliedFormat":99},{"version":"6c06d626cdb0dfa2ff6228dc0294fe65950c6c414fb961bc0c97f224a2a88715","impliedFormat":99},{"version":"2d6c84e69145203d346795140f66485924307231ec8bf2efbd2a5442f1893d40","impliedFormat":99},{"version":"ddd2e107ff7cec410fff277194e8a820b5ec4fc43b2b1164a5d9848e3b224615","impliedFormat":99},{"version":"35b7993c1896a9f91426d8602e06800acac6c41653e7aad211a38351f2f1137e","impliedFormat":99},{"version":"7f48ac6b67c38d784c4461536d5786b287bc887a40d336696df9ffda552c3026","impliedFormat":99},{"version":"8603ad107b941d1b11634e11bf1f30f1a63209a157a49c6806a9346d4014b229","impliedFormat":99},{"version":"966b1aaed0c756acd90bf0be7247e58f070dc870ec04709a626982c056bfcdc8","impliedFormat":99},{"version":"b2a2ecda21956cb0e9f1711f2b88363bdfe34b66df51fff3093476dcd8b08c40","impliedFormat":99},{"version":"8886569e698727ba5aeb3df443e4e7a7224bf7cfc9dc88ec90f6561dc95b8975","impliedFormat":99},{"version":"e1f1fea201441745b6df7a711ddc65cf556655a447af6499995fdf061d7a25ce","impliedFormat":99},{"version":"cd12a32f577a139273fabf45ffe2f0d1b7e03b4829cff822c4e41adec447ccff","impliedFormat":99},{"version":"0e18f3b56866a19d4aba40d3a0bef9164055d9e704f06fa78c4658395fa1d8cd","impliedFormat":99},{"version":"4de49db63cc9706eaf23a7ae923ef6e20a996c7b6b0714f66805486fc3eef0e0","impliedFormat":99},{"version":"744b83cd662146e0edca6559a7777344eac401c80b4b64c9a747260140b32c6f","impliedFormat":99},{"version":"d0f4653d210a5cecf89ce7b57658d8bc20a8a70a567e6b29f72b6eaf0f4b8a11","impliedFormat":99},{"version":"653e1162c47368daf00009f3e44ef9b99d61d285e4fc373de5ae7786c4801a82","impliedFormat":99},{"version":"3d7540c3b55994757e63f6b806971007a6114e4a10d1a8dc913fd1ee2b565fc7","impliedFormat":99},{"version":"47b12cd359444e90e09d30326497cd98abaacc7fdb1731417001d47d97d6d20f","impliedFormat":99},{"version":"e5aab10ac642bce4e682752ecf7d9be01a5aef352470221293e0c8a761bc531c","impliedFormat":99},{"version":"505084107f9a5cae5b0eebd74afb8b9b367704de06d0d22984bbed4a24c01c84","impliedFormat":99},{"version":"6bc7b70645783405c67547714959bc86221290e86dbdf96a1d3105cbaf748d5a","impliedFormat":99},{"version":"ae2032c46dbfefa06fcb221321e79af9018d493421e4ba0e367bae368a809df1","impliedFormat":99},{"version":"c8504ddc0e62963dbf1be49a581e39201405f2f6769e9e4aabbf5ce36579fcfe","impliedFormat":99},{"version":"5fcbc73afb531a51dea9307366dd3bfe9f8a4c8e6aa81a656d91a91a8d4d7758","impliedFormat":99},{"version":"033baf9bd75627c25ea2bd0da9f3721b82b157ed05f80ef9621ffd039c9c36a9","impliedFormat":99},{"version":"8fdd1687d63d53d8f9485052b846ac09c876a85b2f5fab8a89caf34c79c1c5ff","impliedFormat":99},{"version":"d070c2ac67c342b91cacd7e6ea5ed1f3bc0fd05ca7cce760810768e2916032be","impliedFormat":99},{"version":"2bfc14f3606b9a78af2aa9555406c3281b8e4b7c6f25b828c110370648fb3e4f","impliedFormat":99},{"version":"bc03c3c352f689e38c0ddd50c39b1e65d59273991bfc8858a9e3c0ebb79c023b","impliedFormat":1},{"version":"ef40dadc9172dc6e5f0732f257734681637feab7afb399c111f38acbd7fa43ae","signature":"0b53f2acc15b98cc6bdd228b5ffe6c3fed0b9b947eaf10e1cd20823f90f7ce9a","affectsGlobalScope":true},{"version":"c5918c2ae02d88b93e93e60d87b550890fa613c29583ed64ef092a973504086c","impliedFormat":1},{"version":"eea15ca51e6dc8262c7e9bf7ce60ee64cb3a1c79077afc81d38216eb9f179cba","impliedFormat":1},{"version":"9777dfc22bb5be17ba22af5a785c9fb0f6d505144ae71630ce7addf258bcab0c","impliedFormat":1},{"version":"f34455f488adf70936ebfb7bac6e1dde0fdd41cfcab2ec565a18a761e1995716","impliedFormat":1},{"version":"e08660f21d0e8b367414e78706ae69a19b078fb67b0fe8c818ccaeeeedc00272","impliedFormat":1},{"version":"32727845ab5bd8a9ef3e4844c567c09f6d418fcf0f90d381c00652a6f23e7f6e","impliedFormat":1},{"version":"8324f3861a7a8db0f9d294f6a189182b2d231840cebb7f3ea5f4635773cdaf41","impliedFormat":1},{"version":"be57def447f85b42c8f509a8ce4125c1af5f26597c4a93ef617aae5e0b81fa02","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f00324f263189b385c3a9383b1f4dae6237697bcf0801f96aa35c340512d79c","impliedFormat":1},{"version":"ec8997c2e5cea26befc76e7bf990750e96babb16977673a9ff3b5c0575d01e48","impliedFormat":1},{"version":"894bd2a64bfce5b28d1f4b6760f2eb75f07ce64dd1c272bbf7ceb6fec3f27912","impliedFormat":1},{"version":"0838507efff4f479c6f603ec812810ddfe14ab32abf8f4a8def140be970fe439","impliedFormat":1},{"version":"072f583571d6e3d30cd9760ee3485d29484fb7b54ba772ac135c747a380096a1","impliedFormat":1},{"version":"31eca2d6be5e38d8b2f76c917424e01cc47b0b99a5b9aa07059ff91408abe555","impliedFormat":1},{"version":"6d398ebb9de7ff3ce18bed9dc64dc7d8e8a3ff2fd099f3d98626a1be47d967a3","impliedFormat":1},{"version":"b21469f3144ac62cba082602b8495482633443bf8afcd65caf794025532662a5","impliedFormat":1},{"version":"53d6831f9f6b4dbf422c99c0dc2d879a7aaeb51b42a43911e899258527ba4983","impliedFormat":1},{"version":"a0846c150c0960c2a1ab7582d9b4c351afa4923e0f767d4ef7d8c26ed893f685","impliedFormat":1},{"version":"6ff702721d87c0ba8e7f8950e7b0a3b009dfd912fab3997e0b63fab8d83919c3","impliedFormat":1},{"version":"9dce9fc12e9a79d1135699d525aa6b44b71a45e32e3fa0cf331060b980b16317","impliedFormat":1},{"version":"586b2fd8a7d582329658aaceec22f8a5399e05013deb49bcfde28f95f093c8ee","impliedFormat":1},{"version":"add2e396a8d10be760e447464be5861e12ecc215489f87910afeaa26a6a54c88","impliedFormat":1},{"version":"ef1f3eadd7bed282de45bafd7c2c00105cf1db93e22f6cd763bec8a9c2cf6df1","impliedFormat":1},{"version":"2b90463c902dbe4f5bbb9eae084c05de37477c17a5de1e342eb7cbc9410dc6a1","impliedFormat":1},{"version":"804b4a23ae83d4d1a21d1ec7b797940293cbc00154e777b8d1e3e427271d568c","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"7720d729ef5218ad6e987b13e1c46f4c4d0a70d1b85efa5a4083d0c08354f7d1",{"version":"fb893a0dfc3c9fb0f9ca93d0648694dd95f33cbad2c0f2c629f842981dfd4e2e","impliedFormat":1},{"version":"89e326922cadcc2331d7e851011cf9f0456a681aaf3c95b48b81f8d80e8cdfba","impliedFormat":1},{"version":"64d4b35c5456adf258d2cf56c341e203a073253f229ef3208fc0d5020253b241","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"8566fa84085caa46340393b1704ecd368491918fb45bd688d6e89736aec73a2f","impliedFormat":1},{"version":"1f68ab0e055994eb337b67aa87d2a15e0200951e9664959b3866ee6f6b11a0fe","impliedFormat":1},{"version":"5d08a179b846f5ee674624b349ebebe2121c455e3a265dc93da4e8d9e89722b4","impliedFormat":1},{"version":"89121c1bf2990f5219bfd802a3e7fc557de447c62058d6af68d6b6348d64499a","impliedFormat":1},{"version":"79b4369233a12c6fa4a07301ecb7085802c98f3a77cf9ab97eee27e1656f82e6","impliedFormat":1},{"version":"d4a22007b481fe2a2e6bfd3a42c00cd62d41edb36d30fc4697df2692e9891fc8","impliedFormat":1},{"version":"29f72ec1289ae3aeda78bf14b38086d3d803262ac13904b400422941a26a3636","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"58647d85d0f722a1ce9de50955df60a7489f0593bf1a7015521efe901c06d770","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6f137d651076822d4fe884287e68fd61785a0d3d1fdb250a5059b691fa897db","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"80523c00b8544a2000ae0143e4a90a00b47f99823eb7926c1e03c494216fc363","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"746911b62b329587939560deb5c036aca48aece03147b021fa680223255d5183","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c8d3e5a18ba35629954e48c4cc8f11dc88224650067a172685c736b27a34a4dc","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2b55d426ff2b9087485e52ac4bc7cfafe1dc420fc76dad926cd46526567c501a","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"358765d5ea8afd285d4fd1532e78b88273f18cb3f87403a9b16fef61ac9fdcfe","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1},{"version":"be1cc4d94ea60cbe567bc29ed479d42587bf1e6cba490f123d329976b0fe4ee5","impliedFormat":1}],"root":[[59,61],123,148,149],"options":{"allowJs":false,"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"declarationMap":true,"downlevelIteration":true,"esModuleInterop":true,"experimentalDecorators":true,"jsx":4,"module":1,"noImplicitAny":true,"outDir":"./","rootDir":"..","skipLibCheck":true,"sourceMap":true,"strictNullChecks":true,"target":2},"referencedMap":[[79,1],[81,1],[83,1],[84,2],[82,1],[80,3],[126,4],[124,4],[125,4],[127,5],[54,6],[53,7],[56,7],[58,8],[52,9],[55,7],[57,6],[85,1],[86,10],[87,11],[71,12],[69,13],[72,14],[73,13],[74,15],[75,15],[76,13],[77,15],[78,13],[88,16],[89,15],[90,15],[91,15],[92,15],[93,15],[94,17],[95,13],[97,18],[96,6],[98,19],[100,19],[101,19],[102,19],[103,19],[104,19],[105,19],[106,19],[107,19],[108,19],[109,19],[110,19],[111,19],[112,19],[113,19],[114,19],[115,19],[99,19],[116,20],[117,21],[120,22],[118,23],[119,24],[121,25],[64,6],[63,26],[66,26],[68,27],[62,9],[65,26],[67,6],[70,6],[133,28],[151,29],[156,30],[152,6],[155,31],[157,32],[154,6],[159,33],[153,6],[160,33],[161,6],[150,6],[212,34],[213,34],[214,35],[167,36],[215,37],[216,38],[217,39],[162,6],[165,40],[163,6],[164,6],[218,41],[219,42],[220,43],[221,44],[222,45],[223,46],[224,46],[225,47],[226,48],[227,49],[228,50],[168,6],[166,6],[229,51],[230,52],[231,53],[265,54],[232,55],[233,6],[234,56],[235,57],[236,58],[237,59],[238,60],[239,61],[240,62],[241,63],[242,64],[243,64],[244,65],[245,6],[246,66],[247,67],[249,68],[248,69],[250,70],[251,71],[252,72],[253,73],[254,74],[255,75],[256,76],[257,77],[258,78],[259,79],[260,80],[261,81],[262,82],[169,6],[170,6],[171,6],[209,83],[210,6],[211,6],[263,84],[264,85],[122,15],[266,15],[47,6],[49,86],[50,15],[158,6],[48,6],[145,87],[146,88],[144,89],[147,90],[141,91],[142,92],[143,93],[137,91],[138,91],[140,94],[139,91],[134,95],[136,96],[135,6],[128,6],[129,97],[130,98],[132,99],[131,97],[51,6],[45,6],[46,6],[8,6],[10,6],[9,6],[2,6],[11,6],[12,6],[13,6],[14,6],[15,6],[16,6],[17,6],[18,6],[3,6],[19,6],[20,6],[4,6],[21,6],[25,6],[22,6],[23,6],[24,6],[26,6],[27,6],[28,6],[5,6],[29,6],[30,6],[31,6],[32,6],[6,6],[36,6],[33,6],[34,6],[35,6],[37,6],[7,6],[38,6],[43,6],[44,6],[39,6],[40,6],[41,6],[42,6],[1,6],[187,100],[197,101],[186,100],[207,102],[178,103],[177,104],[206,105],[200,106],[205,107],[180,108],[194,109],[179,110],[203,111],[175,112],[174,105],[204,113],[176,114],[181,115],[182,6],[185,115],[172,6],[208,116],[198,117],[189,118],[190,119],[192,120],[188,121],[191,122],[201,105],[183,123],[184,124],[193,125],[173,126],[196,117],[195,115],[199,6],[202,127],[149,128],[60,129],[59,130],[61,131],[123,132],[148,133]],"latestChangedDtsFile":"./test/acceptance.spec.d.ts","version":"5.9.3"} \ No newline at end of file diff --git a/node_modules/@cucumber/html-formatter/docker-compose.yml b/node_modules/@cucumber/html-formatter/docker-compose.yml new file mode 100644 index 00000000..102837ff --- /dev/null +++ b/node_modules/@cucumber/html-formatter/docker-compose.yml @@ -0,0 +1,9 @@ +services: + playwright: + image: mcr.microsoft.com/playwright:v1.59.1-jammy + working_dir: /work + volumes: + - .:/work + environment: + - CI=true + command: sh -c "npm ci && npm run build && npx playwright test" diff --git a/node_modules/@cucumber/html-formatter/package.json b/node_modules/@cucumber/html-formatter/package.json new file mode 100644 index 00000000..61245ee1 --- /dev/null +++ b/node_modules/@cucumber/html-formatter/package.json @@ -0,0 +1,73 @@ +{ + "name": "@cucumber/html-formatter", + "version": "23.1.0", + "description": "HTML formatter for Cucumber", + "main": "dist/src/index.js", + "types": "dist/src/index.d.ts", + "repository": { + "type": "git", + "url": "git+https://github.com/cucumber/html-formatter.git" + }, + "author": "Aslak Hellesøy", + "license": "MIT", + "scripts": { + "clean": "shx rm -rf dist", + "build:tsc": "tsc --build tsconfig.build.json", + "build:webpack": "webpack", + "build": "npm run clean && npm run build:tsc && npm run prepare && npm run build:webpack", + "prepare": "shx mkdir -p dist/src && shx cp src/*.scss dist/src && shx cp src/index.mustache dist/src && shx cp src/icon.url dist/src", + "test": "mocha", + "prepublishOnly": "npm run build", + "fix": "biome check --fix --error-on-warnings", + "lint": "biome check --error-on-warnings", + "acceptance:local": "docker compose run --rm playwright", + "acceptance:update": "docker compose run --rm playwright npx playwright test --update-snapshots" + }, + "peerDependencies": { + "@cucumber/messages": ">=18" + }, + "devDependencies": { + "@babel/core": "7.29.0", + "@biomejs/biome": "^2.4.11", + "@cucumber/biome-config": "github:cucumber/biome-config#v0.1.0", + "@cucumber/compatibility-kit": "^29.1.4", + "@cucumber/gherkin": "39.0.0", + "@cucumber/gherkin-streams": "^6.0.0", + "@cucumber/gherkin-utils": "^11.0.0", + "@cucumber/message-streams": "4.1.1", + "@cucumber/messages": "32.3.0", + "@cucumber/query": "15.0.1", + "@cucumber/react-components": "24.3.0", + "@playwright/test": "1.59.1", + "@types/glob": "^9.0.0", + "@types/mocha": "10.0.10", + "@types/node": "22.19.17", + "@types/react": "19.2.14", + "@types/react-dom": "19.2.3", + "babel-loader": "10.1.1", + "css-loader": "7.1.4", + "glob": "^13.0.0", + "mini-css-extract-plugin": "2.10.2", + "mocha": "11.7.5", + "react": "19.2.5", + "react-dom": "19.2.5", + "sass": "1.99.0", + "sass-loader": "16.0.7", + "serve": "^14.2.4", + "shx": "^0.4.0", + "source-map-support": "0.5.21", + "ts-loader": "9.5.7", + "ts-node": "10.9.2", + "typescript": "5.9.3", + "webpack": "5.106.1", + "webpack-cli": "7.0.2" + }, + "bugs": { + "url": "https://github.com/cucumber/html-formatter/issues" + }, + "homepage": "https://github.com/cucumber/html-formatter#readme", + "directories": { + "test": "test" + }, + "keywords": [] +} diff --git a/node_modules/@cucumber/html-formatter/playwright.config.ts b/node_modules/@cucumber/html-formatter/playwright.config.ts new file mode 100644 index 00000000..f86785a7 --- /dev/null +++ b/node_modules/@cucumber/html-formatter/playwright.config.ts @@ -0,0 +1,32 @@ +import { defineConfig, devices } from '@playwright/test' + +export default defineConfig({ + testDir: './test', + fullyParallel: true, + webServer: { + command: 'npx serve ./test/__output__', + url: 'http://localhost:3000', + reuseExistingServer: !process.env.CI, + stdout: 'ignore', + stderr: 'pipe', + }, + use: { + headless: true, + baseURL: 'http://localhost:3000', + colorScheme: 'light', + }, + projects: [ + { + name: 'chromium', + use: { + ...devices['Desktop Chrome'], + }, + }, + ], + snapshotPathTemplate: '{testDir}/__screenshots__/{arg}{ext}', + expect: { + toHaveScreenshot: { + stylePath: './test/screenshot.css', + }, + }, +}) diff --git a/node_modules/@cucumber/html-formatter/src/CucumberHtmlStream.spec.ts b/node_modules/@cucumber/html-formatter/src/CucumberHtmlStream.spec.ts new file mode 100644 index 00000000..21bee1d5 --- /dev/null +++ b/node_modules/@cucumber/html-formatter/src/CucumberHtmlStream.spec.ts @@ -0,0 +1,86 @@ +import assert from 'node:assert' +import { Writable } from 'node:stream' +import type { Envelope } from '@cucumber/messages' + +import { CucumberHtmlStream } from './CucumberHtmlStream' + +async function renderAsHtml(...envelopes: Envelope[]): Promise { + return new Promise((resolve, reject) => { + let html = '' + const sink: Writable = new Writable({ + write(chunk: string, _: string, callback: (error?: Error | null) => void): void { + html += chunk + callback() + }, + }) + sink.on('finish', () => resolve(html)) + const cucumberHtmlStream = new CucumberHtmlStream( + `${__dirname}/dummy.css`, + `${__dirname}/dummy.js` + ) + cucumberHtmlStream.on('error', reject) + cucumberHtmlStream.pipe(sink) + + for (const envelope of envelopes) { + cucumberHtmlStream.write(envelope) + } + cucumberHtmlStream.end() + }) +} + +describe('CucumberHtmlStream', () => { + it('writes zero messages to html', async () => { + const html = await renderAsHtml() + assert(html.indexOf('window.CUCUMBER_MESSAGES = []') >= 0) + }) + + it('writes one message to html', async () => { + const e1: Envelope = { + testRunStarted: { + timestamp: { seconds: 0, nanos: 0 }, + }, + } + const html = await renderAsHtml(e1) + assert(html.indexOf(`window.CUCUMBER_MESSAGES = [${JSON.stringify(e1)}]`) >= 0) + }) + + it('writes two messages to html', async () => { + const e1: Envelope = { + testRunStarted: { + timestamp: { seconds: 0, nanos: 0 }, + }, + } + const e2: Envelope = { + testRunFinished: { + timestamp: { seconds: 0, nanos: 0 }, + success: true, + }, + } + const html = await renderAsHtml(e1, e2) + assert( + html.indexOf(`window.CUCUMBER_MESSAGES = [${JSON.stringify(e1)},${JSON.stringify(e2)}]`) >= 0 + ) + }) + + it('escapes forward slashes', async () => { + const e1: Envelope = { + gherkinDocument: { + comments: [ + { + location: { + line: 0, + column: 0, + }, + text: ``, + }, + ], + }, + } + const html = await renderAsHtml(e1) + assert( + html.indexOf( + `window.CUCUMBER_MESSAGES = [{"gherkinDocument":{"comments":[{"location":{"line":0,"column":0},"text":"\\x3C/script>\\x3Cscript>alert('Hello')\\x3C/script>"}]}}];` + ) >= 0 + ) + }) +}) diff --git a/node_modules/@cucumber/html-formatter/src/CucumberHtmlStream.ts b/node_modules/@cucumber/html-formatter/src/CucumberHtmlStream.ts new file mode 100644 index 00000000..717f468a --- /dev/null +++ b/node_modules/@cucumber/html-formatter/src/CucumberHtmlStream.ts @@ -0,0 +1,134 @@ +import fs from 'node:fs' +import path from 'node:path' +import { type Readable, Transform, type TransformCallback } from 'node:stream' +import type { Envelope } from '@cucumber/messages' + +export class CucumberHtmlStream extends Transform { + private template: string | null = null + private preMessageWritten = false + private postMessageWritten = false + private firstMessageWritten = false + + /** + * @param cssPath + * @param jsPath + * @param iconPath + */ + constructor( + private readonly cssPath: string = path.join(__dirname, '..', 'main.css'), + private readonly jsPath: string = path.join(__dirname, '..', 'main.js'), + private readonly iconPath: string = path.join(__dirname, 'icon.url') + ) { + super({ objectMode: true }) + } + + public _transform(envelope: Envelope, _encoding: string, callback: TransformCallback): void { + if (this.postMessageWritten) { + callback(new Error('Stream closed')) + return + } + + this.writePreMessageUnlessAlreadyWritten((err) => { + if (err) { + callback(err) + return + } + this.writeMessage(envelope) + callback() + }) + } + + public _flush(callback: TransformCallback): void { + this.writePostMessage(callback) + } + + private writePreMessageUnlessAlreadyWritten(callback: TransformCallback) { + if (this.preMessageWritten) { + return callback() + } + this.preMessageWritten = true + this.writeTemplateBetween(null, '{{title}}', (err) => { + if (err) return callback(err) + this.push('Cucumber') + this.writeTemplateBetween('{{title}}', '{{icon}}', (err) => { + if (err) return callback(err) + this.writeFile(this.iconPath, (err) => { + if (err) return callback(err) + this.writeTemplateBetween('{{icon}}', '{{css}}', (err) => { + if (err) return callback(err) + this.writeFile(this.cssPath, (err) => { + if (err) return callback(err) + this.writeTemplateBetween('{{css}}', '{{custom_css}}', (err) => { + if (err) return callback(err) + this.writeTemplateBetween('{{custom_css}}', '{{messages}}', (err) => { + if (err) return callback(err) + callback() + }) + }) + }) + }) + }) + }) + }) + } + + private writePostMessage(callback: TransformCallback) { + this.writePreMessageUnlessAlreadyWritten((err) => { + if (err) return callback(err) + this.writeTemplateBetween('{{messages}}', '{{script}}', (err) => { + if (err) return callback(err) + this.writeFile(this.jsPath, (err) => { + if (err) return callback(err) + this.writeTemplateBetween('{{script}}', '{{custom_script}}', (err) => { + if (err) return callback(err) + this.writeTemplateBetween('{{custom_script}}', null, callback) + }) + }) + }) + }) + } + + private writeFile(path: string, callback: (error?: Error | null) => void) { + const cssStream: Readable = fs.createReadStream(path, { encoding: 'utf-8' }) + cssStream.on('data', (chunk) => this.push(chunk)) + cssStream.on('error', (err) => callback(err)) + cssStream.on('end', callback) + } + + private writeTemplateBetween( + begin: string | null, + end: string | null, + callback: (err?: Error | null) => void + ) { + this.readTemplate((err, template) => { + if (err) return callback(err) + if (!template) return callback(new Error('template is required if error is missing')) + const beginIndex = begin == null ? 0 : template.indexOf(begin) + begin.length + const endIndex = end == null ? template.length : template.indexOf(end) + this.push(template.substring(beginIndex, endIndex)) + callback() + }) + } + + private readTemplate(callback: (error?: Error | null, data?: string) => void) { + if (this.template !== null) { + return callback(null, this.template) + } + fs.readFile(`${__dirname}/index.mustache`, { encoding: 'utf-8' }, (err, template) => { + if (err) return callback(err) + this.template = template + return callback(null, template) + }) + } + + private writeMessage(envelope: Envelope) { + if (!this.firstMessageWritten) { + this.firstMessageWritten = true + } else { + this.push(',') + } + // Replace < with \x3C + // https://html.spec.whatwg.org/multipage/scripting.html#restrictions-for-contents-of-script-elements + this.push(JSON.stringify(envelope).replace(/ + + + {{title}} + + + + + + + +
+
+ + + + + diff --git a/node_modules/@cucumber/html-formatter/src/index.ts b/node_modules/@cucumber/html-formatter/src/index.ts new file mode 100644 index 00000000..fd3544f6 --- /dev/null +++ b/node_modules/@cucumber/html-formatter/src/index.ts @@ -0,0 +1,8 @@ +import { CucumberHtmlStream } from './CucumberHtmlStream' + +export * from './CucumberHtmlStream' + +/** + * @deprecated use the named export `CucumberHtmlStream` instead + */ +export default CucumberHtmlStream diff --git a/node_modules/@cucumber/html-formatter/src/main.tsx b/node_modules/@cucumber/html-formatter/src/main.tsx new file mode 100644 index 00000000..e24b94d1 --- /dev/null +++ b/node_modules/@cucumber/html-formatter/src/main.tsx @@ -0,0 +1,23 @@ +import './styles.scss' + +import type { Envelope } from '@cucumber/messages' +import { EnvelopesProvider, Report, UrlSearchProvider } from '@cucumber/react-components' +import { createRoot } from 'react-dom/client' + +declare global { + interface Window { + CUCUMBER_MESSAGES: Envelope[] + } +} + +const root = createRoot(document.getElementById('content') as HTMLElement) + +root.render( + + +
+ +
+
+
+) diff --git a/node_modules/@cucumber/html-formatter/src/styles.scss b/node_modules/@cucumber/html-formatter/src/styles.scss new file mode 100644 index 00000000..79544ea1 --- /dev/null +++ b/node_modules/@cucumber/html-formatter/src/styles.scss @@ -0,0 +1,60 @@ +$sansFamily: + 'Inter var', + ui-sans-serif, + system-ui, + -apple-system, + BlinkMacSystemFont, + 'Segoe UI', + Roboto, + 'Helvetica Neue', + Arial, + 'Noto Sans', + sans-serif, + 'Apple Color Emoji', + 'Segoe UI Emoji', + 'Segoe UI Symbol', + 'Noto Color Emoji'; +$monoFamily: + ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', + 'Courier New', monospace; + +:root { + background-color: white; + color: #222; +} + +body { + font-family: $sansFamily; + padding: 0; + margin: 0; +} + +pre, +code { + font-family: $monoFamily; +} + +.html-formatter { + max-width: 1600px; + min-height: 100vh; + margin: 0 auto; +} + +@media all and (prefers-color-scheme: dark) { + :root { + background-color: #1d1d26; + color: #c9c9d1; + --cucumber-anchor-color: #4caaee; + --cucumber-keyword-color: #d89077; + --cucumber-parameter-color: #4caaee; + --cucumber-tag-color: #85a658; + --cucumber-docstring-color: #66a565; + --cucumber-error-background-color: #cf6679; + --cucumber-error-text-color: #222; + --cucumber-code-background-color: #282a36; + --cucumber-code-text-color: #f8f8f2; + --cucumber-panel-background-color: #282a36; + --cucumber-panel-accent-color: #313442; + --cucumber-panel-text-color: #f8f8f2; + } +} diff --git a/node_modules/@cucumber/html-formatter/test/__output__/.gitkeep b/node_modules/@cucumber/html-formatter/test/__output__/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/node_modules/@cucumber/html-formatter/test/__screenshots__/all-statuses.png b/node_modules/@cucumber/html-formatter/test/__screenshots__/all-statuses.png new file mode 100644 index 0000000000000000000000000000000000000000..9979bd12d536e26c4e07eb8c311140d41fc592d6 GIT binary patch literal 158684 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�Y-rfYv7(%>Zd;F1*FiJ|wx$kXb&~^`g)*~nY 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 literal 0 HcmV?d00001 diff --git a/node_modules/@cucumber/html-formatter/test/__screenshots__/ambiguous.png b/node_modules/@cucumber/html-formatter/test/__screenshots__/ambiguous.png new file mode 100644 index 0000000000000000000000000000000000000000..cfc7d2358e9330abbb73d07fa4b2e744ebc1dea3 GIT binary patch literal 70476 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 literal 0 HcmV?d00001 diff --git a/node_modules/@cucumber/html-formatter/test/__screenshots__/cdata.png b/node_modules/@cucumber/html-formatter/test/__screenshots__/cdata.png new file mode 100644 index 0000000000000000000000000000000000000000..159ae040aec1bea7dd1bad7be00dd049c549a23a GIT binary patch literal 31406 zcmeFZbySpZ_&$jG0Tl@qkOrGlk#3NZ?(UNAZV(ZX5=D?6x@IWpP63IbhlZhtZWtJ9 zpYgl9=j_?P_x$$kS^jW9bmo1Z=YH<{y07cH-!NrGDMEZId>kAcLK$fZRU91Ln>aW( z2k(GCaU?d91aWZg&VnzRy0e|xA(Kgx6xVl>$m`utuJHbT#qIu`nO%+tEA#t@c;F*& za0DcVt~tAxsQ>+NwMmqEC-TF;?@RI6D6rocKQMiZeQkOA#~AziQSxgm_7x}Me((+K z>!T-lx3I6T#0dVqrS@kE0_@MFcmDr3_+PLF4<)aOQ}1wMcK}Dbg(P_7d9>rlt^{41 z)7YDV)K$C`!gx3zuispDIxGMCNB;}9;?Hw&+%Z;X5O2*rX*(F z%t$s>(x}u*v5P#}PPoIzz^O<|j`xui3)2iP%YSF<+~wk!<8I*0vsJmQ^vL{tNh|E9 z-K>LvX|d|pI1QRO%+#=1^d*q7XzJIwF-d)+iK60?P2w!Lf%6~A#B49BzPgE*|0LN= z?G3VabvkhOm;}Sa;3OWOWkwq8n`^Ji=<)K_g{#9{!}>VGz~r zx#uU_o8an>)`kdi9)ArDZ$&v6Kr707!{r3T>FxGA>|az>QU6-l#)QdH&eN+R{hp04>z<{|1?*Son%9$;v?U?)$vc~yY^4pJrSzo*6 z?^TzOBBvbAE1#KAp03VL6P_H^`JjBtvsVcBlqM=|#}8I|(L1xS9Tu%(0xC{M?}O!z zaI&QYw)ur9N{*Kel-m6%d>po8g;ZQN6gW=={7y@+elcr64I6#f%sNv9y~_fIF23-2 z?WKB9NoKMm)0KF4C_Z_Tph|Hc`!%UU0kEYbS={vD`X8xnS`-T?oa) zxvG5Xm9ut(!SZ!Y&5MQ-Rj=aeyu7O~!V}+U1;nPtLi(`APSSE=`Z<~rUBEm4v^=?#ly4Fnh!Gn znf^@6Y%h$2p|5!|iOY6ob)z|IuD;5C8e?HBa*zBC*#0Hf<_mVyKX(Xoi4$6lR%gyy z%vr__YAD7=qzs5>PA>HueKe4_+Czy&T%K2q)qS<^h>i>VP#*p<-YB3JoSn%sbGbzJ z72A@=+)r^MBC)LPa^roUQZ4?P4j?1Y2L5eZLgt#g#Ll|6`xDH4FMaV0kBi19lHIFTiFOJ8J5Iy?M0sfVq4X29{Hs&DM62hbjnmkaeD5(i+IRDs>*>wr{#cg+$* z`!*RfH7epeckWn!{Qf>*e^K&v`WerNB8cP%7t0cTpK$N_pm+R1P!HZ7fwV4n|BOOs z>b#Kq#d+ErNp)_U+G*eByJxpH9iTkrAsfq>G3(%;mcOW8@3Ea;KSf+lCZc(D1!p$> z^~M1D=-mqsvI6yoqg9lcJ&`vYO6a#m?~~V);l5@HVLKLA-+Tv%4DEEU{B{>wLM)cU zeTk)tIN`w;U+nl7*J~F_z0;S-1;rikkwc0WLkc*c(>B4`*+Yk`CZRuxXI7aEM*#u@ z7lg9$Z;Cpz7*zzN_9Vke3&3IBAaQ%^zfQ)a`e$8}R{M2B*uxhGv@Mg<>*FOx@ox;+ zE&B_1-{Gn^-U}}a#v^q3a(0PEBK;2G&t+mRb_1_{cN@{)=!7ts%@Tnw2i|aU)~lc6 z_gEY5yV0e{5Kz2*=dE3@J#`*V%~RZzd$qlNigV@r^kFbVs-E-3syB%WGWAZAin1g` z5$x>loDc{L(KN(P;fa5}`)2Oq+$+|&-B^a%8~ko->6grsMmhT1X8u=aD0=^+AJcUO zyXcZ84AgeK7^6C-o&o{63L$-DW-OLlOC{)48t`yN7!(iRV}zDQ5Zgjt+6@Jj=G#vQ z@Av!#hpd>sna_2V;xoKJEw5sCWt;;Py<4}52ns|q%zJ;?)N!Bos(Y=j-+k5`MbD}@ zVRX=9kBs&hSO1i+UJz6DOyl)fu>q{7)MM2z)H|VwqE$BGt;yQ0we8L6>XIfEM`Tk` zXBRTy9KN2$>%5qL3k|XL>0>{RNI2U~+%HL9*_J=sg1l{57^J_&$zqK`H1b@GMp>X` z4hNDN5g!ySijnO1JVUT?V(>JJa&$0T&hAPM>qOf0d=W z=zn~h!>pVsvD?p}x8XE4u^#T{Zmj@H%( z&J{A8{01Sv$ZOGZbHseA(ehY*7um<5Ba~LWQz@T0kqc*SWmrH~d9N<-s^`j6uE;DE z?c*f}z3|wYV8-K}1=UO@ncKcJnCzAITZ1|`W>S{LF_5eLF-M?sj#pL*9%x*snt*;RrNy`wvzPQ7U%t8Cq0}W@ki~a^4AZGbz2E=1QnlB1jEHA{Ep|F zHm{;SfwvzXuj|3>`7O%2Q<7`C&Ar}xnGE3KM z#8s-B#Kk8W|J~xeBfw>~BFvqwEwX%8(Xmj9N7F$gX92RsOg2;^amt=IN`}AwL9#R@S@+g8qykLw z7LJCnn^YXD7Neb$f}lRjEOXuwp1a6q(TDQbII_zGjm{ zd&QiI{1vKVdHgtCCF{NT7Xp=M$JNLHY~83&J6FN2T3}?3=Wiisf+p#YX1pQ|8ca z`m#UGmqxd}{a2D@dGfeivMHtDwNI1X!%lATU#A1zlfA1;-K$Z<{Vup1Fic+q`>2{~ z@euNG?rbWw;^%e2=u(%GFtQ%+@kDlS2jg}9IX?5ASjFn|M-9hg zde5Z3x!rqcJ)Avcglj=U*VLuKH=dDAMKJG7@8>*Rz3iu6(TsQ3E0JyC6c8n-zN@D3x zSe8MzdVwky_t$sW$ZJrk2dEtne3lQnw>=ebvESuDPxhUQI>~hKa`rYp0RfGW&(YTh z&%~(agPx7=_H_Sb&`?)lu^Y6EQvorb-?%|6a-l3@E!zNoqh&8>*x==(8Bvl{WeBtI z3Tc_G_uS+;0AS6fI4whHb=)Y>;J429(UcUEa{5P)tW>0Q(Tht)8!jmA!e&YH7T`9%8FWy`L@Q-1&gTb#?Isg~uHZI@Mm*#F8oyZ`2 zSkdgt>mz+TXCRq}bt0=_Pugy>soo=Ntoe%lt#ypVIT4K}dd;NqoS4#m>$JO9tJq_k zkJ@_@wB`T91vpJji1L-qdIs;`b~qQ!167WuF|5gwKi^$G&D;K7KUr9NJy~d(JH_r@ zavNo}!|z0=$s;j$Z#P)HIX-lM4;CJDEw5s;t58l0qVh)8E-rVtC zG^XL?r+0G$13BLtBOb(gGKETCSVZojI!ECTri3?te!reuD$sz+>TtvIUKPG0TOWA8 zO4}u5*5rgxW7*;B;(Tqb8-FjLYMhR5R>;t44-9U0DfxT6x zZ+V#5@dYhpbT%N<`)N=fK9nr;l)U}C&~O+-uGBw})aE+qxV2`n279T-e#lefcUHEG z%X?J6Bs{9QKE0fwpxWGw8RD69O?s&WDg2auUii>u&{n|yu+sq1XE5-AL*-er5l;dQ zgb}5K&~;z`IYXT;Mx?~8srOFDQSD@z@TKUhL)9SPTYlR6O)^$?Km4J$e%utiHpSz6 zw;k-fTELn6Uih#Xsi2I(kqG;+@#y5kL57@s`2&m2>6eL~9xJJ^y%A`%a zLZYl!2hW9f+)0G`>dkB}hU2wMm8?VRxBV4I0!vd$s8F7RXQnFE(>A#!q?MZmMfxE= z=mz9oRRLd?J1+_5Jh|=0W48xkt$7Z3NujP!|5EhCvzB1&rQ2D`*Gr5Za5*pj!LJB6 z>8w{Oc!UK@r$qCdCdEe0hHTpBxl_HPiqI=fsJaYgfiHRoiW?H3xd$p`v0>xJuTMD! z^&Uz2VfVMAp`|pcOuUiLw5~?KS(LJAlS=s>tz|rh+Dw2}4Dlx2c&6UdQ79+veGyBD zQ=?|HjLjryy~^kU_F8Xa;A*M0c9UhgB0ru=^1Ccc1B9jSw25qPHq1}8j`BD=SP6$? zB<*JFDm7ODVm=ap8kfAvc%gbS)_=Lb)U`QYQbLfvn7j}1+}3yQVH#pd5g;$V@MR?a zZyMQ6@C4Uo1>c|hLNT{3tIYHmnJ|LfVB@!@vQlvjw&WI;s@Vmc8 zhC`sLzQlYZXu64BL;3hOfzJoujnRT*jd{0FTNWb!P35R+@lc{3Sid)kjfD?@Y-GZz zjvV%P!18E3OJ$ybezs~K^88lC+o5jHi!oKn&{lAXAZOJqyIjkPp4q6VBDJsT*~aL) za({TS0E&E~G7oIf^0*|I>DN9xvBC>A^SCXh%X1Oh88#Yt+Q|iMc;Kgsz-%D=aWm|L zy@*4bBwOXky;Op^Y?@%N2WZYz4RP<{ni6INN zCE81|m>Jaz+T?GasWE@l;JDav^!W_knUvcO-x>>)SZj_A&<>va+x3IT(Xd(Ah8yuK zpI*mZ3GI@m`c<_aik#g_84L2al!uBC7YKWH%p5~{w+Erhg!&OQ0+_}dk<}+V%Co$_ z_~kCmsFVf7ZTU|LkYJ)IEq3RI9}2I@9pm;Jc5T#@DRnA+Duo%#ngXtG{PpobGjXgG ziG=rw2Fia+;o(4@6#8{1jB;XHBMt254h#!qcZZrrR?oEr(^yox`PEbpJKU6_Fd>33 zBP%+O>S-`*r-S5VGBKDbS=Ey~^}R66aIy znrt3ba;HFXkWO)FneZJUV@f0S*|bB_ze5_Gm%aql#Rf&8Csej=u0b0jo7br)qv`4k z@Ib1Ej)w6O$9kc*OtEqQM#Tl?aAaojKZNs`b$xT6iXq!V zoD^QVsj~+mb^zz283K zeH26Wp4Kpe!qDGl9g(yGnlm+5?!BO}v=Y%DO~0e}@_&^oj%lwX3vF_@avf~S_1(s) zbS;<{beey+ba_I-GOvtwoVtRvj&mwq>o<|Cw~RGZd`09_ z^+sP*1n6=5GRgx9(m&=|s(Jm)*a-JlL-w9AhckcgI%-l5QttNtFw*?&Rsz&7#%d~84{gx2 zxK4Y8XFgS^KTD@i0wePOqum{_yqC*!*KF3;_R-E!!?O;5{3&KC$16@6O5Rr$uq9v7 zpH8)I>oM%5C*MXt<^As`vL1l@)&Us4k^Rf!bXIrm43s|aPvv@AT zc z$6TO$1#QMT-4PjEB8R01D~jS3QpPGA1DhzkSrgE$PD=&ARnV>5qmR<#3Le(Eh8IHD zpb(~!V(s6HiI$L|0m%Esv2KkyO7;(514voa^V9RfNtqU7C(Qx>q1)XQ>TNrI4VaLm zOxI0=oSSH-7m3CtA&2DN^N0-b1EV_ME;C8`$QQli6*l|fhfb4F_hZB2q&IN-+kYT@ zzE>@+&-ltL4tx=}sxOU0i81!`b{(xv&)qT{X#w%7HRVQB<7Bm@suX9Nat|hac{H-4 zM%WOEPI|XKoa0*kY-v`t36N6oWFCR|ilG^145q)qHJK6Rw)UMHn`#}?tFDx**)&J72xwtZSlK@ zG*`O)(}vIs9p(tsM|)JwT4SD&HPy#G zn}c)xYiZ(H0l~OFy8vAW<`Zu7a&JYa*C|&``xiN*i-PVO>gb0L0hQs&+K~Nu%d_L9 z(53?vLvcP9aF2|c^a!8G2N`EDt?*VM@JLYomguGnq}=J*<=IH8K%BMC7=gAG^YO8u zd|Zp)X$p$h6@L?a4hX@Qp8Lj9;#_$nAh`s&& z4+EzxKGCeTuHy|Ho$3RY;TCT*q#x`yg@&0Xs|7lcSe9I(#{>kK^1?W6#n02qf`ncARsrTuu1u)Qs$Pr5>O2q6C>GX$Ih#3+keL3F+cb zP;@dbYR}L2yXbw7H_YjhPJG(w_EKzOT>mC|^w=VxIg#;zWd?jRyIE%>Ijf=D0AgtC zcx%#iC{yyXA(l;@V|>qNBP&{1HBoC5g-Q$bc;lf8pgQX7tHx&md9)j;0N=*3JC$~c z2=Mrx`kq1(mgNo`fZ(8P(-CNCSK3oW>-$E(LA~Z9s^#zHZ6bO;pT%`k+*wNvnlYpp z?uG4BK)(jl3R}s@wzIfNKE_M_UQJ}LgQ41=riY_)DCYabOX(Tlk;vn{)I+n`1FgY_ ziRA^tPUZOK;#aT&|83A-5ba8?9=+V4Zr}Bnp&TgWpXVDJm0>l~yk2rc(v=Iw_v6=_ zqAla5iC;ZKHmA|AToKD1)U4Xvxh)2t+~CWoI7{0OVqo>^|4*}9E6xP*J?s6lxMjco zNm`Kl+@oOEK<<$af`jh5L)1le(OTkkH+A3V%GG!c2qJ&^L`UP0=kLmj@F@3ip$-Rw zD4;fb8{?zRKu7LSqk8WLvb@!YzdZ4}3H8@f!=HoUkTmrC$|3yhLblm(O3i52r|&;6 z+g*VM^NHtyV;M^l=nC2AM`sA;w04qUjUo*K&9lq;Gf2dD76So8=K0zqw{c2HOCjQP zTTsb26sfZ*Dp}VoDfD>WkiJps$IU+RVYGPHH(I!n__-j4KS{{f12DnI8oBQY?ME>g z$O`M9uAR!p#_7HmWv+X%0jjC=GX#|EyszhR_Db&m&_0lFnBllNp7b@Gmg)V~1ZCTC z%qLu-`d%o<>B&r^Z*|ir0L2^{@>&7Y+*$J5d!a34^{SVQYPT|}GIT0i=I3v-E~v|5 zY(fP~Zpmpnn|56I_u}`|ZYnY@^aE900)zY=@xRyCVr22fT zhl|?fLoc9$12dMf7?o=>TQPOY(W`O2H=dPMCG&IGcjYRg6&`z|R)?GYIqTnO_%iL0 z>shfd_4H0A^JCC)+eUmnLYc>=D2TsU97O#oNc~c#6T%K#Wz8)ayQ6PqATW6E(JSTc zscOp~1Q3F=^Aiyw4i5m)>0TqLFAN(zSl{y(&jhMmwAez_{DM`#CD+5%@B`ZNN{h<2 z3yUBWG(2A{s~l&W;;o}`lWK;pc`3O_WtM!}AdWWtn}jXa?M@3fSBg7d2wtoI&}^YD z`|~qY&ho@4Eif1eJR6|{wYnJr!dM~|uFNDSLKCjq`|ENDnlVuHaQs$Ru7>|8C&*v5lu9sDfGriPAGResHm&R5SGBK`C8zh>3yNt6RPtz9 zx`7{RN^ELLt6emjPKeaF!qu@sfnZ~>KT4nj6i-_(jUg=ktg+$CBfX8j-8eaH)W!E$ zu;D1oMUkoNSzfwc%{w~upLww}SAa@)-Gbv_Jp3W1A|N3~p&5md;*++c`D~s$`bgIX zsc5<)C6`OgvBGIcnR|Y8lSu{bSwLx56m?!^{(cp_fOKnTEn=ghq+yZoWrNjFrfv%0 zZO;2M_8|xNF@2w#{*e(}C{v3JWyI8MjXJwa^!Q->7vy*5){bxspUV>|31>#3H~41( z4Q!c7whIlfzu)X8N{g_#e6&1Q%7UKVG%Ou))wMpGFK&RPyRX-sRfOk#Ub|w6o%TU_IEQxw+1ozpqBUjwL>)wo^Ar$tgL^-bBCY%0td#=8A<87FErsJKrKrS4E67HB$goAjTF(N3$rA) zWNM(d($AmF=qo(A!$q^Ka4D6hnkckQJK`_wY*VECynlOEL3&3h!TUJq{AJzQSJVeb zl>B@#LP%<={<>+uDn+Y%bNxi<{uKIW`Q~So@v&Io>PeZ7P_2K#z$|xXFg};c7J*$u{Nl*> zejJ!0pLbGTqEbQUnU&JE*z5D3O>5Eg zB0Iuvc*@h+59a}w26em!!i3++q$SWOlr!4Tw$)SB>LL9?+)>qS>8$!IO3mkmen1rg zn!Ve%96&@j$7HBUCyE3%?IwD?$(vbDSwblXbtJN&#Qren^Ao4uoA^&I$5?W|H1<;m#nEM38Yo=~q^d0}RmH1=dvz_`~o0pY`MHPjJ zVj&37LagYky$@HD76DW~{$ew9WO11qDrer8FvKU!t$*>2w&huc3;aDg0ri4q>=Ba} z>k)*wq11c2zYX_Ov#k8ubkkZ^vVf<9eMi5z|DEHVY8!;Cy*9uoqeRsQD8PuWRoqT= za_GpgqxI2@65c3i2E1hr&>}0WM}*IoNfc(iSgHZTf@lE(vsR)T)&#(uuUB2XzvB;; zC|nsPPvvF_@sl)FSPV*=82ld=;iRQLgVTOWJ<3X#5BhV{b~)8^&KYw)Yo|}jhsU}1 zr*`8KJ{kqN;B!tb5IJo!)49y=sWwG6vOEcqTz>_z5^~BweQJT7_&WUF^fh>cD=lf% z!Hhfpq8_frA%xqRqVyjJUC0{*=7LD2IAz*ZzvAJ+NTLvrIL0(dr>cviwwOau%iY6q zf~3dJmY~NG*|$%lS){tWreV?fXe9sCpM$dSxw9ZSnJv$Lbn;z#-X*?gx-z?y%}Z+c z2{e2}Fl$-Hjv-bJ)x$$l{1ZrII;mQOJ5Ey^-~i5>DK*w#wK0`~2{WHd)j?k#%pA`nwPw|0|+_ z2SZ5`?WTbl8Y7f0ni zANDgT5+Nzmf$4=rgae1d4+f#z2BB}>zAd$%uIexHFEMO{Ivlg%ddF=R!79=5 zP~bt$2e*;zfkzP}eHyoK1C0^DTlB&!*1YLj@`f^_=77toN?Vlr*-H zE`VUX-_E(JV{I^c5B1AFgn7hP2CoT@3jb#2V`h|$rZdn$0xQMsRF)3D4#CEr#%n|1 zwD5zJx}t7v+CB+qkeLgkh~6dWqcN8Y5`>eu%9?o{&lUVk`ZE)t>| z)vqJ6p?RZ+PeRtWdMd+N&o53~oyB3YEGIYr(HhV=Wnpa>Q7PvmpZ&c$n5$d9O4)9n z%mSUrHFGy8Sn3_|mNyX(qt2^Sg9Si81RM!(oJ-J4qW+rL&r?l!QWK18 z()5g(G_2@UHmxV;foj&NcXSF4=uyX_AZ)8hwvt%_QUD;^Hi1IP>a7xIG4O{Fz?rV>QM3{vl*jE^z+r+tEx- zzFg&e7l$S6n$R6Io}E3q%==6Weui*AzV-^rC8k@RHy@7vDjW`+2YcHko#~xX z)S;U`ijB6u_zgYZe~$SIKc{8({glJv;Wkiq?FgYPZE-DH%~VQ49eOdh6zBhdw`d7c zYBTxts*teMSszDQt8C2SAjh~G0}mVWYy$WDOdcxPH=m7|q&8B|O$EUHARf2j5>uTAYrJVZf$J$iiT)V?pB!tQ(CaQE3Adlj~`S=x| z*XzPBY575|(?Yf@3v_qmQE|K=*=F|&UvoI!o-*2=cbiPsUp&No+dNnLN1NbZpt)$6 z4=c%Kh=qvN`TPv9#vH9@QOW&zvzz_!`-x|seB#6VdxP;Edvok=pbhEY|0!zC%v_rP zj#MPTujs!Qi1hd{RlTyC@1)Tp%9RRa2Y-J&gGIIMW^(CjCG$9HhRK*$r{De#BW-X* z3UfWGLGjm(IuykfqBl*(S~5t29-PNw4J-YxZQ8_amD2tT?g9jZzX(QqXSQCe{oEj$ z*;H(jKgC-h@XD`L;AqN2on=f-v{{@KS3}%GiH@lLUykK^^|Z8u%XaLQsg@3_1~hhB zmwXgK4S}6P38+^@dowbNRYP4?Z*Ar@sk6=o%&4VDP|mQ`RyU%?ph_K zF8iL@4z?lje^h<40DSop3($z&bBaN+Ok*pK#GUw59znLc$p2O(DyS{DRQ z?q<%3`c=^iF$}7vSN<>mSLvP-uzL%@62ZCIiLU`mbfN?v+YKIW(}?y^$CO$x zlnpdLjQx+a%3F`lP!W78ug|__{XaFbrx0fL>j0O^~%r#%91mc_$NBs5wALH+7 z{L}ws&fouN1Ow*&d0dS{88K-uz5V`qkXr(0!J(!hCB**fe}(zBL$KoV99^RQ+jP3h z9*`FG0hc}?WB~TnPJb8F;C=W$T%zxvO8}rZS+$CE&HpWhm!L!` z71jf4KHt*v&Rr_(VGi)d0n=s#a4^vU)1z7Muh+nQz~_5XNcSFCsQk}QMnC`ilf!#+Lvg3j+%U2E8-n^;Mpo-M^1J&69kNR{}5# z@F{J4rQtgOeyVuT$ELUc2`7UoBy%&VW-C|UJnT#4__rT8*A-v?%maTCA1!O+QOs_4 zOF-uPD9o6iBkq6y<@*9n@880F4AhlyNT@LDBFf7$?Fi2xP6Vk1>mCL43An;$pJSW8 z1U7guaP=A7q8IYv1XdmZQnWNCFB$=}@eq7!ER$N2)H1Nn0oO~<_b2U0j@mBxLVIW` zu{^*oBRO*Myw0Zo0_HjeToSNTt~t)sIA=*kU$q3OWlLvJ*fm%yGcg_ofx`jh$G`QS zyUe%JgnUl`I*Vi0U{=eGJfpq@%>6 zeFP~q&2Op(0~mjBZiaIqIG<_K0X z>wOed7^YQ12eg@&Xkc+o3M>L{%16xVf7hF^-3ym(nFZYD>GGd2lAb6){_qf6f(?J7 zkw<@*>%&@v~$Vw`sxyh)-o~A!vxHzWWXk;h5{S(kUX@Iwp-30nEarS z{_jajLS(=(U8DfeOo`XNFvjf_et<`5akD+Jd1V_?YN-3H{F zfE0=aA2@Io$GscHs;)f$;mIBIlX)F$1#QP^8Qx8b_hUL^T=>xYOJTBayFfQ{S12_8 zwO;N6n+;~#0pR(1(&Mi=v{t{{q~@($yLoYT81d+}YUwBqvnn$MdKW38Rjdz!epEen zGxjp}Pp*7orap8&J18zU1*hO)#i}N2BCvTgPsqA~7M9?osf#N3CS*AE(5dC)jqn0+ zE}iLsP$|o%J(9#>*$=WGBmlFH6)|ajY>-X<&@Se5=A{sS7vRZ^iYeWvlP-)WXHu2m zD3suLnr{J#XH!F$Pwv;Np{D|O_W)Bme$(cyq_QMj*dN14Z-XeHgL&KtF^O6RK7HNS zqIo%YpmDVz;TENZ+#`pwiEUzM20DE!IbMh8(tz$M;|ltR-+Cq|E?uU=Zc_D$zGJ>- z#9}djth>h3F-$i^=p3~58V|?Sk_h3Es}dOoFlkmJ;5eRd4Mv~ zU7s#R1OFMKZ6j(7RSK-AJq!H|_KU!efcj>I_cN=2?4zhWK?jl zWNCq3Yd>C`YJ`8lWzzN^?pycefi&b@l?>$owMA77Hn+H>hvx+3Sma1arUH8(Z_XiZQMr2{WQ3 z!erEVc{1Jq8F0@jTcZU(SG@uEhyN2?EuoJQW0W`WF!adelEEr1zrr&tFp$S?!1~Xs`&$vR*;LVwbdK$X)Ex>{b9#VT zGxkh_u^0f!(k|WGIWY&It>t27ShSHW*lsBx5V*y-2UDtbS@9#@@F<`v#JjoF*j#bN z93^ncCDM-{P0AEAXO22@6v3acNggb$3+1#8v3g+}5Q%oO;-cprPa2yziiPg?8$+o# zT^B2etS)@SfmNAyi?#?09JGNDZH(Bb;&He@Xc5pX^$q)}!f2cli zh#G+D=IdwkIp5aQ8D3WoBvfngaz+=BGO6bO*$`IubMGzMQ1(%8BIK_IKwhg`ougnh zPa+ABYw%h+=p!iJ%{WeliOal?Z!i(#-G^ zIs(nY%uPx=B0>Js2y^#+1kiGJyiubM!n#)Z@p!oVx6k9#&U^Esd0Y~XKk@FIIQii2 zf}674wx&x7o<0_{Ou@iLxAk*oGFES)rT?q+v68_$z=@NE@9LhJ*ac&=fN}EIKgLT! zA8SEr{mG!jJy(BPVLPr^sox=z!z(G;@fKw>Ohm>Y6-Bi|qk8@hKPa&wl1Bgx7|9>^ zf#S`~wVr`A8D4Ktf6X~Jm6e-GlS7q091jhV4eMVRB;v7QmMsWmyls7M0B4EKYKm*( zcAP8x25M~+W&@Vg2*4PavXC*+-t79UFu{Q8Vlp}}B0=RlqBF*pLA=X*F&biuXmU)K zT#FpxCZ(17p<~Tz54CI%Q%*bNMY2s}wV5?^P-~zLeODv}D#S%N8O!LO`4oX7;+Vzi zpRhFV)kFZWl#)1Qwuvwa)}`3IRicWqAI%>Evk%2wCB%^!prz#k{IP@Ej$M(K2dxyZ zz?hLHKNXwl=bv80zGp<~?_f6BJslemes^e$Jn-y`Q6)buW{-q^>))>+GN(Y;#VrCA zGD{+RKHFy5bwG&xXrh$@F>cwTPe0Q9Ej~R?G%36_Pk3Lka7# zUTXG&%=ll5MK~a(0}S-*>F=2A-A@;iDaJ+>Rw@j+csa*l)dVYbUK!M>?}j8X%Tq8m zF?aDZ@Co==@M1Q9eG)g419l0-wEw|!H@kU{RS_W3)poOFS7iHvIYOC0Gs%7T@rqPj zAj3>uXcKI(DABX7GA3?->?6SFIkD#eFrL$ye{b*A*#M~sp2#7!D>*^^47(cIPZ!y= zfekN>)krwccoWjf0`QEApN64^sN+OfKICMLsLO}p$Fc=EGi&1j3@9KR}7V67`kc{ zw@gIKe`=V`|4KbV^GIW(H-Rmy%>>+7oHSrv4gfI1^JQVm`?{ge{pw~)JeVA7zuO`^ zCF`TBilXZ6PXO(xCD}l#oOl$SknUMIn1Rq0!B#e4$tw@wgeb3y_GXd+oJoa#3%JSn zO-Bl1nC2X?-0mxhTxNF{6iGOK7p4aO0kuR7AZ={=_lgE>6#a;4oOD%FB18mIEJ#Bi ziSBDN@vli>B_U=vux*h%#kOx>*q}c+V%N+`NS)vp;P3r_V-P=O=SMYk99WdQg`g+E z-L7?{IyB)`;+)er0w#OXmsGx}FDQo9flj7pK+#)`Ofm!o&al9G1t=J|@CcNfR4d;C zsTT0<34kMTtu-Sod6z?FJXWX^g`QFYwO#?Z)*X4#$Drd1#LhTfVPIv68&OH&$f%?? z>GC3{;v>Vd4>Ebtomm^^z|#;+YdFaZ1`_cv01&$C6SZ>NrC2`qBa|_}5;~t}ap!eG zW(|G@08Z*Rwc@6`Va#7_aiN06iK7Q6o8yi^g@z7pFd-Td_<;ToF)ne&w&$<4OW$pi z>mKUDbop}@RdZx<1)P+1-zccVszHVH@l0Xiqjr?hQ6LMDVzN~v)dVfX=BRrrpAon) zPy;x9ds^`KI`wXQKs2`f0cQ5eTl85sOFu5r$QVeTlTZ-Lajbk`H`k!UO0cdvfn8&} zlTx;c42*qgb)CC9NFkytfGAN%r|`MPeg*^^o!eX7zjf}LS0~esK$7s3(gSJ*=mB|& z<1k6w_LyGQW-uYCM@$x^uIG^p`+Nerz4Z`U0T0eOCq%x=GmSg9Zrut_eGykch9C_l zf32JCt;XoTo)a(s*$R)8RKv}ko*6IHMWW*79BAi6fCK`+mZJCn&?erSlfW}ACpkW4 z2#BYl7-kb@{MDW~>@XPg7mGOaqb4x!rD$!i;#MTnDEmOG=oXX?ri}rCu~`5BGc0;n zJyu<>!io*d{Q)C-n^$>t=lUCC?R@8KK;JXR0Q8I8E+{kvnL*MP`GiZv=iX?YNrOEJ zRK!--C&NNx-N4@Sbqft8c}FG zGfrq(vARCOH^a;NsjQlcD#A;>n7Cjf0KH=XZz%HwKy|kKn?~liIPy4)swRmKNbB>4 z8+~5UW01EdpIqyW^P*kR7Df2Y_oA_7{v!?lgHtPLtBFdJpZBGEjFYt1U61^aiJ;w8 z#&aV2N_bN6J;qgpiYQ8FbA*qQcZ)Q^f7h9;kk@eai50UPjzWx7US4+_{|%^1s6YS50es~8fA2*5|7Du{@jSr3|CR^`9Q*&<^mbsv1sLQ1 zpBVw{?f!pqLjPgMcG6BIsKPBREi<*Qpj})ps-DBYbLVX|46F{;RsmG!a2md{f4tUX zf~&8s00z+s`+0#A1)M$*MwLuJTc9@(fD|?W-L0RU_$u%vf>zfXoQ{7H@owTj#`ko* zPV>On=naw)U^*Uh*{Gw!uw;qV;Cu(U(biZ|^1n}*7im=^G_0~qywZee!r?8drN*tl zUh84SV(_j%o?bfR@7KDb0I2i=bL7}dW>kLcbF|j91kT(bfKiHR!l|HMgYFodh;e@# zFzf=_G*FJ0fDbcQDGdVBDR9}nk9Y)kbO83C3IL(N%>$aw`T}ci!~kB(1CUHfIpEGf zNkakL-Gc(hXY7I$P(Gdn;HJmECsp9}e}58;JY_X%YH(X01`LYr)!}kCiQE4K)U`b@ z=?Hk(Ek&gR!tl^vk!=FK07muzP|79P5|od5-VNxYG_S?GsD-tmEYKYm8W(P1;5^8D zGeF1jxhy+Du=BBiOViJm{sG_s(;ui3aDakQGVmUnmN**O#|L0^{<(aD^1gff7ec`5 z(E#9g0EGZS+a3@PzgUf~rff^>XKH=}>wkDFsLBc8b3k*S%Eq`@1s)UthS{-9pAX;w zHvm_E)q0!0=CFkC;^J_??9bPX8+9Jr(7TtQH3y^39RH4htyfP&M+CXnnfl~0AmJbY z_8oi}TmTdPlTZy9hyXCXD<^scOn{muRba+=qr`H&PzT$D0DQ+7s|XR)Ax6vs=Cnh_ zlYn{nWPJpy(ht7v8Gs5_+m849SAnbqr2x3s8oX1_KoVicD0WD@KiHM)mAMw~e7fuD zdS2QaoiYitQ*Z&K$<)9*)XK?>(os-%J-s^LwY^yCj8a1YyU-{W46jW7yY9k;uvReq zeYF8Axq0&@Xhcs|lO0z96B}@e3BFD2aj!X3uog&KxZ~h9pgx7e4xrQ{EJ5IOQi}o> zE?v041^l2^dkjpKV6Q#9(rsJ^AVSA3k~=^-Qio|OIAZ{B<+A~T)F*#*V>Cb#SI=Di z1qu)~HD=0u)qvLpL&xej(Ru_OQ+G*Tj)G;O6tA!v5(a`iXt@0@kH-N!>Vh|j?VAMJ zS0_qef+yyD? zO{&501U7LnRN!m|WNX>HCWc!u0YIn$8@|gqV=N%gTKp4U>98*et&ek%{CEm*gZMM` z>Q3w&J;Dw;_w63&FmZvk`qW^0N;0mlL2B{BZjhxcr5UsY!0}=YBzM=KH83xS?JPRk?jCC4gOQ!zl=8VBwWm{ z(gwk9(Kk_IB+`rm6R1o}LIawCBiS%>jz4aX*)IIk4}=Nx#pLf&EaFXxtu zKhK!~d9EKA{s8C>7=VNM&p>RnGy_mSWE7_~YY7OUD{z{i*e78ug08q9JmCWHh&$!r zvshFz{{ULXs;#Af12izh+pYlQ0O2z6ElfG%(-mlTj=+{Erh)j5q~=kqG)GBWll=mT zcT4|G?+=g_^Zy5Z7!wZEHZiwD_h9L#Ag>Tpaaw^b3a>9|IOqWl>{ONgCaEtAaO-Kq z!uP?j;Uj=q2@0P?kg=@Bnuq{96*zD_*25nF5f89^3TR~Ui)8QBXS3e%*DQAeO z<;pMo&ohHcWk2plxjN3)<*06etftNi2NXzYd^X6}NwNju@%?=50i0g|?luRJ5_``y zM51yMxW=q16hrt-9gt0ppj!q_T&~Q|&RU8}@T392DMCM$L%V?d@=qVZ>760}-$hBs zi2v_AzeqY(z_Tx`oE#Wu&HnB7DQh?l(_@`BUX@HQ=GGfhO1Pch$lCw?Y7gmt)^i*y zvj~0GQ#9@QzbkImJEDUr)c;RCk4dFZ#ANzd+?Cay*YEJCl{)X}t$jtdb>{Qe^t%Ox zL#mYjuI!5a#_i~|XnLO9yUkk3&90cf$&6b~ijY^<6Gra6Gjz^7=zUcDESKjcB>clo zn-`2aA|~sMFaHO?%@5se@ZwT9I9)X%3I|M8Kd=l@ar>kGbgP;8ch3sY)0~^koaKme zl+LhucBL2{wGNq3^|hFizcHNp?Ydi}SN(4#1Z^Hfw>H*$%BH`b79mdHOLbv*jQFCfVKf|T`q@lyv&UzQW7r#?}7m%@S86rso}Gtc5r19*ltq!?p8 z&#mEUlPfsKGqt>dB2CzOp3w;nmqpCo=9ZQSFkAI6An$(yPuO`b^Dv5HMoQ*%?Kg>u zOj}R2SwAb$`lQ=XOym8M(h(udMW)dBvzYX&*T3Ev6*Zg7k#j_kjyK{drtuAY9x>zM z7(NUP7Vxk-JS4uP8iQH4Ic}a9z>%0i?6SVQL$@J2beE))*!LkMz*?cSOH8g$dWipJ z$+_K3L%%p7_tGL22^93`+f(I6FS>vrcqUY7zWFTQ15Raul&-f$T;3*b7^vBq|F&|b*1ccHGO^ZJ;`He{4+NCURPOouPa2684n(&N^`g@3 z0HF$u%WV4Hvd?js&E#BG-$}KlvbcqG&(Dl)hTnm<9j)+H{LAe2X|1OCb6@;qb&`99 zNtNRPIot0)sERArk`|=jx%LewSJUh+cL%JzP3CvFmLVPTJnJyL-BJ1RyM=7z^JD0Q z^5KBdq8E#QovBr-y4Rb=ovp;xw54W$KJ@pBuCXW@Bf+clvBPk^RjU867;662*K}o4 z#hz34+5-$C_kN9Deou9(;Bl*#=W;I5pQ~x}lqIXD-<6L|<6L6qu45KE1JB4?HLYg6 zag2+g2&g3$X;ctGSuYHEjCKf+jpfmVGDiEg-lw0!*f^y9F;LR4&6D;3Q!;nk{1b!N zE5GKtwk_(tEoxPAA6;Oo6?N7qvR&F%HiuZ^QLRIe@!r0_S%#Bv7%-mu)ST+u4eIh% z!FuLn_svz#ip?s|ndY@r_egGmwfw{ijab3%h1!awCT6ZRSK>kW`>oMqA8}n+^MXl& zNjy0?QjX|P_O5cnF))Zi(hLqAsV(6+wCUfUbFNXxgy21~_|;P6PR%AFX#Hh&>+b9v z<@fW?_HH%**rM^ZB?@fCB@e1Z{y{EIjvq^JXy15{CMD;vrwk?adpB zUTSg^&`$BsxAV)_w;3(;_Ls2U?q-_lYS8)Bab=P$l5pL2XmKLmbyC#mE$Ewr36I?D z45pe>GL^CyzP?fI68Pv96ML^KmWN@l4@v5oyXLrq>Y_02<{Vm%E>>a{Q2({Fj6R^Z z<79%k`7a(k!Pi~g#7!X&yN;4+Qae|_S6dvB_FmB}+DVPPlVh8gHN;?Dv%=O*EaD5J=xC1En6jEPMzPXO>wzbv`w&R zdKbl@pLILy9aSrpqQNF2IW|RsQgq3vPtI?P1$(bZa~F$hU*K`Q-XGD=BBsd6 znKuN{y`}8pa5JxOI09aOpkN%`%H3ygSlBRe37tsT^^Y887zpTaX&ngnBXUc$c zW3TcbS4r<1#+u7HtcxlipYm`?7AkHg%kN#C3HBJ~*nU9cFC-Q+jnp`sPT}NsLNEwX zgnzH+-$~-LZw*V_sA5)O@>$s;5GMGu7w}fBtH`YN#iwIPKb%@*0nh3~d^>t%l?aPz zO}r)BD{&3xgqmbQg+sNNzLXtS{#Fk8*{#(Xefy%rf1_)9vXsIx?X^4BFBK1`c&AfU z6ArR6j*f9S~+pI$G? znZ9pLFZogPh+o55rBS&OTo<&y8$G|mnvE>nOuCm{71L~%kN(2*LBdqt**;OICsxSl z2iOr6&`~Lyehsz)?&>8OYRi+&Z}&#W8r`jfq}+b=N6)w#*M952$kiCZzB2RuNrUD( zk`ynNWnR397GTi8{r&_Fti1CXN^$&DR_0k0n(>5{F?|;7TJkE0uMbt$g|rUN%R8-y zMmKHwciqT%AMM#bTs7?`N~oEbSl4L`KP6`K%&l+1jN;{8GEx`+CX>l4D2wFd=)N;K z_+kQ+p^+$Mv)0msM+m=?k6h_4?3yevsny0=Pc77*tU-&R4t6zNhrA@GkWg-cf+e=% zJx>k+?RoH0LZ`p0sXcUeUer!sHm%NgvZWF>vPxNxh2aXT!8Vh_snq05*cT=Pg!=5Y z=7@a@rOTq-Ixi0#}OImX2+P9wWYMq)N@M+A*(igs~I zmrCnPGl$TbT5-)}RGQ1sW4pu(vSgmsP&sXr%6)j(#9h8IBK4H4dl(lmQgYsl9Z^u$ z+O)p->Jiw8u?`xjbS>N^Aod9QzEx!bnttTX)-Ib?Y0t&akAj~jYv`L-Z3q61J`!`u zr?*J+I6Tz4fTj-(7FHHhA1$m#b+wtUr*I_sQe#ZDX^}Pok(|HQhS54ZQjD6Wz9jI;BtKk+5yjVwxxHIG}uahg)H@p8N& zluYZ6NcIu0pG98kDZC?lCzffmn_a|IJY#7?`*t`FK}R|AH}az{dgSOL--_-LWe6_2 z{*2R5=wmCN2y}&cova(CSB?kB5iLH&@c1jKM6#9pCi$KTpMtU=y-}M0sRNi8vb^n$ zrMUO_fqcXAHc#!jA%4Wav}t;5M9v&Hy!CUV6cZ zrz0mEe7tGxdiiG6dOf5Rk`#vbs+DH86uF^w&@b+LaYDR>6^%Dx!N+hb0h@^U7pk!= z-WB<7Ve#&l&I^A}GwW9e`y8DE2uf(J>Z`=v`gPTaq3Vs^UY_cD>HVh1-W4b^o9mbp zLc|#~ngx%}T@WS@+I+0^l21k)}lYoMzd*TXxSY@70yFsu42&-&a|reVx~*uTY8Z+ z=Y`rW(&3h5vAL2M`{YxAA`!(VJr{<2W?SMt2L1oIHE8Ew~)A!}UiNRfGha}7 z?kf73E*m0)?t)Lv-+9_CvdB|L__mKWrTu#jYkstJN@S7dlXDT)niZ&j@rXx!Jnl1> zEOz?C{m7`vPwSt6XjTYXA6eV={o09aN8nATdSa27>z57ihBNvpaW!4D<0s; zX)OtsT7Obf^;s;rbD@naE!u61sL<1BO|TxnE#KSwXWGx32G{Ur3lD%U*U{LACh8Fuu}(0b%iI^Vzj z?uypBxI^z`_e`n0@17QiSkZWFrR?{4$~Z$DiP@#?;dxfwOA4WzN59;<62&K(0%wqm zk5i@m__6qCA=T=g7#R=px771`iX(p;KQS$>kQ06-+CJCHbxPiOc``iFuJf^bREB9a zE%SC%3&lad=X@lOyw`kxXutD4o2?ZgUHs+iw%cp{Q4Bi~g=;)9e|)TTDW~MPQ)FMW z%}Nxh7goDdS{LtE85VDkyo2>AN!I7GWyoq<4q{No?T77}FsC2Iblb31)6k^S1xdli zws3B5^4)OXo{gD{znZm@n#nEUP8mKa>R)pWxBIRm;p`^C?}+PE^V(~*Cz3yBy8EM( zg;{F6BQlyy{v3k^deo=Ln76xL-Z+fx#a=rX7zmA9_ywT*4CpTd{ZN4XH9f%>XbBBS zXxj_xzP^b^;PyK}2O_oC?=1ojXYNB5w;Bby6d+#%KOhDXZyk(00^t=1&;$orjGkQz z4Um`T)viLDS|G*qY=1EjyEUkMV-Tf)Rd<4b-I!GB0H9RX?I}ATYeAd;LC5R&Aie>| zYq38pJ=yA=byp!e85RIuS#P%sJ)quz*}?emAiNOHe~#((^Sr0P{Q=6oqge<%^fgTP zG|(anjqX6!fbb)rmEZ;}X>;8yNHRyLCU7 zZ~9KpCf>@@PM(!BDYe!DDZ|`z>~IBL7IJ}@Vd(h6kN^qfHuQThnO2oi&UA2P?*i9b z4Vu$K9b`=6HMQ2z)y6+Tmt`LOf-OTbFHZW6bbzwFPZK-DQTCVvRO#iR0P zw}#-k`&lkRUz^>T-NWx`Q}o4`ofLR0j-DH)-Rd#JAoTIbcy^G}>$X8Z!V^{K(O$6X zRqFUbN)nUOYmx5e~+XKGL42C#JDu-KtdO~h#O5SsV@gGh*q4qEphP4n4 zBn1N!{8>JrS0Lvht&qn8d{ROuVXzO9(}j}(3dIVF(fzpMV?fKzq+y5v5u;-Id9Fgp zEfp zRyg!?xTXIZ!Ex%G%Cj>{AwOCZX@J%sCQwo0pp+e}TDXwcnXMxap-h?IBmk!dm1F_p z{lKeG); zb5;NC=sO=;!O?8!AA(N++14!SE*1bg-gNc9_!Zh7n6V}i8YfJZn0df(j1fI@m zSf<4RVWVR=%@weqR_wtFCGlXuZK{ojI93Qm^xY4P6J`}0+?^ajok@^m(j@a2e}1N< z&zi$+20;}2WfMalx)GyJ;fN#{6H{b;g4WQw&|*k8H=*6JB$Pda6}3~Ntb6jzP>q+t zmx4;>wQum(K$2(o3@SYYMPcA(TNtj*Mb?5LXvInF^%C?bC?JrroC?ko_gcOmeg=}O zjL+QVT!GDiDukV8)z34$vOi;fb1`Q^`GfIf8J;z1{0;2M#=vu7b9CUmi4^yP_-ELG zX|OUf%IX`Z<-#@q_&$pI4m4%ZQ?Cqvz(aUH4dyJ}Cug?;td=Vy>be16Oadf-ATrfs zU~5R0bUxdEWnKSRrwqtsIxDZy7sYWxIq}f#xbrs8>|u?w@j1RfEdoR4VRHeSYji>I zWn%0-5I>Dd?t78T`{;iX1QgeP^h2c!8I@$HcY)fKZ&>{1_pC1SQv4$zp+{h@=BGLm zcY2d+!9P`b#S@SVb|Hk5nKK*h$~&Ntg3ld3C@z6Z>z zJj~eBPDuN4Z;-9^sls&a@8vOa`Gu9aftu-(xL-=2J_Ll$6gVIVe)QNo z5dFD0IDm3X)GeflM$bu75wCY5PQqc?ec$2xr9Yfp{DJ5y4L9!#b|41L~-F*hN`AT%DwS zuq$3^T+0YQB$cTsq6i`;+iZ8*w*plD0KCbd%f$M`@4bL4(3$R}yrQYgeX!$2Z;PkF z1|j5aH%wRKsYF2bUh-?f0X*-cG?aF9i%M1QG(J08o|fuXXL@ho4EuDMz-gT!$DB*dR0D4kB~*C9Yk28 zFNF+q;(oM_@u3+ z>=-+6IQj?VWo4$EX$|C(W;2P=D|Z9y**Dl7VK#-+PEigWKKAZNkEn6kZR{?H*a1)> zVA?u{W=(sUrg6_3@)irPNIV=eEXBv!tCgSD?%LlBZ`JV$d=$DQlyqJrR+9vbss3vr zNF4H(5@5_#vQuB;hiq-G(@=GQja~mQW~nMDGm_-|24tiT9I_j$Gj|2@;OS)b9M*~Pl^;zQ}QHcwa6pnn|=iqH+d zpp#-UBLV5>-W=ytn4UO|w^rew_(Pls$l2~8-H)%e&vHP}M{^>+P^t?Vjt*csCHWjG z^h~QME=#x^q*L+YG0a119@mMaMN#h_aQXzBN`0~r*aVlgZaOyNC|cujbB+3PbD4TZ zb6LV&8&9mHs(r5V%}c0E>li0$5nwW~Y#^O`;;VW?drLzAz{;llKs@i$pvU%zBy_1# z{_aidGR;MaD38$Nhs9oZmZ`8eGu5oLN#k8|nUzU&PUkVmW2GyMGr>Qq-^NUl9+u}z zlG2_TeaQJ`-v2S;QQz@Wt1tU!z|)E_T?jU1^!(N0Y%t$FY^P^E2F`rcXoMx4Z6zo| z`wBAn1}8FeAk$3Ss6Fl4L`@Mu8{o7@PD4Xn&2ZqhFH_>crAG(_p>TN0BnI9Xk|!AxrNNU$(!Anfa)RQ}t~U{J<$Az%cQ#S8p&7o; zSK`J3XR2i(n})X&*GI2Oe*J@X&k3Njqy@n1fPzpOQ$32}Z1L3L!?qj505QcU?cO3X zx6$dDG@Fy-j<0_mq+7)Lurs3x>aM)ArL%Q_Z4JUcrrzOixtRV7-UeVYvJ7I(4JukV z#bJ5zjJX?b5k=Sn`FUR9{LK}3Zov%#6W1~)Xv0439=plZB4GGng{g{*gcfQ<2z;5f zoES^0$g2VqKJ*HN+U?iM8rb{*#Gv~(pX@iQI9u3lE2R4a z5)+*YC(K;0zxd<{f6xm~F0(?H-YMX<>1Y+}5XNI}>ezO39iCTy(YP756|@{>gcxwU z9Ye+NmVJh~d(4WFurZkkW?Ov?j}8-K@RY0UPs2LyP(XeD z=Uv5$$ljs^k)I1e^wg{SnYUs{L#Lp3o+9G~$I2fm9C;@s!UX4W!toICXCZ2k(J>d& z4?rS69A0VP0MD^AZq5a-#t6|Ir^9Znl>?`qM~@yUz~t96!nKH;S%7SwbQhL%JQv(*-bAelHxVl^-K}pE}h)E8|`ItfJ|324{zqo>JhTdFwItESLRF? zWv6e7oFMQa=%e$m13FA7TZDLfg`^Qq{{s8;kThc)++=f54X5^7E_l7d(wkir8nG*r ztx&O4#T`b)qI$9T_hA@db3$ip!_px)dA2k2?*`Y6Wvg-K)G!>Nt1MEC^2c6sW&3ED zO*stG4cZ}q4xygdXXe4FT1w+bVkap$b0>#*HaD?r=(r>f=%Y@dr}QR)+7=y=d|&E8 z84kk;6@$5KIQIhGq{;1A6D5VkTtM2q@kWW?$J+a0w3EKv%N5SMJ(Dz@tDFc1(Vz-3 zcKNVse0YUjmrCw!Qrpf`gqXyzSQsp7*R7h_rp^wl2N%|^CAfB!D~?0IfRw9Z#|z0s zp{&VIy_?{F=AHNYY8-F8(w3jGI!S=jf7{L*MCk)K)IsOqnh<-PxDdF(tZ&ZgVlCO5 zsP$kmK{&p2-QEEHWA%^R8#i~vSrTHmvQEkQ_WQ*tahCpGXjULqv&5@Ps`c@ha0g*X z{I2B5rG2LAS6)D2S5Xyh7ZOM*&3~!~s)s*UvuX&7Zh8 zZcw%*|BaTV4Y_JJyJ)LXYhM)|!W3P&72Y8slFKv~n*b3M#!wKQH22lh$iGSFM*&!C z^F01m2rKl;F0@6Jjq%`Z+w$|Z)j!nX<66|Dkr$mh%ZUvwnjF(GM_F_hJmZn5z!3W%{w;n59B= zZ71pO?SJL`Wwm<Mba%cn z*QROeDQ%_b8a literal 0 HcmV?d00001 diff --git a/node_modules/@cucumber/html-formatter/test/__screenshots__/data-tables.png b/node_modules/@cucumber/html-formatter/test/__screenshots__/data-tables.png new file mode 100644 index 0000000000000000000000000000000000000000..8232070ad2a045b988f9910a1a17ed4abdca7217 GIT binary patch literal 32788 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 Beh2^n literal 0 HcmV?d00001 diff --git a/node_modules/@cucumber/html-formatter/test/__screenshots__/doc-strings.png b/node_modules/@cucumber/html-formatter/test/__screenshots__/doc-strings.png new file mode 100644 index 0000000000000000000000000000000000000000..aa5b768c6210f1aa22eed8bbabdece0c77e1a40b GIT binary patch literal 33468 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�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 literal 0 HcmV?d00001 diff --git a/node_modules/@cucumber/html-formatter/test/__screenshots__/examples-tables-attachment.png b/node_modules/@cucumber/html-formatter/test/__screenshots__/examples-tables-attachment.png new file mode 100644 index 0000000000000000000000000000000000000000..ae5323f7e895ec36ce11c31097a38669d3b1bf7d GIT binary patch literal 32895 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 #37f=^L@x?1abkNl+vc_=@kjX3X)EhU*o$61+r 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 T=HXsPZS%^CstVaBOnv_W98rpQ literal 0 HcmV?d00001 diff --git a/node_modules/@cucumber/html-formatter/test/__screenshots__/examples-tables.png b/node_modules/@cucumber/html-formatter/test/__screenshots__/examples-tables.png new file mode 100644 index 0000000000000000000000000000000000000000..fd45438e333455c96554262baa7c38b212dc4eb3 GIT binary patch literal 210431 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 z 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 r~|!nAvk@`l>RN`){0z{6~Y?CP+X%dV3J|JVLx@ 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 ^eNl4mHai}kiC&p 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

    KF9x1EkkC@OgNb8oIin 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 literal 0 HcmV?d00001 diff --git a/node_modules/@cucumber/html-formatter/test/__screenshots__/failedish-combinations.png b/node_modules/@cucumber/html-formatter/test/__screenshots__/failedish-combinations.png new file mode 100644 index 0000000000000000000000000000000000000000..9ec6b4130290169eba2be93f10b80fe8fc29811d GIT binary patch literal 407046 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�uwGyVwzL1gfkCraTE9 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

    7^P^S%7UzuWWHu;750p3BLVZ&4x^l-6Ta zcCSpR7km*HwpE4_IqnB|44iZO8`qdPEh2Gy28N!FcPL~SjYZ$%`NUPlp|4fwn^D3@ zwOIYp=mAg(CRUpV%5#5~Y)VtX&E39hd-&aYJ?+o;vI?r7qG)+e+e9mrx!t;}XxvI| zZ%=PK-#(Ea=@lDWo0X-r(!ZnF6r1-{=rrOpKczzxDzB?+RHZz8lKmW+M89~RKsYsKaJjUoU<6AuTRpL>s&sSqNQ+~{N}B|Ku(=Z|F+z4 za@^KiYhA-ITS1;lIa|w8!&%^Um~riRaY{?rMJ%oAcf7S~$2;dUtB%vG3v~ka?bOdd zefTJDa3;RoyI?UkGm!7mTGbm(Z#9+oH7U|C=}OJM0-?t@H{H?#{=HyDO$a-fysZnC zM4Os(zy3YeazXKp^T@5SiW4tV$3;X!6&Hg`+MCw~SGb5>dg7C_iigpgHn%y=uS6qr zz6;s@Zw~VTP*Gz4SV@&aQ|go-e}HE(Z0L+x(5tjXcm3*@g18#cK4Ss>@Kx*%L1p?BZ^2+j(@m-K%J+ zQqu8x-`dWCwAhiak1OU_HfVT;0L+W3x;*Y zv?7tp;Z5as;>zS7KhCDAViwy&OurJTpDTF>;cw+|MY-70pkLD#YQgFW55HjCe7S(UjtuWH{JUoHF0M46UhtlTE(f@Q+|> ziI4tWa%xAX+#1Jn^P#H2(Y)%aGV`I)_0eGM%;77^)DJN+-@dc=M0XnBcD?(0#9DP@ zmyf7(Jl1K_#du?&f$cK3@-p2WyH#B!Z>`GcsfHPC??Pa(rgWJ##Uy90x`@fJPiIZd zJyI;zD=342wIqK|@Up7K3C*3DNiBjgElFUd!Lg>gZoEp`-J*1?Det`teL$;9xz!Zq z!TBkd#0x!M#-o~{iw4dKzGrkdwVW_Xjn}J;49xTu>NPmt?G>mC+S|)OYN7$G<(CkcoRdWjXfR zdi3*zN}4?yYA#<{Ud@pzS#@l5ameTj#lo-%+G?fs)W@+wm0eop3|V*P!}5m6Rm$eZ z2UcnY%Nq=?;^HyZS}obXIy*uU>T`RuM_Mks5yY%t#=E_GHPWgazp)|A3U@sk_$#-a z;$B+aZKr1|wAPYb+IH=DSHj+i$f+uo%C4M__4A8}Gy(a!?G=cUtvI~3!WcjEZ13(x zmt<0V6>r!UT)APUl*4cO84h-OhB~J^JZaJNIqr(e$7DSelj2=ixC*_n$1f&s1=PB~ z$*epEhYoX=^vmm!@RnRr7DOU42~IV-A(QHbrn3<8w?YB9VstZNP$2B(%_9FM+L{`e ztd91tP?_Ne-We(O#m+$f)xjBADfe$-9veZ40i?$~T|<{PE7gP5cSiLz$kG*bVX$3)EU7gsrr(?3$xG4Ks!M*e7jI&U68O12gfCN}Jp zOMPiLs?NK^m@}xmHYj@({i?!Y-qU7e<8oJ6nX0#MRpWB{R+~x#Uj6|wIdVd9{_)5! z_cHU_J;R&tzM*;StXZ^$h#dIufOF2?t7gK*G#&(Q0l#)}@kRFI$D<`OXLxDGdSS5$ z3pWSFqmwBM(!$E;{k3_0I2JnOjt8_Z%Nu<5PTlvL z?#v?kd-|{z8*9)jSuA9Z!=HXy8_%^i!^DlqqSnb2)}9qnxx?mGA@F_kybRlCEi72# zLO0`#X=Ak_SIgMsrM#o0=e*eE#&nf{E2d*%#|Q;ZSsJ;n+ig$p_nwrOT#I}ML9VM~ z=doXpcC=PIcZ~6*ORPp-9g-sN{<#~TcWL123Yw#bTTFCu)WW+;{_%!M}Y^vBKus+3m|z3;vzUs5g`<(g4i-19hJItGTho{uV2_X5y;S}g$> zibik|d*PQ@}a>%_+uY0*|71LEY9g5P32x)i^w`sQ`6-HXUCsSaCj z;JK^t@k8UWy!GT{9Pg=GUXy23&NRP`tG?(XBTA2;QDen=hmIzSft9-P;@t(mBHx^T z54RaqoV2v`4O+c*hb26f5yi$0tvE(9bQ0r={Vm*$nZeK@D_f`5-2O&U8-$d|4{!Bd zSuRs=L0L|VEO!?+sd{VK#GJidlkK#ES+NpP8oX)>?XJ&TWHJ*WesXKrnno9x&lA}~ z7Hc}<} zQ9_VVIwYkfq>)Z(knZk&=5p_S-~ao~GtN2VjKdqphCN`dbzRr|&G>#l^VMZDqr2Yq z>**)6KblDWa@~fAoqPL+YPd|0mFrP_ET_BPC^CC&6`F~fv0@)F^FC5k_f2!m5DtKQ zyEl6JL^9c-TIq4D(weoDW$5Y2NmZBXPG7ZOKP}D9?cvjVtv}wJ-$>jHWU-z|BaW>5 zrRX*-7sEG{HT15ks}Rt$)omYS@UA?n)VLId3J!?~cUBeD&M{%ux<=;EC_RJ2-{8VU`3LX09((-I$5_xX7#!| zu|-UH-w!0;1!Kj|M(}DE?!Q^63ZVVvFkbRo;dq&a(0fEpKKRQ4!@aa zUfRh1wk*2dyZ1X1?H(RE<)!m1DGe`e)}y(`ROdAT5mGY46@dODW8pnNz---q)xtDO zZol=t>gqG=IZORGq1~E-1@4srdUOGe^xV~bG#sLay3M)L+D6)AG~=l%vGZvWXU9VO z2U!wWt*Fm!SSZMC7JgDd@aXeI*54kkV0$ee`Fh&k)rN?#-jUR4{bJu}V9)*&c}+E! zCeQdrq{4BBN;n>4qm-7Q&-}8npzWRu9WGCNU7Er7t=z7U>t(vZ4<#+L@GJ5)b&OWL zH+vFZqT*C>*_SQ8q{!3SWNFLsn4C&tWVoEbaoP)8%egyC-g86ry49q~erx=-t(p#W zVkh_Q@c!wqDVdTgV@E5x=1Q_|YAN;|*T}5ou4sOx&`>ocYo6?7k7LM<2S4uXEHhFe zv)#_j+-o9GGLl+dyQp5>7Y|=zx?An6p*hdGYGk|iev)L0{%RnQ!;>Uh8ROQklPNZ` z0a21_bdoNOT1~zy72#U5<^6#kf{EmW7zg{`foaPhV*-w5pLn?K9WI6^*LpZUA^Eo# z5P;SAoyWl@&dc4^l{>G-cq;Tu>dx?!#Wey#p{hDd&y&t^mL==r-)D2TB9*ouZ)N6@ z@@iMx2Qwa7VO#VsxAZ1And^UiT<)aUC4n0|U2$AXLFVSUDjPr)CK3~aA~u^+p4sjE zfOEpBV~kfje~~gshm>0)!Ah<4Df&YyILtryW>z((TZ*!p^Yl0F%`gRTvmZFmjhXi- zOVMd2ow{r#QzPjI&q`X~(jXblH8Q7n_mwEKO4Swp+;To@tZX%eNoLFHwwO$R!n2wu z1D_$`SFKIk-LEAM{&hstjypnuKpU>;7@F>Bd7DP z#56tDQUi!_xbh+!?+i*v*bz- zXLXu=6slA>x&rQyZUs+zwynwHUfpx^Jnj7?*s8NJlIy%i;Ncskd+Y3$i(X3ToV7JR z8(udKYwgzRrBDBMj}WoejT_%Eo42Hs;_mNWI~(C^lRS4a8>xC7zR1MLrx$4LbuKWb z^R2%hvw>nNi8EB;HYeL#EDq}}!JCK@PK6oSh`{vv@f=%0O`=z2rTC1%F;RZ!XPKU| zY-X$1K5QNPU7ZoA680p2c9)sgS=wH{6 zZjk-jC zN$7J`>LqJ5EAR8^O(V5b-|6jDT2{dGO(5KR{c$|1Q>BReeTc3G zRx);mYBi=a{s+~UwDAiC+RZ;2CPs4J8kV+aGzZUaOL%rK7O2+RZEaTWF640=y4h&D zy`pOGJG^iq^H?S%#5Egb9b8Z#>&sC1uH1U05hcMC7QH!)B}&80EpSXr=pZ!tOaF%V z{>zZP=TY_N*V%FpY&_{booQ{tI@(LAk&IrijaE<)^6u3dF+~wQd*o;`UcEs4K;-pm zr9@Hv7KW=-5cV&Yrvlhk6)St+y5tq)O_@%Stn?x?LW}0U^sqL+a#OEHCvD`T?l4u7 z3dYGUeWP6(r_j`a#p>=$tJGA~eDxPnj-tq4jX_0T$?bid)k8}!TlsFSNpBPeDGL7j z>v7?33|;WM_Zu2>urxicr-kC`a9%Cd?Zou_>5bN=wx@L#Tb9~3nYoIVT6?0@lC0HR zqsOG!AF*ko?&HeM4aac`2gY+dDDV9eKCUi(?(yOaT|#x>8_&EqYxeSrth@|zydI^v z-4@l(FWro@26P@zLXN&X-Qeo;4b5{Znv`wbW{baBgNB# zlDQ-42p%>G^^V>KfrMTTwt5})U6s8cPYG|epZlL^^?kgX>lzh`{{uOuy!S%$7?F)jO(wxbEZr8Pdjd&sRX z+4=Cv>LGcy&QROYBXCHcX}h!16IhJiTTDOU9R;}w+DZAK-oNM{NAm!94#CCPjO z4~t7UN#poK?%rRRqx;3e$531pc6b$)b=PpZF*`Rk*GiAJZ8JS;s+HT2_aZO+P4xIL zk#=^%hbnGkOgDT6ePxCYL4|ZjBK=iYv9;)+`=a&s&dU2KM@3$i0gX7X3(E^uvgK~Abz)wD z-JynwVg<3;60hucb{OW%sgI57uI!jtG0}6fKfZ9k$5$yCi@7xSMB=d_+#v?Zs^|AU zGr4|@3(MCwmDtV98y{W0Jb3&3rt5lq1O~-uDUtX3igJTa@(JXHeYGBy8&~&y%257ALD@#TlohHcmFZjU)AE@Zg556eOc{4=wpbY*WMUeD>EUw zWHq7hZRiT!xj_5+6&6x|w<|e09pXUMf+3;Q3jV)imHs%Ug?jBo+4$0YoM;_AEr*_17t*(M5~X}^&EdWk1CT@KZLBeM-}AhD+L%8`?A&DoK|b?q%`t`H$7;h3 zEDAmeB#yzTBnF+t2Sjv4g`ww+qP5QYWJj+o?DZ~Puy%fZ9yC`kDcn|y(D=$#$`YA( zxznYA!|*imv{p}4es&h3JNW_IslG+*+3?P-nx0Xa>AdK4`ND`e;-9Sc$UDFRBYxx)siNp7JVRs#!s$4+>wb;&oCqfANs2@EgWv zL83_5hgzev)O8kp?WYR&6rpHJ@kG&o6Enj!`Hg|gpVx!7E$KQjDeh}cY94KJy%{Ek z9W_ob4y#*S(=vhQ)Sf%vo==I&P>G7p^|UUTacB%>n|xM`jWC+5wYQO4|9~Xf$FiF? zkd?d>5L>alIXEg4bDo5aZiUDOxhhm^gAv~yi!daNt1V7 zsHmKD1W5U?40LR9poLMH3lCDbdw^xw13GPELg@0`5ev#?t6X3jo!|3QCK?&!N9w-@X=Y7qc zwrUPZ%T}hu_h?sn1>TSAXL6s~7e(A&opS8D;?F)adO!Yav1UD6U+mkIXqe~0FG?m3 zi|@Ua<>wDpFm#SjEYFZXkoz%57U((8U5}|3+QfZ;dyacTC;OIbhl$>e8d zn}r77f3>c$$!vAy+g%JvBB@o*y&5%@_o-LDUCNy|(7P6v$)O-)$zjh$MgV zTjZ1SQh~g#b+EOwXar-CtQ=)jOIj->Ti)Q><>bk7Z(IP!?*OISnGN*KYFj zB`Fw2Yc4^wF^BS$inUJJmed#!?|VPsp5xj1E0&$9j`%xEF+}Xkb^~SdiQCYT^Ip#% z>pm(lJML6TWZ&uT8IX1#Zt0ysBV~W!S+tn3*)~^WS!NWxH?MYVKBsd_x@oX|-*Afd z(0U?kKFipgI5Pp2!?JgEnHRc34Jz)w+q}4Dhg!?2nbLe=95nJ-iv=uuD*4oDe8cJo zb)0S_gJBXEq9~GdVQ06AH)-@@;}bMzGG~UCq=(;B6mq?Eu=LpPAP=Ecnc_AKK%?fc z`}{ewD!f-k_NdnE_?|?B*4O;=o|}7X`Kp2W(uvkmFC`eS2Hu=xP8*r5>5!>hy5)s! zxK`OMe8Vx@=DUH8aw&<8IE8i6=ZLW7CTPoFc#3~eQn<2;&{ZdyQh;U_v{b1-Er0xU z2l|Hlly$$wn9p}p{@EJZPyVmKHBH#bYP;^M=jY77nRG%|On(}b(6Nfd{dcfO4z0$& z(U3yw|25((`7gPw3C6#}zW@Ba_=vL%zQlt6g&h3nFHB+TjkW9SLV_m=@i2W+{g1BZ z|Kgu|b|T(KBWL+@t0%MhB%`IaSyBtjjCk%nvT~k%*8@Z`1Yi9U&sdQ&DIcF&O1d09 z&Pa2nA=UB?XZ%@jbT{~botjs+cP3UC-Yk5XBqlh?*{MrZuYF8&ytTkmm@p`Gp5{0a>W!n^zc3V^9H3k~Zk(Qpz#t>IjXo0yn%cXxyT z8*zEy>ypUk6`J(^cpTFv(gR{T1@2YF`0`5?{g=%;07W(L!K zcxY&s!C6#P6iC`(s4nr(c*LsBgqf3V(f<8aZD)zp?(_%3wRCPi?x&Zv9p9hn6MnC_ zb%sP6!#s!eev5l|&lxZK3ExxNnU&zr%OgVk768}#w->M{^5OmF&*QVRRQa6B9T09N z^SEYA(1Sv3Xb2E^O3pa+RX{USRsGm-{`T!#u#Y~b@?fq8(+7w;pR(k(HaGJ)@7@%i z1P13Fl{LF%at$|D#KDXnC7TB&qw?UCQ=!@~L`2-)ig%o6_S-}4FCdT{c zBO!RUaXB*o18a9!;FIEHw!Wsk%ex7pBfDjtg8ui{WfqGQKle6PnvvM&;F?WOc#OU8 z_(;;1S;blRI)Gsgd04x6rOZ(K!{>-)+6B}N)v3O=Cl`O^k69lb<#ivjpZEysAv@%f zXL+q3&4u$(J$j_7p&=?Hw7jxn0Xh_LZJ~BW;6Ij52qa(aPUHglQc6k+D7=P%Vnr`t z*OUU%ml#?l)JXgFks{F0Vi)sgIh-X&ArxpzG6>;jmU!JAeLhBk1qiJ5Io z)eu=90VDe3kFq8%8w@Hr`C8z3043$Em3)T8);brq9T^si{6Iz+`(!tzBjJb9nd&97awi#>RmsC_w-}#jwplF(D9E zlmcbitz0LUjOpM{a&}ZZ&cDl0y^Pe|u`2E3A zI)4>%oE5yX%qOioRYp4vl{Ib++xq5FQ$r_2NjIvLabw3~+nGuShX*e36W`uunl41| z>JZzrkepX2f95-ma3-pf_ogt$M@1>72aVBX0X4Mw_RU3vEV(8+I{IO7*lt&$SUjV` z;@*?OU!rj!`5GDX$oCo_8R2%`6Ef zzZ0ru08!K_Kk{Z@Y5@M+0vRpEXnVM5gjSzcs>t0FEo6|po{Q+8$o+X&7#Hr(7?9WE zM=~CHwAsz|quSng2@Tx`Y8_o|NinN^^$c0_E1_v7^$y0xml6^e_emaiNy;6})AqsT zi1Y&a*K<&~-ntb4Pg|Q#|JT0`RB1%wKYslDf|mF9Dp*kTER^Fwe4@ly;#Xi#*WwJ z_CdZI&t?|WeyxoU4XxDjyc>u|e;>6`c{b{3zgWIWzB@j5ugfl)s-j{~)@gCGE-1*4 zt2ysD_MKmIoSx!iruWp=x9(0hn#iE9#U>$0<|vQ+Eb{F8^{LBbQkV5joSb4cMa4nT z3IhjZqT1Qkx*MKWq=V|}YKd5BnH4}fQl~h8tPymKPABjJSBLm`O4sUrZUwgM(I};# zKizfQ)3Ya|1F0-vSib}G@Fo%xSrr|g6Ovj9ufw`3;JN79rINS_W=4Phyv?i%u%;Dt zmn?e-esaHJl$+e5TDk03A0fMjVA&R;W;BaR(GC7X_Pwl4aIh+@RpR1bvMmdDea^Wk zjkWT4bM%c#WSAx6joh-`wWPWgwJ%cqG&cmtGaLXj7B6L%lovBK&!6lbx#2 zM4v5_61$)-mhdE4+rN;}}xgE3mA9JpBp%}*Nd@qytK4@Z9o!BuU_)D31T(it)H zT?IDJ#^|?OCOX_0|6Jlw8+A6-$0}rvm_C^9WdgYJyd~dwSbkxktn!Ebg7| z+;d9iI+@m>)l(XccAKSQ>46ySsluacPxp4?7{>387EE;Z_99@y;Clfm1)*sYARyy` zYz0#IL3=KjePaOn0*e}S&d%TjzNuy@q>HeJ_dRqygj>xiu@T?wFQj!7C7a@(UHdZT!;0zlISS`j%K(`5@EsN+L>E%j@ApB8? zdrqL)hwvNz;F%2wJ>kr6og(8dHy_13QLDly@~Q-P47Ce|tG*uGaQ_D0ft|ZS)Rxg2 zZF2H+nj)DZb%VVEJ=N86&1|E9EmJ#+cBCdRT6~>#1NbE4qod-KvWAdDfmm{HcURz- zJqQhjvBgzuujw%a{Xj_&$oL{a=Rr^qfdh|d;4HpOy*Ec&DJf1{8aC_cuX!m|gnYFj@@K8`D zXjr4tVc4AvB8W%0Jw?i_U)>BuLBzuW)N05$hD!OR%Suam9M(S`7wa_##WLx%G=UiP z3E#tqFODCdoSxRg&WwLD>|gUu_z5xIe z(i+a&vV1d{yi@eCkV4oaCVtWFF{^}5#mY;1ySeDWm1ZwZ{P0RzAgUp zC0s~X2qM5G2-F38L7v*T4A8>s1yG}d#ppYf0|4p*g4D%E`E=p4&hpaIL_W{UARIba zhcUmg0e9XA=rU7G0A=dOVdg%)9Wes)jGZ4y>7!q#;uL3?fq@Z z@|v4$07I3n^SFS$E3ixA7)0lRpCMV1HC6yO@r_&P^WBNy?C$$W4QK(Nr|RqJ$#w&m z;${YXw+N0>vVlTnI9|ZP7^=raesp4#oq~e`zoekWAol#VvA% zByc3_?+1OK=_lmll-;72>0#F5C$Xrd(}PSzf_CP!8=|#&MB}=Iy2p`buihAkl$5x$ zoKe~5F?)Fz3Yv7NSP3xKthIg1&m)fi^{w8HQLrY`-3-O_b6^!BC;tb|>lcDX$cj?Q z43Mm&skC0Hbo1=5Z$aZ=3jHOJ`I;PnLnP<$;FQ`=iXSSUt(bNXkIEYL^ zjwj05DTk=0&VT5c$Vde;=s}NW$NkzfO$H`d%r}oFfl9H&` z07Sw(F#0EA>Aat-R9y1$9$1N}k-6K#eth>5AgVxD#t_l;}fZ3i%m)DU{KTiSr zi>CRNr{@(kdMNUPnZO!f6vP=?Bf_Bm&nXl;U*hU>(78UZlhNW~y=P(Ci5Fho&-N|W z)A=&P$nPmqIvSeAr?HjQWw^WU4-&By#_Z`|rG_yv6XRky?oUWYcSR7%q14!|V47ya zl1``&p^;?&I;aZjRG_3-8XHp+l15|Hel76uo1dTm`0*n+t?Q!rrIb#TL?Av=BUw$J zu2kyr@~)K22md#XH+c158ZRY+#tRPF52tG7mWfUryHLF+b36CLd;PEbW+12jRCxn) z`hq5nGMH&D30-+uUX&x&OG)G8*^-qL`v;yC3BA{PBNfu(om&G%DODcrF~t*=Uk6Ik zV>#B{-*#5Jz3y-jJf!1bVP(~X8wJRlP@4EZHwE+(m2^S{(D%qFpwfEL1_oO)1d$hh zjJrne2?j^iV|8U^5AZX+_`h7B#zyJ z@Kh{T@78nYKtDrlFCl z%@B&EG!3sFAK$H3kZ5QQt|vT9DieOdWWW8-8RO_tAE|fTWgXszdDADQ<~`qpM5ssh zm(V0IZ7ntehx~+&Ha4(G139P@@LE~YaEw(e zX3Nup0h&nVYgP(^#S6x{nGS1MWy9aaK9J1CfDmwkvT@vItfu~HRSV8AKK6>=n;e^L z{ytt29OZ>x_ns)Y?UZs9O`r{vC7G&jW@QEKz*?}J&ydPO4(s<=@}E5#!8V{gd>=(! zK7X_X{h5J&(x~)Q{r|{&|49$W9zE8;sn2`PNx1#?$ zU;V$-+x~z23nM+rkacS2Cfx^hS29~=0x}tD&X)+vvpzO;I$~nto;CKg5*N6ljv9e6 z6z&+n7=-O2)|3(RxF{aCe!hY{>2(HWeAh>2!O4DLRzbW|?7a?7E)zKN!PQ13la!!4 z2am-J%GvR8AX8mmYSjDp-aSjesTyKyJI`Duot>Ze#elo?@0;*S_eucGgA~{HDBIK6 z>Fe=RhL;s*O`iP?!J)336?SVcskq)jlIyXx@%?wWz#-frT|gKBrd>eYA`UK()AmC| zdJeA)o&dxvtE{Zd)(FyaI^O=W9S(cK<-xtGQ{zH;o_pWS^LQoz3UfpW0c}WvGFXTQ zk?ysWRLJpeGOxr{L`ey&8*loP0{Xq=6i+cRF%%JM;-#;sXlUjDA@)!BLv@d0*!T1N zIl^DcRZdS=Q+?2T)EZ|b+V%YG_h2D6u1G^2zo=*?7#NR3-xKaa(V4V;wF{=<84cJA z6aXNrJ6G&LpM_Qzy=vhPSb6Zd&W$da+#VAX^Zu^fKJK6N|5E%)9Zk9Sv&g&dy!K7b z-F+{~7s1Hsn3xJAmB>-_@tMYCw%J{hJ-rpjX{I=+xob@v4>A1~dJ9KT4N;XDbVeoy zW!0ftxawySQjy7&j@Bde|58xE2i*?{9RMeG1$GpndWwzT6aQV6<{+G0rQFvBX*5-- zZb5vTupA7JhzRz2tiZz#SuUbhl=lJKCpb4_XcR=^_aOa&LoTHdXgYVz1yqjK)(!y< zk)NLr2@+%y&G=|{@3NK4NJ|5?;3ru8%`Ggz4rmGc!{YF7pYjvq45(t`;wl5bja)b= zFxTz;7-K=%)6=uFNqOG!u9BUOj?Ow$P#j!R5#2IqF@X2lyPvG#5?rZx8uaQVSye?d zg@K||P(giNR?gQPZECuSWew^$pYrnZ(9oAq-6J;E7$DJh;@_xhz6NfZC{9>0z{1V_ zphmpw&7(W89%tiW*ebMj(wMV+mF~*|g#)>-ZL zD@=`!2b<9#^>Mlb|GwS$m7~`we7t<_;9oVEC3F} zLhM#i51Od~c>69+POr48^Wq57+GS!n)z^z3x(4rD&Tf2gnBVfO`g7gqFI4oNj6}5s zPvgF>+&&X@GVfs)eSJQ--CE0*h8)Z>xx0J&yS-Ck`_NIcUE;-AsiwcnujXC)Q8yy2 zR*nN&E1egbr%eoRexzZwh@2J_gki9nLNJ9~9q}OnKs4%sQdvFe1bibXJiNTD3>web z>FEpLy-k>ouX+QFjZunhPh0d~L3;_PpXP3-s}M<#QM6xO;}q3p2VpZ>XD0thvEJ+vpI9 zfHsH0qC4op>R-k%Xl(PM#=U(JIOhp4yy{Qj=f%GQvTn0R7#!PS^%P_jGN{EU!*Kav zJfL^0*&d2q9zde`K9A-}EqgcT2@7tTT!qY7S=iZI&cfVsEuTOQ)imz=jTRq`Jru`r zV+?5cYSEz>cspMje#3A=lz&A5R(TYX3Htw5C<3Bv$OGG6qA7GYO(eCkrfU-vw%`u7 z#!0yTgOpeoYgXQ^3No0$f#+glh^3C`v&kVa3WobCZfZMI!0;w$1;_+xyfOv?Gh)bL?1meI9FG>Jh207i{!_4(iQ=7D&J8%7w%c%spyp%dryi z1ys=cy&W*@ct15QBiTyVFk z-VGtu#-Uv=?CTqZe1~T@k4)9Sjn$rUZMleF|2g~kj zz#<8VY$|!`={CN`Aum&N-p$QX`q=q$+#y3HyQ@a1FBpw)C{isNR~_J3>>9DbUcKl+lcX0$6MPl(tC_Vud=<3}*p~Iz_gaVoD^{eP@##h^%h0D$WgXipc0wl2$WX|qm zfaXxhQOxLnhmr*gZ$=@Y-tB18Q57-na(ZXt#{DMah56fX=BH1tKe6GBnO*+@t!AVH zR=27q_tqV}dxTTU%r~wsWbhE#OJuPp1F~!F-S2yC_xOf4ff90I85`+YdwBW8(M>;9 zQ%B)*Qt7NI$(__`qjF50MfRRjbC-^Y!jVK#-V3%6#dXJ}B{a!;a_m_E(HFuDwWRE_do9XHGS6J&CU}D=`o$tvk#84B@aR@j; z-xXs6w)2efyK_E24HgTJ!WA~)ei-fwyafL&2kfs_atjNOQ; zK8AL8y#O&sL{g56Y4(Md%;vLvK;L3_A`#PFG&I?0VUgyHbaoWltRjlNkFeQOS|0;_ z62=kD=_s#YpoLRl*Sz^TCGb=mMkc;ef~L)tH|8l5G=E4AZbzoeG0V zOzF+23=RZK55aNYcSD-sbHh6y|2K^6BAQK>) zpH%RhFp3PzC&!@=AJ+=KZZSfhljF7UlHSG;t|Ut4;pcIC>j*A&79`GH82i>gzE(;6 zST7CPDb@4hU>FWHYyiGv;jbcE{{76|=)c8M)alAf3JZUnVG6)3*b@Bgr;S#yIifwQYOMn^l8$;a8WYmJIFXG@;|Jr4Nei_3#PI(kr=9k?v zn*~SlwJ*^`;M=)%34ItcgTyzS{{?tH$8v3q7Pt9g{1=Wh#VrfhgHqRkmD;D0Q23s*sZBV)A z>10_ZV_idd1G#=`!34ihBD8i=?>k))M-h(BXSX%4FSp z3PKb);%7EDpXqQTrG_==wvJx2u4Co+@mRFl^*kg*Ai1Tb1;oXSe(rc%&y|;SPVD~9 z{Ut83!rKT3^Hz86Y-(J&aT}TI-|c$;UeWV|gr45%c|A|g<-m)Lp z=r$sEiHq|C?@Sg`XjM>EfTtIRuMn*v;ai^kUfzBe@nGtF+7OHnY!OiHkSq|mcf{Gxv@oMLR^LcpOUdzD;{+b4N-(8$jq&g4vCA`F=f?aE z%XK1uLPe)jCC)ZxRKxA@2g^^I4!3(NLypG zfOnt9fFmjokYQ;7$k!w)#E9YK-R+Wf6kq}B&s{CD(V%)M-}|tHnQLLIo1a!NRPuZg z|2Az5^#z&oJ0_sn^S0`oKw%|VBU$CD;H65ZuuRJWD<|KgK5F=Myibu<52UUfvk>Ee zmu*||5~v48>llXuRS86yHzF7iDVaO}yHY5@P+Z%8DiaSzSnCPQJd=m*FwG;ZZsCz7 zj2?8=U!bBmX7JFxH)R>J0f|2X>E(-Mz^0*?1pgxgFPnrG==Y)K09+|ChovSQ1aES# zn;9-;(Ur2VW-m}#NQ(&Q1T zqK-s7UxD?23%g2U&GfNH{!66V@cdEhj#HBe1u4!jb zAKjJn6y(7jlFS~3w#-hf3uN1Db~vP@o|_gw8N-?={+FtkUqmtO!a|Cm-Z&v77ND|;s#;pMgq#p0M7yKNYAH~`^*jEI zkB>*yd7TNPSW#i&pL`@}t*FgBgOUrby!NY6tQSzgz};GI+;@E->jDa!JJA*<*|oJE z0N0GbXC^ZU8ySM!Iqeyu9xI0VzM218kjgwn9IbYBu|dw2x2cb`S(@d4i6B$meVn{R&^u_DwDqsw6jX(rvpjoNsvrDR&*!nF*X&${ zFMa%TdsB7wc(!(fTWWc+g#{C+@mn=&cy5wb!sSFStXy^}(Z z*#SM9C$|jcPXeTG7c=1syl+)Uk)HjK3z40sEh#9(n8$WeYMn}1G;#t$U^w69iwXIo z^se^8JQzcPP6@*V_dAWpI0Je?#qF;47>4mWPtPXd>OQd${Kx1RDU;B4PiLPMEQEzL zP>xV{13SZ6r&?QGtLK>ecPA41!$WFv@>xVei`8sPxtcWPI~VSVD(sO!{DS^yd;3Q# zS}0DEEmghveP5XMkOZ@(51m2GKO>mQQq5V92gF@$S%eAYWR#G|M8YsefLpfct zeg-?LF{u{*WjF&m6#XYoW&o`8sn>r3yk0zmWX8cP2zCA)P^WAY))W_$vl!kX#qr{3$=wW4^M z=Whh|ioF#hrVh{>5aXv__@Z75HRU|)nK7^*l#4Xzm9I527zCcaE(3qe=Qo=#+^R6W z$;$$Hv>sEmF~$qqbjXMB2XN|%oq^mAyKWSpQUQ(Y!@bdX9#;nggGYKvfN@YQ{0#v5 zX1WyNK%=bolq4pe>p9SN8;Phg5(<{hYtAY(b8>7Vn-TQ>960HArG3y^0Yhxg98Q{E z$PoCIHwx6gQAs5Bht{L^5~Z*~UYEJMqj>z+!>T!j$5TzgV~AbS3q%izC~V393XYu! z))As-q*ctiFTVht_HF0Du&|bTA@XL%z;dZZAX@@6)fTp)gxn|ffvWrv6jzX$dJ__O zRBg}H2Vm`Jgj|d~cevVe`@4st*#AdBaxh)3(W!xc8AnKFstYfH8%*09L+IG-9uyz zkw~I7s=q;Vg|=rbP!fiIEYAJ>dzq3ElY^nW)|mV=FVDIDc?AAQR<=CT3BO9uc)vdW z>E@a?En%4Fdlh{CQ~;NT4_7kL4F(P`syYmiaSd=5$)D23rfjN|TWUoIM?~EW-EGU# z+_%4_-~}>_sX;N_Mzk!?b21^KUqulReMeS-@^!@t6NtG!6~->pgd@9YEsNqe%Z?lGbTiyeN zDml6UPd{Qppc342s~lNhdo8osY_5QYef(cdCn}gR zhl})E6A}|)mS|>TLQ@7wbbrD#Tgdd)GNcG*GyrSu4C<8a?KfnfxFP4Gq7rc#1zstf zSTM7aZ=(We9Y`Ldrfe9;A@6*u=ExI4v1))x~n_+F)Hb#UDt1--Z-EZz>R zXtSD4fW|(l$MF|nLBl$(PUxpEx`8|b1{c?9_{p>`(=#(OCDhu!ZEJ(lYmRsv?6vZs9v|x!mZ`0u;W6*itKx><{8}K>VJ- zKhSdhxHUVwyVym0^9PMVqg~mT-!T$?*dv>0IJKbE!K{R>Wr!0f7dXMZ;QxVALfL))qcLMPNBIeNK*dps8P2qTA??N+%*L zJPBK#$H&K;n$i&A*m!N#!$k)0t{4)qD=A_|ZnoRNPG|*(IK@;Q(E8Bs2PucCafnx3 ze0+*n*tNOekEp0-IZRhhPfyv*ens&SLYmQ>uLJ{pIM-1VjX6UwA4m_1Xrh83 zo%w~cz&UvJ_X}rdXWfD#1p%t5rq1e)?Cfl6H6vil9@k-Oao&d;rVOgrk_W-y+<>c4I9YRAyajViPJFp_-X z@gMMMxr}4Hjp;{1(g@o?k`?{h$T8}D8T7`@j=d#+jG9#Fg;Bxvj%Y+9O zdL6iK>Qt{B%=XLZ-D55i=j-BeT`1!~zW;!b7%%x;;VOPWggv4q{AKDm0Uz6Wk=5Pk zRx%g}ddrJrssDV{(A9O$}G1G!0j@Cy(kHiyA!T(pIKPZ+8&4wAJD7^F!bUZI`Fx(OQonM1>CL}P> zc)Ioi4%Q`)jk$o{Brp>H-fa12WS1630CW?axx$go?-0l8a5HiXvJUUBCA`4-ex!Qq z)~yEtZ{Pk!4*?_z8;OlnMBL4-dSB$Lc8$7Q_?wETfT$VVg_%MCVcuLJ%)AYS@te7p zP}su`JD*TnSy-&}{O@inhry<|%qIv8=pI;MK5wJXQX{qqCjK@@3Tp(P$RATuid8Si zcHq}jwxCp-?{)(la^HHMYaabOt0{Wo1)s@z*ho899=Y~&S z?=fHVu@AS}bhf{G>*gHtn4y}Q&mWk&E2}H(8bgNT@6p>S5=v)t2HdB=jh}H66Yifk zWI>-MfBNG0kCi2X46?^GjBeWK)y(RSUYsKp>LPbN^KpocbG^mq$$`ro`I`W`ZbyY*IM0tnJe}_^i zk8lNVfR^QrzeZHRa|Als8uMm74uPtn6+!L0c%oNh&CN&z zM5H8-Y|WP;(DlCp7n4W`zSlRj5$jHbs1lA)A8+q}u4)&YD-3(_Uq23^E))%@Xx~e= zu5!ygfQ5Ne)mM><$9^|5HK&jLdmc;{+IAFYP$AprV4t}w({)-`C0~wc3-!XNxvs~O zlD*p^$!v5#hD^7JE1Wyp#p&=VJ_cbfg^h|e^cDny+@ z6NaI5XMbO_+KKs;m6_QDj`3M)%x<_q*`=6a)0hLsIXy& zZR*4C=xSrst2HnlxNp@eT#Cg!GBR=uLq++3KyPU8fu20gj;#D?Dz z%D%?%n99`n?H&fSmR)a| zIv)qCtXEo%M876X=ICTf*yrNb9qmtg+jFehjl#zBOsin$%hj5qNRM##g>L`y>I=RaMU?)njuNO7S!L z#>X8oj*@Gz=FHx-Ewx@hGFSN`du=FOQ^56nb9~3v4@<66?LuCxFH7-GoIi@Mz#8a| z{n3e`2d@Al^(X@v(}t&HRVm$9jQ9}wb$&~)nUyw3K3h4$Q2pdg{}Zc;_w-1Ne|_Na zY*5qsBTve2H8ngQl6cd=hyU`%^wq1kAA?x^$i7Sko(0r9z6(JLq>vN?QN0CKvpVkNc)`XJ~}*j*khp z4abIS#YXQOK}W&E#IcypHLUw4(bG~c$}tZ+5KHm4x5Z`j{&eRBlEu3FO9Z@e=&G!D zk{N%51&JqA{Ju_3$IdVONo? zjIM)h10m3Zj23(mlTdLj96}fB*j+?KH`2`?Bl#&q9gczGNx=^#s;ON1QoP!8>4%TB z`40=JP0)jCpiA;1d6!b?q@f@$FE27OvOyUkzxe&*T9i2RC2Y|Mkw^$f2~b~vhXK(E zLA8bE60J)91V|zg%3z&4&4-}L`_cosBgO7BPR`$1e+G_^KLjunl~b42^EZmfRU@XP z4$6XvNJL0j?S6(^r%@uiGhx3|KW9wkIV+g9xoiHn1g+SL3b}(WqQ~IyqX;r`)tVz; z#mSFb%$(1jDP0npIKO+hB5wXBJf|+?N?I`4#l`f_+|Ik7HLWDp?gt(dKgL$>1v18D zLJE0@qsG67lVQ4Zu<3=?J^UOf>zwI%TdSi6|G(&e?Wd!28uv(Ea?K4-13wby>v z-mfM8&;NJ-?)#eV1#j2tgXZk%JFRzap-Ls$&JvoQ)ygPzT1PSow$NC*-Me>_XHU+^ z_$&&A-;}cNIc!N2d@7#l$dMz!M+BkM94R0iaSlN)l6%Zy&tmNCI`e9NzC$aIR+^*k zkpE8>;kZ36W`|`T+ftK^kB+*nEuKHh#4`&N9rvg+-br&m#v1Pky=3g~AkY$)yS~q& zCxnhf>f4Vq%eyrx8(14^LB<{Hqo$0nsh5?NJ^A;0w*FQmTt{2eZop}&<>Z-oh7-bx zKmCNuZOqTv-h;AERx)}*X~p2gDW%lB8)SCot$Baox6U$$7}xJL|@xb>eZf` zqD7APjCr+apGOrwSxbJ^zI3cmeKn!tj#K^Une?OUH`r8fr=b~0BZDOWfoKgn!aDQs zMz&VvuV21A`if6TNC?(i?-jgpXf_jsPGWc=%Thl@pj5+^YU#tI<>bsR6rUu>3ZTNk zPAyIqZc5-lDjGEyipYLp|G26FW*`d)^T*e2N(5>57TI+}eT0#00Y?k4uHxk#l$0H# zmhDZ#nw0QyVG-HMN(RJWpDcIH40-P&;Y%YWxzpp-+qZ_MpJd*18AS3jZmmiCy+*29 z<=1yc#O+@l^;&#*^`raIV3kj~K0_WK-@RGxFUpPL@G*E&r$5BW%9F(Vub@?>GZ^Th^)u7Qx*n>D+bzlhNr#7yv^wpKY02P{yZPzz#dkl;+-OiKFc`E|9QtHVH{`PIB_ z`8XnI$gThaGOzS3SawBc2|rU@p6ZC(#GiA$mj6M%1TKbl8G;2>3Q5roOn5`#&luZ zdZ_8MuRJ`wBDcDMUP&aK~2 zT*-{FIY_~ldW@h5+S-?a{|4%V+ge3s4j&0jV;)!tIa)6&-bY+F3{-%yMCsED)=Fhd zmITWn>1kSl6f7q~gRSI5zQe2QE`+FH(i$u=7#zO)*x)hq3y$^_SsFS+7G7n!6!T^H zyq$|0n;mV(MNeylnCM^j$N=O7^R<4p%*puQADrgGlhYmhFRf!4U)!7xM!62ilTx{8 z-#1=oASR)BW=Gbp9J`&IyzXQqu=fQ1>)C|7bNue_yMCD} z>#t7==0(fg_pgad$mG8$@Xb&;f}j`Pyn|=w%1oNdv6E%aoO8pOt4;v@;Qw} z+>UK@0&cTI3i^xaR;gH7Z^M59hdbxX7WvLrbaI<0G^o>w zen}9MmR56X*vnxjbvxh>7VriV9Pw|rEgoZ5ZcmkGcPRie+2O419D#Nhb1b-;BcJR?MM!vpWU&XN~+*0N?x{Gwo@x9DRr3W?}M%Z zVyIz`p`d{IE{Z|r4oVVA=Ad-xhaKwgJngKl11U9@oS^sG^*Q=l+?#}&tG~^86DDbY zr(MhntLtcd-?7d}OMUy+ErY(a*j6>Y#yvbWi$5=W+VMR-V^n^XfsJ!)ntbB3Z8^mq z3|4RC|LPB?8_&Cb?b`VG+(4a>A)L@u{lR(HZrlj59{@2-O+%xbDs-wWUy(STPxlkr zTZL7DzL7{>z}mbX*~}k5W`~Jal?@D+D66Kne>7}!j<^{&oSd}c(T6P) zbQW4#uRoog-JR|nWnA%F>AY}cj^IO_DWwgZWana!o!FHyoZRB^`#BV)&<56A`JEL^ zfR+l|q*tnH3FsnZcgkQqSyjR*$X!7%C6T8oQO8woovj ze38(`v48Isu_VG%oiIsMvUWChO`j>r@bI_Nyp=fLsj@tAjm7s(zL8Vl2=NxyBWrh( z;zz#H*_#X0#BpvLA7rC-dLl*~@yb$D^VWu5eXuMA0mnu0o^Qo8X12GUv5?IU`?)r9 zs`>8C*5Z#N*PCBl5PECn_r7+mZJ)_o|B<<*ULKdujy1W)&yOj{qN#t@fp8SwSAKfV@jCODI}@cQUYC5WTpv)8 z2Ff=~pBi}nV}2s=Tm|RCPtjo`MJw;qdvzt3mKEIFJF1_zS)u2D3u16sero~XwvTo4 z{KCQ=jo&jjehXuf2aQ8LNpCfNu8DVxKleXspOaYE-m%73}wyZgAUyo@*yOgeF4PEPEp;_V*a zyCKb1|2$T-%lta=(H8S<=k?qlz>YS_>+1BOJI%jJ6V|+&Z5IR9r;?ZCr~7gh=j!OY zQmlf7a;HB#9X}{?Ked{|UVfD5VZ%}L&EJ`QMhE87RC3xIPs^|SR@!pEXWwtQ-{rX< zpqSuow;G#x>52<`7fhbQh17ZXpQoAVjzu-&s{8@hBE}17<0C4ivFH^xLILTg06fw6 zX&*TPu>n;w!PNpWZScONK{#EIs8M3qJq`vKjrcUQOJX%>HqjZrd+Ol?TtC({S?U~A zUz)_k#6pGt=u`~iKz^8!-Dg|~?=THvT=|Qb7(Bx2d#9Sosr#v_3S6vWR?3GD9|oX` z`*Y6={qf=9D}J>Vy;90cFy5rs4-F0Bg0SdMN@C<0)wsSpjZ|8?6s{RgP7`Beu3>9Y zm_QVE5CjBloQn7S;6mD03QiNK$~NYe%pp-zy%ZS{BVuzxlv8YO z<-!sUw&B5J0$0u_eJt@>Ckbj$%INWRv5Uvx@%e;QQ8-AMDD_Hfn z`tyg+3JJIgv=xN@Q9OTs3Xv1E#uWElln-ZhFkPGrPm!^5*spLbz*vHgJh zrSVawn)8Ex6ER=b?!PeeU0&|f=pG*|bI-dV;xNH_!>r8riB{_HClT{scI(jk zaM7?+0;VsqiSVd?m{=#sW=WcDEf^ix@g)Q+=RSg!(;m?vict(+bnd1!G&Jo9Cn=Wn z+yVyl>({SV26_6~)K(X8BI1)dPeWppMlQ@6ORzRrUk2A5q2j~>-^Be&-xcaT+c!rc z{a^phfPq(aaB$yfs(*@@k z782f8y~|W4 z!tnYY!2g701}#oHJn=2Lpjzk|IGwo)r#^qyQqi|v`R30?;r(p4qLLCk6_*o{8PSz~ zjaLhcuMwk!HK#C*4r(|%i;{#Xhi3?Mz`L(o-iWgv#UfjX_w8(?a|8teCt^*}U8YVK zCkZ5(mjHd;xOJrfHnwertL2IxwFUHg$!oSTl(gP{pRQc6FlR#7&Q8k`5LPlM{mZ@c zRybX&L7rZk;}_Mo5>&Sk}D!c)t8N zKne#SLNFeH4f3As;_cCb?C&MBRF}ki$lvl;L#eo#rR+zirov-$Dl2?b!Q7SBF#mKn z$yw*>@f0)nHF$$0D2(3OuU=wi&!^3_E1*$WEE7_o3wjN($?_m9pJtJJr?6ut|7Eh)k@sE;*}hIpxD6NuQX!>0i@97}RMFbE zGJKDY|MILQl-Fb_1P>)@AbxC2>_BUH_Nsinjg8HkPjNsEmguSn22x`vre5-G$J=Hy z#${q+;ub8Pvwk5Ni|)nrwK)nwztwedB^dHQ$jE?Qz4z@~2J2)P8{sv051lb3qpm?~ zY3L8=1m<_#le;h;>2^|PcSe%m%)lXqMQstzryVAX&4%xCC?7X80w@F! zOsmq>2g8NHlGf3q=w$q|euTfZk&t)-LA|A*=j8M>Txm9w zlij_oAnNiVjrBlpkp27R&fF5U$a+w2;Q_zIr@el^m}re%{Vm>89|DtmR%k!j8wkudr!O9-H)WRn9C_!?_J<8u z-?%pi#oEDn@YHYZ;@aXDDiJCdX@_1>Z0rpsYjl96rl^0c`E={5+Kn4#;iN@54a z_#3~ttHbq8S1rJQ{X>;v1bv~Xv=nW1cukGJgG0{3DL!`ugZTRS=^ChL#@`uEVS?H- z*VG670T7p#>myI@D~Aq(u}A93S9B}{L2spS4OeSEA8jIhf9uyQy^vrL+KfaI=8|Mg z!oumX5jRF&_fWS3E^pkc^{Df`-ybaCwNs_Gx_azj9uShW&3-_5 z-K%~=1e*?W-traXxfpMh^l#kUW#++i;fBM>|I2o@77P`4<=eS2{F&h=X zk-D(6C>fJ{#gq&DP(Wpae(^*yasSER31RWlm9%?$`4t}~NpJ7ImCa@G@jYch4O};V zbza!~d(g_b>89(ZkG$)slVrH0*35g_ zkXqG}iOFdC#_!Il+Agv-UV^hwyqNm;{4I{J{rzqKo57mTpAYUzp&q+|-`Y6E$$r|T zvPY`mjo4m0i`T|)+ZFCc^6c4Dgng|SofFaHO&=Nx^s2@T{w`aHOZEseC~jx zvu};($BjqGpdt*Z4kP2^r_Y_+#l&=TwwRLlj|Waf`)jxOoH zsz+x@Rq5VNOpNRGjjU6?1WP^V(|*}FzyMtFuJoCllTSqbaFsydv+dU%jJ*)Zw$#^e z5J_CC?_DjVWCpCmRw>ps?At#p=Zy(41gkX-dU#2n(Y9t-vZ#3$6MlOS&!E@nr*Aq1 zNlZ)$vkNN6+#J&H>gwrr9b!Tr16;zvnP}N@vJnbEQ+=a?4O04@yU`e)$Q_xQg4$X@ zo<{0DF1+w=I4G6K6U@WoVK2oXEHDwfr7sX_rXZyl|(G+qzD;*HbIG z6N>A9KU{~3|0^L|$MwlSWb0@lt_U~Cdpz5JkG53zJG+RnQ*i0B@_xInjJ>86p(2FT zn0(86q+gt!;M}`+I}H@$d(q(N>+7R3W)AG6MU*B6qk6qeO->3JHA*1m&-y_~W8n8g zr3O@-0-6IY6{dEd`B9CWfLuZqIuZK_t}r)ucNi>#`>AZ6dm&s+{Q;WIUOtlJnXM0$ zu58DIb^gp51{RhNfF|6V&%lq~%Xcd{D2U?*u0OaQS^>RRT>7!!Y8F05XgnL7tD)h+ zC1-sUL+;-btR+vG#_i z&)izDK4ts)(|x<=&p8w0ePlfPKdv=pQc^A$OA3v7evEiH|4$~w#`dR2e;7Kr3?Ri~ ztm+5*9kxr8C5d;N{z-zRTPCK#@LsdXvVk6WwSL(MgefL+Hca z;$Lvx9($p3A5>rinysA&MBq}+K-s;52?S9o%rs;#$xReKf*|=&?YC=^mgy2elB6&P zdHbF$gn~g!%CM{M%~i@>9V$}M6NDHDDGUE6S&2Ab#NbXYe3b(C4uq)eW zz1zxJvqx(s5#e5A=2N$NFLlbiGqwCa(cADo#@9r;q+YUamiz6qp;wG{c59~>k4za` z|Fy;PYS)dtfgmgIw{d4oO%6ytJ`*?z_cQm}o1Hzq1Z@wmR)bwUU)(}vRaItYXdHw^ z^~%uO99!4-vMV?(;B(l{tuAP5%cCS@UfJN8Ha1mPSGS~)-3$o{@eI?Bc8+Lba?Hd~ zm?i)Dc~7qC8Zx8;gm&HQiS#b)C2@a880WT(9`adqgXGY+g}x-%GpEob~Y`IeC6f^P@}FZmUt*X4RIgw-V#V-`{9? z;CMmZJM>~!2Umc%rzc0bMk3|5!U?`3+&um&Qby&ZIA(#5zkHf?vbKgSgGRd&>1DCD z>MLv+4%t_bB_sJbFE3_6u;uGeRAgj4`{kZ_d|J>(T|W&rUh|m5GLiz)9V2h$-@a`M zTnKH{9y3Q_5tL_9(OGGxl@&<&M)-+V9(X12>Hc+(oRU)b*xkz;Q!3B(>ow9cG_;?C z$f{sO7cBK#^=1>)I*yzwJqp!@6J`ha`M)c9rbvp6wVgTg9H#R9;8p2Gpeav=j zQGIQmSp9^*@9CF!qUs1yKp4}5zij~rQRVV6Bse(Ocb7|V)*}QE>e=p@Zzkn+R4@qG zfb~LuUhCc)ZcsKYd#@>T%p7+$)Rl|RrW~(IyD|9h-T}pEulzy1?nI)*CxSy?eyyZ6 zV44<4PO}fcd^KYUDUbTOrs9V9jNvb?4ZiCB$;cq zoa6;FJ0uvwBVb-#2|+Ce9iT7Vjtp1KFA-so)axT2M?emBZ83gqw6LuT z@?<`@V0K5Ft+gW98t_}x|UH7{762KK*1u+YZCUr0=$|C0)Y5pTXtMDHInfxdl` zx-njK-u}U(dmlYbkH2G)$fr-A*KJ<#xmM3L5`D)fyO60cB`oYY(5GWBl}{1WJ6u?+ zWb&mebDQ_!A>~C#My^4W?7x(wNijBvN5J)zK$LMlMi&dX4XHK> zv2>X3s}Y9)d9qkPMlNW(Y|At;?dnRaZe>>KLG#J|87%e5Q$>#b`+0x}*jpTgCAhX| z;e__d;BZ2kDw4&x2X;id62jB8;`umR99R3H`NIvHk3`YUGhjjamo96|*|ySdo`fW- z9!y-eCp0|<29xGzY;A1x5sL++KVImh>u_B#(lsL@BI?tgIoZrWE@Js0;}U@*@Vq#@AMQ6A2G(cCe*`@9Jo*2f*TTZevem8UD`&Inx--ZtLP9v3-ttK0t za`AcqcjIg_v2{L2MpJpD4k3pq7&%1u!q2%5NDUk7gx79-!kvj3j49j~?&i8QN|C5| zbB;bbWq+(FMmP9G`!m^?z(A$b)!#N`|3xRGb4dKJZFIW-w7>uTP(sy{)n5;#tXI`~ zkB`j}cEu6?{0L_F-{8H{MMh8kS90l#m{V?~OgxbtaMyO7y%`^~*X}v{TwvJfP`At8 zd)IwS)31aSm$G~7RSvWkKmEGx%uByL8}qdcRbuM%2Zl3-2Gh>U!F& z`z3l@Xp+3>vSV?ZzR*6D*WV5HUOmf8Hu`nl3<@CZ0#r3LG?r{)g>_%*8!^+;x}iVG z&(F{MI*gkbJ&q2hNi)Pvaft~?Y8^S^?%~nwWT%5t1Mi{;dmywwm)&*Q0hs^5%@q`B zA?josq+MUl(Jbfx^WfgSIu~A|3=ur0u?@0}bkRh+KYaLbjOND0ox->c4;?y@TI1~E z^1N&I_e;U2*7`q|UrCicPiV1Ki~pg;-qxDm0wF(~OgGI$E2fES@EpAF=M+8ynX^7I+7323?NLqz@1sKaHgqNauz%)^F; z9{Ai(Jj`GxrLaKfhayK~SPlpZ=n2B4)~QcYu{b$lF;vFG`fJ)?QS`?4##iw2}7o6A}a%1i7tuIx$pkF9sT(xuM- zM(e$O>&}%U#ub1=+7d+wH!{uH?D(6ka^^zk7WCgJ+3CWx)h&evwy+Ecm4zji7JqDdGuhNJY|I)&k8=+Yo z7e}Q-8Obd55NakMgm8FLZ12Gow!XgJpo8NOr6N4Ib|mU}q&*H`Df>!^W6Dn!{-9yC+$*(dVqIN}9n;A@#Z8;Z>$YbKn^$dZT*&2q zSy6KFtno{d?sAIns*8^~vkF{3s%FQBbDhTvf};ec#f4AbDjioC_FD+#O}~CcJpTo+ zDis-$_l=9rUU81tF2;VLdhP4eyLUOVX=tMg_U=ZAfYa&IAt^ce3DEf=O`7_LMFot0 zSq++o+>hLF$1N`}GfA8d?T4)R5Gbye^Z-?C!D#t5GWIHqSpL#_83IIGJFKj&ad$Na zoyykB#AjzY6Q6ur#)V5jfP9mgZ&UN~nm=FgJDe_t3y2LDMU zXO~j{KMBCUv@JK$$>{31ZN^Fo?|k-qmH^DjYnWZfKY#u_JRBDv&tq0BsOWnAe%ziD z27yvb7Vs|V7-3-sGEL?+M5uN*+6BF*=G6@CMvfmORfgMxk|rl6Fwt21`T6l^?Anz~ zKr*H{!vTzQJ84~*)sq{36r}jI((9Y(rN{>$W%xL7Dox7!Fa$w5(}&Fz4aO{7HbWr) zLa9vI(p_zAGSJe|8mOrqwcM_lR}lBJ z^}I)8qQQ;((b5Mq7$YavRL=D^zSYpkX0MZ%ALdv2T7I1T{?XLv&9GOzLbrQBMh2@d zh~4$=_!TD^{2pZ57GG^YT#B^Iu9C>8C|&*&XC=_aLi0+<>-jxUBNpjuYc2#dnOlQj zMX#s8-ZRD;cc*{L|HY_`enFDL6IIGaKsK8Y8!|9pw_mkfsC+Yh2>vhNCdI>=gUDEr+(ELqbLTzt2jcbqW zTUULqZtddSTwF{ag52U9eVT%L^n4qN9-pU|+w;4NioZTu#F%sD^qybhQi~B<7miz3 zdyXdjUJ&q2`jB8ef0BG&f#iep#}AmYvNnHa3-Gokd84Q=H?>UNZAs;#_OeR9k77&> zKvw*rxUF$-=ta!dSHGW2;5B#ud1;4*t!=SYBe{)YPMKZzZnxJ+Vp$XI^_)w z?&whu50A-!soz8ymnzp>u6d1F#Wdlz$Qr?@vJd0J!Gpf2mB4MzMyjA(sc3lNydb!3 z;`r)MOK8uKH?MO`QlnB@Mo5U_^Sj<&zDRlnhR^AXf=x5a%bqq41x!}X0McPq=PYq} zU-J0o%|4ih8$^z}Uc3m|f;h~tNOJqselt)7nal4%>H>fxB-#9K>*5Sr?Zk`*AKt$E zZAEkDpYT0`HD7VcJEr{N8jzp0>n(rS3Ui53N&FZBl;2EOyv>>UdgoqDJ9D?Xtpu$T z0SBSBMeqc6Jj8T;g*K7uWsvsT+M&a^OV<`ACC~A%BZ)-LGkhehdVruJ z_7gM-egw5&8ZIQ=NmK0U!32`|^e$DB?)fH00$({iJO?SqpUc9{H;^mbWQ^W5Hp63$ zhOm~P{groyLfjq2eG0mZf5P}jxOfS6fm}h~gqp!Xj;HfX-%pH92~J;EAW;pV`{e26 zRqW8$)!C`*J3`x9f>6ZynDJ}S;ofsYG~nY|GQm-!%{_46X&n7Roi-gAAVFT)@`#Z0 z)N@#T2N~I6PKNJhbH?YW&?$uY)po|J?m~)^63^g!*uIX{$~g}aHHDC0gaeb#v3_IY z{rMpV7XFYymZeZ31yR0tf-Cip34F;r0$;+{W!fUw;>QFX*G0<<;KGmvKeNQq5?&-A zkL<;6=EcD%=o&EISfvkTyt!!U@!`&1Q1<#TR zm^0MXTVSTSuX9`AMYd4^;iNQ>3i(G6LiztJrn<@EsawRep-Lmf{4bE&PEI5leP&LS z%(s7huIbnYEs$aAIQ;D{imz7{zbaG|H0*7|KI?|xoHrIhBRg{-+ls?ELssEjD!*+`Fva&Kn zeS7=(U{z61&PfTd`s9=lzumrl8-jNMgB+vB#!|R_I0Z2fyF-qM9?f9GDZEh*sB{;f z8&h0Dn+ysh?h4{PzTtLlN7>TCB#=RZzy6M-ogU1j#l_zdmXFm*=q}8#nI)lW%a$#; zNIPDo zc&}+w@IzK(%m5zt=Q;I_UZD7iLG^r%B=R{|?zcPw;nLWSzV)LmK}x89Tu%>I6!*R) zsdEPQ_ETt78@8qCj{g8F{|taNo2SCVJk!^7d<@CqS@f-WUfGESOuRDhG?X2^1YbBf~h}` z(@(B>Xr|^@HKgeCZF{kZggp>iyQt8JGQq+7pi0$iKnaG4lkX^2%q)dL5@16Y%jR*U zTv^Ihz)Ro>5+Fkb>H~z45{87u4P5{hOQAg=c%20pHgwihKaQOARK5YGecodm?EWJj zP}Re_dU@+yX=Qvo?aBjXiV^XkS^4F^fz8PxLV6n9uW%5-;_zIA5-$@OS^kqJ*T*rT zOrw3m(?pars1y_A#QOTs5}MKd@K_Q2toDFzU)(wLD5YuxZ40f|p|^6zXSTUdnn&XT zo>1h6_r>Q7wQ*HTm`QH=qYK#QG{Dkm7Jng=1m9YvybS$z7mLj#KvV0#ZhEyRiDhkl zT2V2=YhMGRSTVr}+Yj>0kuywi+mLPCbIN_3+r-K+2Ll@hjzO^8=+espR>xL3J*>ck z{56~s^i+V=4E`-dHkY{woFBgIEt;x~lL@RBK~6z0So3pL@IE2?*xr6WfvWAY12O3Of1!wRk@}YsclSNoNwb*V;ZeJnxFdL5`Na`6uwB$XyMaT~I0`F~!u zBW_&?Y!eDcI0WMOIGGYCj|nb*|1ON&YQ$T|su(dO*yMyB`#Vyd%JxxS*q;!U!7QOu ze^deskFEbdD&GI{+u%R{hH)>&WVpEMkRbyunlP^rID^p9v=tn5@-Eb zOFFP06Cdq0xUhv03;Xq7cz z<+o;V3+Snjq2b$}9{pgEUg81G-SbK;@4`D(Z zm3-onFI8aNAcze@5b|Wj1a5A^zC)U%Z*3wqckPkj)c{-+1f=GQrd?3(p#Lud>Y2rc zkg2AQjw7+A1_TNQmgg5qV#Idea4@Z`Z6w+ivb|8yF&#NUAAhe6%>CTxKjVa6M{V2E^;B^O?Y@Hi_Fn4L6K$-BZEv!Y#Cf8!Ib{?-IFsrnnba5 z%^?e~8PW|5*tEgbV2{TSK)^6#YNa$eTGhl7i&a@SZx4Egs*GQ7NhyRPPKVv%ARY$G zemA~op6FdVJGF1`rxSMZob$n77{E+eZ^FsU8TdGqiupi5t%Yep2X3vVXx50E%p|i& z@0oVM8-M`BaPAwiu^cTrVlC$SF;6H;N=iaM;IWt&SOu4tui$l?^`c39_?d~$ItBSD zWIpf@FisY2`F(428ZOfYa&vLP%t!EifS^TK2HGpD-6NWwo}TzrM5CNtff!4ic_FiZ zKiVF;Zgp{TKcuH{y&i2%I0tcK(%}V4a&kp3#UfR{L&(ZSsCNi$)Um5gm}wWjeXCyw zt;P|SCg6#*jWIUbeOL52|B~h6t*9$9dPb|p*P=%+P->OE^Xc73k0Op;-AeHk>@cF( zj}7<-NjE&kHHX`rQI^T_=({}p8_pGLCA?+I3w6B&7I*~;ZCvqhy1SJ|2%sSVTdICt zw??kfqe6{DqAgG}qz#41;noVj8?En;1}Ab;6=$|pUIJ<0kELo&$ObOnG;fJLHqKKgJwG12hs*(|q? zDdhH<0G{O$s#g9*<{A273pwp!6^29H+2O2QhL5HdHmL@zhqVZ7r<>E0v*irrv<(ZS zjd*XBMPpOG7Y$Y`Yx>QE1iG#~q%xW@Gcj=nZ7a-)FrL74%Pj3ERMHS4dRiN60=JAE z=`n2llHL?C2+=O#(lw?}72Ah4W|}sgLp35(#)Tuq|CurRgA?T*p|w^E=%gho=<>EU z-z1CoiW`lyi&KxY6SF8dw7cO^v5P7ZDShVYc;`7+M3SPS@#Th_G>g@`sJ5Z1wmEIz z;+0bfiOTdX8Pb_;(P=XMSni@c2tmFD5#Nz}f|SI|XkK;4nq+CUQE@pG0k?-a?UYlW zSKH-fcB`qJ&c#^i<=H^4`~@n-Eo_2_!Zg_6BUS}ct@77dALAxhorcP}TJjqXKA%PS zoZiB4J!!+iv9CLicWSq1@x301qiXZ!%HVft1R(<-Hf=V^7hOi>P*`hDOeiotjDYt# z?nb&8$!_7s%Z)6d?P1~~u6K*bzMJuDKCc&mN{K;26tXbA_Mj|ntE?Y2v4_XBP+5(%4Hhv^MlU zCnqPL_{SlR6zkoEe0sdAsS;;&;1@3oyoQyYp;xy&KlW}3oiry2{7`MB4bN!zT`m2N z#3l8*d5O%PaP`P^!F2w@s^w#`q6!z+vfNSy zuy~r3ghbQ!kk^D-PV`^)5BMm!$g)2mLMRZk-4!m0sb^r303RxBHBKYl5_;DN_4eo- zFF9@mIcR?#E>lYxMINuLGw}VH?^Yl=^%BTa>)cjZN;@y4SImE8h^faFfjNx(klcPL zDLP?7y<89ROB8v8cJkSW4=i46_4QOr3;hr;CMWNz`-P;ghJ9#E>tYFQW#KFw${=+D zekRSUqc2z7 z(cRbV(gN3kB&izX1L2MCG(9ij(h+ezu2x6AXvM}tTsDy1#W_+m1<|VPTs(Fo2TPV) zn`t>0G&%PP2ta${JFi8c;m&jBrAw|Zelf|A(?45~21f>#`w1-FCDLWe))wG|vgoeh zq_{E96uvk@E3Qz~mA`?&c5xm_+b_`4C9d}Ej zI%Ds{426;}L@dl-?HCYJxY&9aWmVgm>+r3ZZgTbcfN8z+JufpoEHQqER$J+=B443P zgPiivN7LAv38FJBqw-lBlQv9_CFnifZzprvik0x$YA}>dHyCkX;AN zt!XyrXkut+*pLq*^qzB6{E0GWOP83@;}vcNMSr!c*(A8$S|Hk^jU|GNW3O-(aNDtC z@9377m=ic3rZt2U2YZVwwlp_?LIWXWki&TGVVSOw3MEsw%pJzCWh009U@HE`U48}U zK%*(o(wC+axiA#Z;g|im)6#hTCudLlmOj=-47y0`i(lU9lu?T!62V}~Es5>t>PMsM z7+)=8QW??8DYU5lD`83Hqs2%|ggI}pvV+z8pbuI#ITAr6V}>!O;^aNR-vqwVd%O_tOulZaN1 z*pasiBUocR@4z*IU!s(=!PU{cA)#31l10?X#QKWAUMIC-sIfm5bRCw z39|?}RL9a_N*msIeapm=OZU!l$myL!&@>wC-ysNT#7&X=MeXYX1o&dCmt3|h#vVFL zUK5v^xhqolqN-47;zKtsZEakFV8xvarh6k$1w;(7XF zk0NDf7%4Yz->v6@PHv7qRLYBGGtVdv%Q;4(#cec{%#zRceiS14>#@s*_K zM16NRjVvL0kNMqQhvkvRZThyEkIw7vP@X)R6W6LFPM83?2=}SE-lGqJB#f0PhtwQg zH)eMn4yO5twcVYjmQM*XHC30x;@vx@(z8ge1_fEvgwqQPtW(NRURixY>n-I#B|O8g z_?n1l6N84bg8rD3lffPt8Ae;9G19ZP?nHbmXdC!P&!=2FT+T*%O!g{d=+rX@Dq8c; zD1Sy(JyX`UaYS#%1^?MZyYRSs!)O>9T0~+kx`B4s{qLl0{>we>KS_y*e*Kd6p`s%q fA|fF?B4VNmDtQqt#Sh8&e~2_xbd+-yEdu@zRa$Q5 literal 0 HcmV?d00001 diff --git a/node_modules/@cucumber/html-formatter/test/__screenshots__/global-hooks-afterall-error.png b/node_modules/@cucumber/html-formatter/test/__screenshots__/global-hooks-afterall-error.png new file mode 100644 index 0000000000000000000000000000000000000000..69989e6b5af10ff5c964dc1fe196d4000ad74fae GIT binary patch literal 49059 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

    tkc1T*mmc-50x7eiFs(srfAeALB+|&t0Dg zyvcYoQAE2FBrg^RMJT9zP7Qm0Gh|GSU-wfu80pB}_x4(z;3tPa%)PuKBw!`??kc;$ z7W${1?8 z^+Rij^s7%kBh8#huzgmK{xbDagV>%m#GkLa^Yt^5x8k7c`{M+~gEEixP=feyg~$!@ z8?_NpI$y$-_DyF>W-}y@nqikX6RhV)MAE&S;^Tqe0?qa1coqPGmnht6t-984ir8k1qk(d zlTjz=gjOUwe~KFyrAe||ZvU#_5EI-wO@5vZ#d8phaqV^2+mHQ#h>&VgF!yNv$n2wW zJQIvOY4GYbyO;xHHCz7o18=vN2QBBJ3c ztseD4$jvUBExUAb$+_?(3_Wj=38M36ND3-}z zwZR!9GCG8nnSxA98*|6ibT#wbZ+GQ9ky^7Rn-!rJ4_IB(eOeNW+_2UWS^Sf=hpC=2eW4})~IJPh-9Ko&rFM<9jZTWiQe6)+Eu4Xa4A37eH#PO?y?Ko6&2o0 zvS~t&Z{n0be=}&v&c{ET&krcaB-X{_gN&L?Sa84O^nDM%WzLJ2@=usO^bCf>@`r zdd})g6<>R_ohYAbFK?P>S9+KqQU$lSbEa%hFZTOAcZK+6iSQm5X0?L*F)EqCiz7m& z(^A@^q8@Wy5CebQyDdXa$7bN+2kNQVSgZ1wW99?-54YkjqtDIZTEZjo9};sS$Kn)> zr{1XQ&dZH0PwbBg zrY}Ta9dyO;;M3>YVzw~jTNvv@ktU<@W9O_|nrMn~Zod<=W3@}tRSb(bmHF@cHsL)q z_r(`+M}-{2oNTxd6kGW+^3$t@dY&cY0SRrWtyMM+>D^z1*2bSk_poyoevi)HlJmVn zI#pCw&!B|(RC)N)s+FhKRvLGtFv;vIn;VU4Ss~GgC2F_T@8fz+WyKlZDGPK}Nis>2 zL4&QyUx?usqkQfr zQp;4Plp;B0mr8TL-w)gW=#A+c`9Z;y@t37UFq7l5sfMsa?j)n%qNv83LH<&g#m}XD zBaS60XD4%GH)13d^7S+aONfL(ebY0P+?&2ljUOZ(0tjs!*`871{+8#>5y|GXmuQT} zYg>Dyhx-MGG!0uuuXODy$k z$hQiP?ae~r)%Mj^A4=AJPUUYD!Q8a3N0Vh|c9z+qSMvd9K4c>ohBTZ0o#CFkgGr=x79F z2aq2pXW-fNopRSne(mhBNQMl0tRFj|wh&c-Fp@6Vr!?8=YIM#K!Z^8U6U6z+1?GVAPP3O=t)My7sMi3*$wvZc3K$7{x{{#tP+Z*w%-HT+A~+ zZe&pKW6qv0`WY{=#@KCyb!_+?QJA8xnn#TApI4`P)4Tesj+Jkro~$(RE+RF}mHfT; z`{4?Dd);b`zLymur$Uy-|pkEQgkqY^t&C^7mKX_J^ucYb%0{I`)&cVBK= z-&Br_o1b%|#>rd)anG_|eWIhNLDc>1Or8*bgjjf|ZANV#MiH9>VATjHsV7yM#vkSD(_P zdiU}aW7JC6nhVp*@1-_gXPyuu{zB-r{gWQdB8d7NQDLz1-Px8dil@J%OG#=KJ+O|8 zc31eUa_VeZbc$P;%UPpqyFPKfo&?MJdM^h|KfsV+uP1QGYj8)rKGeb}YzOFXG%TiLuO{uoMXJ<``INiJ+fXt5eZT-gH zIYl=$U_m59G7Pu3D&_?^*)$iNORzZUVVt39igz5*V0lu2lQkt@-I5j6!W6_MYA*** zb5Eg8A7@#E$dJ^^e)#(+1FL6oepAD<5f?_s zYQha98}$+Tzm3ZW{Xe%HhgE}8SqQj~xH?y`P4;?GNQ)?+#KxDLb#z(BAYZb=VXjE> zK~ZT3PxN5HH2H9lppqq4c#+Ck|`(f7gpIA8CN+D91H>Y_-+xzWy`)P|7W z{75$Bih!N9m@c$OjRGo*t19DS*S$s9z>;qJ?prRiVlyVWV$CA?$X>m*C?N9yHj+Sl zRHyP096k3mlK&O$*bqnOm9-?atWY=HC$`16;FGqYXNu+loQbQL>0s)eLs(X9~|KazYzBz%x!D3{t zIiLB=weIV_m+e>~k0WAA{Hj;L9Z~o}sP_A?`!o+?MuN3EhS~m+T2B7CarW9y0PuSC>(>~S{n>Gr*{Du}o--ly$?G&_RXd~aM()^9 zyG3aZ!uO&);~I9voTi&i1cO$~dO{7TbYRlGHz_JXIo}Gl)$nzWQI}H0l9qZRV^-tM z4~^~3E<8vZ_21sA6Ozkgq=&JRyJz6FKSJR)!|&=hUXX1Y{YqMTM{Fli1lYh`*@4}( zq7X(B+M~abwu?ar*=x5|eUbn#J&)Vl8inF~(K%#9^5e+`qBYFjif%5C)4tmsU-xY@X0@@d)s+7Y)p>G+qPUS79BqMS}M zcgoq_yV7fu*hc*ipOY@1l_>+WoLV-(?p)P4#JRjUxffTv_U15`Aa8*465U6DqS@#b z4P{eoU5g3FG33yI<$}9iAs}g754YEq895?Z zFlh+2$m6*+9E_3fz7$M-91Rol+nMOk5yo5dszy-K8ftt*ljj$?R&w&gEg${EYQIQ{%0_pLq|}fxyjd#Iuh%n2x(m2Po0hJ7K6q` zpAz7IV0fX0I^=sxYJDR~F#Zcgab9`s;@Zt5hA;(ROi-71oO~`#mJ~Dh(N`dR{n)iu zYpk+{IuA{qhh00Q=)0B;fA8of zO*J`F#B|YM;3WiQ`&ut~eB-cet@rs#4SI{WINYqbhq^Y$J6pkPJkM=fQr&D9^CjA< zD&hy~QAwe%zuDO6T6m**8Q<*O<)ZM5BoBuVmqxZK4sK%VOW)6(FjkSamwC1_e$kHh zvZ3atV{jrrHKLsmD(g{do4yS>iafK$U}Nh8hh4pPSI=HGgs?i9Qj#(np~Tnd>$>!k z-7&?lx%0_7|MM(h7;3)hb+no^{qRYGJIEo-XaHUty}q7+&VT1i28%#}lHJT!C!JAuqk zkzgYPm4iZB@DKY6%Lq{?>bLr9e8~J0!8_#2PY}5Y@HweuwZiL9o;c;ZOHh5kEJ3zmaaxU#PlJ-#mZoYKo%&d~Do^opDER688{}0l)I8 z#_5hfPcUSwW2bL1IqQQI#L7Y6E!!DYEb<$IcQ`v9<4r`9dkU zvXC`_E+|=#%Ox!VwY`O%G9EG59tdW3NL#LCts-E|BS-aQ$Or5$3F~U>oAUTwY^$p> zCH<-2Na$-gQ_)KF^xP1{kGBdpAdjLA%su9`w%?Tx;ZPR%s?}ko6L_@&@3Fa?Ni{W4)%w9ASRkImfCkizWlqqyvKd6X`9n4^+_g}4@ySaPm^?-!SklWJcoznSG zIC7@zOn~=57dGU3q%ERwf1tl^`hP|>=O&6|j>Y;c?T%drUl-nJD=0!aqQQw+^S_5h zqc6dO1M0(Jj;k-^8E$s>Pa<8KX z?HJ;+wBTgt4lj39QaSE!D3Y9S;V+~A9C4Gc>;1&i{q};+157{lk*pU`YRX01hBMwU z-exYeV1<{@9i>`W_H*L9>{?8fcJ9R+LL$yNH^d$LKGvFyz$$n9Z++%ziQ^80YHzeMoI0|3qwSx{6 z-6?dJ;W3?G=^=hUazBvs#{KYB8`VFhy^5R`PnY(yEuG^;Cs@!fiIK2dhP)C;2^i^v zM5dcbI~RoUgsXg z0!qOlL_&g!jZgjJJH^>P^0;nE>5;%PlxbEClwG-x;TiIu)=7(@2sReRWc&=;fry(t>5pSbBH*%AP}A z5YT_6zSNlc_&$kALsuFZpPwDqYx{mG;BEa&m+cn`QZjIEHTYTE&<(%ZhtaeOb(60_ z>NliJ?rqmJo$|WIyzEf&?AEsOcC$A!M{jR*FwN^i?_kR{lCS>31ee&qczoPHe(qOA z>ZR7Z^Bql?L5KgW$ufQC*B`6;K!-{l){Ipby4-Kd^!93@Sr^zbjh=TwyAmUAwbB#Y z?hrjC<3?2*uDm{0;g+$vI!g3A7NgxA_1G1MnDA8EOhL2wx$TNtjf@y(#RX5Rs^s8P zW)%Sn!SBnPFzCsDh~rH11=c9-MfN9o_zBUL>p}%zvY{OnNyXS&%n3*G30ChLlKK>p z2W~F#MHE>n$VrO>waQw=57yj_ zyYMmia$9&Z4E9~=;uCI3e1qHkN*@Ceev??2KKNwiKm_l#uKruAQ;1i+*seTI+ng66 zI>p{K*pyd1R#vd#k4^XoS~qQcD*|R4eVL4^Gfj5#(${Z7p$Ss&rgP&4;5=EimOk

    jsa3sae4L1%Ive(to^sSaw(y_CN!2!Yjv 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 literal 0 HcmV?d00001 diff --git a/node_modules/@cucumber/html-formatter/test/__screenshots__/global-hooks-attachments.png b/node_modules/@cucumber/html-formatter/test/__screenshots__/global-hooks-attachments.png new file mode 100644 index 0000000000000000000000000000000000000000..4f26eb76c133b15ea988644c2fc3314051400d74 GIT binary patch literal 40114 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 k>i-IZqfbUE15O6C7m;L2$I8q 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

    lP(KMA@^JUUXHuYzS+Gac7f0p%@XC}7KzbV^ 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 literal 0 HcmV?d00001 diff --git a/node_modules/@cucumber/html-formatter/test/__screenshots__/global-hooks.png b/node_modules/@cucumber/html-formatter/test/__screenshots__/global-hooks.png new file mode 100644 index 0000000000000000000000000000000000000000..fe87a955e925f318df140c4521e8598a70edce65 GIT binary patch literal 77817 zcmeFZWmg?tur->5AOV8A1b26b;1Jy12~Kdg;0_^JaCZwHJh;2NySu|(dCqz7Z+OQY zw?8m|(R=Ui)wQZ-%{gm_%FBv>gvEh<^XAP*NeL0fH*X-{y?Fy+0|S1(`S6yJ^35Bh zHaS`e@`f0UM%!SU7Z)lU7t-@qSfbv2*iRC48CPv1LvhR)@N70)sOMiT^vQ;Op*A<4B|a_s@q4hs&#a43YmiF#MT*h5UEW z!Wc0k|95C0_2~caO9>;||K~hoK`j5!|IX|4V}wHe@4OgD19)23Btbkx;|!f7QKTmyL_~~}&M<#ai2mOh z8&=(j>xY=$Ps($(xa*^--6gaB?xyqU{FGi1xuS+&%h4$0J_MKg?NRX9uKi7Bvvdre zo12qP*+X=`zt~RWacOL7+O$z!Zghe}r#9x4m6spe8BSr)X}ntR47QrD zs{OXit&lAOUXi`kWMpe=JGX&uP%;xLml1CuXh1Xy!FPTd@><4J!A=4tCpTTEUkdNH zSMUJ=VFuUm>sNFvEXt5Q@w2nDKW>-g3#%qk8N6;6?;v4C!ZBo!Vv4ouzYV8yDe*fy zIdyNg`$O;c#R%KfbE;Oj!rFk3} zrFp$(-aY%$OkA6#XT}jea9NmVX)qf1Awfe2i-u!-Abt>(|DMd};q2<_nyVX6DCif8 zO3@RBE`=0hu2pB%E+;PDODr0;rha*Q+l$nK^>lNrmE_A}G87Va-XBZx{PZN7%Bhg| z1^wKCR=3%8B3JUxNHa?aQc&b7;}W0guCw*5&NsU`7_%_CdUz0UI~MA;xch}jJGi*? zjw1uvy{txRHKhm5e2)Q!bQm zc0GTOJno~QY-DR@W_H_ZVxli+DK1lzzxvtZiN#j@1lJm zo<`xL7}N~@9ZR1>>A#DNlR5Q<*zAfTBBrvMtUHrgl;QLEBYh!d7ojbHLEjPG+B8if z`O%Vwrlo-2`^oiqfz1WtZc*RJC?_Ilp#wzY>2gyd^VcsehX$YcJ^z@Frr(`!_D15W zVTTm2O_!)$lV=O4t*@(Fy!0I} z)+72{j`id4I9qW&EjPKCags~?`21vULcn-<}OBqH0=Rm>y%)% zw|94{NJ%{UQ+F^_)Hfa;p7T?*?anWvXivT$8t(l)-DH(0vU5H6D=jJX^5RidnB0cE=>jYNS)!`ZgJ}CzL4r z&`M>hn1S2UyQdNpx$#9PARw77zg+92V_qsZf(HJ@FNus%MB5IzZl;4MEW=q~<<|4& zpgm&;o5f`9#}zmxI!0{w#)y1;UZszuS^&ygCKl3WyE2&jUX8GGN6L80t2 zF7X#BE^sneGKU9&fA5okcf?gVBFB7Fz{zqHK2NrLDUW7@{q~sSe52FhZ-dS;gmzAq zVr7lr`fqVq1~g{oSaZZ8aRj`dYRo62@VNY3hGHqAnIW4+%e5O!ULlsT_b2iuy}~;J z;c^=M*yq6FLBnHxM}!s-5SWTA%XZdBLViZLgTu8>7uStZ8F>!LxPMJ^J#p@Vxfl0J6)EsQPEq4bDn`RDm^hIL{_vp3 z*OyxX-p@^V4fxnta1(#*jNscdO2DK1w%Ur1tog(eHx}emx4>JxK8q=>2Sf&bB+6fd~gDyou$Ne3vQAk^OK76YyLQ zTY*UIMZA8g5NoxFf$8@uNtl@D*8G=EaX)mlHAbRn#RTdJ}hBSRQ;Fwbk7o+<6Y~YJ8k%i^KCU+@}1u{ zqT~60?xN@OzjEST8$8K$A@G`w5n3LGv}KOp=KOM$SaP1dis*{Yn{Umr_<(yT5%DH5 zwfjM8Bdo+EU}Imj^NHABmSSSR*KnTe{Hg2?jdp?@Exsxgfh=-#C<@nbj$VNw$pcyQA}kw z>202QxOUiBcq2ivPjC&p^+Ld?`~A^RGAWSp1E84rt73$a28CkcMU@KOFD z;1sM63p1^-*V2Ovb0xWb-Q z6u})qbC>Obcz1|#hA91|0y%;l20;Rmm1Z}{XI5FNSZhtL630-Xowlv}%iZA=jtb3M z>M)|cGLYiAsaw1rZz3=5IHAUAW9yaqyq`FG+I4+(S+1NvgcZY7Aa?EI!iwKL!GHWH z>L}oR^b7CX6?`I#oXDaIu@-Y>Q_9@5OzOQBd?9f{2C5~4H}>0oNGgtN0fuD{EnY7Y z?+TJzQD$)i0vXhA!;b4oer zAK&N-^`}}BMu9dON##;dq1URTwdmvI4ZNA+n%eD+!VmX_DZgV0yN%!dCSewdHa(Ea zRn6EwJZ!x)lthV^Q;#e|-n_Nc;NTasr$@C4bJlh|jGKyRvz?R{UtbF~b0?nOteqAfG1|0eo~ZODg$u=ob^j^$-L! z0;}2B8{sj*aAc(TwA561y-#Rp0nP$17Y5@9pLj!l!o64=EWh@5c5ZHThhLx#fEsm3 z&qMqG3LaA+twt4=cld`!CuA%XvM&K`p6+3T!_J_4jyFyXALb4k4*Izmdn2wEdCDSJ6r=R!w zFN+jOOO#s!)-@dV>i*JG;3^6&2KCtK6v(E5&&O@4{rPamNpIYXq3LSx$vQPwqEezt zr<}*_bYSdQHyw=-FZ@QF3<1ycC37mm)QO?>Z^6uXj(AKwXU!iGVirr8iDl#5`O4#j??bIUE)xG3DcF^+{Q=PQJ2*? z>(jQG)E}vmy9|h5ni93UjN}w3Bm0tR{XP&wC5}?-K3EveWfrgUqT^9V37|1}imWIT zXT<(x7u>%aks9VT8ev+zaVCzA{XO}OM(fZ<6;gNaC@+a-$p2a3ak)uuW5se9Y0gXP z{d@BV$O%u6YJs8tb8+HIf6AZq6Q(Y&>LqFw35d3io2Q9Y-2gWGMd>_=Vl3D*AxK_3 zq{;HnpqVT1+9-d%q?vI}$j!br87~jW@9j!O=7$R7>J_a`H7u;7)?iBMi&sqbD(2cJ zEUNSJEl>Ev#D=Wtjga*#qO9$~Z%^eVr3?2{d6L!qP;#W%)QqL!EZy*@caWgb)5@$x@?$E4n9+v)1mGWqb>tgCWV3=Kaq5eJ)U+k9SE#>XpD z6PTG1Cbs%xb3|x~NnB2r2H^E!nGXiL{|^^n7S?AO9~$x^nvLS$dCG^jx_i+};SSJr zFk;mumbHko$3|~-v~5WZ)%ony^t4LF=YXJ70QF*s6ui27TPiAS!qBLMgoMVHMC6x# z8$cwNUBDYF{b(6S1hql_D-2FzUjjgXQ42}^Fw^;8+P_=WWn^TWAh8;p_X>Z2GF!^A zi`WqYH3MERYL=KHCp0=p)Yg_!6-J1Vy8q6SR2+-nlQRLw+VSeeaQ>X*gQ$H?TVNf2 z^j%~SKQ~;yY+6_z*p_KeQlV@?y6XV28xJR=AES4v`{Q(oF)-^&Lh3NJh>YTV zG?x|d-jTIbukDkMU?t38A_GTrUhk;CMx@Xx3$-$v#T3$&1K}N;^<;_oZren`bPep{ zvyFTKyUY^%$&%Na>qfx&>5>nxiCKl}@Kx+_42k$}1;Jww=Qei`nwXXtSx6 z;nx*?PePI&TyI)l*Rl^R&(vNHOpK0HbT8D|4HD{44hxqtD~7B1Oj25EVonHo&6*9} zca0r*i{;^Ev)xHAdco5Cq14SHz{uybbzxRK0DJwoKcss- zTop0i{px|aBkbAzGd80zPQ+(2g!NPkAOthYfxu*e+-%9gUc27AI73Id$0GGg!?@FM z*Yys_Tr;IS{c}0!GI~?GsSKxHL1Cp|L0i$=LQSuiyQ7gfYzOnzyII1)XB>#NBsI&> zh@Y0KzDm)ueGzkIv|eD<_$wHWee8-BHtrQJ2Co~)79_-~8-hIcUOeEh`(M3Px62)X z^B|6$njsrWe;iaUAQz1P5ie>0{|8Nk(D}#7r6v~!oI|q>{g`tKjQKa$_j=B^R9kOz zI=5XKe?6FB%E`$c;RazUjU(Efu1~t03ZT(vnmaZAX>9Y{ZuoYYuB)SkxW9_d$6v;S zIM?jerVB6T^{ENlFn1+)49@v-N2aqr#MZM}0d&#V>7pvCW)-cdJ%xDq2f=T=vqurU zXe55m)t*t~r93}c`psqv`pee{DsX`2jk226eB!-I73k@xGbHw=QaJ618(VA(i46=D zUE#9a)eS1d*l@|%JjV=}^jbYb`#0tx;V?on5Kq;`q&(|`7ar&LgRuL}_%QlWUoA$^ zAr-@s+1k=Z>Tk8!ctmy)R{JG|2J^rURauNV*I8Hi}E;jIvpr=jhiD=%Q|B(5MxzzSRoV z=#_Da@;(UoBtTnZ=2)7S%Y1}K{)ibW3El0tle`Y|_wh8uI*pCZnD+WfDH+v2CPQZU zDLSyNENFF`gvzT5))8<~tS=)Q=iYSNR9!4rH2w6{R7rJz_KwQ-*?xFJyyqX_TS?;S zSXN7}#pG!;Sx)z$_UmLl|Dz`wbDp8=a^>i#Ng;MJZbj($C$nN}4q`lKi9-$3=vCYH z3+>~fRCGjEqW6Y=G(#HaK5FO;O?N^`cFN5W>Qyn}Z5;!VyLp>wy^yK`UxCS~j<;?# z)o{RcAR^hd-C0tmeNRP;n;byuM3B84PUpj=(*b)#SbeVT^#vC(PRc8Q9g1WwIO*G% zN}>GQw<>0fNOzOlJ3B#Gv^8oc)+@~oI!(@1X^|NK>&NP;6W2geDu-@QWI2;=Rvt0- zDD8E{=ee?8Rg&KxFH$rmDVTvm!cAiA3&(dW0pp6PXDtAudEAF90a=yO@NKzqf3g6x zE$k^lRM_4``9uwSUa76mGqGaD-Z3PNr77RedA~T{r`V;QeVQgQhT?==8f$c1;guB5 z%?wx9B@BhwndQEgW|f6MQ<=?SM_QR&rWQvf>K{_e_ymgJ@j`7$=?1yv&-cM?yuxpT z84-xz>lo{E*`Sh3|F!CStdVp&n2OmI-IN#oC`0v9h^Kln34cj7OOap(2raX|FrO6h z1+3Jg3>NNHi&1CQ7oxde<_pL&{mS>V=4Byh%6d&+Tz0xj0@53VGrG)N%&_0TGMifj zRT_o(6?JF%SU448pS0$=H8e+XRp#WwyUs_1k15FYupTm4d42xl7qp&}1d3H)Y zXkf+0LOL!seyv&wsH4O|$xrgh+D}J%rJ<>Fd{9JqhE#6lmb%}7(8)h>3QpHqbq6hvzPE+74866zeJ|nDzb64ZZj0eK!|yJ5|Q+75i#F zu;CNu`0UjqWEJIj2*>sbiQ_gt0fx?3%&!^hSD-d=m9#=J6h#OH?-c#JPy(!WYcl(u zskTv*=ZEVUbA`W87YH9v07HpYJJ02?lc__QgRkl9zDrF4JFr8gS&3SEhBd9s%AxQo z=nFY465+p}X*11;lT{Z>tx|j%+6vpe57HC{y|&rTomqv;;mk)e8OPv5??~%>=_Ej+ zeLtu#D$#OkoBqt-qm|Z44QgNbVvp0I&Z@gucojg3md$Z@`)4fP_D-@fg^ z9Xy!UkH?(2ZSp*3|I*H!O9Zt$l2ogiR{=TKbW4Cqlj~Dq;$}8j0`1hFGjZlILd?UT zd~~PWzS{}foWKv%;=uz%gt)h4Qr<27R&aE~KUZ2xZk2uCC0k?&2j&yRol*BqTF*pA^{v+)F{TKTv$)=&vAxSxQUetN<#HMn}ZmR zK-D1&;sI0SojolDW669Tj~J;ANXHjggACE6+l2F0w&Cj*N;+y&rNqJPqBl7wiF6G+ zTc(s*4%vt(%9kC)Lbo-`cHJzVECP49f$P_=TwfgFc5a+IUM~}S^H|IWeyNy-R%x)h z_);h9I`H2x_?J(#c-&I!$nK4*eB%%9lsV0paaHBgJU7*;zX|`A3DDm`6dp|@mXa3y zQh7r!dM4Ilb@L9jwk3^&I1JouD%x`GP@)cu8=I8kuul7U!@M85GGD-8n=^>2aYI(#)3*;Sp9lhMubpDujbF)ly!>aH8WFF z0KvCONR5rn^KkyrP-s=ZQP{2K2yIL!YRr|~7F2-NF+TqN{vWwfs+wgTna}=kUD z&(jsOx6;C6&%=GO+U8TiAy8MRaG(;3qNL(71emr&y=GVBdCUnHAu(>3^MzM#@BRKp z+ikIB9KE)vp2gl%&;s*u*H3uF^VWPkl;W&G&W1O#&h2S)zqZ&NNgK~h<#8z=NILs3 zHophZzJzWEv5>U#;hj+hAeCr6PSC{kqkbmlEmbYkWCJ*i#dKt7x?_abVv3SX^HsTT z_aEhVB(rmNA2FR*uVajVmv@>tNOib%Z(nv))SI00kc^0}ehU{XMB=7cb6ihBM`k~! z9b-8aDxOTd-l1f8jy+uQcHvEkAEV*#f*Z%By_nan%NZyNo-}mSWmzS)tJf>1kQK>> z0ZF00b%*4zJX6-yX9xMo?d%5Rsf~o>SYIDsJk5cMyUEE`FOT_4SHKasNTC4cHrw&b z21DFBB%J#f6EuoP^9PdO9pg;C3#Uh$*=Fw?#6$9QAnqN1x^|Z)k3i=Ah+UwK%SS<*+#&RNBk%g8RNIYdi5*E zSGn3mrUrZLLx?UH?_Z`UId;!t?LW4HQB-X=@EJ}QMo0vP?tGXa3M~}E+5_PNGFmd3 zg_`9om^i=IytlKu8vQBsi0C78{XpXH@4rpQYD_13%B$YR%c_VR?*t8qXB56P$^t@z zjcQ%h=y9}8@n!>fvAmAqVHr;jG#{iEa=CP?kv_^5Vu%8%L+;)_`zPSYtFaktdZS8)X{*D7LZ8 zqy{vmUtA94?x>6&dwm@4ZS+|m-?&@Kox;~=3@FdC-Cz$j55Tz@oXK6RjkC1C`NLt} zx$pS#iZ`koJlm9XyiNb7g9zi|0um|wqV_&a&h7yQdw&{Nk2>8bOygvxS1Vp3J>hhJSn zqN%$xqxXF?^hf`+6CFdCKp@(y@4}H==|2iWYWGZ|B|b zw4lIZHOJ^l3Kqx9;vbpU3*!zyPFtjyHvkk$d5Z+oTFQKx6mo*8VimYy2p|mVA;(+# zm%)nJ;^uN@OuLILQWO_*yf0IC6uUW`m2)8^#$J%SxZq;-91oAED>^}^mEe(R*c(v} z${Yyu1!c0nx>^`ZwRQHrsAf(g#r84UO=DLcY9064%;I*DCQ>q-dp-hI(lepD7Y9JQwicX+70%i zPt=s|;eDN9GBF#7-_oB_i1vCS%rkgQG4AI^M(RGdR+w^YH+b_{?p)bza^kf92BId= zyrx@BaCu0b7l5ElBkU;mHQLq_?-69Vm{sDaxWaVb|2RKFpO>eQ(l0awWBGB3PJN%t zAFqWdo7bubQ-#6+w^tb5dATVrqb{N^hNuq|(DU`8rNirjpSM)XzQwinw*ARJJ!$2T zXX9A{cOH${b;kofLvHl4PjWy<7*OzwUmS=|r3!e?Or?@_6_~D;7g#a`*q;Z?LJymd zZb#_wzHq5K99Z@KOun><_i?(km>5Tu8^&Z7t)5m!MrVn#XhqQw^5y93vKpMsa>8`$ z{Wv_kXd+EZ%xYLacQtBSrsO${U*|wRyJURm(wCvqx4oXp-D7$b39zLd z#6WoQ#BCY&O#)Ofr$-(6K#t4Ne6^`evf0RvxL>!?ym{2SH|$6cW&+1ih*u>qm^Gp^b#!{J<| z5sg|oZ4P185_tXga4O^192drfc;oFMgDmRB&Xogtru#Lk+B)| z{}w9bjD_@O;L+wYe|5uU{1BeN?PL)jnrYyh`U-+eCWRdcZfz1V#23!0W(Gz(OBv_Jq)^E;<{L#_Y23(4b{D2_t(XbQflA!F@l{8#5-ny0?32#1T@MV zr$Al}K#OZPwANT-(rf=>F_qo6g1bJi3^r;Lm4QHJ0+tI*NBvO_PnYW);ccYPN+{4H zKvk-X-A&Z+L(KjhisyJNA$KZod(LCPNpTV`sy8kxJe{m2OrgQp(HV zDPSRcV%_xRct^bm)$Anf>ZXNJFBCr6Mkv`+o#lDgru+Lb@gRrZL_ra8)M5qKIXlvCX%XrMPqebP?PbKQf4v?qPZ8t2WpgX_bflN&D{WX_sH!%6 zdOO^37+=-Tg=`&W-g;EuZ9fd#b|yWU^?RdvhxCAVq3LZVp*HI>$E)F-1?-FK5A}NJ z(Jz< zoiRFBIo{J<5_h^P?2qe&`!zsV^P=)1?b;oKK^H&)BTy)+c$+k&TsSo=A8)+&Y51Lw z)R!AA^uq6NSA9rcb0q0%>VJu~eaDMxOEwF1Jed06L^@@lS^q7vFBn0S)NN{_-ext5 zoaX_75l5`&m*q@pyDjf0Cd2odp7)Eun@Txp26V zdm^y?`^(iU-<^i6tM6V+{m~Ql7KpsxG}2>!;H$Y3&V09&X{! zCd5xJ<~C1FU1PCZzxUJ} zC`RUPbF^8#_UJ#Y>VR!0&JmV*hCjHg>^i73+z^zx5jL!>LxG$OsXZ2e)J)$sQ9nB1Ca{(7ZJP1AP;~8@&lso}iu9Ve3~ezBWzS%7^S7I46B8{O1s! zta2CxWSv<{+2ANlsT#`ChRqu5_qT~tK#a+iDr}I)mQ+8`S+^9us{f3R%tLo0=Ej34 zx=>?ohxW@ysvs$nZQkipWq1~WC=H>A90xOG2?pyYxo^IMLFZRwobrYSR@FrNkIu8q z$<~qOVY&-VlD*+Y4Mf;Cs4O1hU#;7`b%*aLzvSG$<-;G;^5WvqJy4T$@O$GfmXJEG zTs)3H*;ciKW8$RlbiobRKRM|DTw|*aJZ8kiVLztf5CsZIO_t{*GugOpir`QT%2GMpT! zYBKfhG+>{E=@XZ|$nCdL1?Ph)D&;nXaW;2FR_ebJZG~@0o((@{mYLt>o8bw#U%||; z>}}`=W;#c5qgYr5nTF=zLg zU_uth+YBLhichG>X&@&fONmOx>ETw$HGClw z_rYogZRNGoPz*H@I>i$My0-a9@9DDTR^f0RSamPG)S&-3#X_m}{|rLFqv!W@2p`>h zyXv_rCw;ibqEvtQqcHpKa_w|D-~(z9JT^)oR)iw(^8_ovVhD5qWy5Brr$ops8|@uVY}Z0a9S_y-b+P!-TJNj|V09L`px=%LCc&}sl_InJ^+gLe%H_MCYGj(gP9JhJb6$p=SyKqHPI- ztjVj`8vAtw&%b_`EVlKvs~H3oF}z-jyUM*YwxeyXT*fEsa9~n;{Sj*t`oiLUSM>Xe zp_^|V(O2;dpeP*>02SsFxq_$7Tm?bM$O=!WF%e5>yRJT;ZLn6hnx zuq4y6$!buVIT(uWePt?LPFLLA+<-ZfPVy(Ibeo76)6;cI4%sVsD7W;Fl!zUGeGLeq6TuX`!sWF1KunzNgSfS#=QAvT977g9aQnaRY2;@q zrvFQg)TO$vci_7JI|lW`Uu7jXV2HC{S%C}Kd*(mucXHsrJO01XH*QGNni3v92wYH~ zcwNsPt`C9t(769+o?He$Xq|w8sIJar=zm=6*#aT|lZWj@;#}R_Ko4>S>?UFvGRdsw zz~>2ko#Y`Q-W(iquarJB&!4l_4P5veS`luZksdVEf6vV@{S*yPoaC>KR1s;(Gcefb zuRi0j=`N7#KM0$|=HBia3ebRu#4wNk^&)`a< z-h8P<+579SKM+}d)0al73G&+=%k=2WAkV#HVbm{Lb^kA%pGg&XcP&7TVur|BVlwCm z0P0acJUpN#22(grfzjby$xPN1E``Mup{nv<+hk{FhrIgFx!c&*2&v}ojCz_$xl@I?jG zccZUg$+D@1gW!Q0ujKvlBVzU0p>L!+<^z>>0Im-`>y%h+^bwbviz^9dcx0p;2sTy7Zs!}KfTpNWER@dz6owex2f%548_N^~_oEavr>>DQ zw*BrmX(zO z=S>y3O<;+dE>s{wU7JMZfeDF@^VohviRiM$YGo_xkp z@wVI3=BJ-uZBg33*URlixT%^eYPeYCz+YZndY#-4L-uGW=0;%huz%9_xuMOFF4Eic`pvH33 z?2D}g+?;J+J$Q}-Nh}4-PhckjBduT|joym(fr#5|2C?nn7Io zKuie1U?o6q*N8?(af>FPWv0GY>_p5sRxB;K+)i<_lJv(~i#_eo<)vH;k?AfnLocT& zHq5lYvDnmx>*=Wz8V(VENxpD2%S+Brq`(|4~7!aADY;B7niB@VUOZ>5-SLrjSO`Llo)uj*hIa z$7i&jd$Qb#(e9V|A*x{OPMv!wy;%xdKj8cKH?*9e2qSZH zquoMKDP%XgdT^_-?g71p_0cAvq3WezJJ{)Ny%U;(f`XQR#sZM%@dapw>`jf0Hz&)u zEdJ+A_*U~kOEluvX>?5D^SA+Y3)0THy)*%fKbK%HG=_F7-s3dzmi_i8k|LE$*T$wd zIA^jOdNcFS zb+2JOo{0&EHnEZ3i&K6=S%*dpPpl}D!mJ;N6Fe;%qEak9os_d#Ti4$yhE z;7`))&{@jUN>zW*J5?sLX*GyUUK5lsGh0O;bf?v6Hd;f94?Svf|2h$6ZH^*77W(;L zMV3=GWVA=lM*GCc!&8FEu29j*DfGD9(Z^D(G>w)N6TGThVA8ocU5!?bE{L)O{yP}1)u(!`R!=Szl24@?)ldS!q!jT2LplMvDWXpl zU*cfGL#O>91u?&mt&HKGwN@H-cfbM4P93BpV-vU8Z>5yEN+OehO~-A;B;Eru56}^# z>;Euvj|3Zb8;Ko$kXy`FE1mtq`o0aS<~A`s<{BDOpD*B8P^8Or;t-z)Jnk98cCLrVV3 z*BVwgX6QSgGoMXV3Omoll;~Jf+1P?FOaY@fEp47iEp~3`XD9xiR+uE3y^#KRsNJ!h z{sPdD&`|xHI+-R#R(Y2nF6ZVJX0XTHg@$!qb{TLA;r7M=_vU~@JyBHEqRf9 zSDl%T81%}8Z%LLFtFT{^1>5MJs^r{E&Q>5U{aN{~Zg);Hw=frBF;Tkp!#CJwr7(`7 z;@`W7+pKW5cI)lUHgDr~I~V|1zQ-d<28Btheg?WC*WX|UhxO4|W}*;az`?Bq20eaU zT-@t^;+j-`FZY+H`>!Cti7?+PR!l{RMDD2oSAtsHgFPIi7NG;y4v?90oejYhiY zg~%J>qoJQ<;a1heBUuRAjgID9CBSz}{H+!c%DX;yIFqL9hwb^-pH$lzvw5<0e6AqNWf2qsu!N8PzOSGh>> zSH1oAfDDjr4u{R=FcxYW47*`VUqP@Fw`Vhkn;U8k(tn^O#JC4DO8}Jhr0c7T3i!P6 z9@O`Zs?UMSOL8y^l&MZrU?xfGvJW&j$dgIu#ZE&G8F+rYO|0m47d90HE)PbVs?;XX z^#czsCcx2II8CS)J1}#7_l0Mpsa&X!SrP3pe>uJ_eSXH~L;iL5&xUF;wwh&6;gC(q z7#|Shs{kE!c7(;!g80nZY2?C6)AS;FIHy_UWxv92-%n(qon&>2*AzjSQfAybOoGv{ z>XXi#veOZa_Z99NZuQmq{bEx1uJb?)zvKb~0c}$F&Vqo)W?bVl>@-~pxeIy0(LPdc ze1GGTD;iz?PV-N!%A;+^tF8!C9;x%CliT#9u=W{tcAwK<7|T;0%sV#~=*hf_r)4oyRI zK=2D&e#}vd?T- z`0s_ZIC|uA?YQtRNz^zGF6RcS>Pn&C;(DR}QrV6(DMczZ9*Q1IM~FOu&^YXwIzxk9 zu&)6mf`LFx3&byecFL--ahn?Q2U&@ZJt<(uZ!MrSU1K>t6?lFcKHk`MKe>f_o@27h z6LGeSXf>XHC8s-J{bs-1DxP@qxm)GaLP$H;Af`}1htWD-;p705<+bIwtw^ujsetZ+ zx2Ni4I~-3$yAgbJ2C>~}txV(dac|vD#e4c0FO7r-}ARQU|xBXn_d%um?-xOj9xPQ2+EL-uT z82-P<2r@d#LX&zHT4-MkwF>pue+VT>f4c&RavYaI(jm2d?1ee4GeUiWZm1uW(#<10 z195VA3)Fg% z-A3F>y{*doxdifl#`fDLn0Wa~Wr9+K7|IIV!M_}y!ZazlVdN*!c9<@Y;i(c~N#0XK zAQ!}Be_b2;pD{HsRjS?WY8NLN=q8^ghOd$@^C9J5V_Voo4H5HRy5$M*WL3NGeDP>h zb-5yj0d9hu$MqWyK#oIz(}7tjEH*ec_%udCRG*Vd?oI48*c2zV$1gu3^0@*!!4XX0 z%+3F%(BDp(hZaPG3`*mqrsx(itDWutd$wlKkNY(ui%SCWPN&ViZCCdHZ~@3?&AGzt zPb}9ztE?^N=jMCD4u6p9z*<@(CLg9zWVI7vvJL+|))!=^OHVpLvuRUt2u-6b#X&OK(H@@a0)B5`lVvxgU|wai8p z`5iCCj)ejPvAI>s4PC8&r-NQe%6JeADTB#sjP87`lcffbPg^W!>9d|OGJGMRvlGJa zg3*F0L$JtC$?38<8^G*sONpn9Ak0uES}zTB*;OP z-T`hyK0JI?o@Mp2TN zlkH!a#?M|+pL}Z5EVavHbz^O@DRMB?oVPqUEcjMe$G*#sU(S+Qiw98rT>~|mb5lWs z;_Y47viYU4Y>JwL1GMJ>hPk}KYiT5KcN%p&Fq)=&>3Q%q*;iQH_G~0pe^X|#>R$NW zO=HDfk6FjQ?tu{EdR}@s%j5(5LLkt3=FXF^0e5eyLvTuB(z^!Ja&^Q1y0^aSbok#E z_7`pO8wVO%ZVq6M`nnFw^LXARs}_o7Ye)2gR4V$@d^|g_sEBBTxHI#BaPK!NG61nBK;~r!PHp>oZC6Gd6NS!dZC}P@M0UOJlkJI7KW4H1Cfp#QAAlllu z9M%A;OKnTtEv6dJue)6?53RH{0Su1^4nG4m9FQOSWwIIk_>0JS_N2R1O8JCPB*WCJ zgn7{MKG@&ll~xt@dWHsj)%*K)Vg3S)BRFup)KGn*0X1KoAWJZBY!0Gk= zb1z*EW==;cv!&+wpvKoh!)LY0-ztZ~m~@zxh8vfQ`A!bVd?=>51PxBr%5_JgEI#)k zQRsYPllw|T0t}knP2a!2Em50c(4-YVm;zr{5b~n05Zx{h@H!yc2K>tGAsM=&@Nv)4 z-OwTb%|n)H)gwRvEk4?K8q6f*#0sHf#tSPug2!9tQKI6eTFtwOLv;)M(-#TK7xQ3p z2aL*rfwhn5=2HR4<#F&4C^fvXGkYFHNCTGcWJ3bf{eZ<9Z_%jXk`EWV5gLV=yDc8-e! zsrC7Csl7@4w{cFZWAgL;Se0Q5;;&of-#I-m#Ri$b#_KucNrD2r-nGo*p5vs;spqzo zX;%4(&0<6F#k(cmS8}6=kHdiZQz^F{-fO_k(V@lt#chSs=v7L1FN0pxQq5aL-Ny&d zyQhZvt0Gt4T)~_pZcGfI2aJ#2=rCcSkW0_C`S`q--5%1KI%GEP%S=@P3D8M|;T~V$ zpQ~jD5QCBHj$=j1q*xs$9w#xPf5tB+%+oH1zbK=Y53FHB42dzdyt~A7EXCKdr1s`6gIQCMFRxm)4?Vec)Y zvfQG#-)#}n-5{V6f^?TO64Kp`q;!LVgrpz{(xG&BBaH|G(jXupA>EC<^V#tq=fnAM zKArKN@t)_KjJ=iTzSo*-t~sykH&J}A{|Mpo7W`l@%_5E>2;Jwk!2Jq3kRNcAXN!gB zDxFBNe1@YVVs42Mx;>yp5xc%KE;wFr8T=6<2?@m%_IoskurUGCZgg7;Pddv?W`^uS zu^lG!e$@7LF!z}2YkoU}YbHWMG$oEC^%9KOWj=(}?nFdHwhYM3n@C#MS_G5xWjK3; z^uF2AKf!q9k(sY+jOUxHg`-bFdZ)|867?zWI_YT*R7M!HyA)$Q7UQ|RZYd9MRoK>T zzrD#Nw?IYNsSum79G6Bd+LktG`0#6-?1{;1nxn5v^STog$5G`bJr_#ag?v;+8()GXpGMPXO$d_T3<7PH3u`7+VXlpe%Q-_ars;vnqsra03 zKh-)b(bq?L3n`uuyiuqU#eE@URLg_*^}goE7TA!WTzU?Iy;A}llxp*{78yiwqXR7j zYoh87P6;tJX2HR=>2aZIZ*WaO7A4cDXevdwDt>7|@xX4M0^X42- z1>om7KB^^WWqP5WA=SS$|FlDxFaIc$7#hIm^b2&-cM6t!--ZSu%od+q<3`FK?lDT} z9b#s9MVS1CN?Vu6yhzc-W0?X_QR}q$oYgrd1>dXS$;oHR;2Yv&H~Rb+{uj7fXP`@H zu&8`Q$*SH?Or)~Cd1#MfH-CG5(1WE3yE5!Bs)4hHwuYgGHWr~J&Rw-+7Tg^X>)(cw z2YkD7rzk3sC<^&!B;Kj{-%zr4UY9gL&}^))e?wIeC+=oE9$z10K{oJBjf7j-+SwuP zB)6RL^Q{yJ)LFgjz;;rNmC+Q<{_E^^m%&*bbQxqMa=In#NX+H$>)w{krp?$S!Nz`j z|0!-qu9A)fDQBfULzO#6cds&izh5-C8NEC`sl%kVeAx!qWS{V>%Wj8;LKy74t-h`I ziH?_-_(+#ZRG(O=z)V2Tv=My9&_i3Exbu~IeetHe>sullWt!RPGIJQ1&=59x_QoT8 z&{GtNw423ZJ%6{O=k=Y+0yP6@n+!(>TP#H9BPC}8cHorZU0HtPZ8>_Q9F6AIP(kYP zHPxKhN{0D&ds$5H--j}Gcy^!15#370dc~(Mk&x9jjyr#2CsszzoLs`N!`q$2Z&q1J z3H!UBkx@p)`tBpK(o?r=x^Y|y5faQu$QhrJQxeEXpM-N*D?Y3gk2 z{^PqwC(6G#Q*d0J=`XsvG0!ZQV(6F!kut{o+!Y8(z9NQ(hOqPDIw@g@{{crtt>yZI z%tW*h1HbjQuT$goZ)8K|ONWHnIfmrsFYmP5(}jr!X-@`LuSvi)@W!Qe;ZZ)~$UgA< z{d8Djo+a)5y>s_I>-2r~x6y`c(xN(!cBba#nis;(g)YzA=UWJNL{Q|GuysE!Bw)d} zykbI7y;?)7%NSP^55Cb&Oo+BnwF{%65zai6VsG@|+fp@6&5N|Ovs16j@YrX%EKc~8 zLSg6N5YHO}J^y6ynYb&J*OgL zrxNjlHsbQXOpvK2#JNW`A4{mO5`){BCSp!l1St>ttG4K&f5kA+b zN!Ey-?rtTVFS1C%0MWYK@xMMeJVZxBtE~Csgj!x&x&!&Dkf5LwoIOwmge|`D?CZe5 z7KCU60|PiKdQ$~z!2_{B3PwnB3JORDcDA;f{jdK(`#FwYnMS9|%F7un;;E1toL^kf zJxd`TQB38pCf{CKI#?T~?T;-kMwrlV-n{vC5a=jjXAD|p8Qb{Z(uBg<_Qr|%pmE|g zat&V|C?o*&W4i_x5PQmvf0o?2!${{(a1W!}-DcLQ%G-7hZEI*1_SnsUbiDWT{sc&L zwkOMJ;Q=ShzH9og7O+17zibpK*WEVaDOWgGJ<7oU3uLk{mKVV6fi^azSkc66H>nB5 zV;?Fsz!Qe!^ec{1O!rs#)d^S(1Uo0-<$>y`6zcn)1cSi2Y6f2o5sSg*Wcd=Jg8ZI2 zoVe-5LObMQ(5hB_b_1st1Pk!(W!^o+_li}TMrGGpU3pMxl$=@Yg&4SyNb{-_m6qln1Ke}J6}oD74&@ep@8I%9AR7-<=Gfz+emXulq z{4SnH>*~KO`;ko6U*5RovMM@W`$WOubRxRz$Kg(AeT><^s+k0&vpS~+9DuUx~0?L(;igG*5`2b}{ zb^$PWsi~G{*Gy(OnnLAejqH5 z$l!&#KO|uUkM&NWh}m2INj6?=Of%}m$+o_?xA!mk<#^&PXonEffj|Ug3NpD3M7Ne4 z;T{f&bQZcOJwipkZvz#ppyMpV0eLOmi9$^*yiQa3fw3_Hu9=}BrON_cMf=GzW9Vc; zWu&`j5I8^d;@I(D;~$0KNA{KZxL->2f-?RiIkjnb1Tocb{eL1vOxLN7MkH)!A!b1- zYIi81!7oe>po#C#8(e<>`0)c@D80o`Ck1Gn$E2_DU)QpUbV5b0u?WFbkN^$NUKad1rxry#+xN~|wV#)p`RDzS~TG&{TMh=_q zYy-m2_4!6A1k1X*x{SJJXkC0~Bef|zxdQY{Uq5a;~;`DzpyrwcC~a607tE;2jy;C@}S z1W(UyC8$GB-|Xk_Z$co4ul9z~G2k|8-+N|na1U5oS}spP^9JIE5A6DO^onmOOxo<` zp^yv1f(@DiH|^_m$a#Uu^-jF0xf!8)n6401B@J4(9xM1VWBwEZSM><)|HO)k^DOl6 zc9sAWfJ`MYX*(@;qIS+g2@q@mi&_lm#5)1*l97T&9zo93BgjV`VgtTY9XdqIexWqE_C=WNM@bG$^{#DIY5GQT8 zns$W+Rct|*ROw|ZuVa=Ejo0BCL^*pftzV9HcO$V?!`=n!#9b_`o=W&mWP%=LKHN~G zh9!`~YAgn~OoW}-5|+Lo1hQpxYghV7Kr*4X9r<5hQ27m{3h)?&pGJ;C8H>y~4VK>7 z#RcsvhxrzLs~w5RqLLJxSRU+P$s1R^Ek7ic3O$M zhn`fpq@XDL`|~H&kZejP;ZgTTb$pzf;A@ClA>*c>A}`(F;Uw#t@%kh^CAJf%_59=7(2&)L z};3+#96rJUZw5ttYAe7UYGWPtxu=V-+ms;UZOJT$VufYcrTa2`f6@B`bK)q_K#@E z(^{t9!KKCZ7T<|B3bOaM2DSGzzZHQ;Ym1N5^qb1R{|*gNU~<*D;Q*3dQ=ZOs;*Ct5O@-Nbldm1UdWsUBud8foM>%Qwz_&zd@ni%iS zAYf-)Hn_}whhfaM_({v3$+Df z<8P1cnP*OPs$GJOKVcddx%RZ!Z01!zw4q z&*K5I5ohXWDJ`r{n}>( z+<)SGk~#BL<{F$^MN_RikdCU#%ZGiLRYDRHYE|wUw0Irtk0q<*$gFH`l9Cd-ZBIr) z&hfi>wxC*Sl%c7gi@3st1?%#IUG1wuaxW+HbR<5%mf7?t{7am{L2RG-`Qe(CjZHSsl&U35B&CS+Q~<+s zm0Zs1Ef>4Vrb@LpG)~Ck?j50QBi~Y5V`)6UheW3l_NA}>Ea4Kvi=R)f4{K`jopIX^ zVP|irJbo3mmGpH%#EsxX(hUyH;UdqkLkATe+xNXMh|v;C^y^#z#rAtBAD@s?*!_Hs ze5!ISQp9#NPT+(J^tVXfw&U_7tYlb}LKK1~-+Q8O05$jG@@yp0_-dJ(-BqbbtMcr_ zS2Wv^u1DjVjGEuSFi6JhFkes9t4CTB{L(f0w4k*%l=EBHVW%RV%t1$}RIZfTt;VhA z*n#!P;GaN#HzvI8z#_tKxP&fX+i=UPSchHc>7qoRYVT*}nIkd5Ct1lt=5Y%)N3q4T zY0V34TU;kW-Kss$CbwowFN)$rLi%jw)53p-xL$=$9*KhsDxGUPb2MSGIS2fQo35i%#j4pz^WGJ%f`jeWC>Lc33 zymQtLzjRcZe>>f;mWC*o%;)g@+91_+o#h<_8kDz>~rWgSDhnYkOa=ZIwk|x58((fx!9uCxsyE7uoOikE!?# zYBdOE_Z)sS@R+ZNNhB1+_bpCP(>|=-n08prF?YI4#=VooZ@jj4Suf&)ZZ%Xi^6@!Z zFxL8;H7=X&{kE%XI$DgdxuYaEe)m7t_3T}*3kGIRBFVp#z1j-8DAd82j$<;&Q+g%X ztK1=_Sg6$^F;AH~L|f*(lQ~Xtu{qhqsowXiaNI%2@%%C>QjYaH@x~^>Qf_}2`r0$R za{tq{{P2}$5=a_TZhfbDQ})vpmdmlf_chJL5{R~u-Add-DK`4+<@CKUJ@?u{@Ef;M zM02(YuX#nDD$U$2ni#%9tEqJbIz>aRdb5YeQk$;ML?xYR z9~eye)uQR-Kk#_}>FYXpxIWOGhy$$Z`S9XampQXbQexs!|J_OJ_^+;8r$m0f`=j+E z*GMG>!W`!NW;vK)^&H)ck=sAKtE|4=HV!5^c&|V%bk8tNk8$S#q!y)NhJOFm0-!{Q zLF2B%c~{RSVL)ui)&Gn%lW15Ib7J5#vFM3}f@EEFn|ILbM88LmMik$?j83U0`OH=CaXq-#C|)<*N3X!p&P_EGd2ik0;&ePugEC*7L+67Di=o%+ zYv*>i7_qarulDXqR($m5awv1ZF5h+7v1xW1$XS#`qyOC?+r{p_Ei8eJJMHYAF6el? zKmKEq!Mmnk`lNW`>*o_n;WnKD0Ht?g#%ykY8l3v4SG4p(b${*Vj{xKS}_e9Y+A z9I8>r`}KmU<+57sP5YgL)$YK_a+8|p!@Hj|mry)V3VX0@)%v{N;63P1rA2H17%J29 zV+vQRol0P$i%+<1)dQGayM${EbcfRVUQ%eG&$B8UF@Dvi542acFLKIVItHYAG zOK2}_%CrmB7%RQ6aRmRA7s{9;(dbF)x^3##TO73W;VtrZzu!O>88oO1YsUQaT*AHs z-4>;pZfD+qbMja&Q@}L1>Pzecz87mBL)S7`sTjMpx{2Ac3Y&-!HHYC=v5&2pnh%Xf zUz_6^RN6j-dde&6euhs2SEVPF82Q??MLyayzR0hu6=cR_+g`nDxU(>%_Kfj>waj4x zbz~);-jKz$Aa1JCqDa5e>6K6YFIDejie{gq;F+%z(cp|Z*}fH=@$uoHOC*&@33(57 z%}UCa$6m`NAis+s*U!i>A|Y73<{(c|xi4)5(uXnqydK5W9U+gD>?e0-wVk}r7!A|N zDQ38K1YWpwkq)G$#9GQEG}z{wxLRvyl-vk5e>6@T&#>B=wHTuFVEuV7uGXuGlG#6v z4w}tDuCCr6)9B@dCIYyE5OCpK|jed2Lfc*1iP0qSddMdK7&x~JUsX^EHv5)%{5_t` z&+iY^lla^h`YukWoL2iyRv7#8DH0jGAek8NCz)`VW}uR;3zJezd_bjEtR{8Lm8c_` zV{y-B1wBV2<_9Vk1)uBsW>?1Ndz*#qg{F#DV_9uYl8=a3bd#xlb!?ZVjtT_$K4BM> zp&3gLsD7;2{*3^BI|AusTu?{27TviiR6PopOhX1~RwA+JzBxjpk48=w3~ zgJg$aGe1cSx9K@&V=a^Pmy^joj@8F{6x?2nH^nc;6_zVYSPbSGugxy=N_lRH7xP+v zD}or^|DNkzNKZ17YvH3+i$?*0fjIW@hIU28FRZ-xp$M>a*=|r z+h9_y?RG@DlM$SXjc&HCr<2crT`SBSZ%(^=?9{|h7PVJp{Cu0jS7EEgH?f;9LxJD$ z=r0QK2F0#WLZSA56Hm?1MWTlfo+TO$#C}Ms%;w@j^9n~UBqFPS{=Q@gx2xT*C1-n$ zwr6^4>Jin<_B5Vp{{$L-huxM~H~|+I1r=3mq^=vaVH~}N)r;%vt;s6R^pN! zUSk4P&vojI<{%szOr+(JYnSl54|L&UH<-OpF@q%Q1gSohKe=XG^sX3=alv-kT5 zp@y2-IxmBxf@KzKOL?6dYtye5N3LHB;0(UJWZ3O|r2r|UV3WK4$>U;-Rb(!MSr&I8 z*A?9L_fr) zC1L(rnqulTOeFexv-4N)Ue9}Z&)50#IOn*8R)=0SSURQ)`cf9k@qMXRKS1(G`2OH- z?$f0zlL3p&hOO7fHhw&|(^Dl19JB6JLdF*HVdhvn1_IVr>82MvaV)xe5>5p5b#=b_ zl8PziydFm17-Kh(uYWNNFv<@+d0l8Vx+}~O`@rr()3iTY4@)tvo}AZ(MnnFhf$NbX zxzLM_K2NRZSd_xb>93eRj5M~q=ux2;$D|Nq-nlMvQbKsB1UGGVBZ)-575bNa!9qDb zJpABnHXn|-#jhDsug{Y)*|gK&r2X>ql`MtUUB$QeK6(*wJY*8H)<9DmBN)A+CE>t0yMURIZ)* zAIY|9mdt)n)=^UGgxIpe~&qVKw<0i|W?p z)x1Jd%{|A(*YsJ7`3AEBwv!bbhxKw|&OE;#CD&|ijkbW61IX8X$U+TO+ST@t#)JE6 z0wLqiQCN!8CsTFRP#%ICJ0`jC!t%23b(?ASyzR$|FeTqv_qDp#)|Hy?6Ap8;^{Yl3 z?<4(B8C5>qI8u+3nQ_MFu_wR3@SKBasXTWz`Hy&au|cas)V-5WRnz2tySq>Eod&Jw zKINL!t3;JkD5<=+MAmEZa_;SYD(21A(kB{2tGfc>kA8kvEnD^sFPEj|h5ylhbDXUeI=SoCqH0dt8x7CW5%V|pA^V+T8jEmdeILo zqPBQE^y&*DRde0E4o{zNk;cmM1cHfz-yx#4r*1ebeKrzW|aZ(zuB8pZ%A{c-RDCM9iV*#d9cd=%urncjh^Acpp(cx3ttP_sN%Zrt5Q%Ok%Y# zn!jOcJ!%uVe=qEb+s2$Tv52W%* z&1K6u$;R03{dkI(J5XrQdQ_;H_8^>qd@?uOhf#;KkxR~UK)=dq{Bl__jSnuawEw2JHW9QJu*ms zWLble>_#ErN*OI4AWkXbnZ~WaI2#@^rm5WK;|Uo*o7bYe3)|^gYch|i{JBfM-`|UX zLsL0C=V;t+`pusNYxTaPjVV-G({6GK(^jwL;Z}Dd&$K)H>$Bci^UWOW?;OcZS+rR_ ze-5G6qiMc>Dww4QvK78Nsb##m~W)QyP^K3az?W-i;vgg48MFJIsa}Z`NjA!vQqjlg zb$lt=Q1#5q`A>&tOg>5ICZkyOWqsjH4;Iz%yDUHTGDI!gbKAs6rC>Au-Z9VQR zD>HlA9(y0-k;Z){J5pylQ_E!TNW4G4F{IPJ>~CH9Wj}llCBvw9Y~nf{uTXSQki4dh z#*zk(tTo3PyNQR_oQ;0YT}i9t$UhvsEmc2wHMT($v`^wI&=I8mQRe;Vi+gjAqf8&} zEhRP_lZ6+#Kdj{MunSQycNq&dn4SI|`6ezX-Dcd*VeZ%01WIa4B%jNV-dN1~jD<3U zuZ}Kv)y=GtXd1&dw@f9heIx^J@1Y|XkmL7G);n2@QJDA@ah?BjwfAo^qztSEPy)uY zbd5_-c1xLL&gb{PWpGQ&$mAtoY_QSltYg&H)TD8Fb~betlGUC%-DGA*{a(@3GLa?d z?k1Pc?MfY3`J&R|8>_WeIzb^1i(&IqOwk)>{`xw}>kR+2WWt76ME-N%uO+BH3tPF; z|EEj!zsGDg-Anff5`}+z{a5a1t=IRd%1HkYo)6cl;Zv)cptoAmV0)O)#j)NU`sdc% zV)QaFv~%QZ1wd;p;BPMRHx!@=M_i<(9Z^e z!{6-n-+9#*1El|Uhx}^{9lM>hv`+KoN}^MnDNLmY6KJ(_s!)rH4yAdWm%CJn(%%l1 z{d!6+ODIn;q3rCn)nREM?3aEsP<;2`l8c9oY@^*%j^|}|v_w70?LAkKAxk=7pAx}q_3t|#oUFnioDoRQ?rDvg;_j5KJ zpTWfAX5~3~)(->~p#QJFpMWzT)xWjkaj=465cS;!WQU+}F#A-C{O@~Z6cIx5_VV3i zci9;eC}q!;TU*BaxlE?iXtGkDUBEz_(zwp;GQF2uBK%vWE1aZbdwYpT`}>0*oVB8t zb;qiN=^{QWB;EBc2j)xLx)dgojs72#YaRZg#M;)VkUO~9C-LyH;6?w~>gM|zkBAd% z9;1_LA&Qx+X0rNPz4EHiw#>|hjvOk($|Y_S?i>#5@qG0Br5(K=_oKvJ_=1iEc9^u> z31~}`tS?EY5&CWDcY;KLgxze&`|hWo&={wgCGlMV+XE0|-b~~?eb+rQg6CNQJ$A%W zr0AKQZH5*+fafH>q2Il`K9t!3!h?8AWy>@^=bYA7Fhozmd^uL9Vx4LLND}7X7xcS4 zh35EunYW+2y6z~u0j>%J+8oZ9=_3A7=ABK{=`b{lSRAy5DmAv+*$())xZg|k1)9tN z>;dXv;9vn-V-fn+dpW&x2(~V+0k|3AXSe@d)+Zx7__LOqnYvhl?ksj*W(r@)F8J*d z^{;>C=Z?JBdpqcdj)}v(FApXXSZ+d<>gO8KdzHa&Kd_*+P!n|M{^Q2kjZH;$&?sytY!b34KW<%CW-!PZV3xC083i#%rjljVX|}FtK>t z1M=b)E#doMq>J%N2-Z|{&E>L!90?v*rk)STZ~(0X?Q$;=A%N9?oB}!19klPEIrLv> z3~0tWQBLT@?d zBR+{JNhY}MoI^xn3rUpub9u&wl$PnQg%@$6yy0&xHm73q?#(Pm-rIY7E4HdU=@+h#s66NANr2OTzO>2T0&$*v(DE zlmVVJepkkVoIWcIQqH%u89E5EMMO@gnzXdEni4pe$pvaG2(-1esRO2GW@zh@M94rh z)F#lEVE{@O(0Y*zdJOgRN!*vZLDEKW5NrsRgYaB2adA+9*qutHwfeWz=B*@-1RK|=e*CKjI$}Dx_eG%3 z&AaMrR0NA_IS8^rKnHS1P`g2NlU65uehFfbc3Xl+8WJfQehLYX;h-t~;2i2y6&NTE z11jQhQc_YXz*qjg+&&h8grQM}n5K)`?DXgA>I#NLo^68F@1x7_@37|n9We{bqLI7K z>GxrFwE&!6u|@)|dlrTL#v@jj|WqO*+ zGp$SId{9$#3qj>2Q2{Gekv134yccLVK%^1TB5Uvz+&i+fulCnXnhKOM#hgOtf+{NF z))y9Hz&|252_iDU6M$v`rZC1i#?mQ1?hpQ1aA5<&!T24XuoswYH|OMb_{}0-0AsyB zb6>1~0XR4~j_~rQAXb?7Qwn)y+>0pF2eAt{hT&!Mfgl)zj9Wg5Gyk7d?0ng8o4Fz& zfKz*8JF}!OHSbW+`N(e4PL5L``IWw`*?TFBkL z%F=|W2|~7hPf%0Vf;6br&zFxphOCta6?kyHQ&S|>=5Yh=)|tIbe@hcW{fg7Q!oU z6H1UK0m=xSj2r!TEl8ZSK7&;8AK5^b;r43xPpPrWrPYdo30LH(RPP40C4zKeo5zoi zJPMyyetG9pd^fFe-R)0O^7d)DspP>vs*;}qF-wkkk=1^I>GScv@bw8?P5QLQ1}Vga zwexo|u5?_4ytX~RF`~u&u4_8%xDfVOH@BwgO^5w2ibTn2rSxKV;-FSYNC@7X)w()> z&)Nqepnl!YA2KkFD0mK0)pbx@idT(t9^x^aao~|s&xz(QF2a%nPC{G)#x*w1H)C)& z1|5^d#wCyodEu99=by;-q0Y(FCtAuYS+#E0!T!=RZ7}U?wEN1)`R{pk>}>i1HjmUH zQ}fp6z^7<~&HFyrqhpr4ai-zphBkUaA-?DXXOof#HYM6u-t94uY7MDz2lahDcSlVX zY*tXv(0WApVh;0{7N$BZ(=zQZ&m$jlCosgWoX<|o2JeWxSbv^g9pjT`w6+ab< zGwZf@n&jYnbNX=pY_~ok!Qpd-0uMjt^gGC^nxQ@dwtpXqsMnDggZ9>Z)J zYHTcQU!bg(gTf1xht%0gcU|eqdp4rCGNCM}A3r0+;DecU+M$33Yh6WnnHL1NFoCR`FQQdZ~17hfX z-TP)trvSu--47}_%WS+(RS(qelcOWo7cZWqfP9r>dLv$l9pS42sGG#VoEch>K+hsK3+%DCA0Z86R*0S z(y&QWbutuN>$Uy8>F3_Tw=Ja2?xhxruw!dgGp&>F_NDV%!sjU0N+fAqP3zT-rQ1S& z+3aMJ`#C=ZYZpelRtu|i!jo9TI`nn$H)l&iLq7s^DvLXOaqBI$`0JXF+OSn%maTDJ zegZ7{{`q--fP&1_I`ovn7*u#5)!QV)aK=5^0wz<7Ow%dBup?v)cbXIWh7OCJatGd*Q;_#!zAs_DWZf^Nsp z-mybyteQKwQYlxh;N|8vw5I{_XLzGwO~f1d=DxfWs=yzHtzVO!;)ocQaC+Wp_k+%O_eJ9R0#4uS1*l}ud z5-Lxgyi86eW1Q5wts1WQchmjwpw9FB>+Z#d3G3e*24{FDtMg~Nx7~k#qzd{!X>R%Z zH4uXWF%1P373Uf^aSXg}KIex|5o>?=s535oBZpawzk32=5x;Uu^u`_bT92>)*40*H?N zuiNsTxr@MH2}j5@BchH0fCS3J@SWW&Rm2e-Mye5bU5x!sr^c3~+S31Y<^wG!XBD)E zAeF^!l~q!Ddphjb%^685el{Lfs+ub z+2H=ELCBf~joWVn=F9&sV)-Z^gmnM>`O}E=$j8?glJZD|$!R4QCn8#`5B3t9Lj15& zp$}YAAn`m320~I+@EdndK_VQMdbs{V%8j%8x}dC#H6l3Os{@Pt$NwU9`H69czSQ~tb%sFfe;YY5gi?u!LK63uMEG8Hbjf(R+CwiPn= zUoC)(7z^lcF6mvI7=~8X;)!48=K+P&gA--3f*C!mR|P|Rc^W(qa_0EiTn~-wV5m6A zse?#BZ5+_tp2Fba<>lq=4FOlzJ)=*mEvE?vkM9?L5C}fk;CA(@Txff|@c9d{$U-mM z^8UDKRms6rH&(#7gV+~RIb3f{3vqYdWF5ZX^p2dIj7JqzUx}&GQ77BVpfYS?eU;br z8uE}o9kyNRe~LgZ_}(t|_+&JaT8N;ro%s(l}Dwu3t%qFV#FihBki%7>xlY{B4&Facl| zh;QEzu}~)I!S3j>BA#n>cZhIg72VA0YSFUT-n&g&a@lKs?f<+|gd>95y}C<+uBb2${jScxG~;xXUvx!~;BDL}%mXY{-#FV3 zY{;3JVE#H>(wBL)7D5$yIXi2U5n6kYJ$LvSfa?WRiAJk}&MW8-X{uJqOkJVkRSp%f zm7QJq7fJbD=wk)Dd#vaiR=&JL?qH*c`vcXNm+qa9U%Lj(YEh!)LN9w-OG9l$D-QskS9(BxgOG2TC>*7p9pr zCgD-B9-wJ&+(Lpo0!-Hq!KCPWOC7k47D>73(FoI`?&U0IqZhJ4N*n5IK^d{`5b_(6 zu{#vvlW~))jzi4a6`fzcJWVtP{^gq96H5$>Y`A472K4o@o%7l9-f6B4-RxnHLKEyh z^|(8$2oUZbWfl=j`C_X01c<%E{xduINZCgmsyz^v;&O+=#7rs5Z{VP8J*z^2Vjt62 ze5))9h-4tjh9D@-D9$MssO!*Yr9=HHBQgp-BA7NQ+A6~25>Y6S48^y0@f)&;*CeJC za6{k9gghC=ZVH1Vcw&(Pr(l>emEAl{MgB<|6HNJi7|ti!p==>2Zgr5E8tM620()-g zSF9_RJhp20q7i?uzEzuP42EIUG3N>iv*~NRs+TYcBj|NBS0D-8y;)6=ayVcJeMc9Y z58+OL)O`)imD{dZ5+;1)c+#xh);%dkd&6Rq&V22tS!bb%A!FWvA-kUrz6_{h=-B75 znRXkov2`Sp65c(CzW=g6_~>4hf|mU4y^a^gd$?-0Wx`PAc&wKBG*TweoDb$Pf2TOU zeYB@gY}e0CsKKB}O<^otTvXJr{Xc6`ABQ6XC5%2C8H`m49YAe(b3fYG37jY%@lAcx zqrrKqxtROOD)TcfzKz3=1eKj64%e*vIAdaG zq+H5}ElFKulD7OJTbimu8|tqxlGhCYp|(VuB_40`3$yo_FcsxBD06w`)p8IxtEs(L z)K2MY^Yp!vT6~b65Ux-#;XK1eo68WrB`?7em&89gyc4(_hDV1f{ABkps^}G}2u26G zi6?NyEnitirtq>G(x>SUWZRQMSxCgF{~}*ZuA1HvtU81@6>aX4Lj64ZZIpUQDpldl zbgcD_o>4hOQ(9!_q|=CsDqW7>WhXY^n2M2A_7fV0HfQRvJkB(0U~rLbe;1$~9*|b) zyC}LE)Y?-daam1geW9#CD!XU_^d7U8uOKo^A(0UghhNDg-YW<7!-1QiuvJCBiL{XvaAo#NC_O^d>2q9QkYbCk{b7 z-SG^iQq?*9Wu~|{62BIThe_X$FadEF_COH#hYZiKl^i{{s=ydyGj64j?ci9QzDra6 zFEEfW>V2W0HqHa3rkJ7y2^o#A0}N8sGmwiSVJUrwP$>7B?l4Jb#^dGB$j=X}R;5hT zGv1IdyJmeIl?{DCr2#PjL%SVdinuu}3Gm`S_pWWerOV2mK#fLJVR;qE^|V$YPl+tM zY4Hs+dh!77pszXWJ7~L?Wa2()W(pkvqU;mlbgb|>%j@6SSju-@#XgmU2jWNyesI8` z9?KXCK?bK_9*npF*UfA0+GM^vN09+y58Sw2ek8V<<|(p*&m3mANj^~BQCAk8RL7Kx zuYJd&_6+-TBW;G%R;6T~Uu@zTUlHA1s;_y6Cb_X!3J?$5zZsUBNFE)Tu0KGu&(cr4 zpM^bE%X_O52_q0Bzp6^z*eV0d8KYt*1|4$NtBduqM^zK?xk^+|g7?5N>EhB^YV|tv zW*{~F(=Xg?r1Dl&+0zmHe>Gg9LEQ8TSjczJBe<6Zb}5NJVdJ?fB;w|`9^9-dPZRNf zoGfeA_ca&J){pXSL^FC(j`_Ns=K@OCxn?5jlaBC}C%gkOkI zkdXWn<>;-Lq}L>6Z_Itd-fs8x=x|lri)*PIWO^EfO+dK|+Zd}lsd z(tM!3&>MTDD%LoLjaI%1rv(#H6c>4W&WdQlwrFHEvs{wJGg0&GUXHDJj`9IPEt(&F zInTBTm4znNk8d2+ia(L0k^CtU+71(!c|~jM_@Ti$T{Mzi=Ri_4EOmvmiy zP<~b)sY6^`JU(V?Yb)mVFMVgF>?hiad13<9u%xYovZY?TOVd_B+=^*<7umixR_XK% z>_>0R9?;xk>9l4O%+$0RtlgTmk^^H@wKc?5mb1Hgi=LIe{BZWV(4ny&@=RdNDzvMR@|8VN|f=R+eZ>- zMw(N|YIB%K7^JV!BisSVKn4LKEl^34)|AEvWZ?zvWRw_RIr5Z^K2e5AbahJ@qcT@;rgSq^;+N#j_ec4NBGRP*fW^T{gD4(^>khC0w@7CVl z9#HaPTv!}|In<;{`wUeD9n}#n`RA2)`y+O{I9a zyt&Dwcnqdl?&BppyE7+3NJmmG5_RZPS}SPCBvD? zAs{&?0hbei-OF#1R!ZN&W5}H8S`$dpL0!Kndwd_Ss+V??i?y2iSJuKLo2xUEIDFSf zhAn~tHwek~m3c$4^(D;IiggIg{naMQn*cIQD;*_)eEY6DBMV~teFICj5ZrFhmgPf3 zq5a0=^~e?dN4aST%zZyyb4Zug*9 z(CYOUvYD)Csx70c^j)2*ZwPa@o^1{q*IhM~O0zHD%Z$aftv`Q;1osyhsG+_EbyqP} z)cn7?kf)}(5$zhbcW~Eg69nKo!acgbKLOJxG8}^|u#y7dTGm1KWvv8R(b#e5c4vj! zSi5!10XEneKgw2(v3dualOI{SW-5mk1sn$OJs--rL0Z(O;HCC3bPw9(B2a>Cx@&`u zVZ}*5TqHs33V)qd2H;`Jq#{W})wK@#^exM%l{VWgB%@y{ncLWe+lACViGO~&yU<5; zEfIM>Erl+1MM$P2;gp(jCpx%p;YEDB(TXrS$N@w*sAg|Sy{l=5jXP+PxjWepQ;*$0 zihE)dq69TUy3seI{Q--h3p%IN&rE-p^?+UU1>8Is>6T@sqJ`sfpa>mGdN0^$7?`CM z0MN_kvMc&U!eLQjdynD2TEIO|6XO_Nn1Yl7ky}Qg?K0Bj??~*LPrm8ZFGxH#k4c6` zjYqH#@$BA9{ zh(O1WnRbrKAw1a1ywrb##+VV~CHNk^q5UIBeT6Ai}wXeG2Z8g z41KB)12kJnG1SpMvNSsr4P&CAps>0+P;vylex30%W0VBn>Xnek?maO2uGa>O&EUJn z1LWX0mz{FA==UdMqgG1>SK2~aQcZVsQW%$rQ-8v$f*Np%yXd{Uyosc;kBC)ID8(w; zqpM$Kn0S23qb{QAB(CyWo;7KG_rXRNXMrDjJ%R;&IkHkY8Ud`{RDNgspAr&?j)k0` ziL*9P5B-oPm1f6}dF9#R7$QTPb@xh1%R8?m*}s-LTRMHn?-O2ZEMG0Xc(n*{&VqNW zR`C0;jo4O=aAK}M#>!K`qZJ_@GafMF=cS}Aq9i-oo)sV;-hbq?jIH{pXLPk}0sl~9 z-IQd5d}-;kC|1fb@>27si^Jzlc!nd*V4 zyceieYTygoJ>YfdG*UB6k#r+~xn>=?q+HgV0ErUi=XYJ_^g6WKb6%s!WHc?X<+s8DgHW{Q}{|q3Yql9**ao?_< zLVsZR`-RgyW)K<8T)Kc>21En2YE@9^`6xX7fVl{xsd28dL9V#P&&3#HzQOeoE2~nX zsCmVt)MO~kJEqC14c|oag;^FW*eq%vY$1rl}g)^m6g zfSW<2P=faJEkZ~L3^m3YU=Dcfra2*GBUplWuR!kvNdWXJLcX)<^h3fTaliwNDXS~R zWNv0C{&_4w5fJJJx}^rqK*&}r(es3B1hEH9vjZ)dNk52z}qn(~P7e1cn6Q_~%{EO>AA^6F$BE+Svz7)BuT*~Mi_DlY!B4s{~> z_G?(wBcJ3#WKW^l2t)z`W*yFtF_1(;i>&j-v$y2H(+GI|{-FZt=s?*$Xs6#t2B|Q0qG$`s@xX<^{K^iOS->ff3%D^!MG(XJvNoEJ$LN|@oGfWn1^$yGY*IsEUL+<-p?S> zD=)xtRXXUwFOx0TgJSq+*^Sx8+66gQcEWW~B|tGklDQm^5WzOLI8-y9+z_0BWB;rG zGB?m)QH8&>kAX6879O%Lc0H!tEWq=PZRr3;^l%)D@WxKiW-aUy07anLQN0~zSW}+L z1_B+-%KWRy^Dxth%=jKR;kX@;sLM6V8RFk0>U0D@YD=jd7ZQUCaS1v8T~*zIH5$`< zm~6kCH@_zu1tMYWwj*Rs-b)#uYdWZd6O8INH#f_aAhm6$&aibMXA1U?s}MmM2`T9N zzpfybFz!%)tD$TP7G!{qHbY?`kIQbd>_!Z_NR0ej@m<7x*WOoFoU{u1(DH!p9>l4g zq0B(1bV?Q$7S1(9nb`KFq4KJzD&&<29YWwa=R0;OhFJ?o>RY_tu$k+vU;L3ymES3hUj$QSMd z;382CcoJe=fW~v z9DDmm+u(^L{MN?=xLJ?zak6mT@EsqniA7->KkNX(2ovA;YXvp_fnIijWYo_e{7UF6 zd5`j^$*SUt5>6K6d(2^iTPgl`;+y|?4U=8+A)!E#-akpAW=cWEA>l)=r) z!9yBJ!ixJ3+JZ^1%IiSz49l*n7NdHx?1BBi72tTdQY`)FW=`RdKNIT#lVlnI=gW29 zJ>hj-llq%{PPJjYf$!@K_G#2+5!}PgB06uAj|!Mvv&75lnZG?3#{56yJNidC!&aW8 zZJB%OxxeX^u)4%!zeTPqL1%b(G#mXPGow9|`N`PZa}71MZ#n*7Ub7pf)2rsc2CnJj z!7C|6-jJ*XeMp`1w`TGcKf>EUgB%YuPUp0Ss`Dq0rFHA(S(*Qr-Ly;-yqY??J zsc(sE{#CYxlG%Uy`?RFbf%t+^p3(tDi%EJ?66C%bMW3z8mgY0) z?Mp)pvL^~YzRAJp@97_OYe+BCvjd=q(_4e{@7XK2-#2AFLOfYK6dpUl#aDtLz>0dT4RI}FZDeFT z`nD=U$!0r785JHAbZ|T`#YM? zu~8`7B=0c<^cskd`oc$uqG%PUj{gX-OW9|hNd)At@T1>HdyvzFYlrxL8VgQ9wE!6- z687X?umJ3LeE==~0_~aad&dJfhFb+H8{|xOx3+>=uBsV;oDK%~e#V|aAcp2!L*OKo zfT05BZn+#GzsYyff2Rk31v$beuJ!XlwtP3zVjHJs6%q)mwe3+3dBp5`yU=rQ>@5*+;Z;9jnFjqjDb zXR({t?3M(X)xO;cU|G=euuTXZc}MpEu2=_fvn)?cbTKNsPrQQ!_X(iH!OAnMYj(Jk zz%zZUPCiV9$|;0}IXkVX>f2!HQTVUYP07qWlBvFrrS;hkMzjlRdqiI?bwRfvzOov2 z=k{&(eLJp7P7_u;7ittO`6?)&=<7rsNoYT5bB}Mi%Y}vp4vvTdP-1XfRLu_dp0pnU zear65saNA>2#7!QdShjlBnQH_`eqZQ8*q58D#*Sn7h7Sv@-^?8lJeAu?`QiPQ=cDa zls#`6RA#dYxf5N%5x{Df?tb~ZaxV+aswChBs6Y5H11ulsSrQ;WkZQzUOtOA#4tUW~<88zn?Nb4)Tni_W}knNbPssV{bWx zm5^3TThHgZ%H{>p-+%v;Sil+>O@M2xU0;Mgx`YeG>jfdQH#Iu27fD#OJk1d z8E@Ji(rBgLRr)RT-dodq7Bl!ZE=eipHh{>!B_$<&9S--;f^QqBWdJz_tw{W{Hy_SE zJiuiHPAktvLGwCJUiC}4_akJIzG!9478g^Oz2$A#L^OW@x)8EgZ5pRv4XXeXa?*Hu zjk*yHydNDiMw93I?A`2l;4Kq*%nb}aUD2y^Kc6r8@#4jcs8nm7tSdRLjW~n8a#KR_ z(STq4`q*b*7rlm!_N!+_w6n(P>USQ)-vtQ&X*Bd{Il${dZk6!QCq0>xr2tc?W{E$F z+J$yQH^UE)-s>lZy1Y&P52?KFpWD_8Q(co7$fAj1W3)gx7oRfn;vJo-@Y^Is$m%K} zmMxAn8idVpcdLfsWYou>1i(n+7&dizDY);i;vs&F4)3Tq*-%M#ozbSFt(`*gEzgxfGWtr1EEUL^&i7A-P zU$;34DJRf?XxPd)d|X;0v>yD8ke!vwHYDx`{wG&p>Le!|z05)n?LUCrg&Kod{Ek2lu2e--lYUz%4y zEq%-grwULXLflUzZiJM;D7N!Z0e+;|=O#k91t9Q5L_4QMoDJhk;wveeaWoq5IkcKF zL{|u6n0GGkMD|K?NMvMj+6Lpd+;9(oNXU(jB_L)f( z9j1SwU+@=AieX!*NM7gXJKo!O&=v+4SWWG((!8dL;@v}AbMKhBnQ<|coV=yk7jQel zz1{|E;CXp?MBm(8M9V?XB^ngkw`Q4S-}=hlNLky!BrCe2HN*gFA5=FS3_@_-dUr4K z=b=o{e}?~8GcrCu>VCTX2Lbr({^8W}Bt&Kp`gRvH@dvoR_Fp4IN$xr0a1 z2!me1bHKLAF=O^;SkWI$-y>VZ-<*q{X_jeB+?S(cE(f18pFdar z6|}cpaR?TkpI2CpuzP;OU;{6bKQ?sc7`@4nCqH-_ik@6}AF7_wfk;S|;Ns%q-^|(z z{{NzD?xc~C?vw<%Z{^8bj_Nul#@uPebSlm>w=YWv^FqzrXMOAI2VvXM{t(Q(&)@dG zhF{J9Azwtb+Rf$Y4Hq@*N_$O>8orAfYXgQJp_Da+SiMp+t}i!U3)l9uA{t!dMN zz`6Z9t^{Fl+tnA?k@PXc?W@R&p^?ko9||%u+O{`t-<0_BEF!0iGwofSu3GoQ!O*J<2-Ex~|Z&Md@2`dzA z*cmv)Qc)T<^qc(hgypihxOjqcUSz@tN0+ms0e`=H8je)E78)@7Jj=O%#)VQ!FsZG1Obmg8py$T zXiQB>DZ!{{_?(R`>;l??R(Ie5i@F{X5MVkHTHCdi6(?tB&`P0!d4k5V+rG1>$bl67 z2ovN;<^TC}a0wNa2k%l}Umw_F!l>a_rg<3ebxtUqvi%39A+F2Z3 zTsi{5-WGb8b>oje{+PX_ID$55TPkSI92M&^2O@8oshY#(0Qys`3^u+%Br&^j%lo;q`9Flnb>|+)W7X*F`u%x_ zz2#DQhJ$s3En%@o;F1rZ7mSfYAL&so?q<)>UvWz?S zytvmr5+(x;cz}ThZfR*jBG97+NtO1EpYP+`rz}8fSUUnaR(F1&;WNNm$AcM8FoN>G zGMNx3M6CLsDI~aCK`Crh{Vq!dpeNokqsYT)5`O1F$mx}cT1}*ovG;9a!OTbrF&+2e{A1}V(9S2gslLXGMnd2z-M%% zV;A9+X0zi(e?#v}%lSRGn3B0#e#h>^=>r|-_R`o#cD&^$S2Gp@qiQ+VSQut(9AMaT$Ei3f+h8iySuYT;iF zI;92?dCAN^NkC+xKIDI7u^WO`4Tvk6=v{yZLsbm?Urhq0b$&D#wEEAC`>8qT(lDaE z61Yi`iCOyGZ4s;E^YioINI^b};G#=0%-}=%pPlXYP^vH4KLdLgimdb_KWzfyO1M8= z&}t_9o3>6UQek8B|D@<-rtY}f#I8oWKxg6A$!x6L{m-Bo>_lUO?&!u@A)+vA9XU(>*Ez%F#LBwHgxRhE)eou#0#BtB6-K_Bo|Sx!(UL@b6IDcaHCacfo!eSb)W74^l#Nk@36l+f!6+|I90ovyQ#e=b?c z-eyd>vg9X zND-Iv!^1-M3wI%;T|VklUzwizM*)A0%AX$$z5G;!DTO)~aVoMZC+tkrq*p5otnkZp zrIETTpgIgX zpW?gJ2a6gY@gmF;LSs?`w>A68j~dgQB0n_L*HhSL{HgjYLD3e_x8qI%S&8a!c6tsO z+De%Gb{p;q@Yya0JJZUMpJ0lkviN_fc*L-Jh)ltxK5gxmT$+|8How@qG@k5(2;R1lqeMD-S`w6xo0amQ7@ zJIrztTdS_oABv!!;kOwR=xkK2GmX6&Bem+xwW)LLJ~z(fBau-%QcoF&s2$2i+4t2O zrghH@?TORm$gSjMlbJ4T3+h*gTCwCvFAXnX%6e(%L&w9u6+efeqbE-;REs3a?D00t zx@`E|@tK3r_D5O7G;$Sc=klS6De^gdoHuH4MqvQ>#)Oa!&rGElsxC7b&HuKTskhxs zVA-0aKE$9|zEy>;rN1xNcJ?*<+A~`5n3x#Ev@$l3(CYTv(=O-?5k<@aI|F%8m5S~4+4;YF=$(0leaK58FgV0iWHul(jl}*XhUx{Y73u)gjtQhC1Yp0 z3S4u1?pr^w)r`VE9Dr0fg%M3PIzB#}zFo#iL=ld7qZWr40@+X(Wv}((LMw+Dy^*L% zUq7v-FiaKVRM5-Yf*`lPp@Ac|BNO&iEIMw<<3!54f?TrDo&BVXlWp^miqhe~H>CEN z1a9H82nITV{s^H>nXGCLH3y4z2W*PCN*;}wyFPTvqnbOJhSl?u5~cm+?!4q>W)o;; zfw9H#`D|k&WWI?A=Zl{bWWG*c_KsCtC<@zii|#6PG|`px$C6*h-ka}hyRajuckSvBO_&# zL?vN`Qv^OmN*AO)ss;#`8W^cf_EixXGp@T}CC~$t50A~FBqwJXYy*?vS9>s+kV?y& zMbTn%K!5BCthRg*Y=w%ct#yZN^J_x1Qbtuek)qQsDhXc~$$RPAa!tsAK)RAMKb@9_ zBFv(lHsn?3rt?{d5urV3{}buPyY`67i1Dobtb(XIe0f2x#wp4RcVdBsi%a!Sc&=q% zR~J71g31Y4`A8aY`?l>8vw+QBr@7A$T3TbZypV1>T3RLIQ`?;9PDcbzoyU7_-#BnW z<(+R&y=xON8}%+RRkVL+#W4TYsA6e3z+I2O=q?*u*M7ICbvnY(d1O*kJvr52Fsx{b zndctPgmgR~Z2-tR3^op7b0J|CA18dqBz2Nnr(HvEzoaB%b`Jo_1)_6gfGtez7~}u# z>2j+iiZ>D+@DT7o%K@WanZCTyGAM!|GXTU-6!r)a#Sd$6jMSd2(sz9t7!%*@+W1cK z+F^Cj7 zld%(-K=-&pm6w-^n38a1gw#XDSU{^{?fm!VODmj77`Usm- zKF8>6FwKHNT%GIXuc6)^fn45d2O_DonXb=E2|vb2=ltxiTp@|DFX*#v|FV-_fxpkT zFiCWD6JI@}_jcnjjM2}Xr5loB;0w<-fODZ;nebDt?DkezDCLJyXLr$ zPe$xRT2k%UUfiv89T4dnpBdJPdbSpvyj(v_CAEg)Tee#>lub6=sL3CVA$r*Hc!7KJ zmS2dN%S7D^Z5IJD`vpUig^CiBb*do0k$5Sji#2Z+cF6Wx>FIF#{MQQk@fPO2#^c9y6=0>6=W=44f}3MN>2O{EDI z78Zapi6P%$cx-hzC+keDQxk?oZ*T9DE>Sw@TiJ9r={;acI6eMO&Ea&|AADw`&y45e z-tSIV&A*{!%QhK4IXZIPZhEvsV@}K4Q4}UrW@v70UHH+6c8jiu8qy{Z!)kS(kJ1v{ z+nw8Nr<487jEyUxbL?u#A2Oogu-|`Bk9pQ^epY$sm)&zZoTdCDcSg16Av*8Kxa9E1 zgEETEgU6Lt1DjcT*c^&=_~qtdtanT!qIM_RQV5s{x$REN?mW`huUVDuZerWKdbYp3 zNJ*44bLm<%Qo+j-6jr)%=;87m4evhDG{Y$$wrml?N@7lciI>v&OwP7`k>6eGh1yJ# zn`i(FCFO>b;X4QV{wkXxwil!cG7|)@%mI~+ovr?_S+dk#s`3#ud*zWN22BOrJM z(BK(IQ-msk>HvC0KnL&Kyoo>{Lf^2e?!-3gQL-Uhnwsp;(^_=>Ffo#nk^*%YNn}v< z{D>R)4Vl1i!1wU8wz2fYa3JeFEXrEjUC^QFlt^T90=sdjzKhetoxyqh43TwcIYF*x z4GY>ZT2MaM)j`@7ZkL1XMHkP63@FouV$poho?%u?TdOl^RZ{$XzD88K^EEAv6OPE% z)>g1jh~FRW>9GXj1jd`4^kZp5%tsNb z-R*LNTIC9itPC+1!`|ejl4lpP&d$x_4&&uAg#D^orbec)|~yZ*#wP$KskrcCC(jtRMV2$JTE+v}0eGBh2E*T^DyV;ImSEPh`W4BW~EN(|3=C zT>3)Q?9b7B8ILN-)QJ;n_rsGjz@{S6wF}_>=H@21g$6*&;2=U!DWa_zj1}r*D-k>S ziX0g5MNm#hrw)K{nDe;p8RjUEsQ&Km%?Zmolwv9H%TOw5qDk-~^nzQ{rjIi~kc1-$ zn6>~<*j{->MOQq(Mvhz^4UEUw*xumMc_k*+F%8HY=^Erat~&4 zh$F`IaP7KK-+})h3Svh#IReWL6XNktZxRZp)#YXJ*~lpgmSgT9WucP!B~-M&^jHSr z>QaIS6LX_Y_tWYgmh!Id?ZU-&}kKiE*H=YZ}P-ggGG4Ej_ z+Pft+B}K)mtYbSu@rDoWhy{PJqw(9Xk#o0Ia=jy&&9m|j>kT&M!;8Q32I;Gp)Sp?) zD-5{hd8@?`aF1z7*s5H(0dZkIU485@;}#ho&m@A(xGiu_RJy&r{pX*5%9BK}S_X!R z_i@0fyZR-xIH9%$H5icMOK+ua=-4gO{6dN><(gdE61w)(V%R+c>mDJO>HgM<`glp~GbVpm3xGjztv`XZ9$5DPF9=4!qg}0f0^v}Jm^<-3 zYm1KAw;2huzdzIhQ#nijz(8$y4B?RaR?!g-O%Duq@V72{=yNfDVM~bpk;ns2Oyly$ zrCZG7vzxWgFv!Xu|EPR=d>iwBddV7JW4`|LkQ57ZDgG$_i{&xq>sOJ_KQLeaU=+HI zh57pSzV0*3*Oz{O|N9NqKmITL7AH4lWkp&jo0}<9Qd4PE>Iy_HL%{3QF96@AIZ`Syypz zthdyT^qzyB*!4^9g5$XNs7{mokPtyLSF+!~Vy}9h*llS!d5;@2m#3a{EAp+UVKSOu z&(~)w51GPgGPqYvS{9k@wk0-vJ3Ayb zInVi>zWA&zeuVjuH+flWkRb~T?NG_~`^XdfCguZHXMZ5}r2GRu5qnt)lc)%<`iSxb zJuzWL{5$5g@k-)AtL-+GEA>N74~#r>82l-)(k|5$A@fx`r@g7j0te^G1AJ7lIWy~p zq3rzrckgxuebiw}aMqvqopg){@bPK!ra`s&p@i{#BZK|#SsOqz~cM*X*L+yM7q zI6GKh4X}I~V?v+-z4_N)tyaWfGW!1g<$@Y9AcDYiB_}7RaYnjn)w%O?b90;4F(96R z-_shbrqkXzq+vRhwi5BRJK07jeAPY2wl0>vR?L=|5#|qVWx-3ctf)v7{#PPq{Ka2V{I)tq4RR82YZ3^ z-oA}8k813Or7DwE4m~g?CN4sCWrNk9mX>HZX|uvqRaMUpCM>}wi{s;chXC+cjb!or z63Kv!WvZ8C`bR?v2I!em72z0By|KJp?zpY%;&PgHuWe`u1XdY^-vB`%?CN`6n12qqJhE#Om_~$Qch%jfsX zlKw)2{r96sOS7|26(Hb{3oW&izZ{7&>OLOKRoh=t8p)kuQ0iCH(LpP}&X3QP_QCO( zVr8URmUb1AH|Bh#rBzEt0JrC*7d&^C)Lu)aCSQafXRmlM%4jGk`87Zf&?)&=w0MS_pKX+tWk*oiKc*wa?dm^|*Cp_IlBX&qwD`y!0 zELpD9GyLW%=Zq^k%h5*JOhgkLuVp4f5Evzlp~atDV}^2MwzC^LEyP#{R z!&*Ob$JYRrPR#Z0W&JUTr{IU`0L#jq3~lfW_cPVZVNp?hPWgDyIDoiq=rKcqTA?ZE zH&SXaB(*&JWDp>|4fH-=jI~4zqedA_hq??N+!)32x3jgio_N(3W=ER!sVGe*j$3TN zhJSW=-3h6w`6apBbun8e$bv}b%U;Cp-12LI)gqbDFol!5PYev+Y|hHAXI=)3>Btn8 zmI8$fmAvMIHd$3z_^wD1(aoVuOYP0HUj82v9$JQk;o;|@b38+YHQffTxvD1h23ofs z6|!4sb{w~6yje-GSfApMrqJ~f59)0NOgC2 zfAa=kq81c{fE%~7;9HCpQc_Wgu9gAjtWR4EIJJ^iabcmnU$J}<5iA9SH^}Bx)(VOY z#Z_by2>w7$B5M>JUS-rn%yHFkI7b7pWCe31-wQY`ow#mP^&j5ZwDk1M-biaW^}@}Wf`W<;b3J9ZvVLIkcxcgA)!UV;_+Ng=*UA;O_w+58D?N z%^$a(Q5)|)5MCj6W+D28>k$L$&5E(+gu(Hm9~5IF=9w(5g}le>t7b{YNOfs($&luu zf40O}Zcq|*xA7Q_$&19ZYu+;D+26NK(zCg%4oy4wyfD&+*RN;ciR(mJV8{YF{nZTJ&(B?D#+6fZ?ZMB4tzj)P5Zas;41?X#^cFQ-XMRAyo7;58L)Xm_kIg10-$;zSsMY1d<*zp@84&6+xr!+ zSvbNMe2a?Kp>~FBY(v#q5`Rzrh6p zV?Hz@N%*)n z7iwmg@FJN`@2p_Wn>bQ6Gky$1OSi?Fq6K78;sU}{xb;|U} z=2Z>|=4rTdk|mS+iF!HPWpd|kSBHNIRiExsZc|7p6uFA#gW}n@he7iA+ik+=Oy9lR z0?rad=M)?hjg5`K{_ycLaB$ec^dRqv5?X^498kIU0h0rYqBc5^EYUh5?x+#bszJKW zgpV52HY7AvE!Ot-_xdYZvc%;OXNBz7n?Vqh-6()cAns&=)r%n6iH?m0(YYuQ>;}6^ z`?jMKXrpNOvG1>9!}6SktsO2i?rxwmOzlZ0a#ah+pqmbo+8K#1dIXuyZ#2r^wb(OO zRZmgzP>Euiq<=n;cuqXbv`F7oX>+z%4#d0f9Vtf0bAK(;JUJv+(3CzX%_v=AX#4xN z1_vFt_#etHPloBNTIur*Q+`!e_LTo!rd7lW$IO5`U#dGvC~mMoT;fk1pt17Y69L^lf%W9_ zu_*G%D2cXgf)0gvkh*`qPd?a#1&JTefY!gu9Ms^Bt~u1F%Q!T#FSA{dciMC^3-w-( z8m;vdZ3_ywkIb2T8t}r!u+*gh9;SgsqAay0L8l0zhs^{J?a%ek>?6I3 z3<^w~s`huQxE^`DC%6mCocA^+955r|<(ZAGZSkvN$mkGo4j1M>ZXxjq51uSG9)Q9v zkueMbjXHJitI)ofFlv^|n&ivN6N7vj-mjF`S?&_XpCB0#i0Yz@ie)rHczS6ztV$w}F_a3z+)2?`4^{9<` zM;*k1CyD5^+sw+U?lg~x7dvVwZ%oD&<3%o{h=)9`>zo`&T zJdkUYmX?~dsZ*l#OBD1c=(xGn;y>Y9Qra0!Sz37KgpN_jX{f65^{{o(ak00z*S|V` z^s1@x(bkL;rmh}KlX*S4rtSHdK|Xv?r~csbV#~2I^xRt4r*`TV=eqfXqE4SeaV!;< zfK4(L7X9_dzvrTtFZvs2Ke)>kBgiZ+6B!9q%h7>6B;k+U>1id!`m9)r?Vi((R|b1m z6(n5|3Ave5Rdu@SpAC_8DGNyDQp~G5TXNv6==trF5Sgx||LwiKont18j11##ABnpn zj*l>(td}Xq5DV(Q!I- z#j3q-%U%FQA!Jl;7Ovb1w8Jld!NGAEv;(aScr+ZLB7}y9#v8f5d-o3XvOpDL%B_)w zHKY~3m&OpXH(t)f$f6g$zu-X{*goy{xHJa<8mtEM@%##u-6j)2U_hE(b9N546xqyU( z`DBL}YB=Lc8PNIgPZ*JE?k3xGtK->Gfg~n&$Zi`>M>q*l(stYM@)tg@`KRvc_9Yp$ zShuL6VmRh}o2^^JYn=UF6-05>!BWNQB;63}L`HrRKOxw{bHw9~+1AD=C+dnZh%Hba zEr2yb_S4eR5_N!4^DH2iAZ?I|dM23pqunMQUKZSsHX2p>Z8!@g!GtfM%gN8r2amCu zx;kB6g?ltE=1I9U&U=cLuyr@0MVhh0m^D9LZS0LIn&+@VZ=k>5&MqNbgFFf6Zo=*G zZp4D`aQgadv!k-4J2!oJoGzpr8_InR{FJj^TfQ+&SF_vP;YZ#g=QN7_+*-bYoyR?{ z_B?aJ3;?hVan~~;=HpNNzS1;?rc}FCxXj5101k<^bFCo8f>qK;#fSrN^Xcm9YHDgimeEiNG&7a1$AyZl;2@_f(E+)Ci2w`BHuS!Q z%d@jvdtU%w3keAUms+^JynH{1mLO=$%-lRh$F~`@o)8Mr+jp$7&-?s2hL8k<6|~x1 z*7KhUWiVH1#?CkYt0|G9dex{pBIj<5T*H=V?pyH1eYy~V}k)SFC%9XJzu^{;@> z0W#wFd+uG#SnR!ob?fS>M7-%gsnNr-)@3$J(&Xex0QYK^zY{bm3N5ElTI7=NHvdeI6>f~^ z0({#YxhX{V?~{^aG(XXAz@W4G57Z6Vz1~~@tIb#ddOZjYqOHp7{{dblM(zR=2 ztc~R!$qP;2WW7BQ?j8RUkSkJ=%0|q9WK+E4cAV;n0 z4;uPIc|R#o6PE5gFW%J$YI$F!ka@vR#Z9>pc7qoOM`6)@Y~1p4cK=o-%%TSX5}cqq zqj*l%&ZX8O!euLW%N*S7-N+>NYkHnf1$`dsd@3^je-Z%+BYu#lp$D>w4mW<-)E<^z z_A8W5Ri{t<7$OoBEtPU^Le@)4D8>u^4Xy7;B25d~*$51(_r8(8%Fs7Uw9|MH3 z4x=lEx8Yup(}I934v8Fi`@(8S_#9NNM%$Bl z6>K%6yU3XHxgddLDu{-U12bn<)fREeOQ&~ZObnb*E?%=+?VVNjw`sbhtX76nNQ`vWopC|O34S+f=oC|YB$ zv>!#kaiF4&@;LhG9V4Us8*nG8`S4h?aol$JC_=tqm+xH;uyQvUmmG+y-TPLHV(Rl$ zi#GbZzP4I<64;x_b$1Sal~!s&x0Hp)>!q<-STWo$4o=xVe4w6*0WfQc2FT9dO!nV- z#LlK!{e%*+fd!Ul9|;hlVN!rsVT{WK|07y+1<0(FKN zGAJx8Y+WU@u%Fh{<7``u+dX4aT}`bm5f&(cc>$gUPN1E#tDbRkMlxuDjGm2+&F6nfRN;AHW zk;K_m{TB;J&h?(VfcWIxjnJs@RToChe&gYLSCLh3-xMh5+jt_x3o zo1sYGBPEn~tr`*?(*1B4Qf|^I4J;)Hen`-l+b`75P(pl0on)R|7l)&#-7ie9_2kbf z7=1-WMKjI!JE9Ylk~mB$U7K54s3|Dsxlq@vX_qcA>dZ(cRC_)Yx^;*%gxN1;V{MH- z$V5@WMO6Cxcl@&V^?#pcahOY<82qU~ zU+y@h6xZ5Aec`;L(nhb2_vy;u(AbH+xMD&5VvLIcZ8Wz+XbyYsOm{2y#KCEYOer@d zx9Rv8PPTeqfQ)14S6yOiw~HZSpX|c5?1n+>0z}TPs<}e`n zV<)tdl7mm-xPT$d5HM=+T-e&!goWBcfX?732`(;0ko+G#l|K3^CHFzd`Ci!?JurX> z9C|fiCPpttS)f@&)1=M)+R60kS{c1jKnbgd1vWGGQw==ki!$Cs3AKr_F*Sbc-xn)G z<)LR$VF^pzv*eKX?>EmDi~{2;7+JU|DH+!|`qd~Y4Z?X&|0~7GNQ*T6#!E_@($ae; z@~pwjO_g^Jt1s{q;ReGYVNIW9w$bn#!&Iz_uBYCa`l*LP5wP27u-MS@y!m)TK zFGwKS0n|X1%nS_Jz$o0qEdkgt2KYr`yzp6^pCjg}R-D0`-HvSAcrhfjhz8{y5XAHO zpr-*_{nGL>7tDE+)Cw3OU!A)f7TFk%EEeb-Op3{BPLU#vv+Z>+@2dV^)iQvqIaxyL$wcjWn2W!NhzRtj zW-u<}c*cEU-F!eyNcd&{RxtRK!1{B16OT?jst)=kb#--Oou=?I;F8-4+G-^wa-DXaUG{mc^-A-f9V^ypJO z7lG@cyQD=JXtI_9IHy}<-ZyDj)}+jX(BEwHw|a)71d%un3ImkK4;XnUg%R6oSGEAw zO%8Fu(*9RGLm?v-G;btPVe(CBCqEQlnZpz^)N7%$atbdEkJHoDEu8kp00s3$xQ?hL z@+CpUaLny&eRp2PVPxtqRUQ)Tg(<({_9N7x(+<&}&e7of&jW)uNw&6IyPv6)zs5OS z)O1SkuD;>6)yU{m#qVV?S$w)WDtKqe63b#DS+XI9a`DXGdZqc6nDo?zdBb&lwY>GO;DR`cest9ovQ&kyOkko?H^%p20R={)tgL9GKCB_J z;0JH8#45aQc0rOPZhL)TzozJ1viD=SacpH}1V1SJ+ z91!>l@Lo2IE6{|)O396J15K)47_}jP6I6OmFs+1oL-Rw)4{2aSu9jPDLm3KU2Q*>W zSXkhWG=P{;c{phI&(aLw<3&V7SO@PA8e~F>1LAF@XOI0H)9;EFsj@ZpnoYrT$Y%Q3 z-DkwN>jl7b3cLY#_R|91o?J}G+5qBJov_q28Tz>Db(l}#%L2b`ZNXOIB7?jVuuPYM>noE8zpyTE^O#)cSVYAHo;($_lN7YTMb{T)t0`7jyXn|r<|W|_xHYJZo$vhyvM9F zuB?Op)G^*hYy94UxUJaa)A2%bYU-)>y&`r_>%y|o<=kpA`JdHpr={Vakl{4n&Uh*0 z5r3n8t%7nmwnT?6B@`#+5@TPmYA7yd&mi^o^5Ws;T{^0m92`^>5D)+Yk+x=$%k!Fw zleW`jH{Ct(*~zz}IB^H*3v{}HjQsH714TpDeIoeu-`8lk*b#T?@^+;ALbbFAZ?(w~ z>-h)l?H>IiizW>!aboKo>2mhWiX`tlOu6@zM4~w?IQ1-+0vn;-W#2(VxvMO{qna+8 z%bb{-n=70;i6#DLH4I;f&G*m*mNZ>zPTmjbuQDWJh`H(68i@^pYGg7NQi*Y~$( z;wE(tHjd`)6C}_FI9XHVvZXEoe79B*x z^>y;NTz(^v9>C^v6&d`GFh5WKV;hcIWXyH!m6!SpEAKybKf`(!j#>;u!I=ywdTP85lc48edDr{Lfkyw;kJs|7cYPPNh_;nLlaX z`P_Pnm;$ySV;OAU%I*11x5Mf!Wo3JT{Dmaqt$9ZwA$YPW@9600M3e6Kq%)I44maN4 ze+SR;fursH`}a=k;)Yq!WevvzoZ4|#_{P<>I<*K+0ALkbt-N4?Cdh~}SvGLgI$2nc zzKG2I%?59+;vV&2VPmDBM|b(I4)8gwD&=Kzaho{Pp%@KKbl<^<>1*KI{>#VaN5ko0 zG~d$aAf2~(hq_RemR!+pyo(Z@NTd{+vzhHk+xG1%GdMG0-?-{VohzeRZ)03RP?+y% z6e2yIH^Z*vrhUJFet&MFNT;+;HGSLI_m?UvVn+L495e}U@w>f-u+S(zCux<^i#l%{`p*}G&VKn7;Z3m77gnNV&uz-DF zTo~&EAG`bIxx*O7T1oMS+aE-qG|`WQA{o@IApm{su97`FMA^XX39?`$%f*O}M-I6E zcNlzpB*IeN&^E`b-BKOD@moico6a0u8?!&NM}*e8qOy1Gu}g9$Dv~w_Z+P5+kIH*g zhIF;F4aed@e5rk>G9EM+%B+23W3tjU183M<1`83?GbDRUfm~&Yn)9=I>B_JCX*+vH zH-~{li@IC^<`lgZ$=@myP|p^{pC2%+l{hwQkOWTR;NqlM6dE568SW$Fr+2ou_er?9 zRdYtyclWlD1$(iUwIPo&%eDZU!H5)mbHUQ)>^u*HCWR`ZNwpbBz+=cmgp<;2rWP}+ z8{|+7L4W(0fPk8c3K3{NklF?EAgiZ@lR_V-Ru8z2VWa)|aHkhcC=4h#?Gtg9I;P_dX`{|b26VBWP*LlU+{OJ;a zLMKq*1k~)-;8Mz99rf0lbgH^RZjbuo!CESKlzB;N2 z@QT6;hVikOd+2k0B@m2QCj7lXi-m<1D$d~tNV0qdDrRedeD2q;rkZGmAtNxkZ^%q#)7mQ=6 zmg6yoCW#ZZIf1W!)nNB?x?GrV)VPe5<}UqYH`u&i7keM1YDfcBXVCPk)gJ3=y6%j1 z9Ga*c(_>ZfOuQWrjd*~=X2I{q@$^hiQmD<#rm$PBR5675&PaWXv>X4_^5~bkp63)4 z`tbWh84oj~O&Nqj4fYTLely57f%Ri=!RFMcE)iu}dz|`F)#vk=7bFn9m$^JxJ@em@d`O-RkDYZVq~)nJ3-VVzn)H$(4a=A6~lC zEVFQF9cFZtD#%-t#PhQw-jB4`FYkS-qVC2DTGi2Uelp1LEiKDse$adce@Bq9OPrj% zCM^y5AC(7cpq4ceJ#&{MEmmJ*qZp1DX=!Ny*6hJ*LBR=d4JUuvHyq}BkRAc!B&aha za_rz;gnYY_)y+@g{@w|dHjRVS3Y(mJCw zGIT3emFS0aw1j`3c4xA^0tDG}>*02ChZ}b*8Dml`ry!TCjNO)}X1}bDi84O^o3>pV z%$#Qyuf&BP2Hf6XRkYEZbE4&@EUAvo2~9&7_+d>ug$M7cY)zNW=s1TjEyAHrNLURq zRdBFLbUg>wr~cC|nR`enDNMDOm6c6Fpx~xa-Y5d48Ax3^9NQ}^L3}7LtSp8Qt$|Lq zGil5oj{cZaA*3*yd`PdgLmWb>K0QahLN)SMOG!)3+12)mqIo4YLK0Qz2Su^dXDfBL8DhOuf^BWd3E z7?khY>MD(s$w;>Ur;NU0lAw$kZ;I>lGHIJmCqfH+qoewori>MG#9+ugIYe8Un4H+= zD1FEcS4ug^nqEhINWaab#yaOEkK+mco6O@6z%We2#K!hSu?U~$g#)tv+pWe#X?@lmoZ?=g&Sk zHy}6o5)8lc9H>^hPXl5>*6Gxj;1|XT1z(0b#09mb0F47@g@Ots)tEvyA^3}fLwA5w z8U}|qgcR=Yeuo(jBU|yok=d!cW(a3GWG+!bY=H0s<=tLjmB5Wsw?C|bV=y;22eGwJ zX*pZS6=5!ZwK^2quz(LtD}wIgmmf3ywTMG)<(w(kcDq_)CabgAqoYLTJ0`9jCt+TEGJJo-|%S744dz# z?x6qjcpMoO{_E`_D~X2^t6wpw)W8)RnQ2Mfkc?o+kiS_WkM43N$bo_f2{s@w4hN^E z&Se|#BY4w&e0-om8Mz$`a$3;WLl5)d(IaX>^gdV^!7cdEU;haGm?-LV#Ut&lNT2x> z*+#X@NtcF`f1ed&%0y!HPF_I?i_*oP^z>Pvdf~T;3JjFqmK-~=v$Lc8!)UG3Sz*~s zQc8+4j*eLf(Zb9=-Pkzq6yGPH|Gzc&)?rnz+upZJm$(gZ2?`2`#iT=8+CsWZTIrfJ z(xI57#3Tij?k=fGBOoB%CEYM-m@uC)ajkvMd9Jb-%Hk>ecU z#MBB`3W3qxAAR$k;>GG$rgxisSt6FXmOzKbvqPp=X;ph7kamM(c z`rjxGFk@&D6=x~mlP7Rj_()0dUv~6cS~dQw{v8>@HxHbP*KePnof|CN84k&gKWSm? zEVaDc?7nL;-ToGTcevXpM@ZnQTD!QBtHzP@zRUrK^;M%4x}KSkj89v49sckNY;Ti2 zc%cy=+Ki^>y7fFFvn8`N=G+>eL06$J*Pm+VG;P&|W@qsKs=5VK!I0UMgFo zWQXzq`qMo(yoAx~2Mrm5StFw+cP&FPxS*KOqUw0}u=CoyS%qeDeRWyk7|YI{zHGkz zu7}gjbht>l?5-nprt#)Rz_~Ss-NU?$!SHtcl??X$`|4}HK9?=Z9b*jT+rNp?_ftl4 zrg3hPw8n{d+-}CnPhCN8PK6Bj4)R#s6mCX~i|U}8-#>3g&rcZWoZcl%i9N$IFrUc~ z|8|y*iJk#3J~)1EjyZC22|~pUJ&mqM%V-bmRH=92&)OPU|Epz1=7k1DEFCUNbAObhT_A$*x!uhbEyi)Opj&-@RZ?li|yOpJ?=na%DNp3v<<{}y(sjMb5Qq+*itztR8wHMy~`gM7% zV`n^_J=p+@cj(E&&Eeq^r4$e#Z z5jrFCy*{TcEXNA-m6Mebj24zhy{LM$!N`H1ebf|hmK9w^e(TVLQ5*ez85zHr@a2sv z{8SRYLoi$4SeZti}p;=}`b7R;orHd-#KcB&j!=Yown$Ue48h z(4m@tr&;&i9T%x(pJlgMt)^fJL*ucre23h9dzasL%l8iQTtsCxBP;GlORMU%TQ=np zXO1peFF#Cm7>p$sd@uusNwJ&AqJ7oixS|`c&os*>cfI2}Bd53U`+O?T!J_$@nT=X3 z1x0c9p@nn%i5sbUtE<}&Om*Xe_EsKY4|Be?sE+a#xF zx7UGWh0I9U%(W3*Z3`^Yo(BJqVcCP>mu8dP?}%&X???)N&)#TN)naju7#xVE6nyZT z4Ker^3(RPp1JP0y+WYFKTP#yCNey(u3X{qQ(n~({e0(YvS&1$$xN>rS@bL6;u*s`N z@bx2vT$S{i?*;3M*h5X#JR@-<5Vz&hDARrTA~Mm8zDZ>Iz=QgV2$$6i8|p5DZkNpl zc^`|V@a%76!#Rk>-y~lv9xz_O_J13c_!;rLKqF~uw^d9`q_f^((mAgKvh@_xnK?PL z{V=M@C#k4*cz=-t1Ipy=_XlTK5Yz{!mj}}ae2|0zHg3Xq3s{s)`tJ*pOx|4$%dpbc z$W3aVeY8x`6UHHz)qe0HQ2y3C|Fra}y9{o8PjwUOwsZ^4gvuS&_RchKF0k;bbr$OR zBwZ2;!%#8VTb|wSHIQg&d2VXi_hPj-ufk=zqN%4|QgUZ5X#Mf!M92IF7Ry4S(L&k$ zqD_~P>!ZeWvI##w2i(xcNV{G=4$$cwcg?Ndn#U4`N@NdyOTo;~qm26&=A{#!s>f|b z<#C%Cnakx&Y4|9xEW{ZY-r?T$m%f!Qkfgva>}THhISVtK=f>SXSdlT~NrAm*rqNZ@ z@FsI?cUoMFhYb^mefkyUY%@hb5Lr&L%OCybbe+pZTvDppB`3kasqdLbz^Dv! z6q)7G+ZGMv1tw<9=;H;)2mCvlF}VCB(W0J$%$6`kikUV9JHgmR!=4=;|C zSi&}B=7UiEaMY1vDm_BzX#RPsxOn@g1(8(vCu?PA=g5~|)znSXW`eVV{CckN5~@%} z@t73N6n}DvPmk*Rxgjnt=32TDacv71-!Nr;<=us~h^_e5R|wj-0q%P9vTaC>X*MAc zf9ciCWmw+VPu$qqh>vecB!x$~|DaB1VXrAqNu1ujVWc9N<;m&c?{iG^nD2y&BqXc2 zi7f#K`(_Pwh0czn+B9FvmCmfz53*=E{zMuR^F)C; zCZ-+_>%0=aiAFvTSRGcTm`_b*dr&iT*O3{ZS+f|#_Y%d>#W+70j z(lJV#tr`mVv$!T({2O;rt9`RGt5HYXfx6v@ru95$Bs$BgPYt9hLs*u^7__>6n@2^_G*Yi*n87<4R`mmvajG1lj zuY3Q_g>S1Q*F6~1t{J{pq2HEwV{`MWu)@QVG1iuzqr4m2nCN1$3Lg8a$Son^?>u1L zT-2hGsYulrja#6gzb+Za&%LHN_C}I3{|%*3l7)@QN=-q+R9vBH${_(MDRDR){9-{D z1f6Jjp~L)9P@M5Rl~xvuTGA+|#taXWzFN8XooVG@o|7*M=Kio=c~uY`uSZNJ#F@*O zre^lc;F?ptFqe?F${Xis75*Rp*8V!Wp;X*=X(h z1pufhIQ3VBg!dyY3j#kHj+H!U@k^Il@@~4TH*{M%>~QIDdQ*}pF>(1v$%Eu3Q@W`exq%o2&NP5>Tvt#e36ZiS6H`B;v2*R;>{T1eP!OH#1`P2`Pbp2zM}T5ng5W>I9x zG=7h65J5CGmL_GgXk)-YxVLC(RGeigy05LJnp%{w6IYm4Jen)dcRi9jbi-;TJ=*{c zo3g>^;w`~Q=}$w2qng=H4d#g>3+;PPev3(byhs`u^&J|A#&J(*=Z@|q>#8(+s5-|K zN=zAg>|8WAb5y#gI98cvn03Z1#*58+#Q zhFzj0PkgHbVdWZ5Z)R?7S4OO;MOJABLAfXN9R3}5N{HgZ37oJi6%_QxQIin0I!0T` zbK(Qq4$aHbTz{9x;%Ea^55opZQ-o8`o|QP_WpgdS((P639F7Q=?2b@Qi$Lh6Ia0q; zTq@AM`y<%M2K#!dWlwKyHn}o9r98v4kfNyD3{Hv2ogDisrfKc#D=+Uf+pa|j3NI2C z#5PKnKW$ka;pF*o^e!uV-wi@giK7qaO04G&-OXB@zIE~Lu88785svvaghfCdTCwnCx3CnBOkLJ_wbR6V`kt;SZW>bix!)BQ>?%8?z#{lrMY(FM& zb~oFdb`3XMzmMh>a(pdNG?4osMrli2hmMs|kQwRLqv~{LB|%g^Mtaauc6X@JVRH2y z)iTeN!_ESQz(VX*ZUzLm3M~2iFGVl7S7=4%f8H$9VwU(yw|mASW6b>7^OeEG;8$2w z43+zKxeHEcLHbKZbBKzz%5kiEd0P473D?!RbvLasS;w`zLutYBv^1iP1tS&Ht%Z__ zz8>x~7xBO4IRRa(w;yX8w;gcL{4}PgUu2Dvpd}<_R1Wkk2x7> znLXv3&K`x>OgpknZb4X;j8$;ZBjs}H$zpR=_VX$&=2{jRL)1|je-G6JZC5cn6{S0^ zg;Adg5n6mQUA$Vm>mfyZjOUp3+){x{w#?Y8K zI`8#?Kk4;X4y!HJ>huFm;USFyJtAmC%ZtLr^3L3)K^rQFtc)l!LSHeu@rfy(^DlE* zy}xs@FEo`w_U^)<{a)tBKCvdnU-5bib}_wMP{>YSL8-tHCFQb`Zkgbrl{i=_d>A*6 zu3T{7-AI>I9vmoDT#Gqu77nJQh+3zNZoWP@FuNZ8hqQ-9GGjoW)*a(MZ6~d%3n@NM zu?@*hRAE<`>HP$+m!rJGohWnc-IRjCl{Mi=A0SOsL;PgaOvT+X;?u(weAh@<7iWn?}E!D91sDG#$j_~eX z(^p^fgQ>BmI<7Nlb7fQ4a{SKv%J1r@iGW*oC?hL6_ORA_X9b;R_M2%vSaf1`6ubR2 zmM^a0Bj^z4Hffv+pFJU=g03DRGt)wAr1gu1zBUkF`d*(edzPEg+0oO}(TCow#qy20 z_DsixrACi5b&z023+s{(1zpI}b&5qj+oRB|We%Hli38`mm47qi9zK|S93MOD{>O`S z&9RFYclM|?RKBjYUNmri!9}m4q!m&~D|ArvJ=O7`wrq)l=ib4z-Sz9yi6mH{nldH8}y?I9f6fz-RRX*#mnWDhHjJf!rSH6O>wWg zCWKC*JnqYcwJ)7!F3xaTtnwe?-;wZ^J8*Lk_t2XREgh3yy*57iBcbES;>NeAlbx(0 zyk{c}gk6gpx6T(DxjH4Rjwhd5@EhY9#S9OaPZPUwaH#o~QjH5bJt<_n<2+j4ZC+1o zVrCP)FxWhncv&;f{=9TR`Hx(ON9q=b6$@ms(Nw}*lc#Fi`GPSP?_U>i^K*ZTkow@m z&ujC^uqQtKD0TfTMnlPL;ddwbZigqjUMruj3JtndiP|V#A=u)_bljYW$ZfAMmCwd8 zz|#l9tkK}4)ab9#S>-woC~Qs3rONfihlQ^XzIW{w6uA^vda&LnN4`KF-4u{>H8Q-n z3)Z27CP6<_SKh4ZVau)7)-5S1iHeb1Kg$CQ8HdPwm_A90u@|JPijoIBS}{>Uxo4Nv zQV{wfeUvCS*J~v!iFq;o2Y!AUtxHP`gx78&ZNrGKoY@KU4lQL6;{0BcBi+!Gz{h7G zJU383n^0%o`WAW*&JGr4*Nh)U#>_<(>z?vT^Sw$_UGg|8benLIv7NZY{#~x0v|p2+ zpLvF#&*c}(9ct_ehR6wtE5puqfy&BH2xULWmN;M&>_V6Nv!-WyLKE53TrDa}#YrW+ zT@%WgcwhF=y4}i;;N=T3?!i{a8to2xb14hmFda*&6xgwG8U8vCCG)6 z8W7oHZM=G=$a=nChUh7CQzZYD)wM>UWYX4z<>9Qtmx=YYEtSo}oZ+u z*EYzy+lFOSN3+X5J=seX>@<4j$J#j9lN~S6XySUy3EMWi&bopK|9gtJXYetyTwtJl zCo5=&M%_YtLtuker15Hal%$?y#f%I8PLN(`Y@M)<15Aj^PxrlhgM}9%wR8M0Sp_H0 z{h$;lvyCGDGep8fmFfDUWn%fLFNukRKX^D$=p3#-d7}%AIx@&`{;-dYB?n&?#>RNP z(GzAo1*)VdxwO`WMv8s7& zl~RCs-bGm}YJbN}!qyJrg~*&hd0K~@z6=Et`vwvoZk23AsIE%`1&K!tl73OGB;@_s zHoDN}30`#1Og2)owC>31H!COxetKDZ<01=ATxapzN+es*z|@ri&EixDzJ1UG-RrGM zYGcxCI=Kx6#vK`n&m!nnRs?;5+GM%2Rg|4bdHpbHCPH5_D}T?eb}&C@;7T8%Y@+IP zZh;|{vSFkwTVH#f#c8*D?(D?qY|ldn)1UdWkSNthN?6v$&V)E8dl{lW-7dU^{%GPM zgBqG|KCqXS6c^;SD*5!A6UpPQh@Jm5x^oMQDC0xJqM?}STnAM7lgN`m_BZ-0R@mII zfL`C+3=?98(cDGfA}~r}bJDE8b;{N7aIWl`c*C2|k{&h|LlQyDfdOau3r$DY=cx7` z4R{Qg;&eg<+sy}#h}sU?e{R~<=Q;%&nz_3;qm+h5c@N$th~man_K!Aw9>3z|=SlPE zl2k8oS^GAWOmyhhc#Uku^k}Z{akfAL4YlEF6LEu`pYM^7TLadJM%u-d=W%mpQvGs# z))}$uQcgr%=*XwYrN0$MbDd)3jgAdT_LoTMSeZX1BZ*C)t?Wz9TiseaFi;!N9wE#; zpBlZNl%z21Q~uMzWZN~ny+O>_W3h^8gV;YJAFhD@#dLu_!Hnu|2l!Re?tcUBt=5r^WiEaOpg)~Zu>ImwT#&>U1muL4< zk||M2IR>n<{tO!-67$MhzGu(%`i40C@txAg$c|vRAYDVFwF>jF#WE5@IaOdR6aNJ@ z&Cxjfq7>skGJRS38drHk0$bxdKPi8IdH#)iehl=vLgky9efG24{J8HP)(UGL&fHFA zqPEOWT%W$i?yc4R+&$EH}(;~RNSQ?T8;GrMHmaqFjM zLnHlkz|re>7p0fjeuJKM;e-n)O!O5|c2D^UjITf|i&>%Z! zH)I2|DcLC{^E^F0#(Vf_@qEM?bH!ZOKoI7&YTcZWczA$%Bl&5}H2y2GkPs)f z*HG5vTejRQD%e-~)bOz1Lj){_uu$B{gWx<4Ls4Ps)`d!y# za*Es6=qG+qDUXh3-*ED0C?4A@$JJkZ`czCG<;$?D@g_zf{;2E^l`KRp`zjxe$#(DC zR@Mp!zjWclyky0T)4boJ_+^+Q0UfJYlY_PW$dfFA9$Jpj5hR2_Sk>Prjzg$f<6trM zoe(O9;kyw|3u!{%pVbCKJ6Mjw$xxI~B z3ps;b=n&6>QYFNPGrd=a&19lKYs-Anqkq~Y6+k%S>hg1gjm*&95{d?214f1Uw-(EH zEOb>fnmR>{Xxr~?H(A|Td^jz%|JilyV$X9E`c#Ngce=w_9}!(gRY(%bv2KvhH^&kQ zb-PrtYmg0yOxADsZ{8@)v`#N3T6urAJbEjuW5I}Z5w{zyvD4PS}!4aI4nXSMx zy{}H?pK6pDjfPY(M#~Ywi8q&iq`ZuX_Y&~g zU3=fU6)9dCT&|vB!94pSGh|q@`r!-fgt77IZHpjV^6v*n4XYGA=W7I`ih3>!>^R`= zH!w~>9d(?sw&GzQoPwEEF+q{LC(^Te~YKa75o^?Ze zMQb~VtEOKG*sCxDqFLzWrgxB#LMd9{VmI! zm9K~0XKfG2`bLB&(`&qYH$S#P;v7b2v7!*S7de)}#6J2gjo++Pst|dQRWKED&THSq zg5@yIrMd2B|KF!Kv)w0cOA5}lvwkws5%VvbDqMN6nEOP>P zt!^B5dB@!i!Wo`Ev&!bgS3xn_PIYppS=&;#qKGUx?`=NE!By1D82&{!;o~-nHJxga zjuUHq$2W_fVYToV{2%1w|2eTNE*sl7|Mcmx!0?2A9QpsRU}^tfsMG&->RU%oUzeYx z7*Jr~&u)OXtXOYXkNglH+$4XwsHdRNb*v^kapaS5!d&B9MCjqqzUljuZ^xw!t@ayM9!TU``0L8 z+I{NBL5#Y+*eA4Thvh=_={ z?FBR|LNf&j(49dv2Yp3Bu?9n+perjY6MgdJ?d#W@3q6Z1tY~Q9|20>>U1YVAw*wIs zbd8(q>r;!{gM@B$bW|Y+Z$!{-+4CE5kU=hVq61*AKN^%#^T1Gd1?g2+z96`Cs@*3XLVj`T4;`86b7*0?8XWr}1a}Xq@;cdsIrNo>l^lbxox!fN+2=;y$Jr zL6_c|nmFh~i=?8ZO$H?sJBJYfD_i{e74{_eEk1kq7{@^x{?E8 zW5?iIWM*V=9)f@yXkgtgKgZ=%`Q+=O&K~E($HC1hu zhFRp9cnfqN4SuyvzU(fHU3)}NpPrsT>IS`ccz*+ZK5)u|84sjyE;6m-`MY+pqKY{$ z;UObE4+8^(*(@|_C!91lHC4}e$|fjS0c}0{S`_5uKESw+KIZ_rV&pA5ccn*DerUas1ehysUqC0Tx3Vu|W~UDF}47u;Byf zK^GhP@goNS3kpjpn=HdBSUCxr!=Q?i4$wD&&OZ||Ln{1ye9a0BTOWmkOpr$^ec-yY zwY3FWqc7>{jD*L1@}AhWlWgEmy#k~x^%ARzZ1fR>0iMPO0-=HG>gQFSzb$w|8>)D& z1GHlTnLF_I8g$M9Osb~{sUe=vE7K3mD4-iiN3e?w0@u~h&=3To2Y_$|EhY#o@Oq|= zc41J#p~2+p&q1F!t(%jZyUvQn!dIfeY*%tx<#u{zX6El&t;`ufg#c|VwaE*RCBmHk z1ZqqWoZ;bBnmd{42hht1^e_wPa8r;P1yUf)Eno(!!q~&;i#Ht2#RpKI{c{D8L~m}| zO`ooBY&LqyPFds3{BXPQRM28G?E~*eWWwd`uy)>IV6m*`Gdt5ySh3oTj)>})!ax&aJ!Lao z3H|0-9teEnqH@-&L7Xm&sE=22$GYM3D2tkB=ewcyksJ=pLRyHO^7Ib zc34)H_T6VZJO(Ir;&%iE4`I88UiF@?E{eO)?#CP`yYEehfo#n8hOl;%Fra{;k)8pp z7+}*(Q_YT<3{Oa)K3-{`Gud^QJKuYKHF!pdeqGjbhiJN_xuGG+A_?SuegJW=S%&WK ze4-NY#0+_!k9zOs=9VZHRVeCR0BxIJ>y;uNC|FRDc!O!2Bz*}uuYg!d0aL4t^Q?QU z%Yh#$tiznd3GJ7WD6Idt9q>1QU|t3 zki$5_0;Htv{&?G}MGDY~+r_pNK+eoJ=ecN^2 zMI^Za`9T2T!~PwHwS8&Ohys8uk3dt5;Ml~=Qka;`fwj88aJB%pWH?np_5o7772w@L z11KU%;uY*;z2L_^RNNkp1T8mghhrclh>FrMH_r&M1r~=e_$=550aGX!Myb;TiNv3} zl(b6h*)KvFHbMLcLV2W_8DqXdI=3)-clUJ%NfJL_KR++8K*jdpR#c({-{Rup$hiv; z57Nv3Y&xu+s={WC6%^&!<*+8fTXqn9{Um4oOi>8oC-h}iSK+oLHBHPm3rE>!}8t3!iA`?D6&$Hd-M;xu7xCK-m=%CpG{l- z@k8!xY`kbdDDetBbb@H+j_GCaVIP_~d-g0$0qEC_q#`3DqhAKo>M;NplHz-nw`T<> zK!ImKT*#sY$d{_BDo{y+WWdQ<1nDD2;9iPr$ovd^O4xP$DEXH$S8zbCl$4S(?Ku+s zQ0?IuZ8A{4{^R8}YquePH*xVMh{}GgTF(xiA01sx8CKUP!oiKxlE>Hx`z0J-DzDbi=}062_T1Rv1u3?HGcQv?C$6hmy$45Lieu8 z2V=8GQj|I>w3iq3pB=x(@XZn5}k2 zGx8^*qRG(guGSa@)-8KGuxUc9Qvg8)3m{gDA~wR;0CNHc2B66AxDXmwP&W>sUb;O| z+vt3(&Q5lbe^6G4o%LYpiYm^GCm?o{O2`zm*%ZIfjgiAY+KJP?S(n|p&P&$pSo#YL zbf!gCyxi*B;T9JA(8R6IzR{(aQv8h=%zE*15`f@z7nmrTnJvN@4L#FSi`i&@Z*K+m z>@X^B^QWLn>*5fbcZAay8nflt(VJqO8T%r215<2YsI}El_Es=`VJ}%3c4{DdFdb%3 zA=s`}qFE%BDzxg5shF>>WS8-4+Bt3lA+d5|;zPnFt&SWgkDaKw>BG_>_uIX!LvnYt zyn0o5mF^`{4*@m05O~7)ogRGUQ+y!yJ6OtZPf(8v4Fy%rO+e2XAe%G z(R{#Shn{lbm4W=^pkPW`DOuSukS~L;*(ZB_I4!<^{|@wAp=VVmrcX!nx>$E)rzcz@ zC1tbdkdsY=VyO#3{ygE*%=zTh(9WRY+-?g+E3{F5IxD z)Z0Y1B**LijP_Rhb=tnVb%!ANPj=tOzOCB7*nLUXz8fBl}%zO{GnsB`eJNr_2`OScyD zoYqf!op3n<-$4QQO;`8Nv8zR1qnB_tcMS@$LSb*dF|Z{$CCQ<8eDKLVJ8ndQW(%Lc zfAT+|vAdo2@cyS#SGv3Jt7XLq{CySLdy?sHiCD&BvsPuXEqv z$dRCdZg^GvYdCSbA$UA2E`jCT7{}Ch&~iYz+s~8nijz~K8IBtI*y0u_o)skwKLU)q(i|r)GF}y1JUaXsiFvqL%5eT3Z+C zrWINx89+3jOUHtucsj8 zlbi)g8|XK!AsYwdCdu0Nc2-{AJ-|9;YJSC#>A2pi1>@3BK|yhCKgyjpU<`nVodmE> zV4t>HKP03-S^WJnG4XAX#j35ZpM4}Mb%Bu3*2c!sdAV?rM^S;D-L5VV1b zQONfnF0g9><_}Vy^mOVU68AQ@x4Ahvp*~;@apO5M7A7`jVsmguBe+O4TnUKI-f+f60USl$UJDp4QejpYUv zSVFI2J9)+!Of?>}uXP>rSe$N+<`R*WwVdiV3CrH~;74le>MEpfuZmwds$G<7nelr^ z^!;8Nl7Ab4Kx}-_#g7!7CqBTz4)hVdG40`D5(is*qWw`uyW~=AMUM&J3T?9(qLwc^#oeKmW79ekA*- z&w@&LUeL9BYCc%BCw2M@{&`NEyXwZHcW@?`ZJ{P`u4R?f!aUVTVW1l!#B4oNAwBRU zjO~Tvj4ysOG=_H%0522GvKP`DBO-A82L5;o=WE6!usjp7u+b??2mC$=%04n?b8uA^ve;u``nry@8;=4z! zfwUUx%K1DwNBg5QXXx1mo=6(HJD=MkRr?7$C;DiA5n}2{Zloy^iFZqZ)Xep8s}E4e z5;I$!!00=F?wqqT0sVDQ(_$bUkeCUh5|30yzrPnHKoe5On4U*u(Us%}wX10U_TAel zln@u>u6~xsko<}ZI`3J{IgUmtr7Ku3_zt+8@n7J0Ru`W#*Fb1`TyyYzC5lFVS)ibb z5tH!1oEEWtxl9ZghI{bA5n1*e9 zd651>@dYY&H|{?3#Jn<9$-XTtyMx>Baxk6D|8mF~eddK>$Y;qi)Nqb-phs0}NJ5Cj zl@{x$V}TQ0xE=MQEO#qA>)lEtqU&-620T#&&A=q_364a9Z#jmFM$~2xV?e(r;o2H@ zR!0mjOi*t=1dYZ0ORL?po#!a&L(_Nh@4tkf&4Hm6E1xr8nj^7U4wdv`+ED|QvM7lkl=df z0^Z6~Y-Ui>pse zzKzYhACmCQg`uKM0NTmWF&(R(vdc`txO2H5a2tBF^o6L6T8zF3BjK>*dlJCa=v zakhaxTfNBqD+tK}(=%-_LR5M%Dq1T6cQek)3O1N6ikGGbuL3NUpl??B;lrPaE$(c& z0mpYIRc11{7rKrXiw(SXxm-Dv*UL4#Z232cItRoyksWbwzI=HO5ep&->hr36Xxz~O zjKm@AOpt-fzY{M(0;ChabNdFF|AfsHYWz1%)JP8x5C1eA*^*HQEh`{BAZwG1U^mcT z2Z~rzQxk-_PypUrDO&~ew_6)@tcd@FE*MCi*Zg=Q@F0}Ix{2BQ!rzww>56gaW zc@=z{Gx~wrAj8%xqtq@5jhZz`0c&b%LW~06Q;?8w*v-k==fW-w_d&p^P$q*JhbPCD zl$9;c8w^LO$Js+BOPvHhS*2gUHpOA`OdXY2Q~_6e1j#6?&<#%8X0pbL@)1p~2H&d! zcF$H%iTbysMY|CB-r#baTKnz%Y};KP4&~#ina!bfDjHo$VDe^h?WKr@WbJ=F;xm(j z4~HBOArfbI;PQs}t+W(-Wf^xJ_3&@(T?X4|T6;_l+4R~lD-oFPDLzY^8Qjmw8-H|yRUn!r*w*K2? z(pGYA6Q#b{PShjO3TM~5#$*0mhDm!k<~sc2c;YU)(PLx0-E1DsASMo^?fv-F`U1C0 z_|vHp>hvj?BX}2eA3m(t4@J?8Q}`k$4+a^A#dWA*vf> zvd0(ko_%2!Ll1ih?Kinv;0(`rf3IBN=Z_Ch(dLi*>@%8mnI;EaJ{pq zr*(a@490^OFo|%xQ~+0cW)>DgV4Sp7)DCxUAkYsXj2)FAwuB%!Z~I#j|BEF#?dG(? zr~@K$E+{xWe}1X+V=UNKV*XN`-@cQ0dH9Q#&utO&KR0E`vFfTBuiMh3?^e6)4#}-= zHh!t_;Vk6Y)$mi*wJP#um{3V8?1YNwj(JpHs-h7TO@W#K__MGExKw+0;ac42d39n8 z)Rh4K6^IOmcQS(ZKwFHIs_`QTpp3o?A=(0Af%dnu5&kCGqP7(+KI6f3cNZIbhtwcM zDD%;SrgFMc`9pR0zLObD%#x+|epM~{B4pt1G%`r&-r8*XSqIEj)#`*g&DqLQZ-2~1 zK)vwXzWp#R+nIwIu~8OCOhN*8vsqX(FtE#D!r<6vQotk{JgqYnVEUT_)aEAfpx-SvB35|Mus3OcTMb)4DwpGOPjDi{t*QmKC!EjW(MG2-k)4X^1)Qv%puNBrqI zJlNmlILycn!yWzE!(oiwVf8+aP40XB`!;iPjOsV}SlGB(=()J0n=V2}>rB$y(4;57 zUXT68SU`2q%gLWX;8H+c$*}j}XMt2o0%NEl^>h3ha%{yvL?~a5{E@*kL_RqaNkaoI z!}03sYaL6g{;MD)@;lAjrZ^vYd80=|y>A4D{jQ_JfW*NR04S1X#@qiJ%IieAMa)#~ zWrV%_ZVWicnR`qvlaO7FCZ`qdTywQEv>I=RnqrHmz<&x1@?L=5qV%VG>zT!)3w_yR zkd?E-y$z7zrxO#Blfj-t2`CSMGU;;qtFTdGj>JFc37g%vCG4WZ}Lz6G_AX4um0CP48y-17MPa*We_)*l9B@JCv_PBjCc$ZR7pGK zj@SmW+Y{4|hwA>pKe>(>?b4%;1c(K=m=yumH!^%5t~6Vt`F9}r0ndb8Obct`b*M#L zdrFS?H2R1IXRYQzNbz~hdYAAE^et>Ii-U#mVP@8o#$`DwP^h@j1ly1)&U*_SsTvL@^rwKFr)Qh(jVB)=2?FQFS8l_hhDm zpr+O?T_PhnICic+Q9iTzk1Gx+=jsh8_%b3tq~eph^XD1W3sQn;Ka_xhFWAQ_lOb+N zJ{twXCfpWrY}*`c!worH1}0{qjG14m0V<>iw(M4EQix4b%0t%PpHZao2NLy2i9vFb z?eczRvBjAd?Egz{5(FO}|2g<5{}Ej+ekro;GZPZ^S^-)oC?ce!q(Z(A89>2IvMD$= zRtIb)62|_txSE-n0p{sS9Ly@>qD1g}num!k9nGh#kdFBYK}TpK|E&SmWw@`2W}7~5 z!f7(F-1Wt6sMu|zE;T=@cscZHxo!K)^>~85bj1y8O>Bp-%%2NCqVlDGjN$V)i&oiJ zai^b`Y5FY@TrrzGy!T8mLAAHTnQs8?srvU*UL^IDq^X-B7+p)iO=~$GG-T%I>&uA* z?A+P!9{NG`At52)ObU*G;3v(n*H}F&gY4(OoT=HNMP6@?tgYb~y=gp@wij~EmQk5W zwZgQ%w9xFhE6uYnqB1J?(5wHd{e;-&w8MFxqHc~<^9ADA(0d!BN#^k_SNZj|q{PJT zId7)?-VKvIT@Xg-D%deYCsARceGw8doRloQ_lFIhm2?VNWTwQcFayDoXYS|EAY?iu z3&2WR$G7Zka+>$c@on%Bm`SwodHZLz#R^7<4#la}()caxYnIx~rKkp6Bv>BGZTQ~( z_;@cbkFf*mDz&G?l^(WJO`$41ON1Hd%Hq8T5>iDSK@s^Z67)|`X40JUfp~jj(6A)Jb9d&)W78W#wWwC5}Z=HvXSXr}y7})$)))MidSUi|U%|(9*Z=#E1)p6f) zd#I~xAJANTW~VSO&o{v5R|z?r`LO6snx&)TZF)fwtr&{ZJKS8iw8Vw+eo-mE{Gu`h ziM{d-l+G3_WTK8BBQY8(hrJGNh|HmW23<>>|3SwI`Uvb(EwGX`kAlL?GSrX(%ilUk z&jyB%_0XR5qpM3%`v*iI7q4$f$Vd>K_nG524%w6Q2|lH_MjwCM))FzC7|@ zqYzp_LANchc<^Wvw4L*eV=f!ulskF}U|I0j6x&p`OiI*u=TU(E5BNDK4{3aH4p0j}vP1#w(*tu9IFbM58ZC zTtK5P(**YaZ!y8IYmfVrmTbGi^whT-AorG)Rc#W6=D%aRAErN3BZP46^J;wy-SCg$ zOx4OwwCpG;x~@N$lwT!A$H>HxIv{sld=K?HF^B2e(`dXR{=}N|-m1>!;~dws!2|aT zAajEA->)J3-!ZqvL4y+x7kZuuzcL8$8SbeQ(#-<5Tq^^=;(twX5t+wX51+mIUsyg> A2mk;8 literal 0 HcmV?d00001 diff --git a/node_modules/@cucumber/html-formatter/test/__screenshots__/hooks-attachment.png b/node_modules/@cucumber/html-formatter/test/__screenshots__/hooks-attachment.png new file mode 100644 index 0000000000000000000000000000000000000000..97825e877eeecb8638f910ff1b3c58d31a00f7e1 GIT binary patch literal 33756 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

    dD0RlTbCA}y1IAj3x#2K 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

      X%3 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 literal 0 HcmV?d00001 diff --git a/node_modules/@cucumber/html-formatter/test/__screenshots__/hooks-skipped.png b/node_modules/@cucumber/html-formatter/test/__screenshots__/hooks-skipped.png new file mode 100644 index 0000000000000000000000000000000000000000..c04402a6b78743c69cbb3f77d32e928c98a7cdd7 GIT binary patch literal 109159 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�bKYJqYIx=2rUue7SAigHw$#Wcg_*mC9-M!%Bi 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 LpG-Jmc;~+WuHBc# literal 0 HcmV?d00001 diff --git a/node_modules/@cucumber/html-formatter/test/__screenshots__/hooks-undefined.png b/node_modules/@cucumber/html-formatter/test/__screenshots__/hooks-undefined.png new file mode 100644 index 0000000000000000000000000000000000000000..ddbda9e475a8ff82b81b24dd820bbb849d8e5103 GIT binary patch literal 63704 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 literal 0 HcmV?d00001 diff --git a/node_modules/@cucumber/html-formatter/test/__screenshots__/hooks.png b/node_modules/@cucumber/html-formatter/test/__screenshots__/hooks.png new file mode 100644 index 0000000000000000000000000000000000000000..c8eba2eae6df8a6759cdb6d23eab5538f6b0edfe GIT binary patch literal 69674 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 )+}X2*VNg*QQm@> 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

      QGuJn=w?G%K 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�m7N2`J+fYh~8*TjNE zI2ZAgpe#tSd3!2?j>6PMhZ#WD>=*LybFw`eRI^>vrqT%%S`o znlE#S41`?VY;6_0CoaZ+#egye59TJQmcWJP$3MFuaFKuXsDkP_y< z@)m`=#(RxYH+Vj< zWxyk2#pk#!#NhL-2?kc=1}P6E%KlB23vIU!*3A#Ov3X&BeQ!?Soub9ju=FkHRl0@L zQroauf1st{t>+)>WAAycY}q8!MGcx>BPkfo*&h^z6xA5fUyj6rgAyp>!E#@65#c0p zJ3LwR_156j%y(}q0h5G;Gmz*2#)|!X!?4KImbE2V-Y#?Wlx0@YmJ6e0eV!z zHE`@L4*FrYf#41IxWlGKawM_v9uLNwb}~(<%p{8XxmObMnN8k^QMG;K$0Y#=)X%LLx$zM>4fOi<;v0Eyj>4;@?_h&S z$Wqx|9|Yo>B2P>yJ`C_h;UD^NKI%r3P-ARgD3LC;gjCRJ7TA z8zU$B)9y>sZ-pLhv=WYX$-B4u{)=~8E4eXuzs z!~WsJQk@wS95-KKkwr{1FE!kstWGT?NHj}{)=sg^RkoJFZ9%mUNcPy`H?`eF7IT4qH>YCDg^AN* zg@G(z+Rtk`g$uBrq&B5f2Aa%D*~paAhP01p5PKxvsr!fpE+2vsB*r|{K-9f>GDY0V zQdQzq{~K1DUQdy@fHer0DNcFCXy_Zsd%>ToJDldtTe$wMP@QIZYNC zmhB$vM>$+acDyca`lC-JDC9c28pTxXx@g6^TKuNvJ($4AVKqKx z2s1_;8xFK8tOf_wuv!4V_1AapT3MF(T2|xq?!_j{Drdw5cm`qt(PL?LJNC<*Q>AZT z&wa?DGfF{!tUUvEQH7SU?Nt+gqonWC#)pqR=DZ(m0+E&Q^lI_t`bXz?%eAA8zw)w~ zvmx;;S7?iexQ<8H?bn6TzLZL8JvOiWde#a4(%t*C_WlK-dGGM$udTJyOa9vk+P}rl z@Bjaig1qp*K^*@7k^Ij`^7b4;YHp6)Yuk?x3JJ2sf_YK5*+1;tu?{C2=FK~(XS|Q4 Ido=Lh0P}vrcmMzZ literal 0 HcmV?d00001 diff --git a/node_modules/@cucumber/html-formatter/test/__screenshots__/retry-pending.png b/node_modules/@cucumber/html-formatter/test/__screenshots__/retry-pending.png new file mode 100644 index 0000000000000000000000000000000000000000..74c5d578dabcd0d5b9e768a348336026c8bcf793 GIT binary patch literal 49220 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 yiof@p>i-qj;pYjg$deOmym^2L&=FFa8()O|XIh literal 0 HcmV?d00001 diff --git a/node_modules/@cucumber/html-formatter/test/__screenshots__/retry.png b/node_modules/@cucumber/html-formatter/test/__screenshots__/retry.png new file mode 100644 index 0000000000000000000000000000000000000000..4b3cfcca5e8ff02415075aac16ae757145d31820 GIT binary patch literal 112552 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 literal 0 HcmV?d00001 diff --git a/node_modules/@cucumber/html-formatter/test/__screenshots__/skipped-exception.png b/node_modules/@cucumber/html-formatter/test/__screenshots__/skipped-exception.png new file mode 100644 index 0000000000000000000000000000000000000000..e59b0733cdf28676e2dc57e93c2e3c38ea19dc9a GIT binary patch literal 59140 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

      ;R{)Pwtwl)T z!1}L<1D!1-b!K5U{Cn(~y+kJLq`82v3Xfl(f3B-FUt+&TQ^CLYK4ocnHTZ?^UabA} zSa`8a;2j&GGTy?;)^Lif`DZ#wHAQ{T*TvjjXC0?b)MS}ukVG7UvyIrRcYJ9dCL}Fi z2gM|@=n8v}MYKqnw0T1#;e`-=z=Iib2r9Lj5XIjEB*(X2tAaCKPJ#vP=FgkZ$0{wx ztB&w^#LuPBWj?UAoC)k4FT(6=O=ihPTG(L_xNUdkioI@7Lgs$uh|O0UQ!$<50`dzO zHfmG37PZn!StB@8oSPBV^aQiy>*VZNVmN%*q|fVL=&qVi7Asf2w?EupU-xP992^Ba zG$imQX;jlRcs)ekY^oSH^~WGK>P=WYE_JU1(TSEC zDRl(>XAu-bQ@G8~B8XTr-CKR7%ZN>N+uTGUf#s_3Maow;u))O73Bt*Ib?yKpSfy?S zLdC&+ZTvU?%o#7l5OZ(9rnK4`?2p0>SJz5i{Fli?!f|L<^5a*%L&DLp@HLUS><EaIda!-fAvV%vLm^vznTGTy1j^YwkXE^?>U~2GfhXuwi+eqIK=j`GVkL zc^g*K@=7D>TfuUY(Nc@6S3rOpMxwE|_Y0oDG<1yZBDbJ?N^$jMzxOZSi$p#{z@k?I z1kOfitqjdIIlr!QJrpamUuPg8!n_cV!mHacb{w-I|F_xpbk)Z@Wp|K-56*U=`bT)4;G_vQK^iIS zm~CLv&GYq#5>Ju)s1??{18LTZK7BX*mHi3g&4LybfyiC0JZ92TileHA4~vS_qLjh+=bdw_hUc}}4{<}A#M64DxXaS|`%2>RBWaFs z1E|N8gs8Cg;NHZ$O#=)XK9Y& z!~1V5d6kGI*b#^&7*flnm2C{wsAlDi`7>FaK^4q+xC_K)=05Qw)3;i&L-~z;7Xc}& zzjarz)Aw+9niLdK6l=Qn!W-Pj%0vqp-~%tZI`>c-jP7R57bvKim`sX`FyoULS&=Zm z#09(>>s(jizsJ@cBvP*xQvH($onAusrpzpse7k@8vgLf9xTWY;@zX*CcUTGWHwW08 z4KJXO@toBKj?T5XaIbzPWfN_@o-?rAb$C>=3srC=A@HbqZml zQwu4g&+KF9H;rq{w}cxpfbeD5cn?cF0eCgMM}r`417Z8~>F;whTEgA&;r;bW5@lDx zVM?6eB&glUcVVcFR#4D(wJOl`=v8Y>`gI9lfPAx8nbZMnR3~LA4ZpaQ$ z6kiE(pEF7OHdw#M7+m-?W5qVpj=!^&(rCe;GC{4(x?}e;#_PoV5_u?A(fr-gKr-nU zAL3HI>dmYl7jKAVte=>J%PYVGc2-w^CS8rvRV zzLu5OJgX&-qCyNd=kQfXf0!*zE`#1Rk#}!eA$$>XJ`q1hW|ZmUFto7W3zIB#VxC9$ z7_Tw-p3F`idkB7a6*sfsy;rUsMvrr#Rz_xURNc+pq5;Hqz(O^aWm2)IpSCu>^ry_0 zXr`E^`c%*zjjfRFT@p_V>`Li`FHwWD-Qn*78|jQC1v`B>SAO<7Lv#&!o`oyb;*$H# z;gtC+n;)K-f_t$I<4qf(ZN^)_7AQ^s=xG;ea=m_p$lKTlnPs%*Q_DDvAnqk{&O*Ous5UZ`ch6ysuv3ZV(>DDyiD;WzK+F&I4`dELFNPMiw$#qJbV5%0~`?*=$?LbDhWZqP6$I7B%VPv zj!uyg!&*3upx{o$gP&-m;E|b}IVl<8q1vS`u)`o*>1&&bR*QT;Jph`y$(%%&M0tG! zqtTt%=2iZxcQ|cmo5i`!&H0{x_+57>{&cZ2x#Y_N#Zry3Ey)M8-mNQmq@6FDfESDx z$WnP9BuEj5>S@bvkJt#+BLevAM%m+(An|~~ix`N<7jIGg^>M90A|HK`Rd&@0ELesU}%;>gmMvbgkY%94j9{HImowh<5=0`dk-viC)8PX)>NdXluJ{p9c0? z_MBO40Pc=6wb07Ffuy=WRAJjT+s`0LUiwq_MuCL8*qwa|UU6mte#@hc={)POUD|G# z2DkgJ9kd-Ajuhc94g;9#n$Z0F9t@f0v!#vs@1Wt7d1C3V#SZBiM&3hOLw~yfp1=Pq z2f=CSxc=d&_0a;yVt0bZrb;LPb!F;@Y6ZSJwEkIP+B<9EZD)p9gtq|!RU~iQx_Qjt z9^*-O;vOSI)xS34yqgfPSodcwXmc!cb8`ch6I&f0OAtFgyU9$WJrg|J_F4?bI<;Ir zs!r-j$a*Li*1tCGN-4TEP}`kr$Y*_`$G(kY^P*L1~c+WdBvtMGv^nK zo>i-_^siYhfMM|jb2a&8m!&jtD}7Q&OPOv?%d3ExN62ZBKB`y_PAJ`3?b1&h3%O9* z_op7*U#cWh-c!cI*b;f84~M$HJ-uYP{KGIqNB`(V%7pmvMT(Z&aZ{#eO0y^{Z&f`4<)5xb5KmoGEpmVDP_0Dfqcu(|UTP@nO z=%b2&8lP+RK{zk`+O_nZm0Mxsg~Po?!O&&eN@PSMTGI6w>KK?ck;fHr#Ta6y`d!vC zaoJtjbcm1Cj*wfWTB_}YA_no}Os2W3pib~}anHm*#WxKw8axfEpTg& z7`hlujl4v64LeB8>rPDS`@k+Y((InF`OO`2t?KXf2Vp^IVoWanOZKGZGZ#ho%!eKS zhA+$pNr$}E;sUlpJAq4wn)eSqW=12I4e5;L{S*jYX6Ax6Z?L~VA_1S#_iLl$AAP|k zMm)Vw|7ih$_nsXs5xZlJ!OgU|-U4}aRi5Bw{_TEDaKp(ECC6Jxq_EHCoYw73SC?d2 zxGH>)GxSR!@wy!^^PT&q0O3tYM~*QD^G4R`=HeijAfV$*r%(*ZS8aIDq4gXl&eU%0 z94mfoU{t)U{0LLSx_-FO*l2ga-`CZ?kxLB)l#09f7%yq7wzjvq`er`Bub}yaqh7;d z_M2KmZF=t1Mak>aJP<#?wTc{tlRR>tdWT1%MAB-{`Sbi$WGA zrTdTE;a!(SOhpz`;blKUN927K>j@{u))rF87J#SVbcE2{TMgS2w>UrYO*yNpEu^(N zeCL?HM86tIo<5+0`m@38mc>SF`c+~BBXHDJl%edOqW4qrbB)RD1dK1I483|omA}78 z#n-;o?$AcP0jzb$Ycw(zp8Bce{siEg0ttnViYRNsZlxXS8prfkwXve(7PCve-e7`d zyAPa_o-M|sYfPoYAm60QwZ)2s^1B0mSK2y^HjRnC90Z~y#z$tC>T5A;a-Ul#+UoQ5 z`?whEke4rPNkx!s6*pc>ji59T8_{ZS79w{pTYb0LS}J@*ze$tgZ)2AwTgWL4YUU7% zoz*N=h~1jKx%r-;Uok^whp`Zv9;=CI=g7dwd+l^xu4g>FXNJzu74Vu?e{A7;$8g4$ zAFo|RzMh2GT~ZO~`)+qvz%yDM&xr9Fv)3I8cV<(1{l56RMV*px^qx^}!<;HIU4GyT z_M4XbpA4r5+Y1fOei=}&&&oQ33mZSl|E!IE5g~fibd?%?LOXZ;W49kic_qFX?OJAg zI85QufAviR_wh$pY|H(I#ia&0=BxoTvYuKcM)Mfk(d*mZl2Th5r%px)y^H$Q?cRlz zjTP<^R+|&`OYt-w_3aUU5k=dD2HO)H_t_IAJB(GaEU;-n6K=LUz`Ge^1zNWxqZN~I z#ASWwPybwMO?zq*e3ufI&e>UIRLH$5Kf3pU&U#fa=8dz0u;@aM14%oBQ4Qy_^RqLT z$A=FOotZyXtBoe>_?GC&(faLjD+$@LH@57^7HijzIJMZZ3t_9@%^U55kHCdsV0@a;B z94pv|6%y9#-5fl_F+-mbdCOhE!8@Fa=PBqS37srYM%`a)} zIX6UOL0Y_X+eU4kiBUn`_YpeS@;u5oe5qqp-_@)T(vSy;pEn^0Nbx!XM8Ly&1sg-J zEb{=3cuK30_|BS=C;SSF|Cexc4semlI1P|u+@*ts-9Bb+k7jsRq^+&lJwDtMeQ+}Q zT?f%5xhnZMiTA;^|A_fsq3r?hGw^apU(CdS`rYAWyEpX(S@Gt@#QXSBDCmWQF#A0- z0@t;I!_8)V#vPfUPkp+3I*UTs+RfSJLQzUO8_Mbijw=kphiGGNO++u`1%3K{eq6W@ zg*Ka%|AUwCUKe{qA$weA#|c0;Yh~@yc8eBU;+##PPrUIy zk@;HeEn(2kBIjOyiATuXX&GUI__LED5Q$3GBi3I%f$QGFN`jfICd$kSJ&Lt8fT9dLdm$@ms3|6Wpy=FW*KkX zIl&m-HwljXYPi+4Rmq}@I;x{gWExMQUCJDth9s^}r?6`pr<#!g&EA(vXauPNUq^o0 zezYqvlWR!hp4cy4k_bhn=wVK4+NeQr+T3cj<&a-bu58ckcGf&(s>(yjN!Y%~$fglM z^+bm86!WDL17^A~T@N1Dn_gqG(QDtHe(C2B$URL))7%@G8lj_beQZzC7CoD**9`kQ ziPS}z#gg_o7U%7I#Onb@Q8>44*JG`^Jc;Bi!g8})&*vruV!L5-rOAKQx zyL#&_VbM5V^KSr3H&$2Fft>ME z`+cDd4vcMCn>P#{uMPq9s1xOgEeFg7mo;y%IPcM2j`6kix60{9GAe%auwvXv`;Pae zjdGkteH_q0CeXhY2r9@xD++0nl;mM|Tyg-XLHmTxS>(cxS$$Fo&ss@Qg$P_U1>2x(|< zn+Rt(XwDfJQ4W=;EsYSm9It@wJH7kbxxDeshT{`$G#}!vovK!hi?nd6qu?d+=fwUI zC^4niavAZ-Q}=4<{R=s7w%u%L6uv^}#nDd?_q^r`d@hk6vUmf++`jF9pTXZyU&R24 zqMkIxJ@cK3iii@ZxMZ~Z+5mAl+ghiRq}yArRIK0U zx8ZN>i?=|0SCcr*Z?3M=$?0ucZP0=w)du1i1nlE&UG)0i*bMSjV{LrtF=!KqIk_6P zUa-xOU=grT{2HTe&O6-|^)@V5#Nkxf{)kR+7M9o5n>T)%%q-@pRX3X`Y(Iu9tgQA; zvyZ(-K+Fk$<+CH+9mX)Bz3;ca^IE<)jnf4CuS-fwPSp(V)XQ@B{GZ)>T)hx%>XvcXF^m`a3QM)UIR1TgtFShlc9AxT+CYz^iAkv@3+b7<#km`mx zVF`caH~W2HnF`Oth z`B@k=TU@~J#!3c%%I;ELzXaV_c8Jpv?1deR@@wv6BZJ;r_#Rj}nn45V_ zER+ba0V3)<@c3&t&3H_Z;RQjqhmYneUd=410F((V7!N+GduQP;QuTS;%jN9SRUQ?^q6yIDRNl^ekK=$$r!uG>>G0>d$=WCC= zQVDcQ6v4)C7vGi)Qh0UUeD7jDfqfYZ91=v$N~CYZMWQ}$UmmPspl8eTy6Y?ggpcaS zq|uar*MN9KDaG7VE(F}PV(z{;QF6EIg0eIBAm?_?7dgw3XN>kS2K;EMn2Lpb+v4-b#02%_@^y>zA^Ks#%n#smf3rzF+!O$OON@C!X@x(g5M&|z z4Yp>wrzH7vNCr{<{SiqU@qf;%a%|qAuC5J`)EFKf20qT?-LxYt8U+#t@U!OT zSoP8W3G|L>c5e0|Fj4hvlgV*^_<+r*=5T*w8(rERPTUGq7hKk_AWr(v<^KGsv?&^c z1UiuMi-&&#>S;nvC z=Zk$H-}SUQ;NjqK>UJZ3)%`cXewOD;2@T%wd^m;6LF?PMX^>1W>MN6Cy|NRhy;<=W*`Zqb90XP{HFz^lYCv~Fkf`JIRm8Hsw)T+UE821 zj1XiG0f@(J1$jylkned1&`Uk1(3DaoT!)mlc8Fai*F2qAb^!8+^>gHoti%J_E;+XW4D%351_ zAF5dcX*Pa`6Z5JNp@X26SUlO;!{w4YKye)r!Prb@fHG9l$rr|4waSA45ZILiJwW*a zftb%p>_1>JQBY9UyTL~bOtS{1(Ry-6^93R9j74v4ES(~VDps=I0Yn1glbRsoczf~G zvcpMxyDQ>fW4w6z5?HK+sHjp^2GW1`!q*h=U~yP<9Gsjo8-nL@5#L~uT=&BC|HvNV z>%)+x(`;#CeI-Bce0kWXDnqByFk@=p@QgZ+>Cn9#le*-1-zp|2;YEIW~4YwR9%1fkl*= z#b4_WCYL1+IO?$0ang$%KlhAJ2_bm{yQa{knkO?0g$CYA2$SD2zb*RrgJ{b;kCLq zN;vdz?|I5rPY-5F0Z0laL{w*hL#LGU6H{^(2Y~G2cddC^6KVa~<`Di{C>6}}tuo$} z)W4^PY36S>*&nqTc=}wTBn}a5#tIa#5`CNq;hV0oJ%4~r-0k=YsSgH@O1;6RSHJ(` z1lnZlJD1HtTya!uk)12RrD3J}ivonf!U#K})(;E}?18m|jZ@+m{QPR|o%QC|{+OpM zcLIVHVFhv23~0QOVvuBJ)?YD*5!8ITh9_|#0+HbrDtHMzyy#Zv5E_zY(uKY}pe_iB z4@FS~yEK5vS*OI@T^G5f*qQG?C11ig!wyhLJaif7kIfe1TA0K)WoQpe%NBt{ZJY@f>RNTe{O zpa%cF?9@vLN%?D#Adc%Jkk@>rzy5aJ=qo!SFl$kEe+HPcx{#T%narRTAWlwzLrbP< zd-z*<7#0`5tB+K`PwTs6Dt93Bci<1ME%~;`*dP85EDpXVOCWupX%Xs3>Y$sb#BHmG z4-}TbbS{&bGQj(EKgFyl44Z*|(VHVWjU!uMgC)tb2NDXTt7H^ph5+c)fg_wC2WlP! z7Ic%jbiS9xT#GW5K!C$3sLt9$m?YhN~Iq^yqyDy*s)j-pWj7_ zOxGG!^FU)7&;I1C7p+ay{IYit6jPDSo^iSoCrUD%A4%_vyzf0Yt~yqoo|8k zmDXxNo56Rm#L9Ki@BWU`$QrmY!;yYT{S=)44tS8j>Pa9l1$o?FhSPFH{x}MW|0S&pP9o>3a1I|Um- z{Tabk55HV?m`+Jyco=85==4U_(TWX?Cf8eD*cD$g5+BrX0D;-Qx?u!?$h+~Wnz1f5 zO{?P{=;$a2Hj;14OJ&?Ra*|_RQGhKcsch+_kc448M;}|>J_zB(ca(Eiw3(Wkmd9>v zEJ34|jd6Gi$x9dtd#6X1bMw2uf7^hv-ki(A*5qTwh0*eq4*pU+mfWhG-#3Jpal2B^6>Dmw)N)$`K{{IPduQympwm=XIh|_ z&k-FC{aid_L@}QQJU2yL;+@`(4grnKWLkMz4i1i(S1h9g0|=A+>tytStgQV}r_cR# zlR;>PnyCx)UkZf{n$;p1v#yufBI~MaIiX-&<#Vo*Xg1I5Um)F}+joLdEoFn6o=sD% zyRjca6AwRNJwefFm~DW|3HX8I!`(ILsn|dxxmo(kZ;NLucg}>b{fF>_6Gp6(o)$>4 z4mK}LPb*%ikwj!^Z+t(VApoZ(vYB*79H(u4=L~icgzSa)v~kz_4ji(QDIbJ(s9wd;JNtB?*i^;U|_vr7SpTWtfS0R)G=x*9FlghAvN)o+Za z{r%L)um`;+epMj%o~mO|oXg!+IV@bKn0GfHEmonkt1jG^DJzPqR{B8l>P)uvBcZIQ zaCQ-l9$6dHbU~9t{u2OVKnxyP9r1L|a9=cFiB%CaSREkGK8dESFYVrhC^Xm@UNdGd z<$g&b;&H)Y2q%OVNKQ^xsW!^_%^dPiuM&mVL-Yd^MkIuQqw!N}*nc>Og{{gL&QuHO zc}hM-J!x6>1)#2Ur0-IXs|2J zp$Eu`d()iwbEF;N;E-|#>MYk(9Ouf&1pE-Gqsg4K4@MDC0o()2PKrkUsZep9BeD%d z%3WA<@dO$P-&wtK#mbXR>#q5z=v($;mCmZTsaF}fZFgBS2g9U379a|*p{MyJovxq^ zdEmH&90bU`i~94FSM!e4kJXG|_2_R!tnDv2qPEdp+0cEnAPtiS^=;u#?E zPF33jjEsQO;@N!r%`ogg{oq%?XphzvFfJ>;jW8nA^kX)mQhdhfR9u(GI0N%#0149~ z{%&^Wh>`~gR9pgHUQG^JdhB58N74;;;D++hX^3(5@23cls!X3Ez`RF0JIXCCj&j-3 z=)!d}tjwQBPsLTD|L~K9Z(hcq27pfU1_$^V2}n_ zgw4(`p&FE2U2WVlMuP}2wnUQ`nfAdM>rur~h3)hLfGOaI1kPrZzQTvS6$WrqD%b7i zjHcnu1f~jo;7#ZA*=REJ2l_rU47ef>hY$=??r~5`GU0)r>Xs3{hl3QTQa=MIF}Ore zWLa=lI|Ii-)qf?iF{nDR2ZmvClI2x1_@M-uFhYGFh!lId!F|3-MP_{sZ!bFWlrC_K z+xQ}f0Z9d3E5o=U;0wTN4R-N0(jH7;0r>vOf^uxs4GI6~i>Cz)0N;m2X|Sdt5OTlw z$wiYT>dwGE;IiBQ$S%+fv1Yl-prq3-hYUw9B4Ev{XBxG0~Cag1vp+!VMr7Bj$R%uk$YzKGyI_qS~2(-(^DRyv;+tsnD`>V zRB7^Q;Bb1r*zEl6lt>X!cJP)sH%z0a2J*#(GM15KLgHa2hpG8@KuyBZo zfJd=n>0*X}KS(WSi?f5W2%^bRl94xnI+la|01D$O4H>G@fK`jA0pM;w@xeOMpRE)c zj_2m1IypNhslARVfJ~x#O9J0qPk{QzQvef_{+Sn9P)WaRrxwCDLGopQAx*)&meKY!Tv7#z}0F@wM zYL}&)d*;>l0_sf*+(a4+QxhaO=q#+^Z4G%1O$~Vzvrd`6e-G6M?&DtqgJu90fa5vJ z2__o5kty>+nupcC0SyIQhTs1xqogHXelJepf|^e)0p5!Y7z_=ZW9?56t$_`q6!|zi z-qX`FHa2!e5rY*8{i9eF{(d2Z#flofl6MVkS|I8KtY#!J#o?;MiROLoBZQoQ6l+4d zFP9?j@t;2e%^1&T_*FCNf=oRfX!sGV`DD6mq)IpxO;F(B+uO;V0qIn&-^HPD;+C&P zF}gyRrdQo>W4Ag_}q}X6XO(>i=yGX6VB0_7>_aJLc!Po*?0$ z%>&@6hK7b-sfH5sK7iT>I&~G`i~laL!WEvkKN5b8%e9q=NDn}wok5s;fMv_(ir0f8 zv)&i|I2YjvS_v2;hJk{D`@0j#_GUZ@L%ESFF^S+g@WT)_4Njf(J9mZNI=c z>>9vLi;Igu3GX-dnz~V};otae~9HwV~Kg9jK4GSljQ0FJ+0}D~=hQy+DKQTL75Aa&= z&r`!>PD>C0iDK5~zXqhGy2B4ifLYis<*gwa5%B(b08%@h1oyB75Cib?z>j`sa)yV0)zS&oo^fVmxLo6K3@ zZh>GX@waG1>TmZqLBV5uyvCTV1~LXvy983-5{-rRNqHn;H0JFtlaJ;g-d=?~Vz>Nc0XEB}68-P+;U(JuH0Q|Ff z8G{){=?}t&_TZ7?Sb?GZjPUd)){Xkk3aG(SW+2j`*5Xpn3MH5HgnDbqt-x#~aAs)( z#(~83Q_R!T(;;Yr*0|Nfi-DCk>JM1@Seo?Yr&Go63s35aUkt5t05+TPL_TRADv!$* z=;=A1qV)lYdw6)TdUclsa+mLTSTDd)U_m}A6Z+@GWz%Rf-7o+pz-tvC?A__oGyqh< zmLl)LqLFzeulcV1Ni7i$2}mwzLeDywt%O+vg6;;uu%dap!Ja3aK;Q)8x0D}A3=rC6 z9q~Z(&uHCNtVOMzmeKrNTnjkH|u0F_bKgUz&h z%B^Qg54+hwX9=;@VmOE*I;l|@50L-Nt!ALph=idN^83DC2hFba;U|2xmi^*jW zkN*46A3j`A`gaGS=Yf(0l-?x3rNB{wc;DaMO>Bu4Ww-^qgER8pV3b5#TjJtkQ{x7h z5P(+z;5J#VE8^(A4HSA1Mts(#dTwy4ph4N^tVYgXRMc3JO7KQs{MrVLh=bkMVzm(z z9E=b&FBV77N4r?2Ezli;`)?UD^!~ta0x%))HGo_w?mZ0#U?|U~XIC|;sPX`n1zMNF zr&u5ifE%F&`g4==+x{-HD%3CLzw5@Tji-USLh};TE8}~NC(7jx_82wY&tHJApOjj? zG0G@Kp(ED<zT@eOH&rgo2ir0AB+EbIDl6 zr!2h9wv=2TC?M*9gaFx=$L&tZ@f=7+PzYFRH74K7yo%pYiAH?H1z)*P4s=TGYA~C$ zwgeJOFwoHbq)%UYQD;eRG;k_zh!F=Y6DIR`3O#TJlT%6l7W|=6^}S$LdiYk@AWT|0 z@C5*EK<-Di$7eID0uh|2sECgF6BRd>X3+ro1Tb12;mM*8^awp%I{;V#Xg6MLx&{&+ z_%@MN>n#ZkmBz67cR5{Wsf*!I z{`09MLlq;#FMz`lK~B=0)udLb|An43^AvaojW#=8fx69qK`O-1@6c%h6uvAIE-)sF zp#=aVon`Noh-1OV%Y z0RBBT0)QMEI8e!arnvAmAbP}aaR5ZsRG#dyzj`+WIfPI&E`26xxgl4j%^ab-qA^`X(0+O8tLpFo?pE@b~a+FX{j1M7{O??+@Sl{Qu%rCl9lfLzCkXF)H=n z#Rzy1va4Y~(Gf1MotF19O>I66Bk1G%7e?PV^4z#cpiX_Z7FiJg(mS;ju3`QQ2OcC6 z^=Q$(&iN>^mA4iBX^pny;l{y)q>JNd4_8~r*@?vHpV-wS*>s0VU8<2lO;T#=e78yo z|M1irW{H$;LWPo99quN_`P2?!Nz7Kw3>h|hCheI<*UN|TEvA^f)*70!iWzEf%0Nyd z2?vGO`p_y@El0zl38NMF0%jj`)qM5f{-Hg`xPM%85rfN~xLBsLYjiAHv2=-+e^~3} zpU0NX9MZ;f+4YA_A@tfM_Sp6HgL>YGMrUhR@Fq5?Vu4EmneQq5mqbpz#lvQif8I3i z$J}Verw{n}_z?a;w63F>8beTrd@p{tShvdiFaGmp(ckC^xYPF%bKc-jmqLPS@#%@4 z&|V})1&&(nr=HJjNsdk}EF3R13YD@9v#`{~n=XtRZ`2ItLxN4Lh^`(q{TvIWy}dLJ zQL(PCub14ny-w3hkEp!k%@$gmA66&98fg)D$7{5lHaT23)LwFJ>}(Wqgywm06pFmr z2~J!3!F3th!}o6NVCN4$$5E5xn%-fvn8HIuor{Z$`C`M`>aJPS&+bBbM%5-!H@f(# zp#z#+6SbAQ<1v^H5XskJzWWo;#F288p)6=I_@(Xjtb)>)=#HW4H#KX~REPchWnXxk z9}PqBo*WEeZv=3V_S=H4HJ!lI})9N$GAu=}ze`=@6tr zS`ehW5dmolNhv8o8qUJ^d(Sw(&mMd1%}-HzxbG|GnrqIvzPT#9ZfqWDAMc2uAhUT{ zv*d65+AVjK*QmnAd-{O>^^Z@6V+mE0MP0j(nKaruO zy-Mog=pU}`zGSLMuJB;GE+d0Skg7B>yQF#7m`NX*YNqc-l(Bv-+iNY2hf8=e)m5rA zP&R=7B9wr>rmdK_!g{7YIPJU&+_R~!y9E>&!~Uf2F81s@aYY0#x0wb7>@Nm~W8-L~ zq6n!xzw|ubkvMZH)yqpC)|Z|tI;SMP%9oEF9Gc&0lSsOsgM{0ghQpe`tY7}BL(74n zR6dT0FMBtnO=!6@iqB~KaH`Ts*x89>tX6LNI?Sj#k<9(qw={>2{P)lm^*HIxldSa1 z2|C0e7^+D4yCcGH*&czgzjW$(07ce(KLGw{UIPhP{SPA>=fYe!uS> z-Oj878{K@9gB7Y=xF#C8aFJOgO7Wz1Bq`t0`7wnI<}S^T+xdeUUo7Vm9bYLo?YX|J zww=G-BrrX*=`Qgioqy72{e&Tw2I(GR!boipA6)^P!_Me?4~#duwZm;x?MEa-b7yD^ zjb`Nd+bbJ?l9{t(Tl7V<{OZpCu2cT_u0xV7HanZqw13dvDWu=>G@h+Z3*7?kzg$4| zeF;xb;jj9i&Nfh^qnm|yzGb+){!XhMvA&rv>g%;~LIhAJfGx4DQP`u1W@0Y|RFpPjjLY<~~aZ>dV_aVxEc zIFEIkVmaKDqmwd9wV$-s4{VtCzqDL$-QoPj?Bp1+wRDjCd_eju$>hAp&-Efsf|07X z6LP7vcKL^|#-97OMq_RaH3g66Jq6&tWp5g0C^!A%N0wEN=TZK$%wLKpM%2z(KU{V` zThD*cEtW>Ks)lde4USqC+r7$Z4~}N@StCRZuYEIlWrt(l6G9|pct?hS;J8F{G@5*( z$913E=0}y|YS3>I`~jEud@gmmN#5$;b~=_VowS`chK>Fu0rb`%?aGn>8j>0TV!a@R{eaYXB}?5(O_vlTpXE|xigB!OWLo>|X!H5r z)y8*%VCV9-h+zz&^Qft6GvNuZ?=^EsQR%I|!guaUZwa_==f3*m?qn5A9^l(SH&Lod zK5J6KxY- zBSbI%{zr?t4Cjp9TrRWzyA0u`R?_2Nk$vB;UW@x z=AnL{xDbD>SjB9;gZ}r4x!Mx_kR@8ZxzES8b6N@5KLQ@3V9ZvSx*QLcj@igeNcD93 zJPh-k6K#7V>2v*d{;o_{2zIFtD~|eRs+F4q32JD)`gQE;K)l65J$rZE^-sIBD6b^e zj8tAjKRhe$g?cBO$;3R@i_S~UIqBb#cN>Sz?HyFsCvz?f_c@=%GXSrUz+=;-&0QLf zjnAqdY=^O<1LnjMT@Q@U8)Gg5_4h&_bW-rVdLb(MGq!1qCIB-!a=gOrmj=60JcF9( zkm+?B&W{P!FmfR#ep7x&vJYFauNDMdhF;6Qn|jhM_xbfvH%*U%jb_8G*axOBJ&hwW z*c@zI%72BH{HQiQ@9s+82$Y-Da$1l4W?x;XG-hL?(;}U9QTJ%lQrK|tmS;74=j;-d zjY3)-p}@!d9i1kZwKLq6;b+QiqG?yzDQh)UQE8H$|#MKsB?f&#j zeaCW~%M_MbmpV-77$+j6F?h0kj5r;HGf`DpwU_-(W}$e}X25{}J2C3_0wrer)?`tQ z-H~95Zmumv!~1TmGL*oX5%#usz!1tp@& zE?|ckP4HM#yG8A#n=R(*GXfcA$(X5zYuOcs*q9uXzGBlj_jWV~6=aIXq+v0=G049) zIZPQ;DKYit>Wy2BXQz5wHQvFc;AA=Zr0k0J4(c0Z_H3EBRj=y%^Y%EUe}7i8VUm$H zXL>d`TQG(fzkHM^_HNo|FWGZ^gdO8u)qB02bj`7b09pY$EcaEF0TOmLHrwI7`wV}g zh~_6(0z22V=4ZQSns(XpgTe|)>772V+<(BkGwp&KJ!w5PU-q0PS2Igw;fr{kGM)ND zJ1$fFqm)PHiP-f~84rzvkGs0N4$5_^>Lj-44kW^``;#7D?fXan`2Gvb`s-uOL^Grv zN<%Cg6$Wu#w}k#MjEUHG2Fd!^Y3Dx?38C7SS_x=w$VBrrD~+e#Yky zozn=iYm9)o+IB^>t{-30kMy)dbI?IXlA-?nZlso|u_iJ@+)yg-8UzZN29qb1@Gi|L=g<261T zd&!j0mp~Kl`KqVPAD~m4*qfvV1_Ht?qMJLei>F%q7!5z- zJ`E>eRQ#+=Ie z6fN;*Jd?O|NovB8WCHn~Z_{HK3@?JC=Ng+9pfUc8^-4uyC9j}h3+H&{>4Qh%VMhsW zKi5O6dXA2Jq8{)W!D+-If4hiIZtd{%M|G_#??*;`lP_)Ub6$Tokg?cZa zi$dRitN{|c!vIYU!fmZ7^Z4HutzTAGRpLlc?^9rYT78t0aVL@Jp*1dd9KDk=msI-} z&-;CYljK+SvUQ_fSTtXsiwP4BH>eb$99g|APZmtER{kcW*L=Ol?o~h5pDcmo+|v>q zmEPX+nfStXNn(_CA^cnAVL^$Hu4@4T!DBswH4w;5fBmhQI<`>mX!|T3`L2+j*Kc0A zl%;bnY>Pags!_ss<~&Rc_cK~tLm%IDwEbXq)%lyT|LE2CTwJPnMlY??)`J)Sl#A=v z`XR;@!{)iG;rZOJ#?fW!pKCcE|2dZ7;(hu~Qtp=mcapCYb-{z($DTf$Th!Ea=T~FD z+M;O+@YfO^sWdtkQJW9x@_TPyj4Yei?98^jZo{Q5JW6wUkE3&l$&|k?CE;l<|>c+#zM5r>4bvEcd`BawB_3F zv2%@czc$+AEj*Elzv?CPV};)6P9Hv3U_<=tu83!&ecxfwSN?Ln+RrIhl2*puEahnG z-AddO1R~diDWj#D{ND|zKM5?CP98^Q&k`_wuWgX-ipm@Kv6fE>kqUTSQ*$1epRM&+ zn~fV;Go5N@Mi+9ng8vk^oNUx=r{w%V+d0b9V_db93=Uar*XFOg8y>d5&~o0aWP+Mg z&^M_+iEenkEPWqkN5ax@U-;~#W@id%4jr1y&(i4d?l>o9NDN-?CAfddyvB4P3;((2 z6kORDchj>1I2O<21vSmzuzM;_<}x`b7YBIc%$YVz`I;gjDq>Tf3Ugw$+V^zNcF%o= z7Rno{DkBYW3L5MBpg{cW+`&z1mQyy>qTa)@g`dq3fX3)Jskc-9vPrzy?C4-^C`#gb zVBy6lbZqtU(jfMGJ+5{+GUtmQyPz=mxZ4v>bLB+h0_j`_KPTRwD~1duKX&@{_v_^2 z%$Hd@eN|`o;_z9t!#ndHYt8$te==W)1;njZtZKHs*KCzI)IP(vP{*qOX7q#EqMuth zet#O^^LKb#67|)Eo&87@!e_H}$84{Z3wSGysE~y`FE0NYD`d7z)tyt4f3OWkNw%jk zeXUl4O>QEaR_~r*e^Tx_{lL`{7KRJcMk=%wUJwgdbftbhm~VWgoaefJAlYXlmsn20 zVe~1GJ6=I)?&ZAw=_Yzs`3{QiG@DLLkpQ8&Y|>2E_~l$J?ZxKN)}u+A{O57v2uNf& zlVuBKn!nG7%-m>J{ z&Wns9^T9NnJDFKpDr|f)nn03NK7TQ<_A#)<{W7tH1z1Fkx=~&S>Wdtn#huIG{+OH| z1!J$(F4Qao!~Ms4%~6P%g3fF;svqN@j$lmMcwgGt`*(#CaR!}#|J5&4Ya_70!^b)x z@K4Bhc~{(LS49&?8k>+27n6D1H*YVBJ2Vy9iuN^idk^Pvc4_I?0LDLv(a8+u=-yka zM~nUn%9o*?aJ4ttp7Qrw@b1l3Zv7n6t*4p%@F6C_KblnNv&XJsXGOy?`I`kd(f6^r zGh9qmP85Rn%EG!|99fLqazii*`K@O@H5|WH>WvZi(PK!Y-KgbEk2Qa+Q*Xw`g&CdH zgczaK>>lUIw2&-#I{8N`)^Ejs=yxiM_Gcx&AJhGLWSoYHwLBklDU|jkS<2-5vKf@9 zgUj`*Ru^e>5u{cmp48`ld$1};pn%0XuQ8_^a%b3x^Veg}6b)wi+p*r`^(-Ao#|$y7 z1RQ_%VpaB-mb^ar{0tjU+b3kHG3eV&=i|_}kT@M1IG;-nt=h*wtSp)PBBW6Enq${= zDEaT;=|HzgqRJ;ps)+A4!-SnL#`t=kr{b{cr9U$(%Y7-)Bk9jSK1PO<$dm2w@82j~ zBRZdsY^L!#E{@CE4V7f8<$+YTR4D(O3F>JiJD_!LOZ05~wI@llCewxoK#czAus^OPHG|N%?KZc&?glGRcI1Ra;`y9UkZf2_B^TAy)T}3n%1HDr z-2)P9sg!lG`Os6yp!dZ5TXSY)i$$LnGdIc={fqY!2c3ystq~jF4W52WZ?I@oh4rgd zW%y%XrJi$BA+xE%`uh+!3rWaN$6ZdeKV0P2hWkeAwY?d4>#Y(-?v6Hn+mnr@>Bnqp zTf%!BLvI#A2qaUdIuict^PRhNNp0;fUfl45*FnSSxTT_}F2`%8RIdKUZ}$IIpRB(& z#7$!$3NS`TrRfa8_L>-r6*`Y*QYypPeC@I;RH$4juXMQ)KF9xgXKK*U?7v*VsFiIB z6MC%QgKig6flvCYT3?$MnjCCH9+gZ~=tbfbd^;w3g7~V!;A)nalADmqVilIeqS_6-tU>eJJm`LL>9HWwD#6TP#Lv)g-Lt4b{J}m zNc`k8yJQg#{kP-Y@ezYBfsut1O)3N3EDc;A_2*6=#@(=SS(J?iLnqC5drZD+OSeR& z5PVBnkC%1PE_sIc?DXWUW@C!SI$a}bf2rDf#9*U8vb&0tClHpTZj-y!_nA|1pL~}p z>CYo#Z(oGrM{a$ouP0zt|FIx)>$#9kw}utBAWa zl;=yxC^ToWR@Yc4^VsZci|dnr%ivNe*paA6K|I_b6?4jW91(Y;k09ptJ|NwmFC1TH z`TX%ER$HC@k#qHW{qE{#u(g&*LmXu2zG60JUSEjl+vL z@uM=>9@%9h=n7P?3%Ew~xuyIMh0)Rm#-Z|cC7LicoE6rL$M+AWDCKpktgLWaYRYh5 z<9PBO|M}zMb9RyN%ZhY}iN_J|Y!v;Yxt&oLS~LHfX9E~b4yNBmYfL3f2wPaa>3lM! z?XKIFp#x8(QxX#J=b~%i*Eb<*nb4Bid7{u_!>SF?X@- zaB3g0qlQhMcNNfcH$NuC#bqxFi5a7_Cc8 z!zI%k_1H(+m)~nf74dH54>gwL;_ol9k}*kzL!<7;m8Z^zP#Kl22A)Rd&FatGdX}m- z|6yttS6+P5zpueCYdTUQzunb?O5SWRW@7flqAzo{7Cl*8(DO^SjGVFHtm}ToRzJx* zq(`~`bF;RbaK6My>m@?CQppHwk(yEMTkgSZBO067JI1ti@DVnWrP(h|(Vi((%2^pm zleq9{C(h%_jPyy6ODY4_vO}i_%esI$Y=o zfmV>Gs3=@i(EPts4qDW3{YB7OCKInQ$YQ45ox`CXyzC$`0(%oQ{M9i}KcD}5yGm2% zrg<|_k$=XRlf*6%k11M0-!V3xpfc-x8Sd#p8n1{T;_Rma`RE4pJU~iyqi_OcgF(Tt zmcj+K<|h*|GUWg@Ma5wdT`5lQK(8JG!aJ{9K%*ZfvPjRx7?ecWBwOH-;FR z{|x_$OxiUU@wxCgdzbe9{hRsMp~61*zc?;yj!LpW=!*U*-*)O-uuCr@Pa4h6F`q18 zMeQN*!;79Aq+Tys)AXX8$4|Q=1z1IV_P?bt8g@Ui>jkQv~9;UUhgm5#mn}!6T%&uJBdLs4qjPAv2Rg z`s#2)rARr?s54~WSOqDA*Y3`rE-gw#2#372{0QgCeH!B~kRjYyXm8A=jhi5IR#$@P zzennz`+4)mhqvV?tOZCy5;ecQ<~J_s(6>lvzcKo-S_4FIpvtiY*%O#=Z}i)1JwkWo zJRm(R;;ovv07PggYLX2S+NtQJ1sgT!uX=aqcD8h6*lMf-Y>x2HqVMt3Zsi!tC@bJA{e>R_f?!Zth=(sm z_RHb_72URnbO6_+mX>Sy?E{2=8$U0 z+jevjsmw;1Hk7E3YWAxK>-W5nDr>W^8tl|H>s4OYp}SHwg|QtA!o!OxJ?D+%_y`#iCpP9SEv5c7|y{9l2}> zc8;Jh;)tM{$9<&sy7letuW4Iqq`nt0=Kx$?7L#RU91+6>j?4-mm|PiSs{oOUt9lqN zBZvw8sS59cS8jT?UeM>N5gduhW@m>Rm9DNHAZEOA@0t*<3N}|62bVd4&u9avu z$m;M-$V0+=M`iRElu4kCssnBj-hbc28v`UL+!Vw0>g@9loS(dZFd9R}&Pw~3R)e+= zglJT@MkYk2GLgiAg3*NfrCMCfBoky0pULBdf{WPA9>u~LO%kh%r1BP_-+qFMXY4e% zmm5F}DZc>1Xfcd^w0qa%8nEOlRljXHM2Svg%Cl*B+w0ANH!Yqo64`#SU~zkrFs8T!-ZC7r8}pf z!DKgG(at>tZR&Cx?6i?*2QN`QD7haJYc|E$w{T4b2VQkn_-!UahelM=8Q& z_Xfv(GA~Mk1?iZ`D)Nnjk5aO*~97;T*euNjnG@1BnvTP;F$`8$oEuP)2RPe7n76uyx(PwV06Cv>(^88IIKM`FV1I zx7%s0?+j?Dvj-lwsR&B1AMNcan!T~clpK|&K$y6LcM|Nr`G*p>cXP^;MkcDWv$C>+ zaH?(iQ5Jbmd(i*fg)Pj8-*mj2)y~oTeM--ET3efXC`d(iXYw@XUvIQztZOrDA(=52PuEi}q3mb~FU}5LQiT-=O9hWGT?x%*wcsI7NM^79hWp2%j-o z?j7=7*=UGR4&mVW3gX=lbfHTmcWyM9*p5mHuw~zK+(Ge2eqCsu?XK41?G^99E<=kS zr{V!tWSEhGb^Tyd`^-oGzgz%S--p2v4ZkGCPVa-2`|lE%+47$yd<3;=$ip?dd*(yw zPvaS41*P!u3?x}Qhd@%>r#^ywLV)+8`tB$kbX-btl4LhY1{!Gb<(0}BT6~}4;&4U< zPzq#^`VVz=b(K~+5%&Lr3N!mK5~afPejSD(TAMbX6sa9S8>X1trL%&9Lgy}Q03uew z{0Npnjc}ddf?oS%Vy(Mw3Q;gu>fWHbn++HVV=A}Ci|GdoRf|S%G`yR3dwBEiE@;tG{Edx92Bh)z!v}!8qV^AF?j4;3c zH_0x$;&{Nwb~Cr~kEue*MG{Tb4#(W1T1R?IHHHjnA+wLUl{c_wt;B=Tc`zjMqp27} zmodV!N3?!s(-JwOGB1MqzQd;KV6Nnr_OZU#K5C&N_2;%b%ld;aG+1D;TcOn(7{3A% z?p_gwhElyI;%Ut2@gwc~N9+-yMkReQ`J%D|-~vBT&G_W8J;iP+3qsrRg6QnjU>_xx zCp>L%B0h>e)Z~9U%q2P`7msM7#rjS`MimP?EbtdFBIc?$lp;O0j z2=_-2QcPoR5Ldy~o$hW4&dQX&hqTmV9^-Pw=}F;cV!w%BVMQx_mCkP`iT$ovuiD+i ztoWM8C6zra&Z0I9?-7#(8`l^oCK*4i0;|G%ey#~{SxfiNm15liJWV}VsMl0KoJq)> zX~ZwvzB-V^Lyn^&trCDrfN@FFn{I)wnoCAThVAnF#dPXgdz2D{u){G87cXv>dR^}+ z+_1<~T$W>s^EXDEu{ap>=J(2|e@c4u5-D1#S(@N22kn&5@SQQ&N|~%*QeLIIH?d^Exk$sJ|z zBE-akDI?IJC`uGj(c%r*$)qJ_6hL(hH#&A@j9bMZXxlXq{g0Wd5(h+NzZs-%G88rw z5rQ)5^yGv=VdP_B5w%4T5^;bYs)%kl6aVHS;xdhPHdBk?T20`u~ z5Sn2%{?W8T73B%Bnh%`8>pw+1yY3z;63+U{`&LJI-TF=GK|y>WtgssS+V&6uy)Q z&zoGrt`4M*|J3mue^%d-H2s;i^+St{I{?#svQ{@MqG*{;j+91kyVt*fRI_Fy75To1 zNXNoPBq?Kho6#VJN|DaUPn)&ZLXt-DLr@FF!J>pJsaRip1`sn%yEKTDA+I9$@x(pU zkuk~?!bYY;E}^(`tuHPFmMt*!M1l&ti$7PaQ?B#mpcJqO{*|WGMJNs- zBS6YJUD(TARP@%nJ*a}@o0ZH&R$9TTg8YY>`8T{E(ECSMPlLi4f>mjsr{Z!ALakA* zQQ2;gH~9SauGGT`1Ik2A&+sjar>}`=4Of0cDoc(#IQ+*--PclU!4b;vEqf`lEZ`=U z!A(A@21-xRxEq#>8c36XHvi55C~{u)^{?^66@KLf9~yS;&3S{AOU7KW zGM1`Fq>p{)28OX?cTH)E2U_sC|MQTi&YNm`-?h9tTuGV!Ze2_EW%+35`!+US>iA$H zy%n{I0b1kv`sct`L73$NxqtUAKA_!4L0Mz5XP+Hp4dRLsQd9(yb4{BqZ90?{1NFtA zgCp7)&698~)@wQgGuzlhvAeSGIJjj2r+R=@cD@jez1RK#LtzuUBw%wExE0IEvd9Cj z{xOhYOS~EpXVefUWde&2{1Wgiq6vdef+K>Z#IMBOe4o1vR_RwFkvxIKp( z@RfqnQJj<8dX~^lc|Pdb1bJz|0oPJW8{-0`OiOJjJ3o}QxUJfVjT`F?L9 zK!A@gt8M%jVa{;a(47cY`r@+wRNQTHi`&GS>pn$tLRgW^&Eo<8lBTZ2TX+yB%RV%G z-p)Qs8ow(uB&e4=^k6}uev4DTaWro_AZj7prr>e?`{u(AUyu0SMWF>xkwA_YgR)9A z!Aa_5a^Dj(K6|p*75On5NxNt?pK6J=9(!n#2_7*xO!M_S>SVYZHVP7X)st+DA418d|N0i zG!1~slQ4mZ5v~~xZ``{#uIQ4&#<2Bd7}%H+>-X?cIwX)OvbJ0tX+7$DqzVZIAJD`u z@qM4Gt&QNWql&ueT;jX!nrbdSVT1{e7H+T0!6|D<_Vsd}qlULzHPcnlWk<)&vi|AB z6LoMVRW#j<7?Hj@*{As{0huKCk>~qK{=YVe$TyCM>q=ww3F_F%P!jd19RM z9g%%3r{!O)PT18N%_d1U!n%ecHrp0J$-*wc<_!*k=D^UdNFnk*qQBs2?$65 z&(((jZ9svFs{XM>iZfEHRT+9EP|Vhz4ZX#7eX`gQB34 z#Liy1SE)e=Zb7gK(nwMn8dbwFYTOTlWg!cy%IvH72;sP#q^YWD60@e?&&X$VOq&zT zrSiEUMIqB6offTNB+7{=D>VO#JG@=kxfHqXA4C6uhClnp9R29fJRwJ{;!NWT>JZ8k zL+NBPak8b#z&^D?#oIK-Ug$d(c`(?q846T%A`S#yTJXzun}Ef}x3ln~^^>nb8tMqH z?k%{syJ8@*1g>~v?cPlNb|ZuE!E``W z{#~sviU;Qo$dkbf=;PzVOg>*0_5I!Z_jBNds@89OyXF$TK?u<)XOoJh+*E5{+v zNz){v!~j2^QBOp*?Qc^_9l__Zv}s-@YD@U&? zZ6#SICUgF}Yx}Czzjy@j9ngtzZBXk5I}qiX4kn=9G>RtA{DLbOkufv;cyY^As}4 z$6p|j$DhP#DfvoTO0i&PO}bt{;YJ=sxP00mA#etzd_Nst~6e`|L~9{B6~= zgf8htceq+*br|fIZoo?pV~MuL-0qG674|np1ZgW6q-z4OGQ>^%TA+4q$0#r8b!eAF zh2#q`65$4!d`-PEK=r>Y$DxxKRh6)w{cM#qtdFG)!5flls04DTmo_pvro$G5)3dy? z+sKiRj$&#@?!dC#8OaH*s;a81)vzdob3T%g{SHg{A?1f}_t*(bBX32Np_q(8A{hn= zH!}kRvXy$1yVL5g_+iD~YX-_%$TiX?EjK!?blpUCVcGQ^|M*gZb7;Jy+1&O`&G0W< z<~|@oO;X5gI%lCiVEsqrU#W2`=(+Oo1xd}V^>OZoU@R_mhnZZw+oit-Ku#}5+R^^L zTCZs&&!_-l5pO%6tH)j+d6(!ZW9u6lXw*ME4l@9^ z`y#@)c*>3rlsEZu8G?0Z-r};tU`kBowWEH3(Jkp-=}A|0ua^^?KmFxv&lsw29JnyF zBSd*^9(1FYX(0}4-j^rfAq>d}cIV}_Wz-$tJ+RlqC5%J$YisKqoayn+t2Si87<7IQ ztUQI5)xA7DVF=^!!BkYs-xn_mce3Y9TKtc8QJfq=2eko3@e~STEq;>Xh!k>9JE2Y| z`8GL&I)aKc5|;BV)Y_r;#C9D;A?~_c|5y*7^t9kww3e18;*uBAmnMW|;{2_8qZzlX#FKt~Hr9iLQur%LNFtwCez%J3ri@@s0(5H}KPn7gS&h0vf;# zDD?_scQ?29LLO>v{4k6gRAZ=-mCbeDp@5EIdv?2?=#QTu3Uu#Q*(}^-k`ZCvj4^=$ zyN#>ysT6O;EhiOQo}f4?j9+?t8O&xK-?F&oU!2qFJrdPJVi(w z?Bh%@Yr{BjxWinarh&f36KLmbbDDt5Jf^ivgo={#1Ar(f%Fvx*2(1lxn`Pa?hC*O! z$$vguvEq{}SR=4@elIW6cysxa(QNba@xh{C1ZUoojgggAc-}JrDR}+SJoh%M%R() zX+AbKMU1xZK%fvs|Ao#qFft;@*2AkA*pG#9&Xo+_!kcyt_jtr|A;# zW@6v_v>5Oe*5e4zD93PkCJ(y*B(Tw0>Q8yP=2Y~4|NaLkRSm5;9G;%8u6w@?F7O?+ zZyVRIr=%0lAcR|fszZaU$ou6+<0~rFR2jtOId(L~S+UPCk|IbJ4DwOr5uOJhI6+?t z$ezGNT(gOx_I8FC&*9vYu@C60Sj%J*pDJ*Scv^?vUe2~hlq~R2!bA_<24}92wydeM zHQ|$~eXJuE)(ZAc1Lg#NM5G_R7Kz}Vg!Y&56aP!B0fPg9+r|FBi%a|h$)-r-7R?;PERT^GOTdA2E>f4Jw_NZ7%k`Qz;qn436?i4M39KgM zfs*fbRWef_LXQtxK#?>rA`&0#)`Jlknln=C%g+In*&;;S*$&<${Ke55La&Si*r2+DS<2-#z(6}_P& z@(kEywERXu-vF7wzI)5zUR- zEb)M!aAWy~l>*<;v~Y9y(yd~4RjlvDW7+7of!)_|tjp0m6U z+%Oh6e5}{-X~xH7Mpv6Mn7A9lgWtj zS%UBr)5s$uoLiq|g;vCHn14)@YpPyP5;J}9#_zY^2JG%EFgN!W!`Uq%`5J>ZJJd~RN0~G~Qs*lj6(8z#5t6~z0SV9LenjB3*K|vVF@d*MBJw+>u zk2l9rw-P{sCXe1Q47ol5jBEJaw^FeeWvq=3AF_ZM9VRw(3k21@$LfIOiJL@IW=rU% zRW4-L$q)6WdfnB(V=)C##^6^EhkCIZ`ZZu?K1Uc>k3;#?q8#IUIRG2_9?sdn6jv%lpXCzi@GJ>FMt3 zA@yKHgv*e_=js9?7saT%m?%G|&icZN@$oXHMJX1(M`kL#Rrg>7W z)$*V7<=fVZ$qi524jo=33pv(<69&X;XTWdeY3mx)DLmW&{*gvbNe`!adF z7SgUzJh$(g!h3^Akf4jVs{a0C;5`3{g^x6m%-b!q)2?k>9qhkx6Hzdwq4yD5K1L|L z#vv3yZFFaGEAyB|=JY{F^wDi6IKQB>>WF2JvS7#RDT2A0$_hv_*RH7Du`<7roseNX zBNPm3LognZ>t?F0l0cMNpl|{eEv5Rv#&Qe+D89EW4?8fM}8 zGa4tr(DC3eQB$FtIP>9qU`JOl#BRSOP7~&B!EeI$T21m9QSx)^d$?b0^cq)s|f z;12*s%ZZXuZq?l%48v4=AIfk47;w#(Es$k}zMaHxTq`@sqgY7+ghsV(xH#fypZ6ugYY!D+mmk`G#ai9eDelknOn6g!+{AMkrR3k4Q$(m|Ah+msqSQAaT_-kY|4C=MU}f2aFs{qvsH2Qj&?fgmou0 zg2Eo9m$v`3n0KP5WdByrSHgvr(@YJkK~?gSyHRyYQnj9`d8>&$Jo@ns*vU#`?Z&ul z*jf>s6{P6Fy9Zi2s+$#jeqUR~^*=~3#mph~zDj1SM_ZAjtG#113YQAjn&}%XH^ePJ zq36x_x)fGo3_K)gOHiHVvReKS)evO#f2HcknElSo!|}-lmi_qc4cNy}FiH0+`6b@o zCh2W;ee1_ILqUe*8u27hS2u$xf&(PcYp*W!9@X-u;$HW+vq}^4Sd&6yF0ir@hdN`C zli|?G<~3?uChNdCBFaeNG4)B72@_A{es++>miEa{8ownHX>0e_1bOB?w}NOa`{M#e z9H9%JkS2j07M*a1>~U|a{p||71XcvmXmYcapFa((k-Bvh+oWyr&St~8WuypJO-r~k zjLO+E-uEdKC!F74*jW4vUrV-|j9AEK5vO>ecwe*DnheDhK#BLs9u;E$vebQ<$bK>I zC13l_h@~LG?;37Qtm7TAJWCHTG{&ps;^-ogqd2(apRIpS^$ep?B9+N@q*GW_`-Zzu z@~7R-0jSmlUyWNUO+W^Iq>nOQh2v3^lc40D@&tp>5iXq6D|e4RF4|7d{*F>|mlACC zRJx8;LI`IXteQPoTMM@*;-`x_#pYwXV~_Fdu)7G+Ny*WTQUI1S#7U?YT4ym>e*GE~ z|F?}4yHD{|lEQQAz#9&=I*>Q3F`$5ufr5sYD6`o*s;w+fu&XonsYx;}KFRb?K~EF$ z+-GA_BXb7U`I}8+Lqix@FV@d#6!E?Ptf4~!ulyiCr25h=SbxRu;kKNq-T;0Rk_e0N z&uO3KcOQvDkJ&*W3r)S>8T;%KVPnMAjd_=Z!PUshNIJy90^jgiNKJDcrm(ZBV`Y&@ zbfNAef~AjmkoYo(&wy+!_XhH|;X!l@$jgeTp&Z@$fOOkV-RLA{q#Ezw#9#i+YgFTD{Lw&re#O(SI&%3H?h?S}0C!dtO(?;+GkA$D z;Wa>@kLC2IhpDJ!6cCe#Wi~PA`WP<$*!Xx8JK-OGJK_>+G&s_QiO2N)*oAZ zANq(V4^*7-Pz7uuAZo_2#zd(V)}U#Yf8>+{DpFMq{D z(RFd!p=9=);cMscgHgCa#~=0^7@`1H-t_nZ+6m6wTHVj0MUPRuULglEy5U#4-;V#3 zFx=x!E2=qNg-Co`itVUq2m(ynu3i_Fma<@YCN!8EdycgMZV2r#CEcKQVH~F?eTlR| zBu|CQ63tr)6^o;u$xwP7)E_`oGwC;9K%XI^M-qJ#?nJm@ZNBHDXa5||l28(n+>`!p z*q1;;qu=2C^=ITKX_iCvFlt`Lhg@;mx5Ir4VH`W|mf|629SY)CJbrxQX~M)eAPt%N z0`C-@*26Yg$;%$Gsx>oH4#b>&Bc_r#NO=2tG zLQ0>XJ$FhB0K7+$3D9NUuxUz*z>~XrLP>;sYZb3o+@~-yHh~>4%fgNJX*`b7WCHye z^@E?SLIC!=jj0ihpRCqYC*Ru)TR#aQ;-te^k4=JH7@N6zE0 z$|lTRMrv*UDE^T;hSKeathxEXWm3PU832D2&D0tS8EWL~!I2TA49tkATdy@8*^#$C zh=*uWmb<&UQo5v^yOBI1K3`Er-AZ6{!=c;rBXo0eUY%T30P z3+@l)?8a&+Cfb1r;&DUtMP8iXId1Ez|8T%~Y>p2cKM*T!=->_k5+qH&ehczlZ zc&AXR^?3!8;C7TIHZj~8QO2gE7?7~0G-Xu%UoLoF_L~TmZwFKBsO`qJW_GNK!4LaBDsgO5b~s7sz7#T3LP5zzV{@4A)9^l zrkSY#L4hmkK{uqwn>s%*tMMygr%ng871~qstb6E2J31Cl4k;H+nFg8`CaBP52$}{M z@Z##0Ld7u0x^%3$!Uyjt<|N>kw?`2#@2NeOhjS=)KL!sfuIPtiOwxf^*t&$j2@_q! zY31c*5XBM9+zR;bs_l@RKsNsZP*=-I;?+kio_n#hz}pRr1geHIJytUTDB2!zBhI8( z-9e)WlMaHR7TFmQfjz>Z!jy(&0|IQ$$#85CFe*!~pEC~o1PldYc~xrs50vx$@4TaA ziIHxoR%}BE?>Y(XpYbF4}ZhHU67e68h&!2%w>swC#f=70AI=o%fqVVQ@C=VxL`M z33<2-+ruI9LQW8J{FG3hV?ziUAHr7ng}-2^BE5J6TZnBkhdV!q*&u_>c)t9sK@VFU z4mARdg1M=traErQ?`kt^>4{wuL~paLwDX@dPnI689;_)=eToG_FnBeog^gLfH7dG zzKx?!P#PEd^fwSu4N_93od49QV+)C=OB?%F1Ryp9Yq!`Ww|=yAAictE?t24jiKsID<)&st`|WzhbPd{R86Fpl_jf@f;GlD^vls;Q3TSn&lJg zS&dZ_9;I_i@lzR-AIVVO|JkjT^-qqE@BuKK~w%1o)C7;{m+N{Moe**ng6nw*! zsdyZ$gtjHGai?>wcvP~j>7h8!vENBVA%O_Y?+3|<1G`&W;RTS@R%736(E&xX(XTd= z@s7$L2C2Y8a%IE^ns)RiqjFnAzX0;oa?pB&J)x9`?Ck%<`k~*DUP$ZkM;(=}z=t$8 zHg0ck<1=f#CC(2ImjmXO{(0&cTtdKB!K^XkYG^7FDcrvO0VqdMpUcNm-xGfUb@fdX zH*URS#~9`FQM%VY;3#o^AwJ*jt*lW%R=x$hAhdk0gJmtqY^|EPk@>O zuI&D0U%fpFAr+{jq3;+?!t*%D7;o>ET==n3Gx9f3ady;eTTnCGLh4&A=LoN>R<`8* zk{m%CSD1RCQ2{EUW%le>z!hN+RK7+Q1a=Si%ux&UrxzrA_9lYwxvcQJNYo5xt zV1LajKRZ6|1h5_w`MPW!**{c(Fv4M*MYb12PK2Ch5wi~mSxEj?Lg&|@%4lbbRHFts z%-*`?rl~g-x@=0iFjd>+is<4h)6C#c5 zbnvjG-2NrY0owzDcDzLV5v{25AU^8)ocA}v&=l&2J5!Y%{l{9a=MXxHb)*#B>Aq+O zTVzC-YQ_%{s|MRY7O^swAvsgf?ZMrzZ+NW?@~3WN&A{t{r1w|x8cN?2SvBW(P!Mb! zO$-zS;1xknsgmD<`n676mBcU9M2gZ%h`O()&yUt6eu}3en(N}=P$jqk0k4!hM$%JX zrULiMfTK6!{o4v9WzKtcm%%%`?;3nzGs{puPkl0Vm%RuMIVSbD#?f8o=s)hEy6w#J zy%rvn{TEvIY82WT;6hRAcVXDciVw3-JYX_XfR4sKC7fW$_Y0p8HL21^ayIZNW>0ERv-Q9KW#eRM>@60>r zuXE=2o_FT#fA%xaR#@x%{e14Y?(4d4#gBP#a$8EtW!bfu6AFQeR5wK6`W zdH|U;>T^Ev@0{k|ziZC_vX>>AP!ivF=Tbf%v`8?@_E(vWkvQ03EJ6aV2_-XJv z=*67WN0Dk|ble4r51j#NzjQ7!_TuWXbj83s;1!RXvk$rqyw@CZRAO_P$EZg`b0lk^ zHY;T!kFQtovW|JJ(#3U3UK~_){)A71f_i@WDAB-Ed^)H#A0=pC({G88sQ8A0Jw0u{ zSD9JIIyQK}U;7!|uf#5qiili> zkp{NL`~tP^udM08-Z{fx$j~>mvjLi>E}XpBw1|aBLX#~!1CvR8ov#*dG|Q6LG36$Y zp!gd8R9dp&|9LSNIElF!KIyE>8K!0VIZ!-}+~baS`9sh1g#EP_FZn^_PHsTQ2SCh) zisYj}Aj8Gb2V#GhmzU?~8KkT@aj9Q52;&aQ-VBp_`9adLX>3eA^R4pxEUfb^mOBxz z1n4)Y%I{z1=Hhx4NU0`C-g_vSG7;SWvUK$nE1ymF}CVj+ruhsBTO^Kai9 zj9Us7&5_tg+PmzT!ZO@A;$48F&5e|HWaT9HD0DG(EJG*V4CLWP-p+-IG}ah2;G)h# z1ualUn&nJcw+w&pRnROGa0_2R`U!V1+*r{er*ZXLq4~|DrE%31=%d zh1Dppib!4Q2il}*p#k6~Zh*Zfjt*h*PAim@l=-!=o)4NmIY6mb`a$6T80GRA0rj9p zzOK(fq-mH{s;;VMxaHyk22E$-?WfQI#1U;HE?8w(p0@Coy(R$_ILxkN*H3?L{9Fle5r`phLY4t)2Z2mr z<(=Ls7UsKY8Zd1xzovF~KnK1?F8j6SE_%X$6Lj0P#n5DYQ`nBdVc3}{;!g(PIFaZA zs>LtF_g+>(#zRsK0a)4UQ&7ZEiQsjg~xlb-?3P7-qd zTZhYh5jr}DA#PQWd%gC!fn zpwr$}wKE6!V@m*Q@M&m-eLueXghzC99Dnn+;Y)el+Fv*clcn=a1BE4n^lj!aDndbitw_}7Dirb*L(|G_Tfy3IWZ!2^;bVGCVCb1W|P zS1w*&AQ|CjO5GH-5hZ+b5}pQvKbX$^Q_%1xBLIy3^RNVVSguz7=rvo^1`y~ZDt+s| z(A=yn8i^57LbnCu%XLY>wc_tWI& z{Yxm7*WSRg0w6{oYCdeg@9C`T17%}V3kB4Bej)uZ%9nZk>N$iE{003x=SwbF;7gZ` zV*U#YIMCz<)!hTyx0hI{{b_9J4Q63m`gMG4r3Y&O>(GEEgw$?Mx7fq3zDx42UTxo} z1@R;dgW&3jUSI_q?FcOZs;hH;!vt!L*xH^kq<@+i+vJ8`$E%6@S-oEyG2Ij@%23XV zDL8s5fvl_mVaI?j7=<_FC$ahAm3N-{hVP}q1Lu%;1qxUX1Oq_WXi}LJSZRoXX`7P+ zm}YH*P~^vN-@dstZP+P5fpxLV5+;{()(q*N8bqZ&US+Y~6i%yGcLJ&;yf7VuT4aM= zWO0p9t#)q1h5``ua+5y^=OmWsy}aH)R|ZWC)Wcmib2vf;zY|PqZoDMd=!noS zYa4|hR^YmVeH67_36PNPj3l-=3?k>LFETBDsmOy*N&liHHb@K2&C3hk@O=}rk!MWU z!e3{yC_w_xQ!DZ7#8rb}w=dIq82#q64`Bu)wyuJY3srg~#ap1+3D2KEd$_@AamJ!i zPOF;`e3w2~r2+i`hNxs5yME7Oj>M=lu^LX_ZBH!0mr8~FPU2oO(IgsST23Y?8Rk(Er``B@>SzK} zcR78P-;Lk(H5`n)>k6fZbK8UHQ=L_TM07?UXMhwL?QQWn{@YHX^A+@;@jUJefB5qL z-c=7-`Jns0p9%4aUOm5kxx`~jo#*Cq*d!tA|9&Jv!^Oq1v7Am z4LZL5jOZx0p7|R1l+crE;5yJzH`;kuxwyHZAIbm)8rbv$gK=YhegEWe6^bjP9bh{v z!m+WU+1uZTP|dV*UQGzLRP-8FS64UG+CnwFyu02=^(+VvyO{#|v-AWv(WY{hPJZ5pinx4%jo}EnQ`|)J^*hs;^0fQ#_jztK|f; zihRdam^`ZNiCFgxM9{cvUIgi{+y?7_I*M?Zq-3I5Wi1C-B+xT61NK7!5 zwUOqZgdO!;9JU+cs1zu=OsZX!R8{{OJMY%{%&;~WoXPMyrB_zW2lJ2ID09ZIA1=Sv z92=o*my|Rqj^}e=&Um}7`mkMH&~eA9y4+pdUd3+TdQRkQ-Bwb8`yv=1Xtqqa^Q-ACHbUJAk>s z<+L>iuK%Dm(mrNMol*R!hum#{n&gH9)It=&oX@UYzjkdHm}fN(3l;laCK?B^c`NrG z&o59wnJk#O%9cvv=;Wjbb9f+i5Uz!z{dC7gvN5;^3|tD0$@SVz1?`| zr^qq2?Np(j6C+go?P1Q5!9>U}rlgr+)%cYbgL3(MtE*3p#=2kD(wQT-5D@}ae|?FG z-7%G_O{z0PrL1mp1>!G`@AA0y#C@kPnraK*FZ0QM<9r%VARkOAptU(eVNhVuHla3P zecJWQk5tt?Y9viInoqgRd@ekE zfE6nYGRYr*$oi3Ty-V!wg%Ms`5#v90i+vKy39dUzHa3OIVebGl)4@prbhOZPaHGsY z+;E02rWOeAZ8qt@k0Ed{!v=L2(mJ6_5P(}jc@CQhq`k|X$u?(>XJRb?#LzQGWA(xs zX6TB&!^81o)tNTA(>l?l*6|cE0-{pr2#h$eTLAz}0xU#29@dZkff*i5_>6O8`Q)T% zkDzg8?lOHlfS<;hty`!JL)&V|WCFu?AD zrJW^aQ8px*83LYB9B7aLN74U>65N0!ziFp)zm!nl%=3n3DpG*KS}Brp43um@&6?>* z(1;#{jW5H)Dwh4Ig!DCPKm_EdiaD}!$fBrRA=)=bu%Pdk59TaV065b#0+^wPhX>)1 zhVya}M9^px5*FnYy&D;Fd9c)>AP;!6GspWlaHiH+^$?y^)in7F@+?!q45JS<%oh1g zrxy~W7^Ub|2#6?#O$M6RKF>AL#2%W@6=*hpK}}coo<1xxS&n~6GEQ0c!dAzt8&RMx z@Ut{B#5lc}__F$qB9S$ITid_a69UKGgj^#!mV(;b^g2Zsvx{Cfnhn`cb^AuM8V%R? z44K93QemvFxD~cr-n1sBcxPuB!#lqpt)oI0|HqktGt;kpBR2BK$zJoHq6%2jurd90 zRFGNFG$khA|9(ckIJ}UsL_&p?5+BB|AX>>c_SA6QMp%WvE$~3mqu*~;U!kHmWg6qM zlMd>+D*hc%Vn#MJ3ZUWEshy0CZ#4tJc;gs?a4|YElGPP99@ZQWr!4$_Q6u~`S)w=2YPkH^ zZ|k;FGAmE1Ky-jn(184cYIyPtL~5mMYXIqO;b*B=D9a)G5R!I$Pn%pn&w4~dM9xK=ay7e+sDvr9X}DC$ z2xI$l^%a@@s*QioFez0ryGfO7q4bYPWu&xKrPE{phX-DJkBFd3l@osdD|@-sz2&1C zjHrf7nrVHvy{L2p(b+$7WQWo6!^JId@{pO z9;oK>nc<8KdW@v)Zy#qASJqV?w<8B4(>7v^6-X>o4I@V;7*i{E$D9Fzd9o_j7e?p_ zwhnVY#qb(KqBaWhGd7Z(VptB|+uRU(u?1be69^~f71SMtUnq#C3?k9U<$4kgcIO2h z#FBy}a-+Y_#@D9eWvVI7iMOt><&D&i`X$v2X=+<(G1any9k-5KPcAdAFXexqzN;#On>|`> zJU>v1Xz`@DLspl)`iPj0j;OM!-P0~Xmm{l&>p5l#j||LY7xO&sR<4dDdMmurZN;x* z5>Ia~?o(!&Z4Wk@wIInN_Uc9vZKzljA#?l9Kh9&o{6k_hp94+Un=iua{AVWTB1!8W znay-ykkXBm}Qe48Z}2<3c{sY9|bgbX~0h`Qv(K<;|ju>U+9#k2UuU~)mjSve+ z+nd@uXFzK}Q%P@D=U$+Yt53(yAf5Rfbvt%S8m~#@$bv1}0+AvAkK4g~I>ByhFwLh6 z=^IJhCqUsKTpk%61?bWA!8c$IJhZck*`N3aX%0Zdxx2oO zF)o??6m>xj(S@edECQ3ah1@pVV~tl)+;`!1y}!X1L-jVql#(<| zcw4H4amtOuzN3|D_XcT|%zSUzYrE4g)s9xWNcExvCIiMn<3AryM^BYBe*F1)LVHK9 zX;4`*NVCn?TybypndYaF0P?jz%EHLyp}bh7N1V~&V-F|Or*#fBtOpjFM5z05j&o?<*k zi|yXMd($_eW=9#&QA#}NSkHER_#;0DKcOw{ZM627epaF_O!8m?fYy&4@yvqdi52W3RHN7boV)OaE#F>Cer0H5P{Ds8;5CW>7{ zw$L9USULKjHeyKP;8G|r(b;uqrTJ1FVC7hPYf)vqt!=-ByR3L=N8x%vK!9zz=#Y%A zuAe$K|G1rcGx$aCm2^g|{hqsN!OUlKWL5Qu1BGl|MLbriE?4R^=f>##wrVtw9vKa} z`$CT6Z%^6wJ0l;T3Kc2IwemT3nLQbzLI}ywJIKs;_*RR1`r6Gz$^*=lQ>6b${KjTe zYd~r}yR9^jxcN&25-QsY_|sTsXq$0}uR5bMS(99n3P%UDfv{K49T*ib3=+>D#$vMA z5T{4m3RVjMtvmp6=fcunXXYhjj%wzRDHL1bd5CSqATo9SlD%sBJ7%9~C1v4_F!z12 z#^ipWb{Mt~W#YTH)x56!ZF&>^b1X~gDGg?2pPHxJu?H>wHz4wkw)V=2!sH%&jkp`| z*e1rOw8jZ3NQpLIHFD=x6yIM*G3ss3b5snElBp#fDG?$qE}dFBFUNh)7!+Ktvf(a# z9$%I>HBzrR>2_?#we~A7@mU$h1?`-DfcXMK2ZWx%c#nddpiuCU{l$i+0(V~?GP&Ho z+KkotIQub~7aW$jIZ(YdBrJXq*T&9L@QmT6B+ooda0#jT-Yghkfk0O9{<$wKyD~97 zt(OvfZrV&gr|>VYvTpo$6j~w3)T@v5rDf*n9esx8hgCJdTjPxn$&8XurYrm9?$eF zPVsoN=@J@w>>`wV!`NZI$TB-wmCYFr zs>>zw3pyz^sV&q_ZIO$CL&_7F&Q%gBcG=}j9D9o=aRTlZrc0|*yA^gcON~ULDCBR8 zQ3h9N01wBkNiMt$xjW_aFkV_wcE2~PR|%P`p50$+d%CwwdpXu+e?^_iscT1e&hRt*xcr%+MM~m~|9R?8W{P zlXaDSsswQw+T`%B*$D#@_dpPnJ3}4&!(x18ax%2$H|UAT_;eZs#n+)+!)TPWC|pTZ zm^N-~fKER|wPLBH3`Ctc-9_{d077L_hmM+#eWA>3Q=f-VL18pmnURupumf2RD80GC2vrQZerweF-!H5&TEj;o zThK}sjllE{?sBGhZoCsZ9zt2aSRW};Pld|x-MjDmttfyoUG}FV8FwlV7SO2mg{j3` ziO`P0W=uc^@{4xE1YaGWpKF~XN9nr(pX1U~R<+VX)ZD__&aeg38#G?_x@~**Cx`QJ z;W&4%R#HVZjhc-au)h8JXLIzg=eMc>V^00ovpi0klkFV}Y_Q9hOX4s?IP$|AZ>bS- z5_|jQYf_Pp0yJ(M*;#8Ye|zbz>}P0_!=IN-*cgy^7V zYIQDPifluhZO*RmnfA3OqLV}x{FcVo^k467_&1W|R309RI9lmZR8tF&X5iW(V)K#osy`>f?o=`@y!ML9I{%7Kb?7=+Tm>9FT8v8 z>f@N*>X;gC&uiXr;?3EPao{0NF97BQz=Jb10X(-kP>FG>sl@>I!=tgbvSRxZAtpN| zXS+KYD2Viv?}c5bl^e5t+4iUMh2Ji9*s(D<0`B2L)d3S2;V;B7O|T0On3eh?xlonT zLOaZeX8g2h2Ko+Adz-qAD~5J)e1WDXYMi|9Plj|>9HX22;c{_lPEs*8Dte84cK6-3 zA9qbpG{1?y^%^q@6&0$=xJJCZ^!j?kT??)ip6OdM$L=Tlv+?}S#@Ge6P$fw`-UKBd zg9FxQ<0$Vh1XL5$2tGE^M18$*!GgFs6yrdctfSqbQA*@M%g)J}BO6^VCJ@5NcYkQL zm7~7JW__GglCP$VK%qI}_w+)@jJCeK&C=lJGmb1JtxCZsPb@_xRog?jU6Wjth(`Sn z{~;ks@3jYmq3|W>m&q+~B$*I|2wmiPIUN)|>htto#uT6o^jeJSj7BCJAl8F%gyf1+ z8-v`8%h7scc$<8uov8wcVv%SO`kv7dhnAKWJRf;n_UTXZ+_K?_?E#o)M+N#gNdvl+ zj`z;vlVExSBx;yCX(T@X@SuNzeBq_SI_C@LW~yY44X_M^F`67y_M5@|J`6f0)@p>W zlWxKH*QA>D@Mv2*q)#A5FD)P*$DX8iK78raPw4jZHBHKQPCfIScG_}2|0MivkTVmO;fI~+P? zPgPegwHk;%6g|&jiDMU5^GT689yY#@7sfw_kMQf}UKim=An6ef!*OVjb3-Dup3ie5K)oEgX;;*U%B7iAw(P1z2xwVYj zo@f7qQ|LN2q@NqO`s55;)uj3NkH7c-Z~Oy)jnCa0&E~~VvcIpRt?hrMy1t&fz`2xp zWgdHW&;2CPeoV=!H^FOv|7n`NoC^o#rFx?qhIOP$Y{4I~-(sXzkO8OhBe_pyIo%`X zdpqq)6}EP}R?UiaEK=69t$NpwtUn5LUN@~%@a##qzjouxJsj*){+aIn`g*{Zfa_7D zwtuRW^M|y}DcH>^{B9~o=V)Fj7E-&O9u`2$#@MjiiwUW>(tRy@{s>=gedoNsW+;xI zkIz%=hnrA8!43TF`vq69_t`>?OXKyWdz>3bBi~=TVpy88YiquZ-zh0w3e^zku~na^ z)3BlZzPA%cZ;gpiJMl7hcX~o!x0g@?dOc73W|{3*;qL2G7nsFuxV(XO6LU>ns{BXe{0s?KC)< z;>4?n8&f94cYOAg7bQI8Nz=v2UB*f?CttG&caBfyFM&=c;ft0%&Pb8p^|uX@?#vJErn;4fxd zSqz-4oSr^?sP6%mZ3aTc-7=(BRF z%He2mD`GLQ+XXB+yk#biRDGV2p z_*>Ax{RXBO5CedpxK&3Wm7xdv1!!G*>3~Zrjxx>#`s3dUavmGVYwEzzfw2|f^fs23 z(Ex-379;zVbQ}0v`LgSPdtbb80p}+9-2A*F%o#x{n&}Q~#M+t~tU)WNZ~cP~7`QiX z{d{cr`%_yCC!YhC76%s_qqxZ%2WKP4(`p*wFNDo8+q)f4`1t$JeuUa5z^4n1_bf&6W~)$IFQ*t$1aLCNAkjFvmPL?sF@b9{UL+!#&2&rw4-fa~=t6-K@54aDv5bg* z%w7AKaz2B_oc9kGiJ!`vZ7*Ql+}xm~UIz<8(jQQ!0eUCfYqRterszNg1V7Q&q+HcA zc*)q_d7X!w+nT9H_wp@(b}bh|NKXw8I8IKJtt#@ri5Ech zJOT&ly3_N0;z~%URh>FBHktUeRw~I_U{PASaJ5zv8Xtdw@GB8=uBqYaX-+8)v!8ag5glo*rt(#NNwt+M@s1nyeH~{ZHc05YV&Z>c z0mkmTvB{G)-D~gC2ELzbES|k+G0&kAaeZdEjkjGgYDMQnrFdJaSc<9dhdI(|{$O%u zm?-vW0m+ngqbjNZ?dE@9A14AS@rG)>EdOxg@}}7rI@<6LMTs8oqW^LSCR7@y)Wf_- z-VhN|&MVaZ71$vXK_8$;gMGn;t5v50P!jt*Q}D8bOeDGP;{sX~OG``Oy-JNpyclZz z^>=0_O?(3=A}cyi!%foDyq}A&V$CEOv zrkjIuBg2cMA6&=gj++}aei&g;MR&*Vju=Rv_NPfwhH{6Non;@R_2Sd*dj`e5yS7$V zmM)9&e^!2cP!J-pIdp5PPTQ`C?K_k^Fy6Eo%(UJm=eJBX^-*nkc2MO0qns=-u6)6H z!8mCsfoF%$dPRR*{Bogm{s0w1Pl04sB?(_d8B5iL?jG<>Xt97g`P2Bv>3)a1ydOvZ zBaKQ`6PRd$TqPVZst2Od>Kr6t7S{;r-vObp&XrJtC>?8wc>8wZO~$LSyN}b2*oZ-e z0n)-$jm8Gh#-|yHX9f#us9RHOoQx2)j34vZ#H*G((kMyuGKhE5?u}|9YL0X(x7t_c zK#^hZOc1gA?wzHj6$%1J7EIh1-b$7z)-SQ>O|QL}@9e1gRCi^?Qfi-B$w=mym**Xt zc*eiRuN>Y~JFpXCqB;4aI68zN9n94VDYKSXn=Cdu8XSV*HMXw+3O6bZ&hl}Ol;9}P zBEE8039dQ;x1O=W4Zz!&D_^-qF@n zSVx-2@w@lDZr*HbW>%jqv)c4YCnJ1DWrwKLT_G^YIn65@_z8H2J^6C(9+Wpgj|zq` z2Zb)<3h2+f8yiJ2%GR))S_eAm0ki^Zz07p?15tnpc2&w=zI=&D-`(c zusklFKc0k1at%%LF4c{tt-fSG(vZroQrm)VINT3AhW1r^#w`w(yVEvyDrS-92mGe) zoX)e)1W#t-sc-BWr9W@lgs(mR!z^|mmfJrs>2F)!tqy;^y)ZwYsd@l2nFrk14c{;* z%gn;c*39-=pW@!qz(vvy!n_sji(W$2I(gb3<|)#!#L0AJboWGl}u7&;C>2G)#(Y|*R{Azm zQ2?#-Oxz7~_&CDNhCw6u5-p^^#R#`W7!z%}^QYBMJXzFmw($D$B@|UB=(e6r>~|#z zxLH7b0wIkxG-NP^M0H}v$#tU;&jla_Kr8~y6k|0CrZV7X@^%>dV@nW@LOcJa^TqVI zl)%0&Fqgp31Q~#s1!pg;X`4i7CisK{`52}=s%dXYSy~eWtH7pUX7@vQ&}>_*0#NvS zr5HX$4j1=TUGiVnaA{YL=QYVMkfrD;ohec`H z1hA+fT{UO;h9MdD;^n>JTu;JzE&Ky}=Y2_7jC$tteW>LxUkPv>wOjf(cKI3|@WN{jKHtY_T`R55u?f8jUmp!*Z)?@B&cm3Y_ zQ@U+(MuXxD%ZMkE`#7s`H37xpSWz%q{n`Nb4h{{+P!Z-pSJUhYdhlFDlOwMt!q2k< z+WhzjCux_kUpKH>@IDUOa5<(Oo&F}Ev@5c|&iiuRsH=2DXlPlab;Esg#~5CNM>+#< zK^=fn$TdHTJGzm6_E&w5Y0P~as+#N3)TBLSB|rIoHx|^_)p-lQn(2tH$Nup5DT>d8 zPe&67{oNB-|~3G_l&e@!$#l3&0jAmIcP*ci0W3J&{1q9|Uh)mgf z_$P04d|Z&7y%1*bGb#oKv#XVd?Rm9ew+~vDZ}l9Xs+~_Yd}wUjf4IGvu6MaB^q~|Z z4w^7afp!2aeLA4<1>6Q^^*X_2s-oseHC*{ z|9FNwBW~|(Y=C*i;5F8AO-{yK6k(R`A!O0aLX$CuY*SS*ex|7u$h!XyqR-d3RX0!N zXk?PYHK0AX!?+807b(+#u|aM9a=EJu7X7SJau|mVYIUcGE#yuoCf=hpW`UV=saPmo z^Dkv25%wtk`<9XlT4?esk2YGMt-nRdx0lyQ2_%DlZEbD8y*pW`EaL*kBX2LSXnxQ= z!sj!3ltE~!uZe9EAx*Vrld&7Z$30drwP_k2J_K1YY!&crgSUz?WW=uTaxb(Xd%)gd+J(O~_&Kl$ zz+g7HoWJJKleD!-0sGf}RXscy&RqetYj{MAQOn>v#SC^>fMXzDa@H1zS0iya#{r9Y zIjA^^_Vn$BoTCa3BT$i?WshGk4ZhsTQUtZl1#2Z+O>h$kH)~_XiS1}a$)&f0G^H@{ zGeqq%IQyfOt}2(+h5!Ei`Ez1o0$Z_c55p`IElfjCjV_SgYJ{%PXdUoIW@P6!>uYqM2oI$LC5k`|p8_u`2f`Wpu z($k;fz-Vvuze_?&IzKt7!^yZp%!FJ5f|YM4AnvRcTe6_6^56T%63!cRQIFy30s;eJ zLU|bF4XXqwH)Rxks{trx`-GSU#V*4GX9oxHReRC%_^-RZ*q{TzNsKhudE~kGpIR91 zt?4K6Dc!gWHz!EE4BpjS34?IQZ^_9(MEtwB7zf6I(=fzJgu$=S&X?tq6igslBUBkZUA^-}+v@w=F%p&~TkRsg)& zn_h=jd~?%zDGw|luim-^5u+MhXF33$v$6rw1=gjDgK3r=`?o16(PVG`g_n*Fm7WYd z5{x=a0`Fh^2Xn&v{}6NfKLPjppMD0evQn;b+`uz1HeS*V@`UR@PjoU>|^KAmC$QVCNq4?J^F|576%bnF6RV*b$>!-w%k+jB;tM zAiRGBUdP~;1~ntV9{-*WzNgs~G8+4L!4ut>!R6%|MUMb9ua>G7g*dV!cKti#F`kIjoU=fJBRSE1y zA!kqO*ToId>u#HE&nix{AP)tog)4yC5#2z}Z8e9bUWUm7tV;)j4?Bm|id`s@Ao?1N zUCm}&g`eUM+~5Sa1BPmKXx$(MrLe66IUyX~CIXKb9^w?#*(xmjD;}L54uUP7ic$?kdDncofD(@C>k&Lcm+89&5fI90O+Zzvtr0Y~Y+D+1i^soV26sf zJsf90(_My)GB_14Th<(ggF2Hy3q_o_v$yXEeHi%VOAE9c2WW3N?=4{#2;Q5$gjb z7GVEMuekp4A}Ra|pYLJ3gHXMCxOMhTIJ(j$Kj8u*zvSBh*|;#Vbp&Xnn2%6Grxc@( zVVJIl&_<`D(ZB;k#KpxGX`X%lwR`a6L9ks3d^4z%u`E=1V&Djz9Ygq6zq)hV(qo4; zO(JJFTg5QJCi(#B6U?+n4B{O{j5wRlgStuyq*)WD47^4avZ}kKP1p$@_ z#)Jphc`y9<|FDH2gMDPLn}8w@O3DIAfK;wq!HmVeS#U38JBui_rl+StD$Slc2$Iu& zw8CmZhk!{}ay?YCA*00wo7mYqd}JVoWJHw%2L))$ZtL|VFr~_oP4#87gSI^E<5^L3 zj`DW;&!1d0{xvl<0aSwV&(uRGy-E+T)u&INf<=aq;ksrS(q{iYjpw6M|EACh zD#jcC>2cPiME?&M<@`59dx$laj+<%4#r7arg20m10IS2on3dSr*t%a|gP;L{{f>LJ z1{L)-5GK^2T$-CRoP5FMviDtb5^(VwBQ2mA0|!-q_HHWg_B9BbXU*a3GC}P%D5?1Q z`NPM5n2#bTYk9g@lD05HCU`A@Ky1i9m5 zi1w%r829xV!y>i~p#4LnB-pxj>z3fViT75y2tNt)k9F*!z|fpjFEpX32dpP_F;Ni# z9?vYQWp)yA1ol_2UIiFT{;%ETZO}c^eO|PW;TeY@KS2gHvZfJ`G+BfGMx0-8Z^9E>cB?%UaHFV)ei?M0 zgP@lKW_?9Y ziXW4$@@#SA!^~3vs~{~czFjDvzfcYBadtdUg;N})&R{=~Pax7W4EUDo{W^JWONb1| zxO(5BIst?|d1}JB6u3T9i$b0GU z%LMe$3^4zSAd&=SMkKT#(6Ks!qC*)OBK8;wr#j3SP#`#e&spdXAipu^^t}%Bl?WZm5jtmq$QRG(A>fp(N+{UnPA_@^(W~+MyQf=A} zOv`PShcNZ^!anwp89>Vrom}Rdqnvt_Srqf0jvLH4i1;}4KU}y>*c-kO$)b|RZOBfG zps@YhWJsc)#P#68t1ji2(aR7jtahncTU`Lqc&|p49Me6_O#hrL5>Ir*=LVs>j0xq#mMFFNwSYnsgKwT~LUkf08=;KF&3#k+2?C_6m#bg@irGj}OMxo}6b!idS&!-n2 zh`xUQROUopmm?kJFdvm4Rvnh#Di%|3_OzFDz2p%*cb_Zr#h^x_KL%J;#saQp;%)Of z12v40;L%zw&JD6C{vw(-rE9>$P;ivnMp#z?!3Z-xUIj@~yk+KT1JJRPJ!J`dO^c8u zH(S?Ohl~M`5~GaM{!Z!&8p$-RHs=~!S|L4kT1P!)T3J11iGiiu%bVtAYWST#h)g9~ z)rwpu+0p;>*R`jP(K|u58rGv?V3%tHhcuO*&bYM0L=-HVu>&e z@-dud2LMrVKr{>g1I#sSf@|@4`0Y-Xq0@9T5mB_Q6=6FjgBc~CxegU9B|g3uW#Tl< zo!O+mge2K6jk_IYYrli5O5tp*jcb=4xDEK4cujym(irgo*@ftm9~|RT#59F|eJ_+H zU{Y{ovM^p%h3{UwZ&7ue_J$f+CcujD^FOT`kb!wo0e?v_M^W@3Li24a|b4NN zA33w{0-cPy<1`UXW{)|hgJ>`O1A@PDwjc~BSq9UaP*KwrBhwYEJE?&(E8v9-Xi*XX zfCpIw9nEcR68&7Q#RpeGzNgt>It}0Vnu@`_l3)a9zvFLkqQN9T&1xY&s~tvi%XS|y z(V~|0r|A*Q5TChV-n00nTKRkO=bHHD5crzn8&8DsDv+OV;Nq@tZP}<|F`?x*j)>GQ zP=+#YX9}SyDxi%6VW$t=dl{w7Rz_;r!YcGqskn<#215CuDmpART7}vUEQRolz&t|4 zMHy*aWEI0HXutB+k<#XOK&XPF>Y!`^=4iW*=dLj%@xPENzk)*sWLIOS)8kclgcMS1 z6F5xg&z~1@v63r7@;U)Z3N7&|bYl$iD&vQ?DaPM#ij&+6+bSd{BjbT-4v-Q`%F09= ztiN`HTTZKiXSBkVtU#&D>J>aY@<);zV*Lm2$qCX>oqZQe!%}TsUo<9LZfTLOM_vz! zec$f$=#t`cX;$I`i@I@C_Cd)u!`oO+iLQQT@zvqtj?&k`HNOuC$t`#~iLNvX%44ti z&s+97--W)R90Tf`fUb;wZg8yq4o1X8L18h3d0@ZrlvDU`(@7-^H(mBZ)6AhQB;MItnXv-}`fgh!5BvDH&=1P;wf! zojZqvFZSw%JX$hrp@QeWyZb35WFlB(D~1`#>_d5H>BUL4)wwYLXs+=Mn;~(vHH4}Y zvBtR@^8Rm*@gz8Q^)qyXr^HKC^xgGwdT743AWXD=a$vf#GuKsHKChhg1S$z9dq?8F$~wm9Xb{=@yqXSq{_wBT(Y@| zc!msCy$fSlS*lRSQ%4XK3TUg{lrEb|bXB5ihN3ZBirXtV+@YvsVNK-7wKu_K!^f%& zGL~A+W2(P;*w^q}dBnfk$9Y1j}OgGihJh(HSH^YDz z$|$}&-_z*gfPq>}FO7MVDKp>}0rI&-{>O~-6g~OP-;tRm(Dea?3*?0G0Ob!@hOlXO ziVwcVcSNRK^;^*t;(9eA-?lH8$=WQ_7c>QAO@Jf;GY9Nw5pD{H0pmRXVV`>t z`NPddO}R;km(4~16-y)qHhY8R83NH)I*iz7X8MR4IFQVQV$D>9VOCJub0_s~N7Z=p)_pLMoRSoq;mn9Ls^sl{ZHl#w^225LN z-$l1=j-0HmKt?I=Epc=%yHN5u?KpJP4}K4qK1i~vkktH3?gk4OU028!;%S(a4PfbS z{HL>CEHl{q--+EX!MK7mjOo4E|319%zoAL}zrW&N4E6s$hyT^*a6|=H_w+PM{HF^1 e4;*ZAxOh&;?fs?clfP$H3}V8PuX2PmJ^lv|+4A@R literal 0 HcmV?d00001 diff --git a/node_modules/@cucumber/html-formatter/test/__screenshots__/skipped-failing-hook.png b/node_modules/@cucumber/html-formatter/test/__screenshots__/skipped-failing-hook.png new file mode 100644 index 0000000000000000000000000000000000000000..3309d1ac2c7136d3fa10bb1457c8db7ad2ad7838 GIT binary patch literal 64349 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 literal 0 HcmV?d00001 diff --git a/node_modules/@cucumber/html-formatter/test/__screenshots__/skipped.png b/node_modules/@cucumber/html-formatter/test/__screenshots__/skipped.png new file mode 100644 index 0000000000000000000000000000000000000000..06114b69e1f50bb13299d3c87c4b0173094a9354 GIT binary patch literal 89342 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

      2vy;o@ z)2j7(Z-ew(d^hqmG9N0eM-7PI_k{S?hH@JhS_^{}3s}yO=Hsoqkd`q_^=pMS^X-1A z94oFJP`cAh^zxis5Z`dKQTJY2T}!#tMDZ2#q&0;}?Y?YE8tZEwbLexIHA#OoKU9M( zUwe#o5C|CGxVMlxk3P7%HMW+E8hfw6AbUHSCjXO9X+|%1y;($WHf4{Pbcl?;P3@r^ zD5gu3?oS7!bL_;|8y*K~8p!s54p%nW>B399g@b?phWHbXpAUbmUQ!TB@rS&^KzUb?9beRlfmCQe z(DP$_nVHM44spk!U7N9ToKJzm-|RGTj=$mZ&HoXw$iPqMhcTn$!t7lweCJ=Nq#1JD z34jRJj{;`KW=C?FZWkF3-+5)qGxn2L@54#7@L#h6E}kPcL?$f&(&d=0Z|+!ghmOov z=vg88J6$@@T!;HJC<+3tw;_g)nK)b%E$M9Dh?UR%={NUvpQeF6MAp$uBL1bfgQ^8I zMP1fr_%tAj!nnlMj+jm1;m85Y&kHvV_sRf zkXgHKvEj22UIkKT#R7hBv5tYI0oL#>0g)X!su6z#w902*(BXHe302HCBYIlh_j?TT zcC_+$;2c{?*_zLRL;?w>=}_2dNeDD1WuMP^7V!SODpLpZ)Q93&rMEO?X0u&7*b=sT zs)?)hF}Y}zw&J~>K`Zv(rk~rGDP1%)N86|soOg-RaANd~tBAhrG-U0|U%5T|HF$X@ zQ7fTq(Wj?K;Fv-7J0&t!P5kBdxP5ph{UIUOjYz9J;R^+Z;%2-z{N7m$d(a-i^D%t z&X)q~Jc8o%qWR3qZRGx)@g9er90EN(Q`IiMyM7G&;j|pO$Y6*mf^)$GvK=*L0k+3Q zFvBD_5CA6bE)?I*n#o$kx`uUI1xYu5CsX6QqVJYw>V7WsOYTVpzx5{}rep{F8O{>= zE~S?TK@HmgW0v?fh&fOfmkr=$G70IYK2+i0uYRvY{1_4WO#zM4_gaG$8hfOjCvrPO z)Q>l9P~MP6Fjgq-?E5=9zo4?GW}FZ)qqiiR&T1ms)7PgeOv#qNIDXy;=yq~*BgIyX z#)jb(jLx|=oNQ(1m7%z`oYPpZrm}Z=iuOgN4%v^K!1rc%7ZNfna#FcdIWDv62ucZV zXJN9BX5UJG*bn7t_XX7m{s$dD%>@y` zS#^Mee?VrDtFZXvLp=KU63By6xnetCqR&k40@*?PllbP*`Uv$?%=kWL=k!I69$7sQ z7p?aZeKu&(B7DOvY9bfusl6j_el2S3oz(S9RZrHa38zh+)9xN8JitF=O+)A0ukfzT zug+%Fgz>6>CHKZjlMmczMfXMWMG;JWDs(jor#h=*;#iD&^Cg ze6@U0B?u1TVe4K`q`?`4uqQ-*04-sV-+F2q8a`%X{6jL(Y9M|&`slgfU9>!+O%w92 zC*!aLuS54gBu$q2*QN)`&HkO1=+tYYHf2FZ!ep7;wgiHdPhi}$s)N*B0VDLw$0CA7 z61FWjg9PX{p!o(i8t8m|qVb~d*1CIR5XB~5wP!7$xzRpOkV7U+&Ux=e2o<;yuwAjJ zZ@&z0t`DM!$AZn1Bd@TWPX&Ruv+?tvP#4!RX| zBj=yf-$1Wa?i~4*o6u|~v&cE7sc#Ntc78hB(y|uQnxtI1DWzxi^PQMG=AU?UBe%r1 z*0EC{3)#_hezuxlVQu;4k~mK8$xy7+E6s4D>K>4kaR?bWfcgyUEZ_)YYEV3RG1VWS z+JFrS6D@bLZ6_l_D*MS**yRUW*p-=uWa=z*I(?v<01u(Qo%X!$HGeQ6fLelWDcrQw z70ev8{%qspBIZm#r+_45qJ0biUA1quVZ19FiYDF$7B?dV5%=x`F9=;5lyOLQGk}x1 z0JkQ577)$u2l8NmbLNnlH!WLiz<)BioIKjS$xR_%B-(v^9#I17^rT4_kUv~1-Gi)z z=dx?&uM)|J&A;c6t*P*8czi2in zn9Y^VUcFB(h}J8Tg;E3(sJQY|r&ly0vbztI&@6~mqS*KiO;p+GVjecJqntX3 z;pyJeMQCE=ESSP^!EAVoE514x9&RLp$_F|!E?KX~iLLNixj>C>(j#9I=R7SVjIfYf zOm+Rdw!u1hcMaCPfZVF=+YNjI-q6xoKe zL>EW7(DJC>R-o305w0-88;@a@rxBOtu#ce0`TVQy&mCSl#i$v0=G|67TThx7mGE6( z{gSs9 zp|R5?u|+N$tgj zAwXZ2Q*m4NH%s`lw*1v}m`UeTuxG_>@sbEUJ^gTRs2ys*nCnh1CWU2cP902??S@Mb zir)-GC4xA13zS|7UccY)>j!ZvBB+jFt1&Bq^d|U#-NDlvlS>;6<`77}q!?KbG|n_pta}zCof|i=dT-=K-sONIKJ-C7&t3zws&SugPyMWqx3S z4%x_Y#UB3DI@!L`-Mn|xe0fgdgHXKO8~O{R`*JSA*N4YbDSl^MFJ zXCL^4z|4FQ=4ud_Ld^bS=(-}F2bo@GwxR<(hnX1*r`pe7E1}J7Wx#D3A?WQ(E4gA? zQ3id@K}RVW+@;gnuY%d(sV#So z4&QU&4CEa6)Ar}Nj6J+MlM54$FC1ui4L;*Zub{sRfVu=W!4Qy=gQyd*ga1G{JTt&{ z%@G0f06pKDdDN5<ixiX zux*_Mp)`mKDMPPczlOm?KzW1Y?z{?Z8kdB__zE6mt^Qy%yLg=`-h|o1ZOWD*XpjTg z@L#+4%B~H62w#6q!9JGBf!r48Vw&2u8RX1)>OJSO=(_zRiHiQdLYuHqt}Xi+mPw8F z-{U6Ly{tM$Yl{C!Su1T8|HFifOAlQ0g4-F;O0S_1Nr*|j4zM2>A0Qmh3yNG*d4li4 zo6;TtPSVo{p`Ykb@ddOaf*i!20D63ixsNccg+u$oKmb;72WrvJ72#FgcLz9dDJpW8 znY*uOCEzN}hYSt33@UnZi}%3tJKfCrzWppz#L5aXJNF_9v<&p zz}fWDA$@KT(&MO83_F+>Ag^Q&zFFCYIzI5!_CW$4Odt9u)Ib6Tzw`7}Fg?h^47k0y zMvhtH>VfcbU<;6--iOh5U(9b9*2V9^pUHF_E=QuYfwtB^CJP?mreJ6-q+#(I+*Q-< zpo{nNn}pyB_=#$8+rrD876O5=Q+s*{Pv&H~W$ht3Bgkz~y9ujr9{0P(DFm1=g0_~2 z=FQ+PbYB|RLDayBNFg5u(C*k5Fbu(C%xpy^Lm#$;_JlhK_UnLI0nY;)?~KFwU_6K7 zD;l_mH|hB8sd`U5nzev_n~#?FAPD~tC>Z7dN-hD`-c`9UWBITzL#zv|d&>khN09p# zibT3Bp1GF-cweN%63ityusu5%Z=e&2+`d`68-IcjdHHN*Y;pK3_AsBy!KwuEAp-dm zh`R?qv>@BgA3cBf9jqPRy2n0Boa%qMCuX-G`t-w1LhcP%XL?ME@T5i3h-u zx&Tdx5G9KZUjmD!;k4OWa{1rdU@?hSY{ zG7$et#2M?BSHUI3w9{^_0(u2&N^)vJkpj_CJ2jiK(sT*pC8 zBi1sV@~0+XYD0WsP>)qS%!@Shq3CJJEyHJOn5C;+xC9%^z|Tq{W%nn8QAX(7gbREU z#JxoqiKm5r+41s7IDATuF^Dm5MKZ5RNG{Im>*+RhKVvuB7L5ErZ9&$6#@!YHqZ$$> zHi!qcx4L_5fPcT0=ucP`APyOsAsU4l#sxxGS>e;m%qQ3vyK4*OpyX^Re!t&bnx0y( zISCe&_f_Z?_yYju<6Waant(nR=#eLNwqu56?dGVB;-&b+*2zNTqsG$Xg5dU0G5nvOThPndIW^e3XVF#x#uWxv11n)38O6hb(B1q6U-d& z0+ir-S(FvnR=zI^zd9G_x&WpnG2xK*(nH3=6hm|G5iksxfU((?K>Y|N3B78B;%~?W z7M(Fj=PDra>3>JkEs5G=fLRJgbA80l;?kTH(nbl9w-l+1X5!&Ya~I6ccHp5|GA0@a zg&7y(S+Sj8-~wL8aHVVBolAX+uPHK!dX^AV!5S#oD}^_&%v>O(XCBNcCQv&8x=yQs z%`OIB@Iichd`|opVm9Jf(Kq5lGVlDi10uGf-XZ_478iC1%t5k~ZBkM0^d1b?HvC9L zuthr(JUG8I1>;DCmnQ#Vx}d~-xJqAAdT};i-F7W!R4lbY^lZx$@kQ1m0HRn(#X%zO zXQ>GN2j;LN4z6vYRfI`V$g^3NNX#ayKT-jxE>?LKHa&`=6U@fZZZ8sc-=0O8+3|jobjD(FxtU$gfAj7!Pg&@@m#jfp%H+)4GOj$h z?(mVKlITeuO8J~UUjZfqY2E3F?_4)i$S$ew$==%UJ33d)ECt`&UowpPu(uPfx7`ux ze*BKTmRqLWoq4i9`5y~T(v(8ox4pE_C6Cxw$`^?K%(Z-L9k$B`;N1|jHaT@jC(#)) zpq~0Pn7#gr3(1Vg8ihB9tBZg*VntX9vdy+Q6)aacI#I$2 z0Bnc9T0Wdh;3C%d2=Y(Z0idZLUF4kQjr){(G|dlpBdIKN_N1>}6Eh@WpWtXFHvKK? zR{HS@YA3_@7cfzRawrVOT(KtS86G3bh*9Ot604w<4`tp>D<+hkoYo^+A@&qpioxI> zpp>%LoO&;;EI2WQFT8_dNifPkr_0xYGPG_9f*1?v|5TLEM{LL{_W)R!${hc-4l`IfC6#a~w6AlMZJN7!py4@*B8NbiZHYEcFnnBhWTNu&b+< zD~M5Z+W$vevR(Nwc=1}++730oIjVC|lKXnnv^y?<1jaYaN2&@F`X~N_*CP5I4Q?p*CX=#B(i5Y6yBJ+I~vXWb+9CJu$ z?5wM;*Oq;77nMa^9X{YTA!dS!2VD2k-4JO>n9QdJKOA_h5Qa3~|l)@;fi7+D-(ixk&kJ znY0MaaD$+)cgO=krBKs2si}(JrgQ0k4?x4x(Y1VL`z6H&&6ct^H>T;L7%EAy1>Jw~ zP6Ypmm~c5;CI|~^a@P-VtU^M$_G_Dp#=+TGx32YWk z=D29eb~@iUu;36)y;|4kRtE!ycYGw_1qy;DpkGBCV+JHJcq1g;f7nHGT!f@d%YAwz zBAGe>+TwNgg1kV98R72lTe-d=w-1aP+fmwEHqQR<+jw#iyjqs6cJ`3IF$qJb0UrUZ z3#dEjzO1`PT0b{eu|0{kY8GWde4VR&x>yh!gTtvviw;zzd8J^|-kc{;LurMlwhBHl zHou)D-_EZmHfNyD2%4*~o-uHq~a~SP$&z|J7gVFOvntxVTNZbXER-gD71|;}4 zqQ&haJHyuXWDB3OzJV}h=r)ERHV;fxNz?PtCHRDPyE%BYK7-qk3;*ohOW%pKsE)>K zkY!XgHny>Vywc1fm36(Yx4(j)cTbJYD7TLJX_D-UNe}(uiV*oef|oQ{3;a?g*wy@C z+6JShwh<)oZ8EbRIHy+b#QyI`k5pjZTQU{LzuLDhu?-zO^=Q^ro@cxV2DJemw+tDLMqNM z&f<|yT{mcNZQLHihGM~8F|p|?_?Tjn@Lelq;RzU{;tc(_*KCx<33}d@nR}{WvLWZh zNIK^Vrs0$X(Hq#maVJ)$yP5k>J8%f~2qEF9bD6XwsIPL)At`J64GjF1y}U^VS?xH3 zHGOgE=JI{9hl}HtOk}?`t_{GX66c9vp`1a7m_qVEIx(pPMy4)^MTByuT>S;O1D``F z^Zb!84y1tTnQH(V8lsKQ-XrU%C$?k(TLBl~6Y?P6Y%)qHV+~6$%x8@GN=Uh`$;aRvwFRyB=U)C7 z3;1*Oz{fre)3qK%G+cu8kk}5!_7$-C9*%71kLyXMNZWvU9!PRFrOYXn2k~YbEq~fLC&Ys{%S-Hg4%{H{;Cmw zQS;#b^GoFM7F^3!!A`qjTI~6^=!}qi$i@Lh+Ew_* z>9CA!D~Zof>Lb6-t$q3&q{GiHI~*=~%)X+FM~ag%CPY-)zssDsE28eFx)Rb4Sk3-V zZx~j3prj6GQj&|zMO`1Q3s+(jd65RwrA$dQ6JO@~2tBrdVQ!quD>345M{%Ks7|}ky z=foRo7IQx^+!josK}|k|P>qBEUl>we(vu~UF_FyL=qCre&;eF6@G@xC;+t(vsf7Vy z%-z7_W7Y#aCOPsqIFK2>Td*^IjTv8e8u1j>miqI6NX5X$>09O>d0>j(0_59%o0zQc zr>pR6_C5f@tz6p2I{ZYyA2S-yZcXA!ydD9C$`bN&{`Cb+!r|T3z?FY2 zpzL%snz>pd#=~U>E@6Z@10I?*vk;S;fA^8Z%EM_cV20KbLaQ-p4K$ zXEZ7EsW`DS;~`!p+fQjQ4{8wO{e8|?2&E>lz%sXN>?!eaX1-JrhqKI=8lM0n4&dSL zS%@GvAsdl{r zCUe0P9R5>V6dWOFL}Ig_c+z(<@k*}ES9I*hn~L?u^; zehid9)?LEuCf{ZuEF2n8{mbYD0p_bLU7O}z3NF8&Z@K@maz2<+F#V7E@a*lCTjKwT z53W16_mAA|+y4J%vHZW_k8>78FkFM4?&K~Vc#RW)f0}`RyH^4PTOH>?^YjoP&7BY# z?jVABB}8>H;97|88G!2yXo}L=DQ2V)`0X3%8Cmu`Z>vt(cI73NHr_IB0OPUk7G%cK zHZ#BvdKp=Cm(5_KV@8>2W!7@~jS)>?JAJ>nzg27=g0 zpx&e2W8gu!vYyK?vkkzVzq__9{Wl*&P5A5Y>2I4Ice+s)|fR)CT`m~l_KYz^tB7Cv+$c(kMIKra4*l?&d7 zxaXS~TQ)8+?I}D!-)Js5^b_G1G2cda8n}Dft()TDG5v(%AG>pDlA9lfb%_u^oQgMy zO&S~}AQeIZDi8>~B+sH8~|APeiEzr3Wx?`avLS(0{{IXSAQw-el zhLwhBF46QA3v>79S%%E|SuE734#Kah^+}-(Bkn6m7LW8h1O4ujmU&#~)U4oNE&J-YE4W)`k9>rH z=d%e2i{(Gi<9Z?4^}1q&%OctZ2m{nj5GYnpEkk)`2En+q5NbZG*GW23QyGzlzswu= zvk|N{AWEh&go%_AL$zNnrM*B%sS^*#$-}XwUWri>AAsZ~yM1%Wdw5kM2k{2-r=~>v z9OMVgpTX}n0qp{$4KQ;wB;JjgAkB#fh*IW$%ZN1Xs%u@dasT}GjNiu_gnR`6rcO%Z z=hNP}LlID<7bl1uf~0;9^dt%od%I?Tv zC0pf|>&)VKh<10>+jJv0Qk!&;+gzQ#7U}UXeiIZE-5OaLNX{4pf!ka(g>CTQsNr1Y zwLFbXQM9@@Vq|6J zuHwa(u95y_4eqytC$A>L;UW!9z;6j{mHg_!?&YkBtol?W1HK5MT>F%b_#zr#Ya36d zhzDM>`2?{V!DcW}@+!i50{}jq;tv0jjZ29@>rznwzA|L&95rl0CcZ*A8s|gDPPT=} zvB?E9g{F+9>fC9(M#@QtW+cv{id4of_FkqXWDmq-yLvv%Lmq@9Wf1HL+$|FcJMe{+ zTT@B>3ss1_;5qp11yj7`(y=lGr?_x^nrv$jtLrF(V8{B*ND&?^p#eMUXy56w49mIz zd9z||{R~`i4q5C5gI$pNl<;WFFz)ASdSD!#~VuQ1a5^+&n4^YUgaC})W1Y{&X zO?v722Wjp!2LP3P81B^4Q47n?2KLhu4SQK4PLa{=SCKj~4XvEj5G*XyIbb4`1eaa2?BZLAT*^Ko z{uMiKZe9j=BD8RVI;bHOo2|$?++rQ`sgH8E3@%s+r!XD}7rg9H%-BkT35}^U3taK8 zGST}!9)zyu>0lL=J`*G1h#Mt!zLihgpQ`)mkfX*e(UkFr?DVrTNwemuY>tL6*0E3i zVXB`4cD9k6^(8Uu01@P};{uXEe8svO6N*$u8@lDLt;EYYo`pkfT}yC2Zz9xrj|5Ap zVjk?lLIkEQ2D-&%;RT_1R0Fc)BL9nQ=FX=y39IwmzhL-kVbvi-&$`f;6{{>>A_u8s z;yxZFtyRznw9C(WW)W|2snD)cJCVMPPm9YtD-1r5DyEQ+WQb@rzTewUT7u#{nb`g{ zQ~t=vIc`03W9d5cBXMQI5Q>GRpLvZ-UpLS{+R1gGV`HG@uUyN)5Xt_Q$YtRQp+TWe z6rp{8<$L_Y3bazuQ!K3u$qo=bQKsrd)tzJ)0^6894n7OyPiz7t_PpOV0|=SqN*AIk zEZ6?>+{DyU+n+e}KMuzOYqO{>D!vRbcQQRmmd6I#(h{yuLeme>0gFnUcD7 zNX+Nh&2bXSl8;!r>ugN^SiL#){-ydW;CFVWf*jwm^O>C8<( z2FesSn4G`n?+Ygs?FV!s3N1KcC)i}d#J+EcTcTPZ*i(tVYbf-iS|8>L6FeU>a^Fq7 zfylfzlb7010W(=;8hQe-7#`bjuu!lQt;BD!I8#4-WD%S92;$lpAxU2B2f8wqx@UDZI8y#f$3Te^?(Tk!*e3r8~V5uE!aYWxOGbgm(d2ssUOwKe!>Hy9d@l02{bvNx`&I#geBpGS{ ztSjcfSb#gVn`86I+moK9syerQ!UZQW0h4F*(s*8o`IM4IZ{r`(Yc7t{hOY)Ueiu_Atm@Le@Cgpgsbrt*C~K{sj9uLz}~efYd~5M(IXa~WO;|I zTz(r9zkalZ3&LW5nl7slekU2YCsYaCqZ$^yp&K^}7G$;G=6f=uFnoq$&d0uBl^K7> zUR6j>CL{gfRP@&<e%!S#x1?nzC9D}rmc)|YE#KtyZ!EN7kLUCy%q4GM zc3W$|jv3JBLW?mFEfNRhaQr)9d(}9A;~QxX|1Cx)Q0VKDdm29_wO($H(AF z4stZ&%KjpY+r23xfeG8)QB3vAXFN zjj4uBij-6zua*#Rm7N`X(91nZ;x&{T2Gz0lBW9$ueC{;PBgs$Q@o(aOpxh=(-a2@j zKShn**5H*fYc7F>tq#sZS*O}}nMb(@Ud|d!K3+QZ(@XKnI=L%OI_S6>Z^sR?qXonp zh)YKJBMu=J#adKdu$NwCvt?kOw>=wG#7DwMJq8(#_NyRIV}|yk@=%N-+xjnphu1=T z-Ih^l-95P|RdT9ckB-hAx;r9&)7M8tPVaZu_(lJjFnF9P`VGtFsLUw7QaqlK zB_z>hzI!aavFT@*|BHeQ?_6`dZaG@~U-y6;gnh^wKny1=nwPW8>YNGhE)j8@Eb^|P zo(9yRUP7%(+K8h;f2xpRPZy|@%6JPh+G4Lnzy9Mf&(0|NXW1(SdB2pCb6=O)oOy08 z=DHl8g(v8yO3R3y#%-<3c~U>Cryy@y3DXTF6tYcfXZ_x9qDP}`^sC4iHR$kvL;j{! zgqh#0peL*rp~V&nEP9!r&Y2^~^}1bcEVNchAcm7?m3c>1EMCHttn&zwv(S4}F_J3f zECn)<8p}liihvO6s*ET$Lvkt`A)2Ub0}Zz9m|&gxU=+!%h=$vhOPs986rm54i0RF~ zr)z6p3T9Dr%M7T@wOdK$yGw&0pB3zwS&E~`)8c1ioEtbpFdf~jO`)LJ{m<{+iD|>& zhtg|VzhKHIsV(Tv6C{lZ!OM`|2RBVQW;=62U8c_EJj>DZ+L4_)13hwME5cj&gG+R} zvi2=6PwaMJ1Z-opbyR-OAAZo<@jvlPw++_@4a$l@koeDer@k z=O>?(Xk2se5sDLY?%xD;plP9X2(4$ocjS$ZCs$``Fn}h{Q&m!}?+q=#cg7m zen=}9h(}+dY;oLKm6>W;l>6qK2W5DOZAc)G!OaH{Ue-X?^su`LdyJ@?PXZG%zt{#t$I`RdCPL{WTahrWJ=(odq0h%lSPyFB@r}Qt>h5FHb9c zW&4Js?IY`xyC|V-3#NCB$vv&-sQLOE#$PITk=s{Tvfm>Tde!5bzqDNpPwUJI>UBGP zzANm0mJ~}~kqA^|u!>+FDdt|>uUY_&^=1rf^jQopd_a7(y)(zIrVqNdY{9= zVuixg+;i3UX<_>mjs{Jyt-ofaYAR$2?o3u_C-gyU6JO|Gl&`;Dyf_EHu0LS%>l9D@ zb)P|Zy)WARV40eXLD&S_k2-sumfE#zyM3lfwUvRBvIoryu z-T7~2`e!oIkP>QPa3usw=fzuu>Tv1!>+Kn0PM;gcNHu1p#|5wC{_VC?_GScRYuZ{+ z-e%d3R^&G0B64CP@a$e#-;=`~+H9jm*AZuR$xVANA%e)G?XnyF_qs%?Pe$-^T25Oz zBh5&LkFx@EBO@no#XPSUP&*VR$1oaK$SnjH3VAFd0TI$Vi70HqE_1(-a#=MSOA7lJ z7%rr`|FIM}KmQMNZy8i&{QZlHAl)V1Al)J$-3TZRf;1>y(khy_R^ zh)6d`=ULm||99rRI5T(di#v09&^P!O&?17f zfP|Gglwy|)mSx6bsImHHnv~-BY>&M-A~)22((F<3cMv8|DsZR_U6hQkc>BGp*tzJa zWtaD9geeQt-9Z13v9E#UvjD&ubn;|w)t@78{XMeDWmHP)a5@-i8fkDI$t~T^9KuQO zeL0>i^RD(WFfjFoSKt<=$TAYiELn-?d-{be6@+$M^{{o4wbAQJ?&HL!4W7$Gr26CB zhJ@5|ut=15eb6jwv(+y65x;&eP}-17EoQskF>Jc-0HB(}sN3aS#3!vpo^AkY>=LNO zysF1PHZ?ka7|r{8cJ#w<8u!8XkC?T3KMhLFBp`%)@JKp*xDX7Xi}Sy-A(UPR?E%2N z*#(CF#ibs$e|&J4vl)If+bZT;D;}P?yHq@)&ii%?tIuDk**|xu5m13Li{r}d=HIT{lo(pX6_kME$$4NncJl_N88?_6Ob9x-(WGSrq*ND(~{X zM0M|o;`w7w;~+S)^_(5UY44Q3^)+>reh?(g?mv^msTrrI{D@x7TePwsme%xmVBDQ07YKf*V`LElUZkU zEXM3lwC)G?Q=xb3e{7FIzOaHPevsHCKPs8;sk0929_(S(+TvNVe#WhlAA0mj>b%9D zVig^R-b5cmKVObgowBD+*5wXv3q2UOREk`FW%=I9d&9__0eJ27+oK}`AzwR!tBb#n zR*qz#0sfIqEAFFxf5hwFU(eS+?2fc~UISOHP{dolL-cn1Em^rmKZd-)^}6+6adBf2 zwSxUt_OY1pYXEGw;)d#;2LPP?B7nFbZZz2naerTHfkT+?1VlhOJFh}5>T7tHD<%F6 z`a(86UmSeDD)iSAT(xrdlXpxF+}nm>Yq|1eAiDH{S}C4f?drUPN=3hL*f8-CNx`fH6}?<)HOi3m{kEl$Q|eX#RF- zsJwWvWssVix_!`LV@P?t_Bbc(C}G2e_1 zXk{t9PXW;>v$zhOY`eAY=lrx^z_>X$=sF08;d8xP8S~Hk9<}88TG1BUw&-x@m&sQX z2gj9&^39FtDubGJQjH?{E!P>J9}E)!tpFO5na@(#dwfZq1OPzE>x#oFsiFis4i39p znJ=V*H*ErzzP&c2W-zc#?If{3=#G*iG`4GQJ(GNCu=8%$H@X zMONC|nwgp-S_Qw1&)?z$>DHfws{3^v0HQ{V0E9}M1v*h72)3l^*$ieWN=JJ;}l72aDvtA>R#*&TL0Shi@lkUSW0wyo?&J zco4jvxfd7nrcMumzn!JQ){mH`qPngvwhx`R&iJ)8btdv!0aRt;de^2rT18;_PHjLt zBm2H*rFoXi_0RO3uQS0rBzZqPb6YDKW$(Y;!agi4eHYJJWkNqV3I*+3V@wW6Wkmx$(HLBne;SxN4uUo>4=`T1}=u^S#}g)>$c@>tPk@c%yFa`Ih2~ z_f4GCj7L9FdQF=#>U{0qBZz=E9Ev-o-2+#n86_`e#=4p({)+|V?2FUiyb*L=_utKq zA1Sq~H3>c)x2eH0XQK`8dQ<6qIfRYeg3G+0GSi#kJ^~?R38*x zN;kjk+jKt*nl1-#FOC}{gGz>?!1D1^`^JQZcpvBBU%34vHM#Wl*3#P(ODbHx^-u0z z;Y$`7$=i(`TN?fHmpB<8y(<2r$MM6-$jFHOEai+%=E7f_2lHq;bGn#4)7zM&T!MIu z@~A&2&Ub2ye$(6ct{9DmNxrMPliyk0jpX=0h&EW29lO%f@9y^_6{nNxnRP*3?slB!@ zrF+aScP_1j`Yi;gO2RhK6r6TX0n}e44;kl+H-wL2=_SllEafr4)|15fqr>&rC zw}Y6+T$JBwDoeSG^(Np4e)^%8=pKJf)le+^y8*0$rSrgHbY1j|@J-Tf!k*s)Ao2Ig z@epT~v-$4qNBME1!lvk*@7emcpU>vJjvCf~wO_*tGX_=gItO-t-KHgl;B|N+OPfpW zq>A1HuZeQ1_L&m1_S;@g_qbb$?h$aSs2>G>21Yj66h18LY+VP_2ei%cqebWN%iIn# z`VV`GAKukSfgoXTpg-#|Mf~~yO`z}pg_1@5XLPanA^&1+%tHTTB|&HWe|#5&Kjzz= zfK@$1gnJ{*c!(U5N>n|NYBVQ+v0=ReXl96>A3tV_#5 zH9T$H`4;FA>hJuhF zzGgy9N$Cr{er_&Z!E;DBEHkLL)nw3cTmyl0OKWS<_xZK8)A>&1Q=0{$!?K}io)g{$ zMmGOHH*emAd~{BKGYD(x_Z)@6yNK!0#s{4V_&G4_DP8Bo7EJ`gyHIm>yEpL92@?ZD ze$~>iN>qT<#hIAoMtV>wDYJl&{R6QqY}#|?Ha1gmpX%x9MY%!XI#qWkWOP3rNR)n% z2vv?5EP5mDtfHb#V8?{UgAKMfoMi*Pt_1PtDM~4Z(VgObL&BAXq0^wi0$zE%%7o_) zi=!6NED(-hQdr*HEay*HJ71y<{!5L>$k<LnTz#D+5y zTzg>m=|2&ZqN}N|2a#FJwis(E6NoY%az=I{qhhOno8Q^lSz1a3X9a9((AU=|GnfEp zFv3>>Vtoz{jwQEy_Zs0>1+zcRyBiu$PLr#ucuJXp1x6S!3J3f9(Y7YkB=oyrivku2 zd+1Y@z1!sEQI;`*8c$^Iu$o}v;szXTJ_afH=H}*N)bY-*?{N173-H2l`@}9f>U9te zIySbPZwiq{hjfm`MRemv+pWL9T7C64`Rl0Mub^3vZ2kMY8_mY;cQ0pcsh| zno0+|Gu@idA!ylGm8k-nB1-0H`ik?ug0?`hSo6^+d}z=DL9R>I*(uiMtrESp{yE#J8sDdChVwWqv(% zqNIwWFnY>s5UfnYtP&Q58*@C*s9V%#&OP{h8v0}^jyxVpHXySk3dTA7)d!FbT6 z0*1pOpEa=FSW`A=3t~U&?(VMl(Yz#zXq>NOJbIn?NB5YEkB<+oNqs{DXwuWiRoD&9 zO7LntsKkV&g9;2bKI`s0BNvZaQaQs_lI>5J`$MGG+qKuBEV~p)`%yVLCNOh?5sSGP!fm`j^#D@K9#cCAF@ik&PJMjjC$TxeKo{H-fYlhz zkfB4CW~Ko@VmH&k#e#b4miy`ulB{g3J8wys^$r*prF8I-b1ClHet|?in0&jPF;&0? zxl+}BWm}R2#*02NbS@A&bra&xF{vd|f@=~UZfHs4h6Qw|OLaJA8!c*H(dxMD5$m{o z6n+j;4#69LWWEIP9RNiLEIj?wEN~gYBQhiu`W>(h#t}N?T#j91Rhy|==Dxv_Y*P-9 z6h)YF+HkY6|wdCj<_DzE&}>Gi~$*fa8fB_0j8lF?dVOkM!jx*q>WCmz41XmtcMET;6rB*CE}Mo|SaMZboYfn_D) z=o+HEqpp6i0n#&2Jh<%A&6{a}Zln=8HGE{3}2yJ>DI4UM3A;!I$JInO%8iu zybi(XRfI_K0+Efgu$oBMm_aAe*>1lhB)0}0M!9aj<8MeWtbMK{!=Nb8*?B0 zPF?MBMNxbULBX)lx~hUvae!RXOGD-TEk!$F#WO?}x`oatheSTygRQC8_w6~ajU zwFZ3AQH7tskiPTK>;g8xKy-ydqs1ElV4{6Jl{5D_!{1v=9&sMk7DlC8H?+2juM16T z9?%F;b$gamoL_=WscEBkrc9?S{B?{{&_Xg9vmKvLXzrKzL-T?7VO|S$}JcAtyK68}(+nQ8oND+KOYCRUIGzjzC$jx|F zRmIPIA0S@7(9t(Bjo=FmyPoze%hHt2251{2nKF9P^saZPU!9tt#B~Rv4tllhIVBt?^Mu`tt_Xf?O@df9|EnvgKdkbo3U&l1HTqN|!c5MUZvlec z=azjSw;>twUWz?Z z)!Uwe>XME~iFul^7-g?z9EAkDTl-{6rC=x`rj7hTbUoKb)JSTPdR=BUjtmZF)^df2sGp6in~S z;|$Wyy^G9l%1TF;r$uOVX4JMTuY|$?!EGG|ql4{PLv2F!rp^zKxnsuOX`$8g zpBj;2=b;9pmF$^^M$|^lDVXPmlQVsNl&K-oIe;OJ8}bmlns<{l)eQS1Zx&f!1}>u# z_N;n*hs7u!#HeI|ky}|nSK)JSeQ@&Aphy>bU3PyYh5JZ4)Uj+DE+qAI#GSk;a`d+t zHDVuVB!)|b zuP3s@(sN&tqxrHMD?aKbch3j}_WqU?w$V3X)m2wZ#ikSxGmxH&NH>wtpS=$~}?>Ik2db`M^HhT^MB&({2j);cyy0p+;Ly+Bl-vXPvyQ{12 zsgx1A6&f)EM2yC0Nc82x0?CP10i3?)WM>19AVQEuQh`nyGjuq)1A*$5A zJ((DJDXPU2Zb=2BTkl9zh>quzBBFxD1O*A!Y2f|HqJK$ZL`#eP+H-?|{biX+yS(2Yh@o+y#|LxWdjy~Qyq+vA@-}nb6ID4>aGcGvP z#iXJLd-b#TdG~^}PsvJ$nrL(a*tea^_Ys$uL+jM?9Vh;Z9r#bfHMvB|`Sjbmbd}ro zY4JN!Bwa~=(Y#{y$kyYILlpT? zKHj{GSaNF~*$%*a#Z*^!_u*5L*f{kKDU91@7=|o|KDgknQ-V$)c|rE0B2Ni`; z_)TT9M*?nRWrJ^eU)6)mjP{hq@v^)~wN@7~I({I%|%p8FYr1Jy0 z!{=mXtgE|jrs(-;kpoP>uBl`lmXC8kis4 z^eVKbnkx~^?_doOjgM|64)i(BT&2~5W|da96)VNY=!#wPf1c5L<5o%r%qySUk$;Gg z$mlWo4&g%v^Yy4vtt*kU7^?tHnvIPOo2R|sO!-(q>LaR=+;L(pQIuWpo(Lt?P7Joa zjv?I=T5OQ`(?G}u0Jh(9BolUwvxCK+FJqgx9C%Z53mjDNgVWg3)Gu!S3zo+?w3EHP zfA!fU&>2t*&^aq#>h1jN4XPd(+?J;d`#lPlX^mB>6!}a1`X68bSTl}`GK>4bsoP7oAt=c;#8VVHslf<|1_lS|D*RZ6F zTXLBo1&RO5E z-GmD%Z!Z@j#Z}-3~VVB-Pw{6KuZAAi)DZ!2<&I zXJ?A4%A3}$Y@ZKshDS;?0C&i)E`ilh!vdbx4g1jtz@!vJ;LN@kHCDauVIvoHEV?%7 z%Ds3U*>aBU5cYs}p;ee9Ol}sWEzmya_B%T&oqpsU>_OJVlE6Jdp?~oQMHdvl>c4bp zm?k|>g8rxyovB^CSO|4zgh|eSqpg)JmT(Guu02{zXqNI7?cGSAI`2_hg`&~f*$E(3 zXRhJ}Ulydv(UIhS3pd-t#bLV&Lyujowp9L$B}Ggr|A`y67)Dls)av#UkECQfO!}Wc zJ-{fEFMJ30p{Y8ABgmX8R+EyFmOMnr7%zlQ;6$_b1GPIZwG|Grpxl+TrA!5~(}WR! zLnS~K=-SrEedPlqt~z%J%=Du|KUxnnEP7yjBf9QkcGMwg{^i9KYK*i$6G$Yr9n6W7 z5g|sBrbI9HE8@5h_9xH{>I>U$VwB-3v(VC$(K0@ZCTMujp64(rz2N$!@NR6yQoFeh zi2P&UO8TAT)-S@R$FKwG8AxUE(a~Mp3N-kVn}R47{-c9K_5`>|ro(tmft9Gdwf#u3 zH(1_W0dJ(#vXG3@6AS9~C`!A$jxZl#TqjQauK|basoBiVv1UShf0eil&U^8H;2|Db z7$V$@1A9{N$EuBd?hPWYb+wtS8;|I(6bfIMr>pOQhdRy(k-G?R+V7Y7o-2LnYdONq zvi%i>r)m$t<_jMTvyT^`(8)Cw>TBJwiZ>26)>C9%8z#j0c35sQ%2H6RN4?KOicSW(62%PEy zUa~;$hJrRSKAT3Bls105G9@&rs1BgmSGa}jvIMCkisFhpkwf^gHR>B3tm?6qiBsyv zq&#N&v1XvwDB{)Z>Dtq8+j^N?R%Qp_1Ec^1X&3{_ly^-Q67ZMEz>*FD_PVW9UZ}ap97nR4{p)TnX*2qd?I4cX3G}o zOs1Y+++_8cRC~Jj`+A~)#@UZct&*D_LogX??DZ*_g~q)O?mUJDDlvu^wKocNHl|X| za)BVYuK)?Uh5qdhWZBE`N`-ud>CPeY*9p4`v+UDHkZ@;~821Nl<<=tQ1*Y)bpcleN z67i%=Qk-fVRU8{#d65X?MC(sNH(h$)~k%BDN(e1%$w?RYzGd2 z*SKIxZ77Zw2iB%kb3wZ+ms|yLB*Phd1c0d^pCJjHpPbBpeg@;Irg`MVorlG)Kf7SW zcSc2fO9|LdXn{uCqpU$)vUOQb6dR&F!ki6YE$B%QIS~5g#Iyz`#KkSQX6}NS)-M}M zPS_t5Ls3{S4Xykqfq70;iR68@*#DjeoMQgSwa*@K`D>|1$T=X%Qei)K!}8~kJ=7?W zs#Je7-Om=Ny~1y;l!Npb>#@P{cdyXU&|DcS!6Q0qasM;z<0`G_tcL}=!7i`HsT+n| zQC`91UuIt$M8?KFme$6E!d0i$*b=fE<{YAXm8!-`FUbdQy{U|L>7*wQhqvg#Nd>%r4s+Pd`Z`x(^5Vd2*r+ZN+ zK3K)ybZb$0!eJJD;_>egjcK{KDSvXwV!=y59=xco`3H0uB<<3dyT4_@1g_pGd#VkS zGXn#^o-6h;Pj2Lumb#l!gFX4W6J&R|4wq;a4T9TZ;_V|^m}uZjABW}N_cJ{2u;qnQ z8on|Z`%M4ycl?a8o$v_5m!$$($bWudAeI-E=->Axk(*(&Tm}aR(@6M{k&rO|`%8k$ z2){70&Huu?fGRaQ%&;)Ofs+Q>7&U*I)YQ3V&+juchG(9$?Sa2~dzpE8)z6-t*PoTb z_kbt-Wm^k$XS#q90@V!_Eh+g8QMhNkq7#T5ZUQQAs zep%+qz-9_RK%oH8%-i&a!v^Mib`u$w9RL~){`U9vLAL4wWMwB~h>3~$`TO&|fmpc$ z*E1;Ru>2qZKulOFnGH&up$8!$A;YDR#FcLxfd=sBL~|Nk9Oy#ALqo0A`ibw|yVp{B zPFl#riC<(?u_i4ot@Kg9$~FHd?Blcr?Y^#{|M508`=?dr*;LTEo`7BJ`z~ z4!0H!{*Le8@v2BUbieeF$SWw!HMxHt8W}aw5yIvho1GOG6*bsko}K#)>&{?@Yn^%Z z+*YdgaT|934c!;0C+FuXeWpBi)J@4x1*)v)=ZCkLH|5-d$A`nnVk^}9Ok1L5RT|M$ z^V%>L3i9q7EqU>dl2KI(TLV<;o*u3HYzjk(SE!#ouBv<3r&D0=_C1w;5Wi1}s2q;8a%v|oYCsOJkA3V_wL-P-_JS>%d= zaRmq!`-@gasKH4Oi}l?B*#rLu*7SDJjKhMBP^5g<+~XUj9nSiKABA z5WiuFy?qX6aazGh*wSq-12<5`dw6(wtwFiUfeQ*qEnh3hg!b8C%wd_Xn$ZKG^HVCv zZPNIumX;R${O#H12xik6#Byd*E(6mu_%?M}Zk^Im&}{Jv5TcK37AWAfK*l~%3a!7N zUo~qBLH!aSg$9owv)#l0I@2B~NdvgT%-kFe7GE8My$zIT&;NjhZa4Q6Tty73@|CTT zJrn^QX8wAJ@P#XCK~o%e3pkJ8kl?lI{UyrzgU6PEiz(TOV#l_I)+~5}NA+&dJsDGMu&xwXKUOw-2WG1Ks4PlWt#8UxKyfO9uPBMKa zH9me2cdrWT&+ZAX31JgQ4znKti0yRl&FT5EdtjExrK?e=N!9iSG&`>}l%SZ4! zBuzC(!l=#+zQw1ikhc!QfHn@gL5^QVu41bW*rwsof0_OIZ3Oi+N6ef5==MX*-0qqz zF#X(XIe;_o0M&qdF4*B3hTs~^I+SK?yUpPOv|@`gME_PlFV>sHsObDg=4z5cbP;jK zMH2S5Q-{FwT5&%`Q5)2D3ZP&k5a1Q=OQgWS%)7~luuMk2PA)Evu$=?UI*Hruc1*`h z2*(>e+hsQ|d=+_Ps>1MI>}Zl~qBeM>!&;co=vz5vAp`+pxUh|geL?qWz@Mzv%-r3zw(8}laQ6IZIV>@NnVNH=TFhTPHU0U6x@ddb=A##WHsI} zEa<;`uw&C|v~yIt<4kpJ}K7C!^9^m}#Vodryf!p{!@+ zURYbV4iD{_mhhdpQ2~S+A=)K07w-l8znN+>g1lnWojvB^fm_XnPyX$LRQEOcrT=09 zn6!qRXge~Lym(Jn=URQCx>>9i57`J(BTyexUlt|t|+ew5XOWON1(CVn9IXu?XzHlGoe@fg?fGW zOwozdN5r|r+D3n8o{cny3AVZ5?%A4}()l2BB?;crLBZeyk`g6B<87~nwl1K@`Kd4d zG&4wLP#8uu)yy@PwX=WD77<9!OI3geP5w59kMEhS3d1>aKAj_1W&?8GUta>E9Kze&; z$bFxA>0}iGrIa^TwiWP1{uSEq2PBS3MW1_nz}z_b z@uFYuFEg3S=N|LB6Pcv4HKV6056d_4d}@6w|L>+|-fV-}gTa*Xjkm9Fe@_o0DIs%SpM4l7p+AtDrE#}Oc~m3n-A(XKZR(>}`UgP+DQd%Lyi~QJ^I?2!YCIoG zB7FS$KYs)s%YMX{l$6|)I@Rc<2ni1E`2!%)&U8H%PB$M9L*oa=Cd>I+jise&3qcgY9XUi3wm3k*mlYL3j>{!NRXXI0EOe-*J|!I2xEX$zhz}v#|5+eiC(M2|8c*V^D5L87fN8KC%xcfNLTCtXhhLQ zMfx750HQJnLc^YS3sz1-c9l5{1FH%rX_+}uvy+hX2?^1lPg2eCfO@`z~P`arssd^5%wu&JC1@8E}PP^6Qj*L z!$$5wX;^MU5?Fi7!asIY{wAM>wl*=Q6&NsmN+2N-tF>2<3)&7@vLQ-|EO@%D5X7CD zOdI4v(rbnmvY`S!{u@$^ykbic-ZA)?tJ>1wiK17`b4XtPW~hYa^Gsk=PYE6U4x$gP zmU}rwxJc>}!zQaY}pI~BzGuj`I%=+ zuRa|2e(mVJ+qjwt)r3)%LKH8!F98Tp-)kt=@HAY*A`R%iLM&q%sqTAVf9`*r1q`2f zz{TVcAvU!UAU|?xZ4fcz?9BVHYM!-JJukTMRAo3aURYb5T7G5Ya@e&+NV*u&2gHVj z-HQGq{C*c2BjuO*E|W3Ok=TcX>K-$BTb{sPkUOBExa3-o_z9Q-;Dyfyf7SmRVE7j~ zv_lAJ5=m_*Djn?Xd?CL=_I;io?D0y2)-Jk~K7&)MSd~n(z%*>(RpBWC z;%U}+1>qu5gOHZQ(Fn&byl#PM4BBA2dS-Vn6}=g>nt&WwXXz6U2ElxC+cQp~WOcfp zW8G`r;d74UHPkU+@Wa>{YQ;$>0c)F`(mu0=DO>4&NiTgkeI=+3-b%f=xz2G3qMD?n zYMWO?zfmZy2c6W3su@}nEm84kU=fG1+w95SpBkz)6@HhU0&ykJNdn-uWk-A7k&enZFHDY$ZR;mHfA+?;hSWFNsTK2%s!|k|!1>Re8w1 z?i5K2fV)uZx2VQk*AjP1Uaocjus5BA_=MQAsLGykN+FX{J+HistSNqxkOy-QW{bSv zH`X#yYB`b^Y$*}Xm(||>9%~u1aEFwTkT7^CvQqt9>=g)~zC(ia2mZ%lgTrBN5e6J- zq-uAk}aH*PntVT&>7UB zCxfRsn&Nd#3|6!TWF)-;8K&G*y5ZxtmoH!Le>eYEG=}f3w?Fysa8CFopF;KDE6Ejx z@xA)j$wq!b2N2-jR|diVi;4Z;lffX+MfN{0_%!tYr!TlaX1;s%GQl@?+T?e7YM3pT z?Xc7N#h9MCMNy&sVE%J8Ux%3Zhl{#^Cpf`_C3$(E1(sYW5NC5`0 z1rv~_c}!d!%ybTr)d7*xaO3*4YF+trKw|MkMKuJ*}io1Joa8Bwdle?8NkeET0nO?83p>7LC9%I_ajQy)RS z@VM3zwuwH2r4|>LmrLFNt9U_elvVM%IN5_U)q-e^I2iO^X{2Oitp4N(44@tId?C3- zs9|Dczx_Gi&4nS*^srxUfFvlyLh1oU^)qNP_g9A*y$3-EiLaHaMF@pd1P*@0QT2@o zxRXaaDc{Wow|~s0K`acoKh(~ing#y;yS=r=#jG>=8R(3c|K_GFh=}z)Wj8%Mn&Da} zdBa~99(QOWy_z|*vFzV)`P50^c@Lgua-D}RBU??LW7<8ZIS?%ss-!3GvS{F>T^WK)36>3G zMqOb+FQOE& zeLl{<9?<8hWR6CQ7(ID{e*>3B490vwZAcwRn8}&@1pX`HW zeiknvgbR7D@_xvJ333NQIeB@r_JV=f%PRoe*&aQcpOj+hY#u_kb_Pi$lssx`>LqgL zhiGL)E5bdUM;E8hm9=UWR!os$gtxVBHa9n~zULwanlg)KNZDgei!ELt>n5yjo#dt} zo18Gva^8#zqr00&wY9U8AT;0cFk_#VR-BW(fBog1N6wq6T!unwnIG`V&$fwT9kH5j z^%LSIV3M%I$A8C|x>EkKq=N;70jowaCvq0;g^zNKjc+Y~borwIc~g6Q{cn}+44v~a z(L^L}LkA|KSE!by8-NkhrH3@l_^30!<3Y`*lc7&U!$rb!!>z&ryG8Wm1;-X)UypZp zJ1TpSqAnS1WSUQmHFq@2sar#%=;`SJ8tWd`1XjaOg>|CDH4)I;q>TR*Xtw$Tp6TbC z8aXv+iU*ZH-@CJ=PSJ>Y&jjo`TAJ<&${IxYa~OO|a{ck9xnL!`_I?01cHD&>SO?zxVCN*q#B{gh4LdnOWx_2J?!shqsemrbp=-0i9_r{|az zr)Ti|UQQW084ne{vSVrSIr#bhTldl2X#2bWoR=$F$P8SVYDM$ zNZ{u+s7N0rWdofU?7}r?Wo30206(C55OTa0gBGtnKp8B~fHmM7?Iy-nz@wGmMC}}i zgR~|6Dtbb;TpYysAp0E-=1W9^C1?<}`?TtCWQ|e6;V?BPZ{0vWY@6FJ8Qu z9Dy3=(uK2_%w%kS(gB&wNQ%sdXb(2qVuLsEtU`%F0Tw z`-H>LRZ`qN+YpTejEp|SEDq7aKjP+l}RRFBk_@07NM|{!Zmv=MCRZlu{{#?i)lZ(tGYC}d4$r;r?LC5nBb`U356OAH z1IcQofE=X7Y4^zAnmV8Srt91b*||r>1d&ahrM(j|+^Gp9ZO;&y;@OY=c*wUjH`V>5 z06!6STUD=|;RI4(i`@Gau#_i`mlLvpsKCj5IihpRTpUHcpRO*1X zeQ=1EmL9~gl}(afj8hineNfzT1oKHL*{=oi z3Ki&o2(Wc4pV(N(u~wK0$3qfnxK!9+R*N9E6yJi}jgD$UJ5Vaq%Md6``lN@{(#zo9 zOfDo3UvPoLsaJ*Ud>b%5Xj)4CC}+M9ekv<++fJ;0gy}| zsuOA2?zX0B{}6T`3=xVY$`bD*qiz5Tqo8LIP=4zjDw5`@tYg7_6^uXbxy+NGnR9PF^B(Il6^1tGleFy$mS6W^jkOEfhT_s?FW5VT2;SvK<= zhHvzvQU1|yy<)#6N$OgY;T{5Lk^8;ox3wiSc)K35&5x9=4ApxSpj;)a4a^Oc=nn&^ zthVMX8%slCKuexlKW~rz5GB`P@a_VekjdkA68r~<8RG{ULPR|q_JGZ!aZPfokGsQ@ zIP*ncK}U=hlW_Wr@5OniIug38W(NWig~DI=RAsZX1d3ENjQhTIeY&X~OYl}hq(9*H z{oa&+clMV~SaY)WL--4g4&~Ad|2s6Elr>fATVY?%>ni3R()NP%5UhSuAR?mTaI#^vq^Lw?_I%Pt}gjwmp%f*`f?pJ~8`JGIT&is?&RI(MM-+v94ic zyXbRcOCzn%P@Q9E{;h?ypjh!Hr__s&Kj>!^<@+PyQL$cg-_tvcJ_ckA!gwNovxFzG z>gJY)H({dw@Og%di>si6=AMe!ID27FwniMHLi}8P0v6|xXyPa5?Js}#+5y+Jx=Ls1 zUM}=FkS!Zga(}Ih5)$e|I^jO2mw@zw>s)5w3_@K5P*?Lu{{p0+&k#ybLHr2)_bOVs z%#%G~i20CK>vTi;gVZB8=S>`>@UTD%D&qBni!YR z+-7x~9xdX_L~r#*1mz-xMj20}EWFI8aVDmZUdv#>VS~$*T_l4mm;Qi-7P$%T)4_z; z;rh`k6WY{ABFpq>H1|DJA9tkZJ=*;wgGnO!Ln_ext?4zxqX)&E-mG`-+^L}*rd)O2 z41>@o^2}>2|8f`xq8S99K6iF5F{o#M$UJX9jF_}DJpOewA}6Aa>lIpezkfxZU5T%p zE!G&`XRbB*cxgLA`|R^&i}|1J_HdtLnpWkfPP3bDW%dmR)4zE5$u^f-z3yhr-;oT6 zaVx#x|U^*_Rcf6^ab_$!+f}(QTc&iXgFUFhC0ClXfGqMvP;+E-e26giNvfo-Tn6qn zyGp$h`hFFXhP)h|+~UhX^SC&f_wtN~U0+Jj>17InLkmNb_y$c%(99Dn_R~5#q_V>k zo!CMZ77By%PHR*T5VFA(qTVWn)V$%-4(Jz3x)>=G4Cp5 zKa~@Kw$(LG@5pwa zC_!VF*wdBt*dU!pDp9bXeJ}xBP>B+hU2iUgLFYAceZQy2LMnZ@K;|@wuZh&GQm&oJi>{x5y8# z7Thl>++luIoXRf+lI-{9qZEJQKi}C?Jb7f7q4aIvq5_43y(!Nu&?x9~Ppcup3-jcuPS+`@93 zDL^2jy?If$!1^IA$Z$Z{E}5Aq)xny=6QOb;zOS?~exH9&Wo?+kfQPNSVfb}Xy{d~*NwS|! z*>I)6G}8fOpaD0bc!=FAScuibC5LWbTiZEU*%y$06)5Hx57S~^O5A&~g*&UkYk`k8 zfY3kjY!4q-SrB}&ic~>s#2BKSgLC(hRZa{Ch4TX${!_9ctAi5t0L$3QTZVBwFTsNJ z5VVhP19orl8SZ>v)(GoUlq#EXA)7zIEPXdsOMY!28;9`d0l4$C&W7mW)Q6@f^DzLa z@3|cg-agZ}sldIA+Tq(X*1~lKe2X8=gbS6!N@;_)$%%xL@^jcmQX$rX}vx78w-*`K4BWoOkvQ?hNfm8%2b-{wS1qWJ=nlh})Hxc^dnp zW2?M8tI8%Pr1*F^e>t7{SJ*1Ltkb6zH-&J0T>RI4yh~JfF3DUA5%2u-=Yc=c69w#^ za4oHUKK6cnO+#&-aiZ5oUazrm$AK)=<}$4o80is74jGUS8Zth^sTOhI4z#SsGAy0|IRncy>zOoXb z`F{UpYZZ_xigG`z;&cQq?F&=I$FMAtNK(jh4KKKg-83g9#N02?@qe4dVnlM=g7X8XIF{ zS6wGw;K;*SOZD(LXok5 zDNU{omT@`$YKwDiJbA*XoWEa{E$w;F?9Dnw^75uEg!u1qy?E)#ek}RuAYlx+qNKT{ zS`T$~{I=Z1b0Za#KXi9MR#mwC>&l_JB2FijUj#4P&vo@ct0EouO+av9S(KBv7JO0P?ZW~wUMbVb2RVg0NkDI-^H&S;LWwG8p ze$Udk#F}GX;KF?NUo611G&|ljHZb)#wG+G?HHpuGzl-@@p4ZHZWXm&Xwg9JV;q`Tk zI(~uK9vL1!YLAm$k(a2?0jn!wDJVe@{LTqzIT;K#2 zO@5O;4r$V6)nI+zNN{djZ`f}6``Lab zb>sIZd-|=HLd)g5Mn~BXU34PXx^0&S(~4(vjnW-`0xyVbj!z15d@smJNPg@_ToeoD zy7Ap9-1{|QEKPxjjydDr(`xhGfs3*yH7Y;fT=j9V-J1jIEaLX%BcGwg0%Hm3Nfi5s zUY4Vyd3P7R6~2j1wd@?V-od`AAP7wZEfIv9Q-rvOn#Br3&UpL+yTS@tg6-vNP4Z&E z5oU(0;*yusG(d5vKq|wuI@^4&i+wJilbQa(;pP;P6;)^);LT>7U~|9sBQS!k3~U59 zu`$)S?pABs-%`lgYn4w+Ls;C-;-19G=OstE2#u%!#K89^jZhhSq3T6|it<04f!7_o z$Hf5Y^XCNMBF z5S5yhEa$zfDeyg94@2?<26%~?a`y29@E9rT5QW`6!1kdTrgj%NbrPmT++i}BGIOxp z=vKUJp&cjE-vWpA^q8{eE-p!eHW%LS}8gE@uZszw$_P#&AgHTgz51BiG#B%T9(@1z>N0`BWFgAFRz8~uuRVwJfeBhI{Ur1M~j0arbuhuldQ!T zD4CiXm#VA%mm9Cz0^{QNpDEQ?xV(>Q&)E`md*rNyVl40N(bZwQPcpi$UTt*0S>u@C z+&4D5Iq%_KaK_$Td4}dU6aU`tlKT8#KOp@=^TVF;To^u*bqV~%s&%$F$@-%zk~Hxt zfkomo(DgArf}N3Tz(r#(X{yo+JDb7~k4r02e!S2JVsU^;$U_45?rVnX{4eU>I;zXH zTN|~Nl#=dHx?2#Wq`Q$uX%Php36YRSx*G&Rx}>|iK}t$OT9Afs{&cn4>z}p8S}gg&b3gZ-^O{$no=0*R7zCjPK2H7WrwT-bh{FpmVCzn@eigfizBmI* z6c@-}0O8IAhHT5uxMFK3trvl+6=3M^2lHayTX2X3L^u|52IlaX888NCcs;*M$hkV- z{K03I{q+x7RRopJ0nja}UnJf?lbjAX40 zCPY1+nDwuUBpjl!2;V6V%3N1SOh{1tsuHyr_$JXg{3R_VkpZ@kxn$fF6@_^Kbu4Sg z16~nWoq4O=<+THPUfRRE?4%3GuTZYhclm&>>TwId1M^n=)%M8LY8vxKtB&WuY!E+H z5-Kez$b$H2a8-h@)^4+(XS3Qet)jt_ z0tE#n^6le!1IT`-!Mb1P-ZDo4OE`S=E5{mTK!YTLqXuXBqdiS8NsR3e@j8L4-R--c z#@lz%q+V~b?bRft*%O>=a=|uRPCL!RO%n{G>4*ZzgA|bY70+s)?Mh+ZTVt_B%#wo@ z9ZkbLFjUmE2?_rovLI6_-Vu5S-OLztl+) zQBgR%{*gI7#>f#zFZr)Ol-&0IdPkmjqsY^4+{o;ZF7_)^l`8*JnfD?7j(OrFzi(RP z#d6u{w`$zh6Hnu|>vkq~J2IJ{;MfhmzD~wKyve)xP83r{W%k;)fi}v8w7C{@9GGwz zaUaT97WujT{p~k(vnYDa6*y&?nP{w71s^FqBYpeOGE(TN7fp6ePG8$MWhc*EugCjx zFRz>6D-sggy7fV*%em)}9IVzey+pc1(gvz1!uKzQ3L^^5@@Nu$_FFT?eaCe^x<}wq zSa#;6J|uAx7L3K8(b5hqpEeu+%!y>*_k~cIvQg{Sa%PDScyfFJsAtGj^h8Yyec@wj zK6mM9gzPk~t_0%N6Qsu~$E_`7QDvTL)A(?bDfZ$sE8LMu~KY+}N`zx;@d z@d`}O^o-R=n~=-nEfGflrqepzvL)64k!2EK9sk<8)%j&QgQ zbV!ePxiL8k-`$jW(k}hy7oO42^D^Me>O@Q(DMNY9!-AfMVtl$ci`5*i`poTC&U2)M zxT7}Hsqcjtzf75{co4dm5|#c`k<4&h+fWPHxc8&(_bDxnAxs6ZBaXrf8M_Ai4RuJ8 zpi2Vw)yn3kbyor`YaMKDkx)@1!bpcJL_UK(J+O&~5@+FBgpJML2Om-DdY#QN=u+xX zkxHvoaATDJQl)CRnKF&ges1A#YdB6T2(gqXPC*i}neuoD$k?t0de+Ew{wSGPN-6z^ z{@G*Y);e^%)LqxWRie;xoOz8X`m4@vH%mR_--(`B%@(-M*1i4vSO%j*M~qpo?X)?V zqSeB$yGSXncwzU%!8FP1*sQnEZZYUd|G8;Uw%TXa;3ahKWoZ*p(z+kNPrk1`u(fe` zMLbgG(zR3`mgC!D2D|pV9)?vc-ri4iYvz}CyCgpkH#aYWxC55nAa$TG0bK(`yWL?^ zOX{7OIfo)xR8-`63Jil~J`h&`{|}p#G~a;&AhzS3dCyrjeC-q*2m2SCdaW{5GS^k* zT4gl3W>0q)0W$G~U*%6-C76S>ePiwQk&%!dYrsr<~>cw}u|Hh+m8|cC}8mO_L=VVOb{K z3F|FwZz_wk8W*STy8d*S4W!@Qyj{n1VqIUHD>Eib*J@?$KBJcFFEiC9?m+gMjPI98 zR3M#*2vs6GK#`StFqpB5uHEWBb)bLf+UdP-PV6#w3y&qn>EMfxv%8}JM8AL$3J_BG zV5E^W0_E)HVETtGE4WzB!8JAPfx-(*h@S+?b_R4h8#C1iSiQpyR+}BbmJFp7XI%j` z1=#UMgB}7@>p&4eI6x1vZ`nz}<&~@Yx!ADz7VOrkc~tL118!+-{43;Qq(T^xF!|MX zQ8`Qg9HFL6LtP#m5T8Q-gnGW(}lAUdjdzr2vl0$t7%-$cQ; zZ=k29k<%mLeMugt0lb16j*PE?Bmgtmu=XO*IAI&94W53Sq*LDLV%Np2)wiVwS<`jc zfVKisR-+*J9zlM7T9ASV+Sk$_d_X?(#iS~Hv#$vaU7-czbc<`Mip>i2EwGaRp=jAlxlV6jUW^UMP?d1^ z8iZTy{oM4Aouf6qa|ikKi0;}wgFK!e-I0B5CuBr=^VJ)%!&wt@5Brq*{u!$SE-0^PbS7UDxIN_Gh-J> zmm!2)k5aBT{0j>}9u6&qG3fx}0u5n=IW$ISaSrzOnq)NZAlHEAWUkB-@5htw!CO*f z8Cn_oUr6FZDyaN(zl^M^r$`6VkP9s8u6BYUmQjdVuO~bE33k!b1g-%iJN;GZ#Te(^ z8aleL2hmvqPA6%H??O3Nm?lduC3DeT-)ufCHao7;LW$~)Dbe(oIa1oJMoZvwpUijt z!2cWnY+h9P>?${+PAMsej~Ev^cwLZ5aoaJfu!(!nxIL+%JX`il@^81@K0s@#5B|K- zI;;{6QKN2BXAb+*9Lou~xLA~1NyZ^9!{-mkH0Tqr+ngECjM6`Qt1) zQ&3rpr4SmP8|lz?9mh-eSBCrkw0=e69c_4^AC0kc-qZeucR|@f{)YAqd0Q@)^#+(O z5OI-PR@n;h)(>`eN(opGq+C@_aOr%JDIJNB?%akRLlj5Mj??*GQHEb5tzv*Sjke>@ zF{a&oc$6@e>GpVPVBUmF(a_Eu#zh-YjskCP2cIb5c?V1CXU90O^c0YXYXR;NNWb)K zqjF0}1E(tNlGNei=e_>X)V&k=oN%D$sO@b!<5 zH`|TrvEfhp5(L%e1F`YE`;fUGX~q2pL18GTf9(gIed@Z<*J2 zzmp*&V{(4o(aQXKTUJQ-a^J4~gG^U!9^*ymI?2Z3tHf=c&E%{X6PxOA$>w!2clpV= z(SLPZJh-hei`x@#IOo^SwBC9%=7YjHFu_aLGJU&8L$zeEp0O8!xzV)?`6w^pP= z$up^E#@5HuD%d_2%L%(=q#Jx&`PFGIl|vL)wjZr0J<4nDt$t)_$`i)P)4o1k)AIFV zPUb|@^1M>RHM0(ElYkHX8{pl?NEIN501{?ny>sq+NXij&MhFdowgt|LKK{$FZ1mgD zOn5Rq4~D^cI&9}NH(JBOE%WolX;j$T`s6Qbi{TFoMxD--!HW0!Hz$}!RKcYxtD4j5W>>dl-s(r7!@)Bf6 z4(4BNj?ffOWW;Wj{M3#3J$EYpT>Vj5S&@Z$!NAz{Lm{`5(@!k`xv|t<-_QTK@-4qQ zxQdMTV5vRFsiij`d8PYksderUBiPSRw`8&WmAM4CW?-xJ!kHQc5g@@4G^@1!>wP}c z2n}LO4s6-wAV&)13fWsp4;|!(Zj@`H2}m%pfjXz_E#2F$;h91WZIM@-%WI7pS)w^M%5B-m9)u*Gl$sY-|NN$Qjb&{C{2BlYxds90jrOSGf*e z99=~EFkb63-oV@kVt)4io9$T=U9b1YupW`Ev?&>k%(1x{7xX>o=o>W4U~U184W8Bs zkWv;#0pL(8&?7nJgwBzdA=Lrt(?&qQ-DX>&bv3$)WOTk#?Ke4CL$4Z#U7$?->Gh?= zltUWrN$N|=j;gyV8nzppFNc4gDd?h(<*$Cz`Zgk^t8BSoBgl~X+Rkjq@@MbcM~3rC z6=X-{BwsmVYcGg?bLZf|o@vt9b zD!^sMJQS2bh39{WFaW`V_RaQv!zxpBBx;_jD+7qTgOqmwd2dn4usi#?us80#@4LLv z2nmEfPG{!_XN=PkuBkZtY+q%zQ;+Uu&Xf_AFE%bL{~VnQ6H4yx9LD?hW-BE2a=NNO zt)%VmNKFtv!s6d&5e~9oi|#qn@T@O;La7dY!E3qc(qFg+*)q?^yyYG+^A0;V^ub&S z1IUa{WLE_9F^PlF42_9wbj_mjbgMXXqVFUCx$FY`X?MbEYh9t? zR6^;E<#>?x3da2+;u?Qf7JOaxaFT`D z+pmQ#gOnwxwJ)AWp+*}hovM$OFvT}Da*5-F+%KR*f{w@nI#=IfP&3$!WQRH;Ef0eT zSOM%t?%A-guy7W@)-NWQeGM90*px81-3_#>f(DJ4@6~sB*ZGdo7#)36FBV6y2t&%lBI3CjG{f&pq{`R+3&*y_Mx>FH4wJsb6+`fUt zI*U%mT?2#q7ke$(w|QjZ$dFi)gj#<_h7@ear+Mq{{xv9|H2%i`V#$&VTO$x>YGt|j zgW)XwFC6J8QDKem2r&s~_i^DvI`894kBc&3L>QAFae8D%q;O zPf-Ovwfl88{4@lR5PW%jA@ZfqH5fj1Z$3^(r(T6qKsTuZa>b$PeXa>LmG{)j}aG8 zgo!KBr~%lNjbD(3PfluT(fsIL2Ru@wnX33xNW0qfpIhqE=@l36=Q+B#)p{mz_Nl@h z$r~DUp$1Bt&S-v@kKq?>3NLA}}f=lu$0ZZk+LKn;!j z{HI>8>Nf|Z{acHOzjfw63Qj6I(!_9aut(7UdpmkK@q`5!hv5CcUT_(l2S`PUe=yb<*RfAXNqIIFM(#mwe)mjnm->atz{=j)zdhg zQXtA_W|L^SLWsYEiJSh;<^1D_xjMy)N1;g!te#!f8rHRuwN2BolZsr}o?YZ|v}tH( zorwk@eh8$LbdMm@a-jCD!^|2mk0DtrZhss3&K#^wxNFrY@#;;2L_eQ`{IE!9`?P4zR>aEyv}-8Kc^v0C>lL@3Bz6<6A~Ay~g8K z4IB=fjNZ>s)r_sVu8A5HLpS+mQ%p#Shv~V+4%~2dhzk`C)##Ii(6Y4u-}}R z(5yL!yLvAHe3@VpN4k4=yc$C#E~E9dtbfX38(i?&KD~`;rcZ>rM*}rP;2M8O!THY^2Jw|r7z(^<#PkYbHRna_4!|tDo$R7 zlHs8xy()ECj07fY_`)_wKj3BE1Yqa#;vCjVura}%ar$TgSU=FW9}DP}TWNtyNb5e_ zV9a_oN08s1%xZXT!4`n(k3t9e&o(BCKI|w6psk1u^kJeB2WWq)-%#9Q(JVB8 z&e}+xF$)YtG_4}()qL)fK|hN5Dr7? zc57O#pNxLF&SmQD?>!kyQ?4963JpgwyXF`1nMd)wwnnh_7x%y`dJQ8s48sV`l7MGH zfenmKw^8wTV5(iKbA{dzXk<)JzZOT_Lf;yv1STdYqSt>8fV7L0pt;xwXWC?X zjzS!V5;MHz;TZQmM)M1|es7{A`jB;g13PV!$^fUt=H_=fo8s$(hnXhGc)j)4rwqxYr+h`W0r{3ZTNC9!h2w)=LlOmeTzd8eZwFVH%{}q2 zUgghmt?(%M!7^30t=LZLDdch|;?I!ci>0GnaI4+NIsVaW+3c*b2+^$M=lx+PvF&fq zqI+f~hNhWw&skbqa*tnSg|C#B7o#EvpFZB;=s!fW_z|5|y(G!dItLzF?LkBufGk28 z#-UTbA^r_cy??Zbh{#9oyu7^Hni|wvLEWl)Fao}D>(3=40=!`MOMioq#+V*a9bB~c!-*w*G zc;+ZJ%~FKdll0D=MXwGQx3B)*UvZ!xOQ*hrg}L!b4KA*_whD$b=r{Uxod_wE=zJ)2FW}uP@p{@*BK9@eefQAL>-U(Y@6ZSHVfof8Vvr zE8*Q=JWV+opqH^{{cX?t(p?B~N$pSex_f`cTj`9bp7CVpw94?*3f=Je%$Nb&JeHcv zI)dU;4tKgFm;pXS5Mg7hKpW(T{U8ZIFvC6AT`#DO7z5eDkKY0sHn{#%9FV|-`6C%s zaT*r5VO!)mVYmWI7xaA@fG9oh47=&a&&bHA7gSVI5-{3eT>1cxxc(#y;q-@nqoRNUf)H(tut4gR~F0| zP-p64`Bf9QADch(wZwYd19fePD@UVxtzYP->ly7o<-0uNV#?sB>;a|TIbG|;K~|uM zjRQMpmUm{N+^4E8x)1#Vc}f(~ucVQ0PvtDXGIGxK5l3ap65iUke9nDh-L@-EluyCY zPpFlvw<4$PLY|Tj)@E?)!-xkSJ%GxB?_v;w5|cLxCgY<}5&;2DPslw`29+ofUAfE# z$fbTg@CM#|PIVL*Gl5_s)$RO*nVH%5D{%e^VUZ6n*IH0fMFl)*-XTX&Qes9H;WFMX zSeS#?*5DX0#}JM1i1&|f-92NboFI+ zVy&)XLwl^slYcgHe!YK}&NuXCPPTnr%IKPmD+ed765mdkSToavO=zwSqPUA0(WO#S zQ3(nP&eb@D!;bj)clRgZ)G|;50(I8${KQ^N>_%~JR}YAmLHY%Nc{tVxKI7cX%*@~* z=5Q;{h=|fUxTR&h82)GMYaEWXd%Fj&Dy4AHfqMG42VLcGmBAD5{-TWAvSsICs$Up94hKdsnt#sQH(KNzJn>SZX3 zADy3MXb(4|09K=#G_@uUu5at#g`Jq+yiU$7m7!?*N|FmS^dQME)PYUx?1h?)e~#~#NsDy{zC5P#Qcqt1fITZv7*|qbo<5E z;|RK~ku*0$8I%C6ZkFE!Z&?RLpHn*TpUo^!%@!#emA?d{4Q#y{2O9t9dTin6U!4yu ztSA#jb`B0&hpt_}p2(j5ITKA;njgU>J zxcNa4y&e!5I`eoAQ+dG3Gy09YOdmUl!<7P?IkbfkPaMvy%g=Um@`~{S+;yNFY47XnTg6f&3Byw0L8D7m z#E4-vYy#`AC}!O_dNukP0)X7_5fTD-(oD4><1z|%aGxYYMJU4!r#I&3LpAZ(&*BwZ z#eE|mh0rB?i)jtI%ff<32_x#!^}0_xBsAw0ER)1lf`VeM zri-FNf(T@|ggws)MyRt{UkW(xq=biq@pUBJqmgLBn+V@KGix9&L(M_tZ}g<=d~?3M z5bR=cR2vdI2W@BCl_YR8!@&S}^8=}{{W1(c;Gu{0%Qy+k+i9N-}09l{zc)p=t=dU3BhBPB9=np4RwU9MaOu4jp(DGip83K z>B>amHblc2+se!gd>mdgpfyBFaV zj)j&|0gxN!tHJPpC+yC^<4B z@U6|p&oQUfS)eK8YIJxj@4WN-5R&Bj`@5!1k(UBRXl*+wukHLz!tX0&#K3*2)?J%( zRt=ldukU`&sQ!!tQ=g5p0Du%{@d^+V;Y+0RGA2>ZgERDv=EpTC>FdzB0v-Dd@ahG% zmLx#x{wlfCnj+w9h#$G|x}JPRd-B3+Af?e6jScyBsUhsrjFx~pUk(vc*6FK!Y}0>ZN#0fu)5 zqO31;3JtE_3YbU$$Q=rfLQmjkQv=@a6;V@8QYr(dQf$J zu!;hm3iNd07V1(ACR;l@&XL?z4_KRll`s?9ojVPRcLg~BQ5BWKuQmW52+c=69h#pd z&CED_>L-{vHIuLng*VVqMWLkDgJD1^@nSdpqp?{v7+^Y?<<^z#iwL2TJtCfz6=>}s zsum5*WAjbsx2He3!AE?Ikt-Z}nG-Ce+EX$fqc-s1APkLb3gRAW*2j?-~ z9RAU7;gZ2l-rcN&(IAjxOu*`nnBR`}L~hF>ffF+%$n7}WUE)f-&m#CWGBxG$-YGII zt22ZlFN~a}UKrD@zA1!*A*w65Ycr4r&pGJPOOReHNzFJ>rW-j2Kf=HzEi-sZa=7SP z&SYWn?AfG61G;Q`?)Y{cDfhYK!CobX^xgayn{ToogjoQW%k}*7LXE<|^tJlaIPNd^ ze@s>s(?~apej*OnC*k|G)O-5qRHMAnWRJ zTLXGYYC-@P=~#nsJ-Fm&FLlU>^5Ilo`<0Fn#0PuScR@{G(R92nKw?E6mq+~7vN4;4 z>Mg2o5psflgGiyoevFHS@HlK?F)LWdT4LS;3JFZ2CVH`$$8OC(AaWjw33BTqZa`iT zT`;L2p>EJ|5iTkZCPjqM5_eTegd&0HEr}pJBs3(9c?_cW%iT;Z>#UfW)SUNZB-GG$ zuV2^dyx}{B&q=jyxNT4vY=r4k<9Q2BB(^W2m+j;Y(}bQ0pH%pjLGxA7W15XFGPk3v zmXEcFu3Ivq#nb6EU0=e@ATL_nf%B}Fo=lQJE}YS*!z%G)p((hz{q_?~bOB;+{A$<& zAq(C=%t&<&>hKy{=x8K}G9~n3XN?O|XaPI#fesWrX5VHahA>qj6!yq_sVDx+2J^uD zX)%0eRlk(J z8UJqWNLq{rH$d(3oK<=NuI6S#&x(}Xq99&Bs=ixpek7@0##eTU9-s}*AF+>D3n!#D zL@k_=cMbC9zL(~D6SX%T-W44(*nj5@&7;ay!HvgOH%49!*u1-$^f96cjeA#T>U9FPy@)|FYn_;Bxz7gA6$d4r&XMR`p;-%#Drlzrx z(XL%<>8-TiD3!$z%PkadbWUE1`qtdQNr;xu*T|HWw`ADVt8(dndzyM%?k6szHu(#r zj*0YB_0HsnB*m_(c7ZXbbN*3!cf1d4!$ai~ zzxOA6Q;0}{zm=CXYey+cj0S^Bgj#f&L~M5!0uoasJk%B+1KkF)w(lxo40!XTWqaGw zNBLakk!Z%h;unu^SQ9Xx{&eCPVg;1KL>xaZAW;yXzf<$2zYXu$5+Yak>7;KJk3T(r zp%E{0{Y?)HD&q)2%W1jAde>82QPB;R{rZ?N;M(oq^NHM3RAx6cr89i;T_2|l40e3m zQe^!jd|zW5Ie@dzHI`Jf`^>iOpP+OmapH)Tea~)wrKo=I18$#Liu+4V{{Z_SL`7P> zX}tx^L`TLg|3DmyBuaJ)+%&QKNk&2otiqUBD>qefY4e%e*zUg}dqXUbmQtWN)2d>J z*K|*w+2DHX+3w7E)xfPtqn2iq+{y%_36n$$Wj9KNwd7Nxfza7752x25{dcwMyI zCgw;NUAh}bmn@bylhqngfRg@F9aEp~j@v@cb7EuK+O&iK)X#g&#NxcY9wo71Kgb{V zr#!fX%<8r7jXN}6L!b)<#2dG|P4SmvQ>&gR5iv3GO9|A+cviEO&YE7fcgbDUm~u0C?G+vE=Nk75Zu@7mM|zu?u`TDeE$aCz^_ zmY{QZ&urDCg1d(H|B?j0ju{;QE(bD^-GaJV11cXK_C z6D7FzK)$xRx;lM`(&xU9DnkBlDYcu+RCz{ezL#@`FRC19ph($p>{ct&yn}B1;+QV1 zB!f;GmdY=s-tgpJ<_e-ckc?xi5V$GIbFA?O z-v{~x>}LJr4^9)boI0G!EIoluC~a@DdknmSuF~cR)2l%sS~_Q=ofy? z=SMsHpb+RPmE>`Rav}=QBV{MFq=6Y+p!ylBDN^93jz?%Nm;;M1oJgV0fvP&F?QOEBl$BAph>?Kt0pmxckcBwEh)Wo!P(f?GcCP4K2;*Q3&-(5XG<|m>{-~iV zdMyqnk#DZj_uX{yy~FOKXF%7|sq#@-J<&v$z)-wK|xT+8Am3tfFEf;36A z?4X)7YQyQfExIg++;VgFXf8-V9Lz1xIo{jgZ``*k*lS@hB}knhOzu3<-Vu9@R3pSNE+b6GXkk3rD z-C6k7@kdnu;Rr-ks8nvU=n1?7Wj#mpg*h^j=!H#$!hZCQI5p~| zt@AZeQ>y~H`1Fh4j+lw$&5A@*%;p#B7#A}IsRy_tcSocB+B!mP11Wsy`tQ?L+-w(i zIV@w|T~y9%#?N|A-FsdO7n$Ver^UXMX#uhV>k%Uk3A{LEZeNm^ru64*R;AW1cl84H z)O)ngeYTNzZ&JqWNvUo#s%r#953Vh3j;5V5=!V$$WXoOl~eaJ|e^Q?Z;fvk3IF4bxp zEvcT&Pk5bxTpq8gC!)E=vkS~XR5gTQ4u~? zT25fO`_*eO>FDY#7`*S~sH-Y^T=UMLi=(l+W!oFC*KsRb+8Q#sZejopofB(OT-86r z5ep5YON@O$1m~!7U8G*`=;|1r6-v!f`(0A2;=&YKzz1qI$qT81}#AKOVb?DC^{5j zh}dMW4bh-_EA=%={gLGdXqQ`=cm2q&(e=M8nx!O0^m6B?1WJ0uGX}?HDMK=gORJQ0bdoK zobP#NG4YK4@j?gYDGvY%0{t*j?M4RtdcQ*a|^ z9sv%~SwQbj!sJumMM!dM*Rgu6D4Ig_*0FjO*sGXF4tVCxnJ*E~y0%S=Z1Krl8@+UUya?R`?@NF)0WE2ImK??@Na z$bJX*9=$CZY}`+sVv&C1q2G&S;mmVuyNxWaYD;08wtdIx7O_95`5HWdlIjEt|Dz3} z6DnC=r&NIs@FL$~%BwjngZB8uR4k&sY<)BNvJu*Ylj!rQdbIMgq8#P>D<0truo=ub z7-}50Cz){9sz_A}jy-GjTch23)OlObx0Zp&pZ-9a%i^~l%2GUvsNd%bGtm%Yd# zVA0{(z>?|Q%!~q&Wjt_oStak+>cY5ZB>nk$MKr54Hji{;OaXu{*+@iH0a#D#-E{fR z00IFO-<&IwWA&LQkHAE^b^MVvxGKT>*J@S<4e^}@Sh=-(_V+Y|-9Jm$QPfnQr7{I~ zZ2XU05NIt;jZd5Ik|%44_3iDyuz+{qOs=Gt{dpNY@PGl8}h{h)sgmHtYCaT&lu2UD_smiK{t*tteu05!;P$kX z1*E(1%dqfw8j<6s5YdN|X}ru8?t25Mq&P%ocCSa~@}rNWO8kU$apT{S0yy+E+l>*B^4v`#RFH?t@xsaf%eX2&WX=m|J>+iRpg8gmEAuQ@?2;N~Mcb)!TeD@?s z39Bh0|ms}E$jb%mUEZ!Wy( zc6<1S)QvaI;n{Aq$4~WcjY_-V<6M@4N!!z&dm*D!HpYF(bI}wl{;a zv+-4;zQ;XqZNJ|N5(rYxP zqN5i9YEAhcM}V9b{3!EtSD8PK0B@VTkbH0h<~2a@!p1D7{eM^ju%$@T$)mZTkr4a-iwJ?n>LjAaep4wPxXM03#D3qR&e>zb#F16w=$TN=raR7_HLp zUTMHbmjUxDMju;{W(faiG{4EHfAO|Pn{}i4=-y%ttehbuc92@)Bf=D*gZf9Ke52S# z3z$8c02|^Ip*hl=F0<4y(XeBGV+TD1Yd$FXzt)%_PANyqnKyTeX(8pvd$3XsNP0rY zYupxSc11qLfJqY%*S7>KEru?64-o?eelTL~Y2grKlTo8Z=u+%V;YupBU`M1j+}zs$2|&;WoruF^mE%37%RtFE znb;kcs&nYQVbMn-;K(Z7>$5%t6hEoq|9v+CG*OQKMK^-eO_l%TMlhFgiq!Z&u_Hhz zq^{jz_Y=VMlnhKo`_E81=VZFkqZUgX^Ng{f^TjhGs1M(xTl2E zl!E<>{3#utrJX4q#dYJ-Aew-r#%q`&tOAjoPj1quO+=gNYL~IK%GVzGX=Cl!dyoX#FyU|%-8=dYo1zJDqNosr%R$qbb`ee0f=w;n4lKexN>!!B>H1*lW#njqO zeD|ti&*2-r{v!z?DqhQX!Eqql>leCYG~dGZus1YE?1?Ly{}N0bacHrW0CcKQ__#gw zJtk(tC_naKHjEzVqq_kPzR~4zbErR==NrQ-ZvJ{+Snlt@#=%biBh%puE(3iJ5;h6R z+sn>)Rl1F0Q>ma;W*SK=D@OT=MJs-31^iK(?+STciWb751g!*&(7qY7EDLHVg)|+z zMcnyVTEwg>0%;5LtE;rFWVZ_NPYfo!-j~1Pw_wK)F{(NWC`i6egA=jHip#lMC${UY zjV8?u*0c0@TNaJk+{?B;8~B6Xb^)XK4yjU~C|4k3NsP z_~c&p&4WTOZ369psuxWb&ps7M z26Vy3p)0s~KIoR&Oq7;SoybjI!wMAnh6hR-HFeB|I!a6JNa#y%mTyyVa^kd3^$>=2 z?uh$~&#M$1IN@NqK8d+zOQ=t`($|{!tZjv4Du79iwC$7oakh&@OYUlJfBh~IJhS?? zzg`Fgo^*qqog7E|C4!&sG*Pa6r>} zg({Eb&gxgkM=PGzfFRsK%#12<*ue4|A_s&AjRE9}$*&=!`$K0@3Tv|1aYy9i4go+6 zi_Y2tx0C(O-rima=z|I}WQu}}j9?|guYUP-64IojVa^7}N~CJ;q3P^xM#?lVr~OsT zx=pnUE8cn+m>jHj)6D)7ZP+1!`~n$1%pdle@2Vx_2LAmo{|%@zMogIJKi`Wqd5Tg3 zg+8Oj;Mud-rbg~a&%}SI-KfT_=Tjd&L`5jWCMU`3r2Vei5~4&HWvX_@dj0u{JA7^E zZas0YAv^f-(kk0jwnIjs%9dG2$99SFK?Aoa>d)tZDcA`*&)=+88y&x4VZgLHX{gCi63Y7DpOu zD=RDb?6R_y(X%U@b=aQ;32tKBl7 z`VZQh%&WoumfAuXV8XYY)lr*TQGIr)WtGuS`Y_s~tAgeKGu8j@$vm6L4}d%R6ZljL z4H`ki2)Y=De>&AkGenUd#nvILxFiU_4AE{rPFYO;_sQM{!M zM6M~ot|7t7)N}ma%dFKAn?e9U;4s@}~A&^~`YottVm<3!^p6eU2_un{N3DlPXykmO?(> z-a<|%O_O|YyKp-H5p*0$Ld+BY2;`u~dSrf$7q6yGZaaJZ<6TN&NHV43)iLeobx*%3 zl{7g_a%3qKoey}rk#za<=v6HroF4Iq=+_XjA5ZwNq2)vc>1+c#Lg%t-abTSr(g?QW z>QB1f7un}TI{d!GP)OhGRvE}AX{b}MqXxbgl?D9@G@!en z-vlzVAL^HbH#d~P>}JFf2+rUoKAo#k02^(S-Z(WnF6q?lUTLlNHK>f%ubmM?8B zZRBn|mSd>qFsIZhKV9Y~W`GDG3U-bpgwsVOUN3g#x0d^KwFmAzhCSbL=!oBJJfc;Y zF1GGRxy!;xO}>*}mZ|owGME%?TTDKXpIPUzv zf*;IS#?SgVBt(QE@f@vQ&h*L7r?=+y+f{!rtbOigF=eTzzIf=oMHa0&;)x<|&P0v)Mi##;xz(A3sB;&U;v$EO%ZoHkT=to=v ze7F}BrQCKG#IF%jZOqmZJ)4D5$uA2k(vz;%o?VMD<Pr@#L zK91u4)Ng5MnCY@^Kz67%SJ9|lV*M}K_obx%zma|4Yis#0vhRc)a{aCP+^#Y8sK<@- z$}T`pS%L{1`c(yZeZc2Ou>`AB7s3l9B=u0js*#_HrEGx%^yOLIi@& zIAO?PX2E^CxVGj;pooDx&f1>K#_r&72)4Z$`pYd~bkUkC^{FF{ro{0hjb&S!_o5qm zBAuuYkImft;~6qb`IxE{$@yz@_gJ3RS<(HyjA$PrsN{Ap{em4$_j;Tn{+*aQf2D5t z_*JIpm08yjL09b$@eZzIeJ`lZUj&aPwsCrLk{0I- zJP3Fbpm5mFRMl@e0153)gdRvX9)e^N-jAQU*Shl3_L0GXyS&_a>wpU~GEKe%cw+Z+ ztao(uUI72AB}o?|Dp5wz?2uDdnY^QuV{g5TrqGhajl#W5POIF6u*}F@HM;FLhmD_0 zqP5GnT{jwjETMP))hAI7Qy&DR}QUf9Rp`(8|A8G@sUM;9*xkZ?|3^dejc*jYYo>m?}R22B+Er&Hfgg-|R7e z4PZnjL01GZHHUJVQP&w#)(PZ-)0u4ud z1sf35_pFmqAS48;1?h#u41#t5--WYQD%oZ_gU@h&elC)cKSd!L;3sb%uYV}Y_hr`E zCiqnZI~TUY>{mDClbO}SFHvfT<=i@(hWhS@|DFkR`>92jm@XQwr(-kw3kfBp>b#+1 zvmvo_<3QhR2GVihSfi-xn`{0o2ylDIN$0lfGwu=Y?!9?zng8XRb9dt-(sA=#;XQ=W z3qrT6qM)F#q(>BAj~guJ?+#qZfT#T64^k_G&+%MVSoliu7Vr;u+p6r#c*u}&X(qwb zAk{x$!@p?{3gp2B9aUr-xll4Fz0cN+zfg+%=6*3b znt3=7YHV8Lv>0;xs2{|mCpz>IEHhu^6ngxWUp70J4P`0($6L$VFnW^vN&B6UWr>y2 z&cVSZ=I}AG_K4p)c-)C!zsvr-`Vbnpu!j?NHfr=LRZ9-j=XTK_*>v~1GGBkKJXK?e zmXW2?<@{Ov`QU@R;F$4<8v_H1s$a#$AkN*4mVtVAcN-goHWsQ`|J)o|sx2hjRh7V$ zj9AEn_sI*;+K$Pa4^pKIr%t^})A=TJs`eziU zlqjnHQ<$NHhh+6k2}0>X_9DpNxBAZ#*|Vf$1w88Q)ONRK9zuOGQ5BP}#IeHZDunmc z>GuY~EW}Wq!;8IoAx=ZE-T(qyAoz$s)09>;hL_v>e{}cd;asn8w^BqAN`odt#*i|T zkc?5rB9y7jnNr45hRmcC5sE@-z&9x~nUf5eXBi@yGe&29(RttBb@n;uz0NuRoS#4T zwRgM3$LG19d#(FkYh4Wd&i#f=HBEA3gPMY$ca&M$-9my+@p)y}nwW=NOlERovk?MVTPs7!gLfGv0W(o@7k5xYNd zKEqSZEiKHAC*x{&aZvZu&xh1dTCKHzO_QgJ4e4LKx*U_O_bi1T4Yo?MnRR<`IuFm@ zN4)p?-&Saq@%yA)G=<`Wn0?2^rQ~^PwN0)2bxNQ9)E}-lOH%9vLR$LCsy2e0LYen% zg^Q=+POkkPg*;AiqC|GtO@oy{y*X6Y?*3NF9X@2nX{%pA*paSsx!P&QyZ{lA2Z!fc1e{+Ebi^%@JK%nP%$v)1x1t3&&r@OwsK zrZqre0ncp+|g}(*mj^Hkenk+KsRm32CP1 z>UV59pyyYZR!dP3_U2u8SYCt)OOD9x&YyuTRJ`5e50fnR-Rm*n@;^?6jopZFXP7RD zUmeyO5?~?*xir?Kzzk+3Z;kEJm)Kl%LtL7PYYM!)o3>2k3eKmPGJ^DF@0}X`Tt!<@O%X1nc24B7p=hGI?&x{inPIe>}-H-#IOHeW7n?2!SWWK=sa5hpkBb z;I30hb_*s$tLmKK<+Z+O3f$a5?bk0e;)&t!Qs2(-d;pnlzMWlOK>-dZ zn~mDOe0hWJ4s`EU0sOSD;|YX>gh07U(TP>UM=(2pE)OIu1aWMAmG@InCUjGD;G7EE zDab>-%KpW#>_<<}kyXR8?=yF~2v2CjUc=8SSUb!ahVnrk6FaQgJ10^69O=_t@i}Tf z5=~(A^!4@GPe1ZIgj`91)-DKU_aAfhduGH<nAR$U`m%A{~PhJ6V>figRUf97qdS!%tE?v zjyg3=`JVj1*EJKH`@637Trj+~x9_LxNNqE%xVefP?17-}CU*NfW;qa>#O(K4-Xr_qNBai>(-Wg>G39qmAt~mzh-aF#gpxY!;RJoZW?v^Z?gR9Lt%Icf(g{93 zC5S6KGKdhTI}_pDMaE{IqkJ4DuyNn-53>)9)ycPtc3yzk9exwxd={r~cd~FW51!s;7>sGZ^kMn@ z;Jsp7AG)Bg6uo~l25kZ3qq}!jn5Ob7)?c1Fj>*20&-vFY+lvG)EBq80h!Z$rr&zoq zPcD77?|+adtI=K~s*|VQTX{9vesk>tf2mi1o2!PGMBm3OlU zPuTr8u^L})52#C0;M&fh)sJ zMzq}}FP%n3eLS}+UkjU88gA%ru5oTx6l4FYX;q1IDuS8PQq{L(%gUxmBDRTWSdK96 zZE*ikUvWiO?;JUq@3+GLBwMyJze+(oJ+i+V>g%_0ZDu>0n<;5i_mr~oez`S}{bx)j zH)>r0N)4NXQCH9~iIUg33^p9aDJJ`s`qhoS+g*%MS zIW)P7(*lRt#R3D6;X^fGY`_{D4dx)oeu9_%%w^o#vmUeV}n~@Qlpx$Xo8{u+* zJn(`>p7$LO>{lq&2S*KhFKl|&K+=od7z@xaxv0dvB|GCFiPF9x5Z?rA*OU_-eW-6&`wPE(x8 zcM#u|8^S`b>FD6U0H6etz&g(12b}wqqhvYE#EL<1go6H=4~DV6cIWN7%w-qKwB5tX&ahE?=2{7qkiIj~o{kF-_t~aIb3uQiq54hHC5O(^@1x#|q?U!79YquOU zRL6QR>FcXl2(f!>EHXa%FJ9yHO3wLKb3)<2V?i0BL=0owM{*&yML4IMtKtzRN z=d|Chb^rn5W_40*Y^9K+D@3X!lsWY&O}f48_`?+eyrFP`RkO) z%Bry7L4E91$X86I7|e=bNcnPGl3r@`l|Djph7^mkxHnNz72i%!C3fi2iwMH(ub678 z2$4c@hBxYWkFO8GaI)Qy2_kG29kTmg!|bx(-tDq?AI7`zLL@U5Ur<}^MG4_>p?O!W z#n;;qr(qrLyxTSV-V-rio}bqIO9vSCOHRF&_wm?3px^TD%%}e1>9f>PBS*Ana zQtl0Kg#m_4XP(p8etzK#>8lcMPkYGe!VItSIqaZ)s{KmW#~D9^GsK6lLW|ku{es0h;dc~wi_K(Ys*t~Tu0?!`YO)b}sW|0VL8vU#G z-l`?fm^-e(dNz*wVSPu(F*tejE`L0To@cP9=T#xa#9oa0miuOnK01M7VPf@9l@2_YIZyv=2<=)xIOmD(VtHm$?i24X zgoTCakPcTwYPNKHe@@(-wEZ=RT)?|KckU3=C^*%mZ4SQ3#+}b;koOylZ~Pa_nTFd= zM#e(x-JusYKR5Sy`1R44mHYN@@*(K|_I;246?)!X7V4xtP-a+BRenTgmhEpawk-P{ zlW~!-J-qj}pEJCdK_-*kseSp8Zp+TtS%c37cMvgy)Mdqijn7QraGuNeRT=LvKJ%usZUROi0Bjo1pi(&CdR1jtH+Ft@#-7Savtu{DSn{$L}9lh>~mBlHL!% zm2n~4{u_BBkg3i|*0qfEwZk%fzqrKE!{ZM|6TJqnnk3!lZVo}>tib|nmLAlU)rNv4 z{*Cuexs}TmKiaehyQ8AWt~Mt_T2F-6D=uBC9_K+vq-Q^hb;=+?G2<%tQ< zpYY^KQo1*gJ(hRH!Qt*o@$mE8s`}e_95^@o>W|x0M2JV!Hddm2O##L5#SRbZd z$Y_mLI(~ zQlo2SXJ-d&q&{$-U`p+f5lLJi2HgfU{_V&G%l7vZzy#c9Ua+nbKXhz&^Z5egw~Jt6 zS=n?U$2kpiw)r8bBQ+9Lh(@q3CjpW{H#_zg`zI%JDl30N9L>GH*L?Pscq8wF1d3=Fy`s9#0vKB*&mAAm`A*+hDUxWKkA5Gy^}7%uilKuOw( z>lR)<(9Vx`?EpPem=C;h9nIr@KaczI2?_U| z?#a{bvcRY|2AVe6o=n`)oLqqsYJrlN!{PdlwbTa=fz26Sj0nE0|NL2Z9DJ+z0o%Nl z{s;?_Cu=S&WY$bnf#>a)*khV`2>qG`21ch|sR>3A`M6ma_z~Ycm{DL?OszV!$QGc0 z_y!N5d4GvDI}j3%1lS%BKh%qg50L*E|44IpfRD986Avk*eGxm@-D#jOK_sh>$cbsk z8exHzb0^w9{a8<)7&he{64ItX5PX(JaI-=9`;AZGTwVv$B$6^RuEG(3hnIIk`tJ{c zYQnD&YkaT|E(Z=FwlwMESQ07?WsJk#Es?-rxV>dxfUzxJve3O^o-E^N2;ix#lWBAQ z>ABp^&`Tf3LNToUZ=B?i!~z%-ealdd>^dGiSif-#9_Ii~sk#aZ zg&Ra>e?TALi;sX7j3FESzhcqfzlbHxFF5%AO0~gI^`X#o^-bNhq$D#;(ePq(m2AVZ z4}Yhh8c_yF{9t?GUA%Tt#M^2~9Qy0fve0;h{BQO8r;Ew^-^aG)zj_yYADQzQi7~U= zeumLkq*jrBUCE)d@pKgA+y|LtheVIl(W`B=*m_k>T{=9BWu1Z_(_tice^sYXz3J!q zSdlU}iGRHykI&Woiu# zjmT1n6pqF-)nPh7AjGf~(ReYSm^iI|X4?4gkD9u1$nn`&~5?w)}RQqg~mO6LtoS2vx*-XI)pgLI^oCp;~BiGJUqxA}Dg?xQs3j6KY|I(gtc);kwQv&R%eA&riT ziW;7?Nx3nKC+Xblk1NgukG)zj*j`|URtRh^x1?mA>E|fiV-(F^dwBeIBP^TGvYYdz zzt$a=%U)&s-GV;ui#uIE&k^S?^QpMFcq5}bZT3t^oH}$LJmTV6C_0psl=k-adyVs- zrGRmyJ(UT=E0mF4i7l$n1@n*<(CIR`Z@>&q%DWu!6MEFdeGK@YRH++yEC~rYjx>jD zD=967Z|)bps)SI@&m9*Qp`#5+k&kv#k!dCYyh`_nrhqhk7 zRE(=gsqq0+cBAYCvLDc?C|7fBKlpi*i z0LBH?NcaPyskB&;%&aQ1=V##u8dCt?zR@fqjj#K2*#S5__MUc%{d= zPgdaKbtwzYd7{U~#RaK4b8OH^i~SPnccc_Y)G;^VVY$nQQ^y;6IQqf3KCZf3M2y5OE9EKPiqO@5(QNF;atsKt!i@r{m` zWZeGEbP~c{pdP{ z$O=jy4nKX$x+z-7YRATzp?cpXBO@bo4znKPv_m&55awMrLUooTaGxJ{Nac4Tag8ng z>v+vW#u&z6*U{CfC53o2hvhb#>{o~l;W1O=)qY4icTnd`xzsUqmA5s-9))0y@MIK^k(xty51#GCN(lsb6Oezc@Pje!c&%Yngb9 zK^nKYokcT?x^rHo+5M@<2Acl7fha3Q#~}typ?$p#>)gh@PL8XFH-raV$l~3+@ngD5 z7<;?0#^7AeXaM)?@oS2NAFs2wEapzvDbMd>VDR@oD%r%g89!@Vyn8Cjr)57|2kk!= z<$TY*;Za0TM1D(43#^L*VBlRQ{?3zN~Fsy`!1mNP#P{j~k%lT_?_SkNz29~~3i z>Bo52?cIb+_UG1smg*$4R$9`wI9f`Hjc1e93h7p>ub;8~X|E2|w{R|@{i&p)^7beY zg6d6+>AE}7(SZXl*(WqDO!wYT7H;wN|3%dtE|v=71(US`OLNu3ezJ0Ma`V5seHw~x5Rna)eklu9%dvO8~ z^zAfoug%JI(b(M}nA_p}Ef|%T_3JC0wD>f&WbHSdG*Z85ckWc+*GEeR>(bPpyyVpK zr;zb1S6xmNx#-$i6J(IQ+F@qQegDtHT4CksGgf`ln5Gm4v`Y z|KU=hYoeY>`L#hn7O!Kjyld~HPfrdx2Pt&wm;TDncny`Xy~7e@%*Rec2*zvv^(k?ySl&5g&8-P>|pu1tk>JEB2F z#-#vbh2iu1b|b4!DQnvY>>kxsRnx=UVsG=J%WgTJ|IinGUB}g?^E1C{iC$rsfC(o= zN=HM^fLPK;qKrPRJm6{``5l2hn^j8icq;9cGArKKLV&$S_=(eX-mhVGtrk zvrjyHH=-y$k`U6<&A+IdN_M%8<-)p5^j2cWz#xUx78O_h?(A^lq$&=rEq`;S3ZKwn z3z=hvMb=)-O_l$F;)v<7fMR}O;cL_1Yi9}#gyP}mCCIi8e3*QsKFEcgFd@vAsT1XW@Mxhe=6PGC9?O3o#=lhZL zPa%tT5pQ9(GG%j^Aa2OVxQ@@GgSU3$=?Ch2^sRZ1H%FLWzm--)v-8sgFT)1z zn_@=H1*2x?*4=Y*&$PT3*OqeF@+;@pCht0Y--JN=`RS@Nc3qAI0bYx~2mgC5d`W&F z_^HdN9YUXOZ*ZKEA}=c`VOG@H7J!KtpCf(5)XY^tP)Lzln@GRay??FbrJezla%VO^ z0odH%-+%fF^qplKapsmt#mhN1cT1%%X(=LSz@iPGA;D-Hy9(3$(sY~mJ>&u`na|py zpDh_mRazeVoLAug6Spp%?`s$?)$d0%@~uHguGNKD&awyOM9^I_Gs~Z>)toU}sBStFxghn42!NGvvTT0Wjom0G$e>7a5$yY z`RSku2T`${Z`q-)NbPjab~zl$Mm4pSPhssX4JbNCJ+qvmHx*!-z0J3f(O^F+oS#cJy9dL5@ZWjAY=rl>*8EZOrqB zdm~kvDK|`rel(*ln#eT|$e$xzFNkbr;0>J#3lA5B3*wbqyY?xxG_2!^IddD4+=qYq z9XivKwvMq6n|GUAcv_C~(lvQ|Z(!fXZPV~#dqly-NfpxD5|AypZ!*-kMlPKfGa=ws zO_X_r0bPl}IOd=*8u9#)p3iw!2XIwJ!e-Q)rcvNJ%iz~ipYE~~QZufnV#M!1A#=N} zzxIed=}eaytc}X6s*3Ahqy2DirQMVG>{(c4Yxd=e_5RB$^26i;#P+-`GIG}}Z${_- z$y>denwm$X=|9agN*5``ux2J_ce!Y4Xozxc(}=uLE~n&$+o9w=u|VmQ@SM0Kr8o3> zFzBtLROj9x3_WQ-x*9w_^Oe-k{lI|(OYYHZl)bL(H9vZWhKBT=vJR%2ea(VdFWHuJ zYhU4}6Lf+)Yya*&=fTmwc56~F%aB{7uD~u@89!Q?-8^fjlg0ZE`QP@Eg86CT8pL6i xq4@vpw=b_JA^G!1*w#mfgoK2g*ut+TDcIWUr^ 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 ageLy?%gu5n{0-FKKv_ZkZl2tem;Vc-iAv)D literal 0 HcmV?d00001 diff --git a/node_modules/@cucumber/html-formatter/test/__screenshots__/test-run-exception.png b/node_modules/@cucumber/html-formatter/test/__screenshots__/test-run-exception.png new file mode 100644 index 0000000000000000000000000000000000000000..763f27b079d5f22edeaf77f15ec9fdf916e37b27 GIT binary patch literal 30220 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 literal 0 HcmV?d00001 diff --git a/node_modules/@cucumber/html-formatter/test/__screenshots__/undefined.png b/node_modules/@cucumber/html-formatter/test/__screenshots__/undefined.png new file mode 100644 index 0000000000000000000000000000000000000000..0c063ba63833035b9e286cd2a700254249f2a102 GIT binary patch literal 159052 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

      |K%lQ)dj2V>7h)mxL$tBYa*NRy-o8f~ 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 z52524*lkudowkF16@E>�!^X-KbFD(Zl}H3tj^RB@*jK1Bu7f-en@*Oj6Af#k2Yc zxiPA%qQ3<7ki>nrpCZ0tDI8ej=6Bz8OD>w3Qli2yzL|TK|AFIA&2dMq2QtGeB?x#3 zNX}2dPH6ABD+?U)w&Ew3pEmVh$QPuY@%37KeSGrh)bmklFLEkGOAfn27@LN|S&?~a zFAyo_+rn8pw;Hm*ZH%I?M`dw@~Qr(Ljf4l|Z-N~hCX=(R1X1_bp zNuVqVZxw60VD+E1te}4@lV|S9l)00;2-^&K)l_RtT4kP!IzV_^__O6_yIVRA%}NDZ)iwqYh zpJ}WA#{b4tQKPn%$-o{K4S8^BhI2KCyZl>mvYcCJRAVSI(=1<#wd&4kR?2Izk+B#< zVgzDxlHM?oGllpLaCko8GJ_eEmO$Lb!uAR1XW$Ty!-mZw#yScakA3jCS+`RUz<*#d zVxwhIB(kh9*vscvRQ{r-3~80_sirhgsX->)T@O?n2>*-iE0Oj?HLrYgEo05Ju0aTR zVR@@#wGl|{eW91oM9Cyag*vMfDnj0zD@FCaFzsQMYu0^iA1cL!%OG{LMQ{YXr3COP zA!1aILlCRW_n!OIIIiuf=f$7iU~I-{(HW*ECp(psS_vxgFUn*3Y)O?lCW z!~y+TTRo5v$+dVO_UITvcj|#17w)3KEx>Spj}E)>;LWos<-QdNg)og^4>5Ep9dTNW zd5JGvb~nuBTOg)cWY0UTbMBo88gyux?n~YsXIFZwdZ0F`-aa%kO$Xr=J%;2;kdqn( zf}a51w00)=qts(xn=WA_biN6GQS6G&4-h1t1WY4q6_Lklbu-bgK{jA04koSif|QE% zskxq!N}%=&w@M=2jGBDA!Km8k8XsTjxerR!&yIgMCGOz=Puj=H>;LT#xBdvO_UNc> i5V-?C5FI!ZcL@?AASK=1(%mVY(zPWv{VpG$ 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%0DGVr=w;#9 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 literal 0 HcmV?d00001 diff --git a/node_modules/@cucumber/html-formatter/test/__screenshots__/unused-steps.png b/node_modules/@cucumber/html-formatter/test/__screenshots__/unused-steps.png new file mode 100644 index 0000000000000000000000000000000000000000..09a204c6a9d273ec96a15360354baac98cbc4d59 GIT binary patch literal 32758 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 literal 0 HcmV?d00001 diff --git a/node_modules/@cucumber/html-formatter/test/acceptance.spec.ts b/node_modules/@cucumber/html-formatter/test/acceptance.spec.ts new file mode 100644 index 00000000..972fb284 --- /dev/null +++ b/node_modules/@cucumber/html-formatter/test/acceptance.spec.ts @@ -0,0 +1,41 @@ +import fs from 'node:fs' +import path from 'node:path' +import { pipeline } from 'node:stream/promises' + +import { NdjsonToMessageStream } from '@cucumber/message-streams' +import { expect, test } from '@playwright/test' +import { sync } from 'glob' + +import { CucumberHtmlStream } from '../src' + +const fixtures = sync(`./node_modules/@cucumber/compatibility-kit/features/**/*.ndjson`) + +test.beforeAll(async () => { + const outputDir = path.join(__dirname, './__output__') + + for (const fixture of fixtures) { + const name = path.basename(fixture, '.ndjson') + const outputFile = path.join(outputDir, `${name}.html`) + + await pipeline( + fs.createReadStream(fixture, { encoding: 'utf-8' }), + new NdjsonToMessageStream(), + new CucumberHtmlStream( + path.join(__dirname, '../dist/main.css'), + path.join(__dirname, '../dist/main.js'), + path.join(__dirname, '../dist/src/icon.url') + ), + fs.createWriteStream(outputFile) + ) + } +}) + +for (const fixture of fixtures) { + const name = path.basename(fixture, '.ndjson') + + test(`can render ${name}`, async ({ page }) => { + await page.goto(`/${name}.html`) + await page.waitForSelector('#report', { timeout: 3000 }) + await expect(page).toHaveScreenshot(`${name}.png`, { fullPage: true }) + }) +} diff --git a/node_modules/@cucumber/html-formatter/test/screenshot.css b/node_modules/@cucumber/html-formatter/test/screenshot.css new file mode 100644 index 00000000..2c4ce08a --- /dev/null +++ b/node_modules/@cucumber/html-formatter/test/screenshot.css @@ -0,0 +1,4 @@ +time, +[data-testid="cucumber.summary.setup"] { + visibility: hidden; +} diff --git a/node_modules/@cucumber/html-formatter/tsconfig.build.json b/node_modules/@cucumber/html-formatter/tsconfig.build.json new file mode 100644 index 00000000..8a11a99f --- /dev/null +++ b/node_modules/@cucumber/html-formatter/tsconfig.build.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "rootDir": ".", + "outDir": "dist", + "composite": true, + "declarationMap": true, + "noEmit": false + }, + "include": ["src", "test", "package.json"] +} diff --git a/node_modules/@cucumber/html-formatter/tsconfig.json b/node_modules/@cucumber/html-formatter/tsconfig.json new file mode 100644 index 00000000..fd35d08d --- /dev/null +++ b/node_modules/@cucumber/html-formatter/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "declaration": true, + "sourceMap": true, + "allowJs": false, + "resolveJsonModule": true, + "esModuleInterop": true, + "noImplicitAny": true, + "downlevelIteration": true, + "skipLibCheck": true, + "strictNullChecks": true, + "experimentalDecorators": true, + "module": "CommonJS", + "lib": ["ES6", "dom"], + "target": "ES6", + "moduleResolution": "node", + "allowSyntheticDefaultImports": true, + "noEmit": true, + "jsx": "react-jsx" + } +} diff --git a/node_modules/@cucumber/html-formatter/webpack.config.js b/node_modules/@cucumber/html-formatter/webpack.config.js new file mode 100644 index 00000000..5082a3eb --- /dev/null +++ b/node_modules/@cucumber/html-formatter/webpack.config.js @@ -0,0 +1,30 @@ +const MiniCssExtractPlugin = require('mini-css-extract-plugin') + +module.exports = { + entry: './dist/src/main.js', + module: { + rules: [ + { + test: /\.scss$/, + use: [ + MiniCssExtractPlugin.loader, + { + loader: 'css-loader', + options: { + modules: { + auto: true, + namedExport: false, + }, + }, + }, + 'sass-loader', + ], + }, + ], + }, + plugins: [ + new MiniCssExtractPlugin({ + filename: 'main.css', + }), + ], +} diff --git a/node_modules/@cucumber/junit-xml-formatter/LICENSE b/node_modules/@cucumber/junit-xml-formatter/LICENSE new file mode 100644 index 00000000..a31fbfff --- /dev/null +++ b/node_modules/@cucumber/junit-xml-formatter/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Cucumber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/@cucumber/junit-xml-formatter/README.md b/node_modules/@cucumber/junit-xml-formatter/README.md new file mode 100644 index 00000000..d5e1ccda --- /dev/null +++ b/node_modules/@cucumber/junit-xml-formatter/README.md @@ -0,0 +1,5 @@ +⚠️ This is an internal package; you don't need to install it in order to use the junit formatter in `@cucumber/cucumber` as it's built in there. + +# junit-xml-formatter + +> Takes a stream of Cucumber messages and outputs a JUnit XML report \ No newline at end of file diff --git a/node_modules/@cucumber/junit-xml-formatter/dist/JUnitXmlPrinter.d.ts b/node_modules/@cucumber/junit-xml-formatter/dist/JUnitXmlPrinter.d.ts new file mode 100644 index 00000000..52e22ce5 --- /dev/null +++ b/node_modules/@cucumber/junit-xml-formatter/dist/JUnitXmlPrinter.d.ts @@ -0,0 +1,15 @@ +import { Envelope } from '@cucumber/messages'; +import { Options } from './types'; +export declare class JUnitXmlPrinter { + private readonly write; + private readonly query; + private readonly builder; + private readonly testClassName?; + private readonly namingStrategy; + constructor(options: Options, write: (content: string) => void); + update(envelope: Envelope): void; + private makeReport; + private makeTestCases; + private pickleComparator; + private makeFailure; +} diff --git a/node_modules/@cucumber/junit-xml-formatter/dist/JUnitXmlPrinter.js b/node_modules/@cucumber/junit-xml-formatter/dist/JUnitXmlPrinter.js new file mode 100644 index 00000000..038d5fa0 --- /dev/null +++ b/node_modules/@cucumber/junit-xml-formatter/dist/JUnitXmlPrinter.js @@ -0,0 +1,124 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.JUnitXmlPrinter = void 0; +const messages_1 = require("@cucumber/messages"); +const query_1 = require("@cucumber/query"); +const xmlbuilder_1 = __importDefault(require("xmlbuilder")); +const helpers_1 = require("./helpers"); +const DEFAULT_NAMING_STRATEGY = (0, query_1.namingStrategy)(query_1.NamingStrategyLength.LONG, query_1.NamingStrategyFeatureName.EXCLUDE, query_1.NamingStrategyExampleName.NUMBER_AND_PICKLE_IF_PARAMETERIZED); +class JUnitXmlPrinter { + write; + query = new query_1.Query(); + builder; + testClassName; + namingStrategy; + constructor(options, write) { + this.write = write; + this.testClassName = options.testClassName; + this.namingStrategy = options.testNamingStrategy ?? DEFAULT_NAMING_STRATEGY; + this.builder = xmlbuilder_1.default + .create('testsuite', { invalidCharReplacement: '' }) + .att('name', options.suiteName || 'Cucumber'); + } + update(envelope) { + this.query.update(envelope); + if (envelope.testRunFinished) { + const testSuite = this.makeReport(); + this.builder.att('time', testSuite.time); + this.builder.att('tests', testSuite.tests); + this.builder.att('skipped', testSuite.skipped); + this.builder.att('failures', testSuite.failures); + this.builder.att('errors', testSuite.errors); + if (testSuite.timestamp) { + this.builder.att('timestamp', testSuite.timestamp); + } + for (const testCase of testSuite.testCases) { + const testcaseElement = this.builder.ele('testcase', { + classname: testCase.classname, + name: testCase.name, + time: testCase.time, + }); + if (testCase.failure) { + const failureElement = testcaseElement.ele(testCase.failure.kind); + if (testCase.failure.kind === 'failure' && testCase.failure.type) { + failureElement.att('type', testCase.failure.type); + } + if (testCase.failure.kind === 'failure' && testCase.failure.message) { + failureElement.att('message', testCase.failure.message); + } + if (testCase.failure.stack) { + failureElement.cdata(testCase.failure.stack); + } + } + if (testCase.output) { + testcaseElement.ele('system-out').cdata(testCase.output); + } + } + this.write(this.builder.end({ pretty: true })); + } + } + makeReport() { + const statuses = this.query.countMostSevereTestStepResultStatus(); + return { + time: (0, helpers_1.durationToSeconds)(this.query.findTestRunDuration()), + tests: this.query.countTestCasesStarted(), + skipped: (0, helpers_1.countStatuses)(statuses, (status) => status === messages_1.TestStepResultStatus.SKIPPED), + failures: (0, helpers_1.countStatuses)(statuses, (status) => status !== messages_1.TestStepResultStatus.PASSED && status !== messages_1.TestStepResultStatus.SKIPPED), + errors: 0, + testCases: this.makeTestCases(), + timestamp: (0, helpers_1.formatTimestamp)(this.query.findTestRunStarted()), + }; + } + makeTestCases() { + return this.query + .findAllTestCaseStartedOrderBy((q, testCaseStarted) => q.findPickleBy(testCaseStarted), this.pickleComparator) + .map((testCaseStarted) => { + const pickle = (0, helpers_1.ensure)(this.query.findPickleBy(testCaseStarted), 'Expected to find Pickle by TestCaseStarted'); + const lineage = (0, helpers_1.ensure)(this.query.findLineageBy(pickle), 'Expected to find Lineage by Pickle'); + return { + classname: this.testClassName ?? lineage.feature?.name ?? pickle.uri, + name: this.namingStrategy.reduce(lineage, pickle), + time: (0, helpers_1.durationToSeconds)(this.query.findTestCaseDurationBy(testCaseStarted)), + failure: this.makeFailure(testCaseStarted), + output: this.query + .findTestStepFinishedAndTestStepBy(testCaseStarted) + .filter(([, testStep]) => !!testStep.pickleStepId) + .map(([testStepFinished, testStep]) => { + const pickleStep = (0, helpers_1.ensure)(this.query.findPickleStepBy(testStep), 'Expected to find PickleStep by TestStep'); + const gherkinStep = (0, helpers_1.ensure)(this.query.findStepBy(pickleStep), 'Expected to find Step by PickleStep'); + return (0, helpers_1.formatStep)(gherkinStep, pickleStep, testStepFinished.testStepResult.status); + }) + .join('\n'), + }; + }); + } + pickleComparator(a, b) { + if (a.uri !== b.uri) { + return a.uri.localeCompare(b.uri); + } + if (!a.location) { + return !b.location ? 0 : -1; + } + else if (!b.location) { + return 1; + } + return a.location.line - b.location.line; + } + makeFailure(testCaseStarted) { + const result = this.query.findMostSevereTestStepResultBy(testCaseStarted); + if (!result || result.status === messages_1.TestStepResultStatus.PASSED) { + return undefined; + } + return { + kind: result.status === messages_1.TestStepResultStatus.SKIPPED ? 'skipped' : 'failure', + type: result.exception?.type, + message: result.exception?.message, + stack: result.exception?.stackTrace ?? result.message, + }; + } +} +exports.JUnitXmlPrinter = JUnitXmlPrinter; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSlVuaXRYbWxQcmludGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0pVbml0WG1sUHJpbnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxpREFBNEY7QUFDNUYsMkNBT3dCO0FBQ3hCLDREQUFtQztBQUVuQyx1Q0FBaUc7QUFHakcsTUFBTSx1QkFBdUIsR0FBRyxJQUFBLHNCQUFjLEVBQzVDLDRCQUFvQixDQUFDLElBQUksRUFDekIsaUNBQXlCLENBQUMsT0FBTyxFQUNqQyxpQ0FBeUIsQ0FBQyxrQ0FBa0MsQ0FDN0QsQ0FBQTtBQTJCRCxNQUFhLGVBQWU7SUFRUDtJQVBGLEtBQUssR0FBRyxJQUFJLGFBQUssRUFBRSxDQUFBO0lBQ25CLE9BQU8sQ0FBdUI7SUFDOUIsYUFBYSxDQUFTO0lBQ3RCLGNBQWMsQ0FBZ0I7SUFFL0MsWUFDRSxPQUFnQixFQUNDLEtBQWdDO1FBQWhDLFVBQUssR0FBTCxLQUFLLENBQTJCO1FBRWpELElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQTtRQUMxQyxJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsSUFBSSx1QkFBdUIsQ0FBQTtRQUMzRSxJQUFJLENBQUMsT0FBTyxHQUFHLG9CQUFVO2FBQ3RCLE1BQU0sQ0FBQyxXQUFXLEVBQUUsRUFBRSxzQkFBc0IsRUFBRSxFQUFFLEVBQUUsQ0FBQzthQUNuRCxHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxTQUFTLElBQUksVUFBVSxDQUFDLENBQUE7SUFDakQsQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUFrQjtRQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUUzQixJQUFJLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUM3QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7WUFDbkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUN4QyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQzFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBRTVDLElBQUksU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUN4QixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQ3BELENBQUM7WUFFRCxLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDM0MsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFO29CQUNuRCxTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVM7b0JBQzdCLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtvQkFDbkIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO2lCQUNwQixDQUFDLENBQUE7Z0JBQ0YsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ3JCLE1BQU0sY0FBYyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtvQkFDakUsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFDakUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtvQkFDbkQsQ0FBQztvQkFDRCxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUNwRSxjQUFjLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO29CQUN6RCxDQUFDO29CQUNELElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDM0IsY0FBYyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO29CQUM5QyxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ3BCLGVBQWUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtnQkFDMUQsQ0FBQztZQUNILENBQUM7WUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUNoRCxDQUFDO0lBQ0gsQ0FBQztJQUVPLFVBQVU7UUFDaEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQ0FBbUMsRUFBRSxDQUFBO1FBQ2pFLE9BQU87WUFDTCxJQUFJLEVBQUUsSUFBQSwyQkFBaUIsRUFBQyxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDekQsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMscUJBQXFCLEVBQUU7WUFDekMsT0FBTyxFQUFFLElBQUEsdUJBQWEsRUFBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sS0FBSywrQkFBb0IsQ0FBQyxPQUFPLENBQUM7WUFDckYsUUFBUSxFQUFFLElBQUEsdUJBQWEsRUFDckIsUUFBUSxFQUNSLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FDVCxNQUFNLEtBQUssK0JBQW9CLENBQUMsTUFBTSxJQUFJLE1BQU0sS0FBSywrQkFBb0IsQ0FBQyxPQUFPLENBQ3BGO1lBQ0QsTUFBTSxFQUFFLENBQUM7WUFDVCxTQUFTLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUMvQixTQUFTLEVBQUUsSUFBQSx5QkFBZSxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztTQUM1RCxDQUFBO0lBQ0gsQ0FBQztJQUVPLGFBQWE7UUFDbkIsT0FBTyxJQUFJLENBQUMsS0FBSzthQUNkLDZCQUE2QixDQUM1QixDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLEVBQ3ZELElBQUksQ0FBQyxnQkFBZ0IsQ0FDdEI7YUFDQSxHQUFHLENBQUMsQ0FBQyxlQUFlLEVBQUUsRUFBRTtZQUN2QixNQUFNLE1BQU0sR0FBRyxJQUFBLGdCQUFNLEVBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxFQUN4Qyw0Q0FBNEMsQ0FDN0MsQ0FBQTtZQUNELE1BQU0sT0FBTyxHQUFHLElBQUEsZ0JBQU0sRUFDcEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQ2hDLG9DQUFvQyxDQUNyQyxDQUFBO1lBRUQsT0FBTztnQkFDTCxTQUFTLEVBQUUsSUFBSSxDQUFDLGFBQWEsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxNQUFNLENBQUMsR0FBRztnQkFDcEUsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUM7Z0JBQ2pELElBQUksRUFBRSxJQUFBLDJCQUFpQixFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQzNFLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQztnQkFDMUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLO3FCQUNmLGlDQUFpQyxDQUFDLGVBQWUsQ0FBQztxQkFDbEQsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztxQkFDakQsR0FBRyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFO29CQUNwQyxNQUFNLFVBQVUsR0FBRyxJQUFBLGdCQUFNLEVBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEVBQ3JDLHlDQUF5QyxDQUMxQyxDQUFBO29CQUNELE1BQU0sV0FBVyxHQUFHLElBQUEsZ0JBQU0sRUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQ2pDLHFDQUFxQyxDQUN0QyxDQUFBO29CQUNELE9BQU8sSUFBQSxvQkFBVSxFQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFBO2dCQUNwRixDQUFDLENBQUM7cUJBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQzthQUNkLENBQUE7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxDQUFTLEVBQUUsQ0FBUztRQUMzQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3BCLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ25DLENBQUM7UUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzdCLENBQUM7YUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sQ0FBQyxDQUFBO1FBQ1YsQ0FBQztRQUNELE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUE7SUFDMUMsQ0FBQztJQUVPLFdBQVcsQ0FBQyxlQUFnQztRQUNsRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLDhCQUE4QixDQUFDLGVBQWUsQ0FBQyxDQUFBO1FBQ3pFLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSywrQkFBb0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM3RCxPQUFPLFNBQVMsQ0FBQTtRQUNsQixDQUFDO1FBQ0QsT0FBTztZQUNMLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTSxLQUFLLCtCQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQzVFLElBQUksRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUk7WUFDNUIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsT0FBTztZQUNsQyxLQUFLLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxVQUFVLElBQUksTUFBTSxDQUFDLE9BQU87U0FDdEQsQ0FBQTtJQUNILENBQUM7Q0FDRjtBQTVJRCwwQ0E0SUMifQ== \ No newline at end of file diff --git a/node_modules/@cucumber/junit-xml-formatter/dist/helpers.d.ts b/node_modules/@cucumber/junit-xml-formatter/dist/helpers.d.ts new file mode 100644 index 00000000..c4b00083 --- /dev/null +++ b/node_modules/@cucumber/junit-xml-formatter/dist/helpers.d.ts @@ -0,0 +1,6 @@ +import { Duration, PickleStep, Step, TestRunStarted, TestStepResultStatus } from '@cucumber/messages'; +export declare function ensure(value: T | undefined, message: string): T; +export declare function durationToSeconds(duration?: Duration): number; +export declare function countStatuses(statuses: Record, predicate?: (status: TestStepResultStatus) => boolean): number; +export declare function formatStep(step: Step, pickleStep: PickleStep, status: TestStepResultStatus): string; +export declare function formatTimestamp(testRunStarted: TestRunStarted | undefined): string | undefined; diff --git a/node_modules/@cucumber/junit-xml-formatter/dist/helpers.js b/node_modules/@cucumber/junit-xml-formatter/dist/helpers.js new file mode 100644 index 00000000..84c7ee8c --- /dev/null +++ b/node_modules/@cucumber/junit-xml-formatter/dist/helpers.js @@ -0,0 +1,43 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ensure = ensure; +exports.durationToSeconds = durationToSeconds; +exports.countStatuses = countStatuses; +exports.formatStep = formatStep; +exports.formatTimestamp = formatTimestamp; +const messages_1 = require("@cucumber/messages"); +const luxon_1 = require("luxon"); +function ensure(value, message) { + if (!value) { + throw new Error(message); + } + return value; +} +function durationToSeconds(duration) { + if (!duration) { + return 0; + } + return messages_1.TimeConversion.durationToMilliseconds(duration) / 1000; +} +function countStatuses(statuses, predicate = () => true) { + return Object.entries(statuses) + .filter(([status]) => predicate(status)) + .reduce((prev, [, curr]) => prev + curr, 0); +} +function formatStep(step, pickleStep, status) { + let text = `${step.keyword.trim()} ${pickleStep.text.trim()}.`; + do { + text += '.'; + } while (text.length < 76); + return text + status.toLowerCase(); +} +function formatTimestamp(testRunStarted) { + if (!testRunStarted) { + return undefined; + } + const millis = messages_1.TimeConversion.timestampToMillisecondsSinceEpoch(testRunStarted.timestamp); + return luxon_1.DateTime.fromMillis(millis, { zone: 'UTC' }).toISO({ + suppressMilliseconds: true, + }); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBVUEsd0JBS0M7QUFFRCw4Q0FLQztBQUVELHNDQU9DO0FBRUQsZ0NBTUM7QUFFRCwwQ0FRQztBQWpERCxpREFPMkI7QUFDM0IsaUNBQWdDO0FBRWhDLFNBQWdCLE1BQU0sQ0FBSSxLQUFvQixFQUFFLE9BQWU7SUFDN0QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUMxQixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQsU0FBZ0IsaUJBQWlCLENBQUMsUUFBbUI7SUFDbkQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsT0FBTyxDQUFDLENBQUE7SUFDVixDQUFDO0lBQ0QsT0FBTyx5QkFBYyxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQTtBQUMvRCxDQUFDO0FBRUQsU0FBZ0IsYUFBYSxDQUMzQixRQUE4QyxFQUM5QyxZQUF1RCxHQUFHLEVBQUUsQ0FBQyxJQUFJO0lBRWpFLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7U0FDNUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQThCLENBQUMsQ0FBQztTQUMvRCxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBQy9DLENBQUM7QUFFRCxTQUFnQixVQUFVLENBQUMsSUFBVSxFQUFFLFVBQXNCLEVBQUUsTUFBNEI7SUFDekYsSUFBSSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQTtJQUM5RCxHQUFHLENBQUM7UUFDRixJQUFJLElBQUksR0FBRyxDQUFBO0lBQ2IsQ0FBQyxRQUFRLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxFQUFDO0lBQzFCLE9BQU8sSUFBSSxHQUFHLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQTtBQUNwQyxDQUFDO0FBRUQsU0FBZ0IsZUFBZSxDQUFDLGNBQTBDO0lBQ3hFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNwQixPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcseUJBQWMsQ0FBQyxpQ0FBaUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDekYsT0FBTyxnQkFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDeEQsb0JBQW9CLEVBQUUsSUFBSTtLQUMzQixDQUFXLENBQUE7QUFDZCxDQUFDIn0= \ No newline at end of file diff --git a/node_modules/@cucumber/junit-xml-formatter/dist/index.d.ts b/node_modules/@cucumber/junit-xml-formatter/dist/index.d.ts new file mode 100644 index 00000000..f2b671e9 --- /dev/null +++ b/node_modules/@cucumber/junit-xml-formatter/dist/index.d.ts @@ -0,0 +1,4 @@ +import { plugin } from './plugin'; +export * from './JUnitXmlPrinter'; +export * from './types'; +export default plugin; diff --git a/node_modules/@cucumber/junit-xml-formatter/dist/index.js b/node_modules/@cucumber/junit-xml-formatter/dist/index.js new file mode 100644 index 00000000..0c29d454 --- /dev/null +++ b/node_modules/@cucumber/junit-xml-formatter/dist/index.js @@ -0,0 +1,21 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const plugin_1 = require("./plugin"); +__exportStar(require("./JUnitXmlPrinter"), exports); +__exportStar(require("./types"), exports); +exports.default = plugin_1.plugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHFDQUFpQztBQUVqQyxvREFBaUM7QUFDakMsMENBQXVCO0FBRXZCLGtCQUFlLGVBQU0sQ0FBQSJ9 \ No newline at end of file diff --git a/node_modules/@cucumber/junit-xml-formatter/dist/plugin.d.ts b/node_modules/@cucumber/junit-xml-formatter/dist/plugin.d.ts new file mode 100644 index 00000000..59a96c19 --- /dev/null +++ b/node_modules/@cucumber/junit-xml-formatter/dist/plugin.d.ts @@ -0,0 +1,11 @@ +import { Envelope } from '@cucumber/messages'; +import { Options } from './types'; +export declare const plugin: { + type: string; + formatter({ options, on, write, }: { + options: Options; + on: (type: "message", handler: (message: Envelope) => void) => void; + write: (content: string) => void; + }): void; + optionsKey: string; +}; diff --git a/node_modules/@cucumber/junit-xml-formatter/dist/plugin.js b/node_modules/@cucumber/junit-xml-formatter/dist/plugin.js new file mode 100644 index 00000000..e86b21ad --- /dev/null +++ b/node_modules/@cucumber/junit-xml-formatter/dist/plugin.js @@ -0,0 +1,13 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.plugin = void 0; +const JUnitXmlPrinter_1 = require("./JUnitXmlPrinter"); +exports.plugin = { + type: 'formatter', + formatter({ options, on, write, }) { + const printer = new JUnitXmlPrinter_1.JUnitXmlPrinter(options, write); + on('message', (message) => printer.update(message)); + }, + optionsKey: 'junit', +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSx1REFBbUQ7QUFHdEMsUUFBQSxNQUFNLEdBQUc7SUFDcEIsSUFBSSxFQUFFLFdBQVc7SUFDakIsU0FBUyxDQUFDLEVBQ1IsT0FBTyxFQUNQLEVBQUUsRUFDRixLQUFLLEdBS047UUFDQyxNQUFNLE9BQU8sR0FBRyxJQUFJLGlDQUFlLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQ25ELEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtJQUNyRCxDQUFDO0lBQ0QsVUFBVSxFQUFFLE9BQU87Q0FDcEIsQ0FBQSJ9 \ No newline at end of file diff --git a/node_modules/@cucumber/junit-xml-formatter/dist/tsconfig.build.tsbuildinfo b/node_modules/@cucumber/junit-xml-formatter/dist/tsconfig.build.tsbuildinfo new file mode 100644 index 00000000..bc3bc418 --- /dev/null +++ b/node_modules/@cucumber/junit-xml-formatter/dist/tsconfig.build.tsbuildinfo @@ -0,0 +1 @@ +{"root":["../src/JUnitXmlPrinter.ts","../src/helpers.ts","../src/index.ts","../src/plugin.ts","../src/types.ts"],"version":"5.9.3"} \ No newline at end of file diff --git a/node_modules/@cucumber/junit-xml-formatter/dist/types.d.ts b/node_modules/@cucumber/junit-xml-formatter/dist/types.d.ts new file mode 100644 index 00000000..16e7029f --- /dev/null +++ b/node_modules/@cucumber/junit-xml-formatter/dist/types.d.ts @@ -0,0 +1,6 @@ +import { NamingStrategy } from '@cucumber/query'; +export interface Options { + suiteName?: string; + testClassName?: string; + testNamingStrategy?: NamingStrategy; +} diff --git a/node_modules/@cucumber/junit-xml-formatter/dist/types.js b/node_modules/@cucumber/junit-xml-formatter/dist/types.js new file mode 100644 index 00000000..c9544d52 --- /dev/null +++ b/node_modules/@cucumber/junit-xml-formatter/dist/types.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9 \ No newline at end of file diff --git a/node_modules/@cucumber/junit-xml-formatter/package.json b/node_modules/@cucumber/junit-xml-formatter/package.json new file mode 100644 index 00000000..9243e131 --- /dev/null +++ b/node_modules/@cucumber/junit-xml-formatter/package.json @@ -0,0 +1,61 @@ +{ + "name": "@cucumber/junit-xml-formatter", + "version": "0.13.3", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "files": [ + "dist" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/cucumber/junit-xml-formatter.git" + }, + "author": "David Goss", + "license": "MIT", + "scripts": { + "build": "tsc --build tsconfig.build.json", + "clean": "rm -rf dist", + "fix": "eslint --ext ts --max-warnings 0 src --fix src && prettier --write src", + "lint": "eslint --ext ts --max-warnings 0 src && prettier --check src", + "test": "mocha 'src/**/*.spec.*'", + "prepublishOnly": "tsc --build tsconfig.build.json" + }, + "dependencies": { + "@cucumber/query": "^15.0.1", + "@teppeis/multimaps": "^3.0.0", + "luxon": "^3.5.0", + "xmlbuilder": "^15.1.1" + }, + "peerDependencies": { + "@cucumber/messages": "*" + }, + "devDependencies": { + "@cucumber/message-streams": "^4.0.1", + "@cucumber/messages": "32.3.1", + "@eslint/compat": "^2.0.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "^9.31.0", + "@types/chai": "^4.3.0", + "@types/chai-almost": "^1.0.3", + "@types/chai-xml": "^0.3.6", + "@types/luxon": "^3.4.2", + "@types/mocha": "^10.0.6", + "@types/node": "22.19.17", + "@typescript-eslint/eslint-plugin": "8.58.2", + "@typescript-eslint/parser": "8.58.2", + "chai": "^4.3.0", + "chai-almost": "^1.0.1", + "chai-xml": "^0.4.1", + "eslint": "9.39.4", + "eslint-plugin-import": "2.32.0", + "eslint-plugin-n": "17.24.0", + "eslint-plugin-simple-import-sort": "12.1.1", + "globals": "^17.0.0", + "globby": "^11.1.0", + "mocha": "^11.0.0", + "prettier": "3.8.2", + "@tsconfig/recommended": "^1.0.8", + "ts-node": "^10.9.1", + "typescript": "5.9.3" + } +} diff --git a/node_modules/@cucumber/message-streams/LICENSE b/node_modules/@cucumber/message-streams/LICENSE new file mode 100644 index 00000000..a31fbfff --- /dev/null +++ b/node_modules/@cucumber/message-streams/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Cucumber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/@cucumber/message-streams/README.md b/node_modules/@cucumber/message-streams/README.md new file mode 100644 index 00000000..655f153d --- /dev/null +++ b/node_modules/@cucumber/message-streams/README.md @@ -0,0 +1,4 @@ +# Cucumber Message Streams + +This module contains stream utilities to read/write Cucumber Message objects +to/from streams. diff --git a/node_modules/@cucumber/message-streams/dist/src/AttachmentExternalisingStream.d.ts b/node_modules/@cucumber/message-streams/dist/src/AttachmentExternalisingStream.d.ts new file mode 100644 index 00000000..7705b7f0 --- /dev/null +++ b/node_modules/@cucumber/message-streams/dist/src/AttachmentExternalisingStream.d.ts @@ -0,0 +1,38 @@ +import { Transform, type TransformCallback } from 'node:stream'; +import { type Envelope, IdGenerator } from '@cucumber/messages'; +export interface AttachmentExternalisingStreamOptions { + /** + * Controls which attachments are externalised: + * - `false` (or omitted): pass through all messages unchanged + * - `true`: externalise every attachment + * - `ReadonlyArray`: externalise only attachments whose `mediaType` + * matches one of the given patterns (e.g. `['image/*', 'video/*']`), + * where the subtype may be `*` to match any subtype + * @remarks + * Attachments with certain media types (e.g. `text/x.cucumber.log+plain`) + * are always kept inline regardless of this option. + */ + behaviour?: boolean | ReadonlyArray; + /** + * Directory to write externalised attachment files into + */ + directory: string; + /** + * Function used to generate unique IDs for attachment filenames. Defaults + * to a UUID generator + */ + newId?: IdGenerator.NewId; +} +/** + * A transform stream that externalises attachment bodies from a stream of + * {@link Envelope}s by writing them to files in a given directory and + * replacing each body with a relative URL pointing to the written file. + */ +export declare class AttachmentExternalisingStream extends Transform { + private readonly writeOperations; + private readonly options; + constructor(options: AttachmentExternalisingStreamOptions); + _transform(envelope: Envelope, _encoding: string, callback: TransformCallback): void; + private shouldExternalise; + _flush(callback: TransformCallback): void; +} diff --git a/node_modules/@cucumber/message-streams/dist/src/AttachmentExternalisingStream.js b/node_modules/@cucumber/message-streams/dist/src/AttachmentExternalisingStream.js new file mode 100644 index 00000000..31e1c116 --- /dev/null +++ b/node_modules/@cucumber/message-streams/dist/src/AttachmentExternalisingStream.js @@ -0,0 +1,82 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AttachmentExternalisingStream = void 0; +const promises_1 = require("node:fs/promises"); +const node_path_1 = __importDefault(require("node:path")); +const node_stream_1 = require("node:stream"); +const messages_1 = require("@cucumber/messages"); +const mime_1 = __importDefault(require("mime")); +const alwaysInlinedTypes = ['text/x.cucumber.log+plain', 'text/uri-list']; +const encodingsMap = { + IDENTITY: 'utf-8', + BASE64: 'base64', +}; +/** + * A transform stream that externalises attachment bodies from a stream of + * {@link Envelope}s by writing them to files in a given directory and + * replacing each body with a relative URL pointing to the written file. + */ +class AttachmentExternalisingStream extends node_stream_1.Transform { + writeOperations = []; + options; + constructor(options) { + super({ objectMode: true }); + this.options = { + behaviour: false, + ...options, + newId: options.newId ?? messages_1.IdGenerator.uuid(), + }; + } + _transform(envelope, _encoding, callback) { + if (envelope.attachment && this.shouldExternalise(envelope.attachment)) { + const { attachment, writeOperation } = rewriteAttachment(envelope.attachment, this.options.directory, this.options.newId); + this.push({ ...envelope, attachment }); + if (writeOperation) { + this.writeOperations.push(writeOperation); + } + } + else { + this.push(envelope); + } + callback(); + } + shouldExternalise(attachment) { + const { behaviour } = this.options; + if (Array.isArray(behaviour)) { + return (!alwaysInlinedTypes.includes(attachment.mediaType) && + behaviour.some((pattern) => matchMediaType(attachment.mediaType, pattern))); + } + return behaviour === true; + } + _flush(callback) { + Promise.all(this.writeOperations).then(() => callback(), (err) => callback(err)); + } +} +exports.AttachmentExternalisingStream = AttachmentExternalisingStream; +function matchMediaType(mediaType, pattern) { + const [patternType, patternSubtype] = pattern.split('/'); + const [type, subtype] = mediaType.split('/'); + return patternType === type && (patternSubtype === '*' || patternSubtype === subtype); +} +function rewriteAttachment(original, directory, newId) { + if (alwaysInlinedTypes.includes(original.mediaType)) { + return { attachment: original }; + } + let filename = `attachment-${newId()}`; + const extension = mime_1.default.getExtension(original.mediaType); + if (extension) { + filename += `.${extension}`; + } + const writeOperation = (0, promises_1.writeFile)(node_path_1.default.join(directory, filename), Buffer.from(original.body, encodingsMap[original.contentEncoding])); + const attachment = { + ...original, + contentEncoding: messages_1.AttachmentContentEncoding.IDENTITY, + body: '', + url: `./${filename}`, + }; + return { attachment, writeOperation }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXR0YWNobWVudEV4dGVybmFsaXNpbmdTdHJlYW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvQXR0YWNobWVudEV4dGVybmFsaXNpbmdTdHJlYW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsK0NBQTRDO0FBQzVDLDBEQUE0QjtBQUM1Qiw2Q0FBK0Q7QUFFL0QsaURBSzJCO0FBQzNCLGdEQUF1QjtBQUV2QixNQUFNLGtCQUFrQixHQUFHLENBQUMsMkJBQTJCLEVBQUUsZUFBZSxDQUFDLENBQUE7QUFFekUsTUFBTSxZQUFZLEdBQW1DO0lBQ25ELFFBQVEsRUFBRSxPQUFPO0lBQ2pCLE1BQU0sRUFBRSxRQUFRO0NBQ2pCLENBQUE7QUEwQkQ7Ozs7R0FJRztBQUNILE1BQWEsNkJBQThCLFNBQVEsdUJBQVM7SUFDekMsZUFBZSxHQUFvQixFQUFFLENBQUE7SUFDckMsT0FBTyxDQUFnRDtJQUV4RSxZQUFZLE9BQTZDO1FBQ3ZELEtBQUssQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQzNCLElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDYixTQUFTLEVBQUUsS0FBSztZQUNoQixHQUFHLE9BQU87WUFDVixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssSUFBSSxzQkFBVyxDQUFDLElBQUksRUFBRTtTQUMzQyxDQUFBO0lBQ0gsQ0FBQztJQUVNLFVBQVUsQ0FBQyxRQUFrQixFQUFFLFNBQWlCLEVBQUUsUUFBMkI7UUFDbEYsSUFBSSxRQUFRLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN2RSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxHQUFHLGlCQUFpQixDQUN0RCxRQUFRLENBQUMsVUFBVSxFQUNuQixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFL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 \ No newline at end of file diff --git a/node_modules/@cucumber/message-streams/dist/src/AttachmentExternalisingStream.spec.d.ts b/node_modules/@cucumber/message-streams/dist/src/AttachmentExternalisingStream.spec.d.ts new file mode 100644 index 00000000..cb0ff5c3 --- /dev/null +++ b/node_modules/@cucumber/message-streams/dist/src/AttachmentExternalisingStream.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/@cucumber/message-streams/dist/src/AttachmentExternalisingStream.spec.js b/node_modules/@cucumber/message-streams/dist/src/AttachmentExternalisingStream.spec.js new file mode 100644 index 00000000..077c701d --- /dev/null +++ b/node_modules/@cucumber/message-streams/dist/src/AttachmentExternalisingStream.spec.js @@ -0,0 +1,198 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const node_assert_1 = __importDefault(require("node:assert")); +const node_fs_1 = __importDefault(require("node:fs")); +const node_os_1 = __importDefault(require("node:os")); +const node_path_1 = __importDefault(require("node:path")); +const messages_1 = require("@cucumber/messages"); +const toArray_1 = __importDefault(require("../test/toArray")); +const AttachmentExternalisingStream_1 = require("./AttachmentExternalisingStream"); +async function collectMessages(envelopes, options) { + const stream = new AttachmentExternalisingStream_1.AttachmentExternalisingStream(options); + for (const envelope of envelopes) { + stream.write(envelope); + } + stream.end(); + return (0, toArray_1.default)(stream); +} +function getAttachment(envelope) { + node_assert_1.default.ok(envelope.attachment, 'expected envelope to have an attachment'); + return envelope.attachment; +} +describe('AttachmentExternalisingStream', () => { + let tmpDir; + beforeEach(() => { + tmpDir = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'cucumber-html-')); + }); + afterEach(() => { + node_fs_1.default.rmSync(tmpDir, { recursive: true }); + }); + it('passes through all messages when behaviour is false', async () => { + const envelopes = [ + { testRunStarted: { timestamp: { seconds: 0, nanos: 0 } } }, + { + attachment: { + body: Buffer.from('hello').toString('base64'), + contentEncoding: messages_1.AttachmentContentEncoding.BASE64, + mediaType: 'image/png', + }, + }, + ]; + const result = await collectMessages(envelopes, { behaviour: false, directory: tmpDir }); + node_assert_1.default.deepStrictEqual(result, envelopes); + node_assert_1.default.deepStrictEqual(node_fs_1.default.readdirSync(tmpDir), []); + }); + it('passes through non-attachment messages unchanged', async () => { + const envelope = { + testRunStarted: { timestamp: { seconds: 0, nanos: 0 } }, + }; + const result = await collectMessages([envelope], { behaviour: true, directory: tmpDir }); + node_assert_1.default.deepStrictEqual(result, [envelope]); + }); + it('externalises a BASE64 attachment', async () => { + const body = Buffer.from('hello').toString('base64'); + const envelope = { + attachment: { + body, + contentEncoding: messages_1.AttachmentContentEncoding.BASE64, + mediaType: 'image/png', + }, + }; + const result = await collectMessages([envelope], { behaviour: true, directory: tmpDir }); + const attachment = getAttachment(result[0]); + node_assert_1.default.strictEqual(attachment.body, ''); + node_assert_1.default.strictEqual(attachment.contentEncoding, messages_1.AttachmentContentEncoding.IDENTITY); + node_assert_1.default.ok(attachment.url); + node_assert_1.default.match(attachment.url, /^\.\/attachment-.*\.png$/); + const written = node_fs_1.default.readFileSync(node_path_1.default.join(tmpDir, attachment.url.slice(2))); + node_assert_1.default.deepStrictEqual(written, Buffer.from('hello')); + }); + it('externalises an IDENTITY attachment', async () => { + const envelope = { + attachment: { + body: '{"some":"json"}', + contentEncoding: messages_1.AttachmentContentEncoding.IDENTITY, + mediaType: 'application/json', + }, + }; + const result = await collectMessages([envelope], { behaviour: true, directory: tmpDir }); + const attachment = getAttachment(result[0]); + node_assert_1.default.strictEqual(attachment.body, ''); + node_assert_1.default.ok(attachment.url); + node_assert_1.default.match(attachment.url, /^\.\/attachment-.*\.json$/); + const written = node_fs_1.default.readFileSync(node_path_1.default.join(tmpDir, attachment.url.slice(2)), 'utf-8'); + node_assert_1.default.strictEqual(written, '{"some":"json"}'); + }); + it('does not externalise text/x.cucumber.log+plain', async () => { + const envelope = { + attachment: { + body: 'some log output', + contentEncoding: messages_1.AttachmentContentEncoding.IDENTITY, + mediaType: 'text/x.cucumber.log+plain', + }, + }; + const result = await collectMessages([envelope], { behaviour: true, directory: tmpDir }); + const attachment = getAttachment(result[0]); + node_assert_1.default.strictEqual(attachment.body, 'some log output'); + node_assert_1.default.strictEqual(attachment.url, undefined); + }); + it('does not externalise text/uri-list', async () => { + const envelope = { + attachment: { + body: 'https://example.com', + contentEncoding: messages_1.AttachmentContentEncoding.IDENTITY, + mediaType: 'text/uri-list', + }, + }; + const result = await collectMessages([envelope], { behaviour: true, directory: tmpDir }); + const attachment = getAttachment(result[0]); + node_assert_1.default.strictEqual(attachment.body, 'https://example.com'); + node_assert_1.default.strictEqual(attachment.url, undefined); + }); + it('externalises only attachments matching the given patterns', async () => { + const envelopes = [ + { + attachment: { + body: Buffer.from('image data').toString('base64'), + contentEncoding: messages_1.AttachmentContentEncoding.BASE64, + mediaType: 'image/png', + }, + }, + { + attachment: { + body: Buffer.from('video data').toString('base64'), + contentEncoding: messages_1.AttachmentContentEncoding.BASE64, + mediaType: 'video/mp4', + }, + }, + { + attachment: { + body: 'some text', + contentEncoding: messages_1.AttachmentContentEncoding.IDENTITY, + mediaType: 'text/plain', + }, + }, + ]; + const result = await collectMessages(envelopes, { + behaviour: ['image/*', 'video/*'], + directory: tmpDir, + }); + const image = getAttachment(result[0]); + node_assert_1.default.strictEqual(image.body, ''); + node_assert_1.default.ok(image.url); + const video = getAttachment(result[1]); + node_assert_1.default.strictEqual(video.body, ''); + node_assert_1.default.ok(video.url); + const text = getAttachment(result[2]); + node_assert_1.default.strictEqual(text.body, 'some text'); + node_assert_1.default.strictEqual(text.url, undefined); + }); + it('supports exact media type in patterns', async () => { + const envelopes = [ + { + attachment: { + body: Buffer.from('png data').toString('base64'), + contentEncoding: messages_1.AttachmentContentEncoding.BASE64, + mediaType: 'image/png', + }, + }, + { + attachment: { + body: Buffer.from('jpeg data').toString('base64'), + contentEncoding: messages_1.AttachmentContentEncoding.BASE64, + mediaType: 'image/jpeg', + }, + }, + ]; + const result = await collectMessages(envelopes, { + behaviour: ['image/png'], + directory: tmpDir, + }); + const png = getAttachment(result[0]); + node_assert_1.default.strictEqual(png.body, ''); + node_assert_1.default.ok(png.url); + const jpeg = getAttachment(result[1]); + node_assert_1.default.strictEqual(jpeg.body, Buffer.from('jpeg data').toString('base64')); + node_assert_1.default.strictEqual(jpeg.url, undefined); + }); + it('does not externalise always-inlined types even when matching patterns', async () => { + const envelope = { + attachment: { + body: 'some log output', + contentEncoding: messages_1.AttachmentContentEncoding.IDENTITY, + mediaType: 'text/x.cucumber.log+plain', + }, + }; + const result = await collectMessages([envelope], { + behaviour: ['text/*'], + directory: tmpDir, + }); + const attachment = getAttachment(result[0]); + node_assert_1.default.strictEqual(attachment.body, 'some log output'); + node_assert_1.default.strictEqual(attachment.url, undefined); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXR0YWNobWVudEV4dGVybmFsaXNpbmdTdHJlYW0uc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9BdHRhY2htZW50RXh0ZXJuYWxpc2luZ1N0cmVhbS5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsOERBQWdDO0FBQ2hDLHNEQUF3QjtBQUN4QixzREFBd0I7QUFDeEIsMERBQTRCO0FBRTVCLGlEQUE4RjtBQUM5Riw4REFBcUM7QUFFckMsbUZBQStFO0FBRS9FLEtBQUssVUFBVSxlQUFlLENBQzVCLFNBQXFCLEVBQ3JCLE9BQTZDO0lBRTdDLE1BQU0sTUFBTSxHQUFHLElBQUksNkRBQTZCLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDekQsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNqQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3hCLENBQUM7SUFDRCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUE7SUFDWixPQUFPLElBQUEsaUJBQU8sRUFBQyxNQUFNLENBQUMsQ0FBQTtBQUN4QixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsUUFBa0I7SUFDdkMscUJBQU0sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSx5Q0FBeUMsQ0FBQyxDQUFBO0lBQ3pFLE9BQU8sUUFBUSxDQUFDLFVBQVUsQ0FBQTtBQUM1QixDQUFDO0FBRUQsUUFBUSxDQUFDLCtCQUErQixFQUFFLEdBQUcsRUFBRTtJQUM3QyxJQUFJLE1BQWMsQ0FBQTtJQUVsQixVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsTUFBTSxHQUFHLGlCQUFFLENBQUMsV0FBVyxDQUFDLG1CQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFBO0lBQ25FLENBQUMsQ0FBQyxDQUFBO0lBRUYsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNi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 \ No newline at end of file diff --git a/node_modules/@cucumber/message-streams/dist/src/MessageToNdjsonStream.d.ts b/node_modules/@cucumber/message-streams/dist/src/MessageToNdjsonStream.d.ts new file mode 100644 index 00000000..f2db6924 --- /dev/null +++ b/node_modules/@cucumber/message-streams/dist/src/MessageToNdjsonStream.d.ts @@ -0,0 +1,9 @@ +import { Transform, type TransformCallback } from 'node:stream'; +import type { Envelope } from '@cucumber/messages'; +/** + * Transforms a stream of message objects to NDJSON + */ +export default class MessageToNdjsonStream extends Transform { + constructor(); + _transform(envelope: Envelope, _encoding: string, callback: TransformCallback): void; +} diff --git a/node_modules/@cucumber/message-streams/dist/src/MessageToNdjsonStream.js b/node_modules/@cucumber/message-streams/dist/src/MessageToNdjsonStream.js new file mode 100644 index 00000000..1a6e88c1 --- /dev/null +++ b/node_modules/@cucumber/message-streams/dist/src/MessageToNdjsonStream.js @@ -0,0 +1,18 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const node_stream_1 = require("node:stream"); +/** + * Transforms a stream of message objects to NDJSON + */ +class MessageToNdjsonStream extends node_stream_1.Transform { + constructor() { + super({ writableObjectMode: true, readableObjectMode: false }); + } + _transform(envelope, _encoding, callback) { + const json = JSON.stringify(envelope); + this.push(`${json}\n`); + callback(); + } +} +exports.default = MessageToNdjsonStream; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVzc2FnZVRvTmRqc29uU3RyZWFtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL01lc3NhZ2VUb05kanNvblN0cmVhbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZDQUErRDtBQUcvRDs7R0FFRztBQUNILE1BQXFCLHFCQUFzQixTQUFRLHVCQUFTO0lBQzFEO1FBQ0UsS0FBSyxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7SUFDaEUsQ0FBQztJQUVNLFVBQVUsQ0FBQyxRQUFrQixFQUFFLFNBQWlCLEVBQUUsUUFBMkI7UUFDbEYsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQTtRQUN0QixRQUFRLEVBQUUsQ0FBQTtJQUNaLENBQUM7Q0FDRjtBQVZELHdDQVVDIn0= \ No newline at end of file diff --git a/node_modules/@cucumber/message-streams/dist/src/NdjsonToMessageStream.d.ts b/node_modules/@cucumber/message-streams/dist/src/NdjsonToMessageStream.d.ts new file mode 100644 index 00000000..0bcd8b4d --- /dev/null +++ b/node_modules/@cucumber/message-streams/dist/src/NdjsonToMessageStream.d.ts @@ -0,0 +1,17 @@ +import { Transform, type TransformCallback } from 'node:stream'; +import { type Envelope } from '@cucumber/messages'; +/** + * Transforms an NDJSON stream to a stream of message objects + */ +export default class NdjsonToMessageStream extends Transform { + private readonly parseLine; + private buffer; + /** + * Create a new stream + * + * @param parseLine a function that parses a line. This function may ignore a line by returning null. + */ + constructor(parseLine?: (line: string) => Envelope | null); + _transform(chunk: string, _encoding: string, callback: TransformCallback): void; + _flush(callback: TransformCallback): void; +} diff --git a/node_modules/@cucumber/message-streams/dist/src/NdjsonToMessageStream.js b/node_modules/@cucumber/message-streams/dist/src/NdjsonToMessageStream.js new file mode 100644 index 00000000..43587129 --- /dev/null +++ b/node_modules/@cucumber/message-streams/dist/src/NdjsonToMessageStream.js @@ -0,0 +1,59 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const node_stream_1 = require("node:stream"); +const messages_1 = require("@cucumber/messages"); +/** + * Transforms an NDJSON stream to a stream of message objects + */ +class NdjsonToMessageStream extends node_stream_1.Transform { + parseLine; + buffer = ''; + /** + * Create a new stream + * + * @param parseLine a function that parses a line. This function may ignore a line by returning null. + */ + constructor(parseLine = messages_1.parseEnvelope) { + super({ writableObjectMode: false, readableObjectMode: true }); + this.parseLine = parseLine; + } + _transform(chunk, _encoding, callback) { + this.buffer += Buffer.isBuffer(chunk) ? chunk.toString('utf-8') : chunk; + const lines = this.buffer.split('\n'); + if (!lines.length) { + callback(); + return; + } + this.buffer = lines.pop(); + for (const line of lines) { + if (line.trim().length > 0) { + try { + const envelope = this.parseLine(line); + if (envelope !== null) { + this.push(envelope); + } + } + catch (cause) { + callback(new Error(`Not JSON: '${line}'`, { cause })); + return; + } + } + } + callback(); + } + _flush(callback) { + if (this.buffer) { + try { + const object = JSON.parse(this.buffer); + this.push(object); + } + catch { + callback(new Error(`Not JSONs: ${this.buffer}`)); + return; + } + } + callback(); + } +} +exports.default = NdjsonToMessageStream; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmRqc29uVG9NZXNzYWdlU3RyZWFtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL05kanNvblRvTWVzc2FnZVN0cmVhbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZDQUErRDtBQUMvRCxpREFBaUU7QUFFakU7O0dBRUc7QUFDSCxNQUFxQixxQkFBc0IsU0FBUSx1QkFBUztJQVE3QjtJQVByQixNQUFNLEdBQUcsRUFBRSxDQUFBO0lBRW5COzs7O09BSUc7SUFDSCxZQUE2QixZQUErQyx3QkFBYTtRQUN2RixLQUFLLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQURuQyxjQUFTLEdBQVQsU0FBUyxDQUFtRDtJQUV6RixDQUFDO0lBRU0sVUFBVSxDQUFDLEtBQWEsRUFBRSxTQUFpQixFQUFFLFFBQTJCO1FBQzdFLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFBO1FBQ3ZFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRXJDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEIsUUFBUSxFQUFFLENBQUE7WUFDVixPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBWSxDQUFBO1FBQ25DLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUM7b0JBQ0gsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtvQkFDckMsSUFBSSxRQUFRLEtBQUssSUFBSSxFQUFFLENBQUM7d0JBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7b0JBQ3JCLENBQUM7Z0JBQ0gsQ0FBQztnQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO29CQUNmLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxjQUFjLElBQUksR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFBO29CQUNyRCxPQUFNO2dCQUNSLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELFFBQVEsRUFBRSxDQUFBO0lBQ1osQ0FBQztJQUVNLE1BQU0sQ0FBQyxRQUEyQjtRQUN2QyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7Z0JBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDbkIsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsY0FBYyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFBO2dCQUNoRCxPQUFNO1lBQ1IsQ0FBQztRQUNILENBQUM7UUFDRCxRQUFRLEVBQUUsQ0FBQTtJQUNaLENBQUM7Q0FDRjtBQWxERCx3Q0FrREMifQ== \ No newline at end of file diff --git a/node_modules/@cucumber/message-streams/dist/src/index.d.ts b/node_modules/@cucumber/message-streams/dist/src/index.d.ts new file mode 100644 index 00000000..1b9c405a --- /dev/null +++ b/node_modules/@cucumber/message-streams/dist/src/index.d.ts @@ -0,0 +1,4 @@ +import MessageToNdjsonStream from './MessageToNdjsonStream'; +import NdjsonToMessageStream from './NdjsonToMessageStream'; +export * from './AttachmentExternalisingStream'; +export { MessageToNdjsonStream, NdjsonToMessageStream }; diff --git a/node_modules/@cucumber/message-streams/dist/src/index.js b/node_modules/@cucumber/message-streams/dist/src/index.js new file mode 100644 index 00000000..e2857798 --- /dev/null +++ b/node_modules/@cucumber/message-streams/dist/src/index.js @@ -0,0 +1,26 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.NdjsonToMessageStream = exports.MessageToNdjsonStream = void 0; +const MessageToNdjsonStream_1 = __importDefault(require("./MessageToNdjsonStream")); +exports.MessageToNdjsonStream = MessageToNdjsonStream_1.default; +const NdjsonToMessageStream_1 = __importDefault(require("./NdjsonToMessageStream")); +exports.NdjsonToMessageStream = NdjsonToMessageStream_1.default; +__exportStar(require("./AttachmentExternalisingStream"), exports); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvRkFBMkQ7QUFLbEQsZ0NBTEYsK0JBQXFCLENBS0U7QUFKOUIsb0ZBQTJEO0FBSTNCLGdDQUp6QiwrQkFBcUIsQ0FJeUI7QUFGckQsa0VBQStDIn0= \ No newline at end of file diff --git a/node_modules/@cucumber/message-streams/dist/test/toArray.d.ts b/node_modules/@cucumber/message-streams/dist/test/toArray.d.ts new file mode 100644 index 00000000..b2e7e1e9 --- /dev/null +++ b/node_modules/@cucumber/message-streams/dist/test/toArray.d.ts @@ -0,0 +1,3 @@ +import type { Readable } from 'node:stream'; +import type * as messages from '@cucumber/messages'; +export default function toArray(input: Readable): Promise; diff --git a/node_modules/@cucumber/message-streams/dist/test/toArray.js b/node_modules/@cucumber/message-streams/dist/test/toArray.js new file mode 100644 index 00000000..cc993cf3 --- /dev/null +++ b/node_modules/@cucumber/message-streams/dist/test/toArray.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = toArray; +function toArray(input) { + return new Promise((resolve, reject) => { + const result = []; + input.on('data', (wrapper) => result.push(wrapper)); + input.on('end', () => resolve(result)); + input.on('error', (err) => reject(err)); + }); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9BcnJheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3QvdG9BcnJheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLDBCQU9DO0FBUEQsU0FBd0IsT0FBTyxDQUFDLEtBQWU7SUFDN0MsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQyxNQUFNLE1BQU0sR0FBd0IsRUFBRSxDQUFBO1FBQ3RDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBMEIsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO1FBQ3RFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO1FBQ3RDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBVSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUNoRCxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMifQ== \ No newline at end of file diff --git a/node_modules/@cucumber/message-streams/dist/tsconfig.build.tsbuildinfo b/node_modules/@cucumber/message-streams/dist/tsconfig.build.tsbuildinfo new file mode 100644 index 00000000..c1cff35c --- /dev/null +++ b/node_modules/@cucumber/message-streams/dist/tsconfig.build.tsbuildinfo @@ -0,0 +1 @@ +{"root":["../src/AttachmentExternalisingStream.spec.ts","../src/AttachmentExternalisingStream.ts","../src/MessageToNdjsonStream.ts","../src/NdjsonToMessageStream.ts","../src/index.ts"],"version":"5.9.3"} \ No newline at end of file diff --git a/node_modules/@cucumber/message-streams/package.json b/node_modules/@cucumber/message-streams/package.json new file mode 100644 index 00000000..6c4f4077 --- /dev/null +++ b/node_modules/@cucumber/message-streams/package.json @@ -0,0 +1,46 @@ +{ + "name": "@cucumber/message-streams", + "version": "4.1.1", + "description": "Streams for reading/writing messages", + "main": "dist/src/index.js", + "types": "dist/src/index.d.ts", + "files": [ + "dist" + ], + "repository": { + "type": "git", + "url": "git://github.com/cucumber/message-streams.git" + }, + "author": "Cucumber Limited ", + "license": "MIT", + "scripts": { + "build": "tsc --build tsconfig.build.json", + "fix": "biome check --fix --error-on-warnings", + "lint": "biome check --error-on-warnings", + "test": "mocha \"src/**/*.spec.ts\" \"test/*Test.ts\"", + "prepublishOnly": "npm run build" + }, + "devDependencies": { + "@biomejs/biome": "^2.4.10", + "@cucumber/biome-config": "cucumber/biome-config#v0.1.0", + "@cucumber/messages": "^32.0.0", + "@tsconfig/recommended": "^1.0.13", + "@types/mime": "^3.0.4", + "@types/mocha": "10.0.10", + "@types/node": "22.19.17", + "mocha": "11.7.5", + "tsx": "^4.21.0", + "typescript": "5.9.3" + }, + "peerDependencies": { + "@cucumber/messages": ">=17.1.1" + }, + "bugs": { + "url": "https://github.com/cucumber/message-streams/issues" + }, + "homepage": "https://github.com/cucumber/message-streams#readme", + "keywords": [], + "dependencies": { + "mime": "^3.0.0" + } +} diff --git a/node_modules/@cucumber/messages/LICENSE b/node_modules/@cucumber/messages/LICENSE new file mode 100644 index 00000000..520b896f --- /dev/null +++ b/node_modules/@cucumber/messages/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Cucumber Ltd and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/@cucumber/messages/README.md b/node_modules/@cucumber/messages/README.md new file mode 100644 index 00000000..d9ca4460 --- /dev/null +++ b/node_modules/@cucumber/messages/README.md @@ -0,0 +1,2 @@ +# Cucumber Messages for JavaScript (JSON schema) + diff --git a/node_modules/@cucumber/messages/dist/cjs/package.json b/node_modules/@cucumber/messages/dist/cjs/package.json new file mode 100644 index 00000000..6666e053 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/package.json @@ -0,0 +1,4 @@ +{ + "name": "@cucumber/messages", + "type": "commonjs" +} diff --git a/node_modules/@cucumber/messages/dist/cjs/src/IdGenerator.d.ts b/node_modules/@cucumber/messages/dist/cjs/src/IdGenerator.d.ts new file mode 100644 index 00000000..cf2902b7 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/src/IdGenerator.d.ts @@ -0,0 +1,4 @@ +export type NewId = () => string; +export declare function uuid(): NewId; +export declare function incrementing(): NewId; +//# sourceMappingURL=IdGenerator.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/src/IdGenerator.d.ts.map b/node_modules/@cucumber/messages/dist/cjs/src/IdGenerator.d.ts.map new file mode 100644 index 00000000..6bf199e6 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/src/IdGenerator.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"IdGenerator.d.ts","sourceRoot":"","sources":["../../../src/IdGenerator.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,KAAK,GAAG,MAAM,MAAM,CAAA;AAEhC,wBAAgB,IAAI,IAAI,KAAK,CAE5B;AAED,wBAAgB,YAAY,IAAI,KAAK,CAGpC"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/src/IdGenerator.js b/node_modules/@cucumber/messages/dist/cjs/src/IdGenerator.js new file mode 100644 index 00000000..ea39b649 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/src/IdGenerator.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.uuid = uuid; +exports.incrementing = incrementing; +function uuid() { + return function () { return crypto.randomUUID(); }; +} +function incrementing() { + var next = 0; + return function () { return (next++).toString(); }; +} +//# sourceMappingURL=IdGenerator.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/src/IdGenerator.js.map b/node_modules/@cucumber/messages/dist/cjs/src/IdGenerator.js.map new file mode 100644 index 00000000..4ac2c968 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/src/IdGenerator.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IdGenerator.js","sourceRoot":"","sources":["../../../src/IdGenerator.ts"],"names":[],"mappings":";;AAEA,oBAEC;AAED,oCAGC;AAPD,SAAgB,IAAI;IAClB,OAAO,cAAM,OAAA,MAAM,CAAC,UAAU,EAAE,EAAnB,CAAmB,CAAA;AAClC,CAAC;AAED,SAAgB,YAAY;IAC1B,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,OAAO,cAAM,OAAA,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAnB,CAAmB,CAAA;AAClC,CAAC"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/src/TimeConversion.d.ts b/node_modules/@cucumber/messages/dist/cjs/src/TimeConversion.d.ts new file mode 100644 index 00000000..a4fec1b5 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/src/TimeConversion.d.ts @@ -0,0 +1,7 @@ +import * as messages from './messages.js'; +export declare function millisecondsSinceEpochToTimestamp(millisecondsSinceEpoch: number): messages.Timestamp; +export declare function millisecondsToDuration(durationInMilliseconds: number): messages.Duration; +export declare function timestampToMillisecondsSinceEpoch(timestamp: messages.Timestamp): number; +export declare function durationToMilliseconds(duration: messages.Duration): number; +export declare function addDurations(durationA: messages.Duration, durationB: messages.Duration): messages.Duration; +//# sourceMappingURL=TimeConversion.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/src/TimeConversion.d.ts.map b/node_modules/@cucumber/messages/dist/cjs/src/TimeConversion.d.ts.map new file mode 100644 index 00000000..52fb1ca5 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/src/TimeConversion.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"TimeConversion.d.ts","sourceRoot":"","sources":["../../../src/TimeConversion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AAMzC,wBAAgB,iCAAiC,CAC/C,sBAAsB,EAAE,MAAM,GAC7B,QAAQ,CAAC,SAAS,CAEpB;AAED,wBAAgB,sBAAsB,CAAC,sBAAsB,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAExF;AAED,wBAAgB,iCAAiC,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,GAAG,MAAM,CAGvF;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,UAGjE;AAED,wBAAgB,YAAY,CAC1B,SAAS,EAAE,QAAQ,CAAC,QAAQ,EAC5B,SAAS,EAAE,QAAQ,CAAC,QAAQ,GAC3B,QAAQ,CAAC,QAAQ,CAQnB"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/src/TimeConversion.js b/node_modules/@cucumber/messages/dist/cjs/src/TimeConversion.js new file mode 100644 index 00000000..72f39d25 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/src/TimeConversion.js @@ -0,0 +1,44 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.millisecondsSinceEpochToTimestamp = millisecondsSinceEpochToTimestamp; +exports.millisecondsToDuration = millisecondsToDuration; +exports.timestampToMillisecondsSinceEpoch = timestampToMillisecondsSinceEpoch; +exports.durationToMilliseconds = durationToMilliseconds; +exports.addDurations = addDurations; +var MILLISECONDS_PER_SECOND = 1e3; +var NANOSECONDS_PER_MILLISECOND = 1e6; +var NANOSECONDS_PER_SECOND = 1e9; +function millisecondsSinceEpochToTimestamp(millisecondsSinceEpoch) { + return toSecondsAndNanos(millisecondsSinceEpoch); +} +function millisecondsToDuration(durationInMilliseconds) { + return toSecondsAndNanos(durationInMilliseconds); +} +function timestampToMillisecondsSinceEpoch(timestamp) { + var seconds = timestamp.seconds, nanos = timestamp.nanos; + return toMillis(seconds, nanos); +} +function durationToMilliseconds(duration) { + var seconds = duration.seconds, nanos = duration.nanos; + return toMillis(seconds, nanos); +} +function addDurations(durationA, durationB) { + var seconds = +durationA.seconds + +durationB.seconds; + var nanos = durationA.nanos + durationB.nanos; + if (nanos >= NANOSECONDS_PER_SECOND) { + seconds += 1; + nanos -= NANOSECONDS_PER_SECOND; + } + return { seconds: seconds, nanos: nanos }; +} +function toSecondsAndNanos(milliseconds) { + var seconds = Math.floor(milliseconds / MILLISECONDS_PER_SECOND); + var nanos = Math.floor((milliseconds % MILLISECONDS_PER_SECOND) * NANOSECONDS_PER_MILLISECOND); + return { seconds: seconds, nanos: nanos }; +} +function toMillis(seconds, nanos) { + var secondMillis = +seconds * MILLISECONDS_PER_SECOND; + var nanoMillis = nanos / NANOSECONDS_PER_MILLISECOND; + return secondMillis + nanoMillis; +} +//# sourceMappingURL=TimeConversion.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/src/TimeConversion.js.map b/node_modules/@cucumber/messages/dist/cjs/src/TimeConversion.js.map new file mode 100644 index 00000000..73c1a34b --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/src/TimeConversion.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TimeConversion.js","sourceRoot":"","sources":["../../../src/TimeConversion.ts"],"names":[],"mappings":";;AAMA,8EAIC;AAED,wDAEC;AAED,8EAGC;AAED,wDAGC;AAED,oCAWC;AAnCD,IAAM,uBAAuB,GAAG,GAAG,CAAA;AACnC,IAAM,2BAA2B,GAAG,GAAG,CAAA;AACvC,IAAM,sBAAsB,GAAG,GAAG,CAAA;AAElC,SAAgB,iCAAiC,CAC/C,sBAA8B;IAE9B,OAAO,iBAAiB,CAAC,sBAAsB,CAAC,CAAA;AAClD,CAAC;AAED,SAAgB,sBAAsB,CAAC,sBAA8B;IACnE,OAAO,iBAAiB,CAAC,sBAAsB,CAAC,CAAA;AAClD,CAAC;AAED,SAAgB,iCAAiC,CAAC,SAA6B;IACrE,IAAA,OAAO,GAAY,SAAS,QAArB,EAAE,KAAK,GAAK,SAAS,MAAd,CAAc;IACpC,OAAO,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;AACjC,CAAC;AAED,SAAgB,sBAAsB,CAAC,QAA2B;IACxD,IAAA,OAAO,GAAY,QAAQ,QAApB,EAAE,KAAK,GAAK,QAAQ,MAAb,CAAa;IACnC,OAAO,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;AACjC,CAAC;AAED,SAAgB,YAAY,CAC1B,SAA4B,EAC5B,SAA4B;IAE5B,IAAI,OAAO,GAAG,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,SAAS,CAAC,OAAO,CAAA;IACrD,IAAI,KAAK,GAAG,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAA;IAC7C,IAAI,KAAK,IAAI,sBAAsB,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC,CAAA;QACZ,KAAK,IAAI,sBAAsB,CAAA;IACjC,CAAC;IACD,OAAO,EAAE,OAAO,SAAA,EAAE,KAAK,OAAA,EAAE,CAAA;AAC3B,CAAC;AAED,SAAS,iBAAiB,CAAC,YAAoB;IAC7C,IAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,uBAAuB,CAAC,CAAA;IAClE,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,GAAG,uBAAuB,CAAC,GAAG,2BAA2B,CAAC,CAAA;IAChG,OAAO,EAAE,OAAO,SAAA,EAAE,KAAK,OAAA,EAAE,CAAA;AAC3B,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe,EAAE,KAAa;IAC9C,IAAM,YAAY,GAAG,CAAC,OAAO,GAAG,uBAAuB,CAAA;IACvD,IAAM,UAAU,GAAG,KAAK,GAAG,2BAA2B,CAAA;IACtD,OAAO,YAAY,GAAG,UAAU,CAAA;AAClC,CAAC"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/src/getWorstTestStepResult.d.ts b/node_modules/@cucumber/messages/dist/cjs/src/getWorstTestStepResult.d.ts new file mode 100644 index 00000000..5eb20d95 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/src/getWorstTestStepResult.d.ts @@ -0,0 +1,7 @@ +import { TestStepResult } from './messages.js'; +/** + * Gets the worst result + * @param testStepResults + */ +export declare function getWorstTestStepResult(testStepResults: readonly TestStepResult[]): TestStepResult; +//# sourceMappingURL=getWorstTestStepResult.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/src/getWorstTestStepResult.d.ts.map b/node_modules/@cucumber/messages/dist/cjs/src/getWorstTestStepResult.d.ts.map new file mode 100644 index 00000000..5614fb13 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/src/getWorstTestStepResult.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"getWorstTestStepResult.d.ts","sourceRoot":"","sources":["../../../src/getWorstTestStepResult.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAwB,MAAM,eAAe,CAAA;AAGpE;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,eAAe,EAAE,SAAS,cAAc,EAAE,GAAG,cAAc,CAOjG"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/src/getWorstTestStepResult.js b/node_modules/@cucumber/messages/dist/cjs/src/getWorstTestStepResult.js new file mode 100644 index 00000000..c1580373 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/src/getWorstTestStepResult.js @@ -0,0 +1,27 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getWorstTestStepResult = getWorstTestStepResult; +var messages_js_1 = require("./messages.js"); +var TimeConversion_js_1 = require("./TimeConversion.js"); +/** + * Gets the worst result + * @param testStepResults + */ +function getWorstTestStepResult(testStepResults) { + return (testStepResults.slice().sort(function (r1, r2) { return ordinal(r2.status) - ordinal(r1.status); })[0] || { + status: messages_js_1.TestStepResultStatus.UNKNOWN, + duration: (0, TimeConversion_js_1.millisecondsToDuration)(0), + }); +} +function ordinal(status) { + return [ + messages_js_1.TestStepResultStatus.UNKNOWN, + messages_js_1.TestStepResultStatus.PASSED, + messages_js_1.TestStepResultStatus.SKIPPED, + messages_js_1.TestStepResultStatus.PENDING, + messages_js_1.TestStepResultStatus.UNDEFINED, + messages_js_1.TestStepResultStatus.AMBIGUOUS, + messages_js_1.TestStepResultStatus.FAILED, + ].indexOf(status); +} +//# sourceMappingURL=getWorstTestStepResult.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/src/getWorstTestStepResult.js.map b/node_modules/@cucumber/messages/dist/cjs/src/getWorstTestStepResult.js.map new file mode 100644 index 00000000..c0782d16 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/src/getWorstTestStepResult.js.map @@ -0,0 +1 @@ +{"version":3,"file":"getWorstTestStepResult.js","sourceRoot":"","sources":["../../../src/getWorstTestStepResult.ts"],"names":[],"mappings":";;AAOA,wDAOC;AAdD,6CAAoE;AACpE,yDAA4D;AAE5D;;;GAGG;AACH,SAAgB,sBAAsB,CAAC,eAA0C;IAC/E,OAAO,CACL,eAAe,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,UAAC,EAAE,EAAE,EAAE,IAAK,OAAA,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,EAAvC,CAAuC,CAAC,CAAC,CAAC,CAAC,IAAI;QACtF,MAAM,EAAE,kCAAoB,CAAC,OAAO;QACpC,QAAQ,EAAE,IAAA,0CAAsB,EAAC,CAAC,CAAC;KACpC,CACF,CAAA;AACH,CAAC;AAED,SAAS,OAAO,CAAC,MAA4B;IAC3C,OAAO;QACL,kCAAoB,CAAC,OAAO;QAC5B,kCAAoB,CAAC,MAAM;QAC3B,kCAAoB,CAAC,OAAO;QAC5B,kCAAoB,CAAC,OAAO;QAC5B,kCAAoB,CAAC,SAAS;QAC9B,kCAAoB,CAAC,SAAS;QAC9B,kCAAoB,CAAC,MAAM;KAC5B,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;AACnB,CAAC"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/src/index.d.ts b/node_modules/@cucumber/messages/dist/cjs/src/index.d.ts new file mode 100644 index 00000000..3564d994 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/src/index.d.ts @@ -0,0 +1,8 @@ +import * as TimeConversion from './TimeConversion.js'; +import * as IdGenerator from './IdGenerator.js'; +import { parseEnvelope } from './parseEnvelope.js'; +import { getWorstTestStepResult } from './getWorstTestStepResult.js'; +import { version } from './version.js'; +export * from './messages.js'; +export { TimeConversion, IdGenerator, version, parseEnvelope, getWorstTestStepResult }; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/src/index.d.ts.map b/node_modules/@cucumber/messages/dist/cjs/src/index.d.ts.map new file mode 100644 index 00000000..e3cbbd18 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/src/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAA;AACrD,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,cAAc,eAAe,CAAA;AAE7B,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/src/index.js b/node_modules/@cucumber/messages/dist/cjs/src/index.js new file mode 100644 index 00000000..586bd271 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/src/index.js @@ -0,0 +1,51 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getWorstTestStepResult = exports.parseEnvelope = exports.version = exports.IdGenerator = exports.TimeConversion = void 0; +var TimeConversion = __importStar(require("./TimeConversion.js")); +exports.TimeConversion = TimeConversion; +var IdGenerator = __importStar(require("./IdGenerator.js")); +exports.IdGenerator = IdGenerator; +var parseEnvelope_js_1 = require("./parseEnvelope.js"); +Object.defineProperty(exports, "parseEnvelope", { enumerable: true, get: function () { return parseEnvelope_js_1.parseEnvelope; } }); +var getWorstTestStepResult_js_1 = require("./getWorstTestStepResult.js"); +Object.defineProperty(exports, "getWorstTestStepResult", { enumerable: true, get: function () { return getWorstTestStepResult_js_1.getWorstTestStepResult; } }); +var version_js_1 = require("./version.js"); +Object.defineProperty(exports, "version", { enumerable: true, get: function () { return version_js_1.version; } }); +__exportStar(require("./messages.js"), exports); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/src/index.js.map b/node_modules/@cucumber/messages/dist/cjs/src/index.js.map new file mode 100644 index 00000000..d02ac367 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/src/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kEAAqD;AAQ5C,wCAAc;AAPvB,4DAA+C;AAOtB,kCAAW;AANpC,uDAAkD;AAMH,8FANtC,gCAAa,OAMsC;AAL5D,yEAAoE;AAKN,uGALrD,kDAAsB,OAKqD;AAJpF,2CAAsC;AAIA,wFAJ7B,oBAAO,OAI6B;AAF7C,gDAA6B"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/src/messages.d.ts b/node_modules/@cucumber/messages/dist/cjs/src/messages.d.ts new file mode 100644 index 00000000..2b6aeb5d --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/src/messages.d.ts @@ -0,0 +1,403 @@ +import 'reflect-metadata'; +export declare class Attachment { + body: string; + contentEncoding: AttachmentContentEncoding; + fileName?: string; + mediaType: string; + source?: Source; + testCaseStartedId?: string; + testStepId?: string; + url?: string; + testRunStartedId?: string; + testRunHookStartedId?: string; + timestamp?: Timestamp; +} +export declare class Duration { + seconds: number; + nanos: number; +} +export declare class Envelope { + attachment?: Attachment; + externalAttachment?: ExternalAttachment; + gherkinDocument?: GherkinDocument; + hook?: Hook; + meta?: Meta; + parameterType?: ParameterType; + parseError?: ParseError; + pickle?: Pickle; + suggestion?: Suggestion; + source?: Source; + stepDefinition?: StepDefinition; + testCase?: TestCase; + testCaseFinished?: TestCaseFinished; + testCaseStarted?: TestCaseStarted; + testRunFinished?: TestRunFinished; + testRunStarted?: TestRunStarted; + testStepFinished?: TestStepFinished; + testStepStarted?: TestStepStarted; + testRunHookStarted?: TestRunHookStarted; + testRunHookFinished?: TestRunHookFinished; + undefinedParameterType?: UndefinedParameterType; +} +export declare class Exception { + type: string; + message?: string; + stackTrace?: string; +} +export declare class ExternalAttachment { + url: string; + mediaType: string; + testCaseStartedId?: string; + testStepId?: string; + testRunHookStartedId?: string; + timestamp?: Timestamp; +} +export declare class GherkinDocument { + uri?: string; + feature?: Feature; + comments: readonly Comment[]; +} +export declare class Background { + location: Location; + keyword: string; + name: string; + description: string; + steps: readonly Step[]; + id: string; +} +export declare class Comment { + location: Location; + text: string; +} +export declare class DataTable { + location: Location; + rows: readonly TableRow[]; +} +export declare class DocString { + location: Location; + mediaType?: string; + content: string; + delimiter: string; +} +export declare class Examples { + location: Location; + tags: readonly Tag[]; + keyword: string; + name: string; + description: string; + tableHeader?: TableRow; + tableBody: readonly TableRow[]; + id: string; +} +export declare class Feature { + location: Location; + tags: readonly Tag[]; + language: string; + keyword: string; + name: string; + description: string; + children: readonly FeatureChild[]; +} +export declare class FeatureChild { + rule?: Rule; + background?: Background; + scenario?: Scenario; +} +export declare class Rule { + location: Location; + tags: readonly Tag[]; + keyword: string; + name: string; + description: string; + children: readonly RuleChild[]; + id: string; +} +export declare class RuleChild { + background?: Background; + scenario?: Scenario; +} +export declare class Scenario { + location: Location; + tags: readonly Tag[]; + keyword: string; + name: string; + description: string; + steps: readonly Step[]; + examples: readonly Examples[]; + id: string; +} +export declare class Step { + location: Location; + keyword: string; + keywordType?: StepKeywordType; + text: string; + docString?: DocString; + dataTable?: DataTable; + id: string; +} +export declare class TableCell { + location: Location; + value: string; +} +export declare class TableRow { + location: Location; + cells: readonly TableCell[]; + id: string; +} +export declare class Tag { + location: Location; + name: string; + id: string; +} +export declare class Hook { + id: string; + name?: string; + sourceReference: SourceReference; + tagExpression?: string; + type?: HookType; +} +export declare class Location { + line: number; + column?: number; +} +export declare class Meta { + protocolVersion: string; + implementation: Product; + runtime: Product; + os: Product; + cpu: Product; + ci?: Ci; +} +export declare class Ci { + name: string; + url?: string; + buildNumber?: string; + git?: Git; +} +export declare class Git { + remote: string; + revision: string; + branch?: string; + tag?: string; +} +export declare class Product { + name: string; + version?: string; +} +export declare class ParameterType { + name: string; + regularExpressions: readonly string[]; + preferForRegularExpressionMatch: boolean; + useForSnippets: boolean; + id: string; + sourceReference?: SourceReference; +} +export declare class ParseError { + source: SourceReference; + message: string; +} +export declare class Pickle { + id: string; + uri: string; + location?: Location; + name: string; + language: string; + steps: readonly PickleStep[]; + tags: readonly PickleTag[]; + astNodeIds: readonly string[]; +} +export declare class PickleDocString { + mediaType?: string; + content: string; +} +export declare class PickleStep { + argument?: PickleStepArgument; + astNodeIds: readonly string[]; + id: string; + type?: PickleStepType; + text: string; +} +export declare class PickleStepArgument { + docString?: PickleDocString; + dataTable?: PickleTable; +} +export declare class PickleTable { + rows: readonly PickleTableRow[]; +} +export declare class PickleTableCell { + value: string; +} +export declare class PickleTableRow { + cells: readonly PickleTableCell[]; +} +export declare class PickleTag { + name: string; + astNodeId: string; +} +export declare class Source { + uri: string; + data: string; + mediaType: SourceMediaType; +} +export declare class SourceReference { + uri?: string; + javaMethod?: JavaMethod; + javaStackTraceElement?: JavaStackTraceElement; + location?: Location; +} +export declare class JavaMethod { + className: string; + methodName: string; + methodParameterTypes: readonly string[]; +} +export declare class JavaStackTraceElement { + className: string; + fileName: string; + methodName: string; +} +export declare class StepDefinition { + id: string; + pattern: StepDefinitionPattern; + sourceReference: SourceReference; +} +export declare class StepDefinitionPattern { + source: string; + type: StepDefinitionPatternType; +} +export declare class Suggestion { + id: string; + pickleStepId: string; + snippets: readonly Snippet[]; +} +export declare class Snippet { + language: string; + code: string; +} +export declare class TestCase { + id: string; + pickleId: string; + testSteps: readonly TestStep[]; + testRunStartedId?: string; +} +export declare class Group { + children?: readonly Group[]; + start?: number; + value?: string; +} +export declare class StepMatchArgument { + group: Group; + parameterTypeName?: string; +} +export declare class StepMatchArgumentsList { + stepMatchArguments: readonly StepMatchArgument[]; +} +export declare class TestStep { + hookId?: string; + id: string; + pickleStepId?: string; + stepDefinitionIds?: readonly string[]; + stepMatchArgumentsLists?: readonly StepMatchArgumentsList[]; +} +export declare class TestCaseFinished { + testCaseStartedId: string; + timestamp: Timestamp; + willBeRetried: boolean; +} +export declare class TestCaseStarted { + attempt: number; + id: string; + testCaseId: string; + workerId?: string; + timestamp: Timestamp; +} +export declare class TestRunFinished { + message?: string; + success: boolean; + timestamp: Timestamp; + exception?: Exception; + testRunStartedId?: string; +} +export declare class TestRunHookFinished { + testRunHookStartedId: string; + result: TestStepResult; + timestamp: Timestamp; +} +export declare class TestRunHookStarted { + id: string; + testRunStartedId: string; + hookId: string; + workerId?: string; + timestamp: Timestamp; +} +export declare class TestRunStarted { + timestamp: Timestamp; + id?: string; +} +export declare class TestStepFinished { + testCaseStartedId: string; + testStepId: string; + testStepResult: TestStepResult; + timestamp: Timestamp; +} +export declare class TestStepResult { + duration: Duration; + message?: string; + status: TestStepResultStatus; + exception?: Exception; +} +export declare class TestStepStarted { + testCaseStartedId: string; + testStepId: string; + timestamp: Timestamp; +} +export declare class Timestamp { + seconds: number; + nanos: number; +} +export declare class UndefinedParameterType { + expression: string; + name: string; +} +export declare enum AttachmentContentEncoding { + IDENTITY = "IDENTITY", + BASE64 = "BASE64" +} +export declare enum HookType { + BEFORE_TEST_RUN = "BEFORE_TEST_RUN", + AFTER_TEST_RUN = "AFTER_TEST_RUN", + BEFORE_TEST_CASE = "BEFORE_TEST_CASE", + AFTER_TEST_CASE = "AFTER_TEST_CASE", + BEFORE_TEST_STEP = "BEFORE_TEST_STEP", + AFTER_TEST_STEP = "AFTER_TEST_STEP" +} +export declare enum PickleStepType { + UNKNOWN = "Unknown", + CONTEXT = "Context", + ACTION = "Action", + OUTCOME = "Outcome" +} +export declare enum SourceMediaType { + TEXT_X_CUCUMBER_GHERKIN_PLAIN = "text/x.cucumber.gherkin+plain", + TEXT_X_CUCUMBER_GHERKIN_MARKDOWN = "text/x.cucumber.gherkin+markdown" +} +export declare enum StepDefinitionPatternType { + CUCUMBER_EXPRESSION = "CUCUMBER_EXPRESSION", + REGULAR_EXPRESSION = "REGULAR_EXPRESSION" +} +export declare enum StepKeywordType { + UNKNOWN = "Unknown", + CONTEXT = "Context", + ACTION = "Action", + OUTCOME = "Outcome", + CONJUNCTION = "Conjunction" +} +export declare enum TestStepResultStatus { + UNKNOWN = "UNKNOWN", + PASSED = "PASSED", + SKIPPED = "SKIPPED", + PENDING = "PENDING", + UNDEFINED = "UNDEFINED", + AMBIGUOUS = "AMBIGUOUS", + FAILED = "FAILED" +} +//# sourceMappingURL=messages.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/src/messages.d.ts.map b/node_modules/@cucumber/messages/dist/cjs/src/messages.d.ts.map new file mode 100644 index 00000000..f9a7c017 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/src/messages.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/messages.ts"],"names":[],"mappings":"AACA,OAAO,kBAAkB,CAAA;AAEzB,qBAAa,UAAU;IAErB,IAAI,EAAE,MAAM,CAAK;IAEjB,eAAe,EAAE,yBAAyB,CAAqC;IAE/E,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB,SAAS,EAAE,MAAM,CAAK;IAGtB,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAE1B,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB,GAAG,CAAC,EAAE,MAAM,CAAA;IAEZ,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAEzB,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAG7B,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB;AAED,qBAAa,QAAQ;IAEnB,OAAO,EAAE,MAAM,CAAI;IAEnB,KAAK,EAAE,MAAM,CAAI;CAClB;AAED,qBAAa,QAAQ;IAGnB,UAAU,CAAC,EAAE,UAAU,CAAA;IAGvB,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;IAGvC,eAAe,CAAC,EAAE,eAAe,CAAA;IAGjC,IAAI,CAAC,EAAE,IAAI,CAAA;IAGX,IAAI,CAAC,EAAE,IAAI,CAAA;IAGX,aAAa,CAAC,EAAE,aAAa,CAAA;IAG7B,UAAU,CAAC,EAAE,UAAU,CAAA;IAGvB,MAAM,CAAC,EAAE,MAAM,CAAA;IAGf,UAAU,CAAC,EAAE,UAAU,CAAA;IAGvB,MAAM,CAAC,EAAE,MAAM,CAAA;IAGf,cAAc,CAAC,EAAE,cAAc,CAAA;IAG/B,QAAQ,CAAC,EAAE,QAAQ,CAAA;IAGnB,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IAGnC,eAAe,CAAC,EAAE,eAAe,CAAA;IAGjC,eAAe,CAAC,EAAE,eAAe,CAAA;IAGjC,cAAc,CAAC,EAAE,cAAc,CAAA;IAG/B,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IAGnC,eAAe,CAAC,EAAE,eAAe,CAAA;IAGjC,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;IAGvC,mBAAmB,CAAC,EAAE,mBAAmB,CAAA;IAGzC,sBAAsB,CAAC,EAAE,sBAAsB,CAAA;CAChD;AAED,qBAAa,SAAS;IAEpB,IAAI,EAAE,MAAM,CAAK;IAEjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,qBAAa,kBAAkB;IAE7B,GAAG,EAAE,MAAM,CAAK;IAEhB,SAAS,EAAE,MAAM,CAAK;IAEtB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAE1B,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAG7B,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB;AAED,qBAAa,eAAe;IAE1B,GAAG,CAAC,EAAE,MAAM,CAAA;IAGZ,OAAO,CAAC,EAAE,OAAO,CAAA;IAGjB,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAK;CAClC;AAED,qBAAa,UAAU;IAGrB,QAAQ,EAAE,QAAQ,CAAiB;IAEnC,OAAO,EAAE,MAAM,CAAK;IAEpB,IAAI,EAAE,MAAM,CAAK;IAEjB,WAAW,EAAE,MAAM,CAAK;IAGxB,KAAK,EAAE,SAAS,IAAI,EAAE,CAAK;IAE3B,EAAE,EAAE,MAAM,CAAK;CAChB;AAED,qBAAa,OAAO;IAGlB,QAAQ,EAAE,QAAQ,CAAiB;IAEnC,IAAI,EAAE,MAAM,CAAK;CAClB;AAED,qBAAa,SAAS;IAGpB,QAAQ,EAAE,QAAQ,CAAiB;IAGnC,IAAI,EAAE,SAAS,QAAQ,EAAE,CAAK;CAC/B;AAED,qBAAa,SAAS;IAGpB,QAAQ,EAAE,QAAQ,CAAiB;IAEnC,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB,OAAO,EAAE,MAAM,CAAK;IAEpB,SAAS,EAAE,MAAM,CAAK;CACvB;AAED,qBAAa,QAAQ;IAGnB,QAAQ,EAAE,QAAQ,CAAiB;IAGnC,IAAI,EAAE,SAAS,GAAG,EAAE,CAAK;IAEzB,OAAO,EAAE,MAAM,CAAK;IAEpB,IAAI,EAAE,MAAM,CAAK;IAEjB,WAAW,EAAE,MAAM,CAAK;IAGxB,WAAW,CAAC,EAAE,QAAQ,CAAA;IAGtB,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAK;IAEnC,EAAE,EAAE,MAAM,CAAK;CAChB;AAED,qBAAa,OAAO;IAGlB,QAAQ,EAAE,QAAQ,CAAiB;IAGnC,IAAI,EAAE,SAAS,GAAG,EAAE,CAAK;IAEzB,QAAQ,EAAE,MAAM,CAAK;IAErB,OAAO,EAAE,MAAM,CAAK;IAEpB,IAAI,EAAE,MAAM,CAAK;IAEjB,WAAW,EAAE,MAAM,CAAK;IAGxB,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAK;CACvC;AAED,qBAAa,YAAY;IAGvB,IAAI,CAAC,EAAE,IAAI,CAAA;IAGX,UAAU,CAAC,EAAE,UAAU,CAAA;IAGvB,QAAQ,CAAC,EAAE,QAAQ,CAAA;CACpB;AAED,qBAAa,IAAI;IAGf,QAAQ,EAAE,QAAQ,CAAiB;IAGnC,IAAI,EAAE,SAAS,GAAG,EAAE,CAAK;IAEzB,OAAO,EAAE,MAAM,CAAK;IAEpB,IAAI,EAAE,MAAM,CAAK;IAEjB,WAAW,EAAE,MAAM,CAAK;IAGxB,QAAQ,EAAE,SAAS,SAAS,EAAE,CAAK;IAEnC,EAAE,EAAE,MAAM,CAAK;CAChB;AAED,qBAAa,SAAS;IAGpB,UAAU,CAAC,EAAE,UAAU,CAAA;IAGvB,QAAQ,CAAC,EAAE,QAAQ,CAAA;CACpB;AAED,qBAAa,QAAQ;IAGnB,QAAQ,EAAE,QAAQ,CAAiB;IAGnC,IAAI,EAAE,SAAS,GAAG,EAAE,CAAK;IAEzB,OAAO,EAAE,MAAM,CAAK;IAEpB,IAAI,EAAE,MAAM,CAAK;IAEjB,WAAW,EAAE,MAAM,CAAK;IAGxB,KAAK,EAAE,SAAS,IAAI,EAAE,CAAK;IAG3B,QAAQ,EAAE,SAAS,QAAQ,EAAE,CAAK;IAElC,EAAE,EAAE,MAAM,CAAK;CAChB;AAED,qBAAa,IAAI;IAGf,QAAQ,EAAE,QAAQ,CAAiB;IAEnC,OAAO,EAAE,MAAM,CAAK;IAEpB,WAAW,CAAC,EAAE,eAAe,CAAA;IAE7B,IAAI,EAAE,MAAM,CAAK;IAGjB,SAAS,CAAC,EAAE,SAAS,CAAA;IAGrB,SAAS,CAAC,EAAE,SAAS,CAAA;IAErB,EAAE,EAAE,MAAM,CAAK;CAChB;AAED,qBAAa,SAAS;IAGpB,QAAQ,EAAE,QAAQ,CAAiB;IAEnC,KAAK,EAAE,MAAM,CAAK;CACnB;AAED,qBAAa,QAAQ;IAGnB,QAAQ,EAAE,QAAQ,CAAiB;IAGnC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAK;IAEhC,EAAE,EAAE,MAAM,CAAK;CAChB;AAED,qBAAa,GAAG;IAGd,QAAQ,EAAE,QAAQ,CAAiB;IAEnC,IAAI,EAAE,MAAM,CAAK;IAEjB,EAAE,EAAE,MAAM,CAAK;CAChB;AAED,qBAAa,IAAI;IAEf,EAAE,EAAE,MAAM,CAAK;IAEf,IAAI,CAAC,EAAE,MAAM,CAAA;IAGb,eAAe,EAAE,eAAe,CAAwB;IAExD,aAAa,CAAC,EAAE,MAAM,CAAA;IAEtB,IAAI,CAAC,EAAE,QAAQ,CAAA;CAChB;AAED,qBAAa,QAAQ;IAEnB,IAAI,EAAE,MAAM,CAAI;IAEhB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,qBAAa,IAAI;IAEf,eAAe,EAAE,MAAM,CAAK;IAG5B,cAAc,EAAE,OAAO,CAAgB;IAGvC,OAAO,EAAE,OAAO,CAAgB;IAGhC,EAAE,EAAE,OAAO,CAAgB;IAG3B,GAAG,EAAE,OAAO,CAAgB;IAG5B,EAAE,CAAC,EAAE,EAAE,CAAA;CACR;AAED,qBAAa,EAAE;IAEb,IAAI,EAAE,MAAM,CAAK;IAEjB,GAAG,CAAC,EAAE,MAAM,CAAA;IAEZ,WAAW,CAAC,EAAE,MAAM,CAAA;IAGpB,GAAG,CAAC,EAAE,GAAG,CAAA;CACV;AAED,qBAAa,GAAG;IAEd,MAAM,EAAE,MAAM,CAAK;IAEnB,QAAQ,EAAE,MAAM,CAAK;IAErB,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,qBAAa,OAAO;IAElB,IAAI,EAAE,MAAM,CAAK;IAEjB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,qBAAa,aAAa;IAExB,IAAI,EAAE,MAAM,CAAK;IAEjB,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAK;IAE1C,+BAA+B,EAAE,OAAO,CAAQ;IAEhD,cAAc,EAAE,OAAO,CAAQ;IAE/B,EAAE,EAAE,MAAM,CAAK;IAGf,eAAe,CAAC,EAAE,eAAe,CAAA;CAClC;AAED,qBAAa,UAAU;IAGrB,MAAM,EAAE,eAAe,CAAwB;IAE/C,OAAO,EAAE,MAAM,CAAK;CACrB;AAED,qBAAa,MAAM;IAEjB,EAAE,EAAE,MAAM,CAAK;IAEf,GAAG,EAAE,MAAM,CAAK;IAGhB,QAAQ,CAAC,EAAE,QAAQ,CAAA;IAEnB,IAAI,EAAE,MAAM,CAAK;IAEjB,QAAQ,EAAE,MAAM,CAAK;IAGrB,KAAK,EAAE,SAAS,UAAU,EAAE,CAAK;IAGjC,IAAI,EAAE,SAAS,SAAS,EAAE,CAAK;IAE/B,UAAU,EAAE,SAAS,MAAM,EAAE,CAAK;CACnC;AAED,qBAAa,eAAe;IAE1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB,OAAO,EAAE,MAAM,CAAK;CACrB;AAED,qBAAa,UAAU;IAGrB,QAAQ,CAAC,EAAE,kBAAkB,CAAA;IAE7B,UAAU,EAAE,SAAS,MAAM,EAAE,CAAK;IAElC,EAAE,EAAE,MAAM,CAAK;IAEf,IAAI,CAAC,EAAE,cAAc,CAAA;IAErB,IAAI,EAAE,MAAM,CAAK;CAClB;AAED,qBAAa,kBAAkB;IAG7B,SAAS,CAAC,EAAE,eAAe,CAAA;IAG3B,SAAS,CAAC,EAAE,WAAW,CAAA;CACxB;AAED,qBAAa,WAAW;IAGtB,IAAI,EAAE,SAAS,cAAc,EAAE,CAAK;CACrC;AAED,qBAAa,eAAe;IAE1B,KAAK,EAAE,MAAM,CAAK;CACnB;AAED,qBAAa,cAAc;IAGzB,KAAK,EAAE,SAAS,eAAe,EAAE,CAAK;CACvC;AAED,qBAAa,SAAS;IAEpB,IAAI,EAAE,MAAM,CAAK;IAEjB,SAAS,EAAE,MAAM,CAAK;CACvB;AAED,qBAAa,MAAM;IAEjB,GAAG,EAAE,MAAM,CAAK;IAEhB,IAAI,EAAE,MAAM,CAAK;IAEjB,SAAS,EAAE,eAAe,CAAgD;CAC3E;AAED,qBAAa,eAAe;IAE1B,GAAG,CAAC,EAAE,MAAM,CAAA;IAGZ,UAAU,CAAC,EAAE,UAAU,CAAA;IAGvB,qBAAqB,CAAC,EAAE,qBAAqB,CAAA;IAG7C,QAAQ,CAAC,EAAE,QAAQ,CAAA;CACpB;AAED,qBAAa,UAAU;IAErB,SAAS,EAAE,MAAM,CAAK;IAEtB,UAAU,EAAE,MAAM,CAAK;IAEvB,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAK;CAC7C;AAED,qBAAa,qBAAqB;IAEhC,SAAS,EAAE,MAAM,CAAK;IAEtB,QAAQ,EAAE,MAAM,CAAK;IAErB,UAAU,EAAE,MAAM,CAAK;CACxB;AAED,qBAAa,cAAc;IAEzB,EAAE,EAAE,MAAM,CAAK;IAGf,OAAO,EAAE,qBAAqB,CAA8B;IAG5D,eAAe,EAAE,eAAe,CAAwB;CACzD;AAED,qBAAa,qBAAqB;IAEhC,MAAM,EAAE,MAAM,CAAK;IAEnB,IAAI,EAAE,yBAAyB,CAAgD;CAChF;AAED,qBAAa,UAAU;IAErB,EAAE,EAAE,MAAM,CAAK;IAEf,YAAY,EAAE,MAAM,CAAK;IAGzB,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAK;CAClC;AAED,qBAAa,OAAO;IAElB,QAAQ,EAAE,MAAM,CAAK;IAErB,IAAI,EAAE,MAAM,CAAK;CAClB;AAED,qBAAa,QAAQ;IAEnB,EAAE,EAAE,MAAM,CAAK;IAEf,QAAQ,EAAE,MAAM,CAAK;IAGrB,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAK;IAEnC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,qBAAa,KAAK;IAGhB,QAAQ,CAAC,EAAE,SAAS,KAAK,EAAE,CAAA;IAE3B,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,qBAAa,iBAAiB;IAG5B,KAAK,EAAE,KAAK,CAAc;IAE1B,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,qBAAa,sBAAsB;IAGjC,kBAAkB,EAAE,SAAS,iBAAiB,EAAE,CAAK;CACtD;AAED,qBAAa,QAAQ;IAEnB,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,EAAE,EAAE,MAAM,CAAK;IAEf,YAAY,CAAC,EAAE,MAAM,CAAA;IAErB,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAGrC,uBAAuB,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAA;CAC5D;AAED,qBAAa,gBAAgB;IAE3B,iBAAiB,EAAE,MAAM,CAAK;IAG9B,SAAS,EAAE,SAAS,CAAkB;IAEtC,aAAa,EAAE,OAAO,CAAQ;CAC/B;AAED,qBAAa,eAAe;IAE1B,OAAO,EAAE,MAAM,CAAI;IAEnB,EAAE,EAAE,MAAM,CAAK;IAEf,UAAU,EAAE,MAAM,CAAK;IAEvB,QAAQ,CAAC,EAAE,MAAM,CAAA;IAGjB,SAAS,EAAE,SAAS,CAAkB;CACvC;AAED,qBAAa,eAAe;IAE1B,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB,OAAO,EAAE,OAAO,CAAQ;IAGxB,SAAS,EAAE,SAAS,CAAkB;IAGtC,SAAS,CAAC,EAAE,SAAS,CAAA;IAErB,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,qBAAa,mBAAmB;IAE9B,oBAAoB,EAAE,MAAM,CAAK;IAGjC,MAAM,EAAE,cAAc,CAAuB;IAG7C,SAAS,EAAE,SAAS,CAAkB;CACvC;AAED,qBAAa,kBAAkB;IAE7B,EAAE,EAAE,MAAM,CAAK;IAEf,gBAAgB,EAAE,MAAM,CAAK;IAE7B,MAAM,EAAE,MAAM,CAAK;IAEnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IAGjB,SAAS,EAAE,SAAS,CAAkB;CACvC;AAED,qBAAa,cAAc;IAGzB,SAAS,EAAE,SAAS,CAAkB;IAEtC,EAAE,CAAC,EAAE,MAAM,CAAA;CACZ;AAED,qBAAa,gBAAgB;IAE3B,iBAAiB,EAAE,MAAM,CAAK;IAE9B,UAAU,EAAE,MAAM,CAAK;IAGvB,cAAc,EAAE,cAAc,CAAuB;IAGrD,SAAS,EAAE,SAAS,CAAkB;CACvC;AAED,qBAAa,cAAc;IAGzB,QAAQ,EAAE,QAAQ,CAAiB;IAEnC,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB,MAAM,EAAE,oBAAoB,CAA+B;IAG3D,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB;AAED,qBAAa,eAAe;IAE1B,iBAAiB,EAAE,MAAM,CAAK;IAE9B,UAAU,EAAE,MAAM,CAAK;IAGvB,SAAS,EAAE,SAAS,CAAkB;CACvC;AAED,qBAAa,SAAS;IAEpB,OAAO,EAAE,MAAM,CAAI;IAEnB,KAAK,EAAE,MAAM,CAAI;CAClB;AAED,qBAAa,sBAAsB;IAEjC,UAAU,EAAE,MAAM,CAAK;IAEvB,IAAI,EAAE,MAAM,CAAK;CAClB;AAED,oBAAY,yBAAyB;IACnC,QAAQ,aAAa;IACrB,MAAM,WAAW;CAClB;AAED,oBAAY,QAAQ;IAClB,eAAe,oBAAoB;IACnC,cAAc,mBAAmB;IACjC,gBAAgB,qBAAqB;IACrC,eAAe,oBAAoB;IACnC,gBAAgB,qBAAqB;IACrC,eAAe,oBAAoB;CACpC;AAED,oBAAY,cAAc;IACxB,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,MAAM,WAAW;IACjB,OAAO,YAAY;CACpB;AAED,oBAAY,eAAe;IACzB,6BAA6B,kCAAkC;IAC/D,gCAAgC,qCAAqC;CACtE;AAED,oBAAY,yBAAyB;IACnC,mBAAmB,wBAAwB;IAC3C,kBAAkB,uBAAuB;CAC1C;AAED,oBAAY,eAAe;IACzB,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,WAAW,gBAAgB;CAC5B;AAED,oBAAY,oBAAoB;IAC9B,OAAO,YAAY;IACnB,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,SAAS,cAAc;IACvB,SAAS,cAAc;IACvB,MAAM,WAAW;CAClB"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/src/messages.js b/node_modules/@cucumber/messages/dist/cjs/src/messages.js new file mode 100644 index 00000000..8743c5f6 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/src/messages.js @@ -0,0 +1,872 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestCaseFinished = exports.TestStep = exports.StepMatchArgumentsList = exports.StepMatchArgument = exports.Group = exports.TestCase = exports.Snippet = exports.Suggestion = exports.StepDefinitionPattern = exports.StepDefinition = exports.JavaStackTraceElement = exports.JavaMethod = exports.SourceReference = exports.Source = exports.PickleTag = exports.PickleTableRow = exports.PickleTableCell = exports.PickleTable = exports.PickleStepArgument = exports.PickleStep = exports.PickleDocString = exports.Pickle = exports.ParseError = exports.ParameterType = exports.Product = exports.Git = exports.Ci = exports.Meta = exports.Location = exports.Hook = exports.Tag = exports.TableRow = exports.TableCell = exports.Step = exports.Scenario = exports.RuleChild = exports.Rule = exports.FeatureChild = exports.Feature = exports.Examples = exports.DocString = exports.DataTable = exports.Comment = exports.Background = exports.GherkinDocument = exports.ExternalAttachment = exports.Exception = exports.Envelope = exports.Duration = exports.Attachment = void 0; +exports.TestStepResultStatus = exports.StepKeywordType = exports.StepDefinitionPatternType = exports.SourceMediaType = exports.PickleStepType = exports.HookType = exports.AttachmentContentEncoding = exports.UndefinedParameterType = exports.Timestamp = exports.TestStepStarted = exports.TestStepResult = exports.TestStepFinished = exports.TestRunStarted = exports.TestRunHookStarted = exports.TestRunHookFinished = exports.TestRunFinished = exports.TestCaseStarted = void 0; +var class_transformer_1 = require("class-transformer"); +require("reflect-metadata"); +var Attachment = /** @class */ (function () { + function Attachment() { + this.body = ''; + this.contentEncoding = AttachmentContentEncoding.IDENTITY; + this.mediaType = ''; + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Source; }) + ], Attachment.prototype, "source", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return Timestamp; }) + ], Attachment.prototype, "timestamp", void 0); + return Attachment; +}()); +exports.Attachment = Attachment; +var Duration = /** @class */ (function () { + function Duration() { + this.seconds = 0; + this.nanos = 0; + } + return Duration; +}()); +exports.Duration = Duration; +var Envelope = /** @class */ (function () { + function Envelope() { + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Attachment; }) + ], Envelope.prototype, "attachment", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return ExternalAttachment; }) + ], Envelope.prototype, "externalAttachment", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return GherkinDocument; }) + ], Envelope.prototype, "gherkinDocument", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return Hook; }) + ], Envelope.prototype, "hook", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return Meta; }) + ], Envelope.prototype, "meta", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return ParameterType; }) + ], Envelope.prototype, "parameterType", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return ParseError; }) + ], Envelope.prototype, "parseError", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return Pickle; }) + ], Envelope.prototype, "pickle", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return Suggestion; }) + ], Envelope.prototype, "suggestion", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return Source; }) + ], Envelope.prototype, "source", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return StepDefinition; }) + ], Envelope.prototype, "stepDefinition", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return TestCase; }) + ], Envelope.prototype, "testCase", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return TestCaseFinished; }) + ], Envelope.prototype, "testCaseFinished", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return TestCaseStarted; }) + ], Envelope.prototype, "testCaseStarted", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return TestRunFinished; }) + ], Envelope.prototype, "testRunFinished", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return TestRunStarted; }) + ], Envelope.prototype, "testRunStarted", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return TestStepFinished; }) + ], Envelope.prototype, "testStepFinished", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return TestStepStarted; }) + ], Envelope.prototype, "testStepStarted", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return TestRunHookStarted; }) + ], Envelope.prototype, "testRunHookStarted", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return TestRunHookFinished; }) + ], Envelope.prototype, "testRunHookFinished", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return UndefinedParameterType; }) + ], Envelope.prototype, "undefinedParameterType", void 0); + return Envelope; +}()); +exports.Envelope = Envelope; +var Exception = /** @class */ (function () { + function Exception() { + this.type = ''; + } + return Exception; +}()); +exports.Exception = Exception; +var ExternalAttachment = /** @class */ (function () { + function ExternalAttachment() { + this.url = ''; + this.mediaType = ''; + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Timestamp; }) + ], ExternalAttachment.prototype, "timestamp", void 0); + return ExternalAttachment; +}()); +exports.ExternalAttachment = ExternalAttachment; +var GherkinDocument = /** @class */ (function () { + function GherkinDocument() { + this.comments = []; + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Feature; }) + ], GherkinDocument.prototype, "feature", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return Comment; }) + ], GherkinDocument.prototype, "comments", void 0); + return GherkinDocument; +}()); +exports.GherkinDocument = GherkinDocument; +var Background = /** @class */ (function () { + function Background() { + this.location = new Location(); + this.keyword = ''; + this.name = ''; + this.description = ''; + this.steps = []; + this.id = ''; + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Location; }) + ], Background.prototype, "location", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return Step; }) + ], Background.prototype, "steps", void 0); + return Background; +}()); +exports.Background = Background; +var Comment = /** @class */ (function () { + function Comment() { + this.location = new Location(); + this.text = ''; + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Location; }) + ], Comment.prototype, "location", void 0); + return Comment; +}()); +exports.Comment = Comment; +var DataTable = /** @class */ (function () { + function DataTable() { + this.location = new Location(); + this.rows = []; + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Location; }) + ], DataTable.prototype, "location", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return TableRow; }) + ], DataTable.prototype, "rows", void 0); + return DataTable; +}()); +exports.DataTable = DataTable; +var DocString = /** @class */ (function () { + function DocString() { + this.location = new Location(); + this.content = ''; + this.delimiter = ''; + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Location; }) + ], DocString.prototype, "location", void 0); + return DocString; +}()); +exports.DocString = DocString; +var Examples = /** @class */ (function () { + function Examples() { + this.location = new Location(); + this.tags = []; + this.keyword = ''; + this.name = ''; + this.description = ''; + this.tableBody = []; + this.id = ''; + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Location; }) + ], Examples.prototype, "location", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return Tag; }) + ], Examples.prototype, "tags", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return TableRow; }) + ], Examples.prototype, "tableHeader", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return TableRow; }) + ], Examples.prototype, "tableBody", void 0); + return Examples; +}()); +exports.Examples = Examples; +var Feature = /** @class */ (function () { + function Feature() { + this.location = new Location(); + this.tags = []; + this.language = ''; + this.keyword = ''; + this.name = ''; + this.description = ''; + this.children = []; + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Location; }) + ], Feature.prototype, "location", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return Tag; }) + ], Feature.prototype, "tags", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return FeatureChild; }) + ], Feature.prototype, "children", void 0); + return Feature; +}()); +exports.Feature = Feature; +var FeatureChild = /** @class */ (function () { + function FeatureChild() { + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Rule; }) + ], FeatureChild.prototype, "rule", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return Background; }) + ], FeatureChild.prototype, "background", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return Scenario; }) + ], FeatureChild.prototype, "scenario", void 0); + return FeatureChild; +}()); +exports.FeatureChild = FeatureChild; +var Rule = /** @class */ (function () { + function Rule() { + this.location = new Location(); + this.tags = []; + this.keyword = ''; + this.name = ''; + this.description = ''; + this.children = []; + this.id = ''; + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Location; }) + ], Rule.prototype, "location", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return Tag; }) + ], Rule.prototype, "tags", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return RuleChild; }) + ], Rule.prototype, "children", void 0); + return Rule; +}()); +exports.Rule = Rule; +var RuleChild = /** @class */ (function () { + function RuleChild() { + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Background; }) + ], RuleChild.prototype, "background", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return Scenario; }) + ], RuleChild.prototype, "scenario", void 0); + return RuleChild; +}()); +exports.RuleChild = RuleChild; +var Scenario = /** @class */ (function () { + function Scenario() { + this.location = new Location(); + this.tags = []; + this.keyword = ''; + this.name = ''; + this.description = ''; + this.steps = []; + this.examples = []; + this.id = ''; + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Location; }) + ], Scenario.prototype, "location", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return Tag; }) + ], Scenario.prototype, "tags", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return Step; }) + ], Scenario.prototype, "steps", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return Examples; }) + ], Scenario.prototype, "examples", void 0); + return Scenario; +}()); +exports.Scenario = Scenario; +var Step = /** @class */ (function () { + function Step() { + this.location = new Location(); + this.keyword = ''; + this.text = ''; + this.id = ''; + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Location; }) + ], Step.prototype, "location", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return DocString; }) + ], Step.prototype, "docString", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return DataTable; }) + ], Step.prototype, "dataTable", void 0); + return Step; +}()); +exports.Step = Step; +var TableCell = /** @class */ (function () { + function TableCell() { + this.location = new Location(); + this.value = ''; + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Location; }) + ], TableCell.prototype, "location", void 0); + return TableCell; +}()); +exports.TableCell = TableCell; +var TableRow = /** @class */ (function () { + function TableRow() { + this.location = new Location(); + this.cells = []; + this.id = ''; + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Location; }) + ], TableRow.prototype, "location", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return TableCell; }) + ], TableRow.prototype, "cells", void 0); + return TableRow; +}()); +exports.TableRow = TableRow; +var Tag = /** @class */ (function () { + function Tag() { + this.location = new Location(); + this.name = ''; + this.id = ''; + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Location; }) + ], Tag.prototype, "location", void 0); + return Tag; +}()); +exports.Tag = Tag; +var Hook = /** @class */ (function () { + function Hook() { + this.id = ''; + this.sourceReference = new SourceReference(); + } + __decorate([ + (0, class_transformer_1.Type)(function () { return SourceReference; }) + ], Hook.prototype, "sourceReference", void 0); + return Hook; +}()); +exports.Hook = Hook; +var Location = /** @class */ (function () { + function Location() { + this.line = 0; + } + return Location; +}()); +exports.Location = Location; +var Meta = /** @class */ (function () { + function Meta() { + this.protocolVersion = ''; + this.implementation = new Product(); + this.runtime = new Product(); + this.os = new Product(); + this.cpu = new Product(); + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Product; }) + ], Meta.prototype, "implementation", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return Product; }) + ], Meta.prototype, "runtime", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return Product; }) + ], Meta.prototype, "os", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return Product; }) + ], Meta.prototype, "cpu", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return Ci; }) + ], Meta.prototype, "ci", void 0); + return Meta; +}()); +exports.Meta = Meta; +var Ci = /** @class */ (function () { + function Ci() { + this.name = ''; + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Git; }) + ], Ci.prototype, "git", void 0); + return Ci; +}()); +exports.Ci = Ci; +var Git = /** @class */ (function () { + function Git() { + this.remote = ''; + this.revision = ''; + } + return Git; +}()); +exports.Git = Git; +var Product = /** @class */ (function () { + function Product() { + this.name = ''; + } + return Product; +}()); +exports.Product = Product; +var ParameterType = /** @class */ (function () { + function ParameterType() { + this.name = ''; + this.regularExpressions = []; + this.preferForRegularExpressionMatch = false; + this.useForSnippets = false; + this.id = ''; + } + __decorate([ + (0, class_transformer_1.Type)(function () { return SourceReference; }) + ], ParameterType.prototype, "sourceReference", void 0); + return ParameterType; +}()); +exports.ParameterType = ParameterType; +var ParseError = /** @class */ (function () { + function ParseError() { + this.source = new SourceReference(); + this.message = ''; + } + __decorate([ + (0, class_transformer_1.Type)(function () { return SourceReference; }) + ], ParseError.prototype, "source", void 0); + return ParseError; +}()); +exports.ParseError = ParseError; +var Pickle = /** @class */ (function () { + function Pickle() { + this.id = ''; + this.uri = ''; + this.name = ''; + this.language = ''; + this.steps = []; + this.tags = []; + this.astNodeIds = []; + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Location; }) + ], Pickle.prototype, "location", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return PickleStep; }) + ], Pickle.prototype, "steps", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return PickleTag; }) + ], Pickle.prototype, "tags", void 0); + return Pickle; +}()); +exports.Pickle = Pickle; +var PickleDocString = /** @class */ (function () { + function PickleDocString() { + this.content = ''; + } + return PickleDocString; +}()); +exports.PickleDocString = PickleDocString; +var PickleStep = /** @class */ (function () { + function PickleStep() { + this.astNodeIds = []; + this.id = ''; + this.text = ''; + } + __decorate([ + (0, class_transformer_1.Type)(function () { return PickleStepArgument; }) + ], PickleStep.prototype, "argument", void 0); + return PickleStep; +}()); +exports.PickleStep = PickleStep; +var PickleStepArgument = /** @class */ (function () { + function PickleStepArgument() { + } + __decorate([ + (0, class_transformer_1.Type)(function () { return PickleDocString; }) + ], PickleStepArgument.prototype, "docString", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return PickleTable; }) + ], PickleStepArgument.prototype, "dataTable", void 0); + return PickleStepArgument; +}()); +exports.PickleStepArgument = PickleStepArgument; +var PickleTable = /** @class */ (function () { + function PickleTable() { + this.rows = []; + } + __decorate([ + (0, class_transformer_1.Type)(function () { return PickleTableRow; }) + ], PickleTable.prototype, "rows", void 0); + return PickleTable; +}()); +exports.PickleTable = PickleTable; +var PickleTableCell = /** @class */ (function () { + function PickleTableCell() { + this.value = ''; + } + return PickleTableCell; +}()); +exports.PickleTableCell = PickleTableCell; +var PickleTableRow = /** @class */ (function () { + function PickleTableRow() { + this.cells = []; + } + __decorate([ + (0, class_transformer_1.Type)(function () { return PickleTableCell; }) + ], PickleTableRow.prototype, "cells", void 0); + return PickleTableRow; +}()); +exports.PickleTableRow = PickleTableRow; +var PickleTag = /** @class */ (function () { + function PickleTag() { + this.name = ''; + this.astNodeId = ''; + } + return PickleTag; +}()); +exports.PickleTag = PickleTag; +var Source = /** @class */ (function () { + function Source() { + this.uri = ''; + this.data = ''; + this.mediaType = SourceMediaType.TEXT_X_CUCUMBER_GHERKIN_PLAIN; + } + return Source; +}()); +exports.Source = Source; +var SourceReference = /** @class */ (function () { + function SourceReference() { + } + __decorate([ + (0, class_transformer_1.Type)(function () { return JavaMethod; }) + ], SourceReference.prototype, "javaMethod", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return JavaStackTraceElement; }) + ], SourceReference.prototype, "javaStackTraceElement", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return Location; }) + ], SourceReference.prototype, "location", void 0); + return SourceReference; +}()); +exports.SourceReference = SourceReference; +var JavaMethod = /** @class */ (function () { + function JavaMethod() { + this.className = ''; + this.methodName = ''; + this.methodParameterTypes = []; + } + return JavaMethod; +}()); +exports.JavaMethod = JavaMethod; +var JavaStackTraceElement = /** @class */ (function () { + function JavaStackTraceElement() { + this.className = ''; + this.fileName = ''; + this.methodName = ''; + } + return JavaStackTraceElement; +}()); +exports.JavaStackTraceElement = JavaStackTraceElement; +var StepDefinition = /** @class */ (function () { + function StepDefinition() { + this.id = ''; + this.pattern = new StepDefinitionPattern(); + this.sourceReference = new SourceReference(); + } + __decorate([ + (0, class_transformer_1.Type)(function () { return StepDefinitionPattern; }) + ], StepDefinition.prototype, "pattern", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return SourceReference; }) + ], StepDefinition.prototype, "sourceReference", void 0); + return StepDefinition; +}()); +exports.StepDefinition = StepDefinition; +var StepDefinitionPattern = /** @class */ (function () { + function StepDefinitionPattern() { + this.source = ''; + this.type = StepDefinitionPatternType.CUCUMBER_EXPRESSION; + } + return StepDefinitionPattern; +}()); +exports.StepDefinitionPattern = StepDefinitionPattern; +var Suggestion = /** @class */ (function () { + function Suggestion() { + this.id = ''; + this.pickleStepId = ''; + this.snippets = []; + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Snippet; }) + ], Suggestion.prototype, "snippets", void 0); + return Suggestion; +}()); +exports.Suggestion = Suggestion; +var Snippet = /** @class */ (function () { + function Snippet() { + this.language = ''; + this.code = ''; + } + return Snippet; +}()); +exports.Snippet = Snippet; +var TestCase = /** @class */ (function () { + function TestCase() { + this.id = ''; + this.pickleId = ''; + this.testSteps = []; + } + __decorate([ + (0, class_transformer_1.Type)(function () { return TestStep; }) + ], TestCase.prototype, "testSteps", void 0); + return TestCase; +}()); +exports.TestCase = TestCase; +var Group = /** @class */ (function () { + function Group() { + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Group; }) + ], Group.prototype, "children", void 0); + return Group; +}()); +exports.Group = Group; +var StepMatchArgument = /** @class */ (function () { + function StepMatchArgument() { + this.group = new Group(); + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Group; }) + ], StepMatchArgument.prototype, "group", void 0); + return StepMatchArgument; +}()); +exports.StepMatchArgument = StepMatchArgument; +var StepMatchArgumentsList = /** @class */ (function () { + function StepMatchArgumentsList() { + this.stepMatchArguments = []; + } + __decorate([ + (0, class_transformer_1.Type)(function () { return StepMatchArgument; }) + ], StepMatchArgumentsList.prototype, "stepMatchArguments", void 0); + return StepMatchArgumentsList; +}()); +exports.StepMatchArgumentsList = StepMatchArgumentsList; +var TestStep = /** @class */ (function () { + function TestStep() { + this.id = ''; + } + __decorate([ + (0, class_transformer_1.Type)(function () { return StepMatchArgumentsList; }) + ], TestStep.prototype, "stepMatchArgumentsLists", void 0); + return TestStep; +}()); +exports.TestStep = TestStep; +var TestCaseFinished = /** @class */ (function () { + function TestCaseFinished() { + this.testCaseStartedId = ''; + this.timestamp = new Timestamp(); + this.willBeRetried = false; + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Timestamp; }) + ], TestCaseFinished.prototype, "timestamp", void 0); + return TestCaseFinished; +}()); +exports.TestCaseFinished = TestCaseFinished; +var TestCaseStarted = /** @class */ (function () { + function TestCaseStarted() { + this.attempt = 0; + this.id = ''; + this.testCaseId = ''; + this.timestamp = new Timestamp(); + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Timestamp; }) + ], TestCaseStarted.prototype, "timestamp", void 0); + return TestCaseStarted; +}()); +exports.TestCaseStarted = TestCaseStarted; +var TestRunFinished = /** @class */ (function () { + function TestRunFinished() { + this.success = false; + this.timestamp = new Timestamp(); + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Timestamp; }) + ], TestRunFinished.prototype, "timestamp", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return Exception; }) + ], TestRunFinished.prototype, "exception", void 0); + return TestRunFinished; +}()); +exports.TestRunFinished = TestRunFinished; +var TestRunHookFinished = /** @class */ (function () { + function TestRunHookFinished() { + this.testRunHookStartedId = ''; + this.result = new TestStepResult(); + this.timestamp = new Timestamp(); + } + __decorate([ + (0, class_transformer_1.Type)(function () { return TestStepResult; }) + ], TestRunHookFinished.prototype, "result", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return Timestamp; }) + ], TestRunHookFinished.prototype, "timestamp", void 0); + return TestRunHookFinished; +}()); +exports.TestRunHookFinished = TestRunHookFinished; +var TestRunHookStarted = /** @class */ (function () { + function TestRunHookStarted() { + this.id = ''; + this.testRunStartedId = ''; + this.hookId = ''; + this.timestamp = new Timestamp(); + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Timestamp; }) + ], TestRunHookStarted.prototype, "timestamp", void 0); + return TestRunHookStarted; +}()); +exports.TestRunHookStarted = TestRunHookStarted; +var TestRunStarted = /** @class */ (function () { + function TestRunStarted() { + this.timestamp = new Timestamp(); + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Timestamp; }) + ], TestRunStarted.prototype, "timestamp", void 0); + return TestRunStarted; +}()); +exports.TestRunStarted = TestRunStarted; +var TestStepFinished = /** @class */ (function () { + function TestStepFinished() { + this.testCaseStartedId = ''; + this.testStepId = ''; + this.testStepResult = new TestStepResult(); + this.timestamp = new Timestamp(); + } + __decorate([ + (0, class_transformer_1.Type)(function () { return TestStepResult; }) + ], TestStepFinished.prototype, "testStepResult", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return Timestamp; }) + ], TestStepFinished.prototype, "timestamp", void 0); + return TestStepFinished; +}()); +exports.TestStepFinished = TestStepFinished; +var TestStepResult = /** @class */ (function () { + function TestStepResult() { + this.duration = new Duration(); + this.status = TestStepResultStatus.UNKNOWN; + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Duration; }) + ], TestStepResult.prototype, "duration", void 0); + __decorate([ + (0, class_transformer_1.Type)(function () { return Exception; }) + ], TestStepResult.prototype, "exception", void 0); + return TestStepResult; +}()); +exports.TestStepResult = TestStepResult; +var TestStepStarted = /** @class */ (function () { + function TestStepStarted() { + this.testCaseStartedId = ''; + this.testStepId = ''; + this.timestamp = new Timestamp(); + } + __decorate([ + (0, class_transformer_1.Type)(function () { return Timestamp; }) + ], TestStepStarted.prototype, "timestamp", void 0); + return TestStepStarted; +}()); +exports.TestStepStarted = TestStepStarted; +var Timestamp = /** @class */ (function () { + function Timestamp() { + this.seconds = 0; + this.nanos = 0; + } + return Timestamp; +}()); +exports.Timestamp = Timestamp; +var UndefinedParameterType = /** @class */ (function () { + function UndefinedParameterType() { + this.expression = ''; + this.name = ''; + } + return UndefinedParameterType; +}()); +exports.UndefinedParameterType = UndefinedParameterType; +var AttachmentContentEncoding; +(function (AttachmentContentEncoding) { + AttachmentContentEncoding["IDENTITY"] = "IDENTITY"; + AttachmentContentEncoding["BASE64"] = "BASE64"; +})(AttachmentContentEncoding || (exports.AttachmentContentEncoding = AttachmentContentEncoding = {})); +var HookType; +(function (HookType) { + HookType["BEFORE_TEST_RUN"] = "BEFORE_TEST_RUN"; + HookType["AFTER_TEST_RUN"] = "AFTER_TEST_RUN"; + HookType["BEFORE_TEST_CASE"] = "BEFORE_TEST_CASE"; + HookType["AFTER_TEST_CASE"] = "AFTER_TEST_CASE"; + HookType["BEFORE_TEST_STEP"] = "BEFORE_TEST_STEP"; + HookType["AFTER_TEST_STEP"] = "AFTER_TEST_STEP"; +})(HookType || (exports.HookType = HookType = {})); +var PickleStepType; +(function (PickleStepType) { + PickleStepType["UNKNOWN"] = "Unknown"; + PickleStepType["CONTEXT"] = "Context"; + PickleStepType["ACTION"] = "Action"; + PickleStepType["OUTCOME"] = "Outcome"; +})(PickleStepType || (exports.PickleStepType = PickleStepType = {})); +var SourceMediaType; +(function (SourceMediaType) { + SourceMediaType["TEXT_X_CUCUMBER_GHERKIN_PLAIN"] = "text/x.cucumber.gherkin+plain"; + SourceMediaType["TEXT_X_CUCUMBER_GHERKIN_MARKDOWN"] = "text/x.cucumber.gherkin+markdown"; +})(SourceMediaType || (exports.SourceMediaType = SourceMediaType = {})); +var StepDefinitionPatternType; +(function (StepDefinitionPatternType) { + StepDefinitionPatternType["CUCUMBER_EXPRESSION"] = "CUCUMBER_EXPRESSION"; + StepDefinitionPatternType["REGULAR_EXPRESSION"] = "REGULAR_EXPRESSION"; +})(StepDefinitionPatternType || (exports.StepDefinitionPatternType = StepDefinitionPatternType = {})); +var StepKeywordType; +(function (StepKeywordType) { + StepKeywordType["UNKNOWN"] = "Unknown"; + StepKeywordType["CONTEXT"] = "Context"; + StepKeywordType["ACTION"] = "Action"; + StepKeywordType["OUTCOME"] = "Outcome"; + StepKeywordType["CONJUNCTION"] = "Conjunction"; +})(StepKeywordType || (exports.StepKeywordType = StepKeywordType = {})); +var TestStepResultStatus; +(function (TestStepResultStatus) { + TestStepResultStatus["UNKNOWN"] = "UNKNOWN"; + TestStepResultStatus["PASSED"] = "PASSED"; + TestStepResultStatus["SKIPPED"] = "SKIPPED"; + TestStepResultStatus["PENDING"] = "PENDING"; + TestStepResultStatus["UNDEFINED"] = "UNDEFINED"; + TestStepResultStatus["AMBIGUOUS"] = "AMBIGUOUS"; + TestStepResultStatus["FAILED"] = "FAILED"; +})(TestStepResultStatus || (exports.TestStepResultStatus = TestStepResultStatus = {})); +//# sourceMappingURL=messages.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/src/messages.js.map b/node_modules/@cucumber/messages/dist/cjs/src/messages.js.map new file mode 100644 index 00000000..ecae330c --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/src/messages.js.map @@ -0,0 +1 @@ +{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/messages.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/src/parseEnvelope.d.ts b/node_modules/@cucumber/messages/dist/cjs/src/parseEnvelope.d.ts new file mode 100644 index 00000000..da998944 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/src/parseEnvelope.d.ts @@ -0,0 +1,8 @@ +import { Envelope } from './messages.js'; +/** + * Parses JSON into an Envelope object. The difference from JSON.parse + * is that the resulting objects will have default values (defined in the JSON Schema) + * for properties that are absent from the JSON. + */ +export declare function parseEnvelope(json: string): Envelope; +//# sourceMappingURL=parseEnvelope.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/src/parseEnvelope.d.ts.map b/node_modules/@cucumber/messages/dist/cjs/src/parseEnvelope.d.ts.map new file mode 100644 index 00000000..f73de815 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/src/parseEnvelope.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"parseEnvelope.d.ts","sourceRoot":"","sources":["../../../src/parseEnvelope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAGxC;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAGpD"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/src/parseEnvelope.js b/node_modules/@cucumber/messages/dist/cjs/src/parseEnvelope.js new file mode 100644 index 00000000..48774383 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/src/parseEnvelope.js @@ -0,0 +1,15 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseEnvelope = parseEnvelope; +var messages_js_1 = require("./messages.js"); +var class_transformer_1 = require("class-transformer"); +/** + * Parses JSON into an Envelope object. The difference from JSON.parse + * is that the resulting objects will have default values (defined in the JSON Schema) + * for properties that are absent from the JSON. + */ +function parseEnvelope(json) { + var plain = JSON.parse(json); + return (0, class_transformer_1.plainToClass)(messages_js_1.Envelope, plain); +} +//# sourceMappingURL=parseEnvelope.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/src/parseEnvelope.js.map b/node_modules/@cucumber/messages/dist/cjs/src/parseEnvelope.js.map new file mode 100644 index 00000000..e191647a --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/src/parseEnvelope.js.map @@ -0,0 +1 @@ +{"version":3,"file":"parseEnvelope.js","sourceRoot":"","sources":["../../../src/parseEnvelope.ts"],"names":[],"mappings":";;AAQA,sCAGC;AAXD,6CAAwC;AACxC,uDAAgD;AAEhD;;;;GAIG;AACH,SAAgB,aAAa,CAAC,IAAY;IACxC,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC9B,OAAO,IAAA,gCAAY,EAAC,sBAAQ,EAAE,KAAK,CAAC,CAAA;AACtC,CAAC"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/src/version.d.ts b/node_modules/@cucumber/messages/dist/cjs/src/version.d.ts new file mode 100644 index 00000000..72cb814b --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/src/version.d.ts @@ -0,0 +1,2 @@ +export declare const version = "32.2.0"; +//# sourceMappingURL=version.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/src/version.d.ts.map b/node_modules/@cucumber/messages/dist/cjs/src/version.d.ts.map new file mode 100644 index 00000000..042c9575 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/src/version.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,OAAO,WAAW,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/src/version.js b/node_modules/@cucumber/messages/dist/cjs/src/version.js new file mode 100644 index 00000000..523e74d0 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/src/version.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = void 0; +// This file is automatically generated using npm scripts +exports.version = '32.2.0'; +//# sourceMappingURL=version.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/src/version.js.map b/node_modules/@cucumber/messages/dist/cjs/src/version.js.map new file mode 100644 index 00000000..09860f31 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/src/version.js.map @@ -0,0 +1 @@ +{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":";;;AAAA,yDAAyD;AAC5C,QAAA,OAAO,GAAG,QAAQ,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/test/IdGeneratorTest.d.ts b/node_modules/@cucumber/messages/dist/cjs/test/IdGeneratorTest.d.ts new file mode 100644 index 00000000..d1488fba --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/test/IdGeneratorTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=IdGeneratorTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/test/IdGeneratorTest.d.ts.map b/node_modules/@cucumber/messages/dist/cjs/test/IdGeneratorTest.d.ts.map new file mode 100644 index 00000000..93f290bf --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/test/IdGeneratorTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"IdGeneratorTest.d.ts","sourceRoot":"","sources":["../../../test/IdGeneratorTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/test/IdGeneratorTest.js b/node_modules/@cucumber/messages/dist/cjs/test/IdGeneratorTest.js new file mode 100644 index 00000000..bfe8e4e4 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/test/IdGeneratorTest.js @@ -0,0 +1,21 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var node_assert_1 = __importDefault(require("node:assert")); +var index_js_1 = require("../src/index.js"); +describe('IdGenerator', function () { + it('generates uuids', function () { + var generator = index_js_1.IdGenerator.uuid(); + var result = generator(); + node_assert_1.default.equal(result.length, 36); + }); + it('increments ids', function () { + var generator = index_js_1.IdGenerator.incrementing(); + node_assert_1.default.equal(generator(), '0'); + node_assert_1.default.equal(generator(), '1'); + node_assert_1.default.equal(generator(), '2'); + }); +}); +//# sourceMappingURL=IdGeneratorTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/test/IdGeneratorTest.js.map b/node_modules/@cucumber/messages/dist/cjs/test/IdGeneratorTest.js.map new file mode 100644 index 00000000..4b164b88 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/test/IdGeneratorTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IdGeneratorTest.js","sourceRoot":"","sources":["../../../test/IdGeneratorTest.ts"],"names":[],"mappings":";;;;;AAAA,4DAAgC;AAChC,4CAA2C;AAE3C,QAAQ,CAAC,aAAa,EAAE;IACtB,EAAE,CAAC,iBAAiB,EAAE;QACpB,IAAM,SAAS,GAAG,sBAAW,CAAC,IAAI,EAAE,CAAA;QACpC,IAAM,MAAM,GAAG,SAAS,EAAE,CAAA;QAC1B,qBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gBAAgB,EAAE;QACnB,IAAM,SAAS,GAAG,sBAAW,CAAC,YAAY,EAAE,CAAA;QAC5C,qBAAM,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,GAAG,CAAC,CAAA;QAC9B,qBAAM,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,GAAG,CAAC,CAAA;QAC9B,qBAAM,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,GAAG,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/test/TimeConversionTest.d.ts b/node_modules/@cucumber/messages/dist/cjs/test/TimeConversionTest.d.ts new file mode 100644 index 00000000..0ecf182b --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/test/TimeConversionTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=TimeConversionTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/test/TimeConversionTest.d.ts.map b/node_modules/@cucumber/messages/dist/cjs/test/TimeConversionTest.d.ts.map new file mode 100644 index 00000000..af1bc3b9 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/test/TimeConversionTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"TimeConversionTest.d.ts","sourceRoot":"","sources":["../../../test/TimeConversionTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/test/TimeConversionTest.js b/node_modules/@cucumber/messages/dist/cjs/test/TimeConversionTest.js new file mode 100644 index 00000000..d5bd7a49 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/test/TimeConversionTest.js @@ -0,0 +1,67 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var assert_1 = __importDefault(require("assert")); +var index_js_1 = require("../src/index.js"); +var TimeConversion_js_1 = require("../src/TimeConversion.js"); +var durationToMilliseconds = index_js_1.TimeConversion.durationToMilliseconds, millisecondsSinceEpochToTimestamp = index_js_1.TimeConversion.millisecondsSinceEpochToTimestamp, millisecondsToDuration = index_js_1.TimeConversion.millisecondsToDuration, timestampToMillisecondsSinceEpoch = index_js_1.TimeConversion.timestampToMillisecondsSinceEpoch; +describe('TimeConversion', function () { + it('converts legacy string seconds', function () { + var duration = { + // @ts-ignore + seconds: '3', + nanos: 40000, + }; + var millis = durationToMilliseconds(duration); + assert_1.default.strictEqual(millis, 3000.04); + }); + it('converts to and from milliseconds since epoch', function () { + var millisecondsSinceEpoch = Date.now(); + var timestamp = millisecondsSinceEpochToTimestamp(millisecondsSinceEpoch); + var jsEpochMillisAgain = timestampToMillisecondsSinceEpoch(timestamp); + assert_1.default.strictEqual(jsEpochMillisAgain, millisecondsSinceEpoch); + }); + it('converts to and from milliseconds duration', function () { + var durationInMilliseconds = 1234; + var duration = millisecondsToDuration(durationInMilliseconds); + var durationMillisAgain = durationToMilliseconds(duration); + assert_1.default.strictEqual(durationMillisAgain, durationInMilliseconds); + }); + it('converts to and from milliseconds duration (with decimal places)', function () { + var durationInMilliseconds = 3.000161; + var duration = millisecondsToDuration(durationInMilliseconds); + var durationMillisAgain = durationToMilliseconds(duration); + assert_1.default.strictEqual(durationMillisAgain, durationInMilliseconds); + }); + it('adds durations (nanos only)', function () { + var durationA = millisecondsToDuration(100); + var durationB = millisecondsToDuration(200); + var sumDuration = (0, TimeConversion_js_1.addDurations)(durationA, durationB); + assert_1.default.deepStrictEqual(sumDuration, { seconds: 0, nanos: 3e8 }); + }); + it('adds durations (seconds only)', function () { + var durationA = millisecondsToDuration(1000); + var durationB = millisecondsToDuration(2000); + var sumDuration = (0, TimeConversion_js_1.addDurations)(durationA, durationB); + assert_1.default.deepStrictEqual(sumDuration, { seconds: 3, nanos: 0 }); + }); + it('adds durations (seconds and nanos)', function () { + var durationA = millisecondsToDuration(1500); + var durationB = millisecondsToDuration(1600); + var sumDuration = (0, TimeConversion_js_1.addDurations)(durationA, durationB); + assert_1.default.deepStrictEqual(sumDuration, { seconds: 3, nanos: 1e8 }); + }); + it('adds durations (seconds and nanos) with legacy string seconds', function () { + var durationA = millisecondsToDuration(1500); + // @ts-ignore + durationA.seconds = String(durationA.seconds); + var durationB = millisecondsToDuration(1600); + // @ts-ignore + durationB.seconds = String(durationB.seconds); + var sumDuration = (0, TimeConversion_js_1.addDurations)(durationA, durationB); + assert_1.default.deepStrictEqual(sumDuration, { seconds: 3, nanos: 1e8 }); + }); +}); +//# sourceMappingURL=TimeConversionTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/test/TimeConversionTest.js.map b/node_modules/@cucumber/messages/dist/cjs/test/TimeConversionTest.js.map new file mode 100644 index 00000000..c395d3e3 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/test/TimeConversionTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TimeConversionTest.js","sourceRoot":"","sources":["../../../test/TimeConversionTest.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/test/getWorstTestStepResultsTest.d.ts b/node_modules/@cucumber/messages/dist/cjs/test/getWorstTestStepResultsTest.d.ts new file mode 100644 index 00000000..6fe555da --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/test/getWorstTestStepResultsTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=getWorstTestStepResultsTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/test/getWorstTestStepResultsTest.d.ts.map b/node_modules/@cucumber/messages/dist/cjs/test/getWorstTestStepResultsTest.d.ts.map new file mode 100644 index 00000000..09c5969d --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/test/getWorstTestStepResultsTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"getWorstTestStepResultsTest.d.ts","sourceRoot":"","sources":["../../../test/getWorstTestStepResultsTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/test/getWorstTestStepResultsTest.js b/node_modules/@cucumber/messages/dist/cjs/test/getWorstTestStepResultsTest.js new file mode 100644 index 00000000..58a37414 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/test/getWorstTestStepResultsTest.js @@ -0,0 +1,28 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var getWorstTestStepResult_js_1 = require("../src/getWorstTestStepResult.js"); +var messages_js_1 = require("../src/messages.js"); +var assert_1 = __importDefault(require("assert")); +describe('getWorstTestStepResult', function () { + it('returns a FAILED result for PASSED,FAILED,PASSED', function () { + var result = (0, getWorstTestStepResult_js_1.getWorstTestStepResult)([ + { + status: messages_js_1.TestStepResultStatus.PASSED, + duration: { seconds: 0, nanos: 0 }, + }, + { + status: messages_js_1.TestStepResultStatus.FAILED, + duration: { seconds: 0, nanos: 0 }, + }, + { + status: messages_js_1.TestStepResultStatus.PASSED, + duration: { seconds: 0, nanos: 0 }, + }, + ]); + assert_1.default.strictEqual(result.status, messages_js_1.TestStepResultStatus.FAILED); + }); +}); +//# sourceMappingURL=getWorstTestStepResultsTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/test/getWorstTestStepResultsTest.js.map b/node_modules/@cucumber/messages/dist/cjs/test/getWorstTestStepResultsTest.js.map new file mode 100644 index 00000000..667b22e2 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/test/getWorstTestStepResultsTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"getWorstTestStepResultsTest.js","sourceRoot":"","sources":["../../../test/getWorstTestStepResultsTest.ts"],"names":[],"mappings":";;;;;AAAA,8EAAyE;AACzE,kDAAyD;AACzD,kDAA2B;AAE3B,QAAQ,CAAC,wBAAwB,EAAE;IACjC,EAAE,CAAC,kDAAkD,EAAE;QACrD,IAAM,MAAM,GAAG,IAAA,kDAAsB,EAAC;YACpC;gBACE,MAAM,EAAE,kCAAoB,CAAC,MAAM;gBACnC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;aACnC;YACD;gBACE,MAAM,EAAE,kCAAoB,CAAC,MAAM;gBACnC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;aACnC;YACD;gBACE,MAAM,EAAE,kCAAoB,CAAC,MAAM;gBACnC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;aACnC;SACF,CAAC,CAAA;QACF,gBAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,kCAAoB,CAAC,MAAM,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/test/messagesTest.d.ts b/node_modules/@cucumber/messages/dist/cjs/test/messagesTest.d.ts new file mode 100644 index 00000000..7b7022b4 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/test/messagesTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=messagesTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/test/messagesTest.d.ts.map b/node_modules/@cucumber/messages/dist/cjs/test/messagesTest.d.ts.map new file mode 100644 index 00000000..601766c6 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/test/messagesTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"messagesTest.d.ts","sourceRoot":"","sources":["../../../test/messagesTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/test/messagesTest.js b/node_modules/@cucumber/messages/dist/cjs/test/messagesTest.js new file mode 100644 index 00000000..b0777f1a --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/test/messagesTest.js @@ -0,0 +1,87 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var assert_1 = __importDefault(require("assert")); +var index_js_1 = require("../src/index.js"); +describe('messages', function () { + it('defaults missing fields when deserialising from JSON', function () { + // Sample envelope from before we moved from protobuf to JSON Schema + var partialGherkinDocumentEnvelope = { + gherkinDocument: { + feature: { + children: [ + { + scenario: { + id: '1', + keyword: 'Scenario', + location: { column: 3, line: 3 }, + name: 'minimalistic', + steps: [ + { + id: '0', + keyword: 'Given ', + keywordType: index_js_1.StepKeywordType.CONTEXT, + location: { column: 5, line: 4 }, + text: 'the minimalism', + }, + ], + }, + }, + ], + keyword: 'Feature', + language: 'en', + location: { column: 1, line: 1 }, + name: 'Minimal', + }, + uri: 'testdata/good/minimal.feature', + }, + }; + var envelope = (0, index_js_1.parseEnvelope)(JSON.stringify(partialGherkinDocumentEnvelope)); + var expectedEnvelope = { + gherkinDocument: { + // new + comments: [], + feature: { + // new + tags: [], + // new + description: '', + children: [ + { + scenario: { + // new + examples: [], + // new + description: '', + // new + tags: [], + id: '1', + keyword: 'Scenario', + location: { column: 3, line: 3 }, + name: 'minimalistic', + steps: [ + { + id: '0', + keyword: 'Given ', + keywordType: index_js_1.StepKeywordType.CONTEXT, + location: { column: 5, line: 4 }, + text: 'the minimalism', + }, + ], + }, + }, + ], + keyword: 'Feature', + language: 'en', + location: { column: 1, line: 1 }, + name: 'Minimal', + }, + uri: 'testdata/good/minimal.feature', + }, + }; + assert_1.default.deepStrictEqual(JSON.parse(JSON.stringify(envelope)), JSON.parse(JSON.stringify(expectedEnvelope))); + }); +}); +//# sourceMappingURL=messagesTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/test/messagesTest.js.map b/node_modules/@cucumber/messages/dist/cjs/test/messagesTest.js.map new file mode 100644 index 00000000..39ca2522 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/test/messagesTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"messagesTest.js","sourceRoot":"","sources":["../../../test/messagesTest.ts"],"names":[],"mappings":";;;;;AAAA,kDAA2B;AAC3B,4CAA0E;AAE1E,QAAQ,CAAC,UAAU,EAAE;IACnB,EAAE,CAAC,sDAAsD,EAAE;QACzD,oEAAoE;QACpE,IAAM,8BAA8B,GAAG;YACrC,eAAe,EAAE;gBACf,OAAO,EAAE;oBACP,QAAQ,EAAE;wBACR;4BACE,QAAQ,EAAE;gCACR,EAAE,EAAE,GAAG;gCACP,OAAO,EAAE,UAAU;gCACnB,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;gCAChC,IAAI,EAAE,cAAc;gCACpB,KAAK,EAAE;oCACL;wCACE,EAAE,EAAE,GAAG;wCACP,OAAO,EAAE,QAAQ;wCACjB,WAAW,EAAE,0BAAe,CAAC,OAAO;wCACpC,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;wCAChC,IAAI,EAAE,gBAAgB;qCACvB;iCACF;6BACF;yBACF;qBACF;oBACD,OAAO,EAAE,SAAS;oBAClB,QAAQ,EAAE,IAAI;oBACd,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;oBAChC,IAAI,EAAE,SAAS;iBAChB;gBACD,GAAG,EAAE,+BAA+B;aACrC;SACF,CAAA;QAED,IAAM,QAAQ,GAAa,IAAA,wBAAa,EAAC,IAAI,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC,CAAA;QACxF,IAAM,gBAAgB,GAAa;YACjC,eAAe,EAAE;gBACf,MAAM;gBACN,QAAQ,EAAE,EAAE;gBACZ,OAAO,EAAE;oBACP,MAAM;oBACN,IAAI,EAAE,EAAE;oBACR,MAAM;oBACN,WAAW,EAAE,EAAE;oBACf,QAAQ,EAAE;wBACR;4BACE,QAAQ,EAAE;gCACR,MAAM;gCACN,QAAQ,EAAE,EAAE;gCACZ,MAAM;gCACN,WAAW,EAAE,EAAE;gCACf,MAAM;gCACN,IAAI,EAAE,EAAE;gCACR,EAAE,EAAE,GAAG;gCACP,OAAO,EAAE,UAAU;gCACnB,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;gCAChC,IAAI,EAAE,cAAc;gCACpB,KAAK,EAAE;oCACL;wCACE,EAAE,EAAE,GAAG;wCACP,OAAO,EAAE,QAAQ;wCACjB,WAAW,EAAE,0BAAe,CAAC,OAAO;wCACpC,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;wCAChC,IAAI,EAAE,gBAAgB;qCACvB;iCACF;6BACF;yBACF;qBACF;oBACD,OAAO,EAAE,SAAS;oBAClB,QAAQ,EAAE,IAAI;oBACd,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;oBAChC,IAAI,EAAE,SAAS;iBAChB;gBACD,GAAG,EAAE,+BAA+B;aACrC;SACF,CAAA;QAED,gBAAM,CAAC,eAAe,CACpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EACpC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAC7C,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/cjs/tsconfig.build-cjs.tsbuildinfo b/node_modules/@cucumber/messages/dist/cjs/tsconfig.build-cjs.tsbuildinfo new file mode 100644 index 00000000..3ec55a96 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/cjs/tsconfig.build-cjs.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../src/IdGenerator.ts","../../node_modules/class-transformer/types/interfaces/decorator-options/expose-options.interface.d.ts","../../node_modules/class-transformer/types/interfaces/decorator-options/exclude-options.interface.d.ts","../../node_modules/class-transformer/types/interfaces/decorator-options/transform-options.interface.d.ts","../../node_modules/class-transformer/types/interfaces/decorator-options/type-discriminator-descriptor.interface.d.ts","../../node_modules/class-transformer/types/interfaces/decorator-options/type-options.interface.d.ts","../../node_modules/class-transformer/types/interfaces/metadata/exclude-metadata.interface.d.ts","../../node_modules/class-transformer/types/interfaces/metadata/expose-metadata.interface.d.ts","../../node_modules/class-transformer/types/enums/transformation-type.enum.d.ts","../../node_modules/class-transformer/types/enums/index.d.ts","../../node_modules/class-transformer/types/interfaces/target-map.interface.d.ts","../../node_modules/class-transformer/types/interfaces/class-transformer-options.interface.d.ts","../../node_modules/class-transformer/types/interfaces/metadata/transform-fn-params.interface.d.ts","../../node_modules/class-transformer/types/interfaces/metadata/transform-metadata.interface.d.ts","../../node_modules/class-transformer/types/interfaces/metadata/type-metadata.interface.d.ts","../../node_modules/class-transformer/types/interfaces/class-constructor.type.d.ts","../../node_modules/class-transformer/types/interfaces/type-help-options.interface.d.ts","../../node_modules/class-transformer/types/interfaces/index.d.ts","../../node_modules/class-transformer/types/ClassTransformer.d.ts","../../node_modules/class-transformer/types/decorators/exclude.decorator.d.ts","../../node_modules/class-transformer/types/decorators/expose.decorator.d.ts","../../node_modules/class-transformer/types/decorators/transform-instance-to-instance.decorator.d.ts","../../node_modules/class-transformer/types/decorators/transform-instance-to-plain.decorator.d.ts","../../node_modules/class-transformer/types/decorators/transform-plain-to-instance.decorator.d.ts","../../node_modules/class-transformer/types/decorators/transform.decorator.d.ts","../../node_modules/class-transformer/types/decorators/type.decorator.d.ts","../../node_modules/class-transformer/types/decorators/index.d.ts","../../node_modules/class-transformer/types/index.d.ts","../../node_modules/reflect-metadata/index.d.ts","../../src/messages.ts","../../src/TimeConversion.ts","../../src/getWorstTestStepResult.ts","../../src/parseEnvelope.ts","../../src/version.ts","../../src/index.ts","../../test/IdGeneratorTest.ts","../../test/TimeConversionTest.ts","../../test/getWorstTestStepResultsTest.ts","../../test/messagesTest.ts","../../node_modules/@types/mocha/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/@types/node/web-globals/events.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/inspector.generated.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts"],"fileIdsList":[[91,139,156,157],[91,136,137,139,156,157],[91,138,139,156,157],[139,156,157],[91,139,144,156,157,174],[91,139,140,145,150,156,157,159,171,182],[91,139,140,141,150,156,157,159],[86,87,88,91,139,156,157],[91,139,142,156,157,183],[91,139,143,144,151,156,157,160],[91,139,144,156,157,171,179],[91,139,145,147,150,156,157,159],[91,138,139,146,156,157],[91,139,147,148,156,157],[91,139,149,150,156,157],[91,138,139,150,156,157],[91,139,150,151,152,156,157,171,182],[91,139,150,151,152,156,157,166,171,174],[91,132,139,147,150,153,156,157,159,171,182],[91,139,150,151,153,154,156,157,159,171,179,182],[91,139,153,155,156,157,171,179,182],[89,90,91,92,93,94,95,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188],[91,139,150,156,157],[91,139,156,157,158,182],[91,139,147,150,156,157,159,171],[91,139,156,157,160],[91,139,156,157,161],[91,138,139,156,157,162],[91,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188],[91,139,156,157,164],[91,139,156,157,165],[91,139,150,156,157,166,167],[91,139,156,157,166,168,183,185],[91,139,151,156,157],[91,139,150,156,157,171,172,174],[91,139,156,157,173,174],[91,139,156,157,171,172],[91,139,156,157,174],[91,139,156,157,175],[91,136,139,156,157,171,176,182],[91,139,150,156,157,177,178],[91,139,156,157,177,178],[91,139,144,156,157,159,171,179],[91,139,156,157,180],[91,139,156,157,159,181],[91,139,153,156,157,165,182],[91,139,144,156,157,183],[91,139,156,157,171,184],[91,139,156,157,158,185],[91,139,156,157,186],[91,132,139,156,157],[91,132,139,150,152,156,157,162,171,174,182,184,185,187],[91,139,156,157,171,188],[63,91,139,156,157],[65,66,67,68,69,70,71,91,139,156,157],[54,91,139,156,157],[55,63,64,72,91,139,156,157],[56,91,139,156,157],[50,91,139,156,157],[47,48,49,50,51,52,53,56,57,58,59,60,61,62,91,139,156,157],[55,57,91,139,156,157],[58,63,91,139,156,157],[91,104,108,139,156,157,182],[91,104,139,156,157,171,182],[91,99,139,156,157],[91,101,104,139,156,157,179,182],[91,139,156,157,159,179],[91,139,156,157,189],[91,99,139,156,157,189],[91,101,104,139,156,157,159,182],[91,96,97,100,103,139,150,156,157,171,182],[91,104,111,139,156,157],[91,96,102,139,156,157],[91,104,125,126,139,156,157],[91,100,104,139,156,157,174,182,189],[91,125,139,156,157,189],[91,98,99,139,156,157,189],[91,104,139,156,157],[91,98,99,100,101,102,103,104,105,106,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,126,127,128,129,130,131,139,156,157],[91,104,119,139,156,157],[91,104,111,112,139,156,157],[91,102,104,112,113,139,156,157],[91,103,139,156,157],[91,96,99,104,139,156,157],[91,104,108,112,113,139,156,157],[91,108,139,156,157],[91,102,104,107,139,156,157,182],[91,96,101,104,111,139,156,157],[91,139,156,157,171],[91,99,104,125,139,156,157,187,189],[75,91,139,156,157],[75,76,91,139,156,157],[46,75,76,77,78,79,91,139,156,157],[73,74,91,139,156,157],[73,75,91,139,156,157],[80,91,136,139,156,157],[76,80,91,136,139,156,157],[75,77,91,136,139,156,157]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c97c731e5cc47991e603bf2fb9f1793105494bcc0847092998bd88b6b1934da","signature":"44716259b743dacde932f7f1922ac85f533af74e3ed82a078ba505414f6f6b53"},{"version":"b6e995b5ef6661f5636ff738e67e4ec90150768ef119ad74b473c404304408a1","impliedFormat":1},{"version":"5d470930bf6142d7cbda81c157869024527dc7911ba55d90b8387ef6e1585aa1","impliedFormat":1},{"version":"074483fdbf20b30bd450e54e6892e96ea093430c313e61be5fdfe51588baa2d6","impliedFormat":1},{"version":"b7e6a6a3495301360edb9e1474702db73d18be7803b3f5c6c05571212acccd16","impliedFormat":1},{"version":"aa7527285c94043f21baf6e337bc60a92c20b6efaa90859473f6476954ac5f79","impliedFormat":1},{"version":"dd3be6d9dcd79e46d192175a756546630f2dc89dab28073823c936557b977f26","impliedFormat":1},{"version":"8d0566152618a1da6536c75a5659c139522d67c63a9ae27e8228d76ab0420584","impliedFormat":1},{"version":"ba06bf784edafe0db0e2bd1f6ecf3465b81f6b1819871bf190a0e0137b5b7f18","impliedFormat":1},{"version":"a0500233cb989bcb78f5f1a81f51eabc06b5c39e3042c560a7489f022f1f55a3","impliedFormat":1},{"version":"220508b3fb6b773f49d8fb0765b04f90ef15caacf0f3d260e3412ed38f71ef09","impliedFormat":1},{"version":"1ad113089ad5c188fec4c9a339cb53d1bcbb65682407d6937557bb23a6e1d4e5","impliedFormat":1},{"version":"e56427c055602078cbf0e58e815960541136388f4fc62554813575508def98b6","impliedFormat":1},{"version":"1f58b0676a80db38df1ce19d15360c20ce9e983b35298a5d0b4aa4eb4fb67e0f","impliedFormat":1},{"version":"3d67e7eb73c6955ee27f1d845cae88923f75c8b0830d4b5440eea2339958e8ec","impliedFormat":1},{"version":"11fec302d58b56033ab07290a3abc29e9908e29d504db9468544b15c4cd7670d","impliedFormat":1},{"version":"c66d6817c931633650edf19a8644eea61aeeb84190c7219911cefa8ddea8bd9a","impliedFormat":1},{"version":"ab1359707e4fc610c5f37f1488063af65cda3badca6b692d44b95e8380e0f6c2","impliedFormat":1},{"version":"37deda160549729287645b3769cf126b0a17e7e2218737352676705a01d5957e","impliedFormat":1},{"version":"d80ffdd55e7f4bc69cde66933582b8592d3736d3b0d1d8cc63995a7b2bcca579","impliedFormat":1},{"version":"c9b71952b2178e8737b63079dba30e1b29872240b122905cbaba756cb60b32f5","impliedFormat":1},{"version":"b596585338b0d870f0e19e6b6bcbf024f76328f2c4f4e59745714e38ee9b0582","impliedFormat":1},{"version":"e6717fc103dfa1635947bf2b41161b5e4f2fabbcaf555754cc1b4340ec4ca587","impliedFormat":1},{"version":"c36186d7bdf1f525b7685ee5bf639e4b157b1e803a70c25f234d4762496f771f","impliedFormat":1},{"version":"026726932a4964341ab8544f12b912c8dfaa388d2936b71cc3eca0cffb49cc1d","impliedFormat":1},{"version":"83188d037c81bd27076218934ba9e1742ddb69cd8cc64cdb8a554078de38eb12","impliedFormat":1},{"version":"7d82f2d6a89f07c46c7e3e9071ab890124f95931d9c999ba8f865fa6ef6cbf72","impliedFormat":1},{"version":"4fc523037d14d9bb6ddb586621a93dd05b6c6d8d59919a40c436ca3ac29d9716","impliedFormat":1},{"version":"8d6d51a5118d000ed3bfe6e1dd1335bebfff3fef23cd2af2f84a24d30f90cc90","affectsGlobalScope":true,"impliedFormat":1},{"version":"c270488bdcc10c20550452f9bf6fcc1bd01eab0dfc7f0c6747abc19a2acd5f0e","signature":"a1387533f292cc1377923ba182557241ca949a2ca8495866dec169038c9e45a2"},{"version":"fd9ae11ee76d8d1993309456c4536d7024cecec15fc77dc1b4d7619556abc324","signature":"d9f4ec5156491a24eee340452d7e87e432512d5ebde23fe18c2ceb5a31c1720b"},{"version":"0e865bcd7cf3c305aeee04f6c76dd77de0f7e4b3173cf960bd4018b213525547","signature":"497efde09001124a1bfab8ea16409b6908fe8a49ae8d5d69082910838150fbfd"},{"version":"4866672a66505bfc3f8bd7f5f9cdbcd3927080b43095f73b6bfdf6a045d04fdf","signature":"653dc417862cf079d590653212a8d48ace7c89ff7b73c239791099afc25dca96"},{"version":"4112cfafe102f4a4cc44adb81a17cd895a854102130231735409a706570d22f6","signature":"881d8c5d323b9a03009e467e1fb7bc2a32da16a567ca29c9d484518cb02ce3f7"},{"version":"e6af11bf85a123ea9f9aee37c1e94008650a2609ac323f70eea1845a79d39a28","signature":"5ed925f9d0dfcb0fde32518c7ae42f88461fd8eabb015a35183fac5ce95bbc6c"},{"version":"9e4cf44d1d002801603e3a3883a5b338db29123a32143dfd8c703094998c8e4e","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"d32ac673e19a27547e53e00df484de018a9146acee28847619abd913088b4fc8","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"2717ea2c81ce0dc3855fe0647da5b0486b6ba0e3e7d9863b7e0491fcfa803d24","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"27acb37346bf964bc845b5cc6a9f3fc09d9002271c7dd144469ff00d2cfe923f","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"29f72ec1289ae3aeda78bf14b38086d3d803262ac13904b400422941a26a3636","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"58647d85d0f722a1ce9de50955df60a7489f0593bf1a7015521efe901c06d770","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6f137d651076822d4fe884287e68fd61785a0d3d1fdb250a5059b691fa897db","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"80523c00b8544a2000ae0143e4a90a00b47f99823eb7926c1e03c494216fc363","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"746911b62b329587939560deb5c036aca48aece03147b021fa680223255d5183","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c8d3e5a18ba35629954e48c4cc8f11dc88224650067a172685c736b27a34a4dc","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2b55d426ff2b9087485e52ac4bc7cfafe1dc420fc76dad926cd46526567c501a","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"358765d5ea8afd285d4fd1532e78b88273f18cb3f87403a9b16fef61ac9fdcfe","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1}],"root":[46,[75,84]],"options":{"allowJs":false,"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"declarationMap":true,"downlevelIteration":true,"esModuleInterop":true,"experimentalDecorators":true,"module":1,"noImplicitAny":true,"outDir":"./","rootDir":"../..","skipLibCheck":true,"sourceMap":true,"strictNullChecks":true,"target":1},"referencedMap":[[85,1],[136,2],[137,2],[138,3],[91,4],[139,5],[140,6],[141,7],[86,1],[89,8],[87,1],[88,1],[142,9],[143,10],[144,11],[145,12],[146,13],[147,14],[148,14],[149,15],[150,16],[151,17],[152,18],[92,1],[90,1],[153,19],[154,20],[155,21],[189,22],[156,23],[157,1],[158,24],[159,25],[160,26],[161,27],[162,28],[163,29],[164,30],[165,31],[166,32],[167,32],[168,33],[169,1],[170,34],[171,35],[173,36],[172,37],[174,38],[175,39],[176,40],[177,41],[178,42],[179,43],[180,44],[181,45],[182,46],[183,47],[184,48],[185,49],[186,50],[93,1],[94,1],[95,1],[133,51],[134,1],[135,1],[187,52],[188,53],[64,54],[65,54],[66,54],[72,55],[67,54],[68,54],[69,54],[70,54],[71,54],[55,56],[54,1],[73,57],[61,1],[57,58],[48,1],[47,1],[49,1],[50,54],[51,59],[63,60],[52,54],[53,54],[58,61],[59,62],[60,54],[56,1],[62,1],[74,1],[44,1],[45,1],[9,1],[8,1],[2,1],[10,1],[11,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[3,1],[18,1],[19,1],[4,1],[20,1],[24,1],[21,1],[22,1],[23,1],[25,1],[26,1],[27,1],[5,1],[28,1],[29,1],[30,1],[31,1],[6,1],[35,1],[32,1],[33,1],[34,1],[36,1],[7,1],[37,1],[42,1],[43,1],[38,1],[39,1],[40,1],[41,1],[1,1],[111,63],[121,64],[110,63],[131,65],[102,66],[101,67],[130,68],[124,69],[129,70],[104,71],[118,72],[103,73],[127,74],[99,75],[98,68],[128,76],[100,77],[105,78],[106,1],[109,78],[96,1],[132,79],[122,80],[113,81],[114,82],[116,83],[112,84],[115,85],[125,68],[107,86],[108,87],[117,88],[97,89],[120,80],[119,78],[123,1],[126,90],[46,1],[76,91],[77,92],[80,93],[75,94],[78,95],[79,1],[81,96],[82,97],[83,98],[84,96]],"latestChangedDtsFile":"./test/messagesTest.d.ts","version":"5.9.3"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/src/IdGenerator.d.ts b/node_modules/@cucumber/messages/dist/esm/src/IdGenerator.d.ts new file mode 100644 index 00000000..cf2902b7 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/src/IdGenerator.d.ts @@ -0,0 +1,4 @@ +export type NewId = () => string; +export declare function uuid(): NewId; +export declare function incrementing(): NewId; +//# sourceMappingURL=IdGenerator.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/src/IdGenerator.d.ts.map b/node_modules/@cucumber/messages/dist/esm/src/IdGenerator.d.ts.map new file mode 100644 index 00000000..6bf199e6 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/src/IdGenerator.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"IdGenerator.d.ts","sourceRoot":"","sources":["../../../src/IdGenerator.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,KAAK,GAAG,MAAM,MAAM,CAAA;AAEhC,wBAAgB,IAAI,IAAI,KAAK,CAE5B;AAED,wBAAgB,YAAY,IAAI,KAAK,CAGpC"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/src/IdGenerator.js b/node_modules/@cucumber/messages/dist/esm/src/IdGenerator.js new file mode 100644 index 00000000..98ef2362 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/src/IdGenerator.js @@ -0,0 +1,8 @@ +export function uuid() { + return () => crypto.randomUUID(); +} +export function incrementing() { + let next = 0; + return () => (next++).toString(); +} +//# sourceMappingURL=IdGenerator.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/src/IdGenerator.js.map b/node_modules/@cucumber/messages/dist/esm/src/IdGenerator.js.map new file mode 100644 index 00000000..2ab75dd9 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/src/IdGenerator.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IdGenerator.js","sourceRoot":"","sources":["../../../src/IdGenerator.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,IAAI;IAClB,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,CAAA;AAClC,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,OAAO,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAA;AAClC,CAAC"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/src/TimeConversion.d.ts b/node_modules/@cucumber/messages/dist/esm/src/TimeConversion.d.ts new file mode 100644 index 00000000..a4fec1b5 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/src/TimeConversion.d.ts @@ -0,0 +1,7 @@ +import * as messages from './messages.js'; +export declare function millisecondsSinceEpochToTimestamp(millisecondsSinceEpoch: number): messages.Timestamp; +export declare function millisecondsToDuration(durationInMilliseconds: number): messages.Duration; +export declare function timestampToMillisecondsSinceEpoch(timestamp: messages.Timestamp): number; +export declare function durationToMilliseconds(duration: messages.Duration): number; +export declare function addDurations(durationA: messages.Duration, durationB: messages.Duration): messages.Duration; +//# sourceMappingURL=TimeConversion.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/src/TimeConversion.d.ts.map b/node_modules/@cucumber/messages/dist/esm/src/TimeConversion.d.ts.map new file mode 100644 index 00000000..52fb1ca5 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/src/TimeConversion.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"TimeConversion.d.ts","sourceRoot":"","sources":["../../../src/TimeConversion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AAMzC,wBAAgB,iCAAiC,CAC/C,sBAAsB,EAAE,MAAM,GAC7B,QAAQ,CAAC,SAAS,CAEpB;AAED,wBAAgB,sBAAsB,CAAC,sBAAsB,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAExF;AAED,wBAAgB,iCAAiC,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,GAAG,MAAM,CAGvF;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,UAGjE;AAED,wBAAgB,YAAY,CAC1B,SAAS,EAAE,QAAQ,CAAC,QAAQ,EAC5B,SAAS,EAAE,QAAQ,CAAC,QAAQ,GAC3B,QAAQ,CAAC,QAAQ,CAQnB"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/src/TimeConversion.js b/node_modules/@cucumber/messages/dist/esm/src/TimeConversion.js new file mode 100644 index 00000000..0df2ff42 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/src/TimeConversion.js @@ -0,0 +1,37 @@ +const MILLISECONDS_PER_SECOND = 1e3; +const NANOSECONDS_PER_MILLISECOND = 1e6; +const NANOSECONDS_PER_SECOND = 1e9; +export function millisecondsSinceEpochToTimestamp(millisecondsSinceEpoch) { + return toSecondsAndNanos(millisecondsSinceEpoch); +} +export function millisecondsToDuration(durationInMilliseconds) { + return toSecondsAndNanos(durationInMilliseconds); +} +export function timestampToMillisecondsSinceEpoch(timestamp) { + const { seconds, nanos } = timestamp; + return toMillis(seconds, nanos); +} +export function durationToMilliseconds(duration) { + const { seconds, nanos } = duration; + return toMillis(seconds, nanos); +} +export function addDurations(durationA, durationB) { + let seconds = +durationA.seconds + +durationB.seconds; + let nanos = durationA.nanos + durationB.nanos; + if (nanos >= NANOSECONDS_PER_SECOND) { + seconds += 1; + nanos -= NANOSECONDS_PER_SECOND; + } + return { seconds, nanos }; +} +function toSecondsAndNanos(milliseconds) { + const seconds = Math.floor(milliseconds / MILLISECONDS_PER_SECOND); + const nanos = Math.floor((milliseconds % MILLISECONDS_PER_SECOND) * NANOSECONDS_PER_MILLISECOND); + return { seconds, nanos }; +} +function toMillis(seconds, nanos) { + const secondMillis = +seconds * MILLISECONDS_PER_SECOND; + const nanoMillis = nanos / NANOSECONDS_PER_MILLISECOND; + return secondMillis + nanoMillis; +} +//# sourceMappingURL=TimeConversion.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/src/TimeConversion.js.map b/node_modules/@cucumber/messages/dist/esm/src/TimeConversion.js.map new file mode 100644 index 00000000..46e45a20 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/src/TimeConversion.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TimeConversion.js","sourceRoot":"","sources":["../../../src/TimeConversion.ts"],"names":[],"mappings":"AAEA,MAAM,uBAAuB,GAAG,GAAG,CAAA;AACnC,MAAM,2BAA2B,GAAG,GAAG,CAAA;AACvC,MAAM,sBAAsB,GAAG,GAAG,CAAA;AAElC,MAAM,UAAU,iCAAiC,CAC/C,sBAA8B;IAE9B,OAAO,iBAAiB,CAAC,sBAAsB,CAAC,CAAA;AAClD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,sBAA8B;IACnE,OAAO,iBAAiB,CAAC,sBAAsB,CAAC,CAAA;AAClD,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,SAA6B;IAC7E,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,SAAS,CAAA;IACpC,OAAO,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAA2B;IAChE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAA;IACnC,OAAO,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,SAA4B,EAC5B,SAA4B;IAE5B,IAAI,OAAO,GAAG,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,SAAS,CAAC,OAAO,CAAA;IACrD,IAAI,KAAK,GAAG,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAA;IAC7C,IAAI,KAAK,IAAI,sBAAsB,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC,CAAA;QACZ,KAAK,IAAI,sBAAsB,CAAA;IACjC,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;AAC3B,CAAC;AAED,SAAS,iBAAiB,CAAC,YAAoB;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,uBAAuB,CAAC,CAAA;IAClE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,GAAG,uBAAuB,CAAC,GAAG,2BAA2B,CAAC,CAAA;IAChG,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;AAC3B,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe,EAAE,KAAa;IAC9C,MAAM,YAAY,GAAG,CAAC,OAAO,GAAG,uBAAuB,CAAA;IACvD,MAAM,UAAU,GAAG,KAAK,GAAG,2BAA2B,CAAA;IACtD,OAAO,YAAY,GAAG,UAAU,CAAA;AAClC,CAAC"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/src/getWorstTestStepResult.d.ts b/node_modules/@cucumber/messages/dist/esm/src/getWorstTestStepResult.d.ts new file mode 100644 index 00000000..5eb20d95 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/src/getWorstTestStepResult.d.ts @@ -0,0 +1,7 @@ +import { TestStepResult } from './messages.js'; +/** + * Gets the worst result + * @param testStepResults + */ +export declare function getWorstTestStepResult(testStepResults: readonly TestStepResult[]): TestStepResult; +//# sourceMappingURL=getWorstTestStepResult.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/src/getWorstTestStepResult.d.ts.map b/node_modules/@cucumber/messages/dist/esm/src/getWorstTestStepResult.d.ts.map new file mode 100644 index 00000000..5614fb13 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/src/getWorstTestStepResult.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"getWorstTestStepResult.d.ts","sourceRoot":"","sources":["../../../src/getWorstTestStepResult.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAwB,MAAM,eAAe,CAAA;AAGpE;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,eAAe,EAAE,SAAS,cAAc,EAAE,GAAG,cAAc,CAOjG"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/src/getWorstTestStepResult.js b/node_modules/@cucumber/messages/dist/esm/src/getWorstTestStepResult.js new file mode 100644 index 00000000..1f545785 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/src/getWorstTestStepResult.js @@ -0,0 +1,24 @@ +import { TestStepResultStatus } from './messages.js'; +import { millisecondsToDuration } from './TimeConversion.js'; +/** + * Gets the worst result + * @param testStepResults + */ +export function getWorstTestStepResult(testStepResults) { + return (testStepResults.slice().sort((r1, r2) => ordinal(r2.status) - ordinal(r1.status))[0] || { + status: TestStepResultStatus.UNKNOWN, + duration: millisecondsToDuration(0), + }); +} +function ordinal(status) { + return [ + TestStepResultStatus.UNKNOWN, + TestStepResultStatus.PASSED, + TestStepResultStatus.SKIPPED, + TestStepResultStatus.PENDING, + TestStepResultStatus.UNDEFINED, + TestStepResultStatus.AMBIGUOUS, + TestStepResultStatus.FAILED, + ].indexOf(status); +} +//# sourceMappingURL=getWorstTestStepResult.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/src/getWorstTestStepResult.js.map b/node_modules/@cucumber/messages/dist/esm/src/getWorstTestStepResult.js.map new file mode 100644 index 00000000..266ec2db --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/src/getWorstTestStepResult.js.map @@ -0,0 +1 @@ +{"version":3,"file":"getWorstTestStepResult.js","sourceRoot":"","sources":["../../../src/getWorstTestStepResult.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,oBAAoB,EAAE,MAAM,eAAe,CAAA;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAE5D;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,eAA0C;IAC/E,OAAO,CACL,eAAe,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QACtF,MAAM,EAAE,oBAAoB,CAAC,OAAO;QACpC,QAAQ,EAAE,sBAAsB,CAAC,CAAC,CAAC;KACpC,CACF,CAAA;AACH,CAAC;AAED,SAAS,OAAO,CAAC,MAA4B;IAC3C,OAAO;QACL,oBAAoB,CAAC,OAAO;QAC5B,oBAAoB,CAAC,MAAM;QAC3B,oBAAoB,CAAC,OAAO;QAC5B,oBAAoB,CAAC,OAAO;QAC5B,oBAAoB,CAAC,SAAS;QAC9B,oBAAoB,CAAC,SAAS;QAC9B,oBAAoB,CAAC,MAAM;KAC5B,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;AACnB,CAAC"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/src/index.d.ts b/node_modules/@cucumber/messages/dist/esm/src/index.d.ts new file mode 100644 index 00000000..3564d994 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/src/index.d.ts @@ -0,0 +1,8 @@ +import * as TimeConversion from './TimeConversion.js'; +import * as IdGenerator from './IdGenerator.js'; +import { parseEnvelope } from './parseEnvelope.js'; +import { getWorstTestStepResult } from './getWorstTestStepResult.js'; +import { version } from './version.js'; +export * from './messages.js'; +export { TimeConversion, IdGenerator, version, parseEnvelope, getWorstTestStepResult }; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/src/index.d.ts.map b/node_modules/@cucumber/messages/dist/esm/src/index.d.ts.map new file mode 100644 index 00000000..e3cbbd18 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/src/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAA;AACrD,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,cAAc,eAAe,CAAA;AAE7B,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/src/index.js b/node_modules/@cucumber/messages/dist/esm/src/index.js new file mode 100644 index 00000000..c1040d50 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/src/index.js @@ -0,0 +1,8 @@ +import * as TimeConversion from './TimeConversion.js'; +import * as IdGenerator from './IdGenerator.js'; +import { parseEnvelope } from './parseEnvelope.js'; +import { getWorstTestStepResult } from './getWorstTestStepResult.js'; +import { version } from './version.js'; +export * from './messages.js'; +export { TimeConversion, IdGenerator, version, parseEnvelope, getWorstTestStepResult }; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/src/index.js.map b/node_modules/@cucumber/messages/dist/esm/src/index.js.map new file mode 100644 index 00000000..d2b42d95 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/src/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAA;AACrD,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,cAAc,eAAe,CAAA;AAE7B,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/src/messages.d.ts b/node_modules/@cucumber/messages/dist/esm/src/messages.d.ts new file mode 100644 index 00000000..2b6aeb5d --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/src/messages.d.ts @@ -0,0 +1,403 @@ +import 'reflect-metadata'; +export declare class Attachment { + body: string; + contentEncoding: AttachmentContentEncoding; + fileName?: string; + mediaType: string; + source?: Source; + testCaseStartedId?: string; + testStepId?: string; + url?: string; + testRunStartedId?: string; + testRunHookStartedId?: string; + timestamp?: Timestamp; +} +export declare class Duration { + seconds: number; + nanos: number; +} +export declare class Envelope { + attachment?: Attachment; + externalAttachment?: ExternalAttachment; + gherkinDocument?: GherkinDocument; + hook?: Hook; + meta?: Meta; + parameterType?: ParameterType; + parseError?: ParseError; + pickle?: Pickle; + suggestion?: Suggestion; + source?: Source; + stepDefinition?: StepDefinition; + testCase?: TestCase; + testCaseFinished?: TestCaseFinished; + testCaseStarted?: TestCaseStarted; + testRunFinished?: TestRunFinished; + testRunStarted?: TestRunStarted; + testStepFinished?: TestStepFinished; + testStepStarted?: TestStepStarted; + testRunHookStarted?: TestRunHookStarted; + testRunHookFinished?: TestRunHookFinished; + undefinedParameterType?: UndefinedParameterType; +} +export declare class Exception { + type: string; + message?: string; + stackTrace?: string; +} +export declare class ExternalAttachment { + url: string; + mediaType: string; + testCaseStartedId?: string; + testStepId?: string; + testRunHookStartedId?: string; + timestamp?: Timestamp; +} +export declare class GherkinDocument { + uri?: string; + feature?: Feature; + comments: readonly Comment[]; +} +export declare class Background { + location: Location; + keyword: string; + name: string; + description: string; + steps: readonly Step[]; + id: string; +} +export declare class Comment { + location: Location; + text: string; +} +export declare class DataTable { + location: Location; + rows: readonly TableRow[]; +} +export declare class DocString { + location: Location; + mediaType?: string; + content: string; + delimiter: string; +} +export declare class Examples { + location: Location; + tags: readonly Tag[]; + keyword: string; + name: string; + description: string; + tableHeader?: TableRow; + tableBody: readonly TableRow[]; + id: string; +} +export declare class Feature { + location: Location; + tags: readonly Tag[]; + language: string; + keyword: string; + name: string; + description: string; + children: readonly FeatureChild[]; +} +export declare class FeatureChild { + rule?: Rule; + background?: Background; + scenario?: Scenario; +} +export declare class Rule { + location: Location; + tags: readonly Tag[]; + keyword: string; + name: string; + description: string; + children: readonly RuleChild[]; + id: string; +} +export declare class RuleChild { + background?: Background; + scenario?: Scenario; +} +export declare class Scenario { + location: Location; + tags: readonly Tag[]; + keyword: string; + name: string; + description: string; + steps: readonly Step[]; + examples: readonly Examples[]; + id: string; +} +export declare class Step { + location: Location; + keyword: string; + keywordType?: StepKeywordType; + text: string; + docString?: DocString; + dataTable?: DataTable; + id: string; +} +export declare class TableCell { + location: Location; + value: string; +} +export declare class TableRow { + location: Location; + cells: readonly TableCell[]; + id: string; +} +export declare class Tag { + location: Location; + name: string; + id: string; +} +export declare class Hook { + id: string; + name?: string; + sourceReference: SourceReference; + tagExpression?: string; + type?: HookType; +} +export declare class Location { + line: number; + column?: number; +} +export declare class Meta { + protocolVersion: string; + implementation: Product; + runtime: Product; + os: Product; + cpu: Product; + ci?: Ci; +} +export declare class Ci { + name: string; + url?: string; + buildNumber?: string; + git?: Git; +} +export declare class Git { + remote: string; + revision: string; + branch?: string; + tag?: string; +} +export declare class Product { + name: string; + version?: string; +} +export declare class ParameterType { + name: string; + regularExpressions: readonly string[]; + preferForRegularExpressionMatch: boolean; + useForSnippets: boolean; + id: string; + sourceReference?: SourceReference; +} +export declare class ParseError { + source: SourceReference; + message: string; +} +export declare class Pickle { + id: string; + uri: string; + location?: Location; + name: string; + language: string; + steps: readonly PickleStep[]; + tags: readonly PickleTag[]; + astNodeIds: readonly string[]; +} +export declare class PickleDocString { + mediaType?: string; + content: string; +} +export declare class PickleStep { + argument?: PickleStepArgument; + astNodeIds: readonly string[]; + id: string; + type?: PickleStepType; + text: string; +} +export declare class PickleStepArgument { + docString?: PickleDocString; + dataTable?: PickleTable; +} +export declare class PickleTable { + rows: readonly PickleTableRow[]; +} +export declare class PickleTableCell { + value: string; +} +export declare class PickleTableRow { + cells: readonly PickleTableCell[]; +} +export declare class PickleTag { + name: string; + astNodeId: string; +} +export declare class Source { + uri: string; + data: string; + mediaType: SourceMediaType; +} +export declare class SourceReference { + uri?: string; + javaMethod?: JavaMethod; + javaStackTraceElement?: JavaStackTraceElement; + location?: Location; +} +export declare class JavaMethod { + className: string; + methodName: string; + methodParameterTypes: readonly string[]; +} +export declare class JavaStackTraceElement { + className: string; + fileName: string; + methodName: string; +} +export declare class StepDefinition { + id: string; + pattern: StepDefinitionPattern; + sourceReference: SourceReference; +} +export declare class StepDefinitionPattern { + source: string; + type: StepDefinitionPatternType; +} +export declare class Suggestion { + id: string; + pickleStepId: string; + snippets: readonly Snippet[]; +} +export declare class Snippet { + language: string; + code: string; +} +export declare class TestCase { + id: string; + pickleId: string; + testSteps: readonly TestStep[]; + testRunStartedId?: string; +} +export declare class Group { + children?: readonly Group[]; + start?: number; + value?: string; +} +export declare class StepMatchArgument { + group: Group; + parameterTypeName?: string; +} +export declare class StepMatchArgumentsList { + stepMatchArguments: readonly StepMatchArgument[]; +} +export declare class TestStep { + hookId?: string; + id: string; + pickleStepId?: string; + stepDefinitionIds?: readonly string[]; + stepMatchArgumentsLists?: readonly StepMatchArgumentsList[]; +} +export declare class TestCaseFinished { + testCaseStartedId: string; + timestamp: Timestamp; + willBeRetried: boolean; +} +export declare class TestCaseStarted { + attempt: number; + id: string; + testCaseId: string; + workerId?: string; + timestamp: Timestamp; +} +export declare class TestRunFinished { + message?: string; + success: boolean; + timestamp: Timestamp; + exception?: Exception; + testRunStartedId?: string; +} +export declare class TestRunHookFinished { + testRunHookStartedId: string; + result: TestStepResult; + timestamp: Timestamp; +} +export declare class TestRunHookStarted { + id: string; + testRunStartedId: string; + hookId: string; + workerId?: string; + timestamp: Timestamp; +} +export declare class TestRunStarted { + timestamp: Timestamp; + id?: string; +} +export declare class TestStepFinished { + testCaseStartedId: string; + testStepId: string; + testStepResult: TestStepResult; + timestamp: Timestamp; +} +export declare class TestStepResult { + duration: Duration; + message?: string; + status: TestStepResultStatus; + exception?: Exception; +} +export declare class TestStepStarted { + testCaseStartedId: string; + testStepId: string; + timestamp: Timestamp; +} +export declare class Timestamp { + seconds: number; + nanos: number; +} +export declare class UndefinedParameterType { + expression: string; + name: string; +} +export declare enum AttachmentContentEncoding { + IDENTITY = "IDENTITY", + BASE64 = "BASE64" +} +export declare enum HookType { + BEFORE_TEST_RUN = "BEFORE_TEST_RUN", + AFTER_TEST_RUN = "AFTER_TEST_RUN", + BEFORE_TEST_CASE = "BEFORE_TEST_CASE", + AFTER_TEST_CASE = "AFTER_TEST_CASE", + BEFORE_TEST_STEP = "BEFORE_TEST_STEP", + AFTER_TEST_STEP = "AFTER_TEST_STEP" +} +export declare enum PickleStepType { + UNKNOWN = "Unknown", + CONTEXT = "Context", + ACTION = "Action", + OUTCOME = "Outcome" +} +export declare enum SourceMediaType { + TEXT_X_CUCUMBER_GHERKIN_PLAIN = "text/x.cucumber.gherkin+plain", + TEXT_X_CUCUMBER_GHERKIN_MARKDOWN = "text/x.cucumber.gherkin+markdown" +} +export declare enum StepDefinitionPatternType { + CUCUMBER_EXPRESSION = "CUCUMBER_EXPRESSION", + REGULAR_EXPRESSION = "REGULAR_EXPRESSION" +} +export declare enum StepKeywordType { + UNKNOWN = "Unknown", + CONTEXT = "Context", + ACTION = "Action", + OUTCOME = "Outcome", + CONJUNCTION = "Conjunction" +} +export declare enum TestStepResultStatus { + UNKNOWN = "UNKNOWN", + PASSED = "PASSED", + SKIPPED = "SKIPPED", + PENDING = "PENDING", + UNDEFINED = "UNDEFINED", + AMBIGUOUS = "AMBIGUOUS", + FAILED = "FAILED" +} +//# sourceMappingURL=messages.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/src/messages.d.ts.map b/node_modules/@cucumber/messages/dist/esm/src/messages.d.ts.map new file mode 100644 index 00000000..f9a7c017 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/src/messages.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/messages.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/src/messages.js b/node_modules/@cucumber/messages/dist/esm/src/messages.js new file mode 100644 index 00000000..102a8f3b --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/src/messages.js @@ -0,0 +1,736 @@ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +import { Type } from 'class-transformer'; +import 'reflect-metadata'; +export class Attachment { + constructor() { + this.body = ''; + this.contentEncoding = AttachmentContentEncoding.IDENTITY; + this.mediaType = ''; + } +} +__decorate([ + Type(() => Source) +], Attachment.prototype, "source", void 0); +__decorate([ + Type(() => Timestamp) +], Attachment.prototype, "timestamp", void 0); +export class Duration { + constructor() { + this.seconds = 0; + this.nanos = 0; + } +} +export class Envelope { +} +__decorate([ + Type(() => Attachment) +], Envelope.prototype, "attachment", void 0); +__decorate([ + Type(() => ExternalAttachment) +], Envelope.prototype, "externalAttachment", void 0); +__decorate([ + Type(() => GherkinDocument) +], Envelope.prototype, "gherkinDocument", void 0); +__decorate([ + Type(() => Hook) +], Envelope.prototype, "hook", void 0); +__decorate([ + Type(() => Meta) +], Envelope.prototype, "meta", void 0); +__decorate([ + Type(() => ParameterType) +], Envelope.prototype, "parameterType", void 0); +__decorate([ + Type(() => ParseError) +], Envelope.prototype, "parseError", void 0); +__decorate([ + Type(() => Pickle) +], Envelope.prototype, "pickle", void 0); +__decorate([ + Type(() => Suggestion) +], Envelope.prototype, "suggestion", void 0); +__decorate([ + Type(() => Source) +], Envelope.prototype, "source", void 0); +__decorate([ + Type(() => StepDefinition) +], Envelope.prototype, "stepDefinition", void 0); +__decorate([ + Type(() => TestCase) +], Envelope.prototype, "testCase", void 0); +__decorate([ + Type(() => TestCaseFinished) +], Envelope.prototype, "testCaseFinished", void 0); +__decorate([ + Type(() => TestCaseStarted) +], Envelope.prototype, "testCaseStarted", void 0); +__decorate([ + Type(() => TestRunFinished) +], Envelope.prototype, "testRunFinished", void 0); +__decorate([ + Type(() => TestRunStarted) +], Envelope.prototype, "testRunStarted", void 0); +__decorate([ + Type(() => TestStepFinished) +], Envelope.prototype, "testStepFinished", void 0); +__decorate([ + Type(() => TestStepStarted) +], Envelope.prototype, "testStepStarted", void 0); +__decorate([ + Type(() => TestRunHookStarted) +], Envelope.prototype, "testRunHookStarted", void 0); +__decorate([ + Type(() => TestRunHookFinished) +], Envelope.prototype, "testRunHookFinished", void 0); +__decorate([ + Type(() => UndefinedParameterType) +], Envelope.prototype, "undefinedParameterType", void 0); +export class Exception { + constructor() { + this.type = ''; + } +} +export class ExternalAttachment { + constructor() { + this.url = ''; + this.mediaType = ''; + } +} +__decorate([ + Type(() => Timestamp) +], ExternalAttachment.prototype, "timestamp", void 0); +export class GherkinDocument { + constructor() { + this.comments = []; + } +} +__decorate([ + Type(() => Feature) +], GherkinDocument.prototype, "feature", void 0); +__decorate([ + Type(() => Comment) +], GherkinDocument.prototype, "comments", void 0); +export class Background { + constructor() { + this.location = new Location(); + this.keyword = ''; + this.name = ''; + this.description = ''; + this.steps = []; + this.id = ''; + } +} +__decorate([ + Type(() => Location) +], Background.prototype, "location", void 0); +__decorate([ + Type(() => Step) +], Background.prototype, "steps", void 0); +export class Comment { + constructor() { + this.location = new Location(); + this.text = ''; + } +} +__decorate([ + Type(() => Location) +], Comment.prototype, "location", void 0); +export class DataTable { + constructor() { + this.location = new Location(); + this.rows = []; + } +} +__decorate([ + Type(() => Location) +], DataTable.prototype, "location", void 0); +__decorate([ + Type(() => TableRow) +], DataTable.prototype, "rows", void 0); +export class DocString { + constructor() { + this.location = new Location(); + this.content = ''; + this.delimiter = ''; + } +} +__decorate([ + Type(() => Location) +], DocString.prototype, "location", void 0); +export class Examples { + constructor() { + this.location = new Location(); + this.tags = []; + this.keyword = ''; + this.name = ''; + this.description = ''; + this.tableBody = []; + this.id = ''; + } +} +__decorate([ + Type(() => Location) +], Examples.prototype, "location", void 0); +__decorate([ + Type(() => Tag) +], Examples.prototype, "tags", void 0); +__decorate([ + Type(() => TableRow) +], Examples.prototype, "tableHeader", void 0); +__decorate([ + Type(() => TableRow) +], Examples.prototype, "tableBody", void 0); +export class Feature { + constructor() { + this.location = new Location(); + this.tags = []; + this.language = ''; + this.keyword = ''; + this.name = ''; + this.description = ''; + this.children = []; + } +} +__decorate([ + Type(() => Location) +], Feature.prototype, "location", void 0); +__decorate([ + Type(() => Tag) +], Feature.prototype, "tags", void 0); +__decorate([ + Type(() => FeatureChild) +], Feature.prototype, "children", void 0); +export class FeatureChild { +} +__decorate([ + Type(() => Rule) +], FeatureChild.prototype, "rule", void 0); +__decorate([ + Type(() => Background) +], FeatureChild.prototype, "background", void 0); +__decorate([ + Type(() => Scenario) +], FeatureChild.prototype, "scenario", void 0); +export class Rule { + constructor() { + this.location = new Location(); + this.tags = []; + this.keyword = ''; + this.name = ''; + this.description = ''; + this.children = []; + this.id = ''; + } +} +__decorate([ + Type(() => Location) +], Rule.prototype, "location", void 0); +__decorate([ + Type(() => Tag) +], Rule.prototype, "tags", void 0); +__decorate([ + Type(() => RuleChild) +], Rule.prototype, "children", void 0); +export class RuleChild { +} +__decorate([ + Type(() => Background) +], RuleChild.prototype, "background", void 0); +__decorate([ + Type(() => Scenario) +], RuleChild.prototype, "scenario", void 0); +export class Scenario { + constructor() { + this.location = new Location(); + this.tags = []; + this.keyword = ''; + this.name = ''; + this.description = ''; + this.steps = []; + this.examples = []; + this.id = ''; + } +} +__decorate([ + Type(() => Location) +], Scenario.prototype, "location", void 0); +__decorate([ + Type(() => Tag) +], Scenario.prototype, "tags", void 0); +__decorate([ + Type(() => Step) +], Scenario.prototype, "steps", void 0); +__decorate([ + Type(() => Examples) +], Scenario.prototype, "examples", void 0); +export class Step { + constructor() { + this.location = new Location(); + this.keyword = ''; + this.text = ''; + this.id = ''; + } +} +__decorate([ + Type(() => Location) +], Step.prototype, "location", void 0); +__decorate([ + Type(() => DocString) +], Step.prototype, "docString", void 0); +__decorate([ + Type(() => DataTable) +], Step.prototype, "dataTable", void 0); +export class TableCell { + constructor() { + this.location = new Location(); + this.value = ''; + } +} +__decorate([ + Type(() => Location) +], TableCell.prototype, "location", void 0); +export class TableRow { + constructor() { + this.location = new Location(); + this.cells = []; + this.id = ''; + } +} +__decorate([ + Type(() => Location) +], TableRow.prototype, "location", void 0); +__decorate([ + Type(() => TableCell) +], TableRow.prototype, "cells", void 0); +export class Tag { + constructor() { + this.location = new Location(); + this.name = ''; + this.id = ''; + } +} +__decorate([ + Type(() => Location) +], Tag.prototype, "location", void 0); +export class Hook { + constructor() { + this.id = ''; + this.sourceReference = new SourceReference(); + } +} +__decorate([ + Type(() => SourceReference) +], Hook.prototype, "sourceReference", void 0); +export class Location { + constructor() { + this.line = 0; + } +} +export class Meta { + constructor() { + this.protocolVersion = ''; + this.implementation = new Product(); + this.runtime = new Product(); + this.os = new Product(); + this.cpu = new Product(); + } +} +__decorate([ + Type(() => Product) +], Meta.prototype, "implementation", void 0); +__decorate([ + Type(() => Product) +], Meta.prototype, "runtime", void 0); +__decorate([ + Type(() => Product) +], Meta.prototype, "os", void 0); +__decorate([ + Type(() => Product) +], Meta.prototype, "cpu", void 0); +__decorate([ + Type(() => Ci) +], Meta.prototype, "ci", void 0); +export class Ci { + constructor() { + this.name = ''; + } +} +__decorate([ + Type(() => Git) +], Ci.prototype, "git", void 0); +export class Git { + constructor() { + this.remote = ''; + this.revision = ''; + } +} +export class Product { + constructor() { + this.name = ''; + } +} +export class ParameterType { + constructor() { + this.name = ''; + this.regularExpressions = []; + this.preferForRegularExpressionMatch = false; + this.useForSnippets = false; + this.id = ''; + } +} +__decorate([ + Type(() => SourceReference) +], ParameterType.prototype, "sourceReference", void 0); +export class ParseError { + constructor() { + this.source = new SourceReference(); + this.message = ''; + } +} +__decorate([ + Type(() => SourceReference) +], ParseError.prototype, "source", void 0); +export class Pickle { + constructor() { + this.id = ''; + this.uri = ''; + this.name = ''; + this.language = ''; + this.steps = []; + this.tags = []; + this.astNodeIds = []; + } +} +__decorate([ + Type(() => Location) +], Pickle.prototype, "location", void 0); +__decorate([ + Type(() => PickleStep) +], Pickle.prototype, "steps", void 0); +__decorate([ + Type(() => PickleTag) +], Pickle.prototype, "tags", void 0); +export class PickleDocString { + constructor() { + this.content = ''; + } +} +export class PickleStep { + constructor() { + this.astNodeIds = []; + this.id = ''; + this.text = ''; + } +} +__decorate([ + Type(() => PickleStepArgument) +], PickleStep.prototype, "argument", void 0); +export class PickleStepArgument { +} +__decorate([ + Type(() => PickleDocString) +], PickleStepArgument.prototype, "docString", void 0); +__decorate([ + Type(() => PickleTable) +], PickleStepArgument.prototype, "dataTable", void 0); +export class PickleTable { + constructor() { + this.rows = []; + } +} +__decorate([ + Type(() => PickleTableRow) +], PickleTable.prototype, "rows", void 0); +export class PickleTableCell { + constructor() { + this.value = ''; + } +} +export class PickleTableRow { + constructor() { + this.cells = []; + } +} +__decorate([ + Type(() => PickleTableCell) +], PickleTableRow.prototype, "cells", void 0); +export class PickleTag { + constructor() { + this.name = ''; + this.astNodeId = ''; + } +} +export class Source { + constructor() { + this.uri = ''; + this.data = ''; + this.mediaType = SourceMediaType.TEXT_X_CUCUMBER_GHERKIN_PLAIN; + } +} +export class SourceReference { +} +__decorate([ + Type(() => JavaMethod) +], SourceReference.prototype, "javaMethod", void 0); +__decorate([ + Type(() => JavaStackTraceElement) +], SourceReference.prototype, "javaStackTraceElement", void 0); +__decorate([ + Type(() => Location) +], SourceReference.prototype, "location", void 0); +export class JavaMethod { + constructor() { + this.className = ''; + this.methodName = ''; + this.methodParameterTypes = []; + } +} +export class JavaStackTraceElement { + constructor() { + this.className = ''; + this.fileName = ''; + this.methodName = ''; + } +} +export class StepDefinition { + constructor() { + this.id = ''; + this.pattern = new StepDefinitionPattern(); + this.sourceReference = new SourceReference(); + } +} +__decorate([ + Type(() => StepDefinitionPattern) +], StepDefinition.prototype, "pattern", void 0); +__decorate([ + Type(() => SourceReference) +], StepDefinition.prototype, "sourceReference", void 0); +export class StepDefinitionPattern { + constructor() { + this.source = ''; + this.type = StepDefinitionPatternType.CUCUMBER_EXPRESSION; + } +} +export class Suggestion { + constructor() { + this.id = ''; + this.pickleStepId = ''; + this.snippets = []; + } +} +__decorate([ + Type(() => Snippet) +], Suggestion.prototype, "snippets", void 0); +export class Snippet { + constructor() { + this.language = ''; + this.code = ''; + } +} +export class TestCase { + constructor() { + this.id = ''; + this.pickleId = ''; + this.testSteps = []; + } +} +__decorate([ + Type(() => TestStep) +], TestCase.prototype, "testSteps", void 0); +export class Group { +} +__decorate([ + Type(() => Group) +], Group.prototype, "children", void 0); +export class StepMatchArgument { + constructor() { + this.group = new Group(); + } +} +__decorate([ + Type(() => Group) +], StepMatchArgument.prototype, "group", void 0); +export class StepMatchArgumentsList { + constructor() { + this.stepMatchArguments = []; + } +} +__decorate([ + Type(() => StepMatchArgument) +], StepMatchArgumentsList.prototype, "stepMatchArguments", void 0); +export class TestStep { + constructor() { + this.id = ''; + } +} +__decorate([ + Type(() => StepMatchArgumentsList) +], TestStep.prototype, "stepMatchArgumentsLists", void 0); +export class TestCaseFinished { + constructor() { + this.testCaseStartedId = ''; + this.timestamp = new Timestamp(); + this.willBeRetried = false; + } +} +__decorate([ + Type(() => Timestamp) +], TestCaseFinished.prototype, "timestamp", void 0); +export class TestCaseStarted { + constructor() { + this.attempt = 0; + this.id = ''; + this.testCaseId = ''; + this.timestamp = new Timestamp(); + } +} +__decorate([ + Type(() => Timestamp) +], TestCaseStarted.prototype, "timestamp", void 0); +export class TestRunFinished { + constructor() { + this.success = false; + this.timestamp = new Timestamp(); + } +} +__decorate([ + Type(() => Timestamp) +], TestRunFinished.prototype, "timestamp", void 0); +__decorate([ + Type(() => Exception) +], TestRunFinished.prototype, "exception", void 0); +export class TestRunHookFinished { + constructor() { + this.testRunHookStartedId = ''; + this.result = new TestStepResult(); + this.timestamp = new Timestamp(); + } +} +__decorate([ + Type(() => TestStepResult) +], TestRunHookFinished.prototype, "result", void 0); +__decorate([ + Type(() => Timestamp) +], TestRunHookFinished.prototype, "timestamp", void 0); +export class TestRunHookStarted { + constructor() { + this.id = ''; + this.testRunStartedId = ''; + this.hookId = ''; + this.timestamp = new Timestamp(); + } +} +__decorate([ + Type(() => Timestamp) +], TestRunHookStarted.prototype, "timestamp", void 0); +export class TestRunStarted { + constructor() { + this.timestamp = new Timestamp(); + } +} +__decorate([ + Type(() => Timestamp) +], TestRunStarted.prototype, "timestamp", void 0); +export class TestStepFinished { + constructor() { + this.testCaseStartedId = ''; + this.testStepId = ''; + this.testStepResult = new TestStepResult(); + this.timestamp = new Timestamp(); + } +} +__decorate([ + Type(() => TestStepResult) +], TestStepFinished.prototype, "testStepResult", void 0); +__decorate([ + Type(() => Timestamp) +], TestStepFinished.prototype, "timestamp", void 0); +export class TestStepResult { + constructor() { + this.duration = new Duration(); + this.status = TestStepResultStatus.UNKNOWN; + } +} +__decorate([ + Type(() => Duration) +], TestStepResult.prototype, "duration", void 0); +__decorate([ + Type(() => Exception) +], TestStepResult.prototype, "exception", void 0); +export class TestStepStarted { + constructor() { + this.testCaseStartedId = ''; + this.testStepId = ''; + this.timestamp = new Timestamp(); + } +} +__decorate([ + Type(() => Timestamp) +], TestStepStarted.prototype, "timestamp", void 0); +export class Timestamp { + constructor() { + this.seconds = 0; + this.nanos = 0; + } +} +export class UndefinedParameterType { + constructor() { + this.expression = ''; + this.name = ''; + } +} +export var AttachmentContentEncoding; +(function (AttachmentContentEncoding) { + AttachmentContentEncoding["IDENTITY"] = "IDENTITY"; + AttachmentContentEncoding["BASE64"] = "BASE64"; +})(AttachmentContentEncoding || (AttachmentContentEncoding = {})); +export var HookType; +(function (HookType) { + HookType["BEFORE_TEST_RUN"] = "BEFORE_TEST_RUN"; + HookType["AFTER_TEST_RUN"] = "AFTER_TEST_RUN"; + HookType["BEFORE_TEST_CASE"] = "BEFORE_TEST_CASE"; + HookType["AFTER_TEST_CASE"] = "AFTER_TEST_CASE"; + HookType["BEFORE_TEST_STEP"] = "BEFORE_TEST_STEP"; + HookType["AFTER_TEST_STEP"] = "AFTER_TEST_STEP"; +})(HookType || (HookType = {})); +export var PickleStepType; +(function (PickleStepType) { + PickleStepType["UNKNOWN"] = "Unknown"; + PickleStepType["CONTEXT"] = "Context"; + PickleStepType["ACTION"] = "Action"; + PickleStepType["OUTCOME"] = "Outcome"; +})(PickleStepType || (PickleStepType = {})); +export var SourceMediaType; +(function (SourceMediaType) { + SourceMediaType["TEXT_X_CUCUMBER_GHERKIN_PLAIN"] = "text/x.cucumber.gherkin+plain"; + SourceMediaType["TEXT_X_CUCUMBER_GHERKIN_MARKDOWN"] = "text/x.cucumber.gherkin+markdown"; +})(SourceMediaType || (SourceMediaType = {})); +export var StepDefinitionPatternType; +(function (StepDefinitionPatternType) { + StepDefinitionPatternType["CUCUMBER_EXPRESSION"] = "CUCUMBER_EXPRESSION"; + StepDefinitionPatternType["REGULAR_EXPRESSION"] = "REGULAR_EXPRESSION"; +})(StepDefinitionPatternType || (StepDefinitionPatternType = {})); +export var StepKeywordType; +(function (StepKeywordType) { + StepKeywordType["UNKNOWN"] = "Unknown"; + StepKeywordType["CONTEXT"] = "Context"; + StepKeywordType["ACTION"] = "Action"; + StepKeywordType["OUTCOME"] = "Outcome"; + StepKeywordType["CONJUNCTION"] = "Conjunction"; +})(StepKeywordType || (StepKeywordType = {})); +export var TestStepResultStatus; +(function (TestStepResultStatus) { + TestStepResultStatus["UNKNOWN"] = "UNKNOWN"; + TestStepResultStatus["PASSED"] = "PASSED"; + TestStepResultStatus["SKIPPED"] = "SKIPPED"; + TestStepResultStatus["PENDING"] = "PENDING"; + TestStepResultStatus["UNDEFINED"] = "UNDEFINED"; + TestStepResultStatus["AMBIGUOUS"] = "AMBIGUOUS"; + TestStepResultStatus["FAILED"] = "FAILED"; +})(TestStepResultStatus || (TestStepResultStatus = {})); +//# sourceMappingURL=messages.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/src/messages.js.map b/node_modules/@cucumber/messages/dist/esm/src/messages.js.map new file mode 100644 index 00000000..e52de679 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/src/messages.js.map @@ -0,0 +1 @@ +{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/messages.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/src/parseEnvelope.d.ts b/node_modules/@cucumber/messages/dist/esm/src/parseEnvelope.d.ts new file mode 100644 index 00000000..da998944 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/src/parseEnvelope.d.ts @@ -0,0 +1,8 @@ +import { Envelope } from './messages.js'; +/** + * Parses JSON into an Envelope object. The difference from JSON.parse + * is that the resulting objects will have default values (defined in the JSON Schema) + * for properties that are absent from the JSON. + */ +export declare function parseEnvelope(json: string): Envelope; +//# sourceMappingURL=parseEnvelope.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/src/parseEnvelope.d.ts.map b/node_modules/@cucumber/messages/dist/esm/src/parseEnvelope.d.ts.map new file mode 100644 index 00000000..f73de815 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/src/parseEnvelope.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"parseEnvelope.d.ts","sourceRoot":"","sources":["../../../src/parseEnvelope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAGxC;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAGpD"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/src/parseEnvelope.js b/node_modules/@cucumber/messages/dist/esm/src/parseEnvelope.js new file mode 100644 index 00000000..ac8d7bf4 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/src/parseEnvelope.js @@ -0,0 +1,12 @@ +import { Envelope } from './messages.js'; +import { plainToClass } from 'class-transformer'; +/** + * Parses JSON into an Envelope object. The difference from JSON.parse + * is that the resulting objects will have default values (defined in the JSON Schema) + * for properties that are absent from the JSON. + */ +export function parseEnvelope(json) { + const plain = JSON.parse(json); + return plainToClass(Envelope, plain); +} +//# sourceMappingURL=parseEnvelope.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/src/parseEnvelope.js.map b/node_modules/@cucumber/messages/dist/esm/src/parseEnvelope.js.map new file mode 100644 index 00000000..0466d0ee --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/src/parseEnvelope.js.map @@ -0,0 +1 @@ +{"version":3,"file":"parseEnvelope.js","sourceRoot":"","sources":["../../../src/parseEnvelope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC9B,OAAO,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;AACtC,CAAC"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/src/version.d.ts b/node_modules/@cucumber/messages/dist/esm/src/version.d.ts new file mode 100644 index 00000000..72cb814b --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/src/version.d.ts @@ -0,0 +1,2 @@ +export declare const version = "32.2.0"; +//# sourceMappingURL=version.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/src/version.d.ts.map b/node_modules/@cucumber/messages/dist/esm/src/version.d.ts.map new file mode 100644 index 00000000..042c9575 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/src/version.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,OAAO,WAAW,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/src/version.js b/node_modules/@cucumber/messages/dist/esm/src/version.js new file mode 100644 index 00000000..67426831 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/src/version.js @@ -0,0 +1,3 @@ +// This file is automatically generated using npm scripts +export const version = '32.2.0'; +//# sourceMappingURL=version.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/src/version.js.map b/node_modules/@cucumber/messages/dist/esm/src/version.js.map new file mode 100644 index 00000000..12a37079 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/src/version.js.map @@ -0,0 +1 @@ +{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/test/IdGeneratorTest.d.ts b/node_modules/@cucumber/messages/dist/esm/test/IdGeneratorTest.d.ts new file mode 100644 index 00000000..d1488fba --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/test/IdGeneratorTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=IdGeneratorTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/test/IdGeneratorTest.d.ts.map b/node_modules/@cucumber/messages/dist/esm/test/IdGeneratorTest.d.ts.map new file mode 100644 index 00000000..93f290bf --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/test/IdGeneratorTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"IdGeneratorTest.d.ts","sourceRoot":"","sources":["../../../test/IdGeneratorTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/test/IdGeneratorTest.js b/node_modules/@cucumber/messages/dist/esm/test/IdGeneratorTest.js new file mode 100644 index 00000000..a80a5bdd --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/test/IdGeneratorTest.js @@ -0,0 +1,16 @@ +import assert from "node:assert"; +import { IdGenerator } from "../src/index.js"; +describe('IdGenerator', () => { + it('generates uuids', () => { + const generator = IdGenerator.uuid(); + const result = generator(); + assert.equal(result.length, 36); + }); + it('increments ids', () => { + const generator = IdGenerator.incrementing(); + assert.equal(generator(), '0'); + assert.equal(generator(), '1'); + assert.equal(generator(), '2'); + }); +}); +//# sourceMappingURL=IdGeneratorTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/test/IdGeneratorTest.js.map b/node_modules/@cucumber/messages/dist/esm/test/IdGeneratorTest.js.map new file mode 100644 index 00000000..889efaa2 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/test/IdGeneratorTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IdGeneratorTest.js","sourceRoot":"","sources":["../../../test/IdGeneratorTest.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,EAAC,WAAW,EAAC,MAAM,iBAAiB,CAAA;AAE3C,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;QACzB,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,EAAE,CAAA;QACpC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;QAC1B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;QACxB,MAAM,SAAS,GAAG,WAAW,CAAC,YAAY,EAAE,CAAA;QAC5C,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,GAAG,CAAC,CAAA;QAC9B,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,GAAG,CAAC,CAAA;QAC9B,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,GAAG,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/test/TimeConversionTest.d.ts b/node_modules/@cucumber/messages/dist/esm/test/TimeConversionTest.d.ts new file mode 100644 index 00000000..0ecf182b --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/test/TimeConversionTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=TimeConversionTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/test/TimeConversionTest.d.ts.map b/node_modules/@cucumber/messages/dist/esm/test/TimeConversionTest.d.ts.map new file mode 100644 index 00000000..af1bc3b9 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/test/TimeConversionTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"TimeConversionTest.d.ts","sourceRoot":"","sources":["../../../test/TimeConversionTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/test/TimeConversionTest.js b/node_modules/@cucumber/messages/dist/esm/test/TimeConversionTest.js new file mode 100644 index 00000000..b5f9d11a --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/test/TimeConversionTest.js @@ -0,0 +1,62 @@ +import assert from 'assert'; +import { TimeConversion } from '../src/index.js'; +import { addDurations } from '../src/TimeConversion.js'; +const { durationToMilliseconds, millisecondsSinceEpochToTimestamp, millisecondsToDuration, timestampToMillisecondsSinceEpoch, } = TimeConversion; +describe('TimeConversion', () => { + it('converts legacy string seconds', () => { + const duration = { + // @ts-ignore + seconds: '3', + nanos: 40000, + }; + const millis = durationToMilliseconds(duration); + assert.strictEqual(millis, 3000.04); + }); + it('converts to and from milliseconds since epoch', () => { + const millisecondsSinceEpoch = Date.now(); + const timestamp = millisecondsSinceEpochToTimestamp(millisecondsSinceEpoch); + const jsEpochMillisAgain = timestampToMillisecondsSinceEpoch(timestamp); + assert.strictEqual(jsEpochMillisAgain, millisecondsSinceEpoch); + }); + it('converts to and from milliseconds duration', () => { + const durationInMilliseconds = 1234; + const duration = millisecondsToDuration(durationInMilliseconds); + const durationMillisAgain = durationToMilliseconds(duration); + assert.strictEqual(durationMillisAgain, durationInMilliseconds); + }); + it('converts to and from milliseconds duration (with decimal places)', () => { + const durationInMilliseconds = 3.000161; + const duration = millisecondsToDuration(durationInMilliseconds); + const durationMillisAgain = durationToMilliseconds(duration); + assert.strictEqual(durationMillisAgain, durationInMilliseconds); + }); + it('adds durations (nanos only)', () => { + const durationA = millisecondsToDuration(100); + const durationB = millisecondsToDuration(200); + const sumDuration = addDurations(durationA, durationB); + assert.deepStrictEqual(sumDuration, { seconds: 0, nanos: 3e8 }); + }); + it('adds durations (seconds only)', () => { + const durationA = millisecondsToDuration(1000); + const durationB = millisecondsToDuration(2000); + const sumDuration = addDurations(durationA, durationB); + assert.deepStrictEqual(sumDuration, { seconds: 3, nanos: 0 }); + }); + it('adds durations (seconds and nanos)', () => { + const durationA = millisecondsToDuration(1500); + const durationB = millisecondsToDuration(1600); + const sumDuration = addDurations(durationA, durationB); + assert.deepStrictEqual(sumDuration, { seconds: 3, nanos: 1e8 }); + }); + it('adds durations (seconds and nanos) with legacy string seconds', () => { + const durationA = millisecondsToDuration(1500); + // @ts-ignore + durationA.seconds = String(durationA.seconds); + const durationB = millisecondsToDuration(1600); + // @ts-ignore + durationB.seconds = String(durationB.seconds); + const sumDuration = addDurations(durationA, durationB); + assert.deepStrictEqual(sumDuration, { seconds: 3, nanos: 1e8 }); + }); +}); +//# sourceMappingURL=TimeConversionTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/test/TimeConversionTest.js.map b/node_modules/@cucumber/messages/dist/esm/test/TimeConversionTest.js.map new file mode 100644 index 00000000..fcc674ce --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/test/TimeConversionTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TimeConversionTest.js","sourceRoot":"","sources":["../../../test/TimeConversionTest.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAY,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAEvD,MAAM,EACJ,sBAAsB,EACtB,iCAAiC,EACjC,sBAAsB,EACtB,iCAAiC,GAClC,GAAG,cAAc,CAAA;AAElB,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,QAAQ,GAAa;YACzB,aAAa;YACb,OAAO,EAAE,GAAG;YACZ,KAAK,EAAE,KAAK;SACb,CAAA;QACD,MAAM,MAAM,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAA;QAE/C,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,sBAAsB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACzC,MAAM,SAAS,GAAG,iCAAiC,CAAC,sBAAsB,CAAC,CAAA;QAC3E,MAAM,kBAAkB,GAAG,iCAAiC,CAAC,SAAS,CAAC,CAAA;QAEvE,MAAM,CAAC,WAAW,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,sBAAsB,GAAG,IAAI,CAAA;QACnC,MAAM,QAAQ,GAAG,sBAAsB,CAAC,sBAAsB,CAAC,CAAA;QAC/D,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAA;QAE5D,MAAM,CAAC,WAAW,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,sBAAsB,GAAG,QAAQ,CAAA;QACvC,MAAM,QAAQ,GAAG,sBAAsB,CAAC,sBAAsB,CAAC,CAAA;QAC/D,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAA;QAE5D,MAAM,CAAC,WAAW,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,SAAS,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAA;QAC7C,MAAM,SAAS,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAA;QAC7C,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QAEtD,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,SAAS,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAA;QAC9C,MAAM,SAAS,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAA;QAC9C,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QAEtD,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;IAC/D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,SAAS,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAA;QAC9C,MAAM,SAAS,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAA;QAC9C,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QAEtD,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,SAAS,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAA;QAC9C,aAAa;QACb,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QAC7C,MAAM,SAAS,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAA;QAC9C,aAAa;QACb,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QAC7C,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QAEtD,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/test/getWorstTestStepResultsTest.d.ts b/node_modules/@cucumber/messages/dist/esm/test/getWorstTestStepResultsTest.d.ts new file mode 100644 index 00000000..6fe555da --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/test/getWorstTestStepResultsTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=getWorstTestStepResultsTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/test/getWorstTestStepResultsTest.d.ts.map b/node_modules/@cucumber/messages/dist/esm/test/getWorstTestStepResultsTest.d.ts.map new file mode 100644 index 00000000..09c5969d --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/test/getWorstTestStepResultsTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"getWorstTestStepResultsTest.d.ts","sourceRoot":"","sources":["../../../test/getWorstTestStepResultsTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/test/getWorstTestStepResultsTest.js b/node_modules/@cucumber/messages/dist/esm/test/getWorstTestStepResultsTest.js new file mode 100644 index 00000000..70cb25f3 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/test/getWorstTestStepResultsTest.js @@ -0,0 +1,23 @@ +import { getWorstTestStepResult } from '../src/getWorstTestStepResult.js'; +import { TestStepResultStatus } from '../src/messages.js'; +import assert from 'assert'; +describe('getWorstTestStepResult', () => { + it('returns a FAILED result for PASSED,FAILED,PASSED', () => { + const result = getWorstTestStepResult([ + { + status: TestStepResultStatus.PASSED, + duration: { seconds: 0, nanos: 0 }, + }, + { + status: TestStepResultStatus.FAILED, + duration: { seconds: 0, nanos: 0 }, + }, + { + status: TestStepResultStatus.PASSED, + duration: { seconds: 0, nanos: 0 }, + }, + ]); + assert.strictEqual(result.status, TestStepResultStatus.FAILED); + }); +}); +//# sourceMappingURL=getWorstTestStepResultsTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/test/getWorstTestStepResultsTest.js.map b/node_modules/@cucumber/messages/dist/esm/test/getWorstTestStepResultsTest.js.map new file mode 100644 index 00000000..9c4984ea --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/test/getWorstTestStepResultsTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"getWorstTestStepResultsTest.js","sourceRoot":"","sources":["../../../test/getWorstTestStepResultsTest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,MAAM,MAAM,QAAQ,CAAA;AAE3B,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,MAAM,GAAG,sBAAsB,CAAC;YACpC;gBACE,MAAM,EAAE,oBAAoB,CAAC,MAAM;gBACnC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;aACnC;YACD;gBACE,MAAM,EAAE,oBAAoB,CAAC,MAAM;gBACnC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;aACnC;YACD;gBACE,MAAM,EAAE,oBAAoB,CAAC,MAAM;gBACnC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;aACnC;SACF,CAAC,CAAA;QACF,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/test/messagesTest.d.ts b/node_modules/@cucumber/messages/dist/esm/test/messagesTest.d.ts new file mode 100644 index 00000000..7b7022b4 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/test/messagesTest.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=messagesTest.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/test/messagesTest.d.ts.map b/node_modules/@cucumber/messages/dist/esm/test/messagesTest.d.ts.map new file mode 100644 index 00000000..601766c6 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/test/messagesTest.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"messagesTest.d.ts","sourceRoot":"","sources":["../../../test/messagesTest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/test/messagesTest.js b/node_modules/@cucumber/messages/dist/esm/test/messagesTest.js new file mode 100644 index 00000000..338286f0 --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/test/messagesTest.js @@ -0,0 +1,82 @@ +import assert from 'assert'; +import { parseEnvelope, StepKeywordType } from '../src/index.js'; +describe('messages', () => { + it('defaults missing fields when deserialising from JSON', () => { + // Sample envelope from before we moved from protobuf to JSON Schema + const partialGherkinDocumentEnvelope = { + gherkinDocument: { + feature: { + children: [ + { + scenario: { + id: '1', + keyword: 'Scenario', + location: { column: 3, line: 3 }, + name: 'minimalistic', + steps: [ + { + id: '0', + keyword: 'Given ', + keywordType: StepKeywordType.CONTEXT, + location: { column: 5, line: 4 }, + text: 'the minimalism', + }, + ], + }, + }, + ], + keyword: 'Feature', + language: 'en', + location: { column: 1, line: 1 }, + name: 'Minimal', + }, + uri: 'testdata/good/minimal.feature', + }, + }; + const envelope = parseEnvelope(JSON.stringify(partialGherkinDocumentEnvelope)); + const expectedEnvelope = { + gherkinDocument: { + // new + comments: [], + feature: { + // new + tags: [], + // new + description: '', + children: [ + { + scenario: { + // new + examples: [], + // new + description: '', + // new + tags: [], + id: '1', + keyword: 'Scenario', + location: { column: 3, line: 3 }, + name: 'minimalistic', + steps: [ + { + id: '0', + keyword: 'Given ', + keywordType: StepKeywordType.CONTEXT, + location: { column: 5, line: 4 }, + text: 'the minimalism', + }, + ], + }, + }, + ], + keyword: 'Feature', + language: 'en', + location: { column: 1, line: 1 }, + name: 'Minimal', + }, + uri: 'testdata/good/minimal.feature', + }, + }; + assert.deepStrictEqual(JSON.parse(JSON.stringify(envelope)), JSON.parse(JSON.stringify(expectedEnvelope))); + }); +}); +//# sourceMappingURL=messagesTest.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/test/messagesTest.js.map b/node_modules/@cucumber/messages/dist/esm/test/messagesTest.js.map new file mode 100644 index 00000000..cf46fcff --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/test/messagesTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"messagesTest.js","sourceRoot":"","sources":["../../../test/messagesTest.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAY,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAE1E,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,oEAAoE;QACpE,MAAM,8BAA8B,GAAG;YACrC,eAAe,EAAE;gBACf,OAAO,EAAE;oBACP,QAAQ,EAAE;wBACR;4BACE,QAAQ,EAAE;gCACR,EAAE,EAAE,GAAG;gCACP,OAAO,EAAE,UAAU;gCACnB,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;gCAChC,IAAI,EAAE,cAAc;gCACpB,KAAK,EAAE;oCACL;wCACE,EAAE,EAAE,GAAG;wCACP,OAAO,EAAE,QAAQ;wCACjB,WAAW,EAAE,eAAe,CAAC,OAAO;wCACpC,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;wCAChC,IAAI,EAAE,gBAAgB;qCACvB;iCACF;6BACF;yBACF;qBACF;oBACD,OAAO,EAAE,SAAS;oBAClB,QAAQ,EAAE,IAAI;oBACd,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;oBAChC,IAAI,EAAE,SAAS;iBAChB;gBACD,GAAG,EAAE,+BAA+B;aACrC;SACF,CAAA;QAED,MAAM,QAAQ,GAAa,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC,CAAA;QACxF,MAAM,gBAAgB,GAAa;YACjC,eAAe,EAAE;gBACf,MAAM;gBACN,QAAQ,EAAE,EAAE;gBACZ,OAAO,EAAE;oBACP,MAAM;oBACN,IAAI,EAAE,EAAE;oBACR,MAAM;oBACN,WAAW,EAAE,EAAE;oBACf,QAAQ,EAAE;wBACR;4BACE,QAAQ,EAAE;gCACR,MAAM;gCACN,QAAQ,EAAE,EAAE;gCACZ,MAAM;gCACN,WAAW,EAAE,EAAE;gCACf,MAAM;gCACN,IAAI,EAAE,EAAE;gCACR,EAAE,EAAE,GAAG;gCACP,OAAO,EAAE,UAAU;gCACnB,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;gCAChC,IAAI,EAAE,cAAc;gCACpB,KAAK,EAAE;oCACL;wCACE,EAAE,EAAE,GAAG;wCACP,OAAO,EAAE,QAAQ;wCACjB,WAAW,EAAE,eAAe,CAAC,OAAO;wCACpC,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;wCAChC,IAAI,EAAE,gBAAgB;qCACvB;iCACF;6BACF;yBACF;qBACF;oBACD,OAAO,EAAE,SAAS;oBAClB,QAAQ,EAAE,IAAI;oBACd,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;oBAChC,IAAI,EAAE,SAAS;iBAChB;gBACD,GAAG,EAAE,+BAA+B;aACrC;SACF,CAAA;QAED,MAAM,CAAC,eAAe,CACpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EACpC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAC7C,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/dist/esm/tsconfig.build-esm.tsbuildinfo b/node_modules/@cucumber/messages/dist/esm/tsconfig.build-esm.tsbuildinfo new file mode 100644 index 00000000..aa72bdfd --- /dev/null +++ b/node_modules/@cucumber/messages/dist/esm/tsconfig.build-esm.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../src/IdGenerator.ts","../../node_modules/class-transformer/types/interfaces/decorator-options/expose-options.interface.d.ts","../../node_modules/class-transformer/types/interfaces/decorator-options/exclude-options.interface.d.ts","../../node_modules/class-transformer/types/interfaces/decorator-options/transform-options.interface.d.ts","../../node_modules/class-transformer/types/interfaces/decorator-options/type-discriminator-descriptor.interface.d.ts","../../node_modules/class-transformer/types/interfaces/decorator-options/type-options.interface.d.ts","../../node_modules/class-transformer/types/interfaces/metadata/exclude-metadata.interface.d.ts","../../node_modules/class-transformer/types/interfaces/metadata/expose-metadata.interface.d.ts","../../node_modules/class-transformer/types/enums/transformation-type.enum.d.ts","../../node_modules/class-transformer/types/enums/index.d.ts","../../node_modules/class-transformer/types/interfaces/target-map.interface.d.ts","../../node_modules/class-transformer/types/interfaces/class-transformer-options.interface.d.ts","../../node_modules/class-transformer/types/interfaces/metadata/transform-fn-params.interface.d.ts","../../node_modules/class-transformer/types/interfaces/metadata/transform-metadata.interface.d.ts","../../node_modules/class-transformer/types/interfaces/metadata/type-metadata.interface.d.ts","../../node_modules/class-transformer/types/interfaces/class-constructor.type.d.ts","../../node_modules/class-transformer/types/interfaces/type-help-options.interface.d.ts","../../node_modules/class-transformer/types/interfaces/index.d.ts","../../node_modules/class-transformer/types/ClassTransformer.d.ts","../../node_modules/class-transformer/types/decorators/exclude.decorator.d.ts","../../node_modules/class-transformer/types/decorators/expose.decorator.d.ts","../../node_modules/class-transformer/types/decorators/transform-instance-to-instance.decorator.d.ts","../../node_modules/class-transformer/types/decorators/transform-instance-to-plain.decorator.d.ts","../../node_modules/class-transformer/types/decorators/transform-plain-to-instance.decorator.d.ts","../../node_modules/class-transformer/types/decorators/transform.decorator.d.ts","../../node_modules/class-transformer/types/decorators/type.decorator.d.ts","../../node_modules/class-transformer/types/decorators/index.d.ts","../../node_modules/class-transformer/types/index.d.ts","../../node_modules/reflect-metadata/index.d.ts","../../src/messages.ts","../../src/TimeConversion.ts","../../src/getWorstTestStepResult.ts","../../src/parseEnvelope.ts","../../src/version.ts","../../src/index.ts","../../test/IdGeneratorTest.ts","../../test/TimeConversionTest.ts","../../test/getWorstTestStepResultsTest.ts","../../test/messagesTest.ts","../../node_modules/@types/mocha/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/@types/node/web-globals/events.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/inspector.generated.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts"],"fileIdsList":[[91,139,156,157],[91,136,137,139,156,157],[91,138,139,156,157],[139,156,157],[91,139,144,156,157,174],[91,139,140,145,150,156,157,159,171,182],[91,139,140,141,150,156,157,159],[86,87,88,91,139,156,157],[91,139,142,156,157,183],[91,139,143,144,151,156,157,160],[91,139,144,156,157,171,179],[91,139,145,147,150,156,157,159],[91,138,139,146,156,157],[91,139,147,148,156,157],[91,139,149,150,156,157],[91,138,139,150,156,157],[91,139,150,151,152,156,157,171,182],[91,139,150,151,152,156,157,166,171,174],[91,132,139,147,150,153,156,157,159,171,182],[91,139,150,151,153,154,156,157,159,171,179,182],[91,139,153,155,156,157,171,179,182],[89,90,91,92,93,94,95,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188],[91,139,150,156,157],[91,139,156,157,158,182],[91,139,147,150,156,157,159,171],[91,139,156,157,160],[91,139,156,157,161],[91,138,139,156,157,162],[91,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188],[91,139,156,157,164],[91,139,156,157,165],[91,139,150,156,157,166,167],[91,139,156,157,166,168,183,185],[91,139,151,156,157],[91,139,150,156,157,171,172,174],[91,139,156,157,173,174],[91,139,156,157,171,172],[91,139,156,157,174],[91,139,156,157,175],[91,136,139,156,157,171,176,182],[91,139,150,156,157,177,178],[91,139,156,157,177,178],[91,139,144,156,157,159,171,179],[91,139,156,157,180],[91,139,156,157,159,181],[91,139,153,156,157,165,182],[91,139,144,156,157,183],[91,139,156,157,171,184],[91,139,156,157,158,185],[91,139,156,157,186],[91,132,139,156,157],[91,132,139,150,152,156,157,162,171,174,182,184,185,187],[91,139,156,157,171,188],[63,91,139,156,157],[65,66,67,68,69,70,71,91,139,156,157],[54,91,139,156,157],[55,63,64,72,91,139,156,157],[56,91,139,156,157],[50,91,139,156,157],[47,48,49,50,51,52,53,56,57,58,59,60,61,62,91,139,156,157],[55,57,91,139,156,157],[58,63,91,139,156,157],[91,104,108,139,156,157,182],[91,104,139,156,157,171,182],[91,99,139,156,157],[91,101,104,139,156,157,179,182],[91,139,156,157,159,179],[91,139,156,157,189],[91,99,139,156,157,189],[91,101,104,139,156,157,159,182],[91,96,97,100,103,139,150,156,157,171,182],[91,104,111,139,156,157],[91,96,102,139,156,157],[91,104,125,126,139,156,157],[91,100,104,139,156,157,174,182,189],[91,125,139,156,157,189],[91,98,99,139,156,157,189],[91,104,139,156,157],[91,98,99,100,101,102,103,104,105,106,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,126,127,128,129,130,131,139,156,157],[91,104,119,139,156,157],[91,104,111,112,139,156,157],[91,102,104,112,113,139,156,157],[91,103,139,156,157],[91,96,99,104,139,156,157],[91,104,108,112,113,139,156,157],[91,108,139,156,157],[91,102,104,107,139,156,157,182],[91,96,101,104,111,139,156,157],[91,139,156,157,171],[91,99,104,125,139,156,157,187,189],[75,91,139,156,157],[75,76,91,139,156,157],[46,75,76,77,78,79,91,139,156,157],[73,74,91,139,156,157],[73,75,91,139,156,157],[80,91,136,139,156,157],[76,80,91,136,139,156,157],[75,77,91,136,139,156,157]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c97c731e5cc47991e603bf2fb9f1793105494bcc0847092998bd88b6b1934da","signature":"44716259b743dacde932f7f1922ac85f533af74e3ed82a078ba505414f6f6b53"},{"version":"b6e995b5ef6661f5636ff738e67e4ec90150768ef119ad74b473c404304408a1","impliedFormat":1},{"version":"5d470930bf6142d7cbda81c157869024527dc7911ba55d90b8387ef6e1585aa1","impliedFormat":1},{"version":"074483fdbf20b30bd450e54e6892e96ea093430c313e61be5fdfe51588baa2d6","impliedFormat":1},{"version":"b7e6a6a3495301360edb9e1474702db73d18be7803b3f5c6c05571212acccd16","impliedFormat":1},{"version":"aa7527285c94043f21baf6e337bc60a92c20b6efaa90859473f6476954ac5f79","impliedFormat":1},{"version":"dd3be6d9dcd79e46d192175a756546630f2dc89dab28073823c936557b977f26","impliedFormat":1},{"version":"8d0566152618a1da6536c75a5659c139522d67c63a9ae27e8228d76ab0420584","impliedFormat":1},{"version":"ba06bf784edafe0db0e2bd1f6ecf3465b81f6b1819871bf190a0e0137b5b7f18","impliedFormat":1},{"version":"a0500233cb989bcb78f5f1a81f51eabc06b5c39e3042c560a7489f022f1f55a3","impliedFormat":1},{"version":"220508b3fb6b773f49d8fb0765b04f90ef15caacf0f3d260e3412ed38f71ef09","impliedFormat":1},{"version":"1ad113089ad5c188fec4c9a339cb53d1bcbb65682407d6937557bb23a6e1d4e5","impliedFormat":1},{"version":"e56427c055602078cbf0e58e815960541136388f4fc62554813575508def98b6","impliedFormat":1},{"version":"1f58b0676a80db38df1ce19d15360c20ce9e983b35298a5d0b4aa4eb4fb67e0f","impliedFormat":1},{"version":"3d67e7eb73c6955ee27f1d845cae88923f75c8b0830d4b5440eea2339958e8ec","impliedFormat":1},{"version":"11fec302d58b56033ab07290a3abc29e9908e29d504db9468544b15c4cd7670d","impliedFormat":1},{"version":"c66d6817c931633650edf19a8644eea61aeeb84190c7219911cefa8ddea8bd9a","impliedFormat":1},{"version":"ab1359707e4fc610c5f37f1488063af65cda3badca6b692d44b95e8380e0f6c2","impliedFormat":1},{"version":"37deda160549729287645b3769cf126b0a17e7e2218737352676705a01d5957e","impliedFormat":1},{"version":"d80ffdd55e7f4bc69cde66933582b8592d3736d3b0d1d8cc63995a7b2bcca579","impliedFormat":1},{"version":"c9b71952b2178e8737b63079dba30e1b29872240b122905cbaba756cb60b32f5","impliedFormat":1},{"version":"b596585338b0d870f0e19e6b6bcbf024f76328f2c4f4e59745714e38ee9b0582","impliedFormat":1},{"version":"e6717fc103dfa1635947bf2b41161b5e4f2fabbcaf555754cc1b4340ec4ca587","impliedFormat":1},{"version":"c36186d7bdf1f525b7685ee5bf639e4b157b1e803a70c25f234d4762496f771f","impliedFormat":1},{"version":"026726932a4964341ab8544f12b912c8dfaa388d2936b71cc3eca0cffb49cc1d","impliedFormat":1},{"version":"83188d037c81bd27076218934ba9e1742ddb69cd8cc64cdb8a554078de38eb12","impliedFormat":1},{"version":"7d82f2d6a89f07c46c7e3e9071ab890124f95931d9c999ba8f865fa6ef6cbf72","impliedFormat":1},{"version":"4fc523037d14d9bb6ddb586621a93dd05b6c6d8d59919a40c436ca3ac29d9716","impliedFormat":1},{"version":"8d6d51a5118d000ed3bfe6e1dd1335bebfff3fef23cd2af2f84a24d30f90cc90","affectsGlobalScope":true,"impliedFormat":1},{"version":"c270488bdcc10c20550452f9bf6fcc1bd01eab0dfc7f0c6747abc19a2acd5f0e","signature":"a1387533f292cc1377923ba182557241ca949a2ca8495866dec169038c9e45a2"},{"version":"fd9ae11ee76d8d1993309456c4536d7024cecec15fc77dc1b4d7619556abc324","signature":"d9f4ec5156491a24eee340452d7e87e432512d5ebde23fe18c2ceb5a31c1720b"},{"version":"0e865bcd7cf3c305aeee04f6c76dd77de0f7e4b3173cf960bd4018b213525547","signature":"497efde09001124a1bfab8ea16409b6908fe8a49ae8d5d69082910838150fbfd"},{"version":"4866672a66505bfc3f8bd7f5f9cdbcd3927080b43095f73b6bfdf6a045d04fdf","signature":"653dc417862cf079d590653212a8d48ace7c89ff7b73c239791099afc25dca96"},{"version":"4112cfafe102f4a4cc44adb81a17cd895a854102130231735409a706570d22f6","signature":"881d8c5d323b9a03009e467e1fb7bc2a32da16a567ca29c9d484518cb02ce3f7"},{"version":"e6af11bf85a123ea9f9aee37c1e94008650a2609ac323f70eea1845a79d39a28","signature":"5ed925f9d0dfcb0fde32518c7ae42f88461fd8eabb015a35183fac5ce95bbc6c"},{"version":"9e4cf44d1d002801603e3a3883a5b338db29123a32143dfd8c703094998c8e4e","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"d32ac673e19a27547e53e00df484de018a9146acee28847619abd913088b4fc8","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"2717ea2c81ce0dc3855fe0647da5b0486b6ba0e3e7d9863b7e0491fcfa803d24","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"27acb37346bf964bc845b5cc6a9f3fc09d9002271c7dd144469ff00d2cfe923f","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"29f72ec1289ae3aeda78bf14b38086d3d803262ac13904b400422941a26a3636","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"58647d85d0f722a1ce9de50955df60a7489f0593bf1a7015521efe901c06d770","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6f137d651076822d4fe884287e68fd61785a0d3d1fdb250a5059b691fa897db","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"80523c00b8544a2000ae0143e4a90a00b47f99823eb7926c1e03c494216fc363","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"746911b62b329587939560deb5c036aca48aece03147b021fa680223255d5183","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c8d3e5a18ba35629954e48c4cc8f11dc88224650067a172685c736b27a34a4dc","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2b55d426ff2b9087485e52ac4bc7cfafe1dc420fc76dad926cd46526567c501a","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"358765d5ea8afd285d4fd1532e78b88273f18cb3f87403a9b16fef61ac9fdcfe","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1}],"root":[46,[75,84]],"options":{"allowJs":false,"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"declarationMap":true,"downlevelIteration":true,"esModuleInterop":true,"experimentalDecorators":true,"module":5,"noImplicitAny":true,"outDir":"./","rootDir":"../..","skipLibCheck":true,"sourceMap":true,"strictNullChecks":true,"target":2},"referencedMap":[[85,1],[136,2],[137,2],[138,3],[91,4],[139,5],[140,6],[141,7],[86,1],[89,8],[87,1],[88,1],[142,9],[143,10],[144,11],[145,12],[146,13],[147,14],[148,14],[149,15],[150,16],[151,17],[152,18],[92,1],[90,1],[153,19],[154,20],[155,21],[189,22],[156,23],[157,1],[158,24],[159,25],[160,26],[161,27],[162,28],[163,29],[164,30],[165,31],[166,32],[167,32],[168,33],[169,1],[170,34],[171,35],[173,36],[172,37],[174,38],[175,39],[176,40],[177,41],[178,42],[179,43],[180,44],[181,45],[182,46],[183,47],[184,48],[185,49],[186,50],[93,1],[94,1],[95,1],[133,51],[134,1],[135,1],[187,52],[188,53],[64,54],[65,54],[66,54],[72,55],[67,54],[68,54],[69,54],[70,54],[71,54],[55,56],[54,1],[73,57],[61,1],[57,58],[48,1],[47,1],[49,1],[50,54],[51,59],[63,60],[52,54],[53,54],[58,61],[59,62],[60,54],[56,1],[62,1],[74,1],[44,1],[45,1],[9,1],[8,1],[2,1],[10,1],[11,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[3,1],[18,1],[19,1],[4,1],[20,1],[24,1],[21,1],[22,1],[23,1],[25,1],[26,1],[27,1],[5,1],[28,1],[29,1],[30,1],[31,1],[6,1],[35,1],[32,1],[33,1],[34,1],[36,1],[7,1],[37,1],[42,1],[43,1],[38,1],[39,1],[40,1],[41,1],[1,1],[111,63],[121,64],[110,63],[131,65],[102,66],[101,67],[130,68],[124,69],[129,70],[104,71],[118,72],[103,73],[127,74],[99,75],[98,68],[128,76],[100,77],[105,78],[106,1],[109,78],[96,1],[132,79],[122,80],[113,81],[114,82],[116,83],[112,84],[115,85],[125,68],[107,86],[108,87],[117,88],[97,89],[120,80],[119,78],[123,1],[126,90],[46,1],[76,91],[77,92],[80,93],[75,94],[78,95],[79,1],[81,96],[82,97],[83,98],[84,96]],"latestChangedDtsFile":"./test/messagesTest.d.ts","version":"5.9.3"} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/messages.schema.json b/node_modules/@cucumber/messages/messages.schema.json new file mode 100644 index 00000000..7a7ae7ea --- /dev/null +++ b/node_modules/@cucumber/messages/messages.schema.json @@ -0,0 +1,1709 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cucumber.io/schema/Envelope.schema.json", + "additionalProperties": false, + "properties": { + "attachment": { + "$ref": "./Attachment.schema.json" + }, + "externalAttachment": { + "$ref": "./ExternalAttachment.schema.json" + }, + "gherkinDocument": { + "$ref": "./GherkinDocument.schema.json" + }, + "hook": { + "$ref": "./Hook.schema.json" + }, + "meta": { + "$ref": "./Meta.schema.json" + }, + "parameterType": { + "$ref": "./ParameterType.schema.json" + }, + "parseError": { + "$ref": "./ParseError.schema.json" + }, + "pickle": { + "$ref": "./Pickle.schema.json" + }, + "suggestion": { + "$ref": "./Suggestion.schema.json" + }, + "source": { + "$ref": "./Source.schema.json" + }, + "stepDefinition": { + "$ref": "./StepDefinition.schema.json" + }, + "testCase": { + "$ref": "./TestCase.schema.json" + }, + "testCaseFinished": { + "$ref": "./TestCaseFinished.schema.json" + }, + "testCaseStarted": { + "$ref": "./TestCaseStarted.schema.json" + }, + "testRunFinished": { + "$ref": "./TestRunFinished.schema.json" + }, + "testRunStarted": { + "$ref": "./TestRunStarted.schema.json" + }, + "testStepFinished": { + "$ref": "./TestStepFinished.schema.json" + }, + "testStepStarted": { + "$ref": "./TestStepStarted.schema.json" + }, + "testRunHookStarted": { + "$ref": "TestRunHookStarted.schema.json" + }, + "testRunHookFinished": { + "$ref": "TestRunHookFinished.schema.json" + }, + "undefinedParameterType": { + "$ref": "./UndefinedParameterType.schema.json" + } + }, + "type": "object", + "$defs": { + "https://cucumber.io/schema/Attachment.schema.json": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cucumber.io/schema/Attachment.schema.json", + "additionalProperties": false, + "description": "Attachments (parse errors, execution errors, screenshots, links...)\n\nAn attachment represents any kind of data associated with a line in a\n[Source](#io.cucumber.messages.Source) file. It can be used for:\n\n* Syntax errors during parse time\n* Screenshots captured and attached during execution\n* Logs captured and attached during execution\n\nIt is not to be used for runtime errors raised/thrown during execution. This\nis captured in `TestResult`.", + "required": [ + "body", + "contentEncoding", + "mediaType" + ], + "properties": { + "body": { + "description": "The body of the attachment. If `contentEncoding` is `IDENTITY`, the attachment\nis simply the string. If it's `BASE64`, the string should be Base64 decoded to\nobtain the attachment.", + "type": "string" + }, + "contentEncoding": { + "description": "Whether to interpret `body` \"as-is\" (IDENTITY) or if it needs to be Base64-decoded (BASE64).\n\nContent encoding is *not* determined by the media type, but rather by the type\nof the object being attached:\n\n- string: IDENTITY\n- byte array: BASE64\n- stream: BASE64", + "enum": [ + "IDENTITY", + "BASE64" + ], + "type": "string" + }, + "fileName": { + "description": "Suggested file name of the attachment. (Provided by the user as an argument to `attach`)", + "type": "string" + }, + "mediaType": { + "description": "The media type of the data. This can be any valid\n[IANA Media Type](https://www.iana.org/assignments/media-types/media-types.xhtml)\nas well as Cucumber-specific media types such as `text/x.cucumber.gherkin+plain`\nand `text/x.cucumber.stacktrace+plain`", + "type": "string" + }, + "source": { + "$ref": "./Source.schema.json", + "deprecated": true + }, + "testCaseStartedId": { + "description": "The identifier of the test case attempt if the attachment was created during the execution of a test step", + "type": "string" + }, + "testStepId": { + "description": "The identifier of the test step if the attachment was created during the execution of a test step", + "type": "string" + }, + "url": { + "description": "A URL where the attachment can be retrieved. This field should not be set by Cucumber.\nIt should be set by a program that reads a message stream and does the following for\neach Attachment message:\n\n- Writes the body (after base64 decoding if necessary) to a new file.\n- Sets `body` and `contentEncoding` to `null`\n- Writes out the new attachment message\n\nThis will result in a smaller message stream, which can improve performance and\nreduce bandwidth of message consumers. It also makes it easier to process and download attachments\nseparately from reports.\n\nDeprecated; use ExternalAttachment instead.", + "type": "string", + "deprecated": true + }, + "testRunStartedId": { + "description": "Not used; implementers should instead populate `testRunHookStartedId` if an attachment was created during the execution of a test run hook", + "type": "string", + "deprecated": true + }, + "testRunHookStartedId": { + "description": "The identifier of the test run hook execution if the attachment was created during the execution of a test run hook", + "type": "string" + }, + "timestamp": { + "description": "When the attachment was created", + "$ref": "./Timestamp.schema.json" + } + }, + "type": "object" + }, + "https://cucumber.io/schema/Source.schema.json": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cucumber.io/schema/Source.schema.json", + "additionalProperties": false, + "description": "A source file, typically a Gherkin document or Java/Ruby/JavaScript source code", + "required": [ + "uri", + "data", + "mediaType" + ], + "properties": { + "uri": { + "description": "The [URI](https://en.wikipedia.org/wiki/Uniform_Resource_Identifier)\nof the source, typically a file path relative to the root directory", + "type": "string" + }, + "data": { + "description": "The contents of the file", + "type": "string" + }, + "mediaType": { + "description": "The media type of the file. Can be used to specify custom types, such as\ntext/x.cucumber.gherkin+plain", + "type": "string", + "enum": [ + "text/x.cucumber.gherkin+plain", + "text/x.cucumber.gherkin+markdown" + ] + } + }, + "type": "object" + }, + "https://cucumber.io/schema/Timestamp.schema.json": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cucumber.io/schema/Timestamp.schema.json", + "additionalProperties": false, + "required": [ + "seconds", + "nanos" + ], + "properties": { + "seconds": { + "description": "Represents seconds of UTC time since Unix epoch\n1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to\n9999-12-31T23:59:59Z inclusive.", + "type": "integer" + }, + "nanos": { + "description": "Non-negative fractions of a second at nanosecond resolution. Negative\nsecond values with fractions must still have non-negative nanos values\nthat count forward in time. Must be from 0 to 999,999,999\ninclusive.", + "type": "integer", + "minimum": 0, + "maximum": 999999999 + } + }, + "type": "object" + }, + "https://cucumber.io/schema/ExternalAttachment.schema.json": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cucumber.io/schema/ExternalAttachment.schema.json", + "additionalProperties": false, + "description": "Represents an attachment that is stored externally rather than embedded in the message stream.\n\nThis message type is used for large attachments (e.g., video files) that are already\non the filesystem and should not be loaded into memory. Instead of embedding the content,\nonly a URL reference is stored.\n\nA formatter or other consumer of messages may replace an Attachment with an ExternalAttachment if it makes sense to do so.", + "required": [ + "url", + "mediaType" + ], + "properties": { + "url": { + "description": "A URL where the attachment can be retrieved. This could be a file:// URL for\nlocal filesystem paths, or an http(s):// URL for remote resources.", + "type": "string" + }, + "mediaType": { + "description": "The media type of the data. This can be any valid\n[IANA Media Type](https://www.iana.org/assignments/media-types/media-types.xhtml)\nas well as Cucumber-specific media types such as `text/x.cucumber.gherkin+plain`\nand `text/x.cucumber.stacktrace+plain`", + "type": "string" + }, + "testCaseStartedId": { + "description": "The identifier of the test case attempt if the attachment was created during the execution of a test step", + "type": "string" + }, + "testStepId": { + "description": "The identifier of the test step if the attachment was created during the execution of a test step", + "type": "string" + }, + "testRunHookStartedId": { + "description": "The identifier of the test run hook execution if the attachment was created during the execution of a test run hook", + "type": "string" + }, + "timestamp": { + "description": "When the attachment was created", + "$ref": "./Timestamp.schema.json" + } + }, + "type": "object" + }, + "https://cucumber.io/schema/GherkinDocument.schema.json": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cucumber.io/schema/GherkinDocument.schema.json", + "additionalProperties": false, + "definitions": { + "Background": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "required": [ + "location", + "keyword", + "name", + "description", + "steps", + "id" + ], + "properties": { + "location": { + "$ref": "./Location.schema.json", + "description": "The location of the `Background` keyword" + }, + "keyword": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "steps": { + "items": { + "$ref": "#/definitions/Step", + "$schema": "https://json-schema.org/draft/2020-12/schema" + }, + "type": "array" + }, + "id": { + "type": "string" + } + }, + "type": "object" + }, + "Comment": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "A comment in a Gherkin document", + "required": [ + "location", + "text" + ], + "properties": { + "location": { + "$ref": "./Location.schema.json", + "description": "The location of the comment" + }, + "text": { + "description": "The text of the comment", + "type": "string" + } + }, + "type": "object" + }, + "DataTable": { + "additionalProperties": false, + "required": [ + "location", + "rows" + ], + "properties": { + "location": { + "$ref": "./Location.schema.json" + }, + "rows": { + "items": { + "$ref": "#/definitions/TableRow" + }, + "type": "array" + } + }, + "type": "object" + }, + "DocString": { + "additionalProperties": false, + "required": [ + "location", + "content", + "delimiter" + ], + "properties": { + "location": { + "$ref": "./Location.schema.json" + }, + "mediaType": { + "type": "string" + }, + "content": { + "type": "string" + }, + "delimiter": { + "type": "string" + } + }, + "type": "object" + }, + "Examples": { + "additionalProperties": false, + "required": [ + "location", + "tags", + "keyword", + "name", + "tableBody", + "description", + "id" + ], + "properties": { + "location": { + "$ref": "./Location.schema.json", + "description": "The location of the `Examples` keyword" + }, + "tags": { + "items": { + "$ref": "#/definitions/Tag", + "$schema": "https://json-schema.org/draft/2020-12/schema" + }, + "type": "array" + }, + "keyword": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "tableHeader": { + "$ref": "#/definitions/TableRow" + }, + "tableBody": { + "items": { + "$ref": "#/definitions/TableRow", + "$schema": "https://json-schema.org/draft/2020-12/schema" + }, + "type": "array" + }, + "id": { + "type": "string" + } + }, + "type": "object" + }, + "Feature": { + "additionalProperties": false, + "required": [ + "location", + "tags", + "language", + "keyword", + "name", + "description", + "children" + ], + "properties": { + "location": { + "$ref": "./Location.schema.json", + "description": "The location of the `Feature` keyword" + }, + "tags": { + "description": "All the tags placed above the `Feature` keyword", + "items": { + "$ref": "#/definitions/Tag", + "$schema": "https://json-schema.org/draft/2020-12/schema" + }, + "type": "array" + }, + "language": { + "description": "The [ISO 639-1](https://en.wikipedia.org/wiki/ISO_639-1) language code of the Gherkin document", + "type": "string" + }, + "keyword": { + "description": "The text of the `Feature` keyword (in the language specified by `language`)", + "type": "string" + }, + "name": { + "description": "The name of the feature (the text following the `keyword`)", + "type": "string" + }, + "description": { + "description": "The line(s) underneath the line with the `keyword` that are used as description", + "type": "string" + }, + "children": { + "description": "Zero or more children", + "items": { + "$ref": "#/definitions/FeatureChild" + }, + "type": "array" + } + }, + "type": "object" + }, + "FeatureChild": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "A child node of a `Feature` node", + "properties": { + "rule": { + "$ref": "#/definitions/Rule" + }, + "background": { + "$ref": "#/definitions/Background" + }, + "scenario": { + "$ref": "#/definitions/Scenario" + } + }, + "type": "object" + }, + "Rule": { + "additionalProperties": false, + "required": [ + "location", + "tags", + "keyword", + "name", + "description", + "children", + "id" + ], + "properties": { + "location": { + "$ref": "./Location.schema.json", + "description": "The location of the `Rule` keyword" + }, + "tags": { + "description": "All the tags placed above the `Rule` keyword", + "items": { + "$ref": "#/definitions/Tag", + "$schema": "https://json-schema.org/draft/2020-12/schema" + }, + "type": "array" + }, + "keyword": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "children": { + "items": { + "$ref": "#/definitions/RuleChild" + }, + "type": "array" + }, + "id": { + "type": "string" + } + }, + "type": "object" + }, + "RuleChild": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "A child node of a `Rule` node", + "properties": { + "background": { + "$ref": "#/definitions/Background" + }, + "scenario": { + "$ref": "#/definitions/Scenario" + } + }, + "type": "object" + }, + "Scenario": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "required": [ + "location", + "tags", + "keyword", + "name", + "description", + "steps", + "examples", + "id" + ], + "properties": { + "location": { + "$ref": "./Location.schema.json", + "description": "The location of the `Scenario` keyword" + }, + "tags": { + "items": { + "$ref": "#/definitions/Tag", + "$schema": "https://json-schema.org/draft/2020-12/schema" + }, + "type": "array" + }, + "keyword": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "steps": { + "items": { + "$ref": "#/definitions/Step", + "$schema": "https://json-schema.org/draft/2020-12/schema" + }, + "type": "array" + }, + "examples": { + "items": { + "$ref": "#/definitions/Examples", + "$schema": "https://json-schema.org/draft/2020-12/schema" + }, + "type": "array" + }, + "id": { + "type": "string" + } + }, + "type": "object" + }, + "Step": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "A step", + "required": [ + "location", + "keyword", + "text", + "id" + ], + "properties": { + "location": { + "$ref": "./Location.schema.json", + "description": "The location of the steps' `keyword`" + }, + "keyword": { + "description": "The actual keyword as it appeared in the source.", + "type": "string" + }, + "keywordType": { + "description": "The test phase signalled by the keyword: Context definition (Given), Action performance (When), Outcome assertion (Then). Other keywords signal Continuation (And and But) from a prior keyword. Please note that all translations which a dialect maps to multiple keywords (`*` is in this category for all dialects), map to 'Unknown'.", + "type": "string", + "enum": [ + "Unknown", + "Context", + "Action", + "Outcome", + "Conjunction" + ] + }, + "text": { + "type": "string" + }, + "docString": { + "$ref": "#/definitions/DocString" + }, + "dataTable": { + "$ref": "#/definitions/DataTable" + }, + "id": { + "description": "Unique ID to be able to reference the Step from PickleStep", + "type": "string" + } + }, + "type": "object" + }, + "TableCell": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "A cell in a `TableRow`", + "required": [ + "location", + "value" + ], + "properties": { + "location": { + "$ref": "./Location.schema.json", + "description": "The location of the cell" + }, + "value": { + "description": "The value of the cell", + "type": "string" + } + }, + "type": "object" + }, + "TableRow": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "A row in a table", + "required": [ + "location", + "cells", + "id" + ], + "properties": { + "location": { + "$ref": "./Location.schema.json", + "description": "The location of the first cell in the row" + }, + "cells": { + "description": "Cells in the row", + "items": { + "$ref": "#/definitions/TableCell", + "$schema": "https://json-schema.org/draft/2020-12/schema" + }, + "type": "array" + }, + "id": { + "type": "string" + } + }, + "type": "object" + }, + "Tag": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "A tag", + "required": [ + "location", + "name", + "id" + ], + "properties": { + "location": { + "$ref": "./Location.schema.json", + "description": "Location of the tag" + }, + "name": { + "description": "The name of the tag (including the leading `@`)", + "type": "string" + }, + "id": { + "description": "Unique ID to be able to reference the Tag from PickleTag", + "type": "string" + } + }, + "type": "object" + } + }, + "description": "The [AST](https://en.wikipedia.org/wiki/Abstract_syntax_tree) of a Gherkin document.\nCucumber implementations should *not* depend on `GherkinDocument` or any of its\nchildren for execution - use [Pickle](#io.cucumber.messages.Pickle) instead.\n\nThe only consumers of `GherkinDocument` should only be formatters that produce\n\"rich\" output, resembling the original Gherkin document.", + "required": [ + "comments" + ], + "properties": { + "uri": { + "description": "The [URI](https://en.wikipedia.org/wiki/Uniform_Resource_Identifier)\nof the source, typically a file path relative to the root directory", + "type": "string" + }, + "feature": { + "$ref": "#/definitions/Feature" + }, + "comments": { + "description": "All the comments in the Gherkin document", + "items": { + "$ref": "#/definitions/Comment" + }, + "type": "array" + } + }, + "type": "object" + }, + "https://cucumber.io/schema/Location.schema.json": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cucumber.io/schema/Location.schema.json", + "additionalProperties": false, + "description": "Points to a line and a column in a text file", + "properties": { + "line": { + "type": "integer", + "minimum": 1, + "maximum": 2147483647 + }, + "column": { + "type": "integer", + "minimum": 1, + "maximum": 2147483647 + } + }, + "required": [ + "line" + ], + "type": "object" + }, + "https://cucumber.io/schema/Hook.schema.json": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cucumber.io/schema/Hook.schema.json", + "additionalProperties": false, + "required": [ + "id", + "sourceReference" + ], + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "sourceReference": { + "$ref": "./SourceReference.schema.json" + }, + "tagExpression": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "BEFORE_TEST_RUN", + "AFTER_TEST_RUN", + "BEFORE_TEST_CASE", + "AFTER_TEST_CASE", + "BEFORE_TEST_STEP", + "AFTER_TEST_STEP" + ] + } + }, + "type": "object" + }, + "https://cucumber.io/schema/SourceReference.schema.json": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cucumber.io/schema/SourceReference.schema.json", + "additionalProperties": false, + "definitions": { + "JavaMethod": { + "additionalProperties": false, + "required": [ + "className", + "methodName", + "methodParameterTypes" + ], + "properties": { + "className": { + "type": "string" + }, + "methodName": { + "type": "string" + }, + "methodParameterTypes": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "JavaStackTraceElement": { + "additionalProperties": false, + "required": [ + "className", + "fileName", + "methodName" + ], + "properties": { + "className": { + "type": "string" + }, + "fileName": { + "type": "string" + }, + "methodName": { + "type": "string" + } + }, + "type": "object" + } + }, + "description": "Points to a [Source](#io.cucumber.messages.Source) identified by `uri` and a\n[Location](#io.cucumber.messages.Location) within that file.", + "properties": { + "uri": { + "type": "string" + }, + "javaMethod": { + "$ref": "#/definitions/JavaMethod" + }, + "javaStackTraceElement": { + "$ref": "#/definitions/JavaStackTraceElement" + }, + "location": { + "$ref": "./Location.schema.json" + } + }, + "type": "object" + }, + "https://cucumber.io/schema/Meta.schema.json": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cucumber.io/schema/Meta.schema.json", + "additionalProperties": false, + "definitions": { + "Ci": { + "additionalProperties": false, + "description": "CI environment", + "required": [ + "name" + ], + "properties": { + "name": { + "description": "Name of the CI product, e.g. \"Jenkins\", \"CircleCI\" etc.", + "type": "string" + }, + "url": { + "description": "Link to the build", + "type": "string" + }, + "buildNumber": { + "description": "The build number. Some CI servers use non-numeric build numbers, which is why this is a string", + "type": "string" + }, + "git": { + "$ref": "#/definitions/Git" + } + }, + "type": "object" + }, + "Git": { + "additionalProperties": false, + "description": "Information about Git, provided by the Build/CI server as environment\nvariables.", + "required": [ + "remote", + "revision" + ], + "properties": { + "remote": { + "type": "string" + }, + "revision": { + "type": "string" + }, + "branch": { + "type": "string" + }, + "tag": { + "type": "string" + } + }, + "type": "object" + }, + "Product": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "Used to describe various properties of Meta", + "required": [ + "name" + ], + "properties": { + "name": { + "description": "The product name", + "type": "string" + }, + "version": { + "description": "The product version", + "type": "string" + } + }, + "type": "object" + } + }, + "description": "This message contains meta information about the environment. Consumers can use\nthis for various purposes.", + "required": [ + "protocolVersion", + "implementation", + "runtime", + "os", + "cpu" + ], + "properties": { + "protocolVersion": { + "description": "The [SEMVER](https://semver.org/) version number of the protocol", + "type": "string" + }, + "implementation": { + "$ref": "#/definitions/Product", + "description": "SpecFlow, Cucumber-JVM, Cucumber.js, Cucumber-Ruby, Behat etc." + }, + "runtime": { + "$ref": "#/definitions/Product", + "description": "Java, Ruby, Node.js etc" + }, + "os": { + "$ref": "#/definitions/Product", + "description": "Windows, Linux, MacOS etc" + }, + "cpu": { + "$ref": "#/definitions/Product", + "description": "386, arm, amd64 etc" + }, + "ci": { + "$ref": "#/definitions/Ci" + } + }, + "type": "object" + }, + "https://cucumber.io/schema/ParameterType.schema.json": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cucumber.io/schema/ParameterType.schema.json", + "additionalProperties": false, + "required": [ + "id", + "name", + "preferForRegularExpressionMatch", + "regularExpressions", + "useForSnippets" + ], + "properties": { + "name": { + "description": "The name is unique, so we don't need an id.", + "type": "string" + }, + "regularExpressions": { + "items": { + "type": "string" + }, + "type": "array", + "minItems": 1 + }, + "preferForRegularExpressionMatch": { + "type": "boolean" + }, + "useForSnippets": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "sourceReference": { + "$ref": "./SourceReference.schema.json" + } + }, + "type": "object" + }, + "https://cucumber.io/schema/ParseError.schema.json": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cucumber.io/schema/ParseError.schema.json", + "additionalProperties": false, + "required": [ + "source", + "message" + ], + "properties": { + "source": { + "$ref": "./SourceReference.schema.json" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "https://cucumber.io/schema/Pickle.schema.json": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cucumber.io/schema/Pickle.schema.json", + "additionalProperties": false, + "definitions": { + "PickleDocString": { + "additionalProperties": false, + "required": [ + "content" + ], + "properties": { + "mediaType": { + "type": "string" + }, + "content": { + "type": "string" + } + }, + "type": "object" + }, + "PickleStep": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "An executable step", + "required": [ + "astNodeIds", + "id", + "text" + ], + "properties": { + "argument": { + "$ref": "#/definitions/PickleStepArgument" + }, + "astNodeIds": { + "description": "References the IDs of the source of the step. For Gherkin, this can be\nthe ID of a Step, and possibly also the ID of a TableRow", + "items": { + "type": "string" + }, + "type": "array", + "minItems": 1 + }, + "id": { + "description": "A unique ID for the PickleStep", + "type": "string" + }, + "type": { + "description": "The context in which the step was specified: context (Given), action (When) or outcome (Then).\n\nNote that the keywords `But` and `And` inherit their meaning from prior steps and the `*` 'keyword' doesn't have specific meaning (hence Unknown)", + "type": "string", + "enum": [ + "Unknown", + "Context", + "Action", + "Outcome" + ] + }, + "text": { + "type": "string" + } + }, + "type": "object" + }, + "PickleStepArgument": { + "additionalProperties": false, + "description": "An optional argument", + "properties": { + "docString": { + "$ref": "#/definitions/PickleDocString" + }, + "dataTable": { + "$ref": "#/definitions/PickleTable" + } + }, + "type": "object" + }, + "PickleTable": { + "additionalProperties": false, + "required": [ + "rows" + ], + "properties": { + "rows": { + "items": { + "$ref": "#/definitions/PickleTableRow" + }, + "type": "array" + } + }, + "type": "object" + }, + "PickleTableCell": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string" + } + }, + "type": "object" + }, + "PickleTableRow": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "required": [ + "cells" + ], + "properties": { + "cells": { + "items": { + "$ref": "#/definitions/PickleTableCell" + }, + "type": "array", + "minItems": 1 + } + }, + "type": "object" + }, + "PickleTag": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "A tag", + "required": [ + "name", + "astNodeId" + ], + "properties": { + "name": { + "type": "string" + }, + "astNodeId": { + "description": "Points to the AST node this was created from", + "type": "string" + } + }, + "type": "object" + } + }, + "description": "A `Pickle` represents a template for a `TestCase`. It is typically derived\nfrom another format, such as [GherkinDocument](#io.cucumber.messages.GherkinDocument).\nIn the future a `Pickle` may be derived from other formats such as Markdown or\nExcel files.\n\nBy making `Pickle` the main data structure Cucumber uses for execution, the\nimplementation of Cucumber itself becomes simpler, as it doesn't have to deal\nwith the complex structure of a [GherkinDocument](#io.cucumber.messages.GherkinDocument).\n\nEach `PickleStep` of a `Pickle` is matched with a `StepDefinition` to create a `TestCase`", + "required": [ + "id", + "uri", + "name", + "language", + "steps", + "tags", + "astNodeIds" + ], + "properties": { + "id": { + "description": "A unique id for the pickle", + "type": "string" + }, + "uri": { + "description": "The uri of the source file", + "type": "string" + }, + "location": { + "description": "The location of this pickle in source file. A pickle constructed from `Examples` will point to the example row.", + "$ref": "./Location.schema.json" + }, + "name": { + "description": "The name of the pickle", + "type": "string" + }, + "language": { + "description": "The language of the pickle", + "type": "string" + }, + "steps": { + "description": "One or more steps", + "items": { + "$ref": "#/definitions/PickleStep" + }, + "type": "array" + }, + "tags": { + "description": "One or more tags. If this pickle is constructed from a Gherkin document,\nIt includes inherited tags from the `Feature` as well.", + "items": { + "$ref": "#/definitions/PickleTag" + }, + "type": "array" + }, + "astNodeIds": { + "description": "Points to the AST node locations of the pickle. The last one represents the unique\nid of the pickle. A pickle constructed from `Examples` will have the first\nid originating from the `Scenario` AST node, and the second from the `TableRow` AST node.", + "items": { + "type": "string" + }, + "type": "array", + "minItems": 1 + } + }, + "type": "object" + }, + "https://cucumber.io/schema/Suggestion.schema.json": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cucumber.io/schema/Suggestion.schema.json", + "additionalProperties": false, + "definitions": { + "Snippet": { + "additionalProperties": false, + "required": [ + "language", + "code" + ], + "properties": { + "language": { + "description": "The programming language of the code.\n\nThis must be formatted as an all lowercase identifier such that syntax highlighters like [Prism](https://prismjs.com/#supported-languages) or [Highlight.js](https://github.com/highlightjs/highlight.js/blob/main/SUPPORTED_LANGUAGES.md) can recognize it.\nFor example: `cpp`, `cs`, `go`, `java`, `javascript`, `php`, `python`, `ruby`, `scala`.", + "type": "string" + }, + "code": { + "description": "A snippet of code", + "type": "string" + } + }, + "type": "object" + } + }, + "description": "A suggested fragment of code to implement an undefined step", + "required": [ + "id", + "pickleStepId", + "snippets" + ], + "properties": { + "id": { + "description": "A unique id for this suggestion", + "type": "string" + }, + "pickleStepId": { + "description": "The ID of the `PickleStep` this `Suggestion` was created for.", + "type": "string" + }, + "snippets": { + "description": "A collection of code snippets that could implement the undefined step", + "minItems": 1, + "type": "array", + "items": { + "$ref": "#/definitions/Snippet" + } + } + }, + "type": "object" + }, + "https://cucumber.io/schema/StepDefinition.schema.json": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cucumber.io/schema/StepDefinition.schema.json", + "additionalProperties": false, + "definitions": { + "StepDefinitionPattern": { + "additionalProperties": false, + "required": [ + "source", + "type" + ], + "properties": { + "source": { + "type": "string" + }, + "type": { + "enum": [ + "CUCUMBER_EXPRESSION", + "REGULAR_EXPRESSION" + ], + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "id", + "pattern", + "sourceReference" + ], + "properties": { + "id": { + "type": "string" + }, + "pattern": { + "$ref": "#/definitions/StepDefinitionPattern" + }, + "sourceReference": { + "$ref": "./SourceReference.schema.json" + } + }, + "type": "object" + }, + "https://cucumber.io/schema/TestCase.schema.json": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cucumber.io/schema/TestCase.schema.json", + "additionalProperties": false, + "definitions": { + "Group": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "properties": { + "children": { + "description": "The nested capture groups of an argument.\nAbsent if the group has no nested capture groups.", + "items": { + "$ref": "#/definitions/Group", + "$schema": "https://json-schema.org/draft/2020-12/schema" + }, + "type": "array" + }, + "start": { + "type": "integer", + "minimum": 0, + "maximum": 2147483647 + }, + "value": { + "type": "string" + } + }, + "type": "object" + }, + "StepMatchArgument": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "Represents a single argument extracted from a step match and passed to a step definition.\nThis is used for the following purposes:\n- Construct an argument to pass to a step definition (possibly through a parameter type transform)\n- Highlight the matched parameter in rich formatters such as the HTML formatter\n\nThis message closely matches the `Argument` class in the `cucumber-expressions` library.", + "required": [ + "group" + ], + "properties": { + "group": { + "$ref": "#/definitions/Group", + "description": "Represents the outermost capture group of an argument. This message closely matches the\n`Group` class in the `cucumber-expressions` library." + }, + "parameterTypeName": { + "type": "string" + } + }, + "type": "object" + }, + "StepMatchArgumentsList": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "required": [ + "stepMatchArguments" + ], + "properties": { + "stepMatchArguments": { + "items": { + "$ref": "#/definitions/StepMatchArgument" + }, + "type": "array" + } + }, + "type": "object" + }, + "TestStep": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "A `TestStep` is derived from either a `PickleStep` combined with a `StepDefinition`, or from a `Hook`.\n\nWhen derived from a PickleStep:\n * For `UNDEFINED` steps `stepDefinitionIds` and `stepMatchArgumentsLists` will be empty.\n * For `AMBIGUOUS` steps, there will be multiple entries in `stepDefinitionIds` and `stepMatchArgumentsLists`. The first entry in the stepMatchArgumentsLists holds the list of arguments for the first matching step definition, the second entry for the second, etc", + "required": [ + "id" + ], + "properties": { + "hookId": { + "description": "Pointer to the `Hook` (if derived from a Hook)", + "type": "string" + }, + "id": { + "type": "string" + }, + "pickleStepId": { + "description": "Pointer to the `PickleStep` (if derived from a `PickleStep`)", + "type": "string" + }, + "stepDefinitionIds": { + "description": "Pointer to all the matching `StepDefinition`s (if derived from a `PickleStep`).\n\nEach element represents a matching step definition.", + "items": { + "type": "string" + }, + "type": "array" + }, + "stepMatchArgumentsLists": { + "description": "A list of list of StepMatchArgument (if derived from a `PickleStep`).\n\nEach element represents the arguments for a matching step definition.", + "items": { + "$ref": "#/definitions/StepMatchArgumentsList" + }, + "type": "array" + } + }, + "type": "object" + } + }, + "description": "A `TestCase` contains a sequence of `TestStep`s.", + "required": [ + "id", + "pickleId", + "testSteps" + ], + "properties": { + "id": { + "type": "string" + }, + "pickleId": { + "description": "The ID of the `Pickle` this `TestCase` is derived from.", + "type": "string" + }, + "testSteps": { + "items": { + "$ref": "#/definitions/TestStep" + }, + "type": "array" + }, + "testRunStartedId": { + "description": "Identifier for the test run that this test case belongs to", + "type": "string" + } + }, + "type": "object" + }, + "https://cucumber.io/schema/TestCaseFinished.schema.json": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cucumber.io/schema/TestCaseFinished.schema.json", + "additionalProperties": false, + "required": [ + "testCaseStartedId", + "timestamp", + "willBeRetried" + ], + "properties": { + "testCaseStartedId": { + "type": "string" + }, + "timestamp": { + "$ref": "./Timestamp.schema.json" + }, + "willBeRetried": { + "type": "boolean" + } + }, + "type": "object" + }, + "https://cucumber.io/schema/TestCaseStarted.schema.json": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cucumber.io/schema/TestCaseStarted.schema.json", + "additionalProperties": false, + "required": [ + "attempt", + "id", + "testCaseId", + "timestamp" + ], + "properties": { + "attempt": { + "description": "The first attempt should have value 0, and for each retry the value\nshould increase by 1.", + "type": "integer", + "minimum": 0 + }, + "id": { + "description": "Because a `TestCase` can be run multiple times (in case of a retry),\nwe use this field to group messages relating to the same attempt.", + "type": "string" + }, + "testCaseId": { + "type": "string" + }, + "workerId": { + "description": "An identifier for the worker process running this test case, if test cases are being run in parallel. The identifier will be unique per worker, but no particular format is defined - it could be an index, uuid, machine name etc - and as such should be assumed that it's not human readable.", + "type": "string" + }, + "timestamp": { + "$ref": "./Timestamp.schema.json" + } + }, + "type": "object" + }, + "https://cucumber.io/schema/TestRunFinished.schema.json": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cucumber.io/schema/TestRunFinished.schema.json", + "additionalProperties": false, + "required": [ + "success", + "timestamp" + ], + "properties": { + "message": { + "description": "An informative message about the test run. Typically additional information about failure, but not necessarily.", + "type": "string" + }, + "success": { + "description": "A test run is successful if all steps are either passed or skipped, all before/after hooks passed and no other exceptions where thrown.", + "type": "boolean" + }, + "timestamp": { + "$ref": "./Timestamp.schema.json", + "description": "Timestamp when the TestRun is finished" + }, + "exception": { + "$ref": "./Exception.schema.json", + "description": "Any exception thrown during the test run, if any. Does not include exceptions thrown while executing steps." + }, + "testRunStartedId": { + "type": "string" + } + }, + "type": "object" + }, + "https://cucumber.io/schema/Exception.schema.json": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cucumber.io/schema/Exception.schema.json", + "additionalProperties": false, + "description": "A simplified representation of an exception", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "description": "The type of the exception that caused this result. E.g. \"Error\" or \"org.opentest4j.AssertionFailedError\"" + }, + "message": { + "type": "string", + "description": "The message of exception that caused this result. E.g. expected: \"a\" but was: \"b\"" + }, + "stackTrace": { + "type": "string", + "description": "The stringified stack trace of the exception that caused this result" + } + }, + "type": "object" + }, + "https://cucumber.io/schema/TestRunStarted.schema.json": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cucumber.io/schema/TestRunStarted.schema.json", + "additionalProperties": false, + "required": [ + "timestamp" + ], + "properties": { + "timestamp": { + "$ref": "./Timestamp.schema.json" + }, + "id": { + "type": "string" + } + }, + "type": "object" + }, + "https://cucumber.io/schema/TestStepFinished.schema.json": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cucumber.io/schema/TestStepFinished.schema.json", + "additionalProperties": false, + "required": [ + "testCaseStartedId", + "testStepId", + "testStepResult", + "timestamp" + ], + "properties": { + "testCaseStartedId": { + "type": "string" + }, + "testStepId": { + "type": "string" + }, + "testStepResult": { + "$ref": "./TestStepResult.schema.json" + }, + "timestamp": { + "$ref": "./Timestamp.schema.json" + } + }, + "type": "object" + }, + "https://cucumber.io/schema/TestStepResult.schema.json": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cucumber.io/schema/TestStepResult.schema.json", + "additionalProperties": false, + "required": [ + "duration", + "status" + ], + "properties": { + "duration": { + "$ref": "./Duration.schema.json" + }, + "message": { + "type": "string", + "description": "An arbitrary bit of information that explains this result. If there was an exception, this should include a stringified representation of it including type, message and stack trace (the exact format will vary by platform)." + }, + "status": { + "enum": [ + "UNKNOWN", + "PASSED", + "SKIPPED", + "PENDING", + "UNDEFINED", + "AMBIGUOUS", + "FAILED" + ], + "type": "string" + }, + "exception": { + "$ref": "./Exception.schema.json", + "description": "Exception thrown while executing this step, if any." + } + }, + "type": "object" + }, + "https://cucumber.io/schema/Duration.schema.json": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cucumber.io/schema/Duration.schema.json", + "additionalProperties": false, + "description": "The structure is pretty close of the Timestamp one. For clarity, a second type\nof message is used.", + "required": [ + "seconds", + "nanos" + ], + "properties": { + "seconds": { + "type": "integer" + }, + "nanos": { + "description": "Non-negative fractions of a second at nanosecond resolution. Negative\nsecond values with fractions must still have non-negative nanos values\nthat count forward in time. Must be from 0 to 999,999,999\ninclusive.", + "type": "integer", + "minimum": 0, + "maximum": 999999999 + } + }, + "type": "object" + }, + "https://cucumber.io/schema/TestStepStarted.schema.json": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cucumber.io/schema/TestStepStarted.schema.json", + "additionalProperties": false, + "required": [ + "testCaseStartedId", + "testStepId", + "timestamp" + ], + "properties": { + "testCaseStartedId": { + "type": "string" + }, + "testStepId": { + "type": "string" + }, + "timestamp": { + "$ref": "./Timestamp.schema.json" + } + }, + "type": "object" + }, + "https://cucumber.io/schema/TestRunHookStarted.schema.json": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cucumber.io/schema/TestRunHookStarted.schema.json", + "additionalProperties": false, + "required": [ + "id", + "testRunStartedId", + "hookId", + "timestamp" + ], + "properties": { + "id": { + "description": "Unique identifier for this hook execution", + "type": "string" + }, + "testRunStartedId": { + "description": "Identifier for the test run that this hook execution belongs to", + "type": "string" + }, + "hookId": { + "description": "Identifier for the hook that will be executed", + "type": "string" + }, + "workerId": { + "description": "An identifier for the worker process running this hook, if parallel workers are in use. The identifier will be unique per worker, but no particular format is defined - it could be an index, uuid, machine name etc - and as such should be assumed that it's not human readable.", + "type": "string" + }, + "timestamp": { + "$ref": "./Timestamp.schema.json" + } + }, + "type": "object" + }, + "https://cucumber.io/schema/TestRunHookFinished.schema.json": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cucumber.io/schema/TestRunHookFinished.schema.json", + "additionalProperties": false, + "required": [ + "testRunHookStartedId", + "result", + "timestamp" + ], + "properties": { + "testRunHookStartedId": { + "description": "Identifier for the hook execution that has finished", + "type": "string" + }, + "result": { + "$ref": "./TestStepResult.schema.json" + }, + "timestamp": { + "$ref": "./Timestamp.schema.json" + } + }, + "type": "object" + }, + "https://cucumber.io/schema/UndefinedParameterType.schema.json": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://cucumber.io/schema/UndefinedParameterType.schema.json", + "additionalProperties": false, + "required": [ + "expression", + "name" + ], + "properties": { + "expression": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "type": "object" + } + } +} \ No newline at end of file diff --git a/node_modules/@cucumber/messages/package.json b/node_modules/@cucumber/messages/package.json new file mode 100644 index 00000000..8f583558 --- /dev/null +++ b/node_modules/@cucumber/messages/package.json @@ -0,0 +1,60 @@ +{ + "name": "@cucumber/messages", + "version": "32.3.1", + "description": "JSON schema-based messages for Cucumber's inter-process communication", + "type": "module", + "main": "dist/cjs/src/index.js", + "types": "dist/cjs/src/index.d.ts", + "files": [ + "dist/cjs", + "dist/esm", + "messages.schema.json" + ], + "module": "dist/esm/src/index.js", + "exports": { + ".": { + "import": "./dist/esm/src/index.js", + "require": "./dist/cjs/src/index.js" + }, + "./schema": "./messages.schema.json" + }, + "repository": { + "type": "git", + "url": "git://github.com/cucumber/messages.git" + }, + "author": "Cucumber Limited ", + "license": "MIT", + "scripts": { + "build": "npm run build:cjs && npm run build:esm", + "build:cjs": "tsc --build tsconfig.build-cjs.json", + "build:esm": "tsc --build tsconfig.build-esm.json", + "postbuild:cjs": "cp package.cjs.json dist/cjs/package.json", + "copy-schemas": "shx cp ../jsonschema/messages.schema.json ./messages.schema.json", + "prepare": "make generate", + "test": "mocha && npm run test:cjs", + "test:cjs": "npm run build:cjs && mocha --no-config dist/cjs/test", + "version": "shx echo \"// This file is automatically generated using npm scripts\" > src/version.ts && echo \"export const version = '${npm_package_version}'\" >> src/version.ts", + "prepublishOnly": "npm run build && npm run copy-schemas" + }, + "dependencies": { + "class-transformer": "0.5.1", + "reflect-metadata": "0.2.2" + }, + "devDependencies": { + "@types/mocha": "10.0.10", + "@types/node": "22.19.17", + "copyfiles": "2.4.1", + "mocha": "11.7.5", + "shx": "^0.4.0", + "ts-node": "10.9.2", + "typescript": "5.9.3" + }, + "bugs": { + "url": "https://github.com/cucumber/messages/issues" + }, + "homepage": "https://github.com/cucumber/messages#readme", + "directories": { + "test": "test" + }, + "keywords": [] +} diff --git a/node_modules/@cucumber/pretty-formatter/LICENSE b/node_modules/@cucumber/pretty-formatter/LICENSE new file mode 100644 index 00000000..b4bf37ad --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Ilya Kozhevnikov + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/@cucumber/pretty-formatter/README.md b/node_modules/@cucumber/pretty-formatter/README.md new file mode 100644 index 00000000..a81de9ad --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/README.md @@ -0,0 +1,130 @@ +# Official Cucumber.js Pretty Formatter + +[![build][build-badge]][build] +[![npm][version]][npm] +[![npm][downloads]][npm] + +[build]: https://github.com/jbpros/cucumber-pretty-formatter/actions?query=workflow%3Abuild +[build-badge]: https://github.com/jbpros/cucumber-pretty-formatter/workflows/build/badge.svg +[npm]: https://www.npmjs.com/package/@cucumber/pretty-formatter +[version]: https://img.shields.io/npm/v/@cucumber/pretty-formatter.svg +[downloads]: https://img.shields.io/npm/dm/@cucumber/pretty-formatter.svg + +The Cucumber.js pretty formatter logs your feature suite in its original Gherkin form. It offers custom style themes. + +## Install + +The pretty formatter requires: + +- Node.js 10, 12, 14 or 15. +- [Cucumber.js](https://www.npmjs.com/package/@cucumber/cucumber) 7.0 and above. + + npm install --save-dev @cucumber/pretty-formatter @cucumber/cucumber + +There are pretty formatters for [older versions of Cucumber](#older-cucumber-versions). + +## Usage + + cucumber-js -f @cucumber/pretty-formatter + +We recommend using [Cucumber profiles](https://github.com/cucumber/cucumber-js/blob/master/docs/cli.md#profiles) to [specify formatters](https://github.com/cucumber/cucumber-js/blob/master/docs/cli.md#formats). + +## Theme customisation + +You can define your own colors by passing a `theme` format option: + + --format-options '{"theme": }' + +Where `THEME_JSON` is in the following shape: + +```json +{"feature keyword": ["magenta", "bold"], "scenario keyword": ["red"]} +``` + +The customisable theme items are: + +* `datatable border` +* `datatable content` +* `datatable`: all data table elements (border and content) +* `docstring content`: multiline argument content +* `docstring delimiter`: multiline argument delimiter: `"""` +* `feature description` +* `feature keyword` +* `feature name` +* `location`: location comments added to the right of feature and scenario names +* `rule keyword` +* `rule name` +* `scenario keyword` +* `scenario name` +* `step keyword` +* `step message`: usually a failing step error message and stack trace +* `step status`: additional styles added to the built-in styles applied by Cucumber to non-passing steps status. Foreground colors have no effects on this item, background and modifiers do. +* `step text` +* `tag` + +You can combine all the styles you'd like from [modifiers, foreground colors and background colors exposed by ansi-styles](https://github.com/chalk/ansi-styles#styles). + +### Extending the Default Theme + +If you just want to tweak a few things about the default theme without redefining it entirely, you can grab the default theme in your `cucumber.js` config file and use it as the base for yours: + +```js +const { DEFAULT_THEME } = require('@cucumber/pretty-formatter') + +module.exports = { + default: { + formatOptions: { + theme: { + ...DEFAULT_THEME, + 'step text': 'magenta' + } + } + } +} +``` + +### Example Themes + +#### _Matrix_ + +It could be called *eco-friendly*, cuz it's very green: + + --format-options '{"theme":{"datatable border":["green"],"datatable content":["green","italic"],"docstring content":["green","italic"],"docstring delimiter":["green"],"feature description":["green"],"feature keyword":["bold","green"],"rule keyword":["yellow"],"scenario keyword":["greenBright"],"scenario name":["green","underline"],"step keyword":["bgGreen","black","italic"],"step text":["greenBright","italic"],"tag":["green"]}}' + +#### _Legacy pretty_ + +This was the theme offered by [Ilya Kozhevnikov](http://kozhevnikov.com/)'s pretty formatter, pre-Cucumber.js 7.x. + + + + + --format-options '{"theme":{"feature keyword":["magenta","bold"],"scenario keyword":["magenta","bold"],"step keyword":["bold"]}}' + +### We need more themes + +Please share your creations by forking, adding the theme to this section of the README and [opening a pull request](https://github.com/jbpros/cucumber-pretty-formatter/pulls). + +## Older Cucumber versions + +If you're using an older version of Cucumber.js, you'll need to use one of the previous pretty formatters: + +### Cucumber.js 1 → 2 + +The original pretty formatter used to ship with Cucumber. Simply specify it when invoking Cucumber: + + cucumber-js -f pretty + +### Cucumber.js 3 → 6 + +You can install [`cucumber-pretty`](https://www.npmjs.com/package/cucumber-pretty), created by [Ilya Kozhevnikov](http://kozhevnikov.com/). + +- Cucumber.js 3, 4, 5: `npm i --save-dev cucumber-pretty@1.5` +- Cucumber.js 6: `npm i --save-dev cucumber-pretty@6` + +Tell Cucumber to use it: + + cucumber-js -f cucumber-pretty + +## Credits + +This project is based on the [original work](https://github.com/kozhevnikov/cucumber-pretty) of [Ilya Kozhevnikov](http://kozhevnikov.com/). It got migrated to TypeScript, upgraded for Cucumber.js 7+ that exposes [cucumber-messages](https://github.com/cucumber/cucumber/tree/master/messages) and is currently maintained by [Julien Biezemans](https://github.com/jbpros/) and the [Cucumber team](https://github.com/cucumber). diff --git a/node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.d.ts b/node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.d.ts new file mode 100644 index 00000000..98ee4b61 --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.d.ts @@ -0,0 +1,3 @@ +import { TextStyle } from './styleText'; +export declare const indentStyleText: (indent: number, text: string, styles?: TextStyle[]) => string; +//# sourceMappingURL=indentStyleText.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.d.ts.map b/node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.d.ts.map new file mode 100644 index 00000000..db68d969 --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"indentStyleText.d.ts","sourceRoot":"","sources":["../../src/indentStyleText.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,SAAS,EAAE,MAAM,aAAa,CAAA;AAElD,eAAO,MAAM,eAAe,WAClB,MAAM,QACR,MAAM,WACJ,SAAS,EAAE,KAClB,MAKA,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.js b/node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.js new file mode 100644 index 00000000..d53d542a --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.js @@ -0,0 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.indentStyleText = void 0; +const styleText_1 = require("./styleText"); +const indentStyleText = (indent, text, styles = []) => text.replace(/^(.+)$/gm, (subText) => subText.trim().length === 0 + ? '' + : `${' '.repeat(indent)}${styleText_1.styleText(subText.trimRight(), ...styles)}`); +exports.indentStyleText = indentStyleText; +//# sourceMappingURL=indentStyleText.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.js.map b/node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.js.map new file mode 100644 index 00000000..0598e176 --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.js.map @@ -0,0 +1 @@ +{"version":3,"file":"indentStyleText.js","sourceRoot":"","sources":["../../src/indentStyleText.ts"],"names":[],"mappings":";;;AAAA,2CAAkD;AAE3C,MAAM,eAAe,GAAG,CAC7B,MAAc,EACd,IAAY,EACZ,SAAsB,EAAE,EAChB,EAAE,CACV,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CACnC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;IACzB,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,qBAAS,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,GAAG,MAAM,CAAC,EAAE,CACxE,CAAA;AATU,QAAA,eAAe,mBASzB"} \ No newline at end of file diff --git a/node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.spec.d.ts b/node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.spec.d.ts new file mode 100644 index 00000000..fdc9ef05 --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.spec.d.ts @@ -0,0 +1,2 @@ +import 'should'; +//# sourceMappingURL=indentStyleText.spec.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.spec.d.ts.map b/node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.spec.d.ts.map new file mode 100644 index 00000000..9216085c --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.spec.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"indentStyleText.spec.d.ts","sourceRoot":"","sources":["../../src/indentStyleText.spec.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.spec.js b/node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.spec.js new file mode 100644 index 00000000..3db862ca --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.spec.js @@ -0,0 +1,38 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("should"); +const indentStyleText_1 = require("./indentStyleText"); +const styleText_1 = require("./styleText"); +describe('indentStyleText', () => { + it('leaves text unstyled', () => { + indentStyleText_1.indentStyleText(0, 'some text').should.eql('some text'); + }); + it('trims text on the right', () => { + indentStyleText_1.indentStyleText(0, ' \t some text ').should.eql(' \t some text'); + }); + it('indents text', () => { + indentStyleText_1.indentStyleText(2, 'some text').should.eql(' some text'); + }); + it('indents and trims text on the right', () => { + indentStyleText_1.indentStyleText(2, ' some text ').should.eql(' some text'); + }); + it('trims multiline text', () => { + indentStyleText_1.indentStyleText(0, ' \t \n some \t \n \t more text \n ').should.eql('\n some\n \t more text\n'); + }); + it('indents multiline text', () => { + indentStyleText_1.indentStyleText(3, ' \n some \n \t more text \n ').should.eql('\n some\n \t more text\n'); + }); + it("doesn't indent only whitespace-lines", () => { + indentStyleText_1.indentStyleText(3, '\n \n \t').should.eql('\n\n'); + }); + it('applies styles to the text', () => { + indentStyleText_1.indentStyleText(0, 'some text', ['red']).should.eql(styleText_1.styleText('some text', 'red')); + }); + it('applies styles separately to lines', () => { + indentStyleText_1.indentStyleText(0, 'some text\nmore text', ['red']).should.eql(`${styleText_1.styleText('some text', 'red')}\n${styleText_1.styleText('more text', 'red')}`); + }); + it('applies styles separately to indented lines', () => { + indentStyleText_1.indentStyleText(2, 'some text\nmore text', ['red']).should.eql(` ${styleText_1.styleText('some text', 'red')}\n ${styleText_1.styleText('more text', 'red')}`); + }); +}); +//# sourceMappingURL=indentStyleText.spec.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.spec.js.map b/node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.spec.js.map new file mode 100644 index 00000000..ede062a9 --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/lib/src/indentStyleText.spec.js.map @@ -0,0 +1 @@ +{"version":3,"file":"indentStyleText.spec.js","sourceRoot":"","sources":["../../src/indentStyleText.spec.ts"],"names":[],"mappings":";;AAAA,kBAAe;AAEf,uDAAmD;AACnD,2CAAuC;AAEvC,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,iCAAe,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IACzD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,iCAAe,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;IACpE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;QACtB,iCAAe,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;IAC3D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,iCAAe,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;IACpE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,iCAAe,CAAC,CAAC,EAAE,4CAA4C,CAAC,CAAC,MAAM,CAAC,GAAG,CACzE,+BAA+B,CAChC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,iCAAe,CAAC,CAAC,EAAE,wCAAwC,CAAC,CAAC,MAAM,CAAC,GAAG,CACrE,qCAAqC,CACtC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,iCAAe,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,iCAAe,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CACjD,qBAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAC9B,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,iCAAe,CAAC,CAAC,EAAE,sBAAsB,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAC5D,GAAG,qBAAS,CAAC,WAAW,EAAE,KAAK,CAAC,KAAK,qBAAS,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,CACrE,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,iCAAe,CAAC,CAAC,EAAE,sBAAsB,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAC5D,KAAK,qBAAS,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,qBAAS,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,CACzE,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/pretty-formatter/lib/src/index.d.ts b/node_modules/@cucumber/pretty-formatter/lib/src/index.d.ts new file mode 100644 index 00000000..f5972367 --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/lib/src/index.d.ts @@ -0,0 +1,24 @@ +import { SummaryFormatter, IFormatterOptions } from '@cucumber/cucumber'; +import { ThemeStyles } from './theme'; +export declare const DEFAULT_THEME: ThemeStyles; +export default class PrettyFormatter extends SummaryFormatter { + private uri?; + private lastRuleId?; + private indentOffset; + private logItem; + private styleItem; + private tableLayout; + constructor(options: IFormatterOptions); + private parseEnvelope; + private onTestCaseStarted; + private onTestStepStarted; + private onTestStepFinished; + private onTestCaseFinished; + private renderTags; + private renderFeatureHead; + private renderRule; + private renderScenarioHead; + private renderLocation; + private newline; +} +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/pretty-formatter/lib/src/index.d.ts.map b/node_modules/@cucumber/pretty-formatter/lib/src/index.d.ts.map new file mode 100644 index 00000000..eb048e40 --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/lib/src/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,gBAAgB,EAChB,iBAAiB,EAElB,MAAM,oBAAoB,CAAA;AAO3B,OAAO,EAAwB,WAAW,EAAE,MAAM,SAAS,CAAA;AAsC3D,eAAO,MAAM,aAAa,EAAE,WAmB3B,CAAA;AAED,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,gBAAgB;IAC3D,OAAO,CAAC,GAAG,CAAC,CAAQ;IACpB,OAAO,CAAC,UAAU,CAAC,CAAQ;IAC3B,OAAO,CAAC,YAAY,CAAI;IACxB,OAAO,CAAC,OAAO,CAA8C;IAC7D,OAAO,CAAC,SAAS,CAIN;IACX,OAAO,CAAC,WAAW,CAAmC;gBAE1C,OAAO,EAAE,iBAAiB;IAoDtC,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,iBAAiB;IAwBzB,OAAO,CAAC,iBAAiB;IAmDzB,OAAO,CAAC,kBAAkB;IAmB1B,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,UAAU;IAgBlB,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,kBAAkB;IAmB1B,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,OAAO;CAGhB"} \ No newline at end of file diff --git a/node_modules/@cucumber/pretty-formatter/lib/src/index.js b/node_modules/@cucumber/pretty-formatter/lib/src/index.js new file mode 100644 index 00000000..4de30b17 --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/lib/src/index.js @@ -0,0 +1,237 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DEFAULT_THEME = void 0; +const cucumber_1 = require("@cucumber/cucumber"); +const CliTable3 = require("cli-table3"); +const figures_1 = require("figures"); +const os_1 = require("os"); +const ts_dedent_1 = require("ts-dedent"); +const theme_1 = require("./theme"); +const { formatLocation, GherkinDocumentParser, PickleParser } = cucumber_1.formatterHelpers; +const { getGherkinExampleRuleMap, getGherkinScenarioMap, getGherkinStepMap } = GherkinDocumentParser; +const { getPickleStepMap } = PickleParser; +const marks = { + [cucumber_1.Status.AMBIGUOUS]: figures_1.cross, + [cucumber_1.Status.FAILED]: figures_1.cross, + [cucumber_1.Status.PASSED]: figures_1.tick, + [cucumber_1.Status.PENDING]: '?', + [cucumber_1.Status.SKIPPED]: '-', + [cucumber_1.Status.UNDEFINED]: '?', + [cucumber_1.Status.UNKNOWN]: '?', +}; +const themeItemIndentations = { + [theme_1.ThemeItem.DataTable]: 6, + [theme_1.ThemeItem.DataTableBorder]: 0, + [theme_1.ThemeItem.DataTableContent]: 0, + [theme_1.ThemeItem.DocStringContent]: 6, + [theme_1.ThemeItem.DocStringDelimiter]: 6, + [theme_1.ThemeItem.FeatureDescription]: 2, + [theme_1.ThemeItem.FeatureKeyword]: 0, + [theme_1.ThemeItem.FeatureName]: 0, + [theme_1.ThemeItem.Location]: 0, + [theme_1.ThemeItem.RuleKeyword]: 2, + [theme_1.ThemeItem.RuleName]: 0, + [theme_1.ThemeItem.ScenarioKeyword]: 2, + [theme_1.ThemeItem.ScenarioName]: 0, + [theme_1.ThemeItem.StepKeyword]: 4, + [theme_1.ThemeItem.StepMessage]: 6, + [theme_1.ThemeItem.StepStatus]: 4, + [theme_1.ThemeItem.StepText]: 0, + [theme_1.ThemeItem.Tag]: 0, +}; +exports.DEFAULT_THEME = { + [theme_1.ThemeItem.DataTable]: [], + [theme_1.ThemeItem.DataTableBorder]: ['gray'], + [theme_1.ThemeItem.DataTableContent]: ['gray', 'italic'], + [theme_1.ThemeItem.DocStringContent]: ['gray', 'italic'], + [theme_1.ThemeItem.DocStringDelimiter]: ['gray'], + [theme_1.ThemeItem.FeatureDescription]: ['gray'], + [theme_1.ThemeItem.FeatureKeyword]: ['blueBright', 'bold'], + [theme_1.ThemeItem.FeatureName]: ['blueBright', 'underline'], + [theme_1.ThemeItem.Location]: ['dim'], + [theme_1.ThemeItem.RuleKeyword]: ['blueBright', 'bold'], + [theme_1.ThemeItem.RuleName]: ['blueBright', 'underline'], + [theme_1.ThemeItem.ScenarioKeyword]: ['cyan', 'bold'], + [theme_1.ThemeItem.ScenarioName]: ['cyan', 'underline'], + [theme_1.ThemeItem.StepKeyword]: ['cyan'], + [theme_1.ThemeItem.StepMessage]: [], + [theme_1.ThemeItem.StepStatus]: [], + [theme_1.ThemeItem.StepText]: [], + [theme_1.ThemeItem.Tag]: ['cyan'], +}; +class PrettyFormatter extends cucumber_1.SummaryFormatter { + constructor(options) { + super(options); + this.indentOffset = 0; + const theme = theme_1.makeTheme(!!options.parsedArgvOptions.colorsEnabled + ? options.parsedArgvOptions.theme || exports.DEFAULT_THEME + : {}); + this.styleItem = (indent, item, ...text) => { + if (indent > 0 && this.indentOffset > 0) + indent = indent + this.indentOffset; + return theme.indentStyleText(indent, item, ...text); + }; + this.logItem = (item, ...text) => this.log(this.styleItem(themeItemIndentations[item], item, ...text)); + this.parseEnvelope = this.parseEnvelope.bind(this); + const tableFrameChar = theme.indentStyleText(0, theme_1.ThemeItem.DataTableBorder, '│'); + this.tableLayout = { + chars: { + left: tableFrameChar, + middle: tableFrameChar, + right: tableFrameChar, + top: '', + 'top-left': '', + 'top-mid': '', + 'top-right': '', + mid: '', + 'left-mid': '', + 'mid-mid': '', + 'right-mid': '', + bottom: '', + 'bottom-left': '', + 'bottom-mid': '', + 'bottom-right': '', + }, + style: { + head: [], + border: [], + }, + }; + options.eventBroadcaster.on('envelope', this.parseEnvelope); + } + parseEnvelope(envelope) { + if (envelope.testCaseStarted) + this.onTestCaseStarted(envelope.testCaseStarted); + if (envelope.testStepStarted) + this.onTestStepStarted(envelope.testStepStarted); + if (envelope.testStepFinished) + this.onTestStepFinished(envelope.testStepFinished); + if (envelope.testCaseFinished) + this.onTestCaseFinished(envelope.testCaseFinished); + } + onTestCaseStarted(testCaseStarted) { + const { gherkinDocument, pickle } = this.eventDataCollector.getTestCaseAttempt(testCaseStarted.id || ''); + const { feature } = gherkinDocument; + if (this.uri !== gherkinDocument.uri && feature) { + this.indentOffset = 0; + this.uri = gherkinDocument.uri || ''; + this.lastRuleId = undefined; + this.renderFeatureHead(feature); + } + const gherkinExampleRuleMap = getGherkinExampleRuleMap(gherkinDocument); + if (!pickle.astNodeIds) + throw new Error('Pickle AST nodes missing'); + const rule = gherkinExampleRuleMap[pickle.astNodeIds[0]]; + if (rule && rule.id !== this.lastRuleId) { + this.indentOffset = 0; + this.renderRule(rule); + this.lastRuleId = rule.id; + this.indentOffset = 2; + } + this.renderScenarioHead(gherkinDocument, pickle); + } + onTestStepStarted(testStepStarted) { + const { gherkinDocument, pickle, testCase } = this.eventDataCollector.getTestCaseAttempt(testStepStarted.testCaseStartedId || ''); + const pickleStepMap = getPickleStepMap(pickle); + const gherkinStepMap = getGherkinStepMap(gherkinDocument); + const testStep = (testCase.testSteps || []).find((item) => item.id === testStepStarted.testStepId); + if (testStep && testStep.pickleStepId) { + const pickleStep = pickleStepMap[testStep.pickleStepId]; + const astNodeId = pickleStep.astNodeIds[0]; + const gherkinStep = gherkinStepMap[astNodeId]; + this.logItem(theme_1.ThemeItem.StepKeyword, gherkinStep.keyword); + this.log(' '); + this.logItem(theme_1.ThemeItem.StepText, pickleStep.text); + this.newline(); + if (gherkinStep.docString) { + this.logItem(theme_1.ThemeItem.DocStringDelimiter, gherkinStep.docString.delimiter); + this.newline(); + this.logItem(theme_1.ThemeItem.DocStringContent, gherkinStep.docString.content); + this.newline(); + this.logItem(theme_1.ThemeItem.DocStringDelimiter, gherkinStep.docString.delimiter); + this.newline(); + } + if (gherkinStep.dataTable) { + const datatable = new CliTable3(this.tableLayout); + datatable.push(...gherkinStep.dataTable.rows.map((row) => (row.cells || []).map((cell) => this.styleItem(0, theme_1.ThemeItem.DataTableContent, cell.value || '')))); + this.logItem(theme_1.ThemeItem.DataTable, datatable.toString()); + this.newline(); + } + } + } + onTestStepFinished(testStepFinished) { + const { message, status } = testStepFinished.testStepResult || {}; + if (status && status !== cucumber_1.Status.PASSED) { + this.logItem(theme_1.ThemeItem.StepStatus, this.colorFns.forStatus(status)(`${marks[status]} ${cucumber_1.Status[status].toLowerCase()}`)); + this.newline(); + if (message) { + this.logItem(theme_1.ThemeItem.StepMessage, message); + this.newline(); + } + } + } + onTestCaseFinished(_testCaseFinished) { + this.newline(); + } + renderTags(indent, tags) { + const tagStrings = tags.reduce((tags, tag) => (tag.name ? [...tags, tag.name] : tags), []); + if (tagStrings.length > 0) { + const firstTag = tagStrings.shift(); + this.log(this.styleItem(indent, theme_1.ThemeItem.Tag, firstTag)); + tagStrings.forEach((tag) => { + this.log(' '); + this.logItem(theme_1.ThemeItem.Tag, tag); + }); + this.newline(); + } + } + renderFeatureHead(feature) { + var _a; + this.renderTags(0, feature.tags || []); + this.logItem(theme_1.ThemeItem.FeatureKeyword, feature.keyword || '[feature]', ':'); + this.log(' '); + this.logItem(theme_1.ThemeItem.FeatureName, feature.name || ''); + if (feature.location) { + this.log(' '); + this.renderLocation(((_a = feature.location) === null || _a === void 0 ? void 0 : _a.line) || -1); + } + this.newline(); + if (feature.description) { + this.newline(); + this.logItem(theme_1.ThemeItem.FeatureDescription, ts_dedent_1.default(feature.description.trim())); + this.newline(); + } + this.newline(); + } + renderRule(rule) { + this.logItem(theme_1.ThemeItem.RuleKeyword, rule.keyword, ':'); + this.log(' '); + this.logItem(theme_1.ThemeItem.RuleName, rule.name || ''); + this.newline(); + this.newline(); + } + renderScenarioHead(gherkinDocument, pickle) { + var _a; + this.renderTags(2, pickle.tags || []); + const gherkinScenarioMap = getGherkinScenarioMap(gherkinDocument); + if (!pickle.astNodeIds) + throw new Error('Pickle AST nodes missing'); + const scenario = gherkinScenarioMap[pickle.astNodeIds[0]]; + this.logItem(theme_1.ThemeItem.ScenarioKeyword, scenario.keyword || '???', ':'); + this.log(' '); + this.logItem(theme_1.ThemeItem.ScenarioName, pickle.name || ''); + if (gherkinScenarioMap[pickle.astNodeIds[0]]) { + this.log(' '); + this.renderLocation(((_a = scenario.location) === null || _a === void 0 ? void 0 : _a.line) || -1); + } + this.newline(); + } + renderLocation(line) { + this.logItem(theme_1.ThemeItem.Location, '# ', formatLocation({ uri: this.uri || '', line }, process.cwd())); + } + newline() { + this.log(os_1.EOL); + } +} +exports.default = PrettyFormatter; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/pretty-formatter/lib/src/index.js.map b/node_modules/@cucumber/pretty-formatter/lib/src/index.js.map new file mode 100644 index 00000000..72f81c4f --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/lib/src/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/pretty-formatter/lib/src/styleText.d.ts b/node_modules/@cucumber/pretty-formatter/lib/src/styleText.d.ts new file mode 100644 index 00000000..9c98cce5 --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/lib/src/styleText.d.ts @@ -0,0 +1,4 @@ +import { BackgroundColor, ForegroundColor, Modifier } from 'ansi-styles'; +export declare type TextStyle = keyof BackgroundColor | keyof ForegroundColor | keyof Modifier; +export declare const styleText: (text: string, ...styles: TextStyle[]) => string; +//# sourceMappingURL=styleText.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/pretty-formatter/lib/src/styleText.d.ts.map b/node_modules/@cucumber/pretty-formatter/lib/src/styleText.d.ts.map new file mode 100644 index 00000000..c4264b3f --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/lib/src/styleText.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"styleText.d.ts","sourceRoot":"","sources":["../../src/styleText.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAIf,eAAe,EAEf,QAAQ,EACT,MAAM,aAAa,CAAA;AAEpB,oBAAY,SAAS,GACjB,MAAM,eAAe,GACrB,MAAM,eAAe,GACrB,MAAM,QAAQ,CAAA;AASlB,eAAO,MAAM,SAAS,SAAU,MAAM,aAAa,SAAS,EAAE,KAAG,MAGhE,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/pretty-formatter/lib/src/styleText.js b/node_modules/@cucumber/pretty-formatter/lib/src/styleText.js new file mode 100644 index 00000000..e5d3b89e --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/lib/src/styleText.js @@ -0,0 +1,22 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.styleText = void 0; +const ansi_styles_1 = require("ansi-styles"); +const styleDefs = { + ...ansi_styles_1.bgColor, + ...ansi_styles_1.color, + ...ansi_styles_1.modifier, +}; +const styleText = (text, ...styles) => { + validateStyles(styles); + return applyStyles(...styles)(text); +}; +exports.styleText = styleText; +const validateStyles = (styles) => { + styles.forEach((style) => { + if (!(style in styleDefs)) + throw new Error(`Unknown style "${style}"`); + }); +}; +const applyStyles = (...styles) => styles.reduce((fn, style) => (text) => fn(`${styleDefs[style].open}${text}${styleDefs[style].close}`), (text) => text); +//# sourceMappingURL=styleText.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/pretty-formatter/lib/src/styleText.js.map b/node_modules/@cucumber/pretty-formatter/lib/src/styleText.js.map new file mode 100644 index 00000000..25f4ff71 --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/lib/src/styleText.js.map @@ -0,0 +1 @@ +{"version":3,"file":"styleText.js","sourceRoot":"","sources":["../../src/styleText.ts"],"names":[],"mappings":";;;AAAA,6CAQoB;AAQpB,MAAM,SAAS,GAAmC;IAChD,GAAG,qBAAO;IACV,GAAG,mBAAK;IACR,GAAG,sBAAQ;CACZ,CAAA;AAEM,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,GAAG,MAAmB,EAAU,EAAE;IACxE,cAAc,CAAC,MAAM,CAAC,CAAA;IACtB,OAAO,WAAW,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAA;AACrC,CAAC,CAAA;AAHY,QAAA,SAAS,aAGrB;AAED,MAAM,cAAc,GAAG,CAAC,MAAmB,EAAE,EAAE;IAC7C,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QACvB,IAAI,CAAC,CAAC,KAAK,IAAI,SAAS,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,KAAK,GAAG,CAAC,CAAA;IACxE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,MAAM,WAAW,GAAG,CAAC,GAAG,MAAmB,EAAiB,EAAE,CAC5D,MAAM,CAAC,MAAM,CACX,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CACtB,EAAE,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,EAChE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CACf,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/pretty-formatter/lib/src/styleText.spec.d.ts b/node_modules/@cucumber/pretty-formatter/lib/src/styleText.spec.d.ts new file mode 100644 index 00000000..b1304dde --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/lib/src/styleText.spec.d.ts @@ -0,0 +1,2 @@ +import 'should'; +//# sourceMappingURL=styleText.spec.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/pretty-formatter/lib/src/styleText.spec.d.ts.map b/node_modules/@cucumber/pretty-formatter/lib/src/styleText.spec.d.ts.map new file mode 100644 index 00000000..1179f43d --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/lib/src/styleText.spec.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"styleText.spec.d.ts","sourceRoot":"","sources":["../../src/styleText.spec.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/pretty-formatter/lib/src/styleText.spec.js b/node_modules/@cucumber/pretty-formatter/lib/src/styleText.spec.js new file mode 100644 index 00000000..7d8ed899 --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/lib/src/styleText.spec.js @@ -0,0 +1,57 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("should"); +const styleText_1 = require("./styleText"); +describe('styleText()', () => { + it('applies modifiers', () => { + styleText_1.styleText('Burpless 26', 'bold').should.containEql('\u001b[1mBurpless 26\u001b[22m'); + styleText_1.styleText('Burpless 26', 'italic').should.containEql('\u001b[3mBurpless 26\u001b[23m'); + }); + it('applies foreground colors (red)', () => { + styleText_1.styleText('Burpless 26', 'red').should.containEql('\u001b[31mBurpless 26\u001b[39m'); + }); + it('applies foreground colors (green)', () => { + styleText_1.styleText('Burpless 26', 'green').should.containEql('\u001b[32mBurpless 26\u001b[39m'); + }); + it('applies foreground colors (blue)', () => { + styleText_1.styleText('Burpless 26', 'blue').should.containEql('\u001b[34mBurpless 26\u001b[39m'); + }); + it('applies bright foreground colors (red)', () => { + styleText_1.styleText('Burpless 26', 'redBright').should.containEql('\u001b[91mBurpless 26\u001b[39m'); + }); + it('applies bright foreground colors (green)', () => { + styleText_1.styleText('Burpless 26', 'greenBright').should.containEql('\u001b[92mBurpless 26\u001b[39m'); + }); + it('applies bright foreground colors (blue)', () => { + styleText_1.styleText('Burpless 26', 'blueBright').should.containEql('\u001b[94mBurpless 26\u001b[39m'); + }); + it('applies background colors (red)', () => { + styleText_1.styleText('Burpless 26', 'bgRed').should.containEql('\u001b[41mBurpless 26\u001b[49m'); + }); + it('applies background colors (green)', () => { + styleText_1.styleText('Burpless 26', 'bgGreen').should.containEql('\u001b[42mBurpless 26\u001b[49m'); + }); + it('applies background colors (blue)', () => { + styleText_1.styleText('Burpless 26', 'bgBlue').should.containEql('\u001b[44mBurpless 26\u001b[49m'); + }); + it('applies bright background colors (red)', () => { + styleText_1.styleText('Burpless 26', 'bgRedBright').should.containEql('\u001b[101mBurpless 26\u001b[49m'); + }); + it('applies bright background colors (green)', () => { + styleText_1.styleText('Burpless 26', 'bgGreenBright').should.containEql('\u001b[102mBurpless 26\u001b[49m'); + }); + it('applies bright background colors (blue)', () => { + styleText_1.styleText('Burpless 26', 'bgBlueBright').should.containEql('\u001b[104mBurpless 26\u001b[49m'); + }); + it('combines modifiers, foreground and background colors', () => { + styleText_1.styleText('Burpless 26', 'redBright', 'bgBlueBright', 'bold').should.containEql('\u001b[91m\u001b[104m\u001b[1mBurpless 26\u001b[22m\u001b[49m\u001b[39m'); + }); + it('fails with a clear error on unknown styles', () => { + ; + (() => + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + styleText_1.styleText('Burpless 26', 'ultraviolet')).should.throwError('Unknown style "ultraviolet"'); + }); +}); +//# sourceMappingURL=styleText.spec.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/pretty-formatter/lib/src/styleText.spec.js.map b/node_modules/@cucumber/pretty-formatter/lib/src/styleText.spec.js.map new file mode 100644 index 00000000..81bbbcc7 --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/lib/src/styleText.spec.js.map @@ -0,0 +1 @@ +{"version":3,"file":"styleText.spec.js","sourceRoot":"","sources":["../../src/styleText.spec.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/pretty-formatter/lib/src/theme.d.ts b/node_modules/@cucumber/pretty-formatter/lib/src/theme.d.ts new file mode 100644 index 00000000..f2fd2751 --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/lib/src/theme.d.ts @@ -0,0 +1,30 @@ +import { TextStyle } from './styleText'; +export declare enum ThemeItem { + DataTable = "datatable", + DataTableBorder = "datatable border", + DataTableContent = "datatable content", + DocStringContent = "docstring content", + DocStringDelimiter = "docstring delimiter", + FeatureDescription = "feature description", + FeatureKeyword = "feature keyword", + FeatureName = "feature name", + Location = "location", + RuleKeyword = "rule keyword", + RuleName = "rule name", + ScenarioKeyword = "scenario keyword", + ScenarioName = "scenario name", + StepKeyword = "step keyword", + StepMessage = "step message", + StepStatus = "step status", + StepText = "step text", + Tag = "tag" +} +export declare type ThemeStyles = { + [key in ThemeItem]: TextStyle[]; +}; +export declare const makeTheme: (styles: Partial) => ThemeHelpers; +export declare type IndentStyleThemeItem = (indent: number, item: ThemeItem, ...text: string[]) => string; +export declare type ThemeHelpers = { + indentStyleText: IndentStyleThemeItem; +}; +//# sourceMappingURL=theme.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/pretty-formatter/lib/src/theme.d.ts.map b/node_modules/@cucumber/pretty-formatter/lib/src/theme.d.ts.map new file mode 100644 index 00000000..002b52da --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/lib/src/theme.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/theme.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,oBAAY,SAAS;IACnB,SAAS,cAAc;IACvB,eAAe,qBAAqB;IACpC,gBAAgB,sBAAsB;IACtC,gBAAgB,sBAAsB;IACtC,kBAAkB,wBAAwB;IAC1C,kBAAkB,wBAAwB;IAC1C,cAAc,oBAAoB;IAClC,WAAW,iBAAiB;IAC5B,QAAQ,aAAa;IACrB,WAAW,iBAAiB;IAC5B,QAAQ,cAAc;IACtB,eAAe,qBAAqB;IACpC,YAAY,kBAAkB;IAC9B,WAAW,iBAAiB;IAC5B,WAAW,iBAAiB;IAC5B,UAAU,gBAAgB;IAC1B,QAAQ,cAAc;IACtB,GAAG,QAAQ;CACZ;AACD,oBAAY,WAAW,GAAG;KAAG,GAAG,IAAI,SAAS,GAAG,SAAS,EAAE;CAAE,CAAA;AAuB7D,eAAO,MAAM,SAAS,WAAY,QAAQ,WAAW,CAAC,KAAG,YAkBxD,CAAA;AAED,oBAAY,oBAAoB,GAAG,CACjC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,SAAS,EACf,GAAG,IAAI,EAAE,MAAM,EAAE,KACd,MAAM,CAAA;AACX,oBAAY,YAAY,GAAG;IACzB,eAAe,EAAE,oBAAoB,CAAA;CACtC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/pretty-formatter/lib/src/theme.js b/node_modules/@cucumber/pretty-formatter/lib/src/theme.js new file mode 100644 index 00000000..bcae1e9e --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/lib/src/theme.js @@ -0,0 +1,60 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.makeTheme = exports.ThemeItem = void 0; +const indentStyleText_1 = require("./indentStyleText"); +var ThemeItem; +(function (ThemeItem) { + ThemeItem["DataTable"] = "datatable"; + ThemeItem["DataTableBorder"] = "datatable border"; + ThemeItem["DataTableContent"] = "datatable content"; + ThemeItem["DocStringContent"] = "docstring content"; + ThemeItem["DocStringDelimiter"] = "docstring delimiter"; + ThemeItem["FeatureDescription"] = "feature description"; + ThemeItem["FeatureKeyword"] = "feature keyword"; + ThemeItem["FeatureName"] = "feature name"; + ThemeItem["Location"] = "location"; + ThemeItem["RuleKeyword"] = "rule keyword"; + ThemeItem["RuleName"] = "rule name"; + ThemeItem["ScenarioKeyword"] = "scenario keyword"; + ThemeItem["ScenarioName"] = "scenario name"; + ThemeItem["StepKeyword"] = "step keyword"; + ThemeItem["StepMessage"] = "step message"; + ThemeItem["StepStatus"] = "step status"; + ThemeItem["StepText"] = "step text"; + ThemeItem["Tag"] = "tag"; +})(ThemeItem = exports.ThemeItem || (exports.ThemeItem = {})); +const unstyledTheme = { + [ThemeItem.DataTable]: [], + [ThemeItem.DataTableBorder]: [], + [ThemeItem.DataTableContent]: [], + [ThemeItem.DocStringContent]: [], + [ThemeItem.DocStringDelimiter]: [], + [ThemeItem.FeatureDescription]: [], + [ThemeItem.FeatureKeyword]: [], + [ThemeItem.FeatureName]: [], + [ThemeItem.Location]: [], + [ThemeItem.RuleKeyword]: [], + [ThemeItem.RuleName]: [], + [ThemeItem.ScenarioKeyword]: [], + [ThemeItem.ScenarioName]: [], + [ThemeItem.StepKeyword]: [], + [ThemeItem.StepMessage]: [], + [ThemeItem.StepStatus]: [], + [ThemeItem.StepText]: [], + [ThemeItem.Tag]: [], +}; +const makeTheme = (styles) => { + const validateItemExists = (item) => { + if (!Object.values(ThemeItem).includes(item)) + throw new Error(`Unknown theme item "${item}"`); + }; + Object.keys(styles).forEach(validateItemExists); + return { + indentStyleText: (indent, item, ...text) => { + validateItemExists(item); + return indentStyleText_1.indentStyleText(indent, text.join(''), { ...unstyledTheme, ...styles }[item]); + }, + }; +}; +exports.makeTheme = makeTheme; +//# sourceMappingURL=theme.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/pretty-formatter/lib/src/theme.js.map b/node_modules/@cucumber/pretty-formatter/lib/src/theme.js.map new file mode 100644 index 00000000..f4e96503 --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/lib/src/theme.js.map @@ -0,0 +1 @@ +{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/theme.ts"],"names":[],"mappings":";;;AAAA,uDAAmD;AAGnD,IAAY,SAmBX;AAnBD,WAAY,SAAS;IACnB,oCAAuB,CAAA;IACvB,iDAAoC,CAAA;IACpC,mDAAsC,CAAA;IACtC,mDAAsC,CAAA;IACtC,uDAA0C,CAAA;IAC1C,uDAA0C,CAAA;IAC1C,+CAAkC,CAAA;IAClC,yCAA4B,CAAA;IAC5B,kCAAqB,CAAA;IACrB,yCAA4B,CAAA;IAC5B,mCAAsB,CAAA;IACtB,iDAAoC,CAAA;IACpC,2CAA8B,CAAA;IAC9B,yCAA4B,CAAA;IAC5B,yCAA4B,CAAA;IAC5B,uCAA0B,CAAA;IAC1B,mCAAsB,CAAA;IACtB,wBAAW,CAAA;AACb,CAAC,EAnBW,SAAS,GAAT,iBAAS,KAAT,iBAAS,QAmBpB;AAGD,MAAM,aAAa,GAAgB;IACjC,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,EAAE;IACzB,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,EAAE;IAC/B,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,EAAE;IAChC,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,EAAE;IAChC,CAAC,SAAS,CAAC,kBAAkB,CAAC,EAAE,EAAE;IAClC,CAAC,SAAS,CAAC,kBAAkB,CAAC,EAAE,EAAE;IAClC,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,EAAE;IAC9B,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,EAAE;IAC3B,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE;IACxB,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,EAAE;IAC3B,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE;IACxB,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,EAAE;IAC/B,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,EAAE;IAC5B,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,EAAE;IAC3B,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,EAAE;IAC3B,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,EAAE;IAC1B,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE;IACxB,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE;CACpB,CAAA;AAEM,MAAM,SAAS,GAAG,CAAC,MAA4B,EAAgB,EAAE;IACtE,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAE,EAAE;QAC1C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAiB,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,GAAG,CAAC,CAAA;IACnD,CAAC,CAAA;IAED,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAA;IAE/C,OAAO;QACL,eAAe,EAAE,CAAC,MAAc,EAAE,IAAe,EAAE,GAAG,IAAc,EAAE,EAAE;YACtE,kBAAkB,CAAC,IAAI,CAAC,CAAA;YACxB,OAAO,iCAAe,CACpB,MAAM,EACN,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EACb,EAAE,GAAG,aAAa,EAAE,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CACtC,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC,CAAA;AAlBY,QAAA,SAAS,aAkBrB"} \ No newline at end of file diff --git a/node_modules/@cucumber/pretty-formatter/lib/src/theme.spec.d.ts b/node_modules/@cucumber/pretty-formatter/lib/src/theme.spec.d.ts new file mode 100644 index 00000000..12764372 --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/lib/src/theme.spec.d.ts @@ -0,0 +1,2 @@ +import 'should'; +//# sourceMappingURL=theme.spec.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/pretty-formatter/lib/src/theme.spec.d.ts.map b/node_modules/@cucumber/pretty-formatter/lib/src/theme.spec.d.ts.map new file mode 100644 index 00000000..991d8f2e --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/lib/src/theme.spec.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"theme.spec.d.ts","sourceRoot":"","sources":["../../src/theme.spec.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/pretty-formatter/lib/src/theme.spec.js b/node_modules/@cucumber/pretty-formatter/lib/src/theme.spec.js new file mode 100644 index 00000000..1ffc7a93 --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/lib/src/theme.spec.js @@ -0,0 +1,119 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("should"); +const styleText_1 = require("./styleText"); +const theme_1 = require("./theme"); +describe('Theme', () => { + let styleThemeItem; + beforeEach(() => { + const styles = { + [theme_1.ThemeItem.DataTable]: ['bgRed'], + [theme_1.ThemeItem.DataTableBorder]: ['red'], + [theme_1.ThemeItem.DataTableContent]: ['blue'], + [theme_1.ThemeItem.DocStringContent]: ['green'], + [theme_1.ThemeItem.DocStringDelimiter]: ['red'], + [theme_1.ThemeItem.FeatureDescription]: ['white'], + [theme_1.ThemeItem.FeatureKeyword]: ['red'], + [theme_1.ThemeItem.FeatureName]: ['yellow'], + [theme_1.ThemeItem.Location]: ['bgWhite', 'black'], + [theme_1.ThemeItem.RuleKeyword]: ['green'], + [theme_1.ThemeItem.RuleName]: ['bgRed'], + [theme_1.ThemeItem.ScenarioKeyword]: ['blue'], + [theme_1.ThemeItem.ScenarioName]: ['blue', 'underline'], + [theme_1.ThemeItem.StepKeyword]: ['magenta'], + [theme_1.ThemeItem.StepMessage]: ['bgCyan'], + [theme_1.ThemeItem.StepStatus]: ['bgRed'], + [theme_1.ThemeItem.StepText]: ['bgYellow'], + [theme_1.ThemeItem.Tag]: ['bgRed'], + }; + styleThemeItem = theme_1.makeTheme(styles).indentStyleText; + }); + it('applies styles to Feature keywords', () => { + styleThemeItem(0, theme_1.ThemeItem.FeatureKeyword, 'Fonctionnalité:').should.containEql(styleText_1.styleText('Fonctionnalité:', 'red')); + }); + it('applies styles to Feature names', () => { + styleThemeItem(0, theme_1.ThemeItem.FeatureName, 'my feature').should.containEql(styleText_1.styleText('my feature', 'yellow')); + }); + it('applies styles to feature descriptions', () => { + styleThemeItem(2, theme_1.ThemeItem.FeatureDescription, 'This is some\ndescription...').should.containEql(` ${styleText_1.styleText('This is some', 'white')}\n` + + ` ${styleText_1.styleText('description...', 'white')}`); + }); + it('applies styles to locations', () => { + styleThemeItem(0, theme_1.ThemeItem.Location, '# path/to/file.feature:12').should.containEql(styleText_1.styleText('# path/to/file.feature:12', 'bgWhite', 'black')); + }); + it('applies styles to Rule keywords', () => { + styleThemeItem(0, theme_1.ThemeItem.RuleKeyword, 'Règle:').should.containEql(styleText_1.styleText('Règle:', 'green')); + }); + it('applies styles to Rule names', () => { + styleThemeItem(0, theme_1.ThemeItem.RuleName, 'my rules').should.containEql(styleText_1.styleText('my rules', 'bgRed')); + }); + it('applies styles to Scenario keywords', () => { + styleThemeItem(0, theme_1.ThemeItem.ScenarioKeyword, 'Scénario:').should.containEql(styleText_1.styleText('Scénario:', 'blue')); + }); + it('applies styles to Scenario names', () => { + styleThemeItem(0, theme_1.ThemeItem.ScenarioName, 'my scenario').should.containEql(styleText_1.styleText('my scenario', 'blue', 'underline')); + }); + it('applies styles to Step keywords', () => { + styleThemeItem(0, theme_1.ThemeItem.StepKeyword, 'Etant donné').should.containEql(styleText_1.styleText('Etant donné', 'magenta')); + }); + it('applies styles to Step text', () => { + styleThemeItem(0, theme_1.ThemeItem.StepText, 'some cucumbers').should.containEql(styleText_1.styleText('some cucumbers', 'bgYellow')); + }); + it('applies styles to Step statuses', () => { + styleThemeItem(0, theme_1.ThemeItem.StepStatus, '? undefined step').should.containEql(styleText_1.styleText('? undefined step', 'bgRed')); + }); + it('applies styles to Step messages', () => { + styleThemeItem(0, theme_1.ThemeItem.StepMessage, 'step message').should.containEql(styleText_1.styleText('step message', 'bgCyan')); + }); + it('applies styles to DocString content', () => { + styleThemeItem(0, theme_1.ThemeItem.DocStringContent, 'this is some docstring').should.containEql(styleText_1.styleText('this is some docstring', 'green')); + }); + it('applies styles to DocString delimiters', () => { + styleThemeItem(0, theme_1.ThemeItem.DocStringDelimiter, '"""').should.containEql(styleText_1.styleText('"""', 'red')); + }); + it('applies styles to DataTable', () => { + styleThemeItem(0, theme_1.ThemeItem.DataTable, '| foo | bar |\n| baz | oof |').should.containEql(`${styleText_1.styleText('| foo | bar |', 'bgRed')}\n${styleText_1.styleText('| baz | oof |', 'bgRed')}`); + }); + it('applies styles to DataTable borders', () => { + styleThemeItem(0, theme_1.ThemeItem.DataTableBorder, '|').should.containEql(styleText_1.styleText('|', 'red')); + }); + it('applies styles to DataTable content', () => { + styleThemeItem(0, theme_1.ThemeItem.DataTableContent, 'foo').should.containEql(styleText_1.styleText('foo', 'blue')); + }); + it('applies styles to feature tags', () => { + styleThemeItem(0, theme_1.ThemeItem.Tag, '@someTag').should.containEql(styleText_1.styleText('@someTag', 'bgRed')); + }); + it('concatenates multiple strings', () => { + styleThemeItem(0, theme_1.ThemeItem.StepKeyword, 'Etant', ' donné', ' que').should.containEql(styleText_1.styleText('Etant donné que', 'magenta')); + }); + it('fails when applying styles to unknown theme items', () => { + ; + (() => styleThemeItem(0, + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + 'unknown theme item', 'text')).should.throw(); + }); + it('fails when making a theme with unknown theme items', () => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + ; + (() => theme_1.makeTheme({ 'random item': ['red'] })).should.throwError('Unknown theme item "random item"'); + }); + it('defaults to unstyled items', () => { + styleThemeItem = theme_1.makeTheme({}).indentStyleText; + styleThemeItem(0, theme_1.ThemeItem.FeatureKeyword, 'Feature').should.eql('Feature'); + styleThemeItem(0, theme_1.ThemeItem.RuleKeyword, 'Rule').should.eql('Rule'); + styleThemeItem(0, theme_1.ThemeItem.ScenarioKeyword, 'Scenario').should.eql('Scenario'); + styleThemeItem(0, theme_1.ThemeItem.StepKeyword, 'Given').should.eql('Given'); + }); + it('allows some defined and some missing styles', () => { + styleThemeItem = theme_1.makeTheme({ + [theme_1.ThemeItem.FeatureKeyword]: ['red'], + }).indentStyleText; + styleThemeItem(0, theme_1.ThemeItem.FeatureKeyword, 'Feature').should.containEql(styleText_1.styleText('Feature', 'red')); + styleThemeItem(0, theme_1.ThemeItem.RuleKeyword, 'Rule').should.eql('Rule'); + styleThemeItem(0, theme_1.ThemeItem.ScenarioKeyword, 'Scenario').should.eql('Scenario'); + styleThemeItem(0, theme_1.ThemeItem.StepKeyword, 'Given').should.eql('Given'); + }); +}); +//# sourceMappingURL=theme.spec.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/pretty-formatter/lib/src/theme.spec.js.map b/node_modules/@cucumber/pretty-formatter/lib/src/theme.spec.js.map new file mode 100644 index 00000000..c45965f0 --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/lib/src/theme.spec.js.map @@ -0,0 +1 @@ +{"version":3,"file":"theme.spec.js","sourceRoot":"","sources":["../../src/theme.spec.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/pretty-formatter/package.json b/node_modules/@cucumber/pretty-formatter/package.json new file mode 100644 index 00000000..9be865bb --- /dev/null +++ b/node_modules/@cucumber/pretty-formatter/package.json @@ -0,0 +1,67 @@ +{ + "name": "@cucumber/pretty-formatter", + "version": "1.0.1", + "description": "Official Cucumber.js Pretty Formatter", + "repository": "https://github.com/cucumber/cucumber-js-pretty-formatter", + "maintainers": [ + "Julien Biezemans " + ], + "contributors": [ + "Ilya Kozhevnikov ", + "Julien Biezemans " + ], + "license": "MIT", + "main": "lib/src/index.js", + "types": "lib/src/index.d.ts", + "files": [ + "lib/src" + ], + "directories": { + "lib": "lib" + }, + "scripts": { + "build:clean:tests": "rm -rf lib/test", + "build:clean": "rm -rf lib", + "build:release": "npm run build && npm run test:nobuild && npm run build:clean:tests", + "build:watch": "tsc -p tsconfig.node.json --watch", + "build": "tsc -p tsconfig.node.json", + "lint:fix": "eslint --fix \"src/**/*.ts\" \"test/**/*.ts\"", + "lint": "eslint \"src/**/*.ts\" \"test/**/*.ts\"", + "test:mocha:wip:watch": "mocha -w -g wip", + "test:mocha:wip": "mocha -g wip", + "test:mocha": "mocha", + "test:nobuild": "npm run test:mocha", + "test": "npm run build && npm run test:mocha", + "update-dependencies": "npx npm-check-updates --upgrade --dep prod,dev,optional,bundle" + }, + "dependencies": { + "ansi-styles": "^5.0.0", + "cli-table3": "^0.6.0", + "figures": "^3.2.0", + "ts-dedent": "^2.0.0" + }, + "peerDependencies": { + "@cucumber/cucumber": ">=7.0.0", + "@cucumber/messages": "*" + }, + "devDependencies": { + "@cucumber/cucumber": "^8.3.1", + "@cucumber/messages": "^24.0.0", + "@types/glob": "^8.0.0", + "@types/mocha": "^10.0.0", + "@types/node": "^18.0.0", + "@typescript-eslint/eslint-plugin": "^7.0.0", + "@typescript-eslint/parser": "^7.0.0", + "colors": "^1.4.0", + "eslint": "^8.0.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-prettier": "^5.0.0", + "glob": "^10.0.0", + "mocha": "^10.0.0", + "prettier": "^3.0.0", + "should": "^13.2.3", + "stream-to-string": "^1.2.0", + "typescript": "^4.1.3" + } +} diff --git a/node_modules/@cucumber/query/.mocharc.json b/node_modules/@cucumber/query/.mocharc.json new file mode 100644 index 00000000..b2ba4bc1 --- /dev/null +++ b/node_modules/@cucumber/query/.mocharc.json @@ -0,0 +1,7 @@ +{ + "require": ["ts-node/register", "source-map-support/register"], + "extension": ["ts", "tsx"], + "recursive": true, + "spec": ["src/**/*.spec.*"], + "timeout": 10000 +} diff --git a/node_modules/@cucumber/query/.prettierrc.json b/node_modules/@cucumber/query/.prettierrc.json new file mode 100644 index 00000000..8e95b098 --- /dev/null +++ b/node_modules/@cucumber/query/.prettierrc.json @@ -0,0 +1,6 @@ +{ + "trailingComma": "es5", + "semi": false, + "singleQuote": true, + "printWidth": 100 +} \ No newline at end of file diff --git a/node_modules/@cucumber/query/LICENSE b/node_modules/@cucumber/query/LICENSE new file mode 100644 index 00000000..1c022048 --- /dev/null +++ b/node_modules/@cucumber/query/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Cucumber Ltd + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/@cucumber/query/dist/src/Lineage.d.ts b/node_modules/@cucumber/query/dist/src/Lineage.d.ts new file mode 100644 index 00000000..0b40690e --- /dev/null +++ b/node_modules/@cucumber/query/dist/src/Lineage.d.ts @@ -0,0 +1,32 @@ +import { Background, Examples, Feature, GherkinDocument, Pickle, Rule, Scenario, TableRow } from '@cucumber/messages'; +export interface Lineage { + gherkinDocument?: GherkinDocument; + feature?: Feature; + background?: Background; + rule?: Rule; + ruleBackground?: Background; + scenario?: Scenario; + examples?: Examples; + examplesIndex?: number; + example?: TableRow; + exampleIndex?: number; +} +export interface LineageReducer { + reduce: (lineage: Lineage, pickle: Pickle) => T; +} +export type NamingStrategy = LineageReducer; +export declare enum NamingStrategyLength { + LONG = "LONG", + SHORT = "SHORT" +} +export declare enum NamingStrategyFeatureName { + INCLUDE = "INCLUDE", + EXCLUDE = "EXCLUDE" +} +export declare enum NamingStrategyExampleName { + NUMBER = "NUMBER", + PICKLE = "PICKLE", + NUMBER_AND_PICKLE_IF_PARAMETERIZED = "NUMBER_AND_PICKLE_IF_PARAMETERIZED" +} +export declare function namingStrategy(length: NamingStrategyLength, featureName?: NamingStrategyFeatureName, exampleName?: NamingStrategyExampleName): NamingStrategy; +//# sourceMappingURL=Lineage.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/query/dist/src/Lineage.d.ts.map b/node_modules/@cucumber/query/dist/src/Lineage.d.ts.map new file mode 100644 index 00000000..18d77fcc --- /dev/null +++ b/node_modules/@cucumber/query/dist/src/Lineage.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"Lineage.d.ts","sourceRoot":"","sources":["../../src/Lineage.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,QAAQ,EACR,OAAO,EACP,eAAe,EACf,MAAM,EACN,IAAI,EACJ,QAAQ,EACR,QAAQ,EACT,MAAM,oBAAoB,CAAA;AAE3B,MAAM,WAAW,OAAO;IACtB,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,cAAc,CAAC,EAAE,UAAU,CAAA;IAC3B,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,OAAO,CAAC,EAAE,QAAQ,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC,CAAA;CAChD;AAED,MAAM,MAAM,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,CAAA;AAEnD,oBAAY,oBAAoB;IAC9B,IAAI,SAAS;IACb,KAAK,UAAU;CAChB;AAED,oBAAY,yBAAyB;IACnC,OAAO,YAAY;IACnB,OAAO,YAAY;CACpB;AAED,oBAAY,yBAAyB;IACnC,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,kCAAkC,uCAAuC;CAC1E;AA8DD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,oBAAoB,EAC5B,WAAW,GAAE,yBAA6D,EAC1E,WAAW,GAAE,yBAAwF,GACpG,cAAc,CAEhB"} \ No newline at end of file diff --git a/node_modules/@cucumber/query/dist/src/Lineage.js b/node_modules/@cucumber/query/dist/src/Lineage.js new file mode 100644 index 00000000..5bd64389 --- /dev/null +++ b/node_modules/@cucumber/query/dist/src/Lineage.js @@ -0,0 +1,78 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.NamingStrategyExampleName = exports.NamingStrategyFeatureName = exports.NamingStrategyLength = void 0; +exports.namingStrategy = namingStrategy; +var NamingStrategyLength; +(function (NamingStrategyLength) { + NamingStrategyLength["LONG"] = "LONG"; + NamingStrategyLength["SHORT"] = "SHORT"; +})(NamingStrategyLength || (exports.NamingStrategyLength = NamingStrategyLength = {})); +var NamingStrategyFeatureName; +(function (NamingStrategyFeatureName) { + NamingStrategyFeatureName["INCLUDE"] = "INCLUDE"; + NamingStrategyFeatureName["EXCLUDE"] = "EXCLUDE"; +})(NamingStrategyFeatureName || (exports.NamingStrategyFeatureName = NamingStrategyFeatureName = {})); +var NamingStrategyExampleName; +(function (NamingStrategyExampleName) { + NamingStrategyExampleName["NUMBER"] = "NUMBER"; + NamingStrategyExampleName["PICKLE"] = "PICKLE"; + NamingStrategyExampleName["NUMBER_AND_PICKLE_IF_PARAMETERIZED"] = "NUMBER_AND_PICKLE_IF_PARAMETERIZED"; +})(NamingStrategyExampleName || (exports.NamingStrategyExampleName = NamingStrategyExampleName = {})); +class BuiltinNamingStrategy { + constructor(length, featureName, exampleName) { + this.length = length; + this.featureName = featureName; + this.exampleName = exampleName; + } + reduce(lineage, pickle) { + var _a, _b, _c, _d, _e, _f, _g; + const parts = []; + if (((_a = lineage.feature) === null || _a === void 0 ? void 0 : _a.name) && this.featureName === NamingStrategyFeatureName.INCLUDE) { + parts.push(lineage.feature.name); + } + if ((_b = lineage.rule) === null || _b === void 0 ? void 0 : _b.name) { + parts.push(lineage.rule.name); + } + if ((_c = lineage.scenario) === null || _c === void 0 ? void 0 : _c.name) { + parts.push(lineage.scenario.name); + } + else { + parts.push(pickle.name); + } + if ((_d = lineage.examples) === null || _d === void 0 ? void 0 : _d.name) { + parts.push(lineage.examples.name); + } + if (lineage.example) { + const exampleNumber = [ + '#', + ((_e = lineage.examplesIndex) !== null && _e !== void 0 ? _e : 0) + 1, + '.', + ((_f = lineage.exampleIndex) !== null && _f !== void 0 ? _f : 0) + 1, + ].join(''); + switch (this.exampleName) { + case NamingStrategyExampleName.NUMBER: + parts.push(exampleNumber); + break; + case NamingStrategyExampleName.NUMBER_AND_PICKLE_IF_PARAMETERIZED: + if (((_g = lineage.scenario) === null || _g === void 0 ? void 0 : _g.name) !== pickle.name) { + parts.push(exampleNumber + ': ' + pickle.name); + } + else { + parts.push(exampleNumber); + } + break; + case NamingStrategyExampleName.PICKLE: + parts.push(pickle.name); + break; + } + } + if (this.length === NamingStrategyLength.SHORT) { + return parts.at(-1); + } + return parts.filter((part) => !!part).join(' - '); + } +} +function namingStrategy(length, featureName = NamingStrategyFeatureName.INCLUDE, exampleName = NamingStrategyExampleName.NUMBER_AND_PICKLE_IF_PARAMETERIZED) { + return new BuiltinNamingStrategy(length, featureName, exampleName); +} +//# sourceMappingURL=Lineage.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/query/dist/src/Lineage.js.map b/node_modules/@cucumber/query/dist/src/Lineage.js.map new file mode 100644 index 00000000..d05045eb --- /dev/null +++ b/node_modules/@cucumber/query/dist/src/Lineage.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Lineage.js","sourceRoot":"","sources":["../../src/Lineage.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Background,\n Examples,\n Feature,\n GherkinDocument,\n Pickle,\n Rule,\n Scenario,\n TableRow,\n} from '@cucumber/messages'\n\nexport interface Lineage {\n gherkinDocument?: GherkinDocument\n feature?: Feature\n background?: Background\n rule?: Rule\n ruleBackground?: Background\n scenario?: Scenario\n examples?: Examples\n examplesIndex?: number\n example?: TableRow\n exampleIndex?: number\n}\n\nexport interface LineageReducer {\n reduce: (lineage: Lineage, pickle: Pickle) => T\n}\n\nexport type NamingStrategy = LineageReducer\n\nexport enum NamingStrategyLength {\n LONG = 'LONG',\n SHORT = 'SHORT',\n}\n\nexport enum NamingStrategyFeatureName {\n INCLUDE = 'INCLUDE',\n EXCLUDE = 'EXCLUDE',\n}\n\nexport enum NamingStrategyExampleName {\n NUMBER = 'NUMBER',\n PICKLE = 'PICKLE',\n NUMBER_AND_PICKLE_IF_PARAMETERIZED = 'NUMBER_AND_PICKLE_IF_PARAMETERIZED',\n}\n\nclass BuiltinNamingStrategy implements NamingStrategy {\n constructor(\n private readonly length: NamingStrategyLength,\n private readonly featureName: NamingStrategyFeatureName,\n private readonly exampleName: NamingStrategyExampleName\n ) {}\n\n reduce(lineage: Lineage, pickle: Pickle): string {\n const parts: string[] = []\n\n if (lineage.feature?.name && this.featureName === NamingStrategyFeatureName.INCLUDE) {\n parts.push(lineage.feature.name)\n }\n\n if (lineage.rule?.name) {\n parts.push(lineage.rule.name)\n }\n\n if (lineage.scenario?.name) {\n parts.push(lineage.scenario.name)\n } else {\n parts.push(pickle.name)\n }\n\n if (lineage.examples?.name) {\n parts.push(lineage.examples.name)\n }\n\n if (lineage.example) {\n const exampleNumber = [\n '#',\n (lineage.examplesIndex ?? 0) + 1,\n '.',\n (lineage.exampleIndex ?? 0) + 1,\n ].join('')\n\n switch (this.exampleName) {\n case NamingStrategyExampleName.NUMBER:\n parts.push(exampleNumber)\n break\n case NamingStrategyExampleName.NUMBER_AND_PICKLE_IF_PARAMETERIZED:\n if (lineage.scenario?.name !== pickle.name) {\n parts.push(exampleNumber + ': ' + pickle.name)\n } else {\n parts.push(exampleNumber)\n }\n break\n case NamingStrategyExampleName.PICKLE:\n parts.push(pickle.name)\n break\n }\n }\n\n if (this.length === NamingStrategyLength.SHORT) {\n return parts.at(-1) as string\n }\n return parts.filter((part) => !!part).join(' - ')\n }\n}\n\nexport function namingStrategy(\n length: NamingStrategyLength,\n featureName: NamingStrategyFeatureName = NamingStrategyFeatureName.INCLUDE,\n exampleName: NamingStrategyExampleName = NamingStrategyExampleName.NUMBER_AND_PICKLE_IF_PARAMETERIZED\n): NamingStrategy {\n return new BuiltinNamingStrategy(length, featureName, exampleName)\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/query/dist/src/Query.d.ts b/node_modules/@cucumber/query/dist/src/Query.d.ts new file mode 100644 index 00000000..e44c073b --- /dev/null +++ b/node_modules/@cucumber/query/dist/src/Query.d.ts @@ -0,0 +1,84 @@ +import * as messages from '@cucumber/messages'; +import { Attachment, Duration, Hook, Location, Meta, Pickle, PickleStep, Step, StepDefinition, Suggestion, TestCase, TestCaseFinished, TestCaseStarted, TestRunFinished, TestRunHookFinished, TestRunHookStarted, TestRunStarted, TestStep, TestStepFinished, TestStepResult, TestStepResultStatus, TestStepStarted, UndefinedParameterType } from '@cucumber/messages'; +import { Lineage } from './Lineage'; +export default class Query { + private meta; + private testRunStarted; + private testRunFinished; + private readonly testCaseStartedById; + private readonly lineageById; + private readonly stepById; + private readonly pickleById; + private readonly pickleStepById; + private readonly hookById; + private readonly stepDefinitionById; + private readonly testCaseById; + private readonly testStepById; + private readonly testCaseFinishedByTestCaseStartedId; + private readonly testRunHookStartedById; + private readonly testRunHookFinishedByTestRunHookStartedId; + private readonly testStepStartedByTestCaseStartedId; + private readonly testStepFinishedByTestCaseStartedId; + private readonly attachmentsByTestCaseStartedId; + private readonly attachmentsByTestRunHookStartedId; + private readonly suggestionsByPickleStepId; + private readonly undefinedParameterTypes; + update(envelope: messages.Envelope): void; + private updateGherkinDocument; + private updateFeature; + private updateRule; + private updateScenario; + private updateSteps; + private updatePickle; + private updateTestRunHookStarted; + private updateTestRunHookFinished; + private updateTestCase; + private updateTestCaseStarted; + private updateTestStepStarted; + private updateAttachment; + private updateTestStepFinished; + private updateTestCaseFinished; + private updateSuggestion; + private updateUndefinedParameterType; + countMostSevereTestStepResultStatus(): Record; + countTestCasesStarted(): number; + findAllPickles(): ReadonlyArray; + findAllPickleSteps(): ReadonlyArray; + findAllStepDefinitions(): ReadonlyArray; + findAllTestCaseStarted(): ReadonlyArray; + findAllTestCaseFinished(): ReadonlyArray; + findAllTestCaseStartedOrderBy(findOrderBy: (query: Query, testCaseStarted: TestCaseStarted) => T | undefined, order: (a: T, b: T) => number): ReadonlyArray; + findAllTestCaseFinishedOrderBy(findOrderBy: (query: Query, testCaseFinished: TestCaseFinished) => T | undefined, order: (a: T, b: T) => number): ReadonlyArray; + findAllTestSteps(): ReadonlyArray; + findAllTestStepStarted(): ReadonlyArray; + findAllTestStepFinished(): ReadonlyArray; + findAllTestRunHookStarted(): ReadonlyArray; + findAllTestRunHookFinished(): ReadonlyArray; + findAllUndefinedParameterTypes(): ReadonlyArray; + findAttachmentsBy(element: TestStepFinished | TestRunHookFinished): ReadonlyArray; + findHookBy(item: TestStep | TestRunHookStarted | TestRunHookFinished): Hook | undefined; + findMeta(): Meta | undefined; + findMostSevereTestStepResultBy(element: TestCaseStarted | TestCaseFinished): TestStepResult | undefined; + findLocationOf(pickle: Pickle): Location | undefined; + findPickleBy(element: TestCaseStarted | TestCaseFinished | TestStepStarted): Pickle | undefined; + findPickleStepBy(testStep: TestStep): PickleStep | undefined; + findStepBy(pickleStep: PickleStep): Step | undefined; + findStepDefinitionsBy(testStep: TestStep): ReadonlyArray; + findSuggestionsBy(element: PickleStep | Pickle): ReadonlyArray; + findUnambiguousStepDefinitionBy(testStep: TestStep): StepDefinition | undefined; + findTestCaseBy(element: TestCaseStarted | TestCaseFinished | TestStepStarted | TestStepFinished): TestCase | undefined; + findTestCaseDurationBy(element: TestCaseStarted | TestCaseFinished): Duration | undefined; + findTestCaseStartedBy(element: TestCaseFinished | TestStepStarted | TestStepFinished): TestCaseStarted | undefined; + findTestCaseFinishedBy(testCaseStarted: TestCaseStarted): TestCaseFinished | undefined; + findTestRunHookStartedBy(testRunHookFinished: TestRunHookFinished): TestRunHookStarted | undefined; + findTestRunHookFinishedBy(testRunHookStarted: TestRunHookStarted): TestRunHookFinished | undefined; + findTestRunDuration(): Duration | undefined; + findTestRunFinished(): TestRunFinished | undefined; + findTestRunStarted(): TestRunStarted | undefined; + findTestStepBy(element: TestStepStarted | TestStepFinished): TestStep | undefined; + findTestStepsStartedBy(element: TestCaseStarted | TestCaseFinished): ReadonlyArray; + findTestStepsFinishedBy(element: TestCaseStarted | TestCaseFinished): ReadonlyArray; + findTestStepFinishedAndTestStepBy(testCaseStarted: TestCaseStarted): ReadonlyArray<[TestStepFinished, TestStep]>; + findLineageBy(element: Pickle | TestCaseStarted | TestCaseFinished): Lineage | undefined; +} +//# sourceMappingURL=Query.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/query/dist/src/Query.d.ts.map b/node_modules/@cucumber/query/dist/src/Query.d.ts.map new file mode 100644 index 00000000..d4683fe7 --- /dev/null +++ b/node_modules/@cucumber/query/dist/src/Query.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"Query.d.ts","sourceRoot":"","sources":["../../src/Query.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/query/dist/src/Query.js b/node_modules/@cucumber/query/dist/src/Query.js new file mode 100644 index 00000000..f809f3aa --- /dev/null +++ b/node_modules/@cucumber/query/dist/src/Query.js @@ -0,0 +1,422 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const messages_1 = require("@cucumber/messages"); +const multimaps_1 = require("@teppeis/multimaps"); +const lodash_sortby_1 = __importDefault(require("lodash.sortby")); +const helpers_1 = require("./helpers"); +class Query { + constructor() { + this.testCaseStartedById = new Map(); + this.lineageById = new Map(); + this.stepById = new Map(); + this.pickleById = new Map(); + this.pickleStepById = new Map(); + this.hookById = new Map(); + this.stepDefinitionById = new Map(); + this.testCaseById = new Map(); + this.testStepById = new Map(); + this.testCaseFinishedByTestCaseStartedId = new Map(); + this.testRunHookStartedById = new Map(); + this.testRunHookFinishedByTestRunHookStartedId = new Map(); + this.testStepStartedByTestCaseStartedId = new multimaps_1.ArrayMultimap(); + this.testStepFinishedByTestCaseStartedId = new multimaps_1.ArrayMultimap(); + this.attachmentsByTestCaseStartedId = new multimaps_1.ArrayMultimap(); + this.attachmentsByTestRunHookStartedId = new multimaps_1.ArrayMultimap(); + this.suggestionsByPickleStepId = new multimaps_1.ArrayMultimap(); + this.undefinedParameterTypes = []; + } + update(envelope) { + if (envelope.meta) { + this.meta = envelope.meta; + } + if (envelope.gherkinDocument) { + this.updateGherkinDocument(envelope.gherkinDocument); + } + if (envelope.pickle) { + this.updatePickle(envelope.pickle); + } + if (envelope.hook) { + this.hookById.set(envelope.hook.id, envelope.hook); + } + if (envelope.stepDefinition) { + this.stepDefinitionById.set(envelope.stepDefinition.id, envelope.stepDefinition); + } + if (envelope.testRunStarted) { + this.testRunStarted = envelope.testRunStarted; + } + if (envelope.testRunHookStarted) { + this.updateTestRunHookStarted(envelope.testRunHookStarted); + } + if (envelope.testRunHookFinished) { + this.updateTestRunHookFinished(envelope.testRunHookFinished); + } + if (envelope.testCase) { + this.updateTestCase(envelope.testCase); + } + if (envelope.testCaseStarted) { + this.updateTestCaseStarted(envelope.testCaseStarted); + } + if (envelope.testStepStarted) { + this.updateTestStepStarted(envelope.testStepStarted); + } + if (envelope.attachment) { + this.updateAttachment(envelope.attachment); + } + if (envelope.testStepFinished) { + this.updateTestStepFinished(envelope.testStepFinished); + } + if (envelope.testCaseFinished) { + this.updateTestCaseFinished(envelope.testCaseFinished); + } + if (envelope.testRunFinished) { + this.testRunFinished = envelope.testRunFinished; + } + if (envelope.suggestion) { + this.updateSuggestion(envelope.suggestion); + } + if (envelope.undefinedParameterType) { + this.updateUndefinedParameterType(envelope.undefinedParameterType); + } + } + updateGherkinDocument(gherkinDocument) { + if (gherkinDocument.feature) { + this.updateFeature(gherkinDocument.feature, { + gherkinDocument, + }); + } + } + updateFeature(feature, lineage) { + feature.children.forEach((featureChild) => { + if (featureChild.background) { + lineage.background = featureChild.background; + this.updateSteps(featureChild.background.steps); + } + if (featureChild.scenario) { + this.updateScenario(featureChild.scenario, Object.assign(Object.assign({}, lineage), { feature })); + } + if (featureChild.rule) { + this.updateRule(featureChild.rule, Object.assign(Object.assign({}, lineage), { feature })); + } + }); + } + updateRule(rule, lineage) { + rule.children.forEach((ruleChild) => { + if (ruleChild.background) { + lineage.ruleBackground = ruleChild.background; + this.updateSteps(ruleChild.background.steps); + } + if (ruleChild.scenario) { + this.updateScenario(ruleChild.scenario, Object.assign(Object.assign({}, lineage), { rule })); + } + }); + } + updateScenario(scenario, lineage) { + this.lineageById.set(scenario.id, Object.assign(Object.assign({}, lineage), { scenario })); + scenario.examples.forEach((examples, examplesIndex) => { + this.lineageById.set(examples.id, Object.assign(Object.assign({}, lineage), { scenario, + examples, + examplesIndex })); + examples.tableBody.forEach((example, exampleIndex) => { + this.lineageById.set(example.id, Object.assign(Object.assign({}, lineage), { scenario, + examples, + examplesIndex, + example, + exampleIndex })); + }); + }); + this.updateSteps(scenario.steps); + } + updateSteps(steps) { + steps.forEach((step) => this.stepById.set(step.id, step)); + } + updatePickle(pickle) { + this.pickleById.set(pickle.id, pickle); + pickle.steps.forEach((pickleStep) => this.pickleStepById.set(pickleStep.id, pickleStep)); + } + updateTestRunHookStarted(testRunHookStarted) { + this.testRunHookStartedById.set(testRunHookStarted.id, testRunHookStarted); + } + updateTestRunHookFinished(testRunHookFinished) { + this.testRunHookFinishedByTestRunHookStartedId.set(testRunHookFinished.testRunHookStartedId, testRunHookFinished); + } + updateTestCase(testCase) { + this.testCaseById.set(testCase.id, testCase); + testCase.testSteps.forEach((testStep) => { + this.testStepById.set(testStep.id, testStep); + }); + } + updateTestCaseStarted(testCaseStarted) { + this.testCaseStartedById.set(testCaseStarted.id, testCaseStarted); + } + updateTestStepStarted(testStepStarted) { + this.testStepStartedByTestCaseStartedId.put(testStepStarted.testCaseStartedId, testStepStarted); + } + updateAttachment(attachment) { + if (attachment.testCaseStartedId) { + this.attachmentsByTestCaseStartedId.put(attachment.testCaseStartedId, attachment); + } + if (attachment.testRunHookStartedId) { + this.attachmentsByTestRunHookStartedId.put(attachment.testRunHookStartedId, attachment); + } + } + updateTestStepFinished(testStepFinished) { + this.testStepFinishedByTestCaseStartedId.put(testStepFinished.testCaseStartedId, testStepFinished); + } + updateTestCaseFinished(testCaseFinished) { + this.testCaseFinishedByTestCaseStartedId.set(testCaseFinished.testCaseStartedId, testCaseFinished); + } + updateSuggestion(suggestion) { + this.suggestionsByPickleStepId.put(suggestion.pickleStepId, suggestion); + } + updateUndefinedParameterType(undefinedParameterType) { + this.undefinedParameterTypes.push(undefinedParameterType); + } + countMostSevereTestStepResultStatus() { + const result = { + [messages_1.TestStepResultStatus.AMBIGUOUS]: 0, + [messages_1.TestStepResultStatus.FAILED]: 0, + [messages_1.TestStepResultStatus.PASSED]: 0, + [messages_1.TestStepResultStatus.PENDING]: 0, + [messages_1.TestStepResultStatus.SKIPPED]: 0, + [messages_1.TestStepResultStatus.UNDEFINED]: 0, + [messages_1.TestStepResultStatus.UNKNOWN]: 0, + }; + for (const testCaseStarted of this.findAllTestCaseStarted()) { + const mostSevereResult = (0, lodash_sortby_1.default)(this.findTestStepFinishedAndTestStepBy(testCaseStarted).map(([testStepFinished]) => testStepFinished.testStepResult), [(testStepResult) => (0, helpers_1.statusOrdinal)(testStepResult.status)]).at(-1); + if (mostSevereResult) { + result[mostSevereResult.status]++; + } + } + return result; + } + countTestCasesStarted() { + return this.findAllTestCaseStarted().length; + } + findAllPickles() { + return [...this.pickleById.values()]; + } + findAllPickleSteps() { + return [...this.pickleStepById.values()]; + } + findAllStepDefinitions() { + return [...this.stepDefinitionById.values()]; + } + findAllTestCaseStarted() { + return (0, lodash_sortby_1.default)([...this.testCaseStartedById.values()].filter((testCaseStarted) => { + const testCaseFinished = this.testCaseFinishedByTestCaseStartedId.get(testCaseStarted.id); + // only include if not yet finished OR won't be retried + return !(testCaseFinished === null || testCaseFinished === void 0 ? void 0 : testCaseFinished.willBeRetried); + }), [ + (testCaseStarted) => messages_1.TimeConversion.timestampToMillisecondsSinceEpoch(testCaseStarted.timestamp), + 'id', + ]); + } + findAllTestCaseFinished() { + return (0, lodash_sortby_1.default)([...this.testCaseFinishedByTestCaseStartedId.values()].filter((testCaseFinished) => { + // only include if not yet finished OR won't be retried + return !(testCaseFinished === null || testCaseFinished === void 0 ? void 0 : testCaseFinished.willBeRetried); + }), [ + (testCaseFinished) => messages_1.TimeConversion.timestampToMillisecondsSinceEpoch(testCaseFinished.timestamp), + 'id', + ]); + } + findAllTestCaseStartedOrderBy(findOrderBy, order) { + const withOrderBy = this.findAllTestCaseStarted().map((testCaseStarted) => ({ + testCaseStarted, + orderBy: findOrderBy(this, testCaseStarted), + })); + const sorted = withOrderBy.sort((a, b) => { + if (a.orderBy === undefined && b.orderBy === undefined) + return 0; + if (a.orderBy === undefined) + return 1; + if (b.orderBy === undefined) + return -1; + return order(a.orderBy, b.orderBy); + }); + return sorted.map((item) => item.testCaseStarted); + } + findAllTestCaseFinishedOrderBy(findOrderBy, order) { + const withOrderBy = this.findAllTestCaseFinished().map((testCaseFinished) => ({ + testCaseFinished, + orderBy: findOrderBy(this, testCaseFinished), + })); + const sorted = withOrderBy.sort((a, b) => { + if (a.orderBy === undefined && b.orderBy === undefined) + return 0; + if (a.orderBy === undefined) + return 1; + if (b.orderBy === undefined) + return -1; + return order(a.orderBy, b.orderBy); + }); + return sorted.map((item) => item.testCaseFinished); + } + findAllTestSteps() { + return [...this.testStepById.values()]; + } + findAllTestStepStarted() { + return [...this.testStepStartedByTestCaseStartedId.values()]; + } + findAllTestStepFinished() { + return [...this.testStepFinishedByTestCaseStartedId.values()]; + } + findAllTestRunHookStarted() { + return [...this.testRunHookStartedById.values()]; + } + findAllTestRunHookFinished() { + return [...this.testRunHookFinishedByTestRunHookStartedId.values()]; + } + findAllUndefinedParameterTypes() { + return [...this.undefinedParameterTypes]; + } + findAttachmentsBy(element) { + if ('testStepId' in element) { + return this.attachmentsByTestCaseStartedId + .get(element.testCaseStartedId) + .filter((attachment) => attachment.testStepId === element.testStepId); + } + else { + return this.attachmentsByTestRunHookStartedId.get(element.testRunHookStartedId); + } + } + findHookBy(item) { + if ('testRunHookStartedId' in item) { + const testRunHookStarted = this.findTestRunHookStartedBy(item); + helpers_1.assert.ok(testRunHookStarted, 'Expected to find TestRunHookStarted from TestRunHookFinished'); + return this.findHookBy(testRunHookStarted); + } + if (!item.hookId) { + return undefined; + } + return this.hookById.get(item.hookId); + } + findMeta() { + return this.meta; + } + findMostSevereTestStepResultBy(element) { + const testCaseStarted = 'testCaseStartedId' in element ? this.findTestCaseStartedBy(element) : element; + return (0, lodash_sortby_1.default)(this.findTestStepFinishedAndTestStepBy(testCaseStarted).map(([testStepFinished]) => testStepFinished.testStepResult), [(testStepResult) => (0, helpers_1.statusOrdinal)(testStepResult.status)]).at(-1); + } + findLocationOf(pickle) { + var _a; + const lineage = this.findLineageBy(pickle); + if (lineage === null || lineage === void 0 ? void 0 : lineage.example) { + return lineage.example.location; + } + return (_a = lineage === null || lineage === void 0 ? void 0 : lineage.scenario) === null || _a === void 0 ? void 0 : _a.location; + } + findPickleBy(element) { + const testCase = this.findTestCaseBy(element); + helpers_1.assert.ok(testCase, 'Expected to find TestCase from TestCaseStarted'); + return this.pickleById.get(testCase.pickleId); + } + findPickleStepBy(testStep) { + if (!testStep.pickleStepId) { + return undefined; + } + return this.pickleStepById.get(testStep.pickleStepId); + } + findStepBy(pickleStep) { + const [astNodeId] = pickleStep.astNodeIds; + helpers_1.assert.ok(astNodeId, 'Expected PickleStep to have an astNodeId'); + return this.stepById.get(astNodeId); + } + findStepDefinitionsBy(testStep) { + var _a; + return ((_a = testStep.stepDefinitionIds) !== null && _a !== void 0 ? _a : []).map((id) => this.stepDefinitionById.get(id)); + } + findSuggestionsBy(element) { + if ('steps' in element) { + return element.steps.flatMap((value) => this.findSuggestionsBy(value)); + } + return this.suggestionsByPickleStepId.get(element.id); + } + findUnambiguousStepDefinitionBy(testStep) { + var _a; + if (((_a = testStep.stepDefinitionIds) === null || _a === void 0 ? void 0 : _a.length) === 1) { + return this.stepDefinitionById.get(testStep.stepDefinitionIds[0]); + } + return undefined; + } + findTestCaseBy(element) { + const testCaseStarted = 'testCaseStartedId' in element ? this.findTestCaseStartedBy(element) : element; + helpers_1.assert.ok(testCaseStarted, 'Expected to find TestCaseStarted by TestStepStarted'); + return this.testCaseById.get(testCaseStarted.testCaseId); + } + findTestCaseDurationBy(element) { + let testCaseStarted; + let testCaseFinished; + if ('testCaseStartedId' in element) { + testCaseStarted = this.findTestCaseStartedBy(element); + testCaseFinished = element; + } + else { + testCaseStarted = element; + testCaseFinished = this.findTestCaseFinishedBy(element); + } + if (!testCaseFinished) { + return undefined; + } + return messages_1.TimeConversion.millisecondsToDuration(messages_1.TimeConversion.timestampToMillisecondsSinceEpoch(testCaseFinished.timestamp) - + messages_1.TimeConversion.timestampToMillisecondsSinceEpoch(testCaseStarted.timestamp)); + } + findTestCaseStartedBy(element) { + return this.testCaseStartedById.get(element.testCaseStartedId); + } + findTestCaseFinishedBy(testCaseStarted) { + return this.testCaseFinishedByTestCaseStartedId.get(testCaseStarted.id); + } + findTestRunHookStartedBy(testRunHookFinished) { + return this.testRunHookStartedById.get(testRunHookFinished.testRunHookStartedId); + } + findTestRunHookFinishedBy(testRunHookStarted) { + return this.testRunHookFinishedByTestRunHookStartedId.get(testRunHookStarted.id); + } + findTestRunDuration() { + if (!this.testRunStarted || !this.testRunFinished) { + return undefined; + } + return messages_1.TimeConversion.millisecondsToDuration(messages_1.TimeConversion.timestampToMillisecondsSinceEpoch(this.testRunFinished.timestamp) - + messages_1.TimeConversion.timestampToMillisecondsSinceEpoch(this.testRunStarted.timestamp)); + } + findTestRunFinished() { + return this.testRunFinished; + } + findTestRunStarted() { + return this.testRunStarted; + } + findTestStepBy(element) { + return this.testStepById.get(element.testStepId); + } + findTestStepsStartedBy(element) { + const testCaseStartedId = 'testCaseStartedId' in element ? element.testCaseStartedId : element.id; + // multimaps `get` implements `getOrDefault([])` behaviour internally + return [...this.testStepStartedByTestCaseStartedId.get(testCaseStartedId)]; + } + findTestStepsFinishedBy(element) { + const testCaseStarted = 'testCaseStartedId' in element ? this.findTestCaseStartedBy(element) : element; + // multimaps `get` implements `getOrDefault([])` behaviour internally + return [...this.testStepFinishedByTestCaseStartedId.get(testCaseStarted.id)]; + } + findTestStepFinishedAndTestStepBy(testCaseStarted) { + return this.testStepFinishedByTestCaseStartedId + .get(testCaseStarted.id) + .map((testStepFinished) => { + const testStep = this.findTestStepBy(testStepFinished); + helpers_1.assert.ok(testStep, 'Expected to find TestStep by TestStepFinished'); + return [testStepFinished, testStep]; + }); + } + findLineageBy(element) { + const pickle = 'astNodeIds' in element ? element : this.findPickleBy(element); + const deepestAstNodeId = pickle.astNodeIds.at(-1); + helpers_1.assert.ok(deepestAstNodeId, 'Expected Pickle to have at least one astNodeId'); + return this.lineageById.get(deepestAstNodeId); + } +} +exports.default = Query; +//# sourceMappingURL=Query.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/query/dist/src/Query.js.map b/node_modules/@cucumber/query/dist/src/Query.js.map new file mode 100644 index 00000000..9bd64d32 --- /dev/null +++ b/node_modules/@cucumber/query/dist/src/Query.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Query.js","sourceRoot":"","sources":["../../src/Query.ts"],"names":[],"mappings":"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","sourcesContent":["import * as messages from '@cucumber/messages'\nimport {\n Attachment,\n Duration,\n Feature,\n GherkinDocument,\n Hook,\n Location,\n Meta,\n Pickle,\n PickleStep,\n Rule,\n Scenario,\n Step,\n StepDefinition,\n Suggestion,\n TestCase,\n TestCaseFinished,\n TestCaseStarted,\n TestRunFinished,\n TestRunHookFinished,\n TestRunHookStarted,\n TestRunStarted,\n TestStep,\n TestStepFinished,\n TestStepResult,\n TestStepResultStatus,\n TestStepStarted,\n TimeConversion,\n UndefinedParameterType,\n} from '@cucumber/messages'\nimport { ArrayMultimap } from '@teppeis/multimaps'\nimport sortBy from 'lodash.sortby'\n\nimport { assert, statusOrdinal } from './helpers'\nimport { Lineage } from './Lineage'\n\nexport default class Query {\n private meta: Meta\n private testRunStarted: TestRunStarted\n private testRunFinished: TestRunFinished\n private readonly testCaseStartedById: Map = new Map()\n private readonly lineageById: Map = new Map()\n private readonly stepById: Map = new Map()\n private readonly pickleById: Map = new Map()\n private readonly pickleStepById: Map = new Map()\n private readonly hookById: Map = new Map()\n private readonly stepDefinitionById: Map = new Map()\n private readonly testCaseById: Map = new Map()\n private readonly testStepById: Map = new Map()\n private readonly testCaseFinishedByTestCaseStartedId: Map = new Map()\n private readonly testRunHookStartedById: Map = new Map()\n private readonly testRunHookFinishedByTestRunHookStartedId: Map =\n new Map()\n private readonly testStepStartedByTestCaseStartedId: ArrayMultimap =\n new ArrayMultimap()\n private readonly testStepFinishedByTestCaseStartedId: ArrayMultimap =\n new ArrayMultimap()\n private readonly attachmentsByTestCaseStartedId: ArrayMultimap =\n new ArrayMultimap()\n private readonly attachmentsByTestRunHookStartedId: ArrayMultimap =\n new ArrayMultimap()\n private readonly suggestionsByPickleStepId: ArrayMultimap =\n new ArrayMultimap()\n private readonly undefinedParameterTypes: UndefinedParameterType[] = []\n\n public update(envelope: messages.Envelope) {\n if (envelope.meta) {\n this.meta = envelope.meta\n }\n if (envelope.gherkinDocument) {\n this.updateGherkinDocument(envelope.gherkinDocument)\n }\n if (envelope.pickle) {\n this.updatePickle(envelope.pickle)\n }\n if (envelope.hook) {\n this.hookById.set(envelope.hook.id, envelope.hook)\n }\n if (envelope.stepDefinition) {\n this.stepDefinitionById.set(envelope.stepDefinition.id, envelope.stepDefinition)\n }\n if (envelope.testRunStarted) {\n this.testRunStarted = envelope.testRunStarted\n }\n if (envelope.testRunHookStarted) {\n this.updateTestRunHookStarted(envelope.testRunHookStarted)\n }\n if (envelope.testRunHookFinished) {\n this.updateTestRunHookFinished(envelope.testRunHookFinished)\n }\n if (envelope.testCase) {\n this.updateTestCase(envelope.testCase)\n }\n if (envelope.testCaseStarted) {\n this.updateTestCaseStarted(envelope.testCaseStarted)\n }\n if (envelope.testStepStarted) {\n this.updateTestStepStarted(envelope.testStepStarted)\n }\n if (envelope.attachment) {\n this.updateAttachment(envelope.attachment)\n }\n if (envelope.testStepFinished) {\n this.updateTestStepFinished(envelope.testStepFinished)\n }\n if (envelope.testCaseFinished) {\n this.updateTestCaseFinished(envelope.testCaseFinished)\n }\n if (envelope.testRunFinished) {\n this.testRunFinished = envelope.testRunFinished\n }\n if (envelope.suggestion) {\n this.updateSuggestion(envelope.suggestion)\n }\n if (envelope.undefinedParameterType) {\n this.updateUndefinedParameterType(envelope.undefinedParameterType)\n }\n }\n\n private updateGherkinDocument(gherkinDocument: GherkinDocument) {\n if (gherkinDocument.feature) {\n this.updateFeature(gherkinDocument.feature, {\n gherkinDocument,\n })\n }\n }\n\n private updateFeature(feature: Feature, lineage: Lineage) {\n feature.children.forEach((featureChild) => {\n if (featureChild.background) {\n lineage.background = featureChild.background\n this.updateSteps(featureChild.background.steps)\n }\n if (featureChild.scenario) {\n this.updateScenario(featureChild.scenario, {\n ...lineage,\n feature,\n })\n }\n if (featureChild.rule) {\n this.updateRule(featureChild.rule, {\n ...lineage,\n feature,\n })\n }\n })\n }\n\n private updateRule(rule: Rule, lineage: Lineage) {\n rule.children.forEach((ruleChild) => {\n if (ruleChild.background) {\n lineage.ruleBackground = ruleChild.background\n this.updateSteps(ruleChild.background.steps)\n }\n if (ruleChild.scenario) {\n this.updateScenario(ruleChild.scenario, {\n ...lineage,\n rule,\n })\n }\n })\n }\n\n private updateScenario(scenario: Scenario, lineage: Lineage) {\n this.lineageById.set(scenario.id, {\n ...lineage,\n scenario,\n })\n scenario.examples.forEach((examples, examplesIndex) => {\n this.lineageById.set(examples.id, {\n ...lineage,\n scenario,\n examples,\n examplesIndex,\n })\n examples.tableBody.forEach((example, exampleIndex) => {\n this.lineageById.set(example.id, {\n ...lineage,\n scenario,\n examples,\n examplesIndex,\n example,\n exampleIndex,\n })\n })\n })\n this.updateSteps(scenario.steps)\n }\n\n private updateSteps(steps: ReadonlyArray) {\n steps.forEach((step) => this.stepById.set(step.id, step))\n }\n\n private updatePickle(pickle: Pickle) {\n this.pickleById.set(pickle.id, pickle)\n pickle.steps.forEach((pickleStep) => this.pickleStepById.set(pickleStep.id, pickleStep))\n }\n\n private updateTestRunHookStarted(testRunHookStarted: TestRunHookStarted) {\n this.testRunHookStartedById.set(testRunHookStarted.id, testRunHookStarted)\n }\n\n private updateTestRunHookFinished(testRunHookFinished: TestRunHookFinished) {\n this.testRunHookFinishedByTestRunHookStartedId.set(\n testRunHookFinished.testRunHookStartedId,\n testRunHookFinished\n )\n }\n\n private updateTestCase(testCase: TestCase) {\n this.testCaseById.set(testCase.id, testCase)\n testCase.testSteps.forEach((testStep) => {\n this.testStepById.set(testStep.id, testStep)\n })\n }\n\n private updateTestCaseStarted(testCaseStarted: TestCaseStarted) {\n this.testCaseStartedById.set(testCaseStarted.id, testCaseStarted)\n }\n\n private updateTestStepStarted(testStepStarted: TestStepStarted) {\n this.testStepStartedByTestCaseStartedId.put(testStepStarted.testCaseStartedId, testStepStarted)\n }\n\n private updateAttachment(attachment: Attachment) {\n if (attachment.testCaseStartedId) {\n this.attachmentsByTestCaseStartedId.put(attachment.testCaseStartedId, attachment)\n }\n if (attachment.testRunHookStartedId) {\n this.attachmentsByTestRunHookStartedId.put(attachment.testRunHookStartedId, attachment)\n }\n }\n\n private updateTestStepFinished(testStepFinished: TestStepFinished) {\n this.testStepFinishedByTestCaseStartedId.put(\n testStepFinished.testCaseStartedId,\n testStepFinished\n )\n }\n\n private updateTestCaseFinished(testCaseFinished: TestCaseFinished) {\n this.testCaseFinishedByTestCaseStartedId.set(\n testCaseFinished.testCaseStartedId,\n testCaseFinished\n )\n }\n\n private updateSuggestion(suggestion: Suggestion) {\n this.suggestionsByPickleStepId.put(suggestion.pickleStepId, suggestion)\n }\n\n private updateUndefinedParameterType(undefinedParameterType: UndefinedParameterType) {\n this.undefinedParameterTypes.push(undefinedParameterType)\n }\n\n public countMostSevereTestStepResultStatus(): Record {\n const result: Record = {\n [TestStepResultStatus.AMBIGUOUS]: 0,\n [TestStepResultStatus.FAILED]: 0,\n [TestStepResultStatus.PASSED]: 0,\n [TestStepResultStatus.PENDING]: 0,\n [TestStepResultStatus.SKIPPED]: 0,\n [TestStepResultStatus.UNDEFINED]: 0,\n [TestStepResultStatus.UNKNOWN]: 0,\n }\n for (const testCaseStarted of this.findAllTestCaseStarted()) {\n const mostSevereResult = sortBy(\n this.findTestStepFinishedAndTestStepBy(testCaseStarted).map(\n ([testStepFinished]) => testStepFinished.testStepResult\n ),\n [(testStepResult) => statusOrdinal(testStepResult.status)]\n ).at(-1)\n if (mostSevereResult) {\n result[mostSevereResult.status]++\n }\n }\n return result\n }\n\n public countTestCasesStarted(): number {\n return this.findAllTestCaseStarted().length\n }\n\n public findAllPickles(): ReadonlyArray {\n return [...this.pickleById.values()]\n }\n\n public findAllPickleSteps(): ReadonlyArray {\n return [...this.pickleStepById.values()]\n }\n\n public findAllStepDefinitions(): ReadonlyArray {\n return [...this.stepDefinitionById.values()]\n }\n\n public findAllTestCaseStarted(): ReadonlyArray {\n return sortBy(\n [...this.testCaseStartedById.values()].filter((testCaseStarted) => {\n const testCaseFinished = this.testCaseFinishedByTestCaseStartedId.get(testCaseStarted.id)\n // only include if not yet finished OR won't be retried\n return !testCaseFinished?.willBeRetried\n }),\n [\n (testCaseStarted) =>\n TimeConversion.timestampToMillisecondsSinceEpoch(testCaseStarted.timestamp),\n 'id',\n ]\n )\n }\n\n public findAllTestCaseFinished(): ReadonlyArray {\n return sortBy(\n [...this.testCaseFinishedByTestCaseStartedId.values()].filter((testCaseFinished) => {\n // only include if not yet finished OR won't be retried\n return !testCaseFinished?.willBeRetried\n }),\n [\n (testCaseFinished) =>\n TimeConversion.timestampToMillisecondsSinceEpoch(testCaseFinished.timestamp),\n 'id',\n ]\n )\n }\n\n public findAllTestCaseStartedOrderBy(\n findOrderBy: (query: Query, testCaseStarted: TestCaseStarted) => T | undefined,\n order: (a: T, b: T) => number\n ): ReadonlyArray {\n const withOrderBy = this.findAllTestCaseStarted().map((testCaseStarted) => ({\n testCaseStarted,\n orderBy: findOrderBy(this, testCaseStarted),\n }))\n\n const sorted = withOrderBy.sort((a, b) => {\n if (a.orderBy === undefined && b.orderBy === undefined) return 0\n if (a.orderBy === undefined) return 1\n if (b.orderBy === undefined) return -1\n return order(a.orderBy, b.orderBy)\n })\n\n return sorted.map((item) => item.testCaseStarted)\n }\n\n public findAllTestCaseFinishedOrderBy(\n findOrderBy: (query: Query, testCaseFinished: TestCaseFinished) => T | undefined,\n order: (a: T, b: T) => number\n ): ReadonlyArray {\n const withOrderBy = this.findAllTestCaseFinished().map((testCaseFinished) => ({\n testCaseFinished,\n orderBy: findOrderBy(this, testCaseFinished),\n }))\n\n const sorted = withOrderBy.sort((a, b) => {\n if (a.orderBy === undefined && b.orderBy === undefined) return 0\n if (a.orderBy === undefined) return 1\n if (b.orderBy === undefined) return -1\n return order(a.orderBy, b.orderBy)\n })\n\n return sorted.map((item) => item.testCaseFinished)\n }\n\n public findAllTestSteps(): ReadonlyArray {\n return [...this.testStepById.values()]\n }\n\n public findAllTestStepStarted(): ReadonlyArray {\n return [...this.testStepStartedByTestCaseStartedId.values()]\n }\n\n public findAllTestStepFinished(): ReadonlyArray {\n return [...this.testStepFinishedByTestCaseStartedId.values()]\n }\n\n public findAllTestRunHookStarted(): ReadonlyArray {\n return [...this.testRunHookStartedById.values()]\n }\n\n public findAllTestRunHookFinished(): ReadonlyArray {\n return [...this.testRunHookFinishedByTestRunHookStartedId.values()]\n }\n\n public findAllUndefinedParameterTypes(): ReadonlyArray {\n return [...this.undefinedParameterTypes]\n }\n\n public findAttachmentsBy(\n element: TestStepFinished | TestRunHookFinished\n ): ReadonlyArray {\n if ('testStepId' in element) {\n return this.attachmentsByTestCaseStartedId\n .get(element.testCaseStartedId)\n .filter((attachment) => attachment.testStepId === element.testStepId)\n } else {\n return this.attachmentsByTestRunHookStartedId.get(element.testRunHookStartedId)\n }\n }\n\n public findHookBy(item: TestStep | TestRunHookStarted | TestRunHookFinished): Hook | undefined {\n if ('testRunHookStartedId' in item) {\n const testRunHookStarted = this.findTestRunHookStartedBy(item)\n assert.ok(testRunHookStarted, 'Expected to find TestRunHookStarted from TestRunHookFinished')\n return this.findHookBy(testRunHookStarted)\n }\n if (!item.hookId) {\n return undefined\n }\n return this.hookById.get(item.hookId)\n }\n\n public findMeta(): Meta | undefined {\n return this.meta\n }\n\n public findMostSevereTestStepResultBy(\n element: TestCaseStarted | TestCaseFinished\n ): TestStepResult | undefined {\n const testCaseStarted =\n 'testCaseStartedId' in element ? this.findTestCaseStartedBy(element) : element\n return sortBy(\n this.findTestStepFinishedAndTestStepBy(testCaseStarted).map(\n ([testStepFinished]) => testStepFinished.testStepResult\n ),\n [(testStepResult) => statusOrdinal(testStepResult.status)]\n ).at(-1)\n }\n\n public findLocationOf(pickle: Pickle): Location | undefined {\n const lineage = this.findLineageBy(pickle)\n if (lineage?.example) {\n return lineage.example.location\n }\n return lineage?.scenario?.location\n }\n\n public findPickleBy(\n element: TestCaseStarted | TestCaseFinished | TestStepStarted\n ): Pickle | undefined {\n const testCase = this.findTestCaseBy(element)\n assert.ok(testCase, 'Expected to find TestCase from TestCaseStarted')\n return this.pickleById.get(testCase.pickleId)\n }\n\n public findPickleStepBy(testStep: TestStep): PickleStep | undefined {\n if (!testStep.pickleStepId) {\n return undefined\n }\n return this.pickleStepById.get(testStep.pickleStepId)\n }\n\n public findStepBy(pickleStep: PickleStep): Step | undefined {\n const [astNodeId] = pickleStep.astNodeIds\n assert.ok(astNodeId, 'Expected PickleStep to have an astNodeId')\n return this.stepById.get(astNodeId)\n }\n\n public findStepDefinitionsBy(testStep: TestStep): ReadonlyArray {\n return (testStep.stepDefinitionIds ?? []).map((id) => this.stepDefinitionById.get(id))\n }\n\n findSuggestionsBy(element: PickleStep | Pickle): ReadonlyArray {\n if ('steps' in element) {\n return element.steps.flatMap((value) => this.findSuggestionsBy(value))\n }\n return this.suggestionsByPickleStepId.get(element.id)\n }\n\n public findUnambiguousStepDefinitionBy(testStep: TestStep): StepDefinition | undefined {\n if (testStep.stepDefinitionIds?.length === 1) {\n return this.stepDefinitionById.get(testStep.stepDefinitionIds[0])\n }\n return undefined\n }\n\n public findTestCaseBy(\n element: TestCaseStarted | TestCaseFinished | TestStepStarted | TestStepFinished\n ): TestCase | undefined {\n const testCaseStarted =\n 'testCaseStartedId' in element ? this.findTestCaseStartedBy(element) : element\n assert.ok(testCaseStarted, 'Expected to find TestCaseStarted by TestStepStarted')\n return this.testCaseById.get(testCaseStarted.testCaseId)\n }\n\n public findTestCaseDurationBy(element: TestCaseStarted | TestCaseFinished): Duration | undefined {\n let testCaseStarted: TestCaseStarted\n let testCaseFinished: TestCaseFinished\n if ('testCaseStartedId' in element) {\n testCaseStarted = this.findTestCaseStartedBy(element)\n testCaseFinished = element\n } else {\n testCaseStarted = element\n testCaseFinished = this.findTestCaseFinishedBy(element)\n }\n if (!testCaseFinished) {\n return undefined\n }\n return TimeConversion.millisecondsToDuration(\n TimeConversion.timestampToMillisecondsSinceEpoch(testCaseFinished.timestamp) -\n TimeConversion.timestampToMillisecondsSinceEpoch(testCaseStarted.timestamp)\n )\n }\n\n public findTestCaseStartedBy(\n element: TestCaseFinished | TestStepStarted | TestStepFinished\n ): TestCaseStarted | undefined {\n return this.testCaseStartedById.get(element.testCaseStartedId)\n }\n\n public findTestCaseFinishedBy(testCaseStarted: TestCaseStarted): TestCaseFinished | undefined {\n return this.testCaseFinishedByTestCaseStartedId.get(testCaseStarted.id)\n }\n\n public findTestRunHookStartedBy(\n testRunHookFinished: TestRunHookFinished\n ): TestRunHookStarted | undefined {\n return this.testRunHookStartedById.get(testRunHookFinished.testRunHookStartedId)\n }\n\n public findTestRunHookFinishedBy(\n testRunHookStarted: TestRunHookStarted\n ): TestRunHookFinished | undefined {\n return this.testRunHookFinishedByTestRunHookStartedId.get(testRunHookStarted.id)\n }\n\n public findTestRunDuration(): Duration | undefined {\n if (!this.testRunStarted || !this.testRunFinished) {\n return undefined\n }\n return TimeConversion.millisecondsToDuration(\n TimeConversion.timestampToMillisecondsSinceEpoch(this.testRunFinished.timestamp) -\n TimeConversion.timestampToMillisecondsSinceEpoch(this.testRunStarted.timestamp)\n )\n }\n\n public findTestRunFinished(): TestRunFinished | undefined {\n return this.testRunFinished\n }\n\n public findTestRunStarted(): TestRunStarted | undefined {\n return this.testRunStarted\n }\n\n public findTestStepBy(element: TestStepStarted | TestStepFinished): TestStep | undefined {\n return this.testStepById.get(element.testStepId)\n }\n\n public findTestStepsStartedBy(\n element: TestCaseStarted | TestCaseFinished\n ): ReadonlyArray {\n const testCaseStartedId =\n 'testCaseStartedId' in element ? element.testCaseStartedId : element.id\n // multimaps `get` implements `getOrDefault([])` behaviour internally\n return [...this.testStepStartedByTestCaseStartedId.get(testCaseStartedId)]\n }\n\n public findTestStepsFinishedBy(\n element: TestCaseStarted | TestCaseFinished\n ): ReadonlyArray {\n const testCaseStarted =\n 'testCaseStartedId' in element ? this.findTestCaseStartedBy(element) : element\n // multimaps `get` implements `getOrDefault([])` behaviour internally\n return [...this.testStepFinishedByTestCaseStartedId.get(testCaseStarted.id)]\n }\n\n public findTestStepFinishedAndTestStepBy(\n testCaseStarted: TestCaseStarted\n ): ReadonlyArray<[TestStepFinished, TestStep]> {\n return this.testStepFinishedByTestCaseStartedId\n .get(testCaseStarted.id)\n .map((testStepFinished) => {\n const testStep = this.findTestStepBy(testStepFinished)\n assert.ok(testStep, 'Expected to find TestStep by TestStepFinished')\n return [testStepFinished, testStep]\n })\n }\n\n public findLineageBy(element: Pickle | TestCaseStarted | TestCaseFinished): Lineage | undefined {\n const pickle = 'astNodeIds' in element ? element : this.findPickleBy(element)\n const deepestAstNodeId = pickle.astNodeIds.at(-1)\n assert.ok(deepestAstNodeId, 'Expected Pickle to have at least one astNodeId')\n return this.lineageById.get(deepestAstNodeId)\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/query/dist/src/helpers.d.ts b/node_modules/@cucumber/query/dist/src/helpers.d.ts new file mode 100644 index 00000000..60a49482 --- /dev/null +++ b/node_modules/@cucumber/query/dist/src/helpers.d.ts @@ -0,0 +1,6 @@ +import { TestStepResultStatus } from '@cucumber/messages'; +export declare function statusOrdinal(status: TestStepResultStatus): number; +export declare const assert: { + ok(target: unknown, message: string): void; +}; +//# sourceMappingURL=helpers.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/query/dist/src/helpers.d.ts.map b/node_modules/@cucumber/query/dist/src/helpers.d.ts.map new file mode 100644 index 00000000..703195f9 --- /dev/null +++ b/node_modules/@cucumber/query/dist/src/helpers.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAEzD,wBAAgB,aAAa,CAAC,MAAM,EAAE,oBAAoB,UAUzD;AAED,eAAO,MAAM,MAAM;eACN,OAAO,WAAW,MAAM;CAKpC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/query/dist/src/helpers.js b/node_modules/@cucumber/query/dist/src/helpers.js new file mode 100644 index 00000000..bb7bc3f4 --- /dev/null +++ b/node_modules/@cucumber/query/dist/src/helpers.js @@ -0,0 +1,24 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.assert = void 0; +exports.statusOrdinal = statusOrdinal; +const messages_1 = require("@cucumber/messages"); +function statusOrdinal(status) { + return [ + messages_1.TestStepResultStatus.UNKNOWN, + messages_1.TestStepResultStatus.PASSED, + messages_1.TestStepResultStatus.SKIPPED, + messages_1.TestStepResultStatus.PENDING, + messages_1.TestStepResultStatus.UNDEFINED, + messages_1.TestStepResultStatus.AMBIGUOUS, + messages_1.TestStepResultStatus.FAILED, + ].indexOf(status); +} +exports.assert = { + ok(target, message) { + if (!target) { + throw new Error(message); + } + }, +}; +//# sourceMappingURL=helpers.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/query/dist/src/helpers.js.map b/node_modules/@cucumber/query/dist/src/helpers.js.map new file mode 100644 index 00000000..a830224f --- /dev/null +++ b/node_modules/@cucumber/query/dist/src/helpers.js.map @@ -0,0 +1 @@ +{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":";;;AAEA,sCAUC;AAZD,iDAAyD;AAEzD,SAAgB,aAAa,CAAC,MAA4B;IACxD,OAAO;QACL,+BAAoB,CAAC,OAAO;QAC5B,+BAAoB,CAAC,MAAM;QAC3B,+BAAoB,CAAC,OAAO;QAC5B,+BAAoB,CAAC,OAAO;QAC5B,+BAAoB,CAAC,SAAS;QAC9B,+BAAoB,CAAC,SAAS;QAC9B,+BAAoB,CAAC,MAAM;KAC5B,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;AACnB,CAAC;AAEY,QAAA,MAAM,GAAG;IACpB,EAAE,CAAC,MAAe,EAAE,OAAe;QACjC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAA;QAC1B,CAAC;IACH,CAAC;CACF,CAAA","sourcesContent":["import { TestStepResultStatus } from '@cucumber/messages'\n\nexport function statusOrdinal(status: TestStepResultStatus) {\n return [\n TestStepResultStatus.UNKNOWN,\n TestStepResultStatus.PASSED,\n TestStepResultStatus.SKIPPED,\n TestStepResultStatus.PENDING,\n TestStepResultStatus.UNDEFINED,\n TestStepResultStatus.AMBIGUOUS,\n TestStepResultStatus.FAILED,\n ].indexOf(status)\n}\n\nexport const assert = {\n ok(target: unknown, message: string) {\n if (!target) {\n throw new Error(message)\n }\n },\n}\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/query/dist/src/index.d.ts b/node_modules/@cucumber/query/dist/src/index.d.ts new file mode 100644 index 00000000..0470b897 --- /dev/null +++ b/node_modules/@cucumber/query/dist/src/index.d.ts @@ -0,0 +1,4 @@ +import Query from './Query'; +export * from './Lineage'; +export { Query }; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/query/dist/src/index.d.ts.map b/node_modules/@cucumber/query/dist/src/index.d.ts.map new file mode 100644 index 00000000..f108c228 --- /dev/null +++ b/node_modules/@cucumber/query/dist/src/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,SAAS,CAAA;AAC3B,cAAc,WAAW,CAAA;AAEzB,OAAO,EAAE,KAAK,EAAE,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/query/dist/src/index.js b/node_modules/@cucumber/query/dist/src/index.js new file mode 100644 index 00000000..b953d2e2 --- /dev/null +++ b/node_modules/@cucumber/query/dist/src/index.js @@ -0,0 +1,24 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Query = void 0; +const Query_1 = __importDefault(require("./Query")); +exports.Query = Query_1.default; +__exportStar(require("./Lineage"), exports); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/query/dist/src/index.js.map b/node_modules/@cucumber/query/dist/src/index.js.map new file mode 100644 index 00000000..7b35bb9f --- /dev/null +++ b/node_modules/@cucumber/query/dist/src/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,oDAA2B;AAGlB,gBAHF,eAAK,CAGE;AAFd,4CAAyB","sourcesContent":["import Query from './Query'\nexport * from './Lineage'\n\nexport { Query }\n"]} \ No newline at end of file diff --git a/node_modules/@cucumber/query/dist/tsconfig.build.tsbuildinfo b/node_modules/@cucumber/query/dist/tsconfig.build.tsbuildinfo new file mode 100644 index 00000000..89466d9a --- /dev/null +++ b/node_modules/@cucumber/query/dist/tsconfig.build.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["../node_modules/typescript/lib/lib.es5.d.ts","../node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/typescript/lib/lib.dom.d.ts","../node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/typescript/lib/lib.es2016.intl.d.ts","../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../node_modules/typescript/lib/lib.es2017.date.d.ts","../node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/typescript/lib/lib.es2019.intl.d.ts","../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/typescript/lib/lib.decorators.d.ts","../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../node_modules/reflect-metadata/index.d.ts","../node_modules/@cucumber/messages/dist/cjs/src/messages.d.ts","../node_modules/@cucumber/messages/dist/cjs/src/TimeConversion.d.ts","../node_modules/@cucumber/messages/dist/cjs/src/IdGenerator.d.ts","../node_modules/@cucumber/messages/dist/cjs/src/parseEnvelope.d.ts","../node_modules/@cucumber/messages/dist/cjs/src/getWorstTestStepResult.d.ts","../node_modules/@cucumber/messages/dist/cjs/src/version.d.ts","../node_modules/@cucumber/messages/dist/cjs/src/index.d.ts","../src/Lineage.ts","../node_modules/@teppeis/multimaps/dist/cjs/multimap.d.ts","../node_modules/@teppeis/multimaps/dist/cjs/arraymultimap.d.ts","../node_modules/@teppeis/multimaps/dist/cjs/setmultimap.d.ts","../node_modules/@teppeis/multimaps/dist/cjs/index.d.ts","../node_modules/@types/lodash/common/common.d.ts","../node_modules/@types/lodash/common/array.d.ts","../node_modules/@types/lodash/common/collection.d.ts","../node_modules/@types/lodash/common/date.d.ts","../node_modules/@types/lodash/common/function.d.ts","../node_modules/@types/lodash/common/lang.d.ts","../node_modules/@types/lodash/common/math.d.ts","../node_modules/@types/lodash/common/number.d.ts","../node_modules/@types/lodash/common/object.d.ts","../node_modules/@types/lodash/common/seq.d.ts","../node_modules/@types/lodash/common/string.d.ts","../node_modules/@types/lodash/common/util.d.ts","../node_modules/@types/lodash/index.d.ts","../node_modules/@types/lodash.sortby/index.d.ts","../src/helpers.ts","../src/Query.ts","../src/index.ts","../node_modules/@types/estree/index.d.ts","../node_modules/@types/json-schema/index.d.ts","../node_modules/@types/json5/index.d.ts","../node_modules/@types/mocha/index.d.ts","../node_modules/@types/node/compatibility/disposable.d.ts","../node_modules/@types/node/compatibility/indexable.d.ts","../node_modules/@types/node/compatibility/iterators.d.ts","../node_modules/@types/node/compatibility/index.d.ts","../node_modules/@types/node/globals.typedarray.d.ts","../node_modules/@types/node/buffer.buffer.d.ts","../node_modules/@types/node/globals.d.ts","../node_modules/@types/node/web-globals/abortcontroller.d.ts","../node_modules/@types/node/web-globals/domexception.d.ts","../node_modules/@types/node/web-globals/events.d.ts","../node_modules/undici-types/header.d.ts","../node_modules/undici-types/readable.d.ts","../node_modules/undici-types/file.d.ts","../node_modules/undici-types/fetch.d.ts","../node_modules/undici-types/formdata.d.ts","../node_modules/undici-types/connector.d.ts","../node_modules/undici-types/client.d.ts","../node_modules/undici-types/errors.d.ts","../node_modules/undici-types/dispatcher.d.ts","../node_modules/undici-types/global-dispatcher.d.ts","../node_modules/undici-types/global-origin.d.ts","../node_modules/undici-types/pool-stats.d.ts","../node_modules/undici-types/pool.d.ts","../node_modules/undici-types/handlers.d.ts","../node_modules/undici-types/balanced-pool.d.ts","../node_modules/undici-types/agent.d.ts","../node_modules/undici-types/mock-interceptor.d.ts","../node_modules/undici-types/mock-agent.d.ts","../node_modules/undici-types/mock-client.d.ts","../node_modules/undici-types/mock-pool.d.ts","../node_modules/undici-types/mock-errors.d.ts","../node_modules/undici-types/proxy-agent.d.ts","../node_modules/undici-types/env-http-proxy-agent.d.ts","../node_modules/undici-types/retry-handler.d.ts","../node_modules/undici-types/retry-agent.d.ts","../node_modules/undici-types/api.d.ts","../node_modules/undici-types/interceptors.d.ts","../node_modules/undici-types/util.d.ts","../node_modules/undici-types/cookies.d.ts","../node_modules/undici-types/patch.d.ts","../node_modules/undici-types/websocket.d.ts","../node_modules/undici-types/eventsource.d.ts","../node_modules/undici-types/filereader.d.ts","../node_modules/undici-types/diagnostics-channel.d.ts","../node_modules/undici-types/content-type.d.ts","../node_modules/undici-types/cache.d.ts","../node_modules/undici-types/index.d.ts","../node_modules/@types/node/web-globals/fetch.d.ts","../node_modules/@types/node/web-globals/navigator.d.ts","../node_modules/@types/node/web-globals/storage.d.ts","../node_modules/@types/node/assert.d.ts","../node_modules/@types/node/assert/strict.d.ts","../node_modules/@types/node/async_hooks.d.ts","../node_modules/@types/node/buffer.d.ts","../node_modules/@types/node/child_process.d.ts","../node_modules/@types/node/cluster.d.ts","../node_modules/@types/node/console.d.ts","../node_modules/@types/node/constants.d.ts","../node_modules/@types/node/crypto.d.ts","../node_modules/@types/node/dgram.d.ts","../node_modules/@types/node/diagnostics_channel.d.ts","../node_modules/@types/node/dns.d.ts","../node_modules/@types/node/dns/promises.d.ts","../node_modules/@types/node/domain.d.ts","../node_modules/@types/node/events.d.ts","../node_modules/@types/node/fs.d.ts","../node_modules/@types/node/fs/promises.d.ts","../node_modules/@types/node/http.d.ts","../node_modules/@types/node/http2.d.ts","../node_modules/@types/node/https.d.ts","../node_modules/@types/node/inspector.d.ts","../node_modules/@types/node/inspector.generated.d.ts","../node_modules/@types/node/module.d.ts","../node_modules/@types/node/net.d.ts","../node_modules/@types/node/os.d.ts","../node_modules/@types/node/path.d.ts","../node_modules/@types/node/perf_hooks.d.ts","../node_modules/@types/node/process.d.ts","../node_modules/@types/node/punycode.d.ts","../node_modules/@types/node/querystring.d.ts","../node_modules/@types/node/readline.d.ts","../node_modules/@types/node/readline/promises.d.ts","../node_modules/@types/node/repl.d.ts","../node_modules/@types/node/sea.d.ts","../node_modules/@types/node/sqlite.d.ts","../node_modules/@types/node/stream.d.ts","../node_modules/@types/node/stream/promises.d.ts","../node_modules/@types/node/stream/consumers.d.ts","../node_modules/@types/node/stream/web.d.ts","../node_modules/@types/node/string_decoder.d.ts","../node_modules/@types/node/test.d.ts","../node_modules/@types/node/timers.d.ts","../node_modules/@types/node/timers/promises.d.ts","../node_modules/@types/node/tls.d.ts","../node_modules/@types/node/trace_events.d.ts","../node_modules/@types/node/tty.d.ts","../node_modules/@types/node/url.d.ts","../node_modules/@types/node/util.d.ts","../node_modules/@types/node/v8.d.ts","../node_modules/@types/node/vm.d.ts","../node_modules/@types/node/wasi.d.ts","../node_modules/@types/node/worker_threads.d.ts","../node_modules/@types/node/zlib.d.ts","../node_modules/@types/node/index.d.ts"],"fileIdsList":[[86,134,151,152],[48,86,134,151,152],[48,49,50,51,52,53,86,134,151,152],[47,86,134,151,152],[56,86,134,151,152],[57,58,86,134,151,152],[72,86,134,151,152],[60,62,63,64,65,66,67,68,69,70,71,72,86,134,151,152],[60,61,63,64,65,66,67,68,69,70,71,72,86,134,151,152],[61,62,63,64,65,66,67,68,69,70,71,72,86,134,151,152],[60,61,62,64,65,66,67,68,69,70,71,72,86,134,151,152],[60,61,62,63,65,66,67,68,69,70,71,72,86,134,151,152],[60,61,62,63,64,66,67,68,69,70,71,72,86,134,151,152],[60,61,62,63,64,65,67,68,69,70,71,72,86,134,151,152],[60,61,62,63,64,65,66,68,69,70,71,72,86,134,151,152],[60,61,62,63,64,65,66,67,69,70,71,72,86,134,151,152],[60,61,62,63,64,65,66,67,68,70,71,72,86,134,151,152],[60,61,62,63,64,65,66,67,68,69,71,72,86,134,151,152],[60,61,62,63,64,65,66,67,68,69,70,72,86,134,151,152],[60,61,62,63,64,65,66,67,68,69,70,71,86,134,151,152],[86,131,132,134,151,152],[86,133,134,151,152],[134,151,152],[86,134,139,151,152,169],[86,134,135,140,145,151,152,154,166,177],[86,134,135,136,145,151,152,154],[81,82,83,86,134,151,152],[86,134,137,151,152,178],[86,134,138,139,146,151,152,155],[86,134,139,151,152,166,174],[86,134,140,142,145,151,152,154],[86,133,134,141,151,152],[86,134,142,143,151,152],[86,134,144,145,151,152],[86,133,134,145,151,152],[86,134,145,146,147,151,152,166,177],[86,134,145,146,147,151,152,161,166,169],[86,127,134,142,145,148,151,152,154,166,177],[86,134,145,146,148,149,151,152,154,166,174,177],[86,134,148,150,151,152,166,174,177],[84,85,86,87,88,89,90,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183],[86,134,145,151,152],[86,134,151,152,153,177],[86,134,142,145,151,152,154,166],[86,134,151,152,155],[86,134,151,152,156],[86,133,134,151,152,157],[86,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183],[86,134,151,152,159],[86,134,151,152,160],[86,134,145,151,152,161,162],[86,134,151,152,161,163,178,180],[86,134,146,151,152],[86,134,145,151,152,166,167,169],[86,134,151,152,168,169],[86,134,151,152,166,167],[86,134,151,152,169],[86,134,151,152,170],[86,131,134,151,152,166,171],[86,134,145,151,152,172,173],[86,134,151,152,172,173],[86,134,139,151,152,154,166,174],[86,134,151,152,175],[86,134,151,152,154,176],[86,134,148,151,152,160,177],[86,134,139,151,152,178],[86,134,151,152,166,179],[86,134,151,152,153,180],[86,134,151,152,181],[86,127,134,151,152],[86,127,134,145,147,151,152,157,166,169,177,179,180,182],[86,134,151,152,166,183],[86,99,103,134,151,152,177],[86,99,134,151,152,166,177],[86,94,134,151,152],[86,96,99,134,151,152,174,177],[86,134,151,152,154,174],[86,134,151,152,184],[86,94,134,151,152,184],[86,96,99,134,151,152,154,177],[86,91,92,95,98,134,145,151,152,166,177],[86,99,106,134,151,152],[86,91,97,134,151,152],[86,99,120,121,134,151,152],[86,95,99,134,151,152,169,177,184],[86,120,134,151,152,184],[86,93,94,134,151,152,184],[86,99,134,151,152],[86,93,94,95,96,97,98,99,100,101,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,121,122,123,124,125,126,134,151,152],[86,99,114,134,151,152],[86,99,106,107,134,151,152],[86,97,99,107,108,134,151,152],[86,98,134,151,152],[86,91,94,99,134,151,152],[86,99,103,107,108,134,151,152],[86,103,134,151,152],[86,97,99,102,134,151,152,177],[86,91,96,99,106,134,151,152],[86,134,151,152,166],[86,94,99,120,134,151,152,182,184],[54,86,134,151,152],[54,55,59,73,74,86,134,151,152],[55,75,86,134,151,152]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d6d51a5118d000ed3bfe6e1dd1335bebfff3fef23cd2af2f84a24d30f90cc90","affectsGlobalScope":true,"impliedFormat":1},{"version":"a00b906da89edb0af666db49ce2e609015d6b529a48c2f632b9410b97235301e","impliedFormat":1},{"version":"d9f4ec5156491a24eee340452d7e87e432512d5ebde23fe18c2ceb5a31c1720b","impliedFormat":1},{"version":"44716259b743dacde932f7f1922ac85f533af74e3ed82a078ba505414f6f6b53","impliedFormat":1},{"version":"653dc417862cf079d590653212a8d48ace7c89ff7b73c239791099afc25dca96","impliedFormat":1},{"version":"497efde09001124a1bfab8ea16409b6908fe8a49ae8d5d69082910838150fbfd","impliedFormat":1},{"version":"99a429217f764353e1ed84e91a382a0e0ed946b200076e7ae885e0ed78fe5d3a","impliedFormat":1},{"version":"5ed925f9d0dfcb0fde32518c7ae42f88461fd8eabb015a35183fac5ce95bbc6c","impliedFormat":1},{"version":"db41e768b4790b9c8991223d26363fff283cb1cdd5d093b4b338049ccd169620","signature":"f91fa6b7d7b917cb13abba172f09cb9322c4d4c6d3235c57fbd54a2db497efa0"},{"version":"fe47c64a7b50057df1e1a8458112c50a8e0d3c71aa53a674f5525b79b1c4935a","impliedFormat":1},{"version":"a452e0a97df99e857b9da0f2857724f603e08e65f631a45738822536772f360f","impliedFormat":1},{"version":"55cb5f9fdd66fdc372a2c866a0eaa2d7e521bc14afb191eb8186acb8cc5612b5","impliedFormat":1},{"version":"14cb3da610d378546b6898621c586c27d7ed5b5a8af9f1c72d831275012b4fc5","impliedFormat":1},{"version":"7220461ab7f6d600b313ce621346c315c3a0ebc65b5c6f268488c5c55b68d319","impliedFormat":1},{"version":"b14c272987c82d49f0f12184c9d8d07a7f71767be99cb76faa125b777c70e962","impliedFormat":1},{"version":"fcf79300e5257a23ed3bacaa6861d7c645139c6f7ece134d15e6669447e5e6db","impliedFormat":1},{"version":"187119ff4f9553676a884e296089e131e8cc01691c546273b1d0089c3533ce42","impliedFormat":1},{"version":"aa2c18a1b5a086bbcaae10a4efba409cc95ba7287d8cf8f2591b53704fea3dea","impliedFormat":1},{"version":"b88749bdb18fc1398370e33aa72bc4f88274118f4960e61ce26605f9b33c5ba2","impliedFormat":1},{"version":"0aaef8cded245bf5036a7a40b65622dd6c4da71f7a35343112edbe112b348a1e","impliedFormat":1},{"version":"00baffbe8a2f2e4875367479489b5d43b5fc1429ecb4a4cc98cfc3009095f52a","impliedFormat":1},{"version":"a873c50d3e47c21aa09fbe1e2023d9a44efb07cc0cb8c72f418bf301b0771fd3","impliedFormat":1},{"version":"7c14ccd2eaa82619fffc1bfa877eb68a012e9fb723d07ee98db451fadb618906","impliedFormat":1},{"version":"49c36529ee09ea9ce19525af5bb84985ea8e782cb7ee8c493d9e36d027a3d019","impliedFormat":1},{"version":"df996e25faa505f85aeb294d15ebe61b399cf1d1e49959cdfaf2cc0815c203f9","impliedFormat":1},{"version":"4f6a12044ee6f458db11964153830abbc499e73d065c51c329ec97407f4b13dd","impliedFormat":1},{"version":"eeb8fb8a15f093ba78d59ff2a2cd36b040f6e7480a442d1e72149b00b9348e6f","impliedFormat":1},{"version":"37299ab615dc61ab75f64943b1c545c57008edaaf57d4859298d9baff37cc45e","signature":"f18e0443a0e14ea93b75e7d557df950f7ab654ffc57df68d47d38cfd2ea7320b"},{"version":"953f35203665b64babd4721158d9cbfbbeacf0e887edf3b3c7b6680264dc810d","signature":"0b17ba1214d60974a7f28729da417368ba63d6ffd622b6d2935005e4ced5da68"},{"version":"5b797b43253a62004fe0c4b7260e0f20c4b6779dfbf29181c37e692200f3f500","signature":"7ea405f18742e9ca5cdea12c391b58a16a5f12e2a8faf29f1af8da53b49d5adc"},{"version":"785b9d575b49124ce01b46f5b9402157c7611e6532effa562ac6aebec0074dfc","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","impliedFormat":1},{"version":"29f72ec1289ae3aeda78bf14b38086d3d803262ac13904b400422941a26a3636","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"2cbe0621042e2a68c7cbce5dfed3906a1862a16a7d496010636cdbdb91341c0f","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"bb45cd435da536500f1d9692a9b49d0c570b763ccbf00473248b777f5c1f353b","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"83e63d6ccf8ec004a3bb6d58b9bb0104f60e002754b1e968024b320730cc5311","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d2bc7425ef40526650d6db7e072c1ff4a51101c3ac2cc4b666623b19496a6e27","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"f27524f4bef4b6519c604bdb23bf4465bddcccbf3f003abb901acbd0d7404d99","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"dba28a419aec76ed864ef43e5f577a5c99a010c32e5949fe4e17a4d57c58dd11","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c959a391a75be9789b43c8468f71e3fa06488b4d691d5729dde1416dcd38225b","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"0dba70b3fb0dcd713fda33c2df64fa6751fff6460e536971cee917260fb17882","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"9f663c2f91127ef7024e8ca4b3b4383ff2770e5f826696005de382282794b127","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1}],"root":[55,[74,76]],"options":{"allowJs":false,"composite":true,"declaration":true,"declarationMap":true,"downlevelIteration":true,"esModuleInterop":true,"experimentalDecorators":true,"inlineSources":true,"jsx":2,"module":1,"noImplicitAny":true,"outDir":"./","rootDir":"..","skipLibCheck":true,"sourceMap":true,"strictNullChecks":false,"target":2},"referencedMap":[[50,1],[49,2],[52,2],[54,3],[48,4],[51,2],[53,1],[57,5],[59,6],[56,1],[58,5],[77,1],[78,1],[79,1],[73,7],[61,8],[62,9],[60,10],[63,11],[64,12],[65,13],[66,14],[67,15],[68,16],[69,17],[70,18],[71,19],[72,20],[80,1],[131,21],[132,21],[133,22],[86,23],[134,24],[135,25],[136,26],[81,1],[84,27],[82,1],[83,1],[137,28],[138,29],[139,30],[140,31],[141,32],[142,33],[143,33],[144,34],[145,35],[146,36],[147,37],[87,1],[85,1],[148,38],[149,39],[150,40],[184,41],[151,42],[152,1],[153,43],[154,44],[155,45],[156,46],[157,47],[158,48],[159,49],[160,50],[161,51],[162,51],[163,52],[164,1],[165,53],[166,54],[168,55],[167,56],[169,57],[170,58],[171,59],[172,60],[173,61],[174,62],[175,63],[176,64],[177,65],[178,66],[179,67],[180,68],[181,69],[88,1],[89,1],[90,1],[128,70],[129,1],[130,1],[182,71],[183,72],[47,1],[45,1],[46,1],[8,1],[10,1],[9,1],[2,1],[11,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[18,1],[3,1],[19,1],[20,1],[4,1],[21,1],[25,1],[22,1],[23,1],[24,1],[26,1],[27,1],[28,1],[5,1],[29,1],[30,1],[31,1],[32,1],[6,1],[36,1],[33,1],[34,1],[35,1],[37,1],[7,1],[38,1],[43,1],[44,1],[39,1],[40,1],[41,1],[42,1],[1,1],[106,73],[116,74],[105,73],[126,75],[97,76],[96,77],[125,78],[119,79],[124,80],[99,81],[113,82],[98,83],[122,84],[94,85],[93,78],[123,86],[95,87],[100,88],[101,1],[104,88],[91,1],[127,89],[117,90],[108,91],[109,92],[111,93],[107,94],[110,95],[120,78],[102,96],[103,97],[112,98],[92,99],[115,90],[114,88],[118,1],[121,100],[55,101],[75,102],[74,101],[76,103]],"latestChangedDtsFile":"./src/index.d.ts","version":"5.9.3"} \ No newline at end of file diff --git a/node_modules/@cucumber/query/eslint.config.mjs b/node_modules/@cucumber/query/eslint.config.mjs new file mode 100644 index 00000000..31e717c5 --- /dev/null +++ b/node_modules/@cucumber/query/eslint.config.mjs @@ -0,0 +1,67 @@ +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +import { fixupConfigRules, fixupPluginRules } from "@eslint/compat"; +import { FlatCompat } from "@eslint/eslintrc"; +import js from "@eslint/js"; +import typescriptEslint from "@typescript-eslint/eslint-plugin"; +import tsParser from "@typescript-eslint/parser"; +import _import from "eslint-plugin-import"; +import n from "eslint-plugin-n"; +import simpleImportSort from "eslint-plugin-simple-import-sort"; +import globals from "globals"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all +}); + +export default [...fixupConfigRules(compat.extends( + "eslint:recommended", + "plugin:import/typescript", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", +)), { + plugins: { + import: fixupPluginRules(_import), + "simple-import-sort": simpleImportSort, + n, + "@typescript-eslint": fixupPluginRules(typescriptEslint), + }, + + languageOptions: { + globals: { + ...globals.browser, + ...globals.node, + }, + + parser: tsParser, + ecmaVersion: 5, + sourceType: "module", + }, + + rules: { + "import/no-cycle": "error", + "n/no-extraneous-import": "error", + "@typescript-eslint/ban-ts-ignore": "off", + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/no-use-before-define": "off", + "@typescript-eslint/interface-name-prefix": "off", + "@typescript-eslint/member-delimiter-style": "off", + "@typescript-eslint/no-explicit-any": "error", + "@typescript-eslint/no-non-null-assertion": "error", + "simple-import-sort/imports": "error", + "simple-import-sort/exports": "error", + }, +}, { + files: ["src/**/*.spec.ts"], + + rules: { + "@typescript-eslint/no-non-null-assertion": "off", + }, +}]; \ No newline at end of file diff --git a/node_modules/@cucumber/query/package.json b/node_modules/@cucumber/query/package.json new file mode 100644 index 00000000..f83458d7 --- /dev/null +++ b/node_modules/@cucumber/query/package.json @@ -0,0 +1,66 @@ +{ + "name": "@cucumber/query", + "version": "15.0.1", + "description": "Cucumber Query - query messages", + "main": "dist/src/index.js", + "types": "dist/src/index.d.ts", + "scripts": { + "build": "tsc --build tsconfig.build.json", + "clean": "rm -rf dist", + "fix": "eslint --max-warnings 0 src --fix src && prettier --write src", + "lint": "eslint --max-warnings 0 src && prettier --check src", + "test": "mocha", + "prepublishOnly": "tsc --build tsconfig.build.json" + }, + "repository": { + "type": "git", + "url": "git://github.com/cucumber/query.git" + }, + "keywords": [ + "cucumber" + ], + "author": "Cucumber Limited ", + "license": "MIT", + "bugs": { + "url": "https://github.com/cucumber/query/issues" + }, + "homepage": "https://github.com/cucumber/query#readme", + "devDependencies": { + "@cucumber/compatibility-kit": "^27.0.0", + "@cucumber/message-streams": "^4.0.1", + "@cucumber/messages": "32.0.0", + "@eslint/compat": "^2.0.0", + "@eslint/eslintrc": "^3.3.0", + "@eslint/js": "^9.21.0", + "@types/lodash.sortby": "^4.7.9", + "@types/mocha": "10.0.10", + "@types/node": "22.19.7", + "@typescript-eslint/eslint-plugin": "^8.43.0", + "@typescript-eslint/parser": "^8.43.0", + "ajv": "8.17.1", + "ajv-cli": "5.0.0", + "eslint": "^9.21.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-n": "^17.15.1", + "eslint-plugin-simple-import-sort": "^12.1.1", + "glob": "^13.0.0", + "globals": "^17.0.0", + "mocha": "11.7.5", + "prettier": "^3.5.2", + "pretty-quick": "4.2.2", + "rimraf": "^6.0.0", + "ts-node": "10.9.2", + "tsconfig-paths": "4.2.0", + "typescript": "5.9.3" + }, + "peerDependencies": { + "@cucumber/messages": "*" + }, + "dependencies": { + "@teppeis/multimaps": "3.0.0", + "lodash.sortby": "^4.7.0" + }, + "overrides": { + "@cucumber/messages": "32.0.0" + } +} diff --git a/node_modules/@cucumber/query/src/Lineage.ts b/node_modules/@cucumber/query/src/Lineage.ts new file mode 100644 index 00000000..bc6b6eb5 --- /dev/null +++ b/node_modules/@cucumber/query/src/Lineage.ts @@ -0,0 +1,113 @@ +import { + Background, + Examples, + Feature, + GherkinDocument, + Pickle, + Rule, + Scenario, + TableRow, +} from '@cucumber/messages' + +export interface Lineage { + gherkinDocument?: GherkinDocument + feature?: Feature + background?: Background + rule?: Rule + ruleBackground?: Background + scenario?: Scenario + examples?: Examples + examplesIndex?: number + example?: TableRow + exampleIndex?: number +} + +export interface LineageReducer { + reduce: (lineage: Lineage, pickle: Pickle) => T +} + +export type NamingStrategy = LineageReducer + +export enum NamingStrategyLength { + LONG = 'LONG', + SHORT = 'SHORT', +} + +export enum NamingStrategyFeatureName { + INCLUDE = 'INCLUDE', + EXCLUDE = 'EXCLUDE', +} + +export enum NamingStrategyExampleName { + NUMBER = 'NUMBER', + PICKLE = 'PICKLE', + NUMBER_AND_PICKLE_IF_PARAMETERIZED = 'NUMBER_AND_PICKLE_IF_PARAMETERIZED', +} + +class BuiltinNamingStrategy implements NamingStrategy { + constructor( + private readonly length: NamingStrategyLength, + private readonly featureName: NamingStrategyFeatureName, + private readonly exampleName: NamingStrategyExampleName + ) {} + + reduce(lineage: Lineage, pickle: Pickle): string { + const parts: string[] = [] + + if (lineage.feature?.name && this.featureName === NamingStrategyFeatureName.INCLUDE) { + parts.push(lineage.feature.name) + } + + if (lineage.rule?.name) { + parts.push(lineage.rule.name) + } + + if (lineage.scenario?.name) { + parts.push(lineage.scenario.name) + } else { + parts.push(pickle.name) + } + + if (lineage.examples?.name) { + parts.push(lineage.examples.name) + } + + if (lineage.example) { + const exampleNumber = [ + '#', + (lineage.examplesIndex ?? 0) + 1, + '.', + (lineage.exampleIndex ?? 0) + 1, + ].join('') + + switch (this.exampleName) { + case NamingStrategyExampleName.NUMBER: + parts.push(exampleNumber) + break + case NamingStrategyExampleName.NUMBER_AND_PICKLE_IF_PARAMETERIZED: + if (lineage.scenario?.name !== pickle.name) { + parts.push(exampleNumber + ': ' + pickle.name) + } else { + parts.push(exampleNumber) + } + break + case NamingStrategyExampleName.PICKLE: + parts.push(pickle.name) + break + } + } + + if (this.length === NamingStrategyLength.SHORT) { + return parts.at(-1) as string + } + return parts.filter((part) => !!part).join(' - ') + } +} + +export function namingStrategy( + length: NamingStrategyLength, + featureName: NamingStrategyFeatureName = NamingStrategyFeatureName.INCLUDE, + exampleName: NamingStrategyExampleName = NamingStrategyExampleName.NUMBER_AND_PICKLE_IF_PARAMETERIZED +): NamingStrategy { + return new BuiltinNamingStrategy(length, featureName, exampleName) +} diff --git a/node_modules/@cucumber/query/src/Query.spec.ts b/node_modules/@cucumber/query/src/Query.spec.ts new file mode 100644 index 00000000..9a2ebe40 --- /dev/null +++ b/node_modules/@cucumber/query/src/Query.spec.ts @@ -0,0 +1,175 @@ +import assert from 'node:assert' +import fs from 'node:fs/promises' +import path from 'node:path' + +import { Envelope, TestCaseStarted } from '@cucumber/messages' + +import { Lineage } from './Lineage' +import Query from './Query' + +describe('Query', () => { + let cucumberQuery: Query + beforeEach(() => { + cucumberQuery = new Query() + }) + + describe('#findAllTestCaseStarted', () => { + it('retains timestamp order', () => { + const testCasesStarted: TestCaseStarted[] = [ + { + id: '1', + testCaseId: '1', + attempt: 0, + timestamp: { + seconds: 1, + nanos: 1, + }, + }, + { + id: '2', + testCaseId: '2', + attempt: 0, + timestamp: { + seconds: 2, + nanos: 1, + }, + }, + { + id: '3', + testCaseId: '3', + attempt: 0, + timestamp: { + seconds: 2, + nanos: 3, + }, + }, + ] + + testCasesStarted + .map((testCaseStarted) => ({ testCaseStarted })) + .reverse() + .forEach((envelope) => { + cucumberQuery.update(envelope) + }) + + assert.deepStrictEqual(cucumberQuery.findAllTestCaseStarted(), testCasesStarted) + }) + + it('uses id as tie breaker', () => { + const testCasesStarted: TestCaseStarted[] = [ + { + id: '1', + testCaseId: '1', + attempt: 0, + timestamp: { + seconds: 1, + nanos: 1, + }, + }, + { + id: '2', + testCaseId: '2', + attempt: 0, + timestamp: { + seconds: 1, + nanos: 1, + }, + }, + ] + + testCasesStarted + .map((testCaseStarted) => ({ testCaseStarted })) + .reverse() + .forEach((envelope) => { + cucumberQuery.update(envelope) + }) + + assert.deepStrictEqual(cucumberQuery.findAllTestCaseStarted(), testCasesStarted) + }) + }) + + describe('#findLineageBy', () => { + it('returns correct lineage for a minimal scenario', async () => { + const envelopes: ReadonlyArray = ( + await fs.readFile(path.join(__dirname, '../../testdata/src/minimal.ndjson'), { + encoding: 'utf-8', + }) + ) + .split('\n') + .filter((line) => !!line) + .map((line) => JSON.parse(line)) + envelopes.forEach((envelope) => cucumberQuery.update(envelope)) + + const gherkinDocument = envelopes.find((envelope) => envelope.gherkinDocument).gherkinDocument + const feature = gherkinDocument.feature + const scenario = feature.children.find((child) => child.scenario).scenario + const pickle = envelopes.find((envelope) => envelope.pickle).pickle + + assert.deepStrictEqual(cucumberQuery.findLineageBy(pickle), { + gherkinDocument, + feature, + scenario, + } satisfies Lineage) + }) + + it('returns correct lineage for a pickle from an examples table', async () => { + const envelopes: ReadonlyArray = ( + await fs.readFile(path.join(__dirname, '../../testdata/src/examples-tables.ndjson'), { + encoding: 'utf-8', + }) + ) + .split('\n') + .filter((line) => !!line) + .map((line) => JSON.parse(line)) + envelopes.forEach((envelope) => cucumberQuery.update(envelope)) + + const gherkinDocument = envelopes.find((envelope) => envelope.gherkinDocument).gherkinDocument + const feature = gherkinDocument.feature + const scenario = feature.children.find((child) => child.scenario).scenario + const pickle = envelopes.find((envelope) => envelope.pickle).pickle + const examples = scenario.examples[0] + const example = examples.tableBody[0] + + assert.deepStrictEqual(cucumberQuery.findLineageBy(pickle), { + gherkinDocument, + feature, + scenario, + examples, + examplesIndex: 0, + example, + exampleIndex: 0, + } satisfies Lineage) + }) + + it('returns correct lineage for a pickle with background-derived steps', async () => { + const envelopes: ReadonlyArray = ( + await fs.readFile(path.join(__dirname, '../../testdata/src/rules-backgrounds.ndjson'), { + encoding: 'utf-8', + }) + ) + .split('\n') + .filter((line) => !!line) + .map((line) => JSON.parse(line)) + envelopes.forEach((envelope) => cucumberQuery.update(envelope)) + + const gherkinDocument = envelopes.find((envelope) => envelope.gherkinDocument).gherkinDocument + const feature = gherkinDocument.feature + const background = gherkinDocument.feature.children.find( + (child) => child.background + ).background + const rule = feature.children.find((child) => child.rule).rule + const ruleBackground = rule.children.find((child) => child.background).background + const scenario = rule.children.find((child) => child.scenario).scenario + const pickle = envelopes.find((envelope) => envelope.pickle).pickle + + assert.deepStrictEqual(cucumberQuery.findLineageBy(pickle), { + gherkinDocument, + feature, + background, + rule, + ruleBackground, + scenario, + } satisfies Lineage) + }) + }) +}) diff --git a/node_modules/@cucumber/query/src/Query.ts b/node_modules/@cucumber/query/src/Query.ts new file mode 100644 index 00000000..e040a061 --- /dev/null +++ b/node_modules/@cucumber/query/src/Query.ts @@ -0,0 +1,584 @@ +import * as messages from '@cucumber/messages' +import { + Attachment, + Duration, + Feature, + GherkinDocument, + Hook, + Location, + Meta, + Pickle, + PickleStep, + Rule, + Scenario, + Step, + StepDefinition, + Suggestion, + TestCase, + TestCaseFinished, + TestCaseStarted, + TestRunFinished, + TestRunHookFinished, + TestRunHookStarted, + TestRunStarted, + TestStep, + TestStepFinished, + TestStepResult, + TestStepResultStatus, + TestStepStarted, + TimeConversion, + UndefinedParameterType, +} from '@cucumber/messages' +import { ArrayMultimap } from '@teppeis/multimaps' +import sortBy from 'lodash.sortby' + +import { assert, statusOrdinal } from './helpers' +import { Lineage } from './Lineage' + +export default class Query { + private meta: Meta + private testRunStarted: TestRunStarted + private testRunFinished: TestRunFinished + private readonly testCaseStartedById: Map = new Map() + private readonly lineageById: Map = new Map() + private readonly stepById: Map = new Map() + private readonly pickleById: Map = new Map() + private readonly pickleStepById: Map = new Map() + private readonly hookById: Map = new Map() + private readonly stepDefinitionById: Map = new Map() + private readonly testCaseById: Map = new Map() + private readonly testStepById: Map = new Map() + private readonly testCaseFinishedByTestCaseStartedId: Map = new Map() + private readonly testRunHookStartedById: Map = new Map() + private readonly testRunHookFinishedByTestRunHookStartedId: Map = + new Map() + private readonly testStepStartedByTestCaseStartedId: ArrayMultimap = + new ArrayMultimap() + private readonly testStepFinishedByTestCaseStartedId: ArrayMultimap = + new ArrayMultimap() + private readonly attachmentsByTestCaseStartedId: ArrayMultimap = + new ArrayMultimap() + private readonly attachmentsByTestRunHookStartedId: ArrayMultimap = + new ArrayMultimap() + private readonly suggestionsByPickleStepId: ArrayMultimap = + new ArrayMultimap() + private readonly undefinedParameterTypes: UndefinedParameterType[] = [] + + public update(envelope: messages.Envelope) { + if (envelope.meta) { + this.meta = envelope.meta + } + if (envelope.gherkinDocument) { + this.updateGherkinDocument(envelope.gherkinDocument) + } + if (envelope.pickle) { + this.updatePickle(envelope.pickle) + } + if (envelope.hook) { + this.hookById.set(envelope.hook.id, envelope.hook) + } + if (envelope.stepDefinition) { + this.stepDefinitionById.set(envelope.stepDefinition.id, envelope.stepDefinition) + } + if (envelope.testRunStarted) { + this.testRunStarted = envelope.testRunStarted + } + if (envelope.testRunHookStarted) { + this.updateTestRunHookStarted(envelope.testRunHookStarted) + } + if (envelope.testRunHookFinished) { + this.updateTestRunHookFinished(envelope.testRunHookFinished) + } + if (envelope.testCase) { + this.updateTestCase(envelope.testCase) + } + if (envelope.testCaseStarted) { + this.updateTestCaseStarted(envelope.testCaseStarted) + } + if (envelope.testStepStarted) { + this.updateTestStepStarted(envelope.testStepStarted) + } + if (envelope.attachment) { + this.updateAttachment(envelope.attachment) + } + if (envelope.testStepFinished) { + this.updateTestStepFinished(envelope.testStepFinished) + } + if (envelope.testCaseFinished) { + this.updateTestCaseFinished(envelope.testCaseFinished) + } + if (envelope.testRunFinished) { + this.testRunFinished = envelope.testRunFinished + } + if (envelope.suggestion) { + this.updateSuggestion(envelope.suggestion) + } + if (envelope.undefinedParameterType) { + this.updateUndefinedParameterType(envelope.undefinedParameterType) + } + } + + private updateGherkinDocument(gherkinDocument: GherkinDocument) { + if (gherkinDocument.feature) { + this.updateFeature(gherkinDocument.feature, { + gherkinDocument, + }) + } + } + + private updateFeature(feature: Feature, lineage: Lineage) { + feature.children.forEach((featureChild) => { + if (featureChild.background) { + lineage.background = featureChild.background + this.updateSteps(featureChild.background.steps) + } + if (featureChild.scenario) { + this.updateScenario(featureChild.scenario, { + ...lineage, + feature, + }) + } + if (featureChild.rule) { + this.updateRule(featureChild.rule, { + ...lineage, + feature, + }) + } + }) + } + + private updateRule(rule: Rule, lineage: Lineage) { + rule.children.forEach((ruleChild) => { + if (ruleChild.background) { + lineage.ruleBackground = ruleChild.background + this.updateSteps(ruleChild.background.steps) + } + if (ruleChild.scenario) { + this.updateScenario(ruleChild.scenario, { + ...lineage, + rule, + }) + } + }) + } + + private updateScenario(scenario: Scenario, lineage: Lineage) { + this.lineageById.set(scenario.id, { + ...lineage, + scenario, + }) + scenario.examples.forEach((examples, examplesIndex) => { + this.lineageById.set(examples.id, { + ...lineage, + scenario, + examples, + examplesIndex, + }) + examples.tableBody.forEach((example, exampleIndex) => { + this.lineageById.set(example.id, { + ...lineage, + scenario, + examples, + examplesIndex, + example, + exampleIndex, + }) + }) + }) + this.updateSteps(scenario.steps) + } + + private updateSteps(steps: ReadonlyArray) { + steps.forEach((step) => this.stepById.set(step.id, step)) + } + + private updatePickle(pickle: Pickle) { + this.pickleById.set(pickle.id, pickle) + pickle.steps.forEach((pickleStep) => this.pickleStepById.set(pickleStep.id, pickleStep)) + } + + private updateTestRunHookStarted(testRunHookStarted: TestRunHookStarted) { + this.testRunHookStartedById.set(testRunHookStarted.id, testRunHookStarted) + } + + private updateTestRunHookFinished(testRunHookFinished: TestRunHookFinished) { + this.testRunHookFinishedByTestRunHookStartedId.set( + testRunHookFinished.testRunHookStartedId, + testRunHookFinished + ) + } + + private updateTestCase(testCase: TestCase) { + this.testCaseById.set(testCase.id, testCase) + testCase.testSteps.forEach((testStep) => { + this.testStepById.set(testStep.id, testStep) + }) + } + + private updateTestCaseStarted(testCaseStarted: TestCaseStarted) { + this.testCaseStartedById.set(testCaseStarted.id, testCaseStarted) + } + + private updateTestStepStarted(testStepStarted: TestStepStarted) { + this.testStepStartedByTestCaseStartedId.put(testStepStarted.testCaseStartedId, testStepStarted) + } + + private updateAttachment(attachment: Attachment) { + if (attachment.testCaseStartedId) { + this.attachmentsByTestCaseStartedId.put(attachment.testCaseStartedId, attachment) + } + if (attachment.testRunHookStartedId) { + this.attachmentsByTestRunHookStartedId.put(attachment.testRunHookStartedId, attachment) + } + } + + private updateTestStepFinished(testStepFinished: TestStepFinished) { + this.testStepFinishedByTestCaseStartedId.put( + testStepFinished.testCaseStartedId, + testStepFinished + ) + } + + private updateTestCaseFinished(testCaseFinished: TestCaseFinished) { + this.testCaseFinishedByTestCaseStartedId.set( + testCaseFinished.testCaseStartedId, + testCaseFinished + ) + } + + private updateSuggestion(suggestion: Suggestion) { + this.suggestionsByPickleStepId.put(suggestion.pickleStepId, suggestion) + } + + private updateUndefinedParameterType(undefinedParameterType: UndefinedParameterType) { + this.undefinedParameterTypes.push(undefinedParameterType) + } + + public countMostSevereTestStepResultStatus(): Record { + const result: Record = { + [TestStepResultStatus.AMBIGUOUS]: 0, + [TestStepResultStatus.FAILED]: 0, + [TestStepResultStatus.PASSED]: 0, + [TestStepResultStatus.PENDING]: 0, + [TestStepResultStatus.SKIPPED]: 0, + [TestStepResultStatus.UNDEFINED]: 0, + [TestStepResultStatus.UNKNOWN]: 0, + } + for (const testCaseStarted of this.findAllTestCaseStarted()) { + const mostSevereResult = sortBy( + this.findTestStepFinishedAndTestStepBy(testCaseStarted).map( + ([testStepFinished]) => testStepFinished.testStepResult + ), + [(testStepResult) => statusOrdinal(testStepResult.status)] + ).at(-1) + if (mostSevereResult) { + result[mostSevereResult.status]++ + } + } + return result + } + + public countTestCasesStarted(): number { + return this.findAllTestCaseStarted().length + } + + public findAllPickles(): ReadonlyArray { + return [...this.pickleById.values()] + } + + public findAllPickleSteps(): ReadonlyArray { + return [...this.pickleStepById.values()] + } + + public findAllStepDefinitions(): ReadonlyArray { + return [...this.stepDefinitionById.values()] + } + + public findAllTestCaseStarted(): ReadonlyArray { + return sortBy( + [...this.testCaseStartedById.values()].filter((testCaseStarted) => { + const testCaseFinished = this.testCaseFinishedByTestCaseStartedId.get(testCaseStarted.id) + // only include if not yet finished OR won't be retried + return !testCaseFinished?.willBeRetried + }), + [ + (testCaseStarted) => + TimeConversion.timestampToMillisecondsSinceEpoch(testCaseStarted.timestamp), + 'id', + ] + ) + } + + public findAllTestCaseFinished(): ReadonlyArray { + return sortBy( + [...this.testCaseFinishedByTestCaseStartedId.values()].filter((testCaseFinished) => { + // only include if not yet finished OR won't be retried + return !testCaseFinished?.willBeRetried + }), + [ + (testCaseFinished) => + TimeConversion.timestampToMillisecondsSinceEpoch(testCaseFinished.timestamp), + 'id', + ] + ) + } + + public findAllTestCaseStartedOrderBy( + findOrderBy: (query: Query, testCaseStarted: TestCaseStarted) => T | undefined, + order: (a: T, b: T) => number + ): ReadonlyArray { + const withOrderBy = this.findAllTestCaseStarted().map((testCaseStarted) => ({ + testCaseStarted, + orderBy: findOrderBy(this, testCaseStarted), + })) + + const sorted = withOrderBy.sort((a, b) => { + if (a.orderBy === undefined && b.orderBy === undefined) return 0 + if (a.orderBy === undefined) return 1 + if (b.orderBy === undefined) return -1 + return order(a.orderBy, b.orderBy) + }) + + return sorted.map((item) => item.testCaseStarted) + } + + public findAllTestCaseFinishedOrderBy( + findOrderBy: (query: Query, testCaseFinished: TestCaseFinished) => T | undefined, + order: (a: T, b: T) => number + ): ReadonlyArray { + const withOrderBy = this.findAllTestCaseFinished().map((testCaseFinished) => ({ + testCaseFinished, + orderBy: findOrderBy(this, testCaseFinished), + })) + + const sorted = withOrderBy.sort((a, b) => { + if (a.orderBy === undefined && b.orderBy === undefined) return 0 + if (a.orderBy === undefined) return 1 + if (b.orderBy === undefined) return -1 + return order(a.orderBy, b.orderBy) + }) + + return sorted.map((item) => item.testCaseFinished) + } + + public findAllTestSteps(): ReadonlyArray { + return [...this.testStepById.values()] + } + + public findAllTestStepStarted(): ReadonlyArray { + return [...this.testStepStartedByTestCaseStartedId.values()] + } + + public findAllTestStepFinished(): ReadonlyArray { + return [...this.testStepFinishedByTestCaseStartedId.values()] + } + + public findAllTestRunHookStarted(): ReadonlyArray { + return [...this.testRunHookStartedById.values()] + } + + public findAllTestRunHookFinished(): ReadonlyArray { + return [...this.testRunHookFinishedByTestRunHookStartedId.values()] + } + + public findAllUndefinedParameterTypes(): ReadonlyArray { + return [...this.undefinedParameterTypes] + } + + public findAttachmentsBy( + element: TestStepFinished | TestRunHookFinished + ): ReadonlyArray { + if ('testStepId' in element) { + return this.attachmentsByTestCaseStartedId + .get(element.testCaseStartedId) + .filter((attachment) => attachment.testStepId === element.testStepId) + } else { + return this.attachmentsByTestRunHookStartedId.get(element.testRunHookStartedId) + } + } + + public findHookBy(item: TestStep | TestRunHookStarted | TestRunHookFinished): Hook | undefined { + if ('testRunHookStartedId' in item) { + const testRunHookStarted = this.findTestRunHookStartedBy(item) + assert.ok(testRunHookStarted, 'Expected to find TestRunHookStarted from TestRunHookFinished') + return this.findHookBy(testRunHookStarted) + } + if (!item.hookId) { + return undefined + } + return this.hookById.get(item.hookId) + } + + public findMeta(): Meta | undefined { + return this.meta + } + + public findMostSevereTestStepResultBy( + element: TestCaseStarted | TestCaseFinished + ): TestStepResult | undefined { + const testCaseStarted = + 'testCaseStartedId' in element ? this.findTestCaseStartedBy(element) : element + return sortBy( + this.findTestStepFinishedAndTestStepBy(testCaseStarted).map( + ([testStepFinished]) => testStepFinished.testStepResult + ), + [(testStepResult) => statusOrdinal(testStepResult.status)] + ).at(-1) + } + + public findLocationOf(pickle: Pickle): Location | undefined { + const lineage = this.findLineageBy(pickle) + if (lineage?.example) { + return lineage.example.location + } + return lineage?.scenario?.location + } + + public findPickleBy( + element: TestCaseStarted | TestCaseFinished | TestStepStarted + ): Pickle | undefined { + const testCase = this.findTestCaseBy(element) + assert.ok(testCase, 'Expected to find TestCase from TestCaseStarted') + return this.pickleById.get(testCase.pickleId) + } + + public findPickleStepBy(testStep: TestStep): PickleStep | undefined { + if (!testStep.pickleStepId) { + return undefined + } + return this.pickleStepById.get(testStep.pickleStepId) + } + + public findStepBy(pickleStep: PickleStep): Step | undefined { + const [astNodeId] = pickleStep.astNodeIds + assert.ok(astNodeId, 'Expected PickleStep to have an astNodeId') + return this.stepById.get(astNodeId) + } + + public findStepDefinitionsBy(testStep: TestStep): ReadonlyArray { + return (testStep.stepDefinitionIds ?? []).map((id) => this.stepDefinitionById.get(id)) + } + + findSuggestionsBy(element: PickleStep | Pickle): ReadonlyArray { + if ('steps' in element) { + return element.steps.flatMap((value) => this.findSuggestionsBy(value)) + } + return this.suggestionsByPickleStepId.get(element.id) + } + + public findUnambiguousStepDefinitionBy(testStep: TestStep): StepDefinition | undefined { + if (testStep.stepDefinitionIds?.length === 1) { + return this.stepDefinitionById.get(testStep.stepDefinitionIds[0]) + } + return undefined + } + + public findTestCaseBy( + element: TestCaseStarted | TestCaseFinished | TestStepStarted | TestStepFinished + ): TestCase | undefined { + const testCaseStarted = + 'testCaseStartedId' in element ? this.findTestCaseStartedBy(element) : element + assert.ok(testCaseStarted, 'Expected to find TestCaseStarted by TestStepStarted') + return this.testCaseById.get(testCaseStarted.testCaseId) + } + + public findTestCaseDurationBy(element: TestCaseStarted | TestCaseFinished): Duration | undefined { + let testCaseStarted: TestCaseStarted + let testCaseFinished: TestCaseFinished + if ('testCaseStartedId' in element) { + testCaseStarted = this.findTestCaseStartedBy(element) + testCaseFinished = element + } else { + testCaseStarted = element + testCaseFinished = this.findTestCaseFinishedBy(element) + } + if (!testCaseFinished) { + return undefined + } + return TimeConversion.millisecondsToDuration( + TimeConversion.timestampToMillisecondsSinceEpoch(testCaseFinished.timestamp) - + TimeConversion.timestampToMillisecondsSinceEpoch(testCaseStarted.timestamp) + ) + } + + public findTestCaseStartedBy( + element: TestCaseFinished | TestStepStarted | TestStepFinished + ): TestCaseStarted | undefined { + return this.testCaseStartedById.get(element.testCaseStartedId) + } + + public findTestCaseFinishedBy(testCaseStarted: TestCaseStarted): TestCaseFinished | undefined { + return this.testCaseFinishedByTestCaseStartedId.get(testCaseStarted.id) + } + + public findTestRunHookStartedBy( + testRunHookFinished: TestRunHookFinished + ): TestRunHookStarted | undefined { + return this.testRunHookStartedById.get(testRunHookFinished.testRunHookStartedId) + } + + public findTestRunHookFinishedBy( + testRunHookStarted: TestRunHookStarted + ): TestRunHookFinished | undefined { + return this.testRunHookFinishedByTestRunHookStartedId.get(testRunHookStarted.id) + } + + public findTestRunDuration(): Duration | undefined { + if (!this.testRunStarted || !this.testRunFinished) { + return undefined + } + return TimeConversion.millisecondsToDuration( + TimeConversion.timestampToMillisecondsSinceEpoch(this.testRunFinished.timestamp) - + TimeConversion.timestampToMillisecondsSinceEpoch(this.testRunStarted.timestamp) + ) + } + + public findTestRunFinished(): TestRunFinished | undefined { + return this.testRunFinished + } + + public findTestRunStarted(): TestRunStarted | undefined { + return this.testRunStarted + } + + public findTestStepBy(element: TestStepStarted | TestStepFinished): TestStep | undefined { + return this.testStepById.get(element.testStepId) + } + + public findTestStepsStartedBy( + element: TestCaseStarted | TestCaseFinished + ): ReadonlyArray { + const testCaseStartedId = + 'testCaseStartedId' in element ? element.testCaseStartedId : element.id + // multimaps `get` implements `getOrDefault([])` behaviour internally + return [...this.testStepStartedByTestCaseStartedId.get(testCaseStartedId)] + } + + public findTestStepsFinishedBy( + element: TestCaseStarted | TestCaseFinished + ): ReadonlyArray { + const testCaseStarted = + 'testCaseStartedId' in element ? this.findTestCaseStartedBy(element) : element + // multimaps `get` implements `getOrDefault([])` behaviour internally + return [...this.testStepFinishedByTestCaseStartedId.get(testCaseStarted.id)] + } + + public findTestStepFinishedAndTestStepBy( + testCaseStarted: TestCaseStarted + ): ReadonlyArray<[TestStepFinished, TestStep]> { + return this.testStepFinishedByTestCaseStartedId + .get(testCaseStarted.id) + .map((testStepFinished) => { + const testStep = this.findTestStepBy(testStepFinished) + assert.ok(testStep, 'Expected to find TestStep by TestStepFinished') + return [testStepFinished, testStep] + }) + } + + public findLineageBy(element: Pickle | TestCaseStarted | TestCaseFinished): Lineage | undefined { + const pickle = 'astNodeIds' in element ? element : this.findPickleBy(element) + const deepestAstNodeId = pickle.astNodeIds.at(-1) + assert.ok(deepestAstNodeId, 'Expected Pickle to have at least one astNodeId') + return this.lineageById.get(deepestAstNodeId) + } +} diff --git a/node_modules/@cucumber/query/src/acceptance.spec.ts b/node_modules/@cucumber/query/src/acceptance.spec.ts new file mode 100644 index 00000000..43815378 --- /dev/null +++ b/node_modules/@cucumber/query/src/acceptance.spec.ts @@ -0,0 +1,339 @@ +import assert from 'node:assert' +import fs from 'node:fs' +import * as path from 'node:path' +import { Writable } from 'node:stream' +import { pipeline } from 'node:stream/promises' + +import { NdjsonToMessageStream } from '@cucumber/message-streams' +import { Envelope, Pickle } from '@cucumber/messages' + +import Query from './Query' + +const reversePickleComparator = (a: Pickle, b: Pickle): number => { + if (a.uri !== b.uri) { + return b.uri.localeCompare(a.uri) + } + if (a.location.line !== b.location.line) { + return b.location.line - a.location.line + } + return b.location.column - a.location.column +} + +describe('Acceptance Tests', async () => { + const sources = [ + path.join(__dirname, '../../testdata/src/attachments.ndjson'), + path.join(__dirname, '../../testdata/src/empty.ndjson'), + path.join(__dirname, '../../testdata/src/global-hooks.ndjson'), + path.join(__dirname, '../../testdata/src/global-hooks-attachments.ndjson'), + path.join(__dirname, '../../testdata/src/hooks.ndjson'), + path.join(__dirname, '../../testdata/src/minimal.ndjson'), + path.join(__dirname, '../../testdata/src/rules.ndjson'), + path.join(__dirname, '../../testdata/src/examples-tables.ndjson'), + path.join(__dirname, '../../testdata/src/unknown-parameter-type.ndjson'), + ] + const queries: Queries = { + countMostSevereTestStepResultStatus: (query: Query) => + query.countMostSevereTestStepResultStatus(), + countTestCasesStarted: (query: Query) => query.countTestCasesStarted(), + findAllPickles: (query: Query) => query.findAllPickles().length, + findAllPickleSteps: (query: Query) => query.findAllPickleSteps().length, + findAllStepDefinitions: (query: Query) => query.findAllStepDefinitions().length, + findAllTestCaseStarted: (query: Query) => query.findAllTestCaseStarted().length, + findAllTestCaseStartedOrderBy: (query: Query) => + query + .findAllTestCaseStartedOrderBy( + (q, testCaseStarted) => q.findPickleBy(testCaseStarted), + reversePickleComparator + ) + .map((testCaseStarted) => testCaseStarted.id), + findAllTestCaseFinished: (query: Query) => query.findAllTestCaseFinished().length, + findAllTestCaseFinishedOrderBy: (query: Query) => + query + .findAllTestCaseFinishedOrderBy( + (q, testCaseFinished) => q.findPickleBy(testCaseFinished), + reversePickleComparator + ) + .map((testCaseFinished) => testCaseFinished.testCaseStartedId), + findAllTestRunHookStarted: (query: Query) => query.findAllTestRunHookStarted().length, + findAllTestRunHookFinished: (query: Query) => query.findAllTestRunHookFinished().length, + findTestRunHookStartedBy: (query: Query) => + query + .findAllTestRunHookFinished() + .map((testRunHookFinished) => query.findTestRunHookStartedBy(testRunHookFinished)) + .map((testRunHookStarted) => testRunHookStarted?.id), + findTestRunHookFinishedBy: (query: Query) => + query + .findAllTestRunHookStarted() + .map((testRunHookStarted) => query.findTestRunHookFinishedBy(testRunHookStarted)) + .map((testRunHookFinished) => testRunHookFinished?.testRunHookStartedId), + findAllTestSteps: (query: Query) => query.findAllTestSteps().length, + findAttachmentsBy: (query: Query) => ({ + testStepFinished: query + .findAllTestCaseStarted() + .map((testCaseStarted) => query.findTestStepsFinishedBy(testCaseStarted)) + .map((testStepFinisheds) => + testStepFinisheds.map((testStepFinished) => query.findAttachmentsBy(testStepFinished)) + ) + .flat(2) + .map((attachment) => [ + attachment.testStepId, + attachment.testCaseStartedId, + attachment.mediaType, + attachment.contentEncoding, + ]), + testRunHookFinished: query + .findAllTestRunHookFinished() + .map((testRunHookFinished) => query.findAttachmentsBy(testRunHookFinished)) + .flat() + .map((attachment) => [ + attachment.testRunHookStartedId, + attachment.mediaType, + attachment.contentEncoding, + ]), + }), + + findHookBy: (query: Query) => { + return { + testStep: query + .findAllTestSteps() + .map((testStep) => query.findHookBy(testStep)) + .map((hook) => hook?.id) + .filter((value) => !!value), + testRunHookStarted: query + .findAllTestRunHookStarted() + .map((testStep) => query.findHookBy(testStep)) + .map((hook) => hook?.id) + .filter((value) => !!value), + testRunHookFinished: query + .findAllTestRunHookFinished() + .map((testStep) => query.findHookBy(testStep)) + .map((hook) => hook?.id) + .filter((value) => !!value), + } + }, + + findMeta: (query: Query) => query.findMeta()?.implementation?.name, + findMostSevereTestStepResultBy: (query: Query) => { + return { + testCaseStarted: query + .findAllTestCaseStarted() + .map((testCaseStarted) => query.findMostSevereTestStepResultBy(testCaseStarted)) + .map((testStepResult) => testStepResult?.status) + .filter((value) => value), + testCaseFinished: query + .findAllTestCaseFinished() + .map((testCaseStarted) => query.findMostSevereTestStepResultBy(testCaseStarted)) + .map((testStepResult) => testStepResult?.status) + .filter((value) => value), + } + }, + findLocationOf: (query: Query) => + query.findAllPickles().map((pickle) => query.findLocationOf(pickle)), + + findPickleBy: (query: Query) => { + return { + testCaseStarted: query + .findAllTestCaseStarted() + .map((testCaseStarted) => query.findPickleBy(testCaseStarted)) + .map((pickle) => pickle?.name), + testCaseFinished: query + .findAllTestCaseFinished() + .map((testCaseFinished) => query.findPickleBy(testCaseFinished)) + .map((pickle) => pickle?.name), + testStepStarted: query + .findAllTestStepFinished() + .map((testCaseStarted) => query.findPickleBy(testCaseStarted)) + .map((pickle) => pickle?.name), + testStepFinished: query + .findAllTestStepFinished() + .map((testCaseFinished) => query.findPickleBy(testCaseFinished)) + .map((pickle) => pickle?.name), + } + }, + findPickleStepBy: (query: Query) => + query + .findAllTestSteps() + .map((testStep) => query.findPickleStepBy(testStep)) + .map((pickleStep) => pickleStep?.text) + .filter((value) => !!value), + findStepBy: (query: Query) => + query + .findAllPickleSteps() + .map((pickleStep) => query.findStepBy(pickleStep)) + .map((step) => step?.text), + findStepDefinitionsBy: (query: Query) => + query + .findAllTestSteps() + .map((pickleStep) => + query.findStepDefinitionsBy(pickleStep).map((stepDefinition) => stepDefinition?.id) + ), + findSuggestionsBy: (query: Query) => { + return { + pickleStep: query + .findAllPickleSteps() + .flatMap((pickleStep) => query.findSuggestionsBy(pickleStep)) + .map((suggestion) => suggestion.id), + pickle: query + .findAllPickles() + .flatMap((pickle) => query.findSuggestionsBy(pickle)) + .map((suggestion) => suggestion.id), + } + }, + findUnambiguousStepDefinitionBy: (query: Query) => + query + .findAllTestSteps() + .map((pickleStep) => query.findUnambiguousStepDefinitionBy(pickleStep)) + .filter((stepDefinition) => !!stepDefinition) + .map((stepDefinition) => stepDefinition.id), + findTestCaseStartedBy: (query: Query) => { + return { + testCaseFinished: query + .findAllTestCaseFinished() + .map((testCaseFinished) => query.findTestCaseStartedBy(testCaseFinished)) + .map((testCase) => testCase?.id), + testStepStarted: query + .findAllTestStepStarted() + .map((testStepStarted) => query.findTestCaseStartedBy(testStepStarted)) + .map((testCase) => testCase?.id), + testStepFinished: query + .findAllTestStepFinished() + .map((testStepFinished) => query.findTestCaseStartedBy(testStepFinished)) + .map((testCase) => testCase?.id), + } + }, + findTestCaseBy: (query: Query) => { + return { + testCaseStarted: query + .findAllTestCaseStarted() + .map((testCaseStarted) => query.findTestCaseBy(testCaseStarted)) + .map((testCase) => testCase?.id), + testCaseFinished: query + .findAllTestCaseFinished() + .map((testCaseFinished) => query.findTestCaseBy(testCaseFinished)) + .map((testCase) => testCase?.id), + testStepStarted: query + .findAllTestStepStarted() + .map((testStepStarted) => query.findTestCaseBy(testStepStarted)) + .map((testCase) => testCase?.id), + testStepFinished: query + .findAllTestStepFinished() + .map((testStepFinished) => query.findTestCaseBy(testStepFinished)) + .map((testCase) => testCase?.id), + } + }, + findTestCaseDurationBy: (query: Query) => { + return { + testCaseStarted: query + .findAllTestCaseStarted() + .map((testCaseStarted) => query.findTestCaseDurationBy(testCaseStarted)), + testCaseFinished: query + .findAllTestCaseFinished() + .map((testCaseFinished) => query.findTestCaseDurationBy(testCaseFinished)), + } + }, + findTestCaseFinishedBy: (query: Query) => + query + .findAllTestCaseStarted() + .map((testCaseStarted) => query.findTestCaseFinishedBy(testCaseStarted)) + .map((testCaseFinished) => testCaseFinished?.testCaseStartedId), + findTestRunDuration: (query: Query) => query.findTestRunDuration(), + findTestRunFinished: (query: Query) => query.findTestRunFinished(), + findTestRunStarted: (query: Query) => query.findTestRunStarted(), + findTestStepBy: (query: Query) => + query + .findAllTestCaseStarted() + .flatMap((testCaseStarted) => query.findTestStepsStartedBy(testCaseStarted)) + .map((testStepStarted) => query.findTestStepBy(testStepStarted)) + .map((testStep) => testStep?.id), + findTestStepsStartedBy: (query: Query) => { + return { + testCaseStarted: query + .findAllTestCaseStarted() + .map((testCaseStarted) => query.findTestStepsStartedBy(testCaseStarted)) + .map((testStepsStarted) => + testStepsStarted.map((testStepStarted) => testStepStarted.testStepId) + ), + testCaseFinished: query + .findAllTestCaseFinished() + .map((testCaseFinished) => query.findTestStepsStartedBy(testCaseFinished)) + .map((testStepsStarted) => + testStepsStarted.map((testStepStarted) => testStepStarted.testStepId) + ), + } + }, + findTestStepByTestStepFinished: (query: Query) => { + return { + testCaseStarted: query + .findAllTestCaseStarted() + .flatMap((testCaseStarted) => query.findTestStepsFinishedBy(testCaseStarted)) + .map((testStepFinished) => query.findTestStepBy(testStepFinished)) + .map((testStep) => testStep?.id), + testCaseFinished: query + .findAllTestCaseFinished() + .flatMap((testCaseFinished) => query.findTestStepsFinishedBy(testCaseFinished)) + .map((testStepFinished) => query.findTestStepBy(testStepFinished)) + .map((testStep) => testStep?.id), + } + }, + findTestStepsFinishedBy: (query: Query) => + query + .findAllTestCaseStarted() + .map((testCaseStarted) => query.findTestStepsFinishedBy(testCaseStarted)) + .map((testStepFinisheds) => + testStepFinisheds.map((testStepFinished) => testStepFinished?.testStepId) + ), + findTestStepFinishedAndTestStepBy: (query: Query) => + query + .findAllTestCaseStarted() + .flatMap((testCaseStarted) => query.findTestStepFinishedAndTestStepBy(testCaseStarted)) + .map(([testStepFinished, testStep]) => [testStepFinished.testStepId, testStep.id]), + findAllUndefinedParameterTypes: (query: Query) => + query + .findAllUndefinedParameterTypes() + .map((undefinedParameterType) => [ + undefinedParameterType.name, + undefinedParameterType.expression, + ]), + } + + for (const source of sources) { + for (const methodName in queries) { + const [suiteName] = path.basename(source).split('.') + + it(suiteName + ' -> ' + methodName, async () => { + const query = new Query() + + await pipeline( + fs.createReadStream(source, { encoding: 'utf-8' }), + new NdjsonToMessageStream(), + new Writable({ + objectMode: true, + write(envelope: Envelope, _: BufferEncoding, callback) { + query.update(envelope) + callback() + }, + }) + ) + + const expectedResults = JSON.parse( + fs.readFileSync( + path.join( + __dirname, + '../../testdata/src/' + suiteName + '.' + methodName + '.results.json' + ), + { + encoding: 'utf-8', + } + ) + ) + const actualResults = JSON.parse(JSON.stringify(queries[methodName](query))) + assert.deepStrictEqual(actualResults, expectedResults) + }) + } + } +}) + +type Queries = { + // eslint-disable-next-line @typescript-eslint/no-wrapper-object-types + [key: string]: (query: Query) => Object +} diff --git a/node_modules/@cucumber/query/src/helpers.ts b/node_modules/@cucumber/query/src/helpers.ts new file mode 100644 index 00000000..52c0f23c --- /dev/null +++ b/node_modules/@cucumber/query/src/helpers.ts @@ -0,0 +1,21 @@ +import { TestStepResultStatus } from '@cucumber/messages' + +export function statusOrdinal(status: TestStepResultStatus) { + return [ + TestStepResultStatus.UNKNOWN, + TestStepResultStatus.PASSED, + TestStepResultStatus.SKIPPED, + TestStepResultStatus.PENDING, + TestStepResultStatus.UNDEFINED, + TestStepResultStatus.AMBIGUOUS, + TestStepResultStatus.FAILED, + ].indexOf(status) +} + +export const assert = { + ok(target: unknown, message: string) { + if (!target) { + throw new Error(message) + } + }, +} diff --git a/node_modules/@cucumber/query/src/index.ts b/node_modules/@cucumber/query/src/index.ts new file mode 100644 index 00000000..20c403b7 --- /dev/null +++ b/node_modules/@cucumber/query/src/index.ts @@ -0,0 +1,4 @@ +import Query from './Query' +export * from './Lineage' + +export { Query } diff --git a/node_modules/@cucumber/query/tsconfig.base.json b/node_modules/@cucumber/query/tsconfig.base.json new file mode 100644 index 00000000..e7439e8d --- /dev/null +++ b/node_modules/@cucumber/query/tsconfig.base.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "declaration": true, + "target": "es2018", + "lib": ["es2019", "dom"], + "sourceMap": true, + "allowJs": false, + "jsx": "react", + "resolveJsonModule": true, + "module": "commonjs", + "esModuleInterop": true, + "noImplicitAny": true, + "moduleResolution": "node", + "outDir": "dist", + "downlevelIteration": true, + "skipLibCheck": true, + "strictNullChecks": false, + "experimentalDecorators": true + } +} diff --git a/node_modules/@cucumber/query/tsconfig.build.json b/node_modules/@cucumber/query/tsconfig.build.json new file mode 100644 index 00000000..bedb1374 --- /dev/null +++ b/node_modules/@cucumber/query/tsconfig.build.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "rootDir": ".", + "outDir": "dist", + "composite": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "inlineSources": true, + "target": "es6", + "module": "commonjs" + }, + "include": [ + "src" + ], + "exclude": [ + "src/**/*.spec.*" + ] +} diff --git a/node_modules/@cucumber/query/tsconfig.json b/node_modules/@cucumber/query/tsconfig.json new file mode 100644 index 00000000..1af726cd --- /dev/null +++ b/node_modules/@cucumber/query/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "baseUrl": ".", + "noEmit": true + }, + "ts-node": { + "files": true + } +} diff --git a/node_modules/@cucumber/tag-expressions/LICENSE b/node_modules/@cucumber/tag-expressions/LICENSE new file mode 100644 index 00000000..a5e1512d --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016 Cucumber Ltd and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/@cucumber/tag-expressions/README.md b/node_modules/@cucumber/tag-expressions/README.md new file mode 100644 index 00000000..214e807f --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/README.md @@ -0,0 +1,14 @@ +# Cucumber Tag Expressions for JavaScript + +[The docs are here](https://cucumber.io/docs/cucumber/api/#tag-expressions). + +## Usage + +```typescript +import { type Node, parse } from '@cucumber/tag-expressions' + +const expressionNode: Node = parse('@tagA and @tagB') + +expressionNode.evaluate(['@tagA', '@tagB']) // => true +expressionNode.evaluate(['@tagA', '@tagC']) // => false +``` \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/cjs/package.json b/node_modules/@cucumber/tag-expressions/dist/cjs/package.json new file mode 100644 index 00000000..b731bd61 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/cjs/package.json @@ -0,0 +1 @@ +{"type": "commonjs"} diff --git a/node_modules/@cucumber/tag-expressions/dist/cjs/src/index.d.ts b/node_modules/@cucumber/tag-expressions/dist/cjs/src/index.d.ts new file mode 100644 index 00000000..eac23c17 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/cjs/src/index.d.ts @@ -0,0 +1,15 @@ +/** + * Parses infix boolean expression (using Dijkstra's Shunting Yard algorithm) + * and builds a tree of expressions. The root node of the expression is returned. + * + * This expression can be evaluated by passing in an array of literals that resolve to true + */ +export declare function parse(infix: string): Node; +export interface Node { + evaluate(variables: string[]): boolean; +} +/** + * @deprecated Use the named export `parse` instead: `import { parse } from '@cucumber/tag-expressions'` + */ +export default parse; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/cjs/src/index.d.ts.map b/node_modules/@cucumber/tag-expressions/dist/cjs/src/index.d.ts.map new file mode 100644 index 00000000..c5ea3cc9 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/cjs/src/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAeA;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CA4FzC;AAqDD,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;CACvC;AA4ED;;GAEG;AACH,eAAe,KAAK,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/cjs/src/index.js b/node_modules/@cucumber/tag-expressions/dist/cjs/src/index.js new file mode 100644 index 00000000..bf9810ee --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/cjs/src/index.js @@ -0,0 +1,231 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parse = parse; +var OPERAND = 'operand'; +var OPERATOR = 'operator'; +var PREC = { + '(': -2, + ')': -1, + or: 0, + and: 1, + not: 2, +}; +var ASSOC = { + or: 'left', + and: 'left', + not: 'right', +}; +/** + * Parses infix boolean expression (using Dijkstra's Shunting Yard algorithm) + * and builds a tree of expressions. The root node of the expression is returned. + * + * This expression can be evaluated by passing in an array of literals that resolve to true + */ +function parse(infix) { + var tokens = tokenize(infix); + if (tokens.length === 0) { + return new True(); + } + var expressions = []; + var operators = []; + var expectedTokenType = OPERAND; + tokens.forEach(function (token) { + if (isUnary(token)) { + check(expectedTokenType, OPERAND); + operators.push(token); + expectedTokenType = OPERAND; + } + else if (isBinary(token)) { + check(expectedTokenType, OPERATOR); + while (operators.length > 0 && + isOp(peek(operators)) && + ((ASSOC[token] === 'left' && PREC[token] <= PREC[peek(operators)]) || + (ASSOC[token] === 'right' && PREC[token] < PREC[peek(operators)]))) { + pushExpr(operators.pop(), expressions); + } + operators.push(token); + expectedTokenType = OPERAND; + } + else if ('(' === token) { + check(expectedTokenType, OPERAND); + operators.push(token); + expectedTokenType = OPERAND; + } + else if (')' === token) { + check(expectedTokenType, OPERATOR); + while (operators.length > 0 && peek(operators) !== '(') { + pushExpr(operators.pop(), expressions); + } + if (operators.length === 0) { + throw new Error("Tag expression \"".concat(infix, "\" could not be parsed because of syntax error: Unmatched ).")); + } + if (peek(operators) === '(') { + operators.pop(); + } + expectedTokenType = OPERATOR; + } + else { + check(expectedTokenType, OPERAND); + pushExpr(token, expressions); + expectedTokenType = OPERATOR; + } + }); + while (operators.length > 0) { + if (peek(operators) === '(') { + throw new Error("Tag expression \"".concat(infix, "\" could not be parsed because of syntax error: Unmatched (.")); + } + pushExpr(operators.pop(), expressions); + } + return expressions.pop(); + function check(expectedTokenType, tokenType) { + if (expectedTokenType !== tokenType) { + throw new Error("Tag expression \"".concat(infix, "\" could not be parsed because of syntax error: Expected ").concat(expectedTokenType, ".")); + } + } + function pushExpr(token, stack) { + if (token === 'and') { + var rightAndExpr = popOperand(stack); + stack.push(new And(popOperand(stack), rightAndExpr)); + } + else if (token === 'or') { + var rightOrExpr = popOperand(stack); + stack.push(new Or(popOperand(stack), rightOrExpr)); + } + else if (token === 'not') { + stack.push(new Not(popOperand(stack))); + } + else { + stack.push(new Literal(token)); + } + } + function popOperand(stack) { + if (stack.length === 0) { + throw new Error("Tag expression \"".concat(infix, "\" could not be parsed because of syntax error: Expected operand.")); + } + return stack.pop(); + } +} +function tokenize(expr) { + var tokens = []; + var isEscaped = false; + var token = []; + for (var i = 0; i < expr.length; i++) { + var c = expr.charAt(i); + if (isEscaped) { + if (c === '(' || c === ')' || c === '\\' || /\s/.test(c)) { + token.push(c); + isEscaped = false; + } + else { + throw new Error("Tag expression \"".concat(expr, "\" could not be parsed because of syntax error: Illegal escape before \"").concat(c, "\".")); + } + } + else if (c === '\\') { + isEscaped = true; + } + else if (c === '(' || c === ')' || /\s/.test(c)) { + if (token.length > 0) { + tokens.push(token.join('')); + token = []; + } + if (!/\s/.test(c)) { + tokens.push(c); + } + } + else { + token.push(c); + } + } + if (token.length > 0) { + tokens.push(token.join('')); + } + return tokens; +} +function isUnary(token) { + return 'not' === token; +} +function isBinary(token) { + return 'or' === token || 'and' === token; +} +function isOp(token) { + return ASSOC[token] !== undefined; +} +function peek(stack) { + return stack[stack.length - 1]; +} +var Literal = /** @class */ (function () { + function Literal(value) { + this.value = value; + } + Literal.prototype.evaluate = function (variables) { + return variables.indexOf(this.value) !== -1; + }; + Literal.prototype.toString = function () { + return this.value + .replace(/\\/g, '\\\\') + .replace(/\(/g, '\\(') + .replace(/\)/g, '\\)') + .replace(/\s/g, '\\ '); + }; + return Literal; +}()); +var Or = /** @class */ (function () { + function Or(leftExpr, rightExpr) { + this.leftExpr = leftExpr; + this.rightExpr = rightExpr; + } + Or.prototype.evaluate = function (variables) { + return this.leftExpr.evaluate(variables) || this.rightExpr.evaluate(variables); + }; + Or.prototype.toString = function () { + return '( ' + this.leftExpr.toString() + ' or ' + this.rightExpr.toString() + ' )'; + }; + return Or; +}()); +var And = /** @class */ (function () { + function And(leftExpr, rightExpr) { + this.leftExpr = leftExpr; + this.rightExpr = rightExpr; + } + And.prototype.evaluate = function (variables) { + return this.leftExpr.evaluate(variables) && this.rightExpr.evaluate(variables); + }; + And.prototype.toString = function () { + return '( ' + this.leftExpr.toString() + ' and ' + this.rightExpr.toString() + ' )'; + }; + return And; +}()); +var Not = /** @class */ (function () { + function Not(expr) { + this.expr = expr; + } + Not.prototype.evaluate = function (variables) { + return !this.expr.evaluate(variables); + }; + Not.prototype.toString = function () { + if (this.expr instanceof And || this.expr instanceof Or) { + // -- HINT: Binary Operators already have already '( ... )'. + return 'not ' + this.expr.toString(); + } + // -- OTHERWISE: + return 'not ( ' + this.expr.toString() + ' )'; + }; + return Not; +}()); +var True = /** @class */ (function () { + function True() { + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + True.prototype.evaluate = function (variables) { + return true; + }; + True.prototype.toString = function () { + return ''; + }; + return True; +}()); +/** + * @deprecated Use the named export `parse` instead: `import { parse } from '@cucumber/tag-expressions'` + */ +exports.default = parse; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/cjs/src/index.js.map b/node_modules/@cucumber/tag-expressions/dist/cjs/src/index.js.map new file mode 100644 index 00000000..cd95c0a6 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/cjs/src/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/cjs/test/errors.test.d.ts b/node_modules/@cucumber/tag-expressions/dist/cjs/test/errors.test.d.ts new file mode 100644 index 00000000..428c8ce1 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/cjs/test/errors.test.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=errors.test.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/cjs/test/errors.test.d.ts.map b/node_modules/@cucumber/tag-expressions/dist/cjs/test/errors.test.d.ts.map new file mode 100644 index 00000000..78798ef5 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/cjs/test/errors.test.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"errors.test.d.ts","sourceRoot":"","sources":["../../../test/errors.test.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/cjs/test/errors.test.js b/node_modules/@cucumber/tag-expressions/dist/cjs/test/errors.test.js new file mode 100644 index 00000000..e992fd7e --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/cjs/test/errors.test.js @@ -0,0 +1,44 @@ +"use strict"; +var __values = (this && this.__values) || function(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var assert_1 = __importDefault(require("assert")); +var fs_1 = __importDefault(require("fs")); +var js_yaml_1 = __importDefault(require("js-yaml")); +var index_js_1 = __importDefault(require("../src/index.js")); +var testDataDir_js_1 = require("./testDataDir.js"); +var tests = js_yaml_1.default.load(fs_1.default.readFileSync("".concat(testDataDir_js_1.testDataDir, "/errors.yml"), 'utf-8')); +describe('Errors', function () { + var e_1, _a; + var _loop_1 = function (test_1) { + it("fails to parse \"".concat(test_1.expression, "\" with \"").concat(test_1.error, "\""), function () { + assert_1.default.throws(function () { return (0, index_js_1.default)(test_1.expression); }, { message: test_1.error }); + }); + }; + try { + for (var tests_1 = __values(tests), tests_1_1 = tests_1.next(); !tests_1_1.done; tests_1_1 = tests_1.next()) { + var test_1 = tests_1_1.value; + _loop_1(test_1); + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (tests_1_1 && !tests_1_1.done && (_a = tests_1.return)) _a.call(tests_1); + } + finally { if (e_1) throw e_1.error; } + } +}); +//# sourceMappingURL=errors.test.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/cjs/test/errors.test.js.map b/node_modules/@cucumber/tag-expressions/dist/cjs/test/errors.test.js.map new file mode 100644 index 00000000..c79fe9c7 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/cjs/test/errors.test.js.map @@ -0,0 +1 @@ +{"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../../test/errors.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAA2B;AAC3B,0CAAmB;AACnB,oDAA0B;AAE1B,6DAAmC;AACnC,mDAA8C;AAO9C,IAAM,KAAK,GAAG,iBAAI,CAAC,IAAI,CAAC,YAAE,CAAC,YAAY,CAAC,UAAG,4BAAW,gBAAa,EAAE,OAAO,CAAC,CAAgB,CAAA;AAE7F,QAAQ,CAAC,QAAQ,EAAE;;4BACN,MAAI;QACb,EAAE,CAAC,2BAAmB,MAAI,CAAC,UAAU,uBAAW,MAAI,CAAC,KAAK,OAAG,EAAE;YAC7D,gBAAM,CAAC,MAAM,CAAC,cAAM,OAAA,IAAA,kBAAK,EAAC,MAAI,CAAC,UAAU,CAAC,EAAtB,CAAsB,EAAE,EAAE,OAAO,EAAE,MAAI,CAAC,KAAK,EAAE,CAAC,CAAA;QACtE,CAAC,CAAC,CAAA;;;QAHJ,KAAmB,IAAA,UAAA,SAAA,KAAK,CAAA,4BAAA;YAAnB,IAAM,MAAI,kBAAA;oBAAJ,MAAI;SAId;;;;;;;;;AACH,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/cjs/test/evaluations.test.d.ts b/node_modules/@cucumber/tag-expressions/dist/cjs/test/evaluations.test.d.ts new file mode 100644 index 00000000..82af13c6 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/cjs/test/evaluations.test.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=evaluations.test.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/cjs/test/evaluations.test.d.ts.map b/node_modules/@cucumber/tag-expressions/dist/cjs/test/evaluations.test.d.ts.map new file mode 100644 index 00000000..46129a21 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/cjs/test/evaluations.test.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"evaluations.test.d.ts","sourceRoot":"","sources":["../../../test/evaluations.test.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/cjs/test/evaluations.test.js b/node_modules/@cucumber/tag-expressions/dist/cjs/test/evaluations.test.js new file mode 100644 index 00000000..03f0b6e0 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/cjs/test/evaluations.test.js @@ -0,0 +1,63 @@ +"use strict"; +var __values = (this && this.__values) || function(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var assert_1 = __importDefault(require("assert")); +var fs_1 = __importDefault(require("fs")); +var js_yaml_1 = __importDefault(require("js-yaml")); +var index_js_1 = __importDefault(require("../src/index.js")); +var testDataDir_js_1 = require("./testDataDir.js"); +var evaluationsTest = js_yaml_1.default.load(fs_1.default.readFileSync("".concat(testDataDir_js_1.testDataDir, "/evaluations.yml"), 'utf-8')); +describe('Evaluations', function () { + var e_1, _a; + var _loop_1 = function (evaluation) { + describe(evaluation.expression, function () { + var e_2, _a; + var _loop_2 = function (test_1) { + it("evaluates [".concat(test_1.variables.join(', '), "] to ").concat(test_1.result), function () { + var node = (0, index_js_1.default)(evaluation.expression); + assert_1.default.strictEqual(node.evaluate(test_1.variables), test_1.result); + }); + }; + try { + for (var _b = (e_2 = void 0, __values(evaluation.tests)), _c = _b.next(); !_c.done; _c = _b.next()) { + var test_1 = _c.value; + _loop_2(test_1); + } + } + catch (e_2_1) { e_2 = { error: e_2_1 }; } + finally { + try { + if (_c && !_c.done && (_a = _b.return)) _a.call(_b); + } + finally { if (e_2) throw e_2.error; } + } + }); + }; + try { + for (var evaluationsTest_1 = __values(evaluationsTest), evaluationsTest_1_1 = evaluationsTest_1.next(); !evaluationsTest_1_1.done; evaluationsTest_1_1 = evaluationsTest_1.next()) { + var evaluation = evaluationsTest_1_1.value; + _loop_1(evaluation); + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (evaluationsTest_1_1 && !evaluationsTest_1_1.done && (_a = evaluationsTest_1.return)) _a.call(evaluationsTest_1); + } + finally { if (e_1) throw e_1.error; } + } +}); +//# sourceMappingURL=evaluations.test.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/cjs/test/evaluations.test.js.map b/node_modules/@cucumber/tag-expressions/dist/cjs/test/evaluations.test.js.map new file mode 100644 index 00000000..d6563242 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/cjs/test/evaluations.test.js.map @@ -0,0 +1 @@ +{"version":3,"file":"evaluations.test.js","sourceRoot":"","sources":["../../../test/evaluations.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAA2B;AAC3B,0CAAmB;AACnB,oDAA0B;AAE1B,6DAAmC;AACnC,mDAA8C;AAU9C,IAAM,eAAe,GAAG,iBAAI,CAAC,IAAI,CAC/B,YAAE,CAAC,YAAY,CAAC,UAAG,4BAAW,qBAAkB,EAAE,OAAO,CAAC,CAC3C,CAAA;AAEjB,QAAQ,CAAC,aAAa,EAAE;;4BACX,UAAU;QACnB,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE;;oCACnB,MAAI;gBACb,EAAE,CAAC,qBAAc,MAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAQ,MAAI,CAAC,MAAM,CAAE,EAAE;oBAC/D,IAAM,IAAI,GAAG,IAAA,kBAAK,EAAC,UAAU,CAAC,UAAU,CAAC,CAAA;oBACzC,gBAAM,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAI,CAAC,SAAS,CAAC,EAAE,MAAI,CAAC,MAAM,CAAC,CAAA;gBAChE,CAAC,CAAC,CAAA;;;gBAJJ,KAAmB,IAAA,oBAAA,SAAA,UAAU,CAAC,KAAK,CAAA,CAAA,gBAAA;oBAA9B,IAAM,MAAI,WAAA;4BAAJ,MAAI;iBAKd;;;;;;;;;QACH,CAAC,CAAC,CAAA;;;QARJ,KAAyB,IAAA,oBAAA,SAAA,eAAe,CAAA,gDAAA;YAAnC,IAAM,UAAU,4BAAA;oBAAV,UAAU;SASpB;;;;;;;;;AACH,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/cjs/test/parsing.test.d.ts b/node_modules/@cucumber/tag-expressions/dist/cjs/test/parsing.test.d.ts new file mode 100644 index 00000000..c90cf427 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/cjs/test/parsing.test.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=parsing.test.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/cjs/test/parsing.test.d.ts.map b/node_modules/@cucumber/tag-expressions/dist/cjs/test/parsing.test.d.ts.map new file mode 100644 index 00000000..4b54406f --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/cjs/test/parsing.test.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"parsing.test.d.ts","sourceRoot":"","sources":["../../../test/parsing.test.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/cjs/test/parsing.test.js b/node_modules/@cucumber/tag-expressions/dist/cjs/test/parsing.test.js new file mode 100644 index 00000000..6b63b0c2 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/cjs/test/parsing.test.js @@ -0,0 +1,47 @@ +"use strict"; +var __values = (this && this.__values) || function(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var assert_1 = __importDefault(require("assert")); +var fs_1 = __importDefault(require("fs")); +var js_yaml_1 = __importDefault(require("js-yaml")); +var index_js_1 = __importDefault(require("../src/index.js")); +var testDataDir_js_1 = require("./testDataDir.js"); +var tests = js_yaml_1.default.load(fs_1.default.readFileSync("".concat(testDataDir_js_1.testDataDir, "/parsing.yml"), 'utf-8')); +describe('Parsing', function () { + var e_1, _a; + var _loop_1 = function (test_1) { + it("parses \"".concat(test_1.expression, "\" into \"").concat(test_1.formatted, "\""), function () { + var expression = (0, index_js_1.default)(test_1.expression); + assert_1.default.strictEqual(expression.toString(), test_1.formatted); + var expressionAgain = (0, index_js_1.default)(expression.toString()); + assert_1.default.strictEqual(expressionAgain.toString(), test_1.formatted); + }); + }; + try { + for (var tests_1 = __values(tests), tests_1_1 = tests_1.next(); !tests_1_1.done; tests_1_1 = tests_1.next()) { + var test_1 = tests_1_1.value; + _loop_1(test_1); + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (tests_1_1 && !tests_1_1.done && (_a = tests_1.return)) _a.call(tests_1); + } + finally { if (e_1) throw e_1.error; } + } +}); +//# sourceMappingURL=parsing.test.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/cjs/test/parsing.test.js.map b/node_modules/@cucumber/tag-expressions/dist/cjs/test/parsing.test.js.map new file mode 100644 index 00000000..3b3d989f --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/cjs/test/parsing.test.js.map @@ -0,0 +1 @@ +{"version":3,"file":"parsing.test.js","sourceRoot":"","sources":["../../../test/parsing.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAA2B;AAC3B,0CAAmB;AACnB,oDAA0B;AAE1B,6DAAmC;AACnC,mDAA8C;AAO9C,IAAM,KAAK,GAAG,iBAAI,CAAC,IAAI,CAAC,YAAE,CAAC,YAAY,CAAC,UAAG,4BAAW,iBAAc,EAAE,OAAO,CAAC,CAAkB,CAAA;AAEhG,QAAQ,CAAC,SAAS,EAAE;;4BACP,MAAI;QACb,EAAE,CAAC,mBAAW,MAAI,CAAC,UAAU,uBAAW,MAAI,CAAC,SAAS,OAAG,EAAE;YACzD,IAAM,UAAU,GAAG,IAAA,kBAAK,EAAC,MAAI,CAAC,UAAU,CAAC,CAAA;YACzC,gBAAM,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,MAAI,CAAC,SAAS,CAAC,CAAA;YAEzD,IAAM,eAAe,GAAG,IAAA,kBAAK,EAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAA;YACpD,gBAAM,CAAC,WAAW,CAAC,eAAe,CAAC,QAAQ,EAAE,EAAE,MAAI,CAAC,SAAS,CAAC,CAAA;QAChE,CAAC,CAAC,CAAA;;;QAPJ,KAAmB,IAAA,UAAA,SAAA,KAAK,CAAA,4BAAA;YAAnB,IAAM,MAAI,kBAAA;oBAAJ,MAAI;SAQd;;;;;;;;;AACH,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/cjs/test/testDataDir.d.ts b/node_modules/@cucumber/tag-expressions/dist/cjs/test/testDataDir.d.ts new file mode 100644 index 00000000..d1ff6beb --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/cjs/test/testDataDir.d.ts @@ -0,0 +1,2 @@ +export declare const testDataDir: string; +//# sourceMappingURL=testDataDir.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/cjs/test/testDataDir.d.ts.map b/node_modules/@cucumber/tag-expressions/dist/cjs/test/testDataDir.d.ts.map new file mode 100644 index 00000000..07c67596 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/cjs/test/testDataDir.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"testDataDir.d.ts","sourceRoot":"","sources":["../../../test/testDataDir.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,QAA6D,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/cjs/test/testDataDir.js b/node_modules/@cucumber/tag-expressions/dist/cjs/test/testDataDir.js new file mode 100644 index 00000000..295c2edf --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/cjs/test/testDataDir.js @@ -0,0 +1,5 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.testDataDir = void 0; +exports.testDataDir = process.env.TAG_EXPRESSIONS_TEST_DATA_DIR || '../testdata'; +//# sourceMappingURL=testDataDir.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/cjs/test/testDataDir.js.map b/node_modules/@cucumber/tag-expressions/dist/cjs/test/testDataDir.js.map new file mode 100644 index 00000000..442960bf --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/cjs/test/testDataDir.js.map @@ -0,0 +1 @@ +{"version":3,"file":"testDataDir.js","sourceRoot":"","sources":["../../../test/testDataDir.ts"],"names":[],"mappings":";;;AAAa,QAAA,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,aAAa,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/cjs/tsconfig.build-cjs.tsbuildinfo b/node_modules/@cucumber/tag-expressions/dist/cjs/tsconfig.build-cjs.tsbuildinfo new file mode 100644 index 00000000..b33198ad --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/cjs/tsconfig.build-cjs.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../src/index.ts","../../node_modules/@types/js-yaml/index.d.ts","../../test/testDataDir.ts","../../test/errors.test.ts","../../test/evaluations.test.ts","../../test/parsing.test.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/json5/index.d.ts","../../node_modules/@types/mocha/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/@types/node/web-globals/events.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/inspector.generated.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts"],"fileIdsList":[[62,110,127,128],[62,107,108,110,127,128],[62,109,110,127,128],[110,127,128],[62,110,115,127,128,145],[62,110,111,116,121,127,128,130,142,153],[62,110,111,112,121,127,128,130],[57,58,59,62,110,127,128],[62,110,113,127,128,154],[62,110,114,115,122,127,128,131],[62,110,115,127,128,142,150],[62,110,116,118,121,127,128,130],[62,109,110,117,127,128],[62,110,118,119,127,128],[62,110,120,121,127,128],[62,109,110,121,127,128],[62,110,121,122,123,127,128,142,153],[62,110,121,122,123,127,128,137,142,145],[62,103,110,118,121,124,127,128,130,142,153],[62,110,121,122,124,125,127,128,130,142,150,153],[62,110,124,126,127,128,142,150,153],[60,61,62,63,64,65,66,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159],[62,110,121,127,128],[62,110,127,128,129,153],[62,110,118,121,127,128,130,142],[62,110,127,128,131],[62,110,127,128,132],[62,109,110,127,128,133],[62,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159],[62,110,127,128,135],[62,110,127,128,136],[62,110,121,127,128,137,138],[62,110,127,128,137,139,154,156],[62,110,122,127,128],[62,110,121,127,128,142,143,145],[62,110,127,128,144,145],[62,110,127,128,142,143],[62,110,127,128,145],[62,110,127,128,146],[62,107,110,127,128,142,147,153],[62,110,121,127,128,148,149],[62,110,127,128,148,149],[62,110,115,127,128,130,142,150],[62,110,127,128,151],[62,110,127,128,130,152],[62,110,124,127,128,136,153],[62,110,115,127,128,154],[62,110,127,128,142,155],[62,110,127,128,129,156],[62,110,127,128,157],[62,103,110,127,128],[62,103,110,121,123,127,128,133,142,145,153,155,156,158],[62,110,127,128,142,159],[62,75,79,110,127,128,153],[62,75,110,127,128,142,153],[62,70,110,127,128],[62,72,75,110,127,128,150,153],[62,110,127,128,130,150],[62,110,127,128,160],[62,70,110,127,128,160],[62,72,75,110,127,128,130,153],[62,67,68,71,74,110,121,127,128,142,153],[62,75,82,110,127,128],[62,67,73,110,127,128],[62,75,96,97,110,127,128],[62,71,75,110,127,128,145,153,160],[62,96,110,127,128,160],[62,69,70,110,127,128,160],[62,75,110,127,128],[62,69,70,71,72,73,74,75,76,77,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,97,98,99,100,101,102,110,127,128],[62,75,90,110,127,128],[62,75,82,83,110,127,128],[62,73,75,83,84,110,127,128],[62,74,110,127,128],[62,67,70,75,110,127,128],[62,75,79,83,84,110,127,128],[62,79,110,127,128],[62,73,75,78,110,127,128,153],[62,67,72,75,82,110,127,128],[62,110,127,128,142],[62,70,75,96,110,127,128,158,160],[47,48,49,62,107,110,122,127,128]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"f848f045ce0e49ffe9f383cd575ad14e56b6a1a41ac1610e97dd764061166869","signature":"ff7ffac8d9efc0c3c21083324e96d40aae6debeff7599af97ea19510391236bc"},{"version":"5b89c37ff5dfea00195f8ea5e6fc8e086be68613297fc8152c08900a1d1fdb83","impliedFormat":1},{"version":"457a5ffb6b3d7d2bce4ca038b56ff812e4b5a7b09c41cd7e8e59611025733e90","signature":"bd6640feffbb44ade7ce92bd1353f4ca41107af7bc1a05b290e1344854e60fcf"},{"version":"c747a6506f143144c533bc8fc04c1af5aaf2b8cd7d764d7683e2338586245010","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"25b7ee0f11180bf75f2f287aadb374930ac6ad86fe179019c0025f2571950e80","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"969102143aef0d525b5afd6f752f39f43ac138a338e320edcc75c2f28e983a78","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"785b9d575b49124ce01b46f5b9402157c7611e6532effa562ac6aebec0074dfc","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","impliedFormat":1},{"version":"29f72ec1289ae3aeda78bf14b38086d3d803262ac13904b400422941a26a3636","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"f949f7f6c7802a338039cfc2156d1fe285cdd1e092c64437ebe15ae8edc854e0","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"83e63d6ccf8ec004a3bb6d58b9bb0104f60e002754b1e968024b320730cc5311","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d2bc7425ef40526650d6db7e072c1ff4a51101c3ac2cc4b666623b19496a6e27","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"f27524f4bef4b6519c604bdb23bf4465bddcccbf3f003abb901acbd0d7404d99","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"6b039f55681caaf111d5eb84d292b9bee9e0131d0db1ad0871eef0964f533c73","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c8d3e5a18ba35629954e48c4cc8f11dc88224650067a172685c736b27a34a4dc","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"0dba70b3fb0dcd713fda33c2df64fa6751fff6460e536971cee917260fb17882","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"9f663c2f91127ef7024e8ca4b3b4383ff2770e5f826696005de382282794b127","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1}],"root":[47,[49,52]],"options":{"allowJs":false,"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"declarationMap":true,"downlevelIteration":true,"esModuleInterop":true,"experimentalDecorators":true,"jsx":2,"module":1,"noImplicitAny":true,"outDir":"./","rootDir":"../..","skipLibCheck":true,"sourceMap":true,"strictNullChecks":true,"target":1},"referencedMap":[[53,1],[48,1],[54,1],[55,1],[56,1],[107,2],[108,2],[109,3],[62,4],[110,5],[111,6],[112,7],[57,1],[60,8],[58,1],[59,1],[113,9],[114,10],[115,11],[116,12],[117,13],[118,14],[119,14],[120,15],[121,16],[122,17],[123,18],[63,1],[61,1],[124,19],[125,20],[126,21],[160,22],[127,23],[128,1],[129,24],[130,25],[131,26],[132,27],[133,28],[134,29],[135,30],[136,31],[137,32],[138,32],[139,33],[140,1],[141,34],[142,35],[144,36],[143,37],[145,38],[146,39],[147,40],[148,41],[149,42],[150,43],[151,44],[152,45],[153,46],[154,47],[155,48],[156,49],[157,50],[64,1],[65,1],[66,1],[104,51],[105,1],[106,1],[158,52],[159,53],[45,1],[46,1],[8,1],[10,1],[9,1],[2,1],[11,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[18,1],[3,1],[19,1],[20,1],[4,1],[21,1],[25,1],[22,1],[23,1],[24,1],[26,1],[27,1],[28,1],[5,1],[29,1],[30,1],[31,1],[32,1],[6,1],[36,1],[33,1],[34,1],[35,1],[37,1],[7,1],[38,1],[43,1],[44,1],[39,1],[40,1],[41,1],[42,1],[1,1],[82,54],[92,55],[81,54],[102,56],[73,57],[72,58],[101,59],[95,60],[100,61],[75,62],[89,63],[74,64],[98,65],[70,66],[69,59],[99,67],[71,68],[76,69],[77,1],[80,69],[67,1],[103,70],[93,71],[84,72],[85,73],[87,74],[83,75],[86,76],[96,59],[78,77],[79,78],[88,79],[68,80],[91,71],[90,69],[94,1],[97,81],[47,1],[50,82],[51,82],[52,82],[49,1]],"latestChangedDtsFile":"./test/parsing.test.d.ts","version":"5.9.3"} \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/esm/src/index.d.ts b/node_modules/@cucumber/tag-expressions/dist/esm/src/index.d.ts new file mode 100644 index 00000000..eac23c17 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/esm/src/index.d.ts @@ -0,0 +1,15 @@ +/** + * Parses infix boolean expression (using Dijkstra's Shunting Yard algorithm) + * and builds a tree of expressions. The root node of the expression is returned. + * + * This expression can be evaluated by passing in an array of literals that resolve to true + */ +export declare function parse(infix: string): Node; +export interface Node { + evaluate(variables: string[]): boolean; +} +/** + * @deprecated Use the named export `parse` instead: `import { parse } from '@cucumber/tag-expressions'` + */ +export default parse; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/esm/src/index.d.ts.map b/node_modules/@cucumber/tag-expressions/dist/esm/src/index.d.ts.map new file mode 100644 index 00000000..c5ea3cc9 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/esm/src/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAeA;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CA4FzC;AAqDD,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;CACvC;AA4ED;;GAEG;AACH,eAAe,KAAK,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/esm/src/index.js b/node_modules/@cucumber/tag-expressions/dist/esm/src/index.js new file mode 100644 index 00000000..26f52bb2 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/esm/src/index.js @@ -0,0 +1,221 @@ +const OPERAND = 'operand'; +const OPERATOR = 'operator'; +const PREC = { + '(': -2, + ')': -1, + or: 0, + and: 1, + not: 2, +}; +const ASSOC = { + or: 'left', + and: 'left', + not: 'right', +}; +/** + * Parses infix boolean expression (using Dijkstra's Shunting Yard algorithm) + * and builds a tree of expressions. The root node of the expression is returned. + * + * This expression can be evaluated by passing in an array of literals that resolve to true + */ +export function parse(infix) { + const tokens = tokenize(infix); + if (tokens.length === 0) { + return new True(); + } + const expressions = []; + const operators = []; + let expectedTokenType = OPERAND; + tokens.forEach(function (token) { + if (isUnary(token)) { + check(expectedTokenType, OPERAND); + operators.push(token); + expectedTokenType = OPERAND; + } + else if (isBinary(token)) { + check(expectedTokenType, OPERATOR); + while (operators.length > 0 && + isOp(peek(operators)) && + ((ASSOC[token] === 'left' && PREC[token] <= PREC[peek(operators)]) || + (ASSOC[token] === 'right' && PREC[token] < PREC[peek(operators)]))) { + pushExpr(operators.pop(), expressions); + } + operators.push(token); + expectedTokenType = OPERAND; + } + else if ('(' === token) { + check(expectedTokenType, OPERAND); + operators.push(token); + expectedTokenType = OPERAND; + } + else if (')' === token) { + check(expectedTokenType, OPERATOR); + while (operators.length > 0 && peek(operators) !== '(') { + pushExpr(operators.pop(), expressions); + } + if (operators.length === 0) { + throw new Error(`Tag expression "${infix}" could not be parsed because of syntax error: Unmatched ).`); + } + if (peek(operators) === '(') { + operators.pop(); + } + expectedTokenType = OPERATOR; + } + else { + check(expectedTokenType, OPERAND); + pushExpr(token, expressions); + expectedTokenType = OPERATOR; + } + }); + while (operators.length > 0) { + if (peek(operators) === '(') { + throw new Error(`Tag expression "${infix}" could not be parsed because of syntax error: Unmatched (.`); + } + pushExpr(operators.pop(), expressions); + } + return expressions.pop(); + function check(expectedTokenType, tokenType) { + if (expectedTokenType !== tokenType) { + throw new Error(`Tag expression "${infix}" could not be parsed because of syntax error: Expected ${expectedTokenType}.`); + } + } + function pushExpr(token, stack) { + if (token === 'and') { + const rightAndExpr = popOperand(stack); + stack.push(new And(popOperand(stack), rightAndExpr)); + } + else if (token === 'or') { + const rightOrExpr = popOperand(stack); + stack.push(new Or(popOperand(stack), rightOrExpr)); + } + else if (token === 'not') { + stack.push(new Not(popOperand(stack))); + } + else { + stack.push(new Literal(token)); + } + } + function popOperand(stack) { + if (stack.length === 0) { + throw new Error(`Tag expression "${infix}" could not be parsed because of syntax error: Expected operand.`); + } + return stack.pop(); + } +} +function tokenize(expr) { + const tokens = []; + let isEscaped = false; + let token = []; + for (let i = 0; i < expr.length; i++) { + const c = expr.charAt(i); + if (isEscaped) { + if (c === '(' || c === ')' || c === '\\' || /\s/.test(c)) { + token.push(c); + isEscaped = false; + } + else { + throw new Error(`Tag expression "${expr}" could not be parsed because of syntax error: Illegal escape before "${c}".`); + } + } + else if (c === '\\') { + isEscaped = true; + } + else if (c === '(' || c === ')' || /\s/.test(c)) { + if (token.length > 0) { + tokens.push(token.join('')); + token = []; + } + if (!/\s/.test(c)) { + tokens.push(c); + } + } + else { + token.push(c); + } + } + if (token.length > 0) { + tokens.push(token.join('')); + } + return tokens; +} +function isUnary(token) { + return 'not' === token; +} +function isBinary(token) { + return 'or' === token || 'and' === token; +} +function isOp(token) { + return ASSOC[token] !== undefined; +} +function peek(stack) { + return stack[stack.length - 1]; +} +class Literal { + constructor(value) { + this.value = value; + } + evaluate(variables) { + return variables.indexOf(this.value) !== -1; + } + toString() { + return this.value + .replace(/\\/g, '\\\\') + .replace(/\(/g, '\\(') + .replace(/\)/g, '\\)') + .replace(/\s/g, '\\ '); + } +} +class Or { + constructor(leftExpr, rightExpr) { + this.leftExpr = leftExpr; + this.rightExpr = rightExpr; + } + evaluate(variables) { + return this.leftExpr.evaluate(variables) || this.rightExpr.evaluate(variables); + } + toString() { + return '( ' + this.leftExpr.toString() + ' or ' + this.rightExpr.toString() + ' )'; + } +} +class And { + constructor(leftExpr, rightExpr) { + this.leftExpr = leftExpr; + this.rightExpr = rightExpr; + } + evaluate(variables) { + return this.leftExpr.evaluate(variables) && this.rightExpr.evaluate(variables); + } + toString() { + return '( ' + this.leftExpr.toString() + ' and ' + this.rightExpr.toString() + ' )'; + } +} +class Not { + constructor(expr) { + this.expr = expr; + } + evaluate(variables) { + return !this.expr.evaluate(variables); + } + toString() { + if (this.expr instanceof And || this.expr instanceof Or) { + // -- HINT: Binary Operators already have already '( ... )'. + return 'not ' + this.expr.toString(); + } + // -- OTHERWISE: + return 'not ( ' + this.expr.toString() + ' )'; + } +} +class True { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + evaluate(variables) { + return true; + } + toString() { + return ''; + } +} +/** + * @deprecated Use the named export `parse` instead: `import { parse } from '@cucumber/tag-expressions'` + */ +export default parse; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/esm/src/index.js.map b/node_modules/@cucumber/tag-expressions/dist/esm/src/index.js.map new file mode 100644 index 00000000..c15e21a2 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/esm/src/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/esm/test/errors.test.d.ts b/node_modules/@cucumber/tag-expressions/dist/esm/test/errors.test.d.ts new file mode 100644 index 00000000..428c8ce1 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/esm/test/errors.test.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=errors.test.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/esm/test/errors.test.d.ts.map b/node_modules/@cucumber/tag-expressions/dist/esm/test/errors.test.d.ts.map new file mode 100644 index 00000000..78798ef5 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/esm/test/errors.test.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"errors.test.d.ts","sourceRoot":"","sources":["../../../test/errors.test.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/esm/test/errors.test.js b/node_modules/@cucumber/tag-expressions/dist/esm/test/errors.test.js new file mode 100644 index 00000000..a18ff955 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/esm/test/errors.test.js @@ -0,0 +1,14 @@ +import assert from 'assert'; +import fs from 'fs'; +import yaml from 'js-yaml'; +import parse from '../src/index.js'; +import { testDataDir } from './testDataDir.js'; +const tests = yaml.load(fs.readFileSync(`${testDataDir}/errors.yml`, 'utf-8')); +describe('Errors', () => { + for (const test of tests) { + it(`fails to parse "${test.expression}" with "${test.error}"`, () => { + assert.throws(() => parse(test.expression), { message: test.error }); + }); + } +}); +//# sourceMappingURL=errors.test.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/esm/test/errors.test.js.map b/node_modules/@cucumber/tag-expressions/dist/esm/test/errors.test.js.map new file mode 100644 index 00000000..17297b44 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/esm/test/errors.test.js.map @@ -0,0 +1 @@ +{"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../../test/errors.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,IAAI,MAAM,SAAS,CAAA;AAE1B,OAAO,KAAK,MAAM,iBAAiB,CAAA;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAO9C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,WAAW,aAAa,EAAE,OAAO,CAAC,CAAgB,CAAA;AAE7F,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,EAAE,CAAC,mBAAmB,IAAI,CAAC,UAAU,WAAW,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,EAAE;YAClE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;QACtE,CAAC,CAAC,CAAA;IACJ,CAAC;AACH,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/esm/test/evaluations.test.d.ts b/node_modules/@cucumber/tag-expressions/dist/esm/test/evaluations.test.d.ts new file mode 100644 index 00000000..82af13c6 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/esm/test/evaluations.test.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=evaluations.test.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/esm/test/evaluations.test.d.ts.map b/node_modules/@cucumber/tag-expressions/dist/esm/test/evaluations.test.d.ts.map new file mode 100644 index 00000000..46129a21 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/esm/test/evaluations.test.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"evaluations.test.d.ts","sourceRoot":"","sources":["../../../test/evaluations.test.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/esm/test/evaluations.test.js b/node_modules/@cucumber/tag-expressions/dist/esm/test/evaluations.test.js new file mode 100644 index 00000000..e69fc037 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/esm/test/evaluations.test.js @@ -0,0 +1,19 @@ +import assert from 'assert'; +import fs from 'fs'; +import yaml from 'js-yaml'; +import parse from '../src/index.js'; +import { testDataDir } from './testDataDir.js'; +const evaluationsTest = yaml.load(fs.readFileSync(`${testDataDir}/evaluations.yml`, 'utf-8')); +describe('Evaluations', () => { + for (const evaluation of evaluationsTest) { + describe(evaluation.expression, () => { + for (const test of evaluation.tests) { + it(`evaluates [${test.variables.join(', ')}] to ${test.result}`, () => { + const node = parse(evaluation.expression); + assert.strictEqual(node.evaluate(test.variables), test.result); + }); + } + }); + } +}); +//# sourceMappingURL=evaluations.test.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/esm/test/evaluations.test.js.map b/node_modules/@cucumber/tag-expressions/dist/esm/test/evaluations.test.js.map new file mode 100644 index 00000000..c35609ad --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/esm/test/evaluations.test.js.map @@ -0,0 +1 @@ +{"version":3,"file":"evaluations.test.js","sourceRoot":"","sources":["../../../test/evaluations.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,IAAI,MAAM,SAAS,CAAA;AAE1B,OAAO,KAAK,MAAM,iBAAiB,CAAA;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAU9C,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAC/B,EAAE,CAAC,YAAY,CAAC,GAAG,WAAW,kBAAkB,EAAE,OAAO,CAAC,CAC3C,CAAA;AAEjB,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,KAAK,MAAM,UAAU,IAAI,eAAe,EAAE,CAAC;QACzC,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE,GAAG,EAAE;YACnC,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;gBACpC,EAAE,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE;oBACpE,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;oBACzC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;gBAChE,CAAC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;AACH,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/esm/test/parsing.test.d.ts b/node_modules/@cucumber/tag-expressions/dist/esm/test/parsing.test.d.ts new file mode 100644 index 00000000..c90cf427 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/esm/test/parsing.test.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=parsing.test.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/esm/test/parsing.test.d.ts.map b/node_modules/@cucumber/tag-expressions/dist/esm/test/parsing.test.d.ts.map new file mode 100644 index 00000000..4b54406f --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/esm/test/parsing.test.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"parsing.test.d.ts","sourceRoot":"","sources":["../../../test/parsing.test.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/esm/test/parsing.test.js b/node_modules/@cucumber/tag-expressions/dist/esm/test/parsing.test.js new file mode 100644 index 00000000..97222a57 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/esm/test/parsing.test.js @@ -0,0 +1,17 @@ +import assert from 'assert'; +import fs from 'fs'; +import yaml from 'js-yaml'; +import parse from '../src/index.js'; +import { testDataDir } from './testDataDir.js'; +const tests = yaml.load(fs.readFileSync(`${testDataDir}/parsing.yml`, 'utf-8')); +describe('Parsing', () => { + for (const test of tests) { + it(`parses "${test.expression}" into "${test.formatted}"`, () => { + const expression = parse(test.expression); + assert.strictEqual(expression.toString(), test.formatted); + const expressionAgain = parse(expression.toString()); + assert.strictEqual(expressionAgain.toString(), test.formatted); + }); + } +}); +//# sourceMappingURL=parsing.test.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/esm/test/parsing.test.js.map b/node_modules/@cucumber/tag-expressions/dist/esm/test/parsing.test.js.map new file mode 100644 index 00000000..73e66167 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/esm/test/parsing.test.js.map @@ -0,0 +1 @@ +{"version":3,"file":"parsing.test.js","sourceRoot":"","sources":["../../../test/parsing.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,IAAI,MAAM,SAAS,CAAA;AAE1B,OAAO,KAAK,MAAM,iBAAiB,CAAA;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAO9C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,WAAW,cAAc,EAAE,OAAO,CAAC,CAAkB,CAAA;AAEhG,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,EAAE,CAAC,WAAW,IAAI,CAAC,UAAU,WAAW,IAAI,CAAC,SAAS,GAAG,EAAE,GAAG,EAAE;YAC9D,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YACzC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;YAEzD,MAAM,eAAe,GAAG,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAA;YACpD,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;QAChE,CAAC,CAAC,CAAA;IACJ,CAAC;AACH,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/esm/test/testDataDir.d.ts b/node_modules/@cucumber/tag-expressions/dist/esm/test/testDataDir.d.ts new file mode 100644 index 00000000..d1ff6beb --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/esm/test/testDataDir.d.ts @@ -0,0 +1,2 @@ +export declare const testDataDir: string; +//# sourceMappingURL=testDataDir.d.ts.map \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/esm/test/testDataDir.d.ts.map b/node_modules/@cucumber/tag-expressions/dist/esm/test/testDataDir.d.ts.map new file mode 100644 index 00000000..07c67596 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/esm/test/testDataDir.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"testDataDir.d.ts","sourceRoot":"","sources":["../../../test/testDataDir.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,QAA6D,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/esm/test/testDataDir.js b/node_modules/@cucumber/tag-expressions/dist/esm/test/testDataDir.js new file mode 100644 index 00000000..541bc820 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/esm/test/testDataDir.js @@ -0,0 +1,2 @@ +export const testDataDir = process.env.TAG_EXPRESSIONS_TEST_DATA_DIR || '../testdata'; +//# sourceMappingURL=testDataDir.js.map \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/esm/test/testDataDir.js.map b/node_modules/@cucumber/tag-expressions/dist/esm/test/testDataDir.js.map new file mode 100644 index 00000000..c6d72131 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/esm/test/testDataDir.js.map @@ -0,0 +1 @@ +{"version":3,"file":"testDataDir.js","sourceRoot":"","sources":["../../../test/testDataDir.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,aAAa,CAAA"} \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/dist/esm/tsconfig.build-esm.tsbuildinfo b/node_modules/@cucumber/tag-expressions/dist/esm/tsconfig.build-esm.tsbuildinfo new file mode 100644 index 00000000..184bb4e8 --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/dist/esm/tsconfig.build-esm.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../src/index.ts","../../node_modules/@types/js-yaml/index.d.ts","../../test/testDataDir.ts","../../test/errors.test.ts","../../test/evaluations.test.ts","../../test/parsing.test.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/json5/index.d.ts","../../node_modules/@types/mocha/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/@types/node/web-globals/events.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/inspector.generated.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts"],"fileIdsList":[[61,109,126,127],[61,106,107,109,126,127],[61,108,109,126,127],[109,126,127],[61,109,114,126,127,144],[61,109,110,115,120,126,127,129,141,152],[61,109,110,111,120,126,127,129],[56,57,58,61,109,126,127],[61,109,112,126,127,153],[61,109,113,114,121,126,127,130],[61,109,114,126,127,141,149],[61,109,115,117,120,126,127,129],[61,108,109,116,126,127],[61,109,117,118,126,127],[61,109,119,120,126,127],[61,108,109,120,126,127],[61,109,120,121,122,126,127,141,152],[61,109,120,121,122,126,127,136,141,144],[61,102,109,117,120,123,126,127,129,141,152],[61,109,120,121,123,124,126,127,129,141,149,152],[61,109,123,125,126,127,141,149,152],[59,60,61,62,63,64,65,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158],[61,109,120,126,127],[61,109,126,127,128,152],[61,109,117,120,126,127,129,141],[61,109,126,127,130],[61,109,126,127,131],[61,108,109,126,127,132],[61,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158],[61,109,126,127,134],[61,109,126,127,135],[61,109,120,126,127,136,137],[61,109,126,127,136,138,153,155],[61,109,121,126,127],[61,109,120,126,127,141,142,144],[61,109,126,127,143,144],[61,109,126,127,141,142],[61,109,126,127,144],[61,109,126,127,145],[61,106,109,126,127,141,146,152],[61,109,120,126,127,147,148],[61,109,126,127,147,148],[61,109,114,126,127,129,141,149],[61,109,126,127,150],[61,109,126,127,129,151],[61,109,123,126,127,135,152],[61,109,114,126,127,153],[61,109,126,127,141,154],[61,109,126,127,128,155],[61,109,126,127,156],[61,102,109,126,127],[61,102,109,120,122,126,127,132,141,144,152,154,155,157],[61,109,126,127,141,158],[61,74,78,109,126,127,152],[61,74,109,126,127,141,152],[61,69,109,126,127],[61,71,74,109,126,127,149,152],[61,109,126,127,129,149],[61,109,126,127,159],[61,69,109,126,127,159],[61,71,74,109,126,127,129,152],[61,66,67,70,73,109,120,126,127,141,152],[61,74,81,109,126,127],[61,66,72,109,126,127],[61,74,95,96,109,126,127],[61,70,74,109,126,127,144,152,159],[61,95,109,126,127,159],[61,68,69,109,126,127,159],[61,74,109,126,127],[61,68,69,70,71,72,73,74,75,76,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,96,97,98,99,100,101,109,126,127],[61,74,89,109,126,127],[61,74,81,82,109,126,127],[61,72,74,82,83,109,126,127],[61,73,109,126,127],[61,66,69,74,109,126,127],[61,74,78,82,83,109,126,127],[61,78,109,126,127],[61,72,74,77,109,126,127,152],[61,66,71,74,81,109,126,127],[61,109,126,127,141],[61,69,74,95,109,126,127,157,159],[46,47,48,61,106,109,121,126,127]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"f848f045ce0e49ffe9f383cd575ad14e56b6a1a41ac1610e97dd764061166869","signature":"ff7ffac8d9efc0c3c21083324e96d40aae6debeff7599af97ea19510391236bc"},{"version":"5b89c37ff5dfea00195f8ea5e6fc8e086be68613297fc8152c08900a1d1fdb83","impliedFormat":1},{"version":"457a5ffb6b3d7d2bce4ca038b56ff812e4b5a7b09c41cd7e8e59611025733e90","signature":"bd6640feffbb44ade7ce92bd1353f4ca41107af7bc1a05b290e1344854e60fcf"},{"version":"c747a6506f143144c533bc8fc04c1af5aaf2b8cd7d764d7683e2338586245010","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"25b7ee0f11180bf75f2f287aadb374930ac6ad86fe179019c0025f2571950e80","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"969102143aef0d525b5afd6f752f39f43ac138a338e320edcc75c2f28e983a78","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"785b9d575b49124ce01b46f5b9402157c7611e6532effa562ac6aebec0074dfc","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","impliedFormat":1},{"version":"29f72ec1289ae3aeda78bf14b38086d3d803262ac13904b400422941a26a3636","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"f949f7f6c7802a338039cfc2156d1fe285cdd1e092c64437ebe15ae8edc854e0","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"83e63d6ccf8ec004a3bb6d58b9bb0104f60e002754b1e968024b320730cc5311","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d2bc7425ef40526650d6db7e072c1ff4a51101c3ac2cc4b666623b19496a6e27","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"f27524f4bef4b6519c604bdb23bf4465bddcccbf3f003abb901acbd0d7404d99","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"6b039f55681caaf111d5eb84d292b9bee9e0131d0db1ad0871eef0964f533c73","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c8d3e5a18ba35629954e48c4cc8f11dc88224650067a172685c736b27a34a4dc","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"0dba70b3fb0dcd713fda33c2df64fa6751fff6460e536971cee917260fb17882","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"9f663c2f91127ef7024e8ca4b3b4383ff2770e5f826696005de382282794b127","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1}],"root":[46,[48,51]],"options":{"allowJs":false,"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"declarationMap":true,"downlevelIteration":true,"esModuleInterop":true,"experimentalDecorators":true,"jsx":2,"module":5,"noImplicitAny":true,"outDir":"./","rootDir":"../..","skipLibCheck":true,"sourceMap":true,"strictNullChecks":true,"target":2},"referencedMap":[[52,1],[47,1],[53,1],[54,1],[55,1],[106,2],[107,2],[108,3],[61,4],[109,5],[110,6],[111,7],[56,1],[59,8],[57,1],[58,1],[112,9],[113,10],[114,11],[115,12],[116,13],[117,14],[118,14],[119,15],[120,16],[121,17],[122,18],[62,1],[60,1],[123,19],[124,20],[125,21],[159,22],[126,23],[127,1],[128,24],[129,25],[130,26],[131,27],[132,28],[133,29],[134,30],[135,31],[136,32],[137,32],[138,33],[139,1],[140,34],[141,35],[143,36],[142,37],[144,38],[145,39],[146,40],[147,41],[148,42],[149,43],[150,44],[151,45],[152,46],[153,47],[154,48],[155,49],[156,50],[63,1],[64,1],[65,1],[103,51],[104,1],[105,1],[157,52],[158,53],[44,1],[45,1],[9,1],[8,1],[2,1],[10,1],[11,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[3,1],[18,1],[19,1],[4,1],[20,1],[24,1],[21,1],[22,1],[23,1],[25,1],[26,1],[27,1],[5,1],[28,1],[29,1],[30,1],[31,1],[6,1],[35,1],[32,1],[33,1],[34,1],[36,1],[7,1],[37,1],[42,1],[43,1],[38,1],[39,1],[40,1],[41,1],[1,1],[81,54],[91,55],[80,54],[101,56],[72,57],[71,58],[100,59],[94,60],[99,61],[74,62],[88,63],[73,64],[97,65],[69,66],[68,59],[98,67],[70,68],[75,69],[76,1],[79,69],[66,1],[102,70],[92,71],[83,72],[84,73],[86,74],[82,75],[85,76],[95,59],[77,77],[78,78],[87,79],[67,80],[90,71],[89,69],[93,1],[96,81],[46,1],[49,82],[50,82],[51,82],[48,1]],"latestChangedDtsFile":"./test/parsing.test.d.ts","version":"5.9.3"} \ No newline at end of file diff --git a/node_modules/@cucumber/tag-expressions/package.json b/node_modules/@cucumber/tag-expressions/package.json new file mode 100644 index 00000000..ff9b849a --- /dev/null +++ b/node_modules/@cucumber/tag-expressions/package.json @@ -0,0 +1,71 @@ +{ + "name": "@cucumber/tag-expressions", + "version": "9.1.0", + "description": "Cucumber Tag Expression parser", + "type": "module", + "main": "dist/cjs/src/index.js", + "types": "dist/cjs/src/index.d.ts", + "files": [ + "dist/cjs", + "dist/esm" + ], + "module": "dist/esm/src/index.js", + "jsnext:main": "dist/esm/src/index.js", + "exports": { + ".": { + "import": "./dist/esm/src/index.js", + "require": "./dist/cjs/src/index.js" + } + }, + "scripts": { + "build:cjs": "tsc --build tsconfig.build-cjs.json && cp package.cjs.json dist/cjs/package.json", + "build:esm": "tsc --build tsconfig.build-esm.json", + "build": "npm run build:cjs && npm run build:esm", + "test": "mocha && npm run test:cjs", + "test:cjs": "npm run build:cjs && mocha --no-config dist/cjs/test", + "stryker": "TAG_EXPRESSIONS_TEST_DATA_DIR=$(pwd)/../testdata stryker run", + "prepublishOnly": "npm run build", + "fix": "eslint --max-warnings 0 --fix src test && prettier --write src test", + "lint": "eslint --max-warnings 0 src test && prettier --check src test" + }, + "repository": { + "type": "git", + "url": "git://github.com/cucumber/tag-expressions.git" + }, + "keywords": [ + "cucumber" + ], + "author": "Cucumber Limited ", + "license": "MIT", + "bugs": { + "url": "https://github.com/cucumber/tag-expressions/issues" + }, + "homepage": "https://github.com/cucumber/tag-expressions", + "devDependencies": { + "@eslint/compat": "^2.0.0", + "@eslint/eslintrc": "^3.3.0", + "@eslint/js": "^9.21.0", + "@stryker-mutator/core": "9.5.1", + "@stryker-mutator/mocha-runner": "9.5.1", + "@stryker-mutator/typescript-checker": "9.5.1", + "@types/js-yaml": "^4.0.3", + "@types/mocha": "10.0.10", + "@types/node": "22.19.11", + "@typescript-eslint/eslint-plugin": "^8.46.0", + "@typescript-eslint/parser": "^8.46.0", + "eslint": "^9.21.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-n": "^17.15.1", + "eslint-plugin-simple-import-sort": "^12.1.1", + "globals": "^17.0.0", + "js-yaml": "^4.1.0", + "mocha": "11.7.5", + "prettier": "^3.5.2", + "pretty-quick": "4.2.2", + "ts-node": "10.9.2", + "typescript": "5.9.3" + }, + "directories": { + "test": "test" + } +} diff --git a/node_modules/@playwright/test/LICENSE b/node_modules/@playwright/test/LICENSE new file mode 100644 index 00000000..4ace03dd --- /dev/null +++ b/node_modules/@playwright/test/LICENSE @@ -0,0 +1,202 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Portions Copyright (c) Microsoft Corporation. + Portions Copyright 2017 Google Inc. + + 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/node_modules/@playwright/test/NOTICE b/node_modules/@playwright/test/NOTICE new file mode 100644 index 00000000..814ec169 --- /dev/null +++ b/node_modules/@playwright/test/NOTICE @@ -0,0 +1,5 @@ +Playwright +Copyright (c) Microsoft Corporation + +This software contains code derived from the Puppeteer project (https://github.com/puppeteer/puppeteer), +available under the Apache 2.0 license (https://github.com/puppeteer/puppeteer/blob/master/LICENSE). diff --git a/node_modules/@playwright/test/README.md b/node_modules/@playwright/test/README.md new file mode 100644 index 00000000..d3abb8ff --- /dev/null +++ b/node_modules/@playwright/test/README.md @@ -0,0 +1,318 @@ +# 🎭 Playwright + +[![npm version](https://img.shields.io/npm/v/playwright.svg)](https://www.npmjs.com/package/playwright) [![Chromium version](https://img.shields.io/badge/chromium-149.0.7827.55-blue.svg?logo=google-chrome)](https://www.chromium.org/Home) [![Firefox version](https://img.shields.io/badge/firefox-151.0-blue.svg?logo=firefoxbrowser)](https://www.mozilla.org/en-US/firefox/new/) [![WebKit version](https://img.shields.io/badge/webkit-26.5-blue.svg?logo=safari)](https://webkit.org/) [![Join Discord](https://img.shields.io/badge/join-discord-informational)](https://aka.ms/playwright/discord) + +## [Documentation](https://playwright.dev) | [API reference](https://playwright.dev/docs/api/class-playwright) + +Playwright is a framework for web automation and testing. It drives Chromium, Firefox, and WebKit with a single API — in your tests, in your scripts, and as a tool for AI agents. + +## Get Started + +Choose the path that fits your workflow: + +| | Best for | Install | +|---|---|---| +| **[Playwright Test](#playwright-test)** | End-to-end testing | `npm init playwright@latest` | +| **[Playwright CLI](#playwright-cli)** | Coding agents (Claude Code, Copilot) | `npm i -g @playwright/cli@latest` | +| **[Playwright MCP](#playwright-mcp)** | AI agents and LLM-driven automation | `npx @playwright/mcp@latest` | +| **[Playwright Library](#playwright-library)** | Browser automation scripts | `npm i playwright` | +| **[VS Code Extension](#vs-code-extension)** | Test authoring and debugging in VS Code | [Install from Marketplace](https://marketplace.visualstudio.com/items?itemName=ms-playwright.playwright) | + +--- + +## Playwright Test + +Playwright Test is a full-featured test runner built for end-to-end testing. It runs tests across Chromium, Firefox, and WebKit with full browser isolation, auto-waiting, and web-first assertions. + +### Install + +```bash +npm init playwright@latest +``` + +Or add manually: + +```bash +npm i -D @playwright/test +npx playwright install +``` + +### Write a test + +```TypeScript +import { test, expect } from '@playwright/test'; + +test('has title', async ({ page }) => { + await page.goto('https://playwright.dev/'); + await expect(page).toHaveTitle(/Playwright/); +}); + +test('get started link', async ({ page }) => { + await page.goto('https://playwright.dev/'); + await page.getByRole('link', { name: 'Get started' }).click(); + await expect(page.getByRole('heading', { name: 'Installation' })).toBeVisible(); +}); +``` + +### Run tests + +```bash +npx playwright test +``` + +Tests run in parallel across all configured browsers, in headless mode by default. Each test gets a fresh browser context — full isolation with near-zero overhead. + +### Key capabilities + +**Auto-wait and web-first assertions.** No artificial timeouts. Playwright waits for elements to be actionable, and assertions automatically retry until conditions are met. + +**Locators.** Find elements with resilient locators that mirror how users see the page: + +```TypeScript +page.getByRole('button', { name: 'Submit' }) +page.getByLabel('Email') +page.getByPlaceholder('Search...') +page.getByTestId('login-form') +``` + +**Test isolation.** Each test runs in its own browser context — equivalent to a fresh browser profile. Save authentication state once and reuse it across tests: + +```TypeScript +// Save state after login +await page.context().storageState({ path: 'auth.json' }); + +// Reuse in other tests +test.use({ storageState: 'auth.json' }); +``` + +**Tracing.** Capture execution traces, screenshots, and videos on failure. Inspect every action, DOM snapshot, network request, and console message in the [Trace Viewer](https://playwright.dev/docs/trace-viewer): + +```TypeScript +// playwright.config.ts +export default defineConfig({ + use: { + trace: 'on-first-retry', + }, +}); +``` + +```bash +npx playwright show-trace trace.zip +``` + + + +**Parallelism.** Tests run in parallel by default across all configured browsers. + +[Full testing documentation](https://playwright.dev/docs/intro) + +--- + +## Playwright CLI + +[Playwright CLI](https://github.com/microsoft/playwright-cli) is a command-line interface for browser automation designed for coding agents. It's more token-efficient than MCP — commands avoid loading large tool schemas and accessibility trees into the model context. + +### Install + +```bash +npm install -g @playwright/cli@latest +``` + +Optionally install skills for richer agent integration: + +```bash +playwright-cli install --skills +``` + +### Usage + +Point your coding agent at a task: + +``` +Test the "add todo" flow on https://demo.playwright.dev/todomvc using playwright-cli. +Take screenshots for all successful and failing scenarios. +``` + +Or run commands directly: + +```bash +playwright-cli open https://demo.playwright.dev/todomvc/ --headed +playwright-cli type "Buy groceries" +playwright-cli press Enter +playwright-cli screenshot +``` + +### Session monitoring + +Use `playwright-cli show` to open a visual dashboard with live screencast previews of all running browser sessions. Click any session to zoom in and take remote control. + +```bash +playwright-cli show +``` + + + +[Full CLI documentation](https://playwright.dev/agent-cli/introduction) | [GitHub](https://github.com/microsoft/playwright-cli) + +--- + +## Playwright MCP + +The [Playwright MCP server](https://github.com/microsoft/playwright-mcp) gives AI agents full browser control through the [Model Context Protocol](https://modelcontextprotocol.io). Agents interact with pages using structured accessibility snapshots — no vision models or screenshots required. + +### Setup + +Add to your MCP client (VS Code, Cursor, Claude Desktop, Windsurf, etc.): + +```json +{ + "mcpServers": { + "playwright": { + "command": "npx", + "args": ["@playwright/mcp@latest"] + } + } +} +``` + +**One-click install for VS Code:** + +[Install in VS Code](https://insiders.vscode.dev/redirect?url=vscode%3Amcp%2Finstall%3F%257B%2522name%2522%253A%2522playwright%2522%252C%2522command%2522%253A%2522npx%2522%252C%2522args%2522%253A%255B%2522%2540playwright%252Fmcp%2540latest%2522%255D%257D) + +**For Claude Code:** + +```bash +claude mcp add playwright npx @playwright/mcp@latest +``` + +### How it works + +Ask your AI assistant to interact with any web page: + +``` +Navigate to https://demo.playwright.dev/todomvc and add a few todo items. +``` + +The agent sees the page as a structured accessibility tree: + +``` +- heading "todos" [level=1] +- textbox "What needs to be done?" [ref=e5] +- listitem: + - checkbox "Toggle Todo" [ref=e10] + - text: "Buy groceries" +``` + +It uses element refs like `e5` and `e10` to click, type, and interact — deterministically and without visual ambiguity. Tools cover navigation, form filling, screenshots, network mocking, storage management, and more. + +[Full MCP documentation](https://playwright.dev/mcp/introduction) | [GitHub](https://github.com/microsoft/playwright-mcp) + +--- + +## Playwright Library + +Use `playwright` as a library for browser automation scripts — web scraping, PDF generation, screenshot capture, and any workflow that needs programmatic browser control without a test runner. + +### Install + +```bash +npm i playwright +``` + +### Examples + +**Take a screenshot:** + +```TypeScript +import { chromium } from 'playwright'; + +const browser = await chromium.launch(); +const page = await browser.newPage(); +await page.goto('https://playwright.dev/'); +await page.screenshot({ path: 'screenshot.png' }); +await browser.close(); +``` + +**Generate a PDF:** + +```TypeScript +import { chromium } from 'playwright'; + +const browser = await chromium.launch(); +const page = await browser.newPage(); +await page.goto('https://playwright.dev/'); +await page.pdf({ path: 'page.pdf', format: 'A4' }); +await browser.close(); +``` + +**Emulate a mobile device:** + +```TypeScript +import { chromium, devices } from 'playwright'; + +const browser = await chromium.launch(); +const context = await browser.newContext(devices['iPhone 15']); +const page = await context.newPage(); +await page.goto('https://playwright.dev/'); +await page.screenshot({ path: 'mobile.png' }); +await browser.close(); +``` + +**Intercept network requests:** + +```TypeScript +import { chromium } from 'playwright'; + +const browser = await chromium.launch(); +const page = await browser.newPage(); +await page.route('**/*.{png,jpg,jpeg}', route => route.abort()); +await page.goto('https://playwright.dev/'); +await browser.close(); +``` + +[Library documentation](https://playwright.dev/docs/library) | [API reference](https://playwright.dev/docs/api/class-playwright) + +--- + +## VS Code Extension + +The [Playwright VS Code extension](https://marketplace.visualstudio.com/items?itemName=ms-playwright.playwright) brings test running, debugging, and code generation directly into your editor. + + + +**Run and debug tests** from the editor with a single click. Set breakpoints, inspect variables, and step through test execution with a live browser view. + +**Generate tests with CodeGen.** Click "Record new" to open a browser — navigate and interact with your app while Playwright writes the test code for you. + +**Pick locators.** Hover over any element in the browser to see the best available locator, then click to copy it to your clipboard. + +**Trace Viewer integration.** Enable "Show Trace Viewer" in the sidebar to get a full execution trace after each test run — DOM snapshots, network requests, console logs, and screenshots at every step. + +[Install the extension](https://marketplace.visualstudio.com/items?itemName=ms-playwright.playwright) | [VS Code guide](https://playwright.dev/docs/getting-started-vscode) + +--- + +## Cross-Browser Support + +| | Linux | macOS | Windows | +| :--- | :---: | :---: | :---: | +| Chromium1 149.0.7827.55 | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| WebKit 26.5 | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| Firefox 151.0 | :white_check_mark: | :white_check_mark: | :white_check_mark: | + +Headless and headed execution on all platforms. 1 Uses [Chrome for Testing](https://developer.chrome.com/blog/chrome-for-testing) by default. + +## Other Languages + +Playwright is also available for [Python](https://playwright.dev/python/docs/intro), [.NET](https://playwright.dev/dotnet/docs/intro), and [Java](https://playwright.dev/java/docs/intro). + +## Resources + +* [Documentation](https://playwright.dev) +* [API reference](https://playwright.dev/docs/api/class-playwright) +* [MCP server](https://github.com/microsoft/playwright-mcp) +* [CLI for coding agents](https://github.com/microsoft/playwright-cli) +* [VS Code extension](https://github.com/microsoft/playwright-vscode) +* [Contribution guide](CONTRIBUTING.md) +* [Changelog](https://github.com/microsoft/playwright/releases) +* [Discord](https://aka.ms/playwright/discord) diff --git a/node_modules/@playwright/test/cli.js b/node_modules/@playwright/test/cli.js new file mode 100644 index 00000000..e42facb0 --- /dev/null +++ b/node_modules/@playwright/test/cli.js @@ -0,0 +1,19 @@ +#!/usr/bin/env node +/** + * Copyright (c) Microsoft Corporation. + * + * 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. + */ + +const { program } = require('playwright/lib/program'); +program.parse(process.argv); diff --git a/node_modules/@playwright/test/index.d.ts b/node_modules/@playwright/test/index.d.ts new file mode 100644 index 00000000..8d99c915 --- /dev/null +++ b/node_modules/@playwright/test/index.d.ts @@ -0,0 +1,18 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * 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. + */ + +export * from 'playwright/test'; +export { default } from 'playwright/test'; diff --git a/node_modules/@playwright/test/index.js b/node_modules/@playwright/test/index.js new file mode 100644 index 00000000..8536f063 --- /dev/null +++ b/node_modules/@playwright/test/index.js @@ -0,0 +1,17 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * 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. + */ + +module.exports = require('playwright/test'); diff --git a/node_modules/@playwright/test/index.mjs b/node_modules/@playwright/test/index.mjs new file mode 100644 index 00000000..8d99c915 --- /dev/null +++ b/node_modules/@playwright/test/index.mjs @@ -0,0 +1,18 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * 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. + */ + +export * from 'playwright/test'; +export { default } from 'playwright/test'; diff --git a/node_modules/@playwright/test/package.json b/node_modules/@playwright/test/package.json new file mode 100644 index 00000000..16ee688a --- /dev/null +++ b/node_modules/@playwright/test/package.json @@ -0,0 +1,35 @@ +{ + "name": "@playwright/test", + "version": "1.61.0", + "description": "A high-level API to automate web browsers", + "repository": { + "type": "git", + "url": "git+https://github.com/microsoft/playwright.git" + }, + "homepage": "https://playwright.dev", + "engines": { + "node": ">=18" + }, + "author": { + "name": "Microsoft Corporation" + }, + "license": "Apache-2.0", + "exports": { + ".": { + "types": "./index.d.ts", + "import": "./index.mjs", + "require": "./index.js", + "default": "./index.js" + }, + "./cli": "./cli.js", + "./package.json": "./package.json", + "./reporter": "./reporter.js" + }, + "bin": { + "playwright": "cli.js" + }, + "scripts": {}, + "dependencies": { + "playwright": "1.61.0" + } +} diff --git a/node_modules/@playwright/test/reporter.d.ts b/node_modules/@playwright/test/reporter.d.ts new file mode 100644 index 00000000..806d13fb --- /dev/null +++ b/node_modules/@playwright/test/reporter.d.ts @@ -0,0 +1,17 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * 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. + */ + +export * from 'playwright/types/testReporter'; diff --git a/node_modules/@playwright/test/reporter.js b/node_modules/@playwright/test/reporter.js new file mode 100644 index 00000000..485e880a --- /dev/null +++ b/node_modules/@playwright/test/reporter.js @@ -0,0 +1,17 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * 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. + */ + +// We only export types in reporter.d.ts. diff --git a/node_modules/@playwright/test/reporter.mjs b/node_modules/@playwright/test/reporter.mjs new file mode 100644 index 00000000..485e880a --- /dev/null +++ b/node_modules/@playwright/test/reporter.mjs @@ -0,0 +1,17 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * 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. + */ + +// We only export types in reporter.d.ts. diff --git a/node_modules/@teppeis/multimaps/README.md b/node_modules/@teppeis/multimaps/README.md new file mode 100644 index 00000000..f1c8cca3 --- /dev/null +++ b/node_modules/@teppeis/multimaps/README.md @@ -0,0 +1,63 @@ +# @teppeis/multimaps + +Multi-Map classes for TypeScript and JavaScript + +[![npm version][npm-image]][npm-url] +![Node.js Version Support][node-version] +![TypeScript Version Support][ts-version] +[![build status][ci-image]][ci-url] +![dependency status][deps-count-image] +![monthly downloads][npm-downloads-image] +![License][license] + +## Install + +```console +$ npm i @teppeis/multimaps +``` + +## Usage + +### `ArrayMultimap` + +```js +import {ArrayMultimap} from '@teppeis/multimaps'; + +const map = new ArrayMultimap(); +map.put('foo', 'a'); +map.get('foo'); // ['a'] +map.put('foo', 'b'); +map.get('foo'); // ['a', 'b'] +map.put('foo', 'a'); +map.get('foo'); // ['a', 'b', 'a'] +``` + +### `SetMultimap` + +```js +import {SetMultimap} from '@teppeis/multimaps'; + +const map = new SetMultimap(); +map.put('foo', 'a'); +map.get('foo'); // a `Set` of ['a'] +map.put('foo', 'b'); +map.get('foo'); // a `Set` of ['a', 'b'] +map.put('foo', 'a'); +map.get('foo'); // a `Set` of ['a', 'b'] +``` + +## License + +MIT License: Teppei Sato <teppeis@gmail.com> + +[npm-image]: https://badgen.net/npm/v/@teppeis/multimaps?icon=npm&label= +[npm-url]: https://npmjs.org/package/@teppeis/multimaps +[npm-downloads-image]: https://badgen.net/npm/dm/@teppeis/multimaps +[deps-image]: https://badgen.net/david/dep/teppeis/multimaps.svg +[deps-url]: https://david-dm.org/teppeis/multimaps +[deps-count-image]: https://badgen.net/bundlephobia/dependency-count/@teppeis/multimaps +[node-version]: https://badgen.net/npm/node/@teppeis/multimaps +[ts-version]: https://badgen.net/badge/typescript/%3E=4.0?icon=typescript +[license]: https://img.shields.io/npm/l/@teppeis/multimaps.svg +[ci-image]: https://github.com/teppeis/multimaps/workflows/CI/badge.svg +[ci-url]: https://github.com/teppeis/multimaps/actions?query=workflow%3ACI diff --git a/node_modules/@teppeis/multimaps/dist/cjs/arraymultimap.d.ts b/node_modules/@teppeis/multimaps/dist/cjs/arraymultimap.d.ts new file mode 100644 index 00000000..7c7bbd7c --- /dev/null +++ b/node_modules/@teppeis/multimaps/dist/cjs/arraymultimap.d.ts @@ -0,0 +1,5 @@ +import { Multimap } from "./multimap.js"; +export declare class ArrayMultimap extends Multimap { + constructor(iterable?: Iterable<[K, V]>); + get [Symbol.toStringTag](): string; +} diff --git a/node_modules/@teppeis/multimaps/dist/cjs/arraymultimap.js b/node_modules/@teppeis/multimaps/dist/cjs/arraymultimap.js new file mode 100644 index 00000000..d24a312d --- /dev/null +++ b/node_modules/@teppeis/multimaps/dist/cjs/arraymultimap.js @@ -0,0 +1,39 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ArrayMultimap = void 0; +const multimap_js_1 = require("./multimap.js"); +class ArrayMultimap extends multimap_js_1.Multimap { + constructor(iterable) { + super(new ArrayOperator(), iterable); + } + get [Symbol.toStringTag]() { + return "ArrayMultimap"; + } +} +exports.ArrayMultimap = ArrayMultimap; +class ArrayOperator { + create() { + return []; + } + clone(collection) { + return collection.slice(); + } + add(value, collection) { + collection.push(value); + return true; + } + size(collection) { + return collection.length; + } + delete(value, collection) { + const index = collection.indexOf(value); + if (index > -1) { + collection.splice(index, 1); + return true; + } + return false; + } + has(value, collection) { + return collection.includes(value); + } +} diff --git a/node_modules/@teppeis/multimaps/dist/cjs/index.d.ts b/node_modules/@teppeis/multimaps/dist/cjs/index.d.ts new file mode 100644 index 00000000..17ca91be --- /dev/null +++ b/node_modules/@teppeis/multimaps/dist/cjs/index.d.ts @@ -0,0 +1,2 @@ +export { ArrayMultimap } from "./arraymultimap.js"; +export { SetMultimap } from "./setmultimap.js"; diff --git a/node_modules/@teppeis/multimaps/dist/cjs/index.js b/node_modules/@teppeis/multimaps/dist/cjs/index.js new file mode 100644 index 00000000..cf68b69b --- /dev/null +++ b/node_modules/@teppeis/multimaps/dist/cjs/index.js @@ -0,0 +1,7 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SetMultimap = exports.ArrayMultimap = void 0; +var arraymultimap_js_1 = require("./arraymultimap.js"); +Object.defineProperty(exports, "ArrayMultimap", { enumerable: true, get: function () { return arraymultimap_js_1.ArrayMultimap; } }); +var setmultimap_js_1 = require("./setmultimap.js"); +Object.defineProperty(exports, "SetMultimap", { enumerable: true, get: function () { return setmultimap_js_1.SetMultimap; } }); diff --git a/node_modules/@teppeis/multimaps/dist/cjs/multimap.d.ts b/node_modules/@teppeis/multimaps/dist/cjs/multimap.d.ts new file mode 100644 index 00000000..4f245ee7 --- /dev/null +++ b/node_modules/@teppeis/multimaps/dist/cjs/multimap.d.ts @@ -0,0 +1,31 @@ +export declare abstract class Multimap> implements Iterable<[K, V]> { + private size_; + private map; + private operator; + constructor(operator: CollectionOperator, iterable?: Iterable<[K, V]>); + abstract get [Symbol.toStringTag](): string; + get size(): number; + get(key: K): I; + put(key: K, value: V): boolean; + putAll(key: K, values: I): boolean; + putAll(multimap: Multimap): boolean; + has(key: K): boolean; + hasEntry(key: K, value: V): boolean; + delete(key: K): boolean; + deleteEntry(key: K, value: V): boolean; + clear(): void; + keys(): IterableIterator; + entries(): IterableIterator<[K, V]>; + values(): IterableIterator; + forEach(callback: (this: T | this, alue: V, key: K, map: this) => void, thisArg?: T): void; + [Symbol.iterator](): IterableIterator<[K, V]>; + asMap(): Map; +} +export interface CollectionOperator { + create(): I; + clone(collection: I): I; + add(value: V, collection: I): boolean; + size(collection: I): number; + delete(value: V, collection: I): boolean; + has(value: V, collection: I): boolean; +} diff --git a/node_modules/@teppeis/multimaps/dist/cjs/multimap.js b/node_modules/@teppeis/multimaps/dist/cjs/multimap.js new file mode 100644 index 00000000..47091bbc --- /dev/null +++ b/node_modules/@teppeis/multimaps/dist/cjs/multimap.js @@ -0,0 +1,125 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Multimap = void 0; +class Multimap { + constructor(operator, iterable) { + this.size_ = 0; + this.map = new Map(); + this.operator = operator; + if (iterable) { + for (const [key, value] of iterable) { + this.put(key, value); + } + } + return this; + } + get size() { + return this.size_; + } + get(key) { + const values = this.map.get(key); + if (values) { + return this.operator.clone(values); + } + else { + return this.operator.create(); + } + } + put(key, value) { + let values = this.map.get(key); + if (!values) { + values = this.operator.create(); + } + if (!this.operator.add(value, values)) { + return false; + } + this.map.set(key, values); + this.size_++; + return true; + } + putAll(arg1, arg2) { + let pushed = 0; + if (arg2) { + const key = arg1; + const values = arg2; + for (const value of values) { + this.put(key, value); + pushed++; + } + } + else if (arg1 instanceof Multimap) { + for (const [key, value] of arg1.entries()) { + this.put(key, value); + pushed++; + } + } + else { + throw new TypeError("unexpected arguments"); + } + return pushed > 0; + } + has(key) { + return this.map.has(key); + } + hasEntry(key, value) { + return this.operator.has(value, this.get(key)); + } + delete(key) { + this.size_ -= this.operator.size(this.get(key)); + return this.map.delete(key); + } + deleteEntry(key, value) { + const current = this.get(key); + if (!this.operator.delete(value, current)) { + return false; + } + this.map.set(key, current); + this.size_--; + return true; + } + clear() { + this.map.clear(); + this.size_ = 0; + } + keys() { + return this.map.keys(); + } + entries() { + // eslint-disable-next-line @typescript-eslint/no-this-alias + const self = this; + function* gen() { + for (const [key, values] of self.map.entries()) { + for (const value of values) { + yield [key, value]; + } + } + } + return gen(); + } + values() { + // eslint-disable-next-line @typescript-eslint/no-this-alias + const self = this; + function* gen() { + for (const [, value] of self.entries()) { + yield value; + } + } + return gen(); + } + forEach(callback, thisArg) { + for (const [key, value] of this.entries()) { + callback.call(thisArg === undefined ? this : thisArg, value, key, this); + } + } + [Symbol.iterator]() { + return this.entries(); + } + asMap() { + const ret = new Map(); + for (const key of this.keys()) { + ret.set(key, this.operator.clone(this.get(key))); + } + return ret; + } +} +exports.Multimap = Multimap; diff --git a/node_modules/@teppeis/multimaps/dist/cjs/package.json b/node_modules/@teppeis/multimaps/dist/cjs/package.json new file mode 100644 index 00000000..5bbefffb --- /dev/null +++ b/node_modules/@teppeis/multimaps/dist/cjs/package.json @@ -0,0 +1,3 @@ +{ + "type": "commonjs" +} diff --git a/node_modules/@teppeis/multimaps/dist/cjs/setmultimap.d.ts b/node_modules/@teppeis/multimaps/dist/cjs/setmultimap.d.ts new file mode 100644 index 00000000..d484fdc3 --- /dev/null +++ b/node_modules/@teppeis/multimaps/dist/cjs/setmultimap.d.ts @@ -0,0 +1,5 @@ +import { Multimap } from "./multimap.js"; +export declare class SetMultimap extends Multimap> { + constructor(iterable?: Iterable<[K, V]>); + get [Symbol.toStringTag](): string; +} diff --git a/node_modules/@teppeis/multimaps/dist/cjs/setmultimap.js b/node_modules/@teppeis/multimaps/dist/cjs/setmultimap.js new file mode 100644 index 00000000..1029a4b6 --- /dev/null +++ b/node_modules/@teppeis/multimaps/dist/cjs/setmultimap.js @@ -0,0 +1,35 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SetMultimap = void 0; +const multimap_js_1 = require("./multimap.js"); +class SetMultimap extends multimap_js_1.Multimap { + constructor(iterable) { + super(new SetOperator(), iterable); + } + get [Symbol.toStringTag]() { + return "SetMultimap"; + } +} +exports.SetMultimap = SetMultimap; +class SetOperator { + create() { + return new Set(); + } + clone(collection) { + return new Set(collection); + } + add(value, collection) { + const prev = collection.size; + collection.add(value); + return prev !== collection.size; + } + size(collection) { + return collection.size; + } + delete(value, collection) { + return collection.delete(value); + } + has(value, collection) { + return collection.has(value); + } +} diff --git a/node_modules/@teppeis/multimaps/dist/esm/arraymultimap.d.ts b/node_modules/@teppeis/multimaps/dist/esm/arraymultimap.d.ts new file mode 100644 index 00000000..7c7bbd7c --- /dev/null +++ b/node_modules/@teppeis/multimaps/dist/esm/arraymultimap.d.ts @@ -0,0 +1,5 @@ +import { Multimap } from "./multimap.js"; +export declare class ArrayMultimap extends Multimap { + constructor(iterable?: Iterable<[K, V]>); + get [Symbol.toStringTag](): string; +} diff --git a/node_modules/@teppeis/multimaps/dist/esm/arraymultimap.js b/node_modules/@teppeis/multimaps/dist/esm/arraymultimap.js new file mode 100644 index 00000000..a45b7481 --- /dev/null +++ b/node_modules/@teppeis/multimaps/dist/esm/arraymultimap.js @@ -0,0 +1,35 @@ +import { Multimap } from "./multimap.js"; +export class ArrayMultimap extends Multimap { + constructor(iterable) { + super(new ArrayOperator(), iterable); + } + get [Symbol.toStringTag]() { + return "ArrayMultimap"; + } +} +class ArrayOperator { + create() { + return []; + } + clone(collection) { + return collection.slice(); + } + add(value, collection) { + collection.push(value); + return true; + } + size(collection) { + return collection.length; + } + delete(value, collection) { + const index = collection.indexOf(value); + if (index > -1) { + collection.splice(index, 1); + return true; + } + return false; + } + has(value, collection) { + return collection.includes(value); + } +} diff --git a/node_modules/@teppeis/multimaps/dist/esm/index.d.ts b/node_modules/@teppeis/multimaps/dist/esm/index.d.ts new file mode 100644 index 00000000..17ca91be --- /dev/null +++ b/node_modules/@teppeis/multimaps/dist/esm/index.d.ts @@ -0,0 +1,2 @@ +export { ArrayMultimap } from "./arraymultimap.js"; +export { SetMultimap } from "./setmultimap.js"; diff --git a/node_modules/@teppeis/multimaps/dist/esm/index.js b/node_modules/@teppeis/multimaps/dist/esm/index.js new file mode 100644 index 00000000..17ca91be --- /dev/null +++ b/node_modules/@teppeis/multimaps/dist/esm/index.js @@ -0,0 +1,2 @@ +export { ArrayMultimap } from "./arraymultimap.js"; +export { SetMultimap } from "./setmultimap.js"; diff --git a/node_modules/@teppeis/multimaps/dist/esm/multimap.d.ts b/node_modules/@teppeis/multimaps/dist/esm/multimap.d.ts new file mode 100644 index 00000000..4f245ee7 --- /dev/null +++ b/node_modules/@teppeis/multimaps/dist/esm/multimap.d.ts @@ -0,0 +1,31 @@ +export declare abstract class Multimap> implements Iterable<[K, V]> { + private size_; + private map; + private operator; + constructor(operator: CollectionOperator, iterable?: Iterable<[K, V]>); + abstract get [Symbol.toStringTag](): string; + get size(): number; + get(key: K): I; + put(key: K, value: V): boolean; + putAll(key: K, values: I): boolean; + putAll(multimap: Multimap): boolean; + has(key: K): boolean; + hasEntry(key: K, value: V): boolean; + delete(key: K): boolean; + deleteEntry(key: K, value: V): boolean; + clear(): void; + keys(): IterableIterator; + entries(): IterableIterator<[K, V]>; + values(): IterableIterator; + forEach(callback: (this: T | this, alue: V, key: K, map: this) => void, thisArg?: T): void; + [Symbol.iterator](): IterableIterator<[K, V]>; + asMap(): Map; +} +export interface CollectionOperator { + create(): I; + clone(collection: I): I; + add(value: V, collection: I): boolean; + size(collection: I): number; + delete(value: V, collection: I): boolean; + has(value: V, collection: I): boolean; +} diff --git a/node_modules/@teppeis/multimaps/dist/esm/multimap.js b/node_modules/@teppeis/multimaps/dist/esm/multimap.js new file mode 100644 index 00000000..c71afa68 --- /dev/null +++ b/node_modules/@teppeis/multimaps/dist/esm/multimap.js @@ -0,0 +1,121 @@ +export class Multimap { + constructor(operator, iterable) { + this.size_ = 0; + this.map = new Map(); + this.operator = operator; + if (iterable) { + for (const [key, value] of iterable) { + this.put(key, value); + } + } + return this; + } + get size() { + return this.size_; + } + get(key) { + const values = this.map.get(key); + if (values) { + return this.operator.clone(values); + } + else { + return this.operator.create(); + } + } + put(key, value) { + let values = this.map.get(key); + if (!values) { + values = this.operator.create(); + } + if (!this.operator.add(value, values)) { + return false; + } + this.map.set(key, values); + this.size_++; + return true; + } + putAll(arg1, arg2) { + let pushed = 0; + if (arg2) { + const key = arg1; + const values = arg2; + for (const value of values) { + this.put(key, value); + pushed++; + } + } + else if (arg1 instanceof Multimap) { + for (const [key, value] of arg1.entries()) { + this.put(key, value); + pushed++; + } + } + else { + throw new TypeError("unexpected arguments"); + } + return pushed > 0; + } + has(key) { + return this.map.has(key); + } + hasEntry(key, value) { + return this.operator.has(value, this.get(key)); + } + delete(key) { + this.size_ -= this.operator.size(this.get(key)); + return this.map.delete(key); + } + deleteEntry(key, value) { + const current = this.get(key); + if (!this.operator.delete(value, current)) { + return false; + } + this.map.set(key, current); + this.size_--; + return true; + } + clear() { + this.map.clear(); + this.size_ = 0; + } + keys() { + return this.map.keys(); + } + entries() { + // eslint-disable-next-line @typescript-eslint/no-this-alias + const self = this; + function* gen() { + for (const [key, values] of self.map.entries()) { + for (const value of values) { + yield [key, value]; + } + } + } + return gen(); + } + values() { + // eslint-disable-next-line @typescript-eslint/no-this-alias + const self = this; + function* gen() { + for (const [, value] of self.entries()) { + yield value; + } + } + return gen(); + } + forEach(callback, thisArg) { + for (const [key, value] of this.entries()) { + callback.call(thisArg === undefined ? this : thisArg, value, key, this); + } + } + [Symbol.iterator]() { + return this.entries(); + } + asMap() { + const ret = new Map(); + for (const key of this.keys()) { + ret.set(key, this.operator.clone(this.get(key))); + } + return ret; + } +} diff --git a/node_modules/@teppeis/multimaps/dist/esm/setmultimap.d.ts b/node_modules/@teppeis/multimaps/dist/esm/setmultimap.d.ts new file mode 100644 index 00000000..d484fdc3 --- /dev/null +++ b/node_modules/@teppeis/multimaps/dist/esm/setmultimap.d.ts @@ -0,0 +1,5 @@ +import { Multimap } from "./multimap.js"; +export declare class SetMultimap extends Multimap> { + constructor(iterable?: Iterable<[K, V]>); + get [Symbol.toStringTag](): string; +} diff --git a/node_modules/@teppeis/multimaps/dist/esm/setmultimap.js b/node_modules/@teppeis/multimaps/dist/esm/setmultimap.js new file mode 100644 index 00000000..35269d90 --- /dev/null +++ b/node_modules/@teppeis/multimaps/dist/esm/setmultimap.js @@ -0,0 +1,31 @@ +import { Multimap } from "./multimap.js"; +export class SetMultimap extends Multimap { + constructor(iterable) { + super(new SetOperator(), iterable); + } + get [Symbol.toStringTag]() { + return "SetMultimap"; + } +} +class SetOperator { + create() { + return new Set(); + } + clone(collection) { + return new Set(collection); + } + add(value, collection) { + const prev = collection.size; + collection.add(value); + return prev !== collection.size; + } + size(collection) { + return collection.size; + } + delete(value, collection) { + return collection.delete(value); + } + has(value, collection) { + return collection.has(value); + } +} diff --git a/node_modules/@teppeis/multimaps/package.json b/node_modules/@teppeis/multimaps/package.json new file mode 100644 index 00000000..9c4fa1bc --- /dev/null +++ b/node_modules/@teppeis/multimaps/package.json @@ -0,0 +1,75 @@ +{ + "name": "@teppeis/multimaps", + "description": "Multimap classes for TypeScript and JavaScript", + "version": "3.0.0", + "author": "Teppei Sato ", + "publishConfig": { + "access": "public" + }, + "engines": { + "node": ">=14" + }, + "type": "module", + "main": "./dist/cjs/index.js", + "types": "./dist/cjs/index.d.ts", + "module": "./dist/esm/index.js", + "exports": { + ".": { + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "default": "./dist/esm/index.js" + }, + "./package.json": "./package.json" + }, + "files": [ + "dist" + ], + "scripts": { + "build": "run-p build:*", + "build:cjs": "tsc -p tsconfig.cjs.json && ./gen-cjs-packagejson.sh", + "build:esm": "tsc", + "clean": "rimraf dist test/ts40/dist", + "lint:eslint": "eslint .", + "lint:prettier": "prettier --check .", + "fix": "run-s fix:prettier fix:eslint", + "fix:eslint": "npm run lint:eslint -- --fix", + "fix:prettier": "npm run lint:prettier -- --write", + "prepublishOnly": "run-s clean build", + "test": "run-p -cl --aggregate-output lint:* type unit test:nest", + "test:install": "cd test/exports && npm i && cd ../ts40 && npm i", + "test:nest": "run-s test-exports test-ts40", + "test-exports": "cd test/exports && npm t", + "test-ts40": "cd test/ts40 && npm t", + "type": "tsc -p tsconfig.test.json", + "unit": "vitest run --coverage" + }, + "devDependencies": { + "@tsconfig/node14": "^1.0.3", + "@types/node": "^14.18.38", + "@vitest/coverage-c8": "^0.29.3", + "c8": "^7.12.0", + "eslint": "^8.36.0", + "eslint-config-teppeis": "^16.0.0", + "npm-run-all": "^4.1.5", + "power-assert": "^1.6.1", + "prettier": "^2.8.4", + "rimraf": "^3.0.2", + "typescript": "^4.9.5", + "vitest": "^0.29.3" + }, + "homepage": "https://github.com/teppeis/multimaps#readme", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/teppeis/multimaps.git" + }, + "bugs": { + "url": "https://github.com/teppeis/multimaps/issues" + }, + "keywords": [ + "map", + "multi-map", + "multimap", + "typescript" + ], + "license": "MIT" +} diff --git a/node_modules/@types/normalize-package-data/LICENSE b/node_modules/@types/normalize-package-data/LICENSE new file mode 100644 index 00000000..9e841e7a --- /dev/null +++ b/node_modules/@types/normalize-package-data/LICENSE @@ -0,0 +1,21 @@ + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE diff --git a/node_modules/@types/normalize-package-data/README.md b/node_modules/@types/normalize-package-data/README.md new file mode 100644 index 00000000..7c909159 --- /dev/null +++ b/node_modules/@types/normalize-package-data/README.md @@ -0,0 +1,62 @@ +# Installation +> `npm install --save @types/normalize-package-data` + +# Summary +This package contains type definitions for normalize-package-data (https://github.com/npm/normalize-package-data#readme). + +# Details +Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/normalize-package-data. +## [index.d.ts](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/normalize-package-data/index.d.ts) +````ts +export = normalize; + +declare function normalize(data: normalize.Input, warn?: normalize.WarnFn, strict?: boolean): void; +declare function normalize(data: normalize.Input, strict?: boolean): void; + +declare namespace normalize { + type WarnFn = (msg: string) => void; + interface Input { + [k: string]: any; + } + + interface Person { + name?: string | undefined; + email?: string | undefined; + url?: string | undefined; + } + + interface Package { + [k: string]: any; + name: string; + version: string; + files?: string[] | undefined; + bin?: { [k: string]: string } | undefined; + man?: string[] | undefined; + keywords?: string[] | undefined; + author?: Person | undefined; + maintainers?: Person[] | undefined; + contributors?: Person[] | undefined; + bundleDependencies?: { [name: string]: string } | undefined; + dependencies?: { [name: string]: string } | undefined; + devDependencies?: { [name: string]: string } | undefined; + optionalDependencies?: { [name: string]: string } | undefined; + description?: string | undefined; + engines?: { [type: string]: string } | undefined; + license?: string | undefined; + repository?: { type: string; url: string } | undefined; + bugs?: { url: string; email?: string | undefined } | { url?: string | undefined; email: string } | undefined; + homepage?: string | undefined; + scripts?: { [k: string]: string } | undefined; + readme: string; + _id: string; + } +} + +```` + +### Additional Details + * Last updated: Tue, 07 Nov 2023 09:09:39 GMT + * Dependencies: none + +# Credits +These definitions were written by [Jeff Dickey](https://github.com/jdxcode). diff --git a/node_modules/@types/normalize-package-data/index.d.ts b/node_modules/@types/normalize-package-data/index.d.ts new file mode 100644 index 00000000..7eea5807 --- /dev/null +++ b/node_modules/@types/normalize-package-data/index.d.ts @@ -0,0 +1,43 @@ +export = normalize; + +declare function normalize(data: normalize.Input, warn?: normalize.WarnFn, strict?: boolean): void; +declare function normalize(data: normalize.Input, strict?: boolean): void; + +declare namespace normalize { + type WarnFn = (msg: string) => void; + interface Input { + [k: string]: any; + } + + interface Person { + name?: string | undefined; + email?: string | undefined; + url?: string | undefined; + } + + interface Package { + [k: string]: any; + name: string; + version: string; + files?: string[] | undefined; + bin?: { [k: string]: string } | undefined; + man?: string[] | undefined; + keywords?: string[] | undefined; + author?: Person | undefined; + maintainers?: Person[] | undefined; + contributors?: Person[] | undefined; + bundleDependencies?: { [name: string]: string } | undefined; + dependencies?: { [name: string]: string } | undefined; + devDependencies?: { [name: string]: string } | undefined; + optionalDependencies?: { [name: string]: string } | undefined; + description?: string | undefined; + engines?: { [type: string]: string } | undefined; + license?: string | undefined; + repository?: { type: string; url: string } | undefined; + bugs?: { url: string; email?: string | undefined } | { url?: string | undefined; email: string } | undefined; + homepage?: string | undefined; + scripts?: { [k: string]: string } | undefined; + readme: string; + _id: string; + } +} diff --git a/node_modules/@types/normalize-package-data/package.json b/node_modules/@types/normalize-package-data/package.json new file mode 100644 index 00000000..5e8e11d3 --- /dev/null +++ b/node_modules/@types/normalize-package-data/package.json @@ -0,0 +1,25 @@ +{ + "name": "@types/normalize-package-data", + "version": "2.4.4", + "description": "TypeScript definitions for normalize-package-data", + "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/normalize-package-data", + "license": "MIT", + "contributors": [ + { + "name": "Jeff Dickey", + "githubUsername": "jdxcode", + "url": "https://github.com/jdxcode" + } + ], + "main": "", + "types": "index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git", + "directory": "types/normalize-package-data" + }, + "scripts": {}, + "dependencies": {}, + "typesPublisherContentHash": "f0a1ad6fab1a44929aa98a3e4ac36a2c42c2ca36a7e49671db2109fb2acd57c9", + "typeScriptVersion": "4.5" +} \ No newline at end of file diff --git a/node_modules/ansi-regex/index.js b/node_modules/ansi-regex/index.js new file mode 100644 index 00000000..9e37ec3d --- /dev/null +++ b/node_modules/ansi-regex/index.js @@ -0,0 +1,14 @@ +'use strict'; + +module.exports = options => { + options = Object.assign({ + onlyFirst: false + }, options); + + const pattern = [ + '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)', + '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))' + ].join('|'); + + return new RegExp(pattern, options.onlyFirst ? undefined : 'g'); +}; diff --git a/node_modules/ansi-regex/license b/node_modules/ansi-regex/license new file mode 100644 index 00000000..e7af2f77 --- /dev/null +++ b/node_modules/ansi-regex/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/ansi-regex/package.json b/node_modules/ansi-regex/package.json new file mode 100644 index 00000000..66a43e1f --- /dev/null +++ b/node_modules/ansi-regex/package.json @@ -0,0 +1,53 @@ +{ + "name": "ansi-regex", + "version": "4.1.1", + "description": "Regular expression for matching ANSI escape codes", + "license": "MIT", + "repository": "chalk/ansi-regex", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=6" + }, + "scripts": { + "test": "xo && ava", + "view-supported": "node fixtures/view-codes.js" + }, + "files": [ + "index.js" + ], + "keywords": [ + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "command-line", + "text", + "regex", + "regexp", + "re", + "match", + "test", + "find", + "pattern" + ], + "devDependencies": { + "ava": "^0.25.0", + "xo": "^0.23.0" + } +} diff --git a/node_modules/ansi-regex/readme.md b/node_modules/ansi-regex/readme.md new file mode 100644 index 00000000..d19c4466 --- /dev/null +++ b/node_modules/ansi-regex/readme.md @@ -0,0 +1,87 @@ +# ansi-regex [![Build Status](https://travis-ci.org/chalk/ansi-regex.svg?branch=master)](https://travis-ci.org/chalk/ansi-regex) + +> Regular expression for matching [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) + +--- + +
      + + Get professional support for this package with a Tidelift subscription + +
      + + Tidelift helps make open source sustainable for maintainers while giving companies
      assurances about security, maintenance, and licensing for their dependencies. +
      +
      + +--- + + +## Install + +``` +$ npm install ansi-regex +``` + + +## Usage + +```js +const ansiRegex = require('ansi-regex'); + +ansiRegex().test('\u001B[4mcake\u001B[0m'); +//=> true + +ansiRegex().test('cake'); +//=> false + +'\u001B[4mcake\u001B[0m'.match(ansiRegex()); +//=> ['\u001B[4m', '\u001B[0m'] + +'\u001B[4mcake\u001B[0m'.match(ansiRegex({onlyFirst: true})); +//=> ['\u001B[4m'] + +'\u001B]8;;https://github.com\u0007click\u001B]8;;\u0007'.match(ansiRegex()); +//=> ['\u001B]8;;https://github.com\u0007', '\u001B]8;;\u0007'] +``` + + +## API + +### ansiRegex([options]) + +Returns a regex for matching ANSI escape codes. + +#### options + +##### onlyFirst + +Type: `boolean`
      +Default: `false` *(Matches any ANSI escape codes in a string)* + +Match only the first ANSI escape. + + +## FAQ + +### Why do you test for codes not in the ECMA 48 standard? + +Some of the codes we run as a test are codes that we acquired finding various lists of non-standard or manufacturer specific codes. We test for both standard and non-standard codes, as most of them follow the same or similar format and can be safely matched in strings without the risk of removing actual string content. There are a few non-standard control codes that do not follow the traditional format (i.e. they end in numbers) thus forcing us to exclude them from the test because we cannot reliably match them. + +On the historical side, those ECMA standards were established in the early 90's whereas the VT100, for example, was designed in the mid/late 70's. At that point in time, control codes were still pretty ungoverned and engineers used them for a multitude of things, namely to activate hardware ports that may have been proprietary. Somewhere else you see a similar 'anarchy' of codes is in the x86 architecture for processors; there are a ton of "interrupts" that can mean different things on certain brands of processors, most of which have been phased out. + + +## Security + +To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure. + + +## Maintainers + +- [Sindre Sorhus](https://github.com/sindresorhus) +- [Josh Junon](https://github.com/qix-) + + +## License + +MIT diff --git a/node_modules/ansi-styles/index.d.ts b/node_modules/ansi-styles/index.d.ts new file mode 100644 index 00000000..e0170aa3 --- /dev/null +++ b/node_modules/ansi-styles/index.d.ts @@ -0,0 +1,167 @@ +declare namespace ansiStyles { + interface CSPair { + /** + The ANSI terminal control sequence for starting this style. + */ + readonly open: string; + + /** + The ANSI terminal control sequence for ending this style. + */ + readonly close: string; + } + + interface ColorBase { + /** + The ANSI terminal control sequence for ending this color. + */ + readonly close: string; + + ansi256(code: number): string; + + ansi16m(red: number, green: number, blue: number): string; + } + + interface Modifier { + /** + Resets the current color chain. + */ + readonly reset: CSPair; + + /** + Make text bold. + */ + readonly bold: CSPair; + + /** + Emitting only a small amount of light. + */ + readonly dim: CSPair; + + /** + Make text italic. (Not widely supported) + */ + readonly italic: CSPair; + + /** + Make text underline. (Not widely supported) + */ + readonly underline: CSPair; + + /** + Make text overline. + + Supported on VTE-based terminals, the GNOME terminal, mintty, and Git Bash. + */ + readonly overline: CSPair; + + /** + Inverse background and foreground colors. + */ + readonly inverse: CSPair; + + /** + Prints the text, but makes it invisible. + */ + readonly hidden: CSPair; + + /** + Puts a horizontal line through the center of the text. (Not widely supported) + */ + readonly strikethrough: CSPair; + } + + interface ForegroundColor { + readonly black: CSPair; + readonly red: CSPair; + readonly green: CSPair; + readonly yellow: CSPair; + readonly blue: CSPair; + readonly cyan: CSPair; + readonly magenta: CSPair; + readonly white: CSPair; + + /** + Alias for `blackBright`. + */ + readonly gray: CSPair; + + /** + Alias for `blackBright`. + */ + readonly grey: CSPair; + + readonly blackBright: CSPair; + readonly redBright: CSPair; + readonly greenBright: CSPair; + readonly yellowBright: CSPair; + readonly blueBright: CSPair; + readonly cyanBright: CSPair; + readonly magentaBright: CSPair; + readonly whiteBright: CSPair; + } + + interface BackgroundColor { + readonly bgBlack: CSPair; + readonly bgRed: CSPair; + readonly bgGreen: CSPair; + readonly bgYellow: CSPair; + readonly bgBlue: CSPair; + readonly bgCyan: CSPair; + readonly bgMagenta: CSPair; + readonly bgWhite: CSPair; + + /** + Alias for `bgBlackBright`. + */ + readonly bgGray: CSPair; + + /** + Alias for `bgBlackBright`. + */ + readonly bgGrey: CSPair; + + readonly bgBlackBright: CSPair; + readonly bgRedBright: CSPair; + readonly bgGreenBright: CSPair; + readonly bgYellowBright: CSPair; + readonly bgBlueBright: CSPair; + readonly bgCyanBright: CSPair; + readonly bgMagentaBright: CSPair; + readonly bgWhiteBright: CSPair; + } + + interface ConvertColor { + /** + Convert from the RGB color space to the ANSI 256 color space. + + @param red - (`0...255`) + @param green - (`0...255`) + @param blue - (`0...255`) + */ + rgbToAnsi256(red: number, green: number, blue: number): number; + + /** + Convert from the RGB HEX color space to the RGB color space. + + @param hex - A hexadecimal string containing RGB data. + */ + hexToRgb(hex: string): [red: number, green: number, blue: number]; + + /** + Convert from the RGB HEX color space to the ANSI 256 color space. + + @param hex - A hexadecimal string containing RGB data. + */ + hexToAnsi256(hex: string): number; + } +} + +declare const ansiStyles: { + readonly modifier: ansiStyles.Modifier; + readonly color: ansiStyles.ForegroundColor & ansiStyles.ColorBase; + readonly bgColor: ansiStyles.BackgroundColor & ansiStyles.ColorBase; + readonly codes: ReadonlyMap; +} & ansiStyles.BackgroundColor & ansiStyles.ForegroundColor & ansiStyles.Modifier & ansiStyles.ConvertColor; + +export = ansiStyles; diff --git a/node_modules/ansi-styles/index.js b/node_modules/ansi-styles/index.js new file mode 100644 index 00000000..a9eac589 --- /dev/null +++ b/node_modules/ansi-styles/index.js @@ -0,0 +1,164 @@ +'use strict'; + +const ANSI_BACKGROUND_OFFSET = 10; + +const wrapAnsi256 = (offset = 0) => code => `\u001B[${38 + offset};5;${code}m`; + +const wrapAnsi16m = (offset = 0) => (red, green, blue) => `\u001B[${38 + offset};2;${red};${green};${blue}m`; + +function assembleStyles() { + const codes = new Map(); + const styles = { + modifier: { + reset: [0, 0], + // 21 isn't widely supported and 22 does the same thing + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + overline: [53, 55], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29] + }, + color: { + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + + // Bright color + blackBright: [90, 39], + redBright: [91, 39], + greenBright: [92, 39], + yellowBright: [93, 39], + blueBright: [94, 39], + magentaBright: [95, 39], + cyanBright: [96, 39], + whiteBright: [97, 39] + }, + bgColor: { + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], + + // Bright color + bgBlackBright: [100, 49], + bgRedBright: [101, 49], + bgGreenBright: [102, 49], + bgYellowBright: [103, 49], + bgBlueBright: [104, 49], + bgMagentaBright: [105, 49], + bgCyanBright: [106, 49], + bgWhiteBright: [107, 49] + } + }; + + // Alias bright black as gray (and grey) + styles.color.gray = styles.color.blackBright; + styles.bgColor.bgGray = styles.bgColor.bgBlackBright; + styles.color.grey = styles.color.blackBright; + styles.bgColor.bgGrey = styles.bgColor.bgBlackBright; + + for (const [groupName, group] of Object.entries(styles)) { + for (const [styleName, style] of Object.entries(group)) { + styles[styleName] = { + open: `\u001B[${style[0]}m`, + close: `\u001B[${style[1]}m` + }; + + group[styleName] = styles[styleName]; + + codes.set(style[0], style[1]); + } + + Object.defineProperty(styles, groupName, { + value: group, + enumerable: false + }); + } + + Object.defineProperty(styles, 'codes', { + value: codes, + enumerable: false + }); + + styles.color.close = '\u001B[39m'; + styles.bgColor.close = '\u001B[49m'; + + styles.color.ansi256 = wrapAnsi256(); + styles.color.ansi16m = wrapAnsi16m(); + styles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET); + styles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET); + + // From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js + Object.defineProperties(styles, { + rgbToAnsi256: { + value: (red, green, blue) => { + // We use the extended greyscale palette here, with the exception of + // black and white. normal palette only has 4 greyscale shades. + if (red === green && green === blue) { + if (red < 8) { + return 16; + } + + if (red > 248) { + return 231; + } + + return Math.round(((red - 8) / 247) * 24) + 232; + } + + return 16 + + (36 * Math.round(red / 255 * 5)) + + (6 * Math.round(green / 255 * 5)) + + Math.round(blue / 255 * 5); + }, + enumerable: false + }, + hexToRgb: { + value: hex => { + const matches = /(?[a-f\d]{6}|[a-f\d]{3})/i.exec(hex.toString(16)); + if (!matches) { + return [0, 0, 0]; + } + + let {colorString} = matches.groups; + + if (colorString.length === 3) { + colorString = colorString.split('').map(character => character + character).join(''); + } + + const integer = Number.parseInt(colorString, 16); + + return [ + (integer >> 16) & 0xFF, + (integer >> 8) & 0xFF, + integer & 0xFF + ]; + }, + enumerable: false + }, + hexToAnsi256: { + value: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)), + enumerable: false + } + }); + + return styles; +} + +// Make the export immutable +Object.defineProperty(module, 'exports', { + enumerable: true, + get: assembleStyles +}); diff --git a/node_modules/ansi-styles/license b/node_modules/ansi-styles/license new file mode 100644 index 00000000..e7af2f77 --- /dev/null +++ b/node_modules/ansi-styles/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/ansi-styles/package.json b/node_modules/ansi-styles/package.json new file mode 100644 index 00000000..b3c89c90 --- /dev/null +++ b/node_modules/ansi-styles/package.json @@ -0,0 +1,52 @@ +{ + "name": "ansi-styles", + "version": "5.2.0", + "description": "ANSI escape codes for styling strings in the terminal", + "license": "MIT", + "repository": "chalk/ansi-styles", + "funding": "https://github.com/chalk/ansi-styles?sponsor=1", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "https://sindresorhus.com" + }, + "engines": { + "node": ">=10" + }, + "scripts": { + "test": "xo && ava && tsd", + "screenshot": "svg-term --command='node screenshot' --out=screenshot.svg --padding=3 --width=55 --height=3 --at=1000 --no-cursor" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "keywords": [ + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "devDependencies": { + "ava": "^2.4.0", + "svg-term-cli": "^2.1.1", + "tsd": "^0.14.0", + "xo": "^0.37.1" + } +} diff --git a/node_modules/ansi-styles/readme.md b/node_modules/ansi-styles/readme.md new file mode 100644 index 00000000..7d124665 --- /dev/null +++ b/node_modules/ansi-styles/readme.md @@ -0,0 +1,144 @@ +# ansi-styles + +> [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for styling strings in the terminal + +You probably want the higher-level [chalk](https://github.com/chalk/chalk) module for styling your strings. + + + +## Install + +``` +$ npm install ansi-styles +``` + +## Usage + +```js +const style = require('ansi-styles'); + +console.log(`${style.green.open}Hello world!${style.green.close}`); + + +// Color conversion between 256/truecolor +// NOTE: When converting from truecolor to 256 colors, the original color +// may be degraded to fit the new color palette. This means terminals +// that do not support 16 million colors will best-match the +// original color. +console.log(`${style.color.ansi256(style.rgbToAnsi256(199, 20, 250))}Hello World${style.color.close}`) +console.log(`${style.color.ansi16m(...style.hexToRgb('#abcdef'))}Hello World${style.color.close}`) +``` + +## API + +Each style has an `open` and `close` property. + +## Styles + +### Modifiers + +- `reset` +- `bold` +- `dim` +- `italic` *(Not widely supported)* +- `underline` +- `overline` *Supported on VTE-based terminals, the GNOME terminal, mintty, and Git Bash.* +- `inverse` +- `hidden` +- `strikethrough` *(Not widely supported)* + +### Colors + +- `black` +- `red` +- `green` +- `yellow` +- `blue` +- `magenta` +- `cyan` +- `white` +- `blackBright` (alias: `gray`, `grey`) +- `redBright` +- `greenBright` +- `yellowBright` +- `blueBright` +- `magentaBright` +- `cyanBright` +- `whiteBright` + +### Background colors + +- `bgBlack` +- `bgRed` +- `bgGreen` +- `bgYellow` +- `bgBlue` +- `bgMagenta` +- `bgCyan` +- `bgWhite` +- `bgBlackBright` (alias: `bgGray`, `bgGrey`) +- `bgRedBright` +- `bgGreenBright` +- `bgYellowBright` +- `bgBlueBright` +- `bgMagentaBright` +- `bgCyanBright` +- `bgWhiteBright` + +## Advanced usage + +By default, you get a map of styles, but the styles are also available as groups. They are non-enumerable so they don't show up unless you access them explicitly. This makes it easier to expose only a subset in a higher-level module. + +- `style.modifier` +- `style.color` +- `style.bgColor` + +###### Example + +```js +console.log(style.color.green.open); +``` + +Raw escape codes (i.e. without the CSI escape prefix `\u001B[` and render mode postfix `m`) are available under `style.codes`, which returns a `Map` with the open codes as keys and close codes as values. + +###### Example + +```js +console.log(style.codes.get(36)); +//=> 39 +``` + +## [256 / 16 million (TrueColor) support](https://gist.github.com/XVilka/8346728) + +`ansi-styles` allows converting between various color formats and ANSI escapes, with support for 256 and 16 million colors. + +The following color spaces from `color-convert` are supported: + +- `rgb` +- `hex` +- `ansi256` + +To use these, call the associated conversion function with the intended output, for example: + +```js +style.color.ansi256(style.rgbToAnsi256(100, 200, 15)); // RGB to 256 color ansi foreground code +style.bgColor.ansi256(style.hexToAnsi256('#C0FFEE')); // HEX to 256 color ansi foreground code + +style.color.ansi16m(100, 200, 15); // RGB to 16 million color foreground code +style.bgColor.ansi16m(...style.hexToRgb('#C0FFEE')); // Hex (RGB) to 16 million color foreground code +``` + +## Related + +- [ansi-escapes](https://github.com/sindresorhus/ansi-escapes) - ANSI escape codes for manipulating the terminal + +## Maintainers + +- [Sindre Sorhus](https://github.com/sindresorhus) +- [Josh Junon](https://github.com/qix-) + +## For enterprise + +Available as part of the Tidelift Subscription. + +The maintainers of `ansi-styles` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-ansi-styles?utm_source=npm-ansi-styles&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) diff --git a/node_modules/any-promise/.jshintrc b/node_modules/any-promise/.jshintrc new file mode 100644 index 00000000..979105e9 --- /dev/null +++ b/node_modules/any-promise/.jshintrc @@ -0,0 +1,4 @@ +{ + "node":true, + "strict":true +} diff --git a/node_modules/any-promise/.npmignore b/node_modules/any-promise/.npmignore new file mode 100644 index 00000000..1354abc0 --- /dev/null +++ b/node_modules/any-promise/.npmignore @@ -0,0 +1,7 @@ +.git* +test/ +test-browser/ +build/ +.travis.yml +*.swp +Makefile diff --git a/node_modules/any-promise/LICENSE b/node_modules/any-promise/LICENSE new file mode 100644 index 00000000..9187fe5d --- /dev/null +++ b/node_modules/any-promise/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2014-2016 Kevin Beaty + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/any-promise/README.md b/node_modules/any-promise/README.md new file mode 100644 index 00000000..174bea4a --- /dev/null +++ b/node_modules/any-promise/README.md @@ -0,0 +1,161 @@ +## Any Promise + +[![Build Status](https://secure.travis-ci.org/kevinbeaty/any-promise.svg)](http://travis-ci.org/kevinbeaty/any-promise) + +Let your library support any ES 2015 (ES6) compatible `Promise` and leave the choice to application authors. The application can *optionally* register its preferred `Promise` implementation and it will be exported when requiring `any-promise` from library code. + +If no preference is registered, defaults to the global `Promise` for newer Node.js versions. The browser version defaults to the window `Promise`, so polyfill or register as necessary. + +### Usage with global Promise: + +Assuming the global `Promise` is the desired implementation: + +```bash +# Install any libraries depending on any-promise +$ npm install mz +``` + +The installed libraries will use global Promise by default. + +```js +// in library +var Promise = require('any-promise') // the global Promise + +function promiseReturningFunction(){ + return new Promise(function(resolve, reject){...}) +} +``` + +### Usage with registration: + +Assuming `bluebird` is the desired Promise implementation: + +```bash +# Install preferred promise library +$ npm install bluebird +# Install any-promise to allow registration +$ npm install any-promise +# Install any libraries you would like to use depending on any-promise +$ npm install mz +``` + +Register your preference in the application entry point before any other `require` of packages that load `any-promise`: + +```javascript +// top of application index.js or other entry point +require('any-promise/register/bluebird') + +// -or- Equivalent to above, but allows customization of Promise library +require('any-promise/register')('bluebird', {Promise: require('bluebird')}) +``` + +Now that the implementation is registered, you can use any package depending on `any-promise`: + + +```javascript +var fsp = require('mz/fs') // mz/fs will use registered bluebird promises +var Promise = require('any-promise') // the registered bluebird promise +``` + +It is safe to call `register` multiple times, but it must always be with the same implementation. + +Again, registration is *optional*. It should only be called by the application user if overriding the global `Promise` implementation is desired. + +### Optional Application Registration + +As an application author, you can *optionally* register a preferred `Promise` implementation on application startup (before any call to `require('any-promise')`: + +You must register your preference before any call to `require('any-promise')` (by you or required packages), and only one implementation can be registered. Typically, this registration would occur at the top of the application entry point. + + +#### Registration shortcuts + +If you are using a known `Promise` implementation, you can register your preference with a shortcut: + + +```js +require('any-promise/register/bluebird') +// -or- +import 'any-promise/register/q'; +``` + +Shortcut registration is the preferred registration method as it works in the browser and Node.js. It is also convenient for using with `import` and many test runners, that offer a `--require` flag: + +``` +$ ava --require=any-promise/register/bluebird test.js +``` + +Current known implementations include `bluebird`, `q`, `when`, `rsvp`, `es6-promise`, `promise`, `native-promise-only`, `pinkie`, `vow` and `lie`. If you are not using a known implementation, you can use another registration method described below. + + +#### Basic Registration + +As an alternative to registration shortcuts, you can call the `register` function with the preferred `Promise` implementation. The benefit of this approach is that a `Promise` library can be required by name without being a known implementation. This approach does NOT work in the browser. To use `any-promise` in the browser use either registration shortcuts or specify the `Promise` constructor using advanced registration (see below). + +```javascript +require('any-promise/register')('when') +// -or- require('any-promise/register')('any other ES6 compatible library (known or otherwise)') +``` + +This registration method will try to detect the `Promise` constructor from requiring the specified implementation. If you would like to specify your own constructor, see advanced registration. + + +#### Advanced Registration + +To use the browser version, you should either install a polyfill or explicitly register the `Promise` constructor: + +```javascript +require('any-promise/register')('bluebird', {Promise: require('bluebird')}) +``` + +This could also be used for registering a custom `Promise` implementation or subclass. + +Your preference will be registered globally, allowing a single registration even if multiple versions of `any-promise` are installed in the NPM dependency tree or are using multiple bundled JavaScript files in the browser. You can bypass this global registration in options: + + +```javascript +require('../register')('es6-promise', {Promise: require('es6-promise').Promise, global: false}) +``` + +### Library Usage + +To use any `Promise` constructor, simply require it: + +```javascript +var Promise = require('any-promise'); + +return Promise + .all([xf, f, init, coll]) + .then(fn); + + +return new Promise(function(resolve, reject){ + try { + resolve(item); + } catch(e){ + reject(e); + } +}); + +``` + +Except noted below, libraries using `any-promise` should only use [documented](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) functions as there is no guarantee which implementation will be chosen by the application author. Libraries should never call `register`, only the application user should call if desired. + + +#### Advanced Library Usage + +If your library needs to branch code based on the registered implementation, you can retrieve it using `var impl = require('any-promise/implementation')`, where `impl` will be the package name (`"bluebird"`, `"when"`, etc.) if registered, `"global.Promise"` if using the global version on Node.js, or `"window.Promise"` if using the browser version. You should always include a default case, as there is no guarantee what package may be registered. + + +### Support for old Node.js versions + +Node.js versions prior to `v0.12` may have contained buggy versions of the global `Promise`. For this reason, the global `Promise` is not loaded automatically for these old versions. If using `any-promise` in Node.js versions versions `<= v0.12`, the user should register a desired implementation. + +If an implementation is not registered, `any-promise` will attempt to discover an installed `Promise` implementation. If no implementation can be found, an error will be thrown on `require('any-promise')`. While the auto-discovery usually avoids errors, it is non-deterministic. It is recommended that the user always register a preferred implementation for older Node.js versions. + +This auto-discovery is only available for Node.jS versions prior to `v0.12`. Any newer versions will always default to the global `Promise` implementation. + +### Related + +- [any-observable](https://github.com/sindresorhus/any-observable) - `any-promise` for Observables. + diff --git a/node_modules/any-promise/implementation.d.ts b/node_modules/any-promise/implementation.d.ts new file mode 100644 index 00000000..c331a56a --- /dev/null +++ b/node_modules/any-promise/implementation.d.ts @@ -0,0 +1,3 @@ +declare var implementation: string; + +export = implementation; diff --git a/node_modules/any-promise/implementation.js b/node_modules/any-promise/implementation.js new file mode 100644 index 00000000..a45ae94d --- /dev/null +++ b/node_modules/any-promise/implementation.js @@ -0,0 +1 @@ +module.exports = require('./register')().implementation diff --git a/node_modules/any-promise/index.d.ts b/node_modules/any-promise/index.d.ts new file mode 100644 index 00000000..9f646c5d --- /dev/null +++ b/node_modules/any-promise/index.d.ts @@ -0,0 +1,73 @@ +declare class Promise implements Promise.Thenable { + /** + * If you call resolve in the body of the callback passed to the constructor, + * your promise is fulfilled with result object passed to resolve. + * If you call reject your promise is rejected with the object passed to resolve. + * For consistency and debugging (eg stack traces), obj should be an instanceof Error. + * Any errors thrown in the constructor callback will be implicitly passed to reject(). + */ + constructor (callback: (resolve : (value?: R | Promise.Thenable) => void, reject: (error?: any) => void) => void); + + /** + * onFulfilled is called when/if "promise" resolves. onRejected is called when/if "promise" rejects. + * Both are optional, if either/both are omitted the next onFulfilled/onRejected in the chain is called. + * Both callbacks have a single parameter , the fulfillment value or rejection reason. + * "then" returns a new promise equivalent to the value you return from onFulfilled/onRejected after being passed through Promise.resolve. + * If an error is thrown in the callback, the returned promise rejects with that error. + * + * @param onFulfilled called when/if "promise" resolves + * @param onRejected called when/if "promise" rejects + */ + then (onFulfilled?: (value: R) => U | Promise.Thenable, onRejected?: (error: any) => U | Promise.Thenable): Promise; + then (onFulfilled?: (value: R) => U | Promise.Thenable, onRejected?: (error: any) => void): Promise; + + /** + * Sugar for promise.then(undefined, onRejected) + * + * @param onRejected called when/if "promise" rejects + */ + catch (onRejected?: (error: any) => U | Promise.Thenable): Promise; + + /** + * Make a new promise from the thenable. + * A thenable is promise-like in as far as it has a "then" method. + */ + static resolve (): Promise; + static resolve (value: R | Promise.Thenable): Promise; + + /** + * Make a promise that rejects to obj. For consistency and debugging (eg stack traces), obj should be an instanceof Error + */ + static reject (error: any): Promise; + + /** + * Make a promise that fulfills when every item in the array fulfills, and rejects if (and when) any item rejects. + * the array passed to all can be a mixture of promise-like objects and other objects. + * The fulfillment value is an array (in order) of fulfillment values. The rejection value is the first rejection value. + */ + static all (values: [T1 | Promise.Thenable, T2 | Promise.Thenable, T3 | Promise.Thenable, T4 | Promise.Thenable , T5 | Promise.Thenable, T6 | Promise.Thenable, T7 | Promise.Thenable, T8 | Promise.Thenable, T9 | Promise.Thenable, T10 | Promise.Thenable]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]>; + static all (values: [T1 | Promise.Thenable, T2 | Promise.Thenable, T3 | Promise.Thenable, T4 | Promise.Thenable , T5 | Promise.Thenable, T6 | Promise.Thenable, T7 | Promise.Thenable, T8 | Promise.Thenable, T9 | Promise.Thenable]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8, T9]>; + static all (values: [T1 | Promise.Thenable, T2 | Promise.Thenable, T3 | Promise.Thenable, T4 | Promise.Thenable , T5 | Promise.Thenable, T6 | Promise.Thenable, T7 | Promise.Thenable, T8 | Promise.Thenable]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8]>; + static all (values: [T1 | Promise.Thenable, T2 | Promise.Thenable, T3 | Promise.Thenable, T4 | Promise.Thenable , T5 | Promise.Thenable, T6 | Promise.Thenable, T7 | Promise.Thenable]): Promise<[T1, T2, T3, T4, T5, T6, T7]>; + static all (values: [T1 | Promise.Thenable, T2 | Promise.Thenable, T3 | Promise.Thenable, T4 | Promise.Thenable , T5 | Promise.Thenable, T6 | Promise.Thenable]): Promise<[T1, T2, T3, T4, T5, T6]>; + static all (values: [T1 | Promise.Thenable, T2 | Promise.Thenable, T3 | Promise.Thenable, T4 | Promise.Thenable , T5 | Promise.Thenable]): Promise<[T1, T2, T3, T4, T5]>; + static all (values: [T1 | Promise.Thenable, T2 | Promise.Thenable, T3 | Promise.Thenable, T4 | Promise.Thenable ]): Promise<[T1, T2, T3, T4]>; + static all (values: [T1 | Promise.Thenable, T2 | Promise.Thenable, T3 | Promise.Thenable]): Promise<[T1, T2, T3]>; + static all (values: [T1 | Promise.Thenable, T2 | Promise.Thenable]): Promise<[T1, T2]>; + static all (values: [T1 | Promise.Thenable]): Promise<[T1]>; + static all (values: Array>): Promise; + + /** + * Make a Promise that fulfills when any item fulfills, and rejects if any item rejects. + */ + static race (promises: (R | Promise.Thenable)[]): Promise; +} + +declare namespace Promise { + export interface Thenable { + then (onFulfilled?: (value: R) => U | Thenable, onRejected?: (error: any) => U | Thenable): Thenable; + then (onFulfilled?: (value: R) => U | Thenable, onRejected?: (error: any) => void): Thenable; + } +} + +export = Promise; diff --git a/node_modules/any-promise/index.js b/node_modules/any-promise/index.js new file mode 100644 index 00000000..74b85483 --- /dev/null +++ b/node_modules/any-promise/index.js @@ -0,0 +1 @@ +module.exports = require('./register')().Promise diff --git a/node_modules/any-promise/loader.js b/node_modules/any-promise/loader.js new file mode 100644 index 00000000..e1649142 --- /dev/null +++ b/node_modules/any-promise/loader.js @@ -0,0 +1,78 @@ +"use strict" + // global key for user preferred registration +var REGISTRATION_KEY = '@@any-promise/REGISTRATION', + // Prior registration (preferred or detected) + registered = null + +/** + * Registers the given implementation. An implementation must + * be registered prior to any call to `require("any-promise")`, + * typically on application load. + * + * If called with no arguments, will return registration in + * following priority: + * + * For Node.js: + * + * 1. Previous registration + * 2. global.Promise if node.js version >= 0.12 + * 3. Auto detected promise based on first sucessful require of + * known promise libraries. Note this is a last resort, as the + * loaded library is non-deterministic. node.js >= 0.12 will + * always use global.Promise over this priority list. + * 4. Throws error. + * + * For Browser: + * + * 1. Previous registration + * 2. window.Promise + * 3. Throws error. + * + * Options: + * + * Promise: Desired Promise constructor + * global: Boolean - Should the registration be cached in a global variable to + * allow cross dependency/bundle registration? (default true) + */ +module.exports = function(root, loadImplementation){ + return function register(implementation, opts){ + implementation = implementation || null + opts = opts || {} + // global registration unless explicitly {global: false} in options (default true) + var registerGlobal = opts.global !== false; + + // load any previous global registration + if(registered === null && registerGlobal){ + registered = root[REGISTRATION_KEY] || null + } + + if(registered !== null + && implementation !== null + && registered.implementation !== implementation){ + // Throw error if attempting to redefine implementation + throw new Error('any-promise already defined as "'+registered.implementation+ + '". You can only register an implementation before the first '+ + ' call to require("any-promise") and an implementation cannot be changed') + } + + if(registered === null){ + // use provided implementation + if(implementation !== null && typeof opts.Promise !== 'undefined'){ + registered = { + Promise: opts.Promise, + implementation: implementation + } + } else { + // require implementation if implementation is specified but not provided + registered = loadImplementation(implementation) + } + + if(registerGlobal){ + // register preference globally in case multiple installations + root[REGISTRATION_KEY] = registered + } + } + + return registered + } +} diff --git a/node_modules/any-promise/optional.js b/node_modules/any-promise/optional.js new file mode 100644 index 00000000..f3889420 --- /dev/null +++ b/node_modules/any-promise/optional.js @@ -0,0 +1,6 @@ +"use strict"; +try { + module.exports = require('./register')().Promise || null +} catch(e) { + module.exports = null +} diff --git a/node_modules/any-promise/package.json b/node_modules/any-promise/package.json new file mode 100644 index 00000000..5baf14cf --- /dev/null +++ b/node_modules/any-promise/package.json @@ -0,0 +1,45 @@ +{ + "name": "any-promise", + "version": "1.3.0", + "description": "Resolve any installed ES6 compatible promise", + "main": "index.js", + "typings": "index.d.ts", + "browser": { + "./register.js": "./register-shim.js" + }, + "scripts": { + "test": "ava" + }, + "repository": { + "type": "git", + "url": "https://github.com/kevinbeaty/any-promise" + }, + "keywords": [ + "promise", + "es6" + ], + "author": "Kevin Beaty", + "license": "MIT", + "bugs": { + "url": "https://github.com/kevinbeaty/any-promise/issues" + }, + "homepage": "http://github.com/kevinbeaty/any-promise", + "dependencies": {}, + "devDependencies": { + "ava": "^0.14.0", + "bluebird": "^3.0.0", + "es6-promise": "^3.0.0", + "is-promise": "^2.0.0", + "lie": "^3.0.0", + "mocha": "^2.0.0", + "native-promise-only": "^0.8.0", + "phantomjs-prebuilt": "^2.0.0", + "pinkie": "^2.0.0", + "promise": "^7.0.0", + "q": "^1.0.0", + "rsvp": "^3.0.0", + "vow": "^0.4.0", + "when": "^3.0.0", + "zuul": "^3.0.0" + } +} diff --git a/node_modules/any-promise/register-shim.js b/node_modules/any-promise/register-shim.js new file mode 100644 index 00000000..9049405c --- /dev/null +++ b/node_modules/any-promise/register-shim.js @@ -0,0 +1,18 @@ +"use strict"; +module.exports = require('./loader')(window, loadImplementation) + +/** + * Browser specific loadImplementation. Always uses `window.Promise` + * + * To register a custom implementation, must register with `Promise` option. + */ +function loadImplementation(){ + if(typeof window.Promise === 'undefined'){ + throw new Error("any-promise browser requires a polyfill or explicit registration"+ + " e.g: require('any-promise/register/bluebird')") + } + return { + Promise: window.Promise, + implementation: 'window.Promise' + } +} diff --git a/node_modules/any-promise/register.d.ts b/node_modules/any-promise/register.d.ts new file mode 100644 index 00000000..97f2fc05 --- /dev/null +++ b/node_modules/any-promise/register.d.ts @@ -0,0 +1,17 @@ +import Promise = require('./index'); + +declare function register (module?: string, options?: register.Options): register.Register; + +declare namespace register { + export interface Register { + Promise: typeof Promise; + implementation: string; + } + + export interface Options { + Promise?: typeof Promise; + global?: boolean + } +} + +export = register; diff --git a/node_modules/any-promise/register.js b/node_modules/any-promise/register.js new file mode 100644 index 00000000..255c6e2f --- /dev/null +++ b/node_modules/any-promise/register.js @@ -0,0 +1,94 @@ +"use strict" +module.exports = require('./loader')(global, loadImplementation); + +/** + * Node.js version of loadImplementation. + * + * Requires the given implementation and returns the registration + * containing {Promise, implementation} + * + * If implementation is undefined or global.Promise, loads it + * Otherwise uses require + */ +function loadImplementation(implementation){ + var impl = null + + if(shouldPreferGlobalPromise(implementation)){ + // if no implementation or env specified use global.Promise + impl = { + Promise: global.Promise, + implementation: 'global.Promise' + } + } else if(implementation){ + // if implementation specified, require it + var lib = require(implementation) + impl = { + Promise: lib.Promise || lib, + implementation: implementation + } + } else { + // try to auto detect implementation. This is non-deterministic + // and should prefer other branches, but this is our last chance + // to load something without throwing error + impl = tryAutoDetect() + } + + if(impl === null){ + throw new Error('Cannot find any-promise implementation nor'+ + ' global.Promise. You must install polyfill or call'+ + ' require("any-promise/register") with your preferred'+ + ' implementation, e.g. require("any-promise/register/bluebird")'+ + ' on application load prior to any require("any-promise").') + } + + return impl +} + +/** + * Determines if the global.Promise should be preferred if an implementation + * has not been registered. + */ +function shouldPreferGlobalPromise(implementation){ + if(implementation){ + return implementation === 'global.Promise' + } else if(typeof global.Promise !== 'undefined'){ + // Load global promise if implementation not specified + // Versions < 0.11 did not have global Promise + // Do not use for version < 0.12 as version 0.11 contained buggy versions + var version = (/v(\d+)\.(\d+)\.(\d+)/).exec(process.version) + return !(version && +version[1] == 0 && +version[2] < 12) + } + + // do not have global.Promise or another implementation was specified + return false +} + +/** + * Look for common libs as last resort there is no guarantee that + * this will return a desired implementation or even be deterministic. + * The priority is also nearly arbitrary. We are only doing this + * for older versions of Node.js <0.12 that do not have a reasonable + * global.Promise implementation and we the user has not registered + * the preference. This preserves the behavior of any-promise <= 0.1 + * and may be deprecated or removed in the future + */ +function tryAutoDetect(){ + var libs = [ + "es6-promise", + "promise", + "native-promise-only", + "bluebird", + "rsvp", + "when", + "q", + "pinkie", + "lie", + "vow"] + var i = 0, len = libs.length + for(; i < len; i++){ + try { + return loadImplementation(libs[i]) + } catch(e){} + } + return null +} diff --git a/node_modules/any-promise/register/bluebird.d.ts b/node_modules/any-promise/register/bluebird.d.ts new file mode 100644 index 00000000..336ce12b --- /dev/null +++ b/node_modules/any-promise/register/bluebird.d.ts @@ -0,0 +1 @@ +export {} diff --git a/node_modules/any-promise/register/bluebird.js b/node_modules/any-promise/register/bluebird.js new file mode 100644 index 00000000..de0f87eb --- /dev/null +++ b/node_modules/any-promise/register/bluebird.js @@ -0,0 +1,2 @@ +'use strict'; +require('../register')('bluebird', {Promise: require('bluebird')}) diff --git a/node_modules/any-promise/register/es6-promise.d.ts b/node_modules/any-promise/register/es6-promise.d.ts new file mode 100644 index 00000000..336ce12b --- /dev/null +++ b/node_modules/any-promise/register/es6-promise.d.ts @@ -0,0 +1 @@ +export {} diff --git a/node_modules/any-promise/register/es6-promise.js b/node_modules/any-promise/register/es6-promise.js new file mode 100644 index 00000000..59bd55b7 --- /dev/null +++ b/node_modules/any-promise/register/es6-promise.js @@ -0,0 +1,2 @@ +'use strict'; +require('../register')('es6-promise', {Promise: require('es6-promise').Promise}) diff --git a/node_modules/any-promise/register/lie.d.ts b/node_modules/any-promise/register/lie.d.ts new file mode 100644 index 00000000..336ce12b --- /dev/null +++ b/node_modules/any-promise/register/lie.d.ts @@ -0,0 +1 @@ +export {} diff --git a/node_modules/any-promise/register/lie.js b/node_modules/any-promise/register/lie.js new file mode 100644 index 00000000..7d305ca4 --- /dev/null +++ b/node_modules/any-promise/register/lie.js @@ -0,0 +1,2 @@ +'use strict'; +require('../register')('lie', {Promise: require('lie')}) diff --git a/node_modules/any-promise/register/native-promise-only.d.ts b/node_modules/any-promise/register/native-promise-only.d.ts new file mode 100644 index 00000000..336ce12b --- /dev/null +++ b/node_modules/any-promise/register/native-promise-only.d.ts @@ -0,0 +1 @@ +export {} diff --git a/node_modules/any-promise/register/native-promise-only.js b/node_modules/any-promise/register/native-promise-only.js new file mode 100644 index 00000000..70a5a5e1 --- /dev/null +++ b/node_modules/any-promise/register/native-promise-only.js @@ -0,0 +1,2 @@ +'use strict'; +require('../register')('native-promise-only', {Promise: require('native-promise-only')}) diff --git a/node_modules/any-promise/register/pinkie.d.ts b/node_modules/any-promise/register/pinkie.d.ts new file mode 100644 index 00000000..336ce12b --- /dev/null +++ b/node_modules/any-promise/register/pinkie.d.ts @@ -0,0 +1 @@ +export {} diff --git a/node_modules/any-promise/register/pinkie.js b/node_modules/any-promise/register/pinkie.js new file mode 100644 index 00000000..caaf98a5 --- /dev/null +++ b/node_modules/any-promise/register/pinkie.js @@ -0,0 +1,2 @@ +'use strict'; +require('../register')('pinkie', {Promise: require('pinkie')}) diff --git a/node_modules/any-promise/register/promise.d.ts b/node_modules/any-promise/register/promise.d.ts new file mode 100644 index 00000000..336ce12b --- /dev/null +++ b/node_modules/any-promise/register/promise.d.ts @@ -0,0 +1 @@ +export {} diff --git a/node_modules/any-promise/register/promise.js b/node_modules/any-promise/register/promise.js new file mode 100644 index 00000000..746620d4 --- /dev/null +++ b/node_modules/any-promise/register/promise.js @@ -0,0 +1,2 @@ +'use strict'; +require('../register')('promise', {Promise: require('promise')}) diff --git a/node_modules/any-promise/register/q.d.ts b/node_modules/any-promise/register/q.d.ts new file mode 100644 index 00000000..336ce12b --- /dev/null +++ b/node_modules/any-promise/register/q.d.ts @@ -0,0 +1 @@ +export {} diff --git a/node_modules/any-promise/register/q.js b/node_modules/any-promise/register/q.js new file mode 100644 index 00000000..0fc633a9 --- /dev/null +++ b/node_modules/any-promise/register/q.js @@ -0,0 +1,2 @@ +'use strict'; +require('../register')('q', {Promise: require('q').Promise}) diff --git a/node_modules/any-promise/register/rsvp.d.ts b/node_modules/any-promise/register/rsvp.d.ts new file mode 100644 index 00000000..336ce12b --- /dev/null +++ b/node_modules/any-promise/register/rsvp.d.ts @@ -0,0 +1 @@ +export {} diff --git a/node_modules/any-promise/register/rsvp.js b/node_modules/any-promise/register/rsvp.js new file mode 100644 index 00000000..02b13180 --- /dev/null +++ b/node_modules/any-promise/register/rsvp.js @@ -0,0 +1,2 @@ +'use strict'; +require('../register')('rsvp', {Promise: require('rsvp').Promise}) diff --git a/node_modules/any-promise/register/vow.d.ts b/node_modules/any-promise/register/vow.d.ts new file mode 100644 index 00000000..336ce12b --- /dev/null +++ b/node_modules/any-promise/register/vow.d.ts @@ -0,0 +1 @@ +export {} diff --git a/node_modules/any-promise/register/vow.js b/node_modules/any-promise/register/vow.js new file mode 100644 index 00000000..5b6868c4 --- /dev/null +++ b/node_modules/any-promise/register/vow.js @@ -0,0 +1,2 @@ +'use strict'; +require('../register')('vow', {Promise: require('vow').Promise}) diff --git a/node_modules/any-promise/register/when.d.ts b/node_modules/any-promise/register/when.d.ts new file mode 100644 index 00000000..336ce12b --- /dev/null +++ b/node_modules/any-promise/register/when.d.ts @@ -0,0 +1 @@ +export {} diff --git a/node_modules/any-promise/register/when.js b/node_modules/any-promise/register/when.js new file mode 100644 index 00000000..d91c13d3 --- /dev/null +++ b/node_modules/any-promise/register/when.js @@ -0,0 +1,2 @@ +'use strict'; +require('../register')('when', {Promise: require('when').Promise}) diff --git a/node_modules/assertion-error-formatter/CHANGELOG.md b/node_modules/assertion-error-formatter/CHANGELOG.md new file mode 100644 index 00000000..ed850090 --- /dev/null +++ b/node_modules/assertion-error-formatter/CHANGELOG.md @@ -0,0 +1,38 @@ +# 3.0.0 (2019-08-20) + +* drop support for Node 4, 6 +* support Node 10, 12 + +# 2.0.1 + +* support object errors without stack +* better formatting for errors where the stack does not include the message + +# 2.0.0 + +* support string errors +* update options structure + ```js + // Before + { + colorDiffAdded, + colorDiffRemoved, + colorErrorMessage, + inlineDiffs + } + + // After + { + colorFns: { + diffAdded, + diffRemoved, + errorMessage, + errorStack + }, + inlineDiffs + } + ``` + +# 1.0.1 + +* Initial release diff --git a/node_modules/assertion-error-formatter/LICENSE b/node_modules/assertion-error-formatter/LICENSE new file mode 100644 index 00000000..3e6bf323 --- /dev/null +++ b/node_modules/assertion-error-formatter/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016 Charlie Rudolph + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/assertion-error-formatter/README.md b/node_modules/assertion-error-formatter/README.md new file mode 100644 index 00000000..f2fc19a4 --- /dev/null +++ b/node_modules/assertion-error-formatter/README.md @@ -0,0 +1,22 @@ +# Node Assertion Error Formatter + +Format errors to display a diff between the actual and expected + +Originally extracted from [mocha](https://github.com/mochajs/mocha) + +## Usage +```js +import {format} from 'assertion-error-formatter' + +format(error) +``` + +## API Reference + +#### `format(error [, options])` + +* `error`: a javascript error +* `options`: An object with the following keys: + * `colorFns`: An object with the keys 'diffAdded', 'diffRemoved', 'errorMessage', 'errorStack'. The values are functions to colorize a string, each defaults to identity. + * `inlineDiff`: boolean (default: false) + * toggle between inline and unified diffs diff --git a/node_modules/assertion-error-formatter/lib/helpers/canonicalize.js b/node_modules/assertion-error-formatter/lib/helpers/canonicalize.js new file mode 100644 index 00000000..b05e9a97 --- /dev/null +++ b/node_modules/assertion-error-formatter/lib/helpers/canonicalize.js @@ -0,0 +1,52 @@ +"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.default = canonicalize;var _has_property = _interopRequireDefault(require("./has_property")); +var _type = _interopRequireDefault(require("./type"));function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} + +function canonicalize(value, stack) { + stack = stack || []; + + function withStack(fn) { + stack.push(value); + const result = fn(); + stack.pop(); + return result; + } + + if (stack.indexOf(value) !== -1) { + return '[Circular]'; + } + + switch ((0, _type.default)(value)) { + case 'array': + return withStack(function () { + return value.map(function (item) { + return canonicalize(item, stack); + }); + }); + case 'function': + if (!(0, _has_property.default)(value)) { + return '[Function]'; + } + /* falls through */ + case 'object': + return withStack(function () { + const canonicalizedObj = {}; + Object.keys(value). + sort(). + map(function (key) { + canonicalizedObj[key] = canonicalize(value[key], stack); + }); + return canonicalizedObj; + }); + case 'boolean': + case 'buffer': + case 'date': + case 'null': + case 'number': + case 'regexp': + case 'symbol': + case 'undefined': + return value; + default: + return value.toString();} + +} \ No newline at end of file diff --git a/node_modules/assertion-error-formatter/lib/helpers/canonicalize_test.js b/node_modules/assertion-error-formatter/lib/helpers/canonicalize_test.js new file mode 100644 index 00000000..d5116d41 --- /dev/null +++ b/node_modules/assertion-error-formatter/lib/helpers/canonicalize_test.js @@ -0,0 +1,69 @@ +"use strict";var _canonicalize = _interopRequireDefault(require("./canonicalize")); +var _mocha = require("mocha"); +var _chai = require("chai");function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} + +function functionWithProperties() {} +functionWithProperties.a = 1; + +const circularObject = {}; +circularObject.a = circularObject; + +const circularArray = []; +circularArray.push(circularArray); + +const nestedCircular = { a: [{}] }; +nestedCircular.a[0].a = nestedCircular; + +const examples = [ +{ + input: { b: 1, a: 2 }, + inputDescription: 'an object with unsorted keys', + output: { a: 2, b: 1 }, + outputDescription: 'the object with sorted keys' }, + +{ + input() {}, + inputDescription: 'function without properties', + output: '[Function]', + outputDescription: '[Function]' }, + +{ + input: functionWithProperties, + inputDescription: 'function with properties', + output: { a: 1 }, + outputDescription: 'the object' }, + +{ + input: circularObject, + inputDescription: 'circular object', + output: { a: '[Circular]' }, + outputDescription: 'the circular property as [Circular]' }, + +{ + input: circularArray, + inputDescription: 'circular array', + output: ['[Circular]'], + outputDescription: 'the circular property as [Circular]' }, + +{ + input: nestedCircular, + inputDescription: 'nested circular object', + output: { a: [{ a: '[Circular]' }] }, + outputDescription: 'the circular property as [Circular]' }]; + + + +(0, _mocha.describe)('canonicalize', function () { + examples.forEach(function ({ + input, + inputDescription, + output, + outputDescription }) + { + (0, _mocha.describe)('input is ' + inputDescription, function () { + (0, _mocha.it)('returns ' + outputDescription, function () { + (0, _chai.expect)((0, _canonicalize.default)(input)).to.eql(output); + }); + }); + }); +}); \ No newline at end of file diff --git a/node_modules/assertion-error-formatter/lib/helpers/has_property.js b/node_modules/assertion-error-formatter/lib/helpers/has_property.js new file mode 100644 index 00000000..f3ad3750 --- /dev/null +++ b/node_modules/assertion-error-formatter/lib/helpers/has_property.js @@ -0,0 +1,8 @@ +"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.default = hasProperty;function hasProperty(obj) { + for (const prop in obj) { + if (Object.prototype.hasOwnProperty.call(obj, prop)) { + return true; + } + } + return false; +} \ No newline at end of file diff --git a/node_modules/assertion-error-formatter/lib/helpers/inline_diff.js b/node_modules/assertion-error-formatter/lib/helpers/inline_diff.js new file mode 100644 index 00000000..324ff7f0 --- /dev/null +++ b/node_modules/assertion-error-formatter/lib/helpers/inline_diff.js @@ -0,0 +1,43 @@ +"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.default = inlineDiff;var _diff = require("diff"); +var _padRight = _interopRequireDefault(require("pad-right"));function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} + +function inlineDiff(actual, expected, colorFns) { + let msg = errorDiff(actual, expected, colorFns); + + // linenos + const lines = msg.split('\n'); + if (lines.length > 4) { + const width = String(lines.length).length; + msg = lines. + map(function (str, i) { + return (0, _padRight.default)(i + 1, width, ' ') + '|' + ' ' + str; + }). + join('\n'); + } + + // legend + msg = + '\n ' + + colorFns.diffRemoved('actual') + + ' ' + + colorFns.diffAdded('expected') + + '\n\n' + + msg.replace(/^/gm, ' ') + + '\n'; + + return msg; +} + +function errorDiff(actual, expected, colorFns) { + return (0, _diff.diffWordsWithSpace)(actual, expected). + map(function (str) { + if (str.added) { + return colorFns.diffAdded(str.value); + } + if (str.removed) { + return colorFns.diffRemoved(str.value); + } + return str.value; + }). + join(''); +} \ No newline at end of file diff --git a/node_modules/assertion-error-formatter/lib/helpers/json_stringify.js b/node_modules/assertion-error-formatter/lib/helpers/json_stringify.js new file mode 100644 index 00000000..c69b58b6 --- /dev/null +++ b/node_modules/assertion-error-formatter/lib/helpers/json_stringify.js @@ -0,0 +1,80 @@ +"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.default = jsonStringify;var _repeatString = _interopRequireDefault(require("repeat-string")); +var _type = _interopRequireDefault(require("./type"));function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} + +function jsonStringify(object, depth) { + depth = depth || 1; + + switch ((0, _type.default)(object)) { + case 'boolean': + case 'regexp': + case 'symbol': + return object.toString(); + case 'null': + case 'undefined': + return '[' + object + ']'; + case 'array': + case 'object': + return jsonStringifyProperties(object, depth); + case 'number': + if (object === 0 && 1 / object === -Infinity) { + return '-0'; + } else { + return object.toString(); + } + case 'date': + return jsonStringifyDate(object); + case 'buffer': + return jsonStringifyBuffer(object, depth); + default: + if (object === '[Function]' || object === '[Circular]') { + return object; + } else { + return JSON.stringify(object); // string + }} + +} + +function jsonStringifyBuffer(object, depth) { + const { data } = object.toJSON(); + return '[Buffer: ' + jsonStringify(data, depth) + ']'; +} + +function jsonStringifyDate(object) { + let str; + if (isNaN(object.getTime())) { + str = object.toString(); + } else { + str = object.toISOString(); + } + return '[Date: ' + str + ']'; +} + +function jsonStringifyProperties(object, depth) { + const space = 2 * depth; + const start = (0, _type.default)(object) === 'array' ? '[' : '{'; + const end = (0, _type.default)(object) === 'array' ? ']' : '}'; + const length = + typeof object.length === 'number' ? + object.length : + Object.keys(object).length; + let addedProperties = 0; + let str = start; + + for (const prop in object) { + if (Object.prototype.hasOwnProperty.call(object, prop)) { + addedProperties += 1; + str += + '\n' + + (0, _repeatString.default)(' ', space) + ( + (0, _type.default)(object) === 'array' ? '' : '"' + prop + '": ') + + jsonStringify(object[prop], depth + 1) + ( + addedProperties === length ? '' : ','); + } + } + + if (str.length !== 1) { + str += '\n' + (0, _repeatString.default)(' ', space - 2); + } + + return str + end; +} \ No newline at end of file diff --git a/node_modules/assertion-error-formatter/lib/helpers/stringify.js b/node_modules/assertion-error-formatter/lib/helpers/stringify.js new file mode 100644 index 00000000..ef927128 --- /dev/null +++ b/node_modules/assertion-error-formatter/lib/helpers/stringify.js @@ -0,0 +1,6 @@ +"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.default = stringify;var _canonicalize = _interopRequireDefault(require("./canonicalize")); +var _json_stringify = _interopRequireDefault(require("./json_stringify"));function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} + +function stringify(value) { + return (0, _json_stringify.default)((0, _canonicalize.default)(value)).replace(/,(\n|$)/g, '$1'); +} \ No newline at end of file diff --git a/node_modules/assertion-error-formatter/lib/helpers/stringify_test.js b/node_modules/assertion-error-formatter/lib/helpers/stringify_test.js new file mode 100644 index 00000000..0573b7bf --- /dev/null +++ b/node_modules/assertion-error-formatter/lib/helpers/stringify_test.js @@ -0,0 +1,112 @@ +"use strict";var _stringify = _interopRequireDefault(require("./stringify")); +var _mocha = require("mocha"); +var _chai = require("chai");function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} + +function functionWithProperties() {} +functionWithProperties.a = 1; + +const circularObject = {}; +circularObject.a = circularObject; + +const circularArray = []; +circularArray.push(circularArray); + +const nestedCircular = { a: [{}] }; +nestedCircular.a[0].a = nestedCircular; + +const examples = [ +{ + input: { b: 1, a: 2 }, + inputDescription: 'an object with unsorted keys', + output: '{\n' + ' "a": 2\n' + ' "b": 1\n' + '}', + outputDescription: 'the object with sorted keys' }, + +{ + input() {}, + inputDescription: 'function with not properties', + output: '[Function]', + outputDescription: '[Function]' }, + +{ + input: functionWithProperties, + inputDescription: 'function with properties', + output: '{\n' + ' "a": 1\n' + '}', + outputDescription: 'the object' }, + +{ + input: circularObject, + inputDescription: 'circular object', + output: '{\n' + ' "a": [Circular]\n' + '}', + outputDescription: 'the circular property as [Circular]' }, + +{ + input: circularArray, + inputDescription: 'circular array', + output: '[\n' + ' [Circular]\n' + ']', + outputDescription: 'the circular property as [Circular]' }, + +{ + input: nestedCircular, + inputDescription: 'nested circular object', + output: + '{\n' + + ' "a": [\n' + + ' {\n' + + ' "a": [Circular]\n' + + ' }\n' + + ' ]\n' + + '}', + outputDescription: 'the circular property as [Circular]' }, + +{ + input: null, + inputDescription: 'null', + output: '[null]', + outputDescription: '[null]' }, + +{ + input: undefined, + inputDescription: 'undefined', + output: '[undefined]', + outputDescription: '[undefined]' }, + +{ + input: -0, + inputDescription: '-0', + output: '-0', + outputDescription: '-0' }, + +{ + input: new Date(0), + inputDescription: 'valid date', + output: '[Date: 1970-01-01T00:00:00.000Z]', + outputDescription: '[Date ]' }, + +{ + input: new Date(NaN), + inputDescription: 'invalid date', + output: '[Date: Invalid Date]', + outputDescription: '[Date Invalid Date]' }, + +{ + input: Buffer.from([1, 2, 3]), + inputDescription: 'buffer', + output: '[Buffer: [\n' + ' 1\n' + ' 2\n' + ' 3\n' + ']]', + outputDescription: '[Buffer ]' }]; + + + +(0, _mocha.describe)('stringify', function () { + examples.forEach(function ({ + input, + inputDescription, + output, + outputDescription }) + { + (0, _mocha.describe)('input is ' + inputDescription, function () { + (0, _mocha.it)('returns ' + outputDescription, function () { + (0, _chai.expect)((0, _stringify.default)(input)).to.eql(output); + }); + }); + }); +}); \ No newline at end of file diff --git a/node_modules/assertion-error-formatter/lib/helpers/type.js b/node_modules/assertion-error-formatter/lib/helpers/type.js new file mode 100644 index 00000000..0497cfb5 --- /dev/null +++ b/node_modules/assertion-error-formatter/lib/helpers/type.js @@ -0,0 +1,13 @@ +"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.default = type;function type(value) { + if (value === undefined) { + return 'undefined'; + } else if (value === null) { + return 'null'; + } else if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) { + return 'buffer'; + } + return Object.prototype.toString. + call(value). + replace(/^\[.+\s(.+?)\]$/, '$1'). + toLowerCase(); +} \ No newline at end of file diff --git a/node_modules/assertion-error-formatter/lib/helpers/type_test.js b/node_modules/assertion-error-formatter/lib/helpers/type_test.js new file mode 100644 index 00000000..cab7c377 --- /dev/null +++ b/node_modules/assertion-error-formatter/lib/helpers/type_test.js @@ -0,0 +1,71 @@ +"use strict";var _type = _interopRequireDefault(require("./type")); +var _mocha = require("mocha"); +var _chai = require("chai");function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} + +const examples = [ +{ + description: 'an object', + input: {}, + output: 'object' }, + +{ + description: 'an array', + input: [], + output: 'array' }, + +{ + description: 'a number', + input: 1, + output: 'number' }, + +{ + description: 'a boolean', + input: false, + output: 'boolean' }, + +{ + description: 'string', + input: 'a', + output: 'string' }, + +{ + description: 'Infinity', + input: Infinity, + output: 'number' }, + +{ + description: 'null', + input: null, + output: 'null' }, + +{ + description: 'undefined', + input: undefined, + output: 'undefined' }, + +{ + description: 'Date', + input: new Date(), + output: 'date' }, + +{ + description: 'regular expression', + input: /foo/, + output: 'regexp' }, + +{ + description: 'global', + input: global, + output: 'global' }]; + + + +(0, _mocha.describe)('type', function () { + examples.forEach(function ({ description, input, output }) { + (0, _mocha.describe)('input is ' + description, function () { + (0, _mocha.it)('returns ' + output, function () { + (0, _chai.expect)((0, _type.default)(input)).to.eql(output); + }); + }); + }); +}); \ No newline at end of file diff --git a/node_modules/assertion-error-formatter/lib/helpers/unified_diff.js b/node_modules/assertion-error-formatter/lib/helpers/unified_diff.js new file mode 100644 index 00000000..1efb137d --- /dev/null +++ b/node_modules/assertion-error-formatter/lib/helpers/unified_diff.js @@ -0,0 +1,40 @@ +"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.default = unifiedDiff;var _diff = require("diff"); + +function unifiedDiff(actual, expected, colorFns) { + const indent = ' '; + function cleanUp(line) { + if (line.length === 0) { + return ''; + } + if (line[0] === '+') { + return indent + colorFns.diffAdded(line); + } + if (line[0] === '-') { + return indent + colorFns.diffRemoved(line); + } + if (line.match(/@@/)) { + return null; + } + if (line.match(/\\ No newline/)) { + return null; + } + return indent + line; + } + function notBlank(line) { + return typeof line !== 'undefined' && line !== null; + } + const msg = (0, _diff.createPatch)('string', actual, expected); + const lines = msg.split('\n').splice(4); + return ( + '\n' + + indent + + colorFns.diffAdded('+ expected') + + ' ' + + colorFns.diffRemoved('- actual') + + '\n\n' + + lines. + map(cleanUp). + filter(notBlank). + join('\n')); + +} \ No newline at end of file diff --git a/node_modules/assertion-error-formatter/lib/index.js b/node_modules/assertion-error-formatter/lib/index.js new file mode 100644 index 00000000..38d30495 --- /dev/null +++ b/node_modules/assertion-error-formatter/lib/index.js @@ -0,0 +1,80 @@ +"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.format = format;var _inline_diff = _interopRequireDefault(require("./helpers/inline_diff")); +var _stringify = _interopRequireDefault(require("./helpers/stringify")); +var _type = _interopRequireDefault(require("./helpers/type")); +var _unified_diff = _interopRequireDefault(require("./helpers/unified_diff"));function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} + +function identity(x) { + return x; +} + +function format(err, options) { + if (!options) { + options = {}; + } + if (!options.colorFns) { + options.colorFns = {}; + } + ['diffAdded', 'diffRemoved', 'errorMessage', 'errorStack'].forEach(function ( + key) + { + if (!options.colorFns[key]) { + options.colorFns[key] = identity; + } + }); + + let message; + if (err.message && typeof err.message.toString === 'function') { + message = err.message + ''; + } else if (typeof err.inspect === 'function') { + message = err.inspect() + ''; + } else if (typeof err === 'string') { + message = err; + } else { + message = JSON.stringify(err); + } + + let stack = err.stack || message; + const startOfMessageIndex = stack.indexOf(message); + if (startOfMessageIndex === -1) { + stack = '\n' + stack; + } else { + const endOfMessageIndex = startOfMessageIndex + message.length; + message = stack.slice(0, endOfMessageIndex); + stack = stack.slice(endOfMessageIndex); // remove message from stack + } + + if (err.uncaught) { + message = 'Uncaught ' + message; + } + + let actual = err.actual; + let expected = err.expected; + + if ( + err.showDiff !== false && + (0, _type.default)(actual) === (0, _type.default)(expected) && + expected !== undefined) + { + if (!((0, _type.default)(actual) === 'string' && (0, _type.default)(expected) === 'string')) { + actual = (0, _stringify.default)(actual); + expected = (0, _stringify.default)(expected); + } + + const match = message.match(/^([^:]+): expected/); + message = options.colorFns.errorMessage(match ? match[1] : message); + + if (options.inlineDiff) { + message += (0, _inline_diff.default)(actual, expected, options.colorFns); + } else { + message += (0, _unified_diff.default)(actual, expected, options.colorFns); + } + } else { + message = options.colorFns.errorMessage(message); + } + + if (stack) { + stack = options.colorFns.errorStack(stack); + } + + return message + stack; +} \ No newline at end of file diff --git a/node_modules/assertion-error-formatter/lib/index_test.js b/node_modules/assertion-error-formatter/lib/index_test.js new file mode 100644 index 00000000..c0620ee3 --- /dev/null +++ b/node_modules/assertion-error-formatter/lib/index_test.js @@ -0,0 +1,165 @@ +"use strict";var _ = require("./"); +var _mocha = require("mocha"); +var _chai = require("chai"); + +(0, _mocha.describe)('AssertionErrorFormatter', function () { + (0, _mocha.describe)('format', function () { + (0, _mocha.beforeEach)(function () { + this.options = { + colorFns: { + diffAdded(x) { + return '' + x + ''; + }, + diffRemoved(x) { + return '' + x + ''; + }, + errorMessage(x) { + return '' + x + ''; + }, + errorStack(x) { + return '' + x + ''; + } } }; + + + }); + + (0, _mocha.describe)('with assertion error', function () { + (0, _mocha.describe)('unified diffs', function () { + (0, _mocha.it)('should show string diffs', function () { + const error = { + actual: 'foo', + expected: 'bar', + message: "'foo' to equal 'bar'", + stack: "'foo' to equal 'bar'\n line1\n line2\n line3" }; + + (0, _chai.expect)((0, _.format)(error, this.options)).to.eql( + "'foo' to equal 'bar'\n" + + ' + expected - actual\n' + + '\n' + + ' -foo\n' + + ' +bar\n' + + '\n' + + ' line1\n' + + ' line2\n' + + ' line3'); + + }); + + (0, _mocha.it)('should show object diffs', function () { + const error = { + actual: { x: 1, y: 2 }, + expected: { x: 1, y: 3 }, + message: '{ x: 1, y: 2 } to equal { x: 1, y: 3 }', + stack: + '{ x: 1, y: 2 } to equal { x: 1, y: 3 }\n line1\n line2\n line3' }; + + (0, _chai.expect)((0, _.format)(error, this.options)).to.eql( + '{ x: 1, y: 2 } to equal { x: 1, y: 3 }\n' + + ' + expected - actual\n' + + '\n' + + ' {\n' + + ' "x": 1\n' + + ' - "y": 2\n' + + ' + "y": 3\n' + + ' }\n' + + '\n' + + ' line1\n' + + ' line2\n' + + ' line3'); + + }); + }); + + (0, _mocha.describe)('inline diffs', function () { + (0, _mocha.beforeEach)(function () { + this.options.inlineDiff = true; + }); + + (0, _mocha.it)('should show string diffs', function () { + const error = { + actual: 'foo', + expected: 'bar', + message: "'foo' to equal 'bar'", + stack: "'foo' to equal 'bar'\n line1\n line2\n line3" }; + + (0, _chai.expect)((0, _.format)(error, this.options)).to.eql( + "'foo' to equal 'bar'\n" + + ' actual expected\n' + + '\n' + + ' foobar\n' + + '\n' + + ' line1\n' + + ' line2\n' + + ' line3'); + + }); + + (0, _mocha.it)('should show object diffs', function () { + const error = { + actual: { x: 1, y: 2 }, + expected: { x: 1, y: 3 }, + message: '{ x: 1, y: 2 } to equal { x: 1, y: 3 }', + stack: + '{ x: 1, y: 2 } to equal { x: 1, y: 3 }\n line1\n line2\n line3' }; + + (0, _chai.expect)((0, _.format)(error, this.options)).to.eql( + '{ x: 1, y: 2 } to equal { x: 1, y: 3 }\n' + + ' actual expected\n' + + '\n' + + ' {\n' + + ' "x": 1\n' + + ' "y": 23\n' + + ' }\n' + + '\n' + + ' line1\n' + + ' line2\n' + + ' line3'); + + }); + }); + }); + + (0, _mocha.describe)('with other error', function () { + (0, _mocha.describe)('message is in the stack', function () { + (0, _mocha.it)('returns the stack only', function () { + const error = { + message: 'abc', + stack: 'abc\n line1\n line2\n line3' }; + + (0, _chai.expect)((0, _.format)(error, this.options)).to.eql( + 'abc\n' + + ' line1\n' + + ' line2\n' + + ' line3'); + + }); + }); + + (0, _mocha.describe)('message is not in the stack', function () { + (0, _mocha.it)('returns the message and the stack', function () { + const error = { + message: 'abc', + stack: 'line1\nline2\nline3' }; + + (0, _chai.expect)((0, _.format)(error, this.options)).to.eql( + 'abc\n' + 'line1\n' + 'line2\n' + 'line3'); + + }); + }); + }); + + (0, _mocha.describe)('with string', function () { + (0, _mocha.it)('outputs the string', function () { + (0, _chai.expect)((0, _.format)('abc', this.options)).to.eql('abc'); + }); + }); + + (0, _mocha.describe)('with object', function () { + (0, _mocha.it)('outputs the json stringified object', function () { + (0, _chai.expect)((0, _.format)({ x: 1, y: 2 }, this.options)).to.eql( + '{"x":1,"y":2}'); + + }); + }); + }); +}); \ No newline at end of file diff --git a/node_modules/assertion-error-formatter/package.json b/node_modules/assertion-error-formatter/package.json new file mode 100644 index 00000000..bec51f09 --- /dev/null +++ b/node_modules/assertion-error-formatter/package.json @@ -0,0 +1,57 @@ +{ + "name": "assertion-error-formatter", + "version": "3.0.0", + "main": "lib/index.js", + "scripts": { + "build": "babel src -d lib --ignore '**/*_test.js' --retain-lines", + "lint": "yarn run lint-js && yarn run lint-dependencies", + "lint-dependencies": "dependency-lint", + "lint-js": "eslint src/** test/test_helper.js", + "prepublish": "yarn run build", + "test": "yarn run lint && yarn run unit-test", + "unit-test": "mocha src" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/charlierudolph/node-assertion-error-formatter.git" + }, + "author": { + "name": "Charlie Rudolph", + "email": "charles.w.rudolph@gmail.com" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/charlierudolph/node-assertion-error-formatter/issues" + }, + "homepage": "https://github.com/charlierudolph/node-assertion-error-formatter", + "devDependencies": { + "@babel/cli": "^7.5.5", + "@babel/core": "^7.5.5", + "@babel/preset-env": "^7.5.5", + "@babel/register": "^7.5.5", + "babel-eslint": "^10.0.2", + "chai": "^4.2.0", + "dependency-lint": "^6.0.0", + "eslint": "~6.1.0", + "eslint-config-prettier": "^6.1.0", + "eslint-config-standard": "^14.0.0", + "eslint-plugin-babel": "^5.3.0", + "eslint-plugin-import": "^2.18.2", + "eslint-plugin-node": "^9.1.0", + "eslint-plugin-prettier": "^3.1.0", + "eslint-plugin-promise": "^4.2.1", + "eslint-plugin-standard": "^4.0.1", + "mocha": "^6.2.0", + "prettier": "^1.18.2", + "sinon": "^7.4.1", + "sinon-chai": "^3.3.0" + }, + "dependencies": { + "diff": "^4.0.1", + "pad-right": "^0.2.2", + "repeat-string": "^1.6.1" + }, + "files": [ + "lib" + ] +} diff --git a/node_modules/balanced-match/LICENSE.md b/node_modules/balanced-match/LICENSE.md new file mode 100644 index 00000000..61ece8cc --- /dev/null +++ b/node_modules/balanced-match/LICENSE.md @@ -0,0 +1,23 @@ +(MIT) + +Original code Copyright Julian Gruber + +Port to TypeScript Copyright Isaac Z. Schlueter + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/balanced-match/README.md b/node_modules/balanced-match/README.md new file mode 100644 index 00000000..f3bb3773 --- /dev/null +++ b/node_modules/balanced-match/README.md @@ -0,0 +1,57 @@ +# balanced-match + +Match balanced string pairs, like `{` and `}` or `` and +``. Supports regular expressions as well! + +## Example + +Get the first matching pair of braces: + +```js +import { balanced } from 'balanced-match' + +console.log(balanced('{', '}', 'pre{in{nested}}post')) +console.log(balanced('{', '}', 'pre{first}between{second}post')) +console.log( + balanced(/\s+\{\s+/, /\s+\}\s+/, 'pre { in{nest} } post'), +) +``` + +The matches are: + +```bash +$ node example.js +{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' } +{ start: 3, + end: 9, + pre: 'pre', + body: 'first', + post: 'between{second}post' } +{ start: 3, end: 17, pre: 'pre', body: 'in{nest}', post: 'post' } +``` + +## API + +### const m = balanced(a, b, str) + +For the first non-nested matching pair of `a` and `b` in `str`, return an +object with those keys: + +- **start** the index of the first match of `a` +- **end** the index of the matching `b` +- **pre** the preamble, `a` and `b` not included +- **body** the match, `a` and `b` not included +- **post** the postscript, `a` and `b` not included + +If there's no match, `undefined` will be returned. + +If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']` and `{a}}` will match `['', 'a', '}']`. + +### const r = balanced.range(a, b, str) + +For the first non-nested matching pair of `a` and `b` in `str`, return an +array with indexes: `[ , ]`. + +If there's no match, `undefined` will be returned. + +If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `[ 1, 3 ]` and `{a}}` will match `[0, 2]`. diff --git a/node_modules/balanced-match/dist/commonjs/index.d.ts b/node_modules/balanced-match/dist/commonjs/index.d.ts new file mode 100644 index 00000000..f819cfd0 --- /dev/null +++ b/node_modules/balanced-match/dist/commonjs/index.d.ts @@ -0,0 +1,9 @@ +export declare const balanced: (a: string | RegExp, b: string | RegExp, str: string) => false | { + start: number; + end: number; + pre: string; + body: string; + post: string; +} | undefined; +export declare const range: (a: string, b: string, str: string) => undefined | [number, number]; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/balanced-match/dist/commonjs/index.d.ts.map b/node_modules/balanced-match/dist/commonjs/index.d.ts.map new file mode 100644 index 00000000..6306762c --- /dev/null +++ b/node_modules/balanced-match/dist/commonjs/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,GACnB,GAAG,MAAM,GAAG,MAAM,EAClB,GAAG,MAAM,GAAG,MAAM,EAClB,KAAK,MAAM;;;;;;aAgBZ,CAAA;AAOD,eAAO,MAAM,KAAK,GAChB,GAAG,MAAM,EACT,GAAG,MAAM,EACT,KAAK,MAAM,KACV,SAAS,GAAG,CAAC,MAAM,EAAE,MAAM,CA2C7B,CAAA"} \ No newline at end of file diff --git a/node_modules/balanced-match/dist/commonjs/index.js b/node_modules/balanced-match/dist/commonjs/index.js new file mode 100644 index 00000000..0c9014ba --- /dev/null +++ b/node_modules/balanced-match/dist/commonjs/index.js @@ -0,0 +1,59 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.range = exports.balanced = void 0; +const balanced = (a, b, str) => { + const ma = a instanceof RegExp ? maybeMatch(a, str) : a; + const mb = b instanceof RegExp ? maybeMatch(b, str) : b; + const r = ma !== null && mb != null && (0, exports.range)(ma, mb, str); + return (r && { + start: r[0], + end: r[1], + pre: str.slice(0, r[0]), + body: str.slice(r[0] + ma.length, r[1]), + post: str.slice(r[1] + mb.length), + }); +}; +exports.balanced = balanced; +const maybeMatch = (reg, str) => { + const m = str.match(reg); + return m ? m[0] : null; +}; +const range = (a, b, str) => { + let begs, beg, left, right = undefined, result; + let ai = str.indexOf(a); + let bi = str.indexOf(b, ai + 1); + let i = ai; + if (ai >= 0 && bi > 0) { + if (a === b) { + return [ai, bi]; + } + begs = []; + left = str.length; + while (i >= 0 && !result) { + if (i === ai) { + begs.push(i); + ai = str.indexOf(a, i + 1); + } + else if (begs.length === 1) { + const r = begs.pop(); + if (r !== undefined) + result = [r, bi]; + } + else { + beg = begs.pop(); + if (beg !== undefined && beg < left) { + left = beg; + right = bi; + } + bi = str.indexOf(b, i + 1); + } + i = ai < bi && ai >= 0 ? ai : bi; + } + if (begs.length && right !== undefined) { + result = [left, right]; + } + } + return result; +}; +exports.range = range; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/balanced-match/dist/commonjs/index.js.map b/node_modules/balanced-match/dist/commonjs/index.js.map new file mode 100644 index 00000000..83f547ca --- /dev/null +++ b/node_modules/balanced-match/dist/commonjs/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAO,MAAM,QAAQ,GAAG,CACtB,CAAkB,EAClB,CAAkB,EAClB,GAAW,EACX,EAAE;IACF,MAAM,EAAE,GAAG,CAAC,YAAY,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACvD,MAAM,EAAE,GAAG,CAAC,YAAY,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAEvD,MAAM,CAAC,GAAG,EAAE,KAAK,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAA,aAAK,EAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;IAEzD,OAAO,CACL,CAAC,IAAI;QACH,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QACX,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QACT,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC;KAClC,CACF,CAAA;AACH,CAAC,CAAA;AAnBY,QAAA,QAAQ,YAmBpB;AAED,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,GAAW,EAAE,EAAE;IAC9C,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACxB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AACxB,CAAC,CAAA;AAEM,MAAM,KAAK,GAAG,CACnB,CAAS,EACT,CAAS,EACT,GAAW,EACmB,EAAE;IAChC,IAAI,IAAc,EAChB,GAAuB,EACvB,IAAY,EACZ,KAAK,GAAuB,SAAS,EACrC,MAAoC,CAAA;IACtC,IAAI,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IACvB,IAAI,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAA;IAC/B,IAAI,CAAC,GAAG,EAAE,CAAA;IAEV,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACZ,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QACjB,CAAC;QACD,IAAI,GAAG,EAAE,CAAA;QACT,IAAI,GAAG,GAAG,CAAC,MAAM,CAAA;QAEjB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;gBACb,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACZ,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;YAC5B,CAAC;iBAAM,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;gBACpB,IAAI,CAAC,KAAK,SAAS;oBAAE,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACvC,CAAC;iBAAM,CAAC;gBACN,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;gBAChB,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,GAAG,IAAI,EAAE,CAAC;oBACpC,IAAI,GAAG,GAAG,CAAA;oBACV,KAAK,GAAG,EAAE,CAAA;gBACZ,CAAC;gBAED,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;YAC5B,CAAC;YAED,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QAClC,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACvC,MAAM,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACxB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AA/CY,QAAA,KAAK,SA+CjB","sourcesContent":["export const balanced = (\n a: string | RegExp,\n b: string | RegExp,\n str: string,\n) => {\n const ma = a instanceof RegExp ? maybeMatch(a, str) : a\n const mb = b instanceof RegExp ? maybeMatch(b, str) : b\n\n const r = ma !== null && mb != null && range(ma, mb, str)\n\n return (\n r && {\n start: r[0],\n end: r[1],\n pre: str.slice(0, r[0]),\n body: str.slice(r[0] + ma.length, r[1]),\n post: str.slice(r[1] + mb.length),\n }\n )\n}\n\nconst maybeMatch = (reg: RegExp, str: string) => {\n const m = str.match(reg)\n return m ? m[0] : null\n}\n\nexport const range = (\n a: string,\n b: string,\n str: string,\n): undefined | [number, number] => {\n let begs: number[],\n beg: number | undefined,\n left: number,\n right: number | undefined = undefined,\n result: undefined | [number, number]\n let ai = str.indexOf(a)\n let bi = str.indexOf(b, ai + 1)\n let i = ai\n\n if (ai >= 0 && bi > 0) {\n if (a === b) {\n return [ai, bi]\n }\n begs = []\n left = str.length\n\n while (i >= 0 && !result) {\n if (i === ai) {\n begs.push(i)\n ai = str.indexOf(a, i + 1)\n } else if (begs.length === 1) {\n const r = begs.pop()\n if (r !== undefined) result = [r, bi]\n } else {\n beg = begs.pop()\n if (beg !== undefined && beg < left) {\n left = beg\n right = bi\n }\n\n bi = str.indexOf(b, i + 1)\n }\n\n i = ai < bi && ai >= 0 ? ai : bi\n }\n\n if (begs.length && right !== undefined) {\n result = [left, right]\n }\n }\n\n return result\n}\n"]} \ No newline at end of file diff --git a/node_modules/balanced-match/dist/commonjs/package.json b/node_modules/balanced-match/dist/commonjs/package.json new file mode 100644 index 00000000..5bbefffb --- /dev/null +++ b/node_modules/balanced-match/dist/commonjs/package.json @@ -0,0 +1,3 @@ +{ + "type": "commonjs" +} diff --git a/node_modules/balanced-match/dist/esm/index.d.ts b/node_modules/balanced-match/dist/esm/index.d.ts new file mode 100644 index 00000000..f819cfd0 --- /dev/null +++ b/node_modules/balanced-match/dist/esm/index.d.ts @@ -0,0 +1,9 @@ +export declare const balanced: (a: string | RegExp, b: string | RegExp, str: string) => false | { + start: number; + end: number; + pre: string; + body: string; + post: string; +} | undefined; +export declare const range: (a: string, b: string, str: string) => undefined | [number, number]; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/balanced-match/dist/esm/index.d.ts.map b/node_modules/balanced-match/dist/esm/index.d.ts.map new file mode 100644 index 00000000..6306762c --- /dev/null +++ b/node_modules/balanced-match/dist/esm/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,GACnB,GAAG,MAAM,GAAG,MAAM,EAClB,GAAG,MAAM,GAAG,MAAM,EAClB,KAAK,MAAM;;;;;;aAgBZ,CAAA;AAOD,eAAO,MAAM,KAAK,GAChB,GAAG,MAAM,EACT,GAAG,MAAM,EACT,KAAK,MAAM,KACV,SAAS,GAAG,CAAC,MAAM,EAAE,MAAM,CA2C7B,CAAA"} \ No newline at end of file diff --git a/node_modules/balanced-match/dist/esm/index.js b/node_modules/balanced-match/dist/esm/index.js new file mode 100644 index 00000000..fe81200f --- /dev/null +++ b/node_modules/balanced-match/dist/esm/index.js @@ -0,0 +1,54 @@ +export const balanced = (a, b, str) => { + const ma = a instanceof RegExp ? maybeMatch(a, str) : a; + const mb = b instanceof RegExp ? maybeMatch(b, str) : b; + const r = ma !== null && mb != null && range(ma, mb, str); + return (r && { + start: r[0], + end: r[1], + pre: str.slice(0, r[0]), + body: str.slice(r[0] + ma.length, r[1]), + post: str.slice(r[1] + mb.length), + }); +}; +const maybeMatch = (reg, str) => { + const m = str.match(reg); + return m ? m[0] : null; +}; +export const range = (a, b, str) => { + let begs, beg, left, right = undefined, result; + let ai = str.indexOf(a); + let bi = str.indexOf(b, ai + 1); + let i = ai; + if (ai >= 0 && bi > 0) { + if (a === b) { + return [ai, bi]; + } + begs = []; + left = str.length; + while (i >= 0 && !result) { + if (i === ai) { + begs.push(i); + ai = str.indexOf(a, i + 1); + } + else if (begs.length === 1) { + const r = begs.pop(); + if (r !== undefined) + result = [r, bi]; + } + else { + beg = begs.pop(); + if (beg !== undefined && beg < left) { + left = beg; + right = bi; + } + bi = str.indexOf(b, i + 1); + } + i = ai < bi && ai >= 0 ? ai : bi; + } + if (begs.length && right !== undefined) { + result = [left, right]; + } + } + return result; +}; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/balanced-match/dist/esm/index.js.map b/node_modules/balanced-match/dist/esm/index.js.map new file mode 100644 index 00000000..b476cae2 --- /dev/null +++ b/node_modules/balanced-match/dist/esm/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["export const balanced = (\n a: string | RegExp,\n b: string | RegExp,\n str: string,\n) => {\n const ma = a instanceof RegExp ? maybeMatch(a, str) : a\n const mb = b instanceof RegExp ? maybeMatch(b, str) : b\n\n const r = ma !== null && mb != null && range(ma, mb, str)\n\n return (\n r && {\n start: r[0],\n end: r[1],\n pre: str.slice(0, r[0]),\n body: str.slice(r[0] + ma.length, r[1]),\n post: str.slice(r[1] + mb.length),\n }\n )\n}\n\nconst maybeMatch = (reg: RegExp, str: string) => {\n const m = str.match(reg)\n return m ? m[0] : null\n}\n\nexport const range = (\n a: string,\n b: string,\n str: string,\n): undefined | [number, number] => {\n let begs: number[],\n beg: number | undefined,\n left: number,\n right: number | undefined = undefined,\n result: undefined | [number, number]\n let ai = str.indexOf(a)\n let bi = str.indexOf(b, ai + 1)\n let i = ai\n\n if (ai >= 0 && bi > 0) {\n if (a === b) {\n return [ai, bi]\n }\n begs = []\n left = str.length\n\n while (i >= 0 && !result) {\n if (i === ai) {\n begs.push(i)\n ai = str.indexOf(a, i + 1)\n } else if (begs.length === 1) {\n const r = begs.pop()\n if (r !== undefined) result = [r, bi]\n } else {\n beg = begs.pop()\n if (beg !== undefined && beg < left) {\n left = beg\n right = bi\n }\n\n bi = str.indexOf(b, i + 1)\n }\n\n i = ai < bi && ai >= 0 ? ai : bi\n }\n\n if (begs.length && right !== undefined) {\n result = [left, right]\n }\n }\n\n return result\n}\n"]} \ No newline at end of file diff --git a/node_modules/balanced-match/dist/esm/package.json b/node_modules/balanced-match/dist/esm/package.json new file mode 100644 index 00000000..3dbc1ca5 --- /dev/null +++ b/node_modules/balanced-match/dist/esm/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/node_modules/balanced-match/package.json b/node_modules/balanced-match/package.json new file mode 100644 index 00000000..48f1a638 --- /dev/null +++ b/node_modules/balanced-match/package.json @@ -0,0 +1,68 @@ +{ + "name": "balanced-match", + "description": "Match balanced character pairs, like \"{\" and \"}\"", + "version": "4.0.4", + "files": [ + "dist" + ], + "repository": { + "type": "git", + "url": "git://github.com/juliangruber/balanced-match.git" + }, + "exports": { + "./package.json": "./package.json", + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.js" + } + } + }, + "type": "module", + "scripts": { + "preversion": "npm test", + "postversion": "npm publish", + "prepublishOnly": "git push origin --follow-tags", + "prepare": "tshy", + "pretest": "npm run prepare", + "presnap": "npm run prepare", + "test": "tap", + "snap": "tap", + "format": "prettier --write .", + "benchmark": "node benchmark/index.js", + "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts" + }, + "devDependencies": { + "@types/brace-expansion": "^1.1.2", + "@types/node": "^25.2.1", + "mkdirp": "^3.0.1", + "prettier": "^3.3.2", + "tap": "^21.6.2", + "tshy": "^3.0.2", + "typedoc": "^0.28.5" + }, + "keywords": [ + "match", + "regexp", + "test", + "balanced", + "parse" + ], + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + }, + "tshy": { + "exports": { + "./package.json": "./package.json", + ".": "./src/index.ts" + } + }, + "main": "./dist/commonjs/index.js", + "types": "./dist/commonjs/index.d.ts", + "module": "./dist/esm/index.js" +} diff --git a/node_modules/brace-expansion/LICENSE b/node_modules/brace-expansion/LICENSE new file mode 100644 index 00000000..46e7b75c --- /dev/null +++ b/node_modules/brace-expansion/LICENSE @@ -0,0 +1,23 @@ +MIT License + +Copyright Julian Gruber + +TypeScript port Copyright Isaac Z. Schlueter + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/brace-expansion/README.md b/node_modules/brace-expansion/README.md new file mode 100644 index 00000000..d00b24d5 --- /dev/null +++ b/node_modules/brace-expansion/README.md @@ -0,0 +1,94 @@ +# brace-expansion + +[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html), +as known from sh/bash, in JavaScript. + +[![CI](https://github.com/juliangruber/brace-expansion/actions/workflows/ci.yml/badge.svg)](https://github.com/juliangruber/brace-expansion/actions/workflows/ci.yml) +[![downloads](https://img.shields.io/npm/dm/brace-expansion.svg)](https://www.npmjs.org/package/brace-expansion) + +## Example + +```js +import { expand } from 'brace-expansion' + +expand('file-{a,b,c}.jpg') +// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] + +expand('-v{,,}') +// => ['-v', '-v', '-v'] + +expand('file{0..2}.jpg') +// => ['file0.jpg', 'file1.jpg', 'file2.jpg'] + +expand('file-{a..c}.jpg') +// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] + +expand('file{2..0}.jpg') +// => ['file2.jpg', 'file1.jpg', 'file0.jpg'] + +expand('file{0..4..2}.jpg') +// => ['file0.jpg', 'file2.jpg', 'file4.jpg'] + +expand('file-{a..e..2}.jpg') +// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg'] + +expand('file{00..10..5}.jpg') +// => ['file00.jpg', 'file05.jpg', 'file10.jpg'] + +expand('{{A..C},{a..c}}') +// => ['A', 'B', 'C', 'a', 'b', 'c'] + +expand('ppp{,config,oe{,conf}}') +// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf'] +``` + +## API + +```js +import { expand } from 'brace-expansion' +``` + +### const expanded = expand(str, [options]) + +Return an array of all possible and valid expansions of `str`. If +none are found, `[str]` is returned. + +The `options` object can provide a `max` value to cap the number +of expansions allowed. This is limited to `100_000` by default, +to prevent DoS attacks. + +```js +const expansions = expand('{1..100}'.repeat(5), { + max: 100, +}) +// expansions.length will be 100, not 100^5 +``` + +Valid expansions are: + +```js +;/^(.*,)+(.+)?$/ +// {a,b,...} +``` + +A comma separated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`. + +```js +;/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ +// {x..y[..incr]} +``` + +A numeric sequence from `x` to `y` inclusive, with optional increment. +If `x` or `y` start with a leading `0`, all the numbers will be padded +to have equal length. Negative numbers and backwards iteration work too. + +```js +;/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ +// {x..y[..incr]} +``` + +An alphabetic sequence from `x` to `y` inclusive, with optional increment. +`x` and `y` must be exactly one character, and if given, `incr` must be a +number. + +For compatibility reasons, the string `${` is not eligible for brace expansion. diff --git a/node_modules/brace-expansion/dist/commonjs/index.d.ts b/node_modules/brace-expansion/dist/commonjs/index.d.ts new file mode 100644 index 00000000..92b7a7f0 --- /dev/null +++ b/node_modules/brace-expansion/dist/commonjs/index.d.ts @@ -0,0 +1,6 @@ +export declare const EXPANSION_MAX = 100000; +export type BraceExpansionOptions = { + max?: number; +}; +export declare function expand(str: string, options?: BraceExpansionOptions): string[]; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/brace-expansion/dist/commonjs/index.d.ts.map b/node_modules/brace-expansion/dist/commonjs/index.d.ts.map new file mode 100644 index 00000000..a4f36aed --- /dev/null +++ b/node_modules/brace-expansion/dist/commonjs/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,aAAa,SAAU,CAAA;AAwDpC,MAAM,MAAM,qBAAqB,GAAG;IAClC,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,CAAA;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,YAkBtE"} \ No newline at end of file diff --git a/node_modules/brace-expansion/dist/commonjs/index.js b/node_modules/brace-expansion/dist/commonjs/index.js new file mode 100644 index 00000000..33063dd3 --- /dev/null +++ b/node_modules/brace-expansion/dist/commonjs/index.js @@ -0,0 +1,201 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.EXPANSION_MAX = void 0; +exports.expand = expand; +const balanced_match_1 = require("balanced-match"); +const escSlash = '\0SLASH' + Math.random() + '\0'; +const escOpen = '\0OPEN' + Math.random() + '\0'; +const escClose = '\0CLOSE' + Math.random() + '\0'; +const escComma = '\0COMMA' + Math.random() + '\0'; +const escPeriod = '\0PERIOD' + Math.random() + '\0'; +const escSlashPattern = new RegExp(escSlash, 'g'); +const escOpenPattern = new RegExp(escOpen, 'g'); +const escClosePattern = new RegExp(escClose, 'g'); +const escCommaPattern = new RegExp(escComma, 'g'); +const escPeriodPattern = new RegExp(escPeriod, 'g'); +const slashPattern = /\\\\/g; +const openPattern = /\\{/g; +const closePattern = /\\}/g; +const commaPattern = /\\,/g; +const periodPattern = /\\\./g; +exports.EXPANSION_MAX = 100_000; +function numeric(str) { + return !isNaN(str) ? parseInt(str, 10) : str.charCodeAt(0); +} +function escapeBraces(str) { + return str + .replace(slashPattern, escSlash) + .replace(openPattern, escOpen) + .replace(closePattern, escClose) + .replace(commaPattern, escComma) + .replace(periodPattern, escPeriod); +} +function unescapeBraces(str) { + return str + .replace(escSlashPattern, '\\') + .replace(escOpenPattern, '{') + .replace(escClosePattern, '}') + .replace(escCommaPattern, ',') + .replace(escPeriodPattern, '.'); +} +/** + * Basically just str.split(","), but handling cases + * where we have nested braced sections, which should be + * treated as individual members, like {a,{b,c},d} + */ +function parseCommaParts(str) { + if (!str) { + return ['']; + } + const parts = []; + const m = (0, balanced_match_1.balanced)('{', '}', str); + if (!m) { + return str.split(','); + } + const { pre, body, post } = m; + const p = pre.split(','); + p[p.length - 1] += '{' + body + '}'; + const postParts = parseCommaParts(post); + if (post.length) { + ; + p[p.length - 1] += postParts.shift(); + p.push.apply(p, postParts); + } + parts.push.apply(parts, p); + return parts; +} +function expand(str, options = {}) { + if (!str) { + return []; + } + const { max = exports.EXPANSION_MAX } = options; + // I don't know why Bash 4.3 does this, but it does. + // Anything starting with {} will have the first two bytes preserved + // but *only* at the top level, so {},a}b will not expand to anything, + // but a{},b}c will be expanded to [a}c,abc]. + // One could argue that this is a bug in Bash, but since the goal of + // this module is to match Bash's rules, we escape a leading {} + if (str.slice(0, 2) === '{}') { + str = '\\{\\}' + str.slice(2); + } + return expand_(escapeBraces(str), max, true).map(unescapeBraces); +} +function embrace(str) { + return '{' + str + '}'; +} +function isPadded(el) { + return /^-?0\d/.test(el); +} +function lte(i, y) { + return i <= y; +} +function gte(i, y) { + return i >= y; +} +function expand_(str, max, isTop) { + /** @type {string[]} */ + const expansions = []; + const m = (0, balanced_match_1.balanced)('{', '}', str); + if (!m) + return [str]; + // no need to expand pre, since it is guaranteed to be free of brace-sets + const pre = m.pre; + const post = m.post.length ? expand_(m.post, max, false) : ['']; + if (/\$$/.test(m.pre)) { + for (let k = 0; k < post.length && k < max; k++) { + const expansion = pre + '{' + m.body + '}' + post[k]; + expansions.push(expansion); + } + } + else { + const isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + const isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + const isSequence = isNumericSequence || isAlphaSequence; + const isOptions = m.body.indexOf(',') >= 0; + if (!isSequence && !isOptions) { + // {a},b} + if (m.post.match(/,(?!,).*\}/)) { + str = m.pre + '{' + m.body + escClose + m.post; + return expand_(str, max, true); + } + return [str]; + } + let n; + if (isSequence) { + n = m.body.split(/\.\./); + } + else { + n = parseCommaParts(m.body); + if (n.length === 1 && n[0] !== undefined) { + // x{{a,b}}y ==> x{a}y x{b}y + n = expand_(n[0], max, false).map(embrace); + //XXX is this necessary? Can't seem to hit it in tests. + /* c8 ignore start */ + if (n.length === 1) { + return post.map(p => m.pre + n[0] + p); + } + /* c8 ignore stop */ + } + } + // at this point, n is the parts, and we know it's not a comma set + // with a single entry. + let N; + if (isSequence && n[0] !== undefined && n[1] !== undefined) { + const x = numeric(n[0]); + const y = numeric(n[1]); + const width = Math.max(n[0].length, n[1].length); + let incr = n.length === 3 && n[2] !== undefined ? + Math.max(Math.abs(numeric(n[2])), 1) + : 1; + let test = lte; + const reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + const pad = n.some(isPadded); + N = []; + for (let i = x; test(i, y) && N.length < max; i += incr) { + let c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === '\\') { + c = ''; + } + } + else { + c = String(i); + if (pad) { + const need = width - c.length; + if (need > 0) { + const z = new Array(need + 1).join('0'); + if (i < 0) { + c = '-' + z + c.slice(1); + } + else { + c = z + c; + } + } + } + } + N.push(c); + } + } + else { + N = []; + for (let j = 0; j < n.length; j++) { + N.push.apply(N, expand_(n[j], max, false)); + } + } + for (let j = 0; j < N.length; j++) { + for (let k = 0; k < post.length && expansions.length < max; k++) { + const expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) { + expansions.push(expansion); + } + } + } + } + return expansions; +} +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/brace-expansion/dist/commonjs/index.js.map b/node_modules/brace-expansion/dist/commonjs/index.js.map new file mode 100644 index 00000000..77dd0803 --- /dev/null +++ b/node_modules/brace-expansion/dist/commonjs/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AA8EA,wBAkBC;AAhGD,mDAAyC;AAEzC,MAAM,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAA;AACjD,MAAM,OAAO,GAAG,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAA;AAC/C,MAAM,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAA;AACjD,MAAM,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAA;AACjD,MAAM,SAAS,GAAG,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAA;AACnD,MAAM,eAAe,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;AACjD,MAAM,cAAc,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;AAC/C,MAAM,eAAe,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;AACjD,MAAM,eAAe,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;AACjD,MAAM,gBAAgB,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;AACnD,MAAM,YAAY,GAAG,OAAO,CAAA;AAC5B,MAAM,WAAW,GAAG,MAAM,CAAA;AAC1B,MAAM,YAAY,GAAG,MAAM,CAAA;AAC3B,MAAM,YAAY,GAAG,MAAM,CAAA;AAC3B,MAAM,aAAa,GAAG,OAAO,CAAA;AAEhB,QAAA,aAAa,GAAG,OAAO,CAAA;AAEpC,SAAS,OAAO,CAAC,GAAW;IAC1B,OAAO,CAAC,KAAK,CAAC,GAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;AACnE,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG;SACP,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC;SAC/B,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC;SAC7B,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC;SAC/B,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC;SAC/B,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC,CAAA;AACtC,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,OAAO,GAAG;SACP,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC;SAC9B,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC;SAC5B,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC;SAC7B,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC;SAC7B,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAA;AACnC,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,GAAW;IAClC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,EAAE,CAAC,CAAA;IACb,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,MAAM,CAAC,GAAG,IAAA,yBAAQ,EAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IAEjC,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACvB,CAAC;IAED,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;IAC7B,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAExB,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,CAAA;IACnC,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;IACvC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC;QAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAY,IAAI,SAAS,CAAC,KAAK,EAAE,CAAA;QACjD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IAE1B,OAAO,KAAK,CAAA;AACd,CAAC;AAMD,SAAgB,MAAM,CAAC,GAAW,EAAE,UAAiC,EAAE;IACrE,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,EAAE,GAAG,GAAG,qBAAa,EAAE,GAAG,OAAO,CAAA;IAEvC,oDAAoD;IACpD,oEAAoE;IACpE,sEAAsE;IACtE,6CAA6C;IAC7C,oEAAoE;IACpE,+DAA+D;IAC/D,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC7B,GAAG,GAAG,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC/B,CAAC;IAED,OAAO,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;AAClE,CAAC;AAED,SAAS,OAAO,CAAC,GAAW;IAC1B,OAAO,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AACxB,CAAC;AAED,SAAS,QAAQ,CAAC,EAAU;IAC1B,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAC1B,CAAC;AAED,SAAS,GAAG,CAAC,CAAS,EAAE,CAAS;IAC/B,OAAO,CAAC,IAAI,CAAC,CAAA;AACf,CAAC;AAED,SAAS,GAAG,CAAC,CAAS,EAAE,CAAS;IAC/B,OAAO,CAAC,IAAI,CAAC,CAAA;AACf,CAAC;AAED,SAAS,OAAO,CAAC,GAAW,EAAE,GAAW,EAAE,KAAc;IACvD,uBAAuB;IACvB,MAAM,UAAU,GAAa,EAAE,CAAA;IAE/B,MAAM,CAAC,GAAG,IAAA,yBAAQ,EAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IACjC,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,CAAA;IAEpB,yEAAyE;IACzE,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAA;IACjB,MAAM,IAAI,GAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAEzE,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAChD,MAAM,SAAS,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;YACpD,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC5B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,iBAAiB,GAAG,gCAAgC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACvE,MAAM,eAAe,GAAG,sCAAsC,CAAC,IAAI,CACjE,CAAC,CAAC,IAAI,CACP,CAAA;QACD,MAAM,UAAU,GAAG,iBAAiB,IAAI,eAAe,CAAA;QACvD,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC1C,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS,EAAE,CAAC;YAC9B,SAAS;YACT,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC/B,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,GAAG,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAA;gBAC9C,OAAO,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YAChC,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,CAAA;QACd,CAAC;QAED,IAAI,CAAW,CAAA;QACf,IAAI,UAAU,EAAE,CAAC;YACf,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAC1B,CAAC;aAAM,CAAC;YACN,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;YAC3B,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;gBACzC,4BAA4B;gBAC5B,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;gBAC1C,uDAAuD;gBACvD,qBAAqB;gBACrB,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACnB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;gBACxC,CAAC;gBACD,oBAAoB;YACtB,CAAC;QACH,CAAC;QAED,kEAAkE;QAClE,uBAAuB;QACvB,IAAI,CAAW,CAAA;QAEf,IAAI,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YAC3D,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACvB,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;YAChD,IAAI,IAAI,GACN,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;gBACpC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACtC,CAAC,CAAC,CAAC,CAAA;YACL,IAAI,IAAI,GAAG,GAAG,CAAA;YACd,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAA;YACrB,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,IAAI,CAAC,CAAC,CAAA;gBACV,IAAI,GAAG,GAAG,CAAA;YACZ,CAAC;YACD,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAE5B,CAAC,GAAG,EAAE,CAAA;YAEN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;gBACxD,IAAI,CAAC,CAAA;gBACL,IAAI,eAAe,EAAE,CAAC;oBACpB,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;oBAC1B,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;wBACf,CAAC,GAAG,EAAE,CAAA;oBACR,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;oBACb,IAAI,GAAG,EAAE,CAAC;wBACR,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,MAAM,CAAA;wBAC7B,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;4BACb,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;4BACvC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gCACV,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;4BAC1B,CAAC;iCAAM,CAAC;gCACN,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;4BACX,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACX,CAAC;QACH,CAAC;aAAM,CAAC;YACN,CAAC,GAAG,EAAE,CAAA;YAEN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAClC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAW,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;YACtD,CAAC;QACH,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;gBAChE,MAAM,SAAS,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;gBACtC,IAAI,CAAC,KAAK,IAAI,UAAU,IAAI,SAAS,EAAE,CAAC;oBACtC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAA;AACnB,CAAC","sourcesContent":["import { balanced } from 'balanced-match'\n\nconst escSlash = '\\0SLASH' + Math.random() + '\\0'\nconst escOpen = '\\0OPEN' + Math.random() + '\\0'\nconst escClose = '\\0CLOSE' + Math.random() + '\\0'\nconst escComma = '\\0COMMA' + Math.random() + '\\0'\nconst escPeriod = '\\0PERIOD' + Math.random() + '\\0'\nconst escSlashPattern = new RegExp(escSlash, 'g')\nconst escOpenPattern = new RegExp(escOpen, 'g')\nconst escClosePattern = new RegExp(escClose, 'g')\nconst escCommaPattern = new RegExp(escComma, 'g')\nconst escPeriodPattern = new RegExp(escPeriod, 'g')\nconst slashPattern = /\\\\\\\\/g\nconst openPattern = /\\\\{/g\nconst closePattern = /\\\\}/g\nconst commaPattern = /\\\\,/g\nconst periodPattern = /\\\\\\./g\n\nexport const EXPANSION_MAX = 100_000\n\nfunction numeric(str: string) {\n return !isNaN(str as any) ? parseInt(str, 10) : str.charCodeAt(0)\n}\n\nfunction escapeBraces(str: string) {\n return str\n .replace(slashPattern, escSlash)\n .replace(openPattern, escOpen)\n .replace(closePattern, escClose)\n .replace(commaPattern, escComma)\n .replace(periodPattern, escPeriod)\n}\n\nfunction unescapeBraces(str: string) {\n return str\n .replace(escSlashPattern, '\\\\')\n .replace(escOpenPattern, '{')\n .replace(escClosePattern, '}')\n .replace(escCommaPattern, ',')\n .replace(escPeriodPattern, '.')\n}\n\n/**\n * Basically just str.split(\",\"), but handling cases\n * where we have nested braced sections, which should be\n * treated as individual members, like {a,{b,c},d}\n */\nfunction parseCommaParts(str: string) {\n if (!str) {\n return ['']\n }\n\n const parts: string[] = []\n const m = balanced('{', '}', str)\n\n if (!m) {\n return str.split(',')\n }\n\n const { pre, body, post } = m\n const p = pre.split(',')\n\n p[p.length - 1] += '{' + body + '}'\n const postParts = parseCommaParts(post)\n if (post.length) {\n ;(p[p.length - 1] as string) += postParts.shift()\n p.push.apply(p, postParts)\n }\n\n parts.push.apply(parts, p)\n\n return parts\n}\n\nexport type BraceExpansionOptions = {\n max?: number\n}\n\nexport function expand(str: string, options: BraceExpansionOptions = {}) {\n if (!str) {\n return []\n }\n\n const { max = EXPANSION_MAX } = options\n\n // I don't know why Bash 4.3 does this, but it does.\n // Anything starting with {} will have the first two bytes preserved\n // but *only* at the top level, so {},a}b will not expand to anything,\n // but a{},b}c will be expanded to [a}c,abc].\n // One could argue that this is a bug in Bash, but since the goal of\n // this module is to match Bash's rules, we escape a leading {}\n if (str.slice(0, 2) === '{}') {\n str = '\\\\{\\\\}' + str.slice(2)\n }\n\n return expand_(escapeBraces(str), max, true).map(unescapeBraces)\n}\n\nfunction embrace(str: string) {\n return '{' + str + '}'\n}\n\nfunction isPadded(el: string) {\n return /^-?0\\d/.test(el)\n}\n\nfunction lte(i: number, y: number) {\n return i <= y\n}\n\nfunction gte(i: number, y: number) {\n return i >= y\n}\n\nfunction expand_(str: string, max: number, isTop: boolean): string[] {\n /** @type {string[]} */\n const expansions: string[] = []\n\n const m = balanced('{', '}', str)\n if (!m) return [str]\n\n // no need to expand pre, since it is guaranteed to be free of brace-sets\n const pre = m.pre\n const post: string[] = m.post.length ? expand_(m.post, max, false) : ['']\n\n if (/\\$$/.test(m.pre)) {\n for (let k = 0; k < post.length && k < max; k++) {\n const expansion = pre + '{' + m.body + '}' + post[k]\n expansions.push(expansion)\n }\n } else {\n const isNumericSequence = /^-?\\d+\\.\\.-?\\d+(?:\\.\\.-?\\d+)?$/.test(m.body)\n const isAlphaSequence = /^[a-zA-Z]\\.\\.[a-zA-Z](?:\\.\\.-?\\d+)?$/.test(\n m.body,\n )\n const isSequence = isNumericSequence || isAlphaSequence\n const isOptions = m.body.indexOf(',') >= 0\n if (!isSequence && !isOptions) {\n // {a},b}\n if (m.post.match(/,(?!,).*\\}/)) {\n str = m.pre + '{' + m.body + escClose + m.post\n return expand_(str, max, true)\n }\n return [str]\n }\n\n let n: string[]\n if (isSequence) {\n n = m.body.split(/\\.\\./)\n } else {\n n = parseCommaParts(m.body)\n if (n.length === 1 && n[0] !== undefined) {\n // x{{a,b}}y ==> x{a}y x{b}y\n n = expand_(n[0], max, false).map(embrace)\n //XXX is this necessary? Can't seem to hit it in tests.\n /* c8 ignore start */\n if (n.length === 1) {\n return post.map(p => m.pre + n[0] + p)\n }\n /* c8 ignore stop */\n }\n }\n\n // at this point, n is the parts, and we know it's not a comma set\n // with a single entry.\n let N: string[]\n\n if (isSequence && n[0] !== undefined && n[1] !== undefined) {\n const x = numeric(n[0])\n const y = numeric(n[1])\n const width = Math.max(n[0].length, n[1].length)\n let incr =\n n.length === 3 && n[2] !== undefined ?\n Math.max(Math.abs(numeric(n[2])), 1)\n : 1\n let test = lte\n const reverse = y < x\n if (reverse) {\n incr *= -1\n test = gte\n }\n const pad = n.some(isPadded)\n\n N = []\n\n for (let i = x; test(i, y) && N.length < max; i += incr) {\n let c\n if (isAlphaSequence) {\n c = String.fromCharCode(i)\n if (c === '\\\\') {\n c = ''\n }\n } else {\n c = String(i)\n if (pad) {\n const need = width - c.length\n if (need > 0) {\n const z = new Array(need + 1).join('0')\n if (i < 0) {\n c = '-' + z + c.slice(1)\n } else {\n c = z + c\n }\n }\n }\n }\n N.push(c)\n }\n } else {\n N = []\n\n for (let j = 0; j < n.length; j++) {\n N.push.apply(N, expand_(n[j] as string, max, false))\n }\n }\n\n for (let j = 0; j < N.length; j++) {\n for (let k = 0; k < post.length && expansions.length < max; k++) {\n const expansion = pre + N[j] + post[k]\n if (!isTop || isSequence || expansion) {\n expansions.push(expansion)\n }\n }\n }\n }\n\n return expansions\n}\n"]} \ No newline at end of file diff --git a/node_modules/brace-expansion/dist/commonjs/package.json b/node_modules/brace-expansion/dist/commonjs/package.json new file mode 100644 index 00000000..5bbefffb --- /dev/null +++ b/node_modules/brace-expansion/dist/commonjs/package.json @@ -0,0 +1,3 @@ +{ + "type": "commonjs" +} diff --git a/node_modules/brace-expansion/dist/esm/index.d.ts b/node_modules/brace-expansion/dist/esm/index.d.ts new file mode 100644 index 00000000..92b7a7f0 --- /dev/null +++ b/node_modules/brace-expansion/dist/esm/index.d.ts @@ -0,0 +1,6 @@ +export declare const EXPANSION_MAX = 100000; +export type BraceExpansionOptions = { + max?: number; +}; +export declare function expand(str: string, options?: BraceExpansionOptions): string[]; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/brace-expansion/dist/esm/index.d.ts.map b/node_modules/brace-expansion/dist/esm/index.d.ts.map new file mode 100644 index 00000000..a4f36aed --- /dev/null +++ b/node_modules/brace-expansion/dist/esm/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,aAAa,SAAU,CAAA;AAwDpC,MAAM,MAAM,qBAAqB,GAAG;IAClC,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,CAAA;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,YAkBtE"} \ No newline at end of file diff --git a/node_modules/brace-expansion/dist/esm/index.js b/node_modules/brace-expansion/dist/esm/index.js new file mode 100644 index 00000000..32399e7b --- /dev/null +++ b/node_modules/brace-expansion/dist/esm/index.js @@ -0,0 +1,197 @@ +import { balanced } from 'balanced-match'; +const escSlash = '\0SLASH' + Math.random() + '\0'; +const escOpen = '\0OPEN' + Math.random() + '\0'; +const escClose = '\0CLOSE' + Math.random() + '\0'; +const escComma = '\0COMMA' + Math.random() + '\0'; +const escPeriod = '\0PERIOD' + Math.random() + '\0'; +const escSlashPattern = new RegExp(escSlash, 'g'); +const escOpenPattern = new RegExp(escOpen, 'g'); +const escClosePattern = new RegExp(escClose, 'g'); +const escCommaPattern = new RegExp(escComma, 'g'); +const escPeriodPattern = new RegExp(escPeriod, 'g'); +const slashPattern = /\\\\/g; +const openPattern = /\\{/g; +const closePattern = /\\}/g; +const commaPattern = /\\,/g; +const periodPattern = /\\\./g; +export const EXPANSION_MAX = 100_000; +function numeric(str) { + return !isNaN(str) ? parseInt(str, 10) : str.charCodeAt(0); +} +function escapeBraces(str) { + return str + .replace(slashPattern, escSlash) + .replace(openPattern, escOpen) + .replace(closePattern, escClose) + .replace(commaPattern, escComma) + .replace(periodPattern, escPeriod); +} +function unescapeBraces(str) { + return str + .replace(escSlashPattern, '\\') + .replace(escOpenPattern, '{') + .replace(escClosePattern, '}') + .replace(escCommaPattern, ',') + .replace(escPeriodPattern, '.'); +} +/** + * Basically just str.split(","), but handling cases + * where we have nested braced sections, which should be + * treated as individual members, like {a,{b,c},d} + */ +function parseCommaParts(str) { + if (!str) { + return ['']; + } + const parts = []; + const m = balanced('{', '}', str); + if (!m) { + return str.split(','); + } + const { pre, body, post } = m; + const p = pre.split(','); + p[p.length - 1] += '{' + body + '}'; + const postParts = parseCommaParts(post); + if (post.length) { + ; + p[p.length - 1] += postParts.shift(); + p.push.apply(p, postParts); + } + parts.push.apply(parts, p); + return parts; +} +export function expand(str, options = {}) { + if (!str) { + return []; + } + const { max = EXPANSION_MAX } = options; + // I don't know why Bash 4.3 does this, but it does. + // Anything starting with {} will have the first two bytes preserved + // but *only* at the top level, so {},a}b will not expand to anything, + // but a{},b}c will be expanded to [a}c,abc]. + // One could argue that this is a bug in Bash, but since the goal of + // this module is to match Bash's rules, we escape a leading {} + if (str.slice(0, 2) === '{}') { + str = '\\{\\}' + str.slice(2); + } + return expand_(escapeBraces(str), max, true).map(unescapeBraces); +} +function embrace(str) { + return '{' + str + '}'; +} +function isPadded(el) { + return /^-?0\d/.test(el); +} +function lte(i, y) { + return i <= y; +} +function gte(i, y) { + return i >= y; +} +function expand_(str, max, isTop) { + /** @type {string[]} */ + const expansions = []; + const m = balanced('{', '}', str); + if (!m) + return [str]; + // no need to expand pre, since it is guaranteed to be free of brace-sets + const pre = m.pre; + const post = m.post.length ? expand_(m.post, max, false) : ['']; + if (/\$$/.test(m.pre)) { + for (let k = 0; k < post.length && k < max; k++) { + const expansion = pre + '{' + m.body + '}' + post[k]; + expansions.push(expansion); + } + } + else { + const isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + const isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + const isSequence = isNumericSequence || isAlphaSequence; + const isOptions = m.body.indexOf(',') >= 0; + if (!isSequence && !isOptions) { + // {a},b} + if (m.post.match(/,(?!,).*\}/)) { + str = m.pre + '{' + m.body + escClose + m.post; + return expand_(str, max, true); + } + return [str]; + } + let n; + if (isSequence) { + n = m.body.split(/\.\./); + } + else { + n = parseCommaParts(m.body); + if (n.length === 1 && n[0] !== undefined) { + // x{{a,b}}y ==> x{a}y x{b}y + n = expand_(n[0], max, false).map(embrace); + //XXX is this necessary? Can't seem to hit it in tests. + /* c8 ignore start */ + if (n.length === 1) { + return post.map(p => m.pre + n[0] + p); + } + /* c8 ignore stop */ + } + } + // at this point, n is the parts, and we know it's not a comma set + // with a single entry. + let N; + if (isSequence && n[0] !== undefined && n[1] !== undefined) { + const x = numeric(n[0]); + const y = numeric(n[1]); + const width = Math.max(n[0].length, n[1].length); + let incr = n.length === 3 && n[2] !== undefined ? + Math.max(Math.abs(numeric(n[2])), 1) + : 1; + let test = lte; + const reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + const pad = n.some(isPadded); + N = []; + for (let i = x; test(i, y) && N.length < max; i += incr) { + let c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === '\\') { + c = ''; + } + } + else { + c = String(i); + if (pad) { + const need = width - c.length; + if (need > 0) { + const z = new Array(need + 1).join('0'); + if (i < 0) { + c = '-' + z + c.slice(1); + } + else { + c = z + c; + } + } + } + } + N.push(c); + } + } + else { + N = []; + for (let j = 0; j < n.length; j++) { + N.push.apply(N, expand_(n[j], max, false)); + } + } + for (let j = 0; j < N.length; j++) { + for (let k = 0; k < post.length && expansions.length < max; k++) { + const expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) { + expansions.push(expansion); + } + } + } + } + return expansions; +} +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/brace-expansion/dist/esm/index.js.map b/node_modules/brace-expansion/dist/esm/index.js.map new file mode 100644 index 00000000..63a6a2a9 --- /dev/null +++ b/node_modules/brace-expansion/dist/esm/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { balanced } from 'balanced-match'\n\nconst escSlash = '\\0SLASH' + Math.random() + '\\0'\nconst escOpen = '\\0OPEN' + Math.random() + '\\0'\nconst escClose = '\\0CLOSE' + Math.random() + '\\0'\nconst escComma = '\\0COMMA' + Math.random() + '\\0'\nconst escPeriod = '\\0PERIOD' + Math.random() + '\\0'\nconst escSlashPattern = new RegExp(escSlash, 'g')\nconst escOpenPattern = new RegExp(escOpen, 'g')\nconst escClosePattern = new RegExp(escClose, 'g')\nconst escCommaPattern = new RegExp(escComma, 'g')\nconst escPeriodPattern = new RegExp(escPeriod, 'g')\nconst slashPattern = /\\\\\\\\/g\nconst openPattern = /\\\\{/g\nconst closePattern = /\\\\}/g\nconst commaPattern = /\\\\,/g\nconst periodPattern = /\\\\\\./g\n\nexport const EXPANSION_MAX = 100_000\n\nfunction numeric(str: string) {\n return !isNaN(str as any) ? parseInt(str, 10) : str.charCodeAt(0)\n}\n\nfunction escapeBraces(str: string) {\n return str\n .replace(slashPattern, escSlash)\n .replace(openPattern, escOpen)\n .replace(closePattern, escClose)\n .replace(commaPattern, escComma)\n .replace(periodPattern, escPeriod)\n}\n\nfunction unescapeBraces(str: string) {\n return str\n .replace(escSlashPattern, '\\\\')\n .replace(escOpenPattern, '{')\n .replace(escClosePattern, '}')\n .replace(escCommaPattern, ',')\n .replace(escPeriodPattern, '.')\n}\n\n/**\n * Basically just str.split(\",\"), but handling cases\n * where we have nested braced sections, which should be\n * treated as individual members, like {a,{b,c},d}\n */\nfunction parseCommaParts(str: string) {\n if (!str) {\n return ['']\n }\n\n const parts: string[] = []\n const m = balanced('{', '}', str)\n\n if (!m) {\n return str.split(',')\n }\n\n const { pre, body, post } = m\n const p = pre.split(',')\n\n p[p.length - 1] += '{' + body + '}'\n const postParts = parseCommaParts(post)\n if (post.length) {\n ;(p[p.length - 1] as string) += postParts.shift()\n p.push.apply(p, postParts)\n }\n\n parts.push.apply(parts, p)\n\n return parts\n}\n\nexport type BraceExpansionOptions = {\n max?: number\n}\n\nexport function expand(str: string, options: BraceExpansionOptions = {}) {\n if (!str) {\n return []\n }\n\n const { max = EXPANSION_MAX } = options\n\n // I don't know why Bash 4.3 does this, but it does.\n // Anything starting with {} will have the first two bytes preserved\n // but *only* at the top level, so {},a}b will not expand to anything,\n // but a{},b}c will be expanded to [a}c,abc].\n // One could argue that this is a bug in Bash, but since the goal of\n // this module is to match Bash's rules, we escape a leading {}\n if (str.slice(0, 2) === '{}') {\n str = '\\\\{\\\\}' + str.slice(2)\n }\n\n return expand_(escapeBraces(str), max, true).map(unescapeBraces)\n}\n\nfunction embrace(str: string) {\n return '{' + str + '}'\n}\n\nfunction isPadded(el: string) {\n return /^-?0\\d/.test(el)\n}\n\nfunction lte(i: number, y: number) {\n return i <= y\n}\n\nfunction gte(i: number, y: number) {\n return i >= y\n}\n\nfunction expand_(str: string, max: number, isTop: boolean): string[] {\n /** @type {string[]} */\n const expansions: string[] = []\n\n const m = balanced('{', '}', str)\n if (!m) return [str]\n\n // no need to expand pre, since it is guaranteed to be free of brace-sets\n const pre = m.pre\n const post: string[] = m.post.length ? expand_(m.post, max, false) : ['']\n\n if (/\\$$/.test(m.pre)) {\n for (let k = 0; k < post.length && k < max; k++) {\n const expansion = pre + '{' + m.body + '}' + post[k]\n expansions.push(expansion)\n }\n } else {\n const isNumericSequence = /^-?\\d+\\.\\.-?\\d+(?:\\.\\.-?\\d+)?$/.test(m.body)\n const isAlphaSequence = /^[a-zA-Z]\\.\\.[a-zA-Z](?:\\.\\.-?\\d+)?$/.test(\n m.body,\n )\n const isSequence = isNumericSequence || isAlphaSequence\n const isOptions = m.body.indexOf(',') >= 0\n if (!isSequence && !isOptions) {\n // {a},b}\n if (m.post.match(/,(?!,).*\\}/)) {\n str = m.pre + '{' + m.body + escClose + m.post\n return expand_(str, max, true)\n }\n return [str]\n }\n\n let n: string[]\n if (isSequence) {\n n = m.body.split(/\\.\\./)\n } else {\n n = parseCommaParts(m.body)\n if (n.length === 1 && n[0] !== undefined) {\n // x{{a,b}}y ==> x{a}y x{b}y\n n = expand_(n[0], max, false).map(embrace)\n //XXX is this necessary? Can't seem to hit it in tests.\n /* c8 ignore start */\n if (n.length === 1) {\n return post.map(p => m.pre + n[0] + p)\n }\n /* c8 ignore stop */\n }\n }\n\n // at this point, n is the parts, and we know it's not a comma set\n // with a single entry.\n let N: string[]\n\n if (isSequence && n[0] !== undefined && n[1] !== undefined) {\n const x = numeric(n[0])\n const y = numeric(n[1])\n const width = Math.max(n[0].length, n[1].length)\n let incr =\n n.length === 3 && n[2] !== undefined ?\n Math.max(Math.abs(numeric(n[2])), 1)\n : 1\n let test = lte\n const reverse = y < x\n if (reverse) {\n incr *= -1\n test = gte\n }\n const pad = n.some(isPadded)\n\n N = []\n\n for (let i = x; test(i, y) && N.length < max; i += incr) {\n let c\n if (isAlphaSequence) {\n c = String.fromCharCode(i)\n if (c === '\\\\') {\n c = ''\n }\n } else {\n c = String(i)\n if (pad) {\n const need = width - c.length\n if (need > 0) {\n const z = new Array(need + 1).join('0')\n if (i < 0) {\n c = '-' + z + c.slice(1)\n } else {\n c = z + c\n }\n }\n }\n }\n N.push(c)\n }\n } else {\n N = []\n\n for (let j = 0; j < n.length; j++) {\n N.push.apply(N, expand_(n[j] as string, max, false))\n }\n }\n\n for (let j = 0; j < N.length; j++) {\n for (let k = 0; k < post.length && expansions.length < max; k++) {\n const expansion = pre + N[j] + post[k]\n if (!isTop || isSequence || expansion) {\n expansions.push(expansion)\n }\n }\n }\n }\n\n return expansions\n}\n"]} \ No newline at end of file diff --git a/node_modules/brace-expansion/dist/esm/package.json b/node_modules/brace-expansion/dist/esm/package.json new file mode 100644 index 00000000..3dbc1ca5 --- /dev/null +++ b/node_modules/brace-expansion/dist/esm/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/node_modules/brace-expansion/package.json b/node_modules/brace-expansion/package.json new file mode 100644 index 00000000..81524809 --- /dev/null +++ b/node_modules/brace-expansion/package.json @@ -0,0 +1,64 @@ +{ + "name": "brace-expansion", + "description": "Brace expansion as known from sh/bash", + "version": "5.0.6", + "files": [ + "dist" + ], + "exports": { + "./package.json": "./package.json", + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.js" + } + } + }, + "type": "module", + "scripts": { + "preversion": "npm test", + "postversion": "npm publish", + "prepublishOnly": "git push origin --follow-tags", + "prepare": "tshy", + "pretest": "npm run prepare", + "presnap": "npm run prepare", + "test": "tap", + "snap": "tap", + "format": "prettier --write .", + "benchmark": "node benchmark/index.js", + "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts" + }, + "devDependencies": { + "@types/brace-expansion": "^1.1.2", + "@types/node": "^25.2.1", + "mkdirp": "^3.0.1", + "prettier": "^3.3.2", + "tap": "^21.6.2", + "tshy": "^3.0.2", + "typedoc": "^0.28.5" + }, + "dependencies": { + "balanced-match": "^4.0.2" + }, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + }, + "tshy": { + "exports": { + "./package.json": "./package.json", + ".": "./src/index.ts" + } + }, + "main": "./dist/commonjs/index.js", + "types": "./dist/commonjs/index.d.ts", + "module": "./dist/esm/index.js", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/juliangruber/brace-expansion.git" + } +} diff --git a/node_modules/buffer-from/LICENSE b/node_modules/buffer-from/LICENSE new file mode 100644 index 00000000..e4bf1d69 --- /dev/null +++ b/node_modules/buffer-from/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016, 2018 Linus Unnebäck + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/buffer-from/index.js b/node_modules/buffer-from/index.js new file mode 100644 index 00000000..e1a58b5e --- /dev/null +++ b/node_modules/buffer-from/index.js @@ -0,0 +1,72 @@ +/* eslint-disable node/no-deprecated-api */ + +var toString = Object.prototype.toString + +var isModern = ( + typeof Buffer !== 'undefined' && + typeof Buffer.alloc === 'function' && + typeof Buffer.allocUnsafe === 'function' && + typeof Buffer.from === 'function' +) + +function isArrayBuffer (input) { + return toString.call(input).slice(8, -1) === 'ArrayBuffer' +} + +function fromArrayBuffer (obj, byteOffset, length) { + byteOffset >>>= 0 + + var maxLength = obj.byteLength - byteOffset + + if (maxLength < 0) { + throw new RangeError("'offset' is out of bounds") + } + + if (length === undefined) { + length = maxLength + } else { + length >>>= 0 + + if (length > maxLength) { + throw new RangeError("'length' is out of bounds") + } + } + + return isModern + ? Buffer.from(obj.slice(byteOffset, byteOffset + length)) + : new Buffer(new Uint8Array(obj.slice(byteOffset, byteOffset + length))) +} + +function fromString (string, encoding) { + if (typeof encoding !== 'string' || encoding === '') { + encoding = 'utf8' + } + + if (!Buffer.isEncoding(encoding)) { + throw new TypeError('"encoding" must be a valid string encoding') + } + + return isModern + ? Buffer.from(string, encoding) + : new Buffer(string, encoding) +} + +function bufferFrom (value, encodingOrOffset, length) { + if (typeof value === 'number') { + throw new TypeError('"value" argument must not be a number') + } + + if (isArrayBuffer(value)) { + return fromArrayBuffer(value, encodingOrOffset, length) + } + + if (typeof value === 'string') { + return fromString(value, encodingOrOffset) + } + + return isModern + ? Buffer.from(value) + : new Buffer(value) +} + +module.exports = bufferFrom diff --git a/node_modules/buffer-from/package.json b/node_modules/buffer-from/package.json new file mode 100644 index 00000000..6ac5327b --- /dev/null +++ b/node_modules/buffer-from/package.json @@ -0,0 +1,19 @@ +{ + "name": "buffer-from", + "version": "1.1.2", + "license": "MIT", + "repository": "LinusU/buffer-from", + "files": [ + "index.js" + ], + "scripts": { + "test": "standard && node test" + }, + "devDependencies": { + "standard": "^12.0.1" + }, + "keywords": [ + "buffer", + "buffer from" + ] +} diff --git a/node_modules/buffer-from/readme.md b/node_modules/buffer-from/readme.md new file mode 100644 index 00000000..9880a558 --- /dev/null +++ b/node_modules/buffer-from/readme.md @@ -0,0 +1,69 @@ +# Buffer From + +A [ponyfill](https://ponyfill.com) for `Buffer.from`, uses native implementation if available. + +## Installation + +```sh +npm install --save buffer-from +``` + +## Usage + +```js +const bufferFrom = require('buffer-from') + +console.log(bufferFrom([1, 2, 3, 4])) +//=> + +const arr = new Uint8Array([1, 2, 3, 4]) +console.log(bufferFrom(arr.buffer, 1, 2)) +//=> + +console.log(bufferFrom('test', 'utf8')) +//=> + +const buf = bufferFrom('test') +console.log(bufferFrom(buf)) +//=> +``` + +## API + +### bufferFrom(array) + +- `array` <Array> + +Allocates a new `Buffer` using an `array` of octets. + +### bufferFrom(arrayBuffer[, byteOffset[, length]]) + +- `arrayBuffer` <ArrayBuffer> The `.buffer` property of a TypedArray or ArrayBuffer +- `byteOffset` <Integer> Where to start copying from `arrayBuffer`. **Default:** `0` +- `length` <Integer> How many bytes to copy from `arrayBuffer`. **Default:** `arrayBuffer.length - byteOffset` + +When passed a reference to the `.buffer` property of a TypedArray instance, the +newly created `Buffer` will share the same allocated memory as the TypedArray. + +The optional `byteOffset` and `length` arguments specify a memory range within +the `arrayBuffer` that will be shared by the `Buffer`. + +### bufferFrom(buffer) + +- `buffer` <Buffer> An existing `Buffer` to copy data from + +Copies the passed `buffer` data onto a new `Buffer` instance. + +### bufferFrom(string[, encoding]) + +- `string` <String> A string to encode. +- `encoding` <String> The encoding of `string`. **Default:** `'utf8'` + +Creates a new `Buffer` containing the given JavaScript string `string`. If +provided, the `encoding` parameter identifies the character encoding of +`string`. + +## See also + +- [buffer-alloc](https://github.com/LinusU/buffer-alloc) A ponyfill for `Buffer.alloc` +- [buffer-alloc-unsafe](https://github.com/LinusU/buffer-alloc-unsafe) A ponyfill for `Buffer.allocUnsafe` diff --git a/node_modules/capital-case/LICENSE b/node_modules/capital-case/LICENSE new file mode 100644 index 00000000..983fbe8a --- /dev/null +++ b/node_modules/capital-case/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/capital-case/README.md b/node_modules/capital-case/README.md new file mode 100644 index 00000000..06ce1584 --- /dev/null +++ b/node_modules/capital-case/README.md @@ -0,0 +1,37 @@ +# Capital Case + +[![NPM version][npm-image]][npm-url] +[![NPM downloads][downloads-image]][downloads-url] +[![Bundle size][bundlephobia-image]][bundlephobia-url] + +> Transform into a space separated string with each word capitalized. + +## Installation + +``` +npm install capital-case --save +``` + +## Usage + +```js +import { capitalCase } from "capital-case"; + +capitalCase("string"); //=> "String" +capitalCase("dot.case"); //=> "Dot Case" +capitalCase("PascalCase"); //=> "Pascal Case" +capitalCase("version 1.2.10"); //=> "Version 1 2 10" +``` + +The function also accepts [`options`](https://github.com/blakeembrey/change-case#options). + +## License + +MIT + +[npm-image]: https://img.shields.io/npm/v/capital-case.svg?style=flat +[npm-url]: https://npmjs.org/package/capital-case +[downloads-image]: https://img.shields.io/npm/dm/capital-case.svg?style=flat +[downloads-url]: https://npmjs.org/package/capital-case +[bundlephobia-image]: https://img.shields.io/bundlephobia/minzip/capital-case.svg +[bundlephobia-url]: https://bundlephobia.com/result?p=capital-case diff --git a/node_modules/capital-case/dist.es2015/index.d.ts b/node_modules/capital-case/dist.es2015/index.d.ts new file mode 100644 index 00000000..b11b8001 --- /dev/null +++ b/node_modules/capital-case/dist.es2015/index.d.ts @@ -0,0 +1,4 @@ +import { Options } from "no-case"; +export { Options }; +export declare function capitalCaseTransform(input: string): string; +export declare function capitalCase(input: string, options?: Options): string; diff --git a/node_modules/capital-case/dist.es2015/index.js b/node_modules/capital-case/dist.es2015/index.js new file mode 100644 index 00000000..10ecc5ed --- /dev/null +++ b/node_modules/capital-case/dist.es2015/index.js @@ -0,0 +1,11 @@ +import { __assign } from "tslib"; +import { noCase } from "no-case"; +import { upperCaseFirst } from "upper-case-first"; +export function capitalCaseTransform(input) { + return upperCaseFirst(input.toLowerCase()); +} +export function capitalCase(input, options) { + if (options === void 0) { options = {}; } + return noCase(input, __assign({ delimiter: " ", transform: capitalCaseTransform }, options)); +} +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/capital-case/dist.es2015/index.js.map b/node_modules/capital-case/dist.es2015/index.js.map new file mode 100644 index 00000000..8d9adf0c --- /dev/null +++ b/node_modules/capital-case/dist.es2015/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAW,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAIlD,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,OAAO,cAAc,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,OAAqB;IAArB,wBAAA,EAAA,YAAqB;IAC9D,OAAO,MAAM,CAAC,KAAK,aACjB,SAAS,EAAE,GAAG,EACd,SAAS,EAAE,oBAAoB,IAC5B,OAAO,EACV,CAAC;AACL,CAAC","sourcesContent":["import { noCase, Options } from \"no-case\";\nimport { upperCaseFirst } from \"upper-case-first\";\n\nexport { Options };\n\nexport function capitalCaseTransform(input: string) {\n return upperCaseFirst(input.toLowerCase());\n}\n\nexport function capitalCase(input: string, options: Options = {}) {\n return noCase(input, {\n delimiter: \" \",\n transform: capitalCaseTransform,\n ...options,\n });\n}\n"]} \ No newline at end of file diff --git a/node_modules/capital-case/dist.es2015/index.spec.d.ts b/node_modules/capital-case/dist.es2015/index.spec.d.ts new file mode 100644 index 00000000..cb0ff5c3 --- /dev/null +++ b/node_modules/capital-case/dist.es2015/index.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/capital-case/dist.es2015/index.spec.js b/node_modules/capital-case/dist.es2015/index.spec.js new file mode 100644 index 00000000..41835f91 --- /dev/null +++ b/node_modules/capital-case/dist.es2015/index.spec.js @@ -0,0 +1,22 @@ +import { capitalCase } from "."; +var TEST_CASES = [ + ["", ""], + ["test", "Test"], + ["test string", "Test String"], + ["Test String", "Test String"], + ["TestV2", "Test V2"], + ["version 1.2.10", "Version 1 2 10"], + ["version 1.21.0", "Version 1 21 0"], +]; +describe("capital case", function () { + var _loop_1 = function (input, result) { + it(input + " -> " + result, function () { + expect(capitalCase(input)).toEqual(result); + }); + }; + for (var _i = 0, TEST_CASES_1 = TEST_CASES; _i < TEST_CASES_1.length; _i++) { + var _a = TEST_CASES_1[_i], input = _a[0], result = _a[1]; + _loop_1(input, result); + } +}); +//# sourceMappingURL=index.spec.js.map \ No newline at end of file diff --git a/node_modules/capital-case/dist.es2015/index.spec.js.map b/node_modules/capital-case/dist.es2015/index.spec.js.map new file mode 100644 index 00000000..321a84de --- /dev/null +++ b/node_modules/capital-case/dist.es2015/index.spec.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.spec.js","sourceRoot":"","sources":["../src/index.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,CAAC;AAEhC,IAAM,UAAU,GAAuB;IACrC,CAAC,EAAE,EAAE,EAAE,CAAC;IACR,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,aAAa,EAAE,aAAa,CAAC;IAC9B,CAAC,aAAa,EAAE,aAAa,CAAC;IAC9B,CAAC,QAAQ,EAAE,SAAS,CAAC;IACrB,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IACpC,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;CACrC,CAAC;AAEF,QAAQ,CAAC,cAAc,EAAE;4BACX,KAAK,EAAE,MAAM;QACvB,EAAE,CAAI,KAAK,YAAO,MAAQ,EAAE;YAC1B,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;;IAHL,KAA8B,UAAU,EAAV,yBAAU,EAAV,wBAAU,EAAV,IAAU;QAA7B,IAAA,qBAAe,EAAd,KAAK,QAAA,EAAE,MAAM,QAAA;gBAAb,KAAK,EAAE,MAAM;KAIxB;AACH,CAAC,CAAC,CAAC","sourcesContent":["import { capitalCase } from \".\";\n\nconst TEST_CASES: [string, string][] = [\n [\"\", \"\"],\n [\"test\", \"Test\"],\n [\"test string\", \"Test String\"],\n [\"Test String\", \"Test String\"],\n [\"TestV2\", \"Test V2\"],\n [\"version 1.2.10\", \"Version 1 2 10\"],\n [\"version 1.21.0\", \"Version 1 21 0\"],\n];\n\ndescribe(\"capital case\", () => {\n for (const [input, result] of TEST_CASES) {\n it(`${input} -> ${result}`, () => {\n expect(capitalCase(input)).toEqual(result);\n });\n }\n});\n"]} \ No newline at end of file diff --git a/node_modules/capital-case/dist/index.d.ts b/node_modules/capital-case/dist/index.d.ts new file mode 100644 index 00000000..b11b8001 --- /dev/null +++ b/node_modules/capital-case/dist/index.d.ts @@ -0,0 +1,4 @@ +import { Options } from "no-case"; +export { Options }; +export declare function capitalCaseTransform(input: string): string; +export declare function capitalCase(input: string, options?: Options): string; diff --git a/node_modules/capital-case/dist/index.js b/node_modules/capital-case/dist/index.js new file mode 100644 index 00000000..a12cc1c4 --- /dev/null +++ b/node_modules/capital-case/dist/index.js @@ -0,0 +1,16 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.capitalCase = exports.capitalCaseTransform = void 0; +var tslib_1 = require("tslib"); +var no_case_1 = require("no-case"); +var upper_case_first_1 = require("upper-case-first"); +function capitalCaseTransform(input) { + return upper_case_first_1.upperCaseFirst(input.toLowerCase()); +} +exports.capitalCaseTransform = capitalCaseTransform; +function capitalCase(input, options) { + if (options === void 0) { options = {}; } + return no_case_1.noCase(input, tslib_1.__assign({ delimiter: " ", transform: capitalCaseTransform }, options)); +} +exports.capitalCase = capitalCase; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/capital-case/dist/index.js.map b/node_modules/capital-case/dist/index.js.map new file mode 100644 index 00000000..18c57cc2 --- /dev/null +++ b/node_modules/capital-case/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AAAA,mCAA0C;AAC1C,qDAAkD;AAIlD,SAAgB,oBAAoB,CAAC,KAAa;IAChD,OAAO,iCAAc,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;AAC7C,CAAC;AAFD,oDAEC;AAED,SAAgB,WAAW,CAAC,KAAa,EAAE,OAAqB;IAArB,wBAAA,EAAA,YAAqB;IAC9D,OAAO,gBAAM,CAAC,KAAK,qBACjB,SAAS,EAAE,GAAG,EACd,SAAS,EAAE,oBAAoB,IAC5B,OAAO,EACV,CAAC;AACL,CAAC;AAND,kCAMC","sourcesContent":["import { noCase, Options } from \"no-case\";\nimport { upperCaseFirst } from \"upper-case-first\";\n\nexport { Options };\n\nexport function capitalCaseTransform(input: string) {\n return upperCaseFirst(input.toLowerCase());\n}\n\nexport function capitalCase(input: string, options: Options = {}) {\n return noCase(input, {\n delimiter: \" \",\n transform: capitalCaseTransform,\n ...options,\n });\n}\n"]} \ No newline at end of file diff --git a/node_modules/capital-case/dist/index.spec.d.ts b/node_modules/capital-case/dist/index.spec.d.ts new file mode 100644 index 00000000..cb0ff5c3 --- /dev/null +++ b/node_modules/capital-case/dist/index.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/capital-case/dist/index.spec.js b/node_modules/capital-case/dist/index.spec.js new file mode 100644 index 00000000..0a3af9c6 --- /dev/null +++ b/node_modules/capital-case/dist/index.spec.js @@ -0,0 +1,24 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var _1 = require("."); +var TEST_CASES = [ + ["", ""], + ["test", "Test"], + ["test string", "Test String"], + ["Test String", "Test String"], + ["TestV2", "Test V2"], + ["version 1.2.10", "Version 1 2 10"], + ["version 1.21.0", "Version 1 21 0"], +]; +describe("capital case", function () { + var _loop_1 = function (input, result) { + it(input + " -> " + result, function () { + expect(_1.capitalCase(input)).toEqual(result); + }); + }; + for (var _i = 0, TEST_CASES_1 = TEST_CASES; _i < TEST_CASES_1.length; _i++) { + var _a = TEST_CASES_1[_i], input = _a[0], result = _a[1]; + _loop_1(input, result); + } +}); +//# sourceMappingURL=index.spec.js.map \ No newline at end of file diff --git a/node_modules/capital-case/dist/index.spec.js.map b/node_modules/capital-case/dist/index.spec.js.map new file mode 100644 index 00000000..2565e285 --- /dev/null +++ b/node_modules/capital-case/dist/index.spec.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.spec.js","sourceRoot":"","sources":["../src/index.spec.ts"],"names":[],"mappings":";;AAAA,sBAAgC;AAEhC,IAAM,UAAU,GAAuB;IACrC,CAAC,EAAE,EAAE,EAAE,CAAC;IACR,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,aAAa,EAAE,aAAa,CAAC;IAC9B,CAAC,aAAa,EAAE,aAAa,CAAC;IAC9B,CAAC,QAAQ,EAAE,SAAS,CAAC;IACrB,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IACpC,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;CACrC,CAAC;AAEF,QAAQ,CAAC,cAAc,EAAE;4BACX,KAAK,EAAE,MAAM;QACvB,EAAE,CAAI,KAAK,YAAO,MAAQ,EAAE;YAC1B,MAAM,CAAC,cAAW,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;;IAHL,KAA8B,UAAU,EAAV,yBAAU,EAAV,wBAAU,EAAV,IAAU;QAA7B,IAAA,qBAAe,EAAd,KAAK,QAAA,EAAE,MAAM,QAAA;gBAAb,KAAK,EAAE,MAAM;KAIxB;AACH,CAAC,CAAC,CAAC","sourcesContent":["import { capitalCase } from \".\";\n\nconst TEST_CASES: [string, string][] = [\n [\"\", \"\"],\n [\"test\", \"Test\"],\n [\"test string\", \"Test String\"],\n [\"Test String\", \"Test String\"],\n [\"TestV2\", \"Test V2\"],\n [\"version 1.2.10\", \"Version 1 2 10\"],\n [\"version 1.21.0\", \"Version 1 21 0\"],\n];\n\ndescribe(\"capital case\", () => {\n for (const [input, result] of TEST_CASES) {\n it(`${input} -> ${result}`, () => {\n expect(capitalCase(input)).toEqual(result);\n });\n }\n});\n"]} \ No newline at end of file diff --git a/node_modules/capital-case/package.json b/node_modules/capital-case/package.json new file mode 100644 index 00000000..40a3fb83 --- /dev/null +++ b/node_modules/capital-case/package.json @@ -0,0 +1,90 @@ +{ + "name": "capital-case", + "version": "1.0.4", + "description": "Transform into a space separated string with each word capitalized", + "main": "dist/index.js", + "typings": "dist/index.d.ts", + "module": "dist.es2015/index.js", + "sideEffects": false, + "jsnext:main": "dist.es2015/index.js", + "files": [ + "dist/", + "dist.es2015/", + "LICENSE" + ], + "scripts": { + "lint": "tslint \"src/**/*\" --project tsconfig.json", + "build": "rimraf dist/ dist.es2015/ && tsc && tsc -P tsconfig.es2015.json", + "specs": "jest --coverage", + "test": "npm run build && npm run lint && npm run specs", + "size": "size-limit", + "prepare": "npm run build" + }, + "repository": { + "type": "git", + "url": "git://github.com/blakeembrey/change-case.git" + }, + "keywords": [ + "capital", + "case", + "title", + "capital-case", + "convert", + "transform", + "capitalize" + ], + "author": { + "name": "Blake Embrey", + "email": "hello@blakeembrey.com", + "url": "http://blakeembrey.me" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/blakeembrey/change-case/issues" + }, + "homepage": "https://github.com/blakeembrey/change-case/tree/master/packages/capital-case#readme", + "size-limit": [ + { + "path": "dist/index.js", + "limit": "500 B" + } + ], + "jest": { + "roots": [ + "/src/" + ], + "transform": { + "\\.tsx?$": "ts-jest" + }, + "testRegex": "(/__tests__/.*|\\.(test|spec))\\.(tsx?|jsx?)$", + "moduleFileExtensions": [ + "ts", + "tsx", + "js", + "jsx", + "json", + "node" + ] + }, + "publishConfig": { + "access": "public" + }, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + }, + "devDependencies": { + "@size-limit/preset-small-lib": "^2.2.1", + "@types/jest": "^24.0.23", + "@types/node": "^12.12.14", + "jest": "^24.9.0", + "rimraf": "^3.0.0", + "ts-jest": "^24.2.0", + "tslint": "^5.20.1", + "tslint-config-prettier": "^1.18.0", + "tslint-config-standard": "^9.0.0", + "typescript": "^4.1.2" + }, + "gitHead": "76a21a7f6f2a226521ef6abd345ff309cbd01fb0" +} diff --git a/node_modules/chalk/index.d.ts b/node_modules/chalk/index.d.ts new file mode 100644 index 00000000..9cd88f38 --- /dev/null +++ b/node_modules/chalk/index.d.ts @@ -0,0 +1,415 @@ +/** +Basic foreground colors. + +[More colors here.](https://github.com/chalk/chalk/blob/master/readme.md#256-and-truecolor-color-support) +*/ +declare type ForegroundColor = + | 'black' + | 'red' + | 'green' + | 'yellow' + | 'blue' + | 'magenta' + | 'cyan' + | 'white' + | 'gray' + | 'grey' + | 'blackBright' + | 'redBright' + | 'greenBright' + | 'yellowBright' + | 'blueBright' + | 'magentaBright' + | 'cyanBright' + | 'whiteBright'; + +/** +Basic background colors. + +[More colors here.](https://github.com/chalk/chalk/blob/master/readme.md#256-and-truecolor-color-support) +*/ +declare type BackgroundColor = + | 'bgBlack' + | 'bgRed' + | 'bgGreen' + | 'bgYellow' + | 'bgBlue' + | 'bgMagenta' + | 'bgCyan' + | 'bgWhite' + | 'bgGray' + | 'bgGrey' + | 'bgBlackBright' + | 'bgRedBright' + | 'bgGreenBright' + | 'bgYellowBright' + | 'bgBlueBright' + | 'bgMagentaBright' + | 'bgCyanBright' + | 'bgWhiteBright'; + +/** +Basic colors. + +[More colors here.](https://github.com/chalk/chalk/blob/master/readme.md#256-and-truecolor-color-support) +*/ +declare type Color = ForegroundColor | BackgroundColor; + +declare type Modifiers = + | 'reset' + | 'bold' + | 'dim' + | 'italic' + | 'underline' + | 'inverse' + | 'hidden' + | 'strikethrough' + | 'visible'; + +declare namespace chalk { + /** + Levels: + - `0` - All colors disabled. + - `1` - Basic 16 colors support. + - `2` - ANSI 256 colors support. + - `3` - Truecolor 16 million colors support. + */ + type Level = 0 | 1 | 2 | 3; + + interface Options { + /** + Specify the color support for Chalk. + + By default, color support is automatically detected based on the environment. + + Levels: + - `0` - All colors disabled. + - `1` - Basic 16 colors support. + - `2` - ANSI 256 colors support. + - `3` - Truecolor 16 million colors support. + */ + level?: Level; + } + + /** + Return a new Chalk instance. + */ + type Instance = new (options?: Options) => Chalk; + + /** + Detect whether the terminal supports color. + */ + interface ColorSupport { + /** + The color level used by Chalk. + */ + level: Level; + + /** + Return whether Chalk supports basic 16 colors. + */ + hasBasic: boolean; + + /** + Return whether Chalk supports ANSI 256 colors. + */ + has256: boolean; + + /** + Return whether Chalk supports Truecolor 16 million colors. + */ + has16m: boolean; + } + + interface ChalkFunction { + /** + Use a template string. + + @remarks Template literals are unsupported for nested calls (see [issue #341](https://github.com/chalk/chalk/issues/341)) + + @example + ``` + import chalk = require('chalk'); + + log(chalk` + CPU: {red ${cpu.totalPercent}%} + RAM: {green ${ram.used / ram.total * 100}%} + DISK: {rgb(255,131,0) ${disk.used / disk.total * 100}%} + `); + ``` + + @example + ``` + import chalk = require('chalk'); + + log(chalk.red.bgBlack`2 + 3 = {bold ${2 + 3}}`) + ``` + */ + (text: TemplateStringsArray, ...placeholders: unknown[]): string; + + (...text: unknown[]): string; + } + + interface Chalk extends ChalkFunction { + /** + Return a new Chalk instance. + */ + Instance: Instance; + + /** + The color support for Chalk. + + By default, color support is automatically detected based on the environment. + + Levels: + - `0` - All colors disabled. + - `1` - Basic 16 colors support. + - `2` - ANSI 256 colors support. + - `3` - Truecolor 16 million colors support. + */ + level: Level; + + /** + Use HEX value to set text color. + + @param color - Hexadecimal value representing the desired color. + + @example + ``` + import chalk = require('chalk'); + + chalk.hex('#DEADED'); + ``` + */ + hex(color: string): Chalk; + + /** + Use keyword color value to set text color. + + @param color - Keyword value representing the desired color. + + @example + ``` + import chalk = require('chalk'); + + chalk.keyword('orange'); + ``` + */ + keyword(color: string): Chalk; + + /** + Use RGB values to set text color. + */ + rgb(red: number, green: number, blue: number): Chalk; + + /** + Use HSL values to set text color. + */ + hsl(hue: number, saturation: number, lightness: number): Chalk; + + /** + Use HSV values to set text color. + */ + hsv(hue: number, saturation: number, value: number): Chalk; + + /** + Use HWB values to set text color. + */ + hwb(hue: number, whiteness: number, blackness: number): Chalk; + + /** + Use a [Select/Set Graphic Rendition](https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters) (SGR) [color code number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit) to set text color. + + 30 <= code && code < 38 || 90 <= code && code < 98 + For example, 31 for red, 91 for redBright. + */ + ansi(code: number): Chalk; + + /** + Use a [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set text color. + */ + ansi256(index: number): Chalk; + + /** + Use HEX value to set background color. + + @param color - Hexadecimal value representing the desired color. + + @example + ``` + import chalk = require('chalk'); + + chalk.bgHex('#DEADED'); + ``` + */ + bgHex(color: string): Chalk; + + /** + Use keyword color value to set background color. + + @param color - Keyword value representing the desired color. + + @example + ``` + import chalk = require('chalk'); + + chalk.bgKeyword('orange'); + ``` + */ + bgKeyword(color: string): Chalk; + + /** + Use RGB values to set background color. + */ + bgRgb(red: number, green: number, blue: number): Chalk; + + /** + Use HSL values to set background color. + */ + bgHsl(hue: number, saturation: number, lightness: number): Chalk; + + /** + Use HSV values to set background color. + */ + bgHsv(hue: number, saturation: number, value: number): Chalk; + + /** + Use HWB values to set background color. + */ + bgHwb(hue: number, whiteness: number, blackness: number): Chalk; + + /** + Use a [Select/Set Graphic Rendition](https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters) (SGR) [color code number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit) to set background color. + + 30 <= code && code < 38 || 90 <= code && code < 98 + For example, 31 for red, 91 for redBright. + Use the foreground code, not the background code (for example, not 41, nor 101). + */ + bgAnsi(code: number): Chalk; + + /** + Use a [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set background color. + */ + bgAnsi256(index: number): Chalk; + + /** + Modifier: Resets the current color chain. + */ + readonly reset: Chalk; + + /** + Modifier: Make text bold. + */ + readonly bold: Chalk; + + /** + Modifier: Emitting only a small amount of light. + */ + readonly dim: Chalk; + + /** + Modifier: Make text italic. (Not widely supported) + */ + readonly italic: Chalk; + + /** + Modifier: Make text underline. (Not widely supported) + */ + readonly underline: Chalk; + + /** + Modifier: Inverse background and foreground colors. + */ + readonly inverse: Chalk; + + /** + Modifier: Prints the text, but makes it invisible. + */ + readonly hidden: Chalk; + + /** + Modifier: Puts a horizontal line through the center of the text. (Not widely supported) + */ + readonly strikethrough: Chalk; + + /** + Modifier: Prints the text only when Chalk has a color support level > 0. + Can be useful for things that are purely cosmetic. + */ + readonly visible: Chalk; + + readonly black: Chalk; + readonly red: Chalk; + readonly green: Chalk; + readonly yellow: Chalk; + readonly blue: Chalk; + readonly magenta: Chalk; + readonly cyan: Chalk; + readonly white: Chalk; + + /* + Alias for `blackBright`. + */ + readonly gray: Chalk; + + /* + Alias for `blackBright`. + */ + readonly grey: Chalk; + + readonly blackBright: Chalk; + readonly redBright: Chalk; + readonly greenBright: Chalk; + readonly yellowBright: Chalk; + readonly blueBright: Chalk; + readonly magentaBright: Chalk; + readonly cyanBright: Chalk; + readonly whiteBright: Chalk; + + readonly bgBlack: Chalk; + readonly bgRed: Chalk; + readonly bgGreen: Chalk; + readonly bgYellow: Chalk; + readonly bgBlue: Chalk; + readonly bgMagenta: Chalk; + readonly bgCyan: Chalk; + readonly bgWhite: Chalk; + + /* + Alias for `bgBlackBright`. + */ + readonly bgGray: Chalk; + + /* + Alias for `bgBlackBright`. + */ + readonly bgGrey: Chalk; + + readonly bgBlackBright: Chalk; + readonly bgRedBright: Chalk; + readonly bgGreenBright: Chalk; + readonly bgYellowBright: Chalk; + readonly bgBlueBright: Chalk; + readonly bgMagentaBright: Chalk; + readonly bgCyanBright: Chalk; + readonly bgWhiteBright: Chalk; + } +} + +/** +Main Chalk object that allows to chain styles together. +Call the last one as a method with a string argument. +Order doesn't matter, and later styles take precedent in case of a conflict. +This simply means that `chalk.red.yellow.green` is equivalent to `chalk.green`. +*/ +declare const chalk: chalk.Chalk & chalk.ChalkFunction & { + supportsColor: chalk.ColorSupport | false; + Level: chalk.Level; + Color: Color; + ForegroundColor: ForegroundColor; + BackgroundColor: BackgroundColor; + Modifiers: Modifiers; + stderr: chalk.Chalk & {supportsColor: chalk.ColorSupport | false}; +}; + +export = chalk; diff --git a/node_modules/chalk/license b/node_modules/chalk/license new file mode 100644 index 00000000..e7af2f77 --- /dev/null +++ b/node_modules/chalk/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/chalk/node_modules/ansi-styles/index.d.ts b/node_modules/chalk/node_modules/ansi-styles/index.d.ts new file mode 100644 index 00000000..44a907e5 --- /dev/null +++ b/node_modules/chalk/node_modules/ansi-styles/index.d.ts @@ -0,0 +1,345 @@ +declare type CSSColor = + | 'aliceblue' + | 'antiquewhite' + | 'aqua' + | 'aquamarine' + | 'azure' + | 'beige' + | 'bisque' + | 'black' + | 'blanchedalmond' + | 'blue' + | 'blueviolet' + | 'brown' + | 'burlywood' + | 'cadetblue' + | 'chartreuse' + | 'chocolate' + | 'coral' + | 'cornflowerblue' + | 'cornsilk' + | 'crimson' + | 'cyan' + | 'darkblue' + | 'darkcyan' + | 'darkgoldenrod' + | 'darkgray' + | 'darkgreen' + | 'darkgrey' + | 'darkkhaki' + | 'darkmagenta' + | 'darkolivegreen' + | 'darkorange' + | 'darkorchid' + | 'darkred' + | 'darksalmon' + | 'darkseagreen' + | 'darkslateblue' + | 'darkslategray' + | 'darkslategrey' + | 'darkturquoise' + | 'darkviolet' + | 'deeppink' + | 'deepskyblue' + | 'dimgray' + | 'dimgrey' + | 'dodgerblue' + | 'firebrick' + | 'floralwhite' + | 'forestgreen' + | 'fuchsia' + | 'gainsboro' + | 'ghostwhite' + | 'gold' + | 'goldenrod' + | 'gray' + | 'green' + | 'greenyellow' + | 'grey' + | 'honeydew' + | 'hotpink' + | 'indianred' + | 'indigo' + | 'ivory' + | 'khaki' + | 'lavender' + | 'lavenderblush' + | 'lawngreen' + | 'lemonchiffon' + | 'lightblue' + | 'lightcoral' + | 'lightcyan' + | 'lightgoldenrodyellow' + | 'lightgray' + | 'lightgreen' + | 'lightgrey' + | 'lightpink' + | 'lightsalmon' + | 'lightseagreen' + | 'lightskyblue' + | 'lightslategray' + | 'lightslategrey' + | 'lightsteelblue' + | 'lightyellow' + | 'lime' + | 'limegreen' + | 'linen' + | 'magenta' + | 'maroon' + | 'mediumaquamarine' + | 'mediumblue' + | 'mediumorchid' + | 'mediumpurple' + | 'mediumseagreen' + | 'mediumslateblue' + | 'mediumspringgreen' + | 'mediumturquoise' + | 'mediumvioletred' + | 'midnightblue' + | 'mintcream' + | 'mistyrose' + | 'moccasin' + | 'navajowhite' + | 'navy' + | 'oldlace' + | 'olive' + | 'olivedrab' + | 'orange' + | 'orangered' + | 'orchid' + | 'palegoldenrod' + | 'palegreen' + | 'paleturquoise' + | 'palevioletred' + | 'papayawhip' + | 'peachpuff' + | 'peru' + | 'pink' + | 'plum' + | 'powderblue' + | 'purple' + | 'rebeccapurple' + | 'red' + | 'rosybrown' + | 'royalblue' + | 'saddlebrown' + | 'salmon' + | 'sandybrown' + | 'seagreen' + | 'seashell' + | 'sienna' + | 'silver' + | 'skyblue' + | 'slateblue' + | 'slategray' + | 'slategrey' + | 'snow' + | 'springgreen' + | 'steelblue' + | 'tan' + | 'teal' + | 'thistle' + | 'tomato' + | 'turquoise' + | 'violet' + | 'wheat' + | 'white' + | 'whitesmoke' + | 'yellow' + | 'yellowgreen'; + +declare namespace ansiStyles { + interface ColorConvert { + /** + The RGB color space. + + @param red - (`0`-`255`) + @param green - (`0`-`255`) + @param blue - (`0`-`255`) + */ + rgb(red: number, green: number, blue: number): string; + + /** + The RGB HEX color space. + + @param hex - A hexadecimal string containing RGB data. + */ + hex(hex: string): string; + + /** + @param keyword - A CSS color name. + */ + keyword(keyword: CSSColor): string; + + /** + The HSL color space. + + @param hue - (`0`-`360`) + @param saturation - (`0`-`100`) + @param lightness - (`0`-`100`) + */ + hsl(hue: number, saturation: number, lightness: number): string; + + /** + The HSV color space. + + @param hue - (`0`-`360`) + @param saturation - (`0`-`100`) + @param value - (`0`-`100`) + */ + hsv(hue: number, saturation: number, value: number): string; + + /** + The HSV color space. + + @param hue - (`0`-`360`) + @param whiteness - (`0`-`100`) + @param blackness - (`0`-`100`) + */ + hwb(hue: number, whiteness: number, blackness: number): string; + + /** + Use a [4-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4-bit) to set text color. + */ + ansi(ansi: number): string; + + /** + Use an [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set text color. + */ + ansi256(ansi: number): string; + } + + interface CSPair { + /** + The ANSI terminal control sequence for starting this style. + */ + readonly open: string; + + /** + The ANSI terminal control sequence for ending this style. + */ + readonly close: string; + } + + interface ColorBase { + readonly ansi: ColorConvert; + readonly ansi256: ColorConvert; + readonly ansi16m: ColorConvert; + + /** + The ANSI terminal control sequence for ending this color. + */ + readonly close: string; + } + + interface Modifier { + /** + Resets the current color chain. + */ + readonly reset: CSPair; + + /** + Make text bold. + */ + readonly bold: CSPair; + + /** + Emitting only a small amount of light. + */ + readonly dim: CSPair; + + /** + Make text italic. (Not widely supported) + */ + readonly italic: CSPair; + + /** + Make text underline. (Not widely supported) + */ + readonly underline: CSPair; + + /** + Inverse background and foreground colors. + */ + readonly inverse: CSPair; + + /** + Prints the text, but makes it invisible. + */ + readonly hidden: CSPair; + + /** + Puts a horizontal line through the center of the text. (Not widely supported) + */ + readonly strikethrough: CSPair; + } + + interface ForegroundColor { + readonly black: CSPair; + readonly red: CSPair; + readonly green: CSPair; + readonly yellow: CSPair; + readonly blue: CSPair; + readonly cyan: CSPair; + readonly magenta: CSPair; + readonly white: CSPair; + + /** + Alias for `blackBright`. + */ + readonly gray: CSPair; + + /** + Alias for `blackBright`. + */ + readonly grey: CSPair; + + readonly blackBright: CSPair; + readonly redBright: CSPair; + readonly greenBright: CSPair; + readonly yellowBright: CSPair; + readonly blueBright: CSPair; + readonly cyanBright: CSPair; + readonly magentaBright: CSPair; + readonly whiteBright: CSPair; + } + + interface BackgroundColor { + readonly bgBlack: CSPair; + readonly bgRed: CSPair; + readonly bgGreen: CSPair; + readonly bgYellow: CSPair; + readonly bgBlue: CSPair; + readonly bgCyan: CSPair; + readonly bgMagenta: CSPair; + readonly bgWhite: CSPair; + + /** + Alias for `bgBlackBright`. + */ + readonly bgGray: CSPair; + + /** + Alias for `bgBlackBright`. + */ + readonly bgGrey: CSPair; + + readonly bgBlackBright: CSPair; + readonly bgRedBright: CSPair; + readonly bgGreenBright: CSPair; + readonly bgYellowBright: CSPair; + readonly bgBlueBright: CSPair; + readonly bgCyanBright: CSPair; + readonly bgMagentaBright: CSPair; + readonly bgWhiteBright: CSPair; + } +} + +declare const ansiStyles: { + readonly modifier: ansiStyles.Modifier; + readonly color: ansiStyles.ForegroundColor & ansiStyles.ColorBase; + readonly bgColor: ansiStyles.BackgroundColor & ansiStyles.ColorBase; + readonly codes: ReadonlyMap; +} & ansiStyles.BackgroundColor & ansiStyles.ForegroundColor & ansiStyles.Modifier; + +export = ansiStyles; diff --git a/node_modules/chalk/node_modules/ansi-styles/index.js b/node_modules/chalk/node_modules/ansi-styles/index.js new file mode 100644 index 00000000..5d82581a --- /dev/null +++ b/node_modules/chalk/node_modules/ansi-styles/index.js @@ -0,0 +1,163 @@ +'use strict'; + +const wrapAnsi16 = (fn, offset) => (...args) => { + const code = fn(...args); + return `\u001B[${code + offset}m`; +}; + +const wrapAnsi256 = (fn, offset) => (...args) => { + const code = fn(...args); + return `\u001B[${38 + offset};5;${code}m`; +}; + +const wrapAnsi16m = (fn, offset) => (...args) => { + const rgb = fn(...args); + return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; +}; + +const ansi2ansi = n => n; +const rgb2rgb = (r, g, b) => [r, g, b]; + +const setLazyProperty = (object, property, get) => { + Object.defineProperty(object, property, { + get: () => { + const value = get(); + + Object.defineProperty(object, property, { + value, + enumerable: true, + configurable: true + }); + + return value; + }, + enumerable: true, + configurable: true + }); +}; + +/** @type {typeof import('color-convert')} */ +let colorConvert; +const makeDynamicStyles = (wrap, targetSpace, identity, isBackground) => { + if (colorConvert === undefined) { + colorConvert = require('color-convert'); + } + + const offset = isBackground ? 10 : 0; + const styles = {}; + + for (const [sourceSpace, suite] of Object.entries(colorConvert)) { + const name = sourceSpace === 'ansi16' ? 'ansi' : sourceSpace; + if (sourceSpace === targetSpace) { + styles[name] = wrap(identity, offset); + } else if (typeof suite === 'object') { + styles[name] = wrap(suite[targetSpace], offset); + } + } + + return styles; +}; + +function assembleStyles() { + const codes = new Map(); + const styles = { + modifier: { + reset: [0, 0], + // 21 isn't widely supported and 22 does the same thing + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29] + }, + color: { + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + + // Bright color + blackBright: [90, 39], + redBright: [91, 39], + greenBright: [92, 39], + yellowBright: [93, 39], + blueBright: [94, 39], + magentaBright: [95, 39], + cyanBright: [96, 39], + whiteBright: [97, 39] + }, + bgColor: { + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], + + // Bright color + bgBlackBright: [100, 49], + bgRedBright: [101, 49], + bgGreenBright: [102, 49], + bgYellowBright: [103, 49], + bgBlueBright: [104, 49], + bgMagentaBright: [105, 49], + bgCyanBright: [106, 49], + bgWhiteBright: [107, 49] + } + }; + + // Alias bright black as gray (and grey) + styles.color.gray = styles.color.blackBright; + styles.bgColor.bgGray = styles.bgColor.bgBlackBright; + styles.color.grey = styles.color.blackBright; + styles.bgColor.bgGrey = styles.bgColor.bgBlackBright; + + for (const [groupName, group] of Object.entries(styles)) { + for (const [styleName, style] of Object.entries(group)) { + styles[styleName] = { + open: `\u001B[${style[0]}m`, + close: `\u001B[${style[1]}m` + }; + + group[styleName] = styles[styleName]; + + codes.set(style[0], style[1]); + } + + Object.defineProperty(styles, groupName, { + value: group, + enumerable: false + }); + } + + Object.defineProperty(styles, 'codes', { + value: codes, + enumerable: false + }); + + styles.color.close = '\u001B[39m'; + styles.bgColor.close = '\u001B[49m'; + + setLazyProperty(styles.color, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, false)); + setLazyProperty(styles.color, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, false)); + setLazyProperty(styles.color, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, false)); + setLazyProperty(styles.bgColor, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, true)); + setLazyProperty(styles.bgColor, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, true)); + setLazyProperty(styles.bgColor, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, true)); + + return styles; +} + +// Make the export immutable +Object.defineProperty(module, 'exports', { + enumerable: true, + get: assembleStyles +}); diff --git a/node_modules/chalk/node_modules/ansi-styles/license b/node_modules/chalk/node_modules/ansi-styles/license new file mode 100644 index 00000000..e7af2f77 --- /dev/null +++ b/node_modules/chalk/node_modules/ansi-styles/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/chalk/node_modules/ansi-styles/package.json b/node_modules/chalk/node_modules/ansi-styles/package.json new file mode 100644 index 00000000..75393284 --- /dev/null +++ b/node_modules/chalk/node_modules/ansi-styles/package.json @@ -0,0 +1,56 @@ +{ + "name": "ansi-styles", + "version": "4.3.0", + "description": "ANSI escape codes for styling strings in the terminal", + "license": "MIT", + "repository": "chalk/ansi-styles", + "funding": "https://github.com/chalk/ansi-styles?sponsor=1", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=8" + }, + "scripts": { + "test": "xo && ava && tsd", + "screenshot": "svg-term --command='node screenshot' --out=screenshot.svg --padding=3 --width=55 --height=3 --at=1000 --no-cursor" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "keywords": [ + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "dependencies": { + "color-convert": "^2.0.1" + }, + "devDependencies": { + "@types/color-convert": "^1.9.0", + "ava": "^2.3.0", + "svg-term-cli": "^2.1.1", + "tsd": "^0.11.0", + "xo": "^0.25.3" + } +} diff --git a/node_modules/chalk/node_modules/ansi-styles/readme.md b/node_modules/chalk/node_modules/ansi-styles/readme.md new file mode 100644 index 00000000..24883de8 --- /dev/null +++ b/node_modules/chalk/node_modules/ansi-styles/readme.md @@ -0,0 +1,152 @@ +# ansi-styles [![Build Status](https://travis-ci.org/chalk/ansi-styles.svg?branch=master)](https://travis-ci.org/chalk/ansi-styles) + +> [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for styling strings in the terminal + +You probably want the higher-level [chalk](https://github.com/chalk/chalk) module for styling your strings. + + + +## Install + +``` +$ npm install ansi-styles +``` + +## Usage + +```js +const style = require('ansi-styles'); + +console.log(`${style.green.open}Hello world!${style.green.close}`); + + +// Color conversion between 16/256/truecolor +// NOTE: If conversion goes to 16 colors or 256 colors, the original color +// may be degraded to fit that color palette. This means terminals +// that do not support 16 million colors will best-match the +// original color. +console.log(style.bgColor.ansi.hsl(120, 80, 72) + 'Hello world!' + style.bgColor.close); +console.log(style.color.ansi256.rgb(199, 20, 250) + 'Hello world!' + style.color.close); +console.log(style.color.ansi16m.hex('#abcdef') + 'Hello world!' + style.color.close); +``` + +## API + +Each style has an `open` and `close` property. + +## Styles + +### Modifiers + +- `reset` +- `bold` +- `dim` +- `italic` *(Not widely supported)* +- `underline` +- `inverse` +- `hidden` +- `strikethrough` *(Not widely supported)* + +### Colors + +- `black` +- `red` +- `green` +- `yellow` +- `blue` +- `magenta` +- `cyan` +- `white` +- `blackBright` (alias: `gray`, `grey`) +- `redBright` +- `greenBright` +- `yellowBright` +- `blueBright` +- `magentaBright` +- `cyanBright` +- `whiteBright` + +### Background colors + +- `bgBlack` +- `bgRed` +- `bgGreen` +- `bgYellow` +- `bgBlue` +- `bgMagenta` +- `bgCyan` +- `bgWhite` +- `bgBlackBright` (alias: `bgGray`, `bgGrey`) +- `bgRedBright` +- `bgGreenBright` +- `bgYellowBright` +- `bgBlueBright` +- `bgMagentaBright` +- `bgCyanBright` +- `bgWhiteBright` + +## Advanced usage + +By default, you get a map of styles, but the styles are also available as groups. They are non-enumerable so they don't show up unless you access them explicitly. This makes it easier to expose only a subset in a higher-level module. + +- `style.modifier` +- `style.color` +- `style.bgColor` + +###### Example + +```js +console.log(style.color.green.open); +``` + +Raw escape codes (i.e. without the CSI escape prefix `\u001B[` and render mode postfix `m`) are available under `style.codes`, which returns a `Map` with the open codes as keys and close codes as values. + +###### Example + +```js +console.log(style.codes.get(36)); +//=> 39 +``` + +## [256 / 16 million (TrueColor) support](https://gist.github.com/XVilka/8346728) + +`ansi-styles` uses the [`color-convert`](https://github.com/Qix-/color-convert) package to allow for converting between various colors and ANSI escapes, with support for 256 and 16 million colors. + +The following color spaces from `color-convert` are supported: + +- `rgb` +- `hex` +- `keyword` +- `hsl` +- `hsv` +- `hwb` +- `ansi` +- `ansi256` + +To use these, call the associated conversion function with the intended output, for example: + +```js +style.color.ansi.rgb(100, 200, 15); // RGB to 16 color ansi foreground code +style.bgColor.ansi.rgb(100, 200, 15); // RGB to 16 color ansi background code + +style.color.ansi256.hsl(120, 100, 60); // HSL to 256 color ansi foreground code +style.bgColor.ansi256.hsl(120, 100, 60); // HSL to 256 color ansi foreground code + +style.color.ansi16m.hex('#C0FFEE'); // Hex (RGB) to 16 million color foreground code +style.bgColor.ansi16m.hex('#C0FFEE'); // Hex (RGB) to 16 million color background code +``` + +## Related + +- [ansi-escapes](https://github.com/sindresorhus/ansi-escapes) - ANSI escape codes for manipulating the terminal + +## Maintainers + +- [Sindre Sorhus](https://github.com/sindresorhus) +- [Josh Junon](https://github.com/qix-) + +## For enterprise + +Available as part of the Tidelift Subscription. + +The maintainers of `ansi-styles` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-ansi-styles?utm_source=npm-ansi-styles&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) diff --git a/node_modules/chalk/node_modules/supports-color/browser.js b/node_modules/chalk/node_modules/supports-color/browser.js new file mode 100644 index 00000000..62afa3a7 --- /dev/null +++ b/node_modules/chalk/node_modules/supports-color/browser.js @@ -0,0 +1,5 @@ +'use strict'; +module.exports = { + stdout: false, + stderr: false +}; diff --git a/node_modules/chalk/node_modules/supports-color/index.js b/node_modules/chalk/node_modules/supports-color/index.js new file mode 100644 index 00000000..6fada390 --- /dev/null +++ b/node_modules/chalk/node_modules/supports-color/index.js @@ -0,0 +1,135 @@ +'use strict'; +const os = require('os'); +const tty = require('tty'); +const hasFlag = require('has-flag'); + +const {env} = process; + +let forceColor; +if (hasFlag('no-color') || + hasFlag('no-colors') || + hasFlag('color=false') || + hasFlag('color=never')) { + forceColor = 0; +} else if (hasFlag('color') || + hasFlag('colors') || + hasFlag('color=true') || + hasFlag('color=always')) { + forceColor = 1; +} + +if ('FORCE_COLOR' in env) { + if (env.FORCE_COLOR === 'true') { + forceColor = 1; + } else if (env.FORCE_COLOR === 'false') { + forceColor = 0; + } else { + forceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3); + } +} + +function translateLevel(level) { + if (level === 0) { + return false; + } + + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; +} + +function supportsColor(haveStream, streamIsTTY) { + if (forceColor === 0) { + return 0; + } + + if (hasFlag('color=16m') || + hasFlag('color=full') || + hasFlag('color=truecolor')) { + return 3; + } + + if (hasFlag('color=256')) { + return 2; + } + + if (haveStream && !streamIsTTY && forceColor === undefined) { + return 0; + } + + const min = forceColor || 0; + + if (env.TERM === 'dumb') { + return min; + } + + if (process.platform === 'win32') { + // Windows 10 build 10586 is the first Windows release that supports 256 colors. + // Windows 10 build 14931 is the first release that supports 16m/TrueColor. + const osRelease = os.release().split('.'); + if ( + Number(osRelease[0]) >= 10 && + Number(osRelease[2]) >= 10586 + ) { + return Number(osRelease[2]) >= 14931 ? 3 : 2; + } + + return 1; + } + + if ('CI' in env) { + if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE'].some(sign => sign in env) || env.CI_NAME === 'codeship') { + return 1; + } + + return min; + } + + if ('TEAMCITY_VERSION' in env) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; + } + + if (env.COLORTERM === 'truecolor') { + return 3; + } + + if ('TERM_PROGRAM' in env) { + const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); + + switch (env.TERM_PROGRAM) { + case 'iTerm.app': + return version >= 3 ? 3 : 2; + case 'Apple_Terminal': + return 2; + // No default + } + } + + if (/-256(color)?$/i.test(env.TERM)) { + return 2; + } + + if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; + } + + if ('COLORTERM' in env) { + return 1; + } + + return min; +} + +function getSupportLevel(stream) { + const level = supportsColor(stream, stream && stream.isTTY); + return translateLevel(level); +} + +module.exports = { + supportsColor: getSupportLevel, + stdout: translateLevel(supportsColor(true, tty.isatty(1))), + stderr: translateLevel(supportsColor(true, tty.isatty(2))) +}; diff --git a/node_modules/chalk/node_modules/supports-color/license b/node_modules/chalk/node_modules/supports-color/license new file mode 100644 index 00000000..e7af2f77 --- /dev/null +++ b/node_modules/chalk/node_modules/supports-color/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/chalk/node_modules/supports-color/package.json b/node_modules/chalk/node_modules/supports-color/package.json new file mode 100644 index 00000000..f7182edc --- /dev/null +++ b/node_modules/chalk/node_modules/supports-color/package.json @@ -0,0 +1,53 @@ +{ + "name": "supports-color", + "version": "7.2.0", + "description": "Detect whether a terminal supports color", + "license": "MIT", + "repository": "chalk/supports-color", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=8" + }, + "scripts": { + "test": "xo && ava" + }, + "files": [ + "index.js", + "browser.js" + ], + "keywords": [ + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "ansi", + "styles", + "tty", + "rgb", + "256", + "shell", + "xterm", + "command-line", + "support", + "supports", + "capability", + "detect", + "truecolor", + "16m" + ], + "dependencies": { + "has-flag": "^4.0.0" + }, + "devDependencies": { + "ava": "^1.4.1", + "import-fresh": "^3.0.0", + "xo": "^0.24.0" + }, + "browser": "browser.js" +} diff --git a/node_modules/chalk/node_modules/supports-color/readme.md b/node_modules/chalk/node_modules/supports-color/readme.md new file mode 100644 index 00000000..36542285 --- /dev/null +++ b/node_modules/chalk/node_modules/supports-color/readme.md @@ -0,0 +1,76 @@ +# supports-color [![Build Status](https://travis-ci.org/chalk/supports-color.svg?branch=master)](https://travis-ci.org/chalk/supports-color) + +> Detect whether a terminal supports color + + +## Install + +``` +$ npm install supports-color +``` + + +## Usage + +```js +const supportsColor = require('supports-color'); + +if (supportsColor.stdout) { + console.log('Terminal stdout supports color'); +} + +if (supportsColor.stdout.has256) { + console.log('Terminal stdout supports 256 colors'); +} + +if (supportsColor.stderr.has16m) { + console.log('Terminal stderr supports 16 million colors (truecolor)'); +} +``` + + +## API + +Returns an `Object` with a `stdout` and `stderr` property for testing either streams. Each property is an `Object`, or `false` if color is not supported. + +The `stdout`/`stderr` objects specifies a level of support for color through a `.level` property and a corresponding flag: + +- `.level = 1` and `.hasBasic = true`: Basic color support (16 colors) +- `.level = 2` and `.has256 = true`: 256 color support +- `.level = 3` and `.has16m = true`: Truecolor support (16 million colors) + + +## Info + +It obeys the `--color` and `--no-color` CLI flags. + +For situations where using `--color` is not possible, use the environment variable `FORCE_COLOR=1` (level 1), `FORCE_COLOR=2` (level 2), or `FORCE_COLOR=3` (level 3) to forcefully enable color, or `FORCE_COLOR=0` to forcefully disable. The use of `FORCE_COLOR` overrides all other color support checks. + +Explicit 256/Truecolor mode can be enabled using the `--color=256` and `--color=16m` flags, respectively. + + +## Related + +- [supports-color-cli](https://github.com/chalk/supports-color-cli) - CLI for this module +- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right + + +## Maintainers + +- [Sindre Sorhus](https://github.com/sindresorhus) +- [Josh Junon](https://github.com/qix-) + + +--- + + + +--- diff --git a/node_modules/chalk/package.json b/node_modules/chalk/package.json new file mode 100644 index 00000000..47c23f29 --- /dev/null +++ b/node_modules/chalk/package.json @@ -0,0 +1,68 @@ +{ + "name": "chalk", + "version": "4.1.2", + "description": "Terminal string styling done right", + "license": "MIT", + "repository": "chalk/chalk", + "funding": "https://github.com/chalk/chalk?sponsor=1", + "main": "source", + "engines": { + "node": ">=10" + }, + "scripts": { + "test": "xo && nyc ava && tsd", + "bench": "matcha benchmark.js" + }, + "files": [ + "source", + "index.d.ts" + ], + "keywords": [ + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "str", + "ansi", + "style", + "styles", + "tty", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "devDependencies": { + "ava": "^2.4.0", + "coveralls": "^3.0.7", + "execa": "^4.0.0", + "import-fresh": "^3.1.0", + "matcha": "^0.7.0", + "nyc": "^15.0.0", + "resolve-from": "^5.0.0", + "tsd": "^0.7.4", + "xo": "^0.28.2" + }, + "xo": { + "rules": { + "unicorn/prefer-string-slice": "off", + "unicorn/prefer-includes": "off", + "@typescript-eslint/member-ordering": "off", + "no-redeclare": "off", + "unicorn/string-content": "off", + "unicorn/better-regex": "off" + } + } +} diff --git a/node_modules/chalk/readme.md b/node_modules/chalk/readme.md new file mode 100644 index 00000000..a055d21c --- /dev/null +++ b/node_modules/chalk/readme.md @@ -0,0 +1,341 @@ +

      +
      +
      + Chalk +
      +
      +
      +

      + +> Terminal string styling done right + +[![Build Status](https://travis-ci.org/chalk/chalk.svg?branch=master)](https://travis-ci.org/chalk/chalk) [![Coverage Status](https://coveralls.io/repos/github/chalk/chalk/badge.svg?branch=master)](https://coveralls.io/github/chalk/chalk?branch=master) [![npm dependents](https://badgen.net/npm/dependents/chalk)](https://www.npmjs.com/package/chalk?activeTab=dependents) [![Downloads](https://badgen.net/npm/dt/chalk)](https://www.npmjs.com/package/chalk) [![](https://img.shields.io/badge/unicorn-approved-ff69b4.svg)](https://www.youtube.com/watch?v=9auOCbH5Ns4) [![XO code style](https://img.shields.io/badge/code_style-XO-5ed9c7.svg)](https://github.com/xojs/xo) ![TypeScript-ready](https://img.shields.io/npm/types/chalk.svg) [![run on repl.it](https://repl.it/badge/github/chalk/chalk)](https://repl.it/github/chalk/chalk) + + + +
      + +--- + + + +--- + +
      + +## Highlights + +- Expressive API +- Highly performant +- Ability to nest styles +- [256/Truecolor color support](#256-and-truecolor-color-support) +- Auto-detects color support +- Doesn't extend `String.prototype` +- Clean and focused +- Actively maintained +- [Used by ~50,000 packages](https://www.npmjs.com/browse/depended/chalk) as of January 1, 2020 + +## Install + +```console +$ npm install chalk +``` + +## Usage + +```js +const chalk = require('chalk'); + +console.log(chalk.blue('Hello world!')); +``` + +Chalk comes with an easy to use composable API where you just chain and nest the styles you want. + +```js +const chalk = require('chalk'); +const log = console.log; + +// Combine styled and normal strings +log(chalk.blue('Hello') + ' World' + chalk.red('!')); + +// Compose multiple styles using the chainable API +log(chalk.blue.bgRed.bold('Hello world!')); + +// Pass in multiple arguments +log(chalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz')); + +// Nest styles +log(chalk.red('Hello', chalk.underline.bgBlue('world') + '!')); + +// Nest styles of the same type even (color, underline, background) +log(chalk.green( + 'I am a green line ' + + chalk.blue.underline.bold('with a blue substring') + + ' that becomes green again!' +)); + +// ES2015 template literal +log(` +CPU: ${chalk.red('90%')} +RAM: ${chalk.green('40%')} +DISK: ${chalk.yellow('70%')} +`); + +// ES2015 tagged template literal +log(chalk` +CPU: {red ${cpu.totalPercent}%} +RAM: {green ${ram.used / ram.total * 100}%} +DISK: {rgb(255,131,0) ${disk.used / disk.total * 100}%} +`); + +// Use RGB colors in terminal emulators that support it. +log(chalk.keyword('orange')('Yay for orange colored text!')); +log(chalk.rgb(123, 45, 67).underline('Underlined reddish color')); +log(chalk.hex('#DEADED').bold('Bold gray!')); +``` + +Easily define your own themes: + +```js +const chalk = require('chalk'); + +const error = chalk.bold.red; +const warning = chalk.keyword('orange'); + +console.log(error('Error!')); +console.log(warning('Warning!')); +``` + +Take advantage of console.log [string substitution](https://nodejs.org/docs/latest/api/console.html#console_console_log_data_args): + +```js +const name = 'Sindre'; +console.log(chalk.green('Hello %s'), name); +//=> 'Hello Sindre' +``` + +## API + +### chalk.` + + + + + + +
      +

      + Fisher-Yates Shuffle Demo +

      +

      + This is a demo of knuth-shuffle-seeded. Enjoy! +

      +
      +
      + + +
      +
      +
      +
      + + +
      +
      + +
      +
      
      +      
      +
      +
      +

      + Made with ❤ by @TimothyGu. Copyright 2015. Apache License Version 2.0. +

      +
      + + + + + + diff --git a/node_modules/knuth-shuffle-seeded/index.js b/node_modules/knuth-shuffle-seeded/index.js new file mode 100644 index 00000000..5dbc6ae8 --- /dev/null +++ b/node_modules/knuth-shuffle-seeded/index.js @@ -0,0 +1,69 @@ +/* + * Copyright 2013 AJ O'Neal + * Copyright 2015 Tiancheng "Timothy" Gu + * + * 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. + */ + +'use strict' + +/** + * @file + * + * Implementation of the Fisher-Yates shuffle algorithm in JavaScript, with + * the possibility of using a seed to ensure reproducibility. + * + * @module knuth-shuffle-seeded + */ + +var randGen = require('seed-random') + +/** + * Shuffle an array using the Fisher-Yates shuffle algorithm, aka Knuth + * shuffle. + * + * Note that this function overwrites the initial array. As a result if you + * would like to keep the original array intact, you have to copy the initial + * array to a new array. + * + * Implementation derived from http://stackoverflow.com/questions/2450954/. + * + * @param {Array} array An array that is to be shuffled. + * @param [seed=Math.random()] Seed for the shuffling operation. If + * unspecified then a random value is used. + * @return {Array} The resulting array. + */ +module.exports = function shuffle(array, seed) { + var currentIndex + , temporaryValue + , randomIndex + , rand + if (seed == null) rand = randGen() + else rand = randGen(seed) + + if (array.constructor !== Array) throw new Error('Input is not an array') + currentIndex = array.length + + // While there remain elements to shuffle... + while (0 !== currentIndex) { + // Pick a remaining element... + randomIndex = Math.floor(rand() * (currentIndex --)) + + // And swap it with the current element. + temporaryValue = array[currentIndex] + array[currentIndex] = array[randomIndex] + array[randomIndex] = temporaryValue + } + + return array +} diff --git a/node_modules/knuth-shuffle-seeded/package.json b/node_modules/knuth-shuffle-seeded/package.json new file mode 100644 index 00000000..e87e4b2a --- /dev/null +++ b/node_modules/knuth-shuffle-seeded/package.json @@ -0,0 +1,50 @@ +{ + "name": "knuth-shuffle-seeded", + "version": "1.0.6", + "description": "The Fisher-Yates (aka Knuth) shuffle for Node.js, with seeding support", + "main": "index.js", + "scripts": { + "test": "mocha", + "browserify": "browserify -s shuffle -g uglifyify -o browser.js index.js", + "prepublish": "npm run browserify", + "coverage": "istanbul cover node_modules/mocha/bin/_mocha", + "codecov": "npm run coverage && cat ./coverage/lcov.info | codecov" + }, + "homepage": "https://github.com/TimothyGu/knuth-shuffle-seeded", + "repository": { + "type": "git", + "url": "git://github.com/TimothyGu/knuth-shuffle-seeded.git" + }, + "keywords": [ + "ronald", + "fisher", + "frank", + "yates", + "fisher-yates", + "donald", + "knuth", + "shuffle", + "random", + "randomize", + "unbiased", + "algorithm" + ], + "author": "AJ O'Neal (http://coolaj86.info/)", + "contributors": [ + "Timothy Gu (https://timothygu.github.io/)" + ], + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/TimothyGu/knuth-shuffle-seeded/issues" + }, + "dependencies": { + "seed-random": "~2.2.0" + }, + "devDependencies": { + "browserify": "~8.1.1", + "codecov.io": "~0.0.8", + "istanbul": "~0.3.5", + "mocha": "~2.1.0", + "uglifyify": "~3.0.1" + } +} diff --git a/node_modules/knuth-shuffle-seeded/test/test.js b/node_modules/knuth-shuffle-seeded/test/test.js new file mode 100644 index 00000000..903b031a --- /dev/null +++ b/node_modules/knuth-shuffle-seeded/test/test.js @@ -0,0 +1,119 @@ +// Licensed under the Apache License, version 2.0 + +'use strict' + +var shuffle = require('..') + , assert = require('assert') + , test = [ 2, 11, 37, 42, 'adsf', 'blah', { heeeheee: true } ] + +it('changes input array', function () { + var input = test.slice(0) + , a = shuffle(input) + assert.deepEqual(a, input) +}) + +describe('random shuffling', function () { + it('works', function () { + var a = shuffle(test.slice(0)) + , b = shuffle(test.slice(0)) + , c = shuffle(test.slice(0)) + // Try three times. + // The possibility of this test being a false positive is: + // + // / 1 \ 3 -12 + // |----| ≈ 7.81 × 10 ≈ 0.0000000078% + // \ 7! / + // + // That's good enough IMO. + try { + assert.notDeepEqual(test, a) + } catch (e) { + if (!(e instanceof AssertionError)) throw e + try { + assert.notDeepEqual(test, b) + } catch (e) { + if (!(e instanceof AssertionError)) throw e + assert.notDeepEqual(test, c) + } + } + }) +}) + +describe('seeding with a number', function () { + var a, b + + it('does not crash', function () { + a = shuffle(test.slice(0), 2) + b = shuffle(test.slice(0), 2) + }) + + it('output is the same for the same seed', function () { + assert.deepEqual(a, b) + assert.deepEqual(a, [ 'blah', { heeeheee: true }, 2, 'adsf', 11, 42, 37 ]) + }) +}) + +describe('seeding with a object', function () { + var obj1 = { blah: 'ad', bla: 4 } + , obj2 = new Date() + , a + , b + + it('does not crash', function () { + a = shuffle(test.slice(0), obj1) + b = shuffle(test.slice(0), obj2) + }) +}) + +describe('seeding with a string', function () { + var str = 'Lorem ipsum' + , a + , b + + it('does not crash', function () { + a = shuffle(test.slice(0), str) + b = shuffle(test.slice(0), str) + }) + + it('output is the same for the same seed', function () { + assert.deepEqual(a, b) + assert.deepEqual(a, [ { heeeheee: true }, 2, 'blah', 11, 'adsf', 42, 37 ]) + }) +}) + +describe('errors', function () { + it('on String input', function () { + assert.throws(function () { + shuffle('adf') + }) + }) + it('on Boolean input', function () { + assert.throws(function () { + shuffle(true) + }) + }) + it('on Object input', function () { + assert.throws(function () { + shuffle({ a: true }) + }) + }) + it('on Number input', function () { + assert.throws(function () { + shuffle(40) + }) + }) + it('on null input', function () { + assert.throws(function () { + shuffle(null) + }) + }) + it('on undefined input', function () { + assert.throws(function () { + shuffle(undefined) + }) + }) + it('not on empty array', function () { + var a = shuffle([]) + assert.deepEqual(a, []) + }) +}) diff --git a/node_modules/lodash.merge/LICENSE b/node_modules/lodash.merge/LICENSE new file mode 100644 index 00000000..77c42f14 --- /dev/null +++ b/node_modules/lodash.merge/LICENSE @@ -0,0 +1,47 @@ +Copyright OpenJS Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. diff --git a/node_modules/lodash.merge/README.md b/node_modules/lodash.merge/README.md new file mode 100644 index 00000000..91b75386 --- /dev/null +++ b/node_modules/lodash.merge/README.md @@ -0,0 +1,18 @@ +# lodash.merge v4.6.2 + +The [Lodash](https://lodash.com/) method `_.merge` exported as a [Node.js](https://nodejs.org/) module. + +## Installation + +Using npm: +```bash +$ {sudo -H} npm i -g npm +$ npm i --save lodash.merge +``` + +In Node.js: +```js +var merge = require('lodash.merge'); +``` + +See the [documentation](https://lodash.com/docs#merge) or [package source](https://github.com/lodash/lodash/blob/4.6.2-npm-packages/lodash.merge) for more details. diff --git a/node_modules/lodash.merge/index.js b/node_modules/lodash.merge/index.js new file mode 100644 index 00000000..8e75d955 --- /dev/null +++ b/node_modules/lodash.merge/index.js @@ -0,0 +1,1977 @@ +/** + * Lodash (Custom Build) + * Build: `lodash modularize exports="npm" -o ./` + * Copyright OpenJS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ + +/** Used as the size to enable large array optimizations. */ +var LARGE_ARRAY_SIZE = 200; + +/** Used to stand-in for `undefined` hash values. */ +var HASH_UNDEFINED = '__lodash_hash_undefined__'; + +/** Used to detect hot functions by number of calls within a span of milliseconds. */ +var HOT_COUNT = 800, + HOT_SPAN = 16; + +/** Used as references for various `Number` constants. */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + asyncTag = '[object AsyncFunction]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + mapTag = '[object Map]', + numberTag = '[object Number]', + nullTag = '[object Null]', + objectTag = '[object Object]', + proxyTag = '[object Proxy]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + undefinedTag = '[object Undefined]', + weakMapTag = '[object WeakMap]'; + +var arrayBufferTag = '[object ArrayBuffer]', + dataViewTag = '[object DataView]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; + +/** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ +var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; + +/** Used to detect host constructors (Safari). */ +var reIsHostCtor = /^\[object .+?Constructor\]$/; + +/** Used to detect unsigned integer values. */ +var reIsUint = /^(?:0|[1-9]\d*)$/; + +/** Used to identify `toStringTag` values of typed arrays. */ +var typedArrayTags = {}; +typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = +typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = +typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = +typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = +typedArrayTags[uint32Tag] = true; +typedArrayTags[argsTag] = typedArrayTags[arrayTag] = +typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = +typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = +typedArrayTags[errorTag] = typedArrayTags[funcTag] = +typedArrayTags[mapTag] = typedArrayTags[numberTag] = +typedArrayTags[objectTag] = typedArrayTags[regexpTag] = +typedArrayTags[setTag] = typedArrayTags[stringTag] = +typedArrayTags[weakMapTag] = false; + +/** Detect free variable `global` from Node.js. */ +var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; + +/** Detect free variable `self`. */ +var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + +/** Used as a reference to the global object. */ +var root = freeGlobal || freeSelf || Function('return this')(); + +/** Detect free variable `exports`. */ +var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; + +/** Detect free variable `module`. */ +var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; + +/** Detect the popular CommonJS extension `module.exports`. */ +var moduleExports = freeModule && freeModule.exports === freeExports; + +/** Detect free variable `process` from Node.js. */ +var freeProcess = moduleExports && freeGlobal.process; + +/** Used to access faster Node.js helpers. */ +var nodeUtil = (function() { + try { + // Use `util.types` for Node.js 10+. + var types = freeModule && freeModule.require && freeModule.require('util').types; + + if (types) { + return types; + } + + // Legacy `process.binding('util')` for Node.js < 10. + return freeProcess && freeProcess.binding && freeProcess.binding('util'); + } catch (e) {} +}()); + +/* Node.js helper references. */ +var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; + +/** + * A faster alternative to `Function#apply`, this function invokes `func` + * with the `this` binding of `thisArg` and the arguments of `args`. + * + * @private + * @param {Function} func The function to invoke. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} args The arguments to invoke `func` with. + * @returns {*} Returns the result of `func`. + */ +function apply(func, thisArg, args) { + switch (args.length) { + case 0: return func.call(thisArg); + case 1: return func.call(thisArg, args[0]); + case 2: return func.call(thisArg, args[0], args[1]); + case 3: return func.call(thisArg, args[0], args[1], args[2]); + } + return func.apply(thisArg, args); +} + +/** + * The base implementation of `_.times` without support for iteratee shorthands + * or max array length checks. + * + * @private + * @param {number} n The number of times to invoke `iteratee`. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the array of results. + */ +function baseTimes(n, iteratee) { + var index = -1, + result = Array(n); + + while (++index < n) { + result[index] = iteratee(index); + } + return result; +} + +/** + * The base implementation of `_.unary` without support for storing metadata. + * + * @private + * @param {Function} func The function to cap arguments for. + * @returns {Function} Returns the new capped function. + */ +function baseUnary(func) { + return function(value) { + return func(value); + }; +} + +/** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ +function getValue(object, key) { + return object == null ? undefined : object[key]; +} + +/** + * Creates a unary function that invokes `func` with its argument transformed. + * + * @private + * @param {Function} func The function to wrap. + * @param {Function} transform The argument transform. + * @returns {Function} Returns the new function. + */ +function overArg(func, transform) { + return function(arg) { + return func(transform(arg)); + }; +} + +/** Used for built-in method references. */ +var arrayProto = Array.prototype, + funcProto = Function.prototype, + objectProto = Object.prototype; + +/** Used to detect overreaching core-js shims. */ +var coreJsData = root['__core-js_shared__']; + +/** Used to resolve the decompiled source of functions. */ +var funcToString = funcProto.toString; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** Used to detect methods masquerading as native. */ +var maskSrcKey = (function() { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); + return uid ? ('Symbol(src)_1.' + uid) : ''; +}()); + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var nativeObjectToString = objectProto.toString; + +/** Used to infer the `Object` constructor. */ +var objectCtorString = funcToString.call(Object); + +/** Used to detect if a method is native. */ +var reIsNative = RegExp('^' + + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' +); + +/** Built-in value references. */ +var Buffer = moduleExports ? root.Buffer : undefined, + Symbol = root.Symbol, + Uint8Array = root.Uint8Array, + allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined, + getPrototype = overArg(Object.getPrototypeOf, Object), + objectCreate = Object.create, + propertyIsEnumerable = objectProto.propertyIsEnumerable, + splice = arrayProto.splice, + symToStringTag = Symbol ? Symbol.toStringTag : undefined; + +var defineProperty = (function() { + try { + var func = getNative(Object, 'defineProperty'); + func({}, '', {}); + return func; + } catch (e) {} +}()); + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined, + nativeMax = Math.max, + nativeNow = Date.now; + +/* Built-in method references that are verified to be native. */ +var Map = getNative(root, 'Map'), + nativeCreate = getNative(Object, 'create'); + +/** + * The base implementation of `_.create` without support for assigning + * properties to the created object. + * + * @private + * @param {Object} proto The object to inherit from. + * @returns {Object} Returns the new object. + */ +var baseCreate = (function() { + function object() {} + return function(proto) { + if (!isObject(proto)) { + return {}; + } + if (objectCreate) { + return objectCreate(proto); + } + object.prototype = proto; + var result = new object; + object.prototype = undefined; + return result; + }; +}()); + +/** + * Creates a hash object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function Hash(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +/** + * Removes all key-value entries from the hash. + * + * @private + * @name clear + * @memberOf Hash + */ +function hashClear() { + this.__data__ = nativeCreate ? nativeCreate(null) : {}; + this.size = 0; +} + +/** + * Removes `key` and its value from the hash. + * + * @private + * @name delete + * @memberOf Hash + * @param {Object} hash The hash to modify. + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function hashDelete(key) { + var result = this.has(key) && delete this.__data__[key]; + this.size -= result ? 1 : 0; + return result; +} + +/** + * Gets the hash value for `key`. + * + * @private + * @name get + * @memberOf Hash + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function hashGet(key) { + var data = this.__data__; + if (nativeCreate) { + var result = data[key]; + return result === HASH_UNDEFINED ? undefined : result; + } + return hasOwnProperty.call(data, key) ? data[key] : undefined; +} + +/** + * Checks if a hash value for `key` exists. + * + * @private + * @name has + * @memberOf Hash + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function hashHas(key) { + var data = this.__data__; + return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key); +} + +/** + * Sets the hash `key` to `value`. + * + * @private + * @name set + * @memberOf Hash + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the hash instance. + */ +function hashSet(key, value) { + var data = this.__data__; + this.size += this.has(key) ? 0 : 1; + data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; + return this; +} + +// Add methods to `Hash`. +Hash.prototype.clear = hashClear; +Hash.prototype['delete'] = hashDelete; +Hash.prototype.get = hashGet; +Hash.prototype.has = hashHas; +Hash.prototype.set = hashSet; + +/** + * Creates an list cache object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function ListCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +/** + * Removes all key-value entries from the list cache. + * + * @private + * @name clear + * @memberOf ListCache + */ +function listCacheClear() { + this.__data__ = []; + this.size = 0; +} + +/** + * Removes `key` and its value from the list cache. + * + * @private + * @name delete + * @memberOf ListCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function listCacheDelete(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + --this.size; + return true; +} + +/** + * Gets the list cache value for `key`. + * + * @private + * @name get + * @memberOf ListCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function listCacheGet(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + return index < 0 ? undefined : data[index][1]; +} + +/** + * Checks if a list cache value for `key` exists. + * + * @private + * @name has + * @memberOf ListCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function listCacheHas(key) { + return assocIndexOf(this.__data__, key) > -1; +} + +/** + * Sets the list cache `key` to `value`. + * + * @private + * @name set + * @memberOf ListCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the list cache instance. + */ +function listCacheSet(key, value) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + ++this.size; + data.push([key, value]); + } else { + data[index][1] = value; + } + return this; +} + +// Add methods to `ListCache`. +ListCache.prototype.clear = listCacheClear; +ListCache.prototype['delete'] = listCacheDelete; +ListCache.prototype.get = listCacheGet; +ListCache.prototype.has = listCacheHas; +ListCache.prototype.set = listCacheSet; + +/** + * Creates a map cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function MapCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +/** + * Removes all key-value entries from the map. + * + * @private + * @name clear + * @memberOf MapCache + */ +function mapCacheClear() { + this.size = 0; + this.__data__ = { + 'hash': new Hash, + 'map': new (Map || ListCache), + 'string': new Hash + }; +} + +/** + * Removes `key` and its value from the map. + * + * @private + * @name delete + * @memberOf MapCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function mapCacheDelete(key) { + var result = getMapData(this, key)['delete'](key); + this.size -= result ? 1 : 0; + return result; +} + +/** + * Gets the map value for `key`. + * + * @private + * @name get + * @memberOf MapCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function mapCacheGet(key) { + return getMapData(this, key).get(key); +} + +/** + * Checks if a map value for `key` exists. + * + * @private + * @name has + * @memberOf MapCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function mapCacheHas(key) { + return getMapData(this, key).has(key); +} + +/** + * Sets the map `key` to `value`. + * + * @private + * @name set + * @memberOf MapCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the map cache instance. + */ +function mapCacheSet(key, value) { + var data = getMapData(this, key), + size = data.size; + + data.set(key, value); + this.size += data.size == size ? 0 : 1; + return this; +} + +// Add methods to `MapCache`. +MapCache.prototype.clear = mapCacheClear; +MapCache.prototype['delete'] = mapCacheDelete; +MapCache.prototype.get = mapCacheGet; +MapCache.prototype.has = mapCacheHas; +MapCache.prototype.set = mapCacheSet; + +/** + * Creates a stack cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function Stack(entries) { + var data = this.__data__ = new ListCache(entries); + this.size = data.size; +} + +/** + * Removes all key-value entries from the stack. + * + * @private + * @name clear + * @memberOf Stack + */ +function stackClear() { + this.__data__ = new ListCache; + this.size = 0; +} + +/** + * Removes `key` and its value from the stack. + * + * @private + * @name delete + * @memberOf Stack + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function stackDelete(key) { + var data = this.__data__, + result = data['delete'](key); + + this.size = data.size; + return result; +} + +/** + * Gets the stack value for `key`. + * + * @private + * @name get + * @memberOf Stack + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function stackGet(key) { + return this.__data__.get(key); +} + +/** + * Checks if a stack value for `key` exists. + * + * @private + * @name has + * @memberOf Stack + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function stackHas(key) { + return this.__data__.has(key); +} + +/** + * Sets the stack `key` to `value`. + * + * @private + * @name set + * @memberOf Stack + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the stack cache instance. + */ +function stackSet(key, value) { + var data = this.__data__; + if (data instanceof ListCache) { + var pairs = data.__data__; + if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { + pairs.push([key, value]); + this.size = ++data.size; + return this; + } + data = this.__data__ = new MapCache(pairs); + } + data.set(key, value); + this.size = data.size; + return this; +} + +// Add methods to `Stack`. +Stack.prototype.clear = stackClear; +Stack.prototype['delete'] = stackDelete; +Stack.prototype.get = stackGet; +Stack.prototype.has = stackHas; +Stack.prototype.set = stackSet; + +/** + * Creates an array of the enumerable property names of the array-like `value`. + * + * @private + * @param {*} value The value to query. + * @param {boolean} inherited Specify returning inherited property names. + * @returns {Array} Returns the array of property names. + */ +function arrayLikeKeys(value, inherited) { + var isArr = isArray(value), + isArg = !isArr && isArguments(value), + isBuff = !isArr && !isArg && isBuffer(value), + isType = !isArr && !isArg && !isBuff && isTypedArray(value), + skipIndexes = isArr || isArg || isBuff || isType, + result = skipIndexes ? baseTimes(value.length, String) : [], + length = result.length; + + for (var key in value) { + if ((inherited || hasOwnProperty.call(value, key)) && + !(skipIndexes && ( + // Safari 9 has enumerable `arguments.length` in strict mode. + key == 'length' || + // Node.js 0.10 has enumerable non-index properties on buffers. + (isBuff && (key == 'offset' || key == 'parent')) || + // PhantomJS 2 has enumerable non-index properties on typed arrays. + (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || + // Skip index properties. + isIndex(key, length) + ))) { + result.push(key); + } + } + return result; +} + +/** + * This function is like `assignValue` except that it doesn't assign + * `undefined` values. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ +function assignMergeValue(object, key, value) { + if ((value !== undefined && !eq(object[key], value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); + } +} + +/** + * Assigns `value` to `key` of `object` if the existing value is not equivalent + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ +function assignValue(object, key, value) { + var objValue = object[key]; + if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); + } +} + +/** + * Gets the index at which the `key` is found in `array` of key-value pairs. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} key The key to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + */ +function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq(array[length][0], key)) { + return length; + } + } + return -1; +} + +/** + * The base implementation of `assignValue` and `assignMergeValue` without + * value checks. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ +function baseAssignValue(object, key, value) { + if (key == '__proto__' && defineProperty) { + defineProperty(object, key, { + 'configurable': true, + 'enumerable': true, + 'value': value, + 'writable': true + }); + } else { + object[key] = value; + } +} + +/** + * The base implementation of `baseForOwn` which iterates over `object` + * properties returned by `keysFunc` and invokes `iteratee` for each property. + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ +var baseFor = createBaseFor(); + +/** + * The base implementation of `getTag` without fallbacks for buggy environments. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ +function baseGetTag(value) { + if (value == null) { + return value === undefined ? undefinedTag : nullTag; + } + return (symToStringTag && symToStringTag in Object(value)) + ? getRawTag(value) + : objectToString(value); +} + +/** + * The base implementation of `_.isArguments`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + */ +function baseIsArguments(value) { + return isObjectLike(value) && baseGetTag(value) == argsTag; +} + +/** + * The base implementation of `_.isNative` without bad shim checks. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + */ +function baseIsNative(value) { + if (!isObject(value) || isMasked(value)) { + return false; + } + var pattern = isFunction(value) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); +} + +/** + * The base implementation of `_.isTypedArray` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + */ +function baseIsTypedArray(value) { + return isObjectLike(value) && + isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; +} + +/** + * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ +function baseKeysIn(object) { + if (!isObject(object)) { + return nativeKeysIn(object); + } + var isProto = isPrototype(object), + result = []; + + for (var key in object) { + if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { + result.push(key); + } + } + return result; +} + +/** + * The base implementation of `_.merge` without support for multiple sources. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {number} srcIndex The index of `source`. + * @param {Function} [customizer] The function to customize merged values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ +function baseMerge(object, source, srcIndex, customizer, stack) { + if (object === source) { + return; + } + baseFor(source, function(srcValue, key) { + stack || (stack = new Stack); + if (isObject(srcValue)) { + baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack); + } + else { + var newValue = customizer + ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack) + : undefined; + + if (newValue === undefined) { + newValue = srcValue; + } + assignMergeValue(object, key, newValue); + } + }, keysIn); +} + +/** + * A specialized version of `baseMerge` for arrays and objects which performs + * deep merges and tracks traversed objects enabling objects with circular + * references to be merged. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {string} key The key of the value to merge. + * @param {number} srcIndex The index of `source`. + * @param {Function} mergeFunc The function to merge values. + * @param {Function} [customizer] The function to customize assigned values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ +function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) { + var objValue = safeGet(object, key), + srcValue = safeGet(source, key), + stacked = stack.get(srcValue); + + if (stacked) { + assignMergeValue(object, key, stacked); + return; + } + var newValue = customizer + ? customizer(objValue, srcValue, (key + ''), object, source, stack) + : undefined; + + var isCommon = newValue === undefined; + + if (isCommon) { + var isArr = isArray(srcValue), + isBuff = !isArr && isBuffer(srcValue), + isTyped = !isArr && !isBuff && isTypedArray(srcValue); + + newValue = srcValue; + if (isArr || isBuff || isTyped) { + if (isArray(objValue)) { + newValue = objValue; + } + else if (isArrayLikeObject(objValue)) { + newValue = copyArray(objValue); + } + else if (isBuff) { + isCommon = false; + newValue = cloneBuffer(srcValue, true); + } + else if (isTyped) { + isCommon = false; + newValue = cloneTypedArray(srcValue, true); + } + else { + newValue = []; + } + } + else if (isPlainObject(srcValue) || isArguments(srcValue)) { + newValue = objValue; + if (isArguments(objValue)) { + newValue = toPlainObject(objValue); + } + else if (!isObject(objValue) || isFunction(objValue)) { + newValue = initCloneObject(srcValue); + } + } + else { + isCommon = false; + } + } + if (isCommon) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, newValue); + mergeFunc(newValue, srcValue, srcIndex, customizer, stack); + stack['delete'](srcValue); + } + assignMergeValue(object, key, newValue); +} + +/** + * The base implementation of `_.rest` which doesn't validate or coerce arguments. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + */ +function baseRest(func, start) { + return setToString(overRest(func, start, identity), func + ''); +} + +/** + * The base implementation of `setToString` without support for hot loop shorting. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ +var baseSetToString = !defineProperty ? identity : function(func, string) { + return defineProperty(func, 'toString', { + 'configurable': true, + 'enumerable': false, + 'value': constant(string), + 'writable': true + }); +}; + +/** + * Creates a clone of `buffer`. + * + * @private + * @param {Buffer} buffer The buffer to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Buffer} Returns the cloned buffer. + */ +function cloneBuffer(buffer, isDeep) { + if (isDeep) { + return buffer.slice(); + } + var length = buffer.length, + result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length); + + buffer.copy(result); + return result; +} + +/** + * Creates a clone of `arrayBuffer`. + * + * @private + * @param {ArrayBuffer} arrayBuffer The array buffer to clone. + * @returns {ArrayBuffer} Returns the cloned array buffer. + */ +function cloneArrayBuffer(arrayBuffer) { + var result = new arrayBuffer.constructor(arrayBuffer.byteLength); + new Uint8Array(result).set(new Uint8Array(arrayBuffer)); + return result; +} + +/** + * Creates a clone of `typedArray`. + * + * @private + * @param {Object} typedArray The typed array to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned typed array. + */ +function cloneTypedArray(typedArray, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; + return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length); +} + +/** + * Copies the values of `source` to `array`. + * + * @private + * @param {Array} source The array to copy values from. + * @param {Array} [array=[]] The array to copy values to. + * @returns {Array} Returns `array`. + */ +function copyArray(source, array) { + var index = -1, + length = source.length; + + array || (array = Array(length)); + while (++index < length) { + array[index] = source[index]; + } + return array; +} + +/** + * Copies properties of `source` to `object`. + * + * @private + * @param {Object} source The object to copy properties from. + * @param {Array} props The property identifiers to copy. + * @param {Object} [object={}] The object to copy properties to. + * @param {Function} [customizer] The function to customize copied values. + * @returns {Object} Returns `object`. + */ +function copyObject(source, props, object, customizer) { + var isNew = !object; + object || (object = {}); + + var index = -1, + length = props.length; + + while (++index < length) { + var key = props[index]; + + var newValue = customizer + ? customizer(object[key], source[key], key, object, source) + : undefined; + + if (newValue === undefined) { + newValue = source[key]; + } + if (isNew) { + baseAssignValue(object, key, newValue); + } else { + assignValue(object, key, newValue); + } + } + return object; +} + +/** + * Creates a function like `_.assign`. + * + * @private + * @param {Function} assigner The function to assign values. + * @returns {Function} Returns the new assigner function. + */ +function createAssigner(assigner) { + return baseRest(function(object, sources) { + var index = -1, + length = sources.length, + customizer = length > 1 ? sources[length - 1] : undefined, + guard = length > 2 ? sources[2] : undefined; + + customizer = (assigner.length > 3 && typeof customizer == 'function') + ? (length--, customizer) + : undefined; + + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + customizer = length < 3 ? undefined : customizer; + length = 1; + } + object = Object(object); + while (++index < length) { + var source = sources[index]; + if (source) { + assigner(object, source, index, customizer); + } + } + return object; + }); +} + +/** + * Creates a base function for methods like `_.forIn` and `_.forOwn`. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ +function createBaseFor(fromRight) { + return function(object, iteratee, keysFunc) { + var index = -1, + iterable = Object(object), + props = keysFunc(object), + length = props.length; + + while (length--) { + var key = props[fromRight ? length : ++index]; + if (iteratee(iterable[key], key, iterable) === false) { + break; + } + } + return object; + }; +} + +/** + * Gets the data for `map`. + * + * @private + * @param {Object} map The map to query. + * @param {string} key The reference key. + * @returns {*} Returns the map data. + */ +function getMapData(map, key) { + var data = map.__data__; + return isKeyable(key) + ? data[typeof key == 'string' ? 'string' : 'hash'] + : data.map; +} + +/** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ +function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined; +} + +/** + * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the raw `toStringTag`. + */ +function getRawTag(value) { + var isOwn = hasOwnProperty.call(value, symToStringTag), + tag = value[symToStringTag]; + + try { + value[symToStringTag] = undefined; + var unmasked = true; + } catch (e) {} + + var result = nativeObjectToString.call(value); + if (unmasked) { + if (isOwn) { + value[symToStringTag] = tag; + } else { + delete value[symToStringTag]; + } + } + return result; +} + +/** + * Initializes an object clone. + * + * @private + * @param {Object} object The object to clone. + * @returns {Object} Returns the initialized clone. + */ +function initCloneObject(object) { + return (typeof object.constructor == 'function' && !isPrototype(object)) + ? baseCreate(getPrototype(object)) + : {}; +} + +/** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ +function isIndex(value, length) { + var type = typeof value; + length = length == null ? MAX_SAFE_INTEGER : length; + + return !!length && + (type == 'number' || + (type != 'symbol' && reIsUint.test(value))) && + (value > -1 && value % 1 == 0 && value < length); +} + +/** + * Checks if the given arguments are from an iteratee call. + * + * @private + * @param {*} value The potential iteratee value argument. + * @param {*} index The potential iteratee index or key argument. + * @param {*} object The potential iteratee object argument. + * @returns {boolean} Returns `true` if the arguments are from an iteratee call, + * else `false`. + */ +function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; + } + var type = typeof index; + if (type == 'number' + ? (isArrayLike(object) && isIndex(index, object.length)) + : (type == 'string' && index in object) + ) { + return eq(object[index], value); + } + return false; +} + +/** + * Checks if `value` is suitable for use as unique object key. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is suitable, else `false`. + */ +function isKeyable(value) { + var type = typeof value; + return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') + ? (value !== '__proto__') + : (value === null); +} + +/** + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. + */ +function isMasked(func) { + return !!maskSrcKey && (maskSrcKey in func); +} + +/** + * Checks if `value` is likely a prototype object. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. + */ +function isPrototype(value) { + var Ctor = value && value.constructor, + proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; + + return value === proto; +} + +/** + * This function is like + * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * except that it includes inherited enumerable properties. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ +function nativeKeysIn(object) { + var result = []; + if (object != null) { + for (var key in Object(object)) { + result.push(key); + } + } + return result; +} + +/** + * Converts `value` to a string using `Object.prototype.toString`. + * + * @private + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + */ +function objectToString(value) { + return nativeObjectToString.call(value); +} + +/** + * A specialized version of `baseRest` which transforms the rest array. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @param {Function} transform The rest array transform. + * @returns {Function} Returns the new function. + */ +function overRest(func, start, transform) { + start = nativeMax(start === undefined ? (func.length - 1) : start, 0); + return function() { + var args = arguments, + index = -1, + length = nativeMax(args.length - start, 0), + array = Array(length); + + while (++index < length) { + array[index] = args[start + index]; + } + index = -1; + var otherArgs = Array(start + 1); + while (++index < start) { + otherArgs[index] = args[index]; + } + otherArgs[start] = transform(array); + return apply(func, this, otherArgs); + }; +} + +/** + * Gets the value at `key`, unless `key` is "__proto__" or "constructor". + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ +function safeGet(object, key) { + if (key === 'constructor' && typeof object[key] === 'function') { + return; + } + + if (key == '__proto__') { + return; + } + + return object[key]; +} + +/** + * Sets the `toString` method of `func` to return `string`. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ +var setToString = shortOut(baseSetToString); + +/** + * Creates a function that'll short out and invoke `identity` instead + * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN` + * milliseconds. + * + * @private + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new shortable function. + */ +function shortOut(func) { + var count = 0, + lastCalled = 0; + + return function() { + var stamp = nativeNow(), + remaining = HOT_SPAN - (stamp - lastCalled); + + lastCalled = stamp; + if (remaining > 0) { + if (++count >= HOT_COUNT) { + return arguments[0]; + } + } else { + count = 0; + } + return func.apply(undefined, arguments); + }; +} + +/** + * Converts `func` to its source code. + * + * @private + * @param {Function} func The function to convert. + * @returns {string} Returns the source code. + */ +function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) {} + try { + return (func + ''); + } catch (e) {} + } + return ''; +} + +/** + * Performs a + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * comparison between two values to determine if they are equivalent. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.eq(object, object); + * // => true + * + * _.eq(object, other); + * // => false + * + * _.eq('a', 'a'); + * // => true + * + * _.eq('a', Object('a')); + * // => false + * + * _.eq(NaN, NaN); + * // => true + */ +function eq(value, other) { + return value === other || (value !== value && other !== other); +} + +/** + * Checks if `value` is likely an `arguments` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + * else `false`. + * @example + * + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ +var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) { + return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && + !propertyIsEnumerable.call(value, 'callee'); +}; + +/** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ +var isArray = Array.isArray; + +/** + * Checks if `value` is array-like. A value is considered array-like if it's + * not a function and has a `value.length` that's an integer greater than or + * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + * @example + * + * _.isArrayLike([1, 2, 3]); + * // => true + * + * _.isArrayLike(document.body.children); + * // => true + * + * _.isArrayLike('abc'); + * // => true + * + * _.isArrayLike(_.noop); + * // => false + */ +function isArrayLike(value) { + return value != null && isLength(value.length) && !isFunction(value); +} + +/** + * This method is like `_.isArrayLike` except that it also checks if `value` + * is an object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array-like object, + * else `false`. + * @example + * + * _.isArrayLikeObject([1, 2, 3]); + * // => true + * + * _.isArrayLikeObject(document.body.children); + * // => true + * + * _.isArrayLikeObject('abc'); + * // => false + * + * _.isArrayLikeObject(_.noop); + * // => false + */ +function isArrayLikeObject(value) { + return isObjectLike(value) && isArrayLike(value); +} + +/** + * Checks if `value` is a buffer. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. + * @example + * + * _.isBuffer(new Buffer(2)); + * // => true + * + * _.isBuffer(new Uint8Array(2)); + * // => false + */ +var isBuffer = nativeIsBuffer || stubFalse; + +/** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ +function isFunction(value) { + if (!isObject(value)) { + return false; + } + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 9 which returns 'object' for typed arrays and other constructors. + var tag = baseGetTag(value); + return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; +} + +/** + * Checks if `value` is a valid array-like length. + * + * **Note:** This method is loosely based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + * @example + * + * _.isLength(3); + * // => true + * + * _.isLength(Number.MIN_VALUE); + * // => false + * + * _.isLength(Infinity); + * // => false + * + * _.isLength('3'); + * // => false + */ +function isLength(value) { + return typeof value == 'number' && + value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; +} + +/** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ +function isObject(value) { + var type = typeof value; + return value != null && (type == 'object' || type == 'function'); +} + +/** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ +function isObjectLike(value) { + return value != null && typeof value == 'object'; +} + +/** + * Checks if `value` is a plain object, that is, an object created by the + * `Object` constructor or one with a `[[Prototype]]` of `null`. + * + * @static + * @memberOf _ + * @since 0.8.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * _.isPlainObject(new Foo); + * // => false + * + * _.isPlainObject([1, 2, 3]); + * // => false + * + * _.isPlainObject({ 'x': 0, 'y': 0 }); + * // => true + * + * _.isPlainObject(Object.create(null)); + * // => true + */ +function isPlainObject(value) { + if (!isObjectLike(value) || baseGetTag(value) != objectTag) { + return false; + } + var proto = getPrototype(value); + if (proto === null) { + return true; + } + var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor; + return typeof Ctor == 'function' && Ctor instanceof Ctor && + funcToString.call(Ctor) == objectCtorString; +} + +/** + * Checks if `value` is classified as a typed array. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + * @example + * + * _.isTypedArray(new Uint8Array); + * // => true + * + * _.isTypedArray([]); + * // => false + */ +var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; + +/** + * Converts `value` to a plain object flattening inherited enumerable string + * keyed properties of `value` to own properties of the plain object. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {Object} Returns the converted plain object. + * @example + * + * function Foo() { + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.assign({ 'a': 1 }, new Foo); + * // => { 'a': 1, 'b': 2 } + * + * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); + * // => { 'a': 1, 'b': 2, 'c': 3 } + */ +function toPlainObject(value) { + return copyObject(value, keysIn(value)); +} + +/** + * Creates an array of the own and inherited enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keysIn(new Foo); + * // => ['a', 'b', 'c'] (iteration order is not guaranteed) + */ +function keysIn(object) { + return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); +} + +/** + * This method is like `_.assign` except that it recursively merges own and + * inherited enumerable string keyed properties of source objects into the + * destination object. Source properties that resolve to `undefined` are + * skipped if a destination value exists. Array and plain object properties + * are merged recursively. Other objects and value types are overridden by + * assignment. Source objects are applied from left to right. Subsequent + * sources overwrite property assignments of previous sources. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 0.5.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @example + * + * var object = { + * 'a': [{ 'b': 2 }, { 'd': 4 }] + * }; + * + * var other = { + * 'a': [{ 'c': 3 }, { 'e': 5 }] + * }; + * + * _.merge(object, other); + * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] } + */ +var merge = createAssigner(function(object, source, srcIndex) { + baseMerge(object, source, srcIndex); +}); + +/** + * Creates a function that returns `value`. + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Util + * @param {*} value The value to return from the new function. + * @returns {Function} Returns the new constant function. + * @example + * + * var objects = _.times(2, _.constant({ 'a': 1 })); + * + * console.log(objects); + * // => [{ 'a': 1 }, { 'a': 1 }] + * + * console.log(objects[0] === objects[1]); + * // => true + */ +function constant(value) { + return function() { + return value; + }; +} + +/** + * This method returns the first argument it receives. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Util + * @param {*} value Any value. + * @returns {*} Returns `value`. + * @example + * + * var object = { 'a': 1 }; + * + * console.log(_.identity(object) === object); + * // => true + */ +function identity(value) { + return value; +} + +/** + * This method returns `false`. + * + * @static + * @memberOf _ + * @since 4.13.0 + * @category Util + * @returns {boolean} Returns `false`. + * @example + * + * _.times(2, _.stubFalse); + * // => [false, false] + */ +function stubFalse() { + return false; +} + +module.exports = merge; diff --git a/node_modules/lodash.merge/package.json b/node_modules/lodash.merge/package.json new file mode 100644 index 00000000..3130fc8f --- /dev/null +++ b/node_modules/lodash.merge/package.json @@ -0,0 +1,16 @@ +{ + "name": "lodash.merge", + "version": "4.6.2", + "description": "The Lodash method `_.merge` exported as a module.", + "homepage": "https://lodash.com/", + "icon": "https://lodash.com/icon.svg", + "license": "MIT", + "keywords": "lodash-modularized, merge", + "author": "John-David Dalton ", + "contributors": [ + "John-David Dalton ", + "Mathias Bynens " + ], + "repository": "lodash/lodash", + "scripts": { "test": "echo \"See https://travis-ci.org/lodash/lodash-cli for testing details.\"" } +} diff --git a/node_modules/lodash.mergewith/LICENSE b/node_modules/lodash.mergewith/LICENSE new file mode 100644 index 00000000..77c42f14 --- /dev/null +++ b/node_modules/lodash.mergewith/LICENSE @@ -0,0 +1,47 @@ +Copyright OpenJS Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. diff --git a/node_modules/lodash.mergewith/README.md b/node_modules/lodash.mergewith/README.md new file mode 100644 index 00000000..011e9e65 --- /dev/null +++ b/node_modules/lodash.mergewith/README.md @@ -0,0 +1,18 @@ +# lodash.mergewith v4.6.2 + +The [Lodash](https://lodash.com/) method `_.mergeWith` exported as a [Node.js](https://nodejs.org/) module. + +## Installation + +Using npm: +```bash +$ {sudo -H} npm i -g npm +$ npm i --save lodash.mergewith +``` + +In Node.js: +```js +var mergeWith = require('lodash.mergewith'); +``` + +See the [documentation](https://lodash.com/docs#mergeWith) or [package source](https://github.com/lodash/lodash/blob/4.6.2-npm-packages/lodash.mergewith) for more details. diff --git a/node_modules/lodash.mergewith/index.js b/node_modules/lodash.mergewith/index.js new file mode 100644 index 00000000..45b0a1fe --- /dev/null +++ b/node_modules/lodash.mergewith/index.js @@ -0,0 +1,1977 @@ +/** + * Lodash (Custom Build) + * Build: `lodash modularize exports="npm" -o ./` + * Copyright OpenJS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ + +/** Used as the size to enable large array optimizations. */ +var LARGE_ARRAY_SIZE = 200; + +/** Used to stand-in for `undefined` hash values. */ +var HASH_UNDEFINED = '__lodash_hash_undefined__'; + +/** Used to detect hot functions by number of calls within a span of milliseconds. */ +var HOT_COUNT = 800, + HOT_SPAN = 16; + +/** Used as references for various `Number` constants. */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + asyncTag = '[object AsyncFunction]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + mapTag = '[object Map]', + numberTag = '[object Number]', + nullTag = '[object Null]', + objectTag = '[object Object]', + proxyTag = '[object Proxy]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + undefinedTag = '[object Undefined]', + weakMapTag = '[object WeakMap]'; + +var arrayBufferTag = '[object ArrayBuffer]', + dataViewTag = '[object DataView]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; + +/** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ +var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; + +/** Used to detect host constructors (Safari). */ +var reIsHostCtor = /^\[object .+?Constructor\]$/; + +/** Used to detect unsigned integer values. */ +var reIsUint = /^(?:0|[1-9]\d*)$/; + +/** Used to identify `toStringTag` values of typed arrays. */ +var typedArrayTags = {}; +typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = +typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = +typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = +typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = +typedArrayTags[uint32Tag] = true; +typedArrayTags[argsTag] = typedArrayTags[arrayTag] = +typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = +typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = +typedArrayTags[errorTag] = typedArrayTags[funcTag] = +typedArrayTags[mapTag] = typedArrayTags[numberTag] = +typedArrayTags[objectTag] = typedArrayTags[regexpTag] = +typedArrayTags[setTag] = typedArrayTags[stringTag] = +typedArrayTags[weakMapTag] = false; + +/** Detect free variable `global` from Node.js. */ +var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; + +/** Detect free variable `self`. */ +var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + +/** Used as a reference to the global object. */ +var root = freeGlobal || freeSelf || Function('return this')(); + +/** Detect free variable `exports`. */ +var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; + +/** Detect free variable `module`. */ +var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; + +/** Detect the popular CommonJS extension `module.exports`. */ +var moduleExports = freeModule && freeModule.exports === freeExports; + +/** Detect free variable `process` from Node.js. */ +var freeProcess = moduleExports && freeGlobal.process; + +/** Used to access faster Node.js helpers. */ +var nodeUtil = (function() { + try { + // Use `util.types` for Node.js 10+. + var types = freeModule && freeModule.require && freeModule.require('util').types; + + if (types) { + return types; + } + + // Legacy `process.binding('util')` for Node.js < 10. + return freeProcess && freeProcess.binding && freeProcess.binding('util'); + } catch (e) {} +}()); + +/* Node.js helper references. */ +var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; + +/** + * A faster alternative to `Function#apply`, this function invokes `func` + * with the `this` binding of `thisArg` and the arguments of `args`. + * + * @private + * @param {Function} func The function to invoke. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} args The arguments to invoke `func` with. + * @returns {*} Returns the result of `func`. + */ +function apply(func, thisArg, args) { + switch (args.length) { + case 0: return func.call(thisArg); + case 1: return func.call(thisArg, args[0]); + case 2: return func.call(thisArg, args[0], args[1]); + case 3: return func.call(thisArg, args[0], args[1], args[2]); + } + return func.apply(thisArg, args); +} + +/** + * The base implementation of `_.times` without support for iteratee shorthands + * or max array length checks. + * + * @private + * @param {number} n The number of times to invoke `iteratee`. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the array of results. + */ +function baseTimes(n, iteratee) { + var index = -1, + result = Array(n); + + while (++index < n) { + result[index] = iteratee(index); + } + return result; +} + +/** + * The base implementation of `_.unary` without support for storing metadata. + * + * @private + * @param {Function} func The function to cap arguments for. + * @returns {Function} Returns the new capped function. + */ +function baseUnary(func) { + return function(value) { + return func(value); + }; +} + +/** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ +function getValue(object, key) { + return object == null ? undefined : object[key]; +} + +/** + * Creates a unary function that invokes `func` with its argument transformed. + * + * @private + * @param {Function} func The function to wrap. + * @param {Function} transform The argument transform. + * @returns {Function} Returns the new function. + */ +function overArg(func, transform) { + return function(arg) { + return func(transform(arg)); + }; +} + +/** Used for built-in method references. */ +var arrayProto = Array.prototype, + funcProto = Function.prototype, + objectProto = Object.prototype; + +/** Used to detect overreaching core-js shims. */ +var coreJsData = root['__core-js_shared__']; + +/** Used to resolve the decompiled source of functions. */ +var funcToString = funcProto.toString; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** Used to detect methods masquerading as native. */ +var maskSrcKey = (function() { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); + return uid ? ('Symbol(src)_1.' + uid) : ''; +}()); + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var nativeObjectToString = objectProto.toString; + +/** Used to infer the `Object` constructor. */ +var objectCtorString = funcToString.call(Object); + +/** Used to detect if a method is native. */ +var reIsNative = RegExp('^' + + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' +); + +/** Built-in value references. */ +var Buffer = moduleExports ? root.Buffer : undefined, + Symbol = root.Symbol, + Uint8Array = root.Uint8Array, + allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined, + getPrototype = overArg(Object.getPrototypeOf, Object), + objectCreate = Object.create, + propertyIsEnumerable = objectProto.propertyIsEnumerable, + splice = arrayProto.splice, + symToStringTag = Symbol ? Symbol.toStringTag : undefined; + +var defineProperty = (function() { + try { + var func = getNative(Object, 'defineProperty'); + func({}, '', {}); + return func; + } catch (e) {} +}()); + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined, + nativeMax = Math.max, + nativeNow = Date.now; + +/* Built-in method references that are verified to be native. */ +var Map = getNative(root, 'Map'), + nativeCreate = getNative(Object, 'create'); + +/** + * The base implementation of `_.create` without support for assigning + * properties to the created object. + * + * @private + * @param {Object} proto The object to inherit from. + * @returns {Object} Returns the new object. + */ +var baseCreate = (function() { + function object() {} + return function(proto) { + if (!isObject(proto)) { + return {}; + } + if (objectCreate) { + return objectCreate(proto); + } + object.prototype = proto; + var result = new object; + object.prototype = undefined; + return result; + }; +}()); + +/** + * Creates a hash object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function Hash(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +/** + * Removes all key-value entries from the hash. + * + * @private + * @name clear + * @memberOf Hash + */ +function hashClear() { + this.__data__ = nativeCreate ? nativeCreate(null) : {}; + this.size = 0; +} + +/** + * Removes `key` and its value from the hash. + * + * @private + * @name delete + * @memberOf Hash + * @param {Object} hash The hash to modify. + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function hashDelete(key) { + var result = this.has(key) && delete this.__data__[key]; + this.size -= result ? 1 : 0; + return result; +} + +/** + * Gets the hash value for `key`. + * + * @private + * @name get + * @memberOf Hash + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function hashGet(key) { + var data = this.__data__; + if (nativeCreate) { + var result = data[key]; + return result === HASH_UNDEFINED ? undefined : result; + } + return hasOwnProperty.call(data, key) ? data[key] : undefined; +} + +/** + * Checks if a hash value for `key` exists. + * + * @private + * @name has + * @memberOf Hash + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function hashHas(key) { + var data = this.__data__; + return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key); +} + +/** + * Sets the hash `key` to `value`. + * + * @private + * @name set + * @memberOf Hash + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the hash instance. + */ +function hashSet(key, value) { + var data = this.__data__; + this.size += this.has(key) ? 0 : 1; + data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; + return this; +} + +// Add methods to `Hash`. +Hash.prototype.clear = hashClear; +Hash.prototype['delete'] = hashDelete; +Hash.prototype.get = hashGet; +Hash.prototype.has = hashHas; +Hash.prototype.set = hashSet; + +/** + * Creates an list cache object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function ListCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +/** + * Removes all key-value entries from the list cache. + * + * @private + * @name clear + * @memberOf ListCache + */ +function listCacheClear() { + this.__data__ = []; + this.size = 0; +} + +/** + * Removes `key` and its value from the list cache. + * + * @private + * @name delete + * @memberOf ListCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function listCacheDelete(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + --this.size; + return true; +} + +/** + * Gets the list cache value for `key`. + * + * @private + * @name get + * @memberOf ListCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function listCacheGet(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + return index < 0 ? undefined : data[index][1]; +} + +/** + * Checks if a list cache value for `key` exists. + * + * @private + * @name has + * @memberOf ListCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function listCacheHas(key) { + return assocIndexOf(this.__data__, key) > -1; +} + +/** + * Sets the list cache `key` to `value`. + * + * @private + * @name set + * @memberOf ListCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the list cache instance. + */ +function listCacheSet(key, value) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + ++this.size; + data.push([key, value]); + } else { + data[index][1] = value; + } + return this; +} + +// Add methods to `ListCache`. +ListCache.prototype.clear = listCacheClear; +ListCache.prototype['delete'] = listCacheDelete; +ListCache.prototype.get = listCacheGet; +ListCache.prototype.has = listCacheHas; +ListCache.prototype.set = listCacheSet; + +/** + * Creates a map cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function MapCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +/** + * Removes all key-value entries from the map. + * + * @private + * @name clear + * @memberOf MapCache + */ +function mapCacheClear() { + this.size = 0; + this.__data__ = { + 'hash': new Hash, + 'map': new (Map || ListCache), + 'string': new Hash + }; +} + +/** + * Removes `key` and its value from the map. + * + * @private + * @name delete + * @memberOf MapCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function mapCacheDelete(key) { + var result = getMapData(this, key)['delete'](key); + this.size -= result ? 1 : 0; + return result; +} + +/** + * Gets the map value for `key`. + * + * @private + * @name get + * @memberOf MapCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function mapCacheGet(key) { + return getMapData(this, key).get(key); +} + +/** + * Checks if a map value for `key` exists. + * + * @private + * @name has + * @memberOf MapCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function mapCacheHas(key) { + return getMapData(this, key).has(key); +} + +/** + * Sets the map `key` to `value`. + * + * @private + * @name set + * @memberOf MapCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the map cache instance. + */ +function mapCacheSet(key, value) { + var data = getMapData(this, key), + size = data.size; + + data.set(key, value); + this.size += data.size == size ? 0 : 1; + return this; +} + +// Add methods to `MapCache`. +MapCache.prototype.clear = mapCacheClear; +MapCache.prototype['delete'] = mapCacheDelete; +MapCache.prototype.get = mapCacheGet; +MapCache.prototype.has = mapCacheHas; +MapCache.prototype.set = mapCacheSet; + +/** + * Creates a stack cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function Stack(entries) { + var data = this.__data__ = new ListCache(entries); + this.size = data.size; +} + +/** + * Removes all key-value entries from the stack. + * + * @private + * @name clear + * @memberOf Stack + */ +function stackClear() { + this.__data__ = new ListCache; + this.size = 0; +} + +/** + * Removes `key` and its value from the stack. + * + * @private + * @name delete + * @memberOf Stack + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function stackDelete(key) { + var data = this.__data__, + result = data['delete'](key); + + this.size = data.size; + return result; +} + +/** + * Gets the stack value for `key`. + * + * @private + * @name get + * @memberOf Stack + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function stackGet(key) { + return this.__data__.get(key); +} + +/** + * Checks if a stack value for `key` exists. + * + * @private + * @name has + * @memberOf Stack + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function stackHas(key) { + return this.__data__.has(key); +} + +/** + * Sets the stack `key` to `value`. + * + * @private + * @name set + * @memberOf Stack + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the stack cache instance. + */ +function stackSet(key, value) { + var data = this.__data__; + if (data instanceof ListCache) { + var pairs = data.__data__; + if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { + pairs.push([key, value]); + this.size = ++data.size; + return this; + } + data = this.__data__ = new MapCache(pairs); + } + data.set(key, value); + this.size = data.size; + return this; +} + +// Add methods to `Stack`. +Stack.prototype.clear = stackClear; +Stack.prototype['delete'] = stackDelete; +Stack.prototype.get = stackGet; +Stack.prototype.has = stackHas; +Stack.prototype.set = stackSet; + +/** + * Creates an array of the enumerable property names of the array-like `value`. + * + * @private + * @param {*} value The value to query. + * @param {boolean} inherited Specify returning inherited property names. + * @returns {Array} Returns the array of property names. + */ +function arrayLikeKeys(value, inherited) { + var isArr = isArray(value), + isArg = !isArr && isArguments(value), + isBuff = !isArr && !isArg && isBuffer(value), + isType = !isArr && !isArg && !isBuff && isTypedArray(value), + skipIndexes = isArr || isArg || isBuff || isType, + result = skipIndexes ? baseTimes(value.length, String) : [], + length = result.length; + + for (var key in value) { + if ((inherited || hasOwnProperty.call(value, key)) && + !(skipIndexes && ( + // Safari 9 has enumerable `arguments.length` in strict mode. + key == 'length' || + // Node.js 0.10 has enumerable non-index properties on buffers. + (isBuff && (key == 'offset' || key == 'parent')) || + // PhantomJS 2 has enumerable non-index properties on typed arrays. + (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || + // Skip index properties. + isIndex(key, length) + ))) { + result.push(key); + } + } + return result; +} + +/** + * This function is like `assignValue` except that it doesn't assign + * `undefined` values. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ +function assignMergeValue(object, key, value) { + if ((value !== undefined && !eq(object[key], value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); + } +} + +/** + * Assigns `value` to `key` of `object` if the existing value is not equivalent + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ +function assignValue(object, key, value) { + var objValue = object[key]; + if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); + } +} + +/** + * Gets the index at which the `key` is found in `array` of key-value pairs. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} key The key to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + */ +function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq(array[length][0], key)) { + return length; + } + } + return -1; +} + +/** + * The base implementation of `assignValue` and `assignMergeValue` without + * value checks. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ +function baseAssignValue(object, key, value) { + if (key == '__proto__' && defineProperty) { + defineProperty(object, key, { + 'configurable': true, + 'enumerable': true, + 'value': value, + 'writable': true + }); + } else { + object[key] = value; + } +} + +/** + * The base implementation of `baseForOwn` which iterates over `object` + * properties returned by `keysFunc` and invokes `iteratee` for each property. + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ +var baseFor = createBaseFor(); + +/** + * The base implementation of `getTag` without fallbacks for buggy environments. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ +function baseGetTag(value) { + if (value == null) { + return value === undefined ? undefinedTag : nullTag; + } + return (symToStringTag && symToStringTag in Object(value)) + ? getRawTag(value) + : objectToString(value); +} + +/** + * The base implementation of `_.isArguments`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + */ +function baseIsArguments(value) { + return isObjectLike(value) && baseGetTag(value) == argsTag; +} + +/** + * The base implementation of `_.isNative` without bad shim checks. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + */ +function baseIsNative(value) { + if (!isObject(value) || isMasked(value)) { + return false; + } + var pattern = isFunction(value) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); +} + +/** + * The base implementation of `_.isTypedArray` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + */ +function baseIsTypedArray(value) { + return isObjectLike(value) && + isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; +} + +/** + * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ +function baseKeysIn(object) { + if (!isObject(object)) { + return nativeKeysIn(object); + } + var isProto = isPrototype(object), + result = []; + + for (var key in object) { + if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { + result.push(key); + } + } + return result; +} + +/** + * The base implementation of `_.merge` without support for multiple sources. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {number} srcIndex The index of `source`. + * @param {Function} [customizer] The function to customize merged values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ +function baseMerge(object, source, srcIndex, customizer, stack) { + if (object === source) { + return; + } + baseFor(source, function(srcValue, key) { + stack || (stack = new Stack); + if (isObject(srcValue)) { + baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack); + } + else { + var newValue = customizer + ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack) + : undefined; + + if (newValue === undefined) { + newValue = srcValue; + } + assignMergeValue(object, key, newValue); + } + }, keysIn); +} + +/** + * A specialized version of `baseMerge` for arrays and objects which performs + * deep merges and tracks traversed objects enabling objects with circular + * references to be merged. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {string} key The key of the value to merge. + * @param {number} srcIndex The index of `source`. + * @param {Function} mergeFunc The function to merge values. + * @param {Function} [customizer] The function to customize assigned values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ +function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) { + var objValue = safeGet(object, key), + srcValue = safeGet(source, key), + stacked = stack.get(srcValue); + + if (stacked) { + assignMergeValue(object, key, stacked); + return; + } + var newValue = customizer + ? customizer(objValue, srcValue, (key + ''), object, source, stack) + : undefined; + + var isCommon = newValue === undefined; + + if (isCommon) { + var isArr = isArray(srcValue), + isBuff = !isArr && isBuffer(srcValue), + isTyped = !isArr && !isBuff && isTypedArray(srcValue); + + newValue = srcValue; + if (isArr || isBuff || isTyped) { + if (isArray(objValue)) { + newValue = objValue; + } + else if (isArrayLikeObject(objValue)) { + newValue = copyArray(objValue); + } + else if (isBuff) { + isCommon = false; + newValue = cloneBuffer(srcValue, true); + } + else if (isTyped) { + isCommon = false; + newValue = cloneTypedArray(srcValue, true); + } + else { + newValue = []; + } + } + else if (isPlainObject(srcValue) || isArguments(srcValue)) { + newValue = objValue; + if (isArguments(objValue)) { + newValue = toPlainObject(objValue); + } + else if (!isObject(objValue) || isFunction(objValue)) { + newValue = initCloneObject(srcValue); + } + } + else { + isCommon = false; + } + } + if (isCommon) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, newValue); + mergeFunc(newValue, srcValue, srcIndex, customizer, stack); + stack['delete'](srcValue); + } + assignMergeValue(object, key, newValue); +} + +/** + * The base implementation of `_.rest` which doesn't validate or coerce arguments. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + */ +function baseRest(func, start) { + return setToString(overRest(func, start, identity), func + ''); +} + +/** + * The base implementation of `setToString` without support for hot loop shorting. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ +var baseSetToString = !defineProperty ? identity : function(func, string) { + return defineProperty(func, 'toString', { + 'configurable': true, + 'enumerable': false, + 'value': constant(string), + 'writable': true + }); +}; + +/** + * Creates a clone of `buffer`. + * + * @private + * @param {Buffer} buffer The buffer to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Buffer} Returns the cloned buffer. + */ +function cloneBuffer(buffer, isDeep) { + if (isDeep) { + return buffer.slice(); + } + var length = buffer.length, + result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length); + + buffer.copy(result); + return result; +} + +/** + * Creates a clone of `arrayBuffer`. + * + * @private + * @param {ArrayBuffer} arrayBuffer The array buffer to clone. + * @returns {ArrayBuffer} Returns the cloned array buffer. + */ +function cloneArrayBuffer(arrayBuffer) { + var result = new arrayBuffer.constructor(arrayBuffer.byteLength); + new Uint8Array(result).set(new Uint8Array(arrayBuffer)); + return result; +} + +/** + * Creates a clone of `typedArray`. + * + * @private + * @param {Object} typedArray The typed array to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned typed array. + */ +function cloneTypedArray(typedArray, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; + return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length); +} + +/** + * Copies the values of `source` to `array`. + * + * @private + * @param {Array} source The array to copy values from. + * @param {Array} [array=[]] The array to copy values to. + * @returns {Array} Returns `array`. + */ +function copyArray(source, array) { + var index = -1, + length = source.length; + + array || (array = Array(length)); + while (++index < length) { + array[index] = source[index]; + } + return array; +} + +/** + * Copies properties of `source` to `object`. + * + * @private + * @param {Object} source The object to copy properties from. + * @param {Array} props The property identifiers to copy. + * @param {Object} [object={}] The object to copy properties to. + * @param {Function} [customizer] The function to customize copied values. + * @returns {Object} Returns `object`. + */ +function copyObject(source, props, object, customizer) { + var isNew = !object; + object || (object = {}); + + var index = -1, + length = props.length; + + while (++index < length) { + var key = props[index]; + + var newValue = customizer + ? customizer(object[key], source[key], key, object, source) + : undefined; + + if (newValue === undefined) { + newValue = source[key]; + } + if (isNew) { + baseAssignValue(object, key, newValue); + } else { + assignValue(object, key, newValue); + } + } + return object; +} + +/** + * Creates a function like `_.assign`. + * + * @private + * @param {Function} assigner The function to assign values. + * @returns {Function} Returns the new assigner function. + */ +function createAssigner(assigner) { + return baseRest(function(object, sources) { + var index = -1, + length = sources.length, + customizer = length > 1 ? sources[length - 1] : undefined, + guard = length > 2 ? sources[2] : undefined; + + customizer = (assigner.length > 3 && typeof customizer == 'function') + ? (length--, customizer) + : undefined; + + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + customizer = length < 3 ? undefined : customizer; + length = 1; + } + object = Object(object); + while (++index < length) { + var source = sources[index]; + if (source) { + assigner(object, source, index, customizer); + } + } + return object; + }); +} + +/** + * Creates a base function for methods like `_.forIn` and `_.forOwn`. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ +function createBaseFor(fromRight) { + return function(object, iteratee, keysFunc) { + var index = -1, + iterable = Object(object), + props = keysFunc(object), + length = props.length; + + while (length--) { + var key = props[fromRight ? length : ++index]; + if (iteratee(iterable[key], key, iterable) === false) { + break; + } + } + return object; + }; +} + +/** + * Gets the data for `map`. + * + * @private + * @param {Object} map The map to query. + * @param {string} key The reference key. + * @returns {*} Returns the map data. + */ +function getMapData(map, key) { + var data = map.__data__; + return isKeyable(key) + ? data[typeof key == 'string' ? 'string' : 'hash'] + : data.map; +} + +/** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ +function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined; +} + +/** + * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the raw `toStringTag`. + */ +function getRawTag(value) { + var isOwn = hasOwnProperty.call(value, symToStringTag), + tag = value[symToStringTag]; + + try { + value[symToStringTag] = undefined; + var unmasked = true; + } catch (e) {} + + var result = nativeObjectToString.call(value); + if (unmasked) { + if (isOwn) { + value[symToStringTag] = tag; + } else { + delete value[symToStringTag]; + } + } + return result; +} + +/** + * Initializes an object clone. + * + * @private + * @param {Object} object The object to clone. + * @returns {Object} Returns the initialized clone. + */ +function initCloneObject(object) { + return (typeof object.constructor == 'function' && !isPrototype(object)) + ? baseCreate(getPrototype(object)) + : {}; +} + +/** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ +function isIndex(value, length) { + var type = typeof value; + length = length == null ? MAX_SAFE_INTEGER : length; + + return !!length && + (type == 'number' || + (type != 'symbol' && reIsUint.test(value))) && + (value > -1 && value % 1 == 0 && value < length); +} + +/** + * Checks if the given arguments are from an iteratee call. + * + * @private + * @param {*} value The potential iteratee value argument. + * @param {*} index The potential iteratee index or key argument. + * @param {*} object The potential iteratee object argument. + * @returns {boolean} Returns `true` if the arguments are from an iteratee call, + * else `false`. + */ +function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; + } + var type = typeof index; + if (type == 'number' + ? (isArrayLike(object) && isIndex(index, object.length)) + : (type == 'string' && index in object) + ) { + return eq(object[index], value); + } + return false; +} + +/** + * Checks if `value` is suitable for use as unique object key. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is suitable, else `false`. + */ +function isKeyable(value) { + var type = typeof value; + return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') + ? (value !== '__proto__') + : (value === null); +} + +/** + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. + */ +function isMasked(func) { + return !!maskSrcKey && (maskSrcKey in func); +} + +/** + * Checks if `value` is likely a prototype object. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. + */ +function isPrototype(value) { + var Ctor = value && value.constructor, + proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; + + return value === proto; +} + +/** + * This function is like + * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * except that it includes inherited enumerable properties. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ +function nativeKeysIn(object) { + var result = []; + if (object != null) { + for (var key in Object(object)) { + result.push(key); + } + } + return result; +} + +/** + * Converts `value` to a string using `Object.prototype.toString`. + * + * @private + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + */ +function objectToString(value) { + return nativeObjectToString.call(value); +} + +/** + * A specialized version of `baseRest` which transforms the rest array. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @param {Function} transform The rest array transform. + * @returns {Function} Returns the new function. + */ +function overRest(func, start, transform) { + start = nativeMax(start === undefined ? (func.length - 1) : start, 0); + return function() { + var args = arguments, + index = -1, + length = nativeMax(args.length - start, 0), + array = Array(length); + + while (++index < length) { + array[index] = args[start + index]; + } + index = -1; + var otherArgs = Array(start + 1); + while (++index < start) { + otherArgs[index] = args[index]; + } + otherArgs[start] = transform(array); + return apply(func, this, otherArgs); + }; +} + +/** + * Gets the value at `key`, unless `key` is "__proto__" or "constructor". + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ +function safeGet(object, key) { + if (key === 'constructor' && typeof object[key] === 'function') { + return; + } + + if (key == '__proto__') { + return; + } + + return object[key]; +} + +/** + * Sets the `toString` method of `func` to return `string`. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ +var setToString = shortOut(baseSetToString); + +/** + * Creates a function that'll short out and invoke `identity` instead + * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN` + * milliseconds. + * + * @private + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new shortable function. + */ +function shortOut(func) { + var count = 0, + lastCalled = 0; + + return function() { + var stamp = nativeNow(), + remaining = HOT_SPAN - (stamp - lastCalled); + + lastCalled = stamp; + if (remaining > 0) { + if (++count >= HOT_COUNT) { + return arguments[0]; + } + } else { + count = 0; + } + return func.apply(undefined, arguments); + }; +} + +/** + * Converts `func` to its source code. + * + * @private + * @param {Function} func The function to convert. + * @returns {string} Returns the source code. + */ +function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) {} + try { + return (func + ''); + } catch (e) {} + } + return ''; +} + +/** + * Performs a + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * comparison between two values to determine if they are equivalent. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.eq(object, object); + * // => true + * + * _.eq(object, other); + * // => false + * + * _.eq('a', 'a'); + * // => true + * + * _.eq('a', Object('a')); + * // => false + * + * _.eq(NaN, NaN); + * // => true + */ +function eq(value, other) { + return value === other || (value !== value && other !== other); +} + +/** + * Checks if `value` is likely an `arguments` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + * else `false`. + * @example + * + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ +var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) { + return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && + !propertyIsEnumerable.call(value, 'callee'); +}; + +/** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ +var isArray = Array.isArray; + +/** + * Checks if `value` is array-like. A value is considered array-like if it's + * not a function and has a `value.length` that's an integer greater than or + * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + * @example + * + * _.isArrayLike([1, 2, 3]); + * // => true + * + * _.isArrayLike(document.body.children); + * // => true + * + * _.isArrayLike('abc'); + * // => true + * + * _.isArrayLike(_.noop); + * // => false + */ +function isArrayLike(value) { + return value != null && isLength(value.length) && !isFunction(value); +} + +/** + * This method is like `_.isArrayLike` except that it also checks if `value` + * is an object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array-like object, + * else `false`. + * @example + * + * _.isArrayLikeObject([1, 2, 3]); + * // => true + * + * _.isArrayLikeObject(document.body.children); + * // => true + * + * _.isArrayLikeObject('abc'); + * // => false + * + * _.isArrayLikeObject(_.noop); + * // => false + */ +function isArrayLikeObject(value) { + return isObjectLike(value) && isArrayLike(value); +} + +/** + * Checks if `value` is a buffer. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. + * @example + * + * _.isBuffer(new Buffer(2)); + * // => true + * + * _.isBuffer(new Uint8Array(2)); + * // => false + */ +var isBuffer = nativeIsBuffer || stubFalse; + +/** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ +function isFunction(value) { + if (!isObject(value)) { + return false; + } + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 9 which returns 'object' for typed arrays and other constructors. + var tag = baseGetTag(value); + return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; +} + +/** + * Checks if `value` is a valid array-like length. + * + * **Note:** This method is loosely based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + * @example + * + * _.isLength(3); + * // => true + * + * _.isLength(Number.MIN_VALUE); + * // => false + * + * _.isLength(Infinity); + * // => false + * + * _.isLength('3'); + * // => false + */ +function isLength(value) { + return typeof value == 'number' && + value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; +} + +/** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ +function isObject(value) { + var type = typeof value; + return value != null && (type == 'object' || type == 'function'); +} + +/** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ +function isObjectLike(value) { + return value != null && typeof value == 'object'; +} + +/** + * Checks if `value` is a plain object, that is, an object created by the + * `Object` constructor or one with a `[[Prototype]]` of `null`. + * + * @static + * @memberOf _ + * @since 0.8.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * _.isPlainObject(new Foo); + * // => false + * + * _.isPlainObject([1, 2, 3]); + * // => false + * + * _.isPlainObject({ 'x': 0, 'y': 0 }); + * // => true + * + * _.isPlainObject(Object.create(null)); + * // => true + */ +function isPlainObject(value) { + if (!isObjectLike(value) || baseGetTag(value) != objectTag) { + return false; + } + var proto = getPrototype(value); + if (proto === null) { + return true; + } + var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor; + return typeof Ctor == 'function' && Ctor instanceof Ctor && + funcToString.call(Ctor) == objectCtorString; +} + +/** + * Checks if `value` is classified as a typed array. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + * @example + * + * _.isTypedArray(new Uint8Array); + * // => true + * + * _.isTypedArray([]); + * // => false + */ +var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; + +/** + * Converts `value` to a plain object flattening inherited enumerable string + * keyed properties of `value` to own properties of the plain object. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {Object} Returns the converted plain object. + * @example + * + * function Foo() { + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.assign({ 'a': 1 }, new Foo); + * // => { 'a': 1, 'b': 2 } + * + * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); + * // => { 'a': 1, 'b': 2, 'c': 3 } + */ +function toPlainObject(value) { + return copyObject(value, keysIn(value)); +} + +/** + * Creates an array of the own and inherited enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keysIn(new Foo); + * // => ['a', 'b', 'c'] (iteration order is not guaranteed) + */ +function keysIn(object) { + return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); +} + +/** + * This method is like `_.merge` except that it accepts `customizer` which + * is invoked to produce the merged values of the destination and source + * properties. If `customizer` returns `undefined`, merging is handled by the + * method instead. The `customizer` is invoked with six arguments: + * (objValue, srcValue, key, object, source, stack). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} customizer The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * function customizer(objValue, srcValue) { + * if (_.isArray(objValue)) { + * return objValue.concat(srcValue); + * } + * } + * + * var object = { 'a': [1], 'b': [2] }; + * var other = { 'a': [3], 'b': [4] }; + * + * _.mergeWith(object, other, customizer); + * // => { 'a': [1, 3], 'b': [2, 4] } + */ +var mergeWith = createAssigner(function(object, source, srcIndex, customizer) { + baseMerge(object, source, srcIndex, customizer); +}); + +/** + * Creates a function that returns `value`. + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Util + * @param {*} value The value to return from the new function. + * @returns {Function} Returns the new constant function. + * @example + * + * var objects = _.times(2, _.constant({ 'a': 1 })); + * + * console.log(objects); + * // => [{ 'a': 1 }, { 'a': 1 }] + * + * console.log(objects[0] === objects[1]); + * // => true + */ +function constant(value) { + return function() { + return value; + }; +} + +/** + * This method returns the first argument it receives. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Util + * @param {*} value Any value. + * @returns {*} Returns `value`. + * @example + * + * var object = { 'a': 1 }; + * + * console.log(_.identity(object) === object); + * // => true + */ +function identity(value) { + return value; +} + +/** + * This method returns `false`. + * + * @static + * @memberOf _ + * @since 4.13.0 + * @category Util + * @returns {boolean} Returns `false`. + * @example + * + * _.times(2, _.stubFalse); + * // => [false, false] + */ +function stubFalse() { + return false; +} + +module.exports = mergeWith; diff --git a/node_modules/lodash.mergewith/package.json b/node_modules/lodash.mergewith/package.json new file mode 100644 index 00000000..d37acd03 --- /dev/null +++ b/node_modules/lodash.mergewith/package.json @@ -0,0 +1,16 @@ +{ + "name": "lodash.mergewith", + "version": "4.6.2", + "description": "The Lodash method `_.mergeWith` exported as a module.", + "homepage": "https://lodash.com/", + "icon": "https://lodash.com/icon.svg", + "license": "MIT", + "keywords": "lodash-modularized, mergewith", + "author": "John-David Dalton ", + "contributors": [ + "John-David Dalton ", + "Mathias Bynens " + ], + "repository": "lodash/lodash", + "scripts": { "test": "echo \"See https://travis-ci.org/lodash/lodash-cli for testing details.\"" } +} diff --git a/node_modules/lodash.sortby/LICENSE b/node_modules/lodash.sortby/LICENSE new file mode 100644 index 00000000..e0c69d56 --- /dev/null +++ b/node_modules/lodash.sortby/LICENSE @@ -0,0 +1,47 @@ +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. diff --git a/node_modules/lodash.sortby/README.md b/node_modules/lodash.sortby/README.md new file mode 100644 index 00000000..266738eb --- /dev/null +++ b/node_modules/lodash.sortby/README.md @@ -0,0 +1,18 @@ +# lodash.sortby v4.7.0 + +The [lodash](https://lodash.com/) method `_.sortBy` exported as a [Node.js](https://nodejs.org/) module. + +## Installation + +Using npm: +```bash +$ {sudo -H} npm i -g npm +$ npm i --save lodash.sortby +``` + +In Node.js: +```js +var sortBy = require('lodash.sortby'); +``` + +See the [documentation](https://lodash.com/docs#sortBy) or [package source](https://github.com/lodash/lodash/blob/4.7.0-npm-packages/lodash.sortby) for more details. diff --git a/node_modules/lodash.sortby/index.js b/node_modules/lodash.sortby/index.js new file mode 100644 index 00000000..85dddb46 --- /dev/null +++ b/node_modules/lodash.sortby/index.js @@ -0,0 +1,2630 @@ +/** + * lodash (Custom Build) + * Build: `lodash modularize exports="npm" -o ./` + * Copyright jQuery Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ + +/** Used as the size to enable large array optimizations. */ +var LARGE_ARRAY_SIZE = 200; + +/** Used as the `TypeError` message for "Functions" methods. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/** Used to stand-in for `undefined` hash values. */ +var HASH_UNDEFINED = '__lodash_hash_undefined__'; + +/** Used to compose bitmasks for comparison styles. */ +var UNORDERED_COMPARE_FLAG = 1, + PARTIAL_COMPARE_FLAG = 2; + +/** Used as references for various `Number` constants. */ +var INFINITY = 1 / 0, + MAX_SAFE_INTEGER = 9007199254740991; + +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + mapTag = '[object Map]', + numberTag = '[object Number]', + objectTag = '[object Object]', + promiseTag = '[object Promise]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + symbolTag = '[object Symbol]', + weakMapTag = '[object WeakMap]'; + +var arrayBufferTag = '[object ArrayBuffer]', + dataViewTag = '[object DataView]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; + +/** Used to match property names within property paths. */ +var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/, + reLeadingDot = /^\./, + rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + +/** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ +var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; + +/** Used to match backslashes in property paths. */ +var reEscapeChar = /\\(\\)?/g; + +/** Used to detect host constructors (Safari). */ +var reIsHostCtor = /^\[object .+?Constructor\]$/; + +/** Used to detect unsigned integer values. */ +var reIsUint = /^(?:0|[1-9]\d*)$/; + +/** Used to identify `toStringTag` values of typed arrays. */ +var typedArrayTags = {}; +typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = +typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = +typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = +typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = +typedArrayTags[uint32Tag] = true; +typedArrayTags[argsTag] = typedArrayTags[arrayTag] = +typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = +typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = +typedArrayTags[errorTag] = typedArrayTags[funcTag] = +typedArrayTags[mapTag] = typedArrayTags[numberTag] = +typedArrayTags[objectTag] = typedArrayTags[regexpTag] = +typedArrayTags[setTag] = typedArrayTags[stringTag] = +typedArrayTags[weakMapTag] = false; + +/** Detect free variable `global` from Node.js. */ +var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; + +/** Detect free variable `self`. */ +var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + +/** Used as a reference to the global object. */ +var root = freeGlobal || freeSelf || Function('return this')(); + +/** Detect free variable `exports`. */ +var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; + +/** Detect free variable `module`. */ +var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; + +/** Detect the popular CommonJS extension `module.exports`. */ +var moduleExports = freeModule && freeModule.exports === freeExports; + +/** Detect free variable `process` from Node.js. */ +var freeProcess = moduleExports && freeGlobal.process; + +/** Used to access faster Node.js helpers. */ +var nodeUtil = (function() { + try { + return freeProcess && freeProcess.binding('util'); + } catch (e) {} +}()); + +/* Node.js helper references. */ +var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; + +/** + * A faster alternative to `Function#apply`, this function invokes `func` + * with the `this` binding of `thisArg` and the arguments of `args`. + * + * @private + * @param {Function} func The function to invoke. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} args The arguments to invoke `func` with. + * @returns {*} Returns the result of `func`. + */ +function apply(func, thisArg, args) { + switch (args.length) { + case 0: return func.call(thisArg); + case 1: return func.call(thisArg, args[0]); + case 2: return func.call(thisArg, args[0], args[1]); + case 3: return func.call(thisArg, args[0], args[1], args[2]); + } + return func.apply(thisArg, args); +} + +/** + * A specialized version of `_.map` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ +function arrayMap(array, iteratee) { + var index = -1, + length = array ? array.length : 0, + result = Array(length); + + while (++index < length) { + result[index] = iteratee(array[index], index, array); + } + return result; +} + +/** + * Appends the elements of `values` to `array`. + * + * @private + * @param {Array} array The array to modify. + * @param {Array} values The values to append. + * @returns {Array} Returns `array`. + */ +function arrayPush(array, values) { + var index = -1, + length = values.length, + offset = array.length; + + while (++index < length) { + array[offset + index] = values[index]; + } + return array; +} + +/** + * A specialized version of `_.some` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ +function arraySome(array, predicate) { + var index = -1, + length = array ? array.length : 0; + + while (++index < length) { + if (predicate(array[index], index, array)) { + return true; + } + } + return false; +} + +/** + * The base implementation of `_.property` without support for deep paths. + * + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new accessor function. + */ +function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; +} + +/** + * The base implementation of `_.sortBy` which uses `comparer` to define the + * sort order of `array` and replaces criteria objects with their corresponding + * values. + * + * @private + * @param {Array} array The array to sort. + * @param {Function} comparer The function to define sort order. + * @returns {Array} Returns `array`. + */ +function baseSortBy(array, comparer) { + var length = array.length; + + array.sort(comparer); + while (length--) { + array[length] = array[length].value; + } + return array; +} + +/** + * The base implementation of `_.times` without support for iteratee shorthands + * or max array length checks. + * + * @private + * @param {number} n The number of times to invoke `iteratee`. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the array of results. + */ +function baseTimes(n, iteratee) { + var index = -1, + result = Array(n); + + while (++index < n) { + result[index] = iteratee(index); + } + return result; +} + +/** + * The base implementation of `_.unary` without support for storing metadata. + * + * @private + * @param {Function} func The function to cap arguments for. + * @returns {Function} Returns the new capped function. + */ +function baseUnary(func) { + return function(value) { + return func(value); + }; +} + +/** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ +function getValue(object, key) { + return object == null ? undefined : object[key]; +} + +/** + * Checks if `value` is a host object in IE < 9. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a host object, else `false`. + */ +function isHostObject(value) { + // Many host objects are `Object` objects that can coerce to strings + // despite having improperly defined `toString` methods. + var result = false; + if (value != null && typeof value.toString != 'function') { + try { + result = !!(value + ''); + } catch (e) {} + } + return result; +} + +/** + * Converts `map` to its key-value pairs. + * + * @private + * @param {Object} map The map to convert. + * @returns {Array} Returns the key-value pairs. + */ +function mapToArray(map) { + var index = -1, + result = Array(map.size); + + map.forEach(function(value, key) { + result[++index] = [key, value]; + }); + return result; +} + +/** + * Creates a unary function that invokes `func` with its argument transformed. + * + * @private + * @param {Function} func The function to wrap. + * @param {Function} transform The argument transform. + * @returns {Function} Returns the new function. + */ +function overArg(func, transform) { + return function(arg) { + return func(transform(arg)); + }; +} + +/** + * Converts `set` to an array of its values. + * + * @private + * @param {Object} set The set to convert. + * @returns {Array} Returns the values. + */ +function setToArray(set) { + var index = -1, + result = Array(set.size); + + set.forEach(function(value) { + result[++index] = value; + }); + return result; +} + +/** Used for built-in method references. */ +var arrayProto = Array.prototype, + funcProto = Function.prototype, + objectProto = Object.prototype; + +/** Used to detect overreaching core-js shims. */ +var coreJsData = root['__core-js_shared__']; + +/** Used to detect methods masquerading as native. */ +var maskSrcKey = (function() { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); + return uid ? ('Symbol(src)_1.' + uid) : ''; +}()); + +/** Used to resolve the decompiled source of functions. */ +var funcToString = funcProto.toString; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var objectToString = objectProto.toString; + +/** Used to detect if a method is native. */ +var reIsNative = RegExp('^' + + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' +); + +/** Built-in value references. */ +var Symbol = root.Symbol, + Uint8Array = root.Uint8Array, + propertyIsEnumerable = objectProto.propertyIsEnumerable, + splice = arrayProto.splice, + spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined; + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeKeys = overArg(Object.keys, Object), + nativeMax = Math.max; + +/* Built-in method references that are verified to be native. */ +var DataView = getNative(root, 'DataView'), + Map = getNative(root, 'Map'), + Promise = getNative(root, 'Promise'), + Set = getNative(root, 'Set'), + WeakMap = getNative(root, 'WeakMap'), + nativeCreate = getNative(Object, 'create'); + +/** Used to detect maps, sets, and weakmaps. */ +var dataViewCtorString = toSource(DataView), + mapCtorString = toSource(Map), + promiseCtorString = toSource(Promise), + setCtorString = toSource(Set), + weakMapCtorString = toSource(WeakMap); + +/** Used to convert symbols to primitives and strings. */ +var symbolProto = Symbol ? Symbol.prototype : undefined, + symbolValueOf = symbolProto ? symbolProto.valueOf : undefined, + symbolToString = symbolProto ? symbolProto.toString : undefined; + +/** + * Creates a hash object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function Hash(entries) { + var index = -1, + length = entries ? entries.length : 0; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +/** + * Removes all key-value entries from the hash. + * + * @private + * @name clear + * @memberOf Hash + */ +function hashClear() { + this.__data__ = nativeCreate ? nativeCreate(null) : {}; +} + +/** + * Removes `key` and its value from the hash. + * + * @private + * @name delete + * @memberOf Hash + * @param {Object} hash The hash to modify. + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function hashDelete(key) { + return this.has(key) && delete this.__data__[key]; +} + +/** + * Gets the hash value for `key`. + * + * @private + * @name get + * @memberOf Hash + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function hashGet(key) { + var data = this.__data__; + if (nativeCreate) { + var result = data[key]; + return result === HASH_UNDEFINED ? undefined : result; + } + return hasOwnProperty.call(data, key) ? data[key] : undefined; +} + +/** + * Checks if a hash value for `key` exists. + * + * @private + * @name has + * @memberOf Hash + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function hashHas(key) { + var data = this.__data__; + return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key); +} + +/** + * Sets the hash `key` to `value`. + * + * @private + * @name set + * @memberOf Hash + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the hash instance. + */ +function hashSet(key, value) { + var data = this.__data__; + data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; + return this; +} + +// Add methods to `Hash`. +Hash.prototype.clear = hashClear; +Hash.prototype['delete'] = hashDelete; +Hash.prototype.get = hashGet; +Hash.prototype.has = hashHas; +Hash.prototype.set = hashSet; + +/** + * Creates an list cache object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function ListCache(entries) { + var index = -1, + length = entries ? entries.length : 0; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +/** + * Removes all key-value entries from the list cache. + * + * @private + * @name clear + * @memberOf ListCache + */ +function listCacheClear() { + this.__data__ = []; +} + +/** + * Removes `key` and its value from the list cache. + * + * @private + * @name delete + * @memberOf ListCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function listCacheDelete(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + return true; +} + +/** + * Gets the list cache value for `key`. + * + * @private + * @name get + * @memberOf ListCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function listCacheGet(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + return index < 0 ? undefined : data[index][1]; +} + +/** + * Checks if a list cache value for `key` exists. + * + * @private + * @name has + * @memberOf ListCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function listCacheHas(key) { + return assocIndexOf(this.__data__, key) > -1; +} + +/** + * Sets the list cache `key` to `value`. + * + * @private + * @name set + * @memberOf ListCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the list cache instance. + */ +function listCacheSet(key, value) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + data.push([key, value]); + } else { + data[index][1] = value; + } + return this; +} + +// Add methods to `ListCache`. +ListCache.prototype.clear = listCacheClear; +ListCache.prototype['delete'] = listCacheDelete; +ListCache.prototype.get = listCacheGet; +ListCache.prototype.has = listCacheHas; +ListCache.prototype.set = listCacheSet; + +/** + * Creates a map cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function MapCache(entries) { + var index = -1, + length = entries ? entries.length : 0; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +/** + * Removes all key-value entries from the map. + * + * @private + * @name clear + * @memberOf MapCache + */ +function mapCacheClear() { + this.__data__ = { + 'hash': new Hash, + 'map': new (Map || ListCache), + 'string': new Hash + }; +} + +/** + * Removes `key` and its value from the map. + * + * @private + * @name delete + * @memberOf MapCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function mapCacheDelete(key) { + return getMapData(this, key)['delete'](key); +} + +/** + * Gets the map value for `key`. + * + * @private + * @name get + * @memberOf MapCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function mapCacheGet(key) { + return getMapData(this, key).get(key); +} + +/** + * Checks if a map value for `key` exists. + * + * @private + * @name has + * @memberOf MapCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function mapCacheHas(key) { + return getMapData(this, key).has(key); +} + +/** + * Sets the map `key` to `value`. + * + * @private + * @name set + * @memberOf MapCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the map cache instance. + */ +function mapCacheSet(key, value) { + getMapData(this, key).set(key, value); + return this; +} + +// Add methods to `MapCache`. +MapCache.prototype.clear = mapCacheClear; +MapCache.prototype['delete'] = mapCacheDelete; +MapCache.prototype.get = mapCacheGet; +MapCache.prototype.has = mapCacheHas; +MapCache.prototype.set = mapCacheSet; + +/** + * + * Creates an array cache object to store unique values. + * + * @private + * @constructor + * @param {Array} [values] The values to cache. + */ +function SetCache(values) { + var index = -1, + length = values ? values.length : 0; + + this.__data__ = new MapCache; + while (++index < length) { + this.add(values[index]); + } +} + +/** + * Adds `value` to the array cache. + * + * @private + * @name add + * @memberOf SetCache + * @alias push + * @param {*} value The value to cache. + * @returns {Object} Returns the cache instance. + */ +function setCacheAdd(value) { + this.__data__.set(value, HASH_UNDEFINED); + return this; +} + +/** + * Checks if `value` is in the array cache. + * + * @private + * @name has + * @memberOf SetCache + * @param {*} value The value to search for. + * @returns {number} Returns `true` if `value` is found, else `false`. + */ +function setCacheHas(value) { + return this.__data__.has(value); +} + +// Add methods to `SetCache`. +SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; +SetCache.prototype.has = setCacheHas; + +/** + * Creates a stack cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function Stack(entries) { + this.__data__ = new ListCache(entries); +} + +/** + * Removes all key-value entries from the stack. + * + * @private + * @name clear + * @memberOf Stack + */ +function stackClear() { + this.__data__ = new ListCache; +} + +/** + * Removes `key` and its value from the stack. + * + * @private + * @name delete + * @memberOf Stack + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function stackDelete(key) { + return this.__data__['delete'](key); +} + +/** + * Gets the stack value for `key`. + * + * @private + * @name get + * @memberOf Stack + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function stackGet(key) { + return this.__data__.get(key); +} + +/** + * Checks if a stack value for `key` exists. + * + * @private + * @name has + * @memberOf Stack + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function stackHas(key) { + return this.__data__.has(key); +} + +/** + * Sets the stack `key` to `value`. + * + * @private + * @name set + * @memberOf Stack + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the stack cache instance. + */ +function stackSet(key, value) { + var cache = this.__data__; + if (cache instanceof ListCache) { + var pairs = cache.__data__; + if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { + pairs.push([key, value]); + return this; + } + cache = this.__data__ = new MapCache(pairs); + } + cache.set(key, value); + return this; +} + +// Add methods to `Stack`. +Stack.prototype.clear = stackClear; +Stack.prototype['delete'] = stackDelete; +Stack.prototype.get = stackGet; +Stack.prototype.has = stackHas; +Stack.prototype.set = stackSet; + +/** + * Creates an array of the enumerable property names of the array-like `value`. + * + * @private + * @param {*} value The value to query. + * @param {boolean} inherited Specify returning inherited property names. + * @returns {Array} Returns the array of property names. + */ +function arrayLikeKeys(value, inherited) { + // Safari 8.1 makes `arguments.callee` enumerable in strict mode. + // Safari 9 makes `arguments.length` enumerable in strict mode. + var result = (isArray(value) || isArguments(value)) + ? baseTimes(value.length, String) + : []; + + var length = result.length, + skipIndexes = !!length; + + for (var key in value) { + if ((inherited || hasOwnProperty.call(value, key)) && + !(skipIndexes && (key == 'length' || isIndex(key, length)))) { + result.push(key); + } + } + return result; +} + +/** + * Gets the index at which the `key` is found in `array` of key-value pairs. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} key The key to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + */ +function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq(array[length][0], key)) { + return length; + } + } + return -1; +} + +/** + * The base implementation of `_.forEach` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + */ +var baseEach = createBaseEach(baseForOwn); + +/** + * The base implementation of `_.flatten` with support for restricting flattening. + * + * @private + * @param {Array} array The array to flatten. + * @param {number} depth The maximum recursion depth. + * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. + * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. + * @param {Array} [result=[]] The initial result value. + * @returns {Array} Returns the new flattened array. + */ +function baseFlatten(array, depth, predicate, isStrict, result) { + var index = -1, + length = array.length; + + predicate || (predicate = isFlattenable); + result || (result = []); + + while (++index < length) { + var value = array[index]; + if (depth > 0 && predicate(value)) { + if (depth > 1) { + // Recursively flatten arrays (susceptible to call stack limits). + baseFlatten(value, depth - 1, predicate, isStrict, result); + } else { + arrayPush(result, value); + } + } else if (!isStrict) { + result[result.length] = value; + } + } + return result; +} + +/** + * The base implementation of `baseForOwn` which iterates over `object` + * properties returned by `keysFunc` and invokes `iteratee` for each property. + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ +var baseFor = createBaseFor(); + +/** + * The base implementation of `_.forOwn` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ +function baseForOwn(object, iteratee) { + return object && baseFor(object, iteratee, keys); +} + +/** + * The base implementation of `_.get` without support for default values. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @returns {*} Returns the resolved value. + */ +function baseGet(object, path) { + path = isKey(path, object) ? [path] : castPath(path); + + var index = 0, + length = path.length; + + while (object != null && index < length) { + object = object[toKey(path[index++])]; + } + return (index && index == length) ? object : undefined; +} + +/** + * The base implementation of `getTag`. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ +function baseGetTag(value) { + return objectToString.call(value); +} + +/** + * The base implementation of `_.hasIn` without support for deep paths. + * + * @private + * @param {Object} [object] The object to query. + * @param {Array|string} key The key to check. + * @returns {boolean} Returns `true` if `key` exists, else `false`. + */ +function baseHasIn(object, key) { + return object != null && key in Object(object); +} + +/** + * The base implementation of `_.isEqual` which supports partial comparisons + * and tracks traversed objects. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {Function} [customizer] The function to customize comparisons. + * @param {boolean} [bitmask] The bitmask of comparison flags. + * The bitmask may be composed of the following flags: + * 1 - Unordered comparison + * 2 - Partial comparison + * @param {Object} [stack] Tracks traversed `value` and `other` objects. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + */ +function baseIsEqual(value, other, customizer, bitmask, stack) { + if (value === other) { + return true; + } + if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) { + return value !== value && other !== other; + } + return baseIsEqualDeep(value, other, baseIsEqual, customizer, bitmask, stack); +} + +/** + * A specialized version of `baseIsEqual` for arrays and objects which performs + * deep comparisons and tracks traversed objects enabling objects with circular + * references to be compared. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Function} [customizer] The function to customize comparisons. + * @param {number} [bitmask] The bitmask of comparison flags. See `baseIsEqual` + * for more details. + * @param {Object} [stack] Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function baseIsEqualDeep(object, other, equalFunc, customizer, bitmask, stack) { + var objIsArr = isArray(object), + othIsArr = isArray(other), + objTag = arrayTag, + othTag = arrayTag; + + if (!objIsArr) { + objTag = getTag(object); + objTag = objTag == argsTag ? objectTag : objTag; + } + if (!othIsArr) { + othTag = getTag(other); + othTag = othTag == argsTag ? objectTag : othTag; + } + var objIsObj = objTag == objectTag && !isHostObject(object), + othIsObj = othTag == objectTag && !isHostObject(other), + isSameTag = objTag == othTag; + + if (isSameTag && !objIsObj) { + stack || (stack = new Stack); + return (objIsArr || isTypedArray(object)) + ? equalArrays(object, other, equalFunc, customizer, bitmask, stack) + : equalByTag(object, other, objTag, equalFunc, customizer, bitmask, stack); + } + if (!(bitmask & PARTIAL_COMPARE_FLAG)) { + var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), + othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); + + if (objIsWrapped || othIsWrapped) { + var objUnwrapped = objIsWrapped ? object.value() : object, + othUnwrapped = othIsWrapped ? other.value() : other; + + stack || (stack = new Stack); + return equalFunc(objUnwrapped, othUnwrapped, customizer, bitmask, stack); + } + } + if (!isSameTag) { + return false; + } + stack || (stack = new Stack); + return equalObjects(object, other, equalFunc, customizer, bitmask, stack); +} + +/** + * The base implementation of `_.isMatch` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @param {Array} matchData The property names, values, and compare flags to match. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + */ +function baseIsMatch(object, source, matchData, customizer) { + var index = matchData.length, + length = index, + noCustomizer = !customizer; + + if (object == null) { + return !length; + } + object = Object(object); + while (index--) { + var data = matchData[index]; + if ((noCustomizer && data[2]) + ? data[1] !== object[data[0]] + : !(data[0] in object) + ) { + return false; + } + } + while (++index < length) { + data = matchData[index]; + var key = data[0], + objValue = object[key], + srcValue = data[1]; + + if (noCustomizer && data[2]) { + if (objValue === undefined && !(key in object)) { + return false; + } + } else { + var stack = new Stack; + if (customizer) { + var result = customizer(objValue, srcValue, key, object, source, stack); + } + if (!(result === undefined + ? baseIsEqual(srcValue, objValue, customizer, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG, stack) + : result + )) { + return false; + } + } + } + return true; +} + +/** + * The base implementation of `_.isNative` without bad shim checks. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + */ +function baseIsNative(value) { + if (!isObject(value) || isMasked(value)) { + return false; + } + var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); +} + +/** + * The base implementation of `_.isTypedArray` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + */ +function baseIsTypedArray(value) { + return isObjectLike(value) && + isLength(value.length) && !!typedArrayTags[objectToString.call(value)]; +} + +/** + * The base implementation of `_.iteratee`. + * + * @private + * @param {*} [value=_.identity] The value to convert to an iteratee. + * @returns {Function} Returns the iteratee. + */ +function baseIteratee(value) { + // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9. + // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details. + if (typeof value == 'function') { + return value; + } + if (value == null) { + return identity; + } + if (typeof value == 'object') { + return isArray(value) + ? baseMatchesProperty(value[0], value[1]) + : baseMatches(value); + } + return property(value); +} + +/** + * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ +function baseKeys(object) { + if (!isPrototype(object)) { + return nativeKeys(object); + } + var result = []; + for (var key in Object(object)) { + if (hasOwnProperty.call(object, key) && key != 'constructor') { + result.push(key); + } + } + return result; +} + +/** + * The base implementation of `_.map` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ +function baseMap(collection, iteratee) { + var index = -1, + result = isArrayLike(collection) ? Array(collection.length) : []; + + baseEach(collection, function(value, key, collection) { + result[++index] = iteratee(value, key, collection); + }); + return result; +} + +/** + * The base implementation of `_.matches` which doesn't clone `source`. + * + * @private + * @param {Object} source The object of property values to match. + * @returns {Function} Returns the new spec function. + */ +function baseMatches(source) { + var matchData = getMatchData(source); + if (matchData.length == 1 && matchData[0][2]) { + return matchesStrictComparable(matchData[0][0], matchData[0][1]); + } + return function(object) { + return object === source || baseIsMatch(object, source, matchData); + }; +} + +/** + * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. + * + * @private + * @param {string} path The path of the property to get. + * @param {*} srcValue The value to match. + * @returns {Function} Returns the new spec function. + */ +function baseMatchesProperty(path, srcValue) { + if (isKey(path) && isStrictComparable(srcValue)) { + return matchesStrictComparable(toKey(path), srcValue); + } + return function(object) { + var objValue = get(object, path); + return (objValue === undefined && objValue === srcValue) + ? hasIn(object, path) + : baseIsEqual(srcValue, objValue, undefined, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG); + }; +} + +/** + * The base implementation of `_.orderBy` without param guards. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by. + * @param {string[]} orders The sort orders of `iteratees`. + * @returns {Array} Returns the new sorted array. + */ +function baseOrderBy(collection, iteratees, orders) { + var index = -1; + iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(baseIteratee)); + + var result = baseMap(collection, function(value, key, collection) { + var criteria = arrayMap(iteratees, function(iteratee) { + return iteratee(value); + }); + return { 'criteria': criteria, 'index': ++index, 'value': value }; + }); + + return baseSortBy(result, function(object, other) { + return compareMultiple(object, other, orders); + }); +} + +/** + * A specialized version of `baseProperty` which supports deep paths. + * + * @private + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new accessor function. + */ +function basePropertyDeep(path) { + return function(object) { + return baseGet(object, path); + }; +} + +/** + * The base implementation of `_.rest` which doesn't validate or coerce arguments. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + */ +function baseRest(func, start) { + start = nativeMax(start === undefined ? (func.length - 1) : start, 0); + return function() { + var args = arguments, + index = -1, + length = nativeMax(args.length - start, 0), + array = Array(length); + + while (++index < length) { + array[index] = args[start + index]; + } + index = -1; + var otherArgs = Array(start + 1); + while (++index < start) { + otherArgs[index] = args[index]; + } + otherArgs[start] = array; + return apply(func, this, otherArgs); + }; +} + +/** + * The base implementation of `_.toString` which doesn't convert nullish + * values to empty strings. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. + */ +function baseToString(value) { + // Exit early for strings to avoid a performance hit in some environments. + if (typeof value == 'string') { + return value; + } + if (isSymbol(value)) { + return symbolToString ? symbolToString.call(value) : ''; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; +} + +/** + * Casts `value` to a path array if it's not one. + * + * @private + * @param {*} value The value to inspect. + * @returns {Array} Returns the cast property path array. + */ +function castPath(value) { + return isArray(value) ? value : stringToPath(value); +} + +/** + * Compares values to sort them in ascending order. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {number} Returns the sort order indicator for `value`. + */ +function compareAscending(value, other) { + if (value !== other) { + var valIsDefined = value !== undefined, + valIsNull = value === null, + valIsReflexive = value === value, + valIsSymbol = isSymbol(value); + + var othIsDefined = other !== undefined, + othIsNull = other === null, + othIsReflexive = other === other, + othIsSymbol = isSymbol(other); + + if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) || + (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) || + (valIsNull && othIsDefined && othIsReflexive) || + (!valIsDefined && othIsReflexive) || + !valIsReflexive) { + return 1; + } + if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) || + (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) || + (othIsNull && valIsDefined && valIsReflexive) || + (!othIsDefined && valIsReflexive) || + !othIsReflexive) { + return -1; + } + } + return 0; +} + +/** + * Used by `_.orderBy` to compare multiple properties of a value to another + * and stable sort them. + * + * If `orders` is unspecified, all values are sorted in ascending order. Otherwise, + * specify an order of "desc" for descending or "asc" for ascending sort order + * of corresponding values. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {boolean[]|string[]} orders The order to sort by for each property. + * @returns {number} Returns the sort order indicator for `object`. + */ +function compareMultiple(object, other, orders) { + var index = -1, + objCriteria = object.criteria, + othCriteria = other.criteria, + length = objCriteria.length, + ordersLength = orders.length; + + while (++index < length) { + var result = compareAscending(objCriteria[index], othCriteria[index]); + if (result) { + if (index >= ordersLength) { + return result; + } + var order = orders[index]; + return result * (order == 'desc' ? -1 : 1); + } + } + // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications + // that causes it, under certain circumstances, to provide the same value for + // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247 + // for more details. + // + // This also ensures a stable sort in V8 and other engines. + // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details. + return object.index - other.index; +} + +/** + * Creates a `baseEach` or `baseEachRight` function. + * + * @private + * @param {Function} eachFunc The function to iterate over a collection. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ +function createBaseEach(eachFunc, fromRight) { + return function(collection, iteratee) { + if (collection == null) { + return collection; + } + if (!isArrayLike(collection)) { + return eachFunc(collection, iteratee); + } + var length = collection.length, + index = fromRight ? length : -1, + iterable = Object(collection); + + while ((fromRight ? index-- : ++index < length)) { + if (iteratee(iterable[index], index, iterable) === false) { + break; + } + } + return collection; + }; +} + +/** + * Creates a base function for methods like `_.forIn` and `_.forOwn`. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ +function createBaseFor(fromRight) { + return function(object, iteratee, keysFunc) { + var index = -1, + iterable = Object(object), + props = keysFunc(object), + length = props.length; + + while (length--) { + var key = props[fromRight ? length : ++index]; + if (iteratee(iterable[key], key, iterable) === false) { + break; + } + } + return object; + }; +} + +/** + * A specialized version of `baseIsEqualDeep` for arrays with support for + * partial deep comparisons. + * + * @private + * @param {Array} array The array to compare. + * @param {Array} other The other array to compare. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Function} customizer The function to customize comparisons. + * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual` + * for more details. + * @param {Object} stack Tracks traversed `array` and `other` objects. + * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. + */ +function equalArrays(array, other, equalFunc, customizer, bitmask, stack) { + var isPartial = bitmask & PARTIAL_COMPARE_FLAG, + arrLength = array.length, + othLength = other.length; + + if (arrLength != othLength && !(isPartial && othLength > arrLength)) { + return false; + } + // Assume cyclic values are equal. + var stacked = stack.get(array); + if (stacked && stack.get(other)) { + return stacked == other; + } + var index = -1, + result = true, + seen = (bitmask & UNORDERED_COMPARE_FLAG) ? new SetCache : undefined; + + stack.set(array, other); + stack.set(other, array); + + // Ignore non-index properties. + while (++index < arrLength) { + var arrValue = array[index], + othValue = other[index]; + + if (customizer) { + var compared = isPartial + ? customizer(othValue, arrValue, index, other, array, stack) + : customizer(arrValue, othValue, index, array, other, stack); + } + if (compared !== undefined) { + if (compared) { + continue; + } + result = false; + break; + } + // Recursively compare arrays (susceptible to call stack limits). + if (seen) { + if (!arraySome(other, function(othValue, othIndex) { + if (!seen.has(othIndex) && + (arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack))) { + return seen.add(othIndex); + } + })) { + result = false; + break; + } + } else if (!( + arrValue === othValue || + equalFunc(arrValue, othValue, customizer, bitmask, stack) + )) { + result = false; + break; + } + } + stack['delete'](array); + stack['delete'](other); + return result; +} + +/** + * A specialized version of `baseIsEqualDeep` for comparing objects of + * the same `toStringTag`. + * + * **Note:** This function only supports comparing values with tags of + * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {string} tag The `toStringTag` of the objects to compare. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Function} customizer The function to customize comparisons. + * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual` + * for more details. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function equalByTag(object, other, tag, equalFunc, customizer, bitmask, stack) { + switch (tag) { + case dataViewTag: + if ((object.byteLength != other.byteLength) || + (object.byteOffset != other.byteOffset)) { + return false; + } + object = object.buffer; + other = other.buffer; + + case arrayBufferTag: + if ((object.byteLength != other.byteLength) || + !equalFunc(new Uint8Array(object), new Uint8Array(other))) { + return false; + } + return true; + + case boolTag: + case dateTag: + case numberTag: + // Coerce booleans to `1` or `0` and dates to milliseconds. + // Invalid dates are coerced to `NaN`. + return eq(+object, +other); + + case errorTag: + return object.name == other.name && object.message == other.message; + + case regexpTag: + case stringTag: + // Coerce regexes to strings and treat strings, primitives and objects, + // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring + // for more details. + return object == (other + ''); + + case mapTag: + var convert = mapToArray; + + case setTag: + var isPartial = bitmask & PARTIAL_COMPARE_FLAG; + convert || (convert = setToArray); + + if (object.size != other.size && !isPartial) { + return false; + } + // Assume cyclic values are equal. + var stacked = stack.get(object); + if (stacked) { + return stacked == other; + } + bitmask |= UNORDERED_COMPARE_FLAG; + + // Recursively compare objects (susceptible to call stack limits). + stack.set(object, other); + var result = equalArrays(convert(object), convert(other), equalFunc, customizer, bitmask, stack); + stack['delete'](object); + return result; + + case symbolTag: + if (symbolValueOf) { + return symbolValueOf.call(object) == symbolValueOf.call(other); + } + } + return false; +} + +/** + * A specialized version of `baseIsEqualDeep` for objects with support for + * partial deep comparisons. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Function} customizer The function to customize comparisons. + * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual` + * for more details. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function equalObjects(object, other, equalFunc, customizer, bitmask, stack) { + var isPartial = bitmask & PARTIAL_COMPARE_FLAG, + objProps = keys(object), + objLength = objProps.length, + othProps = keys(other), + othLength = othProps.length; + + if (objLength != othLength && !isPartial) { + return false; + } + var index = objLength; + while (index--) { + var key = objProps[index]; + if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) { + return false; + } + } + // Assume cyclic values are equal. + var stacked = stack.get(object); + if (stacked && stack.get(other)) { + return stacked == other; + } + var result = true; + stack.set(object, other); + stack.set(other, object); + + var skipCtor = isPartial; + while (++index < objLength) { + key = objProps[index]; + var objValue = object[key], + othValue = other[key]; + + if (customizer) { + var compared = isPartial + ? customizer(othValue, objValue, key, other, object, stack) + : customizer(objValue, othValue, key, object, other, stack); + } + // Recursively compare objects (susceptible to call stack limits). + if (!(compared === undefined + ? (objValue === othValue || equalFunc(objValue, othValue, customizer, bitmask, stack)) + : compared + )) { + result = false; + break; + } + skipCtor || (skipCtor = key == 'constructor'); + } + if (result && !skipCtor) { + var objCtor = object.constructor, + othCtor = other.constructor; + + // Non `Object` object instances with different constructors are not equal. + if (objCtor != othCtor && + ('constructor' in object && 'constructor' in other) && + !(typeof objCtor == 'function' && objCtor instanceof objCtor && + typeof othCtor == 'function' && othCtor instanceof othCtor)) { + result = false; + } + } + stack['delete'](object); + stack['delete'](other); + return result; +} + +/** + * Gets the data for `map`. + * + * @private + * @param {Object} map The map to query. + * @param {string} key The reference key. + * @returns {*} Returns the map data. + */ +function getMapData(map, key) { + var data = map.__data__; + return isKeyable(key) + ? data[typeof key == 'string' ? 'string' : 'hash'] + : data.map; +} + +/** + * Gets the property names, values, and compare flags of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the match data of `object`. + */ +function getMatchData(object) { + var result = keys(object), + length = result.length; + + while (length--) { + var key = result[length], + value = object[key]; + + result[length] = [key, value, isStrictComparable(value)]; + } + return result; +} + +/** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ +function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined; +} + +/** + * Gets the `toStringTag` of `value`. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ +var getTag = baseGetTag; + +// Fallback for data views, maps, sets, and weak maps in IE 11, +// for data views in Edge < 14, and promises in Node.js. +if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) || + (Map && getTag(new Map) != mapTag) || + (Promise && getTag(Promise.resolve()) != promiseTag) || + (Set && getTag(new Set) != setTag) || + (WeakMap && getTag(new WeakMap) != weakMapTag)) { + getTag = function(value) { + var result = objectToString.call(value), + Ctor = result == objectTag ? value.constructor : undefined, + ctorString = Ctor ? toSource(Ctor) : undefined; + + if (ctorString) { + switch (ctorString) { + case dataViewCtorString: return dataViewTag; + case mapCtorString: return mapTag; + case promiseCtorString: return promiseTag; + case setCtorString: return setTag; + case weakMapCtorString: return weakMapTag; + } + } + return result; + }; +} + +/** + * Checks if `path` exists on `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @param {Function} hasFunc The function to check properties. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + */ +function hasPath(object, path, hasFunc) { + path = isKey(path, object) ? [path] : castPath(path); + + var result, + index = -1, + length = path.length; + + while (++index < length) { + var key = toKey(path[index]); + if (!(result = object != null && hasFunc(object, key))) { + break; + } + object = object[key]; + } + if (result) { + return result; + } + var length = object ? object.length : 0; + return !!length && isLength(length) && isIndex(key, length) && + (isArray(object) || isArguments(object)); +} + +/** + * Checks if `value` is a flattenable `arguments` object or array. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. + */ +function isFlattenable(value) { + return isArray(value) || isArguments(value) || + !!(spreadableSymbol && value && value[spreadableSymbol]); +} + +/** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ +function isIndex(value, length) { + length = length == null ? MAX_SAFE_INTEGER : length; + return !!length && + (typeof value == 'number' || reIsUint.test(value)) && + (value > -1 && value % 1 == 0 && value < length); +} + +/** + * Checks if the given arguments are from an iteratee call. + * + * @private + * @param {*} value The potential iteratee value argument. + * @param {*} index The potential iteratee index or key argument. + * @param {*} object The potential iteratee object argument. + * @returns {boolean} Returns `true` if the arguments are from an iteratee call, + * else `false`. + */ +function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; + } + var type = typeof index; + if (type == 'number' + ? (isArrayLike(object) && isIndex(index, object.length)) + : (type == 'string' && index in object) + ) { + return eq(object[index], value); + } + return false; +} + +/** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ +function isKey(value, object) { + if (isArray(value)) { + return false; + } + var type = typeof value; + if (type == 'number' || type == 'symbol' || type == 'boolean' || + value == null || isSymbol(value)) { + return true; + } + return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || + (object != null && value in Object(object)); +} + +/** + * Checks if `value` is suitable for use as unique object key. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is suitable, else `false`. + */ +function isKeyable(value) { + var type = typeof value; + return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') + ? (value !== '__proto__') + : (value === null); +} + +/** + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. + */ +function isMasked(func) { + return !!maskSrcKey && (maskSrcKey in func); +} + +/** + * Checks if `value` is likely a prototype object. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. + */ +function isPrototype(value) { + var Ctor = value && value.constructor, + proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; + + return value === proto; +} + +/** + * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` if suitable for strict + * equality comparisons, else `false`. + */ +function isStrictComparable(value) { + return value === value && !isObject(value); +} + +/** + * A specialized version of `matchesProperty` for source values suitable + * for strict equality comparisons, i.e. `===`. + * + * @private + * @param {string} key The key of the property to get. + * @param {*} srcValue The value to match. + * @returns {Function} Returns the new spec function. + */ +function matchesStrictComparable(key, srcValue) { + return function(object) { + if (object == null) { + return false; + } + return object[key] === srcValue && + (srcValue !== undefined || (key in Object(object))); + }; +} + +/** + * Converts `string` to a property path array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the property path array. + */ +var stringToPath = memoize(function(string) { + string = toString(string); + + var result = []; + if (reLeadingDot.test(string)) { + result.push(''); + } + string.replace(rePropName, function(match, number, quote, string) { + result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; +}); + +/** + * Converts `value` to a string key if it's not a string or symbol. + * + * @private + * @param {*} value The value to inspect. + * @returns {string|symbol} Returns the key. + */ +function toKey(value) { + if (typeof value == 'string' || isSymbol(value)) { + return value; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; +} + +/** + * Converts `func` to its source code. + * + * @private + * @param {Function} func The function to process. + * @returns {string} Returns the source code. + */ +function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) {} + try { + return (func + ''); + } catch (e) {} + } + return ''; +} + +/** + * Creates an array of elements, sorted in ascending order by the results of + * running each element in a collection thru each iteratee. This method + * performs a stable sort, that is, it preserves the original sort order of + * equal elements. The iteratees are invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {...(Function|Function[])} [iteratees=[_.identity]] + * The iteratees to sort by. + * @returns {Array} Returns the new sorted array. + * @example + * + * var users = [ + * { 'user': 'fred', 'age': 48 }, + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 }, + * { 'user': 'barney', 'age': 34 } + * ]; + * + * _.sortBy(users, function(o) { return o.user; }); + * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]] + * + * _.sortBy(users, ['user', 'age']); + * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]] + * + * _.sortBy(users, 'user', function(o) { + * return Math.floor(o.age / 10); + * }); + * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]] + */ +var sortBy = baseRest(function(collection, iteratees) { + if (collection == null) { + return []; + } + var length = iteratees.length; + if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) { + iteratees = []; + } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) { + iteratees = [iteratees[0]]; + } + return baseOrderBy(collection, baseFlatten(iteratees, 1), []); +}); + +/** + * Creates a function that memoizes the result of `func`. If `resolver` is + * provided, it determines the cache key for storing the result based on the + * arguments provided to the memoized function. By default, the first argument + * provided to the memoized function is used as the map cache key. The `func` + * is invoked with the `this` binding of the memoized function. + * + * **Note:** The cache is exposed as the `cache` property on the memoized + * function. Its creation may be customized by replacing the `_.memoize.Cache` + * constructor with one whose instances implement the + * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) + * method interface of `delete`, `get`, `has`, and `set`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to have its output memoized. + * @param {Function} [resolver] The function to resolve the cache key. + * @returns {Function} Returns the new memoized function. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * var other = { 'c': 3, 'd': 4 }; + * + * var values = _.memoize(_.values); + * values(object); + * // => [1, 2] + * + * values(other); + * // => [3, 4] + * + * object.a = 2; + * values(object); + * // => [1, 2] + * + * // Modify the result cache. + * values.cache.set(object, ['a', 'b']); + * values(object); + * // => ['a', 'b'] + * + * // Replace `_.memoize.Cache`. + * _.memoize.Cache = WeakMap; + */ +function memoize(func, resolver) { + if (typeof func != 'function' || (resolver && typeof resolver != 'function')) { + throw new TypeError(FUNC_ERROR_TEXT); + } + var memoized = function() { + var args = arguments, + key = resolver ? resolver.apply(this, args) : args[0], + cache = memoized.cache; + + if (cache.has(key)) { + return cache.get(key); + } + var result = func.apply(this, args); + memoized.cache = cache.set(key, result); + return result; + }; + memoized.cache = new (memoize.Cache || MapCache); + return memoized; +} + +// Assign cache to `_.memoize`. +memoize.Cache = MapCache; + +/** + * Performs a + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * comparison between two values to determine if they are equivalent. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.eq(object, object); + * // => true + * + * _.eq(object, other); + * // => false + * + * _.eq('a', 'a'); + * // => true + * + * _.eq('a', Object('a')); + * // => false + * + * _.eq(NaN, NaN); + * // => true + */ +function eq(value, other) { + return value === other || (value !== value && other !== other); +} + +/** + * Checks if `value` is likely an `arguments` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + * else `false`. + * @example + * + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ +function isArguments(value) { + // Safari 8.1 makes `arguments.callee` enumerable in strict mode. + return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') && + (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag); +} + +/** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ +var isArray = Array.isArray; + +/** + * Checks if `value` is array-like. A value is considered array-like if it's + * not a function and has a `value.length` that's an integer greater than or + * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + * @example + * + * _.isArrayLike([1, 2, 3]); + * // => true + * + * _.isArrayLike(document.body.children); + * // => true + * + * _.isArrayLike('abc'); + * // => true + * + * _.isArrayLike(_.noop); + * // => false + */ +function isArrayLike(value) { + return value != null && isLength(value.length) && !isFunction(value); +} + +/** + * This method is like `_.isArrayLike` except that it also checks if `value` + * is an object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array-like object, + * else `false`. + * @example + * + * _.isArrayLikeObject([1, 2, 3]); + * // => true + * + * _.isArrayLikeObject(document.body.children); + * // => true + * + * _.isArrayLikeObject('abc'); + * // => false + * + * _.isArrayLikeObject(_.noop); + * // => false + */ +function isArrayLikeObject(value) { + return isObjectLike(value) && isArrayLike(value); +} + +/** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ +function isFunction(value) { + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 8-9 which returns 'object' for typed array and other constructors. + var tag = isObject(value) ? objectToString.call(value) : ''; + return tag == funcTag || tag == genTag; +} + +/** + * Checks if `value` is a valid array-like length. + * + * **Note:** This method is loosely based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + * @example + * + * _.isLength(3); + * // => true + * + * _.isLength(Number.MIN_VALUE); + * // => false + * + * _.isLength(Infinity); + * // => false + * + * _.isLength('3'); + * // => false + */ +function isLength(value) { + return typeof value == 'number' && + value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; +} + +/** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ +function isObject(value) { + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} + +/** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ +function isObjectLike(value) { + return !!value && typeof value == 'object'; +} + +/** + * Checks if `value` is classified as a `Symbol` primitive or object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. + * @example + * + * _.isSymbol(Symbol.iterator); + * // => true + * + * _.isSymbol('abc'); + * // => false + */ +function isSymbol(value) { + return typeof value == 'symbol' || + (isObjectLike(value) && objectToString.call(value) == symbolTag); +} + +/** + * Checks if `value` is classified as a typed array. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + * @example + * + * _.isTypedArray(new Uint8Array); + * // => true + * + * _.isTypedArray([]); + * // => false + */ +var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; + +/** + * Converts `value` to a string. An empty string is returned for `null` + * and `undefined` values. The sign of `-0` is preserved. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to process. + * @returns {string} Returns the string. + * @example + * + * _.toString(null); + * // => '' + * + * _.toString(-0); + * // => '-0' + * + * _.toString([1, 2, 3]); + * // => '1,2,3' + */ +function toString(value) { + return value == null ? '' : baseToString(value); +} + +/** + * Gets the value at `path` of `object`. If the resolved value is + * `undefined`, the `defaultValue` is returned in its place. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.get(object, 'a[0].b.c'); + * // => 3 + * + * _.get(object, ['a', '0', 'b', 'c']); + * // => 3 + * + * _.get(object, 'a.b.c', 'default'); + * // => 'default' + */ +function get(object, path, defaultValue) { + var result = object == null ? undefined : baseGet(object, path); + return result === undefined ? defaultValue : result; +} + +/** + * Checks if `path` is a direct or inherited property of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + * @example + * + * var object = _.create({ 'a': _.create({ 'b': 2 }) }); + * + * _.hasIn(object, 'a'); + * // => true + * + * _.hasIn(object, 'a.b'); + * // => true + * + * _.hasIn(object, ['a', 'b']); + * // => true + * + * _.hasIn(object, 'b'); + * // => false + */ +function hasIn(object, path) { + return object != null && hasPath(object, path, baseHasIn); +} + +/** + * Creates an array of the own enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. See the + * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * for more details. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keys(new Foo); + * // => ['a', 'b'] (iteration order is not guaranteed) + * + * _.keys('hi'); + * // => ['0', '1'] + */ +function keys(object) { + return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); +} + +/** + * This method returns the first argument it receives. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Util + * @param {*} value Any value. + * @returns {*} Returns `value`. + * @example + * + * var object = { 'a': 1 }; + * + * console.log(_.identity(object) === object); + * // => true + */ +function identity(value) { + return value; +} + +/** + * Creates a function that returns the value at `path` of a given object. + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Util + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new accessor function. + * @example + * + * var objects = [ + * { 'a': { 'b': 2 } }, + * { 'a': { 'b': 1 } } + * ]; + * + * _.map(objects, _.property('a.b')); + * // => [2, 1] + * + * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b'); + * // => [1, 2] + */ +function property(path) { + return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path); +} + +module.exports = sortBy; diff --git a/node_modules/lodash.sortby/package.json b/node_modules/lodash.sortby/package.json new file mode 100644 index 00000000..bfe6985e --- /dev/null +++ b/node_modules/lodash.sortby/package.json @@ -0,0 +1,17 @@ +{ + "name": "lodash.sortby", + "version": "4.7.0", + "description": "The lodash method `_.sortBy` exported as a module.", + "homepage": "https://lodash.com/", + "icon": "https://lodash.com/icon.svg", + "license": "MIT", + "keywords": "lodash-modularized, sortby", + "author": "John-David Dalton (http://allyoucanleet.com/)", + "contributors": [ + "John-David Dalton (http://allyoucanleet.com/)", + "Blaine Bublitz (https://github.com/phated)", + "Mathias Bynens (https://mathiasbynens.be/)" + ], + "repository": "lodash/lodash", + "scripts": { "test": "echo \"See https://travis-ci.org/lodash/lodash-cli for testing details.\"" } +} diff --git a/node_modules/lower-case/LICENSE b/node_modules/lower-case/LICENSE new file mode 100644 index 00000000..983fbe8a --- /dev/null +++ b/node_modules/lower-case/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/lower-case/README.md b/node_modules/lower-case/README.md new file mode 100644 index 00000000..18bf9002 --- /dev/null +++ b/node_modules/lower-case/README.md @@ -0,0 +1,35 @@ +# Lower Case + +[![NPM version][npm-image]][npm-url] +[![NPM downloads][downloads-image]][downloads-url] +[![Bundle size][bundlephobia-image]][bundlephobia-url] + +> Transforms the string to lower case. + +## Installation + +``` +npm install lower-case --save +``` + +## Usage + +```js +import { lowerCase, localeLowerCase } from "lower-case"; + +lowerCase("string"); //=> "string" +lowerCase("PascalCase"); //=> "pascalcase" + +localeLowerCase("STRING", "tr"); //=> "strıng" +``` + +## License + +MIT + +[npm-image]: https://img.shields.io/npm/v/lower-case.svg?style=flat +[npm-url]: https://npmjs.org/package/lower-case +[downloads-image]: https://img.shields.io/npm/dm/lower-case.svg?style=flat +[downloads-url]: https://npmjs.org/package/lower-case +[bundlephobia-image]: https://img.shields.io/bundlephobia/minzip/lower-case.svg +[bundlephobia-url]: https://bundlephobia.com/result?p=lower-case diff --git a/node_modules/lower-case/dist.es2015/index.d.ts b/node_modules/lower-case/dist.es2015/index.d.ts new file mode 100644 index 00000000..d563e2f9 --- /dev/null +++ b/node_modules/lower-case/dist.es2015/index.d.ts @@ -0,0 +1,8 @@ +/** + * Localized lower case. + */ +export declare function localeLowerCase(str: string, locale: string): string; +/** + * Lower case as a function. + */ +export declare function lowerCase(str: string): string; diff --git a/node_modules/lower-case/dist.es2015/index.js b/node_modules/lower-case/dist.es2015/index.js new file mode 100644 index 00000000..2be99779 --- /dev/null +++ b/node_modules/lower-case/dist.es2015/index.js @@ -0,0 +1,48 @@ +/** + * Source: ftp://ftp.unicode.org/Public/UCD/latest/ucd/SpecialCasing.txt + */ +var SUPPORTED_LOCALE = { + tr: { + regexp: /\u0130|\u0049|\u0049\u0307/g, + map: { + İ: "\u0069", + I: "\u0131", + İ: "\u0069", + }, + }, + az: { + regexp: /\u0130/g, + map: { + İ: "\u0069", + I: "\u0131", + İ: "\u0069", + }, + }, + lt: { + regexp: /\u0049|\u004A|\u012E|\u00CC|\u00CD|\u0128/g, + map: { + I: "\u0069\u0307", + J: "\u006A\u0307", + Į: "\u012F\u0307", + Ì: "\u0069\u0307\u0300", + Í: "\u0069\u0307\u0301", + Ĩ: "\u0069\u0307\u0303", + }, + }, +}; +/** + * Localized lower case. + */ +export function localeLowerCase(str, locale) { + var lang = SUPPORTED_LOCALE[locale.toLowerCase()]; + if (lang) + return lowerCase(str.replace(lang.regexp, function (m) { return lang.map[m]; })); + return lowerCase(str); +} +/** + * Lower case as a function. + */ +export function lowerCase(str) { + return str.toLowerCase(); +} +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/lower-case/dist.es2015/index.js.map b/node_modules/lower-case/dist.es2015/index.js.map new file mode 100644 index 00000000..73fb240c --- /dev/null +++ b/node_modules/lower-case/dist.es2015/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,IAAM,gBAAgB,GAA2B;IAC/C,EAAE,EAAE;QACF,MAAM,EAAE,6BAA6B;QACrC,GAAG,EAAE;YACH,CAAC,EAAE,QAAQ;YACX,CAAC,EAAE,QAAQ;YACX,EAAE,EAAE,QAAQ;SACb;KACF;IACD,EAAE,EAAE;QACF,MAAM,EAAE,SAAS;QACjB,GAAG,EAAE;YACH,CAAC,EAAE,QAAQ;YACX,CAAC,EAAE,QAAQ;YACX,EAAE,EAAE,QAAQ;SACb;KACF;IACD,EAAE,EAAE;QACF,MAAM,EAAE,4CAA4C;QACpD,GAAG,EAAE;YACH,CAAC,EAAE,cAAc;YACjB,CAAC,EAAE,cAAc;YACjB,CAAC,EAAE,cAAc;YACjB,CAAC,EAAE,oBAAoB;YACvB,CAAC,EAAE,oBAAoB;YACvB,CAAC,EAAE,oBAAoB;SACxB;KACF;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,MAAc;IACzD,IAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IACpD,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,UAAC,CAAC,IAAK,OAAA,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAX,CAAW,CAAC,CAAC,CAAC;IACzE,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC;AAC3B,CAAC","sourcesContent":["/**\n * Locale character mapping rules.\n */\ninterface Locale {\n regexp: RegExp;\n map: Record;\n}\n\n/**\n * Source: ftp://ftp.unicode.org/Public/UCD/latest/ucd/SpecialCasing.txt\n */\nconst SUPPORTED_LOCALE: Record = {\n tr: {\n regexp: /\\u0130|\\u0049|\\u0049\\u0307/g,\n map: {\n İ: \"\\u0069\",\n I: \"\\u0131\",\n İ: \"\\u0069\",\n },\n },\n az: {\n regexp: /\\u0130/g,\n map: {\n İ: \"\\u0069\",\n I: \"\\u0131\",\n İ: \"\\u0069\",\n },\n },\n lt: {\n regexp: /\\u0049|\\u004A|\\u012E|\\u00CC|\\u00CD|\\u0128/g,\n map: {\n I: \"\\u0069\\u0307\",\n J: \"\\u006A\\u0307\",\n Į: \"\\u012F\\u0307\",\n Ì: \"\\u0069\\u0307\\u0300\",\n Í: \"\\u0069\\u0307\\u0301\",\n Ĩ: \"\\u0069\\u0307\\u0303\",\n },\n },\n};\n\n/**\n * Localized lower case.\n */\nexport function localeLowerCase(str: string, locale: string) {\n const lang = SUPPORTED_LOCALE[locale.toLowerCase()];\n if (lang) return lowerCase(str.replace(lang.regexp, (m) => lang.map[m]));\n return lowerCase(str);\n}\n\n/**\n * Lower case as a function.\n */\nexport function lowerCase(str: string) {\n return str.toLowerCase();\n}\n"]} \ No newline at end of file diff --git a/node_modules/lower-case/dist.es2015/index.spec.d.ts b/node_modules/lower-case/dist.es2015/index.spec.d.ts new file mode 100644 index 00000000..cb0ff5c3 --- /dev/null +++ b/node_modules/lower-case/dist.es2015/index.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/lower-case/dist.es2015/index.spec.js b/node_modules/lower-case/dist.es2015/index.spec.js new file mode 100644 index 00000000..1211f742 --- /dev/null +++ b/node_modules/lower-case/dist.es2015/index.spec.js @@ -0,0 +1,34 @@ +import { lowerCase, localeLowerCase } from "."; +var TEST_CASES = [ + ["", ""], + ["test", "test"], + ["TEST", "test"], + ["test string", "test string"], + ["TEST STRING", "test string"], +]; +var LOCALE_TEST_CASES = [ + ["STRING", "strıng", "tr"], +]; +describe("lower case", function () { + var _loop_1 = function (input, result) { + it(input + " -> " + result, function () { + expect(lowerCase(input)).toEqual(result); + }); + }; + for (var _i = 0, TEST_CASES_1 = TEST_CASES; _i < TEST_CASES_1.length; _i++) { + var _a = TEST_CASES_1[_i], input = _a[0], result = _a[1]; + _loop_1(input, result); + } +}); +describe("locale lower case", function () { + var _loop_2 = function (input, result, locale) { + it(locale + ": " + input + " -> " + result, function () { + expect(localeLowerCase(input, locale)).toEqual(result); + }); + }; + for (var _i = 0, LOCALE_TEST_CASES_1 = LOCALE_TEST_CASES; _i < LOCALE_TEST_CASES_1.length; _i++) { + var _a = LOCALE_TEST_CASES_1[_i], input = _a[0], result = _a[1], locale = _a[2]; + _loop_2(input, result, locale); + } +}); +//# sourceMappingURL=index.spec.js.map \ No newline at end of file diff --git a/node_modules/lower-case/dist.es2015/index.spec.js.map b/node_modules/lower-case/dist.es2015/index.spec.js.map new file mode 100644 index 00000000..0639121e --- /dev/null +++ b/node_modules/lower-case/dist.es2015/index.spec.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.spec.js","sourceRoot":"","sources":["../src/index.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,GAAG,CAAC;AAE/C,IAAM,UAAU,GAAuB;IACrC,CAAC,EAAE,EAAE,EAAE,CAAC;IACR,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,aAAa,EAAE,aAAa,CAAC;IAC9B,CAAC,aAAa,EAAE,aAAa,CAAC;CAC/B,CAAC;AAEF,IAAM,iBAAiB,GAA+B;IACpD,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC;CAC3B,CAAC;AAEF,QAAQ,CAAC,YAAY,EAAE;4BACT,KAAK,EAAE,MAAM;QACvB,EAAE,CAAI,KAAK,YAAO,MAAQ,EAAE;YAC1B,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;;IAHL,KAA8B,UAAU,EAAV,yBAAU,EAAV,wBAAU,EAAV,IAAU;QAA7B,IAAA,qBAAe,EAAd,KAAK,QAAA,EAAE,MAAM,QAAA;gBAAb,KAAK,EAAE,MAAM;KAIxB;AACH,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE;4BAChB,KAAK,EAAE,MAAM,EAAE,MAAM;QAC/B,EAAE,CAAI,MAAM,UAAK,KAAK,YAAO,MAAQ,EAAE;YACrC,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;;IAHL,KAAsC,UAAiB,EAAjB,uCAAiB,EAAjB,+BAAiB,EAAjB,IAAiB;QAA5C,IAAA,4BAAuB,EAAtB,KAAK,QAAA,EAAE,MAAM,QAAA,EAAE,MAAM,QAAA;gBAArB,KAAK,EAAE,MAAM,EAAE,MAAM;KAIhC;AACH,CAAC,CAAC,CAAC","sourcesContent":["import { lowerCase, localeLowerCase } from \".\";\n\nconst TEST_CASES: [string, string][] = [\n [\"\", \"\"],\n [\"test\", \"test\"],\n [\"TEST\", \"test\"],\n [\"test string\", \"test string\"],\n [\"TEST STRING\", \"test string\"],\n];\n\nconst LOCALE_TEST_CASES: [string, string, string][] = [\n [\"STRING\", \"strıng\", \"tr\"],\n];\n\ndescribe(\"lower case\", () => {\n for (const [input, result] of TEST_CASES) {\n it(`${input} -> ${result}`, () => {\n expect(lowerCase(input)).toEqual(result);\n });\n }\n});\n\ndescribe(\"locale lower case\", () => {\n for (const [input, result, locale] of LOCALE_TEST_CASES) {\n it(`${locale}: ${input} -> ${result}`, () => {\n expect(localeLowerCase(input, locale)).toEqual(result);\n });\n }\n});\n"]} \ No newline at end of file diff --git a/node_modules/lower-case/dist/index.d.ts b/node_modules/lower-case/dist/index.d.ts new file mode 100644 index 00000000..d563e2f9 --- /dev/null +++ b/node_modules/lower-case/dist/index.d.ts @@ -0,0 +1,8 @@ +/** + * Localized lower case. + */ +export declare function localeLowerCase(str: string, locale: string): string; +/** + * Lower case as a function. + */ +export declare function lowerCase(str: string): string; diff --git a/node_modules/lower-case/dist/index.js b/node_modules/lower-case/dist/index.js new file mode 100644 index 00000000..8494b1c6 --- /dev/null +++ b/node_modules/lower-case/dist/index.js @@ -0,0 +1,53 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.lowerCase = exports.localeLowerCase = void 0; +/** + * Source: ftp://ftp.unicode.org/Public/UCD/latest/ucd/SpecialCasing.txt + */ +var SUPPORTED_LOCALE = { + tr: { + regexp: /\u0130|\u0049|\u0049\u0307/g, + map: { + İ: "\u0069", + I: "\u0131", + İ: "\u0069", + }, + }, + az: { + regexp: /\u0130/g, + map: { + İ: "\u0069", + I: "\u0131", + İ: "\u0069", + }, + }, + lt: { + regexp: /\u0049|\u004A|\u012E|\u00CC|\u00CD|\u0128/g, + map: { + I: "\u0069\u0307", + J: "\u006A\u0307", + Į: "\u012F\u0307", + Ì: "\u0069\u0307\u0300", + Í: "\u0069\u0307\u0301", + Ĩ: "\u0069\u0307\u0303", + }, + }, +}; +/** + * Localized lower case. + */ +function localeLowerCase(str, locale) { + var lang = SUPPORTED_LOCALE[locale.toLowerCase()]; + if (lang) + return lowerCase(str.replace(lang.regexp, function (m) { return lang.map[m]; })); + return lowerCase(str); +} +exports.localeLowerCase = localeLowerCase; +/** + * Lower case as a function. + */ +function lowerCase(str) { + return str.toLowerCase(); +} +exports.lowerCase = lowerCase; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/lower-case/dist/index.js.map b/node_modules/lower-case/dist/index.js.map new file mode 100644 index 00000000..974aeecd --- /dev/null +++ b/node_modules/lower-case/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAQA;;GAEG;AACH,IAAM,gBAAgB,GAA2B;IAC/C,EAAE,EAAE;QACF,MAAM,EAAE,6BAA6B;QACrC,GAAG,EAAE;YACH,CAAC,EAAE,QAAQ;YACX,CAAC,EAAE,QAAQ;YACX,EAAE,EAAE,QAAQ;SACb;KACF;IACD,EAAE,EAAE;QACF,MAAM,EAAE,SAAS;QACjB,GAAG,EAAE;YACH,CAAC,EAAE,QAAQ;YACX,CAAC,EAAE,QAAQ;YACX,EAAE,EAAE,QAAQ;SACb;KACF;IACD,EAAE,EAAE;QACF,MAAM,EAAE,4CAA4C;QACpD,GAAG,EAAE;YACH,CAAC,EAAE,cAAc;YACjB,CAAC,EAAE,cAAc;YACjB,CAAC,EAAE,cAAc;YACjB,CAAC,EAAE,oBAAoB;YACvB,CAAC,EAAE,oBAAoB;YACvB,CAAC,EAAE,oBAAoB;SACxB;KACF;CACF,CAAC;AAEF;;GAEG;AACH,SAAgB,eAAe,CAAC,GAAW,EAAE,MAAc;IACzD,IAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IACpD,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,UAAC,CAAC,IAAK,OAAA,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAX,CAAW,CAAC,CAAC,CAAC;IACzE,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC;AAJD,0CAIC;AAED;;GAEG;AACH,SAAgB,SAAS,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC;AAC3B,CAAC;AAFD,8BAEC","sourcesContent":["/**\n * Locale character mapping rules.\n */\ninterface Locale {\n regexp: RegExp;\n map: Record;\n}\n\n/**\n * Source: ftp://ftp.unicode.org/Public/UCD/latest/ucd/SpecialCasing.txt\n */\nconst SUPPORTED_LOCALE: Record = {\n tr: {\n regexp: /\\u0130|\\u0049|\\u0049\\u0307/g,\n map: {\n İ: \"\\u0069\",\n I: \"\\u0131\",\n İ: \"\\u0069\",\n },\n },\n az: {\n regexp: /\\u0130/g,\n map: {\n İ: \"\\u0069\",\n I: \"\\u0131\",\n İ: \"\\u0069\",\n },\n },\n lt: {\n regexp: /\\u0049|\\u004A|\\u012E|\\u00CC|\\u00CD|\\u0128/g,\n map: {\n I: \"\\u0069\\u0307\",\n J: \"\\u006A\\u0307\",\n Į: \"\\u012F\\u0307\",\n Ì: \"\\u0069\\u0307\\u0300\",\n Í: \"\\u0069\\u0307\\u0301\",\n Ĩ: \"\\u0069\\u0307\\u0303\",\n },\n },\n};\n\n/**\n * Localized lower case.\n */\nexport function localeLowerCase(str: string, locale: string) {\n const lang = SUPPORTED_LOCALE[locale.toLowerCase()];\n if (lang) return lowerCase(str.replace(lang.regexp, (m) => lang.map[m]));\n return lowerCase(str);\n}\n\n/**\n * Lower case as a function.\n */\nexport function lowerCase(str: string) {\n return str.toLowerCase();\n}\n"]} \ No newline at end of file diff --git a/node_modules/lower-case/dist/index.spec.d.ts b/node_modules/lower-case/dist/index.spec.d.ts new file mode 100644 index 00000000..cb0ff5c3 --- /dev/null +++ b/node_modules/lower-case/dist/index.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/lower-case/dist/index.spec.js b/node_modules/lower-case/dist/index.spec.js new file mode 100644 index 00000000..254b080f --- /dev/null +++ b/node_modules/lower-case/dist/index.spec.js @@ -0,0 +1,36 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var _1 = require("."); +var TEST_CASES = [ + ["", ""], + ["test", "test"], + ["TEST", "test"], + ["test string", "test string"], + ["TEST STRING", "test string"], +]; +var LOCALE_TEST_CASES = [ + ["STRING", "strıng", "tr"], +]; +describe("lower case", function () { + var _loop_1 = function (input, result) { + it(input + " -> " + result, function () { + expect(_1.lowerCase(input)).toEqual(result); + }); + }; + for (var _i = 0, TEST_CASES_1 = TEST_CASES; _i < TEST_CASES_1.length; _i++) { + var _a = TEST_CASES_1[_i], input = _a[0], result = _a[1]; + _loop_1(input, result); + } +}); +describe("locale lower case", function () { + var _loop_2 = function (input, result, locale) { + it(locale + ": " + input + " -> " + result, function () { + expect(_1.localeLowerCase(input, locale)).toEqual(result); + }); + }; + for (var _i = 0, LOCALE_TEST_CASES_1 = LOCALE_TEST_CASES; _i < LOCALE_TEST_CASES_1.length; _i++) { + var _a = LOCALE_TEST_CASES_1[_i], input = _a[0], result = _a[1], locale = _a[2]; + _loop_2(input, result, locale); + } +}); +//# sourceMappingURL=index.spec.js.map \ No newline at end of file diff --git a/node_modules/lower-case/dist/index.spec.js.map b/node_modules/lower-case/dist/index.spec.js.map new file mode 100644 index 00000000..25bb7f11 --- /dev/null +++ b/node_modules/lower-case/dist/index.spec.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.spec.js","sourceRoot":"","sources":["../src/index.spec.ts"],"names":[],"mappings":";;AAAA,sBAA+C;AAE/C,IAAM,UAAU,GAAuB;IACrC,CAAC,EAAE,EAAE,EAAE,CAAC;IACR,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,aAAa,EAAE,aAAa,CAAC;IAC9B,CAAC,aAAa,EAAE,aAAa,CAAC;CAC/B,CAAC;AAEF,IAAM,iBAAiB,GAA+B;IACpD,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC;CAC3B,CAAC;AAEF,QAAQ,CAAC,YAAY,EAAE;4BACT,KAAK,EAAE,MAAM;QACvB,EAAE,CAAI,KAAK,YAAO,MAAQ,EAAE;YAC1B,MAAM,CAAC,YAAS,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;;IAHL,KAA8B,UAAU,EAAV,yBAAU,EAAV,wBAAU,EAAV,IAAU;QAA7B,IAAA,qBAAe,EAAd,KAAK,QAAA,EAAE,MAAM,QAAA;gBAAb,KAAK,EAAE,MAAM;KAIxB;AACH,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE;4BAChB,KAAK,EAAE,MAAM,EAAE,MAAM;QAC/B,EAAE,CAAI,MAAM,UAAK,KAAK,YAAO,MAAQ,EAAE;YACrC,MAAM,CAAC,kBAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;;IAHL,KAAsC,UAAiB,EAAjB,uCAAiB,EAAjB,+BAAiB,EAAjB,IAAiB;QAA5C,IAAA,4BAAuB,EAAtB,KAAK,QAAA,EAAE,MAAM,QAAA,EAAE,MAAM,QAAA;gBAArB,KAAK,EAAE,MAAM,EAAE,MAAM;KAIhC;AACH,CAAC,CAAC,CAAC","sourcesContent":["import { lowerCase, localeLowerCase } from \".\";\n\nconst TEST_CASES: [string, string][] = [\n [\"\", \"\"],\n [\"test\", \"test\"],\n [\"TEST\", \"test\"],\n [\"test string\", \"test string\"],\n [\"TEST STRING\", \"test string\"],\n];\n\nconst LOCALE_TEST_CASES: [string, string, string][] = [\n [\"STRING\", \"strıng\", \"tr\"],\n];\n\ndescribe(\"lower case\", () => {\n for (const [input, result] of TEST_CASES) {\n it(`${input} -> ${result}`, () => {\n expect(lowerCase(input)).toEqual(result);\n });\n }\n});\n\ndescribe(\"locale lower case\", () => {\n for (const [input, result, locale] of LOCALE_TEST_CASES) {\n it(`${locale}: ${input} -> ${result}`, () => {\n expect(localeLowerCase(input, locale)).toEqual(result);\n });\n }\n});\n"]} \ No newline at end of file diff --git a/node_modules/lower-case/package.json b/node_modules/lower-case/package.json new file mode 100644 index 00000000..23e1c644 --- /dev/null +++ b/node_modules/lower-case/package.json @@ -0,0 +1,87 @@ +{ + "name": "lower-case", + "version": "2.0.2", + "description": "Transforms the string to lower case", + "main": "dist/index.js", + "typings": "dist/index.d.ts", + "module": "dist.es2015/index.js", + "sideEffects": false, + "jsnext:main": "dist.es2015/index.js", + "files": [ + "dist/", + "dist.es2015/", + "LICENSE" + ], + "scripts": { + "lint": "tslint \"src/**/*\" --project tsconfig.json", + "build": "rimraf dist/ dist.es2015/ && tsc && tsc -P tsconfig.es2015.json", + "specs": "jest --coverage", + "test": "npm run build && npm run lint && npm run specs", + "size": "size-limit", + "prepare": "npm run build" + }, + "repository": { + "type": "git", + "url": "git://github.com/blakeembrey/change-case.git" + }, + "keywords": [ + "lower", + "case", + "downcase", + "locale", + "convert", + "transform" + ], + "author": { + "name": "Blake Embrey", + "email": "hello@blakeembrey.com", + "url": "http://blakeembrey.me" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/blakeembrey/change-case/issues" + }, + "homepage": "https://github.com/blakeembrey/change-case/tree/master/packages/lower-case#readme", + "size-limit": [ + { + "path": "dist/index.js", + "limit": "250 B" + } + ], + "jest": { + "roots": [ + "/src/" + ], + "transform": { + "\\.tsx?$": "ts-jest" + }, + "testRegex": "(/__tests__/.*|\\.(test|spec))\\.(tsx?|jsx?)$", + "moduleFileExtensions": [ + "ts", + "tsx", + "js", + "jsx", + "json", + "node" + ] + }, + "publishConfig": { + "access": "public" + }, + "devDependencies": { + "@size-limit/preset-small-lib": "^2.2.1", + "@types/jest": "^24.0.23", + "@types/node": "^12.12.14", + "jest": "^24.9.0", + "rimraf": "^3.0.0", + "ts-jest": "^24.2.0", + "tslint": "^5.20.1", + "tslint-config-prettier": "^1.18.0", + "tslint-config-standard": "^9.0.0", + "typescript": "^4.1.2" + }, + "dependencies": { + "tslib": "^2.0.3" + }, + "gitHead": "76a21a7f6f2a226521ef6abd345ff309cbd01fb0" +} diff --git a/node_modules/lru-cache/LICENSE.md b/node_modules/lru-cache/LICENSE.md new file mode 100644 index 00000000..c5402b95 --- /dev/null +++ b/node_modules/lru-cache/LICENSE.md @@ -0,0 +1,55 @@ +# Blue Oak Model License + +Version 1.0.0 + +## Purpose + +This license gives everyone as much permission to work with +this software as possible, while protecting contributors +from liability. + +## Acceptance + +In order to receive this license, you must agree to its +rules. The rules of this license are both obligations +under that agreement and conditions to your license. +You must not do anything with this software that triggers +a rule that you cannot or will not follow. + +## Copyright + +Each contributor licenses you to do everything with this +software that would otherwise infringe that contributor's +copyright in it. + +## Notices + +You must ensure that everyone who gets a copy of +any part of this software from you, with or without +changes, also gets the text of this license or a link to +. + +## Excuse + +If anyone notifies you in writing that you have not +complied with [Notices](#notices), you can keep your +license by taking all practical steps to comply within 30 +days after the notice. If you do not do so, your license +ends immediately. + +## Patent + +Each contributor licenses you to do everything with this +software that would otherwise infringe any patent claims +they can license or become able to license. + +## Reliability + +No contributor can revoke this license. + +## No Liability + +***As far as the law allows, this software comes as is, +without any warranty or condition, and no contributor +will be liable to anyone for any damages related to this +software or this license, under any kind of legal claim.*** diff --git a/node_modules/lru-cache/README.md b/node_modules/lru-cache/README.md new file mode 100644 index 00000000..b990a379 --- /dev/null +++ b/node_modules/lru-cache/README.md @@ -0,0 +1,469 @@ +# lru-cache + +A cache object that deletes the least-recently-used items. + +Specify a max number of the most recently used items that you +want to keep, and this cache will keep that many of the most +recently accessed items. + +This is not primarily a TTL cache, and does not make strong TTL +guarantees. There is no preemptive pruning of expired items by +default, but you _may_ set a TTL on the cache or on a single +`set`. If you do so, it will treat expired items as missing, and +delete them when fetched. If you are more interested in TTL +caching than LRU caching, check out +[@isaacs/ttlcache](http://npm.im/@isaacs/ttlcache). + +As of version 7, this is one of the most performant LRU +implementations available in JavaScript, and supports a wide +diversity of use cases. However, note that using some of the +features will necessarily impact performance, by causing the +cache to have to do more work. See the "Performance" section +below. + +## Installation + +```bash +npm install lru-cache --save +``` + +## Usage + +```js +// hybrid module, either works +import { LRUCache } from 'lru-cache' +// or: +const { LRUCache } = require('lru-cache') +// or in minified form for web browsers: +import { LRUCache } from 'http://unpkg.com/lru-cache@9/dist/mjs/index.min.mjs' + +// At least one of 'max', 'ttl', or 'maxSize' is required, to prevent +// unsafe unbounded storage. +// +// In most cases, it's best to specify a max for performance, so all +// the required memory allocation is done up-front. +// +// All the other options are optional, see the sections below for +// documentation on what each one does. Most of them can be +// overridden for specific items in get()/set() +const options = { + max: 500, + + // for use with tracking overall storage size + maxSize: 5000, + sizeCalculation: (value, key) => { + return 1 + }, + + // for use when you need to clean up something when objects + // are evicted from the cache + dispose: (value, key, reason) => { + freeFromMemoryOrWhatever(value) + }, + + // for use when you need to know that an item is being inserted + // note that this does NOT allow you to prevent the insertion, + // it just allows you to know about it. + onInsert: (value, key, reason) => { + logInsertionOrWhatever(key, value) + }, + + // how long to live in ms + ttl: 1000 * 60 * 5, + + // return stale items before removing from cache? + allowStale: false, + + updateAgeOnGet: false, + updateAgeOnHas: false, + + // async method to use for cache.fetch(), for + // stale-while-revalidate type of behavior + fetchMethod: async (key, staleValue, { options, signal, context }) => {}, +} + +const cache = new LRUCache(options) + +cache.set('key', 'value') +cache.get('key') // "value" + +// non-string keys ARE fully supported +// but note that it must be THE SAME object, not +// just a JSON-equivalent object. +var someObject = { a: 1 } +cache.set(someObject, 'a value') +// Object keys are not toString()-ed +cache.set('[object Object]', 'a different value') +assert.equal(cache.get(someObject), 'a value') +// A similar object with same keys/values won't work, +// because it's a different object identity +assert.equal(cache.get({ a: 1 }), undefined) + +cache.clear() // empty the cache +``` + +If you put more stuff in the cache, then less recently used items +will fall out. That's what an LRU cache is. + +For full description of the API and all options, please see [the +LRUCache typedocs](https://isaacs.github.io/node-lru-cache/) + +## Storage Bounds Safety + +This implementation aims to be as flexible as possible, within +the limits of safe memory consumption and optimal performance. + +At initial object creation, storage is allocated for `max` items. +If `max` is set to zero, then some performance is lost, and item +count is unbounded. Either `maxSize` or `ttl` _must_ be set if +`max` is not specified. + +If `maxSize` is set, then this creates a safe limit on the +maximum storage consumed, but without the performance benefits of +pre-allocation. When `maxSize` is set, every item _must_ provide +a size, either via the `sizeCalculation` method provided to the +constructor, or via a `size` or `sizeCalculation` option provided +to `cache.set()`. The size of every item _must_ be a positive +integer. + +If neither `max` nor `maxSize` are set, then `ttl` tracking must +be enabled. Note that, even when tracking item `ttl`, items are +_not_ preemptively deleted when they become stale, unless +`ttlAutopurge` is enabled. Instead, they are only purged the +next time the key is requested. Thus, if `ttlAutopurge`, `max`, +and `maxSize` are all not set, then the cache will potentially +grow unbounded. + +In this case, a warning is printed to standard error. Future +versions may require the use of `ttlAutopurge` if `max` and +`maxSize` are not specified. + +If you truly wish to use a cache that is bound _only_ by TTL +expiration, consider using a `Map` object, and calling +`setTimeout` to delete entries when they expire. It will perform +much better than an LRU cache. + +Here is an implementation you may use, under the same +[license](./LICENSE) as this package: + +```js +// a storage-unbounded ttl cache that is not an lru-cache +const cache = { + data: new Map(), + timers: new Map(), + set: (k, v, ttl) => { + if (cache.timers.has(k)) { + clearTimeout(cache.timers.get(k)) + } + cache.timers.set( + k, + setTimeout(() => cache.delete(k), ttl), + ) + cache.data.set(k, v) + }, + get: k => cache.data.get(k), + has: k => cache.data.has(k), + delete: k => { + if (cache.timers.has(k)) { + clearTimeout(cache.timers.get(k)) + } + cache.timers.delete(k) + return cache.data.delete(k) + }, + clear: () => { + cache.data.clear() + for (const v of cache.timers.values()) { + clearTimeout(v) + } + cache.timers.clear() + }, +} +``` + +If that isn't to your liking, check out +[@isaacs/ttlcache](http://npm.im/@isaacs/ttlcache). + +## Storing Undefined Values + +This cache never stores undefined values, as `undefined` is used +internally in a few places to indicate that a key is not in the +cache. + +You may call `cache.set(key, undefined)`, but this is just +an alias for `cache.delete(key)`. Note that this has the effect +that `cache.has(key)` will return _false_ after setting it to +undefined. + +```js +cache.set(myKey, undefined) +cache.has(myKey) // false! +``` + +If you need to track `undefined` values, and still note that the +key is in the cache, an easy workaround is to use a sigil object +of your own. + +```js +import { LRUCache } from 'lru-cache' +const undefinedValue = Symbol('undefined') +const cache = new LRUCache(...) +const mySet = (key, value) => + cache.set(key, value === undefined ? undefinedValue : value) +const myGet = (key, value) => { + const v = cache.get(key) + return v === undefinedValue ? undefined : v +} +``` + +## Tracing and Observability + +Most methods can accept a `status` option, which is an +[`LRUCache.Status`](https://isaacs.github.io/node-lru-cache/interfaces/LRUCache.LRUCache.Status.html) +object that will be decorated along the operation with +indications about what was done and why. + +Additionally, this library is instrumented using the +[`node:diagnostics_channel`](https://nodejs.org/api/diagnostics_channel.html) +module on Node and other platforms that support it. In order to +get diagnostics metrics, listen on the +`channel('lru-cache:metrics')`. To get Tracing Channel traces, +subscribe to the `tracingChannel('lru-cache')`. The +[`LRUCache.Status`](https://isaacs.github.io/node-lru-cache/interfaces/LRUCache.LRUCache.Status.html) +objects will be provided as the message context to those channel +listeners. + +For example, you could do the following to get comprehensive +information about every LRUCache instance in your application: + +```ts +import { tracingChannel, subscribe } from 'node:diagnostics_channel' + +subscribe('lru-cache:metrics', (message, name) => { + // name will always be 'lru-cache:metrics' + // message will be the LRUCache.Status object for whatever + // synchronous operation was performed. + console.error('LRUCache Metrics', message) +}) + +tracingChannel('lru-cache').subscribe({ + start: status => { + // a traced operation is starting + }, + asyncStart: status => { + // an async traced operation is starting + }, + asyncEnd: status => { + // an async traced operation is ending + } + error: status => { + // a traced operation failed + }, + end: status => { + // a traced operation is complete + }, +}) +``` + +The async `cache.fetch()` and `cache.forceFetch` methods are +covered by `tracingChannels`. All the other operations are +covered by the `lru-cache:metrics` channel, because they are +strictly synchronous, and thus don't have an asynchronous +lifecycle to track. + +Note that using `status` objects or using +`node:diagnostics_channel` listeners _will_ impose a modest +performance penalty. Creating data objects is not ever free; do +not believe anyone who tells you otherwise. But it is as small as +possible. + +### Platform Compatibility Caveat + +Not all platforms support the `node:diagnostics_channel` module. +Currently, this is only available in Node, Bun, and Deno, and +some edge computing platforms that provide a Node compatibility +layer. + +To work around this, if you are loading in a non-Node +environment, the package.json exports will direct your module +loader to pull in a version that starts out with a dummy +implementation, then does a conditional dynamic `import` of the +`node:diagnostics_channel` module, and then swaps out those +dummy objects with the real thing if it succeeds. This means that +cache metrics and tracing channels started in the first load-time +tick of your application will _not_ be covered, except in +environments that load using the `require` import +condition, or both the `node` and `esm` import conditions +together. + +Top-level await _could_ be used to remove this caveat, but that +feature is dead on arrival, unfortunately. See +[#397](https://github.com/isaacs/node-lru-cache/issues/397) and +[#398](https://github.com/isaacs/node-lru-cache/issues/398) for +more details. + +## Performance + +As of April 2026, version 11 of this library is one of the most +performant LRU cache implementations in JavaScript. + +Benchmarks can be extremely difficult to get right. In +particular, the performance of set/get/delete operations on +objects will vary _wildly_ depending on the type of key used. V8 +is highly optimized for objects with keys that are short strings, +especially integer numeric strings. Thus any benchmark which +tests _solely_ using numbers as keys will tend to find that an +object-based approach performs the best. + +Note that coercing _anything_ to strings to use as object keys is +unsafe, unless you can be 100% certain that no other type of +value will be used. For example: + +```js +const myCache = {} +const set = (k, v) => (myCache[k] = v) +const get = k => myCache[k] + +set({}, 'please hang onto this for me') +set('[object Object]', 'oopsie') +``` + +Also beware of "Just So" stories regarding performance. Garbage +collection of large (especially: deep) object graphs can be +incredibly costly, with several "tipping points" where it +increases exponentially. As a result, putting that off until +later can make it much worse, and less predictable. If a library +performs well, but only in a scenario where the object graph is +kept shallow, then that won't help you if you are using large +objects as keys. + +In general, when attempting to use a library to improve +performance (such as a cache like this one), it's best to choose +an option that will perform well in the sorts of scenarios where +you'll actually use it. + +This library is optimized for repeated gets and minimizing +eviction time, since that is the expected need of a LRU. Set +operations are somewhat slower on average than a few other +options, in part because of that optimization. It is assumed +that you'll be caching some costly operation, ideally as rarely +as possible, so optimizing set over get would be unwise. + +If performance matters to you: + +1. If it's at all possible to use small integer values as keys, + and you can guarantee that no other types of values will be + used as keys, then do that, and use a cache such as + [lru-fast](https://npmjs.com/package/lru-fast), or + [mnemonist's + LRUCache](https://yomguithereal.github.io/mnemonist/lru-cache) + which uses an Object as its data store. + +2. Failing that, if you can use short non-numeric strings (ie, + less than 256 characters) as your keys, and you do not need + any of the other features of this library, use [mnemonist's + LRUCache](https://yomguithereal.github.io/mnemonist/lru-cache). + +3. If the types of your keys will be anything else, especially + long strings, strings that look like floats, objects, or some + mix of types, or if you aren't sure, then this library will + work well for you. + + If you do not need the features that this library provides + (like asynchronous fetching, a variety of TTL staleness + options, and so on), then [mnemonist's + LRUMap](https://yomguithereal.github.io/mnemonist/lru-map) is + also a very good option, and just slightly faster than this + module (since it does considerably less). + +4. Do not use a `dispose` function, size tracking, or especially + ttl behavior or observability features, unless absolutely + needed. These features are convenient, and necessary in some + use cases, and every attempt has been made to make the + performance impact minimal, but it isn't nothing. + +## Testing + +When writing tests that involve TTL-related functionality, note +that this module creates an internal reference to the global +`performance` or `Date` objects at import time. If you import it +statically at the top level, those references cannot be mocked or +overridden in your test environment. + +To avoid this, dynamically import the package within your tests +so that the references are captured after your mocks are applied. +For example: + +```ts +// ❌ Not recommended +import { LRUCache } from 'lru-cache' +// mocking timers, e.g. jest.useFakeTimers() + +// ✅ Recommended for TTL tests +// mocking timers, e.g. jest.useFakeTimers() +const { LRUCache } = await import('lru-cache') +``` + +This ensures that your mocked timers or time sources are +respected when testing TTL behavior. + +Additionally, you can pass in a `perf` option when creating your +LRUCache instance. This option accepts any object with a `now` +method that returns a number. + +For example, this would be a very bare-bones time-mocking system +you could use in your tests, without any particular test +framework: + +```ts +import { LRUCache } from 'lru-cache' + +let myClockTime = 0 + +const cache = new LRUCache({ + max: 10, + ttl: 1000, + perf: { + now: () => myClockTime, + }, +}) + +// run tests, updating myClockTime as needed +``` + +## Breaking Changes in Version 7 + +This library changed to a different algorithm and internal data +structure in version 7, yielding significantly better +performance, albeit with some subtle changes as a result. + +If you were relying on the internals of LRUCache in version 6 or +before, it probably will not work in version 7 and above. + +## Breaking Changes in Version 8 + +- The `fetchContext` option was renamed to `context`, and may no + longer be set on the cache instance itself. +- Rewritten in TypeScript, so pretty much all the types moved + around a lot. +- The AbortController/AbortSignal polyfill was removed. For this + reason, **Node version 16.14.0 or higher is now required**. +- Internal properties were moved to actual private class + properties. +- Keys and values must not be `null` or `undefined`. +- Minified export available at `'lru-cache/min'`, for both CJS + and MJS builds. + +## Breaking Changes in Version 9 + +- Named export only, no default export. +- AbortController polyfill returned, albeit with a warning when + used. + +## Breaking Changes in Version 10 + +- `cache.fetch()` return type is now `Promise` + instead of `Promise`. This is an irrelevant change + practically speaking, but can require changes for TypeScript + users. + +For more info, see the [change log](CHANGELOG.md). diff --git a/node_modules/lru-cache/dist/commonjs/browser/diagnostics-channel-browser.d.ts.map b/node_modules/lru-cache/dist/commonjs/browser/diagnostics-channel-browser.d.ts.map new file mode 100644 index 00000000..a457786d --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/browser/diagnostics-channel-browser.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"diagnostics-channel-browser.d.ts","sourceRoot":"","sources":["../../../src/diagnostics-channel-browser.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,cAAc,EACpB,MAAM,0BAA0B,CAAA;AACjC,YAAY,EAAE,cAAc,EAAE,OAAO,EAAE,CAAA;AAGvC,eAAO,MAAM,OAAO,EAAY,OAAO,CAAC,OAAO,CAAC,CAAA;AAChD,eAAO,MAAM,OAAO,EAAY,cAAc,CAAC,OAAO,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/browser/diagnostics-channel-browser.js.map b/node_modules/lru-cache/dist/commonjs/browser/diagnostics-channel-browser.js.map new file mode 100644 index 00000000..bb682313 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/browser/diagnostics-channel-browser.js.map @@ -0,0 +1 @@ +{"version":3,"file":"diagnostics-channel-browser.js","sourceRoot":"","sources":["../../../src/diagnostics-channel-browser.ts"],"names":[],"mappings":";;;AAQA,MAAM,KAAK,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,CAAA;AAC1B,QAAA,OAAO,GAAG,KAAyB,CAAA;AACnC,QAAA,OAAO,GAAG,KAAgC,CAAA","sourcesContent":["// this is used in ESM environments that follow the 'browser' import\n// condition, to avoid even trying to load node:diagnostics_channel\nimport {\n type Channel,\n type TracingChannel,\n} from 'node:diagnostics_channel'\nexport type { TracingChannel, Channel }\n\nconst dummy = { hasSubscribers: false }\nexport const metrics = dummy as Channel\nexport const tracing = dummy as TracingChannel\n"]} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/browser/diagnostics-channel.d.ts b/node_modules/lru-cache/dist/commonjs/browser/diagnostics-channel.d.ts new file mode 100644 index 00000000..5360898f --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/browser/diagnostics-channel.d.ts @@ -0,0 +1,5 @@ +import { type Channel, type TracingChannel } from 'node:diagnostics_channel'; +export type { TracingChannel, Channel }; +export declare const metrics: Channel; +export declare const tracing: TracingChannel; +//# sourceMappingURL=diagnostics-channel-browser.d.ts.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/browser/diagnostics-channel.js b/node_modules/lru-cache/dist/commonjs/browser/diagnostics-channel.js new file mode 100644 index 00000000..8f6a8f12 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/browser/diagnostics-channel.js @@ -0,0 +1,7 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.tracing = exports.metrics = void 0; +const dummy = { hasSubscribers: false }; +exports.metrics = dummy; +exports.tracing = dummy; +//# sourceMappingURL=diagnostics-channel-browser.js.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/browser/index.d.ts b/node_modules/lru-cache/dist/commonjs/browser/index.d.ts new file mode 100644 index 00000000..b0e4b964 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/browser/index.d.ts @@ -0,0 +1,1400 @@ +/** + * @module LRUCache + */ +import type { Perf } from './perf.js'; +export type { Perf } from './perf.js'; +declare const TYPE: unique symbol; +export type PosInt = number & { + [TYPE]: 'Positive Integer'; +}; +export type Index = number & { + [TYPE]: 'LRUCache Index'; +}; +export type UintArray = Uint8Array | Uint16Array | Uint32Array; +export type NumberArray = UintArray | number[]; +declare class ZeroArray extends Array { + constructor(size: number); +} +export type { ZeroArray }; +export type { Stack }; +export type StackLike = Stack | Index[]; +declare class Stack { + #private; + heap: NumberArray; + length: number; + static create(max: number): StackLike; + constructor(max: number, HeapCls: { + new (n: number): NumberArray; + }); + push(n: Index): void; + pop(): Index; +} +/** + * Promise representing an in-progress {@link LRUCache#fetch} call + */ +export type BackgroundFetch = Promise & { + __returned: BackgroundFetch | undefined; + __abortController: AbortController; + __staleWhileFetching: V | undefined; +}; +export type DisposeTask = [ + value: V, + key: K, + reason: LRUCache.DisposeReason +]; +export declare namespace LRUCache { + /** + * An integer greater than 0, reflecting the calculated size of items + */ + type Size = number; + /** + * Integer greater than 0, representing some number of milliseconds, or the + * time at which a TTL started counting from. + */ + type Milliseconds = number; + /** + * An integer greater than 0, reflecting a number of items + */ + type Count = number; + /** + * The reason why an item was removed from the cache, passed + * to the {@link Disposer} methods. + * + * - `evict`: The item was evicted because it is the least recently used, + * and the cache is full. + * - `set`: A new value was set, overwriting the old value being disposed. + * - `delete`: The item was explicitly deleted, either by calling + * {@link LRUCache#delete}, {@link LRUCache#clear}, or + * {@link LRUCache#set} with an undefined value. + * - `expire`: The item was removed due to exceeding its TTL. + * - `fetch`: A {@link OptionsBase#fetchMethod} operation returned + * `undefined` or was aborted, causing the item to be deleted. + */ + type DisposeReason = 'evict' | 'set' | 'delete' | 'expire' | 'fetch'; + /** + * A method called upon item removal, passed as the + * {@link OptionsBase.dispose} and/or + * {@link OptionsBase.disposeAfter} options. + */ + type Disposer = (value: V, key: K, reason: DisposeReason) => void; + /** + * The reason why an item was added to the cache, passed + * to the {@link Inserter} methods. + * + * - `add`: the item was not found in the cache, and was added + * - `update`: the item was in the cache, with the same value provided + * - `replace`: the item was in the cache, and replaced + */ + type InsertReason = 'add' | 'update' | 'replace'; + /** + * A method called upon item insertion, passed as the + * {@link OptionsBase.insert} + */ + type Inserter = (value: V, key: K, reason: InsertReason) => void; + /** + * A function that returns the effective calculated size + * of an entry in the cache. + */ + type SizeCalculator = (value: V, key: K) => Size; + /** + * Options provided to the + * {@link OptionsBase.fetchMethod} function. + */ + interface FetcherOptions { + signal: AbortSignal; + options: FetcherFetchOptions; + /** + * Object provided in the {@link FetchOptions.context} option to + * {@link LRUCache#fetch} + */ + context: FC; + } + /** + * Occasionally, it may be useful to track the internal behavior of the + * cache, particularly for logging, debugging, or for behavior within the + * `fetchMethod`. To do this, you can pass a `status` object to the + * {@link LRUCache#fetch}, {@link LRUCache#get}, {@link LRUCache#set}, + * {@link LRUCache#memo}, and {@link LRUCache#has} methods. + * + * The `status` option should be a plain JavaScript object. The following + * fields will be set on it appropriately, depending on the situation. + * + * These objects are also the context objects passed to listeners on the + * `lru-cache:metrics` diagnostic channel, and the `lru-cache` tracing + * channels, in platforms that support them. + */ + interface Status { + /** + * The operation being performed + */ + op?: 'get' | 'set' | 'memo' | 'fetch' | 'delete' | 'has' | 'peek'; + /** + * The status of a set() operation. + * + * - add: the item was not found in the cache, and was added + * - update: the item was in the cache, with the same value provided + * - replace: the item was in the cache, and replaced + * - miss: the item was not added to the cache for some reason + */ + set?: 'add' | 'update' | 'replace' | 'miss' | 'deleted'; + /** + * The status of a delete() operation. + */ + delete?: LRUCache.DisposeReason; + /** + * The result of a peek() operation + * + * - hit: the item was found and returned + * - stale: the item is in the cache, but past its ttl and not returned + * - miss: item not in the cache + */ + peek?: 'hit' | 'miss' | 'stale'; + /** + * The status of a memo() operation. + * + * - 'hit': the item was found in the cache and returned + * - 'miss': the `memoMethod` function was called + */ + memo?: 'hit' | 'miss'; + /** + * The `context` option provided to a memo or fetch operation + * + * In practice, of course, this will be the same type as the `FC` + * fetch context param used to instantiate the LRUCache, but the + * convolutions of threading that through would get quite complicated, + * and preclude forcing/forbidding the passing of a `context` param + * where it is/isn't expected, which is more valuable for error + * prevention. + */ + context?: unknown; + /** + * the ttl stored for the item, or undefined if ttls are not used. + */ + ttl?: Milliseconds; + /** + * the start time for the item, or undefined if ttls are not used. + */ + start?: Milliseconds; + /** + * The timestamp used for TTL calculation + */ + now?: Milliseconds; + /** + * the remaining ttl for the item, or undefined if ttls are not used. + */ + remainingTTL?: Milliseconds; + /** + * The calculated size for the item, if sizes are used. + */ + entrySize?: Size; + /** + * The total calculated size of the cache, if sizes are used. + */ + totalCalculatedSize?: Size; + /** + * A flag indicating that the item was not stored, due to exceeding the + * {@link OptionsBase.maxEntrySize} + */ + maxEntrySizeExceeded?: true; + /** + * The key that was set or retrieved + */ + key?: K; + /** + * The value that was set + */ + value?: V; + /** + * The old value, specified in the case of `set:'replace'` + */ + oldValue?: V; + /** + * The results of a {@link LRUCache#has} operation + * + * - hit: the item was found in the cache + * - stale: the item was found in the cache, but is stale + * - miss: the item was not found in the cache + */ + has?: 'hit' | 'stale' | 'miss'; + /** + * The status of a {@link LRUCache#fetch} operation. + * Note that this can change as the underlying fetch() moves through + * various states. + * + * - inflight: there is another fetch() for this key which is in process + * - get: there is no {@link OptionsBase.fetchMethod}, so + * {@link LRUCache#get} was called. + * - miss: the item is not in cache, and will be fetched. + * - hit: the item is in the cache, and was resolved immediately. + * - stale: the item is in the cache, but stale. + * - refresh: the item is in the cache, and not stale, but + * {@link FetchOptions.forceRefresh} was specified. + */ + fetch?: 'get' | 'inflight' | 'miss' | 'hit' | 'stale' | 'refresh'; + /** + * `forceRefresh` option was used for either a fetch or memo operation + */ + forceRefresh?: boolean; + /** + * The {@link OptionsBase.fetchMethod} was called + */ + fetchDispatched?: true; + /** + * The cached value was updated after a successful call to + * {@link OptionsBase.fetchMethod} + */ + fetchUpdated?: true; + /** + * The reason for a fetch() rejection. Either the error raised by the + * {@link OptionsBase.fetchMethod}, or the reason for an + * AbortSignal. + */ + fetchError?: Error; + /** + * The fetch received an abort signal + */ + fetchAborted?: true; + /** + * The abort signal received was ignored, and the fetch was allowed to + * continue in the background. + */ + fetchAbortIgnored?: true; + /** + * The fetchMethod promise resolved successfully + */ + fetchResolved?: true; + /** + * The fetchMethod promise was rejected + */ + fetchRejected?: true; + /** + * The status of a {@link LRUCache#get} operation. + * + * - fetching: The item is currently being fetched. If a previous value + * is present and allowed, that will be returned. + * - stale: The item is in the cache, and is stale. If it was returned, + * then the `returnedStale` flag will be set. + * - stale-fetching: The value is being fetched in the background, but is + * currently stale. If the stale value was returned, then the + * `returnedStale` flag will be set. + * - hit: the item is in the cache + * - miss: the item is not in the cache + */ + get?: 'stale' | 'hit' | 'miss' | 'fetching' | 'stale-fetching'; + /** + * A fetch or get operation returned a stale value. + */ + returnedStale?: true; + /** + * A tracingChannel trace was started for this operation + */ + trace?: boolean; + /** + * A reference to the cache instance associated with this operation + */ + cache?: LRUCache; + } + /** + * options which override the options set in the LRUCache constructor + * when calling {@link LRUCache#fetch}. + * + * This is the union of {@link GetOptions} and {@link SetOptions}, plus + * {@link OptionsBase.noDeleteOnFetchRejection}, + * {@link OptionsBase.allowStaleOnFetchRejection}, + * {@link FetchOptions.forceRefresh}, and + * {@link FetcherOptions.context} + * + * Any of these may be modified in the {@link OptionsBase.fetchMethod} + * function, but the {@link GetOptions} fields will of course have no + * effect, as the {@link LRUCache#get} call already happened by the time + * the fetchMethod is called. + */ + interface FetcherFetchOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet' | 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL' | 'noDeleteOnFetchRejection' | 'allowStaleOnFetchRejection' | 'ignoreFetchAbort' | 'allowStaleOnFetchAbort'> { + status?: Status; + size?: Size; + } + /** + * Options that may be passed to the {@link LRUCache#fetch} method. + */ + interface FetchOptions extends FetcherFetchOptions { + /** + * Set to true to force a re-load of the existing data, even if it + * is not yet stale. + */ + forceRefresh?: boolean; + /** + * Context provided to the {@link OptionsBase.fetchMethod} as + * the {@link FetcherOptions.context} param. + * + * If the FC type is specified as unknown (the default), + * undefined or void, then this is optional. Otherwise, it will + * be required. + */ + context?: FC; + signal?: AbortSignal; + status?: Status; + } + /** + * Options provided to {@link LRUCache#fetch} when the FC type is something + * other than `unknown`, `undefined`, or `void` + */ + interface FetchOptionsWithContext extends FetchOptions { + context: FC; + } + /** + * Options provided to {@link LRUCache#fetch} when the FC type is + * `undefined` or `void` + */ + interface FetchOptionsNoContext extends FetchOptions { + context?: FC; + } + interface MemoOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet' | 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL' | 'noDeleteOnFetchRejection' | 'allowStaleOnFetchRejection' | 'ignoreFetchAbort' | 'allowStaleOnFetchAbort'> { + /** + * Set to true to force a re-load of the existing data, even if it + * is not yet stale. + */ + forceRefresh?: boolean; + /** + * Context provided to the {@link OptionsBase.memoMethod} as + * the {@link MemoizerOptions.context} param. + * + * If the FC type is specified as unknown (the default), + * undefined or void, then this is optional. Otherwise, it will + * be required. + */ + context?: FC; + status?: Status; + } + /** + * Options provided to {@link LRUCache#memo} when the FC type is something + * other than `unknown`, `undefined`, or `void` + */ + interface MemoOptionsWithContext extends MemoOptions { + context: FC; + } + /** + * Options provided to {@link LRUCache#memo} when the FC type is + * `undefined` or `void` + */ + interface MemoOptionsNoContext extends MemoOptions { + context?: FC; + } + /** + * Options provided to the + * {@link OptionsBase.memoMethod} function. + */ + interface MemoizerOptions { + options: MemoizerMemoOptions; + /** + * Object provided in the {@link MemoOptions.context} option to + * {@link LRUCache#memo} + */ + context: FC; + } + /** + * options which override the options set in the LRUCache constructor + * when calling {@link LRUCache#memo}. + * + * This is the union of {@link GetOptions} and {@link SetOptions}, plus + * {@link MemoOptions.forceRefresh}, and + * {@link MemoOptions.context} + * + * Any of these may be modified in the {@link OptionsBase.memoMethod} + * function, but the {@link GetOptions} fields will of course have no + * effect, as the {@link LRUCache#get} call already happened by the time + * the memoMethod is called. + */ + interface MemoizerMemoOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet' | 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'> { + status?: Status; + size?: Size; + start?: Milliseconds; + } + /** + * Options that may be passed to the {@link LRUCache#has} method. + */ + interface HasOptions extends Pick, 'updateAgeOnHas'> { + status?: Status; + } + /** + * Options that may be passed to the {@link LRUCache#get} method. + */ + interface GetOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet'> { + status?: Status; + } + /** + * Options that may be passed to the {@link LRUCache#peek} method. + */ + interface PeekOptions extends Pick, 'allowStale'> { + status?: Status; + } + /** + * Options that may be passed to the {@link LRUCache#set} method. + */ + interface SetOptions extends Pick, 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'> { + /** + * If size tracking is enabled, then setting an explicit size + * in the {@link LRUCache#set} call will prevent calling the + * {@link OptionsBase.sizeCalculation} function. + */ + size?: Size; + /** + * If TTL tracking is enabled, then setting an explicit start + * time in the {@link LRUCache#set} call will override the + * default time from `performance.now()` or `Date.now()`. + * + * Note that it must be a valid value for whichever time-tracking + * method is in use. + */ + start?: Milliseconds; + status?: Status; + } + /** + * The type signature for the {@link OptionsBase.fetchMethod} option. + */ + type Fetcher = (key: K, staleValue: V | undefined, options: FetcherOptions) => Promise | V | undefined | void; + /** + * the type signature for the {@link OptionsBase.memoMethod} option. + */ + type Memoizer = (key: K, staleValue: V | undefined, options: MemoizerOptions) => V; + /** + * Options which may be passed to the {@link LRUCache} constructor. + * + * Most of these may be overridden in the various options that use + * them. + * + * Despite all being technically optional, the constructor requires that + * a cache is at minimum limited by one or more of {@link OptionsBase.max}, + * {@link OptionsBase.ttl}, or {@link OptionsBase.maxSize}. + * + * If {@link OptionsBase.ttl} is used alone, then it is strongly advised + * (and in fact required by the type definitions here) that the cache + * also set {@link OptionsBase.ttlAutopurge}, to prevent potentially + * unbounded storage. + * + * All options are also available on the {@link LRUCache} instance, making + * it safe to pass an LRUCache instance as the options argumemnt to + * make another empty cache of the same type. + * + * Some options are marked as read-only, because changing them after + * instantiation is not safe. Changing any of the other options will of + * course only have an effect on subsequent method calls. + */ + interface OptionsBase { + /** + * The maximum number of items to store in the cache before evicting + * old entries. This is read-only on the {@link LRUCache} instance, + * and may not be overridden. + * + * If set, then storage space will be pre-allocated at construction + * time, and the cache will perform significantly faster. + * + * Note that significantly fewer items may be stored, if + * {@link OptionsBase.maxSize} and/or {@link OptionsBase.ttl} are also + * set. + * + * **It is strongly recommended to set a `max` to prevent unbounded growth + * of the cache.** + */ + max?: Count; + /** + * Max time in milliseconds for items to live in cache before they are + * considered stale. Note that stale items are NOT preemptively removed by + * default, and MAY live in the cache, contributing to its LRU max, long + * after they have expired, unless {@link OptionsBase.ttlAutopurge} is + * set. + * + * If set to `0` (the default value), then that means "do not track + * TTL", not "expire immediately". + * + * Also, as this cache is optimized for LRU/MRU operations, some of + * the staleness/TTL checks will reduce performance, as they will incur + * overhead by deleting items. + * + * This is not primarily a TTL cache, and does not make strong TTL + * guarantees. There is no pre-emptive pruning of expired items, but you + * _may_ set a TTL on the cache, and it will treat expired items as missing + * when they are fetched, and delete them. + * + * Optional, but must be a non-negative integer in ms if specified. + * + * This may be overridden by passing an options object to `cache.set()`. + * + * At least one of `max`, `maxSize`, or `TTL` is required. This must be a + * positive integer if set. + * + * Even if ttl tracking is enabled, **it is strongly recommended to set a + * `max` to prevent unbounded growth of the cache.** + * + * If ttl tracking is enabled, and `max` and `maxSize` are not set, + * and `ttlAutopurge` is not set, then a warning will be emitted + * cautioning about the potential for unbounded memory consumption. + * (The TypeScript definitions will also discourage this.) + */ + ttl?: Milliseconds; + /** + * Minimum amount of time in ms in which to check for staleness. + * Defaults to 1, which means that the current time is checked + * at most once per millisecond. + * + * Set to 0 to check the current time every time staleness is tested. + * (This reduces performance, and is theoretically unnecessary.) + * + * Setting this to a higher value will improve performance somewhat + * while using ttl tracking, albeit at the expense of keeping stale + * items around a bit longer than their TTLs would indicate. + * + * @default 1 + */ + ttlResolution?: Milliseconds; + /** + * Preemptively remove stale items from the cache. + * + * Note that this may *significantly* degrade performance, especially if + * the cache is storing a large number of items. It is almost always best + * to just leave the stale items in the cache, and let them fall out as new + * items are added. + * + * Note that this means that {@link OptionsBase.allowStale} is a bit + * pointless, as stale items will be deleted almost as soon as they + * expire. + * + * Use with caution! + */ + ttlAutopurge?: boolean; + /** + * When using time-expiring entries with `ttl`, setting this to `true` will + * make each item's age reset to 0 whenever it is retrieved from cache with + * {@link LRUCache#get}, causing it to not expire. (It can still fall out + * of cache based on recency of use, of course.) + * + * Has no effect if {@link OptionsBase.ttl} is not set. + * + * This may be overridden by passing an options object to `cache.get()`. + */ + updateAgeOnGet?: boolean; + /** + * When using time-expiring entries with `ttl`, setting this to `true` will + * make each item's age reset to 0 whenever its presence in the cache is + * checked with {@link LRUCache#has}, causing it to not expire. (It can + * still fall out of cache based on recency of use, of course.) + * + * Has no effect if {@link OptionsBase.ttl} is not set. + */ + updateAgeOnHas?: boolean; + /** + * Allow {@link LRUCache#get} and {@link LRUCache#fetch} calls to return + * stale data, if available. + * + * By default, if you set `ttl`, stale items will only be deleted from the + * cache when you `get(key)`. That is, it's not preemptively pruning items, + * unless {@link OptionsBase.ttlAutopurge} is set. + * + * If you set `allowStale:true`, it'll return the stale value *as well as* + * deleting it. If you don't set this, then it'll return `undefined` when + * you try to get a stale entry. + * + * Note that when a stale entry is fetched, _even if it is returned due to + * `allowStale` being set_, it is removed from the cache immediately. You + * can suppress this behavior by setting + * {@link OptionsBase.noDeleteOnStaleGet}, either in the constructor, or in + * the options provided to {@link LRUCache#get}. + * + * This may be overridden by passing an options object to `cache.get()`. + * The `cache.has()` method will always return `false` for stale items. + * + * Only relevant if a ttl is set. + */ + allowStale?: boolean; + /** + * Function that is called on items when they are dropped from the + * cache, as `dispose(value, key, reason)`. + * + * This can be handy if you want to close file descriptors or do + * other cleanup tasks when items are no longer stored in the cache. + * + * **NOTE**: It is called _before_ the item has been fully removed + * from the cache, so if you want to put it right back in, you need + * to wait until the next tick. If you try to add it back in during + * the `dispose()` function call, it will break things in subtle and + * weird ways. + * + * Unlike several other options, this may _not_ be overridden by + * passing an option to `set()`, for performance reasons. + * + * The `reason` will be one of the following strings, corresponding + * to the reason for the item's deletion: + * + * - `evict` Item was evicted to make space for a new addition + * - `set` Item was overwritten by a new value + * - `expire` Item expired its TTL + * - `fetch` Item was deleted due to a failed or aborted fetch, or a + * fetchMethod returning `undefined. + * - `delete` Item was removed by explicit `cache.delete(key)`, + * `cache.clear()`, or `cache.set(key, undefined)`. + */ + dispose?: Disposer; + /** + * Function that is called when new items are inserted into the cache, + * as `onInsert(value, key, reason)`. + * + * This can be useful if you need to perform actions when an item is + * added, such as logging or tracking insertions. + * + * Unlike some other options, this may _not_ be overridden by passing + * an option to `set()`, for performance and consistency reasons. + */ + onInsert?: Inserter; + /** + * The same as {@link OptionsBase.dispose}, but called *after* the entry + * is completely removed and the cache is once again in a clean state. + * + * It is safe to add an item right back into the cache at this point. + * However, note that it is *very* easy to inadvertently create infinite + * recursion this way. + */ + disposeAfter?: Disposer; + /** + * Set to true to suppress calling the + * {@link OptionsBase.dispose} function if the entry key is + * still accessible within the cache. + * + * This may be overridden by passing an options object to + * {@link LRUCache#set}. + * + * Only relevant if `dispose` or `disposeAfter` are set. + */ + noDisposeOnSet?: boolean; + /** + * Boolean flag to tell the cache to not update the TTL when setting a new + * value for an existing key (ie, when updating a value rather than + * inserting a new value). Note that the TTL value is _always_ set (if + * provided) when adding a new entry into the cache. + * + * Has no effect if a {@link OptionsBase.ttl} is not set. + * + * May be passed as an option to {@link LRUCache#set}. + */ + noUpdateTTL?: boolean; + /** + * Set to a positive integer to track the sizes of items added to the + * cache, and automatically evict items in order to stay below this size. + * Note that this may result in fewer than `max` items being stored. + * + * Attempting to add an item to the cache whose calculated size is greater + * that this amount will be a no-op. The item will not be cached, and no + * other items will be evicted. + * + * Optional, must be a positive integer if provided. + * + * Sets `maxEntrySize` to the same value, unless a different value is + * provided for `maxEntrySize`. + * + * At least one of `max`, `maxSize`, or `TTL` is required. This must be a + * positive integer if set. + * + * Even if size tracking is enabled, **it is strongly recommended to set a + * `max` to prevent unbounded growth of the cache.** + * + * Note also that size tracking can negatively impact performance, + * though for most cases, only minimally. + */ + maxSize?: Size; + /** + * The effective size for background fetch promises. + * + * This has no effect unless `maxSize` and `sizeCalculation` are used, + * and a {@link LRUCache.OptionsBase.fetchMethod} is provided to + * support {@link LRUCache#fetch}. + * + * If a stale value is present in the cache, then the effective size of + * the background fetch is the size of the stale item it will eventually + * replace. If not, then this value is used as its effective size. + * + * @default 1 + */ + backgroundFetchSize?: number; + /** + * The maximum allowed size for any single item in the cache. + * + * If a larger item is passed to {@link LRUCache#set} or returned by a + * {@link OptionsBase.fetchMethod} or {@link OptionsBase.memoMethod}, then + * it will not be stored in the cache. + * + * Attempting to add an item whose calculated size is greater than + * this amount will not cache the item or evict any old items, but + * WILL delete an existing value if one is already present. + * + * Optional, must be a positive integer if provided. Defaults to + * the value of `maxSize` if provided. + */ + maxEntrySize?: Size; + /** + * A function that returns a number indicating the item's size. + * + * Requires {@link OptionsBase.maxSize} to be set. + * + * If not provided, and {@link OptionsBase.maxSize} or + * {@link OptionsBase.maxEntrySize} are set, then all + * {@link LRUCache#set} calls **must** provide an explicit + * {@link SetOptions.size} or sizeCalculation param. + */ + sizeCalculation?: SizeCalculator; + /** + * Method that provides the implementation for {@link LRUCache#fetch} + * + * ```ts + * fetchMethod(key, staleValue, { signal, options, context }) + * ``` + * + * If `fetchMethod` is not provided, then `cache.fetch(key)` is equivalent + * to `Promise.resolve(cache.get(key))`. + * + * If at any time, `signal.aborted` is set to `true`, or if the + * `signal.onabort` method is called, or if it emits an `'abort'` event + * which you can listen to with `addEventListener`, then that means that + * the fetch should be abandoned. This may be passed along to async + * functions aware of AbortController/AbortSignal behavior. + * + * The `fetchMethod` should **only** return `undefined` or a Promise + * resolving to `undefined` if the AbortController signaled an `abort` + * event. In all other cases, it should return or resolve to a value + * suitable for adding to the cache. + * + * The `options` object is a union of the options that may be provided to + * `set()` and `get()`. If they are modified, then that will result in + * modifying the settings to `cache.set()` when the value is resolved, and + * in the case of + * {@link OptionsBase.noDeleteOnFetchRejection} and + * {@link OptionsBase.allowStaleOnFetchRejection}, the handling of + * `fetchMethod` failures. + * + * For example, a DNS cache may update the TTL based on the value returned + * from a remote DNS server by changing `options.ttl` in the `fetchMethod`. + */ + fetchMethod?: Fetcher; + /** + * Method that provides the implementation for {@link LRUCache#memo} + */ + memoMethod?: Memoizer; + /** + * Set to true to suppress the deletion of stale data when a + * {@link OptionsBase.fetchMethod} returns a rejected promise. + */ + noDeleteOnFetchRejection?: boolean; + /** + * Do not delete stale items when they are retrieved with + * {@link LRUCache#get}. + * + * Note that the `get` return value will still be `undefined` + * unless {@link OptionsBase.allowStale} is true. + * + * When using time-expiring entries with `ttl`, by default stale + * items will be removed from the cache when the key is accessed + * with `cache.get()`. + * + * Setting this option will cause stale items to remain in the cache, until + * they are explicitly deleted with `cache.delete(key)`, or retrieved with + * `noDeleteOnStaleGet` set to `false`. + * + * This may be overridden by passing an options object to `cache.get()`. + * + * Only relevant if a ttl is used. + */ + noDeleteOnStaleGet?: boolean; + /** + * Set to true to allow returning stale data when a + * {@link OptionsBase.fetchMethod} throws an error or returns a rejected + * promise. + * + * This differs from using {@link OptionsBase.allowStale} in that stale + * data will ONLY be returned in the case that the {@link LRUCache#fetch} + * fails, not any other times. + * + * If a `fetchMethod` fails, and there is no stale value available, the + * `fetch()` will resolve to `undefined`. Ie, all `fetchMethod` errors are + * suppressed. + * + * Implies `noDeleteOnFetchRejection`. + * + * This may be set in calls to `fetch()`, or defaulted on the constructor, + * or overridden by modifying the options object in the `fetchMethod`. + */ + allowStaleOnFetchRejection?: boolean; + /** + * Set to true to return a stale value from the cache when the + * `AbortSignal` passed to the {@link OptionsBase.fetchMethod} dispatches + * an `'abort'` event, whether user-triggered, or due to internal cache + * behavior. + * + * Unless {@link OptionsBase.ignoreFetchAbort} is also set, the underlying + * {@link OptionsBase.fetchMethod} will still be considered canceled, and + * any value it returns will be ignored and not cached. + * + * Caveat: since fetches are aborted when a new value is explicitly + * set in the cache, this can lead to fetch returning a stale value, + * since that was the fallback value _at the moment the `fetch()` was + * initiated_, even though the new updated value is now present in + * the cache. + * + * For example: + * + * ```ts + * const cache = new LRUCache({ + * ttl: 100, + * fetchMethod: async (url, oldValue, { signal }) => { + * const res = await fetch(url, { signal }) + * return await res.json() + * } + * }) + * cache.set('https://example.com/', { some: 'data' }) + * // 100ms go by... + * const result = cache.fetch('https://example.com/') + * cache.set('https://example.com/', { other: 'thing' }) + * console.log(await result) // { some: 'data' } + * console.log(cache.get('https://example.com/')) // { other: 'thing' } + * ``` + */ + allowStaleOnFetchAbort?: boolean; + /** + * Set to true to ignore the `abort` event emitted by the `AbortSignal` + * object passed to {@link OptionsBase.fetchMethod}, and still cache the + * resulting resolution value, as long as it is not `undefined`. + * + * When used on its own, this means aborted {@link LRUCache#fetch} calls + * are not immediately resolved or rejected when they are aborted, and + * instead take the full time to await. + * + * When used with {@link OptionsBase.allowStaleOnFetchAbort}, aborted + * {@link LRUCache#fetch} calls will resolve immediately to their stale + * cached value or `undefined`, and will continue to process and eventually + * update the cache when they resolve, as long as the resulting value is + * not `undefined`, thus supporting a "return stale on timeout while + * refreshing" mechanism by passing `AbortSignal.timeout(n)` as the signal. + * + * For example: + * + * ```ts + * const c = new LRUCache({ + * ttl: 100, + * ignoreFetchAbort: true, + * allowStaleOnFetchAbort: true, + * fetchMethod: async (key, oldValue, { signal }) => { + * // note: do NOT pass the signal to fetch()! + * // let's say this fetch can take a long time. + * const res = await fetch(`https://slow-backend-server/${key}`) + * return await res.json() + * }, + * }) + * + * // this will return the stale value after 100ms, while still + * // updating in the background for next time. + * const val = await c.fetch('key', { signal: AbortSignal.timeout(100) }) + * ``` + * + * **Note**: regardless of this setting, an `abort` event _is still + * emitted on the `AbortSignal` object_, so may result in invalid results + * when passed to other underlying APIs that use AbortSignals. + * + * This may be overridden in the {@link OptionsBase.fetchMethod} or the + * call to {@link LRUCache#fetch}. + */ + ignoreFetchAbort?: boolean; + /** + * In some cases, you may want to swap out the performance/Date object + * used for TTL tracking. This should almost certainly NOT be done in + * production environments! + * + * This value defaults to `global.performance` if it has a `now()` method, + * or the `global.Date` object otherwise. + */ + perf?: Perf; + } + interface OptionsMaxLimit extends OptionsBase { + max: Count; + } + interface OptionsTTLLimit extends OptionsBase { + ttl: Milliseconds; + ttlAutopurge: boolean; + } + interface OptionsSizeLimit extends OptionsBase { + maxSize: Size; + } + /** + * The valid safe options for the {@link LRUCache} constructor + */ + type Options = OptionsMaxLimit | OptionsSizeLimit | OptionsTTLLimit; + /** + * Entry objects used by {@link LRUCache#load} and {@link LRUCache#dump}, + * and returned by {@link LRUCache#info}. + */ + interface Entry { + value: V; + ttl?: Milliseconds; + size?: Size; + start?: Milliseconds; + } +} +/** + * Default export, the thing you're using this module to get. + * + * The `K` and `V` types define the key and value types, respectively. The + * optional `FC` type defines the type of the `context` object passed to + * `cache.fetch()` and `cache.memo()`. + * + * Keys and values **must not** be `null` or `undefined`. + * + * All properties from the options object (with the exception of `max`, + * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are + * added as normal public members. (The listed options are read-only getters.) + * + * Changing any of these will alter the defaults for subsequent method calls. + */ +export declare class LRUCache { + #private; + /** + * {@link LRUCache.OptionsBase.perf} + */ + get perf(): Perf; + /** + * {@link LRUCache.OptionsBase.ttl} + */ + ttl: LRUCache.Milliseconds; + /** + * {@link LRUCache.OptionsBase.ttlResolution} + */ + ttlResolution: LRUCache.Milliseconds; + /** + * {@link LRUCache.OptionsBase.ttlAutopurge} + */ + ttlAutopurge: boolean; + /** + * {@link LRUCache.OptionsBase.updateAgeOnGet} + */ + updateAgeOnGet: boolean; + /** + * {@link LRUCache.OptionsBase.updateAgeOnHas} + */ + updateAgeOnHas: boolean; + /** + * {@link LRUCache.OptionsBase.allowStale} + */ + allowStale: boolean; + /** + * {@link LRUCache.OptionsBase.noDisposeOnSet} + */ + noDisposeOnSet: boolean; + /** + * {@link LRUCache.OptionsBase.noUpdateTTL} + */ + noUpdateTTL: boolean; + /** + * {@link LRUCache.OptionsBase.maxEntrySize} + */ + maxEntrySize: LRUCache.Size; + /** + * {@link LRUCache.OptionsBase.sizeCalculation} + */ + sizeCalculation?: LRUCache.SizeCalculator; + /** + * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection} + */ + noDeleteOnFetchRejection: boolean; + /** + * {@link LRUCache.OptionsBase.noDeleteOnStaleGet} + */ + noDeleteOnStaleGet: boolean; + /** + * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort} + */ + allowStaleOnFetchAbort: boolean; + /** + * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} + */ + allowStaleOnFetchRejection: boolean; + /** + * {@link LRUCache.OptionsBase.ignoreFetchAbort} + */ + ignoreFetchAbort: boolean; + /** {@link LRUCache.OptionsBase.backgroundFetchSize} */ + backgroundFetchSize: number; + /** + * Do not call this method unless you need to inspect the + * inner workings of the cache. If anything returned by this + * object is modified in any way, strange breakage may occur. + * + * These fields are private for a reason! + * + * @internal + */ + static unsafeExposeInternals(c: LRUCache): { + starts: ZeroArray | undefined; + ttls: ZeroArray | undefined; + autopurgeTimers: (NodeJS.Timeout | undefined)[] | undefined; + sizes: ZeroArray | undefined; + keyMap: Map; + keyList: (K | undefined)[]; + valList: (V | BackgroundFetch | undefined)[]; + next: NumberArray; + prev: NumberArray; + readonly head: Index; + readonly tail: Index; + free: StackLike; + isBackgroundFetch: (p: unknown) => p is BackgroundFetch; + backgroundFetch: (k: K, index: number | undefined, options: LRUCache.FetchOptions, context: unknown) => BackgroundFetch; + moveToTail: (index: number) => void; + indexes: (options?: { + allowStale: boolean; + }) => Generator; + rindexes: (options?: { + allowStale: boolean; + }) => Generator; + isStale: (index: number | undefined) => boolean; + }; + /** + * {@link LRUCache.OptionsBase.max} (read-only) + */ + get max(): LRUCache.Count; + /** + * {@link LRUCache.OptionsBase.maxSize} (read-only) + */ + get maxSize(): LRUCache.Count; + /** + * The total computed size of items in the cache (read-only) + */ + get calculatedSize(): LRUCache.Size; + /** + * The number of items stored in the cache (read-only) + */ + get size(): LRUCache.Count; + /** + * {@link LRUCache.OptionsBase.fetchMethod} (read-only) + */ + get fetchMethod(): LRUCache.Fetcher | undefined; + get memoMethod(): LRUCache.Memoizer | undefined; + /** + * {@link LRUCache.OptionsBase.dispose} (read-only) + */ + get dispose(): LRUCache.Disposer | undefined; + /** + * {@link LRUCache.OptionsBase.onInsert} (read-only) + */ + get onInsert(): LRUCache.Inserter | undefined; + /** + * {@link LRUCache.OptionsBase.disposeAfter} (read-only) + */ + get disposeAfter(): LRUCache.Disposer | undefined; + constructor(options: LRUCache.Options | LRUCache); + /** + * Return the number of ms left in the item's TTL. If item is not in cache, + * returns `0`. Returns `Infinity` if item is in cache without a defined TTL. + */ + getRemainingTTL(key: K): number; + /** + * Return a generator yielding `[key, value]` pairs, + * in order from most recently used to least recently used. + */ + entries(): Generator<[K, V], void, unknown>; + /** + * Inverse order version of {@link LRUCache.entries} + * + * Return a generator yielding `[key, value]` pairs, + * in order from least recently used to most recently used. + */ + rentries(): Generator<(K | V)[], void, unknown>; + /** + * Return a generator yielding the keys in the cache, + * in order from most recently used to least recently used. + */ + keys(): Generator; + /** + * Inverse order version of {@link LRUCache.keys} + * + * Return a generator yielding the keys in the cache, + * in order from least recently used to most recently used. + */ + rkeys(): Generator; + /** + * Return a generator yielding the values in the cache, + * in order from most recently used to least recently used. + */ + values(): Generator; + /** + * Inverse order version of {@link LRUCache.values} + * + * Return a generator yielding the values in the cache, + * in order from least recently used to most recently used. + */ + rvalues(): Generator; + /** + * Iterating over the cache itself yields the same results as + * {@link LRUCache.entries} + */ + [Symbol.iterator](): Generator<[K, V], void, unknown>; + /** + * A String value that is used in the creation of the default string + * description of an object. Called by the built-in method + * `Object.prototype.toString`. + */ + [Symbol.toStringTag]: string; + /** + * Find a value for which the supplied fn method returns a truthy value, + * similar to `Array.find()`. fn is called as `fn(value, key, cache)`. + */ + find(fn: (v: V, k: K, self: LRUCache) => boolean, getOptions?: LRUCache.GetOptions): V | undefined; + /** + * Call the supplied function on each item in the cache, in order from most + * recently used to least recently used. + * + * `fn` is called as `fn(value, key, cache)`. + * + * If `thisp` is provided, function will be called in the `this`-context of + * the provided object, or the cache if no `thisp` object is provided. + * + * Does not update age or recenty of use, or iterate over stale values. + */ + forEach(fn: (v: V, k: K, self: LRUCache) => unknown, thisp?: unknown): void; + /** + * The same as {@link LRUCache.forEach} but items are iterated over in + * reverse order. (ie, less recently used items are iterated over first.) + */ + rforEach(fn: (v: V, k: K, self: LRUCache) => unknown, thisp?: unknown): void; + /** + * Delete any stale entries. Returns true if anything was removed, + * false otherwise. + */ + purgeStale(): boolean; + /** + * Get the extended info about a given entry, to get its value, size, and + * TTL info simultaneously. Returns `undefined` if the key is not present. + * + * Unlike {@link LRUCache#dump}, which is designed to be portable and survive + * serialization, the `start` value is always the current timestamp, and the + * `ttl` is a calculated remaining time to live (negative if expired). + * + * Always returns stale values, if their info is found in the cache, so be + * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl}) + * if relevant. + */ + info(key: K): LRUCache.Entry | undefined; + /** + * Return an array of [key, {@link LRUCache.Entry}] tuples which can be + * passed to {@link LRUCache#load}. + * + * The `start` fields are calculated relative to a portable `Date.now()` + * timestamp, even if `performance.now()` is available. + * + * Stale entries are always included in the `dump`, even if + * {@link LRUCache.OptionsBase.allowStale} is false. + * + * Note: this returns an actual array, not a generator, so it can be more + * easily passed around. + */ + dump(): [K, LRUCache.Entry][]; + /** + * Reset the cache and load in the items in entries in the order listed. + * + * The shape of the resulting cache may be different if the same options are + * not used in both caches. + * + * The `start` fields are assumed to be calculated relative to a portable + * `Date.now()` timestamp, even if `performance.now()` is available. + */ + load(arr: [K, LRUCache.Entry][]): void; + /** + * Add a value to the cache. + * + * Note: if `undefined` is specified as a value, this is an alias for + * {@link LRUCache#delete} + * + * Fields on the {@link LRUCache.SetOptions} options param will override + * their corresponding values in the constructor options for the scope + * of this single `set()` operation. + * + * If `start` is provided, then that will set the effective start + * time for the TTL calculation. Note that this must be a previous + * value of `performance.now()` if supported, or a previous value of + * `Date.now()` if not. + * + * Options object may also include `size`, which will prevent + * calling the `sizeCalculation` function and just use the specified + * number if it is a positive integer, and `noDisposeOnSet` which + * will prevent calling a `dispose` function in the case of + * overwrites. + * + * If the `size` (or return value of `sizeCalculation`) for a given + * entry is greater than `maxEntrySize`, then the item will not be + * added to the cache. + * + * Will update the recency of the entry. + * + * If the value is `undefined`, then this is an alias for + * `cache.delete(key)`. `undefined` is never stored in the cache. + */ + set(k: K, v: V | undefined, setOptions?: LRUCache.SetOptions): this; + /** + * Evict the least recently used item, returning its value or + * `undefined` if cache is empty. + */ + pop(): V | undefined; + /** + * Check if a key is in the cache, without updating the recency of use. + * Will return false if the item is stale, even though it is technically + * in the cache. + * + * Check if a key is in the cache, without updating the recency of + * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set + * to `true` in either the options or the constructor. + * + * Will return `false` if the item is stale, even though it is technically in + * the cache. The difference can be determined (if it matters) by using a + * `status` argument, and inspecting the `has` field. + * + * Will not update item age unless + * {@link LRUCache.OptionsBase.updateAgeOnHas} is set. + */ + has(k: K, hasOptions?: LRUCache.HasOptions): boolean; + /** + * Like {@link LRUCache#get} but doesn't update recency or delete stale + * items. + * + * Returns `undefined` if the item is stale, unless + * {@link LRUCache.OptionsBase.allowStale} is set. + */ + peek(k: K, peekOptions?: LRUCache.PeekOptions): V | undefined; + /** + * Make an asynchronous cached fetch using the + * {@link LRUCache.OptionsBase.fetchMethod} function. + * + * If the value is in the cache and not stale, then the returned + * Promise resolves to the value. + * + * If not in the cache, or beyond its TTL staleness, then + * `fetchMethod(key, staleValue, { options, signal, context })` is + * called, and the value returned will be added to the cache once + * resolved. + * + * If called with `allowStale`, and an asynchronous fetch is + * currently in progress to reload a stale value, then the former + * stale value will be returned. + * + * If called with `forceRefresh`, then the cached item will be + * re-fetched, even if it is not stale. However, if `allowStale` is also + * set, then the old value will still be returned. This is useful + * in cases where you want to force a reload of a cached value. If + * a background fetch is already in progress, then `forceRefresh` + * has no effect. + * + * If multiple fetches for the same key are issued, then they will all be + * coalesced into a single call to fetchMethod. + * + * Note that this means that handling options such as + * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}, + * {@link LRUCache.FetchOptions.signal}, + * and {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} will be + * determined by the FIRST fetch() call for a given key. + * + * This is a known (fixable) shortcoming which will be addresed on when + * someone complains about it, as the fix would involve added complexity and + * may not be worth the costs for this edge case. + * + * If {@link LRUCache.OptionsBase.fetchMethod} is not specified, then this is + * effectively an alias for `Promise.resolve(cache.get(key))`. + * + * When the fetch method resolves to a value, if the fetch has not + * been aborted due to deletion, eviction, or being overwritten, + * then it is added to the cache using the options provided. + * + * If the key is evicted or deleted before the `fetchMethod` + * resolves, then the AbortSignal passed to the `fetchMethod` will + * receive an `abort` event, and the promise returned by `fetch()` + * will reject with the reason for the abort. + * + * If a `signal` is passed to the `fetch()` call, then aborting the + * signal will abort the fetch and cause the `fetch()` promise to + * reject with the reason provided. + * + * **Setting `context`** + * + * If an `FC` type is set to a type other than `unknown`, `void`, or + * `undefined` in the {@link LRUCache} constructor, then all + * calls to `cache.fetch()` _must_ provide a `context` option. If + * set to `undefined` or `void`, then calls to fetch _must not_ + * provide a `context` option. + * + * The `context` param allows you to provide arbitrary data that + * might be relevant in the course of fetching the data. It is only + * relevant for the course of a single `fetch()` operation, and + * discarded afterwards. + * + * **Note: `fetch()` calls are inflight-unique** + * + * If you call `fetch()` multiple times with the same key value, + * then every call after the first will resolve on the same + * promise1, + * _even if they have different settings that would otherwise change + * the behavior of the fetch_, such as `noDeleteOnFetchRejection` + * or `ignoreFetchAbort`. + * + * In most cases, this is not a problem (in fact, only fetching + * something once is what you probably want, if you're caching in + * the first place). If you are changing the fetch() options + * dramatically between runs, there's a good chance that you might + * be trying to fit divergent semantics into a single object, and + * would be better off with multiple cache instances. + * + * **1**: Ie, they're not the "same Promise", but they resolve at + * the same time, because they're both waiting on the same + * underlying fetchMethod response. + */ + fetch(k: K, fetchOptions: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : LRUCache.FetchOptionsWithContext): Promise; + fetch(k: unknown extends FC ? K : FC extends undefined | void ? K : never, fetchOptions?: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : never): Promise; + /** + * In some cases, `cache.fetch()` may resolve to `undefined`, either because + * a {@link LRUCache.OptionsBase#fetchMethod} was not provided (turning + * `cache.fetch(k)` into just an async wrapper around `cache.get(k)`) or + * because `ignoreFetchAbort` was specified (either to the constructor or + * in the {@link LRUCache.FetchOptions}). Also, the + * {@link LRUCache.OptionsBase.fetchMethod} may return `undefined` or `void`, making + * the test even more complicated. + * + * Because inferring the cases where `undefined` might be returned are so + * cumbersome, but testing for `undefined` can also be annoying, this method + * can be used, which will reject if `this.fetch()` resolves to undefined. + */ + forceFetch(k: K, fetchOptions: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : LRUCache.FetchOptionsWithContext): Promise; + forceFetch(k: unknown extends FC ? K : FC extends undefined | void ? K : never, fetchOptions?: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : never): Promise; + /** + * If the key is found in the cache, then this is equivalent to + * {@link LRUCache#get}. If not, in the cache, then calculate the value using + * the {@link LRUCache.OptionsBase.memoMethod}, and add it to the cache. + * + * If an `FC` type is set to a type other than `unknown`, `void`, or + * `undefined` in the LRUCache constructor, then all calls to `cache.memo()` + * _must_ provide a `context` option. If set to `undefined` or `void`, then + * calls to memo _must not_ provide a `context` option. + * + * The `context` param allows you to provide arbitrary data that might be + * relevant in the course of fetching the data. It is only relevant for the + * course of a single `memo()` operation, and discarded afterwards. + */ + memo(k: K, memoOptions: unknown extends FC ? LRUCache.MemoOptions : FC extends undefined | void ? LRUCache.MemoOptionsNoContext : LRUCache.MemoOptionsWithContext): V; + memo(k: unknown extends FC ? K : FC extends undefined | void ? K : never, memoOptions?: unknown extends FC ? LRUCache.MemoOptions : FC extends undefined | void ? LRUCache.MemoOptionsNoContext : never): V; + /** + * Return a value from the cache. Will update the recency of the cache + * entry found. + * + * If the key is not found, get() will return `undefined`. + */ + get(k: K, getOptions?: LRUCache.GetOptions): V | undefined; + /** + * Deletes a key out of the cache. + * + * Returns true if the key was deleted, false otherwise. + */ + delete(k: K): boolean; + /** + * Clear the cache entirely, throwing away all values. + */ + clear(): void; +} +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/browser/index.d.ts.map b/node_modules/lru-cache/dist/commonjs/browser/index.d.ts.map new file mode 100644 index 00000000..fa98a0f5 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/browser/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/browser/index.js b/node_modules/lru-cache/dist/commonjs/browser/index.js new file mode 100644 index 00000000..179694b1 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/browser/index.js @@ -0,0 +1,1726 @@ +"use strict"; +/** + * @module LRUCache + */ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.LRUCache = void 0; +const diagnostics_channel_js_1 = require("./diagnostics-channel.js"); +const perf_js_1 = require("./perf.js"); +const hasSubscribers = () => diagnostics_channel_js_1.metrics.hasSubscribers || diagnostics_channel_js_1.tracing.hasSubscribers; +const warned = new Set(); +/* c8 ignore start */ +const PROCESS = (typeof process === 'object' && !!process ? + process + : {}); +/* c8 ignore stop */ +const emitWarning = (msg, type, code, fn) => { + if (typeof PROCESS.emitWarning === 'function') { + PROCESS.emitWarning(msg, type, code, fn); + } + else { + //oxlint-disable-next-line no-console + console.error(`[${code}] ${type}: ${msg}`); + } +}; +const shouldWarn = (code) => !warned.has(code); +const TYPE = Symbol('type'); +const isPosInt = (n) => !!n && n === Math.floor(n) && n > 0 && isFinite(n); +// This is a little bit ridiculous, tbh. +// The maximum array length is 2^32-1 or thereabouts on most JS impls. +// And well before that point, you're caching the entire world, I mean, +// that's ~32GB of just integers for the next/prev links, plus whatever +// else to hold that many keys and values. Just filling the memory with +// zeroes at init time is brutal when you get that big. +// But why not be complete? +// Maybe in the future, these limits will have expanded. +/* c8 ignore start */ +const getUintArray = (max) => !isPosInt(max) ? null + : max <= Math.pow(2, 8) ? Uint8Array + : max <= Math.pow(2, 16) ? Uint16Array + : max <= Math.pow(2, 32) ? Uint32Array + : max <= Number.MAX_SAFE_INTEGER ? ZeroArray + : null; +/* c8 ignore stop */ +class ZeroArray extends Array { + constructor(size) { + super(size); + this.fill(0); + } +} +class Stack { + /* c8 ignore start - not sure why this is showing up uncovered?? */ + heap; + /* c8 ignore stop */ + length; + // private constructor + static #constructing = false; + static create(max) { + const HeapCls = getUintArray(max); + if (!HeapCls) + return []; + Stack.#constructing = true; + const s = new Stack(max, HeapCls); + Stack.#constructing = false; + return s; + } + constructor(max, HeapCls) { + /* c8 ignore start */ + if (!Stack.#constructing) { + throw new TypeError('instantiate Stack using Stack.create(n)'); + } + /* c8 ignore stop */ + this.heap = new HeapCls(max); + this.length = 0; + } + push(n) { + this.heap[this.length++] = n; + } + pop() { + return this.heap[--this.length]; + } +} +/** + * Default export, the thing you're using this module to get. + * + * The `K` and `V` types define the key and value types, respectively. The + * optional `FC` type defines the type of the `context` object passed to + * `cache.fetch()` and `cache.memo()`. + * + * Keys and values **must not** be `null` or `undefined`. + * + * All properties from the options object (with the exception of `max`, + * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are + * added as normal public members. (The listed options are read-only getters.) + * + * Changing any of these will alter the defaults for subsequent method calls. + */ +class LRUCache { + // options that cannot be changed without disaster + #max; + #maxSize; + #dispose; + #onInsert; + #disposeAfter; + #fetchMethod; + #memoMethod; + #perf; + /** + * {@link LRUCache.OptionsBase.perf} + */ + get perf() { + return this.#perf; + } + /** + * {@link LRUCache.OptionsBase.ttl} + */ + ttl; + /** + * {@link LRUCache.OptionsBase.ttlResolution} + */ + ttlResolution; + /** + * {@link LRUCache.OptionsBase.ttlAutopurge} + */ + ttlAutopurge; + /** + * {@link LRUCache.OptionsBase.updateAgeOnGet} + */ + updateAgeOnGet; + /** + * {@link LRUCache.OptionsBase.updateAgeOnHas} + */ + updateAgeOnHas; + /** + * {@link LRUCache.OptionsBase.allowStale} + */ + allowStale; + /** + * {@link LRUCache.OptionsBase.noDisposeOnSet} + */ + noDisposeOnSet; + /** + * {@link LRUCache.OptionsBase.noUpdateTTL} + */ + noUpdateTTL; + /** + * {@link LRUCache.OptionsBase.maxEntrySize} + */ + maxEntrySize; + /** + * {@link LRUCache.OptionsBase.sizeCalculation} + */ + sizeCalculation; + /** + * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection} + */ + noDeleteOnFetchRejection; + /** + * {@link LRUCache.OptionsBase.noDeleteOnStaleGet} + */ + noDeleteOnStaleGet; + /** + * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort} + */ + allowStaleOnFetchAbort; + /** + * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} + */ + allowStaleOnFetchRejection; + /** + * {@link LRUCache.OptionsBase.ignoreFetchAbort} + */ + ignoreFetchAbort; + /** {@link LRUCache.OptionsBase.backgroundFetchSize} */ + backgroundFetchSize; + // computed properties + #size; + #calculatedSize; + #keyMap; + #keyList; + #valList; + #next; + #prev; + #head; + #tail; + #free; + #disposed; + #sizes; + #starts; + #ttls; + #autopurgeTimers; + #hasDispose; + #hasFetchMethod; + #hasDisposeAfter; + #hasOnInsert; + /** + * Do not call this method unless you need to inspect the + * inner workings of the cache. If anything returned by this + * object is modified in any way, strange breakage may occur. + * + * These fields are private for a reason! + * + * @internal + */ + static unsafeExposeInternals(c) { + return { + // properties + starts: c.#starts, + ttls: c.#ttls, + autopurgeTimers: c.#autopurgeTimers, + sizes: c.#sizes, + keyMap: c.#keyMap, + keyList: c.#keyList, + valList: c.#valList, + next: c.#next, + prev: c.#prev, + get head() { + return c.#head; + }, + get tail() { + return c.#tail; + }, + free: c.#free, + // methods + isBackgroundFetch: (p) => c.#isBackgroundFetch(p), + backgroundFetch: (k, index, options, context) => c.#backgroundFetch(k, index, options, context), + moveToTail: (index) => c.#moveToTail(index), + indexes: (options) => c.#indexes(options), + rindexes: (options) => c.#rindexes(options), + isStale: (index) => c.#isStale(index), + }; + } + // Protected read-only members + /** + * {@link LRUCache.OptionsBase.max} (read-only) + */ + get max() { + return this.#max; + } + /** + * {@link LRUCache.OptionsBase.maxSize} (read-only) + */ + get maxSize() { + return this.#maxSize; + } + /** + * The total computed size of items in the cache (read-only) + */ + get calculatedSize() { + return this.#calculatedSize; + } + /** + * The number of items stored in the cache (read-only) + */ + get size() { + return this.#size; + } + /** + * {@link LRUCache.OptionsBase.fetchMethod} (read-only) + */ + get fetchMethod() { + return this.#fetchMethod; + } + get memoMethod() { + return this.#memoMethod; + } + /** + * {@link LRUCache.OptionsBase.dispose} (read-only) + */ + get dispose() { + return this.#dispose; + } + /** + * {@link LRUCache.OptionsBase.onInsert} (read-only) + */ + get onInsert() { + return this.#onInsert; + } + /** + * {@link LRUCache.OptionsBase.disposeAfter} (read-only) + */ + get disposeAfter() { + return this.#disposeAfter; + } + constructor(options) { + const { max = 0, ttl, ttlResolution = 1, ttlAutopurge, updateAgeOnGet, updateAgeOnHas, allowStale, dispose, onInsert, disposeAfter, noDisposeOnSet, noUpdateTTL, maxSize = 0, maxEntrySize = 0, sizeCalculation, fetchMethod, memoMethod, noDeleteOnFetchRejection, noDeleteOnStaleGet, allowStaleOnFetchRejection, allowStaleOnFetchAbort, ignoreFetchAbort, backgroundFetchSize = 1, perf, } = options; + this.backgroundFetchSize = backgroundFetchSize; + if (perf !== undefined) { + if (typeof perf?.now !== 'function') { + throw new TypeError('perf option must have a now() method if specified'); + } + } + this.#perf = perf ?? perf_js_1.defaultPerf; + if (max !== 0 && !isPosInt(max)) { + throw new TypeError('max option must be a nonnegative integer'); + } + const UintArray = max ? getUintArray(max) : Array; + if (!UintArray) { + throw new Error('invalid max value: ' + max); + } + this.#max = max; + this.#maxSize = maxSize; + this.maxEntrySize = maxEntrySize || this.#maxSize; + this.sizeCalculation = sizeCalculation; + if (this.sizeCalculation) { + if (!this.#maxSize && !this.maxEntrySize) { + throw new TypeError('cannot set sizeCalculation without setting maxSize or maxEntrySize'); + } + if (typeof this.sizeCalculation !== 'function') { + throw new TypeError('sizeCalculation set to non-function'); + } + } + if (memoMethod !== undefined && typeof memoMethod !== 'function') { + throw new TypeError('memoMethod must be a function if defined'); + } + this.#memoMethod = memoMethod; + if (fetchMethod !== undefined && typeof fetchMethod !== 'function') { + throw new TypeError('fetchMethod must be a function if specified'); + } + this.#fetchMethod = fetchMethod; + this.#hasFetchMethod = !!fetchMethod; + this.#keyMap = new Map(); + this.#keyList = Array.from({ length: max }).fill(undefined); + this.#valList = Array.from({ length: max }).fill(undefined); + this.#next = new UintArray(max); + this.#prev = new UintArray(max); + this.#head = 0; + this.#tail = 0; + this.#free = Stack.create(max); + this.#size = 0; + this.#calculatedSize = 0; + if (typeof dispose === 'function') { + this.#dispose = dispose; + } + if (typeof onInsert === 'function') { + this.#onInsert = onInsert; + } + if (typeof disposeAfter === 'function') { + this.#disposeAfter = disposeAfter; + this.#disposed = []; + } + else { + this.#disposeAfter = undefined; + this.#disposed = undefined; + } + this.#hasDispose = !!this.#dispose; + this.#hasOnInsert = !!this.#onInsert; + this.#hasDisposeAfter = !!this.#disposeAfter; + this.noDisposeOnSet = !!noDisposeOnSet; + this.noUpdateTTL = !!noUpdateTTL; + this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection; + this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection; + this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort; + this.ignoreFetchAbort = !!ignoreFetchAbort; + // NB: maxEntrySize is set to maxSize if it's set + if (this.maxEntrySize !== 0) { + if (this.#maxSize !== 0) { + if (!isPosInt(this.#maxSize)) { + throw new TypeError('maxSize must be a positive integer if specified'); + } + } + if (!isPosInt(this.maxEntrySize)) { + throw new TypeError('maxEntrySize must be a positive integer if specified'); + } + this.#initializeSizeTracking(); + } + this.allowStale = !!allowStale; + this.noDeleteOnStaleGet = !!noDeleteOnStaleGet; + this.updateAgeOnGet = !!updateAgeOnGet; + this.updateAgeOnHas = !!updateAgeOnHas; + this.ttlResolution = + isPosInt(ttlResolution) || ttlResolution === 0 ? ttlResolution : 1; + this.ttlAutopurge = !!ttlAutopurge; + this.ttl = ttl || 0; + if (this.ttl) { + if (!isPosInt(this.ttl)) { + throw new TypeError('ttl must be a positive integer if specified'); + } + this.#initializeTTLTracking(); + } + // do not allow completely unbounded caches + if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) { + throw new TypeError('At least one of max, maxSize, or ttl is required'); + } + if (!this.ttlAutopurge && !this.#max && !this.#maxSize) { + const code = 'LRU_CACHE_UNBOUNDED'; + if (shouldWarn(code)) { + warned.add(code); + const msg = 'TTL caching without ttlAutopurge, max, or maxSize can ' + + 'result in unbounded memory consumption.'; + emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache); + } + } + } + /** + * Return the number of ms left in the item's TTL. If item is not in cache, + * returns `0`. Returns `Infinity` if item is in cache without a defined TTL. + */ + getRemainingTTL(key) { + return this.#keyMap.has(key) ? Infinity : 0; + } + #initializeTTLTracking() { + const ttls = new ZeroArray(this.#max); + const starts = new ZeroArray(this.#max); + this.#ttls = ttls; + this.#starts = starts; + const purgeTimers = this.ttlAutopurge ? + Array.from({ + length: this.#max, + }) + : undefined; + this.#autopurgeTimers = purgeTimers; + this.#setItemTTL = (index, ttl, start = this.#perf.now()) => { + starts[index] = ttl !== 0 ? start : 0; + ttls[index] = ttl; + setPurgetTimer(index, ttl); + }; + this.#updateItemAge = index => { + starts[index] = ttls[index] !== 0 ? this.#perf.now() : 0; + setPurgetTimer(index, ttls[index]); + }; + // clear out the purge timer if we're setting TTL to 0, and + // previously had a ttl purge timer running, so it doesn't + // fire unnecessarily. Don't need to do this if we're not doing + // autopurge. + const setPurgetTimer = !this.ttlAutopurge ? + () => { } + : (index, ttl) => { + if (purgeTimers?.[index]) { + clearTimeout(purgeTimers[index]); + purgeTimers[index] = undefined; + } + if (ttl && ttl !== 0 && purgeTimers) { + const t = setTimeout(() => { + if (this.#isStale(index)) { + this.#delete(this.#keyList[index], 'expire'); + } + }, ttl + 1); + // unref() not supported on all platforms + /* c8 ignore start */ + if (t.unref) { + t.unref(); + } + /* c8 ignore stop */ + purgeTimers[index] = t; + } + }; + this.#statusTTL = (status, index) => { + if (ttls[index]) { + const ttl = ttls[index]; + const start = starts[index]; + /* c8 ignore start */ + if (!ttl || !start) { + return; + } + /* c8 ignore stop */ + status.ttl = ttl; + status.start = start; + status.now = cachedNow || getNow(); + const age = status.now - start; + status.remainingTTL = ttl - age; + } + }; + // debounce calls to perf.now() to 1s so we're not hitting + // that costly call repeatedly. + let cachedNow = 0; + const getNow = () => { + const n = this.#perf.now(); + if (this.ttlResolution > 0) { + cachedNow = n; + const t = setTimeout(() => (cachedNow = 0), this.ttlResolution); + // not available on all platforms + /* c8 ignore start */ + if (t.unref) { + t.unref(); + } + /* c8 ignore stop */ + } + return n; + }; + this.getRemainingTTL = key => { + const index = this.#keyMap.get(key); + if (index === undefined) { + return 0; + } + const ttl = ttls[index]; + const start = starts[index]; + if (!ttl || !start) { + return Infinity; + } + const age = (cachedNow || getNow()) - start; + return ttl - age; + }; + this.#isStale = index => { + const s = starts[index]; + const t = ttls[index]; + return !!t && !!s && (cachedNow || getNow()) - s > t; + }; + } + // conditionally set private methods related to TTL + #updateItemAge = () => { }; + #statusTTL = () => { }; + #setItemTTL = () => { }; + /* c8 ignore stop */ + #isStale = () => false; + #initializeSizeTracking() { + const sizes = new ZeroArray(this.#max); + this.#calculatedSize = 0; + this.#sizes = sizes; + this.#removeItemSize = index => { + this.#calculatedSize -= sizes[index]; + sizes[index] = 0; + }; + this.#requireSize = (k, v, size, sizeCalculation) => { + if (!isPosInt(size)) { + // provisionally accept background fetches. + // actual value size will be checked when they return. + if (this.#isBackgroundFetch(v)) { + // NB: this cannot occur if v.__staleWhileFetching is set, + // because in that case, it would take on the size of the + // existing entry that it temporarily replaces. + return this.backgroundFetchSize; + } + if (sizeCalculation) { + if (typeof sizeCalculation !== 'function') { + throw new TypeError('sizeCalculation must be a function'); + } + size = sizeCalculation(v, k); + if (!isPosInt(size)) { + throw new TypeError('sizeCalculation return invalid (expect positive integer)'); + } + } + else { + throw new TypeError('invalid size value (must be positive integer). ' + + 'When maxSize or maxEntrySize is used, sizeCalculation ' + + 'or size must be set.'); + } + } + return size; + }; + this.#addItemSize = (index, size, status) => { + sizes[index] = size; + if (this.#maxSize) { + const maxSize = this.#maxSize - sizes[index]; + while (this.#calculatedSize > maxSize) { + this.#evict(true); + } + } + this.#calculatedSize += sizes[index]; + if (status) { + status.entrySize = size; + status.totalCalculatedSize = this.#calculatedSize; + } + }; + } + #removeItemSize = _i => { }; + #addItemSize = (_i, _s, _st) => { }; + #requireSize = (_k, _v, size, sizeCalculation) => { + if (size || sizeCalculation) { + throw new TypeError('cannot set size without setting maxSize or maxEntrySize on cache'); + } + return 0; + }; + *#indexes({ allowStale = this.allowStale } = {}) { + if (this.#size) { + for (let i = this.#tail; this.#isValidIndex(i);) { + if (allowStale || !this.#isStale(i)) { + yield i; + } + if (i === this.#head) { + break; + } + else { + i = this.#prev[i]; + } + } + } + } + *#rindexes({ allowStale = this.allowStale } = {}) { + if (this.#size) { + for (let i = this.#head; this.#isValidIndex(i);) { + if (allowStale || !this.#isStale(i)) { + yield i; + } + if (i === this.#tail) { + break; + } + else { + i = this.#next[i]; + } + } + } + } + #isValidIndex(index) { + return (index !== undefined && + this.#keyMap.get(this.#keyList[index]) === index); + } + /** + * Return a generator yielding `[key, value]` pairs, + * in order from most recently used to least recently used. + */ + *entries() { + for (const i of this.#indexes()) { + if (this.#valList[i] !== undefined && + this.#keyList[i] !== undefined && + !this.#isBackgroundFetch(this.#valList[i])) { + yield [this.#keyList[i], this.#valList[i]]; + } + } + } + /** + * Inverse order version of {@link LRUCache.entries} + * + * Return a generator yielding `[key, value]` pairs, + * in order from least recently used to most recently used. + */ + *rentries() { + for (const i of this.#rindexes()) { + if (this.#valList[i] !== undefined && + this.#keyList[i] !== undefined && + !this.#isBackgroundFetch(this.#valList[i])) { + yield [this.#keyList[i], this.#valList[i]]; + } + } + } + /** + * Return a generator yielding the keys in the cache, + * in order from most recently used to least recently used. + */ + *keys() { + for (const i of this.#indexes()) { + const k = this.#keyList[i]; + if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield k; + } + } + } + /** + * Inverse order version of {@link LRUCache.keys} + * + * Return a generator yielding the keys in the cache, + * in order from least recently used to most recently used. + */ + *rkeys() { + for (const i of this.#rindexes()) { + const k = this.#keyList[i]; + if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield k; + } + } + } + /** + * Return a generator yielding the values in the cache, + * in order from most recently used to least recently used. + */ + *values() { + for (const i of this.#indexes()) { + const v = this.#valList[i]; + if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield this.#valList[i]; + } + } + } + /** + * Inverse order version of {@link LRUCache.values} + * + * Return a generator yielding the values in the cache, + * in order from least recently used to most recently used. + */ + *rvalues() { + for (const i of this.#rindexes()) { + const v = this.#valList[i]; + if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield this.#valList[i]; + } + } + } + /** + * Iterating over the cache itself yields the same results as + * {@link LRUCache.entries} + */ + [Symbol.iterator]() { + return this.entries(); + } + /** + * A String value that is used in the creation of the default string + * description of an object. Called by the built-in method + * `Object.prototype.toString`. + */ + [Symbol.toStringTag] = 'LRUCache'; + /** + * Find a value for which the supplied fn method returns a truthy value, + * similar to `Array.find()`. fn is called as `fn(value, key, cache)`. + */ + find(fn, getOptions = {}) { + for (const i of this.#indexes()) { + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined) + continue; + if (fn(value, this.#keyList[i], this)) { + return this.#get(this.#keyList[i], getOptions); + } + } + } + /** + * Call the supplied function on each item in the cache, in order from most + * recently used to least recently used. + * + * `fn` is called as `fn(value, key, cache)`. + * + * If `thisp` is provided, function will be called in the `this`-context of + * the provided object, or the cache if no `thisp` object is provided. + * + * Does not update age or recenty of use, or iterate over stale values. + */ + forEach(fn, thisp = this) { + for (const i of this.#indexes()) { + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined) + continue; + fn.call(thisp, value, this.#keyList[i], this); + } + } + /** + * The same as {@link LRUCache.forEach} but items are iterated over in + * reverse order. (ie, less recently used items are iterated over first.) + */ + rforEach(fn, thisp = this) { + for (const i of this.#rindexes()) { + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined) + continue; + fn.call(thisp, value, this.#keyList[i], this); + } + } + /** + * Delete any stale entries. Returns true if anything was removed, + * false otherwise. + */ + purgeStale() { + let deleted = false; + for (const i of this.#rindexes({ allowStale: true })) { + if (this.#isStale(i)) { + this.#delete(this.#keyList[i], 'expire'); + deleted = true; + } + } + return deleted; + } + /** + * Get the extended info about a given entry, to get its value, size, and + * TTL info simultaneously. Returns `undefined` if the key is not present. + * + * Unlike {@link LRUCache#dump}, which is designed to be portable and survive + * serialization, the `start` value is always the current timestamp, and the + * `ttl` is a calculated remaining time to live (negative if expired). + * + * Always returns stale values, if their info is found in the cache, so be + * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl}) + * if relevant. + */ + info(key) { + const i = this.#keyMap.get(key); + if (i === undefined) + return undefined; + const v = this.#valList[i]; + /* c8 ignore start - this isn't tested for the info function, + * but it's the same logic as found in other places. */ + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined) + return undefined; + /* c8 ignore stop */ + const entry = { value }; + if (this.#ttls && this.#starts) { + const ttl = this.#ttls[i]; + const start = this.#starts[i]; + if (ttl && start) { + const remain = ttl - (this.#perf.now() - start); + entry.ttl = remain; + entry.start = Date.now(); + } + } + if (this.#sizes) { + entry.size = this.#sizes[i]; + } + return entry; + } + /** + * Return an array of [key, {@link LRUCache.Entry}] tuples which can be + * passed to {@link LRUCache#load}. + * + * The `start` fields are calculated relative to a portable `Date.now()` + * timestamp, even if `performance.now()` is available. + * + * Stale entries are always included in the `dump`, even if + * {@link LRUCache.OptionsBase.allowStale} is false. + * + * Note: this returns an actual array, not a generator, so it can be more + * easily passed around. + */ + dump() { + const arr = []; + for (const i of this.#indexes({ allowStale: true })) { + const key = this.#keyList[i]; + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined || key === undefined) + continue; + const entry = { value }; + if (this.#ttls && this.#starts) { + entry.ttl = this.#ttls[i]; + // always dump the start relative to a portable timestamp + // it's ok for this to be a bit slow, it's a rare operation. + const age = this.#perf.now() - this.#starts[i]; + entry.start = Math.floor(Date.now() - age); + } + if (this.#sizes) { + entry.size = this.#sizes[i]; + } + arr.unshift([key, entry]); + } + return arr; + } + /** + * Reset the cache and load in the items in entries in the order listed. + * + * The shape of the resulting cache may be different if the same options are + * not used in both caches. + * + * The `start` fields are assumed to be calculated relative to a portable + * `Date.now()` timestamp, even if `performance.now()` is available. + */ + load(arr) { + this.clear(); + for (const [key, entry] of arr) { + if (entry.start) { + // entry.start is a portable timestamp, but we may be using + // node's performance.now(), so calculate the offset, so that + // we get the intended remaining TTL, no matter how long it's + // been on ice. + // + // it's ok for this to be a bit slow, it's a rare operation. + const age = Date.now() - entry.start; + entry.start = this.#perf.now() - age; + } + this.#set(key, entry.value, entry); + } + } + /** + * Add a value to the cache. + * + * Note: if `undefined` is specified as a value, this is an alias for + * {@link LRUCache#delete} + * + * Fields on the {@link LRUCache.SetOptions} options param will override + * their corresponding values in the constructor options for the scope + * of this single `set()` operation. + * + * If `start` is provided, then that will set the effective start + * time for the TTL calculation. Note that this must be a previous + * value of `performance.now()` if supported, or a previous value of + * `Date.now()` if not. + * + * Options object may also include `size`, which will prevent + * calling the `sizeCalculation` function and just use the specified + * number if it is a positive integer, and `noDisposeOnSet` which + * will prevent calling a `dispose` function in the case of + * overwrites. + * + * If the `size` (or return value of `sizeCalculation`) for a given + * entry is greater than `maxEntrySize`, then the item will not be + * added to the cache. + * + * Will update the recency of the entry. + * + * If the value is `undefined`, then this is an alias for + * `cache.delete(key)`. `undefined` is never stored in the cache. + */ + set(k, v, setOptions = {}) { + const { status = diagnostics_channel_js_1.metrics.hasSubscribers ? {} : undefined } = setOptions; + setOptions.status = status; + if (status) { + status.op = 'set'; + status.key = k; + if (v !== undefined) + status.value = v; + status.cache = this; + } + const result = this.#set(k, v, setOptions); + if (status && diagnostics_channel_js_1.metrics.hasSubscribers) { + diagnostics_channel_js_1.metrics.publish(status); + } + return result; + } + #set(k, v, setOptions, bf) { + const { ttl = this.ttl, start, noDisposeOnSet = this.noDisposeOnSet, sizeCalculation = this.sizeCalculation, status, } = setOptions; + const isBF = this.#isBackgroundFetch(v); + if (v === undefined) { + if (status) + status.set = 'deleted'; + this.delete(k); + return this; + } + let { noUpdateTTL = this.noUpdateTTL } = setOptions; + if (status && !isBF) + status.value = v; + const size = this.#requireSize(k, v, setOptions.size || 0, sizeCalculation, status); + // if the item doesn't fit, don't do anything + // NB: maxEntrySize set to maxSize by default + if (this.maxEntrySize && size > this.maxEntrySize) { + // have to delete, in case something is there already. + this.#delete(k, 'set'); + if (status) { + status.set = 'miss'; + status.maxEntrySizeExceeded = true; + } + return this; + } + let index = this.#size === 0 ? undefined : this.#keyMap.get(k); + if (index === undefined) { + // addition + index = (this.#size === 0 ? this.#tail + : this.#free.length !== 0 ? this.#free.pop() + : this.#size === this.#max ? this.#evict(false) + : this.#size); + this.#keyList[index] = k; + this.#valList[index] = v; + this.#keyMap.set(k, index); + this.#next[this.#tail] = index; + this.#prev[index] = this.#tail; + this.#tail = index; + this.#size++; + this.#addItemSize(index, size, status); + if (status) + status.set = 'add'; + noUpdateTTL = false; + if (this.#hasOnInsert && !isBF) { + this.#onInsert?.(v, k, 'add'); + } + } + else { + // update + // might be updating a background fetch! + this.#moveToTail(index); + const oldVal = this.#valList[index]; + if (v !== oldVal) { + if (!noDisposeOnSet) { + if (this.#isBackgroundFetch(oldVal)) { + if (oldVal !== bf) { + // setting over a background fetch, not merely resolving it. + oldVal.__abortController.abort(new Error('replaced')); + } + const { __staleWhileFetching: s } = oldVal; + if (s !== undefined && s !== v) { + if (this.#hasDispose) { + this.#dispose?.(s, k, 'set'); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([s, k, 'set']); + } + } + } + else { + if (this.#hasDispose) { + this.#dispose?.(oldVal, k, 'set'); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([oldVal, k, 'set']); + } + } + } + this.#removeItemSize(index); + this.#addItemSize(index, size, status); + this.#valList[index] = v; + if (!isBF) { + const oldValue = oldVal && this.#isBackgroundFetch(oldVal) ? + oldVal.__staleWhileFetching + : oldVal; + const setType = oldValue === undefined ? 'add' + : v !== oldValue ? 'replace' + : 'update'; + if (status) { + status.set = setType; + if (oldValue !== undefined) + status.oldValue = oldValue; + } + if (this.#hasOnInsert) { + this.onInsert?.(v, k, setType); + } + } + } + else if (!isBF) { + if (status) { + status.set = 'update'; + } + if (this.#hasOnInsert) { + this.onInsert?.(v, k, 'update'); + } + } + } + if (ttl !== 0 && !this.#ttls) { + this.#initializeTTLTracking(); + } + if (this.#ttls) { + if (!noUpdateTTL) { + this.#setItemTTL(index, ttl, start); + } + if (status) + this.#statusTTL(status, index); + } + if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) { + const dt = this.#disposed; + let task; + while ((task = dt?.shift())) { + this.#disposeAfter?.(...task); + } + } + return this; + } + /** + * Evict the least recently used item, returning its value or + * `undefined` if cache is empty. + */ + pop() { + try { + while (this.#size) { + const val = this.#valList[this.#head]; + this.#evict(true); + if (this.#isBackgroundFetch(val)) { + if (val.__staleWhileFetching) { + return val.__staleWhileFetching; + } + } + else if (val !== undefined) { + return val; + } + } + } + finally { + if (this.#hasDisposeAfter && this.#disposed) { + const dt = this.#disposed; + let task; + while ((task = dt?.shift())) { + this.#disposeAfter?.(...task); + } + } + } + } + #evict(free) { + const head = this.#head; + const k = this.#keyList[head]; + const v = this.#valList[head]; + const isBF = this.#isBackgroundFetch(v); + if (isBF) { + v.__abortController.abort(new Error('evicted')); + } + const oldValue = isBF ? v.__staleWhileFetching : v; + if ((this.#hasDispose || this.#hasDisposeAfter) && + oldValue !== undefined) { + if (this.#hasDispose) { + this.#dispose?.(oldValue, k, 'evict'); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([oldValue, k, 'evict']); + } + } + this.#removeItemSize(head); + if (this.#autopurgeTimers?.[head]) { + clearTimeout(this.#autopurgeTimers[head]); + this.#autopurgeTimers[head] = undefined; + } + // if we aren't about to use the index, then null these out + if (free) { + this.#keyList[head] = undefined; + this.#valList[head] = undefined; + this.#free.push(head); + } + if (this.#size === 1) { + this.#head = this.#tail = 0; + this.#free.length = 0; + } + else { + this.#head = this.#next[head]; + } + this.#keyMap.delete(k); + this.#size--; + return head; + } + /** + * Check if a key is in the cache, without updating the recency of use. + * Will return false if the item is stale, even though it is technically + * in the cache. + * + * Check if a key is in the cache, without updating the recency of + * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set + * to `true` in either the options or the constructor. + * + * Will return `false` if the item is stale, even though it is technically in + * the cache. The difference can be determined (if it matters) by using a + * `status` argument, and inspecting the `has` field. + * + * Will not update item age unless + * {@link LRUCache.OptionsBase.updateAgeOnHas} is set. + */ + has(k, hasOptions = {}) { + const { status = diagnostics_channel_js_1.metrics.hasSubscribers ? {} : undefined } = hasOptions; + hasOptions.status = status; + if (status) { + status.op = 'has'; + status.key = k; + status.cache = this; + } + const result = this.#has(k, hasOptions); + if (diagnostics_channel_js_1.metrics.hasSubscribers) + diagnostics_channel_js_1.metrics.publish(status); + return result; + } + #has(k, hasOptions = {}) { + const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions; + const index = this.#keyMap.get(k); + if (index !== undefined) { + const v = this.#valList[index]; + if (this.#isBackgroundFetch(v) && + v.__staleWhileFetching === undefined) { + return false; + } + if (!this.#isStale(index)) { + if (updateAgeOnHas) { + this.#updateItemAge(index); + } + if (status) { + status.has = 'hit'; + this.#statusTTL(status, index); + } + return true; + } + else if (status) { + status.has = 'stale'; + this.#statusTTL(status, index); + } + } + else if (status) { + status.has = 'miss'; + } + return false; + } + /** + * Like {@link LRUCache#get} but doesn't update recency or delete stale + * items. + * + * Returns `undefined` if the item is stale, unless + * {@link LRUCache.OptionsBase.allowStale} is set. + */ + peek(k, peekOptions = {}) { + const { status = hasSubscribers() ? {} : undefined } = peekOptions; + if (status) { + status.op = 'peek'; + status.key = k; + status.cache = this; + } + peekOptions.status = status; + const result = this.#peek(k, peekOptions); + if (diagnostics_channel_js_1.metrics.hasSubscribers) { + diagnostics_channel_js_1.metrics.publish(status); + } + return result; + } + #peek(k, peekOptions) { + const { status, allowStale = this.allowStale } = peekOptions; + const index = this.#keyMap.get(k); + if (index === undefined || (!allowStale && this.#isStale(index))) { + if (status) + status.peek = index === undefined ? 'miss' : 'stale'; + return undefined; + } + const v = this.#valList[index]; + const val = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (status) { + if (val !== undefined) { + status.peek = 'hit'; + status.value = val; + } + else { + status.peek = 'miss'; + } + } + return val; + } + #backgroundFetch(k, index, options, context) { + const v = index === undefined ? undefined : this.#valList[index]; + if (this.#isBackgroundFetch(v)) { + return v; + } + const ac = new AbortController(); + const { signal } = options; + // when/if our AC signals, then stop listening to theirs. + signal?.addEventListener('abort', () => ac.abort(signal.reason), { + signal: ac.signal, + }); + const fetchOpts = { + signal: ac.signal, + options, + context, + }; + const cb = (v, updateCache = false) => { + const { aborted } = ac.signal; + const ignoreAbort = options.ignoreFetchAbort && v !== undefined; + const proceed = options.ignoreFetchAbort || + !!(options.allowStaleOnFetchAbort && v !== undefined); + if (options.status) { + if (aborted && !updateCache) { + options.status.fetchAborted = true; + options.status.fetchError = ac.signal.reason; + if (ignoreAbort) + options.status.fetchAbortIgnored = true; + } + else { + options.status.fetchResolved = true; + } + } + if (aborted && !ignoreAbort && !updateCache) { + return fetchFail(ac.signal.reason, proceed); + } + // either we didn't abort, and are still here, or we did, and ignored + const bf = p; + // if nothing else has been written there but we're set to update the + // cache and ignore the abort, or if it's still pending on this specific + // background request, then write it to the cache. + const vl = this.#valList[index]; + if (vl === p || (vl === undefined && ignoreAbort && updateCache)) { + if (v === undefined) { + if (bf.__staleWhileFetching !== undefined) { + this.#valList[index] = bf.__staleWhileFetching; + } + else { + this.#delete(k, 'fetch'); + } + } + else { + if (options.status) + options.status.fetchUpdated = true; + this.#set(k, v, fetchOpts.options, bf); + } + } + return v; + }; + const eb = (er) => { + if (options.status) { + options.status.fetchRejected = true; + options.status.fetchError = er; + } + // do not pass go, do not collect $200 + return fetchFail(er, false); + }; + const fetchFail = (er, proceed) => { + const { aborted } = ac.signal; + const allowStaleAborted = aborted && options.allowStaleOnFetchAbort; + const allowStale = allowStaleAborted || options.allowStaleOnFetchRejection; + const noDelete = allowStale || options.noDeleteOnFetchRejection; + const bf = p; + if (this.#valList[index] === p) { + // if we allow stale on fetch rejections, then we need to ensure that + // the stale value is not removed from the cache when the fetch fails. + const del = !noDelete || (!proceed && bf.__staleWhileFetching === undefined); + if (del) { + this.#delete(k, 'fetch'); + } + else if (!allowStaleAborted) { + // still replace the *promise* with the stale value, + // since we are done with the promise at this point. + // leave it untouched if we're still waiting for an + // aborted background fetch that hasn't yet returned. + this.#valList[index] = bf.__staleWhileFetching; + } + } + if (allowStale) { + if (options.status && bf.__staleWhileFetching !== undefined) { + options.status.returnedStale = true; + } + return bf.__staleWhileFetching; + } + else if (bf.__returned === bf) { + throw er; + } + }; + const pcall = (res, rej) => { + const fmp = this.#fetchMethod?.(k, v, fetchOpts); + // ignored, we go until we finish, regardless. + // defer check until we are actually aborting, + // so fetchMethod can override. + ac.signal.addEventListener('abort', () => { + if (!options.ignoreFetchAbort || options.allowStaleOnFetchAbort) { + res(undefined); + // when it eventually resolves, update the cache. + if (options.allowStaleOnFetchAbort) { + res = v => cb(v, true); + } + } + }); + if (fmp && fmp instanceof Promise) { + fmp.then(v => res(v === undefined ? undefined : v), rej); + } + else if (fmp !== undefined) { + res(fmp); + } + }; + if (options.status) + options.status.fetchDispatched = true; + const p = new Promise(pcall).then(cb, eb); + const bf = Object.assign(p, { + __abortController: ac, + __staleWhileFetching: v, + __returned: undefined, + }); + if (index === undefined) { + // internal, don't expose status. + this.#set(k, bf, { ...fetchOpts.options, status: undefined }); + index = this.#keyMap.get(k); + } + else { + // do not call #set, because we do not want to adjust its place + // in the lru queue, as it has not yet been "used". Also, we don't + // need to worry about evicting for size, because a background fetch + // over a stale value is treated as the same size as its stale value. + this.#valList[index] = bf; + } + return bf; + } + #isBackgroundFetch(p) { + if (!this.#hasFetchMethod) + return false; + const b = p; + return (!!b && + b instanceof Promise && + b.hasOwnProperty('__staleWhileFetching') && + b.__abortController instanceof AbortController); + } + fetch(k, fetchOptions = {}) { + const ths = diagnostics_channel_js_1.tracing.hasSubscribers; + const { status = hasSubscribers() ? {} : undefined } = fetchOptions; + fetchOptions.status = status; + if (status && fetchOptions.context) { + status.context = fetchOptions.context; + } + const p = this.#fetch(k, fetchOptions); + if (status && ths) { + status.trace = true; + diagnostics_channel_js_1.tracing.tracePromise(() => p, status).catch(() => { }); + } + return p; + } + async #fetch(k, fetchOptions = {}) { + const { + // get options + allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, + // set options + ttl = this.ttl, noDisposeOnSet = this.noDisposeOnSet, size = 0, sizeCalculation = this.sizeCalculation, noUpdateTTL = this.noUpdateTTL, + // fetch exclusive options + noDeleteOnFetchRejection = this.noDeleteOnFetchRejection, allowStaleOnFetchRejection = this.allowStaleOnFetchRejection, ignoreFetchAbort = this.ignoreFetchAbort, allowStaleOnFetchAbort = this.allowStaleOnFetchAbort, context, forceRefresh = false, status, signal, } = fetchOptions; + if (status) { + status.op = 'fetch'; + status.key = k; + if (forceRefresh) + status.forceRefresh = true; + status.cache = this; + } + if (!this.#hasFetchMethod) { + if (status) + status.fetch = 'get'; + return this.#get(k, { + allowStale, + updateAgeOnGet, + noDeleteOnStaleGet, + status, + }); + } + const options = { + allowStale, + updateAgeOnGet, + noDeleteOnStaleGet, + ttl, + noDisposeOnSet, + size, + sizeCalculation, + noUpdateTTL, + noDeleteOnFetchRejection, + allowStaleOnFetchRejection, + allowStaleOnFetchAbort, + ignoreFetchAbort, + status, + signal, + }; + let index = this.#keyMap.get(k); + if (index === undefined) { + if (status) + status.fetch = 'miss'; + const p = this.#backgroundFetch(k, index, options, context); + return (p.__returned = p); + } + else { + // in cache, maybe already fetching + const v = this.#valList[index]; + if (this.#isBackgroundFetch(v)) { + const stale = allowStale && v.__staleWhileFetching !== undefined; + if (status) { + status.fetch = 'inflight'; + if (stale) + status.returnedStale = true; + } + return stale ? v.__staleWhileFetching : (v.__returned = v); + } + // if we force a refresh, that means do NOT serve the cached value, + // unless we are already in the process of refreshing the cache. + const isStale = this.#isStale(index); + if (!forceRefresh && !isStale) { + if (status) + status.fetch = 'hit'; + this.#moveToTail(index); + if (updateAgeOnGet) { + this.#updateItemAge(index); + } + if (status) + this.#statusTTL(status, index); + return v; + } + // ok, it is stale or a forced refresh, and not already fetching. + // refresh the cache. + const p = this.#backgroundFetch(k, index, options, context); + const hasStale = p.__staleWhileFetching !== undefined; + const staleVal = hasStale && allowStale; + if (status) { + status.fetch = isStale ? 'stale' : 'refresh'; + if (staleVal && isStale) + status.returnedStale = true; + } + return staleVal ? p.__staleWhileFetching : (p.__returned = p); + } + } + forceFetch(k, fetchOptions = {}) { + const ths = diagnostics_channel_js_1.tracing.hasSubscribers; + const { status = hasSubscribers() ? {} : undefined } = fetchOptions; + fetchOptions.status = status; + if (status && fetchOptions.context) { + status.context = fetchOptions.context; + } + const p = this.#forceFetch(k, fetchOptions); + if (status && ths) { + status.trace = true; + diagnostics_channel_js_1.tracing.tracePromise(() => p, status).catch(() => { }); + } + return p; + } + async #forceFetch(k, fetchOptions = {}) { + const v = await this.#fetch(k, fetchOptions); + if (v === undefined) + throw new Error('fetch() returned undefined'); + return v; + } + memo(k, memoOptions = {}) { + const { status = diagnostics_channel_js_1.metrics.hasSubscribers ? {} : undefined } = memoOptions; + memoOptions.status = status; + if (status) { + status.op = 'memo'; + status.key = k; + if (memoOptions.context) { + status.context = memoOptions.context; + } + status.cache = this; + } + const result = this.#memo(k, memoOptions); + if (status) + status.value = result; + if (diagnostics_channel_js_1.metrics.hasSubscribers) + diagnostics_channel_js_1.metrics.publish(status); + return result; + } + #memo(k, memoOptions = {}) { + const memoMethod = this.#memoMethod; + if (!memoMethod) { + throw new Error('no memoMethod provided to constructor'); + } + const { context, status, forceRefresh, ...options } = memoOptions; + if (status && forceRefresh) + status.forceRefresh = true; + const v = this.#get(k, options); + const refresh = forceRefresh || v === undefined; + if (status) { + status.memo = refresh ? 'miss' : 'hit'; + if (!refresh) + status.value = v; + } + if (!refresh) + return v; + const vv = memoMethod(k, v, { + options, + context, + }); + if (status) + status.value = vv; + this.#set(k, vv, options); + return vv; + } + /** + * Return a value from the cache. Will update the recency of the cache + * entry found. + * + * If the key is not found, get() will return `undefined`. + */ + get(k, getOptions = {}) { + const { status = diagnostics_channel_js_1.metrics.hasSubscribers ? {} : undefined } = getOptions; + getOptions.status = status; + if (status) { + status.op = 'get'; + status.key = k; + status.cache = this; + } + const result = this.#get(k, getOptions); + if (status) { + if (result !== undefined) + status.value = result; + if (diagnostics_channel_js_1.metrics.hasSubscribers) + diagnostics_channel_js_1.metrics.publish(status); + } + return result; + } + #get(k, getOptions = {}) { + const { allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, status, } = getOptions; + const index = this.#keyMap.get(k); + if (index === undefined) { + if (status) + status.get = 'miss'; + return undefined; + } + const value = this.#valList[index]; + const fetching = this.#isBackgroundFetch(value); + if (status) + this.#statusTTL(status, index); + if (this.#isStale(index)) { + // delete only if not an in-flight background fetch + if (!fetching) { + if (!noDeleteOnStaleGet) { + this.#delete(k, 'expire'); + } + if (status) + status.get = 'stale'; + if (allowStale) { + if (status) + status.returnedStale = true; + return value; + } + return undefined; + } + if (status) + status.get = 'stale-fetching'; + if (allowStale && value.__staleWhileFetching !== undefined) { + if (status) + status.returnedStale = true; + return value.__staleWhileFetching; + } + return undefined; + } + // not stale + if (status) + status.get = fetching ? 'fetching' : 'hit'; + // if we're currently fetching it, we don't actually have it yet + // it's not stale, which means this isn't a staleWhileRefetching. + // If it's not stale, and fetching, AND has a __staleWhileFetching + // value, then that means the user fetched with {forceRefresh:true}, + // so it's safe to return that value. + this.#moveToTail(index); + if (updateAgeOnGet) { + this.#updateItemAge(index); + } + return fetching ? value.__staleWhileFetching : value; + } + #connect(p, n) { + this.#prev[n] = p; + this.#next[p] = n; + } + #moveToTail(index) { + // if tail already, nothing to do + // if head, move head to next[index] + // else + // move next[prev[index]] to next[index] (head has no prev) + // move prev[next[index]] to prev[index] + // prev[index] = tail + // next[tail] = index + // tail = index + if (index !== this.#tail) { + if (index === this.#head) { + this.#head = this.#next[index]; + } + else { + this.#connect(this.#prev[index], this.#next[index]); + } + this.#connect(this.#tail, index); + this.#tail = index; + } + } + /** + * Deletes a key out of the cache. + * + * Returns true if the key was deleted, false otherwise. + */ + delete(k) { + return this.#delete(k, 'delete'); + } + #delete(k, reason) { + if (diagnostics_channel_js_1.metrics.hasSubscribers) { + diagnostics_channel_js_1.metrics.publish({ + op: 'delete', + delete: reason, + key: k, + cache: this, + }); + } + let deleted = false; + if (this.#size !== 0) { + const index = this.#keyMap.get(k); + if (index !== undefined) { + if (this.#autopurgeTimers?.[index]) { + clearTimeout(this.#autopurgeTimers?.[index]); + this.#autopurgeTimers[index] = undefined; + } + deleted = true; + if (this.#size === 1) { + this.#clear(reason); + } + else { + this.#removeItemSize(index); + const v = this.#valList[index]; + if (this.#isBackgroundFetch(v)) { + v.__abortController.abort(new Error('deleted')); + } + else if (this.#hasDispose || this.#hasDisposeAfter) { + if (this.#hasDispose) { + this.#dispose?.(v, k, reason); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([v, k, reason]); + } + } + this.#keyMap.delete(k); + this.#keyList[index] = undefined; + this.#valList[index] = undefined; + if (index === this.#tail) { + this.#tail = this.#prev[index]; + } + else if (index === this.#head) { + this.#head = this.#next[index]; + } + else { + const pi = this.#prev[index]; + this.#next[pi] = this.#next[index]; + const ni = this.#next[index]; + this.#prev[ni] = this.#prev[index]; + } + this.#size--; + this.#free.push(index); + } + } + } + if (this.#hasDisposeAfter && this.#disposed?.length) { + const dt = this.#disposed; + let task; + while ((task = dt?.shift())) { + this.#disposeAfter?.(...task); + } + } + return deleted; + } + /** + * Clear the cache entirely, throwing away all values. + */ + clear() { + return this.#clear('delete'); + } + #clear(reason) { + for (const index of this.#rindexes({ allowStale: true })) { + const v = this.#valList[index]; + if (this.#isBackgroundFetch(v)) { + v.__abortController.abort(new Error('deleted')); + } + else { + const k = this.#keyList[index]; + if (this.#hasDispose) { + this.#dispose?.(v, k, reason); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([v, k, reason]); + } + } + } + this.#keyMap.clear(); + void this.#valList.fill(undefined); + this.#keyList.fill(undefined); + if (this.#ttls && this.#starts) { + this.#ttls.fill(0); + this.#starts.fill(0); + for (const t of this.#autopurgeTimers ?? []) { + if (t !== undefined) + clearTimeout(t); + } + this.#autopurgeTimers?.fill(undefined); + } + if (this.#sizes) { + this.#sizes.fill(0); + } + this.#head = 0; + this.#tail = 0; + this.#free.length = 0; + this.#calculatedSize = 0; + this.#size = 0; + if (this.#hasDisposeAfter && this.#disposed) { + const dt = this.#disposed; + let task; + while ((task = dt?.shift())) { + this.#disposeAfter?.(...task); + } + } + } +} +exports.LRUCache = LRUCache; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/browser/index.js.map b/node_modules/lru-cache/dist/commonjs/browser/index.js.map new file mode 100644 index 00000000..c1652fa0 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/browser/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module LRUCache\n */\n\nimport { metrics, tracing } from './diagnostics-channel.js'\nimport { defaultPerf } from './perf.js'\nimport type { Perf } from './perf.js'\nexport type { Perf } from './perf.js'\n\nconst hasSubscribers = () =>\n metrics.hasSubscribers || tracing.hasSubscribers\n\nconst warned = new Set()\n\n// either a function or a class\n// oxlint-disable-next-line no-explicit-any\ntype ForC = ((...a: any[]) => any) | { new (...a: any[]): any }\n\n/* c8 ignore start */\nconst PROCESS = (\n typeof process === 'object' && !!process ?\n process\n : {}) as { [k: string]: unknown }\n/* c8 ignore stop */\n\nconst emitWarning = (\n msg: string,\n type: string,\n code: string,\n fn: ForC,\n) => {\n if (typeof PROCESS.emitWarning === 'function') {\n PROCESS.emitWarning(msg, type, code, fn)\n } else {\n //oxlint-disable-next-line no-console\n console.error(`[${code}] ${type}: ${msg}`)\n }\n}\nconst shouldWarn = (code: string) => !warned.has(code)\n\nconst TYPE = Symbol('type')\nexport type PosInt = number & { [TYPE]: 'Positive Integer' }\nexport type Index = number & { [TYPE]: 'LRUCache Index' }\n\nconst isPosInt = (n: unknown): n is PosInt =>\n !!n && n === Math.floor(n as number) && n > 0 && isFinite(n)\n\nexport type UintArray = Uint8Array | Uint16Array | Uint32Array\nexport type NumberArray = UintArray | number[]\n\n// This is a little bit ridiculous, tbh.\n// The maximum array length is 2^32-1 or thereabouts on most JS impls.\n// And well before that point, you're caching the entire world, I mean,\n// that's ~32GB of just integers for the next/prev links, plus whatever\n// else to hold that many keys and values. Just filling the memory with\n// zeroes at init time is brutal when you get that big.\n// But why not be complete?\n// Maybe in the future, these limits will have expanded.\n/* c8 ignore start */\nconst getUintArray = (max: number) =>\n !isPosInt(max) ? null\n : max <= Math.pow(2, 8) ? Uint8Array\n : max <= Math.pow(2, 16) ? Uint16Array\n : max <= Math.pow(2, 32) ? Uint32Array\n : max <= Number.MAX_SAFE_INTEGER ? ZeroArray\n : null\n/* c8 ignore stop */\n\nclass ZeroArray extends Array {\n constructor(size: number) {\n super(size)\n this.fill(0)\n }\n}\nexport type { ZeroArray }\nexport type { Stack }\n\nexport type StackLike = Stack | Index[]\nclass Stack {\n /* c8 ignore start - not sure why this is showing up uncovered?? */\n heap: NumberArray\n /* c8 ignore stop */\n length: number\n // private constructor\n static #constructing: boolean = false\n static create(max: number): StackLike {\n const HeapCls = getUintArray(max)\n if (!HeapCls) return []\n Stack.#constructing = true\n const s = new Stack(max, HeapCls)\n Stack.#constructing = false\n return s\n }\n constructor(max: number, HeapCls: { new (n: number): NumberArray }) {\n /* c8 ignore start */\n if (!Stack.#constructing) {\n throw new TypeError('instantiate Stack using Stack.create(n)')\n }\n /* c8 ignore stop */\n this.heap = new HeapCls(max)\n this.length = 0\n }\n push(n: Index) {\n this.heap[this.length++] = n\n }\n pop(): Index {\n return this.heap[--this.length] as Index\n }\n}\n\n/**\n * Promise representing an in-progress {@link LRUCache#fetch} call\n */\nexport type BackgroundFetch = Promise & {\n __returned: BackgroundFetch | undefined\n __abortController: AbortController\n __staleWhileFetching: V | undefined\n}\n\nexport type DisposeTask = [\n value: V,\n key: K,\n reason: LRUCache.DisposeReason,\n]\n\nexport namespace LRUCache {\n /**\n * An integer greater than 0, reflecting the calculated size of items\n */\n export type Size = number\n\n /**\n * Integer greater than 0, representing some number of milliseconds, or the\n * time at which a TTL started counting from.\n */\n export type Milliseconds = number\n\n /**\n * An integer greater than 0, reflecting a number of items\n */\n export type Count = number\n\n /**\n * The reason why an item was removed from the cache, passed\n * to the {@link Disposer} methods.\n *\n * - `evict`: The item was evicted because it is the least recently used,\n * and the cache is full.\n * - `set`: A new value was set, overwriting the old value being disposed.\n * - `delete`: The item was explicitly deleted, either by calling\n * {@link LRUCache#delete}, {@link LRUCache#clear}, or\n * {@link LRUCache#set} with an undefined value.\n * - `expire`: The item was removed due to exceeding its TTL.\n * - `fetch`: A {@link OptionsBase#fetchMethod} operation returned\n * `undefined` or was aborted, causing the item to be deleted.\n */\n export type DisposeReason =\n | 'evict'\n | 'set'\n | 'delete'\n | 'expire'\n | 'fetch'\n /**\n * A method called upon item removal, passed as the\n * {@link OptionsBase.dispose} and/or\n * {@link OptionsBase.disposeAfter} options.\n */\n export type Disposer = (\n value: V,\n key: K,\n reason: DisposeReason,\n ) => void\n\n /**\n * The reason why an item was added to the cache, passed\n * to the {@link Inserter} methods.\n *\n * - `add`: the item was not found in the cache, and was added\n * - `update`: the item was in the cache, with the same value provided\n * - `replace`: the item was in the cache, and replaced\n */\n export type InsertReason = 'add' | 'update' | 'replace'\n\n /**\n * A method called upon item insertion, passed as the\n * {@link OptionsBase.insert}\n */\n export type Inserter = (\n value: V,\n key: K,\n reason: InsertReason,\n ) => void\n\n /**\n * A function that returns the effective calculated size\n * of an entry in the cache.\n */\n export type SizeCalculator = (value: V, key: K) => Size\n\n /**\n * Options provided to the\n * {@link OptionsBase.fetchMethod} function.\n */\n export interface FetcherOptions {\n signal: AbortSignal\n options: FetcherFetchOptions\n /**\n * Object provided in the {@link FetchOptions.context} option to\n * {@link LRUCache#fetch}\n */\n context: FC\n }\n\n /**\n * Occasionally, it may be useful to track the internal behavior of the\n * cache, particularly for logging, debugging, or for behavior within the\n * `fetchMethod`. To do this, you can pass a `status` object to the\n * {@link LRUCache#fetch}, {@link LRUCache#get}, {@link LRUCache#set},\n * {@link LRUCache#memo}, and {@link LRUCache#has} methods.\n *\n * The `status` option should be a plain JavaScript object. The following\n * fields will be set on it appropriately, depending on the situation.\n *\n * These objects are also the context objects passed to listeners on the\n * `lru-cache:metrics` diagnostic channel, and the `lru-cache` tracing\n * channels, in platforms that support them.\n */\n export interface Status {\n /**\n * The operation being performed\n */\n op?: 'get' | 'set' | 'memo' | 'fetch' | 'delete' | 'has' | 'peek'\n /**\n * The status of a set() operation.\n *\n * - add: the item was not found in the cache, and was added\n * - update: the item was in the cache, with the same value provided\n * - replace: the item was in the cache, and replaced\n * - miss: the item was not added to the cache for some reason\n */\n set?: 'add' | 'update' | 'replace' | 'miss' | 'deleted'\n\n /**\n * The status of a delete() operation.\n */\n delete?: LRUCache.DisposeReason\n\n /**\n * The result of a peek() operation\n *\n * - hit: the item was found and returned\n * - stale: the item is in the cache, but past its ttl and not returned\n * - miss: item not in the cache\n */\n peek?: 'hit' | 'miss' | 'stale'\n\n /**\n * The status of a memo() operation.\n *\n * - 'hit': the item was found in the cache and returned\n * - 'miss': the `memoMethod` function was called\n */\n memo?: 'hit' | 'miss'\n\n /**\n * The `context` option provided to a memo or fetch operation\n *\n * In practice, of course, this will be the same type as the `FC`\n * fetch context param used to instantiate the LRUCache, but the\n * convolutions of threading that through would get quite complicated,\n * and preclude forcing/forbidding the passing of a `context` param\n * where it is/isn't expected, which is more valuable for error\n * prevention.\n */\n context?: unknown\n\n /**\n * the ttl stored for the item, or undefined if ttls are not used.\n */\n ttl?: Milliseconds\n\n /**\n * the start time for the item, or undefined if ttls are not used.\n */\n start?: Milliseconds\n\n /**\n * The timestamp used for TTL calculation\n */\n now?: Milliseconds\n\n /**\n * the remaining ttl for the item, or undefined if ttls are not used.\n */\n remainingTTL?: Milliseconds\n\n /**\n * The calculated size for the item, if sizes are used.\n */\n entrySize?: Size\n\n /**\n * The total calculated size of the cache, if sizes are used.\n */\n totalCalculatedSize?: Size\n\n /**\n * A flag indicating that the item was not stored, due to exceeding the\n * {@link OptionsBase.maxEntrySize}\n */\n maxEntrySizeExceeded?: true\n\n /**\n * The key that was set or retrieved\n */\n key?: K\n\n /**\n * The value that was set\n */\n value?: V\n\n /**\n * The old value, specified in the case of `set:'replace'`\n */\n oldValue?: V\n\n /**\n * The results of a {@link LRUCache#has} operation\n *\n * - hit: the item was found in the cache\n * - stale: the item was found in the cache, but is stale\n * - miss: the item was not found in the cache\n */\n has?: 'hit' | 'stale' | 'miss'\n\n /**\n * The status of a {@link LRUCache#fetch} operation.\n * Note that this can change as the underlying fetch() moves through\n * various states.\n *\n * - inflight: there is another fetch() for this key which is in process\n * - get: there is no {@link OptionsBase.fetchMethod}, so\n * {@link LRUCache#get} was called.\n * - miss: the item is not in cache, and will be fetched.\n * - hit: the item is in the cache, and was resolved immediately.\n * - stale: the item is in the cache, but stale.\n * - refresh: the item is in the cache, and not stale, but\n * {@link FetchOptions.forceRefresh} was specified.\n */\n fetch?: 'get' | 'inflight' | 'miss' | 'hit' | 'stale' | 'refresh'\n\n /**\n * `forceRefresh` option was used for either a fetch or memo operation\n */\n forceRefresh?: boolean\n\n /**\n * The {@link OptionsBase.fetchMethod} was called\n */\n fetchDispatched?: true\n\n /**\n * The cached value was updated after a successful call to\n * {@link OptionsBase.fetchMethod}\n */\n fetchUpdated?: true\n\n /**\n * The reason for a fetch() rejection. Either the error raised by the\n * {@link OptionsBase.fetchMethod}, or the reason for an\n * AbortSignal.\n */\n fetchError?: Error\n\n /**\n * The fetch received an abort signal\n */\n fetchAborted?: true\n\n /**\n * The abort signal received was ignored, and the fetch was allowed to\n * continue in the background.\n */\n fetchAbortIgnored?: true\n\n /**\n * The fetchMethod promise resolved successfully\n */\n fetchResolved?: true\n\n /**\n * The fetchMethod promise was rejected\n */\n fetchRejected?: true\n\n /**\n * The status of a {@link LRUCache#get} operation.\n *\n * - fetching: The item is currently being fetched. If a previous value\n * is present and allowed, that will be returned.\n * - stale: The item is in the cache, and is stale. If it was returned,\n * then the `returnedStale` flag will be set.\n * - stale-fetching: The value is being fetched in the background, but is\n * currently stale. If the stale value was returned, then the\n * `returnedStale` flag will be set.\n * - hit: the item is in the cache\n * - miss: the item is not in the cache\n */\n get?: 'stale' | 'hit' | 'miss' | 'fetching' | 'stale-fetching'\n\n /**\n * A fetch or get operation returned a stale value.\n */\n returnedStale?: true\n\n /**\n * A tracingChannel trace was started for this operation\n */\n trace?: boolean\n\n /**\n * A reference to the cache instance associated with this operation\n */\n cache?: LRUCache\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#fetch}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link OptionsBase.noDeleteOnFetchRejection},\n * {@link OptionsBase.allowStaleOnFetchRejection},\n * {@link FetchOptions.forceRefresh}, and\n * {@link FetcherOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.fetchMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the fetchMethod is called.\n */\n export interface FetcherFetchOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n status?: Status\n size?: Size\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#fetch} method.\n */\n export interface FetchOptions extends FetcherFetchOptions<\n K,\n V,\n FC\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.fetchMethod} as\n * the {@link FetcherOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n signal?: AbortSignal\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface FetchOptionsWithContext extends FetchOptions<\n K,\n V,\n FC\n > {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is\n * `undefined` or `void`\n */\n export interface FetchOptionsNoContext<\n K,\n V,\n FC extends undefined | void = undefined,\n > extends FetchOptions {\n context?: FC\n }\n\n export interface MemoOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.memoMethod} as\n * the {@link MemoizerOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface MemoOptionsWithContext extends MemoOptions<\n K,\n V,\n FC\n > {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is\n * `undefined` or `void`\n */\n export interface MemoOptionsNoContext<\n K,\n V,\n FC extends undefined | void = undefined,\n > extends MemoOptions {\n context?: FC\n }\n\n /**\n * Options provided to the\n * {@link OptionsBase.memoMethod} function.\n */\n export interface MemoizerOptions {\n options: MemoizerMemoOptions\n /**\n * Object provided in the {@link MemoOptions.context} option to\n * {@link LRUCache#memo}\n */\n context: FC\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#memo}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link MemoOptions.forceRefresh}, and\n * {@link MemoOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.memoMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the memoMethod is called.\n */\n export interface MemoizerMemoOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n > {\n status?: Status\n size?: Size\n start?: Milliseconds\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#has} method.\n */\n export interface HasOptions extends Pick<\n OptionsBase,\n 'updateAgeOnHas'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#get} method.\n */\n export interface GetOptions extends Pick<\n OptionsBase,\n 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#peek} method.\n */\n export interface PeekOptions extends Pick<\n OptionsBase,\n 'allowStale'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#set} method.\n */\n export interface SetOptions extends Pick<\n OptionsBase,\n 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'\n > {\n /**\n * If size tracking is enabled, then setting an explicit size\n * in the {@link LRUCache#set} call will prevent calling the\n * {@link OptionsBase.sizeCalculation} function.\n */\n size?: Size\n /**\n * If TTL tracking is enabled, then setting an explicit start\n * time in the {@link LRUCache#set} call will override the\n * default time from `performance.now()` or `Date.now()`.\n *\n * Note that it must be a valid value for whichever time-tracking\n * method is in use.\n */\n start?: Milliseconds\n status?: Status\n }\n\n /**\n * The type signature for the {@link OptionsBase.fetchMethod} option.\n */\n export type Fetcher = (\n key: K,\n staleValue: V | undefined,\n options: FetcherOptions,\n ) => Promise | V | undefined | void\n\n /**\n * the type signature for the {@link OptionsBase.memoMethod} option.\n */\n export type Memoizer = (\n key: K,\n staleValue: V | undefined,\n options: MemoizerOptions,\n ) => V\n\n /**\n * Options which may be passed to the {@link LRUCache} constructor.\n *\n * Most of these may be overridden in the various options that use\n * them.\n *\n * Despite all being technically optional, the constructor requires that\n * a cache is at minimum limited by one or more of {@link OptionsBase.max},\n * {@link OptionsBase.ttl}, or {@link OptionsBase.maxSize}.\n *\n * If {@link OptionsBase.ttl} is used alone, then it is strongly advised\n * (and in fact required by the type definitions here) that the cache\n * also set {@link OptionsBase.ttlAutopurge}, to prevent potentially\n * unbounded storage.\n *\n * All options are also available on the {@link LRUCache} instance, making\n * it safe to pass an LRUCache instance as the options argumemnt to\n * make another empty cache of the same type.\n *\n * Some options are marked as read-only, because changing them after\n * instantiation is not safe. Changing any of the other options will of\n * course only have an effect on subsequent method calls.\n */\n export interface OptionsBase {\n /**\n * The maximum number of items to store in the cache before evicting\n * old entries. This is read-only on the {@link LRUCache} instance,\n * and may not be overridden.\n *\n * If set, then storage space will be pre-allocated at construction\n * time, and the cache will perform significantly faster.\n *\n * Note that significantly fewer items may be stored, if\n * {@link OptionsBase.maxSize} and/or {@link OptionsBase.ttl} are also\n * set.\n *\n * **It is strongly recommended to set a `max` to prevent unbounded growth\n * of the cache.**\n */\n max?: Count\n\n /**\n * Max time in milliseconds for items to live in cache before they are\n * considered stale. Note that stale items are NOT preemptively removed by\n * default, and MAY live in the cache, contributing to its LRU max, long\n * after they have expired, unless {@link OptionsBase.ttlAutopurge} is\n * set.\n *\n * If set to `0` (the default value), then that means \"do not track\n * TTL\", not \"expire immediately\".\n *\n * Also, as this cache is optimized for LRU/MRU operations, some of\n * the staleness/TTL checks will reduce performance, as they will incur\n * overhead by deleting items.\n *\n * This is not primarily a TTL cache, and does not make strong TTL\n * guarantees. There is no pre-emptive pruning of expired items, but you\n * _may_ set a TTL on the cache, and it will treat expired items as missing\n * when they are fetched, and delete them.\n *\n * Optional, but must be a non-negative integer in ms if specified.\n *\n * This may be overridden by passing an options object to `cache.set()`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if ttl tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * If ttl tracking is enabled, and `max` and `maxSize` are not set,\n * and `ttlAutopurge` is not set, then a warning will be emitted\n * cautioning about the potential for unbounded memory consumption.\n * (The TypeScript definitions will also discourage this.)\n */\n ttl?: Milliseconds\n\n /**\n * Minimum amount of time in ms in which to check for staleness.\n * Defaults to 1, which means that the current time is checked\n * at most once per millisecond.\n *\n * Set to 0 to check the current time every time staleness is tested.\n * (This reduces performance, and is theoretically unnecessary.)\n *\n * Setting this to a higher value will improve performance somewhat\n * while using ttl tracking, albeit at the expense of keeping stale\n * items around a bit longer than their TTLs would indicate.\n *\n * @default 1\n */\n ttlResolution?: Milliseconds\n\n /**\n * Preemptively remove stale items from the cache.\n *\n * Note that this may *significantly* degrade performance, especially if\n * the cache is storing a large number of items. It is almost always best\n * to just leave the stale items in the cache, and let them fall out as new\n * items are added.\n *\n * Note that this means that {@link OptionsBase.allowStale} is a bit\n * pointless, as stale items will be deleted almost as soon as they\n * expire.\n *\n * Use with caution!\n */\n ttlAutopurge?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever it is retrieved from cache with\n * {@link LRUCache#get}, causing it to not expire. (It can still fall out\n * of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n */\n updateAgeOnGet?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever its presence in the cache is\n * checked with {@link LRUCache#has}, causing it to not expire. (It can\n * still fall out of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n */\n updateAgeOnHas?: boolean\n\n /**\n * Allow {@link LRUCache#get} and {@link LRUCache#fetch} calls to return\n * stale data, if available.\n *\n * By default, if you set `ttl`, stale items will only be deleted from the\n * cache when you `get(key)`. That is, it's not preemptively pruning items,\n * unless {@link OptionsBase.ttlAutopurge} is set.\n *\n * If you set `allowStale:true`, it'll return the stale value *as well as*\n * deleting it. If you don't set this, then it'll return `undefined` when\n * you try to get a stale entry.\n *\n * Note that when a stale entry is fetched, _even if it is returned due to\n * `allowStale` being set_, it is removed from the cache immediately. You\n * can suppress this behavior by setting\n * {@link OptionsBase.noDeleteOnStaleGet}, either in the constructor, or in\n * the options provided to {@link LRUCache#get}.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n * The `cache.has()` method will always return `false` for stale items.\n *\n * Only relevant if a ttl is set.\n */\n allowStale?: boolean\n\n /**\n * Function that is called on items when they are dropped from the\n * cache, as `dispose(value, key, reason)`.\n *\n * This can be handy if you want to close file descriptors or do\n * other cleanup tasks when items are no longer stored in the cache.\n *\n * **NOTE**: It is called _before_ the item has been fully removed\n * from the cache, so if you want to put it right back in, you need\n * to wait until the next tick. If you try to add it back in during\n * the `dispose()` function call, it will break things in subtle and\n * weird ways.\n *\n * Unlike several other options, this may _not_ be overridden by\n * passing an option to `set()`, for performance reasons.\n *\n * The `reason` will be one of the following strings, corresponding\n * to the reason for the item's deletion:\n *\n * - `evict` Item was evicted to make space for a new addition\n * - `set` Item was overwritten by a new value\n * - `expire` Item expired its TTL\n * - `fetch` Item was deleted due to a failed or aborted fetch, or a\n * fetchMethod returning `undefined.\n * - `delete` Item was removed by explicit `cache.delete(key)`,\n * `cache.clear()`, or `cache.set(key, undefined)`.\n */\n dispose?: Disposer\n\n /**\n * Function that is called when new items are inserted into the cache,\n * as `onInsert(value, key, reason)`.\n *\n * This can be useful if you need to perform actions when an item is\n * added, such as logging or tracking insertions.\n *\n * Unlike some other options, this may _not_ be overridden by passing\n * an option to `set()`, for performance and consistency reasons.\n */\n onInsert?: Inserter\n\n /**\n * The same as {@link OptionsBase.dispose}, but called *after* the entry\n * is completely removed and the cache is once again in a clean state.\n *\n * It is safe to add an item right back into the cache at this point.\n * However, note that it is *very* easy to inadvertently create infinite\n * recursion this way.\n */\n disposeAfter?: Disposer\n\n /**\n * Set to true to suppress calling the\n * {@link OptionsBase.dispose} function if the entry key is\n * still accessible within the cache.\n *\n * This may be overridden by passing an options object to\n * {@link LRUCache#set}.\n *\n * Only relevant if `dispose` or `disposeAfter` are set.\n */\n noDisposeOnSet?: boolean\n\n /**\n * Boolean flag to tell the cache to not update the TTL when setting a new\n * value for an existing key (ie, when updating a value rather than\n * inserting a new value). Note that the TTL value is _always_ set (if\n * provided) when adding a new entry into the cache.\n *\n * Has no effect if a {@link OptionsBase.ttl} is not set.\n *\n * May be passed as an option to {@link LRUCache#set}.\n */\n noUpdateTTL?: boolean\n\n /**\n * Set to a positive integer to track the sizes of items added to the\n * cache, and automatically evict items in order to stay below this size.\n * Note that this may result in fewer than `max` items being stored.\n *\n * Attempting to add an item to the cache whose calculated size is greater\n * that this amount will be a no-op. The item will not be cached, and no\n * other items will be evicted.\n *\n * Optional, must be a positive integer if provided.\n *\n * Sets `maxEntrySize` to the same value, unless a different value is\n * provided for `maxEntrySize`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if size tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * Note also that size tracking can negatively impact performance,\n * though for most cases, only minimally.\n */\n maxSize?: Size\n\n /**\n * The effective size for background fetch promises.\n *\n * This has no effect unless `maxSize` and `sizeCalculation` are used,\n * and a {@link LRUCache.OptionsBase.fetchMethod} is provided to\n * support {@link LRUCache#fetch}.\n *\n * If a stale value is present in the cache, then the effective size of\n * the background fetch is the size of the stale item it will eventually\n * replace. If not, then this value is used as its effective size.\n *\n * @default 1\n */\n backgroundFetchSize?: number\n\n /**\n * The maximum allowed size for any single item in the cache.\n *\n * If a larger item is passed to {@link LRUCache#set} or returned by a\n * {@link OptionsBase.fetchMethod} or {@link OptionsBase.memoMethod}, then\n * it will not be stored in the cache.\n *\n * Attempting to add an item whose calculated size is greater than\n * this amount will not cache the item or evict any old items, but\n * WILL delete an existing value if one is already present.\n *\n * Optional, must be a positive integer if provided. Defaults to\n * the value of `maxSize` if provided.\n */\n maxEntrySize?: Size\n\n /**\n * A function that returns a number indicating the item's size.\n *\n * Requires {@link OptionsBase.maxSize} to be set.\n *\n * If not provided, and {@link OptionsBase.maxSize} or\n * {@link OptionsBase.maxEntrySize} are set, then all\n * {@link LRUCache#set} calls **must** provide an explicit\n * {@link SetOptions.size} or sizeCalculation param.\n */\n sizeCalculation?: SizeCalculator\n\n /**\n * Method that provides the implementation for {@link LRUCache#fetch}\n *\n * ```ts\n * fetchMethod(key, staleValue, { signal, options, context })\n * ```\n *\n * If `fetchMethod` is not provided, then `cache.fetch(key)` is equivalent\n * to `Promise.resolve(cache.get(key))`.\n *\n * If at any time, `signal.aborted` is set to `true`, or if the\n * `signal.onabort` method is called, or if it emits an `'abort'` event\n * which you can listen to with `addEventListener`, then that means that\n * the fetch should be abandoned. This may be passed along to async\n * functions aware of AbortController/AbortSignal behavior.\n *\n * The `fetchMethod` should **only** return `undefined` or a Promise\n * resolving to `undefined` if the AbortController signaled an `abort`\n * event. In all other cases, it should return or resolve to a value\n * suitable for adding to the cache.\n *\n * The `options` object is a union of the options that may be provided to\n * `set()` and `get()`. If they are modified, then that will result in\n * modifying the settings to `cache.set()` when the value is resolved, and\n * in the case of\n * {@link OptionsBase.noDeleteOnFetchRejection} and\n * {@link OptionsBase.allowStaleOnFetchRejection}, the handling of\n * `fetchMethod` failures.\n *\n * For example, a DNS cache may update the TTL based on the value returned\n * from a remote DNS server by changing `options.ttl` in the `fetchMethod`.\n */\n fetchMethod?: Fetcher\n\n /**\n * Method that provides the implementation for {@link LRUCache#memo}\n */\n memoMethod?: Memoizer\n\n /**\n * Set to true to suppress the deletion of stale data when a\n * {@link OptionsBase.fetchMethod} returns a rejected promise.\n */\n noDeleteOnFetchRejection?: boolean\n\n /**\n * Do not delete stale items when they are retrieved with\n * {@link LRUCache#get}.\n *\n * Note that the `get` return value will still be `undefined`\n * unless {@link OptionsBase.allowStale} is true.\n *\n * When using time-expiring entries with `ttl`, by default stale\n * items will be removed from the cache when the key is accessed\n * with `cache.get()`.\n *\n * Setting this option will cause stale items to remain in the cache, until\n * they are explicitly deleted with `cache.delete(key)`, or retrieved with\n * `noDeleteOnStaleGet` set to `false`.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n *\n * Only relevant if a ttl is used.\n */\n noDeleteOnStaleGet?: boolean\n\n /**\n * Set to true to allow returning stale data when a\n * {@link OptionsBase.fetchMethod} throws an error or returns a rejected\n * promise.\n *\n * This differs from using {@link OptionsBase.allowStale} in that stale\n * data will ONLY be returned in the case that the {@link LRUCache#fetch}\n * fails, not any other times.\n *\n * If a `fetchMethod` fails, and there is no stale value available, the\n * `fetch()` will resolve to `undefined`. Ie, all `fetchMethod` errors are\n * suppressed.\n *\n * Implies `noDeleteOnFetchRejection`.\n *\n * This may be set in calls to `fetch()`, or defaulted on the constructor,\n * or overridden by modifying the options object in the `fetchMethod`.\n */\n allowStaleOnFetchRejection?: boolean\n\n /**\n * Set to true to return a stale value from the cache when the\n * `AbortSignal` passed to the {@link OptionsBase.fetchMethod} dispatches\n * an `'abort'` event, whether user-triggered, or due to internal cache\n * behavior.\n *\n * Unless {@link OptionsBase.ignoreFetchAbort} is also set, the underlying\n * {@link OptionsBase.fetchMethod} will still be considered canceled, and\n * any value it returns will be ignored and not cached.\n *\n * Caveat: since fetches are aborted when a new value is explicitly\n * set in the cache, this can lead to fetch returning a stale value,\n * since that was the fallback value _at the moment the `fetch()` was\n * initiated_, even though the new updated value is now present in\n * the cache.\n *\n * For example:\n *\n * ```ts\n * const cache = new LRUCache({\n * ttl: 100,\n * fetchMethod: async (url, oldValue, { signal }) => {\n * const res = await fetch(url, { signal })\n * return await res.json()\n * }\n * })\n * cache.set('https://example.com/', { some: 'data' })\n * // 100ms go by...\n * const result = cache.fetch('https://example.com/')\n * cache.set('https://example.com/', { other: 'thing' })\n * console.log(await result) // { some: 'data' }\n * console.log(cache.get('https://example.com/')) // { other: 'thing' }\n * ```\n */\n allowStaleOnFetchAbort?: boolean\n\n /**\n * Set to true to ignore the `abort` event emitted by the `AbortSignal`\n * object passed to {@link OptionsBase.fetchMethod}, and still cache the\n * resulting resolution value, as long as it is not `undefined`.\n *\n * When used on its own, this means aborted {@link LRUCache#fetch} calls\n * are not immediately resolved or rejected when they are aborted, and\n * instead take the full time to await.\n *\n * When used with {@link OptionsBase.allowStaleOnFetchAbort}, aborted\n * {@link LRUCache#fetch} calls will resolve immediately to their stale\n * cached value or `undefined`, and will continue to process and eventually\n * update the cache when they resolve, as long as the resulting value is\n * not `undefined`, thus supporting a \"return stale on timeout while\n * refreshing\" mechanism by passing `AbortSignal.timeout(n)` as the signal.\n *\n * For example:\n *\n * ```ts\n * const c = new LRUCache({\n * ttl: 100,\n * ignoreFetchAbort: true,\n * allowStaleOnFetchAbort: true,\n * fetchMethod: async (key, oldValue, { signal }) => {\n * // note: do NOT pass the signal to fetch()!\n * // let's say this fetch can take a long time.\n * const res = await fetch(`https://slow-backend-server/${key}`)\n * return await res.json()\n * },\n * })\n *\n * // this will return the stale value after 100ms, while still\n * // updating in the background for next time.\n * const val = await c.fetch('key', { signal: AbortSignal.timeout(100) })\n * ```\n *\n * **Note**: regardless of this setting, an `abort` event _is still\n * emitted on the `AbortSignal` object_, so may result in invalid results\n * when passed to other underlying APIs that use AbortSignals.\n *\n * This may be overridden in the {@link OptionsBase.fetchMethod} or the\n * call to {@link LRUCache#fetch}.\n */\n ignoreFetchAbort?: boolean\n\n /**\n * In some cases, you may want to swap out the performance/Date object\n * used for TTL tracking. This should almost certainly NOT be done in\n * production environments!\n *\n * This value defaults to `global.performance` if it has a `now()` method,\n * or the `global.Date` object otherwise.\n */\n perf?: Perf\n }\n\n export interface OptionsMaxLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n max: Count\n }\n export interface OptionsTTLLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n ttl: Milliseconds\n ttlAutopurge: boolean\n }\n export interface OptionsSizeLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n maxSize: Size\n }\n\n /**\n * The valid safe options for the {@link LRUCache} constructor\n */\n export type Options =\n | OptionsMaxLimit\n | OptionsSizeLimit\n | OptionsTTLLimit\n\n /**\n * Entry objects used by {@link LRUCache#load} and {@link LRUCache#dump},\n * and returned by {@link LRUCache#info}.\n */\n export interface Entry {\n value: V\n ttl?: Milliseconds\n size?: Size\n start?: Milliseconds\n }\n}\n\n/**\n * Default export, the thing you're using this module to get.\n *\n * The `K` and `V` types define the key and value types, respectively. The\n * optional `FC` type defines the type of the `context` object passed to\n * `cache.fetch()` and `cache.memo()`.\n *\n * Keys and values **must not** be `null` or `undefined`.\n *\n * All properties from the options object (with the exception of `max`,\n * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are\n * added as normal public members. (The listed options are read-only getters.)\n *\n * Changing any of these will alter the defaults for subsequent method calls.\n */\nexport class LRUCache {\n // options that cannot be changed without disaster\n readonly #max: LRUCache.Count\n readonly #maxSize: LRUCache.Size\n readonly #dispose?: LRUCache.Disposer\n readonly #onInsert?: LRUCache.Inserter\n readonly #disposeAfter?: LRUCache.Disposer\n readonly #fetchMethod?: LRUCache.Fetcher\n readonly #memoMethod?: LRUCache.Memoizer\n readonly #perf: Perf\n\n /**\n * {@link LRUCache.OptionsBase.perf}\n */\n get perf() {\n return this.#perf\n }\n\n /**\n * {@link LRUCache.OptionsBase.ttl}\n */\n ttl: LRUCache.Milliseconds\n\n /**\n * {@link LRUCache.OptionsBase.ttlResolution}\n */\n ttlResolution: LRUCache.Milliseconds\n /**\n * {@link LRUCache.OptionsBase.ttlAutopurge}\n */\n ttlAutopurge: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnGet}\n */\n updateAgeOnGet: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnHas}\n */\n updateAgeOnHas: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStale}\n */\n allowStale: boolean\n\n /**\n * {@link LRUCache.OptionsBase.noDisposeOnSet}\n */\n noDisposeOnSet: boolean\n /**\n * {@link LRUCache.OptionsBase.noUpdateTTL}\n */\n noUpdateTTL: boolean\n /**\n * {@link LRUCache.OptionsBase.maxEntrySize}\n */\n maxEntrySize: LRUCache.Size\n /**\n * {@link LRUCache.OptionsBase.sizeCalculation}\n */\n sizeCalculation?: LRUCache.SizeCalculator\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection}\n */\n noDeleteOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnStaleGet}\n */\n noDeleteOnStaleGet: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}\n */\n allowStaleOnFetchAbort: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection}\n */\n allowStaleOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.ignoreFetchAbort}\n */\n ignoreFetchAbort: boolean\n\n /** {@link LRUCache.OptionsBase.backgroundFetchSize} */\n backgroundFetchSize: number\n\n // computed properties\n #size: LRUCache.Count\n #calculatedSize: LRUCache.Size\n #keyMap: Map\n #keyList: (K | undefined)[]\n #valList: (V | BackgroundFetch | undefined)[]\n #next: NumberArray\n #prev: NumberArray\n #head: Index\n #tail: Index\n #free: StackLike\n #disposed?: DisposeTask[]\n #sizes?: ZeroArray\n #starts?: ZeroArray\n #ttls?: ZeroArray\n #autopurgeTimers?: (undefined | ReturnType)[]\n\n #hasDispose: boolean\n #hasFetchMethod: boolean\n #hasDisposeAfter: boolean\n #hasOnInsert: boolean\n\n /**\n * Do not call this method unless you need to inspect the\n * inner workings of the cache. If anything returned by this\n * object is modified in any way, strange breakage may occur.\n *\n * These fields are private for a reason!\n *\n * @internal\n */\n static unsafeExposeInternals<\n K extends {},\n V extends {},\n FC extends unknown = unknown,\n >(c: LRUCache) {\n return {\n // properties\n starts: c.#starts,\n ttls: c.#ttls,\n autopurgeTimers: c.#autopurgeTimers,\n sizes: c.#sizes,\n keyMap: c.#keyMap as Map,\n keyList: c.#keyList,\n valList: c.#valList,\n next: c.#next,\n prev: c.#prev,\n get head() {\n return c.#head\n },\n get tail() {\n return c.#tail\n },\n free: c.#free,\n // methods\n isBackgroundFetch: (p: unknown) => c.#isBackgroundFetch(p),\n backgroundFetch: (\n k: K,\n index: number | undefined,\n options: LRUCache.FetchOptions,\n context: unknown,\n ): BackgroundFetch =>\n c.#backgroundFetch(\n k,\n index as Index | undefined,\n options,\n context as FC,\n ),\n moveToTail: (index: number): void => c.#moveToTail(index as Index),\n indexes: (options?: { allowStale: boolean }) => c.#indexes(options),\n rindexes: (options?: { allowStale: boolean }) =>\n c.#rindexes(options),\n isStale: (index: number | undefined) => c.#isStale(index as Index),\n }\n }\n\n // Protected read-only members\n\n /**\n * {@link LRUCache.OptionsBase.max} (read-only)\n */\n get max(): LRUCache.Count {\n return this.#max\n }\n /**\n * {@link LRUCache.OptionsBase.maxSize} (read-only)\n */\n get maxSize(): LRUCache.Count {\n return this.#maxSize\n }\n /**\n * The total computed size of items in the cache (read-only)\n */\n get calculatedSize(): LRUCache.Size {\n return this.#calculatedSize\n }\n /**\n * The number of items stored in the cache (read-only)\n */\n get size(): LRUCache.Count {\n return this.#size\n }\n /**\n * {@link LRUCache.OptionsBase.fetchMethod} (read-only)\n */\n get fetchMethod(): LRUCache.Fetcher | undefined {\n return this.#fetchMethod\n }\n get memoMethod(): LRUCache.Memoizer | undefined {\n return this.#memoMethod\n }\n /**\n * {@link LRUCache.OptionsBase.dispose} (read-only)\n */\n get dispose() {\n return this.#dispose\n }\n /**\n * {@link LRUCache.OptionsBase.onInsert} (read-only)\n */\n get onInsert() {\n return this.#onInsert\n }\n /**\n * {@link LRUCache.OptionsBase.disposeAfter} (read-only)\n */\n get disposeAfter() {\n return this.#disposeAfter\n }\n\n constructor(options: LRUCache.Options | LRUCache) {\n const {\n max = 0,\n ttl,\n ttlResolution = 1,\n ttlAutopurge,\n updateAgeOnGet,\n updateAgeOnHas,\n allowStale,\n dispose,\n onInsert,\n disposeAfter,\n noDisposeOnSet,\n noUpdateTTL,\n maxSize = 0,\n maxEntrySize = 0,\n sizeCalculation,\n fetchMethod,\n memoMethod,\n noDeleteOnFetchRejection,\n noDeleteOnStaleGet,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n backgroundFetchSize = 1,\n perf,\n } = options\n\n this.backgroundFetchSize = backgroundFetchSize\n\n if (perf !== undefined) {\n if (typeof perf?.now !== 'function') {\n throw new TypeError(\n 'perf option must have a now() method if specified',\n )\n }\n }\n\n this.#perf = perf ?? defaultPerf\n\n if (max !== 0 && !isPosInt(max)) {\n throw new TypeError('max option must be a nonnegative integer')\n }\n\n const UintArray = max ? getUintArray(max) : Array\n if (!UintArray) {\n throw new Error('invalid max value: ' + max)\n }\n\n this.#max = max\n this.#maxSize = maxSize\n this.maxEntrySize = maxEntrySize || this.#maxSize\n this.sizeCalculation = sizeCalculation\n if (this.sizeCalculation) {\n if (!this.#maxSize && !this.maxEntrySize) {\n throw new TypeError(\n 'cannot set sizeCalculation without setting maxSize or maxEntrySize',\n )\n }\n if (typeof this.sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation set to non-function')\n }\n }\n\n if (memoMethod !== undefined && typeof memoMethod !== 'function') {\n throw new TypeError('memoMethod must be a function if defined')\n }\n this.#memoMethod = memoMethod\n\n if (fetchMethod !== undefined && typeof fetchMethod !== 'function') {\n throw new TypeError('fetchMethod must be a function if specified')\n }\n this.#fetchMethod = fetchMethod\n this.#hasFetchMethod = !!fetchMethod\n\n this.#keyMap = new Map()\n this.#keyList = Array.from({ length: max }).fill(undefined) as (\n | K\n | undefined\n )[]\n this.#valList = Array.from({ length: max }).fill(undefined) as (\n | V\n | undefined\n )[]\n this.#next = new UintArray(max)\n this.#prev = new UintArray(max)\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free = Stack.create(max)\n this.#size = 0\n this.#calculatedSize = 0\n\n if (typeof dispose === 'function') {\n this.#dispose = dispose\n }\n if (typeof onInsert === 'function') {\n this.#onInsert = onInsert\n }\n if (typeof disposeAfter === 'function') {\n this.#disposeAfter = disposeAfter\n this.#disposed = []\n } else {\n this.#disposeAfter = undefined\n this.#disposed = undefined\n }\n this.#hasDispose = !!this.#dispose\n this.#hasOnInsert = !!this.#onInsert\n this.#hasDisposeAfter = !!this.#disposeAfter\n\n this.noDisposeOnSet = !!noDisposeOnSet\n this.noUpdateTTL = !!noUpdateTTL\n this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection\n this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection\n this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort\n this.ignoreFetchAbort = !!ignoreFetchAbort\n\n // NB: maxEntrySize is set to maxSize if it's set\n if (this.maxEntrySize !== 0) {\n if (this.#maxSize !== 0) {\n if (!isPosInt(this.#maxSize)) {\n throw new TypeError(\n 'maxSize must be a positive integer if specified',\n )\n }\n }\n if (!isPosInt(this.maxEntrySize)) {\n throw new TypeError(\n 'maxEntrySize must be a positive integer if specified',\n )\n }\n this.#initializeSizeTracking()\n }\n\n this.allowStale = !!allowStale\n this.noDeleteOnStaleGet = !!noDeleteOnStaleGet\n this.updateAgeOnGet = !!updateAgeOnGet\n this.updateAgeOnHas = !!updateAgeOnHas\n this.ttlResolution =\n isPosInt(ttlResolution) || ttlResolution === 0 ? ttlResolution : 1\n this.ttlAutopurge = !!ttlAutopurge\n this.ttl = ttl || 0\n if (this.ttl) {\n if (!isPosInt(this.ttl)) {\n throw new TypeError('ttl must be a positive integer if specified')\n }\n this.#initializeTTLTracking()\n }\n\n // do not allow completely unbounded caches\n if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) {\n throw new TypeError(\n 'At least one of max, maxSize, or ttl is required',\n )\n }\n if (!this.ttlAutopurge && !this.#max && !this.#maxSize) {\n const code = 'LRU_CACHE_UNBOUNDED'\n if (shouldWarn(code)) {\n warned.add(code)\n const msg =\n 'TTL caching without ttlAutopurge, max, or maxSize can ' +\n 'result in unbounded memory consumption.'\n emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache)\n }\n }\n }\n\n /**\n * Return the number of ms left in the item's TTL. If item is not in cache,\n * returns `0`. Returns `Infinity` if item is in cache without a defined TTL.\n */\n getRemainingTTL(key: K) {\n return this.#keyMap.has(key) ? Infinity : 0\n }\n\n #initializeTTLTracking() {\n const ttls = new ZeroArray(this.#max)\n const starts = new ZeroArray(this.#max)\n this.#ttls = ttls\n this.#starts = starts\n const purgeTimers =\n this.ttlAutopurge ?\n Array.from>({\n length: this.#max,\n })\n : undefined\n this.#autopurgeTimers = purgeTimers\n\n this.#setItemTTL = (index, ttl, start = this.#perf.now()) => {\n starts[index] = ttl !== 0 ? start : 0\n ttls[index] = ttl\n setPurgetTimer(index, ttl)\n }\n\n this.#updateItemAge = index => {\n starts[index] = ttls[index] !== 0 ? this.#perf.now() : 0\n setPurgetTimer(index, ttls[index])\n }\n\n // clear out the purge timer if we're setting TTL to 0, and\n // previously had a ttl purge timer running, so it doesn't\n // fire unnecessarily. Don't need to do this if we're not doing\n // autopurge.\n const setPurgetTimer =\n !this.ttlAutopurge ?\n () => {}\n : (index: Index, ttl?: number) => {\n if (purgeTimers?.[index]) {\n clearTimeout(purgeTimers[index])\n purgeTimers[index] = undefined\n }\n if (ttl && ttl !== 0 && purgeTimers) {\n const t = setTimeout(() => {\n if (this.#isStale(index)) {\n this.#delete(this.#keyList[index] as K, 'expire')\n }\n }, ttl + 1)\n // unref() not supported on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n purgeTimers[index] = t\n }\n }\n\n this.#statusTTL = (status, index) => {\n if (ttls[index]) {\n const ttl = ttls[index]\n const start = starts[index]\n /* c8 ignore start */\n if (!ttl || !start) {\n return\n }\n /* c8 ignore stop */\n status.ttl = ttl\n status.start = start\n status.now = cachedNow || getNow()\n const age = status.now - start\n status.remainingTTL = ttl - age\n }\n }\n\n // debounce calls to perf.now() to 1s so we're not hitting\n // that costly call repeatedly.\n let cachedNow = 0\n const getNow = () => {\n const n = this.#perf.now()\n if (this.ttlResolution > 0) {\n cachedNow = n\n const t = setTimeout(() => (cachedNow = 0), this.ttlResolution)\n // not available on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n }\n return n\n }\n\n this.getRemainingTTL = key => {\n const index = this.#keyMap.get(key)\n if (index === undefined) {\n return 0\n }\n const ttl = ttls[index]\n const start = starts[index]\n if (!ttl || !start) {\n return Infinity\n }\n const age = (cachedNow || getNow()) - start\n return ttl - age\n }\n\n this.#isStale = index => {\n const s = starts[index]\n const t = ttls[index]\n return !!t && !!s && (cachedNow || getNow()) - s > t\n }\n }\n\n // conditionally set private methods related to TTL\n #updateItemAge: (index: Index) => void = () => {}\n #statusTTL: (status: LRUCache.Status, index: Index) => void =\n () => {}\n #setItemTTL: (\n index: Index,\n ttl: LRUCache.Milliseconds,\n start?: LRUCache.Milliseconds,\n // ignore because we never call this if we're not already in TTL mode\n /* c8 ignore start */\n ) => void = () => {}\n /* c8 ignore stop */\n\n #isStale: (index: Index) => boolean = () => false\n\n #initializeSizeTracking() {\n const sizes = new ZeroArray(this.#max)\n this.#calculatedSize = 0\n this.#sizes = sizes\n this.#removeItemSize = index => {\n this.#calculatedSize -= sizes[index] as number\n sizes[index] = 0\n }\n this.#requireSize = (k, v, size, sizeCalculation) => {\n if (!isPosInt(size)) {\n // provisionally accept background fetches.\n // actual value size will be checked when they return.\n if (this.#isBackgroundFetch(v)) {\n // NB: this cannot occur if v.__staleWhileFetching is set,\n // because in that case, it would take on the size of the\n // existing entry that it temporarily replaces.\n return this.backgroundFetchSize\n }\n if (sizeCalculation) {\n if (typeof sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation must be a function')\n }\n size = sizeCalculation(v, k)\n if (!isPosInt(size)) {\n throw new TypeError(\n 'sizeCalculation return invalid (expect positive integer)',\n )\n }\n } else {\n throw new TypeError(\n 'invalid size value (must be positive integer). ' +\n 'When maxSize or maxEntrySize is used, sizeCalculation ' +\n 'or size must be set.',\n )\n }\n }\n return size\n }\n\n this.#addItemSize = (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status,\n ) => {\n sizes[index] = size\n if (this.#maxSize) {\n const maxSize = this.#maxSize - sizes[index]\n while (this.#calculatedSize > maxSize) {\n this.#evict(true)\n }\n }\n this.#calculatedSize += sizes[index]\n if (status) {\n status.entrySize = size\n status.totalCalculatedSize = this.#calculatedSize\n }\n }\n }\n\n #removeItemSize: (index: Index) => void = _i => {}\n\n #addItemSize: (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status,\n ) => void = (_i, _s, _st) => {}\n\n #requireSize: (\n k: K,\n v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator,\n status?: LRUCache.Status,\n ) => LRUCache.Size = (\n _k: K,\n _v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator,\n ) => {\n if (size || sizeCalculation) {\n throw new TypeError(\n 'cannot set size without setting maxSize or maxEntrySize on cache',\n )\n }\n return 0\n };\n\n *#indexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#tail; this.#isValidIndex(i); ) {\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#head) {\n break\n } else {\n i = this.#prev[i] as Index\n }\n }\n }\n }\n\n *#rindexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#head; this.#isValidIndex(i); ) {\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#tail) {\n break\n } else {\n i = this.#next[i] as Index\n }\n }\n }\n }\n\n #isValidIndex(index: Index) {\n return (\n index !== undefined &&\n this.#keyMap.get(this.#keyList[index] as K) === index\n )\n }\n\n /**\n * Return a generator yielding `[key, value]` pairs,\n * in order from most recently used to least recently used.\n */\n *entries() {\n for (const i of this.#indexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]] as [K, V]\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.entries}\n *\n * Return a generator yielding `[key, value]` pairs,\n * in order from least recently used to most recently used.\n */\n *rentries() {\n for (const i of this.#rindexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]]\n }\n }\n }\n\n /**\n * Return a generator yielding the keys in the cache,\n * in order from most recently used to least recently used.\n */\n *keys() {\n for (const i of this.#indexes()) {\n const k = this.#keyList[i]\n if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield k\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.keys}\n *\n * Return a generator yielding the keys in the cache,\n * in order from least recently used to most recently used.\n */\n *rkeys() {\n for (const i of this.#rindexes()) {\n const k = this.#keyList[i]\n if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield k\n }\n }\n }\n\n /**\n * Return a generator yielding the values in the cache,\n * in order from most recently used to least recently used.\n */\n *values() {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i] as V\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.values}\n *\n * Return a generator yielding the values in the cache,\n * in order from least recently used to most recently used.\n */\n *rvalues() {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i]\n }\n }\n }\n\n /**\n * Iterating over the cache itself yields the same results as\n * {@link LRUCache.entries}\n */\n [Symbol.iterator]() {\n return this.entries()\n }\n\n /**\n * A String value that is used in the creation of the default string\n * description of an object. Called by the built-in method\n * `Object.prototype.toString`.\n */\n [Symbol.toStringTag] = 'LRUCache'\n\n /**\n * Find a value for which the supplied fn method returns a truthy value,\n * similar to `Array.find()`. fn is called as `fn(value, key, cache)`.\n */\n find(\n fn: (v: V, k: K, self: LRUCache) => boolean,\n getOptions: LRUCache.GetOptions = {},\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n if (fn(value, this.#keyList[i] as K, this)) {\n return this.#get(this.#keyList[i] as K, getOptions)\n }\n }\n }\n\n /**\n * Call the supplied function on each item in the cache, in order from most\n * recently used to least recently used.\n *\n * `fn` is called as `fn(value, key, cache)`.\n *\n * If `thisp` is provided, function will be called in the `this`-context of\n * the provided object, or the cache if no `thisp` object is provided.\n *\n * Does not update age or recenty of use, or iterate over stale values.\n */\n forEach(\n fn: (v: V, k: K, self: LRUCache) => unknown,\n thisp: unknown = this,\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * The same as {@link LRUCache.forEach} but items are iterated over in\n * reverse order. (ie, less recently used items are iterated over first.)\n */\n rforEach(\n fn: (v: V, k: K, self: LRUCache) => unknown,\n thisp: unknown = this,\n ) {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * Delete any stale entries. Returns true if anything was removed,\n * false otherwise.\n */\n purgeStale() {\n let deleted = false\n for (const i of this.#rindexes({ allowStale: true })) {\n if (this.#isStale(i)) {\n this.#delete(this.#keyList[i] as K, 'expire')\n deleted = true\n }\n }\n return deleted\n }\n\n /**\n * Get the extended info about a given entry, to get its value, size, and\n * TTL info simultaneously. Returns `undefined` if the key is not present.\n *\n * Unlike {@link LRUCache#dump}, which is designed to be portable and survive\n * serialization, the `start` value is always the current timestamp, and the\n * `ttl` is a calculated remaining time to live (negative if expired).\n *\n * Always returns stale values, if their info is found in the cache, so be\n * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl})\n * if relevant.\n */\n info(key: K): LRUCache.Entry | undefined {\n const i = this.#keyMap.get(key)\n if (i === undefined) return undefined\n const v = this.#valList[i]\n /* c8 ignore start - this isn't tested for the info function,\n * but it's the same logic as found in other places. */\n const value: V | undefined =\n this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) return undefined\n /* c8 ignore stop */\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n const ttl = this.#ttls[i]\n const start = this.#starts[i]\n if (ttl && start) {\n const remain = ttl - (this.#perf.now() - start)\n entry.ttl = remain\n entry.start = Date.now()\n }\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n return entry\n }\n\n /**\n * Return an array of [key, {@link LRUCache.Entry}] tuples which can be\n * passed to {@link LRUCache#load}.\n *\n * The `start` fields are calculated relative to a portable `Date.now()`\n * timestamp, even if `performance.now()` is available.\n *\n * Stale entries are always included in the `dump`, even if\n * {@link LRUCache.OptionsBase.allowStale} is false.\n *\n * Note: this returns an actual array, not a generator, so it can be more\n * easily passed around.\n */\n dump() {\n const arr: [K, LRUCache.Entry][] = []\n for (const i of this.#indexes({ allowStale: true })) {\n const key = this.#keyList[i]\n const v = this.#valList[i]\n const value: V | undefined =\n this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined || key === undefined) continue\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n entry.ttl = this.#ttls[i]\n // always dump the start relative to a portable timestamp\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = this.#perf.now() - (this.#starts[i] as number)\n entry.start = Math.floor(Date.now() - age)\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n arr.unshift([key, entry])\n }\n return arr\n }\n\n /**\n * Reset the cache and load in the items in entries in the order listed.\n *\n * The shape of the resulting cache may be different if the same options are\n * not used in both caches.\n *\n * The `start` fields are assumed to be calculated relative to a portable\n * `Date.now()` timestamp, even if `performance.now()` is available.\n */\n load(arr: [K, LRUCache.Entry][]) {\n this.clear()\n for (const [key, entry] of arr) {\n if (entry.start) {\n // entry.start is a portable timestamp, but we may be using\n // node's performance.now(), so calculate the offset, so that\n // we get the intended remaining TTL, no matter how long it's\n // been on ice.\n //\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = Date.now() - entry.start\n entry.start = this.#perf.now() - age\n }\n this.#set(key, entry.value, entry)\n }\n }\n\n /**\n * Add a value to the cache.\n *\n * Note: if `undefined` is specified as a value, this is an alias for\n * {@link LRUCache#delete}\n *\n * Fields on the {@link LRUCache.SetOptions} options param will override\n * their corresponding values in the constructor options for the scope\n * of this single `set()` operation.\n *\n * If `start` is provided, then that will set the effective start\n * time for the TTL calculation. Note that this must be a previous\n * value of `performance.now()` if supported, or a previous value of\n * `Date.now()` if not.\n *\n * Options object may also include `size`, which will prevent\n * calling the `sizeCalculation` function and just use the specified\n * number if it is a positive integer, and `noDisposeOnSet` which\n * will prevent calling a `dispose` function in the case of\n * overwrites.\n *\n * If the `size` (or return value of `sizeCalculation`) for a given\n * entry is greater than `maxEntrySize`, then the item will not be\n * added to the cache.\n *\n * Will update the recency of the entry.\n *\n * If the value is `undefined`, then this is an alias for\n * `cache.delete(key)`. `undefined` is never stored in the cache.\n */\n set(\n k: K,\n v: V | undefined,\n setOptions: LRUCache.SetOptions = {},\n ) {\n const { status = metrics.hasSubscribers ? {} : undefined } = setOptions\n setOptions.status = status\n if (status) {\n status.op = 'set'\n status.key = k\n if (v !== undefined) status.value = v\n status.cache = this\n }\n const result = this.#set(k, v, setOptions)\n if (status && metrics.hasSubscribers) {\n metrics.publish(status)\n }\n return result\n }\n\n #set(\n k: K,\n v: V | BackgroundFetch | undefined,\n setOptions: LRUCache.SetOptions,\n bf?: BackgroundFetch,\n ) {\n const {\n ttl = this.ttl,\n start,\n noDisposeOnSet = this.noDisposeOnSet,\n sizeCalculation = this.sizeCalculation,\n status,\n } = setOptions\n\n const isBF = this.#isBackgroundFetch(v)\n if (v === undefined) {\n if (status) status.set = 'deleted'\n this.delete(k)\n return this\n }\n let { noUpdateTTL = this.noUpdateTTL } = setOptions\n\n if (status && !isBF) status.value = v\n\n const size = this.#requireSize(\n k,\n v,\n setOptions.size || 0,\n sizeCalculation,\n status,\n )\n // if the item doesn't fit, don't do anything\n // NB: maxEntrySize set to maxSize by default\n if (this.maxEntrySize && size > this.maxEntrySize) {\n // have to delete, in case something is there already.\n this.#delete(k, 'set')\n if (status) {\n status.set = 'miss'\n status.maxEntrySizeExceeded = true\n }\n return this\n }\n let index = this.#size === 0 ? undefined : this.#keyMap.get(k)\n if (index === undefined) {\n // addition\n index = (\n this.#size === 0 ? this.#tail\n : this.#free.length !== 0 ? this.#free.pop()\n : this.#size === this.#max ? this.#evict(false)\n : this.#size) as Index\n this.#keyList[index] = k\n this.#valList[index] = v\n this.#keyMap.set(k, index)\n this.#next[this.#tail] = index\n this.#prev[index] = this.#tail\n this.#tail = index\n this.#size++\n this.#addItemSize(index, size, status)\n if (status) status.set = 'add'\n noUpdateTTL = false\n if (this.#hasOnInsert && !isBF) {\n this.#onInsert?.(v, k, 'add')\n }\n } else {\n // update\n // might be updating a background fetch!\n this.#moveToTail(index)\n const oldVal = this.#valList[index]!\n if (v !== oldVal) {\n if (!noDisposeOnSet) {\n if (this.#isBackgroundFetch(oldVal)) {\n if (oldVal !== bf) {\n // setting over a background fetch, not merely resolving it.\n oldVal.__abortController.abort(new Error('replaced'))\n }\n const { __staleWhileFetching: s } = oldVal\n if (s !== undefined && s !== v) {\n if (this.#hasDispose) {\n this.#dispose?.(s, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([s, k, 'set'])\n }\n }\n } else {\n if (this.#hasDispose) {\n this.#dispose?.(oldVal, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldVal, k, 'set'])\n }\n }\n }\n this.#removeItemSize(index)\n this.#addItemSize(index, size, status)\n this.#valList[index] = v\n if (!isBF) {\n const oldValue =\n oldVal && this.#isBackgroundFetch(oldVal) ?\n oldVal.__staleWhileFetching\n : oldVal\n const setType =\n oldValue === undefined ? 'add'\n : v !== oldValue ? 'replace'\n : 'update'\n if (status) {\n status.set = setType\n if (oldValue !== undefined) status.oldValue = oldValue\n }\n if (this.#hasOnInsert) {\n this.onInsert?.(v, k, setType)\n }\n }\n } else if (!isBF) {\n if (status) {\n status.set = 'update'\n }\n if (this.#hasOnInsert) {\n this.onInsert?.(v, k, 'update')\n }\n }\n }\n if (ttl !== 0 && !this.#ttls) {\n this.#initializeTTLTracking()\n }\n if (this.#ttls) {\n if (!noUpdateTTL) {\n this.#setItemTTL(index, ttl, start)\n }\n if (status) this.#statusTTL(status, index)\n }\n if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return this\n }\n\n /**\n * Evict the least recently used item, returning its value or\n * `undefined` if cache is empty.\n */\n pop(): V | undefined {\n try {\n while (this.#size) {\n const val = this.#valList[this.#head]\n this.#evict(true)\n if (this.#isBackgroundFetch(val)) {\n if (val.__staleWhileFetching) {\n return val.__staleWhileFetching\n }\n } else if (val !== undefined) {\n return val\n }\n }\n } finally {\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n }\n\n #evict(free: boolean) {\n const head = this.#head\n const k = this.#keyList[head]!\n const v = this.#valList[head]!\n const isBF = this.#isBackgroundFetch(v)\n if (isBF) {\n v.__abortController.abort(new Error('evicted'))\n }\n const oldValue = isBF ? v.__staleWhileFetching : v\n if (\n (this.#hasDispose || this.#hasDisposeAfter) &&\n oldValue !== undefined\n ) {\n if (this.#hasDispose) {\n this.#dispose?.(oldValue, k, 'evict')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldValue, k, 'evict'])\n }\n }\n this.#removeItemSize(head)\n if (this.#autopurgeTimers?.[head]) {\n clearTimeout(this.#autopurgeTimers[head])\n this.#autopurgeTimers[head] = undefined\n }\n // if we aren't about to use the index, then null these out\n if (free) {\n this.#keyList[head] = undefined\n this.#valList[head] = undefined\n this.#free.push(head)\n }\n if (this.#size === 1) {\n this.#head = this.#tail = 0 as Index\n this.#free.length = 0\n } else {\n this.#head = this.#next[head] as Index\n }\n this.#keyMap.delete(k)\n this.#size--\n return head\n }\n\n /**\n * Check if a key is in the cache, without updating the recency of use.\n * Will return false if the item is stale, even though it is technically\n * in the cache.\n *\n * Check if a key is in the cache, without updating the recency of\n * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set\n * to `true` in either the options or the constructor.\n *\n * Will return `false` if the item is stale, even though it is technically in\n * the cache. The difference can be determined (if it matters) by using a\n * `status` argument, and inspecting the `has` field.\n *\n * Will not update item age unless\n * {@link LRUCache.OptionsBase.updateAgeOnHas} is set.\n */\n has(k: K, hasOptions: LRUCache.HasOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } = hasOptions\n hasOptions.status = status\n if (status) {\n status.op = 'has'\n status.key = k\n status.cache = this\n }\n const result = this.#has(k, hasOptions)\n if (metrics.hasSubscribers) metrics.publish(status)\n return result\n }\n #has(k: K, hasOptions: LRUCache.HasOptions = {}) {\n const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n const v = this.#valList[index]\n if (\n this.#isBackgroundFetch(v) &&\n v.__staleWhileFetching === undefined\n ) {\n return false\n }\n if (!this.#isStale(index)) {\n if (updateAgeOnHas) {\n this.#updateItemAge(index)\n }\n if (status) {\n status.has = 'hit'\n this.#statusTTL(status, index)\n }\n return true\n } else if (status) {\n status.has = 'stale'\n this.#statusTTL(status, index)\n }\n } else if (status) {\n status.has = 'miss'\n }\n return false\n }\n\n /**\n * Like {@link LRUCache#get} but doesn't update recency or delete stale\n * items.\n *\n * Returns `undefined` if the item is stale, unless\n * {@link LRUCache.OptionsBase.allowStale} is set.\n */\n peek(k: K, peekOptions: LRUCache.PeekOptions = {}) {\n const { status = hasSubscribers() ? {} : undefined } = peekOptions\n if (status) {\n status.op = 'peek'\n status.key = k\n status.cache = this\n }\n peekOptions.status = status\n const result = this.#peek(k, peekOptions)\n if (metrics.hasSubscribers) {\n metrics.publish(status)\n }\n return result\n }\n #peek(k: K, peekOptions: LRUCache.PeekOptions) {\n const { status, allowStale = this.allowStale } = peekOptions\n const index = this.#keyMap.get(k)\n if (index === undefined || (!allowStale && this.#isStale(index))) {\n if (status) status.peek = index === undefined ? 'miss' : 'stale'\n return undefined\n }\n const v = this.#valList[index]\n const val = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (status) {\n if (val !== undefined) {\n status.peek = 'hit'\n status.value = val\n } else {\n status.peek = 'miss'\n }\n }\n return val\n }\n\n #backgroundFetch(\n k: K,\n index: Index | undefined,\n options: LRUCache.FetchOptions,\n context: FC,\n ): BackgroundFetch {\n const v = index === undefined ? undefined : this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n return v\n }\n\n const ac = new AbortController()\n const { signal } = options\n // when/if our AC signals, then stop listening to theirs.\n signal?.addEventListener('abort', () => ac.abort(signal.reason), {\n signal: ac.signal,\n })\n\n const fetchOpts = {\n signal: ac.signal,\n options,\n context,\n }\n\n const cb = (v: V | undefined, updateCache = false): V | undefined => {\n const { aborted } = ac.signal\n const ignoreAbort = options.ignoreFetchAbort && v !== undefined\n const proceed =\n options.ignoreFetchAbort ||\n !!(options.allowStaleOnFetchAbort && v !== undefined)\n if (options.status) {\n if (aborted && !updateCache) {\n options.status.fetchAborted = true\n options.status.fetchError = ac.signal.reason\n if (ignoreAbort) options.status.fetchAbortIgnored = true\n } else {\n options.status.fetchResolved = true\n }\n }\n if (aborted && !ignoreAbort && !updateCache) {\n return fetchFail(ac.signal.reason, proceed)\n }\n // either we didn't abort, and are still here, or we did, and ignored\n const bf = p as BackgroundFetch\n // if nothing else has been written there but we're set to update the\n // cache and ignore the abort, or if it's still pending on this specific\n // background request, then write it to the cache.\n const vl = this.#valList[index as Index]\n if (vl === p || (vl === undefined && ignoreAbort && updateCache)) {\n if (v === undefined) {\n if (bf.__staleWhileFetching !== undefined) {\n this.#valList[index as Index] = bf.__staleWhileFetching\n } else {\n this.#delete(k, 'fetch')\n }\n } else {\n if (options.status) options.status.fetchUpdated = true\n this.#set(k, v, fetchOpts.options, bf)\n }\n }\n return v\n }\n\n const eb = (er: unknown) => {\n if (options.status) {\n options.status.fetchRejected = true\n options.status.fetchError = er as Error\n }\n // do not pass go, do not collect $200\n return fetchFail(er, false)\n }\n\n const fetchFail = (er: unknown, proceed: boolean): V | undefined => {\n const { aborted } = ac.signal\n const allowStaleAborted = aborted && options.allowStaleOnFetchAbort\n const allowStale =\n allowStaleAborted || options.allowStaleOnFetchRejection\n const noDelete = allowStale || options.noDeleteOnFetchRejection\n const bf = p as BackgroundFetch\n if (this.#valList[index as Index] === p) {\n // if we allow stale on fetch rejections, then we need to ensure that\n // the stale value is not removed from the cache when the fetch fails.\n const del =\n !noDelete || (!proceed && bf.__staleWhileFetching === undefined)\n if (del) {\n this.#delete(k, 'fetch')\n } else if (!allowStaleAborted) {\n // still replace the *promise* with the stale value,\n // since we are done with the promise at this point.\n // leave it untouched if we're still waiting for an\n // aborted background fetch that hasn't yet returned.\n this.#valList[index as Index] = bf.__staleWhileFetching\n }\n }\n if (allowStale) {\n if (options.status && bf.__staleWhileFetching !== undefined) {\n options.status.returnedStale = true\n }\n return bf.__staleWhileFetching\n } else if (bf.__returned === bf) {\n throw er\n }\n }\n\n const pcall = (\n res: (v: V | undefined) => void,\n rej: (e: unknown) => void,\n ) => {\n const fmp = this.#fetchMethod?.(k, v, fetchOpts)\n // ignored, we go until we finish, regardless.\n // defer check until we are actually aborting,\n // so fetchMethod can override.\n ac.signal.addEventListener('abort', () => {\n if (!options.ignoreFetchAbort || options.allowStaleOnFetchAbort) {\n res(undefined)\n // when it eventually resolves, update the cache.\n if (options.allowStaleOnFetchAbort) {\n res = v => cb(v, true)\n }\n }\n })\n if (fmp && fmp instanceof Promise) {\n fmp.then(v => res(v === undefined ? undefined : v), rej)\n } else if (fmp !== undefined) {\n res(fmp)\n }\n }\n\n if (options.status) options.status.fetchDispatched = true\n const p = new Promise(pcall).then(cb, eb)\n const bf: BackgroundFetch = Object.assign(p, {\n __abortController: ac,\n __staleWhileFetching: v,\n __returned: undefined,\n })\n\n if (index === undefined) {\n // internal, don't expose status.\n this.#set(k, bf, { ...fetchOpts.options, status: undefined })\n index = this.#keyMap.get(k)\n } else {\n // do not call #set, because we do not want to adjust its place\n // in the lru queue, as it has not yet been \"used\". Also, we don't\n // need to worry about evicting for size, because a background fetch\n // over a stale value is treated as the same size as its stale value.\n this.#valList[index] = bf\n }\n return bf\n }\n\n #isBackgroundFetch(p: unknown): p is BackgroundFetch {\n if (!this.#hasFetchMethod) return false\n const b = p as BackgroundFetch\n return (\n !!b &&\n b instanceof Promise &&\n b.hasOwnProperty('__staleWhileFetching') &&\n b.__abortController instanceof AbortController\n )\n }\n\n /**\n * Make an asynchronous cached fetch using the\n * {@link LRUCache.OptionsBase.fetchMethod} function.\n *\n * If the value is in the cache and not stale, then the returned\n * Promise resolves to the value.\n *\n * If not in the cache, or beyond its TTL staleness, then\n * `fetchMethod(key, staleValue, { options, signal, context })` is\n * called, and the value returned will be added to the cache once\n * resolved.\n *\n * If called with `allowStale`, and an asynchronous fetch is\n * currently in progress to reload a stale value, then the former\n * stale value will be returned.\n *\n * If called with `forceRefresh`, then the cached item will be\n * re-fetched, even if it is not stale. However, if `allowStale` is also\n * set, then the old value will still be returned. This is useful\n * in cases where you want to force a reload of a cached value. If\n * a background fetch is already in progress, then `forceRefresh`\n * has no effect.\n *\n * If multiple fetches for the same key are issued, then they will all be\n * coalesced into a single call to fetchMethod.\n *\n * Note that this means that handling options such as\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort},\n * {@link LRUCache.FetchOptions.signal},\n * and {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} will be\n * determined by the FIRST fetch() call for a given key.\n *\n * This is a known (fixable) shortcoming which will be addresed on when\n * someone complains about it, as the fix would involve added complexity and\n * may not be worth the costs for this edge case.\n *\n * If {@link LRUCache.OptionsBase.fetchMethod} is not specified, then this is\n * effectively an alias for `Promise.resolve(cache.get(key))`.\n *\n * When the fetch method resolves to a value, if the fetch has not\n * been aborted due to deletion, eviction, or being overwritten,\n * then it is added to the cache using the options provided.\n *\n * If the key is evicted or deleted before the `fetchMethod`\n * resolves, then the AbortSignal passed to the `fetchMethod` will\n * receive an `abort` event, and the promise returned by `fetch()`\n * will reject with the reason for the abort.\n *\n * If a `signal` is passed to the `fetch()` call, then aborting the\n * signal will abort the fetch and cause the `fetch()` promise to\n * reject with the reason provided.\n *\n * **Setting `context`**\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the {@link LRUCache} constructor, then all\n * calls to `cache.fetch()` _must_ provide a `context` option. If\n * set to `undefined` or `void`, then calls to fetch _must not_\n * provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that\n * might be relevant in the course of fetching the data. It is only\n * relevant for the course of a single `fetch()` operation, and\n * discarded afterwards.\n *\n * **Note: `fetch()` calls are inflight-unique**\n *\n * If you call `fetch()` multiple times with the same key value,\n * then every call after the first will resolve on the same\n * promise1,\n * _even if they have different settings that would otherwise change\n * the behavior of the fetch_, such as `noDeleteOnFetchRejection`\n * or `ignoreFetchAbort`.\n *\n * In most cases, this is not a problem (in fact, only fetching\n * something once is what you probably want, if you're caching in\n * the first place). If you are changing the fetch() options\n * dramatically between runs, there's a good chance that you might\n * be trying to fit divergent semantics into a single object, and\n * would be better off with multiple cache instances.\n *\n * **1**: Ie, they're not the \"same Promise\", but they resolve at\n * the same time, because they're both waiting on the same\n * underlying fetchMethod response.\n */\n\n fetch(\n k: K,\n fetchOptions: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext,\n ): Promise\n\n // this overload not allowed if context is required\n fetch(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n fetchOptions?: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : never,\n ): Promise\n fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const ths = tracing.hasSubscribers\n const { status = hasSubscribers() ? {} : undefined } = fetchOptions\n fetchOptions.status = status\n if (status && fetchOptions.context) {\n status.context = fetchOptions.context\n }\n const p = this.#fetch(k, fetchOptions)\n if (status && ths) {\n status.trace = true\n tracing.tracePromise(() => p, status).catch(() => {})\n }\n return p\n }\n\n async #fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const {\n // get options\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n // set options\n ttl = this.ttl,\n noDisposeOnSet = this.noDisposeOnSet,\n size = 0,\n sizeCalculation = this.sizeCalculation,\n noUpdateTTL = this.noUpdateTTL,\n // fetch exclusive options\n noDeleteOnFetchRejection = this.noDeleteOnFetchRejection,\n allowStaleOnFetchRejection = this.allowStaleOnFetchRejection,\n ignoreFetchAbort = this.ignoreFetchAbort,\n allowStaleOnFetchAbort = this.allowStaleOnFetchAbort,\n context,\n forceRefresh = false,\n status,\n signal,\n } = fetchOptions\n if (status) {\n status.op = 'fetch'\n status.key = k\n if (forceRefresh) status.forceRefresh = true\n status.cache = this\n }\n\n if (!this.#hasFetchMethod) {\n if (status) status.fetch = 'get'\n return this.#get(k, {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n status,\n })\n }\n\n const options = {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n ttl,\n noDisposeOnSet,\n size,\n sizeCalculation,\n noUpdateTTL,\n noDeleteOnFetchRejection,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n status,\n signal,\n }\n\n let index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.fetch = 'miss'\n const p = this.#backgroundFetch(k, index, options, context as FC)\n return (p.__returned = p)\n } else {\n // in cache, maybe already fetching\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n const stale = allowStale && v.__staleWhileFetching !== undefined\n if (status) {\n status.fetch = 'inflight'\n if (stale) status.returnedStale = true\n }\n return stale ? v.__staleWhileFetching : (v.__returned = v)\n }\n\n // if we force a refresh, that means do NOT serve the cached value,\n // unless we are already in the process of refreshing the cache.\n const isStale = this.#isStale(index)\n if (!forceRefresh && !isStale) {\n if (status) status.fetch = 'hit'\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n if (status) this.#statusTTL(status, index)\n return v\n }\n\n // ok, it is stale or a forced refresh, and not already fetching.\n // refresh the cache.\n const p = this.#backgroundFetch(k, index, options, context as FC)\n const hasStale = p.__staleWhileFetching !== undefined\n const staleVal = hasStale && allowStale\n if (status) {\n status.fetch = isStale ? 'stale' : 'refresh'\n if (staleVal && isStale) status.returnedStale = true\n }\n return staleVal ? p.__staleWhileFetching : (p.__returned = p)\n }\n }\n\n /**\n * In some cases, `cache.fetch()` may resolve to `undefined`, either because\n * a {@link LRUCache.OptionsBase#fetchMethod} was not provided (turning\n * `cache.fetch(k)` into just an async wrapper around `cache.get(k)`) or\n * because `ignoreFetchAbort` was specified (either to the constructor or\n * in the {@link LRUCache.FetchOptions}). Also, the\n * {@link LRUCache.OptionsBase.fetchMethod} may return `undefined` or `void`, making\n * the test even more complicated.\n *\n * Because inferring the cases where `undefined` might be returned are so\n * cumbersome, but testing for `undefined` can also be annoying, this method\n * can be used, which will reject if `this.fetch()` resolves to undefined.\n */\n forceFetch(\n k: K,\n fetchOptions: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext,\n ): Promise\n // this overload not allowed if context is required\n forceFetch(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n fetchOptions?: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : never,\n ): Promise\n forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const ths = tracing.hasSubscribers\n const { status = hasSubscribers() ? {} : undefined } = fetchOptions\n fetchOptions.status = status\n if (status && fetchOptions.context) {\n status.context = fetchOptions.context\n }\n const p = this.#forceFetch(k, fetchOptions)\n if (status && ths) {\n status.trace = true\n tracing.tracePromise(() => p, status).catch(() => {})\n }\n return p\n }\n\n async #forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ) {\n const v = await this.#fetch(k, fetchOptions)\n if (v === undefined) throw new Error('fetch() returned undefined')\n return v\n }\n\n /**\n * If the key is found in the cache, then this is equivalent to\n * {@link LRUCache#get}. If not, in the cache, then calculate the value using\n * the {@link LRUCache.OptionsBase.memoMethod}, and add it to the cache.\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the LRUCache constructor, then all calls to `cache.memo()`\n * _must_ provide a `context` option. If set to `undefined` or `void`, then\n * calls to memo _must not_ provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that might be\n * relevant in the course of fetching the data. It is only relevant for the\n * course of a single `memo()` operation, and discarded afterwards.\n */\n memo(\n k: K,\n memoOptions: unknown extends FC ? LRUCache.MemoOptions\n : FC extends undefined | void ? LRUCache.MemoOptionsNoContext\n : LRUCache.MemoOptionsWithContext,\n ): V\n // this overload not allowed if context is required\n memo(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n memoOptions?: unknown extends FC ? LRUCache.MemoOptions\n : FC extends undefined | void ? LRUCache.MemoOptionsNoContext\n : never,\n ): V\n memo(k: K, memoOptions: LRUCache.MemoOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } =\n memoOptions\n memoOptions.status = status\n if (status) {\n status.op = 'memo'\n status.key = k\n if (memoOptions.context) {\n status.context = memoOptions.context\n }\n status.cache = this\n }\n const result = this.#memo(k, memoOptions)\n if (status) status.value = result\n if (metrics.hasSubscribers) metrics.publish(status)\n return result\n }\n #memo(k: K, memoOptions: LRUCache.MemoOptions = {}) {\n const memoMethod = this.#memoMethod\n if (!memoMethod) {\n throw new Error('no memoMethod provided to constructor')\n }\n const { context, status, forceRefresh, ...options } = memoOptions\n if (status && forceRefresh) status.forceRefresh = true\n const v = this.#get(k, options)\n const refresh = forceRefresh || v === undefined\n if (status) {\n status.memo = refresh ? 'miss' : 'hit'\n if (!refresh) status.value = v\n }\n if (!refresh) return v\n const vv = memoMethod(k, v, {\n options,\n context,\n } as LRUCache.MemoizerOptions)\n if (status) status.value = vv\n this.#set(k, vv, options)\n return vv\n }\n\n /**\n * Return a value from the cache. Will update the recency of the cache\n * entry found.\n *\n * If the key is not found, get() will return `undefined`.\n */\n get(k: K, getOptions: LRUCache.GetOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } = getOptions\n getOptions.status = status\n if (status) {\n status.op = 'get'\n status.key = k\n status.cache = this\n }\n const result = this.#get(k, getOptions)\n if (status) {\n if (result !== undefined) status.value = result\n if (metrics.hasSubscribers) metrics.publish(status)\n }\n return result\n }\n\n #get(k: K, getOptions: LRUCache.GetOptions = {}) {\n const {\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n status,\n } = getOptions\n const index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.get = 'miss'\n return undefined\n }\n const value = this.#valList[index]\n const fetching = this.#isBackgroundFetch(value)\n if (status) this.#statusTTL(status, index)\n if (this.#isStale(index)) {\n // delete only if not an in-flight background fetch\n if (!fetching) {\n if (!noDeleteOnStaleGet) {\n this.#delete(k, 'expire')\n }\n if (status) status.get = 'stale'\n if (allowStale) {\n if (status) status.returnedStale = true\n return value\n }\n return undefined\n }\n if (status) status.get = 'stale-fetching'\n if (allowStale && value.__staleWhileFetching !== undefined) {\n if (status) status.returnedStale = true\n return value.__staleWhileFetching\n }\n return undefined\n }\n // not stale\n if (status) status.get = fetching ? 'fetching' : 'hit'\n // if we're currently fetching it, we don't actually have it yet\n // it's not stale, which means this isn't a staleWhileRefetching.\n // If it's not stale, and fetching, AND has a __staleWhileFetching\n // value, then that means the user fetched with {forceRefresh:true},\n // so it's safe to return that value.\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n return fetching ? value.__staleWhileFetching : value\n }\n\n #connect(p: Index, n: Index) {\n this.#prev[n] = p\n this.#next[p] = n\n }\n\n #moveToTail(index: Index): void {\n // if tail already, nothing to do\n // if head, move head to next[index]\n // else\n // move next[prev[index]] to next[index] (head has no prev)\n // move prev[next[index]] to prev[index]\n // prev[index] = tail\n // next[tail] = index\n // tail = index\n if (index !== this.#tail) {\n if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n this.#connect(\n this.#prev[index] as Index,\n this.#next[index] as Index,\n )\n }\n this.#connect(this.#tail, index)\n this.#tail = index\n }\n }\n\n /**\n * Deletes a key out of the cache.\n *\n * Returns true if the key was deleted, false otherwise.\n */\n delete(k: K) {\n return this.#delete(k, 'delete')\n }\n\n #delete(k: K, reason: LRUCache.DisposeReason) {\n if (metrics.hasSubscribers) {\n metrics.publish({\n op: 'delete',\n delete: reason,\n key: k,\n cache: this,\n })\n }\n let deleted = false\n if (this.#size !== 0) {\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n if (this.#autopurgeTimers?.[index]) {\n clearTimeout(this.#autopurgeTimers?.[index])\n this.#autopurgeTimers[index] = undefined\n }\n deleted = true\n if (this.#size === 1) {\n this.#clear(reason)\n } else {\n this.#removeItemSize(index)\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k, reason])\n }\n }\n this.#keyMap.delete(k)\n this.#keyList[index] = undefined\n this.#valList[index] = undefined\n if (index === this.#tail) {\n this.#tail = this.#prev[index] as Index\n } else if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n const pi = this.#prev[index] as number\n this.#next[pi] = this.#next[index] as number\n const ni = this.#next[index] as number\n this.#prev[ni] = this.#prev[index] as number\n }\n this.#size--\n this.#free.push(index)\n }\n }\n }\n if (this.#hasDisposeAfter && this.#disposed?.length) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return deleted\n }\n\n /**\n * Clear the cache entirely, throwing away all values.\n */\n clear() {\n return this.#clear('delete')\n }\n #clear(reason: LRUCache.DisposeReason) {\n for (const index of this.#rindexes({ allowStale: true })) {\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else {\n const k = this.#keyList[index]\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k as K, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k as K, reason])\n }\n }\n }\n\n this.#keyMap.clear()\n void this.#valList.fill(undefined)\n this.#keyList.fill(undefined)\n if (this.#ttls && this.#starts) {\n this.#ttls.fill(0)\n this.#starts.fill(0)\n for (const t of this.#autopurgeTimers ?? []) {\n if (t !== undefined) clearTimeout(t)\n }\n this.#autopurgeTimers?.fill(undefined)\n }\n if (this.#sizes) {\n this.#sizes.fill(0)\n }\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free.length = 0\n this.#calculatedSize = 0\n this.#size = 0\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/browser/index.min.js b/node_modules/lru-cache/dist/commonjs/browser/index.min.js new file mode 100644 index 00000000..8e424610 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/browser/index.min.js @@ -0,0 +1,2 @@ +"use strict";var j=(c,t)=>()=>(t||c((t={exports:{}}).exports,t),t.exports);var I=j(O=>{"use strict";Object.defineProperty(O,"__esModule",{value:!0});O.tracing=O.metrics=void 0;var U={hasSubscribers:!1};O.metrics=U;O.tracing=U});var P=j(D=>{"use strict";Object.defineProperty(D,"__esModule",{value:!0});D.defaultPerf=void 0;D.defaultPerf=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date});Object.defineProperty(exports,"__esModule",{value:!0});exports.LRUCache=void 0;var g=I(),N=P(),x=()=>g.metrics.hasSubscribers||g.tracing.hasSubscribers,k=new Set,G=typeof process=="object"&&process?process:{},V=(c,t,e,i)=>{typeof G.emitWarning=="function"?G.emitWarning(c,t,e,i):console.error(`[${e}] ${t}: ${c}`)},B=c=>!k.has(c);var T=c=>!!c&&c===Math.floor(c)&&c>0&&isFinite(c),H=c=>T(c)?c<=Math.pow(2,8)?Uint8Array:c<=Math.pow(2,16)?Uint16Array:c<=Math.pow(2,32)?Uint32Array:c<=Number.MAX_SAFE_INTEGER?W:null:null,W=class extends Array{constructor(t){super(t),this.fill(0)}},C=class c{heap;length;static#o=!1;static create(t){let e=H(t);if(!e)return[];c.#o=!0;let i=new c(t,e);return c.#o=!1,i}constructor(t,e){if(!c.#o)throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new e(t),this.length=0}push(t){this.heap[this.length++]=t}pop(){return this.heap[--this.length]}},L=class c{#o;#c;#m;#W;#S;#M;#j;#w;get perf(){return this.#w}ttl;ttlResolution;ttlAutopurge;updateAgeOnGet;updateAgeOnHas;allowStale;noDisposeOnSet;noUpdateTTL;maxEntrySize;sizeCalculation;noDeleteOnFetchRejection;noDeleteOnStaleGet;allowStaleOnFetchAbort;allowStaleOnFetchRejection;ignoreFetchAbort;backgroundFetchSize;#n;#b;#s;#i;#t;#l;#u;#a;#h;#y;#r;#_;#F;#d;#g;#T;#U;#f;#D;static unsafeExposeInternals(t){return{starts:t.#F,ttls:t.#d,autopurgeTimers:t.#g,sizes:t.#_,keyMap:t.#s,keyList:t.#i,valList:t.#t,next:t.#l,prev:t.#u,get head(){return t.#a},get tail(){return t.#h},free:t.#y,isBackgroundFetch:e=>t.#e(e),backgroundFetch:(e,i,s,n)=>t.#G(e,i,s,n),moveToTail:e=>t.#L(e),indexes:e=>t.#A(e),rindexes:e=>t.#z(e),isStale:e=>t.#p(e)}}get max(){return this.#o}get maxSize(){return this.#c}get calculatedSize(){return this.#b}get size(){return this.#n}get fetchMethod(){return this.#M}get memoMethod(){return this.#j}get dispose(){return this.#m}get onInsert(){return this.#W}get disposeAfter(){return this.#S}constructor(t){let{max:e=0,ttl:i,ttlResolution:s=1,ttlAutopurge:n,updateAgeOnGet:r,updateAgeOnHas:h,allowStale:a,dispose:o,onInsert:d,disposeAfter:y,noDisposeOnSet:_,noUpdateTTL:u,maxSize:p=0,maxEntrySize:f=0,sizeCalculation:b,fetchMethod:l,memoMethod:S,noDeleteOnFetchRejection:F,noDeleteOnStaleGet:w,allowStaleOnFetchRejection:m,allowStaleOnFetchAbort:A,ignoreFetchAbort:z,backgroundFetchSize:M=1,perf:v}=t;if(this.backgroundFetchSize=M,v!==void 0&&typeof v?.now!="function")throw new TypeError("perf option must have a now() method if specified");if(this.#w=v??N.defaultPerf,e!==0&&!T(e))throw new TypeError("max option must be a nonnegative integer");let E=e?H(e):Array;if(!E)throw new Error("invalid max value: "+e);if(this.#o=e,this.#c=p,this.maxEntrySize=f||this.#c,this.sizeCalculation=b,this.sizeCalculation){if(!this.#c&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(S!==void 0&&typeof S!="function")throw new TypeError("memoMethod must be a function if defined");if(this.#j=S,l!==void 0&&typeof l!="function")throw new TypeError("fetchMethod must be a function if specified");if(this.#M=l,this.#U=!!l,this.#s=new Map,this.#i=Array.from({length:e}).fill(void 0),this.#t=Array.from({length:e}).fill(void 0),this.#l=new E(e),this.#u=new E(e),this.#a=0,this.#h=0,this.#y=C.create(e),this.#n=0,this.#b=0,typeof o=="function"&&(this.#m=o),typeof d=="function"&&(this.#W=d),typeof y=="function"?(this.#S=y,this.#r=[]):(this.#S=void 0,this.#r=void 0),this.#T=!!this.#m,this.#D=!!this.#W,this.#f=!!this.#S,this.noDisposeOnSet=!!_,this.noUpdateTTL=!!u,this.noDeleteOnFetchRejection=!!F,this.allowStaleOnFetchRejection=!!m,this.allowStaleOnFetchAbort=!!A,this.ignoreFetchAbort=!!z,this.maxEntrySize!==0){if(this.#c!==0&&!T(this.#c))throw new TypeError("maxSize must be a positive integer if specified");if(!T(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.#X()}if(this.allowStale=!!a,this.noDeleteOnStaleGet=!!w,this.updateAgeOnGet=!!r,this.updateAgeOnHas=!!h,this.ttlResolution=T(s)||s===0?s:1,this.ttlAutopurge=!!n,this.ttl=i||0,this.ttl){if(!T(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.#k()}if(this.#o===0&&this.ttl===0&&this.#c===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.#o&&!this.#c){let R="LRU_CACHE_UNBOUNDED";B(R)&&(k.add(R),V("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",R,c))}}getRemainingTTL(t){return this.#s.has(t)?1/0:0}#k(){let t=new W(this.#o),e=new W(this.#o);this.#d=t,this.#F=e;let i=this.ttlAutopurge?Array.from({length:this.#o}):void 0;this.#g=i,this.#H=(h,a,o=this.#w.now())=>{e[h]=a!==0?o:0,t[h]=a,s(h,a)},this.#R=h=>{e[h]=t[h]!==0?this.#w.now():0,s(h,t[h])};let s=this.ttlAutopurge?(h,a)=>{if(i?.[h]&&(clearTimeout(i[h]),i[h]=void 0),a&&a!==0&&i){let o=setTimeout(()=>{this.#p(h)&&this.#v(this.#i[h],"expire")},a+1);o.unref&&o.unref(),i[h]=o}}:()=>{};this.#E=(h,a)=>{if(t[a]){let o=t[a],d=e[a];if(!o||!d)return;h.ttl=o,h.start=d,h.now=n||r();let y=h.now-d;h.remainingTTL=o-y}};let n=0,r=()=>{let h=this.#w.now();if(this.ttlResolution>0){n=h;let a=setTimeout(()=>n=0,this.ttlResolution);a.unref&&a.unref()}return h};this.getRemainingTTL=h=>{let a=this.#s.get(h);if(a===void 0)return 0;let o=t[a],d=e[a];if(!o||!d)return 1/0;let y=(n||r())-d;return o-y},this.#p=h=>{let a=e[h],o=t[h];return!!o&&!!a&&(n||r())-a>o}}#R=()=>{};#E=()=>{};#H=()=>{};#p=()=>!1;#X(){let t=new W(this.#o);this.#b=0,this.#_=t,this.#x=e=>{this.#b-=t[e],t[e]=0},this.#N=(e,i,s,n)=>{if(!T(s)){if(this.#e(i))return this.backgroundFetchSize;if(n){if(typeof n!="function")throw new TypeError("sizeCalculation must be a function");if(s=n(i,e),!T(s))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.")}return s},this.#I=(e,i,s)=>{if(t[e]=i,this.#c){let n=this.#c-t[e];for(;this.#b>n;)this.#P(!0)}this.#b+=t[e],s&&(s.entrySize=i,s.totalCalculatedSize=this.#b)}}#x=t=>{};#I=(t,e,i)=>{};#N=(t,e,i,s)=>{if(i||s)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0};*#A({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#h;this.#V(e)&&((t||!this.#p(e))&&(yield e),e!==this.#a);)e=this.#u[e]}*#z({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#a;this.#V(e)&&((t||!this.#p(e))&&(yield e),e!==this.#h);)e=this.#l[e]}#V(t){return t!==void 0&&this.#s.get(this.#i[t])===t}*entries(){for(let t of this.#A())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*rentries(){for(let t of this.#z())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*keys(){for(let t of this.#A()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*rkeys(){for(let t of this.#z()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*values(){for(let t of this.#A())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}*rvalues(){for(let t of this.#z())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}[Symbol.iterator](){return this.entries()}[Symbol.toStringTag]="LRUCache";find(t,e={}){for(let i of this.#A()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;if(n!==void 0&&t(n,this.#i[i],this))return this.#C(this.#i[i],e)}}forEach(t,e=this){for(let i of this.#A()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;n!==void 0&&t.call(e,n,this.#i[i],this)}}rforEach(t,e=this){for(let i of this.#z()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;n!==void 0&&t.call(e,n,this.#i[i],this)}}purgeStale(){let t=!1;for(let e of this.#z({allowStale:!0}))this.#p(e)&&(this.#v(this.#i[e],"expire"),t=!0);return t}info(t){let e=this.#s.get(t);if(e===void 0)return;let i=this.#t[e],s=this.#e(i)?i.__staleWhileFetching:i;if(s===void 0)return;let n={value:s};if(this.#d&&this.#F){let r=this.#d[e],h=this.#F[e];if(r&&h){let a=r-(this.#w.now()-h);n.ttl=a,n.start=Date.now()}}return this.#_&&(n.size=this.#_[e]),n}dump(){let t=[];for(let e of this.#A({allowStale:!0})){let i=this.#i[e],s=this.#t[e],n=this.#e(s)?s.__staleWhileFetching:s;if(n===void 0||i===void 0)continue;let r={value:n};if(this.#d&&this.#F){r.ttl=this.#d[e];let h=this.#w.now()-this.#F[e];r.start=Math.floor(Date.now()-h)}this.#_&&(r.size=this.#_[e]),t.unshift([i,r])}return t}load(t){this.clear();for(let[e,i]of t){if(i.start){let s=Date.now()-i.start;i.start=this.#w.now()-s}this.#O(e,i.value,i)}}set(t,e,i={}){let{status:s=g.metrics.hasSubscribers?{}:void 0}=i;i.status=s,s&&(s.op="set",s.key=t,e!==void 0&&(s.value=e),s.cache=this);let n=this.#O(t,e,i);return s&&g.metrics.hasSubscribers&&g.metrics.publish(s),n}#O(t,e,i,s){let{ttl:n=this.ttl,start:r,noDisposeOnSet:h=this.noDisposeOnSet,sizeCalculation:a=this.sizeCalculation,status:o}=i,d=this.#e(e);if(e===void 0)return o&&(o.set="deleted"),this.delete(t),this;let{noUpdateTTL:y=this.noUpdateTTL}=i;o&&!d&&(o.value=e);let _=this.#N(t,e,i.size||0,a,o);if(this.maxEntrySize&&_>this.maxEntrySize)return this.#v(t,"set"),o&&(o.set="miss",o.maxEntrySizeExceeded=!0),this;let u=this.#n===0?void 0:this.#s.get(t);if(u===void 0)u=this.#n===0?this.#h:this.#y.length!==0?this.#y.pop():this.#n===this.#o?this.#P(!1):this.#n,this.#i[u]=t,this.#t[u]=e,this.#s.set(t,u),this.#l[this.#h]=u,this.#u[u]=this.#h,this.#h=u,this.#n++,this.#I(u,_,o),o&&(o.set="add"),y=!1,this.#D&&!d&&this.#W?.(e,t,"add");else{this.#L(u);let p=this.#t[u];if(e!==p){if(!h)if(this.#e(p)){p!==s&&p.__abortController.abort(new Error("replaced"));let{__staleWhileFetching:f}=p;f!==void 0&&f!==e&&(this.#T&&this.#m?.(f,t,"set"),this.#f&&this.#r?.push([f,t,"set"]))}else this.#T&&this.#m?.(p,t,"set"),this.#f&&this.#r?.push([p,t,"set"]);if(this.#x(u),this.#I(u,_,o),this.#t[u]=e,!d){let f=p&&this.#e(p)?p.__staleWhileFetching:p,b=f===void 0?"add":e!==f?"replace":"update";o&&(o.set=b,f!==void 0&&(o.oldValue=f)),this.#D&&this.onInsert?.(e,t,b)}}else d||(o&&(o.set="update"),this.#D&&this.onInsert?.(e,t,"update"))}if(n!==0&&!this.#d&&this.#k(),this.#d&&(y||this.#H(u,n,r),o&&this.#E(o,u)),!h&&this.#f&&this.#r){let p=this.#r,f;for(;f=p?.shift();)this.#S?.(...f)}return this}pop(){try{for(;this.#n;){let t=this.#t[this.#a];if(this.#P(!0),this.#e(t)){if(t.__staleWhileFetching)return t.__staleWhileFetching}else if(t!==void 0)return t}}finally{if(this.#f&&this.#r){let t=this.#r,e;for(;e=t?.shift();)this.#S?.(...e)}}}#P(t){let e=this.#a,i=this.#i[e],s=this.#t[e],n=this.#e(s);n&&s.__abortController.abort(new Error("evicted"));let r=n?s.__staleWhileFetching:s;return(this.#T||this.#f)&&r!==void 0&&(this.#T&&this.#m?.(r,i,"evict"),this.#f&&this.#r?.push([r,i,"evict"])),this.#x(e),this.#g?.[e]&&(clearTimeout(this.#g[e]),this.#g[e]=void 0),t&&(this.#i[e]=void 0,this.#t[e]=void 0,this.#y.push(e)),this.#n===1?(this.#a=this.#h=0,this.#y.length=0):this.#a=this.#l[e],this.#s.delete(i),this.#n--,e}has(t,e={}){let{status:i=g.metrics.hasSubscribers?{}:void 0}=e;e.status=i,i&&(i.op="has",i.key=t,i.cache=this);let s=this.#Y(t,e);return g.metrics.hasSubscribers&&g.metrics.publish(i),s}#Y(t,e={}){let{updateAgeOnHas:i=this.updateAgeOnHas,status:s}=e,n=this.#s.get(t);if(n!==void 0){let r=this.#t[n];if(this.#e(r)&&r.__staleWhileFetching===void 0)return!1;if(this.#p(n))s&&(s.has="stale",this.#E(s,n));else return i&&this.#R(n),s&&(s.has="hit",this.#E(s,n)),!0}else s&&(s.has="miss");return!1}peek(t,e={}){let{status:i=x()?{}:void 0}=e;i&&(i.op="peek",i.key=t,i.cache=this),e.status=i;let s=this.#J(t,e);return g.metrics.hasSubscribers&&g.metrics.publish(i),s}#J(t,e){let{status:i,allowStale:s=this.allowStale}=e,n=this.#s.get(t);if(n===void 0||!s&&this.#p(n)){i&&(i.peek=n===void 0?"miss":"stale");return}let r=this.#t[n],h=this.#e(r)?r.__staleWhileFetching:r;return i&&(h!==void 0?(i.peek="hit",i.value=h):i.peek="miss"),h}#G(t,e,i,s){let n=e===void 0?void 0:this.#t[e];if(this.#e(n))return n;let r=new AbortController,{signal:h}=i;h?.addEventListener("abort",()=>r.abort(h.reason),{signal:r.signal});let a={signal:r.signal,options:i,context:s},o=(f,b=!1)=>{let{aborted:l}=r.signal,S=i.ignoreFetchAbort&&f!==void 0,F=i.ignoreFetchAbort||!!(i.allowStaleOnFetchAbort&&f!==void 0);if(i.status&&(l&&!b?(i.status.fetchAborted=!0,i.status.fetchError=r.signal.reason,S&&(i.status.fetchAbortIgnored=!0)):i.status.fetchResolved=!0),l&&!S&&!b)return y(r.signal.reason,F);let w=u,m=this.#t[e];return(m===u||m===void 0&&S&&b)&&(f===void 0?w.__staleWhileFetching!==void 0?this.#t[e]=w.__staleWhileFetching:this.#v(t,"fetch"):(i.status&&(i.status.fetchUpdated=!0),this.#O(t,f,a.options,w))),f},d=f=>(i.status&&(i.status.fetchRejected=!0,i.status.fetchError=f),y(f,!1)),y=(f,b)=>{let{aborted:l}=r.signal,S=l&&i.allowStaleOnFetchAbort,F=S||i.allowStaleOnFetchRejection,w=F||i.noDeleteOnFetchRejection,m=u;if(this.#t[e]===u&&(!w||!b&&m.__staleWhileFetching===void 0?this.#v(t,"fetch"):S||(this.#t[e]=m.__staleWhileFetching)),F)return i.status&&m.__staleWhileFetching!==void 0&&(i.status.returnedStale=!0),m.__staleWhileFetching;if(m.__returned===m)throw f},_=(f,b)=>{let l=this.#M?.(t,n,a);r.signal.addEventListener("abort",()=>{(!i.ignoreFetchAbort||i.allowStaleOnFetchAbort)&&(f(void 0),i.allowStaleOnFetchAbort&&(f=S=>o(S,!0)))}),l&&l instanceof Promise?l.then(S=>f(S===void 0?void 0:S),b):l!==void 0&&f(l)};i.status&&(i.status.fetchDispatched=!0);let u=new Promise(_).then(o,d),p=Object.assign(u,{__abortController:r,__staleWhileFetching:n,__returned:void 0});return e===void 0?(this.#O(t,p,{...a.options,status:void 0}),e=this.#s.get(t)):this.#t[e]=p,p}#e(t){if(!this.#U)return!1;let e=t;return!!e&&e instanceof Promise&&e.hasOwnProperty("__staleWhileFetching")&&e.__abortController instanceof AbortController}fetch(t,e={}){let i=g.tracing.hasSubscribers,{status:s=x()?{}:void 0}=e;e.status=s,s&&e.context&&(s.context=e.context);let n=this.#B(t,e);return s&&i&&(s.trace=!0,g.tracing.tracePromise(()=>n,s).catch(()=>{})),n}async#B(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,ttl:r=this.ttl,noDisposeOnSet:h=this.noDisposeOnSet,size:a=0,sizeCalculation:o=this.sizeCalculation,noUpdateTTL:d=this.noUpdateTTL,noDeleteOnFetchRejection:y=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:_=this.allowStaleOnFetchRejection,ignoreFetchAbort:u=this.ignoreFetchAbort,allowStaleOnFetchAbort:p=this.allowStaleOnFetchAbort,context:f,forceRefresh:b=!1,status:l,signal:S}=e;if(l&&(l.op="fetch",l.key=t,b&&(l.forceRefresh=!0),l.cache=this),!this.#U)return l&&(l.fetch="get"),this.#C(t,{allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:n,status:l});let F={allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:n,ttl:r,noDisposeOnSet:h,size:a,sizeCalculation:o,noUpdateTTL:d,noDeleteOnFetchRejection:y,allowStaleOnFetchRejection:_,allowStaleOnFetchAbort:p,ignoreFetchAbort:u,status:l,signal:S},w=this.#s.get(t);if(w===void 0){l&&(l.fetch="miss");let m=this.#G(t,w,F,f);return m.__returned=m}else{let m=this.#t[w];if(this.#e(m)){let E=i&&m.__staleWhileFetching!==void 0;return l&&(l.fetch="inflight",E&&(l.returnedStale=!0)),E?m.__staleWhileFetching:m.__returned=m}let A=this.#p(w);if(!b&&!A)return l&&(l.fetch="hit"),this.#L(w),s&&this.#R(w),l&&this.#E(l,w),m;let z=this.#G(t,w,F,f),v=z.__staleWhileFetching!==void 0&&i;return l&&(l.fetch=A?"stale":"refresh",v&&A&&(l.returnedStale=!0)),v?z.__staleWhileFetching:z.__returned=z}}forceFetch(t,e={}){let i=g.tracing.hasSubscribers,{status:s=x()?{}:void 0}=e;e.status=s,s&&e.context&&(s.context=e.context);let n=this.#K(t,e);return s&&i&&(s.trace=!0,g.tracing.tracePromise(()=>n,s).catch(()=>{})),n}async#K(t,e={}){let i=await this.#B(t,e);if(i===void 0)throw new Error("fetch() returned undefined");return i}memo(t,e={}){let{status:i=g.metrics.hasSubscribers?{}:void 0}=e;e.status=i,i&&(i.op="memo",i.key=t,e.context&&(i.context=e.context),i.cache=this);let s=this.#Q(t,e);return i&&(i.value=s),g.metrics.hasSubscribers&&g.metrics.publish(i),s}#Q(t,e={}){let i=this.#j;if(!i)throw new Error("no memoMethod provided to constructor");let{context:s,status:n,forceRefresh:r,...h}=e;n&&r&&(n.forceRefresh=!0);let a=this.#C(t,h),o=r||a===void 0;if(n&&(n.memo=o?"miss":"hit",o||(n.value=a)),!o)return a;let d=i(t,a,{options:h,context:s});return n&&(n.value=d),this.#O(t,d,h),d}get(t,e={}){let{status:i=g.metrics.hasSubscribers?{}:void 0}=e;e.status=i,i&&(i.op="get",i.key=t,i.cache=this);let s=this.#C(t,e);return i&&(s!==void 0&&(i.value=s),g.metrics.hasSubscribers&&g.metrics.publish(i)),s}#C(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,status:r}=e,h=this.#s.get(t);if(h===void 0){r&&(r.get="miss");return}let a=this.#t[h],o=this.#e(a);return r&&this.#E(r,h),this.#p(h)?o?(r&&(r.get="stale-fetching"),i&&a.__staleWhileFetching!==void 0?(r&&(r.returnedStale=!0),a.__staleWhileFetching):void 0):(n||this.#v(t,"expire"),r&&(r.get="stale"),i?(r&&(r.returnedStale=!0),a):void 0):(r&&(r.get=o?"fetching":"hit"),this.#L(h),s&&this.#R(h),o?a.__staleWhileFetching:a)}#q(t,e){this.#u[e]=t,this.#l[t]=e}#L(t){t!==this.#h&&(t===this.#a?this.#a=this.#l[t]:this.#q(this.#u[t],this.#l[t]),this.#q(this.#h,t),this.#h=t)}delete(t){return this.#v(t,"delete")}#v(t,e){g.metrics.hasSubscribers&&g.metrics.publish({op:"delete",delete:e,key:t,cache:this});let i=!1;if(this.#n!==0){let s=this.#s.get(t);if(s!==void 0)if(this.#g?.[s]&&(clearTimeout(this.#g?.[s]),this.#g[s]=void 0),i=!0,this.#n===1)this.#$(e);else{this.#x(s);let n=this.#t[s];if(this.#e(n)?n.__abortController.abort(new Error("deleted")):(this.#T||this.#f)&&(this.#T&&this.#m?.(n,t,e),this.#f&&this.#r?.push([n,t,e])),this.#s.delete(t),this.#i[s]=void 0,this.#t[s]=void 0,s===this.#h)this.#h=this.#u[s];else if(s===this.#a)this.#a=this.#l[s];else{let r=this.#u[s];this.#l[r]=this.#l[s];let h=this.#l[s];this.#u[h]=this.#u[s]}this.#n--,this.#y.push(s)}}if(this.#f&&this.#r?.length){let s=this.#r,n;for(;n=s?.shift();)this.#S?.(...n)}return i}clear(){return this.#$("delete")}#$(t){for(let e of this.#z({allowStale:!0})){let i=this.#t[e];if(this.#e(i))i.__abortController.abort(new Error("deleted"));else{let s=this.#i[e];this.#T&&this.#m?.(i,s,t),this.#f&&this.#r?.push([i,s,t])}}if(this.#s.clear(),this.#t.fill(void 0),this.#i.fill(void 0),this.#d&&this.#F){this.#d.fill(0),this.#F.fill(0);for(let e of this.#g??[])e!==void 0&&clearTimeout(e);this.#g?.fill(void 0)}if(this.#_&&this.#_.fill(0),this.#a=0,this.#h=0,this.#y.length=0,this.#b=0,this.#n=0,this.#f&&this.#r){let e=this.#r,i;for(;i=e?.shift();)this.#S?.(...i)}}};exports.LRUCache=L; +//# sourceMappingURL=index.min.js.map diff --git a/node_modules/lru-cache/dist/commonjs/browser/index.min.js.map b/node_modules/lru-cache/dist/commonjs/browser/index.min.js.map new file mode 100644 index 00000000..80b762ed --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/browser/index.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagnostics-channel-browser.ts", "../../../src/perf.ts", "../../../src/index.ts"], + "sourcesContent": ["// this is used in ESM environments that follow the 'browser' import\n// condition, to avoid even trying to load node:diagnostics_channel\nimport {\n type Channel,\n type TracingChannel,\n} from 'node:diagnostics_channel'\nexport type { TracingChannel, Channel }\n\nconst dummy = { hasSubscribers: false }\nexport const metrics = dummy as Channel\nexport const tracing = dummy as TracingChannel\n", "/**\n * this provides the default Perf object source, either the\n * `performance` global, or the `Date` constructor.\n *\n * it can be passed in via configuration to override it\n * for a single LRU object.\n */\nexport type Perf = { now: () => number }\nexport const defaultPerf: Perf =\n (\n typeof performance === 'object' &&\n performance &&\n typeof performance.now === 'function'\n ) ?\n /* c8 ignore start - this gets covered, but c8 gets confused */\n performance\n : /* c8 ignore stop */ Date\n", "/**\n * @module LRUCache\n */\n\nimport { metrics, tracing } from './diagnostics-channel.js'\nimport { defaultPerf } from './perf.js'\nimport type { Perf } from './perf.js'\nexport type { Perf } from './perf.js'\n\nconst hasSubscribers = () =>\n metrics.hasSubscribers || tracing.hasSubscribers\n\nconst warned = new Set()\n\n// either a function or a class\n// oxlint-disable-next-line no-explicit-any\ntype ForC = ((...a: any[]) => any) | { new (...a: any[]): any }\n\n/* c8 ignore start */\nconst PROCESS = (\n typeof process === 'object' && !!process ?\n process\n : {}) as { [k: string]: unknown }\n/* c8 ignore stop */\n\nconst emitWarning = (\n msg: string,\n type: string,\n code: string,\n fn: ForC,\n) => {\n if (typeof PROCESS.emitWarning === 'function') {\n PROCESS.emitWarning(msg, type, code, fn)\n } else {\n //oxlint-disable-next-line no-console\n console.error(`[${code}] ${type}: ${msg}`)\n }\n}\nconst shouldWarn = (code: string) => !warned.has(code)\n\nconst TYPE = Symbol('type')\nexport type PosInt = number & { [TYPE]: 'Positive Integer' }\nexport type Index = number & { [TYPE]: 'LRUCache Index' }\n\nconst isPosInt = (n: unknown): n is PosInt =>\n !!n && n === Math.floor(n as number) && n > 0 && isFinite(n)\n\nexport type UintArray = Uint8Array | Uint16Array | Uint32Array\nexport type NumberArray = UintArray | number[]\n\n// This is a little bit ridiculous, tbh.\n// The maximum array length is 2^32-1 or thereabouts on most JS impls.\n// And well before that point, you're caching the entire world, I mean,\n// that's ~32GB of just integers for the next/prev links, plus whatever\n// else to hold that many keys and values. Just filling the memory with\n// zeroes at init time is brutal when you get that big.\n// But why not be complete?\n// Maybe in the future, these limits will have expanded.\n/* c8 ignore start */\nconst getUintArray = (max: number) =>\n !isPosInt(max) ? null\n : max <= Math.pow(2, 8) ? Uint8Array\n : max <= Math.pow(2, 16) ? Uint16Array\n : max <= Math.pow(2, 32) ? Uint32Array\n : max <= Number.MAX_SAFE_INTEGER ? ZeroArray\n : null\n/* c8 ignore stop */\n\nclass ZeroArray extends Array {\n constructor(size: number) {\n super(size)\n this.fill(0)\n }\n}\nexport type { ZeroArray }\nexport type { Stack }\n\nexport type StackLike = Stack | Index[]\nclass Stack {\n /* c8 ignore start - not sure why this is showing up uncovered?? */\n heap: NumberArray\n /* c8 ignore stop */\n length: number\n // private constructor\n static #constructing: boolean = false\n static create(max: number): StackLike {\n const HeapCls = getUintArray(max)\n if (!HeapCls) return []\n Stack.#constructing = true\n const s = new Stack(max, HeapCls)\n Stack.#constructing = false\n return s\n }\n constructor(max: number, HeapCls: { new (n: number): NumberArray }) {\n /* c8 ignore start */\n if (!Stack.#constructing) {\n throw new TypeError('instantiate Stack using Stack.create(n)')\n }\n /* c8 ignore stop */\n this.heap = new HeapCls(max)\n this.length = 0\n }\n push(n: Index) {\n this.heap[this.length++] = n\n }\n pop(): Index {\n return this.heap[--this.length] as Index\n }\n}\n\n/**\n * Promise representing an in-progress {@link LRUCache#fetch} call\n */\nexport type BackgroundFetch = Promise & {\n __returned: BackgroundFetch | undefined\n __abortController: AbortController\n __staleWhileFetching: V | undefined\n}\n\nexport type DisposeTask = [\n value: V,\n key: K,\n reason: LRUCache.DisposeReason,\n]\n\nexport namespace LRUCache {\n /**\n * An integer greater than 0, reflecting the calculated size of items\n */\n export type Size = number\n\n /**\n * Integer greater than 0, representing some number of milliseconds, or the\n * time at which a TTL started counting from.\n */\n export type Milliseconds = number\n\n /**\n * An integer greater than 0, reflecting a number of items\n */\n export type Count = number\n\n /**\n * The reason why an item was removed from the cache, passed\n * to the {@link Disposer} methods.\n *\n * - `evict`: The item was evicted because it is the least recently used,\n * and the cache is full.\n * - `set`: A new value was set, overwriting the old value being disposed.\n * - `delete`: The item was explicitly deleted, either by calling\n * {@link LRUCache#delete}, {@link LRUCache#clear}, or\n * {@link LRUCache#set} with an undefined value.\n * - `expire`: The item was removed due to exceeding its TTL.\n * - `fetch`: A {@link OptionsBase#fetchMethod} operation returned\n * `undefined` or was aborted, causing the item to be deleted.\n */\n export type DisposeReason =\n | 'evict'\n | 'set'\n | 'delete'\n | 'expire'\n | 'fetch'\n /**\n * A method called upon item removal, passed as the\n * {@link OptionsBase.dispose} and/or\n * {@link OptionsBase.disposeAfter} options.\n */\n export type Disposer = (\n value: V,\n key: K,\n reason: DisposeReason,\n ) => void\n\n /**\n * The reason why an item was added to the cache, passed\n * to the {@link Inserter} methods.\n *\n * - `add`: the item was not found in the cache, and was added\n * - `update`: the item was in the cache, with the same value provided\n * - `replace`: the item was in the cache, and replaced\n */\n export type InsertReason = 'add' | 'update' | 'replace'\n\n /**\n * A method called upon item insertion, passed as the\n * {@link OptionsBase.insert}\n */\n export type Inserter = (\n value: V,\n key: K,\n reason: InsertReason,\n ) => void\n\n /**\n * A function that returns the effective calculated size\n * of an entry in the cache.\n */\n export type SizeCalculator = (value: V, key: K) => Size\n\n /**\n * Options provided to the\n * {@link OptionsBase.fetchMethod} function.\n */\n export interface FetcherOptions {\n signal: AbortSignal\n options: FetcherFetchOptions\n /**\n * Object provided in the {@link FetchOptions.context} option to\n * {@link LRUCache#fetch}\n */\n context: FC\n }\n\n /**\n * Occasionally, it may be useful to track the internal behavior of the\n * cache, particularly for logging, debugging, or for behavior within the\n * `fetchMethod`. To do this, you can pass a `status` object to the\n * {@link LRUCache#fetch}, {@link LRUCache#get}, {@link LRUCache#set},\n * {@link LRUCache#memo}, and {@link LRUCache#has} methods.\n *\n * The `status` option should be a plain JavaScript object. The following\n * fields will be set on it appropriately, depending on the situation.\n *\n * These objects are also the context objects passed to listeners on the\n * `lru-cache:metrics` diagnostic channel, and the `lru-cache` tracing\n * channels, in platforms that support them.\n */\n export interface Status {\n /**\n * The operation being performed\n */\n op?: 'get' | 'set' | 'memo' | 'fetch' | 'delete' | 'has' | 'peek'\n /**\n * The status of a set() operation.\n *\n * - add: the item was not found in the cache, and was added\n * - update: the item was in the cache, with the same value provided\n * - replace: the item was in the cache, and replaced\n * - miss: the item was not added to the cache for some reason\n */\n set?: 'add' | 'update' | 'replace' | 'miss' | 'deleted'\n\n /**\n * The status of a delete() operation.\n */\n delete?: LRUCache.DisposeReason\n\n /**\n * The result of a peek() operation\n *\n * - hit: the item was found and returned\n * - stale: the item is in the cache, but past its ttl and not returned\n * - miss: item not in the cache\n */\n peek?: 'hit' | 'miss' | 'stale'\n\n /**\n * The status of a memo() operation.\n *\n * - 'hit': the item was found in the cache and returned\n * - 'miss': the `memoMethod` function was called\n */\n memo?: 'hit' | 'miss'\n\n /**\n * The `context` option provided to a memo or fetch operation\n *\n * In practice, of course, this will be the same type as the `FC`\n * fetch context param used to instantiate the LRUCache, but the\n * convolutions of threading that through would get quite complicated,\n * and preclude forcing/forbidding the passing of a `context` param\n * where it is/isn't expected, which is more valuable for error\n * prevention.\n */\n context?: unknown\n\n /**\n * the ttl stored for the item, or undefined if ttls are not used.\n */\n ttl?: Milliseconds\n\n /**\n * the start time for the item, or undefined if ttls are not used.\n */\n start?: Milliseconds\n\n /**\n * The timestamp used for TTL calculation\n */\n now?: Milliseconds\n\n /**\n * the remaining ttl for the item, or undefined if ttls are not used.\n */\n remainingTTL?: Milliseconds\n\n /**\n * The calculated size for the item, if sizes are used.\n */\n entrySize?: Size\n\n /**\n * The total calculated size of the cache, if sizes are used.\n */\n totalCalculatedSize?: Size\n\n /**\n * A flag indicating that the item was not stored, due to exceeding the\n * {@link OptionsBase.maxEntrySize}\n */\n maxEntrySizeExceeded?: true\n\n /**\n * The key that was set or retrieved\n */\n key?: K\n\n /**\n * The value that was set\n */\n value?: V\n\n /**\n * The old value, specified in the case of `set:'replace'`\n */\n oldValue?: V\n\n /**\n * The results of a {@link LRUCache#has} operation\n *\n * - hit: the item was found in the cache\n * - stale: the item was found in the cache, but is stale\n * - miss: the item was not found in the cache\n */\n has?: 'hit' | 'stale' | 'miss'\n\n /**\n * The status of a {@link LRUCache#fetch} operation.\n * Note that this can change as the underlying fetch() moves through\n * various states.\n *\n * - inflight: there is another fetch() for this key which is in process\n * - get: there is no {@link OptionsBase.fetchMethod}, so\n * {@link LRUCache#get} was called.\n * - miss: the item is not in cache, and will be fetched.\n * - hit: the item is in the cache, and was resolved immediately.\n * - stale: the item is in the cache, but stale.\n * - refresh: the item is in the cache, and not stale, but\n * {@link FetchOptions.forceRefresh} was specified.\n */\n fetch?: 'get' | 'inflight' | 'miss' | 'hit' | 'stale' | 'refresh'\n\n /**\n * `forceRefresh` option was used for either a fetch or memo operation\n */\n forceRefresh?: boolean\n\n /**\n * The {@link OptionsBase.fetchMethod} was called\n */\n fetchDispatched?: true\n\n /**\n * The cached value was updated after a successful call to\n * {@link OptionsBase.fetchMethod}\n */\n fetchUpdated?: true\n\n /**\n * The reason for a fetch() rejection. Either the error raised by the\n * {@link OptionsBase.fetchMethod}, or the reason for an\n * AbortSignal.\n */\n fetchError?: Error\n\n /**\n * The fetch received an abort signal\n */\n fetchAborted?: true\n\n /**\n * The abort signal received was ignored, and the fetch was allowed to\n * continue in the background.\n */\n fetchAbortIgnored?: true\n\n /**\n * The fetchMethod promise resolved successfully\n */\n fetchResolved?: true\n\n /**\n * The fetchMethod promise was rejected\n */\n fetchRejected?: true\n\n /**\n * The status of a {@link LRUCache#get} operation.\n *\n * - fetching: The item is currently being fetched. If a previous value\n * is present and allowed, that will be returned.\n * - stale: The item is in the cache, and is stale. If it was returned,\n * then the `returnedStale` flag will be set.\n * - stale-fetching: The value is being fetched in the background, but is\n * currently stale. If the stale value was returned, then the\n * `returnedStale` flag will be set.\n * - hit: the item is in the cache\n * - miss: the item is not in the cache\n */\n get?: 'stale' | 'hit' | 'miss' | 'fetching' | 'stale-fetching'\n\n /**\n * A fetch or get operation returned a stale value.\n */\n returnedStale?: true\n\n /**\n * A tracingChannel trace was started for this operation\n */\n trace?: boolean\n\n /**\n * A reference to the cache instance associated with this operation\n */\n cache?: LRUCache\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#fetch}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link OptionsBase.noDeleteOnFetchRejection},\n * {@link OptionsBase.allowStaleOnFetchRejection},\n * {@link FetchOptions.forceRefresh}, and\n * {@link FetcherOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.fetchMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the fetchMethod is called.\n */\n export interface FetcherFetchOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n status?: Status\n size?: Size\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#fetch} method.\n */\n export interface FetchOptions extends FetcherFetchOptions<\n K,\n V,\n FC\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.fetchMethod} as\n * the {@link FetcherOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n signal?: AbortSignal\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface FetchOptionsWithContext extends FetchOptions<\n K,\n V,\n FC\n > {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is\n * `undefined` or `void`\n */\n export interface FetchOptionsNoContext<\n K,\n V,\n FC extends undefined | void = undefined,\n > extends FetchOptions {\n context?: FC\n }\n\n export interface MemoOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.memoMethod} as\n * the {@link MemoizerOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface MemoOptionsWithContext extends MemoOptions<\n K,\n V,\n FC\n > {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is\n * `undefined` or `void`\n */\n export interface MemoOptionsNoContext<\n K,\n V,\n FC extends undefined | void = undefined,\n > extends MemoOptions {\n context?: FC\n }\n\n /**\n * Options provided to the\n * {@link OptionsBase.memoMethod} function.\n */\n export interface MemoizerOptions {\n options: MemoizerMemoOptions\n /**\n * Object provided in the {@link MemoOptions.context} option to\n * {@link LRUCache#memo}\n */\n context: FC\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#memo}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link MemoOptions.forceRefresh}, and\n * {@link MemoOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.memoMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the memoMethod is called.\n */\n export interface MemoizerMemoOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n > {\n status?: Status\n size?: Size\n start?: Milliseconds\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#has} method.\n */\n export interface HasOptions extends Pick<\n OptionsBase,\n 'updateAgeOnHas'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#get} method.\n */\n export interface GetOptions extends Pick<\n OptionsBase,\n 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#peek} method.\n */\n export interface PeekOptions extends Pick<\n OptionsBase,\n 'allowStale'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#set} method.\n */\n export interface SetOptions extends Pick<\n OptionsBase,\n 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'\n > {\n /**\n * If size tracking is enabled, then setting an explicit size\n * in the {@link LRUCache#set} call will prevent calling the\n * {@link OptionsBase.sizeCalculation} function.\n */\n size?: Size\n /**\n * If TTL tracking is enabled, then setting an explicit start\n * time in the {@link LRUCache#set} call will override the\n * default time from `performance.now()` or `Date.now()`.\n *\n * Note that it must be a valid value for whichever time-tracking\n * method is in use.\n */\n start?: Milliseconds\n status?: Status\n }\n\n /**\n * The type signature for the {@link OptionsBase.fetchMethod} option.\n */\n export type Fetcher = (\n key: K,\n staleValue: V | undefined,\n options: FetcherOptions,\n ) => Promise | V | undefined | void\n\n /**\n * the type signature for the {@link OptionsBase.memoMethod} option.\n */\n export type Memoizer = (\n key: K,\n staleValue: V | undefined,\n options: MemoizerOptions,\n ) => V\n\n /**\n * Options which may be passed to the {@link LRUCache} constructor.\n *\n * Most of these may be overridden in the various options that use\n * them.\n *\n * Despite all being technically optional, the constructor requires that\n * a cache is at minimum limited by one or more of {@link OptionsBase.max},\n * {@link OptionsBase.ttl}, or {@link OptionsBase.maxSize}.\n *\n * If {@link OptionsBase.ttl} is used alone, then it is strongly advised\n * (and in fact required by the type definitions here) that the cache\n * also set {@link OptionsBase.ttlAutopurge}, to prevent potentially\n * unbounded storage.\n *\n * All options are also available on the {@link LRUCache} instance, making\n * it safe to pass an LRUCache instance as the options argumemnt to\n * make another empty cache of the same type.\n *\n * Some options are marked as read-only, because changing them after\n * instantiation is not safe. Changing any of the other options will of\n * course only have an effect on subsequent method calls.\n */\n export interface OptionsBase {\n /**\n * The maximum number of items to store in the cache before evicting\n * old entries. This is read-only on the {@link LRUCache} instance,\n * and may not be overridden.\n *\n * If set, then storage space will be pre-allocated at construction\n * time, and the cache will perform significantly faster.\n *\n * Note that significantly fewer items may be stored, if\n * {@link OptionsBase.maxSize} and/or {@link OptionsBase.ttl} are also\n * set.\n *\n * **It is strongly recommended to set a `max` to prevent unbounded growth\n * of the cache.**\n */\n max?: Count\n\n /**\n * Max time in milliseconds for items to live in cache before they are\n * considered stale. Note that stale items are NOT preemptively removed by\n * default, and MAY live in the cache, contributing to its LRU max, long\n * after they have expired, unless {@link OptionsBase.ttlAutopurge} is\n * set.\n *\n * If set to `0` (the default value), then that means \"do not track\n * TTL\", not \"expire immediately\".\n *\n * Also, as this cache is optimized for LRU/MRU operations, some of\n * the staleness/TTL checks will reduce performance, as they will incur\n * overhead by deleting items.\n *\n * This is not primarily a TTL cache, and does not make strong TTL\n * guarantees. There is no pre-emptive pruning of expired items, but you\n * _may_ set a TTL on the cache, and it will treat expired items as missing\n * when they are fetched, and delete them.\n *\n * Optional, but must be a non-negative integer in ms if specified.\n *\n * This may be overridden by passing an options object to `cache.set()`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if ttl tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * If ttl tracking is enabled, and `max` and `maxSize` are not set,\n * and `ttlAutopurge` is not set, then a warning will be emitted\n * cautioning about the potential for unbounded memory consumption.\n * (The TypeScript definitions will also discourage this.)\n */\n ttl?: Milliseconds\n\n /**\n * Minimum amount of time in ms in which to check for staleness.\n * Defaults to 1, which means that the current time is checked\n * at most once per millisecond.\n *\n * Set to 0 to check the current time every time staleness is tested.\n * (This reduces performance, and is theoretically unnecessary.)\n *\n * Setting this to a higher value will improve performance somewhat\n * while using ttl tracking, albeit at the expense of keeping stale\n * items around a bit longer than their TTLs would indicate.\n *\n * @default 1\n */\n ttlResolution?: Milliseconds\n\n /**\n * Preemptively remove stale items from the cache.\n *\n * Note that this may *significantly* degrade performance, especially if\n * the cache is storing a large number of items. It is almost always best\n * to just leave the stale items in the cache, and let them fall out as new\n * items are added.\n *\n * Note that this means that {@link OptionsBase.allowStale} is a bit\n * pointless, as stale items will be deleted almost as soon as they\n * expire.\n *\n * Use with caution!\n */\n ttlAutopurge?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever it is retrieved from cache with\n * {@link LRUCache#get}, causing it to not expire. (It can still fall out\n * of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n */\n updateAgeOnGet?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever its presence in the cache is\n * checked with {@link LRUCache#has}, causing it to not expire. (It can\n * still fall out of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n */\n updateAgeOnHas?: boolean\n\n /**\n * Allow {@link LRUCache#get} and {@link LRUCache#fetch} calls to return\n * stale data, if available.\n *\n * By default, if you set `ttl`, stale items will only be deleted from the\n * cache when you `get(key)`. That is, it's not preemptively pruning items,\n * unless {@link OptionsBase.ttlAutopurge} is set.\n *\n * If you set `allowStale:true`, it'll return the stale value *as well as*\n * deleting it. If you don't set this, then it'll return `undefined` when\n * you try to get a stale entry.\n *\n * Note that when a stale entry is fetched, _even if it is returned due to\n * `allowStale` being set_, it is removed from the cache immediately. You\n * can suppress this behavior by setting\n * {@link OptionsBase.noDeleteOnStaleGet}, either in the constructor, or in\n * the options provided to {@link LRUCache#get}.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n * The `cache.has()` method will always return `false` for stale items.\n *\n * Only relevant if a ttl is set.\n */\n allowStale?: boolean\n\n /**\n * Function that is called on items when they are dropped from the\n * cache, as `dispose(value, key, reason)`.\n *\n * This can be handy if you want to close file descriptors or do\n * other cleanup tasks when items are no longer stored in the cache.\n *\n * **NOTE**: It is called _before_ the item has been fully removed\n * from the cache, so if you want to put it right back in, you need\n * to wait until the next tick. If you try to add it back in during\n * the `dispose()` function call, it will break things in subtle and\n * weird ways.\n *\n * Unlike several other options, this may _not_ be overridden by\n * passing an option to `set()`, for performance reasons.\n *\n * The `reason` will be one of the following strings, corresponding\n * to the reason for the item's deletion:\n *\n * - `evict` Item was evicted to make space for a new addition\n * - `set` Item was overwritten by a new value\n * - `expire` Item expired its TTL\n * - `fetch` Item was deleted due to a failed or aborted fetch, or a\n * fetchMethod returning `undefined.\n * - `delete` Item was removed by explicit `cache.delete(key)`,\n * `cache.clear()`, or `cache.set(key, undefined)`.\n */\n dispose?: Disposer\n\n /**\n * Function that is called when new items are inserted into the cache,\n * as `onInsert(value, key, reason)`.\n *\n * This can be useful if you need to perform actions when an item is\n * added, such as logging or tracking insertions.\n *\n * Unlike some other options, this may _not_ be overridden by passing\n * an option to `set()`, for performance and consistency reasons.\n */\n onInsert?: Inserter\n\n /**\n * The same as {@link OptionsBase.dispose}, but called *after* the entry\n * is completely removed and the cache is once again in a clean state.\n *\n * It is safe to add an item right back into the cache at this point.\n * However, note that it is *very* easy to inadvertently create infinite\n * recursion this way.\n */\n disposeAfter?: Disposer\n\n /**\n * Set to true to suppress calling the\n * {@link OptionsBase.dispose} function if the entry key is\n * still accessible within the cache.\n *\n * This may be overridden by passing an options object to\n * {@link LRUCache#set}.\n *\n * Only relevant if `dispose` or `disposeAfter` are set.\n */\n noDisposeOnSet?: boolean\n\n /**\n * Boolean flag to tell the cache to not update the TTL when setting a new\n * value for an existing key (ie, when updating a value rather than\n * inserting a new value). Note that the TTL value is _always_ set (if\n * provided) when adding a new entry into the cache.\n *\n * Has no effect if a {@link OptionsBase.ttl} is not set.\n *\n * May be passed as an option to {@link LRUCache#set}.\n */\n noUpdateTTL?: boolean\n\n /**\n * Set to a positive integer to track the sizes of items added to the\n * cache, and automatically evict items in order to stay below this size.\n * Note that this may result in fewer than `max` items being stored.\n *\n * Attempting to add an item to the cache whose calculated size is greater\n * that this amount will be a no-op. The item will not be cached, and no\n * other items will be evicted.\n *\n * Optional, must be a positive integer if provided.\n *\n * Sets `maxEntrySize` to the same value, unless a different value is\n * provided for `maxEntrySize`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if size tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * Note also that size tracking can negatively impact performance,\n * though for most cases, only minimally.\n */\n maxSize?: Size\n\n /**\n * The effective size for background fetch promises.\n *\n * This has no effect unless `maxSize` and `sizeCalculation` are used,\n * and a {@link LRUCache.OptionsBase.fetchMethod} is provided to\n * support {@link LRUCache#fetch}.\n *\n * If a stale value is present in the cache, then the effective size of\n * the background fetch is the size of the stale item it will eventually\n * replace. If not, then this value is used as its effective size.\n *\n * @default 1\n */\n backgroundFetchSize?: number\n\n /**\n * The maximum allowed size for any single item in the cache.\n *\n * If a larger item is passed to {@link LRUCache#set} or returned by a\n * {@link OptionsBase.fetchMethod} or {@link OptionsBase.memoMethod}, then\n * it will not be stored in the cache.\n *\n * Attempting to add an item whose calculated size is greater than\n * this amount will not cache the item or evict any old items, but\n * WILL delete an existing value if one is already present.\n *\n * Optional, must be a positive integer if provided. Defaults to\n * the value of `maxSize` if provided.\n */\n maxEntrySize?: Size\n\n /**\n * A function that returns a number indicating the item's size.\n *\n * Requires {@link OptionsBase.maxSize} to be set.\n *\n * If not provided, and {@link OptionsBase.maxSize} or\n * {@link OptionsBase.maxEntrySize} are set, then all\n * {@link LRUCache#set} calls **must** provide an explicit\n * {@link SetOptions.size} or sizeCalculation param.\n */\n sizeCalculation?: SizeCalculator\n\n /**\n * Method that provides the implementation for {@link LRUCache#fetch}\n *\n * ```ts\n * fetchMethod(key, staleValue, { signal, options, context })\n * ```\n *\n * If `fetchMethod` is not provided, then `cache.fetch(key)` is equivalent\n * to `Promise.resolve(cache.get(key))`.\n *\n * If at any time, `signal.aborted` is set to `true`, or if the\n * `signal.onabort` method is called, or if it emits an `'abort'` event\n * which you can listen to with `addEventListener`, then that means that\n * the fetch should be abandoned. This may be passed along to async\n * functions aware of AbortController/AbortSignal behavior.\n *\n * The `fetchMethod` should **only** return `undefined` or a Promise\n * resolving to `undefined` if the AbortController signaled an `abort`\n * event. In all other cases, it should return or resolve to a value\n * suitable for adding to the cache.\n *\n * The `options` object is a union of the options that may be provided to\n * `set()` and `get()`. If they are modified, then that will result in\n * modifying the settings to `cache.set()` when the value is resolved, and\n * in the case of\n * {@link OptionsBase.noDeleteOnFetchRejection} and\n * {@link OptionsBase.allowStaleOnFetchRejection}, the handling of\n * `fetchMethod` failures.\n *\n * For example, a DNS cache may update the TTL based on the value returned\n * from a remote DNS server by changing `options.ttl` in the `fetchMethod`.\n */\n fetchMethod?: Fetcher\n\n /**\n * Method that provides the implementation for {@link LRUCache#memo}\n */\n memoMethod?: Memoizer\n\n /**\n * Set to true to suppress the deletion of stale data when a\n * {@link OptionsBase.fetchMethod} returns a rejected promise.\n */\n noDeleteOnFetchRejection?: boolean\n\n /**\n * Do not delete stale items when they are retrieved with\n * {@link LRUCache#get}.\n *\n * Note that the `get` return value will still be `undefined`\n * unless {@link OptionsBase.allowStale} is true.\n *\n * When using time-expiring entries with `ttl`, by default stale\n * items will be removed from the cache when the key is accessed\n * with `cache.get()`.\n *\n * Setting this option will cause stale items to remain in the cache, until\n * they are explicitly deleted with `cache.delete(key)`, or retrieved with\n * `noDeleteOnStaleGet` set to `false`.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n *\n * Only relevant if a ttl is used.\n */\n noDeleteOnStaleGet?: boolean\n\n /**\n * Set to true to allow returning stale data when a\n * {@link OptionsBase.fetchMethod} throws an error or returns a rejected\n * promise.\n *\n * This differs from using {@link OptionsBase.allowStale} in that stale\n * data will ONLY be returned in the case that the {@link LRUCache#fetch}\n * fails, not any other times.\n *\n * If a `fetchMethod` fails, and there is no stale value available, the\n * `fetch()` will resolve to `undefined`. Ie, all `fetchMethod` errors are\n * suppressed.\n *\n * Implies `noDeleteOnFetchRejection`.\n *\n * This may be set in calls to `fetch()`, or defaulted on the constructor,\n * or overridden by modifying the options object in the `fetchMethod`.\n */\n allowStaleOnFetchRejection?: boolean\n\n /**\n * Set to true to return a stale value from the cache when the\n * `AbortSignal` passed to the {@link OptionsBase.fetchMethod} dispatches\n * an `'abort'` event, whether user-triggered, or due to internal cache\n * behavior.\n *\n * Unless {@link OptionsBase.ignoreFetchAbort} is also set, the underlying\n * {@link OptionsBase.fetchMethod} will still be considered canceled, and\n * any value it returns will be ignored and not cached.\n *\n * Caveat: since fetches are aborted when a new value is explicitly\n * set in the cache, this can lead to fetch returning a stale value,\n * since that was the fallback value _at the moment the `fetch()` was\n * initiated_, even though the new updated value is now present in\n * the cache.\n *\n * For example:\n *\n * ```ts\n * const cache = new LRUCache({\n * ttl: 100,\n * fetchMethod: async (url, oldValue, { signal }) => {\n * const res = await fetch(url, { signal })\n * return await res.json()\n * }\n * })\n * cache.set('https://example.com/', { some: 'data' })\n * // 100ms go by...\n * const result = cache.fetch('https://example.com/')\n * cache.set('https://example.com/', { other: 'thing' })\n * console.log(await result) // { some: 'data' }\n * console.log(cache.get('https://example.com/')) // { other: 'thing' }\n * ```\n */\n allowStaleOnFetchAbort?: boolean\n\n /**\n * Set to true to ignore the `abort` event emitted by the `AbortSignal`\n * object passed to {@link OptionsBase.fetchMethod}, and still cache the\n * resulting resolution value, as long as it is not `undefined`.\n *\n * When used on its own, this means aborted {@link LRUCache#fetch} calls\n * are not immediately resolved or rejected when they are aborted, and\n * instead take the full time to await.\n *\n * When used with {@link OptionsBase.allowStaleOnFetchAbort}, aborted\n * {@link LRUCache#fetch} calls will resolve immediately to their stale\n * cached value or `undefined`, and will continue to process and eventually\n * update the cache when they resolve, as long as the resulting value is\n * not `undefined`, thus supporting a \"return stale on timeout while\n * refreshing\" mechanism by passing `AbortSignal.timeout(n)` as the signal.\n *\n * For example:\n *\n * ```ts\n * const c = new LRUCache({\n * ttl: 100,\n * ignoreFetchAbort: true,\n * allowStaleOnFetchAbort: true,\n * fetchMethod: async (key, oldValue, { signal }) => {\n * // note: do NOT pass the signal to fetch()!\n * // let's say this fetch can take a long time.\n * const res = await fetch(`https://slow-backend-server/${key}`)\n * return await res.json()\n * },\n * })\n *\n * // this will return the stale value after 100ms, while still\n * // updating in the background for next time.\n * const val = await c.fetch('key', { signal: AbortSignal.timeout(100) })\n * ```\n *\n * **Note**: regardless of this setting, an `abort` event _is still\n * emitted on the `AbortSignal` object_, so may result in invalid results\n * when passed to other underlying APIs that use AbortSignals.\n *\n * This may be overridden in the {@link OptionsBase.fetchMethod} or the\n * call to {@link LRUCache#fetch}.\n */\n ignoreFetchAbort?: boolean\n\n /**\n * In some cases, you may want to swap out the performance/Date object\n * used for TTL tracking. This should almost certainly NOT be done in\n * production environments!\n *\n * This value defaults to `global.performance` if it has a `now()` method,\n * or the `global.Date` object otherwise.\n */\n perf?: Perf\n }\n\n export interface OptionsMaxLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n max: Count\n }\n export interface OptionsTTLLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n ttl: Milliseconds\n ttlAutopurge: boolean\n }\n export interface OptionsSizeLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n maxSize: Size\n }\n\n /**\n * The valid safe options for the {@link LRUCache} constructor\n */\n export type Options =\n | OptionsMaxLimit\n | OptionsSizeLimit\n | OptionsTTLLimit\n\n /**\n * Entry objects used by {@link LRUCache#load} and {@link LRUCache#dump},\n * and returned by {@link LRUCache#info}.\n */\n export interface Entry {\n value: V\n ttl?: Milliseconds\n size?: Size\n start?: Milliseconds\n }\n}\n\n/**\n * Default export, the thing you're using this module to get.\n *\n * The `K` and `V` types define the key and value types, respectively. The\n * optional `FC` type defines the type of the `context` object passed to\n * `cache.fetch()` and `cache.memo()`.\n *\n * Keys and values **must not** be `null` or `undefined`.\n *\n * All properties from the options object (with the exception of `max`,\n * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are\n * added as normal public members. (The listed options are read-only getters.)\n *\n * Changing any of these will alter the defaults for subsequent method calls.\n */\nexport class LRUCache {\n // options that cannot be changed without disaster\n readonly #max: LRUCache.Count\n readonly #maxSize: LRUCache.Size\n readonly #dispose?: LRUCache.Disposer\n readonly #onInsert?: LRUCache.Inserter\n readonly #disposeAfter?: LRUCache.Disposer\n readonly #fetchMethod?: LRUCache.Fetcher\n readonly #memoMethod?: LRUCache.Memoizer\n readonly #perf: Perf\n\n /**\n * {@link LRUCache.OptionsBase.perf}\n */\n get perf() {\n return this.#perf\n }\n\n /**\n * {@link LRUCache.OptionsBase.ttl}\n */\n ttl: LRUCache.Milliseconds\n\n /**\n * {@link LRUCache.OptionsBase.ttlResolution}\n */\n ttlResolution: LRUCache.Milliseconds\n /**\n * {@link LRUCache.OptionsBase.ttlAutopurge}\n */\n ttlAutopurge: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnGet}\n */\n updateAgeOnGet: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnHas}\n */\n updateAgeOnHas: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStale}\n */\n allowStale: boolean\n\n /**\n * {@link LRUCache.OptionsBase.noDisposeOnSet}\n */\n noDisposeOnSet: boolean\n /**\n * {@link LRUCache.OptionsBase.noUpdateTTL}\n */\n noUpdateTTL: boolean\n /**\n * {@link LRUCache.OptionsBase.maxEntrySize}\n */\n maxEntrySize: LRUCache.Size\n /**\n * {@link LRUCache.OptionsBase.sizeCalculation}\n */\n sizeCalculation?: LRUCache.SizeCalculator\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection}\n */\n noDeleteOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnStaleGet}\n */\n noDeleteOnStaleGet: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}\n */\n allowStaleOnFetchAbort: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection}\n */\n allowStaleOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.ignoreFetchAbort}\n */\n ignoreFetchAbort: boolean\n\n /** {@link LRUCache.OptionsBase.backgroundFetchSize} */\n backgroundFetchSize: number\n\n // computed properties\n #size: LRUCache.Count\n #calculatedSize: LRUCache.Size\n #keyMap: Map\n #keyList: (K | undefined)[]\n #valList: (V | BackgroundFetch | undefined)[]\n #next: NumberArray\n #prev: NumberArray\n #head: Index\n #tail: Index\n #free: StackLike\n #disposed?: DisposeTask[]\n #sizes?: ZeroArray\n #starts?: ZeroArray\n #ttls?: ZeroArray\n #autopurgeTimers?: (undefined | ReturnType)[]\n\n #hasDispose: boolean\n #hasFetchMethod: boolean\n #hasDisposeAfter: boolean\n #hasOnInsert: boolean\n\n /**\n * Do not call this method unless you need to inspect the\n * inner workings of the cache. If anything returned by this\n * object is modified in any way, strange breakage may occur.\n *\n * These fields are private for a reason!\n *\n * @internal\n */\n static unsafeExposeInternals<\n K extends {},\n V extends {},\n FC extends unknown = unknown,\n >(c: LRUCache) {\n return {\n // properties\n starts: c.#starts,\n ttls: c.#ttls,\n autopurgeTimers: c.#autopurgeTimers,\n sizes: c.#sizes,\n keyMap: c.#keyMap as Map,\n keyList: c.#keyList,\n valList: c.#valList,\n next: c.#next,\n prev: c.#prev,\n get head() {\n return c.#head\n },\n get tail() {\n return c.#tail\n },\n free: c.#free,\n // methods\n isBackgroundFetch: (p: unknown) => c.#isBackgroundFetch(p),\n backgroundFetch: (\n k: K,\n index: number | undefined,\n options: LRUCache.FetchOptions,\n context: unknown,\n ): BackgroundFetch =>\n c.#backgroundFetch(\n k,\n index as Index | undefined,\n options,\n context as FC,\n ),\n moveToTail: (index: number): void => c.#moveToTail(index as Index),\n indexes: (options?: { allowStale: boolean }) => c.#indexes(options),\n rindexes: (options?: { allowStale: boolean }) =>\n c.#rindexes(options),\n isStale: (index: number | undefined) => c.#isStale(index as Index),\n }\n }\n\n // Protected read-only members\n\n /**\n * {@link LRUCache.OptionsBase.max} (read-only)\n */\n get max(): LRUCache.Count {\n return this.#max\n }\n /**\n * {@link LRUCache.OptionsBase.maxSize} (read-only)\n */\n get maxSize(): LRUCache.Count {\n return this.#maxSize\n }\n /**\n * The total computed size of items in the cache (read-only)\n */\n get calculatedSize(): LRUCache.Size {\n return this.#calculatedSize\n }\n /**\n * The number of items stored in the cache (read-only)\n */\n get size(): LRUCache.Count {\n return this.#size\n }\n /**\n * {@link LRUCache.OptionsBase.fetchMethod} (read-only)\n */\n get fetchMethod(): LRUCache.Fetcher | undefined {\n return this.#fetchMethod\n }\n get memoMethod(): LRUCache.Memoizer | undefined {\n return this.#memoMethod\n }\n /**\n * {@link LRUCache.OptionsBase.dispose} (read-only)\n */\n get dispose() {\n return this.#dispose\n }\n /**\n * {@link LRUCache.OptionsBase.onInsert} (read-only)\n */\n get onInsert() {\n return this.#onInsert\n }\n /**\n * {@link LRUCache.OptionsBase.disposeAfter} (read-only)\n */\n get disposeAfter() {\n return this.#disposeAfter\n }\n\n constructor(options: LRUCache.Options | LRUCache) {\n const {\n max = 0,\n ttl,\n ttlResolution = 1,\n ttlAutopurge,\n updateAgeOnGet,\n updateAgeOnHas,\n allowStale,\n dispose,\n onInsert,\n disposeAfter,\n noDisposeOnSet,\n noUpdateTTL,\n maxSize = 0,\n maxEntrySize = 0,\n sizeCalculation,\n fetchMethod,\n memoMethod,\n noDeleteOnFetchRejection,\n noDeleteOnStaleGet,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n backgroundFetchSize = 1,\n perf,\n } = options\n\n this.backgroundFetchSize = backgroundFetchSize\n\n if (perf !== undefined) {\n if (typeof perf?.now !== 'function') {\n throw new TypeError(\n 'perf option must have a now() method if specified',\n )\n }\n }\n\n this.#perf = perf ?? defaultPerf\n\n if (max !== 0 && !isPosInt(max)) {\n throw new TypeError('max option must be a nonnegative integer')\n }\n\n const UintArray = max ? getUintArray(max) : Array\n if (!UintArray) {\n throw new Error('invalid max value: ' + max)\n }\n\n this.#max = max\n this.#maxSize = maxSize\n this.maxEntrySize = maxEntrySize || this.#maxSize\n this.sizeCalculation = sizeCalculation\n if (this.sizeCalculation) {\n if (!this.#maxSize && !this.maxEntrySize) {\n throw new TypeError(\n 'cannot set sizeCalculation without setting maxSize or maxEntrySize',\n )\n }\n if (typeof this.sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation set to non-function')\n }\n }\n\n if (memoMethod !== undefined && typeof memoMethod !== 'function') {\n throw new TypeError('memoMethod must be a function if defined')\n }\n this.#memoMethod = memoMethod\n\n if (fetchMethod !== undefined && typeof fetchMethod !== 'function') {\n throw new TypeError('fetchMethod must be a function if specified')\n }\n this.#fetchMethod = fetchMethod\n this.#hasFetchMethod = !!fetchMethod\n\n this.#keyMap = new Map()\n this.#keyList = Array.from({ length: max }).fill(undefined) as (\n | K\n | undefined\n )[]\n this.#valList = Array.from({ length: max }).fill(undefined) as (\n | V\n | undefined\n )[]\n this.#next = new UintArray(max)\n this.#prev = new UintArray(max)\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free = Stack.create(max)\n this.#size = 0\n this.#calculatedSize = 0\n\n if (typeof dispose === 'function') {\n this.#dispose = dispose\n }\n if (typeof onInsert === 'function') {\n this.#onInsert = onInsert\n }\n if (typeof disposeAfter === 'function') {\n this.#disposeAfter = disposeAfter\n this.#disposed = []\n } else {\n this.#disposeAfter = undefined\n this.#disposed = undefined\n }\n this.#hasDispose = !!this.#dispose\n this.#hasOnInsert = !!this.#onInsert\n this.#hasDisposeAfter = !!this.#disposeAfter\n\n this.noDisposeOnSet = !!noDisposeOnSet\n this.noUpdateTTL = !!noUpdateTTL\n this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection\n this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection\n this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort\n this.ignoreFetchAbort = !!ignoreFetchAbort\n\n // NB: maxEntrySize is set to maxSize if it's set\n if (this.maxEntrySize !== 0) {\n if (this.#maxSize !== 0) {\n if (!isPosInt(this.#maxSize)) {\n throw new TypeError(\n 'maxSize must be a positive integer if specified',\n )\n }\n }\n if (!isPosInt(this.maxEntrySize)) {\n throw new TypeError(\n 'maxEntrySize must be a positive integer if specified',\n )\n }\n this.#initializeSizeTracking()\n }\n\n this.allowStale = !!allowStale\n this.noDeleteOnStaleGet = !!noDeleteOnStaleGet\n this.updateAgeOnGet = !!updateAgeOnGet\n this.updateAgeOnHas = !!updateAgeOnHas\n this.ttlResolution =\n isPosInt(ttlResolution) || ttlResolution === 0 ? ttlResolution : 1\n this.ttlAutopurge = !!ttlAutopurge\n this.ttl = ttl || 0\n if (this.ttl) {\n if (!isPosInt(this.ttl)) {\n throw new TypeError('ttl must be a positive integer if specified')\n }\n this.#initializeTTLTracking()\n }\n\n // do not allow completely unbounded caches\n if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) {\n throw new TypeError(\n 'At least one of max, maxSize, or ttl is required',\n )\n }\n if (!this.ttlAutopurge && !this.#max && !this.#maxSize) {\n const code = 'LRU_CACHE_UNBOUNDED'\n if (shouldWarn(code)) {\n warned.add(code)\n const msg =\n 'TTL caching without ttlAutopurge, max, or maxSize can ' +\n 'result in unbounded memory consumption.'\n emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache)\n }\n }\n }\n\n /**\n * Return the number of ms left in the item's TTL. If item is not in cache,\n * returns `0`. Returns `Infinity` if item is in cache without a defined TTL.\n */\n getRemainingTTL(key: K) {\n return this.#keyMap.has(key) ? Infinity : 0\n }\n\n #initializeTTLTracking() {\n const ttls = new ZeroArray(this.#max)\n const starts = new ZeroArray(this.#max)\n this.#ttls = ttls\n this.#starts = starts\n const purgeTimers =\n this.ttlAutopurge ?\n Array.from>({\n length: this.#max,\n })\n : undefined\n this.#autopurgeTimers = purgeTimers\n\n this.#setItemTTL = (index, ttl, start = this.#perf.now()) => {\n starts[index] = ttl !== 0 ? start : 0\n ttls[index] = ttl\n setPurgetTimer(index, ttl)\n }\n\n this.#updateItemAge = index => {\n starts[index] = ttls[index] !== 0 ? this.#perf.now() : 0\n setPurgetTimer(index, ttls[index])\n }\n\n // clear out the purge timer if we're setting TTL to 0, and\n // previously had a ttl purge timer running, so it doesn't\n // fire unnecessarily. Don't need to do this if we're not doing\n // autopurge.\n const setPurgetTimer =\n !this.ttlAutopurge ?\n () => {}\n : (index: Index, ttl?: number) => {\n if (purgeTimers?.[index]) {\n clearTimeout(purgeTimers[index])\n purgeTimers[index] = undefined\n }\n if (ttl && ttl !== 0 && purgeTimers) {\n const t = setTimeout(() => {\n if (this.#isStale(index)) {\n this.#delete(this.#keyList[index] as K, 'expire')\n }\n }, ttl + 1)\n // unref() not supported on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n purgeTimers[index] = t\n }\n }\n\n this.#statusTTL = (status, index) => {\n if (ttls[index]) {\n const ttl = ttls[index]\n const start = starts[index]\n /* c8 ignore start */\n if (!ttl || !start) {\n return\n }\n /* c8 ignore stop */\n status.ttl = ttl\n status.start = start\n status.now = cachedNow || getNow()\n const age = status.now - start\n status.remainingTTL = ttl - age\n }\n }\n\n // debounce calls to perf.now() to 1s so we're not hitting\n // that costly call repeatedly.\n let cachedNow = 0\n const getNow = () => {\n const n = this.#perf.now()\n if (this.ttlResolution > 0) {\n cachedNow = n\n const t = setTimeout(() => (cachedNow = 0), this.ttlResolution)\n // not available on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n }\n return n\n }\n\n this.getRemainingTTL = key => {\n const index = this.#keyMap.get(key)\n if (index === undefined) {\n return 0\n }\n const ttl = ttls[index]\n const start = starts[index]\n if (!ttl || !start) {\n return Infinity\n }\n const age = (cachedNow || getNow()) - start\n return ttl - age\n }\n\n this.#isStale = index => {\n const s = starts[index]\n const t = ttls[index]\n return !!t && !!s && (cachedNow || getNow()) - s > t\n }\n }\n\n // conditionally set private methods related to TTL\n #updateItemAge: (index: Index) => void = () => {}\n #statusTTL: (status: LRUCache.Status, index: Index) => void =\n () => {}\n #setItemTTL: (\n index: Index,\n ttl: LRUCache.Milliseconds,\n start?: LRUCache.Milliseconds,\n // ignore because we never call this if we're not already in TTL mode\n /* c8 ignore start */\n ) => void = () => {}\n /* c8 ignore stop */\n\n #isStale: (index: Index) => boolean = () => false\n\n #initializeSizeTracking() {\n const sizes = new ZeroArray(this.#max)\n this.#calculatedSize = 0\n this.#sizes = sizes\n this.#removeItemSize = index => {\n this.#calculatedSize -= sizes[index] as number\n sizes[index] = 0\n }\n this.#requireSize = (k, v, size, sizeCalculation) => {\n if (!isPosInt(size)) {\n // provisionally accept background fetches.\n // actual value size will be checked when they return.\n if (this.#isBackgroundFetch(v)) {\n // NB: this cannot occur if v.__staleWhileFetching is set,\n // because in that case, it would take on the size of the\n // existing entry that it temporarily replaces.\n return this.backgroundFetchSize\n }\n if (sizeCalculation) {\n if (typeof sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation must be a function')\n }\n size = sizeCalculation(v, k)\n if (!isPosInt(size)) {\n throw new TypeError(\n 'sizeCalculation return invalid (expect positive integer)',\n )\n }\n } else {\n throw new TypeError(\n 'invalid size value (must be positive integer). ' +\n 'When maxSize or maxEntrySize is used, sizeCalculation ' +\n 'or size must be set.',\n )\n }\n }\n return size\n }\n\n this.#addItemSize = (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status,\n ) => {\n sizes[index] = size\n if (this.#maxSize) {\n const maxSize = this.#maxSize - sizes[index]\n while (this.#calculatedSize > maxSize) {\n this.#evict(true)\n }\n }\n this.#calculatedSize += sizes[index]\n if (status) {\n status.entrySize = size\n status.totalCalculatedSize = this.#calculatedSize\n }\n }\n }\n\n #removeItemSize: (index: Index) => void = _i => {}\n\n #addItemSize: (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status,\n ) => void = (_i, _s, _st) => {}\n\n #requireSize: (\n k: K,\n v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator,\n status?: LRUCache.Status,\n ) => LRUCache.Size = (\n _k: K,\n _v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator,\n ) => {\n if (size || sizeCalculation) {\n throw new TypeError(\n 'cannot set size without setting maxSize or maxEntrySize on cache',\n )\n }\n return 0\n };\n\n *#indexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#tail; this.#isValidIndex(i); ) {\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#head) {\n break\n } else {\n i = this.#prev[i] as Index\n }\n }\n }\n }\n\n *#rindexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#head; this.#isValidIndex(i); ) {\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#tail) {\n break\n } else {\n i = this.#next[i] as Index\n }\n }\n }\n }\n\n #isValidIndex(index: Index) {\n return (\n index !== undefined &&\n this.#keyMap.get(this.#keyList[index] as K) === index\n )\n }\n\n /**\n * Return a generator yielding `[key, value]` pairs,\n * in order from most recently used to least recently used.\n */\n *entries() {\n for (const i of this.#indexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]] as [K, V]\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.entries}\n *\n * Return a generator yielding `[key, value]` pairs,\n * in order from least recently used to most recently used.\n */\n *rentries() {\n for (const i of this.#rindexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]]\n }\n }\n }\n\n /**\n * Return a generator yielding the keys in the cache,\n * in order from most recently used to least recently used.\n */\n *keys() {\n for (const i of this.#indexes()) {\n const k = this.#keyList[i]\n if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield k\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.keys}\n *\n * Return a generator yielding the keys in the cache,\n * in order from least recently used to most recently used.\n */\n *rkeys() {\n for (const i of this.#rindexes()) {\n const k = this.#keyList[i]\n if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield k\n }\n }\n }\n\n /**\n * Return a generator yielding the values in the cache,\n * in order from most recently used to least recently used.\n */\n *values() {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i] as V\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.values}\n *\n * Return a generator yielding the values in the cache,\n * in order from least recently used to most recently used.\n */\n *rvalues() {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i]\n }\n }\n }\n\n /**\n * Iterating over the cache itself yields the same results as\n * {@link LRUCache.entries}\n */\n [Symbol.iterator]() {\n return this.entries()\n }\n\n /**\n * A String value that is used in the creation of the default string\n * description of an object. Called by the built-in method\n * `Object.prototype.toString`.\n */\n [Symbol.toStringTag] = 'LRUCache'\n\n /**\n * Find a value for which the supplied fn method returns a truthy value,\n * similar to `Array.find()`. fn is called as `fn(value, key, cache)`.\n */\n find(\n fn: (v: V, k: K, self: LRUCache) => boolean,\n getOptions: LRUCache.GetOptions = {},\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n if (fn(value, this.#keyList[i] as K, this)) {\n return this.#get(this.#keyList[i] as K, getOptions)\n }\n }\n }\n\n /**\n * Call the supplied function on each item in the cache, in order from most\n * recently used to least recently used.\n *\n * `fn` is called as `fn(value, key, cache)`.\n *\n * If `thisp` is provided, function will be called in the `this`-context of\n * the provided object, or the cache if no `thisp` object is provided.\n *\n * Does not update age or recenty of use, or iterate over stale values.\n */\n forEach(\n fn: (v: V, k: K, self: LRUCache) => unknown,\n thisp: unknown = this,\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * The same as {@link LRUCache.forEach} but items are iterated over in\n * reverse order. (ie, less recently used items are iterated over first.)\n */\n rforEach(\n fn: (v: V, k: K, self: LRUCache) => unknown,\n thisp: unknown = this,\n ) {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * Delete any stale entries. Returns true if anything was removed,\n * false otherwise.\n */\n purgeStale() {\n let deleted = false\n for (const i of this.#rindexes({ allowStale: true })) {\n if (this.#isStale(i)) {\n this.#delete(this.#keyList[i] as K, 'expire')\n deleted = true\n }\n }\n return deleted\n }\n\n /**\n * Get the extended info about a given entry, to get its value, size, and\n * TTL info simultaneously. Returns `undefined` if the key is not present.\n *\n * Unlike {@link LRUCache#dump}, which is designed to be portable and survive\n * serialization, the `start` value is always the current timestamp, and the\n * `ttl` is a calculated remaining time to live (negative if expired).\n *\n * Always returns stale values, if their info is found in the cache, so be\n * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl})\n * if relevant.\n */\n info(key: K): LRUCache.Entry | undefined {\n const i = this.#keyMap.get(key)\n if (i === undefined) return undefined\n const v = this.#valList[i]\n /* c8 ignore start - this isn't tested for the info function,\n * but it's the same logic as found in other places. */\n const value: V | undefined =\n this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) return undefined\n /* c8 ignore stop */\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n const ttl = this.#ttls[i]\n const start = this.#starts[i]\n if (ttl && start) {\n const remain = ttl - (this.#perf.now() - start)\n entry.ttl = remain\n entry.start = Date.now()\n }\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n return entry\n }\n\n /**\n * Return an array of [key, {@link LRUCache.Entry}] tuples which can be\n * passed to {@link LRUCache#load}.\n *\n * The `start` fields are calculated relative to a portable `Date.now()`\n * timestamp, even if `performance.now()` is available.\n *\n * Stale entries are always included in the `dump`, even if\n * {@link LRUCache.OptionsBase.allowStale} is false.\n *\n * Note: this returns an actual array, not a generator, so it can be more\n * easily passed around.\n */\n dump() {\n const arr: [K, LRUCache.Entry][] = []\n for (const i of this.#indexes({ allowStale: true })) {\n const key = this.#keyList[i]\n const v = this.#valList[i]\n const value: V | undefined =\n this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined || key === undefined) continue\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n entry.ttl = this.#ttls[i]\n // always dump the start relative to a portable timestamp\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = this.#perf.now() - (this.#starts[i] as number)\n entry.start = Math.floor(Date.now() - age)\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n arr.unshift([key, entry])\n }\n return arr\n }\n\n /**\n * Reset the cache and load in the items in entries in the order listed.\n *\n * The shape of the resulting cache may be different if the same options are\n * not used in both caches.\n *\n * The `start` fields are assumed to be calculated relative to a portable\n * `Date.now()` timestamp, even if `performance.now()` is available.\n */\n load(arr: [K, LRUCache.Entry][]) {\n this.clear()\n for (const [key, entry] of arr) {\n if (entry.start) {\n // entry.start is a portable timestamp, but we may be using\n // node's performance.now(), so calculate the offset, so that\n // we get the intended remaining TTL, no matter how long it's\n // been on ice.\n //\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = Date.now() - entry.start\n entry.start = this.#perf.now() - age\n }\n this.#set(key, entry.value, entry)\n }\n }\n\n /**\n * Add a value to the cache.\n *\n * Note: if `undefined` is specified as a value, this is an alias for\n * {@link LRUCache#delete}\n *\n * Fields on the {@link LRUCache.SetOptions} options param will override\n * their corresponding values in the constructor options for the scope\n * of this single `set()` operation.\n *\n * If `start` is provided, then that will set the effective start\n * time for the TTL calculation. Note that this must be a previous\n * value of `performance.now()` if supported, or a previous value of\n * `Date.now()` if not.\n *\n * Options object may also include `size`, which will prevent\n * calling the `sizeCalculation` function and just use the specified\n * number if it is a positive integer, and `noDisposeOnSet` which\n * will prevent calling a `dispose` function in the case of\n * overwrites.\n *\n * If the `size` (or return value of `sizeCalculation`) for a given\n * entry is greater than `maxEntrySize`, then the item will not be\n * added to the cache.\n *\n * Will update the recency of the entry.\n *\n * If the value is `undefined`, then this is an alias for\n * `cache.delete(key)`. `undefined` is never stored in the cache.\n */\n set(\n k: K,\n v: V | undefined,\n setOptions: LRUCache.SetOptions = {},\n ) {\n const { status = metrics.hasSubscribers ? {} : undefined } = setOptions\n setOptions.status = status\n if (status) {\n status.op = 'set'\n status.key = k\n if (v !== undefined) status.value = v\n status.cache = this\n }\n const result = this.#set(k, v, setOptions)\n if (status && metrics.hasSubscribers) {\n metrics.publish(status)\n }\n return result\n }\n\n #set(\n k: K,\n v: V | BackgroundFetch | undefined,\n setOptions: LRUCache.SetOptions,\n bf?: BackgroundFetch,\n ) {\n const {\n ttl = this.ttl,\n start,\n noDisposeOnSet = this.noDisposeOnSet,\n sizeCalculation = this.sizeCalculation,\n status,\n } = setOptions\n\n const isBF = this.#isBackgroundFetch(v)\n if (v === undefined) {\n if (status) status.set = 'deleted'\n this.delete(k)\n return this\n }\n let { noUpdateTTL = this.noUpdateTTL } = setOptions\n\n if (status && !isBF) status.value = v\n\n const size = this.#requireSize(\n k,\n v,\n setOptions.size || 0,\n sizeCalculation,\n status,\n )\n // if the item doesn't fit, don't do anything\n // NB: maxEntrySize set to maxSize by default\n if (this.maxEntrySize && size > this.maxEntrySize) {\n // have to delete, in case something is there already.\n this.#delete(k, 'set')\n if (status) {\n status.set = 'miss'\n status.maxEntrySizeExceeded = true\n }\n return this\n }\n let index = this.#size === 0 ? undefined : this.#keyMap.get(k)\n if (index === undefined) {\n // addition\n index = (\n this.#size === 0 ? this.#tail\n : this.#free.length !== 0 ? this.#free.pop()\n : this.#size === this.#max ? this.#evict(false)\n : this.#size) as Index\n this.#keyList[index] = k\n this.#valList[index] = v\n this.#keyMap.set(k, index)\n this.#next[this.#tail] = index\n this.#prev[index] = this.#tail\n this.#tail = index\n this.#size++\n this.#addItemSize(index, size, status)\n if (status) status.set = 'add'\n noUpdateTTL = false\n if (this.#hasOnInsert && !isBF) {\n this.#onInsert?.(v, k, 'add')\n }\n } else {\n // update\n // might be updating a background fetch!\n this.#moveToTail(index)\n const oldVal = this.#valList[index]!\n if (v !== oldVal) {\n if (!noDisposeOnSet) {\n if (this.#isBackgroundFetch(oldVal)) {\n if (oldVal !== bf) {\n // setting over a background fetch, not merely resolving it.\n oldVal.__abortController.abort(new Error('replaced'))\n }\n const { __staleWhileFetching: s } = oldVal\n if (s !== undefined && s !== v) {\n if (this.#hasDispose) {\n this.#dispose?.(s, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([s, k, 'set'])\n }\n }\n } else {\n if (this.#hasDispose) {\n this.#dispose?.(oldVal, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldVal, k, 'set'])\n }\n }\n }\n this.#removeItemSize(index)\n this.#addItemSize(index, size, status)\n this.#valList[index] = v\n if (!isBF) {\n const oldValue =\n oldVal && this.#isBackgroundFetch(oldVal) ?\n oldVal.__staleWhileFetching\n : oldVal\n const setType =\n oldValue === undefined ? 'add'\n : v !== oldValue ? 'replace'\n : 'update'\n if (status) {\n status.set = setType\n if (oldValue !== undefined) status.oldValue = oldValue\n }\n if (this.#hasOnInsert) {\n this.onInsert?.(v, k, setType)\n }\n }\n } else if (!isBF) {\n if (status) {\n status.set = 'update'\n }\n if (this.#hasOnInsert) {\n this.onInsert?.(v, k, 'update')\n }\n }\n }\n if (ttl !== 0 && !this.#ttls) {\n this.#initializeTTLTracking()\n }\n if (this.#ttls) {\n if (!noUpdateTTL) {\n this.#setItemTTL(index, ttl, start)\n }\n if (status) this.#statusTTL(status, index)\n }\n if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return this\n }\n\n /**\n * Evict the least recently used item, returning its value or\n * `undefined` if cache is empty.\n */\n pop(): V | undefined {\n try {\n while (this.#size) {\n const val = this.#valList[this.#head]\n this.#evict(true)\n if (this.#isBackgroundFetch(val)) {\n if (val.__staleWhileFetching) {\n return val.__staleWhileFetching\n }\n } else if (val !== undefined) {\n return val\n }\n }\n } finally {\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n }\n\n #evict(free: boolean) {\n const head = this.#head\n const k = this.#keyList[head]!\n const v = this.#valList[head]!\n const isBF = this.#isBackgroundFetch(v)\n if (isBF) {\n v.__abortController.abort(new Error('evicted'))\n }\n const oldValue = isBF ? v.__staleWhileFetching : v\n if (\n (this.#hasDispose || this.#hasDisposeAfter) &&\n oldValue !== undefined\n ) {\n if (this.#hasDispose) {\n this.#dispose?.(oldValue, k, 'evict')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldValue, k, 'evict'])\n }\n }\n this.#removeItemSize(head)\n if (this.#autopurgeTimers?.[head]) {\n clearTimeout(this.#autopurgeTimers[head])\n this.#autopurgeTimers[head] = undefined\n }\n // if we aren't about to use the index, then null these out\n if (free) {\n this.#keyList[head] = undefined\n this.#valList[head] = undefined\n this.#free.push(head)\n }\n if (this.#size === 1) {\n this.#head = this.#tail = 0 as Index\n this.#free.length = 0\n } else {\n this.#head = this.#next[head] as Index\n }\n this.#keyMap.delete(k)\n this.#size--\n return head\n }\n\n /**\n * Check if a key is in the cache, without updating the recency of use.\n * Will return false if the item is stale, even though it is technically\n * in the cache.\n *\n * Check if a key is in the cache, without updating the recency of\n * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set\n * to `true` in either the options or the constructor.\n *\n * Will return `false` if the item is stale, even though it is technically in\n * the cache. The difference can be determined (if it matters) by using a\n * `status` argument, and inspecting the `has` field.\n *\n * Will not update item age unless\n * {@link LRUCache.OptionsBase.updateAgeOnHas} is set.\n */\n has(k: K, hasOptions: LRUCache.HasOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } = hasOptions\n hasOptions.status = status\n if (status) {\n status.op = 'has'\n status.key = k\n status.cache = this\n }\n const result = this.#has(k, hasOptions)\n if (metrics.hasSubscribers) metrics.publish(status)\n return result\n }\n #has(k: K, hasOptions: LRUCache.HasOptions = {}) {\n const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n const v = this.#valList[index]\n if (\n this.#isBackgroundFetch(v) &&\n v.__staleWhileFetching === undefined\n ) {\n return false\n }\n if (!this.#isStale(index)) {\n if (updateAgeOnHas) {\n this.#updateItemAge(index)\n }\n if (status) {\n status.has = 'hit'\n this.#statusTTL(status, index)\n }\n return true\n } else if (status) {\n status.has = 'stale'\n this.#statusTTL(status, index)\n }\n } else if (status) {\n status.has = 'miss'\n }\n return false\n }\n\n /**\n * Like {@link LRUCache#get} but doesn't update recency or delete stale\n * items.\n *\n * Returns `undefined` if the item is stale, unless\n * {@link LRUCache.OptionsBase.allowStale} is set.\n */\n peek(k: K, peekOptions: LRUCache.PeekOptions = {}) {\n const { status = hasSubscribers() ? {} : undefined } = peekOptions\n if (status) {\n status.op = 'peek'\n status.key = k\n status.cache = this\n }\n peekOptions.status = status\n const result = this.#peek(k, peekOptions)\n if (metrics.hasSubscribers) {\n metrics.publish(status)\n }\n return result\n }\n #peek(k: K, peekOptions: LRUCache.PeekOptions) {\n const { status, allowStale = this.allowStale } = peekOptions\n const index = this.#keyMap.get(k)\n if (index === undefined || (!allowStale && this.#isStale(index))) {\n if (status) status.peek = index === undefined ? 'miss' : 'stale'\n return undefined\n }\n const v = this.#valList[index]\n const val = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (status) {\n if (val !== undefined) {\n status.peek = 'hit'\n status.value = val\n } else {\n status.peek = 'miss'\n }\n }\n return val\n }\n\n #backgroundFetch(\n k: K,\n index: Index | undefined,\n options: LRUCache.FetchOptions,\n context: FC,\n ): BackgroundFetch {\n const v = index === undefined ? undefined : this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n return v\n }\n\n const ac = new AbortController()\n const { signal } = options\n // when/if our AC signals, then stop listening to theirs.\n signal?.addEventListener('abort', () => ac.abort(signal.reason), {\n signal: ac.signal,\n })\n\n const fetchOpts = {\n signal: ac.signal,\n options,\n context,\n }\n\n const cb = (v: V | undefined, updateCache = false): V | undefined => {\n const { aborted } = ac.signal\n const ignoreAbort = options.ignoreFetchAbort && v !== undefined\n const proceed =\n options.ignoreFetchAbort ||\n !!(options.allowStaleOnFetchAbort && v !== undefined)\n if (options.status) {\n if (aborted && !updateCache) {\n options.status.fetchAborted = true\n options.status.fetchError = ac.signal.reason\n if (ignoreAbort) options.status.fetchAbortIgnored = true\n } else {\n options.status.fetchResolved = true\n }\n }\n if (aborted && !ignoreAbort && !updateCache) {\n return fetchFail(ac.signal.reason, proceed)\n }\n // either we didn't abort, and are still here, or we did, and ignored\n const bf = p as BackgroundFetch\n // if nothing else has been written there but we're set to update the\n // cache and ignore the abort, or if it's still pending on this specific\n // background request, then write it to the cache.\n const vl = this.#valList[index as Index]\n if (vl === p || (vl === undefined && ignoreAbort && updateCache)) {\n if (v === undefined) {\n if (bf.__staleWhileFetching !== undefined) {\n this.#valList[index as Index] = bf.__staleWhileFetching\n } else {\n this.#delete(k, 'fetch')\n }\n } else {\n if (options.status) options.status.fetchUpdated = true\n this.#set(k, v, fetchOpts.options, bf)\n }\n }\n return v\n }\n\n const eb = (er: unknown) => {\n if (options.status) {\n options.status.fetchRejected = true\n options.status.fetchError = er as Error\n }\n // do not pass go, do not collect $200\n return fetchFail(er, false)\n }\n\n const fetchFail = (er: unknown, proceed: boolean): V | undefined => {\n const { aborted } = ac.signal\n const allowStaleAborted = aborted && options.allowStaleOnFetchAbort\n const allowStale =\n allowStaleAborted || options.allowStaleOnFetchRejection\n const noDelete = allowStale || options.noDeleteOnFetchRejection\n const bf = p as BackgroundFetch\n if (this.#valList[index as Index] === p) {\n // if we allow stale on fetch rejections, then we need to ensure that\n // the stale value is not removed from the cache when the fetch fails.\n const del =\n !noDelete || (!proceed && bf.__staleWhileFetching === undefined)\n if (del) {\n this.#delete(k, 'fetch')\n } else if (!allowStaleAborted) {\n // still replace the *promise* with the stale value,\n // since we are done with the promise at this point.\n // leave it untouched if we're still waiting for an\n // aborted background fetch that hasn't yet returned.\n this.#valList[index as Index] = bf.__staleWhileFetching\n }\n }\n if (allowStale) {\n if (options.status && bf.__staleWhileFetching !== undefined) {\n options.status.returnedStale = true\n }\n return bf.__staleWhileFetching\n } else if (bf.__returned === bf) {\n throw er\n }\n }\n\n const pcall = (\n res: (v: V | undefined) => void,\n rej: (e: unknown) => void,\n ) => {\n const fmp = this.#fetchMethod?.(k, v, fetchOpts)\n // ignored, we go until we finish, regardless.\n // defer check until we are actually aborting,\n // so fetchMethod can override.\n ac.signal.addEventListener('abort', () => {\n if (!options.ignoreFetchAbort || options.allowStaleOnFetchAbort) {\n res(undefined)\n // when it eventually resolves, update the cache.\n if (options.allowStaleOnFetchAbort) {\n res = v => cb(v, true)\n }\n }\n })\n if (fmp && fmp instanceof Promise) {\n fmp.then(v => res(v === undefined ? undefined : v), rej)\n } else if (fmp !== undefined) {\n res(fmp)\n }\n }\n\n if (options.status) options.status.fetchDispatched = true\n const p = new Promise(pcall).then(cb, eb)\n const bf: BackgroundFetch = Object.assign(p, {\n __abortController: ac,\n __staleWhileFetching: v,\n __returned: undefined,\n })\n\n if (index === undefined) {\n // internal, don't expose status.\n this.#set(k, bf, { ...fetchOpts.options, status: undefined })\n index = this.#keyMap.get(k)\n } else {\n // do not call #set, because we do not want to adjust its place\n // in the lru queue, as it has not yet been \"used\". Also, we don't\n // need to worry about evicting for size, because a background fetch\n // over a stale value is treated as the same size as its stale value.\n this.#valList[index] = bf\n }\n return bf\n }\n\n #isBackgroundFetch(p: unknown): p is BackgroundFetch {\n if (!this.#hasFetchMethod) return false\n const b = p as BackgroundFetch\n return (\n !!b &&\n b instanceof Promise &&\n b.hasOwnProperty('__staleWhileFetching') &&\n b.__abortController instanceof AbortController\n )\n }\n\n /**\n * Make an asynchronous cached fetch using the\n * {@link LRUCache.OptionsBase.fetchMethod} function.\n *\n * If the value is in the cache and not stale, then the returned\n * Promise resolves to the value.\n *\n * If not in the cache, or beyond its TTL staleness, then\n * `fetchMethod(key, staleValue, { options, signal, context })` is\n * called, and the value returned will be added to the cache once\n * resolved.\n *\n * If called with `allowStale`, and an asynchronous fetch is\n * currently in progress to reload a stale value, then the former\n * stale value will be returned.\n *\n * If called with `forceRefresh`, then the cached item will be\n * re-fetched, even if it is not stale. However, if `allowStale` is also\n * set, then the old value will still be returned. This is useful\n * in cases where you want to force a reload of a cached value. If\n * a background fetch is already in progress, then `forceRefresh`\n * has no effect.\n *\n * If multiple fetches for the same key are issued, then they will all be\n * coalesced into a single call to fetchMethod.\n *\n * Note that this means that handling options such as\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort},\n * {@link LRUCache.FetchOptions.signal},\n * and {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} will be\n * determined by the FIRST fetch() call for a given key.\n *\n * This is a known (fixable) shortcoming which will be addresed on when\n * someone complains about it, as the fix would involve added complexity and\n * may not be worth the costs for this edge case.\n *\n * If {@link LRUCache.OptionsBase.fetchMethod} is not specified, then this is\n * effectively an alias for `Promise.resolve(cache.get(key))`.\n *\n * When the fetch method resolves to a value, if the fetch has not\n * been aborted due to deletion, eviction, or being overwritten,\n * then it is added to the cache using the options provided.\n *\n * If the key is evicted or deleted before the `fetchMethod`\n * resolves, then the AbortSignal passed to the `fetchMethod` will\n * receive an `abort` event, and the promise returned by `fetch()`\n * will reject with the reason for the abort.\n *\n * If a `signal` is passed to the `fetch()` call, then aborting the\n * signal will abort the fetch and cause the `fetch()` promise to\n * reject with the reason provided.\n *\n * **Setting `context`**\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the {@link LRUCache} constructor, then all\n * calls to `cache.fetch()` _must_ provide a `context` option. If\n * set to `undefined` or `void`, then calls to fetch _must not_\n * provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that\n * might be relevant in the course of fetching the data. It is only\n * relevant for the course of a single `fetch()` operation, and\n * discarded afterwards.\n *\n * **Note: `fetch()` calls are inflight-unique**\n *\n * If you call `fetch()` multiple times with the same key value,\n * then every call after the first will resolve on the same\n * promise1,\n * _even if they have different settings that would otherwise change\n * the behavior of the fetch_, such as `noDeleteOnFetchRejection`\n * or `ignoreFetchAbort`.\n *\n * In most cases, this is not a problem (in fact, only fetching\n * something once is what you probably want, if you're caching in\n * the first place). If you are changing the fetch() options\n * dramatically between runs, there's a good chance that you might\n * be trying to fit divergent semantics into a single object, and\n * would be better off with multiple cache instances.\n *\n * **1**: Ie, they're not the \"same Promise\", but they resolve at\n * the same time, because they're both waiting on the same\n * underlying fetchMethod response.\n */\n\n fetch(\n k: K,\n fetchOptions: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext,\n ): Promise\n\n // this overload not allowed if context is required\n fetch(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n fetchOptions?: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : never,\n ): Promise\n fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const ths = tracing.hasSubscribers\n const { status = hasSubscribers() ? {} : undefined } = fetchOptions\n fetchOptions.status = status\n if (status && fetchOptions.context) {\n status.context = fetchOptions.context\n }\n const p = this.#fetch(k, fetchOptions)\n if (status && ths) {\n status.trace = true\n tracing.tracePromise(() => p, status).catch(() => {})\n }\n return p\n }\n\n async #fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const {\n // get options\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n // set options\n ttl = this.ttl,\n noDisposeOnSet = this.noDisposeOnSet,\n size = 0,\n sizeCalculation = this.sizeCalculation,\n noUpdateTTL = this.noUpdateTTL,\n // fetch exclusive options\n noDeleteOnFetchRejection = this.noDeleteOnFetchRejection,\n allowStaleOnFetchRejection = this.allowStaleOnFetchRejection,\n ignoreFetchAbort = this.ignoreFetchAbort,\n allowStaleOnFetchAbort = this.allowStaleOnFetchAbort,\n context,\n forceRefresh = false,\n status,\n signal,\n } = fetchOptions\n if (status) {\n status.op = 'fetch'\n status.key = k\n if (forceRefresh) status.forceRefresh = true\n status.cache = this\n }\n\n if (!this.#hasFetchMethod) {\n if (status) status.fetch = 'get'\n return this.#get(k, {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n status,\n })\n }\n\n const options = {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n ttl,\n noDisposeOnSet,\n size,\n sizeCalculation,\n noUpdateTTL,\n noDeleteOnFetchRejection,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n status,\n signal,\n }\n\n let index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.fetch = 'miss'\n const p = this.#backgroundFetch(k, index, options, context as FC)\n return (p.__returned = p)\n } else {\n // in cache, maybe already fetching\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n const stale = allowStale && v.__staleWhileFetching !== undefined\n if (status) {\n status.fetch = 'inflight'\n if (stale) status.returnedStale = true\n }\n return stale ? v.__staleWhileFetching : (v.__returned = v)\n }\n\n // if we force a refresh, that means do NOT serve the cached value,\n // unless we are already in the process of refreshing the cache.\n const isStale = this.#isStale(index)\n if (!forceRefresh && !isStale) {\n if (status) status.fetch = 'hit'\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n if (status) this.#statusTTL(status, index)\n return v\n }\n\n // ok, it is stale or a forced refresh, and not already fetching.\n // refresh the cache.\n const p = this.#backgroundFetch(k, index, options, context as FC)\n const hasStale = p.__staleWhileFetching !== undefined\n const staleVal = hasStale && allowStale\n if (status) {\n status.fetch = isStale ? 'stale' : 'refresh'\n if (staleVal && isStale) status.returnedStale = true\n }\n return staleVal ? p.__staleWhileFetching : (p.__returned = p)\n }\n }\n\n /**\n * In some cases, `cache.fetch()` may resolve to `undefined`, either because\n * a {@link LRUCache.OptionsBase#fetchMethod} was not provided (turning\n * `cache.fetch(k)` into just an async wrapper around `cache.get(k)`) or\n * because `ignoreFetchAbort` was specified (either to the constructor or\n * in the {@link LRUCache.FetchOptions}). Also, the\n * {@link LRUCache.OptionsBase.fetchMethod} may return `undefined` or `void`, making\n * the test even more complicated.\n *\n * Because inferring the cases where `undefined` might be returned are so\n * cumbersome, but testing for `undefined` can also be annoying, this method\n * can be used, which will reject if `this.fetch()` resolves to undefined.\n */\n forceFetch(\n k: K,\n fetchOptions: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext,\n ): Promise\n // this overload not allowed if context is required\n forceFetch(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n fetchOptions?: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : never,\n ): Promise\n forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const ths = tracing.hasSubscribers\n const { status = hasSubscribers() ? {} : undefined } = fetchOptions\n fetchOptions.status = status\n if (status && fetchOptions.context) {\n status.context = fetchOptions.context\n }\n const p = this.#forceFetch(k, fetchOptions)\n if (status && ths) {\n status.trace = true\n tracing.tracePromise(() => p, status).catch(() => {})\n }\n return p\n }\n\n async #forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ) {\n const v = await this.#fetch(k, fetchOptions)\n if (v === undefined) throw new Error('fetch() returned undefined')\n return v\n }\n\n /**\n * If the key is found in the cache, then this is equivalent to\n * {@link LRUCache#get}. If not, in the cache, then calculate the value using\n * the {@link LRUCache.OptionsBase.memoMethod}, and add it to the cache.\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the LRUCache constructor, then all calls to `cache.memo()`\n * _must_ provide a `context` option. If set to `undefined` or `void`, then\n * calls to memo _must not_ provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that might be\n * relevant in the course of fetching the data. It is only relevant for the\n * course of a single `memo()` operation, and discarded afterwards.\n */\n memo(\n k: K,\n memoOptions: unknown extends FC ? LRUCache.MemoOptions\n : FC extends undefined | void ? LRUCache.MemoOptionsNoContext\n : LRUCache.MemoOptionsWithContext,\n ): V\n // this overload not allowed if context is required\n memo(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n memoOptions?: unknown extends FC ? LRUCache.MemoOptions\n : FC extends undefined | void ? LRUCache.MemoOptionsNoContext\n : never,\n ): V\n memo(k: K, memoOptions: LRUCache.MemoOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } =\n memoOptions\n memoOptions.status = status\n if (status) {\n status.op = 'memo'\n status.key = k\n if (memoOptions.context) {\n status.context = memoOptions.context\n }\n status.cache = this\n }\n const result = this.#memo(k, memoOptions)\n if (status) status.value = result\n if (metrics.hasSubscribers) metrics.publish(status)\n return result\n }\n #memo(k: K, memoOptions: LRUCache.MemoOptions = {}) {\n const memoMethod = this.#memoMethod\n if (!memoMethod) {\n throw new Error('no memoMethod provided to constructor')\n }\n const { context, status, forceRefresh, ...options } = memoOptions\n if (status && forceRefresh) status.forceRefresh = true\n const v = this.#get(k, options)\n const refresh = forceRefresh || v === undefined\n if (status) {\n status.memo = refresh ? 'miss' : 'hit'\n if (!refresh) status.value = v\n }\n if (!refresh) return v\n const vv = memoMethod(k, v, {\n options,\n context,\n } as LRUCache.MemoizerOptions)\n if (status) status.value = vv\n this.#set(k, vv, options)\n return vv\n }\n\n /**\n * Return a value from the cache. Will update the recency of the cache\n * entry found.\n *\n * If the key is not found, get() will return `undefined`.\n */\n get(k: K, getOptions: LRUCache.GetOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } = getOptions\n getOptions.status = status\n if (status) {\n status.op = 'get'\n status.key = k\n status.cache = this\n }\n const result = this.#get(k, getOptions)\n if (status) {\n if (result !== undefined) status.value = result\n if (metrics.hasSubscribers) metrics.publish(status)\n }\n return result\n }\n\n #get(k: K, getOptions: LRUCache.GetOptions = {}) {\n const {\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n status,\n } = getOptions\n const index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.get = 'miss'\n return undefined\n }\n const value = this.#valList[index]\n const fetching = this.#isBackgroundFetch(value)\n if (status) this.#statusTTL(status, index)\n if (this.#isStale(index)) {\n // delete only if not an in-flight background fetch\n if (!fetching) {\n if (!noDeleteOnStaleGet) {\n this.#delete(k, 'expire')\n }\n if (status) status.get = 'stale'\n if (allowStale) {\n if (status) status.returnedStale = true\n return value\n }\n return undefined\n }\n if (status) status.get = 'stale-fetching'\n if (allowStale && value.__staleWhileFetching !== undefined) {\n if (status) status.returnedStale = true\n return value.__staleWhileFetching\n }\n return undefined\n }\n // not stale\n if (status) status.get = fetching ? 'fetching' : 'hit'\n // if we're currently fetching it, we don't actually have it yet\n // it's not stale, which means this isn't a staleWhileRefetching.\n // If it's not stale, and fetching, AND has a __staleWhileFetching\n // value, then that means the user fetched with {forceRefresh:true},\n // so it's safe to return that value.\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n return fetching ? value.__staleWhileFetching : value\n }\n\n #connect(p: Index, n: Index) {\n this.#prev[n] = p\n this.#next[p] = n\n }\n\n #moveToTail(index: Index): void {\n // if tail already, nothing to do\n // if head, move head to next[index]\n // else\n // move next[prev[index]] to next[index] (head has no prev)\n // move prev[next[index]] to prev[index]\n // prev[index] = tail\n // next[tail] = index\n // tail = index\n if (index !== this.#tail) {\n if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n this.#connect(\n this.#prev[index] as Index,\n this.#next[index] as Index,\n )\n }\n this.#connect(this.#tail, index)\n this.#tail = index\n }\n }\n\n /**\n * Deletes a key out of the cache.\n *\n * Returns true if the key was deleted, false otherwise.\n */\n delete(k: K) {\n return this.#delete(k, 'delete')\n }\n\n #delete(k: K, reason: LRUCache.DisposeReason) {\n if (metrics.hasSubscribers) {\n metrics.publish({\n op: 'delete',\n delete: reason,\n key: k,\n cache: this,\n })\n }\n let deleted = false\n if (this.#size !== 0) {\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n if (this.#autopurgeTimers?.[index]) {\n clearTimeout(this.#autopurgeTimers?.[index])\n this.#autopurgeTimers[index] = undefined\n }\n deleted = true\n if (this.#size === 1) {\n this.#clear(reason)\n } else {\n this.#removeItemSize(index)\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k, reason])\n }\n }\n this.#keyMap.delete(k)\n this.#keyList[index] = undefined\n this.#valList[index] = undefined\n if (index === this.#tail) {\n this.#tail = this.#prev[index] as Index\n } else if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n const pi = this.#prev[index] as number\n this.#next[pi] = this.#next[index] as number\n const ni = this.#next[index] as number\n this.#prev[ni] = this.#prev[index] as number\n }\n this.#size--\n this.#free.push(index)\n }\n }\n }\n if (this.#hasDisposeAfter && this.#disposed?.length) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return deleted\n }\n\n /**\n * Clear the cache entirely, throwing away all values.\n */\n clear() {\n return this.#clear('delete')\n }\n #clear(reason: LRUCache.DisposeReason) {\n for (const index of this.#rindexes({ allowStale: true })) {\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else {\n const k = this.#keyList[index]\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k as K, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k as K, reason])\n }\n }\n }\n\n this.#keyMap.clear()\n void this.#valList.fill(undefined)\n this.#keyList.fill(undefined)\n if (this.#ttls && this.#starts) {\n this.#ttls.fill(0)\n this.#starts.fill(0)\n for (const t of this.#autopurgeTimers ?? []) {\n if (t !== undefined) clearTimeout(t)\n }\n this.#autopurgeTimers?.fill(undefined)\n }\n if (this.#sizes) {\n this.#sizes.fill(0)\n }\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free.length = 0\n this.#calculatedSize = 0\n this.#size = 0\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n}\n"], + "mappings": "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", + "names": ["dummy", "exports", "exports", "diagnostics_channel_js_1", "perf_js_1", "hasSubscribers", "warned", "PROCESS", "emitWarning", "msg", "type", "code", "fn", "shouldWarn", "isPosInt", "n", "getUintArray", "max", "ZeroArray", "size", "Stack", "_Stack", "#constructing", "HeapCls", "s", "LRUCache", "_LRUCache", "#max", "#maxSize", "#dispose", "#onInsert", "#disposeAfter", "#fetchMethod", "#memoMethod", "#perf", "#size", "#calculatedSize", "#keyMap", "#keyList", "#valList", "#next", "#prev", "#head", "#tail", "#free", "#disposed", "#sizes", "#starts", "#ttls", "#autopurgeTimers", "#hasDispose", "#hasFetchMethod", "#hasDisposeAfter", "#hasOnInsert", "c", "p", "#isBackgroundFetch", "k", "index", "options", "context", "#backgroundFetch", "#moveToTail", "#indexes", "#rindexes", "#isStale", "ttl", "ttlResolution", "ttlAutopurge", "updateAgeOnGet", "updateAgeOnHas", "allowStale", "dispose", "onInsert", "disposeAfter", "noDisposeOnSet", "noUpdateTTL", "maxSize", "maxEntrySize", "sizeCalculation", "fetchMethod", "memoMethod", "noDeleteOnFetchRejection", "noDeleteOnStaleGet", "allowStaleOnFetchRejection", "allowStaleOnFetchAbort", "ignoreFetchAbort", "backgroundFetchSize", "perf", "perf_js_1", "UintArray", "#initializeSizeTracking", "#initializeTTLTracking", "code", "shouldWarn", "warned", "emitWarning", "key", "ttls", "starts", "purgeTimers", "#setItemTTL", "start", "setPurgetTimer", "#updateItemAge", "t", "#delete", "#statusTTL", "status", "cachedNow", "getNow", "age", "sizes", "#removeItemSize", "#requireSize", "v", "#addItemSize", "#evict", "_i", "_s", "_st", "_k", "_v", "i", "#isValidIndex", "fn", "getOptions", "value", "#get", "thisp", "deleted", "entry", "remain", "arr", "#set", "setOptions", "diagnostics_channel_js_1", "result", "bf", "isBF", "oldVal", "oldValue", "setType", "dt", "task", "val", "free", "head", "hasOptions", "#has", "peekOptions", "hasSubscribers", "#peek", "ac", "signal", "fetchOpts", "cb", "updateCache", "aborted", "ignoreAbort", "proceed", "fetchFail", "vl", "eb", "er", "allowStaleAborted", "noDelete", "pcall", "res", "rej", "fmp", "b", "fetchOptions", "ths", "#fetch", "forceRefresh", "stale", "isStale", "staleVal", "#forceFetch", "memoOptions", "#memo", "refresh", "vv", "fetching", "#connect", "reason", "#clear", "pi", "ni"] +} diff --git a/node_modules/lru-cache/dist/commonjs/browser/perf.d.ts b/node_modules/lru-cache/dist/commonjs/browser/perf.d.ts new file mode 100644 index 00000000..15a4a627 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/browser/perf.d.ts @@ -0,0 +1,12 @@ +/** + * this provides the default Perf object source, either the + * `performance` global, or the `Date` constructor. + * + * it can be passed in via configuration to override it + * for a single LRU object. + */ +export type Perf = { + now: () => number; +}; +export declare const defaultPerf: Perf; +//# sourceMappingURL=perf.d.ts.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/browser/perf.d.ts.map b/node_modules/lru-cache/dist/commonjs/browser/perf.d.ts.map new file mode 100644 index 00000000..3e239ce9 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/browser/perf.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"perf.d.ts","sourceRoot":"","sources":["../../../src/perf.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,IAAI,GAAG;IAAE,GAAG,EAAE,MAAM,MAAM,CAAA;CAAE,CAAA;AACxC,eAAO,MAAM,WAAW,EAAE,IAQG,CAAA"} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/browser/perf.js b/node_modules/lru-cache/dist/commonjs/browser/perf.js new file mode 100644 index 00000000..bd4c80f4 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/browser/perf.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.defaultPerf = void 0; +exports.defaultPerf = (typeof performance === 'object' && + performance && + typeof performance.now === 'function') ? + /* c8 ignore start - this gets covered, but c8 gets confused */ + performance + : /* c8 ignore stop */ Date; +//# sourceMappingURL=perf.js.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/browser/perf.js.map b/node_modules/lru-cache/dist/commonjs/browser/perf.js.map new file mode 100644 index 00000000..a193c90f --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/browser/perf.js.map @@ -0,0 +1 @@ +{"version":3,"file":"perf.js","sourceRoot":"","sources":["../../../src/perf.ts"],"names":[],"mappings":";;;AAQa,QAAA,WAAW,GACtB,CACE,OAAO,WAAW,KAAK,QAAQ;IAC/B,WAAW;IACX,OAAO,WAAW,CAAC,GAAG,KAAK,UAAU,CACtC,CAAC,CAAC;IACD,+DAA+D;IAC/D,WAAW;IACb,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAA","sourcesContent":["/**\n * this provides the default Perf object source, either the\n * `performance` global, or the `Date` constructor.\n *\n * it can be passed in via configuration to override it\n * for a single LRU object.\n */\nexport type Perf = { now: () => number }\nexport const defaultPerf: Perf =\n (\n typeof performance === 'object' &&\n performance &&\n typeof performance.now === 'function'\n ) ?\n /* c8 ignore start - this gets covered, but c8 gets confused */\n performance\n : /* c8 ignore stop */ Date\n"]} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/diagnostics-channel-cjs.cjs.map b/node_modules/lru-cache/dist/commonjs/diagnostics-channel-cjs.cjs.map new file mode 100644 index 00000000..abdcb32e --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/diagnostics-channel-cjs.cjs.map @@ -0,0 +1 @@ +{"version":3,"file":"diagnostics-channel-cjs.cjs","sourceRoot":"","sources":["../../src/diagnostics-channel-cjs.cts"],"names":[],"mappings":";;;AAQA,MAAM,KAAK,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,CAAA;AAC1B,QAAA,OAAO,GAAG,KAAyB,CAAA;AACnC,QAAA,OAAO,GAAG,KAAgC,CAAA","sourcesContent":["// this is used in CJS environments that do NOT follow the 'node' import\n// condition, to avoid even trying to load node:diagnostics_channel\nimport {\n type Channel,\n type TracingChannel,\n} from 'node:diagnostics_channel'\nexport type { TracingChannel, Channel }\n\nconst dummy = { hasSubscribers: false }\nexport const metrics = dummy as Channel\nexport const tracing = dummy as TracingChannel\n"]} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/diagnostics-channel-cjs.d.cts.map b/node_modules/lru-cache/dist/commonjs/diagnostics-channel-cjs.d.cts.map new file mode 100644 index 00000000..7cfc73f1 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/diagnostics-channel-cjs.d.cts.map @@ -0,0 +1 @@ +{"version":3,"file":"diagnostics-channel-cjs.d.cts","sourceRoot":"","sources":["../../src/diagnostics-channel-cjs.cts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,cAAc,EACpB,MAAM,0BAA0B,CAAA;AACjC,YAAY,EAAE,cAAc,EAAE,OAAO,EAAE,CAAA;AAGvC,eAAO,MAAM,OAAO,EAAY,OAAO,CAAC,OAAO,CAAC,CAAA;AAChD,eAAO,MAAM,OAAO,EAAY,cAAc,CAAC,OAAO,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/diagnostics-channel.d.ts b/node_modules/lru-cache/dist/commonjs/diagnostics-channel.d.ts new file mode 100644 index 00000000..6cf41c4f --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/diagnostics-channel.d.ts @@ -0,0 +1,5 @@ +import { type Channel, type TracingChannel } from 'node:diagnostics_channel'; +export type { TracingChannel, Channel }; +export declare const metrics: Channel; +export declare const tracing: TracingChannel; +//# sourceMappingURL=diagnostics-channel-cjs.d.cts.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/diagnostics-channel.js b/node_modules/lru-cache/dist/commonjs/diagnostics-channel.js new file mode 100644 index 00000000..bdd4f41f --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/diagnostics-channel.js @@ -0,0 +1,7 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.tracing = exports.metrics = void 0; +const dummy = { hasSubscribers: false }; +exports.metrics = dummy; +exports.tracing = dummy; +//# sourceMappingURL=diagnostics-channel-cjs.cjs.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/index.d.ts b/node_modules/lru-cache/dist/commonjs/index.d.ts new file mode 100644 index 00000000..b0e4b964 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/index.d.ts @@ -0,0 +1,1400 @@ +/** + * @module LRUCache + */ +import type { Perf } from './perf.js'; +export type { Perf } from './perf.js'; +declare const TYPE: unique symbol; +export type PosInt = number & { + [TYPE]: 'Positive Integer'; +}; +export type Index = number & { + [TYPE]: 'LRUCache Index'; +}; +export type UintArray = Uint8Array | Uint16Array | Uint32Array; +export type NumberArray = UintArray | number[]; +declare class ZeroArray extends Array { + constructor(size: number); +} +export type { ZeroArray }; +export type { Stack }; +export type StackLike = Stack | Index[]; +declare class Stack { + #private; + heap: NumberArray; + length: number; + static create(max: number): StackLike; + constructor(max: number, HeapCls: { + new (n: number): NumberArray; + }); + push(n: Index): void; + pop(): Index; +} +/** + * Promise representing an in-progress {@link LRUCache#fetch} call + */ +export type BackgroundFetch = Promise & { + __returned: BackgroundFetch | undefined; + __abortController: AbortController; + __staleWhileFetching: V | undefined; +}; +export type DisposeTask = [ + value: V, + key: K, + reason: LRUCache.DisposeReason +]; +export declare namespace LRUCache { + /** + * An integer greater than 0, reflecting the calculated size of items + */ + type Size = number; + /** + * Integer greater than 0, representing some number of milliseconds, or the + * time at which a TTL started counting from. + */ + type Milliseconds = number; + /** + * An integer greater than 0, reflecting a number of items + */ + type Count = number; + /** + * The reason why an item was removed from the cache, passed + * to the {@link Disposer} methods. + * + * - `evict`: The item was evicted because it is the least recently used, + * and the cache is full. + * - `set`: A new value was set, overwriting the old value being disposed. + * - `delete`: The item was explicitly deleted, either by calling + * {@link LRUCache#delete}, {@link LRUCache#clear}, or + * {@link LRUCache#set} with an undefined value. + * - `expire`: The item was removed due to exceeding its TTL. + * - `fetch`: A {@link OptionsBase#fetchMethod} operation returned + * `undefined` or was aborted, causing the item to be deleted. + */ + type DisposeReason = 'evict' | 'set' | 'delete' | 'expire' | 'fetch'; + /** + * A method called upon item removal, passed as the + * {@link OptionsBase.dispose} and/or + * {@link OptionsBase.disposeAfter} options. + */ + type Disposer = (value: V, key: K, reason: DisposeReason) => void; + /** + * The reason why an item was added to the cache, passed + * to the {@link Inserter} methods. + * + * - `add`: the item was not found in the cache, and was added + * - `update`: the item was in the cache, with the same value provided + * - `replace`: the item was in the cache, and replaced + */ + type InsertReason = 'add' | 'update' | 'replace'; + /** + * A method called upon item insertion, passed as the + * {@link OptionsBase.insert} + */ + type Inserter = (value: V, key: K, reason: InsertReason) => void; + /** + * A function that returns the effective calculated size + * of an entry in the cache. + */ + type SizeCalculator = (value: V, key: K) => Size; + /** + * Options provided to the + * {@link OptionsBase.fetchMethod} function. + */ + interface FetcherOptions { + signal: AbortSignal; + options: FetcherFetchOptions; + /** + * Object provided in the {@link FetchOptions.context} option to + * {@link LRUCache#fetch} + */ + context: FC; + } + /** + * Occasionally, it may be useful to track the internal behavior of the + * cache, particularly for logging, debugging, or for behavior within the + * `fetchMethod`. To do this, you can pass a `status` object to the + * {@link LRUCache#fetch}, {@link LRUCache#get}, {@link LRUCache#set}, + * {@link LRUCache#memo}, and {@link LRUCache#has} methods. + * + * The `status` option should be a plain JavaScript object. The following + * fields will be set on it appropriately, depending on the situation. + * + * These objects are also the context objects passed to listeners on the + * `lru-cache:metrics` diagnostic channel, and the `lru-cache` tracing + * channels, in platforms that support them. + */ + interface Status { + /** + * The operation being performed + */ + op?: 'get' | 'set' | 'memo' | 'fetch' | 'delete' | 'has' | 'peek'; + /** + * The status of a set() operation. + * + * - add: the item was not found in the cache, and was added + * - update: the item was in the cache, with the same value provided + * - replace: the item was in the cache, and replaced + * - miss: the item was not added to the cache for some reason + */ + set?: 'add' | 'update' | 'replace' | 'miss' | 'deleted'; + /** + * The status of a delete() operation. + */ + delete?: LRUCache.DisposeReason; + /** + * The result of a peek() operation + * + * - hit: the item was found and returned + * - stale: the item is in the cache, but past its ttl and not returned + * - miss: item not in the cache + */ + peek?: 'hit' | 'miss' | 'stale'; + /** + * The status of a memo() operation. + * + * - 'hit': the item was found in the cache and returned + * - 'miss': the `memoMethod` function was called + */ + memo?: 'hit' | 'miss'; + /** + * The `context` option provided to a memo or fetch operation + * + * In practice, of course, this will be the same type as the `FC` + * fetch context param used to instantiate the LRUCache, but the + * convolutions of threading that through would get quite complicated, + * and preclude forcing/forbidding the passing of a `context` param + * where it is/isn't expected, which is more valuable for error + * prevention. + */ + context?: unknown; + /** + * the ttl stored for the item, or undefined if ttls are not used. + */ + ttl?: Milliseconds; + /** + * the start time for the item, or undefined if ttls are not used. + */ + start?: Milliseconds; + /** + * The timestamp used for TTL calculation + */ + now?: Milliseconds; + /** + * the remaining ttl for the item, or undefined if ttls are not used. + */ + remainingTTL?: Milliseconds; + /** + * The calculated size for the item, if sizes are used. + */ + entrySize?: Size; + /** + * The total calculated size of the cache, if sizes are used. + */ + totalCalculatedSize?: Size; + /** + * A flag indicating that the item was not stored, due to exceeding the + * {@link OptionsBase.maxEntrySize} + */ + maxEntrySizeExceeded?: true; + /** + * The key that was set or retrieved + */ + key?: K; + /** + * The value that was set + */ + value?: V; + /** + * The old value, specified in the case of `set:'replace'` + */ + oldValue?: V; + /** + * The results of a {@link LRUCache#has} operation + * + * - hit: the item was found in the cache + * - stale: the item was found in the cache, but is stale + * - miss: the item was not found in the cache + */ + has?: 'hit' | 'stale' | 'miss'; + /** + * The status of a {@link LRUCache#fetch} operation. + * Note that this can change as the underlying fetch() moves through + * various states. + * + * - inflight: there is another fetch() for this key which is in process + * - get: there is no {@link OptionsBase.fetchMethod}, so + * {@link LRUCache#get} was called. + * - miss: the item is not in cache, and will be fetched. + * - hit: the item is in the cache, and was resolved immediately. + * - stale: the item is in the cache, but stale. + * - refresh: the item is in the cache, and not stale, but + * {@link FetchOptions.forceRefresh} was specified. + */ + fetch?: 'get' | 'inflight' | 'miss' | 'hit' | 'stale' | 'refresh'; + /** + * `forceRefresh` option was used for either a fetch or memo operation + */ + forceRefresh?: boolean; + /** + * The {@link OptionsBase.fetchMethod} was called + */ + fetchDispatched?: true; + /** + * The cached value was updated after a successful call to + * {@link OptionsBase.fetchMethod} + */ + fetchUpdated?: true; + /** + * The reason for a fetch() rejection. Either the error raised by the + * {@link OptionsBase.fetchMethod}, or the reason for an + * AbortSignal. + */ + fetchError?: Error; + /** + * The fetch received an abort signal + */ + fetchAborted?: true; + /** + * The abort signal received was ignored, and the fetch was allowed to + * continue in the background. + */ + fetchAbortIgnored?: true; + /** + * The fetchMethod promise resolved successfully + */ + fetchResolved?: true; + /** + * The fetchMethod promise was rejected + */ + fetchRejected?: true; + /** + * The status of a {@link LRUCache#get} operation. + * + * - fetching: The item is currently being fetched. If a previous value + * is present and allowed, that will be returned. + * - stale: The item is in the cache, and is stale. If it was returned, + * then the `returnedStale` flag will be set. + * - stale-fetching: The value is being fetched in the background, but is + * currently stale. If the stale value was returned, then the + * `returnedStale` flag will be set. + * - hit: the item is in the cache + * - miss: the item is not in the cache + */ + get?: 'stale' | 'hit' | 'miss' | 'fetching' | 'stale-fetching'; + /** + * A fetch or get operation returned a stale value. + */ + returnedStale?: true; + /** + * A tracingChannel trace was started for this operation + */ + trace?: boolean; + /** + * A reference to the cache instance associated with this operation + */ + cache?: LRUCache; + } + /** + * options which override the options set in the LRUCache constructor + * when calling {@link LRUCache#fetch}. + * + * This is the union of {@link GetOptions} and {@link SetOptions}, plus + * {@link OptionsBase.noDeleteOnFetchRejection}, + * {@link OptionsBase.allowStaleOnFetchRejection}, + * {@link FetchOptions.forceRefresh}, and + * {@link FetcherOptions.context} + * + * Any of these may be modified in the {@link OptionsBase.fetchMethod} + * function, but the {@link GetOptions} fields will of course have no + * effect, as the {@link LRUCache#get} call already happened by the time + * the fetchMethod is called. + */ + interface FetcherFetchOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet' | 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL' | 'noDeleteOnFetchRejection' | 'allowStaleOnFetchRejection' | 'ignoreFetchAbort' | 'allowStaleOnFetchAbort'> { + status?: Status; + size?: Size; + } + /** + * Options that may be passed to the {@link LRUCache#fetch} method. + */ + interface FetchOptions extends FetcherFetchOptions { + /** + * Set to true to force a re-load of the existing data, even if it + * is not yet stale. + */ + forceRefresh?: boolean; + /** + * Context provided to the {@link OptionsBase.fetchMethod} as + * the {@link FetcherOptions.context} param. + * + * If the FC type is specified as unknown (the default), + * undefined or void, then this is optional. Otherwise, it will + * be required. + */ + context?: FC; + signal?: AbortSignal; + status?: Status; + } + /** + * Options provided to {@link LRUCache#fetch} when the FC type is something + * other than `unknown`, `undefined`, or `void` + */ + interface FetchOptionsWithContext extends FetchOptions { + context: FC; + } + /** + * Options provided to {@link LRUCache#fetch} when the FC type is + * `undefined` or `void` + */ + interface FetchOptionsNoContext extends FetchOptions { + context?: FC; + } + interface MemoOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet' | 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL' | 'noDeleteOnFetchRejection' | 'allowStaleOnFetchRejection' | 'ignoreFetchAbort' | 'allowStaleOnFetchAbort'> { + /** + * Set to true to force a re-load of the existing data, even if it + * is not yet stale. + */ + forceRefresh?: boolean; + /** + * Context provided to the {@link OptionsBase.memoMethod} as + * the {@link MemoizerOptions.context} param. + * + * If the FC type is specified as unknown (the default), + * undefined or void, then this is optional. Otherwise, it will + * be required. + */ + context?: FC; + status?: Status; + } + /** + * Options provided to {@link LRUCache#memo} when the FC type is something + * other than `unknown`, `undefined`, or `void` + */ + interface MemoOptionsWithContext extends MemoOptions { + context: FC; + } + /** + * Options provided to {@link LRUCache#memo} when the FC type is + * `undefined` or `void` + */ + interface MemoOptionsNoContext extends MemoOptions { + context?: FC; + } + /** + * Options provided to the + * {@link OptionsBase.memoMethod} function. + */ + interface MemoizerOptions { + options: MemoizerMemoOptions; + /** + * Object provided in the {@link MemoOptions.context} option to + * {@link LRUCache#memo} + */ + context: FC; + } + /** + * options which override the options set in the LRUCache constructor + * when calling {@link LRUCache#memo}. + * + * This is the union of {@link GetOptions} and {@link SetOptions}, plus + * {@link MemoOptions.forceRefresh}, and + * {@link MemoOptions.context} + * + * Any of these may be modified in the {@link OptionsBase.memoMethod} + * function, but the {@link GetOptions} fields will of course have no + * effect, as the {@link LRUCache#get} call already happened by the time + * the memoMethod is called. + */ + interface MemoizerMemoOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet' | 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'> { + status?: Status; + size?: Size; + start?: Milliseconds; + } + /** + * Options that may be passed to the {@link LRUCache#has} method. + */ + interface HasOptions extends Pick, 'updateAgeOnHas'> { + status?: Status; + } + /** + * Options that may be passed to the {@link LRUCache#get} method. + */ + interface GetOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet'> { + status?: Status; + } + /** + * Options that may be passed to the {@link LRUCache#peek} method. + */ + interface PeekOptions extends Pick, 'allowStale'> { + status?: Status; + } + /** + * Options that may be passed to the {@link LRUCache#set} method. + */ + interface SetOptions extends Pick, 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'> { + /** + * If size tracking is enabled, then setting an explicit size + * in the {@link LRUCache#set} call will prevent calling the + * {@link OptionsBase.sizeCalculation} function. + */ + size?: Size; + /** + * If TTL tracking is enabled, then setting an explicit start + * time in the {@link LRUCache#set} call will override the + * default time from `performance.now()` or `Date.now()`. + * + * Note that it must be a valid value for whichever time-tracking + * method is in use. + */ + start?: Milliseconds; + status?: Status; + } + /** + * The type signature for the {@link OptionsBase.fetchMethod} option. + */ + type Fetcher = (key: K, staleValue: V | undefined, options: FetcherOptions) => Promise | V | undefined | void; + /** + * the type signature for the {@link OptionsBase.memoMethod} option. + */ + type Memoizer = (key: K, staleValue: V | undefined, options: MemoizerOptions) => V; + /** + * Options which may be passed to the {@link LRUCache} constructor. + * + * Most of these may be overridden in the various options that use + * them. + * + * Despite all being technically optional, the constructor requires that + * a cache is at minimum limited by one or more of {@link OptionsBase.max}, + * {@link OptionsBase.ttl}, or {@link OptionsBase.maxSize}. + * + * If {@link OptionsBase.ttl} is used alone, then it is strongly advised + * (and in fact required by the type definitions here) that the cache + * also set {@link OptionsBase.ttlAutopurge}, to prevent potentially + * unbounded storage. + * + * All options are also available on the {@link LRUCache} instance, making + * it safe to pass an LRUCache instance as the options argumemnt to + * make another empty cache of the same type. + * + * Some options are marked as read-only, because changing them after + * instantiation is not safe. Changing any of the other options will of + * course only have an effect on subsequent method calls. + */ + interface OptionsBase { + /** + * The maximum number of items to store in the cache before evicting + * old entries. This is read-only on the {@link LRUCache} instance, + * and may not be overridden. + * + * If set, then storage space will be pre-allocated at construction + * time, and the cache will perform significantly faster. + * + * Note that significantly fewer items may be stored, if + * {@link OptionsBase.maxSize} and/or {@link OptionsBase.ttl} are also + * set. + * + * **It is strongly recommended to set a `max` to prevent unbounded growth + * of the cache.** + */ + max?: Count; + /** + * Max time in milliseconds for items to live in cache before they are + * considered stale. Note that stale items are NOT preemptively removed by + * default, and MAY live in the cache, contributing to its LRU max, long + * after they have expired, unless {@link OptionsBase.ttlAutopurge} is + * set. + * + * If set to `0` (the default value), then that means "do not track + * TTL", not "expire immediately". + * + * Also, as this cache is optimized for LRU/MRU operations, some of + * the staleness/TTL checks will reduce performance, as they will incur + * overhead by deleting items. + * + * This is not primarily a TTL cache, and does not make strong TTL + * guarantees. There is no pre-emptive pruning of expired items, but you + * _may_ set a TTL on the cache, and it will treat expired items as missing + * when they are fetched, and delete them. + * + * Optional, but must be a non-negative integer in ms if specified. + * + * This may be overridden by passing an options object to `cache.set()`. + * + * At least one of `max`, `maxSize`, or `TTL` is required. This must be a + * positive integer if set. + * + * Even if ttl tracking is enabled, **it is strongly recommended to set a + * `max` to prevent unbounded growth of the cache.** + * + * If ttl tracking is enabled, and `max` and `maxSize` are not set, + * and `ttlAutopurge` is not set, then a warning will be emitted + * cautioning about the potential for unbounded memory consumption. + * (The TypeScript definitions will also discourage this.) + */ + ttl?: Milliseconds; + /** + * Minimum amount of time in ms in which to check for staleness. + * Defaults to 1, which means that the current time is checked + * at most once per millisecond. + * + * Set to 0 to check the current time every time staleness is tested. + * (This reduces performance, and is theoretically unnecessary.) + * + * Setting this to a higher value will improve performance somewhat + * while using ttl tracking, albeit at the expense of keeping stale + * items around a bit longer than their TTLs would indicate. + * + * @default 1 + */ + ttlResolution?: Milliseconds; + /** + * Preemptively remove stale items from the cache. + * + * Note that this may *significantly* degrade performance, especially if + * the cache is storing a large number of items. It is almost always best + * to just leave the stale items in the cache, and let them fall out as new + * items are added. + * + * Note that this means that {@link OptionsBase.allowStale} is a bit + * pointless, as stale items will be deleted almost as soon as they + * expire. + * + * Use with caution! + */ + ttlAutopurge?: boolean; + /** + * When using time-expiring entries with `ttl`, setting this to `true` will + * make each item's age reset to 0 whenever it is retrieved from cache with + * {@link LRUCache#get}, causing it to not expire. (It can still fall out + * of cache based on recency of use, of course.) + * + * Has no effect if {@link OptionsBase.ttl} is not set. + * + * This may be overridden by passing an options object to `cache.get()`. + */ + updateAgeOnGet?: boolean; + /** + * When using time-expiring entries with `ttl`, setting this to `true` will + * make each item's age reset to 0 whenever its presence in the cache is + * checked with {@link LRUCache#has}, causing it to not expire. (It can + * still fall out of cache based on recency of use, of course.) + * + * Has no effect if {@link OptionsBase.ttl} is not set. + */ + updateAgeOnHas?: boolean; + /** + * Allow {@link LRUCache#get} and {@link LRUCache#fetch} calls to return + * stale data, if available. + * + * By default, if you set `ttl`, stale items will only be deleted from the + * cache when you `get(key)`. That is, it's not preemptively pruning items, + * unless {@link OptionsBase.ttlAutopurge} is set. + * + * If you set `allowStale:true`, it'll return the stale value *as well as* + * deleting it. If you don't set this, then it'll return `undefined` when + * you try to get a stale entry. + * + * Note that when a stale entry is fetched, _even if it is returned due to + * `allowStale` being set_, it is removed from the cache immediately. You + * can suppress this behavior by setting + * {@link OptionsBase.noDeleteOnStaleGet}, either in the constructor, or in + * the options provided to {@link LRUCache#get}. + * + * This may be overridden by passing an options object to `cache.get()`. + * The `cache.has()` method will always return `false` for stale items. + * + * Only relevant if a ttl is set. + */ + allowStale?: boolean; + /** + * Function that is called on items when they are dropped from the + * cache, as `dispose(value, key, reason)`. + * + * This can be handy if you want to close file descriptors or do + * other cleanup tasks when items are no longer stored in the cache. + * + * **NOTE**: It is called _before_ the item has been fully removed + * from the cache, so if you want to put it right back in, you need + * to wait until the next tick. If you try to add it back in during + * the `dispose()` function call, it will break things in subtle and + * weird ways. + * + * Unlike several other options, this may _not_ be overridden by + * passing an option to `set()`, for performance reasons. + * + * The `reason` will be one of the following strings, corresponding + * to the reason for the item's deletion: + * + * - `evict` Item was evicted to make space for a new addition + * - `set` Item was overwritten by a new value + * - `expire` Item expired its TTL + * - `fetch` Item was deleted due to a failed or aborted fetch, or a + * fetchMethod returning `undefined. + * - `delete` Item was removed by explicit `cache.delete(key)`, + * `cache.clear()`, or `cache.set(key, undefined)`. + */ + dispose?: Disposer; + /** + * Function that is called when new items are inserted into the cache, + * as `onInsert(value, key, reason)`. + * + * This can be useful if you need to perform actions when an item is + * added, such as logging or tracking insertions. + * + * Unlike some other options, this may _not_ be overridden by passing + * an option to `set()`, for performance and consistency reasons. + */ + onInsert?: Inserter; + /** + * The same as {@link OptionsBase.dispose}, but called *after* the entry + * is completely removed and the cache is once again in a clean state. + * + * It is safe to add an item right back into the cache at this point. + * However, note that it is *very* easy to inadvertently create infinite + * recursion this way. + */ + disposeAfter?: Disposer; + /** + * Set to true to suppress calling the + * {@link OptionsBase.dispose} function if the entry key is + * still accessible within the cache. + * + * This may be overridden by passing an options object to + * {@link LRUCache#set}. + * + * Only relevant if `dispose` or `disposeAfter` are set. + */ + noDisposeOnSet?: boolean; + /** + * Boolean flag to tell the cache to not update the TTL when setting a new + * value for an existing key (ie, when updating a value rather than + * inserting a new value). Note that the TTL value is _always_ set (if + * provided) when adding a new entry into the cache. + * + * Has no effect if a {@link OptionsBase.ttl} is not set. + * + * May be passed as an option to {@link LRUCache#set}. + */ + noUpdateTTL?: boolean; + /** + * Set to a positive integer to track the sizes of items added to the + * cache, and automatically evict items in order to stay below this size. + * Note that this may result in fewer than `max` items being stored. + * + * Attempting to add an item to the cache whose calculated size is greater + * that this amount will be a no-op. The item will not be cached, and no + * other items will be evicted. + * + * Optional, must be a positive integer if provided. + * + * Sets `maxEntrySize` to the same value, unless a different value is + * provided for `maxEntrySize`. + * + * At least one of `max`, `maxSize`, or `TTL` is required. This must be a + * positive integer if set. + * + * Even if size tracking is enabled, **it is strongly recommended to set a + * `max` to prevent unbounded growth of the cache.** + * + * Note also that size tracking can negatively impact performance, + * though for most cases, only minimally. + */ + maxSize?: Size; + /** + * The effective size for background fetch promises. + * + * This has no effect unless `maxSize` and `sizeCalculation` are used, + * and a {@link LRUCache.OptionsBase.fetchMethod} is provided to + * support {@link LRUCache#fetch}. + * + * If a stale value is present in the cache, then the effective size of + * the background fetch is the size of the stale item it will eventually + * replace. If not, then this value is used as its effective size. + * + * @default 1 + */ + backgroundFetchSize?: number; + /** + * The maximum allowed size for any single item in the cache. + * + * If a larger item is passed to {@link LRUCache#set} or returned by a + * {@link OptionsBase.fetchMethod} or {@link OptionsBase.memoMethod}, then + * it will not be stored in the cache. + * + * Attempting to add an item whose calculated size is greater than + * this amount will not cache the item or evict any old items, but + * WILL delete an existing value if one is already present. + * + * Optional, must be a positive integer if provided. Defaults to + * the value of `maxSize` if provided. + */ + maxEntrySize?: Size; + /** + * A function that returns a number indicating the item's size. + * + * Requires {@link OptionsBase.maxSize} to be set. + * + * If not provided, and {@link OptionsBase.maxSize} or + * {@link OptionsBase.maxEntrySize} are set, then all + * {@link LRUCache#set} calls **must** provide an explicit + * {@link SetOptions.size} or sizeCalculation param. + */ + sizeCalculation?: SizeCalculator; + /** + * Method that provides the implementation for {@link LRUCache#fetch} + * + * ```ts + * fetchMethod(key, staleValue, { signal, options, context }) + * ``` + * + * If `fetchMethod` is not provided, then `cache.fetch(key)` is equivalent + * to `Promise.resolve(cache.get(key))`. + * + * If at any time, `signal.aborted` is set to `true`, or if the + * `signal.onabort` method is called, or if it emits an `'abort'` event + * which you can listen to with `addEventListener`, then that means that + * the fetch should be abandoned. This may be passed along to async + * functions aware of AbortController/AbortSignal behavior. + * + * The `fetchMethod` should **only** return `undefined` or a Promise + * resolving to `undefined` if the AbortController signaled an `abort` + * event. In all other cases, it should return or resolve to a value + * suitable for adding to the cache. + * + * The `options` object is a union of the options that may be provided to + * `set()` and `get()`. If they are modified, then that will result in + * modifying the settings to `cache.set()` when the value is resolved, and + * in the case of + * {@link OptionsBase.noDeleteOnFetchRejection} and + * {@link OptionsBase.allowStaleOnFetchRejection}, the handling of + * `fetchMethod` failures. + * + * For example, a DNS cache may update the TTL based on the value returned + * from a remote DNS server by changing `options.ttl` in the `fetchMethod`. + */ + fetchMethod?: Fetcher; + /** + * Method that provides the implementation for {@link LRUCache#memo} + */ + memoMethod?: Memoizer; + /** + * Set to true to suppress the deletion of stale data when a + * {@link OptionsBase.fetchMethod} returns a rejected promise. + */ + noDeleteOnFetchRejection?: boolean; + /** + * Do not delete stale items when they are retrieved with + * {@link LRUCache#get}. + * + * Note that the `get` return value will still be `undefined` + * unless {@link OptionsBase.allowStale} is true. + * + * When using time-expiring entries with `ttl`, by default stale + * items will be removed from the cache when the key is accessed + * with `cache.get()`. + * + * Setting this option will cause stale items to remain in the cache, until + * they are explicitly deleted with `cache.delete(key)`, or retrieved with + * `noDeleteOnStaleGet` set to `false`. + * + * This may be overridden by passing an options object to `cache.get()`. + * + * Only relevant if a ttl is used. + */ + noDeleteOnStaleGet?: boolean; + /** + * Set to true to allow returning stale data when a + * {@link OptionsBase.fetchMethod} throws an error or returns a rejected + * promise. + * + * This differs from using {@link OptionsBase.allowStale} in that stale + * data will ONLY be returned in the case that the {@link LRUCache#fetch} + * fails, not any other times. + * + * If a `fetchMethod` fails, and there is no stale value available, the + * `fetch()` will resolve to `undefined`. Ie, all `fetchMethod` errors are + * suppressed. + * + * Implies `noDeleteOnFetchRejection`. + * + * This may be set in calls to `fetch()`, or defaulted on the constructor, + * or overridden by modifying the options object in the `fetchMethod`. + */ + allowStaleOnFetchRejection?: boolean; + /** + * Set to true to return a stale value from the cache when the + * `AbortSignal` passed to the {@link OptionsBase.fetchMethod} dispatches + * an `'abort'` event, whether user-triggered, or due to internal cache + * behavior. + * + * Unless {@link OptionsBase.ignoreFetchAbort} is also set, the underlying + * {@link OptionsBase.fetchMethod} will still be considered canceled, and + * any value it returns will be ignored and not cached. + * + * Caveat: since fetches are aborted when a new value is explicitly + * set in the cache, this can lead to fetch returning a stale value, + * since that was the fallback value _at the moment the `fetch()` was + * initiated_, even though the new updated value is now present in + * the cache. + * + * For example: + * + * ```ts + * const cache = new LRUCache({ + * ttl: 100, + * fetchMethod: async (url, oldValue, { signal }) => { + * const res = await fetch(url, { signal }) + * return await res.json() + * } + * }) + * cache.set('https://example.com/', { some: 'data' }) + * // 100ms go by... + * const result = cache.fetch('https://example.com/') + * cache.set('https://example.com/', { other: 'thing' }) + * console.log(await result) // { some: 'data' } + * console.log(cache.get('https://example.com/')) // { other: 'thing' } + * ``` + */ + allowStaleOnFetchAbort?: boolean; + /** + * Set to true to ignore the `abort` event emitted by the `AbortSignal` + * object passed to {@link OptionsBase.fetchMethod}, and still cache the + * resulting resolution value, as long as it is not `undefined`. + * + * When used on its own, this means aborted {@link LRUCache#fetch} calls + * are not immediately resolved or rejected when they are aborted, and + * instead take the full time to await. + * + * When used with {@link OptionsBase.allowStaleOnFetchAbort}, aborted + * {@link LRUCache#fetch} calls will resolve immediately to their stale + * cached value or `undefined`, and will continue to process and eventually + * update the cache when they resolve, as long as the resulting value is + * not `undefined`, thus supporting a "return stale on timeout while + * refreshing" mechanism by passing `AbortSignal.timeout(n)` as the signal. + * + * For example: + * + * ```ts + * const c = new LRUCache({ + * ttl: 100, + * ignoreFetchAbort: true, + * allowStaleOnFetchAbort: true, + * fetchMethod: async (key, oldValue, { signal }) => { + * // note: do NOT pass the signal to fetch()! + * // let's say this fetch can take a long time. + * const res = await fetch(`https://slow-backend-server/${key}`) + * return await res.json() + * }, + * }) + * + * // this will return the stale value after 100ms, while still + * // updating in the background for next time. + * const val = await c.fetch('key', { signal: AbortSignal.timeout(100) }) + * ``` + * + * **Note**: regardless of this setting, an `abort` event _is still + * emitted on the `AbortSignal` object_, so may result in invalid results + * when passed to other underlying APIs that use AbortSignals. + * + * This may be overridden in the {@link OptionsBase.fetchMethod} or the + * call to {@link LRUCache#fetch}. + */ + ignoreFetchAbort?: boolean; + /** + * In some cases, you may want to swap out the performance/Date object + * used for TTL tracking. This should almost certainly NOT be done in + * production environments! + * + * This value defaults to `global.performance` if it has a `now()` method, + * or the `global.Date` object otherwise. + */ + perf?: Perf; + } + interface OptionsMaxLimit extends OptionsBase { + max: Count; + } + interface OptionsTTLLimit extends OptionsBase { + ttl: Milliseconds; + ttlAutopurge: boolean; + } + interface OptionsSizeLimit extends OptionsBase { + maxSize: Size; + } + /** + * The valid safe options for the {@link LRUCache} constructor + */ + type Options = OptionsMaxLimit | OptionsSizeLimit | OptionsTTLLimit; + /** + * Entry objects used by {@link LRUCache#load} and {@link LRUCache#dump}, + * and returned by {@link LRUCache#info}. + */ + interface Entry { + value: V; + ttl?: Milliseconds; + size?: Size; + start?: Milliseconds; + } +} +/** + * Default export, the thing you're using this module to get. + * + * The `K` and `V` types define the key and value types, respectively. The + * optional `FC` type defines the type of the `context` object passed to + * `cache.fetch()` and `cache.memo()`. + * + * Keys and values **must not** be `null` or `undefined`. + * + * All properties from the options object (with the exception of `max`, + * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are + * added as normal public members. (The listed options are read-only getters.) + * + * Changing any of these will alter the defaults for subsequent method calls. + */ +export declare class LRUCache { + #private; + /** + * {@link LRUCache.OptionsBase.perf} + */ + get perf(): Perf; + /** + * {@link LRUCache.OptionsBase.ttl} + */ + ttl: LRUCache.Milliseconds; + /** + * {@link LRUCache.OptionsBase.ttlResolution} + */ + ttlResolution: LRUCache.Milliseconds; + /** + * {@link LRUCache.OptionsBase.ttlAutopurge} + */ + ttlAutopurge: boolean; + /** + * {@link LRUCache.OptionsBase.updateAgeOnGet} + */ + updateAgeOnGet: boolean; + /** + * {@link LRUCache.OptionsBase.updateAgeOnHas} + */ + updateAgeOnHas: boolean; + /** + * {@link LRUCache.OptionsBase.allowStale} + */ + allowStale: boolean; + /** + * {@link LRUCache.OptionsBase.noDisposeOnSet} + */ + noDisposeOnSet: boolean; + /** + * {@link LRUCache.OptionsBase.noUpdateTTL} + */ + noUpdateTTL: boolean; + /** + * {@link LRUCache.OptionsBase.maxEntrySize} + */ + maxEntrySize: LRUCache.Size; + /** + * {@link LRUCache.OptionsBase.sizeCalculation} + */ + sizeCalculation?: LRUCache.SizeCalculator; + /** + * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection} + */ + noDeleteOnFetchRejection: boolean; + /** + * {@link LRUCache.OptionsBase.noDeleteOnStaleGet} + */ + noDeleteOnStaleGet: boolean; + /** + * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort} + */ + allowStaleOnFetchAbort: boolean; + /** + * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} + */ + allowStaleOnFetchRejection: boolean; + /** + * {@link LRUCache.OptionsBase.ignoreFetchAbort} + */ + ignoreFetchAbort: boolean; + /** {@link LRUCache.OptionsBase.backgroundFetchSize} */ + backgroundFetchSize: number; + /** + * Do not call this method unless you need to inspect the + * inner workings of the cache. If anything returned by this + * object is modified in any way, strange breakage may occur. + * + * These fields are private for a reason! + * + * @internal + */ + static unsafeExposeInternals(c: LRUCache): { + starts: ZeroArray | undefined; + ttls: ZeroArray | undefined; + autopurgeTimers: (NodeJS.Timeout | undefined)[] | undefined; + sizes: ZeroArray | undefined; + keyMap: Map; + keyList: (K | undefined)[]; + valList: (V | BackgroundFetch | undefined)[]; + next: NumberArray; + prev: NumberArray; + readonly head: Index; + readonly tail: Index; + free: StackLike; + isBackgroundFetch: (p: unknown) => p is BackgroundFetch; + backgroundFetch: (k: K, index: number | undefined, options: LRUCache.FetchOptions, context: unknown) => BackgroundFetch; + moveToTail: (index: number) => void; + indexes: (options?: { + allowStale: boolean; + }) => Generator; + rindexes: (options?: { + allowStale: boolean; + }) => Generator; + isStale: (index: number | undefined) => boolean; + }; + /** + * {@link LRUCache.OptionsBase.max} (read-only) + */ + get max(): LRUCache.Count; + /** + * {@link LRUCache.OptionsBase.maxSize} (read-only) + */ + get maxSize(): LRUCache.Count; + /** + * The total computed size of items in the cache (read-only) + */ + get calculatedSize(): LRUCache.Size; + /** + * The number of items stored in the cache (read-only) + */ + get size(): LRUCache.Count; + /** + * {@link LRUCache.OptionsBase.fetchMethod} (read-only) + */ + get fetchMethod(): LRUCache.Fetcher | undefined; + get memoMethod(): LRUCache.Memoizer | undefined; + /** + * {@link LRUCache.OptionsBase.dispose} (read-only) + */ + get dispose(): LRUCache.Disposer | undefined; + /** + * {@link LRUCache.OptionsBase.onInsert} (read-only) + */ + get onInsert(): LRUCache.Inserter | undefined; + /** + * {@link LRUCache.OptionsBase.disposeAfter} (read-only) + */ + get disposeAfter(): LRUCache.Disposer | undefined; + constructor(options: LRUCache.Options | LRUCache); + /** + * Return the number of ms left in the item's TTL. If item is not in cache, + * returns `0`. Returns `Infinity` if item is in cache without a defined TTL. + */ + getRemainingTTL(key: K): number; + /** + * Return a generator yielding `[key, value]` pairs, + * in order from most recently used to least recently used. + */ + entries(): Generator<[K, V], void, unknown>; + /** + * Inverse order version of {@link LRUCache.entries} + * + * Return a generator yielding `[key, value]` pairs, + * in order from least recently used to most recently used. + */ + rentries(): Generator<(K | V)[], void, unknown>; + /** + * Return a generator yielding the keys in the cache, + * in order from most recently used to least recently used. + */ + keys(): Generator; + /** + * Inverse order version of {@link LRUCache.keys} + * + * Return a generator yielding the keys in the cache, + * in order from least recently used to most recently used. + */ + rkeys(): Generator; + /** + * Return a generator yielding the values in the cache, + * in order from most recently used to least recently used. + */ + values(): Generator; + /** + * Inverse order version of {@link LRUCache.values} + * + * Return a generator yielding the values in the cache, + * in order from least recently used to most recently used. + */ + rvalues(): Generator; + /** + * Iterating over the cache itself yields the same results as + * {@link LRUCache.entries} + */ + [Symbol.iterator](): Generator<[K, V], void, unknown>; + /** + * A String value that is used in the creation of the default string + * description of an object. Called by the built-in method + * `Object.prototype.toString`. + */ + [Symbol.toStringTag]: string; + /** + * Find a value for which the supplied fn method returns a truthy value, + * similar to `Array.find()`. fn is called as `fn(value, key, cache)`. + */ + find(fn: (v: V, k: K, self: LRUCache) => boolean, getOptions?: LRUCache.GetOptions): V | undefined; + /** + * Call the supplied function on each item in the cache, in order from most + * recently used to least recently used. + * + * `fn` is called as `fn(value, key, cache)`. + * + * If `thisp` is provided, function will be called in the `this`-context of + * the provided object, or the cache if no `thisp` object is provided. + * + * Does not update age or recenty of use, or iterate over stale values. + */ + forEach(fn: (v: V, k: K, self: LRUCache) => unknown, thisp?: unknown): void; + /** + * The same as {@link LRUCache.forEach} but items are iterated over in + * reverse order. (ie, less recently used items are iterated over first.) + */ + rforEach(fn: (v: V, k: K, self: LRUCache) => unknown, thisp?: unknown): void; + /** + * Delete any stale entries. Returns true if anything was removed, + * false otherwise. + */ + purgeStale(): boolean; + /** + * Get the extended info about a given entry, to get its value, size, and + * TTL info simultaneously. Returns `undefined` if the key is not present. + * + * Unlike {@link LRUCache#dump}, which is designed to be portable and survive + * serialization, the `start` value is always the current timestamp, and the + * `ttl` is a calculated remaining time to live (negative if expired). + * + * Always returns stale values, if their info is found in the cache, so be + * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl}) + * if relevant. + */ + info(key: K): LRUCache.Entry | undefined; + /** + * Return an array of [key, {@link LRUCache.Entry}] tuples which can be + * passed to {@link LRUCache#load}. + * + * The `start` fields are calculated relative to a portable `Date.now()` + * timestamp, even if `performance.now()` is available. + * + * Stale entries are always included in the `dump`, even if + * {@link LRUCache.OptionsBase.allowStale} is false. + * + * Note: this returns an actual array, not a generator, so it can be more + * easily passed around. + */ + dump(): [K, LRUCache.Entry][]; + /** + * Reset the cache and load in the items in entries in the order listed. + * + * The shape of the resulting cache may be different if the same options are + * not used in both caches. + * + * The `start` fields are assumed to be calculated relative to a portable + * `Date.now()` timestamp, even if `performance.now()` is available. + */ + load(arr: [K, LRUCache.Entry][]): void; + /** + * Add a value to the cache. + * + * Note: if `undefined` is specified as a value, this is an alias for + * {@link LRUCache#delete} + * + * Fields on the {@link LRUCache.SetOptions} options param will override + * their corresponding values in the constructor options for the scope + * of this single `set()` operation. + * + * If `start` is provided, then that will set the effective start + * time for the TTL calculation. Note that this must be a previous + * value of `performance.now()` if supported, or a previous value of + * `Date.now()` if not. + * + * Options object may also include `size`, which will prevent + * calling the `sizeCalculation` function and just use the specified + * number if it is a positive integer, and `noDisposeOnSet` which + * will prevent calling a `dispose` function in the case of + * overwrites. + * + * If the `size` (or return value of `sizeCalculation`) for a given + * entry is greater than `maxEntrySize`, then the item will not be + * added to the cache. + * + * Will update the recency of the entry. + * + * If the value is `undefined`, then this is an alias for + * `cache.delete(key)`. `undefined` is never stored in the cache. + */ + set(k: K, v: V | undefined, setOptions?: LRUCache.SetOptions): this; + /** + * Evict the least recently used item, returning its value or + * `undefined` if cache is empty. + */ + pop(): V | undefined; + /** + * Check if a key is in the cache, without updating the recency of use. + * Will return false if the item is stale, even though it is technically + * in the cache. + * + * Check if a key is in the cache, without updating the recency of + * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set + * to `true` in either the options or the constructor. + * + * Will return `false` if the item is stale, even though it is technically in + * the cache. The difference can be determined (if it matters) by using a + * `status` argument, and inspecting the `has` field. + * + * Will not update item age unless + * {@link LRUCache.OptionsBase.updateAgeOnHas} is set. + */ + has(k: K, hasOptions?: LRUCache.HasOptions): boolean; + /** + * Like {@link LRUCache#get} but doesn't update recency or delete stale + * items. + * + * Returns `undefined` if the item is stale, unless + * {@link LRUCache.OptionsBase.allowStale} is set. + */ + peek(k: K, peekOptions?: LRUCache.PeekOptions): V | undefined; + /** + * Make an asynchronous cached fetch using the + * {@link LRUCache.OptionsBase.fetchMethod} function. + * + * If the value is in the cache and not stale, then the returned + * Promise resolves to the value. + * + * If not in the cache, or beyond its TTL staleness, then + * `fetchMethod(key, staleValue, { options, signal, context })` is + * called, and the value returned will be added to the cache once + * resolved. + * + * If called with `allowStale`, and an asynchronous fetch is + * currently in progress to reload a stale value, then the former + * stale value will be returned. + * + * If called with `forceRefresh`, then the cached item will be + * re-fetched, even if it is not stale. However, if `allowStale` is also + * set, then the old value will still be returned. This is useful + * in cases where you want to force a reload of a cached value. If + * a background fetch is already in progress, then `forceRefresh` + * has no effect. + * + * If multiple fetches for the same key are issued, then they will all be + * coalesced into a single call to fetchMethod. + * + * Note that this means that handling options such as + * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}, + * {@link LRUCache.FetchOptions.signal}, + * and {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} will be + * determined by the FIRST fetch() call for a given key. + * + * This is a known (fixable) shortcoming which will be addresed on when + * someone complains about it, as the fix would involve added complexity and + * may not be worth the costs for this edge case. + * + * If {@link LRUCache.OptionsBase.fetchMethod} is not specified, then this is + * effectively an alias for `Promise.resolve(cache.get(key))`. + * + * When the fetch method resolves to a value, if the fetch has not + * been aborted due to deletion, eviction, or being overwritten, + * then it is added to the cache using the options provided. + * + * If the key is evicted or deleted before the `fetchMethod` + * resolves, then the AbortSignal passed to the `fetchMethod` will + * receive an `abort` event, and the promise returned by `fetch()` + * will reject with the reason for the abort. + * + * If a `signal` is passed to the `fetch()` call, then aborting the + * signal will abort the fetch and cause the `fetch()` promise to + * reject with the reason provided. + * + * **Setting `context`** + * + * If an `FC` type is set to a type other than `unknown`, `void`, or + * `undefined` in the {@link LRUCache} constructor, then all + * calls to `cache.fetch()` _must_ provide a `context` option. If + * set to `undefined` or `void`, then calls to fetch _must not_ + * provide a `context` option. + * + * The `context` param allows you to provide arbitrary data that + * might be relevant in the course of fetching the data. It is only + * relevant for the course of a single `fetch()` operation, and + * discarded afterwards. + * + * **Note: `fetch()` calls are inflight-unique** + * + * If you call `fetch()` multiple times with the same key value, + * then every call after the first will resolve on the same + * promise1, + * _even if they have different settings that would otherwise change + * the behavior of the fetch_, such as `noDeleteOnFetchRejection` + * or `ignoreFetchAbort`. + * + * In most cases, this is not a problem (in fact, only fetching + * something once is what you probably want, if you're caching in + * the first place). If you are changing the fetch() options + * dramatically between runs, there's a good chance that you might + * be trying to fit divergent semantics into a single object, and + * would be better off with multiple cache instances. + * + * **1**: Ie, they're not the "same Promise", but they resolve at + * the same time, because they're both waiting on the same + * underlying fetchMethod response. + */ + fetch(k: K, fetchOptions: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : LRUCache.FetchOptionsWithContext): Promise; + fetch(k: unknown extends FC ? K : FC extends undefined | void ? K : never, fetchOptions?: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : never): Promise; + /** + * In some cases, `cache.fetch()` may resolve to `undefined`, either because + * a {@link LRUCache.OptionsBase#fetchMethod} was not provided (turning + * `cache.fetch(k)` into just an async wrapper around `cache.get(k)`) or + * because `ignoreFetchAbort` was specified (either to the constructor or + * in the {@link LRUCache.FetchOptions}). Also, the + * {@link LRUCache.OptionsBase.fetchMethod} may return `undefined` or `void`, making + * the test even more complicated. + * + * Because inferring the cases where `undefined` might be returned are so + * cumbersome, but testing for `undefined` can also be annoying, this method + * can be used, which will reject if `this.fetch()` resolves to undefined. + */ + forceFetch(k: K, fetchOptions: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : LRUCache.FetchOptionsWithContext): Promise; + forceFetch(k: unknown extends FC ? K : FC extends undefined | void ? K : never, fetchOptions?: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : never): Promise; + /** + * If the key is found in the cache, then this is equivalent to + * {@link LRUCache#get}. If not, in the cache, then calculate the value using + * the {@link LRUCache.OptionsBase.memoMethod}, and add it to the cache. + * + * If an `FC` type is set to a type other than `unknown`, `void`, or + * `undefined` in the LRUCache constructor, then all calls to `cache.memo()` + * _must_ provide a `context` option. If set to `undefined` or `void`, then + * calls to memo _must not_ provide a `context` option. + * + * The `context` param allows you to provide arbitrary data that might be + * relevant in the course of fetching the data. It is only relevant for the + * course of a single `memo()` operation, and discarded afterwards. + */ + memo(k: K, memoOptions: unknown extends FC ? LRUCache.MemoOptions : FC extends undefined | void ? LRUCache.MemoOptionsNoContext : LRUCache.MemoOptionsWithContext): V; + memo(k: unknown extends FC ? K : FC extends undefined | void ? K : never, memoOptions?: unknown extends FC ? LRUCache.MemoOptions : FC extends undefined | void ? LRUCache.MemoOptionsNoContext : never): V; + /** + * Return a value from the cache. Will update the recency of the cache + * entry found. + * + * If the key is not found, get() will return `undefined`. + */ + get(k: K, getOptions?: LRUCache.GetOptions): V | undefined; + /** + * Deletes a key out of the cache. + * + * Returns true if the key was deleted, false otherwise. + */ + delete(k: K): boolean; + /** + * Clear the cache entirely, throwing away all values. + */ + clear(): void; +} +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/index.d.ts.map b/node_modules/lru-cache/dist/commonjs/index.d.ts.map new file mode 100644 index 00000000..3ab3f752 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/index.js b/node_modules/lru-cache/dist/commonjs/index.js new file mode 100644 index 00000000..179694b1 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/index.js @@ -0,0 +1,1726 @@ +"use strict"; +/** + * @module LRUCache + */ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.LRUCache = void 0; +const diagnostics_channel_js_1 = require("./diagnostics-channel.js"); +const perf_js_1 = require("./perf.js"); +const hasSubscribers = () => diagnostics_channel_js_1.metrics.hasSubscribers || diagnostics_channel_js_1.tracing.hasSubscribers; +const warned = new Set(); +/* c8 ignore start */ +const PROCESS = (typeof process === 'object' && !!process ? + process + : {}); +/* c8 ignore stop */ +const emitWarning = (msg, type, code, fn) => { + if (typeof PROCESS.emitWarning === 'function') { + PROCESS.emitWarning(msg, type, code, fn); + } + else { + //oxlint-disable-next-line no-console + console.error(`[${code}] ${type}: ${msg}`); + } +}; +const shouldWarn = (code) => !warned.has(code); +const TYPE = Symbol('type'); +const isPosInt = (n) => !!n && n === Math.floor(n) && n > 0 && isFinite(n); +// This is a little bit ridiculous, tbh. +// The maximum array length is 2^32-1 or thereabouts on most JS impls. +// And well before that point, you're caching the entire world, I mean, +// that's ~32GB of just integers for the next/prev links, plus whatever +// else to hold that many keys and values. Just filling the memory with +// zeroes at init time is brutal when you get that big. +// But why not be complete? +// Maybe in the future, these limits will have expanded. +/* c8 ignore start */ +const getUintArray = (max) => !isPosInt(max) ? null + : max <= Math.pow(2, 8) ? Uint8Array + : max <= Math.pow(2, 16) ? Uint16Array + : max <= Math.pow(2, 32) ? Uint32Array + : max <= Number.MAX_SAFE_INTEGER ? ZeroArray + : null; +/* c8 ignore stop */ +class ZeroArray extends Array { + constructor(size) { + super(size); + this.fill(0); + } +} +class Stack { + /* c8 ignore start - not sure why this is showing up uncovered?? */ + heap; + /* c8 ignore stop */ + length; + // private constructor + static #constructing = false; + static create(max) { + const HeapCls = getUintArray(max); + if (!HeapCls) + return []; + Stack.#constructing = true; + const s = new Stack(max, HeapCls); + Stack.#constructing = false; + return s; + } + constructor(max, HeapCls) { + /* c8 ignore start */ + if (!Stack.#constructing) { + throw new TypeError('instantiate Stack using Stack.create(n)'); + } + /* c8 ignore stop */ + this.heap = new HeapCls(max); + this.length = 0; + } + push(n) { + this.heap[this.length++] = n; + } + pop() { + return this.heap[--this.length]; + } +} +/** + * Default export, the thing you're using this module to get. + * + * The `K` and `V` types define the key and value types, respectively. The + * optional `FC` type defines the type of the `context` object passed to + * `cache.fetch()` and `cache.memo()`. + * + * Keys and values **must not** be `null` or `undefined`. + * + * All properties from the options object (with the exception of `max`, + * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are + * added as normal public members. (The listed options are read-only getters.) + * + * Changing any of these will alter the defaults for subsequent method calls. + */ +class LRUCache { + // options that cannot be changed without disaster + #max; + #maxSize; + #dispose; + #onInsert; + #disposeAfter; + #fetchMethod; + #memoMethod; + #perf; + /** + * {@link LRUCache.OptionsBase.perf} + */ + get perf() { + return this.#perf; + } + /** + * {@link LRUCache.OptionsBase.ttl} + */ + ttl; + /** + * {@link LRUCache.OptionsBase.ttlResolution} + */ + ttlResolution; + /** + * {@link LRUCache.OptionsBase.ttlAutopurge} + */ + ttlAutopurge; + /** + * {@link LRUCache.OptionsBase.updateAgeOnGet} + */ + updateAgeOnGet; + /** + * {@link LRUCache.OptionsBase.updateAgeOnHas} + */ + updateAgeOnHas; + /** + * {@link LRUCache.OptionsBase.allowStale} + */ + allowStale; + /** + * {@link LRUCache.OptionsBase.noDisposeOnSet} + */ + noDisposeOnSet; + /** + * {@link LRUCache.OptionsBase.noUpdateTTL} + */ + noUpdateTTL; + /** + * {@link LRUCache.OptionsBase.maxEntrySize} + */ + maxEntrySize; + /** + * {@link LRUCache.OptionsBase.sizeCalculation} + */ + sizeCalculation; + /** + * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection} + */ + noDeleteOnFetchRejection; + /** + * {@link LRUCache.OptionsBase.noDeleteOnStaleGet} + */ + noDeleteOnStaleGet; + /** + * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort} + */ + allowStaleOnFetchAbort; + /** + * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} + */ + allowStaleOnFetchRejection; + /** + * {@link LRUCache.OptionsBase.ignoreFetchAbort} + */ + ignoreFetchAbort; + /** {@link LRUCache.OptionsBase.backgroundFetchSize} */ + backgroundFetchSize; + // computed properties + #size; + #calculatedSize; + #keyMap; + #keyList; + #valList; + #next; + #prev; + #head; + #tail; + #free; + #disposed; + #sizes; + #starts; + #ttls; + #autopurgeTimers; + #hasDispose; + #hasFetchMethod; + #hasDisposeAfter; + #hasOnInsert; + /** + * Do not call this method unless you need to inspect the + * inner workings of the cache. If anything returned by this + * object is modified in any way, strange breakage may occur. + * + * These fields are private for a reason! + * + * @internal + */ + static unsafeExposeInternals(c) { + return { + // properties + starts: c.#starts, + ttls: c.#ttls, + autopurgeTimers: c.#autopurgeTimers, + sizes: c.#sizes, + keyMap: c.#keyMap, + keyList: c.#keyList, + valList: c.#valList, + next: c.#next, + prev: c.#prev, + get head() { + return c.#head; + }, + get tail() { + return c.#tail; + }, + free: c.#free, + // methods + isBackgroundFetch: (p) => c.#isBackgroundFetch(p), + backgroundFetch: (k, index, options, context) => c.#backgroundFetch(k, index, options, context), + moveToTail: (index) => c.#moveToTail(index), + indexes: (options) => c.#indexes(options), + rindexes: (options) => c.#rindexes(options), + isStale: (index) => c.#isStale(index), + }; + } + // Protected read-only members + /** + * {@link LRUCache.OptionsBase.max} (read-only) + */ + get max() { + return this.#max; + } + /** + * {@link LRUCache.OptionsBase.maxSize} (read-only) + */ + get maxSize() { + return this.#maxSize; + } + /** + * The total computed size of items in the cache (read-only) + */ + get calculatedSize() { + return this.#calculatedSize; + } + /** + * The number of items stored in the cache (read-only) + */ + get size() { + return this.#size; + } + /** + * {@link LRUCache.OptionsBase.fetchMethod} (read-only) + */ + get fetchMethod() { + return this.#fetchMethod; + } + get memoMethod() { + return this.#memoMethod; + } + /** + * {@link LRUCache.OptionsBase.dispose} (read-only) + */ + get dispose() { + return this.#dispose; + } + /** + * {@link LRUCache.OptionsBase.onInsert} (read-only) + */ + get onInsert() { + return this.#onInsert; + } + /** + * {@link LRUCache.OptionsBase.disposeAfter} (read-only) + */ + get disposeAfter() { + return this.#disposeAfter; + } + constructor(options) { + const { max = 0, ttl, ttlResolution = 1, ttlAutopurge, updateAgeOnGet, updateAgeOnHas, allowStale, dispose, onInsert, disposeAfter, noDisposeOnSet, noUpdateTTL, maxSize = 0, maxEntrySize = 0, sizeCalculation, fetchMethod, memoMethod, noDeleteOnFetchRejection, noDeleteOnStaleGet, allowStaleOnFetchRejection, allowStaleOnFetchAbort, ignoreFetchAbort, backgroundFetchSize = 1, perf, } = options; + this.backgroundFetchSize = backgroundFetchSize; + if (perf !== undefined) { + if (typeof perf?.now !== 'function') { + throw new TypeError('perf option must have a now() method if specified'); + } + } + this.#perf = perf ?? perf_js_1.defaultPerf; + if (max !== 0 && !isPosInt(max)) { + throw new TypeError('max option must be a nonnegative integer'); + } + const UintArray = max ? getUintArray(max) : Array; + if (!UintArray) { + throw new Error('invalid max value: ' + max); + } + this.#max = max; + this.#maxSize = maxSize; + this.maxEntrySize = maxEntrySize || this.#maxSize; + this.sizeCalculation = sizeCalculation; + if (this.sizeCalculation) { + if (!this.#maxSize && !this.maxEntrySize) { + throw new TypeError('cannot set sizeCalculation without setting maxSize or maxEntrySize'); + } + if (typeof this.sizeCalculation !== 'function') { + throw new TypeError('sizeCalculation set to non-function'); + } + } + if (memoMethod !== undefined && typeof memoMethod !== 'function') { + throw new TypeError('memoMethod must be a function if defined'); + } + this.#memoMethod = memoMethod; + if (fetchMethod !== undefined && typeof fetchMethod !== 'function') { + throw new TypeError('fetchMethod must be a function if specified'); + } + this.#fetchMethod = fetchMethod; + this.#hasFetchMethod = !!fetchMethod; + this.#keyMap = new Map(); + this.#keyList = Array.from({ length: max }).fill(undefined); + this.#valList = Array.from({ length: max }).fill(undefined); + this.#next = new UintArray(max); + this.#prev = new UintArray(max); + this.#head = 0; + this.#tail = 0; + this.#free = Stack.create(max); + this.#size = 0; + this.#calculatedSize = 0; + if (typeof dispose === 'function') { + this.#dispose = dispose; + } + if (typeof onInsert === 'function') { + this.#onInsert = onInsert; + } + if (typeof disposeAfter === 'function') { + this.#disposeAfter = disposeAfter; + this.#disposed = []; + } + else { + this.#disposeAfter = undefined; + this.#disposed = undefined; + } + this.#hasDispose = !!this.#dispose; + this.#hasOnInsert = !!this.#onInsert; + this.#hasDisposeAfter = !!this.#disposeAfter; + this.noDisposeOnSet = !!noDisposeOnSet; + this.noUpdateTTL = !!noUpdateTTL; + this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection; + this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection; + this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort; + this.ignoreFetchAbort = !!ignoreFetchAbort; + // NB: maxEntrySize is set to maxSize if it's set + if (this.maxEntrySize !== 0) { + if (this.#maxSize !== 0) { + if (!isPosInt(this.#maxSize)) { + throw new TypeError('maxSize must be a positive integer if specified'); + } + } + if (!isPosInt(this.maxEntrySize)) { + throw new TypeError('maxEntrySize must be a positive integer if specified'); + } + this.#initializeSizeTracking(); + } + this.allowStale = !!allowStale; + this.noDeleteOnStaleGet = !!noDeleteOnStaleGet; + this.updateAgeOnGet = !!updateAgeOnGet; + this.updateAgeOnHas = !!updateAgeOnHas; + this.ttlResolution = + isPosInt(ttlResolution) || ttlResolution === 0 ? ttlResolution : 1; + this.ttlAutopurge = !!ttlAutopurge; + this.ttl = ttl || 0; + if (this.ttl) { + if (!isPosInt(this.ttl)) { + throw new TypeError('ttl must be a positive integer if specified'); + } + this.#initializeTTLTracking(); + } + // do not allow completely unbounded caches + if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) { + throw new TypeError('At least one of max, maxSize, or ttl is required'); + } + if (!this.ttlAutopurge && !this.#max && !this.#maxSize) { + const code = 'LRU_CACHE_UNBOUNDED'; + if (shouldWarn(code)) { + warned.add(code); + const msg = 'TTL caching without ttlAutopurge, max, or maxSize can ' + + 'result in unbounded memory consumption.'; + emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache); + } + } + } + /** + * Return the number of ms left in the item's TTL. If item is not in cache, + * returns `0`. Returns `Infinity` if item is in cache without a defined TTL. + */ + getRemainingTTL(key) { + return this.#keyMap.has(key) ? Infinity : 0; + } + #initializeTTLTracking() { + const ttls = new ZeroArray(this.#max); + const starts = new ZeroArray(this.#max); + this.#ttls = ttls; + this.#starts = starts; + const purgeTimers = this.ttlAutopurge ? + Array.from({ + length: this.#max, + }) + : undefined; + this.#autopurgeTimers = purgeTimers; + this.#setItemTTL = (index, ttl, start = this.#perf.now()) => { + starts[index] = ttl !== 0 ? start : 0; + ttls[index] = ttl; + setPurgetTimer(index, ttl); + }; + this.#updateItemAge = index => { + starts[index] = ttls[index] !== 0 ? this.#perf.now() : 0; + setPurgetTimer(index, ttls[index]); + }; + // clear out the purge timer if we're setting TTL to 0, and + // previously had a ttl purge timer running, so it doesn't + // fire unnecessarily. Don't need to do this if we're not doing + // autopurge. + const setPurgetTimer = !this.ttlAutopurge ? + () => { } + : (index, ttl) => { + if (purgeTimers?.[index]) { + clearTimeout(purgeTimers[index]); + purgeTimers[index] = undefined; + } + if (ttl && ttl !== 0 && purgeTimers) { + const t = setTimeout(() => { + if (this.#isStale(index)) { + this.#delete(this.#keyList[index], 'expire'); + } + }, ttl + 1); + // unref() not supported on all platforms + /* c8 ignore start */ + if (t.unref) { + t.unref(); + } + /* c8 ignore stop */ + purgeTimers[index] = t; + } + }; + this.#statusTTL = (status, index) => { + if (ttls[index]) { + const ttl = ttls[index]; + const start = starts[index]; + /* c8 ignore start */ + if (!ttl || !start) { + return; + } + /* c8 ignore stop */ + status.ttl = ttl; + status.start = start; + status.now = cachedNow || getNow(); + const age = status.now - start; + status.remainingTTL = ttl - age; + } + }; + // debounce calls to perf.now() to 1s so we're not hitting + // that costly call repeatedly. + let cachedNow = 0; + const getNow = () => { + const n = this.#perf.now(); + if (this.ttlResolution > 0) { + cachedNow = n; + const t = setTimeout(() => (cachedNow = 0), this.ttlResolution); + // not available on all platforms + /* c8 ignore start */ + if (t.unref) { + t.unref(); + } + /* c8 ignore stop */ + } + return n; + }; + this.getRemainingTTL = key => { + const index = this.#keyMap.get(key); + if (index === undefined) { + return 0; + } + const ttl = ttls[index]; + const start = starts[index]; + if (!ttl || !start) { + return Infinity; + } + const age = (cachedNow || getNow()) - start; + return ttl - age; + }; + this.#isStale = index => { + const s = starts[index]; + const t = ttls[index]; + return !!t && !!s && (cachedNow || getNow()) - s > t; + }; + } + // conditionally set private methods related to TTL + #updateItemAge = () => { }; + #statusTTL = () => { }; + #setItemTTL = () => { }; + /* c8 ignore stop */ + #isStale = () => false; + #initializeSizeTracking() { + const sizes = new ZeroArray(this.#max); + this.#calculatedSize = 0; + this.#sizes = sizes; + this.#removeItemSize = index => { + this.#calculatedSize -= sizes[index]; + sizes[index] = 0; + }; + this.#requireSize = (k, v, size, sizeCalculation) => { + if (!isPosInt(size)) { + // provisionally accept background fetches. + // actual value size will be checked when they return. + if (this.#isBackgroundFetch(v)) { + // NB: this cannot occur if v.__staleWhileFetching is set, + // because in that case, it would take on the size of the + // existing entry that it temporarily replaces. + return this.backgroundFetchSize; + } + if (sizeCalculation) { + if (typeof sizeCalculation !== 'function') { + throw new TypeError('sizeCalculation must be a function'); + } + size = sizeCalculation(v, k); + if (!isPosInt(size)) { + throw new TypeError('sizeCalculation return invalid (expect positive integer)'); + } + } + else { + throw new TypeError('invalid size value (must be positive integer). ' + + 'When maxSize or maxEntrySize is used, sizeCalculation ' + + 'or size must be set.'); + } + } + return size; + }; + this.#addItemSize = (index, size, status) => { + sizes[index] = size; + if (this.#maxSize) { + const maxSize = this.#maxSize - sizes[index]; + while (this.#calculatedSize > maxSize) { + this.#evict(true); + } + } + this.#calculatedSize += sizes[index]; + if (status) { + status.entrySize = size; + status.totalCalculatedSize = this.#calculatedSize; + } + }; + } + #removeItemSize = _i => { }; + #addItemSize = (_i, _s, _st) => { }; + #requireSize = (_k, _v, size, sizeCalculation) => { + if (size || sizeCalculation) { + throw new TypeError('cannot set size without setting maxSize or maxEntrySize on cache'); + } + return 0; + }; + *#indexes({ allowStale = this.allowStale } = {}) { + if (this.#size) { + for (let i = this.#tail; this.#isValidIndex(i);) { + if (allowStale || !this.#isStale(i)) { + yield i; + } + if (i === this.#head) { + break; + } + else { + i = this.#prev[i]; + } + } + } + } + *#rindexes({ allowStale = this.allowStale } = {}) { + if (this.#size) { + for (let i = this.#head; this.#isValidIndex(i);) { + if (allowStale || !this.#isStale(i)) { + yield i; + } + if (i === this.#tail) { + break; + } + else { + i = this.#next[i]; + } + } + } + } + #isValidIndex(index) { + return (index !== undefined && + this.#keyMap.get(this.#keyList[index]) === index); + } + /** + * Return a generator yielding `[key, value]` pairs, + * in order from most recently used to least recently used. + */ + *entries() { + for (const i of this.#indexes()) { + if (this.#valList[i] !== undefined && + this.#keyList[i] !== undefined && + !this.#isBackgroundFetch(this.#valList[i])) { + yield [this.#keyList[i], this.#valList[i]]; + } + } + } + /** + * Inverse order version of {@link LRUCache.entries} + * + * Return a generator yielding `[key, value]` pairs, + * in order from least recently used to most recently used. + */ + *rentries() { + for (const i of this.#rindexes()) { + if (this.#valList[i] !== undefined && + this.#keyList[i] !== undefined && + !this.#isBackgroundFetch(this.#valList[i])) { + yield [this.#keyList[i], this.#valList[i]]; + } + } + } + /** + * Return a generator yielding the keys in the cache, + * in order from most recently used to least recently used. + */ + *keys() { + for (const i of this.#indexes()) { + const k = this.#keyList[i]; + if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield k; + } + } + } + /** + * Inverse order version of {@link LRUCache.keys} + * + * Return a generator yielding the keys in the cache, + * in order from least recently used to most recently used. + */ + *rkeys() { + for (const i of this.#rindexes()) { + const k = this.#keyList[i]; + if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield k; + } + } + } + /** + * Return a generator yielding the values in the cache, + * in order from most recently used to least recently used. + */ + *values() { + for (const i of this.#indexes()) { + const v = this.#valList[i]; + if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield this.#valList[i]; + } + } + } + /** + * Inverse order version of {@link LRUCache.values} + * + * Return a generator yielding the values in the cache, + * in order from least recently used to most recently used. + */ + *rvalues() { + for (const i of this.#rindexes()) { + const v = this.#valList[i]; + if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield this.#valList[i]; + } + } + } + /** + * Iterating over the cache itself yields the same results as + * {@link LRUCache.entries} + */ + [Symbol.iterator]() { + return this.entries(); + } + /** + * A String value that is used in the creation of the default string + * description of an object. Called by the built-in method + * `Object.prototype.toString`. + */ + [Symbol.toStringTag] = 'LRUCache'; + /** + * Find a value for which the supplied fn method returns a truthy value, + * similar to `Array.find()`. fn is called as `fn(value, key, cache)`. + */ + find(fn, getOptions = {}) { + for (const i of this.#indexes()) { + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined) + continue; + if (fn(value, this.#keyList[i], this)) { + return this.#get(this.#keyList[i], getOptions); + } + } + } + /** + * Call the supplied function on each item in the cache, in order from most + * recently used to least recently used. + * + * `fn` is called as `fn(value, key, cache)`. + * + * If `thisp` is provided, function will be called in the `this`-context of + * the provided object, or the cache if no `thisp` object is provided. + * + * Does not update age or recenty of use, or iterate over stale values. + */ + forEach(fn, thisp = this) { + for (const i of this.#indexes()) { + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined) + continue; + fn.call(thisp, value, this.#keyList[i], this); + } + } + /** + * The same as {@link LRUCache.forEach} but items are iterated over in + * reverse order. (ie, less recently used items are iterated over first.) + */ + rforEach(fn, thisp = this) { + for (const i of this.#rindexes()) { + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined) + continue; + fn.call(thisp, value, this.#keyList[i], this); + } + } + /** + * Delete any stale entries. Returns true if anything was removed, + * false otherwise. + */ + purgeStale() { + let deleted = false; + for (const i of this.#rindexes({ allowStale: true })) { + if (this.#isStale(i)) { + this.#delete(this.#keyList[i], 'expire'); + deleted = true; + } + } + return deleted; + } + /** + * Get the extended info about a given entry, to get its value, size, and + * TTL info simultaneously. Returns `undefined` if the key is not present. + * + * Unlike {@link LRUCache#dump}, which is designed to be portable and survive + * serialization, the `start` value is always the current timestamp, and the + * `ttl` is a calculated remaining time to live (negative if expired). + * + * Always returns stale values, if their info is found in the cache, so be + * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl}) + * if relevant. + */ + info(key) { + const i = this.#keyMap.get(key); + if (i === undefined) + return undefined; + const v = this.#valList[i]; + /* c8 ignore start - this isn't tested for the info function, + * but it's the same logic as found in other places. */ + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined) + return undefined; + /* c8 ignore stop */ + const entry = { value }; + if (this.#ttls && this.#starts) { + const ttl = this.#ttls[i]; + const start = this.#starts[i]; + if (ttl && start) { + const remain = ttl - (this.#perf.now() - start); + entry.ttl = remain; + entry.start = Date.now(); + } + } + if (this.#sizes) { + entry.size = this.#sizes[i]; + } + return entry; + } + /** + * Return an array of [key, {@link LRUCache.Entry}] tuples which can be + * passed to {@link LRUCache#load}. + * + * The `start` fields are calculated relative to a portable `Date.now()` + * timestamp, even if `performance.now()` is available. + * + * Stale entries are always included in the `dump`, even if + * {@link LRUCache.OptionsBase.allowStale} is false. + * + * Note: this returns an actual array, not a generator, so it can be more + * easily passed around. + */ + dump() { + const arr = []; + for (const i of this.#indexes({ allowStale: true })) { + const key = this.#keyList[i]; + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined || key === undefined) + continue; + const entry = { value }; + if (this.#ttls && this.#starts) { + entry.ttl = this.#ttls[i]; + // always dump the start relative to a portable timestamp + // it's ok for this to be a bit slow, it's a rare operation. + const age = this.#perf.now() - this.#starts[i]; + entry.start = Math.floor(Date.now() - age); + } + if (this.#sizes) { + entry.size = this.#sizes[i]; + } + arr.unshift([key, entry]); + } + return arr; + } + /** + * Reset the cache and load in the items in entries in the order listed. + * + * The shape of the resulting cache may be different if the same options are + * not used in both caches. + * + * The `start` fields are assumed to be calculated relative to a portable + * `Date.now()` timestamp, even if `performance.now()` is available. + */ + load(arr) { + this.clear(); + for (const [key, entry] of arr) { + if (entry.start) { + // entry.start is a portable timestamp, but we may be using + // node's performance.now(), so calculate the offset, so that + // we get the intended remaining TTL, no matter how long it's + // been on ice. + // + // it's ok for this to be a bit slow, it's a rare operation. + const age = Date.now() - entry.start; + entry.start = this.#perf.now() - age; + } + this.#set(key, entry.value, entry); + } + } + /** + * Add a value to the cache. + * + * Note: if `undefined` is specified as a value, this is an alias for + * {@link LRUCache#delete} + * + * Fields on the {@link LRUCache.SetOptions} options param will override + * their corresponding values in the constructor options for the scope + * of this single `set()` operation. + * + * If `start` is provided, then that will set the effective start + * time for the TTL calculation. Note that this must be a previous + * value of `performance.now()` if supported, or a previous value of + * `Date.now()` if not. + * + * Options object may also include `size`, which will prevent + * calling the `sizeCalculation` function and just use the specified + * number if it is a positive integer, and `noDisposeOnSet` which + * will prevent calling a `dispose` function in the case of + * overwrites. + * + * If the `size` (or return value of `sizeCalculation`) for a given + * entry is greater than `maxEntrySize`, then the item will not be + * added to the cache. + * + * Will update the recency of the entry. + * + * If the value is `undefined`, then this is an alias for + * `cache.delete(key)`. `undefined` is never stored in the cache. + */ + set(k, v, setOptions = {}) { + const { status = diagnostics_channel_js_1.metrics.hasSubscribers ? {} : undefined } = setOptions; + setOptions.status = status; + if (status) { + status.op = 'set'; + status.key = k; + if (v !== undefined) + status.value = v; + status.cache = this; + } + const result = this.#set(k, v, setOptions); + if (status && diagnostics_channel_js_1.metrics.hasSubscribers) { + diagnostics_channel_js_1.metrics.publish(status); + } + return result; + } + #set(k, v, setOptions, bf) { + const { ttl = this.ttl, start, noDisposeOnSet = this.noDisposeOnSet, sizeCalculation = this.sizeCalculation, status, } = setOptions; + const isBF = this.#isBackgroundFetch(v); + if (v === undefined) { + if (status) + status.set = 'deleted'; + this.delete(k); + return this; + } + let { noUpdateTTL = this.noUpdateTTL } = setOptions; + if (status && !isBF) + status.value = v; + const size = this.#requireSize(k, v, setOptions.size || 0, sizeCalculation, status); + // if the item doesn't fit, don't do anything + // NB: maxEntrySize set to maxSize by default + if (this.maxEntrySize && size > this.maxEntrySize) { + // have to delete, in case something is there already. + this.#delete(k, 'set'); + if (status) { + status.set = 'miss'; + status.maxEntrySizeExceeded = true; + } + return this; + } + let index = this.#size === 0 ? undefined : this.#keyMap.get(k); + if (index === undefined) { + // addition + index = (this.#size === 0 ? this.#tail + : this.#free.length !== 0 ? this.#free.pop() + : this.#size === this.#max ? this.#evict(false) + : this.#size); + this.#keyList[index] = k; + this.#valList[index] = v; + this.#keyMap.set(k, index); + this.#next[this.#tail] = index; + this.#prev[index] = this.#tail; + this.#tail = index; + this.#size++; + this.#addItemSize(index, size, status); + if (status) + status.set = 'add'; + noUpdateTTL = false; + if (this.#hasOnInsert && !isBF) { + this.#onInsert?.(v, k, 'add'); + } + } + else { + // update + // might be updating a background fetch! + this.#moveToTail(index); + const oldVal = this.#valList[index]; + if (v !== oldVal) { + if (!noDisposeOnSet) { + if (this.#isBackgroundFetch(oldVal)) { + if (oldVal !== bf) { + // setting over a background fetch, not merely resolving it. + oldVal.__abortController.abort(new Error('replaced')); + } + const { __staleWhileFetching: s } = oldVal; + if (s !== undefined && s !== v) { + if (this.#hasDispose) { + this.#dispose?.(s, k, 'set'); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([s, k, 'set']); + } + } + } + else { + if (this.#hasDispose) { + this.#dispose?.(oldVal, k, 'set'); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([oldVal, k, 'set']); + } + } + } + this.#removeItemSize(index); + this.#addItemSize(index, size, status); + this.#valList[index] = v; + if (!isBF) { + const oldValue = oldVal && this.#isBackgroundFetch(oldVal) ? + oldVal.__staleWhileFetching + : oldVal; + const setType = oldValue === undefined ? 'add' + : v !== oldValue ? 'replace' + : 'update'; + if (status) { + status.set = setType; + if (oldValue !== undefined) + status.oldValue = oldValue; + } + if (this.#hasOnInsert) { + this.onInsert?.(v, k, setType); + } + } + } + else if (!isBF) { + if (status) { + status.set = 'update'; + } + if (this.#hasOnInsert) { + this.onInsert?.(v, k, 'update'); + } + } + } + if (ttl !== 0 && !this.#ttls) { + this.#initializeTTLTracking(); + } + if (this.#ttls) { + if (!noUpdateTTL) { + this.#setItemTTL(index, ttl, start); + } + if (status) + this.#statusTTL(status, index); + } + if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) { + const dt = this.#disposed; + let task; + while ((task = dt?.shift())) { + this.#disposeAfter?.(...task); + } + } + return this; + } + /** + * Evict the least recently used item, returning its value or + * `undefined` if cache is empty. + */ + pop() { + try { + while (this.#size) { + const val = this.#valList[this.#head]; + this.#evict(true); + if (this.#isBackgroundFetch(val)) { + if (val.__staleWhileFetching) { + return val.__staleWhileFetching; + } + } + else if (val !== undefined) { + return val; + } + } + } + finally { + if (this.#hasDisposeAfter && this.#disposed) { + const dt = this.#disposed; + let task; + while ((task = dt?.shift())) { + this.#disposeAfter?.(...task); + } + } + } + } + #evict(free) { + const head = this.#head; + const k = this.#keyList[head]; + const v = this.#valList[head]; + const isBF = this.#isBackgroundFetch(v); + if (isBF) { + v.__abortController.abort(new Error('evicted')); + } + const oldValue = isBF ? v.__staleWhileFetching : v; + if ((this.#hasDispose || this.#hasDisposeAfter) && + oldValue !== undefined) { + if (this.#hasDispose) { + this.#dispose?.(oldValue, k, 'evict'); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([oldValue, k, 'evict']); + } + } + this.#removeItemSize(head); + if (this.#autopurgeTimers?.[head]) { + clearTimeout(this.#autopurgeTimers[head]); + this.#autopurgeTimers[head] = undefined; + } + // if we aren't about to use the index, then null these out + if (free) { + this.#keyList[head] = undefined; + this.#valList[head] = undefined; + this.#free.push(head); + } + if (this.#size === 1) { + this.#head = this.#tail = 0; + this.#free.length = 0; + } + else { + this.#head = this.#next[head]; + } + this.#keyMap.delete(k); + this.#size--; + return head; + } + /** + * Check if a key is in the cache, without updating the recency of use. + * Will return false if the item is stale, even though it is technically + * in the cache. + * + * Check if a key is in the cache, without updating the recency of + * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set + * to `true` in either the options or the constructor. + * + * Will return `false` if the item is stale, even though it is technically in + * the cache. The difference can be determined (if it matters) by using a + * `status` argument, and inspecting the `has` field. + * + * Will not update item age unless + * {@link LRUCache.OptionsBase.updateAgeOnHas} is set. + */ + has(k, hasOptions = {}) { + const { status = diagnostics_channel_js_1.metrics.hasSubscribers ? {} : undefined } = hasOptions; + hasOptions.status = status; + if (status) { + status.op = 'has'; + status.key = k; + status.cache = this; + } + const result = this.#has(k, hasOptions); + if (diagnostics_channel_js_1.metrics.hasSubscribers) + diagnostics_channel_js_1.metrics.publish(status); + return result; + } + #has(k, hasOptions = {}) { + const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions; + const index = this.#keyMap.get(k); + if (index !== undefined) { + const v = this.#valList[index]; + if (this.#isBackgroundFetch(v) && + v.__staleWhileFetching === undefined) { + return false; + } + if (!this.#isStale(index)) { + if (updateAgeOnHas) { + this.#updateItemAge(index); + } + if (status) { + status.has = 'hit'; + this.#statusTTL(status, index); + } + return true; + } + else if (status) { + status.has = 'stale'; + this.#statusTTL(status, index); + } + } + else if (status) { + status.has = 'miss'; + } + return false; + } + /** + * Like {@link LRUCache#get} but doesn't update recency or delete stale + * items. + * + * Returns `undefined` if the item is stale, unless + * {@link LRUCache.OptionsBase.allowStale} is set. + */ + peek(k, peekOptions = {}) { + const { status = hasSubscribers() ? {} : undefined } = peekOptions; + if (status) { + status.op = 'peek'; + status.key = k; + status.cache = this; + } + peekOptions.status = status; + const result = this.#peek(k, peekOptions); + if (diagnostics_channel_js_1.metrics.hasSubscribers) { + diagnostics_channel_js_1.metrics.publish(status); + } + return result; + } + #peek(k, peekOptions) { + const { status, allowStale = this.allowStale } = peekOptions; + const index = this.#keyMap.get(k); + if (index === undefined || (!allowStale && this.#isStale(index))) { + if (status) + status.peek = index === undefined ? 'miss' : 'stale'; + return undefined; + } + const v = this.#valList[index]; + const val = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (status) { + if (val !== undefined) { + status.peek = 'hit'; + status.value = val; + } + else { + status.peek = 'miss'; + } + } + return val; + } + #backgroundFetch(k, index, options, context) { + const v = index === undefined ? undefined : this.#valList[index]; + if (this.#isBackgroundFetch(v)) { + return v; + } + const ac = new AbortController(); + const { signal } = options; + // when/if our AC signals, then stop listening to theirs. + signal?.addEventListener('abort', () => ac.abort(signal.reason), { + signal: ac.signal, + }); + const fetchOpts = { + signal: ac.signal, + options, + context, + }; + const cb = (v, updateCache = false) => { + const { aborted } = ac.signal; + const ignoreAbort = options.ignoreFetchAbort && v !== undefined; + const proceed = options.ignoreFetchAbort || + !!(options.allowStaleOnFetchAbort && v !== undefined); + if (options.status) { + if (aborted && !updateCache) { + options.status.fetchAborted = true; + options.status.fetchError = ac.signal.reason; + if (ignoreAbort) + options.status.fetchAbortIgnored = true; + } + else { + options.status.fetchResolved = true; + } + } + if (aborted && !ignoreAbort && !updateCache) { + return fetchFail(ac.signal.reason, proceed); + } + // either we didn't abort, and are still here, or we did, and ignored + const bf = p; + // if nothing else has been written there but we're set to update the + // cache and ignore the abort, or if it's still pending on this specific + // background request, then write it to the cache. + const vl = this.#valList[index]; + if (vl === p || (vl === undefined && ignoreAbort && updateCache)) { + if (v === undefined) { + if (bf.__staleWhileFetching !== undefined) { + this.#valList[index] = bf.__staleWhileFetching; + } + else { + this.#delete(k, 'fetch'); + } + } + else { + if (options.status) + options.status.fetchUpdated = true; + this.#set(k, v, fetchOpts.options, bf); + } + } + return v; + }; + const eb = (er) => { + if (options.status) { + options.status.fetchRejected = true; + options.status.fetchError = er; + } + // do not pass go, do not collect $200 + return fetchFail(er, false); + }; + const fetchFail = (er, proceed) => { + const { aborted } = ac.signal; + const allowStaleAborted = aborted && options.allowStaleOnFetchAbort; + const allowStale = allowStaleAborted || options.allowStaleOnFetchRejection; + const noDelete = allowStale || options.noDeleteOnFetchRejection; + const bf = p; + if (this.#valList[index] === p) { + // if we allow stale on fetch rejections, then we need to ensure that + // the stale value is not removed from the cache when the fetch fails. + const del = !noDelete || (!proceed && bf.__staleWhileFetching === undefined); + if (del) { + this.#delete(k, 'fetch'); + } + else if (!allowStaleAborted) { + // still replace the *promise* with the stale value, + // since we are done with the promise at this point. + // leave it untouched if we're still waiting for an + // aborted background fetch that hasn't yet returned. + this.#valList[index] = bf.__staleWhileFetching; + } + } + if (allowStale) { + if (options.status && bf.__staleWhileFetching !== undefined) { + options.status.returnedStale = true; + } + return bf.__staleWhileFetching; + } + else if (bf.__returned === bf) { + throw er; + } + }; + const pcall = (res, rej) => { + const fmp = this.#fetchMethod?.(k, v, fetchOpts); + // ignored, we go until we finish, regardless. + // defer check until we are actually aborting, + // so fetchMethod can override. + ac.signal.addEventListener('abort', () => { + if (!options.ignoreFetchAbort || options.allowStaleOnFetchAbort) { + res(undefined); + // when it eventually resolves, update the cache. + if (options.allowStaleOnFetchAbort) { + res = v => cb(v, true); + } + } + }); + if (fmp && fmp instanceof Promise) { + fmp.then(v => res(v === undefined ? undefined : v), rej); + } + else if (fmp !== undefined) { + res(fmp); + } + }; + if (options.status) + options.status.fetchDispatched = true; + const p = new Promise(pcall).then(cb, eb); + const bf = Object.assign(p, { + __abortController: ac, + __staleWhileFetching: v, + __returned: undefined, + }); + if (index === undefined) { + // internal, don't expose status. + this.#set(k, bf, { ...fetchOpts.options, status: undefined }); + index = this.#keyMap.get(k); + } + else { + // do not call #set, because we do not want to adjust its place + // in the lru queue, as it has not yet been "used". Also, we don't + // need to worry about evicting for size, because a background fetch + // over a stale value is treated as the same size as its stale value. + this.#valList[index] = bf; + } + return bf; + } + #isBackgroundFetch(p) { + if (!this.#hasFetchMethod) + return false; + const b = p; + return (!!b && + b instanceof Promise && + b.hasOwnProperty('__staleWhileFetching') && + b.__abortController instanceof AbortController); + } + fetch(k, fetchOptions = {}) { + const ths = diagnostics_channel_js_1.tracing.hasSubscribers; + const { status = hasSubscribers() ? {} : undefined } = fetchOptions; + fetchOptions.status = status; + if (status && fetchOptions.context) { + status.context = fetchOptions.context; + } + const p = this.#fetch(k, fetchOptions); + if (status && ths) { + status.trace = true; + diagnostics_channel_js_1.tracing.tracePromise(() => p, status).catch(() => { }); + } + return p; + } + async #fetch(k, fetchOptions = {}) { + const { + // get options + allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, + // set options + ttl = this.ttl, noDisposeOnSet = this.noDisposeOnSet, size = 0, sizeCalculation = this.sizeCalculation, noUpdateTTL = this.noUpdateTTL, + // fetch exclusive options + noDeleteOnFetchRejection = this.noDeleteOnFetchRejection, allowStaleOnFetchRejection = this.allowStaleOnFetchRejection, ignoreFetchAbort = this.ignoreFetchAbort, allowStaleOnFetchAbort = this.allowStaleOnFetchAbort, context, forceRefresh = false, status, signal, } = fetchOptions; + if (status) { + status.op = 'fetch'; + status.key = k; + if (forceRefresh) + status.forceRefresh = true; + status.cache = this; + } + if (!this.#hasFetchMethod) { + if (status) + status.fetch = 'get'; + return this.#get(k, { + allowStale, + updateAgeOnGet, + noDeleteOnStaleGet, + status, + }); + } + const options = { + allowStale, + updateAgeOnGet, + noDeleteOnStaleGet, + ttl, + noDisposeOnSet, + size, + sizeCalculation, + noUpdateTTL, + noDeleteOnFetchRejection, + allowStaleOnFetchRejection, + allowStaleOnFetchAbort, + ignoreFetchAbort, + status, + signal, + }; + let index = this.#keyMap.get(k); + if (index === undefined) { + if (status) + status.fetch = 'miss'; + const p = this.#backgroundFetch(k, index, options, context); + return (p.__returned = p); + } + else { + // in cache, maybe already fetching + const v = this.#valList[index]; + if (this.#isBackgroundFetch(v)) { + const stale = allowStale && v.__staleWhileFetching !== undefined; + if (status) { + status.fetch = 'inflight'; + if (stale) + status.returnedStale = true; + } + return stale ? v.__staleWhileFetching : (v.__returned = v); + } + // if we force a refresh, that means do NOT serve the cached value, + // unless we are already in the process of refreshing the cache. + const isStale = this.#isStale(index); + if (!forceRefresh && !isStale) { + if (status) + status.fetch = 'hit'; + this.#moveToTail(index); + if (updateAgeOnGet) { + this.#updateItemAge(index); + } + if (status) + this.#statusTTL(status, index); + return v; + } + // ok, it is stale or a forced refresh, and not already fetching. + // refresh the cache. + const p = this.#backgroundFetch(k, index, options, context); + const hasStale = p.__staleWhileFetching !== undefined; + const staleVal = hasStale && allowStale; + if (status) { + status.fetch = isStale ? 'stale' : 'refresh'; + if (staleVal && isStale) + status.returnedStale = true; + } + return staleVal ? p.__staleWhileFetching : (p.__returned = p); + } + } + forceFetch(k, fetchOptions = {}) { + const ths = diagnostics_channel_js_1.tracing.hasSubscribers; + const { status = hasSubscribers() ? {} : undefined } = fetchOptions; + fetchOptions.status = status; + if (status && fetchOptions.context) { + status.context = fetchOptions.context; + } + const p = this.#forceFetch(k, fetchOptions); + if (status && ths) { + status.trace = true; + diagnostics_channel_js_1.tracing.tracePromise(() => p, status).catch(() => { }); + } + return p; + } + async #forceFetch(k, fetchOptions = {}) { + const v = await this.#fetch(k, fetchOptions); + if (v === undefined) + throw new Error('fetch() returned undefined'); + return v; + } + memo(k, memoOptions = {}) { + const { status = diagnostics_channel_js_1.metrics.hasSubscribers ? {} : undefined } = memoOptions; + memoOptions.status = status; + if (status) { + status.op = 'memo'; + status.key = k; + if (memoOptions.context) { + status.context = memoOptions.context; + } + status.cache = this; + } + const result = this.#memo(k, memoOptions); + if (status) + status.value = result; + if (diagnostics_channel_js_1.metrics.hasSubscribers) + diagnostics_channel_js_1.metrics.publish(status); + return result; + } + #memo(k, memoOptions = {}) { + const memoMethod = this.#memoMethod; + if (!memoMethod) { + throw new Error('no memoMethod provided to constructor'); + } + const { context, status, forceRefresh, ...options } = memoOptions; + if (status && forceRefresh) + status.forceRefresh = true; + const v = this.#get(k, options); + const refresh = forceRefresh || v === undefined; + if (status) { + status.memo = refresh ? 'miss' : 'hit'; + if (!refresh) + status.value = v; + } + if (!refresh) + return v; + const vv = memoMethod(k, v, { + options, + context, + }); + if (status) + status.value = vv; + this.#set(k, vv, options); + return vv; + } + /** + * Return a value from the cache. Will update the recency of the cache + * entry found. + * + * If the key is not found, get() will return `undefined`. + */ + get(k, getOptions = {}) { + const { status = diagnostics_channel_js_1.metrics.hasSubscribers ? {} : undefined } = getOptions; + getOptions.status = status; + if (status) { + status.op = 'get'; + status.key = k; + status.cache = this; + } + const result = this.#get(k, getOptions); + if (status) { + if (result !== undefined) + status.value = result; + if (diagnostics_channel_js_1.metrics.hasSubscribers) + diagnostics_channel_js_1.metrics.publish(status); + } + return result; + } + #get(k, getOptions = {}) { + const { allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, status, } = getOptions; + const index = this.#keyMap.get(k); + if (index === undefined) { + if (status) + status.get = 'miss'; + return undefined; + } + const value = this.#valList[index]; + const fetching = this.#isBackgroundFetch(value); + if (status) + this.#statusTTL(status, index); + if (this.#isStale(index)) { + // delete only if not an in-flight background fetch + if (!fetching) { + if (!noDeleteOnStaleGet) { + this.#delete(k, 'expire'); + } + if (status) + status.get = 'stale'; + if (allowStale) { + if (status) + status.returnedStale = true; + return value; + } + return undefined; + } + if (status) + status.get = 'stale-fetching'; + if (allowStale && value.__staleWhileFetching !== undefined) { + if (status) + status.returnedStale = true; + return value.__staleWhileFetching; + } + return undefined; + } + // not stale + if (status) + status.get = fetching ? 'fetching' : 'hit'; + // if we're currently fetching it, we don't actually have it yet + // it's not stale, which means this isn't a staleWhileRefetching. + // If it's not stale, and fetching, AND has a __staleWhileFetching + // value, then that means the user fetched with {forceRefresh:true}, + // so it's safe to return that value. + this.#moveToTail(index); + if (updateAgeOnGet) { + this.#updateItemAge(index); + } + return fetching ? value.__staleWhileFetching : value; + } + #connect(p, n) { + this.#prev[n] = p; + this.#next[p] = n; + } + #moveToTail(index) { + // if tail already, nothing to do + // if head, move head to next[index] + // else + // move next[prev[index]] to next[index] (head has no prev) + // move prev[next[index]] to prev[index] + // prev[index] = tail + // next[tail] = index + // tail = index + if (index !== this.#tail) { + if (index === this.#head) { + this.#head = this.#next[index]; + } + else { + this.#connect(this.#prev[index], this.#next[index]); + } + this.#connect(this.#tail, index); + this.#tail = index; + } + } + /** + * Deletes a key out of the cache. + * + * Returns true if the key was deleted, false otherwise. + */ + delete(k) { + return this.#delete(k, 'delete'); + } + #delete(k, reason) { + if (diagnostics_channel_js_1.metrics.hasSubscribers) { + diagnostics_channel_js_1.metrics.publish({ + op: 'delete', + delete: reason, + key: k, + cache: this, + }); + } + let deleted = false; + if (this.#size !== 0) { + const index = this.#keyMap.get(k); + if (index !== undefined) { + if (this.#autopurgeTimers?.[index]) { + clearTimeout(this.#autopurgeTimers?.[index]); + this.#autopurgeTimers[index] = undefined; + } + deleted = true; + if (this.#size === 1) { + this.#clear(reason); + } + else { + this.#removeItemSize(index); + const v = this.#valList[index]; + if (this.#isBackgroundFetch(v)) { + v.__abortController.abort(new Error('deleted')); + } + else if (this.#hasDispose || this.#hasDisposeAfter) { + if (this.#hasDispose) { + this.#dispose?.(v, k, reason); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([v, k, reason]); + } + } + this.#keyMap.delete(k); + this.#keyList[index] = undefined; + this.#valList[index] = undefined; + if (index === this.#tail) { + this.#tail = this.#prev[index]; + } + else if (index === this.#head) { + this.#head = this.#next[index]; + } + else { + const pi = this.#prev[index]; + this.#next[pi] = this.#next[index]; + const ni = this.#next[index]; + this.#prev[ni] = this.#prev[index]; + } + this.#size--; + this.#free.push(index); + } + } + } + if (this.#hasDisposeAfter && this.#disposed?.length) { + const dt = this.#disposed; + let task; + while ((task = dt?.shift())) { + this.#disposeAfter?.(...task); + } + } + return deleted; + } + /** + * Clear the cache entirely, throwing away all values. + */ + clear() { + return this.#clear('delete'); + } + #clear(reason) { + for (const index of this.#rindexes({ allowStale: true })) { + const v = this.#valList[index]; + if (this.#isBackgroundFetch(v)) { + v.__abortController.abort(new Error('deleted')); + } + else { + const k = this.#keyList[index]; + if (this.#hasDispose) { + this.#dispose?.(v, k, reason); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([v, k, reason]); + } + } + } + this.#keyMap.clear(); + void this.#valList.fill(undefined); + this.#keyList.fill(undefined); + if (this.#ttls && this.#starts) { + this.#ttls.fill(0); + this.#starts.fill(0); + for (const t of this.#autopurgeTimers ?? []) { + if (t !== undefined) + clearTimeout(t); + } + this.#autopurgeTimers?.fill(undefined); + } + if (this.#sizes) { + this.#sizes.fill(0); + } + this.#head = 0; + this.#tail = 0; + this.#free.length = 0; + this.#calculatedSize = 0; + this.#size = 0; + if (this.#hasDisposeAfter && this.#disposed) { + const dt = this.#disposed; + let task; + while ((task = dt?.shift())) { + this.#disposeAfter?.(...task); + } + } + } +} +exports.LRUCache = LRUCache; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/index.js.map b/node_modules/lru-cache/dist/commonjs/index.js.map new file mode 100644 index 00000000..81f10335 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module LRUCache\n */\n\nimport { metrics, tracing } from './diagnostics-channel.js'\nimport { defaultPerf } from './perf.js'\nimport type { Perf } from './perf.js'\nexport type { Perf } from './perf.js'\n\nconst hasSubscribers = () =>\n metrics.hasSubscribers || tracing.hasSubscribers\n\nconst warned = new Set()\n\n// either a function or a class\n// oxlint-disable-next-line no-explicit-any\ntype ForC = ((...a: any[]) => any) | { new (...a: any[]): any }\n\n/* c8 ignore start */\nconst PROCESS = (\n typeof process === 'object' && !!process ?\n process\n : {}) as { [k: string]: unknown }\n/* c8 ignore stop */\n\nconst emitWarning = (\n msg: string,\n type: string,\n code: string,\n fn: ForC,\n) => {\n if (typeof PROCESS.emitWarning === 'function') {\n PROCESS.emitWarning(msg, type, code, fn)\n } else {\n //oxlint-disable-next-line no-console\n console.error(`[${code}] ${type}: ${msg}`)\n }\n}\nconst shouldWarn = (code: string) => !warned.has(code)\n\nconst TYPE = Symbol('type')\nexport type PosInt = number & { [TYPE]: 'Positive Integer' }\nexport type Index = number & { [TYPE]: 'LRUCache Index' }\n\nconst isPosInt = (n: unknown): n is PosInt =>\n !!n && n === Math.floor(n as number) && n > 0 && isFinite(n)\n\nexport type UintArray = Uint8Array | Uint16Array | Uint32Array\nexport type NumberArray = UintArray | number[]\n\n// This is a little bit ridiculous, tbh.\n// The maximum array length is 2^32-1 or thereabouts on most JS impls.\n// And well before that point, you're caching the entire world, I mean,\n// that's ~32GB of just integers for the next/prev links, plus whatever\n// else to hold that many keys and values. Just filling the memory with\n// zeroes at init time is brutal when you get that big.\n// But why not be complete?\n// Maybe in the future, these limits will have expanded.\n/* c8 ignore start */\nconst getUintArray = (max: number) =>\n !isPosInt(max) ? null\n : max <= Math.pow(2, 8) ? Uint8Array\n : max <= Math.pow(2, 16) ? Uint16Array\n : max <= Math.pow(2, 32) ? Uint32Array\n : max <= Number.MAX_SAFE_INTEGER ? ZeroArray\n : null\n/* c8 ignore stop */\n\nclass ZeroArray extends Array {\n constructor(size: number) {\n super(size)\n this.fill(0)\n }\n}\nexport type { ZeroArray }\nexport type { Stack }\n\nexport type StackLike = Stack | Index[]\nclass Stack {\n /* c8 ignore start - not sure why this is showing up uncovered?? */\n heap: NumberArray\n /* c8 ignore stop */\n length: number\n // private constructor\n static #constructing: boolean = false\n static create(max: number): StackLike {\n const HeapCls = getUintArray(max)\n if (!HeapCls) return []\n Stack.#constructing = true\n const s = new Stack(max, HeapCls)\n Stack.#constructing = false\n return s\n }\n constructor(max: number, HeapCls: { new (n: number): NumberArray }) {\n /* c8 ignore start */\n if (!Stack.#constructing) {\n throw new TypeError('instantiate Stack using Stack.create(n)')\n }\n /* c8 ignore stop */\n this.heap = new HeapCls(max)\n this.length = 0\n }\n push(n: Index) {\n this.heap[this.length++] = n\n }\n pop(): Index {\n return this.heap[--this.length] as Index\n }\n}\n\n/**\n * Promise representing an in-progress {@link LRUCache#fetch} call\n */\nexport type BackgroundFetch = Promise & {\n __returned: BackgroundFetch | undefined\n __abortController: AbortController\n __staleWhileFetching: V | undefined\n}\n\nexport type DisposeTask = [\n value: V,\n key: K,\n reason: LRUCache.DisposeReason,\n]\n\nexport namespace LRUCache {\n /**\n * An integer greater than 0, reflecting the calculated size of items\n */\n export type Size = number\n\n /**\n * Integer greater than 0, representing some number of milliseconds, or the\n * time at which a TTL started counting from.\n */\n export type Milliseconds = number\n\n /**\n * An integer greater than 0, reflecting a number of items\n */\n export type Count = number\n\n /**\n * The reason why an item was removed from the cache, passed\n * to the {@link Disposer} methods.\n *\n * - `evict`: The item was evicted because it is the least recently used,\n * and the cache is full.\n * - `set`: A new value was set, overwriting the old value being disposed.\n * - `delete`: The item was explicitly deleted, either by calling\n * {@link LRUCache#delete}, {@link LRUCache#clear}, or\n * {@link LRUCache#set} with an undefined value.\n * - `expire`: The item was removed due to exceeding its TTL.\n * - `fetch`: A {@link OptionsBase#fetchMethod} operation returned\n * `undefined` or was aborted, causing the item to be deleted.\n */\n export type DisposeReason =\n | 'evict'\n | 'set'\n | 'delete'\n | 'expire'\n | 'fetch'\n /**\n * A method called upon item removal, passed as the\n * {@link OptionsBase.dispose} and/or\n * {@link OptionsBase.disposeAfter} options.\n */\n export type Disposer = (\n value: V,\n key: K,\n reason: DisposeReason,\n ) => void\n\n /**\n * The reason why an item was added to the cache, passed\n * to the {@link Inserter} methods.\n *\n * - `add`: the item was not found in the cache, and was added\n * - `update`: the item was in the cache, with the same value provided\n * - `replace`: the item was in the cache, and replaced\n */\n export type InsertReason = 'add' | 'update' | 'replace'\n\n /**\n * A method called upon item insertion, passed as the\n * {@link OptionsBase.insert}\n */\n export type Inserter = (\n value: V,\n key: K,\n reason: InsertReason,\n ) => void\n\n /**\n * A function that returns the effective calculated size\n * of an entry in the cache.\n */\n export type SizeCalculator = (value: V, key: K) => Size\n\n /**\n * Options provided to the\n * {@link OptionsBase.fetchMethod} function.\n */\n export interface FetcherOptions {\n signal: AbortSignal\n options: FetcherFetchOptions\n /**\n * Object provided in the {@link FetchOptions.context} option to\n * {@link LRUCache#fetch}\n */\n context: FC\n }\n\n /**\n * Occasionally, it may be useful to track the internal behavior of the\n * cache, particularly for logging, debugging, or for behavior within the\n * `fetchMethod`. To do this, you can pass a `status` object to the\n * {@link LRUCache#fetch}, {@link LRUCache#get}, {@link LRUCache#set},\n * {@link LRUCache#memo}, and {@link LRUCache#has} methods.\n *\n * The `status` option should be a plain JavaScript object. The following\n * fields will be set on it appropriately, depending on the situation.\n *\n * These objects are also the context objects passed to listeners on the\n * `lru-cache:metrics` diagnostic channel, and the `lru-cache` tracing\n * channels, in platforms that support them.\n */\n export interface Status {\n /**\n * The operation being performed\n */\n op?: 'get' | 'set' | 'memo' | 'fetch' | 'delete' | 'has' | 'peek'\n /**\n * The status of a set() operation.\n *\n * - add: the item was not found in the cache, and was added\n * - update: the item was in the cache, with the same value provided\n * - replace: the item was in the cache, and replaced\n * - miss: the item was not added to the cache for some reason\n */\n set?: 'add' | 'update' | 'replace' | 'miss' | 'deleted'\n\n /**\n * The status of a delete() operation.\n */\n delete?: LRUCache.DisposeReason\n\n /**\n * The result of a peek() operation\n *\n * - hit: the item was found and returned\n * - stale: the item is in the cache, but past its ttl and not returned\n * - miss: item not in the cache\n */\n peek?: 'hit' | 'miss' | 'stale'\n\n /**\n * The status of a memo() operation.\n *\n * - 'hit': the item was found in the cache and returned\n * - 'miss': the `memoMethod` function was called\n */\n memo?: 'hit' | 'miss'\n\n /**\n * The `context` option provided to a memo or fetch operation\n *\n * In practice, of course, this will be the same type as the `FC`\n * fetch context param used to instantiate the LRUCache, but the\n * convolutions of threading that through would get quite complicated,\n * and preclude forcing/forbidding the passing of a `context` param\n * where it is/isn't expected, which is more valuable for error\n * prevention.\n */\n context?: unknown\n\n /**\n * the ttl stored for the item, or undefined if ttls are not used.\n */\n ttl?: Milliseconds\n\n /**\n * the start time for the item, or undefined if ttls are not used.\n */\n start?: Milliseconds\n\n /**\n * The timestamp used for TTL calculation\n */\n now?: Milliseconds\n\n /**\n * the remaining ttl for the item, or undefined if ttls are not used.\n */\n remainingTTL?: Milliseconds\n\n /**\n * The calculated size for the item, if sizes are used.\n */\n entrySize?: Size\n\n /**\n * The total calculated size of the cache, if sizes are used.\n */\n totalCalculatedSize?: Size\n\n /**\n * A flag indicating that the item was not stored, due to exceeding the\n * {@link OptionsBase.maxEntrySize}\n */\n maxEntrySizeExceeded?: true\n\n /**\n * The key that was set or retrieved\n */\n key?: K\n\n /**\n * The value that was set\n */\n value?: V\n\n /**\n * The old value, specified in the case of `set:'replace'`\n */\n oldValue?: V\n\n /**\n * The results of a {@link LRUCache#has} operation\n *\n * - hit: the item was found in the cache\n * - stale: the item was found in the cache, but is stale\n * - miss: the item was not found in the cache\n */\n has?: 'hit' | 'stale' | 'miss'\n\n /**\n * The status of a {@link LRUCache#fetch} operation.\n * Note that this can change as the underlying fetch() moves through\n * various states.\n *\n * - inflight: there is another fetch() for this key which is in process\n * - get: there is no {@link OptionsBase.fetchMethod}, so\n * {@link LRUCache#get} was called.\n * - miss: the item is not in cache, and will be fetched.\n * - hit: the item is in the cache, and was resolved immediately.\n * - stale: the item is in the cache, but stale.\n * - refresh: the item is in the cache, and not stale, but\n * {@link FetchOptions.forceRefresh} was specified.\n */\n fetch?: 'get' | 'inflight' | 'miss' | 'hit' | 'stale' | 'refresh'\n\n /**\n * `forceRefresh` option was used for either a fetch or memo operation\n */\n forceRefresh?: boolean\n\n /**\n * The {@link OptionsBase.fetchMethod} was called\n */\n fetchDispatched?: true\n\n /**\n * The cached value was updated after a successful call to\n * {@link OptionsBase.fetchMethod}\n */\n fetchUpdated?: true\n\n /**\n * The reason for a fetch() rejection. Either the error raised by the\n * {@link OptionsBase.fetchMethod}, or the reason for an\n * AbortSignal.\n */\n fetchError?: Error\n\n /**\n * The fetch received an abort signal\n */\n fetchAborted?: true\n\n /**\n * The abort signal received was ignored, and the fetch was allowed to\n * continue in the background.\n */\n fetchAbortIgnored?: true\n\n /**\n * The fetchMethod promise resolved successfully\n */\n fetchResolved?: true\n\n /**\n * The fetchMethod promise was rejected\n */\n fetchRejected?: true\n\n /**\n * The status of a {@link LRUCache#get} operation.\n *\n * - fetching: The item is currently being fetched. If a previous value\n * is present and allowed, that will be returned.\n * - stale: The item is in the cache, and is stale. If it was returned,\n * then the `returnedStale` flag will be set.\n * - stale-fetching: The value is being fetched in the background, but is\n * currently stale. If the stale value was returned, then the\n * `returnedStale` flag will be set.\n * - hit: the item is in the cache\n * - miss: the item is not in the cache\n */\n get?: 'stale' | 'hit' | 'miss' | 'fetching' | 'stale-fetching'\n\n /**\n * A fetch or get operation returned a stale value.\n */\n returnedStale?: true\n\n /**\n * A tracingChannel trace was started for this operation\n */\n trace?: boolean\n\n /**\n * A reference to the cache instance associated with this operation\n */\n cache?: LRUCache\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#fetch}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link OptionsBase.noDeleteOnFetchRejection},\n * {@link OptionsBase.allowStaleOnFetchRejection},\n * {@link FetchOptions.forceRefresh}, and\n * {@link FetcherOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.fetchMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the fetchMethod is called.\n */\n export interface FetcherFetchOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n status?: Status\n size?: Size\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#fetch} method.\n */\n export interface FetchOptions extends FetcherFetchOptions<\n K,\n V,\n FC\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.fetchMethod} as\n * the {@link FetcherOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n signal?: AbortSignal\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface FetchOptionsWithContext extends FetchOptions<\n K,\n V,\n FC\n > {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is\n * `undefined` or `void`\n */\n export interface FetchOptionsNoContext<\n K,\n V,\n FC extends undefined | void = undefined,\n > extends FetchOptions {\n context?: FC\n }\n\n export interface MemoOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.memoMethod} as\n * the {@link MemoizerOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface MemoOptionsWithContext extends MemoOptions<\n K,\n V,\n FC\n > {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is\n * `undefined` or `void`\n */\n export interface MemoOptionsNoContext<\n K,\n V,\n FC extends undefined | void = undefined,\n > extends MemoOptions {\n context?: FC\n }\n\n /**\n * Options provided to the\n * {@link OptionsBase.memoMethod} function.\n */\n export interface MemoizerOptions {\n options: MemoizerMemoOptions\n /**\n * Object provided in the {@link MemoOptions.context} option to\n * {@link LRUCache#memo}\n */\n context: FC\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#memo}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link MemoOptions.forceRefresh}, and\n * {@link MemoOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.memoMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the memoMethod is called.\n */\n export interface MemoizerMemoOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n > {\n status?: Status\n size?: Size\n start?: Milliseconds\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#has} method.\n */\n export interface HasOptions extends Pick<\n OptionsBase,\n 'updateAgeOnHas'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#get} method.\n */\n export interface GetOptions extends Pick<\n OptionsBase,\n 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#peek} method.\n */\n export interface PeekOptions extends Pick<\n OptionsBase,\n 'allowStale'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#set} method.\n */\n export interface SetOptions extends Pick<\n OptionsBase,\n 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'\n > {\n /**\n * If size tracking is enabled, then setting an explicit size\n * in the {@link LRUCache#set} call will prevent calling the\n * {@link OptionsBase.sizeCalculation} function.\n */\n size?: Size\n /**\n * If TTL tracking is enabled, then setting an explicit start\n * time in the {@link LRUCache#set} call will override the\n * default time from `performance.now()` or `Date.now()`.\n *\n * Note that it must be a valid value for whichever time-tracking\n * method is in use.\n */\n start?: Milliseconds\n status?: Status\n }\n\n /**\n * The type signature for the {@link OptionsBase.fetchMethod} option.\n */\n export type Fetcher = (\n key: K,\n staleValue: V | undefined,\n options: FetcherOptions,\n ) => Promise | V | undefined | void\n\n /**\n * the type signature for the {@link OptionsBase.memoMethod} option.\n */\n export type Memoizer = (\n key: K,\n staleValue: V | undefined,\n options: MemoizerOptions,\n ) => V\n\n /**\n * Options which may be passed to the {@link LRUCache} constructor.\n *\n * Most of these may be overridden in the various options that use\n * them.\n *\n * Despite all being technically optional, the constructor requires that\n * a cache is at minimum limited by one or more of {@link OptionsBase.max},\n * {@link OptionsBase.ttl}, or {@link OptionsBase.maxSize}.\n *\n * If {@link OptionsBase.ttl} is used alone, then it is strongly advised\n * (and in fact required by the type definitions here) that the cache\n * also set {@link OptionsBase.ttlAutopurge}, to prevent potentially\n * unbounded storage.\n *\n * All options are also available on the {@link LRUCache} instance, making\n * it safe to pass an LRUCache instance as the options argumemnt to\n * make another empty cache of the same type.\n *\n * Some options are marked as read-only, because changing them after\n * instantiation is not safe. Changing any of the other options will of\n * course only have an effect on subsequent method calls.\n */\n export interface OptionsBase {\n /**\n * The maximum number of items to store in the cache before evicting\n * old entries. This is read-only on the {@link LRUCache} instance,\n * and may not be overridden.\n *\n * If set, then storage space will be pre-allocated at construction\n * time, and the cache will perform significantly faster.\n *\n * Note that significantly fewer items may be stored, if\n * {@link OptionsBase.maxSize} and/or {@link OptionsBase.ttl} are also\n * set.\n *\n * **It is strongly recommended to set a `max` to prevent unbounded growth\n * of the cache.**\n */\n max?: Count\n\n /**\n * Max time in milliseconds for items to live in cache before they are\n * considered stale. Note that stale items are NOT preemptively removed by\n * default, and MAY live in the cache, contributing to its LRU max, long\n * after they have expired, unless {@link OptionsBase.ttlAutopurge} is\n * set.\n *\n * If set to `0` (the default value), then that means \"do not track\n * TTL\", not \"expire immediately\".\n *\n * Also, as this cache is optimized for LRU/MRU operations, some of\n * the staleness/TTL checks will reduce performance, as they will incur\n * overhead by deleting items.\n *\n * This is not primarily a TTL cache, and does not make strong TTL\n * guarantees. There is no pre-emptive pruning of expired items, but you\n * _may_ set a TTL on the cache, and it will treat expired items as missing\n * when they are fetched, and delete them.\n *\n * Optional, but must be a non-negative integer in ms if specified.\n *\n * This may be overridden by passing an options object to `cache.set()`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if ttl tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * If ttl tracking is enabled, and `max` and `maxSize` are not set,\n * and `ttlAutopurge` is not set, then a warning will be emitted\n * cautioning about the potential for unbounded memory consumption.\n * (The TypeScript definitions will also discourage this.)\n */\n ttl?: Milliseconds\n\n /**\n * Minimum amount of time in ms in which to check for staleness.\n * Defaults to 1, which means that the current time is checked\n * at most once per millisecond.\n *\n * Set to 0 to check the current time every time staleness is tested.\n * (This reduces performance, and is theoretically unnecessary.)\n *\n * Setting this to a higher value will improve performance somewhat\n * while using ttl tracking, albeit at the expense of keeping stale\n * items around a bit longer than their TTLs would indicate.\n *\n * @default 1\n */\n ttlResolution?: Milliseconds\n\n /**\n * Preemptively remove stale items from the cache.\n *\n * Note that this may *significantly* degrade performance, especially if\n * the cache is storing a large number of items. It is almost always best\n * to just leave the stale items in the cache, and let them fall out as new\n * items are added.\n *\n * Note that this means that {@link OptionsBase.allowStale} is a bit\n * pointless, as stale items will be deleted almost as soon as they\n * expire.\n *\n * Use with caution!\n */\n ttlAutopurge?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever it is retrieved from cache with\n * {@link LRUCache#get}, causing it to not expire. (It can still fall out\n * of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n */\n updateAgeOnGet?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever its presence in the cache is\n * checked with {@link LRUCache#has}, causing it to not expire. (It can\n * still fall out of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n */\n updateAgeOnHas?: boolean\n\n /**\n * Allow {@link LRUCache#get} and {@link LRUCache#fetch} calls to return\n * stale data, if available.\n *\n * By default, if you set `ttl`, stale items will only be deleted from the\n * cache when you `get(key)`. That is, it's not preemptively pruning items,\n * unless {@link OptionsBase.ttlAutopurge} is set.\n *\n * If you set `allowStale:true`, it'll return the stale value *as well as*\n * deleting it. If you don't set this, then it'll return `undefined` when\n * you try to get a stale entry.\n *\n * Note that when a stale entry is fetched, _even if it is returned due to\n * `allowStale` being set_, it is removed from the cache immediately. You\n * can suppress this behavior by setting\n * {@link OptionsBase.noDeleteOnStaleGet}, either in the constructor, or in\n * the options provided to {@link LRUCache#get}.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n * The `cache.has()` method will always return `false` for stale items.\n *\n * Only relevant if a ttl is set.\n */\n allowStale?: boolean\n\n /**\n * Function that is called on items when they are dropped from the\n * cache, as `dispose(value, key, reason)`.\n *\n * This can be handy if you want to close file descriptors or do\n * other cleanup tasks when items are no longer stored in the cache.\n *\n * **NOTE**: It is called _before_ the item has been fully removed\n * from the cache, so if you want to put it right back in, you need\n * to wait until the next tick. If you try to add it back in during\n * the `dispose()` function call, it will break things in subtle and\n * weird ways.\n *\n * Unlike several other options, this may _not_ be overridden by\n * passing an option to `set()`, for performance reasons.\n *\n * The `reason` will be one of the following strings, corresponding\n * to the reason for the item's deletion:\n *\n * - `evict` Item was evicted to make space for a new addition\n * - `set` Item was overwritten by a new value\n * - `expire` Item expired its TTL\n * - `fetch` Item was deleted due to a failed or aborted fetch, or a\n * fetchMethod returning `undefined.\n * - `delete` Item was removed by explicit `cache.delete(key)`,\n * `cache.clear()`, or `cache.set(key, undefined)`.\n */\n dispose?: Disposer\n\n /**\n * Function that is called when new items are inserted into the cache,\n * as `onInsert(value, key, reason)`.\n *\n * This can be useful if you need to perform actions when an item is\n * added, such as logging or tracking insertions.\n *\n * Unlike some other options, this may _not_ be overridden by passing\n * an option to `set()`, for performance and consistency reasons.\n */\n onInsert?: Inserter\n\n /**\n * The same as {@link OptionsBase.dispose}, but called *after* the entry\n * is completely removed and the cache is once again in a clean state.\n *\n * It is safe to add an item right back into the cache at this point.\n * However, note that it is *very* easy to inadvertently create infinite\n * recursion this way.\n */\n disposeAfter?: Disposer\n\n /**\n * Set to true to suppress calling the\n * {@link OptionsBase.dispose} function if the entry key is\n * still accessible within the cache.\n *\n * This may be overridden by passing an options object to\n * {@link LRUCache#set}.\n *\n * Only relevant if `dispose` or `disposeAfter` are set.\n */\n noDisposeOnSet?: boolean\n\n /**\n * Boolean flag to tell the cache to not update the TTL when setting a new\n * value for an existing key (ie, when updating a value rather than\n * inserting a new value). Note that the TTL value is _always_ set (if\n * provided) when adding a new entry into the cache.\n *\n * Has no effect if a {@link OptionsBase.ttl} is not set.\n *\n * May be passed as an option to {@link LRUCache#set}.\n */\n noUpdateTTL?: boolean\n\n /**\n * Set to a positive integer to track the sizes of items added to the\n * cache, and automatically evict items in order to stay below this size.\n * Note that this may result in fewer than `max` items being stored.\n *\n * Attempting to add an item to the cache whose calculated size is greater\n * that this amount will be a no-op. The item will not be cached, and no\n * other items will be evicted.\n *\n * Optional, must be a positive integer if provided.\n *\n * Sets `maxEntrySize` to the same value, unless a different value is\n * provided for `maxEntrySize`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if size tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * Note also that size tracking can negatively impact performance,\n * though for most cases, only minimally.\n */\n maxSize?: Size\n\n /**\n * The effective size for background fetch promises.\n *\n * This has no effect unless `maxSize` and `sizeCalculation` are used,\n * and a {@link LRUCache.OptionsBase.fetchMethod} is provided to\n * support {@link LRUCache#fetch}.\n *\n * If a stale value is present in the cache, then the effective size of\n * the background fetch is the size of the stale item it will eventually\n * replace. If not, then this value is used as its effective size.\n *\n * @default 1\n */\n backgroundFetchSize?: number\n\n /**\n * The maximum allowed size for any single item in the cache.\n *\n * If a larger item is passed to {@link LRUCache#set} or returned by a\n * {@link OptionsBase.fetchMethod} or {@link OptionsBase.memoMethod}, then\n * it will not be stored in the cache.\n *\n * Attempting to add an item whose calculated size is greater than\n * this amount will not cache the item or evict any old items, but\n * WILL delete an existing value if one is already present.\n *\n * Optional, must be a positive integer if provided. Defaults to\n * the value of `maxSize` if provided.\n */\n maxEntrySize?: Size\n\n /**\n * A function that returns a number indicating the item's size.\n *\n * Requires {@link OptionsBase.maxSize} to be set.\n *\n * If not provided, and {@link OptionsBase.maxSize} or\n * {@link OptionsBase.maxEntrySize} are set, then all\n * {@link LRUCache#set} calls **must** provide an explicit\n * {@link SetOptions.size} or sizeCalculation param.\n */\n sizeCalculation?: SizeCalculator\n\n /**\n * Method that provides the implementation for {@link LRUCache#fetch}\n *\n * ```ts\n * fetchMethod(key, staleValue, { signal, options, context })\n * ```\n *\n * If `fetchMethod` is not provided, then `cache.fetch(key)` is equivalent\n * to `Promise.resolve(cache.get(key))`.\n *\n * If at any time, `signal.aborted` is set to `true`, or if the\n * `signal.onabort` method is called, or if it emits an `'abort'` event\n * which you can listen to with `addEventListener`, then that means that\n * the fetch should be abandoned. This may be passed along to async\n * functions aware of AbortController/AbortSignal behavior.\n *\n * The `fetchMethod` should **only** return `undefined` or a Promise\n * resolving to `undefined` if the AbortController signaled an `abort`\n * event. In all other cases, it should return or resolve to a value\n * suitable for adding to the cache.\n *\n * The `options` object is a union of the options that may be provided to\n * `set()` and `get()`. If they are modified, then that will result in\n * modifying the settings to `cache.set()` when the value is resolved, and\n * in the case of\n * {@link OptionsBase.noDeleteOnFetchRejection} and\n * {@link OptionsBase.allowStaleOnFetchRejection}, the handling of\n * `fetchMethod` failures.\n *\n * For example, a DNS cache may update the TTL based on the value returned\n * from a remote DNS server by changing `options.ttl` in the `fetchMethod`.\n */\n fetchMethod?: Fetcher\n\n /**\n * Method that provides the implementation for {@link LRUCache#memo}\n */\n memoMethod?: Memoizer\n\n /**\n * Set to true to suppress the deletion of stale data when a\n * {@link OptionsBase.fetchMethod} returns a rejected promise.\n */\n noDeleteOnFetchRejection?: boolean\n\n /**\n * Do not delete stale items when they are retrieved with\n * {@link LRUCache#get}.\n *\n * Note that the `get` return value will still be `undefined`\n * unless {@link OptionsBase.allowStale} is true.\n *\n * When using time-expiring entries with `ttl`, by default stale\n * items will be removed from the cache when the key is accessed\n * with `cache.get()`.\n *\n * Setting this option will cause stale items to remain in the cache, until\n * they are explicitly deleted with `cache.delete(key)`, or retrieved with\n * `noDeleteOnStaleGet` set to `false`.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n *\n * Only relevant if a ttl is used.\n */\n noDeleteOnStaleGet?: boolean\n\n /**\n * Set to true to allow returning stale data when a\n * {@link OptionsBase.fetchMethod} throws an error or returns a rejected\n * promise.\n *\n * This differs from using {@link OptionsBase.allowStale} in that stale\n * data will ONLY be returned in the case that the {@link LRUCache#fetch}\n * fails, not any other times.\n *\n * If a `fetchMethod` fails, and there is no stale value available, the\n * `fetch()` will resolve to `undefined`. Ie, all `fetchMethod` errors are\n * suppressed.\n *\n * Implies `noDeleteOnFetchRejection`.\n *\n * This may be set in calls to `fetch()`, or defaulted on the constructor,\n * or overridden by modifying the options object in the `fetchMethod`.\n */\n allowStaleOnFetchRejection?: boolean\n\n /**\n * Set to true to return a stale value from the cache when the\n * `AbortSignal` passed to the {@link OptionsBase.fetchMethod} dispatches\n * an `'abort'` event, whether user-triggered, or due to internal cache\n * behavior.\n *\n * Unless {@link OptionsBase.ignoreFetchAbort} is also set, the underlying\n * {@link OptionsBase.fetchMethod} will still be considered canceled, and\n * any value it returns will be ignored and not cached.\n *\n * Caveat: since fetches are aborted when a new value is explicitly\n * set in the cache, this can lead to fetch returning a stale value,\n * since that was the fallback value _at the moment the `fetch()` was\n * initiated_, even though the new updated value is now present in\n * the cache.\n *\n * For example:\n *\n * ```ts\n * const cache = new LRUCache({\n * ttl: 100,\n * fetchMethod: async (url, oldValue, { signal }) => {\n * const res = await fetch(url, { signal })\n * return await res.json()\n * }\n * })\n * cache.set('https://example.com/', { some: 'data' })\n * // 100ms go by...\n * const result = cache.fetch('https://example.com/')\n * cache.set('https://example.com/', { other: 'thing' })\n * console.log(await result) // { some: 'data' }\n * console.log(cache.get('https://example.com/')) // { other: 'thing' }\n * ```\n */\n allowStaleOnFetchAbort?: boolean\n\n /**\n * Set to true to ignore the `abort` event emitted by the `AbortSignal`\n * object passed to {@link OptionsBase.fetchMethod}, and still cache the\n * resulting resolution value, as long as it is not `undefined`.\n *\n * When used on its own, this means aborted {@link LRUCache#fetch} calls\n * are not immediately resolved or rejected when they are aborted, and\n * instead take the full time to await.\n *\n * When used with {@link OptionsBase.allowStaleOnFetchAbort}, aborted\n * {@link LRUCache#fetch} calls will resolve immediately to their stale\n * cached value or `undefined`, and will continue to process and eventually\n * update the cache when they resolve, as long as the resulting value is\n * not `undefined`, thus supporting a \"return stale on timeout while\n * refreshing\" mechanism by passing `AbortSignal.timeout(n)` as the signal.\n *\n * For example:\n *\n * ```ts\n * const c = new LRUCache({\n * ttl: 100,\n * ignoreFetchAbort: true,\n * allowStaleOnFetchAbort: true,\n * fetchMethod: async (key, oldValue, { signal }) => {\n * // note: do NOT pass the signal to fetch()!\n * // let's say this fetch can take a long time.\n * const res = await fetch(`https://slow-backend-server/${key}`)\n * return await res.json()\n * },\n * })\n *\n * // this will return the stale value after 100ms, while still\n * // updating in the background for next time.\n * const val = await c.fetch('key', { signal: AbortSignal.timeout(100) })\n * ```\n *\n * **Note**: regardless of this setting, an `abort` event _is still\n * emitted on the `AbortSignal` object_, so may result in invalid results\n * when passed to other underlying APIs that use AbortSignals.\n *\n * This may be overridden in the {@link OptionsBase.fetchMethod} or the\n * call to {@link LRUCache#fetch}.\n */\n ignoreFetchAbort?: boolean\n\n /**\n * In some cases, you may want to swap out the performance/Date object\n * used for TTL tracking. This should almost certainly NOT be done in\n * production environments!\n *\n * This value defaults to `global.performance` if it has a `now()` method,\n * or the `global.Date` object otherwise.\n */\n perf?: Perf\n }\n\n export interface OptionsMaxLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n max: Count\n }\n export interface OptionsTTLLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n ttl: Milliseconds\n ttlAutopurge: boolean\n }\n export interface OptionsSizeLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n maxSize: Size\n }\n\n /**\n * The valid safe options for the {@link LRUCache} constructor\n */\n export type Options =\n | OptionsMaxLimit\n | OptionsSizeLimit\n | OptionsTTLLimit\n\n /**\n * Entry objects used by {@link LRUCache#load} and {@link LRUCache#dump},\n * and returned by {@link LRUCache#info}.\n */\n export interface Entry {\n value: V\n ttl?: Milliseconds\n size?: Size\n start?: Milliseconds\n }\n}\n\n/**\n * Default export, the thing you're using this module to get.\n *\n * The `K` and `V` types define the key and value types, respectively. The\n * optional `FC` type defines the type of the `context` object passed to\n * `cache.fetch()` and `cache.memo()`.\n *\n * Keys and values **must not** be `null` or `undefined`.\n *\n * All properties from the options object (with the exception of `max`,\n * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are\n * added as normal public members. (The listed options are read-only getters.)\n *\n * Changing any of these will alter the defaults for subsequent method calls.\n */\nexport class LRUCache {\n // options that cannot be changed without disaster\n readonly #max: LRUCache.Count\n readonly #maxSize: LRUCache.Size\n readonly #dispose?: LRUCache.Disposer\n readonly #onInsert?: LRUCache.Inserter\n readonly #disposeAfter?: LRUCache.Disposer\n readonly #fetchMethod?: LRUCache.Fetcher\n readonly #memoMethod?: LRUCache.Memoizer\n readonly #perf: Perf\n\n /**\n * {@link LRUCache.OptionsBase.perf}\n */\n get perf() {\n return this.#perf\n }\n\n /**\n * {@link LRUCache.OptionsBase.ttl}\n */\n ttl: LRUCache.Milliseconds\n\n /**\n * {@link LRUCache.OptionsBase.ttlResolution}\n */\n ttlResolution: LRUCache.Milliseconds\n /**\n * {@link LRUCache.OptionsBase.ttlAutopurge}\n */\n ttlAutopurge: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnGet}\n */\n updateAgeOnGet: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnHas}\n */\n updateAgeOnHas: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStale}\n */\n allowStale: boolean\n\n /**\n * {@link LRUCache.OptionsBase.noDisposeOnSet}\n */\n noDisposeOnSet: boolean\n /**\n * {@link LRUCache.OptionsBase.noUpdateTTL}\n */\n noUpdateTTL: boolean\n /**\n * {@link LRUCache.OptionsBase.maxEntrySize}\n */\n maxEntrySize: LRUCache.Size\n /**\n * {@link LRUCache.OptionsBase.sizeCalculation}\n */\n sizeCalculation?: LRUCache.SizeCalculator\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection}\n */\n noDeleteOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnStaleGet}\n */\n noDeleteOnStaleGet: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}\n */\n allowStaleOnFetchAbort: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection}\n */\n allowStaleOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.ignoreFetchAbort}\n */\n ignoreFetchAbort: boolean\n\n /** {@link LRUCache.OptionsBase.backgroundFetchSize} */\n backgroundFetchSize: number\n\n // computed properties\n #size: LRUCache.Count\n #calculatedSize: LRUCache.Size\n #keyMap: Map\n #keyList: (K | undefined)[]\n #valList: (V | BackgroundFetch | undefined)[]\n #next: NumberArray\n #prev: NumberArray\n #head: Index\n #tail: Index\n #free: StackLike\n #disposed?: DisposeTask[]\n #sizes?: ZeroArray\n #starts?: ZeroArray\n #ttls?: ZeroArray\n #autopurgeTimers?: (undefined | ReturnType)[]\n\n #hasDispose: boolean\n #hasFetchMethod: boolean\n #hasDisposeAfter: boolean\n #hasOnInsert: boolean\n\n /**\n * Do not call this method unless you need to inspect the\n * inner workings of the cache. If anything returned by this\n * object is modified in any way, strange breakage may occur.\n *\n * These fields are private for a reason!\n *\n * @internal\n */\n static unsafeExposeInternals<\n K extends {},\n V extends {},\n FC extends unknown = unknown,\n >(c: LRUCache) {\n return {\n // properties\n starts: c.#starts,\n ttls: c.#ttls,\n autopurgeTimers: c.#autopurgeTimers,\n sizes: c.#sizes,\n keyMap: c.#keyMap as Map,\n keyList: c.#keyList,\n valList: c.#valList,\n next: c.#next,\n prev: c.#prev,\n get head() {\n return c.#head\n },\n get tail() {\n return c.#tail\n },\n free: c.#free,\n // methods\n isBackgroundFetch: (p: unknown) => c.#isBackgroundFetch(p),\n backgroundFetch: (\n k: K,\n index: number | undefined,\n options: LRUCache.FetchOptions,\n context: unknown,\n ): BackgroundFetch =>\n c.#backgroundFetch(\n k,\n index as Index | undefined,\n options,\n context as FC,\n ),\n moveToTail: (index: number): void => c.#moveToTail(index as Index),\n indexes: (options?: { allowStale: boolean }) => c.#indexes(options),\n rindexes: (options?: { allowStale: boolean }) =>\n c.#rindexes(options),\n isStale: (index: number | undefined) => c.#isStale(index as Index),\n }\n }\n\n // Protected read-only members\n\n /**\n * {@link LRUCache.OptionsBase.max} (read-only)\n */\n get max(): LRUCache.Count {\n return this.#max\n }\n /**\n * {@link LRUCache.OptionsBase.maxSize} (read-only)\n */\n get maxSize(): LRUCache.Count {\n return this.#maxSize\n }\n /**\n * The total computed size of items in the cache (read-only)\n */\n get calculatedSize(): LRUCache.Size {\n return this.#calculatedSize\n }\n /**\n * The number of items stored in the cache (read-only)\n */\n get size(): LRUCache.Count {\n return this.#size\n }\n /**\n * {@link LRUCache.OptionsBase.fetchMethod} (read-only)\n */\n get fetchMethod(): LRUCache.Fetcher | undefined {\n return this.#fetchMethod\n }\n get memoMethod(): LRUCache.Memoizer | undefined {\n return this.#memoMethod\n }\n /**\n * {@link LRUCache.OptionsBase.dispose} (read-only)\n */\n get dispose() {\n return this.#dispose\n }\n /**\n * {@link LRUCache.OptionsBase.onInsert} (read-only)\n */\n get onInsert() {\n return this.#onInsert\n }\n /**\n * {@link LRUCache.OptionsBase.disposeAfter} (read-only)\n */\n get disposeAfter() {\n return this.#disposeAfter\n }\n\n constructor(options: LRUCache.Options | LRUCache) {\n const {\n max = 0,\n ttl,\n ttlResolution = 1,\n ttlAutopurge,\n updateAgeOnGet,\n updateAgeOnHas,\n allowStale,\n dispose,\n onInsert,\n disposeAfter,\n noDisposeOnSet,\n noUpdateTTL,\n maxSize = 0,\n maxEntrySize = 0,\n sizeCalculation,\n fetchMethod,\n memoMethod,\n noDeleteOnFetchRejection,\n noDeleteOnStaleGet,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n backgroundFetchSize = 1,\n perf,\n } = options\n\n this.backgroundFetchSize = backgroundFetchSize\n\n if (perf !== undefined) {\n if (typeof perf?.now !== 'function') {\n throw new TypeError(\n 'perf option must have a now() method if specified',\n )\n }\n }\n\n this.#perf = perf ?? defaultPerf\n\n if (max !== 0 && !isPosInt(max)) {\n throw new TypeError('max option must be a nonnegative integer')\n }\n\n const UintArray = max ? getUintArray(max) : Array\n if (!UintArray) {\n throw new Error('invalid max value: ' + max)\n }\n\n this.#max = max\n this.#maxSize = maxSize\n this.maxEntrySize = maxEntrySize || this.#maxSize\n this.sizeCalculation = sizeCalculation\n if (this.sizeCalculation) {\n if (!this.#maxSize && !this.maxEntrySize) {\n throw new TypeError(\n 'cannot set sizeCalculation without setting maxSize or maxEntrySize',\n )\n }\n if (typeof this.sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation set to non-function')\n }\n }\n\n if (memoMethod !== undefined && typeof memoMethod !== 'function') {\n throw new TypeError('memoMethod must be a function if defined')\n }\n this.#memoMethod = memoMethod\n\n if (fetchMethod !== undefined && typeof fetchMethod !== 'function') {\n throw new TypeError('fetchMethod must be a function if specified')\n }\n this.#fetchMethod = fetchMethod\n this.#hasFetchMethod = !!fetchMethod\n\n this.#keyMap = new Map()\n this.#keyList = Array.from({ length: max }).fill(undefined) as (\n | K\n | undefined\n )[]\n this.#valList = Array.from({ length: max }).fill(undefined) as (\n | V\n | undefined\n )[]\n this.#next = new UintArray(max)\n this.#prev = new UintArray(max)\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free = Stack.create(max)\n this.#size = 0\n this.#calculatedSize = 0\n\n if (typeof dispose === 'function') {\n this.#dispose = dispose\n }\n if (typeof onInsert === 'function') {\n this.#onInsert = onInsert\n }\n if (typeof disposeAfter === 'function') {\n this.#disposeAfter = disposeAfter\n this.#disposed = []\n } else {\n this.#disposeAfter = undefined\n this.#disposed = undefined\n }\n this.#hasDispose = !!this.#dispose\n this.#hasOnInsert = !!this.#onInsert\n this.#hasDisposeAfter = !!this.#disposeAfter\n\n this.noDisposeOnSet = !!noDisposeOnSet\n this.noUpdateTTL = !!noUpdateTTL\n this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection\n this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection\n this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort\n this.ignoreFetchAbort = !!ignoreFetchAbort\n\n // NB: maxEntrySize is set to maxSize if it's set\n if (this.maxEntrySize !== 0) {\n if (this.#maxSize !== 0) {\n if (!isPosInt(this.#maxSize)) {\n throw new TypeError(\n 'maxSize must be a positive integer if specified',\n )\n }\n }\n if (!isPosInt(this.maxEntrySize)) {\n throw new TypeError(\n 'maxEntrySize must be a positive integer if specified',\n )\n }\n this.#initializeSizeTracking()\n }\n\n this.allowStale = !!allowStale\n this.noDeleteOnStaleGet = !!noDeleteOnStaleGet\n this.updateAgeOnGet = !!updateAgeOnGet\n this.updateAgeOnHas = !!updateAgeOnHas\n this.ttlResolution =\n isPosInt(ttlResolution) || ttlResolution === 0 ? ttlResolution : 1\n this.ttlAutopurge = !!ttlAutopurge\n this.ttl = ttl || 0\n if (this.ttl) {\n if (!isPosInt(this.ttl)) {\n throw new TypeError('ttl must be a positive integer if specified')\n }\n this.#initializeTTLTracking()\n }\n\n // do not allow completely unbounded caches\n if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) {\n throw new TypeError(\n 'At least one of max, maxSize, or ttl is required',\n )\n }\n if (!this.ttlAutopurge && !this.#max && !this.#maxSize) {\n const code = 'LRU_CACHE_UNBOUNDED'\n if (shouldWarn(code)) {\n warned.add(code)\n const msg =\n 'TTL caching without ttlAutopurge, max, or maxSize can ' +\n 'result in unbounded memory consumption.'\n emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache)\n }\n }\n }\n\n /**\n * Return the number of ms left in the item's TTL. If item is not in cache,\n * returns `0`. Returns `Infinity` if item is in cache without a defined TTL.\n */\n getRemainingTTL(key: K) {\n return this.#keyMap.has(key) ? Infinity : 0\n }\n\n #initializeTTLTracking() {\n const ttls = new ZeroArray(this.#max)\n const starts = new ZeroArray(this.#max)\n this.#ttls = ttls\n this.#starts = starts\n const purgeTimers =\n this.ttlAutopurge ?\n Array.from>({\n length: this.#max,\n })\n : undefined\n this.#autopurgeTimers = purgeTimers\n\n this.#setItemTTL = (index, ttl, start = this.#perf.now()) => {\n starts[index] = ttl !== 0 ? start : 0\n ttls[index] = ttl\n setPurgetTimer(index, ttl)\n }\n\n this.#updateItemAge = index => {\n starts[index] = ttls[index] !== 0 ? this.#perf.now() : 0\n setPurgetTimer(index, ttls[index])\n }\n\n // clear out the purge timer if we're setting TTL to 0, and\n // previously had a ttl purge timer running, so it doesn't\n // fire unnecessarily. Don't need to do this if we're not doing\n // autopurge.\n const setPurgetTimer =\n !this.ttlAutopurge ?\n () => {}\n : (index: Index, ttl?: number) => {\n if (purgeTimers?.[index]) {\n clearTimeout(purgeTimers[index])\n purgeTimers[index] = undefined\n }\n if (ttl && ttl !== 0 && purgeTimers) {\n const t = setTimeout(() => {\n if (this.#isStale(index)) {\n this.#delete(this.#keyList[index] as K, 'expire')\n }\n }, ttl + 1)\n // unref() not supported on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n purgeTimers[index] = t\n }\n }\n\n this.#statusTTL = (status, index) => {\n if (ttls[index]) {\n const ttl = ttls[index]\n const start = starts[index]\n /* c8 ignore start */\n if (!ttl || !start) {\n return\n }\n /* c8 ignore stop */\n status.ttl = ttl\n status.start = start\n status.now = cachedNow || getNow()\n const age = status.now - start\n status.remainingTTL = ttl - age\n }\n }\n\n // debounce calls to perf.now() to 1s so we're not hitting\n // that costly call repeatedly.\n let cachedNow = 0\n const getNow = () => {\n const n = this.#perf.now()\n if (this.ttlResolution > 0) {\n cachedNow = n\n const t = setTimeout(() => (cachedNow = 0), this.ttlResolution)\n // not available on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n }\n return n\n }\n\n this.getRemainingTTL = key => {\n const index = this.#keyMap.get(key)\n if (index === undefined) {\n return 0\n }\n const ttl = ttls[index]\n const start = starts[index]\n if (!ttl || !start) {\n return Infinity\n }\n const age = (cachedNow || getNow()) - start\n return ttl - age\n }\n\n this.#isStale = index => {\n const s = starts[index]\n const t = ttls[index]\n return !!t && !!s && (cachedNow || getNow()) - s > t\n }\n }\n\n // conditionally set private methods related to TTL\n #updateItemAge: (index: Index) => void = () => {}\n #statusTTL: (status: LRUCache.Status, index: Index) => void =\n () => {}\n #setItemTTL: (\n index: Index,\n ttl: LRUCache.Milliseconds,\n start?: LRUCache.Milliseconds,\n // ignore because we never call this if we're not already in TTL mode\n /* c8 ignore start */\n ) => void = () => {}\n /* c8 ignore stop */\n\n #isStale: (index: Index) => boolean = () => false\n\n #initializeSizeTracking() {\n const sizes = new ZeroArray(this.#max)\n this.#calculatedSize = 0\n this.#sizes = sizes\n this.#removeItemSize = index => {\n this.#calculatedSize -= sizes[index] as number\n sizes[index] = 0\n }\n this.#requireSize = (k, v, size, sizeCalculation) => {\n if (!isPosInt(size)) {\n // provisionally accept background fetches.\n // actual value size will be checked when they return.\n if (this.#isBackgroundFetch(v)) {\n // NB: this cannot occur if v.__staleWhileFetching is set,\n // because in that case, it would take on the size of the\n // existing entry that it temporarily replaces.\n return this.backgroundFetchSize\n }\n if (sizeCalculation) {\n if (typeof sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation must be a function')\n }\n size = sizeCalculation(v, k)\n if (!isPosInt(size)) {\n throw new TypeError(\n 'sizeCalculation return invalid (expect positive integer)',\n )\n }\n } else {\n throw new TypeError(\n 'invalid size value (must be positive integer). ' +\n 'When maxSize or maxEntrySize is used, sizeCalculation ' +\n 'or size must be set.',\n )\n }\n }\n return size\n }\n\n this.#addItemSize = (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status,\n ) => {\n sizes[index] = size\n if (this.#maxSize) {\n const maxSize = this.#maxSize - sizes[index]\n while (this.#calculatedSize > maxSize) {\n this.#evict(true)\n }\n }\n this.#calculatedSize += sizes[index]\n if (status) {\n status.entrySize = size\n status.totalCalculatedSize = this.#calculatedSize\n }\n }\n }\n\n #removeItemSize: (index: Index) => void = _i => {}\n\n #addItemSize: (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status,\n ) => void = (_i, _s, _st) => {}\n\n #requireSize: (\n k: K,\n v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator,\n status?: LRUCache.Status,\n ) => LRUCache.Size = (\n _k: K,\n _v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator,\n ) => {\n if (size || sizeCalculation) {\n throw new TypeError(\n 'cannot set size without setting maxSize or maxEntrySize on cache',\n )\n }\n return 0\n };\n\n *#indexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#tail; this.#isValidIndex(i); ) {\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#head) {\n break\n } else {\n i = this.#prev[i] as Index\n }\n }\n }\n }\n\n *#rindexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#head; this.#isValidIndex(i); ) {\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#tail) {\n break\n } else {\n i = this.#next[i] as Index\n }\n }\n }\n }\n\n #isValidIndex(index: Index) {\n return (\n index !== undefined &&\n this.#keyMap.get(this.#keyList[index] as K) === index\n )\n }\n\n /**\n * Return a generator yielding `[key, value]` pairs,\n * in order from most recently used to least recently used.\n */\n *entries() {\n for (const i of this.#indexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]] as [K, V]\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.entries}\n *\n * Return a generator yielding `[key, value]` pairs,\n * in order from least recently used to most recently used.\n */\n *rentries() {\n for (const i of this.#rindexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]]\n }\n }\n }\n\n /**\n * Return a generator yielding the keys in the cache,\n * in order from most recently used to least recently used.\n */\n *keys() {\n for (const i of this.#indexes()) {\n const k = this.#keyList[i]\n if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield k\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.keys}\n *\n * Return a generator yielding the keys in the cache,\n * in order from least recently used to most recently used.\n */\n *rkeys() {\n for (const i of this.#rindexes()) {\n const k = this.#keyList[i]\n if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield k\n }\n }\n }\n\n /**\n * Return a generator yielding the values in the cache,\n * in order from most recently used to least recently used.\n */\n *values() {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i] as V\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.values}\n *\n * Return a generator yielding the values in the cache,\n * in order from least recently used to most recently used.\n */\n *rvalues() {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i]\n }\n }\n }\n\n /**\n * Iterating over the cache itself yields the same results as\n * {@link LRUCache.entries}\n */\n [Symbol.iterator]() {\n return this.entries()\n }\n\n /**\n * A String value that is used in the creation of the default string\n * description of an object. Called by the built-in method\n * `Object.prototype.toString`.\n */\n [Symbol.toStringTag] = 'LRUCache'\n\n /**\n * Find a value for which the supplied fn method returns a truthy value,\n * similar to `Array.find()`. fn is called as `fn(value, key, cache)`.\n */\n find(\n fn: (v: V, k: K, self: LRUCache) => boolean,\n getOptions: LRUCache.GetOptions = {},\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n if (fn(value, this.#keyList[i] as K, this)) {\n return this.#get(this.#keyList[i] as K, getOptions)\n }\n }\n }\n\n /**\n * Call the supplied function on each item in the cache, in order from most\n * recently used to least recently used.\n *\n * `fn` is called as `fn(value, key, cache)`.\n *\n * If `thisp` is provided, function will be called in the `this`-context of\n * the provided object, or the cache if no `thisp` object is provided.\n *\n * Does not update age or recenty of use, or iterate over stale values.\n */\n forEach(\n fn: (v: V, k: K, self: LRUCache) => unknown,\n thisp: unknown = this,\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * The same as {@link LRUCache.forEach} but items are iterated over in\n * reverse order. (ie, less recently used items are iterated over first.)\n */\n rforEach(\n fn: (v: V, k: K, self: LRUCache) => unknown,\n thisp: unknown = this,\n ) {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * Delete any stale entries. Returns true if anything was removed,\n * false otherwise.\n */\n purgeStale() {\n let deleted = false\n for (const i of this.#rindexes({ allowStale: true })) {\n if (this.#isStale(i)) {\n this.#delete(this.#keyList[i] as K, 'expire')\n deleted = true\n }\n }\n return deleted\n }\n\n /**\n * Get the extended info about a given entry, to get its value, size, and\n * TTL info simultaneously. Returns `undefined` if the key is not present.\n *\n * Unlike {@link LRUCache#dump}, which is designed to be portable and survive\n * serialization, the `start` value is always the current timestamp, and the\n * `ttl` is a calculated remaining time to live (negative if expired).\n *\n * Always returns stale values, if their info is found in the cache, so be\n * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl})\n * if relevant.\n */\n info(key: K): LRUCache.Entry | undefined {\n const i = this.#keyMap.get(key)\n if (i === undefined) return undefined\n const v = this.#valList[i]\n /* c8 ignore start - this isn't tested for the info function,\n * but it's the same logic as found in other places. */\n const value: V | undefined =\n this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) return undefined\n /* c8 ignore stop */\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n const ttl = this.#ttls[i]\n const start = this.#starts[i]\n if (ttl && start) {\n const remain = ttl - (this.#perf.now() - start)\n entry.ttl = remain\n entry.start = Date.now()\n }\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n return entry\n }\n\n /**\n * Return an array of [key, {@link LRUCache.Entry}] tuples which can be\n * passed to {@link LRUCache#load}.\n *\n * The `start` fields are calculated relative to a portable `Date.now()`\n * timestamp, even if `performance.now()` is available.\n *\n * Stale entries are always included in the `dump`, even if\n * {@link LRUCache.OptionsBase.allowStale} is false.\n *\n * Note: this returns an actual array, not a generator, so it can be more\n * easily passed around.\n */\n dump() {\n const arr: [K, LRUCache.Entry][] = []\n for (const i of this.#indexes({ allowStale: true })) {\n const key = this.#keyList[i]\n const v = this.#valList[i]\n const value: V | undefined =\n this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined || key === undefined) continue\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n entry.ttl = this.#ttls[i]\n // always dump the start relative to a portable timestamp\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = this.#perf.now() - (this.#starts[i] as number)\n entry.start = Math.floor(Date.now() - age)\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n arr.unshift([key, entry])\n }\n return arr\n }\n\n /**\n * Reset the cache and load in the items in entries in the order listed.\n *\n * The shape of the resulting cache may be different if the same options are\n * not used in both caches.\n *\n * The `start` fields are assumed to be calculated relative to a portable\n * `Date.now()` timestamp, even if `performance.now()` is available.\n */\n load(arr: [K, LRUCache.Entry][]) {\n this.clear()\n for (const [key, entry] of arr) {\n if (entry.start) {\n // entry.start is a portable timestamp, but we may be using\n // node's performance.now(), so calculate the offset, so that\n // we get the intended remaining TTL, no matter how long it's\n // been on ice.\n //\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = Date.now() - entry.start\n entry.start = this.#perf.now() - age\n }\n this.#set(key, entry.value, entry)\n }\n }\n\n /**\n * Add a value to the cache.\n *\n * Note: if `undefined` is specified as a value, this is an alias for\n * {@link LRUCache#delete}\n *\n * Fields on the {@link LRUCache.SetOptions} options param will override\n * their corresponding values in the constructor options for the scope\n * of this single `set()` operation.\n *\n * If `start` is provided, then that will set the effective start\n * time for the TTL calculation. Note that this must be a previous\n * value of `performance.now()` if supported, or a previous value of\n * `Date.now()` if not.\n *\n * Options object may also include `size`, which will prevent\n * calling the `sizeCalculation` function and just use the specified\n * number if it is a positive integer, and `noDisposeOnSet` which\n * will prevent calling a `dispose` function in the case of\n * overwrites.\n *\n * If the `size` (or return value of `sizeCalculation`) for a given\n * entry is greater than `maxEntrySize`, then the item will not be\n * added to the cache.\n *\n * Will update the recency of the entry.\n *\n * If the value is `undefined`, then this is an alias for\n * `cache.delete(key)`. `undefined` is never stored in the cache.\n */\n set(\n k: K,\n v: V | undefined,\n setOptions: LRUCache.SetOptions = {},\n ) {\n const { status = metrics.hasSubscribers ? {} : undefined } = setOptions\n setOptions.status = status\n if (status) {\n status.op = 'set'\n status.key = k\n if (v !== undefined) status.value = v\n status.cache = this\n }\n const result = this.#set(k, v, setOptions)\n if (status && metrics.hasSubscribers) {\n metrics.publish(status)\n }\n return result\n }\n\n #set(\n k: K,\n v: V | BackgroundFetch | undefined,\n setOptions: LRUCache.SetOptions,\n bf?: BackgroundFetch,\n ) {\n const {\n ttl = this.ttl,\n start,\n noDisposeOnSet = this.noDisposeOnSet,\n sizeCalculation = this.sizeCalculation,\n status,\n } = setOptions\n\n const isBF = this.#isBackgroundFetch(v)\n if (v === undefined) {\n if (status) status.set = 'deleted'\n this.delete(k)\n return this\n }\n let { noUpdateTTL = this.noUpdateTTL } = setOptions\n\n if (status && !isBF) status.value = v\n\n const size = this.#requireSize(\n k,\n v,\n setOptions.size || 0,\n sizeCalculation,\n status,\n )\n // if the item doesn't fit, don't do anything\n // NB: maxEntrySize set to maxSize by default\n if (this.maxEntrySize && size > this.maxEntrySize) {\n // have to delete, in case something is there already.\n this.#delete(k, 'set')\n if (status) {\n status.set = 'miss'\n status.maxEntrySizeExceeded = true\n }\n return this\n }\n let index = this.#size === 0 ? undefined : this.#keyMap.get(k)\n if (index === undefined) {\n // addition\n index = (\n this.#size === 0 ? this.#tail\n : this.#free.length !== 0 ? this.#free.pop()\n : this.#size === this.#max ? this.#evict(false)\n : this.#size) as Index\n this.#keyList[index] = k\n this.#valList[index] = v\n this.#keyMap.set(k, index)\n this.#next[this.#tail] = index\n this.#prev[index] = this.#tail\n this.#tail = index\n this.#size++\n this.#addItemSize(index, size, status)\n if (status) status.set = 'add'\n noUpdateTTL = false\n if (this.#hasOnInsert && !isBF) {\n this.#onInsert?.(v, k, 'add')\n }\n } else {\n // update\n // might be updating a background fetch!\n this.#moveToTail(index)\n const oldVal = this.#valList[index]!\n if (v !== oldVal) {\n if (!noDisposeOnSet) {\n if (this.#isBackgroundFetch(oldVal)) {\n if (oldVal !== bf) {\n // setting over a background fetch, not merely resolving it.\n oldVal.__abortController.abort(new Error('replaced'))\n }\n const { __staleWhileFetching: s } = oldVal\n if (s !== undefined && s !== v) {\n if (this.#hasDispose) {\n this.#dispose?.(s, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([s, k, 'set'])\n }\n }\n } else {\n if (this.#hasDispose) {\n this.#dispose?.(oldVal, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldVal, k, 'set'])\n }\n }\n }\n this.#removeItemSize(index)\n this.#addItemSize(index, size, status)\n this.#valList[index] = v\n if (!isBF) {\n const oldValue =\n oldVal && this.#isBackgroundFetch(oldVal) ?\n oldVal.__staleWhileFetching\n : oldVal\n const setType =\n oldValue === undefined ? 'add'\n : v !== oldValue ? 'replace'\n : 'update'\n if (status) {\n status.set = setType\n if (oldValue !== undefined) status.oldValue = oldValue\n }\n if (this.#hasOnInsert) {\n this.onInsert?.(v, k, setType)\n }\n }\n } else if (!isBF) {\n if (status) {\n status.set = 'update'\n }\n if (this.#hasOnInsert) {\n this.onInsert?.(v, k, 'update')\n }\n }\n }\n if (ttl !== 0 && !this.#ttls) {\n this.#initializeTTLTracking()\n }\n if (this.#ttls) {\n if (!noUpdateTTL) {\n this.#setItemTTL(index, ttl, start)\n }\n if (status) this.#statusTTL(status, index)\n }\n if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return this\n }\n\n /**\n * Evict the least recently used item, returning its value or\n * `undefined` if cache is empty.\n */\n pop(): V | undefined {\n try {\n while (this.#size) {\n const val = this.#valList[this.#head]\n this.#evict(true)\n if (this.#isBackgroundFetch(val)) {\n if (val.__staleWhileFetching) {\n return val.__staleWhileFetching\n }\n } else if (val !== undefined) {\n return val\n }\n }\n } finally {\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n }\n\n #evict(free: boolean) {\n const head = this.#head\n const k = this.#keyList[head]!\n const v = this.#valList[head]!\n const isBF = this.#isBackgroundFetch(v)\n if (isBF) {\n v.__abortController.abort(new Error('evicted'))\n }\n const oldValue = isBF ? v.__staleWhileFetching : v\n if (\n (this.#hasDispose || this.#hasDisposeAfter) &&\n oldValue !== undefined\n ) {\n if (this.#hasDispose) {\n this.#dispose?.(oldValue, k, 'evict')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldValue, k, 'evict'])\n }\n }\n this.#removeItemSize(head)\n if (this.#autopurgeTimers?.[head]) {\n clearTimeout(this.#autopurgeTimers[head])\n this.#autopurgeTimers[head] = undefined\n }\n // if we aren't about to use the index, then null these out\n if (free) {\n this.#keyList[head] = undefined\n this.#valList[head] = undefined\n this.#free.push(head)\n }\n if (this.#size === 1) {\n this.#head = this.#tail = 0 as Index\n this.#free.length = 0\n } else {\n this.#head = this.#next[head] as Index\n }\n this.#keyMap.delete(k)\n this.#size--\n return head\n }\n\n /**\n * Check if a key is in the cache, without updating the recency of use.\n * Will return false if the item is stale, even though it is technically\n * in the cache.\n *\n * Check if a key is in the cache, without updating the recency of\n * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set\n * to `true` in either the options or the constructor.\n *\n * Will return `false` if the item is stale, even though it is technically in\n * the cache. The difference can be determined (if it matters) by using a\n * `status` argument, and inspecting the `has` field.\n *\n * Will not update item age unless\n * {@link LRUCache.OptionsBase.updateAgeOnHas} is set.\n */\n has(k: K, hasOptions: LRUCache.HasOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } = hasOptions\n hasOptions.status = status\n if (status) {\n status.op = 'has'\n status.key = k\n status.cache = this\n }\n const result = this.#has(k, hasOptions)\n if (metrics.hasSubscribers) metrics.publish(status)\n return result\n }\n #has(k: K, hasOptions: LRUCache.HasOptions = {}) {\n const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n const v = this.#valList[index]\n if (\n this.#isBackgroundFetch(v) &&\n v.__staleWhileFetching === undefined\n ) {\n return false\n }\n if (!this.#isStale(index)) {\n if (updateAgeOnHas) {\n this.#updateItemAge(index)\n }\n if (status) {\n status.has = 'hit'\n this.#statusTTL(status, index)\n }\n return true\n } else if (status) {\n status.has = 'stale'\n this.#statusTTL(status, index)\n }\n } else if (status) {\n status.has = 'miss'\n }\n return false\n }\n\n /**\n * Like {@link LRUCache#get} but doesn't update recency or delete stale\n * items.\n *\n * Returns `undefined` if the item is stale, unless\n * {@link LRUCache.OptionsBase.allowStale} is set.\n */\n peek(k: K, peekOptions: LRUCache.PeekOptions = {}) {\n const { status = hasSubscribers() ? {} : undefined } = peekOptions\n if (status) {\n status.op = 'peek'\n status.key = k\n status.cache = this\n }\n peekOptions.status = status\n const result = this.#peek(k, peekOptions)\n if (metrics.hasSubscribers) {\n metrics.publish(status)\n }\n return result\n }\n #peek(k: K, peekOptions: LRUCache.PeekOptions) {\n const { status, allowStale = this.allowStale } = peekOptions\n const index = this.#keyMap.get(k)\n if (index === undefined || (!allowStale && this.#isStale(index))) {\n if (status) status.peek = index === undefined ? 'miss' : 'stale'\n return undefined\n }\n const v = this.#valList[index]\n const val = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (status) {\n if (val !== undefined) {\n status.peek = 'hit'\n status.value = val\n } else {\n status.peek = 'miss'\n }\n }\n return val\n }\n\n #backgroundFetch(\n k: K,\n index: Index | undefined,\n options: LRUCache.FetchOptions,\n context: FC,\n ): BackgroundFetch {\n const v = index === undefined ? undefined : this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n return v\n }\n\n const ac = new AbortController()\n const { signal } = options\n // when/if our AC signals, then stop listening to theirs.\n signal?.addEventListener('abort', () => ac.abort(signal.reason), {\n signal: ac.signal,\n })\n\n const fetchOpts = {\n signal: ac.signal,\n options,\n context,\n }\n\n const cb = (v: V | undefined, updateCache = false): V | undefined => {\n const { aborted } = ac.signal\n const ignoreAbort = options.ignoreFetchAbort && v !== undefined\n const proceed =\n options.ignoreFetchAbort ||\n !!(options.allowStaleOnFetchAbort && v !== undefined)\n if (options.status) {\n if (aborted && !updateCache) {\n options.status.fetchAborted = true\n options.status.fetchError = ac.signal.reason\n if (ignoreAbort) options.status.fetchAbortIgnored = true\n } else {\n options.status.fetchResolved = true\n }\n }\n if (aborted && !ignoreAbort && !updateCache) {\n return fetchFail(ac.signal.reason, proceed)\n }\n // either we didn't abort, and are still here, or we did, and ignored\n const bf = p as BackgroundFetch\n // if nothing else has been written there but we're set to update the\n // cache and ignore the abort, or if it's still pending on this specific\n // background request, then write it to the cache.\n const vl = this.#valList[index as Index]\n if (vl === p || (vl === undefined && ignoreAbort && updateCache)) {\n if (v === undefined) {\n if (bf.__staleWhileFetching !== undefined) {\n this.#valList[index as Index] = bf.__staleWhileFetching\n } else {\n this.#delete(k, 'fetch')\n }\n } else {\n if (options.status) options.status.fetchUpdated = true\n this.#set(k, v, fetchOpts.options, bf)\n }\n }\n return v\n }\n\n const eb = (er: unknown) => {\n if (options.status) {\n options.status.fetchRejected = true\n options.status.fetchError = er as Error\n }\n // do not pass go, do not collect $200\n return fetchFail(er, false)\n }\n\n const fetchFail = (er: unknown, proceed: boolean): V | undefined => {\n const { aborted } = ac.signal\n const allowStaleAborted = aborted && options.allowStaleOnFetchAbort\n const allowStale =\n allowStaleAborted || options.allowStaleOnFetchRejection\n const noDelete = allowStale || options.noDeleteOnFetchRejection\n const bf = p as BackgroundFetch\n if (this.#valList[index as Index] === p) {\n // if we allow stale on fetch rejections, then we need to ensure that\n // the stale value is not removed from the cache when the fetch fails.\n const del =\n !noDelete || (!proceed && bf.__staleWhileFetching === undefined)\n if (del) {\n this.#delete(k, 'fetch')\n } else if (!allowStaleAborted) {\n // still replace the *promise* with the stale value,\n // since we are done with the promise at this point.\n // leave it untouched if we're still waiting for an\n // aborted background fetch that hasn't yet returned.\n this.#valList[index as Index] = bf.__staleWhileFetching\n }\n }\n if (allowStale) {\n if (options.status && bf.__staleWhileFetching !== undefined) {\n options.status.returnedStale = true\n }\n return bf.__staleWhileFetching\n } else if (bf.__returned === bf) {\n throw er\n }\n }\n\n const pcall = (\n res: (v: V | undefined) => void,\n rej: (e: unknown) => void,\n ) => {\n const fmp = this.#fetchMethod?.(k, v, fetchOpts)\n // ignored, we go until we finish, regardless.\n // defer check until we are actually aborting,\n // so fetchMethod can override.\n ac.signal.addEventListener('abort', () => {\n if (!options.ignoreFetchAbort || options.allowStaleOnFetchAbort) {\n res(undefined)\n // when it eventually resolves, update the cache.\n if (options.allowStaleOnFetchAbort) {\n res = v => cb(v, true)\n }\n }\n })\n if (fmp && fmp instanceof Promise) {\n fmp.then(v => res(v === undefined ? undefined : v), rej)\n } else if (fmp !== undefined) {\n res(fmp)\n }\n }\n\n if (options.status) options.status.fetchDispatched = true\n const p = new Promise(pcall).then(cb, eb)\n const bf: BackgroundFetch = Object.assign(p, {\n __abortController: ac,\n __staleWhileFetching: v,\n __returned: undefined,\n })\n\n if (index === undefined) {\n // internal, don't expose status.\n this.#set(k, bf, { ...fetchOpts.options, status: undefined })\n index = this.#keyMap.get(k)\n } else {\n // do not call #set, because we do not want to adjust its place\n // in the lru queue, as it has not yet been \"used\". Also, we don't\n // need to worry about evicting for size, because a background fetch\n // over a stale value is treated as the same size as its stale value.\n this.#valList[index] = bf\n }\n return bf\n }\n\n #isBackgroundFetch(p: unknown): p is BackgroundFetch {\n if (!this.#hasFetchMethod) return false\n const b = p as BackgroundFetch\n return (\n !!b &&\n b instanceof Promise &&\n b.hasOwnProperty('__staleWhileFetching') &&\n b.__abortController instanceof AbortController\n )\n }\n\n /**\n * Make an asynchronous cached fetch using the\n * {@link LRUCache.OptionsBase.fetchMethod} function.\n *\n * If the value is in the cache and not stale, then the returned\n * Promise resolves to the value.\n *\n * If not in the cache, or beyond its TTL staleness, then\n * `fetchMethod(key, staleValue, { options, signal, context })` is\n * called, and the value returned will be added to the cache once\n * resolved.\n *\n * If called with `allowStale`, and an asynchronous fetch is\n * currently in progress to reload a stale value, then the former\n * stale value will be returned.\n *\n * If called with `forceRefresh`, then the cached item will be\n * re-fetched, even if it is not stale. However, if `allowStale` is also\n * set, then the old value will still be returned. This is useful\n * in cases where you want to force a reload of a cached value. If\n * a background fetch is already in progress, then `forceRefresh`\n * has no effect.\n *\n * If multiple fetches for the same key are issued, then they will all be\n * coalesced into a single call to fetchMethod.\n *\n * Note that this means that handling options such as\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort},\n * {@link LRUCache.FetchOptions.signal},\n * and {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} will be\n * determined by the FIRST fetch() call for a given key.\n *\n * This is a known (fixable) shortcoming which will be addresed on when\n * someone complains about it, as the fix would involve added complexity and\n * may not be worth the costs for this edge case.\n *\n * If {@link LRUCache.OptionsBase.fetchMethod} is not specified, then this is\n * effectively an alias for `Promise.resolve(cache.get(key))`.\n *\n * When the fetch method resolves to a value, if the fetch has not\n * been aborted due to deletion, eviction, or being overwritten,\n * then it is added to the cache using the options provided.\n *\n * If the key is evicted or deleted before the `fetchMethod`\n * resolves, then the AbortSignal passed to the `fetchMethod` will\n * receive an `abort` event, and the promise returned by `fetch()`\n * will reject with the reason for the abort.\n *\n * If a `signal` is passed to the `fetch()` call, then aborting the\n * signal will abort the fetch and cause the `fetch()` promise to\n * reject with the reason provided.\n *\n * **Setting `context`**\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the {@link LRUCache} constructor, then all\n * calls to `cache.fetch()` _must_ provide a `context` option. If\n * set to `undefined` or `void`, then calls to fetch _must not_\n * provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that\n * might be relevant in the course of fetching the data. It is only\n * relevant for the course of a single `fetch()` operation, and\n * discarded afterwards.\n *\n * **Note: `fetch()` calls are inflight-unique**\n *\n * If you call `fetch()` multiple times with the same key value,\n * then every call after the first will resolve on the same\n * promise1,\n * _even if they have different settings that would otherwise change\n * the behavior of the fetch_, such as `noDeleteOnFetchRejection`\n * or `ignoreFetchAbort`.\n *\n * In most cases, this is not a problem (in fact, only fetching\n * something once is what you probably want, if you're caching in\n * the first place). If you are changing the fetch() options\n * dramatically between runs, there's a good chance that you might\n * be trying to fit divergent semantics into a single object, and\n * would be better off with multiple cache instances.\n *\n * **1**: Ie, they're not the \"same Promise\", but they resolve at\n * the same time, because they're both waiting on the same\n * underlying fetchMethod response.\n */\n\n fetch(\n k: K,\n fetchOptions: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext,\n ): Promise\n\n // this overload not allowed if context is required\n fetch(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n fetchOptions?: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : never,\n ): Promise\n fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const ths = tracing.hasSubscribers\n const { status = hasSubscribers() ? {} : undefined } = fetchOptions\n fetchOptions.status = status\n if (status && fetchOptions.context) {\n status.context = fetchOptions.context\n }\n const p = this.#fetch(k, fetchOptions)\n if (status && ths) {\n status.trace = true\n tracing.tracePromise(() => p, status).catch(() => {})\n }\n return p\n }\n\n async #fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const {\n // get options\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n // set options\n ttl = this.ttl,\n noDisposeOnSet = this.noDisposeOnSet,\n size = 0,\n sizeCalculation = this.sizeCalculation,\n noUpdateTTL = this.noUpdateTTL,\n // fetch exclusive options\n noDeleteOnFetchRejection = this.noDeleteOnFetchRejection,\n allowStaleOnFetchRejection = this.allowStaleOnFetchRejection,\n ignoreFetchAbort = this.ignoreFetchAbort,\n allowStaleOnFetchAbort = this.allowStaleOnFetchAbort,\n context,\n forceRefresh = false,\n status,\n signal,\n } = fetchOptions\n if (status) {\n status.op = 'fetch'\n status.key = k\n if (forceRefresh) status.forceRefresh = true\n status.cache = this\n }\n\n if (!this.#hasFetchMethod) {\n if (status) status.fetch = 'get'\n return this.#get(k, {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n status,\n })\n }\n\n const options = {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n ttl,\n noDisposeOnSet,\n size,\n sizeCalculation,\n noUpdateTTL,\n noDeleteOnFetchRejection,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n status,\n signal,\n }\n\n let index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.fetch = 'miss'\n const p = this.#backgroundFetch(k, index, options, context as FC)\n return (p.__returned = p)\n } else {\n // in cache, maybe already fetching\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n const stale = allowStale && v.__staleWhileFetching !== undefined\n if (status) {\n status.fetch = 'inflight'\n if (stale) status.returnedStale = true\n }\n return stale ? v.__staleWhileFetching : (v.__returned = v)\n }\n\n // if we force a refresh, that means do NOT serve the cached value,\n // unless we are already in the process of refreshing the cache.\n const isStale = this.#isStale(index)\n if (!forceRefresh && !isStale) {\n if (status) status.fetch = 'hit'\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n if (status) this.#statusTTL(status, index)\n return v\n }\n\n // ok, it is stale or a forced refresh, and not already fetching.\n // refresh the cache.\n const p = this.#backgroundFetch(k, index, options, context as FC)\n const hasStale = p.__staleWhileFetching !== undefined\n const staleVal = hasStale && allowStale\n if (status) {\n status.fetch = isStale ? 'stale' : 'refresh'\n if (staleVal && isStale) status.returnedStale = true\n }\n return staleVal ? p.__staleWhileFetching : (p.__returned = p)\n }\n }\n\n /**\n * In some cases, `cache.fetch()` may resolve to `undefined`, either because\n * a {@link LRUCache.OptionsBase#fetchMethod} was not provided (turning\n * `cache.fetch(k)` into just an async wrapper around `cache.get(k)`) or\n * because `ignoreFetchAbort` was specified (either to the constructor or\n * in the {@link LRUCache.FetchOptions}). Also, the\n * {@link LRUCache.OptionsBase.fetchMethod} may return `undefined` or `void`, making\n * the test even more complicated.\n *\n * Because inferring the cases where `undefined` might be returned are so\n * cumbersome, but testing for `undefined` can also be annoying, this method\n * can be used, which will reject if `this.fetch()` resolves to undefined.\n */\n forceFetch(\n k: K,\n fetchOptions: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext,\n ): Promise\n // this overload not allowed if context is required\n forceFetch(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n fetchOptions?: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : never,\n ): Promise\n forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const ths = tracing.hasSubscribers\n const { status = hasSubscribers() ? {} : undefined } = fetchOptions\n fetchOptions.status = status\n if (status && fetchOptions.context) {\n status.context = fetchOptions.context\n }\n const p = this.#forceFetch(k, fetchOptions)\n if (status && ths) {\n status.trace = true\n tracing.tracePromise(() => p, status).catch(() => {})\n }\n return p\n }\n\n async #forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ) {\n const v = await this.#fetch(k, fetchOptions)\n if (v === undefined) throw new Error('fetch() returned undefined')\n return v\n }\n\n /**\n * If the key is found in the cache, then this is equivalent to\n * {@link LRUCache#get}. If not, in the cache, then calculate the value using\n * the {@link LRUCache.OptionsBase.memoMethod}, and add it to the cache.\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the LRUCache constructor, then all calls to `cache.memo()`\n * _must_ provide a `context` option. If set to `undefined` or `void`, then\n * calls to memo _must not_ provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that might be\n * relevant in the course of fetching the data. It is only relevant for the\n * course of a single `memo()` operation, and discarded afterwards.\n */\n memo(\n k: K,\n memoOptions: unknown extends FC ? LRUCache.MemoOptions\n : FC extends undefined | void ? LRUCache.MemoOptionsNoContext\n : LRUCache.MemoOptionsWithContext,\n ): V\n // this overload not allowed if context is required\n memo(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n memoOptions?: unknown extends FC ? LRUCache.MemoOptions\n : FC extends undefined | void ? LRUCache.MemoOptionsNoContext\n : never,\n ): V\n memo(k: K, memoOptions: LRUCache.MemoOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } =\n memoOptions\n memoOptions.status = status\n if (status) {\n status.op = 'memo'\n status.key = k\n if (memoOptions.context) {\n status.context = memoOptions.context\n }\n status.cache = this\n }\n const result = this.#memo(k, memoOptions)\n if (status) status.value = result\n if (metrics.hasSubscribers) metrics.publish(status)\n return result\n }\n #memo(k: K, memoOptions: LRUCache.MemoOptions = {}) {\n const memoMethod = this.#memoMethod\n if (!memoMethod) {\n throw new Error('no memoMethod provided to constructor')\n }\n const { context, status, forceRefresh, ...options } = memoOptions\n if (status && forceRefresh) status.forceRefresh = true\n const v = this.#get(k, options)\n const refresh = forceRefresh || v === undefined\n if (status) {\n status.memo = refresh ? 'miss' : 'hit'\n if (!refresh) status.value = v\n }\n if (!refresh) return v\n const vv = memoMethod(k, v, {\n options,\n context,\n } as LRUCache.MemoizerOptions)\n if (status) status.value = vv\n this.#set(k, vv, options)\n return vv\n }\n\n /**\n * Return a value from the cache. Will update the recency of the cache\n * entry found.\n *\n * If the key is not found, get() will return `undefined`.\n */\n get(k: K, getOptions: LRUCache.GetOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } = getOptions\n getOptions.status = status\n if (status) {\n status.op = 'get'\n status.key = k\n status.cache = this\n }\n const result = this.#get(k, getOptions)\n if (status) {\n if (result !== undefined) status.value = result\n if (metrics.hasSubscribers) metrics.publish(status)\n }\n return result\n }\n\n #get(k: K, getOptions: LRUCache.GetOptions = {}) {\n const {\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n status,\n } = getOptions\n const index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.get = 'miss'\n return undefined\n }\n const value = this.#valList[index]\n const fetching = this.#isBackgroundFetch(value)\n if (status) this.#statusTTL(status, index)\n if (this.#isStale(index)) {\n // delete only if not an in-flight background fetch\n if (!fetching) {\n if (!noDeleteOnStaleGet) {\n this.#delete(k, 'expire')\n }\n if (status) status.get = 'stale'\n if (allowStale) {\n if (status) status.returnedStale = true\n return value\n }\n return undefined\n }\n if (status) status.get = 'stale-fetching'\n if (allowStale && value.__staleWhileFetching !== undefined) {\n if (status) status.returnedStale = true\n return value.__staleWhileFetching\n }\n return undefined\n }\n // not stale\n if (status) status.get = fetching ? 'fetching' : 'hit'\n // if we're currently fetching it, we don't actually have it yet\n // it's not stale, which means this isn't a staleWhileRefetching.\n // If it's not stale, and fetching, AND has a __staleWhileFetching\n // value, then that means the user fetched with {forceRefresh:true},\n // so it's safe to return that value.\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n return fetching ? value.__staleWhileFetching : value\n }\n\n #connect(p: Index, n: Index) {\n this.#prev[n] = p\n this.#next[p] = n\n }\n\n #moveToTail(index: Index): void {\n // if tail already, nothing to do\n // if head, move head to next[index]\n // else\n // move next[prev[index]] to next[index] (head has no prev)\n // move prev[next[index]] to prev[index]\n // prev[index] = tail\n // next[tail] = index\n // tail = index\n if (index !== this.#tail) {\n if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n this.#connect(\n this.#prev[index] as Index,\n this.#next[index] as Index,\n )\n }\n this.#connect(this.#tail, index)\n this.#tail = index\n }\n }\n\n /**\n * Deletes a key out of the cache.\n *\n * Returns true if the key was deleted, false otherwise.\n */\n delete(k: K) {\n return this.#delete(k, 'delete')\n }\n\n #delete(k: K, reason: LRUCache.DisposeReason) {\n if (metrics.hasSubscribers) {\n metrics.publish({\n op: 'delete',\n delete: reason,\n key: k,\n cache: this,\n })\n }\n let deleted = false\n if (this.#size !== 0) {\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n if (this.#autopurgeTimers?.[index]) {\n clearTimeout(this.#autopurgeTimers?.[index])\n this.#autopurgeTimers[index] = undefined\n }\n deleted = true\n if (this.#size === 1) {\n this.#clear(reason)\n } else {\n this.#removeItemSize(index)\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k, reason])\n }\n }\n this.#keyMap.delete(k)\n this.#keyList[index] = undefined\n this.#valList[index] = undefined\n if (index === this.#tail) {\n this.#tail = this.#prev[index] as Index\n } else if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n const pi = this.#prev[index] as number\n this.#next[pi] = this.#next[index] as number\n const ni = this.#next[index] as number\n this.#prev[ni] = this.#prev[index] as number\n }\n this.#size--\n this.#free.push(index)\n }\n }\n }\n if (this.#hasDisposeAfter && this.#disposed?.length) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return deleted\n }\n\n /**\n * Clear the cache entirely, throwing away all values.\n */\n clear() {\n return this.#clear('delete')\n }\n #clear(reason: LRUCache.DisposeReason) {\n for (const index of this.#rindexes({ allowStale: true })) {\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else {\n const k = this.#keyList[index]\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k as K, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k as K, reason])\n }\n }\n }\n\n this.#keyMap.clear()\n void this.#valList.fill(undefined)\n this.#keyList.fill(undefined)\n if (this.#ttls && this.#starts) {\n this.#ttls.fill(0)\n this.#starts.fill(0)\n for (const t of this.#autopurgeTimers ?? []) {\n if (t !== undefined) clearTimeout(t)\n }\n this.#autopurgeTimers?.fill(undefined)\n }\n if (this.#sizes) {\n this.#sizes.fill(0)\n }\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free.length = 0\n this.#calculatedSize = 0\n this.#size = 0\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/index.min.js b/node_modules/lru-cache/dist/commonjs/index.min.js new file mode 100644 index 00000000..8e424610 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/index.min.js @@ -0,0 +1,2 @@ +"use strict";var j=(c,t)=>()=>(t||c((t={exports:{}}).exports,t),t.exports);var I=j(O=>{"use strict";Object.defineProperty(O,"__esModule",{value:!0});O.tracing=O.metrics=void 0;var U={hasSubscribers:!1};O.metrics=U;O.tracing=U});var P=j(D=>{"use strict";Object.defineProperty(D,"__esModule",{value:!0});D.defaultPerf=void 0;D.defaultPerf=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date});Object.defineProperty(exports,"__esModule",{value:!0});exports.LRUCache=void 0;var g=I(),N=P(),x=()=>g.metrics.hasSubscribers||g.tracing.hasSubscribers,k=new Set,G=typeof process=="object"&&process?process:{},V=(c,t,e,i)=>{typeof G.emitWarning=="function"?G.emitWarning(c,t,e,i):console.error(`[${e}] ${t}: ${c}`)},B=c=>!k.has(c);var T=c=>!!c&&c===Math.floor(c)&&c>0&&isFinite(c),H=c=>T(c)?c<=Math.pow(2,8)?Uint8Array:c<=Math.pow(2,16)?Uint16Array:c<=Math.pow(2,32)?Uint32Array:c<=Number.MAX_SAFE_INTEGER?W:null:null,W=class extends Array{constructor(t){super(t),this.fill(0)}},C=class c{heap;length;static#o=!1;static create(t){let e=H(t);if(!e)return[];c.#o=!0;let i=new c(t,e);return c.#o=!1,i}constructor(t,e){if(!c.#o)throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new e(t),this.length=0}push(t){this.heap[this.length++]=t}pop(){return this.heap[--this.length]}},L=class c{#o;#c;#m;#W;#S;#M;#j;#w;get perf(){return this.#w}ttl;ttlResolution;ttlAutopurge;updateAgeOnGet;updateAgeOnHas;allowStale;noDisposeOnSet;noUpdateTTL;maxEntrySize;sizeCalculation;noDeleteOnFetchRejection;noDeleteOnStaleGet;allowStaleOnFetchAbort;allowStaleOnFetchRejection;ignoreFetchAbort;backgroundFetchSize;#n;#b;#s;#i;#t;#l;#u;#a;#h;#y;#r;#_;#F;#d;#g;#T;#U;#f;#D;static unsafeExposeInternals(t){return{starts:t.#F,ttls:t.#d,autopurgeTimers:t.#g,sizes:t.#_,keyMap:t.#s,keyList:t.#i,valList:t.#t,next:t.#l,prev:t.#u,get head(){return t.#a},get tail(){return t.#h},free:t.#y,isBackgroundFetch:e=>t.#e(e),backgroundFetch:(e,i,s,n)=>t.#G(e,i,s,n),moveToTail:e=>t.#L(e),indexes:e=>t.#A(e),rindexes:e=>t.#z(e),isStale:e=>t.#p(e)}}get max(){return this.#o}get maxSize(){return this.#c}get calculatedSize(){return this.#b}get size(){return this.#n}get fetchMethod(){return this.#M}get memoMethod(){return this.#j}get dispose(){return this.#m}get onInsert(){return this.#W}get disposeAfter(){return this.#S}constructor(t){let{max:e=0,ttl:i,ttlResolution:s=1,ttlAutopurge:n,updateAgeOnGet:r,updateAgeOnHas:h,allowStale:a,dispose:o,onInsert:d,disposeAfter:y,noDisposeOnSet:_,noUpdateTTL:u,maxSize:p=0,maxEntrySize:f=0,sizeCalculation:b,fetchMethod:l,memoMethod:S,noDeleteOnFetchRejection:F,noDeleteOnStaleGet:w,allowStaleOnFetchRejection:m,allowStaleOnFetchAbort:A,ignoreFetchAbort:z,backgroundFetchSize:M=1,perf:v}=t;if(this.backgroundFetchSize=M,v!==void 0&&typeof v?.now!="function")throw new TypeError("perf option must have a now() method if specified");if(this.#w=v??N.defaultPerf,e!==0&&!T(e))throw new TypeError("max option must be a nonnegative integer");let E=e?H(e):Array;if(!E)throw new Error("invalid max value: "+e);if(this.#o=e,this.#c=p,this.maxEntrySize=f||this.#c,this.sizeCalculation=b,this.sizeCalculation){if(!this.#c&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(S!==void 0&&typeof S!="function")throw new TypeError("memoMethod must be a function if defined");if(this.#j=S,l!==void 0&&typeof l!="function")throw new TypeError("fetchMethod must be a function if specified");if(this.#M=l,this.#U=!!l,this.#s=new Map,this.#i=Array.from({length:e}).fill(void 0),this.#t=Array.from({length:e}).fill(void 0),this.#l=new E(e),this.#u=new E(e),this.#a=0,this.#h=0,this.#y=C.create(e),this.#n=0,this.#b=0,typeof o=="function"&&(this.#m=o),typeof d=="function"&&(this.#W=d),typeof y=="function"?(this.#S=y,this.#r=[]):(this.#S=void 0,this.#r=void 0),this.#T=!!this.#m,this.#D=!!this.#W,this.#f=!!this.#S,this.noDisposeOnSet=!!_,this.noUpdateTTL=!!u,this.noDeleteOnFetchRejection=!!F,this.allowStaleOnFetchRejection=!!m,this.allowStaleOnFetchAbort=!!A,this.ignoreFetchAbort=!!z,this.maxEntrySize!==0){if(this.#c!==0&&!T(this.#c))throw new TypeError("maxSize must be a positive integer if specified");if(!T(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.#X()}if(this.allowStale=!!a,this.noDeleteOnStaleGet=!!w,this.updateAgeOnGet=!!r,this.updateAgeOnHas=!!h,this.ttlResolution=T(s)||s===0?s:1,this.ttlAutopurge=!!n,this.ttl=i||0,this.ttl){if(!T(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.#k()}if(this.#o===0&&this.ttl===0&&this.#c===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.#o&&!this.#c){let R="LRU_CACHE_UNBOUNDED";B(R)&&(k.add(R),V("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",R,c))}}getRemainingTTL(t){return this.#s.has(t)?1/0:0}#k(){let t=new W(this.#o),e=new W(this.#o);this.#d=t,this.#F=e;let i=this.ttlAutopurge?Array.from({length:this.#o}):void 0;this.#g=i,this.#H=(h,a,o=this.#w.now())=>{e[h]=a!==0?o:0,t[h]=a,s(h,a)},this.#R=h=>{e[h]=t[h]!==0?this.#w.now():0,s(h,t[h])};let s=this.ttlAutopurge?(h,a)=>{if(i?.[h]&&(clearTimeout(i[h]),i[h]=void 0),a&&a!==0&&i){let o=setTimeout(()=>{this.#p(h)&&this.#v(this.#i[h],"expire")},a+1);o.unref&&o.unref(),i[h]=o}}:()=>{};this.#E=(h,a)=>{if(t[a]){let o=t[a],d=e[a];if(!o||!d)return;h.ttl=o,h.start=d,h.now=n||r();let y=h.now-d;h.remainingTTL=o-y}};let n=0,r=()=>{let h=this.#w.now();if(this.ttlResolution>0){n=h;let a=setTimeout(()=>n=0,this.ttlResolution);a.unref&&a.unref()}return h};this.getRemainingTTL=h=>{let a=this.#s.get(h);if(a===void 0)return 0;let o=t[a],d=e[a];if(!o||!d)return 1/0;let y=(n||r())-d;return o-y},this.#p=h=>{let a=e[h],o=t[h];return!!o&&!!a&&(n||r())-a>o}}#R=()=>{};#E=()=>{};#H=()=>{};#p=()=>!1;#X(){let t=new W(this.#o);this.#b=0,this.#_=t,this.#x=e=>{this.#b-=t[e],t[e]=0},this.#N=(e,i,s,n)=>{if(!T(s)){if(this.#e(i))return this.backgroundFetchSize;if(n){if(typeof n!="function")throw new TypeError("sizeCalculation must be a function");if(s=n(i,e),!T(s))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.")}return s},this.#I=(e,i,s)=>{if(t[e]=i,this.#c){let n=this.#c-t[e];for(;this.#b>n;)this.#P(!0)}this.#b+=t[e],s&&(s.entrySize=i,s.totalCalculatedSize=this.#b)}}#x=t=>{};#I=(t,e,i)=>{};#N=(t,e,i,s)=>{if(i||s)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0};*#A({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#h;this.#V(e)&&((t||!this.#p(e))&&(yield e),e!==this.#a);)e=this.#u[e]}*#z({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#a;this.#V(e)&&((t||!this.#p(e))&&(yield e),e!==this.#h);)e=this.#l[e]}#V(t){return t!==void 0&&this.#s.get(this.#i[t])===t}*entries(){for(let t of this.#A())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*rentries(){for(let t of this.#z())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*keys(){for(let t of this.#A()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*rkeys(){for(let t of this.#z()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*values(){for(let t of this.#A())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}*rvalues(){for(let t of this.#z())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}[Symbol.iterator](){return this.entries()}[Symbol.toStringTag]="LRUCache";find(t,e={}){for(let i of this.#A()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;if(n!==void 0&&t(n,this.#i[i],this))return this.#C(this.#i[i],e)}}forEach(t,e=this){for(let i of this.#A()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;n!==void 0&&t.call(e,n,this.#i[i],this)}}rforEach(t,e=this){for(let i of this.#z()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;n!==void 0&&t.call(e,n,this.#i[i],this)}}purgeStale(){let t=!1;for(let e of this.#z({allowStale:!0}))this.#p(e)&&(this.#v(this.#i[e],"expire"),t=!0);return t}info(t){let e=this.#s.get(t);if(e===void 0)return;let i=this.#t[e],s=this.#e(i)?i.__staleWhileFetching:i;if(s===void 0)return;let n={value:s};if(this.#d&&this.#F){let r=this.#d[e],h=this.#F[e];if(r&&h){let a=r-(this.#w.now()-h);n.ttl=a,n.start=Date.now()}}return this.#_&&(n.size=this.#_[e]),n}dump(){let t=[];for(let e of this.#A({allowStale:!0})){let i=this.#i[e],s=this.#t[e],n=this.#e(s)?s.__staleWhileFetching:s;if(n===void 0||i===void 0)continue;let r={value:n};if(this.#d&&this.#F){r.ttl=this.#d[e];let h=this.#w.now()-this.#F[e];r.start=Math.floor(Date.now()-h)}this.#_&&(r.size=this.#_[e]),t.unshift([i,r])}return t}load(t){this.clear();for(let[e,i]of t){if(i.start){let s=Date.now()-i.start;i.start=this.#w.now()-s}this.#O(e,i.value,i)}}set(t,e,i={}){let{status:s=g.metrics.hasSubscribers?{}:void 0}=i;i.status=s,s&&(s.op="set",s.key=t,e!==void 0&&(s.value=e),s.cache=this);let n=this.#O(t,e,i);return s&&g.metrics.hasSubscribers&&g.metrics.publish(s),n}#O(t,e,i,s){let{ttl:n=this.ttl,start:r,noDisposeOnSet:h=this.noDisposeOnSet,sizeCalculation:a=this.sizeCalculation,status:o}=i,d=this.#e(e);if(e===void 0)return o&&(o.set="deleted"),this.delete(t),this;let{noUpdateTTL:y=this.noUpdateTTL}=i;o&&!d&&(o.value=e);let _=this.#N(t,e,i.size||0,a,o);if(this.maxEntrySize&&_>this.maxEntrySize)return this.#v(t,"set"),o&&(o.set="miss",o.maxEntrySizeExceeded=!0),this;let u=this.#n===0?void 0:this.#s.get(t);if(u===void 0)u=this.#n===0?this.#h:this.#y.length!==0?this.#y.pop():this.#n===this.#o?this.#P(!1):this.#n,this.#i[u]=t,this.#t[u]=e,this.#s.set(t,u),this.#l[this.#h]=u,this.#u[u]=this.#h,this.#h=u,this.#n++,this.#I(u,_,o),o&&(o.set="add"),y=!1,this.#D&&!d&&this.#W?.(e,t,"add");else{this.#L(u);let p=this.#t[u];if(e!==p){if(!h)if(this.#e(p)){p!==s&&p.__abortController.abort(new Error("replaced"));let{__staleWhileFetching:f}=p;f!==void 0&&f!==e&&(this.#T&&this.#m?.(f,t,"set"),this.#f&&this.#r?.push([f,t,"set"]))}else this.#T&&this.#m?.(p,t,"set"),this.#f&&this.#r?.push([p,t,"set"]);if(this.#x(u),this.#I(u,_,o),this.#t[u]=e,!d){let f=p&&this.#e(p)?p.__staleWhileFetching:p,b=f===void 0?"add":e!==f?"replace":"update";o&&(o.set=b,f!==void 0&&(o.oldValue=f)),this.#D&&this.onInsert?.(e,t,b)}}else d||(o&&(o.set="update"),this.#D&&this.onInsert?.(e,t,"update"))}if(n!==0&&!this.#d&&this.#k(),this.#d&&(y||this.#H(u,n,r),o&&this.#E(o,u)),!h&&this.#f&&this.#r){let p=this.#r,f;for(;f=p?.shift();)this.#S?.(...f)}return this}pop(){try{for(;this.#n;){let t=this.#t[this.#a];if(this.#P(!0),this.#e(t)){if(t.__staleWhileFetching)return t.__staleWhileFetching}else if(t!==void 0)return t}}finally{if(this.#f&&this.#r){let t=this.#r,e;for(;e=t?.shift();)this.#S?.(...e)}}}#P(t){let e=this.#a,i=this.#i[e],s=this.#t[e],n=this.#e(s);n&&s.__abortController.abort(new Error("evicted"));let r=n?s.__staleWhileFetching:s;return(this.#T||this.#f)&&r!==void 0&&(this.#T&&this.#m?.(r,i,"evict"),this.#f&&this.#r?.push([r,i,"evict"])),this.#x(e),this.#g?.[e]&&(clearTimeout(this.#g[e]),this.#g[e]=void 0),t&&(this.#i[e]=void 0,this.#t[e]=void 0,this.#y.push(e)),this.#n===1?(this.#a=this.#h=0,this.#y.length=0):this.#a=this.#l[e],this.#s.delete(i),this.#n--,e}has(t,e={}){let{status:i=g.metrics.hasSubscribers?{}:void 0}=e;e.status=i,i&&(i.op="has",i.key=t,i.cache=this);let s=this.#Y(t,e);return g.metrics.hasSubscribers&&g.metrics.publish(i),s}#Y(t,e={}){let{updateAgeOnHas:i=this.updateAgeOnHas,status:s}=e,n=this.#s.get(t);if(n!==void 0){let r=this.#t[n];if(this.#e(r)&&r.__staleWhileFetching===void 0)return!1;if(this.#p(n))s&&(s.has="stale",this.#E(s,n));else return i&&this.#R(n),s&&(s.has="hit",this.#E(s,n)),!0}else s&&(s.has="miss");return!1}peek(t,e={}){let{status:i=x()?{}:void 0}=e;i&&(i.op="peek",i.key=t,i.cache=this),e.status=i;let s=this.#J(t,e);return g.metrics.hasSubscribers&&g.metrics.publish(i),s}#J(t,e){let{status:i,allowStale:s=this.allowStale}=e,n=this.#s.get(t);if(n===void 0||!s&&this.#p(n)){i&&(i.peek=n===void 0?"miss":"stale");return}let r=this.#t[n],h=this.#e(r)?r.__staleWhileFetching:r;return i&&(h!==void 0?(i.peek="hit",i.value=h):i.peek="miss"),h}#G(t,e,i,s){let n=e===void 0?void 0:this.#t[e];if(this.#e(n))return n;let r=new AbortController,{signal:h}=i;h?.addEventListener("abort",()=>r.abort(h.reason),{signal:r.signal});let a={signal:r.signal,options:i,context:s},o=(f,b=!1)=>{let{aborted:l}=r.signal,S=i.ignoreFetchAbort&&f!==void 0,F=i.ignoreFetchAbort||!!(i.allowStaleOnFetchAbort&&f!==void 0);if(i.status&&(l&&!b?(i.status.fetchAborted=!0,i.status.fetchError=r.signal.reason,S&&(i.status.fetchAbortIgnored=!0)):i.status.fetchResolved=!0),l&&!S&&!b)return y(r.signal.reason,F);let w=u,m=this.#t[e];return(m===u||m===void 0&&S&&b)&&(f===void 0?w.__staleWhileFetching!==void 0?this.#t[e]=w.__staleWhileFetching:this.#v(t,"fetch"):(i.status&&(i.status.fetchUpdated=!0),this.#O(t,f,a.options,w))),f},d=f=>(i.status&&(i.status.fetchRejected=!0,i.status.fetchError=f),y(f,!1)),y=(f,b)=>{let{aborted:l}=r.signal,S=l&&i.allowStaleOnFetchAbort,F=S||i.allowStaleOnFetchRejection,w=F||i.noDeleteOnFetchRejection,m=u;if(this.#t[e]===u&&(!w||!b&&m.__staleWhileFetching===void 0?this.#v(t,"fetch"):S||(this.#t[e]=m.__staleWhileFetching)),F)return i.status&&m.__staleWhileFetching!==void 0&&(i.status.returnedStale=!0),m.__staleWhileFetching;if(m.__returned===m)throw f},_=(f,b)=>{let l=this.#M?.(t,n,a);r.signal.addEventListener("abort",()=>{(!i.ignoreFetchAbort||i.allowStaleOnFetchAbort)&&(f(void 0),i.allowStaleOnFetchAbort&&(f=S=>o(S,!0)))}),l&&l instanceof Promise?l.then(S=>f(S===void 0?void 0:S),b):l!==void 0&&f(l)};i.status&&(i.status.fetchDispatched=!0);let u=new Promise(_).then(o,d),p=Object.assign(u,{__abortController:r,__staleWhileFetching:n,__returned:void 0});return e===void 0?(this.#O(t,p,{...a.options,status:void 0}),e=this.#s.get(t)):this.#t[e]=p,p}#e(t){if(!this.#U)return!1;let e=t;return!!e&&e instanceof Promise&&e.hasOwnProperty("__staleWhileFetching")&&e.__abortController instanceof AbortController}fetch(t,e={}){let i=g.tracing.hasSubscribers,{status:s=x()?{}:void 0}=e;e.status=s,s&&e.context&&(s.context=e.context);let n=this.#B(t,e);return s&&i&&(s.trace=!0,g.tracing.tracePromise(()=>n,s).catch(()=>{})),n}async#B(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,ttl:r=this.ttl,noDisposeOnSet:h=this.noDisposeOnSet,size:a=0,sizeCalculation:o=this.sizeCalculation,noUpdateTTL:d=this.noUpdateTTL,noDeleteOnFetchRejection:y=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:_=this.allowStaleOnFetchRejection,ignoreFetchAbort:u=this.ignoreFetchAbort,allowStaleOnFetchAbort:p=this.allowStaleOnFetchAbort,context:f,forceRefresh:b=!1,status:l,signal:S}=e;if(l&&(l.op="fetch",l.key=t,b&&(l.forceRefresh=!0),l.cache=this),!this.#U)return l&&(l.fetch="get"),this.#C(t,{allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:n,status:l});let F={allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:n,ttl:r,noDisposeOnSet:h,size:a,sizeCalculation:o,noUpdateTTL:d,noDeleteOnFetchRejection:y,allowStaleOnFetchRejection:_,allowStaleOnFetchAbort:p,ignoreFetchAbort:u,status:l,signal:S},w=this.#s.get(t);if(w===void 0){l&&(l.fetch="miss");let m=this.#G(t,w,F,f);return m.__returned=m}else{let m=this.#t[w];if(this.#e(m)){let E=i&&m.__staleWhileFetching!==void 0;return l&&(l.fetch="inflight",E&&(l.returnedStale=!0)),E?m.__staleWhileFetching:m.__returned=m}let A=this.#p(w);if(!b&&!A)return l&&(l.fetch="hit"),this.#L(w),s&&this.#R(w),l&&this.#E(l,w),m;let z=this.#G(t,w,F,f),v=z.__staleWhileFetching!==void 0&&i;return l&&(l.fetch=A?"stale":"refresh",v&&A&&(l.returnedStale=!0)),v?z.__staleWhileFetching:z.__returned=z}}forceFetch(t,e={}){let i=g.tracing.hasSubscribers,{status:s=x()?{}:void 0}=e;e.status=s,s&&e.context&&(s.context=e.context);let n=this.#K(t,e);return s&&i&&(s.trace=!0,g.tracing.tracePromise(()=>n,s).catch(()=>{})),n}async#K(t,e={}){let i=await this.#B(t,e);if(i===void 0)throw new Error("fetch() returned undefined");return i}memo(t,e={}){let{status:i=g.metrics.hasSubscribers?{}:void 0}=e;e.status=i,i&&(i.op="memo",i.key=t,e.context&&(i.context=e.context),i.cache=this);let s=this.#Q(t,e);return i&&(i.value=s),g.metrics.hasSubscribers&&g.metrics.publish(i),s}#Q(t,e={}){let i=this.#j;if(!i)throw new Error("no memoMethod provided to constructor");let{context:s,status:n,forceRefresh:r,...h}=e;n&&r&&(n.forceRefresh=!0);let a=this.#C(t,h),o=r||a===void 0;if(n&&(n.memo=o?"miss":"hit",o||(n.value=a)),!o)return a;let d=i(t,a,{options:h,context:s});return n&&(n.value=d),this.#O(t,d,h),d}get(t,e={}){let{status:i=g.metrics.hasSubscribers?{}:void 0}=e;e.status=i,i&&(i.op="get",i.key=t,i.cache=this);let s=this.#C(t,e);return i&&(s!==void 0&&(i.value=s),g.metrics.hasSubscribers&&g.metrics.publish(i)),s}#C(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,status:r}=e,h=this.#s.get(t);if(h===void 0){r&&(r.get="miss");return}let a=this.#t[h],o=this.#e(a);return r&&this.#E(r,h),this.#p(h)?o?(r&&(r.get="stale-fetching"),i&&a.__staleWhileFetching!==void 0?(r&&(r.returnedStale=!0),a.__staleWhileFetching):void 0):(n||this.#v(t,"expire"),r&&(r.get="stale"),i?(r&&(r.returnedStale=!0),a):void 0):(r&&(r.get=o?"fetching":"hit"),this.#L(h),s&&this.#R(h),o?a.__staleWhileFetching:a)}#q(t,e){this.#u[e]=t,this.#l[t]=e}#L(t){t!==this.#h&&(t===this.#a?this.#a=this.#l[t]:this.#q(this.#u[t],this.#l[t]),this.#q(this.#h,t),this.#h=t)}delete(t){return this.#v(t,"delete")}#v(t,e){g.metrics.hasSubscribers&&g.metrics.publish({op:"delete",delete:e,key:t,cache:this});let i=!1;if(this.#n!==0){let s=this.#s.get(t);if(s!==void 0)if(this.#g?.[s]&&(clearTimeout(this.#g?.[s]),this.#g[s]=void 0),i=!0,this.#n===1)this.#$(e);else{this.#x(s);let n=this.#t[s];if(this.#e(n)?n.__abortController.abort(new Error("deleted")):(this.#T||this.#f)&&(this.#T&&this.#m?.(n,t,e),this.#f&&this.#r?.push([n,t,e])),this.#s.delete(t),this.#i[s]=void 0,this.#t[s]=void 0,s===this.#h)this.#h=this.#u[s];else if(s===this.#a)this.#a=this.#l[s];else{let r=this.#u[s];this.#l[r]=this.#l[s];let h=this.#l[s];this.#u[h]=this.#u[s]}this.#n--,this.#y.push(s)}}if(this.#f&&this.#r?.length){let s=this.#r,n;for(;n=s?.shift();)this.#S?.(...n)}return i}clear(){return this.#$("delete")}#$(t){for(let e of this.#z({allowStale:!0})){let i=this.#t[e];if(this.#e(i))i.__abortController.abort(new Error("deleted"));else{let s=this.#i[e];this.#T&&this.#m?.(i,s,t),this.#f&&this.#r?.push([i,s,t])}}if(this.#s.clear(),this.#t.fill(void 0),this.#i.fill(void 0),this.#d&&this.#F){this.#d.fill(0),this.#F.fill(0);for(let e of this.#g??[])e!==void 0&&clearTimeout(e);this.#g?.fill(void 0)}if(this.#_&&this.#_.fill(0),this.#a=0,this.#h=0,this.#y.length=0,this.#b=0,this.#n=0,this.#f&&this.#r){let e=this.#r,i;for(;i=e?.shift();)this.#S?.(...i)}}};exports.LRUCache=L; +//# sourceMappingURL=index.min.js.map diff --git a/node_modules/lru-cache/dist/commonjs/index.min.js.map b/node_modules/lru-cache/dist/commonjs/index.min.js.map new file mode 100644 index 00000000..171cf936 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/index.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../src/diagnostics-channel-cjs.cts", "../../src/perf.ts", "../../src/index.ts"], + "sourcesContent": ["// this is used in CJS environments that do NOT follow the 'node' import\n// condition, to avoid even trying to load node:diagnostics_channel\nimport {\n type Channel,\n type TracingChannel,\n} from 'node:diagnostics_channel'\nexport type { TracingChannel, Channel }\n\nconst dummy = { hasSubscribers: false }\nexport const metrics = dummy as Channel\nexport const tracing = dummy as TracingChannel\n", "/**\n * this provides the default Perf object source, either the\n * `performance` global, or the `Date` constructor.\n *\n * it can be passed in via configuration to override it\n * for a single LRU object.\n */\nexport type Perf = { now: () => number }\nexport const defaultPerf: Perf =\n (\n typeof performance === 'object' &&\n performance &&\n typeof performance.now === 'function'\n ) ?\n /* c8 ignore start - this gets covered, but c8 gets confused */\n performance\n : /* c8 ignore stop */ Date\n", "/**\n * @module LRUCache\n */\n\nimport { metrics, tracing } from './diagnostics-channel.js'\nimport { defaultPerf } from './perf.js'\nimport type { Perf } from './perf.js'\nexport type { Perf } from './perf.js'\n\nconst hasSubscribers = () =>\n metrics.hasSubscribers || tracing.hasSubscribers\n\nconst warned = new Set()\n\n// either a function or a class\n// oxlint-disable-next-line no-explicit-any\ntype ForC = ((...a: any[]) => any) | { new (...a: any[]): any }\n\n/* c8 ignore start */\nconst PROCESS = (\n typeof process === 'object' && !!process ?\n process\n : {}) as { [k: string]: unknown }\n/* c8 ignore stop */\n\nconst emitWarning = (\n msg: string,\n type: string,\n code: string,\n fn: ForC,\n) => {\n if (typeof PROCESS.emitWarning === 'function') {\n PROCESS.emitWarning(msg, type, code, fn)\n } else {\n //oxlint-disable-next-line no-console\n console.error(`[${code}] ${type}: ${msg}`)\n }\n}\nconst shouldWarn = (code: string) => !warned.has(code)\n\nconst TYPE = Symbol('type')\nexport type PosInt = number & { [TYPE]: 'Positive Integer' }\nexport type Index = number & { [TYPE]: 'LRUCache Index' }\n\nconst isPosInt = (n: unknown): n is PosInt =>\n !!n && n === Math.floor(n as number) && n > 0 && isFinite(n)\n\nexport type UintArray = Uint8Array | Uint16Array | Uint32Array\nexport type NumberArray = UintArray | number[]\n\n// This is a little bit ridiculous, tbh.\n// The maximum array length is 2^32-1 or thereabouts on most JS impls.\n// And well before that point, you're caching the entire world, I mean,\n// that's ~32GB of just integers for the next/prev links, plus whatever\n// else to hold that many keys and values. Just filling the memory with\n// zeroes at init time is brutal when you get that big.\n// But why not be complete?\n// Maybe in the future, these limits will have expanded.\n/* c8 ignore start */\nconst getUintArray = (max: number) =>\n !isPosInt(max) ? null\n : max <= Math.pow(2, 8) ? Uint8Array\n : max <= Math.pow(2, 16) ? Uint16Array\n : max <= Math.pow(2, 32) ? Uint32Array\n : max <= Number.MAX_SAFE_INTEGER ? ZeroArray\n : null\n/* c8 ignore stop */\n\nclass ZeroArray extends Array {\n constructor(size: number) {\n super(size)\n this.fill(0)\n }\n}\nexport type { ZeroArray }\nexport type { Stack }\n\nexport type StackLike = Stack | Index[]\nclass Stack {\n /* c8 ignore start - not sure why this is showing up uncovered?? */\n heap: NumberArray\n /* c8 ignore stop */\n length: number\n // private constructor\n static #constructing: boolean = false\n static create(max: number): StackLike {\n const HeapCls = getUintArray(max)\n if (!HeapCls) return []\n Stack.#constructing = true\n const s = new Stack(max, HeapCls)\n Stack.#constructing = false\n return s\n }\n constructor(max: number, HeapCls: { new (n: number): NumberArray }) {\n /* c8 ignore start */\n if (!Stack.#constructing) {\n throw new TypeError('instantiate Stack using Stack.create(n)')\n }\n /* c8 ignore stop */\n this.heap = new HeapCls(max)\n this.length = 0\n }\n push(n: Index) {\n this.heap[this.length++] = n\n }\n pop(): Index {\n return this.heap[--this.length] as Index\n }\n}\n\n/**\n * Promise representing an in-progress {@link LRUCache#fetch} call\n */\nexport type BackgroundFetch = Promise & {\n __returned: BackgroundFetch | undefined\n __abortController: AbortController\n __staleWhileFetching: V | undefined\n}\n\nexport type DisposeTask = [\n value: V,\n key: K,\n reason: LRUCache.DisposeReason,\n]\n\nexport namespace LRUCache {\n /**\n * An integer greater than 0, reflecting the calculated size of items\n */\n export type Size = number\n\n /**\n * Integer greater than 0, representing some number of milliseconds, or the\n * time at which a TTL started counting from.\n */\n export type Milliseconds = number\n\n /**\n * An integer greater than 0, reflecting a number of items\n */\n export type Count = number\n\n /**\n * The reason why an item was removed from the cache, passed\n * to the {@link Disposer} methods.\n *\n * - `evict`: The item was evicted because it is the least recently used,\n * and the cache is full.\n * - `set`: A new value was set, overwriting the old value being disposed.\n * - `delete`: The item was explicitly deleted, either by calling\n * {@link LRUCache#delete}, {@link LRUCache#clear}, or\n * {@link LRUCache#set} with an undefined value.\n * - `expire`: The item was removed due to exceeding its TTL.\n * - `fetch`: A {@link OptionsBase#fetchMethod} operation returned\n * `undefined` or was aborted, causing the item to be deleted.\n */\n export type DisposeReason =\n | 'evict'\n | 'set'\n | 'delete'\n | 'expire'\n | 'fetch'\n /**\n * A method called upon item removal, passed as the\n * {@link OptionsBase.dispose} and/or\n * {@link OptionsBase.disposeAfter} options.\n */\n export type Disposer = (\n value: V,\n key: K,\n reason: DisposeReason,\n ) => void\n\n /**\n * The reason why an item was added to the cache, passed\n * to the {@link Inserter} methods.\n *\n * - `add`: the item was not found in the cache, and was added\n * - `update`: the item was in the cache, with the same value provided\n * - `replace`: the item was in the cache, and replaced\n */\n export type InsertReason = 'add' | 'update' | 'replace'\n\n /**\n * A method called upon item insertion, passed as the\n * {@link OptionsBase.insert}\n */\n export type Inserter = (\n value: V,\n key: K,\n reason: InsertReason,\n ) => void\n\n /**\n * A function that returns the effective calculated size\n * of an entry in the cache.\n */\n export type SizeCalculator = (value: V, key: K) => Size\n\n /**\n * Options provided to the\n * {@link OptionsBase.fetchMethod} function.\n */\n export interface FetcherOptions {\n signal: AbortSignal\n options: FetcherFetchOptions\n /**\n * Object provided in the {@link FetchOptions.context} option to\n * {@link LRUCache#fetch}\n */\n context: FC\n }\n\n /**\n * Occasionally, it may be useful to track the internal behavior of the\n * cache, particularly for logging, debugging, or for behavior within the\n * `fetchMethod`. To do this, you can pass a `status` object to the\n * {@link LRUCache#fetch}, {@link LRUCache#get}, {@link LRUCache#set},\n * {@link LRUCache#memo}, and {@link LRUCache#has} methods.\n *\n * The `status` option should be a plain JavaScript object. The following\n * fields will be set on it appropriately, depending on the situation.\n *\n * These objects are also the context objects passed to listeners on the\n * `lru-cache:metrics` diagnostic channel, and the `lru-cache` tracing\n * channels, in platforms that support them.\n */\n export interface Status {\n /**\n * The operation being performed\n */\n op?: 'get' | 'set' | 'memo' | 'fetch' | 'delete' | 'has' | 'peek'\n /**\n * The status of a set() operation.\n *\n * - add: the item was not found in the cache, and was added\n * - update: the item was in the cache, with the same value provided\n * - replace: the item was in the cache, and replaced\n * - miss: the item was not added to the cache for some reason\n */\n set?: 'add' | 'update' | 'replace' | 'miss' | 'deleted'\n\n /**\n * The status of a delete() operation.\n */\n delete?: LRUCache.DisposeReason\n\n /**\n * The result of a peek() operation\n *\n * - hit: the item was found and returned\n * - stale: the item is in the cache, but past its ttl and not returned\n * - miss: item not in the cache\n */\n peek?: 'hit' | 'miss' | 'stale'\n\n /**\n * The status of a memo() operation.\n *\n * - 'hit': the item was found in the cache and returned\n * - 'miss': the `memoMethod` function was called\n */\n memo?: 'hit' | 'miss'\n\n /**\n * The `context` option provided to a memo or fetch operation\n *\n * In practice, of course, this will be the same type as the `FC`\n * fetch context param used to instantiate the LRUCache, but the\n * convolutions of threading that through would get quite complicated,\n * and preclude forcing/forbidding the passing of a `context` param\n * where it is/isn't expected, which is more valuable for error\n * prevention.\n */\n context?: unknown\n\n /**\n * the ttl stored for the item, or undefined if ttls are not used.\n */\n ttl?: Milliseconds\n\n /**\n * the start time for the item, or undefined if ttls are not used.\n */\n start?: Milliseconds\n\n /**\n * The timestamp used for TTL calculation\n */\n now?: Milliseconds\n\n /**\n * the remaining ttl for the item, or undefined if ttls are not used.\n */\n remainingTTL?: Milliseconds\n\n /**\n * The calculated size for the item, if sizes are used.\n */\n entrySize?: Size\n\n /**\n * The total calculated size of the cache, if sizes are used.\n */\n totalCalculatedSize?: Size\n\n /**\n * A flag indicating that the item was not stored, due to exceeding the\n * {@link OptionsBase.maxEntrySize}\n */\n maxEntrySizeExceeded?: true\n\n /**\n * The key that was set or retrieved\n */\n key?: K\n\n /**\n * The value that was set\n */\n value?: V\n\n /**\n * The old value, specified in the case of `set:'replace'`\n */\n oldValue?: V\n\n /**\n * The results of a {@link LRUCache#has} operation\n *\n * - hit: the item was found in the cache\n * - stale: the item was found in the cache, but is stale\n * - miss: the item was not found in the cache\n */\n has?: 'hit' | 'stale' | 'miss'\n\n /**\n * The status of a {@link LRUCache#fetch} operation.\n * Note that this can change as the underlying fetch() moves through\n * various states.\n *\n * - inflight: there is another fetch() for this key which is in process\n * - get: there is no {@link OptionsBase.fetchMethod}, so\n * {@link LRUCache#get} was called.\n * - miss: the item is not in cache, and will be fetched.\n * - hit: the item is in the cache, and was resolved immediately.\n * - stale: the item is in the cache, but stale.\n * - refresh: the item is in the cache, and not stale, but\n * {@link FetchOptions.forceRefresh} was specified.\n */\n fetch?: 'get' | 'inflight' | 'miss' | 'hit' | 'stale' | 'refresh'\n\n /**\n * `forceRefresh` option was used for either a fetch or memo operation\n */\n forceRefresh?: boolean\n\n /**\n * The {@link OptionsBase.fetchMethod} was called\n */\n fetchDispatched?: true\n\n /**\n * The cached value was updated after a successful call to\n * {@link OptionsBase.fetchMethod}\n */\n fetchUpdated?: true\n\n /**\n * The reason for a fetch() rejection. Either the error raised by the\n * {@link OptionsBase.fetchMethod}, or the reason for an\n * AbortSignal.\n */\n fetchError?: Error\n\n /**\n * The fetch received an abort signal\n */\n fetchAborted?: true\n\n /**\n * The abort signal received was ignored, and the fetch was allowed to\n * continue in the background.\n */\n fetchAbortIgnored?: true\n\n /**\n * The fetchMethod promise resolved successfully\n */\n fetchResolved?: true\n\n /**\n * The fetchMethod promise was rejected\n */\n fetchRejected?: true\n\n /**\n * The status of a {@link LRUCache#get} operation.\n *\n * - fetching: The item is currently being fetched. If a previous value\n * is present and allowed, that will be returned.\n * - stale: The item is in the cache, and is stale. If it was returned,\n * then the `returnedStale` flag will be set.\n * - stale-fetching: The value is being fetched in the background, but is\n * currently stale. If the stale value was returned, then the\n * `returnedStale` flag will be set.\n * - hit: the item is in the cache\n * - miss: the item is not in the cache\n */\n get?: 'stale' | 'hit' | 'miss' | 'fetching' | 'stale-fetching'\n\n /**\n * A fetch or get operation returned a stale value.\n */\n returnedStale?: true\n\n /**\n * A tracingChannel trace was started for this operation\n */\n trace?: boolean\n\n /**\n * A reference to the cache instance associated with this operation\n */\n cache?: LRUCache\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#fetch}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link OptionsBase.noDeleteOnFetchRejection},\n * {@link OptionsBase.allowStaleOnFetchRejection},\n * {@link FetchOptions.forceRefresh}, and\n * {@link FetcherOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.fetchMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the fetchMethod is called.\n */\n export interface FetcherFetchOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n status?: Status\n size?: Size\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#fetch} method.\n */\n export interface FetchOptions extends FetcherFetchOptions<\n K,\n V,\n FC\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.fetchMethod} as\n * the {@link FetcherOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n signal?: AbortSignal\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface FetchOptionsWithContext extends FetchOptions<\n K,\n V,\n FC\n > {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is\n * `undefined` or `void`\n */\n export interface FetchOptionsNoContext<\n K,\n V,\n FC extends undefined | void = undefined,\n > extends FetchOptions {\n context?: FC\n }\n\n export interface MemoOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.memoMethod} as\n * the {@link MemoizerOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface MemoOptionsWithContext extends MemoOptions<\n K,\n V,\n FC\n > {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is\n * `undefined` or `void`\n */\n export interface MemoOptionsNoContext<\n K,\n V,\n FC extends undefined | void = undefined,\n > extends MemoOptions {\n context?: FC\n }\n\n /**\n * Options provided to the\n * {@link OptionsBase.memoMethod} function.\n */\n export interface MemoizerOptions {\n options: MemoizerMemoOptions\n /**\n * Object provided in the {@link MemoOptions.context} option to\n * {@link LRUCache#memo}\n */\n context: FC\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#memo}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link MemoOptions.forceRefresh}, and\n * {@link MemoOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.memoMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the memoMethod is called.\n */\n export interface MemoizerMemoOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n > {\n status?: Status\n size?: Size\n start?: Milliseconds\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#has} method.\n */\n export interface HasOptions extends Pick<\n OptionsBase,\n 'updateAgeOnHas'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#get} method.\n */\n export interface GetOptions extends Pick<\n OptionsBase,\n 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#peek} method.\n */\n export interface PeekOptions extends Pick<\n OptionsBase,\n 'allowStale'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#set} method.\n */\n export interface SetOptions extends Pick<\n OptionsBase,\n 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'\n > {\n /**\n * If size tracking is enabled, then setting an explicit size\n * in the {@link LRUCache#set} call will prevent calling the\n * {@link OptionsBase.sizeCalculation} function.\n */\n size?: Size\n /**\n * If TTL tracking is enabled, then setting an explicit start\n * time in the {@link LRUCache#set} call will override the\n * default time from `performance.now()` or `Date.now()`.\n *\n * Note that it must be a valid value for whichever time-tracking\n * method is in use.\n */\n start?: Milliseconds\n status?: Status\n }\n\n /**\n * The type signature for the {@link OptionsBase.fetchMethod} option.\n */\n export type Fetcher = (\n key: K,\n staleValue: V | undefined,\n options: FetcherOptions,\n ) => Promise | V | undefined | void\n\n /**\n * the type signature for the {@link OptionsBase.memoMethod} option.\n */\n export type Memoizer = (\n key: K,\n staleValue: V | undefined,\n options: MemoizerOptions,\n ) => V\n\n /**\n * Options which may be passed to the {@link LRUCache} constructor.\n *\n * Most of these may be overridden in the various options that use\n * them.\n *\n * Despite all being technically optional, the constructor requires that\n * a cache is at minimum limited by one or more of {@link OptionsBase.max},\n * {@link OptionsBase.ttl}, or {@link OptionsBase.maxSize}.\n *\n * If {@link OptionsBase.ttl} is used alone, then it is strongly advised\n * (and in fact required by the type definitions here) that the cache\n * also set {@link OptionsBase.ttlAutopurge}, to prevent potentially\n * unbounded storage.\n *\n * All options are also available on the {@link LRUCache} instance, making\n * it safe to pass an LRUCache instance as the options argumemnt to\n * make another empty cache of the same type.\n *\n * Some options are marked as read-only, because changing them after\n * instantiation is not safe. Changing any of the other options will of\n * course only have an effect on subsequent method calls.\n */\n export interface OptionsBase {\n /**\n * The maximum number of items to store in the cache before evicting\n * old entries. This is read-only on the {@link LRUCache} instance,\n * and may not be overridden.\n *\n * If set, then storage space will be pre-allocated at construction\n * time, and the cache will perform significantly faster.\n *\n * Note that significantly fewer items may be stored, if\n * {@link OptionsBase.maxSize} and/or {@link OptionsBase.ttl} are also\n * set.\n *\n * **It is strongly recommended to set a `max` to prevent unbounded growth\n * of the cache.**\n */\n max?: Count\n\n /**\n * Max time in milliseconds for items to live in cache before they are\n * considered stale. Note that stale items are NOT preemptively removed by\n * default, and MAY live in the cache, contributing to its LRU max, long\n * after they have expired, unless {@link OptionsBase.ttlAutopurge} is\n * set.\n *\n * If set to `0` (the default value), then that means \"do not track\n * TTL\", not \"expire immediately\".\n *\n * Also, as this cache is optimized for LRU/MRU operations, some of\n * the staleness/TTL checks will reduce performance, as they will incur\n * overhead by deleting items.\n *\n * This is not primarily a TTL cache, and does not make strong TTL\n * guarantees. There is no pre-emptive pruning of expired items, but you\n * _may_ set a TTL on the cache, and it will treat expired items as missing\n * when they are fetched, and delete them.\n *\n * Optional, but must be a non-negative integer in ms if specified.\n *\n * This may be overridden by passing an options object to `cache.set()`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if ttl tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * If ttl tracking is enabled, and `max` and `maxSize` are not set,\n * and `ttlAutopurge` is not set, then a warning will be emitted\n * cautioning about the potential for unbounded memory consumption.\n * (The TypeScript definitions will also discourage this.)\n */\n ttl?: Milliseconds\n\n /**\n * Minimum amount of time in ms in which to check for staleness.\n * Defaults to 1, which means that the current time is checked\n * at most once per millisecond.\n *\n * Set to 0 to check the current time every time staleness is tested.\n * (This reduces performance, and is theoretically unnecessary.)\n *\n * Setting this to a higher value will improve performance somewhat\n * while using ttl tracking, albeit at the expense of keeping stale\n * items around a bit longer than their TTLs would indicate.\n *\n * @default 1\n */\n ttlResolution?: Milliseconds\n\n /**\n * Preemptively remove stale items from the cache.\n *\n * Note that this may *significantly* degrade performance, especially if\n * the cache is storing a large number of items. It is almost always best\n * to just leave the stale items in the cache, and let them fall out as new\n * items are added.\n *\n * Note that this means that {@link OptionsBase.allowStale} is a bit\n * pointless, as stale items will be deleted almost as soon as they\n * expire.\n *\n * Use with caution!\n */\n ttlAutopurge?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever it is retrieved from cache with\n * {@link LRUCache#get}, causing it to not expire. (It can still fall out\n * of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n */\n updateAgeOnGet?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever its presence in the cache is\n * checked with {@link LRUCache#has}, causing it to not expire. (It can\n * still fall out of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n */\n updateAgeOnHas?: boolean\n\n /**\n * Allow {@link LRUCache#get} and {@link LRUCache#fetch} calls to return\n * stale data, if available.\n *\n * By default, if you set `ttl`, stale items will only be deleted from the\n * cache when you `get(key)`. That is, it's not preemptively pruning items,\n * unless {@link OptionsBase.ttlAutopurge} is set.\n *\n * If you set `allowStale:true`, it'll return the stale value *as well as*\n * deleting it. If you don't set this, then it'll return `undefined` when\n * you try to get a stale entry.\n *\n * Note that when a stale entry is fetched, _even if it is returned due to\n * `allowStale` being set_, it is removed from the cache immediately. You\n * can suppress this behavior by setting\n * {@link OptionsBase.noDeleteOnStaleGet}, either in the constructor, or in\n * the options provided to {@link LRUCache#get}.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n * The `cache.has()` method will always return `false` for stale items.\n *\n * Only relevant if a ttl is set.\n */\n allowStale?: boolean\n\n /**\n * Function that is called on items when they are dropped from the\n * cache, as `dispose(value, key, reason)`.\n *\n * This can be handy if you want to close file descriptors or do\n * other cleanup tasks when items are no longer stored in the cache.\n *\n * **NOTE**: It is called _before_ the item has been fully removed\n * from the cache, so if you want to put it right back in, you need\n * to wait until the next tick. If you try to add it back in during\n * the `dispose()` function call, it will break things in subtle and\n * weird ways.\n *\n * Unlike several other options, this may _not_ be overridden by\n * passing an option to `set()`, for performance reasons.\n *\n * The `reason` will be one of the following strings, corresponding\n * to the reason for the item's deletion:\n *\n * - `evict` Item was evicted to make space for a new addition\n * - `set` Item was overwritten by a new value\n * - `expire` Item expired its TTL\n * - `fetch` Item was deleted due to a failed or aborted fetch, or a\n * fetchMethod returning `undefined.\n * - `delete` Item was removed by explicit `cache.delete(key)`,\n * `cache.clear()`, or `cache.set(key, undefined)`.\n */\n dispose?: Disposer\n\n /**\n * Function that is called when new items are inserted into the cache,\n * as `onInsert(value, key, reason)`.\n *\n * This can be useful if you need to perform actions when an item is\n * added, such as logging or tracking insertions.\n *\n * Unlike some other options, this may _not_ be overridden by passing\n * an option to `set()`, for performance and consistency reasons.\n */\n onInsert?: Inserter\n\n /**\n * The same as {@link OptionsBase.dispose}, but called *after* the entry\n * is completely removed and the cache is once again in a clean state.\n *\n * It is safe to add an item right back into the cache at this point.\n * However, note that it is *very* easy to inadvertently create infinite\n * recursion this way.\n */\n disposeAfter?: Disposer\n\n /**\n * Set to true to suppress calling the\n * {@link OptionsBase.dispose} function if the entry key is\n * still accessible within the cache.\n *\n * This may be overridden by passing an options object to\n * {@link LRUCache#set}.\n *\n * Only relevant if `dispose` or `disposeAfter` are set.\n */\n noDisposeOnSet?: boolean\n\n /**\n * Boolean flag to tell the cache to not update the TTL when setting a new\n * value for an existing key (ie, when updating a value rather than\n * inserting a new value). Note that the TTL value is _always_ set (if\n * provided) when adding a new entry into the cache.\n *\n * Has no effect if a {@link OptionsBase.ttl} is not set.\n *\n * May be passed as an option to {@link LRUCache#set}.\n */\n noUpdateTTL?: boolean\n\n /**\n * Set to a positive integer to track the sizes of items added to the\n * cache, and automatically evict items in order to stay below this size.\n * Note that this may result in fewer than `max` items being stored.\n *\n * Attempting to add an item to the cache whose calculated size is greater\n * that this amount will be a no-op. The item will not be cached, and no\n * other items will be evicted.\n *\n * Optional, must be a positive integer if provided.\n *\n * Sets `maxEntrySize` to the same value, unless a different value is\n * provided for `maxEntrySize`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if size tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * Note also that size tracking can negatively impact performance,\n * though for most cases, only minimally.\n */\n maxSize?: Size\n\n /**\n * The effective size for background fetch promises.\n *\n * This has no effect unless `maxSize` and `sizeCalculation` are used,\n * and a {@link LRUCache.OptionsBase.fetchMethod} is provided to\n * support {@link LRUCache#fetch}.\n *\n * If a stale value is present in the cache, then the effective size of\n * the background fetch is the size of the stale item it will eventually\n * replace. If not, then this value is used as its effective size.\n *\n * @default 1\n */\n backgroundFetchSize?: number\n\n /**\n * The maximum allowed size for any single item in the cache.\n *\n * If a larger item is passed to {@link LRUCache#set} or returned by a\n * {@link OptionsBase.fetchMethod} or {@link OptionsBase.memoMethod}, then\n * it will not be stored in the cache.\n *\n * Attempting to add an item whose calculated size is greater than\n * this amount will not cache the item or evict any old items, but\n * WILL delete an existing value if one is already present.\n *\n * Optional, must be a positive integer if provided. Defaults to\n * the value of `maxSize` if provided.\n */\n maxEntrySize?: Size\n\n /**\n * A function that returns a number indicating the item's size.\n *\n * Requires {@link OptionsBase.maxSize} to be set.\n *\n * If not provided, and {@link OptionsBase.maxSize} or\n * {@link OptionsBase.maxEntrySize} are set, then all\n * {@link LRUCache#set} calls **must** provide an explicit\n * {@link SetOptions.size} or sizeCalculation param.\n */\n sizeCalculation?: SizeCalculator\n\n /**\n * Method that provides the implementation for {@link LRUCache#fetch}\n *\n * ```ts\n * fetchMethod(key, staleValue, { signal, options, context })\n * ```\n *\n * If `fetchMethod` is not provided, then `cache.fetch(key)` is equivalent\n * to `Promise.resolve(cache.get(key))`.\n *\n * If at any time, `signal.aborted` is set to `true`, or if the\n * `signal.onabort` method is called, or if it emits an `'abort'` event\n * which you can listen to with `addEventListener`, then that means that\n * the fetch should be abandoned. This may be passed along to async\n * functions aware of AbortController/AbortSignal behavior.\n *\n * The `fetchMethod` should **only** return `undefined` or a Promise\n * resolving to `undefined` if the AbortController signaled an `abort`\n * event. In all other cases, it should return or resolve to a value\n * suitable for adding to the cache.\n *\n * The `options` object is a union of the options that may be provided to\n * `set()` and `get()`. If they are modified, then that will result in\n * modifying the settings to `cache.set()` when the value is resolved, and\n * in the case of\n * {@link OptionsBase.noDeleteOnFetchRejection} and\n * {@link OptionsBase.allowStaleOnFetchRejection}, the handling of\n * `fetchMethod` failures.\n *\n * For example, a DNS cache may update the TTL based on the value returned\n * from a remote DNS server by changing `options.ttl` in the `fetchMethod`.\n */\n fetchMethod?: Fetcher\n\n /**\n * Method that provides the implementation for {@link LRUCache#memo}\n */\n memoMethod?: Memoizer\n\n /**\n * Set to true to suppress the deletion of stale data when a\n * {@link OptionsBase.fetchMethod} returns a rejected promise.\n */\n noDeleteOnFetchRejection?: boolean\n\n /**\n * Do not delete stale items when they are retrieved with\n * {@link LRUCache#get}.\n *\n * Note that the `get` return value will still be `undefined`\n * unless {@link OptionsBase.allowStale} is true.\n *\n * When using time-expiring entries with `ttl`, by default stale\n * items will be removed from the cache when the key is accessed\n * with `cache.get()`.\n *\n * Setting this option will cause stale items to remain in the cache, until\n * they are explicitly deleted with `cache.delete(key)`, or retrieved with\n * `noDeleteOnStaleGet` set to `false`.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n *\n * Only relevant if a ttl is used.\n */\n noDeleteOnStaleGet?: boolean\n\n /**\n * Set to true to allow returning stale data when a\n * {@link OptionsBase.fetchMethod} throws an error or returns a rejected\n * promise.\n *\n * This differs from using {@link OptionsBase.allowStale} in that stale\n * data will ONLY be returned in the case that the {@link LRUCache#fetch}\n * fails, not any other times.\n *\n * If a `fetchMethod` fails, and there is no stale value available, the\n * `fetch()` will resolve to `undefined`. Ie, all `fetchMethod` errors are\n * suppressed.\n *\n * Implies `noDeleteOnFetchRejection`.\n *\n * This may be set in calls to `fetch()`, or defaulted on the constructor,\n * or overridden by modifying the options object in the `fetchMethod`.\n */\n allowStaleOnFetchRejection?: boolean\n\n /**\n * Set to true to return a stale value from the cache when the\n * `AbortSignal` passed to the {@link OptionsBase.fetchMethod} dispatches\n * an `'abort'` event, whether user-triggered, or due to internal cache\n * behavior.\n *\n * Unless {@link OptionsBase.ignoreFetchAbort} is also set, the underlying\n * {@link OptionsBase.fetchMethod} will still be considered canceled, and\n * any value it returns will be ignored and not cached.\n *\n * Caveat: since fetches are aborted when a new value is explicitly\n * set in the cache, this can lead to fetch returning a stale value,\n * since that was the fallback value _at the moment the `fetch()` was\n * initiated_, even though the new updated value is now present in\n * the cache.\n *\n * For example:\n *\n * ```ts\n * const cache = new LRUCache({\n * ttl: 100,\n * fetchMethod: async (url, oldValue, { signal }) => {\n * const res = await fetch(url, { signal })\n * return await res.json()\n * }\n * })\n * cache.set('https://example.com/', { some: 'data' })\n * // 100ms go by...\n * const result = cache.fetch('https://example.com/')\n * cache.set('https://example.com/', { other: 'thing' })\n * console.log(await result) // { some: 'data' }\n * console.log(cache.get('https://example.com/')) // { other: 'thing' }\n * ```\n */\n allowStaleOnFetchAbort?: boolean\n\n /**\n * Set to true to ignore the `abort` event emitted by the `AbortSignal`\n * object passed to {@link OptionsBase.fetchMethod}, and still cache the\n * resulting resolution value, as long as it is not `undefined`.\n *\n * When used on its own, this means aborted {@link LRUCache#fetch} calls\n * are not immediately resolved or rejected when they are aborted, and\n * instead take the full time to await.\n *\n * When used with {@link OptionsBase.allowStaleOnFetchAbort}, aborted\n * {@link LRUCache#fetch} calls will resolve immediately to their stale\n * cached value or `undefined`, and will continue to process and eventually\n * update the cache when they resolve, as long as the resulting value is\n * not `undefined`, thus supporting a \"return stale on timeout while\n * refreshing\" mechanism by passing `AbortSignal.timeout(n)` as the signal.\n *\n * For example:\n *\n * ```ts\n * const c = new LRUCache({\n * ttl: 100,\n * ignoreFetchAbort: true,\n * allowStaleOnFetchAbort: true,\n * fetchMethod: async (key, oldValue, { signal }) => {\n * // note: do NOT pass the signal to fetch()!\n * // let's say this fetch can take a long time.\n * const res = await fetch(`https://slow-backend-server/${key}`)\n * return await res.json()\n * },\n * })\n *\n * // this will return the stale value after 100ms, while still\n * // updating in the background for next time.\n * const val = await c.fetch('key', { signal: AbortSignal.timeout(100) })\n * ```\n *\n * **Note**: regardless of this setting, an `abort` event _is still\n * emitted on the `AbortSignal` object_, so may result in invalid results\n * when passed to other underlying APIs that use AbortSignals.\n *\n * This may be overridden in the {@link OptionsBase.fetchMethod} or the\n * call to {@link LRUCache#fetch}.\n */\n ignoreFetchAbort?: boolean\n\n /**\n * In some cases, you may want to swap out the performance/Date object\n * used for TTL tracking. This should almost certainly NOT be done in\n * production environments!\n *\n * This value defaults to `global.performance` if it has a `now()` method,\n * or the `global.Date` object otherwise.\n */\n perf?: Perf\n }\n\n export interface OptionsMaxLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n max: Count\n }\n export interface OptionsTTLLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n ttl: Milliseconds\n ttlAutopurge: boolean\n }\n export interface OptionsSizeLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n maxSize: Size\n }\n\n /**\n * The valid safe options for the {@link LRUCache} constructor\n */\n export type Options =\n | OptionsMaxLimit\n | OptionsSizeLimit\n | OptionsTTLLimit\n\n /**\n * Entry objects used by {@link LRUCache#load} and {@link LRUCache#dump},\n * and returned by {@link LRUCache#info}.\n */\n export interface Entry {\n value: V\n ttl?: Milliseconds\n size?: Size\n start?: Milliseconds\n }\n}\n\n/**\n * Default export, the thing you're using this module to get.\n *\n * The `K` and `V` types define the key and value types, respectively. The\n * optional `FC` type defines the type of the `context` object passed to\n * `cache.fetch()` and `cache.memo()`.\n *\n * Keys and values **must not** be `null` or `undefined`.\n *\n * All properties from the options object (with the exception of `max`,\n * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are\n * added as normal public members. (The listed options are read-only getters.)\n *\n * Changing any of these will alter the defaults for subsequent method calls.\n */\nexport class LRUCache {\n // options that cannot be changed without disaster\n readonly #max: LRUCache.Count\n readonly #maxSize: LRUCache.Size\n readonly #dispose?: LRUCache.Disposer\n readonly #onInsert?: LRUCache.Inserter\n readonly #disposeAfter?: LRUCache.Disposer\n readonly #fetchMethod?: LRUCache.Fetcher\n readonly #memoMethod?: LRUCache.Memoizer\n readonly #perf: Perf\n\n /**\n * {@link LRUCache.OptionsBase.perf}\n */\n get perf() {\n return this.#perf\n }\n\n /**\n * {@link LRUCache.OptionsBase.ttl}\n */\n ttl: LRUCache.Milliseconds\n\n /**\n * {@link LRUCache.OptionsBase.ttlResolution}\n */\n ttlResolution: LRUCache.Milliseconds\n /**\n * {@link LRUCache.OptionsBase.ttlAutopurge}\n */\n ttlAutopurge: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnGet}\n */\n updateAgeOnGet: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnHas}\n */\n updateAgeOnHas: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStale}\n */\n allowStale: boolean\n\n /**\n * {@link LRUCache.OptionsBase.noDisposeOnSet}\n */\n noDisposeOnSet: boolean\n /**\n * {@link LRUCache.OptionsBase.noUpdateTTL}\n */\n noUpdateTTL: boolean\n /**\n * {@link LRUCache.OptionsBase.maxEntrySize}\n */\n maxEntrySize: LRUCache.Size\n /**\n * {@link LRUCache.OptionsBase.sizeCalculation}\n */\n sizeCalculation?: LRUCache.SizeCalculator\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection}\n */\n noDeleteOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnStaleGet}\n */\n noDeleteOnStaleGet: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}\n */\n allowStaleOnFetchAbort: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection}\n */\n allowStaleOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.ignoreFetchAbort}\n */\n ignoreFetchAbort: boolean\n\n /** {@link LRUCache.OptionsBase.backgroundFetchSize} */\n backgroundFetchSize: number\n\n // computed properties\n #size: LRUCache.Count\n #calculatedSize: LRUCache.Size\n #keyMap: Map\n #keyList: (K | undefined)[]\n #valList: (V | BackgroundFetch | undefined)[]\n #next: NumberArray\n #prev: NumberArray\n #head: Index\n #tail: Index\n #free: StackLike\n #disposed?: DisposeTask[]\n #sizes?: ZeroArray\n #starts?: ZeroArray\n #ttls?: ZeroArray\n #autopurgeTimers?: (undefined | ReturnType)[]\n\n #hasDispose: boolean\n #hasFetchMethod: boolean\n #hasDisposeAfter: boolean\n #hasOnInsert: boolean\n\n /**\n * Do not call this method unless you need to inspect the\n * inner workings of the cache. If anything returned by this\n * object is modified in any way, strange breakage may occur.\n *\n * These fields are private for a reason!\n *\n * @internal\n */\n static unsafeExposeInternals<\n K extends {},\n V extends {},\n FC extends unknown = unknown,\n >(c: LRUCache) {\n return {\n // properties\n starts: c.#starts,\n ttls: c.#ttls,\n autopurgeTimers: c.#autopurgeTimers,\n sizes: c.#sizes,\n keyMap: c.#keyMap as Map,\n keyList: c.#keyList,\n valList: c.#valList,\n next: c.#next,\n prev: c.#prev,\n get head() {\n return c.#head\n },\n get tail() {\n return c.#tail\n },\n free: c.#free,\n // methods\n isBackgroundFetch: (p: unknown) => c.#isBackgroundFetch(p),\n backgroundFetch: (\n k: K,\n index: number | undefined,\n options: LRUCache.FetchOptions,\n context: unknown,\n ): BackgroundFetch =>\n c.#backgroundFetch(\n k,\n index as Index | undefined,\n options,\n context as FC,\n ),\n moveToTail: (index: number): void => c.#moveToTail(index as Index),\n indexes: (options?: { allowStale: boolean }) => c.#indexes(options),\n rindexes: (options?: { allowStale: boolean }) =>\n c.#rindexes(options),\n isStale: (index: number | undefined) => c.#isStale(index as Index),\n }\n }\n\n // Protected read-only members\n\n /**\n * {@link LRUCache.OptionsBase.max} (read-only)\n */\n get max(): LRUCache.Count {\n return this.#max\n }\n /**\n * {@link LRUCache.OptionsBase.maxSize} (read-only)\n */\n get maxSize(): LRUCache.Count {\n return this.#maxSize\n }\n /**\n * The total computed size of items in the cache (read-only)\n */\n get calculatedSize(): LRUCache.Size {\n return this.#calculatedSize\n }\n /**\n * The number of items stored in the cache (read-only)\n */\n get size(): LRUCache.Count {\n return this.#size\n }\n /**\n * {@link LRUCache.OptionsBase.fetchMethod} (read-only)\n */\n get fetchMethod(): LRUCache.Fetcher | undefined {\n return this.#fetchMethod\n }\n get memoMethod(): LRUCache.Memoizer | undefined {\n return this.#memoMethod\n }\n /**\n * {@link LRUCache.OptionsBase.dispose} (read-only)\n */\n get dispose() {\n return this.#dispose\n }\n /**\n * {@link LRUCache.OptionsBase.onInsert} (read-only)\n */\n get onInsert() {\n return this.#onInsert\n }\n /**\n * {@link LRUCache.OptionsBase.disposeAfter} (read-only)\n */\n get disposeAfter() {\n return this.#disposeAfter\n }\n\n constructor(options: LRUCache.Options | LRUCache) {\n const {\n max = 0,\n ttl,\n ttlResolution = 1,\n ttlAutopurge,\n updateAgeOnGet,\n updateAgeOnHas,\n allowStale,\n dispose,\n onInsert,\n disposeAfter,\n noDisposeOnSet,\n noUpdateTTL,\n maxSize = 0,\n maxEntrySize = 0,\n sizeCalculation,\n fetchMethod,\n memoMethod,\n noDeleteOnFetchRejection,\n noDeleteOnStaleGet,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n backgroundFetchSize = 1,\n perf,\n } = options\n\n this.backgroundFetchSize = backgroundFetchSize\n\n if (perf !== undefined) {\n if (typeof perf?.now !== 'function') {\n throw new TypeError(\n 'perf option must have a now() method if specified',\n )\n }\n }\n\n this.#perf = perf ?? defaultPerf\n\n if (max !== 0 && !isPosInt(max)) {\n throw new TypeError('max option must be a nonnegative integer')\n }\n\n const UintArray = max ? getUintArray(max) : Array\n if (!UintArray) {\n throw new Error('invalid max value: ' + max)\n }\n\n this.#max = max\n this.#maxSize = maxSize\n this.maxEntrySize = maxEntrySize || this.#maxSize\n this.sizeCalculation = sizeCalculation\n if (this.sizeCalculation) {\n if (!this.#maxSize && !this.maxEntrySize) {\n throw new TypeError(\n 'cannot set sizeCalculation without setting maxSize or maxEntrySize',\n )\n }\n if (typeof this.sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation set to non-function')\n }\n }\n\n if (memoMethod !== undefined && typeof memoMethod !== 'function') {\n throw new TypeError('memoMethod must be a function if defined')\n }\n this.#memoMethod = memoMethod\n\n if (fetchMethod !== undefined && typeof fetchMethod !== 'function') {\n throw new TypeError('fetchMethod must be a function if specified')\n }\n this.#fetchMethod = fetchMethod\n this.#hasFetchMethod = !!fetchMethod\n\n this.#keyMap = new Map()\n this.#keyList = Array.from({ length: max }).fill(undefined) as (\n | K\n | undefined\n )[]\n this.#valList = Array.from({ length: max }).fill(undefined) as (\n | V\n | undefined\n )[]\n this.#next = new UintArray(max)\n this.#prev = new UintArray(max)\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free = Stack.create(max)\n this.#size = 0\n this.#calculatedSize = 0\n\n if (typeof dispose === 'function') {\n this.#dispose = dispose\n }\n if (typeof onInsert === 'function') {\n this.#onInsert = onInsert\n }\n if (typeof disposeAfter === 'function') {\n this.#disposeAfter = disposeAfter\n this.#disposed = []\n } else {\n this.#disposeAfter = undefined\n this.#disposed = undefined\n }\n this.#hasDispose = !!this.#dispose\n this.#hasOnInsert = !!this.#onInsert\n this.#hasDisposeAfter = !!this.#disposeAfter\n\n this.noDisposeOnSet = !!noDisposeOnSet\n this.noUpdateTTL = !!noUpdateTTL\n this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection\n this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection\n this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort\n this.ignoreFetchAbort = !!ignoreFetchAbort\n\n // NB: maxEntrySize is set to maxSize if it's set\n if (this.maxEntrySize !== 0) {\n if (this.#maxSize !== 0) {\n if (!isPosInt(this.#maxSize)) {\n throw new TypeError(\n 'maxSize must be a positive integer if specified',\n )\n }\n }\n if (!isPosInt(this.maxEntrySize)) {\n throw new TypeError(\n 'maxEntrySize must be a positive integer if specified',\n )\n }\n this.#initializeSizeTracking()\n }\n\n this.allowStale = !!allowStale\n this.noDeleteOnStaleGet = !!noDeleteOnStaleGet\n this.updateAgeOnGet = !!updateAgeOnGet\n this.updateAgeOnHas = !!updateAgeOnHas\n this.ttlResolution =\n isPosInt(ttlResolution) || ttlResolution === 0 ? ttlResolution : 1\n this.ttlAutopurge = !!ttlAutopurge\n this.ttl = ttl || 0\n if (this.ttl) {\n if (!isPosInt(this.ttl)) {\n throw new TypeError('ttl must be a positive integer if specified')\n }\n this.#initializeTTLTracking()\n }\n\n // do not allow completely unbounded caches\n if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) {\n throw new TypeError(\n 'At least one of max, maxSize, or ttl is required',\n )\n }\n if (!this.ttlAutopurge && !this.#max && !this.#maxSize) {\n const code = 'LRU_CACHE_UNBOUNDED'\n if (shouldWarn(code)) {\n warned.add(code)\n const msg =\n 'TTL caching without ttlAutopurge, max, or maxSize can ' +\n 'result in unbounded memory consumption.'\n emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache)\n }\n }\n }\n\n /**\n * Return the number of ms left in the item's TTL. If item is not in cache,\n * returns `0`. Returns `Infinity` if item is in cache without a defined TTL.\n */\n getRemainingTTL(key: K) {\n return this.#keyMap.has(key) ? Infinity : 0\n }\n\n #initializeTTLTracking() {\n const ttls = new ZeroArray(this.#max)\n const starts = new ZeroArray(this.#max)\n this.#ttls = ttls\n this.#starts = starts\n const purgeTimers =\n this.ttlAutopurge ?\n Array.from>({\n length: this.#max,\n })\n : undefined\n this.#autopurgeTimers = purgeTimers\n\n this.#setItemTTL = (index, ttl, start = this.#perf.now()) => {\n starts[index] = ttl !== 0 ? start : 0\n ttls[index] = ttl\n setPurgetTimer(index, ttl)\n }\n\n this.#updateItemAge = index => {\n starts[index] = ttls[index] !== 0 ? this.#perf.now() : 0\n setPurgetTimer(index, ttls[index])\n }\n\n // clear out the purge timer if we're setting TTL to 0, and\n // previously had a ttl purge timer running, so it doesn't\n // fire unnecessarily. Don't need to do this if we're not doing\n // autopurge.\n const setPurgetTimer =\n !this.ttlAutopurge ?\n () => {}\n : (index: Index, ttl?: number) => {\n if (purgeTimers?.[index]) {\n clearTimeout(purgeTimers[index])\n purgeTimers[index] = undefined\n }\n if (ttl && ttl !== 0 && purgeTimers) {\n const t = setTimeout(() => {\n if (this.#isStale(index)) {\n this.#delete(this.#keyList[index] as K, 'expire')\n }\n }, ttl + 1)\n // unref() not supported on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n purgeTimers[index] = t\n }\n }\n\n this.#statusTTL = (status, index) => {\n if (ttls[index]) {\n const ttl = ttls[index]\n const start = starts[index]\n /* c8 ignore start */\n if (!ttl || !start) {\n return\n }\n /* c8 ignore stop */\n status.ttl = ttl\n status.start = start\n status.now = cachedNow || getNow()\n const age = status.now - start\n status.remainingTTL = ttl - age\n }\n }\n\n // debounce calls to perf.now() to 1s so we're not hitting\n // that costly call repeatedly.\n let cachedNow = 0\n const getNow = () => {\n const n = this.#perf.now()\n if (this.ttlResolution > 0) {\n cachedNow = n\n const t = setTimeout(() => (cachedNow = 0), this.ttlResolution)\n // not available on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n }\n return n\n }\n\n this.getRemainingTTL = key => {\n const index = this.#keyMap.get(key)\n if (index === undefined) {\n return 0\n }\n const ttl = ttls[index]\n const start = starts[index]\n if (!ttl || !start) {\n return Infinity\n }\n const age = (cachedNow || getNow()) - start\n return ttl - age\n }\n\n this.#isStale = index => {\n const s = starts[index]\n const t = ttls[index]\n return !!t && !!s && (cachedNow || getNow()) - s > t\n }\n }\n\n // conditionally set private methods related to TTL\n #updateItemAge: (index: Index) => void = () => {}\n #statusTTL: (status: LRUCache.Status, index: Index) => void =\n () => {}\n #setItemTTL: (\n index: Index,\n ttl: LRUCache.Milliseconds,\n start?: LRUCache.Milliseconds,\n // ignore because we never call this if we're not already in TTL mode\n /* c8 ignore start */\n ) => void = () => {}\n /* c8 ignore stop */\n\n #isStale: (index: Index) => boolean = () => false\n\n #initializeSizeTracking() {\n const sizes = new ZeroArray(this.#max)\n this.#calculatedSize = 0\n this.#sizes = sizes\n this.#removeItemSize = index => {\n this.#calculatedSize -= sizes[index] as number\n sizes[index] = 0\n }\n this.#requireSize = (k, v, size, sizeCalculation) => {\n if (!isPosInt(size)) {\n // provisionally accept background fetches.\n // actual value size will be checked when they return.\n if (this.#isBackgroundFetch(v)) {\n // NB: this cannot occur if v.__staleWhileFetching is set,\n // because in that case, it would take on the size of the\n // existing entry that it temporarily replaces.\n return this.backgroundFetchSize\n }\n if (sizeCalculation) {\n if (typeof sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation must be a function')\n }\n size = sizeCalculation(v, k)\n if (!isPosInt(size)) {\n throw new TypeError(\n 'sizeCalculation return invalid (expect positive integer)',\n )\n }\n } else {\n throw new TypeError(\n 'invalid size value (must be positive integer). ' +\n 'When maxSize or maxEntrySize is used, sizeCalculation ' +\n 'or size must be set.',\n )\n }\n }\n return size\n }\n\n this.#addItemSize = (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status,\n ) => {\n sizes[index] = size\n if (this.#maxSize) {\n const maxSize = this.#maxSize - sizes[index]\n while (this.#calculatedSize > maxSize) {\n this.#evict(true)\n }\n }\n this.#calculatedSize += sizes[index]\n if (status) {\n status.entrySize = size\n status.totalCalculatedSize = this.#calculatedSize\n }\n }\n }\n\n #removeItemSize: (index: Index) => void = _i => {}\n\n #addItemSize: (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status,\n ) => void = (_i, _s, _st) => {}\n\n #requireSize: (\n k: K,\n v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator,\n status?: LRUCache.Status,\n ) => LRUCache.Size = (\n _k: K,\n _v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator,\n ) => {\n if (size || sizeCalculation) {\n throw new TypeError(\n 'cannot set size without setting maxSize or maxEntrySize on cache',\n )\n }\n return 0\n };\n\n *#indexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#tail; this.#isValidIndex(i); ) {\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#head) {\n break\n } else {\n i = this.#prev[i] as Index\n }\n }\n }\n }\n\n *#rindexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#head; this.#isValidIndex(i); ) {\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#tail) {\n break\n } else {\n i = this.#next[i] as Index\n }\n }\n }\n }\n\n #isValidIndex(index: Index) {\n return (\n index !== undefined &&\n this.#keyMap.get(this.#keyList[index] as K) === index\n )\n }\n\n /**\n * Return a generator yielding `[key, value]` pairs,\n * in order from most recently used to least recently used.\n */\n *entries() {\n for (const i of this.#indexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]] as [K, V]\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.entries}\n *\n * Return a generator yielding `[key, value]` pairs,\n * in order from least recently used to most recently used.\n */\n *rentries() {\n for (const i of this.#rindexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]]\n }\n }\n }\n\n /**\n * Return a generator yielding the keys in the cache,\n * in order from most recently used to least recently used.\n */\n *keys() {\n for (const i of this.#indexes()) {\n const k = this.#keyList[i]\n if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield k\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.keys}\n *\n * Return a generator yielding the keys in the cache,\n * in order from least recently used to most recently used.\n */\n *rkeys() {\n for (const i of this.#rindexes()) {\n const k = this.#keyList[i]\n if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield k\n }\n }\n }\n\n /**\n * Return a generator yielding the values in the cache,\n * in order from most recently used to least recently used.\n */\n *values() {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i] as V\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.values}\n *\n * Return a generator yielding the values in the cache,\n * in order from least recently used to most recently used.\n */\n *rvalues() {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i]\n }\n }\n }\n\n /**\n * Iterating over the cache itself yields the same results as\n * {@link LRUCache.entries}\n */\n [Symbol.iterator]() {\n return this.entries()\n }\n\n /**\n * A String value that is used in the creation of the default string\n * description of an object. Called by the built-in method\n * `Object.prototype.toString`.\n */\n [Symbol.toStringTag] = 'LRUCache'\n\n /**\n * Find a value for which the supplied fn method returns a truthy value,\n * similar to `Array.find()`. fn is called as `fn(value, key, cache)`.\n */\n find(\n fn: (v: V, k: K, self: LRUCache) => boolean,\n getOptions: LRUCache.GetOptions = {},\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n if (fn(value, this.#keyList[i] as K, this)) {\n return this.#get(this.#keyList[i] as K, getOptions)\n }\n }\n }\n\n /**\n * Call the supplied function on each item in the cache, in order from most\n * recently used to least recently used.\n *\n * `fn` is called as `fn(value, key, cache)`.\n *\n * If `thisp` is provided, function will be called in the `this`-context of\n * the provided object, or the cache if no `thisp` object is provided.\n *\n * Does not update age or recenty of use, or iterate over stale values.\n */\n forEach(\n fn: (v: V, k: K, self: LRUCache) => unknown,\n thisp: unknown = this,\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * The same as {@link LRUCache.forEach} but items are iterated over in\n * reverse order. (ie, less recently used items are iterated over first.)\n */\n rforEach(\n fn: (v: V, k: K, self: LRUCache) => unknown,\n thisp: unknown = this,\n ) {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * Delete any stale entries. Returns true if anything was removed,\n * false otherwise.\n */\n purgeStale() {\n let deleted = false\n for (const i of this.#rindexes({ allowStale: true })) {\n if (this.#isStale(i)) {\n this.#delete(this.#keyList[i] as K, 'expire')\n deleted = true\n }\n }\n return deleted\n }\n\n /**\n * Get the extended info about a given entry, to get its value, size, and\n * TTL info simultaneously. Returns `undefined` if the key is not present.\n *\n * Unlike {@link LRUCache#dump}, which is designed to be portable and survive\n * serialization, the `start` value is always the current timestamp, and the\n * `ttl` is a calculated remaining time to live (negative if expired).\n *\n * Always returns stale values, if their info is found in the cache, so be\n * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl})\n * if relevant.\n */\n info(key: K): LRUCache.Entry | undefined {\n const i = this.#keyMap.get(key)\n if (i === undefined) return undefined\n const v = this.#valList[i]\n /* c8 ignore start - this isn't tested for the info function,\n * but it's the same logic as found in other places. */\n const value: V | undefined =\n this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) return undefined\n /* c8 ignore stop */\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n const ttl = this.#ttls[i]\n const start = this.#starts[i]\n if (ttl && start) {\n const remain = ttl - (this.#perf.now() - start)\n entry.ttl = remain\n entry.start = Date.now()\n }\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n return entry\n }\n\n /**\n * Return an array of [key, {@link LRUCache.Entry}] tuples which can be\n * passed to {@link LRUCache#load}.\n *\n * The `start` fields are calculated relative to a portable `Date.now()`\n * timestamp, even if `performance.now()` is available.\n *\n * Stale entries are always included in the `dump`, even if\n * {@link LRUCache.OptionsBase.allowStale} is false.\n *\n * Note: this returns an actual array, not a generator, so it can be more\n * easily passed around.\n */\n dump() {\n const arr: [K, LRUCache.Entry][] = []\n for (const i of this.#indexes({ allowStale: true })) {\n const key = this.#keyList[i]\n const v = this.#valList[i]\n const value: V | undefined =\n this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined || key === undefined) continue\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n entry.ttl = this.#ttls[i]\n // always dump the start relative to a portable timestamp\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = this.#perf.now() - (this.#starts[i] as number)\n entry.start = Math.floor(Date.now() - age)\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n arr.unshift([key, entry])\n }\n return arr\n }\n\n /**\n * Reset the cache and load in the items in entries in the order listed.\n *\n * The shape of the resulting cache may be different if the same options are\n * not used in both caches.\n *\n * The `start` fields are assumed to be calculated relative to a portable\n * `Date.now()` timestamp, even if `performance.now()` is available.\n */\n load(arr: [K, LRUCache.Entry][]) {\n this.clear()\n for (const [key, entry] of arr) {\n if (entry.start) {\n // entry.start is a portable timestamp, but we may be using\n // node's performance.now(), so calculate the offset, so that\n // we get the intended remaining TTL, no matter how long it's\n // been on ice.\n //\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = Date.now() - entry.start\n entry.start = this.#perf.now() - age\n }\n this.#set(key, entry.value, entry)\n }\n }\n\n /**\n * Add a value to the cache.\n *\n * Note: if `undefined` is specified as a value, this is an alias for\n * {@link LRUCache#delete}\n *\n * Fields on the {@link LRUCache.SetOptions} options param will override\n * their corresponding values in the constructor options for the scope\n * of this single `set()` operation.\n *\n * If `start` is provided, then that will set the effective start\n * time for the TTL calculation. Note that this must be a previous\n * value of `performance.now()` if supported, or a previous value of\n * `Date.now()` if not.\n *\n * Options object may also include `size`, which will prevent\n * calling the `sizeCalculation` function and just use the specified\n * number if it is a positive integer, and `noDisposeOnSet` which\n * will prevent calling a `dispose` function in the case of\n * overwrites.\n *\n * If the `size` (or return value of `sizeCalculation`) for a given\n * entry is greater than `maxEntrySize`, then the item will not be\n * added to the cache.\n *\n * Will update the recency of the entry.\n *\n * If the value is `undefined`, then this is an alias for\n * `cache.delete(key)`. `undefined` is never stored in the cache.\n */\n set(\n k: K,\n v: V | undefined,\n setOptions: LRUCache.SetOptions = {},\n ) {\n const { status = metrics.hasSubscribers ? {} : undefined } = setOptions\n setOptions.status = status\n if (status) {\n status.op = 'set'\n status.key = k\n if (v !== undefined) status.value = v\n status.cache = this\n }\n const result = this.#set(k, v, setOptions)\n if (status && metrics.hasSubscribers) {\n metrics.publish(status)\n }\n return result\n }\n\n #set(\n k: K,\n v: V | BackgroundFetch | undefined,\n setOptions: LRUCache.SetOptions,\n bf?: BackgroundFetch,\n ) {\n const {\n ttl = this.ttl,\n start,\n noDisposeOnSet = this.noDisposeOnSet,\n sizeCalculation = this.sizeCalculation,\n status,\n } = setOptions\n\n const isBF = this.#isBackgroundFetch(v)\n if (v === undefined) {\n if (status) status.set = 'deleted'\n this.delete(k)\n return this\n }\n let { noUpdateTTL = this.noUpdateTTL } = setOptions\n\n if (status && !isBF) status.value = v\n\n const size = this.#requireSize(\n k,\n v,\n setOptions.size || 0,\n sizeCalculation,\n status,\n )\n // if the item doesn't fit, don't do anything\n // NB: maxEntrySize set to maxSize by default\n if (this.maxEntrySize && size > this.maxEntrySize) {\n // have to delete, in case something is there already.\n this.#delete(k, 'set')\n if (status) {\n status.set = 'miss'\n status.maxEntrySizeExceeded = true\n }\n return this\n }\n let index = this.#size === 0 ? undefined : this.#keyMap.get(k)\n if (index === undefined) {\n // addition\n index = (\n this.#size === 0 ? this.#tail\n : this.#free.length !== 0 ? this.#free.pop()\n : this.#size === this.#max ? this.#evict(false)\n : this.#size) as Index\n this.#keyList[index] = k\n this.#valList[index] = v\n this.#keyMap.set(k, index)\n this.#next[this.#tail] = index\n this.#prev[index] = this.#tail\n this.#tail = index\n this.#size++\n this.#addItemSize(index, size, status)\n if (status) status.set = 'add'\n noUpdateTTL = false\n if (this.#hasOnInsert && !isBF) {\n this.#onInsert?.(v, k, 'add')\n }\n } else {\n // update\n // might be updating a background fetch!\n this.#moveToTail(index)\n const oldVal = this.#valList[index]!\n if (v !== oldVal) {\n if (!noDisposeOnSet) {\n if (this.#isBackgroundFetch(oldVal)) {\n if (oldVal !== bf) {\n // setting over a background fetch, not merely resolving it.\n oldVal.__abortController.abort(new Error('replaced'))\n }\n const { __staleWhileFetching: s } = oldVal\n if (s !== undefined && s !== v) {\n if (this.#hasDispose) {\n this.#dispose?.(s, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([s, k, 'set'])\n }\n }\n } else {\n if (this.#hasDispose) {\n this.#dispose?.(oldVal, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldVal, k, 'set'])\n }\n }\n }\n this.#removeItemSize(index)\n this.#addItemSize(index, size, status)\n this.#valList[index] = v\n if (!isBF) {\n const oldValue =\n oldVal && this.#isBackgroundFetch(oldVal) ?\n oldVal.__staleWhileFetching\n : oldVal\n const setType =\n oldValue === undefined ? 'add'\n : v !== oldValue ? 'replace'\n : 'update'\n if (status) {\n status.set = setType\n if (oldValue !== undefined) status.oldValue = oldValue\n }\n if (this.#hasOnInsert) {\n this.onInsert?.(v, k, setType)\n }\n }\n } else if (!isBF) {\n if (status) {\n status.set = 'update'\n }\n if (this.#hasOnInsert) {\n this.onInsert?.(v, k, 'update')\n }\n }\n }\n if (ttl !== 0 && !this.#ttls) {\n this.#initializeTTLTracking()\n }\n if (this.#ttls) {\n if (!noUpdateTTL) {\n this.#setItemTTL(index, ttl, start)\n }\n if (status) this.#statusTTL(status, index)\n }\n if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return this\n }\n\n /**\n * Evict the least recently used item, returning its value or\n * `undefined` if cache is empty.\n */\n pop(): V | undefined {\n try {\n while (this.#size) {\n const val = this.#valList[this.#head]\n this.#evict(true)\n if (this.#isBackgroundFetch(val)) {\n if (val.__staleWhileFetching) {\n return val.__staleWhileFetching\n }\n } else if (val !== undefined) {\n return val\n }\n }\n } finally {\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n }\n\n #evict(free: boolean) {\n const head = this.#head\n const k = this.#keyList[head]!\n const v = this.#valList[head]!\n const isBF = this.#isBackgroundFetch(v)\n if (isBF) {\n v.__abortController.abort(new Error('evicted'))\n }\n const oldValue = isBF ? v.__staleWhileFetching : v\n if (\n (this.#hasDispose || this.#hasDisposeAfter) &&\n oldValue !== undefined\n ) {\n if (this.#hasDispose) {\n this.#dispose?.(oldValue, k, 'evict')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldValue, k, 'evict'])\n }\n }\n this.#removeItemSize(head)\n if (this.#autopurgeTimers?.[head]) {\n clearTimeout(this.#autopurgeTimers[head])\n this.#autopurgeTimers[head] = undefined\n }\n // if we aren't about to use the index, then null these out\n if (free) {\n this.#keyList[head] = undefined\n this.#valList[head] = undefined\n this.#free.push(head)\n }\n if (this.#size === 1) {\n this.#head = this.#tail = 0 as Index\n this.#free.length = 0\n } else {\n this.#head = this.#next[head] as Index\n }\n this.#keyMap.delete(k)\n this.#size--\n return head\n }\n\n /**\n * Check if a key is in the cache, without updating the recency of use.\n * Will return false if the item is stale, even though it is technically\n * in the cache.\n *\n * Check if a key is in the cache, without updating the recency of\n * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set\n * to `true` in either the options or the constructor.\n *\n * Will return `false` if the item is stale, even though it is technically in\n * the cache. The difference can be determined (if it matters) by using a\n * `status` argument, and inspecting the `has` field.\n *\n * Will not update item age unless\n * {@link LRUCache.OptionsBase.updateAgeOnHas} is set.\n */\n has(k: K, hasOptions: LRUCache.HasOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } = hasOptions\n hasOptions.status = status\n if (status) {\n status.op = 'has'\n status.key = k\n status.cache = this\n }\n const result = this.#has(k, hasOptions)\n if (metrics.hasSubscribers) metrics.publish(status)\n return result\n }\n #has(k: K, hasOptions: LRUCache.HasOptions = {}) {\n const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n const v = this.#valList[index]\n if (\n this.#isBackgroundFetch(v) &&\n v.__staleWhileFetching === undefined\n ) {\n return false\n }\n if (!this.#isStale(index)) {\n if (updateAgeOnHas) {\n this.#updateItemAge(index)\n }\n if (status) {\n status.has = 'hit'\n this.#statusTTL(status, index)\n }\n return true\n } else if (status) {\n status.has = 'stale'\n this.#statusTTL(status, index)\n }\n } else if (status) {\n status.has = 'miss'\n }\n return false\n }\n\n /**\n * Like {@link LRUCache#get} but doesn't update recency or delete stale\n * items.\n *\n * Returns `undefined` if the item is stale, unless\n * {@link LRUCache.OptionsBase.allowStale} is set.\n */\n peek(k: K, peekOptions: LRUCache.PeekOptions = {}) {\n const { status = hasSubscribers() ? {} : undefined } = peekOptions\n if (status) {\n status.op = 'peek'\n status.key = k\n status.cache = this\n }\n peekOptions.status = status\n const result = this.#peek(k, peekOptions)\n if (metrics.hasSubscribers) {\n metrics.publish(status)\n }\n return result\n }\n #peek(k: K, peekOptions: LRUCache.PeekOptions) {\n const { status, allowStale = this.allowStale } = peekOptions\n const index = this.#keyMap.get(k)\n if (index === undefined || (!allowStale && this.#isStale(index))) {\n if (status) status.peek = index === undefined ? 'miss' : 'stale'\n return undefined\n }\n const v = this.#valList[index]\n const val = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (status) {\n if (val !== undefined) {\n status.peek = 'hit'\n status.value = val\n } else {\n status.peek = 'miss'\n }\n }\n return val\n }\n\n #backgroundFetch(\n k: K,\n index: Index | undefined,\n options: LRUCache.FetchOptions,\n context: FC,\n ): BackgroundFetch {\n const v = index === undefined ? undefined : this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n return v\n }\n\n const ac = new AbortController()\n const { signal } = options\n // when/if our AC signals, then stop listening to theirs.\n signal?.addEventListener('abort', () => ac.abort(signal.reason), {\n signal: ac.signal,\n })\n\n const fetchOpts = {\n signal: ac.signal,\n options,\n context,\n }\n\n const cb = (v: V | undefined, updateCache = false): V | undefined => {\n const { aborted } = ac.signal\n const ignoreAbort = options.ignoreFetchAbort && v !== undefined\n const proceed =\n options.ignoreFetchAbort ||\n !!(options.allowStaleOnFetchAbort && v !== undefined)\n if (options.status) {\n if (aborted && !updateCache) {\n options.status.fetchAborted = true\n options.status.fetchError = ac.signal.reason\n if (ignoreAbort) options.status.fetchAbortIgnored = true\n } else {\n options.status.fetchResolved = true\n }\n }\n if (aborted && !ignoreAbort && !updateCache) {\n return fetchFail(ac.signal.reason, proceed)\n }\n // either we didn't abort, and are still here, or we did, and ignored\n const bf = p as BackgroundFetch\n // if nothing else has been written there but we're set to update the\n // cache and ignore the abort, or if it's still pending on this specific\n // background request, then write it to the cache.\n const vl = this.#valList[index as Index]\n if (vl === p || (vl === undefined && ignoreAbort && updateCache)) {\n if (v === undefined) {\n if (bf.__staleWhileFetching !== undefined) {\n this.#valList[index as Index] = bf.__staleWhileFetching\n } else {\n this.#delete(k, 'fetch')\n }\n } else {\n if (options.status) options.status.fetchUpdated = true\n this.#set(k, v, fetchOpts.options, bf)\n }\n }\n return v\n }\n\n const eb = (er: unknown) => {\n if (options.status) {\n options.status.fetchRejected = true\n options.status.fetchError = er as Error\n }\n // do not pass go, do not collect $200\n return fetchFail(er, false)\n }\n\n const fetchFail = (er: unknown, proceed: boolean): V | undefined => {\n const { aborted } = ac.signal\n const allowStaleAborted = aborted && options.allowStaleOnFetchAbort\n const allowStale =\n allowStaleAborted || options.allowStaleOnFetchRejection\n const noDelete = allowStale || options.noDeleteOnFetchRejection\n const bf = p as BackgroundFetch\n if (this.#valList[index as Index] === p) {\n // if we allow stale on fetch rejections, then we need to ensure that\n // the stale value is not removed from the cache when the fetch fails.\n const del =\n !noDelete || (!proceed && bf.__staleWhileFetching === undefined)\n if (del) {\n this.#delete(k, 'fetch')\n } else if (!allowStaleAborted) {\n // still replace the *promise* with the stale value,\n // since we are done with the promise at this point.\n // leave it untouched if we're still waiting for an\n // aborted background fetch that hasn't yet returned.\n this.#valList[index as Index] = bf.__staleWhileFetching\n }\n }\n if (allowStale) {\n if (options.status && bf.__staleWhileFetching !== undefined) {\n options.status.returnedStale = true\n }\n return bf.__staleWhileFetching\n } else if (bf.__returned === bf) {\n throw er\n }\n }\n\n const pcall = (\n res: (v: V | undefined) => void,\n rej: (e: unknown) => void,\n ) => {\n const fmp = this.#fetchMethod?.(k, v, fetchOpts)\n // ignored, we go until we finish, regardless.\n // defer check until we are actually aborting,\n // so fetchMethod can override.\n ac.signal.addEventListener('abort', () => {\n if (!options.ignoreFetchAbort || options.allowStaleOnFetchAbort) {\n res(undefined)\n // when it eventually resolves, update the cache.\n if (options.allowStaleOnFetchAbort) {\n res = v => cb(v, true)\n }\n }\n })\n if (fmp && fmp instanceof Promise) {\n fmp.then(v => res(v === undefined ? undefined : v), rej)\n } else if (fmp !== undefined) {\n res(fmp)\n }\n }\n\n if (options.status) options.status.fetchDispatched = true\n const p = new Promise(pcall).then(cb, eb)\n const bf: BackgroundFetch = Object.assign(p, {\n __abortController: ac,\n __staleWhileFetching: v,\n __returned: undefined,\n })\n\n if (index === undefined) {\n // internal, don't expose status.\n this.#set(k, bf, { ...fetchOpts.options, status: undefined })\n index = this.#keyMap.get(k)\n } else {\n // do not call #set, because we do not want to adjust its place\n // in the lru queue, as it has not yet been \"used\". Also, we don't\n // need to worry about evicting for size, because a background fetch\n // over a stale value is treated as the same size as its stale value.\n this.#valList[index] = bf\n }\n return bf\n }\n\n #isBackgroundFetch(p: unknown): p is BackgroundFetch {\n if (!this.#hasFetchMethod) return false\n const b = p as BackgroundFetch\n return (\n !!b &&\n b instanceof Promise &&\n b.hasOwnProperty('__staleWhileFetching') &&\n b.__abortController instanceof AbortController\n )\n }\n\n /**\n * Make an asynchronous cached fetch using the\n * {@link LRUCache.OptionsBase.fetchMethod} function.\n *\n * If the value is in the cache and not stale, then the returned\n * Promise resolves to the value.\n *\n * If not in the cache, or beyond its TTL staleness, then\n * `fetchMethod(key, staleValue, { options, signal, context })` is\n * called, and the value returned will be added to the cache once\n * resolved.\n *\n * If called with `allowStale`, and an asynchronous fetch is\n * currently in progress to reload a stale value, then the former\n * stale value will be returned.\n *\n * If called with `forceRefresh`, then the cached item will be\n * re-fetched, even if it is not stale. However, if `allowStale` is also\n * set, then the old value will still be returned. This is useful\n * in cases where you want to force a reload of a cached value. If\n * a background fetch is already in progress, then `forceRefresh`\n * has no effect.\n *\n * If multiple fetches for the same key are issued, then they will all be\n * coalesced into a single call to fetchMethod.\n *\n * Note that this means that handling options such as\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort},\n * {@link LRUCache.FetchOptions.signal},\n * and {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} will be\n * determined by the FIRST fetch() call for a given key.\n *\n * This is a known (fixable) shortcoming which will be addresed on when\n * someone complains about it, as the fix would involve added complexity and\n * may not be worth the costs for this edge case.\n *\n * If {@link LRUCache.OptionsBase.fetchMethod} is not specified, then this is\n * effectively an alias for `Promise.resolve(cache.get(key))`.\n *\n * When the fetch method resolves to a value, if the fetch has not\n * been aborted due to deletion, eviction, or being overwritten,\n * then it is added to the cache using the options provided.\n *\n * If the key is evicted or deleted before the `fetchMethod`\n * resolves, then the AbortSignal passed to the `fetchMethod` will\n * receive an `abort` event, and the promise returned by `fetch()`\n * will reject with the reason for the abort.\n *\n * If a `signal` is passed to the `fetch()` call, then aborting the\n * signal will abort the fetch and cause the `fetch()` promise to\n * reject with the reason provided.\n *\n * **Setting `context`**\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the {@link LRUCache} constructor, then all\n * calls to `cache.fetch()` _must_ provide a `context` option. If\n * set to `undefined` or `void`, then calls to fetch _must not_\n * provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that\n * might be relevant in the course of fetching the data. It is only\n * relevant for the course of a single `fetch()` operation, and\n * discarded afterwards.\n *\n * **Note: `fetch()` calls are inflight-unique**\n *\n * If you call `fetch()` multiple times with the same key value,\n * then every call after the first will resolve on the same\n * promise1,\n * _even if they have different settings that would otherwise change\n * the behavior of the fetch_, such as `noDeleteOnFetchRejection`\n * or `ignoreFetchAbort`.\n *\n * In most cases, this is not a problem (in fact, only fetching\n * something once is what you probably want, if you're caching in\n * the first place). If you are changing the fetch() options\n * dramatically between runs, there's a good chance that you might\n * be trying to fit divergent semantics into a single object, and\n * would be better off with multiple cache instances.\n *\n * **1**: Ie, they're not the \"same Promise\", but they resolve at\n * the same time, because they're both waiting on the same\n * underlying fetchMethod response.\n */\n\n fetch(\n k: K,\n fetchOptions: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext,\n ): Promise\n\n // this overload not allowed if context is required\n fetch(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n fetchOptions?: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : never,\n ): Promise\n fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const ths = tracing.hasSubscribers\n const { status = hasSubscribers() ? {} : undefined } = fetchOptions\n fetchOptions.status = status\n if (status && fetchOptions.context) {\n status.context = fetchOptions.context\n }\n const p = this.#fetch(k, fetchOptions)\n if (status && ths) {\n status.trace = true\n tracing.tracePromise(() => p, status).catch(() => {})\n }\n return p\n }\n\n async #fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const {\n // get options\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n // set options\n ttl = this.ttl,\n noDisposeOnSet = this.noDisposeOnSet,\n size = 0,\n sizeCalculation = this.sizeCalculation,\n noUpdateTTL = this.noUpdateTTL,\n // fetch exclusive options\n noDeleteOnFetchRejection = this.noDeleteOnFetchRejection,\n allowStaleOnFetchRejection = this.allowStaleOnFetchRejection,\n ignoreFetchAbort = this.ignoreFetchAbort,\n allowStaleOnFetchAbort = this.allowStaleOnFetchAbort,\n context,\n forceRefresh = false,\n status,\n signal,\n } = fetchOptions\n if (status) {\n status.op = 'fetch'\n status.key = k\n if (forceRefresh) status.forceRefresh = true\n status.cache = this\n }\n\n if (!this.#hasFetchMethod) {\n if (status) status.fetch = 'get'\n return this.#get(k, {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n status,\n })\n }\n\n const options = {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n ttl,\n noDisposeOnSet,\n size,\n sizeCalculation,\n noUpdateTTL,\n noDeleteOnFetchRejection,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n status,\n signal,\n }\n\n let index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.fetch = 'miss'\n const p = this.#backgroundFetch(k, index, options, context as FC)\n return (p.__returned = p)\n } else {\n // in cache, maybe already fetching\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n const stale = allowStale && v.__staleWhileFetching !== undefined\n if (status) {\n status.fetch = 'inflight'\n if (stale) status.returnedStale = true\n }\n return stale ? v.__staleWhileFetching : (v.__returned = v)\n }\n\n // if we force a refresh, that means do NOT serve the cached value,\n // unless we are already in the process of refreshing the cache.\n const isStale = this.#isStale(index)\n if (!forceRefresh && !isStale) {\n if (status) status.fetch = 'hit'\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n if (status) this.#statusTTL(status, index)\n return v\n }\n\n // ok, it is stale or a forced refresh, and not already fetching.\n // refresh the cache.\n const p = this.#backgroundFetch(k, index, options, context as FC)\n const hasStale = p.__staleWhileFetching !== undefined\n const staleVal = hasStale && allowStale\n if (status) {\n status.fetch = isStale ? 'stale' : 'refresh'\n if (staleVal && isStale) status.returnedStale = true\n }\n return staleVal ? p.__staleWhileFetching : (p.__returned = p)\n }\n }\n\n /**\n * In some cases, `cache.fetch()` may resolve to `undefined`, either because\n * a {@link LRUCache.OptionsBase#fetchMethod} was not provided (turning\n * `cache.fetch(k)` into just an async wrapper around `cache.get(k)`) or\n * because `ignoreFetchAbort` was specified (either to the constructor or\n * in the {@link LRUCache.FetchOptions}). Also, the\n * {@link LRUCache.OptionsBase.fetchMethod} may return `undefined` or `void`, making\n * the test even more complicated.\n *\n * Because inferring the cases where `undefined` might be returned are so\n * cumbersome, but testing for `undefined` can also be annoying, this method\n * can be used, which will reject if `this.fetch()` resolves to undefined.\n */\n forceFetch(\n k: K,\n fetchOptions: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext,\n ): Promise\n // this overload not allowed if context is required\n forceFetch(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n fetchOptions?: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : never,\n ): Promise\n forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const ths = tracing.hasSubscribers\n const { status = hasSubscribers() ? {} : undefined } = fetchOptions\n fetchOptions.status = status\n if (status && fetchOptions.context) {\n status.context = fetchOptions.context\n }\n const p = this.#forceFetch(k, fetchOptions)\n if (status && ths) {\n status.trace = true\n tracing.tracePromise(() => p, status).catch(() => {})\n }\n return p\n }\n\n async #forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ) {\n const v = await this.#fetch(k, fetchOptions)\n if (v === undefined) throw new Error('fetch() returned undefined')\n return v\n }\n\n /**\n * If the key is found in the cache, then this is equivalent to\n * {@link LRUCache#get}. If not, in the cache, then calculate the value using\n * the {@link LRUCache.OptionsBase.memoMethod}, and add it to the cache.\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the LRUCache constructor, then all calls to `cache.memo()`\n * _must_ provide a `context` option. If set to `undefined` or `void`, then\n * calls to memo _must not_ provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that might be\n * relevant in the course of fetching the data. It is only relevant for the\n * course of a single `memo()` operation, and discarded afterwards.\n */\n memo(\n k: K,\n memoOptions: unknown extends FC ? LRUCache.MemoOptions\n : FC extends undefined | void ? LRUCache.MemoOptionsNoContext\n : LRUCache.MemoOptionsWithContext,\n ): V\n // this overload not allowed if context is required\n memo(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n memoOptions?: unknown extends FC ? LRUCache.MemoOptions\n : FC extends undefined | void ? LRUCache.MemoOptionsNoContext\n : never,\n ): V\n memo(k: K, memoOptions: LRUCache.MemoOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } =\n memoOptions\n memoOptions.status = status\n if (status) {\n status.op = 'memo'\n status.key = k\n if (memoOptions.context) {\n status.context = memoOptions.context\n }\n status.cache = this\n }\n const result = this.#memo(k, memoOptions)\n if (status) status.value = result\n if (metrics.hasSubscribers) metrics.publish(status)\n return result\n }\n #memo(k: K, memoOptions: LRUCache.MemoOptions = {}) {\n const memoMethod = this.#memoMethod\n if (!memoMethod) {\n throw new Error('no memoMethod provided to constructor')\n }\n const { context, status, forceRefresh, ...options } = memoOptions\n if (status && forceRefresh) status.forceRefresh = true\n const v = this.#get(k, options)\n const refresh = forceRefresh || v === undefined\n if (status) {\n status.memo = refresh ? 'miss' : 'hit'\n if (!refresh) status.value = v\n }\n if (!refresh) return v\n const vv = memoMethod(k, v, {\n options,\n context,\n } as LRUCache.MemoizerOptions)\n if (status) status.value = vv\n this.#set(k, vv, options)\n return vv\n }\n\n /**\n * Return a value from the cache. Will update the recency of the cache\n * entry found.\n *\n * If the key is not found, get() will return `undefined`.\n */\n get(k: K, getOptions: LRUCache.GetOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } = getOptions\n getOptions.status = status\n if (status) {\n status.op = 'get'\n status.key = k\n status.cache = this\n }\n const result = this.#get(k, getOptions)\n if (status) {\n if (result !== undefined) status.value = result\n if (metrics.hasSubscribers) metrics.publish(status)\n }\n return result\n }\n\n #get(k: K, getOptions: LRUCache.GetOptions = {}) {\n const {\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n status,\n } = getOptions\n const index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.get = 'miss'\n return undefined\n }\n const value = this.#valList[index]\n const fetching = this.#isBackgroundFetch(value)\n if (status) this.#statusTTL(status, index)\n if (this.#isStale(index)) {\n // delete only if not an in-flight background fetch\n if (!fetching) {\n if (!noDeleteOnStaleGet) {\n this.#delete(k, 'expire')\n }\n if (status) status.get = 'stale'\n if (allowStale) {\n if (status) status.returnedStale = true\n return value\n }\n return undefined\n }\n if (status) status.get = 'stale-fetching'\n if (allowStale && value.__staleWhileFetching !== undefined) {\n if (status) status.returnedStale = true\n return value.__staleWhileFetching\n }\n return undefined\n }\n // not stale\n if (status) status.get = fetching ? 'fetching' : 'hit'\n // if we're currently fetching it, we don't actually have it yet\n // it's not stale, which means this isn't a staleWhileRefetching.\n // If it's not stale, and fetching, AND has a __staleWhileFetching\n // value, then that means the user fetched with {forceRefresh:true},\n // so it's safe to return that value.\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n return fetching ? value.__staleWhileFetching : value\n }\n\n #connect(p: Index, n: Index) {\n this.#prev[n] = p\n this.#next[p] = n\n }\n\n #moveToTail(index: Index): void {\n // if tail already, nothing to do\n // if head, move head to next[index]\n // else\n // move next[prev[index]] to next[index] (head has no prev)\n // move prev[next[index]] to prev[index]\n // prev[index] = tail\n // next[tail] = index\n // tail = index\n if (index !== this.#tail) {\n if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n this.#connect(\n this.#prev[index] as Index,\n this.#next[index] as Index,\n )\n }\n this.#connect(this.#tail, index)\n this.#tail = index\n }\n }\n\n /**\n * Deletes a key out of the cache.\n *\n * Returns true if the key was deleted, false otherwise.\n */\n delete(k: K) {\n return this.#delete(k, 'delete')\n }\n\n #delete(k: K, reason: LRUCache.DisposeReason) {\n if (metrics.hasSubscribers) {\n metrics.publish({\n op: 'delete',\n delete: reason,\n key: k,\n cache: this,\n })\n }\n let deleted = false\n if (this.#size !== 0) {\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n if (this.#autopurgeTimers?.[index]) {\n clearTimeout(this.#autopurgeTimers?.[index])\n this.#autopurgeTimers[index] = undefined\n }\n deleted = true\n if (this.#size === 1) {\n this.#clear(reason)\n } else {\n this.#removeItemSize(index)\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k, reason])\n }\n }\n this.#keyMap.delete(k)\n this.#keyList[index] = undefined\n this.#valList[index] = undefined\n if (index === this.#tail) {\n this.#tail = this.#prev[index] as Index\n } else if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n const pi = this.#prev[index] as number\n this.#next[pi] = this.#next[index] as number\n const ni = this.#next[index] as number\n this.#prev[ni] = this.#prev[index] as number\n }\n this.#size--\n this.#free.push(index)\n }\n }\n }\n if (this.#hasDisposeAfter && this.#disposed?.length) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return deleted\n }\n\n /**\n * Clear the cache entirely, throwing away all values.\n */\n clear() {\n return this.#clear('delete')\n }\n #clear(reason: LRUCache.DisposeReason) {\n for (const index of this.#rindexes({ allowStale: true })) {\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else {\n const k = this.#keyList[index]\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k as K, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k as K, reason])\n }\n }\n }\n\n this.#keyMap.clear()\n void this.#valList.fill(undefined)\n this.#keyList.fill(undefined)\n if (this.#ttls && this.#starts) {\n this.#ttls.fill(0)\n this.#starts.fill(0)\n for (const t of this.#autopurgeTimers ?? []) {\n if (t !== undefined) clearTimeout(t)\n }\n this.#autopurgeTimers?.fill(undefined)\n }\n if (this.#sizes) {\n this.#sizes.fill(0)\n }\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free.length = 0\n this.#calculatedSize = 0\n this.#size = 0\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n}\n"], + "mappings": "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", + "names": ["dummy", "exports", "exports", "diagnostics_channel_js_1", "perf_js_1", "hasSubscribers", "warned", "PROCESS", "emitWarning", "msg", "type", "code", "fn", "shouldWarn", "isPosInt", "n", "getUintArray", "max", "ZeroArray", "size", "Stack", "_Stack", "#constructing", "HeapCls", "s", "LRUCache", "_LRUCache", "#max", "#maxSize", "#dispose", "#onInsert", "#disposeAfter", "#fetchMethod", "#memoMethod", "#perf", "#size", "#calculatedSize", "#keyMap", "#keyList", "#valList", "#next", "#prev", "#head", "#tail", "#free", "#disposed", "#sizes", "#starts", "#ttls", "#autopurgeTimers", "#hasDispose", "#hasFetchMethod", "#hasDisposeAfter", "#hasOnInsert", "c", "p", "#isBackgroundFetch", "k", "index", "options", "context", "#backgroundFetch", "#moveToTail", "#indexes", "#rindexes", "#isStale", "ttl", "ttlResolution", "ttlAutopurge", "updateAgeOnGet", "updateAgeOnHas", "allowStale", "dispose", "onInsert", "disposeAfter", "noDisposeOnSet", "noUpdateTTL", "maxSize", "maxEntrySize", "sizeCalculation", "fetchMethod", "memoMethod", "noDeleteOnFetchRejection", "noDeleteOnStaleGet", "allowStaleOnFetchRejection", "allowStaleOnFetchAbort", "ignoreFetchAbort", "backgroundFetchSize", "perf", "perf_js_1", "UintArray", "#initializeSizeTracking", "#initializeTTLTracking", "code", "shouldWarn", "warned", "emitWarning", "key", "ttls", "starts", "purgeTimers", "#setItemTTL", "start", "setPurgetTimer", "#updateItemAge", "t", "#delete", "#statusTTL", "status", "cachedNow", "getNow", "age", "sizes", "#removeItemSize", "#requireSize", "v", "#addItemSize", "#evict", "_i", "_s", "_st", "_k", "_v", "i", "#isValidIndex", "fn", "getOptions", "value", "#get", "thisp", "deleted", "entry", "remain", "arr", "#set", "setOptions", "diagnostics_channel_js_1", "result", "bf", "isBF", "oldVal", "oldValue", "setType", "dt", "task", "val", "free", "head", "hasOptions", "#has", "peekOptions", "hasSubscribers", "#peek", "ac", "signal", "fetchOpts", "cb", "updateCache", "aborted", "ignoreAbort", "proceed", "fetchFail", "vl", "eb", "er", "allowStaleAborted", "noDelete", "pcall", "res", "rej", "fmp", "b", "fetchOptions", "ths", "#fetch", "forceRefresh", "stale", "isStale", "staleVal", "#forceFetch", "memoOptions", "#memo", "refresh", "vv", "fetching", "#connect", "reason", "#clear", "pi", "ni"] +} diff --git a/node_modules/lru-cache/dist/commonjs/node/diagnostics-channel-node.d.ts.map b/node_modules/lru-cache/dist/commonjs/node/diagnostics-channel-node.d.ts.map new file mode 100644 index 00000000..2c0f7d51 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/node/diagnostics-channel-node.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"diagnostics-channel-node.d.ts","sourceRoot":"","sources":["../../../src/diagnostics-channel-node.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AACvE,YAAY,EAAE,cAAc,EAAE,OAAO,EAAE,CAAA;AACvC,eAAO,MAAM,OAAO,EAAE,OAAO,CAAC,OAAO,CAAgC,CAAA;AACrE,eAAO,MAAM,OAAO,EAAE,cAAc,CAAC,OAAO,CAA+B,CAAA"} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/node/diagnostics-channel-node.js.map b/node_modules/lru-cache/dist/commonjs/node/diagnostics-channel-node.js.map new file mode 100644 index 00000000..47bd2c0d --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/node/diagnostics-channel-node.js.map @@ -0,0 +1 @@ +{"version":3,"file":"diagnostics-channel-node.js","sourceRoot":"","sources":["../../../src/diagnostics-channel-node.ts"],"names":[],"mappings":";;;AAAA,qDAAqD;AACrD,mEAAmE;AACnE,uEAAkE;AAGrD,QAAA,OAAO,GAAqB,IAAA,kCAAO,EAAC,mBAAmB,CAAC,CAAA;AACxD,QAAA,OAAO,GAA4B,IAAA,yCAAc,EAAC,WAAW,CAAC,CAAA","sourcesContent":["// simple node version that imports from node builtin\n// this is built to both ESM and CommonJS on the 'node' import path\nimport { tracingChannel, channel } from 'node:diagnostics_channel'\nimport type { TracingChannel, Channel } from 'node:diagnostics_channel'\nexport type { TracingChannel, Channel }\nexport const metrics: Channel = channel('lru-cache:metrics')\nexport const tracing: TracingChannel = tracingChannel('lru-cache')\n"]} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/node/diagnostics-channel.d.ts b/node_modules/lru-cache/dist/commonjs/node/diagnostics-channel.d.ts new file mode 100644 index 00000000..3e9e25d0 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/node/diagnostics-channel.d.ts @@ -0,0 +1,5 @@ +import type { TracingChannel, Channel } from 'node:diagnostics_channel'; +export type { TracingChannel, Channel }; +export declare const metrics: Channel; +export declare const tracing: TracingChannel; +//# sourceMappingURL=diagnostics-channel-node.d.ts.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/node/diagnostics-channel.js b/node_modules/lru-cache/dist/commonjs/node/diagnostics-channel.js new file mode 100644 index 00000000..30f39a05 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/node/diagnostics-channel.js @@ -0,0 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.tracing = exports.metrics = void 0; +// simple node version that imports from node builtin +// this is built to both ESM and CommonJS on the 'node' import path +const node_diagnostics_channel_1 = require("node:diagnostics_channel"); +exports.metrics = (0, node_diagnostics_channel_1.channel)('lru-cache:metrics'); +exports.tracing = (0, node_diagnostics_channel_1.tracingChannel)('lru-cache'); +//# sourceMappingURL=diagnostics-channel-node.js.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/node/index.d.ts b/node_modules/lru-cache/dist/commonjs/node/index.d.ts new file mode 100644 index 00000000..b0e4b964 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/node/index.d.ts @@ -0,0 +1,1400 @@ +/** + * @module LRUCache + */ +import type { Perf } from './perf.js'; +export type { Perf } from './perf.js'; +declare const TYPE: unique symbol; +export type PosInt = number & { + [TYPE]: 'Positive Integer'; +}; +export type Index = number & { + [TYPE]: 'LRUCache Index'; +}; +export type UintArray = Uint8Array | Uint16Array | Uint32Array; +export type NumberArray = UintArray | number[]; +declare class ZeroArray extends Array { + constructor(size: number); +} +export type { ZeroArray }; +export type { Stack }; +export type StackLike = Stack | Index[]; +declare class Stack { + #private; + heap: NumberArray; + length: number; + static create(max: number): StackLike; + constructor(max: number, HeapCls: { + new (n: number): NumberArray; + }); + push(n: Index): void; + pop(): Index; +} +/** + * Promise representing an in-progress {@link LRUCache#fetch} call + */ +export type BackgroundFetch = Promise & { + __returned: BackgroundFetch | undefined; + __abortController: AbortController; + __staleWhileFetching: V | undefined; +}; +export type DisposeTask = [ + value: V, + key: K, + reason: LRUCache.DisposeReason +]; +export declare namespace LRUCache { + /** + * An integer greater than 0, reflecting the calculated size of items + */ + type Size = number; + /** + * Integer greater than 0, representing some number of milliseconds, or the + * time at which a TTL started counting from. + */ + type Milliseconds = number; + /** + * An integer greater than 0, reflecting a number of items + */ + type Count = number; + /** + * The reason why an item was removed from the cache, passed + * to the {@link Disposer} methods. + * + * - `evict`: The item was evicted because it is the least recently used, + * and the cache is full. + * - `set`: A new value was set, overwriting the old value being disposed. + * - `delete`: The item was explicitly deleted, either by calling + * {@link LRUCache#delete}, {@link LRUCache#clear}, or + * {@link LRUCache#set} with an undefined value. + * - `expire`: The item was removed due to exceeding its TTL. + * - `fetch`: A {@link OptionsBase#fetchMethod} operation returned + * `undefined` or was aborted, causing the item to be deleted. + */ + type DisposeReason = 'evict' | 'set' | 'delete' | 'expire' | 'fetch'; + /** + * A method called upon item removal, passed as the + * {@link OptionsBase.dispose} and/or + * {@link OptionsBase.disposeAfter} options. + */ + type Disposer = (value: V, key: K, reason: DisposeReason) => void; + /** + * The reason why an item was added to the cache, passed + * to the {@link Inserter} methods. + * + * - `add`: the item was not found in the cache, and was added + * - `update`: the item was in the cache, with the same value provided + * - `replace`: the item was in the cache, and replaced + */ + type InsertReason = 'add' | 'update' | 'replace'; + /** + * A method called upon item insertion, passed as the + * {@link OptionsBase.insert} + */ + type Inserter = (value: V, key: K, reason: InsertReason) => void; + /** + * A function that returns the effective calculated size + * of an entry in the cache. + */ + type SizeCalculator = (value: V, key: K) => Size; + /** + * Options provided to the + * {@link OptionsBase.fetchMethod} function. + */ + interface FetcherOptions { + signal: AbortSignal; + options: FetcherFetchOptions; + /** + * Object provided in the {@link FetchOptions.context} option to + * {@link LRUCache#fetch} + */ + context: FC; + } + /** + * Occasionally, it may be useful to track the internal behavior of the + * cache, particularly for logging, debugging, or for behavior within the + * `fetchMethod`. To do this, you can pass a `status` object to the + * {@link LRUCache#fetch}, {@link LRUCache#get}, {@link LRUCache#set}, + * {@link LRUCache#memo}, and {@link LRUCache#has} methods. + * + * The `status` option should be a plain JavaScript object. The following + * fields will be set on it appropriately, depending on the situation. + * + * These objects are also the context objects passed to listeners on the + * `lru-cache:metrics` diagnostic channel, and the `lru-cache` tracing + * channels, in platforms that support them. + */ + interface Status { + /** + * The operation being performed + */ + op?: 'get' | 'set' | 'memo' | 'fetch' | 'delete' | 'has' | 'peek'; + /** + * The status of a set() operation. + * + * - add: the item was not found in the cache, and was added + * - update: the item was in the cache, with the same value provided + * - replace: the item was in the cache, and replaced + * - miss: the item was not added to the cache for some reason + */ + set?: 'add' | 'update' | 'replace' | 'miss' | 'deleted'; + /** + * The status of a delete() operation. + */ + delete?: LRUCache.DisposeReason; + /** + * The result of a peek() operation + * + * - hit: the item was found and returned + * - stale: the item is in the cache, but past its ttl and not returned + * - miss: item not in the cache + */ + peek?: 'hit' | 'miss' | 'stale'; + /** + * The status of a memo() operation. + * + * - 'hit': the item was found in the cache and returned + * - 'miss': the `memoMethod` function was called + */ + memo?: 'hit' | 'miss'; + /** + * The `context` option provided to a memo or fetch operation + * + * In practice, of course, this will be the same type as the `FC` + * fetch context param used to instantiate the LRUCache, but the + * convolutions of threading that through would get quite complicated, + * and preclude forcing/forbidding the passing of a `context` param + * where it is/isn't expected, which is more valuable for error + * prevention. + */ + context?: unknown; + /** + * the ttl stored for the item, or undefined if ttls are not used. + */ + ttl?: Milliseconds; + /** + * the start time for the item, or undefined if ttls are not used. + */ + start?: Milliseconds; + /** + * The timestamp used for TTL calculation + */ + now?: Milliseconds; + /** + * the remaining ttl for the item, or undefined if ttls are not used. + */ + remainingTTL?: Milliseconds; + /** + * The calculated size for the item, if sizes are used. + */ + entrySize?: Size; + /** + * The total calculated size of the cache, if sizes are used. + */ + totalCalculatedSize?: Size; + /** + * A flag indicating that the item was not stored, due to exceeding the + * {@link OptionsBase.maxEntrySize} + */ + maxEntrySizeExceeded?: true; + /** + * The key that was set or retrieved + */ + key?: K; + /** + * The value that was set + */ + value?: V; + /** + * The old value, specified in the case of `set:'replace'` + */ + oldValue?: V; + /** + * The results of a {@link LRUCache#has} operation + * + * - hit: the item was found in the cache + * - stale: the item was found in the cache, but is stale + * - miss: the item was not found in the cache + */ + has?: 'hit' | 'stale' | 'miss'; + /** + * The status of a {@link LRUCache#fetch} operation. + * Note that this can change as the underlying fetch() moves through + * various states. + * + * - inflight: there is another fetch() for this key which is in process + * - get: there is no {@link OptionsBase.fetchMethod}, so + * {@link LRUCache#get} was called. + * - miss: the item is not in cache, and will be fetched. + * - hit: the item is in the cache, and was resolved immediately. + * - stale: the item is in the cache, but stale. + * - refresh: the item is in the cache, and not stale, but + * {@link FetchOptions.forceRefresh} was specified. + */ + fetch?: 'get' | 'inflight' | 'miss' | 'hit' | 'stale' | 'refresh'; + /** + * `forceRefresh` option was used for either a fetch or memo operation + */ + forceRefresh?: boolean; + /** + * The {@link OptionsBase.fetchMethod} was called + */ + fetchDispatched?: true; + /** + * The cached value was updated after a successful call to + * {@link OptionsBase.fetchMethod} + */ + fetchUpdated?: true; + /** + * The reason for a fetch() rejection. Either the error raised by the + * {@link OptionsBase.fetchMethod}, or the reason for an + * AbortSignal. + */ + fetchError?: Error; + /** + * The fetch received an abort signal + */ + fetchAborted?: true; + /** + * The abort signal received was ignored, and the fetch was allowed to + * continue in the background. + */ + fetchAbortIgnored?: true; + /** + * The fetchMethod promise resolved successfully + */ + fetchResolved?: true; + /** + * The fetchMethod promise was rejected + */ + fetchRejected?: true; + /** + * The status of a {@link LRUCache#get} operation. + * + * - fetching: The item is currently being fetched. If a previous value + * is present and allowed, that will be returned. + * - stale: The item is in the cache, and is stale. If it was returned, + * then the `returnedStale` flag will be set. + * - stale-fetching: The value is being fetched in the background, but is + * currently stale. If the stale value was returned, then the + * `returnedStale` flag will be set. + * - hit: the item is in the cache + * - miss: the item is not in the cache + */ + get?: 'stale' | 'hit' | 'miss' | 'fetching' | 'stale-fetching'; + /** + * A fetch or get operation returned a stale value. + */ + returnedStale?: true; + /** + * A tracingChannel trace was started for this operation + */ + trace?: boolean; + /** + * A reference to the cache instance associated with this operation + */ + cache?: LRUCache; + } + /** + * options which override the options set in the LRUCache constructor + * when calling {@link LRUCache#fetch}. + * + * This is the union of {@link GetOptions} and {@link SetOptions}, plus + * {@link OptionsBase.noDeleteOnFetchRejection}, + * {@link OptionsBase.allowStaleOnFetchRejection}, + * {@link FetchOptions.forceRefresh}, and + * {@link FetcherOptions.context} + * + * Any of these may be modified in the {@link OptionsBase.fetchMethod} + * function, but the {@link GetOptions} fields will of course have no + * effect, as the {@link LRUCache#get} call already happened by the time + * the fetchMethod is called. + */ + interface FetcherFetchOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet' | 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL' | 'noDeleteOnFetchRejection' | 'allowStaleOnFetchRejection' | 'ignoreFetchAbort' | 'allowStaleOnFetchAbort'> { + status?: Status; + size?: Size; + } + /** + * Options that may be passed to the {@link LRUCache#fetch} method. + */ + interface FetchOptions extends FetcherFetchOptions { + /** + * Set to true to force a re-load of the existing data, even if it + * is not yet stale. + */ + forceRefresh?: boolean; + /** + * Context provided to the {@link OptionsBase.fetchMethod} as + * the {@link FetcherOptions.context} param. + * + * If the FC type is specified as unknown (the default), + * undefined or void, then this is optional. Otherwise, it will + * be required. + */ + context?: FC; + signal?: AbortSignal; + status?: Status; + } + /** + * Options provided to {@link LRUCache#fetch} when the FC type is something + * other than `unknown`, `undefined`, or `void` + */ + interface FetchOptionsWithContext extends FetchOptions { + context: FC; + } + /** + * Options provided to {@link LRUCache#fetch} when the FC type is + * `undefined` or `void` + */ + interface FetchOptionsNoContext extends FetchOptions { + context?: FC; + } + interface MemoOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet' | 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL' | 'noDeleteOnFetchRejection' | 'allowStaleOnFetchRejection' | 'ignoreFetchAbort' | 'allowStaleOnFetchAbort'> { + /** + * Set to true to force a re-load of the existing data, even if it + * is not yet stale. + */ + forceRefresh?: boolean; + /** + * Context provided to the {@link OptionsBase.memoMethod} as + * the {@link MemoizerOptions.context} param. + * + * If the FC type is specified as unknown (the default), + * undefined or void, then this is optional. Otherwise, it will + * be required. + */ + context?: FC; + status?: Status; + } + /** + * Options provided to {@link LRUCache#memo} when the FC type is something + * other than `unknown`, `undefined`, or `void` + */ + interface MemoOptionsWithContext extends MemoOptions { + context: FC; + } + /** + * Options provided to {@link LRUCache#memo} when the FC type is + * `undefined` or `void` + */ + interface MemoOptionsNoContext extends MemoOptions { + context?: FC; + } + /** + * Options provided to the + * {@link OptionsBase.memoMethod} function. + */ + interface MemoizerOptions { + options: MemoizerMemoOptions; + /** + * Object provided in the {@link MemoOptions.context} option to + * {@link LRUCache#memo} + */ + context: FC; + } + /** + * options which override the options set in the LRUCache constructor + * when calling {@link LRUCache#memo}. + * + * This is the union of {@link GetOptions} and {@link SetOptions}, plus + * {@link MemoOptions.forceRefresh}, and + * {@link MemoOptions.context} + * + * Any of these may be modified in the {@link OptionsBase.memoMethod} + * function, but the {@link GetOptions} fields will of course have no + * effect, as the {@link LRUCache#get} call already happened by the time + * the memoMethod is called. + */ + interface MemoizerMemoOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet' | 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'> { + status?: Status; + size?: Size; + start?: Milliseconds; + } + /** + * Options that may be passed to the {@link LRUCache#has} method. + */ + interface HasOptions extends Pick, 'updateAgeOnHas'> { + status?: Status; + } + /** + * Options that may be passed to the {@link LRUCache#get} method. + */ + interface GetOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet'> { + status?: Status; + } + /** + * Options that may be passed to the {@link LRUCache#peek} method. + */ + interface PeekOptions extends Pick, 'allowStale'> { + status?: Status; + } + /** + * Options that may be passed to the {@link LRUCache#set} method. + */ + interface SetOptions extends Pick, 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'> { + /** + * If size tracking is enabled, then setting an explicit size + * in the {@link LRUCache#set} call will prevent calling the + * {@link OptionsBase.sizeCalculation} function. + */ + size?: Size; + /** + * If TTL tracking is enabled, then setting an explicit start + * time in the {@link LRUCache#set} call will override the + * default time from `performance.now()` or `Date.now()`. + * + * Note that it must be a valid value for whichever time-tracking + * method is in use. + */ + start?: Milliseconds; + status?: Status; + } + /** + * The type signature for the {@link OptionsBase.fetchMethod} option. + */ + type Fetcher = (key: K, staleValue: V | undefined, options: FetcherOptions) => Promise | V | undefined | void; + /** + * the type signature for the {@link OptionsBase.memoMethod} option. + */ + type Memoizer = (key: K, staleValue: V | undefined, options: MemoizerOptions) => V; + /** + * Options which may be passed to the {@link LRUCache} constructor. + * + * Most of these may be overridden in the various options that use + * them. + * + * Despite all being technically optional, the constructor requires that + * a cache is at minimum limited by one or more of {@link OptionsBase.max}, + * {@link OptionsBase.ttl}, or {@link OptionsBase.maxSize}. + * + * If {@link OptionsBase.ttl} is used alone, then it is strongly advised + * (and in fact required by the type definitions here) that the cache + * also set {@link OptionsBase.ttlAutopurge}, to prevent potentially + * unbounded storage. + * + * All options are also available on the {@link LRUCache} instance, making + * it safe to pass an LRUCache instance as the options argumemnt to + * make another empty cache of the same type. + * + * Some options are marked as read-only, because changing them after + * instantiation is not safe. Changing any of the other options will of + * course only have an effect on subsequent method calls. + */ + interface OptionsBase { + /** + * The maximum number of items to store in the cache before evicting + * old entries. This is read-only on the {@link LRUCache} instance, + * and may not be overridden. + * + * If set, then storage space will be pre-allocated at construction + * time, and the cache will perform significantly faster. + * + * Note that significantly fewer items may be stored, if + * {@link OptionsBase.maxSize} and/or {@link OptionsBase.ttl} are also + * set. + * + * **It is strongly recommended to set a `max` to prevent unbounded growth + * of the cache.** + */ + max?: Count; + /** + * Max time in milliseconds for items to live in cache before they are + * considered stale. Note that stale items are NOT preemptively removed by + * default, and MAY live in the cache, contributing to its LRU max, long + * after they have expired, unless {@link OptionsBase.ttlAutopurge} is + * set. + * + * If set to `0` (the default value), then that means "do not track + * TTL", not "expire immediately". + * + * Also, as this cache is optimized for LRU/MRU operations, some of + * the staleness/TTL checks will reduce performance, as they will incur + * overhead by deleting items. + * + * This is not primarily a TTL cache, and does not make strong TTL + * guarantees. There is no pre-emptive pruning of expired items, but you + * _may_ set a TTL on the cache, and it will treat expired items as missing + * when they are fetched, and delete them. + * + * Optional, but must be a non-negative integer in ms if specified. + * + * This may be overridden by passing an options object to `cache.set()`. + * + * At least one of `max`, `maxSize`, or `TTL` is required. This must be a + * positive integer if set. + * + * Even if ttl tracking is enabled, **it is strongly recommended to set a + * `max` to prevent unbounded growth of the cache.** + * + * If ttl tracking is enabled, and `max` and `maxSize` are not set, + * and `ttlAutopurge` is not set, then a warning will be emitted + * cautioning about the potential for unbounded memory consumption. + * (The TypeScript definitions will also discourage this.) + */ + ttl?: Milliseconds; + /** + * Minimum amount of time in ms in which to check for staleness. + * Defaults to 1, which means that the current time is checked + * at most once per millisecond. + * + * Set to 0 to check the current time every time staleness is tested. + * (This reduces performance, and is theoretically unnecessary.) + * + * Setting this to a higher value will improve performance somewhat + * while using ttl tracking, albeit at the expense of keeping stale + * items around a bit longer than their TTLs would indicate. + * + * @default 1 + */ + ttlResolution?: Milliseconds; + /** + * Preemptively remove stale items from the cache. + * + * Note that this may *significantly* degrade performance, especially if + * the cache is storing a large number of items. It is almost always best + * to just leave the stale items in the cache, and let them fall out as new + * items are added. + * + * Note that this means that {@link OptionsBase.allowStale} is a bit + * pointless, as stale items will be deleted almost as soon as they + * expire. + * + * Use with caution! + */ + ttlAutopurge?: boolean; + /** + * When using time-expiring entries with `ttl`, setting this to `true` will + * make each item's age reset to 0 whenever it is retrieved from cache with + * {@link LRUCache#get}, causing it to not expire. (It can still fall out + * of cache based on recency of use, of course.) + * + * Has no effect if {@link OptionsBase.ttl} is not set. + * + * This may be overridden by passing an options object to `cache.get()`. + */ + updateAgeOnGet?: boolean; + /** + * When using time-expiring entries with `ttl`, setting this to `true` will + * make each item's age reset to 0 whenever its presence in the cache is + * checked with {@link LRUCache#has}, causing it to not expire. (It can + * still fall out of cache based on recency of use, of course.) + * + * Has no effect if {@link OptionsBase.ttl} is not set. + */ + updateAgeOnHas?: boolean; + /** + * Allow {@link LRUCache#get} and {@link LRUCache#fetch} calls to return + * stale data, if available. + * + * By default, if you set `ttl`, stale items will only be deleted from the + * cache when you `get(key)`. That is, it's not preemptively pruning items, + * unless {@link OptionsBase.ttlAutopurge} is set. + * + * If you set `allowStale:true`, it'll return the stale value *as well as* + * deleting it. If you don't set this, then it'll return `undefined` when + * you try to get a stale entry. + * + * Note that when a stale entry is fetched, _even if it is returned due to + * `allowStale` being set_, it is removed from the cache immediately. You + * can suppress this behavior by setting + * {@link OptionsBase.noDeleteOnStaleGet}, either in the constructor, or in + * the options provided to {@link LRUCache#get}. + * + * This may be overridden by passing an options object to `cache.get()`. + * The `cache.has()` method will always return `false` for stale items. + * + * Only relevant if a ttl is set. + */ + allowStale?: boolean; + /** + * Function that is called on items when they are dropped from the + * cache, as `dispose(value, key, reason)`. + * + * This can be handy if you want to close file descriptors or do + * other cleanup tasks when items are no longer stored in the cache. + * + * **NOTE**: It is called _before_ the item has been fully removed + * from the cache, so if you want to put it right back in, you need + * to wait until the next tick. If you try to add it back in during + * the `dispose()` function call, it will break things in subtle and + * weird ways. + * + * Unlike several other options, this may _not_ be overridden by + * passing an option to `set()`, for performance reasons. + * + * The `reason` will be one of the following strings, corresponding + * to the reason for the item's deletion: + * + * - `evict` Item was evicted to make space for a new addition + * - `set` Item was overwritten by a new value + * - `expire` Item expired its TTL + * - `fetch` Item was deleted due to a failed or aborted fetch, or a + * fetchMethod returning `undefined. + * - `delete` Item was removed by explicit `cache.delete(key)`, + * `cache.clear()`, or `cache.set(key, undefined)`. + */ + dispose?: Disposer; + /** + * Function that is called when new items are inserted into the cache, + * as `onInsert(value, key, reason)`. + * + * This can be useful if you need to perform actions when an item is + * added, such as logging or tracking insertions. + * + * Unlike some other options, this may _not_ be overridden by passing + * an option to `set()`, for performance and consistency reasons. + */ + onInsert?: Inserter; + /** + * The same as {@link OptionsBase.dispose}, but called *after* the entry + * is completely removed and the cache is once again in a clean state. + * + * It is safe to add an item right back into the cache at this point. + * However, note that it is *very* easy to inadvertently create infinite + * recursion this way. + */ + disposeAfter?: Disposer; + /** + * Set to true to suppress calling the + * {@link OptionsBase.dispose} function if the entry key is + * still accessible within the cache. + * + * This may be overridden by passing an options object to + * {@link LRUCache#set}. + * + * Only relevant if `dispose` or `disposeAfter` are set. + */ + noDisposeOnSet?: boolean; + /** + * Boolean flag to tell the cache to not update the TTL when setting a new + * value for an existing key (ie, when updating a value rather than + * inserting a new value). Note that the TTL value is _always_ set (if + * provided) when adding a new entry into the cache. + * + * Has no effect if a {@link OptionsBase.ttl} is not set. + * + * May be passed as an option to {@link LRUCache#set}. + */ + noUpdateTTL?: boolean; + /** + * Set to a positive integer to track the sizes of items added to the + * cache, and automatically evict items in order to stay below this size. + * Note that this may result in fewer than `max` items being stored. + * + * Attempting to add an item to the cache whose calculated size is greater + * that this amount will be a no-op. The item will not be cached, and no + * other items will be evicted. + * + * Optional, must be a positive integer if provided. + * + * Sets `maxEntrySize` to the same value, unless a different value is + * provided for `maxEntrySize`. + * + * At least one of `max`, `maxSize`, or `TTL` is required. This must be a + * positive integer if set. + * + * Even if size tracking is enabled, **it is strongly recommended to set a + * `max` to prevent unbounded growth of the cache.** + * + * Note also that size tracking can negatively impact performance, + * though for most cases, only minimally. + */ + maxSize?: Size; + /** + * The effective size for background fetch promises. + * + * This has no effect unless `maxSize` and `sizeCalculation` are used, + * and a {@link LRUCache.OptionsBase.fetchMethod} is provided to + * support {@link LRUCache#fetch}. + * + * If a stale value is present in the cache, then the effective size of + * the background fetch is the size of the stale item it will eventually + * replace. If not, then this value is used as its effective size. + * + * @default 1 + */ + backgroundFetchSize?: number; + /** + * The maximum allowed size for any single item in the cache. + * + * If a larger item is passed to {@link LRUCache#set} or returned by a + * {@link OptionsBase.fetchMethod} or {@link OptionsBase.memoMethod}, then + * it will not be stored in the cache. + * + * Attempting to add an item whose calculated size is greater than + * this amount will not cache the item or evict any old items, but + * WILL delete an existing value if one is already present. + * + * Optional, must be a positive integer if provided. Defaults to + * the value of `maxSize` if provided. + */ + maxEntrySize?: Size; + /** + * A function that returns a number indicating the item's size. + * + * Requires {@link OptionsBase.maxSize} to be set. + * + * If not provided, and {@link OptionsBase.maxSize} or + * {@link OptionsBase.maxEntrySize} are set, then all + * {@link LRUCache#set} calls **must** provide an explicit + * {@link SetOptions.size} or sizeCalculation param. + */ + sizeCalculation?: SizeCalculator; + /** + * Method that provides the implementation for {@link LRUCache#fetch} + * + * ```ts + * fetchMethod(key, staleValue, { signal, options, context }) + * ``` + * + * If `fetchMethod` is not provided, then `cache.fetch(key)` is equivalent + * to `Promise.resolve(cache.get(key))`. + * + * If at any time, `signal.aborted` is set to `true`, or if the + * `signal.onabort` method is called, or if it emits an `'abort'` event + * which you can listen to with `addEventListener`, then that means that + * the fetch should be abandoned. This may be passed along to async + * functions aware of AbortController/AbortSignal behavior. + * + * The `fetchMethod` should **only** return `undefined` or a Promise + * resolving to `undefined` if the AbortController signaled an `abort` + * event. In all other cases, it should return or resolve to a value + * suitable for adding to the cache. + * + * The `options` object is a union of the options that may be provided to + * `set()` and `get()`. If they are modified, then that will result in + * modifying the settings to `cache.set()` when the value is resolved, and + * in the case of + * {@link OptionsBase.noDeleteOnFetchRejection} and + * {@link OptionsBase.allowStaleOnFetchRejection}, the handling of + * `fetchMethod` failures. + * + * For example, a DNS cache may update the TTL based on the value returned + * from a remote DNS server by changing `options.ttl` in the `fetchMethod`. + */ + fetchMethod?: Fetcher; + /** + * Method that provides the implementation for {@link LRUCache#memo} + */ + memoMethod?: Memoizer; + /** + * Set to true to suppress the deletion of stale data when a + * {@link OptionsBase.fetchMethod} returns a rejected promise. + */ + noDeleteOnFetchRejection?: boolean; + /** + * Do not delete stale items when they are retrieved with + * {@link LRUCache#get}. + * + * Note that the `get` return value will still be `undefined` + * unless {@link OptionsBase.allowStale} is true. + * + * When using time-expiring entries with `ttl`, by default stale + * items will be removed from the cache when the key is accessed + * with `cache.get()`. + * + * Setting this option will cause stale items to remain in the cache, until + * they are explicitly deleted with `cache.delete(key)`, or retrieved with + * `noDeleteOnStaleGet` set to `false`. + * + * This may be overridden by passing an options object to `cache.get()`. + * + * Only relevant if a ttl is used. + */ + noDeleteOnStaleGet?: boolean; + /** + * Set to true to allow returning stale data when a + * {@link OptionsBase.fetchMethod} throws an error or returns a rejected + * promise. + * + * This differs from using {@link OptionsBase.allowStale} in that stale + * data will ONLY be returned in the case that the {@link LRUCache#fetch} + * fails, not any other times. + * + * If a `fetchMethod` fails, and there is no stale value available, the + * `fetch()` will resolve to `undefined`. Ie, all `fetchMethod` errors are + * suppressed. + * + * Implies `noDeleteOnFetchRejection`. + * + * This may be set in calls to `fetch()`, or defaulted on the constructor, + * or overridden by modifying the options object in the `fetchMethod`. + */ + allowStaleOnFetchRejection?: boolean; + /** + * Set to true to return a stale value from the cache when the + * `AbortSignal` passed to the {@link OptionsBase.fetchMethod} dispatches + * an `'abort'` event, whether user-triggered, or due to internal cache + * behavior. + * + * Unless {@link OptionsBase.ignoreFetchAbort} is also set, the underlying + * {@link OptionsBase.fetchMethod} will still be considered canceled, and + * any value it returns will be ignored and not cached. + * + * Caveat: since fetches are aborted when a new value is explicitly + * set in the cache, this can lead to fetch returning a stale value, + * since that was the fallback value _at the moment the `fetch()` was + * initiated_, even though the new updated value is now present in + * the cache. + * + * For example: + * + * ```ts + * const cache = new LRUCache({ + * ttl: 100, + * fetchMethod: async (url, oldValue, { signal }) => { + * const res = await fetch(url, { signal }) + * return await res.json() + * } + * }) + * cache.set('https://example.com/', { some: 'data' }) + * // 100ms go by... + * const result = cache.fetch('https://example.com/') + * cache.set('https://example.com/', { other: 'thing' }) + * console.log(await result) // { some: 'data' } + * console.log(cache.get('https://example.com/')) // { other: 'thing' } + * ``` + */ + allowStaleOnFetchAbort?: boolean; + /** + * Set to true to ignore the `abort` event emitted by the `AbortSignal` + * object passed to {@link OptionsBase.fetchMethod}, and still cache the + * resulting resolution value, as long as it is not `undefined`. + * + * When used on its own, this means aborted {@link LRUCache#fetch} calls + * are not immediately resolved or rejected when they are aborted, and + * instead take the full time to await. + * + * When used with {@link OptionsBase.allowStaleOnFetchAbort}, aborted + * {@link LRUCache#fetch} calls will resolve immediately to their stale + * cached value or `undefined`, and will continue to process and eventually + * update the cache when they resolve, as long as the resulting value is + * not `undefined`, thus supporting a "return stale on timeout while + * refreshing" mechanism by passing `AbortSignal.timeout(n)` as the signal. + * + * For example: + * + * ```ts + * const c = new LRUCache({ + * ttl: 100, + * ignoreFetchAbort: true, + * allowStaleOnFetchAbort: true, + * fetchMethod: async (key, oldValue, { signal }) => { + * // note: do NOT pass the signal to fetch()! + * // let's say this fetch can take a long time. + * const res = await fetch(`https://slow-backend-server/${key}`) + * return await res.json() + * }, + * }) + * + * // this will return the stale value after 100ms, while still + * // updating in the background for next time. + * const val = await c.fetch('key', { signal: AbortSignal.timeout(100) }) + * ``` + * + * **Note**: regardless of this setting, an `abort` event _is still + * emitted on the `AbortSignal` object_, so may result in invalid results + * when passed to other underlying APIs that use AbortSignals. + * + * This may be overridden in the {@link OptionsBase.fetchMethod} or the + * call to {@link LRUCache#fetch}. + */ + ignoreFetchAbort?: boolean; + /** + * In some cases, you may want to swap out the performance/Date object + * used for TTL tracking. This should almost certainly NOT be done in + * production environments! + * + * This value defaults to `global.performance` if it has a `now()` method, + * or the `global.Date` object otherwise. + */ + perf?: Perf; + } + interface OptionsMaxLimit extends OptionsBase { + max: Count; + } + interface OptionsTTLLimit extends OptionsBase { + ttl: Milliseconds; + ttlAutopurge: boolean; + } + interface OptionsSizeLimit extends OptionsBase { + maxSize: Size; + } + /** + * The valid safe options for the {@link LRUCache} constructor + */ + type Options = OptionsMaxLimit | OptionsSizeLimit | OptionsTTLLimit; + /** + * Entry objects used by {@link LRUCache#load} and {@link LRUCache#dump}, + * and returned by {@link LRUCache#info}. + */ + interface Entry { + value: V; + ttl?: Milliseconds; + size?: Size; + start?: Milliseconds; + } +} +/** + * Default export, the thing you're using this module to get. + * + * The `K` and `V` types define the key and value types, respectively. The + * optional `FC` type defines the type of the `context` object passed to + * `cache.fetch()` and `cache.memo()`. + * + * Keys and values **must not** be `null` or `undefined`. + * + * All properties from the options object (with the exception of `max`, + * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are + * added as normal public members. (The listed options are read-only getters.) + * + * Changing any of these will alter the defaults for subsequent method calls. + */ +export declare class LRUCache { + #private; + /** + * {@link LRUCache.OptionsBase.perf} + */ + get perf(): Perf; + /** + * {@link LRUCache.OptionsBase.ttl} + */ + ttl: LRUCache.Milliseconds; + /** + * {@link LRUCache.OptionsBase.ttlResolution} + */ + ttlResolution: LRUCache.Milliseconds; + /** + * {@link LRUCache.OptionsBase.ttlAutopurge} + */ + ttlAutopurge: boolean; + /** + * {@link LRUCache.OptionsBase.updateAgeOnGet} + */ + updateAgeOnGet: boolean; + /** + * {@link LRUCache.OptionsBase.updateAgeOnHas} + */ + updateAgeOnHas: boolean; + /** + * {@link LRUCache.OptionsBase.allowStale} + */ + allowStale: boolean; + /** + * {@link LRUCache.OptionsBase.noDisposeOnSet} + */ + noDisposeOnSet: boolean; + /** + * {@link LRUCache.OptionsBase.noUpdateTTL} + */ + noUpdateTTL: boolean; + /** + * {@link LRUCache.OptionsBase.maxEntrySize} + */ + maxEntrySize: LRUCache.Size; + /** + * {@link LRUCache.OptionsBase.sizeCalculation} + */ + sizeCalculation?: LRUCache.SizeCalculator; + /** + * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection} + */ + noDeleteOnFetchRejection: boolean; + /** + * {@link LRUCache.OptionsBase.noDeleteOnStaleGet} + */ + noDeleteOnStaleGet: boolean; + /** + * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort} + */ + allowStaleOnFetchAbort: boolean; + /** + * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} + */ + allowStaleOnFetchRejection: boolean; + /** + * {@link LRUCache.OptionsBase.ignoreFetchAbort} + */ + ignoreFetchAbort: boolean; + /** {@link LRUCache.OptionsBase.backgroundFetchSize} */ + backgroundFetchSize: number; + /** + * Do not call this method unless you need to inspect the + * inner workings of the cache. If anything returned by this + * object is modified in any way, strange breakage may occur. + * + * These fields are private for a reason! + * + * @internal + */ + static unsafeExposeInternals(c: LRUCache): { + starts: ZeroArray | undefined; + ttls: ZeroArray | undefined; + autopurgeTimers: (NodeJS.Timeout | undefined)[] | undefined; + sizes: ZeroArray | undefined; + keyMap: Map; + keyList: (K | undefined)[]; + valList: (V | BackgroundFetch | undefined)[]; + next: NumberArray; + prev: NumberArray; + readonly head: Index; + readonly tail: Index; + free: StackLike; + isBackgroundFetch: (p: unknown) => p is BackgroundFetch; + backgroundFetch: (k: K, index: number | undefined, options: LRUCache.FetchOptions, context: unknown) => BackgroundFetch; + moveToTail: (index: number) => void; + indexes: (options?: { + allowStale: boolean; + }) => Generator; + rindexes: (options?: { + allowStale: boolean; + }) => Generator; + isStale: (index: number | undefined) => boolean; + }; + /** + * {@link LRUCache.OptionsBase.max} (read-only) + */ + get max(): LRUCache.Count; + /** + * {@link LRUCache.OptionsBase.maxSize} (read-only) + */ + get maxSize(): LRUCache.Count; + /** + * The total computed size of items in the cache (read-only) + */ + get calculatedSize(): LRUCache.Size; + /** + * The number of items stored in the cache (read-only) + */ + get size(): LRUCache.Count; + /** + * {@link LRUCache.OptionsBase.fetchMethod} (read-only) + */ + get fetchMethod(): LRUCache.Fetcher | undefined; + get memoMethod(): LRUCache.Memoizer | undefined; + /** + * {@link LRUCache.OptionsBase.dispose} (read-only) + */ + get dispose(): LRUCache.Disposer | undefined; + /** + * {@link LRUCache.OptionsBase.onInsert} (read-only) + */ + get onInsert(): LRUCache.Inserter | undefined; + /** + * {@link LRUCache.OptionsBase.disposeAfter} (read-only) + */ + get disposeAfter(): LRUCache.Disposer | undefined; + constructor(options: LRUCache.Options | LRUCache); + /** + * Return the number of ms left in the item's TTL. If item is not in cache, + * returns `0`. Returns `Infinity` if item is in cache without a defined TTL. + */ + getRemainingTTL(key: K): number; + /** + * Return a generator yielding `[key, value]` pairs, + * in order from most recently used to least recently used. + */ + entries(): Generator<[K, V], void, unknown>; + /** + * Inverse order version of {@link LRUCache.entries} + * + * Return a generator yielding `[key, value]` pairs, + * in order from least recently used to most recently used. + */ + rentries(): Generator<(K | V)[], void, unknown>; + /** + * Return a generator yielding the keys in the cache, + * in order from most recently used to least recently used. + */ + keys(): Generator; + /** + * Inverse order version of {@link LRUCache.keys} + * + * Return a generator yielding the keys in the cache, + * in order from least recently used to most recently used. + */ + rkeys(): Generator; + /** + * Return a generator yielding the values in the cache, + * in order from most recently used to least recently used. + */ + values(): Generator; + /** + * Inverse order version of {@link LRUCache.values} + * + * Return a generator yielding the values in the cache, + * in order from least recently used to most recently used. + */ + rvalues(): Generator; + /** + * Iterating over the cache itself yields the same results as + * {@link LRUCache.entries} + */ + [Symbol.iterator](): Generator<[K, V], void, unknown>; + /** + * A String value that is used in the creation of the default string + * description of an object. Called by the built-in method + * `Object.prototype.toString`. + */ + [Symbol.toStringTag]: string; + /** + * Find a value for which the supplied fn method returns a truthy value, + * similar to `Array.find()`. fn is called as `fn(value, key, cache)`. + */ + find(fn: (v: V, k: K, self: LRUCache) => boolean, getOptions?: LRUCache.GetOptions): V | undefined; + /** + * Call the supplied function on each item in the cache, in order from most + * recently used to least recently used. + * + * `fn` is called as `fn(value, key, cache)`. + * + * If `thisp` is provided, function will be called in the `this`-context of + * the provided object, or the cache if no `thisp` object is provided. + * + * Does not update age or recenty of use, or iterate over stale values. + */ + forEach(fn: (v: V, k: K, self: LRUCache) => unknown, thisp?: unknown): void; + /** + * The same as {@link LRUCache.forEach} but items are iterated over in + * reverse order. (ie, less recently used items are iterated over first.) + */ + rforEach(fn: (v: V, k: K, self: LRUCache) => unknown, thisp?: unknown): void; + /** + * Delete any stale entries. Returns true if anything was removed, + * false otherwise. + */ + purgeStale(): boolean; + /** + * Get the extended info about a given entry, to get its value, size, and + * TTL info simultaneously. Returns `undefined` if the key is not present. + * + * Unlike {@link LRUCache#dump}, which is designed to be portable and survive + * serialization, the `start` value is always the current timestamp, and the + * `ttl` is a calculated remaining time to live (negative if expired). + * + * Always returns stale values, if their info is found in the cache, so be + * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl}) + * if relevant. + */ + info(key: K): LRUCache.Entry | undefined; + /** + * Return an array of [key, {@link LRUCache.Entry}] tuples which can be + * passed to {@link LRUCache#load}. + * + * The `start` fields are calculated relative to a portable `Date.now()` + * timestamp, even if `performance.now()` is available. + * + * Stale entries are always included in the `dump`, even if + * {@link LRUCache.OptionsBase.allowStale} is false. + * + * Note: this returns an actual array, not a generator, so it can be more + * easily passed around. + */ + dump(): [K, LRUCache.Entry][]; + /** + * Reset the cache and load in the items in entries in the order listed. + * + * The shape of the resulting cache may be different if the same options are + * not used in both caches. + * + * The `start` fields are assumed to be calculated relative to a portable + * `Date.now()` timestamp, even if `performance.now()` is available. + */ + load(arr: [K, LRUCache.Entry][]): void; + /** + * Add a value to the cache. + * + * Note: if `undefined` is specified as a value, this is an alias for + * {@link LRUCache#delete} + * + * Fields on the {@link LRUCache.SetOptions} options param will override + * their corresponding values in the constructor options for the scope + * of this single `set()` operation. + * + * If `start` is provided, then that will set the effective start + * time for the TTL calculation. Note that this must be a previous + * value of `performance.now()` if supported, or a previous value of + * `Date.now()` if not. + * + * Options object may also include `size`, which will prevent + * calling the `sizeCalculation` function and just use the specified + * number if it is a positive integer, and `noDisposeOnSet` which + * will prevent calling a `dispose` function in the case of + * overwrites. + * + * If the `size` (or return value of `sizeCalculation`) for a given + * entry is greater than `maxEntrySize`, then the item will not be + * added to the cache. + * + * Will update the recency of the entry. + * + * If the value is `undefined`, then this is an alias for + * `cache.delete(key)`. `undefined` is never stored in the cache. + */ + set(k: K, v: V | undefined, setOptions?: LRUCache.SetOptions): this; + /** + * Evict the least recently used item, returning its value or + * `undefined` if cache is empty. + */ + pop(): V | undefined; + /** + * Check if a key is in the cache, without updating the recency of use. + * Will return false if the item is stale, even though it is technically + * in the cache. + * + * Check if a key is in the cache, without updating the recency of + * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set + * to `true` in either the options or the constructor. + * + * Will return `false` if the item is stale, even though it is technically in + * the cache. The difference can be determined (if it matters) by using a + * `status` argument, and inspecting the `has` field. + * + * Will not update item age unless + * {@link LRUCache.OptionsBase.updateAgeOnHas} is set. + */ + has(k: K, hasOptions?: LRUCache.HasOptions): boolean; + /** + * Like {@link LRUCache#get} but doesn't update recency or delete stale + * items. + * + * Returns `undefined` if the item is stale, unless + * {@link LRUCache.OptionsBase.allowStale} is set. + */ + peek(k: K, peekOptions?: LRUCache.PeekOptions): V | undefined; + /** + * Make an asynchronous cached fetch using the + * {@link LRUCache.OptionsBase.fetchMethod} function. + * + * If the value is in the cache and not stale, then the returned + * Promise resolves to the value. + * + * If not in the cache, or beyond its TTL staleness, then + * `fetchMethod(key, staleValue, { options, signal, context })` is + * called, and the value returned will be added to the cache once + * resolved. + * + * If called with `allowStale`, and an asynchronous fetch is + * currently in progress to reload a stale value, then the former + * stale value will be returned. + * + * If called with `forceRefresh`, then the cached item will be + * re-fetched, even if it is not stale. However, if `allowStale` is also + * set, then the old value will still be returned. This is useful + * in cases where you want to force a reload of a cached value. If + * a background fetch is already in progress, then `forceRefresh` + * has no effect. + * + * If multiple fetches for the same key are issued, then they will all be + * coalesced into a single call to fetchMethod. + * + * Note that this means that handling options such as + * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}, + * {@link LRUCache.FetchOptions.signal}, + * and {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} will be + * determined by the FIRST fetch() call for a given key. + * + * This is a known (fixable) shortcoming which will be addresed on when + * someone complains about it, as the fix would involve added complexity and + * may not be worth the costs for this edge case. + * + * If {@link LRUCache.OptionsBase.fetchMethod} is not specified, then this is + * effectively an alias for `Promise.resolve(cache.get(key))`. + * + * When the fetch method resolves to a value, if the fetch has not + * been aborted due to deletion, eviction, or being overwritten, + * then it is added to the cache using the options provided. + * + * If the key is evicted or deleted before the `fetchMethod` + * resolves, then the AbortSignal passed to the `fetchMethod` will + * receive an `abort` event, and the promise returned by `fetch()` + * will reject with the reason for the abort. + * + * If a `signal` is passed to the `fetch()` call, then aborting the + * signal will abort the fetch and cause the `fetch()` promise to + * reject with the reason provided. + * + * **Setting `context`** + * + * If an `FC` type is set to a type other than `unknown`, `void`, or + * `undefined` in the {@link LRUCache} constructor, then all + * calls to `cache.fetch()` _must_ provide a `context` option. If + * set to `undefined` or `void`, then calls to fetch _must not_ + * provide a `context` option. + * + * The `context` param allows you to provide arbitrary data that + * might be relevant in the course of fetching the data. It is only + * relevant for the course of a single `fetch()` operation, and + * discarded afterwards. + * + * **Note: `fetch()` calls are inflight-unique** + * + * If you call `fetch()` multiple times with the same key value, + * then every call after the first will resolve on the same + * promise1, + * _even if they have different settings that would otherwise change + * the behavior of the fetch_, such as `noDeleteOnFetchRejection` + * or `ignoreFetchAbort`. + * + * In most cases, this is not a problem (in fact, only fetching + * something once is what you probably want, if you're caching in + * the first place). If you are changing the fetch() options + * dramatically between runs, there's a good chance that you might + * be trying to fit divergent semantics into a single object, and + * would be better off with multiple cache instances. + * + * **1**: Ie, they're not the "same Promise", but they resolve at + * the same time, because they're both waiting on the same + * underlying fetchMethod response. + */ + fetch(k: K, fetchOptions: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : LRUCache.FetchOptionsWithContext): Promise; + fetch(k: unknown extends FC ? K : FC extends undefined | void ? K : never, fetchOptions?: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : never): Promise; + /** + * In some cases, `cache.fetch()` may resolve to `undefined`, either because + * a {@link LRUCache.OptionsBase#fetchMethod} was not provided (turning + * `cache.fetch(k)` into just an async wrapper around `cache.get(k)`) or + * because `ignoreFetchAbort` was specified (either to the constructor or + * in the {@link LRUCache.FetchOptions}). Also, the + * {@link LRUCache.OptionsBase.fetchMethod} may return `undefined` or `void`, making + * the test even more complicated. + * + * Because inferring the cases where `undefined` might be returned are so + * cumbersome, but testing for `undefined` can also be annoying, this method + * can be used, which will reject if `this.fetch()` resolves to undefined. + */ + forceFetch(k: K, fetchOptions: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : LRUCache.FetchOptionsWithContext): Promise; + forceFetch(k: unknown extends FC ? K : FC extends undefined | void ? K : never, fetchOptions?: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : never): Promise; + /** + * If the key is found in the cache, then this is equivalent to + * {@link LRUCache#get}. If not, in the cache, then calculate the value using + * the {@link LRUCache.OptionsBase.memoMethod}, and add it to the cache. + * + * If an `FC` type is set to a type other than `unknown`, `void`, or + * `undefined` in the LRUCache constructor, then all calls to `cache.memo()` + * _must_ provide a `context` option. If set to `undefined` or `void`, then + * calls to memo _must not_ provide a `context` option. + * + * The `context` param allows you to provide arbitrary data that might be + * relevant in the course of fetching the data. It is only relevant for the + * course of a single `memo()` operation, and discarded afterwards. + */ + memo(k: K, memoOptions: unknown extends FC ? LRUCache.MemoOptions : FC extends undefined | void ? LRUCache.MemoOptionsNoContext : LRUCache.MemoOptionsWithContext): V; + memo(k: unknown extends FC ? K : FC extends undefined | void ? K : never, memoOptions?: unknown extends FC ? LRUCache.MemoOptions : FC extends undefined | void ? LRUCache.MemoOptionsNoContext : never): V; + /** + * Return a value from the cache. Will update the recency of the cache + * entry found. + * + * If the key is not found, get() will return `undefined`. + */ + get(k: K, getOptions?: LRUCache.GetOptions): V | undefined; + /** + * Deletes a key out of the cache. + * + * Returns true if the key was deleted, false otherwise. + */ + delete(k: K): boolean; + /** + * Clear the cache entirely, throwing away all values. + */ + clear(): void; +} +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/node/index.d.ts.map b/node_modules/lru-cache/dist/commonjs/node/index.d.ts.map new file mode 100644 index 00000000..fa98a0f5 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/node/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/node/index.js b/node_modules/lru-cache/dist/commonjs/node/index.js new file mode 100644 index 00000000..179694b1 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/node/index.js @@ -0,0 +1,1726 @@ +"use strict"; +/** + * @module LRUCache + */ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.LRUCache = void 0; +const diagnostics_channel_js_1 = require("./diagnostics-channel.js"); +const perf_js_1 = require("./perf.js"); +const hasSubscribers = () => diagnostics_channel_js_1.metrics.hasSubscribers || diagnostics_channel_js_1.tracing.hasSubscribers; +const warned = new Set(); +/* c8 ignore start */ +const PROCESS = (typeof process === 'object' && !!process ? + process + : {}); +/* c8 ignore stop */ +const emitWarning = (msg, type, code, fn) => { + if (typeof PROCESS.emitWarning === 'function') { + PROCESS.emitWarning(msg, type, code, fn); + } + else { + //oxlint-disable-next-line no-console + console.error(`[${code}] ${type}: ${msg}`); + } +}; +const shouldWarn = (code) => !warned.has(code); +const TYPE = Symbol('type'); +const isPosInt = (n) => !!n && n === Math.floor(n) && n > 0 && isFinite(n); +// This is a little bit ridiculous, tbh. +// The maximum array length is 2^32-1 or thereabouts on most JS impls. +// And well before that point, you're caching the entire world, I mean, +// that's ~32GB of just integers for the next/prev links, plus whatever +// else to hold that many keys and values. Just filling the memory with +// zeroes at init time is brutal when you get that big. +// But why not be complete? +// Maybe in the future, these limits will have expanded. +/* c8 ignore start */ +const getUintArray = (max) => !isPosInt(max) ? null + : max <= Math.pow(2, 8) ? Uint8Array + : max <= Math.pow(2, 16) ? Uint16Array + : max <= Math.pow(2, 32) ? Uint32Array + : max <= Number.MAX_SAFE_INTEGER ? ZeroArray + : null; +/* c8 ignore stop */ +class ZeroArray extends Array { + constructor(size) { + super(size); + this.fill(0); + } +} +class Stack { + /* c8 ignore start - not sure why this is showing up uncovered?? */ + heap; + /* c8 ignore stop */ + length; + // private constructor + static #constructing = false; + static create(max) { + const HeapCls = getUintArray(max); + if (!HeapCls) + return []; + Stack.#constructing = true; + const s = new Stack(max, HeapCls); + Stack.#constructing = false; + return s; + } + constructor(max, HeapCls) { + /* c8 ignore start */ + if (!Stack.#constructing) { + throw new TypeError('instantiate Stack using Stack.create(n)'); + } + /* c8 ignore stop */ + this.heap = new HeapCls(max); + this.length = 0; + } + push(n) { + this.heap[this.length++] = n; + } + pop() { + return this.heap[--this.length]; + } +} +/** + * Default export, the thing you're using this module to get. + * + * The `K` and `V` types define the key and value types, respectively. The + * optional `FC` type defines the type of the `context` object passed to + * `cache.fetch()` and `cache.memo()`. + * + * Keys and values **must not** be `null` or `undefined`. + * + * All properties from the options object (with the exception of `max`, + * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are + * added as normal public members. (The listed options are read-only getters.) + * + * Changing any of these will alter the defaults for subsequent method calls. + */ +class LRUCache { + // options that cannot be changed without disaster + #max; + #maxSize; + #dispose; + #onInsert; + #disposeAfter; + #fetchMethod; + #memoMethod; + #perf; + /** + * {@link LRUCache.OptionsBase.perf} + */ + get perf() { + return this.#perf; + } + /** + * {@link LRUCache.OptionsBase.ttl} + */ + ttl; + /** + * {@link LRUCache.OptionsBase.ttlResolution} + */ + ttlResolution; + /** + * {@link LRUCache.OptionsBase.ttlAutopurge} + */ + ttlAutopurge; + /** + * {@link LRUCache.OptionsBase.updateAgeOnGet} + */ + updateAgeOnGet; + /** + * {@link LRUCache.OptionsBase.updateAgeOnHas} + */ + updateAgeOnHas; + /** + * {@link LRUCache.OptionsBase.allowStale} + */ + allowStale; + /** + * {@link LRUCache.OptionsBase.noDisposeOnSet} + */ + noDisposeOnSet; + /** + * {@link LRUCache.OptionsBase.noUpdateTTL} + */ + noUpdateTTL; + /** + * {@link LRUCache.OptionsBase.maxEntrySize} + */ + maxEntrySize; + /** + * {@link LRUCache.OptionsBase.sizeCalculation} + */ + sizeCalculation; + /** + * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection} + */ + noDeleteOnFetchRejection; + /** + * {@link LRUCache.OptionsBase.noDeleteOnStaleGet} + */ + noDeleteOnStaleGet; + /** + * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort} + */ + allowStaleOnFetchAbort; + /** + * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} + */ + allowStaleOnFetchRejection; + /** + * {@link LRUCache.OptionsBase.ignoreFetchAbort} + */ + ignoreFetchAbort; + /** {@link LRUCache.OptionsBase.backgroundFetchSize} */ + backgroundFetchSize; + // computed properties + #size; + #calculatedSize; + #keyMap; + #keyList; + #valList; + #next; + #prev; + #head; + #tail; + #free; + #disposed; + #sizes; + #starts; + #ttls; + #autopurgeTimers; + #hasDispose; + #hasFetchMethod; + #hasDisposeAfter; + #hasOnInsert; + /** + * Do not call this method unless you need to inspect the + * inner workings of the cache. If anything returned by this + * object is modified in any way, strange breakage may occur. + * + * These fields are private for a reason! + * + * @internal + */ + static unsafeExposeInternals(c) { + return { + // properties + starts: c.#starts, + ttls: c.#ttls, + autopurgeTimers: c.#autopurgeTimers, + sizes: c.#sizes, + keyMap: c.#keyMap, + keyList: c.#keyList, + valList: c.#valList, + next: c.#next, + prev: c.#prev, + get head() { + return c.#head; + }, + get tail() { + return c.#tail; + }, + free: c.#free, + // methods + isBackgroundFetch: (p) => c.#isBackgroundFetch(p), + backgroundFetch: (k, index, options, context) => c.#backgroundFetch(k, index, options, context), + moveToTail: (index) => c.#moveToTail(index), + indexes: (options) => c.#indexes(options), + rindexes: (options) => c.#rindexes(options), + isStale: (index) => c.#isStale(index), + }; + } + // Protected read-only members + /** + * {@link LRUCache.OptionsBase.max} (read-only) + */ + get max() { + return this.#max; + } + /** + * {@link LRUCache.OptionsBase.maxSize} (read-only) + */ + get maxSize() { + return this.#maxSize; + } + /** + * The total computed size of items in the cache (read-only) + */ + get calculatedSize() { + return this.#calculatedSize; + } + /** + * The number of items stored in the cache (read-only) + */ + get size() { + return this.#size; + } + /** + * {@link LRUCache.OptionsBase.fetchMethod} (read-only) + */ + get fetchMethod() { + return this.#fetchMethod; + } + get memoMethod() { + return this.#memoMethod; + } + /** + * {@link LRUCache.OptionsBase.dispose} (read-only) + */ + get dispose() { + return this.#dispose; + } + /** + * {@link LRUCache.OptionsBase.onInsert} (read-only) + */ + get onInsert() { + return this.#onInsert; + } + /** + * {@link LRUCache.OptionsBase.disposeAfter} (read-only) + */ + get disposeAfter() { + return this.#disposeAfter; + } + constructor(options) { + const { max = 0, ttl, ttlResolution = 1, ttlAutopurge, updateAgeOnGet, updateAgeOnHas, allowStale, dispose, onInsert, disposeAfter, noDisposeOnSet, noUpdateTTL, maxSize = 0, maxEntrySize = 0, sizeCalculation, fetchMethod, memoMethod, noDeleteOnFetchRejection, noDeleteOnStaleGet, allowStaleOnFetchRejection, allowStaleOnFetchAbort, ignoreFetchAbort, backgroundFetchSize = 1, perf, } = options; + this.backgroundFetchSize = backgroundFetchSize; + if (perf !== undefined) { + if (typeof perf?.now !== 'function') { + throw new TypeError('perf option must have a now() method if specified'); + } + } + this.#perf = perf ?? perf_js_1.defaultPerf; + if (max !== 0 && !isPosInt(max)) { + throw new TypeError('max option must be a nonnegative integer'); + } + const UintArray = max ? getUintArray(max) : Array; + if (!UintArray) { + throw new Error('invalid max value: ' + max); + } + this.#max = max; + this.#maxSize = maxSize; + this.maxEntrySize = maxEntrySize || this.#maxSize; + this.sizeCalculation = sizeCalculation; + if (this.sizeCalculation) { + if (!this.#maxSize && !this.maxEntrySize) { + throw new TypeError('cannot set sizeCalculation without setting maxSize or maxEntrySize'); + } + if (typeof this.sizeCalculation !== 'function') { + throw new TypeError('sizeCalculation set to non-function'); + } + } + if (memoMethod !== undefined && typeof memoMethod !== 'function') { + throw new TypeError('memoMethod must be a function if defined'); + } + this.#memoMethod = memoMethod; + if (fetchMethod !== undefined && typeof fetchMethod !== 'function') { + throw new TypeError('fetchMethod must be a function if specified'); + } + this.#fetchMethod = fetchMethod; + this.#hasFetchMethod = !!fetchMethod; + this.#keyMap = new Map(); + this.#keyList = Array.from({ length: max }).fill(undefined); + this.#valList = Array.from({ length: max }).fill(undefined); + this.#next = new UintArray(max); + this.#prev = new UintArray(max); + this.#head = 0; + this.#tail = 0; + this.#free = Stack.create(max); + this.#size = 0; + this.#calculatedSize = 0; + if (typeof dispose === 'function') { + this.#dispose = dispose; + } + if (typeof onInsert === 'function') { + this.#onInsert = onInsert; + } + if (typeof disposeAfter === 'function') { + this.#disposeAfter = disposeAfter; + this.#disposed = []; + } + else { + this.#disposeAfter = undefined; + this.#disposed = undefined; + } + this.#hasDispose = !!this.#dispose; + this.#hasOnInsert = !!this.#onInsert; + this.#hasDisposeAfter = !!this.#disposeAfter; + this.noDisposeOnSet = !!noDisposeOnSet; + this.noUpdateTTL = !!noUpdateTTL; + this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection; + this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection; + this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort; + this.ignoreFetchAbort = !!ignoreFetchAbort; + // NB: maxEntrySize is set to maxSize if it's set + if (this.maxEntrySize !== 0) { + if (this.#maxSize !== 0) { + if (!isPosInt(this.#maxSize)) { + throw new TypeError('maxSize must be a positive integer if specified'); + } + } + if (!isPosInt(this.maxEntrySize)) { + throw new TypeError('maxEntrySize must be a positive integer if specified'); + } + this.#initializeSizeTracking(); + } + this.allowStale = !!allowStale; + this.noDeleteOnStaleGet = !!noDeleteOnStaleGet; + this.updateAgeOnGet = !!updateAgeOnGet; + this.updateAgeOnHas = !!updateAgeOnHas; + this.ttlResolution = + isPosInt(ttlResolution) || ttlResolution === 0 ? ttlResolution : 1; + this.ttlAutopurge = !!ttlAutopurge; + this.ttl = ttl || 0; + if (this.ttl) { + if (!isPosInt(this.ttl)) { + throw new TypeError('ttl must be a positive integer if specified'); + } + this.#initializeTTLTracking(); + } + // do not allow completely unbounded caches + if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) { + throw new TypeError('At least one of max, maxSize, or ttl is required'); + } + if (!this.ttlAutopurge && !this.#max && !this.#maxSize) { + const code = 'LRU_CACHE_UNBOUNDED'; + if (shouldWarn(code)) { + warned.add(code); + const msg = 'TTL caching without ttlAutopurge, max, or maxSize can ' + + 'result in unbounded memory consumption.'; + emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache); + } + } + } + /** + * Return the number of ms left in the item's TTL. If item is not in cache, + * returns `0`. Returns `Infinity` if item is in cache without a defined TTL. + */ + getRemainingTTL(key) { + return this.#keyMap.has(key) ? Infinity : 0; + } + #initializeTTLTracking() { + const ttls = new ZeroArray(this.#max); + const starts = new ZeroArray(this.#max); + this.#ttls = ttls; + this.#starts = starts; + const purgeTimers = this.ttlAutopurge ? + Array.from({ + length: this.#max, + }) + : undefined; + this.#autopurgeTimers = purgeTimers; + this.#setItemTTL = (index, ttl, start = this.#perf.now()) => { + starts[index] = ttl !== 0 ? start : 0; + ttls[index] = ttl; + setPurgetTimer(index, ttl); + }; + this.#updateItemAge = index => { + starts[index] = ttls[index] !== 0 ? this.#perf.now() : 0; + setPurgetTimer(index, ttls[index]); + }; + // clear out the purge timer if we're setting TTL to 0, and + // previously had a ttl purge timer running, so it doesn't + // fire unnecessarily. Don't need to do this if we're not doing + // autopurge. + const setPurgetTimer = !this.ttlAutopurge ? + () => { } + : (index, ttl) => { + if (purgeTimers?.[index]) { + clearTimeout(purgeTimers[index]); + purgeTimers[index] = undefined; + } + if (ttl && ttl !== 0 && purgeTimers) { + const t = setTimeout(() => { + if (this.#isStale(index)) { + this.#delete(this.#keyList[index], 'expire'); + } + }, ttl + 1); + // unref() not supported on all platforms + /* c8 ignore start */ + if (t.unref) { + t.unref(); + } + /* c8 ignore stop */ + purgeTimers[index] = t; + } + }; + this.#statusTTL = (status, index) => { + if (ttls[index]) { + const ttl = ttls[index]; + const start = starts[index]; + /* c8 ignore start */ + if (!ttl || !start) { + return; + } + /* c8 ignore stop */ + status.ttl = ttl; + status.start = start; + status.now = cachedNow || getNow(); + const age = status.now - start; + status.remainingTTL = ttl - age; + } + }; + // debounce calls to perf.now() to 1s so we're not hitting + // that costly call repeatedly. + let cachedNow = 0; + const getNow = () => { + const n = this.#perf.now(); + if (this.ttlResolution > 0) { + cachedNow = n; + const t = setTimeout(() => (cachedNow = 0), this.ttlResolution); + // not available on all platforms + /* c8 ignore start */ + if (t.unref) { + t.unref(); + } + /* c8 ignore stop */ + } + return n; + }; + this.getRemainingTTL = key => { + const index = this.#keyMap.get(key); + if (index === undefined) { + return 0; + } + const ttl = ttls[index]; + const start = starts[index]; + if (!ttl || !start) { + return Infinity; + } + const age = (cachedNow || getNow()) - start; + return ttl - age; + }; + this.#isStale = index => { + const s = starts[index]; + const t = ttls[index]; + return !!t && !!s && (cachedNow || getNow()) - s > t; + }; + } + // conditionally set private methods related to TTL + #updateItemAge = () => { }; + #statusTTL = () => { }; + #setItemTTL = () => { }; + /* c8 ignore stop */ + #isStale = () => false; + #initializeSizeTracking() { + const sizes = new ZeroArray(this.#max); + this.#calculatedSize = 0; + this.#sizes = sizes; + this.#removeItemSize = index => { + this.#calculatedSize -= sizes[index]; + sizes[index] = 0; + }; + this.#requireSize = (k, v, size, sizeCalculation) => { + if (!isPosInt(size)) { + // provisionally accept background fetches. + // actual value size will be checked when they return. + if (this.#isBackgroundFetch(v)) { + // NB: this cannot occur if v.__staleWhileFetching is set, + // because in that case, it would take on the size of the + // existing entry that it temporarily replaces. + return this.backgroundFetchSize; + } + if (sizeCalculation) { + if (typeof sizeCalculation !== 'function') { + throw new TypeError('sizeCalculation must be a function'); + } + size = sizeCalculation(v, k); + if (!isPosInt(size)) { + throw new TypeError('sizeCalculation return invalid (expect positive integer)'); + } + } + else { + throw new TypeError('invalid size value (must be positive integer). ' + + 'When maxSize or maxEntrySize is used, sizeCalculation ' + + 'or size must be set.'); + } + } + return size; + }; + this.#addItemSize = (index, size, status) => { + sizes[index] = size; + if (this.#maxSize) { + const maxSize = this.#maxSize - sizes[index]; + while (this.#calculatedSize > maxSize) { + this.#evict(true); + } + } + this.#calculatedSize += sizes[index]; + if (status) { + status.entrySize = size; + status.totalCalculatedSize = this.#calculatedSize; + } + }; + } + #removeItemSize = _i => { }; + #addItemSize = (_i, _s, _st) => { }; + #requireSize = (_k, _v, size, sizeCalculation) => { + if (size || sizeCalculation) { + throw new TypeError('cannot set size without setting maxSize or maxEntrySize on cache'); + } + return 0; + }; + *#indexes({ allowStale = this.allowStale } = {}) { + if (this.#size) { + for (let i = this.#tail; this.#isValidIndex(i);) { + if (allowStale || !this.#isStale(i)) { + yield i; + } + if (i === this.#head) { + break; + } + else { + i = this.#prev[i]; + } + } + } + } + *#rindexes({ allowStale = this.allowStale } = {}) { + if (this.#size) { + for (let i = this.#head; this.#isValidIndex(i);) { + if (allowStale || !this.#isStale(i)) { + yield i; + } + if (i === this.#tail) { + break; + } + else { + i = this.#next[i]; + } + } + } + } + #isValidIndex(index) { + return (index !== undefined && + this.#keyMap.get(this.#keyList[index]) === index); + } + /** + * Return a generator yielding `[key, value]` pairs, + * in order from most recently used to least recently used. + */ + *entries() { + for (const i of this.#indexes()) { + if (this.#valList[i] !== undefined && + this.#keyList[i] !== undefined && + !this.#isBackgroundFetch(this.#valList[i])) { + yield [this.#keyList[i], this.#valList[i]]; + } + } + } + /** + * Inverse order version of {@link LRUCache.entries} + * + * Return a generator yielding `[key, value]` pairs, + * in order from least recently used to most recently used. + */ + *rentries() { + for (const i of this.#rindexes()) { + if (this.#valList[i] !== undefined && + this.#keyList[i] !== undefined && + !this.#isBackgroundFetch(this.#valList[i])) { + yield [this.#keyList[i], this.#valList[i]]; + } + } + } + /** + * Return a generator yielding the keys in the cache, + * in order from most recently used to least recently used. + */ + *keys() { + for (const i of this.#indexes()) { + const k = this.#keyList[i]; + if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield k; + } + } + } + /** + * Inverse order version of {@link LRUCache.keys} + * + * Return a generator yielding the keys in the cache, + * in order from least recently used to most recently used. + */ + *rkeys() { + for (const i of this.#rindexes()) { + const k = this.#keyList[i]; + if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield k; + } + } + } + /** + * Return a generator yielding the values in the cache, + * in order from most recently used to least recently used. + */ + *values() { + for (const i of this.#indexes()) { + const v = this.#valList[i]; + if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield this.#valList[i]; + } + } + } + /** + * Inverse order version of {@link LRUCache.values} + * + * Return a generator yielding the values in the cache, + * in order from least recently used to most recently used. + */ + *rvalues() { + for (const i of this.#rindexes()) { + const v = this.#valList[i]; + if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield this.#valList[i]; + } + } + } + /** + * Iterating over the cache itself yields the same results as + * {@link LRUCache.entries} + */ + [Symbol.iterator]() { + return this.entries(); + } + /** + * A String value that is used in the creation of the default string + * description of an object. Called by the built-in method + * `Object.prototype.toString`. + */ + [Symbol.toStringTag] = 'LRUCache'; + /** + * Find a value for which the supplied fn method returns a truthy value, + * similar to `Array.find()`. fn is called as `fn(value, key, cache)`. + */ + find(fn, getOptions = {}) { + for (const i of this.#indexes()) { + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined) + continue; + if (fn(value, this.#keyList[i], this)) { + return this.#get(this.#keyList[i], getOptions); + } + } + } + /** + * Call the supplied function on each item in the cache, in order from most + * recently used to least recently used. + * + * `fn` is called as `fn(value, key, cache)`. + * + * If `thisp` is provided, function will be called in the `this`-context of + * the provided object, or the cache if no `thisp` object is provided. + * + * Does not update age or recenty of use, or iterate over stale values. + */ + forEach(fn, thisp = this) { + for (const i of this.#indexes()) { + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined) + continue; + fn.call(thisp, value, this.#keyList[i], this); + } + } + /** + * The same as {@link LRUCache.forEach} but items are iterated over in + * reverse order. (ie, less recently used items are iterated over first.) + */ + rforEach(fn, thisp = this) { + for (const i of this.#rindexes()) { + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined) + continue; + fn.call(thisp, value, this.#keyList[i], this); + } + } + /** + * Delete any stale entries. Returns true if anything was removed, + * false otherwise. + */ + purgeStale() { + let deleted = false; + for (const i of this.#rindexes({ allowStale: true })) { + if (this.#isStale(i)) { + this.#delete(this.#keyList[i], 'expire'); + deleted = true; + } + } + return deleted; + } + /** + * Get the extended info about a given entry, to get its value, size, and + * TTL info simultaneously. Returns `undefined` if the key is not present. + * + * Unlike {@link LRUCache#dump}, which is designed to be portable and survive + * serialization, the `start` value is always the current timestamp, and the + * `ttl` is a calculated remaining time to live (negative if expired). + * + * Always returns stale values, if their info is found in the cache, so be + * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl}) + * if relevant. + */ + info(key) { + const i = this.#keyMap.get(key); + if (i === undefined) + return undefined; + const v = this.#valList[i]; + /* c8 ignore start - this isn't tested for the info function, + * but it's the same logic as found in other places. */ + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined) + return undefined; + /* c8 ignore stop */ + const entry = { value }; + if (this.#ttls && this.#starts) { + const ttl = this.#ttls[i]; + const start = this.#starts[i]; + if (ttl && start) { + const remain = ttl - (this.#perf.now() - start); + entry.ttl = remain; + entry.start = Date.now(); + } + } + if (this.#sizes) { + entry.size = this.#sizes[i]; + } + return entry; + } + /** + * Return an array of [key, {@link LRUCache.Entry}] tuples which can be + * passed to {@link LRUCache#load}. + * + * The `start` fields are calculated relative to a portable `Date.now()` + * timestamp, even if `performance.now()` is available. + * + * Stale entries are always included in the `dump`, even if + * {@link LRUCache.OptionsBase.allowStale} is false. + * + * Note: this returns an actual array, not a generator, so it can be more + * easily passed around. + */ + dump() { + const arr = []; + for (const i of this.#indexes({ allowStale: true })) { + const key = this.#keyList[i]; + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined || key === undefined) + continue; + const entry = { value }; + if (this.#ttls && this.#starts) { + entry.ttl = this.#ttls[i]; + // always dump the start relative to a portable timestamp + // it's ok for this to be a bit slow, it's a rare operation. + const age = this.#perf.now() - this.#starts[i]; + entry.start = Math.floor(Date.now() - age); + } + if (this.#sizes) { + entry.size = this.#sizes[i]; + } + arr.unshift([key, entry]); + } + return arr; + } + /** + * Reset the cache and load in the items in entries in the order listed. + * + * The shape of the resulting cache may be different if the same options are + * not used in both caches. + * + * The `start` fields are assumed to be calculated relative to a portable + * `Date.now()` timestamp, even if `performance.now()` is available. + */ + load(arr) { + this.clear(); + for (const [key, entry] of arr) { + if (entry.start) { + // entry.start is a portable timestamp, but we may be using + // node's performance.now(), so calculate the offset, so that + // we get the intended remaining TTL, no matter how long it's + // been on ice. + // + // it's ok for this to be a bit slow, it's a rare operation. + const age = Date.now() - entry.start; + entry.start = this.#perf.now() - age; + } + this.#set(key, entry.value, entry); + } + } + /** + * Add a value to the cache. + * + * Note: if `undefined` is specified as a value, this is an alias for + * {@link LRUCache#delete} + * + * Fields on the {@link LRUCache.SetOptions} options param will override + * their corresponding values in the constructor options for the scope + * of this single `set()` operation. + * + * If `start` is provided, then that will set the effective start + * time for the TTL calculation. Note that this must be a previous + * value of `performance.now()` if supported, or a previous value of + * `Date.now()` if not. + * + * Options object may also include `size`, which will prevent + * calling the `sizeCalculation` function and just use the specified + * number if it is a positive integer, and `noDisposeOnSet` which + * will prevent calling a `dispose` function in the case of + * overwrites. + * + * If the `size` (or return value of `sizeCalculation`) for a given + * entry is greater than `maxEntrySize`, then the item will not be + * added to the cache. + * + * Will update the recency of the entry. + * + * If the value is `undefined`, then this is an alias for + * `cache.delete(key)`. `undefined` is never stored in the cache. + */ + set(k, v, setOptions = {}) { + const { status = diagnostics_channel_js_1.metrics.hasSubscribers ? {} : undefined } = setOptions; + setOptions.status = status; + if (status) { + status.op = 'set'; + status.key = k; + if (v !== undefined) + status.value = v; + status.cache = this; + } + const result = this.#set(k, v, setOptions); + if (status && diagnostics_channel_js_1.metrics.hasSubscribers) { + diagnostics_channel_js_1.metrics.publish(status); + } + return result; + } + #set(k, v, setOptions, bf) { + const { ttl = this.ttl, start, noDisposeOnSet = this.noDisposeOnSet, sizeCalculation = this.sizeCalculation, status, } = setOptions; + const isBF = this.#isBackgroundFetch(v); + if (v === undefined) { + if (status) + status.set = 'deleted'; + this.delete(k); + return this; + } + let { noUpdateTTL = this.noUpdateTTL } = setOptions; + if (status && !isBF) + status.value = v; + const size = this.#requireSize(k, v, setOptions.size || 0, sizeCalculation, status); + // if the item doesn't fit, don't do anything + // NB: maxEntrySize set to maxSize by default + if (this.maxEntrySize && size > this.maxEntrySize) { + // have to delete, in case something is there already. + this.#delete(k, 'set'); + if (status) { + status.set = 'miss'; + status.maxEntrySizeExceeded = true; + } + return this; + } + let index = this.#size === 0 ? undefined : this.#keyMap.get(k); + if (index === undefined) { + // addition + index = (this.#size === 0 ? this.#tail + : this.#free.length !== 0 ? this.#free.pop() + : this.#size === this.#max ? this.#evict(false) + : this.#size); + this.#keyList[index] = k; + this.#valList[index] = v; + this.#keyMap.set(k, index); + this.#next[this.#tail] = index; + this.#prev[index] = this.#tail; + this.#tail = index; + this.#size++; + this.#addItemSize(index, size, status); + if (status) + status.set = 'add'; + noUpdateTTL = false; + if (this.#hasOnInsert && !isBF) { + this.#onInsert?.(v, k, 'add'); + } + } + else { + // update + // might be updating a background fetch! + this.#moveToTail(index); + const oldVal = this.#valList[index]; + if (v !== oldVal) { + if (!noDisposeOnSet) { + if (this.#isBackgroundFetch(oldVal)) { + if (oldVal !== bf) { + // setting over a background fetch, not merely resolving it. + oldVal.__abortController.abort(new Error('replaced')); + } + const { __staleWhileFetching: s } = oldVal; + if (s !== undefined && s !== v) { + if (this.#hasDispose) { + this.#dispose?.(s, k, 'set'); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([s, k, 'set']); + } + } + } + else { + if (this.#hasDispose) { + this.#dispose?.(oldVal, k, 'set'); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([oldVal, k, 'set']); + } + } + } + this.#removeItemSize(index); + this.#addItemSize(index, size, status); + this.#valList[index] = v; + if (!isBF) { + const oldValue = oldVal && this.#isBackgroundFetch(oldVal) ? + oldVal.__staleWhileFetching + : oldVal; + const setType = oldValue === undefined ? 'add' + : v !== oldValue ? 'replace' + : 'update'; + if (status) { + status.set = setType; + if (oldValue !== undefined) + status.oldValue = oldValue; + } + if (this.#hasOnInsert) { + this.onInsert?.(v, k, setType); + } + } + } + else if (!isBF) { + if (status) { + status.set = 'update'; + } + if (this.#hasOnInsert) { + this.onInsert?.(v, k, 'update'); + } + } + } + if (ttl !== 0 && !this.#ttls) { + this.#initializeTTLTracking(); + } + if (this.#ttls) { + if (!noUpdateTTL) { + this.#setItemTTL(index, ttl, start); + } + if (status) + this.#statusTTL(status, index); + } + if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) { + const dt = this.#disposed; + let task; + while ((task = dt?.shift())) { + this.#disposeAfter?.(...task); + } + } + return this; + } + /** + * Evict the least recently used item, returning its value or + * `undefined` if cache is empty. + */ + pop() { + try { + while (this.#size) { + const val = this.#valList[this.#head]; + this.#evict(true); + if (this.#isBackgroundFetch(val)) { + if (val.__staleWhileFetching) { + return val.__staleWhileFetching; + } + } + else if (val !== undefined) { + return val; + } + } + } + finally { + if (this.#hasDisposeAfter && this.#disposed) { + const dt = this.#disposed; + let task; + while ((task = dt?.shift())) { + this.#disposeAfter?.(...task); + } + } + } + } + #evict(free) { + const head = this.#head; + const k = this.#keyList[head]; + const v = this.#valList[head]; + const isBF = this.#isBackgroundFetch(v); + if (isBF) { + v.__abortController.abort(new Error('evicted')); + } + const oldValue = isBF ? v.__staleWhileFetching : v; + if ((this.#hasDispose || this.#hasDisposeAfter) && + oldValue !== undefined) { + if (this.#hasDispose) { + this.#dispose?.(oldValue, k, 'evict'); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([oldValue, k, 'evict']); + } + } + this.#removeItemSize(head); + if (this.#autopurgeTimers?.[head]) { + clearTimeout(this.#autopurgeTimers[head]); + this.#autopurgeTimers[head] = undefined; + } + // if we aren't about to use the index, then null these out + if (free) { + this.#keyList[head] = undefined; + this.#valList[head] = undefined; + this.#free.push(head); + } + if (this.#size === 1) { + this.#head = this.#tail = 0; + this.#free.length = 0; + } + else { + this.#head = this.#next[head]; + } + this.#keyMap.delete(k); + this.#size--; + return head; + } + /** + * Check if a key is in the cache, without updating the recency of use. + * Will return false if the item is stale, even though it is technically + * in the cache. + * + * Check if a key is in the cache, without updating the recency of + * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set + * to `true` in either the options or the constructor. + * + * Will return `false` if the item is stale, even though it is technically in + * the cache. The difference can be determined (if it matters) by using a + * `status` argument, and inspecting the `has` field. + * + * Will not update item age unless + * {@link LRUCache.OptionsBase.updateAgeOnHas} is set. + */ + has(k, hasOptions = {}) { + const { status = diagnostics_channel_js_1.metrics.hasSubscribers ? {} : undefined } = hasOptions; + hasOptions.status = status; + if (status) { + status.op = 'has'; + status.key = k; + status.cache = this; + } + const result = this.#has(k, hasOptions); + if (diagnostics_channel_js_1.metrics.hasSubscribers) + diagnostics_channel_js_1.metrics.publish(status); + return result; + } + #has(k, hasOptions = {}) { + const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions; + const index = this.#keyMap.get(k); + if (index !== undefined) { + const v = this.#valList[index]; + if (this.#isBackgroundFetch(v) && + v.__staleWhileFetching === undefined) { + return false; + } + if (!this.#isStale(index)) { + if (updateAgeOnHas) { + this.#updateItemAge(index); + } + if (status) { + status.has = 'hit'; + this.#statusTTL(status, index); + } + return true; + } + else if (status) { + status.has = 'stale'; + this.#statusTTL(status, index); + } + } + else if (status) { + status.has = 'miss'; + } + return false; + } + /** + * Like {@link LRUCache#get} but doesn't update recency or delete stale + * items. + * + * Returns `undefined` if the item is stale, unless + * {@link LRUCache.OptionsBase.allowStale} is set. + */ + peek(k, peekOptions = {}) { + const { status = hasSubscribers() ? {} : undefined } = peekOptions; + if (status) { + status.op = 'peek'; + status.key = k; + status.cache = this; + } + peekOptions.status = status; + const result = this.#peek(k, peekOptions); + if (diagnostics_channel_js_1.metrics.hasSubscribers) { + diagnostics_channel_js_1.metrics.publish(status); + } + return result; + } + #peek(k, peekOptions) { + const { status, allowStale = this.allowStale } = peekOptions; + const index = this.#keyMap.get(k); + if (index === undefined || (!allowStale && this.#isStale(index))) { + if (status) + status.peek = index === undefined ? 'miss' : 'stale'; + return undefined; + } + const v = this.#valList[index]; + const val = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (status) { + if (val !== undefined) { + status.peek = 'hit'; + status.value = val; + } + else { + status.peek = 'miss'; + } + } + return val; + } + #backgroundFetch(k, index, options, context) { + const v = index === undefined ? undefined : this.#valList[index]; + if (this.#isBackgroundFetch(v)) { + return v; + } + const ac = new AbortController(); + const { signal } = options; + // when/if our AC signals, then stop listening to theirs. + signal?.addEventListener('abort', () => ac.abort(signal.reason), { + signal: ac.signal, + }); + const fetchOpts = { + signal: ac.signal, + options, + context, + }; + const cb = (v, updateCache = false) => { + const { aborted } = ac.signal; + const ignoreAbort = options.ignoreFetchAbort && v !== undefined; + const proceed = options.ignoreFetchAbort || + !!(options.allowStaleOnFetchAbort && v !== undefined); + if (options.status) { + if (aborted && !updateCache) { + options.status.fetchAborted = true; + options.status.fetchError = ac.signal.reason; + if (ignoreAbort) + options.status.fetchAbortIgnored = true; + } + else { + options.status.fetchResolved = true; + } + } + if (aborted && !ignoreAbort && !updateCache) { + return fetchFail(ac.signal.reason, proceed); + } + // either we didn't abort, and are still here, or we did, and ignored + const bf = p; + // if nothing else has been written there but we're set to update the + // cache and ignore the abort, or if it's still pending on this specific + // background request, then write it to the cache. + const vl = this.#valList[index]; + if (vl === p || (vl === undefined && ignoreAbort && updateCache)) { + if (v === undefined) { + if (bf.__staleWhileFetching !== undefined) { + this.#valList[index] = bf.__staleWhileFetching; + } + else { + this.#delete(k, 'fetch'); + } + } + else { + if (options.status) + options.status.fetchUpdated = true; + this.#set(k, v, fetchOpts.options, bf); + } + } + return v; + }; + const eb = (er) => { + if (options.status) { + options.status.fetchRejected = true; + options.status.fetchError = er; + } + // do not pass go, do not collect $200 + return fetchFail(er, false); + }; + const fetchFail = (er, proceed) => { + const { aborted } = ac.signal; + const allowStaleAborted = aborted && options.allowStaleOnFetchAbort; + const allowStale = allowStaleAborted || options.allowStaleOnFetchRejection; + const noDelete = allowStale || options.noDeleteOnFetchRejection; + const bf = p; + if (this.#valList[index] === p) { + // if we allow stale on fetch rejections, then we need to ensure that + // the stale value is not removed from the cache when the fetch fails. + const del = !noDelete || (!proceed && bf.__staleWhileFetching === undefined); + if (del) { + this.#delete(k, 'fetch'); + } + else if (!allowStaleAborted) { + // still replace the *promise* with the stale value, + // since we are done with the promise at this point. + // leave it untouched if we're still waiting for an + // aborted background fetch that hasn't yet returned. + this.#valList[index] = bf.__staleWhileFetching; + } + } + if (allowStale) { + if (options.status && bf.__staleWhileFetching !== undefined) { + options.status.returnedStale = true; + } + return bf.__staleWhileFetching; + } + else if (bf.__returned === bf) { + throw er; + } + }; + const pcall = (res, rej) => { + const fmp = this.#fetchMethod?.(k, v, fetchOpts); + // ignored, we go until we finish, regardless. + // defer check until we are actually aborting, + // so fetchMethod can override. + ac.signal.addEventListener('abort', () => { + if (!options.ignoreFetchAbort || options.allowStaleOnFetchAbort) { + res(undefined); + // when it eventually resolves, update the cache. + if (options.allowStaleOnFetchAbort) { + res = v => cb(v, true); + } + } + }); + if (fmp && fmp instanceof Promise) { + fmp.then(v => res(v === undefined ? undefined : v), rej); + } + else if (fmp !== undefined) { + res(fmp); + } + }; + if (options.status) + options.status.fetchDispatched = true; + const p = new Promise(pcall).then(cb, eb); + const bf = Object.assign(p, { + __abortController: ac, + __staleWhileFetching: v, + __returned: undefined, + }); + if (index === undefined) { + // internal, don't expose status. + this.#set(k, bf, { ...fetchOpts.options, status: undefined }); + index = this.#keyMap.get(k); + } + else { + // do not call #set, because we do not want to adjust its place + // in the lru queue, as it has not yet been "used". Also, we don't + // need to worry about evicting for size, because a background fetch + // over a stale value is treated as the same size as its stale value. + this.#valList[index] = bf; + } + return bf; + } + #isBackgroundFetch(p) { + if (!this.#hasFetchMethod) + return false; + const b = p; + return (!!b && + b instanceof Promise && + b.hasOwnProperty('__staleWhileFetching') && + b.__abortController instanceof AbortController); + } + fetch(k, fetchOptions = {}) { + const ths = diagnostics_channel_js_1.tracing.hasSubscribers; + const { status = hasSubscribers() ? {} : undefined } = fetchOptions; + fetchOptions.status = status; + if (status && fetchOptions.context) { + status.context = fetchOptions.context; + } + const p = this.#fetch(k, fetchOptions); + if (status && ths) { + status.trace = true; + diagnostics_channel_js_1.tracing.tracePromise(() => p, status).catch(() => { }); + } + return p; + } + async #fetch(k, fetchOptions = {}) { + const { + // get options + allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, + // set options + ttl = this.ttl, noDisposeOnSet = this.noDisposeOnSet, size = 0, sizeCalculation = this.sizeCalculation, noUpdateTTL = this.noUpdateTTL, + // fetch exclusive options + noDeleteOnFetchRejection = this.noDeleteOnFetchRejection, allowStaleOnFetchRejection = this.allowStaleOnFetchRejection, ignoreFetchAbort = this.ignoreFetchAbort, allowStaleOnFetchAbort = this.allowStaleOnFetchAbort, context, forceRefresh = false, status, signal, } = fetchOptions; + if (status) { + status.op = 'fetch'; + status.key = k; + if (forceRefresh) + status.forceRefresh = true; + status.cache = this; + } + if (!this.#hasFetchMethod) { + if (status) + status.fetch = 'get'; + return this.#get(k, { + allowStale, + updateAgeOnGet, + noDeleteOnStaleGet, + status, + }); + } + const options = { + allowStale, + updateAgeOnGet, + noDeleteOnStaleGet, + ttl, + noDisposeOnSet, + size, + sizeCalculation, + noUpdateTTL, + noDeleteOnFetchRejection, + allowStaleOnFetchRejection, + allowStaleOnFetchAbort, + ignoreFetchAbort, + status, + signal, + }; + let index = this.#keyMap.get(k); + if (index === undefined) { + if (status) + status.fetch = 'miss'; + const p = this.#backgroundFetch(k, index, options, context); + return (p.__returned = p); + } + else { + // in cache, maybe already fetching + const v = this.#valList[index]; + if (this.#isBackgroundFetch(v)) { + const stale = allowStale && v.__staleWhileFetching !== undefined; + if (status) { + status.fetch = 'inflight'; + if (stale) + status.returnedStale = true; + } + return stale ? v.__staleWhileFetching : (v.__returned = v); + } + // if we force a refresh, that means do NOT serve the cached value, + // unless we are already in the process of refreshing the cache. + const isStale = this.#isStale(index); + if (!forceRefresh && !isStale) { + if (status) + status.fetch = 'hit'; + this.#moveToTail(index); + if (updateAgeOnGet) { + this.#updateItemAge(index); + } + if (status) + this.#statusTTL(status, index); + return v; + } + // ok, it is stale or a forced refresh, and not already fetching. + // refresh the cache. + const p = this.#backgroundFetch(k, index, options, context); + const hasStale = p.__staleWhileFetching !== undefined; + const staleVal = hasStale && allowStale; + if (status) { + status.fetch = isStale ? 'stale' : 'refresh'; + if (staleVal && isStale) + status.returnedStale = true; + } + return staleVal ? p.__staleWhileFetching : (p.__returned = p); + } + } + forceFetch(k, fetchOptions = {}) { + const ths = diagnostics_channel_js_1.tracing.hasSubscribers; + const { status = hasSubscribers() ? {} : undefined } = fetchOptions; + fetchOptions.status = status; + if (status && fetchOptions.context) { + status.context = fetchOptions.context; + } + const p = this.#forceFetch(k, fetchOptions); + if (status && ths) { + status.trace = true; + diagnostics_channel_js_1.tracing.tracePromise(() => p, status).catch(() => { }); + } + return p; + } + async #forceFetch(k, fetchOptions = {}) { + const v = await this.#fetch(k, fetchOptions); + if (v === undefined) + throw new Error('fetch() returned undefined'); + return v; + } + memo(k, memoOptions = {}) { + const { status = diagnostics_channel_js_1.metrics.hasSubscribers ? {} : undefined } = memoOptions; + memoOptions.status = status; + if (status) { + status.op = 'memo'; + status.key = k; + if (memoOptions.context) { + status.context = memoOptions.context; + } + status.cache = this; + } + const result = this.#memo(k, memoOptions); + if (status) + status.value = result; + if (diagnostics_channel_js_1.metrics.hasSubscribers) + diagnostics_channel_js_1.metrics.publish(status); + return result; + } + #memo(k, memoOptions = {}) { + const memoMethod = this.#memoMethod; + if (!memoMethod) { + throw new Error('no memoMethod provided to constructor'); + } + const { context, status, forceRefresh, ...options } = memoOptions; + if (status && forceRefresh) + status.forceRefresh = true; + const v = this.#get(k, options); + const refresh = forceRefresh || v === undefined; + if (status) { + status.memo = refresh ? 'miss' : 'hit'; + if (!refresh) + status.value = v; + } + if (!refresh) + return v; + const vv = memoMethod(k, v, { + options, + context, + }); + if (status) + status.value = vv; + this.#set(k, vv, options); + return vv; + } + /** + * Return a value from the cache. Will update the recency of the cache + * entry found. + * + * If the key is not found, get() will return `undefined`. + */ + get(k, getOptions = {}) { + const { status = diagnostics_channel_js_1.metrics.hasSubscribers ? {} : undefined } = getOptions; + getOptions.status = status; + if (status) { + status.op = 'get'; + status.key = k; + status.cache = this; + } + const result = this.#get(k, getOptions); + if (status) { + if (result !== undefined) + status.value = result; + if (diagnostics_channel_js_1.metrics.hasSubscribers) + diagnostics_channel_js_1.metrics.publish(status); + } + return result; + } + #get(k, getOptions = {}) { + const { allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, status, } = getOptions; + const index = this.#keyMap.get(k); + if (index === undefined) { + if (status) + status.get = 'miss'; + return undefined; + } + const value = this.#valList[index]; + const fetching = this.#isBackgroundFetch(value); + if (status) + this.#statusTTL(status, index); + if (this.#isStale(index)) { + // delete only if not an in-flight background fetch + if (!fetching) { + if (!noDeleteOnStaleGet) { + this.#delete(k, 'expire'); + } + if (status) + status.get = 'stale'; + if (allowStale) { + if (status) + status.returnedStale = true; + return value; + } + return undefined; + } + if (status) + status.get = 'stale-fetching'; + if (allowStale && value.__staleWhileFetching !== undefined) { + if (status) + status.returnedStale = true; + return value.__staleWhileFetching; + } + return undefined; + } + // not stale + if (status) + status.get = fetching ? 'fetching' : 'hit'; + // if we're currently fetching it, we don't actually have it yet + // it's not stale, which means this isn't a staleWhileRefetching. + // If it's not stale, and fetching, AND has a __staleWhileFetching + // value, then that means the user fetched with {forceRefresh:true}, + // so it's safe to return that value. + this.#moveToTail(index); + if (updateAgeOnGet) { + this.#updateItemAge(index); + } + return fetching ? value.__staleWhileFetching : value; + } + #connect(p, n) { + this.#prev[n] = p; + this.#next[p] = n; + } + #moveToTail(index) { + // if tail already, nothing to do + // if head, move head to next[index] + // else + // move next[prev[index]] to next[index] (head has no prev) + // move prev[next[index]] to prev[index] + // prev[index] = tail + // next[tail] = index + // tail = index + if (index !== this.#tail) { + if (index === this.#head) { + this.#head = this.#next[index]; + } + else { + this.#connect(this.#prev[index], this.#next[index]); + } + this.#connect(this.#tail, index); + this.#tail = index; + } + } + /** + * Deletes a key out of the cache. + * + * Returns true if the key was deleted, false otherwise. + */ + delete(k) { + return this.#delete(k, 'delete'); + } + #delete(k, reason) { + if (diagnostics_channel_js_1.metrics.hasSubscribers) { + diagnostics_channel_js_1.metrics.publish({ + op: 'delete', + delete: reason, + key: k, + cache: this, + }); + } + let deleted = false; + if (this.#size !== 0) { + const index = this.#keyMap.get(k); + if (index !== undefined) { + if (this.#autopurgeTimers?.[index]) { + clearTimeout(this.#autopurgeTimers?.[index]); + this.#autopurgeTimers[index] = undefined; + } + deleted = true; + if (this.#size === 1) { + this.#clear(reason); + } + else { + this.#removeItemSize(index); + const v = this.#valList[index]; + if (this.#isBackgroundFetch(v)) { + v.__abortController.abort(new Error('deleted')); + } + else if (this.#hasDispose || this.#hasDisposeAfter) { + if (this.#hasDispose) { + this.#dispose?.(v, k, reason); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([v, k, reason]); + } + } + this.#keyMap.delete(k); + this.#keyList[index] = undefined; + this.#valList[index] = undefined; + if (index === this.#tail) { + this.#tail = this.#prev[index]; + } + else if (index === this.#head) { + this.#head = this.#next[index]; + } + else { + const pi = this.#prev[index]; + this.#next[pi] = this.#next[index]; + const ni = this.#next[index]; + this.#prev[ni] = this.#prev[index]; + } + this.#size--; + this.#free.push(index); + } + } + } + if (this.#hasDisposeAfter && this.#disposed?.length) { + const dt = this.#disposed; + let task; + while ((task = dt?.shift())) { + this.#disposeAfter?.(...task); + } + } + return deleted; + } + /** + * Clear the cache entirely, throwing away all values. + */ + clear() { + return this.#clear('delete'); + } + #clear(reason) { + for (const index of this.#rindexes({ allowStale: true })) { + const v = this.#valList[index]; + if (this.#isBackgroundFetch(v)) { + v.__abortController.abort(new Error('deleted')); + } + else { + const k = this.#keyList[index]; + if (this.#hasDispose) { + this.#dispose?.(v, k, reason); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([v, k, reason]); + } + } + } + this.#keyMap.clear(); + void this.#valList.fill(undefined); + this.#keyList.fill(undefined); + if (this.#ttls && this.#starts) { + this.#ttls.fill(0); + this.#starts.fill(0); + for (const t of this.#autopurgeTimers ?? []) { + if (t !== undefined) + clearTimeout(t); + } + this.#autopurgeTimers?.fill(undefined); + } + if (this.#sizes) { + this.#sizes.fill(0); + } + this.#head = 0; + this.#tail = 0; + this.#free.length = 0; + this.#calculatedSize = 0; + this.#size = 0; + if (this.#hasDisposeAfter && this.#disposed) { + const dt = this.#disposed; + let task; + while ((task = dt?.shift())) { + this.#disposeAfter?.(...task); + } + } + } +} +exports.LRUCache = LRUCache; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/node/index.js.map b/node_modules/lru-cache/dist/commonjs/node/index.js.map new file mode 100644 index 00000000..c1652fa0 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/node/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module LRUCache\n */\n\nimport { metrics, tracing } from './diagnostics-channel.js'\nimport { defaultPerf } from './perf.js'\nimport type { Perf } from './perf.js'\nexport type { Perf } from './perf.js'\n\nconst hasSubscribers = () =>\n metrics.hasSubscribers || tracing.hasSubscribers\n\nconst warned = new Set()\n\n// either a function or a class\n// oxlint-disable-next-line no-explicit-any\ntype ForC = ((...a: any[]) => any) | { new (...a: any[]): any }\n\n/* c8 ignore start */\nconst PROCESS = (\n typeof process === 'object' && !!process ?\n process\n : {}) as { [k: string]: unknown }\n/* c8 ignore stop */\n\nconst emitWarning = (\n msg: string,\n type: string,\n code: string,\n fn: ForC,\n) => {\n if (typeof PROCESS.emitWarning === 'function') {\n PROCESS.emitWarning(msg, type, code, fn)\n } else {\n //oxlint-disable-next-line no-console\n console.error(`[${code}] ${type}: ${msg}`)\n }\n}\nconst shouldWarn = (code: string) => !warned.has(code)\n\nconst TYPE = Symbol('type')\nexport type PosInt = number & { [TYPE]: 'Positive Integer' }\nexport type Index = number & { [TYPE]: 'LRUCache Index' }\n\nconst isPosInt = (n: unknown): n is PosInt =>\n !!n && n === Math.floor(n as number) && n > 0 && isFinite(n)\n\nexport type UintArray = Uint8Array | Uint16Array | Uint32Array\nexport type NumberArray = UintArray | number[]\n\n// This is a little bit ridiculous, tbh.\n// The maximum array length is 2^32-1 or thereabouts on most JS impls.\n// And well before that point, you're caching the entire world, I mean,\n// that's ~32GB of just integers for the next/prev links, plus whatever\n// else to hold that many keys and values. Just filling the memory with\n// zeroes at init time is brutal when you get that big.\n// But why not be complete?\n// Maybe in the future, these limits will have expanded.\n/* c8 ignore start */\nconst getUintArray = (max: number) =>\n !isPosInt(max) ? null\n : max <= Math.pow(2, 8) ? Uint8Array\n : max <= Math.pow(2, 16) ? Uint16Array\n : max <= Math.pow(2, 32) ? Uint32Array\n : max <= Number.MAX_SAFE_INTEGER ? ZeroArray\n : null\n/* c8 ignore stop */\n\nclass ZeroArray extends Array {\n constructor(size: number) {\n super(size)\n this.fill(0)\n }\n}\nexport type { ZeroArray }\nexport type { Stack }\n\nexport type StackLike = Stack | Index[]\nclass Stack {\n /* c8 ignore start - not sure why this is showing up uncovered?? */\n heap: NumberArray\n /* c8 ignore stop */\n length: number\n // private constructor\n static #constructing: boolean = false\n static create(max: number): StackLike {\n const HeapCls = getUintArray(max)\n if (!HeapCls) return []\n Stack.#constructing = true\n const s = new Stack(max, HeapCls)\n Stack.#constructing = false\n return s\n }\n constructor(max: number, HeapCls: { new (n: number): NumberArray }) {\n /* c8 ignore start */\n if (!Stack.#constructing) {\n throw new TypeError('instantiate Stack using Stack.create(n)')\n }\n /* c8 ignore stop */\n this.heap = new HeapCls(max)\n this.length = 0\n }\n push(n: Index) {\n this.heap[this.length++] = n\n }\n pop(): Index {\n return this.heap[--this.length] as Index\n }\n}\n\n/**\n * Promise representing an in-progress {@link LRUCache#fetch} call\n */\nexport type BackgroundFetch = Promise & {\n __returned: BackgroundFetch | undefined\n __abortController: AbortController\n __staleWhileFetching: V | undefined\n}\n\nexport type DisposeTask = [\n value: V,\n key: K,\n reason: LRUCache.DisposeReason,\n]\n\nexport namespace LRUCache {\n /**\n * An integer greater than 0, reflecting the calculated size of items\n */\n export type Size = number\n\n /**\n * Integer greater than 0, representing some number of milliseconds, or the\n * time at which a TTL started counting from.\n */\n export type Milliseconds = number\n\n /**\n * An integer greater than 0, reflecting a number of items\n */\n export type Count = number\n\n /**\n * The reason why an item was removed from the cache, passed\n * to the {@link Disposer} methods.\n *\n * - `evict`: The item was evicted because it is the least recently used,\n * and the cache is full.\n * - `set`: A new value was set, overwriting the old value being disposed.\n * - `delete`: The item was explicitly deleted, either by calling\n * {@link LRUCache#delete}, {@link LRUCache#clear}, or\n * {@link LRUCache#set} with an undefined value.\n * - `expire`: The item was removed due to exceeding its TTL.\n * - `fetch`: A {@link OptionsBase#fetchMethod} operation returned\n * `undefined` or was aborted, causing the item to be deleted.\n */\n export type DisposeReason =\n | 'evict'\n | 'set'\n | 'delete'\n | 'expire'\n | 'fetch'\n /**\n * A method called upon item removal, passed as the\n * {@link OptionsBase.dispose} and/or\n * {@link OptionsBase.disposeAfter} options.\n */\n export type Disposer = (\n value: V,\n key: K,\n reason: DisposeReason,\n ) => void\n\n /**\n * The reason why an item was added to the cache, passed\n * to the {@link Inserter} methods.\n *\n * - `add`: the item was not found in the cache, and was added\n * - `update`: the item was in the cache, with the same value provided\n * - `replace`: the item was in the cache, and replaced\n */\n export type InsertReason = 'add' | 'update' | 'replace'\n\n /**\n * A method called upon item insertion, passed as the\n * {@link OptionsBase.insert}\n */\n export type Inserter = (\n value: V,\n key: K,\n reason: InsertReason,\n ) => void\n\n /**\n * A function that returns the effective calculated size\n * of an entry in the cache.\n */\n export type SizeCalculator = (value: V, key: K) => Size\n\n /**\n * Options provided to the\n * {@link OptionsBase.fetchMethod} function.\n */\n export interface FetcherOptions {\n signal: AbortSignal\n options: FetcherFetchOptions\n /**\n * Object provided in the {@link FetchOptions.context} option to\n * {@link LRUCache#fetch}\n */\n context: FC\n }\n\n /**\n * Occasionally, it may be useful to track the internal behavior of the\n * cache, particularly for logging, debugging, or for behavior within the\n * `fetchMethod`. To do this, you can pass a `status` object to the\n * {@link LRUCache#fetch}, {@link LRUCache#get}, {@link LRUCache#set},\n * {@link LRUCache#memo}, and {@link LRUCache#has} methods.\n *\n * The `status` option should be a plain JavaScript object. The following\n * fields will be set on it appropriately, depending on the situation.\n *\n * These objects are also the context objects passed to listeners on the\n * `lru-cache:metrics` diagnostic channel, and the `lru-cache` tracing\n * channels, in platforms that support them.\n */\n export interface Status {\n /**\n * The operation being performed\n */\n op?: 'get' | 'set' | 'memo' | 'fetch' | 'delete' | 'has' | 'peek'\n /**\n * The status of a set() operation.\n *\n * - add: the item was not found in the cache, and was added\n * - update: the item was in the cache, with the same value provided\n * - replace: the item was in the cache, and replaced\n * - miss: the item was not added to the cache for some reason\n */\n set?: 'add' | 'update' | 'replace' | 'miss' | 'deleted'\n\n /**\n * The status of a delete() operation.\n */\n delete?: LRUCache.DisposeReason\n\n /**\n * The result of a peek() operation\n *\n * - hit: the item was found and returned\n * - stale: the item is in the cache, but past its ttl and not returned\n * - miss: item not in the cache\n */\n peek?: 'hit' | 'miss' | 'stale'\n\n /**\n * The status of a memo() operation.\n *\n * - 'hit': the item was found in the cache and returned\n * - 'miss': the `memoMethod` function was called\n */\n memo?: 'hit' | 'miss'\n\n /**\n * The `context` option provided to a memo or fetch operation\n *\n * In practice, of course, this will be the same type as the `FC`\n * fetch context param used to instantiate the LRUCache, but the\n * convolutions of threading that through would get quite complicated,\n * and preclude forcing/forbidding the passing of a `context` param\n * where it is/isn't expected, which is more valuable for error\n * prevention.\n */\n context?: unknown\n\n /**\n * the ttl stored for the item, or undefined if ttls are not used.\n */\n ttl?: Milliseconds\n\n /**\n * the start time for the item, or undefined if ttls are not used.\n */\n start?: Milliseconds\n\n /**\n * The timestamp used for TTL calculation\n */\n now?: Milliseconds\n\n /**\n * the remaining ttl for the item, or undefined if ttls are not used.\n */\n remainingTTL?: Milliseconds\n\n /**\n * The calculated size for the item, if sizes are used.\n */\n entrySize?: Size\n\n /**\n * The total calculated size of the cache, if sizes are used.\n */\n totalCalculatedSize?: Size\n\n /**\n * A flag indicating that the item was not stored, due to exceeding the\n * {@link OptionsBase.maxEntrySize}\n */\n maxEntrySizeExceeded?: true\n\n /**\n * The key that was set or retrieved\n */\n key?: K\n\n /**\n * The value that was set\n */\n value?: V\n\n /**\n * The old value, specified in the case of `set:'replace'`\n */\n oldValue?: V\n\n /**\n * The results of a {@link LRUCache#has} operation\n *\n * - hit: the item was found in the cache\n * - stale: the item was found in the cache, but is stale\n * - miss: the item was not found in the cache\n */\n has?: 'hit' | 'stale' | 'miss'\n\n /**\n * The status of a {@link LRUCache#fetch} operation.\n * Note that this can change as the underlying fetch() moves through\n * various states.\n *\n * - inflight: there is another fetch() for this key which is in process\n * - get: there is no {@link OptionsBase.fetchMethod}, so\n * {@link LRUCache#get} was called.\n * - miss: the item is not in cache, and will be fetched.\n * - hit: the item is in the cache, and was resolved immediately.\n * - stale: the item is in the cache, but stale.\n * - refresh: the item is in the cache, and not stale, but\n * {@link FetchOptions.forceRefresh} was specified.\n */\n fetch?: 'get' | 'inflight' | 'miss' | 'hit' | 'stale' | 'refresh'\n\n /**\n * `forceRefresh` option was used for either a fetch or memo operation\n */\n forceRefresh?: boolean\n\n /**\n * The {@link OptionsBase.fetchMethod} was called\n */\n fetchDispatched?: true\n\n /**\n * The cached value was updated after a successful call to\n * {@link OptionsBase.fetchMethod}\n */\n fetchUpdated?: true\n\n /**\n * The reason for a fetch() rejection. Either the error raised by the\n * {@link OptionsBase.fetchMethod}, or the reason for an\n * AbortSignal.\n */\n fetchError?: Error\n\n /**\n * The fetch received an abort signal\n */\n fetchAborted?: true\n\n /**\n * The abort signal received was ignored, and the fetch was allowed to\n * continue in the background.\n */\n fetchAbortIgnored?: true\n\n /**\n * The fetchMethod promise resolved successfully\n */\n fetchResolved?: true\n\n /**\n * The fetchMethod promise was rejected\n */\n fetchRejected?: true\n\n /**\n * The status of a {@link LRUCache#get} operation.\n *\n * - fetching: The item is currently being fetched. If a previous value\n * is present and allowed, that will be returned.\n * - stale: The item is in the cache, and is stale. If it was returned,\n * then the `returnedStale` flag will be set.\n * - stale-fetching: The value is being fetched in the background, but is\n * currently stale. If the stale value was returned, then the\n * `returnedStale` flag will be set.\n * - hit: the item is in the cache\n * - miss: the item is not in the cache\n */\n get?: 'stale' | 'hit' | 'miss' | 'fetching' | 'stale-fetching'\n\n /**\n * A fetch or get operation returned a stale value.\n */\n returnedStale?: true\n\n /**\n * A tracingChannel trace was started for this operation\n */\n trace?: boolean\n\n /**\n * A reference to the cache instance associated with this operation\n */\n cache?: LRUCache\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#fetch}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link OptionsBase.noDeleteOnFetchRejection},\n * {@link OptionsBase.allowStaleOnFetchRejection},\n * {@link FetchOptions.forceRefresh}, and\n * {@link FetcherOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.fetchMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the fetchMethod is called.\n */\n export interface FetcherFetchOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n status?: Status\n size?: Size\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#fetch} method.\n */\n export interface FetchOptions extends FetcherFetchOptions<\n K,\n V,\n FC\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.fetchMethod} as\n * the {@link FetcherOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n signal?: AbortSignal\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface FetchOptionsWithContext extends FetchOptions<\n K,\n V,\n FC\n > {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is\n * `undefined` or `void`\n */\n export interface FetchOptionsNoContext<\n K,\n V,\n FC extends undefined | void = undefined,\n > extends FetchOptions {\n context?: FC\n }\n\n export interface MemoOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.memoMethod} as\n * the {@link MemoizerOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface MemoOptionsWithContext extends MemoOptions<\n K,\n V,\n FC\n > {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is\n * `undefined` or `void`\n */\n export interface MemoOptionsNoContext<\n K,\n V,\n FC extends undefined | void = undefined,\n > extends MemoOptions {\n context?: FC\n }\n\n /**\n * Options provided to the\n * {@link OptionsBase.memoMethod} function.\n */\n export interface MemoizerOptions {\n options: MemoizerMemoOptions\n /**\n * Object provided in the {@link MemoOptions.context} option to\n * {@link LRUCache#memo}\n */\n context: FC\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#memo}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link MemoOptions.forceRefresh}, and\n * {@link MemoOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.memoMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the memoMethod is called.\n */\n export interface MemoizerMemoOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n > {\n status?: Status\n size?: Size\n start?: Milliseconds\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#has} method.\n */\n export interface HasOptions extends Pick<\n OptionsBase,\n 'updateAgeOnHas'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#get} method.\n */\n export interface GetOptions extends Pick<\n OptionsBase,\n 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#peek} method.\n */\n export interface PeekOptions extends Pick<\n OptionsBase,\n 'allowStale'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#set} method.\n */\n export interface SetOptions extends Pick<\n OptionsBase,\n 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'\n > {\n /**\n * If size tracking is enabled, then setting an explicit size\n * in the {@link LRUCache#set} call will prevent calling the\n * {@link OptionsBase.sizeCalculation} function.\n */\n size?: Size\n /**\n * If TTL tracking is enabled, then setting an explicit start\n * time in the {@link LRUCache#set} call will override the\n * default time from `performance.now()` or `Date.now()`.\n *\n * Note that it must be a valid value for whichever time-tracking\n * method is in use.\n */\n start?: Milliseconds\n status?: Status\n }\n\n /**\n * The type signature for the {@link OptionsBase.fetchMethod} option.\n */\n export type Fetcher = (\n key: K,\n staleValue: V | undefined,\n options: FetcherOptions,\n ) => Promise | V | undefined | void\n\n /**\n * the type signature for the {@link OptionsBase.memoMethod} option.\n */\n export type Memoizer = (\n key: K,\n staleValue: V | undefined,\n options: MemoizerOptions,\n ) => V\n\n /**\n * Options which may be passed to the {@link LRUCache} constructor.\n *\n * Most of these may be overridden in the various options that use\n * them.\n *\n * Despite all being technically optional, the constructor requires that\n * a cache is at minimum limited by one or more of {@link OptionsBase.max},\n * {@link OptionsBase.ttl}, or {@link OptionsBase.maxSize}.\n *\n * If {@link OptionsBase.ttl} is used alone, then it is strongly advised\n * (and in fact required by the type definitions here) that the cache\n * also set {@link OptionsBase.ttlAutopurge}, to prevent potentially\n * unbounded storage.\n *\n * All options are also available on the {@link LRUCache} instance, making\n * it safe to pass an LRUCache instance as the options argumemnt to\n * make another empty cache of the same type.\n *\n * Some options are marked as read-only, because changing them after\n * instantiation is not safe. Changing any of the other options will of\n * course only have an effect on subsequent method calls.\n */\n export interface OptionsBase {\n /**\n * The maximum number of items to store in the cache before evicting\n * old entries. This is read-only on the {@link LRUCache} instance,\n * and may not be overridden.\n *\n * If set, then storage space will be pre-allocated at construction\n * time, and the cache will perform significantly faster.\n *\n * Note that significantly fewer items may be stored, if\n * {@link OptionsBase.maxSize} and/or {@link OptionsBase.ttl} are also\n * set.\n *\n * **It is strongly recommended to set a `max` to prevent unbounded growth\n * of the cache.**\n */\n max?: Count\n\n /**\n * Max time in milliseconds for items to live in cache before they are\n * considered stale. Note that stale items are NOT preemptively removed by\n * default, and MAY live in the cache, contributing to its LRU max, long\n * after they have expired, unless {@link OptionsBase.ttlAutopurge} is\n * set.\n *\n * If set to `0` (the default value), then that means \"do not track\n * TTL\", not \"expire immediately\".\n *\n * Also, as this cache is optimized for LRU/MRU operations, some of\n * the staleness/TTL checks will reduce performance, as they will incur\n * overhead by deleting items.\n *\n * This is not primarily a TTL cache, and does not make strong TTL\n * guarantees. There is no pre-emptive pruning of expired items, but you\n * _may_ set a TTL on the cache, and it will treat expired items as missing\n * when they are fetched, and delete them.\n *\n * Optional, but must be a non-negative integer in ms if specified.\n *\n * This may be overridden by passing an options object to `cache.set()`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if ttl tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * If ttl tracking is enabled, and `max` and `maxSize` are not set,\n * and `ttlAutopurge` is not set, then a warning will be emitted\n * cautioning about the potential for unbounded memory consumption.\n * (The TypeScript definitions will also discourage this.)\n */\n ttl?: Milliseconds\n\n /**\n * Minimum amount of time in ms in which to check for staleness.\n * Defaults to 1, which means that the current time is checked\n * at most once per millisecond.\n *\n * Set to 0 to check the current time every time staleness is tested.\n * (This reduces performance, and is theoretically unnecessary.)\n *\n * Setting this to a higher value will improve performance somewhat\n * while using ttl tracking, albeit at the expense of keeping stale\n * items around a bit longer than their TTLs would indicate.\n *\n * @default 1\n */\n ttlResolution?: Milliseconds\n\n /**\n * Preemptively remove stale items from the cache.\n *\n * Note that this may *significantly* degrade performance, especially if\n * the cache is storing a large number of items. It is almost always best\n * to just leave the stale items in the cache, and let them fall out as new\n * items are added.\n *\n * Note that this means that {@link OptionsBase.allowStale} is a bit\n * pointless, as stale items will be deleted almost as soon as they\n * expire.\n *\n * Use with caution!\n */\n ttlAutopurge?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever it is retrieved from cache with\n * {@link LRUCache#get}, causing it to not expire. (It can still fall out\n * of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n */\n updateAgeOnGet?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever its presence in the cache is\n * checked with {@link LRUCache#has}, causing it to not expire. (It can\n * still fall out of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n */\n updateAgeOnHas?: boolean\n\n /**\n * Allow {@link LRUCache#get} and {@link LRUCache#fetch} calls to return\n * stale data, if available.\n *\n * By default, if you set `ttl`, stale items will only be deleted from the\n * cache when you `get(key)`. That is, it's not preemptively pruning items,\n * unless {@link OptionsBase.ttlAutopurge} is set.\n *\n * If you set `allowStale:true`, it'll return the stale value *as well as*\n * deleting it. If you don't set this, then it'll return `undefined` when\n * you try to get a stale entry.\n *\n * Note that when a stale entry is fetched, _even if it is returned due to\n * `allowStale` being set_, it is removed from the cache immediately. You\n * can suppress this behavior by setting\n * {@link OptionsBase.noDeleteOnStaleGet}, either in the constructor, or in\n * the options provided to {@link LRUCache#get}.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n * The `cache.has()` method will always return `false` for stale items.\n *\n * Only relevant if a ttl is set.\n */\n allowStale?: boolean\n\n /**\n * Function that is called on items when they are dropped from the\n * cache, as `dispose(value, key, reason)`.\n *\n * This can be handy if you want to close file descriptors or do\n * other cleanup tasks when items are no longer stored in the cache.\n *\n * **NOTE**: It is called _before_ the item has been fully removed\n * from the cache, so if you want to put it right back in, you need\n * to wait until the next tick. If you try to add it back in during\n * the `dispose()` function call, it will break things in subtle and\n * weird ways.\n *\n * Unlike several other options, this may _not_ be overridden by\n * passing an option to `set()`, for performance reasons.\n *\n * The `reason` will be one of the following strings, corresponding\n * to the reason for the item's deletion:\n *\n * - `evict` Item was evicted to make space for a new addition\n * - `set` Item was overwritten by a new value\n * - `expire` Item expired its TTL\n * - `fetch` Item was deleted due to a failed or aborted fetch, or a\n * fetchMethod returning `undefined.\n * - `delete` Item was removed by explicit `cache.delete(key)`,\n * `cache.clear()`, or `cache.set(key, undefined)`.\n */\n dispose?: Disposer\n\n /**\n * Function that is called when new items are inserted into the cache,\n * as `onInsert(value, key, reason)`.\n *\n * This can be useful if you need to perform actions when an item is\n * added, such as logging or tracking insertions.\n *\n * Unlike some other options, this may _not_ be overridden by passing\n * an option to `set()`, for performance and consistency reasons.\n */\n onInsert?: Inserter\n\n /**\n * The same as {@link OptionsBase.dispose}, but called *after* the entry\n * is completely removed and the cache is once again in a clean state.\n *\n * It is safe to add an item right back into the cache at this point.\n * However, note that it is *very* easy to inadvertently create infinite\n * recursion this way.\n */\n disposeAfter?: Disposer\n\n /**\n * Set to true to suppress calling the\n * {@link OptionsBase.dispose} function if the entry key is\n * still accessible within the cache.\n *\n * This may be overridden by passing an options object to\n * {@link LRUCache#set}.\n *\n * Only relevant if `dispose` or `disposeAfter` are set.\n */\n noDisposeOnSet?: boolean\n\n /**\n * Boolean flag to tell the cache to not update the TTL when setting a new\n * value for an existing key (ie, when updating a value rather than\n * inserting a new value). Note that the TTL value is _always_ set (if\n * provided) when adding a new entry into the cache.\n *\n * Has no effect if a {@link OptionsBase.ttl} is not set.\n *\n * May be passed as an option to {@link LRUCache#set}.\n */\n noUpdateTTL?: boolean\n\n /**\n * Set to a positive integer to track the sizes of items added to the\n * cache, and automatically evict items in order to stay below this size.\n * Note that this may result in fewer than `max` items being stored.\n *\n * Attempting to add an item to the cache whose calculated size is greater\n * that this amount will be a no-op. The item will not be cached, and no\n * other items will be evicted.\n *\n * Optional, must be a positive integer if provided.\n *\n * Sets `maxEntrySize` to the same value, unless a different value is\n * provided for `maxEntrySize`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if size tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * Note also that size tracking can negatively impact performance,\n * though for most cases, only minimally.\n */\n maxSize?: Size\n\n /**\n * The effective size for background fetch promises.\n *\n * This has no effect unless `maxSize` and `sizeCalculation` are used,\n * and a {@link LRUCache.OptionsBase.fetchMethod} is provided to\n * support {@link LRUCache#fetch}.\n *\n * If a stale value is present in the cache, then the effective size of\n * the background fetch is the size of the stale item it will eventually\n * replace. If not, then this value is used as its effective size.\n *\n * @default 1\n */\n backgroundFetchSize?: number\n\n /**\n * The maximum allowed size for any single item in the cache.\n *\n * If a larger item is passed to {@link LRUCache#set} or returned by a\n * {@link OptionsBase.fetchMethod} or {@link OptionsBase.memoMethod}, then\n * it will not be stored in the cache.\n *\n * Attempting to add an item whose calculated size is greater than\n * this amount will not cache the item or evict any old items, but\n * WILL delete an existing value if one is already present.\n *\n * Optional, must be a positive integer if provided. Defaults to\n * the value of `maxSize` if provided.\n */\n maxEntrySize?: Size\n\n /**\n * A function that returns a number indicating the item's size.\n *\n * Requires {@link OptionsBase.maxSize} to be set.\n *\n * If not provided, and {@link OptionsBase.maxSize} or\n * {@link OptionsBase.maxEntrySize} are set, then all\n * {@link LRUCache#set} calls **must** provide an explicit\n * {@link SetOptions.size} or sizeCalculation param.\n */\n sizeCalculation?: SizeCalculator\n\n /**\n * Method that provides the implementation for {@link LRUCache#fetch}\n *\n * ```ts\n * fetchMethod(key, staleValue, { signal, options, context })\n * ```\n *\n * If `fetchMethod` is not provided, then `cache.fetch(key)` is equivalent\n * to `Promise.resolve(cache.get(key))`.\n *\n * If at any time, `signal.aborted` is set to `true`, or if the\n * `signal.onabort` method is called, or if it emits an `'abort'` event\n * which you can listen to with `addEventListener`, then that means that\n * the fetch should be abandoned. This may be passed along to async\n * functions aware of AbortController/AbortSignal behavior.\n *\n * The `fetchMethod` should **only** return `undefined` or a Promise\n * resolving to `undefined` if the AbortController signaled an `abort`\n * event. In all other cases, it should return or resolve to a value\n * suitable for adding to the cache.\n *\n * The `options` object is a union of the options that may be provided to\n * `set()` and `get()`. If they are modified, then that will result in\n * modifying the settings to `cache.set()` when the value is resolved, and\n * in the case of\n * {@link OptionsBase.noDeleteOnFetchRejection} and\n * {@link OptionsBase.allowStaleOnFetchRejection}, the handling of\n * `fetchMethod` failures.\n *\n * For example, a DNS cache may update the TTL based on the value returned\n * from a remote DNS server by changing `options.ttl` in the `fetchMethod`.\n */\n fetchMethod?: Fetcher\n\n /**\n * Method that provides the implementation for {@link LRUCache#memo}\n */\n memoMethod?: Memoizer\n\n /**\n * Set to true to suppress the deletion of stale data when a\n * {@link OptionsBase.fetchMethod} returns a rejected promise.\n */\n noDeleteOnFetchRejection?: boolean\n\n /**\n * Do not delete stale items when they are retrieved with\n * {@link LRUCache#get}.\n *\n * Note that the `get` return value will still be `undefined`\n * unless {@link OptionsBase.allowStale} is true.\n *\n * When using time-expiring entries with `ttl`, by default stale\n * items will be removed from the cache when the key is accessed\n * with `cache.get()`.\n *\n * Setting this option will cause stale items to remain in the cache, until\n * they are explicitly deleted with `cache.delete(key)`, or retrieved with\n * `noDeleteOnStaleGet` set to `false`.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n *\n * Only relevant if a ttl is used.\n */\n noDeleteOnStaleGet?: boolean\n\n /**\n * Set to true to allow returning stale data when a\n * {@link OptionsBase.fetchMethod} throws an error or returns a rejected\n * promise.\n *\n * This differs from using {@link OptionsBase.allowStale} in that stale\n * data will ONLY be returned in the case that the {@link LRUCache#fetch}\n * fails, not any other times.\n *\n * If a `fetchMethod` fails, and there is no stale value available, the\n * `fetch()` will resolve to `undefined`. Ie, all `fetchMethod` errors are\n * suppressed.\n *\n * Implies `noDeleteOnFetchRejection`.\n *\n * This may be set in calls to `fetch()`, or defaulted on the constructor,\n * or overridden by modifying the options object in the `fetchMethod`.\n */\n allowStaleOnFetchRejection?: boolean\n\n /**\n * Set to true to return a stale value from the cache when the\n * `AbortSignal` passed to the {@link OptionsBase.fetchMethod} dispatches\n * an `'abort'` event, whether user-triggered, or due to internal cache\n * behavior.\n *\n * Unless {@link OptionsBase.ignoreFetchAbort} is also set, the underlying\n * {@link OptionsBase.fetchMethod} will still be considered canceled, and\n * any value it returns will be ignored and not cached.\n *\n * Caveat: since fetches are aborted when a new value is explicitly\n * set in the cache, this can lead to fetch returning a stale value,\n * since that was the fallback value _at the moment the `fetch()` was\n * initiated_, even though the new updated value is now present in\n * the cache.\n *\n * For example:\n *\n * ```ts\n * const cache = new LRUCache({\n * ttl: 100,\n * fetchMethod: async (url, oldValue, { signal }) => {\n * const res = await fetch(url, { signal })\n * return await res.json()\n * }\n * })\n * cache.set('https://example.com/', { some: 'data' })\n * // 100ms go by...\n * const result = cache.fetch('https://example.com/')\n * cache.set('https://example.com/', { other: 'thing' })\n * console.log(await result) // { some: 'data' }\n * console.log(cache.get('https://example.com/')) // { other: 'thing' }\n * ```\n */\n allowStaleOnFetchAbort?: boolean\n\n /**\n * Set to true to ignore the `abort` event emitted by the `AbortSignal`\n * object passed to {@link OptionsBase.fetchMethod}, and still cache the\n * resulting resolution value, as long as it is not `undefined`.\n *\n * When used on its own, this means aborted {@link LRUCache#fetch} calls\n * are not immediately resolved or rejected when they are aborted, and\n * instead take the full time to await.\n *\n * When used with {@link OptionsBase.allowStaleOnFetchAbort}, aborted\n * {@link LRUCache#fetch} calls will resolve immediately to their stale\n * cached value or `undefined`, and will continue to process and eventually\n * update the cache when they resolve, as long as the resulting value is\n * not `undefined`, thus supporting a \"return stale on timeout while\n * refreshing\" mechanism by passing `AbortSignal.timeout(n)` as the signal.\n *\n * For example:\n *\n * ```ts\n * const c = new LRUCache({\n * ttl: 100,\n * ignoreFetchAbort: true,\n * allowStaleOnFetchAbort: true,\n * fetchMethod: async (key, oldValue, { signal }) => {\n * // note: do NOT pass the signal to fetch()!\n * // let's say this fetch can take a long time.\n * const res = await fetch(`https://slow-backend-server/${key}`)\n * return await res.json()\n * },\n * })\n *\n * // this will return the stale value after 100ms, while still\n * // updating in the background for next time.\n * const val = await c.fetch('key', { signal: AbortSignal.timeout(100) })\n * ```\n *\n * **Note**: regardless of this setting, an `abort` event _is still\n * emitted on the `AbortSignal` object_, so may result in invalid results\n * when passed to other underlying APIs that use AbortSignals.\n *\n * This may be overridden in the {@link OptionsBase.fetchMethod} or the\n * call to {@link LRUCache#fetch}.\n */\n ignoreFetchAbort?: boolean\n\n /**\n * In some cases, you may want to swap out the performance/Date object\n * used for TTL tracking. This should almost certainly NOT be done in\n * production environments!\n *\n * This value defaults to `global.performance` if it has a `now()` method,\n * or the `global.Date` object otherwise.\n */\n perf?: Perf\n }\n\n export interface OptionsMaxLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n max: Count\n }\n export interface OptionsTTLLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n ttl: Milliseconds\n ttlAutopurge: boolean\n }\n export interface OptionsSizeLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n maxSize: Size\n }\n\n /**\n * The valid safe options for the {@link LRUCache} constructor\n */\n export type Options =\n | OptionsMaxLimit\n | OptionsSizeLimit\n | OptionsTTLLimit\n\n /**\n * Entry objects used by {@link LRUCache#load} and {@link LRUCache#dump},\n * and returned by {@link LRUCache#info}.\n */\n export interface Entry {\n value: V\n ttl?: Milliseconds\n size?: Size\n start?: Milliseconds\n }\n}\n\n/**\n * Default export, the thing you're using this module to get.\n *\n * The `K` and `V` types define the key and value types, respectively. The\n * optional `FC` type defines the type of the `context` object passed to\n * `cache.fetch()` and `cache.memo()`.\n *\n * Keys and values **must not** be `null` or `undefined`.\n *\n * All properties from the options object (with the exception of `max`,\n * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are\n * added as normal public members. (The listed options are read-only getters.)\n *\n * Changing any of these will alter the defaults for subsequent method calls.\n */\nexport class LRUCache {\n // options that cannot be changed without disaster\n readonly #max: LRUCache.Count\n readonly #maxSize: LRUCache.Size\n readonly #dispose?: LRUCache.Disposer\n readonly #onInsert?: LRUCache.Inserter\n readonly #disposeAfter?: LRUCache.Disposer\n readonly #fetchMethod?: LRUCache.Fetcher\n readonly #memoMethod?: LRUCache.Memoizer\n readonly #perf: Perf\n\n /**\n * {@link LRUCache.OptionsBase.perf}\n */\n get perf() {\n return this.#perf\n }\n\n /**\n * {@link LRUCache.OptionsBase.ttl}\n */\n ttl: LRUCache.Milliseconds\n\n /**\n * {@link LRUCache.OptionsBase.ttlResolution}\n */\n ttlResolution: LRUCache.Milliseconds\n /**\n * {@link LRUCache.OptionsBase.ttlAutopurge}\n */\n ttlAutopurge: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnGet}\n */\n updateAgeOnGet: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnHas}\n */\n updateAgeOnHas: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStale}\n */\n allowStale: boolean\n\n /**\n * {@link LRUCache.OptionsBase.noDisposeOnSet}\n */\n noDisposeOnSet: boolean\n /**\n * {@link LRUCache.OptionsBase.noUpdateTTL}\n */\n noUpdateTTL: boolean\n /**\n * {@link LRUCache.OptionsBase.maxEntrySize}\n */\n maxEntrySize: LRUCache.Size\n /**\n * {@link LRUCache.OptionsBase.sizeCalculation}\n */\n sizeCalculation?: LRUCache.SizeCalculator\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection}\n */\n noDeleteOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnStaleGet}\n */\n noDeleteOnStaleGet: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}\n */\n allowStaleOnFetchAbort: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection}\n */\n allowStaleOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.ignoreFetchAbort}\n */\n ignoreFetchAbort: boolean\n\n /** {@link LRUCache.OptionsBase.backgroundFetchSize} */\n backgroundFetchSize: number\n\n // computed properties\n #size: LRUCache.Count\n #calculatedSize: LRUCache.Size\n #keyMap: Map\n #keyList: (K | undefined)[]\n #valList: (V | BackgroundFetch | undefined)[]\n #next: NumberArray\n #prev: NumberArray\n #head: Index\n #tail: Index\n #free: StackLike\n #disposed?: DisposeTask[]\n #sizes?: ZeroArray\n #starts?: ZeroArray\n #ttls?: ZeroArray\n #autopurgeTimers?: (undefined | ReturnType)[]\n\n #hasDispose: boolean\n #hasFetchMethod: boolean\n #hasDisposeAfter: boolean\n #hasOnInsert: boolean\n\n /**\n * Do not call this method unless you need to inspect the\n * inner workings of the cache. If anything returned by this\n * object is modified in any way, strange breakage may occur.\n *\n * These fields are private for a reason!\n *\n * @internal\n */\n static unsafeExposeInternals<\n K extends {},\n V extends {},\n FC extends unknown = unknown,\n >(c: LRUCache) {\n return {\n // properties\n starts: c.#starts,\n ttls: c.#ttls,\n autopurgeTimers: c.#autopurgeTimers,\n sizes: c.#sizes,\n keyMap: c.#keyMap as Map,\n keyList: c.#keyList,\n valList: c.#valList,\n next: c.#next,\n prev: c.#prev,\n get head() {\n return c.#head\n },\n get tail() {\n return c.#tail\n },\n free: c.#free,\n // methods\n isBackgroundFetch: (p: unknown) => c.#isBackgroundFetch(p),\n backgroundFetch: (\n k: K,\n index: number | undefined,\n options: LRUCache.FetchOptions,\n context: unknown,\n ): BackgroundFetch =>\n c.#backgroundFetch(\n k,\n index as Index | undefined,\n options,\n context as FC,\n ),\n moveToTail: (index: number): void => c.#moveToTail(index as Index),\n indexes: (options?: { allowStale: boolean }) => c.#indexes(options),\n rindexes: (options?: { allowStale: boolean }) =>\n c.#rindexes(options),\n isStale: (index: number | undefined) => c.#isStale(index as Index),\n }\n }\n\n // Protected read-only members\n\n /**\n * {@link LRUCache.OptionsBase.max} (read-only)\n */\n get max(): LRUCache.Count {\n return this.#max\n }\n /**\n * {@link LRUCache.OptionsBase.maxSize} (read-only)\n */\n get maxSize(): LRUCache.Count {\n return this.#maxSize\n }\n /**\n * The total computed size of items in the cache (read-only)\n */\n get calculatedSize(): LRUCache.Size {\n return this.#calculatedSize\n }\n /**\n * The number of items stored in the cache (read-only)\n */\n get size(): LRUCache.Count {\n return this.#size\n }\n /**\n * {@link LRUCache.OptionsBase.fetchMethod} (read-only)\n */\n get fetchMethod(): LRUCache.Fetcher | undefined {\n return this.#fetchMethod\n }\n get memoMethod(): LRUCache.Memoizer | undefined {\n return this.#memoMethod\n }\n /**\n * {@link LRUCache.OptionsBase.dispose} (read-only)\n */\n get dispose() {\n return this.#dispose\n }\n /**\n * {@link LRUCache.OptionsBase.onInsert} (read-only)\n */\n get onInsert() {\n return this.#onInsert\n }\n /**\n * {@link LRUCache.OptionsBase.disposeAfter} (read-only)\n */\n get disposeAfter() {\n return this.#disposeAfter\n }\n\n constructor(options: LRUCache.Options | LRUCache) {\n const {\n max = 0,\n ttl,\n ttlResolution = 1,\n ttlAutopurge,\n updateAgeOnGet,\n updateAgeOnHas,\n allowStale,\n dispose,\n onInsert,\n disposeAfter,\n noDisposeOnSet,\n noUpdateTTL,\n maxSize = 0,\n maxEntrySize = 0,\n sizeCalculation,\n fetchMethod,\n memoMethod,\n noDeleteOnFetchRejection,\n noDeleteOnStaleGet,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n backgroundFetchSize = 1,\n perf,\n } = options\n\n this.backgroundFetchSize = backgroundFetchSize\n\n if (perf !== undefined) {\n if (typeof perf?.now !== 'function') {\n throw new TypeError(\n 'perf option must have a now() method if specified',\n )\n }\n }\n\n this.#perf = perf ?? defaultPerf\n\n if (max !== 0 && !isPosInt(max)) {\n throw new TypeError('max option must be a nonnegative integer')\n }\n\n const UintArray = max ? getUintArray(max) : Array\n if (!UintArray) {\n throw new Error('invalid max value: ' + max)\n }\n\n this.#max = max\n this.#maxSize = maxSize\n this.maxEntrySize = maxEntrySize || this.#maxSize\n this.sizeCalculation = sizeCalculation\n if (this.sizeCalculation) {\n if (!this.#maxSize && !this.maxEntrySize) {\n throw new TypeError(\n 'cannot set sizeCalculation without setting maxSize or maxEntrySize',\n )\n }\n if (typeof this.sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation set to non-function')\n }\n }\n\n if (memoMethod !== undefined && typeof memoMethod !== 'function') {\n throw new TypeError('memoMethod must be a function if defined')\n }\n this.#memoMethod = memoMethod\n\n if (fetchMethod !== undefined && typeof fetchMethod !== 'function') {\n throw new TypeError('fetchMethod must be a function if specified')\n }\n this.#fetchMethod = fetchMethod\n this.#hasFetchMethod = !!fetchMethod\n\n this.#keyMap = new Map()\n this.#keyList = Array.from({ length: max }).fill(undefined) as (\n | K\n | undefined\n )[]\n this.#valList = Array.from({ length: max }).fill(undefined) as (\n | V\n | undefined\n )[]\n this.#next = new UintArray(max)\n this.#prev = new UintArray(max)\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free = Stack.create(max)\n this.#size = 0\n this.#calculatedSize = 0\n\n if (typeof dispose === 'function') {\n this.#dispose = dispose\n }\n if (typeof onInsert === 'function') {\n this.#onInsert = onInsert\n }\n if (typeof disposeAfter === 'function') {\n this.#disposeAfter = disposeAfter\n this.#disposed = []\n } else {\n this.#disposeAfter = undefined\n this.#disposed = undefined\n }\n this.#hasDispose = !!this.#dispose\n this.#hasOnInsert = !!this.#onInsert\n this.#hasDisposeAfter = !!this.#disposeAfter\n\n this.noDisposeOnSet = !!noDisposeOnSet\n this.noUpdateTTL = !!noUpdateTTL\n this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection\n this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection\n this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort\n this.ignoreFetchAbort = !!ignoreFetchAbort\n\n // NB: maxEntrySize is set to maxSize if it's set\n if (this.maxEntrySize !== 0) {\n if (this.#maxSize !== 0) {\n if (!isPosInt(this.#maxSize)) {\n throw new TypeError(\n 'maxSize must be a positive integer if specified',\n )\n }\n }\n if (!isPosInt(this.maxEntrySize)) {\n throw new TypeError(\n 'maxEntrySize must be a positive integer if specified',\n )\n }\n this.#initializeSizeTracking()\n }\n\n this.allowStale = !!allowStale\n this.noDeleteOnStaleGet = !!noDeleteOnStaleGet\n this.updateAgeOnGet = !!updateAgeOnGet\n this.updateAgeOnHas = !!updateAgeOnHas\n this.ttlResolution =\n isPosInt(ttlResolution) || ttlResolution === 0 ? ttlResolution : 1\n this.ttlAutopurge = !!ttlAutopurge\n this.ttl = ttl || 0\n if (this.ttl) {\n if (!isPosInt(this.ttl)) {\n throw new TypeError('ttl must be a positive integer if specified')\n }\n this.#initializeTTLTracking()\n }\n\n // do not allow completely unbounded caches\n if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) {\n throw new TypeError(\n 'At least one of max, maxSize, or ttl is required',\n )\n }\n if (!this.ttlAutopurge && !this.#max && !this.#maxSize) {\n const code = 'LRU_CACHE_UNBOUNDED'\n if (shouldWarn(code)) {\n warned.add(code)\n const msg =\n 'TTL caching without ttlAutopurge, max, or maxSize can ' +\n 'result in unbounded memory consumption.'\n emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache)\n }\n }\n }\n\n /**\n * Return the number of ms left in the item's TTL. If item is not in cache,\n * returns `0`. Returns `Infinity` if item is in cache without a defined TTL.\n */\n getRemainingTTL(key: K) {\n return this.#keyMap.has(key) ? Infinity : 0\n }\n\n #initializeTTLTracking() {\n const ttls = new ZeroArray(this.#max)\n const starts = new ZeroArray(this.#max)\n this.#ttls = ttls\n this.#starts = starts\n const purgeTimers =\n this.ttlAutopurge ?\n Array.from>({\n length: this.#max,\n })\n : undefined\n this.#autopurgeTimers = purgeTimers\n\n this.#setItemTTL = (index, ttl, start = this.#perf.now()) => {\n starts[index] = ttl !== 0 ? start : 0\n ttls[index] = ttl\n setPurgetTimer(index, ttl)\n }\n\n this.#updateItemAge = index => {\n starts[index] = ttls[index] !== 0 ? this.#perf.now() : 0\n setPurgetTimer(index, ttls[index])\n }\n\n // clear out the purge timer if we're setting TTL to 0, and\n // previously had a ttl purge timer running, so it doesn't\n // fire unnecessarily. Don't need to do this if we're not doing\n // autopurge.\n const setPurgetTimer =\n !this.ttlAutopurge ?\n () => {}\n : (index: Index, ttl?: number) => {\n if (purgeTimers?.[index]) {\n clearTimeout(purgeTimers[index])\n purgeTimers[index] = undefined\n }\n if (ttl && ttl !== 0 && purgeTimers) {\n const t = setTimeout(() => {\n if (this.#isStale(index)) {\n this.#delete(this.#keyList[index] as K, 'expire')\n }\n }, ttl + 1)\n // unref() not supported on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n purgeTimers[index] = t\n }\n }\n\n this.#statusTTL = (status, index) => {\n if (ttls[index]) {\n const ttl = ttls[index]\n const start = starts[index]\n /* c8 ignore start */\n if (!ttl || !start) {\n return\n }\n /* c8 ignore stop */\n status.ttl = ttl\n status.start = start\n status.now = cachedNow || getNow()\n const age = status.now - start\n status.remainingTTL = ttl - age\n }\n }\n\n // debounce calls to perf.now() to 1s so we're not hitting\n // that costly call repeatedly.\n let cachedNow = 0\n const getNow = () => {\n const n = this.#perf.now()\n if (this.ttlResolution > 0) {\n cachedNow = n\n const t = setTimeout(() => (cachedNow = 0), this.ttlResolution)\n // not available on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n }\n return n\n }\n\n this.getRemainingTTL = key => {\n const index = this.#keyMap.get(key)\n if (index === undefined) {\n return 0\n }\n const ttl = ttls[index]\n const start = starts[index]\n if (!ttl || !start) {\n return Infinity\n }\n const age = (cachedNow || getNow()) - start\n return ttl - age\n }\n\n this.#isStale = index => {\n const s = starts[index]\n const t = ttls[index]\n return !!t && !!s && (cachedNow || getNow()) - s > t\n }\n }\n\n // conditionally set private methods related to TTL\n #updateItemAge: (index: Index) => void = () => {}\n #statusTTL: (status: LRUCache.Status, index: Index) => void =\n () => {}\n #setItemTTL: (\n index: Index,\n ttl: LRUCache.Milliseconds,\n start?: LRUCache.Milliseconds,\n // ignore because we never call this if we're not already in TTL mode\n /* c8 ignore start */\n ) => void = () => {}\n /* c8 ignore stop */\n\n #isStale: (index: Index) => boolean = () => false\n\n #initializeSizeTracking() {\n const sizes = new ZeroArray(this.#max)\n this.#calculatedSize = 0\n this.#sizes = sizes\n this.#removeItemSize = index => {\n this.#calculatedSize -= sizes[index] as number\n sizes[index] = 0\n }\n this.#requireSize = (k, v, size, sizeCalculation) => {\n if (!isPosInt(size)) {\n // provisionally accept background fetches.\n // actual value size will be checked when they return.\n if (this.#isBackgroundFetch(v)) {\n // NB: this cannot occur if v.__staleWhileFetching is set,\n // because in that case, it would take on the size of the\n // existing entry that it temporarily replaces.\n return this.backgroundFetchSize\n }\n if (sizeCalculation) {\n if (typeof sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation must be a function')\n }\n size = sizeCalculation(v, k)\n if (!isPosInt(size)) {\n throw new TypeError(\n 'sizeCalculation return invalid (expect positive integer)',\n )\n }\n } else {\n throw new TypeError(\n 'invalid size value (must be positive integer). ' +\n 'When maxSize or maxEntrySize is used, sizeCalculation ' +\n 'or size must be set.',\n )\n }\n }\n return size\n }\n\n this.#addItemSize = (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status,\n ) => {\n sizes[index] = size\n if (this.#maxSize) {\n const maxSize = this.#maxSize - sizes[index]\n while (this.#calculatedSize > maxSize) {\n this.#evict(true)\n }\n }\n this.#calculatedSize += sizes[index]\n if (status) {\n status.entrySize = size\n status.totalCalculatedSize = this.#calculatedSize\n }\n }\n }\n\n #removeItemSize: (index: Index) => void = _i => {}\n\n #addItemSize: (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status,\n ) => void = (_i, _s, _st) => {}\n\n #requireSize: (\n k: K,\n v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator,\n status?: LRUCache.Status,\n ) => LRUCache.Size = (\n _k: K,\n _v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator,\n ) => {\n if (size || sizeCalculation) {\n throw new TypeError(\n 'cannot set size without setting maxSize or maxEntrySize on cache',\n )\n }\n return 0\n };\n\n *#indexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#tail; this.#isValidIndex(i); ) {\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#head) {\n break\n } else {\n i = this.#prev[i] as Index\n }\n }\n }\n }\n\n *#rindexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#head; this.#isValidIndex(i); ) {\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#tail) {\n break\n } else {\n i = this.#next[i] as Index\n }\n }\n }\n }\n\n #isValidIndex(index: Index) {\n return (\n index !== undefined &&\n this.#keyMap.get(this.#keyList[index] as K) === index\n )\n }\n\n /**\n * Return a generator yielding `[key, value]` pairs,\n * in order from most recently used to least recently used.\n */\n *entries() {\n for (const i of this.#indexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]] as [K, V]\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.entries}\n *\n * Return a generator yielding `[key, value]` pairs,\n * in order from least recently used to most recently used.\n */\n *rentries() {\n for (const i of this.#rindexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]]\n }\n }\n }\n\n /**\n * Return a generator yielding the keys in the cache,\n * in order from most recently used to least recently used.\n */\n *keys() {\n for (const i of this.#indexes()) {\n const k = this.#keyList[i]\n if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield k\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.keys}\n *\n * Return a generator yielding the keys in the cache,\n * in order from least recently used to most recently used.\n */\n *rkeys() {\n for (const i of this.#rindexes()) {\n const k = this.#keyList[i]\n if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield k\n }\n }\n }\n\n /**\n * Return a generator yielding the values in the cache,\n * in order from most recently used to least recently used.\n */\n *values() {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i] as V\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.values}\n *\n * Return a generator yielding the values in the cache,\n * in order from least recently used to most recently used.\n */\n *rvalues() {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i]\n }\n }\n }\n\n /**\n * Iterating over the cache itself yields the same results as\n * {@link LRUCache.entries}\n */\n [Symbol.iterator]() {\n return this.entries()\n }\n\n /**\n * A String value that is used in the creation of the default string\n * description of an object. Called by the built-in method\n * `Object.prototype.toString`.\n */\n [Symbol.toStringTag] = 'LRUCache'\n\n /**\n * Find a value for which the supplied fn method returns a truthy value,\n * similar to `Array.find()`. fn is called as `fn(value, key, cache)`.\n */\n find(\n fn: (v: V, k: K, self: LRUCache) => boolean,\n getOptions: LRUCache.GetOptions = {},\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n if (fn(value, this.#keyList[i] as K, this)) {\n return this.#get(this.#keyList[i] as K, getOptions)\n }\n }\n }\n\n /**\n * Call the supplied function on each item in the cache, in order from most\n * recently used to least recently used.\n *\n * `fn` is called as `fn(value, key, cache)`.\n *\n * If `thisp` is provided, function will be called in the `this`-context of\n * the provided object, or the cache if no `thisp` object is provided.\n *\n * Does not update age or recenty of use, or iterate over stale values.\n */\n forEach(\n fn: (v: V, k: K, self: LRUCache) => unknown,\n thisp: unknown = this,\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * The same as {@link LRUCache.forEach} but items are iterated over in\n * reverse order. (ie, less recently used items are iterated over first.)\n */\n rforEach(\n fn: (v: V, k: K, self: LRUCache) => unknown,\n thisp: unknown = this,\n ) {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * Delete any stale entries. Returns true if anything was removed,\n * false otherwise.\n */\n purgeStale() {\n let deleted = false\n for (const i of this.#rindexes({ allowStale: true })) {\n if (this.#isStale(i)) {\n this.#delete(this.#keyList[i] as K, 'expire')\n deleted = true\n }\n }\n return deleted\n }\n\n /**\n * Get the extended info about a given entry, to get its value, size, and\n * TTL info simultaneously. Returns `undefined` if the key is not present.\n *\n * Unlike {@link LRUCache#dump}, which is designed to be portable and survive\n * serialization, the `start` value is always the current timestamp, and the\n * `ttl` is a calculated remaining time to live (negative if expired).\n *\n * Always returns stale values, if their info is found in the cache, so be\n * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl})\n * if relevant.\n */\n info(key: K): LRUCache.Entry | undefined {\n const i = this.#keyMap.get(key)\n if (i === undefined) return undefined\n const v = this.#valList[i]\n /* c8 ignore start - this isn't tested for the info function,\n * but it's the same logic as found in other places. */\n const value: V | undefined =\n this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) return undefined\n /* c8 ignore stop */\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n const ttl = this.#ttls[i]\n const start = this.#starts[i]\n if (ttl && start) {\n const remain = ttl - (this.#perf.now() - start)\n entry.ttl = remain\n entry.start = Date.now()\n }\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n return entry\n }\n\n /**\n * Return an array of [key, {@link LRUCache.Entry}] tuples which can be\n * passed to {@link LRUCache#load}.\n *\n * The `start` fields are calculated relative to a portable `Date.now()`\n * timestamp, even if `performance.now()` is available.\n *\n * Stale entries are always included in the `dump`, even if\n * {@link LRUCache.OptionsBase.allowStale} is false.\n *\n * Note: this returns an actual array, not a generator, so it can be more\n * easily passed around.\n */\n dump() {\n const arr: [K, LRUCache.Entry][] = []\n for (const i of this.#indexes({ allowStale: true })) {\n const key = this.#keyList[i]\n const v = this.#valList[i]\n const value: V | undefined =\n this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined || key === undefined) continue\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n entry.ttl = this.#ttls[i]\n // always dump the start relative to a portable timestamp\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = this.#perf.now() - (this.#starts[i] as number)\n entry.start = Math.floor(Date.now() - age)\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n arr.unshift([key, entry])\n }\n return arr\n }\n\n /**\n * Reset the cache and load in the items in entries in the order listed.\n *\n * The shape of the resulting cache may be different if the same options are\n * not used in both caches.\n *\n * The `start` fields are assumed to be calculated relative to a portable\n * `Date.now()` timestamp, even if `performance.now()` is available.\n */\n load(arr: [K, LRUCache.Entry][]) {\n this.clear()\n for (const [key, entry] of arr) {\n if (entry.start) {\n // entry.start is a portable timestamp, but we may be using\n // node's performance.now(), so calculate the offset, so that\n // we get the intended remaining TTL, no matter how long it's\n // been on ice.\n //\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = Date.now() - entry.start\n entry.start = this.#perf.now() - age\n }\n this.#set(key, entry.value, entry)\n }\n }\n\n /**\n * Add a value to the cache.\n *\n * Note: if `undefined` is specified as a value, this is an alias for\n * {@link LRUCache#delete}\n *\n * Fields on the {@link LRUCache.SetOptions} options param will override\n * their corresponding values in the constructor options for the scope\n * of this single `set()` operation.\n *\n * If `start` is provided, then that will set the effective start\n * time for the TTL calculation. Note that this must be a previous\n * value of `performance.now()` if supported, or a previous value of\n * `Date.now()` if not.\n *\n * Options object may also include `size`, which will prevent\n * calling the `sizeCalculation` function and just use the specified\n * number if it is a positive integer, and `noDisposeOnSet` which\n * will prevent calling a `dispose` function in the case of\n * overwrites.\n *\n * If the `size` (or return value of `sizeCalculation`) for a given\n * entry is greater than `maxEntrySize`, then the item will not be\n * added to the cache.\n *\n * Will update the recency of the entry.\n *\n * If the value is `undefined`, then this is an alias for\n * `cache.delete(key)`. `undefined` is never stored in the cache.\n */\n set(\n k: K,\n v: V | undefined,\n setOptions: LRUCache.SetOptions = {},\n ) {\n const { status = metrics.hasSubscribers ? {} : undefined } = setOptions\n setOptions.status = status\n if (status) {\n status.op = 'set'\n status.key = k\n if (v !== undefined) status.value = v\n status.cache = this\n }\n const result = this.#set(k, v, setOptions)\n if (status && metrics.hasSubscribers) {\n metrics.publish(status)\n }\n return result\n }\n\n #set(\n k: K,\n v: V | BackgroundFetch | undefined,\n setOptions: LRUCache.SetOptions,\n bf?: BackgroundFetch,\n ) {\n const {\n ttl = this.ttl,\n start,\n noDisposeOnSet = this.noDisposeOnSet,\n sizeCalculation = this.sizeCalculation,\n status,\n } = setOptions\n\n const isBF = this.#isBackgroundFetch(v)\n if (v === undefined) {\n if (status) status.set = 'deleted'\n this.delete(k)\n return this\n }\n let { noUpdateTTL = this.noUpdateTTL } = setOptions\n\n if (status && !isBF) status.value = v\n\n const size = this.#requireSize(\n k,\n v,\n setOptions.size || 0,\n sizeCalculation,\n status,\n )\n // if the item doesn't fit, don't do anything\n // NB: maxEntrySize set to maxSize by default\n if (this.maxEntrySize && size > this.maxEntrySize) {\n // have to delete, in case something is there already.\n this.#delete(k, 'set')\n if (status) {\n status.set = 'miss'\n status.maxEntrySizeExceeded = true\n }\n return this\n }\n let index = this.#size === 0 ? undefined : this.#keyMap.get(k)\n if (index === undefined) {\n // addition\n index = (\n this.#size === 0 ? this.#tail\n : this.#free.length !== 0 ? this.#free.pop()\n : this.#size === this.#max ? this.#evict(false)\n : this.#size) as Index\n this.#keyList[index] = k\n this.#valList[index] = v\n this.#keyMap.set(k, index)\n this.#next[this.#tail] = index\n this.#prev[index] = this.#tail\n this.#tail = index\n this.#size++\n this.#addItemSize(index, size, status)\n if (status) status.set = 'add'\n noUpdateTTL = false\n if (this.#hasOnInsert && !isBF) {\n this.#onInsert?.(v, k, 'add')\n }\n } else {\n // update\n // might be updating a background fetch!\n this.#moveToTail(index)\n const oldVal = this.#valList[index]!\n if (v !== oldVal) {\n if (!noDisposeOnSet) {\n if (this.#isBackgroundFetch(oldVal)) {\n if (oldVal !== bf) {\n // setting over a background fetch, not merely resolving it.\n oldVal.__abortController.abort(new Error('replaced'))\n }\n const { __staleWhileFetching: s } = oldVal\n if (s !== undefined && s !== v) {\n if (this.#hasDispose) {\n this.#dispose?.(s, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([s, k, 'set'])\n }\n }\n } else {\n if (this.#hasDispose) {\n this.#dispose?.(oldVal, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldVal, k, 'set'])\n }\n }\n }\n this.#removeItemSize(index)\n this.#addItemSize(index, size, status)\n this.#valList[index] = v\n if (!isBF) {\n const oldValue =\n oldVal && this.#isBackgroundFetch(oldVal) ?\n oldVal.__staleWhileFetching\n : oldVal\n const setType =\n oldValue === undefined ? 'add'\n : v !== oldValue ? 'replace'\n : 'update'\n if (status) {\n status.set = setType\n if (oldValue !== undefined) status.oldValue = oldValue\n }\n if (this.#hasOnInsert) {\n this.onInsert?.(v, k, setType)\n }\n }\n } else if (!isBF) {\n if (status) {\n status.set = 'update'\n }\n if (this.#hasOnInsert) {\n this.onInsert?.(v, k, 'update')\n }\n }\n }\n if (ttl !== 0 && !this.#ttls) {\n this.#initializeTTLTracking()\n }\n if (this.#ttls) {\n if (!noUpdateTTL) {\n this.#setItemTTL(index, ttl, start)\n }\n if (status) this.#statusTTL(status, index)\n }\n if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return this\n }\n\n /**\n * Evict the least recently used item, returning its value or\n * `undefined` if cache is empty.\n */\n pop(): V | undefined {\n try {\n while (this.#size) {\n const val = this.#valList[this.#head]\n this.#evict(true)\n if (this.#isBackgroundFetch(val)) {\n if (val.__staleWhileFetching) {\n return val.__staleWhileFetching\n }\n } else if (val !== undefined) {\n return val\n }\n }\n } finally {\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n }\n\n #evict(free: boolean) {\n const head = this.#head\n const k = this.#keyList[head]!\n const v = this.#valList[head]!\n const isBF = this.#isBackgroundFetch(v)\n if (isBF) {\n v.__abortController.abort(new Error('evicted'))\n }\n const oldValue = isBF ? v.__staleWhileFetching : v\n if (\n (this.#hasDispose || this.#hasDisposeAfter) &&\n oldValue !== undefined\n ) {\n if (this.#hasDispose) {\n this.#dispose?.(oldValue, k, 'evict')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldValue, k, 'evict'])\n }\n }\n this.#removeItemSize(head)\n if (this.#autopurgeTimers?.[head]) {\n clearTimeout(this.#autopurgeTimers[head])\n this.#autopurgeTimers[head] = undefined\n }\n // if we aren't about to use the index, then null these out\n if (free) {\n this.#keyList[head] = undefined\n this.#valList[head] = undefined\n this.#free.push(head)\n }\n if (this.#size === 1) {\n this.#head = this.#tail = 0 as Index\n this.#free.length = 0\n } else {\n this.#head = this.#next[head] as Index\n }\n this.#keyMap.delete(k)\n this.#size--\n return head\n }\n\n /**\n * Check if a key is in the cache, without updating the recency of use.\n * Will return false if the item is stale, even though it is technically\n * in the cache.\n *\n * Check if a key is in the cache, without updating the recency of\n * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set\n * to `true` in either the options or the constructor.\n *\n * Will return `false` if the item is stale, even though it is technically in\n * the cache. The difference can be determined (if it matters) by using a\n * `status` argument, and inspecting the `has` field.\n *\n * Will not update item age unless\n * {@link LRUCache.OptionsBase.updateAgeOnHas} is set.\n */\n has(k: K, hasOptions: LRUCache.HasOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } = hasOptions\n hasOptions.status = status\n if (status) {\n status.op = 'has'\n status.key = k\n status.cache = this\n }\n const result = this.#has(k, hasOptions)\n if (metrics.hasSubscribers) metrics.publish(status)\n return result\n }\n #has(k: K, hasOptions: LRUCache.HasOptions = {}) {\n const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n const v = this.#valList[index]\n if (\n this.#isBackgroundFetch(v) &&\n v.__staleWhileFetching === undefined\n ) {\n return false\n }\n if (!this.#isStale(index)) {\n if (updateAgeOnHas) {\n this.#updateItemAge(index)\n }\n if (status) {\n status.has = 'hit'\n this.#statusTTL(status, index)\n }\n return true\n } else if (status) {\n status.has = 'stale'\n this.#statusTTL(status, index)\n }\n } else if (status) {\n status.has = 'miss'\n }\n return false\n }\n\n /**\n * Like {@link LRUCache#get} but doesn't update recency or delete stale\n * items.\n *\n * Returns `undefined` if the item is stale, unless\n * {@link LRUCache.OptionsBase.allowStale} is set.\n */\n peek(k: K, peekOptions: LRUCache.PeekOptions = {}) {\n const { status = hasSubscribers() ? {} : undefined } = peekOptions\n if (status) {\n status.op = 'peek'\n status.key = k\n status.cache = this\n }\n peekOptions.status = status\n const result = this.#peek(k, peekOptions)\n if (metrics.hasSubscribers) {\n metrics.publish(status)\n }\n return result\n }\n #peek(k: K, peekOptions: LRUCache.PeekOptions) {\n const { status, allowStale = this.allowStale } = peekOptions\n const index = this.#keyMap.get(k)\n if (index === undefined || (!allowStale && this.#isStale(index))) {\n if (status) status.peek = index === undefined ? 'miss' : 'stale'\n return undefined\n }\n const v = this.#valList[index]\n const val = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (status) {\n if (val !== undefined) {\n status.peek = 'hit'\n status.value = val\n } else {\n status.peek = 'miss'\n }\n }\n return val\n }\n\n #backgroundFetch(\n k: K,\n index: Index | undefined,\n options: LRUCache.FetchOptions,\n context: FC,\n ): BackgroundFetch {\n const v = index === undefined ? undefined : this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n return v\n }\n\n const ac = new AbortController()\n const { signal } = options\n // when/if our AC signals, then stop listening to theirs.\n signal?.addEventListener('abort', () => ac.abort(signal.reason), {\n signal: ac.signal,\n })\n\n const fetchOpts = {\n signal: ac.signal,\n options,\n context,\n }\n\n const cb = (v: V | undefined, updateCache = false): V | undefined => {\n const { aborted } = ac.signal\n const ignoreAbort = options.ignoreFetchAbort && v !== undefined\n const proceed =\n options.ignoreFetchAbort ||\n !!(options.allowStaleOnFetchAbort && v !== undefined)\n if (options.status) {\n if (aborted && !updateCache) {\n options.status.fetchAborted = true\n options.status.fetchError = ac.signal.reason\n if (ignoreAbort) options.status.fetchAbortIgnored = true\n } else {\n options.status.fetchResolved = true\n }\n }\n if (aborted && !ignoreAbort && !updateCache) {\n return fetchFail(ac.signal.reason, proceed)\n }\n // either we didn't abort, and are still here, or we did, and ignored\n const bf = p as BackgroundFetch\n // if nothing else has been written there but we're set to update the\n // cache and ignore the abort, or if it's still pending on this specific\n // background request, then write it to the cache.\n const vl = this.#valList[index as Index]\n if (vl === p || (vl === undefined && ignoreAbort && updateCache)) {\n if (v === undefined) {\n if (bf.__staleWhileFetching !== undefined) {\n this.#valList[index as Index] = bf.__staleWhileFetching\n } else {\n this.#delete(k, 'fetch')\n }\n } else {\n if (options.status) options.status.fetchUpdated = true\n this.#set(k, v, fetchOpts.options, bf)\n }\n }\n return v\n }\n\n const eb = (er: unknown) => {\n if (options.status) {\n options.status.fetchRejected = true\n options.status.fetchError = er as Error\n }\n // do not pass go, do not collect $200\n return fetchFail(er, false)\n }\n\n const fetchFail = (er: unknown, proceed: boolean): V | undefined => {\n const { aborted } = ac.signal\n const allowStaleAborted = aborted && options.allowStaleOnFetchAbort\n const allowStale =\n allowStaleAborted || options.allowStaleOnFetchRejection\n const noDelete = allowStale || options.noDeleteOnFetchRejection\n const bf = p as BackgroundFetch\n if (this.#valList[index as Index] === p) {\n // if we allow stale on fetch rejections, then we need to ensure that\n // the stale value is not removed from the cache when the fetch fails.\n const del =\n !noDelete || (!proceed && bf.__staleWhileFetching === undefined)\n if (del) {\n this.#delete(k, 'fetch')\n } else if (!allowStaleAborted) {\n // still replace the *promise* with the stale value,\n // since we are done with the promise at this point.\n // leave it untouched if we're still waiting for an\n // aborted background fetch that hasn't yet returned.\n this.#valList[index as Index] = bf.__staleWhileFetching\n }\n }\n if (allowStale) {\n if (options.status && bf.__staleWhileFetching !== undefined) {\n options.status.returnedStale = true\n }\n return bf.__staleWhileFetching\n } else if (bf.__returned === bf) {\n throw er\n }\n }\n\n const pcall = (\n res: (v: V | undefined) => void,\n rej: (e: unknown) => void,\n ) => {\n const fmp = this.#fetchMethod?.(k, v, fetchOpts)\n // ignored, we go until we finish, regardless.\n // defer check until we are actually aborting,\n // so fetchMethod can override.\n ac.signal.addEventListener('abort', () => {\n if (!options.ignoreFetchAbort || options.allowStaleOnFetchAbort) {\n res(undefined)\n // when it eventually resolves, update the cache.\n if (options.allowStaleOnFetchAbort) {\n res = v => cb(v, true)\n }\n }\n })\n if (fmp && fmp instanceof Promise) {\n fmp.then(v => res(v === undefined ? undefined : v), rej)\n } else if (fmp !== undefined) {\n res(fmp)\n }\n }\n\n if (options.status) options.status.fetchDispatched = true\n const p = new Promise(pcall).then(cb, eb)\n const bf: BackgroundFetch = Object.assign(p, {\n __abortController: ac,\n __staleWhileFetching: v,\n __returned: undefined,\n })\n\n if (index === undefined) {\n // internal, don't expose status.\n this.#set(k, bf, { ...fetchOpts.options, status: undefined })\n index = this.#keyMap.get(k)\n } else {\n // do not call #set, because we do not want to adjust its place\n // in the lru queue, as it has not yet been \"used\". Also, we don't\n // need to worry about evicting for size, because a background fetch\n // over a stale value is treated as the same size as its stale value.\n this.#valList[index] = bf\n }\n return bf\n }\n\n #isBackgroundFetch(p: unknown): p is BackgroundFetch {\n if (!this.#hasFetchMethod) return false\n const b = p as BackgroundFetch\n return (\n !!b &&\n b instanceof Promise &&\n b.hasOwnProperty('__staleWhileFetching') &&\n b.__abortController instanceof AbortController\n )\n }\n\n /**\n * Make an asynchronous cached fetch using the\n * {@link LRUCache.OptionsBase.fetchMethod} function.\n *\n * If the value is in the cache and not stale, then the returned\n * Promise resolves to the value.\n *\n * If not in the cache, or beyond its TTL staleness, then\n * `fetchMethod(key, staleValue, { options, signal, context })` is\n * called, and the value returned will be added to the cache once\n * resolved.\n *\n * If called with `allowStale`, and an asynchronous fetch is\n * currently in progress to reload a stale value, then the former\n * stale value will be returned.\n *\n * If called with `forceRefresh`, then the cached item will be\n * re-fetched, even if it is not stale. However, if `allowStale` is also\n * set, then the old value will still be returned. This is useful\n * in cases where you want to force a reload of a cached value. If\n * a background fetch is already in progress, then `forceRefresh`\n * has no effect.\n *\n * If multiple fetches for the same key are issued, then they will all be\n * coalesced into a single call to fetchMethod.\n *\n * Note that this means that handling options such as\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort},\n * {@link LRUCache.FetchOptions.signal},\n * and {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} will be\n * determined by the FIRST fetch() call for a given key.\n *\n * This is a known (fixable) shortcoming which will be addresed on when\n * someone complains about it, as the fix would involve added complexity and\n * may not be worth the costs for this edge case.\n *\n * If {@link LRUCache.OptionsBase.fetchMethod} is not specified, then this is\n * effectively an alias for `Promise.resolve(cache.get(key))`.\n *\n * When the fetch method resolves to a value, if the fetch has not\n * been aborted due to deletion, eviction, or being overwritten,\n * then it is added to the cache using the options provided.\n *\n * If the key is evicted or deleted before the `fetchMethod`\n * resolves, then the AbortSignal passed to the `fetchMethod` will\n * receive an `abort` event, and the promise returned by `fetch()`\n * will reject with the reason for the abort.\n *\n * If a `signal` is passed to the `fetch()` call, then aborting the\n * signal will abort the fetch and cause the `fetch()` promise to\n * reject with the reason provided.\n *\n * **Setting `context`**\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the {@link LRUCache} constructor, then all\n * calls to `cache.fetch()` _must_ provide a `context` option. If\n * set to `undefined` or `void`, then calls to fetch _must not_\n * provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that\n * might be relevant in the course of fetching the data. It is only\n * relevant for the course of a single `fetch()` operation, and\n * discarded afterwards.\n *\n * **Note: `fetch()` calls are inflight-unique**\n *\n * If you call `fetch()` multiple times with the same key value,\n * then every call after the first will resolve on the same\n * promise1,\n * _even if they have different settings that would otherwise change\n * the behavior of the fetch_, such as `noDeleteOnFetchRejection`\n * or `ignoreFetchAbort`.\n *\n * In most cases, this is not a problem (in fact, only fetching\n * something once is what you probably want, if you're caching in\n * the first place). If you are changing the fetch() options\n * dramatically between runs, there's a good chance that you might\n * be trying to fit divergent semantics into a single object, and\n * would be better off with multiple cache instances.\n *\n * **1**: Ie, they're not the \"same Promise\", but they resolve at\n * the same time, because they're both waiting on the same\n * underlying fetchMethod response.\n */\n\n fetch(\n k: K,\n fetchOptions: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext,\n ): Promise\n\n // this overload not allowed if context is required\n fetch(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n fetchOptions?: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : never,\n ): Promise\n fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const ths = tracing.hasSubscribers\n const { status = hasSubscribers() ? {} : undefined } = fetchOptions\n fetchOptions.status = status\n if (status && fetchOptions.context) {\n status.context = fetchOptions.context\n }\n const p = this.#fetch(k, fetchOptions)\n if (status && ths) {\n status.trace = true\n tracing.tracePromise(() => p, status).catch(() => {})\n }\n return p\n }\n\n async #fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const {\n // get options\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n // set options\n ttl = this.ttl,\n noDisposeOnSet = this.noDisposeOnSet,\n size = 0,\n sizeCalculation = this.sizeCalculation,\n noUpdateTTL = this.noUpdateTTL,\n // fetch exclusive options\n noDeleteOnFetchRejection = this.noDeleteOnFetchRejection,\n allowStaleOnFetchRejection = this.allowStaleOnFetchRejection,\n ignoreFetchAbort = this.ignoreFetchAbort,\n allowStaleOnFetchAbort = this.allowStaleOnFetchAbort,\n context,\n forceRefresh = false,\n status,\n signal,\n } = fetchOptions\n if (status) {\n status.op = 'fetch'\n status.key = k\n if (forceRefresh) status.forceRefresh = true\n status.cache = this\n }\n\n if (!this.#hasFetchMethod) {\n if (status) status.fetch = 'get'\n return this.#get(k, {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n status,\n })\n }\n\n const options = {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n ttl,\n noDisposeOnSet,\n size,\n sizeCalculation,\n noUpdateTTL,\n noDeleteOnFetchRejection,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n status,\n signal,\n }\n\n let index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.fetch = 'miss'\n const p = this.#backgroundFetch(k, index, options, context as FC)\n return (p.__returned = p)\n } else {\n // in cache, maybe already fetching\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n const stale = allowStale && v.__staleWhileFetching !== undefined\n if (status) {\n status.fetch = 'inflight'\n if (stale) status.returnedStale = true\n }\n return stale ? v.__staleWhileFetching : (v.__returned = v)\n }\n\n // if we force a refresh, that means do NOT serve the cached value,\n // unless we are already in the process of refreshing the cache.\n const isStale = this.#isStale(index)\n if (!forceRefresh && !isStale) {\n if (status) status.fetch = 'hit'\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n if (status) this.#statusTTL(status, index)\n return v\n }\n\n // ok, it is stale or a forced refresh, and not already fetching.\n // refresh the cache.\n const p = this.#backgroundFetch(k, index, options, context as FC)\n const hasStale = p.__staleWhileFetching !== undefined\n const staleVal = hasStale && allowStale\n if (status) {\n status.fetch = isStale ? 'stale' : 'refresh'\n if (staleVal && isStale) status.returnedStale = true\n }\n return staleVal ? p.__staleWhileFetching : (p.__returned = p)\n }\n }\n\n /**\n * In some cases, `cache.fetch()` may resolve to `undefined`, either because\n * a {@link LRUCache.OptionsBase#fetchMethod} was not provided (turning\n * `cache.fetch(k)` into just an async wrapper around `cache.get(k)`) or\n * because `ignoreFetchAbort` was specified (either to the constructor or\n * in the {@link LRUCache.FetchOptions}). Also, the\n * {@link LRUCache.OptionsBase.fetchMethod} may return `undefined` or `void`, making\n * the test even more complicated.\n *\n * Because inferring the cases where `undefined` might be returned are so\n * cumbersome, but testing for `undefined` can also be annoying, this method\n * can be used, which will reject if `this.fetch()` resolves to undefined.\n */\n forceFetch(\n k: K,\n fetchOptions: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext,\n ): Promise\n // this overload not allowed if context is required\n forceFetch(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n fetchOptions?: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : never,\n ): Promise\n forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const ths = tracing.hasSubscribers\n const { status = hasSubscribers() ? {} : undefined } = fetchOptions\n fetchOptions.status = status\n if (status && fetchOptions.context) {\n status.context = fetchOptions.context\n }\n const p = this.#forceFetch(k, fetchOptions)\n if (status && ths) {\n status.trace = true\n tracing.tracePromise(() => p, status).catch(() => {})\n }\n return p\n }\n\n async #forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ) {\n const v = await this.#fetch(k, fetchOptions)\n if (v === undefined) throw new Error('fetch() returned undefined')\n return v\n }\n\n /**\n * If the key is found in the cache, then this is equivalent to\n * {@link LRUCache#get}. If not, in the cache, then calculate the value using\n * the {@link LRUCache.OptionsBase.memoMethod}, and add it to the cache.\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the LRUCache constructor, then all calls to `cache.memo()`\n * _must_ provide a `context` option. If set to `undefined` or `void`, then\n * calls to memo _must not_ provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that might be\n * relevant in the course of fetching the data. It is only relevant for the\n * course of a single `memo()` operation, and discarded afterwards.\n */\n memo(\n k: K,\n memoOptions: unknown extends FC ? LRUCache.MemoOptions\n : FC extends undefined | void ? LRUCache.MemoOptionsNoContext\n : LRUCache.MemoOptionsWithContext,\n ): V\n // this overload not allowed if context is required\n memo(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n memoOptions?: unknown extends FC ? LRUCache.MemoOptions\n : FC extends undefined | void ? LRUCache.MemoOptionsNoContext\n : never,\n ): V\n memo(k: K, memoOptions: LRUCache.MemoOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } =\n memoOptions\n memoOptions.status = status\n if (status) {\n status.op = 'memo'\n status.key = k\n if (memoOptions.context) {\n status.context = memoOptions.context\n }\n status.cache = this\n }\n const result = this.#memo(k, memoOptions)\n if (status) status.value = result\n if (metrics.hasSubscribers) metrics.publish(status)\n return result\n }\n #memo(k: K, memoOptions: LRUCache.MemoOptions = {}) {\n const memoMethod = this.#memoMethod\n if (!memoMethod) {\n throw new Error('no memoMethod provided to constructor')\n }\n const { context, status, forceRefresh, ...options } = memoOptions\n if (status && forceRefresh) status.forceRefresh = true\n const v = this.#get(k, options)\n const refresh = forceRefresh || v === undefined\n if (status) {\n status.memo = refresh ? 'miss' : 'hit'\n if (!refresh) status.value = v\n }\n if (!refresh) return v\n const vv = memoMethod(k, v, {\n options,\n context,\n } as LRUCache.MemoizerOptions)\n if (status) status.value = vv\n this.#set(k, vv, options)\n return vv\n }\n\n /**\n * Return a value from the cache. Will update the recency of the cache\n * entry found.\n *\n * If the key is not found, get() will return `undefined`.\n */\n get(k: K, getOptions: LRUCache.GetOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } = getOptions\n getOptions.status = status\n if (status) {\n status.op = 'get'\n status.key = k\n status.cache = this\n }\n const result = this.#get(k, getOptions)\n if (status) {\n if (result !== undefined) status.value = result\n if (metrics.hasSubscribers) metrics.publish(status)\n }\n return result\n }\n\n #get(k: K, getOptions: LRUCache.GetOptions = {}) {\n const {\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n status,\n } = getOptions\n const index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.get = 'miss'\n return undefined\n }\n const value = this.#valList[index]\n const fetching = this.#isBackgroundFetch(value)\n if (status) this.#statusTTL(status, index)\n if (this.#isStale(index)) {\n // delete only if not an in-flight background fetch\n if (!fetching) {\n if (!noDeleteOnStaleGet) {\n this.#delete(k, 'expire')\n }\n if (status) status.get = 'stale'\n if (allowStale) {\n if (status) status.returnedStale = true\n return value\n }\n return undefined\n }\n if (status) status.get = 'stale-fetching'\n if (allowStale && value.__staleWhileFetching !== undefined) {\n if (status) status.returnedStale = true\n return value.__staleWhileFetching\n }\n return undefined\n }\n // not stale\n if (status) status.get = fetching ? 'fetching' : 'hit'\n // if we're currently fetching it, we don't actually have it yet\n // it's not stale, which means this isn't a staleWhileRefetching.\n // If it's not stale, and fetching, AND has a __staleWhileFetching\n // value, then that means the user fetched with {forceRefresh:true},\n // so it's safe to return that value.\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n return fetching ? value.__staleWhileFetching : value\n }\n\n #connect(p: Index, n: Index) {\n this.#prev[n] = p\n this.#next[p] = n\n }\n\n #moveToTail(index: Index): void {\n // if tail already, nothing to do\n // if head, move head to next[index]\n // else\n // move next[prev[index]] to next[index] (head has no prev)\n // move prev[next[index]] to prev[index]\n // prev[index] = tail\n // next[tail] = index\n // tail = index\n if (index !== this.#tail) {\n if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n this.#connect(\n this.#prev[index] as Index,\n this.#next[index] as Index,\n )\n }\n this.#connect(this.#tail, index)\n this.#tail = index\n }\n }\n\n /**\n * Deletes a key out of the cache.\n *\n * Returns true if the key was deleted, false otherwise.\n */\n delete(k: K) {\n return this.#delete(k, 'delete')\n }\n\n #delete(k: K, reason: LRUCache.DisposeReason) {\n if (metrics.hasSubscribers) {\n metrics.publish({\n op: 'delete',\n delete: reason,\n key: k,\n cache: this,\n })\n }\n let deleted = false\n if (this.#size !== 0) {\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n if (this.#autopurgeTimers?.[index]) {\n clearTimeout(this.#autopurgeTimers?.[index])\n this.#autopurgeTimers[index] = undefined\n }\n deleted = true\n if (this.#size === 1) {\n this.#clear(reason)\n } else {\n this.#removeItemSize(index)\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k, reason])\n }\n }\n this.#keyMap.delete(k)\n this.#keyList[index] = undefined\n this.#valList[index] = undefined\n if (index === this.#tail) {\n this.#tail = this.#prev[index] as Index\n } else if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n const pi = this.#prev[index] as number\n this.#next[pi] = this.#next[index] as number\n const ni = this.#next[index] as number\n this.#prev[ni] = this.#prev[index] as number\n }\n this.#size--\n this.#free.push(index)\n }\n }\n }\n if (this.#hasDisposeAfter && this.#disposed?.length) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return deleted\n }\n\n /**\n * Clear the cache entirely, throwing away all values.\n */\n clear() {\n return this.#clear('delete')\n }\n #clear(reason: LRUCache.DisposeReason) {\n for (const index of this.#rindexes({ allowStale: true })) {\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else {\n const k = this.#keyList[index]\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k as K, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k as K, reason])\n }\n }\n }\n\n this.#keyMap.clear()\n void this.#valList.fill(undefined)\n this.#keyList.fill(undefined)\n if (this.#ttls && this.#starts) {\n this.#ttls.fill(0)\n this.#starts.fill(0)\n for (const t of this.#autopurgeTimers ?? []) {\n if (t !== undefined) clearTimeout(t)\n }\n this.#autopurgeTimers?.fill(undefined)\n }\n if (this.#sizes) {\n this.#sizes.fill(0)\n }\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free.length = 0\n this.#calculatedSize = 0\n this.#size = 0\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/node/index.min.js b/node_modules/lru-cache/dist/commonjs/node/index.min.js new file mode 100644 index 00000000..a03fc771 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/node/index.min.js @@ -0,0 +1,2 @@ +"use strict";var j=(c,t)=>()=>(t||c((t={exports:{}}).exports,t),t.exports);var I=j(O=>{"use strict";Object.defineProperty(O,"__esModule",{value:!0});O.tracing=O.metrics=void 0;var U=require("node:diagnostics_channel");O.metrics=(0,U.channel)("lru-cache:metrics");O.tracing=(0,U.tracingChannel)("lru-cache")});var P=j(D=>{"use strict";Object.defineProperty(D,"__esModule",{value:!0});D.defaultPerf=void 0;D.defaultPerf=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date});Object.defineProperty(exports,"__esModule",{value:!0});exports.LRUCache=void 0;var g=I(),N=P(),C=()=>g.metrics.hasSubscribers||g.tracing.hasSubscribers,k=new Set,G=typeof process=="object"&&process?process:{},V=(c,t,e,i)=>{typeof G.emitWarning=="function"?G.emitWarning(c,t,e,i):console.error(`[${e}] ${t}: ${c}`)},q=c=>!k.has(c);var T=c=>!!c&&c===Math.floor(c)&&c>0&&isFinite(c),H=c=>T(c)?c<=Math.pow(2,8)?Uint8Array:c<=Math.pow(2,16)?Uint16Array:c<=Math.pow(2,32)?Uint32Array:c<=Number.MAX_SAFE_INTEGER?W:null:null,W=class extends Array{constructor(t){super(t),this.fill(0)}},x=class c{heap;length;static#o=!1;static create(t){let e=H(t);if(!e)return[];c.#o=!0;let i=new c(t,e);return c.#o=!1,i}constructor(t,e){if(!c.#o)throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new e(t),this.length=0}push(t){this.heap[this.length++]=t}pop(){return this.heap[--this.length]}},L=class c{#o;#c;#m;#W;#S;#M;#j;#w;get perf(){return this.#w}ttl;ttlResolution;ttlAutopurge;updateAgeOnGet;updateAgeOnHas;allowStale;noDisposeOnSet;noUpdateTTL;maxEntrySize;sizeCalculation;noDeleteOnFetchRejection;noDeleteOnStaleGet;allowStaleOnFetchAbort;allowStaleOnFetchRejection;ignoreFetchAbort;backgroundFetchSize;#n;#b;#s;#i;#t;#l;#u;#a;#h;#_;#r;#y;#F;#d;#g;#T;#U;#f;#D;static unsafeExposeInternals(t){return{starts:t.#F,ttls:t.#d,autopurgeTimers:t.#g,sizes:t.#y,keyMap:t.#s,keyList:t.#i,valList:t.#t,next:t.#l,prev:t.#u,get head(){return t.#a},get tail(){return t.#h},free:t.#_,isBackgroundFetch:e=>t.#e(e),backgroundFetch:(e,i,s,n)=>t.#G(e,i,s,n),moveToTail:e=>t.#L(e),indexes:e=>t.#A(e),rindexes:e=>t.#z(e),isStale:e=>t.#p(e)}}get max(){return this.#o}get maxSize(){return this.#c}get calculatedSize(){return this.#b}get size(){return this.#n}get fetchMethod(){return this.#M}get memoMethod(){return this.#j}get dispose(){return this.#m}get onInsert(){return this.#W}get disposeAfter(){return this.#S}constructor(t){let{max:e=0,ttl:i,ttlResolution:s=1,ttlAutopurge:n,updateAgeOnGet:r,updateAgeOnHas:h,allowStale:a,dispose:o,onInsert:d,disposeAfter:_,noDisposeOnSet:y,noUpdateTTL:u,maxSize:p=0,maxEntrySize:f=0,sizeCalculation:b,fetchMethod:l,memoMethod:S,noDeleteOnFetchRejection:F,noDeleteOnStaleGet:w,allowStaleOnFetchRejection:m,allowStaleOnFetchAbort:A,ignoreFetchAbort:z,backgroundFetchSize:M=1,perf:v}=t;if(this.backgroundFetchSize=M,v!==void 0&&typeof v?.now!="function")throw new TypeError("perf option must have a now() method if specified");if(this.#w=v??N.defaultPerf,e!==0&&!T(e))throw new TypeError("max option must be a nonnegative integer");let E=e?H(e):Array;if(!E)throw new Error("invalid max value: "+e);if(this.#o=e,this.#c=p,this.maxEntrySize=f||this.#c,this.sizeCalculation=b,this.sizeCalculation){if(!this.#c&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(S!==void 0&&typeof S!="function")throw new TypeError("memoMethod must be a function if defined");if(this.#j=S,l!==void 0&&typeof l!="function")throw new TypeError("fetchMethod must be a function if specified");if(this.#M=l,this.#U=!!l,this.#s=new Map,this.#i=Array.from({length:e}).fill(void 0),this.#t=Array.from({length:e}).fill(void 0),this.#l=new E(e),this.#u=new E(e),this.#a=0,this.#h=0,this.#_=x.create(e),this.#n=0,this.#b=0,typeof o=="function"&&(this.#m=o),typeof d=="function"&&(this.#W=d),typeof _=="function"?(this.#S=_,this.#r=[]):(this.#S=void 0,this.#r=void 0),this.#T=!!this.#m,this.#D=!!this.#W,this.#f=!!this.#S,this.noDisposeOnSet=!!y,this.noUpdateTTL=!!u,this.noDeleteOnFetchRejection=!!F,this.allowStaleOnFetchRejection=!!m,this.allowStaleOnFetchAbort=!!A,this.ignoreFetchAbort=!!z,this.maxEntrySize!==0){if(this.#c!==0&&!T(this.#c))throw new TypeError("maxSize must be a positive integer if specified");if(!T(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.#X()}if(this.allowStale=!!a,this.noDeleteOnStaleGet=!!w,this.updateAgeOnGet=!!r,this.updateAgeOnHas=!!h,this.ttlResolution=T(s)||s===0?s:1,this.ttlAutopurge=!!n,this.ttl=i||0,this.ttl){if(!T(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.#k()}if(this.#o===0&&this.ttl===0&&this.#c===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.#o&&!this.#c){let R="LRU_CACHE_UNBOUNDED";q(R)&&(k.add(R),V("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",R,c))}}getRemainingTTL(t){return this.#s.has(t)?1/0:0}#k(){let t=new W(this.#o),e=new W(this.#o);this.#d=t,this.#F=e;let i=this.ttlAutopurge?Array.from({length:this.#o}):void 0;this.#g=i,this.#H=(h,a,o=this.#w.now())=>{e[h]=a!==0?o:0,t[h]=a,s(h,a)},this.#R=h=>{e[h]=t[h]!==0?this.#w.now():0,s(h,t[h])};let s=this.ttlAutopurge?(h,a)=>{if(i?.[h]&&(clearTimeout(i[h]),i[h]=void 0),a&&a!==0&&i){let o=setTimeout(()=>{this.#p(h)&&this.#v(this.#i[h],"expire")},a+1);o.unref&&o.unref(),i[h]=o}}:()=>{};this.#E=(h,a)=>{if(t[a]){let o=t[a],d=e[a];if(!o||!d)return;h.ttl=o,h.start=d,h.now=n||r();let _=h.now-d;h.remainingTTL=o-_}};let n=0,r=()=>{let h=this.#w.now();if(this.ttlResolution>0){n=h;let a=setTimeout(()=>n=0,this.ttlResolution);a.unref&&a.unref()}return h};this.getRemainingTTL=h=>{let a=this.#s.get(h);if(a===void 0)return 0;let o=t[a],d=e[a];if(!o||!d)return 1/0;let _=(n||r())-d;return o-_},this.#p=h=>{let a=e[h],o=t[h];return!!o&&!!a&&(n||r())-a>o}}#R=()=>{};#E=()=>{};#H=()=>{};#p=()=>!1;#X(){let t=new W(this.#o);this.#b=0,this.#y=t,this.#C=e=>{this.#b-=t[e],t[e]=0},this.#N=(e,i,s,n)=>{if(!T(s)){if(this.#e(i))return this.backgroundFetchSize;if(n){if(typeof n!="function")throw new TypeError("sizeCalculation must be a function");if(s=n(i,e),!T(s))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.")}return s},this.#I=(e,i,s)=>{if(t[e]=i,this.#c){let n=this.#c-t[e];for(;this.#b>n;)this.#P(!0)}this.#b+=t[e],s&&(s.entrySize=i,s.totalCalculatedSize=this.#b)}}#C=t=>{};#I=(t,e,i)=>{};#N=(t,e,i,s)=>{if(i||s)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0};*#A({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#h;this.#V(e)&&((t||!this.#p(e))&&(yield e),e!==this.#a);)e=this.#u[e]}*#z({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#a;this.#V(e)&&((t||!this.#p(e))&&(yield e),e!==this.#h);)e=this.#l[e]}#V(t){return t!==void 0&&this.#s.get(this.#i[t])===t}*entries(){for(let t of this.#A())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*rentries(){for(let t of this.#z())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*keys(){for(let t of this.#A()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*rkeys(){for(let t of this.#z()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*values(){for(let t of this.#A())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}*rvalues(){for(let t of this.#z())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}[Symbol.iterator](){return this.entries()}[Symbol.toStringTag]="LRUCache";find(t,e={}){for(let i of this.#A()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;if(n!==void 0&&t(n,this.#i[i],this))return this.#x(this.#i[i],e)}}forEach(t,e=this){for(let i of this.#A()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;n!==void 0&&t.call(e,n,this.#i[i],this)}}rforEach(t,e=this){for(let i of this.#z()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;n!==void 0&&t.call(e,n,this.#i[i],this)}}purgeStale(){let t=!1;for(let e of this.#z({allowStale:!0}))this.#p(e)&&(this.#v(this.#i[e],"expire"),t=!0);return t}info(t){let e=this.#s.get(t);if(e===void 0)return;let i=this.#t[e],s=this.#e(i)?i.__staleWhileFetching:i;if(s===void 0)return;let n={value:s};if(this.#d&&this.#F){let r=this.#d[e],h=this.#F[e];if(r&&h){let a=r-(this.#w.now()-h);n.ttl=a,n.start=Date.now()}}return this.#y&&(n.size=this.#y[e]),n}dump(){let t=[];for(let e of this.#A({allowStale:!0})){let i=this.#i[e],s=this.#t[e],n=this.#e(s)?s.__staleWhileFetching:s;if(n===void 0||i===void 0)continue;let r={value:n};if(this.#d&&this.#F){r.ttl=this.#d[e];let h=this.#w.now()-this.#F[e];r.start=Math.floor(Date.now()-h)}this.#y&&(r.size=this.#y[e]),t.unshift([i,r])}return t}load(t){this.clear();for(let[e,i]of t){if(i.start){let s=Date.now()-i.start;i.start=this.#w.now()-s}this.#O(e,i.value,i)}}set(t,e,i={}){let{status:s=g.metrics.hasSubscribers?{}:void 0}=i;i.status=s,s&&(s.op="set",s.key=t,e!==void 0&&(s.value=e),s.cache=this);let n=this.#O(t,e,i);return s&&g.metrics.hasSubscribers&&g.metrics.publish(s),n}#O(t,e,i,s){let{ttl:n=this.ttl,start:r,noDisposeOnSet:h=this.noDisposeOnSet,sizeCalculation:a=this.sizeCalculation,status:o}=i,d=this.#e(e);if(e===void 0)return o&&(o.set="deleted"),this.delete(t),this;let{noUpdateTTL:_=this.noUpdateTTL}=i;o&&!d&&(o.value=e);let y=this.#N(t,e,i.size||0,a,o);if(this.maxEntrySize&&y>this.maxEntrySize)return this.#v(t,"set"),o&&(o.set="miss",o.maxEntrySizeExceeded=!0),this;let u=this.#n===0?void 0:this.#s.get(t);if(u===void 0)u=this.#n===0?this.#h:this.#_.length!==0?this.#_.pop():this.#n===this.#o?this.#P(!1):this.#n,this.#i[u]=t,this.#t[u]=e,this.#s.set(t,u),this.#l[this.#h]=u,this.#u[u]=this.#h,this.#h=u,this.#n++,this.#I(u,y,o),o&&(o.set="add"),_=!1,this.#D&&!d&&this.#W?.(e,t,"add");else{this.#L(u);let p=this.#t[u];if(e!==p){if(!h)if(this.#e(p)){p!==s&&p.__abortController.abort(new Error("replaced"));let{__staleWhileFetching:f}=p;f!==void 0&&f!==e&&(this.#T&&this.#m?.(f,t,"set"),this.#f&&this.#r?.push([f,t,"set"]))}else this.#T&&this.#m?.(p,t,"set"),this.#f&&this.#r?.push([p,t,"set"]);if(this.#C(u),this.#I(u,y,o),this.#t[u]=e,!d){let f=p&&this.#e(p)?p.__staleWhileFetching:p,b=f===void 0?"add":e!==f?"replace":"update";o&&(o.set=b,f!==void 0&&(o.oldValue=f)),this.#D&&this.onInsert?.(e,t,b)}}else d||(o&&(o.set="update"),this.#D&&this.onInsert?.(e,t,"update"))}if(n!==0&&!this.#d&&this.#k(),this.#d&&(_||this.#H(u,n,r),o&&this.#E(o,u)),!h&&this.#f&&this.#r){let p=this.#r,f;for(;f=p?.shift();)this.#S?.(...f)}return this}pop(){try{for(;this.#n;){let t=this.#t[this.#a];if(this.#P(!0),this.#e(t)){if(t.__staleWhileFetching)return t.__staleWhileFetching}else if(t!==void 0)return t}}finally{if(this.#f&&this.#r){let t=this.#r,e;for(;e=t?.shift();)this.#S?.(...e)}}}#P(t){let e=this.#a,i=this.#i[e],s=this.#t[e],n=this.#e(s);n&&s.__abortController.abort(new Error("evicted"));let r=n?s.__staleWhileFetching:s;return(this.#T||this.#f)&&r!==void 0&&(this.#T&&this.#m?.(r,i,"evict"),this.#f&&this.#r?.push([r,i,"evict"])),this.#C(e),this.#g?.[e]&&(clearTimeout(this.#g[e]),this.#g[e]=void 0),t&&(this.#i[e]=void 0,this.#t[e]=void 0,this.#_.push(e)),this.#n===1?(this.#a=this.#h=0,this.#_.length=0):this.#a=this.#l[e],this.#s.delete(i),this.#n--,e}has(t,e={}){let{status:i=g.metrics.hasSubscribers?{}:void 0}=e;e.status=i,i&&(i.op="has",i.key=t,i.cache=this);let s=this.#Y(t,e);return g.metrics.hasSubscribers&&g.metrics.publish(i),s}#Y(t,e={}){let{updateAgeOnHas:i=this.updateAgeOnHas,status:s}=e,n=this.#s.get(t);if(n!==void 0){let r=this.#t[n];if(this.#e(r)&&r.__staleWhileFetching===void 0)return!1;if(this.#p(n))s&&(s.has="stale",this.#E(s,n));else return i&&this.#R(n),s&&(s.has="hit",this.#E(s,n)),!0}else s&&(s.has="miss");return!1}peek(t,e={}){let{status:i=C()?{}:void 0}=e;i&&(i.op="peek",i.key=t,i.cache=this),e.status=i;let s=this.#J(t,e);return g.metrics.hasSubscribers&&g.metrics.publish(i),s}#J(t,e){let{status:i,allowStale:s=this.allowStale}=e,n=this.#s.get(t);if(n===void 0||!s&&this.#p(n)){i&&(i.peek=n===void 0?"miss":"stale");return}let r=this.#t[n],h=this.#e(r)?r.__staleWhileFetching:r;return i&&(h!==void 0?(i.peek="hit",i.value=h):i.peek="miss"),h}#G(t,e,i,s){let n=e===void 0?void 0:this.#t[e];if(this.#e(n))return n;let r=new AbortController,{signal:h}=i;h?.addEventListener("abort",()=>r.abort(h.reason),{signal:r.signal});let a={signal:r.signal,options:i,context:s},o=(f,b=!1)=>{let{aborted:l}=r.signal,S=i.ignoreFetchAbort&&f!==void 0,F=i.ignoreFetchAbort||!!(i.allowStaleOnFetchAbort&&f!==void 0);if(i.status&&(l&&!b?(i.status.fetchAborted=!0,i.status.fetchError=r.signal.reason,S&&(i.status.fetchAbortIgnored=!0)):i.status.fetchResolved=!0),l&&!S&&!b)return _(r.signal.reason,F);let w=u,m=this.#t[e];return(m===u||m===void 0&&S&&b)&&(f===void 0?w.__staleWhileFetching!==void 0?this.#t[e]=w.__staleWhileFetching:this.#v(t,"fetch"):(i.status&&(i.status.fetchUpdated=!0),this.#O(t,f,a.options,w))),f},d=f=>(i.status&&(i.status.fetchRejected=!0,i.status.fetchError=f),_(f,!1)),_=(f,b)=>{let{aborted:l}=r.signal,S=l&&i.allowStaleOnFetchAbort,F=S||i.allowStaleOnFetchRejection,w=F||i.noDeleteOnFetchRejection,m=u;if(this.#t[e]===u&&(!w||!b&&m.__staleWhileFetching===void 0?this.#v(t,"fetch"):S||(this.#t[e]=m.__staleWhileFetching)),F)return i.status&&m.__staleWhileFetching!==void 0&&(i.status.returnedStale=!0),m.__staleWhileFetching;if(m.__returned===m)throw f},y=(f,b)=>{let l=this.#M?.(t,n,a);r.signal.addEventListener("abort",()=>{(!i.ignoreFetchAbort||i.allowStaleOnFetchAbort)&&(f(void 0),i.allowStaleOnFetchAbort&&(f=S=>o(S,!0)))}),l&&l instanceof Promise?l.then(S=>f(S===void 0?void 0:S),b):l!==void 0&&f(l)};i.status&&(i.status.fetchDispatched=!0);let u=new Promise(y).then(o,d),p=Object.assign(u,{__abortController:r,__staleWhileFetching:n,__returned:void 0});return e===void 0?(this.#O(t,p,{...a.options,status:void 0}),e=this.#s.get(t)):this.#t[e]=p,p}#e(t){if(!this.#U)return!1;let e=t;return!!e&&e instanceof Promise&&e.hasOwnProperty("__staleWhileFetching")&&e.__abortController instanceof AbortController}fetch(t,e={}){let i=g.tracing.hasSubscribers,{status:s=C()?{}:void 0}=e;e.status=s,s&&e.context&&(s.context=e.context);let n=this.#q(t,e);return s&&i&&(s.trace=!0,g.tracing.tracePromise(()=>n,s).catch(()=>{})),n}async#q(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,ttl:r=this.ttl,noDisposeOnSet:h=this.noDisposeOnSet,size:a=0,sizeCalculation:o=this.sizeCalculation,noUpdateTTL:d=this.noUpdateTTL,noDeleteOnFetchRejection:_=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:y=this.allowStaleOnFetchRejection,ignoreFetchAbort:u=this.ignoreFetchAbort,allowStaleOnFetchAbort:p=this.allowStaleOnFetchAbort,context:f,forceRefresh:b=!1,status:l,signal:S}=e;if(l&&(l.op="fetch",l.key=t,b&&(l.forceRefresh=!0),l.cache=this),!this.#U)return l&&(l.fetch="get"),this.#x(t,{allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:n,status:l});let F={allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:n,ttl:r,noDisposeOnSet:h,size:a,sizeCalculation:o,noUpdateTTL:d,noDeleteOnFetchRejection:_,allowStaleOnFetchRejection:y,allowStaleOnFetchAbort:p,ignoreFetchAbort:u,status:l,signal:S},w=this.#s.get(t);if(w===void 0){l&&(l.fetch="miss");let m=this.#G(t,w,F,f);return m.__returned=m}else{let m=this.#t[w];if(this.#e(m)){let E=i&&m.__staleWhileFetching!==void 0;return l&&(l.fetch="inflight",E&&(l.returnedStale=!0)),E?m.__staleWhileFetching:m.__returned=m}let A=this.#p(w);if(!b&&!A)return l&&(l.fetch="hit"),this.#L(w),s&&this.#R(w),l&&this.#E(l,w),m;let z=this.#G(t,w,F,f),v=z.__staleWhileFetching!==void 0&&i;return l&&(l.fetch=A?"stale":"refresh",v&&A&&(l.returnedStale=!0)),v?z.__staleWhileFetching:z.__returned=z}}forceFetch(t,e={}){let i=g.tracing.hasSubscribers,{status:s=C()?{}:void 0}=e;e.status=s,s&&e.context&&(s.context=e.context);let n=this.#K(t,e);return s&&i&&(s.trace=!0,g.tracing.tracePromise(()=>n,s).catch(()=>{})),n}async#K(t,e={}){let i=await this.#q(t,e);if(i===void 0)throw new Error("fetch() returned undefined");return i}memo(t,e={}){let{status:i=g.metrics.hasSubscribers?{}:void 0}=e;e.status=i,i&&(i.op="memo",i.key=t,e.context&&(i.context=e.context),i.cache=this);let s=this.#Q(t,e);return i&&(i.value=s),g.metrics.hasSubscribers&&g.metrics.publish(i),s}#Q(t,e={}){let i=this.#j;if(!i)throw new Error("no memoMethod provided to constructor");let{context:s,status:n,forceRefresh:r,...h}=e;n&&r&&(n.forceRefresh=!0);let a=this.#x(t,h),o=r||a===void 0;if(n&&(n.memo=o?"miss":"hit",o||(n.value=a)),!o)return a;let d=i(t,a,{options:h,context:s});return n&&(n.value=d),this.#O(t,d,h),d}get(t,e={}){let{status:i=g.metrics.hasSubscribers?{}:void 0}=e;e.status=i,i&&(i.op="get",i.key=t,i.cache=this);let s=this.#x(t,e);return i&&(s!==void 0&&(i.value=s),g.metrics.hasSubscribers&&g.metrics.publish(i)),s}#x(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,status:r}=e,h=this.#s.get(t);if(h===void 0){r&&(r.get="miss");return}let a=this.#t[h],o=this.#e(a);return r&&this.#E(r,h),this.#p(h)?o?(r&&(r.get="stale-fetching"),i&&a.__staleWhileFetching!==void 0?(r&&(r.returnedStale=!0),a.__staleWhileFetching):void 0):(n||this.#v(t,"expire"),r&&(r.get="stale"),i?(r&&(r.returnedStale=!0),a):void 0):(r&&(r.get=o?"fetching":"hit"),this.#L(h),s&&this.#R(h),o?a.__staleWhileFetching:a)}#B(t,e){this.#u[e]=t,this.#l[t]=e}#L(t){t!==this.#h&&(t===this.#a?this.#a=this.#l[t]:this.#B(this.#u[t],this.#l[t]),this.#B(this.#h,t),this.#h=t)}delete(t){return this.#v(t,"delete")}#v(t,e){g.metrics.hasSubscribers&&g.metrics.publish({op:"delete",delete:e,key:t,cache:this});let i=!1;if(this.#n!==0){let s=this.#s.get(t);if(s!==void 0)if(this.#g?.[s]&&(clearTimeout(this.#g?.[s]),this.#g[s]=void 0),i=!0,this.#n===1)this.#$(e);else{this.#C(s);let n=this.#t[s];if(this.#e(n)?n.__abortController.abort(new Error("deleted")):(this.#T||this.#f)&&(this.#T&&this.#m?.(n,t,e),this.#f&&this.#r?.push([n,t,e])),this.#s.delete(t),this.#i[s]=void 0,this.#t[s]=void 0,s===this.#h)this.#h=this.#u[s];else if(s===this.#a)this.#a=this.#l[s];else{let r=this.#u[s];this.#l[r]=this.#l[s];let h=this.#l[s];this.#u[h]=this.#u[s]}this.#n--,this.#_.push(s)}}if(this.#f&&this.#r?.length){let s=this.#r,n;for(;n=s?.shift();)this.#S?.(...n)}return i}clear(){return this.#$("delete")}#$(t){for(let e of this.#z({allowStale:!0})){let i=this.#t[e];if(this.#e(i))i.__abortController.abort(new Error("deleted"));else{let s=this.#i[e];this.#T&&this.#m?.(i,s,t),this.#f&&this.#r?.push([i,s,t])}}if(this.#s.clear(),this.#t.fill(void 0),this.#i.fill(void 0),this.#d&&this.#F){this.#d.fill(0),this.#F.fill(0);for(let e of this.#g??[])e!==void 0&&clearTimeout(e);this.#g?.fill(void 0)}if(this.#y&&this.#y.fill(0),this.#a=0,this.#h=0,this.#_.length=0,this.#b=0,this.#n=0,this.#f&&this.#r){let e=this.#r,i;for(;i=e?.shift();)this.#S?.(...i)}}};exports.LRUCache=L; +//# sourceMappingURL=index.min.js.map diff --git a/node_modules/lru-cache/dist/commonjs/node/index.min.js.map b/node_modules/lru-cache/dist/commonjs/node/index.min.js.map new file mode 100644 index 00000000..b2b45305 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/node/index.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagnostics-channel-node.ts", "../../../src/perf.ts", "../../../src/index.ts"], + "sourcesContent": ["// simple node version that imports from node builtin\n// this is built to both ESM and CommonJS on the 'node' import path\nimport { tracingChannel, channel } from 'node:diagnostics_channel'\nimport type { TracingChannel, Channel } from 'node:diagnostics_channel'\nexport type { TracingChannel, Channel }\nexport const metrics: Channel = channel('lru-cache:metrics')\nexport const tracing: TracingChannel = tracingChannel('lru-cache')\n", "/**\n * this provides the default Perf object source, either the\n * `performance` global, or the `Date` constructor.\n *\n * it can be passed in via configuration to override it\n * for a single LRU object.\n */\nexport type Perf = { now: () => number }\nexport const defaultPerf: Perf =\n (\n typeof performance === 'object' &&\n performance &&\n typeof performance.now === 'function'\n ) ?\n /* c8 ignore start - this gets covered, but c8 gets confused */\n performance\n : /* c8 ignore stop */ Date\n", "/**\n * @module LRUCache\n */\n\nimport { metrics, tracing } from './diagnostics-channel.js'\nimport { defaultPerf } from './perf.js'\nimport type { Perf } from './perf.js'\nexport type { Perf } from './perf.js'\n\nconst hasSubscribers = () =>\n metrics.hasSubscribers || tracing.hasSubscribers\n\nconst warned = new Set()\n\n// either a function or a class\n// oxlint-disable-next-line no-explicit-any\ntype ForC = ((...a: any[]) => any) | { new (...a: any[]): any }\n\n/* c8 ignore start */\nconst PROCESS = (\n typeof process === 'object' && !!process ?\n process\n : {}) as { [k: string]: unknown }\n/* c8 ignore stop */\n\nconst emitWarning = (\n msg: string,\n type: string,\n code: string,\n fn: ForC,\n) => {\n if (typeof PROCESS.emitWarning === 'function') {\n PROCESS.emitWarning(msg, type, code, fn)\n } else {\n //oxlint-disable-next-line no-console\n console.error(`[${code}] ${type}: ${msg}`)\n }\n}\nconst shouldWarn = (code: string) => !warned.has(code)\n\nconst TYPE = Symbol('type')\nexport type PosInt = number & { [TYPE]: 'Positive Integer' }\nexport type Index = number & { [TYPE]: 'LRUCache Index' }\n\nconst isPosInt = (n: unknown): n is PosInt =>\n !!n && n === Math.floor(n as number) && n > 0 && isFinite(n)\n\nexport type UintArray = Uint8Array | Uint16Array | Uint32Array\nexport type NumberArray = UintArray | number[]\n\n// This is a little bit ridiculous, tbh.\n// The maximum array length is 2^32-1 or thereabouts on most JS impls.\n// And well before that point, you're caching the entire world, I mean,\n// that's ~32GB of just integers for the next/prev links, plus whatever\n// else to hold that many keys and values. Just filling the memory with\n// zeroes at init time is brutal when you get that big.\n// But why not be complete?\n// Maybe in the future, these limits will have expanded.\n/* c8 ignore start */\nconst getUintArray = (max: number) =>\n !isPosInt(max) ? null\n : max <= Math.pow(2, 8) ? Uint8Array\n : max <= Math.pow(2, 16) ? Uint16Array\n : max <= Math.pow(2, 32) ? Uint32Array\n : max <= Number.MAX_SAFE_INTEGER ? ZeroArray\n : null\n/* c8 ignore stop */\n\nclass ZeroArray extends Array {\n constructor(size: number) {\n super(size)\n this.fill(0)\n }\n}\nexport type { ZeroArray }\nexport type { Stack }\n\nexport type StackLike = Stack | Index[]\nclass Stack {\n /* c8 ignore start - not sure why this is showing up uncovered?? */\n heap: NumberArray\n /* c8 ignore stop */\n length: number\n // private constructor\n static #constructing: boolean = false\n static create(max: number): StackLike {\n const HeapCls = getUintArray(max)\n if (!HeapCls) return []\n Stack.#constructing = true\n const s = new Stack(max, HeapCls)\n Stack.#constructing = false\n return s\n }\n constructor(max: number, HeapCls: { new (n: number): NumberArray }) {\n /* c8 ignore start */\n if (!Stack.#constructing) {\n throw new TypeError('instantiate Stack using Stack.create(n)')\n }\n /* c8 ignore stop */\n this.heap = new HeapCls(max)\n this.length = 0\n }\n push(n: Index) {\n this.heap[this.length++] = n\n }\n pop(): Index {\n return this.heap[--this.length] as Index\n }\n}\n\n/**\n * Promise representing an in-progress {@link LRUCache#fetch} call\n */\nexport type BackgroundFetch = Promise & {\n __returned: BackgroundFetch | undefined\n __abortController: AbortController\n __staleWhileFetching: V | undefined\n}\n\nexport type DisposeTask = [\n value: V,\n key: K,\n reason: LRUCache.DisposeReason,\n]\n\nexport namespace LRUCache {\n /**\n * An integer greater than 0, reflecting the calculated size of items\n */\n export type Size = number\n\n /**\n * Integer greater than 0, representing some number of milliseconds, or the\n * time at which a TTL started counting from.\n */\n export type Milliseconds = number\n\n /**\n * An integer greater than 0, reflecting a number of items\n */\n export type Count = number\n\n /**\n * The reason why an item was removed from the cache, passed\n * to the {@link Disposer} methods.\n *\n * - `evict`: The item was evicted because it is the least recently used,\n * and the cache is full.\n * - `set`: A new value was set, overwriting the old value being disposed.\n * - `delete`: The item was explicitly deleted, either by calling\n * {@link LRUCache#delete}, {@link LRUCache#clear}, or\n * {@link LRUCache#set} with an undefined value.\n * - `expire`: The item was removed due to exceeding its TTL.\n * - `fetch`: A {@link OptionsBase#fetchMethod} operation returned\n * `undefined` or was aborted, causing the item to be deleted.\n */\n export type DisposeReason =\n | 'evict'\n | 'set'\n | 'delete'\n | 'expire'\n | 'fetch'\n /**\n * A method called upon item removal, passed as the\n * {@link OptionsBase.dispose} and/or\n * {@link OptionsBase.disposeAfter} options.\n */\n export type Disposer = (\n value: V,\n key: K,\n reason: DisposeReason,\n ) => void\n\n /**\n * The reason why an item was added to the cache, passed\n * to the {@link Inserter} methods.\n *\n * - `add`: the item was not found in the cache, and was added\n * - `update`: the item was in the cache, with the same value provided\n * - `replace`: the item was in the cache, and replaced\n */\n export type InsertReason = 'add' | 'update' | 'replace'\n\n /**\n * A method called upon item insertion, passed as the\n * {@link OptionsBase.insert}\n */\n export type Inserter = (\n value: V,\n key: K,\n reason: InsertReason,\n ) => void\n\n /**\n * A function that returns the effective calculated size\n * of an entry in the cache.\n */\n export type SizeCalculator = (value: V, key: K) => Size\n\n /**\n * Options provided to the\n * {@link OptionsBase.fetchMethod} function.\n */\n export interface FetcherOptions {\n signal: AbortSignal\n options: FetcherFetchOptions\n /**\n * Object provided in the {@link FetchOptions.context} option to\n * {@link LRUCache#fetch}\n */\n context: FC\n }\n\n /**\n * Occasionally, it may be useful to track the internal behavior of the\n * cache, particularly for logging, debugging, or for behavior within the\n * `fetchMethod`. To do this, you can pass a `status` object to the\n * {@link LRUCache#fetch}, {@link LRUCache#get}, {@link LRUCache#set},\n * {@link LRUCache#memo}, and {@link LRUCache#has} methods.\n *\n * The `status` option should be a plain JavaScript object. The following\n * fields will be set on it appropriately, depending on the situation.\n *\n * These objects are also the context objects passed to listeners on the\n * `lru-cache:metrics` diagnostic channel, and the `lru-cache` tracing\n * channels, in platforms that support them.\n */\n export interface Status {\n /**\n * The operation being performed\n */\n op?: 'get' | 'set' | 'memo' | 'fetch' | 'delete' | 'has' | 'peek'\n /**\n * The status of a set() operation.\n *\n * - add: the item was not found in the cache, and was added\n * - update: the item was in the cache, with the same value provided\n * - replace: the item was in the cache, and replaced\n * - miss: the item was not added to the cache for some reason\n */\n set?: 'add' | 'update' | 'replace' | 'miss' | 'deleted'\n\n /**\n * The status of a delete() operation.\n */\n delete?: LRUCache.DisposeReason\n\n /**\n * The result of a peek() operation\n *\n * - hit: the item was found and returned\n * - stale: the item is in the cache, but past its ttl and not returned\n * - miss: item not in the cache\n */\n peek?: 'hit' | 'miss' | 'stale'\n\n /**\n * The status of a memo() operation.\n *\n * - 'hit': the item was found in the cache and returned\n * - 'miss': the `memoMethod` function was called\n */\n memo?: 'hit' | 'miss'\n\n /**\n * The `context` option provided to a memo or fetch operation\n *\n * In practice, of course, this will be the same type as the `FC`\n * fetch context param used to instantiate the LRUCache, but the\n * convolutions of threading that through would get quite complicated,\n * and preclude forcing/forbidding the passing of a `context` param\n * where it is/isn't expected, which is more valuable for error\n * prevention.\n */\n context?: unknown\n\n /**\n * the ttl stored for the item, or undefined if ttls are not used.\n */\n ttl?: Milliseconds\n\n /**\n * the start time for the item, or undefined if ttls are not used.\n */\n start?: Milliseconds\n\n /**\n * The timestamp used for TTL calculation\n */\n now?: Milliseconds\n\n /**\n * the remaining ttl for the item, or undefined if ttls are not used.\n */\n remainingTTL?: Milliseconds\n\n /**\n * The calculated size for the item, if sizes are used.\n */\n entrySize?: Size\n\n /**\n * The total calculated size of the cache, if sizes are used.\n */\n totalCalculatedSize?: Size\n\n /**\n * A flag indicating that the item was not stored, due to exceeding the\n * {@link OptionsBase.maxEntrySize}\n */\n maxEntrySizeExceeded?: true\n\n /**\n * The key that was set or retrieved\n */\n key?: K\n\n /**\n * The value that was set\n */\n value?: V\n\n /**\n * The old value, specified in the case of `set:'replace'`\n */\n oldValue?: V\n\n /**\n * The results of a {@link LRUCache#has} operation\n *\n * - hit: the item was found in the cache\n * - stale: the item was found in the cache, but is stale\n * - miss: the item was not found in the cache\n */\n has?: 'hit' | 'stale' | 'miss'\n\n /**\n * The status of a {@link LRUCache#fetch} operation.\n * Note that this can change as the underlying fetch() moves through\n * various states.\n *\n * - inflight: there is another fetch() for this key which is in process\n * - get: there is no {@link OptionsBase.fetchMethod}, so\n * {@link LRUCache#get} was called.\n * - miss: the item is not in cache, and will be fetched.\n * - hit: the item is in the cache, and was resolved immediately.\n * - stale: the item is in the cache, but stale.\n * - refresh: the item is in the cache, and not stale, but\n * {@link FetchOptions.forceRefresh} was specified.\n */\n fetch?: 'get' | 'inflight' | 'miss' | 'hit' | 'stale' | 'refresh'\n\n /**\n * `forceRefresh` option was used for either a fetch or memo operation\n */\n forceRefresh?: boolean\n\n /**\n * The {@link OptionsBase.fetchMethod} was called\n */\n fetchDispatched?: true\n\n /**\n * The cached value was updated after a successful call to\n * {@link OptionsBase.fetchMethod}\n */\n fetchUpdated?: true\n\n /**\n * The reason for a fetch() rejection. Either the error raised by the\n * {@link OptionsBase.fetchMethod}, or the reason for an\n * AbortSignal.\n */\n fetchError?: Error\n\n /**\n * The fetch received an abort signal\n */\n fetchAborted?: true\n\n /**\n * The abort signal received was ignored, and the fetch was allowed to\n * continue in the background.\n */\n fetchAbortIgnored?: true\n\n /**\n * The fetchMethod promise resolved successfully\n */\n fetchResolved?: true\n\n /**\n * The fetchMethod promise was rejected\n */\n fetchRejected?: true\n\n /**\n * The status of a {@link LRUCache#get} operation.\n *\n * - fetching: The item is currently being fetched. If a previous value\n * is present and allowed, that will be returned.\n * - stale: The item is in the cache, and is stale. If it was returned,\n * then the `returnedStale` flag will be set.\n * - stale-fetching: The value is being fetched in the background, but is\n * currently stale. If the stale value was returned, then the\n * `returnedStale` flag will be set.\n * - hit: the item is in the cache\n * - miss: the item is not in the cache\n */\n get?: 'stale' | 'hit' | 'miss' | 'fetching' | 'stale-fetching'\n\n /**\n * A fetch or get operation returned a stale value.\n */\n returnedStale?: true\n\n /**\n * A tracingChannel trace was started for this operation\n */\n trace?: boolean\n\n /**\n * A reference to the cache instance associated with this operation\n */\n cache?: LRUCache\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#fetch}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link OptionsBase.noDeleteOnFetchRejection},\n * {@link OptionsBase.allowStaleOnFetchRejection},\n * {@link FetchOptions.forceRefresh}, and\n * {@link FetcherOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.fetchMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the fetchMethod is called.\n */\n export interface FetcherFetchOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n status?: Status\n size?: Size\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#fetch} method.\n */\n export interface FetchOptions extends FetcherFetchOptions<\n K,\n V,\n FC\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.fetchMethod} as\n * the {@link FetcherOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n signal?: AbortSignal\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface FetchOptionsWithContext extends FetchOptions<\n K,\n V,\n FC\n > {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is\n * `undefined` or `void`\n */\n export interface FetchOptionsNoContext<\n K,\n V,\n FC extends undefined | void = undefined,\n > extends FetchOptions {\n context?: FC\n }\n\n export interface MemoOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.memoMethod} as\n * the {@link MemoizerOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface MemoOptionsWithContext extends MemoOptions<\n K,\n V,\n FC\n > {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is\n * `undefined` or `void`\n */\n export interface MemoOptionsNoContext<\n K,\n V,\n FC extends undefined | void = undefined,\n > extends MemoOptions {\n context?: FC\n }\n\n /**\n * Options provided to the\n * {@link OptionsBase.memoMethod} function.\n */\n export interface MemoizerOptions {\n options: MemoizerMemoOptions\n /**\n * Object provided in the {@link MemoOptions.context} option to\n * {@link LRUCache#memo}\n */\n context: FC\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#memo}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link MemoOptions.forceRefresh}, and\n * {@link MemoOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.memoMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the memoMethod is called.\n */\n export interface MemoizerMemoOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n > {\n status?: Status\n size?: Size\n start?: Milliseconds\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#has} method.\n */\n export interface HasOptions extends Pick<\n OptionsBase,\n 'updateAgeOnHas'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#get} method.\n */\n export interface GetOptions extends Pick<\n OptionsBase,\n 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#peek} method.\n */\n export interface PeekOptions extends Pick<\n OptionsBase,\n 'allowStale'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#set} method.\n */\n export interface SetOptions extends Pick<\n OptionsBase,\n 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'\n > {\n /**\n * If size tracking is enabled, then setting an explicit size\n * in the {@link LRUCache#set} call will prevent calling the\n * {@link OptionsBase.sizeCalculation} function.\n */\n size?: Size\n /**\n * If TTL tracking is enabled, then setting an explicit start\n * time in the {@link LRUCache#set} call will override the\n * default time from `performance.now()` or `Date.now()`.\n *\n * Note that it must be a valid value for whichever time-tracking\n * method is in use.\n */\n start?: Milliseconds\n status?: Status\n }\n\n /**\n * The type signature for the {@link OptionsBase.fetchMethod} option.\n */\n export type Fetcher = (\n key: K,\n staleValue: V | undefined,\n options: FetcherOptions,\n ) => Promise | V | undefined | void\n\n /**\n * the type signature for the {@link OptionsBase.memoMethod} option.\n */\n export type Memoizer = (\n key: K,\n staleValue: V | undefined,\n options: MemoizerOptions,\n ) => V\n\n /**\n * Options which may be passed to the {@link LRUCache} constructor.\n *\n * Most of these may be overridden in the various options that use\n * them.\n *\n * Despite all being technically optional, the constructor requires that\n * a cache is at minimum limited by one or more of {@link OptionsBase.max},\n * {@link OptionsBase.ttl}, or {@link OptionsBase.maxSize}.\n *\n * If {@link OptionsBase.ttl} is used alone, then it is strongly advised\n * (and in fact required by the type definitions here) that the cache\n * also set {@link OptionsBase.ttlAutopurge}, to prevent potentially\n * unbounded storage.\n *\n * All options are also available on the {@link LRUCache} instance, making\n * it safe to pass an LRUCache instance as the options argumemnt to\n * make another empty cache of the same type.\n *\n * Some options are marked as read-only, because changing them after\n * instantiation is not safe. Changing any of the other options will of\n * course only have an effect on subsequent method calls.\n */\n export interface OptionsBase {\n /**\n * The maximum number of items to store in the cache before evicting\n * old entries. This is read-only on the {@link LRUCache} instance,\n * and may not be overridden.\n *\n * If set, then storage space will be pre-allocated at construction\n * time, and the cache will perform significantly faster.\n *\n * Note that significantly fewer items may be stored, if\n * {@link OptionsBase.maxSize} and/or {@link OptionsBase.ttl} are also\n * set.\n *\n * **It is strongly recommended to set a `max` to prevent unbounded growth\n * of the cache.**\n */\n max?: Count\n\n /**\n * Max time in milliseconds for items to live in cache before they are\n * considered stale. Note that stale items are NOT preemptively removed by\n * default, and MAY live in the cache, contributing to its LRU max, long\n * after they have expired, unless {@link OptionsBase.ttlAutopurge} is\n * set.\n *\n * If set to `0` (the default value), then that means \"do not track\n * TTL\", not \"expire immediately\".\n *\n * Also, as this cache is optimized for LRU/MRU operations, some of\n * the staleness/TTL checks will reduce performance, as they will incur\n * overhead by deleting items.\n *\n * This is not primarily a TTL cache, and does not make strong TTL\n * guarantees. There is no pre-emptive pruning of expired items, but you\n * _may_ set a TTL on the cache, and it will treat expired items as missing\n * when they are fetched, and delete them.\n *\n * Optional, but must be a non-negative integer in ms if specified.\n *\n * This may be overridden by passing an options object to `cache.set()`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if ttl tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * If ttl tracking is enabled, and `max` and `maxSize` are not set,\n * and `ttlAutopurge` is not set, then a warning will be emitted\n * cautioning about the potential for unbounded memory consumption.\n * (The TypeScript definitions will also discourage this.)\n */\n ttl?: Milliseconds\n\n /**\n * Minimum amount of time in ms in which to check for staleness.\n * Defaults to 1, which means that the current time is checked\n * at most once per millisecond.\n *\n * Set to 0 to check the current time every time staleness is tested.\n * (This reduces performance, and is theoretically unnecessary.)\n *\n * Setting this to a higher value will improve performance somewhat\n * while using ttl tracking, albeit at the expense of keeping stale\n * items around a bit longer than their TTLs would indicate.\n *\n * @default 1\n */\n ttlResolution?: Milliseconds\n\n /**\n * Preemptively remove stale items from the cache.\n *\n * Note that this may *significantly* degrade performance, especially if\n * the cache is storing a large number of items. It is almost always best\n * to just leave the stale items in the cache, and let them fall out as new\n * items are added.\n *\n * Note that this means that {@link OptionsBase.allowStale} is a bit\n * pointless, as stale items will be deleted almost as soon as they\n * expire.\n *\n * Use with caution!\n */\n ttlAutopurge?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever it is retrieved from cache with\n * {@link LRUCache#get}, causing it to not expire. (It can still fall out\n * of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n */\n updateAgeOnGet?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever its presence in the cache is\n * checked with {@link LRUCache#has}, causing it to not expire. (It can\n * still fall out of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n */\n updateAgeOnHas?: boolean\n\n /**\n * Allow {@link LRUCache#get} and {@link LRUCache#fetch} calls to return\n * stale data, if available.\n *\n * By default, if you set `ttl`, stale items will only be deleted from the\n * cache when you `get(key)`. That is, it's not preemptively pruning items,\n * unless {@link OptionsBase.ttlAutopurge} is set.\n *\n * If you set `allowStale:true`, it'll return the stale value *as well as*\n * deleting it. If you don't set this, then it'll return `undefined` when\n * you try to get a stale entry.\n *\n * Note that when a stale entry is fetched, _even if it is returned due to\n * `allowStale` being set_, it is removed from the cache immediately. You\n * can suppress this behavior by setting\n * {@link OptionsBase.noDeleteOnStaleGet}, either in the constructor, or in\n * the options provided to {@link LRUCache#get}.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n * The `cache.has()` method will always return `false` for stale items.\n *\n * Only relevant if a ttl is set.\n */\n allowStale?: boolean\n\n /**\n * Function that is called on items when they are dropped from the\n * cache, as `dispose(value, key, reason)`.\n *\n * This can be handy if you want to close file descriptors or do\n * other cleanup tasks when items are no longer stored in the cache.\n *\n * **NOTE**: It is called _before_ the item has been fully removed\n * from the cache, so if you want to put it right back in, you need\n * to wait until the next tick. If you try to add it back in during\n * the `dispose()` function call, it will break things in subtle and\n * weird ways.\n *\n * Unlike several other options, this may _not_ be overridden by\n * passing an option to `set()`, for performance reasons.\n *\n * The `reason` will be one of the following strings, corresponding\n * to the reason for the item's deletion:\n *\n * - `evict` Item was evicted to make space for a new addition\n * - `set` Item was overwritten by a new value\n * - `expire` Item expired its TTL\n * - `fetch` Item was deleted due to a failed or aborted fetch, or a\n * fetchMethod returning `undefined.\n * - `delete` Item was removed by explicit `cache.delete(key)`,\n * `cache.clear()`, or `cache.set(key, undefined)`.\n */\n dispose?: Disposer\n\n /**\n * Function that is called when new items are inserted into the cache,\n * as `onInsert(value, key, reason)`.\n *\n * This can be useful if you need to perform actions when an item is\n * added, such as logging or tracking insertions.\n *\n * Unlike some other options, this may _not_ be overridden by passing\n * an option to `set()`, for performance and consistency reasons.\n */\n onInsert?: Inserter\n\n /**\n * The same as {@link OptionsBase.dispose}, but called *after* the entry\n * is completely removed and the cache is once again in a clean state.\n *\n * It is safe to add an item right back into the cache at this point.\n * However, note that it is *very* easy to inadvertently create infinite\n * recursion this way.\n */\n disposeAfter?: Disposer\n\n /**\n * Set to true to suppress calling the\n * {@link OptionsBase.dispose} function if the entry key is\n * still accessible within the cache.\n *\n * This may be overridden by passing an options object to\n * {@link LRUCache#set}.\n *\n * Only relevant if `dispose` or `disposeAfter` are set.\n */\n noDisposeOnSet?: boolean\n\n /**\n * Boolean flag to tell the cache to not update the TTL when setting a new\n * value for an existing key (ie, when updating a value rather than\n * inserting a new value). Note that the TTL value is _always_ set (if\n * provided) when adding a new entry into the cache.\n *\n * Has no effect if a {@link OptionsBase.ttl} is not set.\n *\n * May be passed as an option to {@link LRUCache#set}.\n */\n noUpdateTTL?: boolean\n\n /**\n * Set to a positive integer to track the sizes of items added to the\n * cache, and automatically evict items in order to stay below this size.\n * Note that this may result in fewer than `max` items being stored.\n *\n * Attempting to add an item to the cache whose calculated size is greater\n * that this amount will be a no-op. The item will not be cached, and no\n * other items will be evicted.\n *\n * Optional, must be a positive integer if provided.\n *\n * Sets `maxEntrySize` to the same value, unless a different value is\n * provided for `maxEntrySize`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if size tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * Note also that size tracking can negatively impact performance,\n * though for most cases, only minimally.\n */\n maxSize?: Size\n\n /**\n * The effective size for background fetch promises.\n *\n * This has no effect unless `maxSize` and `sizeCalculation` are used,\n * and a {@link LRUCache.OptionsBase.fetchMethod} is provided to\n * support {@link LRUCache#fetch}.\n *\n * If a stale value is present in the cache, then the effective size of\n * the background fetch is the size of the stale item it will eventually\n * replace. If not, then this value is used as its effective size.\n *\n * @default 1\n */\n backgroundFetchSize?: number\n\n /**\n * The maximum allowed size for any single item in the cache.\n *\n * If a larger item is passed to {@link LRUCache#set} or returned by a\n * {@link OptionsBase.fetchMethod} or {@link OptionsBase.memoMethod}, then\n * it will not be stored in the cache.\n *\n * Attempting to add an item whose calculated size is greater than\n * this amount will not cache the item or evict any old items, but\n * WILL delete an existing value if one is already present.\n *\n * Optional, must be a positive integer if provided. Defaults to\n * the value of `maxSize` if provided.\n */\n maxEntrySize?: Size\n\n /**\n * A function that returns a number indicating the item's size.\n *\n * Requires {@link OptionsBase.maxSize} to be set.\n *\n * If not provided, and {@link OptionsBase.maxSize} or\n * {@link OptionsBase.maxEntrySize} are set, then all\n * {@link LRUCache#set} calls **must** provide an explicit\n * {@link SetOptions.size} or sizeCalculation param.\n */\n sizeCalculation?: SizeCalculator\n\n /**\n * Method that provides the implementation for {@link LRUCache#fetch}\n *\n * ```ts\n * fetchMethod(key, staleValue, { signal, options, context })\n * ```\n *\n * If `fetchMethod` is not provided, then `cache.fetch(key)` is equivalent\n * to `Promise.resolve(cache.get(key))`.\n *\n * If at any time, `signal.aborted` is set to `true`, or if the\n * `signal.onabort` method is called, or if it emits an `'abort'` event\n * which you can listen to with `addEventListener`, then that means that\n * the fetch should be abandoned. This may be passed along to async\n * functions aware of AbortController/AbortSignal behavior.\n *\n * The `fetchMethod` should **only** return `undefined` or a Promise\n * resolving to `undefined` if the AbortController signaled an `abort`\n * event. In all other cases, it should return or resolve to a value\n * suitable for adding to the cache.\n *\n * The `options` object is a union of the options that may be provided to\n * `set()` and `get()`. If they are modified, then that will result in\n * modifying the settings to `cache.set()` when the value is resolved, and\n * in the case of\n * {@link OptionsBase.noDeleteOnFetchRejection} and\n * {@link OptionsBase.allowStaleOnFetchRejection}, the handling of\n * `fetchMethod` failures.\n *\n * For example, a DNS cache may update the TTL based on the value returned\n * from a remote DNS server by changing `options.ttl` in the `fetchMethod`.\n */\n fetchMethod?: Fetcher\n\n /**\n * Method that provides the implementation for {@link LRUCache#memo}\n */\n memoMethod?: Memoizer\n\n /**\n * Set to true to suppress the deletion of stale data when a\n * {@link OptionsBase.fetchMethod} returns a rejected promise.\n */\n noDeleteOnFetchRejection?: boolean\n\n /**\n * Do not delete stale items when they are retrieved with\n * {@link LRUCache#get}.\n *\n * Note that the `get` return value will still be `undefined`\n * unless {@link OptionsBase.allowStale} is true.\n *\n * When using time-expiring entries with `ttl`, by default stale\n * items will be removed from the cache when the key is accessed\n * with `cache.get()`.\n *\n * Setting this option will cause stale items to remain in the cache, until\n * they are explicitly deleted with `cache.delete(key)`, or retrieved with\n * `noDeleteOnStaleGet` set to `false`.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n *\n * Only relevant if a ttl is used.\n */\n noDeleteOnStaleGet?: boolean\n\n /**\n * Set to true to allow returning stale data when a\n * {@link OptionsBase.fetchMethod} throws an error or returns a rejected\n * promise.\n *\n * This differs from using {@link OptionsBase.allowStale} in that stale\n * data will ONLY be returned in the case that the {@link LRUCache#fetch}\n * fails, not any other times.\n *\n * If a `fetchMethod` fails, and there is no stale value available, the\n * `fetch()` will resolve to `undefined`. Ie, all `fetchMethod` errors are\n * suppressed.\n *\n * Implies `noDeleteOnFetchRejection`.\n *\n * This may be set in calls to `fetch()`, or defaulted on the constructor,\n * or overridden by modifying the options object in the `fetchMethod`.\n */\n allowStaleOnFetchRejection?: boolean\n\n /**\n * Set to true to return a stale value from the cache when the\n * `AbortSignal` passed to the {@link OptionsBase.fetchMethod} dispatches\n * an `'abort'` event, whether user-triggered, or due to internal cache\n * behavior.\n *\n * Unless {@link OptionsBase.ignoreFetchAbort} is also set, the underlying\n * {@link OptionsBase.fetchMethod} will still be considered canceled, and\n * any value it returns will be ignored and not cached.\n *\n * Caveat: since fetches are aborted when a new value is explicitly\n * set in the cache, this can lead to fetch returning a stale value,\n * since that was the fallback value _at the moment the `fetch()` was\n * initiated_, even though the new updated value is now present in\n * the cache.\n *\n * For example:\n *\n * ```ts\n * const cache = new LRUCache({\n * ttl: 100,\n * fetchMethod: async (url, oldValue, { signal }) => {\n * const res = await fetch(url, { signal })\n * return await res.json()\n * }\n * })\n * cache.set('https://example.com/', { some: 'data' })\n * // 100ms go by...\n * const result = cache.fetch('https://example.com/')\n * cache.set('https://example.com/', { other: 'thing' })\n * console.log(await result) // { some: 'data' }\n * console.log(cache.get('https://example.com/')) // { other: 'thing' }\n * ```\n */\n allowStaleOnFetchAbort?: boolean\n\n /**\n * Set to true to ignore the `abort` event emitted by the `AbortSignal`\n * object passed to {@link OptionsBase.fetchMethod}, and still cache the\n * resulting resolution value, as long as it is not `undefined`.\n *\n * When used on its own, this means aborted {@link LRUCache#fetch} calls\n * are not immediately resolved or rejected when they are aborted, and\n * instead take the full time to await.\n *\n * When used with {@link OptionsBase.allowStaleOnFetchAbort}, aborted\n * {@link LRUCache#fetch} calls will resolve immediately to their stale\n * cached value or `undefined`, and will continue to process and eventually\n * update the cache when they resolve, as long as the resulting value is\n * not `undefined`, thus supporting a \"return stale on timeout while\n * refreshing\" mechanism by passing `AbortSignal.timeout(n)` as the signal.\n *\n * For example:\n *\n * ```ts\n * const c = new LRUCache({\n * ttl: 100,\n * ignoreFetchAbort: true,\n * allowStaleOnFetchAbort: true,\n * fetchMethod: async (key, oldValue, { signal }) => {\n * // note: do NOT pass the signal to fetch()!\n * // let's say this fetch can take a long time.\n * const res = await fetch(`https://slow-backend-server/${key}`)\n * return await res.json()\n * },\n * })\n *\n * // this will return the stale value after 100ms, while still\n * // updating in the background for next time.\n * const val = await c.fetch('key', { signal: AbortSignal.timeout(100) })\n * ```\n *\n * **Note**: regardless of this setting, an `abort` event _is still\n * emitted on the `AbortSignal` object_, so may result in invalid results\n * when passed to other underlying APIs that use AbortSignals.\n *\n * This may be overridden in the {@link OptionsBase.fetchMethod} or the\n * call to {@link LRUCache#fetch}.\n */\n ignoreFetchAbort?: boolean\n\n /**\n * In some cases, you may want to swap out the performance/Date object\n * used for TTL tracking. This should almost certainly NOT be done in\n * production environments!\n *\n * This value defaults to `global.performance` if it has a `now()` method,\n * or the `global.Date` object otherwise.\n */\n perf?: Perf\n }\n\n export interface OptionsMaxLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n max: Count\n }\n export interface OptionsTTLLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n ttl: Milliseconds\n ttlAutopurge: boolean\n }\n export interface OptionsSizeLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n maxSize: Size\n }\n\n /**\n * The valid safe options for the {@link LRUCache} constructor\n */\n export type Options =\n | OptionsMaxLimit\n | OptionsSizeLimit\n | OptionsTTLLimit\n\n /**\n * Entry objects used by {@link LRUCache#load} and {@link LRUCache#dump},\n * and returned by {@link LRUCache#info}.\n */\n export interface Entry {\n value: V\n ttl?: Milliseconds\n size?: Size\n start?: Milliseconds\n }\n}\n\n/**\n * Default export, the thing you're using this module to get.\n *\n * The `K` and `V` types define the key and value types, respectively. The\n * optional `FC` type defines the type of the `context` object passed to\n * `cache.fetch()` and `cache.memo()`.\n *\n * Keys and values **must not** be `null` or `undefined`.\n *\n * All properties from the options object (with the exception of `max`,\n * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are\n * added as normal public members. (The listed options are read-only getters.)\n *\n * Changing any of these will alter the defaults for subsequent method calls.\n */\nexport class LRUCache {\n // options that cannot be changed without disaster\n readonly #max: LRUCache.Count\n readonly #maxSize: LRUCache.Size\n readonly #dispose?: LRUCache.Disposer\n readonly #onInsert?: LRUCache.Inserter\n readonly #disposeAfter?: LRUCache.Disposer\n readonly #fetchMethod?: LRUCache.Fetcher\n readonly #memoMethod?: LRUCache.Memoizer\n readonly #perf: Perf\n\n /**\n * {@link LRUCache.OptionsBase.perf}\n */\n get perf() {\n return this.#perf\n }\n\n /**\n * {@link LRUCache.OptionsBase.ttl}\n */\n ttl: LRUCache.Milliseconds\n\n /**\n * {@link LRUCache.OptionsBase.ttlResolution}\n */\n ttlResolution: LRUCache.Milliseconds\n /**\n * {@link LRUCache.OptionsBase.ttlAutopurge}\n */\n ttlAutopurge: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnGet}\n */\n updateAgeOnGet: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnHas}\n */\n updateAgeOnHas: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStale}\n */\n allowStale: boolean\n\n /**\n * {@link LRUCache.OptionsBase.noDisposeOnSet}\n */\n noDisposeOnSet: boolean\n /**\n * {@link LRUCache.OptionsBase.noUpdateTTL}\n */\n noUpdateTTL: boolean\n /**\n * {@link LRUCache.OptionsBase.maxEntrySize}\n */\n maxEntrySize: LRUCache.Size\n /**\n * {@link LRUCache.OptionsBase.sizeCalculation}\n */\n sizeCalculation?: LRUCache.SizeCalculator\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection}\n */\n noDeleteOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnStaleGet}\n */\n noDeleteOnStaleGet: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}\n */\n allowStaleOnFetchAbort: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection}\n */\n allowStaleOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.ignoreFetchAbort}\n */\n ignoreFetchAbort: boolean\n\n /** {@link LRUCache.OptionsBase.backgroundFetchSize} */\n backgroundFetchSize: number\n\n // computed properties\n #size: LRUCache.Count\n #calculatedSize: LRUCache.Size\n #keyMap: Map\n #keyList: (K | undefined)[]\n #valList: (V | BackgroundFetch | undefined)[]\n #next: NumberArray\n #prev: NumberArray\n #head: Index\n #tail: Index\n #free: StackLike\n #disposed?: DisposeTask[]\n #sizes?: ZeroArray\n #starts?: ZeroArray\n #ttls?: ZeroArray\n #autopurgeTimers?: (undefined | ReturnType)[]\n\n #hasDispose: boolean\n #hasFetchMethod: boolean\n #hasDisposeAfter: boolean\n #hasOnInsert: boolean\n\n /**\n * Do not call this method unless you need to inspect the\n * inner workings of the cache. If anything returned by this\n * object is modified in any way, strange breakage may occur.\n *\n * These fields are private for a reason!\n *\n * @internal\n */\n static unsafeExposeInternals<\n K extends {},\n V extends {},\n FC extends unknown = unknown,\n >(c: LRUCache) {\n return {\n // properties\n starts: c.#starts,\n ttls: c.#ttls,\n autopurgeTimers: c.#autopurgeTimers,\n sizes: c.#sizes,\n keyMap: c.#keyMap as Map,\n keyList: c.#keyList,\n valList: c.#valList,\n next: c.#next,\n prev: c.#prev,\n get head() {\n return c.#head\n },\n get tail() {\n return c.#tail\n },\n free: c.#free,\n // methods\n isBackgroundFetch: (p: unknown) => c.#isBackgroundFetch(p),\n backgroundFetch: (\n k: K,\n index: number | undefined,\n options: LRUCache.FetchOptions,\n context: unknown,\n ): BackgroundFetch =>\n c.#backgroundFetch(\n k,\n index as Index | undefined,\n options,\n context as FC,\n ),\n moveToTail: (index: number): void => c.#moveToTail(index as Index),\n indexes: (options?: { allowStale: boolean }) => c.#indexes(options),\n rindexes: (options?: { allowStale: boolean }) =>\n c.#rindexes(options),\n isStale: (index: number | undefined) => c.#isStale(index as Index),\n }\n }\n\n // Protected read-only members\n\n /**\n * {@link LRUCache.OptionsBase.max} (read-only)\n */\n get max(): LRUCache.Count {\n return this.#max\n }\n /**\n * {@link LRUCache.OptionsBase.maxSize} (read-only)\n */\n get maxSize(): LRUCache.Count {\n return this.#maxSize\n }\n /**\n * The total computed size of items in the cache (read-only)\n */\n get calculatedSize(): LRUCache.Size {\n return this.#calculatedSize\n }\n /**\n * The number of items stored in the cache (read-only)\n */\n get size(): LRUCache.Count {\n return this.#size\n }\n /**\n * {@link LRUCache.OptionsBase.fetchMethod} (read-only)\n */\n get fetchMethod(): LRUCache.Fetcher | undefined {\n return this.#fetchMethod\n }\n get memoMethod(): LRUCache.Memoizer | undefined {\n return this.#memoMethod\n }\n /**\n * {@link LRUCache.OptionsBase.dispose} (read-only)\n */\n get dispose() {\n return this.#dispose\n }\n /**\n * {@link LRUCache.OptionsBase.onInsert} (read-only)\n */\n get onInsert() {\n return this.#onInsert\n }\n /**\n * {@link LRUCache.OptionsBase.disposeAfter} (read-only)\n */\n get disposeAfter() {\n return this.#disposeAfter\n }\n\n constructor(options: LRUCache.Options | LRUCache) {\n const {\n max = 0,\n ttl,\n ttlResolution = 1,\n ttlAutopurge,\n updateAgeOnGet,\n updateAgeOnHas,\n allowStale,\n dispose,\n onInsert,\n disposeAfter,\n noDisposeOnSet,\n noUpdateTTL,\n maxSize = 0,\n maxEntrySize = 0,\n sizeCalculation,\n fetchMethod,\n memoMethod,\n noDeleteOnFetchRejection,\n noDeleteOnStaleGet,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n backgroundFetchSize = 1,\n perf,\n } = options\n\n this.backgroundFetchSize = backgroundFetchSize\n\n if (perf !== undefined) {\n if (typeof perf?.now !== 'function') {\n throw new TypeError(\n 'perf option must have a now() method if specified',\n )\n }\n }\n\n this.#perf = perf ?? defaultPerf\n\n if (max !== 0 && !isPosInt(max)) {\n throw new TypeError('max option must be a nonnegative integer')\n }\n\n const UintArray = max ? getUintArray(max) : Array\n if (!UintArray) {\n throw new Error('invalid max value: ' + max)\n }\n\n this.#max = max\n this.#maxSize = maxSize\n this.maxEntrySize = maxEntrySize || this.#maxSize\n this.sizeCalculation = sizeCalculation\n if (this.sizeCalculation) {\n if (!this.#maxSize && !this.maxEntrySize) {\n throw new TypeError(\n 'cannot set sizeCalculation without setting maxSize or maxEntrySize',\n )\n }\n if (typeof this.sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation set to non-function')\n }\n }\n\n if (memoMethod !== undefined && typeof memoMethod !== 'function') {\n throw new TypeError('memoMethod must be a function if defined')\n }\n this.#memoMethod = memoMethod\n\n if (fetchMethod !== undefined && typeof fetchMethod !== 'function') {\n throw new TypeError('fetchMethod must be a function if specified')\n }\n this.#fetchMethod = fetchMethod\n this.#hasFetchMethod = !!fetchMethod\n\n this.#keyMap = new Map()\n this.#keyList = Array.from({ length: max }).fill(undefined) as (\n | K\n | undefined\n )[]\n this.#valList = Array.from({ length: max }).fill(undefined) as (\n | V\n | undefined\n )[]\n this.#next = new UintArray(max)\n this.#prev = new UintArray(max)\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free = Stack.create(max)\n this.#size = 0\n this.#calculatedSize = 0\n\n if (typeof dispose === 'function') {\n this.#dispose = dispose\n }\n if (typeof onInsert === 'function') {\n this.#onInsert = onInsert\n }\n if (typeof disposeAfter === 'function') {\n this.#disposeAfter = disposeAfter\n this.#disposed = []\n } else {\n this.#disposeAfter = undefined\n this.#disposed = undefined\n }\n this.#hasDispose = !!this.#dispose\n this.#hasOnInsert = !!this.#onInsert\n this.#hasDisposeAfter = !!this.#disposeAfter\n\n this.noDisposeOnSet = !!noDisposeOnSet\n this.noUpdateTTL = !!noUpdateTTL\n this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection\n this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection\n this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort\n this.ignoreFetchAbort = !!ignoreFetchAbort\n\n // NB: maxEntrySize is set to maxSize if it's set\n if (this.maxEntrySize !== 0) {\n if (this.#maxSize !== 0) {\n if (!isPosInt(this.#maxSize)) {\n throw new TypeError(\n 'maxSize must be a positive integer if specified',\n )\n }\n }\n if (!isPosInt(this.maxEntrySize)) {\n throw new TypeError(\n 'maxEntrySize must be a positive integer if specified',\n )\n }\n this.#initializeSizeTracking()\n }\n\n this.allowStale = !!allowStale\n this.noDeleteOnStaleGet = !!noDeleteOnStaleGet\n this.updateAgeOnGet = !!updateAgeOnGet\n this.updateAgeOnHas = !!updateAgeOnHas\n this.ttlResolution =\n isPosInt(ttlResolution) || ttlResolution === 0 ? ttlResolution : 1\n this.ttlAutopurge = !!ttlAutopurge\n this.ttl = ttl || 0\n if (this.ttl) {\n if (!isPosInt(this.ttl)) {\n throw new TypeError('ttl must be a positive integer if specified')\n }\n this.#initializeTTLTracking()\n }\n\n // do not allow completely unbounded caches\n if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) {\n throw new TypeError(\n 'At least one of max, maxSize, or ttl is required',\n )\n }\n if (!this.ttlAutopurge && !this.#max && !this.#maxSize) {\n const code = 'LRU_CACHE_UNBOUNDED'\n if (shouldWarn(code)) {\n warned.add(code)\n const msg =\n 'TTL caching without ttlAutopurge, max, or maxSize can ' +\n 'result in unbounded memory consumption.'\n emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache)\n }\n }\n }\n\n /**\n * Return the number of ms left in the item's TTL. If item is not in cache,\n * returns `0`. Returns `Infinity` if item is in cache without a defined TTL.\n */\n getRemainingTTL(key: K) {\n return this.#keyMap.has(key) ? Infinity : 0\n }\n\n #initializeTTLTracking() {\n const ttls = new ZeroArray(this.#max)\n const starts = new ZeroArray(this.#max)\n this.#ttls = ttls\n this.#starts = starts\n const purgeTimers =\n this.ttlAutopurge ?\n Array.from>({\n length: this.#max,\n })\n : undefined\n this.#autopurgeTimers = purgeTimers\n\n this.#setItemTTL = (index, ttl, start = this.#perf.now()) => {\n starts[index] = ttl !== 0 ? start : 0\n ttls[index] = ttl\n setPurgetTimer(index, ttl)\n }\n\n this.#updateItemAge = index => {\n starts[index] = ttls[index] !== 0 ? this.#perf.now() : 0\n setPurgetTimer(index, ttls[index])\n }\n\n // clear out the purge timer if we're setting TTL to 0, and\n // previously had a ttl purge timer running, so it doesn't\n // fire unnecessarily. Don't need to do this if we're not doing\n // autopurge.\n const setPurgetTimer =\n !this.ttlAutopurge ?\n () => {}\n : (index: Index, ttl?: number) => {\n if (purgeTimers?.[index]) {\n clearTimeout(purgeTimers[index])\n purgeTimers[index] = undefined\n }\n if (ttl && ttl !== 0 && purgeTimers) {\n const t = setTimeout(() => {\n if (this.#isStale(index)) {\n this.#delete(this.#keyList[index] as K, 'expire')\n }\n }, ttl + 1)\n // unref() not supported on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n purgeTimers[index] = t\n }\n }\n\n this.#statusTTL = (status, index) => {\n if (ttls[index]) {\n const ttl = ttls[index]\n const start = starts[index]\n /* c8 ignore start */\n if (!ttl || !start) {\n return\n }\n /* c8 ignore stop */\n status.ttl = ttl\n status.start = start\n status.now = cachedNow || getNow()\n const age = status.now - start\n status.remainingTTL = ttl - age\n }\n }\n\n // debounce calls to perf.now() to 1s so we're not hitting\n // that costly call repeatedly.\n let cachedNow = 0\n const getNow = () => {\n const n = this.#perf.now()\n if (this.ttlResolution > 0) {\n cachedNow = n\n const t = setTimeout(() => (cachedNow = 0), this.ttlResolution)\n // not available on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n }\n return n\n }\n\n this.getRemainingTTL = key => {\n const index = this.#keyMap.get(key)\n if (index === undefined) {\n return 0\n }\n const ttl = ttls[index]\n const start = starts[index]\n if (!ttl || !start) {\n return Infinity\n }\n const age = (cachedNow || getNow()) - start\n return ttl - age\n }\n\n this.#isStale = index => {\n const s = starts[index]\n const t = ttls[index]\n return !!t && !!s && (cachedNow || getNow()) - s > t\n }\n }\n\n // conditionally set private methods related to TTL\n #updateItemAge: (index: Index) => void = () => {}\n #statusTTL: (status: LRUCache.Status, index: Index) => void =\n () => {}\n #setItemTTL: (\n index: Index,\n ttl: LRUCache.Milliseconds,\n start?: LRUCache.Milliseconds,\n // ignore because we never call this if we're not already in TTL mode\n /* c8 ignore start */\n ) => void = () => {}\n /* c8 ignore stop */\n\n #isStale: (index: Index) => boolean = () => false\n\n #initializeSizeTracking() {\n const sizes = new ZeroArray(this.#max)\n this.#calculatedSize = 0\n this.#sizes = sizes\n this.#removeItemSize = index => {\n this.#calculatedSize -= sizes[index] as number\n sizes[index] = 0\n }\n this.#requireSize = (k, v, size, sizeCalculation) => {\n if (!isPosInt(size)) {\n // provisionally accept background fetches.\n // actual value size will be checked when they return.\n if (this.#isBackgroundFetch(v)) {\n // NB: this cannot occur if v.__staleWhileFetching is set,\n // because in that case, it would take on the size of the\n // existing entry that it temporarily replaces.\n return this.backgroundFetchSize\n }\n if (sizeCalculation) {\n if (typeof sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation must be a function')\n }\n size = sizeCalculation(v, k)\n if (!isPosInt(size)) {\n throw new TypeError(\n 'sizeCalculation return invalid (expect positive integer)',\n )\n }\n } else {\n throw new TypeError(\n 'invalid size value (must be positive integer). ' +\n 'When maxSize or maxEntrySize is used, sizeCalculation ' +\n 'or size must be set.',\n )\n }\n }\n return size\n }\n\n this.#addItemSize = (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status,\n ) => {\n sizes[index] = size\n if (this.#maxSize) {\n const maxSize = this.#maxSize - sizes[index]\n while (this.#calculatedSize > maxSize) {\n this.#evict(true)\n }\n }\n this.#calculatedSize += sizes[index]\n if (status) {\n status.entrySize = size\n status.totalCalculatedSize = this.#calculatedSize\n }\n }\n }\n\n #removeItemSize: (index: Index) => void = _i => {}\n\n #addItemSize: (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status,\n ) => void = (_i, _s, _st) => {}\n\n #requireSize: (\n k: K,\n v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator,\n status?: LRUCache.Status,\n ) => LRUCache.Size = (\n _k: K,\n _v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator,\n ) => {\n if (size || sizeCalculation) {\n throw new TypeError(\n 'cannot set size without setting maxSize or maxEntrySize on cache',\n )\n }\n return 0\n };\n\n *#indexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#tail; this.#isValidIndex(i); ) {\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#head) {\n break\n } else {\n i = this.#prev[i] as Index\n }\n }\n }\n }\n\n *#rindexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#head; this.#isValidIndex(i); ) {\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#tail) {\n break\n } else {\n i = this.#next[i] as Index\n }\n }\n }\n }\n\n #isValidIndex(index: Index) {\n return (\n index !== undefined &&\n this.#keyMap.get(this.#keyList[index] as K) === index\n )\n }\n\n /**\n * Return a generator yielding `[key, value]` pairs,\n * in order from most recently used to least recently used.\n */\n *entries() {\n for (const i of this.#indexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]] as [K, V]\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.entries}\n *\n * Return a generator yielding `[key, value]` pairs,\n * in order from least recently used to most recently used.\n */\n *rentries() {\n for (const i of this.#rindexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]]\n }\n }\n }\n\n /**\n * Return a generator yielding the keys in the cache,\n * in order from most recently used to least recently used.\n */\n *keys() {\n for (const i of this.#indexes()) {\n const k = this.#keyList[i]\n if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield k\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.keys}\n *\n * Return a generator yielding the keys in the cache,\n * in order from least recently used to most recently used.\n */\n *rkeys() {\n for (const i of this.#rindexes()) {\n const k = this.#keyList[i]\n if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield k\n }\n }\n }\n\n /**\n * Return a generator yielding the values in the cache,\n * in order from most recently used to least recently used.\n */\n *values() {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i] as V\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.values}\n *\n * Return a generator yielding the values in the cache,\n * in order from least recently used to most recently used.\n */\n *rvalues() {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i]\n }\n }\n }\n\n /**\n * Iterating over the cache itself yields the same results as\n * {@link LRUCache.entries}\n */\n [Symbol.iterator]() {\n return this.entries()\n }\n\n /**\n * A String value that is used in the creation of the default string\n * description of an object. Called by the built-in method\n * `Object.prototype.toString`.\n */\n [Symbol.toStringTag] = 'LRUCache'\n\n /**\n * Find a value for which the supplied fn method returns a truthy value,\n * similar to `Array.find()`. fn is called as `fn(value, key, cache)`.\n */\n find(\n fn: (v: V, k: K, self: LRUCache) => boolean,\n getOptions: LRUCache.GetOptions = {},\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n if (fn(value, this.#keyList[i] as K, this)) {\n return this.#get(this.#keyList[i] as K, getOptions)\n }\n }\n }\n\n /**\n * Call the supplied function on each item in the cache, in order from most\n * recently used to least recently used.\n *\n * `fn` is called as `fn(value, key, cache)`.\n *\n * If `thisp` is provided, function will be called in the `this`-context of\n * the provided object, or the cache if no `thisp` object is provided.\n *\n * Does not update age or recenty of use, or iterate over stale values.\n */\n forEach(\n fn: (v: V, k: K, self: LRUCache) => unknown,\n thisp: unknown = this,\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * The same as {@link LRUCache.forEach} but items are iterated over in\n * reverse order. (ie, less recently used items are iterated over first.)\n */\n rforEach(\n fn: (v: V, k: K, self: LRUCache) => unknown,\n thisp: unknown = this,\n ) {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * Delete any stale entries. Returns true if anything was removed,\n * false otherwise.\n */\n purgeStale() {\n let deleted = false\n for (const i of this.#rindexes({ allowStale: true })) {\n if (this.#isStale(i)) {\n this.#delete(this.#keyList[i] as K, 'expire')\n deleted = true\n }\n }\n return deleted\n }\n\n /**\n * Get the extended info about a given entry, to get its value, size, and\n * TTL info simultaneously. Returns `undefined` if the key is not present.\n *\n * Unlike {@link LRUCache#dump}, which is designed to be portable and survive\n * serialization, the `start` value is always the current timestamp, and the\n * `ttl` is a calculated remaining time to live (negative if expired).\n *\n * Always returns stale values, if their info is found in the cache, so be\n * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl})\n * if relevant.\n */\n info(key: K): LRUCache.Entry | undefined {\n const i = this.#keyMap.get(key)\n if (i === undefined) return undefined\n const v = this.#valList[i]\n /* c8 ignore start - this isn't tested for the info function,\n * but it's the same logic as found in other places. */\n const value: V | undefined =\n this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) return undefined\n /* c8 ignore stop */\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n const ttl = this.#ttls[i]\n const start = this.#starts[i]\n if (ttl && start) {\n const remain = ttl - (this.#perf.now() - start)\n entry.ttl = remain\n entry.start = Date.now()\n }\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n return entry\n }\n\n /**\n * Return an array of [key, {@link LRUCache.Entry}] tuples which can be\n * passed to {@link LRUCache#load}.\n *\n * The `start` fields are calculated relative to a portable `Date.now()`\n * timestamp, even if `performance.now()` is available.\n *\n * Stale entries are always included in the `dump`, even if\n * {@link LRUCache.OptionsBase.allowStale} is false.\n *\n * Note: this returns an actual array, not a generator, so it can be more\n * easily passed around.\n */\n dump() {\n const arr: [K, LRUCache.Entry][] = []\n for (const i of this.#indexes({ allowStale: true })) {\n const key = this.#keyList[i]\n const v = this.#valList[i]\n const value: V | undefined =\n this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined || key === undefined) continue\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n entry.ttl = this.#ttls[i]\n // always dump the start relative to a portable timestamp\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = this.#perf.now() - (this.#starts[i] as number)\n entry.start = Math.floor(Date.now() - age)\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n arr.unshift([key, entry])\n }\n return arr\n }\n\n /**\n * Reset the cache and load in the items in entries in the order listed.\n *\n * The shape of the resulting cache may be different if the same options are\n * not used in both caches.\n *\n * The `start` fields are assumed to be calculated relative to a portable\n * `Date.now()` timestamp, even if `performance.now()` is available.\n */\n load(arr: [K, LRUCache.Entry][]) {\n this.clear()\n for (const [key, entry] of arr) {\n if (entry.start) {\n // entry.start is a portable timestamp, but we may be using\n // node's performance.now(), so calculate the offset, so that\n // we get the intended remaining TTL, no matter how long it's\n // been on ice.\n //\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = Date.now() - entry.start\n entry.start = this.#perf.now() - age\n }\n this.#set(key, entry.value, entry)\n }\n }\n\n /**\n * Add a value to the cache.\n *\n * Note: if `undefined` is specified as a value, this is an alias for\n * {@link LRUCache#delete}\n *\n * Fields on the {@link LRUCache.SetOptions} options param will override\n * their corresponding values in the constructor options for the scope\n * of this single `set()` operation.\n *\n * If `start` is provided, then that will set the effective start\n * time for the TTL calculation. Note that this must be a previous\n * value of `performance.now()` if supported, or a previous value of\n * `Date.now()` if not.\n *\n * Options object may also include `size`, which will prevent\n * calling the `sizeCalculation` function and just use the specified\n * number if it is a positive integer, and `noDisposeOnSet` which\n * will prevent calling a `dispose` function in the case of\n * overwrites.\n *\n * If the `size` (or return value of `sizeCalculation`) for a given\n * entry is greater than `maxEntrySize`, then the item will not be\n * added to the cache.\n *\n * Will update the recency of the entry.\n *\n * If the value is `undefined`, then this is an alias for\n * `cache.delete(key)`. `undefined` is never stored in the cache.\n */\n set(\n k: K,\n v: V | undefined,\n setOptions: LRUCache.SetOptions = {},\n ) {\n const { status = metrics.hasSubscribers ? {} : undefined } = setOptions\n setOptions.status = status\n if (status) {\n status.op = 'set'\n status.key = k\n if (v !== undefined) status.value = v\n status.cache = this\n }\n const result = this.#set(k, v, setOptions)\n if (status && metrics.hasSubscribers) {\n metrics.publish(status)\n }\n return result\n }\n\n #set(\n k: K,\n v: V | BackgroundFetch | undefined,\n setOptions: LRUCache.SetOptions,\n bf?: BackgroundFetch,\n ) {\n const {\n ttl = this.ttl,\n start,\n noDisposeOnSet = this.noDisposeOnSet,\n sizeCalculation = this.sizeCalculation,\n status,\n } = setOptions\n\n const isBF = this.#isBackgroundFetch(v)\n if (v === undefined) {\n if (status) status.set = 'deleted'\n this.delete(k)\n return this\n }\n let { noUpdateTTL = this.noUpdateTTL } = setOptions\n\n if (status && !isBF) status.value = v\n\n const size = this.#requireSize(\n k,\n v,\n setOptions.size || 0,\n sizeCalculation,\n status,\n )\n // if the item doesn't fit, don't do anything\n // NB: maxEntrySize set to maxSize by default\n if (this.maxEntrySize && size > this.maxEntrySize) {\n // have to delete, in case something is there already.\n this.#delete(k, 'set')\n if (status) {\n status.set = 'miss'\n status.maxEntrySizeExceeded = true\n }\n return this\n }\n let index = this.#size === 0 ? undefined : this.#keyMap.get(k)\n if (index === undefined) {\n // addition\n index = (\n this.#size === 0 ? this.#tail\n : this.#free.length !== 0 ? this.#free.pop()\n : this.#size === this.#max ? this.#evict(false)\n : this.#size) as Index\n this.#keyList[index] = k\n this.#valList[index] = v\n this.#keyMap.set(k, index)\n this.#next[this.#tail] = index\n this.#prev[index] = this.#tail\n this.#tail = index\n this.#size++\n this.#addItemSize(index, size, status)\n if (status) status.set = 'add'\n noUpdateTTL = false\n if (this.#hasOnInsert && !isBF) {\n this.#onInsert?.(v, k, 'add')\n }\n } else {\n // update\n // might be updating a background fetch!\n this.#moveToTail(index)\n const oldVal = this.#valList[index]!\n if (v !== oldVal) {\n if (!noDisposeOnSet) {\n if (this.#isBackgroundFetch(oldVal)) {\n if (oldVal !== bf) {\n // setting over a background fetch, not merely resolving it.\n oldVal.__abortController.abort(new Error('replaced'))\n }\n const { __staleWhileFetching: s } = oldVal\n if (s !== undefined && s !== v) {\n if (this.#hasDispose) {\n this.#dispose?.(s, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([s, k, 'set'])\n }\n }\n } else {\n if (this.#hasDispose) {\n this.#dispose?.(oldVal, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldVal, k, 'set'])\n }\n }\n }\n this.#removeItemSize(index)\n this.#addItemSize(index, size, status)\n this.#valList[index] = v\n if (!isBF) {\n const oldValue =\n oldVal && this.#isBackgroundFetch(oldVal) ?\n oldVal.__staleWhileFetching\n : oldVal\n const setType =\n oldValue === undefined ? 'add'\n : v !== oldValue ? 'replace'\n : 'update'\n if (status) {\n status.set = setType\n if (oldValue !== undefined) status.oldValue = oldValue\n }\n if (this.#hasOnInsert) {\n this.onInsert?.(v, k, setType)\n }\n }\n } else if (!isBF) {\n if (status) {\n status.set = 'update'\n }\n if (this.#hasOnInsert) {\n this.onInsert?.(v, k, 'update')\n }\n }\n }\n if (ttl !== 0 && !this.#ttls) {\n this.#initializeTTLTracking()\n }\n if (this.#ttls) {\n if (!noUpdateTTL) {\n this.#setItemTTL(index, ttl, start)\n }\n if (status) this.#statusTTL(status, index)\n }\n if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return this\n }\n\n /**\n * Evict the least recently used item, returning its value or\n * `undefined` if cache is empty.\n */\n pop(): V | undefined {\n try {\n while (this.#size) {\n const val = this.#valList[this.#head]\n this.#evict(true)\n if (this.#isBackgroundFetch(val)) {\n if (val.__staleWhileFetching) {\n return val.__staleWhileFetching\n }\n } else if (val !== undefined) {\n return val\n }\n }\n } finally {\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n }\n\n #evict(free: boolean) {\n const head = this.#head\n const k = this.#keyList[head]!\n const v = this.#valList[head]!\n const isBF = this.#isBackgroundFetch(v)\n if (isBF) {\n v.__abortController.abort(new Error('evicted'))\n }\n const oldValue = isBF ? v.__staleWhileFetching : v\n if (\n (this.#hasDispose || this.#hasDisposeAfter) &&\n oldValue !== undefined\n ) {\n if (this.#hasDispose) {\n this.#dispose?.(oldValue, k, 'evict')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldValue, k, 'evict'])\n }\n }\n this.#removeItemSize(head)\n if (this.#autopurgeTimers?.[head]) {\n clearTimeout(this.#autopurgeTimers[head])\n this.#autopurgeTimers[head] = undefined\n }\n // if we aren't about to use the index, then null these out\n if (free) {\n this.#keyList[head] = undefined\n this.#valList[head] = undefined\n this.#free.push(head)\n }\n if (this.#size === 1) {\n this.#head = this.#tail = 0 as Index\n this.#free.length = 0\n } else {\n this.#head = this.#next[head] as Index\n }\n this.#keyMap.delete(k)\n this.#size--\n return head\n }\n\n /**\n * Check if a key is in the cache, without updating the recency of use.\n * Will return false if the item is stale, even though it is technically\n * in the cache.\n *\n * Check if a key is in the cache, without updating the recency of\n * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set\n * to `true` in either the options or the constructor.\n *\n * Will return `false` if the item is stale, even though it is technically in\n * the cache. The difference can be determined (if it matters) by using a\n * `status` argument, and inspecting the `has` field.\n *\n * Will not update item age unless\n * {@link LRUCache.OptionsBase.updateAgeOnHas} is set.\n */\n has(k: K, hasOptions: LRUCache.HasOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } = hasOptions\n hasOptions.status = status\n if (status) {\n status.op = 'has'\n status.key = k\n status.cache = this\n }\n const result = this.#has(k, hasOptions)\n if (metrics.hasSubscribers) metrics.publish(status)\n return result\n }\n #has(k: K, hasOptions: LRUCache.HasOptions = {}) {\n const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n const v = this.#valList[index]\n if (\n this.#isBackgroundFetch(v) &&\n v.__staleWhileFetching === undefined\n ) {\n return false\n }\n if (!this.#isStale(index)) {\n if (updateAgeOnHas) {\n this.#updateItemAge(index)\n }\n if (status) {\n status.has = 'hit'\n this.#statusTTL(status, index)\n }\n return true\n } else if (status) {\n status.has = 'stale'\n this.#statusTTL(status, index)\n }\n } else if (status) {\n status.has = 'miss'\n }\n return false\n }\n\n /**\n * Like {@link LRUCache#get} but doesn't update recency or delete stale\n * items.\n *\n * Returns `undefined` if the item is stale, unless\n * {@link LRUCache.OptionsBase.allowStale} is set.\n */\n peek(k: K, peekOptions: LRUCache.PeekOptions = {}) {\n const { status = hasSubscribers() ? {} : undefined } = peekOptions\n if (status) {\n status.op = 'peek'\n status.key = k\n status.cache = this\n }\n peekOptions.status = status\n const result = this.#peek(k, peekOptions)\n if (metrics.hasSubscribers) {\n metrics.publish(status)\n }\n return result\n }\n #peek(k: K, peekOptions: LRUCache.PeekOptions) {\n const { status, allowStale = this.allowStale } = peekOptions\n const index = this.#keyMap.get(k)\n if (index === undefined || (!allowStale && this.#isStale(index))) {\n if (status) status.peek = index === undefined ? 'miss' : 'stale'\n return undefined\n }\n const v = this.#valList[index]\n const val = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (status) {\n if (val !== undefined) {\n status.peek = 'hit'\n status.value = val\n } else {\n status.peek = 'miss'\n }\n }\n return val\n }\n\n #backgroundFetch(\n k: K,\n index: Index | undefined,\n options: LRUCache.FetchOptions,\n context: FC,\n ): BackgroundFetch {\n const v = index === undefined ? undefined : this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n return v\n }\n\n const ac = new AbortController()\n const { signal } = options\n // when/if our AC signals, then stop listening to theirs.\n signal?.addEventListener('abort', () => ac.abort(signal.reason), {\n signal: ac.signal,\n })\n\n const fetchOpts = {\n signal: ac.signal,\n options,\n context,\n }\n\n const cb = (v: V | undefined, updateCache = false): V | undefined => {\n const { aborted } = ac.signal\n const ignoreAbort = options.ignoreFetchAbort && v !== undefined\n const proceed =\n options.ignoreFetchAbort ||\n !!(options.allowStaleOnFetchAbort && v !== undefined)\n if (options.status) {\n if (aborted && !updateCache) {\n options.status.fetchAborted = true\n options.status.fetchError = ac.signal.reason\n if (ignoreAbort) options.status.fetchAbortIgnored = true\n } else {\n options.status.fetchResolved = true\n }\n }\n if (aborted && !ignoreAbort && !updateCache) {\n return fetchFail(ac.signal.reason, proceed)\n }\n // either we didn't abort, and are still here, or we did, and ignored\n const bf = p as BackgroundFetch\n // if nothing else has been written there but we're set to update the\n // cache and ignore the abort, or if it's still pending on this specific\n // background request, then write it to the cache.\n const vl = this.#valList[index as Index]\n if (vl === p || (vl === undefined && ignoreAbort && updateCache)) {\n if (v === undefined) {\n if (bf.__staleWhileFetching !== undefined) {\n this.#valList[index as Index] = bf.__staleWhileFetching\n } else {\n this.#delete(k, 'fetch')\n }\n } else {\n if (options.status) options.status.fetchUpdated = true\n this.#set(k, v, fetchOpts.options, bf)\n }\n }\n return v\n }\n\n const eb = (er: unknown) => {\n if (options.status) {\n options.status.fetchRejected = true\n options.status.fetchError = er as Error\n }\n // do not pass go, do not collect $200\n return fetchFail(er, false)\n }\n\n const fetchFail = (er: unknown, proceed: boolean): V | undefined => {\n const { aborted } = ac.signal\n const allowStaleAborted = aborted && options.allowStaleOnFetchAbort\n const allowStale =\n allowStaleAborted || options.allowStaleOnFetchRejection\n const noDelete = allowStale || options.noDeleteOnFetchRejection\n const bf = p as BackgroundFetch\n if (this.#valList[index as Index] === p) {\n // if we allow stale on fetch rejections, then we need to ensure that\n // the stale value is not removed from the cache when the fetch fails.\n const del =\n !noDelete || (!proceed && bf.__staleWhileFetching === undefined)\n if (del) {\n this.#delete(k, 'fetch')\n } else if (!allowStaleAborted) {\n // still replace the *promise* with the stale value,\n // since we are done with the promise at this point.\n // leave it untouched if we're still waiting for an\n // aborted background fetch that hasn't yet returned.\n this.#valList[index as Index] = bf.__staleWhileFetching\n }\n }\n if (allowStale) {\n if (options.status && bf.__staleWhileFetching !== undefined) {\n options.status.returnedStale = true\n }\n return bf.__staleWhileFetching\n } else if (bf.__returned === bf) {\n throw er\n }\n }\n\n const pcall = (\n res: (v: V | undefined) => void,\n rej: (e: unknown) => void,\n ) => {\n const fmp = this.#fetchMethod?.(k, v, fetchOpts)\n // ignored, we go until we finish, regardless.\n // defer check until we are actually aborting,\n // so fetchMethod can override.\n ac.signal.addEventListener('abort', () => {\n if (!options.ignoreFetchAbort || options.allowStaleOnFetchAbort) {\n res(undefined)\n // when it eventually resolves, update the cache.\n if (options.allowStaleOnFetchAbort) {\n res = v => cb(v, true)\n }\n }\n })\n if (fmp && fmp instanceof Promise) {\n fmp.then(v => res(v === undefined ? undefined : v), rej)\n } else if (fmp !== undefined) {\n res(fmp)\n }\n }\n\n if (options.status) options.status.fetchDispatched = true\n const p = new Promise(pcall).then(cb, eb)\n const bf: BackgroundFetch = Object.assign(p, {\n __abortController: ac,\n __staleWhileFetching: v,\n __returned: undefined,\n })\n\n if (index === undefined) {\n // internal, don't expose status.\n this.#set(k, bf, { ...fetchOpts.options, status: undefined })\n index = this.#keyMap.get(k)\n } else {\n // do not call #set, because we do not want to adjust its place\n // in the lru queue, as it has not yet been \"used\". Also, we don't\n // need to worry about evicting for size, because a background fetch\n // over a stale value is treated as the same size as its stale value.\n this.#valList[index] = bf\n }\n return bf\n }\n\n #isBackgroundFetch(p: unknown): p is BackgroundFetch {\n if (!this.#hasFetchMethod) return false\n const b = p as BackgroundFetch\n return (\n !!b &&\n b instanceof Promise &&\n b.hasOwnProperty('__staleWhileFetching') &&\n b.__abortController instanceof AbortController\n )\n }\n\n /**\n * Make an asynchronous cached fetch using the\n * {@link LRUCache.OptionsBase.fetchMethod} function.\n *\n * If the value is in the cache and not stale, then the returned\n * Promise resolves to the value.\n *\n * If not in the cache, or beyond its TTL staleness, then\n * `fetchMethod(key, staleValue, { options, signal, context })` is\n * called, and the value returned will be added to the cache once\n * resolved.\n *\n * If called with `allowStale`, and an asynchronous fetch is\n * currently in progress to reload a stale value, then the former\n * stale value will be returned.\n *\n * If called with `forceRefresh`, then the cached item will be\n * re-fetched, even if it is not stale. However, if `allowStale` is also\n * set, then the old value will still be returned. This is useful\n * in cases where you want to force a reload of a cached value. If\n * a background fetch is already in progress, then `forceRefresh`\n * has no effect.\n *\n * If multiple fetches for the same key are issued, then they will all be\n * coalesced into a single call to fetchMethod.\n *\n * Note that this means that handling options such as\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort},\n * {@link LRUCache.FetchOptions.signal},\n * and {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} will be\n * determined by the FIRST fetch() call for a given key.\n *\n * This is a known (fixable) shortcoming which will be addresed on when\n * someone complains about it, as the fix would involve added complexity and\n * may not be worth the costs for this edge case.\n *\n * If {@link LRUCache.OptionsBase.fetchMethod} is not specified, then this is\n * effectively an alias for `Promise.resolve(cache.get(key))`.\n *\n * When the fetch method resolves to a value, if the fetch has not\n * been aborted due to deletion, eviction, or being overwritten,\n * then it is added to the cache using the options provided.\n *\n * If the key is evicted or deleted before the `fetchMethod`\n * resolves, then the AbortSignal passed to the `fetchMethod` will\n * receive an `abort` event, and the promise returned by `fetch()`\n * will reject with the reason for the abort.\n *\n * If a `signal` is passed to the `fetch()` call, then aborting the\n * signal will abort the fetch and cause the `fetch()` promise to\n * reject with the reason provided.\n *\n * **Setting `context`**\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the {@link LRUCache} constructor, then all\n * calls to `cache.fetch()` _must_ provide a `context` option. If\n * set to `undefined` or `void`, then calls to fetch _must not_\n * provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that\n * might be relevant in the course of fetching the data. It is only\n * relevant for the course of a single `fetch()` operation, and\n * discarded afterwards.\n *\n * **Note: `fetch()` calls are inflight-unique**\n *\n * If you call `fetch()` multiple times with the same key value,\n * then every call after the first will resolve on the same\n * promise1,\n * _even if they have different settings that would otherwise change\n * the behavior of the fetch_, such as `noDeleteOnFetchRejection`\n * or `ignoreFetchAbort`.\n *\n * In most cases, this is not a problem (in fact, only fetching\n * something once is what you probably want, if you're caching in\n * the first place). If you are changing the fetch() options\n * dramatically between runs, there's a good chance that you might\n * be trying to fit divergent semantics into a single object, and\n * would be better off with multiple cache instances.\n *\n * **1**: Ie, they're not the \"same Promise\", but they resolve at\n * the same time, because they're both waiting on the same\n * underlying fetchMethod response.\n */\n\n fetch(\n k: K,\n fetchOptions: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext,\n ): Promise\n\n // this overload not allowed if context is required\n fetch(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n fetchOptions?: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : never,\n ): Promise\n fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const ths = tracing.hasSubscribers\n const { status = hasSubscribers() ? {} : undefined } = fetchOptions\n fetchOptions.status = status\n if (status && fetchOptions.context) {\n status.context = fetchOptions.context\n }\n const p = this.#fetch(k, fetchOptions)\n if (status && ths) {\n status.trace = true\n tracing.tracePromise(() => p, status).catch(() => {})\n }\n return p\n }\n\n async #fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const {\n // get options\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n // set options\n ttl = this.ttl,\n noDisposeOnSet = this.noDisposeOnSet,\n size = 0,\n sizeCalculation = this.sizeCalculation,\n noUpdateTTL = this.noUpdateTTL,\n // fetch exclusive options\n noDeleteOnFetchRejection = this.noDeleteOnFetchRejection,\n allowStaleOnFetchRejection = this.allowStaleOnFetchRejection,\n ignoreFetchAbort = this.ignoreFetchAbort,\n allowStaleOnFetchAbort = this.allowStaleOnFetchAbort,\n context,\n forceRefresh = false,\n status,\n signal,\n } = fetchOptions\n if (status) {\n status.op = 'fetch'\n status.key = k\n if (forceRefresh) status.forceRefresh = true\n status.cache = this\n }\n\n if (!this.#hasFetchMethod) {\n if (status) status.fetch = 'get'\n return this.#get(k, {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n status,\n })\n }\n\n const options = {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n ttl,\n noDisposeOnSet,\n size,\n sizeCalculation,\n noUpdateTTL,\n noDeleteOnFetchRejection,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n status,\n signal,\n }\n\n let index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.fetch = 'miss'\n const p = this.#backgroundFetch(k, index, options, context as FC)\n return (p.__returned = p)\n } else {\n // in cache, maybe already fetching\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n const stale = allowStale && v.__staleWhileFetching !== undefined\n if (status) {\n status.fetch = 'inflight'\n if (stale) status.returnedStale = true\n }\n return stale ? v.__staleWhileFetching : (v.__returned = v)\n }\n\n // if we force a refresh, that means do NOT serve the cached value,\n // unless we are already in the process of refreshing the cache.\n const isStale = this.#isStale(index)\n if (!forceRefresh && !isStale) {\n if (status) status.fetch = 'hit'\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n if (status) this.#statusTTL(status, index)\n return v\n }\n\n // ok, it is stale or a forced refresh, and not already fetching.\n // refresh the cache.\n const p = this.#backgroundFetch(k, index, options, context as FC)\n const hasStale = p.__staleWhileFetching !== undefined\n const staleVal = hasStale && allowStale\n if (status) {\n status.fetch = isStale ? 'stale' : 'refresh'\n if (staleVal && isStale) status.returnedStale = true\n }\n return staleVal ? p.__staleWhileFetching : (p.__returned = p)\n }\n }\n\n /**\n * In some cases, `cache.fetch()` may resolve to `undefined`, either because\n * a {@link LRUCache.OptionsBase#fetchMethod} was not provided (turning\n * `cache.fetch(k)` into just an async wrapper around `cache.get(k)`) or\n * because `ignoreFetchAbort` was specified (either to the constructor or\n * in the {@link LRUCache.FetchOptions}). Also, the\n * {@link LRUCache.OptionsBase.fetchMethod} may return `undefined` or `void`, making\n * the test even more complicated.\n *\n * Because inferring the cases where `undefined` might be returned are so\n * cumbersome, but testing for `undefined` can also be annoying, this method\n * can be used, which will reject if `this.fetch()` resolves to undefined.\n */\n forceFetch(\n k: K,\n fetchOptions: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext,\n ): Promise\n // this overload not allowed if context is required\n forceFetch(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n fetchOptions?: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : never,\n ): Promise\n forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const ths = tracing.hasSubscribers\n const { status = hasSubscribers() ? {} : undefined } = fetchOptions\n fetchOptions.status = status\n if (status && fetchOptions.context) {\n status.context = fetchOptions.context\n }\n const p = this.#forceFetch(k, fetchOptions)\n if (status && ths) {\n status.trace = true\n tracing.tracePromise(() => p, status).catch(() => {})\n }\n return p\n }\n\n async #forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ) {\n const v = await this.#fetch(k, fetchOptions)\n if (v === undefined) throw new Error('fetch() returned undefined')\n return v\n }\n\n /**\n * If the key is found in the cache, then this is equivalent to\n * {@link LRUCache#get}. If not, in the cache, then calculate the value using\n * the {@link LRUCache.OptionsBase.memoMethod}, and add it to the cache.\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the LRUCache constructor, then all calls to `cache.memo()`\n * _must_ provide a `context` option. If set to `undefined` or `void`, then\n * calls to memo _must not_ provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that might be\n * relevant in the course of fetching the data. It is only relevant for the\n * course of a single `memo()` operation, and discarded afterwards.\n */\n memo(\n k: K,\n memoOptions: unknown extends FC ? LRUCache.MemoOptions\n : FC extends undefined | void ? LRUCache.MemoOptionsNoContext\n : LRUCache.MemoOptionsWithContext,\n ): V\n // this overload not allowed if context is required\n memo(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n memoOptions?: unknown extends FC ? LRUCache.MemoOptions\n : FC extends undefined | void ? LRUCache.MemoOptionsNoContext\n : never,\n ): V\n memo(k: K, memoOptions: LRUCache.MemoOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } =\n memoOptions\n memoOptions.status = status\n if (status) {\n status.op = 'memo'\n status.key = k\n if (memoOptions.context) {\n status.context = memoOptions.context\n }\n status.cache = this\n }\n const result = this.#memo(k, memoOptions)\n if (status) status.value = result\n if (metrics.hasSubscribers) metrics.publish(status)\n return result\n }\n #memo(k: K, memoOptions: LRUCache.MemoOptions = {}) {\n const memoMethod = this.#memoMethod\n if (!memoMethod) {\n throw new Error('no memoMethod provided to constructor')\n }\n const { context, status, forceRefresh, ...options } = memoOptions\n if (status && forceRefresh) status.forceRefresh = true\n const v = this.#get(k, options)\n const refresh = forceRefresh || v === undefined\n if (status) {\n status.memo = refresh ? 'miss' : 'hit'\n if (!refresh) status.value = v\n }\n if (!refresh) return v\n const vv = memoMethod(k, v, {\n options,\n context,\n } as LRUCache.MemoizerOptions)\n if (status) status.value = vv\n this.#set(k, vv, options)\n return vv\n }\n\n /**\n * Return a value from the cache. Will update the recency of the cache\n * entry found.\n *\n * If the key is not found, get() will return `undefined`.\n */\n get(k: K, getOptions: LRUCache.GetOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } = getOptions\n getOptions.status = status\n if (status) {\n status.op = 'get'\n status.key = k\n status.cache = this\n }\n const result = this.#get(k, getOptions)\n if (status) {\n if (result !== undefined) status.value = result\n if (metrics.hasSubscribers) metrics.publish(status)\n }\n return result\n }\n\n #get(k: K, getOptions: LRUCache.GetOptions = {}) {\n const {\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n status,\n } = getOptions\n const index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.get = 'miss'\n return undefined\n }\n const value = this.#valList[index]\n const fetching = this.#isBackgroundFetch(value)\n if (status) this.#statusTTL(status, index)\n if (this.#isStale(index)) {\n // delete only if not an in-flight background fetch\n if (!fetching) {\n if (!noDeleteOnStaleGet) {\n this.#delete(k, 'expire')\n }\n if (status) status.get = 'stale'\n if (allowStale) {\n if (status) status.returnedStale = true\n return value\n }\n return undefined\n }\n if (status) status.get = 'stale-fetching'\n if (allowStale && value.__staleWhileFetching !== undefined) {\n if (status) status.returnedStale = true\n return value.__staleWhileFetching\n }\n return undefined\n }\n // not stale\n if (status) status.get = fetching ? 'fetching' : 'hit'\n // if we're currently fetching it, we don't actually have it yet\n // it's not stale, which means this isn't a staleWhileRefetching.\n // If it's not stale, and fetching, AND has a __staleWhileFetching\n // value, then that means the user fetched with {forceRefresh:true},\n // so it's safe to return that value.\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n return fetching ? value.__staleWhileFetching : value\n }\n\n #connect(p: Index, n: Index) {\n this.#prev[n] = p\n this.#next[p] = n\n }\n\n #moveToTail(index: Index): void {\n // if tail already, nothing to do\n // if head, move head to next[index]\n // else\n // move next[prev[index]] to next[index] (head has no prev)\n // move prev[next[index]] to prev[index]\n // prev[index] = tail\n // next[tail] = index\n // tail = index\n if (index !== this.#tail) {\n if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n this.#connect(\n this.#prev[index] as Index,\n this.#next[index] as Index,\n )\n }\n this.#connect(this.#tail, index)\n this.#tail = index\n }\n }\n\n /**\n * Deletes a key out of the cache.\n *\n * Returns true if the key was deleted, false otherwise.\n */\n delete(k: K) {\n return this.#delete(k, 'delete')\n }\n\n #delete(k: K, reason: LRUCache.DisposeReason) {\n if (metrics.hasSubscribers) {\n metrics.publish({\n op: 'delete',\n delete: reason,\n key: k,\n cache: this,\n })\n }\n let deleted = false\n if (this.#size !== 0) {\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n if (this.#autopurgeTimers?.[index]) {\n clearTimeout(this.#autopurgeTimers?.[index])\n this.#autopurgeTimers[index] = undefined\n }\n deleted = true\n if (this.#size === 1) {\n this.#clear(reason)\n } else {\n this.#removeItemSize(index)\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k, reason])\n }\n }\n this.#keyMap.delete(k)\n this.#keyList[index] = undefined\n this.#valList[index] = undefined\n if (index === this.#tail) {\n this.#tail = this.#prev[index] as Index\n } else if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n const pi = this.#prev[index] as number\n this.#next[pi] = this.#next[index] as number\n const ni = this.#next[index] as number\n this.#prev[ni] = this.#prev[index] as number\n }\n this.#size--\n this.#free.push(index)\n }\n }\n }\n if (this.#hasDisposeAfter && this.#disposed?.length) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return deleted\n }\n\n /**\n * Clear the cache entirely, throwing away all values.\n */\n clear() {\n return this.#clear('delete')\n }\n #clear(reason: LRUCache.DisposeReason) {\n for (const index of this.#rindexes({ allowStale: true })) {\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else {\n const k = this.#keyList[index]\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k as K, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k as K, reason])\n }\n }\n }\n\n this.#keyMap.clear()\n void this.#valList.fill(undefined)\n this.#keyList.fill(undefined)\n if (this.#ttls && this.#starts) {\n this.#ttls.fill(0)\n this.#starts.fill(0)\n for (const t of this.#autopurgeTimers ?? []) {\n if (t !== undefined) clearTimeout(t)\n }\n this.#autopurgeTimers?.fill(undefined)\n }\n if (this.#sizes) {\n this.#sizes.fill(0)\n }\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free.length = 0\n this.#calculatedSize = 0\n this.#size = 0\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n}\n"], + "mappings": "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", + "names": ["node_diagnostics_channel_1", "exports", "exports", "diagnostics_channel_js_1", "perf_js_1", "hasSubscribers", "warned", "PROCESS", "emitWarning", "msg", "type", "code", "fn", "shouldWarn", "isPosInt", "n", "getUintArray", "max", "ZeroArray", "size", "Stack", "_Stack", "#constructing", "HeapCls", "s", "LRUCache", "_LRUCache", "#max", "#maxSize", "#dispose", "#onInsert", "#disposeAfter", "#fetchMethod", "#memoMethod", "#perf", "#size", "#calculatedSize", "#keyMap", "#keyList", "#valList", "#next", "#prev", "#head", "#tail", "#free", "#disposed", "#sizes", "#starts", "#ttls", "#autopurgeTimers", "#hasDispose", "#hasFetchMethod", "#hasDisposeAfter", "#hasOnInsert", "c", "p", "#isBackgroundFetch", "k", "index", "options", "context", "#backgroundFetch", "#moveToTail", "#indexes", "#rindexes", "#isStale", "ttl", "ttlResolution", "ttlAutopurge", "updateAgeOnGet", "updateAgeOnHas", "allowStale", "dispose", "onInsert", "disposeAfter", "noDisposeOnSet", "noUpdateTTL", "maxSize", "maxEntrySize", "sizeCalculation", "fetchMethod", "memoMethod", "noDeleteOnFetchRejection", "noDeleteOnStaleGet", "allowStaleOnFetchRejection", "allowStaleOnFetchAbort", "ignoreFetchAbort", "backgroundFetchSize", "perf", "perf_js_1", "UintArray", "#initializeSizeTracking", "#initializeTTLTracking", "code", "shouldWarn", "warned", "emitWarning", "key", "ttls", "starts", "purgeTimers", "#setItemTTL", "start", "setPurgetTimer", "#updateItemAge", "t", "#delete", "#statusTTL", "status", "cachedNow", "getNow", "age", "sizes", "#removeItemSize", "#requireSize", "v", "#addItemSize", "#evict", "_i", "_s", "_st", "_k", "_v", "i", "#isValidIndex", "fn", "getOptions", "value", "#get", "thisp", "deleted", "entry", "remain", "arr", "#set", "setOptions", "diagnostics_channel_js_1", "result", "bf", "isBF", "oldVal", "oldValue", "setType", "dt", "task", "val", "free", "head", "hasOptions", "#has", "peekOptions", "hasSubscribers", "#peek", "ac", "signal", "fetchOpts", "cb", "updateCache", "aborted", "ignoreAbort", "proceed", "fetchFail", "vl", "eb", "er", "allowStaleAborted", "noDelete", "pcall", "res", "rej", "fmp", "b", "fetchOptions", "ths", "#fetch", "forceRefresh", "stale", "isStale", "staleVal", "#forceFetch", "memoOptions", "#memo", "refresh", "vv", "fetching", "#connect", "reason", "#clear", "pi", "ni"] +} diff --git a/node_modules/lru-cache/dist/commonjs/node/perf.d.ts b/node_modules/lru-cache/dist/commonjs/node/perf.d.ts new file mode 100644 index 00000000..15a4a627 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/node/perf.d.ts @@ -0,0 +1,12 @@ +/** + * this provides the default Perf object source, either the + * `performance` global, or the `Date` constructor. + * + * it can be passed in via configuration to override it + * for a single LRU object. + */ +export type Perf = { + now: () => number; +}; +export declare const defaultPerf: Perf; +//# sourceMappingURL=perf.d.ts.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/node/perf.d.ts.map b/node_modules/lru-cache/dist/commonjs/node/perf.d.ts.map new file mode 100644 index 00000000..3e239ce9 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/node/perf.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"perf.d.ts","sourceRoot":"","sources":["../../../src/perf.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,IAAI,GAAG;IAAE,GAAG,EAAE,MAAM,MAAM,CAAA;CAAE,CAAA;AACxC,eAAO,MAAM,WAAW,EAAE,IAQG,CAAA"} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/node/perf.js b/node_modules/lru-cache/dist/commonjs/node/perf.js new file mode 100644 index 00000000..bd4c80f4 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/node/perf.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.defaultPerf = void 0; +exports.defaultPerf = (typeof performance === 'object' && + performance && + typeof performance.now === 'function') ? + /* c8 ignore start - this gets covered, but c8 gets confused */ + performance + : /* c8 ignore stop */ Date; +//# sourceMappingURL=perf.js.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/node/perf.js.map b/node_modules/lru-cache/dist/commonjs/node/perf.js.map new file mode 100644 index 00000000..a193c90f --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/node/perf.js.map @@ -0,0 +1 @@ +{"version":3,"file":"perf.js","sourceRoot":"","sources":["../../../src/perf.ts"],"names":[],"mappings":";;;AAQa,QAAA,WAAW,GACtB,CACE,OAAO,WAAW,KAAK,QAAQ;IAC/B,WAAW;IACX,OAAO,WAAW,CAAC,GAAG,KAAK,UAAU,CACtC,CAAC,CAAC;IACD,+DAA+D;IAC/D,WAAW;IACb,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAA","sourcesContent":["/**\n * this provides the default Perf object source, either the\n * `performance` global, or the `Date` constructor.\n *\n * it can be passed in via configuration to override it\n * for a single LRU object.\n */\nexport type Perf = { now: () => number }\nexport const defaultPerf: Perf =\n (\n typeof performance === 'object' &&\n performance &&\n typeof performance.now === 'function'\n ) ?\n /* c8 ignore start - this gets covered, but c8 gets confused */\n performance\n : /* c8 ignore stop */ Date\n"]} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/package.json b/node_modules/lru-cache/dist/commonjs/package.json new file mode 100644 index 00000000..5bbefffb --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/package.json @@ -0,0 +1,3 @@ +{ + "type": "commonjs" +} diff --git a/node_modules/lru-cache/dist/commonjs/perf.d.ts b/node_modules/lru-cache/dist/commonjs/perf.d.ts new file mode 100644 index 00000000..15a4a627 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/perf.d.ts @@ -0,0 +1,12 @@ +/** + * this provides the default Perf object source, either the + * `performance` global, or the `Date` constructor. + * + * it can be passed in via configuration to override it + * for a single LRU object. + */ +export type Perf = { + now: () => number; +}; +export declare const defaultPerf: Perf; +//# sourceMappingURL=perf.d.ts.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/perf.d.ts.map b/node_modules/lru-cache/dist/commonjs/perf.d.ts.map new file mode 100644 index 00000000..fd6eeeed --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/perf.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"perf.d.ts","sourceRoot":"","sources":["../../src/perf.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,IAAI,GAAG;IAAE,GAAG,EAAE,MAAM,MAAM,CAAA;CAAE,CAAA;AACxC,eAAO,MAAM,WAAW,EAAE,IAQG,CAAA"} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/perf.js b/node_modules/lru-cache/dist/commonjs/perf.js new file mode 100644 index 00000000..bd4c80f4 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/perf.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.defaultPerf = void 0; +exports.defaultPerf = (typeof performance === 'object' && + performance && + typeof performance.now === 'function') ? + /* c8 ignore start - this gets covered, but c8 gets confused */ + performance + : /* c8 ignore stop */ Date; +//# sourceMappingURL=perf.js.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/perf.js.map b/node_modules/lru-cache/dist/commonjs/perf.js.map new file mode 100644 index 00000000..59bb4678 --- /dev/null +++ b/node_modules/lru-cache/dist/commonjs/perf.js.map @@ -0,0 +1 @@ +{"version":3,"file":"perf.js","sourceRoot":"","sources":["../../src/perf.ts"],"names":[],"mappings":";;;AAQa,QAAA,WAAW,GACtB,CACE,OAAO,WAAW,KAAK,QAAQ;IAC/B,WAAW;IACX,OAAO,WAAW,CAAC,GAAG,KAAK,UAAU,CACtC,CAAC,CAAC;IACD,+DAA+D;IAC/D,WAAW;IACb,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAA","sourcesContent":["/**\n * this provides the default Perf object source, either the\n * `performance` global, or the `Date` constructor.\n *\n * it can be passed in via configuration to override it\n * for a single LRU object.\n */\nexport type Perf = { now: () => number }\nexport const defaultPerf: Perf =\n (\n typeof performance === 'object' &&\n performance &&\n typeof performance.now === 'function'\n ) ?\n /* c8 ignore start - this gets covered, but c8 gets confused */\n performance\n : /* c8 ignore stop */ Date\n"]} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/browser/diagnostics-channel-browser.d.ts.map b/node_modules/lru-cache/dist/esm/browser/diagnostics-channel-browser.d.ts.map new file mode 100644 index 00000000..a457786d --- /dev/null +++ b/node_modules/lru-cache/dist/esm/browser/diagnostics-channel-browser.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"diagnostics-channel-browser.d.ts","sourceRoot":"","sources":["../../../src/diagnostics-channel-browser.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,cAAc,EACpB,MAAM,0BAA0B,CAAA;AACjC,YAAY,EAAE,cAAc,EAAE,OAAO,EAAE,CAAA;AAGvC,eAAO,MAAM,OAAO,EAAY,OAAO,CAAC,OAAO,CAAC,CAAA;AAChD,eAAO,MAAM,OAAO,EAAY,cAAc,CAAC,OAAO,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/browser/diagnostics-channel-browser.js.map b/node_modules/lru-cache/dist/esm/browser/diagnostics-channel-browser.js.map new file mode 100644 index 00000000..2595c398 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/browser/diagnostics-channel-browser.js.map @@ -0,0 +1 @@ +{"version":3,"file":"diagnostics-channel-browser.js","sourceRoot":"","sources":["../../../src/diagnostics-channel-browser.ts"],"names":[],"mappings":"AAQA,MAAM,KAAK,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,CAAA;AACvC,MAAM,CAAC,MAAM,OAAO,GAAG,KAAyB,CAAA;AAChD,MAAM,CAAC,MAAM,OAAO,GAAG,KAAgC,CAAA","sourcesContent":["// this is used in ESM environments that follow the 'browser' import\n// condition, to avoid even trying to load node:diagnostics_channel\nimport {\n type Channel,\n type TracingChannel,\n} from 'node:diagnostics_channel'\nexport type { TracingChannel, Channel }\n\nconst dummy = { hasSubscribers: false }\nexport const metrics = dummy as Channel\nexport const tracing = dummy as TracingChannel\n"]} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/browser/diagnostics-channel.d.ts b/node_modules/lru-cache/dist/esm/browser/diagnostics-channel.d.ts new file mode 100644 index 00000000..5360898f --- /dev/null +++ b/node_modules/lru-cache/dist/esm/browser/diagnostics-channel.d.ts @@ -0,0 +1,5 @@ +import { type Channel, type TracingChannel } from 'node:diagnostics_channel'; +export type { TracingChannel, Channel }; +export declare const metrics: Channel; +export declare const tracing: TracingChannel; +//# sourceMappingURL=diagnostics-channel-browser.d.ts.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/browser/diagnostics-channel.js b/node_modules/lru-cache/dist/esm/browser/diagnostics-channel.js new file mode 100644 index 00000000..37524f35 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/browser/diagnostics-channel.js @@ -0,0 +1,4 @@ +const dummy = { hasSubscribers: false }; +export const metrics = dummy; +export const tracing = dummy; +//# sourceMappingURL=diagnostics-channel-browser.js.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/browser/index.d.ts b/node_modules/lru-cache/dist/esm/browser/index.d.ts new file mode 100644 index 00000000..b0e4b964 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/browser/index.d.ts @@ -0,0 +1,1400 @@ +/** + * @module LRUCache + */ +import type { Perf } from './perf.js'; +export type { Perf } from './perf.js'; +declare const TYPE: unique symbol; +export type PosInt = number & { + [TYPE]: 'Positive Integer'; +}; +export type Index = number & { + [TYPE]: 'LRUCache Index'; +}; +export type UintArray = Uint8Array | Uint16Array | Uint32Array; +export type NumberArray = UintArray | number[]; +declare class ZeroArray extends Array { + constructor(size: number); +} +export type { ZeroArray }; +export type { Stack }; +export type StackLike = Stack | Index[]; +declare class Stack { + #private; + heap: NumberArray; + length: number; + static create(max: number): StackLike; + constructor(max: number, HeapCls: { + new (n: number): NumberArray; + }); + push(n: Index): void; + pop(): Index; +} +/** + * Promise representing an in-progress {@link LRUCache#fetch} call + */ +export type BackgroundFetch = Promise & { + __returned: BackgroundFetch | undefined; + __abortController: AbortController; + __staleWhileFetching: V | undefined; +}; +export type DisposeTask = [ + value: V, + key: K, + reason: LRUCache.DisposeReason +]; +export declare namespace LRUCache { + /** + * An integer greater than 0, reflecting the calculated size of items + */ + type Size = number; + /** + * Integer greater than 0, representing some number of milliseconds, or the + * time at which a TTL started counting from. + */ + type Milliseconds = number; + /** + * An integer greater than 0, reflecting a number of items + */ + type Count = number; + /** + * The reason why an item was removed from the cache, passed + * to the {@link Disposer} methods. + * + * - `evict`: The item was evicted because it is the least recently used, + * and the cache is full. + * - `set`: A new value was set, overwriting the old value being disposed. + * - `delete`: The item was explicitly deleted, either by calling + * {@link LRUCache#delete}, {@link LRUCache#clear}, or + * {@link LRUCache#set} with an undefined value. + * - `expire`: The item was removed due to exceeding its TTL. + * - `fetch`: A {@link OptionsBase#fetchMethod} operation returned + * `undefined` or was aborted, causing the item to be deleted. + */ + type DisposeReason = 'evict' | 'set' | 'delete' | 'expire' | 'fetch'; + /** + * A method called upon item removal, passed as the + * {@link OptionsBase.dispose} and/or + * {@link OptionsBase.disposeAfter} options. + */ + type Disposer = (value: V, key: K, reason: DisposeReason) => void; + /** + * The reason why an item was added to the cache, passed + * to the {@link Inserter} methods. + * + * - `add`: the item was not found in the cache, and was added + * - `update`: the item was in the cache, with the same value provided + * - `replace`: the item was in the cache, and replaced + */ + type InsertReason = 'add' | 'update' | 'replace'; + /** + * A method called upon item insertion, passed as the + * {@link OptionsBase.insert} + */ + type Inserter = (value: V, key: K, reason: InsertReason) => void; + /** + * A function that returns the effective calculated size + * of an entry in the cache. + */ + type SizeCalculator = (value: V, key: K) => Size; + /** + * Options provided to the + * {@link OptionsBase.fetchMethod} function. + */ + interface FetcherOptions { + signal: AbortSignal; + options: FetcherFetchOptions; + /** + * Object provided in the {@link FetchOptions.context} option to + * {@link LRUCache#fetch} + */ + context: FC; + } + /** + * Occasionally, it may be useful to track the internal behavior of the + * cache, particularly for logging, debugging, or for behavior within the + * `fetchMethod`. To do this, you can pass a `status` object to the + * {@link LRUCache#fetch}, {@link LRUCache#get}, {@link LRUCache#set}, + * {@link LRUCache#memo}, and {@link LRUCache#has} methods. + * + * The `status` option should be a plain JavaScript object. The following + * fields will be set on it appropriately, depending on the situation. + * + * These objects are also the context objects passed to listeners on the + * `lru-cache:metrics` diagnostic channel, and the `lru-cache` tracing + * channels, in platforms that support them. + */ + interface Status { + /** + * The operation being performed + */ + op?: 'get' | 'set' | 'memo' | 'fetch' | 'delete' | 'has' | 'peek'; + /** + * The status of a set() operation. + * + * - add: the item was not found in the cache, and was added + * - update: the item was in the cache, with the same value provided + * - replace: the item was in the cache, and replaced + * - miss: the item was not added to the cache for some reason + */ + set?: 'add' | 'update' | 'replace' | 'miss' | 'deleted'; + /** + * The status of a delete() operation. + */ + delete?: LRUCache.DisposeReason; + /** + * The result of a peek() operation + * + * - hit: the item was found and returned + * - stale: the item is in the cache, but past its ttl and not returned + * - miss: item not in the cache + */ + peek?: 'hit' | 'miss' | 'stale'; + /** + * The status of a memo() operation. + * + * - 'hit': the item was found in the cache and returned + * - 'miss': the `memoMethod` function was called + */ + memo?: 'hit' | 'miss'; + /** + * The `context` option provided to a memo or fetch operation + * + * In practice, of course, this will be the same type as the `FC` + * fetch context param used to instantiate the LRUCache, but the + * convolutions of threading that through would get quite complicated, + * and preclude forcing/forbidding the passing of a `context` param + * where it is/isn't expected, which is more valuable for error + * prevention. + */ + context?: unknown; + /** + * the ttl stored for the item, or undefined if ttls are not used. + */ + ttl?: Milliseconds; + /** + * the start time for the item, or undefined if ttls are not used. + */ + start?: Milliseconds; + /** + * The timestamp used for TTL calculation + */ + now?: Milliseconds; + /** + * the remaining ttl for the item, or undefined if ttls are not used. + */ + remainingTTL?: Milliseconds; + /** + * The calculated size for the item, if sizes are used. + */ + entrySize?: Size; + /** + * The total calculated size of the cache, if sizes are used. + */ + totalCalculatedSize?: Size; + /** + * A flag indicating that the item was not stored, due to exceeding the + * {@link OptionsBase.maxEntrySize} + */ + maxEntrySizeExceeded?: true; + /** + * The key that was set or retrieved + */ + key?: K; + /** + * The value that was set + */ + value?: V; + /** + * The old value, specified in the case of `set:'replace'` + */ + oldValue?: V; + /** + * The results of a {@link LRUCache#has} operation + * + * - hit: the item was found in the cache + * - stale: the item was found in the cache, but is stale + * - miss: the item was not found in the cache + */ + has?: 'hit' | 'stale' | 'miss'; + /** + * The status of a {@link LRUCache#fetch} operation. + * Note that this can change as the underlying fetch() moves through + * various states. + * + * - inflight: there is another fetch() for this key which is in process + * - get: there is no {@link OptionsBase.fetchMethod}, so + * {@link LRUCache#get} was called. + * - miss: the item is not in cache, and will be fetched. + * - hit: the item is in the cache, and was resolved immediately. + * - stale: the item is in the cache, but stale. + * - refresh: the item is in the cache, and not stale, but + * {@link FetchOptions.forceRefresh} was specified. + */ + fetch?: 'get' | 'inflight' | 'miss' | 'hit' | 'stale' | 'refresh'; + /** + * `forceRefresh` option was used for either a fetch or memo operation + */ + forceRefresh?: boolean; + /** + * The {@link OptionsBase.fetchMethod} was called + */ + fetchDispatched?: true; + /** + * The cached value was updated after a successful call to + * {@link OptionsBase.fetchMethod} + */ + fetchUpdated?: true; + /** + * The reason for a fetch() rejection. Either the error raised by the + * {@link OptionsBase.fetchMethod}, or the reason for an + * AbortSignal. + */ + fetchError?: Error; + /** + * The fetch received an abort signal + */ + fetchAborted?: true; + /** + * The abort signal received was ignored, and the fetch was allowed to + * continue in the background. + */ + fetchAbortIgnored?: true; + /** + * The fetchMethod promise resolved successfully + */ + fetchResolved?: true; + /** + * The fetchMethod promise was rejected + */ + fetchRejected?: true; + /** + * The status of a {@link LRUCache#get} operation. + * + * - fetching: The item is currently being fetched. If a previous value + * is present and allowed, that will be returned. + * - stale: The item is in the cache, and is stale. If it was returned, + * then the `returnedStale` flag will be set. + * - stale-fetching: The value is being fetched in the background, but is + * currently stale. If the stale value was returned, then the + * `returnedStale` flag will be set. + * - hit: the item is in the cache + * - miss: the item is not in the cache + */ + get?: 'stale' | 'hit' | 'miss' | 'fetching' | 'stale-fetching'; + /** + * A fetch or get operation returned a stale value. + */ + returnedStale?: true; + /** + * A tracingChannel trace was started for this operation + */ + trace?: boolean; + /** + * A reference to the cache instance associated with this operation + */ + cache?: LRUCache; + } + /** + * options which override the options set in the LRUCache constructor + * when calling {@link LRUCache#fetch}. + * + * This is the union of {@link GetOptions} and {@link SetOptions}, plus + * {@link OptionsBase.noDeleteOnFetchRejection}, + * {@link OptionsBase.allowStaleOnFetchRejection}, + * {@link FetchOptions.forceRefresh}, and + * {@link FetcherOptions.context} + * + * Any of these may be modified in the {@link OptionsBase.fetchMethod} + * function, but the {@link GetOptions} fields will of course have no + * effect, as the {@link LRUCache#get} call already happened by the time + * the fetchMethod is called. + */ + interface FetcherFetchOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet' | 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL' | 'noDeleteOnFetchRejection' | 'allowStaleOnFetchRejection' | 'ignoreFetchAbort' | 'allowStaleOnFetchAbort'> { + status?: Status; + size?: Size; + } + /** + * Options that may be passed to the {@link LRUCache#fetch} method. + */ + interface FetchOptions extends FetcherFetchOptions { + /** + * Set to true to force a re-load of the existing data, even if it + * is not yet stale. + */ + forceRefresh?: boolean; + /** + * Context provided to the {@link OptionsBase.fetchMethod} as + * the {@link FetcherOptions.context} param. + * + * If the FC type is specified as unknown (the default), + * undefined or void, then this is optional. Otherwise, it will + * be required. + */ + context?: FC; + signal?: AbortSignal; + status?: Status; + } + /** + * Options provided to {@link LRUCache#fetch} when the FC type is something + * other than `unknown`, `undefined`, or `void` + */ + interface FetchOptionsWithContext extends FetchOptions { + context: FC; + } + /** + * Options provided to {@link LRUCache#fetch} when the FC type is + * `undefined` or `void` + */ + interface FetchOptionsNoContext extends FetchOptions { + context?: FC; + } + interface MemoOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet' | 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL' | 'noDeleteOnFetchRejection' | 'allowStaleOnFetchRejection' | 'ignoreFetchAbort' | 'allowStaleOnFetchAbort'> { + /** + * Set to true to force a re-load of the existing data, even if it + * is not yet stale. + */ + forceRefresh?: boolean; + /** + * Context provided to the {@link OptionsBase.memoMethod} as + * the {@link MemoizerOptions.context} param. + * + * If the FC type is specified as unknown (the default), + * undefined or void, then this is optional. Otherwise, it will + * be required. + */ + context?: FC; + status?: Status; + } + /** + * Options provided to {@link LRUCache#memo} when the FC type is something + * other than `unknown`, `undefined`, or `void` + */ + interface MemoOptionsWithContext extends MemoOptions { + context: FC; + } + /** + * Options provided to {@link LRUCache#memo} when the FC type is + * `undefined` or `void` + */ + interface MemoOptionsNoContext extends MemoOptions { + context?: FC; + } + /** + * Options provided to the + * {@link OptionsBase.memoMethod} function. + */ + interface MemoizerOptions { + options: MemoizerMemoOptions; + /** + * Object provided in the {@link MemoOptions.context} option to + * {@link LRUCache#memo} + */ + context: FC; + } + /** + * options which override the options set in the LRUCache constructor + * when calling {@link LRUCache#memo}. + * + * This is the union of {@link GetOptions} and {@link SetOptions}, plus + * {@link MemoOptions.forceRefresh}, and + * {@link MemoOptions.context} + * + * Any of these may be modified in the {@link OptionsBase.memoMethod} + * function, but the {@link GetOptions} fields will of course have no + * effect, as the {@link LRUCache#get} call already happened by the time + * the memoMethod is called. + */ + interface MemoizerMemoOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet' | 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'> { + status?: Status; + size?: Size; + start?: Milliseconds; + } + /** + * Options that may be passed to the {@link LRUCache#has} method. + */ + interface HasOptions extends Pick, 'updateAgeOnHas'> { + status?: Status; + } + /** + * Options that may be passed to the {@link LRUCache#get} method. + */ + interface GetOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet'> { + status?: Status; + } + /** + * Options that may be passed to the {@link LRUCache#peek} method. + */ + interface PeekOptions extends Pick, 'allowStale'> { + status?: Status; + } + /** + * Options that may be passed to the {@link LRUCache#set} method. + */ + interface SetOptions extends Pick, 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'> { + /** + * If size tracking is enabled, then setting an explicit size + * in the {@link LRUCache#set} call will prevent calling the + * {@link OptionsBase.sizeCalculation} function. + */ + size?: Size; + /** + * If TTL tracking is enabled, then setting an explicit start + * time in the {@link LRUCache#set} call will override the + * default time from `performance.now()` or `Date.now()`. + * + * Note that it must be a valid value for whichever time-tracking + * method is in use. + */ + start?: Milliseconds; + status?: Status; + } + /** + * The type signature for the {@link OptionsBase.fetchMethod} option. + */ + type Fetcher = (key: K, staleValue: V | undefined, options: FetcherOptions) => Promise | V | undefined | void; + /** + * the type signature for the {@link OptionsBase.memoMethod} option. + */ + type Memoizer = (key: K, staleValue: V | undefined, options: MemoizerOptions) => V; + /** + * Options which may be passed to the {@link LRUCache} constructor. + * + * Most of these may be overridden in the various options that use + * them. + * + * Despite all being technically optional, the constructor requires that + * a cache is at minimum limited by one or more of {@link OptionsBase.max}, + * {@link OptionsBase.ttl}, or {@link OptionsBase.maxSize}. + * + * If {@link OptionsBase.ttl} is used alone, then it is strongly advised + * (and in fact required by the type definitions here) that the cache + * also set {@link OptionsBase.ttlAutopurge}, to prevent potentially + * unbounded storage. + * + * All options are also available on the {@link LRUCache} instance, making + * it safe to pass an LRUCache instance as the options argumemnt to + * make another empty cache of the same type. + * + * Some options are marked as read-only, because changing them after + * instantiation is not safe. Changing any of the other options will of + * course only have an effect on subsequent method calls. + */ + interface OptionsBase { + /** + * The maximum number of items to store in the cache before evicting + * old entries. This is read-only on the {@link LRUCache} instance, + * and may not be overridden. + * + * If set, then storage space will be pre-allocated at construction + * time, and the cache will perform significantly faster. + * + * Note that significantly fewer items may be stored, if + * {@link OptionsBase.maxSize} and/or {@link OptionsBase.ttl} are also + * set. + * + * **It is strongly recommended to set a `max` to prevent unbounded growth + * of the cache.** + */ + max?: Count; + /** + * Max time in milliseconds for items to live in cache before they are + * considered stale. Note that stale items are NOT preemptively removed by + * default, and MAY live in the cache, contributing to its LRU max, long + * after they have expired, unless {@link OptionsBase.ttlAutopurge} is + * set. + * + * If set to `0` (the default value), then that means "do not track + * TTL", not "expire immediately". + * + * Also, as this cache is optimized for LRU/MRU operations, some of + * the staleness/TTL checks will reduce performance, as they will incur + * overhead by deleting items. + * + * This is not primarily a TTL cache, and does not make strong TTL + * guarantees. There is no pre-emptive pruning of expired items, but you + * _may_ set a TTL on the cache, and it will treat expired items as missing + * when they are fetched, and delete them. + * + * Optional, but must be a non-negative integer in ms if specified. + * + * This may be overridden by passing an options object to `cache.set()`. + * + * At least one of `max`, `maxSize`, or `TTL` is required. This must be a + * positive integer if set. + * + * Even if ttl tracking is enabled, **it is strongly recommended to set a + * `max` to prevent unbounded growth of the cache.** + * + * If ttl tracking is enabled, and `max` and `maxSize` are not set, + * and `ttlAutopurge` is not set, then a warning will be emitted + * cautioning about the potential for unbounded memory consumption. + * (The TypeScript definitions will also discourage this.) + */ + ttl?: Milliseconds; + /** + * Minimum amount of time in ms in which to check for staleness. + * Defaults to 1, which means that the current time is checked + * at most once per millisecond. + * + * Set to 0 to check the current time every time staleness is tested. + * (This reduces performance, and is theoretically unnecessary.) + * + * Setting this to a higher value will improve performance somewhat + * while using ttl tracking, albeit at the expense of keeping stale + * items around a bit longer than their TTLs would indicate. + * + * @default 1 + */ + ttlResolution?: Milliseconds; + /** + * Preemptively remove stale items from the cache. + * + * Note that this may *significantly* degrade performance, especially if + * the cache is storing a large number of items. It is almost always best + * to just leave the stale items in the cache, and let them fall out as new + * items are added. + * + * Note that this means that {@link OptionsBase.allowStale} is a bit + * pointless, as stale items will be deleted almost as soon as they + * expire. + * + * Use with caution! + */ + ttlAutopurge?: boolean; + /** + * When using time-expiring entries with `ttl`, setting this to `true` will + * make each item's age reset to 0 whenever it is retrieved from cache with + * {@link LRUCache#get}, causing it to not expire. (It can still fall out + * of cache based on recency of use, of course.) + * + * Has no effect if {@link OptionsBase.ttl} is not set. + * + * This may be overridden by passing an options object to `cache.get()`. + */ + updateAgeOnGet?: boolean; + /** + * When using time-expiring entries with `ttl`, setting this to `true` will + * make each item's age reset to 0 whenever its presence in the cache is + * checked with {@link LRUCache#has}, causing it to not expire. (It can + * still fall out of cache based on recency of use, of course.) + * + * Has no effect if {@link OptionsBase.ttl} is not set. + */ + updateAgeOnHas?: boolean; + /** + * Allow {@link LRUCache#get} and {@link LRUCache#fetch} calls to return + * stale data, if available. + * + * By default, if you set `ttl`, stale items will only be deleted from the + * cache when you `get(key)`. That is, it's not preemptively pruning items, + * unless {@link OptionsBase.ttlAutopurge} is set. + * + * If you set `allowStale:true`, it'll return the stale value *as well as* + * deleting it. If you don't set this, then it'll return `undefined` when + * you try to get a stale entry. + * + * Note that when a stale entry is fetched, _even if it is returned due to + * `allowStale` being set_, it is removed from the cache immediately. You + * can suppress this behavior by setting + * {@link OptionsBase.noDeleteOnStaleGet}, either in the constructor, or in + * the options provided to {@link LRUCache#get}. + * + * This may be overridden by passing an options object to `cache.get()`. + * The `cache.has()` method will always return `false` for stale items. + * + * Only relevant if a ttl is set. + */ + allowStale?: boolean; + /** + * Function that is called on items when they are dropped from the + * cache, as `dispose(value, key, reason)`. + * + * This can be handy if you want to close file descriptors or do + * other cleanup tasks when items are no longer stored in the cache. + * + * **NOTE**: It is called _before_ the item has been fully removed + * from the cache, so if you want to put it right back in, you need + * to wait until the next tick. If you try to add it back in during + * the `dispose()` function call, it will break things in subtle and + * weird ways. + * + * Unlike several other options, this may _not_ be overridden by + * passing an option to `set()`, for performance reasons. + * + * The `reason` will be one of the following strings, corresponding + * to the reason for the item's deletion: + * + * - `evict` Item was evicted to make space for a new addition + * - `set` Item was overwritten by a new value + * - `expire` Item expired its TTL + * - `fetch` Item was deleted due to a failed or aborted fetch, or a + * fetchMethod returning `undefined. + * - `delete` Item was removed by explicit `cache.delete(key)`, + * `cache.clear()`, or `cache.set(key, undefined)`. + */ + dispose?: Disposer; + /** + * Function that is called when new items are inserted into the cache, + * as `onInsert(value, key, reason)`. + * + * This can be useful if you need to perform actions when an item is + * added, such as logging or tracking insertions. + * + * Unlike some other options, this may _not_ be overridden by passing + * an option to `set()`, for performance and consistency reasons. + */ + onInsert?: Inserter; + /** + * The same as {@link OptionsBase.dispose}, but called *after* the entry + * is completely removed and the cache is once again in a clean state. + * + * It is safe to add an item right back into the cache at this point. + * However, note that it is *very* easy to inadvertently create infinite + * recursion this way. + */ + disposeAfter?: Disposer; + /** + * Set to true to suppress calling the + * {@link OptionsBase.dispose} function if the entry key is + * still accessible within the cache. + * + * This may be overridden by passing an options object to + * {@link LRUCache#set}. + * + * Only relevant if `dispose` or `disposeAfter` are set. + */ + noDisposeOnSet?: boolean; + /** + * Boolean flag to tell the cache to not update the TTL when setting a new + * value for an existing key (ie, when updating a value rather than + * inserting a new value). Note that the TTL value is _always_ set (if + * provided) when adding a new entry into the cache. + * + * Has no effect if a {@link OptionsBase.ttl} is not set. + * + * May be passed as an option to {@link LRUCache#set}. + */ + noUpdateTTL?: boolean; + /** + * Set to a positive integer to track the sizes of items added to the + * cache, and automatically evict items in order to stay below this size. + * Note that this may result in fewer than `max` items being stored. + * + * Attempting to add an item to the cache whose calculated size is greater + * that this amount will be a no-op. The item will not be cached, and no + * other items will be evicted. + * + * Optional, must be a positive integer if provided. + * + * Sets `maxEntrySize` to the same value, unless a different value is + * provided for `maxEntrySize`. + * + * At least one of `max`, `maxSize`, or `TTL` is required. This must be a + * positive integer if set. + * + * Even if size tracking is enabled, **it is strongly recommended to set a + * `max` to prevent unbounded growth of the cache.** + * + * Note also that size tracking can negatively impact performance, + * though for most cases, only minimally. + */ + maxSize?: Size; + /** + * The effective size for background fetch promises. + * + * This has no effect unless `maxSize` and `sizeCalculation` are used, + * and a {@link LRUCache.OptionsBase.fetchMethod} is provided to + * support {@link LRUCache#fetch}. + * + * If a stale value is present in the cache, then the effective size of + * the background fetch is the size of the stale item it will eventually + * replace. If not, then this value is used as its effective size. + * + * @default 1 + */ + backgroundFetchSize?: number; + /** + * The maximum allowed size for any single item in the cache. + * + * If a larger item is passed to {@link LRUCache#set} or returned by a + * {@link OptionsBase.fetchMethod} or {@link OptionsBase.memoMethod}, then + * it will not be stored in the cache. + * + * Attempting to add an item whose calculated size is greater than + * this amount will not cache the item or evict any old items, but + * WILL delete an existing value if one is already present. + * + * Optional, must be a positive integer if provided. Defaults to + * the value of `maxSize` if provided. + */ + maxEntrySize?: Size; + /** + * A function that returns a number indicating the item's size. + * + * Requires {@link OptionsBase.maxSize} to be set. + * + * If not provided, and {@link OptionsBase.maxSize} or + * {@link OptionsBase.maxEntrySize} are set, then all + * {@link LRUCache#set} calls **must** provide an explicit + * {@link SetOptions.size} or sizeCalculation param. + */ + sizeCalculation?: SizeCalculator; + /** + * Method that provides the implementation for {@link LRUCache#fetch} + * + * ```ts + * fetchMethod(key, staleValue, { signal, options, context }) + * ``` + * + * If `fetchMethod` is not provided, then `cache.fetch(key)` is equivalent + * to `Promise.resolve(cache.get(key))`. + * + * If at any time, `signal.aborted` is set to `true`, or if the + * `signal.onabort` method is called, or if it emits an `'abort'` event + * which you can listen to with `addEventListener`, then that means that + * the fetch should be abandoned. This may be passed along to async + * functions aware of AbortController/AbortSignal behavior. + * + * The `fetchMethod` should **only** return `undefined` or a Promise + * resolving to `undefined` if the AbortController signaled an `abort` + * event. In all other cases, it should return or resolve to a value + * suitable for adding to the cache. + * + * The `options` object is a union of the options that may be provided to + * `set()` and `get()`. If they are modified, then that will result in + * modifying the settings to `cache.set()` when the value is resolved, and + * in the case of + * {@link OptionsBase.noDeleteOnFetchRejection} and + * {@link OptionsBase.allowStaleOnFetchRejection}, the handling of + * `fetchMethod` failures. + * + * For example, a DNS cache may update the TTL based on the value returned + * from a remote DNS server by changing `options.ttl` in the `fetchMethod`. + */ + fetchMethod?: Fetcher; + /** + * Method that provides the implementation for {@link LRUCache#memo} + */ + memoMethod?: Memoizer; + /** + * Set to true to suppress the deletion of stale data when a + * {@link OptionsBase.fetchMethod} returns a rejected promise. + */ + noDeleteOnFetchRejection?: boolean; + /** + * Do not delete stale items when they are retrieved with + * {@link LRUCache#get}. + * + * Note that the `get` return value will still be `undefined` + * unless {@link OptionsBase.allowStale} is true. + * + * When using time-expiring entries with `ttl`, by default stale + * items will be removed from the cache when the key is accessed + * with `cache.get()`. + * + * Setting this option will cause stale items to remain in the cache, until + * they are explicitly deleted with `cache.delete(key)`, or retrieved with + * `noDeleteOnStaleGet` set to `false`. + * + * This may be overridden by passing an options object to `cache.get()`. + * + * Only relevant if a ttl is used. + */ + noDeleteOnStaleGet?: boolean; + /** + * Set to true to allow returning stale data when a + * {@link OptionsBase.fetchMethod} throws an error or returns a rejected + * promise. + * + * This differs from using {@link OptionsBase.allowStale} in that stale + * data will ONLY be returned in the case that the {@link LRUCache#fetch} + * fails, not any other times. + * + * If a `fetchMethod` fails, and there is no stale value available, the + * `fetch()` will resolve to `undefined`. Ie, all `fetchMethod` errors are + * suppressed. + * + * Implies `noDeleteOnFetchRejection`. + * + * This may be set in calls to `fetch()`, or defaulted on the constructor, + * or overridden by modifying the options object in the `fetchMethod`. + */ + allowStaleOnFetchRejection?: boolean; + /** + * Set to true to return a stale value from the cache when the + * `AbortSignal` passed to the {@link OptionsBase.fetchMethod} dispatches + * an `'abort'` event, whether user-triggered, or due to internal cache + * behavior. + * + * Unless {@link OptionsBase.ignoreFetchAbort} is also set, the underlying + * {@link OptionsBase.fetchMethod} will still be considered canceled, and + * any value it returns will be ignored and not cached. + * + * Caveat: since fetches are aborted when a new value is explicitly + * set in the cache, this can lead to fetch returning a stale value, + * since that was the fallback value _at the moment the `fetch()` was + * initiated_, even though the new updated value is now present in + * the cache. + * + * For example: + * + * ```ts + * const cache = new LRUCache({ + * ttl: 100, + * fetchMethod: async (url, oldValue, { signal }) => { + * const res = await fetch(url, { signal }) + * return await res.json() + * } + * }) + * cache.set('https://example.com/', { some: 'data' }) + * // 100ms go by... + * const result = cache.fetch('https://example.com/') + * cache.set('https://example.com/', { other: 'thing' }) + * console.log(await result) // { some: 'data' } + * console.log(cache.get('https://example.com/')) // { other: 'thing' } + * ``` + */ + allowStaleOnFetchAbort?: boolean; + /** + * Set to true to ignore the `abort` event emitted by the `AbortSignal` + * object passed to {@link OptionsBase.fetchMethod}, and still cache the + * resulting resolution value, as long as it is not `undefined`. + * + * When used on its own, this means aborted {@link LRUCache#fetch} calls + * are not immediately resolved or rejected when they are aborted, and + * instead take the full time to await. + * + * When used with {@link OptionsBase.allowStaleOnFetchAbort}, aborted + * {@link LRUCache#fetch} calls will resolve immediately to their stale + * cached value or `undefined`, and will continue to process and eventually + * update the cache when they resolve, as long as the resulting value is + * not `undefined`, thus supporting a "return stale on timeout while + * refreshing" mechanism by passing `AbortSignal.timeout(n)` as the signal. + * + * For example: + * + * ```ts + * const c = new LRUCache({ + * ttl: 100, + * ignoreFetchAbort: true, + * allowStaleOnFetchAbort: true, + * fetchMethod: async (key, oldValue, { signal }) => { + * // note: do NOT pass the signal to fetch()! + * // let's say this fetch can take a long time. + * const res = await fetch(`https://slow-backend-server/${key}`) + * return await res.json() + * }, + * }) + * + * // this will return the stale value after 100ms, while still + * // updating in the background for next time. + * const val = await c.fetch('key', { signal: AbortSignal.timeout(100) }) + * ``` + * + * **Note**: regardless of this setting, an `abort` event _is still + * emitted on the `AbortSignal` object_, so may result in invalid results + * when passed to other underlying APIs that use AbortSignals. + * + * This may be overridden in the {@link OptionsBase.fetchMethod} or the + * call to {@link LRUCache#fetch}. + */ + ignoreFetchAbort?: boolean; + /** + * In some cases, you may want to swap out the performance/Date object + * used for TTL tracking. This should almost certainly NOT be done in + * production environments! + * + * This value defaults to `global.performance` if it has a `now()` method, + * or the `global.Date` object otherwise. + */ + perf?: Perf; + } + interface OptionsMaxLimit extends OptionsBase { + max: Count; + } + interface OptionsTTLLimit extends OptionsBase { + ttl: Milliseconds; + ttlAutopurge: boolean; + } + interface OptionsSizeLimit extends OptionsBase { + maxSize: Size; + } + /** + * The valid safe options for the {@link LRUCache} constructor + */ + type Options = OptionsMaxLimit | OptionsSizeLimit | OptionsTTLLimit; + /** + * Entry objects used by {@link LRUCache#load} and {@link LRUCache#dump}, + * and returned by {@link LRUCache#info}. + */ + interface Entry { + value: V; + ttl?: Milliseconds; + size?: Size; + start?: Milliseconds; + } +} +/** + * Default export, the thing you're using this module to get. + * + * The `K` and `V` types define the key and value types, respectively. The + * optional `FC` type defines the type of the `context` object passed to + * `cache.fetch()` and `cache.memo()`. + * + * Keys and values **must not** be `null` or `undefined`. + * + * All properties from the options object (with the exception of `max`, + * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are + * added as normal public members. (The listed options are read-only getters.) + * + * Changing any of these will alter the defaults for subsequent method calls. + */ +export declare class LRUCache { + #private; + /** + * {@link LRUCache.OptionsBase.perf} + */ + get perf(): Perf; + /** + * {@link LRUCache.OptionsBase.ttl} + */ + ttl: LRUCache.Milliseconds; + /** + * {@link LRUCache.OptionsBase.ttlResolution} + */ + ttlResolution: LRUCache.Milliseconds; + /** + * {@link LRUCache.OptionsBase.ttlAutopurge} + */ + ttlAutopurge: boolean; + /** + * {@link LRUCache.OptionsBase.updateAgeOnGet} + */ + updateAgeOnGet: boolean; + /** + * {@link LRUCache.OptionsBase.updateAgeOnHas} + */ + updateAgeOnHas: boolean; + /** + * {@link LRUCache.OptionsBase.allowStale} + */ + allowStale: boolean; + /** + * {@link LRUCache.OptionsBase.noDisposeOnSet} + */ + noDisposeOnSet: boolean; + /** + * {@link LRUCache.OptionsBase.noUpdateTTL} + */ + noUpdateTTL: boolean; + /** + * {@link LRUCache.OptionsBase.maxEntrySize} + */ + maxEntrySize: LRUCache.Size; + /** + * {@link LRUCache.OptionsBase.sizeCalculation} + */ + sizeCalculation?: LRUCache.SizeCalculator; + /** + * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection} + */ + noDeleteOnFetchRejection: boolean; + /** + * {@link LRUCache.OptionsBase.noDeleteOnStaleGet} + */ + noDeleteOnStaleGet: boolean; + /** + * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort} + */ + allowStaleOnFetchAbort: boolean; + /** + * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} + */ + allowStaleOnFetchRejection: boolean; + /** + * {@link LRUCache.OptionsBase.ignoreFetchAbort} + */ + ignoreFetchAbort: boolean; + /** {@link LRUCache.OptionsBase.backgroundFetchSize} */ + backgroundFetchSize: number; + /** + * Do not call this method unless you need to inspect the + * inner workings of the cache. If anything returned by this + * object is modified in any way, strange breakage may occur. + * + * These fields are private for a reason! + * + * @internal + */ + static unsafeExposeInternals(c: LRUCache): { + starts: ZeroArray | undefined; + ttls: ZeroArray | undefined; + autopurgeTimers: (NodeJS.Timeout | undefined)[] | undefined; + sizes: ZeroArray | undefined; + keyMap: Map; + keyList: (K | undefined)[]; + valList: (V | BackgroundFetch | undefined)[]; + next: NumberArray; + prev: NumberArray; + readonly head: Index; + readonly tail: Index; + free: StackLike; + isBackgroundFetch: (p: unknown) => p is BackgroundFetch; + backgroundFetch: (k: K, index: number | undefined, options: LRUCache.FetchOptions, context: unknown) => BackgroundFetch; + moveToTail: (index: number) => void; + indexes: (options?: { + allowStale: boolean; + }) => Generator; + rindexes: (options?: { + allowStale: boolean; + }) => Generator; + isStale: (index: number | undefined) => boolean; + }; + /** + * {@link LRUCache.OptionsBase.max} (read-only) + */ + get max(): LRUCache.Count; + /** + * {@link LRUCache.OptionsBase.maxSize} (read-only) + */ + get maxSize(): LRUCache.Count; + /** + * The total computed size of items in the cache (read-only) + */ + get calculatedSize(): LRUCache.Size; + /** + * The number of items stored in the cache (read-only) + */ + get size(): LRUCache.Count; + /** + * {@link LRUCache.OptionsBase.fetchMethod} (read-only) + */ + get fetchMethod(): LRUCache.Fetcher | undefined; + get memoMethod(): LRUCache.Memoizer | undefined; + /** + * {@link LRUCache.OptionsBase.dispose} (read-only) + */ + get dispose(): LRUCache.Disposer | undefined; + /** + * {@link LRUCache.OptionsBase.onInsert} (read-only) + */ + get onInsert(): LRUCache.Inserter | undefined; + /** + * {@link LRUCache.OptionsBase.disposeAfter} (read-only) + */ + get disposeAfter(): LRUCache.Disposer | undefined; + constructor(options: LRUCache.Options | LRUCache); + /** + * Return the number of ms left in the item's TTL. If item is not in cache, + * returns `0`. Returns `Infinity` if item is in cache without a defined TTL. + */ + getRemainingTTL(key: K): number; + /** + * Return a generator yielding `[key, value]` pairs, + * in order from most recently used to least recently used. + */ + entries(): Generator<[K, V], void, unknown>; + /** + * Inverse order version of {@link LRUCache.entries} + * + * Return a generator yielding `[key, value]` pairs, + * in order from least recently used to most recently used. + */ + rentries(): Generator<(K | V)[], void, unknown>; + /** + * Return a generator yielding the keys in the cache, + * in order from most recently used to least recently used. + */ + keys(): Generator; + /** + * Inverse order version of {@link LRUCache.keys} + * + * Return a generator yielding the keys in the cache, + * in order from least recently used to most recently used. + */ + rkeys(): Generator; + /** + * Return a generator yielding the values in the cache, + * in order from most recently used to least recently used. + */ + values(): Generator; + /** + * Inverse order version of {@link LRUCache.values} + * + * Return a generator yielding the values in the cache, + * in order from least recently used to most recently used. + */ + rvalues(): Generator; + /** + * Iterating over the cache itself yields the same results as + * {@link LRUCache.entries} + */ + [Symbol.iterator](): Generator<[K, V], void, unknown>; + /** + * A String value that is used in the creation of the default string + * description of an object. Called by the built-in method + * `Object.prototype.toString`. + */ + [Symbol.toStringTag]: string; + /** + * Find a value for which the supplied fn method returns a truthy value, + * similar to `Array.find()`. fn is called as `fn(value, key, cache)`. + */ + find(fn: (v: V, k: K, self: LRUCache) => boolean, getOptions?: LRUCache.GetOptions): V | undefined; + /** + * Call the supplied function on each item in the cache, in order from most + * recently used to least recently used. + * + * `fn` is called as `fn(value, key, cache)`. + * + * If `thisp` is provided, function will be called in the `this`-context of + * the provided object, or the cache if no `thisp` object is provided. + * + * Does not update age or recenty of use, or iterate over stale values. + */ + forEach(fn: (v: V, k: K, self: LRUCache) => unknown, thisp?: unknown): void; + /** + * The same as {@link LRUCache.forEach} but items are iterated over in + * reverse order. (ie, less recently used items are iterated over first.) + */ + rforEach(fn: (v: V, k: K, self: LRUCache) => unknown, thisp?: unknown): void; + /** + * Delete any stale entries. Returns true if anything was removed, + * false otherwise. + */ + purgeStale(): boolean; + /** + * Get the extended info about a given entry, to get its value, size, and + * TTL info simultaneously. Returns `undefined` if the key is not present. + * + * Unlike {@link LRUCache#dump}, which is designed to be portable and survive + * serialization, the `start` value is always the current timestamp, and the + * `ttl` is a calculated remaining time to live (negative if expired). + * + * Always returns stale values, if their info is found in the cache, so be + * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl}) + * if relevant. + */ + info(key: K): LRUCache.Entry | undefined; + /** + * Return an array of [key, {@link LRUCache.Entry}] tuples which can be + * passed to {@link LRUCache#load}. + * + * The `start` fields are calculated relative to a portable `Date.now()` + * timestamp, even if `performance.now()` is available. + * + * Stale entries are always included in the `dump`, even if + * {@link LRUCache.OptionsBase.allowStale} is false. + * + * Note: this returns an actual array, not a generator, so it can be more + * easily passed around. + */ + dump(): [K, LRUCache.Entry][]; + /** + * Reset the cache and load in the items in entries in the order listed. + * + * The shape of the resulting cache may be different if the same options are + * not used in both caches. + * + * The `start` fields are assumed to be calculated relative to a portable + * `Date.now()` timestamp, even if `performance.now()` is available. + */ + load(arr: [K, LRUCache.Entry][]): void; + /** + * Add a value to the cache. + * + * Note: if `undefined` is specified as a value, this is an alias for + * {@link LRUCache#delete} + * + * Fields on the {@link LRUCache.SetOptions} options param will override + * their corresponding values in the constructor options for the scope + * of this single `set()` operation. + * + * If `start` is provided, then that will set the effective start + * time for the TTL calculation. Note that this must be a previous + * value of `performance.now()` if supported, or a previous value of + * `Date.now()` if not. + * + * Options object may also include `size`, which will prevent + * calling the `sizeCalculation` function and just use the specified + * number if it is a positive integer, and `noDisposeOnSet` which + * will prevent calling a `dispose` function in the case of + * overwrites. + * + * If the `size` (or return value of `sizeCalculation`) for a given + * entry is greater than `maxEntrySize`, then the item will not be + * added to the cache. + * + * Will update the recency of the entry. + * + * If the value is `undefined`, then this is an alias for + * `cache.delete(key)`. `undefined` is never stored in the cache. + */ + set(k: K, v: V | undefined, setOptions?: LRUCache.SetOptions): this; + /** + * Evict the least recently used item, returning its value or + * `undefined` if cache is empty. + */ + pop(): V | undefined; + /** + * Check if a key is in the cache, without updating the recency of use. + * Will return false if the item is stale, even though it is technically + * in the cache. + * + * Check if a key is in the cache, without updating the recency of + * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set + * to `true` in either the options or the constructor. + * + * Will return `false` if the item is stale, even though it is technically in + * the cache. The difference can be determined (if it matters) by using a + * `status` argument, and inspecting the `has` field. + * + * Will not update item age unless + * {@link LRUCache.OptionsBase.updateAgeOnHas} is set. + */ + has(k: K, hasOptions?: LRUCache.HasOptions): boolean; + /** + * Like {@link LRUCache#get} but doesn't update recency or delete stale + * items. + * + * Returns `undefined` if the item is stale, unless + * {@link LRUCache.OptionsBase.allowStale} is set. + */ + peek(k: K, peekOptions?: LRUCache.PeekOptions): V | undefined; + /** + * Make an asynchronous cached fetch using the + * {@link LRUCache.OptionsBase.fetchMethod} function. + * + * If the value is in the cache and not stale, then the returned + * Promise resolves to the value. + * + * If not in the cache, or beyond its TTL staleness, then + * `fetchMethod(key, staleValue, { options, signal, context })` is + * called, and the value returned will be added to the cache once + * resolved. + * + * If called with `allowStale`, and an asynchronous fetch is + * currently in progress to reload a stale value, then the former + * stale value will be returned. + * + * If called with `forceRefresh`, then the cached item will be + * re-fetched, even if it is not stale. However, if `allowStale` is also + * set, then the old value will still be returned. This is useful + * in cases where you want to force a reload of a cached value. If + * a background fetch is already in progress, then `forceRefresh` + * has no effect. + * + * If multiple fetches for the same key are issued, then they will all be + * coalesced into a single call to fetchMethod. + * + * Note that this means that handling options such as + * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}, + * {@link LRUCache.FetchOptions.signal}, + * and {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} will be + * determined by the FIRST fetch() call for a given key. + * + * This is a known (fixable) shortcoming which will be addresed on when + * someone complains about it, as the fix would involve added complexity and + * may not be worth the costs for this edge case. + * + * If {@link LRUCache.OptionsBase.fetchMethod} is not specified, then this is + * effectively an alias for `Promise.resolve(cache.get(key))`. + * + * When the fetch method resolves to a value, if the fetch has not + * been aborted due to deletion, eviction, or being overwritten, + * then it is added to the cache using the options provided. + * + * If the key is evicted or deleted before the `fetchMethod` + * resolves, then the AbortSignal passed to the `fetchMethod` will + * receive an `abort` event, and the promise returned by `fetch()` + * will reject with the reason for the abort. + * + * If a `signal` is passed to the `fetch()` call, then aborting the + * signal will abort the fetch and cause the `fetch()` promise to + * reject with the reason provided. + * + * **Setting `context`** + * + * If an `FC` type is set to a type other than `unknown`, `void`, or + * `undefined` in the {@link LRUCache} constructor, then all + * calls to `cache.fetch()` _must_ provide a `context` option. If + * set to `undefined` or `void`, then calls to fetch _must not_ + * provide a `context` option. + * + * The `context` param allows you to provide arbitrary data that + * might be relevant in the course of fetching the data. It is only + * relevant for the course of a single `fetch()` operation, and + * discarded afterwards. + * + * **Note: `fetch()` calls are inflight-unique** + * + * If you call `fetch()` multiple times with the same key value, + * then every call after the first will resolve on the same + * promise1, + * _even if they have different settings that would otherwise change + * the behavior of the fetch_, such as `noDeleteOnFetchRejection` + * or `ignoreFetchAbort`. + * + * In most cases, this is not a problem (in fact, only fetching + * something once is what you probably want, if you're caching in + * the first place). If you are changing the fetch() options + * dramatically between runs, there's a good chance that you might + * be trying to fit divergent semantics into a single object, and + * would be better off with multiple cache instances. + * + * **1**: Ie, they're not the "same Promise", but they resolve at + * the same time, because they're both waiting on the same + * underlying fetchMethod response. + */ + fetch(k: K, fetchOptions: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : LRUCache.FetchOptionsWithContext): Promise; + fetch(k: unknown extends FC ? K : FC extends undefined | void ? K : never, fetchOptions?: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : never): Promise; + /** + * In some cases, `cache.fetch()` may resolve to `undefined`, either because + * a {@link LRUCache.OptionsBase#fetchMethod} was not provided (turning + * `cache.fetch(k)` into just an async wrapper around `cache.get(k)`) or + * because `ignoreFetchAbort` was specified (either to the constructor or + * in the {@link LRUCache.FetchOptions}). Also, the + * {@link LRUCache.OptionsBase.fetchMethod} may return `undefined` or `void`, making + * the test even more complicated. + * + * Because inferring the cases where `undefined` might be returned are so + * cumbersome, but testing for `undefined` can also be annoying, this method + * can be used, which will reject if `this.fetch()` resolves to undefined. + */ + forceFetch(k: K, fetchOptions: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : LRUCache.FetchOptionsWithContext): Promise; + forceFetch(k: unknown extends FC ? K : FC extends undefined | void ? K : never, fetchOptions?: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : never): Promise; + /** + * If the key is found in the cache, then this is equivalent to + * {@link LRUCache#get}. If not, in the cache, then calculate the value using + * the {@link LRUCache.OptionsBase.memoMethod}, and add it to the cache. + * + * If an `FC` type is set to a type other than `unknown`, `void`, or + * `undefined` in the LRUCache constructor, then all calls to `cache.memo()` + * _must_ provide a `context` option. If set to `undefined` or `void`, then + * calls to memo _must not_ provide a `context` option. + * + * The `context` param allows you to provide arbitrary data that might be + * relevant in the course of fetching the data. It is only relevant for the + * course of a single `memo()` operation, and discarded afterwards. + */ + memo(k: K, memoOptions: unknown extends FC ? LRUCache.MemoOptions : FC extends undefined | void ? LRUCache.MemoOptionsNoContext : LRUCache.MemoOptionsWithContext): V; + memo(k: unknown extends FC ? K : FC extends undefined | void ? K : never, memoOptions?: unknown extends FC ? LRUCache.MemoOptions : FC extends undefined | void ? LRUCache.MemoOptionsNoContext : never): V; + /** + * Return a value from the cache. Will update the recency of the cache + * entry found. + * + * If the key is not found, get() will return `undefined`. + */ + get(k: K, getOptions?: LRUCache.GetOptions): V | undefined; + /** + * Deletes a key out of the cache. + * + * Returns true if the key was deleted, false otherwise. + */ + delete(k: K): boolean; + /** + * Clear the cache entirely, throwing away all values. + */ + clear(): void; +} +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/browser/index.d.ts.map b/node_modules/lru-cache/dist/esm/browser/index.d.ts.map new file mode 100644 index 00000000..fa98a0f5 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/browser/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/browser/index.js b/node_modules/lru-cache/dist/esm/browser/index.js new file mode 100644 index 00000000..2dd10cf8 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/browser/index.js @@ -0,0 +1,1722 @@ +/** + * @module LRUCache + */ +import { metrics, tracing } from './diagnostics-channel.js'; +import { defaultPerf } from './perf.js'; +const hasSubscribers = () => metrics.hasSubscribers || tracing.hasSubscribers; +const warned = new Set(); +/* c8 ignore start */ +const PROCESS = (typeof process === 'object' && !!process ? + process + : {}); +/* c8 ignore stop */ +const emitWarning = (msg, type, code, fn) => { + if (typeof PROCESS.emitWarning === 'function') { + PROCESS.emitWarning(msg, type, code, fn); + } + else { + //oxlint-disable-next-line no-console + console.error(`[${code}] ${type}: ${msg}`); + } +}; +const shouldWarn = (code) => !warned.has(code); +const TYPE = Symbol('type'); +const isPosInt = (n) => !!n && n === Math.floor(n) && n > 0 && isFinite(n); +// This is a little bit ridiculous, tbh. +// The maximum array length is 2^32-1 or thereabouts on most JS impls. +// And well before that point, you're caching the entire world, I mean, +// that's ~32GB of just integers for the next/prev links, plus whatever +// else to hold that many keys and values. Just filling the memory with +// zeroes at init time is brutal when you get that big. +// But why not be complete? +// Maybe in the future, these limits will have expanded. +/* c8 ignore start */ +const getUintArray = (max) => !isPosInt(max) ? null + : max <= Math.pow(2, 8) ? Uint8Array + : max <= Math.pow(2, 16) ? Uint16Array + : max <= Math.pow(2, 32) ? Uint32Array + : max <= Number.MAX_SAFE_INTEGER ? ZeroArray + : null; +/* c8 ignore stop */ +class ZeroArray extends Array { + constructor(size) { + super(size); + this.fill(0); + } +} +class Stack { + /* c8 ignore start - not sure why this is showing up uncovered?? */ + heap; + /* c8 ignore stop */ + length; + // private constructor + static #constructing = false; + static create(max) { + const HeapCls = getUintArray(max); + if (!HeapCls) + return []; + Stack.#constructing = true; + const s = new Stack(max, HeapCls); + Stack.#constructing = false; + return s; + } + constructor(max, HeapCls) { + /* c8 ignore start */ + if (!Stack.#constructing) { + throw new TypeError('instantiate Stack using Stack.create(n)'); + } + /* c8 ignore stop */ + this.heap = new HeapCls(max); + this.length = 0; + } + push(n) { + this.heap[this.length++] = n; + } + pop() { + return this.heap[--this.length]; + } +} +/** + * Default export, the thing you're using this module to get. + * + * The `K` and `V` types define the key and value types, respectively. The + * optional `FC` type defines the type of the `context` object passed to + * `cache.fetch()` and `cache.memo()`. + * + * Keys and values **must not** be `null` or `undefined`. + * + * All properties from the options object (with the exception of `max`, + * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are + * added as normal public members. (The listed options are read-only getters.) + * + * Changing any of these will alter the defaults for subsequent method calls. + */ +export class LRUCache { + // options that cannot be changed without disaster + #max; + #maxSize; + #dispose; + #onInsert; + #disposeAfter; + #fetchMethod; + #memoMethod; + #perf; + /** + * {@link LRUCache.OptionsBase.perf} + */ + get perf() { + return this.#perf; + } + /** + * {@link LRUCache.OptionsBase.ttl} + */ + ttl; + /** + * {@link LRUCache.OptionsBase.ttlResolution} + */ + ttlResolution; + /** + * {@link LRUCache.OptionsBase.ttlAutopurge} + */ + ttlAutopurge; + /** + * {@link LRUCache.OptionsBase.updateAgeOnGet} + */ + updateAgeOnGet; + /** + * {@link LRUCache.OptionsBase.updateAgeOnHas} + */ + updateAgeOnHas; + /** + * {@link LRUCache.OptionsBase.allowStale} + */ + allowStale; + /** + * {@link LRUCache.OptionsBase.noDisposeOnSet} + */ + noDisposeOnSet; + /** + * {@link LRUCache.OptionsBase.noUpdateTTL} + */ + noUpdateTTL; + /** + * {@link LRUCache.OptionsBase.maxEntrySize} + */ + maxEntrySize; + /** + * {@link LRUCache.OptionsBase.sizeCalculation} + */ + sizeCalculation; + /** + * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection} + */ + noDeleteOnFetchRejection; + /** + * {@link LRUCache.OptionsBase.noDeleteOnStaleGet} + */ + noDeleteOnStaleGet; + /** + * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort} + */ + allowStaleOnFetchAbort; + /** + * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} + */ + allowStaleOnFetchRejection; + /** + * {@link LRUCache.OptionsBase.ignoreFetchAbort} + */ + ignoreFetchAbort; + /** {@link LRUCache.OptionsBase.backgroundFetchSize} */ + backgroundFetchSize; + // computed properties + #size; + #calculatedSize; + #keyMap; + #keyList; + #valList; + #next; + #prev; + #head; + #tail; + #free; + #disposed; + #sizes; + #starts; + #ttls; + #autopurgeTimers; + #hasDispose; + #hasFetchMethod; + #hasDisposeAfter; + #hasOnInsert; + /** + * Do not call this method unless you need to inspect the + * inner workings of the cache. If anything returned by this + * object is modified in any way, strange breakage may occur. + * + * These fields are private for a reason! + * + * @internal + */ + static unsafeExposeInternals(c) { + return { + // properties + starts: c.#starts, + ttls: c.#ttls, + autopurgeTimers: c.#autopurgeTimers, + sizes: c.#sizes, + keyMap: c.#keyMap, + keyList: c.#keyList, + valList: c.#valList, + next: c.#next, + prev: c.#prev, + get head() { + return c.#head; + }, + get tail() { + return c.#tail; + }, + free: c.#free, + // methods + isBackgroundFetch: (p) => c.#isBackgroundFetch(p), + backgroundFetch: (k, index, options, context) => c.#backgroundFetch(k, index, options, context), + moveToTail: (index) => c.#moveToTail(index), + indexes: (options) => c.#indexes(options), + rindexes: (options) => c.#rindexes(options), + isStale: (index) => c.#isStale(index), + }; + } + // Protected read-only members + /** + * {@link LRUCache.OptionsBase.max} (read-only) + */ + get max() { + return this.#max; + } + /** + * {@link LRUCache.OptionsBase.maxSize} (read-only) + */ + get maxSize() { + return this.#maxSize; + } + /** + * The total computed size of items in the cache (read-only) + */ + get calculatedSize() { + return this.#calculatedSize; + } + /** + * The number of items stored in the cache (read-only) + */ + get size() { + return this.#size; + } + /** + * {@link LRUCache.OptionsBase.fetchMethod} (read-only) + */ + get fetchMethod() { + return this.#fetchMethod; + } + get memoMethod() { + return this.#memoMethod; + } + /** + * {@link LRUCache.OptionsBase.dispose} (read-only) + */ + get dispose() { + return this.#dispose; + } + /** + * {@link LRUCache.OptionsBase.onInsert} (read-only) + */ + get onInsert() { + return this.#onInsert; + } + /** + * {@link LRUCache.OptionsBase.disposeAfter} (read-only) + */ + get disposeAfter() { + return this.#disposeAfter; + } + constructor(options) { + const { max = 0, ttl, ttlResolution = 1, ttlAutopurge, updateAgeOnGet, updateAgeOnHas, allowStale, dispose, onInsert, disposeAfter, noDisposeOnSet, noUpdateTTL, maxSize = 0, maxEntrySize = 0, sizeCalculation, fetchMethod, memoMethod, noDeleteOnFetchRejection, noDeleteOnStaleGet, allowStaleOnFetchRejection, allowStaleOnFetchAbort, ignoreFetchAbort, backgroundFetchSize = 1, perf, } = options; + this.backgroundFetchSize = backgroundFetchSize; + if (perf !== undefined) { + if (typeof perf?.now !== 'function') { + throw new TypeError('perf option must have a now() method if specified'); + } + } + this.#perf = perf ?? defaultPerf; + if (max !== 0 && !isPosInt(max)) { + throw new TypeError('max option must be a nonnegative integer'); + } + const UintArray = max ? getUintArray(max) : Array; + if (!UintArray) { + throw new Error('invalid max value: ' + max); + } + this.#max = max; + this.#maxSize = maxSize; + this.maxEntrySize = maxEntrySize || this.#maxSize; + this.sizeCalculation = sizeCalculation; + if (this.sizeCalculation) { + if (!this.#maxSize && !this.maxEntrySize) { + throw new TypeError('cannot set sizeCalculation without setting maxSize or maxEntrySize'); + } + if (typeof this.sizeCalculation !== 'function') { + throw new TypeError('sizeCalculation set to non-function'); + } + } + if (memoMethod !== undefined && typeof memoMethod !== 'function') { + throw new TypeError('memoMethod must be a function if defined'); + } + this.#memoMethod = memoMethod; + if (fetchMethod !== undefined && typeof fetchMethod !== 'function') { + throw new TypeError('fetchMethod must be a function if specified'); + } + this.#fetchMethod = fetchMethod; + this.#hasFetchMethod = !!fetchMethod; + this.#keyMap = new Map(); + this.#keyList = Array.from({ length: max }).fill(undefined); + this.#valList = Array.from({ length: max }).fill(undefined); + this.#next = new UintArray(max); + this.#prev = new UintArray(max); + this.#head = 0; + this.#tail = 0; + this.#free = Stack.create(max); + this.#size = 0; + this.#calculatedSize = 0; + if (typeof dispose === 'function') { + this.#dispose = dispose; + } + if (typeof onInsert === 'function') { + this.#onInsert = onInsert; + } + if (typeof disposeAfter === 'function') { + this.#disposeAfter = disposeAfter; + this.#disposed = []; + } + else { + this.#disposeAfter = undefined; + this.#disposed = undefined; + } + this.#hasDispose = !!this.#dispose; + this.#hasOnInsert = !!this.#onInsert; + this.#hasDisposeAfter = !!this.#disposeAfter; + this.noDisposeOnSet = !!noDisposeOnSet; + this.noUpdateTTL = !!noUpdateTTL; + this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection; + this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection; + this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort; + this.ignoreFetchAbort = !!ignoreFetchAbort; + // NB: maxEntrySize is set to maxSize if it's set + if (this.maxEntrySize !== 0) { + if (this.#maxSize !== 0) { + if (!isPosInt(this.#maxSize)) { + throw new TypeError('maxSize must be a positive integer if specified'); + } + } + if (!isPosInt(this.maxEntrySize)) { + throw new TypeError('maxEntrySize must be a positive integer if specified'); + } + this.#initializeSizeTracking(); + } + this.allowStale = !!allowStale; + this.noDeleteOnStaleGet = !!noDeleteOnStaleGet; + this.updateAgeOnGet = !!updateAgeOnGet; + this.updateAgeOnHas = !!updateAgeOnHas; + this.ttlResolution = + isPosInt(ttlResolution) || ttlResolution === 0 ? ttlResolution : 1; + this.ttlAutopurge = !!ttlAutopurge; + this.ttl = ttl || 0; + if (this.ttl) { + if (!isPosInt(this.ttl)) { + throw new TypeError('ttl must be a positive integer if specified'); + } + this.#initializeTTLTracking(); + } + // do not allow completely unbounded caches + if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) { + throw new TypeError('At least one of max, maxSize, or ttl is required'); + } + if (!this.ttlAutopurge && !this.#max && !this.#maxSize) { + const code = 'LRU_CACHE_UNBOUNDED'; + if (shouldWarn(code)) { + warned.add(code); + const msg = 'TTL caching without ttlAutopurge, max, or maxSize can ' + + 'result in unbounded memory consumption.'; + emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache); + } + } + } + /** + * Return the number of ms left in the item's TTL. If item is not in cache, + * returns `0`. Returns `Infinity` if item is in cache without a defined TTL. + */ + getRemainingTTL(key) { + return this.#keyMap.has(key) ? Infinity : 0; + } + #initializeTTLTracking() { + const ttls = new ZeroArray(this.#max); + const starts = new ZeroArray(this.#max); + this.#ttls = ttls; + this.#starts = starts; + const purgeTimers = this.ttlAutopurge ? + Array.from({ + length: this.#max, + }) + : undefined; + this.#autopurgeTimers = purgeTimers; + this.#setItemTTL = (index, ttl, start = this.#perf.now()) => { + starts[index] = ttl !== 0 ? start : 0; + ttls[index] = ttl; + setPurgetTimer(index, ttl); + }; + this.#updateItemAge = index => { + starts[index] = ttls[index] !== 0 ? this.#perf.now() : 0; + setPurgetTimer(index, ttls[index]); + }; + // clear out the purge timer if we're setting TTL to 0, and + // previously had a ttl purge timer running, so it doesn't + // fire unnecessarily. Don't need to do this if we're not doing + // autopurge. + const setPurgetTimer = !this.ttlAutopurge ? + () => { } + : (index, ttl) => { + if (purgeTimers?.[index]) { + clearTimeout(purgeTimers[index]); + purgeTimers[index] = undefined; + } + if (ttl && ttl !== 0 && purgeTimers) { + const t = setTimeout(() => { + if (this.#isStale(index)) { + this.#delete(this.#keyList[index], 'expire'); + } + }, ttl + 1); + // unref() not supported on all platforms + /* c8 ignore start */ + if (t.unref) { + t.unref(); + } + /* c8 ignore stop */ + purgeTimers[index] = t; + } + }; + this.#statusTTL = (status, index) => { + if (ttls[index]) { + const ttl = ttls[index]; + const start = starts[index]; + /* c8 ignore start */ + if (!ttl || !start) { + return; + } + /* c8 ignore stop */ + status.ttl = ttl; + status.start = start; + status.now = cachedNow || getNow(); + const age = status.now - start; + status.remainingTTL = ttl - age; + } + }; + // debounce calls to perf.now() to 1s so we're not hitting + // that costly call repeatedly. + let cachedNow = 0; + const getNow = () => { + const n = this.#perf.now(); + if (this.ttlResolution > 0) { + cachedNow = n; + const t = setTimeout(() => (cachedNow = 0), this.ttlResolution); + // not available on all platforms + /* c8 ignore start */ + if (t.unref) { + t.unref(); + } + /* c8 ignore stop */ + } + return n; + }; + this.getRemainingTTL = key => { + const index = this.#keyMap.get(key); + if (index === undefined) { + return 0; + } + const ttl = ttls[index]; + const start = starts[index]; + if (!ttl || !start) { + return Infinity; + } + const age = (cachedNow || getNow()) - start; + return ttl - age; + }; + this.#isStale = index => { + const s = starts[index]; + const t = ttls[index]; + return !!t && !!s && (cachedNow || getNow()) - s > t; + }; + } + // conditionally set private methods related to TTL + #updateItemAge = () => { }; + #statusTTL = () => { }; + #setItemTTL = () => { }; + /* c8 ignore stop */ + #isStale = () => false; + #initializeSizeTracking() { + const sizes = new ZeroArray(this.#max); + this.#calculatedSize = 0; + this.#sizes = sizes; + this.#removeItemSize = index => { + this.#calculatedSize -= sizes[index]; + sizes[index] = 0; + }; + this.#requireSize = (k, v, size, sizeCalculation) => { + if (!isPosInt(size)) { + // provisionally accept background fetches. + // actual value size will be checked when they return. + if (this.#isBackgroundFetch(v)) { + // NB: this cannot occur if v.__staleWhileFetching is set, + // because in that case, it would take on the size of the + // existing entry that it temporarily replaces. + return this.backgroundFetchSize; + } + if (sizeCalculation) { + if (typeof sizeCalculation !== 'function') { + throw new TypeError('sizeCalculation must be a function'); + } + size = sizeCalculation(v, k); + if (!isPosInt(size)) { + throw new TypeError('sizeCalculation return invalid (expect positive integer)'); + } + } + else { + throw new TypeError('invalid size value (must be positive integer). ' + + 'When maxSize or maxEntrySize is used, sizeCalculation ' + + 'or size must be set.'); + } + } + return size; + }; + this.#addItemSize = (index, size, status) => { + sizes[index] = size; + if (this.#maxSize) { + const maxSize = this.#maxSize - sizes[index]; + while (this.#calculatedSize > maxSize) { + this.#evict(true); + } + } + this.#calculatedSize += sizes[index]; + if (status) { + status.entrySize = size; + status.totalCalculatedSize = this.#calculatedSize; + } + }; + } + #removeItemSize = _i => { }; + #addItemSize = (_i, _s, _st) => { }; + #requireSize = (_k, _v, size, sizeCalculation) => { + if (size || sizeCalculation) { + throw new TypeError('cannot set size without setting maxSize or maxEntrySize on cache'); + } + return 0; + }; + *#indexes({ allowStale = this.allowStale } = {}) { + if (this.#size) { + for (let i = this.#tail; this.#isValidIndex(i);) { + if (allowStale || !this.#isStale(i)) { + yield i; + } + if (i === this.#head) { + break; + } + else { + i = this.#prev[i]; + } + } + } + } + *#rindexes({ allowStale = this.allowStale } = {}) { + if (this.#size) { + for (let i = this.#head; this.#isValidIndex(i);) { + if (allowStale || !this.#isStale(i)) { + yield i; + } + if (i === this.#tail) { + break; + } + else { + i = this.#next[i]; + } + } + } + } + #isValidIndex(index) { + return (index !== undefined && + this.#keyMap.get(this.#keyList[index]) === index); + } + /** + * Return a generator yielding `[key, value]` pairs, + * in order from most recently used to least recently used. + */ + *entries() { + for (const i of this.#indexes()) { + if (this.#valList[i] !== undefined && + this.#keyList[i] !== undefined && + !this.#isBackgroundFetch(this.#valList[i])) { + yield [this.#keyList[i], this.#valList[i]]; + } + } + } + /** + * Inverse order version of {@link LRUCache.entries} + * + * Return a generator yielding `[key, value]` pairs, + * in order from least recently used to most recently used. + */ + *rentries() { + for (const i of this.#rindexes()) { + if (this.#valList[i] !== undefined && + this.#keyList[i] !== undefined && + !this.#isBackgroundFetch(this.#valList[i])) { + yield [this.#keyList[i], this.#valList[i]]; + } + } + } + /** + * Return a generator yielding the keys in the cache, + * in order from most recently used to least recently used. + */ + *keys() { + for (const i of this.#indexes()) { + const k = this.#keyList[i]; + if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield k; + } + } + } + /** + * Inverse order version of {@link LRUCache.keys} + * + * Return a generator yielding the keys in the cache, + * in order from least recently used to most recently used. + */ + *rkeys() { + for (const i of this.#rindexes()) { + const k = this.#keyList[i]; + if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield k; + } + } + } + /** + * Return a generator yielding the values in the cache, + * in order from most recently used to least recently used. + */ + *values() { + for (const i of this.#indexes()) { + const v = this.#valList[i]; + if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield this.#valList[i]; + } + } + } + /** + * Inverse order version of {@link LRUCache.values} + * + * Return a generator yielding the values in the cache, + * in order from least recently used to most recently used. + */ + *rvalues() { + for (const i of this.#rindexes()) { + const v = this.#valList[i]; + if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield this.#valList[i]; + } + } + } + /** + * Iterating over the cache itself yields the same results as + * {@link LRUCache.entries} + */ + [Symbol.iterator]() { + return this.entries(); + } + /** + * A String value that is used in the creation of the default string + * description of an object. Called by the built-in method + * `Object.prototype.toString`. + */ + [Symbol.toStringTag] = 'LRUCache'; + /** + * Find a value for which the supplied fn method returns a truthy value, + * similar to `Array.find()`. fn is called as `fn(value, key, cache)`. + */ + find(fn, getOptions = {}) { + for (const i of this.#indexes()) { + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined) + continue; + if (fn(value, this.#keyList[i], this)) { + return this.#get(this.#keyList[i], getOptions); + } + } + } + /** + * Call the supplied function on each item in the cache, in order from most + * recently used to least recently used. + * + * `fn` is called as `fn(value, key, cache)`. + * + * If `thisp` is provided, function will be called in the `this`-context of + * the provided object, or the cache if no `thisp` object is provided. + * + * Does not update age or recenty of use, or iterate over stale values. + */ + forEach(fn, thisp = this) { + for (const i of this.#indexes()) { + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined) + continue; + fn.call(thisp, value, this.#keyList[i], this); + } + } + /** + * The same as {@link LRUCache.forEach} but items are iterated over in + * reverse order. (ie, less recently used items are iterated over first.) + */ + rforEach(fn, thisp = this) { + for (const i of this.#rindexes()) { + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined) + continue; + fn.call(thisp, value, this.#keyList[i], this); + } + } + /** + * Delete any stale entries. Returns true if anything was removed, + * false otherwise. + */ + purgeStale() { + let deleted = false; + for (const i of this.#rindexes({ allowStale: true })) { + if (this.#isStale(i)) { + this.#delete(this.#keyList[i], 'expire'); + deleted = true; + } + } + return deleted; + } + /** + * Get the extended info about a given entry, to get its value, size, and + * TTL info simultaneously. Returns `undefined` if the key is not present. + * + * Unlike {@link LRUCache#dump}, which is designed to be portable and survive + * serialization, the `start` value is always the current timestamp, and the + * `ttl` is a calculated remaining time to live (negative if expired). + * + * Always returns stale values, if their info is found in the cache, so be + * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl}) + * if relevant. + */ + info(key) { + const i = this.#keyMap.get(key); + if (i === undefined) + return undefined; + const v = this.#valList[i]; + /* c8 ignore start - this isn't tested for the info function, + * but it's the same logic as found in other places. */ + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined) + return undefined; + /* c8 ignore stop */ + const entry = { value }; + if (this.#ttls && this.#starts) { + const ttl = this.#ttls[i]; + const start = this.#starts[i]; + if (ttl && start) { + const remain = ttl - (this.#perf.now() - start); + entry.ttl = remain; + entry.start = Date.now(); + } + } + if (this.#sizes) { + entry.size = this.#sizes[i]; + } + return entry; + } + /** + * Return an array of [key, {@link LRUCache.Entry}] tuples which can be + * passed to {@link LRUCache#load}. + * + * The `start` fields are calculated relative to a portable `Date.now()` + * timestamp, even if `performance.now()` is available. + * + * Stale entries are always included in the `dump`, even if + * {@link LRUCache.OptionsBase.allowStale} is false. + * + * Note: this returns an actual array, not a generator, so it can be more + * easily passed around. + */ + dump() { + const arr = []; + for (const i of this.#indexes({ allowStale: true })) { + const key = this.#keyList[i]; + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined || key === undefined) + continue; + const entry = { value }; + if (this.#ttls && this.#starts) { + entry.ttl = this.#ttls[i]; + // always dump the start relative to a portable timestamp + // it's ok for this to be a bit slow, it's a rare operation. + const age = this.#perf.now() - this.#starts[i]; + entry.start = Math.floor(Date.now() - age); + } + if (this.#sizes) { + entry.size = this.#sizes[i]; + } + arr.unshift([key, entry]); + } + return arr; + } + /** + * Reset the cache and load in the items in entries in the order listed. + * + * The shape of the resulting cache may be different if the same options are + * not used in both caches. + * + * The `start` fields are assumed to be calculated relative to a portable + * `Date.now()` timestamp, even if `performance.now()` is available. + */ + load(arr) { + this.clear(); + for (const [key, entry] of arr) { + if (entry.start) { + // entry.start is a portable timestamp, but we may be using + // node's performance.now(), so calculate the offset, so that + // we get the intended remaining TTL, no matter how long it's + // been on ice. + // + // it's ok for this to be a bit slow, it's a rare operation. + const age = Date.now() - entry.start; + entry.start = this.#perf.now() - age; + } + this.#set(key, entry.value, entry); + } + } + /** + * Add a value to the cache. + * + * Note: if `undefined` is specified as a value, this is an alias for + * {@link LRUCache#delete} + * + * Fields on the {@link LRUCache.SetOptions} options param will override + * their corresponding values in the constructor options for the scope + * of this single `set()` operation. + * + * If `start` is provided, then that will set the effective start + * time for the TTL calculation. Note that this must be a previous + * value of `performance.now()` if supported, or a previous value of + * `Date.now()` if not. + * + * Options object may also include `size`, which will prevent + * calling the `sizeCalculation` function and just use the specified + * number if it is a positive integer, and `noDisposeOnSet` which + * will prevent calling a `dispose` function in the case of + * overwrites. + * + * If the `size` (or return value of `sizeCalculation`) for a given + * entry is greater than `maxEntrySize`, then the item will not be + * added to the cache. + * + * Will update the recency of the entry. + * + * If the value is `undefined`, then this is an alias for + * `cache.delete(key)`. `undefined` is never stored in the cache. + */ + set(k, v, setOptions = {}) { + const { status = metrics.hasSubscribers ? {} : undefined } = setOptions; + setOptions.status = status; + if (status) { + status.op = 'set'; + status.key = k; + if (v !== undefined) + status.value = v; + status.cache = this; + } + const result = this.#set(k, v, setOptions); + if (status && metrics.hasSubscribers) { + metrics.publish(status); + } + return result; + } + #set(k, v, setOptions, bf) { + const { ttl = this.ttl, start, noDisposeOnSet = this.noDisposeOnSet, sizeCalculation = this.sizeCalculation, status, } = setOptions; + const isBF = this.#isBackgroundFetch(v); + if (v === undefined) { + if (status) + status.set = 'deleted'; + this.delete(k); + return this; + } + let { noUpdateTTL = this.noUpdateTTL } = setOptions; + if (status && !isBF) + status.value = v; + const size = this.#requireSize(k, v, setOptions.size || 0, sizeCalculation, status); + // if the item doesn't fit, don't do anything + // NB: maxEntrySize set to maxSize by default + if (this.maxEntrySize && size > this.maxEntrySize) { + // have to delete, in case something is there already. + this.#delete(k, 'set'); + if (status) { + status.set = 'miss'; + status.maxEntrySizeExceeded = true; + } + return this; + } + let index = this.#size === 0 ? undefined : this.#keyMap.get(k); + if (index === undefined) { + // addition + index = (this.#size === 0 ? this.#tail + : this.#free.length !== 0 ? this.#free.pop() + : this.#size === this.#max ? this.#evict(false) + : this.#size); + this.#keyList[index] = k; + this.#valList[index] = v; + this.#keyMap.set(k, index); + this.#next[this.#tail] = index; + this.#prev[index] = this.#tail; + this.#tail = index; + this.#size++; + this.#addItemSize(index, size, status); + if (status) + status.set = 'add'; + noUpdateTTL = false; + if (this.#hasOnInsert && !isBF) { + this.#onInsert?.(v, k, 'add'); + } + } + else { + // update + // might be updating a background fetch! + this.#moveToTail(index); + const oldVal = this.#valList[index]; + if (v !== oldVal) { + if (!noDisposeOnSet) { + if (this.#isBackgroundFetch(oldVal)) { + if (oldVal !== bf) { + // setting over a background fetch, not merely resolving it. + oldVal.__abortController.abort(new Error('replaced')); + } + const { __staleWhileFetching: s } = oldVal; + if (s !== undefined && s !== v) { + if (this.#hasDispose) { + this.#dispose?.(s, k, 'set'); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([s, k, 'set']); + } + } + } + else { + if (this.#hasDispose) { + this.#dispose?.(oldVal, k, 'set'); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([oldVal, k, 'set']); + } + } + } + this.#removeItemSize(index); + this.#addItemSize(index, size, status); + this.#valList[index] = v; + if (!isBF) { + const oldValue = oldVal && this.#isBackgroundFetch(oldVal) ? + oldVal.__staleWhileFetching + : oldVal; + const setType = oldValue === undefined ? 'add' + : v !== oldValue ? 'replace' + : 'update'; + if (status) { + status.set = setType; + if (oldValue !== undefined) + status.oldValue = oldValue; + } + if (this.#hasOnInsert) { + this.onInsert?.(v, k, setType); + } + } + } + else if (!isBF) { + if (status) { + status.set = 'update'; + } + if (this.#hasOnInsert) { + this.onInsert?.(v, k, 'update'); + } + } + } + if (ttl !== 0 && !this.#ttls) { + this.#initializeTTLTracking(); + } + if (this.#ttls) { + if (!noUpdateTTL) { + this.#setItemTTL(index, ttl, start); + } + if (status) + this.#statusTTL(status, index); + } + if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) { + const dt = this.#disposed; + let task; + while ((task = dt?.shift())) { + this.#disposeAfter?.(...task); + } + } + return this; + } + /** + * Evict the least recently used item, returning its value or + * `undefined` if cache is empty. + */ + pop() { + try { + while (this.#size) { + const val = this.#valList[this.#head]; + this.#evict(true); + if (this.#isBackgroundFetch(val)) { + if (val.__staleWhileFetching) { + return val.__staleWhileFetching; + } + } + else if (val !== undefined) { + return val; + } + } + } + finally { + if (this.#hasDisposeAfter && this.#disposed) { + const dt = this.#disposed; + let task; + while ((task = dt?.shift())) { + this.#disposeAfter?.(...task); + } + } + } + } + #evict(free) { + const head = this.#head; + const k = this.#keyList[head]; + const v = this.#valList[head]; + const isBF = this.#isBackgroundFetch(v); + if (isBF) { + v.__abortController.abort(new Error('evicted')); + } + const oldValue = isBF ? v.__staleWhileFetching : v; + if ((this.#hasDispose || this.#hasDisposeAfter) && + oldValue !== undefined) { + if (this.#hasDispose) { + this.#dispose?.(oldValue, k, 'evict'); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([oldValue, k, 'evict']); + } + } + this.#removeItemSize(head); + if (this.#autopurgeTimers?.[head]) { + clearTimeout(this.#autopurgeTimers[head]); + this.#autopurgeTimers[head] = undefined; + } + // if we aren't about to use the index, then null these out + if (free) { + this.#keyList[head] = undefined; + this.#valList[head] = undefined; + this.#free.push(head); + } + if (this.#size === 1) { + this.#head = this.#tail = 0; + this.#free.length = 0; + } + else { + this.#head = this.#next[head]; + } + this.#keyMap.delete(k); + this.#size--; + return head; + } + /** + * Check if a key is in the cache, without updating the recency of use. + * Will return false if the item is stale, even though it is technically + * in the cache. + * + * Check if a key is in the cache, without updating the recency of + * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set + * to `true` in either the options or the constructor. + * + * Will return `false` if the item is stale, even though it is technically in + * the cache. The difference can be determined (if it matters) by using a + * `status` argument, and inspecting the `has` field. + * + * Will not update item age unless + * {@link LRUCache.OptionsBase.updateAgeOnHas} is set. + */ + has(k, hasOptions = {}) { + const { status = metrics.hasSubscribers ? {} : undefined } = hasOptions; + hasOptions.status = status; + if (status) { + status.op = 'has'; + status.key = k; + status.cache = this; + } + const result = this.#has(k, hasOptions); + if (metrics.hasSubscribers) + metrics.publish(status); + return result; + } + #has(k, hasOptions = {}) { + const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions; + const index = this.#keyMap.get(k); + if (index !== undefined) { + const v = this.#valList[index]; + if (this.#isBackgroundFetch(v) && + v.__staleWhileFetching === undefined) { + return false; + } + if (!this.#isStale(index)) { + if (updateAgeOnHas) { + this.#updateItemAge(index); + } + if (status) { + status.has = 'hit'; + this.#statusTTL(status, index); + } + return true; + } + else if (status) { + status.has = 'stale'; + this.#statusTTL(status, index); + } + } + else if (status) { + status.has = 'miss'; + } + return false; + } + /** + * Like {@link LRUCache#get} but doesn't update recency or delete stale + * items. + * + * Returns `undefined` if the item is stale, unless + * {@link LRUCache.OptionsBase.allowStale} is set. + */ + peek(k, peekOptions = {}) { + const { status = hasSubscribers() ? {} : undefined } = peekOptions; + if (status) { + status.op = 'peek'; + status.key = k; + status.cache = this; + } + peekOptions.status = status; + const result = this.#peek(k, peekOptions); + if (metrics.hasSubscribers) { + metrics.publish(status); + } + return result; + } + #peek(k, peekOptions) { + const { status, allowStale = this.allowStale } = peekOptions; + const index = this.#keyMap.get(k); + if (index === undefined || (!allowStale && this.#isStale(index))) { + if (status) + status.peek = index === undefined ? 'miss' : 'stale'; + return undefined; + } + const v = this.#valList[index]; + const val = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (status) { + if (val !== undefined) { + status.peek = 'hit'; + status.value = val; + } + else { + status.peek = 'miss'; + } + } + return val; + } + #backgroundFetch(k, index, options, context) { + const v = index === undefined ? undefined : this.#valList[index]; + if (this.#isBackgroundFetch(v)) { + return v; + } + const ac = new AbortController(); + const { signal } = options; + // when/if our AC signals, then stop listening to theirs. + signal?.addEventListener('abort', () => ac.abort(signal.reason), { + signal: ac.signal, + }); + const fetchOpts = { + signal: ac.signal, + options, + context, + }; + const cb = (v, updateCache = false) => { + const { aborted } = ac.signal; + const ignoreAbort = options.ignoreFetchAbort && v !== undefined; + const proceed = options.ignoreFetchAbort || + !!(options.allowStaleOnFetchAbort && v !== undefined); + if (options.status) { + if (aborted && !updateCache) { + options.status.fetchAborted = true; + options.status.fetchError = ac.signal.reason; + if (ignoreAbort) + options.status.fetchAbortIgnored = true; + } + else { + options.status.fetchResolved = true; + } + } + if (aborted && !ignoreAbort && !updateCache) { + return fetchFail(ac.signal.reason, proceed); + } + // either we didn't abort, and are still here, or we did, and ignored + const bf = p; + // if nothing else has been written there but we're set to update the + // cache and ignore the abort, or if it's still pending on this specific + // background request, then write it to the cache. + const vl = this.#valList[index]; + if (vl === p || (vl === undefined && ignoreAbort && updateCache)) { + if (v === undefined) { + if (bf.__staleWhileFetching !== undefined) { + this.#valList[index] = bf.__staleWhileFetching; + } + else { + this.#delete(k, 'fetch'); + } + } + else { + if (options.status) + options.status.fetchUpdated = true; + this.#set(k, v, fetchOpts.options, bf); + } + } + return v; + }; + const eb = (er) => { + if (options.status) { + options.status.fetchRejected = true; + options.status.fetchError = er; + } + // do not pass go, do not collect $200 + return fetchFail(er, false); + }; + const fetchFail = (er, proceed) => { + const { aborted } = ac.signal; + const allowStaleAborted = aborted && options.allowStaleOnFetchAbort; + const allowStale = allowStaleAborted || options.allowStaleOnFetchRejection; + const noDelete = allowStale || options.noDeleteOnFetchRejection; + const bf = p; + if (this.#valList[index] === p) { + // if we allow stale on fetch rejections, then we need to ensure that + // the stale value is not removed from the cache when the fetch fails. + const del = !noDelete || (!proceed && bf.__staleWhileFetching === undefined); + if (del) { + this.#delete(k, 'fetch'); + } + else if (!allowStaleAborted) { + // still replace the *promise* with the stale value, + // since we are done with the promise at this point. + // leave it untouched if we're still waiting for an + // aborted background fetch that hasn't yet returned. + this.#valList[index] = bf.__staleWhileFetching; + } + } + if (allowStale) { + if (options.status && bf.__staleWhileFetching !== undefined) { + options.status.returnedStale = true; + } + return bf.__staleWhileFetching; + } + else if (bf.__returned === bf) { + throw er; + } + }; + const pcall = (res, rej) => { + const fmp = this.#fetchMethod?.(k, v, fetchOpts); + // ignored, we go until we finish, regardless. + // defer check until we are actually aborting, + // so fetchMethod can override. + ac.signal.addEventListener('abort', () => { + if (!options.ignoreFetchAbort || options.allowStaleOnFetchAbort) { + res(undefined); + // when it eventually resolves, update the cache. + if (options.allowStaleOnFetchAbort) { + res = v => cb(v, true); + } + } + }); + if (fmp && fmp instanceof Promise) { + fmp.then(v => res(v === undefined ? undefined : v), rej); + } + else if (fmp !== undefined) { + res(fmp); + } + }; + if (options.status) + options.status.fetchDispatched = true; + const p = new Promise(pcall).then(cb, eb); + const bf = Object.assign(p, { + __abortController: ac, + __staleWhileFetching: v, + __returned: undefined, + }); + if (index === undefined) { + // internal, don't expose status. + this.#set(k, bf, { ...fetchOpts.options, status: undefined }); + index = this.#keyMap.get(k); + } + else { + // do not call #set, because we do not want to adjust its place + // in the lru queue, as it has not yet been "used". Also, we don't + // need to worry about evicting for size, because a background fetch + // over a stale value is treated as the same size as its stale value. + this.#valList[index] = bf; + } + return bf; + } + #isBackgroundFetch(p) { + if (!this.#hasFetchMethod) + return false; + const b = p; + return (!!b && + b instanceof Promise && + b.hasOwnProperty('__staleWhileFetching') && + b.__abortController instanceof AbortController); + } + fetch(k, fetchOptions = {}) { + const ths = tracing.hasSubscribers; + const { status = hasSubscribers() ? {} : undefined } = fetchOptions; + fetchOptions.status = status; + if (status && fetchOptions.context) { + status.context = fetchOptions.context; + } + const p = this.#fetch(k, fetchOptions); + if (status && ths) { + status.trace = true; + tracing.tracePromise(() => p, status).catch(() => { }); + } + return p; + } + async #fetch(k, fetchOptions = {}) { + const { + // get options + allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, + // set options + ttl = this.ttl, noDisposeOnSet = this.noDisposeOnSet, size = 0, sizeCalculation = this.sizeCalculation, noUpdateTTL = this.noUpdateTTL, + // fetch exclusive options + noDeleteOnFetchRejection = this.noDeleteOnFetchRejection, allowStaleOnFetchRejection = this.allowStaleOnFetchRejection, ignoreFetchAbort = this.ignoreFetchAbort, allowStaleOnFetchAbort = this.allowStaleOnFetchAbort, context, forceRefresh = false, status, signal, } = fetchOptions; + if (status) { + status.op = 'fetch'; + status.key = k; + if (forceRefresh) + status.forceRefresh = true; + status.cache = this; + } + if (!this.#hasFetchMethod) { + if (status) + status.fetch = 'get'; + return this.#get(k, { + allowStale, + updateAgeOnGet, + noDeleteOnStaleGet, + status, + }); + } + const options = { + allowStale, + updateAgeOnGet, + noDeleteOnStaleGet, + ttl, + noDisposeOnSet, + size, + sizeCalculation, + noUpdateTTL, + noDeleteOnFetchRejection, + allowStaleOnFetchRejection, + allowStaleOnFetchAbort, + ignoreFetchAbort, + status, + signal, + }; + let index = this.#keyMap.get(k); + if (index === undefined) { + if (status) + status.fetch = 'miss'; + const p = this.#backgroundFetch(k, index, options, context); + return (p.__returned = p); + } + else { + // in cache, maybe already fetching + const v = this.#valList[index]; + if (this.#isBackgroundFetch(v)) { + const stale = allowStale && v.__staleWhileFetching !== undefined; + if (status) { + status.fetch = 'inflight'; + if (stale) + status.returnedStale = true; + } + return stale ? v.__staleWhileFetching : (v.__returned = v); + } + // if we force a refresh, that means do NOT serve the cached value, + // unless we are already in the process of refreshing the cache. + const isStale = this.#isStale(index); + if (!forceRefresh && !isStale) { + if (status) + status.fetch = 'hit'; + this.#moveToTail(index); + if (updateAgeOnGet) { + this.#updateItemAge(index); + } + if (status) + this.#statusTTL(status, index); + return v; + } + // ok, it is stale or a forced refresh, and not already fetching. + // refresh the cache. + const p = this.#backgroundFetch(k, index, options, context); + const hasStale = p.__staleWhileFetching !== undefined; + const staleVal = hasStale && allowStale; + if (status) { + status.fetch = isStale ? 'stale' : 'refresh'; + if (staleVal && isStale) + status.returnedStale = true; + } + return staleVal ? p.__staleWhileFetching : (p.__returned = p); + } + } + forceFetch(k, fetchOptions = {}) { + const ths = tracing.hasSubscribers; + const { status = hasSubscribers() ? {} : undefined } = fetchOptions; + fetchOptions.status = status; + if (status && fetchOptions.context) { + status.context = fetchOptions.context; + } + const p = this.#forceFetch(k, fetchOptions); + if (status && ths) { + status.trace = true; + tracing.tracePromise(() => p, status).catch(() => { }); + } + return p; + } + async #forceFetch(k, fetchOptions = {}) { + const v = await this.#fetch(k, fetchOptions); + if (v === undefined) + throw new Error('fetch() returned undefined'); + return v; + } + memo(k, memoOptions = {}) { + const { status = metrics.hasSubscribers ? {} : undefined } = memoOptions; + memoOptions.status = status; + if (status) { + status.op = 'memo'; + status.key = k; + if (memoOptions.context) { + status.context = memoOptions.context; + } + status.cache = this; + } + const result = this.#memo(k, memoOptions); + if (status) + status.value = result; + if (metrics.hasSubscribers) + metrics.publish(status); + return result; + } + #memo(k, memoOptions = {}) { + const memoMethod = this.#memoMethod; + if (!memoMethod) { + throw new Error('no memoMethod provided to constructor'); + } + const { context, status, forceRefresh, ...options } = memoOptions; + if (status && forceRefresh) + status.forceRefresh = true; + const v = this.#get(k, options); + const refresh = forceRefresh || v === undefined; + if (status) { + status.memo = refresh ? 'miss' : 'hit'; + if (!refresh) + status.value = v; + } + if (!refresh) + return v; + const vv = memoMethod(k, v, { + options, + context, + }); + if (status) + status.value = vv; + this.#set(k, vv, options); + return vv; + } + /** + * Return a value from the cache. Will update the recency of the cache + * entry found. + * + * If the key is not found, get() will return `undefined`. + */ + get(k, getOptions = {}) { + const { status = metrics.hasSubscribers ? {} : undefined } = getOptions; + getOptions.status = status; + if (status) { + status.op = 'get'; + status.key = k; + status.cache = this; + } + const result = this.#get(k, getOptions); + if (status) { + if (result !== undefined) + status.value = result; + if (metrics.hasSubscribers) + metrics.publish(status); + } + return result; + } + #get(k, getOptions = {}) { + const { allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, status, } = getOptions; + const index = this.#keyMap.get(k); + if (index === undefined) { + if (status) + status.get = 'miss'; + return undefined; + } + const value = this.#valList[index]; + const fetching = this.#isBackgroundFetch(value); + if (status) + this.#statusTTL(status, index); + if (this.#isStale(index)) { + // delete only if not an in-flight background fetch + if (!fetching) { + if (!noDeleteOnStaleGet) { + this.#delete(k, 'expire'); + } + if (status) + status.get = 'stale'; + if (allowStale) { + if (status) + status.returnedStale = true; + return value; + } + return undefined; + } + if (status) + status.get = 'stale-fetching'; + if (allowStale && value.__staleWhileFetching !== undefined) { + if (status) + status.returnedStale = true; + return value.__staleWhileFetching; + } + return undefined; + } + // not stale + if (status) + status.get = fetching ? 'fetching' : 'hit'; + // if we're currently fetching it, we don't actually have it yet + // it's not stale, which means this isn't a staleWhileRefetching. + // If it's not stale, and fetching, AND has a __staleWhileFetching + // value, then that means the user fetched with {forceRefresh:true}, + // so it's safe to return that value. + this.#moveToTail(index); + if (updateAgeOnGet) { + this.#updateItemAge(index); + } + return fetching ? value.__staleWhileFetching : value; + } + #connect(p, n) { + this.#prev[n] = p; + this.#next[p] = n; + } + #moveToTail(index) { + // if tail already, nothing to do + // if head, move head to next[index] + // else + // move next[prev[index]] to next[index] (head has no prev) + // move prev[next[index]] to prev[index] + // prev[index] = tail + // next[tail] = index + // tail = index + if (index !== this.#tail) { + if (index === this.#head) { + this.#head = this.#next[index]; + } + else { + this.#connect(this.#prev[index], this.#next[index]); + } + this.#connect(this.#tail, index); + this.#tail = index; + } + } + /** + * Deletes a key out of the cache. + * + * Returns true if the key was deleted, false otherwise. + */ + delete(k) { + return this.#delete(k, 'delete'); + } + #delete(k, reason) { + if (metrics.hasSubscribers) { + metrics.publish({ + op: 'delete', + delete: reason, + key: k, + cache: this, + }); + } + let deleted = false; + if (this.#size !== 0) { + const index = this.#keyMap.get(k); + if (index !== undefined) { + if (this.#autopurgeTimers?.[index]) { + clearTimeout(this.#autopurgeTimers?.[index]); + this.#autopurgeTimers[index] = undefined; + } + deleted = true; + if (this.#size === 1) { + this.#clear(reason); + } + else { + this.#removeItemSize(index); + const v = this.#valList[index]; + if (this.#isBackgroundFetch(v)) { + v.__abortController.abort(new Error('deleted')); + } + else if (this.#hasDispose || this.#hasDisposeAfter) { + if (this.#hasDispose) { + this.#dispose?.(v, k, reason); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([v, k, reason]); + } + } + this.#keyMap.delete(k); + this.#keyList[index] = undefined; + this.#valList[index] = undefined; + if (index === this.#tail) { + this.#tail = this.#prev[index]; + } + else if (index === this.#head) { + this.#head = this.#next[index]; + } + else { + const pi = this.#prev[index]; + this.#next[pi] = this.#next[index]; + const ni = this.#next[index]; + this.#prev[ni] = this.#prev[index]; + } + this.#size--; + this.#free.push(index); + } + } + } + if (this.#hasDisposeAfter && this.#disposed?.length) { + const dt = this.#disposed; + let task; + while ((task = dt?.shift())) { + this.#disposeAfter?.(...task); + } + } + return deleted; + } + /** + * Clear the cache entirely, throwing away all values. + */ + clear() { + return this.#clear('delete'); + } + #clear(reason) { + for (const index of this.#rindexes({ allowStale: true })) { + const v = this.#valList[index]; + if (this.#isBackgroundFetch(v)) { + v.__abortController.abort(new Error('deleted')); + } + else { + const k = this.#keyList[index]; + if (this.#hasDispose) { + this.#dispose?.(v, k, reason); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([v, k, reason]); + } + } + } + this.#keyMap.clear(); + void this.#valList.fill(undefined); + this.#keyList.fill(undefined); + if (this.#ttls && this.#starts) { + this.#ttls.fill(0); + this.#starts.fill(0); + for (const t of this.#autopurgeTimers ?? []) { + if (t !== undefined) + clearTimeout(t); + } + this.#autopurgeTimers?.fill(undefined); + } + if (this.#sizes) { + this.#sizes.fill(0); + } + this.#head = 0; + this.#tail = 0; + this.#free.length = 0; + this.#calculatedSize = 0; + this.#size = 0; + if (this.#hasDisposeAfter && this.#disposed) { + const dt = this.#disposed; + let task; + while ((task = dt?.shift())) { + this.#disposeAfter?.(...task); + } + } + } +} +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/browser/index.js.map b/node_modules/lru-cache/dist/esm/browser/index.js.map new file mode 100644 index 00000000..ab79a6c1 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/browser/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module LRUCache\n */\n\nimport { metrics, tracing } from './diagnostics-channel.js'\nimport { defaultPerf } from './perf.js'\nimport type { Perf } from './perf.js'\nexport type { Perf } from './perf.js'\n\nconst hasSubscribers = () =>\n metrics.hasSubscribers || tracing.hasSubscribers\n\nconst warned = new Set()\n\n// either a function or a class\n// oxlint-disable-next-line no-explicit-any\ntype ForC = ((...a: any[]) => any) | { new (...a: any[]): any }\n\n/* c8 ignore start */\nconst PROCESS = (\n typeof process === 'object' && !!process ?\n process\n : {}) as { [k: string]: unknown }\n/* c8 ignore stop */\n\nconst emitWarning = (\n msg: string,\n type: string,\n code: string,\n fn: ForC,\n) => {\n if (typeof PROCESS.emitWarning === 'function') {\n PROCESS.emitWarning(msg, type, code, fn)\n } else {\n //oxlint-disable-next-line no-console\n console.error(`[${code}] ${type}: ${msg}`)\n }\n}\nconst shouldWarn = (code: string) => !warned.has(code)\n\nconst TYPE = Symbol('type')\nexport type PosInt = number & { [TYPE]: 'Positive Integer' }\nexport type Index = number & { [TYPE]: 'LRUCache Index' }\n\nconst isPosInt = (n: unknown): n is PosInt =>\n !!n && n === Math.floor(n as number) && n > 0 && isFinite(n)\n\nexport type UintArray = Uint8Array | Uint16Array | Uint32Array\nexport type NumberArray = UintArray | number[]\n\n// This is a little bit ridiculous, tbh.\n// The maximum array length is 2^32-1 or thereabouts on most JS impls.\n// And well before that point, you're caching the entire world, I mean,\n// that's ~32GB of just integers for the next/prev links, plus whatever\n// else to hold that many keys and values. Just filling the memory with\n// zeroes at init time is brutal when you get that big.\n// But why not be complete?\n// Maybe in the future, these limits will have expanded.\n/* c8 ignore start */\nconst getUintArray = (max: number) =>\n !isPosInt(max) ? null\n : max <= Math.pow(2, 8) ? Uint8Array\n : max <= Math.pow(2, 16) ? Uint16Array\n : max <= Math.pow(2, 32) ? Uint32Array\n : max <= Number.MAX_SAFE_INTEGER ? ZeroArray\n : null\n/* c8 ignore stop */\n\nclass ZeroArray extends Array {\n constructor(size: number) {\n super(size)\n this.fill(0)\n }\n}\nexport type { ZeroArray }\nexport type { Stack }\n\nexport type StackLike = Stack | Index[]\nclass Stack {\n /* c8 ignore start - not sure why this is showing up uncovered?? */\n heap: NumberArray\n /* c8 ignore stop */\n length: number\n // private constructor\n static #constructing: boolean = false\n static create(max: number): StackLike {\n const HeapCls = getUintArray(max)\n if (!HeapCls) return []\n Stack.#constructing = true\n const s = new Stack(max, HeapCls)\n Stack.#constructing = false\n return s\n }\n constructor(max: number, HeapCls: { new (n: number): NumberArray }) {\n /* c8 ignore start */\n if (!Stack.#constructing) {\n throw new TypeError('instantiate Stack using Stack.create(n)')\n }\n /* c8 ignore stop */\n this.heap = new HeapCls(max)\n this.length = 0\n }\n push(n: Index) {\n this.heap[this.length++] = n\n }\n pop(): Index {\n return this.heap[--this.length] as Index\n }\n}\n\n/**\n * Promise representing an in-progress {@link LRUCache#fetch} call\n */\nexport type BackgroundFetch = Promise & {\n __returned: BackgroundFetch | undefined\n __abortController: AbortController\n __staleWhileFetching: V | undefined\n}\n\nexport type DisposeTask = [\n value: V,\n key: K,\n reason: LRUCache.DisposeReason,\n]\n\nexport namespace LRUCache {\n /**\n * An integer greater than 0, reflecting the calculated size of items\n */\n export type Size = number\n\n /**\n * Integer greater than 0, representing some number of milliseconds, or the\n * time at which a TTL started counting from.\n */\n export type Milliseconds = number\n\n /**\n * An integer greater than 0, reflecting a number of items\n */\n export type Count = number\n\n /**\n * The reason why an item was removed from the cache, passed\n * to the {@link Disposer} methods.\n *\n * - `evict`: The item was evicted because it is the least recently used,\n * and the cache is full.\n * - `set`: A new value was set, overwriting the old value being disposed.\n * - `delete`: The item was explicitly deleted, either by calling\n * {@link LRUCache#delete}, {@link LRUCache#clear}, or\n * {@link LRUCache#set} with an undefined value.\n * - `expire`: The item was removed due to exceeding its TTL.\n * - `fetch`: A {@link OptionsBase#fetchMethod} operation returned\n * `undefined` or was aborted, causing the item to be deleted.\n */\n export type DisposeReason =\n | 'evict'\n | 'set'\n | 'delete'\n | 'expire'\n | 'fetch'\n /**\n * A method called upon item removal, passed as the\n * {@link OptionsBase.dispose} and/or\n * {@link OptionsBase.disposeAfter} options.\n */\n export type Disposer = (\n value: V,\n key: K,\n reason: DisposeReason,\n ) => void\n\n /**\n * The reason why an item was added to the cache, passed\n * to the {@link Inserter} methods.\n *\n * - `add`: the item was not found in the cache, and was added\n * - `update`: the item was in the cache, with the same value provided\n * - `replace`: the item was in the cache, and replaced\n */\n export type InsertReason = 'add' | 'update' | 'replace'\n\n /**\n * A method called upon item insertion, passed as the\n * {@link OptionsBase.insert}\n */\n export type Inserter = (\n value: V,\n key: K,\n reason: InsertReason,\n ) => void\n\n /**\n * A function that returns the effective calculated size\n * of an entry in the cache.\n */\n export type SizeCalculator = (value: V, key: K) => Size\n\n /**\n * Options provided to the\n * {@link OptionsBase.fetchMethod} function.\n */\n export interface FetcherOptions {\n signal: AbortSignal\n options: FetcherFetchOptions\n /**\n * Object provided in the {@link FetchOptions.context} option to\n * {@link LRUCache#fetch}\n */\n context: FC\n }\n\n /**\n * Occasionally, it may be useful to track the internal behavior of the\n * cache, particularly for logging, debugging, or for behavior within the\n * `fetchMethod`. To do this, you can pass a `status` object to the\n * {@link LRUCache#fetch}, {@link LRUCache#get}, {@link LRUCache#set},\n * {@link LRUCache#memo}, and {@link LRUCache#has} methods.\n *\n * The `status` option should be a plain JavaScript object. The following\n * fields will be set on it appropriately, depending on the situation.\n *\n * These objects are also the context objects passed to listeners on the\n * `lru-cache:metrics` diagnostic channel, and the `lru-cache` tracing\n * channels, in platforms that support them.\n */\n export interface Status {\n /**\n * The operation being performed\n */\n op?: 'get' | 'set' | 'memo' | 'fetch' | 'delete' | 'has' | 'peek'\n /**\n * The status of a set() operation.\n *\n * - add: the item was not found in the cache, and was added\n * - update: the item was in the cache, with the same value provided\n * - replace: the item was in the cache, and replaced\n * - miss: the item was not added to the cache for some reason\n */\n set?: 'add' | 'update' | 'replace' | 'miss' | 'deleted'\n\n /**\n * The status of a delete() operation.\n */\n delete?: LRUCache.DisposeReason\n\n /**\n * The result of a peek() operation\n *\n * - hit: the item was found and returned\n * - stale: the item is in the cache, but past its ttl and not returned\n * - miss: item not in the cache\n */\n peek?: 'hit' | 'miss' | 'stale'\n\n /**\n * The status of a memo() operation.\n *\n * - 'hit': the item was found in the cache and returned\n * - 'miss': the `memoMethod` function was called\n */\n memo?: 'hit' | 'miss'\n\n /**\n * The `context` option provided to a memo or fetch operation\n *\n * In practice, of course, this will be the same type as the `FC`\n * fetch context param used to instantiate the LRUCache, but the\n * convolutions of threading that through would get quite complicated,\n * and preclude forcing/forbidding the passing of a `context` param\n * where it is/isn't expected, which is more valuable for error\n * prevention.\n */\n context?: unknown\n\n /**\n * the ttl stored for the item, or undefined if ttls are not used.\n */\n ttl?: Milliseconds\n\n /**\n * the start time for the item, or undefined if ttls are not used.\n */\n start?: Milliseconds\n\n /**\n * The timestamp used for TTL calculation\n */\n now?: Milliseconds\n\n /**\n * the remaining ttl for the item, or undefined if ttls are not used.\n */\n remainingTTL?: Milliseconds\n\n /**\n * The calculated size for the item, if sizes are used.\n */\n entrySize?: Size\n\n /**\n * The total calculated size of the cache, if sizes are used.\n */\n totalCalculatedSize?: Size\n\n /**\n * A flag indicating that the item was not stored, due to exceeding the\n * {@link OptionsBase.maxEntrySize}\n */\n maxEntrySizeExceeded?: true\n\n /**\n * The key that was set or retrieved\n */\n key?: K\n\n /**\n * The value that was set\n */\n value?: V\n\n /**\n * The old value, specified in the case of `set:'replace'`\n */\n oldValue?: V\n\n /**\n * The results of a {@link LRUCache#has} operation\n *\n * - hit: the item was found in the cache\n * - stale: the item was found in the cache, but is stale\n * - miss: the item was not found in the cache\n */\n has?: 'hit' | 'stale' | 'miss'\n\n /**\n * The status of a {@link LRUCache#fetch} operation.\n * Note that this can change as the underlying fetch() moves through\n * various states.\n *\n * - inflight: there is another fetch() for this key which is in process\n * - get: there is no {@link OptionsBase.fetchMethod}, so\n * {@link LRUCache#get} was called.\n * - miss: the item is not in cache, and will be fetched.\n * - hit: the item is in the cache, and was resolved immediately.\n * - stale: the item is in the cache, but stale.\n * - refresh: the item is in the cache, and not stale, but\n * {@link FetchOptions.forceRefresh} was specified.\n */\n fetch?: 'get' | 'inflight' | 'miss' | 'hit' | 'stale' | 'refresh'\n\n /**\n * `forceRefresh` option was used for either a fetch or memo operation\n */\n forceRefresh?: boolean\n\n /**\n * The {@link OptionsBase.fetchMethod} was called\n */\n fetchDispatched?: true\n\n /**\n * The cached value was updated after a successful call to\n * {@link OptionsBase.fetchMethod}\n */\n fetchUpdated?: true\n\n /**\n * The reason for a fetch() rejection. Either the error raised by the\n * {@link OptionsBase.fetchMethod}, or the reason for an\n * AbortSignal.\n */\n fetchError?: Error\n\n /**\n * The fetch received an abort signal\n */\n fetchAborted?: true\n\n /**\n * The abort signal received was ignored, and the fetch was allowed to\n * continue in the background.\n */\n fetchAbortIgnored?: true\n\n /**\n * The fetchMethod promise resolved successfully\n */\n fetchResolved?: true\n\n /**\n * The fetchMethod promise was rejected\n */\n fetchRejected?: true\n\n /**\n * The status of a {@link LRUCache#get} operation.\n *\n * - fetching: The item is currently being fetched. If a previous value\n * is present and allowed, that will be returned.\n * - stale: The item is in the cache, and is stale. If it was returned,\n * then the `returnedStale` flag will be set.\n * - stale-fetching: The value is being fetched in the background, but is\n * currently stale. If the stale value was returned, then the\n * `returnedStale` flag will be set.\n * - hit: the item is in the cache\n * - miss: the item is not in the cache\n */\n get?: 'stale' | 'hit' | 'miss' | 'fetching' | 'stale-fetching'\n\n /**\n * A fetch or get operation returned a stale value.\n */\n returnedStale?: true\n\n /**\n * A tracingChannel trace was started for this operation\n */\n trace?: boolean\n\n /**\n * A reference to the cache instance associated with this operation\n */\n cache?: LRUCache\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#fetch}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link OptionsBase.noDeleteOnFetchRejection},\n * {@link OptionsBase.allowStaleOnFetchRejection},\n * {@link FetchOptions.forceRefresh}, and\n * {@link FetcherOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.fetchMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the fetchMethod is called.\n */\n export interface FetcherFetchOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n status?: Status\n size?: Size\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#fetch} method.\n */\n export interface FetchOptions extends FetcherFetchOptions<\n K,\n V,\n FC\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.fetchMethod} as\n * the {@link FetcherOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n signal?: AbortSignal\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface FetchOptionsWithContext extends FetchOptions<\n K,\n V,\n FC\n > {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is\n * `undefined` or `void`\n */\n export interface FetchOptionsNoContext<\n K,\n V,\n FC extends undefined | void = undefined,\n > extends FetchOptions {\n context?: FC\n }\n\n export interface MemoOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.memoMethod} as\n * the {@link MemoizerOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface MemoOptionsWithContext extends MemoOptions<\n K,\n V,\n FC\n > {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is\n * `undefined` or `void`\n */\n export interface MemoOptionsNoContext<\n K,\n V,\n FC extends undefined | void = undefined,\n > extends MemoOptions {\n context?: FC\n }\n\n /**\n * Options provided to the\n * {@link OptionsBase.memoMethod} function.\n */\n export interface MemoizerOptions {\n options: MemoizerMemoOptions\n /**\n * Object provided in the {@link MemoOptions.context} option to\n * {@link LRUCache#memo}\n */\n context: FC\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#memo}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link MemoOptions.forceRefresh}, and\n * {@link MemoOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.memoMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the memoMethod is called.\n */\n export interface MemoizerMemoOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n > {\n status?: Status\n size?: Size\n start?: Milliseconds\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#has} method.\n */\n export interface HasOptions extends Pick<\n OptionsBase,\n 'updateAgeOnHas'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#get} method.\n */\n export interface GetOptions extends Pick<\n OptionsBase,\n 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#peek} method.\n */\n export interface PeekOptions extends Pick<\n OptionsBase,\n 'allowStale'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#set} method.\n */\n export interface SetOptions extends Pick<\n OptionsBase,\n 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'\n > {\n /**\n * If size tracking is enabled, then setting an explicit size\n * in the {@link LRUCache#set} call will prevent calling the\n * {@link OptionsBase.sizeCalculation} function.\n */\n size?: Size\n /**\n * If TTL tracking is enabled, then setting an explicit start\n * time in the {@link LRUCache#set} call will override the\n * default time from `performance.now()` or `Date.now()`.\n *\n * Note that it must be a valid value for whichever time-tracking\n * method is in use.\n */\n start?: Milliseconds\n status?: Status\n }\n\n /**\n * The type signature for the {@link OptionsBase.fetchMethod} option.\n */\n export type Fetcher = (\n key: K,\n staleValue: V | undefined,\n options: FetcherOptions,\n ) => Promise | V | undefined | void\n\n /**\n * the type signature for the {@link OptionsBase.memoMethod} option.\n */\n export type Memoizer = (\n key: K,\n staleValue: V | undefined,\n options: MemoizerOptions,\n ) => V\n\n /**\n * Options which may be passed to the {@link LRUCache} constructor.\n *\n * Most of these may be overridden in the various options that use\n * them.\n *\n * Despite all being technically optional, the constructor requires that\n * a cache is at minimum limited by one or more of {@link OptionsBase.max},\n * {@link OptionsBase.ttl}, or {@link OptionsBase.maxSize}.\n *\n * If {@link OptionsBase.ttl} is used alone, then it is strongly advised\n * (and in fact required by the type definitions here) that the cache\n * also set {@link OptionsBase.ttlAutopurge}, to prevent potentially\n * unbounded storage.\n *\n * All options are also available on the {@link LRUCache} instance, making\n * it safe to pass an LRUCache instance as the options argumemnt to\n * make another empty cache of the same type.\n *\n * Some options are marked as read-only, because changing them after\n * instantiation is not safe. Changing any of the other options will of\n * course only have an effect on subsequent method calls.\n */\n export interface OptionsBase {\n /**\n * The maximum number of items to store in the cache before evicting\n * old entries. This is read-only on the {@link LRUCache} instance,\n * and may not be overridden.\n *\n * If set, then storage space will be pre-allocated at construction\n * time, and the cache will perform significantly faster.\n *\n * Note that significantly fewer items may be stored, if\n * {@link OptionsBase.maxSize} and/or {@link OptionsBase.ttl} are also\n * set.\n *\n * **It is strongly recommended to set a `max` to prevent unbounded growth\n * of the cache.**\n */\n max?: Count\n\n /**\n * Max time in milliseconds for items to live in cache before they are\n * considered stale. Note that stale items are NOT preemptively removed by\n * default, and MAY live in the cache, contributing to its LRU max, long\n * after they have expired, unless {@link OptionsBase.ttlAutopurge} is\n * set.\n *\n * If set to `0` (the default value), then that means \"do not track\n * TTL\", not \"expire immediately\".\n *\n * Also, as this cache is optimized for LRU/MRU operations, some of\n * the staleness/TTL checks will reduce performance, as they will incur\n * overhead by deleting items.\n *\n * This is not primarily a TTL cache, and does not make strong TTL\n * guarantees. There is no pre-emptive pruning of expired items, but you\n * _may_ set a TTL on the cache, and it will treat expired items as missing\n * when they are fetched, and delete them.\n *\n * Optional, but must be a non-negative integer in ms if specified.\n *\n * This may be overridden by passing an options object to `cache.set()`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if ttl tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * If ttl tracking is enabled, and `max` and `maxSize` are not set,\n * and `ttlAutopurge` is not set, then a warning will be emitted\n * cautioning about the potential for unbounded memory consumption.\n * (The TypeScript definitions will also discourage this.)\n */\n ttl?: Milliseconds\n\n /**\n * Minimum amount of time in ms in which to check for staleness.\n * Defaults to 1, which means that the current time is checked\n * at most once per millisecond.\n *\n * Set to 0 to check the current time every time staleness is tested.\n * (This reduces performance, and is theoretically unnecessary.)\n *\n * Setting this to a higher value will improve performance somewhat\n * while using ttl tracking, albeit at the expense of keeping stale\n * items around a bit longer than their TTLs would indicate.\n *\n * @default 1\n */\n ttlResolution?: Milliseconds\n\n /**\n * Preemptively remove stale items from the cache.\n *\n * Note that this may *significantly* degrade performance, especially if\n * the cache is storing a large number of items. It is almost always best\n * to just leave the stale items in the cache, and let them fall out as new\n * items are added.\n *\n * Note that this means that {@link OptionsBase.allowStale} is a bit\n * pointless, as stale items will be deleted almost as soon as they\n * expire.\n *\n * Use with caution!\n */\n ttlAutopurge?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever it is retrieved from cache with\n * {@link LRUCache#get}, causing it to not expire. (It can still fall out\n * of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n */\n updateAgeOnGet?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever its presence in the cache is\n * checked with {@link LRUCache#has}, causing it to not expire. (It can\n * still fall out of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n */\n updateAgeOnHas?: boolean\n\n /**\n * Allow {@link LRUCache#get} and {@link LRUCache#fetch} calls to return\n * stale data, if available.\n *\n * By default, if you set `ttl`, stale items will only be deleted from the\n * cache when you `get(key)`. That is, it's not preemptively pruning items,\n * unless {@link OptionsBase.ttlAutopurge} is set.\n *\n * If you set `allowStale:true`, it'll return the stale value *as well as*\n * deleting it. If you don't set this, then it'll return `undefined` when\n * you try to get a stale entry.\n *\n * Note that when a stale entry is fetched, _even if it is returned due to\n * `allowStale` being set_, it is removed from the cache immediately. You\n * can suppress this behavior by setting\n * {@link OptionsBase.noDeleteOnStaleGet}, either in the constructor, or in\n * the options provided to {@link LRUCache#get}.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n * The `cache.has()` method will always return `false` for stale items.\n *\n * Only relevant if a ttl is set.\n */\n allowStale?: boolean\n\n /**\n * Function that is called on items when they are dropped from the\n * cache, as `dispose(value, key, reason)`.\n *\n * This can be handy if you want to close file descriptors or do\n * other cleanup tasks when items are no longer stored in the cache.\n *\n * **NOTE**: It is called _before_ the item has been fully removed\n * from the cache, so if you want to put it right back in, you need\n * to wait until the next tick. If you try to add it back in during\n * the `dispose()` function call, it will break things in subtle and\n * weird ways.\n *\n * Unlike several other options, this may _not_ be overridden by\n * passing an option to `set()`, for performance reasons.\n *\n * The `reason` will be one of the following strings, corresponding\n * to the reason for the item's deletion:\n *\n * - `evict` Item was evicted to make space for a new addition\n * - `set` Item was overwritten by a new value\n * - `expire` Item expired its TTL\n * - `fetch` Item was deleted due to a failed or aborted fetch, or a\n * fetchMethod returning `undefined.\n * - `delete` Item was removed by explicit `cache.delete(key)`,\n * `cache.clear()`, or `cache.set(key, undefined)`.\n */\n dispose?: Disposer\n\n /**\n * Function that is called when new items are inserted into the cache,\n * as `onInsert(value, key, reason)`.\n *\n * This can be useful if you need to perform actions when an item is\n * added, such as logging or tracking insertions.\n *\n * Unlike some other options, this may _not_ be overridden by passing\n * an option to `set()`, for performance and consistency reasons.\n */\n onInsert?: Inserter\n\n /**\n * The same as {@link OptionsBase.dispose}, but called *after* the entry\n * is completely removed and the cache is once again in a clean state.\n *\n * It is safe to add an item right back into the cache at this point.\n * However, note that it is *very* easy to inadvertently create infinite\n * recursion this way.\n */\n disposeAfter?: Disposer\n\n /**\n * Set to true to suppress calling the\n * {@link OptionsBase.dispose} function if the entry key is\n * still accessible within the cache.\n *\n * This may be overridden by passing an options object to\n * {@link LRUCache#set}.\n *\n * Only relevant if `dispose` or `disposeAfter` are set.\n */\n noDisposeOnSet?: boolean\n\n /**\n * Boolean flag to tell the cache to not update the TTL when setting a new\n * value for an existing key (ie, when updating a value rather than\n * inserting a new value). Note that the TTL value is _always_ set (if\n * provided) when adding a new entry into the cache.\n *\n * Has no effect if a {@link OptionsBase.ttl} is not set.\n *\n * May be passed as an option to {@link LRUCache#set}.\n */\n noUpdateTTL?: boolean\n\n /**\n * Set to a positive integer to track the sizes of items added to the\n * cache, and automatically evict items in order to stay below this size.\n * Note that this may result in fewer than `max` items being stored.\n *\n * Attempting to add an item to the cache whose calculated size is greater\n * that this amount will be a no-op. The item will not be cached, and no\n * other items will be evicted.\n *\n * Optional, must be a positive integer if provided.\n *\n * Sets `maxEntrySize` to the same value, unless a different value is\n * provided for `maxEntrySize`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if size tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * Note also that size tracking can negatively impact performance,\n * though for most cases, only minimally.\n */\n maxSize?: Size\n\n /**\n * The effective size for background fetch promises.\n *\n * This has no effect unless `maxSize` and `sizeCalculation` are used,\n * and a {@link LRUCache.OptionsBase.fetchMethod} is provided to\n * support {@link LRUCache#fetch}.\n *\n * If a stale value is present in the cache, then the effective size of\n * the background fetch is the size of the stale item it will eventually\n * replace. If not, then this value is used as its effective size.\n *\n * @default 1\n */\n backgroundFetchSize?: number\n\n /**\n * The maximum allowed size for any single item in the cache.\n *\n * If a larger item is passed to {@link LRUCache#set} or returned by a\n * {@link OptionsBase.fetchMethod} or {@link OptionsBase.memoMethod}, then\n * it will not be stored in the cache.\n *\n * Attempting to add an item whose calculated size is greater than\n * this amount will not cache the item or evict any old items, but\n * WILL delete an existing value if one is already present.\n *\n * Optional, must be a positive integer if provided. Defaults to\n * the value of `maxSize` if provided.\n */\n maxEntrySize?: Size\n\n /**\n * A function that returns a number indicating the item's size.\n *\n * Requires {@link OptionsBase.maxSize} to be set.\n *\n * If not provided, and {@link OptionsBase.maxSize} or\n * {@link OptionsBase.maxEntrySize} are set, then all\n * {@link LRUCache#set} calls **must** provide an explicit\n * {@link SetOptions.size} or sizeCalculation param.\n */\n sizeCalculation?: SizeCalculator\n\n /**\n * Method that provides the implementation for {@link LRUCache#fetch}\n *\n * ```ts\n * fetchMethod(key, staleValue, { signal, options, context })\n * ```\n *\n * If `fetchMethod` is not provided, then `cache.fetch(key)` is equivalent\n * to `Promise.resolve(cache.get(key))`.\n *\n * If at any time, `signal.aborted` is set to `true`, or if the\n * `signal.onabort` method is called, or if it emits an `'abort'` event\n * which you can listen to with `addEventListener`, then that means that\n * the fetch should be abandoned. This may be passed along to async\n * functions aware of AbortController/AbortSignal behavior.\n *\n * The `fetchMethod` should **only** return `undefined` or a Promise\n * resolving to `undefined` if the AbortController signaled an `abort`\n * event. In all other cases, it should return or resolve to a value\n * suitable for adding to the cache.\n *\n * The `options` object is a union of the options that may be provided to\n * `set()` and `get()`. If they are modified, then that will result in\n * modifying the settings to `cache.set()` when the value is resolved, and\n * in the case of\n * {@link OptionsBase.noDeleteOnFetchRejection} and\n * {@link OptionsBase.allowStaleOnFetchRejection}, the handling of\n * `fetchMethod` failures.\n *\n * For example, a DNS cache may update the TTL based on the value returned\n * from a remote DNS server by changing `options.ttl` in the `fetchMethod`.\n */\n fetchMethod?: Fetcher\n\n /**\n * Method that provides the implementation for {@link LRUCache#memo}\n */\n memoMethod?: Memoizer\n\n /**\n * Set to true to suppress the deletion of stale data when a\n * {@link OptionsBase.fetchMethod} returns a rejected promise.\n */\n noDeleteOnFetchRejection?: boolean\n\n /**\n * Do not delete stale items when they are retrieved with\n * {@link LRUCache#get}.\n *\n * Note that the `get` return value will still be `undefined`\n * unless {@link OptionsBase.allowStale} is true.\n *\n * When using time-expiring entries with `ttl`, by default stale\n * items will be removed from the cache when the key is accessed\n * with `cache.get()`.\n *\n * Setting this option will cause stale items to remain in the cache, until\n * they are explicitly deleted with `cache.delete(key)`, or retrieved with\n * `noDeleteOnStaleGet` set to `false`.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n *\n * Only relevant if a ttl is used.\n */\n noDeleteOnStaleGet?: boolean\n\n /**\n * Set to true to allow returning stale data when a\n * {@link OptionsBase.fetchMethod} throws an error or returns a rejected\n * promise.\n *\n * This differs from using {@link OptionsBase.allowStale} in that stale\n * data will ONLY be returned in the case that the {@link LRUCache#fetch}\n * fails, not any other times.\n *\n * If a `fetchMethod` fails, and there is no stale value available, the\n * `fetch()` will resolve to `undefined`. Ie, all `fetchMethod` errors are\n * suppressed.\n *\n * Implies `noDeleteOnFetchRejection`.\n *\n * This may be set in calls to `fetch()`, or defaulted on the constructor,\n * or overridden by modifying the options object in the `fetchMethod`.\n */\n allowStaleOnFetchRejection?: boolean\n\n /**\n * Set to true to return a stale value from the cache when the\n * `AbortSignal` passed to the {@link OptionsBase.fetchMethod} dispatches\n * an `'abort'` event, whether user-triggered, or due to internal cache\n * behavior.\n *\n * Unless {@link OptionsBase.ignoreFetchAbort} is also set, the underlying\n * {@link OptionsBase.fetchMethod} will still be considered canceled, and\n * any value it returns will be ignored and not cached.\n *\n * Caveat: since fetches are aborted when a new value is explicitly\n * set in the cache, this can lead to fetch returning a stale value,\n * since that was the fallback value _at the moment the `fetch()` was\n * initiated_, even though the new updated value is now present in\n * the cache.\n *\n * For example:\n *\n * ```ts\n * const cache = new LRUCache({\n * ttl: 100,\n * fetchMethod: async (url, oldValue, { signal }) => {\n * const res = await fetch(url, { signal })\n * return await res.json()\n * }\n * })\n * cache.set('https://example.com/', { some: 'data' })\n * // 100ms go by...\n * const result = cache.fetch('https://example.com/')\n * cache.set('https://example.com/', { other: 'thing' })\n * console.log(await result) // { some: 'data' }\n * console.log(cache.get('https://example.com/')) // { other: 'thing' }\n * ```\n */\n allowStaleOnFetchAbort?: boolean\n\n /**\n * Set to true to ignore the `abort` event emitted by the `AbortSignal`\n * object passed to {@link OptionsBase.fetchMethod}, and still cache the\n * resulting resolution value, as long as it is not `undefined`.\n *\n * When used on its own, this means aborted {@link LRUCache#fetch} calls\n * are not immediately resolved or rejected when they are aborted, and\n * instead take the full time to await.\n *\n * When used with {@link OptionsBase.allowStaleOnFetchAbort}, aborted\n * {@link LRUCache#fetch} calls will resolve immediately to their stale\n * cached value or `undefined`, and will continue to process and eventually\n * update the cache when they resolve, as long as the resulting value is\n * not `undefined`, thus supporting a \"return stale on timeout while\n * refreshing\" mechanism by passing `AbortSignal.timeout(n)` as the signal.\n *\n * For example:\n *\n * ```ts\n * const c = new LRUCache({\n * ttl: 100,\n * ignoreFetchAbort: true,\n * allowStaleOnFetchAbort: true,\n * fetchMethod: async (key, oldValue, { signal }) => {\n * // note: do NOT pass the signal to fetch()!\n * // let's say this fetch can take a long time.\n * const res = await fetch(`https://slow-backend-server/${key}`)\n * return await res.json()\n * },\n * })\n *\n * // this will return the stale value after 100ms, while still\n * // updating in the background for next time.\n * const val = await c.fetch('key', { signal: AbortSignal.timeout(100) })\n * ```\n *\n * **Note**: regardless of this setting, an `abort` event _is still\n * emitted on the `AbortSignal` object_, so may result in invalid results\n * when passed to other underlying APIs that use AbortSignals.\n *\n * This may be overridden in the {@link OptionsBase.fetchMethod} or the\n * call to {@link LRUCache#fetch}.\n */\n ignoreFetchAbort?: boolean\n\n /**\n * In some cases, you may want to swap out the performance/Date object\n * used for TTL tracking. This should almost certainly NOT be done in\n * production environments!\n *\n * This value defaults to `global.performance` if it has a `now()` method,\n * or the `global.Date` object otherwise.\n */\n perf?: Perf\n }\n\n export interface OptionsMaxLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n max: Count\n }\n export interface OptionsTTLLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n ttl: Milliseconds\n ttlAutopurge: boolean\n }\n export interface OptionsSizeLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n maxSize: Size\n }\n\n /**\n * The valid safe options for the {@link LRUCache} constructor\n */\n export type Options =\n | OptionsMaxLimit\n | OptionsSizeLimit\n | OptionsTTLLimit\n\n /**\n * Entry objects used by {@link LRUCache#load} and {@link LRUCache#dump},\n * and returned by {@link LRUCache#info}.\n */\n export interface Entry {\n value: V\n ttl?: Milliseconds\n size?: Size\n start?: Milliseconds\n }\n}\n\n/**\n * Default export, the thing you're using this module to get.\n *\n * The `K` and `V` types define the key and value types, respectively. The\n * optional `FC` type defines the type of the `context` object passed to\n * `cache.fetch()` and `cache.memo()`.\n *\n * Keys and values **must not** be `null` or `undefined`.\n *\n * All properties from the options object (with the exception of `max`,\n * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are\n * added as normal public members. (The listed options are read-only getters.)\n *\n * Changing any of these will alter the defaults for subsequent method calls.\n */\nexport class LRUCache {\n // options that cannot be changed without disaster\n readonly #max: LRUCache.Count\n readonly #maxSize: LRUCache.Size\n readonly #dispose?: LRUCache.Disposer\n readonly #onInsert?: LRUCache.Inserter\n readonly #disposeAfter?: LRUCache.Disposer\n readonly #fetchMethod?: LRUCache.Fetcher\n readonly #memoMethod?: LRUCache.Memoizer\n readonly #perf: Perf\n\n /**\n * {@link LRUCache.OptionsBase.perf}\n */\n get perf() {\n return this.#perf\n }\n\n /**\n * {@link LRUCache.OptionsBase.ttl}\n */\n ttl: LRUCache.Milliseconds\n\n /**\n * {@link LRUCache.OptionsBase.ttlResolution}\n */\n ttlResolution: LRUCache.Milliseconds\n /**\n * {@link LRUCache.OptionsBase.ttlAutopurge}\n */\n ttlAutopurge: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnGet}\n */\n updateAgeOnGet: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnHas}\n */\n updateAgeOnHas: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStale}\n */\n allowStale: boolean\n\n /**\n * {@link LRUCache.OptionsBase.noDisposeOnSet}\n */\n noDisposeOnSet: boolean\n /**\n * {@link LRUCache.OptionsBase.noUpdateTTL}\n */\n noUpdateTTL: boolean\n /**\n * {@link LRUCache.OptionsBase.maxEntrySize}\n */\n maxEntrySize: LRUCache.Size\n /**\n * {@link LRUCache.OptionsBase.sizeCalculation}\n */\n sizeCalculation?: LRUCache.SizeCalculator\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection}\n */\n noDeleteOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnStaleGet}\n */\n noDeleteOnStaleGet: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}\n */\n allowStaleOnFetchAbort: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection}\n */\n allowStaleOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.ignoreFetchAbort}\n */\n ignoreFetchAbort: boolean\n\n /** {@link LRUCache.OptionsBase.backgroundFetchSize} */\n backgroundFetchSize: number\n\n // computed properties\n #size: LRUCache.Count\n #calculatedSize: LRUCache.Size\n #keyMap: Map\n #keyList: (K | undefined)[]\n #valList: (V | BackgroundFetch | undefined)[]\n #next: NumberArray\n #prev: NumberArray\n #head: Index\n #tail: Index\n #free: StackLike\n #disposed?: DisposeTask[]\n #sizes?: ZeroArray\n #starts?: ZeroArray\n #ttls?: ZeroArray\n #autopurgeTimers?: (undefined | ReturnType)[]\n\n #hasDispose: boolean\n #hasFetchMethod: boolean\n #hasDisposeAfter: boolean\n #hasOnInsert: boolean\n\n /**\n * Do not call this method unless you need to inspect the\n * inner workings of the cache. If anything returned by this\n * object is modified in any way, strange breakage may occur.\n *\n * These fields are private for a reason!\n *\n * @internal\n */\n static unsafeExposeInternals<\n K extends {},\n V extends {},\n FC extends unknown = unknown,\n >(c: LRUCache) {\n return {\n // properties\n starts: c.#starts,\n ttls: c.#ttls,\n autopurgeTimers: c.#autopurgeTimers,\n sizes: c.#sizes,\n keyMap: c.#keyMap as Map,\n keyList: c.#keyList,\n valList: c.#valList,\n next: c.#next,\n prev: c.#prev,\n get head() {\n return c.#head\n },\n get tail() {\n return c.#tail\n },\n free: c.#free,\n // methods\n isBackgroundFetch: (p: unknown) => c.#isBackgroundFetch(p),\n backgroundFetch: (\n k: K,\n index: number | undefined,\n options: LRUCache.FetchOptions,\n context: unknown,\n ): BackgroundFetch =>\n c.#backgroundFetch(\n k,\n index as Index | undefined,\n options,\n context as FC,\n ),\n moveToTail: (index: number): void => c.#moveToTail(index as Index),\n indexes: (options?: { allowStale: boolean }) => c.#indexes(options),\n rindexes: (options?: { allowStale: boolean }) =>\n c.#rindexes(options),\n isStale: (index: number | undefined) => c.#isStale(index as Index),\n }\n }\n\n // Protected read-only members\n\n /**\n * {@link LRUCache.OptionsBase.max} (read-only)\n */\n get max(): LRUCache.Count {\n return this.#max\n }\n /**\n * {@link LRUCache.OptionsBase.maxSize} (read-only)\n */\n get maxSize(): LRUCache.Count {\n return this.#maxSize\n }\n /**\n * The total computed size of items in the cache (read-only)\n */\n get calculatedSize(): LRUCache.Size {\n return this.#calculatedSize\n }\n /**\n * The number of items stored in the cache (read-only)\n */\n get size(): LRUCache.Count {\n return this.#size\n }\n /**\n * {@link LRUCache.OptionsBase.fetchMethod} (read-only)\n */\n get fetchMethod(): LRUCache.Fetcher | undefined {\n return this.#fetchMethod\n }\n get memoMethod(): LRUCache.Memoizer | undefined {\n return this.#memoMethod\n }\n /**\n * {@link LRUCache.OptionsBase.dispose} (read-only)\n */\n get dispose() {\n return this.#dispose\n }\n /**\n * {@link LRUCache.OptionsBase.onInsert} (read-only)\n */\n get onInsert() {\n return this.#onInsert\n }\n /**\n * {@link LRUCache.OptionsBase.disposeAfter} (read-only)\n */\n get disposeAfter() {\n return this.#disposeAfter\n }\n\n constructor(options: LRUCache.Options | LRUCache) {\n const {\n max = 0,\n ttl,\n ttlResolution = 1,\n ttlAutopurge,\n updateAgeOnGet,\n updateAgeOnHas,\n allowStale,\n dispose,\n onInsert,\n disposeAfter,\n noDisposeOnSet,\n noUpdateTTL,\n maxSize = 0,\n maxEntrySize = 0,\n sizeCalculation,\n fetchMethod,\n memoMethod,\n noDeleteOnFetchRejection,\n noDeleteOnStaleGet,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n backgroundFetchSize = 1,\n perf,\n } = options\n\n this.backgroundFetchSize = backgroundFetchSize\n\n if (perf !== undefined) {\n if (typeof perf?.now !== 'function') {\n throw new TypeError(\n 'perf option must have a now() method if specified',\n )\n }\n }\n\n this.#perf = perf ?? defaultPerf\n\n if (max !== 0 && !isPosInt(max)) {\n throw new TypeError('max option must be a nonnegative integer')\n }\n\n const UintArray = max ? getUintArray(max) : Array\n if (!UintArray) {\n throw new Error('invalid max value: ' + max)\n }\n\n this.#max = max\n this.#maxSize = maxSize\n this.maxEntrySize = maxEntrySize || this.#maxSize\n this.sizeCalculation = sizeCalculation\n if (this.sizeCalculation) {\n if (!this.#maxSize && !this.maxEntrySize) {\n throw new TypeError(\n 'cannot set sizeCalculation without setting maxSize or maxEntrySize',\n )\n }\n if (typeof this.sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation set to non-function')\n }\n }\n\n if (memoMethod !== undefined && typeof memoMethod !== 'function') {\n throw new TypeError('memoMethod must be a function if defined')\n }\n this.#memoMethod = memoMethod\n\n if (fetchMethod !== undefined && typeof fetchMethod !== 'function') {\n throw new TypeError('fetchMethod must be a function if specified')\n }\n this.#fetchMethod = fetchMethod\n this.#hasFetchMethod = !!fetchMethod\n\n this.#keyMap = new Map()\n this.#keyList = Array.from({ length: max }).fill(undefined) as (\n | K\n | undefined\n )[]\n this.#valList = Array.from({ length: max }).fill(undefined) as (\n | V\n | undefined\n )[]\n this.#next = new UintArray(max)\n this.#prev = new UintArray(max)\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free = Stack.create(max)\n this.#size = 0\n this.#calculatedSize = 0\n\n if (typeof dispose === 'function') {\n this.#dispose = dispose\n }\n if (typeof onInsert === 'function') {\n this.#onInsert = onInsert\n }\n if (typeof disposeAfter === 'function') {\n this.#disposeAfter = disposeAfter\n this.#disposed = []\n } else {\n this.#disposeAfter = undefined\n this.#disposed = undefined\n }\n this.#hasDispose = !!this.#dispose\n this.#hasOnInsert = !!this.#onInsert\n this.#hasDisposeAfter = !!this.#disposeAfter\n\n this.noDisposeOnSet = !!noDisposeOnSet\n this.noUpdateTTL = !!noUpdateTTL\n this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection\n this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection\n this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort\n this.ignoreFetchAbort = !!ignoreFetchAbort\n\n // NB: maxEntrySize is set to maxSize if it's set\n if (this.maxEntrySize !== 0) {\n if (this.#maxSize !== 0) {\n if (!isPosInt(this.#maxSize)) {\n throw new TypeError(\n 'maxSize must be a positive integer if specified',\n )\n }\n }\n if (!isPosInt(this.maxEntrySize)) {\n throw new TypeError(\n 'maxEntrySize must be a positive integer if specified',\n )\n }\n this.#initializeSizeTracking()\n }\n\n this.allowStale = !!allowStale\n this.noDeleteOnStaleGet = !!noDeleteOnStaleGet\n this.updateAgeOnGet = !!updateAgeOnGet\n this.updateAgeOnHas = !!updateAgeOnHas\n this.ttlResolution =\n isPosInt(ttlResolution) || ttlResolution === 0 ? ttlResolution : 1\n this.ttlAutopurge = !!ttlAutopurge\n this.ttl = ttl || 0\n if (this.ttl) {\n if (!isPosInt(this.ttl)) {\n throw new TypeError('ttl must be a positive integer if specified')\n }\n this.#initializeTTLTracking()\n }\n\n // do not allow completely unbounded caches\n if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) {\n throw new TypeError(\n 'At least one of max, maxSize, or ttl is required',\n )\n }\n if (!this.ttlAutopurge && !this.#max && !this.#maxSize) {\n const code = 'LRU_CACHE_UNBOUNDED'\n if (shouldWarn(code)) {\n warned.add(code)\n const msg =\n 'TTL caching without ttlAutopurge, max, or maxSize can ' +\n 'result in unbounded memory consumption.'\n emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache)\n }\n }\n }\n\n /**\n * Return the number of ms left in the item's TTL. If item is not in cache,\n * returns `0`. Returns `Infinity` if item is in cache without a defined TTL.\n */\n getRemainingTTL(key: K) {\n return this.#keyMap.has(key) ? Infinity : 0\n }\n\n #initializeTTLTracking() {\n const ttls = new ZeroArray(this.#max)\n const starts = new ZeroArray(this.#max)\n this.#ttls = ttls\n this.#starts = starts\n const purgeTimers =\n this.ttlAutopurge ?\n Array.from>({\n length: this.#max,\n })\n : undefined\n this.#autopurgeTimers = purgeTimers\n\n this.#setItemTTL = (index, ttl, start = this.#perf.now()) => {\n starts[index] = ttl !== 0 ? start : 0\n ttls[index] = ttl\n setPurgetTimer(index, ttl)\n }\n\n this.#updateItemAge = index => {\n starts[index] = ttls[index] !== 0 ? this.#perf.now() : 0\n setPurgetTimer(index, ttls[index])\n }\n\n // clear out the purge timer if we're setting TTL to 0, and\n // previously had a ttl purge timer running, so it doesn't\n // fire unnecessarily. Don't need to do this if we're not doing\n // autopurge.\n const setPurgetTimer =\n !this.ttlAutopurge ?\n () => {}\n : (index: Index, ttl?: number) => {\n if (purgeTimers?.[index]) {\n clearTimeout(purgeTimers[index])\n purgeTimers[index] = undefined\n }\n if (ttl && ttl !== 0 && purgeTimers) {\n const t = setTimeout(() => {\n if (this.#isStale(index)) {\n this.#delete(this.#keyList[index] as K, 'expire')\n }\n }, ttl + 1)\n // unref() not supported on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n purgeTimers[index] = t\n }\n }\n\n this.#statusTTL = (status, index) => {\n if (ttls[index]) {\n const ttl = ttls[index]\n const start = starts[index]\n /* c8 ignore start */\n if (!ttl || !start) {\n return\n }\n /* c8 ignore stop */\n status.ttl = ttl\n status.start = start\n status.now = cachedNow || getNow()\n const age = status.now - start\n status.remainingTTL = ttl - age\n }\n }\n\n // debounce calls to perf.now() to 1s so we're not hitting\n // that costly call repeatedly.\n let cachedNow = 0\n const getNow = () => {\n const n = this.#perf.now()\n if (this.ttlResolution > 0) {\n cachedNow = n\n const t = setTimeout(() => (cachedNow = 0), this.ttlResolution)\n // not available on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n }\n return n\n }\n\n this.getRemainingTTL = key => {\n const index = this.#keyMap.get(key)\n if (index === undefined) {\n return 0\n }\n const ttl = ttls[index]\n const start = starts[index]\n if (!ttl || !start) {\n return Infinity\n }\n const age = (cachedNow || getNow()) - start\n return ttl - age\n }\n\n this.#isStale = index => {\n const s = starts[index]\n const t = ttls[index]\n return !!t && !!s && (cachedNow || getNow()) - s > t\n }\n }\n\n // conditionally set private methods related to TTL\n #updateItemAge: (index: Index) => void = () => {}\n #statusTTL: (status: LRUCache.Status, index: Index) => void =\n () => {}\n #setItemTTL: (\n index: Index,\n ttl: LRUCache.Milliseconds,\n start?: LRUCache.Milliseconds,\n // ignore because we never call this if we're not already in TTL mode\n /* c8 ignore start */\n ) => void = () => {}\n /* c8 ignore stop */\n\n #isStale: (index: Index) => boolean = () => false\n\n #initializeSizeTracking() {\n const sizes = new ZeroArray(this.#max)\n this.#calculatedSize = 0\n this.#sizes = sizes\n this.#removeItemSize = index => {\n this.#calculatedSize -= sizes[index] as number\n sizes[index] = 0\n }\n this.#requireSize = (k, v, size, sizeCalculation) => {\n if (!isPosInt(size)) {\n // provisionally accept background fetches.\n // actual value size will be checked when they return.\n if (this.#isBackgroundFetch(v)) {\n // NB: this cannot occur if v.__staleWhileFetching is set,\n // because in that case, it would take on the size of the\n // existing entry that it temporarily replaces.\n return this.backgroundFetchSize\n }\n if (sizeCalculation) {\n if (typeof sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation must be a function')\n }\n size = sizeCalculation(v, k)\n if (!isPosInt(size)) {\n throw new TypeError(\n 'sizeCalculation return invalid (expect positive integer)',\n )\n }\n } else {\n throw new TypeError(\n 'invalid size value (must be positive integer). ' +\n 'When maxSize or maxEntrySize is used, sizeCalculation ' +\n 'or size must be set.',\n )\n }\n }\n return size\n }\n\n this.#addItemSize = (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status,\n ) => {\n sizes[index] = size\n if (this.#maxSize) {\n const maxSize = this.#maxSize - sizes[index]\n while (this.#calculatedSize > maxSize) {\n this.#evict(true)\n }\n }\n this.#calculatedSize += sizes[index]\n if (status) {\n status.entrySize = size\n status.totalCalculatedSize = this.#calculatedSize\n }\n }\n }\n\n #removeItemSize: (index: Index) => void = _i => {}\n\n #addItemSize: (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status,\n ) => void = (_i, _s, _st) => {}\n\n #requireSize: (\n k: K,\n v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator,\n status?: LRUCache.Status,\n ) => LRUCache.Size = (\n _k: K,\n _v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator,\n ) => {\n if (size || sizeCalculation) {\n throw new TypeError(\n 'cannot set size without setting maxSize or maxEntrySize on cache',\n )\n }\n return 0\n };\n\n *#indexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#tail; this.#isValidIndex(i); ) {\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#head) {\n break\n } else {\n i = this.#prev[i] as Index\n }\n }\n }\n }\n\n *#rindexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#head; this.#isValidIndex(i); ) {\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#tail) {\n break\n } else {\n i = this.#next[i] as Index\n }\n }\n }\n }\n\n #isValidIndex(index: Index) {\n return (\n index !== undefined &&\n this.#keyMap.get(this.#keyList[index] as K) === index\n )\n }\n\n /**\n * Return a generator yielding `[key, value]` pairs,\n * in order from most recently used to least recently used.\n */\n *entries() {\n for (const i of this.#indexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]] as [K, V]\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.entries}\n *\n * Return a generator yielding `[key, value]` pairs,\n * in order from least recently used to most recently used.\n */\n *rentries() {\n for (const i of this.#rindexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]]\n }\n }\n }\n\n /**\n * Return a generator yielding the keys in the cache,\n * in order from most recently used to least recently used.\n */\n *keys() {\n for (const i of this.#indexes()) {\n const k = this.#keyList[i]\n if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield k\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.keys}\n *\n * Return a generator yielding the keys in the cache,\n * in order from least recently used to most recently used.\n */\n *rkeys() {\n for (const i of this.#rindexes()) {\n const k = this.#keyList[i]\n if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield k\n }\n }\n }\n\n /**\n * Return a generator yielding the values in the cache,\n * in order from most recently used to least recently used.\n */\n *values() {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i] as V\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.values}\n *\n * Return a generator yielding the values in the cache,\n * in order from least recently used to most recently used.\n */\n *rvalues() {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i]\n }\n }\n }\n\n /**\n * Iterating over the cache itself yields the same results as\n * {@link LRUCache.entries}\n */\n [Symbol.iterator]() {\n return this.entries()\n }\n\n /**\n * A String value that is used in the creation of the default string\n * description of an object. Called by the built-in method\n * `Object.prototype.toString`.\n */\n [Symbol.toStringTag] = 'LRUCache'\n\n /**\n * Find a value for which the supplied fn method returns a truthy value,\n * similar to `Array.find()`. fn is called as `fn(value, key, cache)`.\n */\n find(\n fn: (v: V, k: K, self: LRUCache) => boolean,\n getOptions: LRUCache.GetOptions = {},\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n if (fn(value, this.#keyList[i] as K, this)) {\n return this.#get(this.#keyList[i] as K, getOptions)\n }\n }\n }\n\n /**\n * Call the supplied function on each item in the cache, in order from most\n * recently used to least recently used.\n *\n * `fn` is called as `fn(value, key, cache)`.\n *\n * If `thisp` is provided, function will be called in the `this`-context of\n * the provided object, or the cache if no `thisp` object is provided.\n *\n * Does not update age or recenty of use, or iterate over stale values.\n */\n forEach(\n fn: (v: V, k: K, self: LRUCache) => unknown,\n thisp: unknown = this,\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * The same as {@link LRUCache.forEach} but items are iterated over in\n * reverse order. (ie, less recently used items are iterated over first.)\n */\n rforEach(\n fn: (v: V, k: K, self: LRUCache) => unknown,\n thisp: unknown = this,\n ) {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * Delete any stale entries. Returns true if anything was removed,\n * false otherwise.\n */\n purgeStale() {\n let deleted = false\n for (const i of this.#rindexes({ allowStale: true })) {\n if (this.#isStale(i)) {\n this.#delete(this.#keyList[i] as K, 'expire')\n deleted = true\n }\n }\n return deleted\n }\n\n /**\n * Get the extended info about a given entry, to get its value, size, and\n * TTL info simultaneously. Returns `undefined` if the key is not present.\n *\n * Unlike {@link LRUCache#dump}, which is designed to be portable and survive\n * serialization, the `start` value is always the current timestamp, and the\n * `ttl` is a calculated remaining time to live (negative if expired).\n *\n * Always returns stale values, if their info is found in the cache, so be\n * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl})\n * if relevant.\n */\n info(key: K): LRUCache.Entry | undefined {\n const i = this.#keyMap.get(key)\n if (i === undefined) return undefined\n const v = this.#valList[i]\n /* c8 ignore start - this isn't tested for the info function,\n * but it's the same logic as found in other places. */\n const value: V | undefined =\n this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) return undefined\n /* c8 ignore stop */\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n const ttl = this.#ttls[i]\n const start = this.#starts[i]\n if (ttl && start) {\n const remain = ttl - (this.#perf.now() - start)\n entry.ttl = remain\n entry.start = Date.now()\n }\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n return entry\n }\n\n /**\n * Return an array of [key, {@link LRUCache.Entry}] tuples which can be\n * passed to {@link LRUCache#load}.\n *\n * The `start` fields are calculated relative to a portable `Date.now()`\n * timestamp, even if `performance.now()` is available.\n *\n * Stale entries are always included in the `dump`, even if\n * {@link LRUCache.OptionsBase.allowStale} is false.\n *\n * Note: this returns an actual array, not a generator, so it can be more\n * easily passed around.\n */\n dump() {\n const arr: [K, LRUCache.Entry][] = []\n for (const i of this.#indexes({ allowStale: true })) {\n const key = this.#keyList[i]\n const v = this.#valList[i]\n const value: V | undefined =\n this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined || key === undefined) continue\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n entry.ttl = this.#ttls[i]\n // always dump the start relative to a portable timestamp\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = this.#perf.now() - (this.#starts[i] as number)\n entry.start = Math.floor(Date.now() - age)\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n arr.unshift([key, entry])\n }\n return arr\n }\n\n /**\n * Reset the cache and load in the items in entries in the order listed.\n *\n * The shape of the resulting cache may be different if the same options are\n * not used in both caches.\n *\n * The `start` fields are assumed to be calculated relative to a portable\n * `Date.now()` timestamp, even if `performance.now()` is available.\n */\n load(arr: [K, LRUCache.Entry][]) {\n this.clear()\n for (const [key, entry] of arr) {\n if (entry.start) {\n // entry.start is a portable timestamp, but we may be using\n // node's performance.now(), so calculate the offset, so that\n // we get the intended remaining TTL, no matter how long it's\n // been on ice.\n //\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = Date.now() - entry.start\n entry.start = this.#perf.now() - age\n }\n this.#set(key, entry.value, entry)\n }\n }\n\n /**\n * Add a value to the cache.\n *\n * Note: if `undefined` is specified as a value, this is an alias for\n * {@link LRUCache#delete}\n *\n * Fields on the {@link LRUCache.SetOptions} options param will override\n * their corresponding values in the constructor options for the scope\n * of this single `set()` operation.\n *\n * If `start` is provided, then that will set the effective start\n * time for the TTL calculation. Note that this must be a previous\n * value of `performance.now()` if supported, or a previous value of\n * `Date.now()` if not.\n *\n * Options object may also include `size`, which will prevent\n * calling the `sizeCalculation` function and just use the specified\n * number if it is a positive integer, and `noDisposeOnSet` which\n * will prevent calling a `dispose` function in the case of\n * overwrites.\n *\n * If the `size` (or return value of `sizeCalculation`) for a given\n * entry is greater than `maxEntrySize`, then the item will not be\n * added to the cache.\n *\n * Will update the recency of the entry.\n *\n * If the value is `undefined`, then this is an alias for\n * `cache.delete(key)`. `undefined` is never stored in the cache.\n */\n set(\n k: K,\n v: V | undefined,\n setOptions: LRUCache.SetOptions = {},\n ) {\n const { status = metrics.hasSubscribers ? {} : undefined } = setOptions\n setOptions.status = status\n if (status) {\n status.op = 'set'\n status.key = k\n if (v !== undefined) status.value = v\n status.cache = this\n }\n const result = this.#set(k, v, setOptions)\n if (status && metrics.hasSubscribers) {\n metrics.publish(status)\n }\n return result\n }\n\n #set(\n k: K,\n v: V | BackgroundFetch | undefined,\n setOptions: LRUCache.SetOptions,\n bf?: BackgroundFetch,\n ) {\n const {\n ttl = this.ttl,\n start,\n noDisposeOnSet = this.noDisposeOnSet,\n sizeCalculation = this.sizeCalculation,\n status,\n } = setOptions\n\n const isBF = this.#isBackgroundFetch(v)\n if (v === undefined) {\n if (status) status.set = 'deleted'\n this.delete(k)\n return this\n }\n let { noUpdateTTL = this.noUpdateTTL } = setOptions\n\n if (status && !isBF) status.value = v\n\n const size = this.#requireSize(\n k,\n v,\n setOptions.size || 0,\n sizeCalculation,\n status,\n )\n // if the item doesn't fit, don't do anything\n // NB: maxEntrySize set to maxSize by default\n if (this.maxEntrySize && size > this.maxEntrySize) {\n // have to delete, in case something is there already.\n this.#delete(k, 'set')\n if (status) {\n status.set = 'miss'\n status.maxEntrySizeExceeded = true\n }\n return this\n }\n let index = this.#size === 0 ? undefined : this.#keyMap.get(k)\n if (index === undefined) {\n // addition\n index = (\n this.#size === 0 ? this.#tail\n : this.#free.length !== 0 ? this.#free.pop()\n : this.#size === this.#max ? this.#evict(false)\n : this.#size) as Index\n this.#keyList[index] = k\n this.#valList[index] = v\n this.#keyMap.set(k, index)\n this.#next[this.#tail] = index\n this.#prev[index] = this.#tail\n this.#tail = index\n this.#size++\n this.#addItemSize(index, size, status)\n if (status) status.set = 'add'\n noUpdateTTL = false\n if (this.#hasOnInsert && !isBF) {\n this.#onInsert?.(v, k, 'add')\n }\n } else {\n // update\n // might be updating a background fetch!\n this.#moveToTail(index)\n const oldVal = this.#valList[index]!\n if (v !== oldVal) {\n if (!noDisposeOnSet) {\n if (this.#isBackgroundFetch(oldVal)) {\n if (oldVal !== bf) {\n // setting over a background fetch, not merely resolving it.\n oldVal.__abortController.abort(new Error('replaced'))\n }\n const { __staleWhileFetching: s } = oldVal\n if (s !== undefined && s !== v) {\n if (this.#hasDispose) {\n this.#dispose?.(s, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([s, k, 'set'])\n }\n }\n } else {\n if (this.#hasDispose) {\n this.#dispose?.(oldVal, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldVal, k, 'set'])\n }\n }\n }\n this.#removeItemSize(index)\n this.#addItemSize(index, size, status)\n this.#valList[index] = v\n if (!isBF) {\n const oldValue =\n oldVal && this.#isBackgroundFetch(oldVal) ?\n oldVal.__staleWhileFetching\n : oldVal\n const setType =\n oldValue === undefined ? 'add'\n : v !== oldValue ? 'replace'\n : 'update'\n if (status) {\n status.set = setType\n if (oldValue !== undefined) status.oldValue = oldValue\n }\n if (this.#hasOnInsert) {\n this.onInsert?.(v, k, setType)\n }\n }\n } else if (!isBF) {\n if (status) {\n status.set = 'update'\n }\n if (this.#hasOnInsert) {\n this.onInsert?.(v, k, 'update')\n }\n }\n }\n if (ttl !== 0 && !this.#ttls) {\n this.#initializeTTLTracking()\n }\n if (this.#ttls) {\n if (!noUpdateTTL) {\n this.#setItemTTL(index, ttl, start)\n }\n if (status) this.#statusTTL(status, index)\n }\n if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return this\n }\n\n /**\n * Evict the least recently used item, returning its value or\n * `undefined` if cache is empty.\n */\n pop(): V | undefined {\n try {\n while (this.#size) {\n const val = this.#valList[this.#head]\n this.#evict(true)\n if (this.#isBackgroundFetch(val)) {\n if (val.__staleWhileFetching) {\n return val.__staleWhileFetching\n }\n } else if (val !== undefined) {\n return val\n }\n }\n } finally {\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n }\n\n #evict(free: boolean) {\n const head = this.#head\n const k = this.#keyList[head]!\n const v = this.#valList[head]!\n const isBF = this.#isBackgroundFetch(v)\n if (isBF) {\n v.__abortController.abort(new Error('evicted'))\n }\n const oldValue = isBF ? v.__staleWhileFetching : v\n if (\n (this.#hasDispose || this.#hasDisposeAfter) &&\n oldValue !== undefined\n ) {\n if (this.#hasDispose) {\n this.#dispose?.(oldValue, k, 'evict')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldValue, k, 'evict'])\n }\n }\n this.#removeItemSize(head)\n if (this.#autopurgeTimers?.[head]) {\n clearTimeout(this.#autopurgeTimers[head])\n this.#autopurgeTimers[head] = undefined\n }\n // if we aren't about to use the index, then null these out\n if (free) {\n this.#keyList[head] = undefined\n this.#valList[head] = undefined\n this.#free.push(head)\n }\n if (this.#size === 1) {\n this.#head = this.#tail = 0 as Index\n this.#free.length = 0\n } else {\n this.#head = this.#next[head] as Index\n }\n this.#keyMap.delete(k)\n this.#size--\n return head\n }\n\n /**\n * Check if a key is in the cache, without updating the recency of use.\n * Will return false if the item is stale, even though it is technically\n * in the cache.\n *\n * Check if a key is in the cache, without updating the recency of\n * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set\n * to `true` in either the options or the constructor.\n *\n * Will return `false` if the item is stale, even though it is technically in\n * the cache. The difference can be determined (if it matters) by using a\n * `status` argument, and inspecting the `has` field.\n *\n * Will not update item age unless\n * {@link LRUCache.OptionsBase.updateAgeOnHas} is set.\n */\n has(k: K, hasOptions: LRUCache.HasOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } = hasOptions\n hasOptions.status = status\n if (status) {\n status.op = 'has'\n status.key = k\n status.cache = this\n }\n const result = this.#has(k, hasOptions)\n if (metrics.hasSubscribers) metrics.publish(status)\n return result\n }\n #has(k: K, hasOptions: LRUCache.HasOptions = {}) {\n const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n const v = this.#valList[index]\n if (\n this.#isBackgroundFetch(v) &&\n v.__staleWhileFetching === undefined\n ) {\n return false\n }\n if (!this.#isStale(index)) {\n if (updateAgeOnHas) {\n this.#updateItemAge(index)\n }\n if (status) {\n status.has = 'hit'\n this.#statusTTL(status, index)\n }\n return true\n } else if (status) {\n status.has = 'stale'\n this.#statusTTL(status, index)\n }\n } else if (status) {\n status.has = 'miss'\n }\n return false\n }\n\n /**\n * Like {@link LRUCache#get} but doesn't update recency or delete stale\n * items.\n *\n * Returns `undefined` if the item is stale, unless\n * {@link LRUCache.OptionsBase.allowStale} is set.\n */\n peek(k: K, peekOptions: LRUCache.PeekOptions = {}) {\n const { status = hasSubscribers() ? {} : undefined } = peekOptions\n if (status) {\n status.op = 'peek'\n status.key = k\n status.cache = this\n }\n peekOptions.status = status\n const result = this.#peek(k, peekOptions)\n if (metrics.hasSubscribers) {\n metrics.publish(status)\n }\n return result\n }\n #peek(k: K, peekOptions: LRUCache.PeekOptions) {\n const { status, allowStale = this.allowStale } = peekOptions\n const index = this.#keyMap.get(k)\n if (index === undefined || (!allowStale && this.#isStale(index))) {\n if (status) status.peek = index === undefined ? 'miss' : 'stale'\n return undefined\n }\n const v = this.#valList[index]\n const val = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (status) {\n if (val !== undefined) {\n status.peek = 'hit'\n status.value = val\n } else {\n status.peek = 'miss'\n }\n }\n return val\n }\n\n #backgroundFetch(\n k: K,\n index: Index | undefined,\n options: LRUCache.FetchOptions,\n context: FC,\n ): BackgroundFetch {\n const v = index === undefined ? undefined : this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n return v\n }\n\n const ac = new AbortController()\n const { signal } = options\n // when/if our AC signals, then stop listening to theirs.\n signal?.addEventListener('abort', () => ac.abort(signal.reason), {\n signal: ac.signal,\n })\n\n const fetchOpts = {\n signal: ac.signal,\n options,\n context,\n }\n\n const cb = (v: V | undefined, updateCache = false): V | undefined => {\n const { aborted } = ac.signal\n const ignoreAbort = options.ignoreFetchAbort && v !== undefined\n const proceed =\n options.ignoreFetchAbort ||\n !!(options.allowStaleOnFetchAbort && v !== undefined)\n if (options.status) {\n if (aborted && !updateCache) {\n options.status.fetchAborted = true\n options.status.fetchError = ac.signal.reason\n if (ignoreAbort) options.status.fetchAbortIgnored = true\n } else {\n options.status.fetchResolved = true\n }\n }\n if (aborted && !ignoreAbort && !updateCache) {\n return fetchFail(ac.signal.reason, proceed)\n }\n // either we didn't abort, and are still here, or we did, and ignored\n const bf = p as BackgroundFetch\n // if nothing else has been written there but we're set to update the\n // cache and ignore the abort, or if it's still pending on this specific\n // background request, then write it to the cache.\n const vl = this.#valList[index as Index]\n if (vl === p || (vl === undefined && ignoreAbort && updateCache)) {\n if (v === undefined) {\n if (bf.__staleWhileFetching !== undefined) {\n this.#valList[index as Index] = bf.__staleWhileFetching\n } else {\n this.#delete(k, 'fetch')\n }\n } else {\n if (options.status) options.status.fetchUpdated = true\n this.#set(k, v, fetchOpts.options, bf)\n }\n }\n return v\n }\n\n const eb = (er: unknown) => {\n if (options.status) {\n options.status.fetchRejected = true\n options.status.fetchError = er as Error\n }\n // do not pass go, do not collect $200\n return fetchFail(er, false)\n }\n\n const fetchFail = (er: unknown, proceed: boolean): V | undefined => {\n const { aborted } = ac.signal\n const allowStaleAborted = aborted && options.allowStaleOnFetchAbort\n const allowStale =\n allowStaleAborted || options.allowStaleOnFetchRejection\n const noDelete = allowStale || options.noDeleteOnFetchRejection\n const bf = p as BackgroundFetch\n if (this.#valList[index as Index] === p) {\n // if we allow stale on fetch rejections, then we need to ensure that\n // the stale value is not removed from the cache when the fetch fails.\n const del =\n !noDelete || (!proceed && bf.__staleWhileFetching === undefined)\n if (del) {\n this.#delete(k, 'fetch')\n } else if (!allowStaleAborted) {\n // still replace the *promise* with the stale value,\n // since we are done with the promise at this point.\n // leave it untouched if we're still waiting for an\n // aborted background fetch that hasn't yet returned.\n this.#valList[index as Index] = bf.__staleWhileFetching\n }\n }\n if (allowStale) {\n if (options.status && bf.__staleWhileFetching !== undefined) {\n options.status.returnedStale = true\n }\n return bf.__staleWhileFetching\n } else if (bf.__returned === bf) {\n throw er\n }\n }\n\n const pcall = (\n res: (v: V | undefined) => void,\n rej: (e: unknown) => void,\n ) => {\n const fmp = this.#fetchMethod?.(k, v, fetchOpts)\n // ignored, we go until we finish, regardless.\n // defer check until we are actually aborting,\n // so fetchMethod can override.\n ac.signal.addEventListener('abort', () => {\n if (!options.ignoreFetchAbort || options.allowStaleOnFetchAbort) {\n res(undefined)\n // when it eventually resolves, update the cache.\n if (options.allowStaleOnFetchAbort) {\n res = v => cb(v, true)\n }\n }\n })\n if (fmp && fmp instanceof Promise) {\n fmp.then(v => res(v === undefined ? undefined : v), rej)\n } else if (fmp !== undefined) {\n res(fmp)\n }\n }\n\n if (options.status) options.status.fetchDispatched = true\n const p = new Promise(pcall).then(cb, eb)\n const bf: BackgroundFetch = Object.assign(p, {\n __abortController: ac,\n __staleWhileFetching: v,\n __returned: undefined,\n })\n\n if (index === undefined) {\n // internal, don't expose status.\n this.#set(k, bf, { ...fetchOpts.options, status: undefined })\n index = this.#keyMap.get(k)\n } else {\n // do not call #set, because we do not want to adjust its place\n // in the lru queue, as it has not yet been \"used\". Also, we don't\n // need to worry about evicting for size, because a background fetch\n // over a stale value is treated as the same size as its stale value.\n this.#valList[index] = bf\n }\n return bf\n }\n\n #isBackgroundFetch(p: unknown): p is BackgroundFetch {\n if (!this.#hasFetchMethod) return false\n const b = p as BackgroundFetch\n return (\n !!b &&\n b instanceof Promise &&\n b.hasOwnProperty('__staleWhileFetching') &&\n b.__abortController instanceof AbortController\n )\n }\n\n /**\n * Make an asynchronous cached fetch using the\n * {@link LRUCache.OptionsBase.fetchMethod} function.\n *\n * If the value is in the cache and not stale, then the returned\n * Promise resolves to the value.\n *\n * If not in the cache, or beyond its TTL staleness, then\n * `fetchMethod(key, staleValue, { options, signal, context })` is\n * called, and the value returned will be added to the cache once\n * resolved.\n *\n * If called with `allowStale`, and an asynchronous fetch is\n * currently in progress to reload a stale value, then the former\n * stale value will be returned.\n *\n * If called with `forceRefresh`, then the cached item will be\n * re-fetched, even if it is not stale. However, if `allowStale` is also\n * set, then the old value will still be returned. This is useful\n * in cases where you want to force a reload of a cached value. If\n * a background fetch is already in progress, then `forceRefresh`\n * has no effect.\n *\n * If multiple fetches for the same key are issued, then they will all be\n * coalesced into a single call to fetchMethod.\n *\n * Note that this means that handling options such as\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort},\n * {@link LRUCache.FetchOptions.signal},\n * and {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} will be\n * determined by the FIRST fetch() call for a given key.\n *\n * This is a known (fixable) shortcoming which will be addresed on when\n * someone complains about it, as the fix would involve added complexity and\n * may not be worth the costs for this edge case.\n *\n * If {@link LRUCache.OptionsBase.fetchMethod} is not specified, then this is\n * effectively an alias for `Promise.resolve(cache.get(key))`.\n *\n * When the fetch method resolves to a value, if the fetch has not\n * been aborted due to deletion, eviction, or being overwritten,\n * then it is added to the cache using the options provided.\n *\n * If the key is evicted or deleted before the `fetchMethod`\n * resolves, then the AbortSignal passed to the `fetchMethod` will\n * receive an `abort` event, and the promise returned by `fetch()`\n * will reject with the reason for the abort.\n *\n * If a `signal` is passed to the `fetch()` call, then aborting the\n * signal will abort the fetch and cause the `fetch()` promise to\n * reject with the reason provided.\n *\n * **Setting `context`**\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the {@link LRUCache} constructor, then all\n * calls to `cache.fetch()` _must_ provide a `context` option. If\n * set to `undefined` or `void`, then calls to fetch _must not_\n * provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that\n * might be relevant in the course of fetching the data. It is only\n * relevant for the course of a single `fetch()` operation, and\n * discarded afterwards.\n *\n * **Note: `fetch()` calls are inflight-unique**\n *\n * If you call `fetch()` multiple times with the same key value,\n * then every call after the first will resolve on the same\n * promise1,\n * _even if they have different settings that would otherwise change\n * the behavior of the fetch_, such as `noDeleteOnFetchRejection`\n * or `ignoreFetchAbort`.\n *\n * In most cases, this is not a problem (in fact, only fetching\n * something once is what you probably want, if you're caching in\n * the first place). If you are changing the fetch() options\n * dramatically between runs, there's a good chance that you might\n * be trying to fit divergent semantics into a single object, and\n * would be better off with multiple cache instances.\n *\n * **1**: Ie, they're not the \"same Promise\", but they resolve at\n * the same time, because they're both waiting on the same\n * underlying fetchMethod response.\n */\n\n fetch(\n k: K,\n fetchOptions: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext,\n ): Promise\n\n // this overload not allowed if context is required\n fetch(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n fetchOptions?: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : never,\n ): Promise\n fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const ths = tracing.hasSubscribers\n const { status = hasSubscribers() ? {} : undefined } = fetchOptions\n fetchOptions.status = status\n if (status && fetchOptions.context) {\n status.context = fetchOptions.context\n }\n const p = this.#fetch(k, fetchOptions)\n if (status && ths) {\n status.trace = true\n tracing.tracePromise(() => p, status).catch(() => {})\n }\n return p\n }\n\n async #fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const {\n // get options\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n // set options\n ttl = this.ttl,\n noDisposeOnSet = this.noDisposeOnSet,\n size = 0,\n sizeCalculation = this.sizeCalculation,\n noUpdateTTL = this.noUpdateTTL,\n // fetch exclusive options\n noDeleteOnFetchRejection = this.noDeleteOnFetchRejection,\n allowStaleOnFetchRejection = this.allowStaleOnFetchRejection,\n ignoreFetchAbort = this.ignoreFetchAbort,\n allowStaleOnFetchAbort = this.allowStaleOnFetchAbort,\n context,\n forceRefresh = false,\n status,\n signal,\n } = fetchOptions\n if (status) {\n status.op = 'fetch'\n status.key = k\n if (forceRefresh) status.forceRefresh = true\n status.cache = this\n }\n\n if (!this.#hasFetchMethod) {\n if (status) status.fetch = 'get'\n return this.#get(k, {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n status,\n })\n }\n\n const options = {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n ttl,\n noDisposeOnSet,\n size,\n sizeCalculation,\n noUpdateTTL,\n noDeleteOnFetchRejection,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n status,\n signal,\n }\n\n let index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.fetch = 'miss'\n const p = this.#backgroundFetch(k, index, options, context as FC)\n return (p.__returned = p)\n } else {\n // in cache, maybe already fetching\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n const stale = allowStale && v.__staleWhileFetching !== undefined\n if (status) {\n status.fetch = 'inflight'\n if (stale) status.returnedStale = true\n }\n return stale ? v.__staleWhileFetching : (v.__returned = v)\n }\n\n // if we force a refresh, that means do NOT serve the cached value,\n // unless we are already in the process of refreshing the cache.\n const isStale = this.#isStale(index)\n if (!forceRefresh && !isStale) {\n if (status) status.fetch = 'hit'\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n if (status) this.#statusTTL(status, index)\n return v\n }\n\n // ok, it is stale or a forced refresh, and not already fetching.\n // refresh the cache.\n const p = this.#backgroundFetch(k, index, options, context as FC)\n const hasStale = p.__staleWhileFetching !== undefined\n const staleVal = hasStale && allowStale\n if (status) {\n status.fetch = isStale ? 'stale' : 'refresh'\n if (staleVal && isStale) status.returnedStale = true\n }\n return staleVal ? p.__staleWhileFetching : (p.__returned = p)\n }\n }\n\n /**\n * In some cases, `cache.fetch()` may resolve to `undefined`, either because\n * a {@link LRUCache.OptionsBase#fetchMethod} was not provided (turning\n * `cache.fetch(k)` into just an async wrapper around `cache.get(k)`) or\n * because `ignoreFetchAbort` was specified (either to the constructor or\n * in the {@link LRUCache.FetchOptions}). Also, the\n * {@link LRUCache.OptionsBase.fetchMethod} may return `undefined` or `void`, making\n * the test even more complicated.\n *\n * Because inferring the cases where `undefined` might be returned are so\n * cumbersome, but testing for `undefined` can also be annoying, this method\n * can be used, which will reject if `this.fetch()` resolves to undefined.\n */\n forceFetch(\n k: K,\n fetchOptions: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext,\n ): Promise\n // this overload not allowed if context is required\n forceFetch(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n fetchOptions?: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : never,\n ): Promise\n forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const ths = tracing.hasSubscribers\n const { status = hasSubscribers() ? {} : undefined } = fetchOptions\n fetchOptions.status = status\n if (status && fetchOptions.context) {\n status.context = fetchOptions.context\n }\n const p = this.#forceFetch(k, fetchOptions)\n if (status && ths) {\n status.trace = true\n tracing.tracePromise(() => p, status).catch(() => {})\n }\n return p\n }\n\n async #forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ) {\n const v = await this.#fetch(k, fetchOptions)\n if (v === undefined) throw new Error('fetch() returned undefined')\n return v\n }\n\n /**\n * If the key is found in the cache, then this is equivalent to\n * {@link LRUCache#get}. If not, in the cache, then calculate the value using\n * the {@link LRUCache.OptionsBase.memoMethod}, and add it to the cache.\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the LRUCache constructor, then all calls to `cache.memo()`\n * _must_ provide a `context` option. If set to `undefined` or `void`, then\n * calls to memo _must not_ provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that might be\n * relevant in the course of fetching the data. It is only relevant for the\n * course of a single `memo()` operation, and discarded afterwards.\n */\n memo(\n k: K,\n memoOptions: unknown extends FC ? LRUCache.MemoOptions\n : FC extends undefined | void ? LRUCache.MemoOptionsNoContext\n : LRUCache.MemoOptionsWithContext,\n ): V\n // this overload not allowed if context is required\n memo(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n memoOptions?: unknown extends FC ? LRUCache.MemoOptions\n : FC extends undefined | void ? LRUCache.MemoOptionsNoContext\n : never,\n ): V\n memo(k: K, memoOptions: LRUCache.MemoOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } =\n memoOptions\n memoOptions.status = status\n if (status) {\n status.op = 'memo'\n status.key = k\n if (memoOptions.context) {\n status.context = memoOptions.context\n }\n status.cache = this\n }\n const result = this.#memo(k, memoOptions)\n if (status) status.value = result\n if (metrics.hasSubscribers) metrics.publish(status)\n return result\n }\n #memo(k: K, memoOptions: LRUCache.MemoOptions = {}) {\n const memoMethod = this.#memoMethod\n if (!memoMethod) {\n throw new Error('no memoMethod provided to constructor')\n }\n const { context, status, forceRefresh, ...options } = memoOptions\n if (status && forceRefresh) status.forceRefresh = true\n const v = this.#get(k, options)\n const refresh = forceRefresh || v === undefined\n if (status) {\n status.memo = refresh ? 'miss' : 'hit'\n if (!refresh) status.value = v\n }\n if (!refresh) return v\n const vv = memoMethod(k, v, {\n options,\n context,\n } as LRUCache.MemoizerOptions)\n if (status) status.value = vv\n this.#set(k, vv, options)\n return vv\n }\n\n /**\n * Return a value from the cache. Will update the recency of the cache\n * entry found.\n *\n * If the key is not found, get() will return `undefined`.\n */\n get(k: K, getOptions: LRUCache.GetOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } = getOptions\n getOptions.status = status\n if (status) {\n status.op = 'get'\n status.key = k\n status.cache = this\n }\n const result = this.#get(k, getOptions)\n if (status) {\n if (result !== undefined) status.value = result\n if (metrics.hasSubscribers) metrics.publish(status)\n }\n return result\n }\n\n #get(k: K, getOptions: LRUCache.GetOptions = {}) {\n const {\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n status,\n } = getOptions\n const index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.get = 'miss'\n return undefined\n }\n const value = this.#valList[index]\n const fetching = this.#isBackgroundFetch(value)\n if (status) this.#statusTTL(status, index)\n if (this.#isStale(index)) {\n // delete only if not an in-flight background fetch\n if (!fetching) {\n if (!noDeleteOnStaleGet) {\n this.#delete(k, 'expire')\n }\n if (status) status.get = 'stale'\n if (allowStale) {\n if (status) status.returnedStale = true\n return value\n }\n return undefined\n }\n if (status) status.get = 'stale-fetching'\n if (allowStale && value.__staleWhileFetching !== undefined) {\n if (status) status.returnedStale = true\n return value.__staleWhileFetching\n }\n return undefined\n }\n // not stale\n if (status) status.get = fetching ? 'fetching' : 'hit'\n // if we're currently fetching it, we don't actually have it yet\n // it's not stale, which means this isn't a staleWhileRefetching.\n // If it's not stale, and fetching, AND has a __staleWhileFetching\n // value, then that means the user fetched with {forceRefresh:true},\n // so it's safe to return that value.\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n return fetching ? value.__staleWhileFetching : value\n }\n\n #connect(p: Index, n: Index) {\n this.#prev[n] = p\n this.#next[p] = n\n }\n\n #moveToTail(index: Index): void {\n // if tail already, nothing to do\n // if head, move head to next[index]\n // else\n // move next[prev[index]] to next[index] (head has no prev)\n // move prev[next[index]] to prev[index]\n // prev[index] = tail\n // next[tail] = index\n // tail = index\n if (index !== this.#tail) {\n if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n this.#connect(\n this.#prev[index] as Index,\n this.#next[index] as Index,\n )\n }\n this.#connect(this.#tail, index)\n this.#tail = index\n }\n }\n\n /**\n * Deletes a key out of the cache.\n *\n * Returns true if the key was deleted, false otherwise.\n */\n delete(k: K) {\n return this.#delete(k, 'delete')\n }\n\n #delete(k: K, reason: LRUCache.DisposeReason) {\n if (metrics.hasSubscribers) {\n metrics.publish({\n op: 'delete',\n delete: reason,\n key: k,\n cache: this,\n })\n }\n let deleted = false\n if (this.#size !== 0) {\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n if (this.#autopurgeTimers?.[index]) {\n clearTimeout(this.#autopurgeTimers?.[index])\n this.#autopurgeTimers[index] = undefined\n }\n deleted = true\n if (this.#size === 1) {\n this.#clear(reason)\n } else {\n this.#removeItemSize(index)\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k, reason])\n }\n }\n this.#keyMap.delete(k)\n this.#keyList[index] = undefined\n this.#valList[index] = undefined\n if (index === this.#tail) {\n this.#tail = this.#prev[index] as Index\n } else if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n const pi = this.#prev[index] as number\n this.#next[pi] = this.#next[index] as number\n const ni = this.#next[index] as number\n this.#prev[ni] = this.#prev[index] as number\n }\n this.#size--\n this.#free.push(index)\n }\n }\n }\n if (this.#hasDisposeAfter && this.#disposed?.length) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return deleted\n }\n\n /**\n * Clear the cache entirely, throwing away all values.\n */\n clear() {\n return this.#clear('delete')\n }\n #clear(reason: LRUCache.DisposeReason) {\n for (const index of this.#rindexes({ allowStale: true })) {\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else {\n const k = this.#keyList[index]\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k as K, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k as K, reason])\n }\n }\n }\n\n this.#keyMap.clear()\n void this.#valList.fill(undefined)\n this.#keyList.fill(undefined)\n if (this.#ttls && this.#starts) {\n this.#ttls.fill(0)\n this.#starts.fill(0)\n for (const t of this.#autopurgeTimers ?? []) {\n if (t !== undefined) clearTimeout(t)\n }\n this.#autopurgeTimers?.fill(undefined)\n }\n if (this.#sizes) {\n this.#sizes.fill(0)\n }\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free.length = 0\n this.#calculatedSize = 0\n this.#size = 0\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/browser/index.min.js b/node_modules/lru-cache/dist/esm/browser/index.min.js new file mode 100644 index 00000000..86618ad2 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/browser/index.min.js @@ -0,0 +1,2 @@ +var L={hasSubscribers:!1},S=L,W=L;var M=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date;var D=()=>S.hasSubscribers||W.hasSubscribers,j=new Set,I=typeof process=="object"&&process?process:{},P=(u,e,t,i)=>{typeof I.emitWarning=="function"?I.emitWarning(u,e,t,i):console.error(`[${t}] ${e}: ${u}`)},k=u=>!j.has(u);var T=u=>!!u&&u===Math.floor(u)&&u>0&&isFinite(u),G=u=>T(u)?u<=Math.pow(2,8)?Uint8Array:u<=Math.pow(2,16)?Uint16Array:u<=Math.pow(2,32)?Uint32Array:u<=Number.MAX_SAFE_INTEGER?O:null:null,O=class extends Array{constructor(e){super(e),this.fill(0)}},R=class u{heap;length;static#o=!1;static create(e){let t=G(e);if(!t)return[];u.#o=!0;let i=new u(e,t);return u.#o=!1,i}constructor(e,t){if(!u.#o)throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new t(e),this.length=0}push(e){this.heap[this.length++]=e}pop(){return this.heap[--this.length]}},U=class u{#o;#c;#S;#O;#w;#M;#I;#m;get perf(){return this.#m}ttl;ttlResolution;ttlAutopurge;updateAgeOnGet;updateAgeOnHas;allowStale;noDisposeOnSet;noUpdateTTL;maxEntrySize;sizeCalculation;noDeleteOnFetchRejection;noDeleteOnStaleGet;allowStaleOnFetchAbort;allowStaleOnFetchRejection;ignoreFetchAbort;backgroundFetchSize;#n;#b;#s;#i;#t;#l;#u;#a;#h;#y;#r;#_;#F;#d;#g;#T;#U;#f;#x;static unsafeExposeInternals(e){return{starts:e.#F,ttls:e.#d,autopurgeTimers:e.#g,sizes:e.#_,keyMap:e.#s,keyList:e.#i,valList:e.#t,next:e.#l,prev:e.#u,get head(){return e.#a},get tail(){return e.#h},free:e.#y,isBackgroundFetch:t=>e.#e(t),backgroundFetch:(t,i,s,n)=>e.#P(t,i,s,n),moveToTail:t=>e.#L(t),indexes:t=>e.#A(t),rindexes:t=>e.#z(t),isStale:t=>e.#p(t)}}get max(){return this.#o}get maxSize(){return this.#c}get calculatedSize(){return this.#b}get size(){return this.#n}get fetchMethod(){return this.#M}get memoMethod(){return this.#I}get dispose(){return this.#S}get onInsert(){return this.#O}get disposeAfter(){return this.#w}constructor(e){let{max:t=0,ttl:i,ttlResolution:s=1,ttlAutopurge:n,updateAgeOnGet:r,updateAgeOnHas:h,allowStale:a,dispose:o,onInsert:d,disposeAfter:y,noDisposeOnSet:_,noUpdateTTL:c,maxSize:g=0,maxEntrySize:f=0,sizeCalculation:b,fetchMethod:l,memoMethod:w,noDeleteOnFetchRejection:F,noDeleteOnStaleGet:m,allowStaleOnFetchRejection:p,allowStaleOnFetchAbort:A,ignoreFetchAbort:z,backgroundFetchSize:C=1,perf:E}=e;if(this.backgroundFetchSize=C,E!==void 0&&typeof E?.now!="function")throw new TypeError("perf option must have a now() method if specified");if(this.#m=E??M,t!==0&&!T(t))throw new TypeError("max option must be a nonnegative integer");let v=t?G(t):Array;if(!v)throw new Error("invalid max value: "+t);if(this.#o=t,this.#c=g,this.maxEntrySize=f||this.#c,this.sizeCalculation=b,this.sizeCalculation){if(!this.#c&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(w!==void 0&&typeof w!="function")throw new TypeError("memoMethod must be a function if defined");if(this.#I=w,l!==void 0&&typeof l!="function")throw new TypeError("fetchMethod must be a function if specified");if(this.#M=l,this.#U=!!l,this.#s=new Map,this.#i=Array.from({length:t}).fill(void 0),this.#t=Array.from({length:t}).fill(void 0),this.#l=new v(t),this.#u=new v(t),this.#a=0,this.#h=0,this.#y=R.create(t),this.#n=0,this.#b=0,typeof o=="function"&&(this.#S=o),typeof d=="function"&&(this.#O=d),typeof y=="function"?(this.#w=y,this.#r=[]):(this.#w=void 0,this.#r=void 0),this.#T=!!this.#S,this.#x=!!this.#O,this.#f=!!this.#w,this.noDisposeOnSet=!!_,this.noUpdateTTL=!!c,this.noDeleteOnFetchRejection=!!F,this.allowStaleOnFetchRejection=!!p,this.allowStaleOnFetchAbort=!!A,this.ignoreFetchAbort=!!z,this.maxEntrySize!==0){if(this.#c!==0&&!T(this.#c))throw new TypeError("maxSize must be a positive integer if specified");if(!T(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.#X()}if(this.allowStale=!!a,this.noDeleteOnStaleGet=!!m,this.updateAgeOnGet=!!r,this.updateAgeOnHas=!!h,this.ttlResolution=T(s)||s===0?s:1,this.ttlAutopurge=!!n,this.ttl=i||0,this.ttl){if(!T(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.#k()}if(this.#o===0&&this.ttl===0&&this.#c===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.#o&&!this.#c){let x="LRU_CACHE_UNBOUNDED";k(x)&&(j.add(x),P("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",x,u))}}getRemainingTTL(e){return this.#s.has(e)?1/0:0}#k(){let e=new O(this.#o),t=new O(this.#o);this.#d=e,this.#F=t;let i=this.ttlAutopurge?Array.from({length:this.#o}):void 0;this.#g=i,this.#H=(h,a,o=this.#m.now())=>{t[h]=a!==0?o:0,e[h]=a,s(h,a)},this.#D=h=>{t[h]=e[h]!==0?this.#m.now():0,s(h,e[h])};let s=this.ttlAutopurge?(h,a)=>{if(i?.[h]&&(clearTimeout(i[h]),i[h]=void 0),a&&a!==0&&i){let o=setTimeout(()=>{this.#p(h)&&this.#E(this.#i[h],"expire")},a+1);o.unref&&o.unref(),i[h]=o}}:()=>{};this.#v=(h,a)=>{if(e[a]){let o=e[a],d=t[a];if(!o||!d)return;h.ttl=o,h.start=d,h.now=n||r();let y=h.now-d;h.remainingTTL=o-y}};let n=0,r=()=>{let h=this.#m.now();if(this.ttlResolution>0){n=h;let a=setTimeout(()=>n=0,this.ttlResolution);a.unref&&a.unref()}return h};this.getRemainingTTL=h=>{let a=this.#s.get(h);if(a===void 0)return 0;let o=e[a],d=t[a];if(!o||!d)return 1/0;let y=(n||r())-d;return o-y},this.#p=h=>{let a=t[h],o=e[h];return!!o&&!!a&&(n||r())-a>o}}#D=()=>{};#v=()=>{};#H=()=>{};#p=()=>!1;#X(){let e=new O(this.#o);this.#b=0,this.#_=e,this.#R=t=>{this.#b-=e[t],e[t]=0},this.#N=(t,i,s,n)=>{if(!T(s)){if(this.#e(i))return this.backgroundFetchSize;if(n){if(typeof n!="function")throw new TypeError("sizeCalculation must be a function");if(s=n(i,t),!T(s))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.")}return s},this.#j=(t,i,s)=>{if(e[t]=i,this.#c){let n=this.#c-e[t];for(;this.#b>n;)this.#G(!0)}this.#b+=e[t],s&&(s.entrySize=i,s.totalCalculatedSize=this.#b)}}#R=e=>{};#j=(e,t,i)=>{};#N=(e,t,i,s)=>{if(i||s)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0};*#A({allowStale:e=this.allowStale}={}){if(this.#n)for(let t=this.#h;this.#V(t)&&((e||!this.#p(t))&&(yield t),t!==this.#a);)t=this.#u[t]}*#z({allowStale:e=this.allowStale}={}){if(this.#n)for(let t=this.#a;this.#V(t)&&((e||!this.#p(t))&&(yield t),t!==this.#h);)t=this.#l[t]}#V(e){return e!==void 0&&this.#s.get(this.#i[e])===e}*entries(){for(let e of this.#A())this.#t[e]!==void 0&&this.#i[e]!==void 0&&!this.#e(this.#t[e])&&(yield[this.#i[e],this.#t[e]])}*rentries(){for(let e of this.#z())this.#t[e]!==void 0&&this.#i[e]!==void 0&&!this.#e(this.#t[e])&&(yield[this.#i[e],this.#t[e]])}*keys(){for(let e of this.#A()){let t=this.#i[e];t!==void 0&&!this.#e(this.#t[e])&&(yield t)}}*rkeys(){for(let e of this.#z()){let t=this.#i[e];t!==void 0&&!this.#e(this.#t[e])&&(yield t)}}*values(){for(let e of this.#A())this.#t[e]!==void 0&&!this.#e(this.#t[e])&&(yield this.#t[e])}*rvalues(){for(let e of this.#z())this.#t[e]!==void 0&&!this.#e(this.#t[e])&&(yield this.#t[e])}[Symbol.iterator](){return this.entries()}[Symbol.toStringTag]="LRUCache";find(e,t={}){for(let i of this.#A()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;if(n!==void 0&&e(n,this.#i[i],this))return this.#C(this.#i[i],t)}}forEach(e,t=this){for(let i of this.#A()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;n!==void 0&&e.call(t,n,this.#i[i],this)}}rforEach(e,t=this){for(let i of this.#z()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;n!==void 0&&e.call(t,n,this.#i[i],this)}}purgeStale(){let e=!1;for(let t of this.#z({allowStale:!0}))this.#p(t)&&(this.#E(this.#i[t],"expire"),e=!0);return e}info(e){let t=this.#s.get(e);if(t===void 0)return;let i=this.#t[t],s=this.#e(i)?i.__staleWhileFetching:i;if(s===void 0)return;let n={value:s};if(this.#d&&this.#F){let r=this.#d[t],h=this.#F[t];if(r&&h){let a=r-(this.#m.now()-h);n.ttl=a,n.start=Date.now()}}return this.#_&&(n.size=this.#_[t]),n}dump(){let e=[];for(let t of this.#A({allowStale:!0})){let i=this.#i[t],s=this.#t[t],n=this.#e(s)?s.__staleWhileFetching:s;if(n===void 0||i===void 0)continue;let r={value:n};if(this.#d&&this.#F){r.ttl=this.#d[t];let h=this.#m.now()-this.#F[t];r.start=Math.floor(Date.now()-h)}this.#_&&(r.size=this.#_[t]),e.unshift([i,r])}return e}load(e){this.clear();for(let[t,i]of e){if(i.start){let s=Date.now()-i.start;i.start=this.#m.now()-s}this.#W(t,i.value,i)}}set(e,t,i={}){let{status:s=S.hasSubscribers?{}:void 0}=i;i.status=s,s&&(s.op="set",s.key=e,t!==void 0&&(s.value=t),s.cache=this);let n=this.#W(e,t,i);return s&&S.hasSubscribers&&S.publish(s),n}#W(e,t,i,s){let{ttl:n=this.ttl,start:r,noDisposeOnSet:h=this.noDisposeOnSet,sizeCalculation:a=this.sizeCalculation,status:o}=i,d=this.#e(t);if(t===void 0)return o&&(o.set="deleted"),this.delete(e),this;let{noUpdateTTL:y=this.noUpdateTTL}=i;o&&!d&&(o.value=t);let _=this.#N(e,t,i.size||0,a,o);if(this.maxEntrySize&&_>this.maxEntrySize)return this.#E(e,"set"),o&&(o.set="miss",o.maxEntrySizeExceeded=!0),this;let c=this.#n===0?void 0:this.#s.get(e);if(c===void 0)c=this.#n===0?this.#h:this.#y.length!==0?this.#y.pop():this.#n===this.#o?this.#G(!1):this.#n,this.#i[c]=e,this.#t[c]=t,this.#s.set(e,c),this.#l[this.#h]=c,this.#u[c]=this.#h,this.#h=c,this.#n++,this.#j(c,_,o),o&&(o.set="add"),y=!1,this.#x&&!d&&this.#O?.(t,e,"add");else{this.#L(c);let g=this.#t[c];if(t!==g){if(!h)if(this.#e(g)){g!==s&&g.__abortController.abort(new Error("replaced"));let{__staleWhileFetching:f}=g;f!==void 0&&f!==t&&(this.#T&&this.#S?.(f,e,"set"),this.#f&&this.#r?.push([f,e,"set"]))}else this.#T&&this.#S?.(g,e,"set"),this.#f&&this.#r?.push([g,e,"set"]);if(this.#R(c),this.#j(c,_,o),this.#t[c]=t,!d){let f=g&&this.#e(g)?g.__staleWhileFetching:g,b=f===void 0?"add":t!==f?"replace":"update";o&&(o.set=b,f!==void 0&&(o.oldValue=f)),this.#x&&this.onInsert?.(t,e,b)}}else d||(o&&(o.set="update"),this.#x&&this.onInsert?.(t,e,"update"))}if(n!==0&&!this.#d&&this.#k(),this.#d&&(y||this.#H(c,n,r),o&&this.#v(o,c)),!h&&this.#f&&this.#r){let g=this.#r,f;for(;f=g?.shift();)this.#w?.(...f)}return this}pop(){try{for(;this.#n;){let e=this.#t[this.#a];if(this.#G(!0),this.#e(e)){if(e.__staleWhileFetching)return e.__staleWhileFetching}else if(e!==void 0)return e}}finally{if(this.#f&&this.#r){let e=this.#r,t;for(;t=e?.shift();)this.#w?.(...t)}}}#G(e){let t=this.#a,i=this.#i[t],s=this.#t[t],n=this.#e(s);n&&s.__abortController.abort(new Error("evicted"));let r=n?s.__staleWhileFetching:s;return(this.#T||this.#f)&&r!==void 0&&(this.#T&&this.#S?.(r,i,"evict"),this.#f&&this.#r?.push([r,i,"evict"])),this.#R(t),this.#g?.[t]&&(clearTimeout(this.#g[t]),this.#g[t]=void 0),e&&(this.#i[t]=void 0,this.#t[t]=void 0,this.#y.push(t)),this.#n===1?(this.#a=this.#h=0,this.#y.length=0):this.#a=this.#l[t],this.#s.delete(i),this.#n--,t}has(e,t={}){let{status:i=S.hasSubscribers?{}:void 0}=t;t.status=i,i&&(i.op="has",i.key=e,i.cache=this);let s=this.#Y(e,t);return S.hasSubscribers&&S.publish(i),s}#Y(e,t={}){let{updateAgeOnHas:i=this.updateAgeOnHas,status:s}=t,n=this.#s.get(e);if(n!==void 0){let r=this.#t[n];if(this.#e(r)&&r.__staleWhileFetching===void 0)return!1;if(this.#p(n))s&&(s.has="stale",this.#v(s,n));else return i&&this.#D(n),s&&(s.has="hit",this.#v(s,n)),!0}else s&&(s.has="miss");return!1}peek(e,t={}){let{status:i=D()?{}:void 0}=t;i&&(i.op="peek",i.key=e,i.cache=this),t.status=i;let s=this.#J(e,t);return S.hasSubscribers&&S.publish(i),s}#J(e,t){let{status:i,allowStale:s=this.allowStale}=t,n=this.#s.get(e);if(n===void 0||!s&&this.#p(n)){i&&(i.peek=n===void 0?"miss":"stale");return}let r=this.#t[n],h=this.#e(r)?r.__staleWhileFetching:r;return i&&(h!==void 0?(i.peek="hit",i.value=h):i.peek="miss"),h}#P(e,t,i,s){let n=t===void 0?void 0:this.#t[t];if(this.#e(n))return n;let r=new AbortController,{signal:h}=i;h?.addEventListener("abort",()=>r.abort(h.reason),{signal:r.signal});let a={signal:r.signal,options:i,context:s},o=(f,b=!1)=>{let{aborted:l}=r.signal,w=i.ignoreFetchAbort&&f!==void 0,F=i.ignoreFetchAbort||!!(i.allowStaleOnFetchAbort&&f!==void 0);if(i.status&&(l&&!b?(i.status.fetchAborted=!0,i.status.fetchError=r.signal.reason,w&&(i.status.fetchAbortIgnored=!0)):i.status.fetchResolved=!0),l&&!w&&!b)return y(r.signal.reason,F);let m=c,p=this.#t[t];return(p===c||p===void 0&&w&&b)&&(f===void 0?m.__staleWhileFetching!==void 0?this.#t[t]=m.__staleWhileFetching:this.#E(e,"fetch"):(i.status&&(i.status.fetchUpdated=!0),this.#W(e,f,a.options,m))),f},d=f=>(i.status&&(i.status.fetchRejected=!0,i.status.fetchError=f),y(f,!1)),y=(f,b)=>{let{aborted:l}=r.signal,w=l&&i.allowStaleOnFetchAbort,F=w||i.allowStaleOnFetchRejection,m=F||i.noDeleteOnFetchRejection,p=c;if(this.#t[t]===c&&(!m||!b&&p.__staleWhileFetching===void 0?this.#E(e,"fetch"):w||(this.#t[t]=p.__staleWhileFetching)),F)return i.status&&p.__staleWhileFetching!==void 0&&(i.status.returnedStale=!0),p.__staleWhileFetching;if(p.__returned===p)throw f},_=(f,b)=>{let l=this.#M?.(e,n,a);r.signal.addEventListener("abort",()=>{(!i.ignoreFetchAbort||i.allowStaleOnFetchAbort)&&(f(void 0),i.allowStaleOnFetchAbort&&(f=w=>o(w,!0)))}),l&&l instanceof Promise?l.then(w=>f(w===void 0?void 0:w),b):l!==void 0&&f(l)};i.status&&(i.status.fetchDispatched=!0);let c=new Promise(_).then(o,d),g=Object.assign(c,{__abortController:r,__staleWhileFetching:n,__returned:void 0});return t===void 0?(this.#W(e,g,{...a.options,status:void 0}),t=this.#s.get(e)):this.#t[t]=g,g}#e(e){if(!this.#U)return!1;let t=e;return!!t&&t instanceof Promise&&t.hasOwnProperty("__staleWhileFetching")&&t.__abortController instanceof AbortController}fetch(e,t={}){let i=W.hasSubscribers,{status:s=D()?{}:void 0}=t;t.status=s,s&&t.context&&(s.context=t.context);let n=this.#B(e,t);return s&&i&&(s.trace=!0,W.tracePromise(()=>n,s).catch(()=>{})),n}async#B(e,t={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,ttl:r=this.ttl,noDisposeOnSet:h=this.noDisposeOnSet,size:a=0,sizeCalculation:o=this.sizeCalculation,noUpdateTTL:d=this.noUpdateTTL,noDeleteOnFetchRejection:y=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:_=this.allowStaleOnFetchRejection,ignoreFetchAbort:c=this.ignoreFetchAbort,allowStaleOnFetchAbort:g=this.allowStaleOnFetchAbort,context:f,forceRefresh:b=!1,status:l,signal:w}=t;if(l&&(l.op="fetch",l.key=e,b&&(l.forceRefresh=!0),l.cache=this),!this.#U)return l&&(l.fetch="get"),this.#C(e,{allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:n,status:l});let F={allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:n,ttl:r,noDisposeOnSet:h,size:a,sizeCalculation:o,noUpdateTTL:d,noDeleteOnFetchRejection:y,allowStaleOnFetchRejection:_,allowStaleOnFetchAbort:g,ignoreFetchAbort:c,status:l,signal:w},m=this.#s.get(e);if(m===void 0){l&&(l.fetch="miss");let p=this.#P(e,m,F,f);return p.__returned=p}else{let p=this.#t[m];if(this.#e(p)){let v=i&&p.__staleWhileFetching!==void 0;return l&&(l.fetch="inflight",v&&(l.returnedStale=!0)),v?p.__staleWhileFetching:p.__returned=p}let A=this.#p(m);if(!b&&!A)return l&&(l.fetch="hit"),this.#L(m),s&&this.#D(m),l&&this.#v(l,m),p;let z=this.#P(e,m,F,f),E=z.__staleWhileFetching!==void 0&&i;return l&&(l.fetch=A?"stale":"refresh",E&&A&&(l.returnedStale=!0)),E?z.__staleWhileFetching:z.__returned=z}}forceFetch(e,t={}){let i=W.hasSubscribers,{status:s=D()?{}:void 0}=t;t.status=s,s&&t.context&&(s.context=t.context);let n=this.#K(e,t);return s&&i&&(s.trace=!0,W.tracePromise(()=>n,s).catch(()=>{})),n}async#K(e,t={}){let i=await this.#B(e,t);if(i===void 0)throw new Error("fetch() returned undefined");return i}memo(e,t={}){let{status:i=S.hasSubscribers?{}:void 0}=t;t.status=i,i&&(i.op="memo",i.key=e,t.context&&(i.context=t.context),i.cache=this);let s=this.#Q(e,t);return i&&(i.value=s),S.hasSubscribers&&S.publish(i),s}#Q(e,t={}){let i=this.#I;if(!i)throw new Error("no memoMethod provided to constructor");let{context:s,status:n,forceRefresh:r,...h}=t;n&&r&&(n.forceRefresh=!0);let a=this.#C(e,h),o=r||a===void 0;if(n&&(n.memo=o?"miss":"hit",o||(n.value=a)),!o)return a;let d=i(e,a,{options:h,context:s});return n&&(n.value=d),this.#W(e,d,h),d}get(e,t={}){let{status:i=S.hasSubscribers?{}:void 0}=t;t.status=i,i&&(i.op="get",i.key=e,i.cache=this);let s=this.#C(e,t);return i&&(s!==void 0&&(i.value=s),S.hasSubscribers&&S.publish(i)),s}#C(e,t={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,status:r}=t,h=this.#s.get(e);if(h===void 0){r&&(r.get="miss");return}let a=this.#t[h],o=this.#e(a);return r&&this.#v(r,h),this.#p(h)?o?(r&&(r.get="stale-fetching"),i&&a.__staleWhileFetching!==void 0?(r&&(r.returnedStale=!0),a.__staleWhileFetching):void 0):(n||this.#E(e,"expire"),r&&(r.get="stale"),i?(r&&(r.returnedStale=!0),a):void 0):(r&&(r.get=o?"fetching":"hit"),this.#L(h),s&&this.#D(h),o?a.__staleWhileFetching:a)}#$(e,t){this.#u[t]=e,this.#l[e]=t}#L(e){e!==this.#h&&(e===this.#a?this.#a=this.#l[e]:this.#$(this.#u[e],this.#l[e]),this.#$(this.#h,e),this.#h=e)}delete(e){return this.#E(e,"delete")}#E(e,t){S.hasSubscribers&&S.publish({op:"delete",delete:t,key:e,cache:this});let i=!1;if(this.#n!==0){let s=this.#s.get(e);if(s!==void 0)if(this.#g?.[s]&&(clearTimeout(this.#g?.[s]),this.#g[s]=void 0),i=!0,this.#n===1)this.#q(t);else{this.#R(s);let n=this.#t[s];if(this.#e(n)?n.__abortController.abort(new Error("deleted")):(this.#T||this.#f)&&(this.#T&&this.#S?.(n,e,t),this.#f&&this.#r?.push([n,e,t])),this.#s.delete(e),this.#i[s]=void 0,this.#t[s]=void 0,s===this.#h)this.#h=this.#u[s];else if(s===this.#a)this.#a=this.#l[s];else{let r=this.#u[s];this.#l[r]=this.#l[s];let h=this.#l[s];this.#u[h]=this.#u[s]}this.#n--,this.#y.push(s)}}if(this.#f&&this.#r?.length){let s=this.#r,n;for(;n=s?.shift();)this.#w?.(...n)}return i}clear(){return this.#q("delete")}#q(e){for(let t of this.#z({allowStale:!0})){let i=this.#t[t];if(this.#e(i))i.__abortController.abort(new Error("deleted"));else{let s=this.#i[t];this.#T&&this.#S?.(i,s,e),this.#f&&this.#r?.push([i,s,e])}}if(this.#s.clear(),this.#t.fill(void 0),this.#i.fill(void 0),this.#d&&this.#F){this.#d.fill(0),this.#F.fill(0);for(let t of this.#g??[])t!==void 0&&clearTimeout(t);this.#g?.fill(void 0)}if(this.#_&&this.#_.fill(0),this.#a=0,this.#h=0,this.#y.length=0,this.#b=0,this.#n=0,this.#f&&this.#r){let t=this.#r,i;for(;i=t?.shift();)this.#w?.(...i)}}};export{U as LRUCache}; +//# sourceMappingURL=index.min.js.map diff --git a/node_modules/lru-cache/dist/esm/browser/index.min.js.map b/node_modules/lru-cache/dist/esm/browser/index.min.js.map new file mode 100644 index 00000000..4c76924e --- /dev/null +++ b/node_modules/lru-cache/dist/esm/browser/index.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagnostics-channel-browser.ts", "../../../src/perf.ts", "../../../src/index.ts"], + "sourcesContent": ["// this is used in ESM environments that follow the 'browser' import\n// condition, to avoid even trying to load node:diagnostics_channel\nimport {\n type Channel,\n type TracingChannel,\n} from 'node:diagnostics_channel'\nexport type { TracingChannel, Channel }\n\nconst dummy = { hasSubscribers: false }\nexport const metrics = dummy as Channel\nexport const tracing = dummy as TracingChannel\n", "/**\n * this provides the default Perf object source, either the\n * `performance` global, or the `Date` constructor.\n *\n * it can be passed in via configuration to override it\n * for a single LRU object.\n */\nexport type Perf = { now: () => number }\nexport const defaultPerf: Perf =\n (\n typeof performance === 'object' &&\n performance &&\n typeof performance.now === 'function'\n ) ?\n /* c8 ignore start - this gets covered, but c8 gets confused */\n performance\n : /* c8 ignore stop */ Date\n", "/**\n * @module LRUCache\n */\n\nimport { metrics, tracing } from './diagnostics-channel.js'\nimport { defaultPerf } from './perf.js'\nimport type { Perf } from './perf.js'\nexport type { Perf } from './perf.js'\n\nconst hasSubscribers = () =>\n metrics.hasSubscribers || tracing.hasSubscribers\n\nconst warned = new Set()\n\n// either a function or a class\n// oxlint-disable-next-line no-explicit-any\ntype ForC = ((...a: any[]) => any) | { new (...a: any[]): any }\n\n/* c8 ignore start */\nconst PROCESS = (\n typeof process === 'object' && !!process ?\n process\n : {}) as { [k: string]: unknown }\n/* c8 ignore stop */\n\nconst emitWarning = (\n msg: string,\n type: string,\n code: string,\n fn: ForC,\n) => {\n if (typeof PROCESS.emitWarning === 'function') {\n PROCESS.emitWarning(msg, type, code, fn)\n } else {\n //oxlint-disable-next-line no-console\n console.error(`[${code}] ${type}: ${msg}`)\n }\n}\nconst shouldWarn = (code: string) => !warned.has(code)\n\nconst TYPE = Symbol('type')\nexport type PosInt = number & { [TYPE]: 'Positive Integer' }\nexport type Index = number & { [TYPE]: 'LRUCache Index' }\n\nconst isPosInt = (n: unknown): n is PosInt =>\n !!n && n === Math.floor(n as number) && n > 0 && isFinite(n)\n\nexport type UintArray = Uint8Array | Uint16Array | Uint32Array\nexport type NumberArray = UintArray | number[]\n\n// This is a little bit ridiculous, tbh.\n// The maximum array length is 2^32-1 or thereabouts on most JS impls.\n// And well before that point, you're caching the entire world, I mean,\n// that's ~32GB of just integers for the next/prev links, plus whatever\n// else to hold that many keys and values. Just filling the memory with\n// zeroes at init time is brutal when you get that big.\n// But why not be complete?\n// Maybe in the future, these limits will have expanded.\n/* c8 ignore start */\nconst getUintArray = (max: number) =>\n !isPosInt(max) ? null\n : max <= Math.pow(2, 8) ? Uint8Array\n : max <= Math.pow(2, 16) ? Uint16Array\n : max <= Math.pow(2, 32) ? Uint32Array\n : max <= Number.MAX_SAFE_INTEGER ? ZeroArray\n : null\n/* c8 ignore stop */\n\nclass ZeroArray extends Array {\n constructor(size: number) {\n super(size)\n this.fill(0)\n }\n}\nexport type { ZeroArray }\nexport type { Stack }\n\nexport type StackLike = Stack | Index[]\nclass Stack {\n /* c8 ignore start - not sure why this is showing up uncovered?? */\n heap: NumberArray\n /* c8 ignore stop */\n length: number\n // private constructor\n static #constructing: boolean = false\n static create(max: number): StackLike {\n const HeapCls = getUintArray(max)\n if (!HeapCls) return []\n Stack.#constructing = true\n const s = new Stack(max, HeapCls)\n Stack.#constructing = false\n return s\n }\n constructor(max: number, HeapCls: { new (n: number): NumberArray }) {\n /* c8 ignore start */\n if (!Stack.#constructing) {\n throw new TypeError('instantiate Stack using Stack.create(n)')\n }\n /* c8 ignore stop */\n this.heap = new HeapCls(max)\n this.length = 0\n }\n push(n: Index) {\n this.heap[this.length++] = n\n }\n pop(): Index {\n return this.heap[--this.length] as Index\n }\n}\n\n/**\n * Promise representing an in-progress {@link LRUCache#fetch} call\n */\nexport type BackgroundFetch = Promise & {\n __returned: BackgroundFetch | undefined\n __abortController: AbortController\n __staleWhileFetching: V | undefined\n}\n\nexport type DisposeTask = [\n value: V,\n key: K,\n reason: LRUCache.DisposeReason,\n]\n\nexport namespace LRUCache {\n /**\n * An integer greater than 0, reflecting the calculated size of items\n */\n export type Size = number\n\n /**\n * Integer greater than 0, representing some number of milliseconds, or the\n * time at which a TTL started counting from.\n */\n export type Milliseconds = number\n\n /**\n * An integer greater than 0, reflecting a number of items\n */\n export type Count = number\n\n /**\n * The reason why an item was removed from the cache, passed\n * to the {@link Disposer} methods.\n *\n * - `evict`: The item was evicted because it is the least recently used,\n * and the cache is full.\n * - `set`: A new value was set, overwriting the old value being disposed.\n * - `delete`: The item was explicitly deleted, either by calling\n * {@link LRUCache#delete}, {@link LRUCache#clear}, or\n * {@link LRUCache#set} with an undefined value.\n * - `expire`: The item was removed due to exceeding its TTL.\n * - `fetch`: A {@link OptionsBase#fetchMethod} operation returned\n * `undefined` or was aborted, causing the item to be deleted.\n */\n export type DisposeReason =\n | 'evict'\n | 'set'\n | 'delete'\n | 'expire'\n | 'fetch'\n /**\n * A method called upon item removal, passed as the\n * {@link OptionsBase.dispose} and/or\n * {@link OptionsBase.disposeAfter} options.\n */\n export type Disposer = (\n value: V,\n key: K,\n reason: DisposeReason,\n ) => void\n\n /**\n * The reason why an item was added to the cache, passed\n * to the {@link Inserter} methods.\n *\n * - `add`: the item was not found in the cache, and was added\n * - `update`: the item was in the cache, with the same value provided\n * - `replace`: the item was in the cache, and replaced\n */\n export type InsertReason = 'add' | 'update' | 'replace'\n\n /**\n * A method called upon item insertion, passed as the\n * {@link OptionsBase.insert}\n */\n export type Inserter = (\n value: V,\n key: K,\n reason: InsertReason,\n ) => void\n\n /**\n * A function that returns the effective calculated size\n * of an entry in the cache.\n */\n export type SizeCalculator = (value: V, key: K) => Size\n\n /**\n * Options provided to the\n * {@link OptionsBase.fetchMethod} function.\n */\n export interface FetcherOptions {\n signal: AbortSignal\n options: FetcherFetchOptions\n /**\n * Object provided in the {@link FetchOptions.context} option to\n * {@link LRUCache#fetch}\n */\n context: FC\n }\n\n /**\n * Occasionally, it may be useful to track the internal behavior of the\n * cache, particularly for logging, debugging, or for behavior within the\n * `fetchMethod`. To do this, you can pass a `status` object to the\n * {@link LRUCache#fetch}, {@link LRUCache#get}, {@link LRUCache#set},\n * {@link LRUCache#memo}, and {@link LRUCache#has} methods.\n *\n * The `status` option should be a plain JavaScript object. The following\n * fields will be set on it appropriately, depending on the situation.\n *\n * These objects are also the context objects passed to listeners on the\n * `lru-cache:metrics` diagnostic channel, and the `lru-cache` tracing\n * channels, in platforms that support them.\n */\n export interface Status {\n /**\n * The operation being performed\n */\n op?: 'get' | 'set' | 'memo' | 'fetch' | 'delete' | 'has' | 'peek'\n /**\n * The status of a set() operation.\n *\n * - add: the item was not found in the cache, and was added\n * - update: the item was in the cache, with the same value provided\n * - replace: the item was in the cache, and replaced\n * - miss: the item was not added to the cache for some reason\n */\n set?: 'add' | 'update' | 'replace' | 'miss' | 'deleted'\n\n /**\n * The status of a delete() operation.\n */\n delete?: LRUCache.DisposeReason\n\n /**\n * The result of a peek() operation\n *\n * - hit: the item was found and returned\n * - stale: the item is in the cache, but past its ttl and not returned\n * - miss: item not in the cache\n */\n peek?: 'hit' | 'miss' | 'stale'\n\n /**\n * The status of a memo() operation.\n *\n * - 'hit': the item was found in the cache and returned\n * - 'miss': the `memoMethod` function was called\n */\n memo?: 'hit' | 'miss'\n\n /**\n * The `context` option provided to a memo or fetch operation\n *\n * In practice, of course, this will be the same type as the `FC`\n * fetch context param used to instantiate the LRUCache, but the\n * convolutions of threading that through would get quite complicated,\n * and preclude forcing/forbidding the passing of a `context` param\n * where it is/isn't expected, which is more valuable for error\n * prevention.\n */\n context?: unknown\n\n /**\n * the ttl stored for the item, or undefined if ttls are not used.\n */\n ttl?: Milliseconds\n\n /**\n * the start time for the item, or undefined if ttls are not used.\n */\n start?: Milliseconds\n\n /**\n * The timestamp used for TTL calculation\n */\n now?: Milliseconds\n\n /**\n * the remaining ttl for the item, or undefined if ttls are not used.\n */\n remainingTTL?: Milliseconds\n\n /**\n * The calculated size for the item, if sizes are used.\n */\n entrySize?: Size\n\n /**\n * The total calculated size of the cache, if sizes are used.\n */\n totalCalculatedSize?: Size\n\n /**\n * A flag indicating that the item was not stored, due to exceeding the\n * {@link OptionsBase.maxEntrySize}\n */\n maxEntrySizeExceeded?: true\n\n /**\n * The key that was set or retrieved\n */\n key?: K\n\n /**\n * The value that was set\n */\n value?: V\n\n /**\n * The old value, specified in the case of `set:'replace'`\n */\n oldValue?: V\n\n /**\n * The results of a {@link LRUCache#has} operation\n *\n * - hit: the item was found in the cache\n * - stale: the item was found in the cache, but is stale\n * - miss: the item was not found in the cache\n */\n has?: 'hit' | 'stale' | 'miss'\n\n /**\n * The status of a {@link LRUCache#fetch} operation.\n * Note that this can change as the underlying fetch() moves through\n * various states.\n *\n * - inflight: there is another fetch() for this key which is in process\n * - get: there is no {@link OptionsBase.fetchMethod}, so\n * {@link LRUCache#get} was called.\n * - miss: the item is not in cache, and will be fetched.\n * - hit: the item is in the cache, and was resolved immediately.\n * - stale: the item is in the cache, but stale.\n * - refresh: the item is in the cache, and not stale, but\n * {@link FetchOptions.forceRefresh} was specified.\n */\n fetch?: 'get' | 'inflight' | 'miss' | 'hit' | 'stale' | 'refresh'\n\n /**\n * `forceRefresh` option was used for either a fetch or memo operation\n */\n forceRefresh?: boolean\n\n /**\n * The {@link OptionsBase.fetchMethod} was called\n */\n fetchDispatched?: true\n\n /**\n * The cached value was updated after a successful call to\n * {@link OptionsBase.fetchMethod}\n */\n fetchUpdated?: true\n\n /**\n * The reason for a fetch() rejection. Either the error raised by the\n * {@link OptionsBase.fetchMethod}, or the reason for an\n * AbortSignal.\n */\n fetchError?: Error\n\n /**\n * The fetch received an abort signal\n */\n fetchAborted?: true\n\n /**\n * The abort signal received was ignored, and the fetch was allowed to\n * continue in the background.\n */\n fetchAbortIgnored?: true\n\n /**\n * The fetchMethod promise resolved successfully\n */\n fetchResolved?: true\n\n /**\n * The fetchMethod promise was rejected\n */\n fetchRejected?: true\n\n /**\n * The status of a {@link LRUCache#get} operation.\n *\n * - fetching: The item is currently being fetched. If a previous value\n * is present and allowed, that will be returned.\n * - stale: The item is in the cache, and is stale. If it was returned,\n * then the `returnedStale` flag will be set.\n * - stale-fetching: The value is being fetched in the background, but is\n * currently stale. If the stale value was returned, then the\n * `returnedStale` flag will be set.\n * - hit: the item is in the cache\n * - miss: the item is not in the cache\n */\n get?: 'stale' | 'hit' | 'miss' | 'fetching' | 'stale-fetching'\n\n /**\n * A fetch or get operation returned a stale value.\n */\n returnedStale?: true\n\n /**\n * A tracingChannel trace was started for this operation\n */\n trace?: boolean\n\n /**\n * A reference to the cache instance associated with this operation\n */\n cache?: LRUCache\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#fetch}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link OptionsBase.noDeleteOnFetchRejection},\n * {@link OptionsBase.allowStaleOnFetchRejection},\n * {@link FetchOptions.forceRefresh}, and\n * {@link FetcherOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.fetchMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the fetchMethod is called.\n */\n export interface FetcherFetchOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n status?: Status\n size?: Size\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#fetch} method.\n */\n export interface FetchOptions extends FetcherFetchOptions<\n K,\n V,\n FC\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.fetchMethod} as\n * the {@link FetcherOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n signal?: AbortSignal\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface FetchOptionsWithContext extends FetchOptions<\n K,\n V,\n FC\n > {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is\n * `undefined` or `void`\n */\n export interface FetchOptionsNoContext<\n K,\n V,\n FC extends undefined | void = undefined,\n > extends FetchOptions {\n context?: FC\n }\n\n export interface MemoOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.memoMethod} as\n * the {@link MemoizerOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface MemoOptionsWithContext extends MemoOptions<\n K,\n V,\n FC\n > {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is\n * `undefined` or `void`\n */\n export interface MemoOptionsNoContext<\n K,\n V,\n FC extends undefined | void = undefined,\n > extends MemoOptions {\n context?: FC\n }\n\n /**\n * Options provided to the\n * {@link OptionsBase.memoMethod} function.\n */\n export interface MemoizerOptions {\n options: MemoizerMemoOptions\n /**\n * Object provided in the {@link MemoOptions.context} option to\n * {@link LRUCache#memo}\n */\n context: FC\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#memo}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link MemoOptions.forceRefresh}, and\n * {@link MemoOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.memoMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the memoMethod is called.\n */\n export interface MemoizerMemoOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n > {\n status?: Status\n size?: Size\n start?: Milliseconds\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#has} method.\n */\n export interface HasOptions extends Pick<\n OptionsBase,\n 'updateAgeOnHas'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#get} method.\n */\n export interface GetOptions extends Pick<\n OptionsBase,\n 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#peek} method.\n */\n export interface PeekOptions extends Pick<\n OptionsBase,\n 'allowStale'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#set} method.\n */\n export interface SetOptions extends Pick<\n OptionsBase,\n 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'\n > {\n /**\n * If size tracking is enabled, then setting an explicit size\n * in the {@link LRUCache#set} call will prevent calling the\n * {@link OptionsBase.sizeCalculation} function.\n */\n size?: Size\n /**\n * If TTL tracking is enabled, then setting an explicit start\n * time in the {@link LRUCache#set} call will override the\n * default time from `performance.now()` or `Date.now()`.\n *\n * Note that it must be a valid value for whichever time-tracking\n * method is in use.\n */\n start?: Milliseconds\n status?: Status\n }\n\n /**\n * The type signature for the {@link OptionsBase.fetchMethod} option.\n */\n export type Fetcher = (\n key: K,\n staleValue: V | undefined,\n options: FetcherOptions,\n ) => Promise | V | undefined | void\n\n /**\n * the type signature for the {@link OptionsBase.memoMethod} option.\n */\n export type Memoizer = (\n key: K,\n staleValue: V | undefined,\n options: MemoizerOptions,\n ) => V\n\n /**\n * Options which may be passed to the {@link LRUCache} constructor.\n *\n * Most of these may be overridden in the various options that use\n * them.\n *\n * Despite all being technically optional, the constructor requires that\n * a cache is at minimum limited by one or more of {@link OptionsBase.max},\n * {@link OptionsBase.ttl}, or {@link OptionsBase.maxSize}.\n *\n * If {@link OptionsBase.ttl} is used alone, then it is strongly advised\n * (and in fact required by the type definitions here) that the cache\n * also set {@link OptionsBase.ttlAutopurge}, to prevent potentially\n * unbounded storage.\n *\n * All options are also available on the {@link LRUCache} instance, making\n * it safe to pass an LRUCache instance as the options argumemnt to\n * make another empty cache of the same type.\n *\n * Some options are marked as read-only, because changing them after\n * instantiation is not safe. Changing any of the other options will of\n * course only have an effect on subsequent method calls.\n */\n export interface OptionsBase {\n /**\n * The maximum number of items to store in the cache before evicting\n * old entries. This is read-only on the {@link LRUCache} instance,\n * and may not be overridden.\n *\n * If set, then storage space will be pre-allocated at construction\n * time, and the cache will perform significantly faster.\n *\n * Note that significantly fewer items may be stored, if\n * {@link OptionsBase.maxSize} and/or {@link OptionsBase.ttl} are also\n * set.\n *\n * **It is strongly recommended to set a `max` to prevent unbounded growth\n * of the cache.**\n */\n max?: Count\n\n /**\n * Max time in milliseconds for items to live in cache before they are\n * considered stale. Note that stale items are NOT preemptively removed by\n * default, and MAY live in the cache, contributing to its LRU max, long\n * after they have expired, unless {@link OptionsBase.ttlAutopurge} is\n * set.\n *\n * If set to `0` (the default value), then that means \"do not track\n * TTL\", not \"expire immediately\".\n *\n * Also, as this cache is optimized for LRU/MRU operations, some of\n * the staleness/TTL checks will reduce performance, as they will incur\n * overhead by deleting items.\n *\n * This is not primarily a TTL cache, and does not make strong TTL\n * guarantees. There is no pre-emptive pruning of expired items, but you\n * _may_ set a TTL on the cache, and it will treat expired items as missing\n * when they are fetched, and delete them.\n *\n * Optional, but must be a non-negative integer in ms if specified.\n *\n * This may be overridden by passing an options object to `cache.set()`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if ttl tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * If ttl tracking is enabled, and `max` and `maxSize` are not set,\n * and `ttlAutopurge` is not set, then a warning will be emitted\n * cautioning about the potential for unbounded memory consumption.\n * (The TypeScript definitions will also discourage this.)\n */\n ttl?: Milliseconds\n\n /**\n * Minimum amount of time in ms in which to check for staleness.\n * Defaults to 1, which means that the current time is checked\n * at most once per millisecond.\n *\n * Set to 0 to check the current time every time staleness is tested.\n * (This reduces performance, and is theoretically unnecessary.)\n *\n * Setting this to a higher value will improve performance somewhat\n * while using ttl tracking, albeit at the expense of keeping stale\n * items around a bit longer than their TTLs would indicate.\n *\n * @default 1\n */\n ttlResolution?: Milliseconds\n\n /**\n * Preemptively remove stale items from the cache.\n *\n * Note that this may *significantly* degrade performance, especially if\n * the cache is storing a large number of items. It is almost always best\n * to just leave the stale items in the cache, and let them fall out as new\n * items are added.\n *\n * Note that this means that {@link OptionsBase.allowStale} is a bit\n * pointless, as stale items will be deleted almost as soon as they\n * expire.\n *\n * Use with caution!\n */\n ttlAutopurge?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever it is retrieved from cache with\n * {@link LRUCache#get}, causing it to not expire. (It can still fall out\n * of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n */\n updateAgeOnGet?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever its presence in the cache is\n * checked with {@link LRUCache#has}, causing it to not expire. (It can\n * still fall out of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n */\n updateAgeOnHas?: boolean\n\n /**\n * Allow {@link LRUCache#get} and {@link LRUCache#fetch} calls to return\n * stale data, if available.\n *\n * By default, if you set `ttl`, stale items will only be deleted from the\n * cache when you `get(key)`. That is, it's not preemptively pruning items,\n * unless {@link OptionsBase.ttlAutopurge} is set.\n *\n * If you set `allowStale:true`, it'll return the stale value *as well as*\n * deleting it. If you don't set this, then it'll return `undefined` when\n * you try to get a stale entry.\n *\n * Note that when a stale entry is fetched, _even if it is returned due to\n * `allowStale` being set_, it is removed from the cache immediately. You\n * can suppress this behavior by setting\n * {@link OptionsBase.noDeleteOnStaleGet}, either in the constructor, or in\n * the options provided to {@link LRUCache#get}.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n * The `cache.has()` method will always return `false` for stale items.\n *\n * Only relevant if a ttl is set.\n */\n allowStale?: boolean\n\n /**\n * Function that is called on items when they are dropped from the\n * cache, as `dispose(value, key, reason)`.\n *\n * This can be handy if you want to close file descriptors or do\n * other cleanup tasks when items are no longer stored in the cache.\n *\n * **NOTE**: It is called _before_ the item has been fully removed\n * from the cache, so if you want to put it right back in, you need\n * to wait until the next tick. If you try to add it back in during\n * the `dispose()` function call, it will break things in subtle and\n * weird ways.\n *\n * Unlike several other options, this may _not_ be overridden by\n * passing an option to `set()`, for performance reasons.\n *\n * The `reason` will be one of the following strings, corresponding\n * to the reason for the item's deletion:\n *\n * - `evict` Item was evicted to make space for a new addition\n * - `set` Item was overwritten by a new value\n * - `expire` Item expired its TTL\n * - `fetch` Item was deleted due to a failed or aborted fetch, or a\n * fetchMethod returning `undefined.\n * - `delete` Item was removed by explicit `cache.delete(key)`,\n * `cache.clear()`, or `cache.set(key, undefined)`.\n */\n dispose?: Disposer\n\n /**\n * Function that is called when new items are inserted into the cache,\n * as `onInsert(value, key, reason)`.\n *\n * This can be useful if you need to perform actions when an item is\n * added, such as logging or tracking insertions.\n *\n * Unlike some other options, this may _not_ be overridden by passing\n * an option to `set()`, for performance and consistency reasons.\n */\n onInsert?: Inserter\n\n /**\n * The same as {@link OptionsBase.dispose}, but called *after* the entry\n * is completely removed and the cache is once again in a clean state.\n *\n * It is safe to add an item right back into the cache at this point.\n * However, note that it is *very* easy to inadvertently create infinite\n * recursion this way.\n */\n disposeAfter?: Disposer\n\n /**\n * Set to true to suppress calling the\n * {@link OptionsBase.dispose} function if the entry key is\n * still accessible within the cache.\n *\n * This may be overridden by passing an options object to\n * {@link LRUCache#set}.\n *\n * Only relevant if `dispose` or `disposeAfter` are set.\n */\n noDisposeOnSet?: boolean\n\n /**\n * Boolean flag to tell the cache to not update the TTL when setting a new\n * value for an existing key (ie, when updating a value rather than\n * inserting a new value). Note that the TTL value is _always_ set (if\n * provided) when adding a new entry into the cache.\n *\n * Has no effect if a {@link OptionsBase.ttl} is not set.\n *\n * May be passed as an option to {@link LRUCache#set}.\n */\n noUpdateTTL?: boolean\n\n /**\n * Set to a positive integer to track the sizes of items added to the\n * cache, and automatically evict items in order to stay below this size.\n * Note that this may result in fewer than `max` items being stored.\n *\n * Attempting to add an item to the cache whose calculated size is greater\n * that this amount will be a no-op. The item will not be cached, and no\n * other items will be evicted.\n *\n * Optional, must be a positive integer if provided.\n *\n * Sets `maxEntrySize` to the same value, unless a different value is\n * provided for `maxEntrySize`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if size tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * Note also that size tracking can negatively impact performance,\n * though for most cases, only minimally.\n */\n maxSize?: Size\n\n /**\n * The effective size for background fetch promises.\n *\n * This has no effect unless `maxSize` and `sizeCalculation` are used,\n * and a {@link LRUCache.OptionsBase.fetchMethod} is provided to\n * support {@link LRUCache#fetch}.\n *\n * If a stale value is present in the cache, then the effective size of\n * the background fetch is the size of the stale item it will eventually\n * replace. If not, then this value is used as its effective size.\n *\n * @default 1\n */\n backgroundFetchSize?: number\n\n /**\n * The maximum allowed size for any single item in the cache.\n *\n * If a larger item is passed to {@link LRUCache#set} or returned by a\n * {@link OptionsBase.fetchMethod} or {@link OptionsBase.memoMethod}, then\n * it will not be stored in the cache.\n *\n * Attempting to add an item whose calculated size is greater than\n * this amount will not cache the item or evict any old items, but\n * WILL delete an existing value if one is already present.\n *\n * Optional, must be a positive integer if provided. Defaults to\n * the value of `maxSize` if provided.\n */\n maxEntrySize?: Size\n\n /**\n * A function that returns a number indicating the item's size.\n *\n * Requires {@link OptionsBase.maxSize} to be set.\n *\n * If not provided, and {@link OptionsBase.maxSize} or\n * {@link OptionsBase.maxEntrySize} are set, then all\n * {@link LRUCache#set} calls **must** provide an explicit\n * {@link SetOptions.size} or sizeCalculation param.\n */\n sizeCalculation?: SizeCalculator\n\n /**\n * Method that provides the implementation for {@link LRUCache#fetch}\n *\n * ```ts\n * fetchMethod(key, staleValue, { signal, options, context })\n * ```\n *\n * If `fetchMethod` is not provided, then `cache.fetch(key)` is equivalent\n * to `Promise.resolve(cache.get(key))`.\n *\n * If at any time, `signal.aborted` is set to `true`, or if the\n * `signal.onabort` method is called, or if it emits an `'abort'` event\n * which you can listen to with `addEventListener`, then that means that\n * the fetch should be abandoned. This may be passed along to async\n * functions aware of AbortController/AbortSignal behavior.\n *\n * The `fetchMethod` should **only** return `undefined` or a Promise\n * resolving to `undefined` if the AbortController signaled an `abort`\n * event. In all other cases, it should return or resolve to a value\n * suitable for adding to the cache.\n *\n * The `options` object is a union of the options that may be provided to\n * `set()` and `get()`. If they are modified, then that will result in\n * modifying the settings to `cache.set()` when the value is resolved, and\n * in the case of\n * {@link OptionsBase.noDeleteOnFetchRejection} and\n * {@link OptionsBase.allowStaleOnFetchRejection}, the handling of\n * `fetchMethod` failures.\n *\n * For example, a DNS cache may update the TTL based on the value returned\n * from a remote DNS server by changing `options.ttl` in the `fetchMethod`.\n */\n fetchMethod?: Fetcher\n\n /**\n * Method that provides the implementation for {@link LRUCache#memo}\n */\n memoMethod?: Memoizer\n\n /**\n * Set to true to suppress the deletion of stale data when a\n * {@link OptionsBase.fetchMethod} returns a rejected promise.\n */\n noDeleteOnFetchRejection?: boolean\n\n /**\n * Do not delete stale items when they are retrieved with\n * {@link LRUCache#get}.\n *\n * Note that the `get` return value will still be `undefined`\n * unless {@link OptionsBase.allowStale} is true.\n *\n * When using time-expiring entries with `ttl`, by default stale\n * items will be removed from the cache when the key is accessed\n * with `cache.get()`.\n *\n * Setting this option will cause stale items to remain in the cache, until\n * they are explicitly deleted with `cache.delete(key)`, or retrieved with\n * `noDeleteOnStaleGet` set to `false`.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n *\n * Only relevant if a ttl is used.\n */\n noDeleteOnStaleGet?: boolean\n\n /**\n * Set to true to allow returning stale data when a\n * {@link OptionsBase.fetchMethod} throws an error or returns a rejected\n * promise.\n *\n * This differs from using {@link OptionsBase.allowStale} in that stale\n * data will ONLY be returned in the case that the {@link LRUCache#fetch}\n * fails, not any other times.\n *\n * If a `fetchMethod` fails, and there is no stale value available, the\n * `fetch()` will resolve to `undefined`. Ie, all `fetchMethod` errors are\n * suppressed.\n *\n * Implies `noDeleteOnFetchRejection`.\n *\n * This may be set in calls to `fetch()`, or defaulted on the constructor,\n * or overridden by modifying the options object in the `fetchMethod`.\n */\n allowStaleOnFetchRejection?: boolean\n\n /**\n * Set to true to return a stale value from the cache when the\n * `AbortSignal` passed to the {@link OptionsBase.fetchMethod} dispatches\n * an `'abort'` event, whether user-triggered, or due to internal cache\n * behavior.\n *\n * Unless {@link OptionsBase.ignoreFetchAbort} is also set, the underlying\n * {@link OptionsBase.fetchMethod} will still be considered canceled, and\n * any value it returns will be ignored and not cached.\n *\n * Caveat: since fetches are aborted when a new value is explicitly\n * set in the cache, this can lead to fetch returning a stale value,\n * since that was the fallback value _at the moment the `fetch()` was\n * initiated_, even though the new updated value is now present in\n * the cache.\n *\n * For example:\n *\n * ```ts\n * const cache = new LRUCache({\n * ttl: 100,\n * fetchMethod: async (url, oldValue, { signal }) => {\n * const res = await fetch(url, { signal })\n * return await res.json()\n * }\n * })\n * cache.set('https://example.com/', { some: 'data' })\n * // 100ms go by...\n * const result = cache.fetch('https://example.com/')\n * cache.set('https://example.com/', { other: 'thing' })\n * console.log(await result) // { some: 'data' }\n * console.log(cache.get('https://example.com/')) // { other: 'thing' }\n * ```\n */\n allowStaleOnFetchAbort?: boolean\n\n /**\n * Set to true to ignore the `abort` event emitted by the `AbortSignal`\n * object passed to {@link OptionsBase.fetchMethod}, and still cache the\n * resulting resolution value, as long as it is not `undefined`.\n *\n * When used on its own, this means aborted {@link LRUCache#fetch} calls\n * are not immediately resolved or rejected when they are aborted, and\n * instead take the full time to await.\n *\n * When used with {@link OptionsBase.allowStaleOnFetchAbort}, aborted\n * {@link LRUCache#fetch} calls will resolve immediately to their stale\n * cached value or `undefined`, and will continue to process and eventually\n * update the cache when they resolve, as long as the resulting value is\n * not `undefined`, thus supporting a \"return stale on timeout while\n * refreshing\" mechanism by passing `AbortSignal.timeout(n)` as the signal.\n *\n * For example:\n *\n * ```ts\n * const c = new LRUCache({\n * ttl: 100,\n * ignoreFetchAbort: true,\n * allowStaleOnFetchAbort: true,\n * fetchMethod: async (key, oldValue, { signal }) => {\n * // note: do NOT pass the signal to fetch()!\n * // let's say this fetch can take a long time.\n * const res = await fetch(`https://slow-backend-server/${key}`)\n * return await res.json()\n * },\n * })\n *\n * // this will return the stale value after 100ms, while still\n * // updating in the background for next time.\n * const val = await c.fetch('key', { signal: AbortSignal.timeout(100) })\n * ```\n *\n * **Note**: regardless of this setting, an `abort` event _is still\n * emitted on the `AbortSignal` object_, so may result in invalid results\n * when passed to other underlying APIs that use AbortSignals.\n *\n * This may be overridden in the {@link OptionsBase.fetchMethod} or the\n * call to {@link LRUCache#fetch}.\n */\n ignoreFetchAbort?: boolean\n\n /**\n * In some cases, you may want to swap out the performance/Date object\n * used for TTL tracking. This should almost certainly NOT be done in\n * production environments!\n *\n * This value defaults to `global.performance` if it has a `now()` method,\n * or the `global.Date` object otherwise.\n */\n perf?: Perf\n }\n\n export interface OptionsMaxLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n max: Count\n }\n export interface OptionsTTLLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n ttl: Milliseconds\n ttlAutopurge: boolean\n }\n export interface OptionsSizeLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n maxSize: Size\n }\n\n /**\n * The valid safe options for the {@link LRUCache} constructor\n */\n export type Options =\n | OptionsMaxLimit\n | OptionsSizeLimit\n | OptionsTTLLimit\n\n /**\n * Entry objects used by {@link LRUCache#load} and {@link LRUCache#dump},\n * and returned by {@link LRUCache#info}.\n */\n export interface Entry {\n value: V\n ttl?: Milliseconds\n size?: Size\n start?: Milliseconds\n }\n}\n\n/**\n * Default export, the thing you're using this module to get.\n *\n * The `K` and `V` types define the key and value types, respectively. The\n * optional `FC` type defines the type of the `context` object passed to\n * `cache.fetch()` and `cache.memo()`.\n *\n * Keys and values **must not** be `null` or `undefined`.\n *\n * All properties from the options object (with the exception of `max`,\n * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are\n * added as normal public members. (The listed options are read-only getters.)\n *\n * Changing any of these will alter the defaults for subsequent method calls.\n */\nexport class LRUCache {\n // options that cannot be changed without disaster\n readonly #max: LRUCache.Count\n readonly #maxSize: LRUCache.Size\n readonly #dispose?: LRUCache.Disposer\n readonly #onInsert?: LRUCache.Inserter\n readonly #disposeAfter?: LRUCache.Disposer\n readonly #fetchMethod?: LRUCache.Fetcher\n readonly #memoMethod?: LRUCache.Memoizer\n readonly #perf: Perf\n\n /**\n * {@link LRUCache.OptionsBase.perf}\n */\n get perf() {\n return this.#perf\n }\n\n /**\n * {@link LRUCache.OptionsBase.ttl}\n */\n ttl: LRUCache.Milliseconds\n\n /**\n * {@link LRUCache.OptionsBase.ttlResolution}\n */\n ttlResolution: LRUCache.Milliseconds\n /**\n * {@link LRUCache.OptionsBase.ttlAutopurge}\n */\n ttlAutopurge: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnGet}\n */\n updateAgeOnGet: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnHas}\n */\n updateAgeOnHas: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStale}\n */\n allowStale: boolean\n\n /**\n * {@link LRUCache.OptionsBase.noDisposeOnSet}\n */\n noDisposeOnSet: boolean\n /**\n * {@link LRUCache.OptionsBase.noUpdateTTL}\n */\n noUpdateTTL: boolean\n /**\n * {@link LRUCache.OptionsBase.maxEntrySize}\n */\n maxEntrySize: LRUCache.Size\n /**\n * {@link LRUCache.OptionsBase.sizeCalculation}\n */\n sizeCalculation?: LRUCache.SizeCalculator\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection}\n */\n noDeleteOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnStaleGet}\n */\n noDeleteOnStaleGet: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}\n */\n allowStaleOnFetchAbort: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection}\n */\n allowStaleOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.ignoreFetchAbort}\n */\n ignoreFetchAbort: boolean\n\n /** {@link LRUCache.OptionsBase.backgroundFetchSize} */\n backgroundFetchSize: number\n\n // computed properties\n #size: LRUCache.Count\n #calculatedSize: LRUCache.Size\n #keyMap: Map\n #keyList: (K | undefined)[]\n #valList: (V | BackgroundFetch | undefined)[]\n #next: NumberArray\n #prev: NumberArray\n #head: Index\n #tail: Index\n #free: StackLike\n #disposed?: DisposeTask[]\n #sizes?: ZeroArray\n #starts?: ZeroArray\n #ttls?: ZeroArray\n #autopurgeTimers?: (undefined | ReturnType)[]\n\n #hasDispose: boolean\n #hasFetchMethod: boolean\n #hasDisposeAfter: boolean\n #hasOnInsert: boolean\n\n /**\n * Do not call this method unless you need to inspect the\n * inner workings of the cache. If anything returned by this\n * object is modified in any way, strange breakage may occur.\n *\n * These fields are private for a reason!\n *\n * @internal\n */\n static unsafeExposeInternals<\n K extends {},\n V extends {},\n FC extends unknown = unknown,\n >(c: LRUCache) {\n return {\n // properties\n starts: c.#starts,\n ttls: c.#ttls,\n autopurgeTimers: c.#autopurgeTimers,\n sizes: c.#sizes,\n keyMap: c.#keyMap as Map,\n keyList: c.#keyList,\n valList: c.#valList,\n next: c.#next,\n prev: c.#prev,\n get head() {\n return c.#head\n },\n get tail() {\n return c.#tail\n },\n free: c.#free,\n // methods\n isBackgroundFetch: (p: unknown) => c.#isBackgroundFetch(p),\n backgroundFetch: (\n k: K,\n index: number | undefined,\n options: LRUCache.FetchOptions,\n context: unknown,\n ): BackgroundFetch =>\n c.#backgroundFetch(\n k,\n index as Index | undefined,\n options,\n context as FC,\n ),\n moveToTail: (index: number): void => c.#moveToTail(index as Index),\n indexes: (options?: { allowStale: boolean }) => c.#indexes(options),\n rindexes: (options?: { allowStale: boolean }) =>\n c.#rindexes(options),\n isStale: (index: number | undefined) => c.#isStale(index as Index),\n }\n }\n\n // Protected read-only members\n\n /**\n * {@link LRUCache.OptionsBase.max} (read-only)\n */\n get max(): LRUCache.Count {\n return this.#max\n }\n /**\n * {@link LRUCache.OptionsBase.maxSize} (read-only)\n */\n get maxSize(): LRUCache.Count {\n return this.#maxSize\n }\n /**\n * The total computed size of items in the cache (read-only)\n */\n get calculatedSize(): LRUCache.Size {\n return this.#calculatedSize\n }\n /**\n * The number of items stored in the cache (read-only)\n */\n get size(): LRUCache.Count {\n return this.#size\n }\n /**\n * {@link LRUCache.OptionsBase.fetchMethod} (read-only)\n */\n get fetchMethod(): LRUCache.Fetcher | undefined {\n return this.#fetchMethod\n }\n get memoMethod(): LRUCache.Memoizer | undefined {\n return this.#memoMethod\n }\n /**\n * {@link LRUCache.OptionsBase.dispose} (read-only)\n */\n get dispose() {\n return this.#dispose\n }\n /**\n * {@link LRUCache.OptionsBase.onInsert} (read-only)\n */\n get onInsert() {\n return this.#onInsert\n }\n /**\n * {@link LRUCache.OptionsBase.disposeAfter} (read-only)\n */\n get disposeAfter() {\n return this.#disposeAfter\n }\n\n constructor(options: LRUCache.Options | LRUCache) {\n const {\n max = 0,\n ttl,\n ttlResolution = 1,\n ttlAutopurge,\n updateAgeOnGet,\n updateAgeOnHas,\n allowStale,\n dispose,\n onInsert,\n disposeAfter,\n noDisposeOnSet,\n noUpdateTTL,\n maxSize = 0,\n maxEntrySize = 0,\n sizeCalculation,\n fetchMethod,\n memoMethod,\n noDeleteOnFetchRejection,\n noDeleteOnStaleGet,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n backgroundFetchSize = 1,\n perf,\n } = options\n\n this.backgroundFetchSize = backgroundFetchSize\n\n if (perf !== undefined) {\n if (typeof perf?.now !== 'function') {\n throw new TypeError(\n 'perf option must have a now() method if specified',\n )\n }\n }\n\n this.#perf = perf ?? defaultPerf\n\n if (max !== 0 && !isPosInt(max)) {\n throw new TypeError('max option must be a nonnegative integer')\n }\n\n const UintArray = max ? getUintArray(max) : Array\n if (!UintArray) {\n throw new Error('invalid max value: ' + max)\n }\n\n this.#max = max\n this.#maxSize = maxSize\n this.maxEntrySize = maxEntrySize || this.#maxSize\n this.sizeCalculation = sizeCalculation\n if (this.sizeCalculation) {\n if (!this.#maxSize && !this.maxEntrySize) {\n throw new TypeError(\n 'cannot set sizeCalculation without setting maxSize or maxEntrySize',\n )\n }\n if (typeof this.sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation set to non-function')\n }\n }\n\n if (memoMethod !== undefined && typeof memoMethod !== 'function') {\n throw new TypeError('memoMethod must be a function if defined')\n }\n this.#memoMethod = memoMethod\n\n if (fetchMethod !== undefined && typeof fetchMethod !== 'function') {\n throw new TypeError('fetchMethod must be a function if specified')\n }\n this.#fetchMethod = fetchMethod\n this.#hasFetchMethod = !!fetchMethod\n\n this.#keyMap = new Map()\n this.#keyList = Array.from({ length: max }).fill(undefined) as (\n | K\n | undefined\n )[]\n this.#valList = Array.from({ length: max }).fill(undefined) as (\n | V\n | undefined\n )[]\n this.#next = new UintArray(max)\n this.#prev = new UintArray(max)\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free = Stack.create(max)\n this.#size = 0\n this.#calculatedSize = 0\n\n if (typeof dispose === 'function') {\n this.#dispose = dispose\n }\n if (typeof onInsert === 'function') {\n this.#onInsert = onInsert\n }\n if (typeof disposeAfter === 'function') {\n this.#disposeAfter = disposeAfter\n this.#disposed = []\n } else {\n this.#disposeAfter = undefined\n this.#disposed = undefined\n }\n this.#hasDispose = !!this.#dispose\n this.#hasOnInsert = !!this.#onInsert\n this.#hasDisposeAfter = !!this.#disposeAfter\n\n this.noDisposeOnSet = !!noDisposeOnSet\n this.noUpdateTTL = !!noUpdateTTL\n this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection\n this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection\n this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort\n this.ignoreFetchAbort = !!ignoreFetchAbort\n\n // NB: maxEntrySize is set to maxSize if it's set\n if (this.maxEntrySize !== 0) {\n if (this.#maxSize !== 0) {\n if (!isPosInt(this.#maxSize)) {\n throw new TypeError(\n 'maxSize must be a positive integer if specified',\n )\n }\n }\n if (!isPosInt(this.maxEntrySize)) {\n throw new TypeError(\n 'maxEntrySize must be a positive integer if specified',\n )\n }\n this.#initializeSizeTracking()\n }\n\n this.allowStale = !!allowStale\n this.noDeleteOnStaleGet = !!noDeleteOnStaleGet\n this.updateAgeOnGet = !!updateAgeOnGet\n this.updateAgeOnHas = !!updateAgeOnHas\n this.ttlResolution =\n isPosInt(ttlResolution) || ttlResolution === 0 ? ttlResolution : 1\n this.ttlAutopurge = !!ttlAutopurge\n this.ttl = ttl || 0\n if (this.ttl) {\n if (!isPosInt(this.ttl)) {\n throw new TypeError('ttl must be a positive integer if specified')\n }\n this.#initializeTTLTracking()\n }\n\n // do not allow completely unbounded caches\n if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) {\n throw new TypeError(\n 'At least one of max, maxSize, or ttl is required',\n )\n }\n if (!this.ttlAutopurge && !this.#max && !this.#maxSize) {\n const code = 'LRU_CACHE_UNBOUNDED'\n if (shouldWarn(code)) {\n warned.add(code)\n const msg =\n 'TTL caching without ttlAutopurge, max, or maxSize can ' +\n 'result in unbounded memory consumption.'\n emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache)\n }\n }\n }\n\n /**\n * Return the number of ms left in the item's TTL. If item is not in cache,\n * returns `0`. Returns `Infinity` if item is in cache without a defined TTL.\n */\n getRemainingTTL(key: K) {\n return this.#keyMap.has(key) ? Infinity : 0\n }\n\n #initializeTTLTracking() {\n const ttls = new ZeroArray(this.#max)\n const starts = new ZeroArray(this.#max)\n this.#ttls = ttls\n this.#starts = starts\n const purgeTimers =\n this.ttlAutopurge ?\n Array.from>({\n length: this.#max,\n })\n : undefined\n this.#autopurgeTimers = purgeTimers\n\n this.#setItemTTL = (index, ttl, start = this.#perf.now()) => {\n starts[index] = ttl !== 0 ? start : 0\n ttls[index] = ttl\n setPurgetTimer(index, ttl)\n }\n\n this.#updateItemAge = index => {\n starts[index] = ttls[index] !== 0 ? this.#perf.now() : 0\n setPurgetTimer(index, ttls[index])\n }\n\n // clear out the purge timer if we're setting TTL to 0, and\n // previously had a ttl purge timer running, so it doesn't\n // fire unnecessarily. Don't need to do this if we're not doing\n // autopurge.\n const setPurgetTimer =\n !this.ttlAutopurge ?\n () => {}\n : (index: Index, ttl?: number) => {\n if (purgeTimers?.[index]) {\n clearTimeout(purgeTimers[index])\n purgeTimers[index] = undefined\n }\n if (ttl && ttl !== 0 && purgeTimers) {\n const t = setTimeout(() => {\n if (this.#isStale(index)) {\n this.#delete(this.#keyList[index] as K, 'expire')\n }\n }, ttl + 1)\n // unref() not supported on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n purgeTimers[index] = t\n }\n }\n\n this.#statusTTL = (status, index) => {\n if (ttls[index]) {\n const ttl = ttls[index]\n const start = starts[index]\n /* c8 ignore start */\n if (!ttl || !start) {\n return\n }\n /* c8 ignore stop */\n status.ttl = ttl\n status.start = start\n status.now = cachedNow || getNow()\n const age = status.now - start\n status.remainingTTL = ttl - age\n }\n }\n\n // debounce calls to perf.now() to 1s so we're not hitting\n // that costly call repeatedly.\n let cachedNow = 0\n const getNow = () => {\n const n = this.#perf.now()\n if (this.ttlResolution > 0) {\n cachedNow = n\n const t = setTimeout(() => (cachedNow = 0), this.ttlResolution)\n // not available on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n }\n return n\n }\n\n this.getRemainingTTL = key => {\n const index = this.#keyMap.get(key)\n if (index === undefined) {\n return 0\n }\n const ttl = ttls[index]\n const start = starts[index]\n if (!ttl || !start) {\n return Infinity\n }\n const age = (cachedNow || getNow()) - start\n return ttl - age\n }\n\n this.#isStale = index => {\n const s = starts[index]\n const t = ttls[index]\n return !!t && !!s && (cachedNow || getNow()) - s > t\n }\n }\n\n // conditionally set private methods related to TTL\n #updateItemAge: (index: Index) => void = () => {}\n #statusTTL: (status: LRUCache.Status, index: Index) => void =\n () => {}\n #setItemTTL: (\n index: Index,\n ttl: LRUCache.Milliseconds,\n start?: LRUCache.Milliseconds,\n // ignore because we never call this if we're not already in TTL mode\n /* c8 ignore start */\n ) => void = () => {}\n /* c8 ignore stop */\n\n #isStale: (index: Index) => boolean = () => false\n\n #initializeSizeTracking() {\n const sizes = new ZeroArray(this.#max)\n this.#calculatedSize = 0\n this.#sizes = sizes\n this.#removeItemSize = index => {\n this.#calculatedSize -= sizes[index] as number\n sizes[index] = 0\n }\n this.#requireSize = (k, v, size, sizeCalculation) => {\n if (!isPosInt(size)) {\n // provisionally accept background fetches.\n // actual value size will be checked when they return.\n if (this.#isBackgroundFetch(v)) {\n // NB: this cannot occur if v.__staleWhileFetching is set,\n // because in that case, it would take on the size of the\n // existing entry that it temporarily replaces.\n return this.backgroundFetchSize\n }\n if (sizeCalculation) {\n if (typeof sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation must be a function')\n }\n size = sizeCalculation(v, k)\n if (!isPosInt(size)) {\n throw new TypeError(\n 'sizeCalculation return invalid (expect positive integer)',\n )\n }\n } else {\n throw new TypeError(\n 'invalid size value (must be positive integer). ' +\n 'When maxSize or maxEntrySize is used, sizeCalculation ' +\n 'or size must be set.',\n )\n }\n }\n return size\n }\n\n this.#addItemSize = (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status,\n ) => {\n sizes[index] = size\n if (this.#maxSize) {\n const maxSize = this.#maxSize - sizes[index]\n while (this.#calculatedSize > maxSize) {\n this.#evict(true)\n }\n }\n this.#calculatedSize += sizes[index]\n if (status) {\n status.entrySize = size\n status.totalCalculatedSize = this.#calculatedSize\n }\n }\n }\n\n #removeItemSize: (index: Index) => void = _i => {}\n\n #addItemSize: (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status,\n ) => void = (_i, _s, _st) => {}\n\n #requireSize: (\n k: K,\n v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator,\n status?: LRUCache.Status,\n ) => LRUCache.Size = (\n _k: K,\n _v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator,\n ) => {\n if (size || sizeCalculation) {\n throw new TypeError(\n 'cannot set size without setting maxSize or maxEntrySize on cache',\n )\n }\n return 0\n };\n\n *#indexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#tail; this.#isValidIndex(i); ) {\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#head) {\n break\n } else {\n i = this.#prev[i] as Index\n }\n }\n }\n }\n\n *#rindexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#head; this.#isValidIndex(i); ) {\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#tail) {\n break\n } else {\n i = this.#next[i] as Index\n }\n }\n }\n }\n\n #isValidIndex(index: Index) {\n return (\n index !== undefined &&\n this.#keyMap.get(this.#keyList[index] as K) === index\n )\n }\n\n /**\n * Return a generator yielding `[key, value]` pairs,\n * in order from most recently used to least recently used.\n */\n *entries() {\n for (const i of this.#indexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]] as [K, V]\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.entries}\n *\n * Return a generator yielding `[key, value]` pairs,\n * in order from least recently used to most recently used.\n */\n *rentries() {\n for (const i of this.#rindexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]]\n }\n }\n }\n\n /**\n * Return a generator yielding the keys in the cache,\n * in order from most recently used to least recently used.\n */\n *keys() {\n for (const i of this.#indexes()) {\n const k = this.#keyList[i]\n if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield k\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.keys}\n *\n * Return a generator yielding the keys in the cache,\n * in order from least recently used to most recently used.\n */\n *rkeys() {\n for (const i of this.#rindexes()) {\n const k = this.#keyList[i]\n if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield k\n }\n }\n }\n\n /**\n * Return a generator yielding the values in the cache,\n * in order from most recently used to least recently used.\n */\n *values() {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i] as V\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.values}\n *\n * Return a generator yielding the values in the cache,\n * in order from least recently used to most recently used.\n */\n *rvalues() {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i]\n }\n }\n }\n\n /**\n * Iterating over the cache itself yields the same results as\n * {@link LRUCache.entries}\n */\n [Symbol.iterator]() {\n return this.entries()\n }\n\n /**\n * A String value that is used in the creation of the default string\n * description of an object. Called by the built-in method\n * `Object.prototype.toString`.\n */\n [Symbol.toStringTag] = 'LRUCache'\n\n /**\n * Find a value for which the supplied fn method returns a truthy value,\n * similar to `Array.find()`. fn is called as `fn(value, key, cache)`.\n */\n find(\n fn: (v: V, k: K, self: LRUCache) => boolean,\n getOptions: LRUCache.GetOptions = {},\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n if (fn(value, this.#keyList[i] as K, this)) {\n return this.#get(this.#keyList[i] as K, getOptions)\n }\n }\n }\n\n /**\n * Call the supplied function on each item in the cache, in order from most\n * recently used to least recently used.\n *\n * `fn` is called as `fn(value, key, cache)`.\n *\n * If `thisp` is provided, function will be called in the `this`-context of\n * the provided object, or the cache if no `thisp` object is provided.\n *\n * Does not update age or recenty of use, or iterate over stale values.\n */\n forEach(\n fn: (v: V, k: K, self: LRUCache) => unknown,\n thisp: unknown = this,\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * The same as {@link LRUCache.forEach} but items are iterated over in\n * reverse order. (ie, less recently used items are iterated over first.)\n */\n rforEach(\n fn: (v: V, k: K, self: LRUCache) => unknown,\n thisp: unknown = this,\n ) {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * Delete any stale entries. Returns true if anything was removed,\n * false otherwise.\n */\n purgeStale() {\n let deleted = false\n for (const i of this.#rindexes({ allowStale: true })) {\n if (this.#isStale(i)) {\n this.#delete(this.#keyList[i] as K, 'expire')\n deleted = true\n }\n }\n return deleted\n }\n\n /**\n * Get the extended info about a given entry, to get its value, size, and\n * TTL info simultaneously. Returns `undefined` if the key is not present.\n *\n * Unlike {@link LRUCache#dump}, which is designed to be portable and survive\n * serialization, the `start` value is always the current timestamp, and the\n * `ttl` is a calculated remaining time to live (negative if expired).\n *\n * Always returns stale values, if their info is found in the cache, so be\n * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl})\n * if relevant.\n */\n info(key: K): LRUCache.Entry | undefined {\n const i = this.#keyMap.get(key)\n if (i === undefined) return undefined\n const v = this.#valList[i]\n /* c8 ignore start - this isn't tested for the info function,\n * but it's the same logic as found in other places. */\n const value: V | undefined =\n this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) return undefined\n /* c8 ignore stop */\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n const ttl = this.#ttls[i]\n const start = this.#starts[i]\n if (ttl && start) {\n const remain = ttl - (this.#perf.now() - start)\n entry.ttl = remain\n entry.start = Date.now()\n }\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n return entry\n }\n\n /**\n * Return an array of [key, {@link LRUCache.Entry}] tuples which can be\n * passed to {@link LRUCache#load}.\n *\n * The `start` fields are calculated relative to a portable `Date.now()`\n * timestamp, even if `performance.now()` is available.\n *\n * Stale entries are always included in the `dump`, even if\n * {@link LRUCache.OptionsBase.allowStale} is false.\n *\n * Note: this returns an actual array, not a generator, so it can be more\n * easily passed around.\n */\n dump() {\n const arr: [K, LRUCache.Entry][] = []\n for (const i of this.#indexes({ allowStale: true })) {\n const key = this.#keyList[i]\n const v = this.#valList[i]\n const value: V | undefined =\n this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined || key === undefined) continue\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n entry.ttl = this.#ttls[i]\n // always dump the start relative to a portable timestamp\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = this.#perf.now() - (this.#starts[i] as number)\n entry.start = Math.floor(Date.now() - age)\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n arr.unshift([key, entry])\n }\n return arr\n }\n\n /**\n * Reset the cache and load in the items in entries in the order listed.\n *\n * The shape of the resulting cache may be different if the same options are\n * not used in both caches.\n *\n * The `start` fields are assumed to be calculated relative to a portable\n * `Date.now()` timestamp, even if `performance.now()` is available.\n */\n load(arr: [K, LRUCache.Entry][]) {\n this.clear()\n for (const [key, entry] of arr) {\n if (entry.start) {\n // entry.start is a portable timestamp, but we may be using\n // node's performance.now(), so calculate the offset, so that\n // we get the intended remaining TTL, no matter how long it's\n // been on ice.\n //\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = Date.now() - entry.start\n entry.start = this.#perf.now() - age\n }\n this.#set(key, entry.value, entry)\n }\n }\n\n /**\n * Add a value to the cache.\n *\n * Note: if `undefined` is specified as a value, this is an alias for\n * {@link LRUCache#delete}\n *\n * Fields on the {@link LRUCache.SetOptions} options param will override\n * their corresponding values in the constructor options for the scope\n * of this single `set()` operation.\n *\n * If `start` is provided, then that will set the effective start\n * time for the TTL calculation. Note that this must be a previous\n * value of `performance.now()` if supported, or a previous value of\n * `Date.now()` if not.\n *\n * Options object may also include `size`, which will prevent\n * calling the `sizeCalculation` function and just use the specified\n * number if it is a positive integer, and `noDisposeOnSet` which\n * will prevent calling a `dispose` function in the case of\n * overwrites.\n *\n * If the `size` (or return value of `sizeCalculation`) for a given\n * entry is greater than `maxEntrySize`, then the item will not be\n * added to the cache.\n *\n * Will update the recency of the entry.\n *\n * If the value is `undefined`, then this is an alias for\n * `cache.delete(key)`. `undefined` is never stored in the cache.\n */\n set(\n k: K,\n v: V | undefined,\n setOptions: LRUCache.SetOptions = {},\n ) {\n const { status = metrics.hasSubscribers ? {} : undefined } = setOptions\n setOptions.status = status\n if (status) {\n status.op = 'set'\n status.key = k\n if (v !== undefined) status.value = v\n status.cache = this\n }\n const result = this.#set(k, v, setOptions)\n if (status && metrics.hasSubscribers) {\n metrics.publish(status)\n }\n return result\n }\n\n #set(\n k: K,\n v: V | BackgroundFetch | undefined,\n setOptions: LRUCache.SetOptions,\n bf?: BackgroundFetch,\n ) {\n const {\n ttl = this.ttl,\n start,\n noDisposeOnSet = this.noDisposeOnSet,\n sizeCalculation = this.sizeCalculation,\n status,\n } = setOptions\n\n const isBF = this.#isBackgroundFetch(v)\n if (v === undefined) {\n if (status) status.set = 'deleted'\n this.delete(k)\n return this\n }\n let { noUpdateTTL = this.noUpdateTTL } = setOptions\n\n if (status && !isBF) status.value = v\n\n const size = this.#requireSize(\n k,\n v,\n setOptions.size || 0,\n sizeCalculation,\n status,\n )\n // if the item doesn't fit, don't do anything\n // NB: maxEntrySize set to maxSize by default\n if (this.maxEntrySize && size > this.maxEntrySize) {\n // have to delete, in case something is there already.\n this.#delete(k, 'set')\n if (status) {\n status.set = 'miss'\n status.maxEntrySizeExceeded = true\n }\n return this\n }\n let index = this.#size === 0 ? undefined : this.#keyMap.get(k)\n if (index === undefined) {\n // addition\n index = (\n this.#size === 0 ? this.#tail\n : this.#free.length !== 0 ? this.#free.pop()\n : this.#size === this.#max ? this.#evict(false)\n : this.#size) as Index\n this.#keyList[index] = k\n this.#valList[index] = v\n this.#keyMap.set(k, index)\n this.#next[this.#tail] = index\n this.#prev[index] = this.#tail\n this.#tail = index\n this.#size++\n this.#addItemSize(index, size, status)\n if (status) status.set = 'add'\n noUpdateTTL = false\n if (this.#hasOnInsert && !isBF) {\n this.#onInsert?.(v, k, 'add')\n }\n } else {\n // update\n // might be updating a background fetch!\n this.#moveToTail(index)\n const oldVal = this.#valList[index]!\n if (v !== oldVal) {\n if (!noDisposeOnSet) {\n if (this.#isBackgroundFetch(oldVal)) {\n if (oldVal !== bf) {\n // setting over a background fetch, not merely resolving it.\n oldVal.__abortController.abort(new Error('replaced'))\n }\n const { __staleWhileFetching: s } = oldVal\n if (s !== undefined && s !== v) {\n if (this.#hasDispose) {\n this.#dispose?.(s, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([s, k, 'set'])\n }\n }\n } else {\n if (this.#hasDispose) {\n this.#dispose?.(oldVal, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldVal, k, 'set'])\n }\n }\n }\n this.#removeItemSize(index)\n this.#addItemSize(index, size, status)\n this.#valList[index] = v\n if (!isBF) {\n const oldValue =\n oldVal && this.#isBackgroundFetch(oldVal) ?\n oldVal.__staleWhileFetching\n : oldVal\n const setType =\n oldValue === undefined ? 'add'\n : v !== oldValue ? 'replace'\n : 'update'\n if (status) {\n status.set = setType\n if (oldValue !== undefined) status.oldValue = oldValue\n }\n if (this.#hasOnInsert) {\n this.onInsert?.(v, k, setType)\n }\n }\n } else if (!isBF) {\n if (status) {\n status.set = 'update'\n }\n if (this.#hasOnInsert) {\n this.onInsert?.(v, k, 'update')\n }\n }\n }\n if (ttl !== 0 && !this.#ttls) {\n this.#initializeTTLTracking()\n }\n if (this.#ttls) {\n if (!noUpdateTTL) {\n this.#setItemTTL(index, ttl, start)\n }\n if (status) this.#statusTTL(status, index)\n }\n if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return this\n }\n\n /**\n * Evict the least recently used item, returning its value or\n * `undefined` if cache is empty.\n */\n pop(): V | undefined {\n try {\n while (this.#size) {\n const val = this.#valList[this.#head]\n this.#evict(true)\n if (this.#isBackgroundFetch(val)) {\n if (val.__staleWhileFetching) {\n return val.__staleWhileFetching\n }\n } else if (val !== undefined) {\n return val\n }\n }\n } finally {\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n }\n\n #evict(free: boolean) {\n const head = this.#head\n const k = this.#keyList[head]!\n const v = this.#valList[head]!\n const isBF = this.#isBackgroundFetch(v)\n if (isBF) {\n v.__abortController.abort(new Error('evicted'))\n }\n const oldValue = isBF ? v.__staleWhileFetching : v\n if (\n (this.#hasDispose || this.#hasDisposeAfter) &&\n oldValue !== undefined\n ) {\n if (this.#hasDispose) {\n this.#dispose?.(oldValue, k, 'evict')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldValue, k, 'evict'])\n }\n }\n this.#removeItemSize(head)\n if (this.#autopurgeTimers?.[head]) {\n clearTimeout(this.#autopurgeTimers[head])\n this.#autopurgeTimers[head] = undefined\n }\n // if we aren't about to use the index, then null these out\n if (free) {\n this.#keyList[head] = undefined\n this.#valList[head] = undefined\n this.#free.push(head)\n }\n if (this.#size === 1) {\n this.#head = this.#tail = 0 as Index\n this.#free.length = 0\n } else {\n this.#head = this.#next[head] as Index\n }\n this.#keyMap.delete(k)\n this.#size--\n return head\n }\n\n /**\n * Check if a key is in the cache, without updating the recency of use.\n * Will return false if the item is stale, even though it is technically\n * in the cache.\n *\n * Check if a key is in the cache, without updating the recency of\n * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set\n * to `true` in either the options or the constructor.\n *\n * Will return `false` if the item is stale, even though it is technically in\n * the cache. The difference can be determined (if it matters) by using a\n * `status` argument, and inspecting the `has` field.\n *\n * Will not update item age unless\n * {@link LRUCache.OptionsBase.updateAgeOnHas} is set.\n */\n has(k: K, hasOptions: LRUCache.HasOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } = hasOptions\n hasOptions.status = status\n if (status) {\n status.op = 'has'\n status.key = k\n status.cache = this\n }\n const result = this.#has(k, hasOptions)\n if (metrics.hasSubscribers) metrics.publish(status)\n return result\n }\n #has(k: K, hasOptions: LRUCache.HasOptions = {}) {\n const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n const v = this.#valList[index]\n if (\n this.#isBackgroundFetch(v) &&\n v.__staleWhileFetching === undefined\n ) {\n return false\n }\n if (!this.#isStale(index)) {\n if (updateAgeOnHas) {\n this.#updateItemAge(index)\n }\n if (status) {\n status.has = 'hit'\n this.#statusTTL(status, index)\n }\n return true\n } else if (status) {\n status.has = 'stale'\n this.#statusTTL(status, index)\n }\n } else if (status) {\n status.has = 'miss'\n }\n return false\n }\n\n /**\n * Like {@link LRUCache#get} but doesn't update recency or delete stale\n * items.\n *\n * Returns `undefined` if the item is stale, unless\n * {@link LRUCache.OptionsBase.allowStale} is set.\n */\n peek(k: K, peekOptions: LRUCache.PeekOptions = {}) {\n const { status = hasSubscribers() ? {} : undefined } = peekOptions\n if (status) {\n status.op = 'peek'\n status.key = k\n status.cache = this\n }\n peekOptions.status = status\n const result = this.#peek(k, peekOptions)\n if (metrics.hasSubscribers) {\n metrics.publish(status)\n }\n return result\n }\n #peek(k: K, peekOptions: LRUCache.PeekOptions) {\n const { status, allowStale = this.allowStale } = peekOptions\n const index = this.#keyMap.get(k)\n if (index === undefined || (!allowStale && this.#isStale(index))) {\n if (status) status.peek = index === undefined ? 'miss' : 'stale'\n return undefined\n }\n const v = this.#valList[index]\n const val = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (status) {\n if (val !== undefined) {\n status.peek = 'hit'\n status.value = val\n } else {\n status.peek = 'miss'\n }\n }\n return val\n }\n\n #backgroundFetch(\n k: K,\n index: Index | undefined,\n options: LRUCache.FetchOptions,\n context: FC,\n ): BackgroundFetch {\n const v = index === undefined ? undefined : this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n return v\n }\n\n const ac = new AbortController()\n const { signal } = options\n // when/if our AC signals, then stop listening to theirs.\n signal?.addEventListener('abort', () => ac.abort(signal.reason), {\n signal: ac.signal,\n })\n\n const fetchOpts = {\n signal: ac.signal,\n options,\n context,\n }\n\n const cb = (v: V | undefined, updateCache = false): V | undefined => {\n const { aborted } = ac.signal\n const ignoreAbort = options.ignoreFetchAbort && v !== undefined\n const proceed =\n options.ignoreFetchAbort ||\n !!(options.allowStaleOnFetchAbort && v !== undefined)\n if (options.status) {\n if (aborted && !updateCache) {\n options.status.fetchAborted = true\n options.status.fetchError = ac.signal.reason\n if (ignoreAbort) options.status.fetchAbortIgnored = true\n } else {\n options.status.fetchResolved = true\n }\n }\n if (aborted && !ignoreAbort && !updateCache) {\n return fetchFail(ac.signal.reason, proceed)\n }\n // either we didn't abort, and are still here, or we did, and ignored\n const bf = p as BackgroundFetch\n // if nothing else has been written there but we're set to update the\n // cache and ignore the abort, or if it's still pending on this specific\n // background request, then write it to the cache.\n const vl = this.#valList[index as Index]\n if (vl === p || (vl === undefined && ignoreAbort && updateCache)) {\n if (v === undefined) {\n if (bf.__staleWhileFetching !== undefined) {\n this.#valList[index as Index] = bf.__staleWhileFetching\n } else {\n this.#delete(k, 'fetch')\n }\n } else {\n if (options.status) options.status.fetchUpdated = true\n this.#set(k, v, fetchOpts.options, bf)\n }\n }\n return v\n }\n\n const eb = (er: unknown) => {\n if (options.status) {\n options.status.fetchRejected = true\n options.status.fetchError = er as Error\n }\n // do not pass go, do not collect $200\n return fetchFail(er, false)\n }\n\n const fetchFail = (er: unknown, proceed: boolean): V | undefined => {\n const { aborted } = ac.signal\n const allowStaleAborted = aborted && options.allowStaleOnFetchAbort\n const allowStale =\n allowStaleAborted || options.allowStaleOnFetchRejection\n const noDelete = allowStale || options.noDeleteOnFetchRejection\n const bf = p as BackgroundFetch\n if (this.#valList[index as Index] === p) {\n // if we allow stale on fetch rejections, then we need to ensure that\n // the stale value is not removed from the cache when the fetch fails.\n const del =\n !noDelete || (!proceed && bf.__staleWhileFetching === undefined)\n if (del) {\n this.#delete(k, 'fetch')\n } else if (!allowStaleAborted) {\n // still replace the *promise* with the stale value,\n // since we are done with the promise at this point.\n // leave it untouched if we're still waiting for an\n // aborted background fetch that hasn't yet returned.\n this.#valList[index as Index] = bf.__staleWhileFetching\n }\n }\n if (allowStale) {\n if (options.status && bf.__staleWhileFetching !== undefined) {\n options.status.returnedStale = true\n }\n return bf.__staleWhileFetching\n } else if (bf.__returned === bf) {\n throw er\n }\n }\n\n const pcall = (\n res: (v: V | undefined) => void,\n rej: (e: unknown) => void,\n ) => {\n const fmp = this.#fetchMethod?.(k, v, fetchOpts)\n // ignored, we go until we finish, regardless.\n // defer check until we are actually aborting,\n // so fetchMethod can override.\n ac.signal.addEventListener('abort', () => {\n if (!options.ignoreFetchAbort || options.allowStaleOnFetchAbort) {\n res(undefined)\n // when it eventually resolves, update the cache.\n if (options.allowStaleOnFetchAbort) {\n res = v => cb(v, true)\n }\n }\n })\n if (fmp && fmp instanceof Promise) {\n fmp.then(v => res(v === undefined ? undefined : v), rej)\n } else if (fmp !== undefined) {\n res(fmp)\n }\n }\n\n if (options.status) options.status.fetchDispatched = true\n const p = new Promise(pcall).then(cb, eb)\n const bf: BackgroundFetch = Object.assign(p, {\n __abortController: ac,\n __staleWhileFetching: v,\n __returned: undefined,\n })\n\n if (index === undefined) {\n // internal, don't expose status.\n this.#set(k, bf, { ...fetchOpts.options, status: undefined })\n index = this.#keyMap.get(k)\n } else {\n // do not call #set, because we do not want to adjust its place\n // in the lru queue, as it has not yet been \"used\". Also, we don't\n // need to worry about evicting for size, because a background fetch\n // over a stale value is treated as the same size as its stale value.\n this.#valList[index] = bf\n }\n return bf\n }\n\n #isBackgroundFetch(p: unknown): p is BackgroundFetch {\n if (!this.#hasFetchMethod) return false\n const b = p as BackgroundFetch\n return (\n !!b &&\n b instanceof Promise &&\n b.hasOwnProperty('__staleWhileFetching') &&\n b.__abortController instanceof AbortController\n )\n }\n\n /**\n * Make an asynchronous cached fetch using the\n * {@link LRUCache.OptionsBase.fetchMethod} function.\n *\n * If the value is in the cache and not stale, then the returned\n * Promise resolves to the value.\n *\n * If not in the cache, or beyond its TTL staleness, then\n * `fetchMethod(key, staleValue, { options, signal, context })` is\n * called, and the value returned will be added to the cache once\n * resolved.\n *\n * If called with `allowStale`, and an asynchronous fetch is\n * currently in progress to reload a stale value, then the former\n * stale value will be returned.\n *\n * If called with `forceRefresh`, then the cached item will be\n * re-fetched, even if it is not stale. However, if `allowStale` is also\n * set, then the old value will still be returned. This is useful\n * in cases where you want to force a reload of a cached value. If\n * a background fetch is already in progress, then `forceRefresh`\n * has no effect.\n *\n * If multiple fetches for the same key are issued, then they will all be\n * coalesced into a single call to fetchMethod.\n *\n * Note that this means that handling options such as\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort},\n * {@link LRUCache.FetchOptions.signal},\n * and {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} will be\n * determined by the FIRST fetch() call for a given key.\n *\n * This is a known (fixable) shortcoming which will be addresed on when\n * someone complains about it, as the fix would involve added complexity and\n * may not be worth the costs for this edge case.\n *\n * If {@link LRUCache.OptionsBase.fetchMethod} is not specified, then this is\n * effectively an alias for `Promise.resolve(cache.get(key))`.\n *\n * When the fetch method resolves to a value, if the fetch has not\n * been aborted due to deletion, eviction, or being overwritten,\n * then it is added to the cache using the options provided.\n *\n * If the key is evicted or deleted before the `fetchMethod`\n * resolves, then the AbortSignal passed to the `fetchMethod` will\n * receive an `abort` event, and the promise returned by `fetch()`\n * will reject with the reason for the abort.\n *\n * If a `signal` is passed to the `fetch()` call, then aborting the\n * signal will abort the fetch and cause the `fetch()` promise to\n * reject with the reason provided.\n *\n * **Setting `context`**\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the {@link LRUCache} constructor, then all\n * calls to `cache.fetch()` _must_ provide a `context` option. If\n * set to `undefined` or `void`, then calls to fetch _must not_\n * provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that\n * might be relevant in the course of fetching the data. It is only\n * relevant for the course of a single `fetch()` operation, and\n * discarded afterwards.\n *\n * **Note: `fetch()` calls are inflight-unique**\n *\n * If you call `fetch()` multiple times with the same key value,\n * then every call after the first will resolve on the same\n * promise1,\n * _even if they have different settings that would otherwise change\n * the behavior of the fetch_, such as `noDeleteOnFetchRejection`\n * or `ignoreFetchAbort`.\n *\n * In most cases, this is not a problem (in fact, only fetching\n * something once is what you probably want, if you're caching in\n * the first place). If you are changing the fetch() options\n * dramatically between runs, there's a good chance that you might\n * be trying to fit divergent semantics into a single object, and\n * would be better off with multiple cache instances.\n *\n * **1**: Ie, they're not the \"same Promise\", but they resolve at\n * the same time, because they're both waiting on the same\n * underlying fetchMethod response.\n */\n\n fetch(\n k: K,\n fetchOptions: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext,\n ): Promise\n\n // this overload not allowed if context is required\n fetch(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n fetchOptions?: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : never,\n ): Promise\n fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const ths = tracing.hasSubscribers\n const { status = hasSubscribers() ? {} : undefined } = fetchOptions\n fetchOptions.status = status\n if (status && fetchOptions.context) {\n status.context = fetchOptions.context\n }\n const p = this.#fetch(k, fetchOptions)\n if (status && ths) {\n status.trace = true\n tracing.tracePromise(() => p, status).catch(() => {})\n }\n return p\n }\n\n async #fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const {\n // get options\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n // set options\n ttl = this.ttl,\n noDisposeOnSet = this.noDisposeOnSet,\n size = 0,\n sizeCalculation = this.sizeCalculation,\n noUpdateTTL = this.noUpdateTTL,\n // fetch exclusive options\n noDeleteOnFetchRejection = this.noDeleteOnFetchRejection,\n allowStaleOnFetchRejection = this.allowStaleOnFetchRejection,\n ignoreFetchAbort = this.ignoreFetchAbort,\n allowStaleOnFetchAbort = this.allowStaleOnFetchAbort,\n context,\n forceRefresh = false,\n status,\n signal,\n } = fetchOptions\n if (status) {\n status.op = 'fetch'\n status.key = k\n if (forceRefresh) status.forceRefresh = true\n status.cache = this\n }\n\n if (!this.#hasFetchMethod) {\n if (status) status.fetch = 'get'\n return this.#get(k, {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n status,\n })\n }\n\n const options = {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n ttl,\n noDisposeOnSet,\n size,\n sizeCalculation,\n noUpdateTTL,\n noDeleteOnFetchRejection,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n status,\n signal,\n }\n\n let index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.fetch = 'miss'\n const p = this.#backgroundFetch(k, index, options, context as FC)\n return (p.__returned = p)\n } else {\n // in cache, maybe already fetching\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n const stale = allowStale && v.__staleWhileFetching !== undefined\n if (status) {\n status.fetch = 'inflight'\n if (stale) status.returnedStale = true\n }\n return stale ? v.__staleWhileFetching : (v.__returned = v)\n }\n\n // if we force a refresh, that means do NOT serve the cached value,\n // unless we are already in the process of refreshing the cache.\n const isStale = this.#isStale(index)\n if (!forceRefresh && !isStale) {\n if (status) status.fetch = 'hit'\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n if (status) this.#statusTTL(status, index)\n return v\n }\n\n // ok, it is stale or a forced refresh, and not already fetching.\n // refresh the cache.\n const p = this.#backgroundFetch(k, index, options, context as FC)\n const hasStale = p.__staleWhileFetching !== undefined\n const staleVal = hasStale && allowStale\n if (status) {\n status.fetch = isStale ? 'stale' : 'refresh'\n if (staleVal && isStale) status.returnedStale = true\n }\n return staleVal ? p.__staleWhileFetching : (p.__returned = p)\n }\n }\n\n /**\n * In some cases, `cache.fetch()` may resolve to `undefined`, either because\n * a {@link LRUCache.OptionsBase#fetchMethod} was not provided (turning\n * `cache.fetch(k)` into just an async wrapper around `cache.get(k)`) or\n * because `ignoreFetchAbort` was specified (either to the constructor or\n * in the {@link LRUCache.FetchOptions}). Also, the\n * {@link LRUCache.OptionsBase.fetchMethod} may return `undefined` or `void`, making\n * the test even more complicated.\n *\n * Because inferring the cases where `undefined` might be returned are so\n * cumbersome, but testing for `undefined` can also be annoying, this method\n * can be used, which will reject if `this.fetch()` resolves to undefined.\n */\n forceFetch(\n k: K,\n fetchOptions: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext,\n ): Promise\n // this overload not allowed if context is required\n forceFetch(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n fetchOptions?: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : never,\n ): Promise\n forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const ths = tracing.hasSubscribers\n const { status = hasSubscribers() ? {} : undefined } = fetchOptions\n fetchOptions.status = status\n if (status && fetchOptions.context) {\n status.context = fetchOptions.context\n }\n const p = this.#forceFetch(k, fetchOptions)\n if (status && ths) {\n status.trace = true\n tracing.tracePromise(() => p, status).catch(() => {})\n }\n return p\n }\n\n async #forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ) {\n const v = await this.#fetch(k, fetchOptions)\n if (v === undefined) throw new Error('fetch() returned undefined')\n return v\n }\n\n /**\n * If the key is found in the cache, then this is equivalent to\n * {@link LRUCache#get}. If not, in the cache, then calculate the value using\n * the {@link LRUCache.OptionsBase.memoMethod}, and add it to the cache.\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the LRUCache constructor, then all calls to `cache.memo()`\n * _must_ provide a `context` option. If set to `undefined` or `void`, then\n * calls to memo _must not_ provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that might be\n * relevant in the course of fetching the data. It is only relevant for the\n * course of a single `memo()` operation, and discarded afterwards.\n */\n memo(\n k: K,\n memoOptions: unknown extends FC ? LRUCache.MemoOptions\n : FC extends undefined | void ? LRUCache.MemoOptionsNoContext\n : LRUCache.MemoOptionsWithContext,\n ): V\n // this overload not allowed if context is required\n memo(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n memoOptions?: unknown extends FC ? LRUCache.MemoOptions\n : FC extends undefined | void ? LRUCache.MemoOptionsNoContext\n : never,\n ): V\n memo(k: K, memoOptions: LRUCache.MemoOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } =\n memoOptions\n memoOptions.status = status\n if (status) {\n status.op = 'memo'\n status.key = k\n if (memoOptions.context) {\n status.context = memoOptions.context\n }\n status.cache = this\n }\n const result = this.#memo(k, memoOptions)\n if (status) status.value = result\n if (metrics.hasSubscribers) metrics.publish(status)\n return result\n }\n #memo(k: K, memoOptions: LRUCache.MemoOptions = {}) {\n const memoMethod = this.#memoMethod\n if (!memoMethod) {\n throw new Error('no memoMethod provided to constructor')\n }\n const { context, status, forceRefresh, ...options } = memoOptions\n if (status && forceRefresh) status.forceRefresh = true\n const v = this.#get(k, options)\n const refresh = forceRefresh || v === undefined\n if (status) {\n status.memo = refresh ? 'miss' : 'hit'\n if (!refresh) status.value = v\n }\n if (!refresh) return v\n const vv = memoMethod(k, v, {\n options,\n context,\n } as LRUCache.MemoizerOptions)\n if (status) status.value = vv\n this.#set(k, vv, options)\n return vv\n }\n\n /**\n * Return a value from the cache. Will update the recency of the cache\n * entry found.\n *\n * If the key is not found, get() will return `undefined`.\n */\n get(k: K, getOptions: LRUCache.GetOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } = getOptions\n getOptions.status = status\n if (status) {\n status.op = 'get'\n status.key = k\n status.cache = this\n }\n const result = this.#get(k, getOptions)\n if (status) {\n if (result !== undefined) status.value = result\n if (metrics.hasSubscribers) metrics.publish(status)\n }\n return result\n }\n\n #get(k: K, getOptions: LRUCache.GetOptions = {}) {\n const {\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n status,\n } = getOptions\n const index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.get = 'miss'\n return undefined\n }\n const value = this.#valList[index]\n const fetching = this.#isBackgroundFetch(value)\n if (status) this.#statusTTL(status, index)\n if (this.#isStale(index)) {\n // delete only if not an in-flight background fetch\n if (!fetching) {\n if (!noDeleteOnStaleGet) {\n this.#delete(k, 'expire')\n }\n if (status) status.get = 'stale'\n if (allowStale) {\n if (status) status.returnedStale = true\n return value\n }\n return undefined\n }\n if (status) status.get = 'stale-fetching'\n if (allowStale && value.__staleWhileFetching !== undefined) {\n if (status) status.returnedStale = true\n return value.__staleWhileFetching\n }\n return undefined\n }\n // not stale\n if (status) status.get = fetching ? 'fetching' : 'hit'\n // if we're currently fetching it, we don't actually have it yet\n // it's not stale, which means this isn't a staleWhileRefetching.\n // If it's not stale, and fetching, AND has a __staleWhileFetching\n // value, then that means the user fetched with {forceRefresh:true},\n // so it's safe to return that value.\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n return fetching ? value.__staleWhileFetching : value\n }\n\n #connect(p: Index, n: Index) {\n this.#prev[n] = p\n this.#next[p] = n\n }\n\n #moveToTail(index: Index): void {\n // if tail already, nothing to do\n // if head, move head to next[index]\n // else\n // move next[prev[index]] to next[index] (head has no prev)\n // move prev[next[index]] to prev[index]\n // prev[index] = tail\n // next[tail] = index\n // tail = index\n if (index !== this.#tail) {\n if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n this.#connect(\n this.#prev[index] as Index,\n this.#next[index] as Index,\n )\n }\n this.#connect(this.#tail, index)\n this.#tail = index\n }\n }\n\n /**\n * Deletes a key out of the cache.\n *\n * Returns true if the key was deleted, false otherwise.\n */\n delete(k: K) {\n return this.#delete(k, 'delete')\n }\n\n #delete(k: K, reason: LRUCache.DisposeReason) {\n if (metrics.hasSubscribers) {\n metrics.publish({\n op: 'delete',\n delete: reason,\n key: k,\n cache: this,\n })\n }\n let deleted = false\n if (this.#size !== 0) {\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n if (this.#autopurgeTimers?.[index]) {\n clearTimeout(this.#autopurgeTimers?.[index])\n this.#autopurgeTimers[index] = undefined\n }\n deleted = true\n if (this.#size === 1) {\n this.#clear(reason)\n } else {\n this.#removeItemSize(index)\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k, reason])\n }\n }\n this.#keyMap.delete(k)\n this.#keyList[index] = undefined\n this.#valList[index] = undefined\n if (index === this.#tail) {\n this.#tail = this.#prev[index] as Index\n } else if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n const pi = this.#prev[index] as number\n this.#next[pi] = this.#next[index] as number\n const ni = this.#next[index] as number\n this.#prev[ni] = this.#prev[index] as number\n }\n this.#size--\n this.#free.push(index)\n }\n }\n }\n if (this.#hasDisposeAfter && this.#disposed?.length) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return deleted\n }\n\n /**\n * Clear the cache entirely, throwing away all values.\n */\n clear() {\n return this.#clear('delete')\n }\n #clear(reason: LRUCache.DisposeReason) {\n for (const index of this.#rindexes({ allowStale: true })) {\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else {\n const k = this.#keyList[index]\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k as K, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k as K, reason])\n }\n }\n }\n\n this.#keyMap.clear()\n void this.#valList.fill(undefined)\n this.#keyList.fill(undefined)\n if (this.#ttls && this.#starts) {\n this.#ttls.fill(0)\n this.#starts.fill(0)\n for (const t of this.#autopurgeTimers ?? []) {\n if (t !== undefined) clearTimeout(t)\n }\n this.#autopurgeTimers?.fill(undefined)\n }\n if (this.#sizes) {\n this.#sizes.fill(0)\n }\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free.length = 0\n this.#calculatedSize = 0\n this.#size = 0\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n}\n"], + "mappings": "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", + "names": ["dummy", "metrics", "tracing", "defaultPerf", "hasSubscribers", "metrics", "tracing", "warned", "PROCESS", "emitWarning", "msg", "type", "code", "fn", "shouldWarn", "isPosInt", "n", "getUintArray", "max", "ZeroArray", "size", "Stack", "_Stack", "#constructing", "HeapCls", "s", "LRUCache", "_LRUCache", "#max", "#maxSize", "#dispose", "#onInsert", "#disposeAfter", "#fetchMethod", "#memoMethod", "#perf", "#size", "#calculatedSize", "#keyMap", "#keyList", "#valList", "#next", "#prev", "#head", "#tail", "#free", "#disposed", "#sizes", "#starts", "#ttls", "#autopurgeTimers", "#hasDispose", "#hasFetchMethod", "#hasDisposeAfter", "#hasOnInsert", "c", "p", "#isBackgroundFetch", "k", "index", "options", "context", "#backgroundFetch", "#moveToTail", "#indexes", "#rindexes", "#isStale", "ttl", "ttlResolution", "ttlAutopurge", "updateAgeOnGet", "updateAgeOnHas", "allowStale", "dispose", "onInsert", "disposeAfter", "noDisposeOnSet", "noUpdateTTL", "maxSize", "maxEntrySize", "sizeCalculation", "fetchMethod", "memoMethod", "noDeleteOnFetchRejection", "noDeleteOnStaleGet", "allowStaleOnFetchRejection", "allowStaleOnFetchAbort", "ignoreFetchAbort", "backgroundFetchSize", "perf", "defaultPerf", "UintArray", "#initializeSizeTracking", "#initializeTTLTracking", "code", "shouldWarn", "warned", "emitWarning", "key", "ttls", "starts", "purgeTimers", "#setItemTTL", "start", "setPurgetTimer", "#updateItemAge", "t", "#delete", "#statusTTL", "status", "cachedNow", "getNow", "age", "sizes", "#removeItemSize", "#requireSize", "v", "#addItemSize", "#evict", "_i", "_s", "_st", "_k", "_v", "i", "#isValidIndex", "fn", "getOptions", "value", "#get", "thisp", "deleted", "entry", "remain", "arr", "#set", "setOptions", "metrics", "result", "bf", "isBF", "oldVal", "oldValue", "setType", "dt", "task", "val", "free", "head", "hasOptions", "#has", "peekOptions", "hasSubscribers", "#peek", "ac", "signal", "fetchOpts", "cb", "updateCache", "aborted", "ignoreAbort", "proceed", "fetchFail", "vl", "eb", "er", "allowStaleAborted", "noDelete", "pcall", "res", "rej", "fmp", "b", "fetchOptions", "ths", "tracing", "#fetch", "forceRefresh", "stale", "isStale", "staleVal", "#forceFetch", "memoOptions", "#memo", "refresh", "vv", "fetching", "#connect", "reason", "#clear", "pi", "ni"] +} diff --git a/node_modules/lru-cache/dist/esm/browser/perf.d.ts b/node_modules/lru-cache/dist/esm/browser/perf.d.ts new file mode 100644 index 00000000..15a4a627 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/browser/perf.d.ts @@ -0,0 +1,12 @@ +/** + * this provides the default Perf object source, either the + * `performance` global, or the `Date` constructor. + * + * it can be passed in via configuration to override it + * for a single LRU object. + */ +export type Perf = { + now: () => number; +}; +export declare const defaultPerf: Perf; +//# sourceMappingURL=perf.d.ts.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/browser/perf.d.ts.map b/node_modules/lru-cache/dist/esm/browser/perf.d.ts.map new file mode 100644 index 00000000..3e239ce9 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/browser/perf.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"perf.d.ts","sourceRoot":"","sources":["../../../src/perf.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,IAAI,GAAG;IAAE,GAAG,EAAE,MAAM,MAAM,CAAA;CAAE,CAAA;AACxC,eAAO,MAAM,WAAW,EAAE,IAQG,CAAA"} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/browser/perf.js b/node_modules/lru-cache/dist/esm/browser/perf.js new file mode 100644 index 00000000..f21cd88c --- /dev/null +++ b/node_modules/lru-cache/dist/esm/browser/perf.js @@ -0,0 +1,7 @@ +export const defaultPerf = (typeof performance === 'object' && + performance && + typeof performance.now === 'function') ? + /* c8 ignore start - this gets covered, but c8 gets confused */ + performance + : /* c8 ignore stop */ Date; +//# sourceMappingURL=perf.js.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/browser/perf.js.map b/node_modules/lru-cache/dist/esm/browser/perf.js.map new file mode 100644 index 00000000..5dc82212 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/browser/perf.js.map @@ -0,0 +1 @@ +{"version":3,"file":"perf.js","sourceRoot":"","sources":["../../../src/perf.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,WAAW,GACtB,CACE,OAAO,WAAW,KAAK,QAAQ;IAC/B,WAAW;IACX,OAAO,WAAW,CAAC,GAAG,KAAK,UAAU,CACtC,CAAC,CAAC;IACD,+DAA+D;IAC/D,WAAW;IACb,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAA","sourcesContent":["/**\n * this provides the default Perf object source, either the\n * `performance` global, or the `Date` constructor.\n *\n * it can be passed in via configuration to override it\n * for a single LRU object.\n */\nexport type Perf = { now: () => number }\nexport const defaultPerf: Perf =\n (\n typeof performance === 'object' &&\n performance &&\n typeof performance.now === 'function'\n ) ?\n /* c8 ignore start - this gets covered, but c8 gets confused */\n performance\n : /* c8 ignore stop */ Date\n"]} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/diagnostics-channel-esm.d.mts.map b/node_modules/lru-cache/dist/esm/diagnostics-channel-esm.d.mts.map new file mode 100644 index 00000000..180a381b --- /dev/null +++ b/node_modules/lru-cache/dist/esm/diagnostics-channel-esm.d.mts.map @@ -0,0 +1 @@ +{"version":3,"file":"diagnostics-channel-esm.d.mts","sourceRoot":"","sources":["../../src/diagnostics-channel-esm.mts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,cAAc,EACpB,MAAM,0BAA0B,CAAA;AACjC,YAAY,EAAE,cAAc,EAAE,OAAO,EAAE,CAAA;AAavC,eAAO,IAAI,OAAO,EAAY,OAAO,CAAC,OAAO,CAAC,CAAA;AAC9C,eAAO,IAAI,OAAO,EAAY,cAAc,CAAC,OAAO,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/diagnostics-channel-esm.mjs.map b/node_modules/lru-cache/dist/esm/diagnostics-channel-esm.mjs.map new file mode 100644 index 00000000..97b4b3fd --- /dev/null +++ b/node_modules/lru-cache/dist/esm/diagnostics-channel-esm.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"diagnostics-channel-esm.mjs","sourceRoot":"","sources":["../../src/diagnostics-channel-esm.mts"],"names":[],"mappings":"AAUA;;;;;GAKG;AAEH,uEAAuE;AACvE,4EAA4E;AAC5E,oBAAoB;AACpB,MAAM,KAAK,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,CAAA;AACvC,MAAM,CAAC,IAAI,OAAO,GAAG,KAAyB,CAAA;AAC9C,MAAM,CAAC,IAAI,OAAO,GAAG,KAAgC,CAAA;AACrD,MAAM,CAAC,0BAA0B,CAAC;KAC/B,IAAI,CAAC,EAAE,CAAC,EAAE;IACT,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAA;IACzC,OAAO,GAAG,EAAE,CAAC,cAAc,CAAC,WAAW,CAAC,CAAA;AAC1C,CAAC,CAAC;KACD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA","sourcesContent":["// This is used in ESM environments that do NOT follow the 'node' or 'browser'\n// import conditions. So, `node:diagnostics_channel` MAY be present.\n// Note that this is overridden in 'browser' conditional branch, because the\n// dynamic import can confound bundlers and cause CSP violations in browsers.\nimport {\n type Channel,\n type TracingChannel,\n} from 'node:diagnostics_channel'\nexport type { TracingChannel, Channel }\n\n/**\n * no-op polyfills for non-node environments. tries to load the actual\n * diagnostics_channel module on platforms that support it, but fails\n * gracefully if not found. This means that the first tick of metrics\n * and tracing will be missed, but that probably doesn't matter much.\n */\n\n// conditionally import from diagnostic_channel, fall back to dummyfill\n// all we actually have to mock is the hasSubscribers, since we always check\n/* v8 ignore next */\nconst dummy = { hasSubscribers: false }\nexport let metrics = dummy as Channel\nexport let tracing = dummy as TracingChannel\nimport('node:diagnostics_channel')\n .then(dc => {\n metrics = dc.channel('lru-cache:metrics')\n tracing = dc.tracingChannel('lru-cache')\n })\n .catch(() => {})\n"]} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/diagnostics-channel.d.ts b/node_modules/lru-cache/dist/esm/diagnostics-channel.d.ts new file mode 100644 index 00000000..1580158b --- /dev/null +++ b/node_modules/lru-cache/dist/esm/diagnostics-channel.d.ts @@ -0,0 +1,5 @@ +import { type Channel, type TracingChannel } from 'node:diagnostics_channel'; +export type { TracingChannel, Channel }; +export declare let metrics: Channel; +export declare let tracing: TracingChannel; +//# sourceMappingURL=diagnostics-channel-esm.d.mts.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/diagnostics-channel.js b/node_modules/lru-cache/dist/esm/diagnostics-channel.js new file mode 100644 index 00000000..76d86f81 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/diagnostics-channel.js @@ -0,0 +1,19 @@ +/** + * no-op polyfills for non-node environments. tries to load the actual + * diagnostics_channel module on platforms that support it, but fails + * gracefully if not found. This means that the first tick of metrics + * and tracing will be missed, but that probably doesn't matter much. + */ +// conditionally import from diagnostic_channel, fall back to dummyfill +// all we actually have to mock is the hasSubscribers, since we always check +/* v8 ignore next */ +const dummy = { hasSubscribers: false }; +export let metrics = dummy; +export let tracing = dummy; +import('node:diagnostics_channel') + .then(dc => { + metrics = dc.channel('lru-cache:metrics'); + tracing = dc.tracingChannel('lru-cache'); +}) + .catch(() => { }); +//# sourceMappingURL=diagnostics-channel-esm.mjs.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/index.d.ts b/node_modules/lru-cache/dist/esm/index.d.ts new file mode 100644 index 00000000..b0e4b964 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/index.d.ts @@ -0,0 +1,1400 @@ +/** + * @module LRUCache + */ +import type { Perf } from './perf.js'; +export type { Perf } from './perf.js'; +declare const TYPE: unique symbol; +export type PosInt = number & { + [TYPE]: 'Positive Integer'; +}; +export type Index = number & { + [TYPE]: 'LRUCache Index'; +}; +export type UintArray = Uint8Array | Uint16Array | Uint32Array; +export type NumberArray = UintArray | number[]; +declare class ZeroArray extends Array { + constructor(size: number); +} +export type { ZeroArray }; +export type { Stack }; +export type StackLike = Stack | Index[]; +declare class Stack { + #private; + heap: NumberArray; + length: number; + static create(max: number): StackLike; + constructor(max: number, HeapCls: { + new (n: number): NumberArray; + }); + push(n: Index): void; + pop(): Index; +} +/** + * Promise representing an in-progress {@link LRUCache#fetch} call + */ +export type BackgroundFetch = Promise & { + __returned: BackgroundFetch | undefined; + __abortController: AbortController; + __staleWhileFetching: V | undefined; +}; +export type DisposeTask = [ + value: V, + key: K, + reason: LRUCache.DisposeReason +]; +export declare namespace LRUCache { + /** + * An integer greater than 0, reflecting the calculated size of items + */ + type Size = number; + /** + * Integer greater than 0, representing some number of milliseconds, or the + * time at which a TTL started counting from. + */ + type Milliseconds = number; + /** + * An integer greater than 0, reflecting a number of items + */ + type Count = number; + /** + * The reason why an item was removed from the cache, passed + * to the {@link Disposer} methods. + * + * - `evict`: The item was evicted because it is the least recently used, + * and the cache is full. + * - `set`: A new value was set, overwriting the old value being disposed. + * - `delete`: The item was explicitly deleted, either by calling + * {@link LRUCache#delete}, {@link LRUCache#clear}, or + * {@link LRUCache#set} with an undefined value. + * - `expire`: The item was removed due to exceeding its TTL. + * - `fetch`: A {@link OptionsBase#fetchMethod} operation returned + * `undefined` or was aborted, causing the item to be deleted. + */ + type DisposeReason = 'evict' | 'set' | 'delete' | 'expire' | 'fetch'; + /** + * A method called upon item removal, passed as the + * {@link OptionsBase.dispose} and/or + * {@link OptionsBase.disposeAfter} options. + */ + type Disposer = (value: V, key: K, reason: DisposeReason) => void; + /** + * The reason why an item was added to the cache, passed + * to the {@link Inserter} methods. + * + * - `add`: the item was not found in the cache, and was added + * - `update`: the item was in the cache, with the same value provided + * - `replace`: the item was in the cache, and replaced + */ + type InsertReason = 'add' | 'update' | 'replace'; + /** + * A method called upon item insertion, passed as the + * {@link OptionsBase.insert} + */ + type Inserter = (value: V, key: K, reason: InsertReason) => void; + /** + * A function that returns the effective calculated size + * of an entry in the cache. + */ + type SizeCalculator = (value: V, key: K) => Size; + /** + * Options provided to the + * {@link OptionsBase.fetchMethod} function. + */ + interface FetcherOptions { + signal: AbortSignal; + options: FetcherFetchOptions; + /** + * Object provided in the {@link FetchOptions.context} option to + * {@link LRUCache#fetch} + */ + context: FC; + } + /** + * Occasionally, it may be useful to track the internal behavior of the + * cache, particularly for logging, debugging, or for behavior within the + * `fetchMethod`. To do this, you can pass a `status` object to the + * {@link LRUCache#fetch}, {@link LRUCache#get}, {@link LRUCache#set}, + * {@link LRUCache#memo}, and {@link LRUCache#has} methods. + * + * The `status` option should be a plain JavaScript object. The following + * fields will be set on it appropriately, depending on the situation. + * + * These objects are also the context objects passed to listeners on the + * `lru-cache:metrics` diagnostic channel, and the `lru-cache` tracing + * channels, in platforms that support them. + */ + interface Status { + /** + * The operation being performed + */ + op?: 'get' | 'set' | 'memo' | 'fetch' | 'delete' | 'has' | 'peek'; + /** + * The status of a set() operation. + * + * - add: the item was not found in the cache, and was added + * - update: the item was in the cache, with the same value provided + * - replace: the item was in the cache, and replaced + * - miss: the item was not added to the cache for some reason + */ + set?: 'add' | 'update' | 'replace' | 'miss' | 'deleted'; + /** + * The status of a delete() operation. + */ + delete?: LRUCache.DisposeReason; + /** + * The result of a peek() operation + * + * - hit: the item was found and returned + * - stale: the item is in the cache, but past its ttl and not returned + * - miss: item not in the cache + */ + peek?: 'hit' | 'miss' | 'stale'; + /** + * The status of a memo() operation. + * + * - 'hit': the item was found in the cache and returned + * - 'miss': the `memoMethod` function was called + */ + memo?: 'hit' | 'miss'; + /** + * The `context` option provided to a memo or fetch operation + * + * In practice, of course, this will be the same type as the `FC` + * fetch context param used to instantiate the LRUCache, but the + * convolutions of threading that through would get quite complicated, + * and preclude forcing/forbidding the passing of a `context` param + * where it is/isn't expected, which is more valuable for error + * prevention. + */ + context?: unknown; + /** + * the ttl stored for the item, or undefined if ttls are not used. + */ + ttl?: Milliseconds; + /** + * the start time for the item, or undefined if ttls are not used. + */ + start?: Milliseconds; + /** + * The timestamp used for TTL calculation + */ + now?: Milliseconds; + /** + * the remaining ttl for the item, or undefined if ttls are not used. + */ + remainingTTL?: Milliseconds; + /** + * The calculated size for the item, if sizes are used. + */ + entrySize?: Size; + /** + * The total calculated size of the cache, if sizes are used. + */ + totalCalculatedSize?: Size; + /** + * A flag indicating that the item was not stored, due to exceeding the + * {@link OptionsBase.maxEntrySize} + */ + maxEntrySizeExceeded?: true; + /** + * The key that was set or retrieved + */ + key?: K; + /** + * The value that was set + */ + value?: V; + /** + * The old value, specified in the case of `set:'replace'` + */ + oldValue?: V; + /** + * The results of a {@link LRUCache#has} operation + * + * - hit: the item was found in the cache + * - stale: the item was found in the cache, but is stale + * - miss: the item was not found in the cache + */ + has?: 'hit' | 'stale' | 'miss'; + /** + * The status of a {@link LRUCache#fetch} operation. + * Note that this can change as the underlying fetch() moves through + * various states. + * + * - inflight: there is another fetch() for this key which is in process + * - get: there is no {@link OptionsBase.fetchMethod}, so + * {@link LRUCache#get} was called. + * - miss: the item is not in cache, and will be fetched. + * - hit: the item is in the cache, and was resolved immediately. + * - stale: the item is in the cache, but stale. + * - refresh: the item is in the cache, and not stale, but + * {@link FetchOptions.forceRefresh} was specified. + */ + fetch?: 'get' | 'inflight' | 'miss' | 'hit' | 'stale' | 'refresh'; + /** + * `forceRefresh` option was used for either a fetch or memo operation + */ + forceRefresh?: boolean; + /** + * The {@link OptionsBase.fetchMethod} was called + */ + fetchDispatched?: true; + /** + * The cached value was updated after a successful call to + * {@link OptionsBase.fetchMethod} + */ + fetchUpdated?: true; + /** + * The reason for a fetch() rejection. Either the error raised by the + * {@link OptionsBase.fetchMethod}, or the reason for an + * AbortSignal. + */ + fetchError?: Error; + /** + * The fetch received an abort signal + */ + fetchAborted?: true; + /** + * The abort signal received was ignored, and the fetch was allowed to + * continue in the background. + */ + fetchAbortIgnored?: true; + /** + * The fetchMethod promise resolved successfully + */ + fetchResolved?: true; + /** + * The fetchMethod promise was rejected + */ + fetchRejected?: true; + /** + * The status of a {@link LRUCache#get} operation. + * + * - fetching: The item is currently being fetched. If a previous value + * is present and allowed, that will be returned. + * - stale: The item is in the cache, and is stale. If it was returned, + * then the `returnedStale` flag will be set. + * - stale-fetching: The value is being fetched in the background, but is + * currently stale. If the stale value was returned, then the + * `returnedStale` flag will be set. + * - hit: the item is in the cache + * - miss: the item is not in the cache + */ + get?: 'stale' | 'hit' | 'miss' | 'fetching' | 'stale-fetching'; + /** + * A fetch or get operation returned a stale value. + */ + returnedStale?: true; + /** + * A tracingChannel trace was started for this operation + */ + trace?: boolean; + /** + * A reference to the cache instance associated with this operation + */ + cache?: LRUCache; + } + /** + * options which override the options set in the LRUCache constructor + * when calling {@link LRUCache#fetch}. + * + * This is the union of {@link GetOptions} and {@link SetOptions}, plus + * {@link OptionsBase.noDeleteOnFetchRejection}, + * {@link OptionsBase.allowStaleOnFetchRejection}, + * {@link FetchOptions.forceRefresh}, and + * {@link FetcherOptions.context} + * + * Any of these may be modified in the {@link OptionsBase.fetchMethod} + * function, but the {@link GetOptions} fields will of course have no + * effect, as the {@link LRUCache#get} call already happened by the time + * the fetchMethod is called. + */ + interface FetcherFetchOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet' | 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL' | 'noDeleteOnFetchRejection' | 'allowStaleOnFetchRejection' | 'ignoreFetchAbort' | 'allowStaleOnFetchAbort'> { + status?: Status; + size?: Size; + } + /** + * Options that may be passed to the {@link LRUCache#fetch} method. + */ + interface FetchOptions extends FetcherFetchOptions { + /** + * Set to true to force a re-load of the existing data, even if it + * is not yet stale. + */ + forceRefresh?: boolean; + /** + * Context provided to the {@link OptionsBase.fetchMethod} as + * the {@link FetcherOptions.context} param. + * + * If the FC type is specified as unknown (the default), + * undefined or void, then this is optional. Otherwise, it will + * be required. + */ + context?: FC; + signal?: AbortSignal; + status?: Status; + } + /** + * Options provided to {@link LRUCache#fetch} when the FC type is something + * other than `unknown`, `undefined`, or `void` + */ + interface FetchOptionsWithContext extends FetchOptions { + context: FC; + } + /** + * Options provided to {@link LRUCache#fetch} when the FC type is + * `undefined` or `void` + */ + interface FetchOptionsNoContext extends FetchOptions { + context?: FC; + } + interface MemoOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet' | 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL' | 'noDeleteOnFetchRejection' | 'allowStaleOnFetchRejection' | 'ignoreFetchAbort' | 'allowStaleOnFetchAbort'> { + /** + * Set to true to force a re-load of the existing data, even if it + * is not yet stale. + */ + forceRefresh?: boolean; + /** + * Context provided to the {@link OptionsBase.memoMethod} as + * the {@link MemoizerOptions.context} param. + * + * If the FC type is specified as unknown (the default), + * undefined or void, then this is optional. Otherwise, it will + * be required. + */ + context?: FC; + status?: Status; + } + /** + * Options provided to {@link LRUCache#memo} when the FC type is something + * other than `unknown`, `undefined`, or `void` + */ + interface MemoOptionsWithContext extends MemoOptions { + context: FC; + } + /** + * Options provided to {@link LRUCache#memo} when the FC type is + * `undefined` or `void` + */ + interface MemoOptionsNoContext extends MemoOptions { + context?: FC; + } + /** + * Options provided to the + * {@link OptionsBase.memoMethod} function. + */ + interface MemoizerOptions { + options: MemoizerMemoOptions; + /** + * Object provided in the {@link MemoOptions.context} option to + * {@link LRUCache#memo} + */ + context: FC; + } + /** + * options which override the options set in the LRUCache constructor + * when calling {@link LRUCache#memo}. + * + * This is the union of {@link GetOptions} and {@link SetOptions}, plus + * {@link MemoOptions.forceRefresh}, and + * {@link MemoOptions.context} + * + * Any of these may be modified in the {@link OptionsBase.memoMethod} + * function, but the {@link GetOptions} fields will of course have no + * effect, as the {@link LRUCache#get} call already happened by the time + * the memoMethod is called. + */ + interface MemoizerMemoOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet' | 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'> { + status?: Status; + size?: Size; + start?: Milliseconds; + } + /** + * Options that may be passed to the {@link LRUCache#has} method. + */ + interface HasOptions extends Pick, 'updateAgeOnHas'> { + status?: Status; + } + /** + * Options that may be passed to the {@link LRUCache#get} method. + */ + interface GetOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet'> { + status?: Status; + } + /** + * Options that may be passed to the {@link LRUCache#peek} method. + */ + interface PeekOptions extends Pick, 'allowStale'> { + status?: Status; + } + /** + * Options that may be passed to the {@link LRUCache#set} method. + */ + interface SetOptions extends Pick, 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'> { + /** + * If size tracking is enabled, then setting an explicit size + * in the {@link LRUCache#set} call will prevent calling the + * {@link OptionsBase.sizeCalculation} function. + */ + size?: Size; + /** + * If TTL tracking is enabled, then setting an explicit start + * time in the {@link LRUCache#set} call will override the + * default time from `performance.now()` or `Date.now()`. + * + * Note that it must be a valid value for whichever time-tracking + * method is in use. + */ + start?: Milliseconds; + status?: Status; + } + /** + * The type signature for the {@link OptionsBase.fetchMethod} option. + */ + type Fetcher = (key: K, staleValue: V | undefined, options: FetcherOptions) => Promise | V | undefined | void; + /** + * the type signature for the {@link OptionsBase.memoMethod} option. + */ + type Memoizer = (key: K, staleValue: V | undefined, options: MemoizerOptions) => V; + /** + * Options which may be passed to the {@link LRUCache} constructor. + * + * Most of these may be overridden in the various options that use + * them. + * + * Despite all being technically optional, the constructor requires that + * a cache is at minimum limited by one or more of {@link OptionsBase.max}, + * {@link OptionsBase.ttl}, or {@link OptionsBase.maxSize}. + * + * If {@link OptionsBase.ttl} is used alone, then it is strongly advised + * (and in fact required by the type definitions here) that the cache + * also set {@link OptionsBase.ttlAutopurge}, to prevent potentially + * unbounded storage. + * + * All options are also available on the {@link LRUCache} instance, making + * it safe to pass an LRUCache instance as the options argumemnt to + * make another empty cache of the same type. + * + * Some options are marked as read-only, because changing them after + * instantiation is not safe. Changing any of the other options will of + * course only have an effect on subsequent method calls. + */ + interface OptionsBase { + /** + * The maximum number of items to store in the cache before evicting + * old entries. This is read-only on the {@link LRUCache} instance, + * and may not be overridden. + * + * If set, then storage space will be pre-allocated at construction + * time, and the cache will perform significantly faster. + * + * Note that significantly fewer items may be stored, if + * {@link OptionsBase.maxSize} and/or {@link OptionsBase.ttl} are also + * set. + * + * **It is strongly recommended to set a `max` to prevent unbounded growth + * of the cache.** + */ + max?: Count; + /** + * Max time in milliseconds for items to live in cache before they are + * considered stale. Note that stale items are NOT preemptively removed by + * default, and MAY live in the cache, contributing to its LRU max, long + * after they have expired, unless {@link OptionsBase.ttlAutopurge} is + * set. + * + * If set to `0` (the default value), then that means "do not track + * TTL", not "expire immediately". + * + * Also, as this cache is optimized for LRU/MRU operations, some of + * the staleness/TTL checks will reduce performance, as they will incur + * overhead by deleting items. + * + * This is not primarily a TTL cache, and does not make strong TTL + * guarantees. There is no pre-emptive pruning of expired items, but you + * _may_ set a TTL on the cache, and it will treat expired items as missing + * when they are fetched, and delete them. + * + * Optional, but must be a non-negative integer in ms if specified. + * + * This may be overridden by passing an options object to `cache.set()`. + * + * At least one of `max`, `maxSize`, or `TTL` is required. This must be a + * positive integer if set. + * + * Even if ttl tracking is enabled, **it is strongly recommended to set a + * `max` to prevent unbounded growth of the cache.** + * + * If ttl tracking is enabled, and `max` and `maxSize` are not set, + * and `ttlAutopurge` is not set, then a warning will be emitted + * cautioning about the potential for unbounded memory consumption. + * (The TypeScript definitions will also discourage this.) + */ + ttl?: Milliseconds; + /** + * Minimum amount of time in ms in which to check for staleness. + * Defaults to 1, which means that the current time is checked + * at most once per millisecond. + * + * Set to 0 to check the current time every time staleness is tested. + * (This reduces performance, and is theoretically unnecessary.) + * + * Setting this to a higher value will improve performance somewhat + * while using ttl tracking, albeit at the expense of keeping stale + * items around a bit longer than their TTLs would indicate. + * + * @default 1 + */ + ttlResolution?: Milliseconds; + /** + * Preemptively remove stale items from the cache. + * + * Note that this may *significantly* degrade performance, especially if + * the cache is storing a large number of items. It is almost always best + * to just leave the stale items in the cache, and let them fall out as new + * items are added. + * + * Note that this means that {@link OptionsBase.allowStale} is a bit + * pointless, as stale items will be deleted almost as soon as they + * expire. + * + * Use with caution! + */ + ttlAutopurge?: boolean; + /** + * When using time-expiring entries with `ttl`, setting this to `true` will + * make each item's age reset to 0 whenever it is retrieved from cache with + * {@link LRUCache#get}, causing it to not expire. (It can still fall out + * of cache based on recency of use, of course.) + * + * Has no effect if {@link OptionsBase.ttl} is not set. + * + * This may be overridden by passing an options object to `cache.get()`. + */ + updateAgeOnGet?: boolean; + /** + * When using time-expiring entries with `ttl`, setting this to `true` will + * make each item's age reset to 0 whenever its presence in the cache is + * checked with {@link LRUCache#has}, causing it to not expire. (It can + * still fall out of cache based on recency of use, of course.) + * + * Has no effect if {@link OptionsBase.ttl} is not set. + */ + updateAgeOnHas?: boolean; + /** + * Allow {@link LRUCache#get} and {@link LRUCache#fetch} calls to return + * stale data, if available. + * + * By default, if you set `ttl`, stale items will only be deleted from the + * cache when you `get(key)`. That is, it's not preemptively pruning items, + * unless {@link OptionsBase.ttlAutopurge} is set. + * + * If you set `allowStale:true`, it'll return the stale value *as well as* + * deleting it. If you don't set this, then it'll return `undefined` when + * you try to get a stale entry. + * + * Note that when a stale entry is fetched, _even if it is returned due to + * `allowStale` being set_, it is removed from the cache immediately. You + * can suppress this behavior by setting + * {@link OptionsBase.noDeleteOnStaleGet}, either in the constructor, or in + * the options provided to {@link LRUCache#get}. + * + * This may be overridden by passing an options object to `cache.get()`. + * The `cache.has()` method will always return `false` for stale items. + * + * Only relevant if a ttl is set. + */ + allowStale?: boolean; + /** + * Function that is called on items when they are dropped from the + * cache, as `dispose(value, key, reason)`. + * + * This can be handy if you want to close file descriptors or do + * other cleanup tasks when items are no longer stored in the cache. + * + * **NOTE**: It is called _before_ the item has been fully removed + * from the cache, so if you want to put it right back in, you need + * to wait until the next tick. If you try to add it back in during + * the `dispose()` function call, it will break things in subtle and + * weird ways. + * + * Unlike several other options, this may _not_ be overridden by + * passing an option to `set()`, for performance reasons. + * + * The `reason` will be one of the following strings, corresponding + * to the reason for the item's deletion: + * + * - `evict` Item was evicted to make space for a new addition + * - `set` Item was overwritten by a new value + * - `expire` Item expired its TTL + * - `fetch` Item was deleted due to a failed or aborted fetch, or a + * fetchMethod returning `undefined. + * - `delete` Item was removed by explicit `cache.delete(key)`, + * `cache.clear()`, or `cache.set(key, undefined)`. + */ + dispose?: Disposer; + /** + * Function that is called when new items are inserted into the cache, + * as `onInsert(value, key, reason)`. + * + * This can be useful if you need to perform actions when an item is + * added, such as logging or tracking insertions. + * + * Unlike some other options, this may _not_ be overridden by passing + * an option to `set()`, for performance and consistency reasons. + */ + onInsert?: Inserter; + /** + * The same as {@link OptionsBase.dispose}, but called *after* the entry + * is completely removed and the cache is once again in a clean state. + * + * It is safe to add an item right back into the cache at this point. + * However, note that it is *very* easy to inadvertently create infinite + * recursion this way. + */ + disposeAfter?: Disposer; + /** + * Set to true to suppress calling the + * {@link OptionsBase.dispose} function if the entry key is + * still accessible within the cache. + * + * This may be overridden by passing an options object to + * {@link LRUCache#set}. + * + * Only relevant if `dispose` or `disposeAfter` are set. + */ + noDisposeOnSet?: boolean; + /** + * Boolean flag to tell the cache to not update the TTL when setting a new + * value for an existing key (ie, when updating a value rather than + * inserting a new value). Note that the TTL value is _always_ set (if + * provided) when adding a new entry into the cache. + * + * Has no effect if a {@link OptionsBase.ttl} is not set. + * + * May be passed as an option to {@link LRUCache#set}. + */ + noUpdateTTL?: boolean; + /** + * Set to a positive integer to track the sizes of items added to the + * cache, and automatically evict items in order to stay below this size. + * Note that this may result in fewer than `max` items being stored. + * + * Attempting to add an item to the cache whose calculated size is greater + * that this amount will be a no-op. The item will not be cached, and no + * other items will be evicted. + * + * Optional, must be a positive integer if provided. + * + * Sets `maxEntrySize` to the same value, unless a different value is + * provided for `maxEntrySize`. + * + * At least one of `max`, `maxSize`, or `TTL` is required. This must be a + * positive integer if set. + * + * Even if size tracking is enabled, **it is strongly recommended to set a + * `max` to prevent unbounded growth of the cache.** + * + * Note also that size tracking can negatively impact performance, + * though for most cases, only minimally. + */ + maxSize?: Size; + /** + * The effective size for background fetch promises. + * + * This has no effect unless `maxSize` and `sizeCalculation` are used, + * and a {@link LRUCache.OptionsBase.fetchMethod} is provided to + * support {@link LRUCache#fetch}. + * + * If a stale value is present in the cache, then the effective size of + * the background fetch is the size of the stale item it will eventually + * replace. If not, then this value is used as its effective size. + * + * @default 1 + */ + backgroundFetchSize?: number; + /** + * The maximum allowed size for any single item in the cache. + * + * If a larger item is passed to {@link LRUCache#set} or returned by a + * {@link OptionsBase.fetchMethod} or {@link OptionsBase.memoMethod}, then + * it will not be stored in the cache. + * + * Attempting to add an item whose calculated size is greater than + * this amount will not cache the item or evict any old items, but + * WILL delete an existing value if one is already present. + * + * Optional, must be a positive integer if provided. Defaults to + * the value of `maxSize` if provided. + */ + maxEntrySize?: Size; + /** + * A function that returns a number indicating the item's size. + * + * Requires {@link OptionsBase.maxSize} to be set. + * + * If not provided, and {@link OptionsBase.maxSize} or + * {@link OptionsBase.maxEntrySize} are set, then all + * {@link LRUCache#set} calls **must** provide an explicit + * {@link SetOptions.size} or sizeCalculation param. + */ + sizeCalculation?: SizeCalculator; + /** + * Method that provides the implementation for {@link LRUCache#fetch} + * + * ```ts + * fetchMethod(key, staleValue, { signal, options, context }) + * ``` + * + * If `fetchMethod` is not provided, then `cache.fetch(key)` is equivalent + * to `Promise.resolve(cache.get(key))`. + * + * If at any time, `signal.aborted` is set to `true`, or if the + * `signal.onabort` method is called, or if it emits an `'abort'` event + * which you can listen to with `addEventListener`, then that means that + * the fetch should be abandoned. This may be passed along to async + * functions aware of AbortController/AbortSignal behavior. + * + * The `fetchMethod` should **only** return `undefined` or a Promise + * resolving to `undefined` if the AbortController signaled an `abort` + * event. In all other cases, it should return or resolve to a value + * suitable for adding to the cache. + * + * The `options` object is a union of the options that may be provided to + * `set()` and `get()`. If they are modified, then that will result in + * modifying the settings to `cache.set()` when the value is resolved, and + * in the case of + * {@link OptionsBase.noDeleteOnFetchRejection} and + * {@link OptionsBase.allowStaleOnFetchRejection}, the handling of + * `fetchMethod` failures. + * + * For example, a DNS cache may update the TTL based on the value returned + * from a remote DNS server by changing `options.ttl` in the `fetchMethod`. + */ + fetchMethod?: Fetcher; + /** + * Method that provides the implementation for {@link LRUCache#memo} + */ + memoMethod?: Memoizer; + /** + * Set to true to suppress the deletion of stale data when a + * {@link OptionsBase.fetchMethod} returns a rejected promise. + */ + noDeleteOnFetchRejection?: boolean; + /** + * Do not delete stale items when they are retrieved with + * {@link LRUCache#get}. + * + * Note that the `get` return value will still be `undefined` + * unless {@link OptionsBase.allowStale} is true. + * + * When using time-expiring entries with `ttl`, by default stale + * items will be removed from the cache when the key is accessed + * with `cache.get()`. + * + * Setting this option will cause stale items to remain in the cache, until + * they are explicitly deleted with `cache.delete(key)`, or retrieved with + * `noDeleteOnStaleGet` set to `false`. + * + * This may be overridden by passing an options object to `cache.get()`. + * + * Only relevant if a ttl is used. + */ + noDeleteOnStaleGet?: boolean; + /** + * Set to true to allow returning stale data when a + * {@link OptionsBase.fetchMethod} throws an error or returns a rejected + * promise. + * + * This differs from using {@link OptionsBase.allowStale} in that stale + * data will ONLY be returned in the case that the {@link LRUCache#fetch} + * fails, not any other times. + * + * If a `fetchMethod` fails, and there is no stale value available, the + * `fetch()` will resolve to `undefined`. Ie, all `fetchMethod` errors are + * suppressed. + * + * Implies `noDeleteOnFetchRejection`. + * + * This may be set in calls to `fetch()`, or defaulted on the constructor, + * or overridden by modifying the options object in the `fetchMethod`. + */ + allowStaleOnFetchRejection?: boolean; + /** + * Set to true to return a stale value from the cache when the + * `AbortSignal` passed to the {@link OptionsBase.fetchMethod} dispatches + * an `'abort'` event, whether user-triggered, or due to internal cache + * behavior. + * + * Unless {@link OptionsBase.ignoreFetchAbort} is also set, the underlying + * {@link OptionsBase.fetchMethod} will still be considered canceled, and + * any value it returns will be ignored and not cached. + * + * Caveat: since fetches are aborted when a new value is explicitly + * set in the cache, this can lead to fetch returning a stale value, + * since that was the fallback value _at the moment the `fetch()` was + * initiated_, even though the new updated value is now present in + * the cache. + * + * For example: + * + * ```ts + * const cache = new LRUCache({ + * ttl: 100, + * fetchMethod: async (url, oldValue, { signal }) => { + * const res = await fetch(url, { signal }) + * return await res.json() + * } + * }) + * cache.set('https://example.com/', { some: 'data' }) + * // 100ms go by... + * const result = cache.fetch('https://example.com/') + * cache.set('https://example.com/', { other: 'thing' }) + * console.log(await result) // { some: 'data' } + * console.log(cache.get('https://example.com/')) // { other: 'thing' } + * ``` + */ + allowStaleOnFetchAbort?: boolean; + /** + * Set to true to ignore the `abort` event emitted by the `AbortSignal` + * object passed to {@link OptionsBase.fetchMethod}, and still cache the + * resulting resolution value, as long as it is not `undefined`. + * + * When used on its own, this means aborted {@link LRUCache#fetch} calls + * are not immediately resolved or rejected when they are aborted, and + * instead take the full time to await. + * + * When used with {@link OptionsBase.allowStaleOnFetchAbort}, aborted + * {@link LRUCache#fetch} calls will resolve immediately to their stale + * cached value or `undefined`, and will continue to process and eventually + * update the cache when they resolve, as long as the resulting value is + * not `undefined`, thus supporting a "return stale on timeout while + * refreshing" mechanism by passing `AbortSignal.timeout(n)` as the signal. + * + * For example: + * + * ```ts + * const c = new LRUCache({ + * ttl: 100, + * ignoreFetchAbort: true, + * allowStaleOnFetchAbort: true, + * fetchMethod: async (key, oldValue, { signal }) => { + * // note: do NOT pass the signal to fetch()! + * // let's say this fetch can take a long time. + * const res = await fetch(`https://slow-backend-server/${key}`) + * return await res.json() + * }, + * }) + * + * // this will return the stale value after 100ms, while still + * // updating in the background for next time. + * const val = await c.fetch('key', { signal: AbortSignal.timeout(100) }) + * ``` + * + * **Note**: regardless of this setting, an `abort` event _is still + * emitted on the `AbortSignal` object_, so may result in invalid results + * when passed to other underlying APIs that use AbortSignals. + * + * This may be overridden in the {@link OptionsBase.fetchMethod} or the + * call to {@link LRUCache#fetch}. + */ + ignoreFetchAbort?: boolean; + /** + * In some cases, you may want to swap out the performance/Date object + * used for TTL tracking. This should almost certainly NOT be done in + * production environments! + * + * This value defaults to `global.performance` if it has a `now()` method, + * or the `global.Date` object otherwise. + */ + perf?: Perf; + } + interface OptionsMaxLimit extends OptionsBase { + max: Count; + } + interface OptionsTTLLimit extends OptionsBase { + ttl: Milliseconds; + ttlAutopurge: boolean; + } + interface OptionsSizeLimit extends OptionsBase { + maxSize: Size; + } + /** + * The valid safe options for the {@link LRUCache} constructor + */ + type Options = OptionsMaxLimit | OptionsSizeLimit | OptionsTTLLimit; + /** + * Entry objects used by {@link LRUCache#load} and {@link LRUCache#dump}, + * and returned by {@link LRUCache#info}. + */ + interface Entry { + value: V; + ttl?: Milliseconds; + size?: Size; + start?: Milliseconds; + } +} +/** + * Default export, the thing you're using this module to get. + * + * The `K` and `V` types define the key and value types, respectively. The + * optional `FC` type defines the type of the `context` object passed to + * `cache.fetch()` and `cache.memo()`. + * + * Keys and values **must not** be `null` or `undefined`. + * + * All properties from the options object (with the exception of `max`, + * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are + * added as normal public members. (The listed options are read-only getters.) + * + * Changing any of these will alter the defaults for subsequent method calls. + */ +export declare class LRUCache { + #private; + /** + * {@link LRUCache.OptionsBase.perf} + */ + get perf(): Perf; + /** + * {@link LRUCache.OptionsBase.ttl} + */ + ttl: LRUCache.Milliseconds; + /** + * {@link LRUCache.OptionsBase.ttlResolution} + */ + ttlResolution: LRUCache.Milliseconds; + /** + * {@link LRUCache.OptionsBase.ttlAutopurge} + */ + ttlAutopurge: boolean; + /** + * {@link LRUCache.OptionsBase.updateAgeOnGet} + */ + updateAgeOnGet: boolean; + /** + * {@link LRUCache.OptionsBase.updateAgeOnHas} + */ + updateAgeOnHas: boolean; + /** + * {@link LRUCache.OptionsBase.allowStale} + */ + allowStale: boolean; + /** + * {@link LRUCache.OptionsBase.noDisposeOnSet} + */ + noDisposeOnSet: boolean; + /** + * {@link LRUCache.OptionsBase.noUpdateTTL} + */ + noUpdateTTL: boolean; + /** + * {@link LRUCache.OptionsBase.maxEntrySize} + */ + maxEntrySize: LRUCache.Size; + /** + * {@link LRUCache.OptionsBase.sizeCalculation} + */ + sizeCalculation?: LRUCache.SizeCalculator; + /** + * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection} + */ + noDeleteOnFetchRejection: boolean; + /** + * {@link LRUCache.OptionsBase.noDeleteOnStaleGet} + */ + noDeleteOnStaleGet: boolean; + /** + * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort} + */ + allowStaleOnFetchAbort: boolean; + /** + * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} + */ + allowStaleOnFetchRejection: boolean; + /** + * {@link LRUCache.OptionsBase.ignoreFetchAbort} + */ + ignoreFetchAbort: boolean; + /** {@link LRUCache.OptionsBase.backgroundFetchSize} */ + backgroundFetchSize: number; + /** + * Do not call this method unless you need to inspect the + * inner workings of the cache. If anything returned by this + * object is modified in any way, strange breakage may occur. + * + * These fields are private for a reason! + * + * @internal + */ + static unsafeExposeInternals(c: LRUCache): { + starts: ZeroArray | undefined; + ttls: ZeroArray | undefined; + autopurgeTimers: (NodeJS.Timeout | undefined)[] | undefined; + sizes: ZeroArray | undefined; + keyMap: Map; + keyList: (K | undefined)[]; + valList: (V | BackgroundFetch | undefined)[]; + next: NumberArray; + prev: NumberArray; + readonly head: Index; + readonly tail: Index; + free: StackLike; + isBackgroundFetch: (p: unknown) => p is BackgroundFetch; + backgroundFetch: (k: K, index: number | undefined, options: LRUCache.FetchOptions, context: unknown) => BackgroundFetch; + moveToTail: (index: number) => void; + indexes: (options?: { + allowStale: boolean; + }) => Generator; + rindexes: (options?: { + allowStale: boolean; + }) => Generator; + isStale: (index: number | undefined) => boolean; + }; + /** + * {@link LRUCache.OptionsBase.max} (read-only) + */ + get max(): LRUCache.Count; + /** + * {@link LRUCache.OptionsBase.maxSize} (read-only) + */ + get maxSize(): LRUCache.Count; + /** + * The total computed size of items in the cache (read-only) + */ + get calculatedSize(): LRUCache.Size; + /** + * The number of items stored in the cache (read-only) + */ + get size(): LRUCache.Count; + /** + * {@link LRUCache.OptionsBase.fetchMethod} (read-only) + */ + get fetchMethod(): LRUCache.Fetcher | undefined; + get memoMethod(): LRUCache.Memoizer | undefined; + /** + * {@link LRUCache.OptionsBase.dispose} (read-only) + */ + get dispose(): LRUCache.Disposer | undefined; + /** + * {@link LRUCache.OptionsBase.onInsert} (read-only) + */ + get onInsert(): LRUCache.Inserter | undefined; + /** + * {@link LRUCache.OptionsBase.disposeAfter} (read-only) + */ + get disposeAfter(): LRUCache.Disposer | undefined; + constructor(options: LRUCache.Options | LRUCache); + /** + * Return the number of ms left in the item's TTL. If item is not in cache, + * returns `0`. Returns `Infinity` if item is in cache without a defined TTL. + */ + getRemainingTTL(key: K): number; + /** + * Return a generator yielding `[key, value]` pairs, + * in order from most recently used to least recently used. + */ + entries(): Generator<[K, V], void, unknown>; + /** + * Inverse order version of {@link LRUCache.entries} + * + * Return a generator yielding `[key, value]` pairs, + * in order from least recently used to most recently used. + */ + rentries(): Generator<(K | V)[], void, unknown>; + /** + * Return a generator yielding the keys in the cache, + * in order from most recently used to least recently used. + */ + keys(): Generator; + /** + * Inverse order version of {@link LRUCache.keys} + * + * Return a generator yielding the keys in the cache, + * in order from least recently used to most recently used. + */ + rkeys(): Generator; + /** + * Return a generator yielding the values in the cache, + * in order from most recently used to least recently used. + */ + values(): Generator; + /** + * Inverse order version of {@link LRUCache.values} + * + * Return a generator yielding the values in the cache, + * in order from least recently used to most recently used. + */ + rvalues(): Generator; + /** + * Iterating over the cache itself yields the same results as + * {@link LRUCache.entries} + */ + [Symbol.iterator](): Generator<[K, V], void, unknown>; + /** + * A String value that is used in the creation of the default string + * description of an object. Called by the built-in method + * `Object.prototype.toString`. + */ + [Symbol.toStringTag]: string; + /** + * Find a value for which the supplied fn method returns a truthy value, + * similar to `Array.find()`. fn is called as `fn(value, key, cache)`. + */ + find(fn: (v: V, k: K, self: LRUCache) => boolean, getOptions?: LRUCache.GetOptions): V | undefined; + /** + * Call the supplied function on each item in the cache, in order from most + * recently used to least recently used. + * + * `fn` is called as `fn(value, key, cache)`. + * + * If `thisp` is provided, function will be called in the `this`-context of + * the provided object, or the cache if no `thisp` object is provided. + * + * Does not update age or recenty of use, or iterate over stale values. + */ + forEach(fn: (v: V, k: K, self: LRUCache) => unknown, thisp?: unknown): void; + /** + * The same as {@link LRUCache.forEach} but items are iterated over in + * reverse order. (ie, less recently used items are iterated over first.) + */ + rforEach(fn: (v: V, k: K, self: LRUCache) => unknown, thisp?: unknown): void; + /** + * Delete any stale entries. Returns true if anything was removed, + * false otherwise. + */ + purgeStale(): boolean; + /** + * Get the extended info about a given entry, to get its value, size, and + * TTL info simultaneously. Returns `undefined` if the key is not present. + * + * Unlike {@link LRUCache#dump}, which is designed to be portable and survive + * serialization, the `start` value is always the current timestamp, and the + * `ttl` is a calculated remaining time to live (negative if expired). + * + * Always returns stale values, if their info is found in the cache, so be + * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl}) + * if relevant. + */ + info(key: K): LRUCache.Entry | undefined; + /** + * Return an array of [key, {@link LRUCache.Entry}] tuples which can be + * passed to {@link LRUCache#load}. + * + * The `start` fields are calculated relative to a portable `Date.now()` + * timestamp, even if `performance.now()` is available. + * + * Stale entries are always included in the `dump`, even if + * {@link LRUCache.OptionsBase.allowStale} is false. + * + * Note: this returns an actual array, not a generator, so it can be more + * easily passed around. + */ + dump(): [K, LRUCache.Entry][]; + /** + * Reset the cache and load in the items in entries in the order listed. + * + * The shape of the resulting cache may be different if the same options are + * not used in both caches. + * + * The `start` fields are assumed to be calculated relative to a portable + * `Date.now()` timestamp, even if `performance.now()` is available. + */ + load(arr: [K, LRUCache.Entry][]): void; + /** + * Add a value to the cache. + * + * Note: if `undefined` is specified as a value, this is an alias for + * {@link LRUCache#delete} + * + * Fields on the {@link LRUCache.SetOptions} options param will override + * their corresponding values in the constructor options for the scope + * of this single `set()` operation. + * + * If `start` is provided, then that will set the effective start + * time for the TTL calculation. Note that this must be a previous + * value of `performance.now()` if supported, or a previous value of + * `Date.now()` if not. + * + * Options object may also include `size`, which will prevent + * calling the `sizeCalculation` function and just use the specified + * number if it is a positive integer, and `noDisposeOnSet` which + * will prevent calling a `dispose` function in the case of + * overwrites. + * + * If the `size` (or return value of `sizeCalculation`) for a given + * entry is greater than `maxEntrySize`, then the item will not be + * added to the cache. + * + * Will update the recency of the entry. + * + * If the value is `undefined`, then this is an alias for + * `cache.delete(key)`. `undefined` is never stored in the cache. + */ + set(k: K, v: V | undefined, setOptions?: LRUCache.SetOptions): this; + /** + * Evict the least recently used item, returning its value or + * `undefined` if cache is empty. + */ + pop(): V | undefined; + /** + * Check if a key is in the cache, without updating the recency of use. + * Will return false if the item is stale, even though it is technically + * in the cache. + * + * Check if a key is in the cache, without updating the recency of + * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set + * to `true` in either the options or the constructor. + * + * Will return `false` if the item is stale, even though it is technically in + * the cache. The difference can be determined (if it matters) by using a + * `status` argument, and inspecting the `has` field. + * + * Will not update item age unless + * {@link LRUCache.OptionsBase.updateAgeOnHas} is set. + */ + has(k: K, hasOptions?: LRUCache.HasOptions): boolean; + /** + * Like {@link LRUCache#get} but doesn't update recency or delete stale + * items. + * + * Returns `undefined` if the item is stale, unless + * {@link LRUCache.OptionsBase.allowStale} is set. + */ + peek(k: K, peekOptions?: LRUCache.PeekOptions): V | undefined; + /** + * Make an asynchronous cached fetch using the + * {@link LRUCache.OptionsBase.fetchMethod} function. + * + * If the value is in the cache and not stale, then the returned + * Promise resolves to the value. + * + * If not in the cache, or beyond its TTL staleness, then + * `fetchMethod(key, staleValue, { options, signal, context })` is + * called, and the value returned will be added to the cache once + * resolved. + * + * If called with `allowStale`, and an asynchronous fetch is + * currently in progress to reload a stale value, then the former + * stale value will be returned. + * + * If called with `forceRefresh`, then the cached item will be + * re-fetched, even if it is not stale. However, if `allowStale` is also + * set, then the old value will still be returned. This is useful + * in cases where you want to force a reload of a cached value. If + * a background fetch is already in progress, then `forceRefresh` + * has no effect. + * + * If multiple fetches for the same key are issued, then they will all be + * coalesced into a single call to fetchMethod. + * + * Note that this means that handling options such as + * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}, + * {@link LRUCache.FetchOptions.signal}, + * and {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} will be + * determined by the FIRST fetch() call for a given key. + * + * This is a known (fixable) shortcoming which will be addresed on when + * someone complains about it, as the fix would involve added complexity and + * may not be worth the costs for this edge case. + * + * If {@link LRUCache.OptionsBase.fetchMethod} is not specified, then this is + * effectively an alias for `Promise.resolve(cache.get(key))`. + * + * When the fetch method resolves to a value, if the fetch has not + * been aborted due to deletion, eviction, or being overwritten, + * then it is added to the cache using the options provided. + * + * If the key is evicted or deleted before the `fetchMethod` + * resolves, then the AbortSignal passed to the `fetchMethod` will + * receive an `abort` event, and the promise returned by `fetch()` + * will reject with the reason for the abort. + * + * If a `signal` is passed to the `fetch()` call, then aborting the + * signal will abort the fetch and cause the `fetch()` promise to + * reject with the reason provided. + * + * **Setting `context`** + * + * If an `FC` type is set to a type other than `unknown`, `void`, or + * `undefined` in the {@link LRUCache} constructor, then all + * calls to `cache.fetch()` _must_ provide a `context` option. If + * set to `undefined` or `void`, then calls to fetch _must not_ + * provide a `context` option. + * + * The `context` param allows you to provide arbitrary data that + * might be relevant in the course of fetching the data. It is only + * relevant for the course of a single `fetch()` operation, and + * discarded afterwards. + * + * **Note: `fetch()` calls are inflight-unique** + * + * If you call `fetch()` multiple times with the same key value, + * then every call after the first will resolve on the same + * promise1, + * _even if they have different settings that would otherwise change + * the behavior of the fetch_, such as `noDeleteOnFetchRejection` + * or `ignoreFetchAbort`. + * + * In most cases, this is not a problem (in fact, only fetching + * something once is what you probably want, if you're caching in + * the first place). If you are changing the fetch() options + * dramatically between runs, there's a good chance that you might + * be trying to fit divergent semantics into a single object, and + * would be better off with multiple cache instances. + * + * **1**: Ie, they're not the "same Promise", but they resolve at + * the same time, because they're both waiting on the same + * underlying fetchMethod response. + */ + fetch(k: K, fetchOptions: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : LRUCache.FetchOptionsWithContext): Promise; + fetch(k: unknown extends FC ? K : FC extends undefined | void ? K : never, fetchOptions?: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : never): Promise; + /** + * In some cases, `cache.fetch()` may resolve to `undefined`, either because + * a {@link LRUCache.OptionsBase#fetchMethod} was not provided (turning + * `cache.fetch(k)` into just an async wrapper around `cache.get(k)`) or + * because `ignoreFetchAbort` was specified (either to the constructor or + * in the {@link LRUCache.FetchOptions}). Also, the + * {@link LRUCache.OptionsBase.fetchMethod} may return `undefined` or `void`, making + * the test even more complicated. + * + * Because inferring the cases where `undefined` might be returned are so + * cumbersome, but testing for `undefined` can also be annoying, this method + * can be used, which will reject if `this.fetch()` resolves to undefined. + */ + forceFetch(k: K, fetchOptions: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : LRUCache.FetchOptionsWithContext): Promise; + forceFetch(k: unknown extends FC ? K : FC extends undefined | void ? K : never, fetchOptions?: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : never): Promise; + /** + * If the key is found in the cache, then this is equivalent to + * {@link LRUCache#get}. If not, in the cache, then calculate the value using + * the {@link LRUCache.OptionsBase.memoMethod}, and add it to the cache. + * + * If an `FC` type is set to a type other than `unknown`, `void`, or + * `undefined` in the LRUCache constructor, then all calls to `cache.memo()` + * _must_ provide a `context` option. If set to `undefined` or `void`, then + * calls to memo _must not_ provide a `context` option. + * + * The `context` param allows you to provide arbitrary data that might be + * relevant in the course of fetching the data. It is only relevant for the + * course of a single `memo()` operation, and discarded afterwards. + */ + memo(k: K, memoOptions: unknown extends FC ? LRUCache.MemoOptions : FC extends undefined | void ? LRUCache.MemoOptionsNoContext : LRUCache.MemoOptionsWithContext): V; + memo(k: unknown extends FC ? K : FC extends undefined | void ? K : never, memoOptions?: unknown extends FC ? LRUCache.MemoOptions : FC extends undefined | void ? LRUCache.MemoOptionsNoContext : never): V; + /** + * Return a value from the cache. Will update the recency of the cache + * entry found. + * + * If the key is not found, get() will return `undefined`. + */ + get(k: K, getOptions?: LRUCache.GetOptions): V | undefined; + /** + * Deletes a key out of the cache. + * + * Returns true if the key was deleted, false otherwise. + */ + delete(k: K): boolean; + /** + * Clear the cache entirely, throwing away all values. + */ + clear(): void; +} +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/index.d.ts.map b/node_modules/lru-cache/dist/esm/index.d.ts.map new file mode 100644 index 00000000..3ab3f752 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/index.js b/node_modules/lru-cache/dist/esm/index.js new file mode 100644 index 00000000..2dd10cf8 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/index.js @@ -0,0 +1,1722 @@ +/** + * @module LRUCache + */ +import { metrics, tracing } from './diagnostics-channel.js'; +import { defaultPerf } from './perf.js'; +const hasSubscribers = () => metrics.hasSubscribers || tracing.hasSubscribers; +const warned = new Set(); +/* c8 ignore start */ +const PROCESS = (typeof process === 'object' && !!process ? + process + : {}); +/* c8 ignore stop */ +const emitWarning = (msg, type, code, fn) => { + if (typeof PROCESS.emitWarning === 'function') { + PROCESS.emitWarning(msg, type, code, fn); + } + else { + //oxlint-disable-next-line no-console + console.error(`[${code}] ${type}: ${msg}`); + } +}; +const shouldWarn = (code) => !warned.has(code); +const TYPE = Symbol('type'); +const isPosInt = (n) => !!n && n === Math.floor(n) && n > 0 && isFinite(n); +// This is a little bit ridiculous, tbh. +// The maximum array length is 2^32-1 or thereabouts on most JS impls. +// And well before that point, you're caching the entire world, I mean, +// that's ~32GB of just integers for the next/prev links, plus whatever +// else to hold that many keys and values. Just filling the memory with +// zeroes at init time is brutal when you get that big. +// But why not be complete? +// Maybe in the future, these limits will have expanded. +/* c8 ignore start */ +const getUintArray = (max) => !isPosInt(max) ? null + : max <= Math.pow(2, 8) ? Uint8Array + : max <= Math.pow(2, 16) ? Uint16Array + : max <= Math.pow(2, 32) ? Uint32Array + : max <= Number.MAX_SAFE_INTEGER ? ZeroArray + : null; +/* c8 ignore stop */ +class ZeroArray extends Array { + constructor(size) { + super(size); + this.fill(0); + } +} +class Stack { + /* c8 ignore start - not sure why this is showing up uncovered?? */ + heap; + /* c8 ignore stop */ + length; + // private constructor + static #constructing = false; + static create(max) { + const HeapCls = getUintArray(max); + if (!HeapCls) + return []; + Stack.#constructing = true; + const s = new Stack(max, HeapCls); + Stack.#constructing = false; + return s; + } + constructor(max, HeapCls) { + /* c8 ignore start */ + if (!Stack.#constructing) { + throw new TypeError('instantiate Stack using Stack.create(n)'); + } + /* c8 ignore stop */ + this.heap = new HeapCls(max); + this.length = 0; + } + push(n) { + this.heap[this.length++] = n; + } + pop() { + return this.heap[--this.length]; + } +} +/** + * Default export, the thing you're using this module to get. + * + * The `K` and `V` types define the key and value types, respectively. The + * optional `FC` type defines the type of the `context` object passed to + * `cache.fetch()` and `cache.memo()`. + * + * Keys and values **must not** be `null` or `undefined`. + * + * All properties from the options object (with the exception of `max`, + * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are + * added as normal public members. (The listed options are read-only getters.) + * + * Changing any of these will alter the defaults for subsequent method calls. + */ +export class LRUCache { + // options that cannot be changed without disaster + #max; + #maxSize; + #dispose; + #onInsert; + #disposeAfter; + #fetchMethod; + #memoMethod; + #perf; + /** + * {@link LRUCache.OptionsBase.perf} + */ + get perf() { + return this.#perf; + } + /** + * {@link LRUCache.OptionsBase.ttl} + */ + ttl; + /** + * {@link LRUCache.OptionsBase.ttlResolution} + */ + ttlResolution; + /** + * {@link LRUCache.OptionsBase.ttlAutopurge} + */ + ttlAutopurge; + /** + * {@link LRUCache.OptionsBase.updateAgeOnGet} + */ + updateAgeOnGet; + /** + * {@link LRUCache.OptionsBase.updateAgeOnHas} + */ + updateAgeOnHas; + /** + * {@link LRUCache.OptionsBase.allowStale} + */ + allowStale; + /** + * {@link LRUCache.OptionsBase.noDisposeOnSet} + */ + noDisposeOnSet; + /** + * {@link LRUCache.OptionsBase.noUpdateTTL} + */ + noUpdateTTL; + /** + * {@link LRUCache.OptionsBase.maxEntrySize} + */ + maxEntrySize; + /** + * {@link LRUCache.OptionsBase.sizeCalculation} + */ + sizeCalculation; + /** + * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection} + */ + noDeleteOnFetchRejection; + /** + * {@link LRUCache.OptionsBase.noDeleteOnStaleGet} + */ + noDeleteOnStaleGet; + /** + * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort} + */ + allowStaleOnFetchAbort; + /** + * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} + */ + allowStaleOnFetchRejection; + /** + * {@link LRUCache.OptionsBase.ignoreFetchAbort} + */ + ignoreFetchAbort; + /** {@link LRUCache.OptionsBase.backgroundFetchSize} */ + backgroundFetchSize; + // computed properties + #size; + #calculatedSize; + #keyMap; + #keyList; + #valList; + #next; + #prev; + #head; + #tail; + #free; + #disposed; + #sizes; + #starts; + #ttls; + #autopurgeTimers; + #hasDispose; + #hasFetchMethod; + #hasDisposeAfter; + #hasOnInsert; + /** + * Do not call this method unless you need to inspect the + * inner workings of the cache. If anything returned by this + * object is modified in any way, strange breakage may occur. + * + * These fields are private for a reason! + * + * @internal + */ + static unsafeExposeInternals(c) { + return { + // properties + starts: c.#starts, + ttls: c.#ttls, + autopurgeTimers: c.#autopurgeTimers, + sizes: c.#sizes, + keyMap: c.#keyMap, + keyList: c.#keyList, + valList: c.#valList, + next: c.#next, + prev: c.#prev, + get head() { + return c.#head; + }, + get tail() { + return c.#tail; + }, + free: c.#free, + // methods + isBackgroundFetch: (p) => c.#isBackgroundFetch(p), + backgroundFetch: (k, index, options, context) => c.#backgroundFetch(k, index, options, context), + moveToTail: (index) => c.#moveToTail(index), + indexes: (options) => c.#indexes(options), + rindexes: (options) => c.#rindexes(options), + isStale: (index) => c.#isStale(index), + }; + } + // Protected read-only members + /** + * {@link LRUCache.OptionsBase.max} (read-only) + */ + get max() { + return this.#max; + } + /** + * {@link LRUCache.OptionsBase.maxSize} (read-only) + */ + get maxSize() { + return this.#maxSize; + } + /** + * The total computed size of items in the cache (read-only) + */ + get calculatedSize() { + return this.#calculatedSize; + } + /** + * The number of items stored in the cache (read-only) + */ + get size() { + return this.#size; + } + /** + * {@link LRUCache.OptionsBase.fetchMethod} (read-only) + */ + get fetchMethod() { + return this.#fetchMethod; + } + get memoMethod() { + return this.#memoMethod; + } + /** + * {@link LRUCache.OptionsBase.dispose} (read-only) + */ + get dispose() { + return this.#dispose; + } + /** + * {@link LRUCache.OptionsBase.onInsert} (read-only) + */ + get onInsert() { + return this.#onInsert; + } + /** + * {@link LRUCache.OptionsBase.disposeAfter} (read-only) + */ + get disposeAfter() { + return this.#disposeAfter; + } + constructor(options) { + const { max = 0, ttl, ttlResolution = 1, ttlAutopurge, updateAgeOnGet, updateAgeOnHas, allowStale, dispose, onInsert, disposeAfter, noDisposeOnSet, noUpdateTTL, maxSize = 0, maxEntrySize = 0, sizeCalculation, fetchMethod, memoMethod, noDeleteOnFetchRejection, noDeleteOnStaleGet, allowStaleOnFetchRejection, allowStaleOnFetchAbort, ignoreFetchAbort, backgroundFetchSize = 1, perf, } = options; + this.backgroundFetchSize = backgroundFetchSize; + if (perf !== undefined) { + if (typeof perf?.now !== 'function') { + throw new TypeError('perf option must have a now() method if specified'); + } + } + this.#perf = perf ?? defaultPerf; + if (max !== 0 && !isPosInt(max)) { + throw new TypeError('max option must be a nonnegative integer'); + } + const UintArray = max ? getUintArray(max) : Array; + if (!UintArray) { + throw new Error('invalid max value: ' + max); + } + this.#max = max; + this.#maxSize = maxSize; + this.maxEntrySize = maxEntrySize || this.#maxSize; + this.sizeCalculation = sizeCalculation; + if (this.sizeCalculation) { + if (!this.#maxSize && !this.maxEntrySize) { + throw new TypeError('cannot set sizeCalculation without setting maxSize or maxEntrySize'); + } + if (typeof this.sizeCalculation !== 'function') { + throw new TypeError('sizeCalculation set to non-function'); + } + } + if (memoMethod !== undefined && typeof memoMethod !== 'function') { + throw new TypeError('memoMethod must be a function if defined'); + } + this.#memoMethod = memoMethod; + if (fetchMethod !== undefined && typeof fetchMethod !== 'function') { + throw new TypeError('fetchMethod must be a function if specified'); + } + this.#fetchMethod = fetchMethod; + this.#hasFetchMethod = !!fetchMethod; + this.#keyMap = new Map(); + this.#keyList = Array.from({ length: max }).fill(undefined); + this.#valList = Array.from({ length: max }).fill(undefined); + this.#next = new UintArray(max); + this.#prev = new UintArray(max); + this.#head = 0; + this.#tail = 0; + this.#free = Stack.create(max); + this.#size = 0; + this.#calculatedSize = 0; + if (typeof dispose === 'function') { + this.#dispose = dispose; + } + if (typeof onInsert === 'function') { + this.#onInsert = onInsert; + } + if (typeof disposeAfter === 'function') { + this.#disposeAfter = disposeAfter; + this.#disposed = []; + } + else { + this.#disposeAfter = undefined; + this.#disposed = undefined; + } + this.#hasDispose = !!this.#dispose; + this.#hasOnInsert = !!this.#onInsert; + this.#hasDisposeAfter = !!this.#disposeAfter; + this.noDisposeOnSet = !!noDisposeOnSet; + this.noUpdateTTL = !!noUpdateTTL; + this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection; + this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection; + this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort; + this.ignoreFetchAbort = !!ignoreFetchAbort; + // NB: maxEntrySize is set to maxSize if it's set + if (this.maxEntrySize !== 0) { + if (this.#maxSize !== 0) { + if (!isPosInt(this.#maxSize)) { + throw new TypeError('maxSize must be a positive integer if specified'); + } + } + if (!isPosInt(this.maxEntrySize)) { + throw new TypeError('maxEntrySize must be a positive integer if specified'); + } + this.#initializeSizeTracking(); + } + this.allowStale = !!allowStale; + this.noDeleteOnStaleGet = !!noDeleteOnStaleGet; + this.updateAgeOnGet = !!updateAgeOnGet; + this.updateAgeOnHas = !!updateAgeOnHas; + this.ttlResolution = + isPosInt(ttlResolution) || ttlResolution === 0 ? ttlResolution : 1; + this.ttlAutopurge = !!ttlAutopurge; + this.ttl = ttl || 0; + if (this.ttl) { + if (!isPosInt(this.ttl)) { + throw new TypeError('ttl must be a positive integer if specified'); + } + this.#initializeTTLTracking(); + } + // do not allow completely unbounded caches + if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) { + throw new TypeError('At least one of max, maxSize, or ttl is required'); + } + if (!this.ttlAutopurge && !this.#max && !this.#maxSize) { + const code = 'LRU_CACHE_UNBOUNDED'; + if (shouldWarn(code)) { + warned.add(code); + const msg = 'TTL caching without ttlAutopurge, max, or maxSize can ' + + 'result in unbounded memory consumption.'; + emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache); + } + } + } + /** + * Return the number of ms left in the item's TTL. If item is not in cache, + * returns `0`. Returns `Infinity` if item is in cache without a defined TTL. + */ + getRemainingTTL(key) { + return this.#keyMap.has(key) ? Infinity : 0; + } + #initializeTTLTracking() { + const ttls = new ZeroArray(this.#max); + const starts = new ZeroArray(this.#max); + this.#ttls = ttls; + this.#starts = starts; + const purgeTimers = this.ttlAutopurge ? + Array.from({ + length: this.#max, + }) + : undefined; + this.#autopurgeTimers = purgeTimers; + this.#setItemTTL = (index, ttl, start = this.#perf.now()) => { + starts[index] = ttl !== 0 ? start : 0; + ttls[index] = ttl; + setPurgetTimer(index, ttl); + }; + this.#updateItemAge = index => { + starts[index] = ttls[index] !== 0 ? this.#perf.now() : 0; + setPurgetTimer(index, ttls[index]); + }; + // clear out the purge timer if we're setting TTL to 0, and + // previously had a ttl purge timer running, so it doesn't + // fire unnecessarily. Don't need to do this if we're not doing + // autopurge. + const setPurgetTimer = !this.ttlAutopurge ? + () => { } + : (index, ttl) => { + if (purgeTimers?.[index]) { + clearTimeout(purgeTimers[index]); + purgeTimers[index] = undefined; + } + if (ttl && ttl !== 0 && purgeTimers) { + const t = setTimeout(() => { + if (this.#isStale(index)) { + this.#delete(this.#keyList[index], 'expire'); + } + }, ttl + 1); + // unref() not supported on all platforms + /* c8 ignore start */ + if (t.unref) { + t.unref(); + } + /* c8 ignore stop */ + purgeTimers[index] = t; + } + }; + this.#statusTTL = (status, index) => { + if (ttls[index]) { + const ttl = ttls[index]; + const start = starts[index]; + /* c8 ignore start */ + if (!ttl || !start) { + return; + } + /* c8 ignore stop */ + status.ttl = ttl; + status.start = start; + status.now = cachedNow || getNow(); + const age = status.now - start; + status.remainingTTL = ttl - age; + } + }; + // debounce calls to perf.now() to 1s so we're not hitting + // that costly call repeatedly. + let cachedNow = 0; + const getNow = () => { + const n = this.#perf.now(); + if (this.ttlResolution > 0) { + cachedNow = n; + const t = setTimeout(() => (cachedNow = 0), this.ttlResolution); + // not available on all platforms + /* c8 ignore start */ + if (t.unref) { + t.unref(); + } + /* c8 ignore stop */ + } + return n; + }; + this.getRemainingTTL = key => { + const index = this.#keyMap.get(key); + if (index === undefined) { + return 0; + } + const ttl = ttls[index]; + const start = starts[index]; + if (!ttl || !start) { + return Infinity; + } + const age = (cachedNow || getNow()) - start; + return ttl - age; + }; + this.#isStale = index => { + const s = starts[index]; + const t = ttls[index]; + return !!t && !!s && (cachedNow || getNow()) - s > t; + }; + } + // conditionally set private methods related to TTL + #updateItemAge = () => { }; + #statusTTL = () => { }; + #setItemTTL = () => { }; + /* c8 ignore stop */ + #isStale = () => false; + #initializeSizeTracking() { + const sizes = new ZeroArray(this.#max); + this.#calculatedSize = 0; + this.#sizes = sizes; + this.#removeItemSize = index => { + this.#calculatedSize -= sizes[index]; + sizes[index] = 0; + }; + this.#requireSize = (k, v, size, sizeCalculation) => { + if (!isPosInt(size)) { + // provisionally accept background fetches. + // actual value size will be checked when they return. + if (this.#isBackgroundFetch(v)) { + // NB: this cannot occur if v.__staleWhileFetching is set, + // because in that case, it would take on the size of the + // existing entry that it temporarily replaces. + return this.backgroundFetchSize; + } + if (sizeCalculation) { + if (typeof sizeCalculation !== 'function') { + throw new TypeError('sizeCalculation must be a function'); + } + size = sizeCalculation(v, k); + if (!isPosInt(size)) { + throw new TypeError('sizeCalculation return invalid (expect positive integer)'); + } + } + else { + throw new TypeError('invalid size value (must be positive integer). ' + + 'When maxSize or maxEntrySize is used, sizeCalculation ' + + 'or size must be set.'); + } + } + return size; + }; + this.#addItemSize = (index, size, status) => { + sizes[index] = size; + if (this.#maxSize) { + const maxSize = this.#maxSize - sizes[index]; + while (this.#calculatedSize > maxSize) { + this.#evict(true); + } + } + this.#calculatedSize += sizes[index]; + if (status) { + status.entrySize = size; + status.totalCalculatedSize = this.#calculatedSize; + } + }; + } + #removeItemSize = _i => { }; + #addItemSize = (_i, _s, _st) => { }; + #requireSize = (_k, _v, size, sizeCalculation) => { + if (size || sizeCalculation) { + throw new TypeError('cannot set size without setting maxSize or maxEntrySize on cache'); + } + return 0; + }; + *#indexes({ allowStale = this.allowStale } = {}) { + if (this.#size) { + for (let i = this.#tail; this.#isValidIndex(i);) { + if (allowStale || !this.#isStale(i)) { + yield i; + } + if (i === this.#head) { + break; + } + else { + i = this.#prev[i]; + } + } + } + } + *#rindexes({ allowStale = this.allowStale } = {}) { + if (this.#size) { + for (let i = this.#head; this.#isValidIndex(i);) { + if (allowStale || !this.#isStale(i)) { + yield i; + } + if (i === this.#tail) { + break; + } + else { + i = this.#next[i]; + } + } + } + } + #isValidIndex(index) { + return (index !== undefined && + this.#keyMap.get(this.#keyList[index]) === index); + } + /** + * Return a generator yielding `[key, value]` pairs, + * in order from most recently used to least recently used. + */ + *entries() { + for (const i of this.#indexes()) { + if (this.#valList[i] !== undefined && + this.#keyList[i] !== undefined && + !this.#isBackgroundFetch(this.#valList[i])) { + yield [this.#keyList[i], this.#valList[i]]; + } + } + } + /** + * Inverse order version of {@link LRUCache.entries} + * + * Return a generator yielding `[key, value]` pairs, + * in order from least recently used to most recently used. + */ + *rentries() { + for (const i of this.#rindexes()) { + if (this.#valList[i] !== undefined && + this.#keyList[i] !== undefined && + !this.#isBackgroundFetch(this.#valList[i])) { + yield [this.#keyList[i], this.#valList[i]]; + } + } + } + /** + * Return a generator yielding the keys in the cache, + * in order from most recently used to least recently used. + */ + *keys() { + for (const i of this.#indexes()) { + const k = this.#keyList[i]; + if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield k; + } + } + } + /** + * Inverse order version of {@link LRUCache.keys} + * + * Return a generator yielding the keys in the cache, + * in order from least recently used to most recently used. + */ + *rkeys() { + for (const i of this.#rindexes()) { + const k = this.#keyList[i]; + if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield k; + } + } + } + /** + * Return a generator yielding the values in the cache, + * in order from most recently used to least recently used. + */ + *values() { + for (const i of this.#indexes()) { + const v = this.#valList[i]; + if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield this.#valList[i]; + } + } + } + /** + * Inverse order version of {@link LRUCache.values} + * + * Return a generator yielding the values in the cache, + * in order from least recently used to most recently used. + */ + *rvalues() { + for (const i of this.#rindexes()) { + const v = this.#valList[i]; + if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield this.#valList[i]; + } + } + } + /** + * Iterating over the cache itself yields the same results as + * {@link LRUCache.entries} + */ + [Symbol.iterator]() { + return this.entries(); + } + /** + * A String value that is used in the creation of the default string + * description of an object. Called by the built-in method + * `Object.prototype.toString`. + */ + [Symbol.toStringTag] = 'LRUCache'; + /** + * Find a value for which the supplied fn method returns a truthy value, + * similar to `Array.find()`. fn is called as `fn(value, key, cache)`. + */ + find(fn, getOptions = {}) { + for (const i of this.#indexes()) { + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined) + continue; + if (fn(value, this.#keyList[i], this)) { + return this.#get(this.#keyList[i], getOptions); + } + } + } + /** + * Call the supplied function on each item in the cache, in order from most + * recently used to least recently used. + * + * `fn` is called as `fn(value, key, cache)`. + * + * If `thisp` is provided, function will be called in the `this`-context of + * the provided object, or the cache if no `thisp` object is provided. + * + * Does not update age or recenty of use, or iterate over stale values. + */ + forEach(fn, thisp = this) { + for (const i of this.#indexes()) { + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined) + continue; + fn.call(thisp, value, this.#keyList[i], this); + } + } + /** + * The same as {@link LRUCache.forEach} but items are iterated over in + * reverse order. (ie, less recently used items are iterated over first.) + */ + rforEach(fn, thisp = this) { + for (const i of this.#rindexes()) { + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined) + continue; + fn.call(thisp, value, this.#keyList[i], this); + } + } + /** + * Delete any stale entries. Returns true if anything was removed, + * false otherwise. + */ + purgeStale() { + let deleted = false; + for (const i of this.#rindexes({ allowStale: true })) { + if (this.#isStale(i)) { + this.#delete(this.#keyList[i], 'expire'); + deleted = true; + } + } + return deleted; + } + /** + * Get the extended info about a given entry, to get its value, size, and + * TTL info simultaneously. Returns `undefined` if the key is not present. + * + * Unlike {@link LRUCache#dump}, which is designed to be portable and survive + * serialization, the `start` value is always the current timestamp, and the + * `ttl` is a calculated remaining time to live (negative if expired). + * + * Always returns stale values, if their info is found in the cache, so be + * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl}) + * if relevant. + */ + info(key) { + const i = this.#keyMap.get(key); + if (i === undefined) + return undefined; + const v = this.#valList[i]; + /* c8 ignore start - this isn't tested for the info function, + * but it's the same logic as found in other places. */ + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined) + return undefined; + /* c8 ignore stop */ + const entry = { value }; + if (this.#ttls && this.#starts) { + const ttl = this.#ttls[i]; + const start = this.#starts[i]; + if (ttl && start) { + const remain = ttl - (this.#perf.now() - start); + entry.ttl = remain; + entry.start = Date.now(); + } + } + if (this.#sizes) { + entry.size = this.#sizes[i]; + } + return entry; + } + /** + * Return an array of [key, {@link LRUCache.Entry}] tuples which can be + * passed to {@link LRUCache#load}. + * + * The `start` fields are calculated relative to a portable `Date.now()` + * timestamp, even if `performance.now()` is available. + * + * Stale entries are always included in the `dump`, even if + * {@link LRUCache.OptionsBase.allowStale} is false. + * + * Note: this returns an actual array, not a generator, so it can be more + * easily passed around. + */ + dump() { + const arr = []; + for (const i of this.#indexes({ allowStale: true })) { + const key = this.#keyList[i]; + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined || key === undefined) + continue; + const entry = { value }; + if (this.#ttls && this.#starts) { + entry.ttl = this.#ttls[i]; + // always dump the start relative to a portable timestamp + // it's ok for this to be a bit slow, it's a rare operation. + const age = this.#perf.now() - this.#starts[i]; + entry.start = Math.floor(Date.now() - age); + } + if (this.#sizes) { + entry.size = this.#sizes[i]; + } + arr.unshift([key, entry]); + } + return arr; + } + /** + * Reset the cache and load in the items in entries in the order listed. + * + * The shape of the resulting cache may be different if the same options are + * not used in both caches. + * + * The `start` fields are assumed to be calculated relative to a portable + * `Date.now()` timestamp, even if `performance.now()` is available. + */ + load(arr) { + this.clear(); + for (const [key, entry] of arr) { + if (entry.start) { + // entry.start is a portable timestamp, but we may be using + // node's performance.now(), so calculate the offset, so that + // we get the intended remaining TTL, no matter how long it's + // been on ice. + // + // it's ok for this to be a bit slow, it's a rare operation. + const age = Date.now() - entry.start; + entry.start = this.#perf.now() - age; + } + this.#set(key, entry.value, entry); + } + } + /** + * Add a value to the cache. + * + * Note: if `undefined` is specified as a value, this is an alias for + * {@link LRUCache#delete} + * + * Fields on the {@link LRUCache.SetOptions} options param will override + * their corresponding values in the constructor options for the scope + * of this single `set()` operation. + * + * If `start` is provided, then that will set the effective start + * time for the TTL calculation. Note that this must be a previous + * value of `performance.now()` if supported, or a previous value of + * `Date.now()` if not. + * + * Options object may also include `size`, which will prevent + * calling the `sizeCalculation` function and just use the specified + * number if it is a positive integer, and `noDisposeOnSet` which + * will prevent calling a `dispose` function in the case of + * overwrites. + * + * If the `size` (or return value of `sizeCalculation`) for a given + * entry is greater than `maxEntrySize`, then the item will not be + * added to the cache. + * + * Will update the recency of the entry. + * + * If the value is `undefined`, then this is an alias for + * `cache.delete(key)`. `undefined` is never stored in the cache. + */ + set(k, v, setOptions = {}) { + const { status = metrics.hasSubscribers ? {} : undefined } = setOptions; + setOptions.status = status; + if (status) { + status.op = 'set'; + status.key = k; + if (v !== undefined) + status.value = v; + status.cache = this; + } + const result = this.#set(k, v, setOptions); + if (status && metrics.hasSubscribers) { + metrics.publish(status); + } + return result; + } + #set(k, v, setOptions, bf) { + const { ttl = this.ttl, start, noDisposeOnSet = this.noDisposeOnSet, sizeCalculation = this.sizeCalculation, status, } = setOptions; + const isBF = this.#isBackgroundFetch(v); + if (v === undefined) { + if (status) + status.set = 'deleted'; + this.delete(k); + return this; + } + let { noUpdateTTL = this.noUpdateTTL } = setOptions; + if (status && !isBF) + status.value = v; + const size = this.#requireSize(k, v, setOptions.size || 0, sizeCalculation, status); + // if the item doesn't fit, don't do anything + // NB: maxEntrySize set to maxSize by default + if (this.maxEntrySize && size > this.maxEntrySize) { + // have to delete, in case something is there already. + this.#delete(k, 'set'); + if (status) { + status.set = 'miss'; + status.maxEntrySizeExceeded = true; + } + return this; + } + let index = this.#size === 0 ? undefined : this.#keyMap.get(k); + if (index === undefined) { + // addition + index = (this.#size === 0 ? this.#tail + : this.#free.length !== 0 ? this.#free.pop() + : this.#size === this.#max ? this.#evict(false) + : this.#size); + this.#keyList[index] = k; + this.#valList[index] = v; + this.#keyMap.set(k, index); + this.#next[this.#tail] = index; + this.#prev[index] = this.#tail; + this.#tail = index; + this.#size++; + this.#addItemSize(index, size, status); + if (status) + status.set = 'add'; + noUpdateTTL = false; + if (this.#hasOnInsert && !isBF) { + this.#onInsert?.(v, k, 'add'); + } + } + else { + // update + // might be updating a background fetch! + this.#moveToTail(index); + const oldVal = this.#valList[index]; + if (v !== oldVal) { + if (!noDisposeOnSet) { + if (this.#isBackgroundFetch(oldVal)) { + if (oldVal !== bf) { + // setting over a background fetch, not merely resolving it. + oldVal.__abortController.abort(new Error('replaced')); + } + const { __staleWhileFetching: s } = oldVal; + if (s !== undefined && s !== v) { + if (this.#hasDispose) { + this.#dispose?.(s, k, 'set'); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([s, k, 'set']); + } + } + } + else { + if (this.#hasDispose) { + this.#dispose?.(oldVal, k, 'set'); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([oldVal, k, 'set']); + } + } + } + this.#removeItemSize(index); + this.#addItemSize(index, size, status); + this.#valList[index] = v; + if (!isBF) { + const oldValue = oldVal && this.#isBackgroundFetch(oldVal) ? + oldVal.__staleWhileFetching + : oldVal; + const setType = oldValue === undefined ? 'add' + : v !== oldValue ? 'replace' + : 'update'; + if (status) { + status.set = setType; + if (oldValue !== undefined) + status.oldValue = oldValue; + } + if (this.#hasOnInsert) { + this.onInsert?.(v, k, setType); + } + } + } + else if (!isBF) { + if (status) { + status.set = 'update'; + } + if (this.#hasOnInsert) { + this.onInsert?.(v, k, 'update'); + } + } + } + if (ttl !== 0 && !this.#ttls) { + this.#initializeTTLTracking(); + } + if (this.#ttls) { + if (!noUpdateTTL) { + this.#setItemTTL(index, ttl, start); + } + if (status) + this.#statusTTL(status, index); + } + if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) { + const dt = this.#disposed; + let task; + while ((task = dt?.shift())) { + this.#disposeAfter?.(...task); + } + } + return this; + } + /** + * Evict the least recently used item, returning its value or + * `undefined` if cache is empty. + */ + pop() { + try { + while (this.#size) { + const val = this.#valList[this.#head]; + this.#evict(true); + if (this.#isBackgroundFetch(val)) { + if (val.__staleWhileFetching) { + return val.__staleWhileFetching; + } + } + else if (val !== undefined) { + return val; + } + } + } + finally { + if (this.#hasDisposeAfter && this.#disposed) { + const dt = this.#disposed; + let task; + while ((task = dt?.shift())) { + this.#disposeAfter?.(...task); + } + } + } + } + #evict(free) { + const head = this.#head; + const k = this.#keyList[head]; + const v = this.#valList[head]; + const isBF = this.#isBackgroundFetch(v); + if (isBF) { + v.__abortController.abort(new Error('evicted')); + } + const oldValue = isBF ? v.__staleWhileFetching : v; + if ((this.#hasDispose || this.#hasDisposeAfter) && + oldValue !== undefined) { + if (this.#hasDispose) { + this.#dispose?.(oldValue, k, 'evict'); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([oldValue, k, 'evict']); + } + } + this.#removeItemSize(head); + if (this.#autopurgeTimers?.[head]) { + clearTimeout(this.#autopurgeTimers[head]); + this.#autopurgeTimers[head] = undefined; + } + // if we aren't about to use the index, then null these out + if (free) { + this.#keyList[head] = undefined; + this.#valList[head] = undefined; + this.#free.push(head); + } + if (this.#size === 1) { + this.#head = this.#tail = 0; + this.#free.length = 0; + } + else { + this.#head = this.#next[head]; + } + this.#keyMap.delete(k); + this.#size--; + return head; + } + /** + * Check if a key is in the cache, without updating the recency of use. + * Will return false if the item is stale, even though it is technically + * in the cache. + * + * Check if a key is in the cache, without updating the recency of + * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set + * to `true` in either the options or the constructor. + * + * Will return `false` if the item is stale, even though it is technically in + * the cache. The difference can be determined (if it matters) by using a + * `status` argument, and inspecting the `has` field. + * + * Will not update item age unless + * {@link LRUCache.OptionsBase.updateAgeOnHas} is set. + */ + has(k, hasOptions = {}) { + const { status = metrics.hasSubscribers ? {} : undefined } = hasOptions; + hasOptions.status = status; + if (status) { + status.op = 'has'; + status.key = k; + status.cache = this; + } + const result = this.#has(k, hasOptions); + if (metrics.hasSubscribers) + metrics.publish(status); + return result; + } + #has(k, hasOptions = {}) { + const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions; + const index = this.#keyMap.get(k); + if (index !== undefined) { + const v = this.#valList[index]; + if (this.#isBackgroundFetch(v) && + v.__staleWhileFetching === undefined) { + return false; + } + if (!this.#isStale(index)) { + if (updateAgeOnHas) { + this.#updateItemAge(index); + } + if (status) { + status.has = 'hit'; + this.#statusTTL(status, index); + } + return true; + } + else if (status) { + status.has = 'stale'; + this.#statusTTL(status, index); + } + } + else if (status) { + status.has = 'miss'; + } + return false; + } + /** + * Like {@link LRUCache#get} but doesn't update recency or delete stale + * items. + * + * Returns `undefined` if the item is stale, unless + * {@link LRUCache.OptionsBase.allowStale} is set. + */ + peek(k, peekOptions = {}) { + const { status = hasSubscribers() ? {} : undefined } = peekOptions; + if (status) { + status.op = 'peek'; + status.key = k; + status.cache = this; + } + peekOptions.status = status; + const result = this.#peek(k, peekOptions); + if (metrics.hasSubscribers) { + metrics.publish(status); + } + return result; + } + #peek(k, peekOptions) { + const { status, allowStale = this.allowStale } = peekOptions; + const index = this.#keyMap.get(k); + if (index === undefined || (!allowStale && this.#isStale(index))) { + if (status) + status.peek = index === undefined ? 'miss' : 'stale'; + return undefined; + } + const v = this.#valList[index]; + const val = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (status) { + if (val !== undefined) { + status.peek = 'hit'; + status.value = val; + } + else { + status.peek = 'miss'; + } + } + return val; + } + #backgroundFetch(k, index, options, context) { + const v = index === undefined ? undefined : this.#valList[index]; + if (this.#isBackgroundFetch(v)) { + return v; + } + const ac = new AbortController(); + const { signal } = options; + // when/if our AC signals, then stop listening to theirs. + signal?.addEventListener('abort', () => ac.abort(signal.reason), { + signal: ac.signal, + }); + const fetchOpts = { + signal: ac.signal, + options, + context, + }; + const cb = (v, updateCache = false) => { + const { aborted } = ac.signal; + const ignoreAbort = options.ignoreFetchAbort && v !== undefined; + const proceed = options.ignoreFetchAbort || + !!(options.allowStaleOnFetchAbort && v !== undefined); + if (options.status) { + if (aborted && !updateCache) { + options.status.fetchAborted = true; + options.status.fetchError = ac.signal.reason; + if (ignoreAbort) + options.status.fetchAbortIgnored = true; + } + else { + options.status.fetchResolved = true; + } + } + if (aborted && !ignoreAbort && !updateCache) { + return fetchFail(ac.signal.reason, proceed); + } + // either we didn't abort, and are still here, or we did, and ignored + const bf = p; + // if nothing else has been written there but we're set to update the + // cache and ignore the abort, or if it's still pending on this specific + // background request, then write it to the cache. + const vl = this.#valList[index]; + if (vl === p || (vl === undefined && ignoreAbort && updateCache)) { + if (v === undefined) { + if (bf.__staleWhileFetching !== undefined) { + this.#valList[index] = bf.__staleWhileFetching; + } + else { + this.#delete(k, 'fetch'); + } + } + else { + if (options.status) + options.status.fetchUpdated = true; + this.#set(k, v, fetchOpts.options, bf); + } + } + return v; + }; + const eb = (er) => { + if (options.status) { + options.status.fetchRejected = true; + options.status.fetchError = er; + } + // do not pass go, do not collect $200 + return fetchFail(er, false); + }; + const fetchFail = (er, proceed) => { + const { aborted } = ac.signal; + const allowStaleAborted = aborted && options.allowStaleOnFetchAbort; + const allowStale = allowStaleAborted || options.allowStaleOnFetchRejection; + const noDelete = allowStale || options.noDeleteOnFetchRejection; + const bf = p; + if (this.#valList[index] === p) { + // if we allow stale on fetch rejections, then we need to ensure that + // the stale value is not removed from the cache when the fetch fails. + const del = !noDelete || (!proceed && bf.__staleWhileFetching === undefined); + if (del) { + this.#delete(k, 'fetch'); + } + else if (!allowStaleAborted) { + // still replace the *promise* with the stale value, + // since we are done with the promise at this point. + // leave it untouched if we're still waiting for an + // aborted background fetch that hasn't yet returned. + this.#valList[index] = bf.__staleWhileFetching; + } + } + if (allowStale) { + if (options.status && bf.__staleWhileFetching !== undefined) { + options.status.returnedStale = true; + } + return bf.__staleWhileFetching; + } + else if (bf.__returned === bf) { + throw er; + } + }; + const pcall = (res, rej) => { + const fmp = this.#fetchMethod?.(k, v, fetchOpts); + // ignored, we go until we finish, regardless. + // defer check until we are actually aborting, + // so fetchMethod can override. + ac.signal.addEventListener('abort', () => { + if (!options.ignoreFetchAbort || options.allowStaleOnFetchAbort) { + res(undefined); + // when it eventually resolves, update the cache. + if (options.allowStaleOnFetchAbort) { + res = v => cb(v, true); + } + } + }); + if (fmp && fmp instanceof Promise) { + fmp.then(v => res(v === undefined ? undefined : v), rej); + } + else if (fmp !== undefined) { + res(fmp); + } + }; + if (options.status) + options.status.fetchDispatched = true; + const p = new Promise(pcall).then(cb, eb); + const bf = Object.assign(p, { + __abortController: ac, + __staleWhileFetching: v, + __returned: undefined, + }); + if (index === undefined) { + // internal, don't expose status. + this.#set(k, bf, { ...fetchOpts.options, status: undefined }); + index = this.#keyMap.get(k); + } + else { + // do not call #set, because we do not want to adjust its place + // in the lru queue, as it has not yet been "used". Also, we don't + // need to worry about evicting for size, because a background fetch + // over a stale value is treated as the same size as its stale value. + this.#valList[index] = bf; + } + return bf; + } + #isBackgroundFetch(p) { + if (!this.#hasFetchMethod) + return false; + const b = p; + return (!!b && + b instanceof Promise && + b.hasOwnProperty('__staleWhileFetching') && + b.__abortController instanceof AbortController); + } + fetch(k, fetchOptions = {}) { + const ths = tracing.hasSubscribers; + const { status = hasSubscribers() ? {} : undefined } = fetchOptions; + fetchOptions.status = status; + if (status && fetchOptions.context) { + status.context = fetchOptions.context; + } + const p = this.#fetch(k, fetchOptions); + if (status && ths) { + status.trace = true; + tracing.tracePromise(() => p, status).catch(() => { }); + } + return p; + } + async #fetch(k, fetchOptions = {}) { + const { + // get options + allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, + // set options + ttl = this.ttl, noDisposeOnSet = this.noDisposeOnSet, size = 0, sizeCalculation = this.sizeCalculation, noUpdateTTL = this.noUpdateTTL, + // fetch exclusive options + noDeleteOnFetchRejection = this.noDeleteOnFetchRejection, allowStaleOnFetchRejection = this.allowStaleOnFetchRejection, ignoreFetchAbort = this.ignoreFetchAbort, allowStaleOnFetchAbort = this.allowStaleOnFetchAbort, context, forceRefresh = false, status, signal, } = fetchOptions; + if (status) { + status.op = 'fetch'; + status.key = k; + if (forceRefresh) + status.forceRefresh = true; + status.cache = this; + } + if (!this.#hasFetchMethod) { + if (status) + status.fetch = 'get'; + return this.#get(k, { + allowStale, + updateAgeOnGet, + noDeleteOnStaleGet, + status, + }); + } + const options = { + allowStale, + updateAgeOnGet, + noDeleteOnStaleGet, + ttl, + noDisposeOnSet, + size, + sizeCalculation, + noUpdateTTL, + noDeleteOnFetchRejection, + allowStaleOnFetchRejection, + allowStaleOnFetchAbort, + ignoreFetchAbort, + status, + signal, + }; + let index = this.#keyMap.get(k); + if (index === undefined) { + if (status) + status.fetch = 'miss'; + const p = this.#backgroundFetch(k, index, options, context); + return (p.__returned = p); + } + else { + // in cache, maybe already fetching + const v = this.#valList[index]; + if (this.#isBackgroundFetch(v)) { + const stale = allowStale && v.__staleWhileFetching !== undefined; + if (status) { + status.fetch = 'inflight'; + if (stale) + status.returnedStale = true; + } + return stale ? v.__staleWhileFetching : (v.__returned = v); + } + // if we force a refresh, that means do NOT serve the cached value, + // unless we are already in the process of refreshing the cache. + const isStale = this.#isStale(index); + if (!forceRefresh && !isStale) { + if (status) + status.fetch = 'hit'; + this.#moveToTail(index); + if (updateAgeOnGet) { + this.#updateItemAge(index); + } + if (status) + this.#statusTTL(status, index); + return v; + } + // ok, it is stale or a forced refresh, and not already fetching. + // refresh the cache. + const p = this.#backgroundFetch(k, index, options, context); + const hasStale = p.__staleWhileFetching !== undefined; + const staleVal = hasStale && allowStale; + if (status) { + status.fetch = isStale ? 'stale' : 'refresh'; + if (staleVal && isStale) + status.returnedStale = true; + } + return staleVal ? p.__staleWhileFetching : (p.__returned = p); + } + } + forceFetch(k, fetchOptions = {}) { + const ths = tracing.hasSubscribers; + const { status = hasSubscribers() ? {} : undefined } = fetchOptions; + fetchOptions.status = status; + if (status && fetchOptions.context) { + status.context = fetchOptions.context; + } + const p = this.#forceFetch(k, fetchOptions); + if (status && ths) { + status.trace = true; + tracing.tracePromise(() => p, status).catch(() => { }); + } + return p; + } + async #forceFetch(k, fetchOptions = {}) { + const v = await this.#fetch(k, fetchOptions); + if (v === undefined) + throw new Error('fetch() returned undefined'); + return v; + } + memo(k, memoOptions = {}) { + const { status = metrics.hasSubscribers ? {} : undefined } = memoOptions; + memoOptions.status = status; + if (status) { + status.op = 'memo'; + status.key = k; + if (memoOptions.context) { + status.context = memoOptions.context; + } + status.cache = this; + } + const result = this.#memo(k, memoOptions); + if (status) + status.value = result; + if (metrics.hasSubscribers) + metrics.publish(status); + return result; + } + #memo(k, memoOptions = {}) { + const memoMethod = this.#memoMethod; + if (!memoMethod) { + throw new Error('no memoMethod provided to constructor'); + } + const { context, status, forceRefresh, ...options } = memoOptions; + if (status && forceRefresh) + status.forceRefresh = true; + const v = this.#get(k, options); + const refresh = forceRefresh || v === undefined; + if (status) { + status.memo = refresh ? 'miss' : 'hit'; + if (!refresh) + status.value = v; + } + if (!refresh) + return v; + const vv = memoMethod(k, v, { + options, + context, + }); + if (status) + status.value = vv; + this.#set(k, vv, options); + return vv; + } + /** + * Return a value from the cache. Will update the recency of the cache + * entry found. + * + * If the key is not found, get() will return `undefined`. + */ + get(k, getOptions = {}) { + const { status = metrics.hasSubscribers ? {} : undefined } = getOptions; + getOptions.status = status; + if (status) { + status.op = 'get'; + status.key = k; + status.cache = this; + } + const result = this.#get(k, getOptions); + if (status) { + if (result !== undefined) + status.value = result; + if (metrics.hasSubscribers) + metrics.publish(status); + } + return result; + } + #get(k, getOptions = {}) { + const { allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, status, } = getOptions; + const index = this.#keyMap.get(k); + if (index === undefined) { + if (status) + status.get = 'miss'; + return undefined; + } + const value = this.#valList[index]; + const fetching = this.#isBackgroundFetch(value); + if (status) + this.#statusTTL(status, index); + if (this.#isStale(index)) { + // delete only if not an in-flight background fetch + if (!fetching) { + if (!noDeleteOnStaleGet) { + this.#delete(k, 'expire'); + } + if (status) + status.get = 'stale'; + if (allowStale) { + if (status) + status.returnedStale = true; + return value; + } + return undefined; + } + if (status) + status.get = 'stale-fetching'; + if (allowStale && value.__staleWhileFetching !== undefined) { + if (status) + status.returnedStale = true; + return value.__staleWhileFetching; + } + return undefined; + } + // not stale + if (status) + status.get = fetching ? 'fetching' : 'hit'; + // if we're currently fetching it, we don't actually have it yet + // it's not stale, which means this isn't a staleWhileRefetching. + // If it's not stale, and fetching, AND has a __staleWhileFetching + // value, then that means the user fetched with {forceRefresh:true}, + // so it's safe to return that value. + this.#moveToTail(index); + if (updateAgeOnGet) { + this.#updateItemAge(index); + } + return fetching ? value.__staleWhileFetching : value; + } + #connect(p, n) { + this.#prev[n] = p; + this.#next[p] = n; + } + #moveToTail(index) { + // if tail already, nothing to do + // if head, move head to next[index] + // else + // move next[prev[index]] to next[index] (head has no prev) + // move prev[next[index]] to prev[index] + // prev[index] = tail + // next[tail] = index + // tail = index + if (index !== this.#tail) { + if (index === this.#head) { + this.#head = this.#next[index]; + } + else { + this.#connect(this.#prev[index], this.#next[index]); + } + this.#connect(this.#tail, index); + this.#tail = index; + } + } + /** + * Deletes a key out of the cache. + * + * Returns true if the key was deleted, false otherwise. + */ + delete(k) { + return this.#delete(k, 'delete'); + } + #delete(k, reason) { + if (metrics.hasSubscribers) { + metrics.publish({ + op: 'delete', + delete: reason, + key: k, + cache: this, + }); + } + let deleted = false; + if (this.#size !== 0) { + const index = this.#keyMap.get(k); + if (index !== undefined) { + if (this.#autopurgeTimers?.[index]) { + clearTimeout(this.#autopurgeTimers?.[index]); + this.#autopurgeTimers[index] = undefined; + } + deleted = true; + if (this.#size === 1) { + this.#clear(reason); + } + else { + this.#removeItemSize(index); + const v = this.#valList[index]; + if (this.#isBackgroundFetch(v)) { + v.__abortController.abort(new Error('deleted')); + } + else if (this.#hasDispose || this.#hasDisposeAfter) { + if (this.#hasDispose) { + this.#dispose?.(v, k, reason); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([v, k, reason]); + } + } + this.#keyMap.delete(k); + this.#keyList[index] = undefined; + this.#valList[index] = undefined; + if (index === this.#tail) { + this.#tail = this.#prev[index]; + } + else if (index === this.#head) { + this.#head = this.#next[index]; + } + else { + const pi = this.#prev[index]; + this.#next[pi] = this.#next[index]; + const ni = this.#next[index]; + this.#prev[ni] = this.#prev[index]; + } + this.#size--; + this.#free.push(index); + } + } + } + if (this.#hasDisposeAfter && this.#disposed?.length) { + const dt = this.#disposed; + let task; + while ((task = dt?.shift())) { + this.#disposeAfter?.(...task); + } + } + return deleted; + } + /** + * Clear the cache entirely, throwing away all values. + */ + clear() { + return this.#clear('delete'); + } + #clear(reason) { + for (const index of this.#rindexes({ allowStale: true })) { + const v = this.#valList[index]; + if (this.#isBackgroundFetch(v)) { + v.__abortController.abort(new Error('deleted')); + } + else { + const k = this.#keyList[index]; + if (this.#hasDispose) { + this.#dispose?.(v, k, reason); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([v, k, reason]); + } + } + } + this.#keyMap.clear(); + void this.#valList.fill(undefined); + this.#keyList.fill(undefined); + if (this.#ttls && this.#starts) { + this.#ttls.fill(0); + this.#starts.fill(0); + for (const t of this.#autopurgeTimers ?? []) { + if (t !== undefined) + clearTimeout(t); + } + this.#autopurgeTimers?.fill(undefined); + } + if (this.#sizes) { + this.#sizes.fill(0); + } + this.#head = 0; + this.#tail = 0; + this.#free.length = 0; + this.#calculatedSize = 0; + this.#size = 0; + if (this.#hasDisposeAfter && this.#disposed) { + const dt = this.#disposed; + let task; + while ((task = dt?.shift())) { + this.#disposeAfter?.(...task); + } + } + } +} +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/index.js.map b/node_modules/lru-cache/dist/esm/index.js.map new file mode 100644 index 00000000..e0a2fa92 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module LRUCache\n */\n\nimport { metrics, tracing } from './diagnostics-channel.js'\nimport { defaultPerf } from './perf.js'\nimport type { Perf } from './perf.js'\nexport type { Perf } from './perf.js'\n\nconst hasSubscribers = () =>\n metrics.hasSubscribers || tracing.hasSubscribers\n\nconst warned = new Set()\n\n// either a function or a class\n// oxlint-disable-next-line no-explicit-any\ntype ForC = ((...a: any[]) => any) | { new (...a: any[]): any }\n\n/* c8 ignore start */\nconst PROCESS = (\n typeof process === 'object' && !!process ?\n process\n : {}) as { [k: string]: unknown }\n/* c8 ignore stop */\n\nconst emitWarning = (\n msg: string,\n type: string,\n code: string,\n fn: ForC,\n) => {\n if (typeof PROCESS.emitWarning === 'function') {\n PROCESS.emitWarning(msg, type, code, fn)\n } else {\n //oxlint-disable-next-line no-console\n console.error(`[${code}] ${type}: ${msg}`)\n }\n}\nconst shouldWarn = (code: string) => !warned.has(code)\n\nconst TYPE = Symbol('type')\nexport type PosInt = number & { [TYPE]: 'Positive Integer' }\nexport type Index = number & { [TYPE]: 'LRUCache Index' }\n\nconst isPosInt = (n: unknown): n is PosInt =>\n !!n && n === Math.floor(n as number) && n > 0 && isFinite(n)\n\nexport type UintArray = Uint8Array | Uint16Array | Uint32Array\nexport type NumberArray = UintArray | number[]\n\n// This is a little bit ridiculous, tbh.\n// The maximum array length is 2^32-1 or thereabouts on most JS impls.\n// And well before that point, you're caching the entire world, I mean,\n// that's ~32GB of just integers for the next/prev links, plus whatever\n// else to hold that many keys and values. Just filling the memory with\n// zeroes at init time is brutal when you get that big.\n// But why not be complete?\n// Maybe in the future, these limits will have expanded.\n/* c8 ignore start */\nconst getUintArray = (max: number) =>\n !isPosInt(max) ? null\n : max <= Math.pow(2, 8) ? Uint8Array\n : max <= Math.pow(2, 16) ? Uint16Array\n : max <= Math.pow(2, 32) ? Uint32Array\n : max <= Number.MAX_SAFE_INTEGER ? ZeroArray\n : null\n/* c8 ignore stop */\n\nclass ZeroArray extends Array {\n constructor(size: number) {\n super(size)\n this.fill(0)\n }\n}\nexport type { ZeroArray }\nexport type { Stack }\n\nexport type StackLike = Stack | Index[]\nclass Stack {\n /* c8 ignore start - not sure why this is showing up uncovered?? */\n heap: NumberArray\n /* c8 ignore stop */\n length: number\n // private constructor\n static #constructing: boolean = false\n static create(max: number): StackLike {\n const HeapCls = getUintArray(max)\n if (!HeapCls) return []\n Stack.#constructing = true\n const s = new Stack(max, HeapCls)\n Stack.#constructing = false\n return s\n }\n constructor(max: number, HeapCls: { new (n: number): NumberArray }) {\n /* c8 ignore start */\n if (!Stack.#constructing) {\n throw new TypeError('instantiate Stack using Stack.create(n)')\n }\n /* c8 ignore stop */\n this.heap = new HeapCls(max)\n this.length = 0\n }\n push(n: Index) {\n this.heap[this.length++] = n\n }\n pop(): Index {\n return this.heap[--this.length] as Index\n }\n}\n\n/**\n * Promise representing an in-progress {@link LRUCache#fetch} call\n */\nexport type BackgroundFetch = Promise & {\n __returned: BackgroundFetch | undefined\n __abortController: AbortController\n __staleWhileFetching: V | undefined\n}\n\nexport type DisposeTask = [\n value: V,\n key: K,\n reason: LRUCache.DisposeReason,\n]\n\nexport namespace LRUCache {\n /**\n * An integer greater than 0, reflecting the calculated size of items\n */\n export type Size = number\n\n /**\n * Integer greater than 0, representing some number of milliseconds, or the\n * time at which a TTL started counting from.\n */\n export type Milliseconds = number\n\n /**\n * An integer greater than 0, reflecting a number of items\n */\n export type Count = number\n\n /**\n * The reason why an item was removed from the cache, passed\n * to the {@link Disposer} methods.\n *\n * - `evict`: The item was evicted because it is the least recently used,\n * and the cache is full.\n * - `set`: A new value was set, overwriting the old value being disposed.\n * - `delete`: The item was explicitly deleted, either by calling\n * {@link LRUCache#delete}, {@link LRUCache#clear}, or\n * {@link LRUCache#set} with an undefined value.\n * - `expire`: The item was removed due to exceeding its TTL.\n * - `fetch`: A {@link OptionsBase#fetchMethod} operation returned\n * `undefined` or was aborted, causing the item to be deleted.\n */\n export type DisposeReason =\n | 'evict'\n | 'set'\n | 'delete'\n | 'expire'\n | 'fetch'\n /**\n * A method called upon item removal, passed as the\n * {@link OptionsBase.dispose} and/or\n * {@link OptionsBase.disposeAfter} options.\n */\n export type Disposer = (\n value: V,\n key: K,\n reason: DisposeReason,\n ) => void\n\n /**\n * The reason why an item was added to the cache, passed\n * to the {@link Inserter} methods.\n *\n * - `add`: the item was not found in the cache, and was added\n * - `update`: the item was in the cache, with the same value provided\n * - `replace`: the item was in the cache, and replaced\n */\n export type InsertReason = 'add' | 'update' | 'replace'\n\n /**\n * A method called upon item insertion, passed as the\n * {@link OptionsBase.insert}\n */\n export type Inserter = (\n value: V,\n key: K,\n reason: InsertReason,\n ) => void\n\n /**\n * A function that returns the effective calculated size\n * of an entry in the cache.\n */\n export type SizeCalculator = (value: V, key: K) => Size\n\n /**\n * Options provided to the\n * {@link OptionsBase.fetchMethod} function.\n */\n export interface FetcherOptions {\n signal: AbortSignal\n options: FetcherFetchOptions\n /**\n * Object provided in the {@link FetchOptions.context} option to\n * {@link LRUCache#fetch}\n */\n context: FC\n }\n\n /**\n * Occasionally, it may be useful to track the internal behavior of the\n * cache, particularly for logging, debugging, or for behavior within the\n * `fetchMethod`. To do this, you can pass a `status` object to the\n * {@link LRUCache#fetch}, {@link LRUCache#get}, {@link LRUCache#set},\n * {@link LRUCache#memo}, and {@link LRUCache#has} methods.\n *\n * The `status` option should be a plain JavaScript object. The following\n * fields will be set on it appropriately, depending on the situation.\n *\n * These objects are also the context objects passed to listeners on the\n * `lru-cache:metrics` diagnostic channel, and the `lru-cache` tracing\n * channels, in platforms that support them.\n */\n export interface Status {\n /**\n * The operation being performed\n */\n op?: 'get' | 'set' | 'memo' | 'fetch' | 'delete' | 'has' | 'peek'\n /**\n * The status of a set() operation.\n *\n * - add: the item was not found in the cache, and was added\n * - update: the item was in the cache, with the same value provided\n * - replace: the item was in the cache, and replaced\n * - miss: the item was not added to the cache for some reason\n */\n set?: 'add' | 'update' | 'replace' | 'miss' | 'deleted'\n\n /**\n * The status of a delete() operation.\n */\n delete?: LRUCache.DisposeReason\n\n /**\n * The result of a peek() operation\n *\n * - hit: the item was found and returned\n * - stale: the item is in the cache, but past its ttl and not returned\n * - miss: item not in the cache\n */\n peek?: 'hit' | 'miss' | 'stale'\n\n /**\n * The status of a memo() operation.\n *\n * - 'hit': the item was found in the cache and returned\n * - 'miss': the `memoMethod` function was called\n */\n memo?: 'hit' | 'miss'\n\n /**\n * The `context` option provided to a memo or fetch operation\n *\n * In practice, of course, this will be the same type as the `FC`\n * fetch context param used to instantiate the LRUCache, but the\n * convolutions of threading that through would get quite complicated,\n * and preclude forcing/forbidding the passing of a `context` param\n * where it is/isn't expected, which is more valuable for error\n * prevention.\n */\n context?: unknown\n\n /**\n * the ttl stored for the item, or undefined if ttls are not used.\n */\n ttl?: Milliseconds\n\n /**\n * the start time for the item, or undefined if ttls are not used.\n */\n start?: Milliseconds\n\n /**\n * The timestamp used for TTL calculation\n */\n now?: Milliseconds\n\n /**\n * the remaining ttl for the item, or undefined if ttls are not used.\n */\n remainingTTL?: Milliseconds\n\n /**\n * The calculated size for the item, if sizes are used.\n */\n entrySize?: Size\n\n /**\n * The total calculated size of the cache, if sizes are used.\n */\n totalCalculatedSize?: Size\n\n /**\n * A flag indicating that the item was not stored, due to exceeding the\n * {@link OptionsBase.maxEntrySize}\n */\n maxEntrySizeExceeded?: true\n\n /**\n * The key that was set or retrieved\n */\n key?: K\n\n /**\n * The value that was set\n */\n value?: V\n\n /**\n * The old value, specified in the case of `set:'replace'`\n */\n oldValue?: V\n\n /**\n * The results of a {@link LRUCache#has} operation\n *\n * - hit: the item was found in the cache\n * - stale: the item was found in the cache, but is stale\n * - miss: the item was not found in the cache\n */\n has?: 'hit' | 'stale' | 'miss'\n\n /**\n * The status of a {@link LRUCache#fetch} operation.\n * Note that this can change as the underlying fetch() moves through\n * various states.\n *\n * - inflight: there is another fetch() for this key which is in process\n * - get: there is no {@link OptionsBase.fetchMethod}, so\n * {@link LRUCache#get} was called.\n * - miss: the item is not in cache, and will be fetched.\n * - hit: the item is in the cache, and was resolved immediately.\n * - stale: the item is in the cache, but stale.\n * - refresh: the item is in the cache, and not stale, but\n * {@link FetchOptions.forceRefresh} was specified.\n */\n fetch?: 'get' | 'inflight' | 'miss' | 'hit' | 'stale' | 'refresh'\n\n /**\n * `forceRefresh` option was used for either a fetch or memo operation\n */\n forceRefresh?: boolean\n\n /**\n * The {@link OptionsBase.fetchMethod} was called\n */\n fetchDispatched?: true\n\n /**\n * The cached value was updated after a successful call to\n * {@link OptionsBase.fetchMethod}\n */\n fetchUpdated?: true\n\n /**\n * The reason for a fetch() rejection. Either the error raised by the\n * {@link OptionsBase.fetchMethod}, or the reason for an\n * AbortSignal.\n */\n fetchError?: Error\n\n /**\n * The fetch received an abort signal\n */\n fetchAborted?: true\n\n /**\n * The abort signal received was ignored, and the fetch was allowed to\n * continue in the background.\n */\n fetchAbortIgnored?: true\n\n /**\n * The fetchMethod promise resolved successfully\n */\n fetchResolved?: true\n\n /**\n * The fetchMethod promise was rejected\n */\n fetchRejected?: true\n\n /**\n * The status of a {@link LRUCache#get} operation.\n *\n * - fetching: The item is currently being fetched. If a previous value\n * is present and allowed, that will be returned.\n * - stale: The item is in the cache, and is stale. If it was returned,\n * then the `returnedStale` flag will be set.\n * - stale-fetching: The value is being fetched in the background, but is\n * currently stale. If the stale value was returned, then the\n * `returnedStale` flag will be set.\n * - hit: the item is in the cache\n * - miss: the item is not in the cache\n */\n get?: 'stale' | 'hit' | 'miss' | 'fetching' | 'stale-fetching'\n\n /**\n * A fetch or get operation returned a stale value.\n */\n returnedStale?: true\n\n /**\n * A tracingChannel trace was started for this operation\n */\n trace?: boolean\n\n /**\n * A reference to the cache instance associated with this operation\n */\n cache?: LRUCache\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#fetch}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link OptionsBase.noDeleteOnFetchRejection},\n * {@link OptionsBase.allowStaleOnFetchRejection},\n * {@link FetchOptions.forceRefresh}, and\n * {@link FetcherOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.fetchMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the fetchMethod is called.\n */\n export interface FetcherFetchOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n status?: Status\n size?: Size\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#fetch} method.\n */\n export interface FetchOptions extends FetcherFetchOptions<\n K,\n V,\n FC\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.fetchMethod} as\n * the {@link FetcherOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n signal?: AbortSignal\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface FetchOptionsWithContext extends FetchOptions<\n K,\n V,\n FC\n > {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is\n * `undefined` or `void`\n */\n export interface FetchOptionsNoContext<\n K,\n V,\n FC extends undefined | void = undefined,\n > extends FetchOptions {\n context?: FC\n }\n\n export interface MemoOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.memoMethod} as\n * the {@link MemoizerOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface MemoOptionsWithContext extends MemoOptions<\n K,\n V,\n FC\n > {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is\n * `undefined` or `void`\n */\n export interface MemoOptionsNoContext<\n K,\n V,\n FC extends undefined | void = undefined,\n > extends MemoOptions {\n context?: FC\n }\n\n /**\n * Options provided to the\n * {@link OptionsBase.memoMethod} function.\n */\n export interface MemoizerOptions {\n options: MemoizerMemoOptions\n /**\n * Object provided in the {@link MemoOptions.context} option to\n * {@link LRUCache#memo}\n */\n context: FC\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#memo}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link MemoOptions.forceRefresh}, and\n * {@link MemoOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.memoMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the memoMethod is called.\n */\n export interface MemoizerMemoOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n > {\n status?: Status\n size?: Size\n start?: Milliseconds\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#has} method.\n */\n export interface HasOptions extends Pick<\n OptionsBase,\n 'updateAgeOnHas'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#get} method.\n */\n export interface GetOptions extends Pick<\n OptionsBase,\n 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#peek} method.\n */\n export interface PeekOptions extends Pick<\n OptionsBase,\n 'allowStale'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#set} method.\n */\n export interface SetOptions extends Pick<\n OptionsBase,\n 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'\n > {\n /**\n * If size tracking is enabled, then setting an explicit size\n * in the {@link LRUCache#set} call will prevent calling the\n * {@link OptionsBase.sizeCalculation} function.\n */\n size?: Size\n /**\n * If TTL tracking is enabled, then setting an explicit start\n * time in the {@link LRUCache#set} call will override the\n * default time from `performance.now()` or `Date.now()`.\n *\n * Note that it must be a valid value for whichever time-tracking\n * method is in use.\n */\n start?: Milliseconds\n status?: Status\n }\n\n /**\n * The type signature for the {@link OptionsBase.fetchMethod} option.\n */\n export type Fetcher = (\n key: K,\n staleValue: V | undefined,\n options: FetcherOptions,\n ) => Promise | V | undefined | void\n\n /**\n * the type signature for the {@link OptionsBase.memoMethod} option.\n */\n export type Memoizer = (\n key: K,\n staleValue: V | undefined,\n options: MemoizerOptions,\n ) => V\n\n /**\n * Options which may be passed to the {@link LRUCache} constructor.\n *\n * Most of these may be overridden in the various options that use\n * them.\n *\n * Despite all being technically optional, the constructor requires that\n * a cache is at minimum limited by one or more of {@link OptionsBase.max},\n * {@link OptionsBase.ttl}, or {@link OptionsBase.maxSize}.\n *\n * If {@link OptionsBase.ttl} is used alone, then it is strongly advised\n * (and in fact required by the type definitions here) that the cache\n * also set {@link OptionsBase.ttlAutopurge}, to prevent potentially\n * unbounded storage.\n *\n * All options are also available on the {@link LRUCache} instance, making\n * it safe to pass an LRUCache instance as the options argumemnt to\n * make another empty cache of the same type.\n *\n * Some options are marked as read-only, because changing them after\n * instantiation is not safe. Changing any of the other options will of\n * course only have an effect on subsequent method calls.\n */\n export interface OptionsBase {\n /**\n * The maximum number of items to store in the cache before evicting\n * old entries. This is read-only on the {@link LRUCache} instance,\n * and may not be overridden.\n *\n * If set, then storage space will be pre-allocated at construction\n * time, and the cache will perform significantly faster.\n *\n * Note that significantly fewer items may be stored, if\n * {@link OptionsBase.maxSize} and/or {@link OptionsBase.ttl} are also\n * set.\n *\n * **It is strongly recommended to set a `max` to prevent unbounded growth\n * of the cache.**\n */\n max?: Count\n\n /**\n * Max time in milliseconds for items to live in cache before they are\n * considered stale. Note that stale items are NOT preemptively removed by\n * default, and MAY live in the cache, contributing to its LRU max, long\n * after they have expired, unless {@link OptionsBase.ttlAutopurge} is\n * set.\n *\n * If set to `0` (the default value), then that means \"do not track\n * TTL\", not \"expire immediately\".\n *\n * Also, as this cache is optimized for LRU/MRU operations, some of\n * the staleness/TTL checks will reduce performance, as they will incur\n * overhead by deleting items.\n *\n * This is not primarily a TTL cache, and does not make strong TTL\n * guarantees. There is no pre-emptive pruning of expired items, but you\n * _may_ set a TTL on the cache, and it will treat expired items as missing\n * when they are fetched, and delete them.\n *\n * Optional, but must be a non-negative integer in ms if specified.\n *\n * This may be overridden by passing an options object to `cache.set()`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if ttl tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * If ttl tracking is enabled, and `max` and `maxSize` are not set,\n * and `ttlAutopurge` is not set, then a warning will be emitted\n * cautioning about the potential for unbounded memory consumption.\n * (The TypeScript definitions will also discourage this.)\n */\n ttl?: Milliseconds\n\n /**\n * Minimum amount of time in ms in which to check for staleness.\n * Defaults to 1, which means that the current time is checked\n * at most once per millisecond.\n *\n * Set to 0 to check the current time every time staleness is tested.\n * (This reduces performance, and is theoretically unnecessary.)\n *\n * Setting this to a higher value will improve performance somewhat\n * while using ttl tracking, albeit at the expense of keeping stale\n * items around a bit longer than their TTLs would indicate.\n *\n * @default 1\n */\n ttlResolution?: Milliseconds\n\n /**\n * Preemptively remove stale items from the cache.\n *\n * Note that this may *significantly* degrade performance, especially if\n * the cache is storing a large number of items. It is almost always best\n * to just leave the stale items in the cache, and let them fall out as new\n * items are added.\n *\n * Note that this means that {@link OptionsBase.allowStale} is a bit\n * pointless, as stale items will be deleted almost as soon as they\n * expire.\n *\n * Use with caution!\n */\n ttlAutopurge?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever it is retrieved from cache with\n * {@link LRUCache#get}, causing it to not expire. (It can still fall out\n * of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n */\n updateAgeOnGet?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever its presence in the cache is\n * checked with {@link LRUCache#has}, causing it to not expire. (It can\n * still fall out of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n */\n updateAgeOnHas?: boolean\n\n /**\n * Allow {@link LRUCache#get} and {@link LRUCache#fetch} calls to return\n * stale data, if available.\n *\n * By default, if you set `ttl`, stale items will only be deleted from the\n * cache when you `get(key)`. That is, it's not preemptively pruning items,\n * unless {@link OptionsBase.ttlAutopurge} is set.\n *\n * If you set `allowStale:true`, it'll return the stale value *as well as*\n * deleting it. If you don't set this, then it'll return `undefined` when\n * you try to get a stale entry.\n *\n * Note that when a stale entry is fetched, _even if it is returned due to\n * `allowStale` being set_, it is removed from the cache immediately. You\n * can suppress this behavior by setting\n * {@link OptionsBase.noDeleteOnStaleGet}, either in the constructor, or in\n * the options provided to {@link LRUCache#get}.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n * The `cache.has()` method will always return `false` for stale items.\n *\n * Only relevant if a ttl is set.\n */\n allowStale?: boolean\n\n /**\n * Function that is called on items when they are dropped from the\n * cache, as `dispose(value, key, reason)`.\n *\n * This can be handy if you want to close file descriptors or do\n * other cleanup tasks when items are no longer stored in the cache.\n *\n * **NOTE**: It is called _before_ the item has been fully removed\n * from the cache, so if you want to put it right back in, you need\n * to wait until the next tick. If you try to add it back in during\n * the `dispose()` function call, it will break things in subtle and\n * weird ways.\n *\n * Unlike several other options, this may _not_ be overridden by\n * passing an option to `set()`, for performance reasons.\n *\n * The `reason` will be one of the following strings, corresponding\n * to the reason for the item's deletion:\n *\n * - `evict` Item was evicted to make space for a new addition\n * - `set` Item was overwritten by a new value\n * - `expire` Item expired its TTL\n * - `fetch` Item was deleted due to a failed or aborted fetch, or a\n * fetchMethod returning `undefined.\n * - `delete` Item was removed by explicit `cache.delete(key)`,\n * `cache.clear()`, or `cache.set(key, undefined)`.\n */\n dispose?: Disposer\n\n /**\n * Function that is called when new items are inserted into the cache,\n * as `onInsert(value, key, reason)`.\n *\n * This can be useful if you need to perform actions when an item is\n * added, such as logging or tracking insertions.\n *\n * Unlike some other options, this may _not_ be overridden by passing\n * an option to `set()`, for performance and consistency reasons.\n */\n onInsert?: Inserter\n\n /**\n * The same as {@link OptionsBase.dispose}, but called *after* the entry\n * is completely removed and the cache is once again in a clean state.\n *\n * It is safe to add an item right back into the cache at this point.\n * However, note that it is *very* easy to inadvertently create infinite\n * recursion this way.\n */\n disposeAfter?: Disposer\n\n /**\n * Set to true to suppress calling the\n * {@link OptionsBase.dispose} function if the entry key is\n * still accessible within the cache.\n *\n * This may be overridden by passing an options object to\n * {@link LRUCache#set}.\n *\n * Only relevant if `dispose` or `disposeAfter` are set.\n */\n noDisposeOnSet?: boolean\n\n /**\n * Boolean flag to tell the cache to not update the TTL when setting a new\n * value for an existing key (ie, when updating a value rather than\n * inserting a new value). Note that the TTL value is _always_ set (if\n * provided) when adding a new entry into the cache.\n *\n * Has no effect if a {@link OptionsBase.ttl} is not set.\n *\n * May be passed as an option to {@link LRUCache#set}.\n */\n noUpdateTTL?: boolean\n\n /**\n * Set to a positive integer to track the sizes of items added to the\n * cache, and automatically evict items in order to stay below this size.\n * Note that this may result in fewer than `max` items being stored.\n *\n * Attempting to add an item to the cache whose calculated size is greater\n * that this amount will be a no-op. The item will not be cached, and no\n * other items will be evicted.\n *\n * Optional, must be a positive integer if provided.\n *\n * Sets `maxEntrySize` to the same value, unless a different value is\n * provided for `maxEntrySize`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if size tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * Note also that size tracking can negatively impact performance,\n * though for most cases, only minimally.\n */\n maxSize?: Size\n\n /**\n * The effective size for background fetch promises.\n *\n * This has no effect unless `maxSize` and `sizeCalculation` are used,\n * and a {@link LRUCache.OptionsBase.fetchMethod} is provided to\n * support {@link LRUCache#fetch}.\n *\n * If a stale value is present in the cache, then the effective size of\n * the background fetch is the size of the stale item it will eventually\n * replace. If not, then this value is used as its effective size.\n *\n * @default 1\n */\n backgroundFetchSize?: number\n\n /**\n * The maximum allowed size for any single item in the cache.\n *\n * If a larger item is passed to {@link LRUCache#set} or returned by a\n * {@link OptionsBase.fetchMethod} or {@link OptionsBase.memoMethod}, then\n * it will not be stored in the cache.\n *\n * Attempting to add an item whose calculated size is greater than\n * this amount will not cache the item or evict any old items, but\n * WILL delete an existing value if one is already present.\n *\n * Optional, must be a positive integer if provided. Defaults to\n * the value of `maxSize` if provided.\n */\n maxEntrySize?: Size\n\n /**\n * A function that returns a number indicating the item's size.\n *\n * Requires {@link OptionsBase.maxSize} to be set.\n *\n * If not provided, and {@link OptionsBase.maxSize} or\n * {@link OptionsBase.maxEntrySize} are set, then all\n * {@link LRUCache#set} calls **must** provide an explicit\n * {@link SetOptions.size} or sizeCalculation param.\n */\n sizeCalculation?: SizeCalculator\n\n /**\n * Method that provides the implementation for {@link LRUCache#fetch}\n *\n * ```ts\n * fetchMethod(key, staleValue, { signal, options, context })\n * ```\n *\n * If `fetchMethod` is not provided, then `cache.fetch(key)` is equivalent\n * to `Promise.resolve(cache.get(key))`.\n *\n * If at any time, `signal.aborted` is set to `true`, or if the\n * `signal.onabort` method is called, or if it emits an `'abort'` event\n * which you can listen to with `addEventListener`, then that means that\n * the fetch should be abandoned. This may be passed along to async\n * functions aware of AbortController/AbortSignal behavior.\n *\n * The `fetchMethod` should **only** return `undefined` or a Promise\n * resolving to `undefined` if the AbortController signaled an `abort`\n * event. In all other cases, it should return or resolve to a value\n * suitable for adding to the cache.\n *\n * The `options` object is a union of the options that may be provided to\n * `set()` and `get()`. If they are modified, then that will result in\n * modifying the settings to `cache.set()` when the value is resolved, and\n * in the case of\n * {@link OptionsBase.noDeleteOnFetchRejection} and\n * {@link OptionsBase.allowStaleOnFetchRejection}, the handling of\n * `fetchMethod` failures.\n *\n * For example, a DNS cache may update the TTL based on the value returned\n * from a remote DNS server by changing `options.ttl` in the `fetchMethod`.\n */\n fetchMethod?: Fetcher\n\n /**\n * Method that provides the implementation for {@link LRUCache#memo}\n */\n memoMethod?: Memoizer\n\n /**\n * Set to true to suppress the deletion of stale data when a\n * {@link OptionsBase.fetchMethod} returns a rejected promise.\n */\n noDeleteOnFetchRejection?: boolean\n\n /**\n * Do not delete stale items when they are retrieved with\n * {@link LRUCache#get}.\n *\n * Note that the `get` return value will still be `undefined`\n * unless {@link OptionsBase.allowStale} is true.\n *\n * When using time-expiring entries with `ttl`, by default stale\n * items will be removed from the cache when the key is accessed\n * with `cache.get()`.\n *\n * Setting this option will cause stale items to remain in the cache, until\n * they are explicitly deleted with `cache.delete(key)`, or retrieved with\n * `noDeleteOnStaleGet` set to `false`.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n *\n * Only relevant if a ttl is used.\n */\n noDeleteOnStaleGet?: boolean\n\n /**\n * Set to true to allow returning stale data when a\n * {@link OptionsBase.fetchMethod} throws an error or returns a rejected\n * promise.\n *\n * This differs from using {@link OptionsBase.allowStale} in that stale\n * data will ONLY be returned in the case that the {@link LRUCache#fetch}\n * fails, not any other times.\n *\n * If a `fetchMethod` fails, and there is no stale value available, the\n * `fetch()` will resolve to `undefined`. Ie, all `fetchMethod` errors are\n * suppressed.\n *\n * Implies `noDeleteOnFetchRejection`.\n *\n * This may be set in calls to `fetch()`, or defaulted on the constructor,\n * or overridden by modifying the options object in the `fetchMethod`.\n */\n allowStaleOnFetchRejection?: boolean\n\n /**\n * Set to true to return a stale value from the cache when the\n * `AbortSignal` passed to the {@link OptionsBase.fetchMethod} dispatches\n * an `'abort'` event, whether user-triggered, or due to internal cache\n * behavior.\n *\n * Unless {@link OptionsBase.ignoreFetchAbort} is also set, the underlying\n * {@link OptionsBase.fetchMethod} will still be considered canceled, and\n * any value it returns will be ignored and not cached.\n *\n * Caveat: since fetches are aborted when a new value is explicitly\n * set in the cache, this can lead to fetch returning a stale value,\n * since that was the fallback value _at the moment the `fetch()` was\n * initiated_, even though the new updated value is now present in\n * the cache.\n *\n * For example:\n *\n * ```ts\n * const cache = new LRUCache({\n * ttl: 100,\n * fetchMethod: async (url, oldValue, { signal }) => {\n * const res = await fetch(url, { signal })\n * return await res.json()\n * }\n * })\n * cache.set('https://example.com/', { some: 'data' })\n * // 100ms go by...\n * const result = cache.fetch('https://example.com/')\n * cache.set('https://example.com/', { other: 'thing' })\n * console.log(await result) // { some: 'data' }\n * console.log(cache.get('https://example.com/')) // { other: 'thing' }\n * ```\n */\n allowStaleOnFetchAbort?: boolean\n\n /**\n * Set to true to ignore the `abort` event emitted by the `AbortSignal`\n * object passed to {@link OptionsBase.fetchMethod}, and still cache the\n * resulting resolution value, as long as it is not `undefined`.\n *\n * When used on its own, this means aborted {@link LRUCache#fetch} calls\n * are not immediately resolved or rejected when they are aborted, and\n * instead take the full time to await.\n *\n * When used with {@link OptionsBase.allowStaleOnFetchAbort}, aborted\n * {@link LRUCache#fetch} calls will resolve immediately to their stale\n * cached value or `undefined`, and will continue to process and eventually\n * update the cache when they resolve, as long as the resulting value is\n * not `undefined`, thus supporting a \"return stale on timeout while\n * refreshing\" mechanism by passing `AbortSignal.timeout(n)` as the signal.\n *\n * For example:\n *\n * ```ts\n * const c = new LRUCache({\n * ttl: 100,\n * ignoreFetchAbort: true,\n * allowStaleOnFetchAbort: true,\n * fetchMethod: async (key, oldValue, { signal }) => {\n * // note: do NOT pass the signal to fetch()!\n * // let's say this fetch can take a long time.\n * const res = await fetch(`https://slow-backend-server/${key}`)\n * return await res.json()\n * },\n * })\n *\n * // this will return the stale value after 100ms, while still\n * // updating in the background for next time.\n * const val = await c.fetch('key', { signal: AbortSignal.timeout(100) })\n * ```\n *\n * **Note**: regardless of this setting, an `abort` event _is still\n * emitted on the `AbortSignal` object_, so may result in invalid results\n * when passed to other underlying APIs that use AbortSignals.\n *\n * This may be overridden in the {@link OptionsBase.fetchMethod} or the\n * call to {@link LRUCache#fetch}.\n */\n ignoreFetchAbort?: boolean\n\n /**\n * In some cases, you may want to swap out the performance/Date object\n * used for TTL tracking. This should almost certainly NOT be done in\n * production environments!\n *\n * This value defaults to `global.performance` if it has a `now()` method,\n * or the `global.Date` object otherwise.\n */\n perf?: Perf\n }\n\n export interface OptionsMaxLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n max: Count\n }\n export interface OptionsTTLLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n ttl: Milliseconds\n ttlAutopurge: boolean\n }\n export interface OptionsSizeLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n maxSize: Size\n }\n\n /**\n * The valid safe options for the {@link LRUCache} constructor\n */\n export type Options =\n | OptionsMaxLimit\n | OptionsSizeLimit\n | OptionsTTLLimit\n\n /**\n * Entry objects used by {@link LRUCache#load} and {@link LRUCache#dump},\n * and returned by {@link LRUCache#info}.\n */\n export interface Entry {\n value: V\n ttl?: Milliseconds\n size?: Size\n start?: Milliseconds\n }\n}\n\n/**\n * Default export, the thing you're using this module to get.\n *\n * The `K` and `V` types define the key and value types, respectively. The\n * optional `FC` type defines the type of the `context` object passed to\n * `cache.fetch()` and `cache.memo()`.\n *\n * Keys and values **must not** be `null` or `undefined`.\n *\n * All properties from the options object (with the exception of `max`,\n * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are\n * added as normal public members. (The listed options are read-only getters.)\n *\n * Changing any of these will alter the defaults for subsequent method calls.\n */\nexport class LRUCache {\n // options that cannot be changed without disaster\n readonly #max: LRUCache.Count\n readonly #maxSize: LRUCache.Size\n readonly #dispose?: LRUCache.Disposer\n readonly #onInsert?: LRUCache.Inserter\n readonly #disposeAfter?: LRUCache.Disposer\n readonly #fetchMethod?: LRUCache.Fetcher\n readonly #memoMethod?: LRUCache.Memoizer\n readonly #perf: Perf\n\n /**\n * {@link LRUCache.OptionsBase.perf}\n */\n get perf() {\n return this.#perf\n }\n\n /**\n * {@link LRUCache.OptionsBase.ttl}\n */\n ttl: LRUCache.Milliseconds\n\n /**\n * {@link LRUCache.OptionsBase.ttlResolution}\n */\n ttlResolution: LRUCache.Milliseconds\n /**\n * {@link LRUCache.OptionsBase.ttlAutopurge}\n */\n ttlAutopurge: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnGet}\n */\n updateAgeOnGet: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnHas}\n */\n updateAgeOnHas: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStale}\n */\n allowStale: boolean\n\n /**\n * {@link LRUCache.OptionsBase.noDisposeOnSet}\n */\n noDisposeOnSet: boolean\n /**\n * {@link LRUCache.OptionsBase.noUpdateTTL}\n */\n noUpdateTTL: boolean\n /**\n * {@link LRUCache.OptionsBase.maxEntrySize}\n */\n maxEntrySize: LRUCache.Size\n /**\n * {@link LRUCache.OptionsBase.sizeCalculation}\n */\n sizeCalculation?: LRUCache.SizeCalculator\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection}\n */\n noDeleteOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnStaleGet}\n */\n noDeleteOnStaleGet: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}\n */\n allowStaleOnFetchAbort: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection}\n */\n allowStaleOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.ignoreFetchAbort}\n */\n ignoreFetchAbort: boolean\n\n /** {@link LRUCache.OptionsBase.backgroundFetchSize} */\n backgroundFetchSize: number\n\n // computed properties\n #size: LRUCache.Count\n #calculatedSize: LRUCache.Size\n #keyMap: Map\n #keyList: (K | undefined)[]\n #valList: (V | BackgroundFetch | undefined)[]\n #next: NumberArray\n #prev: NumberArray\n #head: Index\n #tail: Index\n #free: StackLike\n #disposed?: DisposeTask[]\n #sizes?: ZeroArray\n #starts?: ZeroArray\n #ttls?: ZeroArray\n #autopurgeTimers?: (undefined | ReturnType)[]\n\n #hasDispose: boolean\n #hasFetchMethod: boolean\n #hasDisposeAfter: boolean\n #hasOnInsert: boolean\n\n /**\n * Do not call this method unless you need to inspect the\n * inner workings of the cache. If anything returned by this\n * object is modified in any way, strange breakage may occur.\n *\n * These fields are private for a reason!\n *\n * @internal\n */\n static unsafeExposeInternals<\n K extends {},\n V extends {},\n FC extends unknown = unknown,\n >(c: LRUCache) {\n return {\n // properties\n starts: c.#starts,\n ttls: c.#ttls,\n autopurgeTimers: c.#autopurgeTimers,\n sizes: c.#sizes,\n keyMap: c.#keyMap as Map,\n keyList: c.#keyList,\n valList: c.#valList,\n next: c.#next,\n prev: c.#prev,\n get head() {\n return c.#head\n },\n get tail() {\n return c.#tail\n },\n free: c.#free,\n // methods\n isBackgroundFetch: (p: unknown) => c.#isBackgroundFetch(p),\n backgroundFetch: (\n k: K,\n index: number | undefined,\n options: LRUCache.FetchOptions,\n context: unknown,\n ): BackgroundFetch =>\n c.#backgroundFetch(\n k,\n index as Index | undefined,\n options,\n context as FC,\n ),\n moveToTail: (index: number): void => c.#moveToTail(index as Index),\n indexes: (options?: { allowStale: boolean }) => c.#indexes(options),\n rindexes: (options?: { allowStale: boolean }) =>\n c.#rindexes(options),\n isStale: (index: number | undefined) => c.#isStale(index as Index),\n }\n }\n\n // Protected read-only members\n\n /**\n * {@link LRUCache.OptionsBase.max} (read-only)\n */\n get max(): LRUCache.Count {\n return this.#max\n }\n /**\n * {@link LRUCache.OptionsBase.maxSize} (read-only)\n */\n get maxSize(): LRUCache.Count {\n return this.#maxSize\n }\n /**\n * The total computed size of items in the cache (read-only)\n */\n get calculatedSize(): LRUCache.Size {\n return this.#calculatedSize\n }\n /**\n * The number of items stored in the cache (read-only)\n */\n get size(): LRUCache.Count {\n return this.#size\n }\n /**\n * {@link LRUCache.OptionsBase.fetchMethod} (read-only)\n */\n get fetchMethod(): LRUCache.Fetcher | undefined {\n return this.#fetchMethod\n }\n get memoMethod(): LRUCache.Memoizer | undefined {\n return this.#memoMethod\n }\n /**\n * {@link LRUCache.OptionsBase.dispose} (read-only)\n */\n get dispose() {\n return this.#dispose\n }\n /**\n * {@link LRUCache.OptionsBase.onInsert} (read-only)\n */\n get onInsert() {\n return this.#onInsert\n }\n /**\n * {@link LRUCache.OptionsBase.disposeAfter} (read-only)\n */\n get disposeAfter() {\n return this.#disposeAfter\n }\n\n constructor(options: LRUCache.Options | LRUCache) {\n const {\n max = 0,\n ttl,\n ttlResolution = 1,\n ttlAutopurge,\n updateAgeOnGet,\n updateAgeOnHas,\n allowStale,\n dispose,\n onInsert,\n disposeAfter,\n noDisposeOnSet,\n noUpdateTTL,\n maxSize = 0,\n maxEntrySize = 0,\n sizeCalculation,\n fetchMethod,\n memoMethod,\n noDeleteOnFetchRejection,\n noDeleteOnStaleGet,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n backgroundFetchSize = 1,\n perf,\n } = options\n\n this.backgroundFetchSize = backgroundFetchSize\n\n if (perf !== undefined) {\n if (typeof perf?.now !== 'function') {\n throw new TypeError(\n 'perf option must have a now() method if specified',\n )\n }\n }\n\n this.#perf = perf ?? defaultPerf\n\n if (max !== 0 && !isPosInt(max)) {\n throw new TypeError('max option must be a nonnegative integer')\n }\n\n const UintArray = max ? getUintArray(max) : Array\n if (!UintArray) {\n throw new Error('invalid max value: ' + max)\n }\n\n this.#max = max\n this.#maxSize = maxSize\n this.maxEntrySize = maxEntrySize || this.#maxSize\n this.sizeCalculation = sizeCalculation\n if (this.sizeCalculation) {\n if (!this.#maxSize && !this.maxEntrySize) {\n throw new TypeError(\n 'cannot set sizeCalculation without setting maxSize or maxEntrySize',\n )\n }\n if (typeof this.sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation set to non-function')\n }\n }\n\n if (memoMethod !== undefined && typeof memoMethod !== 'function') {\n throw new TypeError('memoMethod must be a function if defined')\n }\n this.#memoMethod = memoMethod\n\n if (fetchMethod !== undefined && typeof fetchMethod !== 'function') {\n throw new TypeError('fetchMethod must be a function if specified')\n }\n this.#fetchMethod = fetchMethod\n this.#hasFetchMethod = !!fetchMethod\n\n this.#keyMap = new Map()\n this.#keyList = Array.from({ length: max }).fill(undefined) as (\n | K\n | undefined\n )[]\n this.#valList = Array.from({ length: max }).fill(undefined) as (\n | V\n | undefined\n )[]\n this.#next = new UintArray(max)\n this.#prev = new UintArray(max)\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free = Stack.create(max)\n this.#size = 0\n this.#calculatedSize = 0\n\n if (typeof dispose === 'function') {\n this.#dispose = dispose\n }\n if (typeof onInsert === 'function') {\n this.#onInsert = onInsert\n }\n if (typeof disposeAfter === 'function') {\n this.#disposeAfter = disposeAfter\n this.#disposed = []\n } else {\n this.#disposeAfter = undefined\n this.#disposed = undefined\n }\n this.#hasDispose = !!this.#dispose\n this.#hasOnInsert = !!this.#onInsert\n this.#hasDisposeAfter = !!this.#disposeAfter\n\n this.noDisposeOnSet = !!noDisposeOnSet\n this.noUpdateTTL = !!noUpdateTTL\n this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection\n this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection\n this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort\n this.ignoreFetchAbort = !!ignoreFetchAbort\n\n // NB: maxEntrySize is set to maxSize if it's set\n if (this.maxEntrySize !== 0) {\n if (this.#maxSize !== 0) {\n if (!isPosInt(this.#maxSize)) {\n throw new TypeError(\n 'maxSize must be a positive integer if specified',\n )\n }\n }\n if (!isPosInt(this.maxEntrySize)) {\n throw new TypeError(\n 'maxEntrySize must be a positive integer if specified',\n )\n }\n this.#initializeSizeTracking()\n }\n\n this.allowStale = !!allowStale\n this.noDeleteOnStaleGet = !!noDeleteOnStaleGet\n this.updateAgeOnGet = !!updateAgeOnGet\n this.updateAgeOnHas = !!updateAgeOnHas\n this.ttlResolution =\n isPosInt(ttlResolution) || ttlResolution === 0 ? ttlResolution : 1\n this.ttlAutopurge = !!ttlAutopurge\n this.ttl = ttl || 0\n if (this.ttl) {\n if (!isPosInt(this.ttl)) {\n throw new TypeError('ttl must be a positive integer if specified')\n }\n this.#initializeTTLTracking()\n }\n\n // do not allow completely unbounded caches\n if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) {\n throw new TypeError(\n 'At least one of max, maxSize, or ttl is required',\n )\n }\n if (!this.ttlAutopurge && !this.#max && !this.#maxSize) {\n const code = 'LRU_CACHE_UNBOUNDED'\n if (shouldWarn(code)) {\n warned.add(code)\n const msg =\n 'TTL caching without ttlAutopurge, max, or maxSize can ' +\n 'result in unbounded memory consumption.'\n emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache)\n }\n }\n }\n\n /**\n * Return the number of ms left in the item's TTL. If item is not in cache,\n * returns `0`. Returns `Infinity` if item is in cache without a defined TTL.\n */\n getRemainingTTL(key: K) {\n return this.#keyMap.has(key) ? Infinity : 0\n }\n\n #initializeTTLTracking() {\n const ttls = new ZeroArray(this.#max)\n const starts = new ZeroArray(this.#max)\n this.#ttls = ttls\n this.#starts = starts\n const purgeTimers =\n this.ttlAutopurge ?\n Array.from>({\n length: this.#max,\n })\n : undefined\n this.#autopurgeTimers = purgeTimers\n\n this.#setItemTTL = (index, ttl, start = this.#perf.now()) => {\n starts[index] = ttl !== 0 ? start : 0\n ttls[index] = ttl\n setPurgetTimer(index, ttl)\n }\n\n this.#updateItemAge = index => {\n starts[index] = ttls[index] !== 0 ? this.#perf.now() : 0\n setPurgetTimer(index, ttls[index])\n }\n\n // clear out the purge timer if we're setting TTL to 0, and\n // previously had a ttl purge timer running, so it doesn't\n // fire unnecessarily. Don't need to do this if we're not doing\n // autopurge.\n const setPurgetTimer =\n !this.ttlAutopurge ?\n () => {}\n : (index: Index, ttl?: number) => {\n if (purgeTimers?.[index]) {\n clearTimeout(purgeTimers[index])\n purgeTimers[index] = undefined\n }\n if (ttl && ttl !== 0 && purgeTimers) {\n const t = setTimeout(() => {\n if (this.#isStale(index)) {\n this.#delete(this.#keyList[index] as K, 'expire')\n }\n }, ttl + 1)\n // unref() not supported on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n purgeTimers[index] = t\n }\n }\n\n this.#statusTTL = (status, index) => {\n if (ttls[index]) {\n const ttl = ttls[index]\n const start = starts[index]\n /* c8 ignore start */\n if (!ttl || !start) {\n return\n }\n /* c8 ignore stop */\n status.ttl = ttl\n status.start = start\n status.now = cachedNow || getNow()\n const age = status.now - start\n status.remainingTTL = ttl - age\n }\n }\n\n // debounce calls to perf.now() to 1s so we're not hitting\n // that costly call repeatedly.\n let cachedNow = 0\n const getNow = () => {\n const n = this.#perf.now()\n if (this.ttlResolution > 0) {\n cachedNow = n\n const t = setTimeout(() => (cachedNow = 0), this.ttlResolution)\n // not available on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n }\n return n\n }\n\n this.getRemainingTTL = key => {\n const index = this.#keyMap.get(key)\n if (index === undefined) {\n return 0\n }\n const ttl = ttls[index]\n const start = starts[index]\n if (!ttl || !start) {\n return Infinity\n }\n const age = (cachedNow || getNow()) - start\n return ttl - age\n }\n\n this.#isStale = index => {\n const s = starts[index]\n const t = ttls[index]\n return !!t && !!s && (cachedNow || getNow()) - s > t\n }\n }\n\n // conditionally set private methods related to TTL\n #updateItemAge: (index: Index) => void = () => {}\n #statusTTL: (status: LRUCache.Status, index: Index) => void =\n () => {}\n #setItemTTL: (\n index: Index,\n ttl: LRUCache.Milliseconds,\n start?: LRUCache.Milliseconds,\n // ignore because we never call this if we're not already in TTL mode\n /* c8 ignore start */\n ) => void = () => {}\n /* c8 ignore stop */\n\n #isStale: (index: Index) => boolean = () => false\n\n #initializeSizeTracking() {\n const sizes = new ZeroArray(this.#max)\n this.#calculatedSize = 0\n this.#sizes = sizes\n this.#removeItemSize = index => {\n this.#calculatedSize -= sizes[index] as number\n sizes[index] = 0\n }\n this.#requireSize = (k, v, size, sizeCalculation) => {\n if (!isPosInt(size)) {\n // provisionally accept background fetches.\n // actual value size will be checked when they return.\n if (this.#isBackgroundFetch(v)) {\n // NB: this cannot occur if v.__staleWhileFetching is set,\n // because in that case, it would take on the size of the\n // existing entry that it temporarily replaces.\n return this.backgroundFetchSize\n }\n if (sizeCalculation) {\n if (typeof sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation must be a function')\n }\n size = sizeCalculation(v, k)\n if (!isPosInt(size)) {\n throw new TypeError(\n 'sizeCalculation return invalid (expect positive integer)',\n )\n }\n } else {\n throw new TypeError(\n 'invalid size value (must be positive integer). ' +\n 'When maxSize or maxEntrySize is used, sizeCalculation ' +\n 'or size must be set.',\n )\n }\n }\n return size\n }\n\n this.#addItemSize = (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status,\n ) => {\n sizes[index] = size\n if (this.#maxSize) {\n const maxSize = this.#maxSize - sizes[index]\n while (this.#calculatedSize > maxSize) {\n this.#evict(true)\n }\n }\n this.#calculatedSize += sizes[index]\n if (status) {\n status.entrySize = size\n status.totalCalculatedSize = this.#calculatedSize\n }\n }\n }\n\n #removeItemSize: (index: Index) => void = _i => {}\n\n #addItemSize: (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status,\n ) => void = (_i, _s, _st) => {}\n\n #requireSize: (\n k: K,\n v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator,\n status?: LRUCache.Status,\n ) => LRUCache.Size = (\n _k: K,\n _v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator,\n ) => {\n if (size || sizeCalculation) {\n throw new TypeError(\n 'cannot set size without setting maxSize or maxEntrySize on cache',\n )\n }\n return 0\n };\n\n *#indexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#tail; this.#isValidIndex(i); ) {\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#head) {\n break\n } else {\n i = this.#prev[i] as Index\n }\n }\n }\n }\n\n *#rindexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#head; this.#isValidIndex(i); ) {\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#tail) {\n break\n } else {\n i = this.#next[i] as Index\n }\n }\n }\n }\n\n #isValidIndex(index: Index) {\n return (\n index !== undefined &&\n this.#keyMap.get(this.#keyList[index] as K) === index\n )\n }\n\n /**\n * Return a generator yielding `[key, value]` pairs,\n * in order from most recently used to least recently used.\n */\n *entries() {\n for (const i of this.#indexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]] as [K, V]\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.entries}\n *\n * Return a generator yielding `[key, value]` pairs,\n * in order from least recently used to most recently used.\n */\n *rentries() {\n for (const i of this.#rindexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]]\n }\n }\n }\n\n /**\n * Return a generator yielding the keys in the cache,\n * in order from most recently used to least recently used.\n */\n *keys() {\n for (const i of this.#indexes()) {\n const k = this.#keyList[i]\n if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield k\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.keys}\n *\n * Return a generator yielding the keys in the cache,\n * in order from least recently used to most recently used.\n */\n *rkeys() {\n for (const i of this.#rindexes()) {\n const k = this.#keyList[i]\n if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield k\n }\n }\n }\n\n /**\n * Return a generator yielding the values in the cache,\n * in order from most recently used to least recently used.\n */\n *values() {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i] as V\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.values}\n *\n * Return a generator yielding the values in the cache,\n * in order from least recently used to most recently used.\n */\n *rvalues() {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i]\n }\n }\n }\n\n /**\n * Iterating over the cache itself yields the same results as\n * {@link LRUCache.entries}\n */\n [Symbol.iterator]() {\n return this.entries()\n }\n\n /**\n * A String value that is used in the creation of the default string\n * description of an object. Called by the built-in method\n * `Object.prototype.toString`.\n */\n [Symbol.toStringTag] = 'LRUCache'\n\n /**\n * Find a value for which the supplied fn method returns a truthy value,\n * similar to `Array.find()`. fn is called as `fn(value, key, cache)`.\n */\n find(\n fn: (v: V, k: K, self: LRUCache) => boolean,\n getOptions: LRUCache.GetOptions = {},\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n if (fn(value, this.#keyList[i] as K, this)) {\n return this.#get(this.#keyList[i] as K, getOptions)\n }\n }\n }\n\n /**\n * Call the supplied function on each item in the cache, in order from most\n * recently used to least recently used.\n *\n * `fn` is called as `fn(value, key, cache)`.\n *\n * If `thisp` is provided, function will be called in the `this`-context of\n * the provided object, or the cache if no `thisp` object is provided.\n *\n * Does not update age or recenty of use, or iterate over stale values.\n */\n forEach(\n fn: (v: V, k: K, self: LRUCache) => unknown,\n thisp: unknown = this,\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * The same as {@link LRUCache.forEach} but items are iterated over in\n * reverse order. (ie, less recently used items are iterated over first.)\n */\n rforEach(\n fn: (v: V, k: K, self: LRUCache) => unknown,\n thisp: unknown = this,\n ) {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * Delete any stale entries. Returns true if anything was removed,\n * false otherwise.\n */\n purgeStale() {\n let deleted = false\n for (const i of this.#rindexes({ allowStale: true })) {\n if (this.#isStale(i)) {\n this.#delete(this.#keyList[i] as K, 'expire')\n deleted = true\n }\n }\n return deleted\n }\n\n /**\n * Get the extended info about a given entry, to get its value, size, and\n * TTL info simultaneously. Returns `undefined` if the key is not present.\n *\n * Unlike {@link LRUCache#dump}, which is designed to be portable and survive\n * serialization, the `start` value is always the current timestamp, and the\n * `ttl` is a calculated remaining time to live (negative if expired).\n *\n * Always returns stale values, if their info is found in the cache, so be\n * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl})\n * if relevant.\n */\n info(key: K): LRUCache.Entry | undefined {\n const i = this.#keyMap.get(key)\n if (i === undefined) return undefined\n const v = this.#valList[i]\n /* c8 ignore start - this isn't tested for the info function,\n * but it's the same logic as found in other places. */\n const value: V | undefined =\n this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) return undefined\n /* c8 ignore stop */\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n const ttl = this.#ttls[i]\n const start = this.#starts[i]\n if (ttl && start) {\n const remain = ttl - (this.#perf.now() - start)\n entry.ttl = remain\n entry.start = Date.now()\n }\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n return entry\n }\n\n /**\n * Return an array of [key, {@link LRUCache.Entry}] tuples which can be\n * passed to {@link LRUCache#load}.\n *\n * The `start` fields are calculated relative to a portable `Date.now()`\n * timestamp, even if `performance.now()` is available.\n *\n * Stale entries are always included in the `dump`, even if\n * {@link LRUCache.OptionsBase.allowStale} is false.\n *\n * Note: this returns an actual array, not a generator, so it can be more\n * easily passed around.\n */\n dump() {\n const arr: [K, LRUCache.Entry][] = []\n for (const i of this.#indexes({ allowStale: true })) {\n const key = this.#keyList[i]\n const v = this.#valList[i]\n const value: V | undefined =\n this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined || key === undefined) continue\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n entry.ttl = this.#ttls[i]\n // always dump the start relative to a portable timestamp\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = this.#perf.now() - (this.#starts[i] as number)\n entry.start = Math.floor(Date.now() - age)\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n arr.unshift([key, entry])\n }\n return arr\n }\n\n /**\n * Reset the cache and load in the items in entries in the order listed.\n *\n * The shape of the resulting cache may be different if the same options are\n * not used in both caches.\n *\n * The `start` fields are assumed to be calculated relative to a portable\n * `Date.now()` timestamp, even if `performance.now()` is available.\n */\n load(arr: [K, LRUCache.Entry][]) {\n this.clear()\n for (const [key, entry] of arr) {\n if (entry.start) {\n // entry.start is a portable timestamp, but we may be using\n // node's performance.now(), so calculate the offset, so that\n // we get the intended remaining TTL, no matter how long it's\n // been on ice.\n //\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = Date.now() - entry.start\n entry.start = this.#perf.now() - age\n }\n this.#set(key, entry.value, entry)\n }\n }\n\n /**\n * Add a value to the cache.\n *\n * Note: if `undefined` is specified as a value, this is an alias for\n * {@link LRUCache#delete}\n *\n * Fields on the {@link LRUCache.SetOptions} options param will override\n * their corresponding values in the constructor options for the scope\n * of this single `set()` operation.\n *\n * If `start` is provided, then that will set the effective start\n * time for the TTL calculation. Note that this must be a previous\n * value of `performance.now()` if supported, or a previous value of\n * `Date.now()` if not.\n *\n * Options object may also include `size`, which will prevent\n * calling the `sizeCalculation` function and just use the specified\n * number if it is a positive integer, and `noDisposeOnSet` which\n * will prevent calling a `dispose` function in the case of\n * overwrites.\n *\n * If the `size` (or return value of `sizeCalculation`) for a given\n * entry is greater than `maxEntrySize`, then the item will not be\n * added to the cache.\n *\n * Will update the recency of the entry.\n *\n * If the value is `undefined`, then this is an alias for\n * `cache.delete(key)`. `undefined` is never stored in the cache.\n */\n set(\n k: K,\n v: V | undefined,\n setOptions: LRUCache.SetOptions = {},\n ) {\n const { status = metrics.hasSubscribers ? {} : undefined } = setOptions\n setOptions.status = status\n if (status) {\n status.op = 'set'\n status.key = k\n if (v !== undefined) status.value = v\n status.cache = this\n }\n const result = this.#set(k, v, setOptions)\n if (status && metrics.hasSubscribers) {\n metrics.publish(status)\n }\n return result\n }\n\n #set(\n k: K,\n v: V | BackgroundFetch | undefined,\n setOptions: LRUCache.SetOptions,\n bf?: BackgroundFetch,\n ) {\n const {\n ttl = this.ttl,\n start,\n noDisposeOnSet = this.noDisposeOnSet,\n sizeCalculation = this.sizeCalculation,\n status,\n } = setOptions\n\n const isBF = this.#isBackgroundFetch(v)\n if (v === undefined) {\n if (status) status.set = 'deleted'\n this.delete(k)\n return this\n }\n let { noUpdateTTL = this.noUpdateTTL } = setOptions\n\n if (status && !isBF) status.value = v\n\n const size = this.#requireSize(\n k,\n v,\n setOptions.size || 0,\n sizeCalculation,\n status,\n )\n // if the item doesn't fit, don't do anything\n // NB: maxEntrySize set to maxSize by default\n if (this.maxEntrySize && size > this.maxEntrySize) {\n // have to delete, in case something is there already.\n this.#delete(k, 'set')\n if (status) {\n status.set = 'miss'\n status.maxEntrySizeExceeded = true\n }\n return this\n }\n let index = this.#size === 0 ? undefined : this.#keyMap.get(k)\n if (index === undefined) {\n // addition\n index = (\n this.#size === 0 ? this.#tail\n : this.#free.length !== 0 ? this.#free.pop()\n : this.#size === this.#max ? this.#evict(false)\n : this.#size) as Index\n this.#keyList[index] = k\n this.#valList[index] = v\n this.#keyMap.set(k, index)\n this.#next[this.#tail] = index\n this.#prev[index] = this.#tail\n this.#tail = index\n this.#size++\n this.#addItemSize(index, size, status)\n if (status) status.set = 'add'\n noUpdateTTL = false\n if (this.#hasOnInsert && !isBF) {\n this.#onInsert?.(v, k, 'add')\n }\n } else {\n // update\n // might be updating a background fetch!\n this.#moveToTail(index)\n const oldVal = this.#valList[index]!\n if (v !== oldVal) {\n if (!noDisposeOnSet) {\n if (this.#isBackgroundFetch(oldVal)) {\n if (oldVal !== bf) {\n // setting over a background fetch, not merely resolving it.\n oldVal.__abortController.abort(new Error('replaced'))\n }\n const { __staleWhileFetching: s } = oldVal\n if (s !== undefined && s !== v) {\n if (this.#hasDispose) {\n this.#dispose?.(s, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([s, k, 'set'])\n }\n }\n } else {\n if (this.#hasDispose) {\n this.#dispose?.(oldVal, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldVal, k, 'set'])\n }\n }\n }\n this.#removeItemSize(index)\n this.#addItemSize(index, size, status)\n this.#valList[index] = v\n if (!isBF) {\n const oldValue =\n oldVal && this.#isBackgroundFetch(oldVal) ?\n oldVal.__staleWhileFetching\n : oldVal\n const setType =\n oldValue === undefined ? 'add'\n : v !== oldValue ? 'replace'\n : 'update'\n if (status) {\n status.set = setType\n if (oldValue !== undefined) status.oldValue = oldValue\n }\n if (this.#hasOnInsert) {\n this.onInsert?.(v, k, setType)\n }\n }\n } else if (!isBF) {\n if (status) {\n status.set = 'update'\n }\n if (this.#hasOnInsert) {\n this.onInsert?.(v, k, 'update')\n }\n }\n }\n if (ttl !== 0 && !this.#ttls) {\n this.#initializeTTLTracking()\n }\n if (this.#ttls) {\n if (!noUpdateTTL) {\n this.#setItemTTL(index, ttl, start)\n }\n if (status) this.#statusTTL(status, index)\n }\n if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return this\n }\n\n /**\n * Evict the least recently used item, returning its value or\n * `undefined` if cache is empty.\n */\n pop(): V | undefined {\n try {\n while (this.#size) {\n const val = this.#valList[this.#head]\n this.#evict(true)\n if (this.#isBackgroundFetch(val)) {\n if (val.__staleWhileFetching) {\n return val.__staleWhileFetching\n }\n } else if (val !== undefined) {\n return val\n }\n }\n } finally {\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n }\n\n #evict(free: boolean) {\n const head = this.#head\n const k = this.#keyList[head]!\n const v = this.#valList[head]!\n const isBF = this.#isBackgroundFetch(v)\n if (isBF) {\n v.__abortController.abort(new Error('evicted'))\n }\n const oldValue = isBF ? v.__staleWhileFetching : v\n if (\n (this.#hasDispose || this.#hasDisposeAfter) &&\n oldValue !== undefined\n ) {\n if (this.#hasDispose) {\n this.#dispose?.(oldValue, k, 'evict')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldValue, k, 'evict'])\n }\n }\n this.#removeItemSize(head)\n if (this.#autopurgeTimers?.[head]) {\n clearTimeout(this.#autopurgeTimers[head])\n this.#autopurgeTimers[head] = undefined\n }\n // if we aren't about to use the index, then null these out\n if (free) {\n this.#keyList[head] = undefined\n this.#valList[head] = undefined\n this.#free.push(head)\n }\n if (this.#size === 1) {\n this.#head = this.#tail = 0 as Index\n this.#free.length = 0\n } else {\n this.#head = this.#next[head] as Index\n }\n this.#keyMap.delete(k)\n this.#size--\n return head\n }\n\n /**\n * Check if a key is in the cache, without updating the recency of use.\n * Will return false if the item is stale, even though it is technically\n * in the cache.\n *\n * Check if a key is in the cache, without updating the recency of\n * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set\n * to `true` in either the options or the constructor.\n *\n * Will return `false` if the item is stale, even though it is technically in\n * the cache. The difference can be determined (if it matters) by using a\n * `status` argument, and inspecting the `has` field.\n *\n * Will not update item age unless\n * {@link LRUCache.OptionsBase.updateAgeOnHas} is set.\n */\n has(k: K, hasOptions: LRUCache.HasOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } = hasOptions\n hasOptions.status = status\n if (status) {\n status.op = 'has'\n status.key = k\n status.cache = this\n }\n const result = this.#has(k, hasOptions)\n if (metrics.hasSubscribers) metrics.publish(status)\n return result\n }\n #has(k: K, hasOptions: LRUCache.HasOptions = {}) {\n const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n const v = this.#valList[index]\n if (\n this.#isBackgroundFetch(v) &&\n v.__staleWhileFetching === undefined\n ) {\n return false\n }\n if (!this.#isStale(index)) {\n if (updateAgeOnHas) {\n this.#updateItemAge(index)\n }\n if (status) {\n status.has = 'hit'\n this.#statusTTL(status, index)\n }\n return true\n } else if (status) {\n status.has = 'stale'\n this.#statusTTL(status, index)\n }\n } else if (status) {\n status.has = 'miss'\n }\n return false\n }\n\n /**\n * Like {@link LRUCache#get} but doesn't update recency or delete stale\n * items.\n *\n * Returns `undefined` if the item is stale, unless\n * {@link LRUCache.OptionsBase.allowStale} is set.\n */\n peek(k: K, peekOptions: LRUCache.PeekOptions = {}) {\n const { status = hasSubscribers() ? {} : undefined } = peekOptions\n if (status) {\n status.op = 'peek'\n status.key = k\n status.cache = this\n }\n peekOptions.status = status\n const result = this.#peek(k, peekOptions)\n if (metrics.hasSubscribers) {\n metrics.publish(status)\n }\n return result\n }\n #peek(k: K, peekOptions: LRUCache.PeekOptions) {\n const { status, allowStale = this.allowStale } = peekOptions\n const index = this.#keyMap.get(k)\n if (index === undefined || (!allowStale && this.#isStale(index))) {\n if (status) status.peek = index === undefined ? 'miss' : 'stale'\n return undefined\n }\n const v = this.#valList[index]\n const val = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (status) {\n if (val !== undefined) {\n status.peek = 'hit'\n status.value = val\n } else {\n status.peek = 'miss'\n }\n }\n return val\n }\n\n #backgroundFetch(\n k: K,\n index: Index | undefined,\n options: LRUCache.FetchOptions,\n context: FC,\n ): BackgroundFetch {\n const v = index === undefined ? undefined : this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n return v\n }\n\n const ac = new AbortController()\n const { signal } = options\n // when/if our AC signals, then stop listening to theirs.\n signal?.addEventListener('abort', () => ac.abort(signal.reason), {\n signal: ac.signal,\n })\n\n const fetchOpts = {\n signal: ac.signal,\n options,\n context,\n }\n\n const cb = (v: V | undefined, updateCache = false): V | undefined => {\n const { aborted } = ac.signal\n const ignoreAbort = options.ignoreFetchAbort && v !== undefined\n const proceed =\n options.ignoreFetchAbort ||\n !!(options.allowStaleOnFetchAbort && v !== undefined)\n if (options.status) {\n if (aborted && !updateCache) {\n options.status.fetchAborted = true\n options.status.fetchError = ac.signal.reason\n if (ignoreAbort) options.status.fetchAbortIgnored = true\n } else {\n options.status.fetchResolved = true\n }\n }\n if (aborted && !ignoreAbort && !updateCache) {\n return fetchFail(ac.signal.reason, proceed)\n }\n // either we didn't abort, and are still here, or we did, and ignored\n const bf = p as BackgroundFetch\n // if nothing else has been written there but we're set to update the\n // cache and ignore the abort, or if it's still pending on this specific\n // background request, then write it to the cache.\n const vl = this.#valList[index as Index]\n if (vl === p || (vl === undefined && ignoreAbort && updateCache)) {\n if (v === undefined) {\n if (bf.__staleWhileFetching !== undefined) {\n this.#valList[index as Index] = bf.__staleWhileFetching\n } else {\n this.#delete(k, 'fetch')\n }\n } else {\n if (options.status) options.status.fetchUpdated = true\n this.#set(k, v, fetchOpts.options, bf)\n }\n }\n return v\n }\n\n const eb = (er: unknown) => {\n if (options.status) {\n options.status.fetchRejected = true\n options.status.fetchError = er as Error\n }\n // do not pass go, do not collect $200\n return fetchFail(er, false)\n }\n\n const fetchFail = (er: unknown, proceed: boolean): V | undefined => {\n const { aborted } = ac.signal\n const allowStaleAborted = aborted && options.allowStaleOnFetchAbort\n const allowStale =\n allowStaleAborted || options.allowStaleOnFetchRejection\n const noDelete = allowStale || options.noDeleteOnFetchRejection\n const bf = p as BackgroundFetch\n if (this.#valList[index as Index] === p) {\n // if we allow stale on fetch rejections, then we need to ensure that\n // the stale value is not removed from the cache when the fetch fails.\n const del =\n !noDelete || (!proceed && bf.__staleWhileFetching === undefined)\n if (del) {\n this.#delete(k, 'fetch')\n } else if (!allowStaleAborted) {\n // still replace the *promise* with the stale value,\n // since we are done with the promise at this point.\n // leave it untouched if we're still waiting for an\n // aborted background fetch that hasn't yet returned.\n this.#valList[index as Index] = bf.__staleWhileFetching\n }\n }\n if (allowStale) {\n if (options.status && bf.__staleWhileFetching !== undefined) {\n options.status.returnedStale = true\n }\n return bf.__staleWhileFetching\n } else if (bf.__returned === bf) {\n throw er\n }\n }\n\n const pcall = (\n res: (v: V | undefined) => void,\n rej: (e: unknown) => void,\n ) => {\n const fmp = this.#fetchMethod?.(k, v, fetchOpts)\n // ignored, we go until we finish, regardless.\n // defer check until we are actually aborting,\n // so fetchMethod can override.\n ac.signal.addEventListener('abort', () => {\n if (!options.ignoreFetchAbort || options.allowStaleOnFetchAbort) {\n res(undefined)\n // when it eventually resolves, update the cache.\n if (options.allowStaleOnFetchAbort) {\n res = v => cb(v, true)\n }\n }\n })\n if (fmp && fmp instanceof Promise) {\n fmp.then(v => res(v === undefined ? undefined : v), rej)\n } else if (fmp !== undefined) {\n res(fmp)\n }\n }\n\n if (options.status) options.status.fetchDispatched = true\n const p = new Promise(pcall).then(cb, eb)\n const bf: BackgroundFetch = Object.assign(p, {\n __abortController: ac,\n __staleWhileFetching: v,\n __returned: undefined,\n })\n\n if (index === undefined) {\n // internal, don't expose status.\n this.#set(k, bf, { ...fetchOpts.options, status: undefined })\n index = this.#keyMap.get(k)\n } else {\n // do not call #set, because we do not want to adjust its place\n // in the lru queue, as it has not yet been \"used\". Also, we don't\n // need to worry about evicting for size, because a background fetch\n // over a stale value is treated as the same size as its stale value.\n this.#valList[index] = bf\n }\n return bf\n }\n\n #isBackgroundFetch(p: unknown): p is BackgroundFetch {\n if (!this.#hasFetchMethod) return false\n const b = p as BackgroundFetch\n return (\n !!b &&\n b instanceof Promise &&\n b.hasOwnProperty('__staleWhileFetching') &&\n b.__abortController instanceof AbortController\n )\n }\n\n /**\n * Make an asynchronous cached fetch using the\n * {@link LRUCache.OptionsBase.fetchMethod} function.\n *\n * If the value is in the cache and not stale, then the returned\n * Promise resolves to the value.\n *\n * If not in the cache, or beyond its TTL staleness, then\n * `fetchMethod(key, staleValue, { options, signal, context })` is\n * called, and the value returned will be added to the cache once\n * resolved.\n *\n * If called with `allowStale`, and an asynchronous fetch is\n * currently in progress to reload a stale value, then the former\n * stale value will be returned.\n *\n * If called with `forceRefresh`, then the cached item will be\n * re-fetched, even if it is not stale. However, if `allowStale` is also\n * set, then the old value will still be returned. This is useful\n * in cases where you want to force a reload of a cached value. If\n * a background fetch is already in progress, then `forceRefresh`\n * has no effect.\n *\n * If multiple fetches for the same key are issued, then they will all be\n * coalesced into a single call to fetchMethod.\n *\n * Note that this means that handling options such as\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort},\n * {@link LRUCache.FetchOptions.signal},\n * and {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} will be\n * determined by the FIRST fetch() call for a given key.\n *\n * This is a known (fixable) shortcoming which will be addresed on when\n * someone complains about it, as the fix would involve added complexity and\n * may not be worth the costs for this edge case.\n *\n * If {@link LRUCache.OptionsBase.fetchMethod} is not specified, then this is\n * effectively an alias for `Promise.resolve(cache.get(key))`.\n *\n * When the fetch method resolves to a value, if the fetch has not\n * been aborted due to deletion, eviction, or being overwritten,\n * then it is added to the cache using the options provided.\n *\n * If the key is evicted or deleted before the `fetchMethod`\n * resolves, then the AbortSignal passed to the `fetchMethod` will\n * receive an `abort` event, and the promise returned by `fetch()`\n * will reject with the reason for the abort.\n *\n * If a `signal` is passed to the `fetch()` call, then aborting the\n * signal will abort the fetch and cause the `fetch()` promise to\n * reject with the reason provided.\n *\n * **Setting `context`**\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the {@link LRUCache} constructor, then all\n * calls to `cache.fetch()` _must_ provide a `context` option. If\n * set to `undefined` or `void`, then calls to fetch _must not_\n * provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that\n * might be relevant in the course of fetching the data. It is only\n * relevant for the course of a single `fetch()` operation, and\n * discarded afterwards.\n *\n * **Note: `fetch()` calls are inflight-unique**\n *\n * If you call `fetch()` multiple times with the same key value,\n * then every call after the first will resolve on the same\n * promise1,\n * _even if they have different settings that would otherwise change\n * the behavior of the fetch_, such as `noDeleteOnFetchRejection`\n * or `ignoreFetchAbort`.\n *\n * In most cases, this is not a problem (in fact, only fetching\n * something once is what you probably want, if you're caching in\n * the first place). If you are changing the fetch() options\n * dramatically between runs, there's a good chance that you might\n * be trying to fit divergent semantics into a single object, and\n * would be better off with multiple cache instances.\n *\n * **1**: Ie, they're not the \"same Promise\", but they resolve at\n * the same time, because they're both waiting on the same\n * underlying fetchMethod response.\n */\n\n fetch(\n k: K,\n fetchOptions: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext,\n ): Promise\n\n // this overload not allowed if context is required\n fetch(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n fetchOptions?: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : never,\n ): Promise\n fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const ths = tracing.hasSubscribers\n const { status = hasSubscribers() ? {} : undefined } = fetchOptions\n fetchOptions.status = status\n if (status && fetchOptions.context) {\n status.context = fetchOptions.context\n }\n const p = this.#fetch(k, fetchOptions)\n if (status && ths) {\n status.trace = true\n tracing.tracePromise(() => p, status).catch(() => {})\n }\n return p\n }\n\n async #fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const {\n // get options\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n // set options\n ttl = this.ttl,\n noDisposeOnSet = this.noDisposeOnSet,\n size = 0,\n sizeCalculation = this.sizeCalculation,\n noUpdateTTL = this.noUpdateTTL,\n // fetch exclusive options\n noDeleteOnFetchRejection = this.noDeleteOnFetchRejection,\n allowStaleOnFetchRejection = this.allowStaleOnFetchRejection,\n ignoreFetchAbort = this.ignoreFetchAbort,\n allowStaleOnFetchAbort = this.allowStaleOnFetchAbort,\n context,\n forceRefresh = false,\n status,\n signal,\n } = fetchOptions\n if (status) {\n status.op = 'fetch'\n status.key = k\n if (forceRefresh) status.forceRefresh = true\n status.cache = this\n }\n\n if (!this.#hasFetchMethod) {\n if (status) status.fetch = 'get'\n return this.#get(k, {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n status,\n })\n }\n\n const options = {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n ttl,\n noDisposeOnSet,\n size,\n sizeCalculation,\n noUpdateTTL,\n noDeleteOnFetchRejection,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n status,\n signal,\n }\n\n let index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.fetch = 'miss'\n const p = this.#backgroundFetch(k, index, options, context as FC)\n return (p.__returned = p)\n } else {\n // in cache, maybe already fetching\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n const stale = allowStale && v.__staleWhileFetching !== undefined\n if (status) {\n status.fetch = 'inflight'\n if (stale) status.returnedStale = true\n }\n return stale ? v.__staleWhileFetching : (v.__returned = v)\n }\n\n // if we force a refresh, that means do NOT serve the cached value,\n // unless we are already in the process of refreshing the cache.\n const isStale = this.#isStale(index)\n if (!forceRefresh && !isStale) {\n if (status) status.fetch = 'hit'\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n if (status) this.#statusTTL(status, index)\n return v\n }\n\n // ok, it is stale or a forced refresh, and not already fetching.\n // refresh the cache.\n const p = this.#backgroundFetch(k, index, options, context as FC)\n const hasStale = p.__staleWhileFetching !== undefined\n const staleVal = hasStale && allowStale\n if (status) {\n status.fetch = isStale ? 'stale' : 'refresh'\n if (staleVal && isStale) status.returnedStale = true\n }\n return staleVal ? p.__staleWhileFetching : (p.__returned = p)\n }\n }\n\n /**\n * In some cases, `cache.fetch()` may resolve to `undefined`, either because\n * a {@link LRUCache.OptionsBase#fetchMethod} was not provided (turning\n * `cache.fetch(k)` into just an async wrapper around `cache.get(k)`) or\n * because `ignoreFetchAbort` was specified (either to the constructor or\n * in the {@link LRUCache.FetchOptions}). Also, the\n * {@link LRUCache.OptionsBase.fetchMethod} may return `undefined` or `void`, making\n * the test even more complicated.\n *\n * Because inferring the cases where `undefined` might be returned are so\n * cumbersome, but testing for `undefined` can also be annoying, this method\n * can be used, which will reject if `this.fetch()` resolves to undefined.\n */\n forceFetch(\n k: K,\n fetchOptions: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext,\n ): Promise\n // this overload not allowed if context is required\n forceFetch(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n fetchOptions?: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : never,\n ): Promise\n forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const ths = tracing.hasSubscribers\n const { status = hasSubscribers() ? {} : undefined } = fetchOptions\n fetchOptions.status = status\n if (status && fetchOptions.context) {\n status.context = fetchOptions.context\n }\n const p = this.#forceFetch(k, fetchOptions)\n if (status && ths) {\n status.trace = true\n tracing.tracePromise(() => p, status).catch(() => {})\n }\n return p\n }\n\n async #forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ) {\n const v = await this.#fetch(k, fetchOptions)\n if (v === undefined) throw new Error('fetch() returned undefined')\n return v\n }\n\n /**\n * If the key is found in the cache, then this is equivalent to\n * {@link LRUCache#get}. If not, in the cache, then calculate the value using\n * the {@link LRUCache.OptionsBase.memoMethod}, and add it to the cache.\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the LRUCache constructor, then all calls to `cache.memo()`\n * _must_ provide a `context` option. If set to `undefined` or `void`, then\n * calls to memo _must not_ provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that might be\n * relevant in the course of fetching the data. It is only relevant for the\n * course of a single `memo()` operation, and discarded afterwards.\n */\n memo(\n k: K,\n memoOptions: unknown extends FC ? LRUCache.MemoOptions\n : FC extends undefined | void ? LRUCache.MemoOptionsNoContext\n : LRUCache.MemoOptionsWithContext,\n ): V\n // this overload not allowed if context is required\n memo(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n memoOptions?: unknown extends FC ? LRUCache.MemoOptions\n : FC extends undefined | void ? LRUCache.MemoOptionsNoContext\n : never,\n ): V\n memo(k: K, memoOptions: LRUCache.MemoOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } =\n memoOptions\n memoOptions.status = status\n if (status) {\n status.op = 'memo'\n status.key = k\n if (memoOptions.context) {\n status.context = memoOptions.context\n }\n status.cache = this\n }\n const result = this.#memo(k, memoOptions)\n if (status) status.value = result\n if (metrics.hasSubscribers) metrics.publish(status)\n return result\n }\n #memo(k: K, memoOptions: LRUCache.MemoOptions = {}) {\n const memoMethod = this.#memoMethod\n if (!memoMethod) {\n throw new Error('no memoMethod provided to constructor')\n }\n const { context, status, forceRefresh, ...options } = memoOptions\n if (status && forceRefresh) status.forceRefresh = true\n const v = this.#get(k, options)\n const refresh = forceRefresh || v === undefined\n if (status) {\n status.memo = refresh ? 'miss' : 'hit'\n if (!refresh) status.value = v\n }\n if (!refresh) return v\n const vv = memoMethod(k, v, {\n options,\n context,\n } as LRUCache.MemoizerOptions)\n if (status) status.value = vv\n this.#set(k, vv, options)\n return vv\n }\n\n /**\n * Return a value from the cache. Will update the recency of the cache\n * entry found.\n *\n * If the key is not found, get() will return `undefined`.\n */\n get(k: K, getOptions: LRUCache.GetOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } = getOptions\n getOptions.status = status\n if (status) {\n status.op = 'get'\n status.key = k\n status.cache = this\n }\n const result = this.#get(k, getOptions)\n if (status) {\n if (result !== undefined) status.value = result\n if (metrics.hasSubscribers) metrics.publish(status)\n }\n return result\n }\n\n #get(k: K, getOptions: LRUCache.GetOptions = {}) {\n const {\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n status,\n } = getOptions\n const index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.get = 'miss'\n return undefined\n }\n const value = this.#valList[index]\n const fetching = this.#isBackgroundFetch(value)\n if (status) this.#statusTTL(status, index)\n if (this.#isStale(index)) {\n // delete only if not an in-flight background fetch\n if (!fetching) {\n if (!noDeleteOnStaleGet) {\n this.#delete(k, 'expire')\n }\n if (status) status.get = 'stale'\n if (allowStale) {\n if (status) status.returnedStale = true\n return value\n }\n return undefined\n }\n if (status) status.get = 'stale-fetching'\n if (allowStale && value.__staleWhileFetching !== undefined) {\n if (status) status.returnedStale = true\n return value.__staleWhileFetching\n }\n return undefined\n }\n // not stale\n if (status) status.get = fetching ? 'fetching' : 'hit'\n // if we're currently fetching it, we don't actually have it yet\n // it's not stale, which means this isn't a staleWhileRefetching.\n // If it's not stale, and fetching, AND has a __staleWhileFetching\n // value, then that means the user fetched with {forceRefresh:true},\n // so it's safe to return that value.\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n return fetching ? value.__staleWhileFetching : value\n }\n\n #connect(p: Index, n: Index) {\n this.#prev[n] = p\n this.#next[p] = n\n }\n\n #moveToTail(index: Index): void {\n // if tail already, nothing to do\n // if head, move head to next[index]\n // else\n // move next[prev[index]] to next[index] (head has no prev)\n // move prev[next[index]] to prev[index]\n // prev[index] = tail\n // next[tail] = index\n // tail = index\n if (index !== this.#tail) {\n if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n this.#connect(\n this.#prev[index] as Index,\n this.#next[index] as Index,\n )\n }\n this.#connect(this.#tail, index)\n this.#tail = index\n }\n }\n\n /**\n * Deletes a key out of the cache.\n *\n * Returns true if the key was deleted, false otherwise.\n */\n delete(k: K) {\n return this.#delete(k, 'delete')\n }\n\n #delete(k: K, reason: LRUCache.DisposeReason) {\n if (metrics.hasSubscribers) {\n metrics.publish({\n op: 'delete',\n delete: reason,\n key: k,\n cache: this,\n })\n }\n let deleted = false\n if (this.#size !== 0) {\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n if (this.#autopurgeTimers?.[index]) {\n clearTimeout(this.#autopurgeTimers?.[index])\n this.#autopurgeTimers[index] = undefined\n }\n deleted = true\n if (this.#size === 1) {\n this.#clear(reason)\n } else {\n this.#removeItemSize(index)\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k, reason])\n }\n }\n this.#keyMap.delete(k)\n this.#keyList[index] = undefined\n this.#valList[index] = undefined\n if (index === this.#tail) {\n this.#tail = this.#prev[index] as Index\n } else if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n const pi = this.#prev[index] as number\n this.#next[pi] = this.#next[index] as number\n const ni = this.#next[index] as number\n this.#prev[ni] = this.#prev[index] as number\n }\n this.#size--\n this.#free.push(index)\n }\n }\n }\n if (this.#hasDisposeAfter && this.#disposed?.length) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return deleted\n }\n\n /**\n * Clear the cache entirely, throwing away all values.\n */\n clear() {\n return this.#clear('delete')\n }\n #clear(reason: LRUCache.DisposeReason) {\n for (const index of this.#rindexes({ allowStale: true })) {\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else {\n const k = this.#keyList[index]\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k as K, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k as K, reason])\n }\n }\n }\n\n this.#keyMap.clear()\n void this.#valList.fill(undefined)\n this.#keyList.fill(undefined)\n if (this.#ttls && this.#starts) {\n this.#ttls.fill(0)\n this.#starts.fill(0)\n for (const t of this.#autopurgeTimers ?? []) {\n if (t !== undefined) clearTimeout(t)\n }\n this.#autopurgeTimers?.fill(undefined)\n }\n if (this.#sizes) {\n this.#sizes.fill(0)\n }\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free.length = 0\n this.#calculatedSize = 0\n this.#size = 0\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/index.min.js b/node_modules/lru-cache/dist/esm/index.min.js new file mode 100644 index 00000000..5715ef55 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/index.min.js @@ -0,0 +1,2 @@ +var L={hasSubscribers:!1},S=L,A=L;import("node:diagnostics_channel").then(c=>{S=c.channel("lru-cache:metrics"),A=c.tracingChannel("lru-cache")}).catch(()=>{});var M=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date;var D=()=>S.hasSubscribers||A.hasSubscribers,j=new Set,I=typeof process=="object"&&process?process:{},P=(c,e,t,i)=>{typeof I.emitWarning=="function"?I.emitWarning(c,e,t,i):console.error(`[${t}] ${e}: ${c}`)},k=c=>!j.has(c);var T=c=>!!c&&c===Math.floor(c)&&c>0&&isFinite(c),G=c=>T(c)?c<=Math.pow(2,8)?Uint8Array:c<=Math.pow(2,16)?Uint16Array:c<=Math.pow(2,32)?Uint32Array:c<=Number.MAX_SAFE_INTEGER?O:null:null,O=class extends Array{constructor(e){super(e),this.fill(0)}},R=class c{heap;length;static#o=!1;static create(e){let t=G(e);if(!t)return[];c.#o=!0;let i=new c(e,t);return c.#o=!1,i}constructor(e,t){if(!c.#o)throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new t(e),this.length=0}push(e){this.heap[this.length++]=e}pop(){return this.heap[--this.length]}},U=class c{#o;#c;#S;#O;#w;#M;#I;#m;get perf(){return this.#m}ttl;ttlResolution;ttlAutopurge;updateAgeOnGet;updateAgeOnHas;allowStale;noDisposeOnSet;noUpdateTTL;maxEntrySize;sizeCalculation;noDeleteOnFetchRejection;noDeleteOnStaleGet;allowStaleOnFetchAbort;allowStaleOnFetchRejection;ignoreFetchAbort;backgroundFetchSize;#n;#b;#s;#i;#t;#l;#u;#a;#h;#y;#r;#_;#F;#d;#g;#T;#U;#f;#x;static unsafeExposeInternals(e){return{starts:e.#F,ttls:e.#d,autopurgeTimers:e.#g,sizes:e.#_,keyMap:e.#s,keyList:e.#i,valList:e.#t,next:e.#l,prev:e.#u,get head(){return e.#a},get tail(){return e.#h},free:e.#y,isBackgroundFetch:t=>e.#e(t),backgroundFetch:(t,i,s,n)=>e.#P(t,i,s,n),moveToTail:t=>e.#L(t),indexes:t=>e.#A(t),rindexes:t=>e.#z(t),isStale:t=>e.#p(t)}}get max(){return this.#o}get maxSize(){return this.#c}get calculatedSize(){return this.#b}get size(){return this.#n}get fetchMethod(){return this.#M}get memoMethod(){return this.#I}get dispose(){return this.#S}get onInsert(){return this.#O}get disposeAfter(){return this.#w}constructor(e){let{max:t=0,ttl:i,ttlResolution:s=1,ttlAutopurge:n,updateAgeOnGet:r,updateAgeOnHas:h,allowStale:a,dispose:o,onInsert:d,disposeAfter:y,noDisposeOnSet:_,noUpdateTTL:u,maxSize:g=0,maxEntrySize:f=0,sizeCalculation:b,fetchMethod:l,memoMethod:w,noDeleteOnFetchRejection:F,noDeleteOnStaleGet:m,allowStaleOnFetchRejection:p,allowStaleOnFetchAbort:z,ignoreFetchAbort:E,backgroundFetchSize:C=1,perf:v}=e;if(this.backgroundFetchSize=C,v!==void 0&&typeof v?.now!="function")throw new TypeError("perf option must have a now() method if specified");if(this.#m=v??M,t!==0&&!T(t))throw new TypeError("max option must be a nonnegative integer");let W=t?G(t):Array;if(!W)throw new Error("invalid max value: "+t);if(this.#o=t,this.#c=g,this.maxEntrySize=f||this.#c,this.sizeCalculation=b,this.sizeCalculation){if(!this.#c&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(w!==void 0&&typeof w!="function")throw new TypeError("memoMethod must be a function if defined");if(this.#I=w,l!==void 0&&typeof l!="function")throw new TypeError("fetchMethod must be a function if specified");if(this.#M=l,this.#U=!!l,this.#s=new Map,this.#i=Array.from({length:t}).fill(void 0),this.#t=Array.from({length:t}).fill(void 0),this.#l=new W(t),this.#u=new W(t),this.#a=0,this.#h=0,this.#y=R.create(t),this.#n=0,this.#b=0,typeof o=="function"&&(this.#S=o),typeof d=="function"&&(this.#O=d),typeof y=="function"?(this.#w=y,this.#r=[]):(this.#w=void 0,this.#r=void 0),this.#T=!!this.#S,this.#x=!!this.#O,this.#f=!!this.#w,this.noDisposeOnSet=!!_,this.noUpdateTTL=!!u,this.noDeleteOnFetchRejection=!!F,this.allowStaleOnFetchRejection=!!p,this.allowStaleOnFetchAbort=!!z,this.ignoreFetchAbort=!!E,this.maxEntrySize!==0){if(this.#c!==0&&!T(this.#c))throw new TypeError("maxSize must be a positive integer if specified");if(!T(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.#X()}if(this.allowStale=!!a,this.noDeleteOnStaleGet=!!m,this.updateAgeOnGet=!!r,this.updateAgeOnHas=!!h,this.ttlResolution=T(s)||s===0?s:1,this.ttlAutopurge=!!n,this.ttl=i||0,this.ttl){if(!T(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.#k()}if(this.#o===0&&this.ttl===0&&this.#c===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.#o&&!this.#c){let x="LRU_CACHE_UNBOUNDED";k(x)&&(j.add(x),P("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",x,c))}}getRemainingTTL(e){return this.#s.has(e)?1/0:0}#k(){let e=new O(this.#o),t=new O(this.#o);this.#d=e,this.#F=t;let i=this.ttlAutopurge?Array.from({length:this.#o}):void 0;this.#g=i,this.#H=(h,a,o=this.#m.now())=>{t[h]=a!==0?o:0,e[h]=a,s(h,a)},this.#D=h=>{t[h]=e[h]!==0?this.#m.now():0,s(h,e[h])};let s=this.ttlAutopurge?(h,a)=>{if(i?.[h]&&(clearTimeout(i[h]),i[h]=void 0),a&&a!==0&&i){let o=setTimeout(()=>{this.#p(h)&&this.#E(this.#i[h],"expire")},a+1);o.unref&&o.unref(),i[h]=o}}:()=>{};this.#v=(h,a)=>{if(e[a]){let o=e[a],d=t[a];if(!o||!d)return;h.ttl=o,h.start=d,h.now=n||r();let y=h.now-d;h.remainingTTL=o-y}};let n=0,r=()=>{let h=this.#m.now();if(this.ttlResolution>0){n=h;let a=setTimeout(()=>n=0,this.ttlResolution);a.unref&&a.unref()}return h};this.getRemainingTTL=h=>{let a=this.#s.get(h);if(a===void 0)return 0;let o=e[a],d=t[a];if(!o||!d)return 1/0;let y=(n||r())-d;return o-y},this.#p=h=>{let a=t[h],o=e[h];return!!o&&!!a&&(n||r())-a>o}}#D=()=>{};#v=()=>{};#H=()=>{};#p=()=>!1;#X(){let e=new O(this.#o);this.#b=0,this.#_=e,this.#R=t=>{this.#b-=e[t],e[t]=0},this.#N=(t,i,s,n)=>{if(!T(s)){if(this.#e(i))return this.backgroundFetchSize;if(n){if(typeof n!="function")throw new TypeError("sizeCalculation must be a function");if(s=n(i,t),!T(s))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.")}return s},this.#j=(t,i,s)=>{if(e[t]=i,this.#c){let n=this.#c-e[t];for(;this.#b>n;)this.#G(!0)}this.#b+=e[t],s&&(s.entrySize=i,s.totalCalculatedSize=this.#b)}}#R=e=>{};#j=(e,t,i)=>{};#N=(e,t,i,s)=>{if(i||s)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0};*#A({allowStale:e=this.allowStale}={}){if(this.#n)for(let t=this.#h;this.#V(t)&&((e||!this.#p(t))&&(yield t),t!==this.#a);)t=this.#u[t]}*#z({allowStale:e=this.allowStale}={}){if(this.#n)for(let t=this.#a;this.#V(t)&&((e||!this.#p(t))&&(yield t),t!==this.#h);)t=this.#l[t]}#V(e){return e!==void 0&&this.#s.get(this.#i[e])===e}*entries(){for(let e of this.#A())this.#t[e]!==void 0&&this.#i[e]!==void 0&&!this.#e(this.#t[e])&&(yield[this.#i[e],this.#t[e]])}*rentries(){for(let e of this.#z())this.#t[e]!==void 0&&this.#i[e]!==void 0&&!this.#e(this.#t[e])&&(yield[this.#i[e],this.#t[e]])}*keys(){for(let e of this.#A()){let t=this.#i[e];t!==void 0&&!this.#e(this.#t[e])&&(yield t)}}*rkeys(){for(let e of this.#z()){let t=this.#i[e];t!==void 0&&!this.#e(this.#t[e])&&(yield t)}}*values(){for(let e of this.#A())this.#t[e]!==void 0&&!this.#e(this.#t[e])&&(yield this.#t[e])}*rvalues(){for(let e of this.#z())this.#t[e]!==void 0&&!this.#e(this.#t[e])&&(yield this.#t[e])}[Symbol.iterator](){return this.entries()}[Symbol.toStringTag]="LRUCache";find(e,t={}){for(let i of this.#A()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;if(n!==void 0&&e(n,this.#i[i],this))return this.#C(this.#i[i],t)}}forEach(e,t=this){for(let i of this.#A()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;n!==void 0&&e.call(t,n,this.#i[i],this)}}rforEach(e,t=this){for(let i of this.#z()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;n!==void 0&&e.call(t,n,this.#i[i],this)}}purgeStale(){let e=!1;for(let t of this.#z({allowStale:!0}))this.#p(t)&&(this.#E(this.#i[t],"expire"),e=!0);return e}info(e){let t=this.#s.get(e);if(t===void 0)return;let i=this.#t[t],s=this.#e(i)?i.__staleWhileFetching:i;if(s===void 0)return;let n={value:s};if(this.#d&&this.#F){let r=this.#d[t],h=this.#F[t];if(r&&h){let a=r-(this.#m.now()-h);n.ttl=a,n.start=Date.now()}}return this.#_&&(n.size=this.#_[t]),n}dump(){let e=[];for(let t of this.#A({allowStale:!0})){let i=this.#i[t],s=this.#t[t],n=this.#e(s)?s.__staleWhileFetching:s;if(n===void 0||i===void 0)continue;let r={value:n};if(this.#d&&this.#F){r.ttl=this.#d[t];let h=this.#m.now()-this.#F[t];r.start=Math.floor(Date.now()-h)}this.#_&&(r.size=this.#_[t]),e.unshift([i,r])}return e}load(e){this.clear();for(let[t,i]of e){if(i.start){let s=Date.now()-i.start;i.start=this.#m.now()-s}this.#W(t,i.value,i)}}set(e,t,i={}){let{status:s=S.hasSubscribers?{}:void 0}=i;i.status=s,s&&(s.op="set",s.key=e,t!==void 0&&(s.value=t),s.cache=this);let n=this.#W(e,t,i);return s&&S.hasSubscribers&&S.publish(s),n}#W(e,t,i,s){let{ttl:n=this.ttl,start:r,noDisposeOnSet:h=this.noDisposeOnSet,sizeCalculation:a=this.sizeCalculation,status:o}=i,d=this.#e(t);if(t===void 0)return o&&(o.set="deleted"),this.delete(e),this;let{noUpdateTTL:y=this.noUpdateTTL}=i;o&&!d&&(o.value=t);let _=this.#N(e,t,i.size||0,a,o);if(this.maxEntrySize&&_>this.maxEntrySize)return this.#E(e,"set"),o&&(o.set="miss",o.maxEntrySizeExceeded=!0),this;let u=this.#n===0?void 0:this.#s.get(e);if(u===void 0)u=this.#n===0?this.#h:this.#y.length!==0?this.#y.pop():this.#n===this.#o?this.#G(!1):this.#n,this.#i[u]=e,this.#t[u]=t,this.#s.set(e,u),this.#l[this.#h]=u,this.#u[u]=this.#h,this.#h=u,this.#n++,this.#j(u,_,o),o&&(o.set="add"),y=!1,this.#x&&!d&&this.#O?.(t,e,"add");else{this.#L(u);let g=this.#t[u];if(t!==g){if(!h)if(this.#e(g)){g!==s&&g.__abortController.abort(new Error("replaced"));let{__staleWhileFetching:f}=g;f!==void 0&&f!==t&&(this.#T&&this.#S?.(f,e,"set"),this.#f&&this.#r?.push([f,e,"set"]))}else this.#T&&this.#S?.(g,e,"set"),this.#f&&this.#r?.push([g,e,"set"]);if(this.#R(u),this.#j(u,_,o),this.#t[u]=t,!d){let f=g&&this.#e(g)?g.__staleWhileFetching:g,b=f===void 0?"add":t!==f?"replace":"update";o&&(o.set=b,f!==void 0&&(o.oldValue=f)),this.#x&&this.onInsert?.(t,e,b)}}else d||(o&&(o.set="update"),this.#x&&this.onInsert?.(t,e,"update"))}if(n!==0&&!this.#d&&this.#k(),this.#d&&(y||this.#H(u,n,r),o&&this.#v(o,u)),!h&&this.#f&&this.#r){let g=this.#r,f;for(;f=g?.shift();)this.#w?.(...f)}return this}pop(){try{for(;this.#n;){let e=this.#t[this.#a];if(this.#G(!0),this.#e(e)){if(e.__staleWhileFetching)return e.__staleWhileFetching}else if(e!==void 0)return e}}finally{if(this.#f&&this.#r){let e=this.#r,t;for(;t=e?.shift();)this.#w?.(...t)}}}#G(e){let t=this.#a,i=this.#i[t],s=this.#t[t],n=this.#e(s);n&&s.__abortController.abort(new Error("evicted"));let r=n?s.__staleWhileFetching:s;return(this.#T||this.#f)&&r!==void 0&&(this.#T&&this.#S?.(r,i,"evict"),this.#f&&this.#r?.push([r,i,"evict"])),this.#R(t),this.#g?.[t]&&(clearTimeout(this.#g[t]),this.#g[t]=void 0),e&&(this.#i[t]=void 0,this.#t[t]=void 0,this.#y.push(t)),this.#n===1?(this.#a=this.#h=0,this.#y.length=0):this.#a=this.#l[t],this.#s.delete(i),this.#n--,t}has(e,t={}){let{status:i=S.hasSubscribers?{}:void 0}=t;t.status=i,i&&(i.op="has",i.key=e,i.cache=this);let s=this.#Y(e,t);return S.hasSubscribers&&S.publish(i),s}#Y(e,t={}){let{updateAgeOnHas:i=this.updateAgeOnHas,status:s}=t,n=this.#s.get(e);if(n!==void 0){let r=this.#t[n];if(this.#e(r)&&r.__staleWhileFetching===void 0)return!1;if(this.#p(n))s&&(s.has="stale",this.#v(s,n));else return i&&this.#D(n),s&&(s.has="hit",this.#v(s,n)),!0}else s&&(s.has="miss");return!1}peek(e,t={}){let{status:i=D()?{}:void 0}=t;i&&(i.op="peek",i.key=e,i.cache=this),t.status=i;let s=this.#J(e,t);return S.hasSubscribers&&S.publish(i),s}#J(e,t){let{status:i,allowStale:s=this.allowStale}=t,n=this.#s.get(e);if(n===void 0||!s&&this.#p(n)){i&&(i.peek=n===void 0?"miss":"stale");return}let r=this.#t[n],h=this.#e(r)?r.__staleWhileFetching:r;return i&&(h!==void 0?(i.peek="hit",i.value=h):i.peek="miss"),h}#P(e,t,i,s){let n=t===void 0?void 0:this.#t[t];if(this.#e(n))return n;let r=new AbortController,{signal:h}=i;h?.addEventListener("abort",()=>r.abort(h.reason),{signal:r.signal});let a={signal:r.signal,options:i,context:s},o=(f,b=!1)=>{let{aborted:l}=r.signal,w=i.ignoreFetchAbort&&f!==void 0,F=i.ignoreFetchAbort||!!(i.allowStaleOnFetchAbort&&f!==void 0);if(i.status&&(l&&!b?(i.status.fetchAborted=!0,i.status.fetchError=r.signal.reason,w&&(i.status.fetchAbortIgnored=!0)):i.status.fetchResolved=!0),l&&!w&&!b)return y(r.signal.reason,F);let m=u,p=this.#t[t];return(p===u||p===void 0&&w&&b)&&(f===void 0?m.__staleWhileFetching!==void 0?this.#t[t]=m.__staleWhileFetching:this.#E(e,"fetch"):(i.status&&(i.status.fetchUpdated=!0),this.#W(e,f,a.options,m))),f},d=f=>(i.status&&(i.status.fetchRejected=!0,i.status.fetchError=f),y(f,!1)),y=(f,b)=>{let{aborted:l}=r.signal,w=l&&i.allowStaleOnFetchAbort,F=w||i.allowStaleOnFetchRejection,m=F||i.noDeleteOnFetchRejection,p=u;if(this.#t[t]===u&&(!m||!b&&p.__staleWhileFetching===void 0?this.#E(e,"fetch"):w||(this.#t[t]=p.__staleWhileFetching)),F)return i.status&&p.__staleWhileFetching!==void 0&&(i.status.returnedStale=!0),p.__staleWhileFetching;if(p.__returned===p)throw f},_=(f,b)=>{let l=this.#M?.(e,n,a);r.signal.addEventListener("abort",()=>{(!i.ignoreFetchAbort||i.allowStaleOnFetchAbort)&&(f(void 0),i.allowStaleOnFetchAbort&&(f=w=>o(w,!0)))}),l&&l instanceof Promise?l.then(w=>f(w===void 0?void 0:w),b):l!==void 0&&f(l)};i.status&&(i.status.fetchDispatched=!0);let u=new Promise(_).then(o,d),g=Object.assign(u,{__abortController:r,__staleWhileFetching:n,__returned:void 0});return t===void 0?(this.#W(e,g,{...a.options,status:void 0}),t=this.#s.get(e)):this.#t[t]=g,g}#e(e){if(!this.#U)return!1;let t=e;return!!t&&t instanceof Promise&&t.hasOwnProperty("__staleWhileFetching")&&t.__abortController instanceof AbortController}fetch(e,t={}){let i=A.hasSubscribers,{status:s=D()?{}:void 0}=t;t.status=s,s&&t.context&&(s.context=t.context);let n=this.#B(e,t);return s&&i&&(s.trace=!0,A.tracePromise(()=>n,s).catch(()=>{})),n}async#B(e,t={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,ttl:r=this.ttl,noDisposeOnSet:h=this.noDisposeOnSet,size:a=0,sizeCalculation:o=this.sizeCalculation,noUpdateTTL:d=this.noUpdateTTL,noDeleteOnFetchRejection:y=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:_=this.allowStaleOnFetchRejection,ignoreFetchAbort:u=this.ignoreFetchAbort,allowStaleOnFetchAbort:g=this.allowStaleOnFetchAbort,context:f,forceRefresh:b=!1,status:l,signal:w}=t;if(l&&(l.op="fetch",l.key=e,b&&(l.forceRefresh=!0),l.cache=this),!this.#U)return l&&(l.fetch="get"),this.#C(e,{allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:n,status:l});let F={allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:n,ttl:r,noDisposeOnSet:h,size:a,sizeCalculation:o,noUpdateTTL:d,noDeleteOnFetchRejection:y,allowStaleOnFetchRejection:_,allowStaleOnFetchAbort:g,ignoreFetchAbort:u,status:l,signal:w},m=this.#s.get(e);if(m===void 0){l&&(l.fetch="miss");let p=this.#P(e,m,F,f);return p.__returned=p}else{let p=this.#t[m];if(this.#e(p)){let W=i&&p.__staleWhileFetching!==void 0;return l&&(l.fetch="inflight",W&&(l.returnedStale=!0)),W?p.__staleWhileFetching:p.__returned=p}let z=this.#p(m);if(!b&&!z)return l&&(l.fetch="hit"),this.#L(m),s&&this.#D(m),l&&this.#v(l,m),p;let E=this.#P(e,m,F,f),v=E.__staleWhileFetching!==void 0&&i;return l&&(l.fetch=z?"stale":"refresh",v&&z&&(l.returnedStale=!0)),v?E.__staleWhileFetching:E.__returned=E}}forceFetch(e,t={}){let i=A.hasSubscribers,{status:s=D()?{}:void 0}=t;t.status=s,s&&t.context&&(s.context=t.context);let n=this.#K(e,t);return s&&i&&(s.trace=!0,A.tracePromise(()=>n,s).catch(()=>{})),n}async#K(e,t={}){let i=await this.#B(e,t);if(i===void 0)throw new Error("fetch() returned undefined");return i}memo(e,t={}){let{status:i=S.hasSubscribers?{}:void 0}=t;t.status=i,i&&(i.op="memo",i.key=e,t.context&&(i.context=t.context),i.cache=this);let s=this.#Q(e,t);return i&&(i.value=s),S.hasSubscribers&&S.publish(i),s}#Q(e,t={}){let i=this.#I;if(!i)throw new Error("no memoMethod provided to constructor");let{context:s,status:n,forceRefresh:r,...h}=t;n&&r&&(n.forceRefresh=!0);let a=this.#C(e,h),o=r||a===void 0;if(n&&(n.memo=o?"miss":"hit",o||(n.value=a)),!o)return a;let d=i(e,a,{options:h,context:s});return n&&(n.value=d),this.#W(e,d,h),d}get(e,t={}){let{status:i=S.hasSubscribers?{}:void 0}=t;t.status=i,i&&(i.op="get",i.key=e,i.cache=this);let s=this.#C(e,t);return i&&(s!==void 0&&(i.value=s),S.hasSubscribers&&S.publish(i)),s}#C(e,t={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,status:r}=t,h=this.#s.get(e);if(h===void 0){r&&(r.get="miss");return}let a=this.#t[h],o=this.#e(a);return r&&this.#v(r,h),this.#p(h)?o?(r&&(r.get="stale-fetching"),i&&a.__staleWhileFetching!==void 0?(r&&(r.returnedStale=!0),a.__staleWhileFetching):void 0):(n||this.#E(e,"expire"),r&&(r.get="stale"),i?(r&&(r.returnedStale=!0),a):void 0):(r&&(r.get=o?"fetching":"hit"),this.#L(h),s&&this.#D(h),o?a.__staleWhileFetching:a)}#$(e,t){this.#u[t]=e,this.#l[e]=t}#L(e){e!==this.#h&&(e===this.#a?this.#a=this.#l[e]:this.#$(this.#u[e],this.#l[e]),this.#$(this.#h,e),this.#h=e)}delete(e){return this.#E(e,"delete")}#E(e,t){S.hasSubscribers&&S.publish({op:"delete",delete:t,key:e,cache:this});let i=!1;if(this.#n!==0){let s=this.#s.get(e);if(s!==void 0)if(this.#g?.[s]&&(clearTimeout(this.#g?.[s]),this.#g[s]=void 0),i=!0,this.#n===1)this.#q(t);else{this.#R(s);let n=this.#t[s];if(this.#e(n)?n.__abortController.abort(new Error("deleted")):(this.#T||this.#f)&&(this.#T&&this.#S?.(n,e,t),this.#f&&this.#r?.push([n,e,t])),this.#s.delete(e),this.#i[s]=void 0,this.#t[s]=void 0,s===this.#h)this.#h=this.#u[s];else if(s===this.#a)this.#a=this.#l[s];else{let r=this.#u[s];this.#l[r]=this.#l[s];let h=this.#l[s];this.#u[h]=this.#u[s]}this.#n--,this.#y.push(s)}}if(this.#f&&this.#r?.length){let s=this.#r,n;for(;n=s?.shift();)this.#w?.(...n)}return i}clear(){return this.#q("delete")}#q(e){for(let t of this.#z({allowStale:!0})){let i=this.#t[t];if(this.#e(i))i.__abortController.abort(new Error("deleted"));else{let s=this.#i[t];this.#T&&this.#S?.(i,s,e),this.#f&&this.#r?.push([i,s,e])}}if(this.#s.clear(),this.#t.fill(void 0),this.#i.fill(void 0),this.#d&&this.#F){this.#d.fill(0),this.#F.fill(0);for(let t of this.#g??[])t!==void 0&&clearTimeout(t);this.#g?.fill(void 0)}if(this.#_&&this.#_.fill(0),this.#a=0,this.#h=0,this.#y.length=0,this.#b=0,this.#n=0,this.#f&&this.#r){let t=this.#r,i;for(;i=t?.shift();)this.#w?.(...i)}}};export{U as LRUCache}; +//# sourceMappingURL=index.min.js.map diff --git a/node_modules/lru-cache/dist/esm/index.min.js.map b/node_modules/lru-cache/dist/esm/index.min.js.map new file mode 100644 index 00000000..e8b4b9e9 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/index.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../src/diagnostics-channel-esm.mts", "../../src/perf.ts", "../../src/index.ts"], + "sourcesContent": ["// This is used in ESM environments that do NOT follow the 'node' or 'browser'\n// import conditions. So, `node:diagnostics_channel` MAY be present.\n// Note that this is overridden in 'browser' conditional branch, because the\n// dynamic import can confound bundlers and cause CSP violations in browsers.\nimport {\n type Channel,\n type TracingChannel,\n} from 'node:diagnostics_channel'\nexport type { TracingChannel, Channel }\n\n/**\n * no-op polyfills for non-node environments. tries to load the actual\n * diagnostics_channel module on platforms that support it, but fails\n * gracefully if not found. This means that the first tick of metrics\n * and tracing will be missed, but that probably doesn't matter much.\n */\n\n// conditionally import from diagnostic_channel, fall back to dummyfill\n// all we actually have to mock is the hasSubscribers, since we always check\n/* v8 ignore next */\nconst dummy = { hasSubscribers: false }\nexport let metrics = dummy as Channel\nexport let tracing = dummy as TracingChannel\nimport('node:diagnostics_channel')\n .then(dc => {\n metrics = dc.channel('lru-cache:metrics')\n tracing = dc.tracingChannel('lru-cache')\n })\n .catch(() => {})\n", "/**\n * this provides the default Perf object source, either the\n * `performance` global, or the `Date` constructor.\n *\n * it can be passed in via configuration to override it\n * for a single LRU object.\n */\nexport type Perf = { now: () => number }\nexport const defaultPerf: Perf =\n (\n typeof performance === 'object' &&\n performance &&\n typeof performance.now === 'function'\n ) ?\n /* c8 ignore start - this gets covered, but c8 gets confused */\n performance\n : /* c8 ignore stop */ Date\n", "/**\n * @module LRUCache\n */\n\nimport { metrics, tracing } from './diagnostics-channel.js'\nimport { defaultPerf } from './perf.js'\nimport type { Perf } from './perf.js'\nexport type { Perf } from './perf.js'\n\nconst hasSubscribers = () =>\n metrics.hasSubscribers || tracing.hasSubscribers\n\nconst warned = new Set()\n\n// either a function or a class\n// oxlint-disable-next-line no-explicit-any\ntype ForC = ((...a: any[]) => any) | { new (...a: any[]): any }\n\n/* c8 ignore start */\nconst PROCESS = (\n typeof process === 'object' && !!process ?\n process\n : {}) as { [k: string]: unknown }\n/* c8 ignore stop */\n\nconst emitWarning = (\n msg: string,\n type: string,\n code: string,\n fn: ForC,\n) => {\n if (typeof PROCESS.emitWarning === 'function') {\n PROCESS.emitWarning(msg, type, code, fn)\n } else {\n //oxlint-disable-next-line no-console\n console.error(`[${code}] ${type}: ${msg}`)\n }\n}\nconst shouldWarn = (code: string) => !warned.has(code)\n\nconst TYPE = Symbol('type')\nexport type PosInt = number & { [TYPE]: 'Positive Integer' }\nexport type Index = number & { [TYPE]: 'LRUCache Index' }\n\nconst isPosInt = (n: unknown): n is PosInt =>\n !!n && n === Math.floor(n as number) && n > 0 && isFinite(n)\n\nexport type UintArray = Uint8Array | Uint16Array | Uint32Array\nexport type NumberArray = UintArray | number[]\n\n// This is a little bit ridiculous, tbh.\n// The maximum array length is 2^32-1 or thereabouts on most JS impls.\n// And well before that point, you're caching the entire world, I mean,\n// that's ~32GB of just integers for the next/prev links, plus whatever\n// else to hold that many keys and values. Just filling the memory with\n// zeroes at init time is brutal when you get that big.\n// But why not be complete?\n// Maybe in the future, these limits will have expanded.\n/* c8 ignore start */\nconst getUintArray = (max: number) =>\n !isPosInt(max) ? null\n : max <= Math.pow(2, 8) ? Uint8Array\n : max <= Math.pow(2, 16) ? Uint16Array\n : max <= Math.pow(2, 32) ? Uint32Array\n : max <= Number.MAX_SAFE_INTEGER ? ZeroArray\n : null\n/* c8 ignore stop */\n\nclass ZeroArray extends Array {\n constructor(size: number) {\n super(size)\n this.fill(0)\n }\n}\nexport type { ZeroArray }\nexport type { Stack }\n\nexport type StackLike = Stack | Index[]\nclass Stack {\n /* c8 ignore start - not sure why this is showing up uncovered?? */\n heap: NumberArray\n /* c8 ignore stop */\n length: number\n // private constructor\n static #constructing: boolean = false\n static create(max: number): StackLike {\n const HeapCls = getUintArray(max)\n if (!HeapCls) return []\n Stack.#constructing = true\n const s = new Stack(max, HeapCls)\n Stack.#constructing = false\n return s\n }\n constructor(max: number, HeapCls: { new (n: number): NumberArray }) {\n /* c8 ignore start */\n if (!Stack.#constructing) {\n throw new TypeError('instantiate Stack using Stack.create(n)')\n }\n /* c8 ignore stop */\n this.heap = new HeapCls(max)\n this.length = 0\n }\n push(n: Index) {\n this.heap[this.length++] = n\n }\n pop(): Index {\n return this.heap[--this.length] as Index\n }\n}\n\n/**\n * Promise representing an in-progress {@link LRUCache#fetch} call\n */\nexport type BackgroundFetch = Promise & {\n __returned: BackgroundFetch | undefined\n __abortController: AbortController\n __staleWhileFetching: V | undefined\n}\n\nexport type DisposeTask = [\n value: V,\n key: K,\n reason: LRUCache.DisposeReason,\n]\n\nexport namespace LRUCache {\n /**\n * An integer greater than 0, reflecting the calculated size of items\n */\n export type Size = number\n\n /**\n * Integer greater than 0, representing some number of milliseconds, or the\n * time at which a TTL started counting from.\n */\n export type Milliseconds = number\n\n /**\n * An integer greater than 0, reflecting a number of items\n */\n export type Count = number\n\n /**\n * The reason why an item was removed from the cache, passed\n * to the {@link Disposer} methods.\n *\n * - `evict`: The item was evicted because it is the least recently used,\n * and the cache is full.\n * - `set`: A new value was set, overwriting the old value being disposed.\n * - `delete`: The item was explicitly deleted, either by calling\n * {@link LRUCache#delete}, {@link LRUCache#clear}, or\n * {@link LRUCache#set} with an undefined value.\n * - `expire`: The item was removed due to exceeding its TTL.\n * - `fetch`: A {@link OptionsBase#fetchMethod} operation returned\n * `undefined` or was aborted, causing the item to be deleted.\n */\n export type DisposeReason =\n | 'evict'\n | 'set'\n | 'delete'\n | 'expire'\n | 'fetch'\n /**\n * A method called upon item removal, passed as the\n * {@link OptionsBase.dispose} and/or\n * {@link OptionsBase.disposeAfter} options.\n */\n export type Disposer = (\n value: V,\n key: K,\n reason: DisposeReason,\n ) => void\n\n /**\n * The reason why an item was added to the cache, passed\n * to the {@link Inserter} methods.\n *\n * - `add`: the item was not found in the cache, and was added\n * - `update`: the item was in the cache, with the same value provided\n * - `replace`: the item was in the cache, and replaced\n */\n export type InsertReason = 'add' | 'update' | 'replace'\n\n /**\n * A method called upon item insertion, passed as the\n * {@link OptionsBase.insert}\n */\n export type Inserter = (\n value: V,\n key: K,\n reason: InsertReason,\n ) => void\n\n /**\n * A function that returns the effective calculated size\n * of an entry in the cache.\n */\n export type SizeCalculator = (value: V, key: K) => Size\n\n /**\n * Options provided to the\n * {@link OptionsBase.fetchMethod} function.\n */\n export interface FetcherOptions {\n signal: AbortSignal\n options: FetcherFetchOptions\n /**\n * Object provided in the {@link FetchOptions.context} option to\n * {@link LRUCache#fetch}\n */\n context: FC\n }\n\n /**\n * Occasionally, it may be useful to track the internal behavior of the\n * cache, particularly for logging, debugging, or for behavior within the\n * `fetchMethod`. To do this, you can pass a `status` object to the\n * {@link LRUCache#fetch}, {@link LRUCache#get}, {@link LRUCache#set},\n * {@link LRUCache#memo}, and {@link LRUCache#has} methods.\n *\n * The `status` option should be a plain JavaScript object. The following\n * fields will be set on it appropriately, depending on the situation.\n *\n * These objects are also the context objects passed to listeners on the\n * `lru-cache:metrics` diagnostic channel, and the `lru-cache` tracing\n * channels, in platforms that support them.\n */\n export interface Status {\n /**\n * The operation being performed\n */\n op?: 'get' | 'set' | 'memo' | 'fetch' | 'delete' | 'has' | 'peek'\n /**\n * The status of a set() operation.\n *\n * - add: the item was not found in the cache, and was added\n * - update: the item was in the cache, with the same value provided\n * - replace: the item was in the cache, and replaced\n * - miss: the item was not added to the cache for some reason\n */\n set?: 'add' | 'update' | 'replace' | 'miss' | 'deleted'\n\n /**\n * The status of a delete() operation.\n */\n delete?: LRUCache.DisposeReason\n\n /**\n * The result of a peek() operation\n *\n * - hit: the item was found and returned\n * - stale: the item is in the cache, but past its ttl and not returned\n * - miss: item not in the cache\n */\n peek?: 'hit' | 'miss' | 'stale'\n\n /**\n * The status of a memo() operation.\n *\n * - 'hit': the item was found in the cache and returned\n * - 'miss': the `memoMethod` function was called\n */\n memo?: 'hit' | 'miss'\n\n /**\n * The `context` option provided to a memo or fetch operation\n *\n * In practice, of course, this will be the same type as the `FC`\n * fetch context param used to instantiate the LRUCache, but the\n * convolutions of threading that through would get quite complicated,\n * and preclude forcing/forbidding the passing of a `context` param\n * where it is/isn't expected, which is more valuable for error\n * prevention.\n */\n context?: unknown\n\n /**\n * the ttl stored for the item, or undefined if ttls are not used.\n */\n ttl?: Milliseconds\n\n /**\n * the start time for the item, or undefined if ttls are not used.\n */\n start?: Milliseconds\n\n /**\n * The timestamp used for TTL calculation\n */\n now?: Milliseconds\n\n /**\n * the remaining ttl for the item, or undefined if ttls are not used.\n */\n remainingTTL?: Milliseconds\n\n /**\n * The calculated size for the item, if sizes are used.\n */\n entrySize?: Size\n\n /**\n * The total calculated size of the cache, if sizes are used.\n */\n totalCalculatedSize?: Size\n\n /**\n * A flag indicating that the item was not stored, due to exceeding the\n * {@link OptionsBase.maxEntrySize}\n */\n maxEntrySizeExceeded?: true\n\n /**\n * The key that was set or retrieved\n */\n key?: K\n\n /**\n * The value that was set\n */\n value?: V\n\n /**\n * The old value, specified in the case of `set:'replace'`\n */\n oldValue?: V\n\n /**\n * The results of a {@link LRUCache#has} operation\n *\n * - hit: the item was found in the cache\n * - stale: the item was found in the cache, but is stale\n * - miss: the item was not found in the cache\n */\n has?: 'hit' | 'stale' | 'miss'\n\n /**\n * The status of a {@link LRUCache#fetch} operation.\n * Note that this can change as the underlying fetch() moves through\n * various states.\n *\n * - inflight: there is another fetch() for this key which is in process\n * - get: there is no {@link OptionsBase.fetchMethod}, so\n * {@link LRUCache#get} was called.\n * - miss: the item is not in cache, and will be fetched.\n * - hit: the item is in the cache, and was resolved immediately.\n * - stale: the item is in the cache, but stale.\n * - refresh: the item is in the cache, and not stale, but\n * {@link FetchOptions.forceRefresh} was specified.\n */\n fetch?: 'get' | 'inflight' | 'miss' | 'hit' | 'stale' | 'refresh'\n\n /**\n * `forceRefresh` option was used for either a fetch or memo operation\n */\n forceRefresh?: boolean\n\n /**\n * The {@link OptionsBase.fetchMethod} was called\n */\n fetchDispatched?: true\n\n /**\n * The cached value was updated after a successful call to\n * {@link OptionsBase.fetchMethod}\n */\n fetchUpdated?: true\n\n /**\n * The reason for a fetch() rejection. Either the error raised by the\n * {@link OptionsBase.fetchMethod}, or the reason for an\n * AbortSignal.\n */\n fetchError?: Error\n\n /**\n * The fetch received an abort signal\n */\n fetchAborted?: true\n\n /**\n * The abort signal received was ignored, and the fetch was allowed to\n * continue in the background.\n */\n fetchAbortIgnored?: true\n\n /**\n * The fetchMethod promise resolved successfully\n */\n fetchResolved?: true\n\n /**\n * The fetchMethod promise was rejected\n */\n fetchRejected?: true\n\n /**\n * The status of a {@link LRUCache#get} operation.\n *\n * - fetching: The item is currently being fetched. If a previous value\n * is present and allowed, that will be returned.\n * - stale: The item is in the cache, and is stale. If it was returned,\n * then the `returnedStale` flag will be set.\n * - stale-fetching: The value is being fetched in the background, but is\n * currently stale. If the stale value was returned, then the\n * `returnedStale` flag will be set.\n * - hit: the item is in the cache\n * - miss: the item is not in the cache\n */\n get?: 'stale' | 'hit' | 'miss' | 'fetching' | 'stale-fetching'\n\n /**\n * A fetch or get operation returned a stale value.\n */\n returnedStale?: true\n\n /**\n * A tracingChannel trace was started for this operation\n */\n trace?: boolean\n\n /**\n * A reference to the cache instance associated with this operation\n */\n cache?: LRUCache\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#fetch}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link OptionsBase.noDeleteOnFetchRejection},\n * {@link OptionsBase.allowStaleOnFetchRejection},\n * {@link FetchOptions.forceRefresh}, and\n * {@link FetcherOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.fetchMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the fetchMethod is called.\n */\n export interface FetcherFetchOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n status?: Status\n size?: Size\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#fetch} method.\n */\n export interface FetchOptions extends FetcherFetchOptions<\n K,\n V,\n FC\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.fetchMethod} as\n * the {@link FetcherOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n signal?: AbortSignal\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface FetchOptionsWithContext extends FetchOptions<\n K,\n V,\n FC\n > {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is\n * `undefined` or `void`\n */\n export interface FetchOptionsNoContext<\n K,\n V,\n FC extends undefined | void = undefined,\n > extends FetchOptions {\n context?: FC\n }\n\n export interface MemoOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.memoMethod} as\n * the {@link MemoizerOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface MemoOptionsWithContext extends MemoOptions<\n K,\n V,\n FC\n > {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is\n * `undefined` or `void`\n */\n export interface MemoOptionsNoContext<\n K,\n V,\n FC extends undefined | void = undefined,\n > extends MemoOptions {\n context?: FC\n }\n\n /**\n * Options provided to the\n * {@link OptionsBase.memoMethod} function.\n */\n export interface MemoizerOptions {\n options: MemoizerMemoOptions\n /**\n * Object provided in the {@link MemoOptions.context} option to\n * {@link LRUCache#memo}\n */\n context: FC\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#memo}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link MemoOptions.forceRefresh}, and\n * {@link MemoOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.memoMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the memoMethod is called.\n */\n export interface MemoizerMemoOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n > {\n status?: Status\n size?: Size\n start?: Milliseconds\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#has} method.\n */\n export interface HasOptions extends Pick<\n OptionsBase,\n 'updateAgeOnHas'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#get} method.\n */\n export interface GetOptions extends Pick<\n OptionsBase,\n 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#peek} method.\n */\n export interface PeekOptions extends Pick<\n OptionsBase,\n 'allowStale'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#set} method.\n */\n export interface SetOptions extends Pick<\n OptionsBase,\n 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'\n > {\n /**\n * If size tracking is enabled, then setting an explicit size\n * in the {@link LRUCache#set} call will prevent calling the\n * {@link OptionsBase.sizeCalculation} function.\n */\n size?: Size\n /**\n * If TTL tracking is enabled, then setting an explicit start\n * time in the {@link LRUCache#set} call will override the\n * default time from `performance.now()` or `Date.now()`.\n *\n * Note that it must be a valid value for whichever time-tracking\n * method is in use.\n */\n start?: Milliseconds\n status?: Status\n }\n\n /**\n * The type signature for the {@link OptionsBase.fetchMethod} option.\n */\n export type Fetcher = (\n key: K,\n staleValue: V | undefined,\n options: FetcherOptions,\n ) => Promise | V | undefined | void\n\n /**\n * the type signature for the {@link OptionsBase.memoMethod} option.\n */\n export type Memoizer = (\n key: K,\n staleValue: V | undefined,\n options: MemoizerOptions,\n ) => V\n\n /**\n * Options which may be passed to the {@link LRUCache} constructor.\n *\n * Most of these may be overridden in the various options that use\n * them.\n *\n * Despite all being technically optional, the constructor requires that\n * a cache is at minimum limited by one or more of {@link OptionsBase.max},\n * {@link OptionsBase.ttl}, or {@link OptionsBase.maxSize}.\n *\n * If {@link OptionsBase.ttl} is used alone, then it is strongly advised\n * (and in fact required by the type definitions here) that the cache\n * also set {@link OptionsBase.ttlAutopurge}, to prevent potentially\n * unbounded storage.\n *\n * All options are also available on the {@link LRUCache} instance, making\n * it safe to pass an LRUCache instance as the options argumemnt to\n * make another empty cache of the same type.\n *\n * Some options are marked as read-only, because changing them after\n * instantiation is not safe. Changing any of the other options will of\n * course only have an effect on subsequent method calls.\n */\n export interface OptionsBase {\n /**\n * The maximum number of items to store in the cache before evicting\n * old entries. This is read-only on the {@link LRUCache} instance,\n * and may not be overridden.\n *\n * If set, then storage space will be pre-allocated at construction\n * time, and the cache will perform significantly faster.\n *\n * Note that significantly fewer items may be stored, if\n * {@link OptionsBase.maxSize} and/or {@link OptionsBase.ttl} are also\n * set.\n *\n * **It is strongly recommended to set a `max` to prevent unbounded growth\n * of the cache.**\n */\n max?: Count\n\n /**\n * Max time in milliseconds for items to live in cache before they are\n * considered stale. Note that stale items are NOT preemptively removed by\n * default, and MAY live in the cache, contributing to its LRU max, long\n * after they have expired, unless {@link OptionsBase.ttlAutopurge} is\n * set.\n *\n * If set to `0` (the default value), then that means \"do not track\n * TTL\", not \"expire immediately\".\n *\n * Also, as this cache is optimized for LRU/MRU operations, some of\n * the staleness/TTL checks will reduce performance, as they will incur\n * overhead by deleting items.\n *\n * This is not primarily a TTL cache, and does not make strong TTL\n * guarantees. There is no pre-emptive pruning of expired items, but you\n * _may_ set a TTL on the cache, and it will treat expired items as missing\n * when they are fetched, and delete them.\n *\n * Optional, but must be a non-negative integer in ms if specified.\n *\n * This may be overridden by passing an options object to `cache.set()`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if ttl tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * If ttl tracking is enabled, and `max` and `maxSize` are not set,\n * and `ttlAutopurge` is not set, then a warning will be emitted\n * cautioning about the potential for unbounded memory consumption.\n * (The TypeScript definitions will also discourage this.)\n */\n ttl?: Milliseconds\n\n /**\n * Minimum amount of time in ms in which to check for staleness.\n * Defaults to 1, which means that the current time is checked\n * at most once per millisecond.\n *\n * Set to 0 to check the current time every time staleness is tested.\n * (This reduces performance, and is theoretically unnecessary.)\n *\n * Setting this to a higher value will improve performance somewhat\n * while using ttl tracking, albeit at the expense of keeping stale\n * items around a bit longer than their TTLs would indicate.\n *\n * @default 1\n */\n ttlResolution?: Milliseconds\n\n /**\n * Preemptively remove stale items from the cache.\n *\n * Note that this may *significantly* degrade performance, especially if\n * the cache is storing a large number of items. It is almost always best\n * to just leave the stale items in the cache, and let them fall out as new\n * items are added.\n *\n * Note that this means that {@link OptionsBase.allowStale} is a bit\n * pointless, as stale items will be deleted almost as soon as they\n * expire.\n *\n * Use with caution!\n */\n ttlAutopurge?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever it is retrieved from cache with\n * {@link LRUCache#get}, causing it to not expire. (It can still fall out\n * of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n */\n updateAgeOnGet?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever its presence in the cache is\n * checked with {@link LRUCache#has}, causing it to not expire. (It can\n * still fall out of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n */\n updateAgeOnHas?: boolean\n\n /**\n * Allow {@link LRUCache#get} and {@link LRUCache#fetch} calls to return\n * stale data, if available.\n *\n * By default, if you set `ttl`, stale items will only be deleted from the\n * cache when you `get(key)`. That is, it's not preemptively pruning items,\n * unless {@link OptionsBase.ttlAutopurge} is set.\n *\n * If you set `allowStale:true`, it'll return the stale value *as well as*\n * deleting it. If you don't set this, then it'll return `undefined` when\n * you try to get a stale entry.\n *\n * Note that when a stale entry is fetched, _even if it is returned due to\n * `allowStale` being set_, it is removed from the cache immediately. You\n * can suppress this behavior by setting\n * {@link OptionsBase.noDeleteOnStaleGet}, either in the constructor, or in\n * the options provided to {@link LRUCache#get}.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n * The `cache.has()` method will always return `false` for stale items.\n *\n * Only relevant if a ttl is set.\n */\n allowStale?: boolean\n\n /**\n * Function that is called on items when they are dropped from the\n * cache, as `dispose(value, key, reason)`.\n *\n * This can be handy if you want to close file descriptors or do\n * other cleanup tasks when items are no longer stored in the cache.\n *\n * **NOTE**: It is called _before_ the item has been fully removed\n * from the cache, so if you want to put it right back in, you need\n * to wait until the next tick. If you try to add it back in during\n * the `dispose()` function call, it will break things in subtle and\n * weird ways.\n *\n * Unlike several other options, this may _not_ be overridden by\n * passing an option to `set()`, for performance reasons.\n *\n * The `reason` will be one of the following strings, corresponding\n * to the reason for the item's deletion:\n *\n * - `evict` Item was evicted to make space for a new addition\n * - `set` Item was overwritten by a new value\n * - `expire` Item expired its TTL\n * - `fetch` Item was deleted due to a failed or aborted fetch, or a\n * fetchMethod returning `undefined.\n * - `delete` Item was removed by explicit `cache.delete(key)`,\n * `cache.clear()`, or `cache.set(key, undefined)`.\n */\n dispose?: Disposer\n\n /**\n * Function that is called when new items are inserted into the cache,\n * as `onInsert(value, key, reason)`.\n *\n * This can be useful if you need to perform actions when an item is\n * added, such as logging or tracking insertions.\n *\n * Unlike some other options, this may _not_ be overridden by passing\n * an option to `set()`, for performance and consistency reasons.\n */\n onInsert?: Inserter\n\n /**\n * The same as {@link OptionsBase.dispose}, but called *after* the entry\n * is completely removed and the cache is once again in a clean state.\n *\n * It is safe to add an item right back into the cache at this point.\n * However, note that it is *very* easy to inadvertently create infinite\n * recursion this way.\n */\n disposeAfter?: Disposer\n\n /**\n * Set to true to suppress calling the\n * {@link OptionsBase.dispose} function if the entry key is\n * still accessible within the cache.\n *\n * This may be overridden by passing an options object to\n * {@link LRUCache#set}.\n *\n * Only relevant if `dispose` or `disposeAfter` are set.\n */\n noDisposeOnSet?: boolean\n\n /**\n * Boolean flag to tell the cache to not update the TTL when setting a new\n * value for an existing key (ie, when updating a value rather than\n * inserting a new value). Note that the TTL value is _always_ set (if\n * provided) when adding a new entry into the cache.\n *\n * Has no effect if a {@link OptionsBase.ttl} is not set.\n *\n * May be passed as an option to {@link LRUCache#set}.\n */\n noUpdateTTL?: boolean\n\n /**\n * Set to a positive integer to track the sizes of items added to the\n * cache, and automatically evict items in order to stay below this size.\n * Note that this may result in fewer than `max` items being stored.\n *\n * Attempting to add an item to the cache whose calculated size is greater\n * that this amount will be a no-op. The item will not be cached, and no\n * other items will be evicted.\n *\n * Optional, must be a positive integer if provided.\n *\n * Sets `maxEntrySize` to the same value, unless a different value is\n * provided for `maxEntrySize`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if size tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * Note also that size tracking can negatively impact performance,\n * though for most cases, only minimally.\n */\n maxSize?: Size\n\n /**\n * The effective size for background fetch promises.\n *\n * This has no effect unless `maxSize` and `sizeCalculation` are used,\n * and a {@link LRUCache.OptionsBase.fetchMethod} is provided to\n * support {@link LRUCache#fetch}.\n *\n * If a stale value is present in the cache, then the effective size of\n * the background fetch is the size of the stale item it will eventually\n * replace. If not, then this value is used as its effective size.\n *\n * @default 1\n */\n backgroundFetchSize?: number\n\n /**\n * The maximum allowed size for any single item in the cache.\n *\n * If a larger item is passed to {@link LRUCache#set} or returned by a\n * {@link OptionsBase.fetchMethod} or {@link OptionsBase.memoMethod}, then\n * it will not be stored in the cache.\n *\n * Attempting to add an item whose calculated size is greater than\n * this amount will not cache the item or evict any old items, but\n * WILL delete an existing value if one is already present.\n *\n * Optional, must be a positive integer if provided. Defaults to\n * the value of `maxSize` if provided.\n */\n maxEntrySize?: Size\n\n /**\n * A function that returns a number indicating the item's size.\n *\n * Requires {@link OptionsBase.maxSize} to be set.\n *\n * If not provided, and {@link OptionsBase.maxSize} or\n * {@link OptionsBase.maxEntrySize} are set, then all\n * {@link LRUCache#set} calls **must** provide an explicit\n * {@link SetOptions.size} or sizeCalculation param.\n */\n sizeCalculation?: SizeCalculator\n\n /**\n * Method that provides the implementation for {@link LRUCache#fetch}\n *\n * ```ts\n * fetchMethod(key, staleValue, { signal, options, context })\n * ```\n *\n * If `fetchMethod` is not provided, then `cache.fetch(key)` is equivalent\n * to `Promise.resolve(cache.get(key))`.\n *\n * If at any time, `signal.aborted` is set to `true`, or if the\n * `signal.onabort` method is called, or if it emits an `'abort'` event\n * which you can listen to with `addEventListener`, then that means that\n * the fetch should be abandoned. This may be passed along to async\n * functions aware of AbortController/AbortSignal behavior.\n *\n * The `fetchMethod` should **only** return `undefined` or a Promise\n * resolving to `undefined` if the AbortController signaled an `abort`\n * event. In all other cases, it should return or resolve to a value\n * suitable for adding to the cache.\n *\n * The `options` object is a union of the options that may be provided to\n * `set()` and `get()`. If they are modified, then that will result in\n * modifying the settings to `cache.set()` when the value is resolved, and\n * in the case of\n * {@link OptionsBase.noDeleteOnFetchRejection} and\n * {@link OptionsBase.allowStaleOnFetchRejection}, the handling of\n * `fetchMethod` failures.\n *\n * For example, a DNS cache may update the TTL based on the value returned\n * from a remote DNS server by changing `options.ttl` in the `fetchMethod`.\n */\n fetchMethod?: Fetcher\n\n /**\n * Method that provides the implementation for {@link LRUCache#memo}\n */\n memoMethod?: Memoizer\n\n /**\n * Set to true to suppress the deletion of stale data when a\n * {@link OptionsBase.fetchMethod} returns a rejected promise.\n */\n noDeleteOnFetchRejection?: boolean\n\n /**\n * Do not delete stale items when they are retrieved with\n * {@link LRUCache#get}.\n *\n * Note that the `get` return value will still be `undefined`\n * unless {@link OptionsBase.allowStale} is true.\n *\n * When using time-expiring entries with `ttl`, by default stale\n * items will be removed from the cache when the key is accessed\n * with `cache.get()`.\n *\n * Setting this option will cause stale items to remain in the cache, until\n * they are explicitly deleted with `cache.delete(key)`, or retrieved with\n * `noDeleteOnStaleGet` set to `false`.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n *\n * Only relevant if a ttl is used.\n */\n noDeleteOnStaleGet?: boolean\n\n /**\n * Set to true to allow returning stale data when a\n * {@link OptionsBase.fetchMethod} throws an error or returns a rejected\n * promise.\n *\n * This differs from using {@link OptionsBase.allowStale} in that stale\n * data will ONLY be returned in the case that the {@link LRUCache#fetch}\n * fails, not any other times.\n *\n * If a `fetchMethod` fails, and there is no stale value available, the\n * `fetch()` will resolve to `undefined`. Ie, all `fetchMethod` errors are\n * suppressed.\n *\n * Implies `noDeleteOnFetchRejection`.\n *\n * This may be set in calls to `fetch()`, or defaulted on the constructor,\n * or overridden by modifying the options object in the `fetchMethod`.\n */\n allowStaleOnFetchRejection?: boolean\n\n /**\n * Set to true to return a stale value from the cache when the\n * `AbortSignal` passed to the {@link OptionsBase.fetchMethod} dispatches\n * an `'abort'` event, whether user-triggered, or due to internal cache\n * behavior.\n *\n * Unless {@link OptionsBase.ignoreFetchAbort} is also set, the underlying\n * {@link OptionsBase.fetchMethod} will still be considered canceled, and\n * any value it returns will be ignored and not cached.\n *\n * Caveat: since fetches are aborted when a new value is explicitly\n * set in the cache, this can lead to fetch returning a stale value,\n * since that was the fallback value _at the moment the `fetch()` was\n * initiated_, even though the new updated value is now present in\n * the cache.\n *\n * For example:\n *\n * ```ts\n * const cache = new LRUCache({\n * ttl: 100,\n * fetchMethod: async (url, oldValue, { signal }) => {\n * const res = await fetch(url, { signal })\n * return await res.json()\n * }\n * })\n * cache.set('https://example.com/', { some: 'data' })\n * // 100ms go by...\n * const result = cache.fetch('https://example.com/')\n * cache.set('https://example.com/', { other: 'thing' })\n * console.log(await result) // { some: 'data' }\n * console.log(cache.get('https://example.com/')) // { other: 'thing' }\n * ```\n */\n allowStaleOnFetchAbort?: boolean\n\n /**\n * Set to true to ignore the `abort` event emitted by the `AbortSignal`\n * object passed to {@link OptionsBase.fetchMethod}, and still cache the\n * resulting resolution value, as long as it is not `undefined`.\n *\n * When used on its own, this means aborted {@link LRUCache#fetch} calls\n * are not immediately resolved or rejected when they are aborted, and\n * instead take the full time to await.\n *\n * When used with {@link OptionsBase.allowStaleOnFetchAbort}, aborted\n * {@link LRUCache#fetch} calls will resolve immediately to their stale\n * cached value or `undefined`, and will continue to process and eventually\n * update the cache when they resolve, as long as the resulting value is\n * not `undefined`, thus supporting a \"return stale on timeout while\n * refreshing\" mechanism by passing `AbortSignal.timeout(n)` as the signal.\n *\n * For example:\n *\n * ```ts\n * const c = new LRUCache({\n * ttl: 100,\n * ignoreFetchAbort: true,\n * allowStaleOnFetchAbort: true,\n * fetchMethod: async (key, oldValue, { signal }) => {\n * // note: do NOT pass the signal to fetch()!\n * // let's say this fetch can take a long time.\n * const res = await fetch(`https://slow-backend-server/${key}`)\n * return await res.json()\n * },\n * })\n *\n * // this will return the stale value after 100ms, while still\n * // updating in the background for next time.\n * const val = await c.fetch('key', { signal: AbortSignal.timeout(100) })\n * ```\n *\n * **Note**: regardless of this setting, an `abort` event _is still\n * emitted on the `AbortSignal` object_, so may result in invalid results\n * when passed to other underlying APIs that use AbortSignals.\n *\n * This may be overridden in the {@link OptionsBase.fetchMethod} or the\n * call to {@link LRUCache#fetch}.\n */\n ignoreFetchAbort?: boolean\n\n /**\n * In some cases, you may want to swap out the performance/Date object\n * used for TTL tracking. This should almost certainly NOT be done in\n * production environments!\n *\n * This value defaults to `global.performance` if it has a `now()` method,\n * or the `global.Date` object otherwise.\n */\n perf?: Perf\n }\n\n export interface OptionsMaxLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n max: Count\n }\n export interface OptionsTTLLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n ttl: Milliseconds\n ttlAutopurge: boolean\n }\n export interface OptionsSizeLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n maxSize: Size\n }\n\n /**\n * The valid safe options for the {@link LRUCache} constructor\n */\n export type Options =\n | OptionsMaxLimit\n | OptionsSizeLimit\n | OptionsTTLLimit\n\n /**\n * Entry objects used by {@link LRUCache#load} and {@link LRUCache#dump},\n * and returned by {@link LRUCache#info}.\n */\n export interface Entry {\n value: V\n ttl?: Milliseconds\n size?: Size\n start?: Milliseconds\n }\n}\n\n/**\n * Default export, the thing you're using this module to get.\n *\n * The `K` and `V` types define the key and value types, respectively. The\n * optional `FC` type defines the type of the `context` object passed to\n * `cache.fetch()` and `cache.memo()`.\n *\n * Keys and values **must not** be `null` or `undefined`.\n *\n * All properties from the options object (with the exception of `max`,\n * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are\n * added as normal public members. (The listed options are read-only getters.)\n *\n * Changing any of these will alter the defaults for subsequent method calls.\n */\nexport class LRUCache {\n // options that cannot be changed without disaster\n readonly #max: LRUCache.Count\n readonly #maxSize: LRUCache.Size\n readonly #dispose?: LRUCache.Disposer\n readonly #onInsert?: LRUCache.Inserter\n readonly #disposeAfter?: LRUCache.Disposer\n readonly #fetchMethod?: LRUCache.Fetcher\n readonly #memoMethod?: LRUCache.Memoizer\n readonly #perf: Perf\n\n /**\n * {@link LRUCache.OptionsBase.perf}\n */\n get perf() {\n return this.#perf\n }\n\n /**\n * {@link LRUCache.OptionsBase.ttl}\n */\n ttl: LRUCache.Milliseconds\n\n /**\n * {@link LRUCache.OptionsBase.ttlResolution}\n */\n ttlResolution: LRUCache.Milliseconds\n /**\n * {@link LRUCache.OptionsBase.ttlAutopurge}\n */\n ttlAutopurge: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnGet}\n */\n updateAgeOnGet: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnHas}\n */\n updateAgeOnHas: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStale}\n */\n allowStale: boolean\n\n /**\n * {@link LRUCache.OptionsBase.noDisposeOnSet}\n */\n noDisposeOnSet: boolean\n /**\n * {@link LRUCache.OptionsBase.noUpdateTTL}\n */\n noUpdateTTL: boolean\n /**\n * {@link LRUCache.OptionsBase.maxEntrySize}\n */\n maxEntrySize: LRUCache.Size\n /**\n * {@link LRUCache.OptionsBase.sizeCalculation}\n */\n sizeCalculation?: LRUCache.SizeCalculator\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection}\n */\n noDeleteOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnStaleGet}\n */\n noDeleteOnStaleGet: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}\n */\n allowStaleOnFetchAbort: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection}\n */\n allowStaleOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.ignoreFetchAbort}\n */\n ignoreFetchAbort: boolean\n\n /** {@link LRUCache.OptionsBase.backgroundFetchSize} */\n backgroundFetchSize: number\n\n // computed properties\n #size: LRUCache.Count\n #calculatedSize: LRUCache.Size\n #keyMap: Map\n #keyList: (K | undefined)[]\n #valList: (V | BackgroundFetch | undefined)[]\n #next: NumberArray\n #prev: NumberArray\n #head: Index\n #tail: Index\n #free: StackLike\n #disposed?: DisposeTask[]\n #sizes?: ZeroArray\n #starts?: ZeroArray\n #ttls?: ZeroArray\n #autopurgeTimers?: (undefined | ReturnType)[]\n\n #hasDispose: boolean\n #hasFetchMethod: boolean\n #hasDisposeAfter: boolean\n #hasOnInsert: boolean\n\n /**\n * Do not call this method unless you need to inspect the\n * inner workings of the cache. If anything returned by this\n * object is modified in any way, strange breakage may occur.\n *\n * These fields are private for a reason!\n *\n * @internal\n */\n static unsafeExposeInternals<\n K extends {},\n V extends {},\n FC extends unknown = unknown,\n >(c: LRUCache) {\n return {\n // properties\n starts: c.#starts,\n ttls: c.#ttls,\n autopurgeTimers: c.#autopurgeTimers,\n sizes: c.#sizes,\n keyMap: c.#keyMap as Map,\n keyList: c.#keyList,\n valList: c.#valList,\n next: c.#next,\n prev: c.#prev,\n get head() {\n return c.#head\n },\n get tail() {\n return c.#tail\n },\n free: c.#free,\n // methods\n isBackgroundFetch: (p: unknown) => c.#isBackgroundFetch(p),\n backgroundFetch: (\n k: K,\n index: number | undefined,\n options: LRUCache.FetchOptions,\n context: unknown,\n ): BackgroundFetch =>\n c.#backgroundFetch(\n k,\n index as Index | undefined,\n options,\n context as FC,\n ),\n moveToTail: (index: number): void => c.#moveToTail(index as Index),\n indexes: (options?: { allowStale: boolean }) => c.#indexes(options),\n rindexes: (options?: { allowStale: boolean }) =>\n c.#rindexes(options),\n isStale: (index: number | undefined) => c.#isStale(index as Index),\n }\n }\n\n // Protected read-only members\n\n /**\n * {@link LRUCache.OptionsBase.max} (read-only)\n */\n get max(): LRUCache.Count {\n return this.#max\n }\n /**\n * {@link LRUCache.OptionsBase.maxSize} (read-only)\n */\n get maxSize(): LRUCache.Count {\n return this.#maxSize\n }\n /**\n * The total computed size of items in the cache (read-only)\n */\n get calculatedSize(): LRUCache.Size {\n return this.#calculatedSize\n }\n /**\n * The number of items stored in the cache (read-only)\n */\n get size(): LRUCache.Count {\n return this.#size\n }\n /**\n * {@link LRUCache.OptionsBase.fetchMethod} (read-only)\n */\n get fetchMethod(): LRUCache.Fetcher | undefined {\n return this.#fetchMethod\n }\n get memoMethod(): LRUCache.Memoizer | undefined {\n return this.#memoMethod\n }\n /**\n * {@link LRUCache.OptionsBase.dispose} (read-only)\n */\n get dispose() {\n return this.#dispose\n }\n /**\n * {@link LRUCache.OptionsBase.onInsert} (read-only)\n */\n get onInsert() {\n return this.#onInsert\n }\n /**\n * {@link LRUCache.OptionsBase.disposeAfter} (read-only)\n */\n get disposeAfter() {\n return this.#disposeAfter\n }\n\n constructor(options: LRUCache.Options | LRUCache) {\n const {\n max = 0,\n ttl,\n ttlResolution = 1,\n ttlAutopurge,\n updateAgeOnGet,\n updateAgeOnHas,\n allowStale,\n dispose,\n onInsert,\n disposeAfter,\n noDisposeOnSet,\n noUpdateTTL,\n maxSize = 0,\n maxEntrySize = 0,\n sizeCalculation,\n fetchMethod,\n memoMethod,\n noDeleteOnFetchRejection,\n noDeleteOnStaleGet,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n backgroundFetchSize = 1,\n perf,\n } = options\n\n this.backgroundFetchSize = backgroundFetchSize\n\n if (perf !== undefined) {\n if (typeof perf?.now !== 'function') {\n throw new TypeError(\n 'perf option must have a now() method if specified',\n )\n }\n }\n\n this.#perf = perf ?? defaultPerf\n\n if (max !== 0 && !isPosInt(max)) {\n throw new TypeError('max option must be a nonnegative integer')\n }\n\n const UintArray = max ? getUintArray(max) : Array\n if (!UintArray) {\n throw new Error('invalid max value: ' + max)\n }\n\n this.#max = max\n this.#maxSize = maxSize\n this.maxEntrySize = maxEntrySize || this.#maxSize\n this.sizeCalculation = sizeCalculation\n if (this.sizeCalculation) {\n if (!this.#maxSize && !this.maxEntrySize) {\n throw new TypeError(\n 'cannot set sizeCalculation without setting maxSize or maxEntrySize',\n )\n }\n if (typeof this.sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation set to non-function')\n }\n }\n\n if (memoMethod !== undefined && typeof memoMethod !== 'function') {\n throw new TypeError('memoMethod must be a function if defined')\n }\n this.#memoMethod = memoMethod\n\n if (fetchMethod !== undefined && typeof fetchMethod !== 'function') {\n throw new TypeError('fetchMethod must be a function if specified')\n }\n this.#fetchMethod = fetchMethod\n this.#hasFetchMethod = !!fetchMethod\n\n this.#keyMap = new Map()\n this.#keyList = Array.from({ length: max }).fill(undefined) as (\n | K\n | undefined\n )[]\n this.#valList = Array.from({ length: max }).fill(undefined) as (\n | V\n | undefined\n )[]\n this.#next = new UintArray(max)\n this.#prev = new UintArray(max)\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free = Stack.create(max)\n this.#size = 0\n this.#calculatedSize = 0\n\n if (typeof dispose === 'function') {\n this.#dispose = dispose\n }\n if (typeof onInsert === 'function') {\n this.#onInsert = onInsert\n }\n if (typeof disposeAfter === 'function') {\n this.#disposeAfter = disposeAfter\n this.#disposed = []\n } else {\n this.#disposeAfter = undefined\n this.#disposed = undefined\n }\n this.#hasDispose = !!this.#dispose\n this.#hasOnInsert = !!this.#onInsert\n this.#hasDisposeAfter = !!this.#disposeAfter\n\n this.noDisposeOnSet = !!noDisposeOnSet\n this.noUpdateTTL = !!noUpdateTTL\n this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection\n this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection\n this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort\n this.ignoreFetchAbort = !!ignoreFetchAbort\n\n // NB: maxEntrySize is set to maxSize if it's set\n if (this.maxEntrySize !== 0) {\n if (this.#maxSize !== 0) {\n if (!isPosInt(this.#maxSize)) {\n throw new TypeError(\n 'maxSize must be a positive integer if specified',\n )\n }\n }\n if (!isPosInt(this.maxEntrySize)) {\n throw new TypeError(\n 'maxEntrySize must be a positive integer if specified',\n )\n }\n this.#initializeSizeTracking()\n }\n\n this.allowStale = !!allowStale\n this.noDeleteOnStaleGet = !!noDeleteOnStaleGet\n this.updateAgeOnGet = !!updateAgeOnGet\n this.updateAgeOnHas = !!updateAgeOnHas\n this.ttlResolution =\n isPosInt(ttlResolution) || ttlResolution === 0 ? ttlResolution : 1\n this.ttlAutopurge = !!ttlAutopurge\n this.ttl = ttl || 0\n if (this.ttl) {\n if (!isPosInt(this.ttl)) {\n throw new TypeError('ttl must be a positive integer if specified')\n }\n this.#initializeTTLTracking()\n }\n\n // do not allow completely unbounded caches\n if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) {\n throw new TypeError(\n 'At least one of max, maxSize, or ttl is required',\n )\n }\n if (!this.ttlAutopurge && !this.#max && !this.#maxSize) {\n const code = 'LRU_CACHE_UNBOUNDED'\n if (shouldWarn(code)) {\n warned.add(code)\n const msg =\n 'TTL caching without ttlAutopurge, max, or maxSize can ' +\n 'result in unbounded memory consumption.'\n emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache)\n }\n }\n }\n\n /**\n * Return the number of ms left in the item's TTL. If item is not in cache,\n * returns `0`. Returns `Infinity` if item is in cache without a defined TTL.\n */\n getRemainingTTL(key: K) {\n return this.#keyMap.has(key) ? Infinity : 0\n }\n\n #initializeTTLTracking() {\n const ttls = new ZeroArray(this.#max)\n const starts = new ZeroArray(this.#max)\n this.#ttls = ttls\n this.#starts = starts\n const purgeTimers =\n this.ttlAutopurge ?\n Array.from>({\n length: this.#max,\n })\n : undefined\n this.#autopurgeTimers = purgeTimers\n\n this.#setItemTTL = (index, ttl, start = this.#perf.now()) => {\n starts[index] = ttl !== 0 ? start : 0\n ttls[index] = ttl\n setPurgetTimer(index, ttl)\n }\n\n this.#updateItemAge = index => {\n starts[index] = ttls[index] !== 0 ? this.#perf.now() : 0\n setPurgetTimer(index, ttls[index])\n }\n\n // clear out the purge timer if we're setting TTL to 0, and\n // previously had a ttl purge timer running, so it doesn't\n // fire unnecessarily. Don't need to do this if we're not doing\n // autopurge.\n const setPurgetTimer =\n !this.ttlAutopurge ?\n () => {}\n : (index: Index, ttl?: number) => {\n if (purgeTimers?.[index]) {\n clearTimeout(purgeTimers[index])\n purgeTimers[index] = undefined\n }\n if (ttl && ttl !== 0 && purgeTimers) {\n const t = setTimeout(() => {\n if (this.#isStale(index)) {\n this.#delete(this.#keyList[index] as K, 'expire')\n }\n }, ttl + 1)\n // unref() not supported on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n purgeTimers[index] = t\n }\n }\n\n this.#statusTTL = (status, index) => {\n if (ttls[index]) {\n const ttl = ttls[index]\n const start = starts[index]\n /* c8 ignore start */\n if (!ttl || !start) {\n return\n }\n /* c8 ignore stop */\n status.ttl = ttl\n status.start = start\n status.now = cachedNow || getNow()\n const age = status.now - start\n status.remainingTTL = ttl - age\n }\n }\n\n // debounce calls to perf.now() to 1s so we're not hitting\n // that costly call repeatedly.\n let cachedNow = 0\n const getNow = () => {\n const n = this.#perf.now()\n if (this.ttlResolution > 0) {\n cachedNow = n\n const t = setTimeout(() => (cachedNow = 0), this.ttlResolution)\n // not available on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n }\n return n\n }\n\n this.getRemainingTTL = key => {\n const index = this.#keyMap.get(key)\n if (index === undefined) {\n return 0\n }\n const ttl = ttls[index]\n const start = starts[index]\n if (!ttl || !start) {\n return Infinity\n }\n const age = (cachedNow || getNow()) - start\n return ttl - age\n }\n\n this.#isStale = index => {\n const s = starts[index]\n const t = ttls[index]\n return !!t && !!s && (cachedNow || getNow()) - s > t\n }\n }\n\n // conditionally set private methods related to TTL\n #updateItemAge: (index: Index) => void = () => {}\n #statusTTL: (status: LRUCache.Status, index: Index) => void =\n () => {}\n #setItemTTL: (\n index: Index,\n ttl: LRUCache.Milliseconds,\n start?: LRUCache.Milliseconds,\n // ignore because we never call this if we're not already in TTL mode\n /* c8 ignore start */\n ) => void = () => {}\n /* c8 ignore stop */\n\n #isStale: (index: Index) => boolean = () => false\n\n #initializeSizeTracking() {\n const sizes = new ZeroArray(this.#max)\n this.#calculatedSize = 0\n this.#sizes = sizes\n this.#removeItemSize = index => {\n this.#calculatedSize -= sizes[index] as number\n sizes[index] = 0\n }\n this.#requireSize = (k, v, size, sizeCalculation) => {\n if (!isPosInt(size)) {\n // provisionally accept background fetches.\n // actual value size will be checked when they return.\n if (this.#isBackgroundFetch(v)) {\n // NB: this cannot occur if v.__staleWhileFetching is set,\n // because in that case, it would take on the size of the\n // existing entry that it temporarily replaces.\n return this.backgroundFetchSize\n }\n if (sizeCalculation) {\n if (typeof sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation must be a function')\n }\n size = sizeCalculation(v, k)\n if (!isPosInt(size)) {\n throw new TypeError(\n 'sizeCalculation return invalid (expect positive integer)',\n )\n }\n } else {\n throw new TypeError(\n 'invalid size value (must be positive integer). ' +\n 'When maxSize or maxEntrySize is used, sizeCalculation ' +\n 'or size must be set.',\n )\n }\n }\n return size\n }\n\n this.#addItemSize = (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status,\n ) => {\n sizes[index] = size\n if (this.#maxSize) {\n const maxSize = this.#maxSize - sizes[index]\n while (this.#calculatedSize > maxSize) {\n this.#evict(true)\n }\n }\n this.#calculatedSize += sizes[index]\n if (status) {\n status.entrySize = size\n status.totalCalculatedSize = this.#calculatedSize\n }\n }\n }\n\n #removeItemSize: (index: Index) => void = _i => {}\n\n #addItemSize: (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status,\n ) => void = (_i, _s, _st) => {}\n\n #requireSize: (\n k: K,\n v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator,\n status?: LRUCache.Status,\n ) => LRUCache.Size = (\n _k: K,\n _v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator,\n ) => {\n if (size || sizeCalculation) {\n throw new TypeError(\n 'cannot set size without setting maxSize or maxEntrySize on cache',\n )\n }\n return 0\n };\n\n *#indexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#tail; this.#isValidIndex(i); ) {\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#head) {\n break\n } else {\n i = this.#prev[i] as Index\n }\n }\n }\n }\n\n *#rindexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#head; this.#isValidIndex(i); ) {\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#tail) {\n break\n } else {\n i = this.#next[i] as Index\n }\n }\n }\n }\n\n #isValidIndex(index: Index) {\n return (\n index !== undefined &&\n this.#keyMap.get(this.#keyList[index] as K) === index\n )\n }\n\n /**\n * Return a generator yielding `[key, value]` pairs,\n * in order from most recently used to least recently used.\n */\n *entries() {\n for (const i of this.#indexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]] as [K, V]\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.entries}\n *\n * Return a generator yielding `[key, value]` pairs,\n * in order from least recently used to most recently used.\n */\n *rentries() {\n for (const i of this.#rindexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]]\n }\n }\n }\n\n /**\n * Return a generator yielding the keys in the cache,\n * in order from most recently used to least recently used.\n */\n *keys() {\n for (const i of this.#indexes()) {\n const k = this.#keyList[i]\n if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield k\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.keys}\n *\n * Return a generator yielding the keys in the cache,\n * in order from least recently used to most recently used.\n */\n *rkeys() {\n for (const i of this.#rindexes()) {\n const k = this.#keyList[i]\n if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield k\n }\n }\n }\n\n /**\n * Return a generator yielding the values in the cache,\n * in order from most recently used to least recently used.\n */\n *values() {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i] as V\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.values}\n *\n * Return a generator yielding the values in the cache,\n * in order from least recently used to most recently used.\n */\n *rvalues() {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i]\n }\n }\n }\n\n /**\n * Iterating over the cache itself yields the same results as\n * {@link LRUCache.entries}\n */\n [Symbol.iterator]() {\n return this.entries()\n }\n\n /**\n * A String value that is used in the creation of the default string\n * description of an object. Called by the built-in method\n * `Object.prototype.toString`.\n */\n [Symbol.toStringTag] = 'LRUCache'\n\n /**\n * Find a value for which the supplied fn method returns a truthy value,\n * similar to `Array.find()`. fn is called as `fn(value, key, cache)`.\n */\n find(\n fn: (v: V, k: K, self: LRUCache) => boolean,\n getOptions: LRUCache.GetOptions = {},\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n if (fn(value, this.#keyList[i] as K, this)) {\n return this.#get(this.#keyList[i] as K, getOptions)\n }\n }\n }\n\n /**\n * Call the supplied function on each item in the cache, in order from most\n * recently used to least recently used.\n *\n * `fn` is called as `fn(value, key, cache)`.\n *\n * If `thisp` is provided, function will be called in the `this`-context of\n * the provided object, or the cache if no `thisp` object is provided.\n *\n * Does not update age or recenty of use, or iterate over stale values.\n */\n forEach(\n fn: (v: V, k: K, self: LRUCache) => unknown,\n thisp: unknown = this,\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * The same as {@link LRUCache.forEach} but items are iterated over in\n * reverse order. (ie, less recently used items are iterated over first.)\n */\n rforEach(\n fn: (v: V, k: K, self: LRUCache) => unknown,\n thisp: unknown = this,\n ) {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * Delete any stale entries. Returns true if anything was removed,\n * false otherwise.\n */\n purgeStale() {\n let deleted = false\n for (const i of this.#rindexes({ allowStale: true })) {\n if (this.#isStale(i)) {\n this.#delete(this.#keyList[i] as K, 'expire')\n deleted = true\n }\n }\n return deleted\n }\n\n /**\n * Get the extended info about a given entry, to get its value, size, and\n * TTL info simultaneously. Returns `undefined` if the key is not present.\n *\n * Unlike {@link LRUCache#dump}, which is designed to be portable and survive\n * serialization, the `start` value is always the current timestamp, and the\n * `ttl` is a calculated remaining time to live (negative if expired).\n *\n * Always returns stale values, if their info is found in the cache, so be\n * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl})\n * if relevant.\n */\n info(key: K): LRUCache.Entry | undefined {\n const i = this.#keyMap.get(key)\n if (i === undefined) return undefined\n const v = this.#valList[i]\n /* c8 ignore start - this isn't tested for the info function,\n * but it's the same logic as found in other places. */\n const value: V | undefined =\n this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) return undefined\n /* c8 ignore stop */\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n const ttl = this.#ttls[i]\n const start = this.#starts[i]\n if (ttl && start) {\n const remain = ttl - (this.#perf.now() - start)\n entry.ttl = remain\n entry.start = Date.now()\n }\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n return entry\n }\n\n /**\n * Return an array of [key, {@link LRUCache.Entry}] tuples which can be\n * passed to {@link LRUCache#load}.\n *\n * The `start` fields are calculated relative to a portable `Date.now()`\n * timestamp, even if `performance.now()` is available.\n *\n * Stale entries are always included in the `dump`, even if\n * {@link LRUCache.OptionsBase.allowStale} is false.\n *\n * Note: this returns an actual array, not a generator, so it can be more\n * easily passed around.\n */\n dump() {\n const arr: [K, LRUCache.Entry][] = []\n for (const i of this.#indexes({ allowStale: true })) {\n const key = this.#keyList[i]\n const v = this.#valList[i]\n const value: V | undefined =\n this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined || key === undefined) continue\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n entry.ttl = this.#ttls[i]\n // always dump the start relative to a portable timestamp\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = this.#perf.now() - (this.#starts[i] as number)\n entry.start = Math.floor(Date.now() - age)\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n arr.unshift([key, entry])\n }\n return arr\n }\n\n /**\n * Reset the cache and load in the items in entries in the order listed.\n *\n * The shape of the resulting cache may be different if the same options are\n * not used in both caches.\n *\n * The `start` fields are assumed to be calculated relative to a portable\n * `Date.now()` timestamp, even if `performance.now()` is available.\n */\n load(arr: [K, LRUCache.Entry][]) {\n this.clear()\n for (const [key, entry] of arr) {\n if (entry.start) {\n // entry.start is a portable timestamp, but we may be using\n // node's performance.now(), so calculate the offset, so that\n // we get the intended remaining TTL, no matter how long it's\n // been on ice.\n //\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = Date.now() - entry.start\n entry.start = this.#perf.now() - age\n }\n this.#set(key, entry.value, entry)\n }\n }\n\n /**\n * Add a value to the cache.\n *\n * Note: if `undefined` is specified as a value, this is an alias for\n * {@link LRUCache#delete}\n *\n * Fields on the {@link LRUCache.SetOptions} options param will override\n * their corresponding values in the constructor options for the scope\n * of this single `set()` operation.\n *\n * If `start` is provided, then that will set the effective start\n * time for the TTL calculation. Note that this must be a previous\n * value of `performance.now()` if supported, or a previous value of\n * `Date.now()` if not.\n *\n * Options object may also include `size`, which will prevent\n * calling the `sizeCalculation` function and just use the specified\n * number if it is a positive integer, and `noDisposeOnSet` which\n * will prevent calling a `dispose` function in the case of\n * overwrites.\n *\n * If the `size` (or return value of `sizeCalculation`) for a given\n * entry is greater than `maxEntrySize`, then the item will not be\n * added to the cache.\n *\n * Will update the recency of the entry.\n *\n * If the value is `undefined`, then this is an alias for\n * `cache.delete(key)`. `undefined` is never stored in the cache.\n */\n set(\n k: K,\n v: V | undefined,\n setOptions: LRUCache.SetOptions = {},\n ) {\n const { status = metrics.hasSubscribers ? {} : undefined } = setOptions\n setOptions.status = status\n if (status) {\n status.op = 'set'\n status.key = k\n if (v !== undefined) status.value = v\n status.cache = this\n }\n const result = this.#set(k, v, setOptions)\n if (status && metrics.hasSubscribers) {\n metrics.publish(status)\n }\n return result\n }\n\n #set(\n k: K,\n v: V | BackgroundFetch | undefined,\n setOptions: LRUCache.SetOptions,\n bf?: BackgroundFetch,\n ) {\n const {\n ttl = this.ttl,\n start,\n noDisposeOnSet = this.noDisposeOnSet,\n sizeCalculation = this.sizeCalculation,\n status,\n } = setOptions\n\n const isBF = this.#isBackgroundFetch(v)\n if (v === undefined) {\n if (status) status.set = 'deleted'\n this.delete(k)\n return this\n }\n let { noUpdateTTL = this.noUpdateTTL } = setOptions\n\n if (status && !isBF) status.value = v\n\n const size = this.#requireSize(\n k,\n v,\n setOptions.size || 0,\n sizeCalculation,\n status,\n )\n // if the item doesn't fit, don't do anything\n // NB: maxEntrySize set to maxSize by default\n if (this.maxEntrySize && size > this.maxEntrySize) {\n // have to delete, in case something is there already.\n this.#delete(k, 'set')\n if (status) {\n status.set = 'miss'\n status.maxEntrySizeExceeded = true\n }\n return this\n }\n let index = this.#size === 0 ? undefined : this.#keyMap.get(k)\n if (index === undefined) {\n // addition\n index = (\n this.#size === 0 ? this.#tail\n : this.#free.length !== 0 ? this.#free.pop()\n : this.#size === this.#max ? this.#evict(false)\n : this.#size) as Index\n this.#keyList[index] = k\n this.#valList[index] = v\n this.#keyMap.set(k, index)\n this.#next[this.#tail] = index\n this.#prev[index] = this.#tail\n this.#tail = index\n this.#size++\n this.#addItemSize(index, size, status)\n if (status) status.set = 'add'\n noUpdateTTL = false\n if (this.#hasOnInsert && !isBF) {\n this.#onInsert?.(v, k, 'add')\n }\n } else {\n // update\n // might be updating a background fetch!\n this.#moveToTail(index)\n const oldVal = this.#valList[index]!\n if (v !== oldVal) {\n if (!noDisposeOnSet) {\n if (this.#isBackgroundFetch(oldVal)) {\n if (oldVal !== bf) {\n // setting over a background fetch, not merely resolving it.\n oldVal.__abortController.abort(new Error('replaced'))\n }\n const { __staleWhileFetching: s } = oldVal\n if (s !== undefined && s !== v) {\n if (this.#hasDispose) {\n this.#dispose?.(s, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([s, k, 'set'])\n }\n }\n } else {\n if (this.#hasDispose) {\n this.#dispose?.(oldVal, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldVal, k, 'set'])\n }\n }\n }\n this.#removeItemSize(index)\n this.#addItemSize(index, size, status)\n this.#valList[index] = v\n if (!isBF) {\n const oldValue =\n oldVal && this.#isBackgroundFetch(oldVal) ?\n oldVal.__staleWhileFetching\n : oldVal\n const setType =\n oldValue === undefined ? 'add'\n : v !== oldValue ? 'replace'\n : 'update'\n if (status) {\n status.set = setType\n if (oldValue !== undefined) status.oldValue = oldValue\n }\n if (this.#hasOnInsert) {\n this.onInsert?.(v, k, setType)\n }\n }\n } else if (!isBF) {\n if (status) {\n status.set = 'update'\n }\n if (this.#hasOnInsert) {\n this.onInsert?.(v, k, 'update')\n }\n }\n }\n if (ttl !== 0 && !this.#ttls) {\n this.#initializeTTLTracking()\n }\n if (this.#ttls) {\n if (!noUpdateTTL) {\n this.#setItemTTL(index, ttl, start)\n }\n if (status) this.#statusTTL(status, index)\n }\n if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return this\n }\n\n /**\n * Evict the least recently used item, returning its value or\n * `undefined` if cache is empty.\n */\n pop(): V | undefined {\n try {\n while (this.#size) {\n const val = this.#valList[this.#head]\n this.#evict(true)\n if (this.#isBackgroundFetch(val)) {\n if (val.__staleWhileFetching) {\n return val.__staleWhileFetching\n }\n } else if (val !== undefined) {\n return val\n }\n }\n } finally {\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n }\n\n #evict(free: boolean) {\n const head = this.#head\n const k = this.#keyList[head]!\n const v = this.#valList[head]!\n const isBF = this.#isBackgroundFetch(v)\n if (isBF) {\n v.__abortController.abort(new Error('evicted'))\n }\n const oldValue = isBF ? v.__staleWhileFetching : v\n if (\n (this.#hasDispose || this.#hasDisposeAfter) &&\n oldValue !== undefined\n ) {\n if (this.#hasDispose) {\n this.#dispose?.(oldValue, k, 'evict')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldValue, k, 'evict'])\n }\n }\n this.#removeItemSize(head)\n if (this.#autopurgeTimers?.[head]) {\n clearTimeout(this.#autopurgeTimers[head])\n this.#autopurgeTimers[head] = undefined\n }\n // if we aren't about to use the index, then null these out\n if (free) {\n this.#keyList[head] = undefined\n this.#valList[head] = undefined\n this.#free.push(head)\n }\n if (this.#size === 1) {\n this.#head = this.#tail = 0 as Index\n this.#free.length = 0\n } else {\n this.#head = this.#next[head] as Index\n }\n this.#keyMap.delete(k)\n this.#size--\n return head\n }\n\n /**\n * Check if a key is in the cache, without updating the recency of use.\n * Will return false if the item is stale, even though it is technically\n * in the cache.\n *\n * Check if a key is in the cache, without updating the recency of\n * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set\n * to `true` in either the options or the constructor.\n *\n * Will return `false` if the item is stale, even though it is technically in\n * the cache. The difference can be determined (if it matters) by using a\n * `status` argument, and inspecting the `has` field.\n *\n * Will not update item age unless\n * {@link LRUCache.OptionsBase.updateAgeOnHas} is set.\n */\n has(k: K, hasOptions: LRUCache.HasOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } = hasOptions\n hasOptions.status = status\n if (status) {\n status.op = 'has'\n status.key = k\n status.cache = this\n }\n const result = this.#has(k, hasOptions)\n if (metrics.hasSubscribers) metrics.publish(status)\n return result\n }\n #has(k: K, hasOptions: LRUCache.HasOptions = {}) {\n const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n const v = this.#valList[index]\n if (\n this.#isBackgroundFetch(v) &&\n v.__staleWhileFetching === undefined\n ) {\n return false\n }\n if (!this.#isStale(index)) {\n if (updateAgeOnHas) {\n this.#updateItemAge(index)\n }\n if (status) {\n status.has = 'hit'\n this.#statusTTL(status, index)\n }\n return true\n } else if (status) {\n status.has = 'stale'\n this.#statusTTL(status, index)\n }\n } else if (status) {\n status.has = 'miss'\n }\n return false\n }\n\n /**\n * Like {@link LRUCache#get} but doesn't update recency or delete stale\n * items.\n *\n * Returns `undefined` if the item is stale, unless\n * {@link LRUCache.OptionsBase.allowStale} is set.\n */\n peek(k: K, peekOptions: LRUCache.PeekOptions = {}) {\n const { status = hasSubscribers() ? {} : undefined } = peekOptions\n if (status) {\n status.op = 'peek'\n status.key = k\n status.cache = this\n }\n peekOptions.status = status\n const result = this.#peek(k, peekOptions)\n if (metrics.hasSubscribers) {\n metrics.publish(status)\n }\n return result\n }\n #peek(k: K, peekOptions: LRUCache.PeekOptions) {\n const { status, allowStale = this.allowStale } = peekOptions\n const index = this.#keyMap.get(k)\n if (index === undefined || (!allowStale && this.#isStale(index))) {\n if (status) status.peek = index === undefined ? 'miss' : 'stale'\n return undefined\n }\n const v = this.#valList[index]\n const val = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (status) {\n if (val !== undefined) {\n status.peek = 'hit'\n status.value = val\n } else {\n status.peek = 'miss'\n }\n }\n return val\n }\n\n #backgroundFetch(\n k: K,\n index: Index | undefined,\n options: LRUCache.FetchOptions,\n context: FC,\n ): BackgroundFetch {\n const v = index === undefined ? undefined : this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n return v\n }\n\n const ac = new AbortController()\n const { signal } = options\n // when/if our AC signals, then stop listening to theirs.\n signal?.addEventListener('abort', () => ac.abort(signal.reason), {\n signal: ac.signal,\n })\n\n const fetchOpts = {\n signal: ac.signal,\n options,\n context,\n }\n\n const cb = (v: V | undefined, updateCache = false): V | undefined => {\n const { aborted } = ac.signal\n const ignoreAbort = options.ignoreFetchAbort && v !== undefined\n const proceed =\n options.ignoreFetchAbort ||\n !!(options.allowStaleOnFetchAbort && v !== undefined)\n if (options.status) {\n if (aborted && !updateCache) {\n options.status.fetchAborted = true\n options.status.fetchError = ac.signal.reason\n if (ignoreAbort) options.status.fetchAbortIgnored = true\n } else {\n options.status.fetchResolved = true\n }\n }\n if (aborted && !ignoreAbort && !updateCache) {\n return fetchFail(ac.signal.reason, proceed)\n }\n // either we didn't abort, and are still here, or we did, and ignored\n const bf = p as BackgroundFetch\n // if nothing else has been written there but we're set to update the\n // cache and ignore the abort, or if it's still pending on this specific\n // background request, then write it to the cache.\n const vl = this.#valList[index as Index]\n if (vl === p || (vl === undefined && ignoreAbort && updateCache)) {\n if (v === undefined) {\n if (bf.__staleWhileFetching !== undefined) {\n this.#valList[index as Index] = bf.__staleWhileFetching\n } else {\n this.#delete(k, 'fetch')\n }\n } else {\n if (options.status) options.status.fetchUpdated = true\n this.#set(k, v, fetchOpts.options, bf)\n }\n }\n return v\n }\n\n const eb = (er: unknown) => {\n if (options.status) {\n options.status.fetchRejected = true\n options.status.fetchError = er as Error\n }\n // do not pass go, do not collect $200\n return fetchFail(er, false)\n }\n\n const fetchFail = (er: unknown, proceed: boolean): V | undefined => {\n const { aborted } = ac.signal\n const allowStaleAborted = aborted && options.allowStaleOnFetchAbort\n const allowStale =\n allowStaleAborted || options.allowStaleOnFetchRejection\n const noDelete = allowStale || options.noDeleteOnFetchRejection\n const bf = p as BackgroundFetch\n if (this.#valList[index as Index] === p) {\n // if we allow stale on fetch rejections, then we need to ensure that\n // the stale value is not removed from the cache when the fetch fails.\n const del =\n !noDelete || (!proceed && bf.__staleWhileFetching === undefined)\n if (del) {\n this.#delete(k, 'fetch')\n } else if (!allowStaleAborted) {\n // still replace the *promise* with the stale value,\n // since we are done with the promise at this point.\n // leave it untouched if we're still waiting for an\n // aborted background fetch that hasn't yet returned.\n this.#valList[index as Index] = bf.__staleWhileFetching\n }\n }\n if (allowStale) {\n if (options.status && bf.__staleWhileFetching !== undefined) {\n options.status.returnedStale = true\n }\n return bf.__staleWhileFetching\n } else if (bf.__returned === bf) {\n throw er\n }\n }\n\n const pcall = (\n res: (v: V | undefined) => void,\n rej: (e: unknown) => void,\n ) => {\n const fmp = this.#fetchMethod?.(k, v, fetchOpts)\n // ignored, we go until we finish, regardless.\n // defer check until we are actually aborting,\n // so fetchMethod can override.\n ac.signal.addEventListener('abort', () => {\n if (!options.ignoreFetchAbort || options.allowStaleOnFetchAbort) {\n res(undefined)\n // when it eventually resolves, update the cache.\n if (options.allowStaleOnFetchAbort) {\n res = v => cb(v, true)\n }\n }\n })\n if (fmp && fmp instanceof Promise) {\n fmp.then(v => res(v === undefined ? undefined : v), rej)\n } else if (fmp !== undefined) {\n res(fmp)\n }\n }\n\n if (options.status) options.status.fetchDispatched = true\n const p = new Promise(pcall).then(cb, eb)\n const bf: BackgroundFetch = Object.assign(p, {\n __abortController: ac,\n __staleWhileFetching: v,\n __returned: undefined,\n })\n\n if (index === undefined) {\n // internal, don't expose status.\n this.#set(k, bf, { ...fetchOpts.options, status: undefined })\n index = this.#keyMap.get(k)\n } else {\n // do not call #set, because we do not want to adjust its place\n // in the lru queue, as it has not yet been \"used\". Also, we don't\n // need to worry about evicting for size, because a background fetch\n // over a stale value is treated as the same size as its stale value.\n this.#valList[index] = bf\n }\n return bf\n }\n\n #isBackgroundFetch(p: unknown): p is BackgroundFetch {\n if (!this.#hasFetchMethod) return false\n const b = p as BackgroundFetch\n return (\n !!b &&\n b instanceof Promise &&\n b.hasOwnProperty('__staleWhileFetching') &&\n b.__abortController instanceof AbortController\n )\n }\n\n /**\n * Make an asynchronous cached fetch using the\n * {@link LRUCache.OptionsBase.fetchMethod} function.\n *\n * If the value is in the cache and not stale, then the returned\n * Promise resolves to the value.\n *\n * If not in the cache, or beyond its TTL staleness, then\n * `fetchMethod(key, staleValue, { options, signal, context })` is\n * called, and the value returned will be added to the cache once\n * resolved.\n *\n * If called with `allowStale`, and an asynchronous fetch is\n * currently in progress to reload a stale value, then the former\n * stale value will be returned.\n *\n * If called with `forceRefresh`, then the cached item will be\n * re-fetched, even if it is not stale. However, if `allowStale` is also\n * set, then the old value will still be returned. This is useful\n * in cases where you want to force a reload of a cached value. If\n * a background fetch is already in progress, then `forceRefresh`\n * has no effect.\n *\n * If multiple fetches for the same key are issued, then they will all be\n * coalesced into a single call to fetchMethod.\n *\n * Note that this means that handling options such as\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort},\n * {@link LRUCache.FetchOptions.signal},\n * and {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} will be\n * determined by the FIRST fetch() call for a given key.\n *\n * This is a known (fixable) shortcoming which will be addresed on when\n * someone complains about it, as the fix would involve added complexity and\n * may not be worth the costs for this edge case.\n *\n * If {@link LRUCache.OptionsBase.fetchMethod} is not specified, then this is\n * effectively an alias for `Promise.resolve(cache.get(key))`.\n *\n * When the fetch method resolves to a value, if the fetch has not\n * been aborted due to deletion, eviction, or being overwritten,\n * then it is added to the cache using the options provided.\n *\n * If the key is evicted or deleted before the `fetchMethod`\n * resolves, then the AbortSignal passed to the `fetchMethod` will\n * receive an `abort` event, and the promise returned by `fetch()`\n * will reject with the reason for the abort.\n *\n * If a `signal` is passed to the `fetch()` call, then aborting the\n * signal will abort the fetch and cause the `fetch()` promise to\n * reject with the reason provided.\n *\n * **Setting `context`**\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the {@link LRUCache} constructor, then all\n * calls to `cache.fetch()` _must_ provide a `context` option. If\n * set to `undefined` or `void`, then calls to fetch _must not_\n * provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that\n * might be relevant in the course of fetching the data. It is only\n * relevant for the course of a single `fetch()` operation, and\n * discarded afterwards.\n *\n * **Note: `fetch()` calls are inflight-unique**\n *\n * If you call `fetch()` multiple times with the same key value,\n * then every call after the first will resolve on the same\n * promise1,\n * _even if they have different settings that would otherwise change\n * the behavior of the fetch_, such as `noDeleteOnFetchRejection`\n * or `ignoreFetchAbort`.\n *\n * In most cases, this is not a problem (in fact, only fetching\n * something once is what you probably want, if you're caching in\n * the first place). If you are changing the fetch() options\n * dramatically between runs, there's a good chance that you might\n * be trying to fit divergent semantics into a single object, and\n * would be better off with multiple cache instances.\n *\n * **1**: Ie, they're not the \"same Promise\", but they resolve at\n * the same time, because they're both waiting on the same\n * underlying fetchMethod response.\n */\n\n fetch(\n k: K,\n fetchOptions: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext,\n ): Promise\n\n // this overload not allowed if context is required\n fetch(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n fetchOptions?: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : never,\n ): Promise\n fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const ths = tracing.hasSubscribers\n const { status = hasSubscribers() ? {} : undefined } = fetchOptions\n fetchOptions.status = status\n if (status && fetchOptions.context) {\n status.context = fetchOptions.context\n }\n const p = this.#fetch(k, fetchOptions)\n if (status && ths) {\n status.trace = true\n tracing.tracePromise(() => p, status).catch(() => {})\n }\n return p\n }\n\n async #fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const {\n // get options\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n // set options\n ttl = this.ttl,\n noDisposeOnSet = this.noDisposeOnSet,\n size = 0,\n sizeCalculation = this.sizeCalculation,\n noUpdateTTL = this.noUpdateTTL,\n // fetch exclusive options\n noDeleteOnFetchRejection = this.noDeleteOnFetchRejection,\n allowStaleOnFetchRejection = this.allowStaleOnFetchRejection,\n ignoreFetchAbort = this.ignoreFetchAbort,\n allowStaleOnFetchAbort = this.allowStaleOnFetchAbort,\n context,\n forceRefresh = false,\n status,\n signal,\n } = fetchOptions\n if (status) {\n status.op = 'fetch'\n status.key = k\n if (forceRefresh) status.forceRefresh = true\n status.cache = this\n }\n\n if (!this.#hasFetchMethod) {\n if (status) status.fetch = 'get'\n return this.#get(k, {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n status,\n })\n }\n\n const options = {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n ttl,\n noDisposeOnSet,\n size,\n sizeCalculation,\n noUpdateTTL,\n noDeleteOnFetchRejection,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n status,\n signal,\n }\n\n let index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.fetch = 'miss'\n const p = this.#backgroundFetch(k, index, options, context as FC)\n return (p.__returned = p)\n } else {\n // in cache, maybe already fetching\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n const stale = allowStale && v.__staleWhileFetching !== undefined\n if (status) {\n status.fetch = 'inflight'\n if (stale) status.returnedStale = true\n }\n return stale ? v.__staleWhileFetching : (v.__returned = v)\n }\n\n // if we force a refresh, that means do NOT serve the cached value,\n // unless we are already in the process of refreshing the cache.\n const isStale = this.#isStale(index)\n if (!forceRefresh && !isStale) {\n if (status) status.fetch = 'hit'\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n if (status) this.#statusTTL(status, index)\n return v\n }\n\n // ok, it is stale or a forced refresh, and not already fetching.\n // refresh the cache.\n const p = this.#backgroundFetch(k, index, options, context as FC)\n const hasStale = p.__staleWhileFetching !== undefined\n const staleVal = hasStale && allowStale\n if (status) {\n status.fetch = isStale ? 'stale' : 'refresh'\n if (staleVal && isStale) status.returnedStale = true\n }\n return staleVal ? p.__staleWhileFetching : (p.__returned = p)\n }\n }\n\n /**\n * In some cases, `cache.fetch()` may resolve to `undefined`, either because\n * a {@link LRUCache.OptionsBase#fetchMethod} was not provided (turning\n * `cache.fetch(k)` into just an async wrapper around `cache.get(k)`) or\n * because `ignoreFetchAbort` was specified (either to the constructor or\n * in the {@link LRUCache.FetchOptions}). Also, the\n * {@link LRUCache.OptionsBase.fetchMethod} may return `undefined` or `void`, making\n * the test even more complicated.\n *\n * Because inferring the cases where `undefined` might be returned are so\n * cumbersome, but testing for `undefined` can also be annoying, this method\n * can be used, which will reject if `this.fetch()` resolves to undefined.\n */\n forceFetch(\n k: K,\n fetchOptions: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext,\n ): Promise\n // this overload not allowed if context is required\n forceFetch(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n fetchOptions?: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : never,\n ): Promise\n forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const ths = tracing.hasSubscribers\n const { status = hasSubscribers() ? {} : undefined } = fetchOptions\n fetchOptions.status = status\n if (status && fetchOptions.context) {\n status.context = fetchOptions.context\n }\n const p = this.#forceFetch(k, fetchOptions)\n if (status && ths) {\n status.trace = true\n tracing.tracePromise(() => p, status).catch(() => {})\n }\n return p\n }\n\n async #forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ) {\n const v = await this.#fetch(k, fetchOptions)\n if (v === undefined) throw new Error('fetch() returned undefined')\n return v\n }\n\n /**\n * If the key is found in the cache, then this is equivalent to\n * {@link LRUCache#get}. If not, in the cache, then calculate the value using\n * the {@link LRUCache.OptionsBase.memoMethod}, and add it to the cache.\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the LRUCache constructor, then all calls to `cache.memo()`\n * _must_ provide a `context` option. If set to `undefined` or `void`, then\n * calls to memo _must not_ provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that might be\n * relevant in the course of fetching the data. It is only relevant for the\n * course of a single `memo()` operation, and discarded afterwards.\n */\n memo(\n k: K,\n memoOptions: unknown extends FC ? LRUCache.MemoOptions\n : FC extends undefined | void ? LRUCache.MemoOptionsNoContext\n : LRUCache.MemoOptionsWithContext,\n ): V\n // this overload not allowed if context is required\n memo(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n memoOptions?: unknown extends FC ? LRUCache.MemoOptions\n : FC extends undefined | void ? LRUCache.MemoOptionsNoContext\n : never,\n ): V\n memo(k: K, memoOptions: LRUCache.MemoOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } =\n memoOptions\n memoOptions.status = status\n if (status) {\n status.op = 'memo'\n status.key = k\n if (memoOptions.context) {\n status.context = memoOptions.context\n }\n status.cache = this\n }\n const result = this.#memo(k, memoOptions)\n if (status) status.value = result\n if (metrics.hasSubscribers) metrics.publish(status)\n return result\n }\n #memo(k: K, memoOptions: LRUCache.MemoOptions = {}) {\n const memoMethod = this.#memoMethod\n if (!memoMethod) {\n throw new Error('no memoMethod provided to constructor')\n }\n const { context, status, forceRefresh, ...options } = memoOptions\n if (status && forceRefresh) status.forceRefresh = true\n const v = this.#get(k, options)\n const refresh = forceRefresh || v === undefined\n if (status) {\n status.memo = refresh ? 'miss' : 'hit'\n if (!refresh) status.value = v\n }\n if (!refresh) return v\n const vv = memoMethod(k, v, {\n options,\n context,\n } as LRUCache.MemoizerOptions)\n if (status) status.value = vv\n this.#set(k, vv, options)\n return vv\n }\n\n /**\n * Return a value from the cache. Will update the recency of the cache\n * entry found.\n *\n * If the key is not found, get() will return `undefined`.\n */\n get(k: K, getOptions: LRUCache.GetOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } = getOptions\n getOptions.status = status\n if (status) {\n status.op = 'get'\n status.key = k\n status.cache = this\n }\n const result = this.#get(k, getOptions)\n if (status) {\n if (result !== undefined) status.value = result\n if (metrics.hasSubscribers) metrics.publish(status)\n }\n return result\n }\n\n #get(k: K, getOptions: LRUCache.GetOptions = {}) {\n const {\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n status,\n } = getOptions\n const index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.get = 'miss'\n return undefined\n }\n const value = this.#valList[index]\n const fetching = this.#isBackgroundFetch(value)\n if (status) this.#statusTTL(status, index)\n if (this.#isStale(index)) {\n // delete only if not an in-flight background fetch\n if (!fetching) {\n if (!noDeleteOnStaleGet) {\n this.#delete(k, 'expire')\n }\n if (status) status.get = 'stale'\n if (allowStale) {\n if (status) status.returnedStale = true\n return value\n }\n return undefined\n }\n if (status) status.get = 'stale-fetching'\n if (allowStale && value.__staleWhileFetching !== undefined) {\n if (status) status.returnedStale = true\n return value.__staleWhileFetching\n }\n return undefined\n }\n // not stale\n if (status) status.get = fetching ? 'fetching' : 'hit'\n // if we're currently fetching it, we don't actually have it yet\n // it's not stale, which means this isn't a staleWhileRefetching.\n // If it's not stale, and fetching, AND has a __staleWhileFetching\n // value, then that means the user fetched with {forceRefresh:true},\n // so it's safe to return that value.\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n return fetching ? value.__staleWhileFetching : value\n }\n\n #connect(p: Index, n: Index) {\n this.#prev[n] = p\n this.#next[p] = n\n }\n\n #moveToTail(index: Index): void {\n // if tail already, nothing to do\n // if head, move head to next[index]\n // else\n // move next[prev[index]] to next[index] (head has no prev)\n // move prev[next[index]] to prev[index]\n // prev[index] = tail\n // next[tail] = index\n // tail = index\n if (index !== this.#tail) {\n if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n this.#connect(\n this.#prev[index] as Index,\n this.#next[index] as Index,\n )\n }\n this.#connect(this.#tail, index)\n this.#tail = index\n }\n }\n\n /**\n * Deletes a key out of the cache.\n *\n * Returns true if the key was deleted, false otherwise.\n */\n delete(k: K) {\n return this.#delete(k, 'delete')\n }\n\n #delete(k: K, reason: LRUCache.DisposeReason) {\n if (metrics.hasSubscribers) {\n metrics.publish({\n op: 'delete',\n delete: reason,\n key: k,\n cache: this,\n })\n }\n let deleted = false\n if (this.#size !== 0) {\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n if (this.#autopurgeTimers?.[index]) {\n clearTimeout(this.#autopurgeTimers?.[index])\n this.#autopurgeTimers[index] = undefined\n }\n deleted = true\n if (this.#size === 1) {\n this.#clear(reason)\n } else {\n this.#removeItemSize(index)\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k, reason])\n }\n }\n this.#keyMap.delete(k)\n this.#keyList[index] = undefined\n this.#valList[index] = undefined\n if (index === this.#tail) {\n this.#tail = this.#prev[index] as Index\n } else if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n const pi = this.#prev[index] as number\n this.#next[pi] = this.#next[index] as number\n const ni = this.#next[index] as number\n this.#prev[ni] = this.#prev[index] as number\n }\n this.#size--\n this.#free.push(index)\n }\n }\n }\n if (this.#hasDisposeAfter && this.#disposed?.length) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return deleted\n }\n\n /**\n * Clear the cache entirely, throwing away all values.\n */\n clear() {\n return this.#clear('delete')\n }\n #clear(reason: LRUCache.DisposeReason) {\n for (const index of this.#rindexes({ allowStale: true })) {\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else {\n const k = this.#keyList[index]\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k as K, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k as K, reason])\n }\n }\n }\n\n this.#keyMap.clear()\n void this.#valList.fill(undefined)\n this.#keyList.fill(undefined)\n if (this.#ttls && this.#starts) {\n this.#ttls.fill(0)\n this.#starts.fill(0)\n for (const t of this.#autopurgeTimers ?? []) {\n if (t !== undefined) clearTimeout(t)\n }\n this.#autopurgeTimers?.fill(undefined)\n }\n if (this.#sizes) {\n this.#sizes.fill(0)\n }\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free.length = 0\n this.#calculatedSize = 0\n this.#size = 0\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n}\n"], + "mappings": "AAoBA,IAAMA,EAAQ,CAAE,eAAgB,EAAK,EAC1BC,EAAUD,EACVE,EAAUF,EACrB,OAAO,0BAA0B,EAC9B,KAAKG,GAAK,CACTF,EAAUE,EAAG,QAAQ,mBAAmB,EACxCD,EAAUC,EAAG,eAAe,WAAW,CACzC,CAAC,EACA,MAAM,IAAK,CAAE,CAAC,ECpBV,IAAMC,EAET,OAAO,aAAgB,UACvB,aACA,OAAO,YAAY,KAAQ,WAG3B,YACqB,KCPzB,IAAMC,EAAiB,IACrBC,EAAQ,gBAAkBC,EAAQ,eAE9BC,EAAS,IAAI,IAObC,EACJ,OAAO,SAAY,UAAc,QAC/B,QACA,CAAA,EAGEC,EAAc,CAClBC,EACAC,EACAC,EACAC,IACE,CACE,OAAOL,EAAQ,aAAgB,WACjCA,EAAQ,YAAYE,EAAKC,EAAMC,EAAMC,CAAE,EAGvC,QAAQ,MAAM,IAAID,CAAI,KAAKD,CAAI,KAAKD,CAAG,EAAE,CAE7C,EACMI,EAAcF,GAAiB,CAACL,EAAO,IAAIK,CAAI,EAMrD,IAAMG,EAAYC,GAChB,CAAC,CAACA,GAAKA,IAAM,KAAK,MAAMA,CAAW,GAAKA,EAAI,GAAK,SAASA,CAAC,EAcvDC,EAAgBC,GACnBH,EAASG,CAAG,EACXA,GAAO,KAAK,IAAI,EAAG,CAAC,EAAI,WACxBA,GAAO,KAAK,IAAI,EAAG,EAAE,EAAI,YACzBA,GAAO,KAAK,IAAI,EAAG,EAAE,EAAI,YACzBA,GAAO,OAAO,iBAAmBC,EACjC,KALe,KAQbA,EAAN,cAAwB,KAAa,CACnC,YAAYC,EAAY,CACtB,MAAMA,CAAI,EACV,KAAK,KAAK,CAAC,CACb,GAMIC,EAAN,MAAMC,CAAK,CAET,KAEA,OAEA,MAAOC,GAAyB,GAChC,OAAO,OAAOL,EAAW,CACvB,IAAMM,EAAUP,EAAaC,CAAG,EAChC,GAAI,CAACM,EAAS,MAAO,CAAA,EACrBF,EAAMC,GAAgB,GACtB,IAAME,EAAI,IAAIH,EAAMJ,EAAKM,CAAO,EAChC,OAAAF,EAAMC,GAAgB,GACfE,CACT,CACA,YAAYP,EAAaM,EAAyC,CAEhE,GAAI,CAACF,EAAMC,GACT,MAAM,IAAI,UAAU,yCAAyC,EAG/D,KAAK,KAAO,IAAIC,EAAQN,CAAG,EAC3B,KAAK,OAAS,CAChB,CACA,KAAKF,EAAQ,CACX,KAAK,KAAK,KAAK,QAAQ,EAAIA,CAC7B,CACA,KAAG,CACD,OAAO,KAAK,KAAK,EAAE,KAAK,MAAM,CAChC,GA+kCWU,EAAP,MAAOC,CAAQ,CAEVC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GAKT,IAAI,MAAI,CACN,OAAO,KAAKA,EACd,CAKA,IAKA,cAIA,aAIA,eAIA,eAIA,WAKA,eAIA,YAIA,aAIA,gBAIA,yBAIA,mBAIA,uBAIA,2BAIA,iBAGA,oBAGAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GAEAC,GACAC,GACAC,GACAC,GAWA,OAAO,sBAILC,EAAqB,CACrB,MAAO,CAEL,OAAQA,EAAEP,GACV,KAAMO,EAAEN,GACR,gBAAiBM,EAAEL,GACnB,MAAOK,EAAER,GACT,OAAQQ,EAAEjB,GACV,QAASiB,EAAEhB,GACX,QAASgB,EAAEf,GACX,KAAMe,EAAEd,GACR,KAAMc,EAAEb,GACR,IAAI,MAAI,CACN,OAAOa,EAAEZ,EACX,EACA,IAAI,MAAI,CACN,OAAOY,EAAEX,EACX,EACA,KAAMW,EAAEV,GAER,kBAAoBW,GAAeD,EAAEE,GAAmBD,CAAC,EACzD,gBAAiB,CACfE,EACAC,EACAC,EACAC,IAEAN,EAAEO,GACAJ,EACAC,EACAC,EACAC,CAAa,EAEjB,WAAaF,GAAwBJ,EAAEQ,GAAYJ,CAAc,EACjE,QAAUC,GAAsCL,EAAES,GAASJ,CAAO,EAClE,SAAWA,GACTL,EAAEU,GAAUL,CAAO,EACrB,QAAUD,GAA8BJ,EAAEW,GAASP,CAAc,EAErE,CAOA,IAAI,KAAG,CACL,OAAO,KAAK/B,EACd,CAIA,IAAI,SAAO,CACT,OAAO,KAAKC,EACd,CAIA,IAAI,gBAAc,CAChB,OAAO,KAAKQ,EACd,CAIA,IAAI,MAAI,CACN,OAAO,KAAKD,EACd,CAIA,IAAI,aAAW,CACb,OAAO,KAAKH,EACd,CACA,IAAI,YAAU,CACZ,OAAO,KAAKC,EACd,CAIA,IAAI,SAAO,CACT,OAAO,KAAKJ,EACd,CAIA,IAAI,UAAQ,CACV,OAAO,KAAKC,EACd,CAIA,IAAI,cAAY,CACd,OAAO,KAAKC,EACd,CAEA,YAAY4B,EAAwD,CAClE,GAAM,CACJ,IAAA1C,EAAM,EACN,IAAAiD,EACA,cAAAC,EAAgB,EAChB,aAAAC,EACA,eAAAC,EACA,eAAAC,EACA,WAAAC,EACA,QAAAC,EACA,SAAAC,EACA,aAAAC,EACA,eAAAC,EACA,YAAAC,EACA,QAAAC,EAAU,EACV,aAAAC,EAAe,EACf,gBAAAC,EACA,YAAAC,EACA,WAAAC,EACA,yBAAAC,EACA,mBAAAC,EACA,2BAAAC,EACA,uBAAAC,EACA,iBAAAC,EACA,oBAAAC,EAAsB,EACtB,KAAAC,CAAI,EACF7B,EAIJ,GAFA,KAAK,oBAAsB4B,EAEvBC,IAAS,QACP,OAAOA,GAAM,KAAQ,WACvB,MAAM,IAAI,UACR,mDAAmD,EAOzD,GAFA,KAAKtD,GAAQsD,GAAQC,EAEjBxE,IAAQ,GAAK,CAACH,EAASG,CAAG,EAC5B,MAAM,IAAI,UAAU,0CAA0C,EAGhE,IAAMyE,EAAYzE,EAAMD,EAAaC,CAAG,EAAI,MAC5C,GAAI,CAACyE,EACH,MAAM,IAAI,MAAM,sBAAwBzE,CAAG,EAO7C,GAJA,KAAKU,GAAOV,EACZ,KAAKW,GAAWiD,EAChB,KAAK,aAAeC,GAAgB,KAAKlD,GACzC,KAAK,gBAAkBmD,EACnB,KAAK,gBAAiB,CACxB,GAAI,CAAC,KAAKnD,IAAY,CAAC,KAAK,aAC1B,MAAM,IAAI,UACR,oEAAoE,EAGxE,GAAI,OAAO,KAAK,iBAAoB,WAClC,MAAM,IAAI,UAAU,qCAAqC,CAE7D,CAEA,GAAIqD,IAAe,QAAa,OAAOA,GAAe,WACpD,MAAM,IAAI,UAAU,0CAA0C,EAIhE,GAFA,KAAKhD,GAAcgD,EAEfD,IAAgB,QAAa,OAAOA,GAAgB,WACtD,MAAM,IAAI,UAAU,6CAA6C,EA+CnE,GA7CA,KAAKhD,GAAegD,EACpB,KAAK7B,GAAkB,CAAC,CAAC6B,EAEzB,KAAK3C,GAAU,IAAI,IACnB,KAAKC,GAAW,MAAM,KAAK,CAAE,OAAQrB,CAAG,CAAE,EAAE,KAAK,MAAS,EAI1D,KAAKsB,GAAW,MAAM,KAAK,CAAE,OAAQtB,CAAG,CAAE,EAAE,KAAK,MAAS,EAI1D,KAAKuB,GAAQ,IAAIkD,EAAUzE,CAAG,EAC9B,KAAKwB,GAAQ,IAAIiD,EAAUzE,CAAG,EAC9B,KAAKyB,GAAQ,EACb,KAAKC,GAAQ,EACb,KAAKC,GAAQxB,EAAM,OAAOH,CAAG,EAC7B,KAAKkB,GAAQ,EACb,KAAKC,GAAkB,EAEnB,OAAOoC,GAAY,aACrB,KAAK3C,GAAW2C,GAEd,OAAOC,GAAa,aACtB,KAAK3C,GAAY2C,GAEf,OAAOC,GAAiB,YAC1B,KAAK3C,GAAgB2C,EACrB,KAAK7B,GAAY,CAAA,IAEjB,KAAKd,GAAgB,OACrB,KAAKc,GAAY,QAEnB,KAAKK,GAAc,CAAC,CAAC,KAAKrB,GAC1B,KAAKwB,GAAe,CAAC,CAAC,KAAKvB,GAC3B,KAAKsB,GAAmB,CAAC,CAAC,KAAKrB,GAE/B,KAAK,eAAiB,CAAC,CAAC4C,EACxB,KAAK,YAAc,CAAC,CAACC,EACrB,KAAK,yBAA2B,CAAC,CAACM,EAClC,KAAK,2BAA6B,CAAC,CAACE,EACpC,KAAK,uBAAyB,CAAC,CAACC,EAChC,KAAK,iBAAmB,CAAC,CAACC,EAGtB,KAAK,eAAiB,EAAG,CAC3B,GAAI,KAAK1D,KAAa,GAChB,CAACd,EAAS,KAAKc,EAAQ,EACzB,MAAM,IAAI,UACR,iDAAiD,EAIvD,GAAI,CAACd,EAAS,KAAK,YAAY,EAC7B,MAAM,IAAI,UACR,sDAAsD,EAG1D,KAAK6E,GAAuB,CAC9B,CAUA,GARA,KAAK,WAAa,CAAC,CAACpB,EACpB,KAAK,mBAAqB,CAAC,CAACY,EAC5B,KAAK,eAAiB,CAAC,CAACd,EACxB,KAAK,eAAiB,CAAC,CAACC,EACxB,KAAK,cACHxD,EAASqD,CAAa,GAAKA,IAAkB,EAAIA,EAAgB,EACnE,KAAK,aAAe,CAAC,CAACC,EACtB,KAAK,IAAMF,GAAO,EACd,KAAK,IAAK,CACZ,GAAI,CAACpD,EAAS,KAAK,GAAG,EACpB,MAAM,IAAI,UAAU,6CAA6C,EAEnE,KAAK8E,GAAsB,CAC7B,CAGA,GAAI,KAAKjE,KAAS,GAAK,KAAK,MAAQ,GAAK,KAAKC,KAAa,EACzD,MAAM,IAAI,UACR,kDAAkD,EAGtD,GAAI,CAAC,KAAK,cAAgB,CAAC,KAAKD,IAAQ,CAAC,KAAKC,GAAU,CACtD,IAAMiE,EAAO,sBACTC,EAAWD,CAAI,IACjBE,EAAO,IAAIF,CAAI,EAIfG,EAFE,gGAEe,wBAAyBH,EAAMnE,CAAQ,EAE5D,CACF,CAMA,gBAAgBuE,EAAM,CACpB,OAAO,KAAK5D,GAAQ,IAAI4D,CAAG,EAAI,IAAW,CAC5C,CAEAL,IAAsB,CACpB,IAAMM,EAAO,IAAIhF,EAAU,KAAKS,EAAI,EAC9BwE,EAAS,IAAIjF,EAAU,KAAKS,EAAI,EACtC,KAAKqB,GAAQkD,EACb,KAAKnD,GAAUoD,EACf,IAAMC,EACJ,KAAK,aACH,MAAM,KAAgD,CACpD,OAAQ,KAAKzE,GACd,EACD,OACJ,KAAKsB,GAAmBmD,EAExB,KAAKC,GAAc,CAAC3C,EAAOQ,EAAKoC,EAAQ,KAAKpE,GAAM,IAAG,IAAM,CAC1DiE,EAAOzC,CAAK,EAAIQ,IAAQ,EAAIoC,EAAQ,EACpCJ,EAAKxC,CAAK,EAAIQ,EACdqC,EAAe7C,EAAOQ,CAAG,CAC3B,EAEA,KAAKsC,GAAiB9C,GAAQ,CAC5ByC,EAAOzC,CAAK,EAAIwC,EAAKxC,CAAK,IAAM,EAAI,KAAKxB,GAAM,IAAG,EAAK,EACvDqE,EAAe7C,EAAOwC,EAAKxC,CAAK,CAAC,CACnC,EAMA,IAAM6C,EACH,KAAK,aAEJ,CAAC7C,EAAcQ,IAAgB,CAK7B,GAJIkC,IAAc1C,CAAK,IACrB,aAAa0C,EAAY1C,CAAK,CAAC,EAC/B0C,EAAY1C,CAAK,EAAI,QAEnBQ,GAAOA,IAAQ,GAAKkC,EAAa,CACnC,IAAMK,EAAI,WAAW,IAAK,CACpB,KAAKxC,GAASP,CAAK,GACrB,KAAKgD,GAAQ,KAAKpE,GAASoB,CAAK,EAAQ,QAAQ,CAEpD,EAAGQ,EAAM,CAAC,EAGNuC,EAAE,OACJA,EAAE,MAAK,EAGTL,EAAY1C,CAAK,EAAI+C,CACvB,CACF,EApBA,IAAK,CAAE,EAsBX,KAAKE,GAAa,CAACC,EAAQlD,IAAS,CAClC,GAAIwC,EAAKxC,CAAK,EAAG,CACf,IAAMQ,EAAMgC,EAAKxC,CAAK,EAChB4C,EAAQH,EAAOzC,CAAK,EAE1B,GAAI,CAACQ,GAAO,CAACoC,EACX,OAGFM,EAAO,IAAM1C,EACb0C,EAAO,MAAQN,EACfM,EAAO,IAAMC,GAAaC,EAAM,EAChC,IAAMC,EAAMH,EAAO,IAAMN,EACzBM,EAAO,aAAe1C,EAAM6C,CAC9B,CACF,EAIA,IAAIF,EAAY,EACVC,EAAS,IAAK,CAClB,IAAM/F,EAAI,KAAKmB,GAAM,IAAG,EACxB,GAAI,KAAK,cAAgB,EAAG,CAC1B2E,EAAY9F,EACZ,IAAM0F,EAAI,WAAW,IAAOI,EAAY,EAAI,KAAK,aAAa,EAG1DJ,EAAE,OACJA,EAAE,MAAK,CAGX,CACA,OAAO1F,CACT,EAEA,KAAK,gBAAkBkF,GAAM,CAC3B,IAAMvC,EAAQ,KAAKrB,GAAQ,IAAI4D,CAAG,EAClC,GAAIvC,IAAU,OACZ,MAAO,GAET,IAAMQ,EAAMgC,EAAKxC,CAAK,EAChB4C,EAAQH,EAAOzC,CAAK,EAC1B,GAAI,CAACQ,GAAO,CAACoC,EACX,MAAO,KAET,IAAMS,GAAOF,GAAaC,EAAM,GAAMR,EACtC,OAAOpC,EAAM6C,CACf,EAEA,KAAK9C,GAAWP,GAAQ,CACtB,IAAMlC,EAAI2E,EAAOzC,CAAK,EAChB+C,EAAIP,EAAKxC,CAAK,EACpB,MAAO,CAAC,CAAC+C,GAAK,CAAC,CAACjF,IAAMqF,GAAaC,EAAM,GAAMtF,EAAIiF,CACrD,CACF,CAGAD,GAAyC,IAAK,CAAE,EAChDG,GACE,IAAK,CAAE,EACTN,GAMY,IAAK,CAAE,EAGnBpC,GAAsC,IAAM,GAE5C0B,IAAuB,CACrB,IAAMqB,EAAQ,IAAI9F,EAAU,KAAKS,EAAI,EACrC,KAAKS,GAAkB,EACvB,KAAKU,GAASkE,EACd,KAAKC,GAAkBvD,GAAQ,CAC7B,KAAKtB,IAAmB4E,EAAMtD,CAAK,EACnCsD,EAAMtD,CAAK,EAAI,CACjB,EACA,KAAKwD,GAAe,CAACzD,EAAG0D,EAAGhG,EAAM4D,IAAmB,CAClD,GAAI,CAACjE,EAASK,CAAI,EAAG,CAGnB,GAAI,KAAKqC,GAAmB2D,CAAC,EAI3B,OAAO,KAAK,oBAEd,GAAIpC,EAAiB,CACnB,GAAI,OAAOA,GAAoB,WAC7B,MAAM,IAAI,UAAU,oCAAoC,EAG1D,GADA5D,EAAO4D,EAAgBoC,EAAG1D,CAAC,EACvB,CAAC3C,EAASK,CAAI,EAChB,MAAM,IAAI,UACR,0DAA0D,CAGhE,KACE,OAAM,IAAI,UACR,2HAEwB,CAG9B,CACA,OAAOA,CACT,EAEA,KAAKiG,GAAe,CAClB1D,EACAvC,EACAyF,IACE,CAEF,GADAI,EAAMtD,CAAK,EAAIvC,EACX,KAAKS,GAAU,CACjB,IAAMiD,EAAU,KAAKjD,GAAWoF,EAAMtD,CAAK,EAC3C,KAAO,KAAKtB,GAAkByC,GAC5B,KAAKwC,GAAO,EAAI,CAEpB,CACA,KAAKjF,IAAmB4E,EAAMtD,CAAK,EAC/BkD,IACFA,EAAO,UAAYzF,EACnByF,EAAO,oBAAsB,KAAKxE,GAEtC,CACF,CAEA6E,GAA0CK,GAAK,CAAE,EAEjDF,GAIY,CAACE,EAAIC,EAAIC,IAAO,CAAE,EAE9BN,GAMqB,CACnBO,EACAC,EACAvG,EACA4D,IACE,CACF,GAAI5D,GAAQ4D,EACV,MAAM,IAAI,UACR,kEAAkE,EAGtE,MAAO,EACT,EAEA,CAAChB,GAAS,CAAE,WAAAQ,EAAa,KAAK,UAAU,EAAK,CAAA,EAAE,CAC7C,GAAI,KAAKpC,GACP,QAASwF,EAAI,KAAKhF,GAAO,KAAKiF,GAAcD,CAAC,KACvCpD,GAAc,CAAC,KAAKN,GAAS0D,CAAC,KAChC,MAAMA,GAEJA,IAAM,KAAKjF,KAGbiF,EAAI,KAAKlF,GAAMkF,CAAC,CAIxB,CAEA,CAAC3D,GAAU,CAAE,WAAAO,EAAa,KAAK,UAAU,EAAK,CAAA,EAAE,CAC9C,GAAI,KAAKpC,GACP,QAASwF,EAAI,KAAKjF,GAAO,KAAKkF,GAAcD,CAAC,KACvCpD,GAAc,CAAC,KAAKN,GAAS0D,CAAC,KAChC,MAAMA,GAEJA,IAAM,KAAKhF,KAGbgF,EAAI,KAAKnF,GAAMmF,CAAC,CAIxB,CAEAC,GAAclE,EAAY,CACxB,OACEA,IAAU,QACV,KAAKrB,GAAQ,IAAI,KAAKC,GAASoB,CAAK,CAAM,IAAMA,CAEpD,CAMA,CAAC,SAAO,CACN,QAAWiE,KAAK,KAAK5D,GAAQ,EAEzB,KAAKxB,GAASoF,CAAC,IAAM,QACrB,KAAKrF,GAASqF,CAAC,IAAM,QACrB,CAAC,KAAKnE,GAAmB,KAAKjB,GAASoF,CAAC,CAAC,IAEzC,KAAM,CAAC,KAAKrF,GAASqF,CAAC,EAAG,KAAKpF,GAASoF,CAAC,CAAC,EAG/C,CAQA,CAAC,UAAQ,CACP,QAAWA,KAAK,KAAK3D,GAAS,EAE1B,KAAKzB,GAASoF,CAAC,IAAM,QACrB,KAAKrF,GAASqF,CAAC,IAAM,QACrB,CAAC,KAAKnE,GAAmB,KAAKjB,GAASoF,CAAC,CAAC,IAEzC,KAAM,CAAC,KAAKrF,GAASqF,CAAC,EAAG,KAAKpF,GAASoF,CAAC,CAAC,EAG/C,CAMA,CAAC,MAAI,CACH,QAAWA,KAAK,KAAK5D,GAAQ,EAAI,CAC/B,IAAMN,EAAI,KAAKnB,GAASqF,CAAC,EACrBlE,IAAM,QAAa,CAAC,KAAKD,GAAmB,KAAKjB,GAASoF,CAAC,CAAC,IAC9D,MAAMlE,EAEV,CACF,CAQA,CAAC,OAAK,CACJ,QAAWkE,KAAK,KAAK3D,GAAS,EAAI,CAChC,IAAMP,EAAI,KAAKnB,GAASqF,CAAC,EACrBlE,IAAM,QAAa,CAAC,KAAKD,GAAmB,KAAKjB,GAASoF,CAAC,CAAC,IAC9D,MAAMlE,EAEV,CACF,CAMA,CAAC,QAAM,CACL,QAAWkE,KAAK,KAAK5D,GAAQ,EACjB,KAAKxB,GAASoF,CAAC,IACf,QAAa,CAAC,KAAKnE,GAAmB,KAAKjB,GAASoF,CAAC,CAAC,IAC9D,MAAM,KAAKpF,GAASoF,CAAC,EAG3B,CAQA,CAAC,SAAO,CACN,QAAWA,KAAK,KAAK3D,GAAS,EAClB,KAAKzB,GAASoF,CAAC,IACf,QAAa,CAAC,KAAKnE,GAAmB,KAAKjB,GAASoF,CAAC,CAAC,IAC9D,MAAM,KAAKpF,GAASoF,CAAC,EAG3B,CAMA,CAAC,OAAO,QAAQ,GAAC,CACf,OAAO,KAAK,QAAO,CACrB,CAOA,CAAC,OAAO,WAAW,EAAI,WAMvB,KACEE,EACAC,EAA4C,CAAA,EAAE,CAE9C,QAAW,KAAK,KAAK/D,GAAQ,EAAI,CAC/B,IAAMoD,EAAI,KAAK5E,GAAS,CAAC,EACnBwF,EAAQ,KAAKvE,GAAmB2D,CAAC,EAAIA,EAAE,qBAAuBA,EACpE,GAAIY,IAAU,QACVF,EAAGE,EAAO,KAAKzF,GAAS,CAAC,EAAQ,IAAI,EACvC,OAAO,KAAK0F,GAAK,KAAK1F,GAAS,CAAC,EAAQwF,CAAU,CAEtD,CACF,CAaA,QACED,EACAI,EAAiB,KAAI,CAErB,QAAW,KAAK,KAAKlE,GAAQ,EAAI,CAC/B,IAAMoD,EAAI,KAAK5E,GAAS,CAAC,EACnBwF,EAAQ,KAAKvE,GAAmB2D,CAAC,EAAIA,EAAE,qBAAuBA,EAChEY,IAAU,QACdF,EAAG,KAAKI,EAAOF,EAAO,KAAKzF,GAAS,CAAC,EAAQ,IAAI,CACnD,CACF,CAMA,SACEuF,EACAI,EAAiB,KAAI,CAErB,QAAW,KAAK,KAAKjE,GAAS,EAAI,CAChC,IAAMmD,EAAI,KAAK5E,GAAS,CAAC,EACnBwF,EAAQ,KAAKvE,GAAmB2D,CAAC,EAAIA,EAAE,qBAAuBA,EAChEY,IAAU,QACdF,EAAG,KAAKI,EAAOF,EAAO,KAAKzF,GAAS,CAAC,EAAQ,IAAI,CACnD,CACF,CAMA,YAAU,CACR,IAAI4F,EAAU,GACd,QAAWP,KAAK,KAAK3D,GAAU,CAAE,WAAY,EAAI,CAAE,EAC7C,KAAKC,GAAS0D,CAAC,IACjB,KAAKjB,GAAQ,KAAKpE,GAASqF,CAAC,EAAQ,QAAQ,EAC5CO,EAAU,IAGd,OAAOA,CACT,CAcA,KAAKjC,EAAM,CACT,IAAM0B,EAAI,KAAKtF,GAAQ,IAAI4D,CAAG,EAC9B,GAAI0B,IAAM,OAAW,OACrB,IAAMR,EAAI,KAAK5E,GAASoF,CAAC,EAGnBI,EACJ,KAAKvE,GAAmB2D,CAAC,EAAIA,EAAE,qBAAuBA,EACxD,GAAIY,IAAU,OAAW,OAEzB,IAAMI,EAA2B,CAAE,MAAAJ,CAAK,EACxC,GAAI,KAAK/E,IAAS,KAAKD,GAAS,CAC9B,IAAMmB,EAAM,KAAKlB,GAAM2E,CAAC,EAClBrB,EAAQ,KAAKvD,GAAQ4E,CAAC,EAC5B,GAAIzD,GAAOoC,EAAO,CAChB,IAAM8B,EAASlE,GAAO,KAAKhC,GAAM,IAAG,EAAKoE,GACzC6B,EAAM,IAAMC,EACZD,EAAM,MAAQ,KAAK,IAAG,CACxB,CACF,CACA,OAAI,KAAKrF,KACPqF,EAAM,KAAO,KAAKrF,GAAO6E,CAAC,GAErBQ,CACT,CAeA,MAAI,CACF,IAAME,EAAgC,CAAA,EACtC,QAAWV,KAAK,KAAK5D,GAAS,CAAE,WAAY,EAAI,CAAE,EAAG,CACnD,IAAMkC,EAAM,KAAK3D,GAASqF,CAAC,EACrBR,EAAI,KAAK5E,GAASoF,CAAC,EACnBI,EACJ,KAAKvE,GAAmB2D,CAAC,EAAIA,EAAE,qBAAuBA,EACxD,GAAIY,IAAU,QAAa9B,IAAQ,OAAW,SAC9C,IAAMkC,EAA2B,CAAE,MAAAJ,CAAK,EACxC,GAAI,KAAK/E,IAAS,KAAKD,GAAS,CAC9BoF,EAAM,IAAM,KAAKnF,GAAM2E,CAAC,EAGxB,IAAMZ,EAAM,KAAK7E,GAAM,IAAG,EAAM,KAAKa,GAAQ4E,CAAC,EAC9CQ,EAAM,MAAQ,KAAK,MAAM,KAAK,IAAG,EAAKpB,CAAG,CAC3C,CACI,KAAKjE,KACPqF,EAAM,KAAO,KAAKrF,GAAO6E,CAAC,GAE5BU,EAAI,QAAQ,CAACpC,EAAKkC,CAAK,CAAC,CAC1B,CACA,OAAOE,CACT,CAWA,KAAKA,EAA6B,CAChC,KAAK,MAAK,EACV,OAAW,CAACpC,EAAKkC,CAAK,IAAKE,EAAK,CAC9B,GAAIF,EAAM,MAAO,CAOf,IAAMpB,EAAM,KAAK,IAAG,EAAKoB,EAAM,MAC/BA,EAAM,MAAQ,KAAKjG,GAAM,IAAG,EAAK6E,CACnC,CACA,KAAKuB,GAAKrC,EAAKkC,EAAM,MAAOA,CAAK,CACnC,CACF,CAgCA,IACE1E,EACA0D,EACAoB,EAA4C,CAAA,EAAE,CAE9C,GAAM,CAAE,OAAA3B,EAAS4B,EAAQ,eAAiB,CAAA,EAAK,MAAS,EAAKD,EAC7DA,EAAW,OAAS3B,EAChBA,IACFA,EAAO,GAAK,MACZA,EAAO,IAAMnD,EACT0D,IAAM,SAAWP,EAAO,MAAQO,GACpCP,EAAO,MAAQ,MAEjB,IAAM6B,EAAS,KAAKH,GAAK7E,EAAG0D,EAAGoB,CAAU,EACzC,OAAI3B,GAAU4B,EAAQ,gBACpBA,EAAQ,QAAQ5B,CAAM,EAEjB6B,CACT,CAEAH,GACE7E,EACA0D,EACAoB,EACAG,EAAuB,CAEvB,GAAM,CACJ,IAAAxE,EAAM,KAAK,IACX,MAAAoC,EACA,eAAA3B,EAAiB,KAAK,eACtB,gBAAAI,EAAkB,KAAK,gBACvB,OAAA6B,CAAM,EACJ2B,EAEEI,EAAO,KAAKnF,GAAmB2D,CAAC,EACtC,GAAIA,IAAM,OACR,OAAIP,IAAQA,EAAO,IAAM,WACzB,KAAK,OAAOnD,CAAC,EACN,KAET,GAAI,CAAE,YAAAmB,EAAc,KAAK,WAAW,EAAK2D,EAErC3B,GAAU,CAAC+B,IAAM/B,EAAO,MAAQO,GAEpC,IAAMhG,EAAO,KAAK+F,GAChBzD,EACA0D,EACAoB,EAAW,MAAQ,EACnBxD,EACA6B,CAAM,EAIR,GAAI,KAAK,cAAgBzF,EAAO,KAAK,aAEnC,YAAKuF,GAAQjD,EAAG,KAAK,EACjBmD,IACFA,EAAO,IAAM,OACbA,EAAO,qBAAuB,IAEzB,KAET,IAAIlD,EAAQ,KAAKvB,KAAU,EAAI,OAAY,KAAKE,GAAQ,IAAIoB,CAAC,EAC7D,GAAIC,IAAU,OAEZA,EACE,KAAKvB,KAAU,EAAI,KAAKQ,GACtB,KAAKC,GAAM,SAAW,EAAI,KAAKA,GAAM,IAAG,EACxC,KAAKT,KAAU,KAAKR,GAAO,KAAK0F,GAAO,EAAK,EAC5C,KAAKlF,GACT,KAAKG,GAASoB,CAAK,EAAID,EACvB,KAAKlB,GAASmB,CAAK,EAAIyD,EACvB,KAAK9E,GAAQ,IAAIoB,EAAGC,CAAK,EACzB,KAAKlB,GAAM,KAAKG,EAAK,EAAIe,EACzB,KAAKjB,GAAMiB,CAAK,EAAI,KAAKf,GACzB,KAAKA,GAAQe,EACb,KAAKvB,KACL,KAAKiF,GAAa1D,EAAOvC,EAAMyF,CAAM,EACjCA,IAAQA,EAAO,IAAM,OACzBhC,EAAc,GACV,KAAKvB,IAAgB,CAACsF,GACxB,KAAK7G,KAAYqF,EAAG1D,EAAG,KAAK,MAEzB,CAGL,KAAKK,GAAYJ,CAAK,EACtB,IAAMkF,EAAS,KAAKrG,GAASmB,CAAK,EAClC,GAAIyD,IAAMyB,EAAQ,CAChB,GAAI,CAACjE,EACH,GAAI,KAAKnB,GAAmBoF,CAAM,EAAG,CAC/BA,IAAWF,GAEbE,EAAO,kBAAkB,MAAM,IAAI,MAAM,UAAU,CAAC,EAEtD,GAAM,CAAE,qBAAsBpH,CAAC,EAAKoH,EAChCpH,IAAM,QAAaA,IAAM2F,IACvB,KAAKjE,IACP,KAAKrB,KAAWL,EAAGiC,EAAG,KAAK,EAEzB,KAAKL,IACP,KAAKP,IAAW,KAAK,CAACrB,EAAGiC,EAAG,KAAK,CAAC,EAGxC,MACM,KAAKP,IACP,KAAKrB,KAAW+G,EAAQnF,EAAG,KAAK,EAE9B,KAAKL,IACP,KAAKP,IAAW,KAAK,CAAC+F,EAAQnF,EAAG,KAAK,CAAC,EAO7C,GAHA,KAAKwD,GAAgBvD,CAAK,EAC1B,KAAK0D,GAAa1D,EAAOvC,EAAMyF,CAAM,EACrC,KAAKrE,GAASmB,CAAK,EAAIyD,EACnB,CAACwB,EAAM,CACT,IAAME,EACJD,GAAU,KAAKpF,GAAmBoF,CAAM,EACtCA,EAAO,qBACPA,EACEE,EACJD,IAAa,OAAY,MACvB1B,IAAM0B,EAAW,UACjB,SACAjC,IACFA,EAAO,IAAMkC,EACTD,IAAa,SAAWjC,EAAO,SAAWiC,IAE5C,KAAKxF,IACP,KAAK,WAAW8D,EAAG1D,EAAGqF,CAAO,CAEjC,CACF,MAAYH,IACN/B,IACFA,EAAO,IAAM,UAEX,KAAKvD,IACP,KAAK,WAAW8D,EAAG1D,EAAG,QAAQ,EAGpC,CAUA,GATIS,IAAQ,GAAK,CAAC,KAAKlB,IACrB,KAAK4C,GAAsB,EAEzB,KAAK5C,KACF4B,GACH,KAAKyB,GAAY3C,EAAOQ,EAAKoC,CAAK,EAEhCM,GAAQ,KAAKD,GAAWC,EAAQlD,CAAK,GAEvC,CAACiB,GAAkB,KAAKvB,IAAoB,KAAKP,GAAW,CAC9D,IAAMkG,EAAK,KAAKlG,GACZmG,EACJ,KAAQA,EAAOD,GAAI,MAAK,GACtB,KAAKhH,KAAgB,GAAGiH,CAAI,CAEhC,CACA,OAAO,IACT,CAMA,KAAG,CACD,GAAI,CACF,KAAO,KAAK7G,IAAO,CACjB,IAAM8G,EAAM,KAAK1G,GAAS,KAAKG,EAAK,EAEpC,GADA,KAAK2E,GAAO,EAAI,EACZ,KAAK7D,GAAmByF,CAAG,GAC7B,GAAIA,EAAI,qBACN,OAAOA,EAAI,6BAEJA,IAAQ,OACjB,OAAOA,CAEX,CACF,SACE,GAAI,KAAK7F,IAAoB,KAAKP,GAAW,CAC3C,IAAMkG,EAAK,KAAKlG,GACZmG,EACJ,KAAQA,EAAOD,GAAI,MAAK,GACtB,KAAKhH,KAAgB,GAAGiH,CAAI,CAEhC,CACF,CACF,CAEA3B,GAAO6B,EAAa,CAClB,IAAMC,EAAO,KAAKzG,GACZe,EAAI,KAAKnB,GAAS6G,CAAI,EACtBhC,EAAI,KAAK5E,GAAS4G,CAAI,EACtBR,EAAO,KAAKnF,GAAmB2D,CAAC,EAClCwB,GACFxB,EAAE,kBAAkB,MAAM,IAAI,MAAM,SAAS,CAAC,EAEhD,IAAM0B,EAAWF,EAAOxB,EAAE,qBAAuBA,EACjD,OACG,KAAKjE,IAAe,KAAKE,KAC1ByF,IAAa,SAET,KAAK3F,IACP,KAAKrB,KAAWgH,EAAUpF,EAAG,OAAO,EAElC,KAAKL,IACP,KAAKP,IAAW,KAAK,CAACgG,EAAUpF,EAAG,OAAO,CAAC,GAG/C,KAAKwD,GAAgBkC,CAAI,EACrB,KAAKlG,KAAmBkG,CAAI,IAC9B,aAAa,KAAKlG,GAAiBkG,CAAI,CAAC,EACxC,KAAKlG,GAAiBkG,CAAI,EAAI,QAG5BD,IACF,KAAK5G,GAAS6G,CAAI,EAAI,OACtB,KAAK5G,GAAS4G,CAAI,EAAI,OACtB,KAAKvG,GAAM,KAAKuG,CAAI,GAElB,KAAKhH,KAAU,GACjB,KAAKO,GAAQ,KAAKC,GAAQ,EAC1B,KAAKC,GAAM,OAAS,GAEpB,KAAKF,GAAQ,KAAKF,GAAM2G,CAAI,EAE9B,KAAK9G,GAAQ,OAAOoB,CAAC,EACrB,KAAKtB,KACEgH,CACT,CAkBA,IAAI1F,EAAM2F,EAA4C,CAAA,EAAE,CACtD,GAAM,CAAE,OAAAxC,EAAS4B,EAAQ,eAAiB,CAAA,EAAK,MAAS,EAAKY,EAC7DA,EAAW,OAASxC,EAChBA,IACFA,EAAO,GAAK,MACZA,EAAO,IAAMnD,EACbmD,EAAO,MAAQ,MAEjB,IAAM6B,EAAS,KAAKY,GAAK5F,EAAG2F,CAAU,EACtC,OAAIZ,EAAQ,gBAAgBA,EAAQ,QAAQ5B,CAAM,EAC3C6B,CACT,CACAY,GAAK5F,EAAM2F,EAA4C,CAAA,EAAE,CACvD,GAAM,CAAE,eAAA9E,EAAiB,KAAK,eAAgB,OAAAsC,CAAM,EAAKwC,EACnD1F,EAAQ,KAAKrB,GAAQ,IAAIoB,CAAC,EAChC,GAAIC,IAAU,OAAW,CACvB,IAAMyD,EAAI,KAAK5E,GAASmB,CAAK,EAC7B,GACE,KAAKF,GAAmB2D,CAAC,GACzBA,EAAE,uBAAyB,OAE3B,MAAO,GAET,GAAK,KAAKlD,GAASP,CAAK,EASbkD,IACTA,EAAO,IAAM,QACb,KAAKD,GAAWC,EAAQlD,CAAK,OAV7B,QAAIY,GACF,KAAKkC,GAAe9C,CAAK,EAEvBkD,IACFA,EAAO,IAAM,MACb,KAAKD,GAAWC,EAAQlD,CAAK,GAExB,EAKX,MAAWkD,IACTA,EAAO,IAAM,QAEf,MAAO,EACT,CASA,KAAKnD,EAAM6F,EAA8C,CAAA,EAAE,CACzD,GAAM,CAAE,OAAA1C,EAAS2C,EAAc,EAAK,CAAA,EAAK,MAAS,EAAKD,EACnD1C,IACFA,EAAO,GAAK,OACZA,EAAO,IAAMnD,EACbmD,EAAO,MAAQ,MAEjB0C,EAAY,OAAS1C,EACrB,IAAM6B,EAAS,KAAKe,GAAM/F,EAAG6F,CAAW,EACxC,OAAId,EAAQ,gBACVA,EAAQ,QAAQ5B,CAAM,EAEjB6B,CACT,CACAe,GAAM/F,EAAM6F,EAA2C,CACrD,GAAM,CAAE,OAAA1C,EAAQ,WAAArC,EAAa,KAAK,UAAU,EAAK+E,EAC3C5F,EAAQ,KAAKrB,GAAQ,IAAIoB,CAAC,EAChC,GAAIC,IAAU,QAAc,CAACa,GAAc,KAAKN,GAASP,CAAK,EAAI,CAC5DkD,IAAQA,EAAO,KAAOlD,IAAU,OAAY,OAAS,SACzD,MACF,CACA,IAAMyD,EAAI,KAAK5E,GAASmB,CAAK,EACvBuF,EAAM,KAAKzF,GAAmB2D,CAAC,EAAIA,EAAE,qBAAuBA,EAClE,OAAIP,IACEqC,IAAQ,QACVrC,EAAO,KAAO,MACdA,EAAO,MAAQqC,GAEfrC,EAAO,KAAO,QAGXqC,CACT,CAEApF,GACEJ,EACAC,EACAC,EACAC,EAAW,CAEX,IAAMuD,EAAIzD,IAAU,OAAY,OAAY,KAAKnB,GAASmB,CAAK,EAC/D,GAAI,KAAKF,GAAmB2D,CAAC,EAC3B,OAAOA,EAGT,IAAMsC,EAAK,IAAI,gBACT,CAAE,OAAAC,CAAM,EAAK/F,EAEnB+F,GAAQ,iBAAiB,QAAS,IAAMD,EAAG,MAAMC,EAAO,MAAM,EAAG,CAC/D,OAAQD,EAAG,OACZ,EAED,IAAME,EAAY,CAChB,OAAQF,EAAG,OACX,QAAA9F,EACA,QAAAC,GAGIgG,EAAK,CAACzC,EAAkB0C,EAAc,KAAwB,CAClE,GAAM,CAAE,QAAAC,CAAO,EAAKL,EAAG,OACjBM,EAAcpG,EAAQ,kBAAoBwD,IAAM,OAChD6C,EACJrG,EAAQ,kBACR,CAAC,EAAEA,EAAQ,wBAA0BwD,IAAM,QAU7C,GATIxD,EAAQ,SACNmG,GAAW,CAACD,GACdlG,EAAQ,OAAO,aAAe,GAC9BA,EAAQ,OAAO,WAAa8F,EAAG,OAAO,OAClCM,IAAapG,EAAQ,OAAO,kBAAoB,KAEpDA,EAAQ,OAAO,cAAgB,IAG/BmG,GAAW,CAACC,GAAe,CAACF,EAC9B,OAAOI,EAAUR,EAAG,OAAO,OAAQO,CAAO,EAG5C,IAAMtB,EAAKnF,EAIL2G,EAAK,KAAK3H,GAASmB,CAAc,EACvC,OAAIwG,IAAO3G,GAAM2G,IAAO,QAAaH,GAAeF,KAC9C1C,IAAM,OACJuB,EAAG,uBAAyB,OAC9B,KAAKnG,GAASmB,CAAc,EAAIgF,EAAG,qBAEnC,KAAKhC,GAAQjD,EAAG,OAAO,GAGrBE,EAAQ,SAAQA,EAAQ,OAAO,aAAe,IAClD,KAAK2E,GAAK7E,EAAG0D,EAAGwC,EAAU,QAASjB,CAAE,IAGlCvB,CACT,EAEMgD,EAAMC,IACNzG,EAAQ,SACVA,EAAQ,OAAO,cAAgB,GAC/BA,EAAQ,OAAO,WAAayG,GAGvBH,EAAUG,EAAI,EAAK,GAGtBH,EAAY,CAACG,EAAaJ,IAAmC,CACjE,GAAM,CAAE,QAAAF,CAAO,EAAKL,EAAG,OACjBY,EAAoBP,GAAWnG,EAAQ,uBACvCY,EACJ8F,GAAqB1G,EAAQ,2BACzB2G,EAAW/F,GAAcZ,EAAQ,yBACjC+E,EAAKnF,EAgBX,GAfI,KAAKhB,GAASmB,CAAc,IAAMH,IAIlC,CAAC+G,GAAa,CAACN,GAAWtB,EAAG,uBAAyB,OAEtD,KAAKhC,GAAQjD,EAAG,OAAO,EACb4G,IAKV,KAAK9H,GAASmB,CAAc,EAAIgF,EAAG,uBAGnCnE,EACF,OAAIZ,EAAQ,QAAU+E,EAAG,uBAAyB,SAChD/E,EAAQ,OAAO,cAAgB,IAE1B+E,EAAG,qBACL,GAAIA,EAAG,aAAeA,EAC3B,MAAM0B,CAEV,EAEMG,EAAQ,CACZC,EACAC,IACE,CACF,IAAMC,EAAM,KAAK1I,KAAeyB,EAAG0D,EAAGwC,CAAS,EAI/CF,EAAG,OAAO,iBAAiB,QAAS,IAAK,EACnC,CAAC9F,EAAQ,kBAAoBA,EAAQ,0BACvC6G,EAAI,MAAS,EAET7G,EAAQ,yBACV6G,EAAMrD,GAAKyC,EAAGzC,EAAG,EAAI,GAG3B,CAAC,EACGuD,GAAOA,aAAe,QACxBA,EAAI,KAAKvD,GAAKqD,EAAIrD,IAAM,OAAY,OAAYA,CAAC,EAAGsD,CAAG,EAC9CC,IAAQ,QACjBF,EAAIE,CAAG,CAEX,EAEI/G,EAAQ,SAAQA,EAAQ,OAAO,gBAAkB,IACrD,IAAMJ,EAAI,IAAI,QAAQgH,CAAK,EAAE,KAAKX,EAAIO,CAAE,EAClCzB,EAAyB,OAAO,OAAOnF,EAAG,CAC9C,kBAAmBkG,EACnB,qBAAsBtC,EACtB,WAAY,OACb,EAED,OAAIzD,IAAU,QAEZ,KAAK4E,GAAK7E,EAAGiF,EAAI,CAAE,GAAGiB,EAAU,QAAS,OAAQ,MAAS,CAAE,EAC5DjG,EAAQ,KAAKrB,GAAQ,IAAIoB,CAAC,GAM1B,KAAKlB,GAASmB,CAAK,EAAIgF,EAElBA,CACT,CAEAlF,GAAmBD,EAAU,CAC3B,GAAI,CAAC,KAAKJ,GAAiB,MAAO,GAClC,IAAMwH,EAAIpH,EACV,MACE,CAAC,CAACoH,GACFA,aAAa,SACbA,EAAE,eAAe,sBAAsB,GACvCA,EAAE,6BAA6B,eAEnC,CA0GA,MACElH,EACAmH,EAAgD,CAAA,EAAE,CAElD,IAAMC,EAAMC,EAAQ,eACd,CAAE,OAAAlE,EAAS2C,EAAc,EAAK,CAAA,EAAK,MAAS,EAAKqB,EACvDA,EAAa,OAAShE,EAClBA,GAAUgE,EAAa,UACzBhE,EAAO,QAAUgE,EAAa,SAEhC,IAAMrH,EAAI,KAAKwH,GAAOtH,EAAGmH,CAAY,EACrC,OAAIhE,GAAUiE,IACZjE,EAAO,MAAQ,GACfkE,EAAQ,aAAa,IAAMvH,EAAGqD,CAAM,EAAE,MAAM,IAAK,CAAE,CAAC,GAE/CrD,CACT,CAEA,KAAMwH,GACJtH,EACAmH,EAAgD,CAAA,EAAE,CAElD,GAAM,CAEJ,WAAArG,EAAa,KAAK,WAClB,eAAAF,EAAiB,KAAK,eACtB,mBAAAc,EAAqB,KAAK,mBAE1B,IAAAjB,EAAM,KAAK,IACX,eAAAS,EAAiB,KAAK,eACtB,KAAAxD,EAAO,EACP,gBAAA4D,EAAkB,KAAK,gBACvB,YAAAH,EAAc,KAAK,YAEnB,yBAAAM,EAA2B,KAAK,yBAChC,2BAAAE,EAA6B,KAAK,2BAClC,iBAAAE,EAAmB,KAAK,iBACxB,uBAAAD,EAAyB,KAAK,uBAC9B,QAAAzB,EACA,aAAAoH,EAAe,GACf,OAAApE,EACA,OAAA8C,CAAM,EACJkB,EAQJ,GAPIhE,IACFA,EAAO,GAAK,QACZA,EAAO,IAAMnD,EACTuH,IAAcpE,EAAO,aAAe,IACxCA,EAAO,MAAQ,MAGb,CAAC,KAAKzD,GACR,OAAIyD,IAAQA,EAAO,MAAQ,OACpB,KAAKoB,GAAKvE,EAAG,CAClB,WAAAc,EACA,eAAAF,EACA,mBAAAc,EACA,OAAAyB,EACD,EAGH,IAAMjD,EAAU,CACd,WAAAY,EACA,eAAAF,EACA,mBAAAc,EACA,IAAAjB,EACA,eAAAS,EACA,KAAAxD,EACA,gBAAA4D,EACA,YAAAH,EACA,yBAAAM,EACA,2BAAAE,EACA,uBAAAC,EACA,iBAAAC,EACA,OAAAsB,EACA,OAAA8C,GAGEhG,EAAQ,KAAKrB,GAAQ,IAAIoB,CAAC,EAC9B,GAAIC,IAAU,OAAW,CACnBkD,IAAQA,EAAO,MAAQ,QAC3B,IAAM,EAAI,KAAK/C,GAAiBJ,EAAGC,EAAOC,EAASC,CAAa,EAChE,OAAQ,EAAE,WAAa,CACzB,KAAO,CAEL,IAAMuD,EAAI,KAAK5E,GAASmB,CAAK,EAC7B,GAAI,KAAKF,GAAmB2D,CAAC,EAAG,CAC9B,IAAM8D,EAAQ1G,GAAc4C,EAAE,uBAAyB,OACvD,OAAIP,IACFA,EAAO,MAAQ,WACXqE,IAAOrE,EAAO,cAAgB,KAE7BqE,EAAQ9D,EAAE,qBAAwBA,EAAE,WAAaA,CAC1D,CAIA,IAAM+D,EAAU,KAAKjH,GAASP,CAAK,EACnC,GAAI,CAACsH,GAAgB,CAACE,EACpB,OAAItE,IAAQA,EAAO,MAAQ,OAC3B,KAAK9C,GAAYJ,CAAK,EAClBW,GACF,KAAKmC,GAAe9C,CAAK,EAEvBkD,GAAQ,KAAKD,GAAWC,EAAQlD,CAAK,EAClCyD,EAKT,IAAM5D,EAAI,KAAKM,GAAiBJ,EAAGC,EAAOC,EAASC,CAAa,EAE1DuH,EADW5H,EAAE,uBAAyB,QACfgB,EAC7B,OAAIqC,IACFA,EAAO,MAAQsE,EAAU,QAAU,UAC/BC,GAAYD,IAAStE,EAAO,cAAgB,KAE3CuE,EAAW5H,EAAE,qBAAwBA,EAAE,WAAaA,CAC7D,CACF,CAgCA,WACEE,EACAmH,EAAgD,CAAA,EAAE,CAElD,IAAMC,EAAMC,EAAQ,eACd,CAAE,OAAAlE,EAAS2C,EAAc,EAAK,CAAA,EAAK,MAAS,EAAKqB,EACvDA,EAAa,OAAShE,EAClBA,GAAUgE,EAAa,UACzBhE,EAAO,QAAUgE,EAAa,SAEhC,IAAMrH,EAAI,KAAK6H,GAAY3H,EAAGmH,CAAY,EAC1C,OAAIhE,GAAUiE,IACZjE,EAAO,MAAQ,GACfkE,EAAQ,aAAa,IAAMvH,EAAGqD,CAAM,EAAE,MAAM,IAAK,CAAE,CAAC,GAE/CrD,CACT,CAEA,KAAM6H,GACJ3H,EACAmH,EAAgD,CAAA,EAAE,CAElD,IAAMzD,EAAI,MAAM,KAAK4D,GAAOtH,EAAGmH,CAAY,EAC3C,GAAIzD,IAAM,OAAW,MAAM,IAAI,MAAM,4BAA4B,EACjE,OAAOA,CACT,CA+BA,KAAK1D,EAAM4H,EAA8C,CAAA,EAAE,CACzD,GAAM,CAAE,OAAAzE,EAAS4B,EAAQ,eAAiB,CAAA,EAAK,MAAS,EACtD6C,EACFA,EAAY,OAASzE,EACjBA,IACFA,EAAO,GAAK,OACZA,EAAO,IAAMnD,EACT4H,EAAY,UACdzE,EAAO,QAAUyE,EAAY,SAE/BzE,EAAO,MAAQ,MAEjB,IAAM6B,EAAS,KAAK6C,GAAM7H,EAAG4H,CAAW,EACxC,OAAIzE,IAAQA,EAAO,MAAQ6B,GACvBD,EAAQ,gBAAgBA,EAAQ,QAAQ5B,CAAM,EAC3C6B,CACT,CACA6C,GAAM7H,EAAM4H,EAA8C,CAAA,EAAE,CAC1D,IAAMpG,EAAa,KAAKhD,GACxB,GAAI,CAACgD,EACH,MAAM,IAAI,MAAM,uCAAuC,EAEzD,GAAM,CAAE,QAAArB,EAAS,OAAAgD,EAAQ,aAAAoE,EAAc,GAAGrH,CAAO,EAAK0H,EAClDzE,GAAUoE,IAAcpE,EAAO,aAAe,IAClD,IAAMO,EAAI,KAAKa,GAAKvE,EAAGE,CAAO,EACxB4H,EAAUP,GAAgB7D,IAAM,OAKtC,GAJIP,IACFA,EAAO,KAAO2E,EAAU,OAAS,MAC5BA,IAAS3E,EAAO,MAAQO,IAE3B,CAACoE,EAAS,OAAOpE,EACrB,IAAMqE,EAAKvG,EAAWxB,EAAG0D,EAAG,CAC1B,QAAAxD,EACA,QAAAC,EACqC,EACvC,OAAIgD,IAAQA,EAAO,MAAQ4E,GAC3B,KAAKlD,GAAK7E,EAAG+H,EAAI7H,CAAO,EACjB6H,CACT,CAQA,IAAI/H,EAAMqE,EAA4C,CAAA,EAAE,CACtD,GAAM,CAAE,OAAAlB,EAAS4B,EAAQ,eAAiB,CAAA,EAAK,MAAS,EAAKV,EAC7DA,EAAW,OAASlB,EAChBA,IACFA,EAAO,GAAK,MACZA,EAAO,IAAMnD,EACbmD,EAAO,MAAQ,MAEjB,IAAM6B,EAAS,KAAKT,GAAKvE,EAAGqE,CAAU,EACtC,OAAIlB,IACE6B,IAAW,SAAW7B,EAAO,MAAQ6B,GACrCD,EAAQ,gBAAgBA,EAAQ,QAAQ5B,CAAM,GAE7C6B,CACT,CAEAT,GAAKvE,EAAMqE,EAA4C,CAAA,EAAE,CACvD,GAAM,CACJ,WAAAvD,EAAa,KAAK,WAClB,eAAAF,EAAiB,KAAK,eACtB,mBAAAc,EAAqB,KAAK,mBAC1B,OAAAyB,CAAM,EACJkB,EACEpE,EAAQ,KAAKrB,GAAQ,IAAIoB,CAAC,EAChC,GAAIC,IAAU,OAAW,CACnBkD,IAAQA,EAAO,IAAM,QACzB,MACF,CACA,IAAMmB,EAAQ,KAAKxF,GAASmB,CAAK,EAC3B+H,EAAW,KAAKjI,GAAmBuE,CAAK,EAE9C,OADInB,GAAQ,KAAKD,GAAWC,EAAQlD,CAAK,EACrC,KAAKO,GAASP,CAAK,EAEhB+H,GAWD7E,IAAQA,EAAO,IAAM,kBACrBrC,GAAcwD,EAAM,uBAAyB,QAC3CnB,IAAQA,EAAO,cAAgB,IAC5BmB,EAAM,sBAEf,SAfO5C,GACH,KAAKuB,GAAQjD,EAAG,QAAQ,EAEtBmD,IAAQA,EAAO,IAAM,SACrBrC,GACEqC,IAAQA,EAAO,cAAgB,IAC5BmB,GAET,SAUAnB,IAAQA,EAAO,IAAM6E,EAAW,WAAa,OAMjD,KAAK3H,GAAYJ,CAAK,EAClBW,GACF,KAAKmC,GAAe9C,CAAK,EAEpB+H,EAAW1D,EAAM,qBAAuBA,EACjD,CAEA2D,GAASnI,EAAUxC,EAAQ,CACzB,KAAK0B,GAAM1B,CAAC,EAAIwC,EAChB,KAAKf,GAAMe,CAAC,EAAIxC,CAClB,CAEA+C,GAAYJ,EAAY,CASlBA,IAAU,KAAKf,KACbe,IAAU,KAAKhB,GACjB,KAAKA,GAAQ,KAAKF,GAAMkB,CAAK,EAE7B,KAAKgI,GACH,KAAKjJ,GAAMiB,CAAK,EAChB,KAAKlB,GAAMkB,CAAK,CAAU,EAG9B,KAAKgI,GAAS,KAAK/I,GAAOe,CAAK,EAC/B,KAAKf,GAAQe,EAEjB,CAOA,OAAOD,EAAI,CACT,OAAO,KAAKiD,GAAQjD,EAAG,QAAQ,CACjC,CAEAiD,GAAQjD,EAAMkI,EAA8B,CACtCnD,EAAQ,gBACVA,EAAQ,QAAQ,CACd,GAAI,SACJ,OAAQmD,EACR,IAAKlI,EACL,MAAO,KACR,EAEH,IAAIyE,EAAU,GACd,GAAI,KAAK/F,KAAU,EAAG,CACpB,IAAMuB,EAAQ,KAAKrB,GAAQ,IAAIoB,CAAC,EAChC,GAAIC,IAAU,OAMZ,GALI,KAAKT,KAAmBS,CAAK,IAC/B,aAAa,KAAKT,KAAmBS,CAAK,CAAC,EAC3C,KAAKT,GAAiBS,CAAK,EAAI,QAEjCwE,EAAU,GACN,KAAK/F,KAAU,EACjB,KAAKyJ,GAAOD,CAAM,MACb,CACL,KAAK1E,GAAgBvD,CAAK,EAC1B,IAAMyD,EAAI,KAAK5E,GAASmB,CAAK,EAc7B,GAbI,KAAKF,GAAmB2D,CAAC,EAC3BA,EAAE,kBAAkB,MAAM,IAAI,MAAM,SAAS,CAAC,GACrC,KAAKjE,IAAe,KAAKE,MAC9B,KAAKF,IACP,KAAKrB,KAAWsF,EAAQ1D,EAAGkI,CAAM,EAE/B,KAAKvI,IACP,KAAKP,IAAW,KAAK,CAACsE,EAAQ1D,EAAGkI,CAAM,CAAC,GAG5C,KAAKtJ,GAAQ,OAAOoB,CAAC,EACrB,KAAKnB,GAASoB,CAAK,EAAI,OACvB,KAAKnB,GAASmB,CAAK,EAAI,OACnBA,IAAU,KAAKf,GACjB,KAAKA,GAAQ,KAAKF,GAAMiB,CAAK,UACpBA,IAAU,KAAKhB,GACxB,KAAKA,GAAQ,KAAKF,GAAMkB,CAAK,MACxB,CACL,IAAMmI,EAAK,KAAKpJ,GAAMiB,CAAK,EAC3B,KAAKlB,GAAMqJ,CAAE,EAAI,KAAKrJ,GAAMkB,CAAK,EACjC,IAAMoI,EAAK,KAAKtJ,GAAMkB,CAAK,EAC3B,KAAKjB,GAAMqJ,CAAE,EAAI,KAAKrJ,GAAMiB,CAAK,CACnC,CACA,KAAKvB,KACL,KAAKS,GAAM,KAAKc,CAAK,CACvB,CAEJ,CACA,GAAI,KAAKN,IAAoB,KAAKP,IAAW,OAAQ,CACnD,IAAMkG,EAAK,KAAKlG,GACZmG,EACJ,KAAQA,EAAOD,GAAI,MAAK,GACtB,KAAKhH,KAAgB,GAAGiH,CAAI,CAEhC,CACA,OAAOd,CACT,CAKA,OAAK,CACH,OAAO,KAAK0D,GAAO,QAAQ,CAC7B,CACAA,GAAOD,EAA8B,CACnC,QAAWjI,KAAS,KAAKM,GAAU,CAAE,WAAY,EAAI,CAAE,EAAG,CACxD,IAAMmD,EAAI,KAAK5E,GAASmB,CAAK,EAC7B,GAAI,KAAKF,GAAmB2D,CAAC,EAC3BA,EAAE,kBAAkB,MAAM,IAAI,MAAM,SAAS,CAAC,MACzC,CACL,IAAM1D,EAAI,KAAKnB,GAASoB,CAAK,EACzB,KAAKR,IACP,KAAKrB,KAAWsF,EAAQ1D,EAAQkI,CAAM,EAEpC,KAAKvI,IACP,KAAKP,IAAW,KAAK,CAACsE,EAAQ1D,EAAQkI,CAAM,CAAC,CAEjD,CACF,CAKA,GAHA,KAAKtJ,GAAQ,MAAK,EACb,KAAKE,GAAS,KAAK,MAAS,EACjC,KAAKD,GAAS,KAAK,MAAS,EACxB,KAAKU,IAAS,KAAKD,GAAS,CAC9B,KAAKC,GAAM,KAAK,CAAC,EACjB,KAAKD,GAAQ,KAAK,CAAC,EACnB,QAAW,KAAK,KAAKE,IAAoB,CAAA,EACnC,IAAM,QAAW,aAAa,CAAC,EAErC,KAAKA,IAAkB,KAAK,MAAS,CACvC,CASA,GARI,KAAKH,IACP,KAAKA,GAAO,KAAK,CAAC,EAEpB,KAAKJ,GAAQ,EACb,KAAKC,GAAQ,EACb,KAAKC,GAAM,OAAS,EACpB,KAAKR,GAAkB,EACvB,KAAKD,GAAQ,EACT,KAAKiB,IAAoB,KAAKP,GAAW,CAC3C,IAAMkG,EAAK,KAAKlG,GACZmG,EACJ,KAAQA,EAAOD,GAAI,MAAK,GACtB,KAAKhH,KAAgB,GAAGiH,CAAI,CAEhC,CACF", + "names": ["dummy", "metrics", "tracing", "dc", "defaultPerf", "hasSubscribers", "metrics", "tracing", "warned", "PROCESS", "emitWarning", "msg", "type", "code", "fn", "shouldWarn", "isPosInt", "n", "getUintArray", "max", "ZeroArray", "size", "Stack", "_Stack", "#constructing", "HeapCls", "s", "LRUCache", "_LRUCache", "#max", "#maxSize", "#dispose", "#onInsert", "#disposeAfter", "#fetchMethod", "#memoMethod", "#perf", "#size", "#calculatedSize", "#keyMap", "#keyList", "#valList", "#next", "#prev", "#head", "#tail", "#free", "#disposed", "#sizes", "#starts", "#ttls", "#autopurgeTimers", "#hasDispose", "#hasFetchMethod", "#hasDisposeAfter", "#hasOnInsert", "c", "p", "#isBackgroundFetch", "k", "index", "options", "context", "#backgroundFetch", "#moveToTail", "#indexes", "#rindexes", "#isStale", "ttl", "ttlResolution", "ttlAutopurge", "updateAgeOnGet", "updateAgeOnHas", "allowStale", "dispose", "onInsert", "disposeAfter", "noDisposeOnSet", "noUpdateTTL", "maxSize", "maxEntrySize", "sizeCalculation", "fetchMethod", "memoMethod", "noDeleteOnFetchRejection", "noDeleteOnStaleGet", "allowStaleOnFetchRejection", "allowStaleOnFetchAbort", "ignoreFetchAbort", "backgroundFetchSize", "perf", "defaultPerf", "UintArray", "#initializeSizeTracking", "#initializeTTLTracking", "code", "shouldWarn", "warned", "emitWarning", "key", "ttls", "starts", "purgeTimers", "#setItemTTL", "start", "setPurgetTimer", "#updateItemAge", "t", "#delete", "#statusTTL", "status", "cachedNow", "getNow", "age", "sizes", "#removeItemSize", "#requireSize", "v", "#addItemSize", "#evict", "_i", "_s", "_st", "_k", "_v", "i", "#isValidIndex", "fn", "getOptions", "value", "#get", "thisp", "deleted", "entry", "remain", "arr", "#set", "setOptions", "metrics", "result", "bf", "isBF", "oldVal", "oldValue", "setType", "dt", "task", "val", "free", "head", "hasOptions", "#has", "peekOptions", "hasSubscribers", "#peek", "ac", "signal", "fetchOpts", "cb", "updateCache", "aborted", "ignoreAbort", "proceed", "fetchFail", "vl", "eb", "er", "allowStaleAborted", "noDelete", "pcall", "res", "rej", "fmp", "b", "fetchOptions", "ths", "tracing", "#fetch", "forceRefresh", "stale", "isStale", "staleVal", "#forceFetch", "memoOptions", "#memo", "refresh", "vv", "fetching", "#connect", "reason", "#clear", "pi", "ni"] +} diff --git a/node_modules/lru-cache/dist/esm/node/diagnostics-channel-node.d.ts.map b/node_modules/lru-cache/dist/esm/node/diagnostics-channel-node.d.ts.map new file mode 100644 index 00000000..2c0f7d51 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/node/diagnostics-channel-node.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"diagnostics-channel-node.d.ts","sourceRoot":"","sources":["../../../src/diagnostics-channel-node.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AACvE,YAAY,EAAE,cAAc,EAAE,OAAO,EAAE,CAAA;AACvC,eAAO,MAAM,OAAO,EAAE,OAAO,CAAC,OAAO,CAAgC,CAAA;AACrE,eAAO,MAAM,OAAO,EAAE,cAAc,CAAC,OAAO,CAA+B,CAAA"} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/node/diagnostics-channel-node.js.map b/node_modules/lru-cache/dist/esm/node/diagnostics-channel-node.js.map new file mode 100644 index 00000000..83ee50aa --- /dev/null +++ b/node_modules/lru-cache/dist/esm/node/diagnostics-channel-node.js.map @@ -0,0 +1 @@ +{"version":3,"file":"diagnostics-channel-node.js","sourceRoot":"","sources":["../../../src/diagnostics-channel-node.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,mEAAmE;AACnE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAGlE,MAAM,CAAC,MAAM,OAAO,GAAqB,OAAO,CAAC,mBAAmB,CAAC,CAAA;AACrE,MAAM,CAAC,MAAM,OAAO,GAA4B,cAAc,CAAC,WAAW,CAAC,CAAA","sourcesContent":["// simple node version that imports from node builtin\n// this is built to both ESM and CommonJS on the 'node' import path\nimport { tracingChannel, channel } from 'node:diagnostics_channel'\nimport type { TracingChannel, Channel } from 'node:diagnostics_channel'\nexport type { TracingChannel, Channel }\nexport const metrics: Channel = channel('lru-cache:metrics')\nexport const tracing: TracingChannel = tracingChannel('lru-cache')\n"]} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/node/diagnostics-channel.d.ts b/node_modules/lru-cache/dist/esm/node/diagnostics-channel.d.ts new file mode 100644 index 00000000..3e9e25d0 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/node/diagnostics-channel.d.ts @@ -0,0 +1,5 @@ +import type { TracingChannel, Channel } from 'node:diagnostics_channel'; +export type { TracingChannel, Channel }; +export declare const metrics: Channel; +export declare const tracing: TracingChannel; +//# sourceMappingURL=diagnostics-channel-node.d.ts.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/node/diagnostics-channel.js b/node_modules/lru-cache/dist/esm/node/diagnostics-channel.js new file mode 100644 index 00000000..f37e0baa --- /dev/null +++ b/node_modules/lru-cache/dist/esm/node/diagnostics-channel.js @@ -0,0 +1,6 @@ +// simple node version that imports from node builtin +// this is built to both ESM and CommonJS on the 'node' import path +import { tracingChannel, channel } from 'node:diagnostics_channel'; +export const metrics = channel('lru-cache:metrics'); +export const tracing = tracingChannel('lru-cache'); +//# sourceMappingURL=diagnostics-channel-node.js.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/node/index.d.ts b/node_modules/lru-cache/dist/esm/node/index.d.ts new file mode 100644 index 00000000..b0e4b964 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/node/index.d.ts @@ -0,0 +1,1400 @@ +/** + * @module LRUCache + */ +import type { Perf } from './perf.js'; +export type { Perf } from './perf.js'; +declare const TYPE: unique symbol; +export type PosInt = number & { + [TYPE]: 'Positive Integer'; +}; +export type Index = number & { + [TYPE]: 'LRUCache Index'; +}; +export type UintArray = Uint8Array | Uint16Array | Uint32Array; +export type NumberArray = UintArray | number[]; +declare class ZeroArray extends Array { + constructor(size: number); +} +export type { ZeroArray }; +export type { Stack }; +export type StackLike = Stack | Index[]; +declare class Stack { + #private; + heap: NumberArray; + length: number; + static create(max: number): StackLike; + constructor(max: number, HeapCls: { + new (n: number): NumberArray; + }); + push(n: Index): void; + pop(): Index; +} +/** + * Promise representing an in-progress {@link LRUCache#fetch} call + */ +export type BackgroundFetch = Promise & { + __returned: BackgroundFetch | undefined; + __abortController: AbortController; + __staleWhileFetching: V | undefined; +}; +export type DisposeTask = [ + value: V, + key: K, + reason: LRUCache.DisposeReason +]; +export declare namespace LRUCache { + /** + * An integer greater than 0, reflecting the calculated size of items + */ + type Size = number; + /** + * Integer greater than 0, representing some number of milliseconds, or the + * time at which a TTL started counting from. + */ + type Milliseconds = number; + /** + * An integer greater than 0, reflecting a number of items + */ + type Count = number; + /** + * The reason why an item was removed from the cache, passed + * to the {@link Disposer} methods. + * + * - `evict`: The item was evicted because it is the least recently used, + * and the cache is full. + * - `set`: A new value was set, overwriting the old value being disposed. + * - `delete`: The item was explicitly deleted, either by calling + * {@link LRUCache#delete}, {@link LRUCache#clear}, or + * {@link LRUCache#set} with an undefined value. + * - `expire`: The item was removed due to exceeding its TTL. + * - `fetch`: A {@link OptionsBase#fetchMethod} operation returned + * `undefined` or was aborted, causing the item to be deleted. + */ + type DisposeReason = 'evict' | 'set' | 'delete' | 'expire' | 'fetch'; + /** + * A method called upon item removal, passed as the + * {@link OptionsBase.dispose} and/or + * {@link OptionsBase.disposeAfter} options. + */ + type Disposer = (value: V, key: K, reason: DisposeReason) => void; + /** + * The reason why an item was added to the cache, passed + * to the {@link Inserter} methods. + * + * - `add`: the item was not found in the cache, and was added + * - `update`: the item was in the cache, with the same value provided + * - `replace`: the item was in the cache, and replaced + */ + type InsertReason = 'add' | 'update' | 'replace'; + /** + * A method called upon item insertion, passed as the + * {@link OptionsBase.insert} + */ + type Inserter = (value: V, key: K, reason: InsertReason) => void; + /** + * A function that returns the effective calculated size + * of an entry in the cache. + */ + type SizeCalculator = (value: V, key: K) => Size; + /** + * Options provided to the + * {@link OptionsBase.fetchMethod} function. + */ + interface FetcherOptions { + signal: AbortSignal; + options: FetcherFetchOptions; + /** + * Object provided in the {@link FetchOptions.context} option to + * {@link LRUCache#fetch} + */ + context: FC; + } + /** + * Occasionally, it may be useful to track the internal behavior of the + * cache, particularly for logging, debugging, or for behavior within the + * `fetchMethod`. To do this, you can pass a `status` object to the + * {@link LRUCache#fetch}, {@link LRUCache#get}, {@link LRUCache#set}, + * {@link LRUCache#memo}, and {@link LRUCache#has} methods. + * + * The `status` option should be a plain JavaScript object. The following + * fields will be set on it appropriately, depending on the situation. + * + * These objects are also the context objects passed to listeners on the + * `lru-cache:metrics` diagnostic channel, and the `lru-cache` tracing + * channels, in platforms that support them. + */ + interface Status { + /** + * The operation being performed + */ + op?: 'get' | 'set' | 'memo' | 'fetch' | 'delete' | 'has' | 'peek'; + /** + * The status of a set() operation. + * + * - add: the item was not found in the cache, and was added + * - update: the item was in the cache, with the same value provided + * - replace: the item was in the cache, and replaced + * - miss: the item was not added to the cache for some reason + */ + set?: 'add' | 'update' | 'replace' | 'miss' | 'deleted'; + /** + * The status of a delete() operation. + */ + delete?: LRUCache.DisposeReason; + /** + * The result of a peek() operation + * + * - hit: the item was found and returned + * - stale: the item is in the cache, but past its ttl and not returned + * - miss: item not in the cache + */ + peek?: 'hit' | 'miss' | 'stale'; + /** + * The status of a memo() operation. + * + * - 'hit': the item was found in the cache and returned + * - 'miss': the `memoMethod` function was called + */ + memo?: 'hit' | 'miss'; + /** + * The `context` option provided to a memo or fetch operation + * + * In practice, of course, this will be the same type as the `FC` + * fetch context param used to instantiate the LRUCache, but the + * convolutions of threading that through would get quite complicated, + * and preclude forcing/forbidding the passing of a `context` param + * where it is/isn't expected, which is more valuable for error + * prevention. + */ + context?: unknown; + /** + * the ttl stored for the item, or undefined if ttls are not used. + */ + ttl?: Milliseconds; + /** + * the start time for the item, or undefined if ttls are not used. + */ + start?: Milliseconds; + /** + * The timestamp used for TTL calculation + */ + now?: Milliseconds; + /** + * the remaining ttl for the item, or undefined if ttls are not used. + */ + remainingTTL?: Milliseconds; + /** + * The calculated size for the item, if sizes are used. + */ + entrySize?: Size; + /** + * The total calculated size of the cache, if sizes are used. + */ + totalCalculatedSize?: Size; + /** + * A flag indicating that the item was not stored, due to exceeding the + * {@link OptionsBase.maxEntrySize} + */ + maxEntrySizeExceeded?: true; + /** + * The key that was set or retrieved + */ + key?: K; + /** + * The value that was set + */ + value?: V; + /** + * The old value, specified in the case of `set:'replace'` + */ + oldValue?: V; + /** + * The results of a {@link LRUCache#has} operation + * + * - hit: the item was found in the cache + * - stale: the item was found in the cache, but is stale + * - miss: the item was not found in the cache + */ + has?: 'hit' | 'stale' | 'miss'; + /** + * The status of a {@link LRUCache#fetch} operation. + * Note that this can change as the underlying fetch() moves through + * various states. + * + * - inflight: there is another fetch() for this key which is in process + * - get: there is no {@link OptionsBase.fetchMethod}, so + * {@link LRUCache#get} was called. + * - miss: the item is not in cache, and will be fetched. + * - hit: the item is in the cache, and was resolved immediately. + * - stale: the item is in the cache, but stale. + * - refresh: the item is in the cache, and not stale, but + * {@link FetchOptions.forceRefresh} was specified. + */ + fetch?: 'get' | 'inflight' | 'miss' | 'hit' | 'stale' | 'refresh'; + /** + * `forceRefresh` option was used for either a fetch or memo operation + */ + forceRefresh?: boolean; + /** + * The {@link OptionsBase.fetchMethod} was called + */ + fetchDispatched?: true; + /** + * The cached value was updated after a successful call to + * {@link OptionsBase.fetchMethod} + */ + fetchUpdated?: true; + /** + * The reason for a fetch() rejection. Either the error raised by the + * {@link OptionsBase.fetchMethod}, or the reason for an + * AbortSignal. + */ + fetchError?: Error; + /** + * The fetch received an abort signal + */ + fetchAborted?: true; + /** + * The abort signal received was ignored, and the fetch was allowed to + * continue in the background. + */ + fetchAbortIgnored?: true; + /** + * The fetchMethod promise resolved successfully + */ + fetchResolved?: true; + /** + * The fetchMethod promise was rejected + */ + fetchRejected?: true; + /** + * The status of a {@link LRUCache#get} operation. + * + * - fetching: The item is currently being fetched. If a previous value + * is present and allowed, that will be returned. + * - stale: The item is in the cache, and is stale. If it was returned, + * then the `returnedStale` flag will be set. + * - stale-fetching: The value is being fetched in the background, but is + * currently stale. If the stale value was returned, then the + * `returnedStale` flag will be set. + * - hit: the item is in the cache + * - miss: the item is not in the cache + */ + get?: 'stale' | 'hit' | 'miss' | 'fetching' | 'stale-fetching'; + /** + * A fetch or get operation returned a stale value. + */ + returnedStale?: true; + /** + * A tracingChannel trace was started for this operation + */ + trace?: boolean; + /** + * A reference to the cache instance associated with this operation + */ + cache?: LRUCache; + } + /** + * options which override the options set in the LRUCache constructor + * when calling {@link LRUCache#fetch}. + * + * This is the union of {@link GetOptions} and {@link SetOptions}, plus + * {@link OptionsBase.noDeleteOnFetchRejection}, + * {@link OptionsBase.allowStaleOnFetchRejection}, + * {@link FetchOptions.forceRefresh}, and + * {@link FetcherOptions.context} + * + * Any of these may be modified in the {@link OptionsBase.fetchMethod} + * function, but the {@link GetOptions} fields will of course have no + * effect, as the {@link LRUCache#get} call already happened by the time + * the fetchMethod is called. + */ + interface FetcherFetchOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet' | 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL' | 'noDeleteOnFetchRejection' | 'allowStaleOnFetchRejection' | 'ignoreFetchAbort' | 'allowStaleOnFetchAbort'> { + status?: Status; + size?: Size; + } + /** + * Options that may be passed to the {@link LRUCache#fetch} method. + */ + interface FetchOptions extends FetcherFetchOptions { + /** + * Set to true to force a re-load of the existing data, even if it + * is not yet stale. + */ + forceRefresh?: boolean; + /** + * Context provided to the {@link OptionsBase.fetchMethod} as + * the {@link FetcherOptions.context} param. + * + * If the FC type is specified as unknown (the default), + * undefined or void, then this is optional. Otherwise, it will + * be required. + */ + context?: FC; + signal?: AbortSignal; + status?: Status; + } + /** + * Options provided to {@link LRUCache#fetch} when the FC type is something + * other than `unknown`, `undefined`, or `void` + */ + interface FetchOptionsWithContext extends FetchOptions { + context: FC; + } + /** + * Options provided to {@link LRUCache#fetch} when the FC type is + * `undefined` or `void` + */ + interface FetchOptionsNoContext extends FetchOptions { + context?: FC; + } + interface MemoOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet' | 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL' | 'noDeleteOnFetchRejection' | 'allowStaleOnFetchRejection' | 'ignoreFetchAbort' | 'allowStaleOnFetchAbort'> { + /** + * Set to true to force a re-load of the existing data, even if it + * is not yet stale. + */ + forceRefresh?: boolean; + /** + * Context provided to the {@link OptionsBase.memoMethod} as + * the {@link MemoizerOptions.context} param. + * + * If the FC type is specified as unknown (the default), + * undefined or void, then this is optional. Otherwise, it will + * be required. + */ + context?: FC; + status?: Status; + } + /** + * Options provided to {@link LRUCache#memo} when the FC type is something + * other than `unknown`, `undefined`, or `void` + */ + interface MemoOptionsWithContext extends MemoOptions { + context: FC; + } + /** + * Options provided to {@link LRUCache#memo} when the FC type is + * `undefined` or `void` + */ + interface MemoOptionsNoContext extends MemoOptions { + context?: FC; + } + /** + * Options provided to the + * {@link OptionsBase.memoMethod} function. + */ + interface MemoizerOptions { + options: MemoizerMemoOptions; + /** + * Object provided in the {@link MemoOptions.context} option to + * {@link LRUCache#memo} + */ + context: FC; + } + /** + * options which override the options set in the LRUCache constructor + * when calling {@link LRUCache#memo}. + * + * This is the union of {@link GetOptions} and {@link SetOptions}, plus + * {@link MemoOptions.forceRefresh}, and + * {@link MemoOptions.context} + * + * Any of these may be modified in the {@link OptionsBase.memoMethod} + * function, but the {@link GetOptions} fields will of course have no + * effect, as the {@link LRUCache#get} call already happened by the time + * the memoMethod is called. + */ + interface MemoizerMemoOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet' | 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'> { + status?: Status; + size?: Size; + start?: Milliseconds; + } + /** + * Options that may be passed to the {@link LRUCache#has} method. + */ + interface HasOptions extends Pick, 'updateAgeOnHas'> { + status?: Status; + } + /** + * Options that may be passed to the {@link LRUCache#get} method. + */ + interface GetOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet'> { + status?: Status; + } + /** + * Options that may be passed to the {@link LRUCache#peek} method. + */ + interface PeekOptions extends Pick, 'allowStale'> { + status?: Status; + } + /** + * Options that may be passed to the {@link LRUCache#set} method. + */ + interface SetOptions extends Pick, 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'> { + /** + * If size tracking is enabled, then setting an explicit size + * in the {@link LRUCache#set} call will prevent calling the + * {@link OptionsBase.sizeCalculation} function. + */ + size?: Size; + /** + * If TTL tracking is enabled, then setting an explicit start + * time in the {@link LRUCache#set} call will override the + * default time from `performance.now()` or `Date.now()`. + * + * Note that it must be a valid value for whichever time-tracking + * method is in use. + */ + start?: Milliseconds; + status?: Status; + } + /** + * The type signature for the {@link OptionsBase.fetchMethod} option. + */ + type Fetcher = (key: K, staleValue: V | undefined, options: FetcherOptions) => Promise | V | undefined | void; + /** + * the type signature for the {@link OptionsBase.memoMethod} option. + */ + type Memoizer = (key: K, staleValue: V | undefined, options: MemoizerOptions) => V; + /** + * Options which may be passed to the {@link LRUCache} constructor. + * + * Most of these may be overridden in the various options that use + * them. + * + * Despite all being technically optional, the constructor requires that + * a cache is at minimum limited by one or more of {@link OptionsBase.max}, + * {@link OptionsBase.ttl}, or {@link OptionsBase.maxSize}. + * + * If {@link OptionsBase.ttl} is used alone, then it is strongly advised + * (and in fact required by the type definitions here) that the cache + * also set {@link OptionsBase.ttlAutopurge}, to prevent potentially + * unbounded storage. + * + * All options are also available on the {@link LRUCache} instance, making + * it safe to pass an LRUCache instance as the options argumemnt to + * make another empty cache of the same type. + * + * Some options are marked as read-only, because changing them after + * instantiation is not safe. Changing any of the other options will of + * course only have an effect on subsequent method calls. + */ + interface OptionsBase { + /** + * The maximum number of items to store in the cache before evicting + * old entries. This is read-only on the {@link LRUCache} instance, + * and may not be overridden. + * + * If set, then storage space will be pre-allocated at construction + * time, and the cache will perform significantly faster. + * + * Note that significantly fewer items may be stored, if + * {@link OptionsBase.maxSize} and/or {@link OptionsBase.ttl} are also + * set. + * + * **It is strongly recommended to set a `max` to prevent unbounded growth + * of the cache.** + */ + max?: Count; + /** + * Max time in milliseconds for items to live in cache before they are + * considered stale. Note that stale items are NOT preemptively removed by + * default, and MAY live in the cache, contributing to its LRU max, long + * after they have expired, unless {@link OptionsBase.ttlAutopurge} is + * set. + * + * If set to `0` (the default value), then that means "do not track + * TTL", not "expire immediately". + * + * Also, as this cache is optimized for LRU/MRU operations, some of + * the staleness/TTL checks will reduce performance, as they will incur + * overhead by deleting items. + * + * This is not primarily a TTL cache, and does not make strong TTL + * guarantees. There is no pre-emptive pruning of expired items, but you + * _may_ set a TTL on the cache, and it will treat expired items as missing + * when they are fetched, and delete them. + * + * Optional, but must be a non-negative integer in ms if specified. + * + * This may be overridden by passing an options object to `cache.set()`. + * + * At least one of `max`, `maxSize`, or `TTL` is required. This must be a + * positive integer if set. + * + * Even if ttl tracking is enabled, **it is strongly recommended to set a + * `max` to prevent unbounded growth of the cache.** + * + * If ttl tracking is enabled, and `max` and `maxSize` are not set, + * and `ttlAutopurge` is not set, then a warning will be emitted + * cautioning about the potential for unbounded memory consumption. + * (The TypeScript definitions will also discourage this.) + */ + ttl?: Milliseconds; + /** + * Minimum amount of time in ms in which to check for staleness. + * Defaults to 1, which means that the current time is checked + * at most once per millisecond. + * + * Set to 0 to check the current time every time staleness is tested. + * (This reduces performance, and is theoretically unnecessary.) + * + * Setting this to a higher value will improve performance somewhat + * while using ttl tracking, albeit at the expense of keeping stale + * items around a bit longer than their TTLs would indicate. + * + * @default 1 + */ + ttlResolution?: Milliseconds; + /** + * Preemptively remove stale items from the cache. + * + * Note that this may *significantly* degrade performance, especially if + * the cache is storing a large number of items. It is almost always best + * to just leave the stale items in the cache, and let them fall out as new + * items are added. + * + * Note that this means that {@link OptionsBase.allowStale} is a bit + * pointless, as stale items will be deleted almost as soon as they + * expire. + * + * Use with caution! + */ + ttlAutopurge?: boolean; + /** + * When using time-expiring entries with `ttl`, setting this to `true` will + * make each item's age reset to 0 whenever it is retrieved from cache with + * {@link LRUCache#get}, causing it to not expire. (It can still fall out + * of cache based on recency of use, of course.) + * + * Has no effect if {@link OptionsBase.ttl} is not set. + * + * This may be overridden by passing an options object to `cache.get()`. + */ + updateAgeOnGet?: boolean; + /** + * When using time-expiring entries with `ttl`, setting this to `true` will + * make each item's age reset to 0 whenever its presence in the cache is + * checked with {@link LRUCache#has}, causing it to not expire. (It can + * still fall out of cache based on recency of use, of course.) + * + * Has no effect if {@link OptionsBase.ttl} is not set. + */ + updateAgeOnHas?: boolean; + /** + * Allow {@link LRUCache#get} and {@link LRUCache#fetch} calls to return + * stale data, if available. + * + * By default, if you set `ttl`, stale items will only be deleted from the + * cache when you `get(key)`. That is, it's not preemptively pruning items, + * unless {@link OptionsBase.ttlAutopurge} is set. + * + * If you set `allowStale:true`, it'll return the stale value *as well as* + * deleting it. If you don't set this, then it'll return `undefined` when + * you try to get a stale entry. + * + * Note that when a stale entry is fetched, _even if it is returned due to + * `allowStale` being set_, it is removed from the cache immediately. You + * can suppress this behavior by setting + * {@link OptionsBase.noDeleteOnStaleGet}, either in the constructor, or in + * the options provided to {@link LRUCache#get}. + * + * This may be overridden by passing an options object to `cache.get()`. + * The `cache.has()` method will always return `false` for stale items. + * + * Only relevant if a ttl is set. + */ + allowStale?: boolean; + /** + * Function that is called on items when they are dropped from the + * cache, as `dispose(value, key, reason)`. + * + * This can be handy if you want to close file descriptors or do + * other cleanup tasks when items are no longer stored in the cache. + * + * **NOTE**: It is called _before_ the item has been fully removed + * from the cache, so if you want to put it right back in, you need + * to wait until the next tick. If you try to add it back in during + * the `dispose()` function call, it will break things in subtle and + * weird ways. + * + * Unlike several other options, this may _not_ be overridden by + * passing an option to `set()`, for performance reasons. + * + * The `reason` will be one of the following strings, corresponding + * to the reason for the item's deletion: + * + * - `evict` Item was evicted to make space for a new addition + * - `set` Item was overwritten by a new value + * - `expire` Item expired its TTL + * - `fetch` Item was deleted due to a failed or aborted fetch, or a + * fetchMethod returning `undefined. + * - `delete` Item was removed by explicit `cache.delete(key)`, + * `cache.clear()`, or `cache.set(key, undefined)`. + */ + dispose?: Disposer; + /** + * Function that is called when new items are inserted into the cache, + * as `onInsert(value, key, reason)`. + * + * This can be useful if you need to perform actions when an item is + * added, such as logging or tracking insertions. + * + * Unlike some other options, this may _not_ be overridden by passing + * an option to `set()`, for performance and consistency reasons. + */ + onInsert?: Inserter; + /** + * The same as {@link OptionsBase.dispose}, but called *after* the entry + * is completely removed and the cache is once again in a clean state. + * + * It is safe to add an item right back into the cache at this point. + * However, note that it is *very* easy to inadvertently create infinite + * recursion this way. + */ + disposeAfter?: Disposer; + /** + * Set to true to suppress calling the + * {@link OptionsBase.dispose} function if the entry key is + * still accessible within the cache. + * + * This may be overridden by passing an options object to + * {@link LRUCache#set}. + * + * Only relevant if `dispose` or `disposeAfter` are set. + */ + noDisposeOnSet?: boolean; + /** + * Boolean flag to tell the cache to not update the TTL when setting a new + * value for an existing key (ie, when updating a value rather than + * inserting a new value). Note that the TTL value is _always_ set (if + * provided) when adding a new entry into the cache. + * + * Has no effect if a {@link OptionsBase.ttl} is not set. + * + * May be passed as an option to {@link LRUCache#set}. + */ + noUpdateTTL?: boolean; + /** + * Set to a positive integer to track the sizes of items added to the + * cache, and automatically evict items in order to stay below this size. + * Note that this may result in fewer than `max` items being stored. + * + * Attempting to add an item to the cache whose calculated size is greater + * that this amount will be a no-op. The item will not be cached, and no + * other items will be evicted. + * + * Optional, must be a positive integer if provided. + * + * Sets `maxEntrySize` to the same value, unless a different value is + * provided for `maxEntrySize`. + * + * At least one of `max`, `maxSize`, or `TTL` is required. This must be a + * positive integer if set. + * + * Even if size tracking is enabled, **it is strongly recommended to set a + * `max` to prevent unbounded growth of the cache.** + * + * Note also that size tracking can negatively impact performance, + * though for most cases, only minimally. + */ + maxSize?: Size; + /** + * The effective size for background fetch promises. + * + * This has no effect unless `maxSize` and `sizeCalculation` are used, + * and a {@link LRUCache.OptionsBase.fetchMethod} is provided to + * support {@link LRUCache#fetch}. + * + * If a stale value is present in the cache, then the effective size of + * the background fetch is the size of the stale item it will eventually + * replace. If not, then this value is used as its effective size. + * + * @default 1 + */ + backgroundFetchSize?: number; + /** + * The maximum allowed size for any single item in the cache. + * + * If a larger item is passed to {@link LRUCache#set} or returned by a + * {@link OptionsBase.fetchMethod} or {@link OptionsBase.memoMethod}, then + * it will not be stored in the cache. + * + * Attempting to add an item whose calculated size is greater than + * this amount will not cache the item or evict any old items, but + * WILL delete an existing value if one is already present. + * + * Optional, must be a positive integer if provided. Defaults to + * the value of `maxSize` if provided. + */ + maxEntrySize?: Size; + /** + * A function that returns a number indicating the item's size. + * + * Requires {@link OptionsBase.maxSize} to be set. + * + * If not provided, and {@link OptionsBase.maxSize} or + * {@link OptionsBase.maxEntrySize} are set, then all + * {@link LRUCache#set} calls **must** provide an explicit + * {@link SetOptions.size} or sizeCalculation param. + */ + sizeCalculation?: SizeCalculator; + /** + * Method that provides the implementation for {@link LRUCache#fetch} + * + * ```ts + * fetchMethod(key, staleValue, { signal, options, context }) + * ``` + * + * If `fetchMethod` is not provided, then `cache.fetch(key)` is equivalent + * to `Promise.resolve(cache.get(key))`. + * + * If at any time, `signal.aborted` is set to `true`, or if the + * `signal.onabort` method is called, or if it emits an `'abort'` event + * which you can listen to with `addEventListener`, then that means that + * the fetch should be abandoned. This may be passed along to async + * functions aware of AbortController/AbortSignal behavior. + * + * The `fetchMethod` should **only** return `undefined` or a Promise + * resolving to `undefined` if the AbortController signaled an `abort` + * event. In all other cases, it should return or resolve to a value + * suitable for adding to the cache. + * + * The `options` object is a union of the options that may be provided to + * `set()` and `get()`. If they are modified, then that will result in + * modifying the settings to `cache.set()` when the value is resolved, and + * in the case of + * {@link OptionsBase.noDeleteOnFetchRejection} and + * {@link OptionsBase.allowStaleOnFetchRejection}, the handling of + * `fetchMethod` failures. + * + * For example, a DNS cache may update the TTL based on the value returned + * from a remote DNS server by changing `options.ttl` in the `fetchMethod`. + */ + fetchMethod?: Fetcher; + /** + * Method that provides the implementation for {@link LRUCache#memo} + */ + memoMethod?: Memoizer; + /** + * Set to true to suppress the deletion of stale data when a + * {@link OptionsBase.fetchMethod} returns a rejected promise. + */ + noDeleteOnFetchRejection?: boolean; + /** + * Do not delete stale items when they are retrieved with + * {@link LRUCache#get}. + * + * Note that the `get` return value will still be `undefined` + * unless {@link OptionsBase.allowStale} is true. + * + * When using time-expiring entries with `ttl`, by default stale + * items will be removed from the cache when the key is accessed + * with `cache.get()`. + * + * Setting this option will cause stale items to remain in the cache, until + * they are explicitly deleted with `cache.delete(key)`, or retrieved with + * `noDeleteOnStaleGet` set to `false`. + * + * This may be overridden by passing an options object to `cache.get()`. + * + * Only relevant if a ttl is used. + */ + noDeleteOnStaleGet?: boolean; + /** + * Set to true to allow returning stale data when a + * {@link OptionsBase.fetchMethod} throws an error or returns a rejected + * promise. + * + * This differs from using {@link OptionsBase.allowStale} in that stale + * data will ONLY be returned in the case that the {@link LRUCache#fetch} + * fails, not any other times. + * + * If a `fetchMethod` fails, and there is no stale value available, the + * `fetch()` will resolve to `undefined`. Ie, all `fetchMethod` errors are + * suppressed. + * + * Implies `noDeleteOnFetchRejection`. + * + * This may be set in calls to `fetch()`, or defaulted on the constructor, + * or overridden by modifying the options object in the `fetchMethod`. + */ + allowStaleOnFetchRejection?: boolean; + /** + * Set to true to return a stale value from the cache when the + * `AbortSignal` passed to the {@link OptionsBase.fetchMethod} dispatches + * an `'abort'` event, whether user-triggered, or due to internal cache + * behavior. + * + * Unless {@link OptionsBase.ignoreFetchAbort} is also set, the underlying + * {@link OptionsBase.fetchMethod} will still be considered canceled, and + * any value it returns will be ignored and not cached. + * + * Caveat: since fetches are aborted when a new value is explicitly + * set in the cache, this can lead to fetch returning a stale value, + * since that was the fallback value _at the moment the `fetch()` was + * initiated_, even though the new updated value is now present in + * the cache. + * + * For example: + * + * ```ts + * const cache = new LRUCache({ + * ttl: 100, + * fetchMethod: async (url, oldValue, { signal }) => { + * const res = await fetch(url, { signal }) + * return await res.json() + * } + * }) + * cache.set('https://example.com/', { some: 'data' }) + * // 100ms go by... + * const result = cache.fetch('https://example.com/') + * cache.set('https://example.com/', { other: 'thing' }) + * console.log(await result) // { some: 'data' } + * console.log(cache.get('https://example.com/')) // { other: 'thing' } + * ``` + */ + allowStaleOnFetchAbort?: boolean; + /** + * Set to true to ignore the `abort` event emitted by the `AbortSignal` + * object passed to {@link OptionsBase.fetchMethod}, and still cache the + * resulting resolution value, as long as it is not `undefined`. + * + * When used on its own, this means aborted {@link LRUCache#fetch} calls + * are not immediately resolved or rejected when they are aborted, and + * instead take the full time to await. + * + * When used with {@link OptionsBase.allowStaleOnFetchAbort}, aborted + * {@link LRUCache#fetch} calls will resolve immediately to their stale + * cached value or `undefined`, and will continue to process and eventually + * update the cache when they resolve, as long as the resulting value is + * not `undefined`, thus supporting a "return stale on timeout while + * refreshing" mechanism by passing `AbortSignal.timeout(n)` as the signal. + * + * For example: + * + * ```ts + * const c = new LRUCache({ + * ttl: 100, + * ignoreFetchAbort: true, + * allowStaleOnFetchAbort: true, + * fetchMethod: async (key, oldValue, { signal }) => { + * // note: do NOT pass the signal to fetch()! + * // let's say this fetch can take a long time. + * const res = await fetch(`https://slow-backend-server/${key}`) + * return await res.json() + * }, + * }) + * + * // this will return the stale value after 100ms, while still + * // updating in the background for next time. + * const val = await c.fetch('key', { signal: AbortSignal.timeout(100) }) + * ``` + * + * **Note**: regardless of this setting, an `abort` event _is still + * emitted on the `AbortSignal` object_, so may result in invalid results + * when passed to other underlying APIs that use AbortSignals. + * + * This may be overridden in the {@link OptionsBase.fetchMethod} or the + * call to {@link LRUCache#fetch}. + */ + ignoreFetchAbort?: boolean; + /** + * In some cases, you may want to swap out the performance/Date object + * used for TTL tracking. This should almost certainly NOT be done in + * production environments! + * + * This value defaults to `global.performance` if it has a `now()` method, + * or the `global.Date` object otherwise. + */ + perf?: Perf; + } + interface OptionsMaxLimit extends OptionsBase { + max: Count; + } + interface OptionsTTLLimit extends OptionsBase { + ttl: Milliseconds; + ttlAutopurge: boolean; + } + interface OptionsSizeLimit extends OptionsBase { + maxSize: Size; + } + /** + * The valid safe options for the {@link LRUCache} constructor + */ + type Options = OptionsMaxLimit | OptionsSizeLimit | OptionsTTLLimit; + /** + * Entry objects used by {@link LRUCache#load} and {@link LRUCache#dump}, + * and returned by {@link LRUCache#info}. + */ + interface Entry { + value: V; + ttl?: Milliseconds; + size?: Size; + start?: Milliseconds; + } +} +/** + * Default export, the thing you're using this module to get. + * + * The `K` and `V` types define the key and value types, respectively. The + * optional `FC` type defines the type of the `context` object passed to + * `cache.fetch()` and `cache.memo()`. + * + * Keys and values **must not** be `null` or `undefined`. + * + * All properties from the options object (with the exception of `max`, + * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are + * added as normal public members. (The listed options are read-only getters.) + * + * Changing any of these will alter the defaults for subsequent method calls. + */ +export declare class LRUCache { + #private; + /** + * {@link LRUCache.OptionsBase.perf} + */ + get perf(): Perf; + /** + * {@link LRUCache.OptionsBase.ttl} + */ + ttl: LRUCache.Milliseconds; + /** + * {@link LRUCache.OptionsBase.ttlResolution} + */ + ttlResolution: LRUCache.Milliseconds; + /** + * {@link LRUCache.OptionsBase.ttlAutopurge} + */ + ttlAutopurge: boolean; + /** + * {@link LRUCache.OptionsBase.updateAgeOnGet} + */ + updateAgeOnGet: boolean; + /** + * {@link LRUCache.OptionsBase.updateAgeOnHas} + */ + updateAgeOnHas: boolean; + /** + * {@link LRUCache.OptionsBase.allowStale} + */ + allowStale: boolean; + /** + * {@link LRUCache.OptionsBase.noDisposeOnSet} + */ + noDisposeOnSet: boolean; + /** + * {@link LRUCache.OptionsBase.noUpdateTTL} + */ + noUpdateTTL: boolean; + /** + * {@link LRUCache.OptionsBase.maxEntrySize} + */ + maxEntrySize: LRUCache.Size; + /** + * {@link LRUCache.OptionsBase.sizeCalculation} + */ + sizeCalculation?: LRUCache.SizeCalculator; + /** + * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection} + */ + noDeleteOnFetchRejection: boolean; + /** + * {@link LRUCache.OptionsBase.noDeleteOnStaleGet} + */ + noDeleteOnStaleGet: boolean; + /** + * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort} + */ + allowStaleOnFetchAbort: boolean; + /** + * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} + */ + allowStaleOnFetchRejection: boolean; + /** + * {@link LRUCache.OptionsBase.ignoreFetchAbort} + */ + ignoreFetchAbort: boolean; + /** {@link LRUCache.OptionsBase.backgroundFetchSize} */ + backgroundFetchSize: number; + /** + * Do not call this method unless you need to inspect the + * inner workings of the cache. If anything returned by this + * object is modified in any way, strange breakage may occur. + * + * These fields are private for a reason! + * + * @internal + */ + static unsafeExposeInternals(c: LRUCache): { + starts: ZeroArray | undefined; + ttls: ZeroArray | undefined; + autopurgeTimers: (NodeJS.Timeout | undefined)[] | undefined; + sizes: ZeroArray | undefined; + keyMap: Map; + keyList: (K | undefined)[]; + valList: (V | BackgroundFetch | undefined)[]; + next: NumberArray; + prev: NumberArray; + readonly head: Index; + readonly tail: Index; + free: StackLike; + isBackgroundFetch: (p: unknown) => p is BackgroundFetch; + backgroundFetch: (k: K, index: number | undefined, options: LRUCache.FetchOptions, context: unknown) => BackgroundFetch; + moveToTail: (index: number) => void; + indexes: (options?: { + allowStale: boolean; + }) => Generator; + rindexes: (options?: { + allowStale: boolean; + }) => Generator; + isStale: (index: number | undefined) => boolean; + }; + /** + * {@link LRUCache.OptionsBase.max} (read-only) + */ + get max(): LRUCache.Count; + /** + * {@link LRUCache.OptionsBase.maxSize} (read-only) + */ + get maxSize(): LRUCache.Count; + /** + * The total computed size of items in the cache (read-only) + */ + get calculatedSize(): LRUCache.Size; + /** + * The number of items stored in the cache (read-only) + */ + get size(): LRUCache.Count; + /** + * {@link LRUCache.OptionsBase.fetchMethod} (read-only) + */ + get fetchMethod(): LRUCache.Fetcher | undefined; + get memoMethod(): LRUCache.Memoizer | undefined; + /** + * {@link LRUCache.OptionsBase.dispose} (read-only) + */ + get dispose(): LRUCache.Disposer | undefined; + /** + * {@link LRUCache.OptionsBase.onInsert} (read-only) + */ + get onInsert(): LRUCache.Inserter | undefined; + /** + * {@link LRUCache.OptionsBase.disposeAfter} (read-only) + */ + get disposeAfter(): LRUCache.Disposer | undefined; + constructor(options: LRUCache.Options | LRUCache); + /** + * Return the number of ms left in the item's TTL. If item is not in cache, + * returns `0`. Returns `Infinity` if item is in cache without a defined TTL. + */ + getRemainingTTL(key: K): number; + /** + * Return a generator yielding `[key, value]` pairs, + * in order from most recently used to least recently used. + */ + entries(): Generator<[K, V], void, unknown>; + /** + * Inverse order version of {@link LRUCache.entries} + * + * Return a generator yielding `[key, value]` pairs, + * in order from least recently used to most recently used. + */ + rentries(): Generator<(K | V)[], void, unknown>; + /** + * Return a generator yielding the keys in the cache, + * in order from most recently used to least recently used. + */ + keys(): Generator; + /** + * Inverse order version of {@link LRUCache.keys} + * + * Return a generator yielding the keys in the cache, + * in order from least recently used to most recently used. + */ + rkeys(): Generator; + /** + * Return a generator yielding the values in the cache, + * in order from most recently used to least recently used. + */ + values(): Generator; + /** + * Inverse order version of {@link LRUCache.values} + * + * Return a generator yielding the values in the cache, + * in order from least recently used to most recently used. + */ + rvalues(): Generator; + /** + * Iterating over the cache itself yields the same results as + * {@link LRUCache.entries} + */ + [Symbol.iterator](): Generator<[K, V], void, unknown>; + /** + * A String value that is used in the creation of the default string + * description of an object. Called by the built-in method + * `Object.prototype.toString`. + */ + [Symbol.toStringTag]: string; + /** + * Find a value for which the supplied fn method returns a truthy value, + * similar to `Array.find()`. fn is called as `fn(value, key, cache)`. + */ + find(fn: (v: V, k: K, self: LRUCache) => boolean, getOptions?: LRUCache.GetOptions): V | undefined; + /** + * Call the supplied function on each item in the cache, in order from most + * recently used to least recently used. + * + * `fn` is called as `fn(value, key, cache)`. + * + * If `thisp` is provided, function will be called in the `this`-context of + * the provided object, or the cache if no `thisp` object is provided. + * + * Does not update age or recenty of use, or iterate over stale values. + */ + forEach(fn: (v: V, k: K, self: LRUCache) => unknown, thisp?: unknown): void; + /** + * The same as {@link LRUCache.forEach} but items are iterated over in + * reverse order. (ie, less recently used items are iterated over first.) + */ + rforEach(fn: (v: V, k: K, self: LRUCache) => unknown, thisp?: unknown): void; + /** + * Delete any stale entries. Returns true if anything was removed, + * false otherwise. + */ + purgeStale(): boolean; + /** + * Get the extended info about a given entry, to get its value, size, and + * TTL info simultaneously. Returns `undefined` if the key is not present. + * + * Unlike {@link LRUCache#dump}, which is designed to be portable and survive + * serialization, the `start` value is always the current timestamp, and the + * `ttl` is a calculated remaining time to live (negative if expired). + * + * Always returns stale values, if their info is found in the cache, so be + * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl}) + * if relevant. + */ + info(key: K): LRUCache.Entry | undefined; + /** + * Return an array of [key, {@link LRUCache.Entry}] tuples which can be + * passed to {@link LRUCache#load}. + * + * The `start` fields are calculated relative to a portable `Date.now()` + * timestamp, even if `performance.now()` is available. + * + * Stale entries are always included in the `dump`, even if + * {@link LRUCache.OptionsBase.allowStale} is false. + * + * Note: this returns an actual array, not a generator, so it can be more + * easily passed around. + */ + dump(): [K, LRUCache.Entry][]; + /** + * Reset the cache and load in the items in entries in the order listed. + * + * The shape of the resulting cache may be different if the same options are + * not used in both caches. + * + * The `start` fields are assumed to be calculated relative to a portable + * `Date.now()` timestamp, even if `performance.now()` is available. + */ + load(arr: [K, LRUCache.Entry][]): void; + /** + * Add a value to the cache. + * + * Note: if `undefined` is specified as a value, this is an alias for + * {@link LRUCache#delete} + * + * Fields on the {@link LRUCache.SetOptions} options param will override + * their corresponding values in the constructor options for the scope + * of this single `set()` operation. + * + * If `start` is provided, then that will set the effective start + * time for the TTL calculation. Note that this must be a previous + * value of `performance.now()` if supported, or a previous value of + * `Date.now()` if not. + * + * Options object may also include `size`, which will prevent + * calling the `sizeCalculation` function and just use the specified + * number if it is a positive integer, and `noDisposeOnSet` which + * will prevent calling a `dispose` function in the case of + * overwrites. + * + * If the `size` (or return value of `sizeCalculation`) for a given + * entry is greater than `maxEntrySize`, then the item will not be + * added to the cache. + * + * Will update the recency of the entry. + * + * If the value is `undefined`, then this is an alias for + * `cache.delete(key)`. `undefined` is never stored in the cache. + */ + set(k: K, v: V | undefined, setOptions?: LRUCache.SetOptions): this; + /** + * Evict the least recently used item, returning its value or + * `undefined` if cache is empty. + */ + pop(): V | undefined; + /** + * Check if a key is in the cache, without updating the recency of use. + * Will return false if the item is stale, even though it is technically + * in the cache. + * + * Check if a key is in the cache, without updating the recency of + * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set + * to `true` in either the options or the constructor. + * + * Will return `false` if the item is stale, even though it is technically in + * the cache. The difference can be determined (if it matters) by using a + * `status` argument, and inspecting the `has` field. + * + * Will not update item age unless + * {@link LRUCache.OptionsBase.updateAgeOnHas} is set. + */ + has(k: K, hasOptions?: LRUCache.HasOptions): boolean; + /** + * Like {@link LRUCache#get} but doesn't update recency or delete stale + * items. + * + * Returns `undefined` if the item is stale, unless + * {@link LRUCache.OptionsBase.allowStale} is set. + */ + peek(k: K, peekOptions?: LRUCache.PeekOptions): V | undefined; + /** + * Make an asynchronous cached fetch using the + * {@link LRUCache.OptionsBase.fetchMethod} function. + * + * If the value is in the cache and not stale, then the returned + * Promise resolves to the value. + * + * If not in the cache, or beyond its TTL staleness, then + * `fetchMethod(key, staleValue, { options, signal, context })` is + * called, and the value returned will be added to the cache once + * resolved. + * + * If called with `allowStale`, and an asynchronous fetch is + * currently in progress to reload a stale value, then the former + * stale value will be returned. + * + * If called with `forceRefresh`, then the cached item will be + * re-fetched, even if it is not stale. However, if `allowStale` is also + * set, then the old value will still be returned. This is useful + * in cases where you want to force a reload of a cached value. If + * a background fetch is already in progress, then `forceRefresh` + * has no effect. + * + * If multiple fetches for the same key are issued, then they will all be + * coalesced into a single call to fetchMethod. + * + * Note that this means that handling options such as + * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}, + * {@link LRUCache.FetchOptions.signal}, + * and {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} will be + * determined by the FIRST fetch() call for a given key. + * + * This is a known (fixable) shortcoming which will be addresed on when + * someone complains about it, as the fix would involve added complexity and + * may not be worth the costs for this edge case. + * + * If {@link LRUCache.OptionsBase.fetchMethod} is not specified, then this is + * effectively an alias for `Promise.resolve(cache.get(key))`. + * + * When the fetch method resolves to a value, if the fetch has not + * been aborted due to deletion, eviction, or being overwritten, + * then it is added to the cache using the options provided. + * + * If the key is evicted or deleted before the `fetchMethod` + * resolves, then the AbortSignal passed to the `fetchMethod` will + * receive an `abort` event, and the promise returned by `fetch()` + * will reject with the reason for the abort. + * + * If a `signal` is passed to the `fetch()` call, then aborting the + * signal will abort the fetch and cause the `fetch()` promise to + * reject with the reason provided. + * + * **Setting `context`** + * + * If an `FC` type is set to a type other than `unknown`, `void`, or + * `undefined` in the {@link LRUCache} constructor, then all + * calls to `cache.fetch()` _must_ provide a `context` option. If + * set to `undefined` or `void`, then calls to fetch _must not_ + * provide a `context` option. + * + * The `context` param allows you to provide arbitrary data that + * might be relevant in the course of fetching the data. It is only + * relevant for the course of a single `fetch()` operation, and + * discarded afterwards. + * + * **Note: `fetch()` calls are inflight-unique** + * + * If you call `fetch()` multiple times with the same key value, + * then every call after the first will resolve on the same + * promise1, + * _even if they have different settings that would otherwise change + * the behavior of the fetch_, such as `noDeleteOnFetchRejection` + * or `ignoreFetchAbort`. + * + * In most cases, this is not a problem (in fact, only fetching + * something once is what you probably want, if you're caching in + * the first place). If you are changing the fetch() options + * dramatically between runs, there's a good chance that you might + * be trying to fit divergent semantics into a single object, and + * would be better off with multiple cache instances. + * + * **1**: Ie, they're not the "same Promise", but they resolve at + * the same time, because they're both waiting on the same + * underlying fetchMethod response. + */ + fetch(k: K, fetchOptions: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : LRUCache.FetchOptionsWithContext): Promise; + fetch(k: unknown extends FC ? K : FC extends undefined | void ? K : never, fetchOptions?: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : never): Promise; + /** + * In some cases, `cache.fetch()` may resolve to `undefined`, either because + * a {@link LRUCache.OptionsBase#fetchMethod} was not provided (turning + * `cache.fetch(k)` into just an async wrapper around `cache.get(k)`) or + * because `ignoreFetchAbort` was specified (either to the constructor or + * in the {@link LRUCache.FetchOptions}). Also, the + * {@link LRUCache.OptionsBase.fetchMethod} may return `undefined` or `void`, making + * the test even more complicated. + * + * Because inferring the cases where `undefined` might be returned are so + * cumbersome, but testing for `undefined` can also be annoying, this method + * can be used, which will reject if `this.fetch()` resolves to undefined. + */ + forceFetch(k: K, fetchOptions: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : LRUCache.FetchOptionsWithContext): Promise; + forceFetch(k: unknown extends FC ? K : FC extends undefined | void ? K : never, fetchOptions?: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : never): Promise; + /** + * If the key is found in the cache, then this is equivalent to + * {@link LRUCache#get}. If not, in the cache, then calculate the value using + * the {@link LRUCache.OptionsBase.memoMethod}, and add it to the cache. + * + * If an `FC` type is set to a type other than `unknown`, `void`, or + * `undefined` in the LRUCache constructor, then all calls to `cache.memo()` + * _must_ provide a `context` option. If set to `undefined` or `void`, then + * calls to memo _must not_ provide a `context` option. + * + * The `context` param allows you to provide arbitrary data that might be + * relevant in the course of fetching the data. It is only relevant for the + * course of a single `memo()` operation, and discarded afterwards. + */ + memo(k: K, memoOptions: unknown extends FC ? LRUCache.MemoOptions : FC extends undefined | void ? LRUCache.MemoOptionsNoContext : LRUCache.MemoOptionsWithContext): V; + memo(k: unknown extends FC ? K : FC extends undefined | void ? K : never, memoOptions?: unknown extends FC ? LRUCache.MemoOptions : FC extends undefined | void ? LRUCache.MemoOptionsNoContext : never): V; + /** + * Return a value from the cache. Will update the recency of the cache + * entry found. + * + * If the key is not found, get() will return `undefined`. + */ + get(k: K, getOptions?: LRUCache.GetOptions): V | undefined; + /** + * Deletes a key out of the cache. + * + * Returns true if the key was deleted, false otherwise. + */ + delete(k: K): boolean; + /** + * Clear the cache entirely, throwing away all values. + */ + clear(): void; +} +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/node/index.d.ts.map b/node_modules/lru-cache/dist/esm/node/index.d.ts.map new file mode 100644 index 00000000..fa98a0f5 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/node/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/node/index.js b/node_modules/lru-cache/dist/esm/node/index.js new file mode 100644 index 00000000..2dd10cf8 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/node/index.js @@ -0,0 +1,1722 @@ +/** + * @module LRUCache + */ +import { metrics, tracing } from './diagnostics-channel.js'; +import { defaultPerf } from './perf.js'; +const hasSubscribers = () => metrics.hasSubscribers || tracing.hasSubscribers; +const warned = new Set(); +/* c8 ignore start */ +const PROCESS = (typeof process === 'object' && !!process ? + process + : {}); +/* c8 ignore stop */ +const emitWarning = (msg, type, code, fn) => { + if (typeof PROCESS.emitWarning === 'function') { + PROCESS.emitWarning(msg, type, code, fn); + } + else { + //oxlint-disable-next-line no-console + console.error(`[${code}] ${type}: ${msg}`); + } +}; +const shouldWarn = (code) => !warned.has(code); +const TYPE = Symbol('type'); +const isPosInt = (n) => !!n && n === Math.floor(n) && n > 0 && isFinite(n); +// This is a little bit ridiculous, tbh. +// The maximum array length is 2^32-1 or thereabouts on most JS impls. +// And well before that point, you're caching the entire world, I mean, +// that's ~32GB of just integers for the next/prev links, plus whatever +// else to hold that many keys and values. Just filling the memory with +// zeroes at init time is brutal when you get that big. +// But why not be complete? +// Maybe in the future, these limits will have expanded. +/* c8 ignore start */ +const getUintArray = (max) => !isPosInt(max) ? null + : max <= Math.pow(2, 8) ? Uint8Array + : max <= Math.pow(2, 16) ? Uint16Array + : max <= Math.pow(2, 32) ? Uint32Array + : max <= Number.MAX_SAFE_INTEGER ? ZeroArray + : null; +/* c8 ignore stop */ +class ZeroArray extends Array { + constructor(size) { + super(size); + this.fill(0); + } +} +class Stack { + /* c8 ignore start - not sure why this is showing up uncovered?? */ + heap; + /* c8 ignore stop */ + length; + // private constructor + static #constructing = false; + static create(max) { + const HeapCls = getUintArray(max); + if (!HeapCls) + return []; + Stack.#constructing = true; + const s = new Stack(max, HeapCls); + Stack.#constructing = false; + return s; + } + constructor(max, HeapCls) { + /* c8 ignore start */ + if (!Stack.#constructing) { + throw new TypeError('instantiate Stack using Stack.create(n)'); + } + /* c8 ignore stop */ + this.heap = new HeapCls(max); + this.length = 0; + } + push(n) { + this.heap[this.length++] = n; + } + pop() { + return this.heap[--this.length]; + } +} +/** + * Default export, the thing you're using this module to get. + * + * The `K` and `V` types define the key and value types, respectively. The + * optional `FC` type defines the type of the `context` object passed to + * `cache.fetch()` and `cache.memo()`. + * + * Keys and values **must not** be `null` or `undefined`. + * + * All properties from the options object (with the exception of `max`, + * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are + * added as normal public members. (The listed options are read-only getters.) + * + * Changing any of these will alter the defaults for subsequent method calls. + */ +export class LRUCache { + // options that cannot be changed without disaster + #max; + #maxSize; + #dispose; + #onInsert; + #disposeAfter; + #fetchMethod; + #memoMethod; + #perf; + /** + * {@link LRUCache.OptionsBase.perf} + */ + get perf() { + return this.#perf; + } + /** + * {@link LRUCache.OptionsBase.ttl} + */ + ttl; + /** + * {@link LRUCache.OptionsBase.ttlResolution} + */ + ttlResolution; + /** + * {@link LRUCache.OptionsBase.ttlAutopurge} + */ + ttlAutopurge; + /** + * {@link LRUCache.OptionsBase.updateAgeOnGet} + */ + updateAgeOnGet; + /** + * {@link LRUCache.OptionsBase.updateAgeOnHas} + */ + updateAgeOnHas; + /** + * {@link LRUCache.OptionsBase.allowStale} + */ + allowStale; + /** + * {@link LRUCache.OptionsBase.noDisposeOnSet} + */ + noDisposeOnSet; + /** + * {@link LRUCache.OptionsBase.noUpdateTTL} + */ + noUpdateTTL; + /** + * {@link LRUCache.OptionsBase.maxEntrySize} + */ + maxEntrySize; + /** + * {@link LRUCache.OptionsBase.sizeCalculation} + */ + sizeCalculation; + /** + * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection} + */ + noDeleteOnFetchRejection; + /** + * {@link LRUCache.OptionsBase.noDeleteOnStaleGet} + */ + noDeleteOnStaleGet; + /** + * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort} + */ + allowStaleOnFetchAbort; + /** + * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} + */ + allowStaleOnFetchRejection; + /** + * {@link LRUCache.OptionsBase.ignoreFetchAbort} + */ + ignoreFetchAbort; + /** {@link LRUCache.OptionsBase.backgroundFetchSize} */ + backgroundFetchSize; + // computed properties + #size; + #calculatedSize; + #keyMap; + #keyList; + #valList; + #next; + #prev; + #head; + #tail; + #free; + #disposed; + #sizes; + #starts; + #ttls; + #autopurgeTimers; + #hasDispose; + #hasFetchMethod; + #hasDisposeAfter; + #hasOnInsert; + /** + * Do not call this method unless you need to inspect the + * inner workings of the cache. If anything returned by this + * object is modified in any way, strange breakage may occur. + * + * These fields are private for a reason! + * + * @internal + */ + static unsafeExposeInternals(c) { + return { + // properties + starts: c.#starts, + ttls: c.#ttls, + autopurgeTimers: c.#autopurgeTimers, + sizes: c.#sizes, + keyMap: c.#keyMap, + keyList: c.#keyList, + valList: c.#valList, + next: c.#next, + prev: c.#prev, + get head() { + return c.#head; + }, + get tail() { + return c.#tail; + }, + free: c.#free, + // methods + isBackgroundFetch: (p) => c.#isBackgroundFetch(p), + backgroundFetch: (k, index, options, context) => c.#backgroundFetch(k, index, options, context), + moveToTail: (index) => c.#moveToTail(index), + indexes: (options) => c.#indexes(options), + rindexes: (options) => c.#rindexes(options), + isStale: (index) => c.#isStale(index), + }; + } + // Protected read-only members + /** + * {@link LRUCache.OptionsBase.max} (read-only) + */ + get max() { + return this.#max; + } + /** + * {@link LRUCache.OptionsBase.maxSize} (read-only) + */ + get maxSize() { + return this.#maxSize; + } + /** + * The total computed size of items in the cache (read-only) + */ + get calculatedSize() { + return this.#calculatedSize; + } + /** + * The number of items stored in the cache (read-only) + */ + get size() { + return this.#size; + } + /** + * {@link LRUCache.OptionsBase.fetchMethod} (read-only) + */ + get fetchMethod() { + return this.#fetchMethod; + } + get memoMethod() { + return this.#memoMethod; + } + /** + * {@link LRUCache.OptionsBase.dispose} (read-only) + */ + get dispose() { + return this.#dispose; + } + /** + * {@link LRUCache.OptionsBase.onInsert} (read-only) + */ + get onInsert() { + return this.#onInsert; + } + /** + * {@link LRUCache.OptionsBase.disposeAfter} (read-only) + */ + get disposeAfter() { + return this.#disposeAfter; + } + constructor(options) { + const { max = 0, ttl, ttlResolution = 1, ttlAutopurge, updateAgeOnGet, updateAgeOnHas, allowStale, dispose, onInsert, disposeAfter, noDisposeOnSet, noUpdateTTL, maxSize = 0, maxEntrySize = 0, sizeCalculation, fetchMethod, memoMethod, noDeleteOnFetchRejection, noDeleteOnStaleGet, allowStaleOnFetchRejection, allowStaleOnFetchAbort, ignoreFetchAbort, backgroundFetchSize = 1, perf, } = options; + this.backgroundFetchSize = backgroundFetchSize; + if (perf !== undefined) { + if (typeof perf?.now !== 'function') { + throw new TypeError('perf option must have a now() method if specified'); + } + } + this.#perf = perf ?? defaultPerf; + if (max !== 0 && !isPosInt(max)) { + throw new TypeError('max option must be a nonnegative integer'); + } + const UintArray = max ? getUintArray(max) : Array; + if (!UintArray) { + throw new Error('invalid max value: ' + max); + } + this.#max = max; + this.#maxSize = maxSize; + this.maxEntrySize = maxEntrySize || this.#maxSize; + this.sizeCalculation = sizeCalculation; + if (this.sizeCalculation) { + if (!this.#maxSize && !this.maxEntrySize) { + throw new TypeError('cannot set sizeCalculation without setting maxSize or maxEntrySize'); + } + if (typeof this.sizeCalculation !== 'function') { + throw new TypeError('sizeCalculation set to non-function'); + } + } + if (memoMethod !== undefined && typeof memoMethod !== 'function') { + throw new TypeError('memoMethod must be a function if defined'); + } + this.#memoMethod = memoMethod; + if (fetchMethod !== undefined && typeof fetchMethod !== 'function') { + throw new TypeError('fetchMethod must be a function if specified'); + } + this.#fetchMethod = fetchMethod; + this.#hasFetchMethod = !!fetchMethod; + this.#keyMap = new Map(); + this.#keyList = Array.from({ length: max }).fill(undefined); + this.#valList = Array.from({ length: max }).fill(undefined); + this.#next = new UintArray(max); + this.#prev = new UintArray(max); + this.#head = 0; + this.#tail = 0; + this.#free = Stack.create(max); + this.#size = 0; + this.#calculatedSize = 0; + if (typeof dispose === 'function') { + this.#dispose = dispose; + } + if (typeof onInsert === 'function') { + this.#onInsert = onInsert; + } + if (typeof disposeAfter === 'function') { + this.#disposeAfter = disposeAfter; + this.#disposed = []; + } + else { + this.#disposeAfter = undefined; + this.#disposed = undefined; + } + this.#hasDispose = !!this.#dispose; + this.#hasOnInsert = !!this.#onInsert; + this.#hasDisposeAfter = !!this.#disposeAfter; + this.noDisposeOnSet = !!noDisposeOnSet; + this.noUpdateTTL = !!noUpdateTTL; + this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection; + this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection; + this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort; + this.ignoreFetchAbort = !!ignoreFetchAbort; + // NB: maxEntrySize is set to maxSize if it's set + if (this.maxEntrySize !== 0) { + if (this.#maxSize !== 0) { + if (!isPosInt(this.#maxSize)) { + throw new TypeError('maxSize must be a positive integer if specified'); + } + } + if (!isPosInt(this.maxEntrySize)) { + throw new TypeError('maxEntrySize must be a positive integer if specified'); + } + this.#initializeSizeTracking(); + } + this.allowStale = !!allowStale; + this.noDeleteOnStaleGet = !!noDeleteOnStaleGet; + this.updateAgeOnGet = !!updateAgeOnGet; + this.updateAgeOnHas = !!updateAgeOnHas; + this.ttlResolution = + isPosInt(ttlResolution) || ttlResolution === 0 ? ttlResolution : 1; + this.ttlAutopurge = !!ttlAutopurge; + this.ttl = ttl || 0; + if (this.ttl) { + if (!isPosInt(this.ttl)) { + throw new TypeError('ttl must be a positive integer if specified'); + } + this.#initializeTTLTracking(); + } + // do not allow completely unbounded caches + if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) { + throw new TypeError('At least one of max, maxSize, or ttl is required'); + } + if (!this.ttlAutopurge && !this.#max && !this.#maxSize) { + const code = 'LRU_CACHE_UNBOUNDED'; + if (shouldWarn(code)) { + warned.add(code); + const msg = 'TTL caching without ttlAutopurge, max, or maxSize can ' + + 'result in unbounded memory consumption.'; + emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache); + } + } + } + /** + * Return the number of ms left in the item's TTL. If item is not in cache, + * returns `0`. Returns `Infinity` if item is in cache without a defined TTL. + */ + getRemainingTTL(key) { + return this.#keyMap.has(key) ? Infinity : 0; + } + #initializeTTLTracking() { + const ttls = new ZeroArray(this.#max); + const starts = new ZeroArray(this.#max); + this.#ttls = ttls; + this.#starts = starts; + const purgeTimers = this.ttlAutopurge ? + Array.from({ + length: this.#max, + }) + : undefined; + this.#autopurgeTimers = purgeTimers; + this.#setItemTTL = (index, ttl, start = this.#perf.now()) => { + starts[index] = ttl !== 0 ? start : 0; + ttls[index] = ttl; + setPurgetTimer(index, ttl); + }; + this.#updateItemAge = index => { + starts[index] = ttls[index] !== 0 ? this.#perf.now() : 0; + setPurgetTimer(index, ttls[index]); + }; + // clear out the purge timer if we're setting TTL to 0, and + // previously had a ttl purge timer running, so it doesn't + // fire unnecessarily. Don't need to do this if we're not doing + // autopurge. + const setPurgetTimer = !this.ttlAutopurge ? + () => { } + : (index, ttl) => { + if (purgeTimers?.[index]) { + clearTimeout(purgeTimers[index]); + purgeTimers[index] = undefined; + } + if (ttl && ttl !== 0 && purgeTimers) { + const t = setTimeout(() => { + if (this.#isStale(index)) { + this.#delete(this.#keyList[index], 'expire'); + } + }, ttl + 1); + // unref() not supported on all platforms + /* c8 ignore start */ + if (t.unref) { + t.unref(); + } + /* c8 ignore stop */ + purgeTimers[index] = t; + } + }; + this.#statusTTL = (status, index) => { + if (ttls[index]) { + const ttl = ttls[index]; + const start = starts[index]; + /* c8 ignore start */ + if (!ttl || !start) { + return; + } + /* c8 ignore stop */ + status.ttl = ttl; + status.start = start; + status.now = cachedNow || getNow(); + const age = status.now - start; + status.remainingTTL = ttl - age; + } + }; + // debounce calls to perf.now() to 1s so we're not hitting + // that costly call repeatedly. + let cachedNow = 0; + const getNow = () => { + const n = this.#perf.now(); + if (this.ttlResolution > 0) { + cachedNow = n; + const t = setTimeout(() => (cachedNow = 0), this.ttlResolution); + // not available on all platforms + /* c8 ignore start */ + if (t.unref) { + t.unref(); + } + /* c8 ignore stop */ + } + return n; + }; + this.getRemainingTTL = key => { + const index = this.#keyMap.get(key); + if (index === undefined) { + return 0; + } + const ttl = ttls[index]; + const start = starts[index]; + if (!ttl || !start) { + return Infinity; + } + const age = (cachedNow || getNow()) - start; + return ttl - age; + }; + this.#isStale = index => { + const s = starts[index]; + const t = ttls[index]; + return !!t && !!s && (cachedNow || getNow()) - s > t; + }; + } + // conditionally set private methods related to TTL + #updateItemAge = () => { }; + #statusTTL = () => { }; + #setItemTTL = () => { }; + /* c8 ignore stop */ + #isStale = () => false; + #initializeSizeTracking() { + const sizes = new ZeroArray(this.#max); + this.#calculatedSize = 0; + this.#sizes = sizes; + this.#removeItemSize = index => { + this.#calculatedSize -= sizes[index]; + sizes[index] = 0; + }; + this.#requireSize = (k, v, size, sizeCalculation) => { + if (!isPosInt(size)) { + // provisionally accept background fetches. + // actual value size will be checked when they return. + if (this.#isBackgroundFetch(v)) { + // NB: this cannot occur if v.__staleWhileFetching is set, + // because in that case, it would take on the size of the + // existing entry that it temporarily replaces. + return this.backgroundFetchSize; + } + if (sizeCalculation) { + if (typeof sizeCalculation !== 'function') { + throw new TypeError('sizeCalculation must be a function'); + } + size = sizeCalculation(v, k); + if (!isPosInt(size)) { + throw new TypeError('sizeCalculation return invalid (expect positive integer)'); + } + } + else { + throw new TypeError('invalid size value (must be positive integer). ' + + 'When maxSize or maxEntrySize is used, sizeCalculation ' + + 'or size must be set.'); + } + } + return size; + }; + this.#addItemSize = (index, size, status) => { + sizes[index] = size; + if (this.#maxSize) { + const maxSize = this.#maxSize - sizes[index]; + while (this.#calculatedSize > maxSize) { + this.#evict(true); + } + } + this.#calculatedSize += sizes[index]; + if (status) { + status.entrySize = size; + status.totalCalculatedSize = this.#calculatedSize; + } + }; + } + #removeItemSize = _i => { }; + #addItemSize = (_i, _s, _st) => { }; + #requireSize = (_k, _v, size, sizeCalculation) => { + if (size || sizeCalculation) { + throw new TypeError('cannot set size without setting maxSize or maxEntrySize on cache'); + } + return 0; + }; + *#indexes({ allowStale = this.allowStale } = {}) { + if (this.#size) { + for (let i = this.#tail; this.#isValidIndex(i);) { + if (allowStale || !this.#isStale(i)) { + yield i; + } + if (i === this.#head) { + break; + } + else { + i = this.#prev[i]; + } + } + } + } + *#rindexes({ allowStale = this.allowStale } = {}) { + if (this.#size) { + for (let i = this.#head; this.#isValidIndex(i);) { + if (allowStale || !this.#isStale(i)) { + yield i; + } + if (i === this.#tail) { + break; + } + else { + i = this.#next[i]; + } + } + } + } + #isValidIndex(index) { + return (index !== undefined && + this.#keyMap.get(this.#keyList[index]) === index); + } + /** + * Return a generator yielding `[key, value]` pairs, + * in order from most recently used to least recently used. + */ + *entries() { + for (const i of this.#indexes()) { + if (this.#valList[i] !== undefined && + this.#keyList[i] !== undefined && + !this.#isBackgroundFetch(this.#valList[i])) { + yield [this.#keyList[i], this.#valList[i]]; + } + } + } + /** + * Inverse order version of {@link LRUCache.entries} + * + * Return a generator yielding `[key, value]` pairs, + * in order from least recently used to most recently used. + */ + *rentries() { + for (const i of this.#rindexes()) { + if (this.#valList[i] !== undefined && + this.#keyList[i] !== undefined && + !this.#isBackgroundFetch(this.#valList[i])) { + yield [this.#keyList[i], this.#valList[i]]; + } + } + } + /** + * Return a generator yielding the keys in the cache, + * in order from most recently used to least recently used. + */ + *keys() { + for (const i of this.#indexes()) { + const k = this.#keyList[i]; + if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield k; + } + } + } + /** + * Inverse order version of {@link LRUCache.keys} + * + * Return a generator yielding the keys in the cache, + * in order from least recently used to most recently used. + */ + *rkeys() { + for (const i of this.#rindexes()) { + const k = this.#keyList[i]; + if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield k; + } + } + } + /** + * Return a generator yielding the values in the cache, + * in order from most recently used to least recently used. + */ + *values() { + for (const i of this.#indexes()) { + const v = this.#valList[i]; + if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield this.#valList[i]; + } + } + } + /** + * Inverse order version of {@link LRUCache.values} + * + * Return a generator yielding the values in the cache, + * in order from least recently used to most recently used. + */ + *rvalues() { + for (const i of this.#rindexes()) { + const v = this.#valList[i]; + if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield this.#valList[i]; + } + } + } + /** + * Iterating over the cache itself yields the same results as + * {@link LRUCache.entries} + */ + [Symbol.iterator]() { + return this.entries(); + } + /** + * A String value that is used in the creation of the default string + * description of an object. Called by the built-in method + * `Object.prototype.toString`. + */ + [Symbol.toStringTag] = 'LRUCache'; + /** + * Find a value for which the supplied fn method returns a truthy value, + * similar to `Array.find()`. fn is called as `fn(value, key, cache)`. + */ + find(fn, getOptions = {}) { + for (const i of this.#indexes()) { + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined) + continue; + if (fn(value, this.#keyList[i], this)) { + return this.#get(this.#keyList[i], getOptions); + } + } + } + /** + * Call the supplied function on each item in the cache, in order from most + * recently used to least recently used. + * + * `fn` is called as `fn(value, key, cache)`. + * + * If `thisp` is provided, function will be called in the `this`-context of + * the provided object, or the cache if no `thisp` object is provided. + * + * Does not update age or recenty of use, or iterate over stale values. + */ + forEach(fn, thisp = this) { + for (const i of this.#indexes()) { + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined) + continue; + fn.call(thisp, value, this.#keyList[i], this); + } + } + /** + * The same as {@link LRUCache.forEach} but items are iterated over in + * reverse order. (ie, less recently used items are iterated over first.) + */ + rforEach(fn, thisp = this) { + for (const i of this.#rindexes()) { + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined) + continue; + fn.call(thisp, value, this.#keyList[i], this); + } + } + /** + * Delete any stale entries. Returns true if anything was removed, + * false otherwise. + */ + purgeStale() { + let deleted = false; + for (const i of this.#rindexes({ allowStale: true })) { + if (this.#isStale(i)) { + this.#delete(this.#keyList[i], 'expire'); + deleted = true; + } + } + return deleted; + } + /** + * Get the extended info about a given entry, to get its value, size, and + * TTL info simultaneously. Returns `undefined` if the key is not present. + * + * Unlike {@link LRUCache#dump}, which is designed to be portable and survive + * serialization, the `start` value is always the current timestamp, and the + * `ttl` is a calculated remaining time to live (negative if expired). + * + * Always returns stale values, if their info is found in the cache, so be + * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl}) + * if relevant. + */ + info(key) { + const i = this.#keyMap.get(key); + if (i === undefined) + return undefined; + const v = this.#valList[i]; + /* c8 ignore start - this isn't tested for the info function, + * but it's the same logic as found in other places. */ + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined) + return undefined; + /* c8 ignore stop */ + const entry = { value }; + if (this.#ttls && this.#starts) { + const ttl = this.#ttls[i]; + const start = this.#starts[i]; + if (ttl && start) { + const remain = ttl - (this.#perf.now() - start); + entry.ttl = remain; + entry.start = Date.now(); + } + } + if (this.#sizes) { + entry.size = this.#sizes[i]; + } + return entry; + } + /** + * Return an array of [key, {@link LRUCache.Entry}] tuples which can be + * passed to {@link LRUCache#load}. + * + * The `start` fields are calculated relative to a portable `Date.now()` + * timestamp, even if `performance.now()` is available. + * + * Stale entries are always included in the `dump`, even if + * {@link LRUCache.OptionsBase.allowStale} is false. + * + * Note: this returns an actual array, not a generator, so it can be more + * easily passed around. + */ + dump() { + const arr = []; + for (const i of this.#indexes({ allowStale: true })) { + const key = this.#keyList[i]; + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined || key === undefined) + continue; + const entry = { value }; + if (this.#ttls && this.#starts) { + entry.ttl = this.#ttls[i]; + // always dump the start relative to a portable timestamp + // it's ok for this to be a bit slow, it's a rare operation. + const age = this.#perf.now() - this.#starts[i]; + entry.start = Math.floor(Date.now() - age); + } + if (this.#sizes) { + entry.size = this.#sizes[i]; + } + arr.unshift([key, entry]); + } + return arr; + } + /** + * Reset the cache and load in the items in entries in the order listed. + * + * The shape of the resulting cache may be different if the same options are + * not used in both caches. + * + * The `start` fields are assumed to be calculated relative to a portable + * `Date.now()` timestamp, even if `performance.now()` is available. + */ + load(arr) { + this.clear(); + for (const [key, entry] of arr) { + if (entry.start) { + // entry.start is a portable timestamp, but we may be using + // node's performance.now(), so calculate the offset, so that + // we get the intended remaining TTL, no matter how long it's + // been on ice. + // + // it's ok for this to be a bit slow, it's a rare operation. + const age = Date.now() - entry.start; + entry.start = this.#perf.now() - age; + } + this.#set(key, entry.value, entry); + } + } + /** + * Add a value to the cache. + * + * Note: if `undefined` is specified as a value, this is an alias for + * {@link LRUCache#delete} + * + * Fields on the {@link LRUCache.SetOptions} options param will override + * their corresponding values in the constructor options for the scope + * of this single `set()` operation. + * + * If `start` is provided, then that will set the effective start + * time for the TTL calculation. Note that this must be a previous + * value of `performance.now()` if supported, or a previous value of + * `Date.now()` if not. + * + * Options object may also include `size`, which will prevent + * calling the `sizeCalculation` function and just use the specified + * number if it is a positive integer, and `noDisposeOnSet` which + * will prevent calling a `dispose` function in the case of + * overwrites. + * + * If the `size` (or return value of `sizeCalculation`) for a given + * entry is greater than `maxEntrySize`, then the item will not be + * added to the cache. + * + * Will update the recency of the entry. + * + * If the value is `undefined`, then this is an alias for + * `cache.delete(key)`. `undefined` is never stored in the cache. + */ + set(k, v, setOptions = {}) { + const { status = metrics.hasSubscribers ? {} : undefined } = setOptions; + setOptions.status = status; + if (status) { + status.op = 'set'; + status.key = k; + if (v !== undefined) + status.value = v; + status.cache = this; + } + const result = this.#set(k, v, setOptions); + if (status && metrics.hasSubscribers) { + metrics.publish(status); + } + return result; + } + #set(k, v, setOptions, bf) { + const { ttl = this.ttl, start, noDisposeOnSet = this.noDisposeOnSet, sizeCalculation = this.sizeCalculation, status, } = setOptions; + const isBF = this.#isBackgroundFetch(v); + if (v === undefined) { + if (status) + status.set = 'deleted'; + this.delete(k); + return this; + } + let { noUpdateTTL = this.noUpdateTTL } = setOptions; + if (status && !isBF) + status.value = v; + const size = this.#requireSize(k, v, setOptions.size || 0, sizeCalculation, status); + // if the item doesn't fit, don't do anything + // NB: maxEntrySize set to maxSize by default + if (this.maxEntrySize && size > this.maxEntrySize) { + // have to delete, in case something is there already. + this.#delete(k, 'set'); + if (status) { + status.set = 'miss'; + status.maxEntrySizeExceeded = true; + } + return this; + } + let index = this.#size === 0 ? undefined : this.#keyMap.get(k); + if (index === undefined) { + // addition + index = (this.#size === 0 ? this.#tail + : this.#free.length !== 0 ? this.#free.pop() + : this.#size === this.#max ? this.#evict(false) + : this.#size); + this.#keyList[index] = k; + this.#valList[index] = v; + this.#keyMap.set(k, index); + this.#next[this.#tail] = index; + this.#prev[index] = this.#tail; + this.#tail = index; + this.#size++; + this.#addItemSize(index, size, status); + if (status) + status.set = 'add'; + noUpdateTTL = false; + if (this.#hasOnInsert && !isBF) { + this.#onInsert?.(v, k, 'add'); + } + } + else { + // update + // might be updating a background fetch! + this.#moveToTail(index); + const oldVal = this.#valList[index]; + if (v !== oldVal) { + if (!noDisposeOnSet) { + if (this.#isBackgroundFetch(oldVal)) { + if (oldVal !== bf) { + // setting over a background fetch, not merely resolving it. + oldVal.__abortController.abort(new Error('replaced')); + } + const { __staleWhileFetching: s } = oldVal; + if (s !== undefined && s !== v) { + if (this.#hasDispose) { + this.#dispose?.(s, k, 'set'); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([s, k, 'set']); + } + } + } + else { + if (this.#hasDispose) { + this.#dispose?.(oldVal, k, 'set'); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([oldVal, k, 'set']); + } + } + } + this.#removeItemSize(index); + this.#addItemSize(index, size, status); + this.#valList[index] = v; + if (!isBF) { + const oldValue = oldVal && this.#isBackgroundFetch(oldVal) ? + oldVal.__staleWhileFetching + : oldVal; + const setType = oldValue === undefined ? 'add' + : v !== oldValue ? 'replace' + : 'update'; + if (status) { + status.set = setType; + if (oldValue !== undefined) + status.oldValue = oldValue; + } + if (this.#hasOnInsert) { + this.onInsert?.(v, k, setType); + } + } + } + else if (!isBF) { + if (status) { + status.set = 'update'; + } + if (this.#hasOnInsert) { + this.onInsert?.(v, k, 'update'); + } + } + } + if (ttl !== 0 && !this.#ttls) { + this.#initializeTTLTracking(); + } + if (this.#ttls) { + if (!noUpdateTTL) { + this.#setItemTTL(index, ttl, start); + } + if (status) + this.#statusTTL(status, index); + } + if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) { + const dt = this.#disposed; + let task; + while ((task = dt?.shift())) { + this.#disposeAfter?.(...task); + } + } + return this; + } + /** + * Evict the least recently used item, returning its value or + * `undefined` if cache is empty. + */ + pop() { + try { + while (this.#size) { + const val = this.#valList[this.#head]; + this.#evict(true); + if (this.#isBackgroundFetch(val)) { + if (val.__staleWhileFetching) { + return val.__staleWhileFetching; + } + } + else if (val !== undefined) { + return val; + } + } + } + finally { + if (this.#hasDisposeAfter && this.#disposed) { + const dt = this.#disposed; + let task; + while ((task = dt?.shift())) { + this.#disposeAfter?.(...task); + } + } + } + } + #evict(free) { + const head = this.#head; + const k = this.#keyList[head]; + const v = this.#valList[head]; + const isBF = this.#isBackgroundFetch(v); + if (isBF) { + v.__abortController.abort(new Error('evicted')); + } + const oldValue = isBF ? v.__staleWhileFetching : v; + if ((this.#hasDispose || this.#hasDisposeAfter) && + oldValue !== undefined) { + if (this.#hasDispose) { + this.#dispose?.(oldValue, k, 'evict'); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([oldValue, k, 'evict']); + } + } + this.#removeItemSize(head); + if (this.#autopurgeTimers?.[head]) { + clearTimeout(this.#autopurgeTimers[head]); + this.#autopurgeTimers[head] = undefined; + } + // if we aren't about to use the index, then null these out + if (free) { + this.#keyList[head] = undefined; + this.#valList[head] = undefined; + this.#free.push(head); + } + if (this.#size === 1) { + this.#head = this.#tail = 0; + this.#free.length = 0; + } + else { + this.#head = this.#next[head]; + } + this.#keyMap.delete(k); + this.#size--; + return head; + } + /** + * Check if a key is in the cache, without updating the recency of use. + * Will return false if the item is stale, even though it is technically + * in the cache. + * + * Check if a key is in the cache, without updating the recency of + * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set + * to `true` in either the options or the constructor. + * + * Will return `false` if the item is stale, even though it is technically in + * the cache. The difference can be determined (if it matters) by using a + * `status` argument, and inspecting the `has` field. + * + * Will not update item age unless + * {@link LRUCache.OptionsBase.updateAgeOnHas} is set. + */ + has(k, hasOptions = {}) { + const { status = metrics.hasSubscribers ? {} : undefined } = hasOptions; + hasOptions.status = status; + if (status) { + status.op = 'has'; + status.key = k; + status.cache = this; + } + const result = this.#has(k, hasOptions); + if (metrics.hasSubscribers) + metrics.publish(status); + return result; + } + #has(k, hasOptions = {}) { + const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions; + const index = this.#keyMap.get(k); + if (index !== undefined) { + const v = this.#valList[index]; + if (this.#isBackgroundFetch(v) && + v.__staleWhileFetching === undefined) { + return false; + } + if (!this.#isStale(index)) { + if (updateAgeOnHas) { + this.#updateItemAge(index); + } + if (status) { + status.has = 'hit'; + this.#statusTTL(status, index); + } + return true; + } + else if (status) { + status.has = 'stale'; + this.#statusTTL(status, index); + } + } + else if (status) { + status.has = 'miss'; + } + return false; + } + /** + * Like {@link LRUCache#get} but doesn't update recency or delete stale + * items. + * + * Returns `undefined` if the item is stale, unless + * {@link LRUCache.OptionsBase.allowStale} is set. + */ + peek(k, peekOptions = {}) { + const { status = hasSubscribers() ? {} : undefined } = peekOptions; + if (status) { + status.op = 'peek'; + status.key = k; + status.cache = this; + } + peekOptions.status = status; + const result = this.#peek(k, peekOptions); + if (metrics.hasSubscribers) { + metrics.publish(status); + } + return result; + } + #peek(k, peekOptions) { + const { status, allowStale = this.allowStale } = peekOptions; + const index = this.#keyMap.get(k); + if (index === undefined || (!allowStale && this.#isStale(index))) { + if (status) + status.peek = index === undefined ? 'miss' : 'stale'; + return undefined; + } + const v = this.#valList[index]; + const val = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (status) { + if (val !== undefined) { + status.peek = 'hit'; + status.value = val; + } + else { + status.peek = 'miss'; + } + } + return val; + } + #backgroundFetch(k, index, options, context) { + const v = index === undefined ? undefined : this.#valList[index]; + if (this.#isBackgroundFetch(v)) { + return v; + } + const ac = new AbortController(); + const { signal } = options; + // when/if our AC signals, then stop listening to theirs. + signal?.addEventListener('abort', () => ac.abort(signal.reason), { + signal: ac.signal, + }); + const fetchOpts = { + signal: ac.signal, + options, + context, + }; + const cb = (v, updateCache = false) => { + const { aborted } = ac.signal; + const ignoreAbort = options.ignoreFetchAbort && v !== undefined; + const proceed = options.ignoreFetchAbort || + !!(options.allowStaleOnFetchAbort && v !== undefined); + if (options.status) { + if (aborted && !updateCache) { + options.status.fetchAborted = true; + options.status.fetchError = ac.signal.reason; + if (ignoreAbort) + options.status.fetchAbortIgnored = true; + } + else { + options.status.fetchResolved = true; + } + } + if (aborted && !ignoreAbort && !updateCache) { + return fetchFail(ac.signal.reason, proceed); + } + // either we didn't abort, and are still here, or we did, and ignored + const bf = p; + // if nothing else has been written there but we're set to update the + // cache and ignore the abort, or if it's still pending on this specific + // background request, then write it to the cache. + const vl = this.#valList[index]; + if (vl === p || (vl === undefined && ignoreAbort && updateCache)) { + if (v === undefined) { + if (bf.__staleWhileFetching !== undefined) { + this.#valList[index] = bf.__staleWhileFetching; + } + else { + this.#delete(k, 'fetch'); + } + } + else { + if (options.status) + options.status.fetchUpdated = true; + this.#set(k, v, fetchOpts.options, bf); + } + } + return v; + }; + const eb = (er) => { + if (options.status) { + options.status.fetchRejected = true; + options.status.fetchError = er; + } + // do not pass go, do not collect $200 + return fetchFail(er, false); + }; + const fetchFail = (er, proceed) => { + const { aborted } = ac.signal; + const allowStaleAborted = aborted && options.allowStaleOnFetchAbort; + const allowStale = allowStaleAborted || options.allowStaleOnFetchRejection; + const noDelete = allowStale || options.noDeleteOnFetchRejection; + const bf = p; + if (this.#valList[index] === p) { + // if we allow stale on fetch rejections, then we need to ensure that + // the stale value is not removed from the cache when the fetch fails. + const del = !noDelete || (!proceed && bf.__staleWhileFetching === undefined); + if (del) { + this.#delete(k, 'fetch'); + } + else if (!allowStaleAborted) { + // still replace the *promise* with the stale value, + // since we are done with the promise at this point. + // leave it untouched if we're still waiting for an + // aborted background fetch that hasn't yet returned. + this.#valList[index] = bf.__staleWhileFetching; + } + } + if (allowStale) { + if (options.status && bf.__staleWhileFetching !== undefined) { + options.status.returnedStale = true; + } + return bf.__staleWhileFetching; + } + else if (bf.__returned === bf) { + throw er; + } + }; + const pcall = (res, rej) => { + const fmp = this.#fetchMethod?.(k, v, fetchOpts); + // ignored, we go until we finish, regardless. + // defer check until we are actually aborting, + // so fetchMethod can override. + ac.signal.addEventListener('abort', () => { + if (!options.ignoreFetchAbort || options.allowStaleOnFetchAbort) { + res(undefined); + // when it eventually resolves, update the cache. + if (options.allowStaleOnFetchAbort) { + res = v => cb(v, true); + } + } + }); + if (fmp && fmp instanceof Promise) { + fmp.then(v => res(v === undefined ? undefined : v), rej); + } + else if (fmp !== undefined) { + res(fmp); + } + }; + if (options.status) + options.status.fetchDispatched = true; + const p = new Promise(pcall).then(cb, eb); + const bf = Object.assign(p, { + __abortController: ac, + __staleWhileFetching: v, + __returned: undefined, + }); + if (index === undefined) { + // internal, don't expose status. + this.#set(k, bf, { ...fetchOpts.options, status: undefined }); + index = this.#keyMap.get(k); + } + else { + // do not call #set, because we do not want to adjust its place + // in the lru queue, as it has not yet been "used". Also, we don't + // need to worry about evicting for size, because a background fetch + // over a stale value is treated as the same size as its stale value. + this.#valList[index] = bf; + } + return bf; + } + #isBackgroundFetch(p) { + if (!this.#hasFetchMethod) + return false; + const b = p; + return (!!b && + b instanceof Promise && + b.hasOwnProperty('__staleWhileFetching') && + b.__abortController instanceof AbortController); + } + fetch(k, fetchOptions = {}) { + const ths = tracing.hasSubscribers; + const { status = hasSubscribers() ? {} : undefined } = fetchOptions; + fetchOptions.status = status; + if (status && fetchOptions.context) { + status.context = fetchOptions.context; + } + const p = this.#fetch(k, fetchOptions); + if (status && ths) { + status.trace = true; + tracing.tracePromise(() => p, status).catch(() => { }); + } + return p; + } + async #fetch(k, fetchOptions = {}) { + const { + // get options + allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, + // set options + ttl = this.ttl, noDisposeOnSet = this.noDisposeOnSet, size = 0, sizeCalculation = this.sizeCalculation, noUpdateTTL = this.noUpdateTTL, + // fetch exclusive options + noDeleteOnFetchRejection = this.noDeleteOnFetchRejection, allowStaleOnFetchRejection = this.allowStaleOnFetchRejection, ignoreFetchAbort = this.ignoreFetchAbort, allowStaleOnFetchAbort = this.allowStaleOnFetchAbort, context, forceRefresh = false, status, signal, } = fetchOptions; + if (status) { + status.op = 'fetch'; + status.key = k; + if (forceRefresh) + status.forceRefresh = true; + status.cache = this; + } + if (!this.#hasFetchMethod) { + if (status) + status.fetch = 'get'; + return this.#get(k, { + allowStale, + updateAgeOnGet, + noDeleteOnStaleGet, + status, + }); + } + const options = { + allowStale, + updateAgeOnGet, + noDeleteOnStaleGet, + ttl, + noDisposeOnSet, + size, + sizeCalculation, + noUpdateTTL, + noDeleteOnFetchRejection, + allowStaleOnFetchRejection, + allowStaleOnFetchAbort, + ignoreFetchAbort, + status, + signal, + }; + let index = this.#keyMap.get(k); + if (index === undefined) { + if (status) + status.fetch = 'miss'; + const p = this.#backgroundFetch(k, index, options, context); + return (p.__returned = p); + } + else { + // in cache, maybe already fetching + const v = this.#valList[index]; + if (this.#isBackgroundFetch(v)) { + const stale = allowStale && v.__staleWhileFetching !== undefined; + if (status) { + status.fetch = 'inflight'; + if (stale) + status.returnedStale = true; + } + return stale ? v.__staleWhileFetching : (v.__returned = v); + } + // if we force a refresh, that means do NOT serve the cached value, + // unless we are already in the process of refreshing the cache. + const isStale = this.#isStale(index); + if (!forceRefresh && !isStale) { + if (status) + status.fetch = 'hit'; + this.#moveToTail(index); + if (updateAgeOnGet) { + this.#updateItemAge(index); + } + if (status) + this.#statusTTL(status, index); + return v; + } + // ok, it is stale or a forced refresh, and not already fetching. + // refresh the cache. + const p = this.#backgroundFetch(k, index, options, context); + const hasStale = p.__staleWhileFetching !== undefined; + const staleVal = hasStale && allowStale; + if (status) { + status.fetch = isStale ? 'stale' : 'refresh'; + if (staleVal && isStale) + status.returnedStale = true; + } + return staleVal ? p.__staleWhileFetching : (p.__returned = p); + } + } + forceFetch(k, fetchOptions = {}) { + const ths = tracing.hasSubscribers; + const { status = hasSubscribers() ? {} : undefined } = fetchOptions; + fetchOptions.status = status; + if (status && fetchOptions.context) { + status.context = fetchOptions.context; + } + const p = this.#forceFetch(k, fetchOptions); + if (status && ths) { + status.trace = true; + tracing.tracePromise(() => p, status).catch(() => { }); + } + return p; + } + async #forceFetch(k, fetchOptions = {}) { + const v = await this.#fetch(k, fetchOptions); + if (v === undefined) + throw new Error('fetch() returned undefined'); + return v; + } + memo(k, memoOptions = {}) { + const { status = metrics.hasSubscribers ? {} : undefined } = memoOptions; + memoOptions.status = status; + if (status) { + status.op = 'memo'; + status.key = k; + if (memoOptions.context) { + status.context = memoOptions.context; + } + status.cache = this; + } + const result = this.#memo(k, memoOptions); + if (status) + status.value = result; + if (metrics.hasSubscribers) + metrics.publish(status); + return result; + } + #memo(k, memoOptions = {}) { + const memoMethod = this.#memoMethod; + if (!memoMethod) { + throw new Error('no memoMethod provided to constructor'); + } + const { context, status, forceRefresh, ...options } = memoOptions; + if (status && forceRefresh) + status.forceRefresh = true; + const v = this.#get(k, options); + const refresh = forceRefresh || v === undefined; + if (status) { + status.memo = refresh ? 'miss' : 'hit'; + if (!refresh) + status.value = v; + } + if (!refresh) + return v; + const vv = memoMethod(k, v, { + options, + context, + }); + if (status) + status.value = vv; + this.#set(k, vv, options); + return vv; + } + /** + * Return a value from the cache. Will update the recency of the cache + * entry found. + * + * If the key is not found, get() will return `undefined`. + */ + get(k, getOptions = {}) { + const { status = metrics.hasSubscribers ? {} : undefined } = getOptions; + getOptions.status = status; + if (status) { + status.op = 'get'; + status.key = k; + status.cache = this; + } + const result = this.#get(k, getOptions); + if (status) { + if (result !== undefined) + status.value = result; + if (metrics.hasSubscribers) + metrics.publish(status); + } + return result; + } + #get(k, getOptions = {}) { + const { allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, status, } = getOptions; + const index = this.#keyMap.get(k); + if (index === undefined) { + if (status) + status.get = 'miss'; + return undefined; + } + const value = this.#valList[index]; + const fetching = this.#isBackgroundFetch(value); + if (status) + this.#statusTTL(status, index); + if (this.#isStale(index)) { + // delete only if not an in-flight background fetch + if (!fetching) { + if (!noDeleteOnStaleGet) { + this.#delete(k, 'expire'); + } + if (status) + status.get = 'stale'; + if (allowStale) { + if (status) + status.returnedStale = true; + return value; + } + return undefined; + } + if (status) + status.get = 'stale-fetching'; + if (allowStale && value.__staleWhileFetching !== undefined) { + if (status) + status.returnedStale = true; + return value.__staleWhileFetching; + } + return undefined; + } + // not stale + if (status) + status.get = fetching ? 'fetching' : 'hit'; + // if we're currently fetching it, we don't actually have it yet + // it's not stale, which means this isn't a staleWhileRefetching. + // If it's not stale, and fetching, AND has a __staleWhileFetching + // value, then that means the user fetched with {forceRefresh:true}, + // so it's safe to return that value. + this.#moveToTail(index); + if (updateAgeOnGet) { + this.#updateItemAge(index); + } + return fetching ? value.__staleWhileFetching : value; + } + #connect(p, n) { + this.#prev[n] = p; + this.#next[p] = n; + } + #moveToTail(index) { + // if tail already, nothing to do + // if head, move head to next[index] + // else + // move next[prev[index]] to next[index] (head has no prev) + // move prev[next[index]] to prev[index] + // prev[index] = tail + // next[tail] = index + // tail = index + if (index !== this.#tail) { + if (index === this.#head) { + this.#head = this.#next[index]; + } + else { + this.#connect(this.#prev[index], this.#next[index]); + } + this.#connect(this.#tail, index); + this.#tail = index; + } + } + /** + * Deletes a key out of the cache. + * + * Returns true if the key was deleted, false otherwise. + */ + delete(k) { + return this.#delete(k, 'delete'); + } + #delete(k, reason) { + if (metrics.hasSubscribers) { + metrics.publish({ + op: 'delete', + delete: reason, + key: k, + cache: this, + }); + } + let deleted = false; + if (this.#size !== 0) { + const index = this.#keyMap.get(k); + if (index !== undefined) { + if (this.#autopurgeTimers?.[index]) { + clearTimeout(this.#autopurgeTimers?.[index]); + this.#autopurgeTimers[index] = undefined; + } + deleted = true; + if (this.#size === 1) { + this.#clear(reason); + } + else { + this.#removeItemSize(index); + const v = this.#valList[index]; + if (this.#isBackgroundFetch(v)) { + v.__abortController.abort(new Error('deleted')); + } + else if (this.#hasDispose || this.#hasDisposeAfter) { + if (this.#hasDispose) { + this.#dispose?.(v, k, reason); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([v, k, reason]); + } + } + this.#keyMap.delete(k); + this.#keyList[index] = undefined; + this.#valList[index] = undefined; + if (index === this.#tail) { + this.#tail = this.#prev[index]; + } + else if (index === this.#head) { + this.#head = this.#next[index]; + } + else { + const pi = this.#prev[index]; + this.#next[pi] = this.#next[index]; + const ni = this.#next[index]; + this.#prev[ni] = this.#prev[index]; + } + this.#size--; + this.#free.push(index); + } + } + } + if (this.#hasDisposeAfter && this.#disposed?.length) { + const dt = this.#disposed; + let task; + while ((task = dt?.shift())) { + this.#disposeAfter?.(...task); + } + } + return deleted; + } + /** + * Clear the cache entirely, throwing away all values. + */ + clear() { + return this.#clear('delete'); + } + #clear(reason) { + for (const index of this.#rindexes({ allowStale: true })) { + const v = this.#valList[index]; + if (this.#isBackgroundFetch(v)) { + v.__abortController.abort(new Error('deleted')); + } + else { + const k = this.#keyList[index]; + if (this.#hasDispose) { + this.#dispose?.(v, k, reason); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([v, k, reason]); + } + } + } + this.#keyMap.clear(); + void this.#valList.fill(undefined); + this.#keyList.fill(undefined); + if (this.#ttls && this.#starts) { + this.#ttls.fill(0); + this.#starts.fill(0); + for (const t of this.#autopurgeTimers ?? []) { + if (t !== undefined) + clearTimeout(t); + } + this.#autopurgeTimers?.fill(undefined); + } + if (this.#sizes) { + this.#sizes.fill(0); + } + this.#head = 0; + this.#tail = 0; + this.#free.length = 0; + this.#calculatedSize = 0; + this.#size = 0; + if (this.#hasDisposeAfter && this.#disposed) { + const dt = this.#disposed; + let task; + while ((task = dt?.shift())) { + this.#disposeAfter?.(...task); + } + } + } +} +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/node/index.js.map b/node_modules/lru-cache/dist/esm/node/index.js.map new file mode 100644 index 00000000..ab79a6c1 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/node/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module LRUCache\n */\n\nimport { metrics, tracing } from './diagnostics-channel.js'\nimport { defaultPerf } from './perf.js'\nimport type { Perf } from './perf.js'\nexport type { Perf } from './perf.js'\n\nconst hasSubscribers = () =>\n metrics.hasSubscribers || tracing.hasSubscribers\n\nconst warned = new Set()\n\n// either a function or a class\n// oxlint-disable-next-line no-explicit-any\ntype ForC = ((...a: any[]) => any) | { new (...a: any[]): any }\n\n/* c8 ignore start */\nconst PROCESS = (\n typeof process === 'object' && !!process ?\n process\n : {}) as { [k: string]: unknown }\n/* c8 ignore stop */\n\nconst emitWarning = (\n msg: string,\n type: string,\n code: string,\n fn: ForC,\n) => {\n if (typeof PROCESS.emitWarning === 'function') {\n PROCESS.emitWarning(msg, type, code, fn)\n } else {\n //oxlint-disable-next-line no-console\n console.error(`[${code}] ${type}: ${msg}`)\n }\n}\nconst shouldWarn = (code: string) => !warned.has(code)\n\nconst TYPE = Symbol('type')\nexport type PosInt = number & { [TYPE]: 'Positive Integer' }\nexport type Index = number & { [TYPE]: 'LRUCache Index' }\n\nconst isPosInt = (n: unknown): n is PosInt =>\n !!n && n === Math.floor(n as number) && n > 0 && isFinite(n)\n\nexport type UintArray = Uint8Array | Uint16Array | Uint32Array\nexport type NumberArray = UintArray | number[]\n\n// This is a little bit ridiculous, tbh.\n// The maximum array length is 2^32-1 or thereabouts on most JS impls.\n// And well before that point, you're caching the entire world, I mean,\n// that's ~32GB of just integers for the next/prev links, plus whatever\n// else to hold that many keys and values. Just filling the memory with\n// zeroes at init time is brutal when you get that big.\n// But why not be complete?\n// Maybe in the future, these limits will have expanded.\n/* c8 ignore start */\nconst getUintArray = (max: number) =>\n !isPosInt(max) ? null\n : max <= Math.pow(2, 8) ? Uint8Array\n : max <= Math.pow(2, 16) ? Uint16Array\n : max <= Math.pow(2, 32) ? Uint32Array\n : max <= Number.MAX_SAFE_INTEGER ? ZeroArray\n : null\n/* c8 ignore stop */\n\nclass ZeroArray extends Array {\n constructor(size: number) {\n super(size)\n this.fill(0)\n }\n}\nexport type { ZeroArray }\nexport type { Stack }\n\nexport type StackLike = Stack | Index[]\nclass Stack {\n /* c8 ignore start - not sure why this is showing up uncovered?? */\n heap: NumberArray\n /* c8 ignore stop */\n length: number\n // private constructor\n static #constructing: boolean = false\n static create(max: number): StackLike {\n const HeapCls = getUintArray(max)\n if (!HeapCls) return []\n Stack.#constructing = true\n const s = new Stack(max, HeapCls)\n Stack.#constructing = false\n return s\n }\n constructor(max: number, HeapCls: { new (n: number): NumberArray }) {\n /* c8 ignore start */\n if (!Stack.#constructing) {\n throw new TypeError('instantiate Stack using Stack.create(n)')\n }\n /* c8 ignore stop */\n this.heap = new HeapCls(max)\n this.length = 0\n }\n push(n: Index) {\n this.heap[this.length++] = n\n }\n pop(): Index {\n return this.heap[--this.length] as Index\n }\n}\n\n/**\n * Promise representing an in-progress {@link LRUCache#fetch} call\n */\nexport type BackgroundFetch = Promise & {\n __returned: BackgroundFetch | undefined\n __abortController: AbortController\n __staleWhileFetching: V | undefined\n}\n\nexport type DisposeTask = [\n value: V,\n key: K,\n reason: LRUCache.DisposeReason,\n]\n\nexport namespace LRUCache {\n /**\n * An integer greater than 0, reflecting the calculated size of items\n */\n export type Size = number\n\n /**\n * Integer greater than 0, representing some number of milliseconds, or the\n * time at which a TTL started counting from.\n */\n export type Milliseconds = number\n\n /**\n * An integer greater than 0, reflecting a number of items\n */\n export type Count = number\n\n /**\n * The reason why an item was removed from the cache, passed\n * to the {@link Disposer} methods.\n *\n * - `evict`: The item was evicted because it is the least recently used,\n * and the cache is full.\n * - `set`: A new value was set, overwriting the old value being disposed.\n * - `delete`: The item was explicitly deleted, either by calling\n * {@link LRUCache#delete}, {@link LRUCache#clear}, or\n * {@link LRUCache#set} with an undefined value.\n * - `expire`: The item was removed due to exceeding its TTL.\n * - `fetch`: A {@link OptionsBase#fetchMethod} operation returned\n * `undefined` or was aborted, causing the item to be deleted.\n */\n export type DisposeReason =\n | 'evict'\n | 'set'\n | 'delete'\n | 'expire'\n | 'fetch'\n /**\n * A method called upon item removal, passed as the\n * {@link OptionsBase.dispose} and/or\n * {@link OptionsBase.disposeAfter} options.\n */\n export type Disposer = (\n value: V,\n key: K,\n reason: DisposeReason,\n ) => void\n\n /**\n * The reason why an item was added to the cache, passed\n * to the {@link Inserter} methods.\n *\n * - `add`: the item was not found in the cache, and was added\n * - `update`: the item was in the cache, with the same value provided\n * - `replace`: the item was in the cache, and replaced\n */\n export type InsertReason = 'add' | 'update' | 'replace'\n\n /**\n * A method called upon item insertion, passed as the\n * {@link OptionsBase.insert}\n */\n export type Inserter = (\n value: V,\n key: K,\n reason: InsertReason,\n ) => void\n\n /**\n * A function that returns the effective calculated size\n * of an entry in the cache.\n */\n export type SizeCalculator = (value: V, key: K) => Size\n\n /**\n * Options provided to the\n * {@link OptionsBase.fetchMethod} function.\n */\n export interface FetcherOptions {\n signal: AbortSignal\n options: FetcherFetchOptions\n /**\n * Object provided in the {@link FetchOptions.context} option to\n * {@link LRUCache#fetch}\n */\n context: FC\n }\n\n /**\n * Occasionally, it may be useful to track the internal behavior of the\n * cache, particularly for logging, debugging, or for behavior within the\n * `fetchMethod`. To do this, you can pass a `status` object to the\n * {@link LRUCache#fetch}, {@link LRUCache#get}, {@link LRUCache#set},\n * {@link LRUCache#memo}, and {@link LRUCache#has} methods.\n *\n * The `status` option should be a plain JavaScript object. The following\n * fields will be set on it appropriately, depending on the situation.\n *\n * These objects are also the context objects passed to listeners on the\n * `lru-cache:metrics` diagnostic channel, and the `lru-cache` tracing\n * channels, in platforms that support them.\n */\n export interface Status {\n /**\n * The operation being performed\n */\n op?: 'get' | 'set' | 'memo' | 'fetch' | 'delete' | 'has' | 'peek'\n /**\n * The status of a set() operation.\n *\n * - add: the item was not found in the cache, and was added\n * - update: the item was in the cache, with the same value provided\n * - replace: the item was in the cache, and replaced\n * - miss: the item was not added to the cache for some reason\n */\n set?: 'add' | 'update' | 'replace' | 'miss' | 'deleted'\n\n /**\n * The status of a delete() operation.\n */\n delete?: LRUCache.DisposeReason\n\n /**\n * The result of a peek() operation\n *\n * - hit: the item was found and returned\n * - stale: the item is in the cache, but past its ttl and not returned\n * - miss: item not in the cache\n */\n peek?: 'hit' | 'miss' | 'stale'\n\n /**\n * The status of a memo() operation.\n *\n * - 'hit': the item was found in the cache and returned\n * - 'miss': the `memoMethod` function was called\n */\n memo?: 'hit' | 'miss'\n\n /**\n * The `context` option provided to a memo or fetch operation\n *\n * In practice, of course, this will be the same type as the `FC`\n * fetch context param used to instantiate the LRUCache, but the\n * convolutions of threading that through would get quite complicated,\n * and preclude forcing/forbidding the passing of a `context` param\n * where it is/isn't expected, which is more valuable for error\n * prevention.\n */\n context?: unknown\n\n /**\n * the ttl stored for the item, or undefined if ttls are not used.\n */\n ttl?: Milliseconds\n\n /**\n * the start time for the item, or undefined if ttls are not used.\n */\n start?: Milliseconds\n\n /**\n * The timestamp used for TTL calculation\n */\n now?: Milliseconds\n\n /**\n * the remaining ttl for the item, or undefined if ttls are not used.\n */\n remainingTTL?: Milliseconds\n\n /**\n * The calculated size for the item, if sizes are used.\n */\n entrySize?: Size\n\n /**\n * The total calculated size of the cache, if sizes are used.\n */\n totalCalculatedSize?: Size\n\n /**\n * A flag indicating that the item was not stored, due to exceeding the\n * {@link OptionsBase.maxEntrySize}\n */\n maxEntrySizeExceeded?: true\n\n /**\n * The key that was set or retrieved\n */\n key?: K\n\n /**\n * The value that was set\n */\n value?: V\n\n /**\n * The old value, specified in the case of `set:'replace'`\n */\n oldValue?: V\n\n /**\n * The results of a {@link LRUCache#has} operation\n *\n * - hit: the item was found in the cache\n * - stale: the item was found in the cache, but is stale\n * - miss: the item was not found in the cache\n */\n has?: 'hit' | 'stale' | 'miss'\n\n /**\n * The status of a {@link LRUCache#fetch} operation.\n * Note that this can change as the underlying fetch() moves through\n * various states.\n *\n * - inflight: there is another fetch() for this key which is in process\n * - get: there is no {@link OptionsBase.fetchMethod}, so\n * {@link LRUCache#get} was called.\n * - miss: the item is not in cache, and will be fetched.\n * - hit: the item is in the cache, and was resolved immediately.\n * - stale: the item is in the cache, but stale.\n * - refresh: the item is in the cache, and not stale, but\n * {@link FetchOptions.forceRefresh} was specified.\n */\n fetch?: 'get' | 'inflight' | 'miss' | 'hit' | 'stale' | 'refresh'\n\n /**\n * `forceRefresh` option was used for either a fetch or memo operation\n */\n forceRefresh?: boolean\n\n /**\n * The {@link OptionsBase.fetchMethod} was called\n */\n fetchDispatched?: true\n\n /**\n * The cached value was updated after a successful call to\n * {@link OptionsBase.fetchMethod}\n */\n fetchUpdated?: true\n\n /**\n * The reason for a fetch() rejection. Either the error raised by the\n * {@link OptionsBase.fetchMethod}, or the reason for an\n * AbortSignal.\n */\n fetchError?: Error\n\n /**\n * The fetch received an abort signal\n */\n fetchAborted?: true\n\n /**\n * The abort signal received was ignored, and the fetch was allowed to\n * continue in the background.\n */\n fetchAbortIgnored?: true\n\n /**\n * The fetchMethod promise resolved successfully\n */\n fetchResolved?: true\n\n /**\n * The fetchMethod promise was rejected\n */\n fetchRejected?: true\n\n /**\n * The status of a {@link LRUCache#get} operation.\n *\n * - fetching: The item is currently being fetched. If a previous value\n * is present and allowed, that will be returned.\n * - stale: The item is in the cache, and is stale. If it was returned,\n * then the `returnedStale` flag will be set.\n * - stale-fetching: The value is being fetched in the background, but is\n * currently stale. If the stale value was returned, then the\n * `returnedStale` flag will be set.\n * - hit: the item is in the cache\n * - miss: the item is not in the cache\n */\n get?: 'stale' | 'hit' | 'miss' | 'fetching' | 'stale-fetching'\n\n /**\n * A fetch or get operation returned a stale value.\n */\n returnedStale?: true\n\n /**\n * A tracingChannel trace was started for this operation\n */\n trace?: boolean\n\n /**\n * A reference to the cache instance associated with this operation\n */\n cache?: LRUCache\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#fetch}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link OptionsBase.noDeleteOnFetchRejection},\n * {@link OptionsBase.allowStaleOnFetchRejection},\n * {@link FetchOptions.forceRefresh}, and\n * {@link FetcherOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.fetchMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the fetchMethod is called.\n */\n export interface FetcherFetchOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n status?: Status\n size?: Size\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#fetch} method.\n */\n export interface FetchOptions extends FetcherFetchOptions<\n K,\n V,\n FC\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.fetchMethod} as\n * the {@link FetcherOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n signal?: AbortSignal\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface FetchOptionsWithContext extends FetchOptions<\n K,\n V,\n FC\n > {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is\n * `undefined` or `void`\n */\n export interface FetchOptionsNoContext<\n K,\n V,\n FC extends undefined | void = undefined,\n > extends FetchOptions {\n context?: FC\n }\n\n export interface MemoOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.memoMethod} as\n * the {@link MemoizerOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface MemoOptionsWithContext extends MemoOptions<\n K,\n V,\n FC\n > {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is\n * `undefined` or `void`\n */\n export interface MemoOptionsNoContext<\n K,\n V,\n FC extends undefined | void = undefined,\n > extends MemoOptions {\n context?: FC\n }\n\n /**\n * Options provided to the\n * {@link OptionsBase.memoMethod} function.\n */\n export interface MemoizerOptions {\n options: MemoizerMemoOptions\n /**\n * Object provided in the {@link MemoOptions.context} option to\n * {@link LRUCache#memo}\n */\n context: FC\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#memo}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link MemoOptions.forceRefresh}, and\n * {@link MemoOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.memoMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the memoMethod is called.\n */\n export interface MemoizerMemoOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n > {\n status?: Status\n size?: Size\n start?: Milliseconds\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#has} method.\n */\n export interface HasOptions extends Pick<\n OptionsBase,\n 'updateAgeOnHas'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#get} method.\n */\n export interface GetOptions extends Pick<\n OptionsBase,\n 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#peek} method.\n */\n export interface PeekOptions extends Pick<\n OptionsBase,\n 'allowStale'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#set} method.\n */\n export interface SetOptions extends Pick<\n OptionsBase,\n 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'\n > {\n /**\n * If size tracking is enabled, then setting an explicit size\n * in the {@link LRUCache#set} call will prevent calling the\n * {@link OptionsBase.sizeCalculation} function.\n */\n size?: Size\n /**\n * If TTL tracking is enabled, then setting an explicit start\n * time in the {@link LRUCache#set} call will override the\n * default time from `performance.now()` or `Date.now()`.\n *\n * Note that it must be a valid value for whichever time-tracking\n * method is in use.\n */\n start?: Milliseconds\n status?: Status\n }\n\n /**\n * The type signature for the {@link OptionsBase.fetchMethod} option.\n */\n export type Fetcher = (\n key: K,\n staleValue: V | undefined,\n options: FetcherOptions,\n ) => Promise | V | undefined | void\n\n /**\n * the type signature for the {@link OptionsBase.memoMethod} option.\n */\n export type Memoizer = (\n key: K,\n staleValue: V | undefined,\n options: MemoizerOptions,\n ) => V\n\n /**\n * Options which may be passed to the {@link LRUCache} constructor.\n *\n * Most of these may be overridden in the various options that use\n * them.\n *\n * Despite all being technically optional, the constructor requires that\n * a cache is at minimum limited by one or more of {@link OptionsBase.max},\n * {@link OptionsBase.ttl}, or {@link OptionsBase.maxSize}.\n *\n * If {@link OptionsBase.ttl} is used alone, then it is strongly advised\n * (and in fact required by the type definitions here) that the cache\n * also set {@link OptionsBase.ttlAutopurge}, to prevent potentially\n * unbounded storage.\n *\n * All options are also available on the {@link LRUCache} instance, making\n * it safe to pass an LRUCache instance as the options argumemnt to\n * make another empty cache of the same type.\n *\n * Some options are marked as read-only, because changing them after\n * instantiation is not safe. Changing any of the other options will of\n * course only have an effect on subsequent method calls.\n */\n export interface OptionsBase {\n /**\n * The maximum number of items to store in the cache before evicting\n * old entries. This is read-only on the {@link LRUCache} instance,\n * and may not be overridden.\n *\n * If set, then storage space will be pre-allocated at construction\n * time, and the cache will perform significantly faster.\n *\n * Note that significantly fewer items may be stored, if\n * {@link OptionsBase.maxSize} and/or {@link OptionsBase.ttl} are also\n * set.\n *\n * **It is strongly recommended to set a `max` to prevent unbounded growth\n * of the cache.**\n */\n max?: Count\n\n /**\n * Max time in milliseconds for items to live in cache before they are\n * considered stale. Note that stale items are NOT preemptively removed by\n * default, and MAY live in the cache, contributing to its LRU max, long\n * after they have expired, unless {@link OptionsBase.ttlAutopurge} is\n * set.\n *\n * If set to `0` (the default value), then that means \"do not track\n * TTL\", not \"expire immediately\".\n *\n * Also, as this cache is optimized for LRU/MRU operations, some of\n * the staleness/TTL checks will reduce performance, as they will incur\n * overhead by deleting items.\n *\n * This is not primarily a TTL cache, and does not make strong TTL\n * guarantees. There is no pre-emptive pruning of expired items, but you\n * _may_ set a TTL on the cache, and it will treat expired items as missing\n * when they are fetched, and delete them.\n *\n * Optional, but must be a non-negative integer in ms if specified.\n *\n * This may be overridden by passing an options object to `cache.set()`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if ttl tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * If ttl tracking is enabled, and `max` and `maxSize` are not set,\n * and `ttlAutopurge` is not set, then a warning will be emitted\n * cautioning about the potential for unbounded memory consumption.\n * (The TypeScript definitions will also discourage this.)\n */\n ttl?: Milliseconds\n\n /**\n * Minimum amount of time in ms in which to check for staleness.\n * Defaults to 1, which means that the current time is checked\n * at most once per millisecond.\n *\n * Set to 0 to check the current time every time staleness is tested.\n * (This reduces performance, and is theoretically unnecessary.)\n *\n * Setting this to a higher value will improve performance somewhat\n * while using ttl tracking, albeit at the expense of keeping stale\n * items around a bit longer than their TTLs would indicate.\n *\n * @default 1\n */\n ttlResolution?: Milliseconds\n\n /**\n * Preemptively remove stale items from the cache.\n *\n * Note that this may *significantly* degrade performance, especially if\n * the cache is storing a large number of items. It is almost always best\n * to just leave the stale items in the cache, and let them fall out as new\n * items are added.\n *\n * Note that this means that {@link OptionsBase.allowStale} is a bit\n * pointless, as stale items will be deleted almost as soon as they\n * expire.\n *\n * Use with caution!\n */\n ttlAutopurge?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever it is retrieved from cache with\n * {@link LRUCache#get}, causing it to not expire. (It can still fall out\n * of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n */\n updateAgeOnGet?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever its presence in the cache is\n * checked with {@link LRUCache#has}, causing it to not expire. (It can\n * still fall out of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n */\n updateAgeOnHas?: boolean\n\n /**\n * Allow {@link LRUCache#get} and {@link LRUCache#fetch} calls to return\n * stale data, if available.\n *\n * By default, if you set `ttl`, stale items will only be deleted from the\n * cache when you `get(key)`. That is, it's not preemptively pruning items,\n * unless {@link OptionsBase.ttlAutopurge} is set.\n *\n * If you set `allowStale:true`, it'll return the stale value *as well as*\n * deleting it. If you don't set this, then it'll return `undefined` when\n * you try to get a stale entry.\n *\n * Note that when a stale entry is fetched, _even if it is returned due to\n * `allowStale` being set_, it is removed from the cache immediately. You\n * can suppress this behavior by setting\n * {@link OptionsBase.noDeleteOnStaleGet}, either in the constructor, or in\n * the options provided to {@link LRUCache#get}.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n * The `cache.has()` method will always return `false` for stale items.\n *\n * Only relevant if a ttl is set.\n */\n allowStale?: boolean\n\n /**\n * Function that is called on items when they are dropped from the\n * cache, as `dispose(value, key, reason)`.\n *\n * This can be handy if you want to close file descriptors or do\n * other cleanup tasks when items are no longer stored in the cache.\n *\n * **NOTE**: It is called _before_ the item has been fully removed\n * from the cache, so if you want to put it right back in, you need\n * to wait until the next tick. If you try to add it back in during\n * the `dispose()` function call, it will break things in subtle and\n * weird ways.\n *\n * Unlike several other options, this may _not_ be overridden by\n * passing an option to `set()`, for performance reasons.\n *\n * The `reason` will be one of the following strings, corresponding\n * to the reason for the item's deletion:\n *\n * - `evict` Item was evicted to make space for a new addition\n * - `set` Item was overwritten by a new value\n * - `expire` Item expired its TTL\n * - `fetch` Item was deleted due to a failed or aborted fetch, or a\n * fetchMethod returning `undefined.\n * - `delete` Item was removed by explicit `cache.delete(key)`,\n * `cache.clear()`, or `cache.set(key, undefined)`.\n */\n dispose?: Disposer\n\n /**\n * Function that is called when new items are inserted into the cache,\n * as `onInsert(value, key, reason)`.\n *\n * This can be useful if you need to perform actions when an item is\n * added, such as logging or tracking insertions.\n *\n * Unlike some other options, this may _not_ be overridden by passing\n * an option to `set()`, for performance and consistency reasons.\n */\n onInsert?: Inserter\n\n /**\n * The same as {@link OptionsBase.dispose}, but called *after* the entry\n * is completely removed and the cache is once again in a clean state.\n *\n * It is safe to add an item right back into the cache at this point.\n * However, note that it is *very* easy to inadvertently create infinite\n * recursion this way.\n */\n disposeAfter?: Disposer\n\n /**\n * Set to true to suppress calling the\n * {@link OptionsBase.dispose} function if the entry key is\n * still accessible within the cache.\n *\n * This may be overridden by passing an options object to\n * {@link LRUCache#set}.\n *\n * Only relevant if `dispose` or `disposeAfter` are set.\n */\n noDisposeOnSet?: boolean\n\n /**\n * Boolean flag to tell the cache to not update the TTL when setting a new\n * value for an existing key (ie, when updating a value rather than\n * inserting a new value). Note that the TTL value is _always_ set (if\n * provided) when adding a new entry into the cache.\n *\n * Has no effect if a {@link OptionsBase.ttl} is not set.\n *\n * May be passed as an option to {@link LRUCache#set}.\n */\n noUpdateTTL?: boolean\n\n /**\n * Set to a positive integer to track the sizes of items added to the\n * cache, and automatically evict items in order to stay below this size.\n * Note that this may result in fewer than `max` items being stored.\n *\n * Attempting to add an item to the cache whose calculated size is greater\n * that this amount will be a no-op. The item will not be cached, and no\n * other items will be evicted.\n *\n * Optional, must be a positive integer if provided.\n *\n * Sets `maxEntrySize` to the same value, unless a different value is\n * provided for `maxEntrySize`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if size tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * Note also that size tracking can negatively impact performance,\n * though for most cases, only minimally.\n */\n maxSize?: Size\n\n /**\n * The effective size for background fetch promises.\n *\n * This has no effect unless `maxSize` and `sizeCalculation` are used,\n * and a {@link LRUCache.OptionsBase.fetchMethod} is provided to\n * support {@link LRUCache#fetch}.\n *\n * If a stale value is present in the cache, then the effective size of\n * the background fetch is the size of the stale item it will eventually\n * replace. If not, then this value is used as its effective size.\n *\n * @default 1\n */\n backgroundFetchSize?: number\n\n /**\n * The maximum allowed size for any single item in the cache.\n *\n * If a larger item is passed to {@link LRUCache#set} or returned by a\n * {@link OptionsBase.fetchMethod} or {@link OptionsBase.memoMethod}, then\n * it will not be stored in the cache.\n *\n * Attempting to add an item whose calculated size is greater than\n * this amount will not cache the item or evict any old items, but\n * WILL delete an existing value if one is already present.\n *\n * Optional, must be a positive integer if provided. Defaults to\n * the value of `maxSize` if provided.\n */\n maxEntrySize?: Size\n\n /**\n * A function that returns a number indicating the item's size.\n *\n * Requires {@link OptionsBase.maxSize} to be set.\n *\n * If not provided, and {@link OptionsBase.maxSize} or\n * {@link OptionsBase.maxEntrySize} are set, then all\n * {@link LRUCache#set} calls **must** provide an explicit\n * {@link SetOptions.size} or sizeCalculation param.\n */\n sizeCalculation?: SizeCalculator\n\n /**\n * Method that provides the implementation for {@link LRUCache#fetch}\n *\n * ```ts\n * fetchMethod(key, staleValue, { signal, options, context })\n * ```\n *\n * If `fetchMethod` is not provided, then `cache.fetch(key)` is equivalent\n * to `Promise.resolve(cache.get(key))`.\n *\n * If at any time, `signal.aborted` is set to `true`, or if the\n * `signal.onabort` method is called, or if it emits an `'abort'` event\n * which you can listen to with `addEventListener`, then that means that\n * the fetch should be abandoned. This may be passed along to async\n * functions aware of AbortController/AbortSignal behavior.\n *\n * The `fetchMethod` should **only** return `undefined` or a Promise\n * resolving to `undefined` if the AbortController signaled an `abort`\n * event. In all other cases, it should return or resolve to a value\n * suitable for adding to the cache.\n *\n * The `options` object is a union of the options that may be provided to\n * `set()` and `get()`. If they are modified, then that will result in\n * modifying the settings to `cache.set()` when the value is resolved, and\n * in the case of\n * {@link OptionsBase.noDeleteOnFetchRejection} and\n * {@link OptionsBase.allowStaleOnFetchRejection}, the handling of\n * `fetchMethod` failures.\n *\n * For example, a DNS cache may update the TTL based on the value returned\n * from a remote DNS server by changing `options.ttl` in the `fetchMethod`.\n */\n fetchMethod?: Fetcher\n\n /**\n * Method that provides the implementation for {@link LRUCache#memo}\n */\n memoMethod?: Memoizer\n\n /**\n * Set to true to suppress the deletion of stale data when a\n * {@link OptionsBase.fetchMethod} returns a rejected promise.\n */\n noDeleteOnFetchRejection?: boolean\n\n /**\n * Do not delete stale items when they are retrieved with\n * {@link LRUCache#get}.\n *\n * Note that the `get` return value will still be `undefined`\n * unless {@link OptionsBase.allowStale} is true.\n *\n * When using time-expiring entries with `ttl`, by default stale\n * items will be removed from the cache when the key is accessed\n * with `cache.get()`.\n *\n * Setting this option will cause stale items to remain in the cache, until\n * they are explicitly deleted with `cache.delete(key)`, or retrieved with\n * `noDeleteOnStaleGet` set to `false`.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n *\n * Only relevant if a ttl is used.\n */\n noDeleteOnStaleGet?: boolean\n\n /**\n * Set to true to allow returning stale data when a\n * {@link OptionsBase.fetchMethod} throws an error or returns a rejected\n * promise.\n *\n * This differs from using {@link OptionsBase.allowStale} in that stale\n * data will ONLY be returned in the case that the {@link LRUCache#fetch}\n * fails, not any other times.\n *\n * If a `fetchMethod` fails, and there is no stale value available, the\n * `fetch()` will resolve to `undefined`. Ie, all `fetchMethod` errors are\n * suppressed.\n *\n * Implies `noDeleteOnFetchRejection`.\n *\n * This may be set in calls to `fetch()`, or defaulted on the constructor,\n * or overridden by modifying the options object in the `fetchMethod`.\n */\n allowStaleOnFetchRejection?: boolean\n\n /**\n * Set to true to return a stale value from the cache when the\n * `AbortSignal` passed to the {@link OptionsBase.fetchMethod} dispatches\n * an `'abort'` event, whether user-triggered, or due to internal cache\n * behavior.\n *\n * Unless {@link OptionsBase.ignoreFetchAbort} is also set, the underlying\n * {@link OptionsBase.fetchMethod} will still be considered canceled, and\n * any value it returns will be ignored and not cached.\n *\n * Caveat: since fetches are aborted when a new value is explicitly\n * set in the cache, this can lead to fetch returning a stale value,\n * since that was the fallback value _at the moment the `fetch()` was\n * initiated_, even though the new updated value is now present in\n * the cache.\n *\n * For example:\n *\n * ```ts\n * const cache = new LRUCache({\n * ttl: 100,\n * fetchMethod: async (url, oldValue, { signal }) => {\n * const res = await fetch(url, { signal })\n * return await res.json()\n * }\n * })\n * cache.set('https://example.com/', { some: 'data' })\n * // 100ms go by...\n * const result = cache.fetch('https://example.com/')\n * cache.set('https://example.com/', { other: 'thing' })\n * console.log(await result) // { some: 'data' }\n * console.log(cache.get('https://example.com/')) // { other: 'thing' }\n * ```\n */\n allowStaleOnFetchAbort?: boolean\n\n /**\n * Set to true to ignore the `abort` event emitted by the `AbortSignal`\n * object passed to {@link OptionsBase.fetchMethod}, and still cache the\n * resulting resolution value, as long as it is not `undefined`.\n *\n * When used on its own, this means aborted {@link LRUCache#fetch} calls\n * are not immediately resolved or rejected when they are aborted, and\n * instead take the full time to await.\n *\n * When used with {@link OptionsBase.allowStaleOnFetchAbort}, aborted\n * {@link LRUCache#fetch} calls will resolve immediately to their stale\n * cached value or `undefined`, and will continue to process and eventually\n * update the cache when they resolve, as long as the resulting value is\n * not `undefined`, thus supporting a \"return stale on timeout while\n * refreshing\" mechanism by passing `AbortSignal.timeout(n)` as the signal.\n *\n * For example:\n *\n * ```ts\n * const c = new LRUCache({\n * ttl: 100,\n * ignoreFetchAbort: true,\n * allowStaleOnFetchAbort: true,\n * fetchMethod: async (key, oldValue, { signal }) => {\n * // note: do NOT pass the signal to fetch()!\n * // let's say this fetch can take a long time.\n * const res = await fetch(`https://slow-backend-server/${key}`)\n * return await res.json()\n * },\n * })\n *\n * // this will return the stale value after 100ms, while still\n * // updating in the background for next time.\n * const val = await c.fetch('key', { signal: AbortSignal.timeout(100) })\n * ```\n *\n * **Note**: regardless of this setting, an `abort` event _is still\n * emitted on the `AbortSignal` object_, so may result in invalid results\n * when passed to other underlying APIs that use AbortSignals.\n *\n * This may be overridden in the {@link OptionsBase.fetchMethod} or the\n * call to {@link LRUCache#fetch}.\n */\n ignoreFetchAbort?: boolean\n\n /**\n * In some cases, you may want to swap out the performance/Date object\n * used for TTL tracking. This should almost certainly NOT be done in\n * production environments!\n *\n * This value defaults to `global.performance` if it has a `now()` method,\n * or the `global.Date` object otherwise.\n */\n perf?: Perf\n }\n\n export interface OptionsMaxLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n max: Count\n }\n export interface OptionsTTLLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n ttl: Milliseconds\n ttlAutopurge: boolean\n }\n export interface OptionsSizeLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n maxSize: Size\n }\n\n /**\n * The valid safe options for the {@link LRUCache} constructor\n */\n export type Options =\n | OptionsMaxLimit\n | OptionsSizeLimit\n | OptionsTTLLimit\n\n /**\n * Entry objects used by {@link LRUCache#load} and {@link LRUCache#dump},\n * and returned by {@link LRUCache#info}.\n */\n export interface Entry {\n value: V\n ttl?: Milliseconds\n size?: Size\n start?: Milliseconds\n }\n}\n\n/**\n * Default export, the thing you're using this module to get.\n *\n * The `K` and `V` types define the key and value types, respectively. The\n * optional `FC` type defines the type of the `context` object passed to\n * `cache.fetch()` and `cache.memo()`.\n *\n * Keys and values **must not** be `null` or `undefined`.\n *\n * All properties from the options object (with the exception of `max`,\n * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are\n * added as normal public members. (The listed options are read-only getters.)\n *\n * Changing any of these will alter the defaults for subsequent method calls.\n */\nexport class LRUCache {\n // options that cannot be changed without disaster\n readonly #max: LRUCache.Count\n readonly #maxSize: LRUCache.Size\n readonly #dispose?: LRUCache.Disposer\n readonly #onInsert?: LRUCache.Inserter\n readonly #disposeAfter?: LRUCache.Disposer\n readonly #fetchMethod?: LRUCache.Fetcher\n readonly #memoMethod?: LRUCache.Memoizer\n readonly #perf: Perf\n\n /**\n * {@link LRUCache.OptionsBase.perf}\n */\n get perf() {\n return this.#perf\n }\n\n /**\n * {@link LRUCache.OptionsBase.ttl}\n */\n ttl: LRUCache.Milliseconds\n\n /**\n * {@link LRUCache.OptionsBase.ttlResolution}\n */\n ttlResolution: LRUCache.Milliseconds\n /**\n * {@link LRUCache.OptionsBase.ttlAutopurge}\n */\n ttlAutopurge: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnGet}\n */\n updateAgeOnGet: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnHas}\n */\n updateAgeOnHas: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStale}\n */\n allowStale: boolean\n\n /**\n * {@link LRUCache.OptionsBase.noDisposeOnSet}\n */\n noDisposeOnSet: boolean\n /**\n * {@link LRUCache.OptionsBase.noUpdateTTL}\n */\n noUpdateTTL: boolean\n /**\n * {@link LRUCache.OptionsBase.maxEntrySize}\n */\n maxEntrySize: LRUCache.Size\n /**\n * {@link LRUCache.OptionsBase.sizeCalculation}\n */\n sizeCalculation?: LRUCache.SizeCalculator\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection}\n */\n noDeleteOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnStaleGet}\n */\n noDeleteOnStaleGet: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}\n */\n allowStaleOnFetchAbort: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection}\n */\n allowStaleOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.ignoreFetchAbort}\n */\n ignoreFetchAbort: boolean\n\n /** {@link LRUCache.OptionsBase.backgroundFetchSize} */\n backgroundFetchSize: number\n\n // computed properties\n #size: LRUCache.Count\n #calculatedSize: LRUCache.Size\n #keyMap: Map\n #keyList: (K | undefined)[]\n #valList: (V | BackgroundFetch | undefined)[]\n #next: NumberArray\n #prev: NumberArray\n #head: Index\n #tail: Index\n #free: StackLike\n #disposed?: DisposeTask[]\n #sizes?: ZeroArray\n #starts?: ZeroArray\n #ttls?: ZeroArray\n #autopurgeTimers?: (undefined | ReturnType)[]\n\n #hasDispose: boolean\n #hasFetchMethod: boolean\n #hasDisposeAfter: boolean\n #hasOnInsert: boolean\n\n /**\n * Do not call this method unless you need to inspect the\n * inner workings of the cache. If anything returned by this\n * object is modified in any way, strange breakage may occur.\n *\n * These fields are private for a reason!\n *\n * @internal\n */\n static unsafeExposeInternals<\n K extends {},\n V extends {},\n FC extends unknown = unknown,\n >(c: LRUCache) {\n return {\n // properties\n starts: c.#starts,\n ttls: c.#ttls,\n autopurgeTimers: c.#autopurgeTimers,\n sizes: c.#sizes,\n keyMap: c.#keyMap as Map,\n keyList: c.#keyList,\n valList: c.#valList,\n next: c.#next,\n prev: c.#prev,\n get head() {\n return c.#head\n },\n get tail() {\n return c.#tail\n },\n free: c.#free,\n // methods\n isBackgroundFetch: (p: unknown) => c.#isBackgroundFetch(p),\n backgroundFetch: (\n k: K,\n index: number | undefined,\n options: LRUCache.FetchOptions,\n context: unknown,\n ): BackgroundFetch =>\n c.#backgroundFetch(\n k,\n index as Index | undefined,\n options,\n context as FC,\n ),\n moveToTail: (index: number): void => c.#moveToTail(index as Index),\n indexes: (options?: { allowStale: boolean }) => c.#indexes(options),\n rindexes: (options?: { allowStale: boolean }) =>\n c.#rindexes(options),\n isStale: (index: number | undefined) => c.#isStale(index as Index),\n }\n }\n\n // Protected read-only members\n\n /**\n * {@link LRUCache.OptionsBase.max} (read-only)\n */\n get max(): LRUCache.Count {\n return this.#max\n }\n /**\n * {@link LRUCache.OptionsBase.maxSize} (read-only)\n */\n get maxSize(): LRUCache.Count {\n return this.#maxSize\n }\n /**\n * The total computed size of items in the cache (read-only)\n */\n get calculatedSize(): LRUCache.Size {\n return this.#calculatedSize\n }\n /**\n * The number of items stored in the cache (read-only)\n */\n get size(): LRUCache.Count {\n return this.#size\n }\n /**\n * {@link LRUCache.OptionsBase.fetchMethod} (read-only)\n */\n get fetchMethod(): LRUCache.Fetcher | undefined {\n return this.#fetchMethod\n }\n get memoMethod(): LRUCache.Memoizer | undefined {\n return this.#memoMethod\n }\n /**\n * {@link LRUCache.OptionsBase.dispose} (read-only)\n */\n get dispose() {\n return this.#dispose\n }\n /**\n * {@link LRUCache.OptionsBase.onInsert} (read-only)\n */\n get onInsert() {\n return this.#onInsert\n }\n /**\n * {@link LRUCache.OptionsBase.disposeAfter} (read-only)\n */\n get disposeAfter() {\n return this.#disposeAfter\n }\n\n constructor(options: LRUCache.Options | LRUCache) {\n const {\n max = 0,\n ttl,\n ttlResolution = 1,\n ttlAutopurge,\n updateAgeOnGet,\n updateAgeOnHas,\n allowStale,\n dispose,\n onInsert,\n disposeAfter,\n noDisposeOnSet,\n noUpdateTTL,\n maxSize = 0,\n maxEntrySize = 0,\n sizeCalculation,\n fetchMethod,\n memoMethod,\n noDeleteOnFetchRejection,\n noDeleteOnStaleGet,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n backgroundFetchSize = 1,\n perf,\n } = options\n\n this.backgroundFetchSize = backgroundFetchSize\n\n if (perf !== undefined) {\n if (typeof perf?.now !== 'function') {\n throw new TypeError(\n 'perf option must have a now() method if specified',\n )\n }\n }\n\n this.#perf = perf ?? defaultPerf\n\n if (max !== 0 && !isPosInt(max)) {\n throw new TypeError('max option must be a nonnegative integer')\n }\n\n const UintArray = max ? getUintArray(max) : Array\n if (!UintArray) {\n throw new Error('invalid max value: ' + max)\n }\n\n this.#max = max\n this.#maxSize = maxSize\n this.maxEntrySize = maxEntrySize || this.#maxSize\n this.sizeCalculation = sizeCalculation\n if (this.sizeCalculation) {\n if (!this.#maxSize && !this.maxEntrySize) {\n throw new TypeError(\n 'cannot set sizeCalculation without setting maxSize or maxEntrySize',\n )\n }\n if (typeof this.sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation set to non-function')\n }\n }\n\n if (memoMethod !== undefined && typeof memoMethod !== 'function') {\n throw new TypeError('memoMethod must be a function if defined')\n }\n this.#memoMethod = memoMethod\n\n if (fetchMethod !== undefined && typeof fetchMethod !== 'function') {\n throw new TypeError('fetchMethod must be a function if specified')\n }\n this.#fetchMethod = fetchMethod\n this.#hasFetchMethod = !!fetchMethod\n\n this.#keyMap = new Map()\n this.#keyList = Array.from({ length: max }).fill(undefined) as (\n | K\n | undefined\n )[]\n this.#valList = Array.from({ length: max }).fill(undefined) as (\n | V\n | undefined\n )[]\n this.#next = new UintArray(max)\n this.#prev = new UintArray(max)\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free = Stack.create(max)\n this.#size = 0\n this.#calculatedSize = 0\n\n if (typeof dispose === 'function') {\n this.#dispose = dispose\n }\n if (typeof onInsert === 'function') {\n this.#onInsert = onInsert\n }\n if (typeof disposeAfter === 'function') {\n this.#disposeAfter = disposeAfter\n this.#disposed = []\n } else {\n this.#disposeAfter = undefined\n this.#disposed = undefined\n }\n this.#hasDispose = !!this.#dispose\n this.#hasOnInsert = !!this.#onInsert\n this.#hasDisposeAfter = !!this.#disposeAfter\n\n this.noDisposeOnSet = !!noDisposeOnSet\n this.noUpdateTTL = !!noUpdateTTL\n this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection\n this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection\n this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort\n this.ignoreFetchAbort = !!ignoreFetchAbort\n\n // NB: maxEntrySize is set to maxSize if it's set\n if (this.maxEntrySize !== 0) {\n if (this.#maxSize !== 0) {\n if (!isPosInt(this.#maxSize)) {\n throw new TypeError(\n 'maxSize must be a positive integer if specified',\n )\n }\n }\n if (!isPosInt(this.maxEntrySize)) {\n throw new TypeError(\n 'maxEntrySize must be a positive integer if specified',\n )\n }\n this.#initializeSizeTracking()\n }\n\n this.allowStale = !!allowStale\n this.noDeleteOnStaleGet = !!noDeleteOnStaleGet\n this.updateAgeOnGet = !!updateAgeOnGet\n this.updateAgeOnHas = !!updateAgeOnHas\n this.ttlResolution =\n isPosInt(ttlResolution) || ttlResolution === 0 ? ttlResolution : 1\n this.ttlAutopurge = !!ttlAutopurge\n this.ttl = ttl || 0\n if (this.ttl) {\n if (!isPosInt(this.ttl)) {\n throw new TypeError('ttl must be a positive integer if specified')\n }\n this.#initializeTTLTracking()\n }\n\n // do not allow completely unbounded caches\n if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) {\n throw new TypeError(\n 'At least one of max, maxSize, or ttl is required',\n )\n }\n if (!this.ttlAutopurge && !this.#max && !this.#maxSize) {\n const code = 'LRU_CACHE_UNBOUNDED'\n if (shouldWarn(code)) {\n warned.add(code)\n const msg =\n 'TTL caching without ttlAutopurge, max, or maxSize can ' +\n 'result in unbounded memory consumption.'\n emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache)\n }\n }\n }\n\n /**\n * Return the number of ms left in the item's TTL. If item is not in cache,\n * returns `0`. Returns `Infinity` if item is in cache without a defined TTL.\n */\n getRemainingTTL(key: K) {\n return this.#keyMap.has(key) ? Infinity : 0\n }\n\n #initializeTTLTracking() {\n const ttls = new ZeroArray(this.#max)\n const starts = new ZeroArray(this.#max)\n this.#ttls = ttls\n this.#starts = starts\n const purgeTimers =\n this.ttlAutopurge ?\n Array.from>({\n length: this.#max,\n })\n : undefined\n this.#autopurgeTimers = purgeTimers\n\n this.#setItemTTL = (index, ttl, start = this.#perf.now()) => {\n starts[index] = ttl !== 0 ? start : 0\n ttls[index] = ttl\n setPurgetTimer(index, ttl)\n }\n\n this.#updateItemAge = index => {\n starts[index] = ttls[index] !== 0 ? this.#perf.now() : 0\n setPurgetTimer(index, ttls[index])\n }\n\n // clear out the purge timer if we're setting TTL to 0, and\n // previously had a ttl purge timer running, so it doesn't\n // fire unnecessarily. Don't need to do this if we're not doing\n // autopurge.\n const setPurgetTimer =\n !this.ttlAutopurge ?\n () => {}\n : (index: Index, ttl?: number) => {\n if (purgeTimers?.[index]) {\n clearTimeout(purgeTimers[index])\n purgeTimers[index] = undefined\n }\n if (ttl && ttl !== 0 && purgeTimers) {\n const t = setTimeout(() => {\n if (this.#isStale(index)) {\n this.#delete(this.#keyList[index] as K, 'expire')\n }\n }, ttl + 1)\n // unref() not supported on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n purgeTimers[index] = t\n }\n }\n\n this.#statusTTL = (status, index) => {\n if (ttls[index]) {\n const ttl = ttls[index]\n const start = starts[index]\n /* c8 ignore start */\n if (!ttl || !start) {\n return\n }\n /* c8 ignore stop */\n status.ttl = ttl\n status.start = start\n status.now = cachedNow || getNow()\n const age = status.now - start\n status.remainingTTL = ttl - age\n }\n }\n\n // debounce calls to perf.now() to 1s so we're not hitting\n // that costly call repeatedly.\n let cachedNow = 0\n const getNow = () => {\n const n = this.#perf.now()\n if (this.ttlResolution > 0) {\n cachedNow = n\n const t = setTimeout(() => (cachedNow = 0), this.ttlResolution)\n // not available on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n }\n return n\n }\n\n this.getRemainingTTL = key => {\n const index = this.#keyMap.get(key)\n if (index === undefined) {\n return 0\n }\n const ttl = ttls[index]\n const start = starts[index]\n if (!ttl || !start) {\n return Infinity\n }\n const age = (cachedNow || getNow()) - start\n return ttl - age\n }\n\n this.#isStale = index => {\n const s = starts[index]\n const t = ttls[index]\n return !!t && !!s && (cachedNow || getNow()) - s > t\n }\n }\n\n // conditionally set private methods related to TTL\n #updateItemAge: (index: Index) => void = () => {}\n #statusTTL: (status: LRUCache.Status, index: Index) => void =\n () => {}\n #setItemTTL: (\n index: Index,\n ttl: LRUCache.Milliseconds,\n start?: LRUCache.Milliseconds,\n // ignore because we never call this if we're not already in TTL mode\n /* c8 ignore start */\n ) => void = () => {}\n /* c8 ignore stop */\n\n #isStale: (index: Index) => boolean = () => false\n\n #initializeSizeTracking() {\n const sizes = new ZeroArray(this.#max)\n this.#calculatedSize = 0\n this.#sizes = sizes\n this.#removeItemSize = index => {\n this.#calculatedSize -= sizes[index] as number\n sizes[index] = 0\n }\n this.#requireSize = (k, v, size, sizeCalculation) => {\n if (!isPosInt(size)) {\n // provisionally accept background fetches.\n // actual value size will be checked when they return.\n if (this.#isBackgroundFetch(v)) {\n // NB: this cannot occur if v.__staleWhileFetching is set,\n // because in that case, it would take on the size of the\n // existing entry that it temporarily replaces.\n return this.backgroundFetchSize\n }\n if (sizeCalculation) {\n if (typeof sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation must be a function')\n }\n size = sizeCalculation(v, k)\n if (!isPosInt(size)) {\n throw new TypeError(\n 'sizeCalculation return invalid (expect positive integer)',\n )\n }\n } else {\n throw new TypeError(\n 'invalid size value (must be positive integer). ' +\n 'When maxSize or maxEntrySize is used, sizeCalculation ' +\n 'or size must be set.',\n )\n }\n }\n return size\n }\n\n this.#addItemSize = (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status,\n ) => {\n sizes[index] = size\n if (this.#maxSize) {\n const maxSize = this.#maxSize - sizes[index]\n while (this.#calculatedSize > maxSize) {\n this.#evict(true)\n }\n }\n this.#calculatedSize += sizes[index]\n if (status) {\n status.entrySize = size\n status.totalCalculatedSize = this.#calculatedSize\n }\n }\n }\n\n #removeItemSize: (index: Index) => void = _i => {}\n\n #addItemSize: (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status,\n ) => void = (_i, _s, _st) => {}\n\n #requireSize: (\n k: K,\n v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator,\n status?: LRUCache.Status,\n ) => LRUCache.Size = (\n _k: K,\n _v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator,\n ) => {\n if (size || sizeCalculation) {\n throw new TypeError(\n 'cannot set size without setting maxSize or maxEntrySize on cache',\n )\n }\n return 0\n };\n\n *#indexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#tail; this.#isValidIndex(i); ) {\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#head) {\n break\n } else {\n i = this.#prev[i] as Index\n }\n }\n }\n }\n\n *#rindexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#head; this.#isValidIndex(i); ) {\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#tail) {\n break\n } else {\n i = this.#next[i] as Index\n }\n }\n }\n }\n\n #isValidIndex(index: Index) {\n return (\n index !== undefined &&\n this.#keyMap.get(this.#keyList[index] as K) === index\n )\n }\n\n /**\n * Return a generator yielding `[key, value]` pairs,\n * in order from most recently used to least recently used.\n */\n *entries() {\n for (const i of this.#indexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]] as [K, V]\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.entries}\n *\n * Return a generator yielding `[key, value]` pairs,\n * in order from least recently used to most recently used.\n */\n *rentries() {\n for (const i of this.#rindexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]]\n }\n }\n }\n\n /**\n * Return a generator yielding the keys in the cache,\n * in order from most recently used to least recently used.\n */\n *keys() {\n for (const i of this.#indexes()) {\n const k = this.#keyList[i]\n if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield k\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.keys}\n *\n * Return a generator yielding the keys in the cache,\n * in order from least recently used to most recently used.\n */\n *rkeys() {\n for (const i of this.#rindexes()) {\n const k = this.#keyList[i]\n if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield k\n }\n }\n }\n\n /**\n * Return a generator yielding the values in the cache,\n * in order from most recently used to least recently used.\n */\n *values() {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i] as V\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.values}\n *\n * Return a generator yielding the values in the cache,\n * in order from least recently used to most recently used.\n */\n *rvalues() {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i]\n }\n }\n }\n\n /**\n * Iterating over the cache itself yields the same results as\n * {@link LRUCache.entries}\n */\n [Symbol.iterator]() {\n return this.entries()\n }\n\n /**\n * A String value that is used in the creation of the default string\n * description of an object. Called by the built-in method\n * `Object.prototype.toString`.\n */\n [Symbol.toStringTag] = 'LRUCache'\n\n /**\n * Find a value for which the supplied fn method returns a truthy value,\n * similar to `Array.find()`. fn is called as `fn(value, key, cache)`.\n */\n find(\n fn: (v: V, k: K, self: LRUCache) => boolean,\n getOptions: LRUCache.GetOptions = {},\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n if (fn(value, this.#keyList[i] as K, this)) {\n return this.#get(this.#keyList[i] as K, getOptions)\n }\n }\n }\n\n /**\n * Call the supplied function on each item in the cache, in order from most\n * recently used to least recently used.\n *\n * `fn` is called as `fn(value, key, cache)`.\n *\n * If `thisp` is provided, function will be called in the `this`-context of\n * the provided object, or the cache if no `thisp` object is provided.\n *\n * Does not update age or recenty of use, or iterate over stale values.\n */\n forEach(\n fn: (v: V, k: K, self: LRUCache) => unknown,\n thisp: unknown = this,\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * The same as {@link LRUCache.forEach} but items are iterated over in\n * reverse order. (ie, less recently used items are iterated over first.)\n */\n rforEach(\n fn: (v: V, k: K, self: LRUCache) => unknown,\n thisp: unknown = this,\n ) {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * Delete any stale entries. Returns true if anything was removed,\n * false otherwise.\n */\n purgeStale() {\n let deleted = false\n for (const i of this.#rindexes({ allowStale: true })) {\n if (this.#isStale(i)) {\n this.#delete(this.#keyList[i] as K, 'expire')\n deleted = true\n }\n }\n return deleted\n }\n\n /**\n * Get the extended info about a given entry, to get its value, size, and\n * TTL info simultaneously. Returns `undefined` if the key is not present.\n *\n * Unlike {@link LRUCache#dump}, which is designed to be portable and survive\n * serialization, the `start` value is always the current timestamp, and the\n * `ttl` is a calculated remaining time to live (negative if expired).\n *\n * Always returns stale values, if their info is found in the cache, so be\n * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl})\n * if relevant.\n */\n info(key: K): LRUCache.Entry | undefined {\n const i = this.#keyMap.get(key)\n if (i === undefined) return undefined\n const v = this.#valList[i]\n /* c8 ignore start - this isn't tested for the info function,\n * but it's the same logic as found in other places. */\n const value: V | undefined =\n this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) return undefined\n /* c8 ignore stop */\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n const ttl = this.#ttls[i]\n const start = this.#starts[i]\n if (ttl && start) {\n const remain = ttl - (this.#perf.now() - start)\n entry.ttl = remain\n entry.start = Date.now()\n }\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n return entry\n }\n\n /**\n * Return an array of [key, {@link LRUCache.Entry}] tuples which can be\n * passed to {@link LRUCache#load}.\n *\n * The `start` fields are calculated relative to a portable `Date.now()`\n * timestamp, even if `performance.now()` is available.\n *\n * Stale entries are always included in the `dump`, even if\n * {@link LRUCache.OptionsBase.allowStale} is false.\n *\n * Note: this returns an actual array, not a generator, so it can be more\n * easily passed around.\n */\n dump() {\n const arr: [K, LRUCache.Entry][] = []\n for (const i of this.#indexes({ allowStale: true })) {\n const key = this.#keyList[i]\n const v = this.#valList[i]\n const value: V | undefined =\n this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined || key === undefined) continue\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n entry.ttl = this.#ttls[i]\n // always dump the start relative to a portable timestamp\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = this.#perf.now() - (this.#starts[i] as number)\n entry.start = Math.floor(Date.now() - age)\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n arr.unshift([key, entry])\n }\n return arr\n }\n\n /**\n * Reset the cache and load in the items in entries in the order listed.\n *\n * The shape of the resulting cache may be different if the same options are\n * not used in both caches.\n *\n * The `start` fields are assumed to be calculated relative to a portable\n * `Date.now()` timestamp, even if `performance.now()` is available.\n */\n load(arr: [K, LRUCache.Entry][]) {\n this.clear()\n for (const [key, entry] of arr) {\n if (entry.start) {\n // entry.start is a portable timestamp, but we may be using\n // node's performance.now(), so calculate the offset, so that\n // we get the intended remaining TTL, no matter how long it's\n // been on ice.\n //\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = Date.now() - entry.start\n entry.start = this.#perf.now() - age\n }\n this.#set(key, entry.value, entry)\n }\n }\n\n /**\n * Add a value to the cache.\n *\n * Note: if `undefined` is specified as a value, this is an alias for\n * {@link LRUCache#delete}\n *\n * Fields on the {@link LRUCache.SetOptions} options param will override\n * their corresponding values in the constructor options for the scope\n * of this single `set()` operation.\n *\n * If `start` is provided, then that will set the effective start\n * time for the TTL calculation. Note that this must be a previous\n * value of `performance.now()` if supported, or a previous value of\n * `Date.now()` if not.\n *\n * Options object may also include `size`, which will prevent\n * calling the `sizeCalculation` function and just use the specified\n * number if it is a positive integer, and `noDisposeOnSet` which\n * will prevent calling a `dispose` function in the case of\n * overwrites.\n *\n * If the `size` (or return value of `sizeCalculation`) for a given\n * entry is greater than `maxEntrySize`, then the item will not be\n * added to the cache.\n *\n * Will update the recency of the entry.\n *\n * If the value is `undefined`, then this is an alias for\n * `cache.delete(key)`. `undefined` is never stored in the cache.\n */\n set(\n k: K,\n v: V | undefined,\n setOptions: LRUCache.SetOptions = {},\n ) {\n const { status = metrics.hasSubscribers ? {} : undefined } = setOptions\n setOptions.status = status\n if (status) {\n status.op = 'set'\n status.key = k\n if (v !== undefined) status.value = v\n status.cache = this\n }\n const result = this.#set(k, v, setOptions)\n if (status && metrics.hasSubscribers) {\n metrics.publish(status)\n }\n return result\n }\n\n #set(\n k: K,\n v: V | BackgroundFetch | undefined,\n setOptions: LRUCache.SetOptions,\n bf?: BackgroundFetch,\n ) {\n const {\n ttl = this.ttl,\n start,\n noDisposeOnSet = this.noDisposeOnSet,\n sizeCalculation = this.sizeCalculation,\n status,\n } = setOptions\n\n const isBF = this.#isBackgroundFetch(v)\n if (v === undefined) {\n if (status) status.set = 'deleted'\n this.delete(k)\n return this\n }\n let { noUpdateTTL = this.noUpdateTTL } = setOptions\n\n if (status && !isBF) status.value = v\n\n const size = this.#requireSize(\n k,\n v,\n setOptions.size || 0,\n sizeCalculation,\n status,\n )\n // if the item doesn't fit, don't do anything\n // NB: maxEntrySize set to maxSize by default\n if (this.maxEntrySize && size > this.maxEntrySize) {\n // have to delete, in case something is there already.\n this.#delete(k, 'set')\n if (status) {\n status.set = 'miss'\n status.maxEntrySizeExceeded = true\n }\n return this\n }\n let index = this.#size === 0 ? undefined : this.#keyMap.get(k)\n if (index === undefined) {\n // addition\n index = (\n this.#size === 0 ? this.#tail\n : this.#free.length !== 0 ? this.#free.pop()\n : this.#size === this.#max ? this.#evict(false)\n : this.#size) as Index\n this.#keyList[index] = k\n this.#valList[index] = v\n this.#keyMap.set(k, index)\n this.#next[this.#tail] = index\n this.#prev[index] = this.#tail\n this.#tail = index\n this.#size++\n this.#addItemSize(index, size, status)\n if (status) status.set = 'add'\n noUpdateTTL = false\n if (this.#hasOnInsert && !isBF) {\n this.#onInsert?.(v, k, 'add')\n }\n } else {\n // update\n // might be updating a background fetch!\n this.#moveToTail(index)\n const oldVal = this.#valList[index]!\n if (v !== oldVal) {\n if (!noDisposeOnSet) {\n if (this.#isBackgroundFetch(oldVal)) {\n if (oldVal !== bf) {\n // setting over a background fetch, not merely resolving it.\n oldVal.__abortController.abort(new Error('replaced'))\n }\n const { __staleWhileFetching: s } = oldVal\n if (s !== undefined && s !== v) {\n if (this.#hasDispose) {\n this.#dispose?.(s, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([s, k, 'set'])\n }\n }\n } else {\n if (this.#hasDispose) {\n this.#dispose?.(oldVal, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldVal, k, 'set'])\n }\n }\n }\n this.#removeItemSize(index)\n this.#addItemSize(index, size, status)\n this.#valList[index] = v\n if (!isBF) {\n const oldValue =\n oldVal && this.#isBackgroundFetch(oldVal) ?\n oldVal.__staleWhileFetching\n : oldVal\n const setType =\n oldValue === undefined ? 'add'\n : v !== oldValue ? 'replace'\n : 'update'\n if (status) {\n status.set = setType\n if (oldValue !== undefined) status.oldValue = oldValue\n }\n if (this.#hasOnInsert) {\n this.onInsert?.(v, k, setType)\n }\n }\n } else if (!isBF) {\n if (status) {\n status.set = 'update'\n }\n if (this.#hasOnInsert) {\n this.onInsert?.(v, k, 'update')\n }\n }\n }\n if (ttl !== 0 && !this.#ttls) {\n this.#initializeTTLTracking()\n }\n if (this.#ttls) {\n if (!noUpdateTTL) {\n this.#setItemTTL(index, ttl, start)\n }\n if (status) this.#statusTTL(status, index)\n }\n if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return this\n }\n\n /**\n * Evict the least recently used item, returning its value or\n * `undefined` if cache is empty.\n */\n pop(): V | undefined {\n try {\n while (this.#size) {\n const val = this.#valList[this.#head]\n this.#evict(true)\n if (this.#isBackgroundFetch(val)) {\n if (val.__staleWhileFetching) {\n return val.__staleWhileFetching\n }\n } else if (val !== undefined) {\n return val\n }\n }\n } finally {\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n }\n\n #evict(free: boolean) {\n const head = this.#head\n const k = this.#keyList[head]!\n const v = this.#valList[head]!\n const isBF = this.#isBackgroundFetch(v)\n if (isBF) {\n v.__abortController.abort(new Error('evicted'))\n }\n const oldValue = isBF ? v.__staleWhileFetching : v\n if (\n (this.#hasDispose || this.#hasDisposeAfter) &&\n oldValue !== undefined\n ) {\n if (this.#hasDispose) {\n this.#dispose?.(oldValue, k, 'evict')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldValue, k, 'evict'])\n }\n }\n this.#removeItemSize(head)\n if (this.#autopurgeTimers?.[head]) {\n clearTimeout(this.#autopurgeTimers[head])\n this.#autopurgeTimers[head] = undefined\n }\n // if we aren't about to use the index, then null these out\n if (free) {\n this.#keyList[head] = undefined\n this.#valList[head] = undefined\n this.#free.push(head)\n }\n if (this.#size === 1) {\n this.#head = this.#tail = 0 as Index\n this.#free.length = 0\n } else {\n this.#head = this.#next[head] as Index\n }\n this.#keyMap.delete(k)\n this.#size--\n return head\n }\n\n /**\n * Check if a key is in the cache, without updating the recency of use.\n * Will return false if the item is stale, even though it is technically\n * in the cache.\n *\n * Check if a key is in the cache, without updating the recency of\n * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set\n * to `true` in either the options or the constructor.\n *\n * Will return `false` if the item is stale, even though it is technically in\n * the cache. The difference can be determined (if it matters) by using a\n * `status` argument, and inspecting the `has` field.\n *\n * Will not update item age unless\n * {@link LRUCache.OptionsBase.updateAgeOnHas} is set.\n */\n has(k: K, hasOptions: LRUCache.HasOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } = hasOptions\n hasOptions.status = status\n if (status) {\n status.op = 'has'\n status.key = k\n status.cache = this\n }\n const result = this.#has(k, hasOptions)\n if (metrics.hasSubscribers) metrics.publish(status)\n return result\n }\n #has(k: K, hasOptions: LRUCache.HasOptions = {}) {\n const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n const v = this.#valList[index]\n if (\n this.#isBackgroundFetch(v) &&\n v.__staleWhileFetching === undefined\n ) {\n return false\n }\n if (!this.#isStale(index)) {\n if (updateAgeOnHas) {\n this.#updateItemAge(index)\n }\n if (status) {\n status.has = 'hit'\n this.#statusTTL(status, index)\n }\n return true\n } else if (status) {\n status.has = 'stale'\n this.#statusTTL(status, index)\n }\n } else if (status) {\n status.has = 'miss'\n }\n return false\n }\n\n /**\n * Like {@link LRUCache#get} but doesn't update recency or delete stale\n * items.\n *\n * Returns `undefined` if the item is stale, unless\n * {@link LRUCache.OptionsBase.allowStale} is set.\n */\n peek(k: K, peekOptions: LRUCache.PeekOptions = {}) {\n const { status = hasSubscribers() ? {} : undefined } = peekOptions\n if (status) {\n status.op = 'peek'\n status.key = k\n status.cache = this\n }\n peekOptions.status = status\n const result = this.#peek(k, peekOptions)\n if (metrics.hasSubscribers) {\n metrics.publish(status)\n }\n return result\n }\n #peek(k: K, peekOptions: LRUCache.PeekOptions) {\n const { status, allowStale = this.allowStale } = peekOptions\n const index = this.#keyMap.get(k)\n if (index === undefined || (!allowStale && this.#isStale(index))) {\n if (status) status.peek = index === undefined ? 'miss' : 'stale'\n return undefined\n }\n const v = this.#valList[index]\n const val = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (status) {\n if (val !== undefined) {\n status.peek = 'hit'\n status.value = val\n } else {\n status.peek = 'miss'\n }\n }\n return val\n }\n\n #backgroundFetch(\n k: K,\n index: Index | undefined,\n options: LRUCache.FetchOptions,\n context: FC,\n ): BackgroundFetch {\n const v = index === undefined ? undefined : this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n return v\n }\n\n const ac = new AbortController()\n const { signal } = options\n // when/if our AC signals, then stop listening to theirs.\n signal?.addEventListener('abort', () => ac.abort(signal.reason), {\n signal: ac.signal,\n })\n\n const fetchOpts = {\n signal: ac.signal,\n options,\n context,\n }\n\n const cb = (v: V | undefined, updateCache = false): V | undefined => {\n const { aborted } = ac.signal\n const ignoreAbort = options.ignoreFetchAbort && v !== undefined\n const proceed =\n options.ignoreFetchAbort ||\n !!(options.allowStaleOnFetchAbort && v !== undefined)\n if (options.status) {\n if (aborted && !updateCache) {\n options.status.fetchAborted = true\n options.status.fetchError = ac.signal.reason\n if (ignoreAbort) options.status.fetchAbortIgnored = true\n } else {\n options.status.fetchResolved = true\n }\n }\n if (aborted && !ignoreAbort && !updateCache) {\n return fetchFail(ac.signal.reason, proceed)\n }\n // either we didn't abort, and are still here, or we did, and ignored\n const bf = p as BackgroundFetch\n // if nothing else has been written there but we're set to update the\n // cache and ignore the abort, or if it's still pending on this specific\n // background request, then write it to the cache.\n const vl = this.#valList[index as Index]\n if (vl === p || (vl === undefined && ignoreAbort && updateCache)) {\n if (v === undefined) {\n if (bf.__staleWhileFetching !== undefined) {\n this.#valList[index as Index] = bf.__staleWhileFetching\n } else {\n this.#delete(k, 'fetch')\n }\n } else {\n if (options.status) options.status.fetchUpdated = true\n this.#set(k, v, fetchOpts.options, bf)\n }\n }\n return v\n }\n\n const eb = (er: unknown) => {\n if (options.status) {\n options.status.fetchRejected = true\n options.status.fetchError = er as Error\n }\n // do not pass go, do not collect $200\n return fetchFail(er, false)\n }\n\n const fetchFail = (er: unknown, proceed: boolean): V | undefined => {\n const { aborted } = ac.signal\n const allowStaleAborted = aborted && options.allowStaleOnFetchAbort\n const allowStale =\n allowStaleAborted || options.allowStaleOnFetchRejection\n const noDelete = allowStale || options.noDeleteOnFetchRejection\n const bf = p as BackgroundFetch\n if (this.#valList[index as Index] === p) {\n // if we allow stale on fetch rejections, then we need to ensure that\n // the stale value is not removed from the cache when the fetch fails.\n const del =\n !noDelete || (!proceed && bf.__staleWhileFetching === undefined)\n if (del) {\n this.#delete(k, 'fetch')\n } else if (!allowStaleAborted) {\n // still replace the *promise* with the stale value,\n // since we are done with the promise at this point.\n // leave it untouched if we're still waiting for an\n // aborted background fetch that hasn't yet returned.\n this.#valList[index as Index] = bf.__staleWhileFetching\n }\n }\n if (allowStale) {\n if (options.status && bf.__staleWhileFetching !== undefined) {\n options.status.returnedStale = true\n }\n return bf.__staleWhileFetching\n } else if (bf.__returned === bf) {\n throw er\n }\n }\n\n const pcall = (\n res: (v: V | undefined) => void,\n rej: (e: unknown) => void,\n ) => {\n const fmp = this.#fetchMethod?.(k, v, fetchOpts)\n // ignored, we go until we finish, regardless.\n // defer check until we are actually aborting,\n // so fetchMethod can override.\n ac.signal.addEventListener('abort', () => {\n if (!options.ignoreFetchAbort || options.allowStaleOnFetchAbort) {\n res(undefined)\n // when it eventually resolves, update the cache.\n if (options.allowStaleOnFetchAbort) {\n res = v => cb(v, true)\n }\n }\n })\n if (fmp && fmp instanceof Promise) {\n fmp.then(v => res(v === undefined ? undefined : v), rej)\n } else if (fmp !== undefined) {\n res(fmp)\n }\n }\n\n if (options.status) options.status.fetchDispatched = true\n const p = new Promise(pcall).then(cb, eb)\n const bf: BackgroundFetch = Object.assign(p, {\n __abortController: ac,\n __staleWhileFetching: v,\n __returned: undefined,\n })\n\n if (index === undefined) {\n // internal, don't expose status.\n this.#set(k, bf, { ...fetchOpts.options, status: undefined })\n index = this.#keyMap.get(k)\n } else {\n // do not call #set, because we do not want to adjust its place\n // in the lru queue, as it has not yet been \"used\". Also, we don't\n // need to worry about evicting for size, because a background fetch\n // over a stale value is treated as the same size as its stale value.\n this.#valList[index] = bf\n }\n return bf\n }\n\n #isBackgroundFetch(p: unknown): p is BackgroundFetch {\n if (!this.#hasFetchMethod) return false\n const b = p as BackgroundFetch\n return (\n !!b &&\n b instanceof Promise &&\n b.hasOwnProperty('__staleWhileFetching') &&\n b.__abortController instanceof AbortController\n )\n }\n\n /**\n * Make an asynchronous cached fetch using the\n * {@link LRUCache.OptionsBase.fetchMethod} function.\n *\n * If the value is in the cache and not stale, then the returned\n * Promise resolves to the value.\n *\n * If not in the cache, or beyond its TTL staleness, then\n * `fetchMethod(key, staleValue, { options, signal, context })` is\n * called, and the value returned will be added to the cache once\n * resolved.\n *\n * If called with `allowStale`, and an asynchronous fetch is\n * currently in progress to reload a stale value, then the former\n * stale value will be returned.\n *\n * If called with `forceRefresh`, then the cached item will be\n * re-fetched, even if it is not stale. However, if `allowStale` is also\n * set, then the old value will still be returned. This is useful\n * in cases where you want to force a reload of a cached value. If\n * a background fetch is already in progress, then `forceRefresh`\n * has no effect.\n *\n * If multiple fetches for the same key are issued, then they will all be\n * coalesced into a single call to fetchMethod.\n *\n * Note that this means that handling options such as\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort},\n * {@link LRUCache.FetchOptions.signal},\n * and {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} will be\n * determined by the FIRST fetch() call for a given key.\n *\n * This is a known (fixable) shortcoming which will be addresed on when\n * someone complains about it, as the fix would involve added complexity and\n * may not be worth the costs for this edge case.\n *\n * If {@link LRUCache.OptionsBase.fetchMethod} is not specified, then this is\n * effectively an alias for `Promise.resolve(cache.get(key))`.\n *\n * When the fetch method resolves to a value, if the fetch has not\n * been aborted due to deletion, eviction, or being overwritten,\n * then it is added to the cache using the options provided.\n *\n * If the key is evicted or deleted before the `fetchMethod`\n * resolves, then the AbortSignal passed to the `fetchMethod` will\n * receive an `abort` event, and the promise returned by `fetch()`\n * will reject with the reason for the abort.\n *\n * If a `signal` is passed to the `fetch()` call, then aborting the\n * signal will abort the fetch and cause the `fetch()` promise to\n * reject with the reason provided.\n *\n * **Setting `context`**\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the {@link LRUCache} constructor, then all\n * calls to `cache.fetch()` _must_ provide a `context` option. If\n * set to `undefined` or `void`, then calls to fetch _must not_\n * provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that\n * might be relevant in the course of fetching the data. It is only\n * relevant for the course of a single `fetch()` operation, and\n * discarded afterwards.\n *\n * **Note: `fetch()` calls are inflight-unique**\n *\n * If you call `fetch()` multiple times with the same key value,\n * then every call after the first will resolve on the same\n * promise1,\n * _even if they have different settings that would otherwise change\n * the behavior of the fetch_, such as `noDeleteOnFetchRejection`\n * or `ignoreFetchAbort`.\n *\n * In most cases, this is not a problem (in fact, only fetching\n * something once is what you probably want, if you're caching in\n * the first place). If you are changing the fetch() options\n * dramatically between runs, there's a good chance that you might\n * be trying to fit divergent semantics into a single object, and\n * would be better off with multiple cache instances.\n *\n * **1**: Ie, they're not the \"same Promise\", but they resolve at\n * the same time, because they're both waiting on the same\n * underlying fetchMethod response.\n */\n\n fetch(\n k: K,\n fetchOptions: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext,\n ): Promise\n\n // this overload not allowed if context is required\n fetch(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n fetchOptions?: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : never,\n ): Promise\n fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const ths = tracing.hasSubscribers\n const { status = hasSubscribers() ? {} : undefined } = fetchOptions\n fetchOptions.status = status\n if (status && fetchOptions.context) {\n status.context = fetchOptions.context\n }\n const p = this.#fetch(k, fetchOptions)\n if (status && ths) {\n status.trace = true\n tracing.tracePromise(() => p, status).catch(() => {})\n }\n return p\n }\n\n async #fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const {\n // get options\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n // set options\n ttl = this.ttl,\n noDisposeOnSet = this.noDisposeOnSet,\n size = 0,\n sizeCalculation = this.sizeCalculation,\n noUpdateTTL = this.noUpdateTTL,\n // fetch exclusive options\n noDeleteOnFetchRejection = this.noDeleteOnFetchRejection,\n allowStaleOnFetchRejection = this.allowStaleOnFetchRejection,\n ignoreFetchAbort = this.ignoreFetchAbort,\n allowStaleOnFetchAbort = this.allowStaleOnFetchAbort,\n context,\n forceRefresh = false,\n status,\n signal,\n } = fetchOptions\n if (status) {\n status.op = 'fetch'\n status.key = k\n if (forceRefresh) status.forceRefresh = true\n status.cache = this\n }\n\n if (!this.#hasFetchMethod) {\n if (status) status.fetch = 'get'\n return this.#get(k, {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n status,\n })\n }\n\n const options = {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n ttl,\n noDisposeOnSet,\n size,\n sizeCalculation,\n noUpdateTTL,\n noDeleteOnFetchRejection,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n status,\n signal,\n }\n\n let index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.fetch = 'miss'\n const p = this.#backgroundFetch(k, index, options, context as FC)\n return (p.__returned = p)\n } else {\n // in cache, maybe already fetching\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n const stale = allowStale && v.__staleWhileFetching !== undefined\n if (status) {\n status.fetch = 'inflight'\n if (stale) status.returnedStale = true\n }\n return stale ? v.__staleWhileFetching : (v.__returned = v)\n }\n\n // if we force a refresh, that means do NOT serve the cached value,\n // unless we are already in the process of refreshing the cache.\n const isStale = this.#isStale(index)\n if (!forceRefresh && !isStale) {\n if (status) status.fetch = 'hit'\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n if (status) this.#statusTTL(status, index)\n return v\n }\n\n // ok, it is stale or a forced refresh, and not already fetching.\n // refresh the cache.\n const p = this.#backgroundFetch(k, index, options, context as FC)\n const hasStale = p.__staleWhileFetching !== undefined\n const staleVal = hasStale && allowStale\n if (status) {\n status.fetch = isStale ? 'stale' : 'refresh'\n if (staleVal && isStale) status.returnedStale = true\n }\n return staleVal ? p.__staleWhileFetching : (p.__returned = p)\n }\n }\n\n /**\n * In some cases, `cache.fetch()` may resolve to `undefined`, either because\n * a {@link LRUCache.OptionsBase#fetchMethod} was not provided (turning\n * `cache.fetch(k)` into just an async wrapper around `cache.get(k)`) or\n * because `ignoreFetchAbort` was specified (either to the constructor or\n * in the {@link LRUCache.FetchOptions}). Also, the\n * {@link LRUCache.OptionsBase.fetchMethod} may return `undefined` or `void`, making\n * the test even more complicated.\n *\n * Because inferring the cases where `undefined` might be returned are so\n * cumbersome, but testing for `undefined` can also be annoying, this method\n * can be used, which will reject if `this.fetch()` resolves to undefined.\n */\n forceFetch(\n k: K,\n fetchOptions: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext,\n ): Promise\n // this overload not allowed if context is required\n forceFetch(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n fetchOptions?: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : never,\n ): Promise\n forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const ths = tracing.hasSubscribers\n const { status = hasSubscribers() ? {} : undefined } = fetchOptions\n fetchOptions.status = status\n if (status && fetchOptions.context) {\n status.context = fetchOptions.context\n }\n const p = this.#forceFetch(k, fetchOptions)\n if (status && ths) {\n status.trace = true\n tracing.tracePromise(() => p, status).catch(() => {})\n }\n return p\n }\n\n async #forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ) {\n const v = await this.#fetch(k, fetchOptions)\n if (v === undefined) throw new Error('fetch() returned undefined')\n return v\n }\n\n /**\n * If the key is found in the cache, then this is equivalent to\n * {@link LRUCache#get}. If not, in the cache, then calculate the value using\n * the {@link LRUCache.OptionsBase.memoMethod}, and add it to the cache.\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the LRUCache constructor, then all calls to `cache.memo()`\n * _must_ provide a `context` option. If set to `undefined` or `void`, then\n * calls to memo _must not_ provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that might be\n * relevant in the course of fetching the data. It is only relevant for the\n * course of a single `memo()` operation, and discarded afterwards.\n */\n memo(\n k: K,\n memoOptions: unknown extends FC ? LRUCache.MemoOptions\n : FC extends undefined | void ? LRUCache.MemoOptionsNoContext\n : LRUCache.MemoOptionsWithContext,\n ): V\n // this overload not allowed if context is required\n memo(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n memoOptions?: unknown extends FC ? LRUCache.MemoOptions\n : FC extends undefined | void ? LRUCache.MemoOptionsNoContext\n : never,\n ): V\n memo(k: K, memoOptions: LRUCache.MemoOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } =\n memoOptions\n memoOptions.status = status\n if (status) {\n status.op = 'memo'\n status.key = k\n if (memoOptions.context) {\n status.context = memoOptions.context\n }\n status.cache = this\n }\n const result = this.#memo(k, memoOptions)\n if (status) status.value = result\n if (metrics.hasSubscribers) metrics.publish(status)\n return result\n }\n #memo(k: K, memoOptions: LRUCache.MemoOptions = {}) {\n const memoMethod = this.#memoMethod\n if (!memoMethod) {\n throw new Error('no memoMethod provided to constructor')\n }\n const { context, status, forceRefresh, ...options } = memoOptions\n if (status && forceRefresh) status.forceRefresh = true\n const v = this.#get(k, options)\n const refresh = forceRefresh || v === undefined\n if (status) {\n status.memo = refresh ? 'miss' : 'hit'\n if (!refresh) status.value = v\n }\n if (!refresh) return v\n const vv = memoMethod(k, v, {\n options,\n context,\n } as LRUCache.MemoizerOptions)\n if (status) status.value = vv\n this.#set(k, vv, options)\n return vv\n }\n\n /**\n * Return a value from the cache. Will update the recency of the cache\n * entry found.\n *\n * If the key is not found, get() will return `undefined`.\n */\n get(k: K, getOptions: LRUCache.GetOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } = getOptions\n getOptions.status = status\n if (status) {\n status.op = 'get'\n status.key = k\n status.cache = this\n }\n const result = this.#get(k, getOptions)\n if (status) {\n if (result !== undefined) status.value = result\n if (metrics.hasSubscribers) metrics.publish(status)\n }\n return result\n }\n\n #get(k: K, getOptions: LRUCache.GetOptions = {}) {\n const {\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n status,\n } = getOptions\n const index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.get = 'miss'\n return undefined\n }\n const value = this.#valList[index]\n const fetching = this.#isBackgroundFetch(value)\n if (status) this.#statusTTL(status, index)\n if (this.#isStale(index)) {\n // delete only if not an in-flight background fetch\n if (!fetching) {\n if (!noDeleteOnStaleGet) {\n this.#delete(k, 'expire')\n }\n if (status) status.get = 'stale'\n if (allowStale) {\n if (status) status.returnedStale = true\n return value\n }\n return undefined\n }\n if (status) status.get = 'stale-fetching'\n if (allowStale && value.__staleWhileFetching !== undefined) {\n if (status) status.returnedStale = true\n return value.__staleWhileFetching\n }\n return undefined\n }\n // not stale\n if (status) status.get = fetching ? 'fetching' : 'hit'\n // if we're currently fetching it, we don't actually have it yet\n // it's not stale, which means this isn't a staleWhileRefetching.\n // If it's not stale, and fetching, AND has a __staleWhileFetching\n // value, then that means the user fetched with {forceRefresh:true},\n // so it's safe to return that value.\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n return fetching ? value.__staleWhileFetching : value\n }\n\n #connect(p: Index, n: Index) {\n this.#prev[n] = p\n this.#next[p] = n\n }\n\n #moveToTail(index: Index): void {\n // if tail already, nothing to do\n // if head, move head to next[index]\n // else\n // move next[prev[index]] to next[index] (head has no prev)\n // move prev[next[index]] to prev[index]\n // prev[index] = tail\n // next[tail] = index\n // tail = index\n if (index !== this.#tail) {\n if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n this.#connect(\n this.#prev[index] as Index,\n this.#next[index] as Index,\n )\n }\n this.#connect(this.#tail, index)\n this.#tail = index\n }\n }\n\n /**\n * Deletes a key out of the cache.\n *\n * Returns true if the key was deleted, false otherwise.\n */\n delete(k: K) {\n return this.#delete(k, 'delete')\n }\n\n #delete(k: K, reason: LRUCache.DisposeReason) {\n if (metrics.hasSubscribers) {\n metrics.publish({\n op: 'delete',\n delete: reason,\n key: k,\n cache: this,\n })\n }\n let deleted = false\n if (this.#size !== 0) {\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n if (this.#autopurgeTimers?.[index]) {\n clearTimeout(this.#autopurgeTimers?.[index])\n this.#autopurgeTimers[index] = undefined\n }\n deleted = true\n if (this.#size === 1) {\n this.#clear(reason)\n } else {\n this.#removeItemSize(index)\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k, reason])\n }\n }\n this.#keyMap.delete(k)\n this.#keyList[index] = undefined\n this.#valList[index] = undefined\n if (index === this.#tail) {\n this.#tail = this.#prev[index] as Index\n } else if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n const pi = this.#prev[index] as number\n this.#next[pi] = this.#next[index] as number\n const ni = this.#next[index] as number\n this.#prev[ni] = this.#prev[index] as number\n }\n this.#size--\n this.#free.push(index)\n }\n }\n }\n if (this.#hasDisposeAfter && this.#disposed?.length) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return deleted\n }\n\n /**\n * Clear the cache entirely, throwing away all values.\n */\n clear() {\n return this.#clear('delete')\n }\n #clear(reason: LRUCache.DisposeReason) {\n for (const index of this.#rindexes({ allowStale: true })) {\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else {\n const k = this.#keyList[index]\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k as K, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k as K, reason])\n }\n }\n }\n\n this.#keyMap.clear()\n void this.#valList.fill(undefined)\n this.#keyList.fill(undefined)\n if (this.#ttls && this.#starts) {\n this.#ttls.fill(0)\n this.#starts.fill(0)\n for (const t of this.#autopurgeTimers ?? []) {\n if (t !== undefined) clearTimeout(t)\n }\n this.#autopurgeTimers?.fill(undefined)\n }\n if (this.#sizes) {\n this.#sizes.fill(0)\n }\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free.length = 0\n this.#calculatedSize = 0\n this.#size = 0\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/node/index.min.js b/node_modules/lru-cache/dist/esm/node/index.min.js new file mode 100644 index 00000000..84c4c3ec --- /dev/null +++ b/node_modules/lru-cache/dist/esm/node/index.min.js @@ -0,0 +1,2 @@ +import{tracingChannel as G,channel as P}from"node:diagnostics_channel";var S=P("lru-cache:metrics"),W=G("lru-cache");var L=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date;var D=()=>S.hasSubscribers||W.hasSubscribers,U=new Set,M=typeof process=="object"&&process?process:{},k=(u,e,t,i)=>{typeof M.emitWarning=="function"?M.emitWarning(u,e,t,i):console.error(`[${t}] ${e}: ${u}`)},H=u=>!U.has(u);var T=u=>!!u&&u===Math.floor(u)&&u>0&&isFinite(u),j=u=>T(u)?u<=Math.pow(2,8)?Uint8Array:u<=Math.pow(2,16)?Uint16Array:u<=Math.pow(2,32)?Uint32Array:u<=Number.MAX_SAFE_INTEGER?O:null:null,O=class extends Array{constructor(e){super(e),this.fill(0)}},R=class u{heap;length;static#o=!1;static create(e){let t=j(e);if(!t)return[];u.#o=!0;let i=new u(e,t);return u.#o=!1,i}constructor(e,t){if(!u.#o)throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new t(e),this.length=0}push(e){this.heap[this.length++]=e}pop(){return this.heap[--this.length]}},I=class u{#o;#c;#S;#O;#w;#M;#I;#m;get perf(){return this.#m}ttl;ttlResolution;ttlAutopurge;updateAgeOnGet;updateAgeOnHas;allowStale;noDisposeOnSet;noUpdateTTL;maxEntrySize;sizeCalculation;noDeleteOnFetchRejection;noDeleteOnStaleGet;allowStaleOnFetchAbort;allowStaleOnFetchRejection;ignoreFetchAbort;backgroundFetchSize;#n;#b;#s;#i;#t;#l;#u;#a;#h;#y;#r;#_;#F;#d;#g;#T;#U;#f;#x;static unsafeExposeInternals(e){return{starts:e.#F,ttls:e.#d,autopurgeTimers:e.#g,sizes:e.#_,keyMap:e.#s,keyList:e.#i,valList:e.#t,next:e.#l,prev:e.#u,get head(){return e.#a},get tail(){return e.#h},free:e.#y,isBackgroundFetch:t=>e.#e(t),backgroundFetch:(t,i,s,n)=>e.#P(t,i,s,n),moveToTail:t=>e.#L(t),indexes:t=>e.#A(t),rindexes:t=>e.#z(t),isStale:t=>e.#p(t)}}get max(){return this.#o}get maxSize(){return this.#c}get calculatedSize(){return this.#b}get size(){return this.#n}get fetchMethod(){return this.#M}get memoMethod(){return this.#I}get dispose(){return this.#S}get onInsert(){return this.#O}get disposeAfter(){return this.#w}constructor(e){let{max:t=0,ttl:i,ttlResolution:s=1,ttlAutopurge:n,updateAgeOnGet:r,updateAgeOnHas:h,allowStale:a,dispose:o,onInsert:d,disposeAfter:y,noDisposeOnSet:_,noUpdateTTL:c,maxSize:g=0,maxEntrySize:f=0,sizeCalculation:b,fetchMethod:l,memoMethod:w,noDeleteOnFetchRejection:F,noDeleteOnStaleGet:m,allowStaleOnFetchRejection:p,allowStaleOnFetchAbort:A,ignoreFetchAbort:z,backgroundFetchSize:C=1,perf:E}=e;if(this.backgroundFetchSize=C,E!==void 0&&typeof E?.now!="function")throw new TypeError("perf option must have a now() method if specified");if(this.#m=E??L,t!==0&&!T(t))throw new TypeError("max option must be a nonnegative integer");let v=t?j(t):Array;if(!v)throw new Error("invalid max value: "+t);if(this.#o=t,this.#c=g,this.maxEntrySize=f||this.#c,this.sizeCalculation=b,this.sizeCalculation){if(!this.#c&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(w!==void 0&&typeof w!="function")throw new TypeError("memoMethod must be a function if defined");if(this.#I=w,l!==void 0&&typeof l!="function")throw new TypeError("fetchMethod must be a function if specified");if(this.#M=l,this.#U=!!l,this.#s=new Map,this.#i=Array.from({length:t}).fill(void 0),this.#t=Array.from({length:t}).fill(void 0),this.#l=new v(t),this.#u=new v(t),this.#a=0,this.#h=0,this.#y=R.create(t),this.#n=0,this.#b=0,typeof o=="function"&&(this.#S=o),typeof d=="function"&&(this.#O=d),typeof y=="function"?(this.#w=y,this.#r=[]):(this.#w=void 0,this.#r=void 0),this.#T=!!this.#S,this.#x=!!this.#O,this.#f=!!this.#w,this.noDisposeOnSet=!!_,this.noUpdateTTL=!!c,this.noDeleteOnFetchRejection=!!F,this.allowStaleOnFetchRejection=!!p,this.allowStaleOnFetchAbort=!!A,this.ignoreFetchAbort=!!z,this.maxEntrySize!==0){if(this.#c!==0&&!T(this.#c))throw new TypeError("maxSize must be a positive integer if specified");if(!T(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.#X()}if(this.allowStale=!!a,this.noDeleteOnStaleGet=!!m,this.updateAgeOnGet=!!r,this.updateAgeOnHas=!!h,this.ttlResolution=T(s)||s===0?s:1,this.ttlAutopurge=!!n,this.ttl=i||0,this.ttl){if(!T(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.#k()}if(this.#o===0&&this.ttl===0&&this.#c===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.#o&&!this.#c){let x="LRU_CACHE_UNBOUNDED";H(x)&&(U.add(x),k("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",x,u))}}getRemainingTTL(e){return this.#s.has(e)?1/0:0}#k(){let e=new O(this.#o),t=new O(this.#o);this.#d=e,this.#F=t;let i=this.ttlAutopurge?Array.from({length:this.#o}):void 0;this.#g=i,this.#H=(h,a,o=this.#m.now())=>{t[h]=a!==0?o:0,e[h]=a,s(h,a)},this.#D=h=>{t[h]=e[h]!==0?this.#m.now():0,s(h,e[h])};let s=this.ttlAutopurge?(h,a)=>{if(i?.[h]&&(clearTimeout(i[h]),i[h]=void 0),a&&a!==0&&i){let o=setTimeout(()=>{this.#p(h)&&this.#E(this.#i[h],"expire")},a+1);o.unref&&o.unref(),i[h]=o}}:()=>{};this.#v=(h,a)=>{if(e[a]){let o=e[a],d=t[a];if(!o||!d)return;h.ttl=o,h.start=d,h.now=n||r();let y=h.now-d;h.remainingTTL=o-y}};let n=0,r=()=>{let h=this.#m.now();if(this.ttlResolution>0){n=h;let a=setTimeout(()=>n=0,this.ttlResolution);a.unref&&a.unref()}return h};this.getRemainingTTL=h=>{let a=this.#s.get(h);if(a===void 0)return 0;let o=e[a],d=t[a];if(!o||!d)return 1/0;let y=(n||r())-d;return o-y},this.#p=h=>{let a=t[h],o=e[h];return!!o&&!!a&&(n||r())-a>o}}#D=()=>{};#v=()=>{};#H=()=>{};#p=()=>!1;#X(){let e=new O(this.#o);this.#b=0,this.#_=e,this.#R=t=>{this.#b-=e[t],e[t]=0},this.#N=(t,i,s,n)=>{if(!T(s)){if(this.#e(i))return this.backgroundFetchSize;if(n){if(typeof n!="function")throw new TypeError("sizeCalculation must be a function");if(s=n(i,t),!T(s))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.")}return s},this.#j=(t,i,s)=>{if(e[t]=i,this.#c){let n=this.#c-e[t];for(;this.#b>n;)this.#G(!0)}this.#b+=e[t],s&&(s.entrySize=i,s.totalCalculatedSize=this.#b)}}#R=e=>{};#j=(e,t,i)=>{};#N=(e,t,i,s)=>{if(i||s)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0};*#A({allowStale:e=this.allowStale}={}){if(this.#n)for(let t=this.#h;this.#V(t)&&((e||!this.#p(t))&&(yield t),t!==this.#a);)t=this.#u[t]}*#z({allowStale:e=this.allowStale}={}){if(this.#n)for(let t=this.#a;this.#V(t)&&((e||!this.#p(t))&&(yield t),t!==this.#h);)t=this.#l[t]}#V(e){return e!==void 0&&this.#s.get(this.#i[e])===e}*entries(){for(let e of this.#A())this.#t[e]!==void 0&&this.#i[e]!==void 0&&!this.#e(this.#t[e])&&(yield[this.#i[e],this.#t[e]])}*rentries(){for(let e of this.#z())this.#t[e]!==void 0&&this.#i[e]!==void 0&&!this.#e(this.#t[e])&&(yield[this.#i[e],this.#t[e]])}*keys(){for(let e of this.#A()){let t=this.#i[e];t!==void 0&&!this.#e(this.#t[e])&&(yield t)}}*rkeys(){for(let e of this.#z()){let t=this.#i[e];t!==void 0&&!this.#e(this.#t[e])&&(yield t)}}*values(){for(let e of this.#A())this.#t[e]!==void 0&&!this.#e(this.#t[e])&&(yield this.#t[e])}*rvalues(){for(let e of this.#z())this.#t[e]!==void 0&&!this.#e(this.#t[e])&&(yield this.#t[e])}[Symbol.iterator](){return this.entries()}[Symbol.toStringTag]="LRUCache";find(e,t={}){for(let i of this.#A()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;if(n!==void 0&&e(n,this.#i[i],this))return this.#C(this.#i[i],t)}}forEach(e,t=this){for(let i of this.#A()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;n!==void 0&&e.call(t,n,this.#i[i],this)}}rforEach(e,t=this){for(let i of this.#z()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;n!==void 0&&e.call(t,n,this.#i[i],this)}}purgeStale(){let e=!1;for(let t of this.#z({allowStale:!0}))this.#p(t)&&(this.#E(this.#i[t],"expire"),e=!0);return e}info(e){let t=this.#s.get(e);if(t===void 0)return;let i=this.#t[t],s=this.#e(i)?i.__staleWhileFetching:i;if(s===void 0)return;let n={value:s};if(this.#d&&this.#F){let r=this.#d[t],h=this.#F[t];if(r&&h){let a=r-(this.#m.now()-h);n.ttl=a,n.start=Date.now()}}return this.#_&&(n.size=this.#_[t]),n}dump(){let e=[];for(let t of this.#A({allowStale:!0})){let i=this.#i[t],s=this.#t[t],n=this.#e(s)?s.__staleWhileFetching:s;if(n===void 0||i===void 0)continue;let r={value:n};if(this.#d&&this.#F){r.ttl=this.#d[t];let h=this.#m.now()-this.#F[t];r.start=Math.floor(Date.now()-h)}this.#_&&(r.size=this.#_[t]),e.unshift([i,r])}return e}load(e){this.clear();for(let[t,i]of e){if(i.start){let s=Date.now()-i.start;i.start=this.#m.now()-s}this.#W(t,i.value,i)}}set(e,t,i={}){let{status:s=S.hasSubscribers?{}:void 0}=i;i.status=s,s&&(s.op="set",s.key=e,t!==void 0&&(s.value=t),s.cache=this);let n=this.#W(e,t,i);return s&&S.hasSubscribers&&S.publish(s),n}#W(e,t,i,s){let{ttl:n=this.ttl,start:r,noDisposeOnSet:h=this.noDisposeOnSet,sizeCalculation:a=this.sizeCalculation,status:o}=i,d=this.#e(t);if(t===void 0)return o&&(o.set="deleted"),this.delete(e),this;let{noUpdateTTL:y=this.noUpdateTTL}=i;o&&!d&&(o.value=t);let _=this.#N(e,t,i.size||0,a,o);if(this.maxEntrySize&&_>this.maxEntrySize)return this.#E(e,"set"),o&&(o.set="miss",o.maxEntrySizeExceeded=!0),this;let c=this.#n===0?void 0:this.#s.get(e);if(c===void 0)c=this.#n===0?this.#h:this.#y.length!==0?this.#y.pop():this.#n===this.#o?this.#G(!1):this.#n,this.#i[c]=e,this.#t[c]=t,this.#s.set(e,c),this.#l[this.#h]=c,this.#u[c]=this.#h,this.#h=c,this.#n++,this.#j(c,_,o),o&&(o.set="add"),y=!1,this.#x&&!d&&this.#O?.(t,e,"add");else{this.#L(c);let g=this.#t[c];if(t!==g){if(!h)if(this.#e(g)){g!==s&&g.__abortController.abort(new Error("replaced"));let{__staleWhileFetching:f}=g;f!==void 0&&f!==t&&(this.#T&&this.#S?.(f,e,"set"),this.#f&&this.#r?.push([f,e,"set"]))}else this.#T&&this.#S?.(g,e,"set"),this.#f&&this.#r?.push([g,e,"set"]);if(this.#R(c),this.#j(c,_,o),this.#t[c]=t,!d){let f=g&&this.#e(g)?g.__staleWhileFetching:g,b=f===void 0?"add":t!==f?"replace":"update";o&&(o.set=b,f!==void 0&&(o.oldValue=f)),this.#x&&this.onInsert?.(t,e,b)}}else d||(o&&(o.set="update"),this.#x&&this.onInsert?.(t,e,"update"))}if(n!==0&&!this.#d&&this.#k(),this.#d&&(y||this.#H(c,n,r),o&&this.#v(o,c)),!h&&this.#f&&this.#r){let g=this.#r,f;for(;f=g?.shift();)this.#w?.(...f)}return this}pop(){try{for(;this.#n;){let e=this.#t[this.#a];if(this.#G(!0),this.#e(e)){if(e.__staleWhileFetching)return e.__staleWhileFetching}else if(e!==void 0)return e}}finally{if(this.#f&&this.#r){let e=this.#r,t;for(;t=e?.shift();)this.#w?.(...t)}}}#G(e){let t=this.#a,i=this.#i[t],s=this.#t[t],n=this.#e(s);n&&s.__abortController.abort(new Error("evicted"));let r=n?s.__staleWhileFetching:s;return(this.#T||this.#f)&&r!==void 0&&(this.#T&&this.#S?.(r,i,"evict"),this.#f&&this.#r?.push([r,i,"evict"])),this.#R(t),this.#g?.[t]&&(clearTimeout(this.#g[t]),this.#g[t]=void 0),e&&(this.#i[t]=void 0,this.#t[t]=void 0,this.#y.push(t)),this.#n===1?(this.#a=this.#h=0,this.#y.length=0):this.#a=this.#l[t],this.#s.delete(i),this.#n--,t}has(e,t={}){let{status:i=S.hasSubscribers?{}:void 0}=t;t.status=i,i&&(i.op="has",i.key=e,i.cache=this);let s=this.#Y(e,t);return S.hasSubscribers&&S.publish(i),s}#Y(e,t={}){let{updateAgeOnHas:i=this.updateAgeOnHas,status:s}=t,n=this.#s.get(e);if(n!==void 0){let r=this.#t[n];if(this.#e(r)&&r.__staleWhileFetching===void 0)return!1;if(this.#p(n))s&&(s.has="stale",this.#v(s,n));else return i&&this.#D(n),s&&(s.has="hit",this.#v(s,n)),!0}else s&&(s.has="miss");return!1}peek(e,t={}){let{status:i=D()?{}:void 0}=t;i&&(i.op="peek",i.key=e,i.cache=this),t.status=i;let s=this.#J(e,t);return S.hasSubscribers&&S.publish(i),s}#J(e,t){let{status:i,allowStale:s=this.allowStale}=t,n=this.#s.get(e);if(n===void 0||!s&&this.#p(n)){i&&(i.peek=n===void 0?"miss":"stale");return}let r=this.#t[n],h=this.#e(r)?r.__staleWhileFetching:r;return i&&(h!==void 0?(i.peek="hit",i.value=h):i.peek="miss"),h}#P(e,t,i,s){let n=t===void 0?void 0:this.#t[t];if(this.#e(n))return n;let r=new AbortController,{signal:h}=i;h?.addEventListener("abort",()=>r.abort(h.reason),{signal:r.signal});let a={signal:r.signal,options:i,context:s},o=(f,b=!1)=>{let{aborted:l}=r.signal,w=i.ignoreFetchAbort&&f!==void 0,F=i.ignoreFetchAbort||!!(i.allowStaleOnFetchAbort&&f!==void 0);if(i.status&&(l&&!b?(i.status.fetchAborted=!0,i.status.fetchError=r.signal.reason,w&&(i.status.fetchAbortIgnored=!0)):i.status.fetchResolved=!0),l&&!w&&!b)return y(r.signal.reason,F);let m=c,p=this.#t[t];return(p===c||p===void 0&&w&&b)&&(f===void 0?m.__staleWhileFetching!==void 0?this.#t[t]=m.__staleWhileFetching:this.#E(e,"fetch"):(i.status&&(i.status.fetchUpdated=!0),this.#W(e,f,a.options,m))),f},d=f=>(i.status&&(i.status.fetchRejected=!0,i.status.fetchError=f),y(f,!1)),y=(f,b)=>{let{aborted:l}=r.signal,w=l&&i.allowStaleOnFetchAbort,F=w||i.allowStaleOnFetchRejection,m=F||i.noDeleteOnFetchRejection,p=c;if(this.#t[t]===c&&(!m||!b&&p.__staleWhileFetching===void 0?this.#E(e,"fetch"):w||(this.#t[t]=p.__staleWhileFetching)),F)return i.status&&p.__staleWhileFetching!==void 0&&(i.status.returnedStale=!0),p.__staleWhileFetching;if(p.__returned===p)throw f},_=(f,b)=>{let l=this.#M?.(e,n,a);r.signal.addEventListener("abort",()=>{(!i.ignoreFetchAbort||i.allowStaleOnFetchAbort)&&(f(void 0),i.allowStaleOnFetchAbort&&(f=w=>o(w,!0)))}),l&&l instanceof Promise?l.then(w=>f(w===void 0?void 0:w),b):l!==void 0&&f(l)};i.status&&(i.status.fetchDispatched=!0);let c=new Promise(_).then(o,d),g=Object.assign(c,{__abortController:r,__staleWhileFetching:n,__returned:void 0});return t===void 0?(this.#W(e,g,{...a.options,status:void 0}),t=this.#s.get(e)):this.#t[t]=g,g}#e(e){if(!this.#U)return!1;let t=e;return!!t&&t instanceof Promise&&t.hasOwnProperty("__staleWhileFetching")&&t.__abortController instanceof AbortController}fetch(e,t={}){let i=W.hasSubscribers,{status:s=D()?{}:void 0}=t;t.status=s,s&&t.context&&(s.context=t.context);let n=this.#B(e,t);return s&&i&&(s.trace=!0,W.tracePromise(()=>n,s).catch(()=>{})),n}async#B(e,t={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,ttl:r=this.ttl,noDisposeOnSet:h=this.noDisposeOnSet,size:a=0,sizeCalculation:o=this.sizeCalculation,noUpdateTTL:d=this.noUpdateTTL,noDeleteOnFetchRejection:y=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:_=this.allowStaleOnFetchRejection,ignoreFetchAbort:c=this.ignoreFetchAbort,allowStaleOnFetchAbort:g=this.allowStaleOnFetchAbort,context:f,forceRefresh:b=!1,status:l,signal:w}=t;if(l&&(l.op="fetch",l.key=e,b&&(l.forceRefresh=!0),l.cache=this),!this.#U)return l&&(l.fetch="get"),this.#C(e,{allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:n,status:l});let F={allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:n,ttl:r,noDisposeOnSet:h,size:a,sizeCalculation:o,noUpdateTTL:d,noDeleteOnFetchRejection:y,allowStaleOnFetchRejection:_,allowStaleOnFetchAbort:g,ignoreFetchAbort:c,status:l,signal:w},m=this.#s.get(e);if(m===void 0){l&&(l.fetch="miss");let p=this.#P(e,m,F,f);return p.__returned=p}else{let p=this.#t[m];if(this.#e(p)){let v=i&&p.__staleWhileFetching!==void 0;return l&&(l.fetch="inflight",v&&(l.returnedStale=!0)),v?p.__staleWhileFetching:p.__returned=p}let A=this.#p(m);if(!b&&!A)return l&&(l.fetch="hit"),this.#L(m),s&&this.#D(m),l&&this.#v(l,m),p;let z=this.#P(e,m,F,f),E=z.__staleWhileFetching!==void 0&&i;return l&&(l.fetch=A?"stale":"refresh",E&&A&&(l.returnedStale=!0)),E?z.__staleWhileFetching:z.__returned=z}}forceFetch(e,t={}){let i=W.hasSubscribers,{status:s=D()?{}:void 0}=t;t.status=s,s&&t.context&&(s.context=t.context);let n=this.#K(e,t);return s&&i&&(s.trace=!0,W.tracePromise(()=>n,s).catch(()=>{})),n}async#K(e,t={}){let i=await this.#B(e,t);if(i===void 0)throw new Error("fetch() returned undefined");return i}memo(e,t={}){let{status:i=S.hasSubscribers?{}:void 0}=t;t.status=i,i&&(i.op="memo",i.key=e,t.context&&(i.context=t.context),i.cache=this);let s=this.#Q(e,t);return i&&(i.value=s),S.hasSubscribers&&S.publish(i),s}#Q(e,t={}){let i=this.#I;if(!i)throw new Error("no memoMethod provided to constructor");let{context:s,status:n,forceRefresh:r,...h}=t;n&&r&&(n.forceRefresh=!0);let a=this.#C(e,h),o=r||a===void 0;if(n&&(n.memo=o?"miss":"hit",o||(n.value=a)),!o)return a;let d=i(e,a,{options:h,context:s});return n&&(n.value=d),this.#W(e,d,h),d}get(e,t={}){let{status:i=S.hasSubscribers?{}:void 0}=t;t.status=i,i&&(i.op="get",i.key=e,i.cache=this);let s=this.#C(e,t);return i&&(s!==void 0&&(i.value=s),S.hasSubscribers&&S.publish(i)),s}#C(e,t={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,status:r}=t,h=this.#s.get(e);if(h===void 0){r&&(r.get="miss");return}let a=this.#t[h],o=this.#e(a);return r&&this.#v(r,h),this.#p(h)?o?(r&&(r.get="stale-fetching"),i&&a.__staleWhileFetching!==void 0?(r&&(r.returnedStale=!0),a.__staleWhileFetching):void 0):(n||this.#E(e,"expire"),r&&(r.get="stale"),i?(r&&(r.returnedStale=!0),a):void 0):(r&&(r.get=o?"fetching":"hit"),this.#L(h),s&&this.#D(h),o?a.__staleWhileFetching:a)}#$(e,t){this.#u[t]=e,this.#l[e]=t}#L(e){e!==this.#h&&(e===this.#a?this.#a=this.#l[e]:this.#$(this.#u[e],this.#l[e]),this.#$(this.#h,e),this.#h=e)}delete(e){return this.#E(e,"delete")}#E(e,t){S.hasSubscribers&&S.publish({op:"delete",delete:t,key:e,cache:this});let i=!1;if(this.#n!==0){let s=this.#s.get(e);if(s!==void 0)if(this.#g?.[s]&&(clearTimeout(this.#g?.[s]),this.#g[s]=void 0),i=!0,this.#n===1)this.#q(t);else{this.#R(s);let n=this.#t[s];if(this.#e(n)?n.__abortController.abort(new Error("deleted")):(this.#T||this.#f)&&(this.#T&&this.#S?.(n,e,t),this.#f&&this.#r?.push([n,e,t])),this.#s.delete(e),this.#i[s]=void 0,this.#t[s]=void 0,s===this.#h)this.#h=this.#u[s];else if(s===this.#a)this.#a=this.#l[s];else{let r=this.#u[s];this.#l[r]=this.#l[s];let h=this.#l[s];this.#u[h]=this.#u[s]}this.#n--,this.#y.push(s)}}if(this.#f&&this.#r?.length){let s=this.#r,n;for(;n=s?.shift();)this.#w?.(...n)}return i}clear(){return this.#q("delete")}#q(e){for(let t of this.#z({allowStale:!0})){let i=this.#t[t];if(this.#e(i))i.__abortController.abort(new Error("deleted"));else{let s=this.#i[t];this.#T&&this.#S?.(i,s,e),this.#f&&this.#r?.push([i,s,e])}}if(this.#s.clear(),this.#t.fill(void 0),this.#i.fill(void 0),this.#d&&this.#F){this.#d.fill(0),this.#F.fill(0);for(let t of this.#g??[])t!==void 0&&clearTimeout(t);this.#g?.fill(void 0)}if(this.#_&&this.#_.fill(0),this.#a=0,this.#h=0,this.#y.length=0,this.#b=0,this.#n=0,this.#f&&this.#r){let t=this.#r,i;for(;i=t?.shift();)this.#w?.(...i)}}};export{I as LRUCache}; +//# sourceMappingURL=index.min.js.map diff --git a/node_modules/lru-cache/dist/esm/node/index.min.js.map b/node_modules/lru-cache/dist/esm/node/index.min.js.map new file mode 100644 index 00000000..76a87846 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/node/index.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../src/diagnostics-channel-node.ts", "../../../src/perf.ts", "../../../src/index.ts"], + "sourcesContent": ["// simple node version that imports from node builtin\n// this is built to both ESM and CommonJS on the 'node' import path\nimport { tracingChannel, channel } from 'node:diagnostics_channel'\nimport type { TracingChannel, Channel } from 'node:diagnostics_channel'\nexport type { TracingChannel, Channel }\nexport const metrics: Channel = channel('lru-cache:metrics')\nexport const tracing: TracingChannel = tracingChannel('lru-cache')\n", "/**\n * this provides the default Perf object source, either the\n * `performance` global, or the `Date` constructor.\n *\n * it can be passed in via configuration to override it\n * for a single LRU object.\n */\nexport type Perf = { now: () => number }\nexport const defaultPerf: Perf =\n (\n typeof performance === 'object' &&\n performance &&\n typeof performance.now === 'function'\n ) ?\n /* c8 ignore start - this gets covered, but c8 gets confused */\n performance\n : /* c8 ignore stop */ Date\n", "/**\n * @module LRUCache\n */\n\nimport { metrics, tracing } from './diagnostics-channel.js'\nimport { defaultPerf } from './perf.js'\nimport type { Perf } from './perf.js'\nexport type { Perf } from './perf.js'\n\nconst hasSubscribers = () =>\n metrics.hasSubscribers || tracing.hasSubscribers\n\nconst warned = new Set()\n\n// either a function or a class\n// oxlint-disable-next-line no-explicit-any\ntype ForC = ((...a: any[]) => any) | { new (...a: any[]): any }\n\n/* c8 ignore start */\nconst PROCESS = (\n typeof process === 'object' && !!process ?\n process\n : {}) as { [k: string]: unknown }\n/* c8 ignore stop */\n\nconst emitWarning = (\n msg: string,\n type: string,\n code: string,\n fn: ForC,\n) => {\n if (typeof PROCESS.emitWarning === 'function') {\n PROCESS.emitWarning(msg, type, code, fn)\n } else {\n //oxlint-disable-next-line no-console\n console.error(`[${code}] ${type}: ${msg}`)\n }\n}\nconst shouldWarn = (code: string) => !warned.has(code)\n\nconst TYPE = Symbol('type')\nexport type PosInt = number & { [TYPE]: 'Positive Integer' }\nexport type Index = number & { [TYPE]: 'LRUCache Index' }\n\nconst isPosInt = (n: unknown): n is PosInt =>\n !!n && n === Math.floor(n as number) && n > 0 && isFinite(n)\n\nexport type UintArray = Uint8Array | Uint16Array | Uint32Array\nexport type NumberArray = UintArray | number[]\n\n// This is a little bit ridiculous, tbh.\n// The maximum array length is 2^32-1 or thereabouts on most JS impls.\n// And well before that point, you're caching the entire world, I mean,\n// that's ~32GB of just integers for the next/prev links, plus whatever\n// else to hold that many keys and values. Just filling the memory with\n// zeroes at init time is brutal when you get that big.\n// But why not be complete?\n// Maybe in the future, these limits will have expanded.\n/* c8 ignore start */\nconst getUintArray = (max: number) =>\n !isPosInt(max) ? null\n : max <= Math.pow(2, 8) ? Uint8Array\n : max <= Math.pow(2, 16) ? Uint16Array\n : max <= Math.pow(2, 32) ? Uint32Array\n : max <= Number.MAX_SAFE_INTEGER ? ZeroArray\n : null\n/* c8 ignore stop */\n\nclass ZeroArray extends Array {\n constructor(size: number) {\n super(size)\n this.fill(0)\n }\n}\nexport type { ZeroArray }\nexport type { Stack }\n\nexport type StackLike = Stack | Index[]\nclass Stack {\n /* c8 ignore start - not sure why this is showing up uncovered?? */\n heap: NumberArray\n /* c8 ignore stop */\n length: number\n // private constructor\n static #constructing: boolean = false\n static create(max: number): StackLike {\n const HeapCls = getUintArray(max)\n if (!HeapCls) return []\n Stack.#constructing = true\n const s = new Stack(max, HeapCls)\n Stack.#constructing = false\n return s\n }\n constructor(max: number, HeapCls: { new (n: number): NumberArray }) {\n /* c8 ignore start */\n if (!Stack.#constructing) {\n throw new TypeError('instantiate Stack using Stack.create(n)')\n }\n /* c8 ignore stop */\n this.heap = new HeapCls(max)\n this.length = 0\n }\n push(n: Index) {\n this.heap[this.length++] = n\n }\n pop(): Index {\n return this.heap[--this.length] as Index\n }\n}\n\n/**\n * Promise representing an in-progress {@link LRUCache#fetch} call\n */\nexport type BackgroundFetch = Promise & {\n __returned: BackgroundFetch | undefined\n __abortController: AbortController\n __staleWhileFetching: V | undefined\n}\n\nexport type DisposeTask = [\n value: V,\n key: K,\n reason: LRUCache.DisposeReason,\n]\n\nexport namespace LRUCache {\n /**\n * An integer greater than 0, reflecting the calculated size of items\n */\n export type Size = number\n\n /**\n * Integer greater than 0, representing some number of milliseconds, or the\n * time at which a TTL started counting from.\n */\n export type Milliseconds = number\n\n /**\n * An integer greater than 0, reflecting a number of items\n */\n export type Count = number\n\n /**\n * The reason why an item was removed from the cache, passed\n * to the {@link Disposer} methods.\n *\n * - `evict`: The item was evicted because it is the least recently used,\n * and the cache is full.\n * - `set`: A new value was set, overwriting the old value being disposed.\n * - `delete`: The item was explicitly deleted, either by calling\n * {@link LRUCache#delete}, {@link LRUCache#clear}, or\n * {@link LRUCache#set} with an undefined value.\n * - `expire`: The item was removed due to exceeding its TTL.\n * - `fetch`: A {@link OptionsBase#fetchMethod} operation returned\n * `undefined` or was aborted, causing the item to be deleted.\n */\n export type DisposeReason =\n | 'evict'\n | 'set'\n | 'delete'\n | 'expire'\n | 'fetch'\n /**\n * A method called upon item removal, passed as the\n * {@link OptionsBase.dispose} and/or\n * {@link OptionsBase.disposeAfter} options.\n */\n export type Disposer = (\n value: V,\n key: K,\n reason: DisposeReason,\n ) => void\n\n /**\n * The reason why an item was added to the cache, passed\n * to the {@link Inserter} methods.\n *\n * - `add`: the item was not found in the cache, and was added\n * - `update`: the item was in the cache, with the same value provided\n * - `replace`: the item was in the cache, and replaced\n */\n export type InsertReason = 'add' | 'update' | 'replace'\n\n /**\n * A method called upon item insertion, passed as the\n * {@link OptionsBase.insert}\n */\n export type Inserter = (\n value: V,\n key: K,\n reason: InsertReason,\n ) => void\n\n /**\n * A function that returns the effective calculated size\n * of an entry in the cache.\n */\n export type SizeCalculator = (value: V, key: K) => Size\n\n /**\n * Options provided to the\n * {@link OptionsBase.fetchMethod} function.\n */\n export interface FetcherOptions {\n signal: AbortSignal\n options: FetcherFetchOptions\n /**\n * Object provided in the {@link FetchOptions.context} option to\n * {@link LRUCache#fetch}\n */\n context: FC\n }\n\n /**\n * Occasionally, it may be useful to track the internal behavior of the\n * cache, particularly for logging, debugging, or for behavior within the\n * `fetchMethod`. To do this, you can pass a `status` object to the\n * {@link LRUCache#fetch}, {@link LRUCache#get}, {@link LRUCache#set},\n * {@link LRUCache#memo}, and {@link LRUCache#has} methods.\n *\n * The `status` option should be a plain JavaScript object. The following\n * fields will be set on it appropriately, depending on the situation.\n *\n * These objects are also the context objects passed to listeners on the\n * `lru-cache:metrics` diagnostic channel, and the `lru-cache` tracing\n * channels, in platforms that support them.\n */\n export interface Status {\n /**\n * The operation being performed\n */\n op?: 'get' | 'set' | 'memo' | 'fetch' | 'delete' | 'has' | 'peek'\n /**\n * The status of a set() operation.\n *\n * - add: the item was not found in the cache, and was added\n * - update: the item was in the cache, with the same value provided\n * - replace: the item was in the cache, and replaced\n * - miss: the item was not added to the cache for some reason\n */\n set?: 'add' | 'update' | 'replace' | 'miss' | 'deleted'\n\n /**\n * The status of a delete() operation.\n */\n delete?: LRUCache.DisposeReason\n\n /**\n * The result of a peek() operation\n *\n * - hit: the item was found and returned\n * - stale: the item is in the cache, but past its ttl and not returned\n * - miss: item not in the cache\n */\n peek?: 'hit' | 'miss' | 'stale'\n\n /**\n * The status of a memo() operation.\n *\n * - 'hit': the item was found in the cache and returned\n * - 'miss': the `memoMethod` function was called\n */\n memo?: 'hit' | 'miss'\n\n /**\n * The `context` option provided to a memo or fetch operation\n *\n * In practice, of course, this will be the same type as the `FC`\n * fetch context param used to instantiate the LRUCache, but the\n * convolutions of threading that through would get quite complicated,\n * and preclude forcing/forbidding the passing of a `context` param\n * where it is/isn't expected, which is more valuable for error\n * prevention.\n */\n context?: unknown\n\n /**\n * the ttl stored for the item, or undefined if ttls are not used.\n */\n ttl?: Milliseconds\n\n /**\n * the start time for the item, or undefined if ttls are not used.\n */\n start?: Milliseconds\n\n /**\n * The timestamp used for TTL calculation\n */\n now?: Milliseconds\n\n /**\n * the remaining ttl for the item, or undefined if ttls are not used.\n */\n remainingTTL?: Milliseconds\n\n /**\n * The calculated size for the item, if sizes are used.\n */\n entrySize?: Size\n\n /**\n * The total calculated size of the cache, if sizes are used.\n */\n totalCalculatedSize?: Size\n\n /**\n * A flag indicating that the item was not stored, due to exceeding the\n * {@link OptionsBase.maxEntrySize}\n */\n maxEntrySizeExceeded?: true\n\n /**\n * The key that was set or retrieved\n */\n key?: K\n\n /**\n * The value that was set\n */\n value?: V\n\n /**\n * The old value, specified in the case of `set:'replace'`\n */\n oldValue?: V\n\n /**\n * The results of a {@link LRUCache#has} operation\n *\n * - hit: the item was found in the cache\n * - stale: the item was found in the cache, but is stale\n * - miss: the item was not found in the cache\n */\n has?: 'hit' | 'stale' | 'miss'\n\n /**\n * The status of a {@link LRUCache#fetch} operation.\n * Note that this can change as the underlying fetch() moves through\n * various states.\n *\n * - inflight: there is another fetch() for this key which is in process\n * - get: there is no {@link OptionsBase.fetchMethod}, so\n * {@link LRUCache#get} was called.\n * - miss: the item is not in cache, and will be fetched.\n * - hit: the item is in the cache, and was resolved immediately.\n * - stale: the item is in the cache, but stale.\n * - refresh: the item is in the cache, and not stale, but\n * {@link FetchOptions.forceRefresh} was specified.\n */\n fetch?: 'get' | 'inflight' | 'miss' | 'hit' | 'stale' | 'refresh'\n\n /**\n * `forceRefresh` option was used for either a fetch or memo operation\n */\n forceRefresh?: boolean\n\n /**\n * The {@link OptionsBase.fetchMethod} was called\n */\n fetchDispatched?: true\n\n /**\n * The cached value was updated after a successful call to\n * {@link OptionsBase.fetchMethod}\n */\n fetchUpdated?: true\n\n /**\n * The reason for a fetch() rejection. Either the error raised by the\n * {@link OptionsBase.fetchMethod}, or the reason for an\n * AbortSignal.\n */\n fetchError?: Error\n\n /**\n * The fetch received an abort signal\n */\n fetchAborted?: true\n\n /**\n * The abort signal received was ignored, and the fetch was allowed to\n * continue in the background.\n */\n fetchAbortIgnored?: true\n\n /**\n * The fetchMethod promise resolved successfully\n */\n fetchResolved?: true\n\n /**\n * The fetchMethod promise was rejected\n */\n fetchRejected?: true\n\n /**\n * The status of a {@link LRUCache#get} operation.\n *\n * - fetching: The item is currently being fetched. If a previous value\n * is present and allowed, that will be returned.\n * - stale: The item is in the cache, and is stale. If it was returned,\n * then the `returnedStale` flag will be set.\n * - stale-fetching: The value is being fetched in the background, but is\n * currently stale. If the stale value was returned, then the\n * `returnedStale` flag will be set.\n * - hit: the item is in the cache\n * - miss: the item is not in the cache\n */\n get?: 'stale' | 'hit' | 'miss' | 'fetching' | 'stale-fetching'\n\n /**\n * A fetch or get operation returned a stale value.\n */\n returnedStale?: true\n\n /**\n * A tracingChannel trace was started for this operation\n */\n trace?: boolean\n\n /**\n * A reference to the cache instance associated with this operation\n */\n cache?: LRUCache\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#fetch}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link OptionsBase.noDeleteOnFetchRejection},\n * {@link OptionsBase.allowStaleOnFetchRejection},\n * {@link FetchOptions.forceRefresh}, and\n * {@link FetcherOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.fetchMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the fetchMethod is called.\n */\n export interface FetcherFetchOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n status?: Status\n size?: Size\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#fetch} method.\n */\n export interface FetchOptions extends FetcherFetchOptions<\n K,\n V,\n FC\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.fetchMethod} as\n * the {@link FetcherOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n signal?: AbortSignal\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface FetchOptionsWithContext extends FetchOptions<\n K,\n V,\n FC\n > {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is\n * `undefined` or `void`\n */\n export interface FetchOptionsNoContext<\n K,\n V,\n FC extends undefined | void = undefined,\n > extends FetchOptions {\n context?: FC\n }\n\n export interface MemoOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.memoMethod} as\n * the {@link MemoizerOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface MemoOptionsWithContext extends MemoOptions<\n K,\n V,\n FC\n > {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is\n * `undefined` or `void`\n */\n export interface MemoOptionsNoContext<\n K,\n V,\n FC extends undefined | void = undefined,\n > extends MemoOptions {\n context?: FC\n }\n\n /**\n * Options provided to the\n * {@link OptionsBase.memoMethod} function.\n */\n export interface MemoizerOptions {\n options: MemoizerMemoOptions\n /**\n * Object provided in the {@link MemoOptions.context} option to\n * {@link LRUCache#memo}\n */\n context: FC\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#memo}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link MemoOptions.forceRefresh}, and\n * {@link MemoOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.memoMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the memoMethod is called.\n */\n export interface MemoizerMemoOptions extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n > {\n status?: Status\n size?: Size\n start?: Milliseconds\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#has} method.\n */\n export interface HasOptions extends Pick<\n OptionsBase,\n 'updateAgeOnHas'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#get} method.\n */\n export interface GetOptions extends Pick<\n OptionsBase,\n 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#peek} method.\n */\n export interface PeekOptions extends Pick<\n OptionsBase,\n 'allowStale'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#set} method.\n */\n export interface SetOptions extends Pick<\n OptionsBase,\n 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'\n > {\n /**\n * If size tracking is enabled, then setting an explicit size\n * in the {@link LRUCache#set} call will prevent calling the\n * {@link OptionsBase.sizeCalculation} function.\n */\n size?: Size\n /**\n * If TTL tracking is enabled, then setting an explicit start\n * time in the {@link LRUCache#set} call will override the\n * default time from `performance.now()` or `Date.now()`.\n *\n * Note that it must be a valid value for whichever time-tracking\n * method is in use.\n */\n start?: Milliseconds\n status?: Status\n }\n\n /**\n * The type signature for the {@link OptionsBase.fetchMethod} option.\n */\n export type Fetcher = (\n key: K,\n staleValue: V | undefined,\n options: FetcherOptions,\n ) => Promise | V | undefined | void\n\n /**\n * the type signature for the {@link OptionsBase.memoMethod} option.\n */\n export type Memoizer = (\n key: K,\n staleValue: V | undefined,\n options: MemoizerOptions,\n ) => V\n\n /**\n * Options which may be passed to the {@link LRUCache} constructor.\n *\n * Most of these may be overridden in the various options that use\n * them.\n *\n * Despite all being technically optional, the constructor requires that\n * a cache is at minimum limited by one or more of {@link OptionsBase.max},\n * {@link OptionsBase.ttl}, or {@link OptionsBase.maxSize}.\n *\n * If {@link OptionsBase.ttl} is used alone, then it is strongly advised\n * (and in fact required by the type definitions here) that the cache\n * also set {@link OptionsBase.ttlAutopurge}, to prevent potentially\n * unbounded storage.\n *\n * All options are also available on the {@link LRUCache} instance, making\n * it safe to pass an LRUCache instance as the options argumemnt to\n * make another empty cache of the same type.\n *\n * Some options are marked as read-only, because changing them after\n * instantiation is not safe. Changing any of the other options will of\n * course only have an effect on subsequent method calls.\n */\n export interface OptionsBase {\n /**\n * The maximum number of items to store in the cache before evicting\n * old entries. This is read-only on the {@link LRUCache} instance,\n * and may not be overridden.\n *\n * If set, then storage space will be pre-allocated at construction\n * time, and the cache will perform significantly faster.\n *\n * Note that significantly fewer items may be stored, if\n * {@link OptionsBase.maxSize} and/or {@link OptionsBase.ttl} are also\n * set.\n *\n * **It is strongly recommended to set a `max` to prevent unbounded growth\n * of the cache.**\n */\n max?: Count\n\n /**\n * Max time in milliseconds for items to live in cache before they are\n * considered stale. Note that stale items are NOT preemptively removed by\n * default, and MAY live in the cache, contributing to its LRU max, long\n * after they have expired, unless {@link OptionsBase.ttlAutopurge} is\n * set.\n *\n * If set to `0` (the default value), then that means \"do not track\n * TTL\", not \"expire immediately\".\n *\n * Also, as this cache is optimized for LRU/MRU operations, some of\n * the staleness/TTL checks will reduce performance, as they will incur\n * overhead by deleting items.\n *\n * This is not primarily a TTL cache, and does not make strong TTL\n * guarantees. There is no pre-emptive pruning of expired items, but you\n * _may_ set a TTL on the cache, and it will treat expired items as missing\n * when they are fetched, and delete them.\n *\n * Optional, but must be a non-negative integer in ms if specified.\n *\n * This may be overridden by passing an options object to `cache.set()`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if ttl tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * If ttl tracking is enabled, and `max` and `maxSize` are not set,\n * and `ttlAutopurge` is not set, then a warning will be emitted\n * cautioning about the potential for unbounded memory consumption.\n * (The TypeScript definitions will also discourage this.)\n */\n ttl?: Milliseconds\n\n /**\n * Minimum amount of time in ms in which to check for staleness.\n * Defaults to 1, which means that the current time is checked\n * at most once per millisecond.\n *\n * Set to 0 to check the current time every time staleness is tested.\n * (This reduces performance, and is theoretically unnecessary.)\n *\n * Setting this to a higher value will improve performance somewhat\n * while using ttl tracking, albeit at the expense of keeping stale\n * items around a bit longer than their TTLs would indicate.\n *\n * @default 1\n */\n ttlResolution?: Milliseconds\n\n /**\n * Preemptively remove stale items from the cache.\n *\n * Note that this may *significantly* degrade performance, especially if\n * the cache is storing a large number of items. It is almost always best\n * to just leave the stale items in the cache, and let them fall out as new\n * items are added.\n *\n * Note that this means that {@link OptionsBase.allowStale} is a bit\n * pointless, as stale items will be deleted almost as soon as they\n * expire.\n *\n * Use with caution!\n */\n ttlAutopurge?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever it is retrieved from cache with\n * {@link LRUCache#get}, causing it to not expire. (It can still fall out\n * of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n */\n updateAgeOnGet?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever its presence in the cache is\n * checked with {@link LRUCache#has}, causing it to not expire. (It can\n * still fall out of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n */\n updateAgeOnHas?: boolean\n\n /**\n * Allow {@link LRUCache#get} and {@link LRUCache#fetch} calls to return\n * stale data, if available.\n *\n * By default, if you set `ttl`, stale items will only be deleted from the\n * cache when you `get(key)`. That is, it's not preemptively pruning items,\n * unless {@link OptionsBase.ttlAutopurge} is set.\n *\n * If you set `allowStale:true`, it'll return the stale value *as well as*\n * deleting it. If you don't set this, then it'll return `undefined` when\n * you try to get a stale entry.\n *\n * Note that when a stale entry is fetched, _even if it is returned due to\n * `allowStale` being set_, it is removed from the cache immediately. You\n * can suppress this behavior by setting\n * {@link OptionsBase.noDeleteOnStaleGet}, either in the constructor, or in\n * the options provided to {@link LRUCache#get}.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n * The `cache.has()` method will always return `false` for stale items.\n *\n * Only relevant if a ttl is set.\n */\n allowStale?: boolean\n\n /**\n * Function that is called on items when they are dropped from the\n * cache, as `dispose(value, key, reason)`.\n *\n * This can be handy if you want to close file descriptors or do\n * other cleanup tasks when items are no longer stored in the cache.\n *\n * **NOTE**: It is called _before_ the item has been fully removed\n * from the cache, so if you want to put it right back in, you need\n * to wait until the next tick. If you try to add it back in during\n * the `dispose()` function call, it will break things in subtle and\n * weird ways.\n *\n * Unlike several other options, this may _not_ be overridden by\n * passing an option to `set()`, for performance reasons.\n *\n * The `reason` will be one of the following strings, corresponding\n * to the reason for the item's deletion:\n *\n * - `evict` Item was evicted to make space for a new addition\n * - `set` Item was overwritten by a new value\n * - `expire` Item expired its TTL\n * - `fetch` Item was deleted due to a failed or aborted fetch, or a\n * fetchMethod returning `undefined.\n * - `delete` Item was removed by explicit `cache.delete(key)`,\n * `cache.clear()`, or `cache.set(key, undefined)`.\n */\n dispose?: Disposer\n\n /**\n * Function that is called when new items are inserted into the cache,\n * as `onInsert(value, key, reason)`.\n *\n * This can be useful if you need to perform actions when an item is\n * added, such as logging or tracking insertions.\n *\n * Unlike some other options, this may _not_ be overridden by passing\n * an option to `set()`, for performance and consistency reasons.\n */\n onInsert?: Inserter\n\n /**\n * The same as {@link OptionsBase.dispose}, but called *after* the entry\n * is completely removed and the cache is once again in a clean state.\n *\n * It is safe to add an item right back into the cache at this point.\n * However, note that it is *very* easy to inadvertently create infinite\n * recursion this way.\n */\n disposeAfter?: Disposer\n\n /**\n * Set to true to suppress calling the\n * {@link OptionsBase.dispose} function if the entry key is\n * still accessible within the cache.\n *\n * This may be overridden by passing an options object to\n * {@link LRUCache#set}.\n *\n * Only relevant if `dispose` or `disposeAfter` are set.\n */\n noDisposeOnSet?: boolean\n\n /**\n * Boolean flag to tell the cache to not update the TTL when setting a new\n * value for an existing key (ie, when updating a value rather than\n * inserting a new value). Note that the TTL value is _always_ set (if\n * provided) when adding a new entry into the cache.\n *\n * Has no effect if a {@link OptionsBase.ttl} is not set.\n *\n * May be passed as an option to {@link LRUCache#set}.\n */\n noUpdateTTL?: boolean\n\n /**\n * Set to a positive integer to track the sizes of items added to the\n * cache, and automatically evict items in order to stay below this size.\n * Note that this may result in fewer than `max` items being stored.\n *\n * Attempting to add an item to the cache whose calculated size is greater\n * that this amount will be a no-op. The item will not be cached, and no\n * other items will be evicted.\n *\n * Optional, must be a positive integer if provided.\n *\n * Sets `maxEntrySize` to the same value, unless a different value is\n * provided for `maxEntrySize`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if size tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * Note also that size tracking can negatively impact performance,\n * though for most cases, only minimally.\n */\n maxSize?: Size\n\n /**\n * The effective size for background fetch promises.\n *\n * This has no effect unless `maxSize` and `sizeCalculation` are used,\n * and a {@link LRUCache.OptionsBase.fetchMethod} is provided to\n * support {@link LRUCache#fetch}.\n *\n * If a stale value is present in the cache, then the effective size of\n * the background fetch is the size of the stale item it will eventually\n * replace. If not, then this value is used as its effective size.\n *\n * @default 1\n */\n backgroundFetchSize?: number\n\n /**\n * The maximum allowed size for any single item in the cache.\n *\n * If a larger item is passed to {@link LRUCache#set} or returned by a\n * {@link OptionsBase.fetchMethod} or {@link OptionsBase.memoMethod}, then\n * it will not be stored in the cache.\n *\n * Attempting to add an item whose calculated size is greater than\n * this amount will not cache the item or evict any old items, but\n * WILL delete an existing value if one is already present.\n *\n * Optional, must be a positive integer if provided. Defaults to\n * the value of `maxSize` if provided.\n */\n maxEntrySize?: Size\n\n /**\n * A function that returns a number indicating the item's size.\n *\n * Requires {@link OptionsBase.maxSize} to be set.\n *\n * If not provided, and {@link OptionsBase.maxSize} or\n * {@link OptionsBase.maxEntrySize} are set, then all\n * {@link LRUCache#set} calls **must** provide an explicit\n * {@link SetOptions.size} or sizeCalculation param.\n */\n sizeCalculation?: SizeCalculator\n\n /**\n * Method that provides the implementation for {@link LRUCache#fetch}\n *\n * ```ts\n * fetchMethod(key, staleValue, { signal, options, context })\n * ```\n *\n * If `fetchMethod` is not provided, then `cache.fetch(key)` is equivalent\n * to `Promise.resolve(cache.get(key))`.\n *\n * If at any time, `signal.aborted` is set to `true`, or if the\n * `signal.onabort` method is called, or if it emits an `'abort'` event\n * which you can listen to with `addEventListener`, then that means that\n * the fetch should be abandoned. This may be passed along to async\n * functions aware of AbortController/AbortSignal behavior.\n *\n * The `fetchMethod` should **only** return `undefined` or a Promise\n * resolving to `undefined` if the AbortController signaled an `abort`\n * event. In all other cases, it should return or resolve to a value\n * suitable for adding to the cache.\n *\n * The `options` object is a union of the options that may be provided to\n * `set()` and `get()`. If they are modified, then that will result in\n * modifying the settings to `cache.set()` when the value is resolved, and\n * in the case of\n * {@link OptionsBase.noDeleteOnFetchRejection} and\n * {@link OptionsBase.allowStaleOnFetchRejection}, the handling of\n * `fetchMethod` failures.\n *\n * For example, a DNS cache may update the TTL based on the value returned\n * from a remote DNS server by changing `options.ttl` in the `fetchMethod`.\n */\n fetchMethod?: Fetcher\n\n /**\n * Method that provides the implementation for {@link LRUCache#memo}\n */\n memoMethod?: Memoizer\n\n /**\n * Set to true to suppress the deletion of stale data when a\n * {@link OptionsBase.fetchMethod} returns a rejected promise.\n */\n noDeleteOnFetchRejection?: boolean\n\n /**\n * Do not delete stale items when they are retrieved with\n * {@link LRUCache#get}.\n *\n * Note that the `get` return value will still be `undefined`\n * unless {@link OptionsBase.allowStale} is true.\n *\n * When using time-expiring entries with `ttl`, by default stale\n * items will be removed from the cache when the key is accessed\n * with `cache.get()`.\n *\n * Setting this option will cause stale items to remain in the cache, until\n * they are explicitly deleted with `cache.delete(key)`, or retrieved with\n * `noDeleteOnStaleGet` set to `false`.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n *\n * Only relevant if a ttl is used.\n */\n noDeleteOnStaleGet?: boolean\n\n /**\n * Set to true to allow returning stale data when a\n * {@link OptionsBase.fetchMethod} throws an error or returns a rejected\n * promise.\n *\n * This differs from using {@link OptionsBase.allowStale} in that stale\n * data will ONLY be returned in the case that the {@link LRUCache#fetch}\n * fails, not any other times.\n *\n * If a `fetchMethod` fails, and there is no stale value available, the\n * `fetch()` will resolve to `undefined`. Ie, all `fetchMethod` errors are\n * suppressed.\n *\n * Implies `noDeleteOnFetchRejection`.\n *\n * This may be set in calls to `fetch()`, or defaulted on the constructor,\n * or overridden by modifying the options object in the `fetchMethod`.\n */\n allowStaleOnFetchRejection?: boolean\n\n /**\n * Set to true to return a stale value from the cache when the\n * `AbortSignal` passed to the {@link OptionsBase.fetchMethod} dispatches\n * an `'abort'` event, whether user-triggered, or due to internal cache\n * behavior.\n *\n * Unless {@link OptionsBase.ignoreFetchAbort} is also set, the underlying\n * {@link OptionsBase.fetchMethod} will still be considered canceled, and\n * any value it returns will be ignored and not cached.\n *\n * Caveat: since fetches are aborted when a new value is explicitly\n * set in the cache, this can lead to fetch returning a stale value,\n * since that was the fallback value _at the moment the `fetch()` was\n * initiated_, even though the new updated value is now present in\n * the cache.\n *\n * For example:\n *\n * ```ts\n * const cache = new LRUCache({\n * ttl: 100,\n * fetchMethod: async (url, oldValue, { signal }) => {\n * const res = await fetch(url, { signal })\n * return await res.json()\n * }\n * })\n * cache.set('https://example.com/', { some: 'data' })\n * // 100ms go by...\n * const result = cache.fetch('https://example.com/')\n * cache.set('https://example.com/', { other: 'thing' })\n * console.log(await result) // { some: 'data' }\n * console.log(cache.get('https://example.com/')) // { other: 'thing' }\n * ```\n */\n allowStaleOnFetchAbort?: boolean\n\n /**\n * Set to true to ignore the `abort` event emitted by the `AbortSignal`\n * object passed to {@link OptionsBase.fetchMethod}, and still cache the\n * resulting resolution value, as long as it is not `undefined`.\n *\n * When used on its own, this means aborted {@link LRUCache#fetch} calls\n * are not immediately resolved or rejected when they are aborted, and\n * instead take the full time to await.\n *\n * When used with {@link OptionsBase.allowStaleOnFetchAbort}, aborted\n * {@link LRUCache#fetch} calls will resolve immediately to their stale\n * cached value or `undefined`, and will continue to process and eventually\n * update the cache when they resolve, as long as the resulting value is\n * not `undefined`, thus supporting a \"return stale on timeout while\n * refreshing\" mechanism by passing `AbortSignal.timeout(n)` as the signal.\n *\n * For example:\n *\n * ```ts\n * const c = new LRUCache({\n * ttl: 100,\n * ignoreFetchAbort: true,\n * allowStaleOnFetchAbort: true,\n * fetchMethod: async (key, oldValue, { signal }) => {\n * // note: do NOT pass the signal to fetch()!\n * // let's say this fetch can take a long time.\n * const res = await fetch(`https://slow-backend-server/${key}`)\n * return await res.json()\n * },\n * })\n *\n * // this will return the stale value after 100ms, while still\n * // updating in the background for next time.\n * const val = await c.fetch('key', { signal: AbortSignal.timeout(100) })\n * ```\n *\n * **Note**: regardless of this setting, an `abort` event _is still\n * emitted on the `AbortSignal` object_, so may result in invalid results\n * when passed to other underlying APIs that use AbortSignals.\n *\n * This may be overridden in the {@link OptionsBase.fetchMethod} or the\n * call to {@link LRUCache#fetch}.\n */\n ignoreFetchAbort?: boolean\n\n /**\n * In some cases, you may want to swap out the performance/Date object\n * used for TTL tracking. This should almost certainly NOT be done in\n * production environments!\n *\n * This value defaults to `global.performance` if it has a `now()` method,\n * or the `global.Date` object otherwise.\n */\n perf?: Perf\n }\n\n export interface OptionsMaxLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n max: Count\n }\n export interface OptionsTTLLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n ttl: Milliseconds\n ttlAutopurge: boolean\n }\n export interface OptionsSizeLimit extends OptionsBase<\n K,\n V,\n FC\n > {\n maxSize: Size\n }\n\n /**\n * The valid safe options for the {@link LRUCache} constructor\n */\n export type Options =\n | OptionsMaxLimit\n | OptionsSizeLimit\n | OptionsTTLLimit\n\n /**\n * Entry objects used by {@link LRUCache#load} and {@link LRUCache#dump},\n * and returned by {@link LRUCache#info}.\n */\n export interface Entry {\n value: V\n ttl?: Milliseconds\n size?: Size\n start?: Milliseconds\n }\n}\n\n/**\n * Default export, the thing you're using this module to get.\n *\n * The `K` and `V` types define the key and value types, respectively. The\n * optional `FC` type defines the type of the `context` object passed to\n * `cache.fetch()` and `cache.memo()`.\n *\n * Keys and values **must not** be `null` or `undefined`.\n *\n * All properties from the options object (with the exception of `max`,\n * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are\n * added as normal public members. (The listed options are read-only getters.)\n *\n * Changing any of these will alter the defaults for subsequent method calls.\n */\nexport class LRUCache {\n // options that cannot be changed without disaster\n readonly #max: LRUCache.Count\n readonly #maxSize: LRUCache.Size\n readonly #dispose?: LRUCache.Disposer\n readonly #onInsert?: LRUCache.Inserter\n readonly #disposeAfter?: LRUCache.Disposer\n readonly #fetchMethod?: LRUCache.Fetcher\n readonly #memoMethod?: LRUCache.Memoizer\n readonly #perf: Perf\n\n /**\n * {@link LRUCache.OptionsBase.perf}\n */\n get perf() {\n return this.#perf\n }\n\n /**\n * {@link LRUCache.OptionsBase.ttl}\n */\n ttl: LRUCache.Milliseconds\n\n /**\n * {@link LRUCache.OptionsBase.ttlResolution}\n */\n ttlResolution: LRUCache.Milliseconds\n /**\n * {@link LRUCache.OptionsBase.ttlAutopurge}\n */\n ttlAutopurge: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnGet}\n */\n updateAgeOnGet: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnHas}\n */\n updateAgeOnHas: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStale}\n */\n allowStale: boolean\n\n /**\n * {@link LRUCache.OptionsBase.noDisposeOnSet}\n */\n noDisposeOnSet: boolean\n /**\n * {@link LRUCache.OptionsBase.noUpdateTTL}\n */\n noUpdateTTL: boolean\n /**\n * {@link LRUCache.OptionsBase.maxEntrySize}\n */\n maxEntrySize: LRUCache.Size\n /**\n * {@link LRUCache.OptionsBase.sizeCalculation}\n */\n sizeCalculation?: LRUCache.SizeCalculator\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection}\n */\n noDeleteOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnStaleGet}\n */\n noDeleteOnStaleGet: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}\n */\n allowStaleOnFetchAbort: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection}\n */\n allowStaleOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.ignoreFetchAbort}\n */\n ignoreFetchAbort: boolean\n\n /** {@link LRUCache.OptionsBase.backgroundFetchSize} */\n backgroundFetchSize: number\n\n // computed properties\n #size: LRUCache.Count\n #calculatedSize: LRUCache.Size\n #keyMap: Map\n #keyList: (K | undefined)[]\n #valList: (V | BackgroundFetch | undefined)[]\n #next: NumberArray\n #prev: NumberArray\n #head: Index\n #tail: Index\n #free: StackLike\n #disposed?: DisposeTask[]\n #sizes?: ZeroArray\n #starts?: ZeroArray\n #ttls?: ZeroArray\n #autopurgeTimers?: (undefined | ReturnType)[]\n\n #hasDispose: boolean\n #hasFetchMethod: boolean\n #hasDisposeAfter: boolean\n #hasOnInsert: boolean\n\n /**\n * Do not call this method unless you need to inspect the\n * inner workings of the cache. If anything returned by this\n * object is modified in any way, strange breakage may occur.\n *\n * These fields are private for a reason!\n *\n * @internal\n */\n static unsafeExposeInternals<\n K extends {},\n V extends {},\n FC extends unknown = unknown,\n >(c: LRUCache) {\n return {\n // properties\n starts: c.#starts,\n ttls: c.#ttls,\n autopurgeTimers: c.#autopurgeTimers,\n sizes: c.#sizes,\n keyMap: c.#keyMap as Map,\n keyList: c.#keyList,\n valList: c.#valList,\n next: c.#next,\n prev: c.#prev,\n get head() {\n return c.#head\n },\n get tail() {\n return c.#tail\n },\n free: c.#free,\n // methods\n isBackgroundFetch: (p: unknown) => c.#isBackgroundFetch(p),\n backgroundFetch: (\n k: K,\n index: number | undefined,\n options: LRUCache.FetchOptions,\n context: unknown,\n ): BackgroundFetch =>\n c.#backgroundFetch(\n k,\n index as Index | undefined,\n options,\n context as FC,\n ),\n moveToTail: (index: number): void => c.#moveToTail(index as Index),\n indexes: (options?: { allowStale: boolean }) => c.#indexes(options),\n rindexes: (options?: { allowStale: boolean }) =>\n c.#rindexes(options),\n isStale: (index: number | undefined) => c.#isStale(index as Index),\n }\n }\n\n // Protected read-only members\n\n /**\n * {@link LRUCache.OptionsBase.max} (read-only)\n */\n get max(): LRUCache.Count {\n return this.#max\n }\n /**\n * {@link LRUCache.OptionsBase.maxSize} (read-only)\n */\n get maxSize(): LRUCache.Count {\n return this.#maxSize\n }\n /**\n * The total computed size of items in the cache (read-only)\n */\n get calculatedSize(): LRUCache.Size {\n return this.#calculatedSize\n }\n /**\n * The number of items stored in the cache (read-only)\n */\n get size(): LRUCache.Count {\n return this.#size\n }\n /**\n * {@link LRUCache.OptionsBase.fetchMethod} (read-only)\n */\n get fetchMethod(): LRUCache.Fetcher | undefined {\n return this.#fetchMethod\n }\n get memoMethod(): LRUCache.Memoizer | undefined {\n return this.#memoMethod\n }\n /**\n * {@link LRUCache.OptionsBase.dispose} (read-only)\n */\n get dispose() {\n return this.#dispose\n }\n /**\n * {@link LRUCache.OptionsBase.onInsert} (read-only)\n */\n get onInsert() {\n return this.#onInsert\n }\n /**\n * {@link LRUCache.OptionsBase.disposeAfter} (read-only)\n */\n get disposeAfter() {\n return this.#disposeAfter\n }\n\n constructor(options: LRUCache.Options | LRUCache) {\n const {\n max = 0,\n ttl,\n ttlResolution = 1,\n ttlAutopurge,\n updateAgeOnGet,\n updateAgeOnHas,\n allowStale,\n dispose,\n onInsert,\n disposeAfter,\n noDisposeOnSet,\n noUpdateTTL,\n maxSize = 0,\n maxEntrySize = 0,\n sizeCalculation,\n fetchMethod,\n memoMethod,\n noDeleteOnFetchRejection,\n noDeleteOnStaleGet,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n backgroundFetchSize = 1,\n perf,\n } = options\n\n this.backgroundFetchSize = backgroundFetchSize\n\n if (perf !== undefined) {\n if (typeof perf?.now !== 'function') {\n throw new TypeError(\n 'perf option must have a now() method if specified',\n )\n }\n }\n\n this.#perf = perf ?? defaultPerf\n\n if (max !== 0 && !isPosInt(max)) {\n throw new TypeError('max option must be a nonnegative integer')\n }\n\n const UintArray = max ? getUintArray(max) : Array\n if (!UintArray) {\n throw new Error('invalid max value: ' + max)\n }\n\n this.#max = max\n this.#maxSize = maxSize\n this.maxEntrySize = maxEntrySize || this.#maxSize\n this.sizeCalculation = sizeCalculation\n if (this.sizeCalculation) {\n if (!this.#maxSize && !this.maxEntrySize) {\n throw new TypeError(\n 'cannot set sizeCalculation without setting maxSize or maxEntrySize',\n )\n }\n if (typeof this.sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation set to non-function')\n }\n }\n\n if (memoMethod !== undefined && typeof memoMethod !== 'function') {\n throw new TypeError('memoMethod must be a function if defined')\n }\n this.#memoMethod = memoMethod\n\n if (fetchMethod !== undefined && typeof fetchMethod !== 'function') {\n throw new TypeError('fetchMethod must be a function if specified')\n }\n this.#fetchMethod = fetchMethod\n this.#hasFetchMethod = !!fetchMethod\n\n this.#keyMap = new Map()\n this.#keyList = Array.from({ length: max }).fill(undefined) as (\n | K\n | undefined\n )[]\n this.#valList = Array.from({ length: max }).fill(undefined) as (\n | V\n | undefined\n )[]\n this.#next = new UintArray(max)\n this.#prev = new UintArray(max)\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free = Stack.create(max)\n this.#size = 0\n this.#calculatedSize = 0\n\n if (typeof dispose === 'function') {\n this.#dispose = dispose\n }\n if (typeof onInsert === 'function') {\n this.#onInsert = onInsert\n }\n if (typeof disposeAfter === 'function') {\n this.#disposeAfter = disposeAfter\n this.#disposed = []\n } else {\n this.#disposeAfter = undefined\n this.#disposed = undefined\n }\n this.#hasDispose = !!this.#dispose\n this.#hasOnInsert = !!this.#onInsert\n this.#hasDisposeAfter = !!this.#disposeAfter\n\n this.noDisposeOnSet = !!noDisposeOnSet\n this.noUpdateTTL = !!noUpdateTTL\n this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection\n this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection\n this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort\n this.ignoreFetchAbort = !!ignoreFetchAbort\n\n // NB: maxEntrySize is set to maxSize if it's set\n if (this.maxEntrySize !== 0) {\n if (this.#maxSize !== 0) {\n if (!isPosInt(this.#maxSize)) {\n throw new TypeError(\n 'maxSize must be a positive integer if specified',\n )\n }\n }\n if (!isPosInt(this.maxEntrySize)) {\n throw new TypeError(\n 'maxEntrySize must be a positive integer if specified',\n )\n }\n this.#initializeSizeTracking()\n }\n\n this.allowStale = !!allowStale\n this.noDeleteOnStaleGet = !!noDeleteOnStaleGet\n this.updateAgeOnGet = !!updateAgeOnGet\n this.updateAgeOnHas = !!updateAgeOnHas\n this.ttlResolution =\n isPosInt(ttlResolution) || ttlResolution === 0 ? ttlResolution : 1\n this.ttlAutopurge = !!ttlAutopurge\n this.ttl = ttl || 0\n if (this.ttl) {\n if (!isPosInt(this.ttl)) {\n throw new TypeError('ttl must be a positive integer if specified')\n }\n this.#initializeTTLTracking()\n }\n\n // do not allow completely unbounded caches\n if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) {\n throw new TypeError(\n 'At least one of max, maxSize, or ttl is required',\n )\n }\n if (!this.ttlAutopurge && !this.#max && !this.#maxSize) {\n const code = 'LRU_CACHE_UNBOUNDED'\n if (shouldWarn(code)) {\n warned.add(code)\n const msg =\n 'TTL caching without ttlAutopurge, max, or maxSize can ' +\n 'result in unbounded memory consumption.'\n emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache)\n }\n }\n }\n\n /**\n * Return the number of ms left in the item's TTL. If item is not in cache,\n * returns `0`. Returns `Infinity` if item is in cache without a defined TTL.\n */\n getRemainingTTL(key: K) {\n return this.#keyMap.has(key) ? Infinity : 0\n }\n\n #initializeTTLTracking() {\n const ttls = new ZeroArray(this.#max)\n const starts = new ZeroArray(this.#max)\n this.#ttls = ttls\n this.#starts = starts\n const purgeTimers =\n this.ttlAutopurge ?\n Array.from>({\n length: this.#max,\n })\n : undefined\n this.#autopurgeTimers = purgeTimers\n\n this.#setItemTTL = (index, ttl, start = this.#perf.now()) => {\n starts[index] = ttl !== 0 ? start : 0\n ttls[index] = ttl\n setPurgetTimer(index, ttl)\n }\n\n this.#updateItemAge = index => {\n starts[index] = ttls[index] !== 0 ? this.#perf.now() : 0\n setPurgetTimer(index, ttls[index])\n }\n\n // clear out the purge timer if we're setting TTL to 0, and\n // previously had a ttl purge timer running, so it doesn't\n // fire unnecessarily. Don't need to do this if we're not doing\n // autopurge.\n const setPurgetTimer =\n !this.ttlAutopurge ?\n () => {}\n : (index: Index, ttl?: number) => {\n if (purgeTimers?.[index]) {\n clearTimeout(purgeTimers[index])\n purgeTimers[index] = undefined\n }\n if (ttl && ttl !== 0 && purgeTimers) {\n const t = setTimeout(() => {\n if (this.#isStale(index)) {\n this.#delete(this.#keyList[index] as K, 'expire')\n }\n }, ttl + 1)\n // unref() not supported on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n purgeTimers[index] = t\n }\n }\n\n this.#statusTTL = (status, index) => {\n if (ttls[index]) {\n const ttl = ttls[index]\n const start = starts[index]\n /* c8 ignore start */\n if (!ttl || !start) {\n return\n }\n /* c8 ignore stop */\n status.ttl = ttl\n status.start = start\n status.now = cachedNow || getNow()\n const age = status.now - start\n status.remainingTTL = ttl - age\n }\n }\n\n // debounce calls to perf.now() to 1s so we're not hitting\n // that costly call repeatedly.\n let cachedNow = 0\n const getNow = () => {\n const n = this.#perf.now()\n if (this.ttlResolution > 0) {\n cachedNow = n\n const t = setTimeout(() => (cachedNow = 0), this.ttlResolution)\n // not available on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n }\n return n\n }\n\n this.getRemainingTTL = key => {\n const index = this.#keyMap.get(key)\n if (index === undefined) {\n return 0\n }\n const ttl = ttls[index]\n const start = starts[index]\n if (!ttl || !start) {\n return Infinity\n }\n const age = (cachedNow || getNow()) - start\n return ttl - age\n }\n\n this.#isStale = index => {\n const s = starts[index]\n const t = ttls[index]\n return !!t && !!s && (cachedNow || getNow()) - s > t\n }\n }\n\n // conditionally set private methods related to TTL\n #updateItemAge: (index: Index) => void = () => {}\n #statusTTL: (status: LRUCache.Status, index: Index) => void =\n () => {}\n #setItemTTL: (\n index: Index,\n ttl: LRUCache.Milliseconds,\n start?: LRUCache.Milliseconds,\n // ignore because we never call this if we're not already in TTL mode\n /* c8 ignore start */\n ) => void = () => {}\n /* c8 ignore stop */\n\n #isStale: (index: Index) => boolean = () => false\n\n #initializeSizeTracking() {\n const sizes = new ZeroArray(this.#max)\n this.#calculatedSize = 0\n this.#sizes = sizes\n this.#removeItemSize = index => {\n this.#calculatedSize -= sizes[index] as number\n sizes[index] = 0\n }\n this.#requireSize = (k, v, size, sizeCalculation) => {\n if (!isPosInt(size)) {\n // provisionally accept background fetches.\n // actual value size will be checked when they return.\n if (this.#isBackgroundFetch(v)) {\n // NB: this cannot occur if v.__staleWhileFetching is set,\n // because in that case, it would take on the size of the\n // existing entry that it temporarily replaces.\n return this.backgroundFetchSize\n }\n if (sizeCalculation) {\n if (typeof sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation must be a function')\n }\n size = sizeCalculation(v, k)\n if (!isPosInt(size)) {\n throw new TypeError(\n 'sizeCalculation return invalid (expect positive integer)',\n )\n }\n } else {\n throw new TypeError(\n 'invalid size value (must be positive integer). ' +\n 'When maxSize or maxEntrySize is used, sizeCalculation ' +\n 'or size must be set.',\n )\n }\n }\n return size\n }\n\n this.#addItemSize = (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status,\n ) => {\n sizes[index] = size\n if (this.#maxSize) {\n const maxSize = this.#maxSize - sizes[index]\n while (this.#calculatedSize > maxSize) {\n this.#evict(true)\n }\n }\n this.#calculatedSize += sizes[index]\n if (status) {\n status.entrySize = size\n status.totalCalculatedSize = this.#calculatedSize\n }\n }\n }\n\n #removeItemSize: (index: Index) => void = _i => {}\n\n #addItemSize: (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status,\n ) => void = (_i, _s, _st) => {}\n\n #requireSize: (\n k: K,\n v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator,\n status?: LRUCache.Status,\n ) => LRUCache.Size = (\n _k: K,\n _v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator,\n ) => {\n if (size || sizeCalculation) {\n throw new TypeError(\n 'cannot set size without setting maxSize or maxEntrySize on cache',\n )\n }\n return 0\n };\n\n *#indexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#tail; this.#isValidIndex(i); ) {\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#head) {\n break\n } else {\n i = this.#prev[i] as Index\n }\n }\n }\n }\n\n *#rindexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#head; this.#isValidIndex(i); ) {\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#tail) {\n break\n } else {\n i = this.#next[i] as Index\n }\n }\n }\n }\n\n #isValidIndex(index: Index) {\n return (\n index !== undefined &&\n this.#keyMap.get(this.#keyList[index] as K) === index\n )\n }\n\n /**\n * Return a generator yielding `[key, value]` pairs,\n * in order from most recently used to least recently used.\n */\n *entries() {\n for (const i of this.#indexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]] as [K, V]\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.entries}\n *\n * Return a generator yielding `[key, value]` pairs,\n * in order from least recently used to most recently used.\n */\n *rentries() {\n for (const i of this.#rindexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]]\n }\n }\n }\n\n /**\n * Return a generator yielding the keys in the cache,\n * in order from most recently used to least recently used.\n */\n *keys() {\n for (const i of this.#indexes()) {\n const k = this.#keyList[i]\n if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield k\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.keys}\n *\n * Return a generator yielding the keys in the cache,\n * in order from least recently used to most recently used.\n */\n *rkeys() {\n for (const i of this.#rindexes()) {\n const k = this.#keyList[i]\n if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield k\n }\n }\n }\n\n /**\n * Return a generator yielding the values in the cache,\n * in order from most recently used to least recently used.\n */\n *values() {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i] as V\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.values}\n *\n * Return a generator yielding the values in the cache,\n * in order from least recently used to most recently used.\n */\n *rvalues() {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i]\n }\n }\n }\n\n /**\n * Iterating over the cache itself yields the same results as\n * {@link LRUCache.entries}\n */\n [Symbol.iterator]() {\n return this.entries()\n }\n\n /**\n * A String value that is used in the creation of the default string\n * description of an object. Called by the built-in method\n * `Object.prototype.toString`.\n */\n [Symbol.toStringTag] = 'LRUCache'\n\n /**\n * Find a value for which the supplied fn method returns a truthy value,\n * similar to `Array.find()`. fn is called as `fn(value, key, cache)`.\n */\n find(\n fn: (v: V, k: K, self: LRUCache) => boolean,\n getOptions: LRUCache.GetOptions = {},\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n if (fn(value, this.#keyList[i] as K, this)) {\n return this.#get(this.#keyList[i] as K, getOptions)\n }\n }\n }\n\n /**\n * Call the supplied function on each item in the cache, in order from most\n * recently used to least recently used.\n *\n * `fn` is called as `fn(value, key, cache)`.\n *\n * If `thisp` is provided, function will be called in the `this`-context of\n * the provided object, or the cache if no `thisp` object is provided.\n *\n * Does not update age or recenty of use, or iterate over stale values.\n */\n forEach(\n fn: (v: V, k: K, self: LRUCache) => unknown,\n thisp: unknown = this,\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * The same as {@link LRUCache.forEach} but items are iterated over in\n * reverse order. (ie, less recently used items are iterated over first.)\n */\n rforEach(\n fn: (v: V, k: K, self: LRUCache) => unknown,\n thisp: unknown = this,\n ) {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * Delete any stale entries. Returns true if anything was removed,\n * false otherwise.\n */\n purgeStale() {\n let deleted = false\n for (const i of this.#rindexes({ allowStale: true })) {\n if (this.#isStale(i)) {\n this.#delete(this.#keyList[i] as K, 'expire')\n deleted = true\n }\n }\n return deleted\n }\n\n /**\n * Get the extended info about a given entry, to get its value, size, and\n * TTL info simultaneously. Returns `undefined` if the key is not present.\n *\n * Unlike {@link LRUCache#dump}, which is designed to be portable and survive\n * serialization, the `start` value is always the current timestamp, and the\n * `ttl` is a calculated remaining time to live (negative if expired).\n *\n * Always returns stale values, if their info is found in the cache, so be\n * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl})\n * if relevant.\n */\n info(key: K): LRUCache.Entry | undefined {\n const i = this.#keyMap.get(key)\n if (i === undefined) return undefined\n const v = this.#valList[i]\n /* c8 ignore start - this isn't tested for the info function,\n * but it's the same logic as found in other places. */\n const value: V | undefined =\n this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined) return undefined\n /* c8 ignore stop */\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n const ttl = this.#ttls[i]\n const start = this.#starts[i]\n if (ttl && start) {\n const remain = ttl - (this.#perf.now() - start)\n entry.ttl = remain\n entry.start = Date.now()\n }\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n return entry\n }\n\n /**\n * Return an array of [key, {@link LRUCache.Entry}] tuples which can be\n * passed to {@link LRUCache#load}.\n *\n * The `start` fields are calculated relative to a portable `Date.now()`\n * timestamp, even if `performance.now()` is available.\n *\n * Stale entries are always included in the `dump`, even if\n * {@link LRUCache.OptionsBase.allowStale} is false.\n *\n * Note: this returns an actual array, not a generator, so it can be more\n * easily passed around.\n */\n dump() {\n const arr: [K, LRUCache.Entry][] = []\n for (const i of this.#indexes({ allowStale: true })) {\n const key = this.#keyList[i]\n const v = this.#valList[i]\n const value: V | undefined =\n this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (value === undefined || key === undefined) continue\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n entry.ttl = this.#ttls[i]\n // always dump the start relative to a portable timestamp\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = this.#perf.now() - (this.#starts[i] as number)\n entry.start = Math.floor(Date.now() - age)\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n arr.unshift([key, entry])\n }\n return arr\n }\n\n /**\n * Reset the cache and load in the items in entries in the order listed.\n *\n * The shape of the resulting cache may be different if the same options are\n * not used in both caches.\n *\n * The `start` fields are assumed to be calculated relative to a portable\n * `Date.now()` timestamp, even if `performance.now()` is available.\n */\n load(arr: [K, LRUCache.Entry][]) {\n this.clear()\n for (const [key, entry] of arr) {\n if (entry.start) {\n // entry.start is a portable timestamp, but we may be using\n // node's performance.now(), so calculate the offset, so that\n // we get the intended remaining TTL, no matter how long it's\n // been on ice.\n //\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = Date.now() - entry.start\n entry.start = this.#perf.now() - age\n }\n this.#set(key, entry.value, entry)\n }\n }\n\n /**\n * Add a value to the cache.\n *\n * Note: if `undefined` is specified as a value, this is an alias for\n * {@link LRUCache#delete}\n *\n * Fields on the {@link LRUCache.SetOptions} options param will override\n * their corresponding values in the constructor options for the scope\n * of this single `set()` operation.\n *\n * If `start` is provided, then that will set the effective start\n * time for the TTL calculation. Note that this must be a previous\n * value of `performance.now()` if supported, or a previous value of\n * `Date.now()` if not.\n *\n * Options object may also include `size`, which will prevent\n * calling the `sizeCalculation` function and just use the specified\n * number if it is a positive integer, and `noDisposeOnSet` which\n * will prevent calling a `dispose` function in the case of\n * overwrites.\n *\n * If the `size` (or return value of `sizeCalculation`) for a given\n * entry is greater than `maxEntrySize`, then the item will not be\n * added to the cache.\n *\n * Will update the recency of the entry.\n *\n * If the value is `undefined`, then this is an alias for\n * `cache.delete(key)`. `undefined` is never stored in the cache.\n */\n set(\n k: K,\n v: V | undefined,\n setOptions: LRUCache.SetOptions = {},\n ) {\n const { status = metrics.hasSubscribers ? {} : undefined } = setOptions\n setOptions.status = status\n if (status) {\n status.op = 'set'\n status.key = k\n if (v !== undefined) status.value = v\n status.cache = this\n }\n const result = this.#set(k, v, setOptions)\n if (status && metrics.hasSubscribers) {\n metrics.publish(status)\n }\n return result\n }\n\n #set(\n k: K,\n v: V | BackgroundFetch | undefined,\n setOptions: LRUCache.SetOptions,\n bf?: BackgroundFetch,\n ) {\n const {\n ttl = this.ttl,\n start,\n noDisposeOnSet = this.noDisposeOnSet,\n sizeCalculation = this.sizeCalculation,\n status,\n } = setOptions\n\n const isBF = this.#isBackgroundFetch(v)\n if (v === undefined) {\n if (status) status.set = 'deleted'\n this.delete(k)\n return this\n }\n let { noUpdateTTL = this.noUpdateTTL } = setOptions\n\n if (status && !isBF) status.value = v\n\n const size = this.#requireSize(\n k,\n v,\n setOptions.size || 0,\n sizeCalculation,\n status,\n )\n // if the item doesn't fit, don't do anything\n // NB: maxEntrySize set to maxSize by default\n if (this.maxEntrySize && size > this.maxEntrySize) {\n // have to delete, in case something is there already.\n this.#delete(k, 'set')\n if (status) {\n status.set = 'miss'\n status.maxEntrySizeExceeded = true\n }\n return this\n }\n let index = this.#size === 0 ? undefined : this.#keyMap.get(k)\n if (index === undefined) {\n // addition\n index = (\n this.#size === 0 ? this.#tail\n : this.#free.length !== 0 ? this.#free.pop()\n : this.#size === this.#max ? this.#evict(false)\n : this.#size) as Index\n this.#keyList[index] = k\n this.#valList[index] = v\n this.#keyMap.set(k, index)\n this.#next[this.#tail] = index\n this.#prev[index] = this.#tail\n this.#tail = index\n this.#size++\n this.#addItemSize(index, size, status)\n if (status) status.set = 'add'\n noUpdateTTL = false\n if (this.#hasOnInsert && !isBF) {\n this.#onInsert?.(v, k, 'add')\n }\n } else {\n // update\n // might be updating a background fetch!\n this.#moveToTail(index)\n const oldVal = this.#valList[index]!\n if (v !== oldVal) {\n if (!noDisposeOnSet) {\n if (this.#isBackgroundFetch(oldVal)) {\n if (oldVal !== bf) {\n // setting over a background fetch, not merely resolving it.\n oldVal.__abortController.abort(new Error('replaced'))\n }\n const { __staleWhileFetching: s } = oldVal\n if (s !== undefined && s !== v) {\n if (this.#hasDispose) {\n this.#dispose?.(s, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([s, k, 'set'])\n }\n }\n } else {\n if (this.#hasDispose) {\n this.#dispose?.(oldVal, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldVal, k, 'set'])\n }\n }\n }\n this.#removeItemSize(index)\n this.#addItemSize(index, size, status)\n this.#valList[index] = v\n if (!isBF) {\n const oldValue =\n oldVal && this.#isBackgroundFetch(oldVal) ?\n oldVal.__staleWhileFetching\n : oldVal\n const setType =\n oldValue === undefined ? 'add'\n : v !== oldValue ? 'replace'\n : 'update'\n if (status) {\n status.set = setType\n if (oldValue !== undefined) status.oldValue = oldValue\n }\n if (this.#hasOnInsert) {\n this.onInsert?.(v, k, setType)\n }\n }\n } else if (!isBF) {\n if (status) {\n status.set = 'update'\n }\n if (this.#hasOnInsert) {\n this.onInsert?.(v, k, 'update')\n }\n }\n }\n if (ttl !== 0 && !this.#ttls) {\n this.#initializeTTLTracking()\n }\n if (this.#ttls) {\n if (!noUpdateTTL) {\n this.#setItemTTL(index, ttl, start)\n }\n if (status) this.#statusTTL(status, index)\n }\n if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return this\n }\n\n /**\n * Evict the least recently used item, returning its value or\n * `undefined` if cache is empty.\n */\n pop(): V | undefined {\n try {\n while (this.#size) {\n const val = this.#valList[this.#head]\n this.#evict(true)\n if (this.#isBackgroundFetch(val)) {\n if (val.__staleWhileFetching) {\n return val.__staleWhileFetching\n }\n } else if (val !== undefined) {\n return val\n }\n }\n } finally {\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n }\n\n #evict(free: boolean) {\n const head = this.#head\n const k = this.#keyList[head]!\n const v = this.#valList[head]!\n const isBF = this.#isBackgroundFetch(v)\n if (isBF) {\n v.__abortController.abort(new Error('evicted'))\n }\n const oldValue = isBF ? v.__staleWhileFetching : v\n if (\n (this.#hasDispose || this.#hasDisposeAfter) &&\n oldValue !== undefined\n ) {\n if (this.#hasDispose) {\n this.#dispose?.(oldValue, k, 'evict')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldValue, k, 'evict'])\n }\n }\n this.#removeItemSize(head)\n if (this.#autopurgeTimers?.[head]) {\n clearTimeout(this.#autopurgeTimers[head])\n this.#autopurgeTimers[head] = undefined\n }\n // if we aren't about to use the index, then null these out\n if (free) {\n this.#keyList[head] = undefined\n this.#valList[head] = undefined\n this.#free.push(head)\n }\n if (this.#size === 1) {\n this.#head = this.#tail = 0 as Index\n this.#free.length = 0\n } else {\n this.#head = this.#next[head] as Index\n }\n this.#keyMap.delete(k)\n this.#size--\n return head\n }\n\n /**\n * Check if a key is in the cache, without updating the recency of use.\n * Will return false if the item is stale, even though it is technically\n * in the cache.\n *\n * Check if a key is in the cache, without updating the recency of\n * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set\n * to `true` in either the options or the constructor.\n *\n * Will return `false` if the item is stale, even though it is technically in\n * the cache. The difference can be determined (if it matters) by using a\n * `status` argument, and inspecting the `has` field.\n *\n * Will not update item age unless\n * {@link LRUCache.OptionsBase.updateAgeOnHas} is set.\n */\n has(k: K, hasOptions: LRUCache.HasOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } = hasOptions\n hasOptions.status = status\n if (status) {\n status.op = 'has'\n status.key = k\n status.cache = this\n }\n const result = this.#has(k, hasOptions)\n if (metrics.hasSubscribers) metrics.publish(status)\n return result\n }\n #has(k: K, hasOptions: LRUCache.HasOptions = {}) {\n const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n const v = this.#valList[index]\n if (\n this.#isBackgroundFetch(v) &&\n v.__staleWhileFetching === undefined\n ) {\n return false\n }\n if (!this.#isStale(index)) {\n if (updateAgeOnHas) {\n this.#updateItemAge(index)\n }\n if (status) {\n status.has = 'hit'\n this.#statusTTL(status, index)\n }\n return true\n } else if (status) {\n status.has = 'stale'\n this.#statusTTL(status, index)\n }\n } else if (status) {\n status.has = 'miss'\n }\n return false\n }\n\n /**\n * Like {@link LRUCache#get} but doesn't update recency or delete stale\n * items.\n *\n * Returns `undefined` if the item is stale, unless\n * {@link LRUCache.OptionsBase.allowStale} is set.\n */\n peek(k: K, peekOptions: LRUCache.PeekOptions = {}) {\n const { status = hasSubscribers() ? {} : undefined } = peekOptions\n if (status) {\n status.op = 'peek'\n status.key = k\n status.cache = this\n }\n peekOptions.status = status\n const result = this.#peek(k, peekOptions)\n if (metrics.hasSubscribers) {\n metrics.publish(status)\n }\n return result\n }\n #peek(k: K, peekOptions: LRUCache.PeekOptions) {\n const { status, allowStale = this.allowStale } = peekOptions\n const index = this.#keyMap.get(k)\n if (index === undefined || (!allowStale && this.#isStale(index))) {\n if (status) status.peek = index === undefined ? 'miss' : 'stale'\n return undefined\n }\n const v = this.#valList[index]\n const val = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n if (status) {\n if (val !== undefined) {\n status.peek = 'hit'\n status.value = val\n } else {\n status.peek = 'miss'\n }\n }\n return val\n }\n\n #backgroundFetch(\n k: K,\n index: Index | undefined,\n options: LRUCache.FetchOptions,\n context: FC,\n ): BackgroundFetch {\n const v = index === undefined ? undefined : this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n return v\n }\n\n const ac = new AbortController()\n const { signal } = options\n // when/if our AC signals, then stop listening to theirs.\n signal?.addEventListener('abort', () => ac.abort(signal.reason), {\n signal: ac.signal,\n })\n\n const fetchOpts = {\n signal: ac.signal,\n options,\n context,\n }\n\n const cb = (v: V | undefined, updateCache = false): V | undefined => {\n const { aborted } = ac.signal\n const ignoreAbort = options.ignoreFetchAbort && v !== undefined\n const proceed =\n options.ignoreFetchAbort ||\n !!(options.allowStaleOnFetchAbort && v !== undefined)\n if (options.status) {\n if (aborted && !updateCache) {\n options.status.fetchAborted = true\n options.status.fetchError = ac.signal.reason\n if (ignoreAbort) options.status.fetchAbortIgnored = true\n } else {\n options.status.fetchResolved = true\n }\n }\n if (aborted && !ignoreAbort && !updateCache) {\n return fetchFail(ac.signal.reason, proceed)\n }\n // either we didn't abort, and are still here, or we did, and ignored\n const bf = p as BackgroundFetch\n // if nothing else has been written there but we're set to update the\n // cache and ignore the abort, or if it's still pending on this specific\n // background request, then write it to the cache.\n const vl = this.#valList[index as Index]\n if (vl === p || (vl === undefined && ignoreAbort && updateCache)) {\n if (v === undefined) {\n if (bf.__staleWhileFetching !== undefined) {\n this.#valList[index as Index] = bf.__staleWhileFetching\n } else {\n this.#delete(k, 'fetch')\n }\n } else {\n if (options.status) options.status.fetchUpdated = true\n this.#set(k, v, fetchOpts.options, bf)\n }\n }\n return v\n }\n\n const eb = (er: unknown) => {\n if (options.status) {\n options.status.fetchRejected = true\n options.status.fetchError = er as Error\n }\n // do not pass go, do not collect $200\n return fetchFail(er, false)\n }\n\n const fetchFail = (er: unknown, proceed: boolean): V | undefined => {\n const { aborted } = ac.signal\n const allowStaleAborted = aborted && options.allowStaleOnFetchAbort\n const allowStale =\n allowStaleAborted || options.allowStaleOnFetchRejection\n const noDelete = allowStale || options.noDeleteOnFetchRejection\n const bf = p as BackgroundFetch\n if (this.#valList[index as Index] === p) {\n // if we allow stale on fetch rejections, then we need to ensure that\n // the stale value is not removed from the cache when the fetch fails.\n const del =\n !noDelete || (!proceed && bf.__staleWhileFetching === undefined)\n if (del) {\n this.#delete(k, 'fetch')\n } else if (!allowStaleAborted) {\n // still replace the *promise* with the stale value,\n // since we are done with the promise at this point.\n // leave it untouched if we're still waiting for an\n // aborted background fetch that hasn't yet returned.\n this.#valList[index as Index] = bf.__staleWhileFetching\n }\n }\n if (allowStale) {\n if (options.status && bf.__staleWhileFetching !== undefined) {\n options.status.returnedStale = true\n }\n return bf.__staleWhileFetching\n } else if (bf.__returned === bf) {\n throw er\n }\n }\n\n const pcall = (\n res: (v: V | undefined) => void,\n rej: (e: unknown) => void,\n ) => {\n const fmp = this.#fetchMethod?.(k, v, fetchOpts)\n // ignored, we go until we finish, regardless.\n // defer check until we are actually aborting,\n // so fetchMethod can override.\n ac.signal.addEventListener('abort', () => {\n if (!options.ignoreFetchAbort || options.allowStaleOnFetchAbort) {\n res(undefined)\n // when it eventually resolves, update the cache.\n if (options.allowStaleOnFetchAbort) {\n res = v => cb(v, true)\n }\n }\n })\n if (fmp && fmp instanceof Promise) {\n fmp.then(v => res(v === undefined ? undefined : v), rej)\n } else if (fmp !== undefined) {\n res(fmp)\n }\n }\n\n if (options.status) options.status.fetchDispatched = true\n const p = new Promise(pcall).then(cb, eb)\n const bf: BackgroundFetch = Object.assign(p, {\n __abortController: ac,\n __staleWhileFetching: v,\n __returned: undefined,\n })\n\n if (index === undefined) {\n // internal, don't expose status.\n this.#set(k, bf, { ...fetchOpts.options, status: undefined })\n index = this.#keyMap.get(k)\n } else {\n // do not call #set, because we do not want to adjust its place\n // in the lru queue, as it has not yet been \"used\". Also, we don't\n // need to worry about evicting for size, because a background fetch\n // over a stale value is treated as the same size as its stale value.\n this.#valList[index] = bf\n }\n return bf\n }\n\n #isBackgroundFetch(p: unknown): p is BackgroundFetch {\n if (!this.#hasFetchMethod) return false\n const b = p as BackgroundFetch\n return (\n !!b &&\n b instanceof Promise &&\n b.hasOwnProperty('__staleWhileFetching') &&\n b.__abortController instanceof AbortController\n )\n }\n\n /**\n * Make an asynchronous cached fetch using the\n * {@link LRUCache.OptionsBase.fetchMethod} function.\n *\n * If the value is in the cache and not stale, then the returned\n * Promise resolves to the value.\n *\n * If not in the cache, or beyond its TTL staleness, then\n * `fetchMethod(key, staleValue, { options, signal, context })` is\n * called, and the value returned will be added to the cache once\n * resolved.\n *\n * If called with `allowStale`, and an asynchronous fetch is\n * currently in progress to reload a stale value, then the former\n * stale value will be returned.\n *\n * If called with `forceRefresh`, then the cached item will be\n * re-fetched, even if it is not stale. However, if `allowStale` is also\n * set, then the old value will still be returned. This is useful\n * in cases where you want to force a reload of a cached value. If\n * a background fetch is already in progress, then `forceRefresh`\n * has no effect.\n *\n * If multiple fetches for the same key are issued, then they will all be\n * coalesced into a single call to fetchMethod.\n *\n * Note that this means that handling options such as\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort},\n * {@link LRUCache.FetchOptions.signal},\n * and {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} will be\n * determined by the FIRST fetch() call for a given key.\n *\n * This is a known (fixable) shortcoming which will be addresed on when\n * someone complains about it, as the fix would involve added complexity and\n * may not be worth the costs for this edge case.\n *\n * If {@link LRUCache.OptionsBase.fetchMethod} is not specified, then this is\n * effectively an alias for `Promise.resolve(cache.get(key))`.\n *\n * When the fetch method resolves to a value, if the fetch has not\n * been aborted due to deletion, eviction, or being overwritten,\n * then it is added to the cache using the options provided.\n *\n * If the key is evicted or deleted before the `fetchMethod`\n * resolves, then the AbortSignal passed to the `fetchMethod` will\n * receive an `abort` event, and the promise returned by `fetch()`\n * will reject with the reason for the abort.\n *\n * If a `signal` is passed to the `fetch()` call, then aborting the\n * signal will abort the fetch and cause the `fetch()` promise to\n * reject with the reason provided.\n *\n * **Setting `context`**\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the {@link LRUCache} constructor, then all\n * calls to `cache.fetch()` _must_ provide a `context` option. If\n * set to `undefined` or `void`, then calls to fetch _must not_\n * provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that\n * might be relevant in the course of fetching the data. It is only\n * relevant for the course of a single `fetch()` operation, and\n * discarded afterwards.\n *\n * **Note: `fetch()` calls are inflight-unique**\n *\n * If you call `fetch()` multiple times with the same key value,\n * then every call after the first will resolve on the same\n * promise1,\n * _even if they have different settings that would otherwise change\n * the behavior of the fetch_, such as `noDeleteOnFetchRejection`\n * or `ignoreFetchAbort`.\n *\n * In most cases, this is not a problem (in fact, only fetching\n * something once is what you probably want, if you're caching in\n * the first place). If you are changing the fetch() options\n * dramatically between runs, there's a good chance that you might\n * be trying to fit divergent semantics into a single object, and\n * would be better off with multiple cache instances.\n *\n * **1**: Ie, they're not the \"same Promise\", but they resolve at\n * the same time, because they're both waiting on the same\n * underlying fetchMethod response.\n */\n\n fetch(\n k: K,\n fetchOptions: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext,\n ): Promise\n\n // this overload not allowed if context is required\n fetch(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n fetchOptions?: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : never,\n ): Promise\n fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const ths = tracing.hasSubscribers\n const { status = hasSubscribers() ? {} : undefined } = fetchOptions\n fetchOptions.status = status\n if (status && fetchOptions.context) {\n status.context = fetchOptions.context\n }\n const p = this.#fetch(k, fetchOptions)\n if (status && ths) {\n status.trace = true\n tracing.tracePromise(() => p, status).catch(() => {})\n }\n return p\n }\n\n async #fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const {\n // get options\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n // set options\n ttl = this.ttl,\n noDisposeOnSet = this.noDisposeOnSet,\n size = 0,\n sizeCalculation = this.sizeCalculation,\n noUpdateTTL = this.noUpdateTTL,\n // fetch exclusive options\n noDeleteOnFetchRejection = this.noDeleteOnFetchRejection,\n allowStaleOnFetchRejection = this.allowStaleOnFetchRejection,\n ignoreFetchAbort = this.ignoreFetchAbort,\n allowStaleOnFetchAbort = this.allowStaleOnFetchAbort,\n context,\n forceRefresh = false,\n status,\n signal,\n } = fetchOptions\n if (status) {\n status.op = 'fetch'\n status.key = k\n if (forceRefresh) status.forceRefresh = true\n status.cache = this\n }\n\n if (!this.#hasFetchMethod) {\n if (status) status.fetch = 'get'\n return this.#get(k, {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n status,\n })\n }\n\n const options = {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n ttl,\n noDisposeOnSet,\n size,\n sizeCalculation,\n noUpdateTTL,\n noDeleteOnFetchRejection,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n status,\n signal,\n }\n\n let index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.fetch = 'miss'\n const p = this.#backgroundFetch(k, index, options, context as FC)\n return (p.__returned = p)\n } else {\n // in cache, maybe already fetching\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n const stale = allowStale && v.__staleWhileFetching !== undefined\n if (status) {\n status.fetch = 'inflight'\n if (stale) status.returnedStale = true\n }\n return stale ? v.__staleWhileFetching : (v.__returned = v)\n }\n\n // if we force a refresh, that means do NOT serve the cached value,\n // unless we are already in the process of refreshing the cache.\n const isStale = this.#isStale(index)\n if (!forceRefresh && !isStale) {\n if (status) status.fetch = 'hit'\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n if (status) this.#statusTTL(status, index)\n return v\n }\n\n // ok, it is stale or a forced refresh, and not already fetching.\n // refresh the cache.\n const p = this.#backgroundFetch(k, index, options, context as FC)\n const hasStale = p.__staleWhileFetching !== undefined\n const staleVal = hasStale && allowStale\n if (status) {\n status.fetch = isStale ? 'stale' : 'refresh'\n if (staleVal && isStale) status.returnedStale = true\n }\n return staleVal ? p.__staleWhileFetching : (p.__returned = p)\n }\n }\n\n /**\n * In some cases, `cache.fetch()` may resolve to `undefined`, either because\n * a {@link LRUCache.OptionsBase#fetchMethod} was not provided (turning\n * `cache.fetch(k)` into just an async wrapper around `cache.get(k)`) or\n * because `ignoreFetchAbort` was specified (either to the constructor or\n * in the {@link LRUCache.FetchOptions}). Also, the\n * {@link LRUCache.OptionsBase.fetchMethod} may return `undefined` or `void`, making\n * the test even more complicated.\n *\n * Because inferring the cases where `undefined` might be returned are so\n * cumbersome, but testing for `undefined` can also be annoying, this method\n * can be used, which will reject if `this.fetch()` resolves to undefined.\n */\n forceFetch(\n k: K,\n fetchOptions: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext,\n ): Promise\n // this overload not allowed if context is required\n forceFetch(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n fetchOptions?: unknown extends FC ? LRUCache.FetchOptions\n : FC extends undefined | void ?\n LRUCache.FetchOptionsNoContext\n : never,\n ): Promise\n forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ): Promise {\n const ths = tracing.hasSubscribers\n const { status = hasSubscribers() ? {} : undefined } = fetchOptions\n fetchOptions.status = status\n if (status && fetchOptions.context) {\n status.context = fetchOptions.context\n }\n const p = this.#forceFetch(k, fetchOptions)\n if (status && ths) {\n status.trace = true\n tracing.tracePromise(() => p, status).catch(() => {})\n }\n return p\n }\n\n async #forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {},\n ) {\n const v = await this.#fetch(k, fetchOptions)\n if (v === undefined) throw new Error('fetch() returned undefined')\n return v\n }\n\n /**\n * If the key is found in the cache, then this is equivalent to\n * {@link LRUCache#get}. If not, in the cache, then calculate the value using\n * the {@link LRUCache.OptionsBase.memoMethod}, and add it to the cache.\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the LRUCache constructor, then all calls to `cache.memo()`\n * _must_ provide a `context` option. If set to `undefined` or `void`, then\n * calls to memo _must not_ provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that might be\n * relevant in the course of fetching the data. It is only relevant for the\n * course of a single `memo()` operation, and discarded afterwards.\n */\n memo(\n k: K,\n memoOptions: unknown extends FC ? LRUCache.MemoOptions\n : FC extends undefined | void ? LRUCache.MemoOptionsNoContext\n : LRUCache.MemoOptionsWithContext,\n ): V\n // this overload not allowed if context is required\n memo(\n k: unknown extends FC ? K\n : FC extends undefined | void ? K\n : never,\n memoOptions?: unknown extends FC ? LRUCache.MemoOptions\n : FC extends undefined | void ? LRUCache.MemoOptionsNoContext\n : never,\n ): V\n memo(k: K, memoOptions: LRUCache.MemoOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } =\n memoOptions\n memoOptions.status = status\n if (status) {\n status.op = 'memo'\n status.key = k\n if (memoOptions.context) {\n status.context = memoOptions.context\n }\n status.cache = this\n }\n const result = this.#memo(k, memoOptions)\n if (status) status.value = result\n if (metrics.hasSubscribers) metrics.publish(status)\n return result\n }\n #memo(k: K, memoOptions: LRUCache.MemoOptions = {}) {\n const memoMethod = this.#memoMethod\n if (!memoMethod) {\n throw new Error('no memoMethod provided to constructor')\n }\n const { context, status, forceRefresh, ...options } = memoOptions\n if (status && forceRefresh) status.forceRefresh = true\n const v = this.#get(k, options)\n const refresh = forceRefresh || v === undefined\n if (status) {\n status.memo = refresh ? 'miss' : 'hit'\n if (!refresh) status.value = v\n }\n if (!refresh) return v\n const vv = memoMethod(k, v, {\n options,\n context,\n } as LRUCache.MemoizerOptions)\n if (status) status.value = vv\n this.#set(k, vv, options)\n return vv\n }\n\n /**\n * Return a value from the cache. Will update the recency of the cache\n * entry found.\n *\n * If the key is not found, get() will return `undefined`.\n */\n get(k: K, getOptions: LRUCache.GetOptions = {}) {\n const { status = metrics.hasSubscribers ? {} : undefined } = getOptions\n getOptions.status = status\n if (status) {\n status.op = 'get'\n status.key = k\n status.cache = this\n }\n const result = this.#get(k, getOptions)\n if (status) {\n if (result !== undefined) status.value = result\n if (metrics.hasSubscribers) metrics.publish(status)\n }\n return result\n }\n\n #get(k: K, getOptions: LRUCache.GetOptions = {}) {\n const {\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n status,\n } = getOptions\n const index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.get = 'miss'\n return undefined\n }\n const value = this.#valList[index]\n const fetching = this.#isBackgroundFetch(value)\n if (status) this.#statusTTL(status, index)\n if (this.#isStale(index)) {\n // delete only if not an in-flight background fetch\n if (!fetching) {\n if (!noDeleteOnStaleGet) {\n this.#delete(k, 'expire')\n }\n if (status) status.get = 'stale'\n if (allowStale) {\n if (status) status.returnedStale = true\n return value\n }\n return undefined\n }\n if (status) status.get = 'stale-fetching'\n if (allowStale && value.__staleWhileFetching !== undefined) {\n if (status) status.returnedStale = true\n return value.__staleWhileFetching\n }\n return undefined\n }\n // not stale\n if (status) status.get = fetching ? 'fetching' : 'hit'\n // if we're currently fetching it, we don't actually have it yet\n // it's not stale, which means this isn't a staleWhileRefetching.\n // If it's not stale, and fetching, AND has a __staleWhileFetching\n // value, then that means the user fetched with {forceRefresh:true},\n // so it's safe to return that value.\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n return fetching ? value.__staleWhileFetching : value\n }\n\n #connect(p: Index, n: Index) {\n this.#prev[n] = p\n this.#next[p] = n\n }\n\n #moveToTail(index: Index): void {\n // if tail already, nothing to do\n // if head, move head to next[index]\n // else\n // move next[prev[index]] to next[index] (head has no prev)\n // move prev[next[index]] to prev[index]\n // prev[index] = tail\n // next[tail] = index\n // tail = index\n if (index !== this.#tail) {\n if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n this.#connect(\n this.#prev[index] as Index,\n this.#next[index] as Index,\n )\n }\n this.#connect(this.#tail, index)\n this.#tail = index\n }\n }\n\n /**\n * Deletes a key out of the cache.\n *\n * Returns true if the key was deleted, false otherwise.\n */\n delete(k: K) {\n return this.#delete(k, 'delete')\n }\n\n #delete(k: K, reason: LRUCache.DisposeReason) {\n if (metrics.hasSubscribers) {\n metrics.publish({\n op: 'delete',\n delete: reason,\n key: k,\n cache: this,\n })\n }\n let deleted = false\n if (this.#size !== 0) {\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n if (this.#autopurgeTimers?.[index]) {\n clearTimeout(this.#autopurgeTimers?.[index])\n this.#autopurgeTimers[index] = undefined\n }\n deleted = true\n if (this.#size === 1) {\n this.#clear(reason)\n } else {\n this.#removeItemSize(index)\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k, reason])\n }\n }\n this.#keyMap.delete(k)\n this.#keyList[index] = undefined\n this.#valList[index] = undefined\n if (index === this.#tail) {\n this.#tail = this.#prev[index] as Index\n } else if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n const pi = this.#prev[index] as number\n this.#next[pi] = this.#next[index] as number\n const ni = this.#next[index] as number\n this.#prev[ni] = this.#prev[index] as number\n }\n this.#size--\n this.#free.push(index)\n }\n }\n }\n if (this.#hasDisposeAfter && this.#disposed?.length) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return deleted\n }\n\n /**\n * Clear the cache entirely, throwing away all values.\n */\n clear() {\n return this.#clear('delete')\n }\n #clear(reason: LRUCache.DisposeReason) {\n for (const index of this.#rindexes({ allowStale: true })) {\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else {\n const k = this.#keyList[index]\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k as K, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k as K, reason])\n }\n }\n }\n\n this.#keyMap.clear()\n void this.#valList.fill(undefined)\n this.#keyList.fill(undefined)\n if (this.#ttls && this.#starts) {\n this.#ttls.fill(0)\n this.#starts.fill(0)\n for (const t of this.#autopurgeTimers ?? []) {\n if (t !== undefined) clearTimeout(t)\n }\n this.#autopurgeTimers?.fill(undefined)\n }\n if (this.#sizes) {\n this.#sizes.fill(0)\n }\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free.length = 0\n this.#calculatedSize = 0\n this.#size = 0\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n}\n"], + "mappings": "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", + "names": ["tracingChannel", "channel", "metrics", "tracing", "defaultPerf", "hasSubscribers", "metrics", "tracing", "warned", "PROCESS", "emitWarning", "msg", "type", "code", "fn", "shouldWarn", "isPosInt", "n", "getUintArray", "max", "ZeroArray", "size", "Stack", "_Stack", "#constructing", "HeapCls", "s", "LRUCache", "_LRUCache", "#max", "#maxSize", "#dispose", "#onInsert", "#disposeAfter", "#fetchMethod", "#memoMethod", "#perf", "#size", "#calculatedSize", "#keyMap", "#keyList", "#valList", "#next", "#prev", "#head", "#tail", "#free", "#disposed", "#sizes", "#starts", "#ttls", "#autopurgeTimers", "#hasDispose", "#hasFetchMethod", "#hasDisposeAfter", "#hasOnInsert", "c", "p", "#isBackgroundFetch", "k", "index", "options", "context", "#backgroundFetch", "#moveToTail", "#indexes", "#rindexes", "#isStale", "ttl", "ttlResolution", "ttlAutopurge", "updateAgeOnGet", "updateAgeOnHas", "allowStale", "dispose", "onInsert", "disposeAfter", "noDisposeOnSet", "noUpdateTTL", "maxSize", "maxEntrySize", "sizeCalculation", "fetchMethod", "memoMethod", "noDeleteOnFetchRejection", "noDeleteOnStaleGet", "allowStaleOnFetchRejection", "allowStaleOnFetchAbort", "ignoreFetchAbort", "backgroundFetchSize", "perf", "defaultPerf", "UintArray", "#initializeSizeTracking", "#initializeTTLTracking", "code", "shouldWarn", "warned", "emitWarning", "key", "ttls", "starts", "purgeTimers", "#setItemTTL", "start", "setPurgetTimer", "#updateItemAge", "t", "#delete", "#statusTTL", "status", "cachedNow", "getNow", "age", "sizes", "#removeItemSize", "#requireSize", "v", "#addItemSize", "#evict", "_i", "_s", "_st", "_k", "_v", "i", "#isValidIndex", "fn", "getOptions", "value", "#get", "thisp", "deleted", "entry", "remain", "arr", "#set", "setOptions", "metrics", "result", "bf", "isBF", "oldVal", "oldValue", "setType", "dt", "task", "val", "free", "head", "hasOptions", "#has", "peekOptions", "hasSubscribers", "#peek", "ac", "signal", "fetchOpts", "cb", "updateCache", "aborted", "ignoreAbort", "proceed", "fetchFail", "vl", "eb", "er", "allowStaleAborted", "noDelete", "pcall", "res", "rej", "fmp", "b", "fetchOptions", "ths", "tracing", "#fetch", "forceRefresh", "stale", "isStale", "staleVal", "#forceFetch", "memoOptions", "#memo", "refresh", "vv", "fetching", "#connect", "reason", "#clear", "pi", "ni"] +} diff --git a/node_modules/lru-cache/dist/esm/node/perf.d.ts b/node_modules/lru-cache/dist/esm/node/perf.d.ts new file mode 100644 index 00000000..15a4a627 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/node/perf.d.ts @@ -0,0 +1,12 @@ +/** + * this provides the default Perf object source, either the + * `performance` global, or the `Date` constructor. + * + * it can be passed in via configuration to override it + * for a single LRU object. + */ +export type Perf = { + now: () => number; +}; +export declare const defaultPerf: Perf; +//# sourceMappingURL=perf.d.ts.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/node/perf.d.ts.map b/node_modules/lru-cache/dist/esm/node/perf.d.ts.map new file mode 100644 index 00000000..3e239ce9 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/node/perf.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"perf.d.ts","sourceRoot":"","sources":["../../../src/perf.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,IAAI,GAAG;IAAE,GAAG,EAAE,MAAM,MAAM,CAAA;CAAE,CAAA;AACxC,eAAO,MAAM,WAAW,EAAE,IAQG,CAAA"} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/node/perf.js b/node_modules/lru-cache/dist/esm/node/perf.js new file mode 100644 index 00000000..f21cd88c --- /dev/null +++ b/node_modules/lru-cache/dist/esm/node/perf.js @@ -0,0 +1,7 @@ +export const defaultPerf = (typeof performance === 'object' && + performance && + typeof performance.now === 'function') ? + /* c8 ignore start - this gets covered, but c8 gets confused */ + performance + : /* c8 ignore stop */ Date; +//# sourceMappingURL=perf.js.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/node/perf.js.map b/node_modules/lru-cache/dist/esm/node/perf.js.map new file mode 100644 index 00000000..5dc82212 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/node/perf.js.map @@ -0,0 +1 @@ +{"version":3,"file":"perf.js","sourceRoot":"","sources":["../../../src/perf.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,WAAW,GACtB,CACE,OAAO,WAAW,KAAK,QAAQ;IAC/B,WAAW;IACX,OAAO,WAAW,CAAC,GAAG,KAAK,UAAU,CACtC,CAAC,CAAC;IACD,+DAA+D;IAC/D,WAAW;IACb,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAA","sourcesContent":["/**\n * this provides the default Perf object source, either the\n * `performance` global, or the `Date` constructor.\n *\n * it can be passed in via configuration to override it\n * for a single LRU object.\n */\nexport type Perf = { now: () => number }\nexport const defaultPerf: Perf =\n (\n typeof performance === 'object' &&\n performance &&\n typeof performance.now === 'function'\n ) ?\n /* c8 ignore start - this gets covered, but c8 gets confused */\n performance\n : /* c8 ignore stop */ Date\n"]} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/package.json b/node_modules/lru-cache/dist/esm/package.json new file mode 100644 index 00000000..3dbc1ca5 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/node_modules/lru-cache/dist/esm/perf.d.ts b/node_modules/lru-cache/dist/esm/perf.d.ts new file mode 100644 index 00000000..15a4a627 --- /dev/null +++ b/node_modules/lru-cache/dist/esm/perf.d.ts @@ -0,0 +1,12 @@ +/** + * this provides the default Perf object source, either the + * `performance` global, or the `Date` constructor. + * + * it can be passed in via configuration to override it + * for a single LRU object. + */ +export type Perf = { + now: () => number; +}; +export declare const defaultPerf: Perf; +//# sourceMappingURL=perf.d.ts.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/perf.d.ts.map b/node_modules/lru-cache/dist/esm/perf.d.ts.map new file mode 100644 index 00000000..fd6eeeed --- /dev/null +++ b/node_modules/lru-cache/dist/esm/perf.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"perf.d.ts","sourceRoot":"","sources":["../../src/perf.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,IAAI,GAAG;IAAE,GAAG,EAAE,MAAM,MAAM,CAAA;CAAE,CAAA;AACxC,eAAO,MAAM,WAAW,EAAE,IAQG,CAAA"} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/perf.js b/node_modules/lru-cache/dist/esm/perf.js new file mode 100644 index 00000000..f21cd88c --- /dev/null +++ b/node_modules/lru-cache/dist/esm/perf.js @@ -0,0 +1,7 @@ +export const defaultPerf = (typeof performance === 'object' && + performance && + typeof performance.now === 'function') ? + /* c8 ignore start - this gets covered, but c8 gets confused */ + performance + : /* c8 ignore stop */ Date; +//# sourceMappingURL=perf.js.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/perf.js.map b/node_modules/lru-cache/dist/esm/perf.js.map new file mode 100644 index 00000000..86425c7d --- /dev/null +++ b/node_modules/lru-cache/dist/esm/perf.js.map @@ -0,0 +1 @@ +{"version":3,"file":"perf.js","sourceRoot":"","sources":["../../src/perf.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,WAAW,GACtB,CACE,OAAO,WAAW,KAAK,QAAQ;IAC/B,WAAW;IACX,OAAO,WAAW,CAAC,GAAG,KAAK,UAAU,CACtC,CAAC,CAAC;IACD,+DAA+D;IAC/D,WAAW;IACb,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAA","sourcesContent":["/**\n * this provides the default Perf object source, either the\n * `performance` global, or the `Date` constructor.\n *\n * it can be passed in via configuration to override it\n * for a single LRU object.\n */\nexport type Perf = { now: () => number }\nexport const defaultPerf: Perf =\n (\n typeof performance === 'object' &&\n performance &&\n typeof performance.now === 'function'\n ) ?\n /* c8 ignore start - this gets covered, but c8 gets confused */\n performance\n : /* c8 ignore stop */ Date\n"]} \ No newline at end of file diff --git a/node_modules/lru-cache/package.json b/node_modules/lru-cache/package.json new file mode 100644 index 00000000..6ada2c21 --- /dev/null +++ b/node_modules/lru-cache/package.json @@ -0,0 +1,154 @@ +{ + "name": "lru-cache", + "description": "A cache object that deletes the least-recently-used items.", + "version": "11.5.1", + "author": "Isaac Z. Schlueter ", + "keywords": [ + "mru", + "lru", + "cache" + ], + "sideEffects": false, + "scripts": { + "build": "npm run prepare", + "prepare": "tshy && bash scripts/build.sh", + "pretest": "npm run prepare", + "presnap": "npm run prepare", + "test": "tap", + "snap": "tap", + "preversion": "npm test", + "postversion": "npm publish", + "prepublishOnly": "git push origin --follow-tags", + "format": "prettier --write .", + "typedoc": "typedoc --tsconfig ./.tshy/esm.json ./src/*.ts", + "benchmark-results-typedoc": "bash scripts/benchmark-results-typedoc.sh", + "prebenchmark": "npm run prepare", + "benchmark": "make -C benchmark", + "preprofile": "npm run prepare", + "profile": "make -C benchmark profile", + "lint": "oxlint --fix src test", + "postsnap": "npm run lint", + "postlint": "npm run format" + }, + "main": "./dist/commonjs/index.min.js", + "types": "./dist/commonjs/index.d.ts", + "tshy": { + "esmDialects": [ + "browser", + "node" + ], + "commonjsDialects": [ + "browser", + "node" + ], + "exports": { + "./raw": "./src/index.ts", + ".": { + "import": { + "browser": { + "types": "./dist/esm/browser/index.d.ts", + "default": "./dist/esm/browser/index.min.js" + }, + "node": { + "types": "./dist/esm/node/index.d.ts", + "default": "./dist/esm/node/index.min.js" + }, + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.min.js" + }, + "require": { + "browser": { + "types": "./dist/commonjs/browser/index.d.ts", + "default": "./dist/commonjs/browser/index.min.js" + }, + "node": { + "types": "./dist/commonjs/node/index.d.ts", + "default": "./dist/commonjs/node/index.min.js" + }, + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.min.js" + } + } + }, + "selfLink": false + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/isaacs/node-lru-cache.git" + }, + "devDependencies": { + "benchmark": "^2.1.4", + "esbuild": "^0.28.0", + "marked": "^4.2.12", + "mkdirp": "^3.0.1", + "oxlint": "^1.65.0", + "oxlint-tsgolint": "^0.22.1", + "prettier": "^3.8.3", + "tap": "^21.7.4", + "tshy": "^4.1.2", + "typedoc": "^0.28.19" + }, + "license": "BlueOak-1.0.0", + "files": [ + "dist" + ], + "engines": { + "node": "20 || >=22" + }, + "exports": { + "./raw": { + "import": { + "browser": { + "types": "./dist/esm/browser/index.d.ts", + "default": "./dist/esm/browser/index.js" + }, + "node": { + "types": "./dist/esm/node/index.d.ts", + "default": "./dist/esm/node/index.js" + }, + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "browser": { + "types": "./dist/commonjs/browser/index.d.ts", + "default": "./dist/commonjs/browser/index.js" + }, + "node": { + "types": "./dist/commonjs/node/index.d.ts", + "default": "./dist/commonjs/node/index.js" + }, + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.js" + } + }, + ".": { + "import": { + "browser": { + "types": "./dist/esm/browser/index.d.ts", + "default": "./dist/esm/browser/index.min.js" + }, + "node": { + "types": "./dist/esm/node/index.d.ts", + "default": "./dist/esm/node/index.min.js" + }, + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.min.js" + }, + "require": { + "browser": { + "types": "./dist/commonjs/browser/index.d.ts", + "default": "./dist/commonjs/browser/index.min.js" + }, + "node": { + "types": "./dist/commonjs/node/index.d.ts", + "default": "./dist/commonjs/node/index.min.js" + }, + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.min.js" + } + } + }, + "type": "module", + "module": "./dist/esm/index.min.js" +} diff --git a/node_modules/luxon/LICENSE.md b/node_modules/luxon/LICENSE.md new file mode 100644 index 00000000..2d560a64 --- /dev/null +++ b/node_modules/luxon/LICENSE.md @@ -0,0 +1,7 @@ +Copyright 2019 JS Foundation and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/luxon/README.md b/node_modules/luxon/README.md new file mode 100644 index 00000000..3fcacd7d --- /dev/null +++ b/node_modules/luxon/README.md @@ -0,0 +1,55 @@ +# Luxon + +[![MIT License][license-image]][license] [![Build Status][github-action-image]][github-action-url] [![NPM version][npm-version-image]][npm-url] [![Coverage Status][test-coverage-image]][test-coverage-url] [![PRs welcome][contributing-image]][contributing-url] + +Luxon is a library for working with dates and times in JavaScript. + +```js +DateTime.now().setZone("America/New_York").minus({ weeks: 1 }).endOf("day").toISO(); +``` + +## Upgrading to 3.0 + +[Guide](https://moment.github.io/luxon/#upgrading) + +## Features + * DateTime, Duration, and Interval types. + * Immutable, chainable, unambiguous API. + * Parsing and formatting for common and custom formats. + * Native time zone and Intl support (no locale or tz files). + +## Download/install + +[Download/install instructions](https://moment.github.io/luxon/#/install) + +## Documentation + +* [General documentation](https://moment.github.io/luxon/#/?id=luxon) +* [API docs](https://moment.github.io/luxon/api-docs/index.html) +* [Quick tour](https://moment.github.io/luxon/#/tour) +* [For Moment users](https://moment.github.io/luxon/#/moment) +* [Why does Luxon exist?](https://moment.github.io/luxon/#/why) +* [A quick demo](https://moment.github.io/luxon/demo/global.html) + +## Development + +See [contributing](CONTRIBUTING.md). + +![Phasers to stun][phasers-image] + +[license-image]: https://img.shields.io/badge/license-MIT-blue.svg +[license]: LICENSE.md + +[github-action-image]: https://github.com/moment/luxon/actions/workflows/test.yml/badge.svg +[github-action-url]: https://github.com/moment/luxon/actions/workflows/test.yml + +[npm-url]: https://npmjs.org/package/luxon +[npm-version-image]: https://badge.fury.io/js/luxon.svg + +[test-coverage-url]: https://codecov.io/gh/moment/luxon +[test-coverage-image]: https://codecov.io/gh/moment/luxon/branch/master/graph/badge.svg + +[contributing-url]: https://github.com/moment/luxon/blob/master/CONTRIBUTING.md +[contributing-image]: https://img.shields.io/badge/PRs-welcome-brightgreen.svg + +[phasers-image]: https://img.shields.io/badge/phasers-stun-brightgreen.svg diff --git a/node_modules/luxon/build/amd/luxon.js b/node_modules/luxon/build/amd/luxon.js new file mode 100644 index 00000000..dcdb4f91 --- /dev/null +++ b/node_modules/luxon/build/amd/luxon.js @@ -0,0 +1,8741 @@ +define(['exports'], (function (exports) { 'use strict'; + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); + } + } + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", { + writable: false + }); + return Constructor; + } + function _extends() { + _extends = Object.assign ? Object.assign.bind() : function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + return target; + }; + return _extends.apply(this, arguments); + } + function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + _setPrototypeOf(subClass, superClass); + } + function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); + } + function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf(o, p); + } + function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _construct(Parent, args, Class) { + if (_isNativeReflectConstruct()) { + _construct = Reflect.construct.bind(); + } else { + _construct = function _construct(Parent, args, Class) { + var a = [null]; + a.push.apply(a, args); + var Constructor = Function.bind.apply(Parent, a); + var instance = new Constructor(); + if (Class) _setPrototypeOf(instance, Class.prototype); + return instance; + }; + } + return _construct.apply(null, arguments); + } + function _isNativeFunction(fn) { + return Function.toString.call(fn).indexOf("[native code]") !== -1; + } + function _wrapNativeSuper(Class) { + var _cache = typeof Map === "function" ? new Map() : undefined; + _wrapNativeSuper = function _wrapNativeSuper(Class) { + if (Class === null || !_isNativeFunction(Class)) return Class; + if (typeof Class !== "function") { + throw new TypeError("Super expression must either be null or a function"); + } + if (typeof _cache !== "undefined") { + if (_cache.has(Class)) return _cache.get(Class); + _cache.set(Class, Wrapper); + } + function Wrapper() { + return _construct(Class, arguments, _getPrototypeOf(this).constructor); + } + Wrapper.prototype = Object.create(Class.prototype, { + constructor: { + value: Wrapper, + enumerable: false, + writable: true, + configurable: true + } + }); + return _setPrototypeOf(Wrapper, Class); + }; + return _wrapNativeSuper(Class); + } + function _objectWithoutPropertiesLoose(source, excluded) { + if (source == null) return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i; + for (i = 0; i < sourceKeys.length; i++) { + key = sourceKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + target[key] = source[key]; + } + return target; + } + function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); + } + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; + return arr2; + } + function _createForOfIteratorHelperLoose(o, allowArrayLike) { + var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; + if (it) return (it = it.call(o)).next.bind(it); + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + return function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + function _toPrimitive(input, hint) { + if (typeof input !== "object" || input === null) return input; + var prim = input[Symbol.toPrimitive]; + if (prim !== undefined) { + var res = prim.call(input, hint || "default"); + if (typeof res !== "object") return res; + throw new TypeError("@@toPrimitive must return a primitive value."); + } + return (hint === "string" ? String : Number)(input); + } + function _toPropertyKey(arg) { + var key = _toPrimitive(arg, "string"); + return typeof key === "symbol" ? key : String(key); + } + + // these aren't really private, but nor are they really useful to document + /** + * @private + */ + var LuxonError = /*#__PURE__*/function (_Error) { + _inheritsLoose(LuxonError, _Error); + function LuxonError() { + return _Error.apply(this, arguments) || this; + } + return LuxonError; + }( /*#__PURE__*/_wrapNativeSuper(Error)); + /** + * @private + */ + var InvalidDateTimeError = /*#__PURE__*/function (_LuxonError) { + _inheritsLoose(InvalidDateTimeError, _LuxonError); + function InvalidDateTimeError(reason) { + return _LuxonError.call(this, "Invalid DateTime: " + reason.toMessage()) || this; + } + return InvalidDateTimeError; + }(LuxonError); + + /** + * @private + */ + var InvalidIntervalError = /*#__PURE__*/function (_LuxonError2) { + _inheritsLoose(InvalidIntervalError, _LuxonError2); + function InvalidIntervalError(reason) { + return _LuxonError2.call(this, "Invalid Interval: " + reason.toMessage()) || this; + } + return InvalidIntervalError; + }(LuxonError); + + /** + * @private + */ + var InvalidDurationError = /*#__PURE__*/function (_LuxonError3) { + _inheritsLoose(InvalidDurationError, _LuxonError3); + function InvalidDurationError(reason) { + return _LuxonError3.call(this, "Invalid Duration: " + reason.toMessage()) || this; + } + return InvalidDurationError; + }(LuxonError); + + /** + * @private + */ + var ConflictingSpecificationError = /*#__PURE__*/function (_LuxonError4) { + _inheritsLoose(ConflictingSpecificationError, _LuxonError4); + function ConflictingSpecificationError() { + return _LuxonError4.apply(this, arguments) || this; + } + return ConflictingSpecificationError; + }(LuxonError); + + /** + * @private + */ + var InvalidUnitError = /*#__PURE__*/function (_LuxonError5) { + _inheritsLoose(InvalidUnitError, _LuxonError5); + function InvalidUnitError(unit) { + return _LuxonError5.call(this, "Invalid unit " + unit) || this; + } + return InvalidUnitError; + }(LuxonError); + + /** + * @private + */ + var InvalidArgumentError = /*#__PURE__*/function (_LuxonError6) { + _inheritsLoose(InvalidArgumentError, _LuxonError6); + function InvalidArgumentError() { + return _LuxonError6.apply(this, arguments) || this; + } + return InvalidArgumentError; + }(LuxonError); + + /** + * @private + */ + var ZoneIsAbstractError = /*#__PURE__*/function (_LuxonError7) { + _inheritsLoose(ZoneIsAbstractError, _LuxonError7); + function ZoneIsAbstractError() { + return _LuxonError7.call(this, "Zone is an abstract class") || this; + } + return ZoneIsAbstractError; + }(LuxonError); + + /** + * @private + */ + + var n = "numeric", + s = "short", + l = "long"; + var DATE_SHORT = { + year: n, + month: n, + day: n + }; + var DATE_MED = { + year: n, + month: s, + day: n + }; + var DATE_MED_WITH_WEEKDAY = { + year: n, + month: s, + day: n, + weekday: s + }; + var DATE_FULL = { + year: n, + month: l, + day: n + }; + var DATE_HUGE = { + year: n, + month: l, + day: n, + weekday: l + }; + var TIME_SIMPLE = { + hour: n, + minute: n + }; + var TIME_WITH_SECONDS = { + hour: n, + minute: n, + second: n + }; + var TIME_WITH_SHORT_OFFSET = { + hour: n, + minute: n, + second: n, + timeZoneName: s + }; + var TIME_WITH_LONG_OFFSET = { + hour: n, + minute: n, + second: n, + timeZoneName: l + }; + var TIME_24_SIMPLE = { + hour: n, + minute: n, + hourCycle: "h23" + }; + var TIME_24_WITH_SECONDS = { + hour: n, + minute: n, + second: n, + hourCycle: "h23" + }; + var TIME_24_WITH_SHORT_OFFSET = { + hour: n, + minute: n, + second: n, + hourCycle: "h23", + timeZoneName: s + }; + var TIME_24_WITH_LONG_OFFSET = { + hour: n, + minute: n, + second: n, + hourCycle: "h23", + timeZoneName: l + }; + var DATETIME_SHORT = { + year: n, + month: n, + day: n, + hour: n, + minute: n + }; + var DATETIME_SHORT_WITH_SECONDS = { + year: n, + month: n, + day: n, + hour: n, + minute: n, + second: n + }; + var DATETIME_MED = { + year: n, + month: s, + day: n, + hour: n, + minute: n + }; + var DATETIME_MED_WITH_SECONDS = { + year: n, + month: s, + day: n, + hour: n, + minute: n, + second: n + }; + var DATETIME_MED_WITH_WEEKDAY = { + year: n, + month: s, + day: n, + weekday: s, + hour: n, + minute: n + }; + var DATETIME_FULL = { + year: n, + month: l, + day: n, + hour: n, + minute: n, + timeZoneName: s + }; + var DATETIME_FULL_WITH_SECONDS = { + year: n, + month: l, + day: n, + hour: n, + minute: n, + second: n, + timeZoneName: s + }; + var DATETIME_HUGE = { + year: n, + month: l, + day: n, + weekday: l, + hour: n, + minute: n, + timeZoneName: l + }; + var DATETIME_HUGE_WITH_SECONDS = { + year: n, + month: l, + day: n, + weekday: l, + hour: n, + minute: n, + second: n, + timeZoneName: l + }; + + /** + * @interface + */ + var Zone = /*#__PURE__*/function () { + function Zone() {} + var _proto = Zone.prototype; + /** + * Returns the offset's common name (such as EST) at the specified timestamp + * @abstract + * @param {number} ts - Epoch milliseconds for which to get the name + * @param {Object} opts - Options to affect the format + * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'. + * @param {string} opts.locale - What locale to return the offset name in. + * @return {string} + */ + _proto.offsetName = function offsetName(ts, opts) { + throw new ZoneIsAbstractError(); + } + + /** + * Returns the offset's value as a string + * @abstract + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */; + _proto.formatOffset = function formatOffset(ts, format) { + throw new ZoneIsAbstractError(); + } + + /** + * Return the offset in minutes for this zone at the specified timestamp. + * @abstract + * @param {number} ts - Epoch milliseconds for which to compute the offset + * @return {number} + */; + _proto.offset = function offset(ts) { + throw new ZoneIsAbstractError(); + } + + /** + * Return whether this Zone is equal to another zone + * @abstract + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */; + _proto.equals = function equals(otherZone) { + throw new ZoneIsAbstractError(); + } + + /** + * Return whether this Zone is valid. + * @abstract + * @type {boolean} + */; + _createClass(Zone, [{ + key: "type", + get: + /** + * The type of zone + * @abstract + * @type {string} + */ + function get() { + throw new ZoneIsAbstractError(); + } + + /** + * The name of this zone. + * @abstract + * @type {string} + */ + }, { + key: "name", + get: function get() { + throw new ZoneIsAbstractError(); + } + + /** + * The IANA name of this zone. + * Defaults to `name` if not overwritten by a subclass. + * @abstract + * @type {string} + */ + }, { + key: "ianaName", + get: function get() { + return this.name; + } + + /** + * Returns whether the offset is known to be fixed for the whole year. + * @abstract + * @type {boolean} + */ + }, { + key: "isUniversal", + get: function get() { + throw new ZoneIsAbstractError(); + } + }, { + key: "isValid", + get: function get() { + throw new ZoneIsAbstractError(); + } + }]); + return Zone; + }(); + + var singleton$1 = null; + + /** + * Represents the local zone for this JavaScript environment. + * @implements {Zone} + */ + var SystemZone = /*#__PURE__*/function (_Zone) { + _inheritsLoose(SystemZone, _Zone); + function SystemZone() { + return _Zone.apply(this, arguments) || this; + } + var _proto = SystemZone.prototype; + /** @override **/ + _proto.offsetName = function offsetName(ts, _ref) { + var format = _ref.format, + locale = _ref.locale; + return parseZoneInfo(ts, format, locale); + } + + /** @override **/; + _proto.formatOffset = function formatOffset$1(ts, format) { + return formatOffset(this.offset(ts), format); + } + + /** @override **/; + _proto.offset = function offset(ts) { + return -new Date(ts).getTimezoneOffset(); + } + + /** @override **/; + _proto.equals = function equals(otherZone) { + return otherZone.type === "system"; + } + + /** @override **/; + _createClass(SystemZone, [{ + key: "type", + get: /** @override **/ + function get() { + return "system"; + } + + /** @override **/ + }, { + key: "name", + get: function get() { + return new Intl.DateTimeFormat().resolvedOptions().timeZone; + } + + /** @override **/ + }, { + key: "isUniversal", + get: function get() { + return false; + } + }, { + key: "isValid", + get: function get() { + return true; + } + }], [{ + key: "instance", + get: + /** + * Get a singleton instance of the local zone + * @return {SystemZone} + */ + function get() { + if (singleton$1 === null) { + singleton$1 = new SystemZone(); + } + return singleton$1; + } + }]); + return SystemZone; + }(Zone); + + var dtfCache = new Map(); + function makeDTF(zoneName) { + var dtf = dtfCache.get(zoneName); + if (dtf === undefined) { + dtf = new Intl.DateTimeFormat("en-US", { + hour12: false, + timeZone: zoneName, + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + era: "short" + }); + dtfCache.set(zoneName, dtf); + } + return dtf; + } + var typeToPos = { + year: 0, + month: 1, + day: 2, + era: 3, + hour: 4, + minute: 5, + second: 6 + }; + function hackyOffset(dtf, date) { + var formatted = dtf.format(date).replace(/\u200E/g, ""), + parsed = /(\d+)\/(\d+)\/(\d+) (AD|BC),? (\d+):(\d+):(\d+)/.exec(formatted), + fMonth = parsed[1], + fDay = parsed[2], + fYear = parsed[3], + fadOrBc = parsed[4], + fHour = parsed[5], + fMinute = parsed[6], + fSecond = parsed[7]; + return [fYear, fMonth, fDay, fadOrBc, fHour, fMinute, fSecond]; + } + function partsOffset(dtf, date) { + var formatted = dtf.formatToParts(date); + var filled = []; + for (var i = 0; i < formatted.length; i++) { + var _formatted$i = formatted[i], + type = _formatted$i.type, + value = _formatted$i.value; + var pos = typeToPos[type]; + if (type === "era") { + filled[pos] = value; + } else if (!isUndefined(pos)) { + filled[pos] = parseInt(value, 10); + } + } + return filled; + } + var ianaZoneCache = new Map(); + /** + * A zone identified by an IANA identifier, like America/New_York + * @implements {Zone} + */ + var IANAZone = /*#__PURE__*/function (_Zone) { + _inheritsLoose(IANAZone, _Zone); + /** + * @param {string} name - Zone name + * @return {IANAZone} + */ + IANAZone.create = function create(name) { + var zone = ianaZoneCache.get(name); + if (zone === undefined) { + ianaZoneCache.set(name, zone = new IANAZone(name)); + } + return zone; + } + + /** + * Reset local caches. Should only be necessary in testing scenarios. + * @return {void} + */; + IANAZone.resetCache = function resetCache() { + ianaZoneCache.clear(); + dtfCache.clear(); + } + + /** + * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that. + * @param {string} s - The string to check validity on + * @example IANAZone.isValidSpecifier("America/New_York") //=> true + * @example IANAZone.isValidSpecifier("Sport~~blorp") //=> false + * @deprecated For backward compatibility, this forwards to isValidZone, better use `isValidZone()` directly instead. + * @return {boolean} + */; + IANAZone.isValidSpecifier = function isValidSpecifier(s) { + return this.isValidZone(s); + } + + /** + * Returns whether the provided string identifies a real zone + * @param {string} zone - The string to check + * @example IANAZone.isValidZone("America/New_York") //=> true + * @example IANAZone.isValidZone("Fantasia/Castle") //=> false + * @example IANAZone.isValidZone("Sport~~blorp") //=> false + * @return {boolean} + */; + IANAZone.isValidZone = function isValidZone(zone) { + if (!zone) { + return false; + } + try { + new Intl.DateTimeFormat("en-US", { + timeZone: zone + }).format(); + return true; + } catch (e) { + return false; + } + }; + function IANAZone(name) { + var _this; + _this = _Zone.call(this) || this; + /** @private **/ + _this.zoneName = name; + /** @private **/ + _this.valid = IANAZone.isValidZone(name); + return _this; + } + + /** + * The type of zone. `iana` for all instances of `IANAZone`. + * @override + * @type {string} + */ + var _proto = IANAZone.prototype; + /** + * Returns the offset's common name (such as EST) at the specified timestamp + * @override + * @param {number} ts - Epoch milliseconds for which to get the name + * @param {Object} opts - Options to affect the format + * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'. + * @param {string} opts.locale - What locale to return the offset name in. + * @return {string} + */ + _proto.offsetName = function offsetName(ts, _ref) { + var format = _ref.format, + locale = _ref.locale; + return parseZoneInfo(ts, format, locale, this.name); + } + + /** + * Returns the offset's value as a string + * @override + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */; + _proto.formatOffset = function formatOffset$1(ts, format) { + return formatOffset(this.offset(ts), format); + } + + /** + * Return the offset in minutes for this zone at the specified timestamp. + * @override + * @param {number} ts - Epoch milliseconds for which to compute the offset + * @return {number} + */; + _proto.offset = function offset(ts) { + if (!this.valid) return NaN; + var date = new Date(ts); + if (isNaN(date)) return NaN; + var dtf = makeDTF(this.name); + var _ref2 = dtf.formatToParts ? partsOffset(dtf, date) : hackyOffset(dtf, date), + year = _ref2[0], + month = _ref2[1], + day = _ref2[2], + adOrBc = _ref2[3], + hour = _ref2[4], + minute = _ref2[5], + second = _ref2[6]; + if (adOrBc === "BC") { + year = -Math.abs(year) + 1; + } + + // because we're using hour12 and https://bugs.chromium.org/p/chromium/issues/detail?id=1025564&can=2&q=%2224%3A00%22%20datetimeformat + var adjustedHour = hour === 24 ? 0 : hour; + var asUTC = objToLocalTS({ + year: year, + month: month, + day: day, + hour: adjustedHour, + minute: minute, + second: second, + millisecond: 0 + }); + var asTS = +date; + var over = asTS % 1000; + asTS -= over >= 0 ? over : 1000 + over; + return (asUTC - asTS) / (60 * 1000); + } + + /** + * Return whether this Zone is equal to another zone + * @override + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */; + _proto.equals = function equals(otherZone) { + return otherZone.type === "iana" && otherZone.name === this.name; + } + + /** + * Return whether this Zone is valid. + * @override + * @type {boolean} + */; + _createClass(IANAZone, [{ + key: "type", + get: function get() { + return "iana"; + } + + /** + * The name of this zone (i.e. the IANA zone name). + * @override + * @type {string} + */ + }, { + key: "name", + get: function get() { + return this.zoneName; + } + + /** + * Returns whether the offset is known to be fixed for the whole year: + * Always returns false for all IANA zones. + * @override + * @type {boolean} + */ + }, { + key: "isUniversal", + get: function get() { + return false; + } + }, { + key: "isValid", + get: function get() { + return this.valid; + } + }]); + return IANAZone; + }(Zone); + + var _excluded = ["base"], + _excluded2 = ["padTo", "floor"]; + + // todo - remap caching + + var intlLFCache = {}; + function getCachedLF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var key = JSON.stringify([locString, opts]); + var dtf = intlLFCache[key]; + if (!dtf) { + dtf = new Intl.ListFormat(locString, opts); + intlLFCache[key] = dtf; + } + return dtf; + } + var intlDTCache = new Map(); + function getCachedDTF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var key = JSON.stringify([locString, opts]); + var dtf = intlDTCache.get(key); + if (dtf === undefined) { + dtf = new Intl.DateTimeFormat(locString, opts); + intlDTCache.set(key, dtf); + } + return dtf; + } + var intlNumCache = new Map(); + function getCachedINF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var key = JSON.stringify([locString, opts]); + var inf = intlNumCache.get(key); + if (inf === undefined) { + inf = new Intl.NumberFormat(locString, opts); + intlNumCache.set(key, inf); + } + return inf; + } + var intlRelCache = new Map(); + function getCachedRTF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var _opts = opts; + _opts.base; + var cacheKeyOpts = _objectWithoutPropertiesLoose(_opts, _excluded); // exclude `base` from the options + var key = JSON.stringify([locString, cacheKeyOpts]); + var inf = intlRelCache.get(key); + if (inf === undefined) { + inf = new Intl.RelativeTimeFormat(locString, opts); + intlRelCache.set(key, inf); + } + return inf; + } + var sysLocaleCache = null; + function systemLocale() { + if (sysLocaleCache) { + return sysLocaleCache; + } else { + sysLocaleCache = new Intl.DateTimeFormat().resolvedOptions().locale; + return sysLocaleCache; + } + } + var intlResolvedOptionsCache = new Map(); + function getCachedIntResolvedOptions(locString) { + var opts = intlResolvedOptionsCache.get(locString); + if (opts === undefined) { + opts = new Intl.DateTimeFormat(locString).resolvedOptions(); + intlResolvedOptionsCache.set(locString, opts); + } + return opts; + } + var weekInfoCache = new Map(); + function getCachedWeekInfo(locString) { + var data = weekInfoCache.get(locString); + if (!data) { + var locale = new Intl.Locale(locString); + // browsers currently implement this as a property, but spec says it should be a getter function + data = "getWeekInfo" in locale ? locale.getWeekInfo() : locale.weekInfo; + // minimalDays was removed from WeekInfo: https://github.com/tc39/proposal-intl-locale-info/issues/86 + if (!("minimalDays" in data)) { + data = _extends({}, fallbackWeekSettings, data); + } + weekInfoCache.set(locString, data); + } + return data; + } + function parseLocaleString(localeStr) { + // I really want to avoid writing a BCP 47 parser + // see, e.g. https://github.com/wooorm/bcp-47 + // Instead, we'll do this: + + // a) if the string has no -u extensions, just leave it alone + // b) if it does, use Intl to resolve everything + // c) if Intl fails, try again without the -u + + // private subtags and unicode subtags have ordering requirements, + // and we're not properly parsing this, so just strip out the + // private ones if they exist. + var xIndex = localeStr.indexOf("-x-"); + if (xIndex !== -1) { + localeStr = localeStr.substring(0, xIndex); + } + var uIndex = localeStr.indexOf("-u-"); + if (uIndex === -1) { + return [localeStr]; + } else { + var options; + var selectedStr; + try { + options = getCachedDTF(localeStr).resolvedOptions(); + selectedStr = localeStr; + } catch (e) { + var smaller = localeStr.substring(0, uIndex); + options = getCachedDTF(smaller).resolvedOptions(); + selectedStr = smaller; + } + var _options = options, + numberingSystem = _options.numberingSystem, + calendar = _options.calendar; + return [selectedStr, numberingSystem, calendar]; + } + } + function intlConfigString(localeStr, numberingSystem, outputCalendar) { + if (outputCalendar || numberingSystem) { + if (!localeStr.includes("-u-")) { + localeStr += "-u"; + } + if (outputCalendar) { + localeStr += "-ca-" + outputCalendar; + } + if (numberingSystem) { + localeStr += "-nu-" + numberingSystem; + } + return localeStr; + } else { + return localeStr; + } + } + function mapMonths(f) { + var ms = []; + for (var i = 1; i <= 12; i++) { + var dt = DateTime.utc(2009, i, 1); + ms.push(f(dt)); + } + return ms; + } + function mapWeekdays(f) { + var ms = []; + for (var i = 1; i <= 7; i++) { + var dt = DateTime.utc(2016, 11, 13 + i); + ms.push(f(dt)); + } + return ms; + } + function listStuff(loc, length, englishFn, intlFn) { + var mode = loc.listingMode(); + if (mode === "error") { + return null; + } else if (mode === "en") { + return englishFn(length); + } else { + return intlFn(length); + } + } + function supportsFastNumbers(loc) { + if (loc.numberingSystem && loc.numberingSystem !== "latn") { + return false; + } else { + return loc.numberingSystem === "latn" || !loc.locale || loc.locale.startsWith("en") || getCachedIntResolvedOptions(loc.locale).numberingSystem === "latn"; + } + } + + /** + * @private + */ + var PolyNumberFormatter = /*#__PURE__*/function () { + function PolyNumberFormatter(intl, forceSimple, opts) { + this.padTo = opts.padTo || 0; + this.floor = opts.floor || false; + opts.padTo; + opts.floor; + var otherOpts = _objectWithoutPropertiesLoose(opts, _excluded2); + if (!forceSimple || Object.keys(otherOpts).length > 0) { + var intlOpts = _extends({ + useGrouping: false + }, opts); + if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo; + this.inf = getCachedINF(intl, intlOpts); + } + } + var _proto = PolyNumberFormatter.prototype; + _proto.format = function format(i) { + if (this.inf) { + var fixed = this.floor ? Math.floor(i) : i; + return this.inf.format(fixed); + } else { + // to match the browser's numberformatter defaults + var _fixed = this.floor ? Math.floor(i) : roundTo(i, 3); + return padStart(_fixed, this.padTo); + } + }; + return PolyNumberFormatter; + }(); + /** + * @private + */ + var PolyDateFormatter = /*#__PURE__*/function () { + function PolyDateFormatter(dt, intl, opts) { + this.opts = opts; + this.originalZone = undefined; + var z = undefined; + if (this.opts.timeZone) { + // Don't apply any workarounds if a timeZone is explicitly provided in opts + this.dt = dt; + } else if (dt.zone.type === "fixed") { + // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like. + // That is why fixed-offset TZ is set to that unless it is: + // 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT. + // 2. Unsupported by the browser: + // - some do not support Etc/ + // - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata + var gmtOffset = -1 * (dt.offset / 60); + var offsetZ = gmtOffset >= 0 ? "Etc/GMT+" + gmtOffset : "Etc/GMT" + gmtOffset; + if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) { + z = offsetZ; + this.dt = dt; + } else { + // Not all fixed-offset zones like Etc/+4:30 are present in tzdata so + // we manually apply the offset and substitute the zone as needed. + z = "UTC"; + this.dt = dt.offset === 0 ? dt : dt.setZone("UTC").plus({ + minutes: dt.offset + }); + this.originalZone = dt.zone; + } + } else if (dt.zone.type === "system") { + this.dt = dt; + } else if (dt.zone.type === "iana") { + this.dt = dt; + z = dt.zone.name; + } else { + // Custom zones can have any offset / offsetName so we just manually + // apply the offset and substitute the zone as needed. + z = "UTC"; + this.dt = dt.setZone("UTC").plus({ + minutes: dt.offset + }); + this.originalZone = dt.zone; + } + var intlOpts = _extends({}, this.opts); + intlOpts.timeZone = intlOpts.timeZone || z; + this.dtf = getCachedDTF(intl, intlOpts); + } + var _proto2 = PolyDateFormatter.prototype; + _proto2.format = function format() { + if (this.originalZone) { + // If we have to substitute in the actual zone name, we have to use + // formatToParts so that the timezone can be replaced. + return this.formatToParts().map(function (_ref) { + var value = _ref.value; + return value; + }).join(""); + } + return this.dtf.format(this.dt.toJSDate()); + }; + _proto2.formatToParts = function formatToParts() { + var _this = this; + var parts = this.dtf.formatToParts(this.dt.toJSDate()); + if (this.originalZone) { + return parts.map(function (part) { + if (part.type === "timeZoneName") { + var offsetName = _this.originalZone.offsetName(_this.dt.ts, { + locale: _this.dt.locale, + format: _this.opts.timeZoneName + }); + return _extends({}, part, { + value: offsetName + }); + } else { + return part; + } + }); + } + return parts; + }; + _proto2.resolvedOptions = function resolvedOptions() { + return this.dtf.resolvedOptions(); + }; + return PolyDateFormatter; + }(); + /** + * @private + */ + var PolyRelFormatter = /*#__PURE__*/function () { + function PolyRelFormatter(intl, isEnglish, opts) { + this.opts = _extends({ + style: "long" + }, opts); + if (!isEnglish && hasRelative()) { + this.rtf = getCachedRTF(intl, opts); + } + } + var _proto3 = PolyRelFormatter.prototype; + _proto3.format = function format(count, unit) { + if (this.rtf) { + return this.rtf.format(count, unit); + } else { + return formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== "long"); + } + }; + _proto3.formatToParts = function formatToParts(count, unit) { + if (this.rtf) { + return this.rtf.formatToParts(count, unit); + } else { + return []; + } + }; + return PolyRelFormatter; + }(); + var fallbackWeekSettings = { + firstDay: 1, + minimalDays: 4, + weekend: [6, 7] + }; + + /** + * @private + */ + var Locale = /*#__PURE__*/function () { + Locale.fromOpts = function fromOpts(opts) { + return Locale.create(opts.locale, opts.numberingSystem, opts.outputCalendar, opts.weekSettings, opts.defaultToEN); + }; + Locale.create = function create(locale, numberingSystem, outputCalendar, weekSettings, defaultToEN) { + if (defaultToEN === void 0) { + defaultToEN = false; + } + var specifiedLocale = locale || Settings.defaultLocale; + // the system locale is useful for human-readable strings but annoying for parsing/formatting known formats + var localeR = specifiedLocale || (defaultToEN ? "en-US" : systemLocale()); + var numberingSystemR = numberingSystem || Settings.defaultNumberingSystem; + var outputCalendarR = outputCalendar || Settings.defaultOutputCalendar; + var weekSettingsR = validateWeekSettings(weekSettings) || Settings.defaultWeekSettings; + return new Locale(localeR, numberingSystemR, outputCalendarR, weekSettingsR, specifiedLocale); + }; + Locale.resetCache = function resetCache() { + sysLocaleCache = null; + intlDTCache.clear(); + intlNumCache.clear(); + intlRelCache.clear(); + intlResolvedOptionsCache.clear(); + weekInfoCache.clear(); + }; + Locale.fromObject = function fromObject(_temp) { + var _ref2 = _temp === void 0 ? {} : _temp, + locale = _ref2.locale, + numberingSystem = _ref2.numberingSystem, + outputCalendar = _ref2.outputCalendar, + weekSettings = _ref2.weekSettings; + return Locale.create(locale, numberingSystem, outputCalendar, weekSettings); + }; + function Locale(locale, numbering, outputCalendar, weekSettings, specifiedLocale) { + var _parseLocaleString = parseLocaleString(locale), + parsedLocale = _parseLocaleString[0], + parsedNumberingSystem = _parseLocaleString[1], + parsedOutputCalendar = _parseLocaleString[2]; + this.locale = parsedLocale; + this.numberingSystem = numbering || parsedNumberingSystem || null; + this.outputCalendar = outputCalendar || parsedOutputCalendar || null; + this.weekSettings = weekSettings; + this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar); + this.weekdaysCache = { + format: {}, + standalone: {} + }; + this.monthsCache = { + format: {}, + standalone: {} + }; + this.meridiemCache = null; + this.eraCache = {}; + this.specifiedLocale = specifiedLocale; + this.fastNumbersCached = null; + } + var _proto4 = Locale.prototype; + _proto4.listingMode = function listingMode() { + var isActuallyEn = this.isEnglish(); + var hasNoWeirdness = (this.numberingSystem === null || this.numberingSystem === "latn") && (this.outputCalendar === null || this.outputCalendar === "gregory"); + return isActuallyEn && hasNoWeirdness ? "en" : "intl"; + }; + _proto4.clone = function clone(alts) { + if (!alts || Object.getOwnPropertyNames(alts).length === 0) { + return this; + } else { + return Locale.create(alts.locale || this.specifiedLocale, alts.numberingSystem || this.numberingSystem, alts.outputCalendar || this.outputCalendar, validateWeekSettings(alts.weekSettings) || this.weekSettings, alts.defaultToEN || false); + } + }; + _proto4.redefaultToEN = function redefaultToEN(alts) { + if (alts === void 0) { + alts = {}; + } + return this.clone(_extends({}, alts, { + defaultToEN: true + })); + }; + _proto4.redefaultToSystem = function redefaultToSystem(alts) { + if (alts === void 0) { + alts = {}; + } + return this.clone(_extends({}, alts, { + defaultToEN: false + })); + }; + _proto4.months = function months$1(length, format) { + var _this2 = this; + if (format === void 0) { + format = false; + } + return listStuff(this, length, months, function () { + // Workaround for "ja" locale: formatToParts does not label all parts of the month + // as "month" and for this locale there is no difference between "format" and "non-format". + // As such, just use format() instead of formatToParts() and take the whole string + var monthSpecialCase = _this2.intl === "ja" || _this2.intl.startsWith("ja-"); + format &= !monthSpecialCase; + var intl = format ? { + month: length, + day: "numeric" + } : { + month: length + }, + formatStr = format ? "format" : "standalone"; + if (!_this2.monthsCache[formatStr][length]) { + var mapper = !monthSpecialCase ? function (dt) { + return _this2.extract(dt, intl, "month"); + } : function (dt) { + return _this2.dtFormatter(dt, intl).format(); + }; + _this2.monthsCache[formatStr][length] = mapMonths(mapper); + } + return _this2.monthsCache[formatStr][length]; + }); + }; + _proto4.weekdays = function weekdays$1(length, format) { + var _this3 = this; + if (format === void 0) { + format = false; + } + return listStuff(this, length, weekdays, function () { + var intl = format ? { + weekday: length, + year: "numeric", + month: "long", + day: "numeric" + } : { + weekday: length + }, + formatStr = format ? "format" : "standalone"; + if (!_this3.weekdaysCache[formatStr][length]) { + _this3.weekdaysCache[formatStr][length] = mapWeekdays(function (dt) { + return _this3.extract(dt, intl, "weekday"); + }); + } + return _this3.weekdaysCache[formatStr][length]; + }); + }; + _proto4.meridiems = function meridiems$1() { + var _this4 = this; + return listStuff(this, undefined, function () { + return meridiems; + }, function () { + // In theory there could be aribitrary day periods. We're gonna assume there are exactly two + // for AM and PM. This is probably wrong, but it's makes parsing way easier. + if (!_this4.meridiemCache) { + var intl = { + hour: "numeric", + hourCycle: "h12" + }; + _this4.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map(function (dt) { + return _this4.extract(dt, intl, "dayperiod"); + }); + } + return _this4.meridiemCache; + }); + }; + _proto4.eras = function eras$1(length) { + var _this5 = this; + return listStuff(this, length, eras, function () { + var intl = { + era: length + }; + + // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates + // to definitely enumerate them. + if (!_this5.eraCache[length]) { + _this5.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map(function (dt) { + return _this5.extract(dt, intl, "era"); + }); + } + return _this5.eraCache[length]; + }); + }; + _proto4.extract = function extract(dt, intlOpts, field) { + var df = this.dtFormatter(dt, intlOpts), + results = df.formatToParts(), + matching = results.find(function (m) { + return m.type.toLowerCase() === field; + }); + return matching ? matching.value : null; + }; + _proto4.numberFormatter = function numberFormatter(opts) { + if (opts === void 0) { + opts = {}; + } + // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave) + // (in contrast, the rest of the condition is used heavily) + return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts); + }; + _proto4.dtFormatter = function dtFormatter(dt, intlOpts) { + if (intlOpts === void 0) { + intlOpts = {}; + } + return new PolyDateFormatter(dt, this.intl, intlOpts); + }; + _proto4.relFormatter = function relFormatter(opts) { + if (opts === void 0) { + opts = {}; + } + return new PolyRelFormatter(this.intl, this.isEnglish(), opts); + }; + _proto4.listFormatter = function listFormatter(opts) { + if (opts === void 0) { + opts = {}; + } + return getCachedLF(this.intl, opts); + }; + _proto4.isEnglish = function isEnglish() { + return this.locale === "en" || this.locale.toLowerCase() === "en-us" || getCachedIntResolvedOptions(this.intl).locale.startsWith("en-us"); + }; + _proto4.getWeekSettings = function getWeekSettings() { + if (this.weekSettings) { + return this.weekSettings; + } else if (!hasLocaleWeekInfo()) { + return fallbackWeekSettings; + } else { + return getCachedWeekInfo(this.locale); + } + }; + _proto4.getStartOfWeek = function getStartOfWeek() { + return this.getWeekSettings().firstDay; + }; + _proto4.getMinDaysInFirstWeek = function getMinDaysInFirstWeek() { + return this.getWeekSettings().minimalDays; + }; + _proto4.getWeekendDays = function getWeekendDays() { + return this.getWeekSettings().weekend; + }; + _proto4.equals = function equals(other) { + return this.locale === other.locale && this.numberingSystem === other.numberingSystem && this.outputCalendar === other.outputCalendar; + }; + _proto4.toString = function toString() { + return "Locale(" + this.locale + ", " + this.numberingSystem + ", " + this.outputCalendar + ")"; + }; + _createClass(Locale, [{ + key: "fastNumbers", + get: function get() { + if (this.fastNumbersCached == null) { + this.fastNumbersCached = supportsFastNumbers(this); + } + return this.fastNumbersCached; + } + }]); + return Locale; + }(); + + var singleton = null; + + /** + * A zone with a fixed offset (meaning no DST) + * @implements {Zone} + */ + var FixedOffsetZone = /*#__PURE__*/function (_Zone) { + _inheritsLoose(FixedOffsetZone, _Zone); + /** + * Get an instance with a specified offset + * @param {number} offset - The offset in minutes + * @return {FixedOffsetZone} + */ + FixedOffsetZone.instance = function instance(offset) { + return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset); + } + + /** + * Get an instance of FixedOffsetZone from a UTC offset string, like "UTC+6" + * @param {string} s - The offset string to parse + * @example FixedOffsetZone.parseSpecifier("UTC+6") + * @example FixedOffsetZone.parseSpecifier("UTC+06") + * @example FixedOffsetZone.parseSpecifier("UTC-6:00") + * @return {FixedOffsetZone} + */; + FixedOffsetZone.parseSpecifier = function parseSpecifier(s) { + if (s) { + var r = s.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i); + if (r) { + return new FixedOffsetZone(signedOffset(r[1], r[2])); + } + } + return null; + }; + function FixedOffsetZone(offset) { + var _this; + _this = _Zone.call(this) || this; + /** @private **/ + _this.fixed = offset; + return _this; + } + + /** + * The type of zone. `fixed` for all instances of `FixedOffsetZone`. + * @override + * @type {string} + */ + var _proto = FixedOffsetZone.prototype; + /** + * Returns the offset's common name at the specified timestamp. + * + * For fixed offset zones this equals to the zone name. + * @override + */ + _proto.offsetName = function offsetName() { + return this.name; + } + + /** + * Returns the offset's value as a string + * @override + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */; + _proto.formatOffset = function formatOffset$1(ts, format) { + return formatOffset(this.fixed, format); + } + + /** + * Returns whether the offset is known to be fixed for the whole year: + * Always returns true for all fixed offset zones. + * @override + * @type {boolean} + */; + /** + * Return the offset in minutes for this zone at the specified timestamp. + * + * For fixed offset zones, this is constant and does not depend on a timestamp. + * @override + * @return {number} + */ + _proto.offset = function offset() { + return this.fixed; + } + + /** + * Return whether this Zone is equal to another zone (i.e. also fixed and same offset) + * @override + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */; + _proto.equals = function equals(otherZone) { + return otherZone.type === "fixed" && otherZone.fixed === this.fixed; + } + + /** + * Return whether this Zone is valid: + * All fixed offset zones are valid. + * @override + * @type {boolean} + */; + _createClass(FixedOffsetZone, [{ + key: "type", + get: function get() { + return "fixed"; + } + + /** + * The name of this zone. + * All fixed zones' names always start with "UTC" (plus optional offset) + * @override + * @type {string} + */ + }, { + key: "name", + get: function get() { + return this.fixed === 0 ? "UTC" : "UTC" + formatOffset(this.fixed, "narrow"); + } + + /** + * The IANA name of this zone, i.e. `Etc/UTC` or `Etc/GMT+/-nn` + * + * @override + * @type {string} + */ + }, { + key: "ianaName", + get: function get() { + if (this.fixed === 0) { + return "Etc/UTC"; + } else { + return "Etc/GMT" + formatOffset(-this.fixed, "narrow"); + } + } + }, { + key: "isUniversal", + get: function get() { + return true; + } + }, { + key: "isValid", + get: function get() { + return true; + } + }], [{ + key: "utcInstance", + get: + /** + * Get a singleton instance of UTC + * @return {FixedOffsetZone} + */ + function get() { + if (singleton === null) { + singleton = new FixedOffsetZone(0); + } + return singleton; + } + }]); + return FixedOffsetZone; + }(Zone); + + /** + * A zone that failed to parse. You should never need to instantiate this. + * @implements {Zone} + */ + var InvalidZone = /*#__PURE__*/function (_Zone) { + _inheritsLoose(InvalidZone, _Zone); + function InvalidZone(zoneName) { + var _this; + _this = _Zone.call(this) || this; + /** @private */ + _this.zoneName = zoneName; + return _this; + } + + /** @override **/ + var _proto = InvalidZone.prototype; + /** @override **/ + _proto.offsetName = function offsetName() { + return null; + } + + /** @override **/; + _proto.formatOffset = function formatOffset() { + return ""; + } + + /** @override **/; + _proto.offset = function offset() { + return NaN; + } + + /** @override **/; + _proto.equals = function equals() { + return false; + } + + /** @override **/; + _createClass(InvalidZone, [{ + key: "type", + get: function get() { + return "invalid"; + } + + /** @override **/ + }, { + key: "name", + get: function get() { + return this.zoneName; + } + + /** @override **/ + }, { + key: "isUniversal", + get: function get() { + return false; + } + }, { + key: "isValid", + get: function get() { + return false; + } + }]); + return InvalidZone; + }(Zone); + + /** + * @private + */ + function normalizeZone(input, defaultZone) { + if (isUndefined(input) || input === null) { + return defaultZone; + } else if (input instanceof Zone) { + return input; + } else if (isString(input)) { + var lowered = input.toLowerCase(); + if (lowered === "default") return defaultZone;else if (lowered === "local" || lowered === "system") return SystemZone.instance;else if (lowered === "utc" || lowered === "gmt") return FixedOffsetZone.utcInstance;else return FixedOffsetZone.parseSpecifier(lowered) || IANAZone.create(input); + } else if (isNumber(input)) { + return FixedOffsetZone.instance(input); + } else if (typeof input === "object" && "offset" in input && typeof input.offset === "function") { + // This is dumb, but the instanceof check above doesn't seem to really work + // so we're duck checking it + return input; + } else { + return new InvalidZone(input); + } + } + + var numberingSystems = { + arab: "[\u0660-\u0669]", + arabext: "[\u06F0-\u06F9]", + bali: "[\u1B50-\u1B59]", + beng: "[\u09E6-\u09EF]", + deva: "[\u0966-\u096F]", + fullwide: "[\uFF10-\uFF19]", + gujr: "[\u0AE6-\u0AEF]", + hanidec: "[〇|一|二|三|四|五|六|七|八|九]", + khmr: "[\u17E0-\u17E9]", + knda: "[\u0CE6-\u0CEF]", + laoo: "[\u0ED0-\u0ED9]", + limb: "[\u1946-\u194F]", + mlym: "[\u0D66-\u0D6F]", + mong: "[\u1810-\u1819]", + mymr: "[\u1040-\u1049]", + orya: "[\u0B66-\u0B6F]", + tamldec: "[\u0BE6-\u0BEF]", + telu: "[\u0C66-\u0C6F]", + thai: "[\u0E50-\u0E59]", + tibt: "[\u0F20-\u0F29]", + latn: "\\d" + }; + var numberingSystemsUTF16 = { + arab: [1632, 1641], + arabext: [1776, 1785], + bali: [6992, 7001], + beng: [2534, 2543], + deva: [2406, 2415], + fullwide: [65296, 65303], + gujr: [2790, 2799], + khmr: [6112, 6121], + knda: [3302, 3311], + laoo: [3792, 3801], + limb: [6470, 6479], + mlym: [3430, 3439], + mong: [6160, 6169], + mymr: [4160, 4169], + orya: [2918, 2927], + tamldec: [3046, 3055], + telu: [3174, 3183], + thai: [3664, 3673], + tibt: [3872, 3881] + }; + var hanidecChars = numberingSystems.hanidec.replace(/[\[|\]]/g, "").split(""); + function parseDigits(str) { + var value = parseInt(str, 10); + if (isNaN(value)) { + value = ""; + for (var i = 0; i < str.length; i++) { + var code = str.charCodeAt(i); + if (str[i].search(numberingSystems.hanidec) !== -1) { + value += hanidecChars.indexOf(str[i]); + } else { + for (var key in numberingSystemsUTF16) { + var _numberingSystemsUTF = numberingSystemsUTF16[key], + min = _numberingSystemsUTF[0], + max = _numberingSystemsUTF[1]; + if (code >= min && code <= max) { + value += code - min; + } + } + } + } + return parseInt(value, 10); + } else { + return value; + } + } + + // cache of {numberingSystem: {append: regex}} + var digitRegexCache = new Map(); + function resetDigitRegexCache() { + digitRegexCache.clear(); + } + function digitRegex(_ref, append) { + var numberingSystem = _ref.numberingSystem; + if (append === void 0) { + append = ""; + } + var ns = numberingSystem || "latn"; + var appendCache = digitRegexCache.get(ns); + if (appendCache === undefined) { + appendCache = new Map(); + digitRegexCache.set(ns, appendCache); + } + var regex = appendCache.get(append); + if (regex === undefined) { + regex = new RegExp("" + numberingSystems[ns] + append); + appendCache.set(append, regex); + } + return regex; + } + + var now = function now() { + return Date.now(); + }, + defaultZone = "system", + defaultLocale = null, + defaultNumberingSystem = null, + defaultOutputCalendar = null, + twoDigitCutoffYear = 60, + throwOnInvalid, + defaultWeekSettings = null; + + /** + * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here. + */ + var Settings = /*#__PURE__*/function () { + function Settings() {} + /** + * Reset Luxon's global caches. Should only be necessary in testing scenarios. + * @return {void} + */ + Settings.resetCaches = function resetCaches() { + Locale.resetCache(); + IANAZone.resetCache(); + DateTime.resetCache(); + resetDigitRegexCache(); + }; + _createClass(Settings, null, [{ + key: "now", + get: + /** + * Get the callback for returning the current timestamp. + * @type {function} + */ + function get() { + return now; + } + + /** + * Set the callback for returning the current timestamp. + * The function should return a number, which will be interpreted as an Epoch millisecond count + * @type {function} + * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future + * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time + */, + set: function set(n) { + now = n; + } + + /** + * Set the default time zone to create DateTimes in. Does not affect existing instances. + * Use the value "system" to reset this value to the system's time zone. + * @type {string} + */ + }, { + key: "defaultZone", + get: + /** + * Get the default time zone object currently used to create DateTimes. Does not affect existing instances. + * The default value is the system's time zone (the one set on the machine that runs this code). + * @type {Zone} + */ + function get() { + return normalizeZone(defaultZone, SystemZone.instance); + } + + /** + * Get the default locale to create DateTimes with. Does not affect existing instances. + * @type {string} + */, + set: function set(zone) { + defaultZone = zone; + } + }, { + key: "defaultLocale", + get: function get() { + return defaultLocale; + } + + /** + * Set the default locale to create DateTimes with. Does not affect existing instances. + * @type {string} + */, + set: function set(locale) { + defaultLocale = locale; + } + + /** + * Get the default numbering system to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + }, { + key: "defaultNumberingSystem", + get: function get() { + return defaultNumberingSystem; + } + + /** + * Set the default numbering system to create DateTimes with. Does not affect existing instances. + * @type {string} + */, + set: function set(numberingSystem) { + defaultNumberingSystem = numberingSystem; + } + + /** + * Get the default output calendar to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + }, { + key: "defaultOutputCalendar", + get: function get() { + return defaultOutputCalendar; + } + + /** + * Set the default output calendar to create DateTimes with. Does not affect existing instances. + * @type {string} + */, + set: function set(outputCalendar) { + defaultOutputCalendar = outputCalendar; + } + + /** + * @typedef {Object} WeekSettings + * @property {number} firstDay + * @property {number} minimalDays + * @property {number[]} weekend + */ + + /** + * @return {WeekSettings|null} + */ + }, { + key: "defaultWeekSettings", + get: function get() { + return defaultWeekSettings; + } + + /** + * Allows overriding the default locale week settings, i.e. the start of the week, the weekend and + * how many days are required in the first week of a year. + * Does not affect existing instances. + * + * @param {WeekSettings|null} weekSettings + */, + set: function set(weekSettings) { + defaultWeekSettings = validateWeekSettings(weekSettings); + } + + /** + * Get the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx. + * @type {number} + */ + }, { + key: "twoDigitCutoffYear", + get: function get() { + return twoDigitCutoffYear; + } + + /** + * Set the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx. + * @type {number} + * @example Settings.twoDigitCutoffYear = 0 // all 'yy' are interpreted as 20th century + * @example Settings.twoDigitCutoffYear = 99 // all 'yy' are interpreted as 21st century + * @example Settings.twoDigitCutoffYear = 50 // '49' -> 2049; '50' -> 1950 + * @example Settings.twoDigitCutoffYear = 1950 // interpreted as 50 + * @example Settings.twoDigitCutoffYear = 2050 // ALSO interpreted as 50 + */, + set: function set(cutoffYear) { + twoDigitCutoffYear = cutoffYear % 100; + } + + /** + * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals + * @type {boolean} + */ + }, { + key: "throwOnInvalid", + get: function get() { + return throwOnInvalid; + } + + /** + * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals + * @type {boolean} + */, + set: function set(t) { + throwOnInvalid = t; + } + }]); + return Settings; + }(); + + var Invalid = /*#__PURE__*/function () { + function Invalid(reason, explanation) { + this.reason = reason; + this.explanation = explanation; + } + var _proto = Invalid.prototype; + _proto.toMessage = function toMessage() { + if (this.explanation) { + return this.reason + ": " + this.explanation; + } else { + return this.reason; + } + }; + return Invalid; + }(); + + var nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334], + leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335]; + function unitOutOfRange(unit, value) { + return new Invalid("unit out of range", "you specified " + value + " (of type " + typeof value + ") as a " + unit + ", which is invalid"); + } + function dayOfWeek(year, month, day) { + var d = new Date(Date.UTC(year, month - 1, day)); + if (year < 100 && year >= 0) { + d.setUTCFullYear(d.getUTCFullYear() - 1900); + } + var js = d.getUTCDay(); + return js === 0 ? 7 : js; + } + function computeOrdinal(year, month, day) { + return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1]; + } + function uncomputeOrdinal(year, ordinal) { + var table = isLeapYear(year) ? leapLadder : nonLeapLadder, + month0 = table.findIndex(function (i) { + return i < ordinal; + }), + day = ordinal - table[month0]; + return { + month: month0 + 1, + day: day + }; + } + function isoWeekdayToLocal(isoWeekday, startOfWeek) { + return (isoWeekday - startOfWeek + 7) % 7 + 1; + } + + /** + * @private + */ + + function gregorianToWeek(gregObj, minDaysInFirstWeek, startOfWeek) { + if (minDaysInFirstWeek === void 0) { + minDaysInFirstWeek = 4; + } + if (startOfWeek === void 0) { + startOfWeek = 1; + } + var year = gregObj.year, + month = gregObj.month, + day = gregObj.day, + ordinal = computeOrdinal(year, month, day), + weekday = isoWeekdayToLocal(dayOfWeek(year, month, day), startOfWeek); + var weekNumber = Math.floor((ordinal - weekday + 14 - minDaysInFirstWeek) / 7), + weekYear; + if (weekNumber < 1) { + weekYear = year - 1; + weekNumber = weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek); + } else if (weekNumber > weeksInWeekYear(year, minDaysInFirstWeek, startOfWeek)) { + weekYear = year + 1; + weekNumber = 1; + } else { + weekYear = year; + } + return _extends({ + weekYear: weekYear, + weekNumber: weekNumber, + weekday: weekday + }, timeObject(gregObj)); + } + function weekToGregorian(weekData, minDaysInFirstWeek, startOfWeek) { + if (minDaysInFirstWeek === void 0) { + minDaysInFirstWeek = 4; + } + if (startOfWeek === void 0) { + startOfWeek = 1; + } + var weekYear = weekData.weekYear, + weekNumber = weekData.weekNumber, + weekday = weekData.weekday, + weekdayOfJan4 = isoWeekdayToLocal(dayOfWeek(weekYear, 1, minDaysInFirstWeek), startOfWeek), + yearInDays = daysInYear(weekYear); + var ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 7 + minDaysInFirstWeek, + year; + if (ordinal < 1) { + year = weekYear - 1; + ordinal += daysInYear(year); + } else if (ordinal > yearInDays) { + year = weekYear + 1; + ordinal -= daysInYear(weekYear); + } else { + year = weekYear; + } + var _uncomputeOrdinal = uncomputeOrdinal(year, ordinal), + month = _uncomputeOrdinal.month, + day = _uncomputeOrdinal.day; + return _extends({ + year: year, + month: month, + day: day + }, timeObject(weekData)); + } + function gregorianToOrdinal(gregData) { + var year = gregData.year, + month = gregData.month, + day = gregData.day; + var ordinal = computeOrdinal(year, month, day); + return _extends({ + year: year, + ordinal: ordinal + }, timeObject(gregData)); + } + function ordinalToGregorian(ordinalData) { + var year = ordinalData.year, + ordinal = ordinalData.ordinal; + var _uncomputeOrdinal2 = uncomputeOrdinal(year, ordinal), + month = _uncomputeOrdinal2.month, + day = _uncomputeOrdinal2.day; + return _extends({ + year: year, + month: month, + day: day + }, timeObject(ordinalData)); + } + + /** + * Check if local week units like localWeekday are used in obj. + * If so, validates that they are not mixed with ISO week units and then copies them to the normal week unit properties. + * Modifies obj in-place! + * @param obj the object values + */ + function usesLocalWeekValues(obj, loc) { + var hasLocaleWeekData = !isUndefined(obj.localWeekday) || !isUndefined(obj.localWeekNumber) || !isUndefined(obj.localWeekYear); + if (hasLocaleWeekData) { + var hasIsoWeekData = !isUndefined(obj.weekday) || !isUndefined(obj.weekNumber) || !isUndefined(obj.weekYear); + if (hasIsoWeekData) { + throw new ConflictingSpecificationError("Cannot mix locale-based week fields with ISO-based week fields"); + } + if (!isUndefined(obj.localWeekday)) obj.weekday = obj.localWeekday; + if (!isUndefined(obj.localWeekNumber)) obj.weekNumber = obj.localWeekNumber; + if (!isUndefined(obj.localWeekYear)) obj.weekYear = obj.localWeekYear; + delete obj.localWeekday; + delete obj.localWeekNumber; + delete obj.localWeekYear; + return { + minDaysInFirstWeek: loc.getMinDaysInFirstWeek(), + startOfWeek: loc.getStartOfWeek() + }; + } else { + return { + minDaysInFirstWeek: 4, + startOfWeek: 1 + }; + } + } + function hasInvalidWeekData(obj, minDaysInFirstWeek, startOfWeek) { + if (minDaysInFirstWeek === void 0) { + minDaysInFirstWeek = 4; + } + if (startOfWeek === void 0) { + startOfWeek = 1; + } + var validYear = isInteger(obj.weekYear), + validWeek = integerBetween(obj.weekNumber, 1, weeksInWeekYear(obj.weekYear, minDaysInFirstWeek, startOfWeek)), + validWeekday = integerBetween(obj.weekday, 1, 7); + if (!validYear) { + return unitOutOfRange("weekYear", obj.weekYear); + } else if (!validWeek) { + return unitOutOfRange("week", obj.weekNumber); + } else if (!validWeekday) { + return unitOutOfRange("weekday", obj.weekday); + } else return false; + } + function hasInvalidOrdinalData(obj) { + var validYear = isInteger(obj.year), + validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year)); + if (!validYear) { + return unitOutOfRange("year", obj.year); + } else if (!validOrdinal) { + return unitOutOfRange("ordinal", obj.ordinal); + } else return false; + } + function hasInvalidGregorianData(obj) { + var validYear = isInteger(obj.year), + validMonth = integerBetween(obj.month, 1, 12), + validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month)); + if (!validYear) { + return unitOutOfRange("year", obj.year); + } else if (!validMonth) { + return unitOutOfRange("month", obj.month); + } else if (!validDay) { + return unitOutOfRange("day", obj.day); + } else return false; + } + function hasInvalidTimeData(obj) { + var hour = obj.hour, + minute = obj.minute, + second = obj.second, + millisecond = obj.millisecond; + var validHour = integerBetween(hour, 0, 23) || hour === 24 && minute === 0 && second === 0 && millisecond === 0, + validMinute = integerBetween(minute, 0, 59), + validSecond = integerBetween(second, 0, 59), + validMillisecond = integerBetween(millisecond, 0, 999); + if (!validHour) { + return unitOutOfRange("hour", hour); + } else if (!validMinute) { + return unitOutOfRange("minute", minute); + } else if (!validSecond) { + return unitOutOfRange("second", second); + } else if (!validMillisecond) { + return unitOutOfRange("millisecond", millisecond); + } else return false; + } + + /** + * @private + */ + + // TYPES + + function isUndefined(o) { + return typeof o === "undefined"; + } + function isNumber(o) { + return typeof o === "number"; + } + function isInteger(o) { + return typeof o === "number" && o % 1 === 0; + } + function isString(o) { + return typeof o === "string"; + } + function isDate(o) { + return Object.prototype.toString.call(o) === "[object Date]"; + } + + // CAPABILITIES + + function hasRelative() { + try { + return typeof Intl !== "undefined" && !!Intl.RelativeTimeFormat; + } catch (e) { + return false; + } + } + function hasLocaleWeekInfo() { + try { + return typeof Intl !== "undefined" && !!Intl.Locale && ("weekInfo" in Intl.Locale.prototype || "getWeekInfo" in Intl.Locale.prototype); + } catch (e) { + return false; + } + } + + // OBJECTS AND ARRAYS + + function maybeArray(thing) { + return Array.isArray(thing) ? thing : [thing]; + } + function bestBy(arr, by, compare) { + if (arr.length === 0) { + return undefined; + } + return arr.reduce(function (best, next) { + var pair = [by(next), next]; + if (!best) { + return pair; + } else if (compare(best[0], pair[0]) === best[0]) { + return best; + } else { + return pair; + } + }, null)[1]; + } + function pick(obj, keys) { + return keys.reduce(function (a, k) { + a[k] = obj[k]; + return a; + }, {}); + } + function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); + } + function validateWeekSettings(settings) { + if (settings == null) { + return null; + } else if (typeof settings !== "object") { + throw new InvalidArgumentError("Week settings must be an object"); + } else { + if (!integerBetween(settings.firstDay, 1, 7) || !integerBetween(settings.minimalDays, 1, 7) || !Array.isArray(settings.weekend) || settings.weekend.some(function (v) { + return !integerBetween(v, 1, 7); + })) { + throw new InvalidArgumentError("Invalid week settings"); + } + return { + firstDay: settings.firstDay, + minimalDays: settings.minimalDays, + weekend: Array.from(settings.weekend) + }; + } + } + + // NUMBERS AND STRINGS + + function integerBetween(thing, bottom, top) { + return isInteger(thing) && thing >= bottom && thing <= top; + } + + // x % n but takes the sign of n instead of x + function floorMod(x, n) { + return x - n * Math.floor(x / n); + } + function padStart(input, n) { + if (n === void 0) { + n = 2; + } + var isNeg = input < 0; + var padded; + if (isNeg) { + padded = "-" + ("" + -input).padStart(n, "0"); + } else { + padded = ("" + input).padStart(n, "0"); + } + return padded; + } + function parseInteger(string) { + if (isUndefined(string) || string === null || string === "") { + return undefined; + } else { + return parseInt(string, 10); + } + } + function parseFloating(string) { + if (isUndefined(string) || string === null || string === "") { + return undefined; + } else { + return parseFloat(string); + } + } + function parseMillis(fraction) { + // Return undefined (instead of 0) in these cases, where fraction is not set + if (isUndefined(fraction) || fraction === null || fraction === "") { + return undefined; + } else { + var f = parseFloat("0." + fraction) * 1000; + return Math.floor(f); + } + } + function roundTo(number, digits, rounding) { + if (rounding === void 0) { + rounding = "round"; + } + var factor = Math.pow(10, digits); + switch (rounding) { + case "expand": + return number > 0 ? Math.ceil(number * factor) / factor : Math.floor(number * factor) / factor; + case "trunc": + return Math.trunc(number * factor) / factor; + case "round": + return Math.round(number * factor) / factor; + case "floor": + return Math.floor(number * factor) / factor; + case "ceil": + return Math.ceil(number * factor) / factor; + default: + throw new RangeError("Value rounding " + rounding + " is out of range"); + } + } + + // DATE BASICS + + function isLeapYear(year) { + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + } + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } + function daysInMonth(year, month) { + var modMonth = floorMod(month - 1, 12) + 1, + modYear = year + (month - modMonth) / 12; + if (modMonth === 2) { + return isLeapYear(modYear) ? 29 : 28; + } else { + return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1]; + } + } + + // convert a calendar object to a local timestamp (epoch, but with the offset baked in) + function objToLocalTS(obj) { + var d = Date.UTC(obj.year, obj.month - 1, obj.day, obj.hour, obj.minute, obj.second, obj.millisecond); + + // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that + if (obj.year < 100 && obj.year >= 0) { + d = new Date(d); + // set the month and day again, this is necessary because year 2000 is a leap year, but year 100 is not + // so if obj.year is in 99, but obj.day makes it roll over into year 100, + // the calculations done by Date.UTC are using year 2000 - which is incorrect + d.setUTCFullYear(obj.year, obj.month - 1, obj.day); + } + return +d; + } + + // adapted from moment.js: https://github.com/moment/moment/blob/000ac1800e620f770f4eb31b5ae908f6167b0ab2/src/lib/units/week-calendar-utils.js + function firstWeekOffset(year, minDaysInFirstWeek, startOfWeek) { + var fwdlw = isoWeekdayToLocal(dayOfWeek(year, 1, minDaysInFirstWeek), startOfWeek); + return -fwdlw + minDaysInFirstWeek - 1; + } + function weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek) { + if (minDaysInFirstWeek === void 0) { + minDaysInFirstWeek = 4; + } + if (startOfWeek === void 0) { + startOfWeek = 1; + } + var weekOffset = firstWeekOffset(weekYear, minDaysInFirstWeek, startOfWeek); + var weekOffsetNext = firstWeekOffset(weekYear + 1, minDaysInFirstWeek, startOfWeek); + return (daysInYear(weekYear) - weekOffset + weekOffsetNext) / 7; + } + function untruncateYear(year) { + if (year > 99) { + return year; + } else return year > Settings.twoDigitCutoffYear ? 1900 + year : 2000 + year; + } + + // PARSING + + function parseZoneInfo(ts, offsetFormat, locale, timeZone) { + if (timeZone === void 0) { + timeZone = null; + } + var date = new Date(ts), + intlOpts = { + hourCycle: "h23", + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit" + }; + if (timeZone) { + intlOpts.timeZone = timeZone; + } + var modified = _extends({ + timeZoneName: offsetFormat + }, intlOpts); + var parsed = new Intl.DateTimeFormat(locale, modified).formatToParts(date).find(function (m) { + return m.type.toLowerCase() === "timezonename"; + }); + return parsed ? parsed.value : null; + } + + // signedOffset('-5', '30') -> -330 + function signedOffset(offHourStr, offMinuteStr) { + var offHour = parseInt(offHourStr, 10); + + // don't || this because we want to preserve -0 + if (Number.isNaN(offHour)) { + offHour = 0; + } + var offMin = parseInt(offMinuteStr, 10) || 0, + offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin; + return offHour * 60 + offMinSigned; + } + + // COERCION + + function asNumber(value) { + var numericValue = Number(value); + if (typeof value === "boolean" || value === "" || !Number.isFinite(numericValue)) throw new InvalidArgumentError("Invalid unit value " + value); + return numericValue; + } + function normalizeObject(obj, normalizer) { + var normalized = {}; + for (var u in obj) { + if (hasOwnProperty(obj, u)) { + var v = obj[u]; + if (v === undefined || v === null) continue; + normalized[normalizer(u)] = asNumber(v); + } + } + return normalized; + } + + /** + * Returns the offset's value as a string + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */ + function formatOffset(offset, format) { + var hours = Math.trunc(Math.abs(offset / 60)), + minutes = Math.trunc(Math.abs(offset % 60)), + sign = offset >= 0 ? "+" : "-"; + switch (format) { + case "short": + return "" + sign + padStart(hours, 2) + ":" + padStart(minutes, 2); + case "narrow": + return "" + sign + hours + (minutes > 0 ? ":" + minutes : ""); + case "techie": + return "" + sign + padStart(hours, 2) + padStart(minutes, 2); + default: + throw new RangeError("Value format " + format + " is out of range for property format"); + } + } + function timeObject(obj) { + return pick(obj, ["hour", "minute", "second", "millisecond"]); + } + + /** + * @private + */ + + var monthsLong = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; + var monthsShort = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + var monthsNarrow = ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"]; + function months(length) { + switch (length) { + case "narrow": + return [].concat(monthsNarrow); + case "short": + return [].concat(monthsShort); + case "long": + return [].concat(monthsLong); + case "numeric": + return ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"]; + case "2-digit": + return ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]; + default: + return null; + } + } + var weekdaysLong = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]; + var weekdaysShort = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; + var weekdaysNarrow = ["M", "T", "W", "T", "F", "S", "S"]; + function weekdays(length) { + switch (length) { + case "narrow": + return [].concat(weekdaysNarrow); + case "short": + return [].concat(weekdaysShort); + case "long": + return [].concat(weekdaysLong); + case "numeric": + return ["1", "2", "3", "4", "5", "6", "7"]; + default: + return null; + } + } + var meridiems = ["AM", "PM"]; + var erasLong = ["Before Christ", "Anno Domini"]; + var erasShort = ["BC", "AD"]; + var erasNarrow = ["B", "A"]; + function eras(length) { + switch (length) { + case "narrow": + return [].concat(erasNarrow); + case "short": + return [].concat(erasShort); + case "long": + return [].concat(erasLong); + default: + return null; + } + } + function meridiemForDateTime(dt) { + return meridiems[dt.hour < 12 ? 0 : 1]; + } + function weekdayForDateTime(dt, length) { + return weekdays(length)[dt.weekday - 1]; + } + function monthForDateTime(dt, length) { + return months(length)[dt.month - 1]; + } + function eraForDateTime(dt, length) { + return eras(length)[dt.year < 0 ? 0 : 1]; + } + function formatRelativeTime(unit, count, numeric, narrow) { + if (numeric === void 0) { + numeric = "always"; + } + if (narrow === void 0) { + narrow = false; + } + var units = { + years: ["year", "yr."], + quarters: ["quarter", "qtr."], + months: ["month", "mo."], + weeks: ["week", "wk."], + days: ["day", "day", "days"], + hours: ["hour", "hr."], + minutes: ["minute", "min."], + seconds: ["second", "sec."] + }; + var lastable = ["hours", "minutes", "seconds"].indexOf(unit) === -1; + if (numeric === "auto" && lastable) { + var isDay = unit === "days"; + switch (count) { + case 1: + return isDay ? "tomorrow" : "next " + units[unit][0]; + case -1: + return isDay ? "yesterday" : "last " + units[unit][0]; + case 0: + return isDay ? "today" : "this " + units[unit][0]; + } + } + + var isInPast = Object.is(count, -0) || count < 0, + fmtValue = Math.abs(count), + singular = fmtValue === 1, + lilUnits = units[unit], + fmtUnit = narrow ? singular ? lilUnits[1] : lilUnits[2] || lilUnits[1] : singular ? units[unit][0] : unit; + return isInPast ? fmtValue + " " + fmtUnit + " ago" : "in " + fmtValue + " " + fmtUnit; + } + + function stringifyTokens(splits, tokenToString) { + var s = ""; + for (var _iterator = _createForOfIteratorHelperLoose(splits), _step; !(_step = _iterator()).done;) { + var token = _step.value; + if (token.literal) { + s += token.val; + } else { + s += tokenToString(token.val); + } + } + return s; + } + var _macroTokenToFormatOpts = { + D: DATE_SHORT, + DD: DATE_MED, + DDD: DATE_FULL, + DDDD: DATE_HUGE, + t: TIME_SIMPLE, + tt: TIME_WITH_SECONDS, + ttt: TIME_WITH_SHORT_OFFSET, + tttt: TIME_WITH_LONG_OFFSET, + T: TIME_24_SIMPLE, + TT: TIME_24_WITH_SECONDS, + TTT: TIME_24_WITH_SHORT_OFFSET, + TTTT: TIME_24_WITH_LONG_OFFSET, + f: DATETIME_SHORT, + ff: DATETIME_MED, + fff: DATETIME_FULL, + ffff: DATETIME_HUGE, + F: DATETIME_SHORT_WITH_SECONDS, + FF: DATETIME_MED_WITH_SECONDS, + FFF: DATETIME_FULL_WITH_SECONDS, + FFFF: DATETIME_HUGE_WITH_SECONDS + }; + + /** + * @private + */ + var Formatter = /*#__PURE__*/function () { + Formatter.create = function create(locale, opts) { + if (opts === void 0) { + opts = {}; + } + return new Formatter(locale, opts); + }; + Formatter.parseFormat = function parseFormat(fmt) { + // white-space is always considered a literal in user-provided formats + // the " " token has a special meaning (see unitForToken) + + var current = null, + currentFull = "", + bracketed = false; + var splits = []; + for (var i = 0; i < fmt.length; i++) { + var c = fmt.charAt(i); + if (c === "'") { + // turn '' into a literal signal quote instead of just skipping the empty literal + if (currentFull.length > 0 || bracketed) { + splits.push({ + literal: bracketed || /^\s+$/.test(currentFull), + val: currentFull === "" ? "'" : currentFull + }); + } + current = null; + currentFull = ""; + bracketed = !bracketed; + } else if (bracketed) { + currentFull += c; + } else if (c === current) { + currentFull += c; + } else { + if (currentFull.length > 0) { + splits.push({ + literal: /^\s+$/.test(currentFull), + val: currentFull + }); + } + currentFull = c; + current = c; + } + } + if (currentFull.length > 0) { + splits.push({ + literal: bracketed || /^\s+$/.test(currentFull), + val: currentFull + }); + } + return splits; + }; + Formatter.macroTokenToFormatOpts = function macroTokenToFormatOpts(token) { + return _macroTokenToFormatOpts[token]; + }; + function Formatter(locale, formatOpts) { + this.opts = formatOpts; + this.loc = locale; + this.systemLoc = null; + } + var _proto = Formatter.prototype; + _proto.formatWithSystemDefault = function formatWithSystemDefault(dt, opts) { + if (this.systemLoc === null) { + this.systemLoc = this.loc.redefaultToSystem(); + } + var df = this.systemLoc.dtFormatter(dt, _extends({}, this.opts, opts)); + return df.format(); + }; + _proto.dtFormatter = function dtFormatter(dt, opts) { + if (opts === void 0) { + opts = {}; + } + return this.loc.dtFormatter(dt, _extends({}, this.opts, opts)); + }; + _proto.formatDateTime = function formatDateTime(dt, opts) { + return this.dtFormatter(dt, opts).format(); + }; + _proto.formatDateTimeParts = function formatDateTimeParts(dt, opts) { + return this.dtFormatter(dt, opts).formatToParts(); + }; + _proto.formatInterval = function formatInterval(interval, opts) { + var df = this.dtFormatter(interval.start, opts); + return df.dtf.formatRange(interval.start.toJSDate(), interval.end.toJSDate()); + }; + _proto.resolvedOptions = function resolvedOptions(dt, opts) { + return this.dtFormatter(dt, opts).resolvedOptions(); + }; + _proto.num = function num(n, p, signDisplay) { + if (p === void 0) { + p = 0; + } + if (signDisplay === void 0) { + signDisplay = undefined; + } + // we get some perf out of doing this here, annoyingly + if (this.opts.forceSimple) { + return padStart(n, p); + } + var opts = _extends({}, this.opts); + if (p > 0) { + opts.padTo = p; + } + if (signDisplay) { + opts.signDisplay = signDisplay; + } + return this.loc.numberFormatter(opts).format(n); + }; + _proto.formatDateTimeFromString = function formatDateTimeFromString(dt, fmt) { + var _this = this; + var knownEnglish = this.loc.listingMode() === "en", + useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== "gregory", + string = function string(opts, extract) { + return _this.loc.extract(dt, opts, extract); + }, + formatOffset = function formatOffset(opts) { + if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) { + return "Z"; + } + return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : ""; + }, + meridiem = function meridiem() { + return knownEnglish ? meridiemForDateTime(dt) : string({ + hour: "numeric", + hourCycle: "h12" + }, "dayperiod"); + }, + month = function month(length, standalone) { + return knownEnglish ? monthForDateTime(dt, length) : string(standalone ? { + month: length + } : { + month: length, + day: "numeric" + }, "month"); + }, + weekday = function weekday(length, standalone) { + return knownEnglish ? weekdayForDateTime(dt, length) : string(standalone ? { + weekday: length + } : { + weekday: length, + month: "long", + day: "numeric" + }, "weekday"); + }, + maybeMacro = function maybeMacro(token) { + var formatOpts = Formatter.macroTokenToFormatOpts(token); + if (formatOpts) { + return _this.formatWithSystemDefault(dt, formatOpts); + } else { + return token; + } + }, + era = function era(length) { + return knownEnglish ? eraForDateTime(dt, length) : string({ + era: length + }, "era"); + }, + tokenToString = function tokenToString(token) { + // Where possible: https://cldr.unicode.org/translation/date-time/date-time-symbols + switch (token) { + // ms + case "S": + return _this.num(dt.millisecond); + case "u": + // falls through + case "SSS": + return _this.num(dt.millisecond, 3); + // seconds + case "s": + return _this.num(dt.second); + case "ss": + return _this.num(dt.second, 2); + // fractional seconds + case "uu": + return _this.num(Math.floor(dt.millisecond / 10), 2); + case "uuu": + return _this.num(Math.floor(dt.millisecond / 100)); + // minutes + case "m": + return _this.num(dt.minute); + case "mm": + return _this.num(dt.minute, 2); + // hours + case "h": + return _this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12); + case "hh": + return _this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2); + case "H": + return _this.num(dt.hour); + case "HH": + return _this.num(dt.hour, 2); + // offset + case "Z": + // like +6 + return formatOffset({ + format: "narrow", + allowZ: _this.opts.allowZ + }); + case "ZZ": + // like +06:00 + return formatOffset({ + format: "short", + allowZ: _this.opts.allowZ + }); + case "ZZZ": + // like +0600 + return formatOffset({ + format: "techie", + allowZ: _this.opts.allowZ + }); + case "ZZZZ": + // like EST + return dt.zone.offsetName(dt.ts, { + format: "short", + locale: _this.loc.locale + }); + case "ZZZZZ": + // like Eastern Standard Time + return dt.zone.offsetName(dt.ts, { + format: "long", + locale: _this.loc.locale + }); + // zone + case "z": + // like America/New_York + return dt.zoneName; + // meridiems + case "a": + return meridiem(); + // dates + case "d": + return useDateTimeFormatter ? string({ + day: "numeric" + }, "day") : _this.num(dt.day); + case "dd": + return useDateTimeFormatter ? string({ + day: "2-digit" + }, "day") : _this.num(dt.day, 2); + // weekdays - standalone + case "c": + // like 1 + return _this.num(dt.weekday); + case "ccc": + // like 'Tues' + return weekday("short", true); + case "cccc": + // like 'Tuesday' + return weekday("long", true); + case "ccccc": + // like 'T' + return weekday("narrow", true); + // weekdays - format + case "E": + // like 1 + return _this.num(dt.weekday); + case "EEE": + // like 'Tues' + return weekday("short", false); + case "EEEE": + // like 'Tuesday' + return weekday("long", false); + case "EEEEE": + // like 'T' + return weekday("narrow", false); + // months - standalone + case "L": + // like 1 + return useDateTimeFormatter ? string({ + month: "numeric", + day: "numeric" + }, "month") : _this.num(dt.month); + case "LL": + // like 01, doesn't seem to work + return useDateTimeFormatter ? string({ + month: "2-digit", + day: "numeric" + }, "month") : _this.num(dt.month, 2); + case "LLL": + // like Jan + return month("short", true); + case "LLLL": + // like January + return month("long", true); + case "LLLLL": + // like J + return month("narrow", true); + // months - format + case "M": + // like 1 + return useDateTimeFormatter ? string({ + month: "numeric" + }, "month") : _this.num(dt.month); + case "MM": + // like 01 + return useDateTimeFormatter ? string({ + month: "2-digit" + }, "month") : _this.num(dt.month, 2); + case "MMM": + // like Jan + return month("short", false); + case "MMMM": + // like January + return month("long", false); + case "MMMMM": + // like J + return month("narrow", false); + // years + case "y": + // like 2014 + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : _this.num(dt.year); + case "yy": + // like 14 + return useDateTimeFormatter ? string({ + year: "2-digit" + }, "year") : _this.num(dt.year.toString().slice(-2), 2); + case "yyyy": + // like 0012 + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : _this.num(dt.year, 4); + case "yyyyyy": + // like 000012 + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : _this.num(dt.year, 6); + // eras + case "G": + // like AD + return era("short"); + case "GG": + // like Anno Domini + return era("long"); + case "GGGGG": + return era("narrow"); + case "kk": + return _this.num(dt.weekYear.toString().slice(-2), 2); + case "kkkk": + return _this.num(dt.weekYear, 4); + case "W": + return _this.num(dt.weekNumber); + case "WW": + return _this.num(dt.weekNumber, 2); + case "n": + return _this.num(dt.localWeekNumber); + case "nn": + return _this.num(dt.localWeekNumber, 2); + case "ii": + return _this.num(dt.localWeekYear.toString().slice(-2), 2); + case "iiii": + return _this.num(dt.localWeekYear, 4); + case "o": + return _this.num(dt.ordinal); + case "ooo": + return _this.num(dt.ordinal, 3); + case "q": + // like 1 + return _this.num(dt.quarter); + case "qq": + // like 01 + return _this.num(dt.quarter, 2); + case "X": + return _this.num(Math.floor(dt.ts / 1000)); + case "x": + return _this.num(dt.ts); + default: + return maybeMacro(token); + } + }; + return stringifyTokens(Formatter.parseFormat(fmt), tokenToString); + }; + _proto.formatDurationFromString = function formatDurationFromString(dur, fmt) { + var _this2 = this; + var invertLargest = this.opts.signMode === "negativeLargestOnly" ? -1 : 1; + var tokenToField = function tokenToField(token) { + switch (token[0]) { + case "S": + return "milliseconds"; + case "s": + return "seconds"; + case "m": + return "minutes"; + case "h": + return "hours"; + case "d": + return "days"; + case "w": + return "weeks"; + case "M": + return "months"; + case "y": + return "years"; + default: + return null; + } + }, + tokenToString = function tokenToString(lildur, info) { + return function (token) { + var mapped = tokenToField(token); + if (mapped) { + var inversionFactor = info.isNegativeDuration && mapped !== info.largestUnit ? invertLargest : 1; + var signDisplay; + if (_this2.opts.signMode === "negativeLargestOnly" && mapped !== info.largestUnit) { + signDisplay = "never"; + } else if (_this2.opts.signMode === "all") { + signDisplay = "always"; + } else { + // "auto" and "negative" are the same, but "auto" has better support + signDisplay = "auto"; + } + return _this2.num(lildur.get(mapped) * inversionFactor, token.length, signDisplay); + } else { + return token; + } + }; + }, + tokens = Formatter.parseFormat(fmt), + realTokens = tokens.reduce(function (found, _ref) { + var literal = _ref.literal, + val = _ref.val; + return literal ? found : found.concat(val); + }, []), + collapsed = dur.shiftTo.apply(dur, realTokens.map(tokenToField).filter(function (t) { + return t; + })), + durationInfo = { + isNegativeDuration: collapsed < 0, + // this relies on "collapsed" being based on "shiftTo", which builds up the object + // in order + largestUnit: Object.keys(collapsed.values)[0] + }; + return stringifyTokens(tokens, tokenToString(collapsed, durationInfo)); + }; + return Formatter; + }(); + + /* + * This file handles parsing for well-specified formats. Here's how it works: + * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match. + * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object + * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence. + * Extractors can take a "cursor" representing the offset in the match to look at. This makes it easy to combine extractors. + * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions. + * Some extractions are super dumb and simpleParse and fromStrings help DRY them. + */ + + var ianaRegex = /[A-Za-z_+-]{1,256}(?::?\/[A-Za-z0-9_+-]{1,256}(?:\/[A-Za-z0-9_+-]{1,256})?)?/; + function combineRegexes() { + for (var _len = arguments.length, regexes = new Array(_len), _key = 0; _key < _len; _key++) { + regexes[_key] = arguments[_key]; + } + var full = regexes.reduce(function (f, r) { + return f + r.source; + }, ""); + return RegExp("^" + full + "$"); + } + function combineExtractors() { + for (var _len2 = arguments.length, extractors = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + extractors[_key2] = arguments[_key2]; + } + return function (m) { + return extractors.reduce(function (_ref, ex) { + var mergedVals = _ref[0], + mergedZone = _ref[1], + cursor = _ref[2]; + var _ex = ex(m, cursor), + val = _ex[0], + zone = _ex[1], + next = _ex[2]; + return [_extends({}, mergedVals, val), zone || mergedZone, next]; + }, [{}, null, 1]).slice(0, 2); + }; + } + function parse(s) { + if (s == null) { + return [null, null]; + } + for (var _len3 = arguments.length, patterns = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { + patterns[_key3 - 1] = arguments[_key3]; + } + for (var _i = 0, _patterns = patterns; _i < _patterns.length; _i++) { + var _patterns$_i = _patterns[_i], + regex = _patterns$_i[0], + extractor = _patterns$_i[1]; + var m = regex.exec(s); + if (m) { + return extractor(m); + } + } + return [null, null]; + } + function simpleParse() { + for (var _len4 = arguments.length, keys = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + keys[_key4] = arguments[_key4]; + } + return function (match, cursor) { + var ret = {}; + var i; + for (i = 0; i < keys.length; i++) { + ret[keys[i]] = parseInteger(match[cursor + i]); + } + return [ret, null, cursor + i]; + }; + } + + // ISO and SQL parsing + var offsetRegex = /(?:([Zz])|([+-]\d\d)(?::?(\d\d))?)/; + var isoExtendedZone = "(?:" + offsetRegex.source + "?(?:\\[(" + ianaRegex.source + ")\\])?)?"; + var isoTimeBaseRegex = /(\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,30}))?)?)?/; + var isoTimeRegex = RegExp("" + isoTimeBaseRegex.source + isoExtendedZone); + var isoTimeExtensionRegex = RegExp("(?:[Tt]" + isoTimeRegex.source + ")?"); + var isoYmdRegex = /([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/; + var isoWeekRegex = /(\d{4})-?W(\d\d)(?:-?(\d))?/; + var isoOrdinalRegex = /(\d{4})-?(\d{3})/; + var extractISOWeekData = simpleParse("weekYear", "weekNumber", "weekDay"); + var extractISOOrdinalData = simpleParse("year", "ordinal"); + var sqlYmdRegex = /(\d{4})-(\d\d)-(\d\d)/; // dumbed-down version of the ISO one + var sqlTimeRegex = RegExp(isoTimeBaseRegex.source + " ?(?:" + offsetRegex.source + "|(" + ianaRegex.source + "))?"); + var sqlTimeExtensionRegex = RegExp("(?: " + sqlTimeRegex.source + ")?"); + function int(match, pos, fallback) { + var m = match[pos]; + return isUndefined(m) ? fallback : parseInteger(m); + } + function extractISOYmd(match, cursor) { + var item = { + year: int(match, cursor), + month: int(match, cursor + 1, 1), + day: int(match, cursor + 2, 1) + }; + return [item, null, cursor + 3]; + } + function extractISOTime(match, cursor) { + var item = { + hours: int(match, cursor, 0), + minutes: int(match, cursor + 1, 0), + seconds: int(match, cursor + 2, 0), + milliseconds: parseMillis(match[cursor + 3]) + }; + return [item, null, cursor + 4]; + } + function extractISOOffset(match, cursor) { + var local = !match[cursor] && !match[cursor + 1], + fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]), + zone = local ? null : FixedOffsetZone.instance(fullOffset); + return [{}, zone, cursor + 3]; + } + function extractIANAZone(match, cursor) { + var zone = match[cursor] ? IANAZone.create(match[cursor]) : null; + return [{}, zone, cursor + 1]; + } + + // ISO time parsing + + var isoTimeOnly = RegExp("^T?" + isoTimeBaseRegex.source + "$"); + + // ISO duration parsing + + var isoDuration = /^-?P(?:(?:(-?\d{1,20}(?:\.\d{1,20})?)Y)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20}(?:\.\d{1,20})?)W)?(?:(-?\d{1,20}(?:\.\d{1,20})?)D)?(?:T(?:(-?\d{1,20}(?:\.\d{1,20})?)H)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20})(?:[.,](-?\d{1,20}))?S)?)?)$/; + function extractISODuration(match) { + var s = match[0], + yearStr = match[1], + monthStr = match[2], + weekStr = match[3], + dayStr = match[4], + hourStr = match[5], + minuteStr = match[6], + secondStr = match[7], + millisecondsStr = match[8]; + var hasNegativePrefix = s[0] === "-"; + var negativeSeconds = secondStr && secondStr[0] === "-"; + var maybeNegate = function maybeNegate(num, force) { + if (force === void 0) { + force = false; + } + return num !== undefined && (force || num && hasNegativePrefix) ? -num : num; + }; + return [{ + years: maybeNegate(parseFloating(yearStr)), + months: maybeNegate(parseFloating(monthStr)), + weeks: maybeNegate(parseFloating(weekStr)), + days: maybeNegate(parseFloating(dayStr)), + hours: maybeNegate(parseFloating(hourStr)), + minutes: maybeNegate(parseFloating(minuteStr)), + seconds: maybeNegate(parseFloating(secondStr), secondStr === "-0"), + milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds) + }]; + } + + // These are a little braindead. EDT *should* tell us that we're in, say, America/New_York + // and not just that we're in -240 *right now*. But since I don't think these are used that often + // I'm just going to ignore that + var obsOffsets = { + GMT: 0, + EDT: -4 * 60, + EST: -5 * 60, + CDT: -5 * 60, + CST: -6 * 60, + MDT: -6 * 60, + MST: -7 * 60, + PDT: -7 * 60, + PST: -8 * 60 + }; + function fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { + var result = { + year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr), + month: monthsShort.indexOf(monthStr) + 1, + day: parseInteger(dayStr), + hour: parseInteger(hourStr), + minute: parseInteger(minuteStr) + }; + if (secondStr) result.second = parseInteger(secondStr); + if (weekdayStr) { + result.weekday = weekdayStr.length > 3 ? weekdaysLong.indexOf(weekdayStr) + 1 : weekdaysShort.indexOf(weekdayStr) + 1; + } + return result; + } + + // RFC 2822/5322 + var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/; + function extractRFC2822(match) { + var weekdayStr = match[1], + dayStr = match[2], + monthStr = match[3], + yearStr = match[4], + hourStr = match[5], + minuteStr = match[6], + secondStr = match[7], + obsOffset = match[8], + milOffset = match[9], + offHourStr = match[10], + offMinuteStr = match[11], + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + var offset; + if (obsOffset) { + offset = obsOffsets[obsOffset]; + } else if (milOffset) { + offset = 0; + } else { + offset = signedOffset(offHourStr, offMinuteStr); + } + return [result, new FixedOffsetZone(offset)]; + } + function preprocessRFC2822(s) { + // Remove comments and folding whitespace and replace multiple-spaces with a single space + return s.replace(/\([^()]*\)|[\n\t]/g, " ").replace(/(\s\s+)/g, " ").trim(); + } + + // http date + + var rfc1123 = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/, + rfc850 = /^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/, + ascii = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/; + function extractRFC1123Or850(match) { + var weekdayStr = match[1], + dayStr = match[2], + monthStr = match[3], + yearStr = match[4], + hourStr = match[5], + minuteStr = match[6], + secondStr = match[7], + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + return [result, FixedOffsetZone.utcInstance]; + } + function extractASCII(match) { + var weekdayStr = match[1], + monthStr = match[2], + dayStr = match[3], + hourStr = match[4], + minuteStr = match[5], + secondStr = match[6], + yearStr = match[7], + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + return [result, FixedOffsetZone.utcInstance]; + } + var isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex); + var isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex); + var isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex); + var isoTimeCombinedRegex = combineRegexes(isoTimeRegex); + var extractISOYmdTimeAndOffset = combineExtractors(extractISOYmd, extractISOTime, extractISOOffset, extractIANAZone); + var extractISOWeekTimeAndOffset = combineExtractors(extractISOWeekData, extractISOTime, extractISOOffset, extractIANAZone); + var extractISOOrdinalDateAndTime = combineExtractors(extractISOOrdinalData, extractISOTime, extractISOOffset, extractIANAZone); + var extractISOTimeAndOffset = combineExtractors(extractISOTime, extractISOOffset, extractIANAZone); + + /* + * @private + */ + + function parseISODate(s) { + return parse(s, [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset], [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime], [isoTimeCombinedRegex, extractISOTimeAndOffset]); + } + function parseRFC2822Date(s) { + return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]); + } + function parseHTTPDate(s) { + return parse(s, [rfc1123, extractRFC1123Or850], [rfc850, extractRFC1123Or850], [ascii, extractASCII]); + } + function parseISODuration(s) { + return parse(s, [isoDuration, extractISODuration]); + } + var extractISOTimeOnly = combineExtractors(extractISOTime); + function parseISOTimeOnly(s) { + return parse(s, [isoTimeOnly, extractISOTimeOnly]); + } + var sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex); + var sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex); + var extractISOTimeOffsetAndIANAZone = combineExtractors(extractISOTime, extractISOOffset, extractIANAZone); + function parseSQL(s) { + return parse(s, [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]); + } + + var INVALID$2 = "Invalid Duration"; + + // unit conversion constants + var lowOrderMatrix = { + weeks: { + days: 7, + hours: 7 * 24, + minutes: 7 * 24 * 60, + seconds: 7 * 24 * 60 * 60, + milliseconds: 7 * 24 * 60 * 60 * 1000 + }, + days: { + hours: 24, + minutes: 24 * 60, + seconds: 24 * 60 * 60, + milliseconds: 24 * 60 * 60 * 1000 + }, + hours: { + minutes: 60, + seconds: 60 * 60, + milliseconds: 60 * 60 * 1000 + }, + minutes: { + seconds: 60, + milliseconds: 60 * 1000 + }, + seconds: { + milliseconds: 1000 + } + }, + casualMatrix = _extends({ + years: { + quarters: 4, + months: 12, + weeks: 52, + days: 365, + hours: 365 * 24, + minutes: 365 * 24 * 60, + seconds: 365 * 24 * 60 * 60, + milliseconds: 365 * 24 * 60 * 60 * 1000 + }, + quarters: { + months: 3, + weeks: 13, + days: 91, + hours: 91 * 24, + minutes: 91 * 24 * 60, + seconds: 91 * 24 * 60 * 60, + milliseconds: 91 * 24 * 60 * 60 * 1000 + }, + months: { + weeks: 4, + days: 30, + hours: 30 * 24, + minutes: 30 * 24 * 60, + seconds: 30 * 24 * 60 * 60, + milliseconds: 30 * 24 * 60 * 60 * 1000 + } + }, lowOrderMatrix), + daysInYearAccurate = 146097.0 / 400, + daysInMonthAccurate = 146097.0 / 4800, + accurateMatrix = _extends({ + years: { + quarters: 4, + months: 12, + weeks: daysInYearAccurate / 7, + days: daysInYearAccurate, + hours: daysInYearAccurate * 24, + minutes: daysInYearAccurate * 24 * 60, + seconds: daysInYearAccurate * 24 * 60 * 60, + milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000 + }, + quarters: { + months: 3, + weeks: daysInYearAccurate / 28, + days: daysInYearAccurate / 4, + hours: daysInYearAccurate * 24 / 4, + minutes: daysInYearAccurate * 24 * 60 / 4, + seconds: daysInYearAccurate * 24 * 60 * 60 / 4, + milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000 / 4 + }, + months: { + weeks: daysInMonthAccurate / 7, + days: daysInMonthAccurate, + hours: daysInMonthAccurate * 24, + minutes: daysInMonthAccurate * 24 * 60, + seconds: daysInMonthAccurate * 24 * 60 * 60, + milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000 + } + }, lowOrderMatrix); + + // units ordered by size + var orderedUnits$1 = ["years", "quarters", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds"]; + var reverseUnits = orderedUnits$1.slice(0).reverse(); + + // clone really means "create another instance just like this one, but with these changes" + function clone$1(dur, alts, clear) { + if (clear === void 0) { + clear = false; + } + // deep merge for vals + var conf = { + values: clear ? alts.values : _extends({}, dur.values, alts.values || {}), + loc: dur.loc.clone(alts.loc), + conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy, + matrix: alts.matrix || dur.matrix + }; + return new Duration(conf); + } + function durationToMillis(matrix, vals) { + var _vals$milliseconds; + var sum = (_vals$milliseconds = vals.milliseconds) != null ? _vals$milliseconds : 0; + for (var _iterator = _createForOfIteratorHelperLoose(reverseUnits.slice(1)), _step; !(_step = _iterator()).done;) { + var unit = _step.value; + if (vals[unit]) { + sum += vals[unit] * matrix[unit]["milliseconds"]; + } + } + return sum; + } + + // NB: mutates parameters + function normalizeValues(matrix, vals) { + // the logic below assumes the overall value of the duration is positive + // if this is not the case, factor is used to make it so + var factor = durationToMillis(matrix, vals) < 0 ? -1 : 1; + orderedUnits$1.reduceRight(function (previous, current) { + if (!isUndefined(vals[current])) { + if (previous) { + var previousVal = vals[previous] * factor; + var conv = matrix[current][previous]; + + // if (previousVal < 0): + // lower order unit is negative (e.g. { years: 2, days: -2 }) + // normalize this by reducing the higher order unit by the appropriate amount + // and increasing the lower order unit + // this can never make the higher order unit negative, because this function only operates + // on positive durations, so the amount of time represented by the lower order unit cannot + // be larger than the higher order unit + // else: + // lower order unit is positive (e.g. { years: 2, days: 450 } or { years: -2, days: 450 }) + // in this case we attempt to convert as much as possible from the lower order unit into + // the higher order one + // + // Math.floor takes care of both of these cases, rounding away from 0 + // if previousVal < 0 it makes the absolute value larger + // if previousVal >= it makes the absolute value smaller + var rollUp = Math.floor(previousVal / conv); + vals[current] += rollUp * factor; + vals[previous] -= rollUp * conv * factor; + } + return current; + } else { + return previous; + } + }, null); + + // try to convert any decimals into smaller units if possible + // for example for { years: 2.5, days: 0, seconds: 0 } we want to get { years: 2, days: 182, hours: 12 } + orderedUnits$1.reduce(function (previous, current) { + if (!isUndefined(vals[current])) { + if (previous) { + var fraction = vals[previous] % 1; + vals[previous] -= fraction; + vals[current] += fraction * matrix[previous][current]; + } + return current; + } else { + return previous; + } + }, null); + } + + // Remove all properties with a value of 0 from an object + function removeZeroes(vals) { + var newVals = {}; + for (var _i = 0, _Object$entries = Object.entries(vals); _i < _Object$entries.length; _i++) { + var _Object$entries$_i = _Object$entries[_i], + key = _Object$entries$_i[0], + value = _Object$entries$_i[1]; + if (value !== 0) { + newVals[key] = value; + } + } + return newVals; + } + + /** + * A Duration object represents a period of time, like "2 months" or "1 day, 1 hour". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime#plus} to add a Duration object to a DateTime, producing another DateTime. + * + * Here is a brief overview of commonly used methods and getters in Duration: + * + * * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}. + * * **Unit values** See the {@link Duration#years}, {@link Duration#months}, {@link Duration#weeks}, {@link Duration#days}, {@link Duration#hours}, {@link Duration#minutes}, {@link Duration#seconds}, {@link Duration#milliseconds} accessors. + * * **Configuration** See {@link Duration#locale} and {@link Duration#numberingSystem} accessors. + * * **Transformation** To create new Durations out of old ones use {@link Duration#plus}, {@link Duration#minus}, {@link Duration#normalize}, {@link Duration#set}, {@link Duration#reconfigure}, {@link Duration#shiftTo}, and {@link Duration#negate}. + * * **Output** To convert the Duration into other representations, see {@link Duration#as}, {@link Duration#toISO}, {@link Duration#toFormat}, and {@link Duration#toJSON} + * + * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation. + */ + var Duration = /*#__PURE__*/function (_Symbol$for) { + /** + * @private + */ + function Duration(config) { + var accurate = config.conversionAccuracy === "longterm" || false; + var matrix = accurate ? accurateMatrix : casualMatrix; + if (config.matrix) { + matrix = config.matrix; + } + + /** + * @access private + */ + this.values = config.values; + /** + * @access private + */ + this.loc = config.loc || Locale.create(); + /** + * @access private + */ + this.conversionAccuracy = accurate ? "longterm" : "casual"; + /** + * @access private + */ + this.invalid = config.invalid || null; + /** + * @access private + */ + this.matrix = matrix; + /** + * @access private + */ + this.isLuxonDuration = true; + } + + /** + * Create Duration from a number of milliseconds. + * @param {number} count of milliseconds + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @return {Duration} + */ + Duration.fromMillis = function fromMillis(count, opts) { + return Duration.fromObject({ + milliseconds: count + }, opts); + } + + /** + * Create a Duration from a JavaScript object with keys like 'years' and 'hours'. + * If this object is empty then a zero milliseconds duration is returned. + * @param {Object} obj - the object to create the DateTime from + * @param {number} obj.years + * @param {number} obj.quarters + * @param {number} obj.months + * @param {number} obj.weeks + * @param {number} obj.days + * @param {number} obj.hours + * @param {number} obj.minutes + * @param {number} obj.seconds + * @param {number} obj.milliseconds + * @param {Object} [opts=[]] - options for creating this Duration + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the custom conversion system to use + * @return {Duration} + */; + Duration.fromObject = function fromObject(obj, opts) { + if (opts === void 0) { + opts = {}; + } + if (obj == null || typeof obj !== "object") { + throw new InvalidArgumentError("Duration.fromObject: argument expected to be an object, got " + (obj === null ? "null" : typeof obj)); + } + return new Duration({ + values: normalizeObject(obj, Duration.normalizeUnit), + loc: Locale.fromObject(opts), + conversionAccuracy: opts.conversionAccuracy, + matrix: opts.matrix + }); + } + + /** + * Create a Duration from DurationLike. + * + * @param {Object | number | Duration} durationLike + * One of: + * - object with keys like 'years' and 'hours'. + * - number representing milliseconds + * - Duration instance + * @return {Duration} + */; + Duration.fromDurationLike = function fromDurationLike(durationLike) { + if (isNumber(durationLike)) { + return Duration.fromMillis(durationLike); + } else if (Duration.isDuration(durationLike)) { + return durationLike; + } else if (typeof durationLike === "object") { + return Duration.fromObject(durationLike); + } else { + throw new InvalidArgumentError("Unknown duration argument " + durationLike + " of type " + typeof durationLike); + } + } + + /** + * Create a Duration from an ISO 8601 duration string. + * @param {string} text - text to parse + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the preset conversion system to use + * @see https://en.wikipedia.org/wiki/ISO_8601#Durations + * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 } + * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 } + * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 } + * @return {Duration} + */; + Duration.fromISO = function fromISO(text, opts) { + var _parseISODuration = parseISODuration(text), + parsed = _parseISODuration[0]; + if (parsed) { + return Duration.fromObject(parsed, opts); + } else { + return Duration.invalid("unparsable", "the input \"" + text + "\" can't be parsed as ISO 8601"); + } + } + + /** + * Create a Duration from an ISO 8601 time string. + * @param {string} text - text to parse + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the conversion system to use + * @see https://en.wikipedia.org/wiki/ISO_8601#Times + * @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 } + * @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @return {Duration} + */; + Duration.fromISOTime = function fromISOTime(text, opts) { + var _parseISOTimeOnly = parseISOTimeOnly(text), + parsed = _parseISOTimeOnly[0]; + if (parsed) { + return Duration.fromObject(parsed, opts); + } else { + return Duration.invalid("unparsable", "the input \"" + text + "\" can't be parsed as ISO 8601"); + } + } + + /** + * Create an invalid Duration. + * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {Duration} + */; + Duration.invalid = function invalid(reason, explanation) { + if (explanation === void 0) { + explanation = null; + } + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the Duration is invalid"); + } + var invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidDurationError(invalid); + } else { + return new Duration({ + invalid: invalid + }); + } + } + + /** + * @private + */; + Duration.normalizeUnit = function normalizeUnit(unit) { + var normalized = { + year: "years", + years: "years", + quarter: "quarters", + quarters: "quarters", + month: "months", + months: "months", + week: "weeks", + weeks: "weeks", + day: "days", + days: "days", + hour: "hours", + hours: "hours", + minute: "minutes", + minutes: "minutes", + second: "seconds", + seconds: "seconds", + millisecond: "milliseconds", + milliseconds: "milliseconds" + }[unit ? unit.toLowerCase() : unit]; + if (!normalized) throw new InvalidUnitError(unit); + return normalized; + } + + /** + * Check if an object is a Duration. Works across context boundaries + * @param {object} o + * @return {boolean} + */; + Duration.isDuration = function isDuration(o) { + return o && o.isLuxonDuration || false; + } + + /** + * Get the locale of a Duration, such 'en-GB' + * @type {string} + */; + var _proto = Duration.prototype; + /** + * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens: + * * `S` for milliseconds + * * `s` for seconds + * * `m` for minutes + * * `h` for hours + * * `d` for days + * * `w` for weeks + * * `M` for months + * * `y` for years + * Notes: + * * Add padding by repeating the token, e.g. "yy" pads the years to two digits, "hhhh" pads the hours out to four digits + * * Tokens can be escaped by wrapping with single quotes. + * * The duration will be converted to the set of units in the format string using {@link Duration#shiftTo} and the Durations's conversion accuracy setting. + * @param {string} fmt - the format string + * @param {Object} opts - options + * @param {boolean} [opts.floor=true] - floor numerical values + * @param {'negative'|'all'|'negativeLargestOnly'} [opts.signMode=negative] - How to handle signs + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("y d s") //=> "1 6 2" + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("yy dd sss") //=> "01 06 002" + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("M S") //=> "12 518402000" + * @example Duration.fromObject({ days: 6, seconds: 2 }).toFormat("d s", { signMode: "all" }) //=> "+6 +2" + * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat("d s", { signMode: "all" }) //=> "-6 -2" + * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat("d s", { signMode: "negativeLargestOnly" }) //=> "-6 2" + * @return {string} + */ + _proto.toFormat = function toFormat(fmt, opts) { + if (opts === void 0) { + opts = {}; + } + // reverse-compat since 1.2; we always round down now, never up, and we do it by default + var fmtOpts = _extends({}, opts, { + floor: opts.round !== false && opts.floor !== false + }); + return this.isValid ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt) : INVALID$2; + } + + /** + * Returns a string representation of a Duration with all units included. + * To modify its behavior, use `listStyle` and any Intl.NumberFormat option, though `unitDisplay` is especially relevant. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options + * @param {Object} opts - Formatting options. Accepts the same keys as the options parameter of the native `Intl.NumberFormat` constructor, as well as `listStyle`. + * @param {string} [opts.listStyle='narrow'] - How to format the merged list. Corresponds to the `style` property of the options parameter of the native `Intl.ListFormat` constructor. + * @param {boolean} [opts.showZeros=true] - Show all units previously used by the duration even if they are zero + * @example + * ```js + * var dur = Duration.fromObject({ months: 1, weeks: 0, hours: 5, minutes: 6 }) + * dur.toHuman() //=> '1 month, 0 weeks, 5 hours, 6 minutes' + * dur.toHuman({ listStyle: "long" }) //=> '1 month, 0 weeks, 5 hours, and 6 minutes' + * dur.toHuman({ unitDisplay: "short" }) //=> '1 mth, 0 wks, 5 hr, 6 min' + * dur.toHuman({ showZeros: false }) //=> '1 month, 5 hours, 6 minutes' + * ``` + */; + _proto.toHuman = function toHuman(opts) { + var _this = this; + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) return INVALID$2; + var showZeros = opts.showZeros !== false; + var l = orderedUnits$1.map(function (unit) { + var val = _this.values[unit]; + if (isUndefined(val) || val === 0 && !showZeros) { + return null; + } + return _this.loc.numberFormatter(_extends({ + style: "unit", + unitDisplay: "long" + }, opts, { + unit: unit.slice(0, -1) + })).format(val); + }).filter(function (n) { + return n; + }); + return this.loc.listFormatter(_extends({ + type: "conjunction", + style: opts.listStyle || "narrow" + }, opts)).format(l); + } + + /** + * Returns a JavaScript object with this Duration's values. + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 } + * @return {Object} + */; + _proto.toObject = function toObject() { + if (!this.isValid) return {}; + return _extends({}, this.values); + } + + /** + * Returns an ISO 8601-compliant string representation of this Duration. + * @see https://en.wikipedia.org/wiki/ISO_8601#Durations + * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S' + * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S' + * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M' + * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M' + * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S' + * @return {string} + */; + _proto.toISO = function toISO() { + // we could use the formatter, but this is an easier way to get the minimum string + if (!this.isValid) return null; + var s = "P"; + if (this.years !== 0) s += this.years + "Y"; + if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + "M"; + if (this.weeks !== 0) s += this.weeks + "W"; + if (this.days !== 0) s += this.days + "D"; + if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0) s += "T"; + if (this.hours !== 0) s += this.hours + "H"; + if (this.minutes !== 0) s += this.minutes + "M"; + if (this.seconds !== 0 || this.milliseconds !== 0) + // this will handle "floating point madness" by removing extra decimal places + // https://stackoverflow.com/questions/588004/is-floating-point-math-broken + s += roundTo(this.seconds + this.milliseconds / 1000, 3) + "S"; + if (s === "P") s += "T0S"; + return s; + } + + /** + * Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day. + * Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours. + * @see https://en.wikipedia.org/wiki/ISO_8601#Times + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includePrefix=false] - include the `T` prefix + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000' + * @return {string} + */; + _proto.toISOTime = function toISOTime(opts) { + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) return null; + var millis = this.toMillis(); + if (millis < 0 || millis >= 86400000) return null; + opts = _extends({ + suppressMilliseconds: false, + suppressSeconds: false, + includePrefix: false, + format: "extended" + }, opts, { + includeOffset: false + }); + var dateTime = DateTime.fromMillis(millis, { + zone: "UTC" + }); + return dateTime.toISOTime(opts); + } + + /** + * Returns an ISO 8601 representation of this Duration appropriate for use in JSON. + * @return {string} + */; + _proto.toJSON = function toJSON() { + return this.toISO(); + } + + /** + * Returns an ISO 8601 representation of this Duration appropriate for use in debugging. + * @return {string} + */; + _proto.toString = function toString() { + return this.toISO(); + } + + /** + * Returns a string representation of this Duration appropriate for the REPL. + * @return {string} + */; + _proto[_Symbol$for] = function () { + if (this.isValid) { + return "Duration { values: " + JSON.stringify(this.values) + " }"; + } else { + return "Duration { Invalid, reason: " + this.invalidReason + " }"; + } + } + + /** + * Returns an milliseconds value of this Duration. + * @return {number} + */; + _proto.toMillis = function toMillis() { + if (!this.isValid) return NaN; + return durationToMillis(this.matrix, this.values); + } + + /** + * Returns an milliseconds value of this Duration. Alias of {@link toMillis} + * @return {number} + */; + _proto.valueOf = function valueOf() { + return this.toMillis(); + } + + /** + * Make this Duration longer by the specified amount. Return a newly-constructed Duration. + * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @return {Duration} + */; + _proto.plus = function plus(duration) { + if (!this.isValid) return this; + var dur = Duration.fromDurationLike(duration), + result = {}; + for (var _i2 = 0, _orderedUnits = orderedUnits$1; _i2 < _orderedUnits.length; _i2++) { + var k = _orderedUnits[_i2]; + if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) { + result[k] = dur.get(k) + this.get(k); + } + } + return clone$1(this, { + values: result + }, true); + } + + /** + * Make this Duration shorter by the specified amount. Return a newly-constructed Duration. + * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @return {Duration} + */; + _proto.minus = function minus(duration) { + if (!this.isValid) return this; + var dur = Duration.fromDurationLike(duration); + return this.plus(dur.negate()); + } + + /** + * Scale this Duration by the specified amount. Return a newly-constructed Duration. + * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number. + * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits(x => x * 2) //=> { hours: 2, minutes: 60 } + * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits((x, u) => u === "hours" ? x * 2 : x) //=> { hours: 2, minutes: 30 } + * @return {Duration} + */; + _proto.mapUnits = function mapUnits(fn) { + if (!this.isValid) return this; + var result = {}; + for (var _i3 = 0, _Object$keys = Object.keys(this.values); _i3 < _Object$keys.length; _i3++) { + var k = _Object$keys[_i3]; + result[k] = asNumber(fn(this.values[k], k)); + } + return clone$1(this, { + values: result + }, true); + } + + /** + * Get the value of unit. + * @param {string} unit - a unit such as 'minute' or 'day' + * @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2 + * @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0 + * @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3 + * @return {number} + */; + _proto.get = function get(unit) { + return this[Duration.normalizeUnit(unit)]; + } + + /** + * "Set" the values of specified units. Return a newly-constructed Duration. + * @param {Object} values - a mapping of units to numbers + * @example dur.set({ years: 2017 }) + * @example dur.set({ hours: 8, minutes: 30 }) + * @return {Duration} + */; + _proto.set = function set(values) { + if (!this.isValid) return this; + var mixed = _extends({}, this.values, normalizeObject(values, Duration.normalizeUnit)); + return clone$1(this, { + values: mixed + }); + } + + /** + * "Set" the locale and/or numberingSystem. Returns a newly-constructed Duration. + * @example dur.reconfigure({ locale: 'en-GB' }) + * @return {Duration} + */; + _proto.reconfigure = function reconfigure(_temp) { + var _ref = _temp === void 0 ? {} : _temp, + locale = _ref.locale, + numberingSystem = _ref.numberingSystem, + conversionAccuracy = _ref.conversionAccuracy, + matrix = _ref.matrix; + var loc = this.loc.clone({ + locale: locale, + numberingSystem: numberingSystem + }); + var opts = { + loc: loc, + matrix: matrix, + conversionAccuracy: conversionAccuracy + }; + return clone$1(this, opts); + } + + /** + * Return the length of the duration in the specified unit. + * @param {string} unit - a unit such as 'minutes' or 'days' + * @example Duration.fromObject({years: 1}).as('days') //=> 365 + * @example Duration.fromObject({years: 1}).as('months') //=> 12 + * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5 + * @return {number} + */; + _proto.as = function as(unit) { + return this.isValid ? this.shiftTo(unit).get(unit) : NaN; + } + + /** + * Reduce this Duration to its canonical representation in its current units. + * Assuming the overall value of the Duration is positive, this means: + * - excessive values for lower-order units are converted to higher-order units (if possible, see first and second example) + * - negative lower-order units are converted to higher order units (there must be such a higher order unit, otherwise + * the overall value would be negative, see third example) + * - fractional values for higher-order units are converted to lower-order units (if possible, see fourth example) + * + * If the overall value is negative, the result of this method is equivalent to `this.negate().normalize().negate()`. + * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 } + * @example Duration.fromObject({ days: 5000 }).normalize().toObject() //=> { days: 5000 } + * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 } + * @example Duration.fromObject({ years: 2.5, days: 0, hours: 0 }).normalize().toObject() //=> { years: 2, days: 182, hours: 12 } + * @return {Duration} + */; + _proto.normalize = function normalize() { + if (!this.isValid) return this; + var vals = this.toObject(); + normalizeValues(this.matrix, vals); + return clone$1(this, { + values: vals + }, true); + } + + /** + * Rescale units to its largest representation + * @example Duration.fromObject({ milliseconds: 90000 }).rescale().toObject() //=> { minutes: 1, seconds: 30 } + * @return {Duration} + */; + _proto.rescale = function rescale() { + if (!this.isValid) return this; + var vals = removeZeroes(this.normalize().shiftToAll().toObject()); + return clone$1(this, { + values: vals + }, true); + } + + /** + * Convert this Duration into its representation in a different set of units. + * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 } + * @return {Duration} + */; + _proto.shiftTo = function shiftTo() { + for (var _len = arguments.length, units = new Array(_len), _key = 0; _key < _len; _key++) { + units[_key] = arguments[_key]; + } + if (!this.isValid) return this; + if (units.length === 0) { + return this; + } + units = units.map(function (u) { + return Duration.normalizeUnit(u); + }); + var built = {}, + accumulated = {}, + vals = this.toObject(); + var lastUnit; + for (var _i4 = 0, _orderedUnits2 = orderedUnits$1; _i4 < _orderedUnits2.length; _i4++) { + var k = _orderedUnits2[_i4]; + if (units.indexOf(k) >= 0) { + lastUnit = k; + var own = 0; + + // anything we haven't boiled down yet should get boiled to this unit + for (var ak in accumulated) { + own += this.matrix[ak][k] * accumulated[ak]; + accumulated[ak] = 0; + } + + // plus anything that's already in this unit + if (isNumber(vals[k])) { + own += vals[k]; + } + + // only keep the integer part for now in the hopes of putting any decimal part + // into a smaller unit later + var i = Math.trunc(own); + built[k] = i; + accumulated[k] = (own * 1000 - i * 1000) / 1000; + + // otherwise, keep it in the wings to boil it later + } else if (isNumber(vals[k])) { + accumulated[k] = vals[k]; + } + } + + // anything leftover becomes the decimal for the last unit + // lastUnit must be defined since units is not empty + for (var key in accumulated) { + if (accumulated[key] !== 0) { + built[lastUnit] += key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key]; + } + } + normalizeValues(this.matrix, built); + return clone$1(this, { + values: built + }, true); + } + + /** + * Shift this Duration to all available units. + * Same as shiftTo("years", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds") + * @return {Duration} + */; + _proto.shiftToAll = function shiftToAll() { + if (!this.isValid) return this; + return this.shiftTo("years", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds"); + } + + /** + * Return the negative of this Duration. + * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 } + * @return {Duration} + */; + _proto.negate = function negate() { + if (!this.isValid) return this; + var negated = {}; + for (var _i5 = 0, _Object$keys2 = Object.keys(this.values); _i5 < _Object$keys2.length; _i5++) { + var k = _Object$keys2[_i5]; + negated[k] = this.values[k] === 0 ? 0 : -this.values[k]; + } + return clone$1(this, { + values: negated + }, true); + } + + /** + * Removes all units with values equal to 0 from this Duration. + * @example Duration.fromObject({ years: 2, days: 0, hours: 0, minutes: 0 }).removeZeros().toObject() //=> { years: 2 } + * @return {Duration} + */; + _proto.removeZeros = function removeZeros() { + if (!this.isValid) return this; + var vals = removeZeroes(this.values); + return clone$1(this, { + values: vals + }, true); + } + + /** + * Get the years. + * @type {number} + */; + /** + * Equality check + * Two Durations are equal iff they have the same units and the same values for each unit. + * @param {Duration} other + * @return {boolean} + */ + _proto.equals = function equals(other) { + if (!this.isValid || !other.isValid) { + return false; + } + if (!this.loc.equals(other.loc)) { + return false; + } + function eq(v1, v2) { + // Consider 0 and undefined as equal + if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0; + return v1 === v2; + } + for (var _i6 = 0, _orderedUnits3 = orderedUnits$1; _i6 < _orderedUnits3.length; _i6++) { + var u = _orderedUnits3[_i6]; + if (!eq(this.values[u], other.values[u])) { + return false; + } + } + return true; + }; + _createClass(Duration, [{ + key: "locale", + get: function get() { + return this.isValid ? this.loc.locale : null; + } + + /** + * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration + * + * @type {string} + */ + }, { + key: "numberingSystem", + get: function get() { + return this.isValid ? this.loc.numberingSystem : null; + } + }, { + key: "years", + get: function get() { + return this.isValid ? this.values.years || 0 : NaN; + } + + /** + * Get the quarters. + * @type {number} + */ + }, { + key: "quarters", + get: function get() { + return this.isValid ? this.values.quarters || 0 : NaN; + } + + /** + * Get the months. + * @type {number} + */ + }, { + key: "months", + get: function get() { + return this.isValid ? this.values.months || 0 : NaN; + } + + /** + * Get the weeks + * @type {number} + */ + }, { + key: "weeks", + get: function get() { + return this.isValid ? this.values.weeks || 0 : NaN; + } + + /** + * Get the days. + * @type {number} + */ + }, { + key: "days", + get: function get() { + return this.isValid ? this.values.days || 0 : NaN; + } + + /** + * Get the hours. + * @type {number} + */ + }, { + key: "hours", + get: function get() { + return this.isValid ? this.values.hours || 0 : NaN; + } + + /** + * Get the minutes. + * @type {number} + */ + }, { + key: "minutes", + get: function get() { + return this.isValid ? this.values.minutes || 0 : NaN; + } + + /** + * Get the seconds. + * @return {number} + */ + }, { + key: "seconds", + get: function get() { + return this.isValid ? this.values.seconds || 0 : NaN; + } + + /** + * Get the milliseconds. + * @return {number} + */ + }, { + key: "milliseconds", + get: function get() { + return this.isValid ? this.values.milliseconds || 0 : NaN; + } + + /** + * Returns whether the Duration is invalid. Invalid durations are returned by diff operations + * on invalid DateTimes or Intervals. + * @return {boolean} + */ + }, { + key: "isValid", + get: function get() { + return this.invalid === null; + } + + /** + * Returns an error code if this Duration became invalid, or null if the Duration is valid + * @return {string} + */ + }, { + key: "invalidReason", + get: function get() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this Duration became invalid, or null if the Duration is valid + * @type {string} + */ + }, { + key: "invalidExplanation", + get: function get() { + return this.invalid ? this.invalid.explanation : null; + } + }]); + return Duration; + }(Symbol.for("nodejs.util.inspect.custom")); + + var INVALID$1 = "Invalid Interval"; + + // checks if the start is equal to or before the end + function validateStartEnd(start, end) { + if (!start || !start.isValid) { + return Interval.invalid("missing or invalid start"); + } else if (!end || !end.isValid) { + return Interval.invalid("missing or invalid end"); + } else if (end < start) { + return Interval.invalid("end before start", "The end of an interval must be after its start, but you had start=" + start.toISO() + " and end=" + end.toISO()); + } else { + return null; + } + } + + /** + * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them. + * + * Here is a brief overview of the most commonly used methods and getters in Interval: + * + * * **Creation** To create an Interval, use {@link Interval.fromDateTimes}, {@link Interval.after}, {@link Interval.before}, or {@link Interval.fromISO}. + * * **Accessors** Use {@link Interval#start} and {@link Interval#end} to get the start and end. + * * **Interrogation** To analyze the Interval, use {@link Interval#count}, {@link Interval#length}, {@link Interval#hasSame}, {@link Interval#contains}, {@link Interval#isAfter}, or {@link Interval#isBefore}. + * * **Transformation** To create other Intervals out of this one, use {@link Interval#set}, {@link Interval#splitAt}, {@link Interval#splitBy}, {@link Interval#divideEqually}, {@link Interval.merge}, {@link Interval.xor}, {@link Interval#union}, {@link Interval#intersection}, or {@link Interval#difference}. + * * **Comparison** To compare this Interval to another one, use {@link Interval#equals}, {@link Interval#overlaps}, {@link Interval#abutsStart}, {@link Interval#abutsEnd}, {@link Interval#engulfs} + * * **Output** To convert the Interval into other representations, see {@link Interval#toString}, {@link Interval#toLocaleString}, {@link Interval#toISO}, {@link Interval#toISODate}, {@link Interval#toISOTime}, {@link Interval#toFormat}, and {@link Interval#toDuration}. + */ + var Interval = /*#__PURE__*/function (_Symbol$for) { + /** + * @private + */ + function Interval(config) { + /** + * @access private + */ + this.s = config.start; + /** + * @access private + */ + this.e = config.end; + /** + * @access private + */ + this.invalid = config.invalid || null; + /** + * @access private + */ + this.isLuxonInterval = true; + } + + /** + * Create an invalid Interval. + * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {Interval} + */ + Interval.invalid = function invalid(reason, explanation) { + if (explanation === void 0) { + explanation = null; + } + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the Interval is invalid"); + } + var invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidIntervalError(invalid); + } else { + return new Interval({ + invalid: invalid + }); + } + } + + /** + * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end. + * @param {DateTime|Date|Object} start + * @param {DateTime|Date|Object} end + * @return {Interval} + */; + Interval.fromDateTimes = function fromDateTimes(start, end) { + var builtStart = friendlyDateTime(start), + builtEnd = friendlyDateTime(end); + var validateError = validateStartEnd(builtStart, builtEnd); + if (validateError == null) { + return new Interval({ + start: builtStart, + end: builtEnd + }); + } else { + return validateError; + } + } + + /** + * Create an Interval from a start DateTime and a Duration to extend to. + * @param {DateTime|Date|Object} start + * @param {Duration|Object|number} duration - the length of the Interval. + * @return {Interval} + */; + Interval.after = function after(start, duration) { + var dur = Duration.fromDurationLike(duration), + dt = friendlyDateTime(start); + return Interval.fromDateTimes(dt, dt.plus(dur)); + } + + /** + * Create an Interval from an end DateTime and a Duration to extend backwards to. + * @param {DateTime|Date|Object} end + * @param {Duration|Object|number} duration - the length of the Interval. + * @return {Interval} + */; + Interval.before = function before(end, duration) { + var dur = Duration.fromDurationLike(duration), + dt = friendlyDateTime(end); + return Interval.fromDateTimes(dt.minus(dur), dt); + } + + /** + * Create an Interval from an ISO 8601 string. + * Accepts `/`, `/`, and `/` formats. + * @param {string} text - the ISO string to parse + * @param {Object} [opts] - options to pass {@link DateTime#fromISO} and optionally {@link Duration#fromISO} + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @return {Interval} + */; + Interval.fromISO = function fromISO(text, opts) { + var _split = (text || "").split("/", 2), + s = _split[0], + e = _split[1]; + if (s && e) { + var start, startIsValid; + try { + start = DateTime.fromISO(s, opts); + startIsValid = start.isValid; + } catch (e) { + startIsValid = false; + } + var end, endIsValid; + try { + end = DateTime.fromISO(e, opts); + endIsValid = end.isValid; + } catch (e) { + endIsValid = false; + } + if (startIsValid && endIsValid) { + return Interval.fromDateTimes(start, end); + } + if (startIsValid) { + var dur = Duration.fromISO(e, opts); + if (dur.isValid) { + return Interval.after(start, dur); + } + } else if (endIsValid) { + var _dur = Duration.fromISO(s, opts); + if (_dur.isValid) { + return Interval.before(end, _dur); + } + } + } + return Interval.invalid("unparsable", "the input \"" + text + "\" can't be parsed as ISO 8601"); + } + + /** + * Check if an object is an Interval. Works across context boundaries + * @param {object} o + * @return {boolean} + */; + Interval.isInterval = function isInterval(o) { + return o && o.isLuxonInterval || false; + } + + /** + * Returns the start of the Interval + * @type {DateTime} + */; + var _proto = Interval.prototype; + /** + * Returns the length of the Interval in the specified unit. + * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in. + * @return {number} + */ + _proto.length = function length(unit) { + if (unit === void 0) { + unit = "milliseconds"; + } + return this.isValid ? this.toDuration.apply(this, [unit]).get(unit) : NaN; + } + + /** + * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part. + * Unlike {@link Interval#length} this counts sections of the calendar, not periods of time, e.g. specifying 'day' + * asks 'what dates are included in this interval?', not 'how many days long is this interval?' + * @param {string} [unit='milliseconds'] - the unit of time to count. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; this operation will always use the locale of the start DateTime + * @return {number} + */; + _proto.count = function count(unit, opts) { + if (unit === void 0) { + unit = "milliseconds"; + } + if (!this.isValid) return NaN; + var start = this.start.startOf(unit, opts); + var end; + if (opts != null && opts.useLocaleWeeks) { + end = this.end.reconfigure({ + locale: start.locale + }); + } else { + end = this.end; + } + end = end.startOf(unit, opts); + return Math.floor(end.diff(start, unit).get(unit)) + (end.valueOf() !== this.end.valueOf()); + } + + /** + * Returns whether this Interval's start and end are both in the same unit of time + * @param {string} unit - the unit of time to check sameness on + * @return {boolean} + */; + _proto.hasSame = function hasSame(unit) { + return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false; + } + + /** + * Return whether this Interval has the same start and end DateTimes. + * @return {boolean} + */; + _proto.isEmpty = function isEmpty() { + return this.s.valueOf() === this.e.valueOf(); + } + + /** + * Return whether this Interval's start is after the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */; + _proto.isAfter = function isAfter(dateTime) { + if (!this.isValid) return false; + return this.s > dateTime; + } + + /** + * Return whether this Interval's end is before the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */; + _proto.isBefore = function isBefore(dateTime) { + if (!this.isValid) return false; + return this.e <= dateTime; + } + + /** + * Return whether this Interval contains the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */; + _proto.contains = function contains(dateTime) { + if (!this.isValid) return false; + return this.s <= dateTime && this.e > dateTime; + } + + /** + * "Sets" the start and/or end dates. Returns a newly-constructed Interval. + * @param {Object} values - the values to set + * @param {DateTime} values.start - the starting DateTime + * @param {DateTime} values.end - the ending DateTime + * @return {Interval} + */; + _proto.set = function set(_temp) { + var _ref = _temp === void 0 ? {} : _temp, + start = _ref.start, + end = _ref.end; + if (!this.isValid) return this; + return Interval.fromDateTimes(start || this.s, end || this.e); + } + + /** + * Split this Interval at each of the specified DateTimes + * @param {...DateTime} dateTimes - the unit of time to count. + * @return {Array} + */; + _proto.splitAt = function splitAt() { + var _this = this; + if (!this.isValid) return []; + for (var _len = arguments.length, dateTimes = new Array(_len), _key = 0; _key < _len; _key++) { + dateTimes[_key] = arguments[_key]; + } + var sorted = dateTimes.map(friendlyDateTime).filter(function (d) { + return _this.contains(d); + }).sort(function (a, b) { + return a.toMillis() - b.toMillis(); + }), + results = []; + var s = this.s, + i = 0; + while (s < this.e) { + var added = sorted[i] || this.e, + next = +added > +this.e ? this.e : added; + results.push(Interval.fromDateTimes(s, next)); + s = next; + i += 1; + } + return results; + } + + /** + * Split this Interval into smaller Intervals, each of the specified length. + * Left over time is grouped into a smaller interval + * @param {Duration|Object|number} duration - The length of each resulting interval. + * @return {Array} + */; + _proto.splitBy = function splitBy(duration) { + var dur = Duration.fromDurationLike(duration); + if (!this.isValid || !dur.isValid || dur.as("milliseconds") === 0) { + return []; + } + var s = this.s, + idx = 1, + next; + var results = []; + while (s < this.e) { + var added = this.start.plus(dur.mapUnits(function (x) { + return x * idx; + })); + next = +added > +this.e ? this.e : added; + results.push(Interval.fromDateTimes(s, next)); + s = next; + idx += 1; + } + return results; + } + + /** + * Split this Interval into the specified number of smaller intervals. + * @param {number} numberOfParts - The number of Intervals to divide the Interval into. + * @return {Array} + */; + _proto.divideEqually = function divideEqually(numberOfParts) { + if (!this.isValid) return []; + return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts); + } + + /** + * Return whether this Interval overlaps with the specified Interval + * @param {Interval} other + * @return {boolean} + */; + _proto.overlaps = function overlaps(other) { + return this.e > other.s && this.s < other.e; + } + + /** + * Return whether this Interval's end is adjacent to the specified Interval's start. + * @param {Interval} other + * @return {boolean} + */; + _proto.abutsStart = function abutsStart(other) { + if (!this.isValid) return false; + return +this.e === +other.s; + } + + /** + * Return whether this Interval's start is adjacent to the specified Interval's end. + * @param {Interval} other + * @return {boolean} + */; + _proto.abutsEnd = function abutsEnd(other) { + if (!this.isValid) return false; + return +other.e === +this.s; + } + + /** + * Returns true if this Interval fully contains the specified Interval, specifically if the intersect (of this Interval and the other Interval) is equal to the other Interval; false otherwise. + * @param {Interval} other + * @return {boolean} + */; + _proto.engulfs = function engulfs(other) { + if (!this.isValid) return false; + return this.s <= other.s && this.e >= other.e; + } + + /** + * Return whether this Interval has the same start and end as the specified Interval. + * @param {Interval} other + * @return {boolean} + */; + _proto.equals = function equals(other) { + if (!this.isValid || !other.isValid) { + return false; + } + return this.s.equals(other.s) && this.e.equals(other.e); + } + + /** + * Return an Interval representing the intersection of this Interval and the specified Interval. + * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals. + * Returns null if the intersection is empty, meaning, the intervals don't intersect. + * @param {Interval} other + * @return {Interval} + */; + _proto.intersection = function intersection(other) { + if (!this.isValid) return this; + var s = this.s > other.s ? this.s : other.s, + e = this.e < other.e ? this.e : other.e; + if (s >= e) { + return null; + } else { + return Interval.fromDateTimes(s, e); + } + } + + /** + * Return an Interval representing the union of this Interval and the specified Interval. + * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals. + * @param {Interval} other + * @return {Interval} + */; + _proto.union = function union(other) { + if (!this.isValid) return this; + var s = this.s < other.s ? this.s : other.s, + e = this.e > other.e ? this.e : other.e; + return Interval.fromDateTimes(s, e); + } + + /** + * Merge an array of Intervals into an equivalent minimal set of Intervals. + * Combines overlapping and adjacent Intervals. + * The resulting array will contain the Intervals in ascending order, that is, starting with the earliest Interval + * and ending with the latest. + * + * @param {Array} intervals + * @return {Array} + */; + Interval.merge = function merge(intervals) { + var _intervals$sort$reduc = intervals.sort(function (a, b) { + return a.s - b.s; + }).reduce(function (_ref2, item) { + var sofar = _ref2[0], + current = _ref2[1]; + if (!current) { + return [sofar, item]; + } else if (current.overlaps(item) || current.abutsStart(item)) { + return [sofar, current.union(item)]; + } else { + return [sofar.concat([current]), item]; + } + }, [[], null]), + found = _intervals$sort$reduc[0], + final = _intervals$sort$reduc[1]; + if (final) { + found.push(final); + } + return found; + } + + /** + * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals. + * @param {Array} intervals + * @return {Array} + */; + Interval.xor = function xor(intervals) { + var _Array$prototype; + var start = null, + currentCount = 0; + var results = [], + ends = intervals.map(function (i) { + return [{ + time: i.s, + type: "s" + }, { + time: i.e, + type: "e" + }]; + }), + flattened = (_Array$prototype = Array.prototype).concat.apply(_Array$prototype, ends), + arr = flattened.sort(function (a, b) { + return a.time - b.time; + }); + for (var _iterator = _createForOfIteratorHelperLoose(arr), _step; !(_step = _iterator()).done;) { + var i = _step.value; + currentCount += i.type === "s" ? 1 : -1; + if (currentCount === 1) { + start = i.time; + } else { + if (start && +start !== +i.time) { + results.push(Interval.fromDateTimes(start, i.time)); + } + start = null; + } + } + return Interval.merge(results); + } + + /** + * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals. + * @param {...Interval} intervals + * @return {Array} + */; + _proto.difference = function difference() { + var _this2 = this; + for (var _len2 = arguments.length, intervals = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + intervals[_key2] = arguments[_key2]; + } + return Interval.xor([this].concat(intervals)).map(function (i) { + return _this2.intersection(i); + }).filter(function (i) { + return i && !i.isEmpty(); + }); + } + + /** + * Returns a string representation of this Interval appropriate for debugging. + * @return {string} + */; + _proto.toString = function toString() { + if (!this.isValid) return INVALID$1; + return "[" + this.s.toISO() + " \u2013 " + this.e.toISO() + ")"; + } + + /** + * Returns a string representation of this Interval appropriate for the REPL. + * @return {string} + */; + _proto[_Symbol$for] = function () { + if (this.isValid) { + return "Interval { start: " + this.s.toISO() + ", end: " + this.e.toISO() + " }"; + } else { + return "Interval { Invalid, reason: " + this.invalidReason + " }"; + } + } + + /** + * Returns a localized string representing this Interval. Accepts the same options as the + * Intl.DateTimeFormat constructor and any presets defined by Luxon, such as + * {@link DateTime.DATE_FULL} or {@link DateTime.TIME_SIMPLE}. The exact behavior of this method + * is browser-specific, but in general it will return an appropriate representation of the + * Interval in the assigned locale. Defaults to the system's locale if no locale has been + * specified. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {Object} [formatOpts=DateTime.DATE_SHORT] - Either a DateTime preset or + * Intl.DateTimeFormat constructor options. + * @param {Object} opts - Options to override the configuration of the start DateTime. + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(); //=> 11/7/2022 – 11/8/2022 + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL); //=> November 7 – 8, 2022 + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL, { locale: 'fr-FR' }); //=> 7–8 novembre 2022 + * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString(DateTime.TIME_SIMPLE); //=> 6:00 – 8:00 PM + * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> Mon, Nov 07, 6:00 – 8:00 p + * @return {string} + */; + _proto.toLocaleString = function toLocaleString(formatOpts, opts) { + if (formatOpts === void 0) { + formatOpts = DATE_SHORT; + } + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.s.loc.clone(opts), formatOpts).formatInterval(this) : INVALID$1; + } + + /** + * Returns an ISO 8601-compliant string representation of this Interval. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @param {Object} opts - The same options as {@link DateTime#toISO} + * @return {string} + */; + _proto.toISO = function toISO(opts) { + if (!this.isValid) return INVALID$1; + return this.s.toISO(opts) + "/" + this.e.toISO(opts); + } + + /** + * Returns an ISO 8601-compliant string representation of date of this Interval. + * The time components are ignored. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @return {string} + */; + _proto.toISODate = function toISODate() { + if (!this.isValid) return INVALID$1; + return this.s.toISODate() + "/" + this.e.toISODate(); + } + + /** + * Returns an ISO 8601-compliant string representation of time of this Interval. + * The date components are ignored. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @param {Object} opts - The same options as {@link DateTime#toISO} + * @return {string} + */; + _proto.toISOTime = function toISOTime(opts) { + if (!this.isValid) return INVALID$1; + return this.s.toISOTime(opts) + "/" + this.e.toISOTime(opts); + } + + /** + * Returns a string representation of this Interval formatted according to the specified format + * string. **You may not want this.** See {@link Interval#toLocaleString} for a more flexible + * formatting tool. + * @param {string} dateFormat - The format string. This string formats the start and end time. + * See {@link DateTime#toFormat} for details. + * @param {Object} opts - Options. + * @param {string} [opts.separator = ' – '] - A separator to place between the start and end + * representations. + * @return {string} + */; + _proto.toFormat = function toFormat(dateFormat, _temp2) { + var _ref3 = _temp2 === void 0 ? {} : _temp2, + _ref3$separator = _ref3.separator, + separator = _ref3$separator === void 0 ? " – " : _ref3$separator; + if (!this.isValid) return INVALID$1; + return "" + this.s.toFormat(dateFormat) + separator + this.e.toFormat(dateFormat); + } + + /** + * Return a Duration representing the time spanned by this interval. + * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration. + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 } + * @return {Duration} + */; + _proto.toDuration = function toDuration(unit, opts) { + if (!this.isValid) { + return Duration.invalid(this.invalidReason); + } + return this.e.diff(this.s, unit, opts); + } + + /** + * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes + * @param {function} mapFn + * @return {Interval} + * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC()) + * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 })) + */; + _proto.mapEndpoints = function mapEndpoints(mapFn) { + return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e)); + }; + _createClass(Interval, [{ + key: "start", + get: function get() { + return this.isValid ? this.s : null; + } + + /** + * Returns the end of the Interval. This is the first instant which is not part of the interval + * (Interval is half-open). + * @type {DateTime} + */ + }, { + key: "end", + get: function get() { + return this.isValid ? this.e : null; + } + + /** + * Returns the last DateTime included in the interval (since end is not part of the interval) + * @type {DateTime} + */ + }, { + key: "lastDateTime", + get: function get() { + return this.isValid ? this.e ? this.e.minus(1) : null : null; + } + + /** + * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'. + * @type {boolean} + */ + }, { + key: "isValid", + get: function get() { + return this.invalidReason === null; + } + + /** + * Returns an error code if this Interval is invalid, or null if the Interval is valid + * @type {string} + */ + }, { + key: "invalidReason", + get: function get() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this Interval became invalid, or null if the Interval is valid + * @type {string} + */ + }, { + key: "invalidExplanation", + get: function get() { + return this.invalid ? this.invalid.explanation : null; + } + }]); + return Interval; + }(Symbol.for("nodejs.util.inspect.custom")); + + /** + * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment. + */ + var Info = /*#__PURE__*/function () { + function Info() {} + /** + * Return whether the specified zone contains a DST. + * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone. + * @return {boolean} + */ + Info.hasDST = function hasDST(zone) { + if (zone === void 0) { + zone = Settings.defaultZone; + } + var proto = DateTime.now().setZone(zone).set({ + month: 12 + }); + return !zone.isUniversal && proto.offset !== proto.set({ + month: 6 + }).offset; + } + + /** + * Return whether the specified zone is a valid IANA specifier. + * @param {string} zone - Zone to check + * @return {boolean} + */; + Info.isValidIANAZone = function isValidIANAZone(zone) { + return IANAZone.isValidZone(zone); + } + + /** + * Converts the input into a {@link Zone} instance. + * + * * If `input` is already a Zone instance, it is returned unchanged. + * * If `input` is a string containing a valid time zone name, a Zone instance + * with that name is returned. + * * If `input` is a string that doesn't refer to a known time zone, a Zone + * instance with {@link Zone#isValid} == false is returned. + * * If `input is a number, a Zone instance with the specified fixed offset + * in minutes is returned. + * * If `input` is `null` or `undefined`, the default zone is returned. + * @param {string|Zone|number} [input] - the value to be converted + * @return {Zone} + */; + Info.normalizeZone = function normalizeZone$1(input) { + return normalizeZone(input, Settings.defaultZone); + } + + /** + * Get the weekday on which the week starts according to the given locale. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number} the start of the week, 1 for Monday through 7 for Sunday + */; + Info.getStartOfWeek = function getStartOfWeek(_temp) { + var _ref = _temp === void 0 ? {} : _temp, + _ref$locale = _ref.locale, + locale = _ref$locale === void 0 ? null : _ref$locale, + _ref$locObj = _ref.locObj, + locObj = _ref$locObj === void 0 ? null : _ref$locObj; + return (locObj || Locale.create(locale)).getStartOfWeek(); + } + + /** + * Get the minimum number of days necessary in a week before it is considered part of the next year according + * to the given locale. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number} + */; + Info.getMinimumDaysInFirstWeek = function getMinimumDaysInFirstWeek(_temp2) { + var _ref2 = _temp2 === void 0 ? {} : _temp2, + _ref2$locale = _ref2.locale, + locale = _ref2$locale === void 0 ? null : _ref2$locale, + _ref2$locObj = _ref2.locObj, + locObj = _ref2$locObj === void 0 ? null : _ref2$locObj; + return (locObj || Locale.create(locale)).getMinDaysInFirstWeek(); + } + + /** + * Get the weekdays, which are considered the weekend according to the given locale + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number[]} an array of weekdays, 1 for Monday through 7 for Sunday + */; + Info.getWeekendWeekdays = function getWeekendWeekdays(_temp3) { + var _ref3 = _temp3 === void 0 ? {} : _temp3, + _ref3$locale = _ref3.locale, + locale = _ref3$locale === void 0 ? null : _ref3$locale, + _ref3$locObj = _ref3.locObj, + locObj = _ref3$locObj === void 0 ? null : _ref3$locObj; + // copy the array, because we cache it internally + return (locObj || Locale.create(locale)).getWeekendDays().slice(); + } + + /** + * Return an array of standalone month names. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long" + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @param {string} [opts.outputCalendar='gregory'] - the calendar + * @example Info.months()[0] //=> 'January' + * @example Info.months('short')[0] //=> 'Jan' + * @example Info.months('numeric')[0] //=> '1' + * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.' + * @example Info.months('numeric', { locale: 'ar' })[0] //=> '١' + * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I' + * @return {Array} + */; + Info.months = function months(length, _temp4) { + if (length === void 0) { + length = "long"; + } + var _ref4 = _temp4 === void 0 ? {} : _temp4, + _ref4$locale = _ref4.locale, + locale = _ref4$locale === void 0 ? null : _ref4$locale, + _ref4$numberingSystem = _ref4.numberingSystem, + numberingSystem = _ref4$numberingSystem === void 0 ? null : _ref4$numberingSystem, + _ref4$locObj = _ref4.locObj, + locObj = _ref4$locObj === void 0 ? null : _ref4$locObj, + _ref4$outputCalendar = _ref4.outputCalendar, + outputCalendar = _ref4$outputCalendar === void 0 ? "gregory" : _ref4$outputCalendar; + return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length); + } + + /** + * Return an array of format month names. + * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that + * changes the string. + * See {@link Info#months} + * @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long" + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @param {string} [opts.outputCalendar='gregory'] - the calendar + * @return {Array} + */; + Info.monthsFormat = function monthsFormat(length, _temp5) { + if (length === void 0) { + length = "long"; + } + var _ref5 = _temp5 === void 0 ? {} : _temp5, + _ref5$locale = _ref5.locale, + locale = _ref5$locale === void 0 ? null : _ref5$locale, + _ref5$numberingSystem = _ref5.numberingSystem, + numberingSystem = _ref5$numberingSystem === void 0 ? null : _ref5$numberingSystem, + _ref5$locObj = _ref5.locObj, + locObj = _ref5$locObj === void 0 ? null : _ref5$locObj, + _ref5$outputCalendar = _ref5.outputCalendar, + outputCalendar = _ref5$outputCalendar === void 0 ? "gregory" : _ref5$outputCalendar; + return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true); + } + + /** + * Return an array of standalone week names. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {string} [length='long'] - the length of the weekday representation, such as "narrow", "short", "long". + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @example Info.weekdays()[0] //=> 'Monday' + * @example Info.weekdays('short')[0] //=> 'Mon' + * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.' + * @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين' + * @return {Array} + */; + Info.weekdays = function weekdays(length, _temp6) { + if (length === void 0) { + length = "long"; + } + var _ref6 = _temp6 === void 0 ? {} : _temp6, + _ref6$locale = _ref6.locale, + locale = _ref6$locale === void 0 ? null : _ref6$locale, + _ref6$numberingSystem = _ref6.numberingSystem, + numberingSystem = _ref6$numberingSystem === void 0 ? null : _ref6$numberingSystem, + _ref6$locObj = _ref6.locObj, + locObj = _ref6$locObj === void 0 ? null : _ref6$locObj; + return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length); + } + + /** + * Return an array of format week names. + * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that + * changes the string. + * See {@link Info#weekdays} + * @param {string} [length='long'] - the length of the month representation, such as "narrow", "short", "long". + * @param {Object} opts - options + * @param {string} [opts.locale=null] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @return {Array} + */; + Info.weekdaysFormat = function weekdaysFormat(length, _temp7) { + if (length === void 0) { + length = "long"; + } + var _ref7 = _temp7 === void 0 ? {} : _temp7, + _ref7$locale = _ref7.locale, + locale = _ref7$locale === void 0 ? null : _ref7$locale, + _ref7$numberingSystem = _ref7.numberingSystem, + numberingSystem = _ref7$numberingSystem === void 0 ? null : _ref7$numberingSystem, + _ref7$locObj = _ref7.locObj, + locObj = _ref7$locObj === void 0 ? null : _ref7$locObj; + return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true); + } + + /** + * Return an array of meridiems. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @example Info.meridiems() //=> [ 'AM', 'PM' ] + * @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ] + * @return {Array} + */; + Info.meridiems = function meridiems(_temp8) { + var _ref8 = _temp8 === void 0 ? {} : _temp8, + _ref8$locale = _ref8.locale, + locale = _ref8$locale === void 0 ? null : _ref8$locale; + return Locale.create(locale).meridiems(); + } + + /** + * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian. + * @param {string} [length='short'] - the length of the era representation, such as "short" or "long". + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @example Info.eras() //=> [ 'BC', 'AD' ] + * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ] + * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ] + * @return {Array} + */; + Info.eras = function eras(length, _temp9) { + if (length === void 0) { + length = "short"; + } + var _ref9 = _temp9 === void 0 ? {} : _temp9, + _ref9$locale = _ref9.locale, + locale = _ref9$locale === void 0 ? null : _ref9$locale; + return Locale.create(locale, null, "gregory").eras(length); + } + + /** + * Return the set of available features in this environment. + * Some features of Luxon are not available in all environments. For example, on older browsers, relative time formatting support is not available. Use this function to figure out if that's the case. + * Keys: + * * `relative`: whether this environment supports relative time formatting + * * `localeWeek`: whether this environment supports different weekdays for the start of the week based on the locale + * @example Info.features() //=> { relative: false, localeWeek: true } + * @return {Object} + */; + Info.features = function features() { + return { + relative: hasRelative(), + localeWeek: hasLocaleWeekInfo() + }; + }; + return Info; + }(); + + function dayDiff(earlier, later) { + var utcDayStart = function utcDayStart(dt) { + return dt.toUTC(0, { + keepLocalTime: true + }).startOf("day").valueOf(); + }, + ms = utcDayStart(later) - utcDayStart(earlier); + return Math.floor(Duration.fromMillis(ms).as("days")); + } + function highOrderDiffs(cursor, later, units) { + var differs = [["years", function (a, b) { + return b.year - a.year; + }], ["quarters", function (a, b) { + return b.quarter - a.quarter + (b.year - a.year) * 4; + }], ["months", function (a, b) { + return b.month - a.month + (b.year - a.year) * 12; + }], ["weeks", function (a, b) { + var days = dayDiff(a, b); + return (days - days % 7) / 7; + }], ["days", dayDiff]]; + var results = {}; + var earlier = cursor; + var lowestOrder, highWater; + + /* This loop tries to diff using larger units first. + If we overshoot, we backtrack and try the next smaller unit. + "cursor" starts out at the earlier timestamp and moves closer and closer to "later" + as we use smaller and smaller units. + highWater keeps track of where we would be if we added one more of the smallest unit, + this is used later to potentially convert any difference smaller than the smallest higher order unit + into a fraction of that smallest higher order unit + */ + for (var _i = 0, _differs = differs; _i < _differs.length; _i++) { + var _differs$_i = _differs[_i], + unit = _differs$_i[0], + differ = _differs$_i[1]; + if (units.indexOf(unit) >= 0) { + lowestOrder = unit; + results[unit] = differ(cursor, later); + highWater = earlier.plus(results); + if (highWater > later) { + // we overshot the end point, backtrack cursor by 1 + results[unit]--; + cursor = earlier.plus(results); + + // if we are still overshooting now, we need to backtrack again + // this happens in certain situations when diffing times in different zones, + // because this calculation ignores time zones + if (cursor > later) { + // keep the "overshot by 1" around as highWater + highWater = cursor; + // backtrack cursor by 1 + results[unit]--; + cursor = earlier.plus(results); + } + } else { + cursor = highWater; + } + } + } + return [cursor, results, highWater, lowestOrder]; + } + function _diff (earlier, later, units, opts) { + var _highOrderDiffs = highOrderDiffs(earlier, later, units), + cursor = _highOrderDiffs[0], + results = _highOrderDiffs[1], + highWater = _highOrderDiffs[2], + lowestOrder = _highOrderDiffs[3]; + var remainingMillis = later - cursor; + var lowerOrderUnits = units.filter(function (u) { + return ["hours", "minutes", "seconds", "milliseconds"].indexOf(u) >= 0; + }); + if (lowerOrderUnits.length === 0) { + if (highWater < later) { + var _cursor$plus; + highWater = cursor.plus((_cursor$plus = {}, _cursor$plus[lowestOrder] = 1, _cursor$plus)); + } + if (highWater !== cursor) { + results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor); + } + } + var duration = Duration.fromObject(results, opts); + if (lowerOrderUnits.length > 0) { + var _Duration$fromMillis; + return (_Duration$fromMillis = Duration.fromMillis(remainingMillis, opts)).shiftTo.apply(_Duration$fromMillis, lowerOrderUnits).plus(duration); + } else { + return duration; + } + } + + var MISSING_FTP = "missing Intl.DateTimeFormat.formatToParts support"; + function intUnit(regex, post) { + if (post === void 0) { + post = function post(i) { + return i; + }; + } + return { + regex: regex, + deser: function deser(_ref) { + var s = _ref[0]; + return post(parseDigits(s)); + } + }; + } + var NBSP = String.fromCharCode(160); + var spaceOrNBSP = "[ " + NBSP + "]"; + var spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, "g"); + function fixListRegex(s) { + // make dots optional and also make them literal + // make space and non breakable space characters interchangeable + return s.replace(/\./g, "\\.?").replace(spaceOrNBSPRegExp, spaceOrNBSP); + } + function stripInsensitivities(s) { + return s.replace(/\./g, "") // ignore dots that were made optional + .replace(spaceOrNBSPRegExp, " ") // interchange space and nbsp + .toLowerCase(); + } + function oneOf(strings, startIndex) { + if (strings === null) { + return null; + } else { + return { + regex: RegExp(strings.map(fixListRegex).join("|")), + deser: function deser(_ref2) { + var s = _ref2[0]; + return strings.findIndex(function (i) { + return stripInsensitivities(s) === stripInsensitivities(i); + }) + startIndex; + } + }; + } + } + function offset(regex, groups) { + return { + regex: regex, + deser: function deser(_ref3) { + var h = _ref3[1], + m = _ref3[2]; + return signedOffset(h, m); + }, + groups: groups + }; + } + function simple(regex) { + return { + regex: regex, + deser: function deser(_ref4) { + var s = _ref4[0]; + return s; + } + }; + } + function escapeToken(value) { + return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); + } + + /** + * @param token + * @param {Locale} loc + */ + function unitForToken(token, loc) { + var one = digitRegex(loc), + two = digitRegex(loc, "{2}"), + three = digitRegex(loc, "{3}"), + four = digitRegex(loc, "{4}"), + six = digitRegex(loc, "{6}"), + oneOrTwo = digitRegex(loc, "{1,2}"), + oneToThree = digitRegex(loc, "{1,3}"), + oneToSix = digitRegex(loc, "{1,6}"), + oneToNine = digitRegex(loc, "{1,9}"), + twoToFour = digitRegex(loc, "{2,4}"), + fourToSix = digitRegex(loc, "{4,6}"), + literal = function literal(t) { + return { + regex: RegExp(escapeToken(t.val)), + deser: function deser(_ref5) { + var s = _ref5[0]; + return s; + }, + literal: true + }; + }, + unitate = function unitate(t) { + if (token.literal) { + return literal(t); + } + switch (t.val) { + // era + case "G": + return oneOf(loc.eras("short"), 0); + case "GG": + return oneOf(loc.eras("long"), 0); + // years + case "y": + return intUnit(oneToSix); + case "yy": + return intUnit(twoToFour, untruncateYear); + case "yyyy": + return intUnit(four); + case "yyyyy": + return intUnit(fourToSix); + case "yyyyyy": + return intUnit(six); + // months + case "M": + return intUnit(oneOrTwo); + case "MM": + return intUnit(two); + case "MMM": + return oneOf(loc.months("short", true), 1); + case "MMMM": + return oneOf(loc.months("long", true), 1); + case "L": + return intUnit(oneOrTwo); + case "LL": + return intUnit(two); + case "LLL": + return oneOf(loc.months("short", false), 1); + case "LLLL": + return oneOf(loc.months("long", false), 1); + // dates + case "d": + return intUnit(oneOrTwo); + case "dd": + return intUnit(two); + // ordinals + case "o": + return intUnit(oneToThree); + case "ooo": + return intUnit(three); + // time + case "HH": + return intUnit(two); + case "H": + return intUnit(oneOrTwo); + case "hh": + return intUnit(two); + case "h": + return intUnit(oneOrTwo); + case "mm": + return intUnit(two); + case "m": + return intUnit(oneOrTwo); + case "q": + return intUnit(oneOrTwo); + case "qq": + return intUnit(two); + case "s": + return intUnit(oneOrTwo); + case "ss": + return intUnit(two); + case "S": + return intUnit(oneToThree); + case "SSS": + return intUnit(three); + case "u": + return simple(oneToNine); + case "uu": + return simple(oneOrTwo); + case "uuu": + return intUnit(one); + // meridiem + case "a": + return oneOf(loc.meridiems(), 0); + // weekYear (k) + case "kkkk": + return intUnit(four); + case "kk": + return intUnit(twoToFour, untruncateYear); + // weekNumber (W) + case "W": + return intUnit(oneOrTwo); + case "WW": + return intUnit(two); + // weekdays + case "E": + case "c": + return intUnit(one); + case "EEE": + return oneOf(loc.weekdays("short", false), 1); + case "EEEE": + return oneOf(loc.weekdays("long", false), 1); + case "ccc": + return oneOf(loc.weekdays("short", true), 1); + case "cccc": + return oneOf(loc.weekdays("long", true), 1); + // offset/zone + case "Z": + case "ZZ": + return offset(new RegExp("([+-]" + oneOrTwo.source + ")(?::(" + two.source + "))?"), 2); + case "ZZZ": + return offset(new RegExp("([+-]" + oneOrTwo.source + ")(" + two.source + ")?"), 2); + // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing + // because we don't have any way to figure out what they are + case "z": + return simple(/[a-z_+-/]{1,256}?/i); + // this special-case "token" represents a place where a macro-token expanded into a white-space literal + // in this case we accept any non-newline white-space + case " ": + return simple(/[^\S\n\r]/); + default: + return literal(t); + } + }; + var unit = unitate(token) || { + invalidReason: MISSING_FTP + }; + unit.token = token; + return unit; + } + var partTypeStyleToTokenVal = { + year: { + "2-digit": "yy", + numeric: "yyyyy" + }, + month: { + numeric: "M", + "2-digit": "MM", + short: "MMM", + long: "MMMM" + }, + day: { + numeric: "d", + "2-digit": "dd" + }, + weekday: { + short: "EEE", + long: "EEEE" + }, + dayperiod: "a", + dayPeriod: "a", + hour12: { + numeric: "h", + "2-digit": "hh" + }, + hour24: { + numeric: "H", + "2-digit": "HH" + }, + minute: { + numeric: "m", + "2-digit": "mm" + }, + second: { + numeric: "s", + "2-digit": "ss" + }, + timeZoneName: { + long: "ZZZZZ", + short: "ZZZ" + } + }; + function tokenForPart(part, formatOpts, resolvedOpts) { + var type = part.type, + value = part.value; + if (type === "literal") { + var isSpace = /^\s+$/.test(value); + return { + literal: !isSpace, + val: isSpace ? " " : value + }; + } + var style = formatOpts[type]; + + // The user might have explicitly specified hour12 or hourCycle + // if so, respect their decision + // if not, refer back to the resolvedOpts, which are based on the locale + var actualType = type; + if (type === "hour") { + if (formatOpts.hour12 != null) { + actualType = formatOpts.hour12 ? "hour12" : "hour24"; + } else if (formatOpts.hourCycle != null) { + if (formatOpts.hourCycle === "h11" || formatOpts.hourCycle === "h12") { + actualType = "hour12"; + } else { + actualType = "hour24"; + } + } else { + // tokens only differentiate between 24 hours or not, + // so we do not need to check hourCycle here, which is less supported anyways + actualType = resolvedOpts.hour12 ? "hour12" : "hour24"; + } + } + var val = partTypeStyleToTokenVal[actualType]; + if (typeof val === "object") { + val = val[style]; + } + if (val) { + return { + literal: false, + val: val + }; + } + return undefined; + } + function buildRegex(units) { + var re = units.map(function (u) { + return u.regex; + }).reduce(function (f, r) { + return f + "(" + r.source + ")"; + }, ""); + return ["^" + re + "$", units]; + } + function match(input, regex, handlers) { + var matches = input.match(regex); + if (matches) { + var all = {}; + var matchIndex = 1; + for (var i in handlers) { + if (hasOwnProperty(handlers, i)) { + var h = handlers[i], + groups = h.groups ? h.groups + 1 : 1; + if (!h.literal && h.token) { + all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups)); + } + matchIndex += groups; + } + } + return [matches, all]; + } else { + return [matches, {}]; + } + } + function dateTimeFromMatches(matches) { + var toField = function toField(token) { + switch (token) { + case "S": + return "millisecond"; + case "s": + return "second"; + case "m": + return "minute"; + case "h": + case "H": + return "hour"; + case "d": + return "day"; + case "o": + return "ordinal"; + case "L": + case "M": + return "month"; + case "y": + return "year"; + case "E": + case "c": + return "weekday"; + case "W": + return "weekNumber"; + case "k": + return "weekYear"; + case "q": + return "quarter"; + default: + return null; + } + }; + var zone = null; + var specificOffset; + if (!isUndefined(matches.z)) { + zone = IANAZone.create(matches.z); + } + if (!isUndefined(matches.Z)) { + if (!zone) { + zone = new FixedOffsetZone(matches.Z); + } + specificOffset = matches.Z; + } + if (!isUndefined(matches.q)) { + matches.M = (matches.q - 1) * 3 + 1; + } + if (!isUndefined(matches.h)) { + if (matches.h < 12 && matches.a === 1) { + matches.h += 12; + } else if (matches.h === 12 && matches.a === 0) { + matches.h = 0; + } + } + if (matches.G === 0 && matches.y) { + matches.y = -matches.y; + } + if (!isUndefined(matches.u)) { + matches.S = parseMillis(matches.u); + } + var vals = Object.keys(matches).reduce(function (r, k) { + var f = toField(k); + if (f) { + r[f] = matches[k]; + } + return r; + }, {}); + return [vals, zone, specificOffset]; + } + var dummyDateTimeCache = null; + function getDummyDateTime() { + if (!dummyDateTimeCache) { + dummyDateTimeCache = DateTime.fromMillis(1555555555555); + } + return dummyDateTimeCache; + } + function maybeExpandMacroToken(token, locale) { + if (token.literal) { + return token; + } + var formatOpts = Formatter.macroTokenToFormatOpts(token.val); + var tokens = formatOptsToTokens(formatOpts, locale); + if (tokens == null || tokens.includes(undefined)) { + return token; + } + return tokens; + } + function expandMacroTokens(tokens, locale) { + var _Array$prototype; + return (_Array$prototype = Array.prototype).concat.apply(_Array$prototype, tokens.map(function (t) { + return maybeExpandMacroToken(t, locale); + })); + } + + /** + * @private + */ + + var TokenParser = /*#__PURE__*/function () { + function TokenParser(locale, format) { + this.locale = locale; + this.format = format; + this.tokens = expandMacroTokens(Formatter.parseFormat(format), locale); + this.units = this.tokens.map(function (t) { + return unitForToken(t, locale); + }); + this.disqualifyingUnit = this.units.find(function (t) { + return t.invalidReason; + }); + if (!this.disqualifyingUnit) { + var _buildRegex = buildRegex(this.units), + regexString = _buildRegex[0], + handlers = _buildRegex[1]; + this.regex = RegExp(regexString, "i"); + this.handlers = handlers; + } + } + var _proto = TokenParser.prototype; + _proto.explainFromTokens = function explainFromTokens(input) { + if (!this.isValid) { + return { + input: input, + tokens: this.tokens, + invalidReason: this.invalidReason + }; + } else { + var _match = match(input, this.regex, this.handlers), + rawMatches = _match[0], + matches = _match[1], + _ref6 = matches ? dateTimeFromMatches(matches) : [null, null, undefined], + result = _ref6[0], + zone = _ref6[1], + specificOffset = _ref6[2]; + if (hasOwnProperty(matches, "a") && hasOwnProperty(matches, "H")) { + throw new ConflictingSpecificationError("Can't include meridiem when specifying 24-hour format"); + } + return { + input: input, + tokens: this.tokens, + regex: this.regex, + rawMatches: rawMatches, + matches: matches, + result: result, + zone: zone, + specificOffset: specificOffset + }; + } + }; + _createClass(TokenParser, [{ + key: "isValid", + get: function get() { + return !this.disqualifyingUnit; + } + }, { + key: "invalidReason", + get: function get() { + return this.disqualifyingUnit ? this.disqualifyingUnit.invalidReason : null; + } + }]); + return TokenParser; + }(); + function explainFromTokens(locale, input, format) { + var parser = new TokenParser(locale, format); + return parser.explainFromTokens(input); + } + function parseFromTokens(locale, input, format) { + var _explainFromTokens = explainFromTokens(locale, input, format), + result = _explainFromTokens.result, + zone = _explainFromTokens.zone, + specificOffset = _explainFromTokens.specificOffset, + invalidReason = _explainFromTokens.invalidReason; + return [result, zone, specificOffset, invalidReason]; + } + function formatOptsToTokens(formatOpts, locale) { + if (!formatOpts) { + return null; + } + var formatter = Formatter.create(locale, formatOpts); + var df = formatter.dtFormatter(getDummyDateTime()); + var parts = df.formatToParts(); + var resolvedOpts = df.resolvedOptions(); + return parts.map(function (p) { + return tokenForPart(p, formatOpts, resolvedOpts); + }); + } + + var INVALID = "Invalid DateTime"; + var MAX_DATE = 8.64e15; + function unsupportedZone(zone) { + return new Invalid("unsupported zone", "the zone \"" + zone.name + "\" is not supported"); + } + + // we cache week data on the DT object and this intermediates the cache + /** + * @param {DateTime} dt + */ + function possiblyCachedWeekData(dt) { + if (dt.weekData === null) { + dt.weekData = gregorianToWeek(dt.c); + } + return dt.weekData; + } + + /** + * @param {DateTime} dt + */ + function possiblyCachedLocalWeekData(dt) { + if (dt.localWeekData === null) { + dt.localWeekData = gregorianToWeek(dt.c, dt.loc.getMinDaysInFirstWeek(), dt.loc.getStartOfWeek()); + } + return dt.localWeekData; + } + + // clone really means, "make a new object with these modifications". all "setters" really use this + // to create a new object while only changing some of the properties + function clone(inst, alts) { + var current = { + ts: inst.ts, + zone: inst.zone, + c: inst.c, + o: inst.o, + loc: inst.loc, + invalid: inst.invalid + }; + return new DateTime(_extends({}, current, alts, { + old: current + })); + } + + // find the right offset a given local time. The o input is our guess, which determines which + // offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST) + function fixOffset(localTS, o, tz) { + // Our UTC time is just a guess because our offset is just a guess + var utcGuess = localTS - o * 60 * 1000; + + // Test whether the zone matches the offset for this ts + var o2 = tz.offset(utcGuess); + + // If so, offset didn't change and we're done + if (o === o2) { + return [utcGuess, o]; + } + + // If not, change the ts by the difference in the offset + utcGuess -= (o2 - o) * 60 * 1000; + + // If that gives us the local time we want, we're done + var o3 = tz.offset(utcGuess); + if (o2 === o3) { + return [utcGuess, o2]; + } + + // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time + return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)]; + } + + // convert an epoch timestamp into a calendar object with the given offset + function tsToObj(ts, offset) { + ts += offset * 60 * 1000; + var d = new Date(ts); + return { + year: d.getUTCFullYear(), + month: d.getUTCMonth() + 1, + day: d.getUTCDate(), + hour: d.getUTCHours(), + minute: d.getUTCMinutes(), + second: d.getUTCSeconds(), + millisecond: d.getUTCMilliseconds() + }; + } + + // convert a calendar object to a epoch timestamp + function objToTS(obj, offset, zone) { + return fixOffset(objToLocalTS(obj), offset, zone); + } + + // create a new DT instance by adding a duration, adjusting for DSTs + function adjustTime(inst, dur) { + var oPre = inst.o, + year = inst.c.year + Math.trunc(dur.years), + month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3, + c = _extends({}, inst.c, { + year: year, + month: month, + day: Math.min(inst.c.day, daysInMonth(year, month)) + Math.trunc(dur.days) + Math.trunc(dur.weeks) * 7 + }), + millisToAdd = Duration.fromObject({ + years: dur.years - Math.trunc(dur.years), + quarters: dur.quarters - Math.trunc(dur.quarters), + months: dur.months - Math.trunc(dur.months), + weeks: dur.weeks - Math.trunc(dur.weeks), + days: dur.days - Math.trunc(dur.days), + hours: dur.hours, + minutes: dur.minutes, + seconds: dur.seconds, + milliseconds: dur.milliseconds + }).as("milliseconds"), + localTS = objToLocalTS(c); + var _fixOffset = fixOffset(localTS, oPre, inst.zone), + ts = _fixOffset[0], + o = _fixOffset[1]; + if (millisToAdd !== 0) { + ts += millisToAdd; + // that could have changed the offset by going over a DST, but we want to keep the ts the same + o = inst.zone.offset(ts); + } + return { + ts: ts, + o: o + }; + } + + // helper useful in turning the results of parsing into real dates + // by handling the zone options + function parseDataToDateTime(parsed, parsedZone, opts, format, text, specificOffset) { + var setZone = opts.setZone, + zone = opts.zone; + if (parsed && Object.keys(parsed).length !== 0 || parsedZone) { + var interpretationZone = parsedZone || zone, + inst = DateTime.fromObject(parsed, _extends({}, opts, { + zone: interpretationZone, + specificOffset: specificOffset + })); + return setZone ? inst : inst.setZone(zone); + } else { + return DateTime.invalid(new Invalid("unparsable", "the input \"" + text + "\" can't be parsed as " + format)); + } + } + + // if you want to output a technical format (e.g. RFC 2822), this helper + // helps handle the details + function toTechFormat(dt, format, allowZ) { + if (allowZ === void 0) { + allowZ = true; + } + return dt.isValid ? Formatter.create(Locale.create("en-US"), { + allowZ: allowZ, + forceSimple: true + }).formatDateTimeFromString(dt, format) : null; + } + function _toISODate(o, extended, precision) { + var longFormat = o.c.year > 9999 || o.c.year < 0; + var c = ""; + if (longFormat && o.c.year >= 0) c += "+"; + c += padStart(o.c.year, longFormat ? 6 : 4); + if (precision === "year") return c; + if (extended) { + c += "-"; + c += padStart(o.c.month); + if (precision === "month") return c; + c += "-"; + } else { + c += padStart(o.c.month); + if (precision === "month") return c; + } + c += padStart(o.c.day); + return c; + } + function _toISOTime(o, extended, suppressSeconds, suppressMilliseconds, includeOffset, extendedZone, precision) { + var showSeconds = !suppressSeconds || o.c.millisecond !== 0 || o.c.second !== 0, + c = ""; + switch (precision) { + case "day": + case "month": + case "year": + break; + default: + c += padStart(o.c.hour); + if (precision === "hour") break; + if (extended) { + c += ":"; + c += padStart(o.c.minute); + if (precision === "minute") break; + if (showSeconds) { + c += ":"; + c += padStart(o.c.second); + } + } else { + c += padStart(o.c.minute); + if (precision === "minute") break; + if (showSeconds) { + c += padStart(o.c.second); + } + } + if (precision === "second") break; + if (showSeconds && (!suppressMilliseconds || o.c.millisecond !== 0)) { + c += "."; + c += padStart(o.c.millisecond, 3); + } + } + if (includeOffset) { + if (o.isOffsetFixed && o.offset === 0 && !extendedZone) { + c += "Z"; + } else if (o.o < 0) { + c += "-"; + c += padStart(Math.trunc(-o.o / 60)); + c += ":"; + c += padStart(Math.trunc(-o.o % 60)); + } else { + c += "+"; + c += padStart(Math.trunc(o.o / 60)); + c += ":"; + c += padStart(Math.trunc(o.o % 60)); + } + } + if (extendedZone) { + c += "[" + o.zone.ianaName + "]"; + } + return c; + } + + // defaults for unspecified units in the supported calendars + var defaultUnitValues = { + month: 1, + day: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }, + defaultWeekUnitValues = { + weekNumber: 1, + weekday: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }, + defaultOrdinalUnitValues = { + ordinal: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }; + + // Units in the supported calendars, sorted by bigness + var orderedUnits = ["year", "month", "day", "hour", "minute", "second", "millisecond"], + orderedWeekUnits = ["weekYear", "weekNumber", "weekday", "hour", "minute", "second", "millisecond"], + orderedOrdinalUnits = ["year", "ordinal", "hour", "minute", "second", "millisecond"]; + + // standardize case and plurality in units + function normalizeUnit(unit) { + var normalized = { + year: "year", + years: "year", + month: "month", + months: "month", + day: "day", + days: "day", + hour: "hour", + hours: "hour", + minute: "minute", + minutes: "minute", + quarter: "quarter", + quarters: "quarter", + second: "second", + seconds: "second", + millisecond: "millisecond", + milliseconds: "millisecond", + weekday: "weekday", + weekdays: "weekday", + weeknumber: "weekNumber", + weeksnumber: "weekNumber", + weeknumbers: "weekNumber", + weekyear: "weekYear", + weekyears: "weekYear", + ordinal: "ordinal" + }[unit.toLowerCase()]; + if (!normalized) throw new InvalidUnitError(unit); + return normalized; + } + function normalizeUnitWithLocalWeeks(unit) { + switch (unit.toLowerCase()) { + case "localweekday": + case "localweekdays": + return "localWeekday"; + case "localweeknumber": + case "localweeknumbers": + return "localWeekNumber"; + case "localweekyear": + case "localweekyears": + return "localWeekYear"; + default: + return normalizeUnit(unit); + } + } + + // cache offsets for zones based on the current timestamp when this function is + // first called. When we are handling a datetime from components like (year, + // month, day, hour) in a time zone, we need a guess about what the timezone + // offset is so that we can convert into a UTC timestamp. One way is to find the + // offset of now in the zone. The actual date may have a different offset (for + // example, if we handle a date in June while we're in December in a zone that + // observes DST), but we can check and adjust that. + // + // When handling many dates, calculating the offset for now every time is + // expensive. It's just a guess, so we can cache the offset to use even if we + // are right on a time change boundary (we'll just correct in the other + // direction). Using a timestamp from first read is a slight optimization for + // handling dates close to the current date, since those dates will usually be + // in the same offset (we could set the timestamp statically, instead). We use a + // single timestamp for all zones to make things a bit more predictable. + // + // This is safe for quickDT (used by local() and utc()) because we don't fill in + // higher-order units from tsNow (as we do in fromObject, this requires that + // offset is calculated from tsNow). + /** + * @param {Zone} zone + * @return {number} + */ + function guessOffsetForZone(zone) { + if (zoneOffsetTs === undefined) { + zoneOffsetTs = Settings.now(); + } + + // Do not cache anything but IANA zones, because it is not safe to do so. + // Guessing an offset which is not present in the zone can cause wrong results from fixOffset + if (zone.type !== "iana") { + return zone.offset(zoneOffsetTs); + } + var zoneName = zone.name; + var offsetGuess = zoneOffsetGuessCache.get(zoneName); + if (offsetGuess === undefined) { + offsetGuess = zone.offset(zoneOffsetTs); + zoneOffsetGuessCache.set(zoneName, offsetGuess); + } + return offsetGuess; + } + + // this is a dumbed down version of fromObject() that runs about 60% faster + // but doesn't do any validation, makes a bunch of assumptions about what units + // are present, and so on. + function quickDT(obj, opts) { + var zone = normalizeZone(opts.zone, Settings.defaultZone); + if (!zone.isValid) { + return DateTime.invalid(unsupportedZone(zone)); + } + var loc = Locale.fromObject(opts); + var ts, o; + + // assume we have the higher-order units + if (!isUndefined(obj.year)) { + for (var _i = 0, _orderedUnits = orderedUnits; _i < _orderedUnits.length; _i++) { + var u = _orderedUnits[_i]; + if (isUndefined(obj[u])) { + obj[u] = defaultUnitValues[u]; + } + } + var invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj); + if (invalid) { + return DateTime.invalid(invalid); + } + var offsetProvis = guessOffsetForZone(zone); + var _objToTS = objToTS(obj, offsetProvis, zone); + ts = _objToTS[0]; + o = _objToTS[1]; + } else { + ts = Settings.now(); + } + return new DateTime({ + ts: ts, + zone: zone, + loc: loc, + o: o + }); + } + function diffRelative(start, end, opts) { + var round = isUndefined(opts.round) ? true : opts.round, + rounding = isUndefined(opts.rounding) ? "trunc" : opts.rounding, + format = function format(c, unit) { + c = roundTo(c, round || opts.calendary ? 0 : 2, opts.calendary ? "round" : rounding); + var formatter = end.loc.clone(opts).relFormatter(opts); + return formatter.format(c, unit); + }, + differ = function differ(unit) { + if (opts.calendary) { + if (!end.hasSame(start, unit)) { + return end.startOf(unit).diff(start.startOf(unit), unit).get(unit); + } else return 0; + } else { + return end.diff(start, unit).get(unit); + } + }; + if (opts.unit) { + return format(differ(opts.unit), opts.unit); + } + for (var _iterator = _createForOfIteratorHelperLoose(opts.units), _step; !(_step = _iterator()).done;) { + var unit = _step.value; + var count = differ(unit); + if (Math.abs(count) >= 1) { + return format(count, unit); + } + } + return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]); + } + function lastOpts(argList) { + var opts = {}, + args; + if (argList.length > 0 && typeof argList[argList.length - 1] === "object") { + opts = argList[argList.length - 1]; + args = Array.from(argList).slice(0, argList.length - 1); + } else { + args = Array.from(argList); + } + return [opts, args]; + } + + /** + * Timestamp to use for cached zone offset guesses (exposed for test) + */ + var zoneOffsetTs; + /** + * Cache for zone offset guesses (exposed for test). + * + * This optimizes quickDT via guessOffsetForZone to avoid repeated calls of + * zone.offset(). + */ + var zoneOffsetGuessCache = new Map(); + + /** + * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them. + * + * A DateTime comprises of: + * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch. + * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone). + * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`. + * + * Here is a brief overview of the most commonly used functionality it provides: + * + * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link DateTime.local}, {@link DateTime.utc}, and (most flexibly) {@link DateTime.fromObject}. To create one from a standard string format, use {@link DateTime.fromISO}, {@link DateTime.fromHTTP}, and {@link DateTime.fromRFC2822}. To create one from a custom string format, use {@link DateTime.fromFormat}. To create one from a native JS date, use {@link DateTime.fromJSDate}. + * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link DateTime#toObject}), use the {@link DateTime#year}, {@link DateTime#month}, + * {@link DateTime#day}, {@link DateTime#hour}, {@link DateTime#minute}, {@link DateTime#second}, {@link DateTime#millisecond} accessors. + * * **Week calendar**: For ISO week calendar attributes, see the {@link DateTime#weekYear}, {@link DateTime#weekNumber}, and {@link DateTime#weekday} accessors. + * * **Configuration** See the {@link DateTime#locale} and {@link DateTime#numberingSystem} accessors. + * * **Transformation**: To transform the DateTime into other DateTimes, use {@link DateTime#set}, {@link DateTime#reconfigure}, {@link DateTime#setZone}, {@link DateTime#setLocale}, {@link DateTime.plus}, {@link DateTime#minus}, {@link DateTime#endOf}, {@link DateTime#startOf}, {@link DateTime#toUTC}, and {@link DateTime#toLocal}. + * * **Output**: To convert the DateTime to other representations, use the {@link DateTime#toRelative}, {@link DateTime#toRelativeCalendar}, {@link DateTime#toJSON}, {@link DateTime#toISO}, {@link DateTime#toHTTP}, {@link DateTime#toObject}, {@link DateTime#toRFC2822}, {@link DateTime#toString}, {@link DateTime#toLocaleString}, {@link DateTime#toFormat}, {@link DateTime#toMillis} and {@link DateTime#toJSDate}. + * + * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation. + */ + var DateTime = /*#__PURE__*/function (_Symbol$for) { + /** + * @access private + */ + function DateTime(config) { + var zone = config.zone || Settings.defaultZone; + var invalid = config.invalid || (Number.isNaN(config.ts) ? new Invalid("invalid input") : null) || (!zone.isValid ? unsupportedZone(zone) : null); + /** + * @access private + */ + this.ts = isUndefined(config.ts) ? Settings.now() : config.ts; + var c = null, + o = null; + if (!invalid) { + var unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone); + if (unchanged) { + var _ref = [config.old.c, config.old.o]; + c = _ref[0]; + o = _ref[1]; + } else { + // If an offset has been passed and we have not been called from + // clone(), we can trust it and avoid the offset calculation. + var ot = isNumber(config.o) && !config.old ? config.o : zone.offset(this.ts); + c = tsToObj(this.ts, ot); + invalid = Number.isNaN(c.year) ? new Invalid("invalid input") : null; + c = invalid ? null : c; + o = invalid ? null : ot; + } + } + + /** + * @access private + */ + this._zone = zone; + /** + * @access private + */ + this.loc = config.loc || Locale.create(); + /** + * @access private + */ + this.invalid = invalid; + /** + * @access private + */ + this.weekData = null; + /** + * @access private + */ + this.localWeekData = null; + /** + * @access private + */ + this.c = c; + /** + * @access private + */ + this.o = o; + /** + * @access private + */ + this.isLuxonDateTime = true; + } + + // CONSTRUCT + + /** + * Create a DateTime for the current instant, in the system's time zone. + * + * Use Settings to override these default values if needed. + * @example DateTime.now().toISO() //~> now in the ISO format + * @return {DateTime} + */ + DateTime.now = function now() { + return new DateTime({}); + } + + /** + * Create a local DateTime + * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used + * @param {number} [month=1] - The month, 1-indexed + * @param {number} [day=1] - The day of the month, 1-indexed + * @param {number} [hour=0] - The hour of the day, in 24-hour time + * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59 + * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59 + * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999 + * @example DateTime.local() //~> now + * @example DateTime.local({ zone: "America/New_York" }) //~> now, in US east coast time + * @example DateTime.local(2017) //~> 2017-01-01T00:00:00 + * @example DateTime.local(2017, 3) //~> 2017-03-01T00:00:00 + * @example DateTime.local(2017, 3, 12, { locale: "fr" }) //~> 2017-03-12T00:00:00, with a French locale + * @example DateTime.local(2017, 3, 12, 5) //~> 2017-03-12T05:00:00 + * @example DateTime.local(2017, 3, 12, 5, { zone: "utc" }) //~> 2017-03-12T05:00:00, in UTC + * @example DateTime.local(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00 + * @example DateTime.local(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10 + * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765 + * @return {DateTime} + */; + DateTime.local = function local() { + var _lastOpts = lastOpts(arguments), + opts = _lastOpts[0], + args = _lastOpts[1], + year = args[0], + month = args[1], + day = args[2], + hour = args[3], + minute = args[4], + second = args[5], + millisecond = args[6]; + return quickDT({ + year: year, + month: month, + day: day, + hour: hour, + minute: minute, + second: second, + millisecond: millisecond + }, opts); + } + + /** + * Create a DateTime in UTC + * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used + * @param {number} [month=1] - The month, 1-indexed + * @param {number} [day=1] - The day of the month + * @param {number} [hour=0] - The hour of the day, in 24-hour time + * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59 + * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59 + * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999 + * @param {Object} options - configuration options for the DateTime + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} [options.outputCalendar] - the output calendar to set on the resulting DateTime instance + * @param {string} [options.numberingSystem] - the numbering system to set on the resulting DateTime instance + * @param {string} [options.weekSettings] - the week settings to set on the resulting DateTime instance + * @example DateTime.utc() //~> now + * @example DateTime.utc(2017) //~> 2017-01-01T00:00:00Z + * @example DateTime.utc(2017, 3) //~> 2017-03-01T00:00:00Z + * @example DateTime.utc(2017, 3, 12) //~> 2017-03-12T00:00:00Z + * @example DateTime.utc(2017, 3, 12, 5) //~> 2017-03-12T05:00:00Z + * @example DateTime.utc(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00Z + * @example DateTime.utc(2017, 3, 12, 5, 45, { locale: "fr" }) //~> 2017-03-12T05:45:00Z with a French locale + * @example DateTime.utc(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10Z + * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765, { locale: "fr" }) //~> 2017-03-12T05:45:10.765Z with a French locale + * @return {DateTime} + */; + DateTime.utc = function utc() { + var _lastOpts2 = lastOpts(arguments), + opts = _lastOpts2[0], + args = _lastOpts2[1], + year = args[0], + month = args[1], + day = args[2], + hour = args[3], + minute = args[4], + second = args[5], + millisecond = args[6]; + opts.zone = FixedOffsetZone.utcInstance; + return quickDT({ + year: year, + month: month, + day: day, + hour: hour, + minute: minute, + second: second, + millisecond: millisecond + }, opts); + } + + /** + * Create a DateTime from a JavaScript Date object. Uses the default zone. + * @param {Date} date - a JavaScript Date object + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @return {DateTime} + */; + DateTime.fromJSDate = function fromJSDate(date, options) { + if (options === void 0) { + options = {}; + } + var ts = isDate(date) ? date.valueOf() : NaN; + if (Number.isNaN(ts)) { + return DateTime.invalid("invalid input"); + } + var zoneToUse = normalizeZone(options.zone, Settings.defaultZone); + if (!zoneToUse.isValid) { + return DateTime.invalid(unsupportedZone(zoneToUse)); + } + return new DateTime({ + ts: ts, + zone: zoneToUse, + loc: Locale.fromObject(options) + }); + } + + /** + * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone. + * @param {number} milliseconds - a number of milliseconds since 1970 UTC + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance + * @return {DateTime} + */; + DateTime.fromMillis = function fromMillis(milliseconds, options) { + if (options === void 0) { + options = {}; + } + if (!isNumber(milliseconds)) { + throw new InvalidArgumentError("fromMillis requires a numerical input, but received a " + typeof milliseconds + " with value " + milliseconds); + } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) { + // this isn't perfect because we can still end up out of range because of additional shifting, but it's a start + return DateTime.invalid("Timestamp out of range"); + } else { + return new DateTime({ + ts: milliseconds, + zone: normalizeZone(options.zone, Settings.defaultZone), + loc: Locale.fromObject(options) + }); + } + } + + /** + * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone. + * @param {number} seconds - a number of seconds since 1970 UTC + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance + * @return {DateTime} + */; + DateTime.fromSeconds = function fromSeconds(seconds, options) { + if (options === void 0) { + options = {}; + } + if (!isNumber(seconds)) { + throw new InvalidArgumentError("fromSeconds requires a numerical input"); + } else { + return new DateTime({ + ts: seconds * 1000, + zone: normalizeZone(options.zone, Settings.defaultZone), + loc: Locale.fromObject(options) + }); + } + } + + /** + * Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults. + * @param {Object} obj - the object to create the DateTime from + * @param {number} obj.year - a year, such as 1987 + * @param {number} obj.month - a month, 1-12 + * @param {number} obj.day - a day of the month, 1-31, depending on the month + * @param {number} obj.ordinal - day of the year, 1-365 or 366 + * @param {number} obj.weekYear - an ISO week year + * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year + * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday + * @param {number} obj.localWeekYear - a week year, according to the locale + * @param {number} obj.localWeekNumber - a week number, between 1 and 52 or 53, depending on the year, according to the locale + * @param {number} obj.localWeekday - a weekday, 1-7, where 1 is the first and 7 is the last day of the week, according to the locale + * @param {number} obj.hour - hour of the day, 0-23 + * @param {number} obj.minute - minute of the hour, 0-59 + * @param {number} obj.second - second of the minute, 0-59 + * @param {number} obj.millisecond - millisecond of the second, 0-999 + * @param {Object} opts - options for creating this DateTime + * @param {string|Zone} [opts.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone() + * @param {string} [opts.locale='system\'s locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25' + * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01' + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06 + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'utc' }), + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'local' }) + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'America/New_York' }) + * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13' + * @example DateTime.fromObject({ localWeekYear: 2022, localWeekNumber: 1, localWeekday: 1 }, { locale: "en-US" }).toISODate() //=> '2021-12-26' + * @return {DateTime} + */; + DateTime.fromObject = function fromObject(obj, opts) { + if (opts === void 0) { + opts = {}; + } + obj = obj || {}; + var zoneToUse = normalizeZone(opts.zone, Settings.defaultZone); + if (!zoneToUse.isValid) { + return DateTime.invalid(unsupportedZone(zoneToUse)); + } + var loc = Locale.fromObject(opts); + var normalized = normalizeObject(obj, normalizeUnitWithLocalWeeks); + var _usesLocalWeekValues = usesLocalWeekValues(normalized, loc), + minDaysInFirstWeek = _usesLocalWeekValues.minDaysInFirstWeek, + startOfWeek = _usesLocalWeekValues.startOfWeek; + var tsNow = Settings.now(), + offsetProvis = !isUndefined(opts.specificOffset) ? opts.specificOffset : zoneToUse.offset(tsNow), + containsOrdinal = !isUndefined(normalized.ordinal), + containsGregorYear = !isUndefined(normalized.year), + containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), + containsGregor = containsGregorYear || containsGregorMD, + definiteWeekDef = normalized.weekYear || normalized.weekNumber; + + // cases: + // just a weekday -> this week's instance of that weekday, no worries + // (gregorian data or ordinal) + (weekYear or weekNumber) -> error + // (gregorian month or day) + ordinal -> error + // otherwise just use weeks or ordinals or gregorian, depending on what's specified + + if ((containsGregor || containsOrdinal) && definiteWeekDef) { + throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals"); + } + if (containsGregorMD && containsOrdinal) { + throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); + } + var useWeekData = definiteWeekDef || normalized.weekday && !containsGregor; + + // configure ourselves to deal with gregorian dates or week stuff + var units, + defaultValues, + objNow = tsToObj(tsNow, offsetProvis); + if (useWeekData) { + units = orderedWeekUnits; + defaultValues = defaultWeekUnitValues; + objNow = gregorianToWeek(objNow, minDaysInFirstWeek, startOfWeek); + } else if (containsOrdinal) { + units = orderedOrdinalUnits; + defaultValues = defaultOrdinalUnitValues; + objNow = gregorianToOrdinal(objNow); + } else { + units = orderedUnits; + defaultValues = defaultUnitValues; + } + + // set default values for missing stuff + var foundFirst = false; + for (var _iterator2 = _createForOfIteratorHelperLoose(units), _step2; !(_step2 = _iterator2()).done;) { + var u = _step2.value; + var v = normalized[u]; + if (!isUndefined(v)) { + foundFirst = true; + } else if (foundFirst) { + normalized[u] = defaultValues[u]; + } else { + normalized[u] = objNow[u]; + } + } + + // make sure the values we have are in range + var higherOrderInvalid = useWeekData ? hasInvalidWeekData(normalized, minDaysInFirstWeek, startOfWeek) : containsOrdinal ? hasInvalidOrdinalData(normalized) : hasInvalidGregorianData(normalized), + invalid = higherOrderInvalid || hasInvalidTimeData(normalized); + if (invalid) { + return DateTime.invalid(invalid); + } + + // compute the actual time + var gregorian = useWeekData ? weekToGregorian(normalized, minDaysInFirstWeek, startOfWeek) : containsOrdinal ? ordinalToGregorian(normalized) : normalized, + _objToTS2 = objToTS(gregorian, offsetProvis, zoneToUse), + tsFinal = _objToTS2[0], + offsetFinal = _objToTS2[1], + inst = new DateTime({ + ts: tsFinal, + zone: zoneToUse, + o: offsetFinal, + loc: loc + }); + + // gregorian data + weekday serves only to validate + if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) { + return DateTime.invalid("mismatched weekday", "you can't specify both a weekday of " + normalized.weekday + " and a date of " + inst.toISO()); + } + if (!inst.isValid) { + return DateTime.invalid(inst.invalid); + } + return inst; + } + + /** + * Create a DateTime from an ISO 8601 string + * @param {string} text - the ISO string + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance + * @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance + * @param {string} [opts.weekSettings] - the week settings to set on the resulting DateTime instance + * @example DateTime.fromISO('2016-05-25T09:08:34.123') + * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00') + * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true}) + * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'}) + * @example DateTime.fromISO('2016-W05-4') + * @return {DateTime} + */; + DateTime.fromISO = function fromISO(text, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseISODate = parseISODate(text), + vals = _parseISODate[0], + parsedZone = _parseISODate[1]; + return parseDataToDateTime(vals, parsedZone, opts, "ISO 8601", text); + } + + /** + * Create a DateTime from an RFC 2822 string + * @param {string} text - the RFC 2822 string + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in. + * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT') + * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600') + * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z') + * @return {DateTime} + */; + DateTime.fromRFC2822 = function fromRFC2822(text, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseRFC2822Date = parseRFC2822Date(text), + vals = _parseRFC2822Date[0], + parsedZone = _parseRFC2822Date[1]; + return parseDataToDateTime(vals, parsedZone, opts, "RFC 2822", text); + } + + /** + * Create a DateTime from an HTTP header date + * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 + * @param {string} text - the HTTP header date + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in. + * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods. + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT') + * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT') + * @example DateTime.fromHTTP('Sun Nov 6 08:49:37 1994') + * @return {DateTime} + */; + DateTime.fromHTTP = function fromHTTP(text, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseHTTPDate = parseHTTPDate(text), + vals = _parseHTTPDate[0], + parsedZone = _parseHTTPDate[1]; + return parseDataToDateTime(vals, parsedZone, opts, "HTTP", opts); + } + + /** + * Create a DateTime from an input string and format string. + * Defaults to en-US if no locale has been specified, regardless of the system's locale. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/parsing?id=table-of-tokens). + * @param {string} text - the string to parse + * @param {string} fmt - the format the string is expected to be in (see the link below for the formats) + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale + * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @return {DateTime} + */; + DateTime.fromFormat = function fromFormat(text, fmt, opts) { + if (opts === void 0) { + opts = {}; + } + if (isUndefined(text) || isUndefined(fmt)) { + throw new InvalidArgumentError("fromFormat requires an input string and a format"); + } + var _opts = opts, + _opts$locale = _opts.locale, + locale = _opts$locale === void 0 ? null : _opts$locale, + _opts$numberingSystem = _opts.numberingSystem, + numberingSystem = _opts$numberingSystem === void 0 ? null : _opts$numberingSystem, + localeToUse = Locale.fromOpts({ + locale: locale, + numberingSystem: numberingSystem, + defaultToEN: true + }), + _parseFromTokens = parseFromTokens(localeToUse, text, fmt), + vals = _parseFromTokens[0], + parsedZone = _parseFromTokens[1], + specificOffset = _parseFromTokens[2], + invalid = _parseFromTokens[3]; + if (invalid) { + return DateTime.invalid(invalid); + } else { + return parseDataToDateTime(vals, parsedZone, opts, "format " + fmt, text, specificOffset); + } + } + + /** + * @deprecated use fromFormat instead + */; + DateTime.fromString = function fromString(text, fmt, opts) { + if (opts === void 0) { + opts = {}; + } + return DateTime.fromFormat(text, fmt, opts); + } + + /** + * Create a DateTime from a SQL date, time, or datetime + * Defaults to en-US if no locale has been specified, regardless of the system's locale + * @param {string} text - the string to parse + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale + * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @example DateTime.fromSQL('2017-05-15') + * @example DateTime.fromSQL('2017-05-15 09:12:34') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true }) + * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' }) + * @example DateTime.fromSQL('09:12:34.342') + * @return {DateTime} + */; + DateTime.fromSQL = function fromSQL(text, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseSQL = parseSQL(text), + vals = _parseSQL[0], + parsedZone = _parseSQL[1]; + return parseDataToDateTime(vals, parsedZone, opts, "SQL", text); + } + + /** + * Create an invalid DateTime. + * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent. + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {DateTime} + */; + DateTime.invalid = function invalid(reason, explanation) { + if (explanation === void 0) { + explanation = null; + } + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the DateTime is invalid"); + } + var invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidDateTimeError(invalid); + } else { + return new DateTime({ + invalid: invalid + }); + } + } + + /** + * Check if an object is an instance of DateTime. Works across context boundaries + * @param {object} o + * @return {boolean} + */; + DateTime.isDateTime = function isDateTime(o) { + return o && o.isLuxonDateTime || false; + } + + /** + * Produce the format string for a set of options + * @param formatOpts + * @param localeOpts + * @returns {string} + */; + DateTime.parseFormatForOpts = function parseFormatForOpts(formatOpts, localeOpts) { + if (localeOpts === void 0) { + localeOpts = {}; + } + var tokenList = formatOptsToTokens(formatOpts, Locale.fromObject(localeOpts)); + return !tokenList ? null : tokenList.map(function (t) { + return t ? t.val : null; + }).join(""); + } + + /** + * Produce the the fully expanded format token for the locale + * Does NOT quote characters, so quoted tokens will not round trip correctly + * @param fmt + * @param localeOpts + * @returns {string} + */; + DateTime.expandFormat = function expandFormat(fmt, localeOpts) { + if (localeOpts === void 0) { + localeOpts = {}; + } + var expanded = expandMacroTokens(Formatter.parseFormat(fmt), Locale.fromObject(localeOpts)); + return expanded.map(function (t) { + return t.val; + }).join(""); + }; + DateTime.resetCache = function resetCache() { + zoneOffsetTs = undefined; + zoneOffsetGuessCache.clear(); + } + + // INFO + + /** + * Get the value of unit. + * @param {string} unit - a unit such as 'minute' or 'day' + * @example DateTime.local(2017, 7, 4).get('month'); //=> 7 + * @example DateTime.local(2017, 7, 4).get('day'); //=> 4 + * @return {number} + */; + var _proto = DateTime.prototype; + _proto.get = function get(unit) { + return this[unit]; + } + + /** + * Returns whether the DateTime is valid. Invalid DateTimes occur when: + * * The DateTime was created from invalid calendar information, such as the 13th month or February 30 + * * The DateTime was created by an operation on another invalid date + * @type {boolean} + */; + /** + * Get those DateTimes which have the same local time as this DateTime, but a different offset from UTC + * in this DateTime's zone. During DST changes local time can be ambiguous, for example + * `2023-10-29T02:30:00` in `Europe/Berlin` can have offset `+01:00` or `+02:00`. + * This method will return both possible DateTimes if this DateTime's local time is ambiguous. + * @returns {DateTime[]} + */ + _proto.getPossibleOffsets = function getPossibleOffsets() { + if (!this.isValid || this.isOffsetFixed) { + return [this]; + } + var dayMs = 86400000; + var minuteMs = 60000; + var localTS = objToLocalTS(this.c); + var oEarlier = this.zone.offset(localTS - dayMs); + var oLater = this.zone.offset(localTS + dayMs); + var o1 = this.zone.offset(localTS - oEarlier * minuteMs); + var o2 = this.zone.offset(localTS - oLater * minuteMs); + if (o1 === o2) { + return [this]; + } + var ts1 = localTS - o1 * minuteMs; + var ts2 = localTS - o2 * minuteMs; + var c1 = tsToObj(ts1, o1); + var c2 = tsToObj(ts2, o2); + if (c1.hour === c2.hour && c1.minute === c2.minute && c1.second === c2.second && c1.millisecond === c2.millisecond) { + return [clone(this, { + ts: ts1 + }), clone(this, { + ts: ts2 + })]; + } + return [this]; + } + + /** + * Returns true if this DateTime is in a leap year, false otherwise + * @example DateTime.local(2016).isInLeapYear //=> true + * @example DateTime.local(2013).isInLeapYear //=> false + * @type {boolean} + */; + /** + * Returns the resolved Intl options for this DateTime. + * This is useful in understanding the behavior of formatting methods + * @param {Object} opts - the same options as toLocaleString + * @return {Object} + */ + _proto.resolvedLocaleOptions = function resolvedLocaleOptions(opts) { + if (opts === void 0) { + opts = {}; + } + var _Formatter$create$res = Formatter.create(this.loc.clone(opts), opts).resolvedOptions(this), + locale = _Formatter$create$res.locale, + numberingSystem = _Formatter$create$res.numberingSystem, + calendar = _Formatter$create$res.calendar; + return { + locale: locale, + numberingSystem: numberingSystem, + outputCalendar: calendar + }; + } + + // TRANSFORM + + /** + * "Set" the DateTime's zone to UTC. Returns a newly-constructed DateTime. + * + * Equivalent to {@link DateTime#setZone}('utc') + * @param {number} [offset=0] - optionally, an offset from UTC in minutes + * @param {Object} [opts={}] - options to pass to `setZone()` + * @return {DateTime} + */; + _proto.toUTC = function toUTC(offset, opts) { + if (offset === void 0) { + offset = 0; + } + if (opts === void 0) { + opts = {}; + } + return this.setZone(FixedOffsetZone.instance(offset), opts); + } + + /** + * "Set" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime. + * + * Equivalent to `setZone('local')` + * @return {DateTime} + */; + _proto.toLocal = function toLocal() { + return this.setZone(Settings.defaultZone); + } + + /** + * "Set" the DateTime's zone to specified zone. Returns a newly-constructed DateTime. + * + * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link DateTime#plus}. You may wish to use {@link DateTime#toLocal} and {@link DateTime#toUTC} which provide simple convenience wrappers for commonly used zones. + * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link DateTime#Zone} class. + * @param {Object} opts - options + * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this. + * @return {DateTime} + */; + _proto.setZone = function setZone(zone, _temp) { + var _ref2 = _temp === void 0 ? {} : _temp, + _ref2$keepLocalTime = _ref2.keepLocalTime, + keepLocalTime = _ref2$keepLocalTime === void 0 ? false : _ref2$keepLocalTime, + _ref2$keepCalendarTim = _ref2.keepCalendarTime, + keepCalendarTime = _ref2$keepCalendarTim === void 0 ? false : _ref2$keepCalendarTim; + zone = normalizeZone(zone, Settings.defaultZone); + if (zone.equals(this.zone)) { + return this; + } else if (!zone.isValid) { + return DateTime.invalid(unsupportedZone(zone)); + } else { + var newTS = this.ts; + if (keepLocalTime || keepCalendarTime) { + var offsetGuess = zone.offset(this.ts); + var asObj = this.toObject(); + var _objToTS3 = objToTS(asObj, offsetGuess, zone); + newTS = _objToTS3[0]; + } + return clone(this, { + ts: newTS, + zone: zone + }); + } + } + + /** + * "Set" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime. + * @param {Object} properties - the properties to set + * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' }) + * @return {DateTime} + */; + _proto.reconfigure = function reconfigure(_temp2) { + var _ref3 = _temp2 === void 0 ? {} : _temp2, + locale = _ref3.locale, + numberingSystem = _ref3.numberingSystem, + outputCalendar = _ref3.outputCalendar; + var loc = this.loc.clone({ + locale: locale, + numberingSystem: numberingSystem, + outputCalendar: outputCalendar + }); + return clone(this, { + loc: loc + }); + } + + /** + * "Set" the locale. Returns a newly-constructed DateTime. + * Just a convenient alias for reconfigure({ locale }) + * @example DateTime.local(2017, 5, 25).setLocale('en-GB') + * @return {DateTime} + */; + _proto.setLocale = function setLocale(locale) { + return this.reconfigure({ + locale: locale + }); + } + + /** + * "Set" the values of specified units. Returns a newly-constructed DateTime. + * You can only set units with this method; for "setting" metadata, see {@link DateTime#reconfigure} and {@link DateTime#setZone}. + * + * This method also supports setting locale-based week units, i.e. `localWeekday`, `localWeekNumber` and `localWeekYear`. + * They cannot be mixed with ISO-week units like `weekday`. + * @param {Object} values - a mapping of units to numbers + * @example dt.set({ year: 2017 }) + * @example dt.set({ hour: 8, minute: 30 }) + * @example dt.set({ weekday: 5 }) + * @example dt.set({ year: 2005, ordinal: 234 }) + * @return {DateTime} + */; + _proto.set = function set(values) { + if (!this.isValid) return this; + var normalized = normalizeObject(values, normalizeUnitWithLocalWeeks); + var _usesLocalWeekValues2 = usesLocalWeekValues(normalized, this.loc), + minDaysInFirstWeek = _usesLocalWeekValues2.minDaysInFirstWeek, + startOfWeek = _usesLocalWeekValues2.startOfWeek; + var settingWeekStuff = !isUndefined(normalized.weekYear) || !isUndefined(normalized.weekNumber) || !isUndefined(normalized.weekday), + containsOrdinal = !isUndefined(normalized.ordinal), + containsGregorYear = !isUndefined(normalized.year), + containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), + containsGregor = containsGregorYear || containsGregorMD, + definiteWeekDef = normalized.weekYear || normalized.weekNumber; + if ((containsGregor || containsOrdinal) && definiteWeekDef) { + throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals"); + } + if (containsGregorMD && containsOrdinal) { + throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); + } + var mixed; + if (settingWeekStuff) { + mixed = weekToGregorian(_extends({}, gregorianToWeek(this.c, minDaysInFirstWeek, startOfWeek), normalized), minDaysInFirstWeek, startOfWeek); + } else if (!isUndefined(normalized.ordinal)) { + mixed = ordinalToGregorian(_extends({}, gregorianToOrdinal(this.c), normalized)); + } else { + mixed = _extends({}, this.toObject(), normalized); + + // if we didn't set the day but we ended up on an overflow date, + // use the last day of the right month + if (isUndefined(normalized.day)) { + mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day); + } + } + var _objToTS4 = objToTS(mixed, this.o, this.zone), + ts = _objToTS4[0], + o = _objToTS4[1]; + return clone(this, { + ts: ts, + o: o + }); + } + + /** + * Add a period of time to this DateTime and return the resulting DateTime + * + * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between. + * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @example DateTime.now().plus(123) //~> in 123 milliseconds + * @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes + * @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow + * @example DateTime.now().plus({ days: -1 }) //~> this time yesterday + * @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min + * @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min + * @return {DateTime} + */; + _proto.plus = function plus(duration) { + if (!this.isValid) return this; + var dur = Duration.fromDurationLike(duration); + return clone(this, adjustTime(this, dur)); + } + + /** + * Subtract a period of time to this DateTime and return the resulting DateTime + * See {@link DateTime#plus} + * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + @return {DateTime} + */; + _proto.minus = function minus(duration) { + if (!this.isValid) return this; + var dur = Duration.fromDurationLike(duration).negate(); + return clone(this, adjustTime(this, dur)); + } + + /** + * "Set" this DateTime to the beginning of a unit of time. + * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week + * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01' + * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01' + * @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays + * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00' + * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00' + * @return {DateTime} + */; + _proto.startOf = function startOf(unit, _temp3) { + var _ref4 = _temp3 === void 0 ? {} : _temp3, + _ref4$useLocaleWeeks = _ref4.useLocaleWeeks, + useLocaleWeeks = _ref4$useLocaleWeeks === void 0 ? false : _ref4$useLocaleWeeks; + if (!this.isValid) return this; + var o = {}, + normalizedUnit = Duration.normalizeUnit(unit); + switch (normalizedUnit) { + case "years": + o.month = 1; + // falls through + case "quarters": + case "months": + o.day = 1; + // falls through + case "weeks": + case "days": + o.hour = 0; + // falls through + case "hours": + o.minute = 0; + // falls through + case "minutes": + o.second = 0; + // falls through + case "seconds": + o.millisecond = 0; + break; + // no default, invalid units throw in normalizeUnit() + } + + if (normalizedUnit === "weeks") { + if (useLocaleWeeks) { + var startOfWeek = this.loc.getStartOfWeek(); + var weekday = this.weekday; + if (weekday < startOfWeek) { + o.weekNumber = this.weekNumber - 1; + } + o.weekday = startOfWeek; + } else { + o.weekday = 1; + } + } + if (normalizedUnit === "quarters") { + var q = Math.ceil(this.month / 3); + o.month = (q - 1) * 3 + 1; + } + return this.set(o); + } + + /** + * "Set" this DateTime to the end (meaning the last millisecond) of a unit of time + * @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week + * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays + * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00' + * @return {DateTime} + */; + _proto.endOf = function endOf(unit, opts) { + var _this$plus; + return this.isValid ? this.plus((_this$plus = {}, _this$plus[unit] = 1, _this$plus)).startOf(unit, opts).minus(1) : this; + } + + // OUTPUT + + /** + * Returns a string representation of this DateTime formatted according to the specified format string. + * **You may not want this.** See {@link DateTime#toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/formatting?id=table-of-tokens). + * Defaults to en-US if no locale has been specified, regardless of the system's locale. + * @param {string} fmt - the format string + * @param {Object} opts - opts to override the configuration options on this DateTime + * @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22' + * @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22' + * @example DateTime.now().toFormat('yyyy LLL dd', { locale: "fr" }) //=> '2017 avr. 22' + * @example DateTime.now().toFormat("HH 'hours and' mm 'minutes'") //=> '20 hours and 55 minutes' + * @return {string} + */; + _proto.toFormat = function toFormat(fmt, opts) { + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt) : INVALID; + } + + /** + * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`. + * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation + * of the DateTime in the assigned locale. + * Defaults to the system's locale if no locale has been specified + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param formatOpts {Object} - Intl.DateTimeFormat constructor options and configuration options + * @param {Object} opts - opts to override the configuration options on this DateTime + * @example DateTime.now().toLocaleString(); //=> 4/20/2017 + * @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017' + * @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017' + * @example DateTime.now().toLocaleString(DateTime.DATE_FULL, { locale: 'fr' }); //=> '28 août 2022' + * @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM' + * @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM' + * @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20' + * @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM' + * @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }); //=> '11:32' + * @return {string} + */; + _proto.toLocaleString = function toLocaleString(formatOpts, opts) { + if (formatOpts === void 0) { + formatOpts = DATE_SHORT; + } + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this) : INVALID; + } + + /** + * Returns an array of format "parts", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output. + * Defaults to the system's locale if no locale has been specified + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts + * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`. + * @example DateTime.now().toLocaleParts(); //=> [ + * //=> { type: 'day', value: '25' }, + * //=> { type: 'literal', value: '/' }, + * //=> { type: 'month', value: '05' }, + * //=> { type: 'literal', value: '/' }, + * //=> { type: 'year', value: '1982' } + * //=> ] + */; + _proto.toLocaleParts = function toLocaleParts(opts) { + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this) : []; + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.extendedZone=false] - add the time zone format extension + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'years', 'months', 'days', 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0. + * @example DateTime.utc(1983, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z' + * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00' + * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335' + * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400' + * @example DateTime.now().toISO({ precision: 'day' }) //=> '2017-04-22Z' + * @example DateTime.now().toISO({ precision: 'minute' }) //=> '2017-04-22T20:47Z' + * @return {string|null} + */; + _proto.toISO = function toISO(_temp4) { + var _ref5 = _temp4 === void 0 ? {} : _temp4, + _ref5$format = _ref5.format, + format = _ref5$format === void 0 ? "extended" : _ref5$format, + _ref5$suppressSeconds = _ref5.suppressSeconds, + suppressSeconds = _ref5$suppressSeconds === void 0 ? false : _ref5$suppressSeconds, + _ref5$suppressMillise = _ref5.suppressMilliseconds, + suppressMilliseconds = _ref5$suppressMillise === void 0 ? false : _ref5$suppressMillise, + _ref5$includeOffset = _ref5.includeOffset, + includeOffset = _ref5$includeOffset === void 0 ? true : _ref5$includeOffset, + _ref5$extendedZone = _ref5.extendedZone, + extendedZone = _ref5$extendedZone === void 0 ? false : _ref5$extendedZone, + _ref5$precision = _ref5.precision, + precision = _ref5$precision === void 0 ? "milliseconds" : _ref5$precision; + if (!this.isValid) { + return null; + } + precision = normalizeUnit(precision); + var ext = format === "extended"; + var c = _toISODate(this, ext, precision); + if (orderedUnits.indexOf(precision) >= 3) c += "T"; + c += _toISOTime(this, ext, suppressSeconds, suppressMilliseconds, includeOffset, extendedZone, precision); + return c; + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's date component + * @param {Object} opts - options + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='day'] - truncate output to desired precision: 'years', 'months', or 'days'. + * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25' + * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525' + * @example DateTime.utc(1982, 5, 25).toISODate({ precision: 'month' }) //=> '1982-05' + * @return {string|null} + */; + _proto.toISODate = function toISODate(_temp5) { + var _ref6 = _temp5 === void 0 ? {} : _temp5, + _ref6$format = _ref6.format, + format = _ref6$format === void 0 ? "extended" : _ref6$format, + _ref6$precision = _ref6.precision, + precision = _ref6$precision === void 0 ? "day" : _ref6$precision; + if (!this.isValid) { + return null; + } + return _toISODate(this, format === "extended", normalizeUnit(precision)); + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's week date + * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2' + * @return {string} + */; + _proto.toISOWeekDate = function toISOWeekDate() { + return toTechFormat(this, "kkkk-'W'WW-c"); + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's time component + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.extendedZone=true] - add the time zone format extension + * @param {boolean} [opts.includePrefix=false] - include the `T` prefix + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0. + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z' + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34, second: 56 }).toISOTime({ precision: 'minute' }) //=> '07:34Z' + * @return {string} + */; + _proto.toISOTime = function toISOTime(_temp6) { + var _ref7 = _temp6 === void 0 ? {} : _temp6, + _ref7$suppressMillise = _ref7.suppressMilliseconds, + suppressMilliseconds = _ref7$suppressMillise === void 0 ? false : _ref7$suppressMillise, + _ref7$suppressSeconds = _ref7.suppressSeconds, + suppressSeconds = _ref7$suppressSeconds === void 0 ? false : _ref7$suppressSeconds, + _ref7$includeOffset = _ref7.includeOffset, + includeOffset = _ref7$includeOffset === void 0 ? true : _ref7$includeOffset, + _ref7$includePrefix = _ref7.includePrefix, + includePrefix = _ref7$includePrefix === void 0 ? false : _ref7$includePrefix, + _ref7$extendedZone = _ref7.extendedZone, + extendedZone = _ref7$extendedZone === void 0 ? false : _ref7$extendedZone, + _ref7$format = _ref7.format, + format = _ref7$format === void 0 ? "extended" : _ref7$format, + _ref7$precision = _ref7.precision, + precision = _ref7$precision === void 0 ? "milliseconds" : _ref7$precision; + if (!this.isValid) { + return null; + } + precision = normalizeUnit(precision); + var c = includePrefix && orderedUnits.indexOf(precision) >= 3 ? "T" : ""; + return c + _toISOTime(this, format === "extended", suppressSeconds, suppressMilliseconds, includeOffset, extendedZone, precision); + } + + /** + * Returns an RFC 2822-compatible string representation of this DateTime + * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000' + * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400' + * @return {string} + */; + _proto.toRFC2822 = function toRFC2822() { + return toTechFormat(this, "EEE, dd LLL yyyy HH:mm:ss ZZZ", false); + } + + /** + * Returns a string representation of this DateTime appropriate for use in HTTP headers. The output is always expressed in GMT. + * Specifically, the string conforms to RFC 1123. + * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 + * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT' + * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT' + * @return {string} + */; + _proto.toHTTP = function toHTTP() { + return toTechFormat(this.toUTC(), "EEE, dd LLL yyyy HH:mm:ss 'GMT'"); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL Date + * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13' + * @return {string|null} + */; + _proto.toSQLDate = function toSQLDate() { + if (!this.isValid) { + return null; + } + return _toISODate(this, true); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL Time + * @param {Object} opts - options + * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset. + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00' + * @example DateTime.utc().toSQL() //=> '05:15:16.345' + * @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00' + * @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345' + * @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York' + * @return {string} + */; + _proto.toSQLTime = function toSQLTime(_temp7) { + var _ref8 = _temp7 === void 0 ? {} : _temp7, + _ref8$includeOffset = _ref8.includeOffset, + includeOffset = _ref8$includeOffset === void 0 ? true : _ref8$includeOffset, + _ref8$includeZone = _ref8.includeZone, + includeZone = _ref8$includeZone === void 0 ? false : _ref8$includeZone, + _ref8$includeOffsetSp = _ref8.includeOffsetSpace, + includeOffsetSpace = _ref8$includeOffsetSp === void 0 ? true : _ref8$includeOffsetSp; + var fmt = "HH:mm:ss.SSS"; + if (includeZone || includeOffset) { + if (includeOffsetSpace) { + fmt += " "; + } + if (includeZone) { + fmt += "z"; + } else if (includeOffset) { + fmt += "ZZ"; + } + } + return toTechFormat(this, fmt, true); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL DateTime + * @param {Object} opts - options + * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset. + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00' + * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z' + * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00' + * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000' + * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York' + * @return {string} + */; + _proto.toSQL = function toSQL(opts) { + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) { + return null; + } + return this.toSQLDate() + " " + this.toSQLTime(opts); + } + + /** + * Returns a string representation of this DateTime appropriate for debugging + * @return {string} + */; + _proto.toString = function toString() { + return this.isValid ? this.toISO() : INVALID; + } + + /** + * Returns a string representation of this DateTime appropriate for the REPL. + * @return {string} + */; + _proto[_Symbol$for] = function () { + if (this.isValid) { + return "DateTime { ts: " + this.toISO() + ", zone: " + this.zone.name + ", locale: " + this.locale + " }"; + } else { + return "DateTime { Invalid, reason: " + this.invalidReason + " }"; + } + } + + /** + * Returns the epoch milliseconds of this DateTime. Alias of {@link DateTime#toMillis} + * @return {number} + */; + _proto.valueOf = function valueOf() { + return this.toMillis(); + } + + /** + * Returns the epoch milliseconds of this DateTime. + * @return {number} + */; + _proto.toMillis = function toMillis() { + return this.isValid ? this.ts : NaN; + } + + /** + * Returns the epoch seconds (including milliseconds in the fractional part) of this DateTime. + * @return {number} + */; + _proto.toSeconds = function toSeconds() { + return this.isValid ? this.ts / 1000 : NaN; + } + + /** + * Returns the epoch seconds (as a whole number) of this DateTime. + * @return {number} + */; + _proto.toUnixInteger = function toUnixInteger() { + return this.isValid ? Math.floor(this.ts / 1000) : NaN; + } + + /** + * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON. + * @return {string} + */; + _proto.toJSON = function toJSON() { + return this.toISO(); + } + + /** + * Returns a BSON serializable equivalent to this DateTime. + * @return {Date} + */; + _proto.toBSON = function toBSON() { + return this.toJSDate(); + } + + /** + * Returns a JavaScript object with this DateTime's year, month, day, and so on. + * @param opts - options for generating the object + * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output + * @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 } + * @return {Object} + */; + _proto.toObject = function toObject(opts) { + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) return {}; + var base = _extends({}, this.c); + if (opts.includeConfig) { + base.outputCalendar = this.outputCalendar; + base.numberingSystem = this.loc.numberingSystem; + base.locale = this.loc.locale; + } + return base; + } + + /** + * Returns a JavaScript Date equivalent to this DateTime. + * @return {Date} + */; + _proto.toJSDate = function toJSDate() { + return new Date(this.isValid ? this.ts : NaN); + } + + // COMPARE + + /** + * Return the difference between two DateTimes as a Duration. + * @param {DateTime} otherDateTime - the DateTime to compare this one to + * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration. + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @example + * var i1 = DateTime.fromISO('1982-05-25T09:45'), + * i2 = DateTime.fromISO('1983-10-14T10:30'); + * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 } + * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 } + * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 } + * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 } + * @return {Duration} + */; + _proto.diff = function diff(otherDateTime, unit, opts) { + if (unit === void 0) { + unit = "milliseconds"; + } + if (opts === void 0) { + opts = {}; + } + if (!this.isValid || !otherDateTime.isValid) { + return Duration.invalid("created by diffing an invalid DateTime"); + } + var durOpts = _extends({ + locale: this.locale, + numberingSystem: this.numberingSystem + }, opts); + var units = maybeArray(unit).map(Duration.normalizeUnit), + otherIsLater = otherDateTime.valueOf() > this.valueOf(), + earlier = otherIsLater ? this : otherDateTime, + later = otherIsLater ? otherDateTime : this, + diffed = _diff(earlier, later, units, durOpts); + return otherIsLater ? diffed.negate() : diffed; + } + + /** + * Return the difference between this DateTime and right now. + * See {@link DateTime#diff} + * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @return {Duration} + */; + _proto.diffNow = function diffNow(unit, opts) { + if (unit === void 0) { + unit = "milliseconds"; + } + if (opts === void 0) { + opts = {}; + } + return this.diff(DateTime.now(), unit, opts); + } + + /** + * Return an Interval spanning between this DateTime and another DateTime + * @param {DateTime} otherDateTime - the other end point of the Interval + * @return {Interval|DateTime} + */; + _proto.until = function until(otherDateTime) { + return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this; + } + + /** + * Return whether this DateTime is in the same unit of time as another DateTime. + * Higher-order units must also be identical for this function to return `true`. + * Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link DateTime#setZone} to convert one of the dates if needed. + * @param {DateTime} otherDateTime - the other DateTime + * @param {string} unit - the unit of time to check sameness on + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; only the locale of this DateTime is used + * @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day + * @return {boolean} + */; + _proto.hasSame = function hasSame(otherDateTime, unit, opts) { + if (!this.isValid) return false; + var inputMs = otherDateTime.valueOf(); + var adjustedToZone = this.setZone(otherDateTime.zone, { + keepLocalTime: true + }); + return adjustedToZone.startOf(unit, opts) <= inputMs && inputMs <= adjustedToZone.endOf(unit, opts); + } + + /** + * Equality check + * Two DateTimes are equal if and only if they represent the same millisecond, have the same zone and location, and are both valid. + * To compare just the millisecond values, use `+dt1 === +dt2`. + * @param {DateTime} other - the other DateTime + * @return {boolean} + */; + _proto.equals = function equals(other) { + return this.isValid && other.isValid && this.valueOf() === other.valueOf() && this.zone.equals(other.zone) && this.loc.equals(other.loc); + } + + /** + * Returns a string representation of a this time relative to now, such as "in two days". Can only internationalize if your + * platform supports Intl.RelativeTimeFormat. Rounds towards zero by default. + * @param {Object} options - options that affect the output + * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now. + * @param {string} [options.style="long"] - the style of units, must be "long", "short", or "narrow" + * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of "years", "quarters", "months", "weeks", "days", "hours", "minutes", or "seconds" + * @param {boolean} [options.round=true] - whether to round the numbers in the output. + * @param {string} [options.rounding="trunc"] - rounding method to use when rounding the numbers in the output. Can be "trunc" (toward zero), "expand" (away from zero), "round", "floor", or "ceil". + * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding. + * @param {string} options.locale - override the locale of this DateTime + * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this + * @example DateTime.now().plus({ days: 1 }).toRelative() //=> "in 1 day" + * @example DateTime.now().setLocale("es").toRelative({ days: 1 }) //=> "dentro de 1 día" + * @example DateTime.now().plus({ days: 1 }).toRelative({ locale: "fr" }) //=> "dans 23 heures" + * @example DateTime.now().minus({ days: 2 }).toRelative() //=> "2 days ago" + * @example DateTime.now().minus({ days: 2 }).toRelative({ unit: "hours" }) //=> "48 hours ago" + * @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> "1.5 days ago" + */; + _proto.toRelative = function toRelative(options) { + if (options === void 0) { + options = {}; + } + if (!this.isValid) return null; + var base = options.base || DateTime.fromObject({}, { + zone: this.zone + }), + padding = options.padding ? this < base ? -options.padding : options.padding : 0; + var units = ["years", "months", "days", "hours", "minutes", "seconds"]; + var unit = options.unit; + if (Array.isArray(options.unit)) { + units = options.unit; + unit = undefined; + } + return diffRelative(base, this.plus(padding), _extends({}, options, { + numeric: "always", + units: units, + unit: unit + })); + } + + /** + * Returns a string representation of this date relative to today, such as "yesterday" or "next month". + * Only internationalizes on platforms that supports Intl.RelativeTimeFormat. + * @param {Object} options - options that affect the output + * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now. + * @param {string} options.locale - override the locale of this DateTime + * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of "years", "quarters", "months", "weeks", or "days" + * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this + * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> "tomorrow" + * @example DateTime.now().setLocale("es").plus({ days: 1 }).toRelative() //=> ""mañana" + * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: "fr" }) //=> "demain" + * @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> "2 days ago" + */; + _proto.toRelativeCalendar = function toRelativeCalendar(options) { + if (options === void 0) { + options = {}; + } + if (!this.isValid) return null; + return diffRelative(options.base || DateTime.fromObject({}, { + zone: this.zone + }), this, _extends({}, options, { + numeric: "auto", + units: ["years", "months", "days"], + calendary: true + })); + } + + /** + * Return the min of several date times + * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum + * @return {DateTime} the min DateTime, or undefined if called with no argument + */; + DateTime.min = function min() { + for (var _len = arguments.length, dateTimes = new Array(_len), _key = 0; _key < _len; _key++) { + dateTimes[_key] = arguments[_key]; + } + if (!dateTimes.every(DateTime.isDateTime)) { + throw new InvalidArgumentError("min requires all arguments be DateTimes"); + } + return bestBy(dateTimes, function (i) { + return i.valueOf(); + }, Math.min); + } + + /** + * Return the max of several date times + * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum + * @return {DateTime} the max DateTime, or undefined if called with no argument + */; + DateTime.max = function max() { + for (var _len2 = arguments.length, dateTimes = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + dateTimes[_key2] = arguments[_key2]; + } + if (!dateTimes.every(DateTime.isDateTime)) { + throw new InvalidArgumentError("max requires all arguments be DateTimes"); + } + return bestBy(dateTimes, function (i) { + return i.valueOf(); + }, Math.max); + } + + // MISC + + /** + * Explain how a string would be parsed by fromFormat() + * @param {string} text - the string to parse + * @param {string} fmt - the format the string is expected to be in (see description) + * @param {Object} options - options taken by fromFormat() + * @return {Object} + */; + DateTime.fromFormatExplain = function fromFormatExplain(text, fmt, options) { + if (options === void 0) { + options = {}; + } + var _options = options, + _options$locale = _options.locale, + locale = _options$locale === void 0 ? null : _options$locale, + _options$numberingSys = _options.numberingSystem, + numberingSystem = _options$numberingSys === void 0 ? null : _options$numberingSys, + localeToUse = Locale.fromOpts({ + locale: locale, + numberingSystem: numberingSystem, + defaultToEN: true + }); + return explainFromTokens(localeToUse, text, fmt); + } + + /** + * @deprecated use fromFormatExplain instead + */; + DateTime.fromStringExplain = function fromStringExplain(text, fmt, options) { + if (options === void 0) { + options = {}; + } + return DateTime.fromFormatExplain(text, fmt, options); + } + + /** + * Build a parser for `fmt` using the given locale. This parser can be passed + * to {@link DateTime.fromFormatParser} to a parse a date in this format. This + * can be used to optimize cases where many dates need to be parsed in a + * specific format. + * + * @param {String} fmt - the format the string is expected to be in (see + * description) + * @param {Object} options - options used to set locale and numberingSystem + * for parser + * @returns {TokenParser} - opaque object to be used + */; + DateTime.buildFormatParser = function buildFormatParser(fmt, options) { + if (options === void 0) { + options = {}; + } + var _options2 = options, + _options2$locale = _options2.locale, + locale = _options2$locale === void 0 ? null : _options2$locale, + _options2$numberingSy = _options2.numberingSystem, + numberingSystem = _options2$numberingSy === void 0 ? null : _options2$numberingSy, + localeToUse = Locale.fromOpts({ + locale: locale, + numberingSystem: numberingSystem, + defaultToEN: true + }); + return new TokenParser(localeToUse, fmt); + } + + /** + * Create a DateTime from an input string and format parser. + * + * The format parser must have been created with the same locale as this call. + * + * @param {String} text - the string to parse + * @param {TokenParser} formatParser - parser from {@link DateTime.buildFormatParser} + * @param {Object} opts - options taken by fromFormat() + * @returns {DateTime} + */; + DateTime.fromFormatParser = function fromFormatParser(text, formatParser, opts) { + if (opts === void 0) { + opts = {}; + } + if (isUndefined(text) || isUndefined(formatParser)) { + throw new InvalidArgumentError("fromFormatParser requires an input string and a format parser"); + } + var _opts2 = opts, + _opts2$locale = _opts2.locale, + locale = _opts2$locale === void 0 ? null : _opts2$locale, + _opts2$numberingSyste = _opts2.numberingSystem, + numberingSystem = _opts2$numberingSyste === void 0 ? null : _opts2$numberingSyste, + localeToUse = Locale.fromOpts({ + locale: locale, + numberingSystem: numberingSystem, + defaultToEN: true + }); + if (!localeToUse.equals(formatParser.locale)) { + throw new InvalidArgumentError("fromFormatParser called with a locale of " + localeToUse + ", " + ("but the format parser was created for " + formatParser.locale)); + } + var _formatParser$explain = formatParser.explainFromTokens(text), + result = _formatParser$explain.result, + zone = _formatParser$explain.zone, + specificOffset = _formatParser$explain.specificOffset, + invalidReason = _formatParser$explain.invalidReason; + if (invalidReason) { + return DateTime.invalid(invalidReason); + } else { + return parseDataToDateTime(result, zone, opts, "format " + formatParser.format, text, specificOffset); + } + } + + // FORMAT PRESETS + + /** + * {@link DateTime#toLocaleString} format like 10/14/1983 + * @type {Object} + */; + _createClass(DateTime, [{ + key: "isValid", + get: function get() { + return this.invalid === null; + } + + /** + * Returns an error code if this DateTime is invalid, or null if the DateTime is valid + * @type {string} + */ + }, { + key: "invalidReason", + get: function get() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid + * @type {string} + */ + }, { + key: "invalidExplanation", + get: function get() { + return this.invalid ? this.invalid.explanation : null; + } + + /** + * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime + * + * @type {string} + */ + }, { + key: "locale", + get: function get() { + return this.isValid ? this.loc.locale : null; + } + + /** + * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime + * + * @type {string} + */ + }, { + key: "numberingSystem", + get: function get() { + return this.isValid ? this.loc.numberingSystem : null; + } + + /** + * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime + * + * @type {string} + */ + }, { + key: "outputCalendar", + get: function get() { + return this.isValid ? this.loc.outputCalendar : null; + } + + /** + * Get the time zone associated with this DateTime. + * @type {Zone} + */ + }, { + key: "zone", + get: function get() { + return this._zone; + } + + /** + * Get the name of the time zone. + * @type {string} + */ + }, { + key: "zoneName", + get: function get() { + return this.isValid ? this.zone.name : null; + } + + /** + * Get the year + * @example DateTime.local(2017, 5, 25).year //=> 2017 + * @type {number} + */ + }, { + key: "year", + get: function get() { + return this.isValid ? this.c.year : NaN; + } + + /** + * Get the quarter + * @example DateTime.local(2017, 5, 25).quarter //=> 2 + * @type {number} + */ + }, { + key: "quarter", + get: function get() { + return this.isValid ? Math.ceil(this.c.month / 3) : NaN; + } + + /** + * Get the month (1-12). + * @example DateTime.local(2017, 5, 25).month //=> 5 + * @type {number} + */ + }, { + key: "month", + get: function get() { + return this.isValid ? this.c.month : NaN; + } + + /** + * Get the day of the month (1-30ish). + * @example DateTime.local(2017, 5, 25).day //=> 25 + * @type {number} + */ + }, { + key: "day", + get: function get() { + return this.isValid ? this.c.day : NaN; + } + + /** + * Get the hour of the day (0-23). + * @example DateTime.local(2017, 5, 25, 9).hour //=> 9 + * @type {number} + */ + }, { + key: "hour", + get: function get() { + return this.isValid ? this.c.hour : NaN; + } + + /** + * Get the minute of the hour (0-59). + * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30 + * @type {number} + */ + }, { + key: "minute", + get: function get() { + return this.isValid ? this.c.minute : NaN; + } + + /** + * Get the second of the minute (0-59). + * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52 + * @type {number} + */ + }, { + key: "second", + get: function get() { + return this.isValid ? this.c.second : NaN; + } + + /** + * Get the millisecond of the second (0-999). + * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654 + * @type {number} + */ + }, { + key: "millisecond", + get: function get() { + return this.isValid ? this.c.millisecond : NaN; + } + + /** + * Get the week year + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2014, 12, 31).weekYear //=> 2015 + * @type {number} + */ + }, { + key: "weekYear", + get: function get() { + return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN; + } + + /** + * Get the week number of the week year (1-52ish). + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2017, 5, 25).weekNumber //=> 21 + * @type {number} + */ + }, { + key: "weekNumber", + get: function get() { + return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN; + } + + /** + * Get the day of the week. + * 1 is Monday and 7 is Sunday + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2014, 11, 31).weekday //=> 4 + * @type {number} + */ + }, { + key: "weekday", + get: function get() { + return this.isValid ? possiblyCachedWeekData(this).weekday : NaN; + } + + /** + * Returns true if this date is on a weekend according to the locale, false otherwise + * @returns {boolean} + */ + }, { + key: "isWeekend", + get: function get() { + return this.isValid && this.loc.getWeekendDays().includes(this.weekday); + } + + /** + * Get the day of the week according to the locale. + * 1 is the first day of the week and 7 is the last day of the week. + * If the locale assigns Sunday as the first day of the week, then a date which is a Sunday will return 1, + * @returns {number} + */ + }, { + key: "localWeekday", + get: function get() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekday : NaN; + } + + /** + * Get the week number of the week year according to the locale. Different locales assign week numbers differently, + * because the week can start on different days of the week (see localWeekday) and because a different number of days + * is required for a week to count as the first week of a year. + * @returns {number} + */ + }, { + key: "localWeekNumber", + get: function get() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekNumber : NaN; + } + + /** + * Get the week year according to the locale. Different locales assign week numbers (and therefor week years) + * differently, see localWeekNumber. + * @returns {number} + */ + }, { + key: "localWeekYear", + get: function get() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekYear : NaN; + } + + /** + * Get the ordinal (meaning the day of the year) + * @example DateTime.local(2017, 5, 25).ordinal //=> 145 + * @type {number|DateTime} + */ + }, { + key: "ordinal", + get: function get() { + return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN; + } + + /** + * Get the human readable short month name, such as 'Oct'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).monthShort //=> Oct + * @type {string} + */ + }, { + key: "monthShort", + get: function get() { + return this.isValid ? Info.months("short", { + locObj: this.loc + })[this.month - 1] : null; + } + + /** + * Get the human readable long month name, such as 'October'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).monthLong //=> October + * @type {string} + */ + }, { + key: "monthLong", + get: function get() { + return this.isValid ? Info.months("long", { + locObj: this.loc + })[this.month - 1] : null; + } + + /** + * Get the human readable short weekday, such as 'Mon'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon + * @type {string} + */ + }, { + key: "weekdayShort", + get: function get() { + return this.isValid ? Info.weekdays("short", { + locObj: this.loc + })[this.weekday - 1] : null; + } + + /** + * Get the human readable long weekday, such as 'Monday'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday + * @type {string} + */ + }, { + key: "weekdayLong", + get: function get() { + return this.isValid ? Info.weekdays("long", { + locObj: this.loc + })[this.weekday - 1] : null; + } + + /** + * Get the UTC offset of this DateTime in minutes + * @example DateTime.now().offset //=> -240 + * @example DateTime.utc().offset //=> 0 + * @type {number} + */ + }, { + key: "offset", + get: function get() { + return this.isValid ? +this.o : NaN; + } + + /** + * Get the short human name for the zone's current offset, for example "EST" or "EDT". + * Defaults to the system's locale if no locale has been specified + * @type {string} + */ + }, { + key: "offsetNameShort", + get: function get() { + if (this.isValid) { + return this.zone.offsetName(this.ts, { + format: "short", + locale: this.locale + }); + } else { + return null; + } + } + + /** + * Get the long human name for the zone's current offset, for example "Eastern Standard Time" or "Eastern Daylight Time". + * Defaults to the system's locale if no locale has been specified + * @type {string} + */ + }, { + key: "offsetNameLong", + get: function get() { + if (this.isValid) { + return this.zone.offsetName(this.ts, { + format: "long", + locale: this.locale + }); + } else { + return null; + } + } + + /** + * Get whether this zone's offset ever changes, as in a DST. + * @type {boolean} + */ + }, { + key: "isOffsetFixed", + get: function get() { + return this.isValid ? this.zone.isUniversal : null; + } + + /** + * Get whether the DateTime is in a DST. + * @type {boolean} + */ + }, { + key: "isInDST", + get: function get() { + if (this.isOffsetFixed) { + return false; + } else { + return this.offset > this.set({ + month: 1, + day: 1 + }).offset || this.offset > this.set({ + month: 5 + }).offset; + } + } + }, { + key: "isInLeapYear", + get: function get() { + return isLeapYear(this.year); + } + + /** + * Returns the number of days in this DateTime's month + * @example DateTime.local(2016, 2).daysInMonth //=> 29 + * @example DateTime.local(2016, 3).daysInMonth //=> 31 + * @type {number} + */ + }, { + key: "daysInMonth", + get: function get() { + return daysInMonth(this.year, this.month); + } + + /** + * Returns the number of days in this DateTime's year + * @example DateTime.local(2016).daysInYear //=> 366 + * @example DateTime.local(2013).daysInYear //=> 365 + * @type {number} + */ + }, { + key: "daysInYear", + get: function get() { + return this.isValid ? daysInYear(this.year) : NaN; + } + + /** + * Returns the number of weeks in this DateTime's year + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2004).weeksInWeekYear //=> 53 + * @example DateTime.local(2013).weeksInWeekYear //=> 52 + * @type {number} + */ + }, { + key: "weeksInWeekYear", + get: function get() { + return this.isValid ? weeksInWeekYear(this.weekYear) : NaN; + } + + /** + * Returns the number of weeks in this DateTime's local week year + * @example DateTime.local(2020, 6, {locale: 'en-US'}).weeksInLocalWeekYear //=> 52 + * @example DateTime.local(2020, 6, {locale: 'de-DE'}).weeksInLocalWeekYear //=> 53 + * @type {number} + */ + }, { + key: "weeksInLocalWeekYear", + get: function get() { + return this.isValid ? weeksInWeekYear(this.localWeekYear, this.loc.getMinDaysInFirstWeek(), this.loc.getStartOfWeek()) : NaN; + } + }], [{ + key: "DATE_SHORT", + get: function get() { + return DATE_SHORT; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983' + * @type {Object} + */ + }, { + key: "DATE_MED", + get: function get() { + return DATE_MED; + } + + /** + * {@link DateTime#toLocaleString} format like 'Fri, Oct 14, 1983' + * @type {Object} + */ + }, { + key: "DATE_MED_WITH_WEEKDAY", + get: function get() { + return DATE_MED_WITH_WEEKDAY; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983' + * @type {Object} + */ + }, { + key: "DATE_FULL", + get: function get() { + return DATE_FULL; + } + + /** + * {@link DateTime#toLocaleString} format like 'Tuesday, October 14, 1983' + * @type {Object} + */ + }, { + key: "DATE_HUGE", + get: function get() { + return DATE_HUGE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "TIME_SIMPLE", + get: function get() { + return TIME_SIMPLE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "TIME_WITH_SECONDS", + get: function get() { + return TIME_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "TIME_WITH_SHORT_OFFSET", + get: function get() { + return TIME_WITH_SHORT_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "TIME_WITH_LONG_OFFSET", + get: function get() { + return TIME_WITH_LONG_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30', always 24-hour. + * @type {Object} + */ + }, { + key: "TIME_24_SIMPLE", + get: function get() { + return TIME_24_SIMPLE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23', always 24-hour. + * @type {Object} + */ + }, { + key: "TIME_24_WITH_SECONDS", + get: function get() { + return TIME_24_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 EDT', always 24-hour. + * @type {Object} + */ + }, { + key: "TIME_24_WITH_SHORT_OFFSET", + get: function get() { + return TIME_24_WITH_SHORT_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour. + * @type {Object} + */ + }, { + key: "TIME_24_WITH_LONG_OFFSET", + get: function get() { + return TIME_24_WITH_LONG_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_SHORT", + get: function get() { + return DATETIME_SHORT; + } + + /** + * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_SHORT_WITH_SECONDS", + get: function get() { + return DATETIME_SHORT_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_MED", + get: function get() { + return DATETIME_MED; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_MED_WITH_SECONDS", + get: function get() { + return DATETIME_MED_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_MED_WITH_WEEKDAY", + get: function get() { + return DATETIME_MED_WITH_WEEKDAY; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_FULL", + get: function get() { + return DATETIME_FULL; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_FULL_WITH_SECONDS", + get: function get() { + return DATETIME_FULL_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_HUGE", + get: function get() { + return DATETIME_HUGE; + } + + /** + * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_HUGE_WITH_SECONDS", + get: function get() { + return DATETIME_HUGE_WITH_SECONDS; + } + }]); + return DateTime; + }(Symbol.for("nodejs.util.inspect.custom")); + function friendlyDateTime(dateTimeish) { + if (DateTime.isDateTime(dateTimeish)) { + return dateTimeish; + } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) { + return DateTime.fromJSDate(dateTimeish); + } else if (dateTimeish && typeof dateTimeish === "object") { + return DateTime.fromObject(dateTimeish); + } else { + throw new InvalidArgumentError("Unknown datetime argument: " + dateTimeish + ", of type " + typeof dateTimeish); + } + } + + var VERSION = "3.7.2"; + + exports.DateTime = DateTime; + exports.Duration = Duration; + exports.FixedOffsetZone = FixedOffsetZone; + exports.IANAZone = IANAZone; + exports.Info = Info; + exports.Interval = Interval; + exports.InvalidZone = InvalidZone; + exports.Settings = Settings; + exports.SystemZone = SystemZone; + exports.VERSION = VERSION; + exports.Zone = Zone; + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); +//# sourceMappingURL=luxon.js.map diff --git a/node_modules/luxon/build/amd/luxon.js.map b/node_modules/luxon/build/amd/luxon.js.map new file mode 100644 index 00000000..30cf2260 --- /dev/null +++ b/node_modules/luxon/build/amd/luxon.js.map @@ -0,0 +1 @@ +{"version":3,"file":"luxon.js","sources":["../../src/errors.js","../../src/impl/formats.js","../../src/zone.js","../../src/zones/systemZone.js","../../src/zones/IANAZone.js","../../src/impl/locale.js","../../src/zones/fixedOffsetZone.js","../../src/zones/invalidZone.js","../../src/impl/zoneUtil.js","../../src/impl/digits.js","../../src/settings.js","../../src/impl/invalid.js","../../src/impl/conversions.js","../../src/impl/util.js","../../src/impl/english.js","../../src/impl/formatter.js","../../src/impl/regexParser.js","../../src/duration.js","../../src/interval.js","../../src/info.js","../../src/impl/diff.js","../../src/impl/tokenParser.js","../../src/datetime.js","../../src/luxon.js"],"sourcesContent":["// these aren't really private, but nor are they really useful to document\n\n/**\n * @private\n */\nclass LuxonError extends Error {}\n\n/**\n * @private\n */\nexport class InvalidDateTimeError extends LuxonError {\n constructor(reason) {\n super(`Invalid DateTime: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidIntervalError extends LuxonError {\n constructor(reason) {\n super(`Invalid Interval: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidDurationError extends LuxonError {\n constructor(reason) {\n super(`Invalid Duration: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class ConflictingSpecificationError extends LuxonError {}\n\n/**\n * @private\n */\nexport class InvalidUnitError extends LuxonError {\n constructor(unit) {\n super(`Invalid unit ${unit}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidArgumentError extends LuxonError {}\n\n/**\n * @private\n */\nexport class ZoneIsAbstractError extends LuxonError {\n constructor() {\n super(\"Zone is an abstract class\");\n }\n}\n","/**\n * @private\n */\n\nconst n = \"numeric\",\n s = \"short\",\n l = \"long\";\n\nexport const DATE_SHORT = {\n year: n,\n month: n,\n day: n,\n};\n\nexport const DATE_MED = {\n year: n,\n month: s,\n day: n,\n};\n\nexport const DATE_MED_WITH_WEEKDAY = {\n year: n,\n month: s,\n day: n,\n weekday: s,\n};\n\nexport const DATE_FULL = {\n year: n,\n month: l,\n day: n,\n};\n\nexport const DATE_HUGE = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n};\n\nexport const TIME_SIMPLE = {\n hour: n,\n minute: n,\n};\n\nexport const TIME_WITH_SECONDS = {\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const TIME_WITH_SHORT_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n timeZoneName: s,\n};\n\nexport const TIME_WITH_LONG_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n timeZoneName: l,\n};\n\nexport const TIME_24_SIMPLE = {\n hour: n,\n minute: n,\n hourCycle: \"h23\",\n};\n\nexport const TIME_24_WITH_SECONDS = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n};\n\nexport const TIME_24_WITH_SHORT_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n timeZoneName: s,\n};\n\nexport const TIME_24_WITH_LONG_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n timeZoneName: l,\n};\n\nexport const DATETIME_SHORT = {\n year: n,\n month: n,\n day: n,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_SHORT_WITH_SECONDS = {\n year: n,\n month: n,\n day: n,\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const DATETIME_MED = {\n year: n,\n month: s,\n day: n,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_MED_WITH_SECONDS = {\n year: n,\n month: s,\n day: n,\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const DATETIME_MED_WITH_WEEKDAY = {\n year: n,\n month: s,\n day: n,\n weekday: s,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_FULL = {\n year: n,\n month: l,\n day: n,\n hour: n,\n minute: n,\n timeZoneName: s,\n};\n\nexport const DATETIME_FULL_WITH_SECONDS = {\n year: n,\n month: l,\n day: n,\n hour: n,\n minute: n,\n second: n,\n timeZoneName: s,\n};\n\nexport const DATETIME_HUGE = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n hour: n,\n minute: n,\n timeZoneName: l,\n};\n\nexport const DATETIME_HUGE_WITH_SECONDS = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n hour: n,\n minute: n,\n second: n,\n timeZoneName: l,\n};\n","import { ZoneIsAbstractError } from \"./errors.js\";\n\n/**\n * @interface\n */\nexport default class Zone {\n /**\n * The type of zone\n * @abstract\n * @type {string}\n */\n get type() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * The name of this zone.\n * @abstract\n * @type {string}\n */\n get name() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * The IANA name of this zone.\n * Defaults to `name` if not overwritten by a subclass.\n * @abstract\n * @type {string}\n */\n get ianaName() {\n return this.name;\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year.\n * @abstract\n * @type {boolean}\n */\n get isUniversal() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Returns the offset's common name (such as EST) at the specified timestamp\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to get the name\n * @param {Object} opts - Options to affect the format\n * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.\n * @param {string} opts.locale - What locale to return the offset name in.\n * @return {string}\n */\n offsetName(ts, opts) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Returns the offset's value as a string\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to compute the offset\n * @return {number}\n */\n offset(ts) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return whether this Zone is equal to another zone\n * @abstract\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return whether this Zone is valid.\n * @abstract\n * @type {boolean}\n */\n get isValid() {\n throw new ZoneIsAbstractError();\n }\n}\n","import { formatOffset, parseZoneInfo } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet singleton = null;\n\n/**\n * Represents the local zone for this JavaScript environment.\n * @implements {Zone}\n */\nexport default class SystemZone extends Zone {\n /**\n * Get a singleton instance of the local zone\n * @return {SystemZone}\n */\n static get instance() {\n if (singleton === null) {\n singleton = new SystemZone();\n }\n return singleton;\n }\n\n /** @override **/\n get type() {\n return \"system\";\n }\n\n /** @override **/\n get name() {\n return new Intl.DateTimeFormat().resolvedOptions().timeZone;\n }\n\n /** @override **/\n get isUniversal() {\n return false;\n }\n\n /** @override **/\n offsetName(ts, { format, locale }) {\n return parseZoneInfo(ts, format, locale);\n }\n\n /** @override **/\n formatOffset(ts, format) {\n return formatOffset(this.offset(ts), format);\n }\n\n /** @override **/\n offset(ts) {\n return -new Date(ts).getTimezoneOffset();\n }\n\n /** @override **/\n equals(otherZone) {\n return otherZone.type === \"system\";\n }\n\n /** @override **/\n get isValid() {\n return true;\n }\n}\n","import { formatOffset, parseZoneInfo, isUndefined, objToLocalTS } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nconst dtfCache = new Map();\nfunction makeDTF(zoneName) {\n let dtf = dtfCache.get(zoneName);\n if (dtf === undefined) {\n dtf = new Intl.DateTimeFormat(\"en-US\", {\n hour12: false,\n timeZone: zoneName,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n era: \"short\",\n });\n dtfCache.set(zoneName, dtf);\n }\n return dtf;\n}\n\nconst typeToPos = {\n year: 0,\n month: 1,\n day: 2,\n era: 3,\n hour: 4,\n minute: 5,\n second: 6,\n};\n\nfunction hackyOffset(dtf, date) {\n const formatted = dtf.format(date).replace(/\\u200E/g, \"\"),\n parsed = /(\\d+)\\/(\\d+)\\/(\\d+) (AD|BC),? (\\d+):(\\d+):(\\d+)/.exec(formatted),\n [, fMonth, fDay, fYear, fadOrBc, fHour, fMinute, fSecond] = parsed;\n return [fYear, fMonth, fDay, fadOrBc, fHour, fMinute, fSecond];\n}\n\nfunction partsOffset(dtf, date) {\n const formatted = dtf.formatToParts(date);\n const filled = [];\n for (let i = 0; i < formatted.length; i++) {\n const { type, value } = formatted[i];\n const pos = typeToPos[type];\n\n if (type === \"era\") {\n filled[pos] = value;\n } else if (!isUndefined(pos)) {\n filled[pos] = parseInt(value, 10);\n }\n }\n return filled;\n}\n\nconst ianaZoneCache = new Map();\n/**\n * A zone identified by an IANA identifier, like America/New_York\n * @implements {Zone}\n */\nexport default class IANAZone extends Zone {\n /**\n * @param {string} name - Zone name\n * @return {IANAZone}\n */\n static create(name) {\n let zone = ianaZoneCache.get(name);\n if (zone === undefined) {\n ianaZoneCache.set(name, (zone = new IANAZone(name)));\n }\n return zone;\n }\n\n /**\n * Reset local caches. Should only be necessary in testing scenarios.\n * @return {void}\n */\n static resetCache() {\n ianaZoneCache.clear();\n dtfCache.clear();\n }\n\n /**\n * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that.\n * @param {string} s - The string to check validity on\n * @example IANAZone.isValidSpecifier(\"America/New_York\") //=> true\n * @example IANAZone.isValidSpecifier(\"Sport~~blorp\") //=> false\n * @deprecated For backward compatibility, this forwards to isValidZone, better use `isValidZone()` directly instead.\n * @return {boolean}\n */\n static isValidSpecifier(s) {\n return this.isValidZone(s);\n }\n\n /**\n * Returns whether the provided string identifies a real zone\n * @param {string} zone - The string to check\n * @example IANAZone.isValidZone(\"America/New_York\") //=> true\n * @example IANAZone.isValidZone(\"Fantasia/Castle\") //=> false\n * @example IANAZone.isValidZone(\"Sport~~blorp\") //=> false\n * @return {boolean}\n */\n static isValidZone(zone) {\n if (!zone) {\n return false;\n }\n try {\n new Intl.DateTimeFormat(\"en-US\", { timeZone: zone }).format();\n return true;\n } catch (e) {\n return false;\n }\n }\n\n constructor(name) {\n super();\n /** @private **/\n this.zoneName = name;\n /** @private **/\n this.valid = IANAZone.isValidZone(name);\n }\n\n /**\n * The type of zone. `iana` for all instances of `IANAZone`.\n * @override\n * @type {string}\n */\n get type() {\n return \"iana\";\n }\n\n /**\n * The name of this zone (i.e. the IANA zone name).\n * @override\n * @type {string}\n */\n get name() {\n return this.zoneName;\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year:\n * Always returns false for all IANA zones.\n * @override\n * @type {boolean}\n */\n get isUniversal() {\n return false;\n }\n\n /**\n * Returns the offset's common name (such as EST) at the specified timestamp\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the name\n * @param {Object} opts - Options to affect the format\n * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.\n * @param {string} opts.locale - What locale to return the offset name in.\n * @return {string}\n */\n offsetName(ts, { format, locale }) {\n return parseZoneInfo(ts, format, locale, this.name);\n }\n\n /**\n * Returns the offset's value as a string\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n return formatOffset(this.offset(ts), format);\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n * @override\n * @param {number} ts - Epoch milliseconds for which to compute the offset\n * @return {number}\n */\n offset(ts) {\n if (!this.valid) return NaN;\n const date = new Date(ts);\n\n if (isNaN(date)) return NaN;\n\n const dtf = makeDTF(this.name);\n let [year, month, day, adOrBc, hour, minute, second] = dtf.formatToParts\n ? partsOffset(dtf, date)\n : hackyOffset(dtf, date);\n\n if (adOrBc === \"BC\") {\n year = -Math.abs(year) + 1;\n }\n\n // because we're using hour12 and https://bugs.chromium.org/p/chromium/issues/detail?id=1025564&can=2&q=%2224%3A00%22%20datetimeformat\n const adjustedHour = hour === 24 ? 0 : hour;\n\n const asUTC = objToLocalTS({\n year,\n month,\n day,\n hour: adjustedHour,\n minute,\n second,\n millisecond: 0,\n });\n\n let asTS = +date;\n const over = asTS % 1000;\n asTS -= over >= 0 ? over : 1000 + over;\n return (asUTC - asTS) / (60 * 1000);\n }\n\n /**\n * Return whether this Zone is equal to another zone\n * @override\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n return otherZone.type === \"iana\" && otherZone.name === this.name;\n }\n\n /**\n * Return whether this Zone is valid.\n * @override\n * @type {boolean}\n */\n get isValid() {\n return this.valid;\n }\n}\n","import { hasLocaleWeekInfo, hasRelative, padStart, roundTo, validateWeekSettings } from \"./util.js\";\nimport * as English from \"./english.js\";\nimport Settings from \"../settings.js\";\nimport DateTime from \"../datetime.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\n\n// todo - remap caching\n\nlet intlLFCache = {};\nfunction getCachedLF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let dtf = intlLFCache[key];\n if (!dtf) {\n dtf = new Intl.ListFormat(locString, opts);\n intlLFCache[key] = dtf;\n }\n return dtf;\n}\n\nconst intlDTCache = new Map();\nfunction getCachedDTF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let dtf = intlDTCache.get(key);\n if (dtf === undefined) {\n dtf = new Intl.DateTimeFormat(locString, opts);\n intlDTCache.set(key, dtf);\n }\n return dtf;\n}\n\nconst intlNumCache = new Map();\nfunction getCachedINF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let inf = intlNumCache.get(key);\n if (inf === undefined) {\n inf = new Intl.NumberFormat(locString, opts);\n intlNumCache.set(key, inf);\n }\n return inf;\n}\n\nconst intlRelCache = new Map();\nfunction getCachedRTF(locString, opts = {}) {\n const { base, ...cacheKeyOpts } = opts; // exclude `base` from the options\n const key = JSON.stringify([locString, cacheKeyOpts]);\n let inf = intlRelCache.get(key);\n if (inf === undefined) {\n inf = new Intl.RelativeTimeFormat(locString, opts);\n intlRelCache.set(key, inf);\n }\n return inf;\n}\n\nlet sysLocaleCache = null;\nfunction systemLocale() {\n if (sysLocaleCache) {\n return sysLocaleCache;\n } else {\n sysLocaleCache = new Intl.DateTimeFormat().resolvedOptions().locale;\n return sysLocaleCache;\n }\n}\n\nconst intlResolvedOptionsCache = new Map();\nfunction getCachedIntResolvedOptions(locString) {\n let opts = intlResolvedOptionsCache.get(locString);\n if (opts === undefined) {\n opts = new Intl.DateTimeFormat(locString).resolvedOptions();\n intlResolvedOptionsCache.set(locString, opts);\n }\n return opts;\n}\n\nconst weekInfoCache = new Map();\nfunction getCachedWeekInfo(locString) {\n let data = weekInfoCache.get(locString);\n if (!data) {\n const locale = new Intl.Locale(locString);\n // browsers currently implement this as a property, but spec says it should be a getter function\n data = \"getWeekInfo\" in locale ? locale.getWeekInfo() : locale.weekInfo;\n // minimalDays was removed from WeekInfo: https://github.com/tc39/proposal-intl-locale-info/issues/86\n if (!(\"minimalDays\" in data)) {\n data = { ...fallbackWeekSettings, ...data };\n }\n weekInfoCache.set(locString, data);\n }\n return data;\n}\n\nfunction parseLocaleString(localeStr) {\n // I really want to avoid writing a BCP 47 parser\n // see, e.g. https://github.com/wooorm/bcp-47\n // Instead, we'll do this:\n\n // a) if the string has no -u extensions, just leave it alone\n // b) if it does, use Intl to resolve everything\n // c) if Intl fails, try again without the -u\n\n // private subtags and unicode subtags have ordering requirements,\n // and we're not properly parsing this, so just strip out the\n // private ones if they exist.\n const xIndex = localeStr.indexOf(\"-x-\");\n if (xIndex !== -1) {\n localeStr = localeStr.substring(0, xIndex);\n }\n\n const uIndex = localeStr.indexOf(\"-u-\");\n if (uIndex === -1) {\n return [localeStr];\n } else {\n let options;\n let selectedStr;\n try {\n options = getCachedDTF(localeStr).resolvedOptions();\n selectedStr = localeStr;\n } catch (e) {\n const smaller = localeStr.substring(0, uIndex);\n options = getCachedDTF(smaller).resolvedOptions();\n selectedStr = smaller;\n }\n\n const { numberingSystem, calendar } = options;\n return [selectedStr, numberingSystem, calendar];\n }\n}\n\nfunction intlConfigString(localeStr, numberingSystem, outputCalendar) {\n if (outputCalendar || numberingSystem) {\n if (!localeStr.includes(\"-u-\")) {\n localeStr += \"-u\";\n }\n\n if (outputCalendar) {\n localeStr += `-ca-${outputCalendar}`;\n }\n\n if (numberingSystem) {\n localeStr += `-nu-${numberingSystem}`;\n }\n return localeStr;\n } else {\n return localeStr;\n }\n}\n\nfunction mapMonths(f) {\n const ms = [];\n for (let i = 1; i <= 12; i++) {\n const dt = DateTime.utc(2009, i, 1);\n ms.push(f(dt));\n }\n return ms;\n}\n\nfunction mapWeekdays(f) {\n const ms = [];\n for (let i = 1; i <= 7; i++) {\n const dt = DateTime.utc(2016, 11, 13 + i);\n ms.push(f(dt));\n }\n return ms;\n}\n\nfunction listStuff(loc, length, englishFn, intlFn) {\n const mode = loc.listingMode();\n\n if (mode === \"error\") {\n return null;\n } else if (mode === \"en\") {\n return englishFn(length);\n } else {\n return intlFn(length);\n }\n}\n\nfunction supportsFastNumbers(loc) {\n if (loc.numberingSystem && loc.numberingSystem !== \"latn\") {\n return false;\n } else {\n return (\n loc.numberingSystem === \"latn\" ||\n !loc.locale ||\n loc.locale.startsWith(\"en\") ||\n getCachedIntResolvedOptions(loc.locale).numberingSystem === \"latn\"\n );\n }\n}\n\n/**\n * @private\n */\n\nclass PolyNumberFormatter {\n constructor(intl, forceSimple, opts) {\n this.padTo = opts.padTo || 0;\n this.floor = opts.floor || false;\n\n const { padTo, floor, ...otherOpts } = opts;\n\n if (!forceSimple || Object.keys(otherOpts).length > 0) {\n const intlOpts = { useGrouping: false, ...opts };\n if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo;\n this.inf = getCachedINF(intl, intlOpts);\n }\n }\n\n format(i) {\n if (this.inf) {\n const fixed = this.floor ? Math.floor(i) : i;\n return this.inf.format(fixed);\n } else {\n // to match the browser's numberformatter defaults\n const fixed = this.floor ? Math.floor(i) : roundTo(i, 3);\n return padStart(fixed, this.padTo);\n }\n }\n}\n\n/**\n * @private\n */\n\nclass PolyDateFormatter {\n constructor(dt, intl, opts) {\n this.opts = opts;\n this.originalZone = undefined;\n\n let z = undefined;\n if (this.opts.timeZone) {\n // Don't apply any workarounds if a timeZone is explicitly provided in opts\n this.dt = dt;\n } else if (dt.zone.type === \"fixed\") {\n // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like.\n // That is why fixed-offset TZ is set to that unless it is:\n // 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT.\n // 2. Unsupported by the browser:\n // - some do not support Etc/\n // - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata\n const gmtOffset = -1 * (dt.offset / 60);\n const offsetZ = gmtOffset >= 0 ? `Etc/GMT+${gmtOffset}` : `Etc/GMT${gmtOffset}`;\n if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) {\n z = offsetZ;\n this.dt = dt;\n } else {\n // Not all fixed-offset zones like Etc/+4:30 are present in tzdata so\n // we manually apply the offset and substitute the zone as needed.\n z = \"UTC\";\n this.dt = dt.offset === 0 ? dt : dt.setZone(\"UTC\").plus({ minutes: dt.offset });\n this.originalZone = dt.zone;\n }\n } else if (dt.zone.type === \"system\") {\n this.dt = dt;\n } else if (dt.zone.type === \"iana\") {\n this.dt = dt;\n z = dt.zone.name;\n } else {\n // Custom zones can have any offset / offsetName so we just manually\n // apply the offset and substitute the zone as needed.\n z = \"UTC\";\n this.dt = dt.setZone(\"UTC\").plus({ minutes: dt.offset });\n this.originalZone = dt.zone;\n }\n\n const intlOpts = { ...this.opts };\n intlOpts.timeZone = intlOpts.timeZone || z;\n this.dtf = getCachedDTF(intl, intlOpts);\n }\n\n format() {\n if (this.originalZone) {\n // If we have to substitute in the actual zone name, we have to use\n // formatToParts so that the timezone can be replaced.\n return this.formatToParts()\n .map(({ value }) => value)\n .join(\"\");\n }\n return this.dtf.format(this.dt.toJSDate());\n }\n\n formatToParts() {\n const parts = this.dtf.formatToParts(this.dt.toJSDate());\n if (this.originalZone) {\n return parts.map((part) => {\n if (part.type === \"timeZoneName\") {\n const offsetName = this.originalZone.offsetName(this.dt.ts, {\n locale: this.dt.locale,\n format: this.opts.timeZoneName,\n });\n return {\n ...part,\n value: offsetName,\n };\n } else {\n return part;\n }\n });\n }\n return parts;\n }\n\n resolvedOptions() {\n return this.dtf.resolvedOptions();\n }\n}\n\n/**\n * @private\n */\nclass PolyRelFormatter {\n constructor(intl, isEnglish, opts) {\n this.opts = { style: \"long\", ...opts };\n if (!isEnglish && hasRelative()) {\n this.rtf = getCachedRTF(intl, opts);\n }\n }\n\n format(count, unit) {\n if (this.rtf) {\n return this.rtf.format(count, unit);\n } else {\n return English.formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== \"long\");\n }\n }\n\n formatToParts(count, unit) {\n if (this.rtf) {\n return this.rtf.formatToParts(count, unit);\n } else {\n return [];\n }\n }\n}\n\nconst fallbackWeekSettings = {\n firstDay: 1,\n minimalDays: 4,\n weekend: [6, 7],\n};\n\n/**\n * @private\n */\nexport default class Locale {\n static fromOpts(opts) {\n return Locale.create(\n opts.locale,\n opts.numberingSystem,\n opts.outputCalendar,\n opts.weekSettings,\n opts.defaultToEN\n );\n }\n\n static create(locale, numberingSystem, outputCalendar, weekSettings, defaultToEN = false) {\n const specifiedLocale = locale || Settings.defaultLocale;\n // the system locale is useful for human-readable strings but annoying for parsing/formatting known formats\n const localeR = specifiedLocale || (defaultToEN ? \"en-US\" : systemLocale());\n const numberingSystemR = numberingSystem || Settings.defaultNumberingSystem;\n const outputCalendarR = outputCalendar || Settings.defaultOutputCalendar;\n const weekSettingsR = validateWeekSettings(weekSettings) || Settings.defaultWeekSettings;\n return new Locale(localeR, numberingSystemR, outputCalendarR, weekSettingsR, specifiedLocale);\n }\n\n static resetCache() {\n sysLocaleCache = null;\n intlDTCache.clear();\n intlNumCache.clear();\n intlRelCache.clear();\n intlResolvedOptionsCache.clear();\n weekInfoCache.clear();\n }\n\n static fromObject({ locale, numberingSystem, outputCalendar, weekSettings } = {}) {\n return Locale.create(locale, numberingSystem, outputCalendar, weekSettings);\n }\n\n constructor(locale, numbering, outputCalendar, weekSettings, specifiedLocale) {\n const [parsedLocale, parsedNumberingSystem, parsedOutputCalendar] = parseLocaleString(locale);\n\n this.locale = parsedLocale;\n this.numberingSystem = numbering || parsedNumberingSystem || null;\n this.outputCalendar = outputCalendar || parsedOutputCalendar || null;\n this.weekSettings = weekSettings;\n this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar);\n\n this.weekdaysCache = { format: {}, standalone: {} };\n this.monthsCache = { format: {}, standalone: {} };\n this.meridiemCache = null;\n this.eraCache = {};\n\n this.specifiedLocale = specifiedLocale;\n this.fastNumbersCached = null;\n }\n\n get fastNumbers() {\n if (this.fastNumbersCached == null) {\n this.fastNumbersCached = supportsFastNumbers(this);\n }\n\n return this.fastNumbersCached;\n }\n\n listingMode() {\n const isActuallyEn = this.isEnglish();\n const hasNoWeirdness =\n (this.numberingSystem === null || this.numberingSystem === \"latn\") &&\n (this.outputCalendar === null || this.outputCalendar === \"gregory\");\n return isActuallyEn && hasNoWeirdness ? \"en\" : \"intl\";\n }\n\n clone(alts) {\n if (!alts || Object.getOwnPropertyNames(alts).length === 0) {\n return this;\n } else {\n return Locale.create(\n alts.locale || this.specifiedLocale,\n alts.numberingSystem || this.numberingSystem,\n alts.outputCalendar || this.outputCalendar,\n validateWeekSettings(alts.weekSettings) || this.weekSettings,\n alts.defaultToEN || false\n );\n }\n }\n\n redefaultToEN(alts = {}) {\n return this.clone({ ...alts, defaultToEN: true });\n }\n\n redefaultToSystem(alts = {}) {\n return this.clone({ ...alts, defaultToEN: false });\n }\n\n months(length, format = false) {\n return listStuff(this, length, English.months, () => {\n // Workaround for \"ja\" locale: formatToParts does not label all parts of the month\n // as \"month\" and for this locale there is no difference between \"format\" and \"non-format\".\n // As such, just use format() instead of formatToParts() and take the whole string\n const monthSpecialCase = this.intl === \"ja\" || this.intl.startsWith(\"ja-\");\n format &= !monthSpecialCase;\n const intl = format ? { month: length, day: \"numeric\" } : { month: length },\n formatStr = format ? \"format\" : \"standalone\";\n if (!this.monthsCache[formatStr][length]) {\n const mapper = !monthSpecialCase\n ? (dt) => this.extract(dt, intl, \"month\")\n : (dt) => this.dtFormatter(dt, intl).format();\n this.monthsCache[formatStr][length] = mapMonths(mapper);\n }\n return this.monthsCache[formatStr][length];\n });\n }\n\n weekdays(length, format = false) {\n return listStuff(this, length, English.weekdays, () => {\n const intl = format\n ? { weekday: length, year: \"numeric\", month: \"long\", day: \"numeric\" }\n : { weekday: length },\n formatStr = format ? \"format\" : \"standalone\";\n if (!this.weekdaysCache[formatStr][length]) {\n this.weekdaysCache[formatStr][length] = mapWeekdays((dt) =>\n this.extract(dt, intl, \"weekday\")\n );\n }\n return this.weekdaysCache[formatStr][length];\n });\n }\n\n meridiems() {\n return listStuff(\n this,\n undefined,\n () => English.meridiems,\n () => {\n // In theory there could be aribitrary day periods. We're gonna assume there are exactly two\n // for AM and PM. This is probably wrong, but it's makes parsing way easier.\n if (!this.meridiemCache) {\n const intl = { hour: \"numeric\", hourCycle: \"h12\" };\n this.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map(\n (dt) => this.extract(dt, intl, \"dayperiod\")\n );\n }\n\n return this.meridiemCache;\n }\n );\n }\n\n eras(length) {\n return listStuff(this, length, English.eras, () => {\n const intl = { era: length };\n\n // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates\n // to definitely enumerate them.\n if (!this.eraCache[length]) {\n this.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map((dt) =>\n this.extract(dt, intl, \"era\")\n );\n }\n\n return this.eraCache[length];\n });\n }\n\n extract(dt, intlOpts, field) {\n const df = this.dtFormatter(dt, intlOpts),\n results = df.formatToParts(),\n matching = results.find((m) => m.type.toLowerCase() === field);\n return matching ? matching.value : null;\n }\n\n numberFormatter(opts = {}) {\n // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave)\n // (in contrast, the rest of the condition is used heavily)\n return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts);\n }\n\n dtFormatter(dt, intlOpts = {}) {\n return new PolyDateFormatter(dt, this.intl, intlOpts);\n }\n\n relFormatter(opts = {}) {\n return new PolyRelFormatter(this.intl, this.isEnglish(), opts);\n }\n\n listFormatter(opts = {}) {\n return getCachedLF(this.intl, opts);\n }\n\n isEnglish() {\n return (\n this.locale === \"en\" ||\n this.locale.toLowerCase() === \"en-us\" ||\n getCachedIntResolvedOptions(this.intl).locale.startsWith(\"en-us\")\n );\n }\n\n getWeekSettings() {\n if (this.weekSettings) {\n return this.weekSettings;\n } else if (!hasLocaleWeekInfo()) {\n return fallbackWeekSettings;\n } else {\n return getCachedWeekInfo(this.locale);\n }\n }\n\n getStartOfWeek() {\n return this.getWeekSettings().firstDay;\n }\n\n getMinDaysInFirstWeek() {\n return this.getWeekSettings().minimalDays;\n }\n\n getWeekendDays() {\n return this.getWeekSettings().weekend;\n }\n\n equals(other) {\n return (\n this.locale === other.locale &&\n this.numberingSystem === other.numberingSystem &&\n this.outputCalendar === other.outputCalendar\n );\n }\n\n toString() {\n return `Locale(${this.locale}, ${this.numberingSystem}, ${this.outputCalendar})`;\n }\n}\n","import { formatOffset, signedOffset } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet singleton = null;\n\n/**\n * A zone with a fixed offset (meaning no DST)\n * @implements {Zone}\n */\nexport default class FixedOffsetZone extends Zone {\n /**\n * Get a singleton instance of UTC\n * @return {FixedOffsetZone}\n */\n static get utcInstance() {\n if (singleton === null) {\n singleton = new FixedOffsetZone(0);\n }\n return singleton;\n }\n\n /**\n * Get an instance with a specified offset\n * @param {number} offset - The offset in minutes\n * @return {FixedOffsetZone}\n */\n static instance(offset) {\n return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset);\n }\n\n /**\n * Get an instance of FixedOffsetZone from a UTC offset string, like \"UTC+6\"\n * @param {string} s - The offset string to parse\n * @example FixedOffsetZone.parseSpecifier(\"UTC+6\")\n * @example FixedOffsetZone.parseSpecifier(\"UTC+06\")\n * @example FixedOffsetZone.parseSpecifier(\"UTC-6:00\")\n * @return {FixedOffsetZone}\n */\n static parseSpecifier(s) {\n if (s) {\n const r = s.match(/^utc(?:([+-]\\d{1,2})(?::(\\d{2}))?)?$/i);\n if (r) {\n return new FixedOffsetZone(signedOffset(r[1], r[2]));\n }\n }\n return null;\n }\n\n constructor(offset) {\n super();\n /** @private **/\n this.fixed = offset;\n }\n\n /**\n * The type of zone. `fixed` for all instances of `FixedOffsetZone`.\n * @override\n * @type {string}\n */\n get type() {\n return \"fixed\";\n }\n\n /**\n * The name of this zone.\n * All fixed zones' names always start with \"UTC\" (plus optional offset)\n * @override\n * @type {string}\n */\n get name() {\n return this.fixed === 0 ? \"UTC\" : `UTC${formatOffset(this.fixed, \"narrow\")}`;\n }\n\n /**\n * The IANA name of this zone, i.e. `Etc/UTC` or `Etc/GMT+/-nn`\n *\n * @override\n * @type {string}\n */\n get ianaName() {\n if (this.fixed === 0) {\n return \"Etc/UTC\";\n } else {\n return `Etc/GMT${formatOffset(-this.fixed, \"narrow\")}`;\n }\n }\n\n /**\n * Returns the offset's common name at the specified timestamp.\n *\n * For fixed offset zones this equals to the zone name.\n * @override\n */\n offsetName() {\n return this.name;\n }\n\n /**\n * Returns the offset's value as a string\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n return formatOffset(this.fixed, format);\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year:\n * Always returns true for all fixed offset zones.\n * @override\n * @type {boolean}\n */\n get isUniversal() {\n return true;\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n *\n * For fixed offset zones, this is constant and does not depend on a timestamp.\n * @override\n * @return {number}\n */\n offset() {\n return this.fixed;\n }\n\n /**\n * Return whether this Zone is equal to another zone (i.e. also fixed and same offset)\n * @override\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n return otherZone.type === \"fixed\" && otherZone.fixed === this.fixed;\n }\n\n /**\n * Return whether this Zone is valid:\n * All fixed offset zones are valid.\n * @override\n * @type {boolean}\n */\n get isValid() {\n return true;\n }\n}\n","import Zone from \"../zone.js\";\n\n/**\n * A zone that failed to parse. You should never need to instantiate this.\n * @implements {Zone}\n */\nexport default class InvalidZone extends Zone {\n constructor(zoneName) {\n super();\n /** @private */\n this.zoneName = zoneName;\n }\n\n /** @override **/\n get type() {\n return \"invalid\";\n }\n\n /** @override **/\n get name() {\n return this.zoneName;\n }\n\n /** @override **/\n get isUniversal() {\n return false;\n }\n\n /** @override **/\n offsetName() {\n return null;\n }\n\n /** @override **/\n formatOffset() {\n return \"\";\n }\n\n /** @override **/\n offset() {\n return NaN;\n }\n\n /** @override **/\n equals() {\n return false;\n }\n\n /** @override **/\n get isValid() {\n return false;\n }\n}\n","/**\n * @private\n */\n\nimport Zone from \"../zone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport InvalidZone from \"../zones/invalidZone.js\";\n\nimport { isUndefined, isString, isNumber } from \"./util.js\";\nimport SystemZone from \"../zones/systemZone.js\";\n\nexport function normalizeZone(input, defaultZone) {\n let offset;\n if (isUndefined(input) || input === null) {\n return defaultZone;\n } else if (input instanceof Zone) {\n return input;\n } else if (isString(input)) {\n const lowered = input.toLowerCase();\n if (lowered === \"default\") return defaultZone;\n else if (lowered === \"local\" || lowered === \"system\") return SystemZone.instance;\n else if (lowered === \"utc\" || lowered === \"gmt\") return FixedOffsetZone.utcInstance;\n else return FixedOffsetZone.parseSpecifier(lowered) || IANAZone.create(input);\n } else if (isNumber(input)) {\n return FixedOffsetZone.instance(input);\n } else if (typeof input === \"object\" && \"offset\" in input && typeof input.offset === \"function\") {\n // This is dumb, but the instanceof check above doesn't seem to really work\n // so we're duck checking it\n return input;\n } else {\n return new InvalidZone(input);\n }\n}\n","const numberingSystems = {\n arab: \"[\\u0660-\\u0669]\",\n arabext: \"[\\u06F0-\\u06F9]\",\n bali: \"[\\u1B50-\\u1B59]\",\n beng: \"[\\u09E6-\\u09EF]\",\n deva: \"[\\u0966-\\u096F]\",\n fullwide: \"[\\uFF10-\\uFF19]\",\n gujr: \"[\\u0AE6-\\u0AEF]\",\n hanidec: \"[〇|一|二|三|四|五|六|七|八|九]\",\n khmr: \"[\\u17E0-\\u17E9]\",\n knda: \"[\\u0CE6-\\u0CEF]\",\n laoo: \"[\\u0ED0-\\u0ED9]\",\n limb: \"[\\u1946-\\u194F]\",\n mlym: \"[\\u0D66-\\u0D6F]\",\n mong: \"[\\u1810-\\u1819]\",\n mymr: \"[\\u1040-\\u1049]\",\n orya: \"[\\u0B66-\\u0B6F]\",\n tamldec: \"[\\u0BE6-\\u0BEF]\",\n telu: \"[\\u0C66-\\u0C6F]\",\n thai: \"[\\u0E50-\\u0E59]\",\n tibt: \"[\\u0F20-\\u0F29]\",\n latn: \"\\\\d\",\n};\n\nconst numberingSystemsUTF16 = {\n arab: [1632, 1641],\n arabext: [1776, 1785],\n bali: [6992, 7001],\n beng: [2534, 2543],\n deva: [2406, 2415],\n fullwide: [65296, 65303],\n gujr: [2790, 2799],\n khmr: [6112, 6121],\n knda: [3302, 3311],\n laoo: [3792, 3801],\n limb: [6470, 6479],\n mlym: [3430, 3439],\n mong: [6160, 6169],\n mymr: [4160, 4169],\n orya: [2918, 2927],\n tamldec: [3046, 3055],\n telu: [3174, 3183],\n thai: [3664, 3673],\n tibt: [3872, 3881],\n};\n\nconst hanidecChars = numberingSystems.hanidec.replace(/[\\[|\\]]/g, \"\").split(\"\");\n\nexport function parseDigits(str) {\n let value = parseInt(str, 10);\n if (isNaN(value)) {\n value = \"\";\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n\n if (str[i].search(numberingSystems.hanidec) !== -1) {\n value += hanidecChars.indexOf(str[i]);\n } else {\n for (const key in numberingSystemsUTF16) {\n const [min, max] = numberingSystemsUTF16[key];\n if (code >= min && code <= max) {\n value += code - min;\n }\n }\n }\n }\n return parseInt(value, 10);\n } else {\n return value;\n }\n}\n\n// cache of {numberingSystem: {append: regex}}\nconst digitRegexCache = new Map();\nexport function resetDigitRegexCache() {\n digitRegexCache.clear();\n}\n\nexport function digitRegex({ numberingSystem }, append = \"\") {\n const ns = numberingSystem || \"latn\";\n\n let appendCache = digitRegexCache.get(ns);\n if (appendCache === undefined) {\n appendCache = new Map();\n digitRegexCache.set(ns, appendCache);\n }\n let regex = appendCache.get(append);\n if (regex === undefined) {\n regex = new RegExp(`${numberingSystems[ns]}${append}`);\n appendCache.set(append, regex);\n }\n\n return regex;\n}\n","import SystemZone from \"./zones/systemZone.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport Locale from \"./impl/locale.js\";\nimport DateTime from \"./datetime.js\";\n\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\nimport { validateWeekSettings } from \"./impl/util.js\";\nimport { resetDigitRegexCache } from \"./impl/digits.js\";\n\nlet now = () => Date.now(),\n defaultZone = \"system\",\n defaultLocale = null,\n defaultNumberingSystem = null,\n defaultOutputCalendar = null,\n twoDigitCutoffYear = 60,\n throwOnInvalid,\n defaultWeekSettings = null;\n\n/**\n * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here.\n */\nexport default class Settings {\n /**\n * Get the callback for returning the current timestamp.\n * @type {function}\n */\n static get now() {\n return now;\n }\n\n /**\n * Set the callback for returning the current timestamp.\n * The function should return a number, which will be interpreted as an Epoch millisecond count\n * @type {function}\n * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future\n * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time\n */\n static set now(n) {\n now = n;\n }\n\n /**\n * Set the default time zone to create DateTimes in. Does not affect existing instances.\n * Use the value \"system\" to reset this value to the system's time zone.\n * @type {string}\n */\n static set defaultZone(zone) {\n defaultZone = zone;\n }\n\n /**\n * Get the default time zone object currently used to create DateTimes. Does not affect existing instances.\n * The default value is the system's time zone (the one set on the machine that runs this code).\n * @type {Zone}\n */\n static get defaultZone() {\n return normalizeZone(defaultZone, SystemZone.instance);\n }\n\n /**\n * Get the default locale to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultLocale() {\n return defaultLocale;\n }\n\n /**\n * Set the default locale to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultLocale(locale) {\n defaultLocale = locale;\n }\n\n /**\n * Get the default numbering system to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultNumberingSystem() {\n return defaultNumberingSystem;\n }\n\n /**\n * Set the default numbering system to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultNumberingSystem(numberingSystem) {\n defaultNumberingSystem = numberingSystem;\n }\n\n /**\n * Get the default output calendar to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultOutputCalendar() {\n return defaultOutputCalendar;\n }\n\n /**\n * Set the default output calendar to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultOutputCalendar(outputCalendar) {\n defaultOutputCalendar = outputCalendar;\n }\n\n /**\n * @typedef {Object} WeekSettings\n * @property {number} firstDay\n * @property {number} minimalDays\n * @property {number[]} weekend\n */\n\n /**\n * @return {WeekSettings|null}\n */\n static get defaultWeekSettings() {\n return defaultWeekSettings;\n }\n\n /**\n * Allows overriding the default locale week settings, i.e. the start of the week, the weekend and\n * how many days are required in the first week of a year.\n * Does not affect existing instances.\n *\n * @param {WeekSettings|null} weekSettings\n */\n static set defaultWeekSettings(weekSettings) {\n defaultWeekSettings = validateWeekSettings(weekSettings);\n }\n\n /**\n * Get the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx.\n * @type {number}\n */\n static get twoDigitCutoffYear() {\n return twoDigitCutoffYear;\n }\n\n /**\n * Set the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx.\n * @type {number}\n * @example Settings.twoDigitCutoffYear = 0 // all 'yy' are interpreted as 20th century\n * @example Settings.twoDigitCutoffYear = 99 // all 'yy' are interpreted as 21st century\n * @example Settings.twoDigitCutoffYear = 50 // '49' -> 2049; '50' -> 1950\n * @example Settings.twoDigitCutoffYear = 1950 // interpreted as 50\n * @example Settings.twoDigitCutoffYear = 2050 // ALSO interpreted as 50\n */\n static set twoDigitCutoffYear(cutoffYear) {\n twoDigitCutoffYear = cutoffYear % 100;\n }\n\n /**\n * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n * @type {boolean}\n */\n static get throwOnInvalid() {\n return throwOnInvalid;\n }\n\n /**\n * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n * @type {boolean}\n */\n static set throwOnInvalid(t) {\n throwOnInvalid = t;\n }\n\n /**\n * Reset Luxon's global caches. Should only be necessary in testing scenarios.\n * @return {void}\n */\n static resetCaches() {\n Locale.resetCache();\n IANAZone.resetCache();\n DateTime.resetCache();\n resetDigitRegexCache();\n }\n}\n","export default class Invalid {\n constructor(reason, explanation) {\n this.reason = reason;\n this.explanation = explanation;\n }\n\n toMessage() {\n if (this.explanation) {\n return `${this.reason}: ${this.explanation}`;\n } else {\n return this.reason;\n }\n }\n}\n","import {\n integerBetween,\n isLeapYear,\n timeObject,\n daysInYear,\n daysInMonth,\n weeksInWeekYear,\n isInteger,\n isUndefined,\n} from \"./util.js\";\nimport Invalid from \"./invalid.js\";\nimport { ConflictingSpecificationError } from \"../errors.js\";\n\nconst nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334],\n leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335];\n\nfunction unitOutOfRange(unit, value) {\n return new Invalid(\n \"unit out of range\",\n `you specified ${value} (of type ${typeof value}) as a ${unit}, which is invalid`\n );\n}\n\nexport function dayOfWeek(year, month, day) {\n const d = new Date(Date.UTC(year, month - 1, day));\n\n if (year < 100 && year >= 0) {\n d.setUTCFullYear(d.getUTCFullYear() - 1900);\n }\n\n const js = d.getUTCDay();\n\n return js === 0 ? 7 : js;\n}\n\nfunction computeOrdinal(year, month, day) {\n return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1];\n}\n\nfunction uncomputeOrdinal(year, ordinal) {\n const table = isLeapYear(year) ? leapLadder : nonLeapLadder,\n month0 = table.findIndex((i) => i < ordinal),\n day = ordinal - table[month0];\n return { month: month0 + 1, day };\n}\n\nexport function isoWeekdayToLocal(isoWeekday, startOfWeek) {\n return ((isoWeekday - startOfWeek + 7) % 7) + 1;\n}\n\n/**\n * @private\n */\n\nexport function gregorianToWeek(gregObj, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const { year, month, day } = gregObj,\n ordinal = computeOrdinal(year, month, day),\n weekday = isoWeekdayToLocal(dayOfWeek(year, month, day), startOfWeek);\n\n let weekNumber = Math.floor((ordinal - weekday + 14 - minDaysInFirstWeek) / 7),\n weekYear;\n\n if (weekNumber < 1) {\n weekYear = year - 1;\n weekNumber = weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek);\n } else if (weekNumber > weeksInWeekYear(year, minDaysInFirstWeek, startOfWeek)) {\n weekYear = year + 1;\n weekNumber = 1;\n } else {\n weekYear = year;\n }\n\n return { weekYear, weekNumber, weekday, ...timeObject(gregObj) };\n}\n\nexport function weekToGregorian(weekData, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const { weekYear, weekNumber, weekday } = weekData,\n weekdayOfJan4 = isoWeekdayToLocal(dayOfWeek(weekYear, 1, minDaysInFirstWeek), startOfWeek),\n yearInDays = daysInYear(weekYear);\n\n let ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 7 + minDaysInFirstWeek,\n year;\n\n if (ordinal < 1) {\n year = weekYear - 1;\n ordinal += daysInYear(year);\n } else if (ordinal > yearInDays) {\n year = weekYear + 1;\n ordinal -= daysInYear(weekYear);\n } else {\n year = weekYear;\n }\n\n const { month, day } = uncomputeOrdinal(year, ordinal);\n return { year, month, day, ...timeObject(weekData) };\n}\n\nexport function gregorianToOrdinal(gregData) {\n const { year, month, day } = gregData;\n const ordinal = computeOrdinal(year, month, day);\n return { year, ordinal, ...timeObject(gregData) };\n}\n\nexport function ordinalToGregorian(ordinalData) {\n const { year, ordinal } = ordinalData;\n const { month, day } = uncomputeOrdinal(year, ordinal);\n return { year, month, day, ...timeObject(ordinalData) };\n}\n\n/**\n * Check if local week units like localWeekday are used in obj.\n * If so, validates that they are not mixed with ISO week units and then copies them to the normal week unit properties.\n * Modifies obj in-place!\n * @param obj the object values\n */\nexport function usesLocalWeekValues(obj, loc) {\n const hasLocaleWeekData =\n !isUndefined(obj.localWeekday) ||\n !isUndefined(obj.localWeekNumber) ||\n !isUndefined(obj.localWeekYear);\n if (hasLocaleWeekData) {\n const hasIsoWeekData =\n !isUndefined(obj.weekday) || !isUndefined(obj.weekNumber) || !isUndefined(obj.weekYear);\n\n if (hasIsoWeekData) {\n throw new ConflictingSpecificationError(\n \"Cannot mix locale-based week fields with ISO-based week fields\"\n );\n }\n if (!isUndefined(obj.localWeekday)) obj.weekday = obj.localWeekday;\n if (!isUndefined(obj.localWeekNumber)) obj.weekNumber = obj.localWeekNumber;\n if (!isUndefined(obj.localWeekYear)) obj.weekYear = obj.localWeekYear;\n delete obj.localWeekday;\n delete obj.localWeekNumber;\n delete obj.localWeekYear;\n return {\n minDaysInFirstWeek: loc.getMinDaysInFirstWeek(),\n startOfWeek: loc.getStartOfWeek(),\n };\n } else {\n return { minDaysInFirstWeek: 4, startOfWeek: 1 };\n }\n}\n\nexport function hasInvalidWeekData(obj, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const validYear = isInteger(obj.weekYear),\n validWeek = integerBetween(\n obj.weekNumber,\n 1,\n weeksInWeekYear(obj.weekYear, minDaysInFirstWeek, startOfWeek)\n ),\n validWeekday = integerBetween(obj.weekday, 1, 7);\n\n if (!validYear) {\n return unitOutOfRange(\"weekYear\", obj.weekYear);\n } else if (!validWeek) {\n return unitOutOfRange(\"week\", obj.weekNumber);\n } else if (!validWeekday) {\n return unitOutOfRange(\"weekday\", obj.weekday);\n } else return false;\n}\n\nexport function hasInvalidOrdinalData(obj) {\n const validYear = isInteger(obj.year),\n validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year));\n\n if (!validYear) {\n return unitOutOfRange(\"year\", obj.year);\n } else if (!validOrdinal) {\n return unitOutOfRange(\"ordinal\", obj.ordinal);\n } else return false;\n}\n\nexport function hasInvalidGregorianData(obj) {\n const validYear = isInteger(obj.year),\n validMonth = integerBetween(obj.month, 1, 12),\n validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month));\n\n if (!validYear) {\n return unitOutOfRange(\"year\", obj.year);\n } else if (!validMonth) {\n return unitOutOfRange(\"month\", obj.month);\n } else if (!validDay) {\n return unitOutOfRange(\"day\", obj.day);\n } else return false;\n}\n\nexport function hasInvalidTimeData(obj) {\n const { hour, minute, second, millisecond } = obj;\n const validHour =\n integerBetween(hour, 0, 23) ||\n (hour === 24 && minute === 0 && second === 0 && millisecond === 0),\n validMinute = integerBetween(minute, 0, 59),\n validSecond = integerBetween(second, 0, 59),\n validMillisecond = integerBetween(millisecond, 0, 999);\n\n if (!validHour) {\n return unitOutOfRange(\"hour\", hour);\n } else if (!validMinute) {\n return unitOutOfRange(\"minute\", minute);\n } else if (!validSecond) {\n return unitOutOfRange(\"second\", second);\n } else if (!validMillisecond) {\n return unitOutOfRange(\"millisecond\", millisecond);\n } else return false;\n}\n","/*\n This is just a junk drawer, containing anything used across multiple classes.\n Because Luxon is small(ish), this should stay small and we won't worry about splitting\n it up into, say, parsingUtil.js and basicUtil.js and so on. But they are divided up by feature area.\n*/\n\nimport { InvalidArgumentError } from \"../errors.js\";\nimport Settings from \"../settings.js\";\nimport { dayOfWeek, isoWeekdayToLocal } from \"./conversions.js\";\n\n/**\n * @private\n */\n\n// TYPES\n\nexport function isUndefined(o) {\n return typeof o === \"undefined\";\n}\n\nexport function isNumber(o) {\n return typeof o === \"number\";\n}\n\nexport function isInteger(o) {\n return typeof o === \"number\" && o % 1 === 0;\n}\n\nexport function isString(o) {\n return typeof o === \"string\";\n}\n\nexport function isDate(o) {\n return Object.prototype.toString.call(o) === \"[object Date]\";\n}\n\n// CAPABILITIES\n\nexport function hasRelative() {\n try {\n return typeof Intl !== \"undefined\" && !!Intl.RelativeTimeFormat;\n } catch (e) {\n return false;\n }\n}\n\nexport function hasLocaleWeekInfo() {\n try {\n return (\n typeof Intl !== \"undefined\" &&\n !!Intl.Locale &&\n (\"weekInfo\" in Intl.Locale.prototype || \"getWeekInfo\" in Intl.Locale.prototype)\n );\n } catch (e) {\n return false;\n }\n}\n\n// OBJECTS AND ARRAYS\n\nexport function maybeArray(thing) {\n return Array.isArray(thing) ? thing : [thing];\n}\n\nexport function bestBy(arr, by, compare) {\n if (arr.length === 0) {\n return undefined;\n }\n return arr.reduce((best, next) => {\n const pair = [by(next), next];\n if (!best) {\n return pair;\n } else if (compare(best[0], pair[0]) === best[0]) {\n return best;\n } else {\n return pair;\n }\n }, null)[1];\n}\n\nexport function pick(obj, keys) {\n return keys.reduce((a, k) => {\n a[k] = obj[k];\n return a;\n }, {});\n}\n\nexport function hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nexport function validateWeekSettings(settings) {\n if (settings == null) {\n return null;\n } else if (typeof settings !== \"object\") {\n throw new InvalidArgumentError(\"Week settings must be an object\");\n } else {\n if (\n !integerBetween(settings.firstDay, 1, 7) ||\n !integerBetween(settings.minimalDays, 1, 7) ||\n !Array.isArray(settings.weekend) ||\n settings.weekend.some((v) => !integerBetween(v, 1, 7))\n ) {\n throw new InvalidArgumentError(\"Invalid week settings\");\n }\n return {\n firstDay: settings.firstDay,\n minimalDays: settings.minimalDays,\n weekend: Array.from(settings.weekend),\n };\n }\n}\n\n// NUMBERS AND STRINGS\n\nexport function integerBetween(thing, bottom, top) {\n return isInteger(thing) && thing >= bottom && thing <= top;\n}\n\n// x % n but takes the sign of n instead of x\nexport function floorMod(x, n) {\n return x - n * Math.floor(x / n);\n}\n\nexport function padStart(input, n = 2) {\n const isNeg = input < 0;\n let padded;\n if (isNeg) {\n padded = \"-\" + (\"\" + -input).padStart(n, \"0\");\n } else {\n padded = (\"\" + input).padStart(n, \"0\");\n }\n return padded;\n}\n\nexport function parseInteger(string) {\n if (isUndefined(string) || string === null || string === \"\") {\n return undefined;\n } else {\n return parseInt(string, 10);\n }\n}\n\nexport function parseFloating(string) {\n if (isUndefined(string) || string === null || string === \"\") {\n return undefined;\n } else {\n return parseFloat(string);\n }\n}\n\nexport function parseMillis(fraction) {\n // Return undefined (instead of 0) in these cases, where fraction is not set\n if (isUndefined(fraction) || fraction === null || fraction === \"\") {\n return undefined;\n } else {\n const f = parseFloat(\"0.\" + fraction) * 1000;\n return Math.floor(f);\n }\n}\n\nexport function roundTo(number, digits, rounding = \"round\") {\n const factor = 10 ** digits;\n switch (rounding) {\n case \"expand\":\n return number > 0\n ? Math.ceil(number * factor) / factor\n : Math.floor(number * factor) / factor;\n case \"trunc\":\n return Math.trunc(number * factor) / factor;\n case \"round\":\n return Math.round(number * factor) / factor;\n case \"floor\":\n return Math.floor(number * factor) / factor;\n case \"ceil\":\n return Math.ceil(number * factor) / factor;\n default:\n throw new RangeError(`Value rounding ${rounding} is out of range`);\n }\n}\n\n// DATE BASICS\n\nexport function isLeapYear(year) {\n return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n}\n\nexport function daysInYear(year) {\n return isLeapYear(year) ? 366 : 365;\n}\n\nexport function daysInMonth(year, month) {\n const modMonth = floorMod(month - 1, 12) + 1,\n modYear = year + (month - modMonth) / 12;\n\n if (modMonth === 2) {\n return isLeapYear(modYear) ? 29 : 28;\n } else {\n return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1];\n }\n}\n\n// convert a calendar object to a local timestamp (epoch, but with the offset baked in)\nexport function objToLocalTS(obj) {\n let d = Date.UTC(\n obj.year,\n obj.month - 1,\n obj.day,\n obj.hour,\n obj.minute,\n obj.second,\n obj.millisecond\n );\n\n // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that\n if (obj.year < 100 && obj.year >= 0) {\n d = new Date(d);\n // set the month and day again, this is necessary because year 2000 is a leap year, but year 100 is not\n // so if obj.year is in 99, but obj.day makes it roll over into year 100,\n // the calculations done by Date.UTC are using year 2000 - which is incorrect\n d.setUTCFullYear(obj.year, obj.month - 1, obj.day);\n }\n return +d;\n}\n\n// adapted from moment.js: https://github.com/moment/moment/blob/000ac1800e620f770f4eb31b5ae908f6167b0ab2/src/lib/units/week-calendar-utils.js\nfunction firstWeekOffset(year, minDaysInFirstWeek, startOfWeek) {\n const fwdlw = isoWeekdayToLocal(dayOfWeek(year, 1, minDaysInFirstWeek), startOfWeek);\n return -fwdlw + minDaysInFirstWeek - 1;\n}\n\nexport function weeksInWeekYear(weekYear, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const weekOffset = firstWeekOffset(weekYear, minDaysInFirstWeek, startOfWeek);\n const weekOffsetNext = firstWeekOffset(weekYear + 1, minDaysInFirstWeek, startOfWeek);\n return (daysInYear(weekYear) - weekOffset + weekOffsetNext) / 7;\n}\n\nexport function untruncateYear(year) {\n if (year > 99) {\n return year;\n } else return year > Settings.twoDigitCutoffYear ? 1900 + year : 2000 + year;\n}\n\n// PARSING\n\nexport function parseZoneInfo(ts, offsetFormat, locale, timeZone = null) {\n const date = new Date(ts),\n intlOpts = {\n hourCycle: \"h23\",\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n };\n\n if (timeZone) {\n intlOpts.timeZone = timeZone;\n }\n\n const modified = { timeZoneName: offsetFormat, ...intlOpts };\n\n const parsed = new Intl.DateTimeFormat(locale, modified)\n .formatToParts(date)\n .find((m) => m.type.toLowerCase() === \"timezonename\");\n return parsed ? parsed.value : null;\n}\n\n// signedOffset('-5', '30') -> -330\nexport function signedOffset(offHourStr, offMinuteStr) {\n let offHour = parseInt(offHourStr, 10);\n\n // don't || this because we want to preserve -0\n if (Number.isNaN(offHour)) {\n offHour = 0;\n }\n\n const offMin = parseInt(offMinuteStr, 10) || 0,\n offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin;\n return offHour * 60 + offMinSigned;\n}\n\n// COERCION\n\nexport function asNumber(value) {\n const numericValue = Number(value);\n if (typeof value === \"boolean\" || value === \"\" || !Number.isFinite(numericValue))\n throw new InvalidArgumentError(`Invalid unit value ${value}`);\n return numericValue;\n}\n\nexport function normalizeObject(obj, normalizer) {\n const normalized = {};\n for (const u in obj) {\n if (hasOwnProperty(obj, u)) {\n const v = obj[u];\n if (v === undefined || v === null) continue;\n normalized[normalizer(u)] = asNumber(v);\n }\n }\n return normalized;\n}\n\n/**\n * Returns the offset's value as a string\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\nexport function formatOffset(offset, format) {\n const hours = Math.trunc(Math.abs(offset / 60)),\n minutes = Math.trunc(Math.abs(offset % 60)),\n sign = offset >= 0 ? \"+\" : \"-\";\n\n switch (format) {\n case \"short\":\n return `${sign}${padStart(hours, 2)}:${padStart(minutes, 2)}`;\n case \"narrow\":\n return `${sign}${hours}${minutes > 0 ? `:${minutes}` : \"\"}`;\n case \"techie\":\n return `${sign}${padStart(hours, 2)}${padStart(minutes, 2)}`;\n default:\n throw new RangeError(`Value format ${format} is out of range for property format`);\n }\n}\n\nexport function timeObject(obj) {\n return pick(obj, [\"hour\", \"minute\", \"second\", \"millisecond\"]);\n}\n","import * as Formats from \"./formats.js\";\nimport { pick } from \"./util.js\";\n\nfunction stringify(obj) {\n return JSON.stringify(obj, Object.keys(obj).sort());\n}\n\n/**\n * @private\n */\n\nexport const monthsLong = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\nexport const monthsShort = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n];\n\nexport const monthsNarrow = [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"];\n\nexport function months(length) {\n switch (length) {\n case \"narrow\":\n return [...monthsNarrow];\n case \"short\":\n return [...monthsShort];\n case \"long\":\n return [...monthsLong];\n case \"numeric\":\n return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\"];\n case \"2-digit\":\n return [\"01\", \"02\", \"03\", \"04\", \"05\", \"06\", \"07\", \"08\", \"09\", \"10\", \"11\", \"12\"];\n default:\n return null;\n }\n}\n\nexport const weekdaysLong = [\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n \"Sunday\",\n];\n\nexport const weekdaysShort = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\n\nexport const weekdaysNarrow = [\"M\", \"T\", \"W\", \"T\", \"F\", \"S\", \"S\"];\n\nexport function weekdays(length) {\n switch (length) {\n case \"narrow\":\n return [...weekdaysNarrow];\n case \"short\":\n return [...weekdaysShort];\n case \"long\":\n return [...weekdaysLong];\n case \"numeric\":\n return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\"];\n default:\n return null;\n }\n}\n\nexport const meridiems = [\"AM\", \"PM\"];\n\nexport const erasLong = [\"Before Christ\", \"Anno Domini\"];\n\nexport const erasShort = [\"BC\", \"AD\"];\n\nexport const erasNarrow = [\"B\", \"A\"];\n\nexport function eras(length) {\n switch (length) {\n case \"narrow\":\n return [...erasNarrow];\n case \"short\":\n return [...erasShort];\n case \"long\":\n return [...erasLong];\n default:\n return null;\n }\n}\n\nexport function meridiemForDateTime(dt) {\n return meridiems[dt.hour < 12 ? 0 : 1];\n}\n\nexport function weekdayForDateTime(dt, length) {\n return weekdays(length)[dt.weekday - 1];\n}\n\nexport function monthForDateTime(dt, length) {\n return months(length)[dt.month - 1];\n}\n\nexport function eraForDateTime(dt, length) {\n return eras(length)[dt.year < 0 ? 0 : 1];\n}\n\nexport function formatRelativeTime(unit, count, numeric = \"always\", narrow = false) {\n const units = {\n years: [\"year\", \"yr.\"],\n quarters: [\"quarter\", \"qtr.\"],\n months: [\"month\", \"mo.\"],\n weeks: [\"week\", \"wk.\"],\n days: [\"day\", \"day\", \"days\"],\n hours: [\"hour\", \"hr.\"],\n minutes: [\"minute\", \"min.\"],\n seconds: [\"second\", \"sec.\"],\n };\n\n const lastable = [\"hours\", \"minutes\", \"seconds\"].indexOf(unit) === -1;\n\n if (numeric === \"auto\" && lastable) {\n const isDay = unit === \"days\";\n switch (count) {\n case 1:\n return isDay ? \"tomorrow\" : `next ${units[unit][0]}`;\n case -1:\n return isDay ? \"yesterday\" : `last ${units[unit][0]}`;\n case 0:\n return isDay ? \"today\" : `this ${units[unit][0]}`;\n default: // fall through\n }\n }\n\n const isInPast = Object.is(count, -0) || count < 0,\n fmtValue = Math.abs(count),\n singular = fmtValue === 1,\n lilUnits = units[unit],\n fmtUnit = narrow\n ? singular\n ? lilUnits[1]\n : lilUnits[2] || lilUnits[1]\n : singular\n ? units[unit][0]\n : unit;\n return isInPast ? `${fmtValue} ${fmtUnit} ago` : `in ${fmtValue} ${fmtUnit}`;\n}\n\nexport function formatString(knownFormat) {\n // these all have the offsets removed because we don't have access to them\n // without all the intl stuff this is backfilling\n const filtered = pick(knownFormat, [\n \"weekday\",\n \"era\",\n \"year\",\n \"month\",\n \"day\",\n \"hour\",\n \"minute\",\n \"second\",\n \"timeZoneName\",\n \"hourCycle\",\n ]),\n key = stringify(filtered),\n dateTimeHuge = \"EEEE, LLLL d, yyyy, h:mm a\";\n switch (key) {\n case stringify(Formats.DATE_SHORT):\n return \"M/d/yyyy\";\n case stringify(Formats.DATE_MED):\n return \"LLL d, yyyy\";\n case stringify(Formats.DATE_MED_WITH_WEEKDAY):\n return \"EEE, LLL d, yyyy\";\n case stringify(Formats.DATE_FULL):\n return \"LLLL d, yyyy\";\n case stringify(Formats.DATE_HUGE):\n return \"EEEE, LLLL d, yyyy\";\n case stringify(Formats.TIME_SIMPLE):\n return \"h:mm a\";\n case stringify(Formats.TIME_WITH_SECONDS):\n return \"h:mm:ss a\";\n case stringify(Formats.TIME_WITH_SHORT_OFFSET):\n return \"h:mm a\";\n case stringify(Formats.TIME_WITH_LONG_OFFSET):\n return \"h:mm a\";\n case stringify(Formats.TIME_24_SIMPLE):\n return \"HH:mm\";\n case stringify(Formats.TIME_24_WITH_SECONDS):\n return \"HH:mm:ss\";\n case stringify(Formats.TIME_24_WITH_SHORT_OFFSET):\n return \"HH:mm\";\n case stringify(Formats.TIME_24_WITH_LONG_OFFSET):\n return \"HH:mm\";\n case stringify(Formats.DATETIME_SHORT):\n return \"M/d/yyyy, h:mm a\";\n case stringify(Formats.DATETIME_MED):\n return \"LLL d, yyyy, h:mm a\";\n case stringify(Formats.DATETIME_FULL):\n return \"LLLL d, yyyy, h:mm a\";\n case stringify(Formats.DATETIME_HUGE):\n return dateTimeHuge;\n case stringify(Formats.DATETIME_SHORT_WITH_SECONDS):\n return \"M/d/yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_MED_WITH_SECONDS):\n return \"LLL d, yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_MED_WITH_WEEKDAY):\n return \"EEE, d LLL yyyy, h:mm a\";\n case stringify(Formats.DATETIME_FULL_WITH_SECONDS):\n return \"LLLL d, yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_HUGE_WITH_SECONDS):\n return \"EEEE, LLLL d, yyyy, h:mm:ss a\";\n default:\n return dateTimeHuge;\n }\n}\n","import * as English from \"./english.js\";\nimport * as Formats from \"./formats.js\";\nimport { padStart } from \"./util.js\";\n\nfunction stringifyTokens(splits, tokenToString) {\n let s = \"\";\n for (const token of splits) {\n if (token.literal) {\n s += token.val;\n } else {\n s += tokenToString(token.val);\n }\n }\n return s;\n}\n\nconst macroTokenToFormatOpts = {\n D: Formats.DATE_SHORT,\n DD: Formats.DATE_MED,\n DDD: Formats.DATE_FULL,\n DDDD: Formats.DATE_HUGE,\n t: Formats.TIME_SIMPLE,\n tt: Formats.TIME_WITH_SECONDS,\n ttt: Formats.TIME_WITH_SHORT_OFFSET,\n tttt: Formats.TIME_WITH_LONG_OFFSET,\n T: Formats.TIME_24_SIMPLE,\n TT: Formats.TIME_24_WITH_SECONDS,\n TTT: Formats.TIME_24_WITH_SHORT_OFFSET,\n TTTT: Formats.TIME_24_WITH_LONG_OFFSET,\n f: Formats.DATETIME_SHORT,\n ff: Formats.DATETIME_MED,\n fff: Formats.DATETIME_FULL,\n ffff: Formats.DATETIME_HUGE,\n F: Formats.DATETIME_SHORT_WITH_SECONDS,\n FF: Formats.DATETIME_MED_WITH_SECONDS,\n FFF: Formats.DATETIME_FULL_WITH_SECONDS,\n FFFF: Formats.DATETIME_HUGE_WITH_SECONDS,\n};\n\n/**\n * @private\n */\n\nexport default class Formatter {\n static create(locale, opts = {}) {\n return new Formatter(locale, opts);\n }\n\n static parseFormat(fmt) {\n // white-space is always considered a literal in user-provided formats\n // the \" \" token has a special meaning (see unitForToken)\n\n let current = null,\n currentFull = \"\",\n bracketed = false;\n const splits = [];\n for (let i = 0; i < fmt.length; i++) {\n const c = fmt.charAt(i);\n if (c === \"'\") {\n // turn '' into a literal signal quote instead of just skipping the empty literal\n if (currentFull.length > 0 || bracketed) {\n splits.push({\n literal: bracketed || /^\\s+$/.test(currentFull),\n val: currentFull === \"\" ? \"'\" : currentFull,\n });\n }\n current = null;\n currentFull = \"\";\n bracketed = !bracketed;\n } else if (bracketed) {\n currentFull += c;\n } else if (c === current) {\n currentFull += c;\n } else {\n if (currentFull.length > 0) {\n splits.push({ literal: /^\\s+$/.test(currentFull), val: currentFull });\n }\n currentFull = c;\n current = c;\n }\n }\n\n if (currentFull.length > 0) {\n splits.push({ literal: bracketed || /^\\s+$/.test(currentFull), val: currentFull });\n }\n\n return splits;\n }\n\n static macroTokenToFormatOpts(token) {\n return macroTokenToFormatOpts[token];\n }\n\n constructor(locale, formatOpts) {\n this.opts = formatOpts;\n this.loc = locale;\n this.systemLoc = null;\n }\n\n formatWithSystemDefault(dt, opts) {\n if (this.systemLoc === null) {\n this.systemLoc = this.loc.redefaultToSystem();\n }\n const df = this.systemLoc.dtFormatter(dt, { ...this.opts, ...opts });\n return df.format();\n }\n\n dtFormatter(dt, opts = {}) {\n return this.loc.dtFormatter(dt, { ...this.opts, ...opts });\n }\n\n formatDateTime(dt, opts) {\n return this.dtFormatter(dt, opts).format();\n }\n\n formatDateTimeParts(dt, opts) {\n return this.dtFormatter(dt, opts).formatToParts();\n }\n\n formatInterval(interval, opts) {\n const df = this.dtFormatter(interval.start, opts);\n return df.dtf.formatRange(interval.start.toJSDate(), interval.end.toJSDate());\n }\n\n resolvedOptions(dt, opts) {\n return this.dtFormatter(dt, opts).resolvedOptions();\n }\n\n num(n, p = 0, signDisplay = undefined) {\n // we get some perf out of doing this here, annoyingly\n if (this.opts.forceSimple) {\n return padStart(n, p);\n }\n\n const opts = { ...this.opts };\n\n if (p > 0) {\n opts.padTo = p;\n }\n if (signDisplay) {\n opts.signDisplay = signDisplay;\n }\n\n return this.loc.numberFormatter(opts).format(n);\n }\n\n formatDateTimeFromString(dt, fmt) {\n const knownEnglish = this.loc.listingMode() === \"en\",\n useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== \"gregory\",\n string = (opts, extract) => this.loc.extract(dt, opts, extract),\n formatOffset = (opts) => {\n if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) {\n return \"Z\";\n }\n\n return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : \"\";\n },\n meridiem = () =>\n knownEnglish\n ? English.meridiemForDateTime(dt)\n : string({ hour: \"numeric\", hourCycle: \"h12\" }, \"dayperiod\"),\n month = (length, standalone) =>\n knownEnglish\n ? English.monthForDateTime(dt, length)\n : string(standalone ? { month: length } : { month: length, day: \"numeric\" }, \"month\"),\n weekday = (length, standalone) =>\n knownEnglish\n ? English.weekdayForDateTime(dt, length)\n : string(\n standalone ? { weekday: length } : { weekday: length, month: \"long\", day: \"numeric\" },\n \"weekday\"\n ),\n maybeMacro = (token) => {\n const formatOpts = Formatter.macroTokenToFormatOpts(token);\n if (formatOpts) {\n return this.formatWithSystemDefault(dt, formatOpts);\n } else {\n return token;\n }\n },\n era = (length) =>\n knownEnglish ? English.eraForDateTime(dt, length) : string({ era: length }, \"era\"),\n tokenToString = (token) => {\n // Where possible: https://cldr.unicode.org/translation/date-time/date-time-symbols\n switch (token) {\n // ms\n case \"S\":\n return this.num(dt.millisecond);\n case \"u\":\n // falls through\n case \"SSS\":\n return this.num(dt.millisecond, 3);\n // seconds\n case \"s\":\n return this.num(dt.second);\n case \"ss\":\n return this.num(dt.second, 2);\n // fractional seconds\n case \"uu\":\n return this.num(Math.floor(dt.millisecond / 10), 2);\n case \"uuu\":\n return this.num(Math.floor(dt.millisecond / 100));\n // minutes\n case \"m\":\n return this.num(dt.minute);\n case \"mm\":\n return this.num(dt.minute, 2);\n // hours\n case \"h\":\n return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12);\n case \"hh\":\n return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2);\n case \"H\":\n return this.num(dt.hour);\n case \"HH\":\n return this.num(dt.hour, 2);\n // offset\n case \"Z\":\n // like +6\n return formatOffset({ format: \"narrow\", allowZ: this.opts.allowZ });\n case \"ZZ\":\n // like +06:00\n return formatOffset({ format: \"short\", allowZ: this.opts.allowZ });\n case \"ZZZ\":\n // like +0600\n return formatOffset({ format: \"techie\", allowZ: this.opts.allowZ });\n case \"ZZZZ\":\n // like EST\n return dt.zone.offsetName(dt.ts, { format: \"short\", locale: this.loc.locale });\n case \"ZZZZZ\":\n // like Eastern Standard Time\n return dt.zone.offsetName(dt.ts, { format: \"long\", locale: this.loc.locale });\n // zone\n case \"z\":\n // like America/New_York\n return dt.zoneName;\n // meridiems\n case \"a\":\n return meridiem();\n // dates\n case \"d\":\n return useDateTimeFormatter ? string({ day: \"numeric\" }, \"day\") : this.num(dt.day);\n case \"dd\":\n return useDateTimeFormatter ? string({ day: \"2-digit\" }, \"day\") : this.num(dt.day, 2);\n // weekdays - standalone\n case \"c\":\n // like 1\n return this.num(dt.weekday);\n case \"ccc\":\n // like 'Tues'\n return weekday(\"short\", true);\n case \"cccc\":\n // like 'Tuesday'\n return weekday(\"long\", true);\n case \"ccccc\":\n // like 'T'\n return weekday(\"narrow\", true);\n // weekdays - format\n case \"E\":\n // like 1\n return this.num(dt.weekday);\n case \"EEE\":\n // like 'Tues'\n return weekday(\"short\", false);\n case \"EEEE\":\n // like 'Tuesday'\n return weekday(\"long\", false);\n case \"EEEEE\":\n // like 'T'\n return weekday(\"narrow\", false);\n // months - standalone\n case \"L\":\n // like 1\n return useDateTimeFormatter\n ? string({ month: \"numeric\", day: \"numeric\" }, \"month\")\n : this.num(dt.month);\n case \"LL\":\n // like 01, doesn't seem to work\n return useDateTimeFormatter\n ? string({ month: \"2-digit\", day: \"numeric\" }, \"month\")\n : this.num(dt.month, 2);\n case \"LLL\":\n // like Jan\n return month(\"short\", true);\n case \"LLLL\":\n // like January\n return month(\"long\", true);\n case \"LLLLL\":\n // like J\n return month(\"narrow\", true);\n // months - format\n case \"M\":\n // like 1\n return useDateTimeFormatter\n ? string({ month: \"numeric\" }, \"month\")\n : this.num(dt.month);\n case \"MM\":\n // like 01\n return useDateTimeFormatter\n ? string({ month: \"2-digit\" }, \"month\")\n : this.num(dt.month, 2);\n case \"MMM\":\n // like Jan\n return month(\"short\", false);\n case \"MMMM\":\n // like January\n return month(\"long\", false);\n case \"MMMMM\":\n // like J\n return month(\"narrow\", false);\n // years\n case \"y\":\n // like 2014\n return useDateTimeFormatter ? string({ year: \"numeric\" }, \"year\") : this.num(dt.year);\n case \"yy\":\n // like 14\n return useDateTimeFormatter\n ? string({ year: \"2-digit\" }, \"year\")\n : this.num(dt.year.toString().slice(-2), 2);\n case \"yyyy\":\n // like 0012\n return useDateTimeFormatter\n ? string({ year: \"numeric\" }, \"year\")\n : this.num(dt.year, 4);\n case \"yyyyyy\":\n // like 000012\n return useDateTimeFormatter\n ? string({ year: \"numeric\" }, \"year\")\n : this.num(dt.year, 6);\n // eras\n case \"G\":\n // like AD\n return era(\"short\");\n case \"GG\":\n // like Anno Domini\n return era(\"long\");\n case \"GGGGG\":\n return era(\"narrow\");\n case \"kk\":\n return this.num(dt.weekYear.toString().slice(-2), 2);\n case \"kkkk\":\n return this.num(dt.weekYear, 4);\n case \"W\":\n return this.num(dt.weekNumber);\n case \"WW\":\n return this.num(dt.weekNumber, 2);\n case \"n\":\n return this.num(dt.localWeekNumber);\n case \"nn\":\n return this.num(dt.localWeekNumber, 2);\n case \"ii\":\n return this.num(dt.localWeekYear.toString().slice(-2), 2);\n case \"iiii\":\n return this.num(dt.localWeekYear, 4);\n case \"o\":\n return this.num(dt.ordinal);\n case \"ooo\":\n return this.num(dt.ordinal, 3);\n case \"q\":\n // like 1\n return this.num(dt.quarter);\n case \"qq\":\n // like 01\n return this.num(dt.quarter, 2);\n case \"X\":\n return this.num(Math.floor(dt.ts / 1000));\n case \"x\":\n return this.num(dt.ts);\n default:\n return maybeMacro(token);\n }\n };\n\n return stringifyTokens(Formatter.parseFormat(fmt), tokenToString);\n }\n\n formatDurationFromString(dur, fmt) {\n const invertLargest = this.opts.signMode === \"negativeLargestOnly\" ? -1 : 1;\n const tokenToField = (token) => {\n switch (token[0]) {\n case \"S\":\n return \"milliseconds\";\n case \"s\":\n return \"seconds\";\n case \"m\":\n return \"minutes\";\n case \"h\":\n return \"hours\";\n case \"d\":\n return \"days\";\n case \"w\":\n return \"weeks\";\n case \"M\":\n return \"months\";\n case \"y\":\n return \"years\";\n default:\n return null;\n }\n },\n tokenToString = (lildur, info) => (token) => {\n const mapped = tokenToField(token);\n if (mapped) {\n const inversionFactor =\n info.isNegativeDuration && mapped !== info.largestUnit ? invertLargest : 1;\n let signDisplay;\n if (this.opts.signMode === \"negativeLargestOnly\" && mapped !== info.largestUnit) {\n signDisplay = \"never\";\n } else if (this.opts.signMode === \"all\") {\n signDisplay = \"always\";\n } else {\n // \"auto\" and \"negative\" are the same, but \"auto\" has better support\n signDisplay = \"auto\";\n }\n return this.num(lildur.get(mapped) * inversionFactor, token.length, signDisplay);\n } else {\n return token;\n }\n },\n tokens = Formatter.parseFormat(fmt),\n realTokens = tokens.reduce(\n (found, { literal, val }) => (literal ? found : found.concat(val)),\n []\n ),\n collapsed = dur.shiftTo(...realTokens.map(tokenToField).filter((t) => t)),\n durationInfo = {\n isNegativeDuration: collapsed < 0,\n // this relies on \"collapsed\" being based on \"shiftTo\", which builds up the object\n // in order\n largestUnit: Object.keys(collapsed.values)[0],\n };\n return stringifyTokens(tokens, tokenToString(collapsed, durationInfo));\n }\n}\n","import {\n untruncateYear,\n signedOffset,\n parseInteger,\n parseMillis,\n isUndefined,\n parseFloating,\n} from \"./util.js\";\nimport * as English from \"./english.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\n\n/*\n * This file handles parsing for well-specified formats. Here's how it works:\n * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match.\n * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object\n * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence.\n * Extractors can take a \"cursor\" representing the offset in the match to look at. This makes it easy to combine extractors.\n * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions.\n * Some extractions are super dumb and simpleParse and fromStrings help DRY them.\n */\n\nconst ianaRegex = /[A-Za-z_+-]{1,256}(?::?\\/[A-Za-z0-9_+-]{1,256}(?:\\/[A-Za-z0-9_+-]{1,256})?)?/;\n\nfunction combineRegexes(...regexes) {\n const full = regexes.reduce((f, r) => f + r.source, \"\");\n return RegExp(`^${full}$`);\n}\n\nfunction combineExtractors(...extractors) {\n return (m) =>\n extractors\n .reduce(\n ([mergedVals, mergedZone, cursor], ex) => {\n const [val, zone, next] = ex(m, cursor);\n return [{ ...mergedVals, ...val }, zone || mergedZone, next];\n },\n [{}, null, 1]\n )\n .slice(0, 2);\n}\n\nfunction parse(s, ...patterns) {\n if (s == null) {\n return [null, null];\n }\n\n for (const [regex, extractor] of patterns) {\n const m = regex.exec(s);\n if (m) {\n return extractor(m);\n }\n }\n return [null, null];\n}\n\nfunction simpleParse(...keys) {\n return (match, cursor) => {\n const ret = {};\n let i;\n\n for (i = 0; i < keys.length; i++) {\n ret[keys[i]] = parseInteger(match[cursor + i]);\n }\n return [ret, null, cursor + i];\n };\n}\n\n// ISO and SQL parsing\nconst offsetRegex = /(?:([Zz])|([+-]\\d\\d)(?::?(\\d\\d))?)/;\nconst isoExtendedZone = `(?:${offsetRegex.source}?(?:\\\\[(${ianaRegex.source})\\\\])?)?`;\nconst isoTimeBaseRegex = /(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:[.,](\\d{1,30}))?)?)?/;\nconst isoTimeRegex = RegExp(`${isoTimeBaseRegex.source}${isoExtendedZone}`);\nconst isoTimeExtensionRegex = RegExp(`(?:[Tt]${isoTimeRegex.source})?`);\nconst isoYmdRegex = /([+-]\\d{6}|\\d{4})(?:-?(\\d\\d)(?:-?(\\d\\d))?)?/;\nconst isoWeekRegex = /(\\d{4})-?W(\\d\\d)(?:-?(\\d))?/;\nconst isoOrdinalRegex = /(\\d{4})-?(\\d{3})/;\nconst extractISOWeekData = simpleParse(\"weekYear\", \"weekNumber\", \"weekDay\");\nconst extractISOOrdinalData = simpleParse(\"year\", \"ordinal\");\nconst sqlYmdRegex = /(\\d{4})-(\\d\\d)-(\\d\\d)/; // dumbed-down version of the ISO one\nconst sqlTimeRegex = RegExp(\n `${isoTimeBaseRegex.source} ?(?:${offsetRegex.source}|(${ianaRegex.source}))?`\n);\nconst sqlTimeExtensionRegex = RegExp(`(?: ${sqlTimeRegex.source})?`);\n\nfunction int(match, pos, fallback) {\n const m = match[pos];\n return isUndefined(m) ? fallback : parseInteger(m);\n}\n\nfunction extractISOYmd(match, cursor) {\n const item = {\n year: int(match, cursor),\n month: int(match, cursor + 1, 1),\n day: int(match, cursor + 2, 1),\n };\n\n return [item, null, cursor + 3];\n}\n\nfunction extractISOTime(match, cursor) {\n const item = {\n hours: int(match, cursor, 0),\n minutes: int(match, cursor + 1, 0),\n seconds: int(match, cursor + 2, 0),\n milliseconds: parseMillis(match[cursor + 3]),\n };\n\n return [item, null, cursor + 4];\n}\n\nfunction extractISOOffset(match, cursor) {\n const local = !match[cursor] && !match[cursor + 1],\n fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]),\n zone = local ? null : FixedOffsetZone.instance(fullOffset);\n return [{}, zone, cursor + 3];\n}\n\nfunction extractIANAZone(match, cursor) {\n const zone = match[cursor] ? IANAZone.create(match[cursor]) : null;\n return [{}, zone, cursor + 1];\n}\n\n// ISO time parsing\n\nconst isoTimeOnly = RegExp(`^T?${isoTimeBaseRegex.source}$`);\n\n// ISO duration parsing\n\nconst isoDuration =\n /^-?P(?:(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)Y)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)M)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)W)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)D)?(?:T(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)H)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)M)?(?:(-?\\d{1,20})(?:[.,](-?\\d{1,20}))?S)?)?)$/;\n\nfunction extractISODuration(match) {\n const [s, yearStr, monthStr, weekStr, dayStr, hourStr, minuteStr, secondStr, millisecondsStr] =\n match;\n\n const hasNegativePrefix = s[0] === \"-\";\n const negativeSeconds = secondStr && secondStr[0] === \"-\";\n\n const maybeNegate = (num, force = false) =>\n num !== undefined && (force || (num && hasNegativePrefix)) ? -num : num;\n\n return [\n {\n years: maybeNegate(parseFloating(yearStr)),\n months: maybeNegate(parseFloating(monthStr)),\n weeks: maybeNegate(parseFloating(weekStr)),\n days: maybeNegate(parseFloating(dayStr)),\n hours: maybeNegate(parseFloating(hourStr)),\n minutes: maybeNegate(parseFloating(minuteStr)),\n seconds: maybeNegate(parseFloating(secondStr), secondStr === \"-0\"),\n milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds),\n },\n ];\n}\n\n// These are a little braindead. EDT *should* tell us that we're in, say, America/New_York\n// and not just that we're in -240 *right now*. But since I don't think these are used that often\n// I'm just going to ignore that\nconst obsOffsets = {\n GMT: 0,\n EDT: -4 * 60,\n EST: -5 * 60,\n CDT: -5 * 60,\n CST: -6 * 60,\n MDT: -6 * 60,\n MST: -7 * 60,\n PDT: -7 * 60,\n PST: -8 * 60,\n};\n\nfunction fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n const result = {\n year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr),\n month: English.monthsShort.indexOf(monthStr) + 1,\n day: parseInteger(dayStr),\n hour: parseInteger(hourStr),\n minute: parseInteger(minuteStr),\n };\n\n if (secondStr) result.second = parseInteger(secondStr);\n if (weekdayStr) {\n result.weekday =\n weekdayStr.length > 3\n ? English.weekdaysLong.indexOf(weekdayStr) + 1\n : English.weekdaysShort.indexOf(weekdayStr) + 1;\n }\n\n return result;\n}\n\n// RFC 2822/5322\nconst rfc2822 =\n /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\\d\\d)(\\d\\d)))$/;\n\nfunction extractRFC2822(match) {\n const [\n ,\n weekdayStr,\n dayStr,\n monthStr,\n yearStr,\n hourStr,\n minuteStr,\n secondStr,\n obsOffset,\n milOffset,\n offHourStr,\n offMinuteStr,\n ] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n\n let offset;\n if (obsOffset) {\n offset = obsOffsets[obsOffset];\n } else if (milOffset) {\n offset = 0;\n } else {\n offset = signedOffset(offHourStr, offMinuteStr);\n }\n\n return [result, new FixedOffsetZone(offset)];\n}\n\nfunction preprocessRFC2822(s) {\n // Remove comments and folding whitespace and replace multiple-spaces with a single space\n return s\n .replace(/\\([^()]*\\)|[\\n\\t]/g, \" \")\n .replace(/(\\s\\s+)/g, \" \")\n .trim();\n}\n\n// http date\n\nconst rfc1123 =\n /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\\d\\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\\d{4}) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n rfc850 =\n /^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\\d\\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n ascii =\n /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \\d|\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) (\\d{4})$/;\n\nfunction extractRFC1123Or850(match) {\n const [, weekdayStr, dayStr, monthStr, yearStr, hourStr, minuteStr, secondStr] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n return [result, FixedOffsetZone.utcInstance];\n}\n\nfunction extractASCII(match) {\n const [, weekdayStr, monthStr, dayStr, hourStr, minuteStr, secondStr, yearStr] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n return [result, FixedOffsetZone.utcInstance];\n}\n\nconst isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex);\nconst isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex);\nconst isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex);\nconst isoTimeCombinedRegex = combineRegexes(isoTimeRegex);\n\nconst extractISOYmdTimeAndOffset = combineExtractors(\n extractISOYmd,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOWeekTimeAndOffset = combineExtractors(\n extractISOWeekData,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOOrdinalDateAndTime = combineExtractors(\n extractISOOrdinalData,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOTimeAndOffset = combineExtractors(\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\n\n/*\n * @private\n */\n\nexport function parseISODate(s) {\n return parse(\n s,\n [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset],\n [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime],\n [isoTimeCombinedRegex, extractISOTimeAndOffset]\n );\n}\n\nexport function parseRFC2822Date(s) {\n return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]);\n}\n\nexport function parseHTTPDate(s) {\n return parse(\n s,\n [rfc1123, extractRFC1123Or850],\n [rfc850, extractRFC1123Or850],\n [ascii, extractASCII]\n );\n}\n\nexport function parseISODuration(s) {\n return parse(s, [isoDuration, extractISODuration]);\n}\n\nconst extractISOTimeOnly = combineExtractors(extractISOTime);\n\nexport function parseISOTimeOnly(s) {\n return parse(s, [isoTimeOnly, extractISOTimeOnly]);\n}\n\nconst sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex);\nconst sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex);\n\nconst extractISOTimeOffsetAndIANAZone = combineExtractors(\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\n\nexport function parseSQL(s) {\n return parse(\n s,\n [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]\n );\n}\n","import { InvalidArgumentError, InvalidDurationError, InvalidUnitError } from \"./errors.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport Invalid from \"./impl/invalid.js\";\nimport Locale from \"./impl/locale.js\";\nimport { parseISODuration, parseISOTimeOnly } from \"./impl/regexParser.js\";\nimport {\n asNumber,\n hasOwnProperty,\n isNumber,\n isUndefined,\n normalizeObject,\n roundTo,\n} from \"./impl/util.js\";\nimport Settings from \"./settings.js\";\nimport DateTime from \"./datetime.js\";\n\nconst INVALID = \"Invalid Duration\";\n\n// unit conversion constants\nexport const lowOrderMatrix = {\n weeks: {\n days: 7,\n hours: 7 * 24,\n minutes: 7 * 24 * 60,\n seconds: 7 * 24 * 60 * 60,\n milliseconds: 7 * 24 * 60 * 60 * 1000,\n },\n days: {\n hours: 24,\n minutes: 24 * 60,\n seconds: 24 * 60 * 60,\n milliseconds: 24 * 60 * 60 * 1000,\n },\n hours: { minutes: 60, seconds: 60 * 60, milliseconds: 60 * 60 * 1000 },\n minutes: { seconds: 60, milliseconds: 60 * 1000 },\n seconds: { milliseconds: 1000 },\n },\n casualMatrix = {\n years: {\n quarters: 4,\n months: 12,\n weeks: 52,\n days: 365,\n hours: 365 * 24,\n minutes: 365 * 24 * 60,\n seconds: 365 * 24 * 60 * 60,\n milliseconds: 365 * 24 * 60 * 60 * 1000,\n },\n quarters: {\n months: 3,\n weeks: 13,\n days: 91,\n hours: 91 * 24,\n minutes: 91 * 24 * 60,\n seconds: 91 * 24 * 60 * 60,\n milliseconds: 91 * 24 * 60 * 60 * 1000,\n },\n months: {\n weeks: 4,\n days: 30,\n hours: 30 * 24,\n minutes: 30 * 24 * 60,\n seconds: 30 * 24 * 60 * 60,\n milliseconds: 30 * 24 * 60 * 60 * 1000,\n },\n\n ...lowOrderMatrix,\n },\n daysInYearAccurate = 146097.0 / 400,\n daysInMonthAccurate = 146097.0 / 4800,\n accurateMatrix = {\n years: {\n quarters: 4,\n months: 12,\n weeks: daysInYearAccurate / 7,\n days: daysInYearAccurate,\n hours: daysInYearAccurate * 24,\n minutes: daysInYearAccurate * 24 * 60,\n seconds: daysInYearAccurate * 24 * 60 * 60,\n milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000,\n },\n quarters: {\n months: 3,\n weeks: daysInYearAccurate / 28,\n days: daysInYearAccurate / 4,\n hours: (daysInYearAccurate * 24) / 4,\n minutes: (daysInYearAccurate * 24 * 60) / 4,\n seconds: (daysInYearAccurate * 24 * 60 * 60) / 4,\n milliseconds: (daysInYearAccurate * 24 * 60 * 60 * 1000) / 4,\n },\n months: {\n weeks: daysInMonthAccurate / 7,\n days: daysInMonthAccurate,\n hours: daysInMonthAccurate * 24,\n minutes: daysInMonthAccurate * 24 * 60,\n seconds: daysInMonthAccurate * 24 * 60 * 60,\n milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000,\n },\n ...lowOrderMatrix,\n };\n\n// units ordered by size\nconst orderedUnits = [\n \"years\",\n \"quarters\",\n \"months\",\n \"weeks\",\n \"days\",\n \"hours\",\n \"minutes\",\n \"seconds\",\n \"milliseconds\",\n];\n\nconst reverseUnits = orderedUnits.slice(0).reverse();\n\n// clone really means \"create another instance just like this one, but with these changes\"\nfunction clone(dur, alts, clear = false) {\n // deep merge for vals\n const conf = {\n values: clear ? alts.values : { ...dur.values, ...(alts.values || {}) },\n loc: dur.loc.clone(alts.loc),\n conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy,\n matrix: alts.matrix || dur.matrix,\n };\n return new Duration(conf);\n}\n\nfunction durationToMillis(matrix, vals) {\n let sum = vals.milliseconds ?? 0;\n for (const unit of reverseUnits.slice(1)) {\n if (vals[unit]) {\n sum += vals[unit] * matrix[unit][\"milliseconds\"];\n }\n }\n return sum;\n}\n\n// NB: mutates parameters\nfunction normalizeValues(matrix, vals) {\n // the logic below assumes the overall value of the duration is positive\n // if this is not the case, factor is used to make it so\n const factor = durationToMillis(matrix, vals) < 0 ? -1 : 1;\n\n orderedUnits.reduceRight((previous, current) => {\n if (!isUndefined(vals[current])) {\n if (previous) {\n const previousVal = vals[previous] * factor;\n const conv = matrix[current][previous];\n\n // if (previousVal < 0):\n // lower order unit is negative (e.g. { years: 2, days: -2 })\n // normalize this by reducing the higher order unit by the appropriate amount\n // and increasing the lower order unit\n // this can never make the higher order unit negative, because this function only operates\n // on positive durations, so the amount of time represented by the lower order unit cannot\n // be larger than the higher order unit\n // else:\n // lower order unit is positive (e.g. { years: 2, days: 450 } or { years: -2, days: 450 })\n // in this case we attempt to convert as much as possible from the lower order unit into\n // the higher order one\n //\n // Math.floor takes care of both of these cases, rounding away from 0\n // if previousVal < 0 it makes the absolute value larger\n // if previousVal >= it makes the absolute value smaller\n const rollUp = Math.floor(previousVal / conv);\n vals[current] += rollUp * factor;\n vals[previous] -= rollUp * conv * factor;\n }\n return current;\n } else {\n return previous;\n }\n }, null);\n\n // try to convert any decimals into smaller units if possible\n // for example for { years: 2.5, days: 0, seconds: 0 } we want to get { years: 2, days: 182, hours: 12 }\n orderedUnits.reduce((previous, current) => {\n if (!isUndefined(vals[current])) {\n if (previous) {\n const fraction = vals[previous] % 1;\n vals[previous] -= fraction;\n vals[current] += fraction * matrix[previous][current];\n }\n return current;\n } else {\n return previous;\n }\n }, null);\n}\n\n// Remove all properties with a value of 0 from an object\nfunction removeZeroes(vals) {\n const newVals = {};\n for (const [key, value] of Object.entries(vals)) {\n if (value !== 0) {\n newVals[key] = value;\n }\n }\n return newVals;\n}\n\n/**\n * A Duration object represents a period of time, like \"2 months\" or \"1 day, 1 hour\". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime#plus} to add a Duration object to a DateTime, producing another DateTime.\n *\n * Here is a brief overview of commonly used methods and getters in Duration:\n *\n * * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}.\n * * **Unit values** See the {@link Duration#years}, {@link Duration#months}, {@link Duration#weeks}, {@link Duration#days}, {@link Duration#hours}, {@link Duration#minutes}, {@link Duration#seconds}, {@link Duration#milliseconds} accessors.\n * * **Configuration** See {@link Duration#locale} and {@link Duration#numberingSystem} accessors.\n * * **Transformation** To create new Durations out of old ones use {@link Duration#plus}, {@link Duration#minus}, {@link Duration#normalize}, {@link Duration#set}, {@link Duration#reconfigure}, {@link Duration#shiftTo}, and {@link Duration#negate}.\n * * **Output** To convert the Duration into other representations, see {@link Duration#as}, {@link Duration#toISO}, {@link Duration#toFormat}, and {@link Duration#toJSON}\n *\n * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation.\n */\nexport default class Duration {\n /**\n * @private\n */\n constructor(config) {\n const accurate = config.conversionAccuracy === \"longterm\" || false;\n let matrix = accurate ? accurateMatrix : casualMatrix;\n\n if (config.matrix) {\n matrix = config.matrix;\n }\n\n /**\n * @access private\n */\n this.values = config.values;\n /**\n * @access private\n */\n this.loc = config.loc || Locale.create();\n /**\n * @access private\n */\n this.conversionAccuracy = accurate ? \"longterm\" : \"casual\";\n /**\n * @access private\n */\n this.invalid = config.invalid || null;\n /**\n * @access private\n */\n this.matrix = matrix;\n /**\n * @access private\n */\n this.isLuxonDuration = true;\n }\n\n /**\n * Create Duration from a number of milliseconds.\n * @param {number} count of milliseconds\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @return {Duration}\n */\n static fromMillis(count, opts) {\n return Duration.fromObject({ milliseconds: count }, opts);\n }\n\n /**\n * Create a Duration from a JavaScript object with keys like 'years' and 'hours'.\n * If this object is empty then a zero milliseconds duration is returned.\n * @param {Object} obj - the object to create the DateTime from\n * @param {number} obj.years\n * @param {number} obj.quarters\n * @param {number} obj.months\n * @param {number} obj.weeks\n * @param {number} obj.days\n * @param {number} obj.hours\n * @param {number} obj.minutes\n * @param {number} obj.seconds\n * @param {number} obj.milliseconds\n * @param {Object} [opts=[]] - options for creating this Duration\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the custom conversion system to use\n * @return {Duration}\n */\n static fromObject(obj, opts = {}) {\n if (obj == null || typeof obj !== \"object\") {\n throw new InvalidArgumentError(\n `Duration.fromObject: argument expected to be an object, got ${\n obj === null ? \"null\" : typeof obj\n }`\n );\n }\n\n return new Duration({\n values: normalizeObject(obj, Duration.normalizeUnit),\n loc: Locale.fromObject(opts),\n conversionAccuracy: opts.conversionAccuracy,\n matrix: opts.matrix,\n });\n }\n\n /**\n * Create a Duration from DurationLike.\n *\n * @param {Object | number | Duration} durationLike\n * One of:\n * - object with keys like 'years' and 'hours'.\n * - number representing milliseconds\n * - Duration instance\n * @return {Duration}\n */\n static fromDurationLike(durationLike) {\n if (isNumber(durationLike)) {\n return Duration.fromMillis(durationLike);\n } else if (Duration.isDuration(durationLike)) {\n return durationLike;\n } else if (typeof durationLike === \"object\") {\n return Duration.fromObject(durationLike);\n } else {\n throw new InvalidArgumentError(\n `Unknown duration argument ${durationLike} of type ${typeof durationLike}`\n );\n }\n }\n\n /**\n * Create a Duration from an ISO 8601 duration string.\n * @param {string} text - text to parse\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the preset conversion system to use\n * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 }\n * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 }\n * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 }\n * @return {Duration}\n */\n static fromISO(text, opts) {\n const [parsed] = parseISODuration(text);\n if (parsed) {\n return Duration.fromObject(parsed, opts);\n } else {\n return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n }\n\n /**\n * Create a Duration from an ISO 8601 time string.\n * @param {string} text - text to parse\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the conversion system to use\n * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n * @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 }\n * @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @return {Duration}\n */\n static fromISOTime(text, opts) {\n const [parsed] = parseISOTimeOnly(text);\n if (parsed) {\n return Duration.fromObject(parsed, opts);\n } else {\n return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n }\n\n /**\n * Create an invalid Duration.\n * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {Duration}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the Duration is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidDurationError(invalid);\n } else {\n return new Duration({ invalid });\n }\n }\n\n /**\n * @private\n */\n static normalizeUnit(unit) {\n const normalized = {\n year: \"years\",\n years: \"years\",\n quarter: \"quarters\",\n quarters: \"quarters\",\n month: \"months\",\n months: \"months\",\n week: \"weeks\",\n weeks: \"weeks\",\n day: \"days\",\n days: \"days\",\n hour: \"hours\",\n hours: \"hours\",\n minute: \"minutes\",\n minutes: \"minutes\",\n second: \"seconds\",\n seconds: \"seconds\",\n millisecond: \"milliseconds\",\n milliseconds: \"milliseconds\",\n }[unit ? unit.toLowerCase() : unit];\n\n if (!normalized) throw new InvalidUnitError(unit);\n\n return normalized;\n }\n\n /**\n * Check if an object is a Duration. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isDuration(o) {\n return (o && o.isLuxonDuration) || false;\n }\n\n /**\n * Get the locale of a Duration, such 'en-GB'\n * @type {string}\n */\n get locale() {\n return this.isValid ? this.loc.locale : null;\n }\n\n /**\n * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration\n *\n * @type {string}\n */\n get numberingSystem() {\n return this.isValid ? this.loc.numberingSystem : null;\n }\n\n /**\n * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens:\n * * `S` for milliseconds\n * * `s` for seconds\n * * `m` for minutes\n * * `h` for hours\n * * `d` for days\n * * `w` for weeks\n * * `M` for months\n * * `y` for years\n * Notes:\n * * Add padding by repeating the token, e.g. \"yy\" pads the years to two digits, \"hhhh\" pads the hours out to four digits\n * * Tokens can be escaped by wrapping with single quotes.\n * * The duration will be converted to the set of units in the format string using {@link Duration#shiftTo} and the Durations's conversion accuracy setting.\n * @param {string} fmt - the format string\n * @param {Object} opts - options\n * @param {boolean} [opts.floor=true] - floor numerical values\n * @param {'negative'|'all'|'negativeLargestOnly'} [opts.signMode=negative] - How to handle signs\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"y d s\") //=> \"1 6 2\"\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"yy dd sss\") //=> \"01 06 002\"\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"M S\") //=> \"12 518402000\"\n * @example Duration.fromObject({ days: 6, seconds: 2 }).toFormat(\"d s\", { signMode: \"all\" }) //=> \"+6 +2\"\n * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat(\"d s\", { signMode: \"all\" }) //=> \"-6 -2\"\n * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat(\"d s\", { signMode: \"negativeLargestOnly\" }) //=> \"-6 2\"\n * @return {string}\n */\n toFormat(fmt, opts = {}) {\n // reverse-compat since 1.2; we always round down now, never up, and we do it by default\n const fmtOpts = {\n ...opts,\n floor: opts.round !== false && opts.floor !== false,\n };\n return this.isValid\n ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt)\n : INVALID;\n }\n\n /**\n * Returns a string representation of a Duration with all units included.\n * To modify its behavior, use `listStyle` and any Intl.NumberFormat option, though `unitDisplay` is especially relevant.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options\n * @param {Object} opts - Formatting options. Accepts the same keys as the options parameter of the native `Intl.NumberFormat` constructor, as well as `listStyle`.\n * @param {string} [opts.listStyle='narrow'] - How to format the merged list. Corresponds to the `style` property of the options parameter of the native `Intl.ListFormat` constructor.\n * @param {boolean} [opts.showZeros=true] - Show all units previously used by the duration even if they are zero\n * @example\n * ```js\n * var dur = Duration.fromObject({ months: 1, weeks: 0, hours: 5, minutes: 6 })\n * dur.toHuman() //=> '1 month, 0 weeks, 5 hours, 6 minutes'\n * dur.toHuman({ listStyle: \"long\" }) //=> '1 month, 0 weeks, 5 hours, and 6 minutes'\n * dur.toHuman({ unitDisplay: \"short\" }) //=> '1 mth, 0 wks, 5 hr, 6 min'\n * dur.toHuman({ showZeros: false }) //=> '1 month, 5 hours, 6 minutes'\n * ```\n */\n toHuman(opts = {}) {\n if (!this.isValid) return INVALID;\n\n const showZeros = opts.showZeros !== false;\n\n const l = orderedUnits\n .map((unit) => {\n const val = this.values[unit];\n if (isUndefined(val) || (val === 0 && !showZeros)) {\n return null;\n }\n return this.loc\n .numberFormatter({ style: \"unit\", unitDisplay: \"long\", ...opts, unit: unit.slice(0, -1) })\n .format(val);\n })\n .filter((n) => n);\n\n return this.loc\n .listFormatter({ type: \"conjunction\", style: opts.listStyle || \"narrow\", ...opts })\n .format(l);\n }\n\n /**\n * Returns a JavaScript object with this Duration's values.\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 }\n * @return {Object}\n */\n toObject() {\n if (!this.isValid) return {};\n return { ...this.values };\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Duration.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S'\n * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S'\n * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M'\n * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M'\n * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S'\n * @return {string}\n */\n toISO() {\n // we could use the formatter, but this is an easier way to get the minimum string\n if (!this.isValid) return null;\n\n let s = \"P\";\n if (this.years !== 0) s += this.years + \"Y\";\n if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + \"M\";\n if (this.weeks !== 0) s += this.weeks + \"W\";\n if (this.days !== 0) s += this.days + \"D\";\n if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0)\n s += \"T\";\n if (this.hours !== 0) s += this.hours + \"H\";\n if (this.minutes !== 0) s += this.minutes + \"M\";\n if (this.seconds !== 0 || this.milliseconds !== 0)\n // this will handle \"floating point madness\" by removing extra decimal places\n // https://stackoverflow.com/questions/588004/is-floating-point-math-broken\n s += roundTo(this.seconds + this.milliseconds / 1000, 3) + \"S\";\n if (s === \"P\") s += \"T0S\";\n return s;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day.\n * Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000'\n * @return {string}\n */\n toISOTime(opts = {}) {\n if (!this.isValid) return null;\n\n const millis = this.toMillis();\n if (millis < 0 || millis >= 86400000) return null;\n\n opts = {\n suppressMilliseconds: false,\n suppressSeconds: false,\n includePrefix: false,\n format: \"extended\",\n ...opts,\n includeOffset: false,\n };\n\n const dateTime = DateTime.fromMillis(millis, { zone: \"UTC\" });\n return dateTime.toISOTime(opts);\n }\n\n /**\n * Returns an ISO 8601 representation of this Duration appropriate for use in JSON.\n * @return {string}\n */\n toJSON() {\n return this.toISO();\n }\n\n /**\n * Returns an ISO 8601 representation of this Duration appropriate for use in debugging.\n * @return {string}\n */\n toString() {\n return this.toISO();\n }\n\n /**\n * Returns a string representation of this Duration appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `Duration { values: ${JSON.stringify(this.values)} }`;\n } else {\n return `Duration { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns an milliseconds value of this Duration.\n * @return {number}\n */\n toMillis() {\n if (!this.isValid) return NaN;\n\n return durationToMillis(this.matrix, this.values);\n }\n\n /**\n * Returns an milliseconds value of this Duration. Alias of {@link toMillis}\n * @return {number}\n */\n valueOf() {\n return this.toMillis();\n }\n\n /**\n * Make this Duration longer by the specified amount. Return a newly-constructed Duration.\n * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @return {Duration}\n */\n plus(duration) {\n if (!this.isValid) return this;\n\n const dur = Duration.fromDurationLike(duration),\n result = {};\n\n for (const k of orderedUnits) {\n if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) {\n result[k] = dur.get(k) + this.get(k);\n }\n }\n\n return clone(this, { values: result }, true);\n }\n\n /**\n * Make this Duration shorter by the specified amount. Return a newly-constructed Duration.\n * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @return {Duration}\n */\n minus(duration) {\n if (!this.isValid) return this;\n\n const dur = Duration.fromDurationLike(duration);\n return this.plus(dur.negate());\n }\n\n /**\n * Scale this Duration by the specified amount. Return a newly-constructed Duration.\n * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number.\n * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits(x => x * 2) //=> { hours: 2, minutes: 60 }\n * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits((x, u) => u === \"hours\" ? x * 2 : x) //=> { hours: 2, minutes: 30 }\n * @return {Duration}\n */\n mapUnits(fn) {\n if (!this.isValid) return this;\n const result = {};\n for (const k of Object.keys(this.values)) {\n result[k] = asNumber(fn(this.values[k], k));\n }\n return clone(this, { values: result }, true);\n }\n\n /**\n * Get the value of unit.\n * @param {string} unit - a unit such as 'minute' or 'day'\n * @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2\n * @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0\n * @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3\n * @return {number}\n */\n get(unit) {\n return this[Duration.normalizeUnit(unit)];\n }\n\n /**\n * \"Set\" the values of specified units. Return a newly-constructed Duration.\n * @param {Object} values - a mapping of units to numbers\n * @example dur.set({ years: 2017 })\n * @example dur.set({ hours: 8, minutes: 30 })\n * @return {Duration}\n */\n set(values) {\n if (!this.isValid) return this;\n\n const mixed = { ...this.values, ...normalizeObject(values, Duration.normalizeUnit) };\n return clone(this, { values: mixed });\n }\n\n /**\n * \"Set\" the locale and/or numberingSystem. Returns a newly-constructed Duration.\n * @example dur.reconfigure({ locale: 'en-GB' })\n * @return {Duration}\n */\n reconfigure({ locale, numberingSystem, conversionAccuracy, matrix } = {}) {\n const loc = this.loc.clone({ locale, numberingSystem });\n const opts = { loc, matrix, conversionAccuracy };\n return clone(this, opts);\n }\n\n /**\n * Return the length of the duration in the specified unit.\n * @param {string} unit - a unit such as 'minutes' or 'days'\n * @example Duration.fromObject({years: 1}).as('days') //=> 365\n * @example Duration.fromObject({years: 1}).as('months') //=> 12\n * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5\n * @return {number}\n */\n as(unit) {\n return this.isValid ? this.shiftTo(unit).get(unit) : NaN;\n }\n\n /**\n * Reduce this Duration to its canonical representation in its current units.\n * Assuming the overall value of the Duration is positive, this means:\n * - excessive values for lower-order units are converted to higher-order units (if possible, see first and second example)\n * - negative lower-order units are converted to higher order units (there must be such a higher order unit, otherwise\n * the overall value would be negative, see third example)\n * - fractional values for higher-order units are converted to lower-order units (if possible, see fourth example)\n *\n * If the overall value is negative, the result of this method is equivalent to `this.negate().normalize().negate()`.\n * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 }\n * @example Duration.fromObject({ days: 5000 }).normalize().toObject() //=> { days: 5000 }\n * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 }\n * @example Duration.fromObject({ years: 2.5, days: 0, hours: 0 }).normalize().toObject() //=> { years: 2, days: 182, hours: 12 }\n * @return {Duration}\n */\n normalize() {\n if (!this.isValid) return this;\n const vals = this.toObject();\n normalizeValues(this.matrix, vals);\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Rescale units to its largest representation\n * @example Duration.fromObject({ milliseconds: 90000 }).rescale().toObject() //=> { minutes: 1, seconds: 30 }\n * @return {Duration}\n */\n rescale() {\n if (!this.isValid) return this;\n const vals = removeZeroes(this.normalize().shiftToAll().toObject());\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Convert this Duration into its representation in a different set of units.\n * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 }\n * @return {Duration}\n */\n shiftTo(...units) {\n if (!this.isValid) return this;\n\n if (units.length === 0) {\n return this;\n }\n\n units = units.map((u) => Duration.normalizeUnit(u));\n\n const built = {},\n accumulated = {},\n vals = this.toObject();\n let lastUnit;\n\n for (const k of orderedUnits) {\n if (units.indexOf(k) >= 0) {\n lastUnit = k;\n\n let own = 0;\n\n // anything we haven't boiled down yet should get boiled to this unit\n for (const ak in accumulated) {\n own += this.matrix[ak][k] * accumulated[ak];\n accumulated[ak] = 0;\n }\n\n // plus anything that's already in this unit\n if (isNumber(vals[k])) {\n own += vals[k];\n }\n\n // only keep the integer part for now in the hopes of putting any decimal part\n // into a smaller unit later\n const i = Math.trunc(own);\n built[k] = i;\n accumulated[k] = (own * 1000 - i * 1000) / 1000;\n\n // otherwise, keep it in the wings to boil it later\n } else if (isNumber(vals[k])) {\n accumulated[k] = vals[k];\n }\n }\n\n // anything leftover becomes the decimal for the last unit\n // lastUnit must be defined since units is not empty\n for (const key in accumulated) {\n if (accumulated[key] !== 0) {\n built[lastUnit] +=\n key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key];\n }\n }\n\n normalizeValues(this.matrix, built);\n return clone(this, { values: built }, true);\n }\n\n /**\n * Shift this Duration to all available units.\n * Same as shiftTo(\"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", \"seconds\", \"milliseconds\")\n * @return {Duration}\n */\n shiftToAll() {\n if (!this.isValid) return this;\n return this.shiftTo(\n \"years\",\n \"months\",\n \"weeks\",\n \"days\",\n \"hours\",\n \"minutes\",\n \"seconds\",\n \"milliseconds\"\n );\n }\n\n /**\n * Return the negative of this Duration.\n * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 }\n * @return {Duration}\n */\n negate() {\n if (!this.isValid) return this;\n const negated = {};\n for (const k of Object.keys(this.values)) {\n negated[k] = this.values[k] === 0 ? 0 : -this.values[k];\n }\n return clone(this, { values: negated }, true);\n }\n\n /**\n * Removes all units with values equal to 0 from this Duration.\n * @example Duration.fromObject({ years: 2, days: 0, hours: 0, minutes: 0 }).removeZeros().toObject() //=> { years: 2 }\n * @return {Duration}\n */\n removeZeros() {\n if (!this.isValid) return this;\n const vals = removeZeroes(this.values);\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Get the years.\n * @type {number}\n */\n get years() {\n return this.isValid ? this.values.years || 0 : NaN;\n }\n\n /**\n * Get the quarters.\n * @type {number}\n */\n get quarters() {\n return this.isValid ? this.values.quarters || 0 : NaN;\n }\n\n /**\n * Get the months.\n * @type {number}\n */\n get months() {\n return this.isValid ? this.values.months || 0 : NaN;\n }\n\n /**\n * Get the weeks\n * @type {number}\n */\n get weeks() {\n return this.isValid ? this.values.weeks || 0 : NaN;\n }\n\n /**\n * Get the days.\n * @type {number}\n */\n get days() {\n return this.isValid ? this.values.days || 0 : NaN;\n }\n\n /**\n * Get the hours.\n * @type {number}\n */\n get hours() {\n return this.isValid ? this.values.hours || 0 : NaN;\n }\n\n /**\n * Get the minutes.\n * @type {number}\n */\n get minutes() {\n return this.isValid ? this.values.minutes || 0 : NaN;\n }\n\n /**\n * Get the seconds.\n * @return {number}\n */\n get seconds() {\n return this.isValid ? this.values.seconds || 0 : NaN;\n }\n\n /**\n * Get the milliseconds.\n * @return {number}\n */\n get milliseconds() {\n return this.isValid ? this.values.milliseconds || 0 : NaN;\n }\n\n /**\n * Returns whether the Duration is invalid. Invalid durations are returned by diff operations\n * on invalid DateTimes or Intervals.\n * @return {boolean}\n */\n get isValid() {\n return this.invalid === null;\n }\n\n /**\n * Returns an error code if this Duration became invalid, or null if the Duration is valid\n * @return {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this Duration became invalid, or null if the Duration is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Equality check\n * Two Durations are equal iff they have the same units and the same values for each unit.\n * @param {Duration} other\n * @return {boolean}\n */\n equals(other) {\n if (!this.isValid || !other.isValid) {\n return false;\n }\n\n if (!this.loc.equals(other.loc)) {\n return false;\n }\n\n function eq(v1, v2) {\n // Consider 0 and undefined as equal\n if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0;\n return v1 === v2;\n }\n\n for (const u of orderedUnits) {\n if (!eq(this.values[u], other.values[u])) {\n return false;\n }\n }\n return true;\n }\n}\n","import DateTime, { friendlyDateTime } from \"./datetime.js\";\nimport Duration from \"./duration.js\";\nimport Settings from \"./settings.js\";\nimport { InvalidArgumentError, InvalidIntervalError } from \"./errors.js\";\nimport Invalid from \"./impl/invalid.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport * as Formats from \"./impl/formats.js\";\n\nconst INVALID = \"Invalid Interval\";\n\n// checks if the start is equal to or before the end\nfunction validateStartEnd(start, end) {\n if (!start || !start.isValid) {\n return Interval.invalid(\"missing or invalid start\");\n } else if (!end || !end.isValid) {\n return Interval.invalid(\"missing or invalid end\");\n } else if (end < start) {\n return Interval.invalid(\n \"end before start\",\n `The end of an interval must be after its start, but you had start=${start.toISO()} and end=${end.toISO()}`\n );\n } else {\n return null;\n }\n}\n\n/**\n * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them.\n *\n * Here is a brief overview of the most commonly used methods and getters in Interval:\n *\n * * **Creation** To create an Interval, use {@link Interval.fromDateTimes}, {@link Interval.after}, {@link Interval.before}, or {@link Interval.fromISO}.\n * * **Accessors** Use {@link Interval#start} and {@link Interval#end} to get the start and end.\n * * **Interrogation** To analyze the Interval, use {@link Interval#count}, {@link Interval#length}, {@link Interval#hasSame}, {@link Interval#contains}, {@link Interval#isAfter}, or {@link Interval#isBefore}.\n * * **Transformation** To create other Intervals out of this one, use {@link Interval#set}, {@link Interval#splitAt}, {@link Interval#splitBy}, {@link Interval#divideEqually}, {@link Interval.merge}, {@link Interval.xor}, {@link Interval#union}, {@link Interval#intersection}, or {@link Interval#difference}.\n * * **Comparison** To compare this Interval to another one, use {@link Interval#equals}, {@link Interval#overlaps}, {@link Interval#abutsStart}, {@link Interval#abutsEnd}, {@link Interval#engulfs}\n * * **Output** To convert the Interval into other representations, see {@link Interval#toString}, {@link Interval#toLocaleString}, {@link Interval#toISO}, {@link Interval#toISODate}, {@link Interval#toISOTime}, {@link Interval#toFormat}, and {@link Interval#toDuration}.\n */\nexport default class Interval {\n /**\n * @private\n */\n constructor(config) {\n /**\n * @access private\n */\n this.s = config.start;\n /**\n * @access private\n */\n this.e = config.end;\n /**\n * @access private\n */\n this.invalid = config.invalid || null;\n /**\n * @access private\n */\n this.isLuxonInterval = true;\n }\n\n /**\n * Create an invalid Interval.\n * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {Interval}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the Interval is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidIntervalError(invalid);\n } else {\n return new Interval({ invalid });\n }\n }\n\n /**\n * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end.\n * @param {DateTime|Date|Object} start\n * @param {DateTime|Date|Object} end\n * @return {Interval}\n */\n static fromDateTimes(start, end) {\n const builtStart = friendlyDateTime(start),\n builtEnd = friendlyDateTime(end);\n\n const validateError = validateStartEnd(builtStart, builtEnd);\n\n if (validateError == null) {\n return new Interval({\n start: builtStart,\n end: builtEnd,\n });\n } else {\n return validateError;\n }\n }\n\n /**\n * Create an Interval from a start DateTime and a Duration to extend to.\n * @param {DateTime|Date|Object} start\n * @param {Duration|Object|number} duration - the length of the Interval.\n * @return {Interval}\n */\n static after(start, duration) {\n const dur = Duration.fromDurationLike(duration),\n dt = friendlyDateTime(start);\n return Interval.fromDateTimes(dt, dt.plus(dur));\n }\n\n /**\n * Create an Interval from an end DateTime and a Duration to extend backwards to.\n * @param {DateTime|Date|Object} end\n * @param {Duration|Object|number} duration - the length of the Interval.\n * @return {Interval}\n */\n static before(end, duration) {\n const dur = Duration.fromDurationLike(duration),\n dt = friendlyDateTime(end);\n return Interval.fromDateTimes(dt.minus(dur), dt);\n }\n\n /**\n * Create an Interval from an ISO 8601 string.\n * Accepts `/`, `/`, and `/` formats.\n * @param {string} text - the ISO string to parse\n * @param {Object} [opts] - options to pass {@link DateTime#fromISO} and optionally {@link Duration#fromISO}\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @return {Interval}\n */\n static fromISO(text, opts) {\n const [s, e] = (text || \"\").split(\"/\", 2);\n if (s && e) {\n let start, startIsValid;\n try {\n start = DateTime.fromISO(s, opts);\n startIsValid = start.isValid;\n } catch (e) {\n startIsValid = false;\n }\n\n let end, endIsValid;\n try {\n end = DateTime.fromISO(e, opts);\n endIsValid = end.isValid;\n } catch (e) {\n endIsValid = false;\n }\n\n if (startIsValid && endIsValid) {\n return Interval.fromDateTimes(start, end);\n }\n\n if (startIsValid) {\n const dur = Duration.fromISO(e, opts);\n if (dur.isValid) {\n return Interval.after(start, dur);\n }\n } else if (endIsValid) {\n const dur = Duration.fromISO(s, opts);\n if (dur.isValid) {\n return Interval.before(end, dur);\n }\n }\n }\n return Interval.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n\n /**\n * Check if an object is an Interval. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isInterval(o) {\n return (o && o.isLuxonInterval) || false;\n }\n\n /**\n * Returns the start of the Interval\n * @type {DateTime}\n */\n get start() {\n return this.isValid ? this.s : null;\n }\n\n /**\n * Returns the end of the Interval. This is the first instant which is not part of the interval\n * (Interval is half-open).\n * @type {DateTime}\n */\n get end() {\n return this.isValid ? this.e : null;\n }\n\n /**\n * Returns the last DateTime included in the interval (since end is not part of the interval)\n * @type {DateTime}\n */\n get lastDateTime() {\n return this.isValid ? (this.e ? this.e.minus(1) : null) : null;\n }\n\n /**\n * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'.\n * @type {boolean}\n */\n get isValid() {\n return this.invalidReason === null;\n }\n\n /**\n * Returns an error code if this Interval is invalid, or null if the Interval is valid\n * @type {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this Interval became invalid, or null if the Interval is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Returns the length of the Interval in the specified unit.\n * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in.\n * @return {number}\n */\n length(unit = \"milliseconds\") {\n return this.isValid ? this.toDuration(...[unit]).get(unit) : NaN;\n }\n\n /**\n * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part.\n * Unlike {@link Interval#length} this counts sections of the calendar, not periods of time, e.g. specifying 'day'\n * asks 'what dates are included in this interval?', not 'how many days long is this interval?'\n * @param {string} [unit='milliseconds'] - the unit of time to count.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; this operation will always use the locale of the start DateTime\n * @return {number}\n */\n count(unit = \"milliseconds\", opts) {\n if (!this.isValid) return NaN;\n const start = this.start.startOf(unit, opts);\n let end;\n if (opts?.useLocaleWeeks) {\n end = this.end.reconfigure({ locale: start.locale });\n } else {\n end = this.end;\n }\n end = end.startOf(unit, opts);\n return Math.floor(end.diff(start, unit).get(unit)) + (end.valueOf() !== this.end.valueOf());\n }\n\n /**\n * Returns whether this Interval's start and end are both in the same unit of time\n * @param {string} unit - the unit of time to check sameness on\n * @return {boolean}\n */\n hasSame(unit) {\n return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false;\n }\n\n /**\n * Return whether this Interval has the same start and end DateTimes.\n * @return {boolean}\n */\n isEmpty() {\n return this.s.valueOf() === this.e.valueOf();\n }\n\n /**\n * Return whether this Interval's start is after the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n isAfter(dateTime) {\n if (!this.isValid) return false;\n return this.s > dateTime;\n }\n\n /**\n * Return whether this Interval's end is before the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n isBefore(dateTime) {\n if (!this.isValid) return false;\n return this.e <= dateTime;\n }\n\n /**\n * Return whether this Interval contains the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n contains(dateTime) {\n if (!this.isValid) return false;\n return this.s <= dateTime && this.e > dateTime;\n }\n\n /**\n * \"Sets\" the start and/or end dates. Returns a newly-constructed Interval.\n * @param {Object} values - the values to set\n * @param {DateTime} values.start - the starting DateTime\n * @param {DateTime} values.end - the ending DateTime\n * @return {Interval}\n */\n set({ start, end } = {}) {\n if (!this.isValid) return this;\n return Interval.fromDateTimes(start || this.s, end || this.e);\n }\n\n /**\n * Split this Interval at each of the specified DateTimes\n * @param {...DateTime} dateTimes - the unit of time to count.\n * @return {Array}\n */\n splitAt(...dateTimes) {\n if (!this.isValid) return [];\n const sorted = dateTimes\n .map(friendlyDateTime)\n .filter((d) => this.contains(d))\n .sort((a, b) => a.toMillis() - b.toMillis()),\n results = [];\n let { s } = this,\n i = 0;\n\n while (s < this.e) {\n const added = sorted[i] || this.e,\n next = +added > +this.e ? this.e : added;\n results.push(Interval.fromDateTimes(s, next));\n s = next;\n i += 1;\n }\n\n return results;\n }\n\n /**\n * Split this Interval into smaller Intervals, each of the specified length.\n * Left over time is grouped into a smaller interval\n * @param {Duration|Object|number} duration - The length of each resulting interval.\n * @return {Array}\n */\n splitBy(duration) {\n const dur = Duration.fromDurationLike(duration);\n\n if (!this.isValid || !dur.isValid || dur.as(\"milliseconds\") === 0) {\n return [];\n }\n\n let { s } = this,\n idx = 1,\n next;\n\n const results = [];\n while (s < this.e) {\n const added = this.start.plus(dur.mapUnits((x) => x * idx));\n next = +added > +this.e ? this.e : added;\n results.push(Interval.fromDateTimes(s, next));\n s = next;\n idx += 1;\n }\n\n return results;\n }\n\n /**\n * Split this Interval into the specified number of smaller intervals.\n * @param {number} numberOfParts - The number of Intervals to divide the Interval into.\n * @return {Array}\n */\n divideEqually(numberOfParts) {\n if (!this.isValid) return [];\n return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts);\n }\n\n /**\n * Return whether this Interval overlaps with the specified Interval\n * @param {Interval} other\n * @return {boolean}\n */\n overlaps(other) {\n return this.e > other.s && this.s < other.e;\n }\n\n /**\n * Return whether this Interval's end is adjacent to the specified Interval's start.\n * @param {Interval} other\n * @return {boolean}\n */\n abutsStart(other) {\n if (!this.isValid) return false;\n return +this.e === +other.s;\n }\n\n /**\n * Return whether this Interval's start is adjacent to the specified Interval's end.\n * @param {Interval} other\n * @return {boolean}\n */\n abutsEnd(other) {\n if (!this.isValid) return false;\n return +other.e === +this.s;\n }\n\n /**\n * Returns true if this Interval fully contains the specified Interval, specifically if the intersect (of this Interval and the other Interval) is equal to the other Interval; false otherwise.\n * @param {Interval} other\n * @return {boolean}\n */\n engulfs(other) {\n if (!this.isValid) return false;\n return this.s <= other.s && this.e >= other.e;\n }\n\n /**\n * Return whether this Interval has the same start and end as the specified Interval.\n * @param {Interval} other\n * @return {boolean}\n */\n equals(other) {\n if (!this.isValid || !other.isValid) {\n return false;\n }\n\n return this.s.equals(other.s) && this.e.equals(other.e);\n }\n\n /**\n * Return an Interval representing the intersection of this Interval and the specified Interval.\n * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals.\n * Returns null if the intersection is empty, meaning, the intervals don't intersect.\n * @param {Interval} other\n * @return {Interval}\n */\n intersection(other) {\n if (!this.isValid) return this;\n const s = this.s > other.s ? this.s : other.s,\n e = this.e < other.e ? this.e : other.e;\n\n if (s >= e) {\n return null;\n } else {\n return Interval.fromDateTimes(s, e);\n }\n }\n\n /**\n * Return an Interval representing the union of this Interval and the specified Interval.\n * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals.\n * @param {Interval} other\n * @return {Interval}\n */\n union(other) {\n if (!this.isValid) return this;\n const s = this.s < other.s ? this.s : other.s,\n e = this.e > other.e ? this.e : other.e;\n return Interval.fromDateTimes(s, e);\n }\n\n /**\n * Merge an array of Intervals into an equivalent minimal set of Intervals.\n * Combines overlapping and adjacent Intervals.\n * The resulting array will contain the Intervals in ascending order, that is, starting with the earliest Interval\n * and ending with the latest.\n *\n * @param {Array} intervals\n * @return {Array}\n */\n static merge(intervals) {\n const [found, final] = intervals\n .sort((a, b) => a.s - b.s)\n .reduce(\n ([sofar, current], item) => {\n if (!current) {\n return [sofar, item];\n } else if (current.overlaps(item) || current.abutsStart(item)) {\n return [sofar, current.union(item)];\n } else {\n return [sofar.concat([current]), item];\n }\n },\n [[], null]\n );\n if (final) {\n found.push(final);\n }\n return found;\n }\n\n /**\n * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals.\n * @param {Array} intervals\n * @return {Array}\n */\n static xor(intervals) {\n let start = null,\n currentCount = 0;\n const results = [],\n ends = intervals.map((i) => [\n { time: i.s, type: \"s\" },\n { time: i.e, type: \"e\" },\n ]),\n flattened = Array.prototype.concat(...ends),\n arr = flattened.sort((a, b) => a.time - b.time);\n\n for (const i of arr) {\n currentCount += i.type === \"s\" ? 1 : -1;\n\n if (currentCount === 1) {\n start = i.time;\n } else {\n if (start && +start !== +i.time) {\n results.push(Interval.fromDateTimes(start, i.time));\n }\n\n start = null;\n }\n }\n\n return Interval.merge(results);\n }\n\n /**\n * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals.\n * @param {...Interval} intervals\n * @return {Array}\n */\n difference(...intervals) {\n return Interval.xor([this].concat(intervals))\n .map((i) => this.intersection(i))\n .filter((i) => i && !i.isEmpty());\n }\n\n /**\n * Returns a string representation of this Interval appropriate for debugging.\n * @return {string}\n */\n toString() {\n if (!this.isValid) return INVALID;\n return `[${this.s.toISO()} – ${this.e.toISO()})`;\n }\n\n /**\n * Returns a string representation of this Interval appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `Interval { start: ${this.s.toISO()}, end: ${this.e.toISO()} }`;\n } else {\n return `Interval { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns a localized string representing this Interval. Accepts the same options as the\n * Intl.DateTimeFormat constructor and any presets defined by Luxon, such as\n * {@link DateTime.DATE_FULL} or {@link DateTime.TIME_SIMPLE}. The exact behavior of this method\n * is browser-specific, but in general it will return an appropriate representation of the\n * Interval in the assigned locale. Defaults to the system's locale if no locale has been\n * specified.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {Object} [formatOpts=DateTime.DATE_SHORT] - Either a DateTime preset or\n * Intl.DateTimeFormat constructor options.\n * @param {Object} opts - Options to override the configuration of the start DateTime.\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(); //=> 11/7/2022 – 11/8/2022\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL); //=> November 7 – 8, 2022\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL, { locale: 'fr-FR' }); //=> 7–8 novembre 2022\n * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString(DateTime.TIME_SIMPLE); //=> 6:00 – 8:00 PM\n * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> Mon, Nov 07, 6:00 – 8:00 p\n * @return {string}\n */\n toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) {\n return this.isValid\n ? Formatter.create(this.s.loc.clone(opts), formatOpts).formatInterval(this)\n : INVALID;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Interval.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @param {Object} opts - The same options as {@link DateTime#toISO}\n * @return {string}\n */\n toISO(opts) {\n if (!this.isValid) return INVALID;\n return `${this.s.toISO(opts)}/${this.e.toISO(opts)}`;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of date of this Interval.\n * The time components are ignored.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @return {string}\n */\n toISODate() {\n if (!this.isValid) return INVALID;\n return `${this.s.toISODate()}/${this.e.toISODate()}`;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of time of this Interval.\n * The date components are ignored.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @param {Object} opts - The same options as {@link DateTime#toISO}\n * @return {string}\n */\n toISOTime(opts) {\n if (!this.isValid) return INVALID;\n return `${this.s.toISOTime(opts)}/${this.e.toISOTime(opts)}`;\n }\n\n /**\n * Returns a string representation of this Interval formatted according to the specified format\n * string. **You may not want this.** See {@link Interval#toLocaleString} for a more flexible\n * formatting tool.\n * @param {string} dateFormat - The format string. This string formats the start and end time.\n * See {@link DateTime#toFormat} for details.\n * @param {Object} opts - Options.\n * @param {string} [opts.separator = ' – '] - A separator to place between the start and end\n * representations.\n * @return {string}\n */\n toFormat(dateFormat, { separator = \" – \" } = {}) {\n if (!this.isValid) return INVALID;\n return `${this.s.toFormat(dateFormat)}${separator}${this.e.toFormat(dateFormat)}`;\n }\n\n /**\n * Return a Duration representing the time spanned by this interval.\n * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration.\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 }\n * @return {Duration}\n */\n toDuration(unit, opts) {\n if (!this.isValid) {\n return Duration.invalid(this.invalidReason);\n }\n return this.e.diff(this.s, unit, opts);\n }\n\n /**\n * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes\n * @param {function} mapFn\n * @return {Interval}\n * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC())\n * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 }))\n */\n mapEndpoints(mapFn) {\n return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e));\n }\n}\n","import DateTime from \"./datetime.js\";\nimport Settings from \"./settings.js\";\nimport Locale from \"./impl/locale.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\n\nimport { hasLocaleWeekInfo, hasRelative } from \"./impl/util.js\";\n\n/**\n * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment.\n */\nexport default class Info {\n /**\n * Return whether the specified zone contains a DST.\n * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone.\n * @return {boolean}\n */\n static hasDST(zone = Settings.defaultZone) {\n const proto = DateTime.now().setZone(zone).set({ month: 12 });\n\n return !zone.isUniversal && proto.offset !== proto.set({ month: 6 }).offset;\n }\n\n /**\n * Return whether the specified zone is a valid IANA specifier.\n * @param {string} zone - Zone to check\n * @return {boolean}\n */\n static isValidIANAZone(zone) {\n return IANAZone.isValidZone(zone);\n }\n\n /**\n * Converts the input into a {@link Zone} instance.\n *\n * * If `input` is already a Zone instance, it is returned unchanged.\n * * If `input` is a string containing a valid time zone name, a Zone instance\n * with that name is returned.\n * * If `input` is a string that doesn't refer to a known time zone, a Zone\n * instance with {@link Zone#isValid} == false is returned.\n * * If `input is a number, a Zone instance with the specified fixed offset\n * in minutes is returned.\n * * If `input` is `null` or `undefined`, the default zone is returned.\n * @param {string|Zone|number} [input] - the value to be converted\n * @return {Zone}\n */\n static normalizeZone(input) {\n return normalizeZone(input, Settings.defaultZone);\n }\n\n /**\n * Get the weekday on which the week starts according to the given locale.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number} the start of the week, 1 for Monday through 7 for Sunday\n */\n static getStartOfWeek({ locale = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale)).getStartOfWeek();\n }\n\n /**\n * Get the minimum number of days necessary in a week before it is considered part of the next year according\n * to the given locale.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number}\n */\n static getMinimumDaysInFirstWeek({ locale = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale)).getMinDaysInFirstWeek();\n }\n\n /**\n * Get the weekdays, which are considered the weekend according to the given locale\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number[]} an array of weekdays, 1 for Monday through 7 for Sunday\n */\n static getWeekendWeekdays({ locale = null, locObj = null } = {}) {\n // copy the array, because we cache it internally\n return (locObj || Locale.create(locale)).getWeekendDays().slice();\n }\n\n /**\n * Return an array of standalone month names.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @param {string} [opts.outputCalendar='gregory'] - the calendar\n * @example Info.months()[0] //=> 'January'\n * @example Info.months('short')[0] //=> 'Jan'\n * @example Info.months('numeric')[0] //=> '1'\n * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.'\n * @example Info.months('numeric', { locale: 'ar' })[0] //=> '١'\n * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I'\n * @return {Array}\n */\n static months(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length);\n }\n\n /**\n * Return an array of format month names.\n * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that\n * changes the string.\n * See {@link Info#months}\n * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @param {string} [opts.outputCalendar='gregory'] - the calendar\n * @return {Array}\n */\n static monthsFormat(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true);\n }\n\n /**\n * Return an array of standalone week names.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {string} [length='long'] - the length of the weekday representation, such as \"narrow\", \"short\", \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @example Info.weekdays()[0] //=> 'Monday'\n * @example Info.weekdays('short')[0] //=> 'Mon'\n * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.'\n * @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين'\n * @return {Array}\n */\n static weekdays(length = \"long\", { locale = null, numberingSystem = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length);\n }\n\n /**\n * Return an array of format week names.\n * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that\n * changes the string.\n * See {@link Info#weekdays}\n * @param {string} [length='long'] - the length of the month representation, such as \"narrow\", \"short\", \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale=null] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @return {Array}\n */\n static weekdaysFormat(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true);\n }\n\n /**\n * Return an array of meridiems.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @example Info.meridiems() //=> [ 'AM', 'PM' ]\n * @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ]\n * @return {Array}\n */\n static meridiems({ locale = null } = {}) {\n return Locale.create(locale).meridiems();\n }\n\n /**\n * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian.\n * @param {string} [length='short'] - the length of the era representation, such as \"short\" or \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @example Info.eras() //=> [ 'BC', 'AD' ]\n * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ]\n * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ]\n * @return {Array}\n */\n static eras(length = \"short\", { locale = null } = {}) {\n return Locale.create(locale, null, \"gregory\").eras(length);\n }\n\n /**\n * Return the set of available features in this environment.\n * Some features of Luxon are not available in all environments. For example, on older browsers, relative time formatting support is not available. Use this function to figure out if that's the case.\n * Keys:\n * * `relative`: whether this environment supports relative time formatting\n * * `localeWeek`: whether this environment supports different weekdays for the start of the week based on the locale\n * @example Info.features() //=> { relative: false, localeWeek: true }\n * @return {Object}\n */\n static features() {\n return { relative: hasRelative(), localeWeek: hasLocaleWeekInfo() };\n }\n}\n","import Duration from \"../duration.js\";\n\nfunction dayDiff(earlier, later) {\n const utcDayStart = (dt) => dt.toUTC(0, { keepLocalTime: true }).startOf(\"day\").valueOf(),\n ms = utcDayStart(later) - utcDayStart(earlier);\n return Math.floor(Duration.fromMillis(ms).as(\"days\"));\n}\n\nfunction highOrderDiffs(cursor, later, units) {\n const differs = [\n [\"years\", (a, b) => b.year - a.year],\n [\"quarters\", (a, b) => b.quarter - a.quarter + (b.year - a.year) * 4],\n [\"months\", (a, b) => b.month - a.month + (b.year - a.year) * 12],\n [\n \"weeks\",\n (a, b) => {\n const days = dayDiff(a, b);\n return (days - (days % 7)) / 7;\n },\n ],\n [\"days\", dayDiff],\n ];\n\n const results = {};\n const earlier = cursor;\n let lowestOrder, highWater;\n\n /* This loop tries to diff using larger units first.\n If we overshoot, we backtrack and try the next smaller unit.\n \"cursor\" starts out at the earlier timestamp and moves closer and closer to \"later\"\n as we use smaller and smaller units.\n highWater keeps track of where we would be if we added one more of the smallest unit,\n this is used later to potentially convert any difference smaller than the smallest higher order unit\n into a fraction of that smallest higher order unit\n */\n for (const [unit, differ] of differs) {\n if (units.indexOf(unit) >= 0) {\n lowestOrder = unit;\n\n results[unit] = differ(cursor, later);\n highWater = earlier.plus(results);\n\n if (highWater > later) {\n // we overshot the end point, backtrack cursor by 1\n results[unit]--;\n cursor = earlier.plus(results);\n\n // if we are still overshooting now, we need to backtrack again\n // this happens in certain situations when diffing times in different zones,\n // because this calculation ignores time zones\n if (cursor > later) {\n // keep the \"overshot by 1\" around as highWater\n highWater = cursor;\n // backtrack cursor by 1\n results[unit]--;\n cursor = earlier.plus(results);\n }\n } else {\n cursor = highWater;\n }\n }\n }\n\n return [cursor, results, highWater, lowestOrder];\n}\n\nexport default function (earlier, later, units, opts) {\n let [cursor, results, highWater, lowestOrder] = highOrderDiffs(earlier, later, units);\n\n const remainingMillis = later - cursor;\n\n const lowerOrderUnits = units.filter(\n (u) => [\"hours\", \"minutes\", \"seconds\", \"milliseconds\"].indexOf(u) >= 0\n );\n\n if (lowerOrderUnits.length === 0) {\n if (highWater < later) {\n highWater = cursor.plus({ [lowestOrder]: 1 });\n }\n\n if (highWater !== cursor) {\n results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor);\n }\n }\n\n const duration = Duration.fromObject(results, opts);\n\n if (lowerOrderUnits.length > 0) {\n return Duration.fromMillis(remainingMillis, opts)\n .shiftTo(...lowerOrderUnits)\n .plus(duration);\n } else {\n return duration;\n }\n}\n","import { parseMillis, isUndefined, untruncateYear, signedOffset, hasOwnProperty } from \"./util.js\";\nimport Formatter from \"./formatter.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\nimport DateTime from \"../datetime.js\";\nimport { digitRegex, parseDigits } from \"./digits.js\";\nimport { ConflictingSpecificationError } from \"../errors.js\";\n\nconst MISSING_FTP = \"missing Intl.DateTimeFormat.formatToParts support\";\n\nfunction intUnit(regex, post = (i) => i) {\n return { regex, deser: ([s]) => post(parseDigits(s)) };\n}\n\nconst NBSP = String.fromCharCode(160);\nconst spaceOrNBSP = `[ ${NBSP}]`;\nconst spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, \"g\");\n\nfunction fixListRegex(s) {\n // make dots optional and also make them literal\n // make space and non breakable space characters interchangeable\n return s.replace(/\\./g, \"\\\\.?\").replace(spaceOrNBSPRegExp, spaceOrNBSP);\n}\n\nfunction stripInsensitivities(s) {\n return s\n .replace(/\\./g, \"\") // ignore dots that were made optional\n .replace(spaceOrNBSPRegExp, \" \") // interchange space and nbsp\n .toLowerCase();\n}\n\nfunction oneOf(strings, startIndex) {\n if (strings === null) {\n return null;\n } else {\n return {\n regex: RegExp(strings.map(fixListRegex).join(\"|\")),\n deser: ([s]) =>\n strings.findIndex((i) => stripInsensitivities(s) === stripInsensitivities(i)) + startIndex,\n };\n }\n}\n\nfunction offset(regex, groups) {\n return { regex, deser: ([, h, m]) => signedOffset(h, m), groups };\n}\n\nfunction simple(regex) {\n return { regex, deser: ([s]) => s };\n}\n\nfunction escapeToken(value) {\n return value.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\");\n}\n\n/**\n * @param token\n * @param {Locale} loc\n */\nfunction unitForToken(token, loc) {\n const one = digitRegex(loc),\n two = digitRegex(loc, \"{2}\"),\n three = digitRegex(loc, \"{3}\"),\n four = digitRegex(loc, \"{4}\"),\n six = digitRegex(loc, \"{6}\"),\n oneOrTwo = digitRegex(loc, \"{1,2}\"),\n oneToThree = digitRegex(loc, \"{1,3}\"),\n oneToSix = digitRegex(loc, \"{1,6}\"),\n oneToNine = digitRegex(loc, \"{1,9}\"),\n twoToFour = digitRegex(loc, \"{2,4}\"),\n fourToSix = digitRegex(loc, \"{4,6}\"),\n literal = (t) => ({ regex: RegExp(escapeToken(t.val)), deser: ([s]) => s, literal: true }),\n unitate = (t) => {\n if (token.literal) {\n return literal(t);\n }\n switch (t.val) {\n // era\n case \"G\":\n return oneOf(loc.eras(\"short\"), 0);\n case \"GG\":\n return oneOf(loc.eras(\"long\"), 0);\n // years\n case \"y\":\n return intUnit(oneToSix);\n case \"yy\":\n return intUnit(twoToFour, untruncateYear);\n case \"yyyy\":\n return intUnit(four);\n case \"yyyyy\":\n return intUnit(fourToSix);\n case \"yyyyyy\":\n return intUnit(six);\n // months\n case \"M\":\n return intUnit(oneOrTwo);\n case \"MM\":\n return intUnit(two);\n case \"MMM\":\n return oneOf(loc.months(\"short\", true), 1);\n case \"MMMM\":\n return oneOf(loc.months(\"long\", true), 1);\n case \"L\":\n return intUnit(oneOrTwo);\n case \"LL\":\n return intUnit(two);\n case \"LLL\":\n return oneOf(loc.months(\"short\", false), 1);\n case \"LLLL\":\n return oneOf(loc.months(\"long\", false), 1);\n // dates\n case \"d\":\n return intUnit(oneOrTwo);\n case \"dd\":\n return intUnit(two);\n // ordinals\n case \"o\":\n return intUnit(oneToThree);\n case \"ooo\":\n return intUnit(three);\n // time\n case \"HH\":\n return intUnit(two);\n case \"H\":\n return intUnit(oneOrTwo);\n case \"hh\":\n return intUnit(two);\n case \"h\":\n return intUnit(oneOrTwo);\n case \"mm\":\n return intUnit(two);\n case \"m\":\n return intUnit(oneOrTwo);\n case \"q\":\n return intUnit(oneOrTwo);\n case \"qq\":\n return intUnit(two);\n case \"s\":\n return intUnit(oneOrTwo);\n case \"ss\":\n return intUnit(two);\n case \"S\":\n return intUnit(oneToThree);\n case \"SSS\":\n return intUnit(three);\n case \"u\":\n return simple(oneToNine);\n case \"uu\":\n return simple(oneOrTwo);\n case \"uuu\":\n return intUnit(one);\n // meridiem\n case \"a\":\n return oneOf(loc.meridiems(), 0);\n // weekYear (k)\n case \"kkkk\":\n return intUnit(four);\n case \"kk\":\n return intUnit(twoToFour, untruncateYear);\n // weekNumber (W)\n case \"W\":\n return intUnit(oneOrTwo);\n case \"WW\":\n return intUnit(two);\n // weekdays\n case \"E\":\n case \"c\":\n return intUnit(one);\n case \"EEE\":\n return oneOf(loc.weekdays(\"short\", false), 1);\n case \"EEEE\":\n return oneOf(loc.weekdays(\"long\", false), 1);\n case \"ccc\":\n return oneOf(loc.weekdays(\"short\", true), 1);\n case \"cccc\":\n return oneOf(loc.weekdays(\"long\", true), 1);\n // offset/zone\n case \"Z\":\n case \"ZZ\":\n return offset(new RegExp(`([+-]${oneOrTwo.source})(?::(${two.source}))?`), 2);\n case \"ZZZ\":\n return offset(new RegExp(`([+-]${oneOrTwo.source})(${two.source})?`), 2);\n // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing\n // because we don't have any way to figure out what they are\n case \"z\":\n return simple(/[a-z_+-/]{1,256}?/i);\n // this special-case \"token\" represents a place where a macro-token expanded into a white-space literal\n // in this case we accept any non-newline white-space\n case \" \":\n return simple(/[^\\S\\n\\r]/);\n default:\n return literal(t);\n }\n };\n\n const unit = unitate(token) || {\n invalidReason: MISSING_FTP,\n };\n\n unit.token = token;\n\n return unit;\n}\n\nconst partTypeStyleToTokenVal = {\n year: {\n \"2-digit\": \"yy\",\n numeric: \"yyyyy\",\n },\n month: {\n numeric: \"M\",\n \"2-digit\": \"MM\",\n short: \"MMM\",\n long: \"MMMM\",\n },\n day: {\n numeric: \"d\",\n \"2-digit\": \"dd\",\n },\n weekday: {\n short: \"EEE\",\n long: \"EEEE\",\n },\n dayperiod: \"a\",\n dayPeriod: \"a\",\n hour12: {\n numeric: \"h\",\n \"2-digit\": \"hh\",\n },\n hour24: {\n numeric: \"H\",\n \"2-digit\": \"HH\",\n },\n minute: {\n numeric: \"m\",\n \"2-digit\": \"mm\",\n },\n second: {\n numeric: \"s\",\n \"2-digit\": \"ss\",\n },\n timeZoneName: {\n long: \"ZZZZZ\",\n short: \"ZZZ\",\n },\n};\n\nfunction tokenForPart(part, formatOpts, resolvedOpts) {\n const { type, value } = part;\n\n if (type === \"literal\") {\n const isSpace = /^\\s+$/.test(value);\n return {\n literal: !isSpace,\n val: isSpace ? \" \" : value,\n };\n }\n\n const style = formatOpts[type];\n\n // The user might have explicitly specified hour12 or hourCycle\n // if so, respect their decision\n // if not, refer back to the resolvedOpts, which are based on the locale\n let actualType = type;\n if (type === \"hour\") {\n if (formatOpts.hour12 != null) {\n actualType = formatOpts.hour12 ? \"hour12\" : \"hour24\";\n } else if (formatOpts.hourCycle != null) {\n if (formatOpts.hourCycle === \"h11\" || formatOpts.hourCycle === \"h12\") {\n actualType = \"hour12\";\n } else {\n actualType = \"hour24\";\n }\n } else {\n // tokens only differentiate between 24 hours or not,\n // so we do not need to check hourCycle here, which is less supported anyways\n actualType = resolvedOpts.hour12 ? \"hour12\" : \"hour24\";\n }\n }\n let val = partTypeStyleToTokenVal[actualType];\n if (typeof val === \"object\") {\n val = val[style];\n }\n\n if (val) {\n return {\n literal: false,\n val,\n };\n }\n\n return undefined;\n}\n\nfunction buildRegex(units) {\n const re = units.map((u) => u.regex).reduce((f, r) => `${f}(${r.source})`, \"\");\n return [`^${re}$`, units];\n}\n\nfunction match(input, regex, handlers) {\n const matches = input.match(regex);\n\n if (matches) {\n const all = {};\n let matchIndex = 1;\n for (const i in handlers) {\n if (hasOwnProperty(handlers, i)) {\n const h = handlers[i],\n groups = h.groups ? h.groups + 1 : 1;\n if (!h.literal && h.token) {\n all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups));\n }\n matchIndex += groups;\n }\n }\n return [matches, all];\n } else {\n return [matches, {}];\n }\n}\n\nfunction dateTimeFromMatches(matches) {\n const toField = (token) => {\n switch (token) {\n case \"S\":\n return \"millisecond\";\n case \"s\":\n return \"second\";\n case \"m\":\n return \"minute\";\n case \"h\":\n case \"H\":\n return \"hour\";\n case \"d\":\n return \"day\";\n case \"o\":\n return \"ordinal\";\n case \"L\":\n case \"M\":\n return \"month\";\n case \"y\":\n return \"year\";\n case \"E\":\n case \"c\":\n return \"weekday\";\n case \"W\":\n return \"weekNumber\";\n case \"k\":\n return \"weekYear\";\n case \"q\":\n return \"quarter\";\n default:\n return null;\n }\n };\n\n let zone = null;\n let specificOffset;\n if (!isUndefined(matches.z)) {\n zone = IANAZone.create(matches.z);\n }\n\n if (!isUndefined(matches.Z)) {\n if (!zone) {\n zone = new FixedOffsetZone(matches.Z);\n }\n specificOffset = matches.Z;\n }\n\n if (!isUndefined(matches.q)) {\n matches.M = (matches.q - 1) * 3 + 1;\n }\n\n if (!isUndefined(matches.h)) {\n if (matches.h < 12 && matches.a === 1) {\n matches.h += 12;\n } else if (matches.h === 12 && matches.a === 0) {\n matches.h = 0;\n }\n }\n\n if (matches.G === 0 && matches.y) {\n matches.y = -matches.y;\n }\n\n if (!isUndefined(matches.u)) {\n matches.S = parseMillis(matches.u);\n }\n\n const vals = Object.keys(matches).reduce((r, k) => {\n const f = toField(k);\n if (f) {\n r[f] = matches[k];\n }\n\n return r;\n }, {});\n\n return [vals, zone, specificOffset];\n}\n\nlet dummyDateTimeCache = null;\n\nfunction getDummyDateTime() {\n if (!dummyDateTimeCache) {\n dummyDateTimeCache = DateTime.fromMillis(1555555555555);\n }\n\n return dummyDateTimeCache;\n}\n\nfunction maybeExpandMacroToken(token, locale) {\n if (token.literal) {\n return token;\n }\n\n const formatOpts = Formatter.macroTokenToFormatOpts(token.val);\n const tokens = formatOptsToTokens(formatOpts, locale);\n\n if (tokens == null || tokens.includes(undefined)) {\n return token;\n }\n\n return tokens;\n}\n\nexport function expandMacroTokens(tokens, locale) {\n return Array.prototype.concat(...tokens.map((t) => maybeExpandMacroToken(t, locale)));\n}\n\n/**\n * @private\n */\n\nexport class TokenParser {\n constructor(locale, format) {\n this.locale = locale;\n this.format = format;\n this.tokens = expandMacroTokens(Formatter.parseFormat(format), locale);\n this.units = this.tokens.map((t) => unitForToken(t, locale));\n this.disqualifyingUnit = this.units.find((t) => t.invalidReason);\n\n if (!this.disqualifyingUnit) {\n const [regexString, handlers] = buildRegex(this.units);\n this.regex = RegExp(regexString, \"i\");\n this.handlers = handlers;\n }\n }\n\n explainFromTokens(input) {\n if (!this.isValid) {\n return { input, tokens: this.tokens, invalidReason: this.invalidReason };\n } else {\n const [rawMatches, matches] = match(input, this.regex, this.handlers),\n [result, zone, specificOffset] = matches\n ? dateTimeFromMatches(matches)\n : [null, null, undefined];\n if (hasOwnProperty(matches, \"a\") && hasOwnProperty(matches, \"H\")) {\n throw new ConflictingSpecificationError(\n \"Can't include meridiem when specifying 24-hour format\"\n );\n }\n return {\n input,\n tokens: this.tokens,\n regex: this.regex,\n rawMatches,\n matches,\n result,\n zone,\n specificOffset,\n };\n }\n }\n\n get isValid() {\n return !this.disqualifyingUnit;\n }\n\n get invalidReason() {\n return this.disqualifyingUnit ? this.disqualifyingUnit.invalidReason : null;\n }\n}\n\nexport function explainFromTokens(locale, input, format) {\n const parser = new TokenParser(locale, format);\n return parser.explainFromTokens(input);\n}\n\nexport function parseFromTokens(locale, input, format) {\n const { result, zone, specificOffset, invalidReason } = explainFromTokens(locale, input, format);\n return [result, zone, specificOffset, invalidReason];\n}\n\nexport function formatOptsToTokens(formatOpts, locale) {\n if (!formatOpts) {\n return null;\n }\n\n const formatter = Formatter.create(locale, formatOpts);\n const df = formatter.dtFormatter(getDummyDateTime());\n const parts = df.formatToParts();\n const resolvedOpts = df.resolvedOptions();\n return parts.map((p) => tokenForPart(p, formatOpts, resolvedOpts));\n}\n","import Duration from \"./duration.js\";\nimport Interval from \"./interval.js\";\nimport Settings from \"./settings.js\";\nimport Info from \"./info.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport FixedOffsetZone from \"./zones/fixedOffsetZone.js\";\nimport Locale from \"./impl/locale.js\";\nimport {\n isUndefined,\n maybeArray,\n isDate,\n isNumber,\n bestBy,\n daysInMonth,\n daysInYear,\n isLeapYear,\n weeksInWeekYear,\n normalizeObject,\n roundTo,\n objToLocalTS,\n padStart,\n} from \"./impl/util.js\";\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\nimport diff from \"./impl/diff.js\";\nimport { parseRFC2822Date, parseISODate, parseHTTPDate, parseSQL } from \"./impl/regexParser.js\";\nimport {\n parseFromTokens,\n explainFromTokens,\n formatOptsToTokens,\n expandMacroTokens,\n TokenParser,\n} from \"./impl/tokenParser.js\";\nimport {\n gregorianToWeek,\n weekToGregorian,\n gregorianToOrdinal,\n ordinalToGregorian,\n hasInvalidGregorianData,\n hasInvalidWeekData,\n hasInvalidOrdinalData,\n hasInvalidTimeData,\n usesLocalWeekValues,\n isoWeekdayToLocal,\n} from \"./impl/conversions.js\";\nimport * as Formats from \"./impl/formats.js\";\nimport {\n InvalidArgumentError,\n ConflictingSpecificationError,\n InvalidUnitError,\n InvalidDateTimeError,\n} from \"./errors.js\";\nimport Invalid from \"./impl/invalid.js\";\n\nconst INVALID = \"Invalid DateTime\";\nconst MAX_DATE = 8.64e15;\n\nfunction unsupportedZone(zone) {\n return new Invalid(\"unsupported zone\", `the zone \"${zone.name}\" is not supported`);\n}\n\n// we cache week data on the DT object and this intermediates the cache\n/**\n * @param {DateTime} dt\n */\nfunction possiblyCachedWeekData(dt) {\n if (dt.weekData === null) {\n dt.weekData = gregorianToWeek(dt.c);\n }\n return dt.weekData;\n}\n\n/**\n * @param {DateTime} dt\n */\nfunction possiblyCachedLocalWeekData(dt) {\n if (dt.localWeekData === null) {\n dt.localWeekData = gregorianToWeek(\n dt.c,\n dt.loc.getMinDaysInFirstWeek(),\n dt.loc.getStartOfWeek()\n );\n }\n return dt.localWeekData;\n}\n\n// clone really means, \"make a new object with these modifications\". all \"setters\" really use this\n// to create a new object while only changing some of the properties\nfunction clone(inst, alts) {\n const current = {\n ts: inst.ts,\n zone: inst.zone,\n c: inst.c,\n o: inst.o,\n loc: inst.loc,\n invalid: inst.invalid,\n };\n return new DateTime({ ...current, ...alts, old: current });\n}\n\n// find the right offset a given local time. The o input is our guess, which determines which\n// offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST)\nfunction fixOffset(localTS, o, tz) {\n // Our UTC time is just a guess because our offset is just a guess\n let utcGuess = localTS - o * 60 * 1000;\n\n // Test whether the zone matches the offset for this ts\n const o2 = tz.offset(utcGuess);\n\n // If so, offset didn't change and we're done\n if (o === o2) {\n return [utcGuess, o];\n }\n\n // If not, change the ts by the difference in the offset\n utcGuess -= (o2 - o) * 60 * 1000;\n\n // If that gives us the local time we want, we're done\n const o3 = tz.offset(utcGuess);\n if (o2 === o3) {\n return [utcGuess, o2];\n }\n\n // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time\n return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)];\n}\n\n// convert an epoch timestamp into a calendar object with the given offset\nfunction tsToObj(ts, offset) {\n ts += offset * 60 * 1000;\n\n const d = new Date(ts);\n\n return {\n year: d.getUTCFullYear(),\n month: d.getUTCMonth() + 1,\n day: d.getUTCDate(),\n hour: d.getUTCHours(),\n minute: d.getUTCMinutes(),\n second: d.getUTCSeconds(),\n millisecond: d.getUTCMilliseconds(),\n };\n}\n\n// convert a calendar object to a epoch timestamp\nfunction objToTS(obj, offset, zone) {\n return fixOffset(objToLocalTS(obj), offset, zone);\n}\n\n// create a new DT instance by adding a duration, adjusting for DSTs\nfunction adjustTime(inst, dur) {\n const oPre = inst.o,\n year = inst.c.year + Math.trunc(dur.years),\n month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3,\n c = {\n ...inst.c,\n year,\n month,\n day:\n Math.min(inst.c.day, daysInMonth(year, month)) +\n Math.trunc(dur.days) +\n Math.trunc(dur.weeks) * 7,\n },\n millisToAdd = Duration.fromObject({\n years: dur.years - Math.trunc(dur.years),\n quarters: dur.quarters - Math.trunc(dur.quarters),\n months: dur.months - Math.trunc(dur.months),\n weeks: dur.weeks - Math.trunc(dur.weeks),\n days: dur.days - Math.trunc(dur.days),\n hours: dur.hours,\n minutes: dur.minutes,\n seconds: dur.seconds,\n milliseconds: dur.milliseconds,\n }).as(\"milliseconds\"),\n localTS = objToLocalTS(c);\n\n let [ts, o] = fixOffset(localTS, oPre, inst.zone);\n\n if (millisToAdd !== 0) {\n ts += millisToAdd;\n // that could have changed the offset by going over a DST, but we want to keep the ts the same\n o = inst.zone.offset(ts);\n }\n\n return { ts, o };\n}\n\n// helper useful in turning the results of parsing into real dates\n// by handling the zone options\nfunction parseDataToDateTime(parsed, parsedZone, opts, format, text, specificOffset) {\n const { setZone, zone } = opts;\n if ((parsed && Object.keys(parsed).length !== 0) || parsedZone) {\n const interpretationZone = parsedZone || zone,\n inst = DateTime.fromObject(parsed, {\n ...opts,\n zone: interpretationZone,\n specificOffset,\n });\n return setZone ? inst : inst.setZone(zone);\n } else {\n return DateTime.invalid(\n new Invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ${format}`)\n );\n }\n}\n\n// if you want to output a technical format (e.g. RFC 2822), this helper\n// helps handle the details\nfunction toTechFormat(dt, format, allowZ = true) {\n return dt.isValid\n ? Formatter.create(Locale.create(\"en-US\"), {\n allowZ,\n forceSimple: true,\n }).formatDateTimeFromString(dt, format)\n : null;\n}\n\nfunction toISODate(o, extended, precision) {\n const longFormat = o.c.year > 9999 || o.c.year < 0;\n let c = \"\";\n if (longFormat && o.c.year >= 0) c += \"+\";\n c += padStart(o.c.year, longFormat ? 6 : 4);\n if (precision === \"year\") return c;\n if (extended) {\n c += \"-\";\n c += padStart(o.c.month);\n if (precision === \"month\") return c;\n c += \"-\";\n } else {\n c += padStart(o.c.month);\n if (precision === \"month\") return c;\n }\n c += padStart(o.c.day);\n return c;\n}\n\nfunction toISOTime(\n o,\n extended,\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n) {\n let showSeconds = !suppressSeconds || o.c.millisecond !== 0 || o.c.second !== 0,\n c = \"\";\n switch (precision) {\n case \"day\":\n case \"month\":\n case \"year\":\n break;\n default:\n c += padStart(o.c.hour);\n if (precision === \"hour\") break;\n if (extended) {\n c += \":\";\n c += padStart(o.c.minute);\n if (precision === \"minute\") break;\n if (showSeconds) {\n c += \":\";\n c += padStart(o.c.second);\n }\n } else {\n c += padStart(o.c.minute);\n if (precision === \"minute\") break;\n if (showSeconds) {\n c += padStart(o.c.second);\n }\n }\n if (precision === \"second\") break;\n if (showSeconds && (!suppressMilliseconds || o.c.millisecond !== 0)) {\n c += \".\";\n c += padStart(o.c.millisecond, 3);\n }\n }\n\n if (includeOffset) {\n if (o.isOffsetFixed && o.offset === 0 && !extendedZone) {\n c += \"Z\";\n } else if (o.o < 0) {\n c += \"-\";\n c += padStart(Math.trunc(-o.o / 60));\n c += \":\";\n c += padStart(Math.trunc(-o.o % 60));\n } else {\n c += \"+\";\n c += padStart(Math.trunc(o.o / 60));\n c += \":\";\n c += padStart(Math.trunc(o.o % 60));\n }\n }\n\n if (extendedZone) {\n c += \"[\" + o.zone.ianaName + \"]\";\n }\n return c;\n}\n\n// defaults for unspecified units in the supported calendars\nconst defaultUnitValues = {\n month: 1,\n day: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n },\n defaultWeekUnitValues = {\n weekNumber: 1,\n weekday: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n },\n defaultOrdinalUnitValues = {\n ordinal: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n };\n\n// Units in the supported calendars, sorted by bigness\nconst orderedUnits = [\"year\", \"month\", \"day\", \"hour\", \"minute\", \"second\", \"millisecond\"],\n orderedWeekUnits = [\n \"weekYear\",\n \"weekNumber\",\n \"weekday\",\n \"hour\",\n \"minute\",\n \"second\",\n \"millisecond\",\n ],\n orderedOrdinalUnits = [\"year\", \"ordinal\", \"hour\", \"minute\", \"second\", \"millisecond\"];\n\n// standardize case and plurality in units\nfunction normalizeUnit(unit) {\n const normalized = {\n year: \"year\",\n years: \"year\",\n month: \"month\",\n months: \"month\",\n day: \"day\",\n days: \"day\",\n hour: \"hour\",\n hours: \"hour\",\n minute: \"minute\",\n minutes: \"minute\",\n quarter: \"quarter\",\n quarters: \"quarter\",\n second: \"second\",\n seconds: \"second\",\n millisecond: \"millisecond\",\n milliseconds: \"millisecond\",\n weekday: \"weekday\",\n weekdays: \"weekday\",\n weeknumber: \"weekNumber\",\n weeksnumber: \"weekNumber\",\n weeknumbers: \"weekNumber\",\n weekyear: \"weekYear\",\n weekyears: \"weekYear\",\n ordinal: \"ordinal\",\n }[unit.toLowerCase()];\n\n if (!normalized) throw new InvalidUnitError(unit);\n\n return normalized;\n}\n\nfunction normalizeUnitWithLocalWeeks(unit) {\n switch (unit.toLowerCase()) {\n case \"localweekday\":\n case \"localweekdays\":\n return \"localWeekday\";\n case \"localweeknumber\":\n case \"localweeknumbers\":\n return \"localWeekNumber\";\n case \"localweekyear\":\n case \"localweekyears\":\n return \"localWeekYear\";\n default:\n return normalizeUnit(unit);\n }\n}\n\n// cache offsets for zones based on the current timestamp when this function is\n// first called. When we are handling a datetime from components like (year,\n// month, day, hour) in a time zone, we need a guess about what the timezone\n// offset is so that we can convert into a UTC timestamp. One way is to find the\n// offset of now in the zone. The actual date may have a different offset (for\n// example, if we handle a date in June while we're in December in a zone that\n// observes DST), but we can check and adjust that.\n//\n// When handling many dates, calculating the offset for now every time is\n// expensive. It's just a guess, so we can cache the offset to use even if we\n// are right on a time change boundary (we'll just correct in the other\n// direction). Using a timestamp from first read is a slight optimization for\n// handling dates close to the current date, since those dates will usually be\n// in the same offset (we could set the timestamp statically, instead). We use a\n// single timestamp for all zones to make things a bit more predictable.\n//\n// This is safe for quickDT (used by local() and utc()) because we don't fill in\n// higher-order units from tsNow (as we do in fromObject, this requires that\n// offset is calculated from tsNow).\n/**\n * @param {Zone} zone\n * @return {number}\n */\nfunction guessOffsetForZone(zone) {\n if (zoneOffsetTs === undefined) {\n zoneOffsetTs = Settings.now();\n }\n\n // Do not cache anything but IANA zones, because it is not safe to do so.\n // Guessing an offset which is not present in the zone can cause wrong results from fixOffset\n if (zone.type !== \"iana\") {\n return zone.offset(zoneOffsetTs);\n }\n const zoneName = zone.name;\n let offsetGuess = zoneOffsetGuessCache.get(zoneName);\n if (offsetGuess === undefined) {\n offsetGuess = zone.offset(zoneOffsetTs);\n zoneOffsetGuessCache.set(zoneName, offsetGuess);\n }\n return offsetGuess;\n}\n\n// this is a dumbed down version of fromObject() that runs about 60% faster\n// but doesn't do any validation, makes a bunch of assumptions about what units\n// are present, and so on.\nfunction quickDT(obj, opts) {\n const zone = normalizeZone(opts.zone, Settings.defaultZone);\n if (!zone.isValid) {\n return DateTime.invalid(unsupportedZone(zone));\n }\n\n const loc = Locale.fromObject(opts);\n\n let ts, o;\n\n // assume we have the higher-order units\n if (!isUndefined(obj.year)) {\n for (const u of orderedUnits) {\n if (isUndefined(obj[u])) {\n obj[u] = defaultUnitValues[u];\n }\n }\n\n const invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj);\n if (invalid) {\n return DateTime.invalid(invalid);\n }\n\n const offsetProvis = guessOffsetForZone(zone);\n [ts, o] = objToTS(obj, offsetProvis, zone);\n } else {\n ts = Settings.now();\n }\n\n return new DateTime({ ts, zone, loc, o });\n}\n\nfunction diffRelative(start, end, opts) {\n const round = isUndefined(opts.round) ? true : opts.round,\n rounding = isUndefined(opts.rounding) ? \"trunc\" : opts.rounding,\n format = (c, unit) => {\n c = roundTo(c, round || opts.calendary ? 0 : 2, opts.calendary ? \"round\" : rounding);\n const formatter = end.loc.clone(opts).relFormatter(opts);\n return formatter.format(c, unit);\n },\n differ = (unit) => {\n if (opts.calendary) {\n if (!end.hasSame(start, unit)) {\n return end.startOf(unit).diff(start.startOf(unit), unit).get(unit);\n } else return 0;\n } else {\n return end.diff(start, unit).get(unit);\n }\n };\n\n if (opts.unit) {\n return format(differ(opts.unit), opts.unit);\n }\n\n for (const unit of opts.units) {\n const count = differ(unit);\n if (Math.abs(count) >= 1) {\n return format(count, unit);\n }\n }\n return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]);\n}\n\nfunction lastOpts(argList) {\n let opts = {},\n args;\n if (argList.length > 0 && typeof argList[argList.length - 1] === \"object\") {\n opts = argList[argList.length - 1];\n args = Array.from(argList).slice(0, argList.length - 1);\n } else {\n args = Array.from(argList);\n }\n return [opts, args];\n}\n\n/**\n * Timestamp to use for cached zone offset guesses (exposed for test)\n */\nlet zoneOffsetTs;\n/**\n * Cache for zone offset guesses (exposed for test).\n *\n * This optimizes quickDT via guessOffsetForZone to avoid repeated calls of\n * zone.offset().\n */\nconst zoneOffsetGuessCache = new Map();\n\n/**\n * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them.\n *\n * A DateTime comprises of:\n * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch.\n * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone).\n * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`.\n *\n * Here is a brief overview of the most commonly used functionality it provides:\n *\n * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link DateTime.local}, {@link DateTime.utc}, and (most flexibly) {@link DateTime.fromObject}. To create one from a standard string format, use {@link DateTime.fromISO}, {@link DateTime.fromHTTP}, and {@link DateTime.fromRFC2822}. To create one from a custom string format, use {@link DateTime.fromFormat}. To create one from a native JS date, use {@link DateTime.fromJSDate}.\n * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link DateTime#toObject}), use the {@link DateTime#year}, {@link DateTime#month},\n * {@link DateTime#day}, {@link DateTime#hour}, {@link DateTime#minute}, {@link DateTime#second}, {@link DateTime#millisecond} accessors.\n * * **Week calendar**: For ISO week calendar attributes, see the {@link DateTime#weekYear}, {@link DateTime#weekNumber}, and {@link DateTime#weekday} accessors.\n * * **Configuration** See the {@link DateTime#locale} and {@link DateTime#numberingSystem} accessors.\n * * **Transformation**: To transform the DateTime into other DateTimes, use {@link DateTime#set}, {@link DateTime#reconfigure}, {@link DateTime#setZone}, {@link DateTime#setLocale}, {@link DateTime.plus}, {@link DateTime#minus}, {@link DateTime#endOf}, {@link DateTime#startOf}, {@link DateTime#toUTC}, and {@link DateTime#toLocal}.\n * * **Output**: To convert the DateTime to other representations, use the {@link DateTime#toRelative}, {@link DateTime#toRelativeCalendar}, {@link DateTime#toJSON}, {@link DateTime#toISO}, {@link DateTime#toHTTP}, {@link DateTime#toObject}, {@link DateTime#toRFC2822}, {@link DateTime#toString}, {@link DateTime#toLocaleString}, {@link DateTime#toFormat}, {@link DateTime#toMillis} and {@link DateTime#toJSDate}.\n *\n * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation.\n */\nexport default class DateTime {\n /**\n * @access private\n */\n constructor(config) {\n const zone = config.zone || Settings.defaultZone;\n\n let invalid =\n config.invalid ||\n (Number.isNaN(config.ts) ? new Invalid(\"invalid input\") : null) ||\n (!zone.isValid ? unsupportedZone(zone) : null);\n /**\n * @access private\n */\n this.ts = isUndefined(config.ts) ? Settings.now() : config.ts;\n\n let c = null,\n o = null;\n if (!invalid) {\n const unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone);\n\n if (unchanged) {\n [c, o] = [config.old.c, config.old.o];\n } else {\n // If an offset has been passed and we have not been called from\n // clone(), we can trust it and avoid the offset calculation.\n const ot = isNumber(config.o) && !config.old ? config.o : zone.offset(this.ts);\n c = tsToObj(this.ts, ot);\n invalid = Number.isNaN(c.year) ? new Invalid(\"invalid input\") : null;\n c = invalid ? null : c;\n o = invalid ? null : ot;\n }\n }\n\n /**\n * @access private\n */\n this._zone = zone;\n /**\n * @access private\n */\n this.loc = config.loc || Locale.create();\n /**\n * @access private\n */\n this.invalid = invalid;\n /**\n * @access private\n */\n this.weekData = null;\n /**\n * @access private\n */\n this.localWeekData = null;\n /**\n * @access private\n */\n this.c = c;\n /**\n * @access private\n */\n this.o = o;\n /**\n * @access private\n */\n this.isLuxonDateTime = true;\n }\n\n // CONSTRUCT\n\n /**\n * Create a DateTime for the current instant, in the system's time zone.\n *\n * Use Settings to override these default values if needed.\n * @example DateTime.now().toISO() //~> now in the ISO format\n * @return {DateTime}\n */\n static now() {\n return new DateTime({});\n }\n\n /**\n * Create a local DateTime\n * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used\n * @param {number} [month=1] - The month, 1-indexed\n * @param {number} [day=1] - The day of the month, 1-indexed\n * @param {number} [hour=0] - The hour of the day, in 24-hour time\n * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n * @example DateTime.local() //~> now\n * @example DateTime.local({ zone: \"America/New_York\" }) //~> now, in US east coast time\n * @example DateTime.local(2017) //~> 2017-01-01T00:00:00\n * @example DateTime.local(2017, 3) //~> 2017-03-01T00:00:00\n * @example DateTime.local(2017, 3, 12, { locale: \"fr\" }) //~> 2017-03-12T00:00:00, with a French locale\n * @example DateTime.local(2017, 3, 12, 5) //~> 2017-03-12T05:00:00\n * @example DateTime.local(2017, 3, 12, 5, { zone: \"utc\" }) //~> 2017-03-12T05:00:00, in UTC\n * @example DateTime.local(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00\n * @example DateTime.local(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10\n * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765\n * @return {DateTime}\n */\n static local() {\n const [opts, args] = lastOpts(arguments),\n [year, month, day, hour, minute, second, millisecond] = args;\n return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n }\n\n /**\n * Create a DateTime in UTC\n * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used\n * @param {number} [month=1] - The month, 1-indexed\n * @param {number} [day=1] - The day of the month\n * @param {number} [hour=0] - The hour of the day, in 24-hour time\n * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n * @param {Object} options - configuration options for the DateTime\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} [options.outputCalendar] - the output calendar to set on the resulting DateTime instance\n * @param {string} [options.numberingSystem] - the numbering system to set on the resulting DateTime instance\n * @param {string} [options.weekSettings] - the week settings to set on the resulting DateTime instance\n * @example DateTime.utc() //~> now\n * @example DateTime.utc(2017) //~> 2017-01-01T00:00:00Z\n * @example DateTime.utc(2017, 3) //~> 2017-03-01T00:00:00Z\n * @example DateTime.utc(2017, 3, 12) //~> 2017-03-12T00:00:00Z\n * @example DateTime.utc(2017, 3, 12, 5) //~> 2017-03-12T05:00:00Z\n * @example DateTime.utc(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00Z\n * @example DateTime.utc(2017, 3, 12, 5, 45, { locale: \"fr\" }) //~> 2017-03-12T05:45:00Z with a French locale\n * @example DateTime.utc(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10Z\n * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765, { locale: \"fr\" }) //~> 2017-03-12T05:45:10.765Z with a French locale\n * @return {DateTime}\n */\n static utc() {\n const [opts, args] = lastOpts(arguments),\n [year, month, day, hour, minute, second, millisecond] = args;\n\n opts.zone = FixedOffsetZone.utcInstance;\n return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n }\n\n /**\n * Create a DateTime from a JavaScript Date object. Uses the default zone.\n * @param {Date} date - a JavaScript Date object\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @return {DateTime}\n */\n static fromJSDate(date, options = {}) {\n const ts = isDate(date) ? date.valueOf() : NaN;\n if (Number.isNaN(ts)) {\n return DateTime.invalid(\"invalid input\");\n }\n\n const zoneToUse = normalizeZone(options.zone, Settings.defaultZone);\n if (!zoneToUse.isValid) {\n return DateTime.invalid(unsupportedZone(zoneToUse));\n }\n\n return new DateTime({\n ts: ts,\n zone: zoneToUse,\n loc: Locale.fromObject(options),\n });\n }\n\n /**\n * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n * @param {number} milliseconds - a number of milliseconds since 1970 UTC\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromMillis(milliseconds, options = {}) {\n if (!isNumber(milliseconds)) {\n throw new InvalidArgumentError(\n `fromMillis requires a numerical input, but received a ${typeof milliseconds} with value ${milliseconds}`\n );\n } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) {\n // this isn't perfect because we can still end up out of range because of additional shifting, but it's a start\n return DateTime.invalid(\"Timestamp out of range\");\n } else {\n return new DateTime({\n ts: milliseconds,\n zone: normalizeZone(options.zone, Settings.defaultZone),\n loc: Locale.fromObject(options),\n });\n }\n }\n\n /**\n * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n * @param {number} seconds - a number of seconds since 1970 UTC\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromSeconds(seconds, options = {}) {\n if (!isNumber(seconds)) {\n throw new InvalidArgumentError(\"fromSeconds requires a numerical input\");\n } else {\n return new DateTime({\n ts: seconds * 1000,\n zone: normalizeZone(options.zone, Settings.defaultZone),\n loc: Locale.fromObject(options),\n });\n }\n }\n\n /**\n * Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults.\n * @param {Object} obj - the object to create the DateTime from\n * @param {number} obj.year - a year, such as 1987\n * @param {number} obj.month - a month, 1-12\n * @param {number} obj.day - a day of the month, 1-31, depending on the month\n * @param {number} obj.ordinal - day of the year, 1-365 or 366\n * @param {number} obj.weekYear - an ISO week year\n * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year\n * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday\n * @param {number} obj.localWeekYear - a week year, according to the locale\n * @param {number} obj.localWeekNumber - a week number, between 1 and 52 or 53, depending on the year, according to the locale\n * @param {number} obj.localWeekday - a weekday, 1-7, where 1 is the first and 7 is the last day of the week, according to the locale\n * @param {number} obj.hour - hour of the day, 0-23\n * @param {number} obj.minute - minute of the hour, 0-59\n * @param {number} obj.second - second of the minute, 0-59\n * @param {number} obj.millisecond - millisecond of the second, 0-999\n * @param {Object} opts - options for creating this DateTime\n * @param {string|Zone} [opts.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone()\n * @param {string} [opts.locale='system\\'s locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25'\n * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01'\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'utc' }),\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'local' })\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'America/New_York' })\n * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13'\n * @example DateTime.fromObject({ localWeekYear: 2022, localWeekNumber: 1, localWeekday: 1 }, { locale: \"en-US\" }).toISODate() //=> '2021-12-26'\n * @return {DateTime}\n */\n static fromObject(obj, opts = {}) {\n obj = obj || {};\n const zoneToUse = normalizeZone(opts.zone, Settings.defaultZone);\n if (!zoneToUse.isValid) {\n return DateTime.invalid(unsupportedZone(zoneToUse));\n }\n\n const loc = Locale.fromObject(opts);\n const normalized = normalizeObject(obj, normalizeUnitWithLocalWeeks);\n const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, loc);\n\n const tsNow = Settings.now(),\n offsetProvis = !isUndefined(opts.specificOffset)\n ? opts.specificOffset\n : zoneToUse.offset(tsNow),\n containsOrdinal = !isUndefined(normalized.ordinal),\n containsGregorYear = !isUndefined(normalized.year),\n containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n containsGregor = containsGregorYear || containsGregorMD,\n definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n // cases:\n // just a weekday -> this week's instance of that weekday, no worries\n // (gregorian data or ordinal) + (weekYear or weekNumber) -> error\n // (gregorian month or day) + ordinal -> error\n // otherwise just use weeks or ordinals or gregorian, depending on what's specified\n\n if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n throw new ConflictingSpecificationError(\n \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n );\n }\n\n if (containsGregorMD && containsOrdinal) {\n throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n }\n\n const useWeekData = definiteWeekDef || (normalized.weekday && !containsGregor);\n\n // configure ourselves to deal with gregorian dates or week stuff\n let units,\n defaultValues,\n objNow = tsToObj(tsNow, offsetProvis);\n if (useWeekData) {\n units = orderedWeekUnits;\n defaultValues = defaultWeekUnitValues;\n objNow = gregorianToWeek(objNow, minDaysInFirstWeek, startOfWeek);\n } else if (containsOrdinal) {\n units = orderedOrdinalUnits;\n defaultValues = defaultOrdinalUnitValues;\n objNow = gregorianToOrdinal(objNow);\n } else {\n units = orderedUnits;\n defaultValues = defaultUnitValues;\n }\n\n // set default values for missing stuff\n let foundFirst = false;\n for (const u of units) {\n const v = normalized[u];\n if (!isUndefined(v)) {\n foundFirst = true;\n } else if (foundFirst) {\n normalized[u] = defaultValues[u];\n } else {\n normalized[u] = objNow[u];\n }\n }\n\n // make sure the values we have are in range\n const higherOrderInvalid = useWeekData\n ? hasInvalidWeekData(normalized, minDaysInFirstWeek, startOfWeek)\n : containsOrdinal\n ? hasInvalidOrdinalData(normalized)\n : hasInvalidGregorianData(normalized),\n invalid = higherOrderInvalid || hasInvalidTimeData(normalized);\n\n if (invalid) {\n return DateTime.invalid(invalid);\n }\n\n // compute the actual time\n const gregorian = useWeekData\n ? weekToGregorian(normalized, minDaysInFirstWeek, startOfWeek)\n : containsOrdinal\n ? ordinalToGregorian(normalized)\n : normalized,\n [tsFinal, offsetFinal] = objToTS(gregorian, offsetProvis, zoneToUse),\n inst = new DateTime({\n ts: tsFinal,\n zone: zoneToUse,\n o: offsetFinal,\n loc,\n });\n\n // gregorian data + weekday serves only to validate\n if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) {\n return DateTime.invalid(\n \"mismatched weekday\",\n `you can't specify both a weekday of ${normalized.weekday} and a date of ${inst.toISO()}`\n );\n }\n\n if (!inst.isValid) {\n return DateTime.invalid(inst.invalid);\n }\n\n return inst;\n }\n\n /**\n * Create a DateTime from an ISO 8601 string\n * @param {string} text - the ISO string\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance\n * @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance\n * @param {string} [opts.weekSettings] - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromISO('2016-05-25T09:08:34.123')\n * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00')\n * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true})\n * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'})\n * @example DateTime.fromISO('2016-W05-4')\n * @return {DateTime}\n */\n static fromISO(text, opts = {}) {\n const [vals, parsedZone] = parseISODate(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"ISO 8601\", text);\n }\n\n /**\n * Create a DateTime from an RFC 2822 string\n * @param {string} text - the RFC 2822 string\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT')\n * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600')\n * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z')\n * @return {DateTime}\n */\n static fromRFC2822(text, opts = {}) {\n const [vals, parsedZone] = parseRFC2822Date(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"RFC 2822\", text);\n }\n\n /**\n * Create a DateTime from an HTTP header date\n * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n * @param {string} text - the HTTP header date\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods.\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT')\n * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT')\n * @example DateTime.fromHTTP('Sun Nov 6 08:49:37 1994')\n * @return {DateTime}\n */\n static fromHTTP(text, opts = {}) {\n const [vals, parsedZone] = parseHTTPDate(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"HTTP\", opts);\n }\n\n /**\n * Create a DateTime from an input string and format string.\n * Defaults to en-US if no locale has been specified, regardless of the system's locale. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/parsing?id=table-of-tokens).\n * @param {string} text - the string to parse\n * @param {string} fmt - the format the string is expected to be in (see the link below for the formats)\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromFormat(text, fmt, opts = {}) {\n if (isUndefined(text) || isUndefined(fmt)) {\n throw new InvalidArgumentError(\"fromFormat requires an input string and a format\");\n }\n\n const { locale = null, numberingSystem = null } = opts,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n }),\n [vals, parsedZone, specificOffset, invalid] = parseFromTokens(localeToUse, text, fmt);\n if (invalid) {\n return DateTime.invalid(invalid);\n } else {\n return parseDataToDateTime(vals, parsedZone, opts, `format ${fmt}`, text, specificOffset);\n }\n }\n\n /**\n * @deprecated use fromFormat instead\n */\n static fromString(text, fmt, opts = {}) {\n return DateTime.fromFormat(text, fmt, opts);\n }\n\n /**\n * Create a DateTime from a SQL date, time, or datetime\n * Defaults to en-US if no locale has been specified, regardless of the system's locale\n * @param {string} text - the string to parse\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @example DateTime.fromSQL('2017-05-15')\n * @example DateTime.fromSQL('2017-05-15 09:12:34')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true })\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' })\n * @example DateTime.fromSQL('09:12:34.342')\n * @return {DateTime}\n */\n static fromSQL(text, opts = {}) {\n const [vals, parsedZone] = parseSQL(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"SQL\", text);\n }\n\n /**\n * Create an invalid DateTime.\n * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent.\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {DateTime}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the DateTime is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidDateTimeError(invalid);\n } else {\n return new DateTime({ invalid });\n }\n }\n\n /**\n * Check if an object is an instance of DateTime. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isDateTime(o) {\n return (o && o.isLuxonDateTime) || false;\n }\n\n /**\n * Produce the format string for a set of options\n * @param formatOpts\n * @param localeOpts\n * @returns {string}\n */\n static parseFormatForOpts(formatOpts, localeOpts = {}) {\n const tokenList = formatOptsToTokens(formatOpts, Locale.fromObject(localeOpts));\n return !tokenList ? null : tokenList.map((t) => (t ? t.val : null)).join(\"\");\n }\n\n /**\n * Produce the the fully expanded format token for the locale\n * Does NOT quote characters, so quoted tokens will not round trip correctly\n * @param fmt\n * @param localeOpts\n * @returns {string}\n */\n static expandFormat(fmt, localeOpts = {}) {\n const expanded = expandMacroTokens(Formatter.parseFormat(fmt), Locale.fromObject(localeOpts));\n return expanded.map((t) => t.val).join(\"\");\n }\n\n static resetCache() {\n zoneOffsetTs = undefined;\n zoneOffsetGuessCache.clear();\n }\n\n // INFO\n\n /**\n * Get the value of unit.\n * @param {string} unit - a unit such as 'minute' or 'day'\n * @example DateTime.local(2017, 7, 4).get('month'); //=> 7\n * @example DateTime.local(2017, 7, 4).get('day'); //=> 4\n * @return {number}\n */\n get(unit) {\n return this[unit];\n }\n\n /**\n * Returns whether the DateTime is valid. Invalid DateTimes occur when:\n * * The DateTime was created from invalid calendar information, such as the 13th month or February 30\n * * The DateTime was created by an operation on another invalid date\n * @type {boolean}\n */\n get isValid() {\n return this.invalid === null;\n }\n\n /**\n * Returns an error code if this DateTime is invalid, or null if the DateTime is valid\n * @type {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime\n *\n * @type {string}\n */\n get locale() {\n return this.isValid ? this.loc.locale : null;\n }\n\n /**\n * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime\n *\n * @type {string}\n */\n get numberingSystem() {\n return this.isValid ? this.loc.numberingSystem : null;\n }\n\n /**\n * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime\n *\n * @type {string}\n */\n get outputCalendar() {\n return this.isValid ? this.loc.outputCalendar : null;\n }\n\n /**\n * Get the time zone associated with this DateTime.\n * @type {Zone}\n */\n get zone() {\n return this._zone;\n }\n\n /**\n * Get the name of the time zone.\n * @type {string}\n */\n get zoneName() {\n return this.isValid ? this.zone.name : null;\n }\n\n /**\n * Get the year\n * @example DateTime.local(2017, 5, 25).year //=> 2017\n * @type {number}\n */\n get year() {\n return this.isValid ? this.c.year : NaN;\n }\n\n /**\n * Get the quarter\n * @example DateTime.local(2017, 5, 25).quarter //=> 2\n * @type {number}\n */\n get quarter() {\n return this.isValid ? Math.ceil(this.c.month / 3) : NaN;\n }\n\n /**\n * Get the month (1-12).\n * @example DateTime.local(2017, 5, 25).month //=> 5\n * @type {number}\n */\n get month() {\n return this.isValid ? this.c.month : NaN;\n }\n\n /**\n * Get the day of the month (1-30ish).\n * @example DateTime.local(2017, 5, 25).day //=> 25\n * @type {number}\n */\n get day() {\n return this.isValid ? this.c.day : NaN;\n }\n\n /**\n * Get the hour of the day (0-23).\n * @example DateTime.local(2017, 5, 25, 9).hour //=> 9\n * @type {number}\n */\n get hour() {\n return this.isValid ? this.c.hour : NaN;\n }\n\n /**\n * Get the minute of the hour (0-59).\n * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30\n * @type {number}\n */\n get minute() {\n return this.isValid ? this.c.minute : NaN;\n }\n\n /**\n * Get the second of the minute (0-59).\n * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52\n * @type {number}\n */\n get second() {\n return this.isValid ? this.c.second : NaN;\n }\n\n /**\n * Get the millisecond of the second (0-999).\n * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654\n * @type {number}\n */\n get millisecond() {\n return this.isValid ? this.c.millisecond : NaN;\n }\n\n /**\n * Get the week year\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2014, 12, 31).weekYear //=> 2015\n * @type {number}\n */\n get weekYear() {\n return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN;\n }\n\n /**\n * Get the week number of the week year (1-52ish).\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2017, 5, 25).weekNumber //=> 21\n * @type {number}\n */\n get weekNumber() {\n return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN;\n }\n\n /**\n * Get the day of the week.\n * 1 is Monday and 7 is Sunday\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2014, 11, 31).weekday //=> 4\n * @type {number}\n */\n get weekday() {\n return this.isValid ? possiblyCachedWeekData(this).weekday : NaN;\n }\n\n /**\n * Returns true if this date is on a weekend according to the locale, false otherwise\n * @returns {boolean}\n */\n get isWeekend() {\n return this.isValid && this.loc.getWeekendDays().includes(this.weekday);\n }\n\n /**\n * Get the day of the week according to the locale.\n * 1 is the first day of the week and 7 is the last day of the week.\n * If the locale assigns Sunday as the first day of the week, then a date which is a Sunday will return 1,\n * @returns {number}\n */\n get localWeekday() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekday : NaN;\n }\n\n /**\n * Get the week number of the week year according to the locale. Different locales assign week numbers differently,\n * because the week can start on different days of the week (see localWeekday) and because a different number of days\n * is required for a week to count as the first week of a year.\n * @returns {number}\n */\n get localWeekNumber() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekNumber : NaN;\n }\n\n /**\n * Get the week year according to the locale. Different locales assign week numbers (and therefor week years)\n * differently, see localWeekNumber.\n * @returns {number}\n */\n get localWeekYear() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekYear : NaN;\n }\n\n /**\n * Get the ordinal (meaning the day of the year)\n * @example DateTime.local(2017, 5, 25).ordinal //=> 145\n * @type {number|DateTime}\n */\n get ordinal() {\n return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN;\n }\n\n /**\n * Get the human readable short month name, such as 'Oct'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).monthShort //=> Oct\n * @type {string}\n */\n get monthShort() {\n return this.isValid ? Info.months(\"short\", { locObj: this.loc })[this.month - 1] : null;\n }\n\n /**\n * Get the human readable long month name, such as 'October'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).monthLong //=> October\n * @type {string}\n */\n get monthLong() {\n return this.isValid ? Info.months(\"long\", { locObj: this.loc })[this.month - 1] : null;\n }\n\n /**\n * Get the human readable short weekday, such as 'Mon'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon\n * @type {string}\n */\n get weekdayShort() {\n return this.isValid ? Info.weekdays(\"short\", { locObj: this.loc })[this.weekday - 1] : null;\n }\n\n /**\n * Get the human readable long weekday, such as 'Monday'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday\n * @type {string}\n */\n get weekdayLong() {\n return this.isValid ? Info.weekdays(\"long\", { locObj: this.loc })[this.weekday - 1] : null;\n }\n\n /**\n * Get the UTC offset of this DateTime in minutes\n * @example DateTime.now().offset //=> -240\n * @example DateTime.utc().offset //=> 0\n * @type {number}\n */\n get offset() {\n return this.isValid ? +this.o : NaN;\n }\n\n /**\n * Get the short human name for the zone's current offset, for example \"EST\" or \"EDT\".\n * Defaults to the system's locale if no locale has been specified\n * @type {string}\n */\n get offsetNameShort() {\n if (this.isValid) {\n return this.zone.offsetName(this.ts, {\n format: \"short\",\n locale: this.locale,\n });\n } else {\n return null;\n }\n }\n\n /**\n * Get the long human name for the zone's current offset, for example \"Eastern Standard Time\" or \"Eastern Daylight Time\".\n * Defaults to the system's locale if no locale has been specified\n * @type {string}\n */\n get offsetNameLong() {\n if (this.isValid) {\n return this.zone.offsetName(this.ts, {\n format: \"long\",\n locale: this.locale,\n });\n } else {\n return null;\n }\n }\n\n /**\n * Get whether this zone's offset ever changes, as in a DST.\n * @type {boolean}\n */\n get isOffsetFixed() {\n return this.isValid ? this.zone.isUniversal : null;\n }\n\n /**\n * Get whether the DateTime is in a DST.\n * @type {boolean}\n */\n get isInDST() {\n if (this.isOffsetFixed) {\n return false;\n } else {\n return (\n this.offset > this.set({ month: 1, day: 1 }).offset ||\n this.offset > this.set({ month: 5 }).offset\n );\n }\n }\n\n /**\n * Get those DateTimes which have the same local time as this DateTime, but a different offset from UTC\n * in this DateTime's zone. During DST changes local time can be ambiguous, for example\n * `2023-10-29T02:30:00` in `Europe/Berlin` can have offset `+01:00` or `+02:00`.\n * This method will return both possible DateTimes if this DateTime's local time is ambiguous.\n * @returns {DateTime[]}\n */\n getPossibleOffsets() {\n if (!this.isValid || this.isOffsetFixed) {\n return [this];\n }\n const dayMs = 86400000;\n const minuteMs = 60000;\n const localTS = objToLocalTS(this.c);\n const oEarlier = this.zone.offset(localTS - dayMs);\n const oLater = this.zone.offset(localTS + dayMs);\n\n const o1 = this.zone.offset(localTS - oEarlier * minuteMs);\n const o2 = this.zone.offset(localTS - oLater * minuteMs);\n if (o1 === o2) {\n return [this];\n }\n const ts1 = localTS - o1 * minuteMs;\n const ts2 = localTS - o2 * minuteMs;\n const c1 = tsToObj(ts1, o1);\n const c2 = tsToObj(ts2, o2);\n if (\n c1.hour === c2.hour &&\n c1.minute === c2.minute &&\n c1.second === c2.second &&\n c1.millisecond === c2.millisecond\n ) {\n return [clone(this, { ts: ts1 }), clone(this, { ts: ts2 })];\n }\n return [this];\n }\n\n /**\n * Returns true if this DateTime is in a leap year, false otherwise\n * @example DateTime.local(2016).isInLeapYear //=> true\n * @example DateTime.local(2013).isInLeapYear //=> false\n * @type {boolean}\n */\n get isInLeapYear() {\n return isLeapYear(this.year);\n }\n\n /**\n * Returns the number of days in this DateTime's month\n * @example DateTime.local(2016, 2).daysInMonth //=> 29\n * @example DateTime.local(2016, 3).daysInMonth //=> 31\n * @type {number}\n */\n get daysInMonth() {\n return daysInMonth(this.year, this.month);\n }\n\n /**\n * Returns the number of days in this DateTime's year\n * @example DateTime.local(2016).daysInYear //=> 366\n * @example DateTime.local(2013).daysInYear //=> 365\n * @type {number}\n */\n get daysInYear() {\n return this.isValid ? daysInYear(this.year) : NaN;\n }\n\n /**\n * Returns the number of weeks in this DateTime's year\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2004).weeksInWeekYear //=> 53\n * @example DateTime.local(2013).weeksInWeekYear //=> 52\n * @type {number}\n */\n get weeksInWeekYear() {\n return this.isValid ? weeksInWeekYear(this.weekYear) : NaN;\n }\n\n /**\n * Returns the number of weeks in this DateTime's local week year\n * @example DateTime.local(2020, 6, {locale: 'en-US'}).weeksInLocalWeekYear //=> 52\n * @example DateTime.local(2020, 6, {locale: 'de-DE'}).weeksInLocalWeekYear //=> 53\n * @type {number}\n */\n get weeksInLocalWeekYear() {\n return this.isValid\n ? weeksInWeekYear(\n this.localWeekYear,\n this.loc.getMinDaysInFirstWeek(),\n this.loc.getStartOfWeek()\n )\n : NaN;\n }\n\n /**\n * Returns the resolved Intl options for this DateTime.\n * This is useful in understanding the behavior of formatting methods\n * @param {Object} opts - the same options as toLocaleString\n * @return {Object}\n */\n resolvedLocaleOptions(opts = {}) {\n const { locale, numberingSystem, calendar } = Formatter.create(\n this.loc.clone(opts),\n opts\n ).resolvedOptions(this);\n return { locale, numberingSystem, outputCalendar: calendar };\n }\n\n // TRANSFORM\n\n /**\n * \"Set\" the DateTime's zone to UTC. Returns a newly-constructed DateTime.\n *\n * Equivalent to {@link DateTime#setZone}('utc')\n * @param {number} [offset=0] - optionally, an offset from UTC in minutes\n * @param {Object} [opts={}] - options to pass to `setZone()`\n * @return {DateTime}\n */\n toUTC(offset = 0, opts = {}) {\n return this.setZone(FixedOffsetZone.instance(offset), opts);\n }\n\n /**\n * \"Set\" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime.\n *\n * Equivalent to `setZone('local')`\n * @return {DateTime}\n */\n toLocal() {\n return this.setZone(Settings.defaultZone);\n }\n\n /**\n * \"Set\" the DateTime's zone to specified zone. Returns a newly-constructed DateTime.\n *\n * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link DateTime#plus}. You may wish to use {@link DateTime#toLocal} and {@link DateTime#toUTC} which provide simple convenience wrappers for commonly used zones.\n * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link DateTime#Zone} class.\n * @param {Object} opts - options\n * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this.\n * @return {DateTime}\n */\n setZone(zone, { keepLocalTime = false, keepCalendarTime = false } = {}) {\n zone = normalizeZone(zone, Settings.defaultZone);\n if (zone.equals(this.zone)) {\n return this;\n } else if (!zone.isValid) {\n return DateTime.invalid(unsupportedZone(zone));\n } else {\n let newTS = this.ts;\n if (keepLocalTime || keepCalendarTime) {\n const offsetGuess = zone.offset(this.ts);\n const asObj = this.toObject();\n [newTS] = objToTS(asObj, offsetGuess, zone);\n }\n return clone(this, { ts: newTS, zone });\n }\n }\n\n /**\n * \"Set\" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime.\n * @param {Object} properties - the properties to set\n * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' })\n * @return {DateTime}\n */\n reconfigure({ locale, numberingSystem, outputCalendar } = {}) {\n const loc = this.loc.clone({ locale, numberingSystem, outputCalendar });\n return clone(this, { loc });\n }\n\n /**\n * \"Set\" the locale. Returns a newly-constructed DateTime.\n * Just a convenient alias for reconfigure({ locale })\n * @example DateTime.local(2017, 5, 25).setLocale('en-GB')\n * @return {DateTime}\n */\n setLocale(locale) {\n return this.reconfigure({ locale });\n }\n\n /**\n * \"Set\" the values of specified units. Returns a newly-constructed DateTime.\n * You can only set units with this method; for \"setting\" metadata, see {@link DateTime#reconfigure} and {@link DateTime#setZone}.\n *\n * This method also supports setting locale-based week units, i.e. `localWeekday`, `localWeekNumber` and `localWeekYear`.\n * They cannot be mixed with ISO-week units like `weekday`.\n * @param {Object} values - a mapping of units to numbers\n * @example dt.set({ year: 2017 })\n * @example dt.set({ hour: 8, minute: 30 })\n * @example dt.set({ weekday: 5 })\n * @example dt.set({ year: 2005, ordinal: 234 })\n * @return {DateTime}\n */\n set(values) {\n if (!this.isValid) return this;\n\n const normalized = normalizeObject(values, normalizeUnitWithLocalWeeks);\n const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, this.loc);\n\n const settingWeekStuff =\n !isUndefined(normalized.weekYear) ||\n !isUndefined(normalized.weekNumber) ||\n !isUndefined(normalized.weekday),\n containsOrdinal = !isUndefined(normalized.ordinal),\n containsGregorYear = !isUndefined(normalized.year),\n containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n containsGregor = containsGregorYear || containsGregorMD,\n definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n throw new ConflictingSpecificationError(\n \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n );\n }\n\n if (containsGregorMD && containsOrdinal) {\n throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n }\n\n let mixed;\n if (settingWeekStuff) {\n mixed = weekToGregorian(\n { ...gregorianToWeek(this.c, minDaysInFirstWeek, startOfWeek), ...normalized },\n minDaysInFirstWeek,\n startOfWeek\n );\n } else if (!isUndefined(normalized.ordinal)) {\n mixed = ordinalToGregorian({ ...gregorianToOrdinal(this.c), ...normalized });\n } else {\n mixed = { ...this.toObject(), ...normalized };\n\n // if we didn't set the day but we ended up on an overflow date,\n // use the last day of the right month\n if (isUndefined(normalized.day)) {\n mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day);\n }\n }\n\n const [ts, o] = objToTS(mixed, this.o, this.zone);\n return clone(this, { ts, o });\n }\n\n /**\n * Add a period of time to this DateTime and return the resulting DateTime\n *\n * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between.\n * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @example DateTime.now().plus(123) //~> in 123 milliseconds\n * @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes\n * @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow\n * @example DateTime.now().plus({ days: -1 }) //~> this time yesterday\n * @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min\n * @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min\n * @return {DateTime}\n */\n plus(duration) {\n if (!this.isValid) return this;\n const dur = Duration.fromDurationLike(duration);\n return clone(this, adjustTime(this, dur));\n }\n\n /**\n * Subtract a period of time to this DateTime and return the resulting DateTime\n * See {@link DateTime#plus}\n * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n @return {DateTime}\n */\n minus(duration) {\n if (!this.isValid) return this;\n const dur = Duration.fromDurationLike(duration).negate();\n return clone(this, adjustTime(this, dur));\n }\n\n /**\n * \"Set\" this DateTime to the beginning of a unit of time.\n * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week\n * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01'\n * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01'\n * @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays\n * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00'\n * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00'\n * @return {DateTime}\n */\n startOf(unit, { useLocaleWeeks = false } = {}) {\n if (!this.isValid) return this;\n\n const o = {},\n normalizedUnit = Duration.normalizeUnit(unit);\n switch (normalizedUnit) {\n case \"years\":\n o.month = 1;\n // falls through\n case \"quarters\":\n case \"months\":\n o.day = 1;\n // falls through\n case \"weeks\":\n case \"days\":\n o.hour = 0;\n // falls through\n case \"hours\":\n o.minute = 0;\n // falls through\n case \"minutes\":\n o.second = 0;\n // falls through\n case \"seconds\":\n o.millisecond = 0;\n break;\n case \"milliseconds\":\n break;\n // no default, invalid units throw in normalizeUnit()\n }\n\n if (normalizedUnit === \"weeks\") {\n if (useLocaleWeeks) {\n const startOfWeek = this.loc.getStartOfWeek();\n const { weekday } = this;\n if (weekday < startOfWeek) {\n o.weekNumber = this.weekNumber - 1;\n }\n o.weekday = startOfWeek;\n } else {\n o.weekday = 1;\n }\n }\n\n if (normalizedUnit === \"quarters\") {\n const q = Math.ceil(this.month / 3);\n o.month = (q - 1) * 3 + 1;\n }\n\n return this.set(o);\n }\n\n /**\n * \"Set\" this DateTime to the end (meaning the last millisecond) of a unit of time\n * @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week\n * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays\n * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00'\n * @return {DateTime}\n */\n endOf(unit, opts) {\n return this.isValid\n ? this.plus({ [unit]: 1 })\n .startOf(unit, opts)\n .minus(1)\n : this;\n }\n\n // OUTPUT\n\n /**\n * Returns a string representation of this DateTime formatted according to the specified format string.\n * **You may not want this.** See {@link DateTime#toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/formatting?id=table-of-tokens).\n * Defaults to en-US if no locale has been specified, regardless of the system's locale.\n * @param {string} fmt - the format string\n * @param {Object} opts - opts to override the configuration options on this DateTime\n * @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22'\n * @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22'\n * @example DateTime.now().toFormat('yyyy LLL dd', { locale: \"fr\" }) //=> '2017 avr. 22'\n * @example DateTime.now().toFormat(\"HH 'hours and' mm 'minutes'\") //=> '20 hours and 55 minutes'\n * @return {string}\n */\n toFormat(fmt, opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt)\n : INVALID;\n }\n\n /**\n * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`.\n * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation\n * of the DateTime in the assigned locale.\n * Defaults to the system's locale if no locale has been specified\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param formatOpts {Object} - Intl.DateTimeFormat constructor options and configuration options\n * @param {Object} opts - opts to override the configuration options on this DateTime\n * @example DateTime.now().toLocaleString(); //=> 4/20/2017\n * @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017'\n * @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017'\n * @example DateTime.now().toLocaleString(DateTime.DATE_FULL, { locale: 'fr' }); //=> '28 août 2022'\n * @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM'\n * @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM'\n * @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20'\n * @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM'\n * @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }); //=> '11:32'\n * @return {string}\n */\n toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this)\n : INVALID;\n }\n\n /**\n * Returns an array of format \"parts\", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output.\n * Defaults to the system's locale if no locale has been specified\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts\n * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`.\n * @example DateTime.now().toLocaleParts(); //=> [\n * //=> { type: 'day', value: '25' },\n * //=> { type: 'literal', value: '/' },\n * //=> { type: 'month', value: '05' },\n * //=> { type: 'literal', value: '/' },\n * //=> { type: 'year', value: '1982' }\n * //=> ]\n */\n toLocaleParts(opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this)\n : [];\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.extendedZone=false] - add the time zone format extension\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'years', 'months', 'days', 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0.\n * @example DateTime.utc(1983, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z'\n * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00'\n * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335'\n * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400'\n * @example DateTime.now().toISO({ precision: 'day' }) //=> '2017-04-22Z'\n * @example DateTime.now().toISO({ precision: 'minute' }) //=> '2017-04-22T20:47Z'\n * @return {string|null}\n */\n toISO({\n format = \"extended\",\n suppressSeconds = false,\n suppressMilliseconds = false,\n includeOffset = true,\n extendedZone = false,\n precision = \"milliseconds\",\n } = {}) {\n if (!this.isValid) {\n return null;\n }\n\n precision = normalizeUnit(precision);\n const ext = format === \"extended\";\n\n let c = toISODate(this, ext, precision);\n if (orderedUnits.indexOf(precision) >= 3) c += \"T\";\n c += toISOTime(\n this,\n ext,\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n );\n return c;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's date component\n * @param {Object} opts - options\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='day'] - truncate output to desired precision: 'years', 'months', or 'days'.\n * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25'\n * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525'\n * @example DateTime.utc(1982, 5, 25).toISODate({ precision: 'month' }) //=> '1982-05'\n * @return {string|null}\n */\n toISODate({ format = \"extended\", precision = \"day\" } = {}) {\n if (!this.isValid) {\n return null;\n }\n return toISODate(this, format === \"extended\", normalizeUnit(precision));\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's week date\n * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2'\n * @return {string}\n */\n toISOWeekDate() {\n return toTechFormat(this, \"kkkk-'W'WW-c\");\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's time component\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.extendedZone=true] - add the time zone format extension\n * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0.\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34, second: 56 }).toISOTime({ precision: 'minute' }) //=> '07:34Z'\n * @return {string}\n */\n toISOTime({\n suppressMilliseconds = false,\n suppressSeconds = false,\n includeOffset = true,\n includePrefix = false,\n extendedZone = false,\n format = \"extended\",\n precision = \"milliseconds\",\n } = {}) {\n if (!this.isValid) {\n return null;\n }\n\n precision = normalizeUnit(precision);\n let c = includePrefix && orderedUnits.indexOf(precision) >= 3 ? \"T\" : \"\";\n return (\n c +\n toISOTime(\n this,\n format === \"extended\",\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n )\n );\n }\n\n /**\n * Returns an RFC 2822-compatible string representation of this DateTime\n * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000'\n * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400'\n * @return {string}\n */\n toRFC2822() {\n return toTechFormat(this, \"EEE, dd LLL yyyy HH:mm:ss ZZZ\", false);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in HTTP headers. The output is always expressed in GMT.\n * Specifically, the string conforms to RFC 1123.\n * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT'\n * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT'\n * @return {string}\n */\n toHTTP() {\n return toTechFormat(this.toUTC(), \"EEE, dd LLL yyyy HH:mm:ss 'GMT'\");\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL Date\n * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13'\n * @return {string|null}\n */\n toSQLDate() {\n if (!this.isValid) {\n return null;\n }\n return toISODate(this, true);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL Time\n * @param {Object} opts - options\n * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00'\n * @example DateTime.utc().toSQL() //=> '05:15:16.345'\n * @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00'\n * @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345'\n * @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York'\n * @return {string}\n */\n toSQLTime({ includeOffset = true, includeZone = false, includeOffsetSpace = true } = {}) {\n let fmt = \"HH:mm:ss.SSS\";\n\n if (includeZone || includeOffset) {\n if (includeOffsetSpace) {\n fmt += \" \";\n }\n if (includeZone) {\n fmt += \"z\";\n } else if (includeOffset) {\n fmt += \"ZZ\";\n }\n }\n\n return toTechFormat(this, fmt, true);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL DateTime\n * @param {Object} opts - options\n * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00'\n * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z'\n * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00'\n * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000'\n * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York'\n * @return {string}\n */\n toSQL(opts = {}) {\n if (!this.isValid) {\n return null;\n }\n\n return `${this.toSQLDate()} ${this.toSQLTime(opts)}`;\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for debugging\n * @return {string}\n */\n toString() {\n return this.isValid ? this.toISO() : INVALID;\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `DateTime { ts: ${this.toISO()}, zone: ${this.zone.name}, locale: ${this.locale} }`;\n } else {\n return `DateTime { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns the epoch milliseconds of this DateTime. Alias of {@link DateTime#toMillis}\n * @return {number}\n */\n valueOf() {\n return this.toMillis();\n }\n\n /**\n * Returns the epoch milliseconds of this DateTime.\n * @return {number}\n */\n toMillis() {\n return this.isValid ? this.ts : NaN;\n }\n\n /**\n * Returns the epoch seconds (including milliseconds in the fractional part) of this DateTime.\n * @return {number}\n */\n toSeconds() {\n return this.isValid ? this.ts / 1000 : NaN;\n }\n\n /**\n * Returns the epoch seconds (as a whole number) of this DateTime.\n * @return {number}\n */\n toUnixInteger() {\n return this.isValid ? Math.floor(this.ts / 1000) : NaN;\n }\n\n /**\n * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON.\n * @return {string}\n */\n toJSON() {\n return this.toISO();\n }\n\n /**\n * Returns a BSON serializable equivalent to this DateTime.\n * @return {Date}\n */\n toBSON() {\n return this.toJSDate();\n }\n\n /**\n * Returns a JavaScript object with this DateTime's year, month, day, and so on.\n * @param opts - options for generating the object\n * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output\n * @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 }\n * @return {Object}\n */\n toObject(opts = {}) {\n if (!this.isValid) return {};\n\n const base = { ...this.c };\n\n if (opts.includeConfig) {\n base.outputCalendar = this.outputCalendar;\n base.numberingSystem = this.loc.numberingSystem;\n base.locale = this.loc.locale;\n }\n return base;\n }\n\n /**\n * Returns a JavaScript Date equivalent to this DateTime.\n * @return {Date}\n */\n toJSDate() {\n return new Date(this.isValid ? this.ts : NaN);\n }\n\n // COMPARE\n\n /**\n * Return the difference between two DateTimes as a Duration.\n * @param {DateTime} otherDateTime - the DateTime to compare this one to\n * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration.\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @example\n * var i1 = DateTime.fromISO('1982-05-25T09:45'),\n * i2 = DateTime.fromISO('1983-10-14T10:30');\n * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 }\n * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 }\n * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 }\n * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 }\n * @return {Duration}\n */\n diff(otherDateTime, unit = \"milliseconds\", opts = {}) {\n if (!this.isValid || !otherDateTime.isValid) {\n return Duration.invalid(\"created by diffing an invalid DateTime\");\n }\n\n const durOpts = { locale: this.locale, numberingSystem: this.numberingSystem, ...opts };\n\n const units = maybeArray(unit).map(Duration.normalizeUnit),\n otherIsLater = otherDateTime.valueOf() > this.valueOf(),\n earlier = otherIsLater ? this : otherDateTime,\n later = otherIsLater ? otherDateTime : this,\n diffed = diff(earlier, later, units, durOpts);\n\n return otherIsLater ? diffed.negate() : diffed;\n }\n\n /**\n * Return the difference between this DateTime and right now.\n * See {@link DateTime#diff}\n * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @return {Duration}\n */\n diffNow(unit = \"milliseconds\", opts = {}) {\n return this.diff(DateTime.now(), unit, opts);\n }\n\n /**\n * Return an Interval spanning between this DateTime and another DateTime\n * @param {DateTime} otherDateTime - the other end point of the Interval\n * @return {Interval|DateTime}\n */\n until(otherDateTime) {\n return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this;\n }\n\n /**\n * Return whether this DateTime is in the same unit of time as another DateTime.\n * Higher-order units must also be identical for this function to return `true`.\n * Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link DateTime#setZone} to convert one of the dates if needed.\n * @param {DateTime} otherDateTime - the other DateTime\n * @param {string} unit - the unit of time to check sameness on\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; only the locale of this DateTime is used\n * @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day\n * @return {boolean}\n */\n hasSame(otherDateTime, unit, opts) {\n if (!this.isValid) return false;\n\n const inputMs = otherDateTime.valueOf();\n const adjustedToZone = this.setZone(otherDateTime.zone, { keepLocalTime: true });\n return (\n adjustedToZone.startOf(unit, opts) <= inputMs && inputMs <= adjustedToZone.endOf(unit, opts)\n );\n }\n\n /**\n * Equality check\n * Two DateTimes are equal if and only if they represent the same millisecond, have the same zone and location, and are both valid.\n * To compare just the millisecond values, use `+dt1 === +dt2`.\n * @param {DateTime} other - the other DateTime\n * @return {boolean}\n */\n equals(other) {\n return (\n this.isValid &&\n other.isValid &&\n this.valueOf() === other.valueOf() &&\n this.zone.equals(other.zone) &&\n this.loc.equals(other.loc)\n );\n }\n\n /**\n * Returns a string representation of a this time relative to now, such as \"in two days\". Can only internationalize if your\n * platform supports Intl.RelativeTimeFormat. Rounds towards zero by default.\n * @param {Object} options - options that affect the output\n * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n * @param {string} [options.style=\"long\"] - the style of units, must be \"long\", \"short\", or \"narrow\"\n * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of \"years\", \"quarters\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", or \"seconds\"\n * @param {boolean} [options.round=true] - whether to round the numbers in the output.\n * @param {string} [options.rounding=\"trunc\"] - rounding method to use when rounding the numbers in the output. Can be \"trunc\" (toward zero), \"expand\" (away from zero), \"round\", \"floor\", or \"ceil\".\n * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding.\n * @param {string} options.locale - override the locale of this DateTime\n * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n * @example DateTime.now().plus({ days: 1 }).toRelative() //=> \"in 1 day\"\n * @example DateTime.now().setLocale(\"es\").toRelative({ days: 1 }) //=> \"dentro de 1 día\"\n * @example DateTime.now().plus({ days: 1 }).toRelative({ locale: \"fr\" }) //=> \"dans 23 heures\"\n * @example DateTime.now().minus({ days: 2 }).toRelative() //=> \"2 days ago\"\n * @example DateTime.now().minus({ days: 2 }).toRelative({ unit: \"hours\" }) //=> \"48 hours ago\"\n * @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> \"1.5 days ago\"\n */\n toRelative(options = {}) {\n if (!this.isValid) return null;\n const base = options.base || DateTime.fromObject({}, { zone: this.zone }),\n padding = options.padding ? (this < base ? -options.padding : options.padding) : 0;\n let units = [\"years\", \"months\", \"days\", \"hours\", \"minutes\", \"seconds\"];\n let unit = options.unit;\n if (Array.isArray(options.unit)) {\n units = options.unit;\n unit = undefined;\n }\n return diffRelative(base, this.plus(padding), {\n ...options,\n numeric: \"always\",\n units,\n unit,\n });\n }\n\n /**\n * Returns a string representation of this date relative to today, such as \"yesterday\" or \"next month\".\n * Only internationalizes on platforms that supports Intl.RelativeTimeFormat.\n * @param {Object} options - options that affect the output\n * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n * @param {string} options.locale - override the locale of this DateTime\n * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of \"years\", \"quarters\", \"months\", \"weeks\", or \"days\"\n * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> \"tomorrow\"\n * @example DateTime.now().setLocale(\"es\").plus({ days: 1 }).toRelative() //=> \"\"mañana\"\n * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: \"fr\" }) //=> \"demain\"\n * @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> \"2 days ago\"\n */\n toRelativeCalendar(options = {}) {\n if (!this.isValid) return null;\n\n return diffRelative(options.base || DateTime.fromObject({}, { zone: this.zone }), this, {\n ...options,\n numeric: \"auto\",\n units: [\"years\", \"months\", \"days\"],\n calendary: true,\n });\n }\n\n /**\n * Return the min of several date times\n * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum\n * @return {DateTime} the min DateTime, or undefined if called with no argument\n */\n static min(...dateTimes) {\n if (!dateTimes.every(DateTime.isDateTime)) {\n throw new InvalidArgumentError(\"min requires all arguments be DateTimes\");\n }\n return bestBy(dateTimes, (i) => i.valueOf(), Math.min);\n }\n\n /**\n * Return the max of several date times\n * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum\n * @return {DateTime} the max DateTime, or undefined if called with no argument\n */\n static max(...dateTimes) {\n if (!dateTimes.every(DateTime.isDateTime)) {\n throw new InvalidArgumentError(\"max requires all arguments be DateTimes\");\n }\n return bestBy(dateTimes, (i) => i.valueOf(), Math.max);\n }\n\n // MISC\n\n /**\n * Explain how a string would be parsed by fromFormat()\n * @param {string} text - the string to parse\n * @param {string} fmt - the format the string is expected to be in (see description)\n * @param {Object} options - options taken by fromFormat()\n * @return {Object}\n */\n static fromFormatExplain(text, fmt, options = {}) {\n const { locale = null, numberingSystem = null } = options,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n return explainFromTokens(localeToUse, text, fmt);\n }\n\n /**\n * @deprecated use fromFormatExplain instead\n */\n static fromStringExplain(text, fmt, options = {}) {\n return DateTime.fromFormatExplain(text, fmt, options);\n }\n\n /**\n * Build a parser for `fmt` using the given locale. This parser can be passed\n * to {@link DateTime.fromFormatParser} to a parse a date in this format. This\n * can be used to optimize cases where many dates need to be parsed in a\n * specific format.\n *\n * @param {String} fmt - the format the string is expected to be in (see\n * description)\n * @param {Object} options - options used to set locale and numberingSystem\n * for parser\n * @returns {TokenParser} - opaque object to be used\n */\n static buildFormatParser(fmt, options = {}) {\n const { locale = null, numberingSystem = null } = options,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n return new TokenParser(localeToUse, fmt);\n }\n\n /**\n * Create a DateTime from an input string and format parser.\n *\n * The format parser must have been created with the same locale as this call.\n *\n * @param {String} text - the string to parse\n * @param {TokenParser} formatParser - parser from {@link DateTime.buildFormatParser}\n * @param {Object} opts - options taken by fromFormat()\n * @returns {DateTime}\n */\n static fromFormatParser(text, formatParser, opts = {}) {\n if (isUndefined(text) || isUndefined(formatParser)) {\n throw new InvalidArgumentError(\n \"fromFormatParser requires an input string and a format parser\"\n );\n }\n const { locale = null, numberingSystem = null } = opts,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n\n if (!localeToUse.equals(formatParser.locale)) {\n throw new InvalidArgumentError(\n `fromFormatParser called with a locale of ${localeToUse}, ` +\n `but the format parser was created for ${formatParser.locale}`\n );\n }\n\n const { result, zone, specificOffset, invalidReason } = formatParser.explainFromTokens(text);\n\n if (invalidReason) {\n return DateTime.invalid(invalidReason);\n } else {\n return parseDataToDateTime(\n result,\n zone,\n opts,\n `format ${formatParser.format}`,\n text,\n specificOffset\n );\n }\n }\n\n // FORMAT PRESETS\n\n /**\n * {@link DateTime#toLocaleString} format like 10/14/1983\n * @type {Object}\n */\n static get DATE_SHORT() {\n return Formats.DATE_SHORT;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983'\n * @type {Object}\n */\n static get DATE_MED() {\n return Formats.DATE_MED;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Fri, Oct 14, 1983'\n * @type {Object}\n */\n static get DATE_MED_WITH_WEEKDAY() {\n return Formats.DATE_MED_WITH_WEEKDAY;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983'\n * @type {Object}\n */\n static get DATE_FULL() {\n return Formats.DATE_FULL;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Tuesday, October 14, 1983'\n * @type {Object}\n */\n static get DATE_HUGE() {\n return Formats.DATE_HUGE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_SIMPLE() {\n return Formats.TIME_SIMPLE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_SECONDS() {\n return Formats.TIME_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_SHORT_OFFSET() {\n return Formats.TIME_WITH_SHORT_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_LONG_OFFSET() {\n return Formats.TIME_WITH_LONG_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_SIMPLE() {\n return Formats.TIME_24_SIMPLE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_SECONDS() {\n return Formats.TIME_24_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 EDT', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_SHORT_OFFSET() {\n return Formats.TIME_24_WITH_SHORT_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_LONG_OFFSET() {\n return Formats.TIME_24_WITH_LONG_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_SHORT() {\n return Formats.DATETIME_SHORT;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_SHORT_WITH_SECONDS() {\n return Formats.DATETIME_SHORT_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED() {\n return Formats.DATETIME_MED;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED_WITH_SECONDS() {\n return Formats.DATETIME_MED_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED_WITH_WEEKDAY() {\n return Formats.DATETIME_MED_WITH_WEEKDAY;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_FULL() {\n return Formats.DATETIME_FULL;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_FULL_WITH_SECONDS() {\n return Formats.DATETIME_FULL_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_HUGE() {\n return Formats.DATETIME_HUGE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_HUGE_WITH_SECONDS() {\n return Formats.DATETIME_HUGE_WITH_SECONDS;\n }\n}\n\n/**\n * @private\n */\nexport function friendlyDateTime(dateTimeish) {\n if (DateTime.isDateTime(dateTimeish)) {\n return dateTimeish;\n } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) {\n return DateTime.fromJSDate(dateTimeish);\n } else if (dateTimeish && typeof dateTimeish === \"object\") {\n return DateTime.fromObject(dateTimeish);\n } else {\n throw new InvalidArgumentError(\n `Unknown datetime argument: ${dateTimeish}, of type ${typeof dateTimeish}`\n );\n }\n}\n","import DateTime from \"./datetime.js\";\nimport Duration from \"./duration.js\";\nimport Interval from \"./interval.js\";\nimport Info from \"./info.js\";\nimport Zone from \"./zone.js\";\nimport FixedOffsetZone from \"./zones/fixedOffsetZone.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport InvalidZone from \"./zones/invalidZone.js\";\nimport SystemZone from \"./zones/systemZone.js\";\nimport Settings from \"./settings.js\";\n\nconst VERSION = \"3.7.2\";\n\nexport {\n VERSION,\n DateTime,\n Duration,\n Interval,\n Info,\n Zone,\n FixedOffsetZone,\n IANAZone,\n InvalidZone,\n SystemZone,\n Settings,\n};\n"],"names":["LuxonError","_Error","_inheritsLoose","apply","arguments","_wrapNativeSuper","Error","InvalidDateTimeError","_LuxonError","reason","call","toMessage","InvalidIntervalError","_LuxonError2","InvalidDurationError","_LuxonError3","ConflictingSpecificationError","_LuxonError4","InvalidUnitError","_LuxonError5","unit","InvalidArgumentError","_LuxonError6","ZoneIsAbstractError","_LuxonError7","n","s","l","DATE_SHORT","year","month","day","DATE_MED","DATE_MED_WITH_WEEKDAY","weekday","DATE_FULL","DATE_HUGE","TIME_SIMPLE","hour","minute","TIME_WITH_SECONDS","second","TIME_WITH_SHORT_OFFSET","timeZoneName","TIME_WITH_LONG_OFFSET","TIME_24_SIMPLE","hourCycle","TIME_24_WITH_SECONDS","TIME_24_WITH_SHORT_OFFSET","TIME_24_WITH_LONG_OFFSET","DATETIME_SHORT","DATETIME_SHORT_WITH_SECONDS","DATETIME_MED","DATETIME_MED_WITH_SECONDS","DATETIME_MED_WITH_WEEKDAY","DATETIME_FULL","DATETIME_FULL_WITH_SECONDS","DATETIME_HUGE","DATETIME_HUGE_WITH_SECONDS","Zone","_proto","prototype","offsetName","ts","opts","formatOffset","format","offset","equals","otherZone","_createClass","key","get","name","singleton","SystemZone","_Zone","_ref","locale","parseZoneInfo","Date","getTimezoneOffset","type","Intl","DateTimeFormat","resolvedOptions","timeZone","dtfCache","Map","makeDTF","zoneName","dtf","undefined","hour12","era","set","typeToPos","hackyOffset","date","formatted","replace","parsed","exec","fMonth","fDay","fYear","fadOrBc","fHour","fMinute","fSecond","partsOffset","formatToParts","filled","i","length","_formatted$i","value","pos","isUndefined","parseInt","ianaZoneCache","IANAZone","create","zone","resetCache","clear","isValidSpecifier","isValidZone","e","_this","valid","NaN","isNaN","_ref2","adOrBc","Math","abs","adjustedHour","asUTC","objToLocalTS","millisecond","asTS","over","intlLFCache","getCachedLF","locString","JSON","stringify","ListFormat","intlDTCache","getCachedDTF","intlNumCache","getCachedINF","inf","NumberFormat","intlRelCache","getCachedRTF","_opts","base","cacheKeyOpts","_objectWithoutPropertiesLoose","_excluded","RelativeTimeFormat","sysLocaleCache","systemLocale","intlResolvedOptionsCache","getCachedIntResolvedOptions","weekInfoCache","getCachedWeekInfo","data","Locale","getWeekInfo","weekInfo","_extends","fallbackWeekSettings","parseLocaleString","localeStr","xIndex","indexOf","substring","uIndex","options","selectedStr","smaller","_options","numberingSystem","calendar","intlConfigString","outputCalendar","includes","mapMonths","f","ms","dt","DateTime","utc","push","mapWeekdays","listStuff","loc","englishFn","intlFn","mode","listingMode","supportsFastNumbers","startsWith","PolyNumberFormatter","intl","forceSimple","padTo","floor","otherOpts","_excluded2","Object","keys","intlOpts","useGrouping","minimumIntegerDigits","fixed","roundTo","padStart","PolyDateFormatter","originalZone","z","gmtOffset","offsetZ","setZone","plus","minutes","_proto2","map","join","toJSDate","parts","part","PolyRelFormatter","isEnglish","style","hasRelative","rtf","_proto3","count","English","numeric","firstDay","minimalDays","weekend","fromOpts","weekSettings","defaultToEN","specifiedLocale","Settings","defaultLocale","localeR","numberingSystemR","defaultNumberingSystem","outputCalendarR","defaultOutputCalendar","weekSettingsR","validateWeekSettings","defaultWeekSettings","fromObject","_temp","numbering","_parseLocaleString","parsedLocale","parsedNumberingSystem","parsedOutputCalendar","weekdaysCache","standalone","monthsCache","meridiemCache","eraCache","fastNumbersCached","_proto4","isActuallyEn","hasNoWeirdness","clone","alts","getOwnPropertyNames","redefaultToEN","redefaultToSystem","months","_this2","monthSpecialCase","formatStr","mapper","extract","dtFormatter","weekdays","_this3","meridiems","_this4","eras","_this5","field","df","results","matching","find","m","toLowerCase","numberFormatter","fastNumbers","relFormatter","listFormatter","getWeekSettings","hasLocaleWeekInfo","getStartOfWeek","getMinDaysInFirstWeek","getWeekendDays","other","toString","FixedOffsetZone","instance","utcInstance","parseSpecifier","r","match","signedOffset","InvalidZone","normalizeZone","input","defaultZone","isString","lowered","isNumber","numberingSystems","arab","arabext","bali","beng","deva","fullwide","gujr","hanidec","khmr","knda","laoo","limb","mlym","mong","mymr","orya","tamldec","telu","thai","tibt","latn","numberingSystemsUTF16","hanidecChars","split","parseDigits","str","code","charCodeAt","search","_numberingSystemsUTF","min","max","digitRegexCache","resetDigitRegexCache","digitRegex","append","ns","appendCache","regex","RegExp","now","twoDigitCutoffYear","throwOnInvalid","resetCaches","cutoffYear","t","Invalid","explanation","nonLeapLadder","leapLadder","unitOutOfRange","dayOfWeek","d","UTC","setUTCFullYear","getUTCFullYear","js","getUTCDay","computeOrdinal","isLeapYear","uncomputeOrdinal","ordinal","table","month0","findIndex","isoWeekdayToLocal","isoWeekday","startOfWeek","gregorianToWeek","gregObj","minDaysInFirstWeek","weekNumber","weekYear","weeksInWeekYear","timeObject","weekToGregorian","weekData","weekdayOfJan4","yearInDays","daysInYear","_uncomputeOrdinal","gregorianToOrdinal","gregData","ordinalToGregorian","ordinalData","_uncomputeOrdinal2","usesLocalWeekValues","obj","hasLocaleWeekData","localWeekday","localWeekNumber","localWeekYear","hasIsoWeekData","hasInvalidWeekData","validYear","isInteger","validWeek","integerBetween","validWeekday","hasInvalidOrdinalData","validOrdinal","hasInvalidGregorianData","validMonth","validDay","daysInMonth","hasInvalidTimeData","validHour","validMinute","validSecond","validMillisecond","o","isDate","maybeArray","thing","Array","isArray","bestBy","arr","by","compare","reduce","best","next","pair","pick","a","k","hasOwnProperty","prop","settings","some","v","from","bottom","top","floorMod","x","isNeg","padded","parseInteger","string","parseFloating","parseFloat","parseMillis","fraction","number","digits","rounding","factor","pow","ceil","trunc","round","RangeError","modMonth","modYear","firstWeekOffset","fwdlw","weekOffset","weekOffsetNext","untruncateYear","offsetFormat","modified","offHourStr","offMinuteStr","offHour","Number","offMin","offMinSigned","is","asNumber","numericValue","isFinite","normalizeObject","normalizer","normalized","u","hours","sign","monthsLong","monthsShort","monthsNarrow","concat","weekdaysLong","weekdaysShort","weekdaysNarrow","erasLong","erasShort","erasNarrow","meridiemForDateTime","weekdayForDateTime","monthForDateTime","eraForDateTime","formatRelativeTime","narrow","units","years","quarters","weeks","days","seconds","lastable","isDay","isInPast","fmtValue","singular","lilUnits","fmtUnit","stringifyTokens","splits","tokenToString","_iterator","_createForOfIteratorHelperLoose","_step","done","token","literal","val","macroTokenToFormatOpts","D","Formats","DD","DDD","DDDD","tt","ttt","tttt","T","TT","TTT","TTTT","ff","fff","ffff","F","FF","FFF","FFFF","Formatter","parseFormat","fmt","current","currentFull","bracketed","c","charAt","test","formatOpts","systemLoc","formatWithSystemDefault","formatDateTime","formatDateTimeParts","formatInterval","interval","start","formatRange","end","num","p","signDisplay","formatDateTimeFromString","knownEnglish","useDateTimeFormatter","isOffsetFixed","allowZ","isValid","meridiem","maybeMacro","slice","quarter","formatDurationFromString","dur","invertLargest","signMode","tokenToField","lildur","info","mapped","inversionFactor","isNegativeDuration","largestUnit","tokens","realTokens","found","collapsed","shiftTo","filter","durationInfo","values","ianaRegex","combineRegexes","_len","regexes","_key","full","source","combineExtractors","_len2","extractors","_key2","ex","mergedVals","mergedZone","cursor","_ex","parse","_len3","patterns","_key3","_i","_patterns","_patterns$_i","extractor","simpleParse","_len4","_key4","ret","offsetRegex","isoExtendedZone","isoTimeBaseRegex","isoTimeRegex","isoTimeExtensionRegex","isoYmdRegex","isoWeekRegex","isoOrdinalRegex","extractISOWeekData","extractISOOrdinalData","sqlYmdRegex","sqlTimeRegex","sqlTimeExtensionRegex","int","fallback","extractISOYmd","item","extractISOTime","milliseconds","extractISOOffset","local","fullOffset","extractIANAZone","isoTimeOnly","isoDuration","extractISODuration","yearStr","monthStr","weekStr","dayStr","hourStr","minuteStr","secondStr","millisecondsStr","hasNegativePrefix","negativeSeconds","maybeNegate","force","obsOffsets","GMT","EDT","EST","CDT","CST","MDT","MST","PDT","PST","fromStrings","weekdayStr","result","rfc2822","extractRFC2822","obsOffset","milOffset","preprocessRFC2822","trim","rfc1123","rfc850","ascii","extractRFC1123Or850","extractASCII","isoYmdWithTimeExtensionRegex","isoWeekWithTimeExtensionRegex","isoOrdinalWithTimeExtensionRegex","isoTimeCombinedRegex","extractISOYmdTimeAndOffset","extractISOWeekTimeAndOffset","extractISOOrdinalDateAndTime","extractISOTimeAndOffset","parseISODate","parseRFC2822Date","parseHTTPDate","parseISODuration","extractISOTimeOnly","parseISOTimeOnly","sqlYmdWithTimeExtensionRegex","sqlTimeCombinedRegex","extractISOTimeOffsetAndIANAZone","parseSQL","INVALID","lowOrderMatrix","casualMatrix","daysInYearAccurate","daysInMonthAccurate","accurateMatrix","orderedUnits","reverseUnits","reverse","conf","conversionAccuracy","matrix","Duration","durationToMillis","vals","_vals$milliseconds","sum","normalizeValues","reduceRight","previous","previousVal","conv","rollUp","removeZeroes","newVals","_Object$entries","entries","_Object$entries$_i","_Symbol$for","config","accurate","invalid","isLuxonDuration","fromMillis","normalizeUnit","fromDurationLike","durationLike","isDuration","fromISO","text","_parseISODuration","fromISOTime","_parseISOTimeOnly","week","toFormat","fmtOpts","toHuman","showZeros","unitDisplay","listStyle","toObject","toISO","toISOTime","millis","toMillis","suppressMilliseconds","suppressSeconds","includePrefix","includeOffset","dateTime","toJSON","invalidReason","valueOf","duration","_i2","_orderedUnits","minus","negate","mapUnits","fn","_i3","_Object$keys","mixed","reconfigure","as","normalize","rescale","shiftToAll","built","accumulated","lastUnit","_i4","_orderedUnits2","own","ak","negated","_i5","_Object$keys2","removeZeros","eq","v1","v2","_i6","_orderedUnits3","Symbol","for","validateStartEnd","Interval","isLuxonInterval","fromDateTimes","builtStart","friendlyDateTime","builtEnd","validateError","after","before","_split","startIsValid","endIsValid","isInterval","toDuration","startOf","useLocaleWeeks","diff","hasSame","isEmpty","isAfter","isBefore","contains","splitAt","dateTimes","sorted","sort","b","added","splitBy","idx","divideEqually","numberOfParts","overlaps","abutsStart","abutsEnd","engulfs","intersection","union","merge","intervals","_intervals$sort$reduc","sofar","final","xor","_Array$prototype","currentCount","ends","time","flattened","difference","toLocaleString","toISODate","dateFormat","_temp2","_ref3","_ref3$separator","separator","mapEndpoints","mapFn","Info","hasDST","proto","isUniversal","isValidIANAZone","_ref$locale","_ref$locObj","locObj","getMinimumDaysInFirstWeek","_ref2$locale","_ref2$locObj","getWeekendWeekdays","_temp3","_ref3$locale","_ref3$locObj","_temp4","_ref4","_ref4$locale","_ref4$numberingSystem","_ref4$locObj","_ref4$outputCalendar","monthsFormat","_temp5","_ref5","_ref5$locale","_ref5$numberingSystem","_ref5$locObj","_ref5$outputCalendar","_temp6","_ref6","_ref6$locale","_ref6$numberingSystem","_ref6$locObj","weekdaysFormat","_temp7","_ref7","_ref7$locale","_ref7$numberingSystem","_ref7$locObj","_temp8","_ref8","_ref8$locale","_temp9","_ref9","_ref9$locale","features","relative","localeWeek","dayDiff","earlier","later","utcDayStart","toUTC","keepLocalTime","highOrderDiffs","differs","lowestOrder","highWater","_differs","_differs$_i","differ","_highOrderDiffs","remainingMillis","lowerOrderUnits","_cursor$plus","_Duration$fromMillis","MISSING_FTP","intUnit","post","deser","NBSP","String","fromCharCode","spaceOrNBSP","spaceOrNBSPRegExp","fixListRegex","stripInsensitivities","oneOf","strings","startIndex","groups","h","simple","escapeToken","unitForToken","one","two","three","four","six","oneOrTwo","oneToThree","oneToSix","oneToNine","twoToFour","fourToSix","unitate","partTypeStyleToTokenVal","short","long","dayperiod","dayPeriod","hour24","tokenForPart","resolvedOpts","isSpace","actualType","buildRegex","re","handlers","matches","all","matchIndex","dateTimeFromMatches","toField","specificOffset","Z","q","M","G","y","S","dummyDateTimeCache","getDummyDateTime","maybeExpandMacroToken","formatOptsToTokens","expandMacroTokens","TokenParser","disqualifyingUnit","_buildRegex","regexString","explainFromTokens","_match","rawMatches","parser","parseFromTokens","_explainFromTokens","formatter","MAX_DATE","unsupportedZone","possiblyCachedWeekData","possiblyCachedLocalWeekData","localWeekData","inst","old","fixOffset","localTS","tz","utcGuess","o2","o3","tsToObj","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","objToTS","adjustTime","oPre","millisToAdd","_fixOffset","parseDataToDateTime","parsedZone","interpretationZone","toTechFormat","extended","precision","longFormat","extendedZone","showSeconds","ianaName","defaultUnitValues","defaultWeekUnitValues","defaultOrdinalUnitValues","orderedWeekUnits","orderedOrdinalUnits","weeknumber","weeksnumber","weeknumbers","weekyear","weekyears","normalizeUnitWithLocalWeeks","guessOffsetForZone","zoneOffsetTs","offsetGuess","zoneOffsetGuessCache","quickDT","offsetProvis","_objToTS","diffRelative","calendary","lastOpts","argList","args","unchanged","ot","_zone","isLuxonDateTime","_lastOpts","_lastOpts2","fromJSDate","zoneToUse","fromSeconds","_usesLocalWeekValues","tsNow","containsOrdinal","containsGregorYear","containsGregorMD","containsGregor","definiteWeekDef","useWeekData","defaultValues","objNow","foundFirst","_iterator2","_step2","higherOrderInvalid","gregorian","_objToTS2","tsFinal","offsetFinal","_parseISODate","fromRFC2822","_parseRFC2822Date","fromHTTP","_parseHTTPDate","fromFormat","_opts$locale","_opts$numberingSystem","localeToUse","_parseFromTokens","fromString","fromSQL","_parseSQL","isDateTime","parseFormatForOpts","localeOpts","tokenList","expandFormat","expanded","getPossibleOffsets","dayMs","minuteMs","oEarlier","oLater","o1","ts1","ts2","c1","c2","resolvedLocaleOptions","_Formatter$create$res","toLocal","_ref2$keepLocalTime","_ref2$keepCalendarTim","keepCalendarTime","newTS","asObj","_objToTS3","setLocale","_usesLocalWeekValues2","settingWeekStuff","_objToTS4","_ref4$useLocaleWeeks","normalizedUnit","endOf","_this$plus","toLocaleParts","_ref5$format","_ref5$suppressSeconds","_ref5$suppressMillise","_ref5$includeOffset","_ref5$extendedZone","_ref5$precision","ext","_ref6$format","_ref6$precision","toISOWeekDate","_ref7$suppressMillise","_ref7$suppressSeconds","_ref7$includeOffset","_ref7$includePrefix","_ref7$extendedZone","_ref7$format","_ref7$precision","toRFC2822","toHTTP","toSQLDate","toSQLTime","_ref8$includeOffset","_ref8$includeZone","includeZone","_ref8$includeOffsetSp","includeOffsetSpace","toSQL","toSeconds","toUnixInteger","toBSON","includeConfig","otherDateTime","durOpts","otherIsLater","diffed","diffNow","until","inputMs","adjustedToZone","toRelative","padding","toRelativeCalendar","every","fromFormatExplain","_options$locale","_options$numberingSys","fromStringExplain","buildFormatParser","_options2","_options2$locale","_options2$numberingSy","fromFormatParser","formatParser","_opts2","_opts2$locale","_opts2$numberingSyste","_formatParser$explain","dateTimeish","VERSION"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/luxon/build/cjs-browser/luxon.js b/node_modules/luxon/build/cjs-browser/luxon.js new file mode 100644 index 00000000..679b0ee4 --- /dev/null +++ b/node_modules/luxon/build/cjs-browser/luxon.js @@ -0,0 +1,8739 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); + } +} +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", { + writable: false + }); + return Constructor; +} +function _extends() { + _extends = Object.assign ? Object.assign.bind() : function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + return target; + }; + return _extends.apply(this, arguments); +} +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + _setPrototypeOf(subClass, superClass); +} +function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); +} +function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf(o, p); +} +function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } +} +function _construct(Parent, args, Class) { + if (_isNativeReflectConstruct()) { + _construct = Reflect.construct.bind(); + } else { + _construct = function _construct(Parent, args, Class) { + var a = [null]; + a.push.apply(a, args); + var Constructor = Function.bind.apply(Parent, a); + var instance = new Constructor(); + if (Class) _setPrototypeOf(instance, Class.prototype); + return instance; + }; + } + return _construct.apply(null, arguments); +} +function _isNativeFunction(fn) { + return Function.toString.call(fn).indexOf("[native code]") !== -1; +} +function _wrapNativeSuper(Class) { + var _cache = typeof Map === "function" ? new Map() : undefined; + _wrapNativeSuper = function _wrapNativeSuper(Class) { + if (Class === null || !_isNativeFunction(Class)) return Class; + if (typeof Class !== "function") { + throw new TypeError("Super expression must either be null or a function"); + } + if (typeof _cache !== "undefined") { + if (_cache.has(Class)) return _cache.get(Class); + _cache.set(Class, Wrapper); + } + function Wrapper() { + return _construct(Class, arguments, _getPrototypeOf(this).constructor); + } + Wrapper.prototype = Object.create(Class.prototype, { + constructor: { + value: Wrapper, + enumerable: false, + writable: true, + configurable: true + } + }); + return _setPrototypeOf(Wrapper, Class); + }; + return _wrapNativeSuper(Class); +} +function _objectWithoutPropertiesLoose(source, excluded) { + if (source == null) return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i; + for (i = 0; i < sourceKeys.length; i++) { + key = sourceKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + target[key] = source[key]; + } + return target; +} +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; + return arr2; +} +function _createForOfIteratorHelperLoose(o, allowArrayLike) { + var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; + if (it) return (it = it.call(o)).next.bind(it); + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + return function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +} +function _toPrimitive(input, hint) { + if (typeof input !== "object" || input === null) return input; + var prim = input[Symbol.toPrimitive]; + if (prim !== undefined) { + var res = prim.call(input, hint || "default"); + if (typeof res !== "object") return res; + throw new TypeError("@@toPrimitive must return a primitive value."); + } + return (hint === "string" ? String : Number)(input); +} +function _toPropertyKey(arg) { + var key = _toPrimitive(arg, "string"); + return typeof key === "symbol" ? key : String(key); +} + +// these aren't really private, but nor are they really useful to document +/** + * @private + */ +var LuxonError = /*#__PURE__*/function (_Error) { + _inheritsLoose(LuxonError, _Error); + function LuxonError() { + return _Error.apply(this, arguments) || this; + } + return LuxonError; +}( /*#__PURE__*/_wrapNativeSuper(Error)); +/** + * @private + */ +var InvalidDateTimeError = /*#__PURE__*/function (_LuxonError) { + _inheritsLoose(InvalidDateTimeError, _LuxonError); + function InvalidDateTimeError(reason) { + return _LuxonError.call(this, "Invalid DateTime: " + reason.toMessage()) || this; + } + return InvalidDateTimeError; +}(LuxonError); + +/** + * @private + */ +var InvalidIntervalError = /*#__PURE__*/function (_LuxonError2) { + _inheritsLoose(InvalidIntervalError, _LuxonError2); + function InvalidIntervalError(reason) { + return _LuxonError2.call(this, "Invalid Interval: " + reason.toMessage()) || this; + } + return InvalidIntervalError; +}(LuxonError); + +/** + * @private + */ +var InvalidDurationError = /*#__PURE__*/function (_LuxonError3) { + _inheritsLoose(InvalidDurationError, _LuxonError3); + function InvalidDurationError(reason) { + return _LuxonError3.call(this, "Invalid Duration: " + reason.toMessage()) || this; + } + return InvalidDurationError; +}(LuxonError); + +/** + * @private + */ +var ConflictingSpecificationError = /*#__PURE__*/function (_LuxonError4) { + _inheritsLoose(ConflictingSpecificationError, _LuxonError4); + function ConflictingSpecificationError() { + return _LuxonError4.apply(this, arguments) || this; + } + return ConflictingSpecificationError; +}(LuxonError); + +/** + * @private + */ +var InvalidUnitError = /*#__PURE__*/function (_LuxonError5) { + _inheritsLoose(InvalidUnitError, _LuxonError5); + function InvalidUnitError(unit) { + return _LuxonError5.call(this, "Invalid unit " + unit) || this; + } + return InvalidUnitError; +}(LuxonError); + +/** + * @private + */ +var InvalidArgumentError = /*#__PURE__*/function (_LuxonError6) { + _inheritsLoose(InvalidArgumentError, _LuxonError6); + function InvalidArgumentError() { + return _LuxonError6.apply(this, arguments) || this; + } + return InvalidArgumentError; +}(LuxonError); + +/** + * @private + */ +var ZoneIsAbstractError = /*#__PURE__*/function (_LuxonError7) { + _inheritsLoose(ZoneIsAbstractError, _LuxonError7); + function ZoneIsAbstractError() { + return _LuxonError7.call(this, "Zone is an abstract class") || this; + } + return ZoneIsAbstractError; +}(LuxonError); + +/** + * @private + */ + +var n = "numeric", + s = "short", + l = "long"; +var DATE_SHORT = { + year: n, + month: n, + day: n +}; +var DATE_MED = { + year: n, + month: s, + day: n +}; +var DATE_MED_WITH_WEEKDAY = { + year: n, + month: s, + day: n, + weekday: s +}; +var DATE_FULL = { + year: n, + month: l, + day: n +}; +var DATE_HUGE = { + year: n, + month: l, + day: n, + weekday: l +}; +var TIME_SIMPLE = { + hour: n, + minute: n +}; +var TIME_WITH_SECONDS = { + hour: n, + minute: n, + second: n +}; +var TIME_WITH_SHORT_OFFSET = { + hour: n, + minute: n, + second: n, + timeZoneName: s +}; +var TIME_WITH_LONG_OFFSET = { + hour: n, + minute: n, + second: n, + timeZoneName: l +}; +var TIME_24_SIMPLE = { + hour: n, + minute: n, + hourCycle: "h23" +}; +var TIME_24_WITH_SECONDS = { + hour: n, + minute: n, + second: n, + hourCycle: "h23" +}; +var TIME_24_WITH_SHORT_OFFSET = { + hour: n, + minute: n, + second: n, + hourCycle: "h23", + timeZoneName: s +}; +var TIME_24_WITH_LONG_OFFSET = { + hour: n, + minute: n, + second: n, + hourCycle: "h23", + timeZoneName: l +}; +var DATETIME_SHORT = { + year: n, + month: n, + day: n, + hour: n, + minute: n +}; +var DATETIME_SHORT_WITH_SECONDS = { + year: n, + month: n, + day: n, + hour: n, + minute: n, + second: n +}; +var DATETIME_MED = { + year: n, + month: s, + day: n, + hour: n, + minute: n +}; +var DATETIME_MED_WITH_SECONDS = { + year: n, + month: s, + day: n, + hour: n, + minute: n, + second: n +}; +var DATETIME_MED_WITH_WEEKDAY = { + year: n, + month: s, + day: n, + weekday: s, + hour: n, + minute: n +}; +var DATETIME_FULL = { + year: n, + month: l, + day: n, + hour: n, + minute: n, + timeZoneName: s +}; +var DATETIME_FULL_WITH_SECONDS = { + year: n, + month: l, + day: n, + hour: n, + minute: n, + second: n, + timeZoneName: s +}; +var DATETIME_HUGE = { + year: n, + month: l, + day: n, + weekday: l, + hour: n, + minute: n, + timeZoneName: l +}; +var DATETIME_HUGE_WITH_SECONDS = { + year: n, + month: l, + day: n, + weekday: l, + hour: n, + minute: n, + second: n, + timeZoneName: l +}; + +/** + * @interface + */ +var Zone = /*#__PURE__*/function () { + function Zone() {} + var _proto = Zone.prototype; + /** + * Returns the offset's common name (such as EST) at the specified timestamp + * @abstract + * @param {number} ts - Epoch milliseconds for which to get the name + * @param {Object} opts - Options to affect the format + * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'. + * @param {string} opts.locale - What locale to return the offset name in. + * @return {string} + */ + _proto.offsetName = function offsetName(ts, opts) { + throw new ZoneIsAbstractError(); + } + + /** + * Returns the offset's value as a string + * @abstract + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */; + _proto.formatOffset = function formatOffset(ts, format) { + throw new ZoneIsAbstractError(); + } + + /** + * Return the offset in minutes for this zone at the specified timestamp. + * @abstract + * @param {number} ts - Epoch milliseconds for which to compute the offset + * @return {number} + */; + _proto.offset = function offset(ts) { + throw new ZoneIsAbstractError(); + } + + /** + * Return whether this Zone is equal to another zone + * @abstract + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */; + _proto.equals = function equals(otherZone) { + throw new ZoneIsAbstractError(); + } + + /** + * Return whether this Zone is valid. + * @abstract + * @type {boolean} + */; + _createClass(Zone, [{ + key: "type", + get: + /** + * The type of zone + * @abstract + * @type {string} + */ + function get() { + throw new ZoneIsAbstractError(); + } + + /** + * The name of this zone. + * @abstract + * @type {string} + */ + }, { + key: "name", + get: function get() { + throw new ZoneIsAbstractError(); + } + + /** + * The IANA name of this zone. + * Defaults to `name` if not overwritten by a subclass. + * @abstract + * @type {string} + */ + }, { + key: "ianaName", + get: function get() { + return this.name; + } + + /** + * Returns whether the offset is known to be fixed for the whole year. + * @abstract + * @type {boolean} + */ + }, { + key: "isUniversal", + get: function get() { + throw new ZoneIsAbstractError(); + } + }, { + key: "isValid", + get: function get() { + throw new ZoneIsAbstractError(); + } + }]); + return Zone; +}(); + +var singleton$1 = null; + +/** + * Represents the local zone for this JavaScript environment. + * @implements {Zone} + */ +var SystemZone = /*#__PURE__*/function (_Zone) { + _inheritsLoose(SystemZone, _Zone); + function SystemZone() { + return _Zone.apply(this, arguments) || this; + } + var _proto = SystemZone.prototype; + /** @override **/ + _proto.offsetName = function offsetName(ts, _ref) { + var format = _ref.format, + locale = _ref.locale; + return parseZoneInfo(ts, format, locale); + } + + /** @override **/; + _proto.formatOffset = function formatOffset$1(ts, format) { + return formatOffset(this.offset(ts), format); + } + + /** @override **/; + _proto.offset = function offset(ts) { + return -new Date(ts).getTimezoneOffset(); + } + + /** @override **/; + _proto.equals = function equals(otherZone) { + return otherZone.type === "system"; + } + + /** @override **/; + _createClass(SystemZone, [{ + key: "type", + get: /** @override **/ + function get() { + return "system"; + } + + /** @override **/ + }, { + key: "name", + get: function get() { + return new Intl.DateTimeFormat().resolvedOptions().timeZone; + } + + /** @override **/ + }, { + key: "isUniversal", + get: function get() { + return false; + } + }, { + key: "isValid", + get: function get() { + return true; + } + }], [{ + key: "instance", + get: + /** + * Get a singleton instance of the local zone + * @return {SystemZone} + */ + function get() { + if (singleton$1 === null) { + singleton$1 = new SystemZone(); + } + return singleton$1; + } + }]); + return SystemZone; +}(Zone); + +var dtfCache = new Map(); +function makeDTF(zoneName) { + var dtf = dtfCache.get(zoneName); + if (dtf === undefined) { + dtf = new Intl.DateTimeFormat("en-US", { + hour12: false, + timeZone: zoneName, + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + era: "short" + }); + dtfCache.set(zoneName, dtf); + } + return dtf; +} +var typeToPos = { + year: 0, + month: 1, + day: 2, + era: 3, + hour: 4, + minute: 5, + second: 6 +}; +function hackyOffset(dtf, date) { + var formatted = dtf.format(date).replace(/\u200E/g, ""), + parsed = /(\d+)\/(\d+)\/(\d+) (AD|BC),? (\d+):(\d+):(\d+)/.exec(formatted), + fMonth = parsed[1], + fDay = parsed[2], + fYear = parsed[3], + fadOrBc = parsed[4], + fHour = parsed[5], + fMinute = parsed[6], + fSecond = parsed[7]; + return [fYear, fMonth, fDay, fadOrBc, fHour, fMinute, fSecond]; +} +function partsOffset(dtf, date) { + var formatted = dtf.formatToParts(date); + var filled = []; + for (var i = 0; i < formatted.length; i++) { + var _formatted$i = formatted[i], + type = _formatted$i.type, + value = _formatted$i.value; + var pos = typeToPos[type]; + if (type === "era") { + filled[pos] = value; + } else if (!isUndefined(pos)) { + filled[pos] = parseInt(value, 10); + } + } + return filled; +} +var ianaZoneCache = new Map(); +/** + * A zone identified by an IANA identifier, like America/New_York + * @implements {Zone} + */ +var IANAZone = /*#__PURE__*/function (_Zone) { + _inheritsLoose(IANAZone, _Zone); + /** + * @param {string} name - Zone name + * @return {IANAZone} + */ + IANAZone.create = function create(name) { + var zone = ianaZoneCache.get(name); + if (zone === undefined) { + ianaZoneCache.set(name, zone = new IANAZone(name)); + } + return zone; + } + + /** + * Reset local caches. Should only be necessary in testing scenarios. + * @return {void} + */; + IANAZone.resetCache = function resetCache() { + ianaZoneCache.clear(); + dtfCache.clear(); + } + + /** + * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that. + * @param {string} s - The string to check validity on + * @example IANAZone.isValidSpecifier("America/New_York") //=> true + * @example IANAZone.isValidSpecifier("Sport~~blorp") //=> false + * @deprecated For backward compatibility, this forwards to isValidZone, better use `isValidZone()` directly instead. + * @return {boolean} + */; + IANAZone.isValidSpecifier = function isValidSpecifier(s) { + return this.isValidZone(s); + } + + /** + * Returns whether the provided string identifies a real zone + * @param {string} zone - The string to check + * @example IANAZone.isValidZone("America/New_York") //=> true + * @example IANAZone.isValidZone("Fantasia/Castle") //=> false + * @example IANAZone.isValidZone("Sport~~blorp") //=> false + * @return {boolean} + */; + IANAZone.isValidZone = function isValidZone(zone) { + if (!zone) { + return false; + } + try { + new Intl.DateTimeFormat("en-US", { + timeZone: zone + }).format(); + return true; + } catch (e) { + return false; + } + }; + function IANAZone(name) { + var _this; + _this = _Zone.call(this) || this; + /** @private **/ + _this.zoneName = name; + /** @private **/ + _this.valid = IANAZone.isValidZone(name); + return _this; + } + + /** + * The type of zone. `iana` for all instances of `IANAZone`. + * @override + * @type {string} + */ + var _proto = IANAZone.prototype; + /** + * Returns the offset's common name (such as EST) at the specified timestamp + * @override + * @param {number} ts - Epoch milliseconds for which to get the name + * @param {Object} opts - Options to affect the format + * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'. + * @param {string} opts.locale - What locale to return the offset name in. + * @return {string} + */ + _proto.offsetName = function offsetName(ts, _ref) { + var format = _ref.format, + locale = _ref.locale; + return parseZoneInfo(ts, format, locale, this.name); + } + + /** + * Returns the offset's value as a string + * @override + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */; + _proto.formatOffset = function formatOffset$1(ts, format) { + return formatOffset(this.offset(ts), format); + } + + /** + * Return the offset in minutes for this zone at the specified timestamp. + * @override + * @param {number} ts - Epoch milliseconds for which to compute the offset + * @return {number} + */; + _proto.offset = function offset(ts) { + if (!this.valid) return NaN; + var date = new Date(ts); + if (isNaN(date)) return NaN; + var dtf = makeDTF(this.name); + var _ref2 = dtf.formatToParts ? partsOffset(dtf, date) : hackyOffset(dtf, date), + year = _ref2[0], + month = _ref2[1], + day = _ref2[2], + adOrBc = _ref2[3], + hour = _ref2[4], + minute = _ref2[5], + second = _ref2[6]; + if (adOrBc === "BC") { + year = -Math.abs(year) + 1; + } + + // because we're using hour12 and https://bugs.chromium.org/p/chromium/issues/detail?id=1025564&can=2&q=%2224%3A00%22%20datetimeformat + var adjustedHour = hour === 24 ? 0 : hour; + var asUTC = objToLocalTS({ + year: year, + month: month, + day: day, + hour: adjustedHour, + minute: minute, + second: second, + millisecond: 0 + }); + var asTS = +date; + var over = asTS % 1000; + asTS -= over >= 0 ? over : 1000 + over; + return (asUTC - asTS) / (60 * 1000); + } + + /** + * Return whether this Zone is equal to another zone + * @override + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */; + _proto.equals = function equals(otherZone) { + return otherZone.type === "iana" && otherZone.name === this.name; + } + + /** + * Return whether this Zone is valid. + * @override + * @type {boolean} + */; + _createClass(IANAZone, [{ + key: "type", + get: function get() { + return "iana"; + } + + /** + * The name of this zone (i.e. the IANA zone name). + * @override + * @type {string} + */ + }, { + key: "name", + get: function get() { + return this.zoneName; + } + + /** + * Returns whether the offset is known to be fixed for the whole year: + * Always returns false for all IANA zones. + * @override + * @type {boolean} + */ + }, { + key: "isUniversal", + get: function get() { + return false; + } + }, { + key: "isValid", + get: function get() { + return this.valid; + } + }]); + return IANAZone; +}(Zone); + +var _excluded = ["base"], + _excluded2 = ["padTo", "floor"]; + +// todo - remap caching + +var intlLFCache = {}; +function getCachedLF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var key = JSON.stringify([locString, opts]); + var dtf = intlLFCache[key]; + if (!dtf) { + dtf = new Intl.ListFormat(locString, opts); + intlLFCache[key] = dtf; + } + return dtf; +} +var intlDTCache = new Map(); +function getCachedDTF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var key = JSON.stringify([locString, opts]); + var dtf = intlDTCache.get(key); + if (dtf === undefined) { + dtf = new Intl.DateTimeFormat(locString, opts); + intlDTCache.set(key, dtf); + } + return dtf; +} +var intlNumCache = new Map(); +function getCachedINF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var key = JSON.stringify([locString, opts]); + var inf = intlNumCache.get(key); + if (inf === undefined) { + inf = new Intl.NumberFormat(locString, opts); + intlNumCache.set(key, inf); + } + return inf; +} +var intlRelCache = new Map(); +function getCachedRTF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var _opts = opts; + _opts.base; + var cacheKeyOpts = _objectWithoutPropertiesLoose(_opts, _excluded); // exclude `base` from the options + var key = JSON.stringify([locString, cacheKeyOpts]); + var inf = intlRelCache.get(key); + if (inf === undefined) { + inf = new Intl.RelativeTimeFormat(locString, opts); + intlRelCache.set(key, inf); + } + return inf; +} +var sysLocaleCache = null; +function systemLocale() { + if (sysLocaleCache) { + return sysLocaleCache; + } else { + sysLocaleCache = new Intl.DateTimeFormat().resolvedOptions().locale; + return sysLocaleCache; + } +} +var intlResolvedOptionsCache = new Map(); +function getCachedIntResolvedOptions(locString) { + var opts = intlResolvedOptionsCache.get(locString); + if (opts === undefined) { + opts = new Intl.DateTimeFormat(locString).resolvedOptions(); + intlResolvedOptionsCache.set(locString, opts); + } + return opts; +} +var weekInfoCache = new Map(); +function getCachedWeekInfo(locString) { + var data = weekInfoCache.get(locString); + if (!data) { + var locale = new Intl.Locale(locString); + // browsers currently implement this as a property, but spec says it should be a getter function + data = "getWeekInfo" in locale ? locale.getWeekInfo() : locale.weekInfo; + // minimalDays was removed from WeekInfo: https://github.com/tc39/proposal-intl-locale-info/issues/86 + if (!("minimalDays" in data)) { + data = _extends({}, fallbackWeekSettings, data); + } + weekInfoCache.set(locString, data); + } + return data; +} +function parseLocaleString(localeStr) { + // I really want to avoid writing a BCP 47 parser + // see, e.g. https://github.com/wooorm/bcp-47 + // Instead, we'll do this: + + // a) if the string has no -u extensions, just leave it alone + // b) if it does, use Intl to resolve everything + // c) if Intl fails, try again without the -u + + // private subtags and unicode subtags have ordering requirements, + // and we're not properly parsing this, so just strip out the + // private ones if they exist. + var xIndex = localeStr.indexOf("-x-"); + if (xIndex !== -1) { + localeStr = localeStr.substring(0, xIndex); + } + var uIndex = localeStr.indexOf("-u-"); + if (uIndex === -1) { + return [localeStr]; + } else { + var options; + var selectedStr; + try { + options = getCachedDTF(localeStr).resolvedOptions(); + selectedStr = localeStr; + } catch (e) { + var smaller = localeStr.substring(0, uIndex); + options = getCachedDTF(smaller).resolvedOptions(); + selectedStr = smaller; + } + var _options = options, + numberingSystem = _options.numberingSystem, + calendar = _options.calendar; + return [selectedStr, numberingSystem, calendar]; + } +} +function intlConfigString(localeStr, numberingSystem, outputCalendar) { + if (outputCalendar || numberingSystem) { + if (!localeStr.includes("-u-")) { + localeStr += "-u"; + } + if (outputCalendar) { + localeStr += "-ca-" + outputCalendar; + } + if (numberingSystem) { + localeStr += "-nu-" + numberingSystem; + } + return localeStr; + } else { + return localeStr; + } +} +function mapMonths(f) { + var ms = []; + for (var i = 1; i <= 12; i++) { + var dt = DateTime.utc(2009, i, 1); + ms.push(f(dt)); + } + return ms; +} +function mapWeekdays(f) { + var ms = []; + for (var i = 1; i <= 7; i++) { + var dt = DateTime.utc(2016, 11, 13 + i); + ms.push(f(dt)); + } + return ms; +} +function listStuff(loc, length, englishFn, intlFn) { + var mode = loc.listingMode(); + if (mode === "error") { + return null; + } else if (mode === "en") { + return englishFn(length); + } else { + return intlFn(length); + } +} +function supportsFastNumbers(loc) { + if (loc.numberingSystem && loc.numberingSystem !== "latn") { + return false; + } else { + return loc.numberingSystem === "latn" || !loc.locale || loc.locale.startsWith("en") || getCachedIntResolvedOptions(loc.locale).numberingSystem === "latn"; + } +} + +/** + * @private + */ +var PolyNumberFormatter = /*#__PURE__*/function () { + function PolyNumberFormatter(intl, forceSimple, opts) { + this.padTo = opts.padTo || 0; + this.floor = opts.floor || false; + opts.padTo; + opts.floor; + var otherOpts = _objectWithoutPropertiesLoose(opts, _excluded2); + if (!forceSimple || Object.keys(otherOpts).length > 0) { + var intlOpts = _extends({ + useGrouping: false + }, opts); + if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo; + this.inf = getCachedINF(intl, intlOpts); + } + } + var _proto = PolyNumberFormatter.prototype; + _proto.format = function format(i) { + if (this.inf) { + var fixed = this.floor ? Math.floor(i) : i; + return this.inf.format(fixed); + } else { + // to match the browser's numberformatter defaults + var _fixed = this.floor ? Math.floor(i) : roundTo(i, 3); + return padStart(_fixed, this.padTo); + } + }; + return PolyNumberFormatter; +}(); +/** + * @private + */ +var PolyDateFormatter = /*#__PURE__*/function () { + function PolyDateFormatter(dt, intl, opts) { + this.opts = opts; + this.originalZone = undefined; + var z = undefined; + if (this.opts.timeZone) { + // Don't apply any workarounds if a timeZone is explicitly provided in opts + this.dt = dt; + } else if (dt.zone.type === "fixed") { + // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like. + // That is why fixed-offset TZ is set to that unless it is: + // 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT. + // 2. Unsupported by the browser: + // - some do not support Etc/ + // - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata + var gmtOffset = -1 * (dt.offset / 60); + var offsetZ = gmtOffset >= 0 ? "Etc/GMT+" + gmtOffset : "Etc/GMT" + gmtOffset; + if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) { + z = offsetZ; + this.dt = dt; + } else { + // Not all fixed-offset zones like Etc/+4:30 are present in tzdata so + // we manually apply the offset and substitute the zone as needed. + z = "UTC"; + this.dt = dt.offset === 0 ? dt : dt.setZone("UTC").plus({ + minutes: dt.offset + }); + this.originalZone = dt.zone; + } + } else if (dt.zone.type === "system") { + this.dt = dt; + } else if (dt.zone.type === "iana") { + this.dt = dt; + z = dt.zone.name; + } else { + // Custom zones can have any offset / offsetName so we just manually + // apply the offset and substitute the zone as needed. + z = "UTC"; + this.dt = dt.setZone("UTC").plus({ + minutes: dt.offset + }); + this.originalZone = dt.zone; + } + var intlOpts = _extends({}, this.opts); + intlOpts.timeZone = intlOpts.timeZone || z; + this.dtf = getCachedDTF(intl, intlOpts); + } + var _proto2 = PolyDateFormatter.prototype; + _proto2.format = function format() { + if (this.originalZone) { + // If we have to substitute in the actual zone name, we have to use + // formatToParts so that the timezone can be replaced. + return this.formatToParts().map(function (_ref) { + var value = _ref.value; + return value; + }).join(""); + } + return this.dtf.format(this.dt.toJSDate()); + }; + _proto2.formatToParts = function formatToParts() { + var _this = this; + var parts = this.dtf.formatToParts(this.dt.toJSDate()); + if (this.originalZone) { + return parts.map(function (part) { + if (part.type === "timeZoneName") { + var offsetName = _this.originalZone.offsetName(_this.dt.ts, { + locale: _this.dt.locale, + format: _this.opts.timeZoneName + }); + return _extends({}, part, { + value: offsetName + }); + } else { + return part; + } + }); + } + return parts; + }; + _proto2.resolvedOptions = function resolvedOptions() { + return this.dtf.resolvedOptions(); + }; + return PolyDateFormatter; +}(); +/** + * @private + */ +var PolyRelFormatter = /*#__PURE__*/function () { + function PolyRelFormatter(intl, isEnglish, opts) { + this.opts = _extends({ + style: "long" + }, opts); + if (!isEnglish && hasRelative()) { + this.rtf = getCachedRTF(intl, opts); + } + } + var _proto3 = PolyRelFormatter.prototype; + _proto3.format = function format(count, unit) { + if (this.rtf) { + return this.rtf.format(count, unit); + } else { + return formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== "long"); + } + }; + _proto3.formatToParts = function formatToParts(count, unit) { + if (this.rtf) { + return this.rtf.formatToParts(count, unit); + } else { + return []; + } + }; + return PolyRelFormatter; +}(); +var fallbackWeekSettings = { + firstDay: 1, + minimalDays: 4, + weekend: [6, 7] +}; + +/** + * @private + */ +var Locale = /*#__PURE__*/function () { + Locale.fromOpts = function fromOpts(opts) { + return Locale.create(opts.locale, opts.numberingSystem, opts.outputCalendar, opts.weekSettings, opts.defaultToEN); + }; + Locale.create = function create(locale, numberingSystem, outputCalendar, weekSettings, defaultToEN) { + if (defaultToEN === void 0) { + defaultToEN = false; + } + var specifiedLocale = locale || Settings.defaultLocale; + // the system locale is useful for human-readable strings but annoying for parsing/formatting known formats + var localeR = specifiedLocale || (defaultToEN ? "en-US" : systemLocale()); + var numberingSystemR = numberingSystem || Settings.defaultNumberingSystem; + var outputCalendarR = outputCalendar || Settings.defaultOutputCalendar; + var weekSettingsR = validateWeekSettings(weekSettings) || Settings.defaultWeekSettings; + return new Locale(localeR, numberingSystemR, outputCalendarR, weekSettingsR, specifiedLocale); + }; + Locale.resetCache = function resetCache() { + sysLocaleCache = null; + intlDTCache.clear(); + intlNumCache.clear(); + intlRelCache.clear(); + intlResolvedOptionsCache.clear(); + weekInfoCache.clear(); + }; + Locale.fromObject = function fromObject(_temp) { + var _ref2 = _temp === void 0 ? {} : _temp, + locale = _ref2.locale, + numberingSystem = _ref2.numberingSystem, + outputCalendar = _ref2.outputCalendar, + weekSettings = _ref2.weekSettings; + return Locale.create(locale, numberingSystem, outputCalendar, weekSettings); + }; + function Locale(locale, numbering, outputCalendar, weekSettings, specifiedLocale) { + var _parseLocaleString = parseLocaleString(locale), + parsedLocale = _parseLocaleString[0], + parsedNumberingSystem = _parseLocaleString[1], + parsedOutputCalendar = _parseLocaleString[2]; + this.locale = parsedLocale; + this.numberingSystem = numbering || parsedNumberingSystem || null; + this.outputCalendar = outputCalendar || parsedOutputCalendar || null; + this.weekSettings = weekSettings; + this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar); + this.weekdaysCache = { + format: {}, + standalone: {} + }; + this.monthsCache = { + format: {}, + standalone: {} + }; + this.meridiemCache = null; + this.eraCache = {}; + this.specifiedLocale = specifiedLocale; + this.fastNumbersCached = null; + } + var _proto4 = Locale.prototype; + _proto4.listingMode = function listingMode() { + var isActuallyEn = this.isEnglish(); + var hasNoWeirdness = (this.numberingSystem === null || this.numberingSystem === "latn") && (this.outputCalendar === null || this.outputCalendar === "gregory"); + return isActuallyEn && hasNoWeirdness ? "en" : "intl"; + }; + _proto4.clone = function clone(alts) { + if (!alts || Object.getOwnPropertyNames(alts).length === 0) { + return this; + } else { + return Locale.create(alts.locale || this.specifiedLocale, alts.numberingSystem || this.numberingSystem, alts.outputCalendar || this.outputCalendar, validateWeekSettings(alts.weekSettings) || this.weekSettings, alts.defaultToEN || false); + } + }; + _proto4.redefaultToEN = function redefaultToEN(alts) { + if (alts === void 0) { + alts = {}; + } + return this.clone(_extends({}, alts, { + defaultToEN: true + })); + }; + _proto4.redefaultToSystem = function redefaultToSystem(alts) { + if (alts === void 0) { + alts = {}; + } + return this.clone(_extends({}, alts, { + defaultToEN: false + })); + }; + _proto4.months = function months$1(length, format) { + var _this2 = this; + if (format === void 0) { + format = false; + } + return listStuff(this, length, months, function () { + // Workaround for "ja" locale: formatToParts does not label all parts of the month + // as "month" and for this locale there is no difference between "format" and "non-format". + // As such, just use format() instead of formatToParts() and take the whole string + var monthSpecialCase = _this2.intl === "ja" || _this2.intl.startsWith("ja-"); + format &= !monthSpecialCase; + var intl = format ? { + month: length, + day: "numeric" + } : { + month: length + }, + formatStr = format ? "format" : "standalone"; + if (!_this2.monthsCache[formatStr][length]) { + var mapper = !monthSpecialCase ? function (dt) { + return _this2.extract(dt, intl, "month"); + } : function (dt) { + return _this2.dtFormatter(dt, intl).format(); + }; + _this2.monthsCache[formatStr][length] = mapMonths(mapper); + } + return _this2.monthsCache[formatStr][length]; + }); + }; + _proto4.weekdays = function weekdays$1(length, format) { + var _this3 = this; + if (format === void 0) { + format = false; + } + return listStuff(this, length, weekdays, function () { + var intl = format ? { + weekday: length, + year: "numeric", + month: "long", + day: "numeric" + } : { + weekday: length + }, + formatStr = format ? "format" : "standalone"; + if (!_this3.weekdaysCache[formatStr][length]) { + _this3.weekdaysCache[formatStr][length] = mapWeekdays(function (dt) { + return _this3.extract(dt, intl, "weekday"); + }); + } + return _this3.weekdaysCache[formatStr][length]; + }); + }; + _proto4.meridiems = function meridiems$1() { + var _this4 = this; + return listStuff(this, undefined, function () { + return meridiems; + }, function () { + // In theory there could be aribitrary day periods. We're gonna assume there are exactly two + // for AM and PM. This is probably wrong, but it's makes parsing way easier. + if (!_this4.meridiemCache) { + var intl = { + hour: "numeric", + hourCycle: "h12" + }; + _this4.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map(function (dt) { + return _this4.extract(dt, intl, "dayperiod"); + }); + } + return _this4.meridiemCache; + }); + }; + _proto4.eras = function eras$1(length) { + var _this5 = this; + return listStuff(this, length, eras, function () { + var intl = { + era: length + }; + + // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates + // to definitely enumerate them. + if (!_this5.eraCache[length]) { + _this5.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map(function (dt) { + return _this5.extract(dt, intl, "era"); + }); + } + return _this5.eraCache[length]; + }); + }; + _proto4.extract = function extract(dt, intlOpts, field) { + var df = this.dtFormatter(dt, intlOpts), + results = df.formatToParts(), + matching = results.find(function (m) { + return m.type.toLowerCase() === field; + }); + return matching ? matching.value : null; + }; + _proto4.numberFormatter = function numberFormatter(opts) { + if (opts === void 0) { + opts = {}; + } + // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave) + // (in contrast, the rest of the condition is used heavily) + return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts); + }; + _proto4.dtFormatter = function dtFormatter(dt, intlOpts) { + if (intlOpts === void 0) { + intlOpts = {}; + } + return new PolyDateFormatter(dt, this.intl, intlOpts); + }; + _proto4.relFormatter = function relFormatter(opts) { + if (opts === void 0) { + opts = {}; + } + return new PolyRelFormatter(this.intl, this.isEnglish(), opts); + }; + _proto4.listFormatter = function listFormatter(opts) { + if (opts === void 0) { + opts = {}; + } + return getCachedLF(this.intl, opts); + }; + _proto4.isEnglish = function isEnglish() { + return this.locale === "en" || this.locale.toLowerCase() === "en-us" || getCachedIntResolvedOptions(this.intl).locale.startsWith("en-us"); + }; + _proto4.getWeekSettings = function getWeekSettings() { + if (this.weekSettings) { + return this.weekSettings; + } else if (!hasLocaleWeekInfo()) { + return fallbackWeekSettings; + } else { + return getCachedWeekInfo(this.locale); + } + }; + _proto4.getStartOfWeek = function getStartOfWeek() { + return this.getWeekSettings().firstDay; + }; + _proto4.getMinDaysInFirstWeek = function getMinDaysInFirstWeek() { + return this.getWeekSettings().minimalDays; + }; + _proto4.getWeekendDays = function getWeekendDays() { + return this.getWeekSettings().weekend; + }; + _proto4.equals = function equals(other) { + return this.locale === other.locale && this.numberingSystem === other.numberingSystem && this.outputCalendar === other.outputCalendar; + }; + _proto4.toString = function toString() { + return "Locale(" + this.locale + ", " + this.numberingSystem + ", " + this.outputCalendar + ")"; + }; + _createClass(Locale, [{ + key: "fastNumbers", + get: function get() { + if (this.fastNumbersCached == null) { + this.fastNumbersCached = supportsFastNumbers(this); + } + return this.fastNumbersCached; + } + }]); + return Locale; +}(); + +var singleton = null; + +/** + * A zone with a fixed offset (meaning no DST) + * @implements {Zone} + */ +var FixedOffsetZone = /*#__PURE__*/function (_Zone) { + _inheritsLoose(FixedOffsetZone, _Zone); + /** + * Get an instance with a specified offset + * @param {number} offset - The offset in minutes + * @return {FixedOffsetZone} + */ + FixedOffsetZone.instance = function instance(offset) { + return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset); + } + + /** + * Get an instance of FixedOffsetZone from a UTC offset string, like "UTC+6" + * @param {string} s - The offset string to parse + * @example FixedOffsetZone.parseSpecifier("UTC+6") + * @example FixedOffsetZone.parseSpecifier("UTC+06") + * @example FixedOffsetZone.parseSpecifier("UTC-6:00") + * @return {FixedOffsetZone} + */; + FixedOffsetZone.parseSpecifier = function parseSpecifier(s) { + if (s) { + var r = s.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i); + if (r) { + return new FixedOffsetZone(signedOffset(r[1], r[2])); + } + } + return null; + }; + function FixedOffsetZone(offset) { + var _this; + _this = _Zone.call(this) || this; + /** @private **/ + _this.fixed = offset; + return _this; + } + + /** + * The type of zone. `fixed` for all instances of `FixedOffsetZone`. + * @override + * @type {string} + */ + var _proto = FixedOffsetZone.prototype; + /** + * Returns the offset's common name at the specified timestamp. + * + * For fixed offset zones this equals to the zone name. + * @override + */ + _proto.offsetName = function offsetName() { + return this.name; + } + + /** + * Returns the offset's value as a string + * @override + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */; + _proto.formatOffset = function formatOffset$1(ts, format) { + return formatOffset(this.fixed, format); + } + + /** + * Returns whether the offset is known to be fixed for the whole year: + * Always returns true for all fixed offset zones. + * @override + * @type {boolean} + */; + /** + * Return the offset in minutes for this zone at the specified timestamp. + * + * For fixed offset zones, this is constant and does not depend on a timestamp. + * @override + * @return {number} + */ + _proto.offset = function offset() { + return this.fixed; + } + + /** + * Return whether this Zone is equal to another zone (i.e. also fixed and same offset) + * @override + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */; + _proto.equals = function equals(otherZone) { + return otherZone.type === "fixed" && otherZone.fixed === this.fixed; + } + + /** + * Return whether this Zone is valid: + * All fixed offset zones are valid. + * @override + * @type {boolean} + */; + _createClass(FixedOffsetZone, [{ + key: "type", + get: function get() { + return "fixed"; + } + + /** + * The name of this zone. + * All fixed zones' names always start with "UTC" (plus optional offset) + * @override + * @type {string} + */ + }, { + key: "name", + get: function get() { + return this.fixed === 0 ? "UTC" : "UTC" + formatOffset(this.fixed, "narrow"); + } + + /** + * The IANA name of this zone, i.e. `Etc/UTC` or `Etc/GMT+/-nn` + * + * @override + * @type {string} + */ + }, { + key: "ianaName", + get: function get() { + if (this.fixed === 0) { + return "Etc/UTC"; + } else { + return "Etc/GMT" + formatOffset(-this.fixed, "narrow"); + } + } + }, { + key: "isUniversal", + get: function get() { + return true; + } + }, { + key: "isValid", + get: function get() { + return true; + } + }], [{ + key: "utcInstance", + get: + /** + * Get a singleton instance of UTC + * @return {FixedOffsetZone} + */ + function get() { + if (singleton === null) { + singleton = new FixedOffsetZone(0); + } + return singleton; + } + }]); + return FixedOffsetZone; +}(Zone); + +/** + * A zone that failed to parse. You should never need to instantiate this. + * @implements {Zone} + */ +var InvalidZone = /*#__PURE__*/function (_Zone) { + _inheritsLoose(InvalidZone, _Zone); + function InvalidZone(zoneName) { + var _this; + _this = _Zone.call(this) || this; + /** @private */ + _this.zoneName = zoneName; + return _this; + } + + /** @override **/ + var _proto = InvalidZone.prototype; + /** @override **/ + _proto.offsetName = function offsetName() { + return null; + } + + /** @override **/; + _proto.formatOffset = function formatOffset() { + return ""; + } + + /** @override **/; + _proto.offset = function offset() { + return NaN; + } + + /** @override **/; + _proto.equals = function equals() { + return false; + } + + /** @override **/; + _createClass(InvalidZone, [{ + key: "type", + get: function get() { + return "invalid"; + } + + /** @override **/ + }, { + key: "name", + get: function get() { + return this.zoneName; + } + + /** @override **/ + }, { + key: "isUniversal", + get: function get() { + return false; + } + }, { + key: "isValid", + get: function get() { + return false; + } + }]); + return InvalidZone; +}(Zone); + +/** + * @private + */ +function normalizeZone(input, defaultZone) { + if (isUndefined(input) || input === null) { + return defaultZone; + } else if (input instanceof Zone) { + return input; + } else if (isString(input)) { + var lowered = input.toLowerCase(); + if (lowered === "default") return defaultZone;else if (lowered === "local" || lowered === "system") return SystemZone.instance;else if (lowered === "utc" || lowered === "gmt") return FixedOffsetZone.utcInstance;else return FixedOffsetZone.parseSpecifier(lowered) || IANAZone.create(input); + } else if (isNumber(input)) { + return FixedOffsetZone.instance(input); + } else if (typeof input === "object" && "offset" in input && typeof input.offset === "function") { + // This is dumb, but the instanceof check above doesn't seem to really work + // so we're duck checking it + return input; + } else { + return new InvalidZone(input); + } +} + +var numberingSystems = { + arab: "[\u0660-\u0669]", + arabext: "[\u06F0-\u06F9]", + bali: "[\u1B50-\u1B59]", + beng: "[\u09E6-\u09EF]", + deva: "[\u0966-\u096F]", + fullwide: "[\uFF10-\uFF19]", + gujr: "[\u0AE6-\u0AEF]", + hanidec: "[〇|一|二|三|四|五|六|七|八|九]", + khmr: "[\u17E0-\u17E9]", + knda: "[\u0CE6-\u0CEF]", + laoo: "[\u0ED0-\u0ED9]", + limb: "[\u1946-\u194F]", + mlym: "[\u0D66-\u0D6F]", + mong: "[\u1810-\u1819]", + mymr: "[\u1040-\u1049]", + orya: "[\u0B66-\u0B6F]", + tamldec: "[\u0BE6-\u0BEF]", + telu: "[\u0C66-\u0C6F]", + thai: "[\u0E50-\u0E59]", + tibt: "[\u0F20-\u0F29]", + latn: "\\d" +}; +var numberingSystemsUTF16 = { + arab: [1632, 1641], + arabext: [1776, 1785], + bali: [6992, 7001], + beng: [2534, 2543], + deva: [2406, 2415], + fullwide: [65296, 65303], + gujr: [2790, 2799], + khmr: [6112, 6121], + knda: [3302, 3311], + laoo: [3792, 3801], + limb: [6470, 6479], + mlym: [3430, 3439], + mong: [6160, 6169], + mymr: [4160, 4169], + orya: [2918, 2927], + tamldec: [3046, 3055], + telu: [3174, 3183], + thai: [3664, 3673], + tibt: [3872, 3881] +}; +var hanidecChars = numberingSystems.hanidec.replace(/[\[|\]]/g, "").split(""); +function parseDigits(str) { + var value = parseInt(str, 10); + if (isNaN(value)) { + value = ""; + for (var i = 0; i < str.length; i++) { + var code = str.charCodeAt(i); + if (str[i].search(numberingSystems.hanidec) !== -1) { + value += hanidecChars.indexOf(str[i]); + } else { + for (var key in numberingSystemsUTF16) { + var _numberingSystemsUTF = numberingSystemsUTF16[key], + min = _numberingSystemsUTF[0], + max = _numberingSystemsUTF[1]; + if (code >= min && code <= max) { + value += code - min; + } + } + } + } + return parseInt(value, 10); + } else { + return value; + } +} + +// cache of {numberingSystem: {append: regex}} +var digitRegexCache = new Map(); +function resetDigitRegexCache() { + digitRegexCache.clear(); +} +function digitRegex(_ref, append) { + var numberingSystem = _ref.numberingSystem; + if (append === void 0) { + append = ""; + } + var ns = numberingSystem || "latn"; + var appendCache = digitRegexCache.get(ns); + if (appendCache === undefined) { + appendCache = new Map(); + digitRegexCache.set(ns, appendCache); + } + var regex = appendCache.get(append); + if (regex === undefined) { + regex = new RegExp("" + numberingSystems[ns] + append); + appendCache.set(append, regex); + } + return regex; +} + +var now = function now() { + return Date.now(); + }, + defaultZone = "system", + defaultLocale = null, + defaultNumberingSystem = null, + defaultOutputCalendar = null, + twoDigitCutoffYear = 60, + throwOnInvalid, + defaultWeekSettings = null; + +/** + * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here. + */ +var Settings = /*#__PURE__*/function () { + function Settings() {} + /** + * Reset Luxon's global caches. Should only be necessary in testing scenarios. + * @return {void} + */ + Settings.resetCaches = function resetCaches() { + Locale.resetCache(); + IANAZone.resetCache(); + DateTime.resetCache(); + resetDigitRegexCache(); + }; + _createClass(Settings, null, [{ + key: "now", + get: + /** + * Get the callback for returning the current timestamp. + * @type {function} + */ + function get() { + return now; + } + + /** + * Set the callback for returning the current timestamp. + * The function should return a number, which will be interpreted as an Epoch millisecond count + * @type {function} + * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future + * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time + */, + set: function set(n) { + now = n; + } + + /** + * Set the default time zone to create DateTimes in. Does not affect existing instances. + * Use the value "system" to reset this value to the system's time zone. + * @type {string} + */ + }, { + key: "defaultZone", + get: + /** + * Get the default time zone object currently used to create DateTimes. Does not affect existing instances. + * The default value is the system's time zone (the one set on the machine that runs this code). + * @type {Zone} + */ + function get() { + return normalizeZone(defaultZone, SystemZone.instance); + } + + /** + * Get the default locale to create DateTimes with. Does not affect existing instances. + * @type {string} + */, + set: function set(zone) { + defaultZone = zone; + } + }, { + key: "defaultLocale", + get: function get() { + return defaultLocale; + } + + /** + * Set the default locale to create DateTimes with. Does not affect existing instances. + * @type {string} + */, + set: function set(locale) { + defaultLocale = locale; + } + + /** + * Get the default numbering system to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + }, { + key: "defaultNumberingSystem", + get: function get() { + return defaultNumberingSystem; + } + + /** + * Set the default numbering system to create DateTimes with. Does not affect existing instances. + * @type {string} + */, + set: function set(numberingSystem) { + defaultNumberingSystem = numberingSystem; + } + + /** + * Get the default output calendar to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + }, { + key: "defaultOutputCalendar", + get: function get() { + return defaultOutputCalendar; + } + + /** + * Set the default output calendar to create DateTimes with. Does not affect existing instances. + * @type {string} + */, + set: function set(outputCalendar) { + defaultOutputCalendar = outputCalendar; + } + + /** + * @typedef {Object} WeekSettings + * @property {number} firstDay + * @property {number} minimalDays + * @property {number[]} weekend + */ + + /** + * @return {WeekSettings|null} + */ + }, { + key: "defaultWeekSettings", + get: function get() { + return defaultWeekSettings; + } + + /** + * Allows overriding the default locale week settings, i.e. the start of the week, the weekend and + * how many days are required in the first week of a year. + * Does not affect existing instances. + * + * @param {WeekSettings|null} weekSettings + */, + set: function set(weekSettings) { + defaultWeekSettings = validateWeekSettings(weekSettings); + } + + /** + * Get the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx. + * @type {number} + */ + }, { + key: "twoDigitCutoffYear", + get: function get() { + return twoDigitCutoffYear; + } + + /** + * Set the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx. + * @type {number} + * @example Settings.twoDigitCutoffYear = 0 // all 'yy' are interpreted as 20th century + * @example Settings.twoDigitCutoffYear = 99 // all 'yy' are interpreted as 21st century + * @example Settings.twoDigitCutoffYear = 50 // '49' -> 2049; '50' -> 1950 + * @example Settings.twoDigitCutoffYear = 1950 // interpreted as 50 + * @example Settings.twoDigitCutoffYear = 2050 // ALSO interpreted as 50 + */, + set: function set(cutoffYear) { + twoDigitCutoffYear = cutoffYear % 100; + } + + /** + * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals + * @type {boolean} + */ + }, { + key: "throwOnInvalid", + get: function get() { + return throwOnInvalid; + } + + /** + * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals + * @type {boolean} + */, + set: function set(t) { + throwOnInvalid = t; + } + }]); + return Settings; +}(); + +var Invalid = /*#__PURE__*/function () { + function Invalid(reason, explanation) { + this.reason = reason; + this.explanation = explanation; + } + var _proto = Invalid.prototype; + _proto.toMessage = function toMessage() { + if (this.explanation) { + return this.reason + ": " + this.explanation; + } else { + return this.reason; + } + }; + return Invalid; +}(); + +var nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334], + leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335]; +function unitOutOfRange(unit, value) { + return new Invalid("unit out of range", "you specified " + value + " (of type " + typeof value + ") as a " + unit + ", which is invalid"); +} +function dayOfWeek(year, month, day) { + var d = new Date(Date.UTC(year, month - 1, day)); + if (year < 100 && year >= 0) { + d.setUTCFullYear(d.getUTCFullYear() - 1900); + } + var js = d.getUTCDay(); + return js === 0 ? 7 : js; +} +function computeOrdinal(year, month, day) { + return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1]; +} +function uncomputeOrdinal(year, ordinal) { + var table = isLeapYear(year) ? leapLadder : nonLeapLadder, + month0 = table.findIndex(function (i) { + return i < ordinal; + }), + day = ordinal - table[month0]; + return { + month: month0 + 1, + day: day + }; +} +function isoWeekdayToLocal(isoWeekday, startOfWeek) { + return (isoWeekday - startOfWeek + 7) % 7 + 1; +} + +/** + * @private + */ + +function gregorianToWeek(gregObj, minDaysInFirstWeek, startOfWeek) { + if (minDaysInFirstWeek === void 0) { + minDaysInFirstWeek = 4; + } + if (startOfWeek === void 0) { + startOfWeek = 1; + } + var year = gregObj.year, + month = gregObj.month, + day = gregObj.day, + ordinal = computeOrdinal(year, month, day), + weekday = isoWeekdayToLocal(dayOfWeek(year, month, day), startOfWeek); + var weekNumber = Math.floor((ordinal - weekday + 14 - minDaysInFirstWeek) / 7), + weekYear; + if (weekNumber < 1) { + weekYear = year - 1; + weekNumber = weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek); + } else if (weekNumber > weeksInWeekYear(year, minDaysInFirstWeek, startOfWeek)) { + weekYear = year + 1; + weekNumber = 1; + } else { + weekYear = year; + } + return _extends({ + weekYear: weekYear, + weekNumber: weekNumber, + weekday: weekday + }, timeObject(gregObj)); +} +function weekToGregorian(weekData, minDaysInFirstWeek, startOfWeek) { + if (minDaysInFirstWeek === void 0) { + minDaysInFirstWeek = 4; + } + if (startOfWeek === void 0) { + startOfWeek = 1; + } + var weekYear = weekData.weekYear, + weekNumber = weekData.weekNumber, + weekday = weekData.weekday, + weekdayOfJan4 = isoWeekdayToLocal(dayOfWeek(weekYear, 1, minDaysInFirstWeek), startOfWeek), + yearInDays = daysInYear(weekYear); + var ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 7 + minDaysInFirstWeek, + year; + if (ordinal < 1) { + year = weekYear - 1; + ordinal += daysInYear(year); + } else if (ordinal > yearInDays) { + year = weekYear + 1; + ordinal -= daysInYear(weekYear); + } else { + year = weekYear; + } + var _uncomputeOrdinal = uncomputeOrdinal(year, ordinal), + month = _uncomputeOrdinal.month, + day = _uncomputeOrdinal.day; + return _extends({ + year: year, + month: month, + day: day + }, timeObject(weekData)); +} +function gregorianToOrdinal(gregData) { + var year = gregData.year, + month = gregData.month, + day = gregData.day; + var ordinal = computeOrdinal(year, month, day); + return _extends({ + year: year, + ordinal: ordinal + }, timeObject(gregData)); +} +function ordinalToGregorian(ordinalData) { + var year = ordinalData.year, + ordinal = ordinalData.ordinal; + var _uncomputeOrdinal2 = uncomputeOrdinal(year, ordinal), + month = _uncomputeOrdinal2.month, + day = _uncomputeOrdinal2.day; + return _extends({ + year: year, + month: month, + day: day + }, timeObject(ordinalData)); +} + +/** + * Check if local week units like localWeekday are used in obj. + * If so, validates that they are not mixed with ISO week units and then copies them to the normal week unit properties. + * Modifies obj in-place! + * @param obj the object values + */ +function usesLocalWeekValues(obj, loc) { + var hasLocaleWeekData = !isUndefined(obj.localWeekday) || !isUndefined(obj.localWeekNumber) || !isUndefined(obj.localWeekYear); + if (hasLocaleWeekData) { + var hasIsoWeekData = !isUndefined(obj.weekday) || !isUndefined(obj.weekNumber) || !isUndefined(obj.weekYear); + if (hasIsoWeekData) { + throw new ConflictingSpecificationError("Cannot mix locale-based week fields with ISO-based week fields"); + } + if (!isUndefined(obj.localWeekday)) obj.weekday = obj.localWeekday; + if (!isUndefined(obj.localWeekNumber)) obj.weekNumber = obj.localWeekNumber; + if (!isUndefined(obj.localWeekYear)) obj.weekYear = obj.localWeekYear; + delete obj.localWeekday; + delete obj.localWeekNumber; + delete obj.localWeekYear; + return { + minDaysInFirstWeek: loc.getMinDaysInFirstWeek(), + startOfWeek: loc.getStartOfWeek() + }; + } else { + return { + minDaysInFirstWeek: 4, + startOfWeek: 1 + }; + } +} +function hasInvalidWeekData(obj, minDaysInFirstWeek, startOfWeek) { + if (minDaysInFirstWeek === void 0) { + minDaysInFirstWeek = 4; + } + if (startOfWeek === void 0) { + startOfWeek = 1; + } + var validYear = isInteger(obj.weekYear), + validWeek = integerBetween(obj.weekNumber, 1, weeksInWeekYear(obj.weekYear, minDaysInFirstWeek, startOfWeek)), + validWeekday = integerBetween(obj.weekday, 1, 7); + if (!validYear) { + return unitOutOfRange("weekYear", obj.weekYear); + } else if (!validWeek) { + return unitOutOfRange("week", obj.weekNumber); + } else if (!validWeekday) { + return unitOutOfRange("weekday", obj.weekday); + } else return false; +} +function hasInvalidOrdinalData(obj) { + var validYear = isInteger(obj.year), + validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year)); + if (!validYear) { + return unitOutOfRange("year", obj.year); + } else if (!validOrdinal) { + return unitOutOfRange("ordinal", obj.ordinal); + } else return false; +} +function hasInvalidGregorianData(obj) { + var validYear = isInteger(obj.year), + validMonth = integerBetween(obj.month, 1, 12), + validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month)); + if (!validYear) { + return unitOutOfRange("year", obj.year); + } else if (!validMonth) { + return unitOutOfRange("month", obj.month); + } else if (!validDay) { + return unitOutOfRange("day", obj.day); + } else return false; +} +function hasInvalidTimeData(obj) { + var hour = obj.hour, + minute = obj.minute, + second = obj.second, + millisecond = obj.millisecond; + var validHour = integerBetween(hour, 0, 23) || hour === 24 && minute === 0 && second === 0 && millisecond === 0, + validMinute = integerBetween(minute, 0, 59), + validSecond = integerBetween(second, 0, 59), + validMillisecond = integerBetween(millisecond, 0, 999); + if (!validHour) { + return unitOutOfRange("hour", hour); + } else if (!validMinute) { + return unitOutOfRange("minute", minute); + } else if (!validSecond) { + return unitOutOfRange("second", second); + } else if (!validMillisecond) { + return unitOutOfRange("millisecond", millisecond); + } else return false; +} + +/** + * @private + */ + +// TYPES + +function isUndefined(o) { + return typeof o === "undefined"; +} +function isNumber(o) { + return typeof o === "number"; +} +function isInteger(o) { + return typeof o === "number" && o % 1 === 0; +} +function isString(o) { + return typeof o === "string"; +} +function isDate(o) { + return Object.prototype.toString.call(o) === "[object Date]"; +} + +// CAPABILITIES + +function hasRelative() { + try { + return typeof Intl !== "undefined" && !!Intl.RelativeTimeFormat; + } catch (e) { + return false; + } +} +function hasLocaleWeekInfo() { + try { + return typeof Intl !== "undefined" && !!Intl.Locale && ("weekInfo" in Intl.Locale.prototype || "getWeekInfo" in Intl.Locale.prototype); + } catch (e) { + return false; + } +} + +// OBJECTS AND ARRAYS + +function maybeArray(thing) { + return Array.isArray(thing) ? thing : [thing]; +} +function bestBy(arr, by, compare) { + if (arr.length === 0) { + return undefined; + } + return arr.reduce(function (best, next) { + var pair = [by(next), next]; + if (!best) { + return pair; + } else if (compare(best[0], pair[0]) === best[0]) { + return best; + } else { + return pair; + } + }, null)[1]; +} +function pick(obj, keys) { + return keys.reduce(function (a, k) { + a[k] = obj[k]; + return a; + }, {}); +} +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} +function validateWeekSettings(settings) { + if (settings == null) { + return null; + } else if (typeof settings !== "object") { + throw new InvalidArgumentError("Week settings must be an object"); + } else { + if (!integerBetween(settings.firstDay, 1, 7) || !integerBetween(settings.minimalDays, 1, 7) || !Array.isArray(settings.weekend) || settings.weekend.some(function (v) { + return !integerBetween(v, 1, 7); + })) { + throw new InvalidArgumentError("Invalid week settings"); + } + return { + firstDay: settings.firstDay, + minimalDays: settings.minimalDays, + weekend: Array.from(settings.weekend) + }; + } +} + +// NUMBERS AND STRINGS + +function integerBetween(thing, bottom, top) { + return isInteger(thing) && thing >= bottom && thing <= top; +} + +// x % n but takes the sign of n instead of x +function floorMod(x, n) { + return x - n * Math.floor(x / n); +} +function padStart(input, n) { + if (n === void 0) { + n = 2; + } + var isNeg = input < 0; + var padded; + if (isNeg) { + padded = "-" + ("" + -input).padStart(n, "0"); + } else { + padded = ("" + input).padStart(n, "0"); + } + return padded; +} +function parseInteger(string) { + if (isUndefined(string) || string === null || string === "") { + return undefined; + } else { + return parseInt(string, 10); + } +} +function parseFloating(string) { + if (isUndefined(string) || string === null || string === "") { + return undefined; + } else { + return parseFloat(string); + } +} +function parseMillis(fraction) { + // Return undefined (instead of 0) in these cases, where fraction is not set + if (isUndefined(fraction) || fraction === null || fraction === "") { + return undefined; + } else { + var f = parseFloat("0." + fraction) * 1000; + return Math.floor(f); + } +} +function roundTo(number, digits, rounding) { + if (rounding === void 0) { + rounding = "round"; + } + var factor = Math.pow(10, digits); + switch (rounding) { + case "expand": + return number > 0 ? Math.ceil(number * factor) / factor : Math.floor(number * factor) / factor; + case "trunc": + return Math.trunc(number * factor) / factor; + case "round": + return Math.round(number * factor) / factor; + case "floor": + return Math.floor(number * factor) / factor; + case "ceil": + return Math.ceil(number * factor) / factor; + default: + throw new RangeError("Value rounding " + rounding + " is out of range"); + } +} + +// DATE BASICS + +function isLeapYear(year) { + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); +} +function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; +} +function daysInMonth(year, month) { + var modMonth = floorMod(month - 1, 12) + 1, + modYear = year + (month - modMonth) / 12; + if (modMonth === 2) { + return isLeapYear(modYear) ? 29 : 28; + } else { + return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1]; + } +} + +// convert a calendar object to a local timestamp (epoch, but with the offset baked in) +function objToLocalTS(obj) { + var d = Date.UTC(obj.year, obj.month - 1, obj.day, obj.hour, obj.minute, obj.second, obj.millisecond); + + // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that + if (obj.year < 100 && obj.year >= 0) { + d = new Date(d); + // set the month and day again, this is necessary because year 2000 is a leap year, but year 100 is not + // so if obj.year is in 99, but obj.day makes it roll over into year 100, + // the calculations done by Date.UTC are using year 2000 - which is incorrect + d.setUTCFullYear(obj.year, obj.month - 1, obj.day); + } + return +d; +} + +// adapted from moment.js: https://github.com/moment/moment/blob/000ac1800e620f770f4eb31b5ae908f6167b0ab2/src/lib/units/week-calendar-utils.js +function firstWeekOffset(year, minDaysInFirstWeek, startOfWeek) { + var fwdlw = isoWeekdayToLocal(dayOfWeek(year, 1, minDaysInFirstWeek), startOfWeek); + return -fwdlw + minDaysInFirstWeek - 1; +} +function weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek) { + if (minDaysInFirstWeek === void 0) { + minDaysInFirstWeek = 4; + } + if (startOfWeek === void 0) { + startOfWeek = 1; + } + var weekOffset = firstWeekOffset(weekYear, minDaysInFirstWeek, startOfWeek); + var weekOffsetNext = firstWeekOffset(weekYear + 1, minDaysInFirstWeek, startOfWeek); + return (daysInYear(weekYear) - weekOffset + weekOffsetNext) / 7; +} +function untruncateYear(year) { + if (year > 99) { + return year; + } else return year > Settings.twoDigitCutoffYear ? 1900 + year : 2000 + year; +} + +// PARSING + +function parseZoneInfo(ts, offsetFormat, locale, timeZone) { + if (timeZone === void 0) { + timeZone = null; + } + var date = new Date(ts), + intlOpts = { + hourCycle: "h23", + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit" + }; + if (timeZone) { + intlOpts.timeZone = timeZone; + } + var modified = _extends({ + timeZoneName: offsetFormat + }, intlOpts); + var parsed = new Intl.DateTimeFormat(locale, modified).formatToParts(date).find(function (m) { + return m.type.toLowerCase() === "timezonename"; + }); + return parsed ? parsed.value : null; +} + +// signedOffset('-5', '30') -> -330 +function signedOffset(offHourStr, offMinuteStr) { + var offHour = parseInt(offHourStr, 10); + + // don't || this because we want to preserve -0 + if (Number.isNaN(offHour)) { + offHour = 0; + } + var offMin = parseInt(offMinuteStr, 10) || 0, + offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin; + return offHour * 60 + offMinSigned; +} + +// COERCION + +function asNumber(value) { + var numericValue = Number(value); + if (typeof value === "boolean" || value === "" || !Number.isFinite(numericValue)) throw new InvalidArgumentError("Invalid unit value " + value); + return numericValue; +} +function normalizeObject(obj, normalizer) { + var normalized = {}; + for (var u in obj) { + if (hasOwnProperty(obj, u)) { + var v = obj[u]; + if (v === undefined || v === null) continue; + normalized[normalizer(u)] = asNumber(v); + } + } + return normalized; +} + +/** + * Returns the offset's value as a string + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */ +function formatOffset(offset, format) { + var hours = Math.trunc(Math.abs(offset / 60)), + minutes = Math.trunc(Math.abs(offset % 60)), + sign = offset >= 0 ? "+" : "-"; + switch (format) { + case "short": + return "" + sign + padStart(hours, 2) + ":" + padStart(minutes, 2); + case "narrow": + return "" + sign + hours + (minutes > 0 ? ":" + minutes : ""); + case "techie": + return "" + sign + padStart(hours, 2) + padStart(minutes, 2); + default: + throw new RangeError("Value format " + format + " is out of range for property format"); + } +} +function timeObject(obj) { + return pick(obj, ["hour", "minute", "second", "millisecond"]); +} + +/** + * @private + */ + +var monthsLong = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; +var monthsShort = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; +var monthsNarrow = ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"]; +function months(length) { + switch (length) { + case "narrow": + return [].concat(monthsNarrow); + case "short": + return [].concat(monthsShort); + case "long": + return [].concat(monthsLong); + case "numeric": + return ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"]; + case "2-digit": + return ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]; + default: + return null; + } +} +var weekdaysLong = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]; +var weekdaysShort = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; +var weekdaysNarrow = ["M", "T", "W", "T", "F", "S", "S"]; +function weekdays(length) { + switch (length) { + case "narrow": + return [].concat(weekdaysNarrow); + case "short": + return [].concat(weekdaysShort); + case "long": + return [].concat(weekdaysLong); + case "numeric": + return ["1", "2", "3", "4", "5", "6", "7"]; + default: + return null; + } +} +var meridiems = ["AM", "PM"]; +var erasLong = ["Before Christ", "Anno Domini"]; +var erasShort = ["BC", "AD"]; +var erasNarrow = ["B", "A"]; +function eras(length) { + switch (length) { + case "narrow": + return [].concat(erasNarrow); + case "short": + return [].concat(erasShort); + case "long": + return [].concat(erasLong); + default: + return null; + } +} +function meridiemForDateTime(dt) { + return meridiems[dt.hour < 12 ? 0 : 1]; +} +function weekdayForDateTime(dt, length) { + return weekdays(length)[dt.weekday - 1]; +} +function monthForDateTime(dt, length) { + return months(length)[dt.month - 1]; +} +function eraForDateTime(dt, length) { + return eras(length)[dt.year < 0 ? 0 : 1]; +} +function formatRelativeTime(unit, count, numeric, narrow) { + if (numeric === void 0) { + numeric = "always"; + } + if (narrow === void 0) { + narrow = false; + } + var units = { + years: ["year", "yr."], + quarters: ["quarter", "qtr."], + months: ["month", "mo."], + weeks: ["week", "wk."], + days: ["day", "day", "days"], + hours: ["hour", "hr."], + minutes: ["minute", "min."], + seconds: ["second", "sec."] + }; + var lastable = ["hours", "minutes", "seconds"].indexOf(unit) === -1; + if (numeric === "auto" && lastable) { + var isDay = unit === "days"; + switch (count) { + case 1: + return isDay ? "tomorrow" : "next " + units[unit][0]; + case -1: + return isDay ? "yesterday" : "last " + units[unit][0]; + case 0: + return isDay ? "today" : "this " + units[unit][0]; + } + } + + var isInPast = Object.is(count, -0) || count < 0, + fmtValue = Math.abs(count), + singular = fmtValue === 1, + lilUnits = units[unit], + fmtUnit = narrow ? singular ? lilUnits[1] : lilUnits[2] || lilUnits[1] : singular ? units[unit][0] : unit; + return isInPast ? fmtValue + " " + fmtUnit + " ago" : "in " + fmtValue + " " + fmtUnit; +} + +function stringifyTokens(splits, tokenToString) { + var s = ""; + for (var _iterator = _createForOfIteratorHelperLoose(splits), _step; !(_step = _iterator()).done;) { + var token = _step.value; + if (token.literal) { + s += token.val; + } else { + s += tokenToString(token.val); + } + } + return s; +} +var _macroTokenToFormatOpts = { + D: DATE_SHORT, + DD: DATE_MED, + DDD: DATE_FULL, + DDDD: DATE_HUGE, + t: TIME_SIMPLE, + tt: TIME_WITH_SECONDS, + ttt: TIME_WITH_SHORT_OFFSET, + tttt: TIME_WITH_LONG_OFFSET, + T: TIME_24_SIMPLE, + TT: TIME_24_WITH_SECONDS, + TTT: TIME_24_WITH_SHORT_OFFSET, + TTTT: TIME_24_WITH_LONG_OFFSET, + f: DATETIME_SHORT, + ff: DATETIME_MED, + fff: DATETIME_FULL, + ffff: DATETIME_HUGE, + F: DATETIME_SHORT_WITH_SECONDS, + FF: DATETIME_MED_WITH_SECONDS, + FFF: DATETIME_FULL_WITH_SECONDS, + FFFF: DATETIME_HUGE_WITH_SECONDS +}; + +/** + * @private + */ +var Formatter = /*#__PURE__*/function () { + Formatter.create = function create(locale, opts) { + if (opts === void 0) { + opts = {}; + } + return new Formatter(locale, opts); + }; + Formatter.parseFormat = function parseFormat(fmt) { + // white-space is always considered a literal in user-provided formats + // the " " token has a special meaning (see unitForToken) + + var current = null, + currentFull = "", + bracketed = false; + var splits = []; + for (var i = 0; i < fmt.length; i++) { + var c = fmt.charAt(i); + if (c === "'") { + // turn '' into a literal signal quote instead of just skipping the empty literal + if (currentFull.length > 0 || bracketed) { + splits.push({ + literal: bracketed || /^\s+$/.test(currentFull), + val: currentFull === "" ? "'" : currentFull + }); + } + current = null; + currentFull = ""; + bracketed = !bracketed; + } else if (bracketed) { + currentFull += c; + } else if (c === current) { + currentFull += c; + } else { + if (currentFull.length > 0) { + splits.push({ + literal: /^\s+$/.test(currentFull), + val: currentFull + }); + } + currentFull = c; + current = c; + } + } + if (currentFull.length > 0) { + splits.push({ + literal: bracketed || /^\s+$/.test(currentFull), + val: currentFull + }); + } + return splits; + }; + Formatter.macroTokenToFormatOpts = function macroTokenToFormatOpts(token) { + return _macroTokenToFormatOpts[token]; + }; + function Formatter(locale, formatOpts) { + this.opts = formatOpts; + this.loc = locale; + this.systemLoc = null; + } + var _proto = Formatter.prototype; + _proto.formatWithSystemDefault = function formatWithSystemDefault(dt, opts) { + if (this.systemLoc === null) { + this.systemLoc = this.loc.redefaultToSystem(); + } + var df = this.systemLoc.dtFormatter(dt, _extends({}, this.opts, opts)); + return df.format(); + }; + _proto.dtFormatter = function dtFormatter(dt, opts) { + if (opts === void 0) { + opts = {}; + } + return this.loc.dtFormatter(dt, _extends({}, this.opts, opts)); + }; + _proto.formatDateTime = function formatDateTime(dt, opts) { + return this.dtFormatter(dt, opts).format(); + }; + _proto.formatDateTimeParts = function formatDateTimeParts(dt, opts) { + return this.dtFormatter(dt, opts).formatToParts(); + }; + _proto.formatInterval = function formatInterval(interval, opts) { + var df = this.dtFormatter(interval.start, opts); + return df.dtf.formatRange(interval.start.toJSDate(), interval.end.toJSDate()); + }; + _proto.resolvedOptions = function resolvedOptions(dt, opts) { + return this.dtFormatter(dt, opts).resolvedOptions(); + }; + _proto.num = function num(n, p, signDisplay) { + if (p === void 0) { + p = 0; + } + if (signDisplay === void 0) { + signDisplay = undefined; + } + // we get some perf out of doing this here, annoyingly + if (this.opts.forceSimple) { + return padStart(n, p); + } + var opts = _extends({}, this.opts); + if (p > 0) { + opts.padTo = p; + } + if (signDisplay) { + opts.signDisplay = signDisplay; + } + return this.loc.numberFormatter(opts).format(n); + }; + _proto.formatDateTimeFromString = function formatDateTimeFromString(dt, fmt) { + var _this = this; + var knownEnglish = this.loc.listingMode() === "en", + useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== "gregory", + string = function string(opts, extract) { + return _this.loc.extract(dt, opts, extract); + }, + formatOffset = function formatOffset(opts) { + if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) { + return "Z"; + } + return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : ""; + }, + meridiem = function meridiem() { + return knownEnglish ? meridiemForDateTime(dt) : string({ + hour: "numeric", + hourCycle: "h12" + }, "dayperiod"); + }, + month = function month(length, standalone) { + return knownEnglish ? monthForDateTime(dt, length) : string(standalone ? { + month: length + } : { + month: length, + day: "numeric" + }, "month"); + }, + weekday = function weekday(length, standalone) { + return knownEnglish ? weekdayForDateTime(dt, length) : string(standalone ? { + weekday: length + } : { + weekday: length, + month: "long", + day: "numeric" + }, "weekday"); + }, + maybeMacro = function maybeMacro(token) { + var formatOpts = Formatter.macroTokenToFormatOpts(token); + if (formatOpts) { + return _this.formatWithSystemDefault(dt, formatOpts); + } else { + return token; + } + }, + era = function era(length) { + return knownEnglish ? eraForDateTime(dt, length) : string({ + era: length + }, "era"); + }, + tokenToString = function tokenToString(token) { + // Where possible: https://cldr.unicode.org/translation/date-time/date-time-symbols + switch (token) { + // ms + case "S": + return _this.num(dt.millisecond); + case "u": + // falls through + case "SSS": + return _this.num(dt.millisecond, 3); + // seconds + case "s": + return _this.num(dt.second); + case "ss": + return _this.num(dt.second, 2); + // fractional seconds + case "uu": + return _this.num(Math.floor(dt.millisecond / 10), 2); + case "uuu": + return _this.num(Math.floor(dt.millisecond / 100)); + // minutes + case "m": + return _this.num(dt.minute); + case "mm": + return _this.num(dt.minute, 2); + // hours + case "h": + return _this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12); + case "hh": + return _this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2); + case "H": + return _this.num(dt.hour); + case "HH": + return _this.num(dt.hour, 2); + // offset + case "Z": + // like +6 + return formatOffset({ + format: "narrow", + allowZ: _this.opts.allowZ + }); + case "ZZ": + // like +06:00 + return formatOffset({ + format: "short", + allowZ: _this.opts.allowZ + }); + case "ZZZ": + // like +0600 + return formatOffset({ + format: "techie", + allowZ: _this.opts.allowZ + }); + case "ZZZZ": + // like EST + return dt.zone.offsetName(dt.ts, { + format: "short", + locale: _this.loc.locale + }); + case "ZZZZZ": + // like Eastern Standard Time + return dt.zone.offsetName(dt.ts, { + format: "long", + locale: _this.loc.locale + }); + // zone + case "z": + // like America/New_York + return dt.zoneName; + // meridiems + case "a": + return meridiem(); + // dates + case "d": + return useDateTimeFormatter ? string({ + day: "numeric" + }, "day") : _this.num(dt.day); + case "dd": + return useDateTimeFormatter ? string({ + day: "2-digit" + }, "day") : _this.num(dt.day, 2); + // weekdays - standalone + case "c": + // like 1 + return _this.num(dt.weekday); + case "ccc": + // like 'Tues' + return weekday("short", true); + case "cccc": + // like 'Tuesday' + return weekday("long", true); + case "ccccc": + // like 'T' + return weekday("narrow", true); + // weekdays - format + case "E": + // like 1 + return _this.num(dt.weekday); + case "EEE": + // like 'Tues' + return weekday("short", false); + case "EEEE": + // like 'Tuesday' + return weekday("long", false); + case "EEEEE": + // like 'T' + return weekday("narrow", false); + // months - standalone + case "L": + // like 1 + return useDateTimeFormatter ? string({ + month: "numeric", + day: "numeric" + }, "month") : _this.num(dt.month); + case "LL": + // like 01, doesn't seem to work + return useDateTimeFormatter ? string({ + month: "2-digit", + day: "numeric" + }, "month") : _this.num(dt.month, 2); + case "LLL": + // like Jan + return month("short", true); + case "LLLL": + // like January + return month("long", true); + case "LLLLL": + // like J + return month("narrow", true); + // months - format + case "M": + // like 1 + return useDateTimeFormatter ? string({ + month: "numeric" + }, "month") : _this.num(dt.month); + case "MM": + // like 01 + return useDateTimeFormatter ? string({ + month: "2-digit" + }, "month") : _this.num(dt.month, 2); + case "MMM": + // like Jan + return month("short", false); + case "MMMM": + // like January + return month("long", false); + case "MMMMM": + // like J + return month("narrow", false); + // years + case "y": + // like 2014 + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : _this.num(dt.year); + case "yy": + // like 14 + return useDateTimeFormatter ? string({ + year: "2-digit" + }, "year") : _this.num(dt.year.toString().slice(-2), 2); + case "yyyy": + // like 0012 + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : _this.num(dt.year, 4); + case "yyyyyy": + // like 000012 + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : _this.num(dt.year, 6); + // eras + case "G": + // like AD + return era("short"); + case "GG": + // like Anno Domini + return era("long"); + case "GGGGG": + return era("narrow"); + case "kk": + return _this.num(dt.weekYear.toString().slice(-2), 2); + case "kkkk": + return _this.num(dt.weekYear, 4); + case "W": + return _this.num(dt.weekNumber); + case "WW": + return _this.num(dt.weekNumber, 2); + case "n": + return _this.num(dt.localWeekNumber); + case "nn": + return _this.num(dt.localWeekNumber, 2); + case "ii": + return _this.num(dt.localWeekYear.toString().slice(-2), 2); + case "iiii": + return _this.num(dt.localWeekYear, 4); + case "o": + return _this.num(dt.ordinal); + case "ooo": + return _this.num(dt.ordinal, 3); + case "q": + // like 1 + return _this.num(dt.quarter); + case "qq": + // like 01 + return _this.num(dt.quarter, 2); + case "X": + return _this.num(Math.floor(dt.ts / 1000)); + case "x": + return _this.num(dt.ts); + default: + return maybeMacro(token); + } + }; + return stringifyTokens(Formatter.parseFormat(fmt), tokenToString); + }; + _proto.formatDurationFromString = function formatDurationFromString(dur, fmt) { + var _this2 = this; + var invertLargest = this.opts.signMode === "negativeLargestOnly" ? -1 : 1; + var tokenToField = function tokenToField(token) { + switch (token[0]) { + case "S": + return "milliseconds"; + case "s": + return "seconds"; + case "m": + return "minutes"; + case "h": + return "hours"; + case "d": + return "days"; + case "w": + return "weeks"; + case "M": + return "months"; + case "y": + return "years"; + default: + return null; + } + }, + tokenToString = function tokenToString(lildur, info) { + return function (token) { + var mapped = tokenToField(token); + if (mapped) { + var inversionFactor = info.isNegativeDuration && mapped !== info.largestUnit ? invertLargest : 1; + var signDisplay; + if (_this2.opts.signMode === "negativeLargestOnly" && mapped !== info.largestUnit) { + signDisplay = "never"; + } else if (_this2.opts.signMode === "all") { + signDisplay = "always"; + } else { + // "auto" and "negative" are the same, but "auto" has better support + signDisplay = "auto"; + } + return _this2.num(lildur.get(mapped) * inversionFactor, token.length, signDisplay); + } else { + return token; + } + }; + }, + tokens = Formatter.parseFormat(fmt), + realTokens = tokens.reduce(function (found, _ref) { + var literal = _ref.literal, + val = _ref.val; + return literal ? found : found.concat(val); + }, []), + collapsed = dur.shiftTo.apply(dur, realTokens.map(tokenToField).filter(function (t) { + return t; + })), + durationInfo = { + isNegativeDuration: collapsed < 0, + // this relies on "collapsed" being based on "shiftTo", which builds up the object + // in order + largestUnit: Object.keys(collapsed.values)[0] + }; + return stringifyTokens(tokens, tokenToString(collapsed, durationInfo)); + }; + return Formatter; +}(); + +/* + * This file handles parsing for well-specified formats. Here's how it works: + * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match. + * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object + * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence. + * Extractors can take a "cursor" representing the offset in the match to look at. This makes it easy to combine extractors. + * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions. + * Some extractions are super dumb and simpleParse and fromStrings help DRY them. + */ + +var ianaRegex = /[A-Za-z_+-]{1,256}(?::?\/[A-Za-z0-9_+-]{1,256}(?:\/[A-Za-z0-9_+-]{1,256})?)?/; +function combineRegexes() { + for (var _len = arguments.length, regexes = new Array(_len), _key = 0; _key < _len; _key++) { + regexes[_key] = arguments[_key]; + } + var full = regexes.reduce(function (f, r) { + return f + r.source; + }, ""); + return RegExp("^" + full + "$"); +} +function combineExtractors() { + for (var _len2 = arguments.length, extractors = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + extractors[_key2] = arguments[_key2]; + } + return function (m) { + return extractors.reduce(function (_ref, ex) { + var mergedVals = _ref[0], + mergedZone = _ref[1], + cursor = _ref[2]; + var _ex = ex(m, cursor), + val = _ex[0], + zone = _ex[1], + next = _ex[2]; + return [_extends({}, mergedVals, val), zone || mergedZone, next]; + }, [{}, null, 1]).slice(0, 2); + }; +} +function parse(s) { + if (s == null) { + return [null, null]; + } + for (var _len3 = arguments.length, patterns = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { + patterns[_key3 - 1] = arguments[_key3]; + } + for (var _i = 0, _patterns = patterns; _i < _patterns.length; _i++) { + var _patterns$_i = _patterns[_i], + regex = _patterns$_i[0], + extractor = _patterns$_i[1]; + var m = regex.exec(s); + if (m) { + return extractor(m); + } + } + return [null, null]; +} +function simpleParse() { + for (var _len4 = arguments.length, keys = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + keys[_key4] = arguments[_key4]; + } + return function (match, cursor) { + var ret = {}; + var i; + for (i = 0; i < keys.length; i++) { + ret[keys[i]] = parseInteger(match[cursor + i]); + } + return [ret, null, cursor + i]; + }; +} + +// ISO and SQL parsing +var offsetRegex = /(?:([Zz])|([+-]\d\d)(?::?(\d\d))?)/; +var isoExtendedZone = "(?:" + offsetRegex.source + "?(?:\\[(" + ianaRegex.source + ")\\])?)?"; +var isoTimeBaseRegex = /(\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,30}))?)?)?/; +var isoTimeRegex = RegExp("" + isoTimeBaseRegex.source + isoExtendedZone); +var isoTimeExtensionRegex = RegExp("(?:[Tt]" + isoTimeRegex.source + ")?"); +var isoYmdRegex = /([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/; +var isoWeekRegex = /(\d{4})-?W(\d\d)(?:-?(\d))?/; +var isoOrdinalRegex = /(\d{4})-?(\d{3})/; +var extractISOWeekData = simpleParse("weekYear", "weekNumber", "weekDay"); +var extractISOOrdinalData = simpleParse("year", "ordinal"); +var sqlYmdRegex = /(\d{4})-(\d\d)-(\d\d)/; // dumbed-down version of the ISO one +var sqlTimeRegex = RegExp(isoTimeBaseRegex.source + " ?(?:" + offsetRegex.source + "|(" + ianaRegex.source + "))?"); +var sqlTimeExtensionRegex = RegExp("(?: " + sqlTimeRegex.source + ")?"); +function int(match, pos, fallback) { + var m = match[pos]; + return isUndefined(m) ? fallback : parseInteger(m); +} +function extractISOYmd(match, cursor) { + var item = { + year: int(match, cursor), + month: int(match, cursor + 1, 1), + day: int(match, cursor + 2, 1) + }; + return [item, null, cursor + 3]; +} +function extractISOTime(match, cursor) { + var item = { + hours: int(match, cursor, 0), + minutes: int(match, cursor + 1, 0), + seconds: int(match, cursor + 2, 0), + milliseconds: parseMillis(match[cursor + 3]) + }; + return [item, null, cursor + 4]; +} +function extractISOOffset(match, cursor) { + var local = !match[cursor] && !match[cursor + 1], + fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]), + zone = local ? null : FixedOffsetZone.instance(fullOffset); + return [{}, zone, cursor + 3]; +} +function extractIANAZone(match, cursor) { + var zone = match[cursor] ? IANAZone.create(match[cursor]) : null; + return [{}, zone, cursor + 1]; +} + +// ISO time parsing + +var isoTimeOnly = RegExp("^T?" + isoTimeBaseRegex.source + "$"); + +// ISO duration parsing + +var isoDuration = /^-?P(?:(?:(-?\d{1,20}(?:\.\d{1,20})?)Y)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20}(?:\.\d{1,20})?)W)?(?:(-?\d{1,20}(?:\.\d{1,20})?)D)?(?:T(?:(-?\d{1,20}(?:\.\d{1,20})?)H)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20})(?:[.,](-?\d{1,20}))?S)?)?)$/; +function extractISODuration(match) { + var s = match[0], + yearStr = match[1], + monthStr = match[2], + weekStr = match[3], + dayStr = match[4], + hourStr = match[5], + minuteStr = match[6], + secondStr = match[7], + millisecondsStr = match[8]; + var hasNegativePrefix = s[0] === "-"; + var negativeSeconds = secondStr && secondStr[0] === "-"; + var maybeNegate = function maybeNegate(num, force) { + if (force === void 0) { + force = false; + } + return num !== undefined && (force || num && hasNegativePrefix) ? -num : num; + }; + return [{ + years: maybeNegate(parseFloating(yearStr)), + months: maybeNegate(parseFloating(monthStr)), + weeks: maybeNegate(parseFloating(weekStr)), + days: maybeNegate(parseFloating(dayStr)), + hours: maybeNegate(parseFloating(hourStr)), + minutes: maybeNegate(parseFloating(minuteStr)), + seconds: maybeNegate(parseFloating(secondStr), secondStr === "-0"), + milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds) + }]; +} + +// These are a little braindead. EDT *should* tell us that we're in, say, America/New_York +// and not just that we're in -240 *right now*. But since I don't think these are used that often +// I'm just going to ignore that +var obsOffsets = { + GMT: 0, + EDT: -4 * 60, + EST: -5 * 60, + CDT: -5 * 60, + CST: -6 * 60, + MDT: -6 * 60, + MST: -7 * 60, + PDT: -7 * 60, + PST: -8 * 60 +}; +function fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { + var result = { + year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr), + month: monthsShort.indexOf(monthStr) + 1, + day: parseInteger(dayStr), + hour: parseInteger(hourStr), + minute: parseInteger(minuteStr) + }; + if (secondStr) result.second = parseInteger(secondStr); + if (weekdayStr) { + result.weekday = weekdayStr.length > 3 ? weekdaysLong.indexOf(weekdayStr) + 1 : weekdaysShort.indexOf(weekdayStr) + 1; + } + return result; +} + +// RFC 2822/5322 +var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/; +function extractRFC2822(match) { + var weekdayStr = match[1], + dayStr = match[2], + monthStr = match[3], + yearStr = match[4], + hourStr = match[5], + minuteStr = match[6], + secondStr = match[7], + obsOffset = match[8], + milOffset = match[9], + offHourStr = match[10], + offMinuteStr = match[11], + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + var offset; + if (obsOffset) { + offset = obsOffsets[obsOffset]; + } else if (milOffset) { + offset = 0; + } else { + offset = signedOffset(offHourStr, offMinuteStr); + } + return [result, new FixedOffsetZone(offset)]; +} +function preprocessRFC2822(s) { + // Remove comments and folding whitespace and replace multiple-spaces with a single space + return s.replace(/\([^()]*\)|[\n\t]/g, " ").replace(/(\s\s+)/g, " ").trim(); +} + +// http date + +var rfc1123 = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/, + rfc850 = /^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/, + ascii = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/; +function extractRFC1123Or850(match) { + var weekdayStr = match[1], + dayStr = match[2], + monthStr = match[3], + yearStr = match[4], + hourStr = match[5], + minuteStr = match[6], + secondStr = match[7], + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + return [result, FixedOffsetZone.utcInstance]; +} +function extractASCII(match) { + var weekdayStr = match[1], + monthStr = match[2], + dayStr = match[3], + hourStr = match[4], + minuteStr = match[5], + secondStr = match[6], + yearStr = match[7], + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + return [result, FixedOffsetZone.utcInstance]; +} +var isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex); +var isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex); +var isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex); +var isoTimeCombinedRegex = combineRegexes(isoTimeRegex); +var extractISOYmdTimeAndOffset = combineExtractors(extractISOYmd, extractISOTime, extractISOOffset, extractIANAZone); +var extractISOWeekTimeAndOffset = combineExtractors(extractISOWeekData, extractISOTime, extractISOOffset, extractIANAZone); +var extractISOOrdinalDateAndTime = combineExtractors(extractISOOrdinalData, extractISOTime, extractISOOffset, extractIANAZone); +var extractISOTimeAndOffset = combineExtractors(extractISOTime, extractISOOffset, extractIANAZone); + +/* + * @private + */ + +function parseISODate(s) { + return parse(s, [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset], [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime], [isoTimeCombinedRegex, extractISOTimeAndOffset]); +} +function parseRFC2822Date(s) { + return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]); +} +function parseHTTPDate(s) { + return parse(s, [rfc1123, extractRFC1123Or850], [rfc850, extractRFC1123Or850], [ascii, extractASCII]); +} +function parseISODuration(s) { + return parse(s, [isoDuration, extractISODuration]); +} +var extractISOTimeOnly = combineExtractors(extractISOTime); +function parseISOTimeOnly(s) { + return parse(s, [isoTimeOnly, extractISOTimeOnly]); +} +var sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex); +var sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex); +var extractISOTimeOffsetAndIANAZone = combineExtractors(extractISOTime, extractISOOffset, extractIANAZone); +function parseSQL(s) { + return parse(s, [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]); +} + +var INVALID$2 = "Invalid Duration"; + +// unit conversion constants +var lowOrderMatrix = { + weeks: { + days: 7, + hours: 7 * 24, + minutes: 7 * 24 * 60, + seconds: 7 * 24 * 60 * 60, + milliseconds: 7 * 24 * 60 * 60 * 1000 + }, + days: { + hours: 24, + minutes: 24 * 60, + seconds: 24 * 60 * 60, + milliseconds: 24 * 60 * 60 * 1000 + }, + hours: { + minutes: 60, + seconds: 60 * 60, + milliseconds: 60 * 60 * 1000 + }, + minutes: { + seconds: 60, + milliseconds: 60 * 1000 + }, + seconds: { + milliseconds: 1000 + } + }, + casualMatrix = _extends({ + years: { + quarters: 4, + months: 12, + weeks: 52, + days: 365, + hours: 365 * 24, + minutes: 365 * 24 * 60, + seconds: 365 * 24 * 60 * 60, + milliseconds: 365 * 24 * 60 * 60 * 1000 + }, + quarters: { + months: 3, + weeks: 13, + days: 91, + hours: 91 * 24, + minutes: 91 * 24 * 60, + seconds: 91 * 24 * 60 * 60, + milliseconds: 91 * 24 * 60 * 60 * 1000 + }, + months: { + weeks: 4, + days: 30, + hours: 30 * 24, + minutes: 30 * 24 * 60, + seconds: 30 * 24 * 60 * 60, + milliseconds: 30 * 24 * 60 * 60 * 1000 + } + }, lowOrderMatrix), + daysInYearAccurate = 146097.0 / 400, + daysInMonthAccurate = 146097.0 / 4800, + accurateMatrix = _extends({ + years: { + quarters: 4, + months: 12, + weeks: daysInYearAccurate / 7, + days: daysInYearAccurate, + hours: daysInYearAccurate * 24, + minutes: daysInYearAccurate * 24 * 60, + seconds: daysInYearAccurate * 24 * 60 * 60, + milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000 + }, + quarters: { + months: 3, + weeks: daysInYearAccurate / 28, + days: daysInYearAccurate / 4, + hours: daysInYearAccurate * 24 / 4, + minutes: daysInYearAccurate * 24 * 60 / 4, + seconds: daysInYearAccurate * 24 * 60 * 60 / 4, + milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000 / 4 + }, + months: { + weeks: daysInMonthAccurate / 7, + days: daysInMonthAccurate, + hours: daysInMonthAccurate * 24, + minutes: daysInMonthAccurate * 24 * 60, + seconds: daysInMonthAccurate * 24 * 60 * 60, + milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000 + } + }, lowOrderMatrix); + +// units ordered by size +var orderedUnits$1 = ["years", "quarters", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds"]; +var reverseUnits = orderedUnits$1.slice(0).reverse(); + +// clone really means "create another instance just like this one, but with these changes" +function clone$1(dur, alts, clear) { + if (clear === void 0) { + clear = false; + } + // deep merge for vals + var conf = { + values: clear ? alts.values : _extends({}, dur.values, alts.values || {}), + loc: dur.loc.clone(alts.loc), + conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy, + matrix: alts.matrix || dur.matrix + }; + return new Duration(conf); +} +function durationToMillis(matrix, vals) { + var _vals$milliseconds; + var sum = (_vals$milliseconds = vals.milliseconds) != null ? _vals$milliseconds : 0; + for (var _iterator = _createForOfIteratorHelperLoose(reverseUnits.slice(1)), _step; !(_step = _iterator()).done;) { + var unit = _step.value; + if (vals[unit]) { + sum += vals[unit] * matrix[unit]["milliseconds"]; + } + } + return sum; +} + +// NB: mutates parameters +function normalizeValues(matrix, vals) { + // the logic below assumes the overall value of the duration is positive + // if this is not the case, factor is used to make it so + var factor = durationToMillis(matrix, vals) < 0 ? -1 : 1; + orderedUnits$1.reduceRight(function (previous, current) { + if (!isUndefined(vals[current])) { + if (previous) { + var previousVal = vals[previous] * factor; + var conv = matrix[current][previous]; + + // if (previousVal < 0): + // lower order unit is negative (e.g. { years: 2, days: -2 }) + // normalize this by reducing the higher order unit by the appropriate amount + // and increasing the lower order unit + // this can never make the higher order unit negative, because this function only operates + // on positive durations, so the amount of time represented by the lower order unit cannot + // be larger than the higher order unit + // else: + // lower order unit is positive (e.g. { years: 2, days: 450 } or { years: -2, days: 450 }) + // in this case we attempt to convert as much as possible from the lower order unit into + // the higher order one + // + // Math.floor takes care of both of these cases, rounding away from 0 + // if previousVal < 0 it makes the absolute value larger + // if previousVal >= it makes the absolute value smaller + var rollUp = Math.floor(previousVal / conv); + vals[current] += rollUp * factor; + vals[previous] -= rollUp * conv * factor; + } + return current; + } else { + return previous; + } + }, null); + + // try to convert any decimals into smaller units if possible + // for example for { years: 2.5, days: 0, seconds: 0 } we want to get { years: 2, days: 182, hours: 12 } + orderedUnits$1.reduce(function (previous, current) { + if (!isUndefined(vals[current])) { + if (previous) { + var fraction = vals[previous] % 1; + vals[previous] -= fraction; + vals[current] += fraction * matrix[previous][current]; + } + return current; + } else { + return previous; + } + }, null); +} + +// Remove all properties with a value of 0 from an object +function removeZeroes(vals) { + var newVals = {}; + for (var _i = 0, _Object$entries = Object.entries(vals); _i < _Object$entries.length; _i++) { + var _Object$entries$_i = _Object$entries[_i], + key = _Object$entries$_i[0], + value = _Object$entries$_i[1]; + if (value !== 0) { + newVals[key] = value; + } + } + return newVals; +} + +/** + * A Duration object represents a period of time, like "2 months" or "1 day, 1 hour". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime#plus} to add a Duration object to a DateTime, producing another DateTime. + * + * Here is a brief overview of commonly used methods and getters in Duration: + * + * * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}. + * * **Unit values** See the {@link Duration#years}, {@link Duration#months}, {@link Duration#weeks}, {@link Duration#days}, {@link Duration#hours}, {@link Duration#minutes}, {@link Duration#seconds}, {@link Duration#milliseconds} accessors. + * * **Configuration** See {@link Duration#locale} and {@link Duration#numberingSystem} accessors. + * * **Transformation** To create new Durations out of old ones use {@link Duration#plus}, {@link Duration#minus}, {@link Duration#normalize}, {@link Duration#set}, {@link Duration#reconfigure}, {@link Duration#shiftTo}, and {@link Duration#negate}. + * * **Output** To convert the Duration into other representations, see {@link Duration#as}, {@link Duration#toISO}, {@link Duration#toFormat}, and {@link Duration#toJSON} + * + * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation. + */ +var Duration = /*#__PURE__*/function (_Symbol$for) { + /** + * @private + */ + function Duration(config) { + var accurate = config.conversionAccuracy === "longterm" || false; + var matrix = accurate ? accurateMatrix : casualMatrix; + if (config.matrix) { + matrix = config.matrix; + } + + /** + * @access private + */ + this.values = config.values; + /** + * @access private + */ + this.loc = config.loc || Locale.create(); + /** + * @access private + */ + this.conversionAccuracy = accurate ? "longterm" : "casual"; + /** + * @access private + */ + this.invalid = config.invalid || null; + /** + * @access private + */ + this.matrix = matrix; + /** + * @access private + */ + this.isLuxonDuration = true; + } + + /** + * Create Duration from a number of milliseconds. + * @param {number} count of milliseconds + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @return {Duration} + */ + Duration.fromMillis = function fromMillis(count, opts) { + return Duration.fromObject({ + milliseconds: count + }, opts); + } + + /** + * Create a Duration from a JavaScript object with keys like 'years' and 'hours'. + * If this object is empty then a zero milliseconds duration is returned. + * @param {Object} obj - the object to create the DateTime from + * @param {number} obj.years + * @param {number} obj.quarters + * @param {number} obj.months + * @param {number} obj.weeks + * @param {number} obj.days + * @param {number} obj.hours + * @param {number} obj.minutes + * @param {number} obj.seconds + * @param {number} obj.milliseconds + * @param {Object} [opts=[]] - options for creating this Duration + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the custom conversion system to use + * @return {Duration} + */; + Duration.fromObject = function fromObject(obj, opts) { + if (opts === void 0) { + opts = {}; + } + if (obj == null || typeof obj !== "object") { + throw new InvalidArgumentError("Duration.fromObject: argument expected to be an object, got " + (obj === null ? "null" : typeof obj)); + } + return new Duration({ + values: normalizeObject(obj, Duration.normalizeUnit), + loc: Locale.fromObject(opts), + conversionAccuracy: opts.conversionAccuracy, + matrix: opts.matrix + }); + } + + /** + * Create a Duration from DurationLike. + * + * @param {Object | number | Duration} durationLike + * One of: + * - object with keys like 'years' and 'hours'. + * - number representing milliseconds + * - Duration instance + * @return {Duration} + */; + Duration.fromDurationLike = function fromDurationLike(durationLike) { + if (isNumber(durationLike)) { + return Duration.fromMillis(durationLike); + } else if (Duration.isDuration(durationLike)) { + return durationLike; + } else if (typeof durationLike === "object") { + return Duration.fromObject(durationLike); + } else { + throw new InvalidArgumentError("Unknown duration argument " + durationLike + " of type " + typeof durationLike); + } + } + + /** + * Create a Duration from an ISO 8601 duration string. + * @param {string} text - text to parse + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the preset conversion system to use + * @see https://en.wikipedia.org/wiki/ISO_8601#Durations + * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 } + * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 } + * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 } + * @return {Duration} + */; + Duration.fromISO = function fromISO(text, opts) { + var _parseISODuration = parseISODuration(text), + parsed = _parseISODuration[0]; + if (parsed) { + return Duration.fromObject(parsed, opts); + } else { + return Duration.invalid("unparsable", "the input \"" + text + "\" can't be parsed as ISO 8601"); + } + } + + /** + * Create a Duration from an ISO 8601 time string. + * @param {string} text - text to parse + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the conversion system to use + * @see https://en.wikipedia.org/wiki/ISO_8601#Times + * @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 } + * @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @return {Duration} + */; + Duration.fromISOTime = function fromISOTime(text, opts) { + var _parseISOTimeOnly = parseISOTimeOnly(text), + parsed = _parseISOTimeOnly[0]; + if (parsed) { + return Duration.fromObject(parsed, opts); + } else { + return Duration.invalid("unparsable", "the input \"" + text + "\" can't be parsed as ISO 8601"); + } + } + + /** + * Create an invalid Duration. + * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {Duration} + */; + Duration.invalid = function invalid(reason, explanation) { + if (explanation === void 0) { + explanation = null; + } + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the Duration is invalid"); + } + var invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidDurationError(invalid); + } else { + return new Duration({ + invalid: invalid + }); + } + } + + /** + * @private + */; + Duration.normalizeUnit = function normalizeUnit(unit) { + var normalized = { + year: "years", + years: "years", + quarter: "quarters", + quarters: "quarters", + month: "months", + months: "months", + week: "weeks", + weeks: "weeks", + day: "days", + days: "days", + hour: "hours", + hours: "hours", + minute: "minutes", + minutes: "minutes", + second: "seconds", + seconds: "seconds", + millisecond: "milliseconds", + milliseconds: "milliseconds" + }[unit ? unit.toLowerCase() : unit]; + if (!normalized) throw new InvalidUnitError(unit); + return normalized; + } + + /** + * Check if an object is a Duration. Works across context boundaries + * @param {object} o + * @return {boolean} + */; + Duration.isDuration = function isDuration(o) { + return o && o.isLuxonDuration || false; + } + + /** + * Get the locale of a Duration, such 'en-GB' + * @type {string} + */; + var _proto = Duration.prototype; + /** + * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens: + * * `S` for milliseconds + * * `s` for seconds + * * `m` for minutes + * * `h` for hours + * * `d` for days + * * `w` for weeks + * * `M` for months + * * `y` for years + * Notes: + * * Add padding by repeating the token, e.g. "yy" pads the years to two digits, "hhhh" pads the hours out to four digits + * * Tokens can be escaped by wrapping with single quotes. + * * The duration will be converted to the set of units in the format string using {@link Duration#shiftTo} and the Durations's conversion accuracy setting. + * @param {string} fmt - the format string + * @param {Object} opts - options + * @param {boolean} [opts.floor=true] - floor numerical values + * @param {'negative'|'all'|'negativeLargestOnly'} [opts.signMode=negative] - How to handle signs + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("y d s") //=> "1 6 2" + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("yy dd sss") //=> "01 06 002" + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("M S") //=> "12 518402000" + * @example Duration.fromObject({ days: 6, seconds: 2 }).toFormat("d s", { signMode: "all" }) //=> "+6 +2" + * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat("d s", { signMode: "all" }) //=> "-6 -2" + * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat("d s", { signMode: "negativeLargestOnly" }) //=> "-6 2" + * @return {string} + */ + _proto.toFormat = function toFormat(fmt, opts) { + if (opts === void 0) { + opts = {}; + } + // reverse-compat since 1.2; we always round down now, never up, and we do it by default + var fmtOpts = _extends({}, opts, { + floor: opts.round !== false && opts.floor !== false + }); + return this.isValid ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt) : INVALID$2; + } + + /** + * Returns a string representation of a Duration with all units included. + * To modify its behavior, use `listStyle` and any Intl.NumberFormat option, though `unitDisplay` is especially relevant. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options + * @param {Object} opts - Formatting options. Accepts the same keys as the options parameter of the native `Intl.NumberFormat` constructor, as well as `listStyle`. + * @param {string} [opts.listStyle='narrow'] - How to format the merged list. Corresponds to the `style` property of the options parameter of the native `Intl.ListFormat` constructor. + * @param {boolean} [opts.showZeros=true] - Show all units previously used by the duration even if they are zero + * @example + * ```js + * var dur = Duration.fromObject({ months: 1, weeks: 0, hours: 5, minutes: 6 }) + * dur.toHuman() //=> '1 month, 0 weeks, 5 hours, 6 minutes' + * dur.toHuman({ listStyle: "long" }) //=> '1 month, 0 weeks, 5 hours, and 6 minutes' + * dur.toHuman({ unitDisplay: "short" }) //=> '1 mth, 0 wks, 5 hr, 6 min' + * dur.toHuman({ showZeros: false }) //=> '1 month, 5 hours, 6 minutes' + * ``` + */; + _proto.toHuman = function toHuman(opts) { + var _this = this; + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) return INVALID$2; + var showZeros = opts.showZeros !== false; + var l = orderedUnits$1.map(function (unit) { + var val = _this.values[unit]; + if (isUndefined(val) || val === 0 && !showZeros) { + return null; + } + return _this.loc.numberFormatter(_extends({ + style: "unit", + unitDisplay: "long" + }, opts, { + unit: unit.slice(0, -1) + })).format(val); + }).filter(function (n) { + return n; + }); + return this.loc.listFormatter(_extends({ + type: "conjunction", + style: opts.listStyle || "narrow" + }, opts)).format(l); + } + + /** + * Returns a JavaScript object with this Duration's values. + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 } + * @return {Object} + */; + _proto.toObject = function toObject() { + if (!this.isValid) return {}; + return _extends({}, this.values); + } + + /** + * Returns an ISO 8601-compliant string representation of this Duration. + * @see https://en.wikipedia.org/wiki/ISO_8601#Durations + * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S' + * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S' + * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M' + * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M' + * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S' + * @return {string} + */; + _proto.toISO = function toISO() { + // we could use the formatter, but this is an easier way to get the minimum string + if (!this.isValid) return null; + var s = "P"; + if (this.years !== 0) s += this.years + "Y"; + if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + "M"; + if (this.weeks !== 0) s += this.weeks + "W"; + if (this.days !== 0) s += this.days + "D"; + if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0) s += "T"; + if (this.hours !== 0) s += this.hours + "H"; + if (this.minutes !== 0) s += this.minutes + "M"; + if (this.seconds !== 0 || this.milliseconds !== 0) + // this will handle "floating point madness" by removing extra decimal places + // https://stackoverflow.com/questions/588004/is-floating-point-math-broken + s += roundTo(this.seconds + this.milliseconds / 1000, 3) + "S"; + if (s === "P") s += "T0S"; + return s; + } + + /** + * Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day. + * Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours. + * @see https://en.wikipedia.org/wiki/ISO_8601#Times + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includePrefix=false] - include the `T` prefix + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000' + * @return {string} + */; + _proto.toISOTime = function toISOTime(opts) { + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) return null; + var millis = this.toMillis(); + if (millis < 0 || millis >= 86400000) return null; + opts = _extends({ + suppressMilliseconds: false, + suppressSeconds: false, + includePrefix: false, + format: "extended" + }, opts, { + includeOffset: false + }); + var dateTime = DateTime.fromMillis(millis, { + zone: "UTC" + }); + return dateTime.toISOTime(opts); + } + + /** + * Returns an ISO 8601 representation of this Duration appropriate for use in JSON. + * @return {string} + */; + _proto.toJSON = function toJSON() { + return this.toISO(); + } + + /** + * Returns an ISO 8601 representation of this Duration appropriate for use in debugging. + * @return {string} + */; + _proto.toString = function toString() { + return this.toISO(); + } + + /** + * Returns a string representation of this Duration appropriate for the REPL. + * @return {string} + */; + _proto[_Symbol$for] = function () { + if (this.isValid) { + return "Duration { values: " + JSON.stringify(this.values) + " }"; + } else { + return "Duration { Invalid, reason: " + this.invalidReason + " }"; + } + } + + /** + * Returns an milliseconds value of this Duration. + * @return {number} + */; + _proto.toMillis = function toMillis() { + if (!this.isValid) return NaN; + return durationToMillis(this.matrix, this.values); + } + + /** + * Returns an milliseconds value of this Duration. Alias of {@link toMillis} + * @return {number} + */; + _proto.valueOf = function valueOf() { + return this.toMillis(); + } + + /** + * Make this Duration longer by the specified amount. Return a newly-constructed Duration. + * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @return {Duration} + */; + _proto.plus = function plus(duration) { + if (!this.isValid) return this; + var dur = Duration.fromDurationLike(duration), + result = {}; + for (var _i2 = 0, _orderedUnits = orderedUnits$1; _i2 < _orderedUnits.length; _i2++) { + var k = _orderedUnits[_i2]; + if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) { + result[k] = dur.get(k) + this.get(k); + } + } + return clone$1(this, { + values: result + }, true); + } + + /** + * Make this Duration shorter by the specified amount. Return a newly-constructed Duration. + * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @return {Duration} + */; + _proto.minus = function minus(duration) { + if (!this.isValid) return this; + var dur = Duration.fromDurationLike(duration); + return this.plus(dur.negate()); + } + + /** + * Scale this Duration by the specified amount. Return a newly-constructed Duration. + * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number. + * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits(x => x * 2) //=> { hours: 2, minutes: 60 } + * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits((x, u) => u === "hours" ? x * 2 : x) //=> { hours: 2, minutes: 30 } + * @return {Duration} + */; + _proto.mapUnits = function mapUnits(fn) { + if (!this.isValid) return this; + var result = {}; + for (var _i3 = 0, _Object$keys = Object.keys(this.values); _i3 < _Object$keys.length; _i3++) { + var k = _Object$keys[_i3]; + result[k] = asNumber(fn(this.values[k], k)); + } + return clone$1(this, { + values: result + }, true); + } + + /** + * Get the value of unit. + * @param {string} unit - a unit such as 'minute' or 'day' + * @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2 + * @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0 + * @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3 + * @return {number} + */; + _proto.get = function get(unit) { + return this[Duration.normalizeUnit(unit)]; + } + + /** + * "Set" the values of specified units. Return a newly-constructed Duration. + * @param {Object} values - a mapping of units to numbers + * @example dur.set({ years: 2017 }) + * @example dur.set({ hours: 8, minutes: 30 }) + * @return {Duration} + */; + _proto.set = function set(values) { + if (!this.isValid) return this; + var mixed = _extends({}, this.values, normalizeObject(values, Duration.normalizeUnit)); + return clone$1(this, { + values: mixed + }); + } + + /** + * "Set" the locale and/or numberingSystem. Returns a newly-constructed Duration. + * @example dur.reconfigure({ locale: 'en-GB' }) + * @return {Duration} + */; + _proto.reconfigure = function reconfigure(_temp) { + var _ref = _temp === void 0 ? {} : _temp, + locale = _ref.locale, + numberingSystem = _ref.numberingSystem, + conversionAccuracy = _ref.conversionAccuracy, + matrix = _ref.matrix; + var loc = this.loc.clone({ + locale: locale, + numberingSystem: numberingSystem + }); + var opts = { + loc: loc, + matrix: matrix, + conversionAccuracy: conversionAccuracy + }; + return clone$1(this, opts); + } + + /** + * Return the length of the duration in the specified unit. + * @param {string} unit - a unit such as 'minutes' or 'days' + * @example Duration.fromObject({years: 1}).as('days') //=> 365 + * @example Duration.fromObject({years: 1}).as('months') //=> 12 + * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5 + * @return {number} + */; + _proto.as = function as(unit) { + return this.isValid ? this.shiftTo(unit).get(unit) : NaN; + } + + /** + * Reduce this Duration to its canonical representation in its current units. + * Assuming the overall value of the Duration is positive, this means: + * - excessive values for lower-order units are converted to higher-order units (if possible, see first and second example) + * - negative lower-order units are converted to higher order units (there must be such a higher order unit, otherwise + * the overall value would be negative, see third example) + * - fractional values for higher-order units are converted to lower-order units (if possible, see fourth example) + * + * If the overall value is negative, the result of this method is equivalent to `this.negate().normalize().negate()`. + * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 } + * @example Duration.fromObject({ days: 5000 }).normalize().toObject() //=> { days: 5000 } + * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 } + * @example Duration.fromObject({ years: 2.5, days: 0, hours: 0 }).normalize().toObject() //=> { years: 2, days: 182, hours: 12 } + * @return {Duration} + */; + _proto.normalize = function normalize() { + if (!this.isValid) return this; + var vals = this.toObject(); + normalizeValues(this.matrix, vals); + return clone$1(this, { + values: vals + }, true); + } + + /** + * Rescale units to its largest representation + * @example Duration.fromObject({ milliseconds: 90000 }).rescale().toObject() //=> { minutes: 1, seconds: 30 } + * @return {Duration} + */; + _proto.rescale = function rescale() { + if (!this.isValid) return this; + var vals = removeZeroes(this.normalize().shiftToAll().toObject()); + return clone$1(this, { + values: vals + }, true); + } + + /** + * Convert this Duration into its representation in a different set of units. + * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 } + * @return {Duration} + */; + _proto.shiftTo = function shiftTo() { + for (var _len = arguments.length, units = new Array(_len), _key = 0; _key < _len; _key++) { + units[_key] = arguments[_key]; + } + if (!this.isValid) return this; + if (units.length === 0) { + return this; + } + units = units.map(function (u) { + return Duration.normalizeUnit(u); + }); + var built = {}, + accumulated = {}, + vals = this.toObject(); + var lastUnit; + for (var _i4 = 0, _orderedUnits2 = orderedUnits$1; _i4 < _orderedUnits2.length; _i4++) { + var k = _orderedUnits2[_i4]; + if (units.indexOf(k) >= 0) { + lastUnit = k; + var own = 0; + + // anything we haven't boiled down yet should get boiled to this unit + for (var ak in accumulated) { + own += this.matrix[ak][k] * accumulated[ak]; + accumulated[ak] = 0; + } + + // plus anything that's already in this unit + if (isNumber(vals[k])) { + own += vals[k]; + } + + // only keep the integer part for now in the hopes of putting any decimal part + // into a smaller unit later + var i = Math.trunc(own); + built[k] = i; + accumulated[k] = (own * 1000 - i * 1000) / 1000; + + // otherwise, keep it in the wings to boil it later + } else if (isNumber(vals[k])) { + accumulated[k] = vals[k]; + } + } + + // anything leftover becomes the decimal for the last unit + // lastUnit must be defined since units is not empty + for (var key in accumulated) { + if (accumulated[key] !== 0) { + built[lastUnit] += key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key]; + } + } + normalizeValues(this.matrix, built); + return clone$1(this, { + values: built + }, true); + } + + /** + * Shift this Duration to all available units. + * Same as shiftTo("years", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds") + * @return {Duration} + */; + _proto.shiftToAll = function shiftToAll() { + if (!this.isValid) return this; + return this.shiftTo("years", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds"); + } + + /** + * Return the negative of this Duration. + * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 } + * @return {Duration} + */; + _proto.negate = function negate() { + if (!this.isValid) return this; + var negated = {}; + for (var _i5 = 0, _Object$keys2 = Object.keys(this.values); _i5 < _Object$keys2.length; _i5++) { + var k = _Object$keys2[_i5]; + negated[k] = this.values[k] === 0 ? 0 : -this.values[k]; + } + return clone$1(this, { + values: negated + }, true); + } + + /** + * Removes all units with values equal to 0 from this Duration. + * @example Duration.fromObject({ years: 2, days: 0, hours: 0, minutes: 0 }).removeZeros().toObject() //=> { years: 2 } + * @return {Duration} + */; + _proto.removeZeros = function removeZeros() { + if (!this.isValid) return this; + var vals = removeZeroes(this.values); + return clone$1(this, { + values: vals + }, true); + } + + /** + * Get the years. + * @type {number} + */; + /** + * Equality check + * Two Durations are equal iff they have the same units and the same values for each unit. + * @param {Duration} other + * @return {boolean} + */ + _proto.equals = function equals(other) { + if (!this.isValid || !other.isValid) { + return false; + } + if (!this.loc.equals(other.loc)) { + return false; + } + function eq(v1, v2) { + // Consider 0 and undefined as equal + if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0; + return v1 === v2; + } + for (var _i6 = 0, _orderedUnits3 = orderedUnits$1; _i6 < _orderedUnits3.length; _i6++) { + var u = _orderedUnits3[_i6]; + if (!eq(this.values[u], other.values[u])) { + return false; + } + } + return true; + }; + _createClass(Duration, [{ + key: "locale", + get: function get() { + return this.isValid ? this.loc.locale : null; + } + + /** + * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration + * + * @type {string} + */ + }, { + key: "numberingSystem", + get: function get() { + return this.isValid ? this.loc.numberingSystem : null; + } + }, { + key: "years", + get: function get() { + return this.isValid ? this.values.years || 0 : NaN; + } + + /** + * Get the quarters. + * @type {number} + */ + }, { + key: "quarters", + get: function get() { + return this.isValid ? this.values.quarters || 0 : NaN; + } + + /** + * Get the months. + * @type {number} + */ + }, { + key: "months", + get: function get() { + return this.isValid ? this.values.months || 0 : NaN; + } + + /** + * Get the weeks + * @type {number} + */ + }, { + key: "weeks", + get: function get() { + return this.isValid ? this.values.weeks || 0 : NaN; + } + + /** + * Get the days. + * @type {number} + */ + }, { + key: "days", + get: function get() { + return this.isValid ? this.values.days || 0 : NaN; + } + + /** + * Get the hours. + * @type {number} + */ + }, { + key: "hours", + get: function get() { + return this.isValid ? this.values.hours || 0 : NaN; + } + + /** + * Get the minutes. + * @type {number} + */ + }, { + key: "minutes", + get: function get() { + return this.isValid ? this.values.minutes || 0 : NaN; + } + + /** + * Get the seconds. + * @return {number} + */ + }, { + key: "seconds", + get: function get() { + return this.isValid ? this.values.seconds || 0 : NaN; + } + + /** + * Get the milliseconds. + * @return {number} + */ + }, { + key: "milliseconds", + get: function get() { + return this.isValid ? this.values.milliseconds || 0 : NaN; + } + + /** + * Returns whether the Duration is invalid. Invalid durations are returned by diff operations + * on invalid DateTimes or Intervals. + * @return {boolean} + */ + }, { + key: "isValid", + get: function get() { + return this.invalid === null; + } + + /** + * Returns an error code if this Duration became invalid, or null if the Duration is valid + * @return {string} + */ + }, { + key: "invalidReason", + get: function get() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this Duration became invalid, or null if the Duration is valid + * @type {string} + */ + }, { + key: "invalidExplanation", + get: function get() { + return this.invalid ? this.invalid.explanation : null; + } + }]); + return Duration; +}(Symbol.for("nodejs.util.inspect.custom")); + +var INVALID$1 = "Invalid Interval"; + +// checks if the start is equal to or before the end +function validateStartEnd(start, end) { + if (!start || !start.isValid) { + return Interval.invalid("missing or invalid start"); + } else if (!end || !end.isValid) { + return Interval.invalid("missing or invalid end"); + } else if (end < start) { + return Interval.invalid("end before start", "The end of an interval must be after its start, but you had start=" + start.toISO() + " and end=" + end.toISO()); + } else { + return null; + } +} + +/** + * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them. + * + * Here is a brief overview of the most commonly used methods and getters in Interval: + * + * * **Creation** To create an Interval, use {@link Interval.fromDateTimes}, {@link Interval.after}, {@link Interval.before}, or {@link Interval.fromISO}. + * * **Accessors** Use {@link Interval#start} and {@link Interval#end} to get the start and end. + * * **Interrogation** To analyze the Interval, use {@link Interval#count}, {@link Interval#length}, {@link Interval#hasSame}, {@link Interval#contains}, {@link Interval#isAfter}, or {@link Interval#isBefore}. + * * **Transformation** To create other Intervals out of this one, use {@link Interval#set}, {@link Interval#splitAt}, {@link Interval#splitBy}, {@link Interval#divideEqually}, {@link Interval.merge}, {@link Interval.xor}, {@link Interval#union}, {@link Interval#intersection}, or {@link Interval#difference}. + * * **Comparison** To compare this Interval to another one, use {@link Interval#equals}, {@link Interval#overlaps}, {@link Interval#abutsStart}, {@link Interval#abutsEnd}, {@link Interval#engulfs} + * * **Output** To convert the Interval into other representations, see {@link Interval#toString}, {@link Interval#toLocaleString}, {@link Interval#toISO}, {@link Interval#toISODate}, {@link Interval#toISOTime}, {@link Interval#toFormat}, and {@link Interval#toDuration}. + */ +var Interval = /*#__PURE__*/function (_Symbol$for) { + /** + * @private + */ + function Interval(config) { + /** + * @access private + */ + this.s = config.start; + /** + * @access private + */ + this.e = config.end; + /** + * @access private + */ + this.invalid = config.invalid || null; + /** + * @access private + */ + this.isLuxonInterval = true; + } + + /** + * Create an invalid Interval. + * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {Interval} + */ + Interval.invalid = function invalid(reason, explanation) { + if (explanation === void 0) { + explanation = null; + } + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the Interval is invalid"); + } + var invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidIntervalError(invalid); + } else { + return new Interval({ + invalid: invalid + }); + } + } + + /** + * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end. + * @param {DateTime|Date|Object} start + * @param {DateTime|Date|Object} end + * @return {Interval} + */; + Interval.fromDateTimes = function fromDateTimes(start, end) { + var builtStart = friendlyDateTime(start), + builtEnd = friendlyDateTime(end); + var validateError = validateStartEnd(builtStart, builtEnd); + if (validateError == null) { + return new Interval({ + start: builtStart, + end: builtEnd + }); + } else { + return validateError; + } + } + + /** + * Create an Interval from a start DateTime and a Duration to extend to. + * @param {DateTime|Date|Object} start + * @param {Duration|Object|number} duration - the length of the Interval. + * @return {Interval} + */; + Interval.after = function after(start, duration) { + var dur = Duration.fromDurationLike(duration), + dt = friendlyDateTime(start); + return Interval.fromDateTimes(dt, dt.plus(dur)); + } + + /** + * Create an Interval from an end DateTime and a Duration to extend backwards to. + * @param {DateTime|Date|Object} end + * @param {Duration|Object|number} duration - the length of the Interval. + * @return {Interval} + */; + Interval.before = function before(end, duration) { + var dur = Duration.fromDurationLike(duration), + dt = friendlyDateTime(end); + return Interval.fromDateTimes(dt.minus(dur), dt); + } + + /** + * Create an Interval from an ISO 8601 string. + * Accepts `/`, `/`, and `/` formats. + * @param {string} text - the ISO string to parse + * @param {Object} [opts] - options to pass {@link DateTime#fromISO} and optionally {@link Duration#fromISO} + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @return {Interval} + */; + Interval.fromISO = function fromISO(text, opts) { + var _split = (text || "").split("/", 2), + s = _split[0], + e = _split[1]; + if (s && e) { + var start, startIsValid; + try { + start = DateTime.fromISO(s, opts); + startIsValid = start.isValid; + } catch (e) { + startIsValid = false; + } + var end, endIsValid; + try { + end = DateTime.fromISO(e, opts); + endIsValid = end.isValid; + } catch (e) { + endIsValid = false; + } + if (startIsValid && endIsValid) { + return Interval.fromDateTimes(start, end); + } + if (startIsValid) { + var dur = Duration.fromISO(e, opts); + if (dur.isValid) { + return Interval.after(start, dur); + } + } else if (endIsValid) { + var _dur = Duration.fromISO(s, opts); + if (_dur.isValid) { + return Interval.before(end, _dur); + } + } + } + return Interval.invalid("unparsable", "the input \"" + text + "\" can't be parsed as ISO 8601"); + } + + /** + * Check if an object is an Interval. Works across context boundaries + * @param {object} o + * @return {boolean} + */; + Interval.isInterval = function isInterval(o) { + return o && o.isLuxonInterval || false; + } + + /** + * Returns the start of the Interval + * @type {DateTime} + */; + var _proto = Interval.prototype; + /** + * Returns the length of the Interval in the specified unit. + * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in. + * @return {number} + */ + _proto.length = function length(unit) { + if (unit === void 0) { + unit = "milliseconds"; + } + return this.isValid ? this.toDuration.apply(this, [unit]).get(unit) : NaN; + } + + /** + * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part. + * Unlike {@link Interval#length} this counts sections of the calendar, not periods of time, e.g. specifying 'day' + * asks 'what dates are included in this interval?', not 'how many days long is this interval?' + * @param {string} [unit='milliseconds'] - the unit of time to count. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; this operation will always use the locale of the start DateTime + * @return {number} + */; + _proto.count = function count(unit, opts) { + if (unit === void 0) { + unit = "milliseconds"; + } + if (!this.isValid) return NaN; + var start = this.start.startOf(unit, opts); + var end; + if (opts != null && opts.useLocaleWeeks) { + end = this.end.reconfigure({ + locale: start.locale + }); + } else { + end = this.end; + } + end = end.startOf(unit, opts); + return Math.floor(end.diff(start, unit).get(unit)) + (end.valueOf() !== this.end.valueOf()); + } + + /** + * Returns whether this Interval's start and end are both in the same unit of time + * @param {string} unit - the unit of time to check sameness on + * @return {boolean} + */; + _proto.hasSame = function hasSame(unit) { + return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false; + } + + /** + * Return whether this Interval has the same start and end DateTimes. + * @return {boolean} + */; + _proto.isEmpty = function isEmpty() { + return this.s.valueOf() === this.e.valueOf(); + } + + /** + * Return whether this Interval's start is after the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */; + _proto.isAfter = function isAfter(dateTime) { + if (!this.isValid) return false; + return this.s > dateTime; + } + + /** + * Return whether this Interval's end is before the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */; + _proto.isBefore = function isBefore(dateTime) { + if (!this.isValid) return false; + return this.e <= dateTime; + } + + /** + * Return whether this Interval contains the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */; + _proto.contains = function contains(dateTime) { + if (!this.isValid) return false; + return this.s <= dateTime && this.e > dateTime; + } + + /** + * "Sets" the start and/or end dates. Returns a newly-constructed Interval. + * @param {Object} values - the values to set + * @param {DateTime} values.start - the starting DateTime + * @param {DateTime} values.end - the ending DateTime + * @return {Interval} + */; + _proto.set = function set(_temp) { + var _ref = _temp === void 0 ? {} : _temp, + start = _ref.start, + end = _ref.end; + if (!this.isValid) return this; + return Interval.fromDateTimes(start || this.s, end || this.e); + } + + /** + * Split this Interval at each of the specified DateTimes + * @param {...DateTime} dateTimes - the unit of time to count. + * @return {Array} + */; + _proto.splitAt = function splitAt() { + var _this = this; + if (!this.isValid) return []; + for (var _len = arguments.length, dateTimes = new Array(_len), _key = 0; _key < _len; _key++) { + dateTimes[_key] = arguments[_key]; + } + var sorted = dateTimes.map(friendlyDateTime).filter(function (d) { + return _this.contains(d); + }).sort(function (a, b) { + return a.toMillis() - b.toMillis(); + }), + results = []; + var s = this.s, + i = 0; + while (s < this.e) { + var added = sorted[i] || this.e, + next = +added > +this.e ? this.e : added; + results.push(Interval.fromDateTimes(s, next)); + s = next; + i += 1; + } + return results; + } + + /** + * Split this Interval into smaller Intervals, each of the specified length. + * Left over time is grouped into a smaller interval + * @param {Duration|Object|number} duration - The length of each resulting interval. + * @return {Array} + */; + _proto.splitBy = function splitBy(duration) { + var dur = Duration.fromDurationLike(duration); + if (!this.isValid || !dur.isValid || dur.as("milliseconds") === 0) { + return []; + } + var s = this.s, + idx = 1, + next; + var results = []; + while (s < this.e) { + var added = this.start.plus(dur.mapUnits(function (x) { + return x * idx; + })); + next = +added > +this.e ? this.e : added; + results.push(Interval.fromDateTimes(s, next)); + s = next; + idx += 1; + } + return results; + } + + /** + * Split this Interval into the specified number of smaller intervals. + * @param {number} numberOfParts - The number of Intervals to divide the Interval into. + * @return {Array} + */; + _proto.divideEqually = function divideEqually(numberOfParts) { + if (!this.isValid) return []; + return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts); + } + + /** + * Return whether this Interval overlaps with the specified Interval + * @param {Interval} other + * @return {boolean} + */; + _proto.overlaps = function overlaps(other) { + return this.e > other.s && this.s < other.e; + } + + /** + * Return whether this Interval's end is adjacent to the specified Interval's start. + * @param {Interval} other + * @return {boolean} + */; + _proto.abutsStart = function abutsStart(other) { + if (!this.isValid) return false; + return +this.e === +other.s; + } + + /** + * Return whether this Interval's start is adjacent to the specified Interval's end. + * @param {Interval} other + * @return {boolean} + */; + _proto.abutsEnd = function abutsEnd(other) { + if (!this.isValid) return false; + return +other.e === +this.s; + } + + /** + * Returns true if this Interval fully contains the specified Interval, specifically if the intersect (of this Interval and the other Interval) is equal to the other Interval; false otherwise. + * @param {Interval} other + * @return {boolean} + */; + _proto.engulfs = function engulfs(other) { + if (!this.isValid) return false; + return this.s <= other.s && this.e >= other.e; + } + + /** + * Return whether this Interval has the same start and end as the specified Interval. + * @param {Interval} other + * @return {boolean} + */; + _proto.equals = function equals(other) { + if (!this.isValid || !other.isValid) { + return false; + } + return this.s.equals(other.s) && this.e.equals(other.e); + } + + /** + * Return an Interval representing the intersection of this Interval and the specified Interval. + * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals. + * Returns null if the intersection is empty, meaning, the intervals don't intersect. + * @param {Interval} other + * @return {Interval} + */; + _proto.intersection = function intersection(other) { + if (!this.isValid) return this; + var s = this.s > other.s ? this.s : other.s, + e = this.e < other.e ? this.e : other.e; + if (s >= e) { + return null; + } else { + return Interval.fromDateTimes(s, e); + } + } + + /** + * Return an Interval representing the union of this Interval and the specified Interval. + * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals. + * @param {Interval} other + * @return {Interval} + */; + _proto.union = function union(other) { + if (!this.isValid) return this; + var s = this.s < other.s ? this.s : other.s, + e = this.e > other.e ? this.e : other.e; + return Interval.fromDateTimes(s, e); + } + + /** + * Merge an array of Intervals into an equivalent minimal set of Intervals. + * Combines overlapping and adjacent Intervals. + * The resulting array will contain the Intervals in ascending order, that is, starting with the earliest Interval + * and ending with the latest. + * + * @param {Array} intervals + * @return {Array} + */; + Interval.merge = function merge(intervals) { + var _intervals$sort$reduc = intervals.sort(function (a, b) { + return a.s - b.s; + }).reduce(function (_ref2, item) { + var sofar = _ref2[0], + current = _ref2[1]; + if (!current) { + return [sofar, item]; + } else if (current.overlaps(item) || current.abutsStart(item)) { + return [sofar, current.union(item)]; + } else { + return [sofar.concat([current]), item]; + } + }, [[], null]), + found = _intervals$sort$reduc[0], + final = _intervals$sort$reduc[1]; + if (final) { + found.push(final); + } + return found; + } + + /** + * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals. + * @param {Array} intervals + * @return {Array} + */; + Interval.xor = function xor(intervals) { + var _Array$prototype; + var start = null, + currentCount = 0; + var results = [], + ends = intervals.map(function (i) { + return [{ + time: i.s, + type: "s" + }, { + time: i.e, + type: "e" + }]; + }), + flattened = (_Array$prototype = Array.prototype).concat.apply(_Array$prototype, ends), + arr = flattened.sort(function (a, b) { + return a.time - b.time; + }); + for (var _iterator = _createForOfIteratorHelperLoose(arr), _step; !(_step = _iterator()).done;) { + var i = _step.value; + currentCount += i.type === "s" ? 1 : -1; + if (currentCount === 1) { + start = i.time; + } else { + if (start && +start !== +i.time) { + results.push(Interval.fromDateTimes(start, i.time)); + } + start = null; + } + } + return Interval.merge(results); + } + + /** + * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals. + * @param {...Interval} intervals + * @return {Array} + */; + _proto.difference = function difference() { + var _this2 = this; + for (var _len2 = arguments.length, intervals = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + intervals[_key2] = arguments[_key2]; + } + return Interval.xor([this].concat(intervals)).map(function (i) { + return _this2.intersection(i); + }).filter(function (i) { + return i && !i.isEmpty(); + }); + } + + /** + * Returns a string representation of this Interval appropriate for debugging. + * @return {string} + */; + _proto.toString = function toString() { + if (!this.isValid) return INVALID$1; + return "[" + this.s.toISO() + " \u2013 " + this.e.toISO() + ")"; + } + + /** + * Returns a string representation of this Interval appropriate for the REPL. + * @return {string} + */; + _proto[_Symbol$for] = function () { + if (this.isValid) { + return "Interval { start: " + this.s.toISO() + ", end: " + this.e.toISO() + " }"; + } else { + return "Interval { Invalid, reason: " + this.invalidReason + " }"; + } + } + + /** + * Returns a localized string representing this Interval. Accepts the same options as the + * Intl.DateTimeFormat constructor and any presets defined by Luxon, such as + * {@link DateTime.DATE_FULL} or {@link DateTime.TIME_SIMPLE}. The exact behavior of this method + * is browser-specific, but in general it will return an appropriate representation of the + * Interval in the assigned locale. Defaults to the system's locale if no locale has been + * specified. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {Object} [formatOpts=DateTime.DATE_SHORT] - Either a DateTime preset or + * Intl.DateTimeFormat constructor options. + * @param {Object} opts - Options to override the configuration of the start DateTime. + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(); //=> 11/7/2022 – 11/8/2022 + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL); //=> November 7 – 8, 2022 + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL, { locale: 'fr-FR' }); //=> 7–8 novembre 2022 + * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString(DateTime.TIME_SIMPLE); //=> 6:00 – 8:00 PM + * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> Mon, Nov 07, 6:00 – 8:00 p + * @return {string} + */; + _proto.toLocaleString = function toLocaleString(formatOpts, opts) { + if (formatOpts === void 0) { + formatOpts = DATE_SHORT; + } + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.s.loc.clone(opts), formatOpts).formatInterval(this) : INVALID$1; + } + + /** + * Returns an ISO 8601-compliant string representation of this Interval. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @param {Object} opts - The same options as {@link DateTime#toISO} + * @return {string} + */; + _proto.toISO = function toISO(opts) { + if (!this.isValid) return INVALID$1; + return this.s.toISO(opts) + "/" + this.e.toISO(opts); + } + + /** + * Returns an ISO 8601-compliant string representation of date of this Interval. + * The time components are ignored. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @return {string} + */; + _proto.toISODate = function toISODate() { + if (!this.isValid) return INVALID$1; + return this.s.toISODate() + "/" + this.e.toISODate(); + } + + /** + * Returns an ISO 8601-compliant string representation of time of this Interval. + * The date components are ignored. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @param {Object} opts - The same options as {@link DateTime#toISO} + * @return {string} + */; + _proto.toISOTime = function toISOTime(opts) { + if (!this.isValid) return INVALID$1; + return this.s.toISOTime(opts) + "/" + this.e.toISOTime(opts); + } + + /** + * Returns a string representation of this Interval formatted according to the specified format + * string. **You may not want this.** See {@link Interval#toLocaleString} for a more flexible + * formatting tool. + * @param {string} dateFormat - The format string. This string formats the start and end time. + * See {@link DateTime#toFormat} for details. + * @param {Object} opts - Options. + * @param {string} [opts.separator = ' – '] - A separator to place between the start and end + * representations. + * @return {string} + */; + _proto.toFormat = function toFormat(dateFormat, _temp2) { + var _ref3 = _temp2 === void 0 ? {} : _temp2, + _ref3$separator = _ref3.separator, + separator = _ref3$separator === void 0 ? " – " : _ref3$separator; + if (!this.isValid) return INVALID$1; + return "" + this.s.toFormat(dateFormat) + separator + this.e.toFormat(dateFormat); + } + + /** + * Return a Duration representing the time spanned by this interval. + * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration. + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 } + * @return {Duration} + */; + _proto.toDuration = function toDuration(unit, opts) { + if (!this.isValid) { + return Duration.invalid(this.invalidReason); + } + return this.e.diff(this.s, unit, opts); + } + + /** + * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes + * @param {function} mapFn + * @return {Interval} + * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC()) + * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 })) + */; + _proto.mapEndpoints = function mapEndpoints(mapFn) { + return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e)); + }; + _createClass(Interval, [{ + key: "start", + get: function get() { + return this.isValid ? this.s : null; + } + + /** + * Returns the end of the Interval. This is the first instant which is not part of the interval + * (Interval is half-open). + * @type {DateTime} + */ + }, { + key: "end", + get: function get() { + return this.isValid ? this.e : null; + } + + /** + * Returns the last DateTime included in the interval (since end is not part of the interval) + * @type {DateTime} + */ + }, { + key: "lastDateTime", + get: function get() { + return this.isValid ? this.e ? this.e.minus(1) : null : null; + } + + /** + * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'. + * @type {boolean} + */ + }, { + key: "isValid", + get: function get() { + return this.invalidReason === null; + } + + /** + * Returns an error code if this Interval is invalid, or null if the Interval is valid + * @type {string} + */ + }, { + key: "invalidReason", + get: function get() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this Interval became invalid, or null if the Interval is valid + * @type {string} + */ + }, { + key: "invalidExplanation", + get: function get() { + return this.invalid ? this.invalid.explanation : null; + } + }]); + return Interval; +}(Symbol.for("nodejs.util.inspect.custom")); + +/** + * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment. + */ +var Info = /*#__PURE__*/function () { + function Info() {} + /** + * Return whether the specified zone contains a DST. + * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone. + * @return {boolean} + */ + Info.hasDST = function hasDST(zone) { + if (zone === void 0) { + zone = Settings.defaultZone; + } + var proto = DateTime.now().setZone(zone).set({ + month: 12 + }); + return !zone.isUniversal && proto.offset !== proto.set({ + month: 6 + }).offset; + } + + /** + * Return whether the specified zone is a valid IANA specifier. + * @param {string} zone - Zone to check + * @return {boolean} + */; + Info.isValidIANAZone = function isValidIANAZone(zone) { + return IANAZone.isValidZone(zone); + } + + /** + * Converts the input into a {@link Zone} instance. + * + * * If `input` is already a Zone instance, it is returned unchanged. + * * If `input` is a string containing a valid time zone name, a Zone instance + * with that name is returned. + * * If `input` is a string that doesn't refer to a known time zone, a Zone + * instance with {@link Zone#isValid} == false is returned. + * * If `input is a number, a Zone instance with the specified fixed offset + * in minutes is returned. + * * If `input` is `null` or `undefined`, the default zone is returned. + * @param {string|Zone|number} [input] - the value to be converted + * @return {Zone} + */; + Info.normalizeZone = function normalizeZone$1(input) { + return normalizeZone(input, Settings.defaultZone); + } + + /** + * Get the weekday on which the week starts according to the given locale. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number} the start of the week, 1 for Monday through 7 for Sunday + */; + Info.getStartOfWeek = function getStartOfWeek(_temp) { + var _ref = _temp === void 0 ? {} : _temp, + _ref$locale = _ref.locale, + locale = _ref$locale === void 0 ? null : _ref$locale, + _ref$locObj = _ref.locObj, + locObj = _ref$locObj === void 0 ? null : _ref$locObj; + return (locObj || Locale.create(locale)).getStartOfWeek(); + } + + /** + * Get the minimum number of days necessary in a week before it is considered part of the next year according + * to the given locale. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number} + */; + Info.getMinimumDaysInFirstWeek = function getMinimumDaysInFirstWeek(_temp2) { + var _ref2 = _temp2 === void 0 ? {} : _temp2, + _ref2$locale = _ref2.locale, + locale = _ref2$locale === void 0 ? null : _ref2$locale, + _ref2$locObj = _ref2.locObj, + locObj = _ref2$locObj === void 0 ? null : _ref2$locObj; + return (locObj || Locale.create(locale)).getMinDaysInFirstWeek(); + } + + /** + * Get the weekdays, which are considered the weekend according to the given locale + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number[]} an array of weekdays, 1 for Monday through 7 for Sunday + */; + Info.getWeekendWeekdays = function getWeekendWeekdays(_temp3) { + var _ref3 = _temp3 === void 0 ? {} : _temp3, + _ref3$locale = _ref3.locale, + locale = _ref3$locale === void 0 ? null : _ref3$locale, + _ref3$locObj = _ref3.locObj, + locObj = _ref3$locObj === void 0 ? null : _ref3$locObj; + // copy the array, because we cache it internally + return (locObj || Locale.create(locale)).getWeekendDays().slice(); + } + + /** + * Return an array of standalone month names. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long" + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @param {string} [opts.outputCalendar='gregory'] - the calendar + * @example Info.months()[0] //=> 'January' + * @example Info.months('short')[0] //=> 'Jan' + * @example Info.months('numeric')[0] //=> '1' + * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.' + * @example Info.months('numeric', { locale: 'ar' })[0] //=> '١' + * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I' + * @return {Array} + */; + Info.months = function months(length, _temp4) { + if (length === void 0) { + length = "long"; + } + var _ref4 = _temp4 === void 0 ? {} : _temp4, + _ref4$locale = _ref4.locale, + locale = _ref4$locale === void 0 ? null : _ref4$locale, + _ref4$numberingSystem = _ref4.numberingSystem, + numberingSystem = _ref4$numberingSystem === void 0 ? null : _ref4$numberingSystem, + _ref4$locObj = _ref4.locObj, + locObj = _ref4$locObj === void 0 ? null : _ref4$locObj, + _ref4$outputCalendar = _ref4.outputCalendar, + outputCalendar = _ref4$outputCalendar === void 0 ? "gregory" : _ref4$outputCalendar; + return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length); + } + + /** + * Return an array of format month names. + * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that + * changes the string. + * See {@link Info#months} + * @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long" + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @param {string} [opts.outputCalendar='gregory'] - the calendar + * @return {Array} + */; + Info.monthsFormat = function monthsFormat(length, _temp5) { + if (length === void 0) { + length = "long"; + } + var _ref5 = _temp5 === void 0 ? {} : _temp5, + _ref5$locale = _ref5.locale, + locale = _ref5$locale === void 0 ? null : _ref5$locale, + _ref5$numberingSystem = _ref5.numberingSystem, + numberingSystem = _ref5$numberingSystem === void 0 ? null : _ref5$numberingSystem, + _ref5$locObj = _ref5.locObj, + locObj = _ref5$locObj === void 0 ? null : _ref5$locObj, + _ref5$outputCalendar = _ref5.outputCalendar, + outputCalendar = _ref5$outputCalendar === void 0 ? "gregory" : _ref5$outputCalendar; + return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true); + } + + /** + * Return an array of standalone week names. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {string} [length='long'] - the length of the weekday representation, such as "narrow", "short", "long". + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @example Info.weekdays()[0] //=> 'Monday' + * @example Info.weekdays('short')[0] //=> 'Mon' + * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.' + * @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين' + * @return {Array} + */; + Info.weekdays = function weekdays(length, _temp6) { + if (length === void 0) { + length = "long"; + } + var _ref6 = _temp6 === void 0 ? {} : _temp6, + _ref6$locale = _ref6.locale, + locale = _ref6$locale === void 0 ? null : _ref6$locale, + _ref6$numberingSystem = _ref6.numberingSystem, + numberingSystem = _ref6$numberingSystem === void 0 ? null : _ref6$numberingSystem, + _ref6$locObj = _ref6.locObj, + locObj = _ref6$locObj === void 0 ? null : _ref6$locObj; + return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length); + } + + /** + * Return an array of format week names. + * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that + * changes the string. + * See {@link Info#weekdays} + * @param {string} [length='long'] - the length of the month representation, such as "narrow", "short", "long". + * @param {Object} opts - options + * @param {string} [opts.locale=null] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @return {Array} + */; + Info.weekdaysFormat = function weekdaysFormat(length, _temp7) { + if (length === void 0) { + length = "long"; + } + var _ref7 = _temp7 === void 0 ? {} : _temp7, + _ref7$locale = _ref7.locale, + locale = _ref7$locale === void 0 ? null : _ref7$locale, + _ref7$numberingSystem = _ref7.numberingSystem, + numberingSystem = _ref7$numberingSystem === void 0 ? null : _ref7$numberingSystem, + _ref7$locObj = _ref7.locObj, + locObj = _ref7$locObj === void 0 ? null : _ref7$locObj; + return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true); + } + + /** + * Return an array of meridiems. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @example Info.meridiems() //=> [ 'AM', 'PM' ] + * @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ] + * @return {Array} + */; + Info.meridiems = function meridiems(_temp8) { + var _ref8 = _temp8 === void 0 ? {} : _temp8, + _ref8$locale = _ref8.locale, + locale = _ref8$locale === void 0 ? null : _ref8$locale; + return Locale.create(locale).meridiems(); + } + + /** + * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian. + * @param {string} [length='short'] - the length of the era representation, such as "short" or "long". + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @example Info.eras() //=> [ 'BC', 'AD' ] + * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ] + * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ] + * @return {Array} + */; + Info.eras = function eras(length, _temp9) { + if (length === void 0) { + length = "short"; + } + var _ref9 = _temp9 === void 0 ? {} : _temp9, + _ref9$locale = _ref9.locale, + locale = _ref9$locale === void 0 ? null : _ref9$locale; + return Locale.create(locale, null, "gregory").eras(length); + } + + /** + * Return the set of available features in this environment. + * Some features of Luxon are not available in all environments. For example, on older browsers, relative time formatting support is not available. Use this function to figure out if that's the case. + * Keys: + * * `relative`: whether this environment supports relative time formatting + * * `localeWeek`: whether this environment supports different weekdays for the start of the week based on the locale + * @example Info.features() //=> { relative: false, localeWeek: true } + * @return {Object} + */; + Info.features = function features() { + return { + relative: hasRelative(), + localeWeek: hasLocaleWeekInfo() + }; + }; + return Info; +}(); + +function dayDiff(earlier, later) { + var utcDayStart = function utcDayStart(dt) { + return dt.toUTC(0, { + keepLocalTime: true + }).startOf("day").valueOf(); + }, + ms = utcDayStart(later) - utcDayStart(earlier); + return Math.floor(Duration.fromMillis(ms).as("days")); +} +function highOrderDiffs(cursor, later, units) { + var differs = [["years", function (a, b) { + return b.year - a.year; + }], ["quarters", function (a, b) { + return b.quarter - a.quarter + (b.year - a.year) * 4; + }], ["months", function (a, b) { + return b.month - a.month + (b.year - a.year) * 12; + }], ["weeks", function (a, b) { + var days = dayDiff(a, b); + return (days - days % 7) / 7; + }], ["days", dayDiff]]; + var results = {}; + var earlier = cursor; + var lowestOrder, highWater; + + /* This loop tries to diff using larger units first. + If we overshoot, we backtrack and try the next smaller unit. + "cursor" starts out at the earlier timestamp and moves closer and closer to "later" + as we use smaller and smaller units. + highWater keeps track of where we would be if we added one more of the smallest unit, + this is used later to potentially convert any difference smaller than the smallest higher order unit + into a fraction of that smallest higher order unit + */ + for (var _i = 0, _differs = differs; _i < _differs.length; _i++) { + var _differs$_i = _differs[_i], + unit = _differs$_i[0], + differ = _differs$_i[1]; + if (units.indexOf(unit) >= 0) { + lowestOrder = unit; + results[unit] = differ(cursor, later); + highWater = earlier.plus(results); + if (highWater > later) { + // we overshot the end point, backtrack cursor by 1 + results[unit]--; + cursor = earlier.plus(results); + + // if we are still overshooting now, we need to backtrack again + // this happens in certain situations when diffing times in different zones, + // because this calculation ignores time zones + if (cursor > later) { + // keep the "overshot by 1" around as highWater + highWater = cursor; + // backtrack cursor by 1 + results[unit]--; + cursor = earlier.plus(results); + } + } else { + cursor = highWater; + } + } + } + return [cursor, results, highWater, lowestOrder]; +} +function _diff (earlier, later, units, opts) { + var _highOrderDiffs = highOrderDiffs(earlier, later, units), + cursor = _highOrderDiffs[0], + results = _highOrderDiffs[1], + highWater = _highOrderDiffs[2], + lowestOrder = _highOrderDiffs[3]; + var remainingMillis = later - cursor; + var lowerOrderUnits = units.filter(function (u) { + return ["hours", "minutes", "seconds", "milliseconds"].indexOf(u) >= 0; + }); + if (lowerOrderUnits.length === 0) { + if (highWater < later) { + var _cursor$plus; + highWater = cursor.plus((_cursor$plus = {}, _cursor$plus[lowestOrder] = 1, _cursor$plus)); + } + if (highWater !== cursor) { + results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor); + } + } + var duration = Duration.fromObject(results, opts); + if (lowerOrderUnits.length > 0) { + var _Duration$fromMillis; + return (_Duration$fromMillis = Duration.fromMillis(remainingMillis, opts)).shiftTo.apply(_Duration$fromMillis, lowerOrderUnits).plus(duration); + } else { + return duration; + } +} + +var MISSING_FTP = "missing Intl.DateTimeFormat.formatToParts support"; +function intUnit(regex, post) { + if (post === void 0) { + post = function post(i) { + return i; + }; + } + return { + regex: regex, + deser: function deser(_ref) { + var s = _ref[0]; + return post(parseDigits(s)); + } + }; +} +var NBSP = String.fromCharCode(160); +var spaceOrNBSP = "[ " + NBSP + "]"; +var spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, "g"); +function fixListRegex(s) { + // make dots optional and also make them literal + // make space and non breakable space characters interchangeable + return s.replace(/\./g, "\\.?").replace(spaceOrNBSPRegExp, spaceOrNBSP); +} +function stripInsensitivities(s) { + return s.replace(/\./g, "") // ignore dots that were made optional + .replace(spaceOrNBSPRegExp, " ") // interchange space and nbsp + .toLowerCase(); +} +function oneOf(strings, startIndex) { + if (strings === null) { + return null; + } else { + return { + regex: RegExp(strings.map(fixListRegex).join("|")), + deser: function deser(_ref2) { + var s = _ref2[0]; + return strings.findIndex(function (i) { + return stripInsensitivities(s) === stripInsensitivities(i); + }) + startIndex; + } + }; + } +} +function offset(regex, groups) { + return { + regex: regex, + deser: function deser(_ref3) { + var h = _ref3[1], + m = _ref3[2]; + return signedOffset(h, m); + }, + groups: groups + }; +} +function simple(regex) { + return { + regex: regex, + deser: function deser(_ref4) { + var s = _ref4[0]; + return s; + } + }; +} +function escapeToken(value) { + return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); +} + +/** + * @param token + * @param {Locale} loc + */ +function unitForToken(token, loc) { + var one = digitRegex(loc), + two = digitRegex(loc, "{2}"), + three = digitRegex(loc, "{3}"), + four = digitRegex(loc, "{4}"), + six = digitRegex(loc, "{6}"), + oneOrTwo = digitRegex(loc, "{1,2}"), + oneToThree = digitRegex(loc, "{1,3}"), + oneToSix = digitRegex(loc, "{1,6}"), + oneToNine = digitRegex(loc, "{1,9}"), + twoToFour = digitRegex(loc, "{2,4}"), + fourToSix = digitRegex(loc, "{4,6}"), + literal = function literal(t) { + return { + regex: RegExp(escapeToken(t.val)), + deser: function deser(_ref5) { + var s = _ref5[0]; + return s; + }, + literal: true + }; + }, + unitate = function unitate(t) { + if (token.literal) { + return literal(t); + } + switch (t.val) { + // era + case "G": + return oneOf(loc.eras("short"), 0); + case "GG": + return oneOf(loc.eras("long"), 0); + // years + case "y": + return intUnit(oneToSix); + case "yy": + return intUnit(twoToFour, untruncateYear); + case "yyyy": + return intUnit(four); + case "yyyyy": + return intUnit(fourToSix); + case "yyyyyy": + return intUnit(six); + // months + case "M": + return intUnit(oneOrTwo); + case "MM": + return intUnit(two); + case "MMM": + return oneOf(loc.months("short", true), 1); + case "MMMM": + return oneOf(loc.months("long", true), 1); + case "L": + return intUnit(oneOrTwo); + case "LL": + return intUnit(two); + case "LLL": + return oneOf(loc.months("short", false), 1); + case "LLLL": + return oneOf(loc.months("long", false), 1); + // dates + case "d": + return intUnit(oneOrTwo); + case "dd": + return intUnit(two); + // ordinals + case "o": + return intUnit(oneToThree); + case "ooo": + return intUnit(three); + // time + case "HH": + return intUnit(two); + case "H": + return intUnit(oneOrTwo); + case "hh": + return intUnit(two); + case "h": + return intUnit(oneOrTwo); + case "mm": + return intUnit(two); + case "m": + return intUnit(oneOrTwo); + case "q": + return intUnit(oneOrTwo); + case "qq": + return intUnit(two); + case "s": + return intUnit(oneOrTwo); + case "ss": + return intUnit(two); + case "S": + return intUnit(oneToThree); + case "SSS": + return intUnit(three); + case "u": + return simple(oneToNine); + case "uu": + return simple(oneOrTwo); + case "uuu": + return intUnit(one); + // meridiem + case "a": + return oneOf(loc.meridiems(), 0); + // weekYear (k) + case "kkkk": + return intUnit(four); + case "kk": + return intUnit(twoToFour, untruncateYear); + // weekNumber (W) + case "W": + return intUnit(oneOrTwo); + case "WW": + return intUnit(two); + // weekdays + case "E": + case "c": + return intUnit(one); + case "EEE": + return oneOf(loc.weekdays("short", false), 1); + case "EEEE": + return oneOf(loc.weekdays("long", false), 1); + case "ccc": + return oneOf(loc.weekdays("short", true), 1); + case "cccc": + return oneOf(loc.weekdays("long", true), 1); + // offset/zone + case "Z": + case "ZZ": + return offset(new RegExp("([+-]" + oneOrTwo.source + ")(?::(" + two.source + "))?"), 2); + case "ZZZ": + return offset(new RegExp("([+-]" + oneOrTwo.source + ")(" + two.source + ")?"), 2); + // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing + // because we don't have any way to figure out what they are + case "z": + return simple(/[a-z_+-/]{1,256}?/i); + // this special-case "token" represents a place where a macro-token expanded into a white-space literal + // in this case we accept any non-newline white-space + case " ": + return simple(/[^\S\n\r]/); + default: + return literal(t); + } + }; + var unit = unitate(token) || { + invalidReason: MISSING_FTP + }; + unit.token = token; + return unit; +} +var partTypeStyleToTokenVal = { + year: { + "2-digit": "yy", + numeric: "yyyyy" + }, + month: { + numeric: "M", + "2-digit": "MM", + short: "MMM", + long: "MMMM" + }, + day: { + numeric: "d", + "2-digit": "dd" + }, + weekday: { + short: "EEE", + long: "EEEE" + }, + dayperiod: "a", + dayPeriod: "a", + hour12: { + numeric: "h", + "2-digit": "hh" + }, + hour24: { + numeric: "H", + "2-digit": "HH" + }, + minute: { + numeric: "m", + "2-digit": "mm" + }, + second: { + numeric: "s", + "2-digit": "ss" + }, + timeZoneName: { + long: "ZZZZZ", + short: "ZZZ" + } +}; +function tokenForPart(part, formatOpts, resolvedOpts) { + var type = part.type, + value = part.value; + if (type === "literal") { + var isSpace = /^\s+$/.test(value); + return { + literal: !isSpace, + val: isSpace ? " " : value + }; + } + var style = formatOpts[type]; + + // The user might have explicitly specified hour12 or hourCycle + // if so, respect their decision + // if not, refer back to the resolvedOpts, which are based on the locale + var actualType = type; + if (type === "hour") { + if (formatOpts.hour12 != null) { + actualType = formatOpts.hour12 ? "hour12" : "hour24"; + } else if (formatOpts.hourCycle != null) { + if (formatOpts.hourCycle === "h11" || formatOpts.hourCycle === "h12") { + actualType = "hour12"; + } else { + actualType = "hour24"; + } + } else { + // tokens only differentiate between 24 hours or not, + // so we do not need to check hourCycle here, which is less supported anyways + actualType = resolvedOpts.hour12 ? "hour12" : "hour24"; + } + } + var val = partTypeStyleToTokenVal[actualType]; + if (typeof val === "object") { + val = val[style]; + } + if (val) { + return { + literal: false, + val: val + }; + } + return undefined; +} +function buildRegex(units) { + var re = units.map(function (u) { + return u.regex; + }).reduce(function (f, r) { + return f + "(" + r.source + ")"; + }, ""); + return ["^" + re + "$", units]; +} +function match(input, regex, handlers) { + var matches = input.match(regex); + if (matches) { + var all = {}; + var matchIndex = 1; + for (var i in handlers) { + if (hasOwnProperty(handlers, i)) { + var h = handlers[i], + groups = h.groups ? h.groups + 1 : 1; + if (!h.literal && h.token) { + all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups)); + } + matchIndex += groups; + } + } + return [matches, all]; + } else { + return [matches, {}]; + } +} +function dateTimeFromMatches(matches) { + var toField = function toField(token) { + switch (token) { + case "S": + return "millisecond"; + case "s": + return "second"; + case "m": + return "minute"; + case "h": + case "H": + return "hour"; + case "d": + return "day"; + case "o": + return "ordinal"; + case "L": + case "M": + return "month"; + case "y": + return "year"; + case "E": + case "c": + return "weekday"; + case "W": + return "weekNumber"; + case "k": + return "weekYear"; + case "q": + return "quarter"; + default: + return null; + } + }; + var zone = null; + var specificOffset; + if (!isUndefined(matches.z)) { + zone = IANAZone.create(matches.z); + } + if (!isUndefined(matches.Z)) { + if (!zone) { + zone = new FixedOffsetZone(matches.Z); + } + specificOffset = matches.Z; + } + if (!isUndefined(matches.q)) { + matches.M = (matches.q - 1) * 3 + 1; + } + if (!isUndefined(matches.h)) { + if (matches.h < 12 && matches.a === 1) { + matches.h += 12; + } else if (matches.h === 12 && matches.a === 0) { + matches.h = 0; + } + } + if (matches.G === 0 && matches.y) { + matches.y = -matches.y; + } + if (!isUndefined(matches.u)) { + matches.S = parseMillis(matches.u); + } + var vals = Object.keys(matches).reduce(function (r, k) { + var f = toField(k); + if (f) { + r[f] = matches[k]; + } + return r; + }, {}); + return [vals, zone, specificOffset]; +} +var dummyDateTimeCache = null; +function getDummyDateTime() { + if (!dummyDateTimeCache) { + dummyDateTimeCache = DateTime.fromMillis(1555555555555); + } + return dummyDateTimeCache; +} +function maybeExpandMacroToken(token, locale) { + if (token.literal) { + return token; + } + var formatOpts = Formatter.macroTokenToFormatOpts(token.val); + var tokens = formatOptsToTokens(formatOpts, locale); + if (tokens == null || tokens.includes(undefined)) { + return token; + } + return tokens; +} +function expandMacroTokens(tokens, locale) { + var _Array$prototype; + return (_Array$prototype = Array.prototype).concat.apply(_Array$prototype, tokens.map(function (t) { + return maybeExpandMacroToken(t, locale); + })); +} + +/** + * @private + */ + +var TokenParser = /*#__PURE__*/function () { + function TokenParser(locale, format) { + this.locale = locale; + this.format = format; + this.tokens = expandMacroTokens(Formatter.parseFormat(format), locale); + this.units = this.tokens.map(function (t) { + return unitForToken(t, locale); + }); + this.disqualifyingUnit = this.units.find(function (t) { + return t.invalidReason; + }); + if (!this.disqualifyingUnit) { + var _buildRegex = buildRegex(this.units), + regexString = _buildRegex[0], + handlers = _buildRegex[1]; + this.regex = RegExp(regexString, "i"); + this.handlers = handlers; + } + } + var _proto = TokenParser.prototype; + _proto.explainFromTokens = function explainFromTokens(input) { + if (!this.isValid) { + return { + input: input, + tokens: this.tokens, + invalidReason: this.invalidReason + }; + } else { + var _match = match(input, this.regex, this.handlers), + rawMatches = _match[0], + matches = _match[1], + _ref6 = matches ? dateTimeFromMatches(matches) : [null, null, undefined], + result = _ref6[0], + zone = _ref6[1], + specificOffset = _ref6[2]; + if (hasOwnProperty(matches, "a") && hasOwnProperty(matches, "H")) { + throw new ConflictingSpecificationError("Can't include meridiem when specifying 24-hour format"); + } + return { + input: input, + tokens: this.tokens, + regex: this.regex, + rawMatches: rawMatches, + matches: matches, + result: result, + zone: zone, + specificOffset: specificOffset + }; + } + }; + _createClass(TokenParser, [{ + key: "isValid", + get: function get() { + return !this.disqualifyingUnit; + } + }, { + key: "invalidReason", + get: function get() { + return this.disqualifyingUnit ? this.disqualifyingUnit.invalidReason : null; + } + }]); + return TokenParser; +}(); +function explainFromTokens(locale, input, format) { + var parser = new TokenParser(locale, format); + return parser.explainFromTokens(input); +} +function parseFromTokens(locale, input, format) { + var _explainFromTokens = explainFromTokens(locale, input, format), + result = _explainFromTokens.result, + zone = _explainFromTokens.zone, + specificOffset = _explainFromTokens.specificOffset, + invalidReason = _explainFromTokens.invalidReason; + return [result, zone, specificOffset, invalidReason]; +} +function formatOptsToTokens(formatOpts, locale) { + if (!formatOpts) { + return null; + } + var formatter = Formatter.create(locale, formatOpts); + var df = formatter.dtFormatter(getDummyDateTime()); + var parts = df.formatToParts(); + var resolvedOpts = df.resolvedOptions(); + return parts.map(function (p) { + return tokenForPart(p, formatOpts, resolvedOpts); + }); +} + +var INVALID = "Invalid DateTime"; +var MAX_DATE = 8.64e15; +function unsupportedZone(zone) { + return new Invalid("unsupported zone", "the zone \"" + zone.name + "\" is not supported"); +} + +// we cache week data on the DT object and this intermediates the cache +/** + * @param {DateTime} dt + */ +function possiblyCachedWeekData(dt) { + if (dt.weekData === null) { + dt.weekData = gregorianToWeek(dt.c); + } + return dt.weekData; +} + +/** + * @param {DateTime} dt + */ +function possiblyCachedLocalWeekData(dt) { + if (dt.localWeekData === null) { + dt.localWeekData = gregorianToWeek(dt.c, dt.loc.getMinDaysInFirstWeek(), dt.loc.getStartOfWeek()); + } + return dt.localWeekData; +} + +// clone really means, "make a new object with these modifications". all "setters" really use this +// to create a new object while only changing some of the properties +function clone(inst, alts) { + var current = { + ts: inst.ts, + zone: inst.zone, + c: inst.c, + o: inst.o, + loc: inst.loc, + invalid: inst.invalid + }; + return new DateTime(_extends({}, current, alts, { + old: current + })); +} + +// find the right offset a given local time. The o input is our guess, which determines which +// offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST) +function fixOffset(localTS, o, tz) { + // Our UTC time is just a guess because our offset is just a guess + var utcGuess = localTS - o * 60 * 1000; + + // Test whether the zone matches the offset for this ts + var o2 = tz.offset(utcGuess); + + // If so, offset didn't change and we're done + if (o === o2) { + return [utcGuess, o]; + } + + // If not, change the ts by the difference in the offset + utcGuess -= (o2 - o) * 60 * 1000; + + // If that gives us the local time we want, we're done + var o3 = tz.offset(utcGuess); + if (o2 === o3) { + return [utcGuess, o2]; + } + + // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time + return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)]; +} + +// convert an epoch timestamp into a calendar object with the given offset +function tsToObj(ts, offset) { + ts += offset * 60 * 1000; + var d = new Date(ts); + return { + year: d.getUTCFullYear(), + month: d.getUTCMonth() + 1, + day: d.getUTCDate(), + hour: d.getUTCHours(), + minute: d.getUTCMinutes(), + second: d.getUTCSeconds(), + millisecond: d.getUTCMilliseconds() + }; +} + +// convert a calendar object to a epoch timestamp +function objToTS(obj, offset, zone) { + return fixOffset(objToLocalTS(obj), offset, zone); +} + +// create a new DT instance by adding a duration, adjusting for DSTs +function adjustTime(inst, dur) { + var oPre = inst.o, + year = inst.c.year + Math.trunc(dur.years), + month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3, + c = _extends({}, inst.c, { + year: year, + month: month, + day: Math.min(inst.c.day, daysInMonth(year, month)) + Math.trunc(dur.days) + Math.trunc(dur.weeks) * 7 + }), + millisToAdd = Duration.fromObject({ + years: dur.years - Math.trunc(dur.years), + quarters: dur.quarters - Math.trunc(dur.quarters), + months: dur.months - Math.trunc(dur.months), + weeks: dur.weeks - Math.trunc(dur.weeks), + days: dur.days - Math.trunc(dur.days), + hours: dur.hours, + minutes: dur.minutes, + seconds: dur.seconds, + milliseconds: dur.milliseconds + }).as("milliseconds"), + localTS = objToLocalTS(c); + var _fixOffset = fixOffset(localTS, oPre, inst.zone), + ts = _fixOffset[0], + o = _fixOffset[1]; + if (millisToAdd !== 0) { + ts += millisToAdd; + // that could have changed the offset by going over a DST, but we want to keep the ts the same + o = inst.zone.offset(ts); + } + return { + ts: ts, + o: o + }; +} + +// helper useful in turning the results of parsing into real dates +// by handling the zone options +function parseDataToDateTime(parsed, parsedZone, opts, format, text, specificOffset) { + var setZone = opts.setZone, + zone = opts.zone; + if (parsed && Object.keys(parsed).length !== 0 || parsedZone) { + var interpretationZone = parsedZone || zone, + inst = DateTime.fromObject(parsed, _extends({}, opts, { + zone: interpretationZone, + specificOffset: specificOffset + })); + return setZone ? inst : inst.setZone(zone); + } else { + return DateTime.invalid(new Invalid("unparsable", "the input \"" + text + "\" can't be parsed as " + format)); + } +} + +// if you want to output a technical format (e.g. RFC 2822), this helper +// helps handle the details +function toTechFormat(dt, format, allowZ) { + if (allowZ === void 0) { + allowZ = true; + } + return dt.isValid ? Formatter.create(Locale.create("en-US"), { + allowZ: allowZ, + forceSimple: true + }).formatDateTimeFromString(dt, format) : null; +} +function _toISODate(o, extended, precision) { + var longFormat = o.c.year > 9999 || o.c.year < 0; + var c = ""; + if (longFormat && o.c.year >= 0) c += "+"; + c += padStart(o.c.year, longFormat ? 6 : 4); + if (precision === "year") return c; + if (extended) { + c += "-"; + c += padStart(o.c.month); + if (precision === "month") return c; + c += "-"; + } else { + c += padStart(o.c.month); + if (precision === "month") return c; + } + c += padStart(o.c.day); + return c; +} +function _toISOTime(o, extended, suppressSeconds, suppressMilliseconds, includeOffset, extendedZone, precision) { + var showSeconds = !suppressSeconds || o.c.millisecond !== 0 || o.c.second !== 0, + c = ""; + switch (precision) { + case "day": + case "month": + case "year": + break; + default: + c += padStart(o.c.hour); + if (precision === "hour") break; + if (extended) { + c += ":"; + c += padStart(o.c.minute); + if (precision === "minute") break; + if (showSeconds) { + c += ":"; + c += padStart(o.c.second); + } + } else { + c += padStart(o.c.minute); + if (precision === "minute") break; + if (showSeconds) { + c += padStart(o.c.second); + } + } + if (precision === "second") break; + if (showSeconds && (!suppressMilliseconds || o.c.millisecond !== 0)) { + c += "."; + c += padStart(o.c.millisecond, 3); + } + } + if (includeOffset) { + if (o.isOffsetFixed && o.offset === 0 && !extendedZone) { + c += "Z"; + } else if (o.o < 0) { + c += "-"; + c += padStart(Math.trunc(-o.o / 60)); + c += ":"; + c += padStart(Math.trunc(-o.o % 60)); + } else { + c += "+"; + c += padStart(Math.trunc(o.o / 60)); + c += ":"; + c += padStart(Math.trunc(o.o % 60)); + } + } + if (extendedZone) { + c += "[" + o.zone.ianaName + "]"; + } + return c; +} + +// defaults for unspecified units in the supported calendars +var defaultUnitValues = { + month: 1, + day: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }, + defaultWeekUnitValues = { + weekNumber: 1, + weekday: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }, + defaultOrdinalUnitValues = { + ordinal: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }; + +// Units in the supported calendars, sorted by bigness +var orderedUnits = ["year", "month", "day", "hour", "minute", "second", "millisecond"], + orderedWeekUnits = ["weekYear", "weekNumber", "weekday", "hour", "minute", "second", "millisecond"], + orderedOrdinalUnits = ["year", "ordinal", "hour", "minute", "second", "millisecond"]; + +// standardize case and plurality in units +function normalizeUnit(unit) { + var normalized = { + year: "year", + years: "year", + month: "month", + months: "month", + day: "day", + days: "day", + hour: "hour", + hours: "hour", + minute: "minute", + minutes: "minute", + quarter: "quarter", + quarters: "quarter", + second: "second", + seconds: "second", + millisecond: "millisecond", + milliseconds: "millisecond", + weekday: "weekday", + weekdays: "weekday", + weeknumber: "weekNumber", + weeksnumber: "weekNumber", + weeknumbers: "weekNumber", + weekyear: "weekYear", + weekyears: "weekYear", + ordinal: "ordinal" + }[unit.toLowerCase()]; + if (!normalized) throw new InvalidUnitError(unit); + return normalized; +} +function normalizeUnitWithLocalWeeks(unit) { + switch (unit.toLowerCase()) { + case "localweekday": + case "localweekdays": + return "localWeekday"; + case "localweeknumber": + case "localweeknumbers": + return "localWeekNumber"; + case "localweekyear": + case "localweekyears": + return "localWeekYear"; + default: + return normalizeUnit(unit); + } +} + +// cache offsets for zones based on the current timestamp when this function is +// first called. When we are handling a datetime from components like (year, +// month, day, hour) in a time zone, we need a guess about what the timezone +// offset is so that we can convert into a UTC timestamp. One way is to find the +// offset of now in the zone. The actual date may have a different offset (for +// example, if we handle a date in June while we're in December in a zone that +// observes DST), but we can check and adjust that. +// +// When handling many dates, calculating the offset for now every time is +// expensive. It's just a guess, so we can cache the offset to use even if we +// are right on a time change boundary (we'll just correct in the other +// direction). Using a timestamp from first read is a slight optimization for +// handling dates close to the current date, since those dates will usually be +// in the same offset (we could set the timestamp statically, instead). We use a +// single timestamp for all zones to make things a bit more predictable. +// +// This is safe for quickDT (used by local() and utc()) because we don't fill in +// higher-order units from tsNow (as we do in fromObject, this requires that +// offset is calculated from tsNow). +/** + * @param {Zone} zone + * @return {number} + */ +function guessOffsetForZone(zone) { + if (zoneOffsetTs === undefined) { + zoneOffsetTs = Settings.now(); + } + + // Do not cache anything but IANA zones, because it is not safe to do so. + // Guessing an offset which is not present in the zone can cause wrong results from fixOffset + if (zone.type !== "iana") { + return zone.offset(zoneOffsetTs); + } + var zoneName = zone.name; + var offsetGuess = zoneOffsetGuessCache.get(zoneName); + if (offsetGuess === undefined) { + offsetGuess = zone.offset(zoneOffsetTs); + zoneOffsetGuessCache.set(zoneName, offsetGuess); + } + return offsetGuess; +} + +// this is a dumbed down version of fromObject() that runs about 60% faster +// but doesn't do any validation, makes a bunch of assumptions about what units +// are present, and so on. +function quickDT(obj, opts) { + var zone = normalizeZone(opts.zone, Settings.defaultZone); + if (!zone.isValid) { + return DateTime.invalid(unsupportedZone(zone)); + } + var loc = Locale.fromObject(opts); + var ts, o; + + // assume we have the higher-order units + if (!isUndefined(obj.year)) { + for (var _i = 0, _orderedUnits = orderedUnits; _i < _orderedUnits.length; _i++) { + var u = _orderedUnits[_i]; + if (isUndefined(obj[u])) { + obj[u] = defaultUnitValues[u]; + } + } + var invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj); + if (invalid) { + return DateTime.invalid(invalid); + } + var offsetProvis = guessOffsetForZone(zone); + var _objToTS = objToTS(obj, offsetProvis, zone); + ts = _objToTS[0]; + o = _objToTS[1]; + } else { + ts = Settings.now(); + } + return new DateTime({ + ts: ts, + zone: zone, + loc: loc, + o: o + }); +} +function diffRelative(start, end, opts) { + var round = isUndefined(opts.round) ? true : opts.round, + rounding = isUndefined(opts.rounding) ? "trunc" : opts.rounding, + format = function format(c, unit) { + c = roundTo(c, round || opts.calendary ? 0 : 2, opts.calendary ? "round" : rounding); + var formatter = end.loc.clone(opts).relFormatter(opts); + return formatter.format(c, unit); + }, + differ = function differ(unit) { + if (opts.calendary) { + if (!end.hasSame(start, unit)) { + return end.startOf(unit).diff(start.startOf(unit), unit).get(unit); + } else return 0; + } else { + return end.diff(start, unit).get(unit); + } + }; + if (opts.unit) { + return format(differ(opts.unit), opts.unit); + } + for (var _iterator = _createForOfIteratorHelperLoose(opts.units), _step; !(_step = _iterator()).done;) { + var unit = _step.value; + var count = differ(unit); + if (Math.abs(count) >= 1) { + return format(count, unit); + } + } + return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]); +} +function lastOpts(argList) { + var opts = {}, + args; + if (argList.length > 0 && typeof argList[argList.length - 1] === "object") { + opts = argList[argList.length - 1]; + args = Array.from(argList).slice(0, argList.length - 1); + } else { + args = Array.from(argList); + } + return [opts, args]; +} + +/** + * Timestamp to use for cached zone offset guesses (exposed for test) + */ +var zoneOffsetTs; +/** + * Cache for zone offset guesses (exposed for test). + * + * This optimizes quickDT via guessOffsetForZone to avoid repeated calls of + * zone.offset(). + */ +var zoneOffsetGuessCache = new Map(); + +/** + * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them. + * + * A DateTime comprises of: + * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch. + * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone). + * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`. + * + * Here is a brief overview of the most commonly used functionality it provides: + * + * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link DateTime.local}, {@link DateTime.utc}, and (most flexibly) {@link DateTime.fromObject}. To create one from a standard string format, use {@link DateTime.fromISO}, {@link DateTime.fromHTTP}, and {@link DateTime.fromRFC2822}. To create one from a custom string format, use {@link DateTime.fromFormat}. To create one from a native JS date, use {@link DateTime.fromJSDate}. + * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link DateTime#toObject}), use the {@link DateTime#year}, {@link DateTime#month}, + * {@link DateTime#day}, {@link DateTime#hour}, {@link DateTime#minute}, {@link DateTime#second}, {@link DateTime#millisecond} accessors. + * * **Week calendar**: For ISO week calendar attributes, see the {@link DateTime#weekYear}, {@link DateTime#weekNumber}, and {@link DateTime#weekday} accessors. + * * **Configuration** See the {@link DateTime#locale} and {@link DateTime#numberingSystem} accessors. + * * **Transformation**: To transform the DateTime into other DateTimes, use {@link DateTime#set}, {@link DateTime#reconfigure}, {@link DateTime#setZone}, {@link DateTime#setLocale}, {@link DateTime.plus}, {@link DateTime#minus}, {@link DateTime#endOf}, {@link DateTime#startOf}, {@link DateTime#toUTC}, and {@link DateTime#toLocal}. + * * **Output**: To convert the DateTime to other representations, use the {@link DateTime#toRelative}, {@link DateTime#toRelativeCalendar}, {@link DateTime#toJSON}, {@link DateTime#toISO}, {@link DateTime#toHTTP}, {@link DateTime#toObject}, {@link DateTime#toRFC2822}, {@link DateTime#toString}, {@link DateTime#toLocaleString}, {@link DateTime#toFormat}, {@link DateTime#toMillis} and {@link DateTime#toJSDate}. + * + * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation. + */ +var DateTime = /*#__PURE__*/function (_Symbol$for) { + /** + * @access private + */ + function DateTime(config) { + var zone = config.zone || Settings.defaultZone; + var invalid = config.invalid || (Number.isNaN(config.ts) ? new Invalid("invalid input") : null) || (!zone.isValid ? unsupportedZone(zone) : null); + /** + * @access private + */ + this.ts = isUndefined(config.ts) ? Settings.now() : config.ts; + var c = null, + o = null; + if (!invalid) { + var unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone); + if (unchanged) { + var _ref = [config.old.c, config.old.o]; + c = _ref[0]; + o = _ref[1]; + } else { + // If an offset has been passed and we have not been called from + // clone(), we can trust it and avoid the offset calculation. + var ot = isNumber(config.o) && !config.old ? config.o : zone.offset(this.ts); + c = tsToObj(this.ts, ot); + invalid = Number.isNaN(c.year) ? new Invalid("invalid input") : null; + c = invalid ? null : c; + o = invalid ? null : ot; + } + } + + /** + * @access private + */ + this._zone = zone; + /** + * @access private + */ + this.loc = config.loc || Locale.create(); + /** + * @access private + */ + this.invalid = invalid; + /** + * @access private + */ + this.weekData = null; + /** + * @access private + */ + this.localWeekData = null; + /** + * @access private + */ + this.c = c; + /** + * @access private + */ + this.o = o; + /** + * @access private + */ + this.isLuxonDateTime = true; + } + + // CONSTRUCT + + /** + * Create a DateTime for the current instant, in the system's time zone. + * + * Use Settings to override these default values if needed. + * @example DateTime.now().toISO() //~> now in the ISO format + * @return {DateTime} + */ + DateTime.now = function now() { + return new DateTime({}); + } + + /** + * Create a local DateTime + * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used + * @param {number} [month=1] - The month, 1-indexed + * @param {number} [day=1] - The day of the month, 1-indexed + * @param {number} [hour=0] - The hour of the day, in 24-hour time + * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59 + * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59 + * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999 + * @example DateTime.local() //~> now + * @example DateTime.local({ zone: "America/New_York" }) //~> now, in US east coast time + * @example DateTime.local(2017) //~> 2017-01-01T00:00:00 + * @example DateTime.local(2017, 3) //~> 2017-03-01T00:00:00 + * @example DateTime.local(2017, 3, 12, { locale: "fr" }) //~> 2017-03-12T00:00:00, with a French locale + * @example DateTime.local(2017, 3, 12, 5) //~> 2017-03-12T05:00:00 + * @example DateTime.local(2017, 3, 12, 5, { zone: "utc" }) //~> 2017-03-12T05:00:00, in UTC + * @example DateTime.local(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00 + * @example DateTime.local(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10 + * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765 + * @return {DateTime} + */; + DateTime.local = function local() { + var _lastOpts = lastOpts(arguments), + opts = _lastOpts[0], + args = _lastOpts[1], + year = args[0], + month = args[1], + day = args[2], + hour = args[3], + minute = args[4], + second = args[5], + millisecond = args[6]; + return quickDT({ + year: year, + month: month, + day: day, + hour: hour, + minute: minute, + second: second, + millisecond: millisecond + }, opts); + } + + /** + * Create a DateTime in UTC + * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used + * @param {number} [month=1] - The month, 1-indexed + * @param {number} [day=1] - The day of the month + * @param {number} [hour=0] - The hour of the day, in 24-hour time + * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59 + * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59 + * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999 + * @param {Object} options - configuration options for the DateTime + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} [options.outputCalendar] - the output calendar to set on the resulting DateTime instance + * @param {string} [options.numberingSystem] - the numbering system to set on the resulting DateTime instance + * @param {string} [options.weekSettings] - the week settings to set on the resulting DateTime instance + * @example DateTime.utc() //~> now + * @example DateTime.utc(2017) //~> 2017-01-01T00:00:00Z + * @example DateTime.utc(2017, 3) //~> 2017-03-01T00:00:00Z + * @example DateTime.utc(2017, 3, 12) //~> 2017-03-12T00:00:00Z + * @example DateTime.utc(2017, 3, 12, 5) //~> 2017-03-12T05:00:00Z + * @example DateTime.utc(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00Z + * @example DateTime.utc(2017, 3, 12, 5, 45, { locale: "fr" }) //~> 2017-03-12T05:45:00Z with a French locale + * @example DateTime.utc(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10Z + * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765, { locale: "fr" }) //~> 2017-03-12T05:45:10.765Z with a French locale + * @return {DateTime} + */; + DateTime.utc = function utc() { + var _lastOpts2 = lastOpts(arguments), + opts = _lastOpts2[0], + args = _lastOpts2[1], + year = args[0], + month = args[1], + day = args[2], + hour = args[3], + minute = args[4], + second = args[5], + millisecond = args[6]; + opts.zone = FixedOffsetZone.utcInstance; + return quickDT({ + year: year, + month: month, + day: day, + hour: hour, + minute: minute, + second: second, + millisecond: millisecond + }, opts); + } + + /** + * Create a DateTime from a JavaScript Date object. Uses the default zone. + * @param {Date} date - a JavaScript Date object + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @return {DateTime} + */; + DateTime.fromJSDate = function fromJSDate(date, options) { + if (options === void 0) { + options = {}; + } + var ts = isDate(date) ? date.valueOf() : NaN; + if (Number.isNaN(ts)) { + return DateTime.invalid("invalid input"); + } + var zoneToUse = normalizeZone(options.zone, Settings.defaultZone); + if (!zoneToUse.isValid) { + return DateTime.invalid(unsupportedZone(zoneToUse)); + } + return new DateTime({ + ts: ts, + zone: zoneToUse, + loc: Locale.fromObject(options) + }); + } + + /** + * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone. + * @param {number} milliseconds - a number of milliseconds since 1970 UTC + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance + * @return {DateTime} + */; + DateTime.fromMillis = function fromMillis(milliseconds, options) { + if (options === void 0) { + options = {}; + } + if (!isNumber(milliseconds)) { + throw new InvalidArgumentError("fromMillis requires a numerical input, but received a " + typeof milliseconds + " with value " + milliseconds); + } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) { + // this isn't perfect because we can still end up out of range because of additional shifting, but it's a start + return DateTime.invalid("Timestamp out of range"); + } else { + return new DateTime({ + ts: milliseconds, + zone: normalizeZone(options.zone, Settings.defaultZone), + loc: Locale.fromObject(options) + }); + } + } + + /** + * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone. + * @param {number} seconds - a number of seconds since 1970 UTC + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance + * @return {DateTime} + */; + DateTime.fromSeconds = function fromSeconds(seconds, options) { + if (options === void 0) { + options = {}; + } + if (!isNumber(seconds)) { + throw new InvalidArgumentError("fromSeconds requires a numerical input"); + } else { + return new DateTime({ + ts: seconds * 1000, + zone: normalizeZone(options.zone, Settings.defaultZone), + loc: Locale.fromObject(options) + }); + } + } + + /** + * Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults. + * @param {Object} obj - the object to create the DateTime from + * @param {number} obj.year - a year, such as 1987 + * @param {number} obj.month - a month, 1-12 + * @param {number} obj.day - a day of the month, 1-31, depending on the month + * @param {number} obj.ordinal - day of the year, 1-365 or 366 + * @param {number} obj.weekYear - an ISO week year + * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year + * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday + * @param {number} obj.localWeekYear - a week year, according to the locale + * @param {number} obj.localWeekNumber - a week number, between 1 and 52 or 53, depending on the year, according to the locale + * @param {number} obj.localWeekday - a weekday, 1-7, where 1 is the first and 7 is the last day of the week, according to the locale + * @param {number} obj.hour - hour of the day, 0-23 + * @param {number} obj.minute - minute of the hour, 0-59 + * @param {number} obj.second - second of the minute, 0-59 + * @param {number} obj.millisecond - millisecond of the second, 0-999 + * @param {Object} opts - options for creating this DateTime + * @param {string|Zone} [opts.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone() + * @param {string} [opts.locale='system\'s locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25' + * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01' + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06 + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'utc' }), + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'local' }) + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'America/New_York' }) + * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13' + * @example DateTime.fromObject({ localWeekYear: 2022, localWeekNumber: 1, localWeekday: 1 }, { locale: "en-US" }).toISODate() //=> '2021-12-26' + * @return {DateTime} + */; + DateTime.fromObject = function fromObject(obj, opts) { + if (opts === void 0) { + opts = {}; + } + obj = obj || {}; + var zoneToUse = normalizeZone(opts.zone, Settings.defaultZone); + if (!zoneToUse.isValid) { + return DateTime.invalid(unsupportedZone(zoneToUse)); + } + var loc = Locale.fromObject(opts); + var normalized = normalizeObject(obj, normalizeUnitWithLocalWeeks); + var _usesLocalWeekValues = usesLocalWeekValues(normalized, loc), + minDaysInFirstWeek = _usesLocalWeekValues.minDaysInFirstWeek, + startOfWeek = _usesLocalWeekValues.startOfWeek; + var tsNow = Settings.now(), + offsetProvis = !isUndefined(opts.specificOffset) ? opts.specificOffset : zoneToUse.offset(tsNow), + containsOrdinal = !isUndefined(normalized.ordinal), + containsGregorYear = !isUndefined(normalized.year), + containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), + containsGregor = containsGregorYear || containsGregorMD, + definiteWeekDef = normalized.weekYear || normalized.weekNumber; + + // cases: + // just a weekday -> this week's instance of that weekday, no worries + // (gregorian data or ordinal) + (weekYear or weekNumber) -> error + // (gregorian month or day) + ordinal -> error + // otherwise just use weeks or ordinals or gregorian, depending on what's specified + + if ((containsGregor || containsOrdinal) && definiteWeekDef) { + throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals"); + } + if (containsGregorMD && containsOrdinal) { + throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); + } + var useWeekData = definiteWeekDef || normalized.weekday && !containsGregor; + + // configure ourselves to deal with gregorian dates or week stuff + var units, + defaultValues, + objNow = tsToObj(tsNow, offsetProvis); + if (useWeekData) { + units = orderedWeekUnits; + defaultValues = defaultWeekUnitValues; + objNow = gregorianToWeek(objNow, minDaysInFirstWeek, startOfWeek); + } else if (containsOrdinal) { + units = orderedOrdinalUnits; + defaultValues = defaultOrdinalUnitValues; + objNow = gregorianToOrdinal(objNow); + } else { + units = orderedUnits; + defaultValues = defaultUnitValues; + } + + // set default values for missing stuff + var foundFirst = false; + for (var _iterator2 = _createForOfIteratorHelperLoose(units), _step2; !(_step2 = _iterator2()).done;) { + var u = _step2.value; + var v = normalized[u]; + if (!isUndefined(v)) { + foundFirst = true; + } else if (foundFirst) { + normalized[u] = defaultValues[u]; + } else { + normalized[u] = objNow[u]; + } + } + + // make sure the values we have are in range + var higherOrderInvalid = useWeekData ? hasInvalidWeekData(normalized, minDaysInFirstWeek, startOfWeek) : containsOrdinal ? hasInvalidOrdinalData(normalized) : hasInvalidGregorianData(normalized), + invalid = higherOrderInvalid || hasInvalidTimeData(normalized); + if (invalid) { + return DateTime.invalid(invalid); + } + + // compute the actual time + var gregorian = useWeekData ? weekToGregorian(normalized, minDaysInFirstWeek, startOfWeek) : containsOrdinal ? ordinalToGregorian(normalized) : normalized, + _objToTS2 = objToTS(gregorian, offsetProvis, zoneToUse), + tsFinal = _objToTS2[0], + offsetFinal = _objToTS2[1], + inst = new DateTime({ + ts: tsFinal, + zone: zoneToUse, + o: offsetFinal, + loc: loc + }); + + // gregorian data + weekday serves only to validate + if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) { + return DateTime.invalid("mismatched weekday", "you can't specify both a weekday of " + normalized.weekday + " and a date of " + inst.toISO()); + } + if (!inst.isValid) { + return DateTime.invalid(inst.invalid); + } + return inst; + } + + /** + * Create a DateTime from an ISO 8601 string + * @param {string} text - the ISO string + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance + * @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance + * @param {string} [opts.weekSettings] - the week settings to set on the resulting DateTime instance + * @example DateTime.fromISO('2016-05-25T09:08:34.123') + * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00') + * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true}) + * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'}) + * @example DateTime.fromISO('2016-W05-4') + * @return {DateTime} + */; + DateTime.fromISO = function fromISO(text, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseISODate = parseISODate(text), + vals = _parseISODate[0], + parsedZone = _parseISODate[1]; + return parseDataToDateTime(vals, parsedZone, opts, "ISO 8601", text); + } + + /** + * Create a DateTime from an RFC 2822 string + * @param {string} text - the RFC 2822 string + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in. + * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT') + * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600') + * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z') + * @return {DateTime} + */; + DateTime.fromRFC2822 = function fromRFC2822(text, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseRFC2822Date = parseRFC2822Date(text), + vals = _parseRFC2822Date[0], + parsedZone = _parseRFC2822Date[1]; + return parseDataToDateTime(vals, parsedZone, opts, "RFC 2822", text); + } + + /** + * Create a DateTime from an HTTP header date + * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 + * @param {string} text - the HTTP header date + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in. + * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods. + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT') + * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT') + * @example DateTime.fromHTTP('Sun Nov 6 08:49:37 1994') + * @return {DateTime} + */; + DateTime.fromHTTP = function fromHTTP(text, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseHTTPDate = parseHTTPDate(text), + vals = _parseHTTPDate[0], + parsedZone = _parseHTTPDate[1]; + return parseDataToDateTime(vals, parsedZone, opts, "HTTP", opts); + } + + /** + * Create a DateTime from an input string and format string. + * Defaults to en-US if no locale has been specified, regardless of the system's locale. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/parsing?id=table-of-tokens). + * @param {string} text - the string to parse + * @param {string} fmt - the format the string is expected to be in (see the link below for the formats) + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale + * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @return {DateTime} + */; + DateTime.fromFormat = function fromFormat(text, fmt, opts) { + if (opts === void 0) { + opts = {}; + } + if (isUndefined(text) || isUndefined(fmt)) { + throw new InvalidArgumentError("fromFormat requires an input string and a format"); + } + var _opts = opts, + _opts$locale = _opts.locale, + locale = _opts$locale === void 0 ? null : _opts$locale, + _opts$numberingSystem = _opts.numberingSystem, + numberingSystem = _opts$numberingSystem === void 0 ? null : _opts$numberingSystem, + localeToUse = Locale.fromOpts({ + locale: locale, + numberingSystem: numberingSystem, + defaultToEN: true + }), + _parseFromTokens = parseFromTokens(localeToUse, text, fmt), + vals = _parseFromTokens[0], + parsedZone = _parseFromTokens[1], + specificOffset = _parseFromTokens[2], + invalid = _parseFromTokens[3]; + if (invalid) { + return DateTime.invalid(invalid); + } else { + return parseDataToDateTime(vals, parsedZone, opts, "format " + fmt, text, specificOffset); + } + } + + /** + * @deprecated use fromFormat instead + */; + DateTime.fromString = function fromString(text, fmt, opts) { + if (opts === void 0) { + opts = {}; + } + return DateTime.fromFormat(text, fmt, opts); + } + + /** + * Create a DateTime from a SQL date, time, or datetime + * Defaults to en-US if no locale has been specified, regardless of the system's locale + * @param {string} text - the string to parse + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale + * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @example DateTime.fromSQL('2017-05-15') + * @example DateTime.fromSQL('2017-05-15 09:12:34') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true }) + * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' }) + * @example DateTime.fromSQL('09:12:34.342') + * @return {DateTime} + */; + DateTime.fromSQL = function fromSQL(text, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseSQL = parseSQL(text), + vals = _parseSQL[0], + parsedZone = _parseSQL[1]; + return parseDataToDateTime(vals, parsedZone, opts, "SQL", text); + } + + /** + * Create an invalid DateTime. + * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent. + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {DateTime} + */; + DateTime.invalid = function invalid(reason, explanation) { + if (explanation === void 0) { + explanation = null; + } + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the DateTime is invalid"); + } + var invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidDateTimeError(invalid); + } else { + return new DateTime({ + invalid: invalid + }); + } + } + + /** + * Check if an object is an instance of DateTime. Works across context boundaries + * @param {object} o + * @return {boolean} + */; + DateTime.isDateTime = function isDateTime(o) { + return o && o.isLuxonDateTime || false; + } + + /** + * Produce the format string for a set of options + * @param formatOpts + * @param localeOpts + * @returns {string} + */; + DateTime.parseFormatForOpts = function parseFormatForOpts(formatOpts, localeOpts) { + if (localeOpts === void 0) { + localeOpts = {}; + } + var tokenList = formatOptsToTokens(formatOpts, Locale.fromObject(localeOpts)); + return !tokenList ? null : tokenList.map(function (t) { + return t ? t.val : null; + }).join(""); + } + + /** + * Produce the the fully expanded format token for the locale + * Does NOT quote characters, so quoted tokens will not round trip correctly + * @param fmt + * @param localeOpts + * @returns {string} + */; + DateTime.expandFormat = function expandFormat(fmt, localeOpts) { + if (localeOpts === void 0) { + localeOpts = {}; + } + var expanded = expandMacroTokens(Formatter.parseFormat(fmt), Locale.fromObject(localeOpts)); + return expanded.map(function (t) { + return t.val; + }).join(""); + }; + DateTime.resetCache = function resetCache() { + zoneOffsetTs = undefined; + zoneOffsetGuessCache.clear(); + } + + // INFO + + /** + * Get the value of unit. + * @param {string} unit - a unit such as 'minute' or 'day' + * @example DateTime.local(2017, 7, 4).get('month'); //=> 7 + * @example DateTime.local(2017, 7, 4).get('day'); //=> 4 + * @return {number} + */; + var _proto = DateTime.prototype; + _proto.get = function get(unit) { + return this[unit]; + } + + /** + * Returns whether the DateTime is valid. Invalid DateTimes occur when: + * * The DateTime was created from invalid calendar information, such as the 13th month or February 30 + * * The DateTime was created by an operation on another invalid date + * @type {boolean} + */; + /** + * Get those DateTimes which have the same local time as this DateTime, but a different offset from UTC + * in this DateTime's zone. During DST changes local time can be ambiguous, for example + * `2023-10-29T02:30:00` in `Europe/Berlin` can have offset `+01:00` or `+02:00`. + * This method will return both possible DateTimes if this DateTime's local time is ambiguous. + * @returns {DateTime[]} + */ + _proto.getPossibleOffsets = function getPossibleOffsets() { + if (!this.isValid || this.isOffsetFixed) { + return [this]; + } + var dayMs = 86400000; + var minuteMs = 60000; + var localTS = objToLocalTS(this.c); + var oEarlier = this.zone.offset(localTS - dayMs); + var oLater = this.zone.offset(localTS + dayMs); + var o1 = this.zone.offset(localTS - oEarlier * minuteMs); + var o2 = this.zone.offset(localTS - oLater * minuteMs); + if (o1 === o2) { + return [this]; + } + var ts1 = localTS - o1 * minuteMs; + var ts2 = localTS - o2 * minuteMs; + var c1 = tsToObj(ts1, o1); + var c2 = tsToObj(ts2, o2); + if (c1.hour === c2.hour && c1.minute === c2.minute && c1.second === c2.second && c1.millisecond === c2.millisecond) { + return [clone(this, { + ts: ts1 + }), clone(this, { + ts: ts2 + })]; + } + return [this]; + } + + /** + * Returns true if this DateTime is in a leap year, false otherwise + * @example DateTime.local(2016).isInLeapYear //=> true + * @example DateTime.local(2013).isInLeapYear //=> false + * @type {boolean} + */; + /** + * Returns the resolved Intl options for this DateTime. + * This is useful in understanding the behavior of formatting methods + * @param {Object} opts - the same options as toLocaleString + * @return {Object} + */ + _proto.resolvedLocaleOptions = function resolvedLocaleOptions(opts) { + if (opts === void 0) { + opts = {}; + } + var _Formatter$create$res = Formatter.create(this.loc.clone(opts), opts).resolvedOptions(this), + locale = _Formatter$create$res.locale, + numberingSystem = _Formatter$create$res.numberingSystem, + calendar = _Formatter$create$res.calendar; + return { + locale: locale, + numberingSystem: numberingSystem, + outputCalendar: calendar + }; + } + + // TRANSFORM + + /** + * "Set" the DateTime's zone to UTC. Returns a newly-constructed DateTime. + * + * Equivalent to {@link DateTime#setZone}('utc') + * @param {number} [offset=0] - optionally, an offset from UTC in minutes + * @param {Object} [opts={}] - options to pass to `setZone()` + * @return {DateTime} + */; + _proto.toUTC = function toUTC(offset, opts) { + if (offset === void 0) { + offset = 0; + } + if (opts === void 0) { + opts = {}; + } + return this.setZone(FixedOffsetZone.instance(offset), opts); + } + + /** + * "Set" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime. + * + * Equivalent to `setZone('local')` + * @return {DateTime} + */; + _proto.toLocal = function toLocal() { + return this.setZone(Settings.defaultZone); + } + + /** + * "Set" the DateTime's zone to specified zone. Returns a newly-constructed DateTime. + * + * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link DateTime#plus}. You may wish to use {@link DateTime#toLocal} and {@link DateTime#toUTC} which provide simple convenience wrappers for commonly used zones. + * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link DateTime#Zone} class. + * @param {Object} opts - options + * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this. + * @return {DateTime} + */; + _proto.setZone = function setZone(zone, _temp) { + var _ref2 = _temp === void 0 ? {} : _temp, + _ref2$keepLocalTime = _ref2.keepLocalTime, + keepLocalTime = _ref2$keepLocalTime === void 0 ? false : _ref2$keepLocalTime, + _ref2$keepCalendarTim = _ref2.keepCalendarTime, + keepCalendarTime = _ref2$keepCalendarTim === void 0 ? false : _ref2$keepCalendarTim; + zone = normalizeZone(zone, Settings.defaultZone); + if (zone.equals(this.zone)) { + return this; + } else if (!zone.isValid) { + return DateTime.invalid(unsupportedZone(zone)); + } else { + var newTS = this.ts; + if (keepLocalTime || keepCalendarTime) { + var offsetGuess = zone.offset(this.ts); + var asObj = this.toObject(); + var _objToTS3 = objToTS(asObj, offsetGuess, zone); + newTS = _objToTS3[0]; + } + return clone(this, { + ts: newTS, + zone: zone + }); + } + } + + /** + * "Set" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime. + * @param {Object} properties - the properties to set + * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' }) + * @return {DateTime} + */; + _proto.reconfigure = function reconfigure(_temp2) { + var _ref3 = _temp2 === void 0 ? {} : _temp2, + locale = _ref3.locale, + numberingSystem = _ref3.numberingSystem, + outputCalendar = _ref3.outputCalendar; + var loc = this.loc.clone({ + locale: locale, + numberingSystem: numberingSystem, + outputCalendar: outputCalendar + }); + return clone(this, { + loc: loc + }); + } + + /** + * "Set" the locale. Returns a newly-constructed DateTime. + * Just a convenient alias for reconfigure({ locale }) + * @example DateTime.local(2017, 5, 25).setLocale('en-GB') + * @return {DateTime} + */; + _proto.setLocale = function setLocale(locale) { + return this.reconfigure({ + locale: locale + }); + } + + /** + * "Set" the values of specified units. Returns a newly-constructed DateTime. + * You can only set units with this method; for "setting" metadata, see {@link DateTime#reconfigure} and {@link DateTime#setZone}. + * + * This method also supports setting locale-based week units, i.e. `localWeekday`, `localWeekNumber` and `localWeekYear`. + * They cannot be mixed with ISO-week units like `weekday`. + * @param {Object} values - a mapping of units to numbers + * @example dt.set({ year: 2017 }) + * @example dt.set({ hour: 8, minute: 30 }) + * @example dt.set({ weekday: 5 }) + * @example dt.set({ year: 2005, ordinal: 234 }) + * @return {DateTime} + */; + _proto.set = function set(values) { + if (!this.isValid) return this; + var normalized = normalizeObject(values, normalizeUnitWithLocalWeeks); + var _usesLocalWeekValues2 = usesLocalWeekValues(normalized, this.loc), + minDaysInFirstWeek = _usesLocalWeekValues2.minDaysInFirstWeek, + startOfWeek = _usesLocalWeekValues2.startOfWeek; + var settingWeekStuff = !isUndefined(normalized.weekYear) || !isUndefined(normalized.weekNumber) || !isUndefined(normalized.weekday), + containsOrdinal = !isUndefined(normalized.ordinal), + containsGregorYear = !isUndefined(normalized.year), + containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), + containsGregor = containsGregorYear || containsGregorMD, + definiteWeekDef = normalized.weekYear || normalized.weekNumber; + if ((containsGregor || containsOrdinal) && definiteWeekDef) { + throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals"); + } + if (containsGregorMD && containsOrdinal) { + throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); + } + var mixed; + if (settingWeekStuff) { + mixed = weekToGregorian(_extends({}, gregorianToWeek(this.c, minDaysInFirstWeek, startOfWeek), normalized), minDaysInFirstWeek, startOfWeek); + } else if (!isUndefined(normalized.ordinal)) { + mixed = ordinalToGregorian(_extends({}, gregorianToOrdinal(this.c), normalized)); + } else { + mixed = _extends({}, this.toObject(), normalized); + + // if we didn't set the day but we ended up on an overflow date, + // use the last day of the right month + if (isUndefined(normalized.day)) { + mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day); + } + } + var _objToTS4 = objToTS(mixed, this.o, this.zone), + ts = _objToTS4[0], + o = _objToTS4[1]; + return clone(this, { + ts: ts, + o: o + }); + } + + /** + * Add a period of time to this DateTime and return the resulting DateTime + * + * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between. + * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @example DateTime.now().plus(123) //~> in 123 milliseconds + * @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes + * @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow + * @example DateTime.now().plus({ days: -1 }) //~> this time yesterday + * @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min + * @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min + * @return {DateTime} + */; + _proto.plus = function plus(duration) { + if (!this.isValid) return this; + var dur = Duration.fromDurationLike(duration); + return clone(this, adjustTime(this, dur)); + } + + /** + * Subtract a period of time to this DateTime and return the resulting DateTime + * See {@link DateTime#plus} + * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + @return {DateTime} + */; + _proto.minus = function minus(duration) { + if (!this.isValid) return this; + var dur = Duration.fromDurationLike(duration).negate(); + return clone(this, adjustTime(this, dur)); + } + + /** + * "Set" this DateTime to the beginning of a unit of time. + * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week + * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01' + * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01' + * @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays + * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00' + * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00' + * @return {DateTime} + */; + _proto.startOf = function startOf(unit, _temp3) { + var _ref4 = _temp3 === void 0 ? {} : _temp3, + _ref4$useLocaleWeeks = _ref4.useLocaleWeeks, + useLocaleWeeks = _ref4$useLocaleWeeks === void 0 ? false : _ref4$useLocaleWeeks; + if (!this.isValid) return this; + var o = {}, + normalizedUnit = Duration.normalizeUnit(unit); + switch (normalizedUnit) { + case "years": + o.month = 1; + // falls through + case "quarters": + case "months": + o.day = 1; + // falls through + case "weeks": + case "days": + o.hour = 0; + // falls through + case "hours": + o.minute = 0; + // falls through + case "minutes": + o.second = 0; + // falls through + case "seconds": + o.millisecond = 0; + break; + // no default, invalid units throw in normalizeUnit() + } + + if (normalizedUnit === "weeks") { + if (useLocaleWeeks) { + var startOfWeek = this.loc.getStartOfWeek(); + var weekday = this.weekday; + if (weekday < startOfWeek) { + o.weekNumber = this.weekNumber - 1; + } + o.weekday = startOfWeek; + } else { + o.weekday = 1; + } + } + if (normalizedUnit === "quarters") { + var q = Math.ceil(this.month / 3); + o.month = (q - 1) * 3 + 1; + } + return this.set(o); + } + + /** + * "Set" this DateTime to the end (meaning the last millisecond) of a unit of time + * @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week + * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays + * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00' + * @return {DateTime} + */; + _proto.endOf = function endOf(unit, opts) { + var _this$plus; + return this.isValid ? this.plus((_this$plus = {}, _this$plus[unit] = 1, _this$plus)).startOf(unit, opts).minus(1) : this; + } + + // OUTPUT + + /** + * Returns a string representation of this DateTime formatted according to the specified format string. + * **You may not want this.** See {@link DateTime#toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/formatting?id=table-of-tokens). + * Defaults to en-US if no locale has been specified, regardless of the system's locale. + * @param {string} fmt - the format string + * @param {Object} opts - opts to override the configuration options on this DateTime + * @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22' + * @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22' + * @example DateTime.now().toFormat('yyyy LLL dd', { locale: "fr" }) //=> '2017 avr. 22' + * @example DateTime.now().toFormat("HH 'hours and' mm 'minutes'") //=> '20 hours and 55 minutes' + * @return {string} + */; + _proto.toFormat = function toFormat(fmt, opts) { + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt) : INVALID; + } + + /** + * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`. + * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation + * of the DateTime in the assigned locale. + * Defaults to the system's locale if no locale has been specified + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param formatOpts {Object} - Intl.DateTimeFormat constructor options and configuration options + * @param {Object} opts - opts to override the configuration options on this DateTime + * @example DateTime.now().toLocaleString(); //=> 4/20/2017 + * @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017' + * @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017' + * @example DateTime.now().toLocaleString(DateTime.DATE_FULL, { locale: 'fr' }); //=> '28 août 2022' + * @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM' + * @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM' + * @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20' + * @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM' + * @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }); //=> '11:32' + * @return {string} + */; + _proto.toLocaleString = function toLocaleString(formatOpts, opts) { + if (formatOpts === void 0) { + formatOpts = DATE_SHORT; + } + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this) : INVALID; + } + + /** + * Returns an array of format "parts", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output. + * Defaults to the system's locale if no locale has been specified + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts + * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`. + * @example DateTime.now().toLocaleParts(); //=> [ + * //=> { type: 'day', value: '25' }, + * //=> { type: 'literal', value: '/' }, + * //=> { type: 'month', value: '05' }, + * //=> { type: 'literal', value: '/' }, + * //=> { type: 'year', value: '1982' } + * //=> ] + */; + _proto.toLocaleParts = function toLocaleParts(opts) { + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this) : []; + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.extendedZone=false] - add the time zone format extension + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'years', 'months', 'days', 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0. + * @example DateTime.utc(1983, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z' + * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00' + * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335' + * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400' + * @example DateTime.now().toISO({ precision: 'day' }) //=> '2017-04-22Z' + * @example DateTime.now().toISO({ precision: 'minute' }) //=> '2017-04-22T20:47Z' + * @return {string|null} + */; + _proto.toISO = function toISO(_temp4) { + var _ref5 = _temp4 === void 0 ? {} : _temp4, + _ref5$format = _ref5.format, + format = _ref5$format === void 0 ? "extended" : _ref5$format, + _ref5$suppressSeconds = _ref5.suppressSeconds, + suppressSeconds = _ref5$suppressSeconds === void 0 ? false : _ref5$suppressSeconds, + _ref5$suppressMillise = _ref5.suppressMilliseconds, + suppressMilliseconds = _ref5$suppressMillise === void 0 ? false : _ref5$suppressMillise, + _ref5$includeOffset = _ref5.includeOffset, + includeOffset = _ref5$includeOffset === void 0 ? true : _ref5$includeOffset, + _ref5$extendedZone = _ref5.extendedZone, + extendedZone = _ref5$extendedZone === void 0 ? false : _ref5$extendedZone, + _ref5$precision = _ref5.precision, + precision = _ref5$precision === void 0 ? "milliseconds" : _ref5$precision; + if (!this.isValid) { + return null; + } + precision = normalizeUnit(precision); + var ext = format === "extended"; + var c = _toISODate(this, ext, precision); + if (orderedUnits.indexOf(precision) >= 3) c += "T"; + c += _toISOTime(this, ext, suppressSeconds, suppressMilliseconds, includeOffset, extendedZone, precision); + return c; + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's date component + * @param {Object} opts - options + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='day'] - truncate output to desired precision: 'years', 'months', or 'days'. + * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25' + * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525' + * @example DateTime.utc(1982, 5, 25).toISODate({ precision: 'month' }) //=> '1982-05' + * @return {string|null} + */; + _proto.toISODate = function toISODate(_temp5) { + var _ref6 = _temp5 === void 0 ? {} : _temp5, + _ref6$format = _ref6.format, + format = _ref6$format === void 0 ? "extended" : _ref6$format, + _ref6$precision = _ref6.precision, + precision = _ref6$precision === void 0 ? "day" : _ref6$precision; + if (!this.isValid) { + return null; + } + return _toISODate(this, format === "extended", normalizeUnit(precision)); + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's week date + * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2' + * @return {string} + */; + _proto.toISOWeekDate = function toISOWeekDate() { + return toTechFormat(this, "kkkk-'W'WW-c"); + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's time component + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.extendedZone=true] - add the time zone format extension + * @param {boolean} [opts.includePrefix=false] - include the `T` prefix + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0. + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z' + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34, second: 56 }).toISOTime({ precision: 'minute' }) //=> '07:34Z' + * @return {string} + */; + _proto.toISOTime = function toISOTime(_temp6) { + var _ref7 = _temp6 === void 0 ? {} : _temp6, + _ref7$suppressMillise = _ref7.suppressMilliseconds, + suppressMilliseconds = _ref7$suppressMillise === void 0 ? false : _ref7$suppressMillise, + _ref7$suppressSeconds = _ref7.suppressSeconds, + suppressSeconds = _ref7$suppressSeconds === void 0 ? false : _ref7$suppressSeconds, + _ref7$includeOffset = _ref7.includeOffset, + includeOffset = _ref7$includeOffset === void 0 ? true : _ref7$includeOffset, + _ref7$includePrefix = _ref7.includePrefix, + includePrefix = _ref7$includePrefix === void 0 ? false : _ref7$includePrefix, + _ref7$extendedZone = _ref7.extendedZone, + extendedZone = _ref7$extendedZone === void 0 ? false : _ref7$extendedZone, + _ref7$format = _ref7.format, + format = _ref7$format === void 0 ? "extended" : _ref7$format, + _ref7$precision = _ref7.precision, + precision = _ref7$precision === void 0 ? "milliseconds" : _ref7$precision; + if (!this.isValid) { + return null; + } + precision = normalizeUnit(precision); + var c = includePrefix && orderedUnits.indexOf(precision) >= 3 ? "T" : ""; + return c + _toISOTime(this, format === "extended", suppressSeconds, suppressMilliseconds, includeOffset, extendedZone, precision); + } + + /** + * Returns an RFC 2822-compatible string representation of this DateTime + * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000' + * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400' + * @return {string} + */; + _proto.toRFC2822 = function toRFC2822() { + return toTechFormat(this, "EEE, dd LLL yyyy HH:mm:ss ZZZ", false); + } + + /** + * Returns a string representation of this DateTime appropriate for use in HTTP headers. The output is always expressed in GMT. + * Specifically, the string conforms to RFC 1123. + * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 + * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT' + * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT' + * @return {string} + */; + _proto.toHTTP = function toHTTP() { + return toTechFormat(this.toUTC(), "EEE, dd LLL yyyy HH:mm:ss 'GMT'"); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL Date + * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13' + * @return {string|null} + */; + _proto.toSQLDate = function toSQLDate() { + if (!this.isValid) { + return null; + } + return _toISODate(this, true); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL Time + * @param {Object} opts - options + * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset. + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00' + * @example DateTime.utc().toSQL() //=> '05:15:16.345' + * @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00' + * @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345' + * @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York' + * @return {string} + */; + _proto.toSQLTime = function toSQLTime(_temp7) { + var _ref8 = _temp7 === void 0 ? {} : _temp7, + _ref8$includeOffset = _ref8.includeOffset, + includeOffset = _ref8$includeOffset === void 0 ? true : _ref8$includeOffset, + _ref8$includeZone = _ref8.includeZone, + includeZone = _ref8$includeZone === void 0 ? false : _ref8$includeZone, + _ref8$includeOffsetSp = _ref8.includeOffsetSpace, + includeOffsetSpace = _ref8$includeOffsetSp === void 0 ? true : _ref8$includeOffsetSp; + var fmt = "HH:mm:ss.SSS"; + if (includeZone || includeOffset) { + if (includeOffsetSpace) { + fmt += " "; + } + if (includeZone) { + fmt += "z"; + } else if (includeOffset) { + fmt += "ZZ"; + } + } + return toTechFormat(this, fmt, true); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL DateTime + * @param {Object} opts - options + * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset. + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00' + * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z' + * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00' + * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000' + * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York' + * @return {string} + */; + _proto.toSQL = function toSQL(opts) { + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) { + return null; + } + return this.toSQLDate() + " " + this.toSQLTime(opts); + } + + /** + * Returns a string representation of this DateTime appropriate for debugging + * @return {string} + */; + _proto.toString = function toString() { + return this.isValid ? this.toISO() : INVALID; + } + + /** + * Returns a string representation of this DateTime appropriate for the REPL. + * @return {string} + */; + _proto[_Symbol$for] = function () { + if (this.isValid) { + return "DateTime { ts: " + this.toISO() + ", zone: " + this.zone.name + ", locale: " + this.locale + " }"; + } else { + return "DateTime { Invalid, reason: " + this.invalidReason + " }"; + } + } + + /** + * Returns the epoch milliseconds of this DateTime. Alias of {@link DateTime#toMillis} + * @return {number} + */; + _proto.valueOf = function valueOf() { + return this.toMillis(); + } + + /** + * Returns the epoch milliseconds of this DateTime. + * @return {number} + */; + _proto.toMillis = function toMillis() { + return this.isValid ? this.ts : NaN; + } + + /** + * Returns the epoch seconds (including milliseconds in the fractional part) of this DateTime. + * @return {number} + */; + _proto.toSeconds = function toSeconds() { + return this.isValid ? this.ts / 1000 : NaN; + } + + /** + * Returns the epoch seconds (as a whole number) of this DateTime. + * @return {number} + */; + _proto.toUnixInteger = function toUnixInteger() { + return this.isValid ? Math.floor(this.ts / 1000) : NaN; + } + + /** + * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON. + * @return {string} + */; + _proto.toJSON = function toJSON() { + return this.toISO(); + } + + /** + * Returns a BSON serializable equivalent to this DateTime. + * @return {Date} + */; + _proto.toBSON = function toBSON() { + return this.toJSDate(); + } + + /** + * Returns a JavaScript object with this DateTime's year, month, day, and so on. + * @param opts - options for generating the object + * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output + * @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 } + * @return {Object} + */; + _proto.toObject = function toObject(opts) { + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) return {}; + var base = _extends({}, this.c); + if (opts.includeConfig) { + base.outputCalendar = this.outputCalendar; + base.numberingSystem = this.loc.numberingSystem; + base.locale = this.loc.locale; + } + return base; + } + + /** + * Returns a JavaScript Date equivalent to this DateTime. + * @return {Date} + */; + _proto.toJSDate = function toJSDate() { + return new Date(this.isValid ? this.ts : NaN); + } + + // COMPARE + + /** + * Return the difference between two DateTimes as a Duration. + * @param {DateTime} otherDateTime - the DateTime to compare this one to + * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration. + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @example + * var i1 = DateTime.fromISO('1982-05-25T09:45'), + * i2 = DateTime.fromISO('1983-10-14T10:30'); + * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 } + * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 } + * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 } + * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 } + * @return {Duration} + */; + _proto.diff = function diff(otherDateTime, unit, opts) { + if (unit === void 0) { + unit = "milliseconds"; + } + if (opts === void 0) { + opts = {}; + } + if (!this.isValid || !otherDateTime.isValid) { + return Duration.invalid("created by diffing an invalid DateTime"); + } + var durOpts = _extends({ + locale: this.locale, + numberingSystem: this.numberingSystem + }, opts); + var units = maybeArray(unit).map(Duration.normalizeUnit), + otherIsLater = otherDateTime.valueOf() > this.valueOf(), + earlier = otherIsLater ? this : otherDateTime, + later = otherIsLater ? otherDateTime : this, + diffed = _diff(earlier, later, units, durOpts); + return otherIsLater ? diffed.negate() : diffed; + } + + /** + * Return the difference between this DateTime and right now. + * See {@link DateTime#diff} + * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @return {Duration} + */; + _proto.diffNow = function diffNow(unit, opts) { + if (unit === void 0) { + unit = "milliseconds"; + } + if (opts === void 0) { + opts = {}; + } + return this.diff(DateTime.now(), unit, opts); + } + + /** + * Return an Interval spanning between this DateTime and another DateTime + * @param {DateTime} otherDateTime - the other end point of the Interval + * @return {Interval|DateTime} + */; + _proto.until = function until(otherDateTime) { + return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this; + } + + /** + * Return whether this DateTime is in the same unit of time as another DateTime. + * Higher-order units must also be identical for this function to return `true`. + * Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link DateTime#setZone} to convert one of the dates if needed. + * @param {DateTime} otherDateTime - the other DateTime + * @param {string} unit - the unit of time to check sameness on + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; only the locale of this DateTime is used + * @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day + * @return {boolean} + */; + _proto.hasSame = function hasSame(otherDateTime, unit, opts) { + if (!this.isValid) return false; + var inputMs = otherDateTime.valueOf(); + var adjustedToZone = this.setZone(otherDateTime.zone, { + keepLocalTime: true + }); + return adjustedToZone.startOf(unit, opts) <= inputMs && inputMs <= adjustedToZone.endOf(unit, opts); + } + + /** + * Equality check + * Two DateTimes are equal if and only if they represent the same millisecond, have the same zone and location, and are both valid. + * To compare just the millisecond values, use `+dt1 === +dt2`. + * @param {DateTime} other - the other DateTime + * @return {boolean} + */; + _proto.equals = function equals(other) { + return this.isValid && other.isValid && this.valueOf() === other.valueOf() && this.zone.equals(other.zone) && this.loc.equals(other.loc); + } + + /** + * Returns a string representation of a this time relative to now, such as "in two days". Can only internationalize if your + * platform supports Intl.RelativeTimeFormat. Rounds towards zero by default. + * @param {Object} options - options that affect the output + * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now. + * @param {string} [options.style="long"] - the style of units, must be "long", "short", or "narrow" + * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of "years", "quarters", "months", "weeks", "days", "hours", "minutes", or "seconds" + * @param {boolean} [options.round=true] - whether to round the numbers in the output. + * @param {string} [options.rounding="trunc"] - rounding method to use when rounding the numbers in the output. Can be "trunc" (toward zero), "expand" (away from zero), "round", "floor", or "ceil". + * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding. + * @param {string} options.locale - override the locale of this DateTime + * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this + * @example DateTime.now().plus({ days: 1 }).toRelative() //=> "in 1 day" + * @example DateTime.now().setLocale("es").toRelative({ days: 1 }) //=> "dentro de 1 día" + * @example DateTime.now().plus({ days: 1 }).toRelative({ locale: "fr" }) //=> "dans 23 heures" + * @example DateTime.now().minus({ days: 2 }).toRelative() //=> "2 days ago" + * @example DateTime.now().minus({ days: 2 }).toRelative({ unit: "hours" }) //=> "48 hours ago" + * @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> "1.5 days ago" + */; + _proto.toRelative = function toRelative(options) { + if (options === void 0) { + options = {}; + } + if (!this.isValid) return null; + var base = options.base || DateTime.fromObject({}, { + zone: this.zone + }), + padding = options.padding ? this < base ? -options.padding : options.padding : 0; + var units = ["years", "months", "days", "hours", "minutes", "seconds"]; + var unit = options.unit; + if (Array.isArray(options.unit)) { + units = options.unit; + unit = undefined; + } + return diffRelative(base, this.plus(padding), _extends({}, options, { + numeric: "always", + units: units, + unit: unit + })); + } + + /** + * Returns a string representation of this date relative to today, such as "yesterday" or "next month". + * Only internationalizes on platforms that supports Intl.RelativeTimeFormat. + * @param {Object} options - options that affect the output + * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now. + * @param {string} options.locale - override the locale of this DateTime + * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of "years", "quarters", "months", "weeks", or "days" + * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this + * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> "tomorrow" + * @example DateTime.now().setLocale("es").plus({ days: 1 }).toRelative() //=> ""mañana" + * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: "fr" }) //=> "demain" + * @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> "2 days ago" + */; + _proto.toRelativeCalendar = function toRelativeCalendar(options) { + if (options === void 0) { + options = {}; + } + if (!this.isValid) return null; + return diffRelative(options.base || DateTime.fromObject({}, { + zone: this.zone + }), this, _extends({}, options, { + numeric: "auto", + units: ["years", "months", "days"], + calendary: true + })); + } + + /** + * Return the min of several date times + * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum + * @return {DateTime} the min DateTime, or undefined if called with no argument + */; + DateTime.min = function min() { + for (var _len = arguments.length, dateTimes = new Array(_len), _key = 0; _key < _len; _key++) { + dateTimes[_key] = arguments[_key]; + } + if (!dateTimes.every(DateTime.isDateTime)) { + throw new InvalidArgumentError("min requires all arguments be DateTimes"); + } + return bestBy(dateTimes, function (i) { + return i.valueOf(); + }, Math.min); + } + + /** + * Return the max of several date times + * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum + * @return {DateTime} the max DateTime, or undefined if called with no argument + */; + DateTime.max = function max() { + for (var _len2 = arguments.length, dateTimes = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + dateTimes[_key2] = arguments[_key2]; + } + if (!dateTimes.every(DateTime.isDateTime)) { + throw new InvalidArgumentError("max requires all arguments be DateTimes"); + } + return bestBy(dateTimes, function (i) { + return i.valueOf(); + }, Math.max); + } + + // MISC + + /** + * Explain how a string would be parsed by fromFormat() + * @param {string} text - the string to parse + * @param {string} fmt - the format the string is expected to be in (see description) + * @param {Object} options - options taken by fromFormat() + * @return {Object} + */; + DateTime.fromFormatExplain = function fromFormatExplain(text, fmt, options) { + if (options === void 0) { + options = {}; + } + var _options = options, + _options$locale = _options.locale, + locale = _options$locale === void 0 ? null : _options$locale, + _options$numberingSys = _options.numberingSystem, + numberingSystem = _options$numberingSys === void 0 ? null : _options$numberingSys, + localeToUse = Locale.fromOpts({ + locale: locale, + numberingSystem: numberingSystem, + defaultToEN: true + }); + return explainFromTokens(localeToUse, text, fmt); + } + + /** + * @deprecated use fromFormatExplain instead + */; + DateTime.fromStringExplain = function fromStringExplain(text, fmt, options) { + if (options === void 0) { + options = {}; + } + return DateTime.fromFormatExplain(text, fmt, options); + } + + /** + * Build a parser for `fmt` using the given locale. This parser can be passed + * to {@link DateTime.fromFormatParser} to a parse a date in this format. This + * can be used to optimize cases where many dates need to be parsed in a + * specific format. + * + * @param {String} fmt - the format the string is expected to be in (see + * description) + * @param {Object} options - options used to set locale and numberingSystem + * for parser + * @returns {TokenParser} - opaque object to be used + */; + DateTime.buildFormatParser = function buildFormatParser(fmt, options) { + if (options === void 0) { + options = {}; + } + var _options2 = options, + _options2$locale = _options2.locale, + locale = _options2$locale === void 0 ? null : _options2$locale, + _options2$numberingSy = _options2.numberingSystem, + numberingSystem = _options2$numberingSy === void 0 ? null : _options2$numberingSy, + localeToUse = Locale.fromOpts({ + locale: locale, + numberingSystem: numberingSystem, + defaultToEN: true + }); + return new TokenParser(localeToUse, fmt); + } + + /** + * Create a DateTime from an input string and format parser. + * + * The format parser must have been created with the same locale as this call. + * + * @param {String} text - the string to parse + * @param {TokenParser} formatParser - parser from {@link DateTime.buildFormatParser} + * @param {Object} opts - options taken by fromFormat() + * @returns {DateTime} + */; + DateTime.fromFormatParser = function fromFormatParser(text, formatParser, opts) { + if (opts === void 0) { + opts = {}; + } + if (isUndefined(text) || isUndefined(formatParser)) { + throw new InvalidArgumentError("fromFormatParser requires an input string and a format parser"); + } + var _opts2 = opts, + _opts2$locale = _opts2.locale, + locale = _opts2$locale === void 0 ? null : _opts2$locale, + _opts2$numberingSyste = _opts2.numberingSystem, + numberingSystem = _opts2$numberingSyste === void 0 ? null : _opts2$numberingSyste, + localeToUse = Locale.fromOpts({ + locale: locale, + numberingSystem: numberingSystem, + defaultToEN: true + }); + if (!localeToUse.equals(formatParser.locale)) { + throw new InvalidArgumentError("fromFormatParser called with a locale of " + localeToUse + ", " + ("but the format parser was created for " + formatParser.locale)); + } + var _formatParser$explain = formatParser.explainFromTokens(text), + result = _formatParser$explain.result, + zone = _formatParser$explain.zone, + specificOffset = _formatParser$explain.specificOffset, + invalidReason = _formatParser$explain.invalidReason; + if (invalidReason) { + return DateTime.invalid(invalidReason); + } else { + return parseDataToDateTime(result, zone, opts, "format " + formatParser.format, text, specificOffset); + } + } + + // FORMAT PRESETS + + /** + * {@link DateTime#toLocaleString} format like 10/14/1983 + * @type {Object} + */; + _createClass(DateTime, [{ + key: "isValid", + get: function get() { + return this.invalid === null; + } + + /** + * Returns an error code if this DateTime is invalid, or null if the DateTime is valid + * @type {string} + */ + }, { + key: "invalidReason", + get: function get() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid + * @type {string} + */ + }, { + key: "invalidExplanation", + get: function get() { + return this.invalid ? this.invalid.explanation : null; + } + + /** + * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime + * + * @type {string} + */ + }, { + key: "locale", + get: function get() { + return this.isValid ? this.loc.locale : null; + } + + /** + * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime + * + * @type {string} + */ + }, { + key: "numberingSystem", + get: function get() { + return this.isValid ? this.loc.numberingSystem : null; + } + + /** + * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime + * + * @type {string} + */ + }, { + key: "outputCalendar", + get: function get() { + return this.isValid ? this.loc.outputCalendar : null; + } + + /** + * Get the time zone associated with this DateTime. + * @type {Zone} + */ + }, { + key: "zone", + get: function get() { + return this._zone; + } + + /** + * Get the name of the time zone. + * @type {string} + */ + }, { + key: "zoneName", + get: function get() { + return this.isValid ? this.zone.name : null; + } + + /** + * Get the year + * @example DateTime.local(2017, 5, 25).year //=> 2017 + * @type {number} + */ + }, { + key: "year", + get: function get() { + return this.isValid ? this.c.year : NaN; + } + + /** + * Get the quarter + * @example DateTime.local(2017, 5, 25).quarter //=> 2 + * @type {number} + */ + }, { + key: "quarter", + get: function get() { + return this.isValid ? Math.ceil(this.c.month / 3) : NaN; + } + + /** + * Get the month (1-12). + * @example DateTime.local(2017, 5, 25).month //=> 5 + * @type {number} + */ + }, { + key: "month", + get: function get() { + return this.isValid ? this.c.month : NaN; + } + + /** + * Get the day of the month (1-30ish). + * @example DateTime.local(2017, 5, 25).day //=> 25 + * @type {number} + */ + }, { + key: "day", + get: function get() { + return this.isValid ? this.c.day : NaN; + } + + /** + * Get the hour of the day (0-23). + * @example DateTime.local(2017, 5, 25, 9).hour //=> 9 + * @type {number} + */ + }, { + key: "hour", + get: function get() { + return this.isValid ? this.c.hour : NaN; + } + + /** + * Get the minute of the hour (0-59). + * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30 + * @type {number} + */ + }, { + key: "minute", + get: function get() { + return this.isValid ? this.c.minute : NaN; + } + + /** + * Get the second of the minute (0-59). + * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52 + * @type {number} + */ + }, { + key: "second", + get: function get() { + return this.isValid ? this.c.second : NaN; + } + + /** + * Get the millisecond of the second (0-999). + * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654 + * @type {number} + */ + }, { + key: "millisecond", + get: function get() { + return this.isValid ? this.c.millisecond : NaN; + } + + /** + * Get the week year + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2014, 12, 31).weekYear //=> 2015 + * @type {number} + */ + }, { + key: "weekYear", + get: function get() { + return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN; + } + + /** + * Get the week number of the week year (1-52ish). + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2017, 5, 25).weekNumber //=> 21 + * @type {number} + */ + }, { + key: "weekNumber", + get: function get() { + return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN; + } + + /** + * Get the day of the week. + * 1 is Monday and 7 is Sunday + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2014, 11, 31).weekday //=> 4 + * @type {number} + */ + }, { + key: "weekday", + get: function get() { + return this.isValid ? possiblyCachedWeekData(this).weekday : NaN; + } + + /** + * Returns true if this date is on a weekend according to the locale, false otherwise + * @returns {boolean} + */ + }, { + key: "isWeekend", + get: function get() { + return this.isValid && this.loc.getWeekendDays().includes(this.weekday); + } + + /** + * Get the day of the week according to the locale. + * 1 is the first day of the week and 7 is the last day of the week. + * If the locale assigns Sunday as the first day of the week, then a date which is a Sunday will return 1, + * @returns {number} + */ + }, { + key: "localWeekday", + get: function get() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekday : NaN; + } + + /** + * Get the week number of the week year according to the locale. Different locales assign week numbers differently, + * because the week can start on different days of the week (see localWeekday) and because a different number of days + * is required for a week to count as the first week of a year. + * @returns {number} + */ + }, { + key: "localWeekNumber", + get: function get() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekNumber : NaN; + } + + /** + * Get the week year according to the locale. Different locales assign week numbers (and therefor week years) + * differently, see localWeekNumber. + * @returns {number} + */ + }, { + key: "localWeekYear", + get: function get() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekYear : NaN; + } + + /** + * Get the ordinal (meaning the day of the year) + * @example DateTime.local(2017, 5, 25).ordinal //=> 145 + * @type {number|DateTime} + */ + }, { + key: "ordinal", + get: function get() { + return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN; + } + + /** + * Get the human readable short month name, such as 'Oct'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).monthShort //=> Oct + * @type {string} + */ + }, { + key: "monthShort", + get: function get() { + return this.isValid ? Info.months("short", { + locObj: this.loc + })[this.month - 1] : null; + } + + /** + * Get the human readable long month name, such as 'October'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).monthLong //=> October + * @type {string} + */ + }, { + key: "monthLong", + get: function get() { + return this.isValid ? Info.months("long", { + locObj: this.loc + })[this.month - 1] : null; + } + + /** + * Get the human readable short weekday, such as 'Mon'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon + * @type {string} + */ + }, { + key: "weekdayShort", + get: function get() { + return this.isValid ? Info.weekdays("short", { + locObj: this.loc + })[this.weekday - 1] : null; + } + + /** + * Get the human readable long weekday, such as 'Monday'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday + * @type {string} + */ + }, { + key: "weekdayLong", + get: function get() { + return this.isValid ? Info.weekdays("long", { + locObj: this.loc + })[this.weekday - 1] : null; + } + + /** + * Get the UTC offset of this DateTime in minutes + * @example DateTime.now().offset //=> -240 + * @example DateTime.utc().offset //=> 0 + * @type {number} + */ + }, { + key: "offset", + get: function get() { + return this.isValid ? +this.o : NaN; + } + + /** + * Get the short human name for the zone's current offset, for example "EST" or "EDT". + * Defaults to the system's locale if no locale has been specified + * @type {string} + */ + }, { + key: "offsetNameShort", + get: function get() { + if (this.isValid) { + return this.zone.offsetName(this.ts, { + format: "short", + locale: this.locale + }); + } else { + return null; + } + } + + /** + * Get the long human name for the zone's current offset, for example "Eastern Standard Time" or "Eastern Daylight Time". + * Defaults to the system's locale if no locale has been specified + * @type {string} + */ + }, { + key: "offsetNameLong", + get: function get() { + if (this.isValid) { + return this.zone.offsetName(this.ts, { + format: "long", + locale: this.locale + }); + } else { + return null; + } + } + + /** + * Get whether this zone's offset ever changes, as in a DST. + * @type {boolean} + */ + }, { + key: "isOffsetFixed", + get: function get() { + return this.isValid ? this.zone.isUniversal : null; + } + + /** + * Get whether the DateTime is in a DST. + * @type {boolean} + */ + }, { + key: "isInDST", + get: function get() { + if (this.isOffsetFixed) { + return false; + } else { + return this.offset > this.set({ + month: 1, + day: 1 + }).offset || this.offset > this.set({ + month: 5 + }).offset; + } + } + }, { + key: "isInLeapYear", + get: function get() { + return isLeapYear(this.year); + } + + /** + * Returns the number of days in this DateTime's month + * @example DateTime.local(2016, 2).daysInMonth //=> 29 + * @example DateTime.local(2016, 3).daysInMonth //=> 31 + * @type {number} + */ + }, { + key: "daysInMonth", + get: function get() { + return daysInMonth(this.year, this.month); + } + + /** + * Returns the number of days in this DateTime's year + * @example DateTime.local(2016).daysInYear //=> 366 + * @example DateTime.local(2013).daysInYear //=> 365 + * @type {number} + */ + }, { + key: "daysInYear", + get: function get() { + return this.isValid ? daysInYear(this.year) : NaN; + } + + /** + * Returns the number of weeks in this DateTime's year + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2004).weeksInWeekYear //=> 53 + * @example DateTime.local(2013).weeksInWeekYear //=> 52 + * @type {number} + */ + }, { + key: "weeksInWeekYear", + get: function get() { + return this.isValid ? weeksInWeekYear(this.weekYear) : NaN; + } + + /** + * Returns the number of weeks in this DateTime's local week year + * @example DateTime.local(2020, 6, {locale: 'en-US'}).weeksInLocalWeekYear //=> 52 + * @example DateTime.local(2020, 6, {locale: 'de-DE'}).weeksInLocalWeekYear //=> 53 + * @type {number} + */ + }, { + key: "weeksInLocalWeekYear", + get: function get() { + return this.isValid ? weeksInWeekYear(this.localWeekYear, this.loc.getMinDaysInFirstWeek(), this.loc.getStartOfWeek()) : NaN; + } + }], [{ + key: "DATE_SHORT", + get: function get() { + return DATE_SHORT; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983' + * @type {Object} + */ + }, { + key: "DATE_MED", + get: function get() { + return DATE_MED; + } + + /** + * {@link DateTime#toLocaleString} format like 'Fri, Oct 14, 1983' + * @type {Object} + */ + }, { + key: "DATE_MED_WITH_WEEKDAY", + get: function get() { + return DATE_MED_WITH_WEEKDAY; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983' + * @type {Object} + */ + }, { + key: "DATE_FULL", + get: function get() { + return DATE_FULL; + } + + /** + * {@link DateTime#toLocaleString} format like 'Tuesday, October 14, 1983' + * @type {Object} + */ + }, { + key: "DATE_HUGE", + get: function get() { + return DATE_HUGE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "TIME_SIMPLE", + get: function get() { + return TIME_SIMPLE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "TIME_WITH_SECONDS", + get: function get() { + return TIME_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "TIME_WITH_SHORT_OFFSET", + get: function get() { + return TIME_WITH_SHORT_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "TIME_WITH_LONG_OFFSET", + get: function get() { + return TIME_WITH_LONG_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30', always 24-hour. + * @type {Object} + */ + }, { + key: "TIME_24_SIMPLE", + get: function get() { + return TIME_24_SIMPLE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23', always 24-hour. + * @type {Object} + */ + }, { + key: "TIME_24_WITH_SECONDS", + get: function get() { + return TIME_24_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 EDT', always 24-hour. + * @type {Object} + */ + }, { + key: "TIME_24_WITH_SHORT_OFFSET", + get: function get() { + return TIME_24_WITH_SHORT_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour. + * @type {Object} + */ + }, { + key: "TIME_24_WITH_LONG_OFFSET", + get: function get() { + return TIME_24_WITH_LONG_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_SHORT", + get: function get() { + return DATETIME_SHORT; + } + + /** + * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_SHORT_WITH_SECONDS", + get: function get() { + return DATETIME_SHORT_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_MED", + get: function get() { + return DATETIME_MED; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_MED_WITH_SECONDS", + get: function get() { + return DATETIME_MED_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_MED_WITH_WEEKDAY", + get: function get() { + return DATETIME_MED_WITH_WEEKDAY; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_FULL", + get: function get() { + return DATETIME_FULL; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_FULL_WITH_SECONDS", + get: function get() { + return DATETIME_FULL_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_HUGE", + get: function get() { + return DATETIME_HUGE; + } + + /** + * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_HUGE_WITH_SECONDS", + get: function get() { + return DATETIME_HUGE_WITH_SECONDS; + } + }]); + return DateTime; +}(Symbol.for("nodejs.util.inspect.custom")); +function friendlyDateTime(dateTimeish) { + if (DateTime.isDateTime(dateTimeish)) { + return dateTimeish; + } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) { + return DateTime.fromJSDate(dateTimeish); + } else if (dateTimeish && typeof dateTimeish === "object") { + return DateTime.fromObject(dateTimeish); + } else { + throw new InvalidArgumentError("Unknown datetime argument: " + dateTimeish + ", of type " + typeof dateTimeish); + } +} + +var VERSION = "3.7.2"; + +exports.DateTime = DateTime; +exports.Duration = Duration; +exports.FixedOffsetZone = FixedOffsetZone; +exports.IANAZone = IANAZone; +exports.Info = Info; +exports.Interval = Interval; +exports.InvalidZone = InvalidZone; +exports.Settings = Settings; +exports.SystemZone = SystemZone; +exports.VERSION = VERSION; +exports.Zone = Zone; +//# sourceMappingURL=luxon.js.map diff --git a/node_modules/luxon/build/cjs-browser/luxon.js.map b/node_modules/luxon/build/cjs-browser/luxon.js.map new file mode 100644 index 00000000..e965cb94 --- /dev/null +++ b/node_modules/luxon/build/cjs-browser/luxon.js.map @@ -0,0 +1 @@ +{"version":3,"file":"luxon.js","sources":["../../src/errors.js","../../src/impl/formats.js","../../src/zone.js","../../src/zones/systemZone.js","../../src/zones/IANAZone.js","../../src/impl/locale.js","../../src/zones/fixedOffsetZone.js","../../src/zones/invalidZone.js","../../src/impl/zoneUtil.js","../../src/impl/digits.js","../../src/settings.js","../../src/impl/invalid.js","../../src/impl/conversions.js","../../src/impl/util.js","../../src/impl/english.js","../../src/impl/formatter.js","../../src/impl/regexParser.js","../../src/duration.js","../../src/interval.js","../../src/info.js","../../src/impl/diff.js","../../src/impl/tokenParser.js","../../src/datetime.js","../../src/luxon.js"],"sourcesContent":["// these aren't really private, but nor are they really useful to document\n\n/**\n * @private\n */\nclass LuxonError extends Error {}\n\n/**\n * @private\n */\nexport class InvalidDateTimeError extends LuxonError {\n constructor(reason) {\n super(`Invalid DateTime: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidIntervalError extends LuxonError {\n constructor(reason) {\n super(`Invalid Interval: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidDurationError extends LuxonError {\n constructor(reason) {\n super(`Invalid Duration: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class ConflictingSpecificationError extends LuxonError {}\n\n/**\n * @private\n */\nexport class InvalidUnitError extends LuxonError {\n constructor(unit) {\n super(`Invalid unit ${unit}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidArgumentError extends LuxonError {}\n\n/**\n * @private\n */\nexport class ZoneIsAbstractError extends LuxonError {\n constructor() {\n super(\"Zone is an abstract class\");\n }\n}\n","/**\n * @private\n */\n\nconst n = \"numeric\",\n s = \"short\",\n l = \"long\";\n\nexport const DATE_SHORT = {\n year: n,\n month: n,\n day: n,\n};\n\nexport const DATE_MED = {\n year: n,\n month: s,\n day: n,\n};\n\nexport const DATE_MED_WITH_WEEKDAY = {\n year: n,\n month: s,\n day: n,\n weekday: s,\n};\n\nexport const DATE_FULL = {\n year: n,\n month: l,\n day: n,\n};\n\nexport const DATE_HUGE = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n};\n\nexport const TIME_SIMPLE = {\n hour: n,\n minute: n,\n};\n\nexport const TIME_WITH_SECONDS = {\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const TIME_WITH_SHORT_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n timeZoneName: s,\n};\n\nexport const TIME_WITH_LONG_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n timeZoneName: l,\n};\n\nexport const TIME_24_SIMPLE = {\n hour: n,\n minute: n,\n hourCycle: \"h23\",\n};\n\nexport const TIME_24_WITH_SECONDS = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n};\n\nexport const TIME_24_WITH_SHORT_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n timeZoneName: s,\n};\n\nexport const TIME_24_WITH_LONG_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n timeZoneName: l,\n};\n\nexport const DATETIME_SHORT = {\n year: n,\n month: n,\n day: n,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_SHORT_WITH_SECONDS = {\n year: n,\n month: n,\n day: n,\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const DATETIME_MED = {\n year: n,\n month: s,\n day: n,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_MED_WITH_SECONDS = {\n year: n,\n month: s,\n day: n,\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const DATETIME_MED_WITH_WEEKDAY = {\n year: n,\n month: s,\n day: n,\n weekday: s,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_FULL = {\n year: n,\n month: l,\n day: n,\n hour: n,\n minute: n,\n timeZoneName: s,\n};\n\nexport const DATETIME_FULL_WITH_SECONDS = {\n year: n,\n month: l,\n day: n,\n hour: n,\n minute: n,\n second: n,\n timeZoneName: s,\n};\n\nexport const DATETIME_HUGE = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n hour: n,\n minute: n,\n timeZoneName: l,\n};\n\nexport const DATETIME_HUGE_WITH_SECONDS = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n hour: n,\n minute: n,\n second: n,\n timeZoneName: l,\n};\n","import { ZoneIsAbstractError } from \"./errors.js\";\n\n/**\n * @interface\n */\nexport default class Zone {\n /**\n * The type of zone\n * @abstract\n * @type {string}\n */\n get type() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * The name of this zone.\n * @abstract\n * @type {string}\n */\n get name() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * The IANA name of this zone.\n * Defaults to `name` if not overwritten by a subclass.\n * @abstract\n * @type {string}\n */\n get ianaName() {\n return this.name;\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year.\n * @abstract\n * @type {boolean}\n */\n get isUniversal() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Returns the offset's common name (such as EST) at the specified timestamp\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to get the name\n * @param {Object} opts - Options to affect the format\n * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.\n * @param {string} opts.locale - What locale to return the offset name in.\n * @return {string}\n */\n offsetName(ts, opts) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Returns the offset's value as a string\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to compute the offset\n * @return {number}\n */\n offset(ts) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return whether this Zone is equal to another zone\n * @abstract\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return whether this Zone is valid.\n * @abstract\n * @type {boolean}\n */\n get isValid() {\n throw new ZoneIsAbstractError();\n }\n}\n","import { formatOffset, parseZoneInfo } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet singleton = null;\n\n/**\n * Represents the local zone for this JavaScript environment.\n * @implements {Zone}\n */\nexport default class SystemZone extends Zone {\n /**\n * Get a singleton instance of the local zone\n * @return {SystemZone}\n */\n static get instance() {\n if (singleton === null) {\n singleton = new SystemZone();\n }\n return singleton;\n }\n\n /** @override **/\n get type() {\n return \"system\";\n }\n\n /** @override **/\n get name() {\n return new Intl.DateTimeFormat().resolvedOptions().timeZone;\n }\n\n /** @override **/\n get isUniversal() {\n return false;\n }\n\n /** @override **/\n offsetName(ts, { format, locale }) {\n return parseZoneInfo(ts, format, locale);\n }\n\n /** @override **/\n formatOffset(ts, format) {\n return formatOffset(this.offset(ts), format);\n }\n\n /** @override **/\n offset(ts) {\n return -new Date(ts).getTimezoneOffset();\n }\n\n /** @override **/\n equals(otherZone) {\n return otherZone.type === \"system\";\n }\n\n /** @override **/\n get isValid() {\n return true;\n }\n}\n","import { formatOffset, parseZoneInfo, isUndefined, objToLocalTS } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nconst dtfCache = new Map();\nfunction makeDTF(zoneName) {\n let dtf = dtfCache.get(zoneName);\n if (dtf === undefined) {\n dtf = new Intl.DateTimeFormat(\"en-US\", {\n hour12: false,\n timeZone: zoneName,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n era: \"short\",\n });\n dtfCache.set(zoneName, dtf);\n }\n return dtf;\n}\n\nconst typeToPos = {\n year: 0,\n month: 1,\n day: 2,\n era: 3,\n hour: 4,\n minute: 5,\n second: 6,\n};\n\nfunction hackyOffset(dtf, date) {\n const formatted = dtf.format(date).replace(/\\u200E/g, \"\"),\n parsed = /(\\d+)\\/(\\d+)\\/(\\d+) (AD|BC),? (\\d+):(\\d+):(\\d+)/.exec(formatted),\n [, fMonth, fDay, fYear, fadOrBc, fHour, fMinute, fSecond] = parsed;\n return [fYear, fMonth, fDay, fadOrBc, fHour, fMinute, fSecond];\n}\n\nfunction partsOffset(dtf, date) {\n const formatted = dtf.formatToParts(date);\n const filled = [];\n for (let i = 0; i < formatted.length; i++) {\n const { type, value } = formatted[i];\n const pos = typeToPos[type];\n\n if (type === \"era\") {\n filled[pos] = value;\n } else if (!isUndefined(pos)) {\n filled[pos] = parseInt(value, 10);\n }\n }\n return filled;\n}\n\nconst ianaZoneCache = new Map();\n/**\n * A zone identified by an IANA identifier, like America/New_York\n * @implements {Zone}\n */\nexport default class IANAZone extends Zone {\n /**\n * @param {string} name - Zone name\n * @return {IANAZone}\n */\n static create(name) {\n let zone = ianaZoneCache.get(name);\n if (zone === undefined) {\n ianaZoneCache.set(name, (zone = new IANAZone(name)));\n }\n return zone;\n }\n\n /**\n * Reset local caches. Should only be necessary in testing scenarios.\n * @return {void}\n */\n static resetCache() {\n ianaZoneCache.clear();\n dtfCache.clear();\n }\n\n /**\n * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that.\n * @param {string} s - The string to check validity on\n * @example IANAZone.isValidSpecifier(\"America/New_York\") //=> true\n * @example IANAZone.isValidSpecifier(\"Sport~~blorp\") //=> false\n * @deprecated For backward compatibility, this forwards to isValidZone, better use `isValidZone()` directly instead.\n * @return {boolean}\n */\n static isValidSpecifier(s) {\n return this.isValidZone(s);\n }\n\n /**\n * Returns whether the provided string identifies a real zone\n * @param {string} zone - The string to check\n * @example IANAZone.isValidZone(\"America/New_York\") //=> true\n * @example IANAZone.isValidZone(\"Fantasia/Castle\") //=> false\n * @example IANAZone.isValidZone(\"Sport~~blorp\") //=> false\n * @return {boolean}\n */\n static isValidZone(zone) {\n if (!zone) {\n return false;\n }\n try {\n new Intl.DateTimeFormat(\"en-US\", { timeZone: zone }).format();\n return true;\n } catch (e) {\n return false;\n }\n }\n\n constructor(name) {\n super();\n /** @private **/\n this.zoneName = name;\n /** @private **/\n this.valid = IANAZone.isValidZone(name);\n }\n\n /**\n * The type of zone. `iana` for all instances of `IANAZone`.\n * @override\n * @type {string}\n */\n get type() {\n return \"iana\";\n }\n\n /**\n * The name of this zone (i.e. the IANA zone name).\n * @override\n * @type {string}\n */\n get name() {\n return this.zoneName;\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year:\n * Always returns false for all IANA zones.\n * @override\n * @type {boolean}\n */\n get isUniversal() {\n return false;\n }\n\n /**\n * Returns the offset's common name (such as EST) at the specified timestamp\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the name\n * @param {Object} opts - Options to affect the format\n * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.\n * @param {string} opts.locale - What locale to return the offset name in.\n * @return {string}\n */\n offsetName(ts, { format, locale }) {\n return parseZoneInfo(ts, format, locale, this.name);\n }\n\n /**\n * Returns the offset's value as a string\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n return formatOffset(this.offset(ts), format);\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n * @override\n * @param {number} ts - Epoch milliseconds for which to compute the offset\n * @return {number}\n */\n offset(ts) {\n if (!this.valid) return NaN;\n const date = new Date(ts);\n\n if (isNaN(date)) return NaN;\n\n const dtf = makeDTF(this.name);\n let [year, month, day, adOrBc, hour, minute, second] = dtf.formatToParts\n ? partsOffset(dtf, date)\n : hackyOffset(dtf, date);\n\n if (adOrBc === \"BC\") {\n year = -Math.abs(year) + 1;\n }\n\n // because we're using hour12 and https://bugs.chromium.org/p/chromium/issues/detail?id=1025564&can=2&q=%2224%3A00%22%20datetimeformat\n const adjustedHour = hour === 24 ? 0 : hour;\n\n const asUTC = objToLocalTS({\n year,\n month,\n day,\n hour: adjustedHour,\n minute,\n second,\n millisecond: 0,\n });\n\n let asTS = +date;\n const over = asTS % 1000;\n asTS -= over >= 0 ? over : 1000 + over;\n return (asUTC - asTS) / (60 * 1000);\n }\n\n /**\n * Return whether this Zone is equal to another zone\n * @override\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n return otherZone.type === \"iana\" && otherZone.name === this.name;\n }\n\n /**\n * Return whether this Zone is valid.\n * @override\n * @type {boolean}\n */\n get isValid() {\n return this.valid;\n }\n}\n","import { hasLocaleWeekInfo, hasRelative, padStart, roundTo, validateWeekSettings } from \"./util.js\";\nimport * as English from \"./english.js\";\nimport Settings from \"../settings.js\";\nimport DateTime from \"../datetime.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\n\n// todo - remap caching\n\nlet intlLFCache = {};\nfunction getCachedLF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let dtf = intlLFCache[key];\n if (!dtf) {\n dtf = new Intl.ListFormat(locString, opts);\n intlLFCache[key] = dtf;\n }\n return dtf;\n}\n\nconst intlDTCache = new Map();\nfunction getCachedDTF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let dtf = intlDTCache.get(key);\n if (dtf === undefined) {\n dtf = new Intl.DateTimeFormat(locString, opts);\n intlDTCache.set(key, dtf);\n }\n return dtf;\n}\n\nconst intlNumCache = new Map();\nfunction getCachedINF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let inf = intlNumCache.get(key);\n if (inf === undefined) {\n inf = new Intl.NumberFormat(locString, opts);\n intlNumCache.set(key, inf);\n }\n return inf;\n}\n\nconst intlRelCache = new Map();\nfunction getCachedRTF(locString, opts = {}) {\n const { base, ...cacheKeyOpts } = opts; // exclude `base` from the options\n const key = JSON.stringify([locString, cacheKeyOpts]);\n let inf = intlRelCache.get(key);\n if (inf === undefined) {\n inf = new Intl.RelativeTimeFormat(locString, opts);\n intlRelCache.set(key, inf);\n }\n return inf;\n}\n\nlet sysLocaleCache = null;\nfunction systemLocale() {\n if (sysLocaleCache) {\n return sysLocaleCache;\n } else {\n sysLocaleCache = new Intl.DateTimeFormat().resolvedOptions().locale;\n return sysLocaleCache;\n }\n}\n\nconst intlResolvedOptionsCache = new Map();\nfunction getCachedIntResolvedOptions(locString) {\n let opts = intlResolvedOptionsCache.get(locString);\n if (opts === undefined) {\n opts = new Intl.DateTimeFormat(locString).resolvedOptions();\n intlResolvedOptionsCache.set(locString, opts);\n }\n return opts;\n}\n\nconst weekInfoCache = new Map();\nfunction getCachedWeekInfo(locString) {\n let data = weekInfoCache.get(locString);\n if (!data) {\n const locale = new Intl.Locale(locString);\n // browsers currently implement this as a property, but spec says it should be a getter function\n data = \"getWeekInfo\" in locale ? locale.getWeekInfo() : locale.weekInfo;\n // minimalDays was removed from WeekInfo: https://github.com/tc39/proposal-intl-locale-info/issues/86\n if (!(\"minimalDays\" in data)) {\n data = { ...fallbackWeekSettings, ...data };\n }\n weekInfoCache.set(locString, data);\n }\n return data;\n}\n\nfunction parseLocaleString(localeStr) {\n // I really want to avoid writing a BCP 47 parser\n // see, e.g. https://github.com/wooorm/bcp-47\n // Instead, we'll do this:\n\n // a) if the string has no -u extensions, just leave it alone\n // b) if it does, use Intl to resolve everything\n // c) if Intl fails, try again without the -u\n\n // private subtags and unicode subtags have ordering requirements,\n // and we're not properly parsing this, so just strip out the\n // private ones if they exist.\n const xIndex = localeStr.indexOf(\"-x-\");\n if (xIndex !== -1) {\n localeStr = localeStr.substring(0, xIndex);\n }\n\n const uIndex = localeStr.indexOf(\"-u-\");\n if (uIndex === -1) {\n return [localeStr];\n } else {\n let options;\n let selectedStr;\n try {\n options = getCachedDTF(localeStr).resolvedOptions();\n selectedStr = localeStr;\n } catch (e) {\n const smaller = localeStr.substring(0, uIndex);\n options = getCachedDTF(smaller).resolvedOptions();\n selectedStr = smaller;\n }\n\n const { numberingSystem, calendar } = options;\n return [selectedStr, numberingSystem, calendar];\n }\n}\n\nfunction intlConfigString(localeStr, numberingSystem, outputCalendar) {\n if (outputCalendar || numberingSystem) {\n if (!localeStr.includes(\"-u-\")) {\n localeStr += \"-u\";\n }\n\n if (outputCalendar) {\n localeStr += `-ca-${outputCalendar}`;\n }\n\n if (numberingSystem) {\n localeStr += `-nu-${numberingSystem}`;\n }\n return localeStr;\n } else {\n return localeStr;\n }\n}\n\nfunction mapMonths(f) {\n const ms = [];\n for (let i = 1; i <= 12; i++) {\n const dt = DateTime.utc(2009, i, 1);\n ms.push(f(dt));\n }\n return ms;\n}\n\nfunction mapWeekdays(f) {\n const ms = [];\n for (let i = 1; i <= 7; i++) {\n const dt = DateTime.utc(2016, 11, 13 + i);\n ms.push(f(dt));\n }\n return ms;\n}\n\nfunction listStuff(loc, length, englishFn, intlFn) {\n const mode = loc.listingMode();\n\n if (mode === \"error\") {\n return null;\n } else if (mode === \"en\") {\n return englishFn(length);\n } else {\n return intlFn(length);\n }\n}\n\nfunction supportsFastNumbers(loc) {\n if (loc.numberingSystem && loc.numberingSystem !== \"latn\") {\n return false;\n } else {\n return (\n loc.numberingSystem === \"latn\" ||\n !loc.locale ||\n loc.locale.startsWith(\"en\") ||\n getCachedIntResolvedOptions(loc.locale).numberingSystem === \"latn\"\n );\n }\n}\n\n/**\n * @private\n */\n\nclass PolyNumberFormatter {\n constructor(intl, forceSimple, opts) {\n this.padTo = opts.padTo || 0;\n this.floor = opts.floor || false;\n\n const { padTo, floor, ...otherOpts } = opts;\n\n if (!forceSimple || Object.keys(otherOpts).length > 0) {\n const intlOpts = { useGrouping: false, ...opts };\n if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo;\n this.inf = getCachedINF(intl, intlOpts);\n }\n }\n\n format(i) {\n if (this.inf) {\n const fixed = this.floor ? Math.floor(i) : i;\n return this.inf.format(fixed);\n } else {\n // to match the browser's numberformatter defaults\n const fixed = this.floor ? Math.floor(i) : roundTo(i, 3);\n return padStart(fixed, this.padTo);\n }\n }\n}\n\n/**\n * @private\n */\n\nclass PolyDateFormatter {\n constructor(dt, intl, opts) {\n this.opts = opts;\n this.originalZone = undefined;\n\n let z = undefined;\n if (this.opts.timeZone) {\n // Don't apply any workarounds if a timeZone is explicitly provided in opts\n this.dt = dt;\n } else if (dt.zone.type === \"fixed\") {\n // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like.\n // That is why fixed-offset TZ is set to that unless it is:\n // 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT.\n // 2. Unsupported by the browser:\n // - some do not support Etc/\n // - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata\n const gmtOffset = -1 * (dt.offset / 60);\n const offsetZ = gmtOffset >= 0 ? `Etc/GMT+${gmtOffset}` : `Etc/GMT${gmtOffset}`;\n if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) {\n z = offsetZ;\n this.dt = dt;\n } else {\n // Not all fixed-offset zones like Etc/+4:30 are present in tzdata so\n // we manually apply the offset and substitute the zone as needed.\n z = \"UTC\";\n this.dt = dt.offset === 0 ? dt : dt.setZone(\"UTC\").plus({ minutes: dt.offset });\n this.originalZone = dt.zone;\n }\n } else if (dt.zone.type === \"system\") {\n this.dt = dt;\n } else if (dt.zone.type === \"iana\") {\n this.dt = dt;\n z = dt.zone.name;\n } else {\n // Custom zones can have any offset / offsetName so we just manually\n // apply the offset and substitute the zone as needed.\n z = \"UTC\";\n this.dt = dt.setZone(\"UTC\").plus({ minutes: dt.offset });\n this.originalZone = dt.zone;\n }\n\n const intlOpts = { ...this.opts };\n intlOpts.timeZone = intlOpts.timeZone || z;\n this.dtf = getCachedDTF(intl, intlOpts);\n }\n\n format() {\n if (this.originalZone) {\n // If we have to substitute in the actual zone name, we have to use\n // formatToParts so that the timezone can be replaced.\n return this.formatToParts()\n .map(({ value }) => value)\n .join(\"\");\n }\n return this.dtf.format(this.dt.toJSDate());\n }\n\n formatToParts() {\n const parts = this.dtf.formatToParts(this.dt.toJSDate());\n if (this.originalZone) {\n return parts.map((part) => {\n if (part.type === \"timeZoneName\") {\n const offsetName = this.originalZone.offsetName(this.dt.ts, {\n locale: this.dt.locale,\n format: this.opts.timeZoneName,\n });\n return {\n ...part,\n value: offsetName,\n };\n } else {\n return part;\n }\n });\n }\n return parts;\n }\n\n resolvedOptions() {\n return this.dtf.resolvedOptions();\n }\n}\n\n/**\n * @private\n */\nclass PolyRelFormatter {\n constructor(intl, isEnglish, opts) {\n this.opts = { style: \"long\", ...opts };\n if (!isEnglish && hasRelative()) {\n this.rtf = getCachedRTF(intl, opts);\n }\n }\n\n format(count, unit) {\n if (this.rtf) {\n return this.rtf.format(count, unit);\n } else {\n return English.formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== \"long\");\n }\n }\n\n formatToParts(count, unit) {\n if (this.rtf) {\n return this.rtf.formatToParts(count, unit);\n } else {\n return [];\n }\n }\n}\n\nconst fallbackWeekSettings = {\n firstDay: 1,\n minimalDays: 4,\n weekend: [6, 7],\n};\n\n/**\n * @private\n */\nexport default class Locale {\n static fromOpts(opts) {\n return Locale.create(\n opts.locale,\n opts.numberingSystem,\n opts.outputCalendar,\n opts.weekSettings,\n opts.defaultToEN\n );\n }\n\n static create(locale, numberingSystem, outputCalendar, weekSettings, defaultToEN = false) {\n const specifiedLocale = locale || Settings.defaultLocale;\n // the system locale is useful for human-readable strings but annoying for parsing/formatting known formats\n const localeR = specifiedLocale || (defaultToEN ? \"en-US\" : systemLocale());\n const numberingSystemR = numberingSystem || Settings.defaultNumberingSystem;\n const outputCalendarR = outputCalendar || Settings.defaultOutputCalendar;\n const weekSettingsR = validateWeekSettings(weekSettings) || Settings.defaultWeekSettings;\n return new Locale(localeR, numberingSystemR, outputCalendarR, weekSettingsR, specifiedLocale);\n }\n\n static resetCache() {\n sysLocaleCache = null;\n intlDTCache.clear();\n intlNumCache.clear();\n intlRelCache.clear();\n intlResolvedOptionsCache.clear();\n weekInfoCache.clear();\n }\n\n static fromObject({ locale, numberingSystem, outputCalendar, weekSettings } = {}) {\n return Locale.create(locale, numberingSystem, outputCalendar, weekSettings);\n }\n\n constructor(locale, numbering, outputCalendar, weekSettings, specifiedLocale) {\n const [parsedLocale, parsedNumberingSystem, parsedOutputCalendar] = parseLocaleString(locale);\n\n this.locale = parsedLocale;\n this.numberingSystem = numbering || parsedNumberingSystem || null;\n this.outputCalendar = outputCalendar || parsedOutputCalendar || null;\n this.weekSettings = weekSettings;\n this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar);\n\n this.weekdaysCache = { format: {}, standalone: {} };\n this.monthsCache = { format: {}, standalone: {} };\n this.meridiemCache = null;\n this.eraCache = {};\n\n this.specifiedLocale = specifiedLocale;\n this.fastNumbersCached = null;\n }\n\n get fastNumbers() {\n if (this.fastNumbersCached == null) {\n this.fastNumbersCached = supportsFastNumbers(this);\n }\n\n return this.fastNumbersCached;\n }\n\n listingMode() {\n const isActuallyEn = this.isEnglish();\n const hasNoWeirdness =\n (this.numberingSystem === null || this.numberingSystem === \"latn\") &&\n (this.outputCalendar === null || this.outputCalendar === \"gregory\");\n return isActuallyEn && hasNoWeirdness ? \"en\" : \"intl\";\n }\n\n clone(alts) {\n if (!alts || Object.getOwnPropertyNames(alts).length === 0) {\n return this;\n } else {\n return Locale.create(\n alts.locale || this.specifiedLocale,\n alts.numberingSystem || this.numberingSystem,\n alts.outputCalendar || this.outputCalendar,\n validateWeekSettings(alts.weekSettings) || this.weekSettings,\n alts.defaultToEN || false\n );\n }\n }\n\n redefaultToEN(alts = {}) {\n return this.clone({ ...alts, defaultToEN: true });\n }\n\n redefaultToSystem(alts = {}) {\n return this.clone({ ...alts, defaultToEN: false });\n }\n\n months(length, format = false) {\n return listStuff(this, length, English.months, () => {\n // Workaround for \"ja\" locale: formatToParts does not label all parts of the month\n // as \"month\" and for this locale there is no difference between \"format\" and \"non-format\".\n // As such, just use format() instead of formatToParts() and take the whole string\n const monthSpecialCase = this.intl === \"ja\" || this.intl.startsWith(\"ja-\");\n format &= !monthSpecialCase;\n const intl = format ? { month: length, day: \"numeric\" } : { month: length },\n formatStr = format ? \"format\" : \"standalone\";\n if (!this.monthsCache[formatStr][length]) {\n const mapper = !monthSpecialCase\n ? (dt) => this.extract(dt, intl, \"month\")\n : (dt) => this.dtFormatter(dt, intl).format();\n this.monthsCache[formatStr][length] = mapMonths(mapper);\n }\n return this.monthsCache[formatStr][length];\n });\n }\n\n weekdays(length, format = false) {\n return listStuff(this, length, English.weekdays, () => {\n const intl = format\n ? { weekday: length, year: \"numeric\", month: \"long\", day: \"numeric\" }\n : { weekday: length },\n formatStr = format ? \"format\" : \"standalone\";\n if (!this.weekdaysCache[formatStr][length]) {\n this.weekdaysCache[formatStr][length] = mapWeekdays((dt) =>\n this.extract(dt, intl, \"weekday\")\n );\n }\n return this.weekdaysCache[formatStr][length];\n });\n }\n\n meridiems() {\n return listStuff(\n this,\n undefined,\n () => English.meridiems,\n () => {\n // In theory there could be aribitrary day periods. We're gonna assume there are exactly two\n // for AM and PM. This is probably wrong, but it's makes parsing way easier.\n if (!this.meridiemCache) {\n const intl = { hour: \"numeric\", hourCycle: \"h12\" };\n this.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map(\n (dt) => this.extract(dt, intl, \"dayperiod\")\n );\n }\n\n return this.meridiemCache;\n }\n );\n }\n\n eras(length) {\n return listStuff(this, length, English.eras, () => {\n const intl = { era: length };\n\n // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates\n // to definitely enumerate them.\n if (!this.eraCache[length]) {\n this.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map((dt) =>\n this.extract(dt, intl, \"era\")\n );\n }\n\n return this.eraCache[length];\n });\n }\n\n extract(dt, intlOpts, field) {\n const df = this.dtFormatter(dt, intlOpts),\n results = df.formatToParts(),\n matching = results.find((m) => m.type.toLowerCase() === field);\n return matching ? matching.value : null;\n }\n\n numberFormatter(opts = {}) {\n // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave)\n // (in contrast, the rest of the condition is used heavily)\n return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts);\n }\n\n dtFormatter(dt, intlOpts = {}) {\n return new PolyDateFormatter(dt, this.intl, intlOpts);\n }\n\n relFormatter(opts = {}) {\n return new PolyRelFormatter(this.intl, this.isEnglish(), opts);\n }\n\n listFormatter(opts = {}) {\n return getCachedLF(this.intl, opts);\n }\n\n isEnglish() {\n return (\n this.locale === \"en\" ||\n this.locale.toLowerCase() === \"en-us\" ||\n getCachedIntResolvedOptions(this.intl).locale.startsWith(\"en-us\")\n );\n }\n\n getWeekSettings() {\n if (this.weekSettings) {\n return this.weekSettings;\n } else if (!hasLocaleWeekInfo()) {\n return fallbackWeekSettings;\n } else {\n return getCachedWeekInfo(this.locale);\n }\n }\n\n getStartOfWeek() {\n return this.getWeekSettings().firstDay;\n }\n\n getMinDaysInFirstWeek() {\n return this.getWeekSettings().minimalDays;\n }\n\n getWeekendDays() {\n return this.getWeekSettings().weekend;\n }\n\n equals(other) {\n return (\n this.locale === other.locale &&\n this.numberingSystem === other.numberingSystem &&\n this.outputCalendar === other.outputCalendar\n );\n }\n\n toString() {\n return `Locale(${this.locale}, ${this.numberingSystem}, ${this.outputCalendar})`;\n }\n}\n","import { formatOffset, signedOffset } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet singleton = null;\n\n/**\n * A zone with a fixed offset (meaning no DST)\n * @implements {Zone}\n */\nexport default class FixedOffsetZone extends Zone {\n /**\n * Get a singleton instance of UTC\n * @return {FixedOffsetZone}\n */\n static get utcInstance() {\n if (singleton === null) {\n singleton = new FixedOffsetZone(0);\n }\n return singleton;\n }\n\n /**\n * Get an instance with a specified offset\n * @param {number} offset - The offset in minutes\n * @return {FixedOffsetZone}\n */\n static instance(offset) {\n return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset);\n }\n\n /**\n * Get an instance of FixedOffsetZone from a UTC offset string, like \"UTC+6\"\n * @param {string} s - The offset string to parse\n * @example FixedOffsetZone.parseSpecifier(\"UTC+6\")\n * @example FixedOffsetZone.parseSpecifier(\"UTC+06\")\n * @example FixedOffsetZone.parseSpecifier(\"UTC-6:00\")\n * @return {FixedOffsetZone}\n */\n static parseSpecifier(s) {\n if (s) {\n const r = s.match(/^utc(?:([+-]\\d{1,2})(?::(\\d{2}))?)?$/i);\n if (r) {\n return new FixedOffsetZone(signedOffset(r[1], r[2]));\n }\n }\n return null;\n }\n\n constructor(offset) {\n super();\n /** @private **/\n this.fixed = offset;\n }\n\n /**\n * The type of zone. `fixed` for all instances of `FixedOffsetZone`.\n * @override\n * @type {string}\n */\n get type() {\n return \"fixed\";\n }\n\n /**\n * The name of this zone.\n * All fixed zones' names always start with \"UTC\" (plus optional offset)\n * @override\n * @type {string}\n */\n get name() {\n return this.fixed === 0 ? \"UTC\" : `UTC${formatOffset(this.fixed, \"narrow\")}`;\n }\n\n /**\n * The IANA name of this zone, i.e. `Etc/UTC` or `Etc/GMT+/-nn`\n *\n * @override\n * @type {string}\n */\n get ianaName() {\n if (this.fixed === 0) {\n return \"Etc/UTC\";\n } else {\n return `Etc/GMT${formatOffset(-this.fixed, \"narrow\")}`;\n }\n }\n\n /**\n * Returns the offset's common name at the specified timestamp.\n *\n * For fixed offset zones this equals to the zone name.\n * @override\n */\n offsetName() {\n return this.name;\n }\n\n /**\n * Returns the offset's value as a string\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n return formatOffset(this.fixed, format);\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year:\n * Always returns true for all fixed offset zones.\n * @override\n * @type {boolean}\n */\n get isUniversal() {\n return true;\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n *\n * For fixed offset zones, this is constant and does not depend on a timestamp.\n * @override\n * @return {number}\n */\n offset() {\n return this.fixed;\n }\n\n /**\n * Return whether this Zone is equal to another zone (i.e. also fixed and same offset)\n * @override\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n return otherZone.type === \"fixed\" && otherZone.fixed === this.fixed;\n }\n\n /**\n * Return whether this Zone is valid:\n * All fixed offset zones are valid.\n * @override\n * @type {boolean}\n */\n get isValid() {\n return true;\n }\n}\n","import Zone from \"../zone.js\";\n\n/**\n * A zone that failed to parse. You should never need to instantiate this.\n * @implements {Zone}\n */\nexport default class InvalidZone extends Zone {\n constructor(zoneName) {\n super();\n /** @private */\n this.zoneName = zoneName;\n }\n\n /** @override **/\n get type() {\n return \"invalid\";\n }\n\n /** @override **/\n get name() {\n return this.zoneName;\n }\n\n /** @override **/\n get isUniversal() {\n return false;\n }\n\n /** @override **/\n offsetName() {\n return null;\n }\n\n /** @override **/\n formatOffset() {\n return \"\";\n }\n\n /** @override **/\n offset() {\n return NaN;\n }\n\n /** @override **/\n equals() {\n return false;\n }\n\n /** @override **/\n get isValid() {\n return false;\n }\n}\n","/**\n * @private\n */\n\nimport Zone from \"../zone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport InvalidZone from \"../zones/invalidZone.js\";\n\nimport { isUndefined, isString, isNumber } from \"./util.js\";\nimport SystemZone from \"../zones/systemZone.js\";\n\nexport function normalizeZone(input, defaultZone) {\n let offset;\n if (isUndefined(input) || input === null) {\n return defaultZone;\n } else if (input instanceof Zone) {\n return input;\n } else if (isString(input)) {\n const lowered = input.toLowerCase();\n if (lowered === \"default\") return defaultZone;\n else if (lowered === \"local\" || lowered === \"system\") return SystemZone.instance;\n else if (lowered === \"utc\" || lowered === \"gmt\") return FixedOffsetZone.utcInstance;\n else return FixedOffsetZone.parseSpecifier(lowered) || IANAZone.create(input);\n } else if (isNumber(input)) {\n return FixedOffsetZone.instance(input);\n } else if (typeof input === \"object\" && \"offset\" in input && typeof input.offset === \"function\") {\n // This is dumb, but the instanceof check above doesn't seem to really work\n // so we're duck checking it\n return input;\n } else {\n return new InvalidZone(input);\n }\n}\n","const numberingSystems = {\n arab: \"[\\u0660-\\u0669]\",\n arabext: \"[\\u06F0-\\u06F9]\",\n bali: \"[\\u1B50-\\u1B59]\",\n beng: \"[\\u09E6-\\u09EF]\",\n deva: \"[\\u0966-\\u096F]\",\n fullwide: \"[\\uFF10-\\uFF19]\",\n gujr: \"[\\u0AE6-\\u0AEF]\",\n hanidec: \"[〇|一|二|三|四|五|六|七|八|九]\",\n khmr: \"[\\u17E0-\\u17E9]\",\n knda: \"[\\u0CE6-\\u0CEF]\",\n laoo: \"[\\u0ED0-\\u0ED9]\",\n limb: \"[\\u1946-\\u194F]\",\n mlym: \"[\\u0D66-\\u0D6F]\",\n mong: \"[\\u1810-\\u1819]\",\n mymr: \"[\\u1040-\\u1049]\",\n orya: \"[\\u0B66-\\u0B6F]\",\n tamldec: \"[\\u0BE6-\\u0BEF]\",\n telu: \"[\\u0C66-\\u0C6F]\",\n thai: \"[\\u0E50-\\u0E59]\",\n tibt: \"[\\u0F20-\\u0F29]\",\n latn: \"\\\\d\",\n};\n\nconst numberingSystemsUTF16 = {\n arab: [1632, 1641],\n arabext: [1776, 1785],\n bali: [6992, 7001],\n beng: [2534, 2543],\n deva: [2406, 2415],\n fullwide: [65296, 65303],\n gujr: [2790, 2799],\n khmr: [6112, 6121],\n knda: [3302, 3311],\n laoo: [3792, 3801],\n limb: [6470, 6479],\n mlym: [3430, 3439],\n mong: [6160, 6169],\n mymr: [4160, 4169],\n orya: [2918, 2927],\n tamldec: [3046, 3055],\n telu: [3174, 3183],\n thai: [3664, 3673],\n tibt: [3872, 3881],\n};\n\nconst hanidecChars = numberingSystems.hanidec.replace(/[\\[|\\]]/g, \"\").split(\"\");\n\nexport function parseDigits(str) {\n let value = parseInt(str, 10);\n if (isNaN(value)) {\n value = \"\";\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n\n if (str[i].search(numberingSystems.hanidec) !== -1) {\n value += hanidecChars.indexOf(str[i]);\n } else {\n for (const key in numberingSystemsUTF16) {\n const [min, max] = numberingSystemsUTF16[key];\n if (code >= min && code <= max) {\n value += code - min;\n }\n }\n }\n }\n return parseInt(value, 10);\n } else {\n return value;\n }\n}\n\n// cache of {numberingSystem: {append: regex}}\nconst digitRegexCache = new Map();\nexport function resetDigitRegexCache() {\n digitRegexCache.clear();\n}\n\nexport function digitRegex({ numberingSystem }, append = \"\") {\n const ns = numberingSystem || \"latn\";\n\n let appendCache = digitRegexCache.get(ns);\n if (appendCache === undefined) {\n appendCache = new Map();\n digitRegexCache.set(ns, appendCache);\n }\n let regex = appendCache.get(append);\n if (regex === undefined) {\n regex = new RegExp(`${numberingSystems[ns]}${append}`);\n appendCache.set(append, regex);\n }\n\n return regex;\n}\n","import SystemZone from \"./zones/systemZone.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport Locale from \"./impl/locale.js\";\nimport DateTime from \"./datetime.js\";\n\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\nimport { validateWeekSettings } from \"./impl/util.js\";\nimport { resetDigitRegexCache } from \"./impl/digits.js\";\n\nlet now = () => Date.now(),\n defaultZone = \"system\",\n defaultLocale = null,\n defaultNumberingSystem = null,\n defaultOutputCalendar = null,\n twoDigitCutoffYear = 60,\n throwOnInvalid,\n defaultWeekSettings = null;\n\n/**\n * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here.\n */\nexport default class Settings {\n /**\n * Get the callback for returning the current timestamp.\n * @type {function}\n */\n static get now() {\n return now;\n }\n\n /**\n * Set the callback for returning the current timestamp.\n * The function should return a number, which will be interpreted as an Epoch millisecond count\n * @type {function}\n * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future\n * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time\n */\n static set now(n) {\n now = n;\n }\n\n /**\n * Set the default time zone to create DateTimes in. Does not affect existing instances.\n * Use the value \"system\" to reset this value to the system's time zone.\n * @type {string}\n */\n static set defaultZone(zone) {\n defaultZone = zone;\n }\n\n /**\n * Get the default time zone object currently used to create DateTimes. Does not affect existing instances.\n * The default value is the system's time zone (the one set on the machine that runs this code).\n * @type {Zone}\n */\n static get defaultZone() {\n return normalizeZone(defaultZone, SystemZone.instance);\n }\n\n /**\n * Get the default locale to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultLocale() {\n return defaultLocale;\n }\n\n /**\n * Set the default locale to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultLocale(locale) {\n defaultLocale = locale;\n }\n\n /**\n * Get the default numbering system to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultNumberingSystem() {\n return defaultNumberingSystem;\n }\n\n /**\n * Set the default numbering system to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultNumberingSystem(numberingSystem) {\n defaultNumberingSystem = numberingSystem;\n }\n\n /**\n * Get the default output calendar to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultOutputCalendar() {\n return defaultOutputCalendar;\n }\n\n /**\n * Set the default output calendar to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultOutputCalendar(outputCalendar) {\n defaultOutputCalendar = outputCalendar;\n }\n\n /**\n * @typedef {Object} WeekSettings\n * @property {number} firstDay\n * @property {number} minimalDays\n * @property {number[]} weekend\n */\n\n /**\n * @return {WeekSettings|null}\n */\n static get defaultWeekSettings() {\n return defaultWeekSettings;\n }\n\n /**\n * Allows overriding the default locale week settings, i.e. the start of the week, the weekend and\n * how many days are required in the first week of a year.\n * Does not affect existing instances.\n *\n * @param {WeekSettings|null} weekSettings\n */\n static set defaultWeekSettings(weekSettings) {\n defaultWeekSettings = validateWeekSettings(weekSettings);\n }\n\n /**\n * Get the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx.\n * @type {number}\n */\n static get twoDigitCutoffYear() {\n return twoDigitCutoffYear;\n }\n\n /**\n * Set the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx.\n * @type {number}\n * @example Settings.twoDigitCutoffYear = 0 // all 'yy' are interpreted as 20th century\n * @example Settings.twoDigitCutoffYear = 99 // all 'yy' are interpreted as 21st century\n * @example Settings.twoDigitCutoffYear = 50 // '49' -> 2049; '50' -> 1950\n * @example Settings.twoDigitCutoffYear = 1950 // interpreted as 50\n * @example Settings.twoDigitCutoffYear = 2050 // ALSO interpreted as 50\n */\n static set twoDigitCutoffYear(cutoffYear) {\n twoDigitCutoffYear = cutoffYear % 100;\n }\n\n /**\n * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n * @type {boolean}\n */\n static get throwOnInvalid() {\n return throwOnInvalid;\n }\n\n /**\n * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n * @type {boolean}\n */\n static set throwOnInvalid(t) {\n throwOnInvalid = t;\n }\n\n /**\n * Reset Luxon's global caches. Should only be necessary in testing scenarios.\n * @return {void}\n */\n static resetCaches() {\n Locale.resetCache();\n IANAZone.resetCache();\n DateTime.resetCache();\n resetDigitRegexCache();\n }\n}\n","export default class Invalid {\n constructor(reason, explanation) {\n this.reason = reason;\n this.explanation = explanation;\n }\n\n toMessage() {\n if (this.explanation) {\n return `${this.reason}: ${this.explanation}`;\n } else {\n return this.reason;\n }\n }\n}\n","import {\n integerBetween,\n isLeapYear,\n timeObject,\n daysInYear,\n daysInMonth,\n weeksInWeekYear,\n isInteger,\n isUndefined,\n} from \"./util.js\";\nimport Invalid from \"./invalid.js\";\nimport { ConflictingSpecificationError } from \"../errors.js\";\n\nconst nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334],\n leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335];\n\nfunction unitOutOfRange(unit, value) {\n return new Invalid(\n \"unit out of range\",\n `you specified ${value} (of type ${typeof value}) as a ${unit}, which is invalid`\n );\n}\n\nexport function dayOfWeek(year, month, day) {\n const d = new Date(Date.UTC(year, month - 1, day));\n\n if (year < 100 && year >= 0) {\n d.setUTCFullYear(d.getUTCFullYear() - 1900);\n }\n\n const js = d.getUTCDay();\n\n return js === 0 ? 7 : js;\n}\n\nfunction computeOrdinal(year, month, day) {\n return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1];\n}\n\nfunction uncomputeOrdinal(year, ordinal) {\n const table = isLeapYear(year) ? leapLadder : nonLeapLadder,\n month0 = table.findIndex((i) => i < ordinal),\n day = ordinal - table[month0];\n return { month: month0 + 1, day };\n}\n\nexport function isoWeekdayToLocal(isoWeekday, startOfWeek) {\n return ((isoWeekday - startOfWeek + 7) % 7) + 1;\n}\n\n/**\n * @private\n */\n\nexport function gregorianToWeek(gregObj, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const { year, month, day } = gregObj,\n ordinal = computeOrdinal(year, month, day),\n weekday = isoWeekdayToLocal(dayOfWeek(year, month, day), startOfWeek);\n\n let weekNumber = Math.floor((ordinal - weekday + 14 - minDaysInFirstWeek) / 7),\n weekYear;\n\n if (weekNumber < 1) {\n weekYear = year - 1;\n weekNumber = weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek);\n } else if (weekNumber > weeksInWeekYear(year, minDaysInFirstWeek, startOfWeek)) {\n weekYear = year + 1;\n weekNumber = 1;\n } else {\n weekYear = year;\n }\n\n return { weekYear, weekNumber, weekday, ...timeObject(gregObj) };\n}\n\nexport function weekToGregorian(weekData, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const { weekYear, weekNumber, weekday } = weekData,\n weekdayOfJan4 = isoWeekdayToLocal(dayOfWeek(weekYear, 1, minDaysInFirstWeek), startOfWeek),\n yearInDays = daysInYear(weekYear);\n\n let ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 7 + minDaysInFirstWeek,\n year;\n\n if (ordinal < 1) {\n year = weekYear - 1;\n ordinal += daysInYear(year);\n } else if (ordinal > yearInDays) {\n year = weekYear + 1;\n ordinal -= daysInYear(weekYear);\n } else {\n year = weekYear;\n }\n\n const { month, day } = uncomputeOrdinal(year, ordinal);\n return { year, month, day, ...timeObject(weekData) };\n}\n\nexport function gregorianToOrdinal(gregData) {\n const { year, month, day } = gregData;\n const ordinal = computeOrdinal(year, month, day);\n return { year, ordinal, ...timeObject(gregData) };\n}\n\nexport function ordinalToGregorian(ordinalData) {\n const { year, ordinal } = ordinalData;\n const { month, day } = uncomputeOrdinal(year, ordinal);\n return { year, month, day, ...timeObject(ordinalData) };\n}\n\n/**\n * Check if local week units like localWeekday are used in obj.\n * If so, validates that they are not mixed with ISO week units and then copies them to the normal week unit properties.\n * Modifies obj in-place!\n * @param obj the object values\n */\nexport function usesLocalWeekValues(obj, loc) {\n const hasLocaleWeekData =\n !isUndefined(obj.localWeekday) ||\n !isUndefined(obj.localWeekNumber) ||\n !isUndefined(obj.localWeekYear);\n if (hasLocaleWeekData) {\n const hasIsoWeekData =\n !isUndefined(obj.weekday) || !isUndefined(obj.weekNumber) || !isUndefined(obj.weekYear);\n\n if (hasIsoWeekData) {\n throw new ConflictingSpecificationError(\n \"Cannot mix locale-based week fields with ISO-based week fields\"\n );\n }\n if (!isUndefined(obj.localWeekday)) obj.weekday = obj.localWeekday;\n if (!isUndefined(obj.localWeekNumber)) obj.weekNumber = obj.localWeekNumber;\n if (!isUndefined(obj.localWeekYear)) obj.weekYear = obj.localWeekYear;\n delete obj.localWeekday;\n delete obj.localWeekNumber;\n delete obj.localWeekYear;\n return {\n minDaysInFirstWeek: loc.getMinDaysInFirstWeek(),\n startOfWeek: loc.getStartOfWeek(),\n };\n } else {\n return { minDaysInFirstWeek: 4, startOfWeek: 1 };\n }\n}\n\nexport function hasInvalidWeekData(obj, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const validYear = isInteger(obj.weekYear),\n validWeek = integerBetween(\n obj.weekNumber,\n 1,\n weeksInWeekYear(obj.weekYear, minDaysInFirstWeek, startOfWeek)\n ),\n validWeekday = integerBetween(obj.weekday, 1, 7);\n\n if (!validYear) {\n return unitOutOfRange(\"weekYear\", obj.weekYear);\n } else if (!validWeek) {\n return unitOutOfRange(\"week\", obj.weekNumber);\n } else if (!validWeekday) {\n return unitOutOfRange(\"weekday\", obj.weekday);\n } else return false;\n}\n\nexport function hasInvalidOrdinalData(obj) {\n const validYear = isInteger(obj.year),\n validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year));\n\n if (!validYear) {\n return unitOutOfRange(\"year\", obj.year);\n } else if (!validOrdinal) {\n return unitOutOfRange(\"ordinal\", obj.ordinal);\n } else return false;\n}\n\nexport function hasInvalidGregorianData(obj) {\n const validYear = isInteger(obj.year),\n validMonth = integerBetween(obj.month, 1, 12),\n validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month));\n\n if (!validYear) {\n return unitOutOfRange(\"year\", obj.year);\n } else if (!validMonth) {\n return unitOutOfRange(\"month\", obj.month);\n } else if (!validDay) {\n return unitOutOfRange(\"day\", obj.day);\n } else return false;\n}\n\nexport function hasInvalidTimeData(obj) {\n const { hour, minute, second, millisecond } = obj;\n const validHour =\n integerBetween(hour, 0, 23) ||\n (hour === 24 && minute === 0 && second === 0 && millisecond === 0),\n validMinute = integerBetween(minute, 0, 59),\n validSecond = integerBetween(second, 0, 59),\n validMillisecond = integerBetween(millisecond, 0, 999);\n\n if (!validHour) {\n return unitOutOfRange(\"hour\", hour);\n } else if (!validMinute) {\n return unitOutOfRange(\"minute\", minute);\n } else if (!validSecond) {\n return unitOutOfRange(\"second\", second);\n } else if (!validMillisecond) {\n return unitOutOfRange(\"millisecond\", millisecond);\n } else return false;\n}\n","/*\n This is just a junk drawer, containing anything used across multiple classes.\n Because Luxon is small(ish), this should stay small and we won't worry about splitting\n it up into, say, parsingUtil.js and basicUtil.js and so on. But they are divided up by feature area.\n*/\n\nimport { InvalidArgumentError } from \"../errors.js\";\nimport Settings from \"../settings.js\";\nimport { dayOfWeek, isoWeekdayToLocal } from \"./conversions.js\";\n\n/**\n * @private\n */\n\n// TYPES\n\nexport function isUndefined(o) {\n return typeof o === \"undefined\";\n}\n\nexport function isNumber(o) {\n return typeof o === \"number\";\n}\n\nexport function isInteger(o) {\n return typeof o === \"number\" && o % 1 === 0;\n}\n\nexport function isString(o) {\n return typeof o === \"string\";\n}\n\nexport function isDate(o) {\n return Object.prototype.toString.call(o) === \"[object Date]\";\n}\n\n// CAPABILITIES\n\nexport function hasRelative() {\n try {\n return typeof Intl !== \"undefined\" && !!Intl.RelativeTimeFormat;\n } catch (e) {\n return false;\n }\n}\n\nexport function hasLocaleWeekInfo() {\n try {\n return (\n typeof Intl !== \"undefined\" &&\n !!Intl.Locale &&\n (\"weekInfo\" in Intl.Locale.prototype || \"getWeekInfo\" in Intl.Locale.prototype)\n );\n } catch (e) {\n return false;\n }\n}\n\n// OBJECTS AND ARRAYS\n\nexport function maybeArray(thing) {\n return Array.isArray(thing) ? thing : [thing];\n}\n\nexport function bestBy(arr, by, compare) {\n if (arr.length === 0) {\n return undefined;\n }\n return arr.reduce((best, next) => {\n const pair = [by(next), next];\n if (!best) {\n return pair;\n } else if (compare(best[0], pair[0]) === best[0]) {\n return best;\n } else {\n return pair;\n }\n }, null)[1];\n}\n\nexport function pick(obj, keys) {\n return keys.reduce((a, k) => {\n a[k] = obj[k];\n return a;\n }, {});\n}\n\nexport function hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nexport function validateWeekSettings(settings) {\n if (settings == null) {\n return null;\n } else if (typeof settings !== \"object\") {\n throw new InvalidArgumentError(\"Week settings must be an object\");\n } else {\n if (\n !integerBetween(settings.firstDay, 1, 7) ||\n !integerBetween(settings.minimalDays, 1, 7) ||\n !Array.isArray(settings.weekend) ||\n settings.weekend.some((v) => !integerBetween(v, 1, 7))\n ) {\n throw new InvalidArgumentError(\"Invalid week settings\");\n }\n return {\n firstDay: settings.firstDay,\n minimalDays: settings.minimalDays,\n weekend: Array.from(settings.weekend),\n };\n }\n}\n\n// NUMBERS AND STRINGS\n\nexport function integerBetween(thing, bottom, top) {\n return isInteger(thing) && thing >= bottom && thing <= top;\n}\n\n// x % n but takes the sign of n instead of x\nexport function floorMod(x, n) {\n return x - n * Math.floor(x / n);\n}\n\nexport function padStart(input, n = 2) {\n const isNeg = input < 0;\n let padded;\n if (isNeg) {\n padded = \"-\" + (\"\" + -input).padStart(n, \"0\");\n } else {\n padded = (\"\" + input).padStart(n, \"0\");\n }\n return padded;\n}\n\nexport function parseInteger(string) {\n if (isUndefined(string) || string === null || string === \"\") {\n return undefined;\n } else {\n return parseInt(string, 10);\n }\n}\n\nexport function parseFloating(string) {\n if (isUndefined(string) || string === null || string === \"\") {\n return undefined;\n } else {\n return parseFloat(string);\n }\n}\n\nexport function parseMillis(fraction) {\n // Return undefined (instead of 0) in these cases, where fraction is not set\n if (isUndefined(fraction) || fraction === null || fraction === \"\") {\n return undefined;\n } else {\n const f = parseFloat(\"0.\" + fraction) * 1000;\n return Math.floor(f);\n }\n}\n\nexport function roundTo(number, digits, rounding = \"round\") {\n const factor = 10 ** digits;\n switch (rounding) {\n case \"expand\":\n return number > 0\n ? Math.ceil(number * factor) / factor\n : Math.floor(number * factor) / factor;\n case \"trunc\":\n return Math.trunc(number * factor) / factor;\n case \"round\":\n return Math.round(number * factor) / factor;\n case \"floor\":\n return Math.floor(number * factor) / factor;\n case \"ceil\":\n return Math.ceil(number * factor) / factor;\n default:\n throw new RangeError(`Value rounding ${rounding} is out of range`);\n }\n}\n\n// DATE BASICS\n\nexport function isLeapYear(year) {\n return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n}\n\nexport function daysInYear(year) {\n return isLeapYear(year) ? 366 : 365;\n}\n\nexport function daysInMonth(year, month) {\n const modMonth = floorMod(month - 1, 12) + 1,\n modYear = year + (month - modMonth) / 12;\n\n if (modMonth === 2) {\n return isLeapYear(modYear) ? 29 : 28;\n } else {\n return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1];\n }\n}\n\n// convert a calendar object to a local timestamp (epoch, but with the offset baked in)\nexport function objToLocalTS(obj) {\n let d = Date.UTC(\n obj.year,\n obj.month - 1,\n obj.day,\n obj.hour,\n obj.minute,\n obj.second,\n obj.millisecond\n );\n\n // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that\n if (obj.year < 100 && obj.year >= 0) {\n d = new Date(d);\n // set the month and day again, this is necessary because year 2000 is a leap year, but year 100 is not\n // so if obj.year is in 99, but obj.day makes it roll over into year 100,\n // the calculations done by Date.UTC are using year 2000 - which is incorrect\n d.setUTCFullYear(obj.year, obj.month - 1, obj.day);\n }\n return +d;\n}\n\n// adapted from moment.js: https://github.com/moment/moment/blob/000ac1800e620f770f4eb31b5ae908f6167b0ab2/src/lib/units/week-calendar-utils.js\nfunction firstWeekOffset(year, minDaysInFirstWeek, startOfWeek) {\n const fwdlw = isoWeekdayToLocal(dayOfWeek(year, 1, minDaysInFirstWeek), startOfWeek);\n return -fwdlw + minDaysInFirstWeek - 1;\n}\n\nexport function weeksInWeekYear(weekYear, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const weekOffset = firstWeekOffset(weekYear, minDaysInFirstWeek, startOfWeek);\n const weekOffsetNext = firstWeekOffset(weekYear + 1, minDaysInFirstWeek, startOfWeek);\n return (daysInYear(weekYear) - weekOffset + weekOffsetNext) / 7;\n}\n\nexport function untruncateYear(year) {\n if (year > 99) {\n return year;\n } else return year > Settings.twoDigitCutoffYear ? 1900 + year : 2000 + year;\n}\n\n// PARSING\n\nexport function parseZoneInfo(ts, offsetFormat, locale, timeZone = null) {\n const date = new Date(ts),\n intlOpts = {\n hourCycle: \"h23\",\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n };\n\n if (timeZone) {\n intlOpts.timeZone = timeZone;\n }\n\n const modified = { timeZoneName: offsetFormat, ...intlOpts };\n\n const parsed = new Intl.DateTimeFormat(locale, modified)\n .formatToParts(date)\n .find((m) => m.type.toLowerCase() === \"timezonename\");\n return parsed ? parsed.value : null;\n}\n\n// signedOffset('-5', '30') -> -330\nexport function signedOffset(offHourStr, offMinuteStr) {\n let offHour = parseInt(offHourStr, 10);\n\n // don't || this because we want to preserve -0\n if (Number.isNaN(offHour)) {\n offHour = 0;\n }\n\n const offMin = parseInt(offMinuteStr, 10) || 0,\n offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin;\n return offHour * 60 + offMinSigned;\n}\n\n// COERCION\n\nexport function asNumber(value) {\n const numericValue = Number(value);\n if (typeof value === \"boolean\" || value === \"\" || !Number.isFinite(numericValue))\n throw new InvalidArgumentError(`Invalid unit value ${value}`);\n return numericValue;\n}\n\nexport function normalizeObject(obj, normalizer) {\n const normalized = {};\n for (const u in obj) {\n if (hasOwnProperty(obj, u)) {\n const v = obj[u];\n if (v === undefined || v === null) continue;\n normalized[normalizer(u)] = asNumber(v);\n }\n }\n return normalized;\n}\n\n/**\n * Returns the offset's value as a string\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\nexport function formatOffset(offset, format) {\n const hours = Math.trunc(Math.abs(offset / 60)),\n minutes = Math.trunc(Math.abs(offset % 60)),\n sign = offset >= 0 ? \"+\" : \"-\";\n\n switch (format) {\n case \"short\":\n return `${sign}${padStart(hours, 2)}:${padStart(minutes, 2)}`;\n case \"narrow\":\n return `${sign}${hours}${minutes > 0 ? `:${minutes}` : \"\"}`;\n case \"techie\":\n return `${sign}${padStart(hours, 2)}${padStart(minutes, 2)}`;\n default:\n throw new RangeError(`Value format ${format} is out of range for property format`);\n }\n}\n\nexport function timeObject(obj) {\n return pick(obj, [\"hour\", \"minute\", \"second\", \"millisecond\"]);\n}\n","import * as Formats from \"./formats.js\";\nimport { pick } from \"./util.js\";\n\nfunction stringify(obj) {\n return JSON.stringify(obj, Object.keys(obj).sort());\n}\n\n/**\n * @private\n */\n\nexport const monthsLong = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\nexport const monthsShort = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n];\n\nexport const monthsNarrow = [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"];\n\nexport function months(length) {\n switch (length) {\n case \"narrow\":\n return [...monthsNarrow];\n case \"short\":\n return [...monthsShort];\n case \"long\":\n return [...monthsLong];\n case \"numeric\":\n return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\"];\n case \"2-digit\":\n return [\"01\", \"02\", \"03\", \"04\", \"05\", \"06\", \"07\", \"08\", \"09\", \"10\", \"11\", \"12\"];\n default:\n return null;\n }\n}\n\nexport const weekdaysLong = [\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n \"Sunday\",\n];\n\nexport const weekdaysShort = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\n\nexport const weekdaysNarrow = [\"M\", \"T\", \"W\", \"T\", \"F\", \"S\", \"S\"];\n\nexport function weekdays(length) {\n switch (length) {\n case \"narrow\":\n return [...weekdaysNarrow];\n case \"short\":\n return [...weekdaysShort];\n case \"long\":\n return [...weekdaysLong];\n case \"numeric\":\n return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\"];\n default:\n return null;\n }\n}\n\nexport const meridiems = [\"AM\", \"PM\"];\n\nexport const erasLong = [\"Before Christ\", \"Anno Domini\"];\n\nexport const erasShort = [\"BC\", \"AD\"];\n\nexport const erasNarrow = [\"B\", \"A\"];\n\nexport function eras(length) {\n switch (length) {\n case \"narrow\":\n return [...erasNarrow];\n case \"short\":\n return [...erasShort];\n case \"long\":\n return [...erasLong];\n default:\n return null;\n }\n}\n\nexport function meridiemForDateTime(dt) {\n return meridiems[dt.hour < 12 ? 0 : 1];\n}\n\nexport function weekdayForDateTime(dt, length) {\n return weekdays(length)[dt.weekday - 1];\n}\n\nexport function monthForDateTime(dt, length) {\n return months(length)[dt.month - 1];\n}\n\nexport function eraForDateTime(dt, length) {\n return eras(length)[dt.year < 0 ? 0 : 1];\n}\n\nexport function formatRelativeTime(unit, count, numeric = \"always\", narrow = false) {\n const units = {\n years: [\"year\", \"yr.\"],\n quarters: [\"quarter\", \"qtr.\"],\n months: [\"month\", \"mo.\"],\n weeks: [\"week\", \"wk.\"],\n days: [\"day\", \"day\", \"days\"],\n hours: [\"hour\", \"hr.\"],\n minutes: [\"minute\", \"min.\"],\n seconds: [\"second\", \"sec.\"],\n };\n\n const lastable = [\"hours\", \"minutes\", \"seconds\"].indexOf(unit) === -1;\n\n if (numeric === \"auto\" && lastable) {\n const isDay = unit === \"days\";\n switch (count) {\n case 1:\n return isDay ? \"tomorrow\" : `next ${units[unit][0]}`;\n case -1:\n return isDay ? \"yesterday\" : `last ${units[unit][0]}`;\n case 0:\n return isDay ? \"today\" : `this ${units[unit][0]}`;\n default: // fall through\n }\n }\n\n const isInPast = Object.is(count, -0) || count < 0,\n fmtValue = Math.abs(count),\n singular = fmtValue === 1,\n lilUnits = units[unit],\n fmtUnit = narrow\n ? singular\n ? lilUnits[1]\n : lilUnits[2] || lilUnits[1]\n : singular\n ? units[unit][0]\n : unit;\n return isInPast ? `${fmtValue} ${fmtUnit} ago` : `in ${fmtValue} ${fmtUnit}`;\n}\n\nexport function formatString(knownFormat) {\n // these all have the offsets removed because we don't have access to them\n // without all the intl stuff this is backfilling\n const filtered = pick(knownFormat, [\n \"weekday\",\n \"era\",\n \"year\",\n \"month\",\n \"day\",\n \"hour\",\n \"minute\",\n \"second\",\n \"timeZoneName\",\n \"hourCycle\",\n ]),\n key = stringify(filtered),\n dateTimeHuge = \"EEEE, LLLL d, yyyy, h:mm a\";\n switch (key) {\n case stringify(Formats.DATE_SHORT):\n return \"M/d/yyyy\";\n case stringify(Formats.DATE_MED):\n return \"LLL d, yyyy\";\n case stringify(Formats.DATE_MED_WITH_WEEKDAY):\n return \"EEE, LLL d, yyyy\";\n case stringify(Formats.DATE_FULL):\n return \"LLLL d, yyyy\";\n case stringify(Formats.DATE_HUGE):\n return \"EEEE, LLLL d, yyyy\";\n case stringify(Formats.TIME_SIMPLE):\n return \"h:mm a\";\n case stringify(Formats.TIME_WITH_SECONDS):\n return \"h:mm:ss a\";\n case stringify(Formats.TIME_WITH_SHORT_OFFSET):\n return \"h:mm a\";\n case stringify(Formats.TIME_WITH_LONG_OFFSET):\n return \"h:mm a\";\n case stringify(Formats.TIME_24_SIMPLE):\n return \"HH:mm\";\n case stringify(Formats.TIME_24_WITH_SECONDS):\n return \"HH:mm:ss\";\n case stringify(Formats.TIME_24_WITH_SHORT_OFFSET):\n return \"HH:mm\";\n case stringify(Formats.TIME_24_WITH_LONG_OFFSET):\n return \"HH:mm\";\n case stringify(Formats.DATETIME_SHORT):\n return \"M/d/yyyy, h:mm a\";\n case stringify(Formats.DATETIME_MED):\n return \"LLL d, yyyy, h:mm a\";\n case stringify(Formats.DATETIME_FULL):\n return \"LLLL d, yyyy, h:mm a\";\n case stringify(Formats.DATETIME_HUGE):\n return dateTimeHuge;\n case stringify(Formats.DATETIME_SHORT_WITH_SECONDS):\n return \"M/d/yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_MED_WITH_SECONDS):\n return \"LLL d, yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_MED_WITH_WEEKDAY):\n return \"EEE, d LLL yyyy, h:mm a\";\n case stringify(Formats.DATETIME_FULL_WITH_SECONDS):\n return \"LLLL d, yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_HUGE_WITH_SECONDS):\n return \"EEEE, LLLL d, yyyy, h:mm:ss a\";\n default:\n return dateTimeHuge;\n }\n}\n","import * as English from \"./english.js\";\nimport * as Formats from \"./formats.js\";\nimport { padStart } from \"./util.js\";\n\nfunction stringifyTokens(splits, tokenToString) {\n let s = \"\";\n for (const token of splits) {\n if (token.literal) {\n s += token.val;\n } else {\n s += tokenToString(token.val);\n }\n }\n return s;\n}\n\nconst macroTokenToFormatOpts = {\n D: Formats.DATE_SHORT,\n DD: Formats.DATE_MED,\n DDD: Formats.DATE_FULL,\n DDDD: Formats.DATE_HUGE,\n t: Formats.TIME_SIMPLE,\n tt: Formats.TIME_WITH_SECONDS,\n ttt: Formats.TIME_WITH_SHORT_OFFSET,\n tttt: Formats.TIME_WITH_LONG_OFFSET,\n T: Formats.TIME_24_SIMPLE,\n TT: Formats.TIME_24_WITH_SECONDS,\n TTT: Formats.TIME_24_WITH_SHORT_OFFSET,\n TTTT: Formats.TIME_24_WITH_LONG_OFFSET,\n f: Formats.DATETIME_SHORT,\n ff: Formats.DATETIME_MED,\n fff: Formats.DATETIME_FULL,\n ffff: Formats.DATETIME_HUGE,\n F: Formats.DATETIME_SHORT_WITH_SECONDS,\n FF: Formats.DATETIME_MED_WITH_SECONDS,\n FFF: Formats.DATETIME_FULL_WITH_SECONDS,\n FFFF: Formats.DATETIME_HUGE_WITH_SECONDS,\n};\n\n/**\n * @private\n */\n\nexport default class Formatter {\n static create(locale, opts = {}) {\n return new Formatter(locale, opts);\n }\n\n static parseFormat(fmt) {\n // white-space is always considered a literal in user-provided formats\n // the \" \" token has a special meaning (see unitForToken)\n\n let current = null,\n currentFull = \"\",\n bracketed = false;\n const splits = [];\n for (let i = 0; i < fmt.length; i++) {\n const c = fmt.charAt(i);\n if (c === \"'\") {\n // turn '' into a literal signal quote instead of just skipping the empty literal\n if (currentFull.length > 0 || bracketed) {\n splits.push({\n literal: bracketed || /^\\s+$/.test(currentFull),\n val: currentFull === \"\" ? \"'\" : currentFull,\n });\n }\n current = null;\n currentFull = \"\";\n bracketed = !bracketed;\n } else if (bracketed) {\n currentFull += c;\n } else if (c === current) {\n currentFull += c;\n } else {\n if (currentFull.length > 0) {\n splits.push({ literal: /^\\s+$/.test(currentFull), val: currentFull });\n }\n currentFull = c;\n current = c;\n }\n }\n\n if (currentFull.length > 0) {\n splits.push({ literal: bracketed || /^\\s+$/.test(currentFull), val: currentFull });\n }\n\n return splits;\n }\n\n static macroTokenToFormatOpts(token) {\n return macroTokenToFormatOpts[token];\n }\n\n constructor(locale, formatOpts) {\n this.opts = formatOpts;\n this.loc = locale;\n this.systemLoc = null;\n }\n\n formatWithSystemDefault(dt, opts) {\n if (this.systemLoc === null) {\n this.systemLoc = this.loc.redefaultToSystem();\n }\n const df = this.systemLoc.dtFormatter(dt, { ...this.opts, ...opts });\n return df.format();\n }\n\n dtFormatter(dt, opts = {}) {\n return this.loc.dtFormatter(dt, { ...this.opts, ...opts });\n }\n\n formatDateTime(dt, opts) {\n return this.dtFormatter(dt, opts).format();\n }\n\n formatDateTimeParts(dt, opts) {\n return this.dtFormatter(dt, opts).formatToParts();\n }\n\n formatInterval(interval, opts) {\n const df = this.dtFormatter(interval.start, opts);\n return df.dtf.formatRange(interval.start.toJSDate(), interval.end.toJSDate());\n }\n\n resolvedOptions(dt, opts) {\n return this.dtFormatter(dt, opts).resolvedOptions();\n }\n\n num(n, p = 0, signDisplay = undefined) {\n // we get some perf out of doing this here, annoyingly\n if (this.opts.forceSimple) {\n return padStart(n, p);\n }\n\n const opts = { ...this.opts };\n\n if (p > 0) {\n opts.padTo = p;\n }\n if (signDisplay) {\n opts.signDisplay = signDisplay;\n }\n\n return this.loc.numberFormatter(opts).format(n);\n }\n\n formatDateTimeFromString(dt, fmt) {\n const knownEnglish = this.loc.listingMode() === \"en\",\n useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== \"gregory\",\n string = (opts, extract) => this.loc.extract(dt, opts, extract),\n formatOffset = (opts) => {\n if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) {\n return \"Z\";\n }\n\n return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : \"\";\n },\n meridiem = () =>\n knownEnglish\n ? English.meridiemForDateTime(dt)\n : string({ hour: \"numeric\", hourCycle: \"h12\" }, \"dayperiod\"),\n month = (length, standalone) =>\n knownEnglish\n ? English.monthForDateTime(dt, length)\n : string(standalone ? { month: length } : { month: length, day: \"numeric\" }, \"month\"),\n weekday = (length, standalone) =>\n knownEnglish\n ? English.weekdayForDateTime(dt, length)\n : string(\n standalone ? { weekday: length } : { weekday: length, month: \"long\", day: \"numeric\" },\n \"weekday\"\n ),\n maybeMacro = (token) => {\n const formatOpts = Formatter.macroTokenToFormatOpts(token);\n if (formatOpts) {\n return this.formatWithSystemDefault(dt, formatOpts);\n } else {\n return token;\n }\n },\n era = (length) =>\n knownEnglish ? English.eraForDateTime(dt, length) : string({ era: length }, \"era\"),\n tokenToString = (token) => {\n // Where possible: https://cldr.unicode.org/translation/date-time/date-time-symbols\n switch (token) {\n // ms\n case \"S\":\n return this.num(dt.millisecond);\n case \"u\":\n // falls through\n case \"SSS\":\n return this.num(dt.millisecond, 3);\n // seconds\n case \"s\":\n return this.num(dt.second);\n case \"ss\":\n return this.num(dt.second, 2);\n // fractional seconds\n case \"uu\":\n return this.num(Math.floor(dt.millisecond / 10), 2);\n case \"uuu\":\n return this.num(Math.floor(dt.millisecond / 100));\n // minutes\n case \"m\":\n return this.num(dt.minute);\n case \"mm\":\n return this.num(dt.minute, 2);\n // hours\n case \"h\":\n return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12);\n case \"hh\":\n return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2);\n case \"H\":\n return this.num(dt.hour);\n case \"HH\":\n return this.num(dt.hour, 2);\n // offset\n case \"Z\":\n // like +6\n return formatOffset({ format: \"narrow\", allowZ: this.opts.allowZ });\n case \"ZZ\":\n // like +06:00\n return formatOffset({ format: \"short\", allowZ: this.opts.allowZ });\n case \"ZZZ\":\n // like +0600\n return formatOffset({ format: \"techie\", allowZ: this.opts.allowZ });\n case \"ZZZZ\":\n // like EST\n return dt.zone.offsetName(dt.ts, { format: \"short\", locale: this.loc.locale });\n case \"ZZZZZ\":\n // like Eastern Standard Time\n return dt.zone.offsetName(dt.ts, { format: \"long\", locale: this.loc.locale });\n // zone\n case \"z\":\n // like America/New_York\n return dt.zoneName;\n // meridiems\n case \"a\":\n return meridiem();\n // dates\n case \"d\":\n return useDateTimeFormatter ? string({ day: \"numeric\" }, \"day\") : this.num(dt.day);\n case \"dd\":\n return useDateTimeFormatter ? string({ day: \"2-digit\" }, \"day\") : this.num(dt.day, 2);\n // weekdays - standalone\n case \"c\":\n // like 1\n return this.num(dt.weekday);\n case \"ccc\":\n // like 'Tues'\n return weekday(\"short\", true);\n case \"cccc\":\n // like 'Tuesday'\n return weekday(\"long\", true);\n case \"ccccc\":\n // like 'T'\n return weekday(\"narrow\", true);\n // weekdays - format\n case \"E\":\n // like 1\n return this.num(dt.weekday);\n case \"EEE\":\n // like 'Tues'\n return weekday(\"short\", false);\n case \"EEEE\":\n // like 'Tuesday'\n return weekday(\"long\", false);\n case \"EEEEE\":\n // like 'T'\n return weekday(\"narrow\", false);\n // months - standalone\n case \"L\":\n // like 1\n return useDateTimeFormatter\n ? string({ month: \"numeric\", day: \"numeric\" }, \"month\")\n : this.num(dt.month);\n case \"LL\":\n // like 01, doesn't seem to work\n return useDateTimeFormatter\n ? string({ month: \"2-digit\", day: \"numeric\" }, \"month\")\n : this.num(dt.month, 2);\n case \"LLL\":\n // like Jan\n return month(\"short\", true);\n case \"LLLL\":\n // like January\n return month(\"long\", true);\n case \"LLLLL\":\n // like J\n return month(\"narrow\", true);\n // months - format\n case \"M\":\n // like 1\n return useDateTimeFormatter\n ? string({ month: \"numeric\" }, \"month\")\n : this.num(dt.month);\n case \"MM\":\n // like 01\n return useDateTimeFormatter\n ? string({ month: \"2-digit\" }, \"month\")\n : this.num(dt.month, 2);\n case \"MMM\":\n // like Jan\n return month(\"short\", false);\n case \"MMMM\":\n // like January\n return month(\"long\", false);\n case \"MMMMM\":\n // like J\n return month(\"narrow\", false);\n // years\n case \"y\":\n // like 2014\n return useDateTimeFormatter ? string({ year: \"numeric\" }, \"year\") : this.num(dt.year);\n case \"yy\":\n // like 14\n return useDateTimeFormatter\n ? string({ year: \"2-digit\" }, \"year\")\n : this.num(dt.year.toString().slice(-2), 2);\n case \"yyyy\":\n // like 0012\n return useDateTimeFormatter\n ? string({ year: \"numeric\" }, \"year\")\n : this.num(dt.year, 4);\n case \"yyyyyy\":\n // like 000012\n return useDateTimeFormatter\n ? string({ year: \"numeric\" }, \"year\")\n : this.num(dt.year, 6);\n // eras\n case \"G\":\n // like AD\n return era(\"short\");\n case \"GG\":\n // like Anno Domini\n return era(\"long\");\n case \"GGGGG\":\n return era(\"narrow\");\n case \"kk\":\n return this.num(dt.weekYear.toString().slice(-2), 2);\n case \"kkkk\":\n return this.num(dt.weekYear, 4);\n case \"W\":\n return this.num(dt.weekNumber);\n case \"WW\":\n return this.num(dt.weekNumber, 2);\n case \"n\":\n return this.num(dt.localWeekNumber);\n case \"nn\":\n return this.num(dt.localWeekNumber, 2);\n case \"ii\":\n return this.num(dt.localWeekYear.toString().slice(-2), 2);\n case \"iiii\":\n return this.num(dt.localWeekYear, 4);\n case \"o\":\n return this.num(dt.ordinal);\n case \"ooo\":\n return this.num(dt.ordinal, 3);\n case \"q\":\n // like 1\n return this.num(dt.quarter);\n case \"qq\":\n // like 01\n return this.num(dt.quarter, 2);\n case \"X\":\n return this.num(Math.floor(dt.ts / 1000));\n case \"x\":\n return this.num(dt.ts);\n default:\n return maybeMacro(token);\n }\n };\n\n return stringifyTokens(Formatter.parseFormat(fmt), tokenToString);\n }\n\n formatDurationFromString(dur, fmt) {\n const invertLargest = this.opts.signMode === \"negativeLargestOnly\" ? -1 : 1;\n const tokenToField = (token) => {\n switch (token[0]) {\n case \"S\":\n return \"milliseconds\";\n case \"s\":\n return \"seconds\";\n case \"m\":\n return \"minutes\";\n case \"h\":\n return \"hours\";\n case \"d\":\n return \"days\";\n case \"w\":\n return \"weeks\";\n case \"M\":\n return \"months\";\n case \"y\":\n return \"years\";\n default:\n return null;\n }\n },\n tokenToString = (lildur, info) => (token) => {\n const mapped = tokenToField(token);\n if (mapped) {\n const inversionFactor =\n info.isNegativeDuration && mapped !== info.largestUnit ? invertLargest : 1;\n let signDisplay;\n if (this.opts.signMode === \"negativeLargestOnly\" && mapped !== info.largestUnit) {\n signDisplay = \"never\";\n } else if (this.opts.signMode === \"all\") {\n signDisplay = \"always\";\n } else {\n // \"auto\" and \"negative\" are the same, but \"auto\" has better support\n signDisplay = \"auto\";\n }\n return this.num(lildur.get(mapped) * inversionFactor, token.length, signDisplay);\n } else {\n return token;\n }\n },\n tokens = Formatter.parseFormat(fmt),\n realTokens = tokens.reduce(\n (found, { literal, val }) => (literal ? found : found.concat(val)),\n []\n ),\n collapsed = dur.shiftTo(...realTokens.map(tokenToField).filter((t) => t)),\n durationInfo = {\n isNegativeDuration: collapsed < 0,\n // this relies on \"collapsed\" being based on \"shiftTo\", which builds up the object\n // in order\n largestUnit: Object.keys(collapsed.values)[0],\n };\n return stringifyTokens(tokens, tokenToString(collapsed, durationInfo));\n }\n}\n","import {\n untruncateYear,\n signedOffset,\n parseInteger,\n parseMillis,\n isUndefined,\n parseFloating,\n} from \"./util.js\";\nimport * as English from \"./english.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\n\n/*\n * This file handles parsing for well-specified formats. Here's how it works:\n * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match.\n * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object\n * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence.\n * Extractors can take a \"cursor\" representing the offset in the match to look at. This makes it easy to combine extractors.\n * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions.\n * Some extractions are super dumb and simpleParse and fromStrings help DRY them.\n */\n\nconst ianaRegex = /[A-Za-z_+-]{1,256}(?::?\\/[A-Za-z0-9_+-]{1,256}(?:\\/[A-Za-z0-9_+-]{1,256})?)?/;\n\nfunction combineRegexes(...regexes) {\n const full = regexes.reduce((f, r) => f + r.source, \"\");\n return RegExp(`^${full}$`);\n}\n\nfunction combineExtractors(...extractors) {\n return (m) =>\n extractors\n .reduce(\n ([mergedVals, mergedZone, cursor], ex) => {\n const [val, zone, next] = ex(m, cursor);\n return [{ ...mergedVals, ...val }, zone || mergedZone, next];\n },\n [{}, null, 1]\n )\n .slice(0, 2);\n}\n\nfunction parse(s, ...patterns) {\n if (s == null) {\n return [null, null];\n }\n\n for (const [regex, extractor] of patterns) {\n const m = regex.exec(s);\n if (m) {\n return extractor(m);\n }\n }\n return [null, null];\n}\n\nfunction simpleParse(...keys) {\n return (match, cursor) => {\n const ret = {};\n let i;\n\n for (i = 0; i < keys.length; i++) {\n ret[keys[i]] = parseInteger(match[cursor + i]);\n }\n return [ret, null, cursor + i];\n };\n}\n\n// ISO and SQL parsing\nconst offsetRegex = /(?:([Zz])|([+-]\\d\\d)(?::?(\\d\\d))?)/;\nconst isoExtendedZone = `(?:${offsetRegex.source}?(?:\\\\[(${ianaRegex.source})\\\\])?)?`;\nconst isoTimeBaseRegex = /(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:[.,](\\d{1,30}))?)?)?/;\nconst isoTimeRegex = RegExp(`${isoTimeBaseRegex.source}${isoExtendedZone}`);\nconst isoTimeExtensionRegex = RegExp(`(?:[Tt]${isoTimeRegex.source})?`);\nconst isoYmdRegex = /([+-]\\d{6}|\\d{4})(?:-?(\\d\\d)(?:-?(\\d\\d))?)?/;\nconst isoWeekRegex = /(\\d{4})-?W(\\d\\d)(?:-?(\\d))?/;\nconst isoOrdinalRegex = /(\\d{4})-?(\\d{3})/;\nconst extractISOWeekData = simpleParse(\"weekYear\", \"weekNumber\", \"weekDay\");\nconst extractISOOrdinalData = simpleParse(\"year\", \"ordinal\");\nconst sqlYmdRegex = /(\\d{4})-(\\d\\d)-(\\d\\d)/; // dumbed-down version of the ISO one\nconst sqlTimeRegex = RegExp(\n `${isoTimeBaseRegex.source} ?(?:${offsetRegex.source}|(${ianaRegex.source}))?`\n);\nconst sqlTimeExtensionRegex = RegExp(`(?: ${sqlTimeRegex.source})?`);\n\nfunction int(match, pos, fallback) {\n const m = match[pos];\n return isUndefined(m) ? fallback : parseInteger(m);\n}\n\nfunction extractISOYmd(match, cursor) {\n const item = {\n year: int(match, cursor),\n month: int(match, cursor + 1, 1),\n day: int(match, cursor + 2, 1),\n };\n\n return [item, null, cursor + 3];\n}\n\nfunction extractISOTime(match, cursor) {\n const item = {\n hours: int(match, cursor, 0),\n minutes: int(match, cursor + 1, 0),\n seconds: int(match, cursor + 2, 0),\n milliseconds: parseMillis(match[cursor + 3]),\n };\n\n return [item, null, cursor + 4];\n}\n\nfunction extractISOOffset(match, cursor) {\n const local = !match[cursor] && !match[cursor + 1],\n fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]),\n zone = local ? null : FixedOffsetZone.instance(fullOffset);\n return [{}, zone, cursor + 3];\n}\n\nfunction extractIANAZone(match, cursor) {\n const zone = match[cursor] ? IANAZone.create(match[cursor]) : null;\n return [{}, zone, cursor + 1];\n}\n\n// ISO time parsing\n\nconst isoTimeOnly = RegExp(`^T?${isoTimeBaseRegex.source}$`);\n\n// ISO duration parsing\n\nconst isoDuration =\n /^-?P(?:(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)Y)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)M)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)W)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)D)?(?:T(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)H)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)M)?(?:(-?\\d{1,20})(?:[.,](-?\\d{1,20}))?S)?)?)$/;\n\nfunction extractISODuration(match) {\n const [s, yearStr, monthStr, weekStr, dayStr, hourStr, minuteStr, secondStr, millisecondsStr] =\n match;\n\n const hasNegativePrefix = s[0] === \"-\";\n const negativeSeconds = secondStr && secondStr[0] === \"-\";\n\n const maybeNegate = (num, force = false) =>\n num !== undefined && (force || (num && hasNegativePrefix)) ? -num : num;\n\n return [\n {\n years: maybeNegate(parseFloating(yearStr)),\n months: maybeNegate(parseFloating(monthStr)),\n weeks: maybeNegate(parseFloating(weekStr)),\n days: maybeNegate(parseFloating(dayStr)),\n hours: maybeNegate(parseFloating(hourStr)),\n minutes: maybeNegate(parseFloating(minuteStr)),\n seconds: maybeNegate(parseFloating(secondStr), secondStr === \"-0\"),\n milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds),\n },\n ];\n}\n\n// These are a little braindead. EDT *should* tell us that we're in, say, America/New_York\n// and not just that we're in -240 *right now*. But since I don't think these are used that often\n// I'm just going to ignore that\nconst obsOffsets = {\n GMT: 0,\n EDT: -4 * 60,\n EST: -5 * 60,\n CDT: -5 * 60,\n CST: -6 * 60,\n MDT: -6 * 60,\n MST: -7 * 60,\n PDT: -7 * 60,\n PST: -8 * 60,\n};\n\nfunction fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n const result = {\n year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr),\n month: English.monthsShort.indexOf(monthStr) + 1,\n day: parseInteger(dayStr),\n hour: parseInteger(hourStr),\n minute: parseInteger(minuteStr),\n };\n\n if (secondStr) result.second = parseInteger(secondStr);\n if (weekdayStr) {\n result.weekday =\n weekdayStr.length > 3\n ? English.weekdaysLong.indexOf(weekdayStr) + 1\n : English.weekdaysShort.indexOf(weekdayStr) + 1;\n }\n\n return result;\n}\n\n// RFC 2822/5322\nconst rfc2822 =\n /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\\d\\d)(\\d\\d)))$/;\n\nfunction extractRFC2822(match) {\n const [\n ,\n weekdayStr,\n dayStr,\n monthStr,\n yearStr,\n hourStr,\n minuteStr,\n secondStr,\n obsOffset,\n milOffset,\n offHourStr,\n offMinuteStr,\n ] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n\n let offset;\n if (obsOffset) {\n offset = obsOffsets[obsOffset];\n } else if (milOffset) {\n offset = 0;\n } else {\n offset = signedOffset(offHourStr, offMinuteStr);\n }\n\n return [result, new FixedOffsetZone(offset)];\n}\n\nfunction preprocessRFC2822(s) {\n // Remove comments and folding whitespace and replace multiple-spaces with a single space\n return s\n .replace(/\\([^()]*\\)|[\\n\\t]/g, \" \")\n .replace(/(\\s\\s+)/g, \" \")\n .trim();\n}\n\n// http date\n\nconst rfc1123 =\n /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\\d\\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\\d{4}) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n rfc850 =\n /^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\\d\\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n ascii =\n /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \\d|\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) (\\d{4})$/;\n\nfunction extractRFC1123Or850(match) {\n const [, weekdayStr, dayStr, monthStr, yearStr, hourStr, minuteStr, secondStr] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n return [result, FixedOffsetZone.utcInstance];\n}\n\nfunction extractASCII(match) {\n const [, weekdayStr, monthStr, dayStr, hourStr, minuteStr, secondStr, yearStr] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n return [result, FixedOffsetZone.utcInstance];\n}\n\nconst isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex);\nconst isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex);\nconst isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex);\nconst isoTimeCombinedRegex = combineRegexes(isoTimeRegex);\n\nconst extractISOYmdTimeAndOffset = combineExtractors(\n extractISOYmd,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOWeekTimeAndOffset = combineExtractors(\n extractISOWeekData,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOOrdinalDateAndTime = combineExtractors(\n extractISOOrdinalData,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOTimeAndOffset = combineExtractors(\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\n\n/*\n * @private\n */\n\nexport function parseISODate(s) {\n return parse(\n s,\n [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset],\n [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime],\n [isoTimeCombinedRegex, extractISOTimeAndOffset]\n );\n}\n\nexport function parseRFC2822Date(s) {\n return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]);\n}\n\nexport function parseHTTPDate(s) {\n return parse(\n s,\n [rfc1123, extractRFC1123Or850],\n [rfc850, extractRFC1123Or850],\n [ascii, extractASCII]\n );\n}\n\nexport function parseISODuration(s) {\n return parse(s, [isoDuration, extractISODuration]);\n}\n\nconst extractISOTimeOnly = combineExtractors(extractISOTime);\n\nexport function parseISOTimeOnly(s) {\n return parse(s, [isoTimeOnly, extractISOTimeOnly]);\n}\n\nconst sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex);\nconst sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex);\n\nconst extractISOTimeOffsetAndIANAZone = combineExtractors(\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\n\nexport function parseSQL(s) {\n return parse(\n s,\n [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]\n );\n}\n","import { InvalidArgumentError, InvalidDurationError, InvalidUnitError } from \"./errors.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport Invalid from \"./impl/invalid.js\";\nimport Locale from \"./impl/locale.js\";\nimport { parseISODuration, parseISOTimeOnly } from \"./impl/regexParser.js\";\nimport {\n asNumber,\n hasOwnProperty,\n isNumber,\n isUndefined,\n normalizeObject,\n roundTo,\n} from \"./impl/util.js\";\nimport Settings from \"./settings.js\";\nimport DateTime from \"./datetime.js\";\n\nconst INVALID = \"Invalid Duration\";\n\n// unit conversion constants\nexport const lowOrderMatrix = {\n weeks: {\n days: 7,\n hours: 7 * 24,\n minutes: 7 * 24 * 60,\n seconds: 7 * 24 * 60 * 60,\n milliseconds: 7 * 24 * 60 * 60 * 1000,\n },\n days: {\n hours: 24,\n minutes: 24 * 60,\n seconds: 24 * 60 * 60,\n milliseconds: 24 * 60 * 60 * 1000,\n },\n hours: { minutes: 60, seconds: 60 * 60, milliseconds: 60 * 60 * 1000 },\n minutes: { seconds: 60, milliseconds: 60 * 1000 },\n seconds: { milliseconds: 1000 },\n },\n casualMatrix = {\n years: {\n quarters: 4,\n months: 12,\n weeks: 52,\n days: 365,\n hours: 365 * 24,\n minutes: 365 * 24 * 60,\n seconds: 365 * 24 * 60 * 60,\n milliseconds: 365 * 24 * 60 * 60 * 1000,\n },\n quarters: {\n months: 3,\n weeks: 13,\n days: 91,\n hours: 91 * 24,\n minutes: 91 * 24 * 60,\n seconds: 91 * 24 * 60 * 60,\n milliseconds: 91 * 24 * 60 * 60 * 1000,\n },\n months: {\n weeks: 4,\n days: 30,\n hours: 30 * 24,\n minutes: 30 * 24 * 60,\n seconds: 30 * 24 * 60 * 60,\n milliseconds: 30 * 24 * 60 * 60 * 1000,\n },\n\n ...lowOrderMatrix,\n },\n daysInYearAccurate = 146097.0 / 400,\n daysInMonthAccurate = 146097.0 / 4800,\n accurateMatrix = {\n years: {\n quarters: 4,\n months: 12,\n weeks: daysInYearAccurate / 7,\n days: daysInYearAccurate,\n hours: daysInYearAccurate * 24,\n minutes: daysInYearAccurate * 24 * 60,\n seconds: daysInYearAccurate * 24 * 60 * 60,\n milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000,\n },\n quarters: {\n months: 3,\n weeks: daysInYearAccurate / 28,\n days: daysInYearAccurate / 4,\n hours: (daysInYearAccurate * 24) / 4,\n minutes: (daysInYearAccurate * 24 * 60) / 4,\n seconds: (daysInYearAccurate * 24 * 60 * 60) / 4,\n milliseconds: (daysInYearAccurate * 24 * 60 * 60 * 1000) / 4,\n },\n months: {\n weeks: daysInMonthAccurate / 7,\n days: daysInMonthAccurate,\n hours: daysInMonthAccurate * 24,\n minutes: daysInMonthAccurate * 24 * 60,\n seconds: daysInMonthAccurate * 24 * 60 * 60,\n milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000,\n },\n ...lowOrderMatrix,\n };\n\n// units ordered by size\nconst orderedUnits = [\n \"years\",\n \"quarters\",\n \"months\",\n \"weeks\",\n \"days\",\n \"hours\",\n \"minutes\",\n \"seconds\",\n \"milliseconds\",\n];\n\nconst reverseUnits = orderedUnits.slice(0).reverse();\n\n// clone really means \"create another instance just like this one, but with these changes\"\nfunction clone(dur, alts, clear = false) {\n // deep merge for vals\n const conf = {\n values: clear ? alts.values : { ...dur.values, ...(alts.values || {}) },\n loc: dur.loc.clone(alts.loc),\n conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy,\n matrix: alts.matrix || dur.matrix,\n };\n return new Duration(conf);\n}\n\nfunction durationToMillis(matrix, vals) {\n let sum = vals.milliseconds ?? 0;\n for (const unit of reverseUnits.slice(1)) {\n if (vals[unit]) {\n sum += vals[unit] * matrix[unit][\"milliseconds\"];\n }\n }\n return sum;\n}\n\n// NB: mutates parameters\nfunction normalizeValues(matrix, vals) {\n // the logic below assumes the overall value of the duration is positive\n // if this is not the case, factor is used to make it so\n const factor = durationToMillis(matrix, vals) < 0 ? -1 : 1;\n\n orderedUnits.reduceRight((previous, current) => {\n if (!isUndefined(vals[current])) {\n if (previous) {\n const previousVal = vals[previous] * factor;\n const conv = matrix[current][previous];\n\n // if (previousVal < 0):\n // lower order unit is negative (e.g. { years: 2, days: -2 })\n // normalize this by reducing the higher order unit by the appropriate amount\n // and increasing the lower order unit\n // this can never make the higher order unit negative, because this function only operates\n // on positive durations, so the amount of time represented by the lower order unit cannot\n // be larger than the higher order unit\n // else:\n // lower order unit is positive (e.g. { years: 2, days: 450 } or { years: -2, days: 450 })\n // in this case we attempt to convert as much as possible from the lower order unit into\n // the higher order one\n //\n // Math.floor takes care of both of these cases, rounding away from 0\n // if previousVal < 0 it makes the absolute value larger\n // if previousVal >= it makes the absolute value smaller\n const rollUp = Math.floor(previousVal / conv);\n vals[current] += rollUp * factor;\n vals[previous] -= rollUp * conv * factor;\n }\n return current;\n } else {\n return previous;\n }\n }, null);\n\n // try to convert any decimals into smaller units if possible\n // for example for { years: 2.5, days: 0, seconds: 0 } we want to get { years: 2, days: 182, hours: 12 }\n orderedUnits.reduce((previous, current) => {\n if (!isUndefined(vals[current])) {\n if (previous) {\n const fraction = vals[previous] % 1;\n vals[previous] -= fraction;\n vals[current] += fraction * matrix[previous][current];\n }\n return current;\n } else {\n return previous;\n }\n }, null);\n}\n\n// Remove all properties with a value of 0 from an object\nfunction removeZeroes(vals) {\n const newVals = {};\n for (const [key, value] of Object.entries(vals)) {\n if (value !== 0) {\n newVals[key] = value;\n }\n }\n return newVals;\n}\n\n/**\n * A Duration object represents a period of time, like \"2 months\" or \"1 day, 1 hour\". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime#plus} to add a Duration object to a DateTime, producing another DateTime.\n *\n * Here is a brief overview of commonly used methods and getters in Duration:\n *\n * * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}.\n * * **Unit values** See the {@link Duration#years}, {@link Duration#months}, {@link Duration#weeks}, {@link Duration#days}, {@link Duration#hours}, {@link Duration#minutes}, {@link Duration#seconds}, {@link Duration#milliseconds} accessors.\n * * **Configuration** See {@link Duration#locale} and {@link Duration#numberingSystem} accessors.\n * * **Transformation** To create new Durations out of old ones use {@link Duration#plus}, {@link Duration#minus}, {@link Duration#normalize}, {@link Duration#set}, {@link Duration#reconfigure}, {@link Duration#shiftTo}, and {@link Duration#negate}.\n * * **Output** To convert the Duration into other representations, see {@link Duration#as}, {@link Duration#toISO}, {@link Duration#toFormat}, and {@link Duration#toJSON}\n *\n * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation.\n */\nexport default class Duration {\n /**\n * @private\n */\n constructor(config) {\n const accurate = config.conversionAccuracy === \"longterm\" || false;\n let matrix = accurate ? accurateMatrix : casualMatrix;\n\n if (config.matrix) {\n matrix = config.matrix;\n }\n\n /**\n * @access private\n */\n this.values = config.values;\n /**\n * @access private\n */\n this.loc = config.loc || Locale.create();\n /**\n * @access private\n */\n this.conversionAccuracy = accurate ? \"longterm\" : \"casual\";\n /**\n * @access private\n */\n this.invalid = config.invalid || null;\n /**\n * @access private\n */\n this.matrix = matrix;\n /**\n * @access private\n */\n this.isLuxonDuration = true;\n }\n\n /**\n * Create Duration from a number of milliseconds.\n * @param {number} count of milliseconds\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @return {Duration}\n */\n static fromMillis(count, opts) {\n return Duration.fromObject({ milliseconds: count }, opts);\n }\n\n /**\n * Create a Duration from a JavaScript object with keys like 'years' and 'hours'.\n * If this object is empty then a zero milliseconds duration is returned.\n * @param {Object} obj - the object to create the DateTime from\n * @param {number} obj.years\n * @param {number} obj.quarters\n * @param {number} obj.months\n * @param {number} obj.weeks\n * @param {number} obj.days\n * @param {number} obj.hours\n * @param {number} obj.minutes\n * @param {number} obj.seconds\n * @param {number} obj.milliseconds\n * @param {Object} [opts=[]] - options for creating this Duration\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the custom conversion system to use\n * @return {Duration}\n */\n static fromObject(obj, opts = {}) {\n if (obj == null || typeof obj !== \"object\") {\n throw new InvalidArgumentError(\n `Duration.fromObject: argument expected to be an object, got ${\n obj === null ? \"null\" : typeof obj\n }`\n );\n }\n\n return new Duration({\n values: normalizeObject(obj, Duration.normalizeUnit),\n loc: Locale.fromObject(opts),\n conversionAccuracy: opts.conversionAccuracy,\n matrix: opts.matrix,\n });\n }\n\n /**\n * Create a Duration from DurationLike.\n *\n * @param {Object | number | Duration} durationLike\n * One of:\n * - object with keys like 'years' and 'hours'.\n * - number representing milliseconds\n * - Duration instance\n * @return {Duration}\n */\n static fromDurationLike(durationLike) {\n if (isNumber(durationLike)) {\n return Duration.fromMillis(durationLike);\n } else if (Duration.isDuration(durationLike)) {\n return durationLike;\n } else if (typeof durationLike === \"object\") {\n return Duration.fromObject(durationLike);\n } else {\n throw new InvalidArgumentError(\n `Unknown duration argument ${durationLike} of type ${typeof durationLike}`\n );\n }\n }\n\n /**\n * Create a Duration from an ISO 8601 duration string.\n * @param {string} text - text to parse\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the preset conversion system to use\n * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 }\n * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 }\n * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 }\n * @return {Duration}\n */\n static fromISO(text, opts) {\n const [parsed] = parseISODuration(text);\n if (parsed) {\n return Duration.fromObject(parsed, opts);\n } else {\n return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n }\n\n /**\n * Create a Duration from an ISO 8601 time string.\n * @param {string} text - text to parse\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the conversion system to use\n * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n * @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 }\n * @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @return {Duration}\n */\n static fromISOTime(text, opts) {\n const [parsed] = parseISOTimeOnly(text);\n if (parsed) {\n return Duration.fromObject(parsed, opts);\n } else {\n return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n }\n\n /**\n * Create an invalid Duration.\n * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {Duration}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the Duration is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidDurationError(invalid);\n } else {\n return new Duration({ invalid });\n }\n }\n\n /**\n * @private\n */\n static normalizeUnit(unit) {\n const normalized = {\n year: \"years\",\n years: \"years\",\n quarter: \"quarters\",\n quarters: \"quarters\",\n month: \"months\",\n months: \"months\",\n week: \"weeks\",\n weeks: \"weeks\",\n day: \"days\",\n days: \"days\",\n hour: \"hours\",\n hours: \"hours\",\n minute: \"minutes\",\n minutes: \"minutes\",\n second: \"seconds\",\n seconds: \"seconds\",\n millisecond: \"milliseconds\",\n milliseconds: \"milliseconds\",\n }[unit ? unit.toLowerCase() : unit];\n\n if (!normalized) throw new InvalidUnitError(unit);\n\n return normalized;\n }\n\n /**\n * Check if an object is a Duration. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isDuration(o) {\n return (o && o.isLuxonDuration) || false;\n }\n\n /**\n * Get the locale of a Duration, such 'en-GB'\n * @type {string}\n */\n get locale() {\n return this.isValid ? this.loc.locale : null;\n }\n\n /**\n * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration\n *\n * @type {string}\n */\n get numberingSystem() {\n return this.isValid ? this.loc.numberingSystem : null;\n }\n\n /**\n * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens:\n * * `S` for milliseconds\n * * `s` for seconds\n * * `m` for minutes\n * * `h` for hours\n * * `d` for days\n * * `w` for weeks\n * * `M` for months\n * * `y` for years\n * Notes:\n * * Add padding by repeating the token, e.g. \"yy\" pads the years to two digits, \"hhhh\" pads the hours out to four digits\n * * Tokens can be escaped by wrapping with single quotes.\n * * The duration will be converted to the set of units in the format string using {@link Duration#shiftTo} and the Durations's conversion accuracy setting.\n * @param {string} fmt - the format string\n * @param {Object} opts - options\n * @param {boolean} [opts.floor=true] - floor numerical values\n * @param {'negative'|'all'|'negativeLargestOnly'} [opts.signMode=negative] - How to handle signs\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"y d s\") //=> \"1 6 2\"\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"yy dd sss\") //=> \"01 06 002\"\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"M S\") //=> \"12 518402000\"\n * @example Duration.fromObject({ days: 6, seconds: 2 }).toFormat(\"d s\", { signMode: \"all\" }) //=> \"+6 +2\"\n * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat(\"d s\", { signMode: \"all\" }) //=> \"-6 -2\"\n * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat(\"d s\", { signMode: \"negativeLargestOnly\" }) //=> \"-6 2\"\n * @return {string}\n */\n toFormat(fmt, opts = {}) {\n // reverse-compat since 1.2; we always round down now, never up, and we do it by default\n const fmtOpts = {\n ...opts,\n floor: opts.round !== false && opts.floor !== false,\n };\n return this.isValid\n ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt)\n : INVALID;\n }\n\n /**\n * Returns a string representation of a Duration with all units included.\n * To modify its behavior, use `listStyle` and any Intl.NumberFormat option, though `unitDisplay` is especially relevant.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options\n * @param {Object} opts - Formatting options. Accepts the same keys as the options parameter of the native `Intl.NumberFormat` constructor, as well as `listStyle`.\n * @param {string} [opts.listStyle='narrow'] - How to format the merged list. Corresponds to the `style` property of the options parameter of the native `Intl.ListFormat` constructor.\n * @param {boolean} [opts.showZeros=true] - Show all units previously used by the duration even if they are zero\n * @example\n * ```js\n * var dur = Duration.fromObject({ months: 1, weeks: 0, hours: 5, minutes: 6 })\n * dur.toHuman() //=> '1 month, 0 weeks, 5 hours, 6 minutes'\n * dur.toHuman({ listStyle: \"long\" }) //=> '1 month, 0 weeks, 5 hours, and 6 minutes'\n * dur.toHuman({ unitDisplay: \"short\" }) //=> '1 mth, 0 wks, 5 hr, 6 min'\n * dur.toHuman({ showZeros: false }) //=> '1 month, 5 hours, 6 minutes'\n * ```\n */\n toHuman(opts = {}) {\n if (!this.isValid) return INVALID;\n\n const showZeros = opts.showZeros !== false;\n\n const l = orderedUnits\n .map((unit) => {\n const val = this.values[unit];\n if (isUndefined(val) || (val === 0 && !showZeros)) {\n return null;\n }\n return this.loc\n .numberFormatter({ style: \"unit\", unitDisplay: \"long\", ...opts, unit: unit.slice(0, -1) })\n .format(val);\n })\n .filter((n) => n);\n\n return this.loc\n .listFormatter({ type: \"conjunction\", style: opts.listStyle || \"narrow\", ...opts })\n .format(l);\n }\n\n /**\n * Returns a JavaScript object with this Duration's values.\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 }\n * @return {Object}\n */\n toObject() {\n if (!this.isValid) return {};\n return { ...this.values };\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Duration.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S'\n * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S'\n * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M'\n * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M'\n * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S'\n * @return {string}\n */\n toISO() {\n // we could use the formatter, but this is an easier way to get the minimum string\n if (!this.isValid) return null;\n\n let s = \"P\";\n if (this.years !== 0) s += this.years + \"Y\";\n if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + \"M\";\n if (this.weeks !== 0) s += this.weeks + \"W\";\n if (this.days !== 0) s += this.days + \"D\";\n if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0)\n s += \"T\";\n if (this.hours !== 0) s += this.hours + \"H\";\n if (this.minutes !== 0) s += this.minutes + \"M\";\n if (this.seconds !== 0 || this.milliseconds !== 0)\n // this will handle \"floating point madness\" by removing extra decimal places\n // https://stackoverflow.com/questions/588004/is-floating-point-math-broken\n s += roundTo(this.seconds + this.milliseconds / 1000, 3) + \"S\";\n if (s === \"P\") s += \"T0S\";\n return s;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day.\n * Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000'\n * @return {string}\n */\n toISOTime(opts = {}) {\n if (!this.isValid) return null;\n\n const millis = this.toMillis();\n if (millis < 0 || millis >= 86400000) return null;\n\n opts = {\n suppressMilliseconds: false,\n suppressSeconds: false,\n includePrefix: false,\n format: \"extended\",\n ...opts,\n includeOffset: false,\n };\n\n const dateTime = DateTime.fromMillis(millis, { zone: \"UTC\" });\n return dateTime.toISOTime(opts);\n }\n\n /**\n * Returns an ISO 8601 representation of this Duration appropriate for use in JSON.\n * @return {string}\n */\n toJSON() {\n return this.toISO();\n }\n\n /**\n * Returns an ISO 8601 representation of this Duration appropriate for use in debugging.\n * @return {string}\n */\n toString() {\n return this.toISO();\n }\n\n /**\n * Returns a string representation of this Duration appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `Duration { values: ${JSON.stringify(this.values)} }`;\n } else {\n return `Duration { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns an milliseconds value of this Duration.\n * @return {number}\n */\n toMillis() {\n if (!this.isValid) return NaN;\n\n return durationToMillis(this.matrix, this.values);\n }\n\n /**\n * Returns an milliseconds value of this Duration. Alias of {@link toMillis}\n * @return {number}\n */\n valueOf() {\n return this.toMillis();\n }\n\n /**\n * Make this Duration longer by the specified amount. Return a newly-constructed Duration.\n * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @return {Duration}\n */\n plus(duration) {\n if (!this.isValid) return this;\n\n const dur = Duration.fromDurationLike(duration),\n result = {};\n\n for (const k of orderedUnits) {\n if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) {\n result[k] = dur.get(k) + this.get(k);\n }\n }\n\n return clone(this, { values: result }, true);\n }\n\n /**\n * Make this Duration shorter by the specified amount. Return a newly-constructed Duration.\n * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @return {Duration}\n */\n minus(duration) {\n if (!this.isValid) return this;\n\n const dur = Duration.fromDurationLike(duration);\n return this.plus(dur.negate());\n }\n\n /**\n * Scale this Duration by the specified amount. Return a newly-constructed Duration.\n * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number.\n * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits(x => x * 2) //=> { hours: 2, minutes: 60 }\n * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits((x, u) => u === \"hours\" ? x * 2 : x) //=> { hours: 2, minutes: 30 }\n * @return {Duration}\n */\n mapUnits(fn) {\n if (!this.isValid) return this;\n const result = {};\n for (const k of Object.keys(this.values)) {\n result[k] = asNumber(fn(this.values[k], k));\n }\n return clone(this, { values: result }, true);\n }\n\n /**\n * Get the value of unit.\n * @param {string} unit - a unit such as 'minute' or 'day'\n * @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2\n * @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0\n * @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3\n * @return {number}\n */\n get(unit) {\n return this[Duration.normalizeUnit(unit)];\n }\n\n /**\n * \"Set\" the values of specified units. Return a newly-constructed Duration.\n * @param {Object} values - a mapping of units to numbers\n * @example dur.set({ years: 2017 })\n * @example dur.set({ hours: 8, minutes: 30 })\n * @return {Duration}\n */\n set(values) {\n if (!this.isValid) return this;\n\n const mixed = { ...this.values, ...normalizeObject(values, Duration.normalizeUnit) };\n return clone(this, { values: mixed });\n }\n\n /**\n * \"Set\" the locale and/or numberingSystem. Returns a newly-constructed Duration.\n * @example dur.reconfigure({ locale: 'en-GB' })\n * @return {Duration}\n */\n reconfigure({ locale, numberingSystem, conversionAccuracy, matrix } = {}) {\n const loc = this.loc.clone({ locale, numberingSystem });\n const opts = { loc, matrix, conversionAccuracy };\n return clone(this, opts);\n }\n\n /**\n * Return the length of the duration in the specified unit.\n * @param {string} unit - a unit such as 'minutes' or 'days'\n * @example Duration.fromObject({years: 1}).as('days') //=> 365\n * @example Duration.fromObject({years: 1}).as('months') //=> 12\n * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5\n * @return {number}\n */\n as(unit) {\n return this.isValid ? this.shiftTo(unit).get(unit) : NaN;\n }\n\n /**\n * Reduce this Duration to its canonical representation in its current units.\n * Assuming the overall value of the Duration is positive, this means:\n * - excessive values for lower-order units are converted to higher-order units (if possible, see first and second example)\n * - negative lower-order units are converted to higher order units (there must be such a higher order unit, otherwise\n * the overall value would be negative, see third example)\n * - fractional values for higher-order units are converted to lower-order units (if possible, see fourth example)\n *\n * If the overall value is negative, the result of this method is equivalent to `this.negate().normalize().negate()`.\n * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 }\n * @example Duration.fromObject({ days: 5000 }).normalize().toObject() //=> { days: 5000 }\n * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 }\n * @example Duration.fromObject({ years: 2.5, days: 0, hours: 0 }).normalize().toObject() //=> { years: 2, days: 182, hours: 12 }\n * @return {Duration}\n */\n normalize() {\n if (!this.isValid) return this;\n const vals = this.toObject();\n normalizeValues(this.matrix, vals);\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Rescale units to its largest representation\n * @example Duration.fromObject({ milliseconds: 90000 }).rescale().toObject() //=> { minutes: 1, seconds: 30 }\n * @return {Duration}\n */\n rescale() {\n if (!this.isValid) return this;\n const vals = removeZeroes(this.normalize().shiftToAll().toObject());\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Convert this Duration into its representation in a different set of units.\n * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 }\n * @return {Duration}\n */\n shiftTo(...units) {\n if (!this.isValid) return this;\n\n if (units.length === 0) {\n return this;\n }\n\n units = units.map((u) => Duration.normalizeUnit(u));\n\n const built = {},\n accumulated = {},\n vals = this.toObject();\n let lastUnit;\n\n for (const k of orderedUnits) {\n if (units.indexOf(k) >= 0) {\n lastUnit = k;\n\n let own = 0;\n\n // anything we haven't boiled down yet should get boiled to this unit\n for (const ak in accumulated) {\n own += this.matrix[ak][k] * accumulated[ak];\n accumulated[ak] = 0;\n }\n\n // plus anything that's already in this unit\n if (isNumber(vals[k])) {\n own += vals[k];\n }\n\n // only keep the integer part for now in the hopes of putting any decimal part\n // into a smaller unit later\n const i = Math.trunc(own);\n built[k] = i;\n accumulated[k] = (own * 1000 - i * 1000) / 1000;\n\n // otherwise, keep it in the wings to boil it later\n } else if (isNumber(vals[k])) {\n accumulated[k] = vals[k];\n }\n }\n\n // anything leftover becomes the decimal for the last unit\n // lastUnit must be defined since units is not empty\n for (const key in accumulated) {\n if (accumulated[key] !== 0) {\n built[lastUnit] +=\n key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key];\n }\n }\n\n normalizeValues(this.matrix, built);\n return clone(this, { values: built }, true);\n }\n\n /**\n * Shift this Duration to all available units.\n * Same as shiftTo(\"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", \"seconds\", \"milliseconds\")\n * @return {Duration}\n */\n shiftToAll() {\n if (!this.isValid) return this;\n return this.shiftTo(\n \"years\",\n \"months\",\n \"weeks\",\n \"days\",\n \"hours\",\n \"minutes\",\n \"seconds\",\n \"milliseconds\"\n );\n }\n\n /**\n * Return the negative of this Duration.\n * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 }\n * @return {Duration}\n */\n negate() {\n if (!this.isValid) return this;\n const negated = {};\n for (const k of Object.keys(this.values)) {\n negated[k] = this.values[k] === 0 ? 0 : -this.values[k];\n }\n return clone(this, { values: negated }, true);\n }\n\n /**\n * Removes all units with values equal to 0 from this Duration.\n * @example Duration.fromObject({ years: 2, days: 0, hours: 0, minutes: 0 }).removeZeros().toObject() //=> { years: 2 }\n * @return {Duration}\n */\n removeZeros() {\n if (!this.isValid) return this;\n const vals = removeZeroes(this.values);\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Get the years.\n * @type {number}\n */\n get years() {\n return this.isValid ? this.values.years || 0 : NaN;\n }\n\n /**\n * Get the quarters.\n * @type {number}\n */\n get quarters() {\n return this.isValid ? this.values.quarters || 0 : NaN;\n }\n\n /**\n * Get the months.\n * @type {number}\n */\n get months() {\n return this.isValid ? this.values.months || 0 : NaN;\n }\n\n /**\n * Get the weeks\n * @type {number}\n */\n get weeks() {\n return this.isValid ? this.values.weeks || 0 : NaN;\n }\n\n /**\n * Get the days.\n * @type {number}\n */\n get days() {\n return this.isValid ? this.values.days || 0 : NaN;\n }\n\n /**\n * Get the hours.\n * @type {number}\n */\n get hours() {\n return this.isValid ? this.values.hours || 0 : NaN;\n }\n\n /**\n * Get the minutes.\n * @type {number}\n */\n get minutes() {\n return this.isValid ? this.values.minutes || 0 : NaN;\n }\n\n /**\n * Get the seconds.\n * @return {number}\n */\n get seconds() {\n return this.isValid ? this.values.seconds || 0 : NaN;\n }\n\n /**\n * Get the milliseconds.\n * @return {number}\n */\n get milliseconds() {\n return this.isValid ? this.values.milliseconds || 0 : NaN;\n }\n\n /**\n * Returns whether the Duration is invalid. Invalid durations are returned by diff operations\n * on invalid DateTimes or Intervals.\n * @return {boolean}\n */\n get isValid() {\n return this.invalid === null;\n }\n\n /**\n * Returns an error code if this Duration became invalid, or null if the Duration is valid\n * @return {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this Duration became invalid, or null if the Duration is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Equality check\n * Two Durations are equal iff they have the same units and the same values for each unit.\n * @param {Duration} other\n * @return {boolean}\n */\n equals(other) {\n if (!this.isValid || !other.isValid) {\n return false;\n }\n\n if (!this.loc.equals(other.loc)) {\n return false;\n }\n\n function eq(v1, v2) {\n // Consider 0 and undefined as equal\n if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0;\n return v1 === v2;\n }\n\n for (const u of orderedUnits) {\n if (!eq(this.values[u], other.values[u])) {\n return false;\n }\n }\n return true;\n }\n}\n","import DateTime, { friendlyDateTime } from \"./datetime.js\";\nimport Duration from \"./duration.js\";\nimport Settings from \"./settings.js\";\nimport { InvalidArgumentError, InvalidIntervalError } from \"./errors.js\";\nimport Invalid from \"./impl/invalid.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport * as Formats from \"./impl/formats.js\";\n\nconst INVALID = \"Invalid Interval\";\n\n// checks if the start is equal to or before the end\nfunction validateStartEnd(start, end) {\n if (!start || !start.isValid) {\n return Interval.invalid(\"missing or invalid start\");\n } else if (!end || !end.isValid) {\n return Interval.invalid(\"missing or invalid end\");\n } else if (end < start) {\n return Interval.invalid(\n \"end before start\",\n `The end of an interval must be after its start, but you had start=${start.toISO()} and end=${end.toISO()}`\n );\n } else {\n return null;\n }\n}\n\n/**\n * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them.\n *\n * Here is a brief overview of the most commonly used methods and getters in Interval:\n *\n * * **Creation** To create an Interval, use {@link Interval.fromDateTimes}, {@link Interval.after}, {@link Interval.before}, or {@link Interval.fromISO}.\n * * **Accessors** Use {@link Interval#start} and {@link Interval#end} to get the start and end.\n * * **Interrogation** To analyze the Interval, use {@link Interval#count}, {@link Interval#length}, {@link Interval#hasSame}, {@link Interval#contains}, {@link Interval#isAfter}, or {@link Interval#isBefore}.\n * * **Transformation** To create other Intervals out of this one, use {@link Interval#set}, {@link Interval#splitAt}, {@link Interval#splitBy}, {@link Interval#divideEqually}, {@link Interval.merge}, {@link Interval.xor}, {@link Interval#union}, {@link Interval#intersection}, or {@link Interval#difference}.\n * * **Comparison** To compare this Interval to another one, use {@link Interval#equals}, {@link Interval#overlaps}, {@link Interval#abutsStart}, {@link Interval#abutsEnd}, {@link Interval#engulfs}\n * * **Output** To convert the Interval into other representations, see {@link Interval#toString}, {@link Interval#toLocaleString}, {@link Interval#toISO}, {@link Interval#toISODate}, {@link Interval#toISOTime}, {@link Interval#toFormat}, and {@link Interval#toDuration}.\n */\nexport default class Interval {\n /**\n * @private\n */\n constructor(config) {\n /**\n * @access private\n */\n this.s = config.start;\n /**\n * @access private\n */\n this.e = config.end;\n /**\n * @access private\n */\n this.invalid = config.invalid || null;\n /**\n * @access private\n */\n this.isLuxonInterval = true;\n }\n\n /**\n * Create an invalid Interval.\n * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {Interval}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the Interval is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidIntervalError(invalid);\n } else {\n return new Interval({ invalid });\n }\n }\n\n /**\n * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end.\n * @param {DateTime|Date|Object} start\n * @param {DateTime|Date|Object} end\n * @return {Interval}\n */\n static fromDateTimes(start, end) {\n const builtStart = friendlyDateTime(start),\n builtEnd = friendlyDateTime(end);\n\n const validateError = validateStartEnd(builtStart, builtEnd);\n\n if (validateError == null) {\n return new Interval({\n start: builtStart,\n end: builtEnd,\n });\n } else {\n return validateError;\n }\n }\n\n /**\n * Create an Interval from a start DateTime and a Duration to extend to.\n * @param {DateTime|Date|Object} start\n * @param {Duration|Object|number} duration - the length of the Interval.\n * @return {Interval}\n */\n static after(start, duration) {\n const dur = Duration.fromDurationLike(duration),\n dt = friendlyDateTime(start);\n return Interval.fromDateTimes(dt, dt.plus(dur));\n }\n\n /**\n * Create an Interval from an end DateTime and a Duration to extend backwards to.\n * @param {DateTime|Date|Object} end\n * @param {Duration|Object|number} duration - the length of the Interval.\n * @return {Interval}\n */\n static before(end, duration) {\n const dur = Duration.fromDurationLike(duration),\n dt = friendlyDateTime(end);\n return Interval.fromDateTimes(dt.minus(dur), dt);\n }\n\n /**\n * Create an Interval from an ISO 8601 string.\n * Accepts `/`, `/`, and `/` formats.\n * @param {string} text - the ISO string to parse\n * @param {Object} [opts] - options to pass {@link DateTime#fromISO} and optionally {@link Duration#fromISO}\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @return {Interval}\n */\n static fromISO(text, opts) {\n const [s, e] = (text || \"\").split(\"/\", 2);\n if (s && e) {\n let start, startIsValid;\n try {\n start = DateTime.fromISO(s, opts);\n startIsValid = start.isValid;\n } catch (e) {\n startIsValid = false;\n }\n\n let end, endIsValid;\n try {\n end = DateTime.fromISO(e, opts);\n endIsValid = end.isValid;\n } catch (e) {\n endIsValid = false;\n }\n\n if (startIsValid && endIsValid) {\n return Interval.fromDateTimes(start, end);\n }\n\n if (startIsValid) {\n const dur = Duration.fromISO(e, opts);\n if (dur.isValid) {\n return Interval.after(start, dur);\n }\n } else if (endIsValid) {\n const dur = Duration.fromISO(s, opts);\n if (dur.isValid) {\n return Interval.before(end, dur);\n }\n }\n }\n return Interval.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n\n /**\n * Check if an object is an Interval. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isInterval(o) {\n return (o && o.isLuxonInterval) || false;\n }\n\n /**\n * Returns the start of the Interval\n * @type {DateTime}\n */\n get start() {\n return this.isValid ? this.s : null;\n }\n\n /**\n * Returns the end of the Interval. This is the first instant which is not part of the interval\n * (Interval is half-open).\n * @type {DateTime}\n */\n get end() {\n return this.isValid ? this.e : null;\n }\n\n /**\n * Returns the last DateTime included in the interval (since end is not part of the interval)\n * @type {DateTime}\n */\n get lastDateTime() {\n return this.isValid ? (this.e ? this.e.minus(1) : null) : null;\n }\n\n /**\n * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'.\n * @type {boolean}\n */\n get isValid() {\n return this.invalidReason === null;\n }\n\n /**\n * Returns an error code if this Interval is invalid, or null if the Interval is valid\n * @type {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this Interval became invalid, or null if the Interval is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Returns the length of the Interval in the specified unit.\n * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in.\n * @return {number}\n */\n length(unit = \"milliseconds\") {\n return this.isValid ? this.toDuration(...[unit]).get(unit) : NaN;\n }\n\n /**\n * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part.\n * Unlike {@link Interval#length} this counts sections of the calendar, not periods of time, e.g. specifying 'day'\n * asks 'what dates are included in this interval?', not 'how many days long is this interval?'\n * @param {string} [unit='milliseconds'] - the unit of time to count.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; this operation will always use the locale of the start DateTime\n * @return {number}\n */\n count(unit = \"milliseconds\", opts) {\n if (!this.isValid) return NaN;\n const start = this.start.startOf(unit, opts);\n let end;\n if (opts?.useLocaleWeeks) {\n end = this.end.reconfigure({ locale: start.locale });\n } else {\n end = this.end;\n }\n end = end.startOf(unit, opts);\n return Math.floor(end.diff(start, unit).get(unit)) + (end.valueOf() !== this.end.valueOf());\n }\n\n /**\n * Returns whether this Interval's start and end are both in the same unit of time\n * @param {string} unit - the unit of time to check sameness on\n * @return {boolean}\n */\n hasSame(unit) {\n return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false;\n }\n\n /**\n * Return whether this Interval has the same start and end DateTimes.\n * @return {boolean}\n */\n isEmpty() {\n return this.s.valueOf() === this.e.valueOf();\n }\n\n /**\n * Return whether this Interval's start is after the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n isAfter(dateTime) {\n if (!this.isValid) return false;\n return this.s > dateTime;\n }\n\n /**\n * Return whether this Interval's end is before the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n isBefore(dateTime) {\n if (!this.isValid) return false;\n return this.e <= dateTime;\n }\n\n /**\n * Return whether this Interval contains the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n contains(dateTime) {\n if (!this.isValid) return false;\n return this.s <= dateTime && this.e > dateTime;\n }\n\n /**\n * \"Sets\" the start and/or end dates. Returns a newly-constructed Interval.\n * @param {Object} values - the values to set\n * @param {DateTime} values.start - the starting DateTime\n * @param {DateTime} values.end - the ending DateTime\n * @return {Interval}\n */\n set({ start, end } = {}) {\n if (!this.isValid) return this;\n return Interval.fromDateTimes(start || this.s, end || this.e);\n }\n\n /**\n * Split this Interval at each of the specified DateTimes\n * @param {...DateTime} dateTimes - the unit of time to count.\n * @return {Array}\n */\n splitAt(...dateTimes) {\n if (!this.isValid) return [];\n const sorted = dateTimes\n .map(friendlyDateTime)\n .filter((d) => this.contains(d))\n .sort((a, b) => a.toMillis() - b.toMillis()),\n results = [];\n let { s } = this,\n i = 0;\n\n while (s < this.e) {\n const added = sorted[i] || this.e,\n next = +added > +this.e ? this.e : added;\n results.push(Interval.fromDateTimes(s, next));\n s = next;\n i += 1;\n }\n\n return results;\n }\n\n /**\n * Split this Interval into smaller Intervals, each of the specified length.\n * Left over time is grouped into a smaller interval\n * @param {Duration|Object|number} duration - The length of each resulting interval.\n * @return {Array}\n */\n splitBy(duration) {\n const dur = Duration.fromDurationLike(duration);\n\n if (!this.isValid || !dur.isValid || dur.as(\"milliseconds\") === 0) {\n return [];\n }\n\n let { s } = this,\n idx = 1,\n next;\n\n const results = [];\n while (s < this.e) {\n const added = this.start.plus(dur.mapUnits((x) => x * idx));\n next = +added > +this.e ? this.e : added;\n results.push(Interval.fromDateTimes(s, next));\n s = next;\n idx += 1;\n }\n\n return results;\n }\n\n /**\n * Split this Interval into the specified number of smaller intervals.\n * @param {number} numberOfParts - The number of Intervals to divide the Interval into.\n * @return {Array}\n */\n divideEqually(numberOfParts) {\n if (!this.isValid) return [];\n return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts);\n }\n\n /**\n * Return whether this Interval overlaps with the specified Interval\n * @param {Interval} other\n * @return {boolean}\n */\n overlaps(other) {\n return this.e > other.s && this.s < other.e;\n }\n\n /**\n * Return whether this Interval's end is adjacent to the specified Interval's start.\n * @param {Interval} other\n * @return {boolean}\n */\n abutsStart(other) {\n if (!this.isValid) return false;\n return +this.e === +other.s;\n }\n\n /**\n * Return whether this Interval's start is adjacent to the specified Interval's end.\n * @param {Interval} other\n * @return {boolean}\n */\n abutsEnd(other) {\n if (!this.isValid) return false;\n return +other.e === +this.s;\n }\n\n /**\n * Returns true if this Interval fully contains the specified Interval, specifically if the intersect (of this Interval and the other Interval) is equal to the other Interval; false otherwise.\n * @param {Interval} other\n * @return {boolean}\n */\n engulfs(other) {\n if (!this.isValid) return false;\n return this.s <= other.s && this.e >= other.e;\n }\n\n /**\n * Return whether this Interval has the same start and end as the specified Interval.\n * @param {Interval} other\n * @return {boolean}\n */\n equals(other) {\n if (!this.isValid || !other.isValid) {\n return false;\n }\n\n return this.s.equals(other.s) && this.e.equals(other.e);\n }\n\n /**\n * Return an Interval representing the intersection of this Interval and the specified Interval.\n * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals.\n * Returns null if the intersection is empty, meaning, the intervals don't intersect.\n * @param {Interval} other\n * @return {Interval}\n */\n intersection(other) {\n if (!this.isValid) return this;\n const s = this.s > other.s ? this.s : other.s,\n e = this.e < other.e ? this.e : other.e;\n\n if (s >= e) {\n return null;\n } else {\n return Interval.fromDateTimes(s, e);\n }\n }\n\n /**\n * Return an Interval representing the union of this Interval and the specified Interval.\n * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals.\n * @param {Interval} other\n * @return {Interval}\n */\n union(other) {\n if (!this.isValid) return this;\n const s = this.s < other.s ? this.s : other.s,\n e = this.e > other.e ? this.e : other.e;\n return Interval.fromDateTimes(s, e);\n }\n\n /**\n * Merge an array of Intervals into an equivalent minimal set of Intervals.\n * Combines overlapping and adjacent Intervals.\n * The resulting array will contain the Intervals in ascending order, that is, starting with the earliest Interval\n * and ending with the latest.\n *\n * @param {Array} intervals\n * @return {Array}\n */\n static merge(intervals) {\n const [found, final] = intervals\n .sort((a, b) => a.s - b.s)\n .reduce(\n ([sofar, current], item) => {\n if (!current) {\n return [sofar, item];\n } else if (current.overlaps(item) || current.abutsStart(item)) {\n return [sofar, current.union(item)];\n } else {\n return [sofar.concat([current]), item];\n }\n },\n [[], null]\n );\n if (final) {\n found.push(final);\n }\n return found;\n }\n\n /**\n * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals.\n * @param {Array} intervals\n * @return {Array}\n */\n static xor(intervals) {\n let start = null,\n currentCount = 0;\n const results = [],\n ends = intervals.map((i) => [\n { time: i.s, type: \"s\" },\n { time: i.e, type: \"e\" },\n ]),\n flattened = Array.prototype.concat(...ends),\n arr = flattened.sort((a, b) => a.time - b.time);\n\n for (const i of arr) {\n currentCount += i.type === \"s\" ? 1 : -1;\n\n if (currentCount === 1) {\n start = i.time;\n } else {\n if (start && +start !== +i.time) {\n results.push(Interval.fromDateTimes(start, i.time));\n }\n\n start = null;\n }\n }\n\n return Interval.merge(results);\n }\n\n /**\n * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals.\n * @param {...Interval} intervals\n * @return {Array}\n */\n difference(...intervals) {\n return Interval.xor([this].concat(intervals))\n .map((i) => this.intersection(i))\n .filter((i) => i && !i.isEmpty());\n }\n\n /**\n * Returns a string representation of this Interval appropriate for debugging.\n * @return {string}\n */\n toString() {\n if (!this.isValid) return INVALID;\n return `[${this.s.toISO()} – ${this.e.toISO()})`;\n }\n\n /**\n * Returns a string representation of this Interval appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `Interval { start: ${this.s.toISO()}, end: ${this.e.toISO()} }`;\n } else {\n return `Interval { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns a localized string representing this Interval. Accepts the same options as the\n * Intl.DateTimeFormat constructor and any presets defined by Luxon, such as\n * {@link DateTime.DATE_FULL} or {@link DateTime.TIME_SIMPLE}. The exact behavior of this method\n * is browser-specific, but in general it will return an appropriate representation of the\n * Interval in the assigned locale. Defaults to the system's locale if no locale has been\n * specified.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {Object} [formatOpts=DateTime.DATE_SHORT] - Either a DateTime preset or\n * Intl.DateTimeFormat constructor options.\n * @param {Object} opts - Options to override the configuration of the start DateTime.\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(); //=> 11/7/2022 – 11/8/2022\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL); //=> November 7 – 8, 2022\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL, { locale: 'fr-FR' }); //=> 7–8 novembre 2022\n * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString(DateTime.TIME_SIMPLE); //=> 6:00 – 8:00 PM\n * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> Mon, Nov 07, 6:00 – 8:00 p\n * @return {string}\n */\n toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) {\n return this.isValid\n ? Formatter.create(this.s.loc.clone(opts), formatOpts).formatInterval(this)\n : INVALID;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Interval.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @param {Object} opts - The same options as {@link DateTime#toISO}\n * @return {string}\n */\n toISO(opts) {\n if (!this.isValid) return INVALID;\n return `${this.s.toISO(opts)}/${this.e.toISO(opts)}`;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of date of this Interval.\n * The time components are ignored.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @return {string}\n */\n toISODate() {\n if (!this.isValid) return INVALID;\n return `${this.s.toISODate()}/${this.e.toISODate()}`;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of time of this Interval.\n * The date components are ignored.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @param {Object} opts - The same options as {@link DateTime#toISO}\n * @return {string}\n */\n toISOTime(opts) {\n if (!this.isValid) return INVALID;\n return `${this.s.toISOTime(opts)}/${this.e.toISOTime(opts)}`;\n }\n\n /**\n * Returns a string representation of this Interval formatted according to the specified format\n * string. **You may not want this.** See {@link Interval#toLocaleString} for a more flexible\n * formatting tool.\n * @param {string} dateFormat - The format string. This string formats the start and end time.\n * See {@link DateTime#toFormat} for details.\n * @param {Object} opts - Options.\n * @param {string} [opts.separator = ' – '] - A separator to place between the start and end\n * representations.\n * @return {string}\n */\n toFormat(dateFormat, { separator = \" – \" } = {}) {\n if (!this.isValid) return INVALID;\n return `${this.s.toFormat(dateFormat)}${separator}${this.e.toFormat(dateFormat)}`;\n }\n\n /**\n * Return a Duration representing the time spanned by this interval.\n * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration.\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 }\n * @return {Duration}\n */\n toDuration(unit, opts) {\n if (!this.isValid) {\n return Duration.invalid(this.invalidReason);\n }\n return this.e.diff(this.s, unit, opts);\n }\n\n /**\n * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes\n * @param {function} mapFn\n * @return {Interval}\n * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC())\n * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 }))\n */\n mapEndpoints(mapFn) {\n return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e));\n }\n}\n","import DateTime from \"./datetime.js\";\nimport Settings from \"./settings.js\";\nimport Locale from \"./impl/locale.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\n\nimport { hasLocaleWeekInfo, hasRelative } from \"./impl/util.js\";\n\n/**\n * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment.\n */\nexport default class Info {\n /**\n * Return whether the specified zone contains a DST.\n * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone.\n * @return {boolean}\n */\n static hasDST(zone = Settings.defaultZone) {\n const proto = DateTime.now().setZone(zone).set({ month: 12 });\n\n return !zone.isUniversal && proto.offset !== proto.set({ month: 6 }).offset;\n }\n\n /**\n * Return whether the specified zone is a valid IANA specifier.\n * @param {string} zone - Zone to check\n * @return {boolean}\n */\n static isValidIANAZone(zone) {\n return IANAZone.isValidZone(zone);\n }\n\n /**\n * Converts the input into a {@link Zone} instance.\n *\n * * If `input` is already a Zone instance, it is returned unchanged.\n * * If `input` is a string containing a valid time zone name, a Zone instance\n * with that name is returned.\n * * If `input` is a string that doesn't refer to a known time zone, a Zone\n * instance with {@link Zone#isValid} == false is returned.\n * * If `input is a number, a Zone instance with the specified fixed offset\n * in minutes is returned.\n * * If `input` is `null` or `undefined`, the default zone is returned.\n * @param {string|Zone|number} [input] - the value to be converted\n * @return {Zone}\n */\n static normalizeZone(input) {\n return normalizeZone(input, Settings.defaultZone);\n }\n\n /**\n * Get the weekday on which the week starts according to the given locale.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number} the start of the week, 1 for Monday through 7 for Sunday\n */\n static getStartOfWeek({ locale = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale)).getStartOfWeek();\n }\n\n /**\n * Get the minimum number of days necessary in a week before it is considered part of the next year according\n * to the given locale.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number}\n */\n static getMinimumDaysInFirstWeek({ locale = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale)).getMinDaysInFirstWeek();\n }\n\n /**\n * Get the weekdays, which are considered the weekend according to the given locale\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number[]} an array of weekdays, 1 for Monday through 7 for Sunday\n */\n static getWeekendWeekdays({ locale = null, locObj = null } = {}) {\n // copy the array, because we cache it internally\n return (locObj || Locale.create(locale)).getWeekendDays().slice();\n }\n\n /**\n * Return an array of standalone month names.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @param {string} [opts.outputCalendar='gregory'] - the calendar\n * @example Info.months()[0] //=> 'January'\n * @example Info.months('short')[0] //=> 'Jan'\n * @example Info.months('numeric')[0] //=> '1'\n * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.'\n * @example Info.months('numeric', { locale: 'ar' })[0] //=> '١'\n * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I'\n * @return {Array}\n */\n static months(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length);\n }\n\n /**\n * Return an array of format month names.\n * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that\n * changes the string.\n * See {@link Info#months}\n * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @param {string} [opts.outputCalendar='gregory'] - the calendar\n * @return {Array}\n */\n static monthsFormat(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true);\n }\n\n /**\n * Return an array of standalone week names.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {string} [length='long'] - the length of the weekday representation, such as \"narrow\", \"short\", \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @example Info.weekdays()[0] //=> 'Monday'\n * @example Info.weekdays('short')[0] //=> 'Mon'\n * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.'\n * @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين'\n * @return {Array}\n */\n static weekdays(length = \"long\", { locale = null, numberingSystem = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length);\n }\n\n /**\n * Return an array of format week names.\n * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that\n * changes the string.\n * See {@link Info#weekdays}\n * @param {string} [length='long'] - the length of the month representation, such as \"narrow\", \"short\", \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale=null] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @return {Array}\n */\n static weekdaysFormat(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true);\n }\n\n /**\n * Return an array of meridiems.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @example Info.meridiems() //=> [ 'AM', 'PM' ]\n * @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ]\n * @return {Array}\n */\n static meridiems({ locale = null } = {}) {\n return Locale.create(locale).meridiems();\n }\n\n /**\n * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian.\n * @param {string} [length='short'] - the length of the era representation, such as \"short\" or \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @example Info.eras() //=> [ 'BC', 'AD' ]\n * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ]\n * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ]\n * @return {Array}\n */\n static eras(length = \"short\", { locale = null } = {}) {\n return Locale.create(locale, null, \"gregory\").eras(length);\n }\n\n /**\n * Return the set of available features in this environment.\n * Some features of Luxon are not available in all environments. For example, on older browsers, relative time formatting support is not available. Use this function to figure out if that's the case.\n * Keys:\n * * `relative`: whether this environment supports relative time formatting\n * * `localeWeek`: whether this environment supports different weekdays for the start of the week based on the locale\n * @example Info.features() //=> { relative: false, localeWeek: true }\n * @return {Object}\n */\n static features() {\n return { relative: hasRelative(), localeWeek: hasLocaleWeekInfo() };\n }\n}\n","import Duration from \"../duration.js\";\n\nfunction dayDiff(earlier, later) {\n const utcDayStart = (dt) => dt.toUTC(0, { keepLocalTime: true }).startOf(\"day\").valueOf(),\n ms = utcDayStart(later) - utcDayStart(earlier);\n return Math.floor(Duration.fromMillis(ms).as(\"days\"));\n}\n\nfunction highOrderDiffs(cursor, later, units) {\n const differs = [\n [\"years\", (a, b) => b.year - a.year],\n [\"quarters\", (a, b) => b.quarter - a.quarter + (b.year - a.year) * 4],\n [\"months\", (a, b) => b.month - a.month + (b.year - a.year) * 12],\n [\n \"weeks\",\n (a, b) => {\n const days = dayDiff(a, b);\n return (days - (days % 7)) / 7;\n },\n ],\n [\"days\", dayDiff],\n ];\n\n const results = {};\n const earlier = cursor;\n let lowestOrder, highWater;\n\n /* This loop tries to diff using larger units first.\n If we overshoot, we backtrack and try the next smaller unit.\n \"cursor\" starts out at the earlier timestamp and moves closer and closer to \"later\"\n as we use smaller and smaller units.\n highWater keeps track of where we would be if we added one more of the smallest unit,\n this is used later to potentially convert any difference smaller than the smallest higher order unit\n into a fraction of that smallest higher order unit\n */\n for (const [unit, differ] of differs) {\n if (units.indexOf(unit) >= 0) {\n lowestOrder = unit;\n\n results[unit] = differ(cursor, later);\n highWater = earlier.plus(results);\n\n if (highWater > later) {\n // we overshot the end point, backtrack cursor by 1\n results[unit]--;\n cursor = earlier.plus(results);\n\n // if we are still overshooting now, we need to backtrack again\n // this happens in certain situations when diffing times in different zones,\n // because this calculation ignores time zones\n if (cursor > later) {\n // keep the \"overshot by 1\" around as highWater\n highWater = cursor;\n // backtrack cursor by 1\n results[unit]--;\n cursor = earlier.plus(results);\n }\n } else {\n cursor = highWater;\n }\n }\n }\n\n return [cursor, results, highWater, lowestOrder];\n}\n\nexport default function (earlier, later, units, opts) {\n let [cursor, results, highWater, lowestOrder] = highOrderDiffs(earlier, later, units);\n\n const remainingMillis = later - cursor;\n\n const lowerOrderUnits = units.filter(\n (u) => [\"hours\", \"minutes\", \"seconds\", \"milliseconds\"].indexOf(u) >= 0\n );\n\n if (lowerOrderUnits.length === 0) {\n if (highWater < later) {\n highWater = cursor.plus({ [lowestOrder]: 1 });\n }\n\n if (highWater !== cursor) {\n results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor);\n }\n }\n\n const duration = Duration.fromObject(results, opts);\n\n if (lowerOrderUnits.length > 0) {\n return Duration.fromMillis(remainingMillis, opts)\n .shiftTo(...lowerOrderUnits)\n .plus(duration);\n } else {\n return duration;\n }\n}\n","import { parseMillis, isUndefined, untruncateYear, signedOffset, hasOwnProperty } from \"./util.js\";\nimport Formatter from \"./formatter.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\nimport DateTime from \"../datetime.js\";\nimport { digitRegex, parseDigits } from \"./digits.js\";\nimport { ConflictingSpecificationError } from \"../errors.js\";\n\nconst MISSING_FTP = \"missing Intl.DateTimeFormat.formatToParts support\";\n\nfunction intUnit(regex, post = (i) => i) {\n return { regex, deser: ([s]) => post(parseDigits(s)) };\n}\n\nconst NBSP = String.fromCharCode(160);\nconst spaceOrNBSP = `[ ${NBSP}]`;\nconst spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, \"g\");\n\nfunction fixListRegex(s) {\n // make dots optional and also make them literal\n // make space and non breakable space characters interchangeable\n return s.replace(/\\./g, \"\\\\.?\").replace(spaceOrNBSPRegExp, spaceOrNBSP);\n}\n\nfunction stripInsensitivities(s) {\n return s\n .replace(/\\./g, \"\") // ignore dots that were made optional\n .replace(spaceOrNBSPRegExp, \" \") // interchange space and nbsp\n .toLowerCase();\n}\n\nfunction oneOf(strings, startIndex) {\n if (strings === null) {\n return null;\n } else {\n return {\n regex: RegExp(strings.map(fixListRegex).join(\"|\")),\n deser: ([s]) =>\n strings.findIndex((i) => stripInsensitivities(s) === stripInsensitivities(i)) + startIndex,\n };\n }\n}\n\nfunction offset(regex, groups) {\n return { regex, deser: ([, h, m]) => signedOffset(h, m), groups };\n}\n\nfunction simple(regex) {\n return { regex, deser: ([s]) => s };\n}\n\nfunction escapeToken(value) {\n return value.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\");\n}\n\n/**\n * @param token\n * @param {Locale} loc\n */\nfunction unitForToken(token, loc) {\n const one = digitRegex(loc),\n two = digitRegex(loc, \"{2}\"),\n three = digitRegex(loc, \"{3}\"),\n four = digitRegex(loc, \"{4}\"),\n six = digitRegex(loc, \"{6}\"),\n oneOrTwo = digitRegex(loc, \"{1,2}\"),\n oneToThree = digitRegex(loc, \"{1,3}\"),\n oneToSix = digitRegex(loc, \"{1,6}\"),\n oneToNine = digitRegex(loc, \"{1,9}\"),\n twoToFour = digitRegex(loc, \"{2,4}\"),\n fourToSix = digitRegex(loc, \"{4,6}\"),\n literal = (t) => ({ regex: RegExp(escapeToken(t.val)), deser: ([s]) => s, literal: true }),\n unitate = (t) => {\n if (token.literal) {\n return literal(t);\n }\n switch (t.val) {\n // era\n case \"G\":\n return oneOf(loc.eras(\"short\"), 0);\n case \"GG\":\n return oneOf(loc.eras(\"long\"), 0);\n // years\n case \"y\":\n return intUnit(oneToSix);\n case \"yy\":\n return intUnit(twoToFour, untruncateYear);\n case \"yyyy\":\n return intUnit(four);\n case \"yyyyy\":\n return intUnit(fourToSix);\n case \"yyyyyy\":\n return intUnit(six);\n // months\n case \"M\":\n return intUnit(oneOrTwo);\n case \"MM\":\n return intUnit(two);\n case \"MMM\":\n return oneOf(loc.months(\"short\", true), 1);\n case \"MMMM\":\n return oneOf(loc.months(\"long\", true), 1);\n case \"L\":\n return intUnit(oneOrTwo);\n case \"LL\":\n return intUnit(two);\n case \"LLL\":\n return oneOf(loc.months(\"short\", false), 1);\n case \"LLLL\":\n return oneOf(loc.months(\"long\", false), 1);\n // dates\n case \"d\":\n return intUnit(oneOrTwo);\n case \"dd\":\n return intUnit(two);\n // ordinals\n case \"o\":\n return intUnit(oneToThree);\n case \"ooo\":\n return intUnit(three);\n // time\n case \"HH\":\n return intUnit(two);\n case \"H\":\n return intUnit(oneOrTwo);\n case \"hh\":\n return intUnit(two);\n case \"h\":\n return intUnit(oneOrTwo);\n case \"mm\":\n return intUnit(two);\n case \"m\":\n return intUnit(oneOrTwo);\n case \"q\":\n return intUnit(oneOrTwo);\n case \"qq\":\n return intUnit(two);\n case \"s\":\n return intUnit(oneOrTwo);\n case \"ss\":\n return intUnit(two);\n case \"S\":\n return intUnit(oneToThree);\n case \"SSS\":\n return intUnit(three);\n case \"u\":\n return simple(oneToNine);\n case \"uu\":\n return simple(oneOrTwo);\n case \"uuu\":\n return intUnit(one);\n // meridiem\n case \"a\":\n return oneOf(loc.meridiems(), 0);\n // weekYear (k)\n case \"kkkk\":\n return intUnit(four);\n case \"kk\":\n return intUnit(twoToFour, untruncateYear);\n // weekNumber (W)\n case \"W\":\n return intUnit(oneOrTwo);\n case \"WW\":\n return intUnit(two);\n // weekdays\n case \"E\":\n case \"c\":\n return intUnit(one);\n case \"EEE\":\n return oneOf(loc.weekdays(\"short\", false), 1);\n case \"EEEE\":\n return oneOf(loc.weekdays(\"long\", false), 1);\n case \"ccc\":\n return oneOf(loc.weekdays(\"short\", true), 1);\n case \"cccc\":\n return oneOf(loc.weekdays(\"long\", true), 1);\n // offset/zone\n case \"Z\":\n case \"ZZ\":\n return offset(new RegExp(`([+-]${oneOrTwo.source})(?::(${two.source}))?`), 2);\n case \"ZZZ\":\n return offset(new RegExp(`([+-]${oneOrTwo.source})(${two.source})?`), 2);\n // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing\n // because we don't have any way to figure out what they are\n case \"z\":\n return simple(/[a-z_+-/]{1,256}?/i);\n // this special-case \"token\" represents a place where a macro-token expanded into a white-space literal\n // in this case we accept any non-newline white-space\n case \" \":\n return simple(/[^\\S\\n\\r]/);\n default:\n return literal(t);\n }\n };\n\n const unit = unitate(token) || {\n invalidReason: MISSING_FTP,\n };\n\n unit.token = token;\n\n return unit;\n}\n\nconst partTypeStyleToTokenVal = {\n year: {\n \"2-digit\": \"yy\",\n numeric: \"yyyyy\",\n },\n month: {\n numeric: \"M\",\n \"2-digit\": \"MM\",\n short: \"MMM\",\n long: \"MMMM\",\n },\n day: {\n numeric: \"d\",\n \"2-digit\": \"dd\",\n },\n weekday: {\n short: \"EEE\",\n long: \"EEEE\",\n },\n dayperiod: \"a\",\n dayPeriod: \"a\",\n hour12: {\n numeric: \"h\",\n \"2-digit\": \"hh\",\n },\n hour24: {\n numeric: \"H\",\n \"2-digit\": \"HH\",\n },\n minute: {\n numeric: \"m\",\n \"2-digit\": \"mm\",\n },\n second: {\n numeric: \"s\",\n \"2-digit\": \"ss\",\n },\n timeZoneName: {\n long: \"ZZZZZ\",\n short: \"ZZZ\",\n },\n};\n\nfunction tokenForPart(part, formatOpts, resolvedOpts) {\n const { type, value } = part;\n\n if (type === \"literal\") {\n const isSpace = /^\\s+$/.test(value);\n return {\n literal: !isSpace,\n val: isSpace ? \" \" : value,\n };\n }\n\n const style = formatOpts[type];\n\n // The user might have explicitly specified hour12 or hourCycle\n // if so, respect their decision\n // if not, refer back to the resolvedOpts, which are based on the locale\n let actualType = type;\n if (type === \"hour\") {\n if (formatOpts.hour12 != null) {\n actualType = formatOpts.hour12 ? \"hour12\" : \"hour24\";\n } else if (formatOpts.hourCycle != null) {\n if (formatOpts.hourCycle === \"h11\" || formatOpts.hourCycle === \"h12\") {\n actualType = \"hour12\";\n } else {\n actualType = \"hour24\";\n }\n } else {\n // tokens only differentiate between 24 hours or not,\n // so we do not need to check hourCycle here, which is less supported anyways\n actualType = resolvedOpts.hour12 ? \"hour12\" : \"hour24\";\n }\n }\n let val = partTypeStyleToTokenVal[actualType];\n if (typeof val === \"object\") {\n val = val[style];\n }\n\n if (val) {\n return {\n literal: false,\n val,\n };\n }\n\n return undefined;\n}\n\nfunction buildRegex(units) {\n const re = units.map((u) => u.regex).reduce((f, r) => `${f}(${r.source})`, \"\");\n return [`^${re}$`, units];\n}\n\nfunction match(input, regex, handlers) {\n const matches = input.match(regex);\n\n if (matches) {\n const all = {};\n let matchIndex = 1;\n for (const i in handlers) {\n if (hasOwnProperty(handlers, i)) {\n const h = handlers[i],\n groups = h.groups ? h.groups + 1 : 1;\n if (!h.literal && h.token) {\n all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups));\n }\n matchIndex += groups;\n }\n }\n return [matches, all];\n } else {\n return [matches, {}];\n }\n}\n\nfunction dateTimeFromMatches(matches) {\n const toField = (token) => {\n switch (token) {\n case \"S\":\n return \"millisecond\";\n case \"s\":\n return \"second\";\n case \"m\":\n return \"minute\";\n case \"h\":\n case \"H\":\n return \"hour\";\n case \"d\":\n return \"day\";\n case \"o\":\n return \"ordinal\";\n case \"L\":\n case \"M\":\n return \"month\";\n case \"y\":\n return \"year\";\n case \"E\":\n case \"c\":\n return \"weekday\";\n case \"W\":\n return \"weekNumber\";\n case \"k\":\n return \"weekYear\";\n case \"q\":\n return \"quarter\";\n default:\n return null;\n }\n };\n\n let zone = null;\n let specificOffset;\n if (!isUndefined(matches.z)) {\n zone = IANAZone.create(matches.z);\n }\n\n if (!isUndefined(matches.Z)) {\n if (!zone) {\n zone = new FixedOffsetZone(matches.Z);\n }\n specificOffset = matches.Z;\n }\n\n if (!isUndefined(matches.q)) {\n matches.M = (matches.q - 1) * 3 + 1;\n }\n\n if (!isUndefined(matches.h)) {\n if (matches.h < 12 && matches.a === 1) {\n matches.h += 12;\n } else if (matches.h === 12 && matches.a === 0) {\n matches.h = 0;\n }\n }\n\n if (matches.G === 0 && matches.y) {\n matches.y = -matches.y;\n }\n\n if (!isUndefined(matches.u)) {\n matches.S = parseMillis(matches.u);\n }\n\n const vals = Object.keys(matches).reduce((r, k) => {\n const f = toField(k);\n if (f) {\n r[f] = matches[k];\n }\n\n return r;\n }, {});\n\n return [vals, zone, specificOffset];\n}\n\nlet dummyDateTimeCache = null;\n\nfunction getDummyDateTime() {\n if (!dummyDateTimeCache) {\n dummyDateTimeCache = DateTime.fromMillis(1555555555555);\n }\n\n return dummyDateTimeCache;\n}\n\nfunction maybeExpandMacroToken(token, locale) {\n if (token.literal) {\n return token;\n }\n\n const formatOpts = Formatter.macroTokenToFormatOpts(token.val);\n const tokens = formatOptsToTokens(formatOpts, locale);\n\n if (tokens == null || tokens.includes(undefined)) {\n return token;\n }\n\n return tokens;\n}\n\nexport function expandMacroTokens(tokens, locale) {\n return Array.prototype.concat(...tokens.map((t) => maybeExpandMacroToken(t, locale)));\n}\n\n/**\n * @private\n */\n\nexport class TokenParser {\n constructor(locale, format) {\n this.locale = locale;\n this.format = format;\n this.tokens = expandMacroTokens(Formatter.parseFormat(format), locale);\n this.units = this.tokens.map((t) => unitForToken(t, locale));\n this.disqualifyingUnit = this.units.find((t) => t.invalidReason);\n\n if (!this.disqualifyingUnit) {\n const [regexString, handlers] = buildRegex(this.units);\n this.regex = RegExp(regexString, \"i\");\n this.handlers = handlers;\n }\n }\n\n explainFromTokens(input) {\n if (!this.isValid) {\n return { input, tokens: this.tokens, invalidReason: this.invalidReason };\n } else {\n const [rawMatches, matches] = match(input, this.regex, this.handlers),\n [result, zone, specificOffset] = matches\n ? dateTimeFromMatches(matches)\n : [null, null, undefined];\n if (hasOwnProperty(matches, \"a\") && hasOwnProperty(matches, \"H\")) {\n throw new ConflictingSpecificationError(\n \"Can't include meridiem when specifying 24-hour format\"\n );\n }\n return {\n input,\n tokens: this.tokens,\n regex: this.regex,\n rawMatches,\n matches,\n result,\n zone,\n specificOffset,\n };\n }\n }\n\n get isValid() {\n return !this.disqualifyingUnit;\n }\n\n get invalidReason() {\n return this.disqualifyingUnit ? this.disqualifyingUnit.invalidReason : null;\n }\n}\n\nexport function explainFromTokens(locale, input, format) {\n const parser = new TokenParser(locale, format);\n return parser.explainFromTokens(input);\n}\n\nexport function parseFromTokens(locale, input, format) {\n const { result, zone, specificOffset, invalidReason } = explainFromTokens(locale, input, format);\n return [result, zone, specificOffset, invalidReason];\n}\n\nexport function formatOptsToTokens(formatOpts, locale) {\n if (!formatOpts) {\n return null;\n }\n\n const formatter = Formatter.create(locale, formatOpts);\n const df = formatter.dtFormatter(getDummyDateTime());\n const parts = df.formatToParts();\n const resolvedOpts = df.resolvedOptions();\n return parts.map((p) => tokenForPart(p, formatOpts, resolvedOpts));\n}\n","import Duration from \"./duration.js\";\nimport Interval from \"./interval.js\";\nimport Settings from \"./settings.js\";\nimport Info from \"./info.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport FixedOffsetZone from \"./zones/fixedOffsetZone.js\";\nimport Locale from \"./impl/locale.js\";\nimport {\n isUndefined,\n maybeArray,\n isDate,\n isNumber,\n bestBy,\n daysInMonth,\n daysInYear,\n isLeapYear,\n weeksInWeekYear,\n normalizeObject,\n roundTo,\n objToLocalTS,\n padStart,\n} from \"./impl/util.js\";\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\nimport diff from \"./impl/diff.js\";\nimport { parseRFC2822Date, parseISODate, parseHTTPDate, parseSQL } from \"./impl/regexParser.js\";\nimport {\n parseFromTokens,\n explainFromTokens,\n formatOptsToTokens,\n expandMacroTokens,\n TokenParser,\n} from \"./impl/tokenParser.js\";\nimport {\n gregorianToWeek,\n weekToGregorian,\n gregorianToOrdinal,\n ordinalToGregorian,\n hasInvalidGregorianData,\n hasInvalidWeekData,\n hasInvalidOrdinalData,\n hasInvalidTimeData,\n usesLocalWeekValues,\n isoWeekdayToLocal,\n} from \"./impl/conversions.js\";\nimport * as Formats from \"./impl/formats.js\";\nimport {\n InvalidArgumentError,\n ConflictingSpecificationError,\n InvalidUnitError,\n InvalidDateTimeError,\n} from \"./errors.js\";\nimport Invalid from \"./impl/invalid.js\";\n\nconst INVALID = \"Invalid DateTime\";\nconst MAX_DATE = 8.64e15;\n\nfunction unsupportedZone(zone) {\n return new Invalid(\"unsupported zone\", `the zone \"${zone.name}\" is not supported`);\n}\n\n// we cache week data on the DT object and this intermediates the cache\n/**\n * @param {DateTime} dt\n */\nfunction possiblyCachedWeekData(dt) {\n if (dt.weekData === null) {\n dt.weekData = gregorianToWeek(dt.c);\n }\n return dt.weekData;\n}\n\n/**\n * @param {DateTime} dt\n */\nfunction possiblyCachedLocalWeekData(dt) {\n if (dt.localWeekData === null) {\n dt.localWeekData = gregorianToWeek(\n dt.c,\n dt.loc.getMinDaysInFirstWeek(),\n dt.loc.getStartOfWeek()\n );\n }\n return dt.localWeekData;\n}\n\n// clone really means, \"make a new object with these modifications\". all \"setters\" really use this\n// to create a new object while only changing some of the properties\nfunction clone(inst, alts) {\n const current = {\n ts: inst.ts,\n zone: inst.zone,\n c: inst.c,\n o: inst.o,\n loc: inst.loc,\n invalid: inst.invalid,\n };\n return new DateTime({ ...current, ...alts, old: current });\n}\n\n// find the right offset a given local time. The o input is our guess, which determines which\n// offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST)\nfunction fixOffset(localTS, o, tz) {\n // Our UTC time is just a guess because our offset is just a guess\n let utcGuess = localTS - o * 60 * 1000;\n\n // Test whether the zone matches the offset for this ts\n const o2 = tz.offset(utcGuess);\n\n // If so, offset didn't change and we're done\n if (o === o2) {\n return [utcGuess, o];\n }\n\n // If not, change the ts by the difference in the offset\n utcGuess -= (o2 - o) * 60 * 1000;\n\n // If that gives us the local time we want, we're done\n const o3 = tz.offset(utcGuess);\n if (o2 === o3) {\n return [utcGuess, o2];\n }\n\n // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time\n return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)];\n}\n\n// convert an epoch timestamp into a calendar object with the given offset\nfunction tsToObj(ts, offset) {\n ts += offset * 60 * 1000;\n\n const d = new Date(ts);\n\n return {\n year: d.getUTCFullYear(),\n month: d.getUTCMonth() + 1,\n day: d.getUTCDate(),\n hour: d.getUTCHours(),\n minute: d.getUTCMinutes(),\n second: d.getUTCSeconds(),\n millisecond: d.getUTCMilliseconds(),\n };\n}\n\n// convert a calendar object to a epoch timestamp\nfunction objToTS(obj, offset, zone) {\n return fixOffset(objToLocalTS(obj), offset, zone);\n}\n\n// create a new DT instance by adding a duration, adjusting for DSTs\nfunction adjustTime(inst, dur) {\n const oPre = inst.o,\n year = inst.c.year + Math.trunc(dur.years),\n month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3,\n c = {\n ...inst.c,\n year,\n month,\n day:\n Math.min(inst.c.day, daysInMonth(year, month)) +\n Math.trunc(dur.days) +\n Math.trunc(dur.weeks) * 7,\n },\n millisToAdd = Duration.fromObject({\n years: dur.years - Math.trunc(dur.years),\n quarters: dur.quarters - Math.trunc(dur.quarters),\n months: dur.months - Math.trunc(dur.months),\n weeks: dur.weeks - Math.trunc(dur.weeks),\n days: dur.days - Math.trunc(dur.days),\n hours: dur.hours,\n minutes: dur.minutes,\n seconds: dur.seconds,\n milliseconds: dur.milliseconds,\n }).as(\"milliseconds\"),\n localTS = objToLocalTS(c);\n\n let [ts, o] = fixOffset(localTS, oPre, inst.zone);\n\n if (millisToAdd !== 0) {\n ts += millisToAdd;\n // that could have changed the offset by going over a DST, but we want to keep the ts the same\n o = inst.zone.offset(ts);\n }\n\n return { ts, o };\n}\n\n// helper useful in turning the results of parsing into real dates\n// by handling the zone options\nfunction parseDataToDateTime(parsed, parsedZone, opts, format, text, specificOffset) {\n const { setZone, zone } = opts;\n if ((parsed && Object.keys(parsed).length !== 0) || parsedZone) {\n const interpretationZone = parsedZone || zone,\n inst = DateTime.fromObject(parsed, {\n ...opts,\n zone: interpretationZone,\n specificOffset,\n });\n return setZone ? inst : inst.setZone(zone);\n } else {\n return DateTime.invalid(\n new Invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ${format}`)\n );\n }\n}\n\n// if you want to output a technical format (e.g. RFC 2822), this helper\n// helps handle the details\nfunction toTechFormat(dt, format, allowZ = true) {\n return dt.isValid\n ? Formatter.create(Locale.create(\"en-US\"), {\n allowZ,\n forceSimple: true,\n }).formatDateTimeFromString(dt, format)\n : null;\n}\n\nfunction toISODate(o, extended, precision) {\n const longFormat = o.c.year > 9999 || o.c.year < 0;\n let c = \"\";\n if (longFormat && o.c.year >= 0) c += \"+\";\n c += padStart(o.c.year, longFormat ? 6 : 4);\n if (precision === \"year\") return c;\n if (extended) {\n c += \"-\";\n c += padStart(o.c.month);\n if (precision === \"month\") return c;\n c += \"-\";\n } else {\n c += padStart(o.c.month);\n if (precision === \"month\") return c;\n }\n c += padStart(o.c.day);\n return c;\n}\n\nfunction toISOTime(\n o,\n extended,\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n) {\n let showSeconds = !suppressSeconds || o.c.millisecond !== 0 || o.c.second !== 0,\n c = \"\";\n switch (precision) {\n case \"day\":\n case \"month\":\n case \"year\":\n break;\n default:\n c += padStart(o.c.hour);\n if (precision === \"hour\") break;\n if (extended) {\n c += \":\";\n c += padStart(o.c.minute);\n if (precision === \"minute\") break;\n if (showSeconds) {\n c += \":\";\n c += padStart(o.c.second);\n }\n } else {\n c += padStart(o.c.minute);\n if (precision === \"minute\") break;\n if (showSeconds) {\n c += padStart(o.c.second);\n }\n }\n if (precision === \"second\") break;\n if (showSeconds && (!suppressMilliseconds || o.c.millisecond !== 0)) {\n c += \".\";\n c += padStart(o.c.millisecond, 3);\n }\n }\n\n if (includeOffset) {\n if (o.isOffsetFixed && o.offset === 0 && !extendedZone) {\n c += \"Z\";\n } else if (o.o < 0) {\n c += \"-\";\n c += padStart(Math.trunc(-o.o / 60));\n c += \":\";\n c += padStart(Math.trunc(-o.o % 60));\n } else {\n c += \"+\";\n c += padStart(Math.trunc(o.o / 60));\n c += \":\";\n c += padStart(Math.trunc(o.o % 60));\n }\n }\n\n if (extendedZone) {\n c += \"[\" + o.zone.ianaName + \"]\";\n }\n return c;\n}\n\n// defaults for unspecified units in the supported calendars\nconst defaultUnitValues = {\n month: 1,\n day: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n },\n defaultWeekUnitValues = {\n weekNumber: 1,\n weekday: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n },\n defaultOrdinalUnitValues = {\n ordinal: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n };\n\n// Units in the supported calendars, sorted by bigness\nconst orderedUnits = [\"year\", \"month\", \"day\", \"hour\", \"minute\", \"second\", \"millisecond\"],\n orderedWeekUnits = [\n \"weekYear\",\n \"weekNumber\",\n \"weekday\",\n \"hour\",\n \"minute\",\n \"second\",\n \"millisecond\",\n ],\n orderedOrdinalUnits = [\"year\", \"ordinal\", \"hour\", \"minute\", \"second\", \"millisecond\"];\n\n// standardize case and plurality in units\nfunction normalizeUnit(unit) {\n const normalized = {\n year: \"year\",\n years: \"year\",\n month: \"month\",\n months: \"month\",\n day: \"day\",\n days: \"day\",\n hour: \"hour\",\n hours: \"hour\",\n minute: \"minute\",\n minutes: \"minute\",\n quarter: \"quarter\",\n quarters: \"quarter\",\n second: \"second\",\n seconds: \"second\",\n millisecond: \"millisecond\",\n milliseconds: \"millisecond\",\n weekday: \"weekday\",\n weekdays: \"weekday\",\n weeknumber: \"weekNumber\",\n weeksnumber: \"weekNumber\",\n weeknumbers: \"weekNumber\",\n weekyear: \"weekYear\",\n weekyears: \"weekYear\",\n ordinal: \"ordinal\",\n }[unit.toLowerCase()];\n\n if (!normalized) throw new InvalidUnitError(unit);\n\n return normalized;\n}\n\nfunction normalizeUnitWithLocalWeeks(unit) {\n switch (unit.toLowerCase()) {\n case \"localweekday\":\n case \"localweekdays\":\n return \"localWeekday\";\n case \"localweeknumber\":\n case \"localweeknumbers\":\n return \"localWeekNumber\";\n case \"localweekyear\":\n case \"localweekyears\":\n return \"localWeekYear\";\n default:\n return normalizeUnit(unit);\n }\n}\n\n// cache offsets for zones based on the current timestamp when this function is\n// first called. When we are handling a datetime from components like (year,\n// month, day, hour) in a time zone, we need a guess about what the timezone\n// offset is so that we can convert into a UTC timestamp. One way is to find the\n// offset of now in the zone. The actual date may have a different offset (for\n// example, if we handle a date in June while we're in December in a zone that\n// observes DST), but we can check and adjust that.\n//\n// When handling many dates, calculating the offset for now every time is\n// expensive. It's just a guess, so we can cache the offset to use even if we\n// are right on a time change boundary (we'll just correct in the other\n// direction). Using a timestamp from first read is a slight optimization for\n// handling dates close to the current date, since those dates will usually be\n// in the same offset (we could set the timestamp statically, instead). We use a\n// single timestamp for all zones to make things a bit more predictable.\n//\n// This is safe for quickDT (used by local() and utc()) because we don't fill in\n// higher-order units from tsNow (as we do in fromObject, this requires that\n// offset is calculated from tsNow).\n/**\n * @param {Zone} zone\n * @return {number}\n */\nfunction guessOffsetForZone(zone) {\n if (zoneOffsetTs === undefined) {\n zoneOffsetTs = Settings.now();\n }\n\n // Do not cache anything but IANA zones, because it is not safe to do so.\n // Guessing an offset which is not present in the zone can cause wrong results from fixOffset\n if (zone.type !== \"iana\") {\n return zone.offset(zoneOffsetTs);\n }\n const zoneName = zone.name;\n let offsetGuess = zoneOffsetGuessCache.get(zoneName);\n if (offsetGuess === undefined) {\n offsetGuess = zone.offset(zoneOffsetTs);\n zoneOffsetGuessCache.set(zoneName, offsetGuess);\n }\n return offsetGuess;\n}\n\n// this is a dumbed down version of fromObject() that runs about 60% faster\n// but doesn't do any validation, makes a bunch of assumptions about what units\n// are present, and so on.\nfunction quickDT(obj, opts) {\n const zone = normalizeZone(opts.zone, Settings.defaultZone);\n if (!zone.isValid) {\n return DateTime.invalid(unsupportedZone(zone));\n }\n\n const loc = Locale.fromObject(opts);\n\n let ts, o;\n\n // assume we have the higher-order units\n if (!isUndefined(obj.year)) {\n for (const u of orderedUnits) {\n if (isUndefined(obj[u])) {\n obj[u] = defaultUnitValues[u];\n }\n }\n\n const invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj);\n if (invalid) {\n return DateTime.invalid(invalid);\n }\n\n const offsetProvis = guessOffsetForZone(zone);\n [ts, o] = objToTS(obj, offsetProvis, zone);\n } else {\n ts = Settings.now();\n }\n\n return new DateTime({ ts, zone, loc, o });\n}\n\nfunction diffRelative(start, end, opts) {\n const round = isUndefined(opts.round) ? true : opts.round,\n rounding = isUndefined(opts.rounding) ? \"trunc\" : opts.rounding,\n format = (c, unit) => {\n c = roundTo(c, round || opts.calendary ? 0 : 2, opts.calendary ? \"round\" : rounding);\n const formatter = end.loc.clone(opts).relFormatter(opts);\n return formatter.format(c, unit);\n },\n differ = (unit) => {\n if (opts.calendary) {\n if (!end.hasSame(start, unit)) {\n return end.startOf(unit).diff(start.startOf(unit), unit).get(unit);\n } else return 0;\n } else {\n return end.diff(start, unit).get(unit);\n }\n };\n\n if (opts.unit) {\n return format(differ(opts.unit), opts.unit);\n }\n\n for (const unit of opts.units) {\n const count = differ(unit);\n if (Math.abs(count) >= 1) {\n return format(count, unit);\n }\n }\n return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]);\n}\n\nfunction lastOpts(argList) {\n let opts = {},\n args;\n if (argList.length > 0 && typeof argList[argList.length - 1] === \"object\") {\n opts = argList[argList.length - 1];\n args = Array.from(argList).slice(0, argList.length - 1);\n } else {\n args = Array.from(argList);\n }\n return [opts, args];\n}\n\n/**\n * Timestamp to use for cached zone offset guesses (exposed for test)\n */\nlet zoneOffsetTs;\n/**\n * Cache for zone offset guesses (exposed for test).\n *\n * This optimizes quickDT via guessOffsetForZone to avoid repeated calls of\n * zone.offset().\n */\nconst zoneOffsetGuessCache = new Map();\n\n/**\n * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them.\n *\n * A DateTime comprises of:\n * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch.\n * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone).\n * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`.\n *\n * Here is a brief overview of the most commonly used functionality it provides:\n *\n * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link DateTime.local}, {@link DateTime.utc}, and (most flexibly) {@link DateTime.fromObject}. To create one from a standard string format, use {@link DateTime.fromISO}, {@link DateTime.fromHTTP}, and {@link DateTime.fromRFC2822}. To create one from a custom string format, use {@link DateTime.fromFormat}. To create one from a native JS date, use {@link DateTime.fromJSDate}.\n * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link DateTime#toObject}), use the {@link DateTime#year}, {@link DateTime#month},\n * {@link DateTime#day}, {@link DateTime#hour}, {@link DateTime#minute}, {@link DateTime#second}, {@link DateTime#millisecond} accessors.\n * * **Week calendar**: For ISO week calendar attributes, see the {@link DateTime#weekYear}, {@link DateTime#weekNumber}, and {@link DateTime#weekday} accessors.\n * * **Configuration** See the {@link DateTime#locale} and {@link DateTime#numberingSystem} accessors.\n * * **Transformation**: To transform the DateTime into other DateTimes, use {@link DateTime#set}, {@link DateTime#reconfigure}, {@link DateTime#setZone}, {@link DateTime#setLocale}, {@link DateTime.plus}, {@link DateTime#minus}, {@link DateTime#endOf}, {@link DateTime#startOf}, {@link DateTime#toUTC}, and {@link DateTime#toLocal}.\n * * **Output**: To convert the DateTime to other representations, use the {@link DateTime#toRelative}, {@link DateTime#toRelativeCalendar}, {@link DateTime#toJSON}, {@link DateTime#toISO}, {@link DateTime#toHTTP}, {@link DateTime#toObject}, {@link DateTime#toRFC2822}, {@link DateTime#toString}, {@link DateTime#toLocaleString}, {@link DateTime#toFormat}, {@link DateTime#toMillis} and {@link DateTime#toJSDate}.\n *\n * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation.\n */\nexport default class DateTime {\n /**\n * @access private\n */\n constructor(config) {\n const zone = config.zone || Settings.defaultZone;\n\n let invalid =\n config.invalid ||\n (Number.isNaN(config.ts) ? new Invalid(\"invalid input\") : null) ||\n (!zone.isValid ? unsupportedZone(zone) : null);\n /**\n * @access private\n */\n this.ts = isUndefined(config.ts) ? Settings.now() : config.ts;\n\n let c = null,\n o = null;\n if (!invalid) {\n const unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone);\n\n if (unchanged) {\n [c, o] = [config.old.c, config.old.o];\n } else {\n // If an offset has been passed and we have not been called from\n // clone(), we can trust it and avoid the offset calculation.\n const ot = isNumber(config.o) && !config.old ? config.o : zone.offset(this.ts);\n c = tsToObj(this.ts, ot);\n invalid = Number.isNaN(c.year) ? new Invalid(\"invalid input\") : null;\n c = invalid ? null : c;\n o = invalid ? null : ot;\n }\n }\n\n /**\n * @access private\n */\n this._zone = zone;\n /**\n * @access private\n */\n this.loc = config.loc || Locale.create();\n /**\n * @access private\n */\n this.invalid = invalid;\n /**\n * @access private\n */\n this.weekData = null;\n /**\n * @access private\n */\n this.localWeekData = null;\n /**\n * @access private\n */\n this.c = c;\n /**\n * @access private\n */\n this.o = o;\n /**\n * @access private\n */\n this.isLuxonDateTime = true;\n }\n\n // CONSTRUCT\n\n /**\n * Create a DateTime for the current instant, in the system's time zone.\n *\n * Use Settings to override these default values if needed.\n * @example DateTime.now().toISO() //~> now in the ISO format\n * @return {DateTime}\n */\n static now() {\n return new DateTime({});\n }\n\n /**\n * Create a local DateTime\n * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used\n * @param {number} [month=1] - The month, 1-indexed\n * @param {number} [day=1] - The day of the month, 1-indexed\n * @param {number} [hour=0] - The hour of the day, in 24-hour time\n * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n * @example DateTime.local() //~> now\n * @example DateTime.local({ zone: \"America/New_York\" }) //~> now, in US east coast time\n * @example DateTime.local(2017) //~> 2017-01-01T00:00:00\n * @example DateTime.local(2017, 3) //~> 2017-03-01T00:00:00\n * @example DateTime.local(2017, 3, 12, { locale: \"fr\" }) //~> 2017-03-12T00:00:00, with a French locale\n * @example DateTime.local(2017, 3, 12, 5) //~> 2017-03-12T05:00:00\n * @example DateTime.local(2017, 3, 12, 5, { zone: \"utc\" }) //~> 2017-03-12T05:00:00, in UTC\n * @example DateTime.local(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00\n * @example DateTime.local(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10\n * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765\n * @return {DateTime}\n */\n static local() {\n const [opts, args] = lastOpts(arguments),\n [year, month, day, hour, minute, second, millisecond] = args;\n return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n }\n\n /**\n * Create a DateTime in UTC\n * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used\n * @param {number} [month=1] - The month, 1-indexed\n * @param {number} [day=1] - The day of the month\n * @param {number} [hour=0] - The hour of the day, in 24-hour time\n * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n * @param {Object} options - configuration options for the DateTime\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} [options.outputCalendar] - the output calendar to set on the resulting DateTime instance\n * @param {string} [options.numberingSystem] - the numbering system to set on the resulting DateTime instance\n * @param {string} [options.weekSettings] - the week settings to set on the resulting DateTime instance\n * @example DateTime.utc() //~> now\n * @example DateTime.utc(2017) //~> 2017-01-01T00:00:00Z\n * @example DateTime.utc(2017, 3) //~> 2017-03-01T00:00:00Z\n * @example DateTime.utc(2017, 3, 12) //~> 2017-03-12T00:00:00Z\n * @example DateTime.utc(2017, 3, 12, 5) //~> 2017-03-12T05:00:00Z\n * @example DateTime.utc(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00Z\n * @example DateTime.utc(2017, 3, 12, 5, 45, { locale: \"fr\" }) //~> 2017-03-12T05:45:00Z with a French locale\n * @example DateTime.utc(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10Z\n * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765, { locale: \"fr\" }) //~> 2017-03-12T05:45:10.765Z with a French locale\n * @return {DateTime}\n */\n static utc() {\n const [opts, args] = lastOpts(arguments),\n [year, month, day, hour, minute, second, millisecond] = args;\n\n opts.zone = FixedOffsetZone.utcInstance;\n return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n }\n\n /**\n * Create a DateTime from a JavaScript Date object. Uses the default zone.\n * @param {Date} date - a JavaScript Date object\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @return {DateTime}\n */\n static fromJSDate(date, options = {}) {\n const ts = isDate(date) ? date.valueOf() : NaN;\n if (Number.isNaN(ts)) {\n return DateTime.invalid(\"invalid input\");\n }\n\n const zoneToUse = normalizeZone(options.zone, Settings.defaultZone);\n if (!zoneToUse.isValid) {\n return DateTime.invalid(unsupportedZone(zoneToUse));\n }\n\n return new DateTime({\n ts: ts,\n zone: zoneToUse,\n loc: Locale.fromObject(options),\n });\n }\n\n /**\n * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n * @param {number} milliseconds - a number of milliseconds since 1970 UTC\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromMillis(milliseconds, options = {}) {\n if (!isNumber(milliseconds)) {\n throw new InvalidArgumentError(\n `fromMillis requires a numerical input, but received a ${typeof milliseconds} with value ${milliseconds}`\n );\n } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) {\n // this isn't perfect because we can still end up out of range because of additional shifting, but it's a start\n return DateTime.invalid(\"Timestamp out of range\");\n } else {\n return new DateTime({\n ts: milliseconds,\n zone: normalizeZone(options.zone, Settings.defaultZone),\n loc: Locale.fromObject(options),\n });\n }\n }\n\n /**\n * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n * @param {number} seconds - a number of seconds since 1970 UTC\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromSeconds(seconds, options = {}) {\n if (!isNumber(seconds)) {\n throw new InvalidArgumentError(\"fromSeconds requires a numerical input\");\n } else {\n return new DateTime({\n ts: seconds * 1000,\n zone: normalizeZone(options.zone, Settings.defaultZone),\n loc: Locale.fromObject(options),\n });\n }\n }\n\n /**\n * Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults.\n * @param {Object} obj - the object to create the DateTime from\n * @param {number} obj.year - a year, such as 1987\n * @param {number} obj.month - a month, 1-12\n * @param {number} obj.day - a day of the month, 1-31, depending on the month\n * @param {number} obj.ordinal - day of the year, 1-365 or 366\n * @param {number} obj.weekYear - an ISO week year\n * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year\n * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday\n * @param {number} obj.localWeekYear - a week year, according to the locale\n * @param {number} obj.localWeekNumber - a week number, between 1 and 52 or 53, depending on the year, according to the locale\n * @param {number} obj.localWeekday - a weekday, 1-7, where 1 is the first and 7 is the last day of the week, according to the locale\n * @param {number} obj.hour - hour of the day, 0-23\n * @param {number} obj.minute - minute of the hour, 0-59\n * @param {number} obj.second - second of the minute, 0-59\n * @param {number} obj.millisecond - millisecond of the second, 0-999\n * @param {Object} opts - options for creating this DateTime\n * @param {string|Zone} [opts.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone()\n * @param {string} [opts.locale='system\\'s locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25'\n * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01'\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'utc' }),\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'local' })\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'America/New_York' })\n * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13'\n * @example DateTime.fromObject({ localWeekYear: 2022, localWeekNumber: 1, localWeekday: 1 }, { locale: \"en-US\" }).toISODate() //=> '2021-12-26'\n * @return {DateTime}\n */\n static fromObject(obj, opts = {}) {\n obj = obj || {};\n const zoneToUse = normalizeZone(opts.zone, Settings.defaultZone);\n if (!zoneToUse.isValid) {\n return DateTime.invalid(unsupportedZone(zoneToUse));\n }\n\n const loc = Locale.fromObject(opts);\n const normalized = normalizeObject(obj, normalizeUnitWithLocalWeeks);\n const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, loc);\n\n const tsNow = Settings.now(),\n offsetProvis = !isUndefined(opts.specificOffset)\n ? opts.specificOffset\n : zoneToUse.offset(tsNow),\n containsOrdinal = !isUndefined(normalized.ordinal),\n containsGregorYear = !isUndefined(normalized.year),\n containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n containsGregor = containsGregorYear || containsGregorMD,\n definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n // cases:\n // just a weekday -> this week's instance of that weekday, no worries\n // (gregorian data or ordinal) + (weekYear or weekNumber) -> error\n // (gregorian month or day) + ordinal -> error\n // otherwise just use weeks or ordinals or gregorian, depending on what's specified\n\n if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n throw new ConflictingSpecificationError(\n \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n );\n }\n\n if (containsGregorMD && containsOrdinal) {\n throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n }\n\n const useWeekData = definiteWeekDef || (normalized.weekday && !containsGregor);\n\n // configure ourselves to deal with gregorian dates or week stuff\n let units,\n defaultValues,\n objNow = tsToObj(tsNow, offsetProvis);\n if (useWeekData) {\n units = orderedWeekUnits;\n defaultValues = defaultWeekUnitValues;\n objNow = gregorianToWeek(objNow, minDaysInFirstWeek, startOfWeek);\n } else if (containsOrdinal) {\n units = orderedOrdinalUnits;\n defaultValues = defaultOrdinalUnitValues;\n objNow = gregorianToOrdinal(objNow);\n } else {\n units = orderedUnits;\n defaultValues = defaultUnitValues;\n }\n\n // set default values for missing stuff\n let foundFirst = false;\n for (const u of units) {\n const v = normalized[u];\n if (!isUndefined(v)) {\n foundFirst = true;\n } else if (foundFirst) {\n normalized[u] = defaultValues[u];\n } else {\n normalized[u] = objNow[u];\n }\n }\n\n // make sure the values we have are in range\n const higherOrderInvalid = useWeekData\n ? hasInvalidWeekData(normalized, minDaysInFirstWeek, startOfWeek)\n : containsOrdinal\n ? hasInvalidOrdinalData(normalized)\n : hasInvalidGregorianData(normalized),\n invalid = higherOrderInvalid || hasInvalidTimeData(normalized);\n\n if (invalid) {\n return DateTime.invalid(invalid);\n }\n\n // compute the actual time\n const gregorian = useWeekData\n ? weekToGregorian(normalized, minDaysInFirstWeek, startOfWeek)\n : containsOrdinal\n ? ordinalToGregorian(normalized)\n : normalized,\n [tsFinal, offsetFinal] = objToTS(gregorian, offsetProvis, zoneToUse),\n inst = new DateTime({\n ts: tsFinal,\n zone: zoneToUse,\n o: offsetFinal,\n loc,\n });\n\n // gregorian data + weekday serves only to validate\n if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) {\n return DateTime.invalid(\n \"mismatched weekday\",\n `you can't specify both a weekday of ${normalized.weekday} and a date of ${inst.toISO()}`\n );\n }\n\n if (!inst.isValid) {\n return DateTime.invalid(inst.invalid);\n }\n\n return inst;\n }\n\n /**\n * Create a DateTime from an ISO 8601 string\n * @param {string} text - the ISO string\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance\n * @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance\n * @param {string} [opts.weekSettings] - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromISO('2016-05-25T09:08:34.123')\n * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00')\n * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true})\n * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'})\n * @example DateTime.fromISO('2016-W05-4')\n * @return {DateTime}\n */\n static fromISO(text, opts = {}) {\n const [vals, parsedZone] = parseISODate(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"ISO 8601\", text);\n }\n\n /**\n * Create a DateTime from an RFC 2822 string\n * @param {string} text - the RFC 2822 string\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT')\n * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600')\n * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z')\n * @return {DateTime}\n */\n static fromRFC2822(text, opts = {}) {\n const [vals, parsedZone] = parseRFC2822Date(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"RFC 2822\", text);\n }\n\n /**\n * Create a DateTime from an HTTP header date\n * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n * @param {string} text - the HTTP header date\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods.\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT')\n * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT')\n * @example DateTime.fromHTTP('Sun Nov 6 08:49:37 1994')\n * @return {DateTime}\n */\n static fromHTTP(text, opts = {}) {\n const [vals, parsedZone] = parseHTTPDate(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"HTTP\", opts);\n }\n\n /**\n * Create a DateTime from an input string and format string.\n * Defaults to en-US if no locale has been specified, regardless of the system's locale. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/parsing?id=table-of-tokens).\n * @param {string} text - the string to parse\n * @param {string} fmt - the format the string is expected to be in (see the link below for the formats)\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromFormat(text, fmt, opts = {}) {\n if (isUndefined(text) || isUndefined(fmt)) {\n throw new InvalidArgumentError(\"fromFormat requires an input string and a format\");\n }\n\n const { locale = null, numberingSystem = null } = opts,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n }),\n [vals, parsedZone, specificOffset, invalid] = parseFromTokens(localeToUse, text, fmt);\n if (invalid) {\n return DateTime.invalid(invalid);\n } else {\n return parseDataToDateTime(vals, parsedZone, opts, `format ${fmt}`, text, specificOffset);\n }\n }\n\n /**\n * @deprecated use fromFormat instead\n */\n static fromString(text, fmt, opts = {}) {\n return DateTime.fromFormat(text, fmt, opts);\n }\n\n /**\n * Create a DateTime from a SQL date, time, or datetime\n * Defaults to en-US if no locale has been specified, regardless of the system's locale\n * @param {string} text - the string to parse\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @example DateTime.fromSQL('2017-05-15')\n * @example DateTime.fromSQL('2017-05-15 09:12:34')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true })\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' })\n * @example DateTime.fromSQL('09:12:34.342')\n * @return {DateTime}\n */\n static fromSQL(text, opts = {}) {\n const [vals, parsedZone] = parseSQL(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"SQL\", text);\n }\n\n /**\n * Create an invalid DateTime.\n * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent.\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {DateTime}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the DateTime is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidDateTimeError(invalid);\n } else {\n return new DateTime({ invalid });\n }\n }\n\n /**\n * Check if an object is an instance of DateTime. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isDateTime(o) {\n return (o && o.isLuxonDateTime) || false;\n }\n\n /**\n * Produce the format string for a set of options\n * @param formatOpts\n * @param localeOpts\n * @returns {string}\n */\n static parseFormatForOpts(formatOpts, localeOpts = {}) {\n const tokenList = formatOptsToTokens(formatOpts, Locale.fromObject(localeOpts));\n return !tokenList ? null : tokenList.map((t) => (t ? t.val : null)).join(\"\");\n }\n\n /**\n * Produce the the fully expanded format token for the locale\n * Does NOT quote characters, so quoted tokens will not round trip correctly\n * @param fmt\n * @param localeOpts\n * @returns {string}\n */\n static expandFormat(fmt, localeOpts = {}) {\n const expanded = expandMacroTokens(Formatter.parseFormat(fmt), Locale.fromObject(localeOpts));\n return expanded.map((t) => t.val).join(\"\");\n }\n\n static resetCache() {\n zoneOffsetTs = undefined;\n zoneOffsetGuessCache.clear();\n }\n\n // INFO\n\n /**\n * Get the value of unit.\n * @param {string} unit - a unit such as 'minute' or 'day'\n * @example DateTime.local(2017, 7, 4).get('month'); //=> 7\n * @example DateTime.local(2017, 7, 4).get('day'); //=> 4\n * @return {number}\n */\n get(unit) {\n return this[unit];\n }\n\n /**\n * Returns whether the DateTime is valid. Invalid DateTimes occur when:\n * * The DateTime was created from invalid calendar information, such as the 13th month or February 30\n * * The DateTime was created by an operation on another invalid date\n * @type {boolean}\n */\n get isValid() {\n return this.invalid === null;\n }\n\n /**\n * Returns an error code if this DateTime is invalid, or null if the DateTime is valid\n * @type {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime\n *\n * @type {string}\n */\n get locale() {\n return this.isValid ? this.loc.locale : null;\n }\n\n /**\n * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime\n *\n * @type {string}\n */\n get numberingSystem() {\n return this.isValid ? this.loc.numberingSystem : null;\n }\n\n /**\n * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime\n *\n * @type {string}\n */\n get outputCalendar() {\n return this.isValid ? this.loc.outputCalendar : null;\n }\n\n /**\n * Get the time zone associated with this DateTime.\n * @type {Zone}\n */\n get zone() {\n return this._zone;\n }\n\n /**\n * Get the name of the time zone.\n * @type {string}\n */\n get zoneName() {\n return this.isValid ? this.zone.name : null;\n }\n\n /**\n * Get the year\n * @example DateTime.local(2017, 5, 25).year //=> 2017\n * @type {number}\n */\n get year() {\n return this.isValid ? this.c.year : NaN;\n }\n\n /**\n * Get the quarter\n * @example DateTime.local(2017, 5, 25).quarter //=> 2\n * @type {number}\n */\n get quarter() {\n return this.isValid ? Math.ceil(this.c.month / 3) : NaN;\n }\n\n /**\n * Get the month (1-12).\n * @example DateTime.local(2017, 5, 25).month //=> 5\n * @type {number}\n */\n get month() {\n return this.isValid ? this.c.month : NaN;\n }\n\n /**\n * Get the day of the month (1-30ish).\n * @example DateTime.local(2017, 5, 25).day //=> 25\n * @type {number}\n */\n get day() {\n return this.isValid ? this.c.day : NaN;\n }\n\n /**\n * Get the hour of the day (0-23).\n * @example DateTime.local(2017, 5, 25, 9).hour //=> 9\n * @type {number}\n */\n get hour() {\n return this.isValid ? this.c.hour : NaN;\n }\n\n /**\n * Get the minute of the hour (0-59).\n * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30\n * @type {number}\n */\n get minute() {\n return this.isValid ? this.c.minute : NaN;\n }\n\n /**\n * Get the second of the minute (0-59).\n * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52\n * @type {number}\n */\n get second() {\n return this.isValid ? this.c.second : NaN;\n }\n\n /**\n * Get the millisecond of the second (0-999).\n * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654\n * @type {number}\n */\n get millisecond() {\n return this.isValid ? this.c.millisecond : NaN;\n }\n\n /**\n * Get the week year\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2014, 12, 31).weekYear //=> 2015\n * @type {number}\n */\n get weekYear() {\n return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN;\n }\n\n /**\n * Get the week number of the week year (1-52ish).\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2017, 5, 25).weekNumber //=> 21\n * @type {number}\n */\n get weekNumber() {\n return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN;\n }\n\n /**\n * Get the day of the week.\n * 1 is Monday and 7 is Sunday\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2014, 11, 31).weekday //=> 4\n * @type {number}\n */\n get weekday() {\n return this.isValid ? possiblyCachedWeekData(this).weekday : NaN;\n }\n\n /**\n * Returns true if this date is on a weekend according to the locale, false otherwise\n * @returns {boolean}\n */\n get isWeekend() {\n return this.isValid && this.loc.getWeekendDays().includes(this.weekday);\n }\n\n /**\n * Get the day of the week according to the locale.\n * 1 is the first day of the week and 7 is the last day of the week.\n * If the locale assigns Sunday as the first day of the week, then a date which is a Sunday will return 1,\n * @returns {number}\n */\n get localWeekday() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekday : NaN;\n }\n\n /**\n * Get the week number of the week year according to the locale. Different locales assign week numbers differently,\n * because the week can start on different days of the week (see localWeekday) and because a different number of days\n * is required for a week to count as the first week of a year.\n * @returns {number}\n */\n get localWeekNumber() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekNumber : NaN;\n }\n\n /**\n * Get the week year according to the locale. Different locales assign week numbers (and therefor week years)\n * differently, see localWeekNumber.\n * @returns {number}\n */\n get localWeekYear() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekYear : NaN;\n }\n\n /**\n * Get the ordinal (meaning the day of the year)\n * @example DateTime.local(2017, 5, 25).ordinal //=> 145\n * @type {number|DateTime}\n */\n get ordinal() {\n return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN;\n }\n\n /**\n * Get the human readable short month name, such as 'Oct'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).monthShort //=> Oct\n * @type {string}\n */\n get monthShort() {\n return this.isValid ? Info.months(\"short\", { locObj: this.loc })[this.month - 1] : null;\n }\n\n /**\n * Get the human readable long month name, such as 'October'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).monthLong //=> October\n * @type {string}\n */\n get monthLong() {\n return this.isValid ? Info.months(\"long\", { locObj: this.loc })[this.month - 1] : null;\n }\n\n /**\n * Get the human readable short weekday, such as 'Mon'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon\n * @type {string}\n */\n get weekdayShort() {\n return this.isValid ? Info.weekdays(\"short\", { locObj: this.loc })[this.weekday - 1] : null;\n }\n\n /**\n * Get the human readable long weekday, such as 'Monday'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday\n * @type {string}\n */\n get weekdayLong() {\n return this.isValid ? Info.weekdays(\"long\", { locObj: this.loc })[this.weekday - 1] : null;\n }\n\n /**\n * Get the UTC offset of this DateTime in minutes\n * @example DateTime.now().offset //=> -240\n * @example DateTime.utc().offset //=> 0\n * @type {number}\n */\n get offset() {\n return this.isValid ? +this.o : NaN;\n }\n\n /**\n * Get the short human name for the zone's current offset, for example \"EST\" or \"EDT\".\n * Defaults to the system's locale if no locale has been specified\n * @type {string}\n */\n get offsetNameShort() {\n if (this.isValid) {\n return this.zone.offsetName(this.ts, {\n format: \"short\",\n locale: this.locale,\n });\n } else {\n return null;\n }\n }\n\n /**\n * Get the long human name for the zone's current offset, for example \"Eastern Standard Time\" or \"Eastern Daylight Time\".\n * Defaults to the system's locale if no locale has been specified\n * @type {string}\n */\n get offsetNameLong() {\n if (this.isValid) {\n return this.zone.offsetName(this.ts, {\n format: \"long\",\n locale: this.locale,\n });\n } else {\n return null;\n }\n }\n\n /**\n * Get whether this zone's offset ever changes, as in a DST.\n * @type {boolean}\n */\n get isOffsetFixed() {\n return this.isValid ? this.zone.isUniversal : null;\n }\n\n /**\n * Get whether the DateTime is in a DST.\n * @type {boolean}\n */\n get isInDST() {\n if (this.isOffsetFixed) {\n return false;\n } else {\n return (\n this.offset > this.set({ month: 1, day: 1 }).offset ||\n this.offset > this.set({ month: 5 }).offset\n );\n }\n }\n\n /**\n * Get those DateTimes which have the same local time as this DateTime, but a different offset from UTC\n * in this DateTime's zone. During DST changes local time can be ambiguous, for example\n * `2023-10-29T02:30:00` in `Europe/Berlin` can have offset `+01:00` or `+02:00`.\n * This method will return both possible DateTimes if this DateTime's local time is ambiguous.\n * @returns {DateTime[]}\n */\n getPossibleOffsets() {\n if (!this.isValid || this.isOffsetFixed) {\n return [this];\n }\n const dayMs = 86400000;\n const minuteMs = 60000;\n const localTS = objToLocalTS(this.c);\n const oEarlier = this.zone.offset(localTS - dayMs);\n const oLater = this.zone.offset(localTS + dayMs);\n\n const o1 = this.zone.offset(localTS - oEarlier * minuteMs);\n const o2 = this.zone.offset(localTS - oLater * minuteMs);\n if (o1 === o2) {\n return [this];\n }\n const ts1 = localTS - o1 * minuteMs;\n const ts2 = localTS - o2 * minuteMs;\n const c1 = tsToObj(ts1, o1);\n const c2 = tsToObj(ts2, o2);\n if (\n c1.hour === c2.hour &&\n c1.minute === c2.minute &&\n c1.second === c2.second &&\n c1.millisecond === c2.millisecond\n ) {\n return [clone(this, { ts: ts1 }), clone(this, { ts: ts2 })];\n }\n return [this];\n }\n\n /**\n * Returns true if this DateTime is in a leap year, false otherwise\n * @example DateTime.local(2016).isInLeapYear //=> true\n * @example DateTime.local(2013).isInLeapYear //=> false\n * @type {boolean}\n */\n get isInLeapYear() {\n return isLeapYear(this.year);\n }\n\n /**\n * Returns the number of days in this DateTime's month\n * @example DateTime.local(2016, 2).daysInMonth //=> 29\n * @example DateTime.local(2016, 3).daysInMonth //=> 31\n * @type {number}\n */\n get daysInMonth() {\n return daysInMonth(this.year, this.month);\n }\n\n /**\n * Returns the number of days in this DateTime's year\n * @example DateTime.local(2016).daysInYear //=> 366\n * @example DateTime.local(2013).daysInYear //=> 365\n * @type {number}\n */\n get daysInYear() {\n return this.isValid ? daysInYear(this.year) : NaN;\n }\n\n /**\n * Returns the number of weeks in this DateTime's year\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2004).weeksInWeekYear //=> 53\n * @example DateTime.local(2013).weeksInWeekYear //=> 52\n * @type {number}\n */\n get weeksInWeekYear() {\n return this.isValid ? weeksInWeekYear(this.weekYear) : NaN;\n }\n\n /**\n * Returns the number of weeks in this DateTime's local week year\n * @example DateTime.local(2020, 6, {locale: 'en-US'}).weeksInLocalWeekYear //=> 52\n * @example DateTime.local(2020, 6, {locale: 'de-DE'}).weeksInLocalWeekYear //=> 53\n * @type {number}\n */\n get weeksInLocalWeekYear() {\n return this.isValid\n ? weeksInWeekYear(\n this.localWeekYear,\n this.loc.getMinDaysInFirstWeek(),\n this.loc.getStartOfWeek()\n )\n : NaN;\n }\n\n /**\n * Returns the resolved Intl options for this DateTime.\n * This is useful in understanding the behavior of formatting methods\n * @param {Object} opts - the same options as toLocaleString\n * @return {Object}\n */\n resolvedLocaleOptions(opts = {}) {\n const { locale, numberingSystem, calendar } = Formatter.create(\n this.loc.clone(opts),\n opts\n ).resolvedOptions(this);\n return { locale, numberingSystem, outputCalendar: calendar };\n }\n\n // TRANSFORM\n\n /**\n * \"Set\" the DateTime's zone to UTC. Returns a newly-constructed DateTime.\n *\n * Equivalent to {@link DateTime#setZone}('utc')\n * @param {number} [offset=0] - optionally, an offset from UTC in minutes\n * @param {Object} [opts={}] - options to pass to `setZone()`\n * @return {DateTime}\n */\n toUTC(offset = 0, opts = {}) {\n return this.setZone(FixedOffsetZone.instance(offset), opts);\n }\n\n /**\n * \"Set\" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime.\n *\n * Equivalent to `setZone('local')`\n * @return {DateTime}\n */\n toLocal() {\n return this.setZone(Settings.defaultZone);\n }\n\n /**\n * \"Set\" the DateTime's zone to specified zone. Returns a newly-constructed DateTime.\n *\n * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link DateTime#plus}. You may wish to use {@link DateTime#toLocal} and {@link DateTime#toUTC} which provide simple convenience wrappers for commonly used zones.\n * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link DateTime#Zone} class.\n * @param {Object} opts - options\n * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this.\n * @return {DateTime}\n */\n setZone(zone, { keepLocalTime = false, keepCalendarTime = false } = {}) {\n zone = normalizeZone(zone, Settings.defaultZone);\n if (zone.equals(this.zone)) {\n return this;\n } else if (!zone.isValid) {\n return DateTime.invalid(unsupportedZone(zone));\n } else {\n let newTS = this.ts;\n if (keepLocalTime || keepCalendarTime) {\n const offsetGuess = zone.offset(this.ts);\n const asObj = this.toObject();\n [newTS] = objToTS(asObj, offsetGuess, zone);\n }\n return clone(this, { ts: newTS, zone });\n }\n }\n\n /**\n * \"Set\" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime.\n * @param {Object} properties - the properties to set\n * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' })\n * @return {DateTime}\n */\n reconfigure({ locale, numberingSystem, outputCalendar } = {}) {\n const loc = this.loc.clone({ locale, numberingSystem, outputCalendar });\n return clone(this, { loc });\n }\n\n /**\n * \"Set\" the locale. Returns a newly-constructed DateTime.\n * Just a convenient alias for reconfigure({ locale })\n * @example DateTime.local(2017, 5, 25).setLocale('en-GB')\n * @return {DateTime}\n */\n setLocale(locale) {\n return this.reconfigure({ locale });\n }\n\n /**\n * \"Set\" the values of specified units. Returns a newly-constructed DateTime.\n * You can only set units with this method; for \"setting\" metadata, see {@link DateTime#reconfigure} and {@link DateTime#setZone}.\n *\n * This method also supports setting locale-based week units, i.e. `localWeekday`, `localWeekNumber` and `localWeekYear`.\n * They cannot be mixed with ISO-week units like `weekday`.\n * @param {Object} values - a mapping of units to numbers\n * @example dt.set({ year: 2017 })\n * @example dt.set({ hour: 8, minute: 30 })\n * @example dt.set({ weekday: 5 })\n * @example dt.set({ year: 2005, ordinal: 234 })\n * @return {DateTime}\n */\n set(values) {\n if (!this.isValid) return this;\n\n const normalized = normalizeObject(values, normalizeUnitWithLocalWeeks);\n const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, this.loc);\n\n const settingWeekStuff =\n !isUndefined(normalized.weekYear) ||\n !isUndefined(normalized.weekNumber) ||\n !isUndefined(normalized.weekday),\n containsOrdinal = !isUndefined(normalized.ordinal),\n containsGregorYear = !isUndefined(normalized.year),\n containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n containsGregor = containsGregorYear || containsGregorMD,\n definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n throw new ConflictingSpecificationError(\n \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n );\n }\n\n if (containsGregorMD && containsOrdinal) {\n throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n }\n\n let mixed;\n if (settingWeekStuff) {\n mixed = weekToGregorian(\n { ...gregorianToWeek(this.c, minDaysInFirstWeek, startOfWeek), ...normalized },\n minDaysInFirstWeek,\n startOfWeek\n );\n } else if (!isUndefined(normalized.ordinal)) {\n mixed = ordinalToGregorian({ ...gregorianToOrdinal(this.c), ...normalized });\n } else {\n mixed = { ...this.toObject(), ...normalized };\n\n // if we didn't set the day but we ended up on an overflow date,\n // use the last day of the right month\n if (isUndefined(normalized.day)) {\n mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day);\n }\n }\n\n const [ts, o] = objToTS(mixed, this.o, this.zone);\n return clone(this, { ts, o });\n }\n\n /**\n * Add a period of time to this DateTime and return the resulting DateTime\n *\n * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between.\n * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @example DateTime.now().plus(123) //~> in 123 milliseconds\n * @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes\n * @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow\n * @example DateTime.now().plus({ days: -1 }) //~> this time yesterday\n * @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min\n * @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min\n * @return {DateTime}\n */\n plus(duration) {\n if (!this.isValid) return this;\n const dur = Duration.fromDurationLike(duration);\n return clone(this, adjustTime(this, dur));\n }\n\n /**\n * Subtract a period of time to this DateTime and return the resulting DateTime\n * See {@link DateTime#plus}\n * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n @return {DateTime}\n */\n minus(duration) {\n if (!this.isValid) return this;\n const dur = Duration.fromDurationLike(duration).negate();\n return clone(this, adjustTime(this, dur));\n }\n\n /**\n * \"Set\" this DateTime to the beginning of a unit of time.\n * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week\n * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01'\n * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01'\n * @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays\n * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00'\n * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00'\n * @return {DateTime}\n */\n startOf(unit, { useLocaleWeeks = false } = {}) {\n if (!this.isValid) return this;\n\n const o = {},\n normalizedUnit = Duration.normalizeUnit(unit);\n switch (normalizedUnit) {\n case \"years\":\n o.month = 1;\n // falls through\n case \"quarters\":\n case \"months\":\n o.day = 1;\n // falls through\n case \"weeks\":\n case \"days\":\n o.hour = 0;\n // falls through\n case \"hours\":\n o.minute = 0;\n // falls through\n case \"minutes\":\n o.second = 0;\n // falls through\n case \"seconds\":\n o.millisecond = 0;\n break;\n case \"milliseconds\":\n break;\n // no default, invalid units throw in normalizeUnit()\n }\n\n if (normalizedUnit === \"weeks\") {\n if (useLocaleWeeks) {\n const startOfWeek = this.loc.getStartOfWeek();\n const { weekday } = this;\n if (weekday < startOfWeek) {\n o.weekNumber = this.weekNumber - 1;\n }\n o.weekday = startOfWeek;\n } else {\n o.weekday = 1;\n }\n }\n\n if (normalizedUnit === \"quarters\") {\n const q = Math.ceil(this.month / 3);\n o.month = (q - 1) * 3 + 1;\n }\n\n return this.set(o);\n }\n\n /**\n * \"Set\" this DateTime to the end (meaning the last millisecond) of a unit of time\n * @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week\n * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays\n * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00'\n * @return {DateTime}\n */\n endOf(unit, opts) {\n return this.isValid\n ? this.plus({ [unit]: 1 })\n .startOf(unit, opts)\n .minus(1)\n : this;\n }\n\n // OUTPUT\n\n /**\n * Returns a string representation of this DateTime formatted according to the specified format string.\n * **You may not want this.** See {@link DateTime#toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/formatting?id=table-of-tokens).\n * Defaults to en-US if no locale has been specified, regardless of the system's locale.\n * @param {string} fmt - the format string\n * @param {Object} opts - opts to override the configuration options on this DateTime\n * @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22'\n * @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22'\n * @example DateTime.now().toFormat('yyyy LLL dd', { locale: \"fr\" }) //=> '2017 avr. 22'\n * @example DateTime.now().toFormat(\"HH 'hours and' mm 'minutes'\") //=> '20 hours and 55 minutes'\n * @return {string}\n */\n toFormat(fmt, opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt)\n : INVALID;\n }\n\n /**\n * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`.\n * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation\n * of the DateTime in the assigned locale.\n * Defaults to the system's locale if no locale has been specified\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param formatOpts {Object} - Intl.DateTimeFormat constructor options and configuration options\n * @param {Object} opts - opts to override the configuration options on this DateTime\n * @example DateTime.now().toLocaleString(); //=> 4/20/2017\n * @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017'\n * @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017'\n * @example DateTime.now().toLocaleString(DateTime.DATE_FULL, { locale: 'fr' }); //=> '28 août 2022'\n * @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM'\n * @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM'\n * @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20'\n * @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM'\n * @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }); //=> '11:32'\n * @return {string}\n */\n toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this)\n : INVALID;\n }\n\n /**\n * Returns an array of format \"parts\", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output.\n * Defaults to the system's locale if no locale has been specified\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts\n * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`.\n * @example DateTime.now().toLocaleParts(); //=> [\n * //=> { type: 'day', value: '25' },\n * //=> { type: 'literal', value: '/' },\n * //=> { type: 'month', value: '05' },\n * //=> { type: 'literal', value: '/' },\n * //=> { type: 'year', value: '1982' }\n * //=> ]\n */\n toLocaleParts(opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this)\n : [];\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.extendedZone=false] - add the time zone format extension\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'years', 'months', 'days', 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0.\n * @example DateTime.utc(1983, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z'\n * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00'\n * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335'\n * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400'\n * @example DateTime.now().toISO({ precision: 'day' }) //=> '2017-04-22Z'\n * @example DateTime.now().toISO({ precision: 'minute' }) //=> '2017-04-22T20:47Z'\n * @return {string|null}\n */\n toISO({\n format = \"extended\",\n suppressSeconds = false,\n suppressMilliseconds = false,\n includeOffset = true,\n extendedZone = false,\n precision = \"milliseconds\",\n } = {}) {\n if (!this.isValid) {\n return null;\n }\n\n precision = normalizeUnit(precision);\n const ext = format === \"extended\";\n\n let c = toISODate(this, ext, precision);\n if (orderedUnits.indexOf(precision) >= 3) c += \"T\";\n c += toISOTime(\n this,\n ext,\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n );\n return c;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's date component\n * @param {Object} opts - options\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='day'] - truncate output to desired precision: 'years', 'months', or 'days'.\n * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25'\n * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525'\n * @example DateTime.utc(1982, 5, 25).toISODate({ precision: 'month' }) //=> '1982-05'\n * @return {string|null}\n */\n toISODate({ format = \"extended\", precision = \"day\" } = {}) {\n if (!this.isValid) {\n return null;\n }\n return toISODate(this, format === \"extended\", normalizeUnit(precision));\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's week date\n * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2'\n * @return {string}\n */\n toISOWeekDate() {\n return toTechFormat(this, \"kkkk-'W'WW-c\");\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's time component\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.extendedZone=true] - add the time zone format extension\n * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0.\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34, second: 56 }).toISOTime({ precision: 'minute' }) //=> '07:34Z'\n * @return {string}\n */\n toISOTime({\n suppressMilliseconds = false,\n suppressSeconds = false,\n includeOffset = true,\n includePrefix = false,\n extendedZone = false,\n format = \"extended\",\n precision = \"milliseconds\",\n } = {}) {\n if (!this.isValid) {\n return null;\n }\n\n precision = normalizeUnit(precision);\n let c = includePrefix && orderedUnits.indexOf(precision) >= 3 ? \"T\" : \"\";\n return (\n c +\n toISOTime(\n this,\n format === \"extended\",\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n )\n );\n }\n\n /**\n * Returns an RFC 2822-compatible string representation of this DateTime\n * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000'\n * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400'\n * @return {string}\n */\n toRFC2822() {\n return toTechFormat(this, \"EEE, dd LLL yyyy HH:mm:ss ZZZ\", false);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in HTTP headers. The output is always expressed in GMT.\n * Specifically, the string conforms to RFC 1123.\n * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT'\n * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT'\n * @return {string}\n */\n toHTTP() {\n return toTechFormat(this.toUTC(), \"EEE, dd LLL yyyy HH:mm:ss 'GMT'\");\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL Date\n * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13'\n * @return {string|null}\n */\n toSQLDate() {\n if (!this.isValid) {\n return null;\n }\n return toISODate(this, true);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL Time\n * @param {Object} opts - options\n * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00'\n * @example DateTime.utc().toSQL() //=> '05:15:16.345'\n * @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00'\n * @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345'\n * @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York'\n * @return {string}\n */\n toSQLTime({ includeOffset = true, includeZone = false, includeOffsetSpace = true } = {}) {\n let fmt = \"HH:mm:ss.SSS\";\n\n if (includeZone || includeOffset) {\n if (includeOffsetSpace) {\n fmt += \" \";\n }\n if (includeZone) {\n fmt += \"z\";\n } else if (includeOffset) {\n fmt += \"ZZ\";\n }\n }\n\n return toTechFormat(this, fmt, true);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL DateTime\n * @param {Object} opts - options\n * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00'\n * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z'\n * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00'\n * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000'\n * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York'\n * @return {string}\n */\n toSQL(opts = {}) {\n if (!this.isValid) {\n return null;\n }\n\n return `${this.toSQLDate()} ${this.toSQLTime(opts)}`;\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for debugging\n * @return {string}\n */\n toString() {\n return this.isValid ? this.toISO() : INVALID;\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `DateTime { ts: ${this.toISO()}, zone: ${this.zone.name}, locale: ${this.locale} }`;\n } else {\n return `DateTime { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns the epoch milliseconds of this DateTime. Alias of {@link DateTime#toMillis}\n * @return {number}\n */\n valueOf() {\n return this.toMillis();\n }\n\n /**\n * Returns the epoch milliseconds of this DateTime.\n * @return {number}\n */\n toMillis() {\n return this.isValid ? this.ts : NaN;\n }\n\n /**\n * Returns the epoch seconds (including milliseconds in the fractional part) of this DateTime.\n * @return {number}\n */\n toSeconds() {\n return this.isValid ? this.ts / 1000 : NaN;\n }\n\n /**\n * Returns the epoch seconds (as a whole number) of this DateTime.\n * @return {number}\n */\n toUnixInteger() {\n return this.isValid ? Math.floor(this.ts / 1000) : NaN;\n }\n\n /**\n * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON.\n * @return {string}\n */\n toJSON() {\n return this.toISO();\n }\n\n /**\n * Returns a BSON serializable equivalent to this DateTime.\n * @return {Date}\n */\n toBSON() {\n return this.toJSDate();\n }\n\n /**\n * Returns a JavaScript object with this DateTime's year, month, day, and so on.\n * @param opts - options for generating the object\n * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output\n * @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 }\n * @return {Object}\n */\n toObject(opts = {}) {\n if (!this.isValid) return {};\n\n const base = { ...this.c };\n\n if (opts.includeConfig) {\n base.outputCalendar = this.outputCalendar;\n base.numberingSystem = this.loc.numberingSystem;\n base.locale = this.loc.locale;\n }\n return base;\n }\n\n /**\n * Returns a JavaScript Date equivalent to this DateTime.\n * @return {Date}\n */\n toJSDate() {\n return new Date(this.isValid ? this.ts : NaN);\n }\n\n // COMPARE\n\n /**\n * Return the difference between two DateTimes as a Duration.\n * @param {DateTime} otherDateTime - the DateTime to compare this one to\n * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration.\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @example\n * var i1 = DateTime.fromISO('1982-05-25T09:45'),\n * i2 = DateTime.fromISO('1983-10-14T10:30');\n * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 }\n * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 }\n * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 }\n * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 }\n * @return {Duration}\n */\n diff(otherDateTime, unit = \"milliseconds\", opts = {}) {\n if (!this.isValid || !otherDateTime.isValid) {\n return Duration.invalid(\"created by diffing an invalid DateTime\");\n }\n\n const durOpts = { locale: this.locale, numberingSystem: this.numberingSystem, ...opts };\n\n const units = maybeArray(unit).map(Duration.normalizeUnit),\n otherIsLater = otherDateTime.valueOf() > this.valueOf(),\n earlier = otherIsLater ? this : otherDateTime,\n later = otherIsLater ? otherDateTime : this,\n diffed = diff(earlier, later, units, durOpts);\n\n return otherIsLater ? diffed.negate() : diffed;\n }\n\n /**\n * Return the difference between this DateTime and right now.\n * See {@link DateTime#diff}\n * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @return {Duration}\n */\n diffNow(unit = \"milliseconds\", opts = {}) {\n return this.diff(DateTime.now(), unit, opts);\n }\n\n /**\n * Return an Interval spanning between this DateTime and another DateTime\n * @param {DateTime} otherDateTime - the other end point of the Interval\n * @return {Interval|DateTime}\n */\n until(otherDateTime) {\n return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this;\n }\n\n /**\n * Return whether this DateTime is in the same unit of time as another DateTime.\n * Higher-order units must also be identical for this function to return `true`.\n * Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link DateTime#setZone} to convert one of the dates if needed.\n * @param {DateTime} otherDateTime - the other DateTime\n * @param {string} unit - the unit of time to check sameness on\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; only the locale of this DateTime is used\n * @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day\n * @return {boolean}\n */\n hasSame(otherDateTime, unit, opts) {\n if (!this.isValid) return false;\n\n const inputMs = otherDateTime.valueOf();\n const adjustedToZone = this.setZone(otherDateTime.zone, { keepLocalTime: true });\n return (\n adjustedToZone.startOf(unit, opts) <= inputMs && inputMs <= adjustedToZone.endOf(unit, opts)\n );\n }\n\n /**\n * Equality check\n * Two DateTimes are equal if and only if they represent the same millisecond, have the same zone and location, and are both valid.\n * To compare just the millisecond values, use `+dt1 === +dt2`.\n * @param {DateTime} other - the other DateTime\n * @return {boolean}\n */\n equals(other) {\n return (\n this.isValid &&\n other.isValid &&\n this.valueOf() === other.valueOf() &&\n this.zone.equals(other.zone) &&\n this.loc.equals(other.loc)\n );\n }\n\n /**\n * Returns a string representation of a this time relative to now, such as \"in two days\". Can only internationalize if your\n * platform supports Intl.RelativeTimeFormat. Rounds towards zero by default.\n * @param {Object} options - options that affect the output\n * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n * @param {string} [options.style=\"long\"] - the style of units, must be \"long\", \"short\", or \"narrow\"\n * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of \"years\", \"quarters\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", or \"seconds\"\n * @param {boolean} [options.round=true] - whether to round the numbers in the output.\n * @param {string} [options.rounding=\"trunc\"] - rounding method to use when rounding the numbers in the output. Can be \"trunc\" (toward zero), \"expand\" (away from zero), \"round\", \"floor\", or \"ceil\".\n * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding.\n * @param {string} options.locale - override the locale of this DateTime\n * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n * @example DateTime.now().plus({ days: 1 }).toRelative() //=> \"in 1 day\"\n * @example DateTime.now().setLocale(\"es\").toRelative({ days: 1 }) //=> \"dentro de 1 día\"\n * @example DateTime.now().plus({ days: 1 }).toRelative({ locale: \"fr\" }) //=> \"dans 23 heures\"\n * @example DateTime.now().minus({ days: 2 }).toRelative() //=> \"2 days ago\"\n * @example DateTime.now().minus({ days: 2 }).toRelative({ unit: \"hours\" }) //=> \"48 hours ago\"\n * @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> \"1.5 days ago\"\n */\n toRelative(options = {}) {\n if (!this.isValid) return null;\n const base = options.base || DateTime.fromObject({}, { zone: this.zone }),\n padding = options.padding ? (this < base ? -options.padding : options.padding) : 0;\n let units = [\"years\", \"months\", \"days\", \"hours\", \"minutes\", \"seconds\"];\n let unit = options.unit;\n if (Array.isArray(options.unit)) {\n units = options.unit;\n unit = undefined;\n }\n return diffRelative(base, this.plus(padding), {\n ...options,\n numeric: \"always\",\n units,\n unit,\n });\n }\n\n /**\n * Returns a string representation of this date relative to today, such as \"yesterday\" or \"next month\".\n * Only internationalizes on platforms that supports Intl.RelativeTimeFormat.\n * @param {Object} options - options that affect the output\n * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n * @param {string} options.locale - override the locale of this DateTime\n * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of \"years\", \"quarters\", \"months\", \"weeks\", or \"days\"\n * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> \"tomorrow\"\n * @example DateTime.now().setLocale(\"es\").plus({ days: 1 }).toRelative() //=> \"\"mañana\"\n * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: \"fr\" }) //=> \"demain\"\n * @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> \"2 days ago\"\n */\n toRelativeCalendar(options = {}) {\n if (!this.isValid) return null;\n\n return diffRelative(options.base || DateTime.fromObject({}, { zone: this.zone }), this, {\n ...options,\n numeric: \"auto\",\n units: [\"years\", \"months\", \"days\"],\n calendary: true,\n });\n }\n\n /**\n * Return the min of several date times\n * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum\n * @return {DateTime} the min DateTime, or undefined if called with no argument\n */\n static min(...dateTimes) {\n if (!dateTimes.every(DateTime.isDateTime)) {\n throw new InvalidArgumentError(\"min requires all arguments be DateTimes\");\n }\n return bestBy(dateTimes, (i) => i.valueOf(), Math.min);\n }\n\n /**\n * Return the max of several date times\n * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum\n * @return {DateTime} the max DateTime, or undefined if called with no argument\n */\n static max(...dateTimes) {\n if (!dateTimes.every(DateTime.isDateTime)) {\n throw new InvalidArgumentError(\"max requires all arguments be DateTimes\");\n }\n return bestBy(dateTimes, (i) => i.valueOf(), Math.max);\n }\n\n // MISC\n\n /**\n * Explain how a string would be parsed by fromFormat()\n * @param {string} text - the string to parse\n * @param {string} fmt - the format the string is expected to be in (see description)\n * @param {Object} options - options taken by fromFormat()\n * @return {Object}\n */\n static fromFormatExplain(text, fmt, options = {}) {\n const { locale = null, numberingSystem = null } = options,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n return explainFromTokens(localeToUse, text, fmt);\n }\n\n /**\n * @deprecated use fromFormatExplain instead\n */\n static fromStringExplain(text, fmt, options = {}) {\n return DateTime.fromFormatExplain(text, fmt, options);\n }\n\n /**\n * Build a parser for `fmt` using the given locale. This parser can be passed\n * to {@link DateTime.fromFormatParser} to a parse a date in this format. This\n * can be used to optimize cases where many dates need to be parsed in a\n * specific format.\n *\n * @param {String} fmt - the format the string is expected to be in (see\n * description)\n * @param {Object} options - options used to set locale and numberingSystem\n * for parser\n * @returns {TokenParser} - opaque object to be used\n */\n static buildFormatParser(fmt, options = {}) {\n const { locale = null, numberingSystem = null } = options,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n return new TokenParser(localeToUse, fmt);\n }\n\n /**\n * Create a DateTime from an input string and format parser.\n *\n * The format parser must have been created with the same locale as this call.\n *\n * @param {String} text - the string to parse\n * @param {TokenParser} formatParser - parser from {@link DateTime.buildFormatParser}\n * @param {Object} opts - options taken by fromFormat()\n * @returns {DateTime}\n */\n static fromFormatParser(text, formatParser, opts = {}) {\n if (isUndefined(text) || isUndefined(formatParser)) {\n throw new InvalidArgumentError(\n \"fromFormatParser requires an input string and a format parser\"\n );\n }\n const { locale = null, numberingSystem = null } = opts,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n\n if (!localeToUse.equals(formatParser.locale)) {\n throw new InvalidArgumentError(\n `fromFormatParser called with a locale of ${localeToUse}, ` +\n `but the format parser was created for ${formatParser.locale}`\n );\n }\n\n const { result, zone, specificOffset, invalidReason } = formatParser.explainFromTokens(text);\n\n if (invalidReason) {\n return DateTime.invalid(invalidReason);\n } else {\n return parseDataToDateTime(\n result,\n zone,\n opts,\n `format ${formatParser.format}`,\n text,\n specificOffset\n );\n }\n }\n\n // FORMAT PRESETS\n\n /**\n * {@link DateTime#toLocaleString} format like 10/14/1983\n * @type {Object}\n */\n static get DATE_SHORT() {\n return Formats.DATE_SHORT;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983'\n * @type {Object}\n */\n static get DATE_MED() {\n return Formats.DATE_MED;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Fri, Oct 14, 1983'\n * @type {Object}\n */\n static get DATE_MED_WITH_WEEKDAY() {\n return Formats.DATE_MED_WITH_WEEKDAY;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983'\n * @type {Object}\n */\n static get DATE_FULL() {\n return Formats.DATE_FULL;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Tuesday, October 14, 1983'\n * @type {Object}\n */\n static get DATE_HUGE() {\n return Formats.DATE_HUGE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_SIMPLE() {\n return Formats.TIME_SIMPLE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_SECONDS() {\n return Formats.TIME_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_SHORT_OFFSET() {\n return Formats.TIME_WITH_SHORT_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_LONG_OFFSET() {\n return Formats.TIME_WITH_LONG_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_SIMPLE() {\n return Formats.TIME_24_SIMPLE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_SECONDS() {\n return Formats.TIME_24_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 EDT', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_SHORT_OFFSET() {\n return Formats.TIME_24_WITH_SHORT_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_LONG_OFFSET() {\n return Formats.TIME_24_WITH_LONG_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_SHORT() {\n return Formats.DATETIME_SHORT;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_SHORT_WITH_SECONDS() {\n return Formats.DATETIME_SHORT_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED() {\n return Formats.DATETIME_MED;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED_WITH_SECONDS() {\n return Formats.DATETIME_MED_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED_WITH_WEEKDAY() {\n return Formats.DATETIME_MED_WITH_WEEKDAY;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_FULL() {\n return Formats.DATETIME_FULL;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_FULL_WITH_SECONDS() {\n return Formats.DATETIME_FULL_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_HUGE() {\n return Formats.DATETIME_HUGE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_HUGE_WITH_SECONDS() {\n return Formats.DATETIME_HUGE_WITH_SECONDS;\n }\n}\n\n/**\n * @private\n */\nexport function friendlyDateTime(dateTimeish) {\n if (DateTime.isDateTime(dateTimeish)) {\n return dateTimeish;\n } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) {\n return DateTime.fromJSDate(dateTimeish);\n } else if (dateTimeish && typeof dateTimeish === \"object\") {\n return DateTime.fromObject(dateTimeish);\n } else {\n throw new InvalidArgumentError(\n `Unknown datetime argument: ${dateTimeish}, of type ${typeof dateTimeish}`\n );\n }\n}\n","import DateTime from \"./datetime.js\";\nimport Duration from \"./duration.js\";\nimport Interval from \"./interval.js\";\nimport Info from \"./info.js\";\nimport Zone from \"./zone.js\";\nimport FixedOffsetZone from \"./zones/fixedOffsetZone.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport InvalidZone from \"./zones/invalidZone.js\";\nimport SystemZone from \"./zones/systemZone.js\";\nimport Settings from \"./settings.js\";\n\nconst VERSION = \"3.7.2\";\n\nexport {\n VERSION,\n DateTime,\n Duration,\n Interval,\n Info,\n Zone,\n FixedOffsetZone,\n IANAZone,\n InvalidZone,\n SystemZone,\n Settings,\n};\n"],"names":["LuxonError","_Error","_inheritsLoose","apply","arguments","_wrapNativeSuper","Error","InvalidDateTimeError","_LuxonError","reason","call","toMessage","InvalidIntervalError","_LuxonError2","InvalidDurationError","_LuxonError3","ConflictingSpecificationError","_LuxonError4","InvalidUnitError","_LuxonError5","unit","InvalidArgumentError","_LuxonError6","ZoneIsAbstractError","_LuxonError7","n","s","l","DATE_SHORT","year","month","day","DATE_MED","DATE_MED_WITH_WEEKDAY","weekday","DATE_FULL","DATE_HUGE","TIME_SIMPLE","hour","minute","TIME_WITH_SECONDS","second","TIME_WITH_SHORT_OFFSET","timeZoneName","TIME_WITH_LONG_OFFSET","TIME_24_SIMPLE","hourCycle","TIME_24_WITH_SECONDS","TIME_24_WITH_SHORT_OFFSET","TIME_24_WITH_LONG_OFFSET","DATETIME_SHORT","DATETIME_SHORT_WITH_SECONDS","DATETIME_MED","DATETIME_MED_WITH_SECONDS","DATETIME_MED_WITH_WEEKDAY","DATETIME_FULL","DATETIME_FULL_WITH_SECONDS","DATETIME_HUGE","DATETIME_HUGE_WITH_SECONDS","Zone","_proto","prototype","offsetName","ts","opts","formatOffset","format","offset","equals","otherZone","_createClass","key","get","name","singleton","SystemZone","_Zone","_ref","locale","parseZoneInfo","Date","getTimezoneOffset","type","Intl","DateTimeFormat","resolvedOptions","timeZone","dtfCache","Map","makeDTF","zoneName","dtf","undefined","hour12","era","set","typeToPos","hackyOffset","date","formatted","replace","parsed","exec","fMonth","fDay","fYear","fadOrBc","fHour","fMinute","fSecond","partsOffset","formatToParts","filled","i","length","_formatted$i","value","pos","isUndefined","parseInt","ianaZoneCache","IANAZone","create","zone","resetCache","clear","isValidSpecifier","isValidZone","e","_this","valid","NaN","isNaN","_ref2","adOrBc","Math","abs","adjustedHour","asUTC","objToLocalTS","millisecond","asTS","over","intlLFCache","getCachedLF","locString","JSON","stringify","ListFormat","intlDTCache","getCachedDTF","intlNumCache","getCachedINF","inf","NumberFormat","intlRelCache","getCachedRTF","_opts","base","cacheKeyOpts","_objectWithoutPropertiesLoose","_excluded","RelativeTimeFormat","sysLocaleCache","systemLocale","intlResolvedOptionsCache","getCachedIntResolvedOptions","weekInfoCache","getCachedWeekInfo","data","Locale","getWeekInfo","weekInfo","_extends","fallbackWeekSettings","parseLocaleString","localeStr","xIndex","indexOf","substring","uIndex","options","selectedStr","smaller","_options","numberingSystem","calendar","intlConfigString","outputCalendar","includes","mapMonths","f","ms","dt","DateTime","utc","push","mapWeekdays","listStuff","loc","englishFn","intlFn","mode","listingMode","supportsFastNumbers","startsWith","PolyNumberFormatter","intl","forceSimple","padTo","floor","otherOpts","_excluded2","Object","keys","intlOpts","useGrouping","minimumIntegerDigits","fixed","roundTo","padStart","PolyDateFormatter","originalZone","z","gmtOffset","offsetZ","setZone","plus","minutes","_proto2","map","join","toJSDate","parts","part","PolyRelFormatter","isEnglish","style","hasRelative","rtf","_proto3","count","English","numeric","firstDay","minimalDays","weekend","fromOpts","weekSettings","defaultToEN","specifiedLocale","Settings","defaultLocale","localeR","numberingSystemR","defaultNumberingSystem","outputCalendarR","defaultOutputCalendar","weekSettingsR","validateWeekSettings","defaultWeekSettings","fromObject","_temp","numbering","_parseLocaleString","parsedLocale","parsedNumberingSystem","parsedOutputCalendar","weekdaysCache","standalone","monthsCache","meridiemCache","eraCache","fastNumbersCached","_proto4","isActuallyEn","hasNoWeirdness","clone","alts","getOwnPropertyNames","redefaultToEN","redefaultToSystem","months","_this2","monthSpecialCase","formatStr","mapper","extract","dtFormatter","weekdays","_this3","meridiems","_this4","eras","_this5","field","df","results","matching","find","m","toLowerCase","numberFormatter","fastNumbers","relFormatter","listFormatter","getWeekSettings","hasLocaleWeekInfo","getStartOfWeek","getMinDaysInFirstWeek","getWeekendDays","other","toString","FixedOffsetZone","instance","utcInstance","parseSpecifier","r","match","signedOffset","InvalidZone","normalizeZone","input","defaultZone","isString","lowered","isNumber","numberingSystems","arab","arabext","bali","beng","deva","fullwide","gujr","hanidec","khmr","knda","laoo","limb","mlym","mong","mymr","orya","tamldec","telu","thai","tibt","latn","numberingSystemsUTF16","hanidecChars","split","parseDigits","str","code","charCodeAt","search","_numberingSystemsUTF","min","max","digitRegexCache","resetDigitRegexCache","digitRegex","append","ns","appendCache","regex","RegExp","now","twoDigitCutoffYear","throwOnInvalid","resetCaches","cutoffYear","t","Invalid","explanation","nonLeapLadder","leapLadder","unitOutOfRange","dayOfWeek","d","UTC","setUTCFullYear","getUTCFullYear","js","getUTCDay","computeOrdinal","isLeapYear","uncomputeOrdinal","ordinal","table","month0","findIndex","isoWeekdayToLocal","isoWeekday","startOfWeek","gregorianToWeek","gregObj","minDaysInFirstWeek","weekNumber","weekYear","weeksInWeekYear","timeObject","weekToGregorian","weekData","weekdayOfJan4","yearInDays","daysInYear","_uncomputeOrdinal","gregorianToOrdinal","gregData","ordinalToGregorian","ordinalData","_uncomputeOrdinal2","usesLocalWeekValues","obj","hasLocaleWeekData","localWeekday","localWeekNumber","localWeekYear","hasIsoWeekData","hasInvalidWeekData","validYear","isInteger","validWeek","integerBetween","validWeekday","hasInvalidOrdinalData","validOrdinal","hasInvalidGregorianData","validMonth","validDay","daysInMonth","hasInvalidTimeData","validHour","validMinute","validSecond","validMillisecond","o","isDate","maybeArray","thing","Array","isArray","bestBy","arr","by","compare","reduce","best","next","pair","pick","a","k","hasOwnProperty","prop","settings","some","v","from","bottom","top","floorMod","x","isNeg","padded","parseInteger","string","parseFloating","parseFloat","parseMillis","fraction","number","digits","rounding","factor","pow","ceil","trunc","round","RangeError","modMonth","modYear","firstWeekOffset","fwdlw","weekOffset","weekOffsetNext","untruncateYear","offsetFormat","modified","offHourStr","offMinuteStr","offHour","Number","offMin","offMinSigned","is","asNumber","numericValue","isFinite","normalizeObject","normalizer","normalized","u","hours","sign","monthsLong","monthsShort","monthsNarrow","concat","weekdaysLong","weekdaysShort","weekdaysNarrow","erasLong","erasShort","erasNarrow","meridiemForDateTime","weekdayForDateTime","monthForDateTime","eraForDateTime","formatRelativeTime","narrow","units","years","quarters","weeks","days","seconds","lastable","isDay","isInPast","fmtValue","singular","lilUnits","fmtUnit","stringifyTokens","splits","tokenToString","_iterator","_createForOfIteratorHelperLoose","_step","done","token","literal","val","macroTokenToFormatOpts","D","Formats","DD","DDD","DDDD","tt","ttt","tttt","T","TT","TTT","TTTT","ff","fff","ffff","F","FF","FFF","FFFF","Formatter","parseFormat","fmt","current","currentFull","bracketed","c","charAt","test","formatOpts","systemLoc","formatWithSystemDefault","formatDateTime","formatDateTimeParts","formatInterval","interval","start","formatRange","end","num","p","signDisplay","formatDateTimeFromString","knownEnglish","useDateTimeFormatter","isOffsetFixed","allowZ","isValid","meridiem","maybeMacro","slice","quarter","formatDurationFromString","dur","invertLargest","signMode","tokenToField","lildur","info","mapped","inversionFactor","isNegativeDuration","largestUnit","tokens","realTokens","found","collapsed","shiftTo","filter","durationInfo","values","ianaRegex","combineRegexes","_len","regexes","_key","full","source","combineExtractors","_len2","extractors","_key2","ex","mergedVals","mergedZone","cursor","_ex","parse","_len3","patterns","_key3","_i","_patterns","_patterns$_i","extractor","simpleParse","_len4","_key4","ret","offsetRegex","isoExtendedZone","isoTimeBaseRegex","isoTimeRegex","isoTimeExtensionRegex","isoYmdRegex","isoWeekRegex","isoOrdinalRegex","extractISOWeekData","extractISOOrdinalData","sqlYmdRegex","sqlTimeRegex","sqlTimeExtensionRegex","int","fallback","extractISOYmd","item","extractISOTime","milliseconds","extractISOOffset","local","fullOffset","extractIANAZone","isoTimeOnly","isoDuration","extractISODuration","yearStr","monthStr","weekStr","dayStr","hourStr","minuteStr","secondStr","millisecondsStr","hasNegativePrefix","negativeSeconds","maybeNegate","force","obsOffsets","GMT","EDT","EST","CDT","CST","MDT","MST","PDT","PST","fromStrings","weekdayStr","result","rfc2822","extractRFC2822","obsOffset","milOffset","preprocessRFC2822","trim","rfc1123","rfc850","ascii","extractRFC1123Or850","extractASCII","isoYmdWithTimeExtensionRegex","isoWeekWithTimeExtensionRegex","isoOrdinalWithTimeExtensionRegex","isoTimeCombinedRegex","extractISOYmdTimeAndOffset","extractISOWeekTimeAndOffset","extractISOOrdinalDateAndTime","extractISOTimeAndOffset","parseISODate","parseRFC2822Date","parseHTTPDate","parseISODuration","extractISOTimeOnly","parseISOTimeOnly","sqlYmdWithTimeExtensionRegex","sqlTimeCombinedRegex","extractISOTimeOffsetAndIANAZone","parseSQL","INVALID","lowOrderMatrix","casualMatrix","daysInYearAccurate","daysInMonthAccurate","accurateMatrix","orderedUnits","reverseUnits","reverse","conf","conversionAccuracy","matrix","Duration","durationToMillis","vals","_vals$milliseconds","sum","normalizeValues","reduceRight","previous","previousVal","conv","rollUp","removeZeroes","newVals","_Object$entries","entries","_Object$entries$_i","_Symbol$for","config","accurate","invalid","isLuxonDuration","fromMillis","normalizeUnit","fromDurationLike","durationLike","isDuration","fromISO","text","_parseISODuration","fromISOTime","_parseISOTimeOnly","week","toFormat","fmtOpts","toHuman","showZeros","unitDisplay","listStyle","toObject","toISO","toISOTime","millis","toMillis","suppressMilliseconds","suppressSeconds","includePrefix","includeOffset","dateTime","toJSON","invalidReason","valueOf","duration","_i2","_orderedUnits","minus","negate","mapUnits","fn","_i3","_Object$keys","mixed","reconfigure","as","normalize","rescale","shiftToAll","built","accumulated","lastUnit","_i4","_orderedUnits2","own","ak","negated","_i5","_Object$keys2","removeZeros","eq","v1","v2","_i6","_orderedUnits3","Symbol","for","validateStartEnd","Interval","isLuxonInterval","fromDateTimes","builtStart","friendlyDateTime","builtEnd","validateError","after","before","_split","startIsValid","endIsValid","isInterval","toDuration","startOf","useLocaleWeeks","diff","hasSame","isEmpty","isAfter","isBefore","contains","splitAt","dateTimes","sorted","sort","b","added","splitBy","idx","divideEqually","numberOfParts","overlaps","abutsStart","abutsEnd","engulfs","intersection","union","merge","intervals","_intervals$sort$reduc","sofar","final","xor","_Array$prototype","currentCount","ends","time","flattened","difference","toLocaleString","toISODate","dateFormat","_temp2","_ref3","_ref3$separator","separator","mapEndpoints","mapFn","Info","hasDST","proto","isUniversal","isValidIANAZone","_ref$locale","_ref$locObj","locObj","getMinimumDaysInFirstWeek","_ref2$locale","_ref2$locObj","getWeekendWeekdays","_temp3","_ref3$locale","_ref3$locObj","_temp4","_ref4","_ref4$locale","_ref4$numberingSystem","_ref4$locObj","_ref4$outputCalendar","monthsFormat","_temp5","_ref5","_ref5$locale","_ref5$numberingSystem","_ref5$locObj","_ref5$outputCalendar","_temp6","_ref6","_ref6$locale","_ref6$numberingSystem","_ref6$locObj","weekdaysFormat","_temp7","_ref7","_ref7$locale","_ref7$numberingSystem","_ref7$locObj","_temp8","_ref8","_ref8$locale","_temp9","_ref9","_ref9$locale","features","relative","localeWeek","dayDiff","earlier","later","utcDayStart","toUTC","keepLocalTime","highOrderDiffs","differs","lowestOrder","highWater","_differs","_differs$_i","differ","_highOrderDiffs","remainingMillis","lowerOrderUnits","_cursor$plus","_Duration$fromMillis","MISSING_FTP","intUnit","post","deser","NBSP","String","fromCharCode","spaceOrNBSP","spaceOrNBSPRegExp","fixListRegex","stripInsensitivities","oneOf","strings","startIndex","groups","h","simple","escapeToken","unitForToken","one","two","three","four","six","oneOrTwo","oneToThree","oneToSix","oneToNine","twoToFour","fourToSix","unitate","partTypeStyleToTokenVal","short","long","dayperiod","dayPeriod","hour24","tokenForPart","resolvedOpts","isSpace","actualType","buildRegex","re","handlers","matches","all","matchIndex","dateTimeFromMatches","toField","specificOffset","Z","q","M","G","y","S","dummyDateTimeCache","getDummyDateTime","maybeExpandMacroToken","formatOptsToTokens","expandMacroTokens","TokenParser","disqualifyingUnit","_buildRegex","regexString","explainFromTokens","_match","rawMatches","parser","parseFromTokens","_explainFromTokens","formatter","MAX_DATE","unsupportedZone","possiblyCachedWeekData","possiblyCachedLocalWeekData","localWeekData","inst","old","fixOffset","localTS","tz","utcGuess","o2","o3","tsToObj","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","objToTS","adjustTime","oPre","millisToAdd","_fixOffset","parseDataToDateTime","parsedZone","interpretationZone","toTechFormat","extended","precision","longFormat","extendedZone","showSeconds","ianaName","defaultUnitValues","defaultWeekUnitValues","defaultOrdinalUnitValues","orderedWeekUnits","orderedOrdinalUnits","weeknumber","weeksnumber","weeknumbers","weekyear","weekyears","normalizeUnitWithLocalWeeks","guessOffsetForZone","zoneOffsetTs","offsetGuess","zoneOffsetGuessCache","quickDT","offsetProvis","_objToTS","diffRelative","calendary","lastOpts","argList","args","unchanged","ot","_zone","isLuxonDateTime","_lastOpts","_lastOpts2","fromJSDate","zoneToUse","fromSeconds","_usesLocalWeekValues","tsNow","containsOrdinal","containsGregorYear","containsGregorMD","containsGregor","definiteWeekDef","useWeekData","defaultValues","objNow","foundFirst","_iterator2","_step2","higherOrderInvalid","gregorian","_objToTS2","tsFinal","offsetFinal","_parseISODate","fromRFC2822","_parseRFC2822Date","fromHTTP","_parseHTTPDate","fromFormat","_opts$locale","_opts$numberingSystem","localeToUse","_parseFromTokens","fromString","fromSQL","_parseSQL","isDateTime","parseFormatForOpts","localeOpts","tokenList","expandFormat","expanded","getPossibleOffsets","dayMs","minuteMs","oEarlier","oLater","o1","ts1","ts2","c1","c2","resolvedLocaleOptions","_Formatter$create$res","toLocal","_ref2$keepLocalTime","_ref2$keepCalendarTim","keepCalendarTime","newTS","asObj","_objToTS3","setLocale","_usesLocalWeekValues2","settingWeekStuff","_objToTS4","_ref4$useLocaleWeeks","normalizedUnit","endOf","_this$plus","toLocaleParts","_ref5$format","_ref5$suppressSeconds","_ref5$suppressMillise","_ref5$includeOffset","_ref5$extendedZone","_ref5$precision","ext","_ref6$format","_ref6$precision","toISOWeekDate","_ref7$suppressMillise","_ref7$suppressSeconds","_ref7$includeOffset","_ref7$includePrefix","_ref7$extendedZone","_ref7$format","_ref7$precision","toRFC2822","toHTTP","toSQLDate","toSQLTime","_ref8$includeOffset","_ref8$includeZone","includeZone","_ref8$includeOffsetSp","includeOffsetSpace","toSQL","toSeconds","toUnixInteger","toBSON","includeConfig","otherDateTime","durOpts","otherIsLater","diffed","diffNow","until","inputMs","adjustedToZone","toRelative","padding","toRelativeCalendar","every","fromFormatExplain","_options$locale","_options$numberingSys","fromStringExplain","buildFormatParser","_options2","_options2$locale","_options2$numberingSy","fromFormatParser","formatParser","_opts2","_opts2$locale","_opts2$numberingSyste","_formatParser$explain","dateTimeish","VERSION"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/luxon/build/es6/luxon.mjs b/node_modules/luxon/build/es6/luxon.mjs new file mode 100644 index 00000000..06e1d6cb --- /dev/null +++ b/node_modules/luxon/build/es6/luxon.mjs @@ -0,0 +1,8133 @@ +// these aren't really private, but nor are they really useful to document + +/** + * @private + */ +class LuxonError extends Error {} + +/** + * @private + */ +class InvalidDateTimeError extends LuxonError { + constructor(reason) { + super(`Invalid DateTime: ${reason.toMessage()}`); + } +} + +/** + * @private + */ +class InvalidIntervalError extends LuxonError { + constructor(reason) { + super(`Invalid Interval: ${reason.toMessage()}`); + } +} + +/** + * @private + */ +class InvalidDurationError extends LuxonError { + constructor(reason) { + super(`Invalid Duration: ${reason.toMessage()}`); + } +} + +/** + * @private + */ +class ConflictingSpecificationError extends LuxonError {} + +/** + * @private + */ +class InvalidUnitError extends LuxonError { + constructor(unit) { + super(`Invalid unit ${unit}`); + } +} + +/** + * @private + */ +class InvalidArgumentError extends LuxonError {} + +/** + * @private + */ +class ZoneIsAbstractError extends LuxonError { + constructor() { + super("Zone is an abstract class"); + } +} + +/** + * @private + */ + +const n = "numeric", + s = "short", + l = "long"; + +const DATE_SHORT = { + year: n, + month: n, + day: n, +}; + +const DATE_MED = { + year: n, + month: s, + day: n, +}; + +const DATE_MED_WITH_WEEKDAY = { + year: n, + month: s, + day: n, + weekday: s, +}; + +const DATE_FULL = { + year: n, + month: l, + day: n, +}; + +const DATE_HUGE = { + year: n, + month: l, + day: n, + weekday: l, +}; + +const TIME_SIMPLE = { + hour: n, + minute: n, +}; + +const TIME_WITH_SECONDS = { + hour: n, + minute: n, + second: n, +}; + +const TIME_WITH_SHORT_OFFSET = { + hour: n, + minute: n, + second: n, + timeZoneName: s, +}; + +const TIME_WITH_LONG_OFFSET = { + hour: n, + minute: n, + second: n, + timeZoneName: l, +}; + +const TIME_24_SIMPLE = { + hour: n, + minute: n, + hourCycle: "h23", +}; + +const TIME_24_WITH_SECONDS = { + hour: n, + minute: n, + second: n, + hourCycle: "h23", +}; + +const TIME_24_WITH_SHORT_OFFSET = { + hour: n, + minute: n, + second: n, + hourCycle: "h23", + timeZoneName: s, +}; + +const TIME_24_WITH_LONG_OFFSET = { + hour: n, + minute: n, + second: n, + hourCycle: "h23", + timeZoneName: l, +}; + +const DATETIME_SHORT = { + year: n, + month: n, + day: n, + hour: n, + minute: n, +}; + +const DATETIME_SHORT_WITH_SECONDS = { + year: n, + month: n, + day: n, + hour: n, + minute: n, + second: n, +}; + +const DATETIME_MED = { + year: n, + month: s, + day: n, + hour: n, + minute: n, +}; + +const DATETIME_MED_WITH_SECONDS = { + year: n, + month: s, + day: n, + hour: n, + minute: n, + second: n, +}; + +const DATETIME_MED_WITH_WEEKDAY = { + year: n, + month: s, + day: n, + weekday: s, + hour: n, + minute: n, +}; + +const DATETIME_FULL = { + year: n, + month: l, + day: n, + hour: n, + minute: n, + timeZoneName: s, +}; + +const DATETIME_FULL_WITH_SECONDS = { + year: n, + month: l, + day: n, + hour: n, + minute: n, + second: n, + timeZoneName: s, +}; + +const DATETIME_HUGE = { + year: n, + month: l, + day: n, + weekday: l, + hour: n, + minute: n, + timeZoneName: l, +}; + +const DATETIME_HUGE_WITH_SECONDS = { + year: n, + month: l, + day: n, + weekday: l, + hour: n, + minute: n, + second: n, + timeZoneName: l, +}; + +/** + * @interface + */ +class Zone { + /** + * The type of zone + * @abstract + * @type {string} + */ + get type() { + throw new ZoneIsAbstractError(); + } + + /** + * The name of this zone. + * @abstract + * @type {string} + */ + get name() { + throw new ZoneIsAbstractError(); + } + + /** + * The IANA name of this zone. + * Defaults to `name` if not overwritten by a subclass. + * @abstract + * @type {string} + */ + get ianaName() { + return this.name; + } + + /** + * Returns whether the offset is known to be fixed for the whole year. + * @abstract + * @type {boolean} + */ + get isUniversal() { + throw new ZoneIsAbstractError(); + } + + /** + * Returns the offset's common name (such as EST) at the specified timestamp + * @abstract + * @param {number} ts - Epoch milliseconds for which to get the name + * @param {Object} opts - Options to affect the format + * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'. + * @param {string} opts.locale - What locale to return the offset name in. + * @return {string} + */ + offsetName(ts, opts) { + throw new ZoneIsAbstractError(); + } + + /** + * Returns the offset's value as a string + * @abstract + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */ + formatOffset(ts, format) { + throw new ZoneIsAbstractError(); + } + + /** + * Return the offset in minutes for this zone at the specified timestamp. + * @abstract + * @param {number} ts - Epoch milliseconds for which to compute the offset + * @return {number} + */ + offset(ts) { + throw new ZoneIsAbstractError(); + } + + /** + * Return whether this Zone is equal to another zone + * @abstract + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */ + equals(otherZone) { + throw new ZoneIsAbstractError(); + } + + /** + * Return whether this Zone is valid. + * @abstract + * @type {boolean} + */ + get isValid() { + throw new ZoneIsAbstractError(); + } +} + +let singleton$1 = null; + +/** + * Represents the local zone for this JavaScript environment. + * @implements {Zone} + */ +class SystemZone extends Zone { + /** + * Get a singleton instance of the local zone + * @return {SystemZone} + */ + static get instance() { + if (singleton$1 === null) { + singleton$1 = new SystemZone(); + } + return singleton$1; + } + + /** @override **/ + get type() { + return "system"; + } + + /** @override **/ + get name() { + return new Intl.DateTimeFormat().resolvedOptions().timeZone; + } + + /** @override **/ + get isUniversal() { + return false; + } + + /** @override **/ + offsetName(ts, { format, locale }) { + return parseZoneInfo(ts, format, locale); + } + + /** @override **/ + formatOffset(ts, format) { + return formatOffset(this.offset(ts), format); + } + + /** @override **/ + offset(ts) { + return -new Date(ts).getTimezoneOffset(); + } + + /** @override **/ + equals(otherZone) { + return otherZone.type === "system"; + } + + /** @override **/ + get isValid() { + return true; + } +} + +const dtfCache = new Map(); +function makeDTF(zoneName) { + let dtf = dtfCache.get(zoneName); + if (dtf === undefined) { + dtf = new Intl.DateTimeFormat("en-US", { + hour12: false, + timeZone: zoneName, + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + era: "short", + }); + dtfCache.set(zoneName, dtf); + } + return dtf; +} + +const typeToPos = { + year: 0, + month: 1, + day: 2, + era: 3, + hour: 4, + minute: 5, + second: 6, +}; + +function hackyOffset(dtf, date) { + const formatted = dtf.format(date).replace(/\u200E/g, ""), + parsed = /(\d+)\/(\d+)\/(\d+) (AD|BC),? (\d+):(\d+):(\d+)/.exec(formatted), + [, fMonth, fDay, fYear, fadOrBc, fHour, fMinute, fSecond] = parsed; + return [fYear, fMonth, fDay, fadOrBc, fHour, fMinute, fSecond]; +} + +function partsOffset(dtf, date) { + const formatted = dtf.formatToParts(date); + const filled = []; + for (let i = 0; i < formatted.length; i++) { + const { type, value } = formatted[i]; + const pos = typeToPos[type]; + + if (type === "era") { + filled[pos] = value; + } else if (!isUndefined(pos)) { + filled[pos] = parseInt(value, 10); + } + } + return filled; +} + +const ianaZoneCache = new Map(); +/** + * A zone identified by an IANA identifier, like America/New_York + * @implements {Zone} + */ +class IANAZone extends Zone { + /** + * @param {string} name - Zone name + * @return {IANAZone} + */ + static create(name) { + let zone = ianaZoneCache.get(name); + if (zone === undefined) { + ianaZoneCache.set(name, (zone = new IANAZone(name))); + } + return zone; + } + + /** + * Reset local caches. Should only be necessary in testing scenarios. + * @return {void} + */ + static resetCache() { + ianaZoneCache.clear(); + dtfCache.clear(); + } + + /** + * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that. + * @param {string} s - The string to check validity on + * @example IANAZone.isValidSpecifier("America/New_York") //=> true + * @example IANAZone.isValidSpecifier("Sport~~blorp") //=> false + * @deprecated For backward compatibility, this forwards to isValidZone, better use `isValidZone()` directly instead. + * @return {boolean} + */ + static isValidSpecifier(s) { + return this.isValidZone(s); + } + + /** + * Returns whether the provided string identifies a real zone + * @param {string} zone - The string to check + * @example IANAZone.isValidZone("America/New_York") //=> true + * @example IANAZone.isValidZone("Fantasia/Castle") //=> false + * @example IANAZone.isValidZone("Sport~~blorp") //=> false + * @return {boolean} + */ + static isValidZone(zone) { + if (!zone) { + return false; + } + try { + new Intl.DateTimeFormat("en-US", { timeZone: zone }).format(); + return true; + } catch (e) { + return false; + } + } + + constructor(name) { + super(); + /** @private **/ + this.zoneName = name; + /** @private **/ + this.valid = IANAZone.isValidZone(name); + } + + /** + * The type of zone. `iana` for all instances of `IANAZone`. + * @override + * @type {string} + */ + get type() { + return "iana"; + } + + /** + * The name of this zone (i.e. the IANA zone name). + * @override + * @type {string} + */ + get name() { + return this.zoneName; + } + + /** + * Returns whether the offset is known to be fixed for the whole year: + * Always returns false for all IANA zones. + * @override + * @type {boolean} + */ + get isUniversal() { + return false; + } + + /** + * Returns the offset's common name (such as EST) at the specified timestamp + * @override + * @param {number} ts - Epoch milliseconds for which to get the name + * @param {Object} opts - Options to affect the format + * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'. + * @param {string} opts.locale - What locale to return the offset name in. + * @return {string} + */ + offsetName(ts, { format, locale }) { + return parseZoneInfo(ts, format, locale, this.name); + } + + /** + * Returns the offset's value as a string + * @override + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */ + formatOffset(ts, format) { + return formatOffset(this.offset(ts), format); + } + + /** + * Return the offset in minutes for this zone at the specified timestamp. + * @override + * @param {number} ts - Epoch milliseconds for which to compute the offset + * @return {number} + */ + offset(ts) { + if (!this.valid) return NaN; + const date = new Date(ts); + + if (isNaN(date)) return NaN; + + const dtf = makeDTF(this.name); + let [year, month, day, adOrBc, hour, minute, second] = dtf.formatToParts + ? partsOffset(dtf, date) + : hackyOffset(dtf, date); + + if (adOrBc === "BC") { + year = -Math.abs(year) + 1; + } + + // because we're using hour12 and https://bugs.chromium.org/p/chromium/issues/detail?id=1025564&can=2&q=%2224%3A00%22%20datetimeformat + const adjustedHour = hour === 24 ? 0 : hour; + + const asUTC = objToLocalTS({ + year, + month, + day, + hour: adjustedHour, + minute, + second, + millisecond: 0, + }); + + let asTS = +date; + const over = asTS % 1000; + asTS -= over >= 0 ? over : 1000 + over; + return (asUTC - asTS) / (60 * 1000); + } + + /** + * Return whether this Zone is equal to another zone + * @override + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */ + equals(otherZone) { + return otherZone.type === "iana" && otherZone.name === this.name; + } + + /** + * Return whether this Zone is valid. + * @override + * @type {boolean} + */ + get isValid() { + return this.valid; + } +} + +// todo - remap caching + +let intlLFCache = {}; +function getCachedLF(locString, opts = {}) { + const key = JSON.stringify([locString, opts]); + let dtf = intlLFCache[key]; + if (!dtf) { + dtf = new Intl.ListFormat(locString, opts); + intlLFCache[key] = dtf; + } + return dtf; +} + +const intlDTCache = new Map(); +function getCachedDTF(locString, opts = {}) { + const key = JSON.stringify([locString, opts]); + let dtf = intlDTCache.get(key); + if (dtf === undefined) { + dtf = new Intl.DateTimeFormat(locString, opts); + intlDTCache.set(key, dtf); + } + return dtf; +} + +const intlNumCache = new Map(); +function getCachedINF(locString, opts = {}) { + const key = JSON.stringify([locString, opts]); + let inf = intlNumCache.get(key); + if (inf === undefined) { + inf = new Intl.NumberFormat(locString, opts); + intlNumCache.set(key, inf); + } + return inf; +} + +const intlRelCache = new Map(); +function getCachedRTF(locString, opts = {}) { + const { base, ...cacheKeyOpts } = opts; // exclude `base` from the options + const key = JSON.stringify([locString, cacheKeyOpts]); + let inf = intlRelCache.get(key); + if (inf === undefined) { + inf = new Intl.RelativeTimeFormat(locString, opts); + intlRelCache.set(key, inf); + } + return inf; +} + +let sysLocaleCache = null; +function systemLocale() { + if (sysLocaleCache) { + return sysLocaleCache; + } else { + sysLocaleCache = new Intl.DateTimeFormat().resolvedOptions().locale; + return sysLocaleCache; + } +} + +const intlResolvedOptionsCache = new Map(); +function getCachedIntResolvedOptions(locString) { + let opts = intlResolvedOptionsCache.get(locString); + if (opts === undefined) { + opts = new Intl.DateTimeFormat(locString).resolvedOptions(); + intlResolvedOptionsCache.set(locString, opts); + } + return opts; +} + +const weekInfoCache = new Map(); +function getCachedWeekInfo(locString) { + let data = weekInfoCache.get(locString); + if (!data) { + const locale = new Intl.Locale(locString); + // browsers currently implement this as a property, but spec says it should be a getter function + data = "getWeekInfo" in locale ? locale.getWeekInfo() : locale.weekInfo; + // minimalDays was removed from WeekInfo: https://github.com/tc39/proposal-intl-locale-info/issues/86 + if (!("minimalDays" in data)) { + data = { ...fallbackWeekSettings, ...data }; + } + weekInfoCache.set(locString, data); + } + return data; +} + +function parseLocaleString(localeStr) { + // I really want to avoid writing a BCP 47 parser + // see, e.g. https://github.com/wooorm/bcp-47 + // Instead, we'll do this: + + // a) if the string has no -u extensions, just leave it alone + // b) if it does, use Intl to resolve everything + // c) if Intl fails, try again without the -u + + // private subtags and unicode subtags have ordering requirements, + // and we're not properly parsing this, so just strip out the + // private ones if they exist. + const xIndex = localeStr.indexOf("-x-"); + if (xIndex !== -1) { + localeStr = localeStr.substring(0, xIndex); + } + + const uIndex = localeStr.indexOf("-u-"); + if (uIndex === -1) { + return [localeStr]; + } else { + let options; + let selectedStr; + try { + options = getCachedDTF(localeStr).resolvedOptions(); + selectedStr = localeStr; + } catch (e) { + const smaller = localeStr.substring(0, uIndex); + options = getCachedDTF(smaller).resolvedOptions(); + selectedStr = smaller; + } + + const { numberingSystem, calendar } = options; + return [selectedStr, numberingSystem, calendar]; + } +} + +function intlConfigString(localeStr, numberingSystem, outputCalendar) { + if (outputCalendar || numberingSystem) { + if (!localeStr.includes("-u-")) { + localeStr += "-u"; + } + + if (outputCalendar) { + localeStr += `-ca-${outputCalendar}`; + } + + if (numberingSystem) { + localeStr += `-nu-${numberingSystem}`; + } + return localeStr; + } else { + return localeStr; + } +} + +function mapMonths(f) { + const ms = []; + for (let i = 1; i <= 12; i++) { + const dt = DateTime.utc(2009, i, 1); + ms.push(f(dt)); + } + return ms; +} + +function mapWeekdays(f) { + const ms = []; + for (let i = 1; i <= 7; i++) { + const dt = DateTime.utc(2016, 11, 13 + i); + ms.push(f(dt)); + } + return ms; +} + +function listStuff(loc, length, englishFn, intlFn) { + const mode = loc.listingMode(); + + if (mode === "error") { + return null; + } else if (mode === "en") { + return englishFn(length); + } else { + return intlFn(length); + } +} + +function supportsFastNumbers(loc) { + if (loc.numberingSystem && loc.numberingSystem !== "latn") { + return false; + } else { + return ( + loc.numberingSystem === "latn" || + !loc.locale || + loc.locale.startsWith("en") || + getCachedIntResolvedOptions(loc.locale).numberingSystem === "latn" + ); + } +} + +/** + * @private + */ + +class PolyNumberFormatter { + constructor(intl, forceSimple, opts) { + this.padTo = opts.padTo || 0; + this.floor = opts.floor || false; + + const { padTo, floor, ...otherOpts } = opts; + + if (!forceSimple || Object.keys(otherOpts).length > 0) { + const intlOpts = { useGrouping: false, ...opts }; + if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo; + this.inf = getCachedINF(intl, intlOpts); + } + } + + format(i) { + if (this.inf) { + const fixed = this.floor ? Math.floor(i) : i; + return this.inf.format(fixed); + } else { + // to match the browser's numberformatter defaults + const fixed = this.floor ? Math.floor(i) : roundTo(i, 3); + return padStart(fixed, this.padTo); + } + } +} + +/** + * @private + */ + +class PolyDateFormatter { + constructor(dt, intl, opts) { + this.opts = opts; + this.originalZone = undefined; + + let z = undefined; + if (this.opts.timeZone) { + // Don't apply any workarounds if a timeZone is explicitly provided in opts + this.dt = dt; + } else if (dt.zone.type === "fixed") { + // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like. + // That is why fixed-offset TZ is set to that unless it is: + // 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT. + // 2. Unsupported by the browser: + // - some do not support Etc/ + // - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata + const gmtOffset = -1 * (dt.offset / 60); + const offsetZ = gmtOffset >= 0 ? `Etc/GMT+${gmtOffset}` : `Etc/GMT${gmtOffset}`; + if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) { + z = offsetZ; + this.dt = dt; + } else { + // Not all fixed-offset zones like Etc/+4:30 are present in tzdata so + // we manually apply the offset and substitute the zone as needed. + z = "UTC"; + this.dt = dt.offset === 0 ? dt : dt.setZone("UTC").plus({ minutes: dt.offset }); + this.originalZone = dt.zone; + } + } else if (dt.zone.type === "system") { + this.dt = dt; + } else if (dt.zone.type === "iana") { + this.dt = dt; + z = dt.zone.name; + } else { + // Custom zones can have any offset / offsetName so we just manually + // apply the offset and substitute the zone as needed. + z = "UTC"; + this.dt = dt.setZone("UTC").plus({ minutes: dt.offset }); + this.originalZone = dt.zone; + } + + const intlOpts = { ...this.opts }; + intlOpts.timeZone = intlOpts.timeZone || z; + this.dtf = getCachedDTF(intl, intlOpts); + } + + format() { + if (this.originalZone) { + // If we have to substitute in the actual zone name, we have to use + // formatToParts so that the timezone can be replaced. + return this.formatToParts() + .map(({ value }) => value) + .join(""); + } + return this.dtf.format(this.dt.toJSDate()); + } + + formatToParts() { + const parts = this.dtf.formatToParts(this.dt.toJSDate()); + if (this.originalZone) { + return parts.map((part) => { + if (part.type === "timeZoneName") { + const offsetName = this.originalZone.offsetName(this.dt.ts, { + locale: this.dt.locale, + format: this.opts.timeZoneName, + }); + return { + ...part, + value: offsetName, + }; + } else { + return part; + } + }); + } + return parts; + } + + resolvedOptions() { + return this.dtf.resolvedOptions(); + } +} + +/** + * @private + */ +class PolyRelFormatter { + constructor(intl, isEnglish, opts) { + this.opts = { style: "long", ...opts }; + if (!isEnglish && hasRelative()) { + this.rtf = getCachedRTF(intl, opts); + } + } + + format(count, unit) { + if (this.rtf) { + return this.rtf.format(count, unit); + } else { + return formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== "long"); + } + } + + formatToParts(count, unit) { + if (this.rtf) { + return this.rtf.formatToParts(count, unit); + } else { + return []; + } + } +} + +const fallbackWeekSettings = { + firstDay: 1, + minimalDays: 4, + weekend: [6, 7], +}; + +/** + * @private + */ +class Locale { + static fromOpts(opts) { + return Locale.create( + opts.locale, + opts.numberingSystem, + opts.outputCalendar, + opts.weekSettings, + opts.defaultToEN + ); + } + + static create(locale, numberingSystem, outputCalendar, weekSettings, defaultToEN = false) { + const specifiedLocale = locale || Settings.defaultLocale; + // the system locale is useful for human-readable strings but annoying for parsing/formatting known formats + const localeR = specifiedLocale || (defaultToEN ? "en-US" : systemLocale()); + const numberingSystemR = numberingSystem || Settings.defaultNumberingSystem; + const outputCalendarR = outputCalendar || Settings.defaultOutputCalendar; + const weekSettingsR = validateWeekSettings(weekSettings) || Settings.defaultWeekSettings; + return new Locale(localeR, numberingSystemR, outputCalendarR, weekSettingsR, specifiedLocale); + } + + static resetCache() { + sysLocaleCache = null; + intlDTCache.clear(); + intlNumCache.clear(); + intlRelCache.clear(); + intlResolvedOptionsCache.clear(); + weekInfoCache.clear(); + } + + static fromObject({ locale, numberingSystem, outputCalendar, weekSettings } = {}) { + return Locale.create(locale, numberingSystem, outputCalendar, weekSettings); + } + + constructor(locale, numbering, outputCalendar, weekSettings, specifiedLocale) { + const [parsedLocale, parsedNumberingSystem, parsedOutputCalendar] = parseLocaleString(locale); + + this.locale = parsedLocale; + this.numberingSystem = numbering || parsedNumberingSystem || null; + this.outputCalendar = outputCalendar || parsedOutputCalendar || null; + this.weekSettings = weekSettings; + this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar); + + this.weekdaysCache = { format: {}, standalone: {} }; + this.monthsCache = { format: {}, standalone: {} }; + this.meridiemCache = null; + this.eraCache = {}; + + this.specifiedLocale = specifiedLocale; + this.fastNumbersCached = null; + } + + get fastNumbers() { + if (this.fastNumbersCached == null) { + this.fastNumbersCached = supportsFastNumbers(this); + } + + return this.fastNumbersCached; + } + + listingMode() { + const isActuallyEn = this.isEnglish(); + const hasNoWeirdness = + (this.numberingSystem === null || this.numberingSystem === "latn") && + (this.outputCalendar === null || this.outputCalendar === "gregory"); + return isActuallyEn && hasNoWeirdness ? "en" : "intl"; + } + + clone(alts) { + if (!alts || Object.getOwnPropertyNames(alts).length === 0) { + return this; + } else { + return Locale.create( + alts.locale || this.specifiedLocale, + alts.numberingSystem || this.numberingSystem, + alts.outputCalendar || this.outputCalendar, + validateWeekSettings(alts.weekSettings) || this.weekSettings, + alts.defaultToEN || false + ); + } + } + + redefaultToEN(alts = {}) { + return this.clone({ ...alts, defaultToEN: true }); + } + + redefaultToSystem(alts = {}) { + return this.clone({ ...alts, defaultToEN: false }); + } + + months(length, format = false) { + return listStuff(this, length, months, () => { + // Workaround for "ja" locale: formatToParts does not label all parts of the month + // as "month" and for this locale there is no difference between "format" and "non-format". + // As such, just use format() instead of formatToParts() and take the whole string + const monthSpecialCase = this.intl === "ja" || this.intl.startsWith("ja-"); + format &= !monthSpecialCase; + const intl = format ? { month: length, day: "numeric" } : { month: length }, + formatStr = format ? "format" : "standalone"; + if (!this.monthsCache[formatStr][length]) { + const mapper = !monthSpecialCase + ? (dt) => this.extract(dt, intl, "month") + : (dt) => this.dtFormatter(dt, intl).format(); + this.monthsCache[formatStr][length] = mapMonths(mapper); + } + return this.monthsCache[formatStr][length]; + }); + } + + weekdays(length, format = false) { + return listStuff(this, length, weekdays, () => { + const intl = format + ? { weekday: length, year: "numeric", month: "long", day: "numeric" } + : { weekday: length }, + formatStr = format ? "format" : "standalone"; + if (!this.weekdaysCache[formatStr][length]) { + this.weekdaysCache[formatStr][length] = mapWeekdays((dt) => + this.extract(dt, intl, "weekday") + ); + } + return this.weekdaysCache[formatStr][length]; + }); + } + + meridiems() { + return listStuff( + this, + undefined, + () => meridiems, + () => { + // In theory there could be aribitrary day periods. We're gonna assume there are exactly two + // for AM and PM. This is probably wrong, but it's makes parsing way easier. + if (!this.meridiemCache) { + const intl = { hour: "numeric", hourCycle: "h12" }; + this.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map( + (dt) => this.extract(dt, intl, "dayperiod") + ); + } + + return this.meridiemCache; + } + ); + } + + eras(length) { + return listStuff(this, length, eras, () => { + const intl = { era: length }; + + // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates + // to definitely enumerate them. + if (!this.eraCache[length]) { + this.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map((dt) => + this.extract(dt, intl, "era") + ); + } + + return this.eraCache[length]; + }); + } + + extract(dt, intlOpts, field) { + const df = this.dtFormatter(dt, intlOpts), + results = df.formatToParts(), + matching = results.find((m) => m.type.toLowerCase() === field); + return matching ? matching.value : null; + } + + numberFormatter(opts = {}) { + // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave) + // (in contrast, the rest of the condition is used heavily) + return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts); + } + + dtFormatter(dt, intlOpts = {}) { + return new PolyDateFormatter(dt, this.intl, intlOpts); + } + + relFormatter(opts = {}) { + return new PolyRelFormatter(this.intl, this.isEnglish(), opts); + } + + listFormatter(opts = {}) { + return getCachedLF(this.intl, opts); + } + + isEnglish() { + return ( + this.locale === "en" || + this.locale.toLowerCase() === "en-us" || + getCachedIntResolvedOptions(this.intl).locale.startsWith("en-us") + ); + } + + getWeekSettings() { + if (this.weekSettings) { + return this.weekSettings; + } else if (!hasLocaleWeekInfo()) { + return fallbackWeekSettings; + } else { + return getCachedWeekInfo(this.locale); + } + } + + getStartOfWeek() { + return this.getWeekSettings().firstDay; + } + + getMinDaysInFirstWeek() { + return this.getWeekSettings().minimalDays; + } + + getWeekendDays() { + return this.getWeekSettings().weekend; + } + + equals(other) { + return ( + this.locale === other.locale && + this.numberingSystem === other.numberingSystem && + this.outputCalendar === other.outputCalendar + ); + } + + toString() { + return `Locale(${this.locale}, ${this.numberingSystem}, ${this.outputCalendar})`; + } +} + +let singleton = null; + +/** + * A zone with a fixed offset (meaning no DST) + * @implements {Zone} + */ +class FixedOffsetZone extends Zone { + /** + * Get a singleton instance of UTC + * @return {FixedOffsetZone} + */ + static get utcInstance() { + if (singleton === null) { + singleton = new FixedOffsetZone(0); + } + return singleton; + } + + /** + * Get an instance with a specified offset + * @param {number} offset - The offset in minutes + * @return {FixedOffsetZone} + */ + static instance(offset) { + return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset); + } + + /** + * Get an instance of FixedOffsetZone from a UTC offset string, like "UTC+6" + * @param {string} s - The offset string to parse + * @example FixedOffsetZone.parseSpecifier("UTC+6") + * @example FixedOffsetZone.parseSpecifier("UTC+06") + * @example FixedOffsetZone.parseSpecifier("UTC-6:00") + * @return {FixedOffsetZone} + */ + static parseSpecifier(s) { + if (s) { + const r = s.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i); + if (r) { + return new FixedOffsetZone(signedOffset(r[1], r[2])); + } + } + return null; + } + + constructor(offset) { + super(); + /** @private **/ + this.fixed = offset; + } + + /** + * The type of zone. `fixed` for all instances of `FixedOffsetZone`. + * @override + * @type {string} + */ + get type() { + return "fixed"; + } + + /** + * The name of this zone. + * All fixed zones' names always start with "UTC" (plus optional offset) + * @override + * @type {string} + */ + get name() { + return this.fixed === 0 ? "UTC" : `UTC${formatOffset(this.fixed, "narrow")}`; + } + + /** + * The IANA name of this zone, i.e. `Etc/UTC` or `Etc/GMT+/-nn` + * + * @override + * @type {string} + */ + get ianaName() { + if (this.fixed === 0) { + return "Etc/UTC"; + } else { + return `Etc/GMT${formatOffset(-this.fixed, "narrow")}`; + } + } + + /** + * Returns the offset's common name at the specified timestamp. + * + * For fixed offset zones this equals to the zone name. + * @override + */ + offsetName() { + return this.name; + } + + /** + * Returns the offset's value as a string + * @override + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */ + formatOffset(ts, format) { + return formatOffset(this.fixed, format); + } + + /** + * Returns whether the offset is known to be fixed for the whole year: + * Always returns true for all fixed offset zones. + * @override + * @type {boolean} + */ + get isUniversal() { + return true; + } + + /** + * Return the offset in minutes for this zone at the specified timestamp. + * + * For fixed offset zones, this is constant and does not depend on a timestamp. + * @override + * @return {number} + */ + offset() { + return this.fixed; + } + + /** + * Return whether this Zone is equal to another zone (i.e. also fixed and same offset) + * @override + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */ + equals(otherZone) { + return otherZone.type === "fixed" && otherZone.fixed === this.fixed; + } + + /** + * Return whether this Zone is valid: + * All fixed offset zones are valid. + * @override + * @type {boolean} + */ + get isValid() { + return true; + } +} + +/** + * A zone that failed to parse. You should never need to instantiate this. + * @implements {Zone} + */ +class InvalidZone extends Zone { + constructor(zoneName) { + super(); + /** @private */ + this.zoneName = zoneName; + } + + /** @override **/ + get type() { + return "invalid"; + } + + /** @override **/ + get name() { + return this.zoneName; + } + + /** @override **/ + get isUniversal() { + return false; + } + + /** @override **/ + offsetName() { + return null; + } + + /** @override **/ + formatOffset() { + return ""; + } + + /** @override **/ + offset() { + return NaN; + } + + /** @override **/ + equals() { + return false; + } + + /** @override **/ + get isValid() { + return false; + } +} + +/** + * @private + */ + +function normalizeZone(input, defaultZone) { + if (isUndefined(input) || input === null) { + return defaultZone; + } else if (input instanceof Zone) { + return input; + } else if (isString(input)) { + const lowered = input.toLowerCase(); + if (lowered === "default") return defaultZone; + else if (lowered === "local" || lowered === "system") return SystemZone.instance; + else if (lowered === "utc" || lowered === "gmt") return FixedOffsetZone.utcInstance; + else return FixedOffsetZone.parseSpecifier(lowered) || IANAZone.create(input); + } else if (isNumber(input)) { + return FixedOffsetZone.instance(input); + } else if (typeof input === "object" && "offset" in input && typeof input.offset === "function") { + // This is dumb, but the instanceof check above doesn't seem to really work + // so we're duck checking it + return input; + } else { + return new InvalidZone(input); + } +} + +const numberingSystems = { + arab: "[\u0660-\u0669]", + arabext: "[\u06F0-\u06F9]", + bali: "[\u1B50-\u1B59]", + beng: "[\u09E6-\u09EF]", + deva: "[\u0966-\u096F]", + fullwide: "[\uFF10-\uFF19]", + gujr: "[\u0AE6-\u0AEF]", + hanidec: "[〇|一|二|三|四|五|六|七|八|九]", + khmr: "[\u17E0-\u17E9]", + knda: "[\u0CE6-\u0CEF]", + laoo: "[\u0ED0-\u0ED9]", + limb: "[\u1946-\u194F]", + mlym: "[\u0D66-\u0D6F]", + mong: "[\u1810-\u1819]", + mymr: "[\u1040-\u1049]", + orya: "[\u0B66-\u0B6F]", + tamldec: "[\u0BE6-\u0BEF]", + telu: "[\u0C66-\u0C6F]", + thai: "[\u0E50-\u0E59]", + tibt: "[\u0F20-\u0F29]", + latn: "\\d", +}; + +const numberingSystemsUTF16 = { + arab: [1632, 1641], + arabext: [1776, 1785], + bali: [6992, 7001], + beng: [2534, 2543], + deva: [2406, 2415], + fullwide: [65296, 65303], + gujr: [2790, 2799], + khmr: [6112, 6121], + knda: [3302, 3311], + laoo: [3792, 3801], + limb: [6470, 6479], + mlym: [3430, 3439], + mong: [6160, 6169], + mymr: [4160, 4169], + orya: [2918, 2927], + tamldec: [3046, 3055], + telu: [3174, 3183], + thai: [3664, 3673], + tibt: [3872, 3881], +}; + +const hanidecChars = numberingSystems.hanidec.replace(/[\[|\]]/g, "").split(""); + +function parseDigits(str) { + let value = parseInt(str, 10); + if (isNaN(value)) { + value = ""; + for (let i = 0; i < str.length; i++) { + const code = str.charCodeAt(i); + + if (str[i].search(numberingSystems.hanidec) !== -1) { + value += hanidecChars.indexOf(str[i]); + } else { + for (const key in numberingSystemsUTF16) { + const [min, max] = numberingSystemsUTF16[key]; + if (code >= min && code <= max) { + value += code - min; + } + } + } + } + return parseInt(value, 10); + } else { + return value; + } +} + +// cache of {numberingSystem: {append: regex}} +const digitRegexCache = new Map(); +function resetDigitRegexCache() { + digitRegexCache.clear(); +} + +function digitRegex({ numberingSystem }, append = "") { + const ns = numberingSystem || "latn"; + + let appendCache = digitRegexCache.get(ns); + if (appendCache === undefined) { + appendCache = new Map(); + digitRegexCache.set(ns, appendCache); + } + let regex = appendCache.get(append); + if (regex === undefined) { + regex = new RegExp(`${numberingSystems[ns]}${append}`); + appendCache.set(append, regex); + } + + return regex; +} + +let now = () => Date.now(), + defaultZone = "system", + defaultLocale = null, + defaultNumberingSystem = null, + defaultOutputCalendar = null, + twoDigitCutoffYear = 60, + throwOnInvalid, + defaultWeekSettings = null; + +/** + * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here. + */ +class Settings { + /** + * Get the callback for returning the current timestamp. + * @type {function} + */ + static get now() { + return now; + } + + /** + * Set the callback for returning the current timestamp. + * The function should return a number, which will be interpreted as an Epoch millisecond count + * @type {function} + * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future + * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time + */ + static set now(n) { + now = n; + } + + /** + * Set the default time zone to create DateTimes in. Does not affect existing instances. + * Use the value "system" to reset this value to the system's time zone. + * @type {string} + */ + static set defaultZone(zone) { + defaultZone = zone; + } + + /** + * Get the default time zone object currently used to create DateTimes. Does not affect existing instances. + * The default value is the system's time zone (the one set on the machine that runs this code). + * @type {Zone} + */ + static get defaultZone() { + return normalizeZone(defaultZone, SystemZone.instance); + } + + /** + * Get the default locale to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + static get defaultLocale() { + return defaultLocale; + } + + /** + * Set the default locale to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + static set defaultLocale(locale) { + defaultLocale = locale; + } + + /** + * Get the default numbering system to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + static get defaultNumberingSystem() { + return defaultNumberingSystem; + } + + /** + * Set the default numbering system to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + static set defaultNumberingSystem(numberingSystem) { + defaultNumberingSystem = numberingSystem; + } + + /** + * Get the default output calendar to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + static get defaultOutputCalendar() { + return defaultOutputCalendar; + } + + /** + * Set the default output calendar to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + static set defaultOutputCalendar(outputCalendar) { + defaultOutputCalendar = outputCalendar; + } + + /** + * @typedef {Object} WeekSettings + * @property {number} firstDay + * @property {number} minimalDays + * @property {number[]} weekend + */ + + /** + * @return {WeekSettings|null} + */ + static get defaultWeekSettings() { + return defaultWeekSettings; + } + + /** + * Allows overriding the default locale week settings, i.e. the start of the week, the weekend and + * how many days are required in the first week of a year. + * Does not affect existing instances. + * + * @param {WeekSettings|null} weekSettings + */ + static set defaultWeekSettings(weekSettings) { + defaultWeekSettings = validateWeekSettings(weekSettings); + } + + /** + * Get the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx. + * @type {number} + */ + static get twoDigitCutoffYear() { + return twoDigitCutoffYear; + } + + /** + * Set the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx. + * @type {number} + * @example Settings.twoDigitCutoffYear = 0 // all 'yy' are interpreted as 20th century + * @example Settings.twoDigitCutoffYear = 99 // all 'yy' are interpreted as 21st century + * @example Settings.twoDigitCutoffYear = 50 // '49' -> 2049; '50' -> 1950 + * @example Settings.twoDigitCutoffYear = 1950 // interpreted as 50 + * @example Settings.twoDigitCutoffYear = 2050 // ALSO interpreted as 50 + */ + static set twoDigitCutoffYear(cutoffYear) { + twoDigitCutoffYear = cutoffYear % 100; + } + + /** + * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals + * @type {boolean} + */ + static get throwOnInvalid() { + return throwOnInvalid; + } + + /** + * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals + * @type {boolean} + */ + static set throwOnInvalid(t) { + throwOnInvalid = t; + } + + /** + * Reset Luxon's global caches. Should only be necessary in testing scenarios. + * @return {void} + */ + static resetCaches() { + Locale.resetCache(); + IANAZone.resetCache(); + DateTime.resetCache(); + resetDigitRegexCache(); + } +} + +class Invalid { + constructor(reason, explanation) { + this.reason = reason; + this.explanation = explanation; + } + + toMessage() { + if (this.explanation) { + return `${this.reason}: ${this.explanation}`; + } else { + return this.reason; + } + } +} + +const nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334], + leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335]; + +function unitOutOfRange(unit, value) { + return new Invalid( + "unit out of range", + `you specified ${value} (of type ${typeof value}) as a ${unit}, which is invalid` + ); +} + +function dayOfWeek(year, month, day) { + const d = new Date(Date.UTC(year, month - 1, day)); + + if (year < 100 && year >= 0) { + d.setUTCFullYear(d.getUTCFullYear() - 1900); + } + + const js = d.getUTCDay(); + + return js === 0 ? 7 : js; +} + +function computeOrdinal(year, month, day) { + return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1]; +} + +function uncomputeOrdinal(year, ordinal) { + const table = isLeapYear(year) ? leapLadder : nonLeapLadder, + month0 = table.findIndex((i) => i < ordinal), + day = ordinal - table[month0]; + return { month: month0 + 1, day }; +} + +function isoWeekdayToLocal(isoWeekday, startOfWeek) { + return ((isoWeekday - startOfWeek + 7) % 7) + 1; +} + +/** + * @private + */ + +function gregorianToWeek(gregObj, minDaysInFirstWeek = 4, startOfWeek = 1) { + const { year, month, day } = gregObj, + ordinal = computeOrdinal(year, month, day), + weekday = isoWeekdayToLocal(dayOfWeek(year, month, day), startOfWeek); + + let weekNumber = Math.floor((ordinal - weekday + 14 - minDaysInFirstWeek) / 7), + weekYear; + + if (weekNumber < 1) { + weekYear = year - 1; + weekNumber = weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek); + } else if (weekNumber > weeksInWeekYear(year, minDaysInFirstWeek, startOfWeek)) { + weekYear = year + 1; + weekNumber = 1; + } else { + weekYear = year; + } + + return { weekYear, weekNumber, weekday, ...timeObject(gregObj) }; +} + +function weekToGregorian(weekData, minDaysInFirstWeek = 4, startOfWeek = 1) { + const { weekYear, weekNumber, weekday } = weekData, + weekdayOfJan4 = isoWeekdayToLocal(dayOfWeek(weekYear, 1, minDaysInFirstWeek), startOfWeek), + yearInDays = daysInYear(weekYear); + + let ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 7 + minDaysInFirstWeek, + year; + + if (ordinal < 1) { + year = weekYear - 1; + ordinal += daysInYear(year); + } else if (ordinal > yearInDays) { + year = weekYear + 1; + ordinal -= daysInYear(weekYear); + } else { + year = weekYear; + } + + const { month, day } = uncomputeOrdinal(year, ordinal); + return { year, month, day, ...timeObject(weekData) }; +} + +function gregorianToOrdinal(gregData) { + const { year, month, day } = gregData; + const ordinal = computeOrdinal(year, month, day); + return { year, ordinal, ...timeObject(gregData) }; +} + +function ordinalToGregorian(ordinalData) { + const { year, ordinal } = ordinalData; + const { month, day } = uncomputeOrdinal(year, ordinal); + return { year, month, day, ...timeObject(ordinalData) }; +} + +/** + * Check if local week units like localWeekday are used in obj. + * If so, validates that they are not mixed with ISO week units and then copies them to the normal week unit properties. + * Modifies obj in-place! + * @param obj the object values + */ +function usesLocalWeekValues(obj, loc) { + const hasLocaleWeekData = + !isUndefined(obj.localWeekday) || + !isUndefined(obj.localWeekNumber) || + !isUndefined(obj.localWeekYear); + if (hasLocaleWeekData) { + const hasIsoWeekData = + !isUndefined(obj.weekday) || !isUndefined(obj.weekNumber) || !isUndefined(obj.weekYear); + + if (hasIsoWeekData) { + throw new ConflictingSpecificationError( + "Cannot mix locale-based week fields with ISO-based week fields" + ); + } + if (!isUndefined(obj.localWeekday)) obj.weekday = obj.localWeekday; + if (!isUndefined(obj.localWeekNumber)) obj.weekNumber = obj.localWeekNumber; + if (!isUndefined(obj.localWeekYear)) obj.weekYear = obj.localWeekYear; + delete obj.localWeekday; + delete obj.localWeekNumber; + delete obj.localWeekYear; + return { + minDaysInFirstWeek: loc.getMinDaysInFirstWeek(), + startOfWeek: loc.getStartOfWeek(), + }; + } else { + return { minDaysInFirstWeek: 4, startOfWeek: 1 }; + } +} + +function hasInvalidWeekData(obj, minDaysInFirstWeek = 4, startOfWeek = 1) { + const validYear = isInteger(obj.weekYear), + validWeek = integerBetween( + obj.weekNumber, + 1, + weeksInWeekYear(obj.weekYear, minDaysInFirstWeek, startOfWeek) + ), + validWeekday = integerBetween(obj.weekday, 1, 7); + + if (!validYear) { + return unitOutOfRange("weekYear", obj.weekYear); + } else if (!validWeek) { + return unitOutOfRange("week", obj.weekNumber); + } else if (!validWeekday) { + return unitOutOfRange("weekday", obj.weekday); + } else return false; +} + +function hasInvalidOrdinalData(obj) { + const validYear = isInteger(obj.year), + validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year)); + + if (!validYear) { + return unitOutOfRange("year", obj.year); + } else if (!validOrdinal) { + return unitOutOfRange("ordinal", obj.ordinal); + } else return false; +} + +function hasInvalidGregorianData(obj) { + const validYear = isInteger(obj.year), + validMonth = integerBetween(obj.month, 1, 12), + validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month)); + + if (!validYear) { + return unitOutOfRange("year", obj.year); + } else if (!validMonth) { + return unitOutOfRange("month", obj.month); + } else if (!validDay) { + return unitOutOfRange("day", obj.day); + } else return false; +} + +function hasInvalidTimeData(obj) { + const { hour, minute, second, millisecond } = obj; + const validHour = + integerBetween(hour, 0, 23) || + (hour === 24 && minute === 0 && second === 0 && millisecond === 0), + validMinute = integerBetween(minute, 0, 59), + validSecond = integerBetween(second, 0, 59), + validMillisecond = integerBetween(millisecond, 0, 999); + + if (!validHour) { + return unitOutOfRange("hour", hour); + } else if (!validMinute) { + return unitOutOfRange("minute", minute); + } else if (!validSecond) { + return unitOutOfRange("second", second); + } else if (!validMillisecond) { + return unitOutOfRange("millisecond", millisecond); + } else return false; +} + +/* + This is just a junk drawer, containing anything used across multiple classes. + Because Luxon is small(ish), this should stay small and we won't worry about splitting + it up into, say, parsingUtil.js and basicUtil.js and so on. But they are divided up by feature area. +*/ + +/** + * @private + */ + +// TYPES + +function isUndefined(o) { + return typeof o === "undefined"; +} + +function isNumber(o) { + return typeof o === "number"; +} + +function isInteger(o) { + return typeof o === "number" && o % 1 === 0; +} + +function isString(o) { + return typeof o === "string"; +} + +function isDate(o) { + return Object.prototype.toString.call(o) === "[object Date]"; +} + +// CAPABILITIES + +function hasRelative() { + try { + return typeof Intl !== "undefined" && !!Intl.RelativeTimeFormat; + } catch (e) { + return false; + } +} + +function hasLocaleWeekInfo() { + try { + return ( + typeof Intl !== "undefined" && + !!Intl.Locale && + ("weekInfo" in Intl.Locale.prototype || "getWeekInfo" in Intl.Locale.prototype) + ); + } catch (e) { + return false; + } +} + +// OBJECTS AND ARRAYS + +function maybeArray(thing) { + return Array.isArray(thing) ? thing : [thing]; +} + +function bestBy(arr, by, compare) { + if (arr.length === 0) { + return undefined; + } + return arr.reduce((best, next) => { + const pair = [by(next), next]; + if (!best) { + return pair; + } else if (compare(best[0], pair[0]) === best[0]) { + return best; + } else { + return pair; + } + }, null)[1]; +} + +function pick(obj, keys) { + return keys.reduce((a, k) => { + a[k] = obj[k]; + return a; + }, {}); +} + +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} + +function validateWeekSettings(settings) { + if (settings == null) { + return null; + } else if (typeof settings !== "object") { + throw new InvalidArgumentError("Week settings must be an object"); + } else { + if ( + !integerBetween(settings.firstDay, 1, 7) || + !integerBetween(settings.minimalDays, 1, 7) || + !Array.isArray(settings.weekend) || + settings.weekend.some((v) => !integerBetween(v, 1, 7)) + ) { + throw new InvalidArgumentError("Invalid week settings"); + } + return { + firstDay: settings.firstDay, + minimalDays: settings.minimalDays, + weekend: Array.from(settings.weekend), + }; + } +} + +// NUMBERS AND STRINGS + +function integerBetween(thing, bottom, top) { + return isInteger(thing) && thing >= bottom && thing <= top; +} + +// x % n but takes the sign of n instead of x +function floorMod(x, n) { + return x - n * Math.floor(x / n); +} + +function padStart(input, n = 2) { + const isNeg = input < 0; + let padded; + if (isNeg) { + padded = "-" + ("" + -input).padStart(n, "0"); + } else { + padded = ("" + input).padStart(n, "0"); + } + return padded; +} + +function parseInteger(string) { + if (isUndefined(string) || string === null || string === "") { + return undefined; + } else { + return parseInt(string, 10); + } +} + +function parseFloating(string) { + if (isUndefined(string) || string === null || string === "") { + return undefined; + } else { + return parseFloat(string); + } +} + +function parseMillis(fraction) { + // Return undefined (instead of 0) in these cases, where fraction is not set + if (isUndefined(fraction) || fraction === null || fraction === "") { + return undefined; + } else { + const f = parseFloat("0." + fraction) * 1000; + return Math.floor(f); + } +} + +function roundTo(number, digits, rounding = "round") { + const factor = 10 ** digits; + switch (rounding) { + case "expand": + return number > 0 + ? Math.ceil(number * factor) / factor + : Math.floor(number * factor) / factor; + case "trunc": + return Math.trunc(number * factor) / factor; + case "round": + return Math.round(number * factor) / factor; + case "floor": + return Math.floor(number * factor) / factor; + case "ceil": + return Math.ceil(number * factor) / factor; + default: + throw new RangeError(`Value rounding ${rounding} is out of range`); + } +} + +// DATE BASICS + +function isLeapYear(year) { + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); +} + +function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; +} + +function daysInMonth(year, month) { + const modMonth = floorMod(month - 1, 12) + 1, + modYear = year + (month - modMonth) / 12; + + if (modMonth === 2) { + return isLeapYear(modYear) ? 29 : 28; + } else { + return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1]; + } +} + +// convert a calendar object to a local timestamp (epoch, but with the offset baked in) +function objToLocalTS(obj) { + let d = Date.UTC( + obj.year, + obj.month - 1, + obj.day, + obj.hour, + obj.minute, + obj.second, + obj.millisecond + ); + + // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that + if (obj.year < 100 && obj.year >= 0) { + d = new Date(d); + // set the month and day again, this is necessary because year 2000 is a leap year, but year 100 is not + // so if obj.year is in 99, but obj.day makes it roll over into year 100, + // the calculations done by Date.UTC are using year 2000 - which is incorrect + d.setUTCFullYear(obj.year, obj.month - 1, obj.day); + } + return +d; +} + +// adapted from moment.js: https://github.com/moment/moment/blob/000ac1800e620f770f4eb31b5ae908f6167b0ab2/src/lib/units/week-calendar-utils.js +function firstWeekOffset(year, minDaysInFirstWeek, startOfWeek) { + const fwdlw = isoWeekdayToLocal(dayOfWeek(year, 1, minDaysInFirstWeek), startOfWeek); + return -fwdlw + minDaysInFirstWeek - 1; +} + +function weeksInWeekYear(weekYear, minDaysInFirstWeek = 4, startOfWeek = 1) { + const weekOffset = firstWeekOffset(weekYear, minDaysInFirstWeek, startOfWeek); + const weekOffsetNext = firstWeekOffset(weekYear + 1, minDaysInFirstWeek, startOfWeek); + return (daysInYear(weekYear) - weekOffset + weekOffsetNext) / 7; +} + +function untruncateYear(year) { + if (year > 99) { + return year; + } else return year > Settings.twoDigitCutoffYear ? 1900 + year : 2000 + year; +} + +// PARSING + +function parseZoneInfo(ts, offsetFormat, locale, timeZone = null) { + const date = new Date(ts), + intlOpts = { + hourCycle: "h23", + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit", + }; + + if (timeZone) { + intlOpts.timeZone = timeZone; + } + + const modified = { timeZoneName: offsetFormat, ...intlOpts }; + + const parsed = new Intl.DateTimeFormat(locale, modified) + .formatToParts(date) + .find((m) => m.type.toLowerCase() === "timezonename"); + return parsed ? parsed.value : null; +} + +// signedOffset('-5', '30') -> -330 +function signedOffset(offHourStr, offMinuteStr) { + let offHour = parseInt(offHourStr, 10); + + // don't || this because we want to preserve -0 + if (Number.isNaN(offHour)) { + offHour = 0; + } + + const offMin = parseInt(offMinuteStr, 10) || 0, + offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin; + return offHour * 60 + offMinSigned; +} + +// COERCION + +function asNumber(value) { + const numericValue = Number(value); + if (typeof value === "boolean" || value === "" || !Number.isFinite(numericValue)) + throw new InvalidArgumentError(`Invalid unit value ${value}`); + return numericValue; +} + +function normalizeObject(obj, normalizer) { + const normalized = {}; + for (const u in obj) { + if (hasOwnProperty(obj, u)) { + const v = obj[u]; + if (v === undefined || v === null) continue; + normalized[normalizer(u)] = asNumber(v); + } + } + return normalized; +} + +/** + * Returns the offset's value as a string + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */ +function formatOffset(offset, format) { + const hours = Math.trunc(Math.abs(offset / 60)), + minutes = Math.trunc(Math.abs(offset % 60)), + sign = offset >= 0 ? "+" : "-"; + + switch (format) { + case "short": + return `${sign}${padStart(hours, 2)}:${padStart(minutes, 2)}`; + case "narrow": + return `${sign}${hours}${minutes > 0 ? `:${minutes}` : ""}`; + case "techie": + return `${sign}${padStart(hours, 2)}${padStart(minutes, 2)}`; + default: + throw new RangeError(`Value format ${format} is out of range for property format`); + } +} + +function timeObject(obj) { + return pick(obj, ["hour", "minute", "second", "millisecond"]); +} + +/** + * @private + */ + +const monthsLong = [ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", +]; + +const monthsShort = [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", +]; + +const monthsNarrow = ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"]; + +function months(length) { + switch (length) { + case "narrow": + return [...monthsNarrow]; + case "short": + return [...monthsShort]; + case "long": + return [...monthsLong]; + case "numeric": + return ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"]; + case "2-digit": + return ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]; + default: + return null; + } +} + +const weekdaysLong = [ + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + "Sunday", +]; + +const weekdaysShort = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; + +const weekdaysNarrow = ["M", "T", "W", "T", "F", "S", "S"]; + +function weekdays(length) { + switch (length) { + case "narrow": + return [...weekdaysNarrow]; + case "short": + return [...weekdaysShort]; + case "long": + return [...weekdaysLong]; + case "numeric": + return ["1", "2", "3", "4", "5", "6", "7"]; + default: + return null; + } +} + +const meridiems = ["AM", "PM"]; + +const erasLong = ["Before Christ", "Anno Domini"]; + +const erasShort = ["BC", "AD"]; + +const erasNarrow = ["B", "A"]; + +function eras(length) { + switch (length) { + case "narrow": + return [...erasNarrow]; + case "short": + return [...erasShort]; + case "long": + return [...erasLong]; + default: + return null; + } +} + +function meridiemForDateTime(dt) { + return meridiems[dt.hour < 12 ? 0 : 1]; +} + +function weekdayForDateTime(dt, length) { + return weekdays(length)[dt.weekday - 1]; +} + +function monthForDateTime(dt, length) { + return months(length)[dt.month - 1]; +} + +function eraForDateTime(dt, length) { + return eras(length)[dt.year < 0 ? 0 : 1]; +} + +function formatRelativeTime(unit, count, numeric = "always", narrow = false) { + const units = { + years: ["year", "yr."], + quarters: ["quarter", "qtr."], + months: ["month", "mo."], + weeks: ["week", "wk."], + days: ["day", "day", "days"], + hours: ["hour", "hr."], + minutes: ["minute", "min."], + seconds: ["second", "sec."], + }; + + const lastable = ["hours", "minutes", "seconds"].indexOf(unit) === -1; + + if (numeric === "auto" && lastable) { + const isDay = unit === "days"; + switch (count) { + case 1: + return isDay ? "tomorrow" : `next ${units[unit][0]}`; + case -1: + return isDay ? "yesterday" : `last ${units[unit][0]}`; + case 0: + return isDay ? "today" : `this ${units[unit][0]}`; + } + } + + const isInPast = Object.is(count, -0) || count < 0, + fmtValue = Math.abs(count), + singular = fmtValue === 1, + lilUnits = units[unit], + fmtUnit = narrow + ? singular + ? lilUnits[1] + : lilUnits[2] || lilUnits[1] + : singular + ? units[unit][0] + : unit; + return isInPast ? `${fmtValue} ${fmtUnit} ago` : `in ${fmtValue} ${fmtUnit}`; +} + +function stringifyTokens(splits, tokenToString) { + let s = ""; + for (const token of splits) { + if (token.literal) { + s += token.val; + } else { + s += tokenToString(token.val); + } + } + return s; +} + +const macroTokenToFormatOpts = { + D: DATE_SHORT, + DD: DATE_MED, + DDD: DATE_FULL, + DDDD: DATE_HUGE, + t: TIME_SIMPLE, + tt: TIME_WITH_SECONDS, + ttt: TIME_WITH_SHORT_OFFSET, + tttt: TIME_WITH_LONG_OFFSET, + T: TIME_24_SIMPLE, + TT: TIME_24_WITH_SECONDS, + TTT: TIME_24_WITH_SHORT_OFFSET, + TTTT: TIME_24_WITH_LONG_OFFSET, + f: DATETIME_SHORT, + ff: DATETIME_MED, + fff: DATETIME_FULL, + ffff: DATETIME_HUGE, + F: DATETIME_SHORT_WITH_SECONDS, + FF: DATETIME_MED_WITH_SECONDS, + FFF: DATETIME_FULL_WITH_SECONDS, + FFFF: DATETIME_HUGE_WITH_SECONDS, +}; + +/** + * @private + */ + +class Formatter { + static create(locale, opts = {}) { + return new Formatter(locale, opts); + } + + static parseFormat(fmt) { + // white-space is always considered a literal in user-provided formats + // the " " token has a special meaning (see unitForToken) + + let current = null, + currentFull = "", + bracketed = false; + const splits = []; + for (let i = 0; i < fmt.length; i++) { + const c = fmt.charAt(i); + if (c === "'") { + // turn '' into a literal signal quote instead of just skipping the empty literal + if (currentFull.length > 0 || bracketed) { + splits.push({ + literal: bracketed || /^\s+$/.test(currentFull), + val: currentFull === "" ? "'" : currentFull, + }); + } + current = null; + currentFull = ""; + bracketed = !bracketed; + } else if (bracketed) { + currentFull += c; + } else if (c === current) { + currentFull += c; + } else { + if (currentFull.length > 0) { + splits.push({ literal: /^\s+$/.test(currentFull), val: currentFull }); + } + currentFull = c; + current = c; + } + } + + if (currentFull.length > 0) { + splits.push({ literal: bracketed || /^\s+$/.test(currentFull), val: currentFull }); + } + + return splits; + } + + static macroTokenToFormatOpts(token) { + return macroTokenToFormatOpts[token]; + } + + constructor(locale, formatOpts) { + this.opts = formatOpts; + this.loc = locale; + this.systemLoc = null; + } + + formatWithSystemDefault(dt, opts) { + if (this.systemLoc === null) { + this.systemLoc = this.loc.redefaultToSystem(); + } + const df = this.systemLoc.dtFormatter(dt, { ...this.opts, ...opts }); + return df.format(); + } + + dtFormatter(dt, opts = {}) { + return this.loc.dtFormatter(dt, { ...this.opts, ...opts }); + } + + formatDateTime(dt, opts) { + return this.dtFormatter(dt, opts).format(); + } + + formatDateTimeParts(dt, opts) { + return this.dtFormatter(dt, opts).formatToParts(); + } + + formatInterval(interval, opts) { + const df = this.dtFormatter(interval.start, opts); + return df.dtf.formatRange(interval.start.toJSDate(), interval.end.toJSDate()); + } + + resolvedOptions(dt, opts) { + return this.dtFormatter(dt, opts).resolvedOptions(); + } + + num(n, p = 0, signDisplay = undefined) { + // we get some perf out of doing this here, annoyingly + if (this.opts.forceSimple) { + return padStart(n, p); + } + + const opts = { ...this.opts }; + + if (p > 0) { + opts.padTo = p; + } + if (signDisplay) { + opts.signDisplay = signDisplay; + } + + return this.loc.numberFormatter(opts).format(n); + } + + formatDateTimeFromString(dt, fmt) { + const knownEnglish = this.loc.listingMode() === "en", + useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== "gregory", + string = (opts, extract) => this.loc.extract(dt, opts, extract), + formatOffset = (opts) => { + if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) { + return "Z"; + } + + return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : ""; + }, + meridiem = () => + knownEnglish + ? meridiemForDateTime(dt) + : string({ hour: "numeric", hourCycle: "h12" }, "dayperiod"), + month = (length, standalone) => + knownEnglish + ? monthForDateTime(dt, length) + : string(standalone ? { month: length } : { month: length, day: "numeric" }, "month"), + weekday = (length, standalone) => + knownEnglish + ? weekdayForDateTime(dt, length) + : string( + standalone ? { weekday: length } : { weekday: length, month: "long", day: "numeric" }, + "weekday" + ), + maybeMacro = (token) => { + const formatOpts = Formatter.macroTokenToFormatOpts(token); + if (formatOpts) { + return this.formatWithSystemDefault(dt, formatOpts); + } else { + return token; + } + }, + era = (length) => + knownEnglish ? eraForDateTime(dt, length) : string({ era: length }, "era"), + tokenToString = (token) => { + // Where possible: https://cldr.unicode.org/translation/date-time/date-time-symbols + switch (token) { + // ms + case "S": + return this.num(dt.millisecond); + case "u": + // falls through + case "SSS": + return this.num(dt.millisecond, 3); + // seconds + case "s": + return this.num(dt.second); + case "ss": + return this.num(dt.second, 2); + // fractional seconds + case "uu": + return this.num(Math.floor(dt.millisecond / 10), 2); + case "uuu": + return this.num(Math.floor(dt.millisecond / 100)); + // minutes + case "m": + return this.num(dt.minute); + case "mm": + return this.num(dt.minute, 2); + // hours + case "h": + return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12); + case "hh": + return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2); + case "H": + return this.num(dt.hour); + case "HH": + return this.num(dt.hour, 2); + // offset + case "Z": + // like +6 + return formatOffset({ format: "narrow", allowZ: this.opts.allowZ }); + case "ZZ": + // like +06:00 + return formatOffset({ format: "short", allowZ: this.opts.allowZ }); + case "ZZZ": + // like +0600 + return formatOffset({ format: "techie", allowZ: this.opts.allowZ }); + case "ZZZZ": + // like EST + return dt.zone.offsetName(dt.ts, { format: "short", locale: this.loc.locale }); + case "ZZZZZ": + // like Eastern Standard Time + return dt.zone.offsetName(dt.ts, { format: "long", locale: this.loc.locale }); + // zone + case "z": + // like America/New_York + return dt.zoneName; + // meridiems + case "a": + return meridiem(); + // dates + case "d": + return useDateTimeFormatter ? string({ day: "numeric" }, "day") : this.num(dt.day); + case "dd": + return useDateTimeFormatter ? string({ day: "2-digit" }, "day") : this.num(dt.day, 2); + // weekdays - standalone + case "c": + // like 1 + return this.num(dt.weekday); + case "ccc": + // like 'Tues' + return weekday("short", true); + case "cccc": + // like 'Tuesday' + return weekday("long", true); + case "ccccc": + // like 'T' + return weekday("narrow", true); + // weekdays - format + case "E": + // like 1 + return this.num(dt.weekday); + case "EEE": + // like 'Tues' + return weekday("short", false); + case "EEEE": + // like 'Tuesday' + return weekday("long", false); + case "EEEEE": + // like 'T' + return weekday("narrow", false); + // months - standalone + case "L": + // like 1 + return useDateTimeFormatter + ? string({ month: "numeric", day: "numeric" }, "month") + : this.num(dt.month); + case "LL": + // like 01, doesn't seem to work + return useDateTimeFormatter + ? string({ month: "2-digit", day: "numeric" }, "month") + : this.num(dt.month, 2); + case "LLL": + // like Jan + return month("short", true); + case "LLLL": + // like January + return month("long", true); + case "LLLLL": + // like J + return month("narrow", true); + // months - format + case "M": + // like 1 + return useDateTimeFormatter + ? string({ month: "numeric" }, "month") + : this.num(dt.month); + case "MM": + // like 01 + return useDateTimeFormatter + ? string({ month: "2-digit" }, "month") + : this.num(dt.month, 2); + case "MMM": + // like Jan + return month("short", false); + case "MMMM": + // like January + return month("long", false); + case "MMMMM": + // like J + return month("narrow", false); + // years + case "y": + // like 2014 + return useDateTimeFormatter ? string({ year: "numeric" }, "year") : this.num(dt.year); + case "yy": + // like 14 + return useDateTimeFormatter + ? string({ year: "2-digit" }, "year") + : this.num(dt.year.toString().slice(-2), 2); + case "yyyy": + // like 0012 + return useDateTimeFormatter + ? string({ year: "numeric" }, "year") + : this.num(dt.year, 4); + case "yyyyyy": + // like 000012 + return useDateTimeFormatter + ? string({ year: "numeric" }, "year") + : this.num(dt.year, 6); + // eras + case "G": + // like AD + return era("short"); + case "GG": + // like Anno Domini + return era("long"); + case "GGGGG": + return era("narrow"); + case "kk": + return this.num(dt.weekYear.toString().slice(-2), 2); + case "kkkk": + return this.num(dt.weekYear, 4); + case "W": + return this.num(dt.weekNumber); + case "WW": + return this.num(dt.weekNumber, 2); + case "n": + return this.num(dt.localWeekNumber); + case "nn": + return this.num(dt.localWeekNumber, 2); + case "ii": + return this.num(dt.localWeekYear.toString().slice(-2), 2); + case "iiii": + return this.num(dt.localWeekYear, 4); + case "o": + return this.num(dt.ordinal); + case "ooo": + return this.num(dt.ordinal, 3); + case "q": + // like 1 + return this.num(dt.quarter); + case "qq": + // like 01 + return this.num(dt.quarter, 2); + case "X": + return this.num(Math.floor(dt.ts / 1000)); + case "x": + return this.num(dt.ts); + default: + return maybeMacro(token); + } + }; + + return stringifyTokens(Formatter.parseFormat(fmt), tokenToString); + } + + formatDurationFromString(dur, fmt) { + const invertLargest = this.opts.signMode === "negativeLargestOnly" ? -1 : 1; + const tokenToField = (token) => { + switch (token[0]) { + case "S": + return "milliseconds"; + case "s": + return "seconds"; + case "m": + return "minutes"; + case "h": + return "hours"; + case "d": + return "days"; + case "w": + return "weeks"; + case "M": + return "months"; + case "y": + return "years"; + default: + return null; + } + }, + tokenToString = (lildur, info) => (token) => { + const mapped = tokenToField(token); + if (mapped) { + const inversionFactor = + info.isNegativeDuration && mapped !== info.largestUnit ? invertLargest : 1; + let signDisplay; + if (this.opts.signMode === "negativeLargestOnly" && mapped !== info.largestUnit) { + signDisplay = "never"; + } else if (this.opts.signMode === "all") { + signDisplay = "always"; + } else { + // "auto" and "negative" are the same, but "auto" has better support + signDisplay = "auto"; + } + return this.num(lildur.get(mapped) * inversionFactor, token.length, signDisplay); + } else { + return token; + } + }, + tokens = Formatter.parseFormat(fmt), + realTokens = tokens.reduce( + (found, { literal, val }) => (literal ? found : found.concat(val)), + [] + ), + collapsed = dur.shiftTo(...realTokens.map(tokenToField).filter((t) => t)), + durationInfo = { + isNegativeDuration: collapsed < 0, + // this relies on "collapsed" being based on "shiftTo", which builds up the object + // in order + largestUnit: Object.keys(collapsed.values)[0], + }; + return stringifyTokens(tokens, tokenToString(collapsed, durationInfo)); + } +} + +/* + * This file handles parsing for well-specified formats. Here's how it works: + * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match. + * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object + * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence. + * Extractors can take a "cursor" representing the offset in the match to look at. This makes it easy to combine extractors. + * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions. + * Some extractions are super dumb and simpleParse and fromStrings help DRY them. + */ + +const ianaRegex = /[A-Za-z_+-]{1,256}(?::?\/[A-Za-z0-9_+-]{1,256}(?:\/[A-Za-z0-9_+-]{1,256})?)?/; + +function combineRegexes(...regexes) { + const full = regexes.reduce((f, r) => f + r.source, ""); + return RegExp(`^${full}$`); +} + +function combineExtractors(...extractors) { + return (m) => + extractors + .reduce( + ([mergedVals, mergedZone, cursor], ex) => { + const [val, zone, next] = ex(m, cursor); + return [{ ...mergedVals, ...val }, zone || mergedZone, next]; + }, + [{}, null, 1] + ) + .slice(0, 2); +} + +function parse(s, ...patterns) { + if (s == null) { + return [null, null]; + } + + for (const [regex, extractor] of patterns) { + const m = regex.exec(s); + if (m) { + return extractor(m); + } + } + return [null, null]; +} + +function simpleParse(...keys) { + return (match, cursor) => { + const ret = {}; + let i; + + for (i = 0; i < keys.length; i++) { + ret[keys[i]] = parseInteger(match[cursor + i]); + } + return [ret, null, cursor + i]; + }; +} + +// ISO and SQL parsing +const offsetRegex = /(?:([Zz])|([+-]\d\d)(?::?(\d\d))?)/; +const isoExtendedZone = `(?:${offsetRegex.source}?(?:\\[(${ianaRegex.source})\\])?)?`; +const isoTimeBaseRegex = /(\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,30}))?)?)?/; +const isoTimeRegex = RegExp(`${isoTimeBaseRegex.source}${isoExtendedZone}`); +const isoTimeExtensionRegex = RegExp(`(?:[Tt]${isoTimeRegex.source})?`); +const isoYmdRegex = /([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/; +const isoWeekRegex = /(\d{4})-?W(\d\d)(?:-?(\d))?/; +const isoOrdinalRegex = /(\d{4})-?(\d{3})/; +const extractISOWeekData = simpleParse("weekYear", "weekNumber", "weekDay"); +const extractISOOrdinalData = simpleParse("year", "ordinal"); +const sqlYmdRegex = /(\d{4})-(\d\d)-(\d\d)/; // dumbed-down version of the ISO one +const sqlTimeRegex = RegExp( + `${isoTimeBaseRegex.source} ?(?:${offsetRegex.source}|(${ianaRegex.source}))?` +); +const sqlTimeExtensionRegex = RegExp(`(?: ${sqlTimeRegex.source})?`); + +function int(match, pos, fallback) { + const m = match[pos]; + return isUndefined(m) ? fallback : parseInteger(m); +} + +function extractISOYmd(match, cursor) { + const item = { + year: int(match, cursor), + month: int(match, cursor + 1, 1), + day: int(match, cursor + 2, 1), + }; + + return [item, null, cursor + 3]; +} + +function extractISOTime(match, cursor) { + const item = { + hours: int(match, cursor, 0), + minutes: int(match, cursor + 1, 0), + seconds: int(match, cursor + 2, 0), + milliseconds: parseMillis(match[cursor + 3]), + }; + + return [item, null, cursor + 4]; +} + +function extractISOOffset(match, cursor) { + const local = !match[cursor] && !match[cursor + 1], + fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]), + zone = local ? null : FixedOffsetZone.instance(fullOffset); + return [{}, zone, cursor + 3]; +} + +function extractIANAZone(match, cursor) { + const zone = match[cursor] ? IANAZone.create(match[cursor]) : null; + return [{}, zone, cursor + 1]; +} + +// ISO time parsing + +const isoTimeOnly = RegExp(`^T?${isoTimeBaseRegex.source}$`); + +// ISO duration parsing + +const isoDuration = + /^-?P(?:(?:(-?\d{1,20}(?:\.\d{1,20})?)Y)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20}(?:\.\d{1,20})?)W)?(?:(-?\d{1,20}(?:\.\d{1,20})?)D)?(?:T(?:(-?\d{1,20}(?:\.\d{1,20})?)H)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20})(?:[.,](-?\d{1,20}))?S)?)?)$/; + +function extractISODuration(match) { + const [s, yearStr, monthStr, weekStr, dayStr, hourStr, minuteStr, secondStr, millisecondsStr] = + match; + + const hasNegativePrefix = s[0] === "-"; + const negativeSeconds = secondStr && secondStr[0] === "-"; + + const maybeNegate = (num, force = false) => + num !== undefined && (force || (num && hasNegativePrefix)) ? -num : num; + + return [ + { + years: maybeNegate(parseFloating(yearStr)), + months: maybeNegate(parseFloating(monthStr)), + weeks: maybeNegate(parseFloating(weekStr)), + days: maybeNegate(parseFloating(dayStr)), + hours: maybeNegate(parseFloating(hourStr)), + minutes: maybeNegate(parseFloating(minuteStr)), + seconds: maybeNegate(parseFloating(secondStr), secondStr === "-0"), + milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds), + }, + ]; +} + +// These are a little braindead. EDT *should* tell us that we're in, say, America/New_York +// and not just that we're in -240 *right now*. But since I don't think these are used that often +// I'm just going to ignore that +const obsOffsets = { + GMT: 0, + EDT: -4 * 60, + EST: -5 * 60, + CDT: -5 * 60, + CST: -6 * 60, + MDT: -6 * 60, + MST: -7 * 60, + PDT: -7 * 60, + PST: -8 * 60, +}; + +function fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { + const result = { + year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr), + month: monthsShort.indexOf(monthStr) + 1, + day: parseInteger(dayStr), + hour: parseInteger(hourStr), + minute: parseInteger(minuteStr), + }; + + if (secondStr) result.second = parseInteger(secondStr); + if (weekdayStr) { + result.weekday = + weekdayStr.length > 3 + ? weekdaysLong.indexOf(weekdayStr) + 1 + : weekdaysShort.indexOf(weekdayStr) + 1; + } + + return result; +} + +// RFC 2822/5322 +const rfc2822 = + /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/; + +function extractRFC2822(match) { + const [ + , + weekdayStr, + dayStr, + monthStr, + yearStr, + hourStr, + minuteStr, + secondStr, + obsOffset, + milOffset, + offHourStr, + offMinuteStr, + ] = match, + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + + let offset; + if (obsOffset) { + offset = obsOffsets[obsOffset]; + } else if (milOffset) { + offset = 0; + } else { + offset = signedOffset(offHourStr, offMinuteStr); + } + + return [result, new FixedOffsetZone(offset)]; +} + +function preprocessRFC2822(s) { + // Remove comments and folding whitespace and replace multiple-spaces with a single space + return s + .replace(/\([^()]*\)|[\n\t]/g, " ") + .replace(/(\s\s+)/g, " ") + .trim(); +} + +// http date + +const rfc1123 = + /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/, + rfc850 = + /^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/, + ascii = + /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/; + +function extractRFC1123Or850(match) { + const [, weekdayStr, dayStr, monthStr, yearStr, hourStr, minuteStr, secondStr] = match, + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + return [result, FixedOffsetZone.utcInstance]; +} + +function extractASCII(match) { + const [, weekdayStr, monthStr, dayStr, hourStr, minuteStr, secondStr, yearStr] = match, + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + return [result, FixedOffsetZone.utcInstance]; +} + +const isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex); +const isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex); +const isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex); +const isoTimeCombinedRegex = combineRegexes(isoTimeRegex); + +const extractISOYmdTimeAndOffset = combineExtractors( + extractISOYmd, + extractISOTime, + extractISOOffset, + extractIANAZone +); +const extractISOWeekTimeAndOffset = combineExtractors( + extractISOWeekData, + extractISOTime, + extractISOOffset, + extractIANAZone +); +const extractISOOrdinalDateAndTime = combineExtractors( + extractISOOrdinalData, + extractISOTime, + extractISOOffset, + extractIANAZone +); +const extractISOTimeAndOffset = combineExtractors( + extractISOTime, + extractISOOffset, + extractIANAZone +); + +/* + * @private + */ + +function parseISODate(s) { + return parse( + s, + [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], + [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset], + [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime], + [isoTimeCombinedRegex, extractISOTimeAndOffset] + ); +} + +function parseRFC2822Date(s) { + return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]); +} + +function parseHTTPDate(s) { + return parse( + s, + [rfc1123, extractRFC1123Or850], + [rfc850, extractRFC1123Or850], + [ascii, extractASCII] + ); +} + +function parseISODuration(s) { + return parse(s, [isoDuration, extractISODuration]); +} + +const extractISOTimeOnly = combineExtractors(extractISOTime); + +function parseISOTimeOnly(s) { + return parse(s, [isoTimeOnly, extractISOTimeOnly]); +} + +const sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex); +const sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex); + +const extractISOTimeOffsetAndIANAZone = combineExtractors( + extractISOTime, + extractISOOffset, + extractIANAZone +); + +function parseSQL(s) { + return parse( + s, + [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], + [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone] + ); +} + +const INVALID$2 = "Invalid Duration"; + +// unit conversion constants +const lowOrderMatrix = { + weeks: { + days: 7, + hours: 7 * 24, + minutes: 7 * 24 * 60, + seconds: 7 * 24 * 60 * 60, + milliseconds: 7 * 24 * 60 * 60 * 1000, + }, + days: { + hours: 24, + minutes: 24 * 60, + seconds: 24 * 60 * 60, + milliseconds: 24 * 60 * 60 * 1000, + }, + hours: { minutes: 60, seconds: 60 * 60, milliseconds: 60 * 60 * 1000 }, + minutes: { seconds: 60, milliseconds: 60 * 1000 }, + seconds: { milliseconds: 1000 }, + }, + casualMatrix = { + years: { + quarters: 4, + months: 12, + weeks: 52, + days: 365, + hours: 365 * 24, + minutes: 365 * 24 * 60, + seconds: 365 * 24 * 60 * 60, + milliseconds: 365 * 24 * 60 * 60 * 1000, + }, + quarters: { + months: 3, + weeks: 13, + days: 91, + hours: 91 * 24, + minutes: 91 * 24 * 60, + seconds: 91 * 24 * 60 * 60, + milliseconds: 91 * 24 * 60 * 60 * 1000, + }, + months: { + weeks: 4, + days: 30, + hours: 30 * 24, + minutes: 30 * 24 * 60, + seconds: 30 * 24 * 60 * 60, + milliseconds: 30 * 24 * 60 * 60 * 1000, + }, + + ...lowOrderMatrix, + }, + daysInYearAccurate = 146097.0 / 400, + daysInMonthAccurate = 146097.0 / 4800, + accurateMatrix = { + years: { + quarters: 4, + months: 12, + weeks: daysInYearAccurate / 7, + days: daysInYearAccurate, + hours: daysInYearAccurate * 24, + minutes: daysInYearAccurate * 24 * 60, + seconds: daysInYearAccurate * 24 * 60 * 60, + milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000, + }, + quarters: { + months: 3, + weeks: daysInYearAccurate / 28, + days: daysInYearAccurate / 4, + hours: (daysInYearAccurate * 24) / 4, + minutes: (daysInYearAccurate * 24 * 60) / 4, + seconds: (daysInYearAccurate * 24 * 60 * 60) / 4, + milliseconds: (daysInYearAccurate * 24 * 60 * 60 * 1000) / 4, + }, + months: { + weeks: daysInMonthAccurate / 7, + days: daysInMonthAccurate, + hours: daysInMonthAccurate * 24, + minutes: daysInMonthAccurate * 24 * 60, + seconds: daysInMonthAccurate * 24 * 60 * 60, + milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000, + }, + ...lowOrderMatrix, + }; + +// units ordered by size +const orderedUnits$1 = [ + "years", + "quarters", + "months", + "weeks", + "days", + "hours", + "minutes", + "seconds", + "milliseconds", +]; + +const reverseUnits = orderedUnits$1.slice(0).reverse(); + +// clone really means "create another instance just like this one, but with these changes" +function clone$1(dur, alts, clear = false) { + // deep merge for vals + const conf = { + values: clear ? alts.values : { ...dur.values, ...(alts.values || {}) }, + loc: dur.loc.clone(alts.loc), + conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy, + matrix: alts.matrix || dur.matrix, + }; + return new Duration(conf); +} + +function durationToMillis(matrix, vals) { + let sum = vals.milliseconds ?? 0; + for (const unit of reverseUnits.slice(1)) { + if (vals[unit]) { + sum += vals[unit] * matrix[unit]["milliseconds"]; + } + } + return sum; +} + +// NB: mutates parameters +function normalizeValues(matrix, vals) { + // the logic below assumes the overall value of the duration is positive + // if this is not the case, factor is used to make it so + const factor = durationToMillis(matrix, vals) < 0 ? -1 : 1; + + orderedUnits$1.reduceRight((previous, current) => { + if (!isUndefined(vals[current])) { + if (previous) { + const previousVal = vals[previous] * factor; + const conv = matrix[current][previous]; + + // if (previousVal < 0): + // lower order unit is negative (e.g. { years: 2, days: -2 }) + // normalize this by reducing the higher order unit by the appropriate amount + // and increasing the lower order unit + // this can never make the higher order unit negative, because this function only operates + // on positive durations, so the amount of time represented by the lower order unit cannot + // be larger than the higher order unit + // else: + // lower order unit is positive (e.g. { years: 2, days: 450 } or { years: -2, days: 450 }) + // in this case we attempt to convert as much as possible from the lower order unit into + // the higher order one + // + // Math.floor takes care of both of these cases, rounding away from 0 + // if previousVal < 0 it makes the absolute value larger + // if previousVal >= it makes the absolute value smaller + const rollUp = Math.floor(previousVal / conv); + vals[current] += rollUp * factor; + vals[previous] -= rollUp * conv * factor; + } + return current; + } else { + return previous; + } + }, null); + + // try to convert any decimals into smaller units if possible + // for example for { years: 2.5, days: 0, seconds: 0 } we want to get { years: 2, days: 182, hours: 12 } + orderedUnits$1.reduce((previous, current) => { + if (!isUndefined(vals[current])) { + if (previous) { + const fraction = vals[previous] % 1; + vals[previous] -= fraction; + vals[current] += fraction * matrix[previous][current]; + } + return current; + } else { + return previous; + } + }, null); +} + +// Remove all properties with a value of 0 from an object +function removeZeroes(vals) { + const newVals = {}; + for (const [key, value] of Object.entries(vals)) { + if (value !== 0) { + newVals[key] = value; + } + } + return newVals; +} + +/** + * A Duration object represents a period of time, like "2 months" or "1 day, 1 hour". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime#plus} to add a Duration object to a DateTime, producing another DateTime. + * + * Here is a brief overview of commonly used methods and getters in Duration: + * + * * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}. + * * **Unit values** See the {@link Duration#years}, {@link Duration#months}, {@link Duration#weeks}, {@link Duration#days}, {@link Duration#hours}, {@link Duration#minutes}, {@link Duration#seconds}, {@link Duration#milliseconds} accessors. + * * **Configuration** See {@link Duration#locale} and {@link Duration#numberingSystem} accessors. + * * **Transformation** To create new Durations out of old ones use {@link Duration#plus}, {@link Duration#minus}, {@link Duration#normalize}, {@link Duration#set}, {@link Duration#reconfigure}, {@link Duration#shiftTo}, and {@link Duration#negate}. + * * **Output** To convert the Duration into other representations, see {@link Duration#as}, {@link Duration#toISO}, {@link Duration#toFormat}, and {@link Duration#toJSON} + * + * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation. + */ +class Duration { + /** + * @private + */ + constructor(config) { + const accurate = config.conversionAccuracy === "longterm" || false; + let matrix = accurate ? accurateMatrix : casualMatrix; + + if (config.matrix) { + matrix = config.matrix; + } + + /** + * @access private + */ + this.values = config.values; + /** + * @access private + */ + this.loc = config.loc || Locale.create(); + /** + * @access private + */ + this.conversionAccuracy = accurate ? "longterm" : "casual"; + /** + * @access private + */ + this.invalid = config.invalid || null; + /** + * @access private + */ + this.matrix = matrix; + /** + * @access private + */ + this.isLuxonDuration = true; + } + + /** + * Create Duration from a number of milliseconds. + * @param {number} count of milliseconds + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @return {Duration} + */ + static fromMillis(count, opts) { + return Duration.fromObject({ milliseconds: count }, opts); + } + + /** + * Create a Duration from a JavaScript object with keys like 'years' and 'hours'. + * If this object is empty then a zero milliseconds duration is returned. + * @param {Object} obj - the object to create the DateTime from + * @param {number} obj.years + * @param {number} obj.quarters + * @param {number} obj.months + * @param {number} obj.weeks + * @param {number} obj.days + * @param {number} obj.hours + * @param {number} obj.minutes + * @param {number} obj.seconds + * @param {number} obj.milliseconds + * @param {Object} [opts=[]] - options for creating this Duration + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the custom conversion system to use + * @return {Duration} + */ + static fromObject(obj, opts = {}) { + if (obj == null || typeof obj !== "object") { + throw new InvalidArgumentError( + `Duration.fromObject: argument expected to be an object, got ${ + obj === null ? "null" : typeof obj + }` + ); + } + + return new Duration({ + values: normalizeObject(obj, Duration.normalizeUnit), + loc: Locale.fromObject(opts), + conversionAccuracy: opts.conversionAccuracy, + matrix: opts.matrix, + }); + } + + /** + * Create a Duration from DurationLike. + * + * @param {Object | number | Duration} durationLike + * One of: + * - object with keys like 'years' and 'hours'. + * - number representing milliseconds + * - Duration instance + * @return {Duration} + */ + static fromDurationLike(durationLike) { + if (isNumber(durationLike)) { + return Duration.fromMillis(durationLike); + } else if (Duration.isDuration(durationLike)) { + return durationLike; + } else if (typeof durationLike === "object") { + return Duration.fromObject(durationLike); + } else { + throw new InvalidArgumentError( + `Unknown duration argument ${durationLike} of type ${typeof durationLike}` + ); + } + } + + /** + * Create a Duration from an ISO 8601 duration string. + * @param {string} text - text to parse + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the preset conversion system to use + * @see https://en.wikipedia.org/wiki/ISO_8601#Durations + * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 } + * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 } + * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 } + * @return {Duration} + */ + static fromISO(text, opts) { + const [parsed] = parseISODuration(text); + if (parsed) { + return Duration.fromObject(parsed, opts); + } else { + return Duration.invalid("unparsable", `the input "${text}" can't be parsed as ISO 8601`); + } + } + + /** + * Create a Duration from an ISO 8601 time string. + * @param {string} text - text to parse + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the conversion system to use + * @see https://en.wikipedia.org/wiki/ISO_8601#Times + * @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 } + * @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @return {Duration} + */ + static fromISOTime(text, opts) { + const [parsed] = parseISOTimeOnly(text); + if (parsed) { + return Duration.fromObject(parsed, opts); + } else { + return Duration.invalid("unparsable", `the input "${text}" can't be parsed as ISO 8601`); + } + } + + /** + * Create an invalid Duration. + * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {Duration} + */ + static invalid(reason, explanation = null) { + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the Duration is invalid"); + } + + const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + + if (Settings.throwOnInvalid) { + throw new InvalidDurationError(invalid); + } else { + return new Duration({ invalid }); + } + } + + /** + * @private + */ + static normalizeUnit(unit) { + const normalized = { + year: "years", + years: "years", + quarter: "quarters", + quarters: "quarters", + month: "months", + months: "months", + week: "weeks", + weeks: "weeks", + day: "days", + days: "days", + hour: "hours", + hours: "hours", + minute: "minutes", + minutes: "minutes", + second: "seconds", + seconds: "seconds", + millisecond: "milliseconds", + milliseconds: "milliseconds", + }[unit ? unit.toLowerCase() : unit]; + + if (!normalized) throw new InvalidUnitError(unit); + + return normalized; + } + + /** + * Check if an object is a Duration. Works across context boundaries + * @param {object} o + * @return {boolean} + */ + static isDuration(o) { + return (o && o.isLuxonDuration) || false; + } + + /** + * Get the locale of a Duration, such 'en-GB' + * @type {string} + */ + get locale() { + return this.isValid ? this.loc.locale : null; + } + + /** + * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration + * + * @type {string} + */ + get numberingSystem() { + return this.isValid ? this.loc.numberingSystem : null; + } + + /** + * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens: + * * `S` for milliseconds + * * `s` for seconds + * * `m` for minutes + * * `h` for hours + * * `d` for days + * * `w` for weeks + * * `M` for months + * * `y` for years + * Notes: + * * Add padding by repeating the token, e.g. "yy" pads the years to two digits, "hhhh" pads the hours out to four digits + * * Tokens can be escaped by wrapping with single quotes. + * * The duration will be converted to the set of units in the format string using {@link Duration#shiftTo} and the Durations's conversion accuracy setting. + * @param {string} fmt - the format string + * @param {Object} opts - options + * @param {boolean} [opts.floor=true] - floor numerical values + * @param {'negative'|'all'|'negativeLargestOnly'} [opts.signMode=negative] - How to handle signs + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("y d s") //=> "1 6 2" + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("yy dd sss") //=> "01 06 002" + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("M S") //=> "12 518402000" + * @example Duration.fromObject({ days: 6, seconds: 2 }).toFormat("d s", { signMode: "all" }) //=> "+6 +2" + * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat("d s", { signMode: "all" }) //=> "-6 -2" + * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat("d s", { signMode: "negativeLargestOnly" }) //=> "-6 2" + * @return {string} + */ + toFormat(fmt, opts = {}) { + // reverse-compat since 1.2; we always round down now, never up, and we do it by default + const fmtOpts = { + ...opts, + floor: opts.round !== false && opts.floor !== false, + }; + return this.isValid + ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt) + : INVALID$2; + } + + /** + * Returns a string representation of a Duration with all units included. + * To modify its behavior, use `listStyle` and any Intl.NumberFormat option, though `unitDisplay` is especially relevant. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options + * @param {Object} opts - Formatting options. Accepts the same keys as the options parameter of the native `Intl.NumberFormat` constructor, as well as `listStyle`. + * @param {string} [opts.listStyle='narrow'] - How to format the merged list. Corresponds to the `style` property of the options parameter of the native `Intl.ListFormat` constructor. + * @param {boolean} [opts.showZeros=true] - Show all units previously used by the duration even if they are zero + * @example + * ```js + * var dur = Duration.fromObject({ months: 1, weeks: 0, hours: 5, minutes: 6 }) + * dur.toHuman() //=> '1 month, 0 weeks, 5 hours, 6 minutes' + * dur.toHuman({ listStyle: "long" }) //=> '1 month, 0 weeks, 5 hours, and 6 minutes' + * dur.toHuman({ unitDisplay: "short" }) //=> '1 mth, 0 wks, 5 hr, 6 min' + * dur.toHuman({ showZeros: false }) //=> '1 month, 5 hours, 6 minutes' + * ``` + */ + toHuman(opts = {}) { + if (!this.isValid) return INVALID$2; + + const showZeros = opts.showZeros !== false; + + const l = orderedUnits$1 + .map((unit) => { + const val = this.values[unit]; + if (isUndefined(val) || (val === 0 && !showZeros)) { + return null; + } + return this.loc + .numberFormatter({ style: "unit", unitDisplay: "long", ...opts, unit: unit.slice(0, -1) }) + .format(val); + }) + .filter((n) => n); + + return this.loc + .listFormatter({ type: "conjunction", style: opts.listStyle || "narrow", ...opts }) + .format(l); + } + + /** + * Returns a JavaScript object with this Duration's values. + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 } + * @return {Object} + */ + toObject() { + if (!this.isValid) return {}; + return { ...this.values }; + } + + /** + * Returns an ISO 8601-compliant string representation of this Duration. + * @see https://en.wikipedia.org/wiki/ISO_8601#Durations + * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S' + * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S' + * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M' + * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M' + * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S' + * @return {string} + */ + toISO() { + // we could use the formatter, but this is an easier way to get the minimum string + if (!this.isValid) return null; + + let s = "P"; + if (this.years !== 0) s += this.years + "Y"; + if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + "M"; + if (this.weeks !== 0) s += this.weeks + "W"; + if (this.days !== 0) s += this.days + "D"; + if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0) + s += "T"; + if (this.hours !== 0) s += this.hours + "H"; + if (this.minutes !== 0) s += this.minutes + "M"; + if (this.seconds !== 0 || this.milliseconds !== 0) + // this will handle "floating point madness" by removing extra decimal places + // https://stackoverflow.com/questions/588004/is-floating-point-math-broken + s += roundTo(this.seconds + this.milliseconds / 1000, 3) + "S"; + if (s === "P") s += "T0S"; + return s; + } + + /** + * Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day. + * Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours. + * @see https://en.wikipedia.org/wiki/ISO_8601#Times + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includePrefix=false] - include the `T` prefix + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000' + * @return {string} + */ + toISOTime(opts = {}) { + if (!this.isValid) return null; + + const millis = this.toMillis(); + if (millis < 0 || millis >= 86400000) return null; + + opts = { + suppressMilliseconds: false, + suppressSeconds: false, + includePrefix: false, + format: "extended", + ...opts, + includeOffset: false, + }; + + const dateTime = DateTime.fromMillis(millis, { zone: "UTC" }); + return dateTime.toISOTime(opts); + } + + /** + * Returns an ISO 8601 representation of this Duration appropriate for use in JSON. + * @return {string} + */ + toJSON() { + return this.toISO(); + } + + /** + * Returns an ISO 8601 representation of this Duration appropriate for use in debugging. + * @return {string} + */ + toString() { + return this.toISO(); + } + + /** + * Returns a string representation of this Duration appropriate for the REPL. + * @return {string} + */ + [Symbol.for("nodejs.util.inspect.custom")]() { + if (this.isValid) { + return `Duration { values: ${JSON.stringify(this.values)} }`; + } else { + return `Duration { Invalid, reason: ${this.invalidReason} }`; + } + } + + /** + * Returns an milliseconds value of this Duration. + * @return {number} + */ + toMillis() { + if (!this.isValid) return NaN; + + return durationToMillis(this.matrix, this.values); + } + + /** + * Returns an milliseconds value of this Duration. Alias of {@link toMillis} + * @return {number} + */ + valueOf() { + return this.toMillis(); + } + + /** + * Make this Duration longer by the specified amount. Return a newly-constructed Duration. + * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @return {Duration} + */ + plus(duration) { + if (!this.isValid) return this; + + const dur = Duration.fromDurationLike(duration), + result = {}; + + for (const k of orderedUnits$1) { + if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) { + result[k] = dur.get(k) + this.get(k); + } + } + + return clone$1(this, { values: result }, true); + } + + /** + * Make this Duration shorter by the specified amount. Return a newly-constructed Duration. + * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @return {Duration} + */ + minus(duration) { + if (!this.isValid) return this; + + const dur = Duration.fromDurationLike(duration); + return this.plus(dur.negate()); + } + + /** + * Scale this Duration by the specified amount. Return a newly-constructed Duration. + * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number. + * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits(x => x * 2) //=> { hours: 2, minutes: 60 } + * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits((x, u) => u === "hours" ? x * 2 : x) //=> { hours: 2, minutes: 30 } + * @return {Duration} + */ + mapUnits(fn) { + if (!this.isValid) return this; + const result = {}; + for (const k of Object.keys(this.values)) { + result[k] = asNumber(fn(this.values[k], k)); + } + return clone$1(this, { values: result }, true); + } + + /** + * Get the value of unit. + * @param {string} unit - a unit such as 'minute' or 'day' + * @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2 + * @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0 + * @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3 + * @return {number} + */ + get(unit) { + return this[Duration.normalizeUnit(unit)]; + } + + /** + * "Set" the values of specified units. Return a newly-constructed Duration. + * @param {Object} values - a mapping of units to numbers + * @example dur.set({ years: 2017 }) + * @example dur.set({ hours: 8, minutes: 30 }) + * @return {Duration} + */ + set(values) { + if (!this.isValid) return this; + + const mixed = { ...this.values, ...normalizeObject(values, Duration.normalizeUnit) }; + return clone$1(this, { values: mixed }); + } + + /** + * "Set" the locale and/or numberingSystem. Returns a newly-constructed Duration. + * @example dur.reconfigure({ locale: 'en-GB' }) + * @return {Duration} + */ + reconfigure({ locale, numberingSystem, conversionAccuracy, matrix } = {}) { + const loc = this.loc.clone({ locale, numberingSystem }); + const opts = { loc, matrix, conversionAccuracy }; + return clone$1(this, opts); + } + + /** + * Return the length of the duration in the specified unit. + * @param {string} unit - a unit such as 'minutes' or 'days' + * @example Duration.fromObject({years: 1}).as('days') //=> 365 + * @example Duration.fromObject({years: 1}).as('months') //=> 12 + * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5 + * @return {number} + */ + as(unit) { + return this.isValid ? this.shiftTo(unit).get(unit) : NaN; + } + + /** + * Reduce this Duration to its canonical representation in its current units. + * Assuming the overall value of the Duration is positive, this means: + * - excessive values for lower-order units are converted to higher-order units (if possible, see first and second example) + * - negative lower-order units are converted to higher order units (there must be such a higher order unit, otherwise + * the overall value would be negative, see third example) + * - fractional values for higher-order units are converted to lower-order units (if possible, see fourth example) + * + * If the overall value is negative, the result of this method is equivalent to `this.negate().normalize().negate()`. + * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 } + * @example Duration.fromObject({ days: 5000 }).normalize().toObject() //=> { days: 5000 } + * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 } + * @example Duration.fromObject({ years: 2.5, days: 0, hours: 0 }).normalize().toObject() //=> { years: 2, days: 182, hours: 12 } + * @return {Duration} + */ + normalize() { + if (!this.isValid) return this; + const vals = this.toObject(); + normalizeValues(this.matrix, vals); + return clone$1(this, { values: vals }, true); + } + + /** + * Rescale units to its largest representation + * @example Duration.fromObject({ milliseconds: 90000 }).rescale().toObject() //=> { minutes: 1, seconds: 30 } + * @return {Duration} + */ + rescale() { + if (!this.isValid) return this; + const vals = removeZeroes(this.normalize().shiftToAll().toObject()); + return clone$1(this, { values: vals }, true); + } + + /** + * Convert this Duration into its representation in a different set of units. + * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 } + * @return {Duration} + */ + shiftTo(...units) { + if (!this.isValid) return this; + + if (units.length === 0) { + return this; + } + + units = units.map((u) => Duration.normalizeUnit(u)); + + const built = {}, + accumulated = {}, + vals = this.toObject(); + let lastUnit; + + for (const k of orderedUnits$1) { + if (units.indexOf(k) >= 0) { + lastUnit = k; + + let own = 0; + + // anything we haven't boiled down yet should get boiled to this unit + for (const ak in accumulated) { + own += this.matrix[ak][k] * accumulated[ak]; + accumulated[ak] = 0; + } + + // plus anything that's already in this unit + if (isNumber(vals[k])) { + own += vals[k]; + } + + // only keep the integer part for now in the hopes of putting any decimal part + // into a smaller unit later + const i = Math.trunc(own); + built[k] = i; + accumulated[k] = (own * 1000 - i * 1000) / 1000; + + // otherwise, keep it in the wings to boil it later + } else if (isNumber(vals[k])) { + accumulated[k] = vals[k]; + } + } + + // anything leftover becomes the decimal for the last unit + // lastUnit must be defined since units is not empty + for (const key in accumulated) { + if (accumulated[key] !== 0) { + built[lastUnit] += + key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key]; + } + } + + normalizeValues(this.matrix, built); + return clone$1(this, { values: built }, true); + } + + /** + * Shift this Duration to all available units. + * Same as shiftTo("years", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds") + * @return {Duration} + */ + shiftToAll() { + if (!this.isValid) return this; + return this.shiftTo( + "years", + "months", + "weeks", + "days", + "hours", + "minutes", + "seconds", + "milliseconds" + ); + } + + /** + * Return the negative of this Duration. + * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 } + * @return {Duration} + */ + negate() { + if (!this.isValid) return this; + const negated = {}; + for (const k of Object.keys(this.values)) { + negated[k] = this.values[k] === 0 ? 0 : -this.values[k]; + } + return clone$1(this, { values: negated }, true); + } + + /** + * Removes all units with values equal to 0 from this Duration. + * @example Duration.fromObject({ years: 2, days: 0, hours: 0, minutes: 0 }).removeZeros().toObject() //=> { years: 2 } + * @return {Duration} + */ + removeZeros() { + if (!this.isValid) return this; + const vals = removeZeroes(this.values); + return clone$1(this, { values: vals }, true); + } + + /** + * Get the years. + * @type {number} + */ + get years() { + return this.isValid ? this.values.years || 0 : NaN; + } + + /** + * Get the quarters. + * @type {number} + */ + get quarters() { + return this.isValid ? this.values.quarters || 0 : NaN; + } + + /** + * Get the months. + * @type {number} + */ + get months() { + return this.isValid ? this.values.months || 0 : NaN; + } + + /** + * Get the weeks + * @type {number} + */ + get weeks() { + return this.isValid ? this.values.weeks || 0 : NaN; + } + + /** + * Get the days. + * @type {number} + */ + get days() { + return this.isValid ? this.values.days || 0 : NaN; + } + + /** + * Get the hours. + * @type {number} + */ + get hours() { + return this.isValid ? this.values.hours || 0 : NaN; + } + + /** + * Get the minutes. + * @type {number} + */ + get minutes() { + return this.isValid ? this.values.minutes || 0 : NaN; + } + + /** + * Get the seconds. + * @return {number} + */ + get seconds() { + return this.isValid ? this.values.seconds || 0 : NaN; + } + + /** + * Get the milliseconds. + * @return {number} + */ + get milliseconds() { + return this.isValid ? this.values.milliseconds || 0 : NaN; + } + + /** + * Returns whether the Duration is invalid. Invalid durations are returned by diff operations + * on invalid DateTimes or Intervals. + * @return {boolean} + */ + get isValid() { + return this.invalid === null; + } + + /** + * Returns an error code if this Duration became invalid, or null if the Duration is valid + * @return {string} + */ + get invalidReason() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this Duration became invalid, or null if the Duration is valid + * @type {string} + */ + get invalidExplanation() { + return this.invalid ? this.invalid.explanation : null; + } + + /** + * Equality check + * Two Durations are equal iff they have the same units and the same values for each unit. + * @param {Duration} other + * @return {boolean} + */ + equals(other) { + if (!this.isValid || !other.isValid) { + return false; + } + + if (!this.loc.equals(other.loc)) { + return false; + } + + function eq(v1, v2) { + // Consider 0 and undefined as equal + if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0; + return v1 === v2; + } + + for (const u of orderedUnits$1) { + if (!eq(this.values[u], other.values[u])) { + return false; + } + } + return true; + } +} + +const INVALID$1 = "Invalid Interval"; + +// checks if the start is equal to or before the end +function validateStartEnd(start, end) { + if (!start || !start.isValid) { + return Interval.invalid("missing or invalid start"); + } else if (!end || !end.isValid) { + return Interval.invalid("missing or invalid end"); + } else if (end < start) { + return Interval.invalid( + "end before start", + `The end of an interval must be after its start, but you had start=${start.toISO()} and end=${end.toISO()}` + ); + } else { + return null; + } +} + +/** + * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them. + * + * Here is a brief overview of the most commonly used methods and getters in Interval: + * + * * **Creation** To create an Interval, use {@link Interval.fromDateTimes}, {@link Interval.after}, {@link Interval.before}, or {@link Interval.fromISO}. + * * **Accessors** Use {@link Interval#start} and {@link Interval#end} to get the start and end. + * * **Interrogation** To analyze the Interval, use {@link Interval#count}, {@link Interval#length}, {@link Interval#hasSame}, {@link Interval#contains}, {@link Interval#isAfter}, or {@link Interval#isBefore}. + * * **Transformation** To create other Intervals out of this one, use {@link Interval#set}, {@link Interval#splitAt}, {@link Interval#splitBy}, {@link Interval#divideEqually}, {@link Interval.merge}, {@link Interval.xor}, {@link Interval#union}, {@link Interval#intersection}, or {@link Interval#difference}. + * * **Comparison** To compare this Interval to another one, use {@link Interval#equals}, {@link Interval#overlaps}, {@link Interval#abutsStart}, {@link Interval#abutsEnd}, {@link Interval#engulfs} + * * **Output** To convert the Interval into other representations, see {@link Interval#toString}, {@link Interval#toLocaleString}, {@link Interval#toISO}, {@link Interval#toISODate}, {@link Interval#toISOTime}, {@link Interval#toFormat}, and {@link Interval#toDuration}. + */ +class Interval { + /** + * @private + */ + constructor(config) { + /** + * @access private + */ + this.s = config.start; + /** + * @access private + */ + this.e = config.end; + /** + * @access private + */ + this.invalid = config.invalid || null; + /** + * @access private + */ + this.isLuxonInterval = true; + } + + /** + * Create an invalid Interval. + * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {Interval} + */ + static invalid(reason, explanation = null) { + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the Interval is invalid"); + } + + const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + + if (Settings.throwOnInvalid) { + throw new InvalidIntervalError(invalid); + } else { + return new Interval({ invalid }); + } + } + + /** + * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end. + * @param {DateTime|Date|Object} start + * @param {DateTime|Date|Object} end + * @return {Interval} + */ + static fromDateTimes(start, end) { + const builtStart = friendlyDateTime(start), + builtEnd = friendlyDateTime(end); + + const validateError = validateStartEnd(builtStart, builtEnd); + + if (validateError == null) { + return new Interval({ + start: builtStart, + end: builtEnd, + }); + } else { + return validateError; + } + } + + /** + * Create an Interval from a start DateTime and a Duration to extend to. + * @param {DateTime|Date|Object} start + * @param {Duration|Object|number} duration - the length of the Interval. + * @return {Interval} + */ + static after(start, duration) { + const dur = Duration.fromDurationLike(duration), + dt = friendlyDateTime(start); + return Interval.fromDateTimes(dt, dt.plus(dur)); + } + + /** + * Create an Interval from an end DateTime and a Duration to extend backwards to. + * @param {DateTime|Date|Object} end + * @param {Duration|Object|number} duration - the length of the Interval. + * @return {Interval} + */ + static before(end, duration) { + const dur = Duration.fromDurationLike(duration), + dt = friendlyDateTime(end); + return Interval.fromDateTimes(dt.minus(dur), dt); + } + + /** + * Create an Interval from an ISO 8601 string. + * Accepts `/`, `/`, and `/` formats. + * @param {string} text - the ISO string to parse + * @param {Object} [opts] - options to pass {@link DateTime#fromISO} and optionally {@link Duration#fromISO} + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @return {Interval} + */ + static fromISO(text, opts) { + const [s, e] = (text || "").split("/", 2); + if (s && e) { + let start, startIsValid; + try { + start = DateTime.fromISO(s, opts); + startIsValid = start.isValid; + } catch (e) { + startIsValid = false; + } + + let end, endIsValid; + try { + end = DateTime.fromISO(e, opts); + endIsValid = end.isValid; + } catch (e) { + endIsValid = false; + } + + if (startIsValid && endIsValid) { + return Interval.fromDateTimes(start, end); + } + + if (startIsValid) { + const dur = Duration.fromISO(e, opts); + if (dur.isValid) { + return Interval.after(start, dur); + } + } else if (endIsValid) { + const dur = Duration.fromISO(s, opts); + if (dur.isValid) { + return Interval.before(end, dur); + } + } + } + return Interval.invalid("unparsable", `the input "${text}" can't be parsed as ISO 8601`); + } + + /** + * Check if an object is an Interval. Works across context boundaries + * @param {object} o + * @return {boolean} + */ + static isInterval(o) { + return (o && o.isLuxonInterval) || false; + } + + /** + * Returns the start of the Interval + * @type {DateTime} + */ + get start() { + return this.isValid ? this.s : null; + } + + /** + * Returns the end of the Interval. This is the first instant which is not part of the interval + * (Interval is half-open). + * @type {DateTime} + */ + get end() { + return this.isValid ? this.e : null; + } + + /** + * Returns the last DateTime included in the interval (since end is not part of the interval) + * @type {DateTime} + */ + get lastDateTime() { + return this.isValid ? (this.e ? this.e.minus(1) : null) : null; + } + + /** + * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'. + * @type {boolean} + */ + get isValid() { + return this.invalidReason === null; + } + + /** + * Returns an error code if this Interval is invalid, or null if the Interval is valid + * @type {string} + */ + get invalidReason() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this Interval became invalid, or null if the Interval is valid + * @type {string} + */ + get invalidExplanation() { + return this.invalid ? this.invalid.explanation : null; + } + + /** + * Returns the length of the Interval in the specified unit. + * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in. + * @return {number} + */ + length(unit = "milliseconds") { + return this.isValid ? this.toDuration(...[unit]).get(unit) : NaN; + } + + /** + * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part. + * Unlike {@link Interval#length} this counts sections of the calendar, not periods of time, e.g. specifying 'day' + * asks 'what dates are included in this interval?', not 'how many days long is this interval?' + * @param {string} [unit='milliseconds'] - the unit of time to count. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; this operation will always use the locale of the start DateTime + * @return {number} + */ + count(unit = "milliseconds", opts) { + if (!this.isValid) return NaN; + const start = this.start.startOf(unit, opts); + let end; + if (opts?.useLocaleWeeks) { + end = this.end.reconfigure({ locale: start.locale }); + } else { + end = this.end; + } + end = end.startOf(unit, opts); + return Math.floor(end.diff(start, unit).get(unit)) + (end.valueOf() !== this.end.valueOf()); + } + + /** + * Returns whether this Interval's start and end are both in the same unit of time + * @param {string} unit - the unit of time to check sameness on + * @return {boolean} + */ + hasSame(unit) { + return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false; + } + + /** + * Return whether this Interval has the same start and end DateTimes. + * @return {boolean} + */ + isEmpty() { + return this.s.valueOf() === this.e.valueOf(); + } + + /** + * Return whether this Interval's start is after the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */ + isAfter(dateTime) { + if (!this.isValid) return false; + return this.s > dateTime; + } + + /** + * Return whether this Interval's end is before the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */ + isBefore(dateTime) { + if (!this.isValid) return false; + return this.e <= dateTime; + } + + /** + * Return whether this Interval contains the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */ + contains(dateTime) { + if (!this.isValid) return false; + return this.s <= dateTime && this.e > dateTime; + } + + /** + * "Sets" the start and/or end dates. Returns a newly-constructed Interval. + * @param {Object} values - the values to set + * @param {DateTime} values.start - the starting DateTime + * @param {DateTime} values.end - the ending DateTime + * @return {Interval} + */ + set({ start, end } = {}) { + if (!this.isValid) return this; + return Interval.fromDateTimes(start || this.s, end || this.e); + } + + /** + * Split this Interval at each of the specified DateTimes + * @param {...DateTime} dateTimes - the unit of time to count. + * @return {Array} + */ + splitAt(...dateTimes) { + if (!this.isValid) return []; + const sorted = dateTimes + .map(friendlyDateTime) + .filter((d) => this.contains(d)) + .sort((a, b) => a.toMillis() - b.toMillis()), + results = []; + let { s } = this, + i = 0; + + while (s < this.e) { + const added = sorted[i] || this.e, + next = +added > +this.e ? this.e : added; + results.push(Interval.fromDateTimes(s, next)); + s = next; + i += 1; + } + + return results; + } + + /** + * Split this Interval into smaller Intervals, each of the specified length. + * Left over time is grouped into a smaller interval + * @param {Duration|Object|number} duration - The length of each resulting interval. + * @return {Array} + */ + splitBy(duration) { + const dur = Duration.fromDurationLike(duration); + + if (!this.isValid || !dur.isValid || dur.as("milliseconds") === 0) { + return []; + } + + let { s } = this, + idx = 1, + next; + + const results = []; + while (s < this.e) { + const added = this.start.plus(dur.mapUnits((x) => x * idx)); + next = +added > +this.e ? this.e : added; + results.push(Interval.fromDateTimes(s, next)); + s = next; + idx += 1; + } + + return results; + } + + /** + * Split this Interval into the specified number of smaller intervals. + * @param {number} numberOfParts - The number of Intervals to divide the Interval into. + * @return {Array} + */ + divideEqually(numberOfParts) { + if (!this.isValid) return []; + return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts); + } + + /** + * Return whether this Interval overlaps with the specified Interval + * @param {Interval} other + * @return {boolean} + */ + overlaps(other) { + return this.e > other.s && this.s < other.e; + } + + /** + * Return whether this Interval's end is adjacent to the specified Interval's start. + * @param {Interval} other + * @return {boolean} + */ + abutsStart(other) { + if (!this.isValid) return false; + return +this.e === +other.s; + } + + /** + * Return whether this Interval's start is adjacent to the specified Interval's end. + * @param {Interval} other + * @return {boolean} + */ + abutsEnd(other) { + if (!this.isValid) return false; + return +other.e === +this.s; + } + + /** + * Returns true if this Interval fully contains the specified Interval, specifically if the intersect (of this Interval and the other Interval) is equal to the other Interval; false otherwise. + * @param {Interval} other + * @return {boolean} + */ + engulfs(other) { + if (!this.isValid) return false; + return this.s <= other.s && this.e >= other.e; + } + + /** + * Return whether this Interval has the same start and end as the specified Interval. + * @param {Interval} other + * @return {boolean} + */ + equals(other) { + if (!this.isValid || !other.isValid) { + return false; + } + + return this.s.equals(other.s) && this.e.equals(other.e); + } + + /** + * Return an Interval representing the intersection of this Interval and the specified Interval. + * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals. + * Returns null if the intersection is empty, meaning, the intervals don't intersect. + * @param {Interval} other + * @return {Interval} + */ + intersection(other) { + if (!this.isValid) return this; + const s = this.s > other.s ? this.s : other.s, + e = this.e < other.e ? this.e : other.e; + + if (s >= e) { + return null; + } else { + return Interval.fromDateTimes(s, e); + } + } + + /** + * Return an Interval representing the union of this Interval and the specified Interval. + * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals. + * @param {Interval} other + * @return {Interval} + */ + union(other) { + if (!this.isValid) return this; + const s = this.s < other.s ? this.s : other.s, + e = this.e > other.e ? this.e : other.e; + return Interval.fromDateTimes(s, e); + } + + /** + * Merge an array of Intervals into an equivalent minimal set of Intervals. + * Combines overlapping and adjacent Intervals. + * The resulting array will contain the Intervals in ascending order, that is, starting with the earliest Interval + * and ending with the latest. + * + * @param {Array} intervals + * @return {Array} + */ + static merge(intervals) { + const [found, final] = intervals + .sort((a, b) => a.s - b.s) + .reduce( + ([sofar, current], item) => { + if (!current) { + return [sofar, item]; + } else if (current.overlaps(item) || current.abutsStart(item)) { + return [sofar, current.union(item)]; + } else { + return [sofar.concat([current]), item]; + } + }, + [[], null] + ); + if (final) { + found.push(final); + } + return found; + } + + /** + * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals. + * @param {Array} intervals + * @return {Array} + */ + static xor(intervals) { + let start = null, + currentCount = 0; + const results = [], + ends = intervals.map((i) => [ + { time: i.s, type: "s" }, + { time: i.e, type: "e" }, + ]), + flattened = Array.prototype.concat(...ends), + arr = flattened.sort((a, b) => a.time - b.time); + + for (const i of arr) { + currentCount += i.type === "s" ? 1 : -1; + + if (currentCount === 1) { + start = i.time; + } else { + if (start && +start !== +i.time) { + results.push(Interval.fromDateTimes(start, i.time)); + } + + start = null; + } + } + + return Interval.merge(results); + } + + /** + * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals. + * @param {...Interval} intervals + * @return {Array} + */ + difference(...intervals) { + return Interval.xor([this].concat(intervals)) + .map((i) => this.intersection(i)) + .filter((i) => i && !i.isEmpty()); + } + + /** + * Returns a string representation of this Interval appropriate for debugging. + * @return {string} + */ + toString() { + if (!this.isValid) return INVALID$1; + return `[${this.s.toISO()} – ${this.e.toISO()})`; + } + + /** + * Returns a string representation of this Interval appropriate for the REPL. + * @return {string} + */ + [Symbol.for("nodejs.util.inspect.custom")]() { + if (this.isValid) { + return `Interval { start: ${this.s.toISO()}, end: ${this.e.toISO()} }`; + } else { + return `Interval { Invalid, reason: ${this.invalidReason} }`; + } + } + + /** + * Returns a localized string representing this Interval. Accepts the same options as the + * Intl.DateTimeFormat constructor and any presets defined by Luxon, such as + * {@link DateTime.DATE_FULL} or {@link DateTime.TIME_SIMPLE}. The exact behavior of this method + * is browser-specific, but in general it will return an appropriate representation of the + * Interval in the assigned locale. Defaults to the system's locale if no locale has been + * specified. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {Object} [formatOpts=DateTime.DATE_SHORT] - Either a DateTime preset or + * Intl.DateTimeFormat constructor options. + * @param {Object} opts - Options to override the configuration of the start DateTime. + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(); //=> 11/7/2022 – 11/8/2022 + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL); //=> November 7 – 8, 2022 + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL, { locale: 'fr-FR' }); //=> 7–8 novembre 2022 + * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString(DateTime.TIME_SIMPLE); //=> 6:00 – 8:00 PM + * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> Mon, Nov 07, 6:00 – 8:00 p + * @return {string} + */ + toLocaleString(formatOpts = DATE_SHORT, opts = {}) { + return this.isValid + ? Formatter.create(this.s.loc.clone(opts), formatOpts).formatInterval(this) + : INVALID$1; + } + + /** + * Returns an ISO 8601-compliant string representation of this Interval. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @param {Object} opts - The same options as {@link DateTime#toISO} + * @return {string} + */ + toISO(opts) { + if (!this.isValid) return INVALID$1; + return `${this.s.toISO(opts)}/${this.e.toISO(opts)}`; + } + + /** + * Returns an ISO 8601-compliant string representation of date of this Interval. + * The time components are ignored. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @return {string} + */ + toISODate() { + if (!this.isValid) return INVALID$1; + return `${this.s.toISODate()}/${this.e.toISODate()}`; + } + + /** + * Returns an ISO 8601-compliant string representation of time of this Interval. + * The date components are ignored. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @param {Object} opts - The same options as {@link DateTime#toISO} + * @return {string} + */ + toISOTime(opts) { + if (!this.isValid) return INVALID$1; + return `${this.s.toISOTime(opts)}/${this.e.toISOTime(opts)}`; + } + + /** + * Returns a string representation of this Interval formatted according to the specified format + * string. **You may not want this.** See {@link Interval#toLocaleString} for a more flexible + * formatting tool. + * @param {string} dateFormat - The format string. This string formats the start and end time. + * See {@link DateTime#toFormat} for details. + * @param {Object} opts - Options. + * @param {string} [opts.separator = ' – '] - A separator to place between the start and end + * representations. + * @return {string} + */ + toFormat(dateFormat, { separator = " – " } = {}) { + if (!this.isValid) return INVALID$1; + return `${this.s.toFormat(dateFormat)}${separator}${this.e.toFormat(dateFormat)}`; + } + + /** + * Return a Duration representing the time spanned by this interval. + * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration. + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 } + * @return {Duration} + */ + toDuration(unit, opts) { + if (!this.isValid) { + return Duration.invalid(this.invalidReason); + } + return this.e.diff(this.s, unit, opts); + } + + /** + * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes + * @param {function} mapFn + * @return {Interval} + * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC()) + * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 })) + */ + mapEndpoints(mapFn) { + return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e)); + } +} + +/** + * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment. + */ +class Info { + /** + * Return whether the specified zone contains a DST. + * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone. + * @return {boolean} + */ + static hasDST(zone = Settings.defaultZone) { + const proto = DateTime.now().setZone(zone).set({ month: 12 }); + + return !zone.isUniversal && proto.offset !== proto.set({ month: 6 }).offset; + } + + /** + * Return whether the specified zone is a valid IANA specifier. + * @param {string} zone - Zone to check + * @return {boolean} + */ + static isValidIANAZone(zone) { + return IANAZone.isValidZone(zone); + } + + /** + * Converts the input into a {@link Zone} instance. + * + * * If `input` is already a Zone instance, it is returned unchanged. + * * If `input` is a string containing a valid time zone name, a Zone instance + * with that name is returned. + * * If `input` is a string that doesn't refer to a known time zone, a Zone + * instance with {@link Zone#isValid} == false is returned. + * * If `input is a number, a Zone instance with the specified fixed offset + * in minutes is returned. + * * If `input` is `null` or `undefined`, the default zone is returned. + * @param {string|Zone|number} [input] - the value to be converted + * @return {Zone} + */ + static normalizeZone(input) { + return normalizeZone(input, Settings.defaultZone); + } + + /** + * Get the weekday on which the week starts according to the given locale. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number} the start of the week, 1 for Monday through 7 for Sunday + */ + static getStartOfWeek({ locale = null, locObj = null } = {}) { + return (locObj || Locale.create(locale)).getStartOfWeek(); + } + + /** + * Get the minimum number of days necessary in a week before it is considered part of the next year according + * to the given locale. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number} + */ + static getMinimumDaysInFirstWeek({ locale = null, locObj = null } = {}) { + return (locObj || Locale.create(locale)).getMinDaysInFirstWeek(); + } + + /** + * Get the weekdays, which are considered the weekend according to the given locale + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number[]} an array of weekdays, 1 for Monday through 7 for Sunday + */ + static getWeekendWeekdays({ locale = null, locObj = null } = {}) { + // copy the array, because we cache it internally + return (locObj || Locale.create(locale)).getWeekendDays().slice(); + } + + /** + * Return an array of standalone month names. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long" + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @param {string} [opts.outputCalendar='gregory'] - the calendar + * @example Info.months()[0] //=> 'January' + * @example Info.months('short')[0] //=> 'Jan' + * @example Info.months('numeric')[0] //=> '1' + * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.' + * @example Info.months('numeric', { locale: 'ar' })[0] //=> '١' + * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I' + * @return {Array} + */ + static months( + length = "long", + { locale = null, numberingSystem = null, locObj = null, outputCalendar = "gregory" } = {} + ) { + return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length); + } + + /** + * Return an array of format month names. + * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that + * changes the string. + * See {@link Info#months} + * @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long" + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @param {string} [opts.outputCalendar='gregory'] - the calendar + * @return {Array} + */ + static monthsFormat( + length = "long", + { locale = null, numberingSystem = null, locObj = null, outputCalendar = "gregory" } = {} + ) { + return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true); + } + + /** + * Return an array of standalone week names. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {string} [length='long'] - the length of the weekday representation, such as "narrow", "short", "long". + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @example Info.weekdays()[0] //=> 'Monday' + * @example Info.weekdays('short')[0] //=> 'Mon' + * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.' + * @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين' + * @return {Array} + */ + static weekdays(length = "long", { locale = null, numberingSystem = null, locObj = null } = {}) { + return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length); + } + + /** + * Return an array of format week names. + * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that + * changes the string. + * See {@link Info#weekdays} + * @param {string} [length='long'] - the length of the month representation, such as "narrow", "short", "long". + * @param {Object} opts - options + * @param {string} [opts.locale=null] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @return {Array} + */ + static weekdaysFormat( + length = "long", + { locale = null, numberingSystem = null, locObj = null } = {} + ) { + return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true); + } + + /** + * Return an array of meridiems. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @example Info.meridiems() //=> [ 'AM', 'PM' ] + * @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ] + * @return {Array} + */ + static meridiems({ locale = null } = {}) { + return Locale.create(locale).meridiems(); + } + + /** + * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian. + * @param {string} [length='short'] - the length of the era representation, such as "short" or "long". + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @example Info.eras() //=> [ 'BC', 'AD' ] + * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ] + * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ] + * @return {Array} + */ + static eras(length = "short", { locale = null } = {}) { + return Locale.create(locale, null, "gregory").eras(length); + } + + /** + * Return the set of available features in this environment. + * Some features of Luxon are not available in all environments. For example, on older browsers, relative time formatting support is not available. Use this function to figure out if that's the case. + * Keys: + * * `relative`: whether this environment supports relative time formatting + * * `localeWeek`: whether this environment supports different weekdays for the start of the week based on the locale + * @example Info.features() //=> { relative: false, localeWeek: true } + * @return {Object} + */ + static features() { + return { relative: hasRelative(), localeWeek: hasLocaleWeekInfo() }; + } +} + +function dayDiff(earlier, later) { + const utcDayStart = (dt) => dt.toUTC(0, { keepLocalTime: true }).startOf("day").valueOf(), + ms = utcDayStart(later) - utcDayStart(earlier); + return Math.floor(Duration.fromMillis(ms).as("days")); +} + +function highOrderDiffs(cursor, later, units) { + const differs = [ + ["years", (a, b) => b.year - a.year], + ["quarters", (a, b) => b.quarter - a.quarter + (b.year - a.year) * 4], + ["months", (a, b) => b.month - a.month + (b.year - a.year) * 12], + [ + "weeks", + (a, b) => { + const days = dayDiff(a, b); + return (days - (days % 7)) / 7; + }, + ], + ["days", dayDiff], + ]; + + const results = {}; + const earlier = cursor; + let lowestOrder, highWater; + + /* This loop tries to diff using larger units first. + If we overshoot, we backtrack and try the next smaller unit. + "cursor" starts out at the earlier timestamp and moves closer and closer to "later" + as we use smaller and smaller units. + highWater keeps track of where we would be if we added one more of the smallest unit, + this is used later to potentially convert any difference smaller than the smallest higher order unit + into a fraction of that smallest higher order unit + */ + for (const [unit, differ] of differs) { + if (units.indexOf(unit) >= 0) { + lowestOrder = unit; + + results[unit] = differ(cursor, later); + highWater = earlier.plus(results); + + if (highWater > later) { + // we overshot the end point, backtrack cursor by 1 + results[unit]--; + cursor = earlier.plus(results); + + // if we are still overshooting now, we need to backtrack again + // this happens in certain situations when diffing times in different zones, + // because this calculation ignores time zones + if (cursor > later) { + // keep the "overshot by 1" around as highWater + highWater = cursor; + // backtrack cursor by 1 + results[unit]--; + cursor = earlier.plus(results); + } + } else { + cursor = highWater; + } + } + } + + return [cursor, results, highWater, lowestOrder]; +} + +function diff (earlier, later, units, opts) { + let [cursor, results, highWater, lowestOrder] = highOrderDiffs(earlier, later, units); + + const remainingMillis = later - cursor; + + const lowerOrderUnits = units.filter( + (u) => ["hours", "minutes", "seconds", "milliseconds"].indexOf(u) >= 0 + ); + + if (lowerOrderUnits.length === 0) { + if (highWater < later) { + highWater = cursor.plus({ [lowestOrder]: 1 }); + } + + if (highWater !== cursor) { + results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor); + } + } + + const duration = Duration.fromObject(results, opts); + + if (lowerOrderUnits.length > 0) { + return Duration.fromMillis(remainingMillis, opts) + .shiftTo(...lowerOrderUnits) + .plus(duration); + } else { + return duration; + } +} + +const MISSING_FTP = "missing Intl.DateTimeFormat.formatToParts support"; + +function intUnit(regex, post = (i) => i) { + return { regex, deser: ([s]) => post(parseDigits(s)) }; +} + +const NBSP = String.fromCharCode(160); +const spaceOrNBSP = `[ ${NBSP}]`; +const spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, "g"); + +function fixListRegex(s) { + // make dots optional and also make them literal + // make space and non breakable space characters interchangeable + return s.replace(/\./g, "\\.?").replace(spaceOrNBSPRegExp, spaceOrNBSP); +} + +function stripInsensitivities(s) { + return s + .replace(/\./g, "") // ignore dots that were made optional + .replace(spaceOrNBSPRegExp, " ") // interchange space and nbsp + .toLowerCase(); +} + +function oneOf(strings, startIndex) { + if (strings === null) { + return null; + } else { + return { + regex: RegExp(strings.map(fixListRegex).join("|")), + deser: ([s]) => + strings.findIndex((i) => stripInsensitivities(s) === stripInsensitivities(i)) + startIndex, + }; + } +} + +function offset(regex, groups) { + return { regex, deser: ([, h, m]) => signedOffset(h, m), groups }; +} + +function simple(regex) { + return { regex, deser: ([s]) => s }; +} + +function escapeToken(value) { + return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); +} + +/** + * @param token + * @param {Locale} loc + */ +function unitForToken(token, loc) { + const one = digitRegex(loc), + two = digitRegex(loc, "{2}"), + three = digitRegex(loc, "{3}"), + four = digitRegex(loc, "{4}"), + six = digitRegex(loc, "{6}"), + oneOrTwo = digitRegex(loc, "{1,2}"), + oneToThree = digitRegex(loc, "{1,3}"), + oneToSix = digitRegex(loc, "{1,6}"), + oneToNine = digitRegex(loc, "{1,9}"), + twoToFour = digitRegex(loc, "{2,4}"), + fourToSix = digitRegex(loc, "{4,6}"), + literal = (t) => ({ regex: RegExp(escapeToken(t.val)), deser: ([s]) => s, literal: true }), + unitate = (t) => { + if (token.literal) { + return literal(t); + } + switch (t.val) { + // era + case "G": + return oneOf(loc.eras("short"), 0); + case "GG": + return oneOf(loc.eras("long"), 0); + // years + case "y": + return intUnit(oneToSix); + case "yy": + return intUnit(twoToFour, untruncateYear); + case "yyyy": + return intUnit(four); + case "yyyyy": + return intUnit(fourToSix); + case "yyyyyy": + return intUnit(six); + // months + case "M": + return intUnit(oneOrTwo); + case "MM": + return intUnit(two); + case "MMM": + return oneOf(loc.months("short", true), 1); + case "MMMM": + return oneOf(loc.months("long", true), 1); + case "L": + return intUnit(oneOrTwo); + case "LL": + return intUnit(two); + case "LLL": + return oneOf(loc.months("short", false), 1); + case "LLLL": + return oneOf(loc.months("long", false), 1); + // dates + case "d": + return intUnit(oneOrTwo); + case "dd": + return intUnit(two); + // ordinals + case "o": + return intUnit(oneToThree); + case "ooo": + return intUnit(three); + // time + case "HH": + return intUnit(two); + case "H": + return intUnit(oneOrTwo); + case "hh": + return intUnit(two); + case "h": + return intUnit(oneOrTwo); + case "mm": + return intUnit(two); + case "m": + return intUnit(oneOrTwo); + case "q": + return intUnit(oneOrTwo); + case "qq": + return intUnit(two); + case "s": + return intUnit(oneOrTwo); + case "ss": + return intUnit(two); + case "S": + return intUnit(oneToThree); + case "SSS": + return intUnit(three); + case "u": + return simple(oneToNine); + case "uu": + return simple(oneOrTwo); + case "uuu": + return intUnit(one); + // meridiem + case "a": + return oneOf(loc.meridiems(), 0); + // weekYear (k) + case "kkkk": + return intUnit(four); + case "kk": + return intUnit(twoToFour, untruncateYear); + // weekNumber (W) + case "W": + return intUnit(oneOrTwo); + case "WW": + return intUnit(two); + // weekdays + case "E": + case "c": + return intUnit(one); + case "EEE": + return oneOf(loc.weekdays("short", false), 1); + case "EEEE": + return oneOf(loc.weekdays("long", false), 1); + case "ccc": + return oneOf(loc.weekdays("short", true), 1); + case "cccc": + return oneOf(loc.weekdays("long", true), 1); + // offset/zone + case "Z": + case "ZZ": + return offset(new RegExp(`([+-]${oneOrTwo.source})(?::(${two.source}))?`), 2); + case "ZZZ": + return offset(new RegExp(`([+-]${oneOrTwo.source})(${two.source})?`), 2); + // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing + // because we don't have any way to figure out what they are + case "z": + return simple(/[a-z_+-/]{1,256}?/i); + // this special-case "token" represents a place where a macro-token expanded into a white-space literal + // in this case we accept any non-newline white-space + case " ": + return simple(/[^\S\n\r]/); + default: + return literal(t); + } + }; + + const unit = unitate(token) || { + invalidReason: MISSING_FTP, + }; + + unit.token = token; + + return unit; +} + +const partTypeStyleToTokenVal = { + year: { + "2-digit": "yy", + numeric: "yyyyy", + }, + month: { + numeric: "M", + "2-digit": "MM", + short: "MMM", + long: "MMMM", + }, + day: { + numeric: "d", + "2-digit": "dd", + }, + weekday: { + short: "EEE", + long: "EEEE", + }, + dayperiod: "a", + dayPeriod: "a", + hour12: { + numeric: "h", + "2-digit": "hh", + }, + hour24: { + numeric: "H", + "2-digit": "HH", + }, + minute: { + numeric: "m", + "2-digit": "mm", + }, + second: { + numeric: "s", + "2-digit": "ss", + }, + timeZoneName: { + long: "ZZZZZ", + short: "ZZZ", + }, +}; + +function tokenForPart(part, formatOpts, resolvedOpts) { + const { type, value } = part; + + if (type === "literal") { + const isSpace = /^\s+$/.test(value); + return { + literal: !isSpace, + val: isSpace ? " " : value, + }; + } + + const style = formatOpts[type]; + + // The user might have explicitly specified hour12 or hourCycle + // if so, respect their decision + // if not, refer back to the resolvedOpts, which are based on the locale + let actualType = type; + if (type === "hour") { + if (formatOpts.hour12 != null) { + actualType = formatOpts.hour12 ? "hour12" : "hour24"; + } else if (formatOpts.hourCycle != null) { + if (formatOpts.hourCycle === "h11" || formatOpts.hourCycle === "h12") { + actualType = "hour12"; + } else { + actualType = "hour24"; + } + } else { + // tokens only differentiate between 24 hours or not, + // so we do not need to check hourCycle here, which is less supported anyways + actualType = resolvedOpts.hour12 ? "hour12" : "hour24"; + } + } + let val = partTypeStyleToTokenVal[actualType]; + if (typeof val === "object") { + val = val[style]; + } + + if (val) { + return { + literal: false, + val, + }; + } + + return undefined; +} + +function buildRegex(units) { + const re = units.map((u) => u.regex).reduce((f, r) => `${f}(${r.source})`, ""); + return [`^${re}$`, units]; +} + +function match(input, regex, handlers) { + const matches = input.match(regex); + + if (matches) { + const all = {}; + let matchIndex = 1; + for (const i in handlers) { + if (hasOwnProperty(handlers, i)) { + const h = handlers[i], + groups = h.groups ? h.groups + 1 : 1; + if (!h.literal && h.token) { + all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups)); + } + matchIndex += groups; + } + } + return [matches, all]; + } else { + return [matches, {}]; + } +} + +function dateTimeFromMatches(matches) { + const toField = (token) => { + switch (token) { + case "S": + return "millisecond"; + case "s": + return "second"; + case "m": + return "minute"; + case "h": + case "H": + return "hour"; + case "d": + return "day"; + case "o": + return "ordinal"; + case "L": + case "M": + return "month"; + case "y": + return "year"; + case "E": + case "c": + return "weekday"; + case "W": + return "weekNumber"; + case "k": + return "weekYear"; + case "q": + return "quarter"; + default: + return null; + } + }; + + let zone = null; + let specificOffset; + if (!isUndefined(matches.z)) { + zone = IANAZone.create(matches.z); + } + + if (!isUndefined(matches.Z)) { + if (!zone) { + zone = new FixedOffsetZone(matches.Z); + } + specificOffset = matches.Z; + } + + if (!isUndefined(matches.q)) { + matches.M = (matches.q - 1) * 3 + 1; + } + + if (!isUndefined(matches.h)) { + if (matches.h < 12 && matches.a === 1) { + matches.h += 12; + } else if (matches.h === 12 && matches.a === 0) { + matches.h = 0; + } + } + + if (matches.G === 0 && matches.y) { + matches.y = -matches.y; + } + + if (!isUndefined(matches.u)) { + matches.S = parseMillis(matches.u); + } + + const vals = Object.keys(matches).reduce((r, k) => { + const f = toField(k); + if (f) { + r[f] = matches[k]; + } + + return r; + }, {}); + + return [vals, zone, specificOffset]; +} + +let dummyDateTimeCache = null; + +function getDummyDateTime() { + if (!dummyDateTimeCache) { + dummyDateTimeCache = DateTime.fromMillis(1555555555555); + } + + return dummyDateTimeCache; +} + +function maybeExpandMacroToken(token, locale) { + if (token.literal) { + return token; + } + + const formatOpts = Formatter.macroTokenToFormatOpts(token.val); + const tokens = formatOptsToTokens(formatOpts, locale); + + if (tokens == null || tokens.includes(undefined)) { + return token; + } + + return tokens; +} + +function expandMacroTokens(tokens, locale) { + return Array.prototype.concat(...tokens.map((t) => maybeExpandMacroToken(t, locale))); +} + +/** + * @private + */ + +class TokenParser { + constructor(locale, format) { + this.locale = locale; + this.format = format; + this.tokens = expandMacroTokens(Formatter.parseFormat(format), locale); + this.units = this.tokens.map((t) => unitForToken(t, locale)); + this.disqualifyingUnit = this.units.find((t) => t.invalidReason); + + if (!this.disqualifyingUnit) { + const [regexString, handlers] = buildRegex(this.units); + this.regex = RegExp(regexString, "i"); + this.handlers = handlers; + } + } + + explainFromTokens(input) { + if (!this.isValid) { + return { input, tokens: this.tokens, invalidReason: this.invalidReason }; + } else { + const [rawMatches, matches] = match(input, this.regex, this.handlers), + [result, zone, specificOffset] = matches + ? dateTimeFromMatches(matches) + : [null, null, undefined]; + if (hasOwnProperty(matches, "a") && hasOwnProperty(matches, "H")) { + throw new ConflictingSpecificationError( + "Can't include meridiem when specifying 24-hour format" + ); + } + return { + input, + tokens: this.tokens, + regex: this.regex, + rawMatches, + matches, + result, + zone, + specificOffset, + }; + } + } + + get isValid() { + return !this.disqualifyingUnit; + } + + get invalidReason() { + return this.disqualifyingUnit ? this.disqualifyingUnit.invalidReason : null; + } +} + +function explainFromTokens(locale, input, format) { + const parser = new TokenParser(locale, format); + return parser.explainFromTokens(input); +} + +function parseFromTokens(locale, input, format) { + const { result, zone, specificOffset, invalidReason } = explainFromTokens(locale, input, format); + return [result, zone, specificOffset, invalidReason]; +} + +function formatOptsToTokens(formatOpts, locale) { + if (!formatOpts) { + return null; + } + + const formatter = Formatter.create(locale, formatOpts); + const df = formatter.dtFormatter(getDummyDateTime()); + const parts = df.formatToParts(); + const resolvedOpts = df.resolvedOptions(); + return parts.map((p) => tokenForPart(p, formatOpts, resolvedOpts)); +} + +const INVALID = "Invalid DateTime"; +const MAX_DATE = 8.64e15; + +function unsupportedZone(zone) { + return new Invalid("unsupported zone", `the zone "${zone.name}" is not supported`); +} + +// we cache week data on the DT object and this intermediates the cache +/** + * @param {DateTime} dt + */ +function possiblyCachedWeekData(dt) { + if (dt.weekData === null) { + dt.weekData = gregorianToWeek(dt.c); + } + return dt.weekData; +} + +/** + * @param {DateTime} dt + */ +function possiblyCachedLocalWeekData(dt) { + if (dt.localWeekData === null) { + dt.localWeekData = gregorianToWeek( + dt.c, + dt.loc.getMinDaysInFirstWeek(), + dt.loc.getStartOfWeek() + ); + } + return dt.localWeekData; +} + +// clone really means, "make a new object with these modifications". all "setters" really use this +// to create a new object while only changing some of the properties +function clone(inst, alts) { + const current = { + ts: inst.ts, + zone: inst.zone, + c: inst.c, + o: inst.o, + loc: inst.loc, + invalid: inst.invalid, + }; + return new DateTime({ ...current, ...alts, old: current }); +} + +// find the right offset a given local time. The o input is our guess, which determines which +// offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST) +function fixOffset(localTS, o, tz) { + // Our UTC time is just a guess because our offset is just a guess + let utcGuess = localTS - o * 60 * 1000; + + // Test whether the zone matches the offset for this ts + const o2 = tz.offset(utcGuess); + + // If so, offset didn't change and we're done + if (o === o2) { + return [utcGuess, o]; + } + + // If not, change the ts by the difference in the offset + utcGuess -= (o2 - o) * 60 * 1000; + + // If that gives us the local time we want, we're done + const o3 = tz.offset(utcGuess); + if (o2 === o3) { + return [utcGuess, o2]; + } + + // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time + return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)]; +} + +// convert an epoch timestamp into a calendar object with the given offset +function tsToObj(ts, offset) { + ts += offset * 60 * 1000; + + const d = new Date(ts); + + return { + year: d.getUTCFullYear(), + month: d.getUTCMonth() + 1, + day: d.getUTCDate(), + hour: d.getUTCHours(), + minute: d.getUTCMinutes(), + second: d.getUTCSeconds(), + millisecond: d.getUTCMilliseconds(), + }; +} + +// convert a calendar object to a epoch timestamp +function objToTS(obj, offset, zone) { + return fixOffset(objToLocalTS(obj), offset, zone); +} + +// create a new DT instance by adding a duration, adjusting for DSTs +function adjustTime(inst, dur) { + const oPre = inst.o, + year = inst.c.year + Math.trunc(dur.years), + month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3, + c = { + ...inst.c, + year, + month, + day: + Math.min(inst.c.day, daysInMonth(year, month)) + + Math.trunc(dur.days) + + Math.trunc(dur.weeks) * 7, + }, + millisToAdd = Duration.fromObject({ + years: dur.years - Math.trunc(dur.years), + quarters: dur.quarters - Math.trunc(dur.quarters), + months: dur.months - Math.trunc(dur.months), + weeks: dur.weeks - Math.trunc(dur.weeks), + days: dur.days - Math.trunc(dur.days), + hours: dur.hours, + minutes: dur.minutes, + seconds: dur.seconds, + milliseconds: dur.milliseconds, + }).as("milliseconds"), + localTS = objToLocalTS(c); + + let [ts, o] = fixOffset(localTS, oPre, inst.zone); + + if (millisToAdd !== 0) { + ts += millisToAdd; + // that could have changed the offset by going over a DST, but we want to keep the ts the same + o = inst.zone.offset(ts); + } + + return { ts, o }; +} + +// helper useful in turning the results of parsing into real dates +// by handling the zone options +function parseDataToDateTime(parsed, parsedZone, opts, format, text, specificOffset) { + const { setZone, zone } = opts; + if ((parsed && Object.keys(parsed).length !== 0) || parsedZone) { + const interpretationZone = parsedZone || zone, + inst = DateTime.fromObject(parsed, { + ...opts, + zone: interpretationZone, + specificOffset, + }); + return setZone ? inst : inst.setZone(zone); + } else { + return DateTime.invalid( + new Invalid("unparsable", `the input "${text}" can't be parsed as ${format}`) + ); + } +} + +// if you want to output a technical format (e.g. RFC 2822), this helper +// helps handle the details +function toTechFormat(dt, format, allowZ = true) { + return dt.isValid + ? Formatter.create(Locale.create("en-US"), { + allowZ, + forceSimple: true, + }).formatDateTimeFromString(dt, format) + : null; +} + +function toISODate(o, extended, precision) { + const longFormat = o.c.year > 9999 || o.c.year < 0; + let c = ""; + if (longFormat && o.c.year >= 0) c += "+"; + c += padStart(o.c.year, longFormat ? 6 : 4); + if (precision === "year") return c; + if (extended) { + c += "-"; + c += padStart(o.c.month); + if (precision === "month") return c; + c += "-"; + } else { + c += padStart(o.c.month); + if (precision === "month") return c; + } + c += padStart(o.c.day); + return c; +} + +function toISOTime( + o, + extended, + suppressSeconds, + suppressMilliseconds, + includeOffset, + extendedZone, + precision +) { + let showSeconds = !suppressSeconds || o.c.millisecond !== 0 || o.c.second !== 0, + c = ""; + switch (precision) { + case "day": + case "month": + case "year": + break; + default: + c += padStart(o.c.hour); + if (precision === "hour") break; + if (extended) { + c += ":"; + c += padStart(o.c.minute); + if (precision === "minute") break; + if (showSeconds) { + c += ":"; + c += padStart(o.c.second); + } + } else { + c += padStart(o.c.minute); + if (precision === "minute") break; + if (showSeconds) { + c += padStart(o.c.second); + } + } + if (precision === "second") break; + if (showSeconds && (!suppressMilliseconds || o.c.millisecond !== 0)) { + c += "."; + c += padStart(o.c.millisecond, 3); + } + } + + if (includeOffset) { + if (o.isOffsetFixed && o.offset === 0 && !extendedZone) { + c += "Z"; + } else if (o.o < 0) { + c += "-"; + c += padStart(Math.trunc(-o.o / 60)); + c += ":"; + c += padStart(Math.trunc(-o.o % 60)); + } else { + c += "+"; + c += padStart(Math.trunc(o.o / 60)); + c += ":"; + c += padStart(Math.trunc(o.o % 60)); + } + } + + if (extendedZone) { + c += "[" + o.zone.ianaName + "]"; + } + return c; +} + +// defaults for unspecified units in the supported calendars +const defaultUnitValues = { + month: 1, + day: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0, + }, + defaultWeekUnitValues = { + weekNumber: 1, + weekday: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0, + }, + defaultOrdinalUnitValues = { + ordinal: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0, + }; + +// Units in the supported calendars, sorted by bigness +const orderedUnits = ["year", "month", "day", "hour", "minute", "second", "millisecond"], + orderedWeekUnits = [ + "weekYear", + "weekNumber", + "weekday", + "hour", + "minute", + "second", + "millisecond", + ], + orderedOrdinalUnits = ["year", "ordinal", "hour", "minute", "second", "millisecond"]; + +// standardize case and plurality in units +function normalizeUnit(unit) { + const normalized = { + year: "year", + years: "year", + month: "month", + months: "month", + day: "day", + days: "day", + hour: "hour", + hours: "hour", + minute: "minute", + minutes: "minute", + quarter: "quarter", + quarters: "quarter", + second: "second", + seconds: "second", + millisecond: "millisecond", + milliseconds: "millisecond", + weekday: "weekday", + weekdays: "weekday", + weeknumber: "weekNumber", + weeksnumber: "weekNumber", + weeknumbers: "weekNumber", + weekyear: "weekYear", + weekyears: "weekYear", + ordinal: "ordinal", + }[unit.toLowerCase()]; + + if (!normalized) throw new InvalidUnitError(unit); + + return normalized; +} + +function normalizeUnitWithLocalWeeks(unit) { + switch (unit.toLowerCase()) { + case "localweekday": + case "localweekdays": + return "localWeekday"; + case "localweeknumber": + case "localweeknumbers": + return "localWeekNumber"; + case "localweekyear": + case "localweekyears": + return "localWeekYear"; + default: + return normalizeUnit(unit); + } +} + +// cache offsets for zones based on the current timestamp when this function is +// first called. When we are handling a datetime from components like (year, +// month, day, hour) in a time zone, we need a guess about what the timezone +// offset is so that we can convert into a UTC timestamp. One way is to find the +// offset of now in the zone. The actual date may have a different offset (for +// example, if we handle a date in June while we're in December in a zone that +// observes DST), but we can check and adjust that. +// +// When handling many dates, calculating the offset for now every time is +// expensive. It's just a guess, so we can cache the offset to use even if we +// are right on a time change boundary (we'll just correct in the other +// direction). Using a timestamp from first read is a slight optimization for +// handling dates close to the current date, since those dates will usually be +// in the same offset (we could set the timestamp statically, instead). We use a +// single timestamp for all zones to make things a bit more predictable. +// +// This is safe for quickDT (used by local() and utc()) because we don't fill in +// higher-order units from tsNow (as we do in fromObject, this requires that +// offset is calculated from tsNow). +/** + * @param {Zone} zone + * @return {number} + */ +function guessOffsetForZone(zone) { + if (zoneOffsetTs === undefined) { + zoneOffsetTs = Settings.now(); + } + + // Do not cache anything but IANA zones, because it is not safe to do so. + // Guessing an offset which is not present in the zone can cause wrong results from fixOffset + if (zone.type !== "iana") { + return zone.offset(zoneOffsetTs); + } + const zoneName = zone.name; + let offsetGuess = zoneOffsetGuessCache.get(zoneName); + if (offsetGuess === undefined) { + offsetGuess = zone.offset(zoneOffsetTs); + zoneOffsetGuessCache.set(zoneName, offsetGuess); + } + return offsetGuess; +} + +// this is a dumbed down version of fromObject() that runs about 60% faster +// but doesn't do any validation, makes a bunch of assumptions about what units +// are present, and so on. +function quickDT(obj, opts) { + const zone = normalizeZone(opts.zone, Settings.defaultZone); + if (!zone.isValid) { + return DateTime.invalid(unsupportedZone(zone)); + } + + const loc = Locale.fromObject(opts); + + let ts, o; + + // assume we have the higher-order units + if (!isUndefined(obj.year)) { + for (const u of orderedUnits) { + if (isUndefined(obj[u])) { + obj[u] = defaultUnitValues[u]; + } + } + + const invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj); + if (invalid) { + return DateTime.invalid(invalid); + } + + const offsetProvis = guessOffsetForZone(zone); + [ts, o] = objToTS(obj, offsetProvis, zone); + } else { + ts = Settings.now(); + } + + return new DateTime({ ts, zone, loc, o }); +} + +function diffRelative(start, end, opts) { + const round = isUndefined(opts.round) ? true : opts.round, + rounding = isUndefined(opts.rounding) ? "trunc" : opts.rounding, + format = (c, unit) => { + c = roundTo(c, round || opts.calendary ? 0 : 2, opts.calendary ? "round" : rounding); + const formatter = end.loc.clone(opts).relFormatter(opts); + return formatter.format(c, unit); + }, + differ = (unit) => { + if (opts.calendary) { + if (!end.hasSame(start, unit)) { + return end.startOf(unit).diff(start.startOf(unit), unit).get(unit); + } else return 0; + } else { + return end.diff(start, unit).get(unit); + } + }; + + if (opts.unit) { + return format(differ(opts.unit), opts.unit); + } + + for (const unit of opts.units) { + const count = differ(unit); + if (Math.abs(count) >= 1) { + return format(count, unit); + } + } + return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]); +} + +function lastOpts(argList) { + let opts = {}, + args; + if (argList.length > 0 && typeof argList[argList.length - 1] === "object") { + opts = argList[argList.length - 1]; + args = Array.from(argList).slice(0, argList.length - 1); + } else { + args = Array.from(argList); + } + return [opts, args]; +} + +/** + * Timestamp to use for cached zone offset guesses (exposed for test) + */ +let zoneOffsetTs; +/** + * Cache for zone offset guesses (exposed for test). + * + * This optimizes quickDT via guessOffsetForZone to avoid repeated calls of + * zone.offset(). + */ +const zoneOffsetGuessCache = new Map(); + +/** + * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them. + * + * A DateTime comprises of: + * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch. + * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone). + * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`. + * + * Here is a brief overview of the most commonly used functionality it provides: + * + * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link DateTime.local}, {@link DateTime.utc}, and (most flexibly) {@link DateTime.fromObject}. To create one from a standard string format, use {@link DateTime.fromISO}, {@link DateTime.fromHTTP}, and {@link DateTime.fromRFC2822}. To create one from a custom string format, use {@link DateTime.fromFormat}. To create one from a native JS date, use {@link DateTime.fromJSDate}. + * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link DateTime#toObject}), use the {@link DateTime#year}, {@link DateTime#month}, + * {@link DateTime#day}, {@link DateTime#hour}, {@link DateTime#minute}, {@link DateTime#second}, {@link DateTime#millisecond} accessors. + * * **Week calendar**: For ISO week calendar attributes, see the {@link DateTime#weekYear}, {@link DateTime#weekNumber}, and {@link DateTime#weekday} accessors. + * * **Configuration** See the {@link DateTime#locale} and {@link DateTime#numberingSystem} accessors. + * * **Transformation**: To transform the DateTime into other DateTimes, use {@link DateTime#set}, {@link DateTime#reconfigure}, {@link DateTime#setZone}, {@link DateTime#setLocale}, {@link DateTime.plus}, {@link DateTime#minus}, {@link DateTime#endOf}, {@link DateTime#startOf}, {@link DateTime#toUTC}, and {@link DateTime#toLocal}. + * * **Output**: To convert the DateTime to other representations, use the {@link DateTime#toRelative}, {@link DateTime#toRelativeCalendar}, {@link DateTime#toJSON}, {@link DateTime#toISO}, {@link DateTime#toHTTP}, {@link DateTime#toObject}, {@link DateTime#toRFC2822}, {@link DateTime#toString}, {@link DateTime#toLocaleString}, {@link DateTime#toFormat}, {@link DateTime#toMillis} and {@link DateTime#toJSDate}. + * + * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation. + */ +class DateTime { + /** + * @access private + */ + constructor(config) { + const zone = config.zone || Settings.defaultZone; + + let invalid = + config.invalid || + (Number.isNaN(config.ts) ? new Invalid("invalid input") : null) || + (!zone.isValid ? unsupportedZone(zone) : null); + /** + * @access private + */ + this.ts = isUndefined(config.ts) ? Settings.now() : config.ts; + + let c = null, + o = null; + if (!invalid) { + const unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone); + + if (unchanged) { + [c, o] = [config.old.c, config.old.o]; + } else { + // If an offset has been passed and we have not been called from + // clone(), we can trust it and avoid the offset calculation. + const ot = isNumber(config.o) && !config.old ? config.o : zone.offset(this.ts); + c = tsToObj(this.ts, ot); + invalid = Number.isNaN(c.year) ? new Invalid("invalid input") : null; + c = invalid ? null : c; + o = invalid ? null : ot; + } + } + + /** + * @access private + */ + this._zone = zone; + /** + * @access private + */ + this.loc = config.loc || Locale.create(); + /** + * @access private + */ + this.invalid = invalid; + /** + * @access private + */ + this.weekData = null; + /** + * @access private + */ + this.localWeekData = null; + /** + * @access private + */ + this.c = c; + /** + * @access private + */ + this.o = o; + /** + * @access private + */ + this.isLuxonDateTime = true; + } + + // CONSTRUCT + + /** + * Create a DateTime for the current instant, in the system's time zone. + * + * Use Settings to override these default values if needed. + * @example DateTime.now().toISO() //~> now in the ISO format + * @return {DateTime} + */ + static now() { + return new DateTime({}); + } + + /** + * Create a local DateTime + * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used + * @param {number} [month=1] - The month, 1-indexed + * @param {number} [day=1] - The day of the month, 1-indexed + * @param {number} [hour=0] - The hour of the day, in 24-hour time + * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59 + * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59 + * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999 + * @example DateTime.local() //~> now + * @example DateTime.local({ zone: "America/New_York" }) //~> now, in US east coast time + * @example DateTime.local(2017) //~> 2017-01-01T00:00:00 + * @example DateTime.local(2017, 3) //~> 2017-03-01T00:00:00 + * @example DateTime.local(2017, 3, 12, { locale: "fr" }) //~> 2017-03-12T00:00:00, with a French locale + * @example DateTime.local(2017, 3, 12, 5) //~> 2017-03-12T05:00:00 + * @example DateTime.local(2017, 3, 12, 5, { zone: "utc" }) //~> 2017-03-12T05:00:00, in UTC + * @example DateTime.local(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00 + * @example DateTime.local(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10 + * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765 + * @return {DateTime} + */ + static local() { + const [opts, args] = lastOpts(arguments), + [year, month, day, hour, minute, second, millisecond] = args; + return quickDT({ year, month, day, hour, minute, second, millisecond }, opts); + } + + /** + * Create a DateTime in UTC + * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used + * @param {number} [month=1] - The month, 1-indexed + * @param {number} [day=1] - The day of the month + * @param {number} [hour=0] - The hour of the day, in 24-hour time + * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59 + * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59 + * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999 + * @param {Object} options - configuration options for the DateTime + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} [options.outputCalendar] - the output calendar to set on the resulting DateTime instance + * @param {string} [options.numberingSystem] - the numbering system to set on the resulting DateTime instance + * @param {string} [options.weekSettings] - the week settings to set on the resulting DateTime instance + * @example DateTime.utc() //~> now + * @example DateTime.utc(2017) //~> 2017-01-01T00:00:00Z + * @example DateTime.utc(2017, 3) //~> 2017-03-01T00:00:00Z + * @example DateTime.utc(2017, 3, 12) //~> 2017-03-12T00:00:00Z + * @example DateTime.utc(2017, 3, 12, 5) //~> 2017-03-12T05:00:00Z + * @example DateTime.utc(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00Z + * @example DateTime.utc(2017, 3, 12, 5, 45, { locale: "fr" }) //~> 2017-03-12T05:45:00Z with a French locale + * @example DateTime.utc(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10Z + * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765, { locale: "fr" }) //~> 2017-03-12T05:45:10.765Z with a French locale + * @return {DateTime} + */ + static utc() { + const [opts, args] = lastOpts(arguments), + [year, month, day, hour, minute, second, millisecond] = args; + + opts.zone = FixedOffsetZone.utcInstance; + return quickDT({ year, month, day, hour, minute, second, millisecond }, opts); + } + + /** + * Create a DateTime from a JavaScript Date object. Uses the default zone. + * @param {Date} date - a JavaScript Date object + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @return {DateTime} + */ + static fromJSDate(date, options = {}) { + const ts = isDate(date) ? date.valueOf() : NaN; + if (Number.isNaN(ts)) { + return DateTime.invalid("invalid input"); + } + + const zoneToUse = normalizeZone(options.zone, Settings.defaultZone); + if (!zoneToUse.isValid) { + return DateTime.invalid(unsupportedZone(zoneToUse)); + } + + return new DateTime({ + ts: ts, + zone: zoneToUse, + loc: Locale.fromObject(options), + }); + } + + /** + * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone. + * @param {number} milliseconds - a number of milliseconds since 1970 UTC + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance + * @return {DateTime} + */ + static fromMillis(milliseconds, options = {}) { + if (!isNumber(milliseconds)) { + throw new InvalidArgumentError( + `fromMillis requires a numerical input, but received a ${typeof milliseconds} with value ${milliseconds}` + ); + } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) { + // this isn't perfect because we can still end up out of range because of additional shifting, but it's a start + return DateTime.invalid("Timestamp out of range"); + } else { + return new DateTime({ + ts: milliseconds, + zone: normalizeZone(options.zone, Settings.defaultZone), + loc: Locale.fromObject(options), + }); + } + } + + /** + * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone. + * @param {number} seconds - a number of seconds since 1970 UTC + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance + * @return {DateTime} + */ + static fromSeconds(seconds, options = {}) { + if (!isNumber(seconds)) { + throw new InvalidArgumentError("fromSeconds requires a numerical input"); + } else { + return new DateTime({ + ts: seconds * 1000, + zone: normalizeZone(options.zone, Settings.defaultZone), + loc: Locale.fromObject(options), + }); + } + } + + /** + * Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults. + * @param {Object} obj - the object to create the DateTime from + * @param {number} obj.year - a year, such as 1987 + * @param {number} obj.month - a month, 1-12 + * @param {number} obj.day - a day of the month, 1-31, depending on the month + * @param {number} obj.ordinal - day of the year, 1-365 or 366 + * @param {number} obj.weekYear - an ISO week year + * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year + * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday + * @param {number} obj.localWeekYear - a week year, according to the locale + * @param {number} obj.localWeekNumber - a week number, between 1 and 52 or 53, depending on the year, according to the locale + * @param {number} obj.localWeekday - a weekday, 1-7, where 1 is the first and 7 is the last day of the week, according to the locale + * @param {number} obj.hour - hour of the day, 0-23 + * @param {number} obj.minute - minute of the hour, 0-59 + * @param {number} obj.second - second of the minute, 0-59 + * @param {number} obj.millisecond - millisecond of the second, 0-999 + * @param {Object} opts - options for creating this DateTime + * @param {string|Zone} [opts.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone() + * @param {string} [opts.locale='system\'s locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25' + * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01' + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06 + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'utc' }), + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'local' }) + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'America/New_York' }) + * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13' + * @example DateTime.fromObject({ localWeekYear: 2022, localWeekNumber: 1, localWeekday: 1 }, { locale: "en-US" }).toISODate() //=> '2021-12-26' + * @return {DateTime} + */ + static fromObject(obj, opts = {}) { + obj = obj || {}; + const zoneToUse = normalizeZone(opts.zone, Settings.defaultZone); + if (!zoneToUse.isValid) { + return DateTime.invalid(unsupportedZone(zoneToUse)); + } + + const loc = Locale.fromObject(opts); + const normalized = normalizeObject(obj, normalizeUnitWithLocalWeeks); + const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, loc); + + const tsNow = Settings.now(), + offsetProvis = !isUndefined(opts.specificOffset) + ? opts.specificOffset + : zoneToUse.offset(tsNow), + containsOrdinal = !isUndefined(normalized.ordinal), + containsGregorYear = !isUndefined(normalized.year), + containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), + containsGregor = containsGregorYear || containsGregorMD, + definiteWeekDef = normalized.weekYear || normalized.weekNumber; + + // cases: + // just a weekday -> this week's instance of that weekday, no worries + // (gregorian data or ordinal) + (weekYear or weekNumber) -> error + // (gregorian month or day) + ordinal -> error + // otherwise just use weeks or ordinals or gregorian, depending on what's specified + + if ((containsGregor || containsOrdinal) && definiteWeekDef) { + throw new ConflictingSpecificationError( + "Can't mix weekYear/weekNumber units with year/month/day or ordinals" + ); + } + + if (containsGregorMD && containsOrdinal) { + throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); + } + + const useWeekData = definiteWeekDef || (normalized.weekday && !containsGregor); + + // configure ourselves to deal with gregorian dates or week stuff + let units, + defaultValues, + objNow = tsToObj(tsNow, offsetProvis); + if (useWeekData) { + units = orderedWeekUnits; + defaultValues = defaultWeekUnitValues; + objNow = gregorianToWeek(objNow, minDaysInFirstWeek, startOfWeek); + } else if (containsOrdinal) { + units = orderedOrdinalUnits; + defaultValues = defaultOrdinalUnitValues; + objNow = gregorianToOrdinal(objNow); + } else { + units = orderedUnits; + defaultValues = defaultUnitValues; + } + + // set default values for missing stuff + let foundFirst = false; + for (const u of units) { + const v = normalized[u]; + if (!isUndefined(v)) { + foundFirst = true; + } else if (foundFirst) { + normalized[u] = defaultValues[u]; + } else { + normalized[u] = objNow[u]; + } + } + + // make sure the values we have are in range + const higherOrderInvalid = useWeekData + ? hasInvalidWeekData(normalized, minDaysInFirstWeek, startOfWeek) + : containsOrdinal + ? hasInvalidOrdinalData(normalized) + : hasInvalidGregorianData(normalized), + invalid = higherOrderInvalid || hasInvalidTimeData(normalized); + + if (invalid) { + return DateTime.invalid(invalid); + } + + // compute the actual time + const gregorian = useWeekData + ? weekToGregorian(normalized, minDaysInFirstWeek, startOfWeek) + : containsOrdinal + ? ordinalToGregorian(normalized) + : normalized, + [tsFinal, offsetFinal] = objToTS(gregorian, offsetProvis, zoneToUse), + inst = new DateTime({ + ts: tsFinal, + zone: zoneToUse, + o: offsetFinal, + loc, + }); + + // gregorian data + weekday serves only to validate + if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) { + return DateTime.invalid( + "mismatched weekday", + `you can't specify both a weekday of ${normalized.weekday} and a date of ${inst.toISO()}` + ); + } + + if (!inst.isValid) { + return DateTime.invalid(inst.invalid); + } + + return inst; + } + + /** + * Create a DateTime from an ISO 8601 string + * @param {string} text - the ISO string + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance + * @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance + * @param {string} [opts.weekSettings] - the week settings to set on the resulting DateTime instance + * @example DateTime.fromISO('2016-05-25T09:08:34.123') + * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00') + * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true}) + * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'}) + * @example DateTime.fromISO('2016-W05-4') + * @return {DateTime} + */ + static fromISO(text, opts = {}) { + const [vals, parsedZone] = parseISODate(text); + return parseDataToDateTime(vals, parsedZone, opts, "ISO 8601", text); + } + + /** + * Create a DateTime from an RFC 2822 string + * @param {string} text - the RFC 2822 string + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in. + * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT') + * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600') + * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z') + * @return {DateTime} + */ + static fromRFC2822(text, opts = {}) { + const [vals, parsedZone] = parseRFC2822Date(text); + return parseDataToDateTime(vals, parsedZone, opts, "RFC 2822", text); + } + + /** + * Create a DateTime from an HTTP header date + * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 + * @param {string} text - the HTTP header date + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in. + * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods. + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT') + * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT') + * @example DateTime.fromHTTP('Sun Nov 6 08:49:37 1994') + * @return {DateTime} + */ + static fromHTTP(text, opts = {}) { + const [vals, parsedZone] = parseHTTPDate(text); + return parseDataToDateTime(vals, parsedZone, opts, "HTTP", opts); + } + + /** + * Create a DateTime from an input string and format string. + * Defaults to en-US if no locale has been specified, regardless of the system's locale. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/parsing?id=table-of-tokens). + * @param {string} text - the string to parse + * @param {string} fmt - the format the string is expected to be in (see the link below for the formats) + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale + * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @return {DateTime} + */ + static fromFormat(text, fmt, opts = {}) { + if (isUndefined(text) || isUndefined(fmt)) { + throw new InvalidArgumentError("fromFormat requires an input string and a format"); + } + + const { locale = null, numberingSystem = null } = opts, + localeToUse = Locale.fromOpts({ + locale, + numberingSystem, + defaultToEN: true, + }), + [vals, parsedZone, specificOffset, invalid] = parseFromTokens(localeToUse, text, fmt); + if (invalid) { + return DateTime.invalid(invalid); + } else { + return parseDataToDateTime(vals, parsedZone, opts, `format ${fmt}`, text, specificOffset); + } + } + + /** + * @deprecated use fromFormat instead + */ + static fromString(text, fmt, opts = {}) { + return DateTime.fromFormat(text, fmt, opts); + } + + /** + * Create a DateTime from a SQL date, time, or datetime + * Defaults to en-US if no locale has been specified, regardless of the system's locale + * @param {string} text - the string to parse + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale + * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @example DateTime.fromSQL('2017-05-15') + * @example DateTime.fromSQL('2017-05-15 09:12:34') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true }) + * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' }) + * @example DateTime.fromSQL('09:12:34.342') + * @return {DateTime} + */ + static fromSQL(text, opts = {}) { + const [vals, parsedZone] = parseSQL(text); + return parseDataToDateTime(vals, parsedZone, opts, "SQL", text); + } + + /** + * Create an invalid DateTime. + * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent. + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {DateTime} + */ + static invalid(reason, explanation = null) { + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the DateTime is invalid"); + } + + const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + + if (Settings.throwOnInvalid) { + throw new InvalidDateTimeError(invalid); + } else { + return new DateTime({ invalid }); + } + } + + /** + * Check if an object is an instance of DateTime. Works across context boundaries + * @param {object} o + * @return {boolean} + */ + static isDateTime(o) { + return (o && o.isLuxonDateTime) || false; + } + + /** + * Produce the format string for a set of options + * @param formatOpts + * @param localeOpts + * @returns {string} + */ + static parseFormatForOpts(formatOpts, localeOpts = {}) { + const tokenList = formatOptsToTokens(formatOpts, Locale.fromObject(localeOpts)); + return !tokenList ? null : tokenList.map((t) => (t ? t.val : null)).join(""); + } + + /** + * Produce the the fully expanded format token for the locale + * Does NOT quote characters, so quoted tokens will not round trip correctly + * @param fmt + * @param localeOpts + * @returns {string} + */ + static expandFormat(fmt, localeOpts = {}) { + const expanded = expandMacroTokens(Formatter.parseFormat(fmt), Locale.fromObject(localeOpts)); + return expanded.map((t) => t.val).join(""); + } + + static resetCache() { + zoneOffsetTs = undefined; + zoneOffsetGuessCache.clear(); + } + + // INFO + + /** + * Get the value of unit. + * @param {string} unit - a unit such as 'minute' or 'day' + * @example DateTime.local(2017, 7, 4).get('month'); //=> 7 + * @example DateTime.local(2017, 7, 4).get('day'); //=> 4 + * @return {number} + */ + get(unit) { + return this[unit]; + } + + /** + * Returns whether the DateTime is valid. Invalid DateTimes occur when: + * * The DateTime was created from invalid calendar information, such as the 13th month or February 30 + * * The DateTime was created by an operation on another invalid date + * @type {boolean} + */ + get isValid() { + return this.invalid === null; + } + + /** + * Returns an error code if this DateTime is invalid, or null if the DateTime is valid + * @type {string} + */ + get invalidReason() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid + * @type {string} + */ + get invalidExplanation() { + return this.invalid ? this.invalid.explanation : null; + } + + /** + * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime + * + * @type {string} + */ + get locale() { + return this.isValid ? this.loc.locale : null; + } + + /** + * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime + * + * @type {string} + */ + get numberingSystem() { + return this.isValid ? this.loc.numberingSystem : null; + } + + /** + * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime + * + * @type {string} + */ + get outputCalendar() { + return this.isValid ? this.loc.outputCalendar : null; + } + + /** + * Get the time zone associated with this DateTime. + * @type {Zone} + */ + get zone() { + return this._zone; + } + + /** + * Get the name of the time zone. + * @type {string} + */ + get zoneName() { + return this.isValid ? this.zone.name : null; + } + + /** + * Get the year + * @example DateTime.local(2017, 5, 25).year //=> 2017 + * @type {number} + */ + get year() { + return this.isValid ? this.c.year : NaN; + } + + /** + * Get the quarter + * @example DateTime.local(2017, 5, 25).quarter //=> 2 + * @type {number} + */ + get quarter() { + return this.isValid ? Math.ceil(this.c.month / 3) : NaN; + } + + /** + * Get the month (1-12). + * @example DateTime.local(2017, 5, 25).month //=> 5 + * @type {number} + */ + get month() { + return this.isValid ? this.c.month : NaN; + } + + /** + * Get the day of the month (1-30ish). + * @example DateTime.local(2017, 5, 25).day //=> 25 + * @type {number} + */ + get day() { + return this.isValid ? this.c.day : NaN; + } + + /** + * Get the hour of the day (0-23). + * @example DateTime.local(2017, 5, 25, 9).hour //=> 9 + * @type {number} + */ + get hour() { + return this.isValid ? this.c.hour : NaN; + } + + /** + * Get the minute of the hour (0-59). + * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30 + * @type {number} + */ + get minute() { + return this.isValid ? this.c.minute : NaN; + } + + /** + * Get the second of the minute (0-59). + * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52 + * @type {number} + */ + get second() { + return this.isValid ? this.c.second : NaN; + } + + /** + * Get the millisecond of the second (0-999). + * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654 + * @type {number} + */ + get millisecond() { + return this.isValid ? this.c.millisecond : NaN; + } + + /** + * Get the week year + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2014, 12, 31).weekYear //=> 2015 + * @type {number} + */ + get weekYear() { + return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN; + } + + /** + * Get the week number of the week year (1-52ish). + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2017, 5, 25).weekNumber //=> 21 + * @type {number} + */ + get weekNumber() { + return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN; + } + + /** + * Get the day of the week. + * 1 is Monday and 7 is Sunday + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2014, 11, 31).weekday //=> 4 + * @type {number} + */ + get weekday() { + return this.isValid ? possiblyCachedWeekData(this).weekday : NaN; + } + + /** + * Returns true if this date is on a weekend according to the locale, false otherwise + * @returns {boolean} + */ + get isWeekend() { + return this.isValid && this.loc.getWeekendDays().includes(this.weekday); + } + + /** + * Get the day of the week according to the locale. + * 1 is the first day of the week and 7 is the last day of the week. + * If the locale assigns Sunday as the first day of the week, then a date which is a Sunday will return 1, + * @returns {number} + */ + get localWeekday() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekday : NaN; + } + + /** + * Get the week number of the week year according to the locale. Different locales assign week numbers differently, + * because the week can start on different days of the week (see localWeekday) and because a different number of days + * is required for a week to count as the first week of a year. + * @returns {number} + */ + get localWeekNumber() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekNumber : NaN; + } + + /** + * Get the week year according to the locale. Different locales assign week numbers (and therefor week years) + * differently, see localWeekNumber. + * @returns {number} + */ + get localWeekYear() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekYear : NaN; + } + + /** + * Get the ordinal (meaning the day of the year) + * @example DateTime.local(2017, 5, 25).ordinal //=> 145 + * @type {number|DateTime} + */ + get ordinal() { + return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN; + } + + /** + * Get the human readable short month name, such as 'Oct'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).monthShort //=> Oct + * @type {string} + */ + get monthShort() { + return this.isValid ? Info.months("short", { locObj: this.loc })[this.month - 1] : null; + } + + /** + * Get the human readable long month name, such as 'October'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).monthLong //=> October + * @type {string} + */ + get monthLong() { + return this.isValid ? Info.months("long", { locObj: this.loc })[this.month - 1] : null; + } + + /** + * Get the human readable short weekday, such as 'Mon'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon + * @type {string} + */ + get weekdayShort() { + return this.isValid ? Info.weekdays("short", { locObj: this.loc })[this.weekday - 1] : null; + } + + /** + * Get the human readable long weekday, such as 'Monday'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday + * @type {string} + */ + get weekdayLong() { + return this.isValid ? Info.weekdays("long", { locObj: this.loc })[this.weekday - 1] : null; + } + + /** + * Get the UTC offset of this DateTime in minutes + * @example DateTime.now().offset //=> -240 + * @example DateTime.utc().offset //=> 0 + * @type {number} + */ + get offset() { + return this.isValid ? +this.o : NaN; + } + + /** + * Get the short human name for the zone's current offset, for example "EST" or "EDT". + * Defaults to the system's locale if no locale has been specified + * @type {string} + */ + get offsetNameShort() { + if (this.isValid) { + return this.zone.offsetName(this.ts, { + format: "short", + locale: this.locale, + }); + } else { + return null; + } + } + + /** + * Get the long human name for the zone's current offset, for example "Eastern Standard Time" or "Eastern Daylight Time". + * Defaults to the system's locale if no locale has been specified + * @type {string} + */ + get offsetNameLong() { + if (this.isValid) { + return this.zone.offsetName(this.ts, { + format: "long", + locale: this.locale, + }); + } else { + return null; + } + } + + /** + * Get whether this zone's offset ever changes, as in a DST. + * @type {boolean} + */ + get isOffsetFixed() { + return this.isValid ? this.zone.isUniversal : null; + } + + /** + * Get whether the DateTime is in a DST. + * @type {boolean} + */ + get isInDST() { + if (this.isOffsetFixed) { + return false; + } else { + return ( + this.offset > this.set({ month: 1, day: 1 }).offset || + this.offset > this.set({ month: 5 }).offset + ); + } + } + + /** + * Get those DateTimes which have the same local time as this DateTime, but a different offset from UTC + * in this DateTime's zone. During DST changes local time can be ambiguous, for example + * `2023-10-29T02:30:00` in `Europe/Berlin` can have offset `+01:00` or `+02:00`. + * This method will return both possible DateTimes if this DateTime's local time is ambiguous. + * @returns {DateTime[]} + */ + getPossibleOffsets() { + if (!this.isValid || this.isOffsetFixed) { + return [this]; + } + const dayMs = 86400000; + const minuteMs = 60000; + const localTS = objToLocalTS(this.c); + const oEarlier = this.zone.offset(localTS - dayMs); + const oLater = this.zone.offset(localTS + dayMs); + + const o1 = this.zone.offset(localTS - oEarlier * minuteMs); + const o2 = this.zone.offset(localTS - oLater * minuteMs); + if (o1 === o2) { + return [this]; + } + const ts1 = localTS - o1 * minuteMs; + const ts2 = localTS - o2 * minuteMs; + const c1 = tsToObj(ts1, o1); + const c2 = tsToObj(ts2, o2); + if ( + c1.hour === c2.hour && + c1.minute === c2.minute && + c1.second === c2.second && + c1.millisecond === c2.millisecond + ) { + return [clone(this, { ts: ts1 }), clone(this, { ts: ts2 })]; + } + return [this]; + } + + /** + * Returns true if this DateTime is in a leap year, false otherwise + * @example DateTime.local(2016).isInLeapYear //=> true + * @example DateTime.local(2013).isInLeapYear //=> false + * @type {boolean} + */ + get isInLeapYear() { + return isLeapYear(this.year); + } + + /** + * Returns the number of days in this DateTime's month + * @example DateTime.local(2016, 2).daysInMonth //=> 29 + * @example DateTime.local(2016, 3).daysInMonth //=> 31 + * @type {number} + */ + get daysInMonth() { + return daysInMonth(this.year, this.month); + } + + /** + * Returns the number of days in this DateTime's year + * @example DateTime.local(2016).daysInYear //=> 366 + * @example DateTime.local(2013).daysInYear //=> 365 + * @type {number} + */ + get daysInYear() { + return this.isValid ? daysInYear(this.year) : NaN; + } + + /** + * Returns the number of weeks in this DateTime's year + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2004).weeksInWeekYear //=> 53 + * @example DateTime.local(2013).weeksInWeekYear //=> 52 + * @type {number} + */ + get weeksInWeekYear() { + return this.isValid ? weeksInWeekYear(this.weekYear) : NaN; + } + + /** + * Returns the number of weeks in this DateTime's local week year + * @example DateTime.local(2020, 6, {locale: 'en-US'}).weeksInLocalWeekYear //=> 52 + * @example DateTime.local(2020, 6, {locale: 'de-DE'}).weeksInLocalWeekYear //=> 53 + * @type {number} + */ + get weeksInLocalWeekYear() { + return this.isValid + ? weeksInWeekYear( + this.localWeekYear, + this.loc.getMinDaysInFirstWeek(), + this.loc.getStartOfWeek() + ) + : NaN; + } + + /** + * Returns the resolved Intl options for this DateTime. + * This is useful in understanding the behavior of formatting methods + * @param {Object} opts - the same options as toLocaleString + * @return {Object} + */ + resolvedLocaleOptions(opts = {}) { + const { locale, numberingSystem, calendar } = Formatter.create( + this.loc.clone(opts), + opts + ).resolvedOptions(this); + return { locale, numberingSystem, outputCalendar: calendar }; + } + + // TRANSFORM + + /** + * "Set" the DateTime's zone to UTC. Returns a newly-constructed DateTime. + * + * Equivalent to {@link DateTime#setZone}('utc') + * @param {number} [offset=0] - optionally, an offset from UTC in minutes + * @param {Object} [opts={}] - options to pass to `setZone()` + * @return {DateTime} + */ + toUTC(offset = 0, opts = {}) { + return this.setZone(FixedOffsetZone.instance(offset), opts); + } + + /** + * "Set" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime. + * + * Equivalent to `setZone('local')` + * @return {DateTime} + */ + toLocal() { + return this.setZone(Settings.defaultZone); + } + + /** + * "Set" the DateTime's zone to specified zone. Returns a newly-constructed DateTime. + * + * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link DateTime#plus}. You may wish to use {@link DateTime#toLocal} and {@link DateTime#toUTC} which provide simple convenience wrappers for commonly used zones. + * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link DateTime#Zone} class. + * @param {Object} opts - options + * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this. + * @return {DateTime} + */ + setZone(zone, { keepLocalTime = false, keepCalendarTime = false } = {}) { + zone = normalizeZone(zone, Settings.defaultZone); + if (zone.equals(this.zone)) { + return this; + } else if (!zone.isValid) { + return DateTime.invalid(unsupportedZone(zone)); + } else { + let newTS = this.ts; + if (keepLocalTime || keepCalendarTime) { + const offsetGuess = zone.offset(this.ts); + const asObj = this.toObject(); + [newTS] = objToTS(asObj, offsetGuess, zone); + } + return clone(this, { ts: newTS, zone }); + } + } + + /** + * "Set" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime. + * @param {Object} properties - the properties to set + * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' }) + * @return {DateTime} + */ + reconfigure({ locale, numberingSystem, outputCalendar } = {}) { + const loc = this.loc.clone({ locale, numberingSystem, outputCalendar }); + return clone(this, { loc }); + } + + /** + * "Set" the locale. Returns a newly-constructed DateTime. + * Just a convenient alias for reconfigure({ locale }) + * @example DateTime.local(2017, 5, 25).setLocale('en-GB') + * @return {DateTime} + */ + setLocale(locale) { + return this.reconfigure({ locale }); + } + + /** + * "Set" the values of specified units. Returns a newly-constructed DateTime. + * You can only set units with this method; for "setting" metadata, see {@link DateTime#reconfigure} and {@link DateTime#setZone}. + * + * This method also supports setting locale-based week units, i.e. `localWeekday`, `localWeekNumber` and `localWeekYear`. + * They cannot be mixed with ISO-week units like `weekday`. + * @param {Object} values - a mapping of units to numbers + * @example dt.set({ year: 2017 }) + * @example dt.set({ hour: 8, minute: 30 }) + * @example dt.set({ weekday: 5 }) + * @example dt.set({ year: 2005, ordinal: 234 }) + * @return {DateTime} + */ + set(values) { + if (!this.isValid) return this; + + const normalized = normalizeObject(values, normalizeUnitWithLocalWeeks); + const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, this.loc); + + const settingWeekStuff = + !isUndefined(normalized.weekYear) || + !isUndefined(normalized.weekNumber) || + !isUndefined(normalized.weekday), + containsOrdinal = !isUndefined(normalized.ordinal), + containsGregorYear = !isUndefined(normalized.year), + containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), + containsGregor = containsGregorYear || containsGregorMD, + definiteWeekDef = normalized.weekYear || normalized.weekNumber; + + if ((containsGregor || containsOrdinal) && definiteWeekDef) { + throw new ConflictingSpecificationError( + "Can't mix weekYear/weekNumber units with year/month/day or ordinals" + ); + } + + if (containsGregorMD && containsOrdinal) { + throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); + } + + let mixed; + if (settingWeekStuff) { + mixed = weekToGregorian( + { ...gregorianToWeek(this.c, minDaysInFirstWeek, startOfWeek), ...normalized }, + minDaysInFirstWeek, + startOfWeek + ); + } else if (!isUndefined(normalized.ordinal)) { + mixed = ordinalToGregorian({ ...gregorianToOrdinal(this.c), ...normalized }); + } else { + mixed = { ...this.toObject(), ...normalized }; + + // if we didn't set the day but we ended up on an overflow date, + // use the last day of the right month + if (isUndefined(normalized.day)) { + mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day); + } + } + + const [ts, o] = objToTS(mixed, this.o, this.zone); + return clone(this, { ts, o }); + } + + /** + * Add a period of time to this DateTime and return the resulting DateTime + * + * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between. + * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @example DateTime.now().plus(123) //~> in 123 milliseconds + * @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes + * @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow + * @example DateTime.now().plus({ days: -1 }) //~> this time yesterday + * @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min + * @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min + * @return {DateTime} + */ + plus(duration) { + if (!this.isValid) return this; + const dur = Duration.fromDurationLike(duration); + return clone(this, adjustTime(this, dur)); + } + + /** + * Subtract a period of time to this DateTime and return the resulting DateTime + * See {@link DateTime#plus} + * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + @return {DateTime} + */ + minus(duration) { + if (!this.isValid) return this; + const dur = Duration.fromDurationLike(duration).negate(); + return clone(this, adjustTime(this, dur)); + } + + /** + * "Set" this DateTime to the beginning of a unit of time. + * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week + * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01' + * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01' + * @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays + * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00' + * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00' + * @return {DateTime} + */ + startOf(unit, { useLocaleWeeks = false } = {}) { + if (!this.isValid) return this; + + const o = {}, + normalizedUnit = Duration.normalizeUnit(unit); + switch (normalizedUnit) { + case "years": + o.month = 1; + // falls through + case "quarters": + case "months": + o.day = 1; + // falls through + case "weeks": + case "days": + o.hour = 0; + // falls through + case "hours": + o.minute = 0; + // falls through + case "minutes": + o.second = 0; + // falls through + case "seconds": + o.millisecond = 0; + break; + // no default, invalid units throw in normalizeUnit() + } + + if (normalizedUnit === "weeks") { + if (useLocaleWeeks) { + const startOfWeek = this.loc.getStartOfWeek(); + const { weekday } = this; + if (weekday < startOfWeek) { + o.weekNumber = this.weekNumber - 1; + } + o.weekday = startOfWeek; + } else { + o.weekday = 1; + } + } + + if (normalizedUnit === "quarters") { + const q = Math.ceil(this.month / 3); + o.month = (q - 1) * 3 + 1; + } + + return this.set(o); + } + + /** + * "Set" this DateTime to the end (meaning the last millisecond) of a unit of time + * @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week + * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays + * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00' + * @return {DateTime} + */ + endOf(unit, opts) { + return this.isValid + ? this.plus({ [unit]: 1 }) + .startOf(unit, opts) + .minus(1) + : this; + } + + // OUTPUT + + /** + * Returns a string representation of this DateTime formatted according to the specified format string. + * **You may not want this.** See {@link DateTime#toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/formatting?id=table-of-tokens). + * Defaults to en-US if no locale has been specified, regardless of the system's locale. + * @param {string} fmt - the format string + * @param {Object} opts - opts to override the configuration options on this DateTime + * @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22' + * @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22' + * @example DateTime.now().toFormat('yyyy LLL dd', { locale: "fr" }) //=> '2017 avr. 22' + * @example DateTime.now().toFormat("HH 'hours and' mm 'minutes'") //=> '20 hours and 55 minutes' + * @return {string} + */ + toFormat(fmt, opts = {}) { + return this.isValid + ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt) + : INVALID; + } + + /** + * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`. + * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation + * of the DateTime in the assigned locale. + * Defaults to the system's locale if no locale has been specified + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param formatOpts {Object} - Intl.DateTimeFormat constructor options and configuration options + * @param {Object} opts - opts to override the configuration options on this DateTime + * @example DateTime.now().toLocaleString(); //=> 4/20/2017 + * @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017' + * @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017' + * @example DateTime.now().toLocaleString(DateTime.DATE_FULL, { locale: 'fr' }); //=> '28 août 2022' + * @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM' + * @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM' + * @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20' + * @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM' + * @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }); //=> '11:32' + * @return {string} + */ + toLocaleString(formatOpts = DATE_SHORT, opts = {}) { + return this.isValid + ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this) + : INVALID; + } + + /** + * Returns an array of format "parts", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output. + * Defaults to the system's locale if no locale has been specified + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts + * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`. + * @example DateTime.now().toLocaleParts(); //=> [ + * //=> { type: 'day', value: '25' }, + * //=> { type: 'literal', value: '/' }, + * //=> { type: 'month', value: '05' }, + * //=> { type: 'literal', value: '/' }, + * //=> { type: 'year', value: '1982' } + * //=> ] + */ + toLocaleParts(opts = {}) { + return this.isValid + ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this) + : []; + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.extendedZone=false] - add the time zone format extension + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'years', 'months', 'days', 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0. + * @example DateTime.utc(1983, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z' + * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00' + * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335' + * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400' + * @example DateTime.now().toISO({ precision: 'day' }) //=> '2017-04-22Z' + * @example DateTime.now().toISO({ precision: 'minute' }) //=> '2017-04-22T20:47Z' + * @return {string|null} + */ + toISO({ + format = "extended", + suppressSeconds = false, + suppressMilliseconds = false, + includeOffset = true, + extendedZone = false, + precision = "milliseconds", + } = {}) { + if (!this.isValid) { + return null; + } + + precision = normalizeUnit(precision); + const ext = format === "extended"; + + let c = toISODate(this, ext, precision); + if (orderedUnits.indexOf(precision) >= 3) c += "T"; + c += toISOTime( + this, + ext, + suppressSeconds, + suppressMilliseconds, + includeOffset, + extendedZone, + precision + ); + return c; + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's date component + * @param {Object} opts - options + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='day'] - truncate output to desired precision: 'years', 'months', or 'days'. + * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25' + * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525' + * @example DateTime.utc(1982, 5, 25).toISODate({ precision: 'month' }) //=> '1982-05' + * @return {string|null} + */ + toISODate({ format = "extended", precision = "day" } = {}) { + if (!this.isValid) { + return null; + } + return toISODate(this, format === "extended", normalizeUnit(precision)); + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's week date + * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2' + * @return {string} + */ + toISOWeekDate() { + return toTechFormat(this, "kkkk-'W'WW-c"); + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's time component + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.extendedZone=true] - add the time zone format extension + * @param {boolean} [opts.includePrefix=false] - include the `T` prefix + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0. + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z' + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34, second: 56 }).toISOTime({ precision: 'minute' }) //=> '07:34Z' + * @return {string} + */ + toISOTime({ + suppressMilliseconds = false, + suppressSeconds = false, + includeOffset = true, + includePrefix = false, + extendedZone = false, + format = "extended", + precision = "milliseconds", + } = {}) { + if (!this.isValid) { + return null; + } + + precision = normalizeUnit(precision); + let c = includePrefix && orderedUnits.indexOf(precision) >= 3 ? "T" : ""; + return ( + c + + toISOTime( + this, + format === "extended", + suppressSeconds, + suppressMilliseconds, + includeOffset, + extendedZone, + precision + ) + ); + } + + /** + * Returns an RFC 2822-compatible string representation of this DateTime + * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000' + * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400' + * @return {string} + */ + toRFC2822() { + return toTechFormat(this, "EEE, dd LLL yyyy HH:mm:ss ZZZ", false); + } + + /** + * Returns a string representation of this DateTime appropriate for use in HTTP headers. The output is always expressed in GMT. + * Specifically, the string conforms to RFC 1123. + * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 + * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT' + * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT' + * @return {string} + */ + toHTTP() { + return toTechFormat(this.toUTC(), "EEE, dd LLL yyyy HH:mm:ss 'GMT'"); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL Date + * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13' + * @return {string|null} + */ + toSQLDate() { + if (!this.isValid) { + return null; + } + return toISODate(this, true); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL Time + * @param {Object} opts - options + * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset. + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00' + * @example DateTime.utc().toSQL() //=> '05:15:16.345' + * @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00' + * @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345' + * @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York' + * @return {string} + */ + toSQLTime({ includeOffset = true, includeZone = false, includeOffsetSpace = true } = {}) { + let fmt = "HH:mm:ss.SSS"; + + if (includeZone || includeOffset) { + if (includeOffsetSpace) { + fmt += " "; + } + if (includeZone) { + fmt += "z"; + } else if (includeOffset) { + fmt += "ZZ"; + } + } + + return toTechFormat(this, fmt, true); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL DateTime + * @param {Object} opts - options + * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset. + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00' + * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z' + * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00' + * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000' + * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York' + * @return {string} + */ + toSQL(opts = {}) { + if (!this.isValid) { + return null; + } + + return `${this.toSQLDate()} ${this.toSQLTime(opts)}`; + } + + /** + * Returns a string representation of this DateTime appropriate for debugging + * @return {string} + */ + toString() { + return this.isValid ? this.toISO() : INVALID; + } + + /** + * Returns a string representation of this DateTime appropriate for the REPL. + * @return {string} + */ + [Symbol.for("nodejs.util.inspect.custom")]() { + if (this.isValid) { + return `DateTime { ts: ${this.toISO()}, zone: ${this.zone.name}, locale: ${this.locale} }`; + } else { + return `DateTime { Invalid, reason: ${this.invalidReason} }`; + } + } + + /** + * Returns the epoch milliseconds of this DateTime. Alias of {@link DateTime#toMillis} + * @return {number} + */ + valueOf() { + return this.toMillis(); + } + + /** + * Returns the epoch milliseconds of this DateTime. + * @return {number} + */ + toMillis() { + return this.isValid ? this.ts : NaN; + } + + /** + * Returns the epoch seconds (including milliseconds in the fractional part) of this DateTime. + * @return {number} + */ + toSeconds() { + return this.isValid ? this.ts / 1000 : NaN; + } + + /** + * Returns the epoch seconds (as a whole number) of this DateTime. + * @return {number} + */ + toUnixInteger() { + return this.isValid ? Math.floor(this.ts / 1000) : NaN; + } + + /** + * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON. + * @return {string} + */ + toJSON() { + return this.toISO(); + } + + /** + * Returns a BSON serializable equivalent to this DateTime. + * @return {Date} + */ + toBSON() { + return this.toJSDate(); + } + + /** + * Returns a JavaScript object with this DateTime's year, month, day, and so on. + * @param opts - options for generating the object + * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output + * @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 } + * @return {Object} + */ + toObject(opts = {}) { + if (!this.isValid) return {}; + + const base = { ...this.c }; + + if (opts.includeConfig) { + base.outputCalendar = this.outputCalendar; + base.numberingSystem = this.loc.numberingSystem; + base.locale = this.loc.locale; + } + return base; + } + + /** + * Returns a JavaScript Date equivalent to this DateTime. + * @return {Date} + */ + toJSDate() { + return new Date(this.isValid ? this.ts : NaN); + } + + // COMPARE + + /** + * Return the difference between two DateTimes as a Duration. + * @param {DateTime} otherDateTime - the DateTime to compare this one to + * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration. + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @example + * var i1 = DateTime.fromISO('1982-05-25T09:45'), + * i2 = DateTime.fromISO('1983-10-14T10:30'); + * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 } + * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 } + * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 } + * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 } + * @return {Duration} + */ + diff(otherDateTime, unit = "milliseconds", opts = {}) { + if (!this.isValid || !otherDateTime.isValid) { + return Duration.invalid("created by diffing an invalid DateTime"); + } + + const durOpts = { locale: this.locale, numberingSystem: this.numberingSystem, ...opts }; + + const units = maybeArray(unit).map(Duration.normalizeUnit), + otherIsLater = otherDateTime.valueOf() > this.valueOf(), + earlier = otherIsLater ? this : otherDateTime, + later = otherIsLater ? otherDateTime : this, + diffed = diff(earlier, later, units, durOpts); + + return otherIsLater ? diffed.negate() : diffed; + } + + /** + * Return the difference between this DateTime and right now. + * See {@link DateTime#diff} + * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @return {Duration} + */ + diffNow(unit = "milliseconds", opts = {}) { + return this.diff(DateTime.now(), unit, opts); + } + + /** + * Return an Interval spanning between this DateTime and another DateTime + * @param {DateTime} otherDateTime - the other end point of the Interval + * @return {Interval|DateTime} + */ + until(otherDateTime) { + return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this; + } + + /** + * Return whether this DateTime is in the same unit of time as another DateTime. + * Higher-order units must also be identical for this function to return `true`. + * Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link DateTime#setZone} to convert one of the dates if needed. + * @param {DateTime} otherDateTime - the other DateTime + * @param {string} unit - the unit of time to check sameness on + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; only the locale of this DateTime is used + * @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day + * @return {boolean} + */ + hasSame(otherDateTime, unit, opts) { + if (!this.isValid) return false; + + const inputMs = otherDateTime.valueOf(); + const adjustedToZone = this.setZone(otherDateTime.zone, { keepLocalTime: true }); + return ( + adjustedToZone.startOf(unit, opts) <= inputMs && inputMs <= adjustedToZone.endOf(unit, opts) + ); + } + + /** + * Equality check + * Two DateTimes are equal if and only if they represent the same millisecond, have the same zone and location, and are both valid. + * To compare just the millisecond values, use `+dt1 === +dt2`. + * @param {DateTime} other - the other DateTime + * @return {boolean} + */ + equals(other) { + return ( + this.isValid && + other.isValid && + this.valueOf() === other.valueOf() && + this.zone.equals(other.zone) && + this.loc.equals(other.loc) + ); + } + + /** + * Returns a string representation of a this time relative to now, such as "in two days". Can only internationalize if your + * platform supports Intl.RelativeTimeFormat. Rounds towards zero by default. + * @param {Object} options - options that affect the output + * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now. + * @param {string} [options.style="long"] - the style of units, must be "long", "short", or "narrow" + * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of "years", "quarters", "months", "weeks", "days", "hours", "minutes", or "seconds" + * @param {boolean} [options.round=true] - whether to round the numbers in the output. + * @param {string} [options.rounding="trunc"] - rounding method to use when rounding the numbers in the output. Can be "trunc" (toward zero), "expand" (away from zero), "round", "floor", or "ceil". + * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding. + * @param {string} options.locale - override the locale of this DateTime + * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this + * @example DateTime.now().plus({ days: 1 }).toRelative() //=> "in 1 day" + * @example DateTime.now().setLocale("es").toRelative({ days: 1 }) //=> "dentro de 1 día" + * @example DateTime.now().plus({ days: 1 }).toRelative({ locale: "fr" }) //=> "dans 23 heures" + * @example DateTime.now().minus({ days: 2 }).toRelative() //=> "2 days ago" + * @example DateTime.now().minus({ days: 2 }).toRelative({ unit: "hours" }) //=> "48 hours ago" + * @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> "1.5 days ago" + */ + toRelative(options = {}) { + if (!this.isValid) return null; + const base = options.base || DateTime.fromObject({}, { zone: this.zone }), + padding = options.padding ? (this < base ? -options.padding : options.padding) : 0; + let units = ["years", "months", "days", "hours", "minutes", "seconds"]; + let unit = options.unit; + if (Array.isArray(options.unit)) { + units = options.unit; + unit = undefined; + } + return diffRelative(base, this.plus(padding), { + ...options, + numeric: "always", + units, + unit, + }); + } + + /** + * Returns a string representation of this date relative to today, such as "yesterday" or "next month". + * Only internationalizes on platforms that supports Intl.RelativeTimeFormat. + * @param {Object} options - options that affect the output + * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now. + * @param {string} options.locale - override the locale of this DateTime + * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of "years", "quarters", "months", "weeks", or "days" + * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this + * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> "tomorrow" + * @example DateTime.now().setLocale("es").plus({ days: 1 }).toRelative() //=> ""mañana" + * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: "fr" }) //=> "demain" + * @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> "2 days ago" + */ + toRelativeCalendar(options = {}) { + if (!this.isValid) return null; + + return diffRelative(options.base || DateTime.fromObject({}, { zone: this.zone }), this, { + ...options, + numeric: "auto", + units: ["years", "months", "days"], + calendary: true, + }); + } + + /** + * Return the min of several date times + * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum + * @return {DateTime} the min DateTime, or undefined if called with no argument + */ + static min(...dateTimes) { + if (!dateTimes.every(DateTime.isDateTime)) { + throw new InvalidArgumentError("min requires all arguments be DateTimes"); + } + return bestBy(dateTimes, (i) => i.valueOf(), Math.min); + } + + /** + * Return the max of several date times + * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum + * @return {DateTime} the max DateTime, or undefined if called with no argument + */ + static max(...dateTimes) { + if (!dateTimes.every(DateTime.isDateTime)) { + throw new InvalidArgumentError("max requires all arguments be DateTimes"); + } + return bestBy(dateTimes, (i) => i.valueOf(), Math.max); + } + + // MISC + + /** + * Explain how a string would be parsed by fromFormat() + * @param {string} text - the string to parse + * @param {string} fmt - the format the string is expected to be in (see description) + * @param {Object} options - options taken by fromFormat() + * @return {Object} + */ + static fromFormatExplain(text, fmt, options = {}) { + const { locale = null, numberingSystem = null } = options, + localeToUse = Locale.fromOpts({ + locale, + numberingSystem, + defaultToEN: true, + }); + return explainFromTokens(localeToUse, text, fmt); + } + + /** + * @deprecated use fromFormatExplain instead + */ + static fromStringExplain(text, fmt, options = {}) { + return DateTime.fromFormatExplain(text, fmt, options); + } + + /** + * Build a parser for `fmt` using the given locale. This parser can be passed + * to {@link DateTime.fromFormatParser} to a parse a date in this format. This + * can be used to optimize cases where many dates need to be parsed in a + * specific format. + * + * @param {String} fmt - the format the string is expected to be in (see + * description) + * @param {Object} options - options used to set locale and numberingSystem + * for parser + * @returns {TokenParser} - opaque object to be used + */ + static buildFormatParser(fmt, options = {}) { + const { locale = null, numberingSystem = null } = options, + localeToUse = Locale.fromOpts({ + locale, + numberingSystem, + defaultToEN: true, + }); + return new TokenParser(localeToUse, fmt); + } + + /** + * Create a DateTime from an input string and format parser. + * + * The format parser must have been created with the same locale as this call. + * + * @param {String} text - the string to parse + * @param {TokenParser} formatParser - parser from {@link DateTime.buildFormatParser} + * @param {Object} opts - options taken by fromFormat() + * @returns {DateTime} + */ + static fromFormatParser(text, formatParser, opts = {}) { + if (isUndefined(text) || isUndefined(formatParser)) { + throw new InvalidArgumentError( + "fromFormatParser requires an input string and a format parser" + ); + } + const { locale = null, numberingSystem = null } = opts, + localeToUse = Locale.fromOpts({ + locale, + numberingSystem, + defaultToEN: true, + }); + + if (!localeToUse.equals(formatParser.locale)) { + throw new InvalidArgumentError( + `fromFormatParser called with a locale of ${localeToUse}, ` + + `but the format parser was created for ${formatParser.locale}` + ); + } + + const { result, zone, specificOffset, invalidReason } = formatParser.explainFromTokens(text); + + if (invalidReason) { + return DateTime.invalid(invalidReason); + } else { + return parseDataToDateTime( + result, + zone, + opts, + `format ${formatParser.format}`, + text, + specificOffset + ); + } + } + + // FORMAT PRESETS + + /** + * {@link DateTime#toLocaleString} format like 10/14/1983 + * @type {Object} + */ + static get DATE_SHORT() { + return DATE_SHORT; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983' + * @type {Object} + */ + static get DATE_MED() { + return DATE_MED; + } + + /** + * {@link DateTime#toLocaleString} format like 'Fri, Oct 14, 1983' + * @type {Object} + */ + static get DATE_MED_WITH_WEEKDAY() { + return DATE_MED_WITH_WEEKDAY; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983' + * @type {Object} + */ + static get DATE_FULL() { + return DATE_FULL; + } + + /** + * {@link DateTime#toLocaleString} format like 'Tuesday, October 14, 1983' + * @type {Object} + */ + static get DATE_HUGE() { + return DATE_HUGE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + static get TIME_SIMPLE() { + return TIME_SIMPLE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + static get TIME_WITH_SECONDS() { + return TIME_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + static get TIME_WITH_SHORT_OFFSET() { + return TIME_WITH_SHORT_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + static get TIME_WITH_LONG_OFFSET() { + return TIME_WITH_LONG_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30', always 24-hour. + * @type {Object} + */ + static get TIME_24_SIMPLE() { + return TIME_24_SIMPLE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23', always 24-hour. + * @type {Object} + */ + static get TIME_24_WITH_SECONDS() { + return TIME_24_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 EDT', always 24-hour. + * @type {Object} + */ + static get TIME_24_WITH_SHORT_OFFSET() { + return TIME_24_WITH_SHORT_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour. + * @type {Object} + */ + static get TIME_24_WITH_LONG_OFFSET() { + return TIME_24_WITH_LONG_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_SHORT() { + return DATETIME_SHORT; + } + + /** + * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_SHORT_WITH_SECONDS() { + return DATETIME_SHORT_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_MED() { + return DATETIME_MED; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_MED_WITH_SECONDS() { + return DATETIME_MED_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_MED_WITH_WEEKDAY() { + return DATETIME_MED_WITH_WEEKDAY; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_FULL() { + return DATETIME_FULL; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_FULL_WITH_SECONDS() { + return DATETIME_FULL_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_HUGE() { + return DATETIME_HUGE; + } + + /** + * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_HUGE_WITH_SECONDS() { + return DATETIME_HUGE_WITH_SECONDS; + } +} + +/** + * @private + */ +function friendlyDateTime(dateTimeish) { + if (DateTime.isDateTime(dateTimeish)) { + return dateTimeish; + } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) { + return DateTime.fromJSDate(dateTimeish); + } else if (dateTimeish && typeof dateTimeish === "object") { + return DateTime.fromObject(dateTimeish); + } else { + throw new InvalidArgumentError( + `Unknown datetime argument: ${dateTimeish}, of type ${typeof dateTimeish}` + ); + } +} + +const VERSION = "3.7.2"; + +export { DateTime, Duration, FixedOffsetZone, IANAZone, Info, Interval, InvalidZone, Settings, SystemZone, VERSION, Zone }; +//# sourceMappingURL=luxon.mjs.map diff --git a/node_modules/luxon/build/es6/luxon.mjs.map b/node_modules/luxon/build/es6/luxon.mjs.map new file mode 100644 index 00000000..68f1cf70 --- /dev/null +++ b/node_modules/luxon/build/es6/luxon.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"luxon.mjs","sources":["../../src/errors.js","../../src/impl/formats.js","../../src/zone.js","../../src/zones/systemZone.js","../../src/zones/IANAZone.js","../../src/impl/locale.js","../../src/zones/fixedOffsetZone.js","../../src/zones/invalidZone.js","../../src/impl/zoneUtil.js","../../src/impl/digits.js","../../src/settings.js","../../src/impl/invalid.js","../../src/impl/conversions.js","../../src/impl/util.js","../../src/impl/english.js","../../src/impl/formatter.js","../../src/impl/regexParser.js","../../src/duration.js","../../src/interval.js","../../src/info.js","../../src/impl/diff.js","../../src/impl/tokenParser.js","../../src/datetime.js","../../src/luxon.js"],"sourcesContent":["// these aren't really private, but nor are they really useful to document\n\n/**\n * @private\n */\nclass LuxonError extends Error {}\n\n/**\n * @private\n */\nexport class InvalidDateTimeError extends LuxonError {\n constructor(reason) {\n super(`Invalid DateTime: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidIntervalError extends LuxonError {\n constructor(reason) {\n super(`Invalid Interval: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidDurationError extends LuxonError {\n constructor(reason) {\n super(`Invalid Duration: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class ConflictingSpecificationError extends LuxonError {}\n\n/**\n * @private\n */\nexport class InvalidUnitError extends LuxonError {\n constructor(unit) {\n super(`Invalid unit ${unit}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidArgumentError extends LuxonError {}\n\n/**\n * @private\n */\nexport class ZoneIsAbstractError extends LuxonError {\n constructor() {\n super(\"Zone is an abstract class\");\n }\n}\n","/**\n * @private\n */\n\nconst n = \"numeric\",\n s = \"short\",\n l = \"long\";\n\nexport const DATE_SHORT = {\n year: n,\n month: n,\n day: n,\n};\n\nexport const DATE_MED = {\n year: n,\n month: s,\n day: n,\n};\n\nexport const DATE_MED_WITH_WEEKDAY = {\n year: n,\n month: s,\n day: n,\n weekday: s,\n};\n\nexport const DATE_FULL = {\n year: n,\n month: l,\n day: n,\n};\n\nexport const DATE_HUGE = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n};\n\nexport const TIME_SIMPLE = {\n hour: n,\n minute: n,\n};\n\nexport const TIME_WITH_SECONDS = {\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const TIME_WITH_SHORT_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n timeZoneName: s,\n};\n\nexport const TIME_WITH_LONG_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n timeZoneName: l,\n};\n\nexport const TIME_24_SIMPLE = {\n hour: n,\n minute: n,\n hourCycle: \"h23\",\n};\n\nexport const TIME_24_WITH_SECONDS = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n};\n\nexport const TIME_24_WITH_SHORT_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n timeZoneName: s,\n};\n\nexport const TIME_24_WITH_LONG_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n timeZoneName: l,\n};\n\nexport const DATETIME_SHORT = {\n year: n,\n month: n,\n day: n,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_SHORT_WITH_SECONDS = {\n year: n,\n month: n,\n day: n,\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const DATETIME_MED = {\n year: n,\n month: s,\n day: n,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_MED_WITH_SECONDS = {\n year: n,\n month: s,\n day: n,\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const DATETIME_MED_WITH_WEEKDAY = {\n year: n,\n month: s,\n day: n,\n weekday: s,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_FULL = {\n year: n,\n month: l,\n day: n,\n hour: n,\n minute: n,\n timeZoneName: s,\n};\n\nexport const DATETIME_FULL_WITH_SECONDS = {\n year: n,\n month: l,\n day: n,\n hour: n,\n minute: n,\n second: n,\n timeZoneName: s,\n};\n\nexport const DATETIME_HUGE = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n hour: n,\n minute: n,\n timeZoneName: l,\n};\n\nexport const DATETIME_HUGE_WITH_SECONDS = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n hour: n,\n minute: n,\n second: n,\n timeZoneName: l,\n};\n","import { ZoneIsAbstractError } from \"./errors.js\";\n\n/**\n * @interface\n */\nexport default class Zone {\n /**\n * The type of zone\n * @abstract\n * @type {string}\n */\n get type() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * The name of this zone.\n * @abstract\n * @type {string}\n */\n get name() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * The IANA name of this zone.\n * Defaults to `name` if not overwritten by a subclass.\n * @abstract\n * @type {string}\n */\n get ianaName() {\n return this.name;\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year.\n * @abstract\n * @type {boolean}\n */\n get isUniversal() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Returns the offset's common name (such as EST) at the specified timestamp\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to get the name\n * @param {Object} opts - Options to affect the format\n * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.\n * @param {string} opts.locale - What locale to return the offset name in.\n * @return {string}\n */\n offsetName(ts, opts) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Returns the offset's value as a string\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to compute the offset\n * @return {number}\n */\n offset(ts) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return whether this Zone is equal to another zone\n * @abstract\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return whether this Zone is valid.\n * @abstract\n * @type {boolean}\n */\n get isValid() {\n throw new ZoneIsAbstractError();\n }\n}\n","import { formatOffset, parseZoneInfo } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet singleton = null;\n\n/**\n * Represents the local zone for this JavaScript environment.\n * @implements {Zone}\n */\nexport default class SystemZone extends Zone {\n /**\n * Get a singleton instance of the local zone\n * @return {SystemZone}\n */\n static get instance() {\n if (singleton === null) {\n singleton = new SystemZone();\n }\n return singleton;\n }\n\n /** @override **/\n get type() {\n return \"system\";\n }\n\n /** @override **/\n get name() {\n return new Intl.DateTimeFormat().resolvedOptions().timeZone;\n }\n\n /** @override **/\n get isUniversal() {\n return false;\n }\n\n /** @override **/\n offsetName(ts, { format, locale }) {\n return parseZoneInfo(ts, format, locale);\n }\n\n /** @override **/\n formatOffset(ts, format) {\n return formatOffset(this.offset(ts), format);\n }\n\n /** @override **/\n offset(ts) {\n return -new Date(ts).getTimezoneOffset();\n }\n\n /** @override **/\n equals(otherZone) {\n return otherZone.type === \"system\";\n }\n\n /** @override **/\n get isValid() {\n return true;\n }\n}\n","import { formatOffset, parseZoneInfo, isUndefined, objToLocalTS } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nconst dtfCache = new Map();\nfunction makeDTF(zoneName) {\n let dtf = dtfCache.get(zoneName);\n if (dtf === undefined) {\n dtf = new Intl.DateTimeFormat(\"en-US\", {\n hour12: false,\n timeZone: zoneName,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n era: \"short\",\n });\n dtfCache.set(zoneName, dtf);\n }\n return dtf;\n}\n\nconst typeToPos = {\n year: 0,\n month: 1,\n day: 2,\n era: 3,\n hour: 4,\n minute: 5,\n second: 6,\n};\n\nfunction hackyOffset(dtf, date) {\n const formatted = dtf.format(date).replace(/\\u200E/g, \"\"),\n parsed = /(\\d+)\\/(\\d+)\\/(\\d+) (AD|BC),? (\\d+):(\\d+):(\\d+)/.exec(formatted),\n [, fMonth, fDay, fYear, fadOrBc, fHour, fMinute, fSecond] = parsed;\n return [fYear, fMonth, fDay, fadOrBc, fHour, fMinute, fSecond];\n}\n\nfunction partsOffset(dtf, date) {\n const formatted = dtf.formatToParts(date);\n const filled = [];\n for (let i = 0; i < formatted.length; i++) {\n const { type, value } = formatted[i];\n const pos = typeToPos[type];\n\n if (type === \"era\") {\n filled[pos] = value;\n } else if (!isUndefined(pos)) {\n filled[pos] = parseInt(value, 10);\n }\n }\n return filled;\n}\n\nconst ianaZoneCache = new Map();\n/**\n * A zone identified by an IANA identifier, like America/New_York\n * @implements {Zone}\n */\nexport default class IANAZone extends Zone {\n /**\n * @param {string} name - Zone name\n * @return {IANAZone}\n */\n static create(name) {\n let zone = ianaZoneCache.get(name);\n if (zone === undefined) {\n ianaZoneCache.set(name, (zone = new IANAZone(name)));\n }\n return zone;\n }\n\n /**\n * Reset local caches. Should only be necessary in testing scenarios.\n * @return {void}\n */\n static resetCache() {\n ianaZoneCache.clear();\n dtfCache.clear();\n }\n\n /**\n * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that.\n * @param {string} s - The string to check validity on\n * @example IANAZone.isValidSpecifier(\"America/New_York\") //=> true\n * @example IANAZone.isValidSpecifier(\"Sport~~blorp\") //=> false\n * @deprecated For backward compatibility, this forwards to isValidZone, better use `isValidZone()` directly instead.\n * @return {boolean}\n */\n static isValidSpecifier(s) {\n return this.isValidZone(s);\n }\n\n /**\n * Returns whether the provided string identifies a real zone\n * @param {string} zone - The string to check\n * @example IANAZone.isValidZone(\"America/New_York\") //=> true\n * @example IANAZone.isValidZone(\"Fantasia/Castle\") //=> false\n * @example IANAZone.isValidZone(\"Sport~~blorp\") //=> false\n * @return {boolean}\n */\n static isValidZone(zone) {\n if (!zone) {\n return false;\n }\n try {\n new Intl.DateTimeFormat(\"en-US\", { timeZone: zone }).format();\n return true;\n } catch (e) {\n return false;\n }\n }\n\n constructor(name) {\n super();\n /** @private **/\n this.zoneName = name;\n /** @private **/\n this.valid = IANAZone.isValidZone(name);\n }\n\n /**\n * The type of zone. `iana` for all instances of `IANAZone`.\n * @override\n * @type {string}\n */\n get type() {\n return \"iana\";\n }\n\n /**\n * The name of this zone (i.e. the IANA zone name).\n * @override\n * @type {string}\n */\n get name() {\n return this.zoneName;\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year:\n * Always returns false for all IANA zones.\n * @override\n * @type {boolean}\n */\n get isUniversal() {\n return false;\n }\n\n /**\n * Returns the offset's common name (such as EST) at the specified timestamp\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the name\n * @param {Object} opts - Options to affect the format\n * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.\n * @param {string} opts.locale - What locale to return the offset name in.\n * @return {string}\n */\n offsetName(ts, { format, locale }) {\n return parseZoneInfo(ts, format, locale, this.name);\n }\n\n /**\n * Returns the offset's value as a string\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n return formatOffset(this.offset(ts), format);\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n * @override\n * @param {number} ts - Epoch milliseconds for which to compute the offset\n * @return {number}\n */\n offset(ts) {\n if (!this.valid) return NaN;\n const date = new Date(ts);\n\n if (isNaN(date)) return NaN;\n\n const dtf = makeDTF(this.name);\n let [year, month, day, adOrBc, hour, minute, second] = dtf.formatToParts\n ? partsOffset(dtf, date)\n : hackyOffset(dtf, date);\n\n if (adOrBc === \"BC\") {\n year = -Math.abs(year) + 1;\n }\n\n // because we're using hour12 and https://bugs.chromium.org/p/chromium/issues/detail?id=1025564&can=2&q=%2224%3A00%22%20datetimeformat\n const adjustedHour = hour === 24 ? 0 : hour;\n\n const asUTC = objToLocalTS({\n year,\n month,\n day,\n hour: adjustedHour,\n minute,\n second,\n millisecond: 0,\n });\n\n let asTS = +date;\n const over = asTS % 1000;\n asTS -= over >= 0 ? over : 1000 + over;\n return (asUTC - asTS) / (60 * 1000);\n }\n\n /**\n * Return whether this Zone is equal to another zone\n * @override\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n return otherZone.type === \"iana\" && otherZone.name === this.name;\n }\n\n /**\n * Return whether this Zone is valid.\n * @override\n * @type {boolean}\n */\n get isValid() {\n return this.valid;\n }\n}\n","import { hasLocaleWeekInfo, hasRelative, padStart, roundTo, validateWeekSettings } from \"./util.js\";\nimport * as English from \"./english.js\";\nimport Settings from \"../settings.js\";\nimport DateTime from \"../datetime.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\n\n// todo - remap caching\n\nlet intlLFCache = {};\nfunction getCachedLF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let dtf = intlLFCache[key];\n if (!dtf) {\n dtf = new Intl.ListFormat(locString, opts);\n intlLFCache[key] = dtf;\n }\n return dtf;\n}\n\nconst intlDTCache = new Map();\nfunction getCachedDTF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let dtf = intlDTCache.get(key);\n if (dtf === undefined) {\n dtf = new Intl.DateTimeFormat(locString, opts);\n intlDTCache.set(key, dtf);\n }\n return dtf;\n}\n\nconst intlNumCache = new Map();\nfunction getCachedINF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let inf = intlNumCache.get(key);\n if (inf === undefined) {\n inf = new Intl.NumberFormat(locString, opts);\n intlNumCache.set(key, inf);\n }\n return inf;\n}\n\nconst intlRelCache = new Map();\nfunction getCachedRTF(locString, opts = {}) {\n const { base, ...cacheKeyOpts } = opts; // exclude `base` from the options\n const key = JSON.stringify([locString, cacheKeyOpts]);\n let inf = intlRelCache.get(key);\n if (inf === undefined) {\n inf = new Intl.RelativeTimeFormat(locString, opts);\n intlRelCache.set(key, inf);\n }\n return inf;\n}\n\nlet sysLocaleCache = null;\nfunction systemLocale() {\n if (sysLocaleCache) {\n return sysLocaleCache;\n } else {\n sysLocaleCache = new Intl.DateTimeFormat().resolvedOptions().locale;\n return sysLocaleCache;\n }\n}\n\nconst intlResolvedOptionsCache = new Map();\nfunction getCachedIntResolvedOptions(locString) {\n let opts = intlResolvedOptionsCache.get(locString);\n if (opts === undefined) {\n opts = new Intl.DateTimeFormat(locString).resolvedOptions();\n intlResolvedOptionsCache.set(locString, opts);\n }\n return opts;\n}\n\nconst weekInfoCache = new Map();\nfunction getCachedWeekInfo(locString) {\n let data = weekInfoCache.get(locString);\n if (!data) {\n const locale = new Intl.Locale(locString);\n // browsers currently implement this as a property, but spec says it should be a getter function\n data = \"getWeekInfo\" in locale ? locale.getWeekInfo() : locale.weekInfo;\n // minimalDays was removed from WeekInfo: https://github.com/tc39/proposal-intl-locale-info/issues/86\n if (!(\"minimalDays\" in data)) {\n data = { ...fallbackWeekSettings, ...data };\n }\n weekInfoCache.set(locString, data);\n }\n return data;\n}\n\nfunction parseLocaleString(localeStr) {\n // I really want to avoid writing a BCP 47 parser\n // see, e.g. https://github.com/wooorm/bcp-47\n // Instead, we'll do this:\n\n // a) if the string has no -u extensions, just leave it alone\n // b) if it does, use Intl to resolve everything\n // c) if Intl fails, try again without the -u\n\n // private subtags and unicode subtags have ordering requirements,\n // and we're not properly parsing this, so just strip out the\n // private ones if they exist.\n const xIndex = localeStr.indexOf(\"-x-\");\n if (xIndex !== -1) {\n localeStr = localeStr.substring(0, xIndex);\n }\n\n const uIndex = localeStr.indexOf(\"-u-\");\n if (uIndex === -1) {\n return [localeStr];\n } else {\n let options;\n let selectedStr;\n try {\n options = getCachedDTF(localeStr).resolvedOptions();\n selectedStr = localeStr;\n } catch (e) {\n const smaller = localeStr.substring(0, uIndex);\n options = getCachedDTF(smaller).resolvedOptions();\n selectedStr = smaller;\n }\n\n const { numberingSystem, calendar } = options;\n return [selectedStr, numberingSystem, calendar];\n }\n}\n\nfunction intlConfigString(localeStr, numberingSystem, outputCalendar) {\n if (outputCalendar || numberingSystem) {\n if (!localeStr.includes(\"-u-\")) {\n localeStr += \"-u\";\n }\n\n if (outputCalendar) {\n localeStr += `-ca-${outputCalendar}`;\n }\n\n if (numberingSystem) {\n localeStr += `-nu-${numberingSystem}`;\n }\n return localeStr;\n } else {\n return localeStr;\n }\n}\n\nfunction mapMonths(f) {\n const ms = [];\n for (let i = 1; i <= 12; i++) {\n const dt = DateTime.utc(2009, i, 1);\n ms.push(f(dt));\n }\n return ms;\n}\n\nfunction mapWeekdays(f) {\n const ms = [];\n for (let i = 1; i <= 7; i++) {\n const dt = DateTime.utc(2016, 11, 13 + i);\n ms.push(f(dt));\n }\n return ms;\n}\n\nfunction listStuff(loc, length, englishFn, intlFn) {\n const mode = loc.listingMode();\n\n if (mode === \"error\") {\n return null;\n } else if (mode === \"en\") {\n return englishFn(length);\n } else {\n return intlFn(length);\n }\n}\n\nfunction supportsFastNumbers(loc) {\n if (loc.numberingSystem && loc.numberingSystem !== \"latn\") {\n return false;\n } else {\n return (\n loc.numberingSystem === \"latn\" ||\n !loc.locale ||\n loc.locale.startsWith(\"en\") ||\n getCachedIntResolvedOptions(loc.locale).numberingSystem === \"latn\"\n );\n }\n}\n\n/**\n * @private\n */\n\nclass PolyNumberFormatter {\n constructor(intl, forceSimple, opts) {\n this.padTo = opts.padTo || 0;\n this.floor = opts.floor || false;\n\n const { padTo, floor, ...otherOpts } = opts;\n\n if (!forceSimple || Object.keys(otherOpts).length > 0) {\n const intlOpts = { useGrouping: false, ...opts };\n if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo;\n this.inf = getCachedINF(intl, intlOpts);\n }\n }\n\n format(i) {\n if (this.inf) {\n const fixed = this.floor ? Math.floor(i) : i;\n return this.inf.format(fixed);\n } else {\n // to match the browser's numberformatter defaults\n const fixed = this.floor ? Math.floor(i) : roundTo(i, 3);\n return padStart(fixed, this.padTo);\n }\n }\n}\n\n/**\n * @private\n */\n\nclass PolyDateFormatter {\n constructor(dt, intl, opts) {\n this.opts = opts;\n this.originalZone = undefined;\n\n let z = undefined;\n if (this.opts.timeZone) {\n // Don't apply any workarounds if a timeZone is explicitly provided in opts\n this.dt = dt;\n } else if (dt.zone.type === \"fixed\") {\n // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like.\n // That is why fixed-offset TZ is set to that unless it is:\n // 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT.\n // 2. Unsupported by the browser:\n // - some do not support Etc/\n // - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata\n const gmtOffset = -1 * (dt.offset / 60);\n const offsetZ = gmtOffset >= 0 ? `Etc/GMT+${gmtOffset}` : `Etc/GMT${gmtOffset}`;\n if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) {\n z = offsetZ;\n this.dt = dt;\n } else {\n // Not all fixed-offset zones like Etc/+4:30 are present in tzdata so\n // we manually apply the offset and substitute the zone as needed.\n z = \"UTC\";\n this.dt = dt.offset === 0 ? dt : dt.setZone(\"UTC\").plus({ minutes: dt.offset });\n this.originalZone = dt.zone;\n }\n } else if (dt.zone.type === \"system\") {\n this.dt = dt;\n } else if (dt.zone.type === \"iana\") {\n this.dt = dt;\n z = dt.zone.name;\n } else {\n // Custom zones can have any offset / offsetName so we just manually\n // apply the offset and substitute the zone as needed.\n z = \"UTC\";\n this.dt = dt.setZone(\"UTC\").plus({ minutes: dt.offset });\n this.originalZone = dt.zone;\n }\n\n const intlOpts = { ...this.opts };\n intlOpts.timeZone = intlOpts.timeZone || z;\n this.dtf = getCachedDTF(intl, intlOpts);\n }\n\n format() {\n if (this.originalZone) {\n // If we have to substitute in the actual zone name, we have to use\n // formatToParts so that the timezone can be replaced.\n return this.formatToParts()\n .map(({ value }) => value)\n .join(\"\");\n }\n return this.dtf.format(this.dt.toJSDate());\n }\n\n formatToParts() {\n const parts = this.dtf.formatToParts(this.dt.toJSDate());\n if (this.originalZone) {\n return parts.map((part) => {\n if (part.type === \"timeZoneName\") {\n const offsetName = this.originalZone.offsetName(this.dt.ts, {\n locale: this.dt.locale,\n format: this.opts.timeZoneName,\n });\n return {\n ...part,\n value: offsetName,\n };\n } else {\n return part;\n }\n });\n }\n return parts;\n }\n\n resolvedOptions() {\n return this.dtf.resolvedOptions();\n }\n}\n\n/**\n * @private\n */\nclass PolyRelFormatter {\n constructor(intl, isEnglish, opts) {\n this.opts = { style: \"long\", ...opts };\n if (!isEnglish && hasRelative()) {\n this.rtf = getCachedRTF(intl, opts);\n }\n }\n\n format(count, unit) {\n if (this.rtf) {\n return this.rtf.format(count, unit);\n } else {\n return English.formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== \"long\");\n }\n }\n\n formatToParts(count, unit) {\n if (this.rtf) {\n return this.rtf.formatToParts(count, unit);\n } else {\n return [];\n }\n }\n}\n\nconst fallbackWeekSettings = {\n firstDay: 1,\n minimalDays: 4,\n weekend: [6, 7],\n};\n\n/**\n * @private\n */\nexport default class Locale {\n static fromOpts(opts) {\n return Locale.create(\n opts.locale,\n opts.numberingSystem,\n opts.outputCalendar,\n opts.weekSettings,\n opts.defaultToEN\n );\n }\n\n static create(locale, numberingSystem, outputCalendar, weekSettings, defaultToEN = false) {\n const specifiedLocale = locale || Settings.defaultLocale;\n // the system locale is useful for human-readable strings but annoying for parsing/formatting known formats\n const localeR = specifiedLocale || (defaultToEN ? \"en-US\" : systemLocale());\n const numberingSystemR = numberingSystem || Settings.defaultNumberingSystem;\n const outputCalendarR = outputCalendar || Settings.defaultOutputCalendar;\n const weekSettingsR = validateWeekSettings(weekSettings) || Settings.defaultWeekSettings;\n return new Locale(localeR, numberingSystemR, outputCalendarR, weekSettingsR, specifiedLocale);\n }\n\n static resetCache() {\n sysLocaleCache = null;\n intlDTCache.clear();\n intlNumCache.clear();\n intlRelCache.clear();\n intlResolvedOptionsCache.clear();\n weekInfoCache.clear();\n }\n\n static fromObject({ locale, numberingSystem, outputCalendar, weekSettings } = {}) {\n return Locale.create(locale, numberingSystem, outputCalendar, weekSettings);\n }\n\n constructor(locale, numbering, outputCalendar, weekSettings, specifiedLocale) {\n const [parsedLocale, parsedNumberingSystem, parsedOutputCalendar] = parseLocaleString(locale);\n\n this.locale = parsedLocale;\n this.numberingSystem = numbering || parsedNumberingSystem || null;\n this.outputCalendar = outputCalendar || parsedOutputCalendar || null;\n this.weekSettings = weekSettings;\n this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar);\n\n this.weekdaysCache = { format: {}, standalone: {} };\n this.monthsCache = { format: {}, standalone: {} };\n this.meridiemCache = null;\n this.eraCache = {};\n\n this.specifiedLocale = specifiedLocale;\n this.fastNumbersCached = null;\n }\n\n get fastNumbers() {\n if (this.fastNumbersCached == null) {\n this.fastNumbersCached = supportsFastNumbers(this);\n }\n\n return this.fastNumbersCached;\n }\n\n listingMode() {\n const isActuallyEn = this.isEnglish();\n const hasNoWeirdness =\n (this.numberingSystem === null || this.numberingSystem === \"latn\") &&\n (this.outputCalendar === null || this.outputCalendar === \"gregory\");\n return isActuallyEn && hasNoWeirdness ? \"en\" : \"intl\";\n }\n\n clone(alts) {\n if (!alts || Object.getOwnPropertyNames(alts).length === 0) {\n return this;\n } else {\n return Locale.create(\n alts.locale || this.specifiedLocale,\n alts.numberingSystem || this.numberingSystem,\n alts.outputCalendar || this.outputCalendar,\n validateWeekSettings(alts.weekSettings) || this.weekSettings,\n alts.defaultToEN || false\n );\n }\n }\n\n redefaultToEN(alts = {}) {\n return this.clone({ ...alts, defaultToEN: true });\n }\n\n redefaultToSystem(alts = {}) {\n return this.clone({ ...alts, defaultToEN: false });\n }\n\n months(length, format = false) {\n return listStuff(this, length, English.months, () => {\n // Workaround for \"ja\" locale: formatToParts does not label all parts of the month\n // as \"month\" and for this locale there is no difference between \"format\" and \"non-format\".\n // As such, just use format() instead of formatToParts() and take the whole string\n const monthSpecialCase = this.intl === \"ja\" || this.intl.startsWith(\"ja-\");\n format &= !monthSpecialCase;\n const intl = format ? { month: length, day: \"numeric\" } : { month: length },\n formatStr = format ? \"format\" : \"standalone\";\n if (!this.monthsCache[formatStr][length]) {\n const mapper = !monthSpecialCase\n ? (dt) => this.extract(dt, intl, \"month\")\n : (dt) => this.dtFormatter(dt, intl).format();\n this.monthsCache[formatStr][length] = mapMonths(mapper);\n }\n return this.monthsCache[formatStr][length];\n });\n }\n\n weekdays(length, format = false) {\n return listStuff(this, length, English.weekdays, () => {\n const intl = format\n ? { weekday: length, year: \"numeric\", month: \"long\", day: \"numeric\" }\n : { weekday: length },\n formatStr = format ? \"format\" : \"standalone\";\n if (!this.weekdaysCache[formatStr][length]) {\n this.weekdaysCache[formatStr][length] = mapWeekdays((dt) =>\n this.extract(dt, intl, \"weekday\")\n );\n }\n return this.weekdaysCache[formatStr][length];\n });\n }\n\n meridiems() {\n return listStuff(\n this,\n undefined,\n () => English.meridiems,\n () => {\n // In theory there could be aribitrary day periods. We're gonna assume there are exactly two\n // for AM and PM. This is probably wrong, but it's makes parsing way easier.\n if (!this.meridiemCache) {\n const intl = { hour: \"numeric\", hourCycle: \"h12\" };\n this.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map(\n (dt) => this.extract(dt, intl, \"dayperiod\")\n );\n }\n\n return this.meridiemCache;\n }\n );\n }\n\n eras(length) {\n return listStuff(this, length, English.eras, () => {\n const intl = { era: length };\n\n // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates\n // to definitely enumerate them.\n if (!this.eraCache[length]) {\n this.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map((dt) =>\n this.extract(dt, intl, \"era\")\n );\n }\n\n return this.eraCache[length];\n });\n }\n\n extract(dt, intlOpts, field) {\n const df = this.dtFormatter(dt, intlOpts),\n results = df.formatToParts(),\n matching = results.find((m) => m.type.toLowerCase() === field);\n return matching ? matching.value : null;\n }\n\n numberFormatter(opts = {}) {\n // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave)\n // (in contrast, the rest of the condition is used heavily)\n return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts);\n }\n\n dtFormatter(dt, intlOpts = {}) {\n return new PolyDateFormatter(dt, this.intl, intlOpts);\n }\n\n relFormatter(opts = {}) {\n return new PolyRelFormatter(this.intl, this.isEnglish(), opts);\n }\n\n listFormatter(opts = {}) {\n return getCachedLF(this.intl, opts);\n }\n\n isEnglish() {\n return (\n this.locale === \"en\" ||\n this.locale.toLowerCase() === \"en-us\" ||\n getCachedIntResolvedOptions(this.intl).locale.startsWith(\"en-us\")\n );\n }\n\n getWeekSettings() {\n if (this.weekSettings) {\n return this.weekSettings;\n } else if (!hasLocaleWeekInfo()) {\n return fallbackWeekSettings;\n } else {\n return getCachedWeekInfo(this.locale);\n }\n }\n\n getStartOfWeek() {\n return this.getWeekSettings().firstDay;\n }\n\n getMinDaysInFirstWeek() {\n return this.getWeekSettings().minimalDays;\n }\n\n getWeekendDays() {\n return this.getWeekSettings().weekend;\n }\n\n equals(other) {\n return (\n this.locale === other.locale &&\n this.numberingSystem === other.numberingSystem &&\n this.outputCalendar === other.outputCalendar\n );\n }\n\n toString() {\n return `Locale(${this.locale}, ${this.numberingSystem}, ${this.outputCalendar})`;\n }\n}\n","import { formatOffset, signedOffset } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet singleton = null;\n\n/**\n * A zone with a fixed offset (meaning no DST)\n * @implements {Zone}\n */\nexport default class FixedOffsetZone extends Zone {\n /**\n * Get a singleton instance of UTC\n * @return {FixedOffsetZone}\n */\n static get utcInstance() {\n if (singleton === null) {\n singleton = new FixedOffsetZone(0);\n }\n return singleton;\n }\n\n /**\n * Get an instance with a specified offset\n * @param {number} offset - The offset in minutes\n * @return {FixedOffsetZone}\n */\n static instance(offset) {\n return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset);\n }\n\n /**\n * Get an instance of FixedOffsetZone from a UTC offset string, like \"UTC+6\"\n * @param {string} s - The offset string to parse\n * @example FixedOffsetZone.parseSpecifier(\"UTC+6\")\n * @example FixedOffsetZone.parseSpecifier(\"UTC+06\")\n * @example FixedOffsetZone.parseSpecifier(\"UTC-6:00\")\n * @return {FixedOffsetZone}\n */\n static parseSpecifier(s) {\n if (s) {\n const r = s.match(/^utc(?:([+-]\\d{1,2})(?::(\\d{2}))?)?$/i);\n if (r) {\n return new FixedOffsetZone(signedOffset(r[1], r[2]));\n }\n }\n return null;\n }\n\n constructor(offset) {\n super();\n /** @private **/\n this.fixed = offset;\n }\n\n /**\n * The type of zone. `fixed` for all instances of `FixedOffsetZone`.\n * @override\n * @type {string}\n */\n get type() {\n return \"fixed\";\n }\n\n /**\n * The name of this zone.\n * All fixed zones' names always start with \"UTC\" (plus optional offset)\n * @override\n * @type {string}\n */\n get name() {\n return this.fixed === 0 ? \"UTC\" : `UTC${formatOffset(this.fixed, \"narrow\")}`;\n }\n\n /**\n * The IANA name of this zone, i.e. `Etc/UTC` or `Etc/GMT+/-nn`\n *\n * @override\n * @type {string}\n */\n get ianaName() {\n if (this.fixed === 0) {\n return \"Etc/UTC\";\n } else {\n return `Etc/GMT${formatOffset(-this.fixed, \"narrow\")}`;\n }\n }\n\n /**\n * Returns the offset's common name at the specified timestamp.\n *\n * For fixed offset zones this equals to the zone name.\n * @override\n */\n offsetName() {\n return this.name;\n }\n\n /**\n * Returns the offset's value as a string\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n return formatOffset(this.fixed, format);\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year:\n * Always returns true for all fixed offset zones.\n * @override\n * @type {boolean}\n */\n get isUniversal() {\n return true;\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n *\n * For fixed offset zones, this is constant and does not depend on a timestamp.\n * @override\n * @return {number}\n */\n offset() {\n return this.fixed;\n }\n\n /**\n * Return whether this Zone is equal to another zone (i.e. also fixed and same offset)\n * @override\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n return otherZone.type === \"fixed\" && otherZone.fixed === this.fixed;\n }\n\n /**\n * Return whether this Zone is valid:\n * All fixed offset zones are valid.\n * @override\n * @type {boolean}\n */\n get isValid() {\n return true;\n }\n}\n","import Zone from \"../zone.js\";\n\n/**\n * A zone that failed to parse. You should never need to instantiate this.\n * @implements {Zone}\n */\nexport default class InvalidZone extends Zone {\n constructor(zoneName) {\n super();\n /** @private */\n this.zoneName = zoneName;\n }\n\n /** @override **/\n get type() {\n return \"invalid\";\n }\n\n /** @override **/\n get name() {\n return this.zoneName;\n }\n\n /** @override **/\n get isUniversal() {\n return false;\n }\n\n /** @override **/\n offsetName() {\n return null;\n }\n\n /** @override **/\n formatOffset() {\n return \"\";\n }\n\n /** @override **/\n offset() {\n return NaN;\n }\n\n /** @override **/\n equals() {\n return false;\n }\n\n /** @override **/\n get isValid() {\n return false;\n }\n}\n","/**\n * @private\n */\n\nimport Zone from \"../zone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport InvalidZone from \"../zones/invalidZone.js\";\n\nimport { isUndefined, isString, isNumber } from \"./util.js\";\nimport SystemZone from \"../zones/systemZone.js\";\n\nexport function normalizeZone(input, defaultZone) {\n let offset;\n if (isUndefined(input) || input === null) {\n return defaultZone;\n } else if (input instanceof Zone) {\n return input;\n } else if (isString(input)) {\n const lowered = input.toLowerCase();\n if (lowered === \"default\") return defaultZone;\n else if (lowered === \"local\" || lowered === \"system\") return SystemZone.instance;\n else if (lowered === \"utc\" || lowered === \"gmt\") return FixedOffsetZone.utcInstance;\n else return FixedOffsetZone.parseSpecifier(lowered) || IANAZone.create(input);\n } else if (isNumber(input)) {\n return FixedOffsetZone.instance(input);\n } else if (typeof input === \"object\" && \"offset\" in input && typeof input.offset === \"function\") {\n // This is dumb, but the instanceof check above doesn't seem to really work\n // so we're duck checking it\n return input;\n } else {\n return new InvalidZone(input);\n }\n}\n","const numberingSystems = {\n arab: \"[\\u0660-\\u0669]\",\n arabext: \"[\\u06F0-\\u06F9]\",\n bali: \"[\\u1B50-\\u1B59]\",\n beng: \"[\\u09E6-\\u09EF]\",\n deva: \"[\\u0966-\\u096F]\",\n fullwide: \"[\\uFF10-\\uFF19]\",\n gujr: \"[\\u0AE6-\\u0AEF]\",\n hanidec: \"[〇|一|二|三|四|五|六|七|八|九]\",\n khmr: \"[\\u17E0-\\u17E9]\",\n knda: \"[\\u0CE6-\\u0CEF]\",\n laoo: \"[\\u0ED0-\\u0ED9]\",\n limb: \"[\\u1946-\\u194F]\",\n mlym: \"[\\u0D66-\\u0D6F]\",\n mong: \"[\\u1810-\\u1819]\",\n mymr: \"[\\u1040-\\u1049]\",\n orya: \"[\\u0B66-\\u0B6F]\",\n tamldec: \"[\\u0BE6-\\u0BEF]\",\n telu: \"[\\u0C66-\\u0C6F]\",\n thai: \"[\\u0E50-\\u0E59]\",\n tibt: \"[\\u0F20-\\u0F29]\",\n latn: \"\\\\d\",\n};\n\nconst numberingSystemsUTF16 = {\n arab: [1632, 1641],\n arabext: [1776, 1785],\n bali: [6992, 7001],\n beng: [2534, 2543],\n deva: [2406, 2415],\n fullwide: [65296, 65303],\n gujr: [2790, 2799],\n khmr: [6112, 6121],\n knda: [3302, 3311],\n laoo: [3792, 3801],\n limb: [6470, 6479],\n mlym: [3430, 3439],\n mong: [6160, 6169],\n mymr: [4160, 4169],\n orya: [2918, 2927],\n tamldec: [3046, 3055],\n telu: [3174, 3183],\n thai: [3664, 3673],\n tibt: [3872, 3881],\n};\n\nconst hanidecChars = numberingSystems.hanidec.replace(/[\\[|\\]]/g, \"\").split(\"\");\n\nexport function parseDigits(str) {\n let value = parseInt(str, 10);\n if (isNaN(value)) {\n value = \"\";\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n\n if (str[i].search(numberingSystems.hanidec) !== -1) {\n value += hanidecChars.indexOf(str[i]);\n } else {\n for (const key in numberingSystemsUTF16) {\n const [min, max] = numberingSystemsUTF16[key];\n if (code >= min && code <= max) {\n value += code - min;\n }\n }\n }\n }\n return parseInt(value, 10);\n } else {\n return value;\n }\n}\n\n// cache of {numberingSystem: {append: regex}}\nconst digitRegexCache = new Map();\nexport function resetDigitRegexCache() {\n digitRegexCache.clear();\n}\n\nexport function digitRegex({ numberingSystem }, append = \"\") {\n const ns = numberingSystem || \"latn\";\n\n let appendCache = digitRegexCache.get(ns);\n if (appendCache === undefined) {\n appendCache = new Map();\n digitRegexCache.set(ns, appendCache);\n }\n let regex = appendCache.get(append);\n if (regex === undefined) {\n regex = new RegExp(`${numberingSystems[ns]}${append}`);\n appendCache.set(append, regex);\n }\n\n return regex;\n}\n","import SystemZone from \"./zones/systemZone.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport Locale from \"./impl/locale.js\";\nimport DateTime from \"./datetime.js\";\n\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\nimport { validateWeekSettings } from \"./impl/util.js\";\nimport { resetDigitRegexCache } from \"./impl/digits.js\";\n\nlet now = () => Date.now(),\n defaultZone = \"system\",\n defaultLocale = null,\n defaultNumberingSystem = null,\n defaultOutputCalendar = null,\n twoDigitCutoffYear = 60,\n throwOnInvalid,\n defaultWeekSettings = null;\n\n/**\n * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here.\n */\nexport default class Settings {\n /**\n * Get the callback for returning the current timestamp.\n * @type {function}\n */\n static get now() {\n return now;\n }\n\n /**\n * Set the callback for returning the current timestamp.\n * The function should return a number, which will be interpreted as an Epoch millisecond count\n * @type {function}\n * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future\n * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time\n */\n static set now(n) {\n now = n;\n }\n\n /**\n * Set the default time zone to create DateTimes in. Does not affect existing instances.\n * Use the value \"system\" to reset this value to the system's time zone.\n * @type {string}\n */\n static set defaultZone(zone) {\n defaultZone = zone;\n }\n\n /**\n * Get the default time zone object currently used to create DateTimes. Does not affect existing instances.\n * The default value is the system's time zone (the one set on the machine that runs this code).\n * @type {Zone}\n */\n static get defaultZone() {\n return normalizeZone(defaultZone, SystemZone.instance);\n }\n\n /**\n * Get the default locale to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultLocale() {\n return defaultLocale;\n }\n\n /**\n * Set the default locale to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultLocale(locale) {\n defaultLocale = locale;\n }\n\n /**\n * Get the default numbering system to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultNumberingSystem() {\n return defaultNumberingSystem;\n }\n\n /**\n * Set the default numbering system to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultNumberingSystem(numberingSystem) {\n defaultNumberingSystem = numberingSystem;\n }\n\n /**\n * Get the default output calendar to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultOutputCalendar() {\n return defaultOutputCalendar;\n }\n\n /**\n * Set the default output calendar to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultOutputCalendar(outputCalendar) {\n defaultOutputCalendar = outputCalendar;\n }\n\n /**\n * @typedef {Object} WeekSettings\n * @property {number} firstDay\n * @property {number} minimalDays\n * @property {number[]} weekend\n */\n\n /**\n * @return {WeekSettings|null}\n */\n static get defaultWeekSettings() {\n return defaultWeekSettings;\n }\n\n /**\n * Allows overriding the default locale week settings, i.e. the start of the week, the weekend and\n * how many days are required in the first week of a year.\n * Does not affect existing instances.\n *\n * @param {WeekSettings|null} weekSettings\n */\n static set defaultWeekSettings(weekSettings) {\n defaultWeekSettings = validateWeekSettings(weekSettings);\n }\n\n /**\n * Get the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx.\n * @type {number}\n */\n static get twoDigitCutoffYear() {\n return twoDigitCutoffYear;\n }\n\n /**\n * Set the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx.\n * @type {number}\n * @example Settings.twoDigitCutoffYear = 0 // all 'yy' are interpreted as 20th century\n * @example Settings.twoDigitCutoffYear = 99 // all 'yy' are interpreted as 21st century\n * @example Settings.twoDigitCutoffYear = 50 // '49' -> 2049; '50' -> 1950\n * @example Settings.twoDigitCutoffYear = 1950 // interpreted as 50\n * @example Settings.twoDigitCutoffYear = 2050 // ALSO interpreted as 50\n */\n static set twoDigitCutoffYear(cutoffYear) {\n twoDigitCutoffYear = cutoffYear % 100;\n }\n\n /**\n * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n * @type {boolean}\n */\n static get throwOnInvalid() {\n return throwOnInvalid;\n }\n\n /**\n * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n * @type {boolean}\n */\n static set throwOnInvalid(t) {\n throwOnInvalid = t;\n }\n\n /**\n * Reset Luxon's global caches. Should only be necessary in testing scenarios.\n * @return {void}\n */\n static resetCaches() {\n Locale.resetCache();\n IANAZone.resetCache();\n DateTime.resetCache();\n resetDigitRegexCache();\n }\n}\n","export default class Invalid {\n constructor(reason, explanation) {\n this.reason = reason;\n this.explanation = explanation;\n }\n\n toMessage() {\n if (this.explanation) {\n return `${this.reason}: ${this.explanation}`;\n } else {\n return this.reason;\n }\n }\n}\n","import {\n integerBetween,\n isLeapYear,\n timeObject,\n daysInYear,\n daysInMonth,\n weeksInWeekYear,\n isInteger,\n isUndefined,\n} from \"./util.js\";\nimport Invalid from \"./invalid.js\";\nimport { ConflictingSpecificationError } from \"../errors.js\";\n\nconst nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334],\n leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335];\n\nfunction unitOutOfRange(unit, value) {\n return new Invalid(\n \"unit out of range\",\n `you specified ${value} (of type ${typeof value}) as a ${unit}, which is invalid`\n );\n}\n\nexport function dayOfWeek(year, month, day) {\n const d = new Date(Date.UTC(year, month - 1, day));\n\n if (year < 100 && year >= 0) {\n d.setUTCFullYear(d.getUTCFullYear() - 1900);\n }\n\n const js = d.getUTCDay();\n\n return js === 0 ? 7 : js;\n}\n\nfunction computeOrdinal(year, month, day) {\n return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1];\n}\n\nfunction uncomputeOrdinal(year, ordinal) {\n const table = isLeapYear(year) ? leapLadder : nonLeapLadder,\n month0 = table.findIndex((i) => i < ordinal),\n day = ordinal - table[month0];\n return { month: month0 + 1, day };\n}\n\nexport function isoWeekdayToLocal(isoWeekday, startOfWeek) {\n return ((isoWeekday - startOfWeek + 7) % 7) + 1;\n}\n\n/**\n * @private\n */\n\nexport function gregorianToWeek(gregObj, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const { year, month, day } = gregObj,\n ordinal = computeOrdinal(year, month, day),\n weekday = isoWeekdayToLocal(dayOfWeek(year, month, day), startOfWeek);\n\n let weekNumber = Math.floor((ordinal - weekday + 14 - minDaysInFirstWeek) / 7),\n weekYear;\n\n if (weekNumber < 1) {\n weekYear = year - 1;\n weekNumber = weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek);\n } else if (weekNumber > weeksInWeekYear(year, minDaysInFirstWeek, startOfWeek)) {\n weekYear = year + 1;\n weekNumber = 1;\n } else {\n weekYear = year;\n }\n\n return { weekYear, weekNumber, weekday, ...timeObject(gregObj) };\n}\n\nexport function weekToGregorian(weekData, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const { weekYear, weekNumber, weekday } = weekData,\n weekdayOfJan4 = isoWeekdayToLocal(dayOfWeek(weekYear, 1, minDaysInFirstWeek), startOfWeek),\n yearInDays = daysInYear(weekYear);\n\n let ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 7 + minDaysInFirstWeek,\n year;\n\n if (ordinal < 1) {\n year = weekYear - 1;\n ordinal += daysInYear(year);\n } else if (ordinal > yearInDays) {\n year = weekYear + 1;\n ordinal -= daysInYear(weekYear);\n } else {\n year = weekYear;\n }\n\n const { month, day } = uncomputeOrdinal(year, ordinal);\n return { year, month, day, ...timeObject(weekData) };\n}\n\nexport function gregorianToOrdinal(gregData) {\n const { year, month, day } = gregData;\n const ordinal = computeOrdinal(year, month, day);\n return { year, ordinal, ...timeObject(gregData) };\n}\n\nexport function ordinalToGregorian(ordinalData) {\n const { year, ordinal } = ordinalData;\n const { month, day } = uncomputeOrdinal(year, ordinal);\n return { year, month, day, ...timeObject(ordinalData) };\n}\n\n/**\n * Check if local week units like localWeekday are used in obj.\n * If so, validates that they are not mixed with ISO week units and then copies them to the normal week unit properties.\n * Modifies obj in-place!\n * @param obj the object values\n */\nexport function usesLocalWeekValues(obj, loc) {\n const hasLocaleWeekData =\n !isUndefined(obj.localWeekday) ||\n !isUndefined(obj.localWeekNumber) ||\n !isUndefined(obj.localWeekYear);\n if (hasLocaleWeekData) {\n const hasIsoWeekData =\n !isUndefined(obj.weekday) || !isUndefined(obj.weekNumber) || !isUndefined(obj.weekYear);\n\n if (hasIsoWeekData) {\n throw new ConflictingSpecificationError(\n \"Cannot mix locale-based week fields with ISO-based week fields\"\n );\n }\n if (!isUndefined(obj.localWeekday)) obj.weekday = obj.localWeekday;\n if (!isUndefined(obj.localWeekNumber)) obj.weekNumber = obj.localWeekNumber;\n if (!isUndefined(obj.localWeekYear)) obj.weekYear = obj.localWeekYear;\n delete obj.localWeekday;\n delete obj.localWeekNumber;\n delete obj.localWeekYear;\n return {\n minDaysInFirstWeek: loc.getMinDaysInFirstWeek(),\n startOfWeek: loc.getStartOfWeek(),\n };\n } else {\n return { minDaysInFirstWeek: 4, startOfWeek: 1 };\n }\n}\n\nexport function hasInvalidWeekData(obj, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const validYear = isInteger(obj.weekYear),\n validWeek = integerBetween(\n obj.weekNumber,\n 1,\n weeksInWeekYear(obj.weekYear, minDaysInFirstWeek, startOfWeek)\n ),\n validWeekday = integerBetween(obj.weekday, 1, 7);\n\n if (!validYear) {\n return unitOutOfRange(\"weekYear\", obj.weekYear);\n } else if (!validWeek) {\n return unitOutOfRange(\"week\", obj.weekNumber);\n } else if (!validWeekday) {\n return unitOutOfRange(\"weekday\", obj.weekday);\n } else return false;\n}\n\nexport function hasInvalidOrdinalData(obj) {\n const validYear = isInteger(obj.year),\n validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year));\n\n if (!validYear) {\n return unitOutOfRange(\"year\", obj.year);\n } else if (!validOrdinal) {\n return unitOutOfRange(\"ordinal\", obj.ordinal);\n } else return false;\n}\n\nexport function hasInvalidGregorianData(obj) {\n const validYear = isInteger(obj.year),\n validMonth = integerBetween(obj.month, 1, 12),\n validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month));\n\n if (!validYear) {\n return unitOutOfRange(\"year\", obj.year);\n } else if (!validMonth) {\n return unitOutOfRange(\"month\", obj.month);\n } else if (!validDay) {\n return unitOutOfRange(\"day\", obj.day);\n } else return false;\n}\n\nexport function hasInvalidTimeData(obj) {\n const { hour, minute, second, millisecond } = obj;\n const validHour =\n integerBetween(hour, 0, 23) ||\n (hour === 24 && minute === 0 && second === 0 && millisecond === 0),\n validMinute = integerBetween(minute, 0, 59),\n validSecond = integerBetween(second, 0, 59),\n validMillisecond = integerBetween(millisecond, 0, 999);\n\n if (!validHour) {\n return unitOutOfRange(\"hour\", hour);\n } else if (!validMinute) {\n return unitOutOfRange(\"minute\", minute);\n } else if (!validSecond) {\n return unitOutOfRange(\"second\", second);\n } else if (!validMillisecond) {\n return unitOutOfRange(\"millisecond\", millisecond);\n } else return false;\n}\n","/*\n This is just a junk drawer, containing anything used across multiple classes.\n Because Luxon is small(ish), this should stay small and we won't worry about splitting\n it up into, say, parsingUtil.js and basicUtil.js and so on. But they are divided up by feature area.\n*/\n\nimport { InvalidArgumentError } from \"../errors.js\";\nimport Settings from \"../settings.js\";\nimport { dayOfWeek, isoWeekdayToLocal } from \"./conversions.js\";\n\n/**\n * @private\n */\n\n// TYPES\n\nexport function isUndefined(o) {\n return typeof o === \"undefined\";\n}\n\nexport function isNumber(o) {\n return typeof o === \"number\";\n}\n\nexport function isInteger(o) {\n return typeof o === \"number\" && o % 1 === 0;\n}\n\nexport function isString(o) {\n return typeof o === \"string\";\n}\n\nexport function isDate(o) {\n return Object.prototype.toString.call(o) === \"[object Date]\";\n}\n\n// CAPABILITIES\n\nexport function hasRelative() {\n try {\n return typeof Intl !== \"undefined\" && !!Intl.RelativeTimeFormat;\n } catch (e) {\n return false;\n }\n}\n\nexport function hasLocaleWeekInfo() {\n try {\n return (\n typeof Intl !== \"undefined\" &&\n !!Intl.Locale &&\n (\"weekInfo\" in Intl.Locale.prototype || \"getWeekInfo\" in Intl.Locale.prototype)\n );\n } catch (e) {\n return false;\n }\n}\n\n// OBJECTS AND ARRAYS\n\nexport function maybeArray(thing) {\n return Array.isArray(thing) ? thing : [thing];\n}\n\nexport function bestBy(arr, by, compare) {\n if (arr.length === 0) {\n return undefined;\n }\n return arr.reduce((best, next) => {\n const pair = [by(next), next];\n if (!best) {\n return pair;\n } else if (compare(best[0], pair[0]) === best[0]) {\n return best;\n } else {\n return pair;\n }\n }, null)[1];\n}\n\nexport function pick(obj, keys) {\n return keys.reduce((a, k) => {\n a[k] = obj[k];\n return a;\n }, {});\n}\n\nexport function hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nexport function validateWeekSettings(settings) {\n if (settings == null) {\n return null;\n } else if (typeof settings !== \"object\") {\n throw new InvalidArgumentError(\"Week settings must be an object\");\n } else {\n if (\n !integerBetween(settings.firstDay, 1, 7) ||\n !integerBetween(settings.minimalDays, 1, 7) ||\n !Array.isArray(settings.weekend) ||\n settings.weekend.some((v) => !integerBetween(v, 1, 7))\n ) {\n throw new InvalidArgumentError(\"Invalid week settings\");\n }\n return {\n firstDay: settings.firstDay,\n minimalDays: settings.minimalDays,\n weekend: Array.from(settings.weekend),\n };\n }\n}\n\n// NUMBERS AND STRINGS\n\nexport function integerBetween(thing, bottom, top) {\n return isInteger(thing) && thing >= bottom && thing <= top;\n}\n\n// x % n but takes the sign of n instead of x\nexport function floorMod(x, n) {\n return x - n * Math.floor(x / n);\n}\n\nexport function padStart(input, n = 2) {\n const isNeg = input < 0;\n let padded;\n if (isNeg) {\n padded = \"-\" + (\"\" + -input).padStart(n, \"0\");\n } else {\n padded = (\"\" + input).padStart(n, \"0\");\n }\n return padded;\n}\n\nexport function parseInteger(string) {\n if (isUndefined(string) || string === null || string === \"\") {\n return undefined;\n } else {\n return parseInt(string, 10);\n }\n}\n\nexport function parseFloating(string) {\n if (isUndefined(string) || string === null || string === \"\") {\n return undefined;\n } else {\n return parseFloat(string);\n }\n}\n\nexport function parseMillis(fraction) {\n // Return undefined (instead of 0) in these cases, where fraction is not set\n if (isUndefined(fraction) || fraction === null || fraction === \"\") {\n return undefined;\n } else {\n const f = parseFloat(\"0.\" + fraction) * 1000;\n return Math.floor(f);\n }\n}\n\nexport function roundTo(number, digits, rounding = \"round\") {\n const factor = 10 ** digits;\n switch (rounding) {\n case \"expand\":\n return number > 0\n ? Math.ceil(number * factor) / factor\n : Math.floor(number * factor) / factor;\n case \"trunc\":\n return Math.trunc(number * factor) / factor;\n case \"round\":\n return Math.round(number * factor) / factor;\n case \"floor\":\n return Math.floor(number * factor) / factor;\n case \"ceil\":\n return Math.ceil(number * factor) / factor;\n default:\n throw new RangeError(`Value rounding ${rounding} is out of range`);\n }\n}\n\n// DATE BASICS\n\nexport function isLeapYear(year) {\n return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n}\n\nexport function daysInYear(year) {\n return isLeapYear(year) ? 366 : 365;\n}\n\nexport function daysInMonth(year, month) {\n const modMonth = floorMod(month - 1, 12) + 1,\n modYear = year + (month - modMonth) / 12;\n\n if (modMonth === 2) {\n return isLeapYear(modYear) ? 29 : 28;\n } else {\n return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1];\n }\n}\n\n// convert a calendar object to a local timestamp (epoch, but with the offset baked in)\nexport function objToLocalTS(obj) {\n let d = Date.UTC(\n obj.year,\n obj.month - 1,\n obj.day,\n obj.hour,\n obj.minute,\n obj.second,\n obj.millisecond\n );\n\n // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that\n if (obj.year < 100 && obj.year >= 0) {\n d = new Date(d);\n // set the month and day again, this is necessary because year 2000 is a leap year, but year 100 is not\n // so if obj.year is in 99, but obj.day makes it roll over into year 100,\n // the calculations done by Date.UTC are using year 2000 - which is incorrect\n d.setUTCFullYear(obj.year, obj.month - 1, obj.day);\n }\n return +d;\n}\n\n// adapted from moment.js: https://github.com/moment/moment/blob/000ac1800e620f770f4eb31b5ae908f6167b0ab2/src/lib/units/week-calendar-utils.js\nfunction firstWeekOffset(year, minDaysInFirstWeek, startOfWeek) {\n const fwdlw = isoWeekdayToLocal(dayOfWeek(year, 1, minDaysInFirstWeek), startOfWeek);\n return -fwdlw + minDaysInFirstWeek - 1;\n}\n\nexport function weeksInWeekYear(weekYear, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const weekOffset = firstWeekOffset(weekYear, minDaysInFirstWeek, startOfWeek);\n const weekOffsetNext = firstWeekOffset(weekYear + 1, minDaysInFirstWeek, startOfWeek);\n return (daysInYear(weekYear) - weekOffset + weekOffsetNext) / 7;\n}\n\nexport function untruncateYear(year) {\n if (year > 99) {\n return year;\n } else return year > Settings.twoDigitCutoffYear ? 1900 + year : 2000 + year;\n}\n\n// PARSING\n\nexport function parseZoneInfo(ts, offsetFormat, locale, timeZone = null) {\n const date = new Date(ts),\n intlOpts = {\n hourCycle: \"h23\",\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n };\n\n if (timeZone) {\n intlOpts.timeZone = timeZone;\n }\n\n const modified = { timeZoneName: offsetFormat, ...intlOpts };\n\n const parsed = new Intl.DateTimeFormat(locale, modified)\n .formatToParts(date)\n .find((m) => m.type.toLowerCase() === \"timezonename\");\n return parsed ? parsed.value : null;\n}\n\n// signedOffset('-5', '30') -> -330\nexport function signedOffset(offHourStr, offMinuteStr) {\n let offHour = parseInt(offHourStr, 10);\n\n // don't || this because we want to preserve -0\n if (Number.isNaN(offHour)) {\n offHour = 0;\n }\n\n const offMin = parseInt(offMinuteStr, 10) || 0,\n offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin;\n return offHour * 60 + offMinSigned;\n}\n\n// COERCION\n\nexport function asNumber(value) {\n const numericValue = Number(value);\n if (typeof value === \"boolean\" || value === \"\" || !Number.isFinite(numericValue))\n throw new InvalidArgumentError(`Invalid unit value ${value}`);\n return numericValue;\n}\n\nexport function normalizeObject(obj, normalizer) {\n const normalized = {};\n for (const u in obj) {\n if (hasOwnProperty(obj, u)) {\n const v = obj[u];\n if (v === undefined || v === null) continue;\n normalized[normalizer(u)] = asNumber(v);\n }\n }\n return normalized;\n}\n\n/**\n * Returns the offset's value as a string\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\nexport function formatOffset(offset, format) {\n const hours = Math.trunc(Math.abs(offset / 60)),\n minutes = Math.trunc(Math.abs(offset % 60)),\n sign = offset >= 0 ? \"+\" : \"-\";\n\n switch (format) {\n case \"short\":\n return `${sign}${padStart(hours, 2)}:${padStart(minutes, 2)}`;\n case \"narrow\":\n return `${sign}${hours}${minutes > 0 ? `:${minutes}` : \"\"}`;\n case \"techie\":\n return `${sign}${padStart(hours, 2)}${padStart(minutes, 2)}`;\n default:\n throw new RangeError(`Value format ${format} is out of range for property format`);\n }\n}\n\nexport function timeObject(obj) {\n return pick(obj, [\"hour\", \"minute\", \"second\", \"millisecond\"]);\n}\n","import * as Formats from \"./formats.js\";\nimport { pick } from \"./util.js\";\n\nfunction stringify(obj) {\n return JSON.stringify(obj, Object.keys(obj).sort());\n}\n\n/**\n * @private\n */\n\nexport const monthsLong = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\nexport const monthsShort = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n];\n\nexport const monthsNarrow = [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"];\n\nexport function months(length) {\n switch (length) {\n case \"narrow\":\n return [...monthsNarrow];\n case \"short\":\n return [...monthsShort];\n case \"long\":\n return [...monthsLong];\n case \"numeric\":\n return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\"];\n case \"2-digit\":\n return [\"01\", \"02\", \"03\", \"04\", \"05\", \"06\", \"07\", \"08\", \"09\", \"10\", \"11\", \"12\"];\n default:\n return null;\n }\n}\n\nexport const weekdaysLong = [\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n \"Sunday\",\n];\n\nexport const weekdaysShort = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\n\nexport const weekdaysNarrow = [\"M\", \"T\", \"W\", \"T\", \"F\", \"S\", \"S\"];\n\nexport function weekdays(length) {\n switch (length) {\n case \"narrow\":\n return [...weekdaysNarrow];\n case \"short\":\n return [...weekdaysShort];\n case \"long\":\n return [...weekdaysLong];\n case \"numeric\":\n return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\"];\n default:\n return null;\n }\n}\n\nexport const meridiems = [\"AM\", \"PM\"];\n\nexport const erasLong = [\"Before Christ\", \"Anno Domini\"];\n\nexport const erasShort = [\"BC\", \"AD\"];\n\nexport const erasNarrow = [\"B\", \"A\"];\n\nexport function eras(length) {\n switch (length) {\n case \"narrow\":\n return [...erasNarrow];\n case \"short\":\n return [...erasShort];\n case \"long\":\n return [...erasLong];\n default:\n return null;\n }\n}\n\nexport function meridiemForDateTime(dt) {\n return meridiems[dt.hour < 12 ? 0 : 1];\n}\n\nexport function weekdayForDateTime(dt, length) {\n return weekdays(length)[dt.weekday - 1];\n}\n\nexport function monthForDateTime(dt, length) {\n return months(length)[dt.month - 1];\n}\n\nexport function eraForDateTime(dt, length) {\n return eras(length)[dt.year < 0 ? 0 : 1];\n}\n\nexport function formatRelativeTime(unit, count, numeric = \"always\", narrow = false) {\n const units = {\n years: [\"year\", \"yr.\"],\n quarters: [\"quarter\", \"qtr.\"],\n months: [\"month\", \"mo.\"],\n weeks: [\"week\", \"wk.\"],\n days: [\"day\", \"day\", \"days\"],\n hours: [\"hour\", \"hr.\"],\n minutes: [\"minute\", \"min.\"],\n seconds: [\"second\", \"sec.\"],\n };\n\n const lastable = [\"hours\", \"minutes\", \"seconds\"].indexOf(unit) === -1;\n\n if (numeric === \"auto\" && lastable) {\n const isDay = unit === \"days\";\n switch (count) {\n case 1:\n return isDay ? \"tomorrow\" : `next ${units[unit][0]}`;\n case -1:\n return isDay ? \"yesterday\" : `last ${units[unit][0]}`;\n case 0:\n return isDay ? \"today\" : `this ${units[unit][0]}`;\n default: // fall through\n }\n }\n\n const isInPast = Object.is(count, -0) || count < 0,\n fmtValue = Math.abs(count),\n singular = fmtValue === 1,\n lilUnits = units[unit],\n fmtUnit = narrow\n ? singular\n ? lilUnits[1]\n : lilUnits[2] || lilUnits[1]\n : singular\n ? units[unit][0]\n : unit;\n return isInPast ? `${fmtValue} ${fmtUnit} ago` : `in ${fmtValue} ${fmtUnit}`;\n}\n\nexport function formatString(knownFormat) {\n // these all have the offsets removed because we don't have access to them\n // without all the intl stuff this is backfilling\n const filtered = pick(knownFormat, [\n \"weekday\",\n \"era\",\n \"year\",\n \"month\",\n \"day\",\n \"hour\",\n \"minute\",\n \"second\",\n \"timeZoneName\",\n \"hourCycle\",\n ]),\n key = stringify(filtered),\n dateTimeHuge = \"EEEE, LLLL d, yyyy, h:mm a\";\n switch (key) {\n case stringify(Formats.DATE_SHORT):\n return \"M/d/yyyy\";\n case stringify(Formats.DATE_MED):\n return \"LLL d, yyyy\";\n case stringify(Formats.DATE_MED_WITH_WEEKDAY):\n return \"EEE, LLL d, yyyy\";\n case stringify(Formats.DATE_FULL):\n return \"LLLL d, yyyy\";\n case stringify(Formats.DATE_HUGE):\n return \"EEEE, LLLL d, yyyy\";\n case stringify(Formats.TIME_SIMPLE):\n return \"h:mm a\";\n case stringify(Formats.TIME_WITH_SECONDS):\n return \"h:mm:ss a\";\n case stringify(Formats.TIME_WITH_SHORT_OFFSET):\n return \"h:mm a\";\n case stringify(Formats.TIME_WITH_LONG_OFFSET):\n return \"h:mm a\";\n case stringify(Formats.TIME_24_SIMPLE):\n return \"HH:mm\";\n case stringify(Formats.TIME_24_WITH_SECONDS):\n return \"HH:mm:ss\";\n case stringify(Formats.TIME_24_WITH_SHORT_OFFSET):\n return \"HH:mm\";\n case stringify(Formats.TIME_24_WITH_LONG_OFFSET):\n return \"HH:mm\";\n case stringify(Formats.DATETIME_SHORT):\n return \"M/d/yyyy, h:mm a\";\n case stringify(Formats.DATETIME_MED):\n return \"LLL d, yyyy, h:mm a\";\n case stringify(Formats.DATETIME_FULL):\n return \"LLLL d, yyyy, h:mm a\";\n case stringify(Formats.DATETIME_HUGE):\n return dateTimeHuge;\n case stringify(Formats.DATETIME_SHORT_WITH_SECONDS):\n return \"M/d/yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_MED_WITH_SECONDS):\n return \"LLL d, yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_MED_WITH_WEEKDAY):\n return \"EEE, d LLL yyyy, h:mm a\";\n case stringify(Formats.DATETIME_FULL_WITH_SECONDS):\n return \"LLLL d, yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_HUGE_WITH_SECONDS):\n return \"EEEE, LLLL d, yyyy, h:mm:ss a\";\n default:\n return dateTimeHuge;\n }\n}\n","import * as English from \"./english.js\";\nimport * as Formats from \"./formats.js\";\nimport { padStart } from \"./util.js\";\n\nfunction stringifyTokens(splits, tokenToString) {\n let s = \"\";\n for (const token of splits) {\n if (token.literal) {\n s += token.val;\n } else {\n s += tokenToString(token.val);\n }\n }\n return s;\n}\n\nconst macroTokenToFormatOpts = {\n D: Formats.DATE_SHORT,\n DD: Formats.DATE_MED,\n DDD: Formats.DATE_FULL,\n DDDD: Formats.DATE_HUGE,\n t: Formats.TIME_SIMPLE,\n tt: Formats.TIME_WITH_SECONDS,\n ttt: Formats.TIME_WITH_SHORT_OFFSET,\n tttt: Formats.TIME_WITH_LONG_OFFSET,\n T: Formats.TIME_24_SIMPLE,\n TT: Formats.TIME_24_WITH_SECONDS,\n TTT: Formats.TIME_24_WITH_SHORT_OFFSET,\n TTTT: Formats.TIME_24_WITH_LONG_OFFSET,\n f: Formats.DATETIME_SHORT,\n ff: Formats.DATETIME_MED,\n fff: Formats.DATETIME_FULL,\n ffff: Formats.DATETIME_HUGE,\n F: Formats.DATETIME_SHORT_WITH_SECONDS,\n FF: Formats.DATETIME_MED_WITH_SECONDS,\n FFF: Formats.DATETIME_FULL_WITH_SECONDS,\n FFFF: Formats.DATETIME_HUGE_WITH_SECONDS,\n};\n\n/**\n * @private\n */\n\nexport default class Formatter {\n static create(locale, opts = {}) {\n return new Formatter(locale, opts);\n }\n\n static parseFormat(fmt) {\n // white-space is always considered a literal in user-provided formats\n // the \" \" token has a special meaning (see unitForToken)\n\n let current = null,\n currentFull = \"\",\n bracketed = false;\n const splits = [];\n for (let i = 0; i < fmt.length; i++) {\n const c = fmt.charAt(i);\n if (c === \"'\") {\n // turn '' into a literal signal quote instead of just skipping the empty literal\n if (currentFull.length > 0 || bracketed) {\n splits.push({\n literal: bracketed || /^\\s+$/.test(currentFull),\n val: currentFull === \"\" ? \"'\" : currentFull,\n });\n }\n current = null;\n currentFull = \"\";\n bracketed = !bracketed;\n } else if (bracketed) {\n currentFull += c;\n } else if (c === current) {\n currentFull += c;\n } else {\n if (currentFull.length > 0) {\n splits.push({ literal: /^\\s+$/.test(currentFull), val: currentFull });\n }\n currentFull = c;\n current = c;\n }\n }\n\n if (currentFull.length > 0) {\n splits.push({ literal: bracketed || /^\\s+$/.test(currentFull), val: currentFull });\n }\n\n return splits;\n }\n\n static macroTokenToFormatOpts(token) {\n return macroTokenToFormatOpts[token];\n }\n\n constructor(locale, formatOpts) {\n this.opts = formatOpts;\n this.loc = locale;\n this.systemLoc = null;\n }\n\n formatWithSystemDefault(dt, opts) {\n if (this.systemLoc === null) {\n this.systemLoc = this.loc.redefaultToSystem();\n }\n const df = this.systemLoc.dtFormatter(dt, { ...this.opts, ...opts });\n return df.format();\n }\n\n dtFormatter(dt, opts = {}) {\n return this.loc.dtFormatter(dt, { ...this.opts, ...opts });\n }\n\n formatDateTime(dt, opts) {\n return this.dtFormatter(dt, opts).format();\n }\n\n formatDateTimeParts(dt, opts) {\n return this.dtFormatter(dt, opts).formatToParts();\n }\n\n formatInterval(interval, opts) {\n const df = this.dtFormatter(interval.start, opts);\n return df.dtf.formatRange(interval.start.toJSDate(), interval.end.toJSDate());\n }\n\n resolvedOptions(dt, opts) {\n return this.dtFormatter(dt, opts).resolvedOptions();\n }\n\n num(n, p = 0, signDisplay = undefined) {\n // we get some perf out of doing this here, annoyingly\n if (this.opts.forceSimple) {\n return padStart(n, p);\n }\n\n const opts = { ...this.opts };\n\n if (p > 0) {\n opts.padTo = p;\n }\n if (signDisplay) {\n opts.signDisplay = signDisplay;\n }\n\n return this.loc.numberFormatter(opts).format(n);\n }\n\n formatDateTimeFromString(dt, fmt) {\n const knownEnglish = this.loc.listingMode() === \"en\",\n useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== \"gregory\",\n string = (opts, extract) => this.loc.extract(dt, opts, extract),\n formatOffset = (opts) => {\n if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) {\n return \"Z\";\n }\n\n return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : \"\";\n },\n meridiem = () =>\n knownEnglish\n ? English.meridiemForDateTime(dt)\n : string({ hour: \"numeric\", hourCycle: \"h12\" }, \"dayperiod\"),\n month = (length, standalone) =>\n knownEnglish\n ? English.monthForDateTime(dt, length)\n : string(standalone ? { month: length } : { month: length, day: \"numeric\" }, \"month\"),\n weekday = (length, standalone) =>\n knownEnglish\n ? English.weekdayForDateTime(dt, length)\n : string(\n standalone ? { weekday: length } : { weekday: length, month: \"long\", day: \"numeric\" },\n \"weekday\"\n ),\n maybeMacro = (token) => {\n const formatOpts = Formatter.macroTokenToFormatOpts(token);\n if (formatOpts) {\n return this.formatWithSystemDefault(dt, formatOpts);\n } else {\n return token;\n }\n },\n era = (length) =>\n knownEnglish ? English.eraForDateTime(dt, length) : string({ era: length }, \"era\"),\n tokenToString = (token) => {\n // Where possible: https://cldr.unicode.org/translation/date-time/date-time-symbols\n switch (token) {\n // ms\n case \"S\":\n return this.num(dt.millisecond);\n case \"u\":\n // falls through\n case \"SSS\":\n return this.num(dt.millisecond, 3);\n // seconds\n case \"s\":\n return this.num(dt.second);\n case \"ss\":\n return this.num(dt.second, 2);\n // fractional seconds\n case \"uu\":\n return this.num(Math.floor(dt.millisecond / 10), 2);\n case \"uuu\":\n return this.num(Math.floor(dt.millisecond / 100));\n // minutes\n case \"m\":\n return this.num(dt.minute);\n case \"mm\":\n return this.num(dt.minute, 2);\n // hours\n case \"h\":\n return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12);\n case \"hh\":\n return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2);\n case \"H\":\n return this.num(dt.hour);\n case \"HH\":\n return this.num(dt.hour, 2);\n // offset\n case \"Z\":\n // like +6\n return formatOffset({ format: \"narrow\", allowZ: this.opts.allowZ });\n case \"ZZ\":\n // like +06:00\n return formatOffset({ format: \"short\", allowZ: this.opts.allowZ });\n case \"ZZZ\":\n // like +0600\n return formatOffset({ format: \"techie\", allowZ: this.opts.allowZ });\n case \"ZZZZ\":\n // like EST\n return dt.zone.offsetName(dt.ts, { format: \"short\", locale: this.loc.locale });\n case \"ZZZZZ\":\n // like Eastern Standard Time\n return dt.zone.offsetName(dt.ts, { format: \"long\", locale: this.loc.locale });\n // zone\n case \"z\":\n // like America/New_York\n return dt.zoneName;\n // meridiems\n case \"a\":\n return meridiem();\n // dates\n case \"d\":\n return useDateTimeFormatter ? string({ day: \"numeric\" }, \"day\") : this.num(dt.day);\n case \"dd\":\n return useDateTimeFormatter ? string({ day: \"2-digit\" }, \"day\") : this.num(dt.day, 2);\n // weekdays - standalone\n case \"c\":\n // like 1\n return this.num(dt.weekday);\n case \"ccc\":\n // like 'Tues'\n return weekday(\"short\", true);\n case \"cccc\":\n // like 'Tuesday'\n return weekday(\"long\", true);\n case \"ccccc\":\n // like 'T'\n return weekday(\"narrow\", true);\n // weekdays - format\n case \"E\":\n // like 1\n return this.num(dt.weekday);\n case \"EEE\":\n // like 'Tues'\n return weekday(\"short\", false);\n case \"EEEE\":\n // like 'Tuesday'\n return weekday(\"long\", false);\n case \"EEEEE\":\n // like 'T'\n return weekday(\"narrow\", false);\n // months - standalone\n case \"L\":\n // like 1\n return useDateTimeFormatter\n ? string({ month: \"numeric\", day: \"numeric\" }, \"month\")\n : this.num(dt.month);\n case \"LL\":\n // like 01, doesn't seem to work\n return useDateTimeFormatter\n ? string({ month: \"2-digit\", day: \"numeric\" }, \"month\")\n : this.num(dt.month, 2);\n case \"LLL\":\n // like Jan\n return month(\"short\", true);\n case \"LLLL\":\n // like January\n return month(\"long\", true);\n case \"LLLLL\":\n // like J\n return month(\"narrow\", true);\n // months - format\n case \"M\":\n // like 1\n return useDateTimeFormatter\n ? string({ month: \"numeric\" }, \"month\")\n : this.num(dt.month);\n case \"MM\":\n // like 01\n return useDateTimeFormatter\n ? string({ month: \"2-digit\" }, \"month\")\n : this.num(dt.month, 2);\n case \"MMM\":\n // like Jan\n return month(\"short\", false);\n case \"MMMM\":\n // like January\n return month(\"long\", false);\n case \"MMMMM\":\n // like J\n return month(\"narrow\", false);\n // years\n case \"y\":\n // like 2014\n return useDateTimeFormatter ? string({ year: \"numeric\" }, \"year\") : this.num(dt.year);\n case \"yy\":\n // like 14\n return useDateTimeFormatter\n ? string({ year: \"2-digit\" }, \"year\")\n : this.num(dt.year.toString().slice(-2), 2);\n case \"yyyy\":\n // like 0012\n return useDateTimeFormatter\n ? string({ year: \"numeric\" }, \"year\")\n : this.num(dt.year, 4);\n case \"yyyyyy\":\n // like 000012\n return useDateTimeFormatter\n ? string({ year: \"numeric\" }, \"year\")\n : this.num(dt.year, 6);\n // eras\n case \"G\":\n // like AD\n return era(\"short\");\n case \"GG\":\n // like Anno Domini\n return era(\"long\");\n case \"GGGGG\":\n return era(\"narrow\");\n case \"kk\":\n return this.num(dt.weekYear.toString().slice(-2), 2);\n case \"kkkk\":\n return this.num(dt.weekYear, 4);\n case \"W\":\n return this.num(dt.weekNumber);\n case \"WW\":\n return this.num(dt.weekNumber, 2);\n case \"n\":\n return this.num(dt.localWeekNumber);\n case \"nn\":\n return this.num(dt.localWeekNumber, 2);\n case \"ii\":\n return this.num(dt.localWeekYear.toString().slice(-2), 2);\n case \"iiii\":\n return this.num(dt.localWeekYear, 4);\n case \"o\":\n return this.num(dt.ordinal);\n case \"ooo\":\n return this.num(dt.ordinal, 3);\n case \"q\":\n // like 1\n return this.num(dt.quarter);\n case \"qq\":\n // like 01\n return this.num(dt.quarter, 2);\n case \"X\":\n return this.num(Math.floor(dt.ts / 1000));\n case \"x\":\n return this.num(dt.ts);\n default:\n return maybeMacro(token);\n }\n };\n\n return stringifyTokens(Formatter.parseFormat(fmt), tokenToString);\n }\n\n formatDurationFromString(dur, fmt) {\n const invertLargest = this.opts.signMode === \"negativeLargestOnly\" ? -1 : 1;\n const tokenToField = (token) => {\n switch (token[0]) {\n case \"S\":\n return \"milliseconds\";\n case \"s\":\n return \"seconds\";\n case \"m\":\n return \"minutes\";\n case \"h\":\n return \"hours\";\n case \"d\":\n return \"days\";\n case \"w\":\n return \"weeks\";\n case \"M\":\n return \"months\";\n case \"y\":\n return \"years\";\n default:\n return null;\n }\n },\n tokenToString = (lildur, info) => (token) => {\n const mapped = tokenToField(token);\n if (mapped) {\n const inversionFactor =\n info.isNegativeDuration && mapped !== info.largestUnit ? invertLargest : 1;\n let signDisplay;\n if (this.opts.signMode === \"negativeLargestOnly\" && mapped !== info.largestUnit) {\n signDisplay = \"never\";\n } else if (this.opts.signMode === \"all\") {\n signDisplay = \"always\";\n } else {\n // \"auto\" and \"negative\" are the same, but \"auto\" has better support\n signDisplay = \"auto\";\n }\n return this.num(lildur.get(mapped) * inversionFactor, token.length, signDisplay);\n } else {\n return token;\n }\n },\n tokens = Formatter.parseFormat(fmt),\n realTokens = tokens.reduce(\n (found, { literal, val }) => (literal ? found : found.concat(val)),\n []\n ),\n collapsed = dur.shiftTo(...realTokens.map(tokenToField).filter((t) => t)),\n durationInfo = {\n isNegativeDuration: collapsed < 0,\n // this relies on \"collapsed\" being based on \"shiftTo\", which builds up the object\n // in order\n largestUnit: Object.keys(collapsed.values)[0],\n };\n return stringifyTokens(tokens, tokenToString(collapsed, durationInfo));\n }\n}\n","import {\n untruncateYear,\n signedOffset,\n parseInteger,\n parseMillis,\n isUndefined,\n parseFloating,\n} from \"./util.js\";\nimport * as English from \"./english.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\n\n/*\n * This file handles parsing for well-specified formats. Here's how it works:\n * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match.\n * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object\n * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence.\n * Extractors can take a \"cursor\" representing the offset in the match to look at. This makes it easy to combine extractors.\n * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions.\n * Some extractions are super dumb and simpleParse and fromStrings help DRY them.\n */\n\nconst ianaRegex = /[A-Za-z_+-]{1,256}(?::?\\/[A-Za-z0-9_+-]{1,256}(?:\\/[A-Za-z0-9_+-]{1,256})?)?/;\n\nfunction combineRegexes(...regexes) {\n const full = regexes.reduce((f, r) => f + r.source, \"\");\n return RegExp(`^${full}$`);\n}\n\nfunction combineExtractors(...extractors) {\n return (m) =>\n extractors\n .reduce(\n ([mergedVals, mergedZone, cursor], ex) => {\n const [val, zone, next] = ex(m, cursor);\n return [{ ...mergedVals, ...val }, zone || mergedZone, next];\n },\n [{}, null, 1]\n )\n .slice(0, 2);\n}\n\nfunction parse(s, ...patterns) {\n if (s == null) {\n return [null, null];\n }\n\n for (const [regex, extractor] of patterns) {\n const m = regex.exec(s);\n if (m) {\n return extractor(m);\n }\n }\n return [null, null];\n}\n\nfunction simpleParse(...keys) {\n return (match, cursor) => {\n const ret = {};\n let i;\n\n for (i = 0; i < keys.length; i++) {\n ret[keys[i]] = parseInteger(match[cursor + i]);\n }\n return [ret, null, cursor + i];\n };\n}\n\n// ISO and SQL parsing\nconst offsetRegex = /(?:([Zz])|([+-]\\d\\d)(?::?(\\d\\d))?)/;\nconst isoExtendedZone = `(?:${offsetRegex.source}?(?:\\\\[(${ianaRegex.source})\\\\])?)?`;\nconst isoTimeBaseRegex = /(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:[.,](\\d{1,30}))?)?)?/;\nconst isoTimeRegex = RegExp(`${isoTimeBaseRegex.source}${isoExtendedZone}`);\nconst isoTimeExtensionRegex = RegExp(`(?:[Tt]${isoTimeRegex.source})?`);\nconst isoYmdRegex = /([+-]\\d{6}|\\d{4})(?:-?(\\d\\d)(?:-?(\\d\\d))?)?/;\nconst isoWeekRegex = /(\\d{4})-?W(\\d\\d)(?:-?(\\d))?/;\nconst isoOrdinalRegex = /(\\d{4})-?(\\d{3})/;\nconst extractISOWeekData = simpleParse(\"weekYear\", \"weekNumber\", \"weekDay\");\nconst extractISOOrdinalData = simpleParse(\"year\", \"ordinal\");\nconst sqlYmdRegex = /(\\d{4})-(\\d\\d)-(\\d\\d)/; // dumbed-down version of the ISO one\nconst sqlTimeRegex = RegExp(\n `${isoTimeBaseRegex.source} ?(?:${offsetRegex.source}|(${ianaRegex.source}))?`\n);\nconst sqlTimeExtensionRegex = RegExp(`(?: ${sqlTimeRegex.source})?`);\n\nfunction int(match, pos, fallback) {\n const m = match[pos];\n return isUndefined(m) ? fallback : parseInteger(m);\n}\n\nfunction extractISOYmd(match, cursor) {\n const item = {\n year: int(match, cursor),\n month: int(match, cursor + 1, 1),\n day: int(match, cursor + 2, 1),\n };\n\n return [item, null, cursor + 3];\n}\n\nfunction extractISOTime(match, cursor) {\n const item = {\n hours: int(match, cursor, 0),\n minutes: int(match, cursor + 1, 0),\n seconds: int(match, cursor + 2, 0),\n milliseconds: parseMillis(match[cursor + 3]),\n };\n\n return [item, null, cursor + 4];\n}\n\nfunction extractISOOffset(match, cursor) {\n const local = !match[cursor] && !match[cursor + 1],\n fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]),\n zone = local ? null : FixedOffsetZone.instance(fullOffset);\n return [{}, zone, cursor + 3];\n}\n\nfunction extractIANAZone(match, cursor) {\n const zone = match[cursor] ? IANAZone.create(match[cursor]) : null;\n return [{}, zone, cursor + 1];\n}\n\n// ISO time parsing\n\nconst isoTimeOnly = RegExp(`^T?${isoTimeBaseRegex.source}$`);\n\n// ISO duration parsing\n\nconst isoDuration =\n /^-?P(?:(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)Y)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)M)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)W)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)D)?(?:T(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)H)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)M)?(?:(-?\\d{1,20})(?:[.,](-?\\d{1,20}))?S)?)?)$/;\n\nfunction extractISODuration(match) {\n const [s, yearStr, monthStr, weekStr, dayStr, hourStr, minuteStr, secondStr, millisecondsStr] =\n match;\n\n const hasNegativePrefix = s[0] === \"-\";\n const negativeSeconds = secondStr && secondStr[0] === \"-\";\n\n const maybeNegate = (num, force = false) =>\n num !== undefined && (force || (num && hasNegativePrefix)) ? -num : num;\n\n return [\n {\n years: maybeNegate(parseFloating(yearStr)),\n months: maybeNegate(parseFloating(monthStr)),\n weeks: maybeNegate(parseFloating(weekStr)),\n days: maybeNegate(parseFloating(dayStr)),\n hours: maybeNegate(parseFloating(hourStr)),\n minutes: maybeNegate(parseFloating(minuteStr)),\n seconds: maybeNegate(parseFloating(secondStr), secondStr === \"-0\"),\n milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds),\n },\n ];\n}\n\n// These are a little braindead. EDT *should* tell us that we're in, say, America/New_York\n// and not just that we're in -240 *right now*. But since I don't think these are used that often\n// I'm just going to ignore that\nconst obsOffsets = {\n GMT: 0,\n EDT: -4 * 60,\n EST: -5 * 60,\n CDT: -5 * 60,\n CST: -6 * 60,\n MDT: -6 * 60,\n MST: -7 * 60,\n PDT: -7 * 60,\n PST: -8 * 60,\n};\n\nfunction fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n const result = {\n year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr),\n month: English.monthsShort.indexOf(monthStr) + 1,\n day: parseInteger(dayStr),\n hour: parseInteger(hourStr),\n minute: parseInteger(minuteStr),\n };\n\n if (secondStr) result.second = parseInteger(secondStr);\n if (weekdayStr) {\n result.weekday =\n weekdayStr.length > 3\n ? English.weekdaysLong.indexOf(weekdayStr) + 1\n : English.weekdaysShort.indexOf(weekdayStr) + 1;\n }\n\n return result;\n}\n\n// RFC 2822/5322\nconst rfc2822 =\n /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\\d\\d)(\\d\\d)))$/;\n\nfunction extractRFC2822(match) {\n const [\n ,\n weekdayStr,\n dayStr,\n monthStr,\n yearStr,\n hourStr,\n minuteStr,\n secondStr,\n obsOffset,\n milOffset,\n offHourStr,\n offMinuteStr,\n ] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n\n let offset;\n if (obsOffset) {\n offset = obsOffsets[obsOffset];\n } else if (milOffset) {\n offset = 0;\n } else {\n offset = signedOffset(offHourStr, offMinuteStr);\n }\n\n return [result, new FixedOffsetZone(offset)];\n}\n\nfunction preprocessRFC2822(s) {\n // Remove comments and folding whitespace and replace multiple-spaces with a single space\n return s\n .replace(/\\([^()]*\\)|[\\n\\t]/g, \" \")\n .replace(/(\\s\\s+)/g, \" \")\n .trim();\n}\n\n// http date\n\nconst rfc1123 =\n /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\\d\\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\\d{4}) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n rfc850 =\n /^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\\d\\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n ascii =\n /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \\d|\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) (\\d{4})$/;\n\nfunction extractRFC1123Or850(match) {\n const [, weekdayStr, dayStr, monthStr, yearStr, hourStr, minuteStr, secondStr] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n return [result, FixedOffsetZone.utcInstance];\n}\n\nfunction extractASCII(match) {\n const [, weekdayStr, monthStr, dayStr, hourStr, minuteStr, secondStr, yearStr] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n return [result, FixedOffsetZone.utcInstance];\n}\n\nconst isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex);\nconst isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex);\nconst isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex);\nconst isoTimeCombinedRegex = combineRegexes(isoTimeRegex);\n\nconst extractISOYmdTimeAndOffset = combineExtractors(\n extractISOYmd,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOWeekTimeAndOffset = combineExtractors(\n extractISOWeekData,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOOrdinalDateAndTime = combineExtractors(\n extractISOOrdinalData,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOTimeAndOffset = combineExtractors(\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\n\n/*\n * @private\n */\n\nexport function parseISODate(s) {\n return parse(\n s,\n [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset],\n [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime],\n [isoTimeCombinedRegex, extractISOTimeAndOffset]\n );\n}\n\nexport function parseRFC2822Date(s) {\n return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]);\n}\n\nexport function parseHTTPDate(s) {\n return parse(\n s,\n [rfc1123, extractRFC1123Or850],\n [rfc850, extractRFC1123Or850],\n [ascii, extractASCII]\n );\n}\n\nexport function parseISODuration(s) {\n return parse(s, [isoDuration, extractISODuration]);\n}\n\nconst extractISOTimeOnly = combineExtractors(extractISOTime);\n\nexport function parseISOTimeOnly(s) {\n return parse(s, [isoTimeOnly, extractISOTimeOnly]);\n}\n\nconst sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex);\nconst sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex);\n\nconst extractISOTimeOffsetAndIANAZone = combineExtractors(\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\n\nexport function parseSQL(s) {\n return parse(\n s,\n [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]\n );\n}\n","import { InvalidArgumentError, InvalidDurationError, InvalidUnitError } from \"./errors.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport Invalid from \"./impl/invalid.js\";\nimport Locale from \"./impl/locale.js\";\nimport { parseISODuration, parseISOTimeOnly } from \"./impl/regexParser.js\";\nimport {\n asNumber,\n hasOwnProperty,\n isNumber,\n isUndefined,\n normalizeObject,\n roundTo,\n} from \"./impl/util.js\";\nimport Settings from \"./settings.js\";\nimport DateTime from \"./datetime.js\";\n\nconst INVALID = \"Invalid Duration\";\n\n// unit conversion constants\nexport const lowOrderMatrix = {\n weeks: {\n days: 7,\n hours: 7 * 24,\n minutes: 7 * 24 * 60,\n seconds: 7 * 24 * 60 * 60,\n milliseconds: 7 * 24 * 60 * 60 * 1000,\n },\n days: {\n hours: 24,\n minutes: 24 * 60,\n seconds: 24 * 60 * 60,\n milliseconds: 24 * 60 * 60 * 1000,\n },\n hours: { minutes: 60, seconds: 60 * 60, milliseconds: 60 * 60 * 1000 },\n minutes: { seconds: 60, milliseconds: 60 * 1000 },\n seconds: { milliseconds: 1000 },\n },\n casualMatrix = {\n years: {\n quarters: 4,\n months: 12,\n weeks: 52,\n days: 365,\n hours: 365 * 24,\n minutes: 365 * 24 * 60,\n seconds: 365 * 24 * 60 * 60,\n milliseconds: 365 * 24 * 60 * 60 * 1000,\n },\n quarters: {\n months: 3,\n weeks: 13,\n days: 91,\n hours: 91 * 24,\n minutes: 91 * 24 * 60,\n seconds: 91 * 24 * 60 * 60,\n milliseconds: 91 * 24 * 60 * 60 * 1000,\n },\n months: {\n weeks: 4,\n days: 30,\n hours: 30 * 24,\n minutes: 30 * 24 * 60,\n seconds: 30 * 24 * 60 * 60,\n milliseconds: 30 * 24 * 60 * 60 * 1000,\n },\n\n ...lowOrderMatrix,\n },\n daysInYearAccurate = 146097.0 / 400,\n daysInMonthAccurate = 146097.0 / 4800,\n accurateMatrix = {\n years: {\n quarters: 4,\n months: 12,\n weeks: daysInYearAccurate / 7,\n days: daysInYearAccurate,\n hours: daysInYearAccurate * 24,\n minutes: daysInYearAccurate * 24 * 60,\n seconds: daysInYearAccurate * 24 * 60 * 60,\n milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000,\n },\n quarters: {\n months: 3,\n weeks: daysInYearAccurate / 28,\n days: daysInYearAccurate / 4,\n hours: (daysInYearAccurate * 24) / 4,\n minutes: (daysInYearAccurate * 24 * 60) / 4,\n seconds: (daysInYearAccurate * 24 * 60 * 60) / 4,\n milliseconds: (daysInYearAccurate * 24 * 60 * 60 * 1000) / 4,\n },\n months: {\n weeks: daysInMonthAccurate / 7,\n days: daysInMonthAccurate,\n hours: daysInMonthAccurate * 24,\n minutes: daysInMonthAccurate * 24 * 60,\n seconds: daysInMonthAccurate * 24 * 60 * 60,\n milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000,\n },\n ...lowOrderMatrix,\n };\n\n// units ordered by size\nconst orderedUnits = [\n \"years\",\n \"quarters\",\n \"months\",\n \"weeks\",\n \"days\",\n \"hours\",\n \"minutes\",\n \"seconds\",\n \"milliseconds\",\n];\n\nconst reverseUnits = orderedUnits.slice(0).reverse();\n\n// clone really means \"create another instance just like this one, but with these changes\"\nfunction clone(dur, alts, clear = false) {\n // deep merge for vals\n const conf = {\n values: clear ? alts.values : { ...dur.values, ...(alts.values || {}) },\n loc: dur.loc.clone(alts.loc),\n conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy,\n matrix: alts.matrix || dur.matrix,\n };\n return new Duration(conf);\n}\n\nfunction durationToMillis(matrix, vals) {\n let sum = vals.milliseconds ?? 0;\n for (const unit of reverseUnits.slice(1)) {\n if (vals[unit]) {\n sum += vals[unit] * matrix[unit][\"milliseconds\"];\n }\n }\n return sum;\n}\n\n// NB: mutates parameters\nfunction normalizeValues(matrix, vals) {\n // the logic below assumes the overall value of the duration is positive\n // if this is not the case, factor is used to make it so\n const factor = durationToMillis(matrix, vals) < 0 ? -1 : 1;\n\n orderedUnits.reduceRight((previous, current) => {\n if (!isUndefined(vals[current])) {\n if (previous) {\n const previousVal = vals[previous] * factor;\n const conv = matrix[current][previous];\n\n // if (previousVal < 0):\n // lower order unit is negative (e.g. { years: 2, days: -2 })\n // normalize this by reducing the higher order unit by the appropriate amount\n // and increasing the lower order unit\n // this can never make the higher order unit negative, because this function only operates\n // on positive durations, so the amount of time represented by the lower order unit cannot\n // be larger than the higher order unit\n // else:\n // lower order unit is positive (e.g. { years: 2, days: 450 } or { years: -2, days: 450 })\n // in this case we attempt to convert as much as possible from the lower order unit into\n // the higher order one\n //\n // Math.floor takes care of both of these cases, rounding away from 0\n // if previousVal < 0 it makes the absolute value larger\n // if previousVal >= it makes the absolute value smaller\n const rollUp = Math.floor(previousVal / conv);\n vals[current] += rollUp * factor;\n vals[previous] -= rollUp * conv * factor;\n }\n return current;\n } else {\n return previous;\n }\n }, null);\n\n // try to convert any decimals into smaller units if possible\n // for example for { years: 2.5, days: 0, seconds: 0 } we want to get { years: 2, days: 182, hours: 12 }\n orderedUnits.reduce((previous, current) => {\n if (!isUndefined(vals[current])) {\n if (previous) {\n const fraction = vals[previous] % 1;\n vals[previous] -= fraction;\n vals[current] += fraction * matrix[previous][current];\n }\n return current;\n } else {\n return previous;\n }\n }, null);\n}\n\n// Remove all properties with a value of 0 from an object\nfunction removeZeroes(vals) {\n const newVals = {};\n for (const [key, value] of Object.entries(vals)) {\n if (value !== 0) {\n newVals[key] = value;\n }\n }\n return newVals;\n}\n\n/**\n * A Duration object represents a period of time, like \"2 months\" or \"1 day, 1 hour\". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime#plus} to add a Duration object to a DateTime, producing another DateTime.\n *\n * Here is a brief overview of commonly used methods and getters in Duration:\n *\n * * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}.\n * * **Unit values** See the {@link Duration#years}, {@link Duration#months}, {@link Duration#weeks}, {@link Duration#days}, {@link Duration#hours}, {@link Duration#minutes}, {@link Duration#seconds}, {@link Duration#milliseconds} accessors.\n * * **Configuration** See {@link Duration#locale} and {@link Duration#numberingSystem} accessors.\n * * **Transformation** To create new Durations out of old ones use {@link Duration#plus}, {@link Duration#minus}, {@link Duration#normalize}, {@link Duration#set}, {@link Duration#reconfigure}, {@link Duration#shiftTo}, and {@link Duration#negate}.\n * * **Output** To convert the Duration into other representations, see {@link Duration#as}, {@link Duration#toISO}, {@link Duration#toFormat}, and {@link Duration#toJSON}\n *\n * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation.\n */\nexport default class Duration {\n /**\n * @private\n */\n constructor(config) {\n const accurate = config.conversionAccuracy === \"longterm\" || false;\n let matrix = accurate ? accurateMatrix : casualMatrix;\n\n if (config.matrix) {\n matrix = config.matrix;\n }\n\n /**\n * @access private\n */\n this.values = config.values;\n /**\n * @access private\n */\n this.loc = config.loc || Locale.create();\n /**\n * @access private\n */\n this.conversionAccuracy = accurate ? \"longterm\" : \"casual\";\n /**\n * @access private\n */\n this.invalid = config.invalid || null;\n /**\n * @access private\n */\n this.matrix = matrix;\n /**\n * @access private\n */\n this.isLuxonDuration = true;\n }\n\n /**\n * Create Duration from a number of milliseconds.\n * @param {number} count of milliseconds\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @return {Duration}\n */\n static fromMillis(count, opts) {\n return Duration.fromObject({ milliseconds: count }, opts);\n }\n\n /**\n * Create a Duration from a JavaScript object with keys like 'years' and 'hours'.\n * If this object is empty then a zero milliseconds duration is returned.\n * @param {Object} obj - the object to create the DateTime from\n * @param {number} obj.years\n * @param {number} obj.quarters\n * @param {number} obj.months\n * @param {number} obj.weeks\n * @param {number} obj.days\n * @param {number} obj.hours\n * @param {number} obj.minutes\n * @param {number} obj.seconds\n * @param {number} obj.milliseconds\n * @param {Object} [opts=[]] - options for creating this Duration\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the custom conversion system to use\n * @return {Duration}\n */\n static fromObject(obj, opts = {}) {\n if (obj == null || typeof obj !== \"object\") {\n throw new InvalidArgumentError(\n `Duration.fromObject: argument expected to be an object, got ${\n obj === null ? \"null\" : typeof obj\n }`\n );\n }\n\n return new Duration({\n values: normalizeObject(obj, Duration.normalizeUnit),\n loc: Locale.fromObject(opts),\n conversionAccuracy: opts.conversionAccuracy,\n matrix: opts.matrix,\n });\n }\n\n /**\n * Create a Duration from DurationLike.\n *\n * @param {Object | number | Duration} durationLike\n * One of:\n * - object with keys like 'years' and 'hours'.\n * - number representing milliseconds\n * - Duration instance\n * @return {Duration}\n */\n static fromDurationLike(durationLike) {\n if (isNumber(durationLike)) {\n return Duration.fromMillis(durationLike);\n } else if (Duration.isDuration(durationLike)) {\n return durationLike;\n } else if (typeof durationLike === \"object\") {\n return Duration.fromObject(durationLike);\n } else {\n throw new InvalidArgumentError(\n `Unknown duration argument ${durationLike} of type ${typeof durationLike}`\n );\n }\n }\n\n /**\n * Create a Duration from an ISO 8601 duration string.\n * @param {string} text - text to parse\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the preset conversion system to use\n * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 }\n * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 }\n * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 }\n * @return {Duration}\n */\n static fromISO(text, opts) {\n const [parsed] = parseISODuration(text);\n if (parsed) {\n return Duration.fromObject(parsed, opts);\n } else {\n return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n }\n\n /**\n * Create a Duration from an ISO 8601 time string.\n * @param {string} text - text to parse\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the conversion system to use\n * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n * @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 }\n * @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @return {Duration}\n */\n static fromISOTime(text, opts) {\n const [parsed] = parseISOTimeOnly(text);\n if (parsed) {\n return Duration.fromObject(parsed, opts);\n } else {\n return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n }\n\n /**\n * Create an invalid Duration.\n * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {Duration}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the Duration is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidDurationError(invalid);\n } else {\n return new Duration({ invalid });\n }\n }\n\n /**\n * @private\n */\n static normalizeUnit(unit) {\n const normalized = {\n year: \"years\",\n years: \"years\",\n quarter: \"quarters\",\n quarters: \"quarters\",\n month: \"months\",\n months: \"months\",\n week: \"weeks\",\n weeks: \"weeks\",\n day: \"days\",\n days: \"days\",\n hour: \"hours\",\n hours: \"hours\",\n minute: \"minutes\",\n minutes: \"minutes\",\n second: \"seconds\",\n seconds: \"seconds\",\n millisecond: \"milliseconds\",\n milliseconds: \"milliseconds\",\n }[unit ? unit.toLowerCase() : unit];\n\n if (!normalized) throw new InvalidUnitError(unit);\n\n return normalized;\n }\n\n /**\n * Check if an object is a Duration. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isDuration(o) {\n return (o && o.isLuxonDuration) || false;\n }\n\n /**\n * Get the locale of a Duration, such 'en-GB'\n * @type {string}\n */\n get locale() {\n return this.isValid ? this.loc.locale : null;\n }\n\n /**\n * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration\n *\n * @type {string}\n */\n get numberingSystem() {\n return this.isValid ? this.loc.numberingSystem : null;\n }\n\n /**\n * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens:\n * * `S` for milliseconds\n * * `s` for seconds\n * * `m` for minutes\n * * `h` for hours\n * * `d` for days\n * * `w` for weeks\n * * `M` for months\n * * `y` for years\n * Notes:\n * * Add padding by repeating the token, e.g. \"yy\" pads the years to two digits, \"hhhh\" pads the hours out to four digits\n * * Tokens can be escaped by wrapping with single quotes.\n * * The duration will be converted to the set of units in the format string using {@link Duration#shiftTo} and the Durations's conversion accuracy setting.\n * @param {string} fmt - the format string\n * @param {Object} opts - options\n * @param {boolean} [opts.floor=true] - floor numerical values\n * @param {'negative'|'all'|'negativeLargestOnly'} [opts.signMode=negative] - How to handle signs\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"y d s\") //=> \"1 6 2\"\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"yy dd sss\") //=> \"01 06 002\"\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"M S\") //=> \"12 518402000\"\n * @example Duration.fromObject({ days: 6, seconds: 2 }).toFormat(\"d s\", { signMode: \"all\" }) //=> \"+6 +2\"\n * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat(\"d s\", { signMode: \"all\" }) //=> \"-6 -2\"\n * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat(\"d s\", { signMode: \"negativeLargestOnly\" }) //=> \"-6 2\"\n * @return {string}\n */\n toFormat(fmt, opts = {}) {\n // reverse-compat since 1.2; we always round down now, never up, and we do it by default\n const fmtOpts = {\n ...opts,\n floor: opts.round !== false && opts.floor !== false,\n };\n return this.isValid\n ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt)\n : INVALID;\n }\n\n /**\n * Returns a string representation of a Duration with all units included.\n * To modify its behavior, use `listStyle` and any Intl.NumberFormat option, though `unitDisplay` is especially relevant.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options\n * @param {Object} opts - Formatting options. Accepts the same keys as the options parameter of the native `Intl.NumberFormat` constructor, as well as `listStyle`.\n * @param {string} [opts.listStyle='narrow'] - How to format the merged list. Corresponds to the `style` property of the options parameter of the native `Intl.ListFormat` constructor.\n * @param {boolean} [opts.showZeros=true] - Show all units previously used by the duration even if they are zero\n * @example\n * ```js\n * var dur = Duration.fromObject({ months: 1, weeks: 0, hours: 5, minutes: 6 })\n * dur.toHuman() //=> '1 month, 0 weeks, 5 hours, 6 minutes'\n * dur.toHuman({ listStyle: \"long\" }) //=> '1 month, 0 weeks, 5 hours, and 6 minutes'\n * dur.toHuman({ unitDisplay: \"short\" }) //=> '1 mth, 0 wks, 5 hr, 6 min'\n * dur.toHuman({ showZeros: false }) //=> '1 month, 5 hours, 6 minutes'\n * ```\n */\n toHuman(opts = {}) {\n if (!this.isValid) return INVALID;\n\n const showZeros = opts.showZeros !== false;\n\n const l = orderedUnits\n .map((unit) => {\n const val = this.values[unit];\n if (isUndefined(val) || (val === 0 && !showZeros)) {\n return null;\n }\n return this.loc\n .numberFormatter({ style: \"unit\", unitDisplay: \"long\", ...opts, unit: unit.slice(0, -1) })\n .format(val);\n })\n .filter((n) => n);\n\n return this.loc\n .listFormatter({ type: \"conjunction\", style: opts.listStyle || \"narrow\", ...opts })\n .format(l);\n }\n\n /**\n * Returns a JavaScript object with this Duration's values.\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 }\n * @return {Object}\n */\n toObject() {\n if (!this.isValid) return {};\n return { ...this.values };\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Duration.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S'\n * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S'\n * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M'\n * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M'\n * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S'\n * @return {string}\n */\n toISO() {\n // we could use the formatter, but this is an easier way to get the minimum string\n if (!this.isValid) return null;\n\n let s = \"P\";\n if (this.years !== 0) s += this.years + \"Y\";\n if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + \"M\";\n if (this.weeks !== 0) s += this.weeks + \"W\";\n if (this.days !== 0) s += this.days + \"D\";\n if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0)\n s += \"T\";\n if (this.hours !== 0) s += this.hours + \"H\";\n if (this.minutes !== 0) s += this.minutes + \"M\";\n if (this.seconds !== 0 || this.milliseconds !== 0)\n // this will handle \"floating point madness\" by removing extra decimal places\n // https://stackoverflow.com/questions/588004/is-floating-point-math-broken\n s += roundTo(this.seconds + this.milliseconds / 1000, 3) + \"S\";\n if (s === \"P\") s += \"T0S\";\n return s;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day.\n * Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000'\n * @return {string}\n */\n toISOTime(opts = {}) {\n if (!this.isValid) return null;\n\n const millis = this.toMillis();\n if (millis < 0 || millis >= 86400000) return null;\n\n opts = {\n suppressMilliseconds: false,\n suppressSeconds: false,\n includePrefix: false,\n format: \"extended\",\n ...opts,\n includeOffset: false,\n };\n\n const dateTime = DateTime.fromMillis(millis, { zone: \"UTC\" });\n return dateTime.toISOTime(opts);\n }\n\n /**\n * Returns an ISO 8601 representation of this Duration appropriate for use in JSON.\n * @return {string}\n */\n toJSON() {\n return this.toISO();\n }\n\n /**\n * Returns an ISO 8601 representation of this Duration appropriate for use in debugging.\n * @return {string}\n */\n toString() {\n return this.toISO();\n }\n\n /**\n * Returns a string representation of this Duration appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `Duration { values: ${JSON.stringify(this.values)} }`;\n } else {\n return `Duration { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns an milliseconds value of this Duration.\n * @return {number}\n */\n toMillis() {\n if (!this.isValid) return NaN;\n\n return durationToMillis(this.matrix, this.values);\n }\n\n /**\n * Returns an milliseconds value of this Duration. Alias of {@link toMillis}\n * @return {number}\n */\n valueOf() {\n return this.toMillis();\n }\n\n /**\n * Make this Duration longer by the specified amount. Return a newly-constructed Duration.\n * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @return {Duration}\n */\n plus(duration) {\n if (!this.isValid) return this;\n\n const dur = Duration.fromDurationLike(duration),\n result = {};\n\n for (const k of orderedUnits) {\n if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) {\n result[k] = dur.get(k) + this.get(k);\n }\n }\n\n return clone(this, { values: result }, true);\n }\n\n /**\n * Make this Duration shorter by the specified amount. Return a newly-constructed Duration.\n * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @return {Duration}\n */\n minus(duration) {\n if (!this.isValid) return this;\n\n const dur = Duration.fromDurationLike(duration);\n return this.plus(dur.negate());\n }\n\n /**\n * Scale this Duration by the specified amount. Return a newly-constructed Duration.\n * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number.\n * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits(x => x * 2) //=> { hours: 2, minutes: 60 }\n * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits((x, u) => u === \"hours\" ? x * 2 : x) //=> { hours: 2, minutes: 30 }\n * @return {Duration}\n */\n mapUnits(fn) {\n if (!this.isValid) return this;\n const result = {};\n for (const k of Object.keys(this.values)) {\n result[k] = asNumber(fn(this.values[k], k));\n }\n return clone(this, { values: result }, true);\n }\n\n /**\n * Get the value of unit.\n * @param {string} unit - a unit such as 'minute' or 'day'\n * @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2\n * @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0\n * @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3\n * @return {number}\n */\n get(unit) {\n return this[Duration.normalizeUnit(unit)];\n }\n\n /**\n * \"Set\" the values of specified units. Return a newly-constructed Duration.\n * @param {Object} values - a mapping of units to numbers\n * @example dur.set({ years: 2017 })\n * @example dur.set({ hours: 8, minutes: 30 })\n * @return {Duration}\n */\n set(values) {\n if (!this.isValid) return this;\n\n const mixed = { ...this.values, ...normalizeObject(values, Duration.normalizeUnit) };\n return clone(this, { values: mixed });\n }\n\n /**\n * \"Set\" the locale and/or numberingSystem. Returns a newly-constructed Duration.\n * @example dur.reconfigure({ locale: 'en-GB' })\n * @return {Duration}\n */\n reconfigure({ locale, numberingSystem, conversionAccuracy, matrix } = {}) {\n const loc = this.loc.clone({ locale, numberingSystem });\n const opts = { loc, matrix, conversionAccuracy };\n return clone(this, opts);\n }\n\n /**\n * Return the length of the duration in the specified unit.\n * @param {string} unit - a unit such as 'minutes' or 'days'\n * @example Duration.fromObject({years: 1}).as('days') //=> 365\n * @example Duration.fromObject({years: 1}).as('months') //=> 12\n * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5\n * @return {number}\n */\n as(unit) {\n return this.isValid ? this.shiftTo(unit).get(unit) : NaN;\n }\n\n /**\n * Reduce this Duration to its canonical representation in its current units.\n * Assuming the overall value of the Duration is positive, this means:\n * - excessive values for lower-order units are converted to higher-order units (if possible, see first and second example)\n * - negative lower-order units are converted to higher order units (there must be such a higher order unit, otherwise\n * the overall value would be negative, see third example)\n * - fractional values for higher-order units are converted to lower-order units (if possible, see fourth example)\n *\n * If the overall value is negative, the result of this method is equivalent to `this.negate().normalize().negate()`.\n * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 }\n * @example Duration.fromObject({ days: 5000 }).normalize().toObject() //=> { days: 5000 }\n * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 }\n * @example Duration.fromObject({ years: 2.5, days: 0, hours: 0 }).normalize().toObject() //=> { years: 2, days: 182, hours: 12 }\n * @return {Duration}\n */\n normalize() {\n if (!this.isValid) return this;\n const vals = this.toObject();\n normalizeValues(this.matrix, vals);\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Rescale units to its largest representation\n * @example Duration.fromObject({ milliseconds: 90000 }).rescale().toObject() //=> { minutes: 1, seconds: 30 }\n * @return {Duration}\n */\n rescale() {\n if (!this.isValid) return this;\n const vals = removeZeroes(this.normalize().shiftToAll().toObject());\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Convert this Duration into its representation in a different set of units.\n * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 }\n * @return {Duration}\n */\n shiftTo(...units) {\n if (!this.isValid) return this;\n\n if (units.length === 0) {\n return this;\n }\n\n units = units.map((u) => Duration.normalizeUnit(u));\n\n const built = {},\n accumulated = {},\n vals = this.toObject();\n let lastUnit;\n\n for (const k of orderedUnits) {\n if (units.indexOf(k) >= 0) {\n lastUnit = k;\n\n let own = 0;\n\n // anything we haven't boiled down yet should get boiled to this unit\n for (const ak in accumulated) {\n own += this.matrix[ak][k] * accumulated[ak];\n accumulated[ak] = 0;\n }\n\n // plus anything that's already in this unit\n if (isNumber(vals[k])) {\n own += vals[k];\n }\n\n // only keep the integer part for now in the hopes of putting any decimal part\n // into a smaller unit later\n const i = Math.trunc(own);\n built[k] = i;\n accumulated[k] = (own * 1000 - i * 1000) / 1000;\n\n // otherwise, keep it in the wings to boil it later\n } else if (isNumber(vals[k])) {\n accumulated[k] = vals[k];\n }\n }\n\n // anything leftover becomes the decimal for the last unit\n // lastUnit must be defined since units is not empty\n for (const key in accumulated) {\n if (accumulated[key] !== 0) {\n built[lastUnit] +=\n key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key];\n }\n }\n\n normalizeValues(this.matrix, built);\n return clone(this, { values: built }, true);\n }\n\n /**\n * Shift this Duration to all available units.\n * Same as shiftTo(\"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", \"seconds\", \"milliseconds\")\n * @return {Duration}\n */\n shiftToAll() {\n if (!this.isValid) return this;\n return this.shiftTo(\n \"years\",\n \"months\",\n \"weeks\",\n \"days\",\n \"hours\",\n \"minutes\",\n \"seconds\",\n \"milliseconds\"\n );\n }\n\n /**\n * Return the negative of this Duration.\n * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 }\n * @return {Duration}\n */\n negate() {\n if (!this.isValid) return this;\n const negated = {};\n for (const k of Object.keys(this.values)) {\n negated[k] = this.values[k] === 0 ? 0 : -this.values[k];\n }\n return clone(this, { values: negated }, true);\n }\n\n /**\n * Removes all units with values equal to 0 from this Duration.\n * @example Duration.fromObject({ years: 2, days: 0, hours: 0, minutes: 0 }).removeZeros().toObject() //=> { years: 2 }\n * @return {Duration}\n */\n removeZeros() {\n if (!this.isValid) return this;\n const vals = removeZeroes(this.values);\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Get the years.\n * @type {number}\n */\n get years() {\n return this.isValid ? this.values.years || 0 : NaN;\n }\n\n /**\n * Get the quarters.\n * @type {number}\n */\n get quarters() {\n return this.isValid ? this.values.quarters || 0 : NaN;\n }\n\n /**\n * Get the months.\n * @type {number}\n */\n get months() {\n return this.isValid ? this.values.months || 0 : NaN;\n }\n\n /**\n * Get the weeks\n * @type {number}\n */\n get weeks() {\n return this.isValid ? this.values.weeks || 0 : NaN;\n }\n\n /**\n * Get the days.\n * @type {number}\n */\n get days() {\n return this.isValid ? this.values.days || 0 : NaN;\n }\n\n /**\n * Get the hours.\n * @type {number}\n */\n get hours() {\n return this.isValid ? this.values.hours || 0 : NaN;\n }\n\n /**\n * Get the minutes.\n * @type {number}\n */\n get minutes() {\n return this.isValid ? this.values.minutes || 0 : NaN;\n }\n\n /**\n * Get the seconds.\n * @return {number}\n */\n get seconds() {\n return this.isValid ? this.values.seconds || 0 : NaN;\n }\n\n /**\n * Get the milliseconds.\n * @return {number}\n */\n get milliseconds() {\n return this.isValid ? this.values.milliseconds || 0 : NaN;\n }\n\n /**\n * Returns whether the Duration is invalid. Invalid durations are returned by diff operations\n * on invalid DateTimes or Intervals.\n * @return {boolean}\n */\n get isValid() {\n return this.invalid === null;\n }\n\n /**\n * Returns an error code if this Duration became invalid, or null if the Duration is valid\n * @return {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this Duration became invalid, or null if the Duration is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Equality check\n * Two Durations are equal iff they have the same units and the same values for each unit.\n * @param {Duration} other\n * @return {boolean}\n */\n equals(other) {\n if (!this.isValid || !other.isValid) {\n return false;\n }\n\n if (!this.loc.equals(other.loc)) {\n return false;\n }\n\n function eq(v1, v2) {\n // Consider 0 and undefined as equal\n if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0;\n return v1 === v2;\n }\n\n for (const u of orderedUnits) {\n if (!eq(this.values[u], other.values[u])) {\n return false;\n }\n }\n return true;\n }\n}\n","import DateTime, { friendlyDateTime } from \"./datetime.js\";\nimport Duration from \"./duration.js\";\nimport Settings from \"./settings.js\";\nimport { InvalidArgumentError, InvalidIntervalError } from \"./errors.js\";\nimport Invalid from \"./impl/invalid.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport * as Formats from \"./impl/formats.js\";\n\nconst INVALID = \"Invalid Interval\";\n\n// checks if the start is equal to or before the end\nfunction validateStartEnd(start, end) {\n if (!start || !start.isValid) {\n return Interval.invalid(\"missing or invalid start\");\n } else if (!end || !end.isValid) {\n return Interval.invalid(\"missing or invalid end\");\n } else if (end < start) {\n return Interval.invalid(\n \"end before start\",\n `The end of an interval must be after its start, but you had start=${start.toISO()} and end=${end.toISO()}`\n );\n } else {\n return null;\n }\n}\n\n/**\n * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them.\n *\n * Here is a brief overview of the most commonly used methods and getters in Interval:\n *\n * * **Creation** To create an Interval, use {@link Interval.fromDateTimes}, {@link Interval.after}, {@link Interval.before}, or {@link Interval.fromISO}.\n * * **Accessors** Use {@link Interval#start} and {@link Interval#end} to get the start and end.\n * * **Interrogation** To analyze the Interval, use {@link Interval#count}, {@link Interval#length}, {@link Interval#hasSame}, {@link Interval#contains}, {@link Interval#isAfter}, or {@link Interval#isBefore}.\n * * **Transformation** To create other Intervals out of this one, use {@link Interval#set}, {@link Interval#splitAt}, {@link Interval#splitBy}, {@link Interval#divideEqually}, {@link Interval.merge}, {@link Interval.xor}, {@link Interval#union}, {@link Interval#intersection}, or {@link Interval#difference}.\n * * **Comparison** To compare this Interval to another one, use {@link Interval#equals}, {@link Interval#overlaps}, {@link Interval#abutsStart}, {@link Interval#abutsEnd}, {@link Interval#engulfs}\n * * **Output** To convert the Interval into other representations, see {@link Interval#toString}, {@link Interval#toLocaleString}, {@link Interval#toISO}, {@link Interval#toISODate}, {@link Interval#toISOTime}, {@link Interval#toFormat}, and {@link Interval#toDuration}.\n */\nexport default class Interval {\n /**\n * @private\n */\n constructor(config) {\n /**\n * @access private\n */\n this.s = config.start;\n /**\n * @access private\n */\n this.e = config.end;\n /**\n * @access private\n */\n this.invalid = config.invalid || null;\n /**\n * @access private\n */\n this.isLuxonInterval = true;\n }\n\n /**\n * Create an invalid Interval.\n * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {Interval}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the Interval is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidIntervalError(invalid);\n } else {\n return new Interval({ invalid });\n }\n }\n\n /**\n * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end.\n * @param {DateTime|Date|Object} start\n * @param {DateTime|Date|Object} end\n * @return {Interval}\n */\n static fromDateTimes(start, end) {\n const builtStart = friendlyDateTime(start),\n builtEnd = friendlyDateTime(end);\n\n const validateError = validateStartEnd(builtStart, builtEnd);\n\n if (validateError == null) {\n return new Interval({\n start: builtStart,\n end: builtEnd,\n });\n } else {\n return validateError;\n }\n }\n\n /**\n * Create an Interval from a start DateTime and a Duration to extend to.\n * @param {DateTime|Date|Object} start\n * @param {Duration|Object|number} duration - the length of the Interval.\n * @return {Interval}\n */\n static after(start, duration) {\n const dur = Duration.fromDurationLike(duration),\n dt = friendlyDateTime(start);\n return Interval.fromDateTimes(dt, dt.plus(dur));\n }\n\n /**\n * Create an Interval from an end DateTime and a Duration to extend backwards to.\n * @param {DateTime|Date|Object} end\n * @param {Duration|Object|number} duration - the length of the Interval.\n * @return {Interval}\n */\n static before(end, duration) {\n const dur = Duration.fromDurationLike(duration),\n dt = friendlyDateTime(end);\n return Interval.fromDateTimes(dt.minus(dur), dt);\n }\n\n /**\n * Create an Interval from an ISO 8601 string.\n * Accepts `/`, `/`, and `/` formats.\n * @param {string} text - the ISO string to parse\n * @param {Object} [opts] - options to pass {@link DateTime#fromISO} and optionally {@link Duration#fromISO}\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @return {Interval}\n */\n static fromISO(text, opts) {\n const [s, e] = (text || \"\").split(\"/\", 2);\n if (s && e) {\n let start, startIsValid;\n try {\n start = DateTime.fromISO(s, opts);\n startIsValid = start.isValid;\n } catch (e) {\n startIsValid = false;\n }\n\n let end, endIsValid;\n try {\n end = DateTime.fromISO(e, opts);\n endIsValid = end.isValid;\n } catch (e) {\n endIsValid = false;\n }\n\n if (startIsValid && endIsValid) {\n return Interval.fromDateTimes(start, end);\n }\n\n if (startIsValid) {\n const dur = Duration.fromISO(e, opts);\n if (dur.isValid) {\n return Interval.after(start, dur);\n }\n } else if (endIsValid) {\n const dur = Duration.fromISO(s, opts);\n if (dur.isValid) {\n return Interval.before(end, dur);\n }\n }\n }\n return Interval.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n\n /**\n * Check if an object is an Interval. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isInterval(o) {\n return (o && o.isLuxonInterval) || false;\n }\n\n /**\n * Returns the start of the Interval\n * @type {DateTime}\n */\n get start() {\n return this.isValid ? this.s : null;\n }\n\n /**\n * Returns the end of the Interval. This is the first instant which is not part of the interval\n * (Interval is half-open).\n * @type {DateTime}\n */\n get end() {\n return this.isValid ? this.e : null;\n }\n\n /**\n * Returns the last DateTime included in the interval (since end is not part of the interval)\n * @type {DateTime}\n */\n get lastDateTime() {\n return this.isValid ? (this.e ? this.e.minus(1) : null) : null;\n }\n\n /**\n * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'.\n * @type {boolean}\n */\n get isValid() {\n return this.invalidReason === null;\n }\n\n /**\n * Returns an error code if this Interval is invalid, or null if the Interval is valid\n * @type {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this Interval became invalid, or null if the Interval is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Returns the length of the Interval in the specified unit.\n * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in.\n * @return {number}\n */\n length(unit = \"milliseconds\") {\n return this.isValid ? this.toDuration(...[unit]).get(unit) : NaN;\n }\n\n /**\n * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part.\n * Unlike {@link Interval#length} this counts sections of the calendar, not periods of time, e.g. specifying 'day'\n * asks 'what dates are included in this interval?', not 'how many days long is this interval?'\n * @param {string} [unit='milliseconds'] - the unit of time to count.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; this operation will always use the locale of the start DateTime\n * @return {number}\n */\n count(unit = \"milliseconds\", opts) {\n if (!this.isValid) return NaN;\n const start = this.start.startOf(unit, opts);\n let end;\n if (opts?.useLocaleWeeks) {\n end = this.end.reconfigure({ locale: start.locale });\n } else {\n end = this.end;\n }\n end = end.startOf(unit, opts);\n return Math.floor(end.diff(start, unit).get(unit)) + (end.valueOf() !== this.end.valueOf());\n }\n\n /**\n * Returns whether this Interval's start and end are both in the same unit of time\n * @param {string} unit - the unit of time to check sameness on\n * @return {boolean}\n */\n hasSame(unit) {\n return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false;\n }\n\n /**\n * Return whether this Interval has the same start and end DateTimes.\n * @return {boolean}\n */\n isEmpty() {\n return this.s.valueOf() === this.e.valueOf();\n }\n\n /**\n * Return whether this Interval's start is after the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n isAfter(dateTime) {\n if (!this.isValid) return false;\n return this.s > dateTime;\n }\n\n /**\n * Return whether this Interval's end is before the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n isBefore(dateTime) {\n if (!this.isValid) return false;\n return this.e <= dateTime;\n }\n\n /**\n * Return whether this Interval contains the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n contains(dateTime) {\n if (!this.isValid) return false;\n return this.s <= dateTime && this.e > dateTime;\n }\n\n /**\n * \"Sets\" the start and/or end dates. Returns a newly-constructed Interval.\n * @param {Object} values - the values to set\n * @param {DateTime} values.start - the starting DateTime\n * @param {DateTime} values.end - the ending DateTime\n * @return {Interval}\n */\n set({ start, end } = {}) {\n if (!this.isValid) return this;\n return Interval.fromDateTimes(start || this.s, end || this.e);\n }\n\n /**\n * Split this Interval at each of the specified DateTimes\n * @param {...DateTime} dateTimes - the unit of time to count.\n * @return {Array}\n */\n splitAt(...dateTimes) {\n if (!this.isValid) return [];\n const sorted = dateTimes\n .map(friendlyDateTime)\n .filter((d) => this.contains(d))\n .sort((a, b) => a.toMillis() - b.toMillis()),\n results = [];\n let { s } = this,\n i = 0;\n\n while (s < this.e) {\n const added = sorted[i] || this.e,\n next = +added > +this.e ? this.e : added;\n results.push(Interval.fromDateTimes(s, next));\n s = next;\n i += 1;\n }\n\n return results;\n }\n\n /**\n * Split this Interval into smaller Intervals, each of the specified length.\n * Left over time is grouped into a smaller interval\n * @param {Duration|Object|number} duration - The length of each resulting interval.\n * @return {Array}\n */\n splitBy(duration) {\n const dur = Duration.fromDurationLike(duration);\n\n if (!this.isValid || !dur.isValid || dur.as(\"milliseconds\") === 0) {\n return [];\n }\n\n let { s } = this,\n idx = 1,\n next;\n\n const results = [];\n while (s < this.e) {\n const added = this.start.plus(dur.mapUnits((x) => x * idx));\n next = +added > +this.e ? this.e : added;\n results.push(Interval.fromDateTimes(s, next));\n s = next;\n idx += 1;\n }\n\n return results;\n }\n\n /**\n * Split this Interval into the specified number of smaller intervals.\n * @param {number} numberOfParts - The number of Intervals to divide the Interval into.\n * @return {Array}\n */\n divideEqually(numberOfParts) {\n if (!this.isValid) return [];\n return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts);\n }\n\n /**\n * Return whether this Interval overlaps with the specified Interval\n * @param {Interval} other\n * @return {boolean}\n */\n overlaps(other) {\n return this.e > other.s && this.s < other.e;\n }\n\n /**\n * Return whether this Interval's end is adjacent to the specified Interval's start.\n * @param {Interval} other\n * @return {boolean}\n */\n abutsStart(other) {\n if (!this.isValid) return false;\n return +this.e === +other.s;\n }\n\n /**\n * Return whether this Interval's start is adjacent to the specified Interval's end.\n * @param {Interval} other\n * @return {boolean}\n */\n abutsEnd(other) {\n if (!this.isValid) return false;\n return +other.e === +this.s;\n }\n\n /**\n * Returns true if this Interval fully contains the specified Interval, specifically if the intersect (of this Interval and the other Interval) is equal to the other Interval; false otherwise.\n * @param {Interval} other\n * @return {boolean}\n */\n engulfs(other) {\n if (!this.isValid) return false;\n return this.s <= other.s && this.e >= other.e;\n }\n\n /**\n * Return whether this Interval has the same start and end as the specified Interval.\n * @param {Interval} other\n * @return {boolean}\n */\n equals(other) {\n if (!this.isValid || !other.isValid) {\n return false;\n }\n\n return this.s.equals(other.s) && this.e.equals(other.e);\n }\n\n /**\n * Return an Interval representing the intersection of this Interval and the specified Interval.\n * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals.\n * Returns null if the intersection is empty, meaning, the intervals don't intersect.\n * @param {Interval} other\n * @return {Interval}\n */\n intersection(other) {\n if (!this.isValid) return this;\n const s = this.s > other.s ? this.s : other.s,\n e = this.e < other.e ? this.e : other.e;\n\n if (s >= e) {\n return null;\n } else {\n return Interval.fromDateTimes(s, e);\n }\n }\n\n /**\n * Return an Interval representing the union of this Interval and the specified Interval.\n * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals.\n * @param {Interval} other\n * @return {Interval}\n */\n union(other) {\n if (!this.isValid) return this;\n const s = this.s < other.s ? this.s : other.s,\n e = this.e > other.e ? this.e : other.e;\n return Interval.fromDateTimes(s, e);\n }\n\n /**\n * Merge an array of Intervals into an equivalent minimal set of Intervals.\n * Combines overlapping and adjacent Intervals.\n * The resulting array will contain the Intervals in ascending order, that is, starting with the earliest Interval\n * and ending with the latest.\n *\n * @param {Array} intervals\n * @return {Array}\n */\n static merge(intervals) {\n const [found, final] = intervals\n .sort((a, b) => a.s - b.s)\n .reduce(\n ([sofar, current], item) => {\n if (!current) {\n return [sofar, item];\n } else if (current.overlaps(item) || current.abutsStart(item)) {\n return [sofar, current.union(item)];\n } else {\n return [sofar.concat([current]), item];\n }\n },\n [[], null]\n );\n if (final) {\n found.push(final);\n }\n return found;\n }\n\n /**\n * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals.\n * @param {Array} intervals\n * @return {Array}\n */\n static xor(intervals) {\n let start = null,\n currentCount = 0;\n const results = [],\n ends = intervals.map((i) => [\n { time: i.s, type: \"s\" },\n { time: i.e, type: \"e\" },\n ]),\n flattened = Array.prototype.concat(...ends),\n arr = flattened.sort((a, b) => a.time - b.time);\n\n for (const i of arr) {\n currentCount += i.type === \"s\" ? 1 : -1;\n\n if (currentCount === 1) {\n start = i.time;\n } else {\n if (start && +start !== +i.time) {\n results.push(Interval.fromDateTimes(start, i.time));\n }\n\n start = null;\n }\n }\n\n return Interval.merge(results);\n }\n\n /**\n * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals.\n * @param {...Interval} intervals\n * @return {Array}\n */\n difference(...intervals) {\n return Interval.xor([this].concat(intervals))\n .map((i) => this.intersection(i))\n .filter((i) => i && !i.isEmpty());\n }\n\n /**\n * Returns a string representation of this Interval appropriate for debugging.\n * @return {string}\n */\n toString() {\n if (!this.isValid) return INVALID;\n return `[${this.s.toISO()} – ${this.e.toISO()})`;\n }\n\n /**\n * Returns a string representation of this Interval appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `Interval { start: ${this.s.toISO()}, end: ${this.e.toISO()} }`;\n } else {\n return `Interval { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns a localized string representing this Interval. Accepts the same options as the\n * Intl.DateTimeFormat constructor and any presets defined by Luxon, such as\n * {@link DateTime.DATE_FULL} or {@link DateTime.TIME_SIMPLE}. The exact behavior of this method\n * is browser-specific, but in general it will return an appropriate representation of the\n * Interval in the assigned locale. Defaults to the system's locale if no locale has been\n * specified.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {Object} [formatOpts=DateTime.DATE_SHORT] - Either a DateTime preset or\n * Intl.DateTimeFormat constructor options.\n * @param {Object} opts - Options to override the configuration of the start DateTime.\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(); //=> 11/7/2022 – 11/8/2022\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL); //=> November 7 – 8, 2022\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL, { locale: 'fr-FR' }); //=> 7–8 novembre 2022\n * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString(DateTime.TIME_SIMPLE); //=> 6:00 – 8:00 PM\n * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> Mon, Nov 07, 6:00 – 8:00 p\n * @return {string}\n */\n toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) {\n return this.isValid\n ? Formatter.create(this.s.loc.clone(opts), formatOpts).formatInterval(this)\n : INVALID;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Interval.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @param {Object} opts - The same options as {@link DateTime#toISO}\n * @return {string}\n */\n toISO(opts) {\n if (!this.isValid) return INVALID;\n return `${this.s.toISO(opts)}/${this.e.toISO(opts)}`;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of date of this Interval.\n * The time components are ignored.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @return {string}\n */\n toISODate() {\n if (!this.isValid) return INVALID;\n return `${this.s.toISODate()}/${this.e.toISODate()}`;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of time of this Interval.\n * The date components are ignored.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @param {Object} opts - The same options as {@link DateTime#toISO}\n * @return {string}\n */\n toISOTime(opts) {\n if (!this.isValid) return INVALID;\n return `${this.s.toISOTime(opts)}/${this.e.toISOTime(opts)}`;\n }\n\n /**\n * Returns a string representation of this Interval formatted according to the specified format\n * string. **You may not want this.** See {@link Interval#toLocaleString} for a more flexible\n * formatting tool.\n * @param {string} dateFormat - The format string. This string formats the start and end time.\n * See {@link DateTime#toFormat} for details.\n * @param {Object} opts - Options.\n * @param {string} [opts.separator = ' – '] - A separator to place between the start and end\n * representations.\n * @return {string}\n */\n toFormat(dateFormat, { separator = \" – \" } = {}) {\n if (!this.isValid) return INVALID;\n return `${this.s.toFormat(dateFormat)}${separator}${this.e.toFormat(dateFormat)}`;\n }\n\n /**\n * Return a Duration representing the time spanned by this interval.\n * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration.\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 }\n * @return {Duration}\n */\n toDuration(unit, opts) {\n if (!this.isValid) {\n return Duration.invalid(this.invalidReason);\n }\n return this.e.diff(this.s, unit, opts);\n }\n\n /**\n * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes\n * @param {function} mapFn\n * @return {Interval}\n * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC())\n * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 }))\n */\n mapEndpoints(mapFn) {\n return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e));\n }\n}\n","import DateTime from \"./datetime.js\";\nimport Settings from \"./settings.js\";\nimport Locale from \"./impl/locale.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\n\nimport { hasLocaleWeekInfo, hasRelative } from \"./impl/util.js\";\n\n/**\n * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment.\n */\nexport default class Info {\n /**\n * Return whether the specified zone contains a DST.\n * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone.\n * @return {boolean}\n */\n static hasDST(zone = Settings.defaultZone) {\n const proto = DateTime.now().setZone(zone).set({ month: 12 });\n\n return !zone.isUniversal && proto.offset !== proto.set({ month: 6 }).offset;\n }\n\n /**\n * Return whether the specified zone is a valid IANA specifier.\n * @param {string} zone - Zone to check\n * @return {boolean}\n */\n static isValidIANAZone(zone) {\n return IANAZone.isValidZone(zone);\n }\n\n /**\n * Converts the input into a {@link Zone} instance.\n *\n * * If `input` is already a Zone instance, it is returned unchanged.\n * * If `input` is a string containing a valid time zone name, a Zone instance\n * with that name is returned.\n * * If `input` is a string that doesn't refer to a known time zone, a Zone\n * instance with {@link Zone#isValid} == false is returned.\n * * If `input is a number, a Zone instance with the specified fixed offset\n * in minutes is returned.\n * * If `input` is `null` or `undefined`, the default zone is returned.\n * @param {string|Zone|number} [input] - the value to be converted\n * @return {Zone}\n */\n static normalizeZone(input) {\n return normalizeZone(input, Settings.defaultZone);\n }\n\n /**\n * Get the weekday on which the week starts according to the given locale.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number} the start of the week, 1 for Monday through 7 for Sunday\n */\n static getStartOfWeek({ locale = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale)).getStartOfWeek();\n }\n\n /**\n * Get the minimum number of days necessary in a week before it is considered part of the next year according\n * to the given locale.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number}\n */\n static getMinimumDaysInFirstWeek({ locale = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale)).getMinDaysInFirstWeek();\n }\n\n /**\n * Get the weekdays, which are considered the weekend according to the given locale\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number[]} an array of weekdays, 1 for Monday through 7 for Sunday\n */\n static getWeekendWeekdays({ locale = null, locObj = null } = {}) {\n // copy the array, because we cache it internally\n return (locObj || Locale.create(locale)).getWeekendDays().slice();\n }\n\n /**\n * Return an array of standalone month names.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @param {string} [opts.outputCalendar='gregory'] - the calendar\n * @example Info.months()[0] //=> 'January'\n * @example Info.months('short')[0] //=> 'Jan'\n * @example Info.months('numeric')[0] //=> '1'\n * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.'\n * @example Info.months('numeric', { locale: 'ar' })[0] //=> '١'\n * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I'\n * @return {Array}\n */\n static months(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length);\n }\n\n /**\n * Return an array of format month names.\n * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that\n * changes the string.\n * See {@link Info#months}\n * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @param {string} [opts.outputCalendar='gregory'] - the calendar\n * @return {Array}\n */\n static monthsFormat(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true);\n }\n\n /**\n * Return an array of standalone week names.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {string} [length='long'] - the length of the weekday representation, such as \"narrow\", \"short\", \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @example Info.weekdays()[0] //=> 'Monday'\n * @example Info.weekdays('short')[0] //=> 'Mon'\n * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.'\n * @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين'\n * @return {Array}\n */\n static weekdays(length = \"long\", { locale = null, numberingSystem = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length);\n }\n\n /**\n * Return an array of format week names.\n * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that\n * changes the string.\n * See {@link Info#weekdays}\n * @param {string} [length='long'] - the length of the month representation, such as \"narrow\", \"short\", \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale=null] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @return {Array}\n */\n static weekdaysFormat(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true);\n }\n\n /**\n * Return an array of meridiems.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @example Info.meridiems() //=> [ 'AM', 'PM' ]\n * @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ]\n * @return {Array}\n */\n static meridiems({ locale = null } = {}) {\n return Locale.create(locale).meridiems();\n }\n\n /**\n * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian.\n * @param {string} [length='short'] - the length of the era representation, such as \"short\" or \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @example Info.eras() //=> [ 'BC', 'AD' ]\n * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ]\n * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ]\n * @return {Array}\n */\n static eras(length = \"short\", { locale = null } = {}) {\n return Locale.create(locale, null, \"gregory\").eras(length);\n }\n\n /**\n * Return the set of available features in this environment.\n * Some features of Luxon are not available in all environments. For example, on older browsers, relative time formatting support is not available. Use this function to figure out if that's the case.\n * Keys:\n * * `relative`: whether this environment supports relative time formatting\n * * `localeWeek`: whether this environment supports different weekdays for the start of the week based on the locale\n * @example Info.features() //=> { relative: false, localeWeek: true }\n * @return {Object}\n */\n static features() {\n return { relative: hasRelative(), localeWeek: hasLocaleWeekInfo() };\n }\n}\n","import Duration from \"../duration.js\";\n\nfunction dayDiff(earlier, later) {\n const utcDayStart = (dt) => dt.toUTC(0, { keepLocalTime: true }).startOf(\"day\").valueOf(),\n ms = utcDayStart(later) - utcDayStart(earlier);\n return Math.floor(Duration.fromMillis(ms).as(\"days\"));\n}\n\nfunction highOrderDiffs(cursor, later, units) {\n const differs = [\n [\"years\", (a, b) => b.year - a.year],\n [\"quarters\", (a, b) => b.quarter - a.quarter + (b.year - a.year) * 4],\n [\"months\", (a, b) => b.month - a.month + (b.year - a.year) * 12],\n [\n \"weeks\",\n (a, b) => {\n const days = dayDiff(a, b);\n return (days - (days % 7)) / 7;\n },\n ],\n [\"days\", dayDiff],\n ];\n\n const results = {};\n const earlier = cursor;\n let lowestOrder, highWater;\n\n /* This loop tries to diff using larger units first.\n If we overshoot, we backtrack and try the next smaller unit.\n \"cursor\" starts out at the earlier timestamp and moves closer and closer to \"later\"\n as we use smaller and smaller units.\n highWater keeps track of where we would be if we added one more of the smallest unit,\n this is used later to potentially convert any difference smaller than the smallest higher order unit\n into a fraction of that smallest higher order unit\n */\n for (const [unit, differ] of differs) {\n if (units.indexOf(unit) >= 0) {\n lowestOrder = unit;\n\n results[unit] = differ(cursor, later);\n highWater = earlier.plus(results);\n\n if (highWater > later) {\n // we overshot the end point, backtrack cursor by 1\n results[unit]--;\n cursor = earlier.plus(results);\n\n // if we are still overshooting now, we need to backtrack again\n // this happens in certain situations when diffing times in different zones,\n // because this calculation ignores time zones\n if (cursor > later) {\n // keep the \"overshot by 1\" around as highWater\n highWater = cursor;\n // backtrack cursor by 1\n results[unit]--;\n cursor = earlier.plus(results);\n }\n } else {\n cursor = highWater;\n }\n }\n }\n\n return [cursor, results, highWater, lowestOrder];\n}\n\nexport default function (earlier, later, units, opts) {\n let [cursor, results, highWater, lowestOrder] = highOrderDiffs(earlier, later, units);\n\n const remainingMillis = later - cursor;\n\n const lowerOrderUnits = units.filter(\n (u) => [\"hours\", \"minutes\", \"seconds\", \"milliseconds\"].indexOf(u) >= 0\n );\n\n if (lowerOrderUnits.length === 0) {\n if (highWater < later) {\n highWater = cursor.plus({ [lowestOrder]: 1 });\n }\n\n if (highWater !== cursor) {\n results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor);\n }\n }\n\n const duration = Duration.fromObject(results, opts);\n\n if (lowerOrderUnits.length > 0) {\n return Duration.fromMillis(remainingMillis, opts)\n .shiftTo(...lowerOrderUnits)\n .plus(duration);\n } else {\n return duration;\n }\n}\n","import { parseMillis, isUndefined, untruncateYear, signedOffset, hasOwnProperty } from \"./util.js\";\nimport Formatter from \"./formatter.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\nimport DateTime from \"../datetime.js\";\nimport { digitRegex, parseDigits } from \"./digits.js\";\nimport { ConflictingSpecificationError } from \"../errors.js\";\n\nconst MISSING_FTP = \"missing Intl.DateTimeFormat.formatToParts support\";\n\nfunction intUnit(regex, post = (i) => i) {\n return { regex, deser: ([s]) => post(parseDigits(s)) };\n}\n\nconst NBSP = String.fromCharCode(160);\nconst spaceOrNBSP = `[ ${NBSP}]`;\nconst spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, \"g\");\n\nfunction fixListRegex(s) {\n // make dots optional and also make them literal\n // make space and non breakable space characters interchangeable\n return s.replace(/\\./g, \"\\\\.?\").replace(spaceOrNBSPRegExp, spaceOrNBSP);\n}\n\nfunction stripInsensitivities(s) {\n return s\n .replace(/\\./g, \"\") // ignore dots that were made optional\n .replace(spaceOrNBSPRegExp, \" \") // interchange space and nbsp\n .toLowerCase();\n}\n\nfunction oneOf(strings, startIndex) {\n if (strings === null) {\n return null;\n } else {\n return {\n regex: RegExp(strings.map(fixListRegex).join(\"|\")),\n deser: ([s]) =>\n strings.findIndex((i) => stripInsensitivities(s) === stripInsensitivities(i)) + startIndex,\n };\n }\n}\n\nfunction offset(regex, groups) {\n return { regex, deser: ([, h, m]) => signedOffset(h, m), groups };\n}\n\nfunction simple(regex) {\n return { regex, deser: ([s]) => s };\n}\n\nfunction escapeToken(value) {\n return value.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\");\n}\n\n/**\n * @param token\n * @param {Locale} loc\n */\nfunction unitForToken(token, loc) {\n const one = digitRegex(loc),\n two = digitRegex(loc, \"{2}\"),\n three = digitRegex(loc, \"{3}\"),\n four = digitRegex(loc, \"{4}\"),\n six = digitRegex(loc, \"{6}\"),\n oneOrTwo = digitRegex(loc, \"{1,2}\"),\n oneToThree = digitRegex(loc, \"{1,3}\"),\n oneToSix = digitRegex(loc, \"{1,6}\"),\n oneToNine = digitRegex(loc, \"{1,9}\"),\n twoToFour = digitRegex(loc, \"{2,4}\"),\n fourToSix = digitRegex(loc, \"{4,6}\"),\n literal = (t) => ({ regex: RegExp(escapeToken(t.val)), deser: ([s]) => s, literal: true }),\n unitate = (t) => {\n if (token.literal) {\n return literal(t);\n }\n switch (t.val) {\n // era\n case \"G\":\n return oneOf(loc.eras(\"short\"), 0);\n case \"GG\":\n return oneOf(loc.eras(\"long\"), 0);\n // years\n case \"y\":\n return intUnit(oneToSix);\n case \"yy\":\n return intUnit(twoToFour, untruncateYear);\n case \"yyyy\":\n return intUnit(four);\n case \"yyyyy\":\n return intUnit(fourToSix);\n case \"yyyyyy\":\n return intUnit(six);\n // months\n case \"M\":\n return intUnit(oneOrTwo);\n case \"MM\":\n return intUnit(two);\n case \"MMM\":\n return oneOf(loc.months(\"short\", true), 1);\n case \"MMMM\":\n return oneOf(loc.months(\"long\", true), 1);\n case \"L\":\n return intUnit(oneOrTwo);\n case \"LL\":\n return intUnit(two);\n case \"LLL\":\n return oneOf(loc.months(\"short\", false), 1);\n case \"LLLL\":\n return oneOf(loc.months(\"long\", false), 1);\n // dates\n case \"d\":\n return intUnit(oneOrTwo);\n case \"dd\":\n return intUnit(two);\n // ordinals\n case \"o\":\n return intUnit(oneToThree);\n case \"ooo\":\n return intUnit(three);\n // time\n case \"HH\":\n return intUnit(two);\n case \"H\":\n return intUnit(oneOrTwo);\n case \"hh\":\n return intUnit(two);\n case \"h\":\n return intUnit(oneOrTwo);\n case \"mm\":\n return intUnit(two);\n case \"m\":\n return intUnit(oneOrTwo);\n case \"q\":\n return intUnit(oneOrTwo);\n case \"qq\":\n return intUnit(two);\n case \"s\":\n return intUnit(oneOrTwo);\n case \"ss\":\n return intUnit(two);\n case \"S\":\n return intUnit(oneToThree);\n case \"SSS\":\n return intUnit(three);\n case \"u\":\n return simple(oneToNine);\n case \"uu\":\n return simple(oneOrTwo);\n case \"uuu\":\n return intUnit(one);\n // meridiem\n case \"a\":\n return oneOf(loc.meridiems(), 0);\n // weekYear (k)\n case \"kkkk\":\n return intUnit(four);\n case \"kk\":\n return intUnit(twoToFour, untruncateYear);\n // weekNumber (W)\n case \"W\":\n return intUnit(oneOrTwo);\n case \"WW\":\n return intUnit(two);\n // weekdays\n case \"E\":\n case \"c\":\n return intUnit(one);\n case \"EEE\":\n return oneOf(loc.weekdays(\"short\", false), 1);\n case \"EEEE\":\n return oneOf(loc.weekdays(\"long\", false), 1);\n case \"ccc\":\n return oneOf(loc.weekdays(\"short\", true), 1);\n case \"cccc\":\n return oneOf(loc.weekdays(\"long\", true), 1);\n // offset/zone\n case \"Z\":\n case \"ZZ\":\n return offset(new RegExp(`([+-]${oneOrTwo.source})(?::(${two.source}))?`), 2);\n case \"ZZZ\":\n return offset(new RegExp(`([+-]${oneOrTwo.source})(${two.source})?`), 2);\n // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing\n // because we don't have any way to figure out what they are\n case \"z\":\n return simple(/[a-z_+-/]{1,256}?/i);\n // this special-case \"token\" represents a place where a macro-token expanded into a white-space literal\n // in this case we accept any non-newline white-space\n case \" \":\n return simple(/[^\\S\\n\\r]/);\n default:\n return literal(t);\n }\n };\n\n const unit = unitate(token) || {\n invalidReason: MISSING_FTP,\n };\n\n unit.token = token;\n\n return unit;\n}\n\nconst partTypeStyleToTokenVal = {\n year: {\n \"2-digit\": \"yy\",\n numeric: \"yyyyy\",\n },\n month: {\n numeric: \"M\",\n \"2-digit\": \"MM\",\n short: \"MMM\",\n long: \"MMMM\",\n },\n day: {\n numeric: \"d\",\n \"2-digit\": \"dd\",\n },\n weekday: {\n short: \"EEE\",\n long: \"EEEE\",\n },\n dayperiod: \"a\",\n dayPeriod: \"a\",\n hour12: {\n numeric: \"h\",\n \"2-digit\": \"hh\",\n },\n hour24: {\n numeric: \"H\",\n \"2-digit\": \"HH\",\n },\n minute: {\n numeric: \"m\",\n \"2-digit\": \"mm\",\n },\n second: {\n numeric: \"s\",\n \"2-digit\": \"ss\",\n },\n timeZoneName: {\n long: \"ZZZZZ\",\n short: \"ZZZ\",\n },\n};\n\nfunction tokenForPart(part, formatOpts, resolvedOpts) {\n const { type, value } = part;\n\n if (type === \"literal\") {\n const isSpace = /^\\s+$/.test(value);\n return {\n literal: !isSpace,\n val: isSpace ? \" \" : value,\n };\n }\n\n const style = formatOpts[type];\n\n // The user might have explicitly specified hour12 or hourCycle\n // if so, respect their decision\n // if not, refer back to the resolvedOpts, which are based on the locale\n let actualType = type;\n if (type === \"hour\") {\n if (formatOpts.hour12 != null) {\n actualType = formatOpts.hour12 ? \"hour12\" : \"hour24\";\n } else if (formatOpts.hourCycle != null) {\n if (formatOpts.hourCycle === \"h11\" || formatOpts.hourCycle === \"h12\") {\n actualType = \"hour12\";\n } else {\n actualType = \"hour24\";\n }\n } else {\n // tokens only differentiate between 24 hours or not,\n // so we do not need to check hourCycle here, which is less supported anyways\n actualType = resolvedOpts.hour12 ? \"hour12\" : \"hour24\";\n }\n }\n let val = partTypeStyleToTokenVal[actualType];\n if (typeof val === \"object\") {\n val = val[style];\n }\n\n if (val) {\n return {\n literal: false,\n val,\n };\n }\n\n return undefined;\n}\n\nfunction buildRegex(units) {\n const re = units.map((u) => u.regex).reduce((f, r) => `${f}(${r.source})`, \"\");\n return [`^${re}$`, units];\n}\n\nfunction match(input, regex, handlers) {\n const matches = input.match(regex);\n\n if (matches) {\n const all = {};\n let matchIndex = 1;\n for (const i in handlers) {\n if (hasOwnProperty(handlers, i)) {\n const h = handlers[i],\n groups = h.groups ? h.groups + 1 : 1;\n if (!h.literal && h.token) {\n all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups));\n }\n matchIndex += groups;\n }\n }\n return [matches, all];\n } else {\n return [matches, {}];\n }\n}\n\nfunction dateTimeFromMatches(matches) {\n const toField = (token) => {\n switch (token) {\n case \"S\":\n return \"millisecond\";\n case \"s\":\n return \"second\";\n case \"m\":\n return \"minute\";\n case \"h\":\n case \"H\":\n return \"hour\";\n case \"d\":\n return \"day\";\n case \"o\":\n return \"ordinal\";\n case \"L\":\n case \"M\":\n return \"month\";\n case \"y\":\n return \"year\";\n case \"E\":\n case \"c\":\n return \"weekday\";\n case \"W\":\n return \"weekNumber\";\n case \"k\":\n return \"weekYear\";\n case \"q\":\n return \"quarter\";\n default:\n return null;\n }\n };\n\n let zone = null;\n let specificOffset;\n if (!isUndefined(matches.z)) {\n zone = IANAZone.create(matches.z);\n }\n\n if (!isUndefined(matches.Z)) {\n if (!zone) {\n zone = new FixedOffsetZone(matches.Z);\n }\n specificOffset = matches.Z;\n }\n\n if (!isUndefined(matches.q)) {\n matches.M = (matches.q - 1) * 3 + 1;\n }\n\n if (!isUndefined(matches.h)) {\n if (matches.h < 12 && matches.a === 1) {\n matches.h += 12;\n } else if (matches.h === 12 && matches.a === 0) {\n matches.h = 0;\n }\n }\n\n if (matches.G === 0 && matches.y) {\n matches.y = -matches.y;\n }\n\n if (!isUndefined(matches.u)) {\n matches.S = parseMillis(matches.u);\n }\n\n const vals = Object.keys(matches).reduce((r, k) => {\n const f = toField(k);\n if (f) {\n r[f] = matches[k];\n }\n\n return r;\n }, {});\n\n return [vals, zone, specificOffset];\n}\n\nlet dummyDateTimeCache = null;\n\nfunction getDummyDateTime() {\n if (!dummyDateTimeCache) {\n dummyDateTimeCache = DateTime.fromMillis(1555555555555);\n }\n\n return dummyDateTimeCache;\n}\n\nfunction maybeExpandMacroToken(token, locale) {\n if (token.literal) {\n return token;\n }\n\n const formatOpts = Formatter.macroTokenToFormatOpts(token.val);\n const tokens = formatOptsToTokens(formatOpts, locale);\n\n if (tokens == null || tokens.includes(undefined)) {\n return token;\n }\n\n return tokens;\n}\n\nexport function expandMacroTokens(tokens, locale) {\n return Array.prototype.concat(...tokens.map((t) => maybeExpandMacroToken(t, locale)));\n}\n\n/**\n * @private\n */\n\nexport class TokenParser {\n constructor(locale, format) {\n this.locale = locale;\n this.format = format;\n this.tokens = expandMacroTokens(Formatter.parseFormat(format), locale);\n this.units = this.tokens.map((t) => unitForToken(t, locale));\n this.disqualifyingUnit = this.units.find((t) => t.invalidReason);\n\n if (!this.disqualifyingUnit) {\n const [regexString, handlers] = buildRegex(this.units);\n this.regex = RegExp(regexString, \"i\");\n this.handlers = handlers;\n }\n }\n\n explainFromTokens(input) {\n if (!this.isValid) {\n return { input, tokens: this.tokens, invalidReason: this.invalidReason };\n } else {\n const [rawMatches, matches] = match(input, this.regex, this.handlers),\n [result, zone, specificOffset] = matches\n ? dateTimeFromMatches(matches)\n : [null, null, undefined];\n if (hasOwnProperty(matches, \"a\") && hasOwnProperty(matches, \"H\")) {\n throw new ConflictingSpecificationError(\n \"Can't include meridiem when specifying 24-hour format\"\n );\n }\n return {\n input,\n tokens: this.tokens,\n regex: this.regex,\n rawMatches,\n matches,\n result,\n zone,\n specificOffset,\n };\n }\n }\n\n get isValid() {\n return !this.disqualifyingUnit;\n }\n\n get invalidReason() {\n return this.disqualifyingUnit ? this.disqualifyingUnit.invalidReason : null;\n }\n}\n\nexport function explainFromTokens(locale, input, format) {\n const parser = new TokenParser(locale, format);\n return parser.explainFromTokens(input);\n}\n\nexport function parseFromTokens(locale, input, format) {\n const { result, zone, specificOffset, invalidReason } = explainFromTokens(locale, input, format);\n return [result, zone, specificOffset, invalidReason];\n}\n\nexport function formatOptsToTokens(formatOpts, locale) {\n if (!formatOpts) {\n return null;\n }\n\n const formatter = Formatter.create(locale, formatOpts);\n const df = formatter.dtFormatter(getDummyDateTime());\n const parts = df.formatToParts();\n const resolvedOpts = df.resolvedOptions();\n return parts.map((p) => tokenForPart(p, formatOpts, resolvedOpts));\n}\n","import Duration from \"./duration.js\";\nimport Interval from \"./interval.js\";\nimport Settings from \"./settings.js\";\nimport Info from \"./info.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport FixedOffsetZone from \"./zones/fixedOffsetZone.js\";\nimport Locale from \"./impl/locale.js\";\nimport {\n isUndefined,\n maybeArray,\n isDate,\n isNumber,\n bestBy,\n daysInMonth,\n daysInYear,\n isLeapYear,\n weeksInWeekYear,\n normalizeObject,\n roundTo,\n objToLocalTS,\n padStart,\n} from \"./impl/util.js\";\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\nimport diff from \"./impl/diff.js\";\nimport { parseRFC2822Date, parseISODate, parseHTTPDate, parseSQL } from \"./impl/regexParser.js\";\nimport {\n parseFromTokens,\n explainFromTokens,\n formatOptsToTokens,\n expandMacroTokens,\n TokenParser,\n} from \"./impl/tokenParser.js\";\nimport {\n gregorianToWeek,\n weekToGregorian,\n gregorianToOrdinal,\n ordinalToGregorian,\n hasInvalidGregorianData,\n hasInvalidWeekData,\n hasInvalidOrdinalData,\n hasInvalidTimeData,\n usesLocalWeekValues,\n isoWeekdayToLocal,\n} from \"./impl/conversions.js\";\nimport * as Formats from \"./impl/formats.js\";\nimport {\n InvalidArgumentError,\n ConflictingSpecificationError,\n InvalidUnitError,\n InvalidDateTimeError,\n} from \"./errors.js\";\nimport Invalid from \"./impl/invalid.js\";\n\nconst INVALID = \"Invalid DateTime\";\nconst MAX_DATE = 8.64e15;\n\nfunction unsupportedZone(zone) {\n return new Invalid(\"unsupported zone\", `the zone \"${zone.name}\" is not supported`);\n}\n\n// we cache week data on the DT object and this intermediates the cache\n/**\n * @param {DateTime} dt\n */\nfunction possiblyCachedWeekData(dt) {\n if (dt.weekData === null) {\n dt.weekData = gregorianToWeek(dt.c);\n }\n return dt.weekData;\n}\n\n/**\n * @param {DateTime} dt\n */\nfunction possiblyCachedLocalWeekData(dt) {\n if (dt.localWeekData === null) {\n dt.localWeekData = gregorianToWeek(\n dt.c,\n dt.loc.getMinDaysInFirstWeek(),\n dt.loc.getStartOfWeek()\n );\n }\n return dt.localWeekData;\n}\n\n// clone really means, \"make a new object with these modifications\". all \"setters\" really use this\n// to create a new object while only changing some of the properties\nfunction clone(inst, alts) {\n const current = {\n ts: inst.ts,\n zone: inst.zone,\n c: inst.c,\n o: inst.o,\n loc: inst.loc,\n invalid: inst.invalid,\n };\n return new DateTime({ ...current, ...alts, old: current });\n}\n\n// find the right offset a given local time. The o input is our guess, which determines which\n// offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST)\nfunction fixOffset(localTS, o, tz) {\n // Our UTC time is just a guess because our offset is just a guess\n let utcGuess = localTS - o * 60 * 1000;\n\n // Test whether the zone matches the offset for this ts\n const o2 = tz.offset(utcGuess);\n\n // If so, offset didn't change and we're done\n if (o === o2) {\n return [utcGuess, o];\n }\n\n // If not, change the ts by the difference in the offset\n utcGuess -= (o2 - o) * 60 * 1000;\n\n // If that gives us the local time we want, we're done\n const o3 = tz.offset(utcGuess);\n if (o2 === o3) {\n return [utcGuess, o2];\n }\n\n // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time\n return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)];\n}\n\n// convert an epoch timestamp into a calendar object with the given offset\nfunction tsToObj(ts, offset) {\n ts += offset * 60 * 1000;\n\n const d = new Date(ts);\n\n return {\n year: d.getUTCFullYear(),\n month: d.getUTCMonth() + 1,\n day: d.getUTCDate(),\n hour: d.getUTCHours(),\n minute: d.getUTCMinutes(),\n second: d.getUTCSeconds(),\n millisecond: d.getUTCMilliseconds(),\n };\n}\n\n// convert a calendar object to a epoch timestamp\nfunction objToTS(obj, offset, zone) {\n return fixOffset(objToLocalTS(obj), offset, zone);\n}\n\n// create a new DT instance by adding a duration, adjusting for DSTs\nfunction adjustTime(inst, dur) {\n const oPre = inst.o,\n year = inst.c.year + Math.trunc(dur.years),\n month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3,\n c = {\n ...inst.c,\n year,\n month,\n day:\n Math.min(inst.c.day, daysInMonth(year, month)) +\n Math.trunc(dur.days) +\n Math.trunc(dur.weeks) * 7,\n },\n millisToAdd = Duration.fromObject({\n years: dur.years - Math.trunc(dur.years),\n quarters: dur.quarters - Math.trunc(dur.quarters),\n months: dur.months - Math.trunc(dur.months),\n weeks: dur.weeks - Math.trunc(dur.weeks),\n days: dur.days - Math.trunc(dur.days),\n hours: dur.hours,\n minutes: dur.minutes,\n seconds: dur.seconds,\n milliseconds: dur.milliseconds,\n }).as(\"milliseconds\"),\n localTS = objToLocalTS(c);\n\n let [ts, o] = fixOffset(localTS, oPre, inst.zone);\n\n if (millisToAdd !== 0) {\n ts += millisToAdd;\n // that could have changed the offset by going over a DST, but we want to keep the ts the same\n o = inst.zone.offset(ts);\n }\n\n return { ts, o };\n}\n\n// helper useful in turning the results of parsing into real dates\n// by handling the zone options\nfunction parseDataToDateTime(parsed, parsedZone, opts, format, text, specificOffset) {\n const { setZone, zone } = opts;\n if ((parsed && Object.keys(parsed).length !== 0) || parsedZone) {\n const interpretationZone = parsedZone || zone,\n inst = DateTime.fromObject(parsed, {\n ...opts,\n zone: interpretationZone,\n specificOffset,\n });\n return setZone ? inst : inst.setZone(zone);\n } else {\n return DateTime.invalid(\n new Invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ${format}`)\n );\n }\n}\n\n// if you want to output a technical format (e.g. RFC 2822), this helper\n// helps handle the details\nfunction toTechFormat(dt, format, allowZ = true) {\n return dt.isValid\n ? Formatter.create(Locale.create(\"en-US\"), {\n allowZ,\n forceSimple: true,\n }).formatDateTimeFromString(dt, format)\n : null;\n}\n\nfunction toISODate(o, extended, precision) {\n const longFormat = o.c.year > 9999 || o.c.year < 0;\n let c = \"\";\n if (longFormat && o.c.year >= 0) c += \"+\";\n c += padStart(o.c.year, longFormat ? 6 : 4);\n if (precision === \"year\") return c;\n if (extended) {\n c += \"-\";\n c += padStart(o.c.month);\n if (precision === \"month\") return c;\n c += \"-\";\n } else {\n c += padStart(o.c.month);\n if (precision === \"month\") return c;\n }\n c += padStart(o.c.day);\n return c;\n}\n\nfunction toISOTime(\n o,\n extended,\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n) {\n let showSeconds = !suppressSeconds || o.c.millisecond !== 0 || o.c.second !== 0,\n c = \"\";\n switch (precision) {\n case \"day\":\n case \"month\":\n case \"year\":\n break;\n default:\n c += padStart(o.c.hour);\n if (precision === \"hour\") break;\n if (extended) {\n c += \":\";\n c += padStart(o.c.minute);\n if (precision === \"minute\") break;\n if (showSeconds) {\n c += \":\";\n c += padStart(o.c.second);\n }\n } else {\n c += padStart(o.c.minute);\n if (precision === \"minute\") break;\n if (showSeconds) {\n c += padStart(o.c.second);\n }\n }\n if (precision === \"second\") break;\n if (showSeconds && (!suppressMilliseconds || o.c.millisecond !== 0)) {\n c += \".\";\n c += padStart(o.c.millisecond, 3);\n }\n }\n\n if (includeOffset) {\n if (o.isOffsetFixed && o.offset === 0 && !extendedZone) {\n c += \"Z\";\n } else if (o.o < 0) {\n c += \"-\";\n c += padStart(Math.trunc(-o.o / 60));\n c += \":\";\n c += padStart(Math.trunc(-o.o % 60));\n } else {\n c += \"+\";\n c += padStart(Math.trunc(o.o / 60));\n c += \":\";\n c += padStart(Math.trunc(o.o % 60));\n }\n }\n\n if (extendedZone) {\n c += \"[\" + o.zone.ianaName + \"]\";\n }\n return c;\n}\n\n// defaults for unspecified units in the supported calendars\nconst defaultUnitValues = {\n month: 1,\n day: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n },\n defaultWeekUnitValues = {\n weekNumber: 1,\n weekday: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n },\n defaultOrdinalUnitValues = {\n ordinal: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n };\n\n// Units in the supported calendars, sorted by bigness\nconst orderedUnits = [\"year\", \"month\", \"day\", \"hour\", \"minute\", \"second\", \"millisecond\"],\n orderedWeekUnits = [\n \"weekYear\",\n \"weekNumber\",\n \"weekday\",\n \"hour\",\n \"minute\",\n \"second\",\n \"millisecond\",\n ],\n orderedOrdinalUnits = [\"year\", \"ordinal\", \"hour\", \"minute\", \"second\", \"millisecond\"];\n\n// standardize case and plurality in units\nfunction normalizeUnit(unit) {\n const normalized = {\n year: \"year\",\n years: \"year\",\n month: \"month\",\n months: \"month\",\n day: \"day\",\n days: \"day\",\n hour: \"hour\",\n hours: \"hour\",\n minute: \"minute\",\n minutes: \"minute\",\n quarter: \"quarter\",\n quarters: \"quarter\",\n second: \"second\",\n seconds: \"second\",\n millisecond: \"millisecond\",\n milliseconds: \"millisecond\",\n weekday: \"weekday\",\n weekdays: \"weekday\",\n weeknumber: \"weekNumber\",\n weeksnumber: \"weekNumber\",\n weeknumbers: \"weekNumber\",\n weekyear: \"weekYear\",\n weekyears: \"weekYear\",\n ordinal: \"ordinal\",\n }[unit.toLowerCase()];\n\n if (!normalized) throw new InvalidUnitError(unit);\n\n return normalized;\n}\n\nfunction normalizeUnitWithLocalWeeks(unit) {\n switch (unit.toLowerCase()) {\n case \"localweekday\":\n case \"localweekdays\":\n return \"localWeekday\";\n case \"localweeknumber\":\n case \"localweeknumbers\":\n return \"localWeekNumber\";\n case \"localweekyear\":\n case \"localweekyears\":\n return \"localWeekYear\";\n default:\n return normalizeUnit(unit);\n }\n}\n\n// cache offsets for zones based on the current timestamp when this function is\n// first called. When we are handling a datetime from components like (year,\n// month, day, hour) in a time zone, we need a guess about what the timezone\n// offset is so that we can convert into a UTC timestamp. One way is to find the\n// offset of now in the zone. The actual date may have a different offset (for\n// example, if we handle a date in June while we're in December in a zone that\n// observes DST), but we can check and adjust that.\n//\n// When handling many dates, calculating the offset for now every time is\n// expensive. It's just a guess, so we can cache the offset to use even if we\n// are right on a time change boundary (we'll just correct in the other\n// direction). Using a timestamp from first read is a slight optimization for\n// handling dates close to the current date, since those dates will usually be\n// in the same offset (we could set the timestamp statically, instead). We use a\n// single timestamp for all zones to make things a bit more predictable.\n//\n// This is safe for quickDT (used by local() and utc()) because we don't fill in\n// higher-order units from tsNow (as we do in fromObject, this requires that\n// offset is calculated from tsNow).\n/**\n * @param {Zone} zone\n * @return {number}\n */\nfunction guessOffsetForZone(zone) {\n if (zoneOffsetTs === undefined) {\n zoneOffsetTs = Settings.now();\n }\n\n // Do not cache anything but IANA zones, because it is not safe to do so.\n // Guessing an offset which is not present in the zone can cause wrong results from fixOffset\n if (zone.type !== \"iana\") {\n return zone.offset(zoneOffsetTs);\n }\n const zoneName = zone.name;\n let offsetGuess = zoneOffsetGuessCache.get(zoneName);\n if (offsetGuess === undefined) {\n offsetGuess = zone.offset(zoneOffsetTs);\n zoneOffsetGuessCache.set(zoneName, offsetGuess);\n }\n return offsetGuess;\n}\n\n// this is a dumbed down version of fromObject() that runs about 60% faster\n// but doesn't do any validation, makes a bunch of assumptions about what units\n// are present, and so on.\nfunction quickDT(obj, opts) {\n const zone = normalizeZone(opts.zone, Settings.defaultZone);\n if (!zone.isValid) {\n return DateTime.invalid(unsupportedZone(zone));\n }\n\n const loc = Locale.fromObject(opts);\n\n let ts, o;\n\n // assume we have the higher-order units\n if (!isUndefined(obj.year)) {\n for (const u of orderedUnits) {\n if (isUndefined(obj[u])) {\n obj[u] = defaultUnitValues[u];\n }\n }\n\n const invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj);\n if (invalid) {\n return DateTime.invalid(invalid);\n }\n\n const offsetProvis = guessOffsetForZone(zone);\n [ts, o] = objToTS(obj, offsetProvis, zone);\n } else {\n ts = Settings.now();\n }\n\n return new DateTime({ ts, zone, loc, o });\n}\n\nfunction diffRelative(start, end, opts) {\n const round = isUndefined(opts.round) ? true : opts.round,\n rounding = isUndefined(opts.rounding) ? \"trunc\" : opts.rounding,\n format = (c, unit) => {\n c = roundTo(c, round || opts.calendary ? 0 : 2, opts.calendary ? \"round\" : rounding);\n const formatter = end.loc.clone(opts).relFormatter(opts);\n return formatter.format(c, unit);\n },\n differ = (unit) => {\n if (opts.calendary) {\n if (!end.hasSame(start, unit)) {\n return end.startOf(unit).diff(start.startOf(unit), unit).get(unit);\n } else return 0;\n } else {\n return end.diff(start, unit).get(unit);\n }\n };\n\n if (opts.unit) {\n return format(differ(opts.unit), opts.unit);\n }\n\n for (const unit of opts.units) {\n const count = differ(unit);\n if (Math.abs(count) >= 1) {\n return format(count, unit);\n }\n }\n return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]);\n}\n\nfunction lastOpts(argList) {\n let opts = {},\n args;\n if (argList.length > 0 && typeof argList[argList.length - 1] === \"object\") {\n opts = argList[argList.length - 1];\n args = Array.from(argList).slice(0, argList.length - 1);\n } else {\n args = Array.from(argList);\n }\n return [opts, args];\n}\n\n/**\n * Timestamp to use for cached zone offset guesses (exposed for test)\n */\nlet zoneOffsetTs;\n/**\n * Cache for zone offset guesses (exposed for test).\n *\n * This optimizes quickDT via guessOffsetForZone to avoid repeated calls of\n * zone.offset().\n */\nconst zoneOffsetGuessCache = new Map();\n\n/**\n * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them.\n *\n * A DateTime comprises of:\n * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch.\n * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone).\n * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`.\n *\n * Here is a brief overview of the most commonly used functionality it provides:\n *\n * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link DateTime.local}, {@link DateTime.utc}, and (most flexibly) {@link DateTime.fromObject}. To create one from a standard string format, use {@link DateTime.fromISO}, {@link DateTime.fromHTTP}, and {@link DateTime.fromRFC2822}. To create one from a custom string format, use {@link DateTime.fromFormat}. To create one from a native JS date, use {@link DateTime.fromJSDate}.\n * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link DateTime#toObject}), use the {@link DateTime#year}, {@link DateTime#month},\n * {@link DateTime#day}, {@link DateTime#hour}, {@link DateTime#minute}, {@link DateTime#second}, {@link DateTime#millisecond} accessors.\n * * **Week calendar**: For ISO week calendar attributes, see the {@link DateTime#weekYear}, {@link DateTime#weekNumber}, and {@link DateTime#weekday} accessors.\n * * **Configuration** See the {@link DateTime#locale} and {@link DateTime#numberingSystem} accessors.\n * * **Transformation**: To transform the DateTime into other DateTimes, use {@link DateTime#set}, {@link DateTime#reconfigure}, {@link DateTime#setZone}, {@link DateTime#setLocale}, {@link DateTime.plus}, {@link DateTime#minus}, {@link DateTime#endOf}, {@link DateTime#startOf}, {@link DateTime#toUTC}, and {@link DateTime#toLocal}.\n * * **Output**: To convert the DateTime to other representations, use the {@link DateTime#toRelative}, {@link DateTime#toRelativeCalendar}, {@link DateTime#toJSON}, {@link DateTime#toISO}, {@link DateTime#toHTTP}, {@link DateTime#toObject}, {@link DateTime#toRFC2822}, {@link DateTime#toString}, {@link DateTime#toLocaleString}, {@link DateTime#toFormat}, {@link DateTime#toMillis} and {@link DateTime#toJSDate}.\n *\n * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation.\n */\nexport default class DateTime {\n /**\n * @access private\n */\n constructor(config) {\n const zone = config.zone || Settings.defaultZone;\n\n let invalid =\n config.invalid ||\n (Number.isNaN(config.ts) ? new Invalid(\"invalid input\") : null) ||\n (!zone.isValid ? unsupportedZone(zone) : null);\n /**\n * @access private\n */\n this.ts = isUndefined(config.ts) ? Settings.now() : config.ts;\n\n let c = null,\n o = null;\n if (!invalid) {\n const unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone);\n\n if (unchanged) {\n [c, o] = [config.old.c, config.old.o];\n } else {\n // If an offset has been passed and we have not been called from\n // clone(), we can trust it and avoid the offset calculation.\n const ot = isNumber(config.o) && !config.old ? config.o : zone.offset(this.ts);\n c = tsToObj(this.ts, ot);\n invalid = Number.isNaN(c.year) ? new Invalid(\"invalid input\") : null;\n c = invalid ? null : c;\n o = invalid ? null : ot;\n }\n }\n\n /**\n * @access private\n */\n this._zone = zone;\n /**\n * @access private\n */\n this.loc = config.loc || Locale.create();\n /**\n * @access private\n */\n this.invalid = invalid;\n /**\n * @access private\n */\n this.weekData = null;\n /**\n * @access private\n */\n this.localWeekData = null;\n /**\n * @access private\n */\n this.c = c;\n /**\n * @access private\n */\n this.o = o;\n /**\n * @access private\n */\n this.isLuxonDateTime = true;\n }\n\n // CONSTRUCT\n\n /**\n * Create a DateTime for the current instant, in the system's time zone.\n *\n * Use Settings to override these default values if needed.\n * @example DateTime.now().toISO() //~> now in the ISO format\n * @return {DateTime}\n */\n static now() {\n return new DateTime({});\n }\n\n /**\n * Create a local DateTime\n * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used\n * @param {number} [month=1] - The month, 1-indexed\n * @param {number} [day=1] - The day of the month, 1-indexed\n * @param {number} [hour=0] - The hour of the day, in 24-hour time\n * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n * @example DateTime.local() //~> now\n * @example DateTime.local({ zone: \"America/New_York\" }) //~> now, in US east coast time\n * @example DateTime.local(2017) //~> 2017-01-01T00:00:00\n * @example DateTime.local(2017, 3) //~> 2017-03-01T00:00:00\n * @example DateTime.local(2017, 3, 12, { locale: \"fr\" }) //~> 2017-03-12T00:00:00, with a French locale\n * @example DateTime.local(2017, 3, 12, 5) //~> 2017-03-12T05:00:00\n * @example DateTime.local(2017, 3, 12, 5, { zone: \"utc\" }) //~> 2017-03-12T05:00:00, in UTC\n * @example DateTime.local(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00\n * @example DateTime.local(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10\n * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765\n * @return {DateTime}\n */\n static local() {\n const [opts, args] = lastOpts(arguments),\n [year, month, day, hour, minute, second, millisecond] = args;\n return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n }\n\n /**\n * Create a DateTime in UTC\n * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used\n * @param {number} [month=1] - The month, 1-indexed\n * @param {number} [day=1] - The day of the month\n * @param {number} [hour=0] - The hour of the day, in 24-hour time\n * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n * @param {Object} options - configuration options for the DateTime\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} [options.outputCalendar] - the output calendar to set on the resulting DateTime instance\n * @param {string} [options.numberingSystem] - the numbering system to set on the resulting DateTime instance\n * @param {string} [options.weekSettings] - the week settings to set on the resulting DateTime instance\n * @example DateTime.utc() //~> now\n * @example DateTime.utc(2017) //~> 2017-01-01T00:00:00Z\n * @example DateTime.utc(2017, 3) //~> 2017-03-01T00:00:00Z\n * @example DateTime.utc(2017, 3, 12) //~> 2017-03-12T00:00:00Z\n * @example DateTime.utc(2017, 3, 12, 5) //~> 2017-03-12T05:00:00Z\n * @example DateTime.utc(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00Z\n * @example DateTime.utc(2017, 3, 12, 5, 45, { locale: \"fr\" }) //~> 2017-03-12T05:45:00Z with a French locale\n * @example DateTime.utc(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10Z\n * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765, { locale: \"fr\" }) //~> 2017-03-12T05:45:10.765Z with a French locale\n * @return {DateTime}\n */\n static utc() {\n const [opts, args] = lastOpts(arguments),\n [year, month, day, hour, minute, second, millisecond] = args;\n\n opts.zone = FixedOffsetZone.utcInstance;\n return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n }\n\n /**\n * Create a DateTime from a JavaScript Date object. Uses the default zone.\n * @param {Date} date - a JavaScript Date object\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @return {DateTime}\n */\n static fromJSDate(date, options = {}) {\n const ts = isDate(date) ? date.valueOf() : NaN;\n if (Number.isNaN(ts)) {\n return DateTime.invalid(\"invalid input\");\n }\n\n const zoneToUse = normalizeZone(options.zone, Settings.defaultZone);\n if (!zoneToUse.isValid) {\n return DateTime.invalid(unsupportedZone(zoneToUse));\n }\n\n return new DateTime({\n ts: ts,\n zone: zoneToUse,\n loc: Locale.fromObject(options),\n });\n }\n\n /**\n * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n * @param {number} milliseconds - a number of milliseconds since 1970 UTC\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromMillis(milliseconds, options = {}) {\n if (!isNumber(milliseconds)) {\n throw new InvalidArgumentError(\n `fromMillis requires a numerical input, but received a ${typeof milliseconds} with value ${milliseconds}`\n );\n } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) {\n // this isn't perfect because we can still end up out of range because of additional shifting, but it's a start\n return DateTime.invalid(\"Timestamp out of range\");\n } else {\n return new DateTime({\n ts: milliseconds,\n zone: normalizeZone(options.zone, Settings.defaultZone),\n loc: Locale.fromObject(options),\n });\n }\n }\n\n /**\n * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n * @param {number} seconds - a number of seconds since 1970 UTC\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromSeconds(seconds, options = {}) {\n if (!isNumber(seconds)) {\n throw new InvalidArgumentError(\"fromSeconds requires a numerical input\");\n } else {\n return new DateTime({\n ts: seconds * 1000,\n zone: normalizeZone(options.zone, Settings.defaultZone),\n loc: Locale.fromObject(options),\n });\n }\n }\n\n /**\n * Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults.\n * @param {Object} obj - the object to create the DateTime from\n * @param {number} obj.year - a year, such as 1987\n * @param {number} obj.month - a month, 1-12\n * @param {number} obj.day - a day of the month, 1-31, depending on the month\n * @param {number} obj.ordinal - day of the year, 1-365 or 366\n * @param {number} obj.weekYear - an ISO week year\n * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year\n * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday\n * @param {number} obj.localWeekYear - a week year, according to the locale\n * @param {number} obj.localWeekNumber - a week number, between 1 and 52 or 53, depending on the year, according to the locale\n * @param {number} obj.localWeekday - a weekday, 1-7, where 1 is the first and 7 is the last day of the week, according to the locale\n * @param {number} obj.hour - hour of the day, 0-23\n * @param {number} obj.minute - minute of the hour, 0-59\n * @param {number} obj.second - second of the minute, 0-59\n * @param {number} obj.millisecond - millisecond of the second, 0-999\n * @param {Object} opts - options for creating this DateTime\n * @param {string|Zone} [opts.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone()\n * @param {string} [opts.locale='system\\'s locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25'\n * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01'\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'utc' }),\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'local' })\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'America/New_York' })\n * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13'\n * @example DateTime.fromObject({ localWeekYear: 2022, localWeekNumber: 1, localWeekday: 1 }, { locale: \"en-US\" }).toISODate() //=> '2021-12-26'\n * @return {DateTime}\n */\n static fromObject(obj, opts = {}) {\n obj = obj || {};\n const zoneToUse = normalizeZone(opts.zone, Settings.defaultZone);\n if (!zoneToUse.isValid) {\n return DateTime.invalid(unsupportedZone(zoneToUse));\n }\n\n const loc = Locale.fromObject(opts);\n const normalized = normalizeObject(obj, normalizeUnitWithLocalWeeks);\n const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, loc);\n\n const tsNow = Settings.now(),\n offsetProvis = !isUndefined(opts.specificOffset)\n ? opts.specificOffset\n : zoneToUse.offset(tsNow),\n containsOrdinal = !isUndefined(normalized.ordinal),\n containsGregorYear = !isUndefined(normalized.year),\n containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n containsGregor = containsGregorYear || containsGregorMD,\n definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n // cases:\n // just a weekday -> this week's instance of that weekday, no worries\n // (gregorian data or ordinal) + (weekYear or weekNumber) -> error\n // (gregorian month or day) + ordinal -> error\n // otherwise just use weeks or ordinals or gregorian, depending on what's specified\n\n if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n throw new ConflictingSpecificationError(\n \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n );\n }\n\n if (containsGregorMD && containsOrdinal) {\n throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n }\n\n const useWeekData = definiteWeekDef || (normalized.weekday && !containsGregor);\n\n // configure ourselves to deal with gregorian dates or week stuff\n let units,\n defaultValues,\n objNow = tsToObj(tsNow, offsetProvis);\n if (useWeekData) {\n units = orderedWeekUnits;\n defaultValues = defaultWeekUnitValues;\n objNow = gregorianToWeek(objNow, minDaysInFirstWeek, startOfWeek);\n } else if (containsOrdinal) {\n units = orderedOrdinalUnits;\n defaultValues = defaultOrdinalUnitValues;\n objNow = gregorianToOrdinal(objNow);\n } else {\n units = orderedUnits;\n defaultValues = defaultUnitValues;\n }\n\n // set default values for missing stuff\n let foundFirst = false;\n for (const u of units) {\n const v = normalized[u];\n if (!isUndefined(v)) {\n foundFirst = true;\n } else if (foundFirst) {\n normalized[u] = defaultValues[u];\n } else {\n normalized[u] = objNow[u];\n }\n }\n\n // make sure the values we have are in range\n const higherOrderInvalid = useWeekData\n ? hasInvalidWeekData(normalized, minDaysInFirstWeek, startOfWeek)\n : containsOrdinal\n ? hasInvalidOrdinalData(normalized)\n : hasInvalidGregorianData(normalized),\n invalid = higherOrderInvalid || hasInvalidTimeData(normalized);\n\n if (invalid) {\n return DateTime.invalid(invalid);\n }\n\n // compute the actual time\n const gregorian = useWeekData\n ? weekToGregorian(normalized, minDaysInFirstWeek, startOfWeek)\n : containsOrdinal\n ? ordinalToGregorian(normalized)\n : normalized,\n [tsFinal, offsetFinal] = objToTS(gregorian, offsetProvis, zoneToUse),\n inst = new DateTime({\n ts: tsFinal,\n zone: zoneToUse,\n o: offsetFinal,\n loc,\n });\n\n // gregorian data + weekday serves only to validate\n if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) {\n return DateTime.invalid(\n \"mismatched weekday\",\n `you can't specify both a weekday of ${normalized.weekday} and a date of ${inst.toISO()}`\n );\n }\n\n if (!inst.isValid) {\n return DateTime.invalid(inst.invalid);\n }\n\n return inst;\n }\n\n /**\n * Create a DateTime from an ISO 8601 string\n * @param {string} text - the ISO string\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance\n * @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance\n * @param {string} [opts.weekSettings] - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromISO('2016-05-25T09:08:34.123')\n * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00')\n * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true})\n * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'})\n * @example DateTime.fromISO('2016-W05-4')\n * @return {DateTime}\n */\n static fromISO(text, opts = {}) {\n const [vals, parsedZone] = parseISODate(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"ISO 8601\", text);\n }\n\n /**\n * Create a DateTime from an RFC 2822 string\n * @param {string} text - the RFC 2822 string\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT')\n * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600')\n * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z')\n * @return {DateTime}\n */\n static fromRFC2822(text, opts = {}) {\n const [vals, parsedZone] = parseRFC2822Date(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"RFC 2822\", text);\n }\n\n /**\n * Create a DateTime from an HTTP header date\n * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n * @param {string} text - the HTTP header date\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods.\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT')\n * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT')\n * @example DateTime.fromHTTP('Sun Nov 6 08:49:37 1994')\n * @return {DateTime}\n */\n static fromHTTP(text, opts = {}) {\n const [vals, parsedZone] = parseHTTPDate(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"HTTP\", opts);\n }\n\n /**\n * Create a DateTime from an input string and format string.\n * Defaults to en-US if no locale has been specified, regardless of the system's locale. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/parsing?id=table-of-tokens).\n * @param {string} text - the string to parse\n * @param {string} fmt - the format the string is expected to be in (see the link below for the formats)\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromFormat(text, fmt, opts = {}) {\n if (isUndefined(text) || isUndefined(fmt)) {\n throw new InvalidArgumentError(\"fromFormat requires an input string and a format\");\n }\n\n const { locale = null, numberingSystem = null } = opts,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n }),\n [vals, parsedZone, specificOffset, invalid] = parseFromTokens(localeToUse, text, fmt);\n if (invalid) {\n return DateTime.invalid(invalid);\n } else {\n return parseDataToDateTime(vals, parsedZone, opts, `format ${fmt}`, text, specificOffset);\n }\n }\n\n /**\n * @deprecated use fromFormat instead\n */\n static fromString(text, fmt, opts = {}) {\n return DateTime.fromFormat(text, fmt, opts);\n }\n\n /**\n * Create a DateTime from a SQL date, time, or datetime\n * Defaults to en-US if no locale has been specified, regardless of the system's locale\n * @param {string} text - the string to parse\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @example DateTime.fromSQL('2017-05-15')\n * @example DateTime.fromSQL('2017-05-15 09:12:34')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true })\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' })\n * @example DateTime.fromSQL('09:12:34.342')\n * @return {DateTime}\n */\n static fromSQL(text, opts = {}) {\n const [vals, parsedZone] = parseSQL(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"SQL\", text);\n }\n\n /**\n * Create an invalid DateTime.\n * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent.\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {DateTime}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the DateTime is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidDateTimeError(invalid);\n } else {\n return new DateTime({ invalid });\n }\n }\n\n /**\n * Check if an object is an instance of DateTime. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isDateTime(o) {\n return (o && o.isLuxonDateTime) || false;\n }\n\n /**\n * Produce the format string for a set of options\n * @param formatOpts\n * @param localeOpts\n * @returns {string}\n */\n static parseFormatForOpts(formatOpts, localeOpts = {}) {\n const tokenList = formatOptsToTokens(formatOpts, Locale.fromObject(localeOpts));\n return !tokenList ? null : tokenList.map((t) => (t ? t.val : null)).join(\"\");\n }\n\n /**\n * Produce the the fully expanded format token for the locale\n * Does NOT quote characters, so quoted tokens will not round trip correctly\n * @param fmt\n * @param localeOpts\n * @returns {string}\n */\n static expandFormat(fmt, localeOpts = {}) {\n const expanded = expandMacroTokens(Formatter.parseFormat(fmt), Locale.fromObject(localeOpts));\n return expanded.map((t) => t.val).join(\"\");\n }\n\n static resetCache() {\n zoneOffsetTs = undefined;\n zoneOffsetGuessCache.clear();\n }\n\n // INFO\n\n /**\n * Get the value of unit.\n * @param {string} unit - a unit such as 'minute' or 'day'\n * @example DateTime.local(2017, 7, 4).get('month'); //=> 7\n * @example DateTime.local(2017, 7, 4).get('day'); //=> 4\n * @return {number}\n */\n get(unit) {\n return this[unit];\n }\n\n /**\n * Returns whether the DateTime is valid. Invalid DateTimes occur when:\n * * The DateTime was created from invalid calendar information, such as the 13th month or February 30\n * * The DateTime was created by an operation on another invalid date\n * @type {boolean}\n */\n get isValid() {\n return this.invalid === null;\n }\n\n /**\n * Returns an error code if this DateTime is invalid, or null if the DateTime is valid\n * @type {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime\n *\n * @type {string}\n */\n get locale() {\n return this.isValid ? this.loc.locale : null;\n }\n\n /**\n * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime\n *\n * @type {string}\n */\n get numberingSystem() {\n return this.isValid ? this.loc.numberingSystem : null;\n }\n\n /**\n * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime\n *\n * @type {string}\n */\n get outputCalendar() {\n return this.isValid ? this.loc.outputCalendar : null;\n }\n\n /**\n * Get the time zone associated with this DateTime.\n * @type {Zone}\n */\n get zone() {\n return this._zone;\n }\n\n /**\n * Get the name of the time zone.\n * @type {string}\n */\n get zoneName() {\n return this.isValid ? this.zone.name : null;\n }\n\n /**\n * Get the year\n * @example DateTime.local(2017, 5, 25).year //=> 2017\n * @type {number}\n */\n get year() {\n return this.isValid ? this.c.year : NaN;\n }\n\n /**\n * Get the quarter\n * @example DateTime.local(2017, 5, 25).quarter //=> 2\n * @type {number}\n */\n get quarter() {\n return this.isValid ? Math.ceil(this.c.month / 3) : NaN;\n }\n\n /**\n * Get the month (1-12).\n * @example DateTime.local(2017, 5, 25).month //=> 5\n * @type {number}\n */\n get month() {\n return this.isValid ? this.c.month : NaN;\n }\n\n /**\n * Get the day of the month (1-30ish).\n * @example DateTime.local(2017, 5, 25).day //=> 25\n * @type {number}\n */\n get day() {\n return this.isValid ? this.c.day : NaN;\n }\n\n /**\n * Get the hour of the day (0-23).\n * @example DateTime.local(2017, 5, 25, 9).hour //=> 9\n * @type {number}\n */\n get hour() {\n return this.isValid ? this.c.hour : NaN;\n }\n\n /**\n * Get the minute of the hour (0-59).\n * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30\n * @type {number}\n */\n get minute() {\n return this.isValid ? this.c.minute : NaN;\n }\n\n /**\n * Get the second of the minute (0-59).\n * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52\n * @type {number}\n */\n get second() {\n return this.isValid ? this.c.second : NaN;\n }\n\n /**\n * Get the millisecond of the second (0-999).\n * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654\n * @type {number}\n */\n get millisecond() {\n return this.isValid ? this.c.millisecond : NaN;\n }\n\n /**\n * Get the week year\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2014, 12, 31).weekYear //=> 2015\n * @type {number}\n */\n get weekYear() {\n return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN;\n }\n\n /**\n * Get the week number of the week year (1-52ish).\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2017, 5, 25).weekNumber //=> 21\n * @type {number}\n */\n get weekNumber() {\n return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN;\n }\n\n /**\n * Get the day of the week.\n * 1 is Monday and 7 is Sunday\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2014, 11, 31).weekday //=> 4\n * @type {number}\n */\n get weekday() {\n return this.isValid ? possiblyCachedWeekData(this).weekday : NaN;\n }\n\n /**\n * Returns true if this date is on a weekend according to the locale, false otherwise\n * @returns {boolean}\n */\n get isWeekend() {\n return this.isValid && this.loc.getWeekendDays().includes(this.weekday);\n }\n\n /**\n * Get the day of the week according to the locale.\n * 1 is the first day of the week and 7 is the last day of the week.\n * If the locale assigns Sunday as the first day of the week, then a date which is a Sunday will return 1,\n * @returns {number}\n */\n get localWeekday() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekday : NaN;\n }\n\n /**\n * Get the week number of the week year according to the locale. Different locales assign week numbers differently,\n * because the week can start on different days of the week (see localWeekday) and because a different number of days\n * is required for a week to count as the first week of a year.\n * @returns {number}\n */\n get localWeekNumber() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekNumber : NaN;\n }\n\n /**\n * Get the week year according to the locale. Different locales assign week numbers (and therefor week years)\n * differently, see localWeekNumber.\n * @returns {number}\n */\n get localWeekYear() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekYear : NaN;\n }\n\n /**\n * Get the ordinal (meaning the day of the year)\n * @example DateTime.local(2017, 5, 25).ordinal //=> 145\n * @type {number|DateTime}\n */\n get ordinal() {\n return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN;\n }\n\n /**\n * Get the human readable short month name, such as 'Oct'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).monthShort //=> Oct\n * @type {string}\n */\n get monthShort() {\n return this.isValid ? Info.months(\"short\", { locObj: this.loc })[this.month - 1] : null;\n }\n\n /**\n * Get the human readable long month name, such as 'October'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).monthLong //=> October\n * @type {string}\n */\n get monthLong() {\n return this.isValid ? Info.months(\"long\", { locObj: this.loc })[this.month - 1] : null;\n }\n\n /**\n * Get the human readable short weekday, such as 'Mon'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon\n * @type {string}\n */\n get weekdayShort() {\n return this.isValid ? Info.weekdays(\"short\", { locObj: this.loc })[this.weekday - 1] : null;\n }\n\n /**\n * Get the human readable long weekday, such as 'Monday'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday\n * @type {string}\n */\n get weekdayLong() {\n return this.isValid ? Info.weekdays(\"long\", { locObj: this.loc })[this.weekday - 1] : null;\n }\n\n /**\n * Get the UTC offset of this DateTime in minutes\n * @example DateTime.now().offset //=> -240\n * @example DateTime.utc().offset //=> 0\n * @type {number}\n */\n get offset() {\n return this.isValid ? +this.o : NaN;\n }\n\n /**\n * Get the short human name for the zone's current offset, for example \"EST\" or \"EDT\".\n * Defaults to the system's locale if no locale has been specified\n * @type {string}\n */\n get offsetNameShort() {\n if (this.isValid) {\n return this.zone.offsetName(this.ts, {\n format: \"short\",\n locale: this.locale,\n });\n } else {\n return null;\n }\n }\n\n /**\n * Get the long human name for the zone's current offset, for example \"Eastern Standard Time\" or \"Eastern Daylight Time\".\n * Defaults to the system's locale if no locale has been specified\n * @type {string}\n */\n get offsetNameLong() {\n if (this.isValid) {\n return this.zone.offsetName(this.ts, {\n format: \"long\",\n locale: this.locale,\n });\n } else {\n return null;\n }\n }\n\n /**\n * Get whether this zone's offset ever changes, as in a DST.\n * @type {boolean}\n */\n get isOffsetFixed() {\n return this.isValid ? this.zone.isUniversal : null;\n }\n\n /**\n * Get whether the DateTime is in a DST.\n * @type {boolean}\n */\n get isInDST() {\n if (this.isOffsetFixed) {\n return false;\n } else {\n return (\n this.offset > this.set({ month: 1, day: 1 }).offset ||\n this.offset > this.set({ month: 5 }).offset\n );\n }\n }\n\n /**\n * Get those DateTimes which have the same local time as this DateTime, but a different offset from UTC\n * in this DateTime's zone. During DST changes local time can be ambiguous, for example\n * `2023-10-29T02:30:00` in `Europe/Berlin` can have offset `+01:00` or `+02:00`.\n * This method will return both possible DateTimes if this DateTime's local time is ambiguous.\n * @returns {DateTime[]}\n */\n getPossibleOffsets() {\n if (!this.isValid || this.isOffsetFixed) {\n return [this];\n }\n const dayMs = 86400000;\n const minuteMs = 60000;\n const localTS = objToLocalTS(this.c);\n const oEarlier = this.zone.offset(localTS - dayMs);\n const oLater = this.zone.offset(localTS + dayMs);\n\n const o1 = this.zone.offset(localTS - oEarlier * minuteMs);\n const o2 = this.zone.offset(localTS - oLater * minuteMs);\n if (o1 === o2) {\n return [this];\n }\n const ts1 = localTS - o1 * minuteMs;\n const ts2 = localTS - o2 * minuteMs;\n const c1 = tsToObj(ts1, o1);\n const c2 = tsToObj(ts2, o2);\n if (\n c1.hour === c2.hour &&\n c1.minute === c2.minute &&\n c1.second === c2.second &&\n c1.millisecond === c2.millisecond\n ) {\n return [clone(this, { ts: ts1 }), clone(this, { ts: ts2 })];\n }\n return [this];\n }\n\n /**\n * Returns true if this DateTime is in a leap year, false otherwise\n * @example DateTime.local(2016).isInLeapYear //=> true\n * @example DateTime.local(2013).isInLeapYear //=> false\n * @type {boolean}\n */\n get isInLeapYear() {\n return isLeapYear(this.year);\n }\n\n /**\n * Returns the number of days in this DateTime's month\n * @example DateTime.local(2016, 2).daysInMonth //=> 29\n * @example DateTime.local(2016, 3).daysInMonth //=> 31\n * @type {number}\n */\n get daysInMonth() {\n return daysInMonth(this.year, this.month);\n }\n\n /**\n * Returns the number of days in this DateTime's year\n * @example DateTime.local(2016).daysInYear //=> 366\n * @example DateTime.local(2013).daysInYear //=> 365\n * @type {number}\n */\n get daysInYear() {\n return this.isValid ? daysInYear(this.year) : NaN;\n }\n\n /**\n * Returns the number of weeks in this DateTime's year\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2004).weeksInWeekYear //=> 53\n * @example DateTime.local(2013).weeksInWeekYear //=> 52\n * @type {number}\n */\n get weeksInWeekYear() {\n return this.isValid ? weeksInWeekYear(this.weekYear) : NaN;\n }\n\n /**\n * Returns the number of weeks in this DateTime's local week year\n * @example DateTime.local(2020, 6, {locale: 'en-US'}).weeksInLocalWeekYear //=> 52\n * @example DateTime.local(2020, 6, {locale: 'de-DE'}).weeksInLocalWeekYear //=> 53\n * @type {number}\n */\n get weeksInLocalWeekYear() {\n return this.isValid\n ? weeksInWeekYear(\n this.localWeekYear,\n this.loc.getMinDaysInFirstWeek(),\n this.loc.getStartOfWeek()\n )\n : NaN;\n }\n\n /**\n * Returns the resolved Intl options for this DateTime.\n * This is useful in understanding the behavior of formatting methods\n * @param {Object} opts - the same options as toLocaleString\n * @return {Object}\n */\n resolvedLocaleOptions(opts = {}) {\n const { locale, numberingSystem, calendar } = Formatter.create(\n this.loc.clone(opts),\n opts\n ).resolvedOptions(this);\n return { locale, numberingSystem, outputCalendar: calendar };\n }\n\n // TRANSFORM\n\n /**\n * \"Set\" the DateTime's zone to UTC. Returns a newly-constructed DateTime.\n *\n * Equivalent to {@link DateTime#setZone}('utc')\n * @param {number} [offset=0] - optionally, an offset from UTC in minutes\n * @param {Object} [opts={}] - options to pass to `setZone()`\n * @return {DateTime}\n */\n toUTC(offset = 0, opts = {}) {\n return this.setZone(FixedOffsetZone.instance(offset), opts);\n }\n\n /**\n * \"Set\" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime.\n *\n * Equivalent to `setZone('local')`\n * @return {DateTime}\n */\n toLocal() {\n return this.setZone(Settings.defaultZone);\n }\n\n /**\n * \"Set\" the DateTime's zone to specified zone. Returns a newly-constructed DateTime.\n *\n * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link DateTime#plus}. You may wish to use {@link DateTime#toLocal} and {@link DateTime#toUTC} which provide simple convenience wrappers for commonly used zones.\n * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link DateTime#Zone} class.\n * @param {Object} opts - options\n * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this.\n * @return {DateTime}\n */\n setZone(zone, { keepLocalTime = false, keepCalendarTime = false } = {}) {\n zone = normalizeZone(zone, Settings.defaultZone);\n if (zone.equals(this.zone)) {\n return this;\n } else if (!zone.isValid) {\n return DateTime.invalid(unsupportedZone(zone));\n } else {\n let newTS = this.ts;\n if (keepLocalTime || keepCalendarTime) {\n const offsetGuess = zone.offset(this.ts);\n const asObj = this.toObject();\n [newTS] = objToTS(asObj, offsetGuess, zone);\n }\n return clone(this, { ts: newTS, zone });\n }\n }\n\n /**\n * \"Set\" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime.\n * @param {Object} properties - the properties to set\n * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' })\n * @return {DateTime}\n */\n reconfigure({ locale, numberingSystem, outputCalendar } = {}) {\n const loc = this.loc.clone({ locale, numberingSystem, outputCalendar });\n return clone(this, { loc });\n }\n\n /**\n * \"Set\" the locale. Returns a newly-constructed DateTime.\n * Just a convenient alias for reconfigure({ locale })\n * @example DateTime.local(2017, 5, 25).setLocale('en-GB')\n * @return {DateTime}\n */\n setLocale(locale) {\n return this.reconfigure({ locale });\n }\n\n /**\n * \"Set\" the values of specified units. Returns a newly-constructed DateTime.\n * You can only set units with this method; for \"setting\" metadata, see {@link DateTime#reconfigure} and {@link DateTime#setZone}.\n *\n * This method also supports setting locale-based week units, i.e. `localWeekday`, `localWeekNumber` and `localWeekYear`.\n * They cannot be mixed with ISO-week units like `weekday`.\n * @param {Object} values - a mapping of units to numbers\n * @example dt.set({ year: 2017 })\n * @example dt.set({ hour: 8, minute: 30 })\n * @example dt.set({ weekday: 5 })\n * @example dt.set({ year: 2005, ordinal: 234 })\n * @return {DateTime}\n */\n set(values) {\n if (!this.isValid) return this;\n\n const normalized = normalizeObject(values, normalizeUnitWithLocalWeeks);\n const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, this.loc);\n\n const settingWeekStuff =\n !isUndefined(normalized.weekYear) ||\n !isUndefined(normalized.weekNumber) ||\n !isUndefined(normalized.weekday),\n containsOrdinal = !isUndefined(normalized.ordinal),\n containsGregorYear = !isUndefined(normalized.year),\n containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n containsGregor = containsGregorYear || containsGregorMD,\n definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n throw new ConflictingSpecificationError(\n \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n );\n }\n\n if (containsGregorMD && containsOrdinal) {\n throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n }\n\n let mixed;\n if (settingWeekStuff) {\n mixed = weekToGregorian(\n { ...gregorianToWeek(this.c, minDaysInFirstWeek, startOfWeek), ...normalized },\n minDaysInFirstWeek,\n startOfWeek\n );\n } else if (!isUndefined(normalized.ordinal)) {\n mixed = ordinalToGregorian({ ...gregorianToOrdinal(this.c), ...normalized });\n } else {\n mixed = { ...this.toObject(), ...normalized };\n\n // if we didn't set the day but we ended up on an overflow date,\n // use the last day of the right month\n if (isUndefined(normalized.day)) {\n mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day);\n }\n }\n\n const [ts, o] = objToTS(mixed, this.o, this.zone);\n return clone(this, { ts, o });\n }\n\n /**\n * Add a period of time to this DateTime and return the resulting DateTime\n *\n * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between.\n * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @example DateTime.now().plus(123) //~> in 123 milliseconds\n * @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes\n * @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow\n * @example DateTime.now().plus({ days: -1 }) //~> this time yesterday\n * @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min\n * @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min\n * @return {DateTime}\n */\n plus(duration) {\n if (!this.isValid) return this;\n const dur = Duration.fromDurationLike(duration);\n return clone(this, adjustTime(this, dur));\n }\n\n /**\n * Subtract a period of time to this DateTime and return the resulting DateTime\n * See {@link DateTime#plus}\n * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n @return {DateTime}\n */\n minus(duration) {\n if (!this.isValid) return this;\n const dur = Duration.fromDurationLike(duration).negate();\n return clone(this, adjustTime(this, dur));\n }\n\n /**\n * \"Set\" this DateTime to the beginning of a unit of time.\n * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week\n * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01'\n * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01'\n * @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays\n * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00'\n * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00'\n * @return {DateTime}\n */\n startOf(unit, { useLocaleWeeks = false } = {}) {\n if (!this.isValid) return this;\n\n const o = {},\n normalizedUnit = Duration.normalizeUnit(unit);\n switch (normalizedUnit) {\n case \"years\":\n o.month = 1;\n // falls through\n case \"quarters\":\n case \"months\":\n o.day = 1;\n // falls through\n case \"weeks\":\n case \"days\":\n o.hour = 0;\n // falls through\n case \"hours\":\n o.minute = 0;\n // falls through\n case \"minutes\":\n o.second = 0;\n // falls through\n case \"seconds\":\n o.millisecond = 0;\n break;\n case \"milliseconds\":\n break;\n // no default, invalid units throw in normalizeUnit()\n }\n\n if (normalizedUnit === \"weeks\") {\n if (useLocaleWeeks) {\n const startOfWeek = this.loc.getStartOfWeek();\n const { weekday } = this;\n if (weekday < startOfWeek) {\n o.weekNumber = this.weekNumber - 1;\n }\n o.weekday = startOfWeek;\n } else {\n o.weekday = 1;\n }\n }\n\n if (normalizedUnit === \"quarters\") {\n const q = Math.ceil(this.month / 3);\n o.month = (q - 1) * 3 + 1;\n }\n\n return this.set(o);\n }\n\n /**\n * \"Set\" this DateTime to the end (meaning the last millisecond) of a unit of time\n * @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week\n * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays\n * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00'\n * @return {DateTime}\n */\n endOf(unit, opts) {\n return this.isValid\n ? this.plus({ [unit]: 1 })\n .startOf(unit, opts)\n .minus(1)\n : this;\n }\n\n // OUTPUT\n\n /**\n * Returns a string representation of this DateTime formatted according to the specified format string.\n * **You may not want this.** See {@link DateTime#toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/formatting?id=table-of-tokens).\n * Defaults to en-US if no locale has been specified, regardless of the system's locale.\n * @param {string} fmt - the format string\n * @param {Object} opts - opts to override the configuration options on this DateTime\n * @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22'\n * @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22'\n * @example DateTime.now().toFormat('yyyy LLL dd', { locale: \"fr\" }) //=> '2017 avr. 22'\n * @example DateTime.now().toFormat(\"HH 'hours and' mm 'minutes'\") //=> '20 hours and 55 minutes'\n * @return {string}\n */\n toFormat(fmt, opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt)\n : INVALID;\n }\n\n /**\n * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`.\n * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation\n * of the DateTime in the assigned locale.\n * Defaults to the system's locale if no locale has been specified\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param formatOpts {Object} - Intl.DateTimeFormat constructor options and configuration options\n * @param {Object} opts - opts to override the configuration options on this DateTime\n * @example DateTime.now().toLocaleString(); //=> 4/20/2017\n * @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017'\n * @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017'\n * @example DateTime.now().toLocaleString(DateTime.DATE_FULL, { locale: 'fr' }); //=> '28 août 2022'\n * @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM'\n * @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM'\n * @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20'\n * @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM'\n * @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }); //=> '11:32'\n * @return {string}\n */\n toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this)\n : INVALID;\n }\n\n /**\n * Returns an array of format \"parts\", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output.\n * Defaults to the system's locale if no locale has been specified\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts\n * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`.\n * @example DateTime.now().toLocaleParts(); //=> [\n * //=> { type: 'day', value: '25' },\n * //=> { type: 'literal', value: '/' },\n * //=> { type: 'month', value: '05' },\n * //=> { type: 'literal', value: '/' },\n * //=> { type: 'year', value: '1982' }\n * //=> ]\n */\n toLocaleParts(opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this)\n : [];\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.extendedZone=false] - add the time zone format extension\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'years', 'months', 'days', 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0.\n * @example DateTime.utc(1983, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z'\n * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00'\n * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335'\n * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400'\n * @example DateTime.now().toISO({ precision: 'day' }) //=> '2017-04-22Z'\n * @example DateTime.now().toISO({ precision: 'minute' }) //=> '2017-04-22T20:47Z'\n * @return {string|null}\n */\n toISO({\n format = \"extended\",\n suppressSeconds = false,\n suppressMilliseconds = false,\n includeOffset = true,\n extendedZone = false,\n precision = \"milliseconds\",\n } = {}) {\n if (!this.isValid) {\n return null;\n }\n\n precision = normalizeUnit(precision);\n const ext = format === \"extended\";\n\n let c = toISODate(this, ext, precision);\n if (orderedUnits.indexOf(precision) >= 3) c += \"T\";\n c += toISOTime(\n this,\n ext,\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n );\n return c;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's date component\n * @param {Object} opts - options\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='day'] - truncate output to desired precision: 'years', 'months', or 'days'.\n * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25'\n * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525'\n * @example DateTime.utc(1982, 5, 25).toISODate({ precision: 'month' }) //=> '1982-05'\n * @return {string|null}\n */\n toISODate({ format = \"extended\", precision = \"day\" } = {}) {\n if (!this.isValid) {\n return null;\n }\n return toISODate(this, format === \"extended\", normalizeUnit(precision));\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's week date\n * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2'\n * @return {string}\n */\n toISOWeekDate() {\n return toTechFormat(this, \"kkkk-'W'WW-c\");\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's time component\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.extendedZone=true] - add the time zone format extension\n * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0.\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34, second: 56 }).toISOTime({ precision: 'minute' }) //=> '07:34Z'\n * @return {string}\n */\n toISOTime({\n suppressMilliseconds = false,\n suppressSeconds = false,\n includeOffset = true,\n includePrefix = false,\n extendedZone = false,\n format = \"extended\",\n precision = \"milliseconds\",\n } = {}) {\n if (!this.isValid) {\n return null;\n }\n\n precision = normalizeUnit(precision);\n let c = includePrefix && orderedUnits.indexOf(precision) >= 3 ? \"T\" : \"\";\n return (\n c +\n toISOTime(\n this,\n format === \"extended\",\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n )\n );\n }\n\n /**\n * Returns an RFC 2822-compatible string representation of this DateTime\n * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000'\n * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400'\n * @return {string}\n */\n toRFC2822() {\n return toTechFormat(this, \"EEE, dd LLL yyyy HH:mm:ss ZZZ\", false);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in HTTP headers. The output is always expressed in GMT.\n * Specifically, the string conforms to RFC 1123.\n * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT'\n * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT'\n * @return {string}\n */\n toHTTP() {\n return toTechFormat(this.toUTC(), \"EEE, dd LLL yyyy HH:mm:ss 'GMT'\");\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL Date\n * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13'\n * @return {string|null}\n */\n toSQLDate() {\n if (!this.isValid) {\n return null;\n }\n return toISODate(this, true);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL Time\n * @param {Object} opts - options\n * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00'\n * @example DateTime.utc().toSQL() //=> '05:15:16.345'\n * @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00'\n * @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345'\n * @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York'\n * @return {string}\n */\n toSQLTime({ includeOffset = true, includeZone = false, includeOffsetSpace = true } = {}) {\n let fmt = \"HH:mm:ss.SSS\";\n\n if (includeZone || includeOffset) {\n if (includeOffsetSpace) {\n fmt += \" \";\n }\n if (includeZone) {\n fmt += \"z\";\n } else if (includeOffset) {\n fmt += \"ZZ\";\n }\n }\n\n return toTechFormat(this, fmt, true);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL DateTime\n * @param {Object} opts - options\n * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00'\n * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z'\n * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00'\n * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000'\n * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York'\n * @return {string}\n */\n toSQL(opts = {}) {\n if (!this.isValid) {\n return null;\n }\n\n return `${this.toSQLDate()} ${this.toSQLTime(opts)}`;\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for debugging\n * @return {string}\n */\n toString() {\n return this.isValid ? this.toISO() : INVALID;\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `DateTime { ts: ${this.toISO()}, zone: ${this.zone.name}, locale: ${this.locale} }`;\n } else {\n return `DateTime { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns the epoch milliseconds of this DateTime. Alias of {@link DateTime#toMillis}\n * @return {number}\n */\n valueOf() {\n return this.toMillis();\n }\n\n /**\n * Returns the epoch milliseconds of this DateTime.\n * @return {number}\n */\n toMillis() {\n return this.isValid ? this.ts : NaN;\n }\n\n /**\n * Returns the epoch seconds (including milliseconds in the fractional part) of this DateTime.\n * @return {number}\n */\n toSeconds() {\n return this.isValid ? this.ts / 1000 : NaN;\n }\n\n /**\n * Returns the epoch seconds (as a whole number) of this DateTime.\n * @return {number}\n */\n toUnixInteger() {\n return this.isValid ? Math.floor(this.ts / 1000) : NaN;\n }\n\n /**\n * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON.\n * @return {string}\n */\n toJSON() {\n return this.toISO();\n }\n\n /**\n * Returns a BSON serializable equivalent to this DateTime.\n * @return {Date}\n */\n toBSON() {\n return this.toJSDate();\n }\n\n /**\n * Returns a JavaScript object with this DateTime's year, month, day, and so on.\n * @param opts - options for generating the object\n * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output\n * @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 }\n * @return {Object}\n */\n toObject(opts = {}) {\n if (!this.isValid) return {};\n\n const base = { ...this.c };\n\n if (opts.includeConfig) {\n base.outputCalendar = this.outputCalendar;\n base.numberingSystem = this.loc.numberingSystem;\n base.locale = this.loc.locale;\n }\n return base;\n }\n\n /**\n * Returns a JavaScript Date equivalent to this DateTime.\n * @return {Date}\n */\n toJSDate() {\n return new Date(this.isValid ? this.ts : NaN);\n }\n\n // COMPARE\n\n /**\n * Return the difference between two DateTimes as a Duration.\n * @param {DateTime} otherDateTime - the DateTime to compare this one to\n * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration.\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @example\n * var i1 = DateTime.fromISO('1982-05-25T09:45'),\n * i2 = DateTime.fromISO('1983-10-14T10:30');\n * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 }\n * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 }\n * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 }\n * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 }\n * @return {Duration}\n */\n diff(otherDateTime, unit = \"milliseconds\", opts = {}) {\n if (!this.isValid || !otherDateTime.isValid) {\n return Duration.invalid(\"created by diffing an invalid DateTime\");\n }\n\n const durOpts = { locale: this.locale, numberingSystem: this.numberingSystem, ...opts };\n\n const units = maybeArray(unit).map(Duration.normalizeUnit),\n otherIsLater = otherDateTime.valueOf() > this.valueOf(),\n earlier = otherIsLater ? this : otherDateTime,\n later = otherIsLater ? otherDateTime : this,\n diffed = diff(earlier, later, units, durOpts);\n\n return otherIsLater ? diffed.negate() : diffed;\n }\n\n /**\n * Return the difference between this DateTime and right now.\n * See {@link DateTime#diff}\n * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @return {Duration}\n */\n diffNow(unit = \"milliseconds\", opts = {}) {\n return this.diff(DateTime.now(), unit, opts);\n }\n\n /**\n * Return an Interval spanning between this DateTime and another DateTime\n * @param {DateTime} otherDateTime - the other end point of the Interval\n * @return {Interval|DateTime}\n */\n until(otherDateTime) {\n return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this;\n }\n\n /**\n * Return whether this DateTime is in the same unit of time as another DateTime.\n * Higher-order units must also be identical for this function to return `true`.\n * Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link DateTime#setZone} to convert one of the dates if needed.\n * @param {DateTime} otherDateTime - the other DateTime\n * @param {string} unit - the unit of time to check sameness on\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; only the locale of this DateTime is used\n * @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day\n * @return {boolean}\n */\n hasSame(otherDateTime, unit, opts) {\n if (!this.isValid) return false;\n\n const inputMs = otherDateTime.valueOf();\n const adjustedToZone = this.setZone(otherDateTime.zone, { keepLocalTime: true });\n return (\n adjustedToZone.startOf(unit, opts) <= inputMs && inputMs <= adjustedToZone.endOf(unit, opts)\n );\n }\n\n /**\n * Equality check\n * Two DateTimes are equal if and only if they represent the same millisecond, have the same zone and location, and are both valid.\n * To compare just the millisecond values, use `+dt1 === +dt2`.\n * @param {DateTime} other - the other DateTime\n * @return {boolean}\n */\n equals(other) {\n return (\n this.isValid &&\n other.isValid &&\n this.valueOf() === other.valueOf() &&\n this.zone.equals(other.zone) &&\n this.loc.equals(other.loc)\n );\n }\n\n /**\n * Returns a string representation of a this time relative to now, such as \"in two days\". Can only internationalize if your\n * platform supports Intl.RelativeTimeFormat. Rounds towards zero by default.\n * @param {Object} options - options that affect the output\n * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n * @param {string} [options.style=\"long\"] - the style of units, must be \"long\", \"short\", or \"narrow\"\n * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of \"years\", \"quarters\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", or \"seconds\"\n * @param {boolean} [options.round=true] - whether to round the numbers in the output.\n * @param {string} [options.rounding=\"trunc\"] - rounding method to use when rounding the numbers in the output. Can be \"trunc\" (toward zero), \"expand\" (away from zero), \"round\", \"floor\", or \"ceil\".\n * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding.\n * @param {string} options.locale - override the locale of this DateTime\n * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n * @example DateTime.now().plus({ days: 1 }).toRelative() //=> \"in 1 day\"\n * @example DateTime.now().setLocale(\"es\").toRelative({ days: 1 }) //=> \"dentro de 1 día\"\n * @example DateTime.now().plus({ days: 1 }).toRelative({ locale: \"fr\" }) //=> \"dans 23 heures\"\n * @example DateTime.now().minus({ days: 2 }).toRelative() //=> \"2 days ago\"\n * @example DateTime.now().minus({ days: 2 }).toRelative({ unit: \"hours\" }) //=> \"48 hours ago\"\n * @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> \"1.5 days ago\"\n */\n toRelative(options = {}) {\n if (!this.isValid) return null;\n const base = options.base || DateTime.fromObject({}, { zone: this.zone }),\n padding = options.padding ? (this < base ? -options.padding : options.padding) : 0;\n let units = [\"years\", \"months\", \"days\", \"hours\", \"minutes\", \"seconds\"];\n let unit = options.unit;\n if (Array.isArray(options.unit)) {\n units = options.unit;\n unit = undefined;\n }\n return diffRelative(base, this.plus(padding), {\n ...options,\n numeric: \"always\",\n units,\n unit,\n });\n }\n\n /**\n * Returns a string representation of this date relative to today, such as \"yesterday\" or \"next month\".\n * Only internationalizes on platforms that supports Intl.RelativeTimeFormat.\n * @param {Object} options - options that affect the output\n * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n * @param {string} options.locale - override the locale of this DateTime\n * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of \"years\", \"quarters\", \"months\", \"weeks\", or \"days\"\n * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> \"tomorrow\"\n * @example DateTime.now().setLocale(\"es\").plus({ days: 1 }).toRelative() //=> \"\"mañana\"\n * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: \"fr\" }) //=> \"demain\"\n * @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> \"2 days ago\"\n */\n toRelativeCalendar(options = {}) {\n if (!this.isValid) return null;\n\n return diffRelative(options.base || DateTime.fromObject({}, { zone: this.zone }), this, {\n ...options,\n numeric: \"auto\",\n units: [\"years\", \"months\", \"days\"],\n calendary: true,\n });\n }\n\n /**\n * Return the min of several date times\n * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum\n * @return {DateTime} the min DateTime, or undefined if called with no argument\n */\n static min(...dateTimes) {\n if (!dateTimes.every(DateTime.isDateTime)) {\n throw new InvalidArgumentError(\"min requires all arguments be DateTimes\");\n }\n return bestBy(dateTimes, (i) => i.valueOf(), Math.min);\n }\n\n /**\n * Return the max of several date times\n * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum\n * @return {DateTime} the max DateTime, or undefined if called with no argument\n */\n static max(...dateTimes) {\n if (!dateTimes.every(DateTime.isDateTime)) {\n throw new InvalidArgumentError(\"max requires all arguments be DateTimes\");\n }\n return bestBy(dateTimes, (i) => i.valueOf(), Math.max);\n }\n\n // MISC\n\n /**\n * Explain how a string would be parsed by fromFormat()\n * @param {string} text - the string to parse\n * @param {string} fmt - the format the string is expected to be in (see description)\n * @param {Object} options - options taken by fromFormat()\n * @return {Object}\n */\n static fromFormatExplain(text, fmt, options = {}) {\n const { locale = null, numberingSystem = null } = options,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n return explainFromTokens(localeToUse, text, fmt);\n }\n\n /**\n * @deprecated use fromFormatExplain instead\n */\n static fromStringExplain(text, fmt, options = {}) {\n return DateTime.fromFormatExplain(text, fmt, options);\n }\n\n /**\n * Build a parser for `fmt` using the given locale. This parser can be passed\n * to {@link DateTime.fromFormatParser} to a parse a date in this format. This\n * can be used to optimize cases where many dates need to be parsed in a\n * specific format.\n *\n * @param {String} fmt - the format the string is expected to be in (see\n * description)\n * @param {Object} options - options used to set locale and numberingSystem\n * for parser\n * @returns {TokenParser} - opaque object to be used\n */\n static buildFormatParser(fmt, options = {}) {\n const { locale = null, numberingSystem = null } = options,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n return new TokenParser(localeToUse, fmt);\n }\n\n /**\n * Create a DateTime from an input string and format parser.\n *\n * The format parser must have been created with the same locale as this call.\n *\n * @param {String} text - the string to parse\n * @param {TokenParser} formatParser - parser from {@link DateTime.buildFormatParser}\n * @param {Object} opts - options taken by fromFormat()\n * @returns {DateTime}\n */\n static fromFormatParser(text, formatParser, opts = {}) {\n if (isUndefined(text) || isUndefined(formatParser)) {\n throw new InvalidArgumentError(\n \"fromFormatParser requires an input string and a format parser\"\n );\n }\n const { locale = null, numberingSystem = null } = opts,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n\n if (!localeToUse.equals(formatParser.locale)) {\n throw new InvalidArgumentError(\n `fromFormatParser called with a locale of ${localeToUse}, ` +\n `but the format parser was created for ${formatParser.locale}`\n );\n }\n\n const { result, zone, specificOffset, invalidReason } = formatParser.explainFromTokens(text);\n\n if (invalidReason) {\n return DateTime.invalid(invalidReason);\n } else {\n return parseDataToDateTime(\n result,\n zone,\n opts,\n `format ${formatParser.format}`,\n text,\n specificOffset\n );\n }\n }\n\n // FORMAT PRESETS\n\n /**\n * {@link DateTime#toLocaleString} format like 10/14/1983\n * @type {Object}\n */\n static get DATE_SHORT() {\n return Formats.DATE_SHORT;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983'\n * @type {Object}\n */\n static get DATE_MED() {\n return Formats.DATE_MED;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Fri, Oct 14, 1983'\n * @type {Object}\n */\n static get DATE_MED_WITH_WEEKDAY() {\n return Formats.DATE_MED_WITH_WEEKDAY;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983'\n * @type {Object}\n */\n static get DATE_FULL() {\n return Formats.DATE_FULL;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Tuesday, October 14, 1983'\n * @type {Object}\n */\n static get DATE_HUGE() {\n return Formats.DATE_HUGE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_SIMPLE() {\n return Formats.TIME_SIMPLE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_SECONDS() {\n return Formats.TIME_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_SHORT_OFFSET() {\n return Formats.TIME_WITH_SHORT_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_LONG_OFFSET() {\n return Formats.TIME_WITH_LONG_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_SIMPLE() {\n return Formats.TIME_24_SIMPLE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_SECONDS() {\n return Formats.TIME_24_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 EDT', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_SHORT_OFFSET() {\n return Formats.TIME_24_WITH_SHORT_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_LONG_OFFSET() {\n return Formats.TIME_24_WITH_LONG_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_SHORT() {\n return Formats.DATETIME_SHORT;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_SHORT_WITH_SECONDS() {\n return Formats.DATETIME_SHORT_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED() {\n return Formats.DATETIME_MED;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED_WITH_SECONDS() {\n return Formats.DATETIME_MED_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED_WITH_WEEKDAY() {\n return Formats.DATETIME_MED_WITH_WEEKDAY;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_FULL() {\n return Formats.DATETIME_FULL;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_FULL_WITH_SECONDS() {\n return Formats.DATETIME_FULL_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_HUGE() {\n return Formats.DATETIME_HUGE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_HUGE_WITH_SECONDS() {\n return Formats.DATETIME_HUGE_WITH_SECONDS;\n }\n}\n\n/**\n * @private\n */\nexport function friendlyDateTime(dateTimeish) {\n if (DateTime.isDateTime(dateTimeish)) {\n return dateTimeish;\n } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) {\n return DateTime.fromJSDate(dateTimeish);\n } else if (dateTimeish && typeof dateTimeish === \"object\") {\n return DateTime.fromObject(dateTimeish);\n } else {\n throw new InvalidArgumentError(\n `Unknown datetime argument: ${dateTimeish}, of type ${typeof dateTimeish}`\n );\n }\n}\n","import DateTime from \"./datetime.js\";\nimport Duration from \"./duration.js\";\nimport Interval from \"./interval.js\";\nimport Info from \"./info.js\";\nimport Zone from \"./zone.js\";\nimport FixedOffsetZone from \"./zones/fixedOffsetZone.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport InvalidZone from \"./zones/invalidZone.js\";\nimport SystemZone from \"./zones/systemZone.js\";\nimport Settings from \"./settings.js\";\n\nconst VERSION = \"3.7.2\";\n\nexport {\n VERSION,\n DateTime,\n Duration,\n Interval,\n Info,\n Zone,\n FixedOffsetZone,\n IANAZone,\n InvalidZone,\n SystemZone,\n Settings,\n};\n"],"names":["singleton","English.formatRelativeTime","English.months","English.weekdays","English.meridiems","English.eras","Formats.DATE_SHORT","Formats.DATE_MED","Formats.DATE_FULL","Formats.DATE_HUGE","Formats.TIME_SIMPLE","Formats.TIME_WITH_SECONDS","Formats.TIME_WITH_SHORT_OFFSET","Formats.TIME_WITH_LONG_OFFSET","Formats.TIME_24_SIMPLE","Formats.TIME_24_WITH_SECONDS","Formats.TIME_24_WITH_SHORT_OFFSET","Formats.TIME_24_WITH_LONG_OFFSET","Formats.DATETIME_SHORT","Formats.DATETIME_MED","Formats.DATETIME_FULL","Formats.DATETIME_HUGE","Formats.DATETIME_SHORT_WITH_SECONDS","Formats.DATETIME_MED_WITH_SECONDS","Formats.DATETIME_FULL_WITH_SECONDS","Formats.DATETIME_HUGE_WITH_SECONDS","English.meridiemForDateTime","English.monthForDateTime","English.weekdayForDateTime","English.eraForDateTime","English.monthsShort","English.weekdaysLong","English.weekdaysShort","INVALID","orderedUnits","clone","Formats.DATE_MED_WITH_WEEKDAY","Formats.DATETIME_MED_WITH_WEEKDAY"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/luxon/build/global/luxon.js b/node_modules/luxon/build/global/luxon.js new file mode 100644 index 00000000..7d059e1b --- /dev/null +++ b/node_modules/luxon/build/global/luxon.js @@ -0,0 +1,8744 @@ +var luxon = (function (exports) { + 'use strict'; + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); + } + } + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", { + writable: false + }); + return Constructor; + } + function _extends() { + _extends = Object.assign ? Object.assign.bind() : function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + return target; + }; + return _extends.apply(this, arguments); + } + function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + _setPrototypeOf(subClass, superClass); + } + function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); + } + function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf(o, p); + } + function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _construct(Parent, args, Class) { + if (_isNativeReflectConstruct()) { + _construct = Reflect.construct.bind(); + } else { + _construct = function _construct(Parent, args, Class) { + var a = [null]; + a.push.apply(a, args); + var Constructor = Function.bind.apply(Parent, a); + var instance = new Constructor(); + if (Class) _setPrototypeOf(instance, Class.prototype); + return instance; + }; + } + return _construct.apply(null, arguments); + } + function _isNativeFunction(fn) { + return Function.toString.call(fn).indexOf("[native code]") !== -1; + } + function _wrapNativeSuper(Class) { + var _cache = typeof Map === "function" ? new Map() : undefined; + _wrapNativeSuper = function _wrapNativeSuper(Class) { + if (Class === null || !_isNativeFunction(Class)) return Class; + if (typeof Class !== "function") { + throw new TypeError("Super expression must either be null or a function"); + } + if (typeof _cache !== "undefined") { + if (_cache.has(Class)) return _cache.get(Class); + _cache.set(Class, Wrapper); + } + function Wrapper() { + return _construct(Class, arguments, _getPrototypeOf(this).constructor); + } + Wrapper.prototype = Object.create(Class.prototype, { + constructor: { + value: Wrapper, + enumerable: false, + writable: true, + configurable: true + } + }); + return _setPrototypeOf(Wrapper, Class); + }; + return _wrapNativeSuper(Class); + } + function _objectWithoutPropertiesLoose(source, excluded) { + if (source == null) return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i; + for (i = 0; i < sourceKeys.length; i++) { + key = sourceKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + target[key] = source[key]; + } + return target; + } + function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); + } + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; + return arr2; + } + function _createForOfIteratorHelperLoose(o, allowArrayLike) { + var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; + if (it) return (it = it.call(o)).next.bind(it); + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + return function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + function _toPrimitive(input, hint) { + if (typeof input !== "object" || input === null) return input; + var prim = input[Symbol.toPrimitive]; + if (prim !== undefined) { + var res = prim.call(input, hint || "default"); + if (typeof res !== "object") return res; + throw new TypeError("@@toPrimitive must return a primitive value."); + } + return (hint === "string" ? String : Number)(input); + } + function _toPropertyKey(arg) { + var key = _toPrimitive(arg, "string"); + return typeof key === "symbol" ? key : String(key); + } + + // these aren't really private, but nor are they really useful to document + /** + * @private + */ + var LuxonError = /*#__PURE__*/function (_Error) { + _inheritsLoose(LuxonError, _Error); + function LuxonError() { + return _Error.apply(this, arguments) || this; + } + return LuxonError; + }( /*#__PURE__*/_wrapNativeSuper(Error)); + /** + * @private + */ + var InvalidDateTimeError = /*#__PURE__*/function (_LuxonError) { + _inheritsLoose(InvalidDateTimeError, _LuxonError); + function InvalidDateTimeError(reason) { + return _LuxonError.call(this, "Invalid DateTime: " + reason.toMessage()) || this; + } + return InvalidDateTimeError; + }(LuxonError); + + /** + * @private + */ + var InvalidIntervalError = /*#__PURE__*/function (_LuxonError2) { + _inheritsLoose(InvalidIntervalError, _LuxonError2); + function InvalidIntervalError(reason) { + return _LuxonError2.call(this, "Invalid Interval: " + reason.toMessage()) || this; + } + return InvalidIntervalError; + }(LuxonError); + + /** + * @private + */ + var InvalidDurationError = /*#__PURE__*/function (_LuxonError3) { + _inheritsLoose(InvalidDurationError, _LuxonError3); + function InvalidDurationError(reason) { + return _LuxonError3.call(this, "Invalid Duration: " + reason.toMessage()) || this; + } + return InvalidDurationError; + }(LuxonError); + + /** + * @private + */ + var ConflictingSpecificationError = /*#__PURE__*/function (_LuxonError4) { + _inheritsLoose(ConflictingSpecificationError, _LuxonError4); + function ConflictingSpecificationError() { + return _LuxonError4.apply(this, arguments) || this; + } + return ConflictingSpecificationError; + }(LuxonError); + + /** + * @private + */ + var InvalidUnitError = /*#__PURE__*/function (_LuxonError5) { + _inheritsLoose(InvalidUnitError, _LuxonError5); + function InvalidUnitError(unit) { + return _LuxonError5.call(this, "Invalid unit " + unit) || this; + } + return InvalidUnitError; + }(LuxonError); + + /** + * @private + */ + var InvalidArgumentError = /*#__PURE__*/function (_LuxonError6) { + _inheritsLoose(InvalidArgumentError, _LuxonError6); + function InvalidArgumentError() { + return _LuxonError6.apply(this, arguments) || this; + } + return InvalidArgumentError; + }(LuxonError); + + /** + * @private + */ + var ZoneIsAbstractError = /*#__PURE__*/function (_LuxonError7) { + _inheritsLoose(ZoneIsAbstractError, _LuxonError7); + function ZoneIsAbstractError() { + return _LuxonError7.call(this, "Zone is an abstract class") || this; + } + return ZoneIsAbstractError; + }(LuxonError); + + /** + * @private + */ + + var n = "numeric", + s = "short", + l = "long"; + var DATE_SHORT = { + year: n, + month: n, + day: n + }; + var DATE_MED = { + year: n, + month: s, + day: n + }; + var DATE_MED_WITH_WEEKDAY = { + year: n, + month: s, + day: n, + weekday: s + }; + var DATE_FULL = { + year: n, + month: l, + day: n + }; + var DATE_HUGE = { + year: n, + month: l, + day: n, + weekday: l + }; + var TIME_SIMPLE = { + hour: n, + minute: n + }; + var TIME_WITH_SECONDS = { + hour: n, + minute: n, + second: n + }; + var TIME_WITH_SHORT_OFFSET = { + hour: n, + minute: n, + second: n, + timeZoneName: s + }; + var TIME_WITH_LONG_OFFSET = { + hour: n, + minute: n, + second: n, + timeZoneName: l + }; + var TIME_24_SIMPLE = { + hour: n, + minute: n, + hourCycle: "h23" + }; + var TIME_24_WITH_SECONDS = { + hour: n, + minute: n, + second: n, + hourCycle: "h23" + }; + var TIME_24_WITH_SHORT_OFFSET = { + hour: n, + minute: n, + second: n, + hourCycle: "h23", + timeZoneName: s + }; + var TIME_24_WITH_LONG_OFFSET = { + hour: n, + minute: n, + second: n, + hourCycle: "h23", + timeZoneName: l + }; + var DATETIME_SHORT = { + year: n, + month: n, + day: n, + hour: n, + minute: n + }; + var DATETIME_SHORT_WITH_SECONDS = { + year: n, + month: n, + day: n, + hour: n, + minute: n, + second: n + }; + var DATETIME_MED = { + year: n, + month: s, + day: n, + hour: n, + minute: n + }; + var DATETIME_MED_WITH_SECONDS = { + year: n, + month: s, + day: n, + hour: n, + minute: n, + second: n + }; + var DATETIME_MED_WITH_WEEKDAY = { + year: n, + month: s, + day: n, + weekday: s, + hour: n, + minute: n + }; + var DATETIME_FULL = { + year: n, + month: l, + day: n, + hour: n, + minute: n, + timeZoneName: s + }; + var DATETIME_FULL_WITH_SECONDS = { + year: n, + month: l, + day: n, + hour: n, + minute: n, + second: n, + timeZoneName: s + }; + var DATETIME_HUGE = { + year: n, + month: l, + day: n, + weekday: l, + hour: n, + minute: n, + timeZoneName: l + }; + var DATETIME_HUGE_WITH_SECONDS = { + year: n, + month: l, + day: n, + weekday: l, + hour: n, + minute: n, + second: n, + timeZoneName: l + }; + + /** + * @interface + */ + var Zone = /*#__PURE__*/function () { + function Zone() {} + var _proto = Zone.prototype; + /** + * Returns the offset's common name (such as EST) at the specified timestamp + * @abstract + * @param {number} ts - Epoch milliseconds for which to get the name + * @param {Object} opts - Options to affect the format + * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'. + * @param {string} opts.locale - What locale to return the offset name in. + * @return {string} + */ + _proto.offsetName = function offsetName(ts, opts) { + throw new ZoneIsAbstractError(); + } + + /** + * Returns the offset's value as a string + * @abstract + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */; + _proto.formatOffset = function formatOffset(ts, format) { + throw new ZoneIsAbstractError(); + } + + /** + * Return the offset in minutes for this zone at the specified timestamp. + * @abstract + * @param {number} ts - Epoch milliseconds for which to compute the offset + * @return {number} + */; + _proto.offset = function offset(ts) { + throw new ZoneIsAbstractError(); + } + + /** + * Return whether this Zone is equal to another zone + * @abstract + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */; + _proto.equals = function equals(otherZone) { + throw new ZoneIsAbstractError(); + } + + /** + * Return whether this Zone is valid. + * @abstract + * @type {boolean} + */; + _createClass(Zone, [{ + key: "type", + get: + /** + * The type of zone + * @abstract + * @type {string} + */ + function get() { + throw new ZoneIsAbstractError(); + } + + /** + * The name of this zone. + * @abstract + * @type {string} + */ + }, { + key: "name", + get: function get() { + throw new ZoneIsAbstractError(); + } + + /** + * The IANA name of this zone. + * Defaults to `name` if not overwritten by a subclass. + * @abstract + * @type {string} + */ + }, { + key: "ianaName", + get: function get() { + return this.name; + } + + /** + * Returns whether the offset is known to be fixed for the whole year. + * @abstract + * @type {boolean} + */ + }, { + key: "isUniversal", + get: function get() { + throw new ZoneIsAbstractError(); + } + }, { + key: "isValid", + get: function get() { + throw new ZoneIsAbstractError(); + } + }]); + return Zone; + }(); + + var singleton$1 = null; + + /** + * Represents the local zone for this JavaScript environment. + * @implements {Zone} + */ + var SystemZone = /*#__PURE__*/function (_Zone) { + _inheritsLoose(SystemZone, _Zone); + function SystemZone() { + return _Zone.apply(this, arguments) || this; + } + var _proto = SystemZone.prototype; + /** @override **/ + _proto.offsetName = function offsetName(ts, _ref) { + var format = _ref.format, + locale = _ref.locale; + return parseZoneInfo(ts, format, locale); + } + + /** @override **/; + _proto.formatOffset = function formatOffset$1(ts, format) { + return formatOffset(this.offset(ts), format); + } + + /** @override **/; + _proto.offset = function offset(ts) { + return -new Date(ts).getTimezoneOffset(); + } + + /** @override **/; + _proto.equals = function equals(otherZone) { + return otherZone.type === "system"; + } + + /** @override **/; + _createClass(SystemZone, [{ + key: "type", + get: /** @override **/ + function get() { + return "system"; + } + + /** @override **/ + }, { + key: "name", + get: function get() { + return new Intl.DateTimeFormat().resolvedOptions().timeZone; + } + + /** @override **/ + }, { + key: "isUniversal", + get: function get() { + return false; + } + }, { + key: "isValid", + get: function get() { + return true; + } + }], [{ + key: "instance", + get: + /** + * Get a singleton instance of the local zone + * @return {SystemZone} + */ + function get() { + if (singleton$1 === null) { + singleton$1 = new SystemZone(); + } + return singleton$1; + } + }]); + return SystemZone; + }(Zone); + + var dtfCache = new Map(); + function makeDTF(zoneName) { + var dtf = dtfCache.get(zoneName); + if (dtf === undefined) { + dtf = new Intl.DateTimeFormat("en-US", { + hour12: false, + timeZone: zoneName, + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + era: "short" + }); + dtfCache.set(zoneName, dtf); + } + return dtf; + } + var typeToPos = { + year: 0, + month: 1, + day: 2, + era: 3, + hour: 4, + minute: 5, + second: 6 + }; + function hackyOffset(dtf, date) { + var formatted = dtf.format(date).replace(/\u200E/g, ""), + parsed = /(\d+)\/(\d+)\/(\d+) (AD|BC),? (\d+):(\d+):(\d+)/.exec(formatted), + fMonth = parsed[1], + fDay = parsed[2], + fYear = parsed[3], + fadOrBc = parsed[4], + fHour = parsed[5], + fMinute = parsed[6], + fSecond = parsed[7]; + return [fYear, fMonth, fDay, fadOrBc, fHour, fMinute, fSecond]; + } + function partsOffset(dtf, date) { + var formatted = dtf.formatToParts(date); + var filled = []; + for (var i = 0; i < formatted.length; i++) { + var _formatted$i = formatted[i], + type = _formatted$i.type, + value = _formatted$i.value; + var pos = typeToPos[type]; + if (type === "era") { + filled[pos] = value; + } else if (!isUndefined(pos)) { + filled[pos] = parseInt(value, 10); + } + } + return filled; + } + var ianaZoneCache = new Map(); + /** + * A zone identified by an IANA identifier, like America/New_York + * @implements {Zone} + */ + var IANAZone = /*#__PURE__*/function (_Zone) { + _inheritsLoose(IANAZone, _Zone); + /** + * @param {string} name - Zone name + * @return {IANAZone} + */ + IANAZone.create = function create(name) { + var zone = ianaZoneCache.get(name); + if (zone === undefined) { + ianaZoneCache.set(name, zone = new IANAZone(name)); + } + return zone; + } + + /** + * Reset local caches. Should only be necessary in testing scenarios. + * @return {void} + */; + IANAZone.resetCache = function resetCache() { + ianaZoneCache.clear(); + dtfCache.clear(); + } + + /** + * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that. + * @param {string} s - The string to check validity on + * @example IANAZone.isValidSpecifier("America/New_York") //=> true + * @example IANAZone.isValidSpecifier("Sport~~blorp") //=> false + * @deprecated For backward compatibility, this forwards to isValidZone, better use `isValidZone()` directly instead. + * @return {boolean} + */; + IANAZone.isValidSpecifier = function isValidSpecifier(s) { + return this.isValidZone(s); + } + + /** + * Returns whether the provided string identifies a real zone + * @param {string} zone - The string to check + * @example IANAZone.isValidZone("America/New_York") //=> true + * @example IANAZone.isValidZone("Fantasia/Castle") //=> false + * @example IANAZone.isValidZone("Sport~~blorp") //=> false + * @return {boolean} + */; + IANAZone.isValidZone = function isValidZone(zone) { + if (!zone) { + return false; + } + try { + new Intl.DateTimeFormat("en-US", { + timeZone: zone + }).format(); + return true; + } catch (e) { + return false; + } + }; + function IANAZone(name) { + var _this; + _this = _Zone.call(this) || this; + /** @private **/ + _this.zoneName = name; + /** @private **/ + _this.valid = IANAZone.isValidZone(name); + return _this; + } + + /** + * The type of zone. `iana` for all instances of `IANAZone`. + * @override + * @type {string} + */ + var _proto = IANAZone.prototype; + /** + * Returns the offset's common name (such as EST) at the specified timestamp + * @override + * @param {number} ts - Epoch milliseconds for which to get the name + * @param {Object} opts - Options to affect the format + * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'. + * @param {string} opts.locale - What locale to return the offset name in. + * @return {string} + */ + _proto.offsetName = function offsetName(ts, _ref) { + var format = _ref.format, + locale = _ref.locale; + return parseZoneInfo(ts, format, locale, this.name); + } + + /** + * Returns the offset's value as a string + * @override + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */; + _proto.formatOffset = function formatOffset$1(ts, format) { + return formatOffset(this.offset(ts), format); + } + + /** + * Return the offset in minutes for this zone at the specified timestamp. + * @override + * @param {number} ts - Epoch milliseconds for which to compute the offset + * @return {number} + */; + _proto.offset = function offset(ts) { + if (!this.valid) return NaN; + var date = new Date(ts); + if (isNaN(date)) return NaN; + var dtf = makeDTF(this.name); + var _ref2 = dtf.formatToParts ? partsOffset(dtf, date) : hackyOffset(dtf, date), + year = _ref2[0], + month = _ref2[1], + day = _ref2[2], + adOrBc = _ref2[3], + hour = _ref2[4], + minute = _ref2[5], + second = _ref2[6]; + if (adOrBc === "BC") { + year = -Math.abs(year) + 1; + } + + // because we're using hour12 and https://bugs.chromium.org/p/chromium/issues/detail?id=1025564&can=2&q=%2224%3A00%22%20datetimeformat + var adjustedHour = hour === 24 ? 0 : hour; + var asUTC = objToLocalTS({ + year: year, + month: month, + day: day, + hour: adjustedHour, + minute: minute, + second: second, + millisecond: 0 + }); + var asTS = +date; + var over = asTS % 1000; + asTS -= over >= 0 ? over : 1000 + over; + return (asUTC - asTS) / (60 * 1000); + } + + /** + * Return whether this Zone is equal to another zone + * @override + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */; + _proto.equals = function equals(otherZone) { + return otherZone.type === "iana" && otherZone.name === this.name; + } + + /** + * Return whether this Zone is valid. + * @override + * @type {boolean} + */; + _createClass(IANAZone, [{ + key: "type", + get: function get() { + return "iana"; + } + + /** + * The name of this zone (i.e. the IANA zone name). + * @override + * @type {string} + */ + }, { + key: "name", + get: function get() { + return this.zoneName; + } + + /** + * Returns whether the offset is known to be fixed for the whole year: + * Always returns false for all IANA zones. + * @override + * @type {boolean} + */ + }, { + key: "isUniversal", + get: function get() { + return false; + } + }, { + key: "isValid", + get: function get() { + return this.valid; + } + }]); + return IANAZone; + }(Zone); + + var _excluded = ["base"], + _excluded2 = ["padTo", "floor"]; + + // todo - remap caching + + var intlLFCache = {}; + function getCachedLF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var key = JSON.stringify([locString, opts]); + var dtf = intlLFCache[key]; + if (!dtf) { + dtf = new Intl.ListFormat(locString, opts); + intlLFCache[key] = dtf; + } + return dtf; + } + var intlDTCache = new Map(); + function getCachedDTF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var key = JSON.stringify([locString, opts]); + var dtf = intlDTCache.get(key); + if (dtf === undefined) { + dtf = new Intl.DateTimeFormat(locString, opts); + intlDTCache.set(key, dtf); + } + return dtf; + } + var intlNumCache = new Map(); + function getCachedINF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var key = JSON.stringify([locString, opts]); + var inf = intlNumCache.get(key); + if (inf === undefined) { + inf = new Intl.NumberFormat(locString, opts); + intlNumCache.set(key, inf); + } + return inf; + } + var intlRelCache = new Map(); + function getCachedRTF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var _opts = opts; + _opts.base; + var cacheKeyOpts = _objectWithoutPropertiesLoose(_opts, _excluded); // exclude `base` from the options + var key = JSON.stringify([locString, cacheKeyOpts]); + var inf = intlRelCache.get(key); + if (inf === undefined) { + inf = new Intl.RelativeTimeFormat(locString, opts); + intlRelCache.set(key, inf); + } + return inf; + } + var sysLocaleCache = null; + function systemLocale() { + if (sysLocaleCache) { + return sysLocaleCache; + } else { + sysLocaleCache = new Intl.DateTimeFormat().resolvedOptions().locale; + return sysLocaleCache; + } + } + var intlResolvedOptionsCache = new Map(); + function getCachedIntResolvedOptions(locString) { + var opts = intlResolvedOptionsCache.get(locString); + if (opts === undefined) { + opts = new Intl.DateTimeFormat(locString).resolvedOptions(); + intlResolvedOptionsCache.set(locString, opts); + } + return opts; + } + var weekInfoCache = new Map(); + function getCachedWeekInfo(locString) { + var data = weekInfoCache.get(locString); + if (!data) { + var locale = new Intl.Locale(locString); + // browsers currently implement this as a property, but spec says it should be a getter function + data = "getWeekInfo" in locale ? locale.getWeekInfo() : locale.weekInfo; + // minimalDays was removed from WeekInfo: https://github.com/tc39/proposal-intl-locale-info/issues/86 + if (!("minimalDays" in data)) { + data = _extends({}, fallbackWeekSettings, data); + } + weekInfoCache.set(locString, data); + } + return data; + } + function parseLocaleString(localeStr) { + // I really want to avoid writing a BCP 47 parser + // see, e.g. https://github.com/wooorm/bcp-47 + // Instead, we'll do this: + + // a) if the string has no -u extensions, just leave it alone + // b) if it does, use Intl to resolve everything + // c) if Intl fails, try again without the -u + + // private subtags and unicode subtags have ordering requirements, + // and we're not properly parsing this, so just strip out the + // private ones if they exist. + var xIndex = localeStr.indexOf("-x-"); + if (xIndex !== -1) { + localeStr = localeStr.substring(0, xIndex); + } + var uIndex = localeStr.indexOf("-u-"); + if (uIndex === -1) { + return [localeStr]; + } else { + var options; + var selectedStr; + try { + options = getCachedDTF(localeStr).resolvedOptions(); + selectedStr = localeStr; + } catch (e) { + var smaller = localeStr.substring(0, uIndex); + options = getCachedDTF(smaller).resolvedOptions(); + selectedStr = smaller; + } + var _options = options, + numberingSystem = _options.numberingSystem, + calendar = _options.calendar; + return [selectedStr, numberingSystem, calendar]; + } + } + function intlConfigString(localeStr, numberingSystem, outputCalendar) { + if (outputCalendar || numberingSystem) { + if (!localeStr.includes("-u-")) { + localeStr += "-u"; + } + if (outputCalendar) { + localeStr += "-ca-" + outputCalendar; + } + if (numberingSystem) { + localeStr += "-nu-" + numberingSystem; + } + return localeStr; + } else { + return localeStr; + } + } + function mapMonths(f) { + var ms = []; + for (var i = 1; i <= 12; i++) { + var dt = DateTime.utc(2009, i, 1); + ms.push(f(dt)); + } + return ms; + } + function mapWeekdays(f) { + var ms = []; + for (var i = 1; i <= 7; i++) { + var dt = DateTime.utc(2016, 11, 13 + i); + ms.push(f(dt)); + } + return ms; + } + function listStuff(loc, length, englishFn, intlFn) { + var mode = loc.listingMode(); + if (mode === "error") { + return null; + } else if (mode === "en") { + return englishFn(length); + } else { + return intlFn(length); + } + } + function supportsFastNumbers(loc) { + if (loc.numberingSystem && loc.numberingSystem !== "latn") { + return false; + } else { + return loc.numberingSystem === "latn" || !loc.locale || loc.locale.startsWith("en") || getCachedIntResolvedOptions(loc.locale).numberingSystem === "latn"; + } + } + + /** + * @private + */ + var PolyNumberFormatter = /*#__PURE__*/function () { + function PolyNumberFormatter(intl, forceSimple, opts) { + this.padTo = opts.padTo || 0; + this.floor = opts.floor || false; + opts.padTo; + opts.floor; + var otherOpts = _objectWithoutPropertiesLoose(opts, _excluded2); + if (!forceSimple || Object.keys(otherOpts).length > 0) { + var intlOpts = _extends({ + useGrouping: false + }, opts); + if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo; + this.inf = getCachedINF(intl, intlOpts); + } + } + var _proto = PolyNumberFormatter.prototype; + _proto.format = function format(i) { + if (this.inf) { + var fixed = this.floor ? Math.floor(i) : i; + return this.inf.format(fixed); + } else { + // to match the browser's numberformatter defaults + var _fixed = this.floor ? Math.floor(i) : roundTo(i, 3); + return padStart(_fixed, this.padTo); + } + }; + return PolyNumberFormatter; + }(); + /** + * @private + */ + var PolyDateFormatter = /*#__PURE__*/function () { + function PolyDateFormatter(dt, intl, opts) { + this.opts = opts; + this.originalZone = undefined; + var z = undefined; + if (this.opts.timeZone) { + // Don't apply any workarounds if a timeZone is explicitly provided in opts + this.dt = dt; + } else if (dt.zone.type === "fixed") { + // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like. + // That is why fixed-offset TZ is set to that unless it is: + // 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT. + // 2. Unsupported by the browser: + // - some do not support Etc/ + // - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata + var gmtOffset = -1 * (dt.offset / 60); + var offsetZ = gmtOffset >= 0 ? "Etc/GMT+" + gmtOffset : "Etc/GMT" + gmtOffset; + if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) { + z = offsetZ; + this.dt = dt; + } else { + // Not all fixed-offset zones like Etc/+4:30 are present in tzdata so + // we manually apply the offset and substitute the zone as needed. + z = "UTC"; + this.dt = dt.offset === 0 ? dt : dt.setZone("UTC").plus({ + minutes: dt.offset + }); + this.originalZone = dt.zone; + } + } else if (dt.zone.type === "system") { + this.dt = dt; + } else if (dt.zone.type === "iana") { + this.dt = dt; + z = dt.zone.name; + } else { + // Custom zones can have any offset / offsetName so we just manually + // apply the offset and substitute the zone as needed. + z = "UTC"; + this.dt = dt.setZone("UTC").plus({ + minutes: dt.offset + }); + this.originalZone = dt.zone; + } + var intlOpts = _extends({}, this.opts); + intlOpts.timeZone = intlOpts.timeZone || z; + this.dtf = getCachedDTF(intl, intlOpts); + } + var _proto2 = PolyDateFormatter.prototype; + _proto2.format = function format() { + if (this.originalZone) { + // If we have to substitute in the actual zone name, we have to use + // formatToParts so that the timezone can be replaced. + return this.formatToParts().map(function (_ref) { + var value = _ref.value; + return value; + }).join(""); + } + return this.dtf.format(this.dt.toJSDate()); + }; + _proto2.formatToParts = function formatToParts() { + var _this = this; + var parts = this.dtf.formatToParts(this.dt.toJSDate()); + if (this.originalZone) { + return parts.map(function (part) { + if (part.type === "timeZoneName") { + var offsetName = _this.originalZone.offsetName(_this.dt.ts, { + locale: _this.dt.locale, + format: _this.opts.timeZoneName + }); + return _extends({}, part, { + value: offsetName + }); + } else { + return part; + } + }); + } + return parts; + }; + _proto2.resolvedOptions = function resolvedOptions() { + return this.dtf.resolvedOptions(); + }; + return PolyDateFormatter; + }(); + /** + * @private + */ + var PolyRelFormatter = /*#__PURE__*/function () { + function PolyRelFormatter(intl, isEnglish, opts) { + this.opts = _extends({ + style: "long" + }, opts); + if (!isEnglish && hasRelative()) { + this.rtf = getCachedRTF(intl, opts); + } + } + var _proto3 = PolyRelFormatter.prototype; + _proto3.format = function format(count, unit) { + if (this.rtf) { + return this.rtf.format(count, unit); + } else { + return formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== "long"); + } + }; + _proto3.formatToParts = function formatToParts(count, unit) { + if (this.rtf) { + return this.rtf.formatToParts(count, unit); + } else { + return []; + } + }; + return PolyRelFormatter; + }(); + var fallbackWeekSettings = { + firstDay: 1, + minimalDays: 4, + weekend: [6, 7] + }; + + /** + * @private + */ + var Locale = /*#__PURE__*/function () { + Locale.fromOpts = function fromOpts(opts) { + return Locale.create(opts.locale, opts.numberingSystem, opts.outputCalendar, opts.weekSettings, opts.defaultToEN); + }; + Locale.create = function create(locale, numberingSystem, outputCalendar, weekSettings, defaultToEN) { + if (defaultToEN === void 0) { + defaultToEN = false; + } + var specifiedLocale = locale || Settings.defaultLocale; + // the system locale is useful for human-readable strings but annoying for parsing/formatting known formats + var localeR = specifiedLocale || (defaultToEN ? "en-US" : systemLocale()); + var numberingSystemR = numberingSystem || Settings.defaultNumberingSystem; + var outputCalendarR = outputCalendar || Settings.defaultOutputCalendar; + var weekSettingsR = validateWeekSettings(weekSettings) || Settings.defaultWeekSettings; + return new Locale(localeR, numberingSystemR, outputCalendarR, weekSettingsR, specifiedLocale); + }; + Locale.resetCache = function resetCache() { + sysLocaleCache = null; + intlDTCache.clear(); + intlNumCache.clear(); + intlRelCache.clear(); + intlResolvedOptionsCache.clear(); + weekInfoCache.clear(); + }; + Locale.fromObject = function fromObject(_temp) { + var _ref2 = _temp === void 0 ? {} : _temp, + locale = _ref2.locale, + numberingSystem = _ref2.numberingSystem, + outputCalendar = _ref2.outputCalendar, + weekSettings = _ref2.weekSettings; + return Locale.create(locale, numberingSystem, outputCalendar, weekSettings); + }; + function Locale(locale, numbering, outputCalendar, weekSettings, specifiedLocale) { + var _parseLocaleString = parseLocaleString(locale), + parsedLocale = _parseLocaleString[0], + parsedNumberingSystem = _parseLocaleString[1], + parsedOutputCalendar = _parseLocaleString[2]; + this.locale = parsedLocale; + this.numberingSystem = numbering || parsedNumberingSystem || null; + this.outputCalendar = outputCalendar || parsedOutputCalendar || null; + this.weekSettings = weekSettings; + this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar); + this.weekdaysCache = { + format: {}, + standalone: {} + }; + this.monthsCache = { + format: {}, + standalone: {} + }; + this.meridiemCache = null; + this.eraCache = {}; + this.specifiedLocale = specifiedLocale; + this.fastNumbersCached = null; + } + var _proto4 = Locale.prototype; + _proto4.listingMode = function listingMode() { + var isActuallyEn = this.isEnglish(); + var hasNoWeirdness = (this.numberingSystem === null || this.numberingSystem === "latn") && (this.outputCalendar === null || this.outputCalendar === "gregory"); + return isActuallyEn && hasNoWeirdness ? "en" : "intl"; + }; + _proto4.clone = function clone(alts) { + if (!alts || Object.getOwnPropertyNames(alts).length === 0) { + return this; + } else { + return Locale.create(alts.locale || this.specifiedLocale, alts.numberingSystem || this.numberingSystem, alts.outputCalendar || this.outputCalendar, validateWeekSettings(alts.weekSettings) || this.weekSettings, alts.defaultToEN || false); + } + }; + _proto4.redefaultToEN = function redefaultToEN(alts) { + if (alts === void 0) { + alts = {}; + } + return this.clone(_extends({}, alts, { + defaultToEN: true + })); + }; + _proto4.redefaultToSystem = function redefaultToSystem(alts) { + if (alts === void 0) { + alts = {}; + } + return this.clone(_extends({}, alts, { + defaultToEN: false + })); + }; + _proto4.months = function months$1(length, format) { + var _this2 = this; + if (format === void 0) { + format = false; + } + return listStuff(this, length, months, function () { + // Workaround for "ja" locale: formatToParts does not label all parts of the month + // as "month" and for this locale there is no difference between "format" and "non-format". + // As such, just use format() instead of formatToParts() and take the whole string + var monthSpecialCase = _this2.intl === "ja" || _this2.intl.startsWith("ja-"); + format &= !monthSpecialCase; + var intl = format ? { + month: length, + day: "numeric" + } : { + month: length + }, + formatStr = format ? "format" : "standalone"; + if (!_this2.monthsCache[formatStr][length]) { + var mapper = !monthSpecialCase ? function (dt) { + return _this2.extract(dt, intl, "month"); + } : function (dt) { + return _this2.dtFormatter(dt, intl).format(); + }; + _this2.monthsCache[formatStr][length] = mapMonths(mapper); + } + return _this2.monthsCache[formatStr][length]; + }); + }; + _proto4.weekdays = function weekdays$1(length, format) { + var _this3 = this; + if (format === void 0) { + format = false; + } + return listStuff(this, length, weekdays, function () { + var intl = format ? { + weekday: length, + year: "numeric", + month: "long", + day: "numeric" + } : { + weekday: length + }, + formatStr = format ? "format" : "standalone"; + if (!_this3.weekdaysCache[formatStr][length]) { + _this3.weekdaysCache[formatStr][length] = mapWeekdays(function (dt) { + return _this3.extract(dt, intl, "weekday"); + }); + } + return _this3.weekdaysCache[formatStr][length]; + }); + }; + _proto4.meridiems = function meridiems$1() { + var _this4 = this; + return listStuff(this, undefined, function () { + return meridiems; + }, function () { + // In theory there could be aribitrary day periods. We're gonna assume there are exactly two + // for AM and PM. This is probably wrong, but it's makes parsing way easier. + if (!_this4.meridiemCache) { + var intl = { + hour: "numeric", + hourCycle: "h12" + }; + _this4.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map(function (dt) { + return _this4.extract(dt, intl, "dayperiod"); + }); + } + return _this4.meridiemCache; + }); + }; + _proto4.eras = function eras$1(length) { + var _this5 = this; + return listStuff(this, length, eras, function () { + var intl = { + era: length + }; + + // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates + // to definitely enumerate them. + if (!_this5.eraCache[length]) { + _this5.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map(function (dt) { + return _this5.extract(dt, intl, "era"); + }); + } + return _this5.eraCache[length]; + }); + }; + _proto4.extract = function extract(dt, intlOpts, field) { + var df = this.dtFormatter(dt, intlOpts), + results = df.formatToParts(), + matching = results.find(function (m) { + return m.type.toLowerCase() === field; + }); + return matching ? matching.value : null; + }; + _proto4.numberFormatter = function numberFormatter(opts) { + if (opts === void 0) { + opts = {}; + } + // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave) + // (in contrast, the rest of the condition is used heavily) + return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts); + }; + _proto4.dtFormatter = function dtFormatter(dt, intlOpts) { + if (intlOpts === void 0) { + intlOpts = {}; + } + return new PolyDateFormatter(dt, this.intl, intlOpts); + }; + _proto4.relFormatter = function relFormatter(opts) { + if (opts === void 0) { + opts = {}; + } + return new PolyRelFormatter(this.intl, this.isEnglish(), opts); + }; + _proto4.listFormatter = function listFormatter(opts) { + if (opts === void 0) { + opts = {}; + } + return getCachedLF(this.intl, opts); + }; + _proto4.isEnglish = function isEnglish() { + return this.locale === "en" || this.locale.toLowerCase() === "en-us" || getCachedIntResolvedOptions(this.intl).locale.startsWith("en-us"); + }; + _proto4.getWeekSettings = function getWeekSettings() { + if (this.weekSettings) { + return this.weekSettings; + } else if (!hasLocaleWeekInfo()) { + return fallbackWeekSettings; + } else { + return getCachedWeekInfo(this.locale); + } + }; + _proto4.getStartOfWeek = function getStartOfWeek() { + return this.getWeekSettings().firstDay; + }; + _proto4.getMinDaysInFirstWeek = function getMinDaysInFirstWeek() { + return this.getWeekSettings().minimalDays; + }; + _proto4.getWeekendDays = function getWeekendDays() { + return this.getWeekSettings().weekend; + }; + _proto4.equals = function equals(other) { + return this.locale === other.locale && this.numberingSystem === other.numberingSystem && this.outputCalendar === other.outputCalendar; + }; + _proto4.toString = function toString() { + return "Locale(" + this.locale + ", " + this.numberingSystem + ", " + this.outputCalendar + ")"; + }; + _createClass(Locale, [{ + key: "fastNumbers", + get: function get() { + if (this.fastNumbersCached == null) { + this.fastNumbersCached = supportsFastNumbers(this); + } + return this.fastNumbersCached; + } + }]); + return Locale; + }(); + + var singleton = null; + + /** + * A zone with a fixed offset (meaning no DST) + * @implements {Zone} + */ + var FixedOffsetZone = /*#__PURE__*/function (_Zone) { + _inheritsLoose(FixedOffsetZone, _Zone); + /** + * Get an instance with a specified offset + * @param {number} offset - The offset in minutes + * @return {FixedOffsetZone} + */ + FixedOffsetZone.instance = function instance(offset) { + return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset); + } + + /** + * Get an instance of FixedOffsetZone from a UTC offset string, like "UTC+6" + * @param {string} s - The offset string to parse + * @example FixedOffsetZone.parseSpecifier("UTC+6") + * @example FixedOffsetZone.parseSpecifier("UTC+06") + * @example FixedOffsetZone.parseSpecifier("UTC-6:00") + * @return {FixedOffsetZone} + */; + FixedOffsetZone.parseSpecifier = function parseSpecifier(s) { + if (s) { + var r = s.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i); + if (r) { + return new FixedOffsetZone(signedOffset(r[1], r[2])); + } + } + return null; + }; + function FixedOffsetZone(offset) { + var _this; + _this = _Zone.call(this) || this; + /** @private **/ + _this.fixed = offset; + return _this; + } + + /** + * The type of zone. `fixed` for all instances of `FixedOffsetZone`. + * @override + * @type {string} + */ + var _proto = FixedOffsetZone.prototype; + /** + * Returns the offset's common name at the specified timestamp. + * + * For fixed offset zones this equals to the zone name. + * @override + */ + _proto.offsetName = function offsetName() { + return this.name; + } + + /** + * Returns the offset's value as a string + * @override + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */; + _proto.formatOffset = function formatOffset$1(ts, format) { + return formatOffset(this.fixed, format); + } + + /** + * Returns whether the offset is known to be fixed for the whole year: + * Always returns true for all fixed offset zones. + * @override + * @type {boolean} + */; + /** + * Return the offset in minutes for this zone at the specified timestamp. + * + * For fixed offset zones, this is constant and does not depend on a timestamp. + * @override + * @return {number} + */ + _proto.offset = function offset() { + return this.fixed; + } + + /** + * Return whether this Zone is equal to another zone (i.e. also fixed and same offset) + * @override + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */; + _proto.equals = function equals(otherZone) { + return otherZone.type === "fixed" && otherZone.fixed === this.fixed; + } + + /** + * Return whether this Zone is valid: + * All fixed offset zones are valid. + * @override + * @type {boolean} + */; + _createClass(FixedOffsetZone, [{ + key: "type", + get: function get() { + return "fixed"; + } + + /** + * The name of this zone. + * All fixed zones' names always start with "UTC" (plus optional offset) + * @override + * @type {string} + */ + }, { + key: "name", + get: function get() { + return this.fixed === 0 ? "UTC" : "UTC" + formatOffset(this.fixed, "narrow"); + } + + /** + * The IANA name of this zone, i.e. `Etc/UTC` or `Etc/GMT+/-nn` + * + * @override + * @type {string} + */ + }, { + key: "ianaName", + get: function get() { + if (this.fixed === 0) { + return "Etc/UTC"; + } else { + return "Etc/GMT" + formatOffset(-this.fixed, "narrow"); + } + } + }, { + key: "isUniversal", + get: function get() { + return true; + } + }, { + key: "isValid", + get: function get() { + return true; + } + }], [{ + key: "utcInstance", + get: + /** + * Get a singleton instance of UTC + * @return {FixedOffsetZone} + */ + function get() { + if (singleton === null) { + singleton = new FixedOffsetZone(0); + } + return singleton; + } + }]); + return FixedOffsetZone; + }(Zone); + + /** + * A zone that failed to parse. You should never need to instantiate this. + * @implements {Zone} + */ + var InvalidZone = /*#__PURE__*/function (_Zone) { + _inheritsLoose(InvalidZone, _Zone); + function InvalidZone(zoneName) { + var _this; + _this = _Zone.call(this) || this; + /** @private */ + _this.zoneName = zoneName; + return _this; + } + + /** @override **/ + var _proto = InvalidZone.prototype; + /** @override **/ + _proto.offsetName = function offsetName() { + return null; + } + + /** @override **/; + _proto.formatOffset = function formatOffset() { + return ""; + } + + /** @override **/; + _proto.offset = function offset() { + return NaN; + } + + /** @override **/; + _proto.equals = function equals() { + return false; + } + + /** @override **/; + _createClass(InvalidZone, [{ + key: "type", + get: function get() { + return "invalid"; + } + + /** @override **/ + }, { + key: "name", + get: function get() { + return this.zoneName; + } + + /** @override **/ + }, { + key: "isUniversal", + get: function get() { + return false; + } + }, { + key: "isValid", + get: function get() { + return false; + } + }]); + return InvalidZone; + }(Zone); + + /** + * @private + */ + function normalizeZone(input, defaultZone) { + if (isUndefined(input) || input === null) { + return defaultZone; + } else if (input instanceof Zone) { + return input; + } else if (isString(input)) { + var lowered = input.toLowerCase(); + if (lowered === "default") return defaultZone;else if (lowered === "local" || lowered === "system") return SystemZone.instance;else if (lowered === "utc" || lowered === "gmt") return FixedOffsetZone.utcInstance;else return FixedOffsetZone.parseSpecifier(lowered) || IANAZone.create(input); + } else if (isNumber(input)) { + return FixedOffsetZone.instance(input); + } else if (typeof input === "object" && "offset" in input && typeof input.offset === "function") { + // This is dumb, but the instanceof check above doesn't seem to really work + // so we're duck checking it + return input; + } else { + return new InvalidZone(input); + } + } + + var numberingSystems = { + arab: "[\u0660-\u0669]", + arabext: "[\u06F0-\u06F9]", + bali: "[\u1B50-\u1B59]", + beng: "[\u09E6-\u09EF]", + deva: "[\u0966-\u096F]", + fullwide: "[\uFF10-\uFF19]", + gujr: "[\u0AE6-\u0AEF]", + hanidec: "[〇|一|二|三|四|五|六|七|八|九]", + khmr: "[\u17E0-\u17E9]", + knda: "[\u0CE6-\u0CEF]", + laoo: "[\u0ED0-\u0ED9]", + limb: "[\u1946-\u194F]", + mlym: "[\u0D66-\u0D6F]", + mong: "[\u1810-\u1819]", + mymr: "[\u1040-\u1049]", + orya: "[\u0B66-\u0B6F]", + tamldec: "[\u0BE6-\u0BEF]", + telu: "[\u0C66-\u0C6F]", + thai: "[\u0E50-\u0E59]", + tibt: "[\u0F20-\u0F29]", + latn: "\\d" + }; + var numberingSystemsUTF16 = { + arab: [1632, 1641], + arabext: [1776, 1785], + bali: [6992, 7001], + beng: [2534, 2543], + deva: [2406, 2415], + fullwide: [65296, 65303], + gujr: [2790, 2799], + khmr: [6112, 6121], + knda: [3302, 3311], + laoo: [3792, 3801], + limb: [6470, 6479], + mlym: [3430, 3439], + mong: [6160, 6169], + mymr: [4160, 4169], + orya: [2918, 2927], + tamldec: [3046, 3055], + telu: [3174, 3183], + thai: [3664, 3673], + tibt: [3872, 3881] + }; + var hanidecChars = numberingSystems.hanidec.replace(/[\[|\]]/g, "").split(""); + function parseDigits(str) { + var value = parseInt(str, 10); + if (isNaN(value)) { + value = ""; + for (var i = 0; i < str.length; i++) { + var code = str.charCodeAt(i); + if (str[i].search(numberingSystems.hanidec) !== -1) { + value += hanidecChars.indexOf(str[i]); + } else { + for (var key in numberingSystemsUTF16) { + var _numberingSystemsUTF = numberingSystemsUTF16[key], + min = _numberingSystemsUTF[0], + max = _numberingSystemsUTF[1]; + if (code >= min && code <= max) { + value += code - min; + } + } + } + } + return parseInt(value, 10); + } else { + return value; + } + } + + // cache of {numberingSystem: {append: regex}} + var digitRegexCache = new Map(); + function resetDigitRegexCache() { + digitRegexCache.clear(); + } + function digitRegex(_ref, append) { + var numberingSystem = _ref.numberingSystem; + if (append === void 0) { + append = ""; + } + var ns = numberingSystem || "latn"; + var appendCache = digitRegexCache.get(ns); + if (appendCache === undefined) { + appendCache = new Map(); + digitRegexCache.set(ns, appendCache); + } + var regex = appendCache.get(append); + if (regex === undefined) { + regex = new RegExp("" + numberingSystems[ns] + append); + appendCache.set(append, regex); + } + return regex; + } + + var now = function now() { + return Date.now(); + }, + defaultZone = "system", + defaultLocale = null, + defaultNumberingSystem = null, + defaultOutputCalendar = null, + twoDigitCutoffYear = 60, + throwOnInvalid, + defaultWeekSettings = null; + + /** + * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here. + */ + var Settings = /*#__PURE__*/function () { + function Settings() {} + /** + * Reset Luxon's global caches. Should only be necessary in testing scenarios. + * @return {void} + */ + Settings.resetCaches = function resetCaches() { + Locale.resetCache(); + IANAZone.resetCache(); + DateTime.resetCache(); + resetDigitRegexCache(); + }; + _createClass(Settings, null, [{ + key: "now", + get: + /** + * Get the callback for returning the current timestamp. + * @type {function} + */ + function get() { + return now; + } + + /** + * Set the callback for returning the current timestamp. + * The function should return a number, which will be interpreted as an Epoch millisecond count + * @type {function} + * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future + * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time + */, + set: function set(n) { + now = n; + } + + /** + * Set the default time zone to create DateTimes in. Does not affect existing instances. + * Use the value "system" to reset this value to the system's time zone. + * @type {string} + */ + }, { + key: "defaultZone", + get: + /** + * Get the default time zone object currently used to create DateTimes. Does not affect existing instances. + * The default value is the system's time zone (the one set on the machine that runs this code). + * @type {Zone} + */ + function get() { + return normalizeZone(defaultZone, SystemZone.instance); + } + + /** + * Get the default locale to create DateTimes with. Does not affect existing instances. + * @type {string} + */, + set: function set(zone) { + defaultZone = zone; + } + }, { + key: "defaultLocale", + get: function get() { + return defaultLocale; + } + + /** + * Set the default locale to create DateTimes with. Does not affect existing instances. + * @type {string} + */, + set: function set(locale) { + defaultLocale = locale; + } + + /** + * Get the default numbering system to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + }, { + key: "defaultNumberingSystem", + get: function get() { + return defaultNumberingSystem; + } + + /** + * Set the default numbering system to create DateTimes with. Does not affect existing instances. + * @type {string} + */, + set: function set(numberingSystem) { + defaultNumberingSystem = numberingSystem; + } + + /** + * Get the default output calendar to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + }, { + key: "defaultOutputCalendar", + get: function get() { + return defaultOutputCalendar; + } + + /** + * Set the default output calendar to create DateTimes with. Does not affect existing instances. + * @type {string} + */, + set: function set(outputCalendar) { + defaultOutputCalendar = outputCalendar; + } + + /** + * @typedef {Object} WeekSettings + * @property {number} firstDay + * @property {number} minimalDays + * @property {number[]} weekend + */ + + /** + * @return {WeekSettings|null} + */ + }, { + key: "defaultWeekSettings", + get: function get() { + return defaultWeekSettings; + } + + /** + * Allows overriding the default locale week settings, i.e. the start of the week, the weekend and + * how many days are required in the first week of a year. + * Does not affect existing instances. + * + * @param {WeekSettings|null} weekSettings + */, + set: function set(weekSettings) { + defaultWeekSettings = validateWeekSettings(weekSettings); + } + + /** + * Get the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx. + * @type {number} + */ + }, { + key: "twoDigitCutoffYear", + get: function get() { + return twoDigitCutoffYear; + } + + /** + * Set the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx. + * @type {number} + * @example Settings.twoDigitCutoffYear = 0 // all 'yy' are interpreted as 20th century + * @example Settings.twoDigitCutoffYear = 99 // all 'yy' are interpreted as 21st century + * @example Settings.twoDigitCutoffYear = 50 // '49' -> 2049; '50' -> 1950 + * @example Settings.twoDigitCutoffYear = 1950 // interpreted as 50 + * @example Settings.twoDigitCutoffYear = 2050 // ALSO interpreted as 50 + */, + set: function set(cutoffYear) { + twoDigitCutoffYear = cutoffYear % 100; + } + + /** + * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals + * @type {boolean} + */ + }, { + key: "throwOnInvalid", + get: function get() { + return throwOnInvalid; + } + + /** + * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals + * @type {boolean} + */, + set: function set(t) { + throwOnInvalid = t; + } + }]); + return Settings; + }(); + + var Invalid = /*#__PURE__*/function () { + function Invalid(reason, explanation) { + this.reason = reason; + this.explanation = explanation; + } + var _proto = Invalid.prototype; + _proto.toMessage = function toMessage() { + if (this.explanation) { + return this.reason + ": " + this.explanation; + } else { + return this.reason; + } + }; + return Invalid; + }(); + + var nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334], + leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335]; + function unitOutOfRange(unit, value) { + return new Invalid("unit out of range", "you specified " + value + " (of type " + typeof value + ") as a " + unit + ", which is invalid"); + } + function dayOfWeek(year, month, day) { + var d = new Date(Date.UTC(year, month - 1, day)); + if (year < 100 && year >= 0) { + d.setUTCFullYear(d.getUTCFullYear() - 1900); + } + var js = d.getUTCDay(); + return js === 0 ? 7 : js; + } + function computeOrdinal(year, month, day) { + return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1]; + } + function uncomputeOrdinal(year, ordinal) { + var table = isLeapYear(year) ? leapLadder : nonLeapLadder, + month0 = table.findIndex(function (i) { + return i < ordinal; + }), + day = ordinal - table[month0]; + return { + month: month0 + 1, + day: day + }; + } + function isoWeekdayToLocal(isoWeekday, startOfWeek) { + return (isoWeekday - startOfWeek + 7) % 7 + 1; + } + + /** + * @private + */ + + function gregorianToWeek(gregObj, minDaysInFirstWeek, startOfWeek) { + if (minDaysInFirstWeek === void 0) { + minDaysInFirstWeek = 4; + } + if (startOfWeek === void 0) { + startOfWeek = 1; + } + var year = gregObj.year, + month = gregObj.month, + day = gregObj.day, + ordinal = computeOrdinal(year, month, day), + weekday = isoWeekdayToLocal(dayOfWeek(year, month, day), startOfWeek); + var weekNumber = Math.floor((ordinal - weekday + 14 - minDaysInFirstWeek) / 7), + weekYear; + if (weekNumber < 1) { + weekYear = year - 1; + weekNumber = weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek); + } else if (weekNumber > weeksInWeekYear(year, minDaysInFirstWeek, startOfWeek)) { + weekYear = year + 1; + weekNumber = 1; + } else { + weekYear = year; + } + return _extends({ + weekYear: weekYear, + weekNumber: weekNumber, + weekday: weekday + }, timeObject(gregObj)); + } + function weekToGregorian(weekData, minDaysInFirstWeek, startOfWeek) { + if (minDaysInFirstWeek === void 0) { + minDaysInFirstWeek = 4; + } + if (startOfWeek === void 0) { + startOfWeek = 1; + } + var weekYear = weekData.weekYear, + weekNumber = weekData.weekNumber, + weekday = weekData.weekday, + weekdayOfJan4 = isoWeekdayToLocal(dayOfWeek(weekYear, 1, minDaysInFirstWeek), startOfWeek), + yearInDays = daysInYear(weekYear); + var ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 7 + minDaysInFirstWeek, + year; + if (ordinal < 1) { + year = weekYear - 1; + ordinal += daysInYear(year); + } else if (ordinal > yearInDays) { + year = weekYear + 1; + ordinal -= daysInYear(weekYear); + } else { + year = weekYear; + } + var _uncomputeOrdinal = uncomputeOrdinal(year, ordinal), + month = _uncomputeOrdinal.month, + day = _uncomputeOrdinal.day; + return _extends({ + year: year, + month: month, + day: day + }, timeObject(weekData)); + } + function gregorianToOrdinal(gregData) { + var year = gregData.year, + month = gregData.month, + day = gregData.day; + var ordinal = computeOrdinal(year, month, day); + return _extends({ + year: year, + ordinal: ordinal + }, timeObject(gregData)); + } + function ordinalToGregorian(ordinalData) { + var year = ordinalData.year, + ordinal = ordinalData.ordinal; + var _uncomputeOrdinal2 = uncomputeOrdinal(year, ordinal), + month = _uncomputeOrdinal2.month, + day = _uncomputeOrdinal2.day; + return _extends({ + year: year, + month: month, + day: day + }, timeObject(ordinalData)); + } + + /** + * Check if local week units like localWeekday are used in obj. + * If so, validates that they are not mixed with ISO week units and then copies them to the normal week unit properties. + * Modifies obj in-place! + * @param obj the object values + */ + function usesLocalWeekValues(obj, loc) { + var hasLocaleWeekData = !isUndefined(obj.localWeekday) || !isUndefined(obj.localWeekNumber) || !isUndefined(obj.localWeekYear); + if (hasLocaleWeekData) { + var hasIsoWeekData = !isUndefined(obj.weekday) || !isUndefined(obj.weekNumber) || !isUndefined(obj.weekYear); + if (hasIsoWeekData) { + throw new ConflictingSpecificationError("Cannot mix locale-based week fields with ISO-based week fields"); + } + if (!isUndefined(obj.localWeekday)) obj.weekday = obj.localWeekday; + if (!isUndefined(obj.localWeekNumber)) obj.weekNumber = obj.localWeekNumber; + if (!isUndefined(obj.localWeekYear)) obj.weekYear = obj.localWeekYear; + delete obj.localWeekday; + delete obj.localWeekNumber; + delete obj.localWeekYear; + return { + minDaysInFirstWeek: loc.getMinDaysInFirstWeek(), + startOfWeek: loc.getStartOfWeek() + }; + } else { + return { + minDaysInFirstWeek: 4, + startOfWeek: 1 + }; + } + } + function hasInvalidWeekData(obj, minDaysInFirstWeek, startOfWeek) { + if (minDaysInFirstWeek === void 0) { + minDaysInFirstWeek = 4; + } + if (startOfWeek === void 0) { + startOfWeek = 1; + } + var validYear = isInteger(obj.weekYear), + validWeek = integerBetween(obj.weekNumber, 1, weeksInWeekYear(obj.weekYear, minDaysInFirstWeek, startOfWeek)), + validWeekday = integerBetween(obj.weekday, 1, 7); + if (!validYear) { + return unitOutOfRange("weekYear", obj.weekYear); + } else if (!validWeek) { + return unitOutOfRange("week", obj.weekNumber); + } else if (!validWeekday) { + return unitOutOfRange("weekday", obj.weekday); + } else return false; + } + function hasInvalidOrdinalData(obj) { + var validYear = isInteger(obj.year), + validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year)); + if (!validYear) { + return unitOutOfRange("year", obj.year); + } else if (!validOrdinal) { + return unitOutOfRange("ordinal", obj.ordinal); + } else return false; + } + function hasInvalidGregorianData(obj) { + var validYear = isInteger(obj.year), + validMonth = integerBetween(obj.month, 1, 12), + validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month)); + if (!validYear) { + return unitOutOfRange("year", obj.year); + } else if (!validMonth) { + return unitOutOfRange("month", obj.month); + } else if (!validDay) { + return unitOutOfRange("day", obj.day); + } else return false; + } + function hasInvalidTimeData(obj) { + var hour = obj.hour, + minute = obj.minute, + second = obj.second, + millisecond = obj.millisecond; + var validHour = integerBetween(hour, 0, 23) || hour === 24 && minute === 0 && second === 0 && millisecond === 0, + validMinute = integerBetween(minute, 0, 59), + validSecond = integerBetween(second, 0, 59), + validMillisecond = integerBetween(millisecond, 0, 999); + if (!validHour) { + return unitOutOfRange("hour", hour); + } else if (!validMinute) { + return unitOutOfRange("minute", minute); + } else if (!validSecond) { + return unitOutOfRange("second", second); + } else if (!validMillisecond) { + return unitOutOfRange("millisecond", millisecond); + } else return false; + } + + /** + * @private + */ + + // TYPES + + function isUndefined(o) { + return typeof o === "undefined"; + } + function isNumber(o) { + return typeof o === "number"; + } + function isInteger(o) { + return typeof o === "number" && o % 1 === 0; + } + function isString(o) { + return typeof o === "string"; + } + function isDate(o) { + return Object.prototype.toString.call(o) === "[object Date]"; + } + + // CAPABILITIES + + function hasRelative() { + try { + return typeof Intl !== "undefined" && !!Intl.RelativeTimeFormat; + } catch (e) { + return false; + } + } + function hasLocaleWeekInfo() { + try { + return typeof Intl !== "undefined" && !!Intl.Locale && ("weekInfo" in Intl.Locale.prototype || "getWeekInfo" in Intl.Locale.prototype); + } catch (e) { + return false; + } + } + + // OBJECTS AND ARRAYS + + function maybeArray(thing) { + return Array.isArray(thing) ? thing : [thing]; + } + function bestBy(arr, by, compare) { + if (arr.length === 0) { + return undefined; + } + return arr.reduce(function (best, next) { + var pair = [by(next), next]; + if (!best) { + return pair; + } else if (compare(best[0], pair[0]) === best[0]) { + return best; + } else { + return pair; + } + }, null)[1]; + } + function pick(obj, keys) { + return keys.reduce(function (a, k) { + a[k] = obj[k]; + return a; + }, {}); + } + function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); + } + function validateWeekSettings(settings) { + if (settings == null) { + return null; + } else if (typeof settings !== "object") { + throw new InvalidArgumentError("Week settings must be an object"); + } else { + if (!integerBetween(settings.firstDay, 1, 7) || !integerBetween(settings.minimalDays, 1, 7) || !Array.isArray(settings.weekend) || settings.weekend.some(function (v) { + return !integerBetween(v, 1, 7); + })) { + throw new InvalidArgumentError("Invalid week settings"); + } + return { + firstDay: settings.firstDay, + minimalDays: settings.minimalDays, + weekend: Array.from(settings.weekend) + }; + } + } + + // NUMBERS AND STRINGS + + function integerBetween(thing, bottom, top) { + return isInteger(thing) && thing >= bottom && thing <= top; + } + + // x % n but takes the sign of n instead of x + function floorMod(x, n) { + return x - n * Math.floor(x / n); + } + function padStart(input, n) { + if (n === void 0) { + n = 2; + } + var isNeg = input < 0; + var padded; + if (isNeg) { + padded = "-" + ("" + -input).padStart(n, "0"); + } else { + padded = ("" + input).padStart(n, "0"); + } + return padded; + } + function parseInteger(string) { + if (isUndefined(string) || string === null || string === "") { + return undefined; + } else { + return parseInt(string, 10); + } + } + function parseFloating(string) { + if (isUndefined(string) || string === null || string === "") { + return undefined; + } else { + return parseFloat(string); + } + } + function parseMillis(fraction) { + // Return undefined (instead of 0) in these cases, where fraction is not set + if (isUndefined(fraction) || fraction === null || fraction === "") { + return undefined; + } else { + var f = parseFloat("0." + fraction) * 1000; + return Math.floor(f); + } + } + function roundTo(number, digits, rounding) { + if (rounding === void 0) { + rounding = "round"; + } + var factor = Math.pow(10, digits); + switch (rounding) { + case "expand": + return number > 0 ? Math.ceil(number * factor) / factor : Math.floor(number * factor) / factor; + case "trunc": + return Math.trunc(number * factor) / factor; + case "round": + return Math.round(number * factor) / factor; + case "floor": + return Math.floor(number * factor) / factor; + case "ceil": + return Math.ceil(number * factor) / factor; + default: + throw new RangeError("Value rounding " + rounding + " is out of range"); + } + } + + // DATE BASICS + + function isLeapYear(year) { + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + } + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } + function daysInMonth(year, month) { + var modMonth = floorMod(month - 1, 12) + 1, + modYear = year + (month - modMonth) / 12; + if (modMonth === 2) { + return isLeapYear(modYear) ? 29 : 28; + } else { + return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1]; + } + } + + // convert a calendar object to a local timestamp (epoch, but with the offset baked in) + function objToLocalTS(obj) { + var d = Date.UTC(obj.year, obj.month - 1, obj.day, obj.hour, obj.minute, obj.second, obj.millisecond); + + // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that + if (obj.year < 100 && obj.year >= 0) { + d = new Date(d); + // set the month and day again, this is necessary because year 2000 is a leap year, but year 100 is not + // so if obj.year is in 99, but obj.day makes it roll over into year 100, + // the calculations done by Date.UTC are using year 2000 - which is incorrect + d.setUTCFullYear(obj.year, obj.month - 1, obj.day); + } + return +d; + } + + // adapted from moment.js: https://github.com/moment/moment/blob/000ac1800e620f770f4eb31b5ae908f6167b0ab2/src/lib/units/week-calendar-utils.js + function firstWeekOffset(year, minDaysInFirstWeek, startOfWeek) { + var fwdlw = isoWeekdayToLocal(dayOfWeek(year, 1, minDaysInFirstWeek), startOfWeek); + return -fwdlw + minDaysInFirstWeek - 1; + } + function weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek) { + if (minDaysInFirstWeek === void 0) { + minDaysInFirstWeek = 4; + } + if (startOfWeek === void 0) { + startOfWeek = 1; + } + var weekOffset = firstWeekOffset(weekYear, minDaysInFirstWeek, startOfWeek); + var weekOffsetNext = firstWeekOffset(weekYear + 1, minDaysInFirstWeek, startOfWeek); + return (daysInYear(weekYear) - weekOffset + weekOffsetNext) / 7; + } + function untruncateYear(year) { + if (year > 99) { + return year; + } else return year > Settings.twoDigitCutoffYear ? 1900 + year : 2000 + year; + } + + // PARSING + + function parseZoneInfo(ts, offsetFormat, locale, timeZone) { + if (timeZone === void 0) { + timeZone = null; + } + var date = new Date(ts), + intlOpts = { + hourCycle: "h23", + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit" + }; + if (timeZone) { + intlOpts.timeZone = timeZone; + } + var modified = _extends({ + timeZoneName: offsetFormat + }, intlOpts); + var parsed = new Intl.DateTimeFormat(locale, modified).formatToParts(date).find(function (m) { + return m.type.toLowerCase() === "timezonename"; + }); + return parsed ? parsed.value : null; + } + + // signedOffset('-5', '30') -> -330 + function signedOffset(offHourStr, offMinuteStr) { + var offHour = parseInt(offHourStr, 10); + + // don't || this because we want to preserve -0 + if (Number.isNaN(offHour)) { + offHour = 0; + } + var offMin = parseInt(offMinuteStr, 10) || 0, + offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin; + return offHour * 60 + offMinSigned; + } + + // COERCION + + function asNumber(value) { + var numericValue = Number(value); + if (typeof value === "boolean" || value === "" || !Number.isFinite(numericValue)) throw new InvalidArgumentError("Invalid unit value " + value); + return numericValue; + } + function normalizeObject(obj, normalizer) { + var normalized = {}; + for (var u in obj) { + if (hasOwnProperty(obj, u)) { + var v = obj[u]; + if (v === undefined || v === null) continue; + normalized[normalizer(u)] = asNumber(v); + } + } + return normalized; + } + + /** + * Returns the offset's value as a string + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */ + function formatOffset(offset, format) { + var hours = Math.trunc(Math.abs(offset / 60)), + minutes = Math.trunc(Math.abs(offset % 60)), + sign = offset >= 0 ? "+" : "-"; + switch (format) { + case "short": + return "" + sign + padStart(hours, 2) + ":" + padStart(minutes, 2); + case "narrow": + return "" + sign + hours + (minutes > 0 ? ":" + minutes : ""); + case "techie": + return "" + sign + padStart(hours, 2) + padStart(minutes, 2); + default: + throw new RangeError("Value format " + format + " is out of range for property format"); + } + } + function timeObject(obj) { + return pick(obj, ["hour", "minute", "second", "millisecond"]); + } + + /** + * @private + */ + + var monthsLong = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; + var monthsShort = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + var monthsNarrow = ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"]; + function months(length) { + switch (length) { + case "narrow": + return [].concat(monthsNarrow); + case "short": + return [].concat(monthsShort); + case "long": + return [].concat(monthsLong); + case "numeric": + return ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"]; + case "2-digit": + return ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]; + default: + return null; + } + } + var weekdaysLong = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]; + var weekdaysShort = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; + var weekdaysNarrow = ["M", "T", "W", "T", "F", "S", "S"]; + function weekdays(length) { + switch (length) { + case "narrow": + return [].concat(weekdaysNarrow); + case "short": + return [].concat(weekdaysShort); + case "long": + return [].concat(weekdaysLong); + case "numeric": + return ["1", "2", "3", "4", "5", "6", "7"]; + default: + return null; + } + } + var meridiems = ["AM", "PM"]; + var erasLong = ["Before Christ", "Anno Domini"]; + var erasShort = ["BC", "AD"]; + var erasNarrow = ["B", "A"]; + function eras(length) { + switch (length) { + case "narrow": + return [].concat(erasNarrow); + case "short": + return [].concat(erasShort); + case "long": + return [].concat(erasLong); + default: + return null; + } + } + function meridiemForDateTime(dt) { + return meridiems[dt.hour < 12 ? 0 : 1]; + } + function weekdayForDateTime(dt, length) { + return weekdays(length)[dt.weekday - 1]; + } + function monthForDateTime(dt, length) { + return months(length)[dt.month - 1]; + } + function eraForDateTime(dt, length) { + return eras(length)[dt.year < 0 ? 0 : 1]; + } + function formatRelativeTime(unit, count, numeric, narrow) { + if (numeric === void 0) { + numeric = "always"; + } + if (narrow === void 0) { + narrow = false; + } + var units = { + years: ["year", "yr."], + quarters: ["quarter", "qtr."], + months: ["month", "mo."], + weeks: ["week", "wk."], + days: ["day", "day", "days"], + hours: ["hour", "hr."], + minutes: ["minute", "min."], + seconds: ["second", "sec."] + }; + var lastable = ["hours", "minutes", "seconds"].indexOf(unit) === -1; + if (numeric === "auto" && lastable) { + var isDay = unit === "days"; + switch (count) { + case 1: + return isDay ? "tomorrow" : "next " + units[unit][0]; + case -1: + return isDay ? "yesterday" : "last " + units[unit][0]; + case 0: + return isDay ? "today" : "this " + units[unit][0]; + } + } + + var isInPast = Object.is(count, -0) || count < 0, + fmtValue = Math.abs(count), + singular = fmtValue === 1, + lilUnits = units[unit], + fmtUnit = narrow ? singular ? lilUnits[1] : lilUnits[2] || lilUnits[1] : singular ? units[unit][0] : unit; + return isInPast ? fmtValue + " " + fmtUnit + " ago" : "in " + fmtValue + " " + fmtUnit; + } + + function stringifyTokens(splits, tokenToString) { + var s = ""; + for (var _iterator = _createForOfIteratorHelperLoose(splits), _step; !(_step = _iterator()).done;) { + var token = _step.value; + if (token.literal) { + s += token.val; + } else { + s += tokenToString(token.val); + } + } + return s; + } + var _macroTokenToFormatOpts = { + D: DATE_SHORT, + DD: DATE_MED, + DDD: DATE_FULL, + DDDD: DATE_HUGE, + t: TIME_SIMPLE, + tt: TIME_WITH_SECONDS, + ttt: TIME_WITH_SHORT_OFFSET, + tttt: TIME_WITH_LONG_OFFSET, + T: TIME_24_SIMPLE, + TT: TIME_24_WITH_SECONDS, + TTT: TIME_24_WITH_SHORT_OFFSET, + TTTT: TIME_24_WITH_LONG_OFFSET, + f: DATETIME_SHORT, + ff: DATETIME_MED, + fff: DATETIME_FULL, + ffff: DATETIME_HUGE, + F: DATETIME_SHORT_WITH_SECONDS, + FF: DATETIME_MED_WITH_SECONDS, + FFF: DATETIME_FULL_WITH_SECONDS, + FFFF: DATETIME_HUGE_WITH_SECONDS + }; + + /** + * @private + */ + var Formatter = /*#__PURE__*/function () { + Formatter.create = function create(locale, opts) { + if (opts === void 0) { + opts = {}; + } + return new Formatter(locale, opts); + }; + Formatter.parseFormat = function parseFormat(fmt) { + // white-space is always considered a literal in user-provided formats + // the " " token has a special meaning (see unitForToken) + + var current = null, + currentFull = "", + bracketed = false; + var splits = []; + for (var i = 0; i < fmt.length; i++) { + var c = fmt.charAt(i); + if (c === "'") { + // turn '' into a literal signal quote instead of just skipping the empty literal + if (currentFull.length > 0 || bracketed) { + splits.push({ + literal: bracketed || /^\s+$/.test(currentFull), + val: currentFull === "" ? "'" : currentFull + }); + } + current = null; + currentFull = ""; + bracketed = !bracketed; + } else if (bracketed) { + currentFull += c; + } else if (c === current) { + currentFull += c; + } else { + if (currentFull.length > 0) { + splits.push({ + literal: /^\s+$/.test(currentFull), + val: currentFull + }); + } + currentFull = c; + current = c; + } + } + if (currentFull.length > 0) { + splits.push({ + literal: bracketed || /^\s+$/.test(currentFull), + val: currentFull + }); + } + return splits; + }; + Formatter.macroTokenToFormatOpts = function macroTokenToFormatOpts(token) { + return _macroTokenToFormatOpts[token]; + }; + function Formatter(locale, formatOpts) { + this.opts = formatOpts; + this.loc = locale; + this.systemLoc = null; + } + var _proto = Formatter.prototype; + _proto.formatWithSystemDefault = function formatWithSystemDefault(dt, opts) { + if (this.systemLoc === null) { + this.systemLoc = this.loc.redefaultToSystem(); + } + var df = this.systemLoc.dtFormatter(dt, _extends({}, this.opts, opts)); + return df.format(); + }; + _proto.dtFormatter = function dtFormatter(dt, opts) { + if (opts === void 0) { + opts = {}; + } + return this.loc.dtFormatter(dt, _extends({}, this.opts, opts)); + }; + _proto.formatDateTime = function formatDateTime(dt, opts) { + return this.dtFormatter(dt, opts).format(); + }; + _proto.formatDateTimeParts = function formatDateTimeParts(dt, opts) { + return this.dtFormatter(dt, opts).formatToParts(); + }; + _proto.formatInterval = function formatInterval(interval, opts) { + var df = this.dtFormatter(interval.start, opts); + return df.dtf.formatRange(interval.start.toJSDate(), interval.end.toJSDate()); + }; + _proto.resolvedOptions = function resolvedOptions(dt, opts) { + return this.dtFormatter(dt, opts).resolvedOptions(); + }; + _proto.num = function num(n, p, signDisplay) { + if (p === void 0) { + p = 0; + } + if (signDisplay === void 0) { + signDisplay = undefined; + } + // we get some perf out of doing this here, annoyingly + if (this.opts.forceSimple) { + return padStart(n, p); + } + var opts = _extends({}, this.opts); + if (p > 0) { + opts.padTo = p; + } + if (signDisplay) { + opts.signDisplay = signDisplay; + } + return this.loc.numberFormatter(opts).format(n); + }; + _proto.formatDateTimeFromString = function formatDateTimeFromString(dt, fmt) { + var _this = this; + var knownEnglish = this.loc.listingMode() === "en", + useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== "gregory", + string = function string(opts, extract) { + return _this.loc.extract(dt, opts, extract); + }, + formatOffset = function formatOffset(opts) { + if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) { + return "Z"; + } + return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : ""; + }, + meridiem = function meridiem() { + return knownEnglish ? meridiemForDateTime(dt) : string({ + hour: "numeric", + hourCycle: "h12" + }, "dayperiod"); + }, + month = function month(length, standalone) { + return knownEnglish ? monthForDateTime(dt, length) : string(standalone ? { + month: length + } : { + month: length, + day: "numeric" + }, "month"); + }, + weekday = function weekday(length, standalone) { + return knownEnglish ? weekdayForDateTime(dt, length) : string(standalone ? { + weekday: length + } : { + weekday: length, + month: "long", + day: "numeric" + }, "weekday"); + }, + maybeMacro = function maybeMacro(token) { + var formatOpts = Formatter.macroTokenToFormatOpts(token); + if (formatOpts) { + return _this.formatWithSystemDefault(dt, formatOpts); + } else { + return token; + } + }, + era = function era(length) { + return knownEnglish ? eraForDateTime(dt, length) : string({ + era: length + }, "era"); + }, + tokenToString = function tokenToString(token) { + // Where possible: https://cldr.unicode.org/translation/date-time/date-time-symbols + switch (token) { + // ms + case "S": + return _this.num(dt.millisecond); + case "u": + // falls through + case "SSS": + return _this.num(dt.millisecond, 3); + // seconds + case "s": + return _this.num(dt.second); + case "ss": + return _this.num(dt.second, 2); + // fractional seconds + case "uu": + return _this.num(Math.floor(dt.millisecond / 10), 2); + case "uuu": + return _this.num(Math.floor(dt.millisecond / 100)); + // minutes + case "m": + return _this.num(dt.minute); + case "mm": + return _this.num(dt.minute, 2); + // hours + case "h": + return _this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12); + case "hh": + return _this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2); + case "H": + return _this.num(dt.hour); + case "HH": + return _this.num(dt.hour, 2); + // offset + case "Z": + // like +6 + return formatOffset({ + format: "narrow", + allowZ: _this.opts.allowZ + }); + case "ZZ": + // like +06:00 + return formatOffset({ + format: "short", + allowZ: _this.opts.allowZ + }); + case "ZZZ": + // like +0600 + return formatOffset({ + format: "techie", + allowZ: _this.opts.allowZ + }); + case "ZZZZ": + // like EST + return dt.zone.offsetName(dt.ts, { + format: "short", + locale: _this.loc.locale + }); + case "ZZZZZ": + // like Eastern Standard Time + return dt.zone.offsetName(dt.ts, { + format: "long", + locale: _this.loc.locale + }); + // zone + case "z": + // like America/New_York + return dt.zoneName; + // meridiems + case "a": + return meridiem(); + // dates + case "d": + return useDateTimeFormatter ? string({ + day: "numeric" + }, "day") : _this.num(dt.day); + case "dd": + return useDateTimeFormatter ? string({ + day: "2-digit" + }, "day") : _this.num(dt.day, 2); + // weekdays - standalone + case "c": + // like 1 + return _this.num(dt.weekday); + case "ccc": + // like 'Tues' + return weekday("short", true); + case "cccc": + // like 'Tuesday' + return weekday("long", true); + case "ccccc": + // like 'T' + return weekday("narrow", true); + // weekdays - format + case "E": + // like 1 + return _this.num(dt.weekday); + case "EEE": + // like 'Tues' + return weekday("short", false); + case "EEEE": + // like 'Tuesday' + return weekday("long", false); + case "EEEEE": + // like 'T' + return weekday("narrow", false); + // months - standalone + case "L": + // like 1 + return useDateTimeFormatter ? string({ + month: "numeric", + day: "numeric" + }, "month") : _this.num(dt.month); + case "LL": + // like 01, doesn't seem to work + return useDateTimeFormatter ? string({ + month: "2-digit", + day: "numeric" + }, "month") : _this.num(dt.month, 2); + case "LLL": + // like Jan + return month("short", true); + case "LLLL": + // like January + return month("long", true); + case "LLLLL": + // like J + return month("narrow", true); + // months - format + case "M": + // like 1 + return useDateTimeFormatter ? string({ + month: "numeric" + }, "month") : _this.num(dt.month); + case "MM": + // like 01 + return useDateTimeFormatter ? string({ + month: "2-digit" + }, "month") : _this.num(dt.month, 2); + case "MMM": + // like Jan + return month("short", false); + case "MMMM": + // like January + return month("long", false); + case "MMMMM": + // like J + return month("narrow", false); + // years + case "y": + // like 2014 + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : _this.num(dt.year); + case "yy": + // like 14 + return useDateTimeFormatter ? string({ + year: "2-digit" + }, "year") : _this.num(dt.year.toString().slice(-2), 2); + case "yyyy": + // like 0012 + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : _this.num(dt.year, 4); + case "yyyyyy": + // like 000012 + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : _this.num(dt.year, 6); + // eras + case "G": + // like AD + return era("short"); + case "GG": + // like Anno Domini + return era("long"); + case "GGGGG": + return era("narrow"); + case "kk": + return _this.num(dt.weekYear.toString().slice(-2), 2); + case "kkkk": + return _this.num(dt.weekYear, 4); + case "W": + return _this.num(dt.weekNumber); + case "WW": + return _this.num(dt.weekNumber, 2); + case "n": + return _this.num(dt.localWeekNumber); + case "nn": + return _this.num(dt.localWeekNumber, 2); + case "ii": + return _this.num(dt.localWeekYear.toString().slice(-2), 2); + case "iiii": + return _this.num(dt.localWeekYear, 4); + case "o": + return _this.num(dt.ordinal); + case "ooo": + return _this.num(dt.ordinal, 3); + case "q": + // like 1 + return _this.num(dt.quarter); + case "qq": + // like 01 + return _this.num(dt.quarter, 2); + case "X": + return _this.num(Math.floor(dt.ts / 1000)); + case "x": + return _this.num(dt.ts); + default: + return maybeMacro(token); + } + }; + return stringifyTokens(Formatter.parseFormat(fmt), tokenToString); + }; + _proto.formatDurationFromString = function formatDurationFromString(dur, fmt) { + var _this2 = this; + var invertLargest = this.opts.signMode === "negativeLargestOnly" ? -1 : 1; + var tokenToField = function tokenToField(token) { + switch (token[0]) { + case "S": + return "milliseconds"; + case "s": + return "seconds"; + case "m": + return "minutes"; + case "h": + return "hours"; + case "d": + return "days"; + case "w": + return "weeks"; + case "M": + return "months"; + case "y": + return "years"; + default: + return null; + } + }, + tokenToString = function tokenToString(lildur, info) { + return function (token) { + var mapped = tokenToField(token); + if (mapped) { + var inversionFactor = info.isNegativeDuration && mapped !== info.largestUnit ? invertLargest : 1; + var signDisplay; + if (_this2.opts.signMode === "negativeLargestOnly" && mapped !== info.largestUnit) { + signDisplay = "never"; + } else if (_this2.opts.signMode === "all") { + signDisplay = "always"; + } else { + // "auto" and "negative" are the same, but "auto" has better support + signDisplay = "auto"; + } + return _this2.num(lildur.get(mapped) * inversionFactor, token.length, signDisplay); + } else { + return token; + } + }; + }, + tokens = Formatter.parseFormat(fmt), + realTokens = tokens.reduce(function (found, _ref) { + var literal = _ref.literal, + val = _ref.val; + return literal ? found : found.concat(val); + }, []), + collapsed = dur.shiftTo.apply(dur, realTokens.map(tokenToField).filter(function (t) { + return t; + })), + durationInfo = { + isNegativeDuration: collapsed < 0, + // this relies on "collapsed" being based on "shiftTo", which builds up the object + // in order + largestUnit: Object.keys(collapsed.values)[0] + }; + return stringifyTokens(tokens, tokenToString(collapsed, durationInfo)); + }; + return Formatter; + }(); + + /* + * This file handles parsing for well-specified formats. Here's how it works: + * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match. + * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object + * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence. + * Extractors can take a "cursor" representing the offset in the match to look at. This makes it easy to combine extractors. + * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions. + * Some extractions are super dumb and simpleParse and fromStrings help DRY them. + */ + + var ianaRegex = /[A-Za-z_+-]{1,256}(?::?\/[A-Za-z0-9_+-]{1,256}(?:\/[A-Za-z0-9_+-]{1,256})?)?/; + function combineRegexes() { + for (var _len = arguments.length, regexes = new Array(_len), _key = 0; _key < _len; _key++) { + regexes[_key] = arguments[_key]; + } + var full = regexes.reduce(function (f, r) { + return f + r.source; + }, ""); + return RegExp("^" + full + "$"); + } + function combineExtractors() { + for (var _len2 = arguments.length, extractors = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + extractors[_key2] = arguments[_key2]; + } + return function (m) { + return extractors.reduce(function (_ref, ex) { + var mergedVals = _ref[0], + mergedZone = _ref[1], + cursor = _ref[2]; + var _ex = ex(m, cursor), + val = _ex[0], + zone = _ex[1], + next = _ex[2]; + return [_extends({}, mergedVals, val), zone || mergedZone, next]; + }, [{}, null, 1]).slice(0, 2); + }; + } + function parse(s) { + if (s == null) { + return [null, null]; + } + for (var _len3 = arguments.length, patterns = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { + patterns[_key3 - 1] = arguments[_key3]; + } + for (var _i = 0, _patterns = patterns; _i < _patterns.length; _i++) { + var _patterns$_i = _patterns[_i], + regex = _patterns$_i[0], + extractor = _patterns$_i[1]; + var m = regex.exec(s); + if (m) { + return extractor(m); + } + } + return [null, null]; + } + function simpleParse() { + for (var _len4 = arguments.length, keys = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + keys[_key4] = arguments[_key4]; + } + return function (match, cursor) { + var ret = {}; + var i; + for (i = 0; i < keys.length; i++) { + ret[keys[i]] = parseInteger(match[cursor + i]); + } + return [ret, null, cursor + i]; + }; + } + + // ISO and SQL parsing + var offsetRegex = /(?:([Zz])|([+-]\d\d)(?::?(\d\d))?)/; + var isoExtendedZone = "(?:" + offsetRegex.source + "?(?:\\[(" + ianaRegex.source + ")\\])?)?"; + var isoTimeBaseRegex = /(\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,30}))?)?)?/; + var isoTimeRegex = RegExp("" + isoTimeBaseRegex.source + isoExtendedZone); + var isoTimeExtensionRegex = RegExp("(?:[Tt]" + isoTimeRegex.source + ")?"); + var isoYmdRegex = /([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/; + var isoWeekRegex = /(\d{4})-?W(\d\d)(?:-?(\d))?/; + var isoOrdinalRegex = /(\d{4})-?(\d{3})/; + var extractISOWeekData = simpleParse("weekYear", "weekNumber", "weekDay"); + var extractISOOrdinalData = simpleParse("year", "ordinal"); + var sqlYmdRegex = /(\d{4})-(\d\d)-(\d\d)/; // dumbed-down version of the ISO one + var sqlTimeRegex = RegExp(isoTimeBaseRegex.source + " ?(?:" + offsetRegex.source + "|(" + ianaRegex.source + "))?"); + var sqlTimeExtensionRegex = RegExp("(?: " + sqlTimeRegex.source + ")?"); + function int(match, pos, fallback) { + var m = match[pos]; + return isUndefined(m) ? fallback : parseInteger(m); + } + function extractISOYmd(match, cursor) { + var item = { + year: int(match, cursor), + month: int(match, cursor + 1, 1), + day: int(match, cursor + 2, 1) + }; + return [item, null, cursor + 3]; + } + function extractISOTime(match, cursor) { + var item = { + hours: int(match, cursor, 0), + minutes: int(match, cursor + 1, 0), + seconds: int(match, cursor + 2, 0), + milliseconds: parseMillis(match[cursor + 3]) + }; + return [item, null, cursor + 4]; + } + function extractISOOffset(match, cursor) { + var local = !match[cursor] && !match[cursor + 1], + fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]), + zone = local ? null : FixedOffsetZone.instance(fullOffset); + return [{}, zone, cursor + 3]; + } + function extractIANAZone(match, cursor) { + var zone = match[cursor] ? IANAZone.create(match[cursor]) : null; + return [{}, zone, cursor + 1]; + } + + // ISO time parsing + + var isoTimeOnly = RegExp("^T?" + isoTimeBaseRegex.source + "$"); + + // ISO duration parsing + + var isoDuration = /^-?P(?:(?:(-?\d{1,20}(?:\.\d{1,20})?)Y)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20}(?:\.\d{1,20})?)W)?(?:(-?\d{1,20}(?:\.\d{1,20})?)D)?(?:T(?:(-?\d{1,20}(?:\.\d{1,20})?)H)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20})(?:[.,](-?\d{1,20}))?S)?)?)$/; + function extractISODuration(match) { + var s = match[0], + yearStr = match[1], + monthStr = match[2], + weekStr = match[3], + dayStr = match[4], + hourStr = match[5], + minuteStr = match[6], + secondStr = match[7], + millisecondsStr = match[8]; + var hasNegativePrefix = s[0] === "-"; + var negativeSeconds = secondStr && secondStr[0] === "-"; + var maybeNegate = function maybeNegate(num, force) { + if (force === void 0) { + force = false; + } + return num !== undefined && (force || num && hasNegativePrefix) ? -num : num; + }; + return [{ + years: maybeNegate(parseFloating(yearStr)), + months: maybeNegate(parseFloating(monthStr)), + weeks: maybeNegate(parseFloating(weekStr)), + days: maybeNegate(parseFloating(dayStr)), + hours: maybeNegate(parseFloating(hourStr)), + minutes: maybeNegate(parseFloating(minuteStr)), + seconds: maybeNegate(parseFloating(secondStr), secondStr === "-0"), + milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds) + }]; + } + + // These are a little braindead. EDT *should* tell us that we're in, say, America/New_York + // and not just that we're in -240 *right now*. But since I don't think these are used that often + // I'm just going to ignore that + var obsOffsets = { + GMT: 0, + EDT: -4 * 60, + EST: -5 * 60, + CDT: -5 * 60, + CST: -6 * 60, + MDT: -6 * 60, + MST: -7 * 60, + PDT: -7 * 60, + PST: -8 * 60 + }; + function fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { + var result = { + year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr), + month: monthsShort.indexOf(monthStr) + 1, + day: parseInteger(dayStr), + hour: parseInteger(hourStr), + minute: parseInteger(minuteStr) + }; + if (secondStr) result.second = parseInteger(secondStr); + if (weekdayStr) { + result.weekday = weekdayStr.length > 3 ? weekdaysLong.indexOf(weekdayStr) + 1 : weekdaysShort.indexOf(weekdayStr) + 1; + } + return result; + } + + // RFC 2822/5322 + var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/; + function extractRFC2822(match) { + var weekdayStr = match[1], + dayStr = match[2], + monthStr = match[3], + yearStr = match[4], + hourStr = match[5], + minuteStr = match[6], + secondStr = match[7], + obsOffset = match[8], + milOffset = match[9], + offHourStr = match[10], + offMinuteStr = match[11], + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + var offset; + if (obsOffset) { + offset = obsOffsets[obsOffset]; + } else if (milOffset) { + offset = 0; + } else { + offset = signedOffset(offHourStr, offMinuteStr); + } + return [result, new FixedOffsetZone(offset)]; + } + function preprocessRFC2822(s) { + // Remove comments and folding whitespace and replace multiple-spaces with a single space + return s.replace(/\([^()]*\)|[\n\t]/g, " ").replace(/(\s\s+)/g, " ").trim(); + } + + // http date + + var rfc1123 = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/, + rfc850 = /^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/, + ascii = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/; + function extractRFC1123Or850(match) { + var weekdayStr = match[1], + dayStr = match[2], + monthStr = match[3], + yearStr = match[4], + hourStr = match[5], + minuteStr = match[6], + secondStr = match[7], + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + return [result, FixedOffsetZone.utcInstance]; + } + function extractASCII(match) { + var weekdayStr = match[1], + monthStr = match[2], + dayStr = match[3], + hourStr = match[4], + minuteStr = match[5], + secondStr = match[6], + yearStr = match[7], + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + return [result, FixedOffsetZone.utcInstance]; + } + var isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex); + var isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex); + var isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex); + var isoTimeCombinedRegex = combineRegexes(isoTimeRegex); + var extractISOYmdTimeAndOffset = combineExtractors(extractISOYmd, extractISOTime, extractISOOffset, extractIANAZone); + var extractISOWeekTimeAndOffset = combineExtractors(extractISOWeekData, extractISOTime, extractISOOffset, extractIANAZone); + var extractISOOrdinalDateAndTime = combineExtractors(extractISOOrdinalData, extractISOTime, extractISOOffset, extractIANAZone); + var extractISOTimeAndOffset = combineExtractors(extractISOTime, extractISOOffset, extractIANAZone); + + /* + * @private + */ + + function parseISODate(s) { + return parse(s, [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset], [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime], [isoTimeCombinedRegex, extractISOTimeAndOffset]); + } + function parseRFC2822Date(s) { + return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]); + } + function parseHTTPDate(s) { + return parse(s, [rfc1123, extractRFC1123Or850], [rfc850, extractRFC1123Or850], [ascii, extractASCII]); + } + function parseISODuration(s) { + return parse(s, [isoDuration, extractISODuration]); + } + var extractISOTimeOnly = combineExtractors(extractISOTime); + function parseISOTimeOnly(s) { + return parse(s, [isoTimeOnly, extractISOTimeOnly]); + } + var sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex); + var sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex); + var extractISOTimeOffsetAndIANAZone = combineExtractors(extractISOTime, extractISOOffset, extractIANAZone); + function parseSQL(s) { + return parse(s, [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]); + } + + var INVALID$2 = "Invalid Duration"; + + // unit conversion constants + var lowOrderMatrix = { + weeks: { + days: 7, + hours: 7 * 24, + minutes: 7 * 24 * 60, + seconds: 7 * 24 * 60 * 60, + milliseconds: 7 * 24 * 60 * 60 * 1000 + }, + days: { + hours: 24, + minutes: 24 * 60, + seconds: 24 * 60 * 60, + milliseconds: 24 * 60 * 60 * 1000 + }, + hours: { + minutes: 60, + seconds: 60 * 60, + milliseconds: 60 * 60 * 1000 + }, + minutes: { + seconds: 60, + milliseconds: 60 * 1000 + }, + seconds: { + milliseconds: 1000 + } + }, + casualMatrix = _extends({ + years: { + quarters: 4, + months: 12, + weeks: 52, + days: 365, + hours: 365 * 24, + minutes: 365 * 24 * 60, + seconds: 365 * 24 * 60 * 60, + milliseconds: 365 * 24 * 60 * 60 * 1000 + }, + quarters: { + months: 3, + weeks: 13, + days: 91, + hours: 91 * 24, + minutes: 91 * 24 * 60, + seconds: 91 * 24 * 60 * 60, + milliseconds: 91 * 24 * 60 * 60 * 1000 + }, + months: { + weeks: 4, + days: 30, + hours: 30 * 24, + minutes: 30 * 24 * 60, + seconds: 30 * 24 * 60 * 60, + milliseconds: 30 * 24 * 60 * 60 * 1000 + } + }, lowOrderMatrix), + daysInYearAccurate = 146097.0 / 400, + daysInMonthAccurate = 146097.0 / 4800, + accurateMatrix = _extends({ + years: { + quarters: 4, + months: 12, + weeks: daysInYearAccurate / 7, + days: daysInYearAccurate, + hours: daysInYearAccurate * 24, + minutes: daysInYearAccurate * 24 * 60, + seconds: daysInYearAccurate * 24 * 60 * 60, + milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000 + }, + quarters: { + months: 3, + weeks: daysInYearAccurate / 28, + days: daysInYearAccurate / 4, + hours: daysInYearAccurate * 24 / 4, + minutes: daysInYearAccurate * 24 * 60 / 4, + seconds: daysInYearAccurate * 24 * 60 * 60 / 4, + milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000 / 4 + }, + months: { + weeks: daysInMonthAccurate / 7, + days: daysInMonthAccurate, + hours: daysInMonthAccurate * 24, + minutes: daysInMonthAccurate * 24 * 60, + seconds: daysInMonthAccurate * 24 * 60 * 60, + milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000 + } + }, lowOrderMatrix); + + // units ordered by size + var orderedUnits$1 = ["years", "quarters", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds"]; + var reverseUnits = orderedUnits$1.slice(0).reverse(); + + // clone really means "create another instance just like this one, but with these changes" + function clone$1(dur, alts, clear) { + if (clear === void 0) { + clear = false; + } + // deep merge for vals + var conf = { + values: clear ? alts.values : _extends({}, dur.values, alts.values || {}), + loc: dur.loc.clone(alts.loc), + conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy, + matrix: alts.matrix || dur.matrix + }; + return new Duration(conf); + } + function durationToMillis(matrix, vals) { + var _vals$milliseconds; + var sum = (_vals$milliseconds = vals.milliseconds) != null ? _vals$milliseconds : 0; + for (var _iterator = _createForOfIteratorHelperLoose(reverseUnits.slice(1)), _step; !(_step = _iterator()).done;) { + var unit = _step.value; + if (vals[unit]) { + sum += vals[unit] * matrix[unit]["milliseconds"]; + } + } + return sum; + } + + // NB: mutates parameters + function normalizeValues(matrix, vals) { + // the logic below assumes the overall value of the duration is positive + // if this is not the case, factor is used to make it so + var factor = durationToMillis(matrix, vals) < 0 ? -1 : 1; + orderedUnits$1.reduceRight(function (previous, current) { + if (!isUndefined(vals[current])) { + if (previous) { + var previousVal = vals[previous] * factor; + var conv = matrix[current][previous]; + + // if (previousVal < 0): + // lower order unit is negative (e.g. { years: 2, days: -2 }) + // normalize this by reducing the higher order unit by the appropriate amount + // and increasing the lower order unit + // this can never make the higher order unit negative, because this function only operates + // on positive durations, so the amount of time represented by the lower order unit cannot + // be larger than the higher order unit + // else: + // lower order unit is positive (e.g. { years: 2, days: 450 } or { years: -2, days: 450 }) + // in this case we attempt to convert as much as possible from the lower order unit into + // the higher order one + // + // Math.floor takes care of both of these cases, rounding away from 0 + // if previousVal < 0 it makes the absolute value larger + // if previousVal >= it makes the absolute value smaller + var rollUp = Math.floor(previousVal / conv); + vals[current] += rollUp * factor; + vals[previous] -= rollUp * conv * factor; + } + return current; + } else { + return previous; + } + }, null); + + // try to convert any decimals into smaller units if possible + // for example for { years: 2.5, days: 0, seconds: 0 } we want to get { years: 2, days: 182, hours: 12 } + orderedUnits$1.reduce(function (previous, current) { + if (!isUndefined(vals[current])) { + if (previous) { + var fraction = vals[previous] % 1; + vals[previous] -= fraction; + vals[current] += fraction * matrix[previous][current]; + } + return current; + } else { + return previous; + } + }, null); + } + + // Remove all properties with a value of 0 from an object + function removeZeroes(vals) { + var newVals = {}; + for (var _i = 0, _Object$entries = Object.entries(vals); _i < _Object$entries.length; _i++) { + var _Object$entries$_i = _Object$entries[_i], + key = _Object$entries$_i[0], + value = _Object$entries$_i[1]; + if (value !== 0) { + newVals[key] = value; + } + } + return newVals; + } + + /** + * A Duration object represents a period of time, like "2 months" or "1 day, 1 hour". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime#plus} to add a Duration object to a DateTime, producing another DateTime. + * + * Here is a brief overview of commonly used methods and getters in Duration: + * + * * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}. + * * **Unit values** See the {@link Duration#years}, {@link Duration#months}, {@link Duration#weeks}, {@link Duration#days}, {@link Duration#hours}, {@link Duration#minutes}, {@link Duration#seconds}, {@link Duration#milliseconds} accessors. + * * **Configuration** See {@link Duration#locale} and {@link Duration#numberingSystem} accessors. + * * **Transformation** To create new Durations out of old ones use {@link Duration#plus}, {@link Duration#minus}, {@link Duration#normalize}, {@link Duration#set}, {@link Duration#reconfigure}, {@link Duration#shiftTo}, and {@link Duration#negate}. + * * **Output** To convert the Duration into other representations, see {@link Duration#as}, {@link Duration#toISO}, {@link Duration#toFormat}, and {@link Duration#toJSON} + * + * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation. + */ + var Duration = /*#__PURE__*/function (_Symbol$for) { + /** + * @private + */ + function Duration(config) { + var accurate = config.conversionAccuracy === "longterm" || false; + var matrix = accurate ? accurateMatrix : casualMatrix; + if (config.matrix) { + matrix = config.matrix; + } + + /** + * @access private + */ + this.values = config.values; + /** + * @access private + */ + this.loc = config.loc || Locale.create(); + /** + * @access private + */ + this.conversionAccuracy = accurate ? "longterm" : "casual"; + /** + * @access private + */ + this.invalid = config.invalid || null; + /** + * @access private + */ + this.matrix = matrix; + /** + * @access private + */ + this.isLuxonDuration = true; + } + + /** + * Create Duration from a number of milliseconds. + * @param {number} count of milliseconds + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @return {Duration} + */ + Duration.fromMillis = function fromMillis(count, opts) { + return Duration.fromObject({ + milliseconds: count + }, opts); + } + + /** + * Create a Duration from a JavaScript object with keys like 'years' and 'hours'. + * If this object is empty then a zero milliseconds duration is returned. + * @param {Object} obj - the object to create the DateTime from + * @param {number} obj.years + * @param {number} obj.quarters + * @param {number} obj.months + * @param {number} obj.weeks + * @param {number} obj.days + * @param {number} obj.hours + * @param {number} obj.minutes + * @param {number} obj.seconds + * @param {number} obj.milliseconds + * @param {Object} [opts=[]] - options for creating this Duration + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the custom conversion system to use + * @return {Duration} + */; + Duration.fromObject = function fromObject(obj, opts) { + if (opts === void 0) { + opts = {}; + } + if (obj == null || typeof obj !== "object") { + throw new InvalidArgumentError("Duration.fromObject: argument expected to be an object, got " + (obj === null ? "null" : typeof obj)); + } + return new Duration({ + values: normalizeObject(obj, Duration.normalizeUnit), + loc: Locale.fromObject(opts), + conversionAccuracy: opts.conversionAccuracy, + matrix: opts.matrix + }); + } + + /** + * Create a Duration from DurationLike. + * + * @param {Object | number | Duration} durationLike + * One of: + * - object with keys like 'years' and 'hours'. + * - number representing milliseconds + * - Duration instance + * @return {Duration} + */; + Duration.fromDurationLike = function fromDurationLike(durationLike) { + if (isNumber(durationLike)) { + return Duration.fromMillis(durationLike); + } else if (Duration.isDuration(durationLike)) { + return durationLike; + } else if (typeof durationLike === "object") { + return Duration.fromObject(durationLike); + } else { + throw new InvalidArgumentError("Unknown duration argument " + durationLike + " of type " + typeof durationLike); + } + } + + /** + * Create a Duration from an ISO 8601 duration string. + * @param {string} text - text to parse + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the preset conversion system to use + * @see https://en.wikipedia.org/wiki/ISO_8601#Durations + * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 } + * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 } + * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 } + * @return {Duration} + */; + Duration.fromISO = function fromISO(text, opts) { + var _parseISODuration = parseISODuration(text), + parsed = _parseISODuration[0]; + if (parsed) { + return Duration.fromObject(parsed, opts); + } else { + return Duration.invalid("unparsable", "the input \"" + text + "\" can't be parsed as ISO 8601"); + } + } + + /** + * Create a Duration from an ISO 8601 time string. + * @param {string} text - text to parse + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the conversion system to use + * @see https://en.wikipedia.org/wiki/ISO_8601#Times + * @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 } + * @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @return {Duration} + */; + Duration.fromISOTime = function fromISOTime(text, opts) { + var _parseISOTimeOnly = parseISOTimeOnly(text), + parsed = _parseISOTimeOnly[0]; + if (parsed) { + return Duration.fromObject(parsed, opts); + } else { + return Duration.invalid("unparsable", "the input \"" + text + "\" can't be parsed as ISO 8601"); + } + } + + /** + * Create an invalid Duration. + * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {Duration} + */; + Duration.invalid = function invalid(reason, explanation) { + if (explanation === void 0) { + explanation = null; + } + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the Duration is invalid"); + } + var invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidDurationError(invalid); + } else { + return new Duration({ + invalid: invalid + }); + } + } + + /** + * @private + */; + Duration.normalizeUnit = function normalizeUnit(unit) { + var normalized = { + year: "years", + years: "years", + quarter: "quarters", + quarters: "quarters", + month: "months", + months: "months", + week: "weeks", + weeks: "weeks", + day: "days", + days: "days", + hour: "hours", + hours: "hours", + minute: "minutes", + minutes: "minutes", + second: "seconds", + seconds: "seconds", + millisecond: "milliseconds", + milliseconds: "milliseconds" + }[unit ? unit.toLowerCase() : unit]; + if (!normalized) throw new InvalidUnitError(unit); + return normalized; + } + + /** + * Check if an object is a Duration. Works across context boundaries + * @param {object} o + * @return {boolean} + */; + Duration.isDuration = function isDuration(o) { + return o && o.isLuxonDuration || false; + } + + /** + * Get the locale of a Duration, such 'en-GB' + * @type {string} + */; + var _proto = Duration.prototype; + /** + * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens: + * * `S` for milliseconds + * * `s` for seconds + * * `m` for minutes + * * `h` for hours + * * `d` for days + * * `w` for weeks + * * `M` for months + * * `y` for years + * Notes: + * * Add padding by repeating the token, e.g. "yy" pads the years to two digits, "hhhh" pads the hours out to four digits + * * Tokens can be escaped by wrapping with single quotes. + * * The duration will be converted to the set of units in the format string using {@link Duration#shiftTo} and the Durations's conversion accuracy setting. + * @param {string} fmt - the format string + * @param {Object} opts - options + * @param {boolean} [opts.floor=true] - floor numerical values + * @param {'negative'|'all'|'negativeLargestOnly'} [opts.signMode=negative] - How to handle signs + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("y d s") //=> "1 6 2" + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("yy dd sss") //=> "01 06 002" + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("M S") //=> "12 518402000" + * @example Duration.fromObject({ days: 6, seconds: 2 }).toFormat("d s", { signMode: "all" }) //=> "+6 +2" + * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat("d s", { signMode: "all" }) //=> "-6 -2" + * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat("d s", { signMode: "negativeLargestOnly" }) //=> "-6 2" + * @return {string} + */ + _proto.toFormat = function toFormat(fmt, opts) { + if (opts === void 0) { + opts = {}; + } + // reverse-compat since 1.2; we always round down now, never up, and we do it by default + var fmtOpts = _extends({}, opts, { + floor: opts.round !== false && opts.floor !== false + }); + return this.isValid ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt) : INVALID$2; + } + + /** + * Returns a string representation of a Duration with all units included. + * To modify its behavior, use `listStyle` and any Intl.NumberFormat option, though `unitDisplay` is especially relevant. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options + * @param {Object} opts - Formatting options. Accepts the same keys as the options parameter of the native `Intl.NumberFormat` constructor, as well as `listStyle`. + * @param {string} [opts.listStyle='narrow'] - How to format the merged list. Corresponds to the `style` property of the options parameter of the native `Intl.ListFormat` constructor. + * @param {boolean} [opts.showZeros=true] - Show all units previously used by the duration even if they are zero + * @example + * ```js + * var dur = Duration.fromObject({ months: 1, weeks: 0, hours: 5, minutes: 6 }) + * dur.toHuman() //=> '1 month, 0 weeks, 5 hours, 6 minutes' + * dur.toHuman({ listStyle: "long" }) //=> '1 month, 0 weeks, 5 hours, and 6 minutes' + * dur.toHuman({ unitDisplay: "short" }) //=> '1 mth, 0 wks, 5 hr, 6 min' + * dur.toHuman({ showZeros: false }) //=> '1 month, 5 hours, 6 minutes' + * ``` + */; + _proto.toHuman = function toHuman(opts) { + var _this = this; + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) return INVALID$2; + var showZeros = opts.showZeros !== false; + var l = orderedUnits$1.map(function (unit) { + var val = _this.values[unit]; + if (isUndefined(val) || val === 0 && !showZeros) { + return null; + } + return _this.loc.numberFormatter(_extends({ + style: "unit", + unitDisplay: "long" + }, opts, { + unit: unit.slice(0, -1) + })).format(val); + }).filter(function (n) { + return n; + }); + return this.loc.listFormatter(_extends({ + type: "conjunction", + style: opts.listStyle || "narrow" + }, opts)).format(l); + } + + /** + * Returns a JavaScript object with this Duration's values. + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 } + * @return {Object} + */; + _proto.toObject = function toObject() { + if (!this.isValid) return {}; + return _extends({}, this.values); + } + + /** + * Returns an ISO 8601-compliant string representation of this Duration. + * @see https://en.wikipedia.org/wiki/ISO_8601#Durations + * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S' + * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S' + * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M' + * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M' + * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S' + * @return {string} + */; + _proto.toISO = function toISO() { + // we could use the formatter, but this is an easier way to get the minimum string + if (!this.isValid) return null; + var s = "P"; + if (this.years !== 0) s += this.years + "Y"; + if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + "M"; + if (this.weeks !== 0) s += this.weeks + "W"; + if (this.days !== 0) s += this.days + "D"; + if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0) s += "T"; + if (this.hours !== 0) s += this.hours + "H"; + if (this.minutes !== 0) s += this.minutes + "M"; + if (this.seconds !== 0 || this.milliseconds !== 0) + // this will handle "floating point madness" by removing extra decimal places + // https://stackoverflow.com/questions/588004/is-floating-point-math-broken + s += roundTo(this.seconds + this.milliseconds / 1000, 3) + "S"; + if (s === "P") s += "T0S"; + return s; + } + + /** + * Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day. + * Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours. + * @see https://en.wikipedia.org/wiki/ISO_8601#Times + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includePrefix=false] - include the `T` prefix + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000' + * @return {string} + */; + _proto.toISOTime = function toISOTime(opts) { + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) return null; + var millis = this.toMillis(); + if (millis < 0 || millis >= 86400000) return null; + opts = _extends({ + suppressMilliseconds: false, + suppressSeconds: false, + includePrefix: false, + format: "extended" + }, opts, { + includeOffset: false + }); + var dateTime = DateTime.fromMillis(millis, { + zone: "UTC" + }); + return dateTime.toISOTime(opts); + } + + /** + * Returns an ISO 8601 representation of this Duration appropriate for use in JSON. + * @return {string} + */; + _proto.toJSON = function toJSON() { + return this.toISO(); + } + + /** + * Returns an ISO 8601 representation of this Duration appropriate for use in debugging. + * @return {string} + */; + _proto.toString = function toString() { + return this.toISO(); + } + + /** + * Returns a string representation of this Duration appropriate for the REPL. + * @return {string} + */; + _proto[_Symbol$for] = function () { + if (this.isValid) { + return "Duration { values: " + JSON.stringify(this.values) + " }"; + } else { + return "Duration { Invalid, reason: " + this.invalidReason + " }"; + } + } + + /** + * Returns an milliseconds value of this Duration. + * @return {number} + */; + _proto.toMillis = function toMillis() { + if (!this.isValid) return NaN; + return durationToMillis(this.matrix, this.values); + } + + /** + * Returns an milliseconds value of this Duration. Alias of {@link toMillis} + * @return {number} + */; + _proto.valueOf = function valueOf() { + return this.toMillis(); + } + + /** + * Make this Duration longer by the specified amount. Return a newly-constructed Duration. + * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @return {Duration} + */; + _proto.plus = function plus(duration) { + if (!this.isValid) return this; + var dur = Duration.fromDurationLike(duration), + result = {}; + for (var _i2 = 0, _orderedUnits = orderedUnits$1; _i2 < _orderedUnits.length; _i2++) { + var k = _orderedUnits[_i2]; + if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) { + result[k] = dur.get(k) + this.get(k); + } + } + return clone$1(this, { + values: result + }, true); + } + + /** + * Make this Duration shorter by the specified amount. Return a newly-constructed Duration. + * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @return {Duration} + */; + _proto.minus = function minus(duration) { + if (!this.isValid) return this; + var dur = Duration.fromDurationLike(duration); + return this.plus(dur.negate()); + } + + /** + * Scale this Duration by the specified amount. Return a newly-constructed Duration. + * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number. + * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits(x => x * 2) //=> { hours: 2, minutes: 60 } + * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits((x, u) => u === "hours" ? x * 2 : x) //=> { hours: 2, minutes: 30 } + * @return {Duration} + */; + _proto.mapUnits = function mapUnits(fn) { + if (!this.isValid) return this; + var result = {}; + for (var _i3 = 0, _Object$keys = Object.keys(this.values); _i3 < _Object$keys.length; _i3++) { + var k = _Object$keys[_i3]; + result[k] = asNumber(fn(this.values[k], k)); + } + return clone$1(this, { + values: result + }, true); + } + + /** + * Get the value of unit. + * @param {string} unit - a unit such as 'minute' or 'day' + * @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2 + * @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0 + * @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3 + * @return {number} + */; + _proto.get = function get(unit) { + return this[Duration.normalizeUnit(unit)]; + } + + /** + * "Set" the values of specified units. Return a newly-constructed Duration. + * @param {Object} values - a mapping of units to numbers + * @example dur.set({ years: 2017 }) + * @example dur.set({ hours: 8, minutes: 30 }) + * @return {Duration} + */; + _proto.set = function set(values) { + if (!this.isValid) return this; + var mixed = _extends({}, this.values, normalizeObject(values, Duration.normalizeUnit)); + return clone$1(this, { + values: mixed + }); + } + + /** + * "Set" the locale and/or numberingSystem. Returns a newly-constructed Duration. + * @example dur.reconfigure({ locale: 'en-GB' }) + * @return {Duration} + */; + _proto.reconfigure = function reconfigure(_temp) { + var _ref = _temp === void 0 ? {} : _temp, + locale = _ref.locale, + numberingSystem = _ref.numberingSystem, + conversionAccuracy = _ref.conversionAccuracy, + matrix = _ref.matrix; + var loc = this.loc.clone({ + locale: locale, + numberingSystem: numberingSystem + }); + var opts = { + loc: loc, + matrix: matrix, + conversionAccuracy: conversionAccuracy + }; + return clone$1(this, opts); + } + + /** + * Return the length of the duration in the specified unit. + * @param {string} unit - a unit such as 'minutes' or 'days' + * @example Duration.fromObject({years: 1}).as('days') //=> 365 + * @example Duration.fromObject({years: 1}).as('months') //=> 12 + * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5 + * @return {number} + */; + _proto.as = function as(unit) { + return this.isValid ? this.shiftTo(unit).get(unit) : NaN; + } + + /** + * Reduce this Duration to its canonical representation in its current units. + * Assuming the overall value of the Duration is positive, this means: + * - excessive values for lower-order units are converted to higher-order units (if possible, see first and second example) + * - negative lower-order units are converted to higher order units (there must be such a higher order unit, otherwise + * the overall value would be negative, see third example) + * - fractional values for higher-order units are converted to lower-order units (if possible, see fourth example) + * + * If the overall value is negative, the result of this method is equivalent to `this.negate().normalize().negate()`. + * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 } + * @example Duration.fromObject({ days: 5000 }).normalize().toObject() //=> { days: 5000 } + * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 } + * @example Duration.fromObject({ years: 2.5, days: 0, hours: 0 }).normalize().toObject() //=> { years: 2, days: 182, hours: 12 } + * @return {Duration} + */; + _proto.normalize = function normalize() { + if (!this.isValid) return this; + var vals = this.toObject(); + normalizeValues(this.matrix, vals); + return clone$1(this, { + values: vals + }, true); + } + + /** + * Rescale units to its largest representation + * @example Duration.fromObject({ milliseconds: 90000 }).rescale().toObject() //=> { minutes: 1, seconds: 30 } + * @return {Duration} + */; + _proto.rescale = function rescale() { + if (!this.isValid) return this; + var vals = removeZeroes(this.normalize().shiftToAll().toObject()); + return clone$1(this, { + values: vals + }, true); + } + + /** + * Convert this Duration into its representation in a different set of units. + * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 } + * @return {Duration} + */; + _proto.shiftTo = function shiftTo() { + for (var _len = arguments.length, units = new Array(_len), _key = 0; _key < _len; _key++) { + units[_key] = arguments[_key]; + } + if (!this.isValid) return this; + if (units.length === 0) { + return this; + } + units = units.map(function (u) { + return Duration.normalizeUnit(u); + }); + var built = {}, + accumulated = {}, + vals = this.toObject(); + var lastUnit; + for (var _i4 = 0, _orderedUnits2 = orderedUnits$1; _i4 < _orderedUnits2.length; _i4++) { + var k = _orderedUnits2[_i4]; + if (units.indexOf(k) >= 0) { + lastUnit = k; + var own = 0; + + // anything we haven't boiled down yet should get boiled to this unit + for (var ak in accumulated) { + own += this.matrix[ak][k] * accumulated[ak]; + accumulated[ak] = 0; + } + + // plus anything that's already in this unit + if (isNumber(vals[k])) { + own += vals[k]; + } + + // only keep the integer part for now in the hopes of putting any decimal part + // into a smaller unit later + var i = Math.trunc(own); + built[k] = i; + accumulated[k] = (own * 1000 - i * 1000) / 1000; + + // otherwise, keep it in the wings to boil it later + } else if (isNumber(vals[k])) { + accumulated[k] = vals[k]; + } + } + + // anything leftover becomes the decimal for the last unit + // lastUnit must be defined since units is not empty + for (var key in accumulated) { + if (accumulated[key] !== 0) { + built[lastUnit] += key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key]; + } + } + normalizeValues(this.matrix, built); + return clone$1(this, { + values: built + }, true); + } + + /** + * Shift this Duration to all available units. + * Same as shiftTo("years", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds") + * @return {Duration} + */; + _proto.shiftToAll = function shiftToAll() { + if (!this.isValid) return this; + return this.shiftTo("years", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds"); + } + + /** + * Return the negative of this Duration. + * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 } + * @return {Duration} + */; + _proto.negate = function negate() { + if (!this.isValid) return this; + var negated = {}; + for (var _i5 = 0, _Object$keys2 = Object.keys(this.values); _i5 < _Object$keys2.length; _i5++) { + var k = _Object$keys2[_i5]; + negated[k] = this.values[k] === 0 ? 0 : -this.values[k]; + } + return clone$1(this, { + values: negated + }, true); + } + + /** + * Removes all units with values equal to 0 from this Duration. + * @example Duration.fromObject({ years: 2, days: 0, hours: 0, minutes: 0 }).removeZeros().toObject() //=> { years: 2 } + * @return {Duration} + */; + _proto.removeZeros = function removeZeros() { + if (!this.isValid) return this; + var vals = removeZeroes(this.values); + return clone$1(this, { + values: vals + }, true); + } + + /** + * Get the years. + * @type {number} + */; + /** + * Equality check + * Two Durations are equal iff they have the same units and the same values for each unit. + * @param {Duration} other + * @return {boolean} + */ + _proto.equals = function equals(other) { + if (!this.isValid || !other.isValid) { + return false; + } + if (!this.loc.equals(other.loc)) { + return false; + } + function eq(v1, v2) { + // Consider 0 and undefined as equal + if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0; + return v1 === v2; + } + for (var _i6 = 0, _orderedUnits3 = orderedUnits$1; _i6 < _orderedUnits3.length; _i6++) { + var u = _orderedUnits3[_i6]; + if (!eq(this.values[u], other.values[u])) { + return false; + } + } + return true; + }; + _createClass(Duration, [{ + key: "locale", + get: function get() { + return this.isValid ? this.loc.locale : null; + } + + /** + * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration + * + * @type {string} + */ + }, { + key: "numberingSystem", + get: function get() { + return this.isValid ? this.loc.numberingSystem : null; + } + }, { + key: "years", + get: function get() { + return this.isValid ? this.values.years || 0 : NaN; + } + + /** + * Get the quarters. + * @type {number} + */ + }, { + key: "quarters", + get: function get() { + return this.isValid ? this.values.quarters || 0 : NaN; + } + + /** + * Get the months. + * @type {number} + */ + }, { + key: "months", + get: function get() { + return this.isValid ? this.values.months || 0 : NaN; + } + + /** + * Get the weeks + * @type {number} + */ + }, { + key: "weeks", + get: function get() { + return this.isValid ? this.values.weeks || 0 : NaN; + } + + /** + * Get the days. + * @type {number} + */ + }, { + key: "days", + get: function get() { + return this.isValid ? this.values.days || 0 : NaN; + } + + /** + * Get the hours. + * @type {number} + */ + }, { + key: "hours", + get: function get() { + return this.isValid ? this.values.hours || 0 : NaN; + } + + /** + * Get the minutes. + * @type {number} + */ + }, { + key: "minutes", + get: function get() { + return this.isValid ? this.values.minutes || 0 : NaN; + } + + /** + * Get the seconds. + * @return {number} + */ + }, { + key: "seconds", + get: function get() { + return this.isValid ? this.values.seconds || 0 : NaN; + } + + /** + * Get the milliseconds. + * @return {number} + */ + }, { + key: "milliseconds", + get: function get() { + return this.isValid ? this.values.milliseconds || 0 : NaN; + } + + /** + * Returns whether the Duration is invalid. Invalid durations are returned by diff operations + * on invalid DateTimes or Intervals. + * @return {boolean} + */ + }, { + key: "isValid", + get: function get() { + return this.invalid === null; + } + + /** + * Returns an error code if this Duration became invalid, or null if the Duration is valid + * @return {string} + */ + }, { + key: "invalidReason", + get: function get() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this Duration became invalid, or null if the Duration is valid + * @type {string} + */ + }, { + key: "invalidExplanation", + get: function get() { + return this.invalid ? this.invalid.explanation : null; + } + }]); + return Duration; + }(Symbol.for("nodejs.util.inspect.custom")); + + var INVALID$1 = "Invalid Interval"; + + // checks if the start is equal to or before the end + function validateStartEnd(start, end) { + if (!start || !start.isValid) { + return Interval.invalid("missing or invalid start"); + } else if (!end || !end.isValid) { + return Interval.invalid("missing or invalid end"); + } else if (end < start) { + return Interval.invalid("end before start", "The end of an interval must be after its start, but you had start=" + start.toISO() + " and end=" + end.toISO()); + } else { + return null; + } + } + + /** + * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them. + * + * Here is a brief overview of the most commonly used methods and getters in Interval: + * + * * **Creation** To create an Interval, use {@link Interval.fromDateTimes}, {@link Interval.after}, {@link Interval.before}, or {@link Interval.fromISO}. + * * **Accessors** Use {@link Interval#start} and {@link Interval#end} to get the start and end. + * * **Interrogation** To analyze the Interval, use {@link Interval#count}, {@link Interval#length}, {@link Interval#hasSame}, {@link Interval#contains}, {@link Interval#isAfter}, or {@link Interval#isBefore}. + * * **Transformation** To create other Intervals out of this one, use {@link Interval#set}, {@link Interval#splitAt}, {@link Interval#splitBy}, {@link Interval#divideEqually}, {@link Interval.merge}, {@link Interval.xor}, {@link Interval#union}, {@link Interval#intersection}, or {@link Interval#difference}. + * * **Comparison** To compare this Interval to another one, use {@link Interval#equals}, {@link Interval#overlaps}, {@link Interval#abutsStart}, {@link Interval#abutsEnd}, {@link Interval#engulfs} + * * **Output** To convert the Interval into other representations, see {@link Interval#toString}, {@link Interval#toLocaleString}, {@link Interval#toISO}, {@link Interval#toISODate}, {@link Interval#toISOTime}, {@link Interval#toFormat}, and {@link Interval#toDuration}. + */ + var Interval = /*#__PURE__*/function (_Symbol$for) { + /** + * @private + */ + function Interval(config) { + /** + * @access private + */ + this.s = config.start; + /** + * @access private + */ + this.e = config.end; + /** + * @access private + */ + this.invalid = config.invalid || null; + /** + * @access private + */ + this.isLuxonInterval = true; + } + + /** + * Create an invalid Interval. + * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {Interval} + */ + Interval.invalid = function invalid(reason, explanation) { + if (explanation === void 0) { + explanation = null; + } + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the Interval is invalid"); + } + var invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidIntervalError(invalid); + } else { + return new Interval({ + invalid: invalid + }); + } + } + + /** + * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end. + * @param {DateTime|Date|Object} start + * @param {DateTime|Date|Object} end + * @return {Interval} + */; + Interval.fromDateTimes = function fromDateTimes(start, end) { + var builtStart = friendlyDateTime(start), + builtEnd = friendlyDateTime(end); + var validateError = validateStartEnd(builtStart, builtEnd); + if (validateError == null) { + return new Interval({ + start: builtStart, + end: builtEnd + }); + } else { + return validateError; + } + } + + /** + * Create an Interval from a start DateTime and a Duration to extend to. + * @param {DateTime|Date|Object} start + * @param {Duration|Object|number} duration - the length of the Interval. + * @return {Interval} + */; + Interval.after = function after(start, duration) { + var dur = Duration.fromDurationLike(duration), + dt = friendlyDateTime(start); + return Interval.fromDateTimes(dt, dt.plus(dur)); + } + + /** + * Create an Interval from an end DateTime and a Duration to extend backwards to. + * @param {DateTime|Date|Object} end + * @param {Duration|Object|number} duration - the length of the Interval. + * @return {Interval} + */; + Interval.before = function before(end, duration) { + var dur = Duration.fromDurationLike(duration), + dt = friendlyDateTime(end); + return Interval.fromDateTimes(dt.minus(dur), dt); + } + + /** + * Create an Interval from an ISO 8601 string. + * Accepts `/`, `/`, and `/` formats. + * @param {string} text - the ISO string to parse + * @param {Object} [opts] - options to pass {@link DateTime#fromISO} and optionally {@link Duration#fromISO} + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @return {Interval} + */; + Interval.fromISO = function fromISO(text, opts) { + var _split = (text || "").split("/", 2), + s = _split[0], + e = _split[1]; + if (s && e) { + var start, startIsValid; + try { + start = DateTime.fromISO(s, opts); + startIsValid = start.isValid; + } catch (e) { + startIsValid = false; + } + var end, endIsValid; + try { + end = DateTime.fromISO(e, opts); + endIsValid = end.isValid; + } catch (e) { + endIsValid = false; + } + if (startIsValid && endIsValid) { + return Interval.fromDateTimes(start, end); + } + if (startIsValid) { + var dur = Duration.fromISO(e, opts); + if (dur.isValid) { + return Interval.after(start, dur); + } + } else if (endIsValid) { + var _dur = Duration.fromISO(s, opts); + if (_dur.isValid) { + return Interval.before(end, _dur); + } + } + } + return Interval.invalid("unparsable", "the input \"" + text + "\" can't be parsed as ISO 8601"); + } + + /** + * Check if an object is an Interval. Works across context boundaries + * @param {object} o + * @return {boolean} + */; + Interval.isInterval = function isInterval(o) { + return o && o.isLuxonInterval || false; + } + + /** + * Returns the start of the Interval + * @type {DateTime} + */; + var _proto = Interval.prototype; + /** + * Returns the length of the Interval in the specified unit. + * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in. + * @return {number} + */ + _proto.length = function length(unit) { + if (unit === void 0) { + unit = "milliseconds"; + } + return this.isValid ? this.toDuration.apply(this, [unit]).get(unit) : NaN; + } + + /** + * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part. + * Unlike {@link Interval#length} this counts sections of the calendar, not periods of time, e.g. specifying 'day' + * asks 'what dates are included in this interval?', not 'how many days long is this interval?' + * @param {string} [unit='milliseconds'] - the unit of time to count. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; this operation will always use the locale of the start DateTime + * @return {number} + */; + _proto.count = function count(unit, opts) { + if (unit === void 0) { + unit = "milliseconds"; + } + if (!this.isValid) return NaN; + var start = this.start.startOf(unit, opts); + var end; + if (opts != null && opts.useLocaleWeeks) { + end = this.end.reconfigure({ + locale: start.locale + }); + } else { + end = this.end; + } + end = end.startOf(unit, opts); + return Math.floor(end.diff(start, unit).get(unit)) + (end.valueOf() !== this.end.valueOf()); + } + + /** + * Returns whether this Interval's start and end are both in the same unit of time + * @param {string} unit - the unit of time to check sameness on + * @return {boolean} + */; + _proto.hasSame = function hasSame(unit) { + return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false; + } + + /** + * Return whether this Interval has the same start and end DateTimes. + * @return {boolean} + */; + _proto.isEmpty = function isEmpty() { + return this.s.valueOf() === this.e.valueOf(); + } + + /** + * Return whether this Interval's start is after the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */; + _proto.isAfter = function isAfter(dateTime) { + if (!this.isValid) return false; + return this.s > dateTime; + } + + /** + * Return whether this Interval's end is before the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */; + _proto.isBefore = function isBefore(dateTime) { + if (!this.isValid) return false; + return this.e <= dateTime; + } + + /** + * Return whether this Interval contains the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */; + _proto.contains = function contains(dateTime) { + if (!this.isValid) return false; + return this.s <= dateTime && this.e > dateTime; + } + + /** + * "Sets" the start and/or end dates. Returns a newly-constructed Interval. + * @param {Object} values - the values to set + * @param {DateTime} values.start - the starting DateTime + * @param {DateTime} values.end - the ending DateTime + * @return {Interval} + */; + _proto.set = function set(_temp) { + var _ref = _temp === void 0 ? {} : _temp, + start = _ref.start, + end = _ref.end; + if (!this.isValid) return this; + return Interval.fromDateTimes(start || this.s, end || this.e); + } + + /** + * Split this Interval at each of the specified DateTimes + * @param {...DateTime} dateTimes - the unit of time to count. + * @return {Array} + */; + _proto.splitAt = function splitAt() { + var _this = this; + if (!this.isValid) return []; + for (var _len = arguments.length, dateTimes = new Array(_len), _key = 0; _key < _len; _key++) { + dateTimes[_key] = arguments[_key]; + } + var sorted = dateTimes.map(friendlyDateTime).filter(function (d) { + return _this.contains(d); + }).sort(function (a, b) { + return a.toMillis() - b.toMillis(); + }), + results = []; + var s = this.s, + i = 0; + while (s < this.e) { + var added = sorted[i] || this.e, + next = +added > +this.e ? this.e : added; + results.push(Interval.fromDateTimes(s, next)); + s = next; + i += 1; + } + return results; + } + + /** + * Split this Interval into smaller Intervals, each of the specified length. + * Left over time is grouped into a smaller interval + * @param {Duration|Object|number} duration - The length of each resulting interval. + * @return {Array} + */; + _proto.splitBy = function splitBy(duration) { + var dur = Duration.fromDurationLike(duration); + if (!this.isValid || !dur.isValid || dur.as("milliseconds") === 0) { + return []; + } + var s = this.s, + idx = 1, + next; + var results = []; + while (s < this.e) { + var added = this.start.plus(dur.mapUnits(function (x) { + return x * idx; + })); + next = +added > +this.e ? this.e : added; + results.push(Interval.fromDateTimes(s, next)); + s = next; + idx += 1; + } + return results; + } + + /** + * Split this Interval into the specified number of smaller intervals. + * @param {number} numberOfParts - The number of Intervals to divide the Interval into. + * @return {Array} + */; + _proto.divideEqually = function divideEqually(numberOfParts) { + if (!this.isValid) return []; + return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts); + } + + /** + * Return whether this Interval overlaps with the specified Interval + * @param {Interval} other + * @return {boolean} + */; + _proto.overlaps = function overlaps(other) { + return this.e > other.s && this.s < other.e; + } + + /** + * Return whether this Interval's end is adjacent to the specified Interval's start. + * @param {Interval} other + * @return {boolean} + */; + _proto.abutsStart = function abutsStart(other) { + if (!this.isValid) return false; + return +this.e === +other.s; + } + + /** + * Return whether this Interval's start is adjacent to the specified Interval's end. + * @param {Interval} other + * @return {boolean} + */; + _proto.abutsEnd = function abutsEnd(other) { + if (!this.isValid) return false; + return +other.e === +this.s; + } + + /** + * Returns true if this Interval fully contains the specified Interval, specifically if the intersect (of this Interval and the other Interval) is equal to the other Interval; false otherwise. + * @param {Interval} other + * @return {boolean} + */; + _proto.engulfs = function engulfs(other) { + if (!this.isValid) return false; + return this.s <= other.s && this.e >= other.e; + } + + /** + * Return whether this Interval has the same start and end as the specified Interval. + * @param {Interval} other + * @return {boolean} + */; + _proto.equals = function equals(other) { + if (!this.isValid || !other.isValid) { + return false; + } + return this.s.equals(other.s) && this.e.equals(other.e); + } + + /** + * Return an Interval representing the intersection of this Interval and the specified Interval. + * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals. + * Returns null if the intersection is empty, meaning, the intervals don't intersect. + * @param {Interval} other + * @return {Interval} + */; + _proto.intersection = function intersection(other) { + if (!this.isValid) return this; + var s = this.s > other.s ? this.s : other.s, + e = this.e < other.e ? this.e : other.e; + if (s >= e) { + return null; + } else { + return Interval.fromDateTimes(s, e); + } + } + + /** + * Return an Interval representing the union of this Interval and the specified Interval. + * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals. + * @param {Interval} other + * @return {Interval} + */; + _proto.union = function union(other) { + if (!this.isValid) return this; + var s = this.s < other.s ? this.s : other.s, + e = this.e > other.e ? this.e : other.e; + return Interval.fromDateTimes(s, e); + } + + /** + * Merge an array of Intervals into an equivalent minimal set of Intervals. + * Combines overlapping and adjacent Intervals. + * The resulting array will contain the Intervals in ascending order, that is, starting with the earliest Interval + * and ending with the latest. + * + * @param {Array} intervals + * @return {Array} + */; + Interval.merge = function merge(intervals) { + var _intervals$sort$reduc = intervals.sort(function (a, b) { + return a.s - b.s; + }).reduce(function (_ref2, item) { + var sofar = _ref2[0], + current = _ref2[1]; + if (!current) { + return [sofar, item]; + } else if (current.overlaps(item) || current.abutsStart(item)) { + return [sofar, current.union(item)]; + } else { + return [sofar.concat([current]), item]; + } + }, [[], null]), + found = _intervals$sort$reduc[0], + final = _intervals$sort$reduc[1]; + if (final) { + found.push(final); + } + return found; + } + + /** + * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals. + * @param {Array} intervals + * @return {Array} + */; + Interval.xor = function xor(intervals) { + var _Array$prototype; + var start = null, + currentCount = 0; + var results = [], + ends = intervals.map(function (i) { + return [{ + time: i.s, + type: "s" + }, { + time: i.e, + type: "e" + }]; + }), + flattened = (_Array$prototype = Array.prototype).concat.apply(_Array$prototype, ends), + arr = flattened.sort(function (a, b) { + return a.time - b.time; + }); + for (var _iterator = _createForOfIteratorHelperLoose(arr), _step; !(_step = _iterator()).done;) { + var i = _step.value; + currentCount += i.type === "s" ? 1 : -1; + if (currentCount === 1) { + start = i.time; + } else { + if (start && +start !== +i.time) { + results.push(Interval.fromDateTimes(start, i.time)); + } + start = null; + } + } + return Interval.merge(results); + } + + /** + * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals. + * @param {...Interval} intervals + * @return {Array} + */; + _proto.difference = function difference() { + var _this2 = this; + for (var _len2 = arguments.length, intervals = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + intervals[_key2] = arguments[_key2]; + } + return Interval.xor([this].concat(intervals)).map(function (i) { + return _this2.intersection(i); + }).filter(function (i) { + return i && !i.isEmpty(); + }); + } + + /** + * Returns a string representation of this Interval appropriate for debugging. + * @return {string} + */; + _proto.toString = function toString() { + if (!this.isValid) return INVALID$1; + return "[" + this.s.toISO() + " \u2013 " + this.e.toISO() + ")"; + } + + /** + * Returns a string representation of this Interval appropriate for the REPL. + * @return {string} + */; + _proto[_Symbol$for] = function () { + if (this.isValid) { + return "Interval { start: " + this.s.toISO() + ", end: " + this.e.toISO() + " }"; + } else { + return "Interval { Invalid, reason: " + this.invalidReason + " }"; + } + } + + /** + * Returns a localized string representing this Interval. Accepts the same options as the + * Intl.DateTimeFormat constructor and any presets defined by Luxon, such as + * {@link DateTime.DATE_FULL} or {@link DateTime.TIME_SIMPLE}. The exact behavior of this method + * is browser-specific, but in general it will return an appropriate representation of the + * Interval in the assigned locale. Defaults to the system's locale if no locale has been + * specified. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {Object} [formatOpts=DateTime.DATE_SHORT] - Either a DateTime preset or + * Intl.DateTimeFormat constructor options. + * @param {Object} opts - Options to override the configuration of the start DateTime. + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(); //=> 11/7/2022 – 11/8/2022 + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL); //=> November 7 – 8, 2022 + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL, { locale: 'fr-FR' }); //=> 7–8 novembre 2022 + * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString(DateTime.TIME_SIMPLE); //=> 6:00 – 8:00 PM + * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> Mon, Nov 07, 6:00 – 8:00 p + * @return {string} + */; + _proto.toLocaleString = function toLocaleString(formatOpts, opts) { + if (formatOpts === void 0) { + formatOpts = DATE_SHORT; + } + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.s.loc.clone(opts), formatOpts).formatInterval(this) : INVALID$1; + } + + /** + * Returns an ISO 8601-compliant string representation of this Interval. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @param {Object} opts - The same options as {@link DateTime#toISO} + * @return {string} + */; + _proto.toISO = function toISO(opts) { + if (!this.isValid) return INVALID$1; + return this.s.toISO(opts) + "/" + this.e.toISO(opts); + } + + /** + * Returns an ISO 8601-compliant string representation of date of this Interval. + * The time components are ignored. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @return {string} + */; + _proto.toISODate = function toISODate() { + if (!this.isValid) return INVALID$1; + return this.s.toISODate() + "/" + this.e.toISODate(); + } + + /** + * Returns an ISO 8601-compliant string representation of time of this Interval. + * The date components are ignored. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @param {Object} opts - The same options as {@link DateTime#toISO} + * @return {string} + */; + _proto.toISOTime = function toISOTime(opts) { + if (!this.isValid) return INVALID$1; + return this.s.toISOTime(opts) + "/" + this.e.toISOTime(opts); + } + + /** + * Returns a string representation of this Interval formatted according to the specified format + * string. **You may not want this.** See {@link Interval#toLocaleString} for a more flexible + * formatting tool. + * @param {string} dateFormat - The format string. This string formats the start and end time. + * See {@link DateTime#toFormat} for details. + * @param {Object} opts - Options. + * @param {string} [opts.separator = ' – '] - A separator to place between the start and end + * representations. + * @return {string} + */; + _proto.toFormat = function toFormat(dateFormat, _temp2) { + var _ref3 = _temp2 === void 0 ? {} : _temp2, + _ref3$separator = _ref3.separator, + separator = _ref3$separator === void 0 ? " – " : _ref3$separator; + if (!this.isValid) return INVALID$1; + return "" + this.s.toFormat(dateFormat) + separator + this.e.toFormat(dateFormat); + } + + /** + * Return a Duration representing the time spanned by this interval. + * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration. + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 } + * @return {Duration} + */; + _proto.toDuration = function toDuration(unit, opts) { + if (!this.isValid) { + return Duration.invalid(this.invalidReason); + } + return this.e.diff(this.s, unit, opts); + } + + /** + * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes + * @param {function} mapFn + * @return {Interval} + * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC()) + * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 })) + */; + _proto.mapEndpoints = function mapEndpoints(mapFn) { + return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e)); + }; + _createClass(Interval, [{ + key: "start", + get: function get() { + return this.isValid ? this.s : null; + } + + /** + * Returns the end of the Interval. This is the first instant which is not part of the interval + * (Interval is half-open). + * @type {DateTime} + */ + }, { + key: "end", + get: function get() { + return this.isValid ? this.e : null; + } + + /** + * Returns the last DateTime included in the interval (since end is not part of the interval) + * @type {DateTime} + */ + }, { + key: "lastDateTime", + get: function get() { + return this.isValid ? this.e ? this.e.minus(1) : null : null; + } + + /** + * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'. + * @type {boolean} + */ + }, { + key: "isValid", + get: function get() { + return this.invalidReason === null; + } + + /** + * Returns an error code if this Interval is invalid, or null if the Interval is valid + * @type {string} + */ + }, { + key: "invalidReason", + get: function get() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this Interval became invalid, or null if the Interval is valid + * @type {string} + */ + }, { + key: "invalidExplanation", + get: function get() { + return this.invalid ? this.invalid.explanation : null; + } + }]); + return Interval; + }(Symbol.for("nodejs.util.inspect.custom")); + + /** + * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment. + */ + var Info = /*#__PURE__*/function () { + function Info() {} + /** + * Return whether the specified zone contains a DST. + * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone. + * @return {boolean} + */ + Info.hasDST = function hasDST(zone) { + if (zone === void 0) { + zone = Settings.defaultZone; + } + var proto = DateTime.now().setZone(zone).set({ + month: 12 + }); + return !zone.isUniversal && proto.offset !== proto.set({ + month: 6 + }).offset; + } + + /** + * Return whether the specified zone is a valid IANA specifier. + * @param {string} zone - Zone to check + * @return {boolean} + */; + Info.isValidIANAZone = function isValidIANAZone(zone) { + return IANAZone.isValidZone(zone); + } + + /** + * Converts the input into a {@link Zone} instance. + * + * * If `input` is already a Zone instance, it is returned unchanged. + * * If `input` is a string containing a valid time zone name, a Zone instance + * with that name is returned. + * * If `input` is a string that doesn't refer to a known time zone, a Zone + * instance with {@link Zone#isValid} == false is returned. + * * If `input is a number, a Zone instance with the specified fixed offset + * in minutes is returned. + * * If `input` is `null` or `undefined`, the default zone is returned. + * @param {string|Zone|number} [input] - the value to be converted + * @return {Zone} + */; + Info.normalizeZone = function normalizeZone$1(input) { + return normalizeZone(input, Settings.defaultZone); + } + + /** + * Get the weekday on which the week starts according to the given locale. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number} the start of the week, 1 for Monday through 7 for Sunday + */; + Info.getStartOfWeek = function getStartOfWeek(_temp) { + var _ref = _temp === void 0 ? {} : _temp, + _ref$locale = _ref.locale, + locale = _ref$locale === void 0 ? null : _ref$locale, + _ref$locObj = _ref.locObj, + locObj = _ref$locObj === void 0 ? null : _ref$locObj; + return (locObj || Locale.create(locale)).getStartOfWeek(); + } + + /** + * Get the minimum number of days necessary in a week before it is considered part of the next year according + * to the given locale. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number} + */; + Info.getMinimumDaysInFirstWeek = function getMinimumDaysInFirstWeek(_temp2) { + var _ref2 = _temp2 === void 0 ? {} : _temp2, + _ref2$locale = _ref2.locale, + locale = _ref2$locale === void 0 ? null : _ref2$locale, + _ref2$locObj = _ref2.locObj, + locObj = _ref2$locObj === void 0 ? null : _ref2$locObj; + return (locObj || Locale.create(locale)).getMinDaysInFirstWeek(); + } + + /** + * Get the weekdays, which are considered the weekend according to the given locale + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number[]} an array of weekdays, 1 for Monday through 7 for Sunday + */; + Info.getWeekendWeekdays = function getWeekendWeekdays(_temp3) { + var _ref3 = _temp3 === void 0 ? {} : _temp3, + _ref3$locale = _ref3.locale, + locale = _ref3$locale === void 0 ? null : _ref3$locale, + _ref3$locObj = _ref3.locObj, + locObj = _ref3$locObj === void 0 ? null : _ref3$locObj; + // copy the array, because we cache it internally + return (locObj || Locale.create(locale)).getWeekendDays().slice(); + } + + /** + * Return an array of standalone month names. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long" + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @param {string} [opts.outputCalendar='gregory'] - the calendar + * @example Info.months()[0] //=> 'January' + * @example Info.months('short')[0] //=> 'Jan' + * @example Info.months('numeric')[0] //=> '1' + * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.' + * @example Info.months('numeric', { locale: 'ar' })[0] //=> '١' + * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I' + * @return {Array} + */; + Info.months = function months(length, _temp4) { + if (length === void 0) { + length = "long"; + } + var _ref4 = _temp4 === void 0 ? {} : _temp4, + _ref4$locale = _ref4.locale, + locale = _ref4$locale === void 0 ? null : _ref4$locale, + _ref4$numberingSystem = _ref4.numberingSystem, + numberingSystem = _ref4$numberingSystem === void 0 ? null : _ref4$numberingSystem, + _ref4$locObj = _ref4.locObj, + locObj = _ref4$locObj === void 0 ? null : _ref4$locObj, + _ref4$outputCalendar = _ref4.outputCalendar, + outputCalendar = _ref4$outputCalendar === void 0 ? "gregory" : _ref4$outputCalendar; + return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length); + } + + /** + * Return an array of format month names. + * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that + * changes the string. + * See {@link Info#months} + * @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long" + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @param {string} [opts.outputCalendar='gregory'] - the calendar + * @return {Array} + */; + Info.monthsFormat = function monthsFormat(length, _temp5) { + if (length === void 0) { + length = "long"; + } + var _ref5 = _temp5 === void 0 ? {} : _temp5, + _ref5$locale = _ref5.locale, + locale = _ref5$locale === void 0 ? null : _ref5$locale, + _ref5$numberingSystem = _ref5.numberingSystem, + numberingSystem = _ref5$numberingSystem === void 0 ? null : _ref5$numberingSystem, + _ref5$locObj = _ref5.locObj, + locObj = _ref5$locObj === void 0 ? null : _ref5$locObj, + _ref5$outputCalendar = _ref5.outputCalendar, + outputCalendar = _ref5$outputCalendar === void 0 ? "gregory" : _ref5$outputCalendar; + return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true); + } + + /** + * Return an array of standalone week names. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {string} [length='long'] - the length of the weekday representation, such as "narrow", "short", "long". + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @example Info.weekdays()[0] //=> 'Monday' + * @example Info.weekdays('short')[0] //=> 'Mon' + * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.' + * @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين' + * @return {Array} + */; + Info.weekdays = function weekdays(length, _temp6) { + if (length === void 0) { + length = "long"; + } + var _ref6 = _temp6 === void 0 ? {} : _temp6, + _ref6$locale = _ref6.locale, + locale = _ref6$locale === void 0 ? null : _ref6$locale, + _ref6$numberingSystem = _ref6.numberingSystem, + numberingSystem = _ref6$numberingSystem === void 0 ? null : _ref6$numberingSystem, + _ref6$locObj = _ref6.locObj, + locObj = _ref6$locObj === void 0 ? null : _ref6$locObj; + return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length); + } + + /** + * Return an array of format week names. + * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that + * changes the string. + * See {@link Info#weekdays} + * @param {string} [length='long'] - the length of the month representation, such as "narrow", "short", "long". + * @param {Object} opts - options + * @param {string} [opts.locale=null] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @return {Array} + */; + Info.weekdaysFormat = function weekdaysFormat(length, _temp7) { + if (length === void 0) { + length = "long"; + } + var _ref7 = _temp7 === void 0 ? {} : _temp7, + _ref7$locale = _ref7.locale, + locale = _ref7$locale === void 0 ? null : _ref7$locale, + _ref7$numberingSystem = _ref7.numberingSystem, + numberingSystem = _ref7$numberingSystem === void 0 ? null : _ref7$numberingSystem, + _ref7$locObj = _ref7.locObj, + locObj = _ref7$locObj === void 0 ? null : _ref7$locObj; + return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true); + } + + /** + * Return an array of meridiems. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @example Info.meridiems() //=> [ 'AM', 'PM' ] + * @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ] + * @return {Array} + */; + Info.meridiems = function meridiems(_temp8) { + var _ref8 = _temp8 === void 0 ? {} : _temp8, + _ref8$locale = _ref8.locale, + locale = _ref8$locale === void 0 ? null : _ref8$locale; + return Locale.create(locale).meridiems(); + } + + /** + * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian. + * @param {string} [length='short'] - the length of the era representation, such as "short" or "long". + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @example Info.eras() //=> [ 'BC', 'AD' ] + * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ] + * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ] + * @return {Array} + */; + Info.eras = function eras(length, _temp9) { + if (length === void 0) { + length = "short"; + } + var _ref9 = _temp9 === void 0 ? {} : _temp9, + _ref9$locale = _ref9.locale, + locale = _ref9$locale === void 0 ? null : _ref9$locale; + return Locale.create(locale, null, "gregory").eras(length); + } + + /** + * Return the set of available features in this environment. + * Some features of Luxon are not available in all environments. For example, on older browsers, relative time formatting support is not available. Use this function to figure out if that's the case. + * Keys: + * * `relative`: whether this environment supports relative time formatting + * * `localeWeek`: whether this environment supports different weekdays for the start of the week based on the locale + * @example Info.features() //=> { relative: false, localeWeek: true } + * @return {Object} + */; + Info.features = function features() { + return { + relative: hasRelative(), + localeWeek: hasLocaleWeekInfo() + }; + }; + return Info; + }(); + + function dayDiff(earlier, later) { + var utcDayStart = function utcDayStart(dt) { + return dt.toUTC(0, { + keepLocalTime: true + }).startOf("day").valueOf(); + }, + ms = utcDayStart(later) - utcDayStart(earlier); + return Math.floor(Duration.fromMillis(ms).as("days")); + } + function highOrderDiffs(cursor, later, units) { + var differs = [["years", function (a, b) { + return b.year - a.year; + }], ["quarters", function (a, b) { + return b.quarter - a.quarter + (b.year - a.year) * 4; + }], ["months", function (a, b) { + return b.month - a.month + (b.year - a.year) * 12; + }], ["weeks", function (a, b) { + var days = dayDiff(a, b); + return (days - days % 7) / 7; + }], ["days", dayDiff]]; + var results = {}; + var earlier = cursor; + var lowestOrder, highWater; + + /* This loop tries to diff using larger units first. + If we overshoot, we backtrack and try the next smaller unit. + "cursor" starts out at the earlier timestamp and moves closer and closer to "later" + as we use smaller and smaller units. + highWater keeps track of where we would be if we added one more of the smallest unit, + this is used later to potentially convert any difference smaller than the smallest higher order unit + into a fraction of that smallest higher order unit + */ + for (var _i = 0, _differs = differs; _i < _differs.length; _i++) { + var _differs$_i = _differs[_i], + unit = _differs$_i[0], + differ = _differs$_i[1]; + if (units.indexOf(unit) >= 0) { + lowestOrder = unit; + results[unit] = differ(cursor, later); + highWater = earlier.plus(results); + if (highWater > later) { + // we overshot the end point, backtrack cursor by 1 + results[unit]--; + cursor = earlier.plus(results); + + // if we are still overshooting now, we need to backtrack again + // this happens in certain situations when diffing times in different zones, + // because this calculation ignores time zones + if (cursor > later) { + // keep the "overshot by 1" around as highWater + highWater = cursor; + // backtrack cursor by 1 + results[unit]--; + cursor = earlier.plus(results); + } + } else { + cursor = highWater; + } + } + } + return [cursor, results, highWater, lowestOrder]; + } + function _diff (earlier, later, units, opts) { + var _highOrderDiffs = highOrderDiffs(earlier, later, units), + cursor = _highOrderDiffs[0], + results = _highOrderDiffs[1], + highWater = _highOrderDiffs[2], + lowestOrder = _highOrderDiffs[3]; + var remainingMillis = later - cursor; + var lowerOrderUnits = units.filter(function (u) { + return ["hours", "minutes", "seconds", "milliseconds"].indexOf(u) >= 0; + }); + if (lowerOrderUnits.length === 0) { + if (highWater < later) { + var _cursor$plus; + highWater = cursor.plus((_cursor$plus = {}, _cursor$plus[lowestOrder] = 1, _cursor$plus)); + } + if (highWater !== cursor) { + results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor); + } + } + var duration = Duration.fromObject(results, opts); + if (lowerOrderUnits.length > 0) { + var _Duration$fromMillis; + return (_Duration$fromMillis = Duration.fromMillis(remainingMillis, opts)).shiftTo.apply(_Duration$fromMillis, lowerOrderUnits).plus(duration); + } else { + return duration; + } + } + + var MISSING_FTP = "missing Intl.DateTimeFormat.formatToParts support"; + function intUnit(regex, post) { + if (post === void 0) { + post = function post(i) { + return i; + }; + } + return { + regex: regex, + deser: function deser(_ref) { + var s = _ref[0]; + return post(parseDigits(s)); + } + }; + } + var NBSP = String.fromCharCode(160); + var spaceOrNBSP = "[ " + NBSP + "]"; + var spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, "g"); + function fixListRegex(s) { + // make dots optional and also make them literal + // make space and non breakable space characters interchangeable + return s.replace(/\./g, "\\.?").replace(spaceOrNBSPRegExp, spaceOrNBSP); + } + function stripInsensitivities(s) { + return s.replace(/\./g, "") // ignore dots that were made optional + .replace(spaceOrNBSPRegExp, " ") // interchange space and nbsp + .toLowerCase(); + } + function oneOf(strings, startIndex) { + if (strings === null) { + return null; + } else { + return { + regex: RegExp(strings.map(fixListRegex).join("|")), + deser: function deser(_ref2) { + var s = _ref2[0]; + return strings.findIndex(function (i) { + return stripInsensitivities(s) === stripInsensitivities(i); + }) + startIndex; + } + }; + } + } + function offset(regex, groups) { + return { + regex: regex, + deser: function deser(_ref3) { + var h = _ref3[1], + m = _ref3[2]; + return signedOffset(h, m); + }, + groups: groups + }; + } + function simple(regex) { + return { + regex: regex, + deser: function deser(_ref4) { + var s = _ref4[0]; + return s; + } + }; + } + function escapeToken(value) { + return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); + } + + /** + * @param token + * @param {Locale} loc + */ + function unitForToken(token, loc) { + var one = digitRegex(loc), + two = digitRegex(loc, "{2}"), + three = digitRegex(loc, "{3}"), + four = digitRegex(loc, "{4}"), + six = digitRegex(loc, "{6}"), + oneOrTwo = digitRegex(loc, "{1,2}"), + oneToThree = digitRegex(loc, "{1,3}"), + oneToSix = digitRegex(loc, "{1,6}"), + oneToNine = digitRegex(loc, "{1,9}"), + twoToFour = digitRegex(loc, "{2,4}"), + fourToSix = digitRegex(loc, "{4,6}"), + literal = function literal(t) { + return { + regex: RegExp(escapeToken(t.val)), + deser: function deser(_ref5) { + var s = _ref5[0]; + return s; + }, + literal: true + }; + }, + unitate = function unitate(t) { + if (token.literal) { + return literal(t); + } + switch (t.val) { + // era + case "G": + return oneOf(loc.eras("short"), 0); + case "GG": + return oneOf(loc.eras("long"), 0); + // years + case "y": + return intUnit(oneToSix); + case "yy": + return intUnit(twoToFour, untruncateYear); + case "yyyy": + return intUnit(four); + case "yyyyy": + return intUnit(fourToSix); + case "yyyyyy": + return intUnit(six); + // months + case "M": + return intUnit(oneOrTwo); + case "MM": + return intUnit(two); + case "MMM": + return oneOf(loc.months("short", true), 1); + case "MMMM": + return oneOf(loc.months("long", true), 1); + case "L": + return intUnit(oneOrTwo); + case "LL": + return intUnit(two); + case "LLL": + return oneOf(loc.months("short", false), 1); + case "LLLL": + return oneOf(loc.months("long", false), 1); + // dates + case "d": + return intUnit(oneOrTwo); + case "dd": + return intUnit(two); + // ordinals + case "o": + return intUnit(oneToThree); + case "ooo": + return intUnit(three); + // time + case "HH": + return intUnit(two); + case "H": + return intUnit(oneOrTwo); + case "hh": + return intUnit(two); + case "h": + return intUnit(oneOrTwo); + case "mm": + return intUnit(two); + case "m": + return intUnit(oneOrTwo); + case "q": + return intUnit(oneOrTwo); + case "qq": + return intUnit(two); + case "s": + return intUnit(oneOrTwo); + case "ss": + return intUnit(two); + case "S": + return intUnit(oneToThree); + case "SSS": + return intUnit(three); + case "u": + return simple(oneToNine); + case "uu": + return simple(oneOrTwo); + case "uuu": + return intUnit(one); + // meridiem + case "a": + return oneOf(loc.meridiems(), 0); + // weekYear (k) + case "kkkk": + return intUnit(four); + case "kk": + return intUnit(twoToFour, untruncateYear); + // weekNumber (W) + case "W": + return intUnit(oneOrTwo); + case "WW": + return intUnit(two); + // weekdays + case "E": + case "c": + return intUnit(one); + case "EEE": + return oneOf(loc.weekdays("short", false), 1); + case "EEEE": + return oneOf(loc.weekdays("long", false), 1); + case "ccc": + return oneOf(loc.weekdays("short", true), 1); + case "cccc": + return oneOf(loc.weekdays("long", true), 1); + // offset/zone + case "Z": + case "ZZ": + return offset(new RegExp("([+-]" + oneOrTwo.source + ")(?::(" + two.source + "))?"), 2); + case "ZZZ": + return offset(new RegExp("([+-]" + oneOrTwo.source + ")(" + two.source + ")?"), 2); + // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing + // because we don't have any way to figure out what they are + case "z": + return simple(/[a-z_+-/]{1,256}?/i); + // this special-case "token" represents a place where a macro-token expanded into a white-space literal + // in this case we accept any non-newline white-space + case " ": + return simple(/[^\S\n\r]/); + default: + return literal(t); + } + }; + var unit = unitate(token) || { + invalidReason: MISSING_FTP + }; + unit.token = token; + return unit; + } + var partTypeStyleToTokenVal = { + year: { + "2-digit": "yy", + numeric: "yyyyy" + }, + month: { + numeric: "M", + "2-digit": "MM", + short: "MMM", + long: "MMMM" + }, + day: { + numeric: "d", + "2-digit": "dd" + }, + weekday: { + short: "EEE", + long: "EEEE" + }, + dayperiod: "a", + dayPeriod: "a", + hour12: { + numeric: "h", + "2-digit": "hh" + }, + hour24: { + numeric: "H", + "2-digit": "HH" + }, + minute: { + numeric: "m", + "2-digit": "mm" + }, + second: { + numeric: "s", + "2-digit": "ss" + }, + timeZoneName: { + long: "ZZZZZ", + short: "ZZZ" + } + }; + function tokenForPart(part, formatOpts, resolvedOpts) { + var type = part.type, + value = part.value; + if (type === "literal") { + var isSpace = /^\s+$/.test(value); + return { + literal: !isSpace, + val: isSpace ? " " : value + }; + } + var style = formatOpts[type]; + + // The user might have explicitly specified hour12 or hourCycle + // if so, respect their decision + // if not, refer back to the resolvedOpts, which are based on the locale + var actualType = type; + if (type === "hour") { + if (formatOpts.hour12 != null) { + actualType = formatOpts.hour12 ? "hour12" : "hour24"; + } else if (formatOpts.hourCycle != null) { + if (formatOpts.hourCycle === "h11" || formatOpts.hourCycle === "h12") { + actualType = "hour12"; + } else { + actualType = "hour24"; + } + } else { + // tokens only differentiate between 24 hours or not, + // so we do not need to check hourCycle here, which is less supported anyways + actualType = resolvedOpts.hour12 ? "hour12" : "hour24"; + } + } + var val = partTypeStyleToTokenVal[actualType]; + if (typeof val === "object") { + val = val[style]; + } + if (val) { + return { + literal: false, + val: val + }; + } + return undefined; + } + function buildRegex(units) { + var re = units.map(function (u) { + return u.regex; + }).reduce(function (f, r) { + return f + "(" + r.source + ")"; + }, ""); + return ["^" + re + "$", units]; + } + function match(input, regex, handlers) { + var matches = input.match(regex); + if (matches) { + var all = {}; + var matchIndex = 1; + for (var i in handlers) { + if (hasOwnProperty(handlers, i)) { + var h = handlers[i], + groups = h.groups ? h.groups + 1 : 1; + if (!h.literal && h.token) { + all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups)); + } + matchIndex += groups; + } + } + return [matches, all]; + } else { + return [matches, {}]; + } + } + function dateTimeFromMatches(matches) { + var toField = function toField(token) { + switch (token) { + case "S": + return "millisecond"; + case "s": + return "second"; + case "m": + return "minute"; + case "h": + case "H": + return "hour"; + case "d": + return "day"; + case "o": + return "ordinal"; + case "L": + case "M": + return "month"; + case "y": + return "year"; + case "E": + case "c": + return "weekday"; + case "W": + return "weekNumber"; + case "k": + return "weekYear"; + case "q": + return "quarter"; + default: + return null; + } + }; + var zone = null; + var specificOffset; + if (!isUndefined(matches.z)) { + zone = IANAZone.create(matches.z); + } + if (!isUndefined(matches.Z)) { + if (!zone) { + zone = new FixedOffsetZone(matches.Z); + } + specificOffset = matches.Z; + } + if (!isUndefined(matches.q)) { + matches.M = (matches.q - 1) * 3 + 1; + } + if (!isUndefined(matches.h)) { + if (matches.h < 12 && matches.a === 1) { + matches.h += 12; + } else if (matches.h === 12 && matches.a === 0) { + matches.h = 0; + } + } + if (matches.G === 0 && matches.y) { + matches.y = -matches.y; + } + if (!isUndefined(matches.u)) { + matches.S = parseMillis(matches.u); + } + var vals = Object.keys(matches).reduce(function (r, k) { + var f = toField(k); + if (f) { + r[f] = matches[k]; + } + return r; + }, {}); + return [vals, zone, specificOffset]; + } + var dummyDateTimeCache = null; + function getDummyDateTime() { + if (!dummyDateTimeCache) { + dummyDateTimeCache = DateTime.fromMillis(1555555555555); + } + return dummyDateTimeCache; + } + function maybeExpandMacroToken(token, locale) { + if (token.literal) { + return token; + } + var formatOpts = Formatter.macroTokenToFormatOpts(token.val); + var tokens = formatOptsToTokens(formatOpts, locale); + if (tokens == null || tokens.includes(undefined)) { + return token; + } + return tokens; + } + function expandMacroTokens(tokens, locale) { + var _Array$prototype; + return (_Array$prototype = Array.prototype).concat.apply(_Array$prototype, tokens.map(function (t) { + return maybeExpandMacroToken(t, locale); + })); + } + + /** + * @private + */ + + var TokenParser = /*#__PURE__*/function () { + function TokenParser(locale, format) { + this.locale = locale; + this.format = format; + this.tokens = expandMacroTokens(Formatter.parseFormat(format), locale); + this.units = this.tokens.map(function (t) { + return unitForToken(t, locale); + }); + this.disqualifyingUnit = this.units.find(function (t) { + return t.invalidReason; + }); + if (!this.disqualifyingUnit) { + var _buildRegex = buildRegex(this.units), + regexString = _buildRegex[0], + handlers = _buildRegex[1]; + this.regex = RegExp(regexString, "i"); + this.handlers = handlers; + } + } + var _proto = TokenParser.prototype; + _proto.explainFromTokens = function explainFromTokens(input) { + if (!this.isValid) { + return { + input: input, + tokens: this.tokens, + invalidReason: this.invalidReason + }; + } else { + var _match = match(input, this.regex, this.handlers), + rawMatches = _match[0], + matches = _match[1], + _ref6 = matches ? dateTimeFromMatches(matches) : [null, null, undefined], + result = _ref6[0], + zone = _ref6[1], + specificOffset = _ref6[2]; + if (hasOwnProperty(matches, "a") && hasOwnProperty(matches, "H")) { + throw new ConflictingSpecificationError("Can't include meridiem when specifying 24-hour format"); + } + return { + input: input, + tokens: this.tokens, + regex: this.regex, + rawMatches: rawMatches, + matches: matches, + result: result, + zone: zone, + specificOffset: specificOffset + }; + } + }; + _createClass(TokenParser, [{ + key: "isValid", + get: function get() { + return !this.disqualifyingUnit; + } + }, { + key: "invalidReason", + get: function get() { + return this.disqualifyingUnit ? this.disqualifyingUnit.invalidReason : null; + } + }]); + return TokenParser; + }(); + function explainFromTokens(locale, input, format) { + var parser = new TokenParser(locale, format); + return parser.explainFromTokens(input); + } + function parseFromTokens(locale, input, format) { + var _explainFromTokens = explainFromTokens(locale, input, format), + result = _explainFromTokens.result, + zone = _explainFromTokens.zone, + specificOffset = _explainFromTokens.specificOffset, + invalidReason = _explainFromTokens.invalidReason; + return [result, zone, specificOffset, invalidReason]; + } + function formatOptsToTokens(formatOpts, locale) { + if (!formatOpts) { + return null; + } + var formatter = Formatter.create(locale, formatOpts); + var df = formatter.dtFormatter(getDummyDateTime()); + var parts = df.formatToParts(); + var resolvedOpts = df.resolvedOptions(); + return parts.map(function (p) { + return tokenForPart(p, formatOpts, resolvedOpts); + }); + } + + var INVALID = "Invalid DateTime"; + var MAX_DATE = 8.64e15; + function unsupportedZone(zone) { + return new Invalid("unsupported zone", "the zone \"" + zone.name + "\" is not supported"); + } + + // we cache week data on the DT object and this intermediates the cache + /** + * @param {DateTime} dt + */ + function possiblyCachedWeekData(dt) { + if (dt.weekData === null) { + dt.weekData = gregorianToWeek(dt.c); + } + return dt.weekData; + } + + /** + * @param {DateTime} dt + */ + function possiblyCachedLocalWeekData(dt) { + if (dt.localWeekData === null) { + dt.localWeekData = gregorianToWeek(dt.c, dt.loc.getMinDaysInFirstWeek(), dt.loc.getStartOfWeek()); + } + return dt.localWeekData; + } + + // clone really means, "make a new object with these modifications". all "setters" really use this + // to create a new object while only changing some of the properties + function clone(inst, alts) { + var current = { + ts: inst.ts, + zone: inst.zone, + c: inst.c, + o: inst.o, + loc: inst.loc, + invalid: inst.invalid + }; + return new DateTime(_extends({}, current, alts, { + old: current + })); + } + + // find the right offset a given local time. The o input is our guess, which determines which + // offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST) + function fixOffset(localTS, o, tz) { + // Our UTC time is just a guess because our offset is just a guess + var utcGuess = localTS - o * 60 * 1000; + + // Test whether the zone matches the offset for this ts + var o2 = tz.offset(utcGuess); + + // If so, offset didn't change and we're done + if (o === o2) { + return [utcGuess, o]; + } + + // If not, change the ts by the difference in the offset + utcGuess -= (o2 - o) * 60 * 1000; + + // If that gives us the local time we want, we're done + var o3 = tz.offset(utcGuess); + if (o2 === o3) { + return [utcGuess, o2]; + } + + // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time + return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)]; + } + + // convert an epoch timestamp into a calendar object with the given offset + function tsToObj(ts, offset) { + ts += offset * 60 * 1000; + var d = new Date(ts); + return { + year: d.getUTCFullYear(), + month: d.getUTCMonth() + 1, + day: d.getUTCDate(), + hour: d.getUTCHours(), + minute: d.getUTCMinutes(), + second: d.getUTCSeconds(), + millisecond: d.getUTCMilliseconds() + }; + } + + // convert a calendar object to a epoch timestamp + function objToTS(obj, offset, zone) { + return fixOffset(objToLocalTS(obj), offset, zone); + } + + // create a new DT instance by adding a duration, adjusting for DSTs + function adjustTime(inst, dur) { + var oPre = inst.o, + year = inst.c.year + Math.trunc(dur.years), + month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3, + c = _extends({}, inst.c, { + year: year, + month: month, + day: Math.min(inst.c.day, daysInMonth(year, month)) + Math.trunc(dur.days) + Math.trunc(dur.weeks) * 7 + }), + millisToAdd = Duration.fromObject({ + years: dur.years - Math.trunc(dur.years), + quarters: dur.quarters - Math.trunc(dur.quarters), + months: dur.months - Math.trunc(dur.months), + weeks: dur.weeks - Math.trunc(dur.weeks), + days: dur.days - Math.trunc(dur.days), + hours: dur.hours, + minutes: dur.minutes, + seconds: dur.seconds, + milliseconds: dur.milliseconds + }).as("milliseconds"), + localTS = objToLocalTS(c); + var _fixOffset = fixOffset(localTS, oPre, inst.zone), + ts = _fixOffset[0], + o = _fixOffset[1]; + if (millisToAdd !== 0) { + ts += millisToAdd; + // that could have changed the offset by going over a DST, but we want to keep the ts the same + o = inst.zone.offset(ts); + } + return { + ts: ts, + o: o + }; + } + + // helper useful in turning the results of parsing into real dates + // by handling the zone options + function parseDataToDateTime(parsed, parsedZone, opts, format, text, specificOffset) { + var setZone = opts.setZone, + zone = opts.zone; + if (parsed && Object.keys(parsed).length !== 0 || parsedZone) { + var interpretationZone = parsedZone || zone, + inst = DateTime.fromObject(parsed, _extends({}, opts, { + zone: interpretationZone, + specificOffset: specificOffset + })); + return setZone ? inst : inst.setZone(zone); + } else { + return DateTime.invalid(new Invalid("unparsable", "the input \"" + text + "\" can't be parsed as " + format)); + } + } + + // if you want to output a technical format (e.g. RFC 2822), this helper + // helps handle the details + function toTechFormat(dt, format, allowZ) { + if (allowZ === void 0) { + allowZ = true; + } + return dt.isValid ? Formatter.create(Locale.create("en-US"), { + allowZ: allowZ, + forceSimple: true + }).formatDateTimeFromString(dt, format) : null; + } + function _toISODate(o, extended, precision) { + var longFormat = o.c.year > 9999 || o.c.year < 0; + var c = ""; + if (longFormat && o.c.year >= 0) c += "+"; + c += padStart(o.c.year, longFormat ? 6 : 4); + if (precision === "year") return c; + if (extended) { + c += "-"; + c += padStart(o.c.month); + if (precision === "month") return c; + c += "-"; + } else { + c += padStart(o.c.month); + if (precision === "month") return c; + } + c += padStart(o.c.day); + return c; + } + function _toISOTime(o, extended, suppressSeconds, suppressMilliseconds, includeOffset, extendedZone, precision) { + var showSeconds = !suppressSeconds || o.c.millisecond !== 0 || o.c.second !== 0, + c = ""; + switch (precision) { + case "day": + case "month": + case "year": + break; + default: + c += padStart(o.c.hour); + if (precision === "hour") break; + if (extended) { + c += ":"; + c += padStart(o.c.minute); + if (precision === "minute") break; + if (showSeconds) { + c += ":"; + c += padStart(o.c.second); + } + } else { + c += padStart(o.c.minute); + if (precision === "minute") break; + if (showSeconds) { + c += padStart(o.c.second); + } + } + if (precision === "second") break; + if (showSeconds && (!suppressMilliseconds || o.c.millisecond !== 0)) { + c += "."; + c += padStart(o.c.millisecond, 3); + } + } + if (includeOffset) { + if (o.isOffsetFixed && o.offset === 0 && !extendedZone) { + c += "Z"; + } else if (o.o < 0) { + c += "-"; + c += padStart(Math.trunc(-o.o / 60)); + c += ":"; + c += padStart(Math.trunc(-o.o % 60)); + } else { + c += "+"; + c += padStart(Math.trunc(o.o / 60)); + c += ":"; + c += padStart(Math.trunc(o.o % 60)); + } + } + if (extendedZone) { + c += "[" + o.zone.ianaName + "]"; + } + return c; + } + + // defaults for unspecified units in the supported calendars + var defaultUnitValues = { + month: 1, + day: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }, + defaultWeekUnitValues = { + weekNumber: 1, + weekday: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }, + defaultOrdinalUnitValues = { + ordinal: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }; + + // Units in the supported calendars, sorted by bigness + var orderedUnits = ["year", "month", "day", "hour", "minute", "second", "millisecond"], + orderedWeekUnits = ["weekYear", "weekNumber", "weekday", "hour", "minute", "second", "millisecond"], + orderedOrdinalUnits = ["year", "ordinal", "hour", "minute", "second", "millisecond"]; + + // standardize case and plurality in units + function normalizeUnit(unit) { + var normalized = { + year: "year", + years: "year", + month: "month", + months: "month", + day: "day", + days: "day", + hour: "hour", + hours: "hour", + minute: "minute", + minutes: "minute", + quarter: "quarter", + quarters: "quarter", + second: "second", + seconds: "second", + millisecond: "millisecond", + milliseconds: "millisecond", + weekday: "weekday", + weekdays: "weekday", + weeknumber: "weekNumber", + weeksnumber: "weekNumber", + weeknumbers: "weekNumber", + weekyear: "weekYear", + weekyears: "weekYear", + ordinal: "ordinal" + }[unit.toLowerCase()]; + if (!normalized) throw new InvalidUnitError(unit); + return normalized; + } + function normalizeUnitWithLocalWeeks(unit) { + switch (unit.toLowerCase()) { + case "localweekday": + case "localweekdays": + return "localWeekday"; + case "localweeknumber": + case "localweeknumbers": + return "localWeekNumber"; + case "localweekyear": + case "localweekyears": + return "localWeekYear"; + default: + return normalizeUnit(unit); + } + } + + // cache offsets for zones based on the current timestamp when this function is + // first called. When we are handling a datetime from components like (year, + // month, day, hour) in a time zone, we need a guess about what the timezone + // offset is so that we can convert into a UTC timestamp. One way is to find the + // offset of now in the zone. The actual date may have a different offset (for + // example, if we handle a date in June while we're in December in a zone that + // observes DST), but we can check and adjust that. + // + // When handling many dates, calculating the offset for now every time is + // expensive. It's just a guess, so we can cache the offset to use even if we + // are right on a time change boundary (we'll just correct in the other + // direction). Using a timestamp from first read is a slight optimization for + // handling dates close to the current date, since those dates will usually be + // in the same offset (we could set the timestamp statically, instead). We use a + // single timestamp for all zones to make things a bit more predictable. + // + // This is safe for quickDT (used by local() and utc()) because we don't fill in + // higher-order units from tsNow (as we do in fromObject, this requires that + // offset is calculated from tsNow). + /** + * @param {Zone} zone + * @return {number} + */ + function guessOffsetForZone(zone) { + if (zoneOffsetTs === undefined) { + zoneOffsetTs = Settings.now(); + } + + // Do not cache anything but IANA zones, because it is not safe to do so. + // Guessing an offset which is not present in the zone can cause wrong results from fixOffset + if (zone.type !== "iana") { + return zone.offset(zoneOffsetTs); + } + var zoneName = zone.name; + var offsetGuess = zoneOffsetGuessCache.get(zoneName); + if (offsetGuess === undefined) { + offsetGuess = zone.offset(zoneOffsetTs); + zoneOffsetGuessCache.set(zoneName, offsetGuess); + } + return offsetGuess; + } + + // this is a dumbed down version of fromObject() that runs about 60% faster + // but doesn't do any validation, makes a bunch of assumptions about what units + // are present, and so on. + function quickDT(obj, opts) { + var zone = normalizeZone(opts.zone, Settings.defaultZone); + if (!zone.isValid) { + return DateTime.invalid(unsupportedZone(zone)); + } + var loc = Locale.fromObject(opts); + var ts, o; + + // assume we have the higher-order units + if (!isUndefined(obj.year)) { + for (var _i = 0, _orderedUnits = orderedUnits; _i < _orderedUnits.length; _i++) { + var u = _orderedUnits[_i]; + if (isUndefined(obj[u])) { + obj[u] = defaultUnitValues[u]; + } + } + var invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj); + if (invalid) { + return DateTime.invalid(invalid); + } + var offsetProvis = guessOffsetForZone(zone); + var _objToTS = objToTS(obj, offsetProvis, zone); + ts = _objToTS[0]; + o = _objToTS[1]; + } else { + ts = Settings.now(); + } + return new DateTime({ + ts: ts, + zone: zone, + loc: loc, + o: o + }); + } + function diffRelative(start, end, opts) { + var round = isUndefined(opts.round) ? true : opts.round, + rounding = isUndefined(opts.rounding) ? "trunc" : opts.rounding, + format = function format(c, unit) { + c = roundTo(c, round || opts.calendary ? 0 : 2, opts.calendary ? "round" : rounding); + var formatter = end.loc.clone(opts).relFormatter(opts); + return formatter.format(c, unit); + }, + differ = function differ(unit) { + if (opts.calendary) { + if (!end.hasSame(start, unit)) { + return end.startOf(unit).diff(start.startOf(unit), unit).get(unit); + } else return 0; + } else { + return end.diff(start, unit).get(unit); + } + }; + if (opts.unit) { + return format(differ(opts.unit), opts.unit); + } + for (var _iterator = _createForOfIteratorHelperLoose(opts.units), _step; !(_step = _iterator()).done;) { + var unit = _step.value; + var count = differ(unit); + if (Math.abs(count) >= 1) { + return format(count, unit); + } + } + return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]); + } + function lastOpts(argList) { + var opts = {}, + args; + if (argList.length > 0 && typeof argList[argList.length - 1] === "object") { + opts = argList[argList.length - 1]; + args = Array.from(argList).slice(0, argList.length - 1); + } else { + args = Array.from(argList); + } + return [opts, args]; + } + + /** + * Timestamp to use for cached zone offset guesses (exposed for test) + */ + var zoneOffsetTs; + /** + * Cache for zone offset guesses (exposed for test). + * + * This optimizes quickDT via guessOffsetForZone to avoid repeated calls of + * zone.offset(). + */ + var zoneOffsetGuessCache = new Map(); + + /** + * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them. + * + * A DateTime comprises of: + * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch. + * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone). + * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`. + * + * Here is a brief overview of the most commonly used functionality it provides: + * + * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link DateTime.local}, {@link DateTime.utc}, and (most flexibly) {@link DateTime.fromObject}. To create one from a standard string format, use {@link DateTime.fromISO}, {@link DateTime.fromHTTP}, and {@link DateTime.fromRFC2822}. To create one from a custom string format, use {@link DateTime.fromFormat}. To create one from a native JS date, use {@link DateTime.fromJSDate}. + * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link DateTime#toObject}), use the {@link DateTime#year}, {@link DateTime#month}, + * {@link DateTime#day}, {@link DateTime#hour}, {@link DateTime#minute}, {@link DateTime#second}, {@link DateTime#millisecond} accessors. + * * **Week calendar**: For ISO week calendar attributes, see the {@link DateTime#weekYear}, {@link DateTime#weekNumber}, and {@link DateTime#weekday} accessors. + * * **Configuration** See the {@link DateTime#locale} and {@link DateTime#numberingSystem} accessors. + * * **Transformation**: To transform the DateTime into other DateTimes, use {@link DateTime#set}, {@link DateTime#reconfigure}, {@link DateTime#setZone}, {@link DateTime#setLocale}, {@link DateTime.plus}, {@link DateTime#minus}, {@link DateTime#endOf}, {@link DateTime#startOf}, {@link DateTime#toUTC}, and {@link DateTime#toLocal}. + * * **Output**: To convert the DateTime to other representations, use the {@link DateTime#toRelative}, {@link DateTime#toRelativeCalendar}, {@link DateTime#toJSON}, {@link DateTime#toISO}, {@link DateTime#toHTTP}, {@link DateTime#toObject}, {@link DateTime#toRFC2822}, {@link DateTime#toString}, {@link DateTime#toLocaleString}, {@link DateTime#toFormat}, {@link DateTime#toMillis} and {@link DateTime#toJSDate}. + * + * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation. + */ + var DateTime = /*#__PURE__*/function (_Symbol$for) { + /** + * @access private + */ + function DateTime(config) { + var zone = config.zone || Settings.defaultZone; + var invalid = config.invalid || (Number.isNaN(config.ts) ? new Invalid("invalid input") : null) || (!zone.isValid ? unsupportedZone(zone) : null); + /** + * @access private + */ + this.ts = isUndefined(config.ts) ? Settings.now() : config.ts; + var c = null, + o = null; + if (!invalid) { + var unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone); + if (unchanged) { + var _ref = [config.old.c, config.old.o]; + c = _ref[0]; + o = _ref[1]; + } else { + // If an offset has been passed and we have not been called from + // clone(), we can trust it and avoid the offset calculation. + var ot = isNumber(config.o) && !config.old ? config.o : zone.offset(this.ts); + c = tsToObj(this.ts, ot); + invalid = Number.isNaN(c.year) ? new Invalid("invalid input") : null; + c = invalid ? null : c; + o = invalid ? null : ot; + } + } + + /** + * @access private + */ + this._zone = zone; + /** + * @access private + */ + this.loc = config.loc || Locale.create(); + /** + * @access private + */ + this.invalid = invalid; + /** + * @access private + */ + this.weekData = null; + /** + * @access private + */ + this.localWeekData = null; + /** + * @access private + */ + this.c = c; + /** + * @access private + */ + this.o = o; + /** + * @access private + */ + this.isLuxonDateTime = true; + } + + // CONSTRUCT + + /** + * Create a DateTime for the current instant, in the system's time zone. + * + * Use Settings to override these default values if needed. + * @example DateTime.now().toISO() //~> now in the ISO format + * @return {DateTime} + */ + DateTime.now = function now() { + return new DateTime({}); + } + + /** + * Create a local DateTime + * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used + * @param {number} [month=1] - The month, 1-indexed + * @param {number} [day=1] - The day of the month, 1-indexed + * @param {number} [hour=0] - The hour of the day, in 24-hour time + * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59 + * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59 + * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999 + * @example DateTime.local() //~> now + * @example DateTime.local({ zone: "America/New_York" }) //~> now, in US east coast time + * @example DateTime.local(2017) //~> 2017-01-01T00:00:00 + * @example DateTime.local(2017, 3) //~> 2017-03-01T00:00:00 + * @example DateTime.local(2017, 3, 12, { locale: "fr" }) //~> 2017-03-12T00:00:00, with a French locale + * @example DateTime.local(2017, 3, 12, 5) //~> 2017-03-12T05:00:00 + * @example DateTime.local(2017, 3, 12, 5, { zone: "utc" }) //~> 2017-03-12T05:00:00, in UTC + * @example DateTime.local(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00 + * @example DateTime.local(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10 + * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765 + * @return {DateTime} + */; + DateTime.local = function local() { + var _lastOpts = lastOpts(arguments), + opts = _lastOpts[0], + args = _lastOpts[1], + year = args[0], + month = args[1], + day = args[2], + hour = args[3], + minute = args[4], + second = args[5], + millisecond = args[6]; + return quickDT({ + year: year, + month: month, + day: day, + hour: hour, + minute: minute, + second: second, + millisecond: millisecond + }, opts); + } + + /** + * Create a DateTime in UTC + * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used + * @param {number} [month=1] - The month, 1-indexed + * @param {number} [day=1] - The day of the month + * @param {number} [hour=0] - The hour of the day, in 24-hour time + * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59 + * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59 + * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999 + * @param {Object} options - configuration options for the DateTime + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} [options.outputCalendar] - the output calendar to set on the resulting DateTime instance + * @param {string} [options.numberingSystem] - the numbering system to set on the resulting DateTime instance + * @param {string} [options.weekSettings] - the week settings to set on the resulting DateTime instance + * @example DateTime.utc() //~> now + * @example DateTime.utc(2017) //~> 2017-01-01T00:00:00Z + * @example DateTime.utc(2017, 3) //~> 2017-03-01T00:00:00Z + * @example DateTime.utc(2017, 3, 12) //~> 2017-03-12T00:00:00Z + * @example DateTime.utc(2017, 3, 12, 5) //~> 2017-03-12T05:00:00Z + * @example DateTime.utc(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00Z + * @example DateTime.utc(2017, 3, 12, 5, 45, { locale: "fr" }) //~> 2017-03-12T05:45:00Z with a French locale + * @example DateTime.utc(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10Z + * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765, { locale: "fr" }) //~> 2017-03-12T05:45:10.765Z with a French locale + * @return {DateTime} + */; + DateTime.utc = function utc() { + var _lastOpts2 = lastOpts(arguments), + opts = _lastOpts2[0], + args = _lastOpts2[1], + year = args[0], + month = args[1], + day = args[2], + hour = args[3], + minute = args[4], + second = args[5], + millisecond = args[6]; + opts.zone = FixedOffsetZone.utcInstance; + return quickDT({ + year: year, + month: month, + day: day, + hour: hour, + minute: minute, + second: second, + millisecond: millisecond + }, opts); + } + + /** + * Create a DateTime from a JavaScript Date object. Uses the default zone. + * @param {Date} date - a JavaScript Date object + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @return {DateTime} + */; + DateTime.fromJSDate = function fromJSDate(date, options) { + if (options === void 0) { + options = {}; + } + var ts = isDate(date) ? date.valueOf() : NaN; + if (Number.isNaN(ts)) { + return DateTime.invalid("invalid input"); + } + var zoneToUse = normalizeZone(options.zone, Settings.defaultZone); + if (!zoneToUse.isValid) { + return DateTime.invalid(unsupportedZone(zoneToUse)); + } + return new DateTime({ + ts: ts, + zone: zoneToUse, + loc: Locale.fromObject(options) + }); + } + + /** + * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone. + * @param {number} milliseconds - a number of milliseconds since 1970 UTC + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance + * @return {DateTime} + */; + DateTime.fromMillis = function fromMillis(milliseconds, options) { + if (options === void 0) { + options = {}; + } + if (!isNumber(milliseconds)) { + throw new InvalidArgumentError("fromMillis requires a numerical input, but received a " + typeof milliseconds + " with value " + milliseconds); + } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) { + // this isn't perfect because we can still end up out of range because of additional shifting, but it's a start + return DateTime.invalid("Timestamp out of range"); + } else { + return new DateTime({ + ts: milliseconds, + zone: normalizeZone(options.zone, Settings.defaultZone), + loc: Locale.fromObject(options) + }); + } + } + + /** + * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone. + * @param {number} seconds - a number of seconds since 1970 UTC + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance + * @return {DateTime} + */; + DateTime.fromSeconds = function fromSeconds(seconds, options) { + if (options === void 0) { + options = {}; + } + if (!isNumber(seconds)) { + throw new InvalidArgumentError("fromSeconds requires a numerical input"); + } else { + return new DateTime({ + ts: seconds * 1000, + zone: normalizeZone(options.zone, Settings.defaultZone), + loc: Locale.fromObject(options) + }); + } + } + + /** + * Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults. + * @param {Object} obj - the object to create the DateTime from + * @param {number} obj.year - a year, such as 1987 + * @param {number} obj.month - a month, 1-12 + * @param {number} obj.day - a day of the month, 1-31, depending on the month + * @param {number} obj.ordinal - day of the year, 1-365 or 366 + * @param {number} obj.weekYear - an ISO week year + * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year + * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday + * @param {number} obj.localWeekYear - a week year, according to the locale + * @param {number} obj.localWeekNumber - a week number, between 1 and 52 or 53, depending on the year, according to the locale + * @param {number} obj.localWeekday - a weekday, 1-7, where 1 is the first and 7 is the last day of the week, according to the locale + * @param {number} obj.hour - hour of the day, 0-23 + * @param {number} obj.minute - minute of the hour, 0-59 + * @param {number} obj.second - second of the minute, 0-59 + * @param {number} obj.millisecond - millisecond of the second, 0-999 + * @param {Object} opts - options for creating this DateTime + * @param {string|Zone} [opts.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone() + * @param {string} [opts.locale='system\'s locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25' + * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01' + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06 + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'utc' }), + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'local' }) + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'America/New_York' }) + * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13' + * @example DateTime.fromObject({ localWeekYear: 2022, localWeekNumber: 1, localWeekday: 1 }, { locale: "en-US" }).toISODate() //=> '2021-12-26' + * @return {DateTime} + */; + DateTime.fromObject = function fromObject(obj, opts) { + if (opts === void 0) { + opts = {}; + } + obj = obj || {}; + var zoneToUse = normalizeZone(opts.zone, Settings.defaultZone); + if (!zoneToUse.isValid) { + return DateTime.invalid(unsupportedZone(zoneToUse)); + } + var loc = Locale.fromObject(opts); + var normalized = normalizeObject(obj, normalizeUnitWithLocalWeeks); + var _usesLocalWeekValues = usesLocalWeekValues(normalized, loc), + minDaysInFirstWeek = _usesLocalWeekValues.minDaysInFirstWeek, + startOfWeek = _usesLocalWeekValues.startOfWeek; + var tsNow = Settings.now(), + offsetProvis = !isUndefined(opts.specificOffset) ? opts.specificOffset : zoneToUse.offset(tsNow), + containsOrdinal = !isUndefined(normalized.ordinal), + containsGregorYear = !isUndefined(normalized.year), + containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), + containsGregor = containsGregorYear || containsGregorMD, + definiteWeekDef = normalized.weekYear || normalized.weekNumber; + + // cases: + // just a weekday -> this week's instance of that weekday, no worries + // (gregorian data or ordinal) + (weekYear or weekNumber) -> error + // (gregorian month or day) + ordinal -> error + // otherwise just use weeks or ordinals or gregorian, depending on what's specified + + if ((containsGregor || containsOrdinal) && definiteWeekDef) { + throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals"); + } + if (containsGregorMD && containsOrdinal) { + throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); + } + var useWeekData = definiteWeekDef || normalized.weekday && !containsGregor; + + // configure ourselves to deal with gregorian dates or week stuff + var units, + defaultValues, + objNow = tsToObj(tsNow, offsetProvis); + if (useWeekData) { + units = orderedWeekUnits; + defaultValues = defaultWeekUnitValues; + objNow = gregorianToWeek(objNow, minDaysInFirstWeek, startOfWeek); + } else if (containsOrdinal) { + units = orderedOrdinalUnits; + defaultValues = defaultOrdinalUnitValues; + objNow = gregorianToOrdinal(objNow); + } else { + units = orderedUnits; + defaultValues = defaultUnitValues; + } + + // set default values for missing stuff + var foundFirst = false; + for (var _iterator2 = _createForOfIteratorHelperLoose(units), _step2; !(_step2 = _iterator2()).done;) { + var u = _step2.value; + var v = normalized[u]; + if (!isUndefined(v)) { + foundFirst = true; + } else if (foundFirst) { + normalized[u] = defaultValues[u]; + } else { + normalized[u] = objNow[u]; + } + } + + // make sure the values we have are in range + var higherOrderInvalid = useWeekData ? hasInvalidWeekData(normalized, minDaysInFirstWeek, startOfWeek) : containsOrdinal ? hasInvalidOrdinalData(normalized) : hasInvalidGregorianData(normalized), + invalid = higherOrderInvalid || hasInvalidTimeData(normalized); + if (invalid) { + return DateTime.invalid(invalid); + } + + // compute the actual time + var gregorian = useWeekData ? weekToGregorian(normalized, minDaysInFirstWeek, startOfWeek) : containsOrdinal ? ordinalToGregorian(normalized) : normalized, + _objToTS2 = objToTS(gregorian, offsetProvis, zoneToUse), + tsFinal = _objToTS2[0], + offsetFinal = _objToTS2[1], + inst = new DateTime({ + ts: tsFinal, + zone: zoneToUse, + o: offsetFinal, + loc: loc + }); + + // gregorian data + weekday serves only to validate + if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) { + return DateTime.invalid("mismatched weekday", "you can't specify both a weekday of " + normalized.weekday + " and a date of " + inst.toISO()); + } + if (!inst.isValid) { + return DateTime.invalid(inst.invalid); + } + return inst; + } + + /** + * Create a DateTime from an ISO 8601 string + * @param {string} text - the ISO string + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance + * @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance + * @param {string} [opts.weekSettings] - the week settings to set on the resulting DateTime instance + * @example DateTime.fromISO('2016-05-25T09:08:34.123') + * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00') + * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true}) + * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'}) + * @example DateTime.fromISO('2016-W05-4') + * @return {DateTime} + */; + DateTime.fromISO = function fromISO(text, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseISODate = parseISODate(text), + vals = _parseISODate[0], + parsedZone = _parseISODate[1]; + return parseDataToDateTime(vals, parsedZone, opts, "ISO 8601", text); + } + + /** + * Create a DateTime from an RFC 2822 string + * @param {string} text - the RFC 2822 string + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in. + * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT') + * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600') + * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z') + * @return {DateTime} + */; + DateTime.fromRFC2822 = function fromRFC2822(text, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseRFC2822Date = parseRFC2822Date(text), + vals = _parseRFC2822Date[0], + parsedZone = _parseRFC2822Date[1]; + return parseDataToDateTime(vals, parsedZone, opts, "RFC 2822", text); + } + + /** + * Create a DateTime from an HTTP header date + * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 + * @param {string} text - the HTTP header date + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in. + * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods. + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT') + * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT') + * @example DateTime.fromHTTP('Sun Nov 6 08:49:37 1994') + * @return {DateTime} + */; + DateTime.fromHTTP = function fromHTTP(text, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseHTTPDate = parseHTTPDate(text), + vals = _parseHTTPDate[0], + parsedZone = _parseHTTPDate[1]; + return parseDataToDateTime(vals, parsedZone, opts, "HTTP", opts); + } + + /** + * Create a DateTime from an input string and format string. + * Defaults to en-US if no locale has been specified, regardless of the system's locale. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/parsing?id=table-of-tokens). + * @param {string} text - the string to parse + * @param {string} fmt - the format the string is expected to be in (see the link below for the formats) + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale + * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @return {DateTime} + */; + DateTime.fromFormat = function fromFormat(text, fmt, opts) { + if (opts === void 0) { + opts = {}; + } + if (isUndefined(text) || isUndefined(fmt)) { + throw new InvalidArgumentError("fromFormat requires an input string and a format"); + } + var _opts = opts, + _opts$locale = _opts.locale, + locale = _opts$locale === void 0 ? null : _opts$locale, + _opts$numberingSystem = _opts.numberingSystem, + numberingSystem = _opts$numberingSystem === void 0 ? null : _opts$numberingSystem, + localeToUse = Locale.fromOpts({ + locale: locale, + numberingSystem: numberingSystem, + defaultToEN: true + }), + _parseFromTokens = parseFromTokens(localeToUse, text, fmt), + vals = _parseFromTokens[0], + parsedZone = _parseFromTokens[1], + specificOffset = _parseFromTokens[2], + invalid = _parseFromTokens[3]; + if (invalid) { + return DateTime.invalid(invalid); + } else { + return parseDataToDateTime(vals, parsedZone, opts, "format " + fmt, text, specificOffset); + } + } + + /** + * @deprecated use fromFormat instead + */; + DateTime.fromString = function fromString(text, fmt, opts) { + if (opts === void 0) { + opts = {}; + } + return DateTime.fromFormat(text, fmt, opts); + } + + /** + * Create a DateTime from a SQL date, time, or datetime + * Defaults to en-US if no locale has been specified, regardless of the system's locale + * @param {string} text - the string to parse + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale + * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @example DateTime.fromSQL('2017-05-15') + * @example DateTime.fromSQL('2017-05-15 09:12:34') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true }) + * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' }) + * @example DateTime.fromSQL('09:12:34.342') + * @return {DateTime} + */; + DateTime.fromSQL = function fromSQL(text, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseSQL = parseSQL(text), + vals = _parseSQL[0], + parsedZone = _parseSQL[1]; + return parseDataToDateTime(vals, parsedZone, opts, "SQL", text); + } + + /** + * Create an invalid DateTime. + * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent. + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {DateTime} + */; + DateTime.invalid = function invalid(reason, explanation) { + if (explanation === void 0) { + explanation = null; + } + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the DateTime is invalid"); + } + var invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidDateTimeError(invalid); + } else { + return new DateTime({ + invalid: invalid + }); + } + } + + /** + * Check if an object is an instance of DateTime. Works across context boundaries + * @param {object} o + * @return {boolean} + */; + DateTime.isDateTime = function isDateTime(o) { + return o && o.isLuxonDateTime || false; + } + + /** + * Produce the format string for a set of options + * @param formatOpts + * @param localeOpts + * @returns {string} + */; + DateTime.parseFormatForOpts = function parseFormatForOpts(formatOpts, localeOpts) { + if (localeOpts === void 0) { + localeOpts = {}; + } + var tokenList = formatOptsToTokens(formatOpts, Locale.fromObject(localeOpts)); + return !tokenList ? null : tokenList.map(function (t) { + return t ? t.val : null; + }).join(""); + } + + /** + * Produce the the fully expanded format token for the locale + * Does NOT quote characters, so quoted tokens will not round trip correctly + * @param fmt + * @param localeOpts + * @returns {string} + */; + DateTime.expandFormat = function expandFormat(fmt, localeOpts) { + if (localeOpts === void 0) { + localeOpts = {}; + } + var expanded = expandMacroTokens(Formatter.parseFormat(fmt), Locale.fromObject(localeOpts)); + return expanded.map(function (t) { + return t.val; + }).join(""); + }; + DateTime.resetCache = function resetCache() { + zoneOffsetTs = undefined; + zoneOffsetGuessCache.clear(); + } + + // INFO + + /** + * Get the value of unit. + * @param {string} unit - a unit such as 'minute' or 'day' + * @example DateTime.local(2017, 7, 4).get('month'); //=> 7 + * @example DateTime.local(2017, 7, 4).get('day'); //=> 4 + * @return {number} + */; + var _proto = DateTime.prototype; + _proto.get = function get(unit) { + return this[unit]; + } + + /** + * Returns whether the DateTime is valid. Invalid DateTimes occur when: + * * The DateTime was created from invalid calendar information, such as the 13th month or February 30 + * * The DateTime was created by an operation on another invalid date + * @type {boolean} + */; + /** + * Get those DateTimes which have the same local time as this DateTime, but a different offset from UTC + * in this DateTime's zone. During DST changes local time can be ambiguous, for example + * `2023-10-29T02:30:00` in `Europe/Berlin` can have offset `+01:00` or `+02:00`. + * This method will return both possible DateTimes if this DateTime's local time is ambiguous. + * @returns {DateTime[]} + */ + _proto.getPossibleOffsets = function getPossibleOffsets() { + if (!this.isValid || this.isOffsetFixed) { + return [this]; + } + var dayMs = 86400000; + var minuteMs = 60000; + var localTS = objToLocalTS(this.c); + var oEarlier = this.zone.offset(localTS - dayMs); + var oLater = this.zone.offset(localTS + dayMs); + var o1 = this.zone.offset(localTS - oEarlier * minuteMs); + var o2 = this.zone.offset(localTS - oLater * minuteMs); + if (o1 === o2) { + return [this]; + } + var ts1 = localTS - o1 * minuteMs; + var ts2 = localTS - o2 * minuteMs; + var c1 = tsToObj(ts1, o1); + var c2 = tsToObj(ts2, o2); + if (c1.hour === c2.hour && c1.minute === c2.minute && c1.second === c2.second && c1.millisecond === c2.millisecond) { + return [clone(this, { + ts: ts1 + }), clone(this, { + ts: ts2 + })]; + } + return [this]; + } + + /** + * Returns true if this DateTime is in a leap year, false otherwise + * @example DateTime.local(2016).isInLeapYear //=> true + * @example DateTime.local(2013).isInLeapYear //=> false + * @type {boolean} + */; + /** + * Returns the resolved Intl options for this DateTime. + * This is useful in understanding the behavior of formatting methods + * @param {Object} opts - the same options as toLocaleString + * @return {Object} + */ + _proto.resolvedLocaleOptions = function resolvedLocaleOptions(opts) { + if (opts === void 0) { + opts = {}; + } + var _Formatter$create$res = Formatter.create(this.loc.clone(opts), opts).resolvedOptions(this), + locale = _Formatter$create$res.locale, + numberingSystem = _Formatter$create$res.numberingSystem, + calendar = _Formatter$create$res.calendar; + return { + locale: locale, + numberingSystem: numberingSystem, + outputCalendar: calendar + }; + } + + // TRANSFORM + + /** + * "Set" the DateTime's zone to UTC. Returns a newly-constructed DateTime. + * + * Equivalent to {@link DateTime#setZone}('utc') + * @param {number} [offset=0] - optionally, an offset from UTC in minutes + * @param {Object} [opts={}] - options to pass to `setZone()` + * @return {DateTime} + */; + _proto.toUTC = function toUTC(offset, opts) { + if (offset === void 0) { + offset = 0; + } + if (opts === void 0) { + opts = {}; + } + return this.setZone(FixedOffsetZone.instance(offset), opts); + } + + /** + * "Set" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime. + * + * Equivalent to `setZone('local')` + * @return {DateTime} + */; + _proto.toLocal = function toLocal() { + return this.setZone(Settings.defaultZone); + } + + /** + * "Set" the DateTime's zone to specified zone. Returns a newly-constructed DateTime. + * + * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link DateTime#plus}. You may wish to use {@link DateTime#toLocal} and {@link DateTime#toUTC} which provide simple convenience wrappers for commonly used zones. + * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link DateTime#Zone} class. + * @param {Object} opts - options + * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this. + * @return {DateTime} + */; + _proto.setZone = function setZone(zone, _temp) { + var _ref2 = _temp === void 0 ? {} : _temp, + _ref2$keepLocalTime = _ref2.keepLocalTime, + keepLocalTime = _ref2$keepLocalTime === void 0 ? false : _ref2$keepLocalTime, + _ref2$keepCalendarTim = _ref2.keepCalendarTime, + keepCalendarTime = _ref2$keepCalendarTim === void 0 ? false : _ref2$keepCalendarTim; + zone = normalizeZone(zone, Settings.defaultZone); + if (zone.equals(this.zone)) { + return this; + } else if (!zone.isValid) { + return DateTime.invalid(unsupportedZone(zone)); + } else { + var newTS = this.ts; + if (keepLocalTime || keepCalendarTime) { + var offsetGuess = zone.offset(this.ts); + var asObj = this.toObject(); + var _objToTS3 = objToTS(asObj, offsetGuess, zone); + newTS = _objToTS3[0]; + } + return clone(this, { + ts: newTS, + zone: zone + }); + } + } + + /** + * "Set" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime. + * @param {Object} properties - the properties to set + * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' }) + * @return {DateTime} + */; + _proto.reconfigure = function reconfigure(_temp2) { + var _ref3 = _temp2 === void 0 ? {} : _temp2, + locale = _ref3.locale, + numberingSystem = _ref3.numberingSystem, + outputCalendar = _ref3.outputCalendar; + var loc = this.loc.clone({ + locale: locale, + numberingSystem: numberingSystem, + outputCalendar: outputCalendar + }); + return clone(this, { + loc: loc + }); + } + + /** + * "Set" the locale. Returns a newly-constructed DateTime. + * Just a convenient alias for reconfigure({ locale }) + * @example DateTime.local(2017, 5, 25).setLocale('en-GB') + * @return {DateTime} + */; + _proto.setLocale = function setLocale(locale) { + return this.reconfigure({ + locale: locale + }); + } + + /** + * "Set" the values of specified units. Returns a newly-constructed DateTime. + * You can only set units with this method; for "setting" metadata, see {@link DateTime#reconfigure} and {@link DateTime#setZone}. + * + * This method also supports setting locale-based week units, i.e. `localWeekday`, `localWeekNumber` and `localWeekYear`. + * They cannot be mixed with ISO-week units like `weekday`. + * @param {Object} values - a mapping of units to numbers + * @example dt.set({ year: 2017 }) + * @example dt.set({ hour: 8, minute: 30 }) + * @example dt.set({ weekday: 5 }) + * @example dt.set({ year: 2005, ordinal: 234 }) + * @return {DateTime} + */; + _proto.set = function set(values) { + if (!this.isValid) return this; + var normalized = normalizeObject(values, normalizeUnitWithLocalWeeks); + var _usesLocalWeekValues2 = usesLocalWeekValues(normalized, this.loc), + minDaysInFirstWeek = _usesLocalWeekValues2.minDaysInFirstWeek, + startOfWeek = _usesLocalWeekValues2.startOfWeek; + var settingWeekStuff = !isUndefined(normalized.weekYear) || !isUndefined(normalized.weekNumber) || !isUndefined(normalized.weekday), + containsOrdinal = !isUndefined(normalized.ordinal), + containsGregorYear = !isUndefined(normalized.year), + containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), + containsGregor = containsGregorYear || containsGregorMD, + definiteWeekDef = normalized.weekYear || normalized.weekNumber; + if ((containsGregor || containsOrdinal) && definiteWeekDef) { + throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals"); + } + if (containsGregorMD && containsOrdinal) { + throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); + } + var mixed; + if (settingWeekStuff) { + mixed = weekToGregorian(_extends({}, gregorianToWeek(this.c, minDaysInFirstWeek, startOfWeek), normalized), minDaysInFirstWeek, startOfWeek); + } else if (!isUndefined(normalized.ordinal)) { + mixed = ordinalToGregorian(_extends({}, gregorianToOrdinal(this.c), normalized)); + } else { + mixed = _extends({}, this.toObject(), normalized); + + // if we didn't set the day but we ended up on an overflow date, + // use the last day of the right month + if (isUndefined(normalized.day)) { + mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day); + } + } + var _objToTS4 = objToTS(mixed, this.o, this.zone), + ts = _objToTS4[0], + o = _objToTS4[1]; + return clone(this, { + ts: ts, + o: o + }); + } + + /** + * Add a period of time to this DateTime and return the resulting DateTime + * + * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between. + * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @example DateTime.now().plus(123) //~> in 123 milliseconds + * @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes + * @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow + * @example DateTime.now().plus({ days: -1 }) //~> this time yesterday + * @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min + * @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min + * @return {DateTime} + */; + _proto.plus = function plus(duration) { + if (!this.isValid) return this; + var dur = Duration.fromDurationLike(duration); + return clone(this, adjustTime(this, dur)); + } + + /** + * Subtract a period of time to this DateTime and return the resulting DateTime + * See {@link DateTime#plus} + * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + @return {DateTime} + */; + _proto.minus = function minus(duration) { + if (!this.isValid) return this; + var dur = Duration.fromDurationLike(duration).negate(); + return clone(this, adjustTime(this, dur)); + } + + /** + * "Set" this DateTime to the beginning of a unit of time. + * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week + * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01' + * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01' + * @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays + * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00' + * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00' + * @return {DateTime} + */; + _proto.startOf = function startOf(unit, _temp3) { + var _ref4 = _temp3 === void 0 ? {} : _temp3, + _ref4$useLocaleWeeks = _ref4.useLocaleWeeks, + useLocaleWeeks = _ref4$useLocaleWeeks === void 0 ? false : _ref4$useLocaleWeeks; + if (!this.isValid) return this; + var o = {}, + normalizedUnit = Duration.normalizeUnit(unit); + switch (normalizedUnit) { + case "years": + o.month = 1; + // falls through + case "quarters": + case "months": + o.day = 1; + // falls through + case "weeks": + case "days": + o.hour = 0; + // falls through + case "hours": + o.minute = 0; + // falls through + case "minutes": + o.second = 0; + // falls through + case "seconds": + o.millisecond = 0; + break; + // no default, invalid units throw in normalizeUnit() + } + + if (normalizedUnit === "weeks") { + if (useLocaleWeeks) { + var startOfWeek = this.loc.getStartOfWeek(); + var weekday = this.weekday; + if (weekday < startOfWeek) { + o.weekNumber = this.weekNumber - 1; + } + o.weekday = startOfWeek; + } else { + o.weekday = 1; + } + } + if (normalizedUnit === "quarters") { + var q = Math.ceil(this.month / 3); + o.month = (q - 1) * 3 + 1; + } + return this.set(o); + } + + /** + * "Set" this DateTime to the end (meaning the last millisecond) of a unit of time + * @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week + * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays + * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00' + * @return {DateTime} + */; + _proto.endOf = function endOf(unit, opts) { + var _this$plus; + return this.isValid ? this.plus((_this$plus = {}, _this$plus[unit] = 1, _this$plus)).startOf(unit, opts).minus(1) : this; + } + + // OUTPUT + + /** + * Returns a string representation of this DateTime formatted according to the specified format string. + * **You may not want this.** See {@link DateTime#toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/formatting?id=table-of-tokens). + * Defaults to en-US if no locale has been specified, regardless of the system's locale. + * @param {string} fmt - the format string + * @param {Object} opts - opts to override the configuration options on this DateTime + * @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22' + * @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22' + * @example DateTime.now().toFormat('yyyy LLL dd', { locale: "fr" }) //=> '2017 avr. 22' + * @example DateTime.now().toFormat("HH 'hours and' mm 'minutes'") //=> '20 hours and 55 minutes' + * @return {string} + */; + _proto.toFormat = function toFormat(fmt, opts) { + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt) : INVALID; + } + + /** + * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`. + * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation + * of the DateTime in the assigned locale. + * Defaults to the system's locale if no locale has been specified + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param formatOpts {Object} - Intl.DateTimeFormat constructor options and configuration options + * @param {Object} opts - opts to override the configuration options on this DateTime + * @example DateTime.now().toLocaleString(); //=> 4/20/2017 + * @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017' + * @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017' + * @example DateTime.now().toLocaleString(DateTime.DATE_FULL, { locale: 'fr' }); //=> '28 août 2022' + * @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM' + * @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM' + * @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20' + * @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM' + * @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }); //=> '11:32' + * @return {string} + */; + _proto.toLocaleString = function toLocaleString(formatOpts, opts) { + if (formatOpts === void 0) { + formatOpts = DATE_SHORT; + } + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this) : INVALID; + } + + /** + * Returns an array of format "parts", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output. + * Defaults to the system's locale if no locale has been specified + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts + * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`. + * @example DateTime.now().toLocaleParts(); //=> [ + * //=> { type: 'day', value: '25' }, + * //=> { type: 'literal', value: '/' }, + * //=> { type: 'month', value: '05' }, + * //=> { type: 'literal', value: '/' }, + * //=> { type: 'year', value: '1982' } + * //=> ] + */; + _proto.toLocaleParts = function toLocaleParts(opts) { + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this) : []; + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.extendedZone=false] - add the time zone format extension + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'years', 'months', 'days', 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0. + * @example DateTime.utc(1983, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z' + * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00' + * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335' + * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400' + * @example DateTime.now().toISO({ precision: 'day' }) //=> '2017-04-22Z' + * @example DateTime.now().toISO({ precision: 'minute' }) //=> '2017-04-22T20:47Z' + * @return {string|null} + */; + _proto.toISO = function toISO(_temp4) { + var _ref5 = _temp4 === void 0 ? {} : _temp4, + _ref5$format = _ref5.format, + format = _ref5$format === void 0 ? "extended" : _ref5$format, + _ref5$suppressSeconds = _ref5.suppressSeconds, + suppressSeconds = _ref5$suppressSeconds === void 0 ? false : _ref5$suppressSeconds, + _ref5$suppressMillise = _ref5.suppressMilliseconds, + suppressMilliseconds = _ref5$suppressMillise === void 0 ? false : _ref5$suppressMillise, + _ref5$includeOffset = _ref5.includeOffset, + includeOffset = _ref5$includeOffset === void 0 ? true : _ref5$includeOffset, + _ref5$extendedZone = _ref5.extendedZone, + extendedZone = _ref5$extendedZone === void 0 ? false : _ref5$extendedZone, + _ref5$precision = _ref5.precision, + precision = _ref5$precision === void 0 ? "milliseconds" : _ref5$precision; + if (!this.isValid) { + return null; + } + precision = normalizeUnit(precision); + var ext = format === "extended"; + var c = _toISODate(this, ext, precision); + if (orderedUnits.indexOf(precision) >= 3) c += "T"; + c += _toISOTime(this, ext, suppressSeconds, suppressMilliseconds, includeOffset, extendedZone, precision); + return c; + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's date component + * @param {Object} opts - options + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='day'] - truncate output to desired precision: 'years', 'months', or 'days'. + * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25' + * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525' + * @example DateTime.utc(1982, 5, 25).toISODate({ precision: 'month' }) //=> '1982-05' + * @return {string|null} + */; + _proto.toISODate = function toISODate(_temp5) { + var _ref6 = _temp5 === void 0 ? {} : _temp5, + _ref6$format = _ref6.format, + format = _ref6$format === void 0 ? "extended" : _ref6$format, + _ref6$precision = _ref6.precision, + precision = _ref6$precision === void 0 ? "day" : _ref6$precision; + if (!this.isValid) { + return null; + } + return _toISODate(this, format === "extended", normalizeUnit(precision)); + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's week date + * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2' + * @return {string} + */; + _proto.toISOWeekDate = function toISOWeekDate() { + return toTechFormat(this, "kkkk-'W'WW-c"); + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's time component + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.extendedZone=true] - add the time zone format extension + * @param {boolean} [opts.includePrefix=false] - include the `T` prefix + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0. + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z' + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34, second: 56 }).toISOTime({ precision: 'minute' }) //=> '07:34Z' + * @return {string} + */; + _proto.toISOTime = function toISOTime(_temp6) { + var _ref7 = _temp6 === void 0 ? {} : _temp6, + _ref7$suppressMillise = _ref7.suppressMilliseconds, + suppressMilliseconds = _ref7$suppressMillise === void 0 ? false : _ref7$suppressMillise, + _ref7$suppressSeconds = _ref7.suppressSeconds, + suppressSeconds = _ref7$suppressSeconds === void 0 ? false : _ref7$suppressSeconds, + _ref7$includeOffset = _ref7.includeOffset, + includeOffset = _ref7$includeOffset === void 0 ? true : _ref7$includeOffset, + _ref7$includePrefix = _ref7.includePrefix, + includePrefix = _ref7$includePrefix === void 0 ? false : _ref7$includePrefix, + _ref7$extendedZone = _ref7.extendedZone, + extendedZone = _ref7$extendedZone === void 0 ? false : _ref7$extendedZone, + _ref7$format = _ref7.format, + format = _ref7$format === void 0 ? "extended" : _ref7$format, + _ref7$precision = _ref7.precision, + precision = _ref7$precision === void 0 ? "milliseconds" : _ref7$precision; + if (!this.isValid) { + return null; + } + precision = normalizeUnit(precision); + var c = includePrefix && orderedUnits.indexOf(precision) >= 3 ? "T" : ""; + return c + _toISOTime(this, format === "extended", suppressSeconds, suppressMilliseconds, includeOffset, extendedZone, precision); + } + + /** + * Returns an RFC 2822-compatible string representation of this DateTime + * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000' + * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400' + * @return {string} + */; + _proto.toRFC2822 = function toRFC2822() { + return toTechFormat(this, "EEE, dd LLL yyyy HH:mm:ss ZZZ", false); + } + + /** + * Returns a string representation of this DateTime appropriate for use in HTTP headers. The output is always expressed in GMT. + * Specifically, the string conforms to RFC 1123. + * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 + * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT' + * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT' + * @return {string} + */; + _proto.toHTTP = function toHTTP() { + return toTechFormat(this.toUTC(), "EEE, dd LLL yyyy HH:mm:ss 'GMT'"); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL Date + * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13' + * @return {string|null} + */; + _proto.toSQLDate = function toSQLDate() { + if (!this.isValid) { + return null; + } + return _toISODate(this, true); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL Time + * @param {Object} opts - options + * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset. + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00' + * @example DateTime.utc().toSQL() //=> '05:15:16.345' + * @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00' + * @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345' + * @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York' + * @return {string} + */; + _proto.toSQLTime = function toSQLTime(_temp7) { + var _ref8 = _temp7 === void 0 ? {} : _temp7, + _ref8$includeOffset = _ref8.includeOffset, + includeOffset = _ref8$includeOffset === void 0 ? true : _ref8$includeOffset, + _ref8$includeZone = _ref8.includeZone, + includeZone = _ref8$includeZone === void 0 ? false : _ref8$includeZone, + _ref8$includeOffsetSp = _ref8.includeOffsetSpace, + includeOffsetSpace = _ref8$includeOffsetSp === void 0 ? true : _ref8$includeOffsetSp; + var fmt = "HH:mm:ss.SSS"; + if (includeZone || includeOffset) { + if (includeOffsetSpace) { + fmt += " "; + } + if (includeZone) { + fmt += "z"; + } else if (includeOffset) { + fmt += "ZZ"; + } + } + return toTechFormat(this, fmt, true); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL DateTime + * @param {Object} opts - options + * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset. + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00' + * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z' + * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00' + * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000' + * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York' + * @return {string} + */; + _proto.toSQL = function toSQL(opts) { + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) { + return null; + } + return this.toSQLDate() + " " + this.toSQLTime(opts); + } + + /** + * Returns a string representation of this DateTime appropriate for debugging + * @return {string} + */; + _proto.toString = function toString() { + return this.isValid ? this.toISO() : INVALID; + } + + /** + * Returns a string representation of this DateTime appropriate for the REPL. + * @return {string} + */; + _proto[_Symbol$for] = function () { + if (this.isValid) { + return "DateTime { ts: " + this.toISO() + ", zone: " + this.zone.name + ", locale: " + this.locale + " }"; + } else { + return "DateTime { Invalid, reason: " + this.invalidReason + " }"; + } + } + + /** + * Returns the epoch milliseconds of this DateTime. Alias of {@link DateTime#toMillis} + * @return {number} + */; + _proto.valueOf = function valueOf() { + return this.toMillis(); + } + + /** + * Returns the epoch milliseconds of this DateTime. + * @return {number} + */; + _proto.toMillis = function toMillis() { + return this.isValid ? this.ts : NaN; + } + + /** + * Returns the epoch seconds (including milliseconds in the fractional part) of this DateTime. + * @return {number} + */; + _proto.toSeconds = function toSeconds() { + return this.isValid ? this.ts / 1000 : NaN; + } + + /** + * Returns the epoch seconds (as a whole number) of this DateTime. + * @return {number} + */; + _proto.toUnixInteger = function toUnixInteger() { + return this.isValid ? Math.floor(this.ts / 1000) : NaN; + } + + /** + * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON. + * @return {string} + */; + _proto.toJSON = function toJSON() { + return this.toISO(); + } + + /** + * Returns a BSON serializable equivalent to this DateTime. + * @return {Date} + */; + _proto.toBSON = function toBSON() { + return this.toJSDate(); + } + + /** + * Returns a JavaScript object with this DateTime's year, month, day, and so on. + * @param opts - options for generating the object + * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output + * @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 } + * @return {Object} + */; + _proto.toObject = function toObject(opts) { + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) return {}; + var base = _extends({}, this.c); + if (opts.includeConfig) { + base.outputCalendar = this.outputCalendar; + base.numberingSystem = this.loc.numberingSystem; + base.locale = this.loc.locale; + } + return base; + } + + /** + * Returns a JavaScript Date equivalent to this DateTime. + * @return {Date} + */; + _proto.toJSDate = function toJSDate() { + return new Date(this.isValid ? this.ts : NaN); + } + + // COMPARE + + /** + * Return the difference between two DateTimes as a Duration. + * @param {DateTime} otherDateTime - the DateTime to compare this one to + * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration. + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @example + * var i1 = DateTime.fromISO('1982-05-25T09:45'), + * i2 = DateTime.fromISO('1983-10-14T10:30'); + * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 } + * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 } + * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 } + * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 } + * @return {Duration} + */; + _proto.diff = function diff(otherDateTime, unit, opts) { + if (unit === void 0) { + unit = "milliseconds"; + } + if (opts === void 0) { + opts = {}; + } + if (!this.isValid || !otherDateTime.isValid) { + return Duration.invalid("created by diffing an invalid DateTime"); + } + var durOpts = _extends({ + locale: this.locale, + numberingSystem: this.numberingSystem + }, opts); + var units = maybeArray(unit).map(Duration.normalizeUnit), + otherIsLater = otherDateTime.valueOf() > this.valueOf(), + earlier = otherIsLater ? this : otherDateTime, + later = otherIsLater ? otherDateTime : this, + diffed = _diff(earlier, later, units, durOpts); + return otherIsLater ? diffed.negate() : diffed; + } + + /** + * Return the difference between this DateTime and right now. + * See {@link DateTime#diff} + * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @return {Duration} + */; + _proto.diffNow = function diffNow(unit, opts) { + if (unit === void 0) { + unit = "milliseconds"; + } + if (opts === void 0) { + opts = {}; + } + return this.diff(DateTime.now(), unit, opts); + } + + /** + * Return an Interval spanning between this DateTime and another DateTime + * @param {DateTime} otherDateTime - the other end point of the Interval + * @return {Interval|DateTime} + */; + _proto.until = function until(otherDateTime) { + return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this; + } + + /** + * Return whether this DateTime is in the same unit of time as another DateTime. + * Higher-order units must also be identical for this function to return `true`. + * Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link DateTime#setZone} to convert one of the dates if needed. + * @param {DateTime} otherDateTime - the other DateTime + * @param {string} unit - the unit of time to check sameness on + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; only the locale of this DateTime is used + * @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day + * @return {boolean} + */; + _proto.hasSame = function hasSame(otherDateTime, unit, opts) { + if (!this.isValid) return false; + var inputMs = otherDateTime.valueOf(); + var adjustedToZone = this.setZone(otherDateTime.zone, { + keepLocalTime: true + }); + return adjustedToZone.startOf(unit, opts) <= inputMs && inputMs <= adjustedToZone.endOf(unit, opts); + } + + /** + * Equality check + * Two DateTimes are equal if and only if they represent the same millisecond, have the same zone and location, and are both valid. + * To compare just the millisecond values, use `+dt1 === +dt2`. + * @param {DateTime} other - the other DateTime + * @return {boolean} + */; + _proto.equals = function equals(other) { + return this.isValid && other.isValid && this.valueOf() === other.valueOf() && this.zone.equals(other.zone) && this.loc.equals(other.loc); + } + + /** + * Returns a string representation of a this time relative to now, such as "in two days". Can only internationalize if your + * platform supports Intl.RelativeTimeFormat. Rounds towards zero by default. + * @param {Object} options - options that affect the output + * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now. + * @param {string} [options.style="long"] - the style of units, must be "long", "short", or "narrow" + * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of "years", "quarters", "months", "weeks", "days", "hours", "minutes", or "seconds" + * @param {boolean} [options.round=true] - whether to round the numbers in the output. + * @param {string} [options.rounding="trunc"] - rounding method to use when rounding the numbers in the output. Can be "trunc" (toward zero), "expand" (away from zero), "round", "floor", or "ceil". + * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding. + * @param {string} options.locale - override the locale of this DateTime + * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this + * @example DateTime.now().plus({ days: 1 }).toRelative() //=> "in 1 day" + * @example DateTime.now().setLocale("es").toRelative({ days: 1 }) //=> "dentro de 1 día" + * @example DateTime.now().plus({ days: 1 }).toRelative({ locale: "fr" }) //=> "dans 23 heures" + * @example DateTime.now().minus({ days: 2 }).toRelative() //=> "2 days ago" + * @example DateTime.now().minus({ days: 2 }).toRelative({ unit: "hours" }) //=> "48 hours ago" + * @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> "1.5 days ago" + */; + _proto.toRelative = function toRelative(options) { + if (options === void 0) { + options = {}; + } + if (!this.isValid) return null; + var base = options.base || DateTime.fromObject({}, { + zone: this.zone + }), + padding = options.padding ? this < base ? -options.padding : options.padding : 0; + var units = ["years", "months", "days", "hours", "minutes", "seconds"]; + var unit = options.unit; + if (Array.isArray(options.unit)) { + units = options.unit; + unit = undefined; + } + return diffRelative(base, this.plus(padding), _extends({}, options, { + numeric: "always", + units: units, + unit: unit + })); + } + + /** + * Returns a string representation of this date relative to today, such as "yesterday" or "next month". + * Only internationalizes on platforms that supports Intl.RelativeTimeFormat. + * @param {Object} options - options that affect the output + * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now. + * @param {string} options.locale - override the locale of this DateTime + * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of "years", "quarters", "months", "weeks", or "days" + * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this + * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> "tomorrow" + * @example DateTime.now().setLocale("es").plus({ days: 1 }).toRelative() //=> ""mañana" + * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: "fr" }) //=> "demain" + * @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> "2 days ago" + */; + _proto.toRelativeCalendar = function toRelativeCalendar(options) { + if (options === void 0) { + options = {}; + } + if (!this.isValid) return null; + return diffRelative(options.base || DateTime.fromObject({}, { + zone: this.zone + }), this, _extends({}, options, { + numeric: "auto", + units: ["years", "months", "days"], + calendary: true + })); + } + + /** + * Return the min of several date times + * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum + * @return {DateTime} the min DateTime, or undefined if called with no argument + */; + DateTime.min = function min() { + for (var _len = arguments.length, dateTimes = new Array(_len), _key = 0; _key < _len; _key++) { + dateTimes[_key] = arguments[_key]; + } + if (!dateTimes.every(DateTime.isDateTime)) { + throw new InvalidArgumentError("min requires all arguments be DateTimes"); + } + return bestBy(dateTimes, function (i) { + return i.valueOf(); + }, Math.min); + } + + /** + * Return the max of several date times + * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum + * @return {DateTime} the max DateTime, or undefined if called with no argument + */; + DateTime.max = function max() { + for (var _len2 = arguments.length, dateTimes = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + dateTimes[_key2] = arguments[_key2]; + } + if (!dateTimes.every(DateTime.isDateTime)) { + throw new InvalidArgumentError("max requires all arguments be DateTimes"); + } + return bestBy(dateTimes, function (i) { + return i.valueOf(); + }, Math.max); + } + + // MISC + + /** + * Explain how a string would be parsed by fromFormat() + * @param {string} text - the string to parse + * @param {string} fmt - the format the string is expected to be in (see description) + * @param {Object} options - options taken by fromFormat() + * @return {Object} + */; + DateTime.fromFormatExplain = function fromFormatExplain(text, fmt, options) { + if (options === void 0) { + options = {}; + } + var _options = options, + _options$locale = _options.locale, + locale = _options$locale === void 0 ? null : _options$locale, + _options$numberingSys = _options.numberingSystem, + numberingSystem = _options$numberingSys === void 0 ? null : _options$numberingSys, + localeToUse = Locale.fromOpts({ + locale: locale, + numberingSystem: numberingSystem, + defaultToEN: true + }); + return explainFromTokens(localeToUse, text, fmt); + } + + /** + * @deprecated use fromFormatExplain instead + */; + DateTime.fromStringExplain = function fromStringExplain(text, fmt, options) { + if (options === void 0) { + options = {}; + } + return DateTime.fromFormatExplain(text, fmt, options); + } + + /** + * Build a parser for `fmt` using the given locale. This parser can be passed + * to {@link DateTime.fromFormatParser} to a parse a date in this format. This + * can be used to optimize cases where many dates need to be parsed in a + * specific format. + * + * @param {String} fmt - the format the string is expected to be in (see + * description) + * @param {Object} options - options used to set locale and numberingSystem + * for parser + * @returns {TokenParser} - opaque object to be used + */; + DateTime.buildFormatParser = function buildFormatParser(fmt, options) { + if (options === void 0) { + options = {}; + } + var _options2 = options, + _options2$locale = _options2.locale, + locale = _options2$locale === void 0 ? null : _options2$locale, + _options2$numberingSy = _options2.numberingSystem, + numberingSystem = _options2$numberingSy === void 0 ? null : _options2$numberingSy, + localeToUse = Locale.fromOpts({ + locale: locale, + numberingSystem: numberingSystem, + defaultToEN: true + }); + return new TokenParser(localeToUse, fmt); + } + + /** + * Create a DateTime from an input string and format parser. + * + * The format parser must have been created with the same locale as this call. + * + * @param {String} text - the string to parse + * @param {TokenParser} formatParser - parser from {@link DateTime.buildFormatParser} + * @param {Object} opts - options taken by fromFormat() + * @returns {DateTime} + */; + DateTime.fromFormatParser = function fromFormatParser(text, formatParser, opts) { + if (opts === void 0) { + opts = {}; + } + if (isUndefined(text) || isUndefined(formatParser)) { + throw new InvalidArgumentError("fromFormatParser requires an input string and a format parser"); + } + var _opts2 = opts, + _opts2$locale = _opts2.locale, + locale = _opts2$locale === void 0 ? null : _opts2$locale, + _opts2$numberingSyste = _opts2.numberingSystem, + numberingSystem = _opts2$numberingSyste === void 0 ? null : _opts2$numberingSyste, + localeToUse = Locale.fromOpts({ + locale: locale, + numberingSystem: numberingSystem, + defaultToEN: true + }); + if (!localeToUse.equals(formatParser.locale)) { + throw new InvalidArgumentError("fromFormatParser called with a locale of " + localeToUse + ", " + ("but the format parser was created for " + formatParser.locale)); + } + var _formatParser$explain = formatParser.explainFromTokens(text), + result = _formatParser$explain.result, + zone = _formatParser$explain.zone, + specificOffset = _formatParser$explain.specificOffset, + invalidReason = _formatParser$explain.invalidReason; + if (invalidReason) { + return DateTime.invalid(invalidReason); + } else { + return parseDataToDateTime(result, zone, opts, "format " + formatParser.format, text, specificOffset); + } + } + + // FORMAT PRESETS + + /** + * {@link DateTime#toLocaleString} format like 10/14/1983 + * @type {Object} + */; + _createClass(DateTime, [{ + key: "isValid", + get: function get() { + return this.invalid === null; + } + + /** + * Returns an error code if this DateTime is invalid, or null if the DateTime is valid + * @type {string} + */ + }, { + key: "invalidReason", + get: function get() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid + * @type {string} + */ + }, { + key: "invalidExplanation", + get: function get() { + return this.invalid ? this.invalid.explanation : null; + } + + /** + * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime + * + * @type {string} + */ + }, { + key: "locale", + get: function get() { + return this.isValid ? this.loc.locale : null; + } + + /** + * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime + * + * @type {string} + */ + }, { + key: "numberingSystem", + get: function get() { + return this.isValid ? this.loc.numberingSystem : null; + } + + /** + * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime + * + * @type {string} + */ + }, { + key: "outputCalendar", + get: function get() { + return this.isValid ? this.loc.outputCalendar : null; + } + + /** + * Get the time zone associated with this DateTime. + * @type {Zone} + */ + }, { + key: "zone", + get: function get() { + return this._zone; + } + + /** + * Get the name of the time zone. + * @type {string} + */ + }, { + key: "zoneName", + get: function get() { + return this.isValid ? this.zone.name : null; + } + + /** + * Get the year + * @example DateTime.local(2017, 5, 25).year //=> 2017 + * @type {number} + */ + }, { + key: "year", + get: function get() { + return this.isValid ? this.c.year : NaN; + } + + /** + * Get the quarter + * @example DateTime.local(2017, 5, 25).quarter //=> 2 + * @type {number} + */ + }, { + key: "quarter", + get: function get() { + return this.isValid ? Math.ceil(this.c.month / 3) : NaN; + } + + /** + * Get the month (1-12). + * @example DateTime.local(2017, 5, 25).month //=> 5 + * @type {number} + */ + }, { + key: "month", + get: function get() { + return this.isValid ? this.c.month : NaN; + } + + /** + * Get the day of the month (1-30ish). + * @example DateTime.local(2017, 5, 25).day //=> 25 + * @type {number} + */ + }, { + key: "day", + get: function get() { + return this.isValid ? this.c.day : NaN; + } + + /** + * Get the hour of the day (0-23). + * @example DateTime.local(2017, 5, 25, 9).hour //=> 9 + * @type {number} + */ + }, { + key: "hour", + get: function get() { + return this.isValid ? this.c.hour : NaN; + } + + /** + * Get the minute of the hour (0-59). + * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30 + * @type {number} + */ + }, { + key: "minute", + get: function get() { + return this.isValid ? this.c.minute : NaN; + } + + /** + * Get the second of the minute (0-59). + * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52 + * @type {number} + */ + }, { + key: "second", + get: function get() { + return this.isValid ? this.c.second : NaN; + } + + /** + * Get the millisecond of the second (0-999). + * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654 + * @type {number} + */ + }, { + key: "millisecond", + get: function get() { + return this.isValid ? this.c.millisecond : NaN; + } + + /** + * Get the week year + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2014, 12, 31).weekYear //=> 2015 + * @type {number} + */ + }, { + key: "weekYear", + get: function get() { + return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN; + } + + /** + * Get the week number of the week year (1-52ish). + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2017, 5, 25).weekNumber //=> 21 + * @type {number} + */ + }, { + key: "weekNumber", + get: function get() { + return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN; + } + + /** + * Get the day of the week. + * 1 is Monday and 7 is Sunday + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2014, 11, 31).weekday //=> 4 + * @type {number} + */ + }, { + key: "weekday", + get: function get() { + return this.isValid ? possiblyCachedWeekData(this).weekday : NaN; + } + + /** + * Returns true if this date is on a weekend according to the locale, false otherwise + * @returns {boolean} + */ + }, { + key: "isWeekend", + get: function get() { + return this.isValid && this.loc.getWeekendDays().includes(this.weekday); + } + + /** + * Get the day of the week according to the locale. + * 1 is the first day of the week and 7 is the last day of the week. + * If the locale assigns Sunday as the first day of the week, then a date which is a Sunday will return 1, + * @returns {number} + */ + }, { + key: "localWeekday", + get: function get() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekday : NaN; + } + + /** + * Get the week number of the week year according to the locale. Different locales assign week numbers differently, + * because the week can start on different days of the week (see localWeekday) and because a different number of days + * is required for a week to count as the first week of a year. + * @returns {number} + */ + }, { + key: "localWeekNumber", + get: function get() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekNumber : NaN; + } + + /** + * Get the week year according to the locale. Different locales assign week numbers (and therefor week years) + * differently, see localWeekNumber. + * @returns {number} + */ + }, { + key: "localWeekYear", + get: function get() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekYear : NaN; + } + + /** + * Get the ordinal (meaning the day of the year) + * @example DateTime.local(2017, 5, 25).ordinal //=> 145 + * @type {number|DateTime} + */ + }, { + key: "ordinal", + get: function get() { + return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN; + } + + /** + * Get the human readable short month name, such as 'Oct'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).monthShort //=> Oct + * @type {string} + */ + }, { + key: "monthShort", + get: function get() { + return this.isValid ? Info.months("short", { + locObj: this.loc + })[this.month - 1] : null; + } + + /** + * Get the human readable long month name, such as 'October'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).monthLong //=> October + * @type {string} + */ + }, { + key: "monthLong", + get: function get() { + return this.isValid ? Info.months("long", { + locObj: this.loc + })[this.month - 1] : null; + } + + /** + * Get the human readable short weekday, such as 'Mon'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon + * @type {string} + */ + }, { + key: "weekdayShort", + get: function get() { + return this.isValid ? Info.weekdays("short", { + locObj: this.loc + })[this.weekday - 1] : null; + } + + /** + * Get the human readable long weekday, such as 'Monday'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday + * @type {string} + */ + }, { + key: "weekdayLong", + get: function get() { + return this.isValid ? Info.weekdays("long", { + locObj: this.loc + })[this.weekday - 1] : null; + } + + /** + * Get the UTC offset of this DateTime in minutes + * @example DateTime.now().offset //=> -240 + * @example DateTime.utc().offset //=> 0 + * @type {number} + */ + }, { + key: "offset", + get: function get() { + return this.isValid ? +this.o : NaN; + } + + /** + * Get the short human name for the zone's current offset, for example "EST" or "EDT". + * Defaults to the system's locale if no locale has been specified + * @type {string} + */ + }, { + key: "offsetNameShort", + get: function get() { + if (this.isValid) { + return this.zone.offsetName(this.ts, { + format: "short", + locale: this.locale + }); + } else { + return null; + } + } + + /** + * Get the long human name for the zone's current offset, for example "Eastern Standard Time" or "Eastern Daylight Time". + * Defaults to the system's locale if no locale has been specified + * @type {string} + */ + }, { + key: "offsetNameLong", + get: function get() { + if (this.isValid) { + return this.zone.offsetName(this.ts, { + format: "long", + locale: this.locale + }); + } else { + return null; + } + } + + /** + * Get whether this zone's offset ever changes, as in a DST. + * @type {boolean} + */ + }, { + key: "isOffsetFixed", + get: function get() { + return this.isValid ? this.zone.isUniversal : null; + } + + /** + * Get whether the DateTime is in a DST. + * @type {boolean} + */ + }, { + key: "isInDST", + get: function get() { + if (this.isOffsetFixed) { + return false; + } else { + return this.offset > this.set({ + month: 1, + day: 1 + }).offset || this.offset > this.set({ + month: 5 + }).offset; + } + } + }, { + key: "isInLeapYear", + get: function get() { + return isLeapYear(this.year); + } + + /** + * Returns the number of days in this DateTime's month + * @example DateTime.local(2016, 2).daysInMonth //=> 29 + * @example DateTime.local(2016, 3).daysInMonth //=> 31 + * @type {number} + */ + }, { + key: "daysInMonth", + get: function get() { + return daysInMonth(this.year, this.month); + } + + /** + * Returns the number of days in this DateTime's year + * @example DateTime.local(2016).daysInYear //=> 366 + * @example DateTime.local(2013).daysInYear //=> 365 + * @type {number} + */ + }, { + key: "daysInYear", + get: function get() { + return this.isValid ? daysInYear(this.year) : NaN; + } + + /** + * Returns the number of weeks in this DateTime's year + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2004).weeksInWeekYear //=> 53 + * @example DateTime.local(2013).weeksInWeekYear //=> 52 + * @type {number} + */ + }, { + key: "weeksInWeekYear", + get: function get() { + return this.isValid ? weeksInWeekYear(this.weekYear) : NaN; + } + + /** + * Returns the number of weeks in this DateTime's local week year + * @example DateTime.local(2020, 6, {locale: 'en-US'}).weeksInLocalWeekYear //=> 52 + * @example DateTime.local(2020, 6, {locale: 'de-DE'}).weeksInLocalWeekYear //=> 53 + * @type {number} + */ + }, { + key: "weeksInLocalWeekYear", + get: function get() { + return this.isValid ? weeksInWeekYear(this.localWeekYear, this.loc.getMinDaysInFirstWeek(), this.loc.getStartOfWeek()) : NaN; + } + }], [{ + key: "DATE_SHORT", + get: function get() { + return DATE_SHORT; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983' + * @type {Object} + */ + }, { + key: "DATE_MED", + get: function get() { + return DATE_MED; + } + + /** + * {@link DateTime#toLocaleString} format like 'Fri, Oct 14, 1983' + * @type {Object} + */ + }, { + key: "DATE_MED_WITH_WEEKDAY", + get: function get() { + return DATE_MED_WITH_WEEKDAY; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983' + * @type {Object} + */ + }, { + key: "DATE_FULL", + get: function get() { + return DATE_FULL; + } + + /** + * {@link DateTime#toLocaleString} format like 'Tuesday, October 14, 1983' + * @type {Object} + */ + }, { + key: "DATE_HUGE", + get: function get() { + return DATE_HUGE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "TIME_SIMPLE", + get: function get() { + return TIME_SIMPLE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "TIME_WITH_SECONDS", + get: function get() { + return TIME_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "TIME_WITH_SHORT_OFFSET", + get: function get() { + return TIME_WITH_SHORT_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "TIME_WITH_LONG_OFFSET", + get: function get() { + return TIME_WITH_LONG_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30', always 24-hour. + * @type {Object} + */ + }, { + key: "TIME_24_SIMPLE", + get: function get() { + return TIME_24_SIMPLE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23', always 24-hour. + * @type {Object} + */ + }, { + key: "TIME_24_WITH_SECONDS", + get: function get() { + return TIME_24_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 EDT', always 24-hour. + * @type {Object} + */ + }, { + key: "TIME_24_WITH_SHORT_OFFSET", + get: function get() { + return TIME_24_WITH_SHORT_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour. + * @type {Object} + */ + }, { + key: "TIME_24_WITH_LONG_OFFSET", + get: function get() { + return TIME_24_WITH_LONG_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_SHORT", + get: function get() { + return DATETIME_SHORT; + } + + /** + * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_SHORT_WITH_SECONDS", + get: function get() { + return DATETIME_SHORT_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_MED", + get: function get() { + return DATETIME_MED; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_MED_WITH_SECONDS", + get: function get() { + return DATETIME_MED_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_MED_WITH_WEEKDAY", + get: function get() { + return DATETIME_MED_WITH_WEEKDAY; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_FULL", + get: function get() { + return DATETIME_FULL; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_FULL_WITH_SECONDS", + get: function get() { + return DATETIME_FULL_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_HUGE", + get: function get() { + return DATETIME_HUGE; + } + + /** + * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_HUGE_WITH_SECONDS", + get: function get() { + return DATETIME_HUGE_WITH_SECONDS; + } + }]); + return DateTime; + }(Symbol.for("nodejs.util.inspect.custom")); + function friendlyDateTime(dateTimeish) { + if (DateTime.isDateTime(dateTimeish)) { + return dateTimeish; + } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) { + return DateTime.fromJSDate(dateTimeish); + } else if (dateTimeish && typeof dateTimeish === "object") { + return DateTime.fromObject(dateTimeish); + } else { + throw new InvalidArgumentError("Unknown datetime argument: " + dateTimeish + ", of type " + typeof dateTimeish); + } + } + + var VERSION = "3.7.2"; + + exports.DateTime = DateTime; + exports.Duration = Duration; + exports.FixedOffsetZone = FixedOffsetZone; + exports.IANAZone = IANAZone; + exports.Info = Info; + exports.Interval = Interval; + exports.InvalidZone = InvalidZone; + exports.Settings = Settings; + exports.SystemZone = SystemZone; + exports.VERSION = VERSION; + exports.Zone = Zone; + + Object.defineProperty(exports, '__esModule', { value: true }); + + return exports; + +})({}); +//# sourceMappingURL=luxon.js.map diff --git a/node_modules/luxon/build/global/luxon.js.map b/node_modules/luxon/build/global/luxon.js.map new file mode 100644 index 00000000..a7bbf8d6 --- /dev/null +++ b/node_modules/luxon/build/global/luxon.js.map @@ -0,0 +1 @@ +{"version":3,"file":"luxon.js","sources":["../../src/errors.js","../../src/impl/formats.js","../../src/zone.js","../../src/zones/systemZone.js","../../src/zones/IANAZone.js","../../src/impl/locale.js","../../src/zones/fixedOffsetZone.js","../../src/zones/invalidZone.js","../../src/impl/zoneUtil.js","../../src/impl/digits.js","../../src/settings.js","../../src/impl/invalid.js","../../src/impl/conversions.js","../../src/impl/util.js","../../src/impl/english.js","../../src/impl/formatter.js","../../src/impl/regexParser.js","../../src/duration.js","../../src/interval.js","../../src/info.js","../../src/impl/diff.js","../../src/impl/tokenParser.js","../../src/datetime.js","../../src/luxon.js"],"sourcesContent":["// these aren't really private, but nor are they really useful to document\n\n/**\n * @private\n */\nclass LuxonError extends Error {}\n\n/**\n * @private\n */\nexport class InvalidDateTimeError extends LuxonError {\n constructor(reason) {\n super(`Invalid DateTime: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidIntervalError extends LuxonError {\n constructor(reason) {\n super(`Invalid Interval: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidDurationError extends LuxonError {\n constructor(reason) {\n super(`Invalid Duration: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class ConflictingSpecificationError extends LuxonError {}\n\n/**\n * @private\n */\nexport class InvalidUnitError extends LuxonError {\n constructor(unit) {\n super(`Invalid unit ${unit}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidArgumentError extends LuxonError {}\n\n/**\n * @private\n */\nexport class ZoneIsAbstractError extends LuxonError {\n constructor() {\n super(\"Zone is an abstract class\");\n }\n}\n","/**\n * @private\n */\n\nconst n = \"numeric\",\n s = \"short\",\n l = \"long\";\n\nexport const DATE_SHORT = {\n year: n,\n month: n,\n day: n,\n};\n\nexport const DATE_MED = {\n year: n,\n month: s,\n day: n,\n};\n\nexport const DATE_MED_WITH_WEEKDAY = {\n year: n,\n month: s,\n day: n,\n weekday: s,\n};\n\nexport const DATE_FULL = {\n year: n,\n month: l,\n day: n,\n};\n\nexport const DATE_HUGE = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n};\n\nexport const TIME_SIMPLE = {\n hour: n,\n minute: n,\n};\n\nexport const TIME_WITH_SECONDS = {\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const TIME_WITH_SHORT_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n timeZoneName: s,\n};\n\nexport const TIME_WITH_LONG_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n timeZoneName: l,\n};\n\nexport const TIME_24_SIMPLE = {\n hour: n,\n minute: n,\n hourCycle: \"h23\",\n};\n\nexport const TIME_24_WITH_SECONDS = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n};\n\nexport const TIME_24_WITH_SHORT_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n timeZoneName: s,\n};\n\nexport const TIME_24_WITH_LONG_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n timeZoneName: l,\n};\n\nexport const DATETIME_SHORT = {\n year: n,\n month: n,\n day: n,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_SHORT_WITH_SECONDS = {\n year: n,\n month: n,\n day: n,\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const DATETIME_MED = {\n year: n,\n month: s,\n day: n,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_MED_WITH_SECONDS = {\n year: n,\n month: s,\n day: n,\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const DATETIME_MED_WITH_WEEKDAY = {\n year: n,\n month: s,\n day: n,\n weekday: s,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_FULL = {\n year: n,\n month: l,\n day: n,\n hour: n,\n minute: n,\n timeZoneName: s,\n};\n\nexport const DATETIME_FULL_WITH_SECONDS = {\n year: n,\n month: l,\n day: n,\n hour: n,\n minute: n,\n second: n,\n timeZoneName: s,\n};\n\nexport const DATETIME_HUGE = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n hour: n,\n minute: n,\n timeZoneName: l,\n};\n\nexport const DATETIME_HUGE_WITH_SECONDS = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n hour: n,\n minute: n,\n second: n,\n timeZoneName: l,\n};\n","import { ZoneIsAbstractError } from \"./errors.js\";\n\n/**\n * @interface\n */\nexport default class Zone {\n /**\n * The type of zone\n * @abstract\n * @type {string}\n */\n get type() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * The name of this zone.\n * @abstract\n * @type {string}\n */\n get name() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * The IANA name of this zone.\n * Defaults to `name` if not overwritten by a subclass.\n * @abstract\n * @type {string}\n */\n get ianaName() {\n return this.name;\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year.\n * @abstract\n * @type {boolean}\n */\n get isUniversal() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Returns the offset's common name (such as EST) at the specified timestamp\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to get the name\n * @param {Object} opts - Options to affect the format\n * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.\n * @param {string} opts.locale - What locale to return the offset name in.\n * @return {string}\n */\n offsetName(ts, opts) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Returns the offset's value as a string\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to compute the offset\n * @return {number}\n */\n offset(ts) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return whether this Zone is equal to another zone\n * @abstract\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return whether this Zone is valid.\n * @abstract\n * @type {boolean}\n */\n get isValid() {\n throw new ZoneIsAbstractError();\n }\n}\n","import { formatOffset, parseZoneInfo } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet singleton = null;\n\n/**\n * Represents the local zone for this JavaScript environment.\n * @implements {Zone}\n */\nexport default class SystemZone extends Zone {\n /**\n * Get a singleton instance of the local zone\n * @return {SystemZone}\n */\n static get instance() {\n if (singleton === null) {\n singleton = new SystemZone();\n }\n return singleton;\n }\n\n /** @override **/\n get type() {\n return \"system\";\n }\n\n /** @override **/\n get name() {\n return new Intl.DateTimeFormat().resolvedOptions().timeZone;\n }\n\n /** @override **/\n get isUniversal() {\n return false;\n }\n\n /** @override **/\n offsetName(ts, { format, locale }) {\n return parseZoneInfo(ts, format, locale);\n }\n\n /** @override **/\n formatOffset(ts, format) {\n return formatOffset(this.offset(ts), format);\n }\n\n /** @override **/\n offset(ts) {\n return -new Date(ts).getTimezoneOffset();\n }\n\n /** @override **/\n equals(otherZone) {\n return otherZone.type === \"system\";\n }\n\n /** @override **/\n get isValid() {\n return true;\n }\n}\n","import { formatOffset, parseZoneInfo, isUndefined, objToLocalTS } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nconst dtfCache = new Map();\nfunction makeDTF(zoneName) {\n let dtf = dtfCache.get(zoneName);\n if (dtf === undefined) {\n dtf = new Intl.DateTimeFormat(\"en-US\", {\n hour12: false,\n timeZone: zoneName,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n era: \"short\",\n });\n dtfCache.set(zoneName, dtf);\n }\n return dtf;\n}\n\nconst typeToPos = {\n year: 0,\n month: 1,\n day: 2,\n era: 3,\n hour: 4,\n minute: 5,\n second: 6,\n};\n\nfunction hackyOffset(dtf, date) {\n const formatted = dtf.format(date).replace(/\\u200E/g, \"\"),\n parsed = /(\\d+)\\/(\\d+)\\/(\\d+) (AD|BC),? (\\d+):(\\d+):(\\d+)/.exec(formatted),\n [, fMonth, fDay, fYear, fadOrBc, fHour, fMinute, fSecond] = parsed;\n return [fYear, fMonth, fDay, fadOrBc, fHour, fMinute, fSecond];\n}\n\nfunction partsOffset(dtf, date) {\n const formatted = dtf.formatToParts(date);\n const filled = [];\n for (let i = 0; i < formatted.length; i++) {\n const { type, value } = formatted[i];\n const pos = typeToPos[type];\n\n if (type === \"era\") {\n filled[pos] = value;\n } else if (!isUndefined(pos)) {\n filled[pos] = parseInt(value, 10);\n }\n }\n return filled;\n}\n\nconst ianaZoneCache = new Map();\n/**\n * A zone identified by an IANA identifier, like America/New_York\n * @implements {Zone}\n */\nexport default class IANAZone extends Zone {\n /**\n * @param {string} name - Zone name\n * @return {IANAZone}\n */\n static create(name) {\n let zone = ianaZoneCache.get(name);\n if (zone === undefined) {\n ianaZoneCache.set(name, (zone = new IANAZone(name)));\n }\n return zone;\n }\n\n /**\n * Reset local caches. Should only be necessary in testing scenarios.\n * @return {void}\n */\n static resetCache() {\n ianaZoneCache.clear();\n dtfCache.clear();\n }\n\n /**\n * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that.\n * @param {string} s - The string to check validity on\n * @example IANAZone.isValidSpecifier(\"America/New_York\") //=> true\n * @example IANAZone.isValidSpecifier(\"Sport~~blorp\") //=> false\n * @deprecated For backward compatibility, this forwards to isValidZone, better use `isValidZone()` directly instead.\n * @return {boolean}\n */\n static isValidSpecifier(s) {\n return this.isValidZone(s);\n }\n\n /**\n * Returns whether the provided string identifies a real zone\n * @param {string} zone - The string to check\n * @example IANAZone.isValidZone(\"America/New_York\") //=> true\n * @example IANAZone.isValidZone(\"Fantasia/Castle\") //=> false\n * @example IANAZone.isValidZone(\"Sport~~blorp\") //=> false\n * @return {boolean}\n */\n static isValidZone(zone) {\n if (!zone) {\n return false;\n }\n try {\n new Intl.DateTimeFormat(\"en-US\", { timeZone: zone }).format();\n return true;\n } catch (e) {\n return false;\n }\n }\n\n constructor(name) {\n super();\n /** @private **/\n this.zoneName = name;\n /** @private **/\n this.valid = IANAZone.isValidZone(name);\n }\n\n /**\n * The type of zone. `iana` for all instances of `IANAZone`.\n * @override\n * @type {string}\n */\n get type() {\n return \"iana\";\n }\n\n /**\n * The name of this zone (i.e. the IANA zone name).\n * @override\n * @type {string}\n */\n get name() {\n return this.zoneName;\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year:\n * Always returns false for all IANA zones.\n * @override\n * @type {boolean}\n */\n get isUniversal() {\n return false;\n }\n\n /**\n * Returns the offset's common name (such as EST) at the specified timestamp\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the name\n * @param {Object} opts - Options to affect the format\n * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.\n * @param {string} opts.locale - What locale to return the offset name in.\n * @return {string}\n */\n offsetName(ts, { format, locale }) {\n return parseZoneInfo(ts, format, locale, this.name);\n }\n\n /**\n * Returns the offset's value as a string\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n return formatOffset(this.offset(ts), format);\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n * @override\n * @param {number} ts - Epoch milliseconds for which to compute the offset\n * @return {number}\n */\n offset(ts) {\n if (!this.valid) return NaN;\n const date = new Date(ts);\n\n if (isNaN(date)) return NaN;\n\n const dtf = makeDTF(this.name);\n let [year, month, day, adOrBc, hour, minute, second] = dtf.formatToParts\n ? partsOffset(dtf, date)\n : hackyOffset(dtf, date);\n\n if (adOrBc === \"BC\") {\n year = -Math.abs(year) + 1;\n }\n\n // because we're using hour12 and https://bugs.chromium.org/p/chromium/issues/detail?id=1025564&can=2&q=%2224%3A00%22%20datetimeformat\n const adjustedHour = hour === 24 ? 0 : hour;\n\n const asUTC = objToLocalTS({\n year,\n month,\n day,\n hour: adjustedHour,\n minute,\n second,\n millisecond: 0,\n });\n\n let asTS = +date;\n const over = asTS % 1000;\n asTS -= over >= 0 ? over : 1000 + over;\n return (asUTC - asTS) / (60 * 1000);\n }\n\n /**\n * Return whether this Zone is equal to another zone\n * @override\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n return otherZone.type === \"iana\" && otherZone.name === this.name;\n }\n\n /**\n * Return whether this Zone is valid.\n * @override\n * @type {boolean}\n */\n get isValid() {\n return this.valid;\n }\n}\n","import { hasLocaleWeekInfo, hasRelative, padStart, roundTo, validateWeekSettings } from \"./util.js\";\nimport * as English from \"./english.js\";\nimport Settings from \"../settings.js\";\nimport DateTime from \"../datetime.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\n\n// todo - remap caching\n\nlet intlLFCache = {};\nfunction getCachedLF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let dtf = intlLFCache[key];\n if (!dtf) {\n dtf = new Intl.ListFormat(locString, opts);\n intlLFCache[key] = dtf;\n }\n return dtf;\n}\n\nconst intlDTCache = new Map();\nfunction getCachedDTF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let dtf = intlDTCache.get(key);\n if (dtf === undefined) {\n dtf = new Intl.DateTimeFormat(locString, opts);\n intlDTCache.set(key, dtf);\n }\n return dtf;\n}\n\nconst intlNumCache = new Map();\nfunction getCachedINF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let inf = intlNumCache.get(key);\n if (inf === undefined) {\n inf = new Intl.NumberFormat(locString, opts);\n intlNumCache.set(key, inf);\n }\n return inf;\n}\n\nconst intlRelCache = new Map();\nfunction getCachedRTF(locString, opts = {}) {\n const { base, ...cacheKeyOpts } = opts; // exclude `base` from the options\n const key = JSON.stringify([locString, cacheKeyOpts]);\n let inf = intlRelCache.get(key);\n if (inf === undefined) {\n inf = new Intl.RelativeTimeFormat(locString, opts);\n intlRelCache.set(key, inf);\n }\n return inf;\n}\n\nlet sysLocaleCache = null;\nfunction systemLocale() {\n if (sysLocaleCache) {\n return sysLocaleCache;\n } else {\n sysLocaleCache = new Intl.DateTimeFormat().resolvedOptions().locale;\n return sysLocaleCache;\n }\n}\n\nconst intlResolvedOptionsCache = new Map();\nfunction getCachedIntResolvedOptions(locString) {\n let opts = intlResolvedOptionsCache.get(locString);\n if (opts === undefined) {\n opts = new Intl.DateTimeFormat(locString).resolvedOptions();\n intlResolvedOptionsCache.set(locString, opts);\n }\n return opts;\n}\n\nconst weekInfoCache = new Map();\nfunction getCachedWeekInfo(locString) {\n let data = weekInfoCache.get(locString);\n if (!data) {\n const locale = new Intl.Locale(locString);\n // browsers currently implement this as a property, but spec says it should be a getter function\n data = \"getWeekInfo\" in locale ? locale.getWeekInfo() : locale.weekInfo;\n // minimalDays was removed from WeekInfo: https://github.com/tc39/proposal-intl-locale-info/issues/86\n if (!(\"minimalDays\" in data)) {\n data = { ...fallbackWeekSettings, ...data };\n }\n weekInfoCache.set(locString, data);\n }\n return data;\n}\n\nfunction parseLocaleString(localeStr) {\n // I really want to avoid writing a BCP 47 parser\n // see, e.g. https://github.com/wooorm/bcp-47\n // Instead, we'll do this:\n\n // a) if the string has no -u extensions, just leave it alone\n // b) if it does, use Intl to resolve everything\n // c) if Intl fails, try again without the -u\n\n // private subtags and unicode subtags have ordering requirements,\n // and we're not properly parsing this, so just strip out the\n // private ones if they exist.\n const xIndex = localeStr.indexOf(\"-x-\");\n if (xIndex !== -1) {\n localeStr = localeStr.substring(0, xIndex);\n }\n\n const uIndex = localeStr.indexOf(\"-u-\");\n if (uIndex === -1) {\n return [localeStr];\n } else {\n let options;\n let selectedStr;\n try {\n options = getCachedDTF(localeStr).resolvedOptions();\n selectedStr = localeStr;\n } catch (e) {\n const smaller = localeStr.substring(0, uIndex);\n options = getCachedDTF(smaller).resolvedOptions();\n selectedStr = smaller;\n }\n\n const { numberingSystem, calendar } = options;\n return [selectedStr, numberingSystem, calendar];\n }\n}\n\nfunction intlConfigString(localeStr, numberingSystem, outputCalendar) {\n if (outputCalendar || numberingSystem) {\n if (!localeStr.includes(\"-u-\")) {\n localeStr += \"-u\";\n }\n\n if (outputCalendar) {\n localeStr += `-ca-${outputCalendar}`;\n }\n\n if (numberingSystem) {\n localeStr += `-nu-${numberingSystem}`;\n }\n return localeStr;\n } else {\n return localeStr;\n }\n}\n\nfunction mapMonths(f) {\n const ms = [];\n for (let i = 1; i <= 12; i++) {\n const dt = DateTime.utc(2009, i, 1);\n ms.push(f(dt));\n }\n return ms;\n}\n\nfunction mapWeekdays(f) {\n const ms = [];\n for (let i = 1; i <= 7; i++) {\n const dt = DateTime.utc(2016, 11, 13 + i);\n ms.push(f(dt));\n }\n return ms;\n}\n\nfunction listStuff(loc, length, englishFn, intlFn) {\n const mode = loc.listingMode();\n\n if (mode === \"error\") {\n return null;\n } else if (mode === \"en\") {\n return englishFn(length);\n } else {\n return intlFn(length);\n }\n}\n\nfunction supportsFastNumbers(loc) {\n if (loc.numberingSystem && loc.numberingSystem !== \"latn\") {\n return false;\n } else {\n return (\n loc.numberingSystem === \"latn\" ||\n !loc.locale ||\n loc.locale.startsWith(\"en\") ||\n getCachedIntResolvedOptions(loc.locale).numberingSystem === \"latn\"\n );\n }\n}\n\n/**\n * @private\n */\n\nclass PolyNumberFormatter {\n constructor(intl, forceSimple, opts) {\n this.padTo = opts.padTo || 0;\n this.floor = opts.floor || false;\n\n const { padTo, floor, ...otherOpts } = opts;\n\n if (!forceSimple || Object.keys(otherOpts).length > 0) {\n const intlOpts = { useGrouping: false, ...opts };\n if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo;\n this.inf = getCachedINF(intl, intlOpts);\n }\n }\n\n format(i) {\n if (this.inf) {\n const fixed = this.floor ? Math.floor(i) : i;\n return this.inf.format(fixed);\n } else {\n // to match the browser's numberformatter defaults\n const fixed = this.floor ? Math.floor(i) : roundTo(i, 3);\n return padStart(fixed, this.padTo);\n }\n }\n}\n\n/**\n * @private\n */\n\nclass PolyDateFormatter {\n constructor(dt, intl, opts) {\n this.opts = opts;\n this.originalZone = undefined;\n\n let z = undefined;\n if (this.opts.timeZone) {\n // Don't apply any workarounds if a timeZone is explicitly provided in opts\n this.dt = dt;\n } else if (dt.zone.type === \"fixed\") {\n // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like.\n // That is why fixed-offset TZ is set to that unless it is:\n // 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT.\n // 2. Unsupported by the browser:\n // - some do not support Etc/\n // - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata\n const gmtOffset = -1 * (dt.offset / 60);\n const offsetZ = gmtOffset >= 0 ? `Etc/GMT+${gmtOffset}` : `Etc/GMT${gmtOffset}`;\n if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) {\n z = offsetZ;\n this.dt = dt;\n } else {\n // Not all fixed-offset zones like Etc/+4:30 are present in tzdata so\n // we manually apply the offset and substitute the zone as needed.\n z = \"UTC\";\n this.dt = dt.offset === 0 ? dt : dt.setZone(\"UTC\").plus({ minutes: dt.offset });\n this.originalZone = dt.zone;\n }\n } else if (dt.zone.type === \"system\") {\n this.dt = dt;\n } else if (dt.zone.type === \"iana\") {\n this.dt = dt;\n z = dt.zone.name;\n } else {\n // Custom zones can have any offset / offsetName so we just manually\n // apply the offset and substitute the zone as needed.\n z = \"UTC\";\n this.dt = dt.setZone(\"UTC\").plus({ minutes: dt.offset });\n this.originalZone = dt.zone;\n }\n\n const intlOpts = { ...this.opts };\n intlOpts.timeZone = intlOpts.timeZone || z;\n this.dtf = getCachedDTF(intl, intlOpts);\n }\n\n format() {\n if (this.originalZone) {\n // If we have to substitute in the actual zone name, we have to use\n // formatToParts so that the timezone can be replaced.\n return this.formatToParts()\n .map(({ value }) => value)\n .join(\"\");\n }\n return this.dtf.format(this.dt.toJSDate());\n }\n\n formatToParts() {\n const parts = this.dtf.formatToParts(this.dt.toJSDate());\n if (this.originalZone) {\n return parts.map((part) => {\n if (part.type === \"timeZoneName\") {\n const offsetName = this.originalZone.offsetName(this.dt.ts, {\n locale: this.dt.locale,\n format: this.opts.timeZoneName,\n });\n return {\n ...part,\n value: offsetName,\n };\n } else {\n return part;\n }\n });\n }\n return parts;\n }\n\n resolvedOptions() {\n return this.dtf.resolvedOptions();\n }\n}\n\n/**\n * @private\n */\nclass PolyRelFormatter {\n constructor(intl, isEnglish, opts) {\n this.opts = { style: \"long\", ...opts };\n if (!isEnglish && hasRelative()) {\n this.rtf = getCachedRTF(intl, opts);\n }\n }\n\n format(count, unit) {\n if (this.rtf) {\n return this.rtf.format(count, unit);\n } else {\n return English.formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== \"long\");\n }\n }\n\n formatToParts(count, unit) {\n if (this.rtf) {\n return this.rtf.formatToParts(count, unit);\n } else {\n return [];\n }\n }\n}\n\nconst fallbackWeekSettings = {\n firstDay: 1,\n minimalDays: 4,\n weekend: [6, 7],\n};\n\n/**\n * @private\n */\nexport default class Locale {\n static fromOpts(opts) {\n return Locale.create(\n opts.locale,\n opts.numberingSystem,\n opts.outputCalendar,\n opts.weekSettings,\n opts.defaultToEN\n );\n }\n\n static create(locale, numberingSystem, outputCalendar, weekSettings, defaultToEN = false) {\n const specifiedLocale = locale || Settings.defaultLocale;\n // the system locale is useful for human-readable strings but annoying for parsing/formatting known formats\n const localeR = specifiedLocale || (defaultToEN ? \"en-US\" : systemLocale());\n const numberingSystemR = numberingSystem || Settings.defaultNumberingSystem;\n const outputCalendarR = outputCalendar || Settings.defaultOutputCalendar;\n const weekSettingsR = validateWeekSettings(weekSettings) || Settings.defaultWeekSettings;\n return new Locale(localeR, numberingSystemR, outputCalendarR, weekSettingsR, specifiedLocale);\n }\n\n static resetCache() {\n sysLocaleCache = null;\n intlDTCache.clear();\n intlNumCache.clear();\n intlRelCache.clear();\n intlResolvedOptionsCache.clear();\n weekInfoCache.clear();\n }\n\n static fromObject({ locale, numberingSystem, outputCalendar, weekSettings } = {}) {\n return Locale.create(locale, numberingSystem, outputCalendar, weekSettings);\n }\n\n constructor(locale, numbering, outputCalendar, weekSettings, specifiedLocale) {\n const [parsedLocale, parsedNumberingSystem, parsedOutputCalendar] = parseLocaleString(locale);\n\n this.locale = parsedLocale;\n this.numberingSystem = numbering || parsedNumberingSystem || null;\n this.outputCalendar = outputCalendar || parsedOutputCalendar || null;\n this.weekSettings = weekSettings;\n this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar);\n\n this.weekdaysCache = { format: {}, standalone: {} };\n this.monthsCache = { format: {}, standalone: {} };\n this.meridiemCache = null;\n this.eraCache = {};\n\n this.specifiedLocale = specifiedLocale;\n this.fastNumbersCached = null;\n }\n\n get fastNumbers() {\n if (this.fastNumbersCached == null) {\n this.fastNumbersCached = supportsFastNumbers(this);\n }\n\n return this.fastNumbersCached;\n }\n\n listingMode() {\n const isActuallyEn = this.isEnglish();\n const hasNoWeirdness =\n (this.numberingSystem === null || this.numberingSystem === \"latn\") &&\n (this.outputCalendar === null || this.outputCalendar === \"gregory\");\n return isActuallyEn && hasNoWeirdness ? \"en\" : \"intl\";\n }\n\n clone(alts) {\n if (!alts || Object.getOwnPropertyNames(alts).length === 0) {\n return this;\n } else {\n return Locale.create(\n alts.locale || this.specifiedLocale,\n alts.numberingSystem || this.numberingSystem,\n alts.outputCalendar || this.outputCalendar,\n validateWeekSettings(alts.weekSettings) || this.weekSettings,\n alts.defaultToEN || false\n );\n }\n }\n\n redefaultToEN(alts = {}) {\n return this.clone({ ...alts, defaultToEN: true });\n }\n\n redefaultToSystem(alts = {}) {\n return this.clone({ ...alts, defaultToEN: false });\n }\n\n months(length, format = false) {\n return listStuff(this, length, English.months, () => {\n // Workaround for \"ja\" locale: formatToParts does not label all parts of the month\n // as \"month\" and for this locale there is no difference between \"format\" and \"non-format\".\n // As such, just use format() instead of formatToParts() and take the whole string\n const monthSpecialCase = this.intl === \"ja\" || this.intl.startsWith(\"ja-\");\n format &= !monthSpecialCase;\n const intl = format ? { month: length, day: \"numeric\" } : { month: length },\n formatStr = format ? \"format\" : \"standalone\";\n if (!this.monthsCache[formatStr][length]) {\n const mapper = !monthSpecialCase\n ? (dt) => this.extract(dt, intl, \"month\")\n : (dt) => this.dtFormatter(dt, intl).format();\n this.monthsCache[formatStr][length] = mapMonths(mapper);\n }\n return this.monthsCache[formatStr][length];\n });\n }\n\n weekdays(length, format = false) {\n return listStuff(this, length, English.weekdays, () => {\n const intl = format\n ? { weekday: length, year: \"numeric\", month: \"long\", day: \"numeric\" }\n : { weekday: length },\n formatStr = format ? \"format\" : \"standalone\";\n if (!this.weekdaysCache[formatStr][length]) {\n this.weekdaysCache[formatStr][length] = mapWeekdays((dt) =>\n this.extract(dt, intl, \"weekday\")\n );\n }\n return this.weekdaysCache[formatStr][length];\n });\n }\n\n meridiems() {\n return listStuff(\n this,\n undefined,\n () => English.meridiems,\n () => {\n // In theory there could be aribitrary day periods. We're gonna assume there are exactly two\n // for AM and PM. This is probably wrong, but it's makes parsing way easier.\n if (!this.meridiemCache) {\n const intl = { hour: \"numeric\", hourCycle: \"h12\" };\n this.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map(\n (dt) => this.extract(dt, intl, \"dayperiod\")\n );\n }\n\n return this.meridiemCache;\n }\n );\n }\n\n eras(length) {\n return listStuff(this, length, English.eras, () => {\n const intl = { era: length };\n\n // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates\n // to definitely enumerate them.\n if (!this.eraCache[length]) {\n this.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map((dt) =>\n this.extract(dt, intl, \"era\")\n );\n }\n\n return this.eraCache[length];\n });\n }\n\n extract(dt, intlOpts, field) {\n const df = this.dtFormatter(dt, intlOpts),\n results = df.formatToParts(),\n matching = results.find((m) => m.type.toLowerCase() === field);\n return matching ? matching.value : null;\n }\n\n numberFormatter(opts = {}) {\n // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave)\n // (in contrast, the rest of the condition is used heavily)\n return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts);\n }\n\n dtFormatter(dt, intlOpts = {}) {\n return new PolyDateFormatter(dt, this.intl, intlOpts);\n }\n\n relFormatter(opts = {}) {\n return new PolyRelFormatter(this.intl, this.isEnglish(), opts);\n }\n\n listFormatter(opts = {}) {\n return getCachedLF(this.intl, opts);\n }\n\n isEnglish() {\n return (\n this.locale === \"en\" ||\n this.locale.toLowerCase() === \"en-us\" ||\n getCachedIntResolvedOptions(this.intl).locale.startsWith(\"en-us\")\n );\n }\n\n getWeekSettings() {\n if (this.weekSettings) {\n return this.weekSettings;\n } else if (!hasLocaleWeekInfo()) {\n return fallbackWeekSettings;\n } else {\n return getCachedWeekInfo(this.locale);\n }\n }\n\n getStartOfWeek() {\n return this.getWeekSettings().firstDay;\n }\n\n getMinDaysInFirstWeek() {\n return this.getWeekSettings().minimalDays;\n }\n\n getWeekendDays() {\n return this.getWeekSettings().weekend;\n }\n\n equals(other) {\n return (\n this.locale === other.locale &&\n this.numberingSystem === other.numberingSystem &&\n this.outputCalendar === other.outputCalendar\n );\n }\n\n toString() {\n return `Locale(${this.locale}, ${this.numberingSystem}, ${this.outputCalendar})`;\n }\n}\n","import { formatOffset, signedOffset } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet singleton = null;\n\n/**\n * A zone with a fixed offset (meaning no DST)\n * @implements {Zone}\n */\nexport default class FixedOffsetZone extends Zone {\n /**\n * Get a singleton instance of UTC\n * @return {FixedOffsetZone}\n */\n static get utcInstance() {\n if (singleton === null) {\n singleton = new FixedOffsetZone(0);\n }\n return singleton;\n }\n\n /**\n * Get an instance with a specified offset\n * @param {number} offset - The offset in minutes\n * @return {FixedOffsetZone}\n */\n static instance(offset) {\n return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset);\n }\n\n /**\n * Get an instance of FixedOffsetZone from a UTC offset string, like \"UTC+6\"\n * @param {string} s - The offset string to parse\n * @example FixedOffsetZone.parseSpecifier(\"UTC+6\")\n * @example FixedOffsetZone.parseSpecifier(\"UTC+06\")\n * @example FixedOffsetZone.parseSpecifier(\"UTC-6:00\")\n * @return {FixedOffsetZone}\n */\n static parseSpecifier(s) {\n if (s) {\n const r = s.match(/^utc(?:([+-]\\d{1,2})(?::(\\d{2}))?)?$/i);\n if (r) {\n return new FixedOffsetZone(signedOffset(r[1], r[2]));\n }\n }\n return null;\n }\n\n constructor(offset) {\n super();\n /** @private **/\n this.fixed = offset;\n }\n\n /**\n * The type of zone. `fixed` for all instances of `FixedOffsetZone`.\n * @override\n * @type {string}\n */\n get type() {\n return \"fixed\";\n }\n\n /**\n * The name of this zone.\n * All fixed zones' names always start with \"UTC\" (plus optional offset)\n * @override\n * @type {string}\n */\n get name() {\n return this.fixed === 0 ? \"UTC\" : `UTC${formatOffset(this.fixed, \"narrow\")}`;\n }\n\n /**\n * The IANA name of this zone, i.e. `Etc/UTC` or `Etc/GMT+/-nn`\n *\n * @override\n * @type {string}\n */\n get ianaName() {\n if (this.fixed === 0) {\n return \"Etc/UTC\";\n } else {\n return `Etc/GMT${formatOffset(-this.fixed, \"narrow\")}`;\n }\n }\n\n /**\n * Returns the offset's common name at the specified timestamp.\n *\n * For fixed offset zones this equals to the zone name.\n * @override\n */\n offsetName() {\n return this.name;\n }\n\n /**\n * Returns the offset's value as a string\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n return formatOffset(this.fixed, format);\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year:\n * Always returns true for all fixed offset zones.\n * @override\n * @type {boolean}\n */\n get isUniversal() {\n return true;\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n *\n * For fixed offset zones, this is constant and does not depend on a timestamp.\n * @override\n * @return {number}\n */\n offset() {\n return this.fixed;\n }\n\n /**\n * Return whether this Zone is equal to another zone (i.e. also fixed and same offset)\n * @override\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n return otherZone.type === \"fixed\" && otherZone.fixed === this.fixed;\n }\n\n /**\n * Return whether this Zone is valid:\n * All fixed offset zones are valid.\n * @override\n * @type {boolean}\n */\n get isValid() {\n return true;\n }\n}\n","import Zone from \"../zone.js\";\n\n/**\n * A zone that failed to parse. You should never need to instantiate this.\n * @implements {Zone}\n */\nexport default class InvalidZone extends Zone {\n constructor(zoneName) {\n super();\n /** @private */\n this.zoneName = zoneName;\n }\n\n /** @override **/\n get type() {\n return \"invalid\";\n }\n\n /** @override **/\n get name() {\n return this.zoneName;\n }\n\n /** @override **/\n get isUniversal() {\n return false;\n }\n\n /** @override **/\n offsetName() {\n return null;\n }\n\n /** @override **/\n formatOffset() {\n return \"\";\n }\n\n /** @override **/\n offset() {\n return NaN;\n }\n\n /** @override **/\n equals() {\n return false;\n }\n\n /** @override **/\n get isValid() {\n return false;\n }\n}\n","/**\n * @private\n */\n\nimport Zone from \"../zone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport InvalidZone from \"../zones/invalidZone.js\";\n\nimport { isUndefined, isString, isNumber } from \"./util.js\";\nimport SystemZone from \"../zones/systemZone.js\";\n\nexport function normalizeZone(input, defaultZone) {\n let offset;\n if (isUndefined(input) || input === null) {\n return defaultZone;\n } else if (input instanceof Zone) {\n return input;\n } else if (isString(input)) {\n const lowered = input.toLowerCase();\n if (lowered === \"default\") return defaultZone;\n else if (lowered === \"local\" || lowered === \"system\") return SystemZone.instance;\n else if (lowered === \"utc\" || lowered === \"gmt\") return FixedOffsetZone.utcInstance;\n else return FixedOffsetZone.parseSpecifier(lowered) || IANAZone.create(input);\n } else if (isNumber(input)) {\n return FixedOffsetZone.instance(input);\n } else if (typeof input === \"object\" && \"offset\" in input && typeof input.offset === \"function\") {\n // This is dumb, but the instanceof check above doesn't seem to really work\n // so we're duck checking it\n return input;\n } else {\n return new InvalidZone(input);\n }\n}\n","const numberingSystems = {\n arab: \"[\\u0660-\\u0669]\",\n arabext: \"[\\u06F0-\\u06F9]\",\n bali: \"[\\u1B50-\\u1B59]\",\n beng: \"[\\u09E6-\\u09EF]\",\n deva: \"[\\u0966-\\u096F]\",\n fullwide: \"[\\uFF10-\\uFF19]\",\n gujr: \"[\\u0AE6-\\u0AEF]\",\n hanidec: \"[〇|一|二|三|四|五|六|七|八|九]\",\n khmr: \"[\\u17E0-\\u17E9]\",\n knda: \"[\\u0CE6-\\u0CEF]\",\n laoo: \"[\\u0ED0-\\u0ED9]\",\n limb: \"[\\u1946-\\u194F]\",\n mlym: \"[\\u0D66-\\u0D6F]\",\n mong: \"[\\u1810-\\u1819]\",\n mymr: \"[\\u1040-\\u1049]\",\n orya: \"[\\u0B66-\\u0B6F]\",\n tamldec: \"[\\u0BE6-\\u0BEF]\",\n telu: \"[\\u0C66-\\u0C6F]\",\n thai: \"[\\u0E50-\\u0E59]\",\n tibt: \"[\\u0F20-\\u0F29]\",\n latn: \"\\\\d\",\n};\n\nconst numberingSystemsUTF16 = {\n arab: [1632, 1641],\n arabext: [1776, 1785],\n bali: [6992, 7001],\n beng: [2534, 2543],\n deva: [2406, 2415],\n fullwide: [65296, 65303],\n gujr: [2790, 2799],\n khmr: [6112, 6121],\n knda: [3302, 3311],\n laoo: [3792, 3801],\n limb: [6470, 6479],\n mlym: [3430, 3439],\n mong: [6160, 6169],\n mymr: [4160, 4169],\n orya: [2918, 2927],\n tamldec: [3046, 3055],\n telu: [3174, 3183],\n thai: [3664, 3673],\n tibt: [3872, 3881],\n};\n\nconst hanidecChars = numberingSystems.hanidec.replace(/[\\[|\\]]/g, \"\").split(\"\");\n\nexport function parseDigits(str) {\n let value = parseInt(str, 10);\n if (isNaN(value)) {\n value = \"\";\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n\n if (str[i].search(numberingSystems.hanidec) !== -1) {\n value += hanidecChars.indexOf(str[i]);\n } else {\n for (const key in numberingSystemsUTF16) {\n const [min, max] = numberingSystemsUTF16[key];\n if (code >= min && code <= max) {\n value += code - min;\n }\n }\n }\n }\n return parseInt(value, 10);\n } else {\n return value;\n }\n}\n\n// cache of {numberingSystem: {append: regex}}\nconst digitRegexCache = new Map();\nexport function resetDigitRegexCache() {\n digitRegexCache.clear();\n}\n\nexport function digitRegex({ numberingSystem }, append = \"\") {\n const ns = numberingSystem || \"latn\";\n\n let appendCache = digitRegexCache.get(ns);\n if (appendCache === undefined) {\n appendCache = new Map();\n digitRegexCache.set(ns, appendCache);\n }\n let regex = appendCache.get(append);\n if (regex === undefined) {\n regex = new RegExp(`${numberingSystems[ns]}${append}`);\n appendCache.set(append, regex);\n }\n\n return regex;\n}\n","import SystemZone from \"./zones/systemZone.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport Locale from \"./impl/locale.js\";\nimport DateTime from \"./datetime.js\";\n\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\nimport { validateWeekSettings } from \"./impl/util.js\";\nimport { resetDigitRegexCache } from \"./impl/digits.js\";\n\nlet now = () => Date.now(),\n defaultZone = \"system\",\n defaultLocale = null,\n defaultNumberingSystem = null,\n defaultOutputCalendar = null,\n twoDigitCutoffYear = 60,\n throwOnInvalid,\n defaultWeekSettings = null;\n\n/**\n * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here.\n */\nexport default class Settings {\n /**\n * Get the callback for returning the current timestamp.\n * @type {function}\n */\n static get now() {\n return now;\n }\n\n /**\n * Set the callback for returning the current timestamp.\n * The function should return a number, which will be interpreted as an Epoch millisecond count\n * @type {function}\n * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future\n * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time\n */\n static set now(n) {\n now = n;\n }\n\n /**\n * Set the default time zone to create DateTimes in. Does not affect existing instances.\n * Use the value \"system\" to reset this value to the system's time zone.\n * @type {string}\n */\n static set defaultZone(zone) {\n defaultZone = zone;\n }\n\n /**\n * Get the default time zone object currently used to create DateTimes. Does not affect existing instances.\n * The default value is the system's time zone (the one set on the machine that runs this code).\n * @type {Zone}\n */\n static get defaultZone() {\n return normalizeZone(defaultZone, SystemZone.instance);\n }\n\n /**\n * Get the default locale to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultLocale() {\n return defaultLocale;\n }\n\n /**\n * Set the default locale to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultLocale(locale) {\n defaultLocale = locale;\n }\n\n /**\n * Get the default numbering system to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultNumberingSystem() {\n return defaultNumberingSystem;\n }\n\n /**\n * Set the default numbering system to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultNumberingSystem(numberingSystem) {\n defaultNumberingSystem = numberingSystem;\n }\n\n /**\n * Get the default output calendar to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultOutputCalendar() {\n return defaultOutputCalendar;\n }\n\n /**\n * Set the default output calendar to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultOutputCalendar(outputCalendar) {\n defaultOutputCalendar = outputCalendar;\n }\n\n /**\n * @typedef {Object} WeekSettings\n * @property {number} firstDay\n * @property {number} minimalDays\n * @property {number[]} weekend\n */\n\n /**\n * @return {WeekSettings|null}\n */\n static get defaultWeekSettings() {\n return defaultWeekSettings;\n }\n\n /**\n * Allows overriding the default locale week settings, i.e. the start of the week, the weekend and\n * how many days are required in the first week of a year.\n * Does not affect existing instances.\n *\n * @param {WeekSettings|null} weekSettings\n */\n static set defaultWeekSettings(weekSettings) {\n defaultWeekSettings = validateWeekSettings(weekSettings);\n }\n\n /**\n * Get the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx.\n * @type {number}\n */\n static get twoDigitCutoffYear() {\n return twoDigitCutoffYear;\n }\n\n /**\n * Set the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx.\n * @type {number}\n * @example Settings.twoDigitCutoffYear = 0 // all 'yy' are interpreted as 20th century\n * @example Settings.twoDigitCutoffYear = 99 // all 'yy' are interpreted as 21st century\n * @example Settings.twoDigitCutoffYear = 50 // '49' -> 2049; '50' -> 1950\n * @example Settings.twoDigitCutoffYear = 1950 // interpreted as 50\n * @example Settings.twoDigitCutoffYear = 2050 // ALSO interpreted as 50\n */\n static set twoDigitCutoffYear(cutoffYear) {\n twoDigitCutoffYear = cutoffYear % 100;\n }\n\n /**\n * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n * @type {boolean}\n */\n static get throwOnInvalid() {\n return throwOnInvalid;\n }\n\n /**\n * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n * @type {boolean}\n */\n static set throwOnInvalid(t) {\n throwOnInvalid = t;\n }\n\n /**\n * Reset Luxon's global caches. Should only be necessary in testing scenarios.\n * @return {void}\n */\n static resetCaches() {\n Locale.resetCache();\n IANAZone.resetCache();\n DateTime.resetCache();\n resetDigitRegexCache();\n }\n}\n","export default class Invalid {\n constructor(reason, explanation) {\n this.reason = reason;\n this.explanation = explanation;\n }\n\n toMessage() {\n if (this.explanation) {\n return `${this.reason}: ${this.explanation}`;\n } else {\n return this.reason;\n }\n }\n}\n","import {\n integerBetween,\n isLeapYear,\n timeObject,\n daysInYear,\n daysInMonth,\n weeksInWeekYear,\n isInteger,\n isUndefined,\n} from \"./util.js\";\nimport Invalid from \"./invalid.js\";\nimport { ConflictingSpecificationError } from \"../errors.js\";\n\nconst nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334],\n leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335];\n\nfunction unitOutOfRange(unit, value) {\n return new Invalid(\n \"unit out of range\",\n `you specified ${value} (of type ${typeof value}) as a ${unit}, which is invalid`\n );\n}\n\nexport function dayOfWeek(year, month, day) {\n const d = new Date(Date.UTC(year, month - 1, day));\n\n if (year < 100 && year >= 0) {\n d.setUTCFullYear(d.getUTCFullYear() - 1900);\n }\n\n const js = d.getUTCDay();\n\n return js === 0 ? 7 : js;\n}\n\nfunction computeOrdinal(year, month, day) {\n return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1];\n}\n\nfunction uncomputeOrdinal(year, ordinal) {\n const table = isLeapYear(year) ? leapLadder : nonLeapLadder,\n month0 = table.findIndex((i) => i < ordinal),\n day = ordinal - table[month0];\n return { month: month0 + 1, day };\n}\n\nexport function isoWeekdayToLocal(isoWeekday, startOfWeek) {\n return ((isoWeekday - startOfWeek + 7) % 7) + 1;\n}\n\n/**\n * @private\n */\n\nexport function gregorianToWeek(gregObj, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const { year, month, day } = gregObj,\n ordinal = computeOrdinal(year, month, day),\n weekday = isoWeekdayToLocal(dayOfWeek(year, month, day), startOfWeek);\n\n let weekNumber = Math.floor((ordinal - weekday + 14 - minDaysInFirstWeek) / 7),\n weekYear;\n\n if (weekNumber < 1) {\n weekYear = year - 1;\n weekNumber = weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek);\n } else if (weekNumber > weeksInWeekYear(year, minDaysInFirstWeek, startOfWeek)) {\n weekYear = year + 1;\n weekNumber = 1;\n } else {\n weekYear = year;\n }\n\n return { weekYear, weekNumber, weekday, ...timeObject(gregObj) };\n}\n\nexport function weekToGregorian(weekData, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const { weekYear, weekNumber, weekday } = weekData,\n weekdayOfJan4 = isoWeekdayToLocal(dayOfWeek(weekYear, 1, minDaysInFirstWeek), startOfWeek),\n yearInDays = daysInYear(weekYear);\n\n let ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 7 + minDaysInFirstWeek,\n year;\n\n if (ordinal < 1) {\n year = weekYear - 1;\n ordinal += daysInYear(year);\n } else if (ordinal > yearInDays) {\n year = weekYear + 1;\n ordinal -= daysInYear(weekYear);\n } else {\n year = weekYear;\n }\n\n const { month, day } = uncomputeOrdinal(year, ordinal);\n return { year, month, day, ...timeObject(weekData) };\n}\n\nexport function gregorianToOrdinal(gregData) {\n const { year, month, day } = gregData;\n const ordinal = computeOrdinal(year, month, day);\n return { year, ordinal, ...timeObject(gregData) };\n}\n\nexport function ordinalToGregorian(ordinalData) {\n const { year, ordinal } = ordinalData;\n const { month, day } = uncomputeOrdinal(year, ordinal);\n return { year, month, day, ...timeObject(ordinalData) };\n}\n\n/**\n * Check if local week units like localWeekday are used in obj.\n * If so, validates that they are not mixed with ISO week units and then copies them to the normal week unit properties.\n * Modifies obj in-place!\n * @param obj the object values\n */\nexport function usesLocalWeekValues(obj, loc) {\n const hasLocaleWeekData =\n !isUndefined(obj.localWeekday) ||\n !isUndefined(obj.localWeekNumber) ||\n !isUndefined(obj.localWeekYear);\n if (hasLocaleWeekData) {\n const hasIsoWeekData =\n !isUndefined(obj.weekday) || !isUndefined(obj.weekNumber) || !isUndefined(obj.weekYear);\n\n if (hasIsoWeekData) {\n throw new ConflictingSpecificationError(\n \"Cannot mix locale-based week fields with ISO-based week fields\"\n );\n }\n if (!isUndefined(obj.localWeekday)) obj.weekday = obj.localWeekday;\n if (!isUndefined(obj.localWeekNumber)) obj.weekNumber = obj.localWeekNumber;\n if (!isUndefined(obj.localWeekYear)) obj.weekYear = obj.localWeekYear;\n delete obj.localWeekday;\n delete obj.localWeekNumber;\n delete obj.localWeekYear;\n return {\n minDaysInFirstWeek: loc.getMinDaysInFirstWeek(),\n startOfWeek: loc.getStartOfWeek(),\n };\n } else {\n return { minDaysInFirstWeek: 4, startOfWeek: 1 };\n }\n}\n\nexport function hasInvalidWeekData(obj, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const validYear = isInteger(obj.weekYear),\n validWeek = integerBetween(\n obj.weekNumber,\n 1,\n weeksInWeekYear(obj.weekYear, minDaysInFirstWeek, startOfWeek)\n ),\n validWeekday = integerBetween(obj.weekday, 1, 7);\n\n if (!validYear) {\n return unitOutOfRange(\"weekYear\", obj.weekYear);\n } else if (!validWeek) {\n return unitOutOfRange(\"week\", obj.weekNumber);\n } else if (!validWeekday) {\n return unitOutOfRange(\"weekday\", obj.weekday);\n } else return false;\n}\n\nexport function hasInvalidOrdinalData(obj) {\n const validYear = isInteger(obj.year),\n validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year));\n\n if (!validYear) {\n return unitOutOfRange(\"year\", obj.year);\n } else if (!validOrdinal) {\n return unitOutOfRange(\"ordinal\", obj.ordinal);\n } else return false;\n}\n\nexport function hasInvalidGregorianData(obj) {\n const validYear = isInteger(obj.year),\n validMonth = integerBetween(obj.month, 1, 12),\n validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month));\n\n if (!validYear) {\n return unitOutOfRange(\"year\", obj.year);\n } else if (!validMonth) {\n return unitOutOfRange(\"month\", obj.month);\n } else if (!validDay) {\n return unitOutOfRange(\"day\", obj.day);\n } else return false;\n}\n\nexport function hasInvalidTimeData(obj) {\n const { hour, minute, second, millisecond } = obj;\n const validHour =\n integerBetween(hour, 0, 23) ||\n (hour === 24 && minute === 0 && second === 0 && millisecond === 0),\n validMinute = integerBetween(minute, 0, 59),\n validSecond = integerBetween(second, 0, 59),\n validMillisecond = integerBetween(millisecond, 0, 999);\n\n if (!validHour) {\n return unitOutOfRange(\"hour\", hour);\n } else if (!validMinute) {\n return unitOutOfRange(\"minute\", minute);\n } else if (!validSecond) {\n return unitOutOfRange(\"second\", second);\n } else if (!validMillisecond) {\n return unitOutOfRange(\"millisecond\", millisecond);\n } else return false;\n}\n","/*\n This is just a junk drawer, containing anything used across multiple classes.\n Because Luxon is small(ish), this should stay small and we won't worry about splitting\n it up into, say, parsingUtil.js and basicUtil.js and so on. But they are divided up by feature area.\n*/\n\nimport { InvalidArgumentError } from \"../errors.js\";\nimport Settings from \"../settings.js\";\nimport { dayOfWeek, isoWeekdayToLocal } from \"./conversions.js\";\n\n/**\n * @private\n */\n\n// TYPES\n\nexport function isUndefined(o) {\n return typeof o === \"undefined\";\n}\n\nexport function isNumber(o) {\n return typeof o === \"number\";\n}\n\nexport function isInteger(o) {\n return typeof o === \"number\" && o % 1 === 0;\n}\n\nexport function isString(o) {\n return typeof o === \"string\";\n}\n\nexport function isDate(o) {\n return Object.prototype.toString.call(o) === \"[object Date]\";\n}\n\n// CAPABILITIES\n\nexport function hasRelative() {\n try {\n return typeof Intl !== \"undefined\" && !!Intl.RelativeTimeFormat;\n } catch (e) {\n return false;\n }\n}\n\nexport function hasLocaleWeekInfo() {\n try {\n return (\n typeof Intl !== \"undefined\" &&\n !!Intl.Locale &&\n (\"weekInfo\" in Intl.Locale.prototype || \"getWeekInfo\" in Intl.Locale.prototype)\n );\n } catch (e) {\n return false;\n }\n}\n\n// OBJECTS AND ARRAYS\n\nexport function maybeArray(thing) {\n return Array.isArray(thing) ? thing : [thing];\n}\n\nexport function bestBy(arr, by, compare) {\n if (arr.length === 0) {\n return undefined;\n }\n return arr.reduce((best, next) => {\n const pair = [by(next), next];\n if (!best) {\n return pair;\n } else if (compare(best[0], pair[0]) === best[0]) {\n return best;\n } else {\n return pair;\n }\n }, null)[1];\n}\n\nexport function pick(obj, keys) {\n return keys.reduce((a, k) => {\n a[k] = obj[k];\n return a;\n }, {});\n}\n\nexport function hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nexport function validateWeekSettings(settings) {\n if (settings == null) {\n return null;\n } else if (typeof settings !== \"object\") {\n throw new InvalidArgumentError(\"Week settings must be an object\");\n } else {\n if (\n !integerBetween(settings.firstDay, 1, 7) ||\n !integerBetween(settings.minimalDays, 1, 7) ||\n !Array.isArray(settings.weekend) ||\n settings.weekend.some((v) => !integerBetween(v, 1, 7))\n ) {\n throw new InvalidArgumentError(\"Invalid week settings\");\n }\n return {\n firstDay: settings.firstDay,\n minimalDays: settings.minimalDays,\n weekend: Array.from(settings.weekend),\n };\n }\n}\n\n// NUMBERS AND STRINGS\n\nexport function integerBetween(thing, bottom, top) {\n return isInteger(thing) && thing >= bottom && thing <= top;\n}\n\n// x % n but takes the sign of n instead of x\nexport function floorMod(x, n) {\n return x - n * Math.floor(x / n);\n}\n\nexport function padStart(input, n = 2) {\n const isNeg = input < 0;\n let padded;\n if (isNeg) {\n padded = \"-\" + (\"\" + -input).padStart(n, \"0\");\n } else {\n padded = (\"\" + input).padStart(n, \"0\");\n }\n return padded;\n}\n\nexport function parseInteger(string) {\n if (isUndefined(string) || string === null || string === \"\") {\n return undefined;\n } else {\n return parseInt(string, 10);\n }\n}\n\nexport function parseFloating(string) {\n if (isUndefined(string) || string === null || string === \"\") {\n return undefined;\n } else {\n return parseFloat(string);\n }\n}\n\nexport function parseMillis(fraction) {\n // Return undefined (instead of 0) in these cases, where fraction is not set\n if (isUndefined(fraction) || fraction === null || fraction === \"\") {\n return undefined;\n } else {\n const f = parseFloat(\"0.\" + fraction) * 1000;\n return Math.floor(f);\n }\n}\n\nexport function roundTo(number, digits, rounding = \"round\") {\n const factor = 10 ** digits;\n switch (rounding) {\n case \"expand\":\n return number > 0\n ? Math.ceil(number * factor) / factor\n : Math.floor(number * factor) / factor;\n case \"trunc\":\n return Math.trunc(number * factor) / factor;\n case \"round\":\n return Math.round(number * factor) / factor;\n case \"floor\":\n return Math.floor(number * factor) / factor;\n case \"ceil\":\n return Math.ceil(number * factor) / factor;\n default:\n throw new RangeError(`Value rounding ${rounding} is out of range`);\n }\n}\n\n// DATE BASICS\n\nexport function isLeapYear(year) {\n return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n}\n\nexport function daysInYear(year) {\n return isLeapYear(year) ? 366 : 365;\n}\n\nexport function daysInMonth(year, month) {\n const modMonth = floorMod(month - 1, 12) + 1,\n modYear = year + (month - modMonth) / 12;\n\n if (modMonth === 2) {\n return isLeapYear(modYear) ? 29 : 28;\n } else {\n return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1];\n }\n}\n\n// convert a calendar object to a local timestamp (epoch, but with the offset baked in)\nexport function objToLocalTS(obj) {\n let d = Date.UTC(\n obj.year,\n obj.month - 1,\n obj.day,\n obj.hour,\n obj.minute,\n obj.second,\n obj.millisecond\n );\n\n // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that\n if (obj.year < 100 && obj.year >= 0) {\n d = new Date(d);\n // set the month and day again, this is necessary because year 2000 is a leap year, but year 100 is not\n // so if obj.year is in 99, but obj.day makes it roll over into year 100,\n // the calculations done by Date.UTC are using year 2000 - which is incorrect\n d.setUTCFullYear(obj.year, obj.month - 1, obj.day);\n }\n return +d;\n}\n\n// adapted from moment.js: https://github.com/moment/moment/blob/000ac1800e620f770f4eb31b5ae908f6167b0ab2/src/lib/units/week-calendar-utils.js\nfunction firstWeekOffset(year, minDaysInFirstWeek, startOfWeek) {\n const fwdlw = isoWeekdayToLocal(dayOfWeek(year, 1, minDaysInFirstWeek), startOfWeek);\n return -fwdlw + minDaysInFirstWeek - 1;\n}\n\nexport function weeksInWeekYear(weekYear, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const weekOffset = firstWeekOffset(weekYear, minDaysInFirstWeek, startOfWeek);\n const weekOffsetNext = firstWeekOffset(weekYear + 1, minDaysInFirstWeek, startOfWeek);\n return (daysInYear(weekYear) - weekOffset + weekOffsetNext) / 7;\n}\n\nexport function untruncateYear(year) {\n if (year > 99) {\n return year;\n } else return year > Settings.twoDigitCutoffYear ? 1900 + year : 2000 + year;\n}\n\n// PARSING\n\nexport function parseZoneInfo(ts, offsetFormat, locale, timeZone = null) {\n const date = new Date(ts),\n intlOpts = {\n hourCycle: \"h23\",\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n };\n\n if (timeZone) {\n intlOpts.timeZone = timeZone;\n }\n\n const modified = { timeZoneName: offsetFormat, ...intlOpts };\n\n const parsed = new Intl.DateTimeFormat(locale, modified)\n .formatToParts(date)\n .find((m) => m.type.toLowerCase() === \"timezonename\");\n return parsed ? parsed.value : null;\n}\n\n// signedOffset('-5', '30') -> -330\nexport function signedOffset(offHourStr, offMinuteStr) {\n let offHour = parseInt(offHourStr, 10);\n\n // don't || this because we want to preserve -0\n if (Number.isNaN(offHour)) {\n offHour = 0;\n }\n\n const offMin = parseInt(offMinuteStr, 10) || 0,\n offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin;\n return offHour * 60 + offMinSigned;\n}\n\n// COERCION\n\nexport function asNumber(value) {\n const numericValue = Number(value);\n if (typeof value === \"boolean\" || value === \"\" || !Number.isFinite(numericValue))\n throw new InvalidArgumentError(`Invalid unit value ${value}`);\n return numericValue;\n}\n\nexport function normalizeObject(obj, normalizer) {\n const normalized = {};\n for (const u in obj) {\n if (hasOwnProperty(obj, u)) {\n const v = obj[u];\n if (v === undefined || v === null) continue;\n normalized[normalizer(u)] = asNumber(v);\n }\n }\n return normalized;\n}\n\n/**\n * Returns the offset's value as a string\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\nexport function formatOffset(offset, format) {\n const hours = Math.trunc(Math.abs(offset / 60)),\n minutes = Math.trunc(Math.abs(offset % 60)),\n sign = offset >= 0 ? \"+\" : \"-\";\n\n switch (format) {\n case \"short\":\n return `${sign}${padStart(hours, 2)}:${padStart(minutes, 2)}`;\n case \"narrow\":\n return `${sign}${hours}${minutes > 0 ? `:${minutes}` : \"\"}`;\n case \"techie\":\n return `${sign}${padStart(hours, 2)}${padStart(minutes, 2)}`;\n default:\n throw new RangeError(`Value format ${format} is out of range for property format`);\n }\n}\n\nexport function timeObject(obj) {\n return pick(obj, [\"hour\", \"minute\", \"second\", \"millisecond\"]);\n}\n","import * as Formats from \"./formats.js\";\nimport { pick } from \"./util.js\";\n\nfunction stringify(obj) {\n return JSON.stringify(obj, Object.keys(obj).sort());\n}\n\n/**\n * @private\n */\n\nexport const monthsLong = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\nexport const monthsShort = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n];\n\nexport const monthsNarrow = [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"];\n\nexport function months(length) {\n switch (length) {\n case \"narrow\":\n return [...monthsNarrow];\n case \"short\":\n return [...monthsShort];\n case \"long\":\n return [...monthsLong];\n case \"numeric\":\n return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\"];\n case \"2-digit\":\n return [\"01\", \"02\", \"03\", \"04\", \"05\", \"06\", \"07\", \"08\", \"09\", \"10\", \"11\", \"12\"];\n default:\n return null;\n }\n}\n\nexport const weekdaysLong = [\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n \"Sunday\",\n];\n\nexport const weekdaysShort = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\n\nexport const weekdaysNarrow = [\"M\", \"T\", \"W\", \"T\", \"F\", \"S\", \"S\"];\n\nexport function weekdays(length) {\n switch (length) {\n case \"narrow\":\n return [...weekdaysNarrow];\n case \"short\":\n return [...weekdaysShort];\n case \"long\":\n return [...weekdaysLong];\n case \"numeric\":\n return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\"];\n default:\n return null;\n }\n}\n\nexport const meridiems = [\"AM\", \"PM\"];\n\nexport const erasLong = [\"Before Christ\", \"Anno Domini\"];\n\nexport const erasShort = [\"BC\", \"AD\"];\n\nexport const erasNarrow = [\"B\", \"A\"];\n\nexport function eras(length) {\n switch (length) {\n case \"narrow\":\n return [...erasNarrow];\n case \"short\":\n return [...erasShort];\n case \"long\":\n return [...erasLong];\n default:\n return null;\n }\n}\n\nexport function meridiemForDateTime(dt) {\n return meridiems[dt.hour < 12 ? 0 : 1];\n}\n\nexport function weekdayForDateTime(dt, length) {\n return weekdays(length)[dt.weekday - 1];\n}\n\nexport function monthForDateTime(dt, length) {\n return months(length)[dt.month - 1];\n}\n\nexport function eraForDateTime(dt, length) {\n return eras(length)[dt.year < 0 ? 0 : 1];\n}\n\nexport function formatRelativeTime(unit, count, numeric = \"always\", narrow = false) {\n const units = {\n years: [\"year\", \"yr.\"],\n quarters: [\"quarter\", \"qtr.\"],\n months: [\"month\", \"mo.\"],\n weeks: [\"week\", \"wk.\"],\n days: [\"day\", \"day\", \"days\"],\n hours: [\"hour\", \"hr.\"],\n minutes: [\"minute\", \"min.\"],\n seconds: [\"second\", \"sec.\"],\n };\n\n const lastable = [\"hours\", \"minutes\", \"seconds\"].indexOf(unit) === -1;\n\n if (numeric === \"auto\" && lastable) {\n const isDay = unit === \"days\";\n switch (count) {\n case 1:\n return isDay ? \"tomorrow\" : `next ${units[unit][0]}`;\n case -1:\n return isDay ? \"yesterday\" : `last ${units[unit][0]}`;\n case 0:\n return isDay ? \"today\" : `this ${units[unit][0]}`;\n default: // fall through\n }\n }\n\n const isInPast = Object.is(count, -0) || count < 0,\n fmtValue = Math.abs(count),\n singular = fmtValue === 1,\n lilUnits = units[unit],\n fmtUnit = narrow\n ? singular\n ? lilUnits[1]\n : lilUnits[2] || lilUnits[1]\n : singular\n ? units[unit][0]\n : unit;\n return isInPast ? `${fmtValue} ${fmtUnit} ago` : `in ${fmtValue} ${fmtUnit}`;\n}\n\nexport function formatString(knownFormat) {\n // these all have the offsets removed because we don't have access to them\n // without all the intl stuff this is backfilling\n const filtered = pick(knownFormat, [\n \"weekday\",\n \"era\",\n \"year\",\n \"month\",\n \"day\",\n \"hour\",\n \"minute\",\n \"second\",\n \"timeZoneName\",\n \"hourCycle\",\n ]),\n key = stringify(filtered),\n dateTimeHuge = \"EEEE, LLLL d, yyyy, h:mm a\";\n switch (key) {\n case stringify(Formats.DATE_SHORT):\n return \"M/d/yyyy\";\n case stringify(Formats.DATE_MED):\n return \"LLL d, yyyy\";\n case stringify(Formats.DATE_MED_WITH_WEEKDAY):\n return \"EEE, LLL d, yyyy\";\n case stringify(Formats.DATE_FULL):\n return \"LLLL d, yyyy\";\n case stringify(Formats.DATE_HUGE):\n return \"EEEE, LLLL d, yyyy\";\n case stringify(Formats.TIME_SIMPLE):\n return \"h:mm a\";\n case stringify(Formats.TIME_WITH_SECONDS):\n return \"h:mm:ss a\";\n case stringify(Formats.TIME_WITH_SHORT_OFFSET):\n return \"h:mm a\";\n case stringify(Formats.TIME_WITH_LONG_OFFSET):\n return \"h:mm a\";\n case stringify(Formats.TIME_24_SIMPLE):\n return \"HH:mm\";\n case stringify(Formats.TIME_24_WITH_SECONDS):\n return \"HH:mm:ss\";\n case stringify(Formats.TIME_24_WITH_SHORT_OFFSET):\n return \"HH:mm\";\n case stringify(Formats.TIME_24_WITH_LONG_OFFSET):\n return \"HH:mm\";\n case stringify(Formats.DATETIME_SHORT):\n return \"M/d/yyyy, h:mm a\";\n case stringify(Formats.DATETIME_MED):\n return \"LLL d, yyyy, h:mm a\";\n case stringify(Formats.DATETIME_FULL):\n return \"LLLL d, yyyy, h:mm a\";\n case stringify(Formats.DATETIME_HUGE):\n return dateTimeHuge;\n case stringify(Formats.DATETIME_SHORT_WITH_SECONDS):\n return \"M/d/yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_MED_WITH_SECONDS):\n return \"LLL d, yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_MED_WITH_WEEKDAY):\n return \"EEE, d LLL yyyy, h:mm a\";\n case stringify(Formats.DATETIME_FULL_WITH_SECONDS):\n return \"LLLL d, yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_HUGE_WITH_SECONDS):\n return \"EEEE, LLLL d, yyyy, h:mm:ss a\";\n default:\n return dateTimeHuge;\n }\n}\n","import * as English from \"./english.js\";\nimport * as Formats from \"./formats.js\";\nimport { padStart } from \"./util.js\";\n\nfunction stringifyTokens(splits, tokenToString) {\n let s = \"\";\n for (const token of splits) {\n if (token.literal) {\n s += token.val;\n } else {\n s += tokenToString(token.val);\n }\n }\n return s;\n}\n\nconst macroTokenToFormatOpts = {\n D: Formats.DATE_SHORT,\n DD: Formats.DATE_MED,\n DDD: Formats.DATE_FULL,\n DDDD: Formats.DATE_HUGE,\n t: Formats.TIME_SIMPLE,\n tt: Formats.TIME_WITH_SECONDS,\n ttt: Formats.TIME_WITH_SHORT_OFFSET,\n tttt: Formats.TIME_WITH_LONG_OFFSET,\n T: Formats.TIME_24_SIMPLE,\n TT: Formats.TIME_24_WITH_SECONDS,\n TTT: Formats.TIME_24_WITH_SHORT_OFFSET,\n TTTT: Formats.TIME_24_WITH_LONG_OFFSET,\n f: Formats.DATETIME_SHORT,\n ff: Formats.DATETIME_MED,\n fff: Formats.DATETIME_FULL,\n ffff: Formats.DATETIME_HUGE,\n F: Formats.DATETIME_SHORT_WITH_SECONDS,\n FF: Formats.DATETIME_MED_WITH_SECONDS,\n FFF: Formats.DATETIME_FULL_WITH_SECONDS,\n FFFF: Formats.DATETIME_HUGE_WITH_SECONDS,\n};\n\n/**\n * @private\n */\n\nexport default class Formatter {\n static create(locale, opts = {}) {\n return new Formatter(locale, opts);\n }\n\n static parseFormat(fmt) {\n // white-space is always considered a literal in user-provided formats\n // the \" \" token has a special meaning (see unitForToken)\n\n let current = null,\n currentFull = \"\",\n bracketed = false;\n const splits = [];\n for (let i = 0; i < fmt.length; i++) {\n const c = fmt.charAt(i);\n if (c === \"'\") {\n // turn '' into a literal signal quote instead of just skipping the empty literal\n if (currentFull.length > 0 || bracketed) {\n splits.push({\n literal: bracketed || /^\\s+$/.test(currentFull),\n val: currentFull === \"\" ? \"'\" : currentFull,\n });\n }\n current = null;\n currentFull = \"\";\n bracketed = !bracketed;\n } else if (bracketed) {\n currentFull += c;\n } else if (c === current) {\n currentFull += c;\n } else {\n if (currentFull.length > 0) {\n splits.push({ literal: /^\\s+$/.test(currentFull), val: currentFull });\n }\n currentFull = c;\n current = c;\n }\n }\n\n if (currentFull.length > 0) {\n splits.push({ literal: bracketed || /^\\s+$/.test(currentFull), val: currentFull });\n }\n\n return splits;\n }\n\n static macroTokenToFormatOpts(token) {\n return macroTokenToFormatOpts[token];\n }\n\n constructor(locale, formatOpts) {\n this.opts = formatOpts;\n this.loc = locale;\n this.systemLoc = null;\n }\n\n formatWithSystemDefault(dt, opts) {\n if (this.systemLoc === null) {\n this.systemLoc = this.loc.redefaultToSystem();\n }\n const df = this.systemLoc.dtFormatter(dt, { ...this.opts, ...opts });\n return df.format();\n }\n\n dtFormatter(dt, opts = {}) {\n return this.loc.dtFormatter(dt, { ...this.opts, ...opts });\n }\n\n formatDateTime(dt, opts) {\n return this.dtFormatter(dt, opts).format();\n }\n\n formatDateTimeParts(dt, opts) {\n return this.dtFormatter(dt, opts).formatToParts();\n }\n\n formatInterval(interval, opts) {\n const df = this.dtFormatter(interval.start, opts);\n return df.dtf.formatRange(interval.start.toJSDate(), interval.end.toJSDate());\n }\n\n resolvedOptions(dt, opts) {\n return this.dtFormatter(dt, opts).resolvedOptions();\n }\n\n num(n, p = 0, signDisplay = undefined) {\n // we get some perf out of doing this here, annoyingly\n if (this.opts.forceSimple) {\n return padStart(n, p);\n }\n\n const opts = { ...this.opts };\n\n if (p > 0) {\n opts.padTo = p;\n }\n if (signDisplay) {\n opts.signDisplay = signDisplay;\n }\n\n return this.loc.numberFormatter(opts).format(n);\n }\n\n formatDateTimeFromString(dt, fmt) {\n const knownEnglish = this.loc.listingMode() === \"en\",\n useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== \"gregory\",\n string = (opts, extract) => this.loc.extract(dt, opts, extract),\n formatOffset = (opts) => {\n if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) {\n return \"Z\";\n }\n\n return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : \"\";\n },\n meridiem = () =>\n knownEnglish\n ? English.meridiemForDateTime(dt)\n : string({ hour: \"numeric\", hourCycle: \"h12\" }, \"dayperiod\"),\n month = (length, standalone) =>\n knownEnglish\n ? English.monthForDateTime(dt, length)\n : string(standalone ? { month: length } : { month: length, day: \"numeric\" }, \"month\"),\n weekday = (length, standalone) =>\n knownEnglish\n ? English.weekdayForDateTime(dt, length)\n : string(\n standalone ? { weekday: length } : { weekday: length, month: \"long\", day: \"numeric\" },\n \"weekday\"\n ),\n maybeMacro = (token) => {\n const formatOpts = Formatter.macroTokenToFormatOpts(token);\n if (formatOpts) {\n return this.formatWithSystemDefault(dt, formatOpts);\n } else {\n return token;\n }\n },\n era = (length) =>\n knownEnglish ? English.eraForDateTime(dt, length) : string({ era: length }, \"era\"),\n tokenToString = (token) => {\n // Where possible: https://cldr.unicode.org/translation/date-time/date-time-symbols\n switch (token) {\n // ms\n case \"S\":\n return this.num(dt.millisecond);\n case \"u\":\n // falls through\n case \"SSS\":\n return this.num(dt.millisecond, 3);\n // seconds\n case \"s\":\n return this.num(dt.second);\n case \"ss\":\n return this.num(dt.second, 2);\n // fractional seconds\n case \"uu\":\n return this.num(Math.floor(dt.millisecond / 10), 2);\n case \"uuu\":\n return this.num(Math.floor(dt.millisecond / 100));\n // minutes\n case \"m\":\n return this.num(dt.minute);\n case \"mm\":\n return this.num(dt.minute, 2);\n // hours\n case \"h\":\n return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12);\n case \"hh\":\n return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2);\n case \"H\":\n return this.num(dt.hour);\n case \"HH\":\n return this.num(dt.hour, 2);\n // offset\n case \"Z\":\n // like +6\n return formatOffset({ format: \"narrow\", allowZ: this.opts.allowZ });\n case \"ZZ\":\n // like +06:00\n return formatOffset({ format: \"short\", allowZ: this.opts.allowZ });\n case \"ZZZ\":\n // like +0600\n return formatOffset({ format: \"techie\", allowZ: this.opts.allowZ });\n case \"ZZZZ\":\n // like EST\n return dt.zone.offsetName(dt.ts, { format: \"short\", locale: this.loc.locale });\n case \"ZZZZZ\":\n // like Eastern Standard Time\n return dt.zone.offsetName(dt.ts, { format: \"long\", locale: this.loc.locale });\n // zone\n case \"z\":\n // like America/New_York\n return dt.zoneName;\n // meridiems\n case \"a\":\n return meridiem();\n // dates\n case \"d\":\n return useDateTimeFormatter ? string({ day: \"numeric\" }, \"day\") : this.num(dt.day);\n case \"dd\":\n return useDateTimeFormatter ? string({ day: \"2-digit\" }, \"day\") : this.num(dt.day, 2);\n // weekdays - standalone\n case \"c\":\n // like 1\n return this.num(dt.weekday);\n case \"ccc\":\n // like 'Tues'\n return weekday(\"short\", true);\n case \"cccc\":\n // like 'Tuesday'\n return weekday(\"long\", true);\n case \"ccccc\":\n // like 'T'\n return weekday(\"narrow\", true);\n // weekdays - format\n case \"E\":\n // like 1\n return this.num(dt.weekday);\n case \"EEE\":\n // like 'Tues'\n return weekday(\"short\", false);\n case \"EEEE\":\n // like 'Tuesday'\n return weekday(\"long\", false);\n case \"EEEEE\":\n // like 'T'\n return weekday(\"narrow\", false);\n // months - standalone\n case \"L\":\n // like 1\n return useDateTimeFormatter\n ? string({ month: \"numeric\", day: \"numeric\" }, \"month\")\n : this.num(dt.month);\n case \"LL\":\n // like 01, doesn't seem to work\n return useDateTimeFormatter\n ? string({ month: \"2-digit\", day: \"numeric\" }, \"month\")\n : this.num(dt.month, 2);\n case \"LLL\":\n // like Jan\n return month(\"short\", true);\n case \"LLLL\":\n // like January\n return month(\"long\", true);\n case \"LLLLL\":\n // like J\n return month(\"narrow\", true);\n // months - format\n case \"M\":\n // like 1\n return useDateTimeFormatter\n ? string({ month: \"numeric\" }, \"month\")\n : this.num(dt.month);\n case \"MM\":\n // like 01\n return useDateTimeFormatter\n ? string({ month: \"2-digit\" }, \"month\")\n : this.num(dt.month, 2);\n case \"MMM\":\n // like Jan\n return month(\"short\", false);\n case \"MMMM\":\n // like January\n return month(\"long\", false);\n case \"MMMMM\":\n // like J\n return month(\"narrow\", false);\n // years\n case \"y\":\n // like 2014\n return useDateTimeFormatter ? string({ year: \"numeric\" }, \"year\") : this.num(dt.year);\n case \"yy\":\n // like 14\n return useDateTimeFormatter\n ? string({ year: \"2-digit\" }, \"year\")\n : this.num(dt.year.toString().slice(-2), 2);\n case \"yyyy\":\n // like 0012\n return useDateTimeFormatter\n ? string({ year: \"numeric\" }, \"year\")\n : this.num(dt.year, 4);\n case \"yyyyyy\":\n // like 000012\n return useDateTimeFormatter\n ? string({ year: \"numeric\" }, \"year\")\n : this.num(dt.year, 6);\n // eras\n case \"G\":\n // like AD\n return era(\"short\");\n case \"GG\":\n // like Anno Domini\n return era(\"long\");\n case \"GGGGG\":\n return era(\"narrow\");\n case \"kk\":\n return this.num(dt.weekYear.toString().slice(-2), 2);\n case \"kkkk\":\n return this.num(dt.weekYear, 4);\n case \"W\":\n return this.num(dt.weekNumber);\n case \"WW\":\n return this.num(dt.weekNumber, 2);\n case \"n\":\n return this.num(dt.localWeekNumber);\n case \"nn\":\n return this.num(dt.localWeekNumber, 2);\n case \"ii\":\n return this.num(dt.localWeekYear.toString().slice(-2), 2);\n case \"iiii\":\n return this.num(dt.localWeekYear, 4);\n case \"o\":\n return this.num(dt.ordinal);\n case \"ooo\":\n return this.num(dt.ordinal, 3);\n case \"q\":\n // like 1\n return this.num(dt.quarter);\n case \"qq\":\n // like 01\n return this.num(dt.quarter, 2);\n case \"X\":\n return this.num(Math.floor(dt.ts / 1000));\n case \"x\":\n return this.num(dt.ts);\n default:\n return maybeMacro(token);\n }\n };\n\n return stringifyTokens(Formatter.parseFormat(fmt), tokenToString);\n }\n\n formatDurationFromString(dur, fmt) {\n const invertLargest = this.opts.signMode === \"negativeLargestOnly\" ? -1 : 1;\n const tokenToField = (token) => {\n switch (token[0]) {\n case \"S\":\n return \"milliseconds\";\n case \"s\":\n return \"seconds\";\n case \"m\":\n return \"minutes\";\n case \"h\":\n return \"hours\";\n case \"d\":\n return \"days\";\n case \"w\":\n return \"weeks\";\n case \"M\":\n return \"months\";\n case \"y\":\n return \"years\";\n default:\n return null;\n }\n },\n tokenToString = (lildur, info) => (token) => {\n const mapped = tokenToField(token);\n if (mapped) {\n const inversionFactor =\n info.isNegativeDuration && mapped !== info.largestUnit ? invertLargest : 1;\n let signDisplay;\n if (this.opts.signMode === \"negativeLargestOnly\" && mapped !== info.largestUnit) {\n signDisplay = \"never\";\n } else if (this.opts.signMode === \"all\") {\n signDisplay = \"always\";\n } else {\n // \"auto\" and \"negative\" are the same, but \"auto\" has better support\n signDisplay = \"auto\";\n }\n return this.num(lildur.get(mapped) * inversionFactor, token.length, signDisplay);\n } else {\n return token;\n }\n },\n tokens = Formatter.parseFormat(fmt),\n realTokens = tokens.reduce(\n (found, { literal, val }) => (literal ? found : found.concat(val)),\n []\n ),\n collapsed = dur.shiftTo(...realTokens.map(tokenToField).filter((t) => t)),\n durationInfo = {\n isNegativeDuration: collapsed < 0,\n // this relies on \"collapsed\" being based on \"shiftTo\", which builds up the object\n // in order\n largestUnit: Object.keys(collapsed.values)[0],\n };\n return stringifyTokens(tokens, tokenToString(collapsed, durationInfo));\n }\n}\n","import {\n untruncateYear,\n signedOffset,\n parseInteger,\n parseMillis,\n isUndefined,\n parseFloating,\n} from \"./util.js\";\nimport * as English from \"./english.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\n\n/*\n * This file handles parsing for well-specified formats. Here's how it works:\n * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match.\n * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object\n * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence.\n * Extractors can take a \"cursor\" representing the offset in the match to look at. This makes it easy to combine extractors.\n * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions.\n * Some extractions are super dumb and simpleParse and fromStrings help DRY them.\n */\n\nconst ianaRegex = /[A-Za-z_+-]{1,256}(?::?\\/[A-Za-z0-9_+-]{1,256}(?:\\/[A-Za-z0-9_+-]{1,256})?)?/;\n\nfunction combineRegexes(...regexes) {\n const full = regexes.reduce((f, r) => f + r.source, \"\");\n return RegExp(`^${full}$`);\n}\n\nfunction combineExtractors(...extractors) {\n return (m) =>\n extractors\n .reduce(\n ([mergedVals, mergedZone, cursor], ex) => {\n const [val, zone, next] = ex(m, cursor);\n return [{ ...mergedVals, ...val }, zone || mergedZone, next];\n },\n [{}, null, 1]\n )\n .slice(0, 2);\n}\n\nfunction parse(s, ...patterns) {\n if (s == null) {\n return [null, null];\n }\n\n for (const [regex, extractor] of patterns) {\n const m = regex.exec(s);\n if (m) {\n return extractor(m);\n }\n }\n return [null, null];\n}\n\nfunction simpleParse(...keys) {\n return (match, cursor) => {\n const ret = {};\n let i;\n\n for (i = 0; i < keys.length; i++) {\n ret[keys[i]] = parseInteger(match[cursor + i]);\n }\n return [ret, null, cursor + i];\n };\n}\n\n// ISO and SQL parsing\nconst offsetRegex = /(?:([Zz])|([+-]\\d\\d)(?::?(\\d\\d))?)/;\nconst isoExtendedZone = `(?:${offsetRegex.source}?(?:\\\\[(${ianaRegex.source})\\\\])?)?`;\nconst isoTimeBaseRegex = /(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:[.,](\\d{1,30}))?)?)?/;\nconst isoTimeRegex = RegExp(`${isoTimeBaseRegex.source}${isoExtendedZone}`);\nconst isoTimeExtensionRegex = RegExp(`(?:[Tt]${isoTimeRegex.source})?`);\nconst isoYmdRegex = /([+-]\\d{6}|\\d{4})(?:-?(\\d\\d)(?:-?(\\d\\d))?)?/;\nconst isoWeekRegex = /(\\d{4})-?W(\\d\\d)(?:-?(\\d))?/;\nconst isoOrdinalRegex = /(\\d{4})-?(\\d{3})/;\nconst extractISOWeekData = simpleParse(\"weekYear\", \"weekNumber\", \"weekDay\");\nconst extractISOOrdinalData = simpleParse(\"year\", \"ordinal\");\nconst sqlYmdRegex = /(\\d{4})-(\\d\\d)-(\\d\\d)/; // dumbed-down version of the ISO one\nconst sqlTimeRegex = RegExp(\n `${isoTimeBaseRegex.source} ?(?:${offsetRegex.source}|(${ianaRegex.source}))?`\n);\nconst sqlTimeExtensionRegex = RegExp(`(?: ${sqlTimeRegex.source})?`);\n\nfunction int(match, pos, fallback) {\n const m = match[pos];\n return isUndefined(m) ? fallback : parseInteger(m);\n}\n\nfunction extractISOYmd(match, cursor) {\n const item = {\n year: int(match, cursor),\n month: int(match, cursor + 1, 1),\n day: int(match, cursor + 2, 1),\n };\n\n return [item, null, cursor + 3];\n}\n\nfunction extractISOTime(match, cursor) {\n const item = {\n hours: int(match, cursor, 0),\n minutes: int(match, cursor + 1, 0),\n seconds: int(match, cursor + 2, 0),\n milliseconds: parseMillis(match[cursor + 3]),\n };\n\n return [item, null, cursor + 4];\n}\n\nfunction extractISOOffset(match, cursor) {\n const local = !match[cursor] && !match[cursor + 1],\n fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]),\n zone = local ? null : FixedOffsetZone.instance(fullOffset);\n return [{}, zone, cursor + 3];\n}\n\nfunction extractIANAZone(match, cursor) {\n const zone = match[cursor] ? IANAZone.create(match[cursor]) : null;\n return [{}, zone, cursor + 1];\n}\n\n// ISO time parsing\n\nconst isoTimeOnly = RegExp(`^T?${isoTimeBaseRegex.source}$`);\n\n// ISO duration parsing\n\nconst isoDuration =\n /^-?P(?:(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)Y)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)M)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)W)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)D)?(?:T(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)H)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)M)?(?:(-?\\d{1,20})(?:[.,](-?\\d{1,20}))?S)?)?)$/;\n\nfunction extractISODuration(match) {\n const [s, yearStr, monthStr, weekStr, dayStr, hourStr, minuteStr, secondStr, millisecondsStr] =\n match;\n\n const hasNegativePrefix = s[0] === \"-\";\n const negativeSeconds = secondStr && secondStr[0] === \"-\";\n\n const maybeNegate = (num, force = false) =>\n num !== undefined && (force || (num && hasNegativePrefix)) ? -num : num;\n\n return [\n {\n years: maybeNegate(parseFloating(yearStr)),\n months: maybeNegate(parseFloating(monthStr)),\n weeks: maybeNegate(parseFloating(weekStr)),\n days: maybeNegate(parseFloating(dayStr)),\n hours: maybeNegate(parseFloating(hourStr)),\n minutes: maybeNegate(parseFloating(minuteStr)),\n seconds: maybeNegate(parseFloating(secondStr), secondStr === \"-0\"),\n milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds),\n },\n ];\n}\n\n// These are a little braindead. EDT *should* tell us that we're in, say, America/New_York\n// and not just that we're in -240 *right now*. But since I don't think these are used that often\n// I'm just going to ignore that\nconst obsOffsets = {\n GMT: 0,\n EDT: -4 * 60,\n EST: -5 * 60,\n CDT: -5 * 60,\n CST: -6 * 60,\n MDT: -6 * 60,\n MST: -7 * 60,\n PDT: -7 * 60,\n PST: -8 * 60,\n};\n\nfunction fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n const result = {\n year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr),\n month: English.monthsShort.indexOf(monthStr) + 1,\n day: parseInteger(dayStr),\n hour: parseInteger(hourStr),\n minute: parseInteger(minuteStr),\n };\n\n if (secondStr) result.second = parseInteger(secondStr);\n if (weekdayStr) {\n result.weekday =\n weekdayStr.length > 3\n ? English.weekdaysLong.indexOf(weekdayStr) + 1\n : English.weekdaysShort.indexOf(weekdayStr) + 1;\n }\n\n return result;\n}\n\n// RFC 2822/5322\nconst rfc2822 =\n /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\\d\\d)(\\d\\d)))$/;\n\nfunction extractRFC2822(match) {\n const [\n ,\n weekdayStr,\n dayStr,\n monthStr,\n yearStr,\n hourStr,\n minuteStr,\n secondStr,\n obsOffset,\n milOffset,\n offHourStr,\n offMinuteStr,\n ] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n\n let offset;\n if (obsOffset) {\n offset = obsOffsets[obsOffset];\n } else if (milOffset) {\n offset = 0;\n } else {\n offset = signedOffset(offHourStr, offMinuteStr);\n }\n\n return [result, new FixedOffsetZone(offset)];\n}\n\nfunction preprocessRFC2822(s) {\n // Remove comments and folding whitespace and replace multiple-spaces with a single space\n return s\n .replace(/\\([^()]*\\)|[\\n\\t]/g, \" \")\n .replace(/(\\s\\s+)/g, \" \")\n .trim();\n}\n\n// http date\n\nconst rfc1123 =\n /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\\d\\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\\d{4}) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n rfc850 =\n /^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\\d\\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n ascii =\n /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \\d|\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) (\\d{4})$/;\n\nfunction extractRFC1123Or850(match) {\n const [, weekdayStr, dayStr, monthStr, yearStr, hourStr, minuteStr, secondStr] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n return [result, FixedOffsetZone.utcInstance];\n}\n\nfunction extractASCII(match) {\n const [, weekdayStr, monthStr, dayStr, hourStr, minuteStr, secondStr, yearStr] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n return [result, FixedOffsetZone.utcInstance];\n}\n\nconst isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex);\nconst isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex);\nconst isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex);\nconst isoTimeCombinedRegex = combineRegexes(isoTimeRegex);\n\nconst extractISOYmdTimeAndOffset = combineExtractors(\n extractISOYmd,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOWeekTimeAndOffset = combineExtractors(\n extractISOWeekData,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOOrdinalDateAndTime = combineExtractors(\n extractISOOrdinalData,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOTimeAndOffset = combineExtractors(\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\n\n/*\n * @private\n */\n\nexport function parseISODate(s) {\n return parse(\n s,\n [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset],\n [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime],\n [isoTimeCombinedRegex, extractISOTimeAndOffset]\n );\n}\n\nexport function parseRFC2822Date(s) {\n return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]);\n}\n\nexport function parseHTTPDate(s) {\n return parse(\n s,\n [rfc1123, extractRFC1123Or850],\n [rfc850, extractRFC1123Or850],\n [ascii, extractASCII]\n );\n}\n\nexport function parseISODuration(s) {\n return parse(s, [isoDuration, extractISODuration]);\n}\n\nconst extractISOTimeOnly = combineExtractors(extractISOTime);\n\nexport function parseISOTimeOnly(s) {\n return parse(s, [isoTimeOnly, extractISOTimeOnly]);\n}\n\nconst sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex);\nconst sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex);\n\nconst extractISOTimeOffsetAndIANAZone = combineExtractors(\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\n\nexport function parseSQL(s) {\n return parse(\n s,\n [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]\n );\n}\n","import { InvalidArgumentError, InvalidDurationError, InvalidUnitError } from \"./errors.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport Invalid from \"./impl/invalid.js\";\nimport Locale from \"./impl/locale.js\";\nimport { parseISODuration, parseISOTimeOnly } from \"./impl/regexParser.js\";\nimport {\n asNumber,\n hasOwnProperty,\n isNumber,\n isUndefined,\n normalizeObject,\n roundTo,\n} from \"./impl/util.js\";\nimport Settings from \"./settings.js\";\nimport DateTime from \"./datetime.js\";\n\nconst INVALID = \"Invalid Duration\";\n\n// unit conversion constants\nexport const lowOrderMatrix = {\n weeks: {\n days: 7,\n hours: 7 * 24,\n minutes: 7 * 24 * 60,\n seconds: 7 * 24 * 60 * 60,\n milliseconds: 7 * 24 * 60 * 60 * 1000,\n },\n days: {\n hours: 24,\n minutes: 24 * 60,\n seconds: 24 * 60 * 60,\n milliseconds: 24 * 60 * 60 * 1000,\n },\n hours: { minutes: 60, seconds: 60 * 60, milliseconds: 60 * 60 * 1000 },\n minutes: { seconds: 60, milliseconds: 60 * 1000 },\n seconds: { milliseconds: 1000 },\n },\n casualMatrix = {\n years: {\n quarters: 4,\n months: 12,\n weeks: 52,\n days: 365,\n hours: 365 * 24,\n minutes: 365 * 24 * 60,\n seconds: 365 * 24 * 60 * 60,\n milliseconds: 365 * 24 * 60 * 60 * 1000,\n },\n quarters: {\n months: 3,\n weeks: 13,\n days: 91,\n hours: 91 * 24,\n minutes: 91 * 24 * 60,\n seconds: 91 * 24 * 60 * 60,\n milliseconds: 91 * 24 * 60 * 60 * 1000,\n },\n months: {\n weeks: 4,\n days: 30,\n hours: 30 * 24,\n minutes: 30 * 24 * 60,\n seconds: 30 * 24 * 60 * 60,\n milliseconds: 30 * 24 * 60 * 60 * 1000,\n },\n\n ...lowOrderMatrix,\n },\n daysInYearAccurate = 146097.0 / 400,\n daysInMonthAccurate = 146097.0 / 4800,\n accurateMatrix = {\n years: {\n quarters: 4,\n months: 12,\n weeks: daysInYearAccurate / 7,\n days: daysInYearAccurate,\n hours: daysInYearAccurate * 24,\n minutes: daysInYearAccurate * 24 * 60,\n seconds: daysInYearAccurate * 24 * 60 * 60,\n milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000,\n },\n quarters: {\n months: 3,\n weeks: daysInYearAccurate / 28,\n days: daysInYearAccurate / 4,\n hours: (daysInYearAccurate * 24) / 4,\n minutes: (daysInYearAccurate * 24 * 60) / 4,\n seconds: (daysInYearAccurate * 24 * 60 * 60) / 4,\n milliseconds: (daysInYearAccurate * 24 * 60 * 60 * 1000) / 4,\n },\n months: {\n weeks: daysInMonthAccurate / 7,\n days: daysInMonthAccurate,\n hours: daysInMonthAccurate * 24,\n minutes: daysInMonthAccurate * 24 * 60,\n seconds: daysInMonthAccurate * 24 * 60 * 60,\n milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000,\n },\n ...lowOrderMatrix,\n };\n\n// units ordered by size\nconst orderedUnits = [\n \"years\",\n \"quarters\",\n \"months\",\n \"weeks\",\n \"days\",\n \"hours\",\n \"minutes\",\n \"seconds\",\n \"milliseconds\",\n];\n\nconst reverseUnits = orderedUnits.slice(0).reverse();\n\n// clone really means \"create another instance just like this one, but with these changes\"\nfunction clone(dur, alts, clear = false) {\n // deep merge for vals\n const conf = {\n values: clear ? alts.values : { ...dur.values, ...(alts.values || {}) },\n loc: dur.loc.clone(alts.loc),\n conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy,\n matrix: alts.matrix || dur.matrix,\n };\n return new Duration(conf);\n}\n\nfunction durationToMillis(matrix, vals) {\n let sum = vals.milliseconds ?? 0;\n for (const unit of reverseUnits.slice(1)) {\n if (vals[unit]) {\n sum += vals[unit] * matrix[unit][\"milliseconds\"];\n }\n }\n return sum;\n}\n\n// NB: mutates parameters\nfunction normalizeValues(matrix, vals) {\n // the logic below assumes the overall value of the duration is positive\n // if this is not the case, factor is used to make it so\n const factor = durationToMillis(matrix, vals) < 0 ? -1 : 1;\n\n orderedUnits.reduceRight((previous, current) => {\n if (!isUndefined(vals[current])) {\n if (previous) {\n const previousVal = vals[previous] * factor;\n const conv = matrix[current][previous];\n\n // if (previousVal < 0):\n // lower order unit is negative (e.g. { years: 2, days: -2 })\n // normalize this by reducing the higher order unit by the appropriate amount\n // and increasing the lower order unit\n // this can never make the higher order unit negative, because this function only operates\n // on positive durations, so the amount of time represented by the lower order unit cannot\n // be larger than the higher order unit\n // else:\n // lower order unit is positive (e.g. { years: 2, days: 450 } or { years: -2, days: 450 })\n // in this case we attempt to convert as much as possible from the lower order unit into\n // the higher order one\n //\n // Math.floor takes care of both of these cases, rounding away from 0\n // if previousVal < 0 it makes the absolute value larger\n // if previousVal >= it makes the absolute value smaller\n const rollUp = Math.floor(previousVal / conv);\n vals[current] += rollUp * factor;\n vals[previous] -= rollUp * conv * factor;\n }\n return current;\n } else {\n return previous;\n }\n }, null);\n\n // try to convert any decimals into smaller units if possible\n // for example for { years: 2.5, days: 0, seconds: 0 } we want to get { years: 2, days: 182, hours: 12 }\n orderedUnits.reduce((previous, current) => {\n if (!isUndefined(vals[current])) {\n if (previous) {\n const fraction = vals[previous] % 1;\n vals[previous] -= fraction;\n vals[current] += fraction * matrix[previous][current];\n }\n return current;\n } else {\n return previous;\n }\n }, null);\n}\n\n// Remove all properties with a value of 0 from an object\nfunction removeZeroes(vals) {\n const newVals = {};\n for (const [key, value] of Object.entries(vals)) {\n if (value !== 0) {\n newVals[key] = value;\n }\n }\n return newVals;\n}\n\n/**\n * A Duration object represents a period of time, like \"2 months\" or \"1 day, 1 hour\". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime#plus} to add a Duration object to a DateTime, producing another DateTime.\n *\n * Here is a brief overview of commonly used methods and getters in Duration:\n *\n * * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}.\n * * **Unit values** See the {@link Duration#years}, {@link Duration#months}, {@link Duration#weeks}, {@link Duration#days}, {@link Duration#hours}, {@link Duration#minutes}, {@link Duration#seconds}, {@link Duration#milliseconds} accessors.\n * * **Configuration** See {@link Duration#locale} and {@link Duration#numberingSystem} accessors.\n * * **Transformation** To create new Durations out of old ones use {@link Duration#plus}, {@link Duration#minus}, {@link Duration#normalize}, {@link Duration#set}, {@link Duration#reconfigure}, {@link Duration#shiftTo}, and {@link Duration#negate}.\n * * **Output** To convert the Duration into other representations, see {@link Duration#as}, {@link Duration#toISO}, {@link Duration#toFormat}, and {@link Duration#toJSON}\n *\n * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation.\n */\nexport default class Duration {\n /**\n * @private\n */\n constructor(config) {\n const accurate = config.conversionAccuracy === \"longterm\" || false;\n let matrix = accurate ? accurateMatrix : casualMatrix;\n\n if (config.matrix) {\n matrix = config.matrix;\n }\n\n /**\n * @access private\n */\n this.values = config.values;\n /**\n * @access private\n */\n this.loc = config.loc || Locale.create();\n /**\n * @access private\n */\n this.conversionAccuracy = accurate ? \"longterm\" : \"casual\";\n /**\n * @access private\n */\n this.invalid = config.invalid || null;\n /**\n * @access private\n */\n this.matrix = matrix;\n /**\n * @access private\n */\n this.isLuxonDuration = true;\n }\n\n /**\n * Create Duration from a number of milliseconds.\n * @param {number} count of milliseconds\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @return {Duration}\n */\n static fromMillis(count, opts) {\n return Duration.fromObject({ milliseconds: count }, opts);\n }\n\n /**\n * Create a Duration from a JavaScript object with keys like 'years' and 'hours'.\n * If this object is empty then a zero milliseconds duration is returned.\n * @param {Object} obj - the object to create the DateTime from\n * @param {number} obj.years\n * @param {number} obj.quarters\n * @param {number} obj.months\n * @param {number} obj.weeks\n * @param {number} obj.days\n * @param {number} obj.hours\n * @param {number} obj.minutes\n * @param {number} obj.seconds\n * @param {number} obj.milliseconds\n * @param {Object} [opts=[]] - options for creating this Duration\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the custom conversion system to use\n * @return {Duration}\n */\n static fromObject(obj, opts = {}) {\n if (obj == null || typeof obj !== \"object\") {\n throw new InvalidArgumentError(\n `Duration.fromObject: argument expected to be an object, got ${\n obj === null ? \"null\" : typeof obj\n }`\n );\n }\n\n return new Duration({\n values: normalizeObject(obj, Duration.normalizeUnit),\n loc: Locale.fromObject(opts),\n conversionAccuracy: opts.conversionAccuracy,\n matrix: opts.matrix,\n });\n }\n\n /**\n * Create a Duration from DurationLike.\n *\n * @param {Object | number | Duration} durationLike\n * One of:\n * - object with keys like 'years' and 'hours'.\n * - number representing milliseconds\n * - Duration instance\n * @return {Duration}\n */\n static fromDurationLike(durationLike) {\n if (isNumber(durationLike)) {\n return Duration.fromMillis(durationLike);\n } else if (Duration.isDuration(durationLike)) {\n return durationLike;\n } else if (typeof durationLike === \"object\") {\n return Duration.fromObject(durationLike);\n } else {\n throw new InvalidArgumentError(\n `Unknown duration argument ${durationLike} of type ${typeof durationLike}`\n );\n }\n }\n\n /**\n * Create a Duration from an ISO 8601 duration string.\n * @param {string} text - text to parse\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the preset conversion system to use\n * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 }\n * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 }\n * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 }\n * @return {Duration}\n */\n static fromISO(text, opts) {\n const [parsed] = parseISODuration(text);\n if (parsed) {\n return Duration.fromObject(parsed, opts);\n } else {\n return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n }\n\n /**\n * Create a Duration from an ISO 8601 time string.\n * @param {string} text - text to parse\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the conversion system to use\n * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n * @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 }\n * @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @return {Duration}\n */\n static fromISOTime(text, opts) {\n const [parsed] = parseISOTimeOnly(text);\n if (parsed) {\n return Duration.fromObject(parsed, opts);\n } else {\n return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n }\n\n /**\n * Create an invalid Duration.\n * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {Duration}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the Duration is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidDurationError(invalid);\n } else {\n return new Duration({ invalid });\n }\n }\n\n /**\n * @private\n */\n static normalizeUnit(unit) {\n const normalized = {\n year: \"years\",\n years: \"years\",\n quarter: \"quarters\",\n quarters: \"quarters\",\n month: \"months\",\n months: \"months\",\n week: \"weeks\",\n weeks: \"weeks\",\n day: \"days\",\n days: \"days\",\n hour: \"hours\",\n hours: \"hours\",\n minute: \"minutes\",\n minutes: \"minutes\",\n second: \"seconds\",\n seconds: \"seconds\",\n millisecond: \"milliseconds\",\n milliseconds: \"milliseconds\",\n }[unit ? unit.toLowerCase() : unit];\n\n if (!normalized) throw new InvalidUnitError(unit);\n\n return normalized;\n }\n\n /**\n * Check if an object is a Duration. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isDuration(o) {\n return (o && o.isLuxonDuration) || false;\n }\n\n /**\n * Get the locale of a Duration, such 'en-GB'\n * @type {string}\n */\n get locale() {\n return this.isValid ? this.loc.locale : null;\n }\n\n /**\n * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration\n *\n * @type {string}\n */\n get numberingSystem() {\n return this.isValid ? this.loc.numberingSystem : null;\n }\n\n /**\n * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens:\n * * `S` for milliseconds\n * * `s` for seconds\n * * `m` for minutes\n * * `h` for hours\n * * `d` for days\n * * `w` for weeks\n * * `M` for months\n * * `y` for years\n * Notes:\n * * Add padding by repeating the token, e.g. \"yy\" pads the years to two digits, \"hhhh\" pads the hours out to four digits\n * * Tokens can be escaped by wrapping with single quotes.\n * * The duration will be converted to the set of units in the format string using {@link Duration#shiftTo} and the Durations's conversion accuracy setting.\n * @param {string} fmt - the format string\n * @param {Object} opts - options\n * @param {boolean} [opts.floor=true] - floor numerical values\n * @param {'negative'|'all'|'negativeLargestOnly'} [opts.signMode=negative] - How to handle signs\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"y d s\") //=> \"1 6 2\"\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"yy dd sss\") //=> \"01 06 002\"\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"M S\") //=> \"12 518402000\"\n * @example Duration.fromObject({ days: 6, seconds: 2 }).toFormat(\"d s\", { signMode: \"all\" }) //=> \"+6 +2\"\n * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat(\"d s\", { signMode: \"all\" }) //=> \"-6 -2\"\n * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat(\"d s\", { signMode: \"negativeLargestOnly\" }) //=> \"-6 2\"\n * @return {string}\n */\n toFormat(fmt, opts = {}) {\n // reverse-compat since 1.2; we always round down now, never up, and we do it by default\n const fmtOpts = {\n ...opts,\n floor: opts.round !== false && opts.floor !== false,\n };\n return this.isValid\n ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt)\n : INVALID;\n }\n\n /**\n * Returns a string representation of a Duration with all units included.\n * To modify its behavior, use `listStyle` and any Intl.NumberFormat option, though `unitDisplay` is especially relevant.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options\n * @param {Object} opts - Formatting options. Accepts the same keys as the options parameter of the native `Intl.NumberFormat` constructor, as well as `listStyle`.\n * @param {string} [opts.listStyle='narrow'] - How to format the merged list. Corresponds to the `style` property of the options parameter of the native `Intl.ListFormat` constructor.\n * @param {boolean} [opts.showZeros=true] - Show all units previously used by the duration even if they are zero\n * @example\n * ```js\n * var dur = Duration.fromObject({ months: 1, weeks: 0, hours: 5, minutes: 6 })\n * dur.toHuman() //=> '1 month, 0 weeks, 5 hours, 6 minutes'\n * dur.toHuman({ listStyle: \"long\" }) //=> '1 month, 0 weeks, 5 hours, and 6 minutes'\n * dur.toHuman({ unitDisplay: \"short\" }) //=> '1 mth, 0 wks, 5 hr, 6 min'\n * dur.toHuman({ showZeros: false }) //=> '1 month, 5 hours, 6 minutes'\n * ```\n */\n toHuman(opts = {}) {\n if (!this.isValid) return INVALID;\n\n const showZeros = opts.showZeros !== false;\n\n const l = orderedUnits\n .map((unit) => {\n const val = this.values[unit];\n if (isUndefined(val) || (val === 0 && !showZeros)) {\n return null;\n }\n return this.loc\n .numberFormatter({ style: \"unit\", unitDisplay: \"long\", ...opts, unit: unit.slice(0, -1) })\n .format(val);\n })\n .filter((n) => n);\n\n return this.loc\n .listFormatter({ type: \"conjunction\", style: opts.listStyle || \"narrow\", ...opts })\n .format(l);\n }\n\n /**\n * Returns a JavaScript object with this Duration's values.\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 }\n * @return {Object}\n */\n toObject() {\n if (!this.isValid) return {};\n return { ...this.values };\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Duration.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S'\n * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S'\n * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M'\n * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M'\n * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S'\n * @return {string}\n */\n toISO() {\n // we could use the formatter, but this is an easier way to get the minimum string\n if (!this.isValid) return null;\n\n let s = \"P\";\n if (this.years !== 0) s += this.years + \"Y\";\n if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + \"M\";\n if (this.weeks !== 0) s += this.weeks + \"W\";\n if (this.days !== 0) s += this.days + \"D\";\n if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0)\n s += \"T\";\n if (this.hours !== 0) s += this.hours + \"H\";\n if (this.minutes !== 0) s += this.minutes + \"M\";\n if (this.seconds !== 0 || this.milliseconds !== 0)\n // this will handle \"floating point madness\" by removing extra decimal places\n // https://stackoverflow.com/questions/588004/is-floating-point-math-broken\n s += roundTo(this.seconds + this.milliseconds / 1000, 3) + \"S\";\n if (s === \"P\") s += \"T0S\";\n return s;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day.\n * Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000'\n * @return {string}\n */\n toISOTime(opts = {}) {\n if (!this.isValid) return null;\n\n const millis = this.toMillis();\n if (millis < 0 || millis >= 86400000) return null;\n\n opts = {\n suppressMilliseconds: false,\n suppressSeconds: false,\n includePrefix: false,\n format: \"extended\",\n ...opts,\n includeOffset: false,\n };\n\n const dateTime = DateTime.fromMillis(millis, { zone: \"UTC\" });\n return dateTime.toISOTime(opts);\n }\n\n /**\n * Returns an ISO 8601 representation of this Duration appropriate for use in JSON.\n * @return {string}\n */\n toJSON() {\n return this.toISO();\n }\n\n /**\n * Returns an ISO 8601 representation of this Duration appropriate for use in debugging.\n * @return {string}\n */\n toString() {\n return this.toISO();\n }\n\n /**\n * Returns a string representation of this Duration appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `Duration { values: ${JSON.stringify(this.values)} }`;\n } else {\n return `Duration { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns an milliseconds value of this Duration.\n * @return {number}\n */\n toMillis() {\n if (!this.isValid) return NaN;\n\n return durationToMillis(this.matrix, this.values);\n }\n\n /**\n * Returns an milliseconds value of this Duration. Alias of {@link toMillis}\n * @return {number}\n */\n valueOf() {\n return this.toMillis();\n }\n\n /**\n * Make this Duration longer by the specified amount. Return a newly-constructed Duration.\n * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @return {Duration}\n */\n plus(duration) {\n if (!this.isValid) return this;\n\n const dur = Duration.fromDurationLike(duration),\n result = {};\n\n for (const k of orderedUnits) {\n if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) {\n result[k] = dur.get(k) + this.get(k);\n }\n }\n\n return clone(this, { values: result }, true);\n }\n\n /**\n * Make this Duration shorter by the specified amount. Return a newly-constructed Duration.\n * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @return {Duration}\n */\n minus(duration) {\n if (!this.isValid) return this;\n\n const dur = Duration.fromDurationLike(duration);\n return this.plus(dur.negate());\n }\n\n /**\n * Scale this Duration by the specified amount. Return a newly-constructed Duration.\n * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number.\n * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits(x => x * 2) //=> { hours: 2, minutes: 60 }\n * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits((x, u) => u === \"hours\" ? x * 2 : x) //=> { hours: 2, minutes: 30 }\n * @return {Duration}\n */\n mapUnits(fn) {\n if (!this.isValid) return this;\n const result = {};\n for (const k of Object.keys(this.values)) {\n result[k] = asNumber(fn(this.values[k], k));\n }\n return clone(this, { values: result }, true);\n }\n\n /**\n * Get the value of unit.\n * @param {string} unit - a unit such as 'minute' or 'day'\n * @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2\n * @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0\n * @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3\n * @return {number}\n */\n get(unit) {\n return this[Duration.normalizeUnit(unit)];\n }\n\n /**\n * \"Set\" the values of specified units. Return a newly-constructed Duration.\n * @param {Object} values - a mapping of units to numbers\n * @example dur.set({ years: 2017 })\n * @example dur.set({ hours: 8, minutes: 30 })\n * @return {Duration}\n */\n set(values) {\n if (!this.isValid) return this;\n\n const mixed = { ...this.values, ...normalizeObject(values, Duration.normalizeUnit) };\n return clone(this, { values: mixed });\n }\n\n /**\n * \"Set\" the locale and/or numberingSystem. Returns a newly-constructed Duration.\n * @example dur.reconfigure({ locale: 'en-GB' })\n * @return {Duration}\n */\n reconfigure({ locale, numberingSystem, conversionAccuracy, matrix } = {}) {\n const loc = this.loc.clone({ locale, numberingSystem });\n const opts = { loc, matrix, conversionAccuracy };\n return clone(this, opts);\n }\n\n /**\n * Return the length of the duration in the specified unit.\n * @param {string} unit - a unit such as 'minutes' or 'days'\n * @example Duration.fromObject({years: 1}).as('days') //=> 365\n * @example Duration.fromObject({years: 1}).as('months') //=> 12\n * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5\n * @return {number}\n */\n as(unit) {\n return this.isValid ? this.shiftTo(unit).get(unit) : NaN;\n }\n\n /**\n * Reduce this Duration to its canonical representation in its current units.\n * Assuming the overall value of the Duration is positive, this means:\n * - excessive values for lower-order units are converted to higher-order units (if possible, see first and second example)\n * - negative lower-order units are converted to higher order units (there must be such a higher order unit, otherwise\n * the overall value would be negative, see third example)\n * - fractional values for higher-order units are converted to lower-order units (if possible, see fourth example)\n *\n * If the overall value is negative, the result of this method is equivalent to `this.negate().normalize().negate()`.\n * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 }\n * @example Duration.fromObject({ days: 5000 }).normalize().toObject() //=> { days: 5000 }\n * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 }\n * @example Duration.fromObject({ years: 2.5, days: 0, hours: 0 }).normalize().toObject() //=> { years: 2, days: 182, hours: 12 }\n * @return {Duration}\n */\n normalize() {\n if (!this.isValid) return this;\n const vals = this.toObject();\n normalizeValues(this.matrix, vals);\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Rescale units to its largest representation\n * @example Duration.fromObject({ milliseconds: 90000 }).rescale().toObject() //=> { minutes: 1, seconds: 30 }\n * @return {Duration}\n */\n rescale() {\n if (!this.isValid) return this;\n const vals = removeZeroes(this.normalize().shiftToAll().toObject());\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Convert this Duration into its representation in a different set of units.\n * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 }\n * @return {Duration}\n */\n shiftTo(...units) {\n if (!this.isValid) return this;\n\n if (units.length === 0) {\n return this;\n }\n\n units = units.map((u) => Duration.normalizeUnit(u));\n\n const built = {},\n accumulated = {},\n vals = this.toObject();\n let lastUnit;\n\n for (const k of orderedUnits) {\n if (units.indexOf(k) >= 0) {\n lastUnit = k;\n\n let own = 0;\n\n // anything we haven't boiled down yet should get boiled to this unit\n for (const ak in accumulated) {\n own += this.matrix[ak][k] * accumulated[ak];\n accumulated[ak] = 0;\n }\n\n // plus anything that's already in this unit\n if (isNumber(vals[k])) {\n own += vals[k];\n }\n\n // only keep the integer part for now in the hopes of putting any decimal part\n // into a smaller unit later\n const i = Math.trunc(own);\n built[k] = i;\n accumulated[k] = (own * 1000 - i * 1000) / 1000;\n\n // otherwise, keep it in the wings to boil it later\n } else if (isNumber(vals[k])) {\n accumulated[k] = vals[k];\n }\n }\n\n // anything leftover becomes the decimal for the last unit\n // lastUnit must be defined since units is not empty\n for (const key in accumulated) {\n if (accumulated[key] !== 0) {\n built[lastUnit] +=\n key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key];\n }\n }\n\n normalizeValues(this.matrix, built);\n return clone(this, { values: built }, true);\n }\n\n /**\n * Shift this Duration to all available units.\n * Same as shiftTo(\"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", \"seconds\", \"milliseconds\")\n * @return {Duration}\n */\n shiftToAll() {\n if (!this.isValid) return this;\n return this.shiftTo(\n \"years\",\n \"months\",\n \"weeks\",\n \"days\",\n \"hours\",\n \"minutes\",\n \"seconds\",\n \"milliseconds\"\n );\n }\n\n /**\n * Return the negative of this Duration.\n * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 }\n * @return {Duration}\n */\n negate() {\n if (!this.isValid) return this;\n const negated = {};\n for (const k of Object.keys(this.values)) {\n negated[k] = this.values[k] === 0 ? 0 : -this.values[k];\n }\n return clone(this, { values: negated }, true);\n }\n\n /**\n * Removes all units with values equal to 0 from this Duration.\n * @example Duration.fromObject({ years: 2, days: 0, hours: 0, minutes: 0 }).removeZeros().toObject() //=> { years: 2 }\n * @return {Duration}\n */\n removeZeros() {\n if (!this.isValid) return this;\n const vals = removeZeroes(this.values);\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Get the years.\n * @type {number}\n */\n get years() {\n return this.isValid ? this.values.years || 0 : NaN;\n }\n\n /**\n * Get the quarters.\n * @type {number}\n */\n get quarters() {\n return this.isValid ? this.values.quarters || 0 : NaN;\n }\n\n /**\n * Get the months.\n * @type {number}\n */\n get months() {\n return this.isValid ? this.values.months || 0 : NaN;\n }\n\n /**\n * Get the weeks\n * @type {number}\n */\n get weeks() {\n return this.isValid ? this.values.weeks || 0 : NaN;\n }\n\n /**\n * Get the days.\n * @type {number}\n */\n get days() {\n return this.isValid ? this.values.days || 0 : NaN;\n }\n\n /**\n * Get the hours.\n * @type {number}\n */\n get hours() {\n return this.isValid ? this.values.hours || 0 : NaN;\n }\n\n /**\n * Get the minutes.\n * @type {number}\n */\n get minutes() {\n return this.isValid ? this.values.minutes || 0 : NaN;\n }\n\n /**\n * Get the seconds.\n * @return {number}\n */\n get seconds() {\n return this.isValid ? this.values.seconds || 0 : NaN;\n }\n\n /**\n * Get the milliseconds.\n * @return {number}\n */\n get milliseconds() {\n return this.isValid ? this.values.milliseconds || 0 : NaN;\n }\n\n /**\n * Returns whether the Duration is invalid. Invalid durations are returned by diff operations\n * on invalid DateTimes or Intervals.\n * @return {boolean}\n */\n get isValid() {\n return this.invalid === null;\n }\n\n /**\n * Returns an error code if this Duration became invalid, or null if the Duration is valid\n * @return {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this Duration became invalid, or null if the Duration is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Equality check\n * Two Durations are equal iff they have the same units and the same values for each unit.\n * @param {Duration} other\n * @return {boolean}\n */\n equals(other) {\n if (!this.isValid || !other.isValid) {\n return false;\n }\n\n if (!this.loc.equals(other.loc)) {\n return false;\n }\n\n function eq(v1, v2) {\n // Consider 0 and undefined as equal\n if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0;\n return v1 === v2;\n }\n\n for (const u of orderedUnits) {\n if (!eq(this.values[u], other.values[u])) {\n return false;\n }\n }\n return true;\n }\n}\n","import DateTime, { friendlyDateTime } from \"./datetime.js\";\nimport Duration from \"./duration.js\";\nimport Settings from \"./settings.js\";\nimport { InvalidArgumentError, InvalidIntervalError } from \"./errors.js\";\nimport Invalid from \"./impl/invalid.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport * as Formats from \"./impl/formats.js\";\n\nconst INVALID = \"Invalid Interval\";\n\n// checks if the start is equal to or before the end\nfunction validateStartEnd(start, end) {\n if (!start || !start.isValid) {\n return Interval.invalid(\"missing or invalid start\");\n } else if (!end || !end.isValid) {\n return Interval.invalid(\"missing or invalid end\");\n } else if (end < start) {\n return Interval.invalid(\n \"end before start\",\n `The end of an interval must be after its start, but you had start=${start.toISO()} and end=${end.toISO()}`\n );\n } else {\n return null;\n }\n}\n\n/**\n * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them.\n *\n * Here is a brief overview of the most commonly used methods and getters in Interval:\n *\n * * **Creation** To create an Interval, use {@link Interval.fromDateTimes}, {@link Interval.after}, {@link Interval.before}, or {@link Interval.fromISO}.\n * * **Accessors** Use {@link Interval#start} and {@link Interval#end} to get the start and end.\n * * **Interrogation** To analyze the Interval, use {@link Interval#count}, {@link Interval#length}, {@link Interval#hasSame}, {@link Interval#contains}, {@link Interval#isAfter}, or {@link Interval#isBefore}.\n * * **Transformation** To create other Intervals out of this one, use {@link Interval#set}, {@link Interval#splitAt}, {@link Interval#splitBy}, {@link Interval#divideEqually}, {@link Interval.merge}, {@link Interval.xor}, {@link Interval#union}, {@link Interval#intersection}, or {@link Interval#difference}.\n * * **Comparison** To compare this Interval to another one, use {@link Interval#equals}, {@link Interval#overlaps}, {@link Interval#abutsStart}, {@link Interval#abutsEnd}, {@link Interval#engulfs}\n * * **Output** To convert the Interval into other representations, see {@link Interval#toString}, {@link Interval#toLocaleString}, {@link Interval#toISO}, {@link Interval#toISODate}, {@link Interval#toISOTime}, {@link Interval#toFormat}, and {@link Interval#toDuration}.\n */\nexport default class Interval {\n /**\n * @private\n */\n constructor(config) {\n /**\n * @access private\n */\n this.s = config.start;\n /**\n * @access private\n */\n this.e = config.end;\n /**\n * @access private\n */\n this.invalid = config.invalid || null;\n /**\n * @access private\n */\n this.isLuxonInterval = true;\n }\n\n /**\n * Create an invalid Interval.\n * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {Interval}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the Interval is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidIntervalError(invalid);\n } else {\n return new Interval({ invalid });\n }\n }\n\n /**\n * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end.\n * @param {DateTime|Date|Object} start\n * @param {DateTime|Date|Object} end\n * @return {Interval}\n */\n static fromDateTimes(start, end) {\n const builtStart = friendlyDateTime(start),\n builtEnd = friendlyDateTime(end);\n\n const validateError = validateStartEnd(builtStart, builtEnd);\n\n if (validateError == null) {\n return new Interval({\n start: builtStart,\n end: builtEnd,\n });\n } else {\n return validateError;\n }\n }\n\n /**\n * Create an Interval from a start DateTime and a Duration to extend to.\n * @param {DateTime|Date|Object} start\n * @param {Duration|Object|number} duration - the length of the Interval.\n * @return {Interval}\n */\n static after(start, duration) {\n const dur = Duration.fromDurationLike(duration),\n dt = friendlyDateTime(start);\n return Interval.fromDateTimes(dt, dt.plus(dur));\n }\n\n /**\n * Create an Interval from an end DateTime and a Duration to extend backwards to.\n * @param {DateTime|Date|Object} end\n * @param {Duration|Object|number} duration - the length of the Interval.\n * @return {Interval}\n */\n static before(end, duration) {\n const dur = Duration.fromDurationLike(duration),\n dt = friendlyDateTime(end);\n return Interval.fromDateTimes(dt.minus(dur), dt);\n }\n\n /**\n * Create an Interval from an ISO 8601 string.\n * Accepts `/`, `/`, and `/` formats.\n * @param {string} text - the ISO string to parse\n * @param {Object} [opts] - options to pass {@link DateTime#fromISO} and optionally {@link Duration#fromISO}\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @return {Interval}\n */\n static fromISO(text, opts) {\n const [s, e] = (text || \"\").split(\"/\", 2);\n if (s && e) {\n let start, startIsValid;\n try {\n start = DateTime.fromISO(s, opts);\n startIsValid = start.isValid;\n } catch (e) {\n startIsValid = false;\n }\n\n let end, endIsValid;\n try {\n end = DateTime.fromISO(e, opts);\n endIsValid = end.isValid;\n } catch (e) {\n endIsValid = false;\n }\n\n if (startIsValid && endIsValid) {\n return Interval.fromDateTimes(start, end);\n }\n\n if (startIsValid) {\n const dur = Duration.fromISO(e, opts);\n if (dur.isValid) {\n return Interval.after(start, dur);\n }\n } else if (endIsValid) {\n const dur = Duration.fromISO(s, opts);\n if (dur.isValid) {\n return Interval.before(end, dur);\n }\n }\n }\n return Interval.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n\n /**\n * Check if an object is an Interval. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isInterval(o) {\n return (o && o.isLuxonInterval) || false;\n }\n\n /**\n * Returns the start of the Interval\n * @type {DateTime}\n */\n get start() {\n return this.isValid ? this.s : null;\n }\n\n /**\n * Returns the end of the Interval. This is the first instant which is not part of the interval\n * (Interval is half-open).\n * @type {DateTime}\n */\n get end() {\n return this.isValid ? this.e : null;\n }\n\n /**\n * Returns the last DateTime included in the interval (since end is not part of the interval)\n * @type {DateTime}\n */\n get lastDateTime() {\n return this.isValid ? (this.e ? this.e.minus(1) : null) : null;\n }\n\n /**\n * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'.\n * @type {boolean}\n */\n get isValid() {\n return this.invalidReason === null;\n }\n\n /**\n * Returns an error code if this Interval is invalid, or null if the Interval is valid\n * @type {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this Interval became invalid, or null if the Interval is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Returns the length of the Interval in the specified unit.\n * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in.\n * @return {number}\n */\n length(unit = \"milliseconds\") {\n return this.isValid ? this.toDuration(...[unit]).get(unit) : NaN;\n }\n\n /**\n * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part.\n * Unlike {@link Interval#length} this counts sections of the calendar, not periods of time, e.g. specifying 'day'\n * asks 'what dates are included in this interval?', not 'how many days long is this interval?'\n * @param {string} [unit='milliseconds'] - the unit of time to count.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; this operation will always use the locale of the start DateTime\n * @return {number}\n */\n count(unit = \"milliseconds\", opts) {\n if (!this.isValid) return NaN;\n const start = this.start.startOf(unit, opts);\n let end;\n if (opts?.useLocaleWeeks) {\n end = this.end.reconfigure({ locale: start.locale });\n } else {\n end = this.end;\n }\n end = end.startOf(unit, opts);\n return Math.floor(end.diff(start, unit).get(unit)) + (end.valueOf() !== this.end.valueOf());\n }\n\n /**\n * Returns whether this Interval's start and end are both in the same unit of time\n * @param {string} unit - the unit of time to check sameness on\n * @return {boolean}\n */\n hasSame(unit) {\n return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false;\n }\n\n /**\n * Return whether this Interval has the same start and end DateTimes.\n * @return {boolean}\n */\n isEmpty() {\n return this.s.valueOf() === this.e.valueOf();\n }\n\n /**\n * Return whether this Interval's start is after the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n isAfter(dateTime) {\n if (!this.isValid) return false;\n return this.s > dateTime;\n }\n\n /**\n * Return whether this Interval's end is before the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n isBefore(dateTime) {\n if (!this.isValid) return false;\n return this.e <= dateTime;\n }\n\n /**\n * Return whether this Interval contains the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n contains(dateTime) {\n if (!this.isValid) return false;\n return this.s <= dateTime && this.e > dateTime;\n }\n\n /**\n * \"Sets\" the start and/or end dates. Returns a newly-constructed Interval.\n * @param {Object} values - the values to set\n * @param {DateTime} values.start - the starting DateTime\n * @param {DateTime} values.end - the ending DateTime\n * @return {Interval}\n */\n set({ start, end } = {}) {\n if (!this.isValid) return this;\n return Interval.fromDateTimes(start || this.s, end || this.e);\n }\n\n /**\n * Split this Interval at each of the specified DateTimes\n * @param {...DateTime} dateTimes - the unit of time to count.\n * @return {Array}\n */\n splitAt(...dateTimes) {\n if (!this.isValid) return [];\n const sorted = dateTimes\n .map(friendlyDateTime)\n .filter((d) => this.contains(d))\n .sort((a, b) => a.toMillis() - b.toMillis()),\n results = [];\n let { s } = this,\n i = 0;\n\n while (s < this.e) {\n const added = sorted[i] || this.e,\n next = +added > +this.e ? this.e : added;\n results.push(Interval.fromDateTimes(s, next));\n s = next;\n i += 1;\n }\n\n return results;\n }\n\n /**\n * Split this Interval into smaller Intervals, each of the specified length.\n * Left over time is grouped into a smaller interval\n * @param {Duration|Object|number} duration - The length of each resulting interval.\n * @return {Array}\n */\n splitBy(duration) {\n const dur = Duration.fromDurationLike(duration);\n\n if (!this.isValid || !dur.isValid || dur.as(\"milliseconds\") === 0) {\n return [];\n }\n\n let { s } = this,\n idx = 1,\n next;\n\n const results = [];\n while (s < this.e) {\n const added = this.start.plus(dur.mapUnits((x) => x * idx));\n next = +added > +this.e ? this.e : added;\n results.push(Interval.fromDateTimes(s, next));\n s = next;\n idx += 1;\n }\n\n return results;\n }\n\n /**\n * Split this Interval into the specified number of smaller intervals.\n * @param {number} numberOfParts - The number of Intervals to divide the Interval into.\n * @return {Array}\n */\n divideEqually(numberOfParts) {\n if (!this.isValid) return [];\n return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts);\n }\n\n /**\n * Return whether this Interval overlaps with the specified Interval\n * @param {Interval} other\n * @return {boolean}\n */\n overlaps(other) {\n return this.e > other.s && this.s < other.e;\n }\n\n /**\n * Return whether this Interval's end is adjacent to the specified Interval's start.\n * @param {Interval} other\n * @return {boolean}\n */\n abutsStart(other) {\n if (!this.isValid) return false;\n return +this.e === +other.s;\n }\n\n /**\n * Return whether this Interval's start is adjacent to the specified Interval's end.\n * @param {Interval} other\n * @return {boolean}\n */\n abutsEnd(other) {\n if (!this.isValid) return false;\n return +other.e === +this.s;\n }\n\n /**\n * Returns true if this Interval fully contains the specified Interval, specifically if the intersect (of this Interval and the other Interval) is equal to the other Interval; false otherwise.\n * @param {Interval} other\n * @return {boolean}\n */\n engulfs(other) {\n if (!this.isValid) return false;\n return this.s <= other.s && this.e >= other.e;\n }\n\n /**\n * Return whether this Interval has the same start and end as the specified Interval.\n * @param {Interval} other\n * @return {boolean}\n */\n equals(other) {\n if (!this.isValid || !other.isValid) {\n return false;\n }\n\n return this.s.equals(other.s) && this.e.equals(other.e);\n }\n\n /**\n * Return an Interval representing the intersection of this Interval and the specified Interval.\n * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals.\n * Returns null if the intersection is empty, meaning, the intervals don't intersect.\n * @param {Interval} other\n * @return {Interval}\n */\n intersection(other) {\n if (!this.isValid) return this;\n const s = this.s > other.s ? this.s : other.s,\n e = this.e < other.e ? this.e : other.e;\n\n if (s >= e) {\n return null;\n } else {\n return Interval.fromDateTimes(s, e);\n }\n }\n\n /**\n * Return an Interval representing the union of this Interval and the specified Interval.\n * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals.\n * @param {Interval} other\n * @return {Interval}\n */\n union(other) {\n if (!this.isValid) return this;\n const s = this.s < other.s ? this.s : other.s,\n e = this.e > other.e ? this.e : other.e;\n return Interval.fromDateTimes(s, e);\n }\n\n /**\n * Merge an array of Intervals into an equivalent minimal set of Intervals.\n * Combines overlapping and adjacent Intervals.\n * The resulting array will contain the Intervals in ascending order, that is, starting with the earliest Interval\n * and ending with the latest.\n *\n * @param {Array} intervals\n * @return {Array}\n */\n static merge(intervals) {\n const [found, final] = intervals\n .sort((a, b) => a.s - b.s)\n .reduce(\n ([sofar, current], item) => {\n if (!current) {\n return [sofar, item];\n } else if (current.overlaps(item) || current.abutsStart(item)) {\n return [sofar, current.union(item)];\n } else {\n return [sofar.concat([current]), item];\n }\n },\n [[], null]\n );\n if (final) {\n found.push(final);\n }\n return found;\n }\n\n /**\n * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals.\n * @param {Array} intervals\n * @return {Array}\n */\n static xor(intervals) {\n let start = null,\n currentCount = 0;\n const results = [],\n ends = intervals.map((i) => [\n { time: i.s, type: \"s\" },\n { time: i.e, type: \"e\" },\n ]),\n flattened = Array.prototype.concat(...ends),\n arr = flattened.sort((a, b) => a.time - b.time);\n\n for (const i of arr) {\n currentCount += i.type === \"s\" ? 1 : -1;\n\n if (currentCount === 1) {\n start = i.time;\n } else {\n if (start && +start !== +i.time) {\n results.push(Interval.fromDateTimes(start, i.time));\n }\n\n start = null;\n }\n }\n\n return Interval.merge(results);\n }\n\n /**\n * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals.\n * @param {...Interval} intervals\n * @return {Array}\n */\n difference(...intervals) {\n return Interval.xor([this].concat(intervals))\n .map((i) => this.intersection(i))\n .filter((i) => i && !i.isEmpty());\n }\n\n /**\n * Returns a string representation of this Interval appropriate for debugging.\n * @return {string}\n */\n toString() {\n if (!this.isValid) return INVALID;\n return `[${this.s.toISO()} – ${this.e.toISO()})`;\n }\n\n /**\n * Returns a string representation of this Interval appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `Interval { start: ${this.s.toISO()}, end: ${this.e.toISO()} }`;\n } else {\n return `Interval { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns a localized string representing this Interval. Accepts the same options as the\n * Intl.DateTimeFormat constructor and any presets defined by Luxon, such as\n * {@link DateTime.DATE_FULL} or {@link DateTime.TIME_SIMPLE}. The exact behavior of this method\n * is browser-specific, but in general it will return an appropriate representation of the\n * Interval in the assigned locale. Defaults to the system's locale if no locale has been\n * specified.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {Object} [formatOpts=DateTime.DATE_SHORT] - Either a DateTime preset or\n * Intl.DateTimeFormat constructor options.\n * @param {Object} opts - Options to override the configuration of the start DateTime.\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(); //=> 11/7/2022 – 11/8/2022\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL); //=> November 7 – 8, 2022\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL, { locale: 'fr-FR' }); //=> 7–8 novembre 2022\n * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString(DateTime.TIME_SIMPLE); //=> 6:00 – 8:00 PM\n * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> Mon, Nov 07, 6:00 – 8:00 p\n * @return {string}\n */\n toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) {\n return this.isValid\n ? Formatter.create(this.s.loc.clone(opts), formatOpts).formatInterval(this)\n : INVALID;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Interval.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @param {Object} opts - The same options as {@link DateTime#toISO}\n * @return {string}\n */\n toISO(opts) {\n if (!this.isValid) return INVALID;\n return `${this.s.toISO(opts)}/${this.e.toISO(opts)}`;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of date of this Interval.\n * The time components are ignored.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @return {string}\n */\n toISODate() {\n if (!this.isValid) return INVALID;\n return `${this.s.toISODate()}/${this.e.toISODate()}`;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of time of this Interval.\n * The date components are ignored.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @param {Object} opts - The same options as {@link DateTime#toISO}\n * @return {string}\n */\n toISOTime(opts) {\n if (!this.isValid) return INVALID;\n return `${this.s.toISOTime(opts)}/${this.e.toISOTime(opts)}`;\n }\n\n /**\n * Returns a string representation of this Interval formatted according to the specified format\n * string. **You may not want this.** See {@link Interval#toLocaleString} for a more flexible\n * formatting tool.\n * @param {string} dateFormat - The format string. This string formats the start and end time.\n * See {@link DateTime#toFormat} for details.\n * @param {Object} opts - Options.\n * @param {string} [opts.separator = ' – '] - A separator to place between the start and end\n * representations.\n * @return {string}\n */\n toFormat(dateFormat, { separator = \" – \" } = {}) {\n if (!this.isValid) return INVALID;\n return `${this.s.toFormat(dateFormat)}${separator}${this.e.toFormat(dateFormat)}`;\n }\n\n /**\n * Return a Duration representing the time spanned by this interval.\n * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration.\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 }\n * @return {Duration}\n */\n toDuration(unit, opts) {\n if (!this.isValid) {\n return Duration.invalid(this.invalidReason);\n }\n return this.e.diff(this.s, unit, opts);\n }\n\n /**\n * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes\n * @param {function} mapFn\n * @return {Interval}\n * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC())\n * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 }))\n */\n mapEndpoints(mapFn) {\n return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e));\n }\n}\n","import DateTime from \"./datetime.js\";\nimport Settings from \"./settings.js\";\nimport Locale from \"./impl/locale.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\n\nimport { hasLocaleWeekInfo, hasRelative } from \"./impl/util.js\";\n\n/**\n * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment.\n */\nexport default class Info {\n /**\n * Return whether the specified zone contains a DST.\n * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone.\n * @return {boolean}\n */\n static hasDST(zone = Settings.defaultZone) {\n const proto = DateTime.now().setZone(zone).set({ month: 12 });\n\n return !zone.isUniversal && proto.offset !== proto.set({ month: 6 }).offset;\n }\n\n /**\n * Return whether the specified zone is a valid IANA specifier.\n * @param {string} zone - Zone to check\n * @return {boolean}\n */\n static isValidIANAZone(zone) {\n return IANAZone.isValidZone(zone);\n }\n\n /**\n * Converts the input into a {@link Zone} instance.\n *\n * * If `input` is already a Zone instance, it is returned unchanged.\n * * If `input` is a string containing a valid time zone name, a Zone instance\n * with that name is returned.\n * * If `input` is a string that doesn't refer to a known time zone, a Zone\n * instance with {@link Zone#isValid} == false is returned.\n * * If `input is a number, a Zone instance with the specified fixed offset\n * in minutes is returned.\n * * If `input` is `null` or `undefined`, the default zone is returned.\n * @param {string|Zone|number} [input] - the value to be converted\n * @return {Zone}\n */\n static normalizeZone(input) {\n return normalizeZone(input, Settings.defaultZone);\n }\n\n /**\n * Get the weekday on which the week starts according to the given locale.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number} the start of the week, 1 for Monday through 7 for Sunday\n */\n static getStartOfWeek({ locale = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale)).getStartOfWeek();\n }\n\n /**\n * Get the minimum number of days necessary in a week before it is considered part of the next year according\n * to the given locale.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number}\n */\n static getMinimumDaysInFirstWeek({ locale = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale)).getMinDaysInFirstWeek();\n }\n\n /**\n * Get the weekdays, which are considered the weekend according to the given locale\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number[]} an array of weekdays, 1 for Monday through 7 for Sunday\n */\n static getWeekendWeekdays({ locale = null, locObj = null } = {}) {\n // copy the array, because we cache it internally\n return (locObj || Locale.create(locale)).getWeekendDays().slice();\n }\n\n /**\n * Return an array of standalone month names.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @param {string} [opts.outputCalendar='gregory'] - the calendar\n * @example Info.months()[0] //=> 'January'\n * @example Info.months('short')[0] //=> 'Jan'\n * @example Info.months('numeric')[0] //=> '1'\n * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.'\n * @example Info.months('numeric', { locale: 'ar' })[0] //=> '١'\n * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I'\n * @return {Array}\n */\n static months(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length);\n }\n\n /**\n * Return an array of format month names.\n * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that\n * changes the string.\n * See {@link Info#months}\n * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @param {string} [opts.outputCalendar='gregory'] - the calendar\n * @return {Array}\n */\n static monthsFormat(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true);\n }\n\n /**\n * Return an array of standalone week names.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {string} [length='long'] - the length of the weekday representation, such as \"narrow\", \"short\", \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @example Info.weekdays()[0] //=> 'Monday'\n * @example Info.weekdays('short')[0] //=> 'Mon'\n * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.'\n * @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين'\n * @return {Array}\n */\n static weekdays(length = \"long\", { locale = null, numberingSystem = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length);\n }\n\n /**\n * Return an array of format week names.\n * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that\n * changes the string.\n * See {@link Info#weekdays}\n * @param {string} [length='long'] - the length of the month representation, such as \"narrow\", \"short\", \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale=null] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @return {Array}\n */\n static weekdaysFormat(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true);\n }\n\n /**\n * Return an array of meridiems.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @example Info.meridiems() //=> [ 'AM', 'PM' ]\n * @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ]\n * @return {Array}\n */\n static meridiems({ locale = null } = {}) {\n return Locale.create(locale).meridiems();\n }\n\n /**\n * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian.\n * @param {string} [length='short'] - the length of the era representation, such as \"short\" or \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @example Info.eras() //=> [ 'BC', 'AD' ]\n * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ]\n * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ]\n * @return {Array}\n */\n static eras(length = \"short\", { locale = null } = {}) {\n return Locale.create(locale, null, \"gregory\").eras(length);\n }\n\n /**\n * Return the set of available features in this environment.\n * Some features of Luxon are not available in all environments. For example, on older browsers, relative time formatting support is not available. Use this function to figure out if that's the case.\n * Keys:\n * * `relative`: whether this environment supports relative time formatting\n * * `localeWeek`: whether this environment supports different weekdays for the start of the week based on the locale\n * @example Info.features() //=> { relative: false, localeWeek: true }\n * @return {Object}\n */\n static features() {\n return { relative: hasRelative(), localeWeek: hasLocaleWeekInfo() };\n }\n}\n","import Duration from \"../duration.js\";\n\nfunction dayDiff(earlier, later) {\n const utcDayStart = (dt) => dt.toUTC(0, { keepLocalTime: true }).startOf(\"day\").valueOf(),\n ms = utcDayStart(later) - utcDayStart(earlier);\n return Math.floor(Duration.fromMillis(ms).as(\"days\"));\n}\n\nfunction highOrderDiffs(cursor, later, units) {\n const differs = [\n [\"years\", (a, b) => b.year - a.year],\n [\"quarters\", (a, b) => b.quarter - a.quarter + (b.year - a.year) * 4],\n [\"months\", (a, b) => b.month - a.month + (b.year - a.year) * 12],\n [\n \"weeks\",\n (a, b) => {\n const days = dayDiff(a, b);\n return (days - (days % 7)) / 7;\n },\n ],\n [\"days\", dayDiff],\n ];\n\n const results = {};\n const earlier = cursor;\n let lowestOrder, highWater;\n\n /* This loop tries to diff using larger units first.\n If we overshoot, we backtrack and try the next smaller unit.\n \"cursor\" starts out at the earlier timestamp and moves closer and closer to \"later\"\n as we use smaller and smaller units.\n highWater keeps track of where we would be if we added one more of the smallest unit,\n this is used later to potentially convert any difference smaller than the smallest higher order unit\n into a fraction of that smallest higher order unit\n */\n for (const [unit, differ] of differs) {\n if (units.indexOf(unit) >= 0) {\n lowestOrder = unit;\n\n results[unit] = differ(cursor, later);\n highWater = earlier.plus(results);\n\n if (highWater > later) {\n // we overshot the end point, backtrack cursor by 1\n results[unit]--;\n cursor = earlier.plus(results);\n\n // if we are still overshooting now, we need to backtrack again\n // this happens in certain situations when diffing times in different zones,\n // because this calculation ignores time zones\n if (cursor > later) {\n // keep the \"overshot by 1\" around as highWater\n highWater = cursor;\n // backtrack cursor by 1\n results[unit]--;\n cursor = earlier.plus(results);\n }\n } else {\n cursor = highWater;\n }\n }\n }\n\n return [cursor, results, highWater, lowestOrder];\n}\n\nexport default function (earlier, later, units, opts) {\n let [cursor, results, highWater, lowestOrder] = highOrderDiffs(earlier, later, units);\n\n const remainingMillis = later - cursor;\n\n const lowerOrderUnits = units.filter(\n (u) => [\"hours\", \"minutes\", \"seconds\", \"milliseconds\"].indexOf(u) >= 0\n );\n\n if (lowerOrderUnits.length === 0) {\n if (highWater < later) {\n highWater = cursor.plus({ [lowestOrder]: 1 });\n }\n\n if (highWater !== cursor) {\n results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor);\n }\n }\n\n const duration = Duration.fromObject(results, opts);\n\n if (lowerOrderUnits.length > 0) {\n return Duration.fromMillis(remainingMillis, opts)\n .shiftTo(...lowerOrderUnits)\n .plus(duration);\n } else {\n return duration;\n }\n}\n","import { parseMillis, isUndefined, untruncateYear, signedOffset, hasOwnProperty } from \"./util.js\";\nimport Formatter from \"./formatter.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\nimport DateTime from \"../datetime.js\";\nimport { digitRegex, parseDigits } from \"./digits.js\";\nimport { ConflictingSpecificationError } from \"../errors.js\";\n\nconst MISSING_FTP = \"missing Intl.DateTimeFormat.formatToParts support\";\n\nfunction intUnit(regex, post = (i) => i) {\n return { regex, deser: ([s]) => post(parseDigits(s)) };\n}\n\nconst NBSP = String.fromCharCode(160);\nconst spaceOrNBSP = `[ ${NBSP}]`;\nconst spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, \"g\");\n\nfunction fixListRegex(s) {\n // make dots optional and also make them literal\n // make space and non breakable space characters interchangeable\n return s.replace(/\\./g, \"\\\\.?\").replace(spaceOrNBSPRegExp, spaceOrNBSP);\n}\n\nfunction stripInsensitivities(s) {\n return s\n .replace(/\\./g, \"\") // ignore dots that were made optional\n .replace(spaceOrNBSPRegExp, \" \") // interchange space and nbsp\n .toLowerCase();\n}\n\nfunction oneOf(strings, startIndex) {\n if (strings === null) {\n return null;\n } else {\n return {\n regex: RegExp(strings.map(fixListRegex).join(\"|\")),\n deser: ([s]) =>\n strings.findIndex((i) => stripInsensitivities(s) === stripInsensitivities(i)) + startIndex,\n };\n }\n}\n\nfunction offset(regex, groups) {\n return { regex, deser: ([, h, m]) => signedOffset(h, m), groups };\n}\n\nfunction simple(regex) {\n return { regex, deser: ([s]) => s };\n}\n\nfunction escapeToken(value) {\n return value.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\");\n}\n\n/**\n * @param token\n * @param {Locale} loc\n */\nfunction unitForToken(token, loc) {\n const one = digitRegex(loc),\n two = digitRegex(loc, \"{2}\"),\n three = digitRegex(loc, \"{3}\"),\n four = digitRegex(loc, \"{4}\"),\n six = digitRegex(loc, \"{6}\"),\n oneOrTwo = digitRegex(loc, \"{1,2}\"),\n oneToThree = digitRegex(loc, \"{1,3}\"),\n oneToSix = digitRegex(loc, \"{1,6}\"),\n oneToNine = digitRegex(loc, \"{1,9}\"),\n twoToFour = digitRegex(loc, \"{2,4}\"),\n fourToSix = digitRegex(loc, \"{4,6}\"),\n literal = (t) => ({ regex: RegExp(escapeToken(t.val)), deser: ([s]) => s, literal: true }),\n unitate = (t) => {\n if (token.literal) {\n return literal(t);\n }\n switch (t.val) {\n // era\n case \"G\":\n return oneOf(loc.eras(\"short\"), 0);\n case \"GG\":\n return oneOf(loc.eras(\"long\"), 0);\n // years\n case \"y\":\n return intUnit(oneToSix);\n case \"yy\":\n return intUnit(twoToFour, untruncateYear);\n case \"yyyy\":\n return intUnit(four);\n case \"yyyyy\":\n return intUnit(fourToSix);\n case \"yyyyyy\":\n return intUnit(six);\n // months\n case \"M\":\n return intUnit(oneOrTwo);\n case \"MM\":\n return intUnit(two);\n case \"MMM\":\n return oneOf(loc.months(\"short\", true), 1);\n case \"MMMM\":\n return oneOf(loc.months(\"long\", true), 1);\n case \"L\":\n return intUnit(oneOrTwo);\n case \"LL\":\n return intUnit(two);\n case \"LLL\":\n return oneOf(loc.months(\"short\", false), 1);\n case \"LLLL\":\n return oneOf(loc.months(\"long\", false), 1);\n // dates\n case \"d\":\n return intUnit(oneOrTwo);\n case \"dd\":\n return intUnit(two);\n // ordinals\n case \"o\":\n return intUnit(oneToThree);\n case \"ooo\":\n return intUnit(three);\n // time\n case \"HH\":\n return intUnit(two);\n case \"H\":\n return intUnit(oneOrTwo);\n case \"hh\":\n return intUnit(two);\n case \"h\":\n return intUnit(oneOrTwo);\n case \"mm\":\n return intUnit(two);\n case \"m\":\n return intUnit(oneOrTwo);\n case \"q\":\n return intUnit(oneOrTwo);\n case \"qq\":\n return intUnit(two);\n case \"s\":\n return intUnit(oneOrTwo);\n case \"ss\":\n return intUnit(two);\n case \"S\":\n return intUnit(oneToThree);\n case \"SSS\":\n return intUnit(three);\n case \"u\":\n return simple(oneToNine);\n case \"uu\":\n return simple(oneOrTwo);\n case \"uuu\":\n return intUnit(one);\n // meridiem\n case \"a\":\n return oneOf(loc.meridiems(), 0);\n // weekYear (k)\n case \"kkkk\":\n return intUnit(four);\n case \"kk\":\n return intUnit(twoToFour, untruncateYear);\n // weekNumber (W)\n case \"W\":\n return intUnit(oneOrTwo);\n case \"WW\":\n return intUnit(two);\n // weekdays\n case \"E\":\n case \"c\":\n return intUnit(one);\n case \"EEE\":\n return oneOf(loc.weekdays(\"short\", false), 1);\n case \"EEEE\":\n return oneOf(loc.weekdays(\"long\", false), 1);\n case \"ccc\":\n return oneOf(loc.weekdays(\"short\", true), 1);\n case \"cccc\":\n return oneOf(loc.weekdays(\"long\", true), 1);\n // offset/zone\n case \"Z\":\n case \"ZZ\":\n return offset(new RegExp(`([+-]${oneOrTwo.source})(?::(${two.source}))?`), 2);\n case \"ZZZ\":\n return offset(new RegExp(`([+-]${oneOrTwo.source})(${two.source})?`), 2);\n // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing\n // because we don't have any way to figure out what they are\n case \"z\":\n return simple(/[a-z_+-/]{1,256}?/i);\n // this special-case \"token\" represents a place where a macro-token expanded into a white-space literal\n // in this case we accept any non-newline white-space\n case \" \":\n return simple(/[^\\S\\n\\r]/);\n default:\n return literal(t);\n }\n };\n\n const unit = unitate(token) || {\n invalidReason: MISSING_FTP,\n };\n\n unit.token = token;\n\n return unit;\n}\n\nconst partTypeStyleToTokenVal = {\n year: {\n \"2-digit\": \"yy\",\n numeric: \"yyyyy\",\n },\n month: {\n numeric: \"M\",\n \"2-digit\": \"MM\",\n short: \"MMM\",\n long: \"MMMM\",\n },\n day: {\n numeric: \"d\",\n \"2-digit\": \"dd\",\n },\n weekday: {\n short: \"EEE\",\n long: \"EEEE\",\n },\n dayperiod: \"a\",\n dayPeriod: \"a\",\n hour12: {\n numeric: \"h\",\n \"2-digit\": \"hh\",\n },\n hour24: {\n numeric: \"H\",\n \"2-digit\": \"HH\",\n },\n minute: {\n numeric: \"m\",\n \"2-digit\": \"mm\",\n },\n second: {\n numeric: \"s\",\n \"2-digit\": \"ss\",\n },\n timeZoneName: {\n long: \"ZZZZZ\",\n short: \"ZZZ\",\n },\n};\n\nfunction tokenForPart(part, formatOpts, resolvedOpts) {\n const { type, value } = part;\n\n if (type === \"literal\") {\n const isSpace = /^\\s+$/.test(value);\n return {\n literal: !isSpace,\n val: isSpace ? \" \" : value,\n };\n }\n\n const style = formatOpts[type];\n\n // The user might have explicitly specified hour12 or hourCycle\n // if so, respect their decision\n // if not, refer back to the resolvedOpts, which are based on the locale\n let actualType = type;\n if (type === \"hour\") {\n if (formatOpts.hour12 != null) {\n actualType = formatOpts.hour12 ? \"hour12\" : \"hour24\";\n } else if (formatOpts.hourCycle != null) {\n if (formatOpts.hourCycle === \"h11\" || formatOpts.hourCycle === \"h12\") {\n actualType = \"hour12\";\n } else {\n actualType = \"hour24\";\n }\n } else {\n // tokens only differentiate between 24 hours or not,\n // so we do not need to check hourCycle here, which is less supported anyways\n actualType = resolvedOpts.hour12 ? \"hour12\" : \"hour24\";\n }\n }\n let val = partTypeStyleToTokenVal[actualType];\n if (typeof val === \"object\") {\n val = val[style];\n }\n\n if (val) {\n return {\n literal: false,\n val,\n };\n }\n\n return undefined;\n}\n\nfunction buildRegex(units) {\n const re = units.map((u) => u.regex).reduce((f, r) => `${f}(${r.source})`, \"\");\n return [`^${re}$`, units];\n}\n\nfunction match(input, regex, handlers) {\n const matches = input.match(regex);\n\n if (matches) {\n const all = {};\n let matchIndex = 1;\n for (const i in handlers) {\n if (hasOwnProperty(handlers, i)) {\n const h = handlers[i],\n groups = h.groups ? h.groups + 1 : 1;\n if (!h.literal && h.token) {\n all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups));\n }\n matchIndex += groups;\n }\n }\n return [matches, all];\n } else {\n return [matches, {}];\n }\n}\n\nfunction dateTimeFromMatches(matches) {\n const toField = (token) => {\n switch (token) {\n case \"S\":\n return \"millisecond\";\n case \"s\":\n return \"second\";\n case \"m\":\n return \"minute\";\n case \"h\":\n case \"H\":\n return \"hour\";\n case \"d\":\n return \"day\";\n case \"o\":\n return \"ordinal\";\n case \"L\":\n case \"M\":\n return \"month\";\n case \"y\":\n return \"year\";\n case \"E\":\n case \"c\":\n return \"weekday\";\n case \"W\":\n return \"weekNumber\";\n case \"k\":\n return \"weekYear\";\n case \"q\":\n return \"quarter\";\n default:\n return null;\n }\n };\n\n let zone = null;\n let specificOffset;\n if (!isUndefined(matches.z)) {\n zone = IANAZone.create(matches.z);\n }\n\n if (!isUndefined(matches.Z)) {\n if (!zone) {\n zone = new FixedOffsetZone(matches.Z);\n }\n specificOffset = matches.Z;\n }\n\n if (!isUndefined(matches.q)) {\n matches.M = (matches.q - 1) * 3 + 1;\n }\n\n if (!isUndefined(matches.h)) {\n if (matches.h < 12 && matches.a === 1) {\n matches.h += 12;\n } else if (matches.h === 12 && matches.a === 0) {\n matches.h = 0;\n }\n }\n\n if (matches.G === 0 && matches.y) {\n matches.y = -matches.y;\n }\n\n if (!isUndefined(matches.u)) {\n matches.S = parseMillis(matches.u);\n }\n\n const vals = Object.keys(matches).reduce((r, k) => {\n const f = toField(k);\n if (f) {\n r[f] = matches[k];\n }\n\n return r;\n }, {});\n\n return [vals, zone, specificOffset];\n}\n\nlet dummyDateTimeCache = null;\n\nfunction getDummyDateTime() {\n if (!dummyDateTimeCache) {\n dummyDateTimeCache = DateTime.fromMillis(1555555555555);\n }\n\n return dummyDateTimeCache;\n}\n\nfunction maybeExpandMacroToken(token, locale) {\n if (token.literal) {\n return token;\n }\n\n const formatOpts = Formatter.macroTokenToFormatOpts(token.val);\n const tokens = formatOptsToTokens(formatOpts, locale);\n\n if (tokens == null || tokens.includes(undefined)) {\n return token;\n }\n\n return tokens;\n}\n\nexport function expandMacroTokens(tokens, locale) {\n return Array.prototype.concat(...tokens.map((t) => maybeExpandMacroToken(t, locale)));\n}\n\n/**\n * @private\n */\n\nexport class TokenParser {\n constructor(locale, format) {\n this.locale = locale;\n this.format = format;\n this.tokens = expandMacroTokens(Formatter.parseFormat(format), locale);\n this.units = this.tokens.map((t) => unitForToken(t, locale));\n this.disqualifyingUnit = this.units.find((t) => t.invalidReason);\n\n if (!this.disqualifyingUnit) {\n const [regexString, handlers] = buildRegex(this.units);\n this.regex = RegExp(regexString, \"i\");\n this.handlers = handlers;\n }\n }\n\n explainFromTokens(input) {\n if (!this.isValid) {\n return { input, tokens: this.tokens, invalidReason: this.invalidReason };\n } else {\n const [rawMatches, matches] = match(input, this.regex, this.handlers),\n [result, zone, specificOffset] = matches\n ? dateTimeFromMatches(matches)\n : [null, null, undefined];\n if (hasOwnProperty(matches, \"a\") && hasOwnProperty(matches, \"H\")) {\n throw new ConflictingSpecificationError(\n \"Can't include meridiem when specifying 24-hour format\"\n );\n }\n return {\n input,\n tokens: this.tokens,\n regex: this.regex,\n rawMatches,\n matches,\n result,\n zone,\n specificOffset,\n };\n }\n }\n\n get isValid() {\n return !this.disqualifyingUnit;\n }\n\n get invalidReason() {\n return this.disqualifyingUnit ? this.disqualifyingUnit.invalidReason : null;\n }\n}\n\nexport function explainFromTokens(locale, input, format) {\n const parser = new TokenParser(locale, format);\n return parser.explainFromTokens(input);\n}\n\nexport function parseFromTokens(locale, input, format) {\n const { result, zone, specificOffset, invalidReason } = explainFromTokens(locale, input, format);\n return [result, zone, specificOffset, invalidReason];\n}\n\nexport function formatOptsToTokens(formatOpts, locale) {\n if (!formatOpts) {\n return null;\n }\n\n const formatter = Formatter.create(locale, formatOpts);\n const df = formatter.dtFormatter(getDummyDateTime());\n const parts = df.formatToParts();\n const resolvedOpts = df.resolvedOptions();\n return parts.map((p) => tokenForPart(p, formatOpts, resolvedOpts));\n}\n","import Duration from \"./duration.js\";\nimport Interval from \"./interval.js\";\nimport Settings from \"./settings.js\";\nimport Info from \"./info.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport FixedOffsetZone from \"./zones/fixedOffsetZone.js\";\nimport Locale from \"./impl/locale.js\";\nimport {\n isUndefined,\n maybeArray,\n isDate,\n isNumber,\n bestBy,\n daysInMonth,\n daysInYear,\n isLeapYear,\n weeksInWeekYear,\n normalizeObject,\n roundTo,\n objToLocalTS,\n padStart,\n} from \"./impl/util.js\";\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\nimport diff from \"./impl/diff.js\";\nimport { parseRFC2822Date, parseISODate, parseHTTPDate, parseSQL } from \"./impl/regexParser.js\";\nimport {\n parseFromTokens,\n explainFromTokens,\n formatOptsToTokens,\n expandMacroTokens,\n TokenParser,\n} from \"./impl/tokenParser.js\";\nimport {\n gregorianToWeek,\n weekToGregorian,\n gregorianToOrdinal,\n ordinalToGregorian,\n hasInvalidGregorianData,\n hasInvalidWeekData,\n hasInvalidOrdinalData,\n hasInvalidTimeData,\n usesLocalWeekValues,\n isoWeekdayToLocal,\n} from \"./impl/conversions.js\";\nimport * as Formats from \"./impl/formats.js\";\nimport {\n InvalidArgumentError,\n ConflictingSpecificationError,\n InvalidUnitError,\n InvalidDateTimeError,\n} from \"./errors.js\";\nimport Invalid from \"./impl/invalid.js\";\n\nconst INVALID = \"Invalid DateTime\";\nconst MAX_DATE = 8.64e15;\n\nfunction unsupportedZone(zone) {\n return new Invalid(\"unsupported zone\", `the zone \"${zone.name}\" is not supported`);\n}\n\n// we cache week data on the DT object and this intermediates the cache\n/**\n * @param {DateTime} dt\n */\nfunction possiblyCachedWeekData(dt) {\n if (dt.weekData === null) {\n dt.weekData = gregorianToWeek(dt.c);\n }\n return dt.weekData;\n}\n\n/**\n * @param {DateTime} dt\n */\nfunction possiblyCachedLocalWeekData(dt) {\n if (dt.localWeekData === null) {\n dt.localWeekData = gregorianToWeek(\n dt.c,\n dt.loc.getMinDaysInFirstWeek(),\n dt.loc.getStartOfWeek()\n );\n }\n return dt.localWeekData;\n}\n\n// clone really means, \"make a new object with these modifications\". all \"setters\" really use this\n// to create a new object while only changing some of the properties\nfunction clone(inst, alts) {\n const current = {\n ts: inst.ts,\n zone: inst.zone,\n c: inst.c,\n o: inst.o,\n loc: inst.loc,\n invalid: inst.invalid,\n };\n return new DateTime({ ...current, ...alts, old: current });\n}\n\n// find the right offset a given local time. The o input is our guess, which determines which\n// offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST)\nfunction fixOffset(localTS, o, tz) {\n // Our UTC time is just a guess because our offset is just a guess\n let utcGuess = localTS - o * 60 * 1000;\n\n // Test whether the zone matches the offset for this ts\n const o2 = tz.offset(utcGuess);\n\n // If so, offset didn't change and we're done\n if (o === o2) {\n return [utcGuess, o];\n }\n\n // If not, change the ts by the difference in the offset\n utcGuess -= (o2 - o) * 60 * 1000;\n\n // If that gives us the local time we want, we're done\n const o3 = tz.offset(utcGuess);\n if (o2 === o3) {\n return [utcGuess, o2];\n }\n\n // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time\n return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)];\n}\n\n// convert an epoch timestamp into a calendar object with the given offset\nfunction tsToObj(ts, offset) {\n ts += offset * 60 * 1000;\n\n const d = new Date(ts);\n\n return {\n year: d.getUTCFullYear(),\n month: d.getUTCMonth() + 1,\n day: d.getUTCDate(),\n hour: d.getUTCHours(),\n minute: d.getUTCMinutes(),\n second: d.getUTCSeconds(),\n millisecond: d.getUTCMilliseconds(),\n };\n}\n\n// convert a calendar object to a epoch timestamp\nfunction objToTS(obj, offset, zone) {\n return fixOffset(objToLocalTS(obj), offset, zone);\n}\n\n// create a new DT instance by adding a duration, adjusting for DSTs\nfunction adjustTime(inst, dur) {\n const oPre = inst.o,\n year = inst.c.year + Math.trunc(dur.years),\n month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3,\n c = {\n ...inst.c,\n year,\n month,\n day:\n Math.min(inst.c.day, daysInMonth(year, month)) +\n Math.trunc(dur.days) +\n Math.trunc(dur.weeks) * 7,\n },\n millisToAdd = Duration.fromObject({\n years: dur.years - Math.trunc(dur.years),\n quarters: dur.quarters - Math.trunc(dur.quarters),\n months: dur.months - Math.trunc(dur.months),\n weeks: dur.weeks - Math.trunc(dur.weeks),\n days: dur.days - Math.trunc(dur.days),\n hours: dur.hours,\n minutes: dur.minutes,\n seconds: dur.seconds,\n milliseconds: dur.milliseconds,\n }).as(\"milliseconds\"),\n localTS = objToLocalTS(c);\n\n let [ts, o] = fixOffset(localTS, oPre, inst.zone);\n\n if (millisToAdd !== 0) {\n ts += millisToAdd;\n // that could have changed the offset by going over a DST, but we want to keep the ts the same\n o = inst.zone.offset(ts);\n }\n\n return { ts, o };\n}\n\n// helper useful in turning the results of parsing into real dates\n// by handling the zone options\nfunction parseDataToDateTime(parsed, parsedZone, opts, format, text, specificOffset) {\n const { setZone, zone } = opts;\n if ((parsed && Object.keys(parsed).length !== 0) || parsedZone) {\n const interpretationZone = parsedZone || zone,\n inst = DateTime.fromObject(parsed, {\n ...opts,\n zone: interpretationZone,\n specificOffset,\n });\n return setZone ? inst : inst.setZone(zone);\n } else {\n return DateTime.invalid(\n new Invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ${format}`)\n );\n }\n}\n\n// if you want to output a technical format (e.g. RFC 2822), this helper\n// helps handle the details\nfunction toTechFormat(dt, format, allowZ = true) {\n return dt.isValid\n ? Formatter.create(Locale.create(\"en-US\"), {\n allowZ,\n forceSimple: true,\n }).formatDateTimeFromString(dt, format)\n : null;\n}\n\nfunction toISODate(o, extended, precision) {\n const longFormat = o.c.year > 9999 || o.c.year < 0;\n let c = \"\";\n if (longFormat && o.c.year >= 0) c += \"+\";\n c += padStart(o.c.year, longFormat ? 6 : 4);\n if (precision === \"year\") return c;\n if (extended) {\n c += \"-\";\n c += padStart(o.c.month);\n if (precision === \"month\") return c;\n c += \"-\";\n } else {\n c += padStart(o.c.month);\n if (precision === \"month\") return c;\n }\n c += padStart(o.c.day);\n return c;\n}\n\nfunction toISOTime(\n o,\n extended,\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n) {\n let showSeconds = !suppressSeconds || o.c.millisecond !== 0 || o.c.second !== 0,\n c = \"\";\n switch (precision) {\n case \"day\":\n case \"month\":\n case \"year\":\n break;\n default:\n c += padStart(o.c.hour);\n if (precision === \"hour\") break;\n if (extended) {\n c += \":\";\n c += padStart(o.c.minute);\n if (precision === \"minute\") break;\n if (showSeconds) {\n c += \":\";\n c += padStart(o.c.second);\n }\n } else {\n c += padStart(o.c.minute);\n if (precision === \"minute\") break;\n if (showSeconds) {\n c += padStart(o.c.second);\n }\n }\n if (precision === \"second\") break;\n if (showSeconds && (!suppressMilliseconds || o.c.millisecond !== 0)) {\n c += \".\";\n c += padStart(o.c.millisecond, 3);\n }\n }\n\n if (includeOffset) {\n if (o.isOffsetFixed && o.offset === 0 && !extendedZone) {\n c += \"Z\";\n } else if (o.o < 0) {\n c += \"-\";\n c += padStart(Math.trunc(-o.o / 60));\n c += \":\";\n c += padStart(Math.trunc(-o.o % 60));\n } else {\n c += \"+\";\n c += padStart(Math.trunc(o.o / 60));\n c += \":\";\n c += padStart(Math.trunc(o.o % 60));\n }\n }\n\n if (extendedZone) {\n c += \"[\" + o.zone.ianaName + \"]\";\n }\n return c;\n}\n\n// defaults for unspecified units in the supported calendars\nconst defaultUnitValues = {\n month: 1,\n day: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n },\n defaultWeekUnitValues = {\n weekNumber: 1,\n weekday: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n },\n defaultOrdinalUnitValues = {\n ordinal: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n };\n\n// Units in the supported calendars, sorted by bigness\nconst orderedUnits = [\"year\", \"month\", \"day\", \"hour\", \"minute\", \"second\", \"millisecond\"],\n orderedWeekUnits = [\n \"weekYear\",\n \"weekNumber\",\n \"weekday\",\n \"hour\",\n \"minute\",\n \"second\",\n \"millisecond\",\n ],\n orderedOrdinalUnits = [\"year\", \"ordinal\", \"hour\", \"minute\", \"second\", \"millisecond\"];\n\n// standardize case and plurality in units\nfunction normalizeUnit(unit) {\n const normalized = {\n year: \"year\",\n years: \"year\",\n month: \"month\",\n months: \"month\",\n day: \"day\",\n days: \"day\",\n hour: \"hour\",\n hours: \"hour\",\n minute: \"minute\",\n minutes: \"minute\",\n quarter: \"quarter\",\n quarters: \"quarter\",\n second: \"second\",\n seconds: \"second\",\n millisecond: \"millisecond\",\n milliseconds: \"millisecond\",\n weekday: \"weekday\",\n weekdays: \"weekday\",\n weeknumber: \"weekNumber\",\n weeksnumber: \"weekNumber\",\n weeknumbers: \"weekNumber\",\n weekyear: \"weekYear\",\n weekyears: \"weekYear\",\n ordinal: \"ordinal\",\n }[unit.toLowerCase()];\n\n if (!normalized) throw new InvalidUnitError(unit);\n\n return normalized;\n}\n\nfunction normalizeUnitWithLocalWeeks(unit) {\n switch (unit.toLowerCase()) {\n case \"localweekday\":\n case \"localweekdays\":\n return \"localWeekday\";\n case \"localweeknumber\":\n case \"localweeknumbers\":\n return \"localWeekNumber\";\n case \"localweekyear\":\n case \"localweekyears\":\n return \"localWeekYear\";\n default:\n return normalizeUnit(unit);\n }\n}\n\n// cache offsets for zones based on the current timestamp when this function is\n// first called. When we are handling a datetime from components like (year,\n// month, day, hour) in a time zone, we need a guess about what the timezone\n// offset is so that we can convert into a UTC timestamp. One way is to find the\n// offset of now in the zone. The actual date may have a different offset (for\n// example, if we handle a date in June while we're in December in a zone that\n// observes DST), but we can check and adjust that.\n//\n// When handling many dates, calculating the offset for now every time is\n// expensive. It's just a guess, so we can cache the offset to use even if we\n// are right on a time change boundary (we'll just correct in the other\n// direction). Using a timestamp from first read is a slight optimization for\n// handling dates close to the current date, since those dates will usually be\n// in the same offset (we could set the timestamp statically, instead). We use a\n// single timestamp for all zones to make things a bit more predictable.\n//\n// This is safe for quickDT (used by local() and utc()) because we don't fill in\n// higher-order units from tsNow (as we do in fromObject, this requires that\n// offset is calculated from tsNow).\n/**\n * @param {Zone} zone\n * @return {number}\n */\nfunction guessOffsetForZone(zone) {\n if (zoneOffsetTs === undefined) {\n zoneOffsetTs = Settings.now();\n }\n\n // Do not cache anything but IANA zones, because it is not safe to do so.\n // Guessing an offset which is not present in the zone can cause wrong results from fixOffset\n if (zone.type !== \"iana\") {\n return zone.offset(zoneOffsetTs);\n }\n const zoneName = zone.name;\n let offsetGuess = zoneOffsetGuessCache.get(zoneName);\n if (offsetGuess === undefined) {\n offsetGuess = zone.offset(zoneOffsetTs);\n zoneOffsetGuessCache.set(zoneName, offsetGuess);\n }\n return offsetGuess;\n}\n\n// this is a dumbed down version of fromObject() that runs about 60% faster\n// but doesn't do any validation, makes a bunch of assumptions about what units\n// are present, and so on.\nfunction quickDT(obj, opts) {\n const zone = normalizeZone(opts.zone, Settings.defaultZone);\n if (!zone.isValid) {\n return DateTime.invalid(unsupportedZone(zone));\n }\n\n const loc = Locale.fromObject(opts);\n\n let ts, o;\n\n // assume we have the higher-order units\n if (!isUndefined(obj.year)) {\n for (const u of orderedUnits) {\n if (isUndefined(obj[u])) {\n obj[u] = defaultUnitValues[u];\n }\n }\n\n const invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj);\n if (invalid) {\n return DateTime.invalid(invalid);\n }\n\n const offsetProvis = guessOffsetForZone(zone);\n [ts, o] = objToTS(obj, offsetProvis, zone);\n } else {\n ts = Settings.now();\n }\n\n return new DateTime({ ts, zone, loc, o });\n}\n\nfunction diffRelative(start, end, opts) {\n const round = isUndefined(opts.round) ? true : opts.round,\n rounding = isUndefined(opts.rounding) ? \"trunc\" : opts.rounding,\n format = (c, unit) => {\n c = roundTo(c, round || opts.calendary ? 0 : 2, opts.calendary ? \"round\" : rounding);\n const formatter = end.loc.clone(opts).relFormatter(opts);\n return formatter.format(c, unit);\n },\n differ = (unit) => {\n if (opts.calendary) {\n if (!end.hasSame(start, unit)) {\n return end.startOf(unit).diff(start.startOf(unit), unit).get(unit);\n } else return 0;\n } else {\n return end.diff(start, unit).get(unit);\n }\n };\n\n if (opts.unit) {\n return format(differ(opts.unit), opts.unit);\n }\n\n for (const unit of opts.units) {\n const count = differ(unit);\n if (Math.abs(count) >= 1) {\n return format(count, unit);\n }\n }\n return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]);\n}\n\nfunction lastOpts(argList) {\n let opts = {},\n args;\n if (argList.length > 0 && typeof argList[argList.length - 1] === \"object\") {\n opts = argList[argList.length - 1];\n args = Array.from(argList).slice(0, argList.length - 1);\n } else {\n args = Array.from(argList);\n }\n return [opts, args];\n}\n\n/**\n * Timestamp to use for cached zone offset guesses (exposed for test)\n */\nlet zoneOffsetTs;\n/**\n * Cache for zone offset guesses (exposed for test).\n *\n * This optimizes quickDT via guessOffsetForZone to avoid repeated calls of\n * zone.offset().\n */\nconst zoneOffsetGuessCache = new Map();\n\n/**\n * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them.\n *\n * A DateTime comprises of:\n * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch.\n * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone).\n * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`.\n *\n * Here is a brief overview of the most commonly used functionality it provides:\n *\n * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link DateTime.local}, {@link DateTime.utc}, and (most flexibly) {@link DateTime.fromObject}. To create one from a standard string format, use {@link DateTime.fromISO}, {@link DateTime.fromHTTP}, and {@link DateTime.fromRFC2822}. To create one from a custom string format, use {@link DateTime.fromFormat}. To create one from a native JS date, use {@link DateTime.fromJSDate}.\n * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link DateTime#toObject}), use the {@link DateTime#year}, {@link DateTime#month},\n * {@link DateTime#day}, {@link DateTime#hour}, {@link DateTime#minute}, {@link DateTime#second}, {@link DateTime#millisecond} accessors.\n * * **Week calendar**: For ISO week calendar attributes, see the {@link DateTime#weekYear}, {@link DateTime#weekNumber}, and {@link DateTime#weekday} accessors.\n * * **Configuration** See the {@link DateTime#locale} and {@link DateTime#numberingSystem} accessors.\n * * **Transformation**: To transform the DateTime into other DateTimes, use {@link DateTime#set}, {@link DateTime#reconfigure}, {@link DateTime#setZone}, {@link DateTime#setLocale}, {@link DateTime.plus}, {@link DateTime#minus}, {@link DateTime#endOf}, {@link DateTime#startOf}, {@link DateTime#toUTC}, and {@link DateTime#toLocal}.\n * * **Output**: To convert the DateTime to other representations, use the {@link DateTime#toRelative}, {@link DateTime#toRelativeCalendar}, {@link DateTime#toJSON}, {@link DateTime#toISO}, {@link DateTime#toHTTP}, {@link DateTime#toObject}, {@link DateTime#toRFC2822}, {@link DateTime#toString}, {@link DateTime#toLocaleString}, {@link DateTime#toFormat}, {@link DateTime#toMillis} and {@link DateTime#toJSDate}.\n *\n * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation.\n */\nexport default class DateTime {\n /**\n * @access private\n */\n constructor(config) {\n const zone = config.zone || Settings.defaultZone;\n\n let invalid =\n config.invalid ||\n (Number.isNaN(config.ts) ? new Invalid(\"invalid input\") : null) ||\n (!zone.isValid ? unsupportedZone(zone) : null);\n /**\n * @access private\n */\n this.ts = isUndefined(config.ts) ? Settings.now() : config.ts;\n\n let c = null,\n o = null;\n if (!invalid) {\n const unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone);\n\n if (unchanged) {\n [c, o] = [config.old.c, config.old.o];\n } else {\n // If an offset has been passed and we have not been called from\n // clone(), we can trust it and avoid the offset calculation.\n const ot = isNumber(config.o) && !config.old ? config.o : zone.offset(this.ts);\n c = tsToObj(this.ts, ot);\n invalid = Number.isNaN(c.year) ? new Invalid(\"invalid input\") : null;\n c = invalid ? null : c;\n o = invalid ? null : ot;\n }\n }\n\n /**\n * @access private\n */\n this._zone = zone;\n /**\n * @access private\n */\n this.loc = config.loc || Locale.create();\n /**\n * @access private\n */\n this.invalid = invalid;\n /**\n * @access private\n */\n this.weekData = null;\n /**\n * @access private\n */\n this.localWeekData = null;\n /**\n * @access private\n */\n this.c = c;\n /**\n * @access private\n */\n this.o = o;\n /**\n * @access private\n */\n this.isLuxonDateTime = true;\n }\n\n // CONSTRUCT\n\n /**\n * Create a DateTime for the current instant, in the system's time zone.\n *\n * Use Settings to override these default values if needed.\n * @example DateTime.now().toISO() //~> now in the ISO format\n * @return {DateTime}\n */\n static now() {\n return new DateTime({});\n }\n\n /**\n * Create a local DateTime\n * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used\n * @param {number} [month=1] - The month, 1-indexed\n * @param {number} [day=1] - The day of the month, 1-indexed\n * @param {number} [hour=0] - The hour of the day, in 24-hour time\n * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n * @example DateTime.local() //~> now\n * @example DateTime.local({ zone: \"America/New_York\" }) //~> now, in US east coast time\n * @example DateTime.local(2017) //~> 2017-01-01T00:00:00\n * @example DateTime.local(2017, 3) //~> 2017-03-01T00:00:00\n * @example DateTime.local(2017, 3, 12, { locale: \"fr\" }) //~> 2017-03-12T00:00:00, with a French locale\n * @example DateTime.local(2017, 3, 12, 5) //~> 2017-03-12T05:00:00\n * @example DateTime.local(2017, 3, 12, 5, { zone: \"utc\" }) //~> 2017-03-12T05:00:00, in UTC\n * @example DateTime.local(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00\n * @example DateTime.local(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10\n * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765\n * @return {DateTime}\n */\n static local() {\n const [opts, args] = lastOpts(arguments),\n [year, month, day, hour, minute, second, millisecond] = args;\n return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n }\n\n /**\n * Create a DateTime in UTC\n * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used\n * @param {number} [month=1] - The month, 1-indexed\n * @param {number} [day=1] - The day of the month\n * @param {number} [hour=0] - The hour of the day, in 24-hour time\n * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n * @param {Object} options - configuration options for the DateTime\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} [options.outputCalendar] - the output calendar to set on the resulting DateTime instance\n * @param {string} [options.numberingSystem] - the numbering system to set on the resulting DateTime instance\n * @param {string} [options.weekSettings] - the week settings to set on the resulting DateTime instance\n * @example DateTime.utc() //~> now\n * @example DateTime.utc(2017) //~> 2017-01-01T00:00:00Z\n * @example DateTime.utc(2017, 3) //~> 2017-03-01T00:00:00Z\n * @example DateTime.utc(2017, 3, 12) //~> 2017-03-12T00:00:00Z\n * @example DateTime.utc(2017, 3, 12, 5) //~> 2017-03-12T05:00:00Z\n * @example DateTime.utc(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00Z\n * @example DateTime.utc(2017, 3, 12, 5, 45, { locale: \"fr\" }) //~> 2017-03-12T05:45:00Z with a French locale\n * @example DateTime.utc(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10Z\n * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765, { locale: \"fr\" }) //~> 2017-03-12T05:45:10.765Z with a French locale\n * @return {DateTime}\n */\n static utc() {\n const [opts, args] = lastOpts(arguments),\n [year, month, day, hour, minute, second, millisecond] = args;\n\n opts.zone = FixedOffsetZone.utcInstance;\n return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n }\n\n /**\n * Create a DateTime from a JavaScript Date object. Uses the default zone.\n * @param {Date} date - a JavaScript Date object\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @return {DateTime}\n */\n static fromJSDate(date, options = {}) {\n const ts = isDate(date) ? date.valueOf() : NaN;\n if (Number.isNaN(ts)) {\n return DateTime.invalid(\"invalid input\");\n }\n\n const zoneToUse = normalizeZone(options.zone, Settings.defaultZone);\n if (!zoneToUse.isValid) {\n return DateTime.invalid(unsupportedZone(zoneToUse));\n }\n\n return new DateTime({\n ts: ts,\n zone: zoneToUse,\n loc: Locale.fromObject(options),\n });\n }\n\n /**\n * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n * @param {number} milliseconds - a number of milliseconds since 1970 UTC\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromMillis(milliseconds, options = {}) {\n if (!isNumber(milliseconds)) {\n throw new InvalidArgumentError(\n `fromMillis requires a numerical input, but received a ${typeof milliseconds} with value ${milliseconds}`\n );\n } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) {\n // this isn't perfect because we can still end up out of range because of additional shifting, but it's a start\n return DateTime.invalid(\"Timestamp out of range\");\n } else {\n return new DateTime({\n ts: milliseconds,\n zone: normalizeZone(options.zone, Settings.defaultZone),\n loc: Locale.fromObject(options),\n });\n }\n }\n\n /**\n * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n * @param {number} seconds - a number of seconds since 1970 UTC\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromSeconds(seconds, options = {}) {\n if (!isNumber(seconds)) {\n throw new InvalidArgumentError(\"fromSeconds requires a numerical input\");\n } else {\n return new DateTime({\n ts: seconds * 1000,\n zone: normalizeZone(options.zone, Settings.defaultZone),\n loc: Locale.fromObject(options),\n });\n }\n }\n\n /**\n * Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults.\n * @param {Object} obj - the object to create the DateTime from\n * @param {number} obj.year - a year, such as 1987\n * @param {number} obj.month - a month, 1-12\n * @param {number} obj.day - a day of the month, 1-31, depending on the month\n * @param {number} obj.ordinal - day of the year, 1-365 or 366\n * @param {number} obj.weekYear - an ISO week year\n * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year\n * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday\n * @param {number} obj.localWeekYear - a week year, according to the locale\n * @param {number} obj.localWeekNumber - a week number, between 1 and 52 or 53, depending on the year, according to the locale\n * @param {number} obj.localWeekday - a weekday, 1-7, where 1 is the first and 7 is the last day of the week, according to the locale\n * @param {number} obj.hour - hour of the day, 0-23\n * @param {number} obj.minute - minute of the hour, 0-59\n * @param {number} obj.second - second of the minute, 0-59\n * @param {number} obj.millisecond - millisecond of the second, 0-999\n * @param {Object} opts - options for creating this DateTime\n * @param {string|Zone} [opts.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone()\n * @param {string} [opts.locale='system\\'s locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25'\n * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01'\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'utc' }),\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'local' })\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'America/New_York' })\n * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13'\n * @example DateTime.fromObject({ localWeekYear: 2022, localWeekNumber: 1, localWeekday: 1 }, { locale: \"en-US\" }).toISODate() //=> '2021-12-26'\n * @return {DateTime}\n */\n static fromObject(obj, opts = {}) {\n obj = obj || {};\n const zoneToUse = normalizeZone(opts.zone, Settings.defaultZone);\n if (!zoneToUse.isValid) {\n return DateTime.invalid(unsupportedZone(zoneToUse));\n }\n\n const loc = Locale.fromObject(opts);\n const normalized = normalizeObject(obj, normalizeUnitWithLocalWeeks);\n const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, loc);\n\n const tsNow = Settings.now(),\n offsetProvis = !isUndefined(opts.specificOffset)\n ? opts.specificOffset\n : zoneToUse.offset(tsNow),\n containsOrdinal = !isUndefined(normalized.ordinal),\n containsGregorYear = !isUndefined(normalized.year),\n containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n containsGregor = containsGregorYear || containsGregorMD,\n definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n // cases:\n // just a weekday -> this week's instance of that weekday, no worries\n // (gregorian data or ordinal) + (weekYear or weekNumber) -> error\n // (gregorian month or day) + ordinal -> error\n // otherwise just use weeks or ordinals or gregorian, depending on what's specified\n\n if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n throw new ConflictingSpecificationError(\n \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n );\n }\n\n if (containsGregorMD && containsOrdinal) {\n throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n }\n\n const useWeekData = definiteWeekDef || (normalized.weekday && !containsGregor);\n\n // configure ourselves to deal with gregorian dates or week stuff\n let units,\n defaultValues,\n objNow = tsToObj(tsNow, offsetProvis);\n if (useWeekData) {\n units = orderedWeekUnits;\n defaultValues = defaultWeekUnitValues;\n objNow = gregorianToWeek(objNow, minDaysInFirstWeek, startOfWeek);\n } else if (containsOrdinal) {\n units = orderedOrdinalUnits;\n defaultValues = defaultOrdinalUnitValues;\n objNow = gregorianToOrdinal(objNow);\n } else {\n units = orderedUnits;\n defaultValues = defaultUnitValues;\n }\n\n // set default values for missing stuff\n let foundFirst = false;\n for (const u of units) {\n const v = normalized[u];\n if (!isUndefined(v)) {\n foundFirst = true;\n } else if (foundFirst) {\n normalized[u] = defaultValues[u];\n } else {\n normalized[u] = objNow[u];\n }\n }\n\n // make sure the values we have are in range\n const higherOrderInvalid = useWeekData\n ? hasInvalidWeekData(normalized, minDaysInFirstWeek, startOfWeek)\n : containsOrdinal\n ? hasInvalidOrdinalData(normalized)\n : hasInvalidGregorianData(normalized),\n invalid = higherOrderInvalid || hasInvalidTimeData(normalized);\n\n if (invalid) {\n return DateTime.invalid(invalid);\n }\n\n // compute the actual time\n const gregorian = useWeekData\n ? weekToGregorian(normalized, minDaysInFirstWeek, startOfWeek)\n : containsOrdinal\n ? ordinalToGregorian(normalized)\n : normalized,\n [tsFinal, offsetFinal] = objToTS(gregorian, offsetProvis, zoneToUse),\n inst = new DateTime({\n ts: tsFinal,\n zone: zoneToUse,\n o: offsetFinal,\n loc,\n });\n\n // gregorian data + weekday serves only to validate\n if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) {\n return DateTime.invalid(\n \"mismatched weekday\",\n `you can't specify both a weekday of ${normalized.weekday} and a date of ${inst.toISO()}`\n );\n }\n\n if (!inst.isValid) {\n return DateTime.invalid(inst.invalid);\n }\n\n return inst;\n }\n\n /**\n * Create a DateTime from an ISO 8601 string\n * @param {string} text - the ISO string\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance\n * @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance\n * @param {string} [opts.weekSettings] - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromISO('2016-05-25T09:08:34.123')\n * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00')\n * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true})\n * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'})\n * @example DateTime.fromISO('2016-W05-4')\n * @return {DateTime}\n */\n static fromISO(text, opts = {}) {\n const [vals, parsedZone] = parseISODate(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"ISO 8601\", text);\n }\n\n /**\n * Create a DateTime from an RFC 2822 string\n * @param {string} text - the RFC 2822 string\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT')\n * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600')\n * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z')\n * @return {DateTime}\n */\n static fromRFC2822(text, opts = {}) {\n const [vals, parsedZone] = parseRFC2822Date(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"RFC 2822\", text);\n }\n\n /**\n * Create a DateTime from an HTTP header date\n * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n * @param {string} text - the HTTP header date\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods.\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT')\n * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT')\n * @example DateTime.fromHTTP('Sun Nov 6 08:49:37 1994')\n * @return {DateTime}\n */\n static fromHTTP(text, opts = {}) {\n const [vals, parsedZone] = parseHTTPDate(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"HTTP\", opts);\n }\n\n /**\n * Create a DateTime from an input string and format string.\n * Defaults to en-US if no locale has been specified, regardless of the system's locale. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/parsing?id=table-of-tokens).\n * @param {string} text - the string to parse\n * @param {string} fmt - the format the string is expected to be in (see the link below for the formats)\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromFormat(text, fmt, opts = {}) {\n if (isUndefined(text) || isUndefined(fmt)) {\n throw new InvalidArgumentError(\"fromFormat requires an input string and a format\");\n }\n\n const { locale = null, numberingSystem = null } = opts,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n }),\n [vals, parsedZone, specificOffset, invalid] = parseFromTokens(localeToUse, text, fmt);\n if (invalid) {\n return DateTime.invalid(invalid);\n } else {\n return parseDataToDateTime(vals, parsedZone, opts, `format ${fmt}`, text, specificOffset);\n }\n }\n\n /**\n * @deprecated use fromFormat instead\n */\n static fromString(text, fmt, opts = {}) {\n return DateTime.fromFormat(text, fmt, opts);\n }\n\n /**\n * Create a DateTime from a SQL date, time, or datetime\n * Defaults to en-US if no locale has been specified, regardless of the system's locale\n * @param {string} text - the string to parse\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @example DateTime.fromSQL('2017-05-15')\n * @example DateTime.fromSQL('2017-05-15 09:12:34')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true })\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' })\n * @example DateTime.fromSQL('09:12:34.342')\n * @return {DateTime}\n */\n static fromSQL(text, opts = {}) {\n const [vals, parsedZone] = parseSQL(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"SQL\", text);\n }\n\n /**\n * Create an invalid DateTime.\n * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent.\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {DateTime}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the DateTime is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidDateTimeError(invalid);\n } else {\n return new DateTime({ invalid });\n }\n }\n\n /**\n * Check if an object is an instance of DateTime. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isDateTime(o) {\n return (o && o.isLuxonDateTime) || false;\n }\n\n /**\n * Produce the format string for a set of options\n * @param formatOpts\n * @param localeOpts\n * @returns {string}\n */\n static parseFormatForOpts(formatOpts, localeOpts = {}) {\n const tokenList = formatOptsToTokens(formatOpts, Locale.fromObject(localeOpts));\n return !tokenList ? null : tokenList.map((t) => (t ? t.val : null)).join(\"\");\n }\n\n /**\n * Produce the the fully expanded format token for the locale\n * Does NOT quote characters, so quoted tokens will not round trip correctly\n * @param fmt\n * @param localeOpts\n * @returns {string}\n */\n static expandFormat(fmt, localeOpts = {}) {\n const expanded = expandMacroTokens(Formatter.parseFormat(fmt), Locale.fromObject(localeOpts));\n return expanded.map((t) => t.val).join(\"\");\n }\n\n static resetCache() {\n zoneOffsetTs = undefined;\n zoneOffsetGuessCache.clear();\n }\n\n // INFO\n\n /**\n * Get the value of unit.\n * @param {string} unit - a unit such as 'minute' or 'day'\n * @example DateTime.local(2017, 7, 4).get('month'); //=> 7\n * @example DateTime.local(2017, 7, 4).get('day'); //=> 4\n * @return {number}\n */\n get(unit) {\n return this[unit];\n }\n\n /**\n * Returns whether the DateTime is valid. Invalid DateTimes occur when:\n * * The DateTime was created from invalid calendar information, such as the 13th month or February 30\n * * The DateTime was created by an operation on another invalid date\n * @type {boolean}\n */\n get isValid() {\n return this.invalid === null;\n }\n\n /**\n * Returns an error code if this DateTime is invalid, or null if the DateTime is valid\n * @type {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime\n *\n * @type {string}\n */\n get locale() {\n return this.isValid ? this.loc.locale : null;\n }\n\n /**\n * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime\n *\n * @type {string}\n */\n get numberingSystem() {\n return this.isValid ? this.loc.numberingSystem : null;\n }\n\n /**\n * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime\n *\n * @type {string}\n */\n get outputCalendar() {\n return this.isValid ? this.loc.outputCalendar : null;\n }\n\n /**\n * Get the time zone associated with this DateTime.\n * @type {Zone}\n */\n get zone() {\n return this._zone;\n }\n\n /**\n * Get the name of the time zone.\n * @type {string}\n */\n get zoneName() {\n return this.isValid ? this.zone.name : null;\n }\n\n /**\n * Get the year\n * @example DateTime.local(2017, 5, 25).year //=> 2017\n * @type {number}\n */\n get year() {\n return this.isValid ? this.c.year : NaN;\n }\n\n /**\n * Get the quarter\n * @example DateTime.local(2017, 5, 25).quarter //=> 2\n * @type {number}\n */\n get quarter() {\n return this.isValid ? Math.ceil(this.c.month / 3) : NaN;\n }\n\n /**\n * Get the month (1-12).\n * @example DateTime.local(2017, 5, 25).month //=> 5\n * @type {number}\n */\n get month() {\n return this.isValid ? this.c.month : NaN;\n }\n\n /**\n * Get the day of the month (1-30ish).\n * @example DateTime.local(2017, 5, 25).day //=> 25\n * @type {number}\n */\n get day() {\n return this.isValid ? this.c.day : NaN;\n }\n\n /**\n * Get the hour of the day (0-23).\n * @example DateTime.local(2017, 5, 25, 9).hour //=> 9\n * @type {number}\n */\n get hour() {\n return this.isValid ? this.c.hour : NaN;\n }\n\n /**\n * Get the minute of the hour (0-59).\n * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30\n * @type {number}\n */\n get minute() {\n return this.isValid ? this.c.minute : NaN;\n }\n\n /**\n * Get the second of the minute (0-59).\n * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52\n * @type {number}\n */\n get second() {\n return this.isValid ? this.c.second : NaN;\n }\n\n /**\n * Get the millisecond of the second (0-999).\n * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654\n * @type {number}\n */\n get millisecond() {\n return this.isValid ? this.c.millisecond : NaN;\n }\n\n /**\n * Get the week year\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2014, 12, 31).weekYear //=> 2015\n * @type {number}\n */\n get weekYear() {\n return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN;\n }\n\n /**\n * Get the week number of the week year (1-52ish).\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2017, 5, 25).weekNumber //=> 21\n * @type {number}\n */\n get weekNumber() {\n return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN;\n }\n\n /**\n * Get the day of the week.\n * 1 is Monday and 7 is Sunday\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2014, 11, 31).weekday //=> 4\n * @type {number}\n */\n get weekday() {\n return this.isValid ? possiblyCachedWeekData(this).weekday : NaN;\n }\n\n /**\n * Returns true if this date is on a weekend according to the locale, false otherwise\n * @returns {boolean}\n */\n get isWeekend() {\n return this.isValid && this.loc.getWeekendDays().includes(this.weekday);\n }\n\n /**\n * Get the day of the week according to the locale.\n * 1 is the first day of the week and 7 is the last day of the week.\n * If the locale assigns Sunday as the first day of the week, then a date which is a Sunday will return 1,\n * @returns {number}\n */\n get localWeekday() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekday : NaN;\n }\n\n /**\n * Get the week number of the week year according to the locale. Different locales assign week numbers differently,\n * because the week can start on different days of the week (see localWeekday) and because a different number of days\n * is required for a week to count as the first week of a year.\n * @returns {number}\n */\n get localWeekNumber() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekNumber : NaN;\n }\n\n /**\n * Get the week year according to the locale. Different locales assign week numbers (and therefor week years)\n * differently, see localWeekNumber.\n * @returns {number}\n */\n get localWeekYear() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekYear : NaN;\n }\n\n /**\n * Get the ordinal (meaning the day of the year)\n * @example DateTime.local(2017, 5, 25).ordinal //=> 145\n * @type {number|DateTime}\n */\n get ordinal() {\n return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN;\n }\n\n /**\n * Get the human readable short month name, such as 'Oct'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).monthShort //=> Oct\n * @type {string}\n */\n get monthShort() {\n return this.isValid ? Info.months(\"short\", { locObj: this.loc })[this.month - 1] : null;\n }\n\n /**\n * Get the human readable long month name, such as 'October'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).monthLong //=> October\n * @type {string}\n */\n get monthLong() {\n return this.isValid ? Info.months(\"long\", { locObj: this.loc })[this.month - 1] : null;\n }\n\n /**\n * Get the human readable short weekday, such as 'Mon'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon\n * @type {string}\n */\n get weekdayShort() {\n return this.isValid ? Info.weekdays(\"short\", { locObj: this.loc })[this.weekday - 1] : null;\n }\n\n /**\n * Get the human readable long weekday, such as 'Monday'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday\n * @type {string}\n */\n get weekdayLong() {\n return this.isValid ? Info.weekdays(\"long\", { locObj: this.loc })[this.weekday - 1] : null;\n }\n\n /**\n * Get the UTC offset of this DateTime in minutes\n * @example DateTime.now().offset //=> -240\n * @example DateTime.utc().offset //=> 0\n * @type {number}\n */\n get offset() {\n return this.isValid ? +this.o : NaN;\n }\n\n /**\n * Get the short human name for the zone's current offset, for example \"EST\" or \"EDT\".\n * Defaults to the system's locale if no locale has been specified\n * @type {string}\n */\n get offsetNameShort() {\n if (this.isValid) {\n return this.zone.offsetName(this.ts, {\n format: \"short\",\n locale: this.locale,\n });\n } else {\n return null;\n }\n }\n\n /**\n * Get the long human name for the zone's current offset, for example \"Eastern Standard Time\" or \"Eastern Daylight Time\".\n * Defaults to the system's locale if no locale has been specified\n * @type {string}\n */\n get offsetNameLong() {\n if (this.isValid) {\n return this.zone.offsetName(this.ts, {\n format: \"long\",\n locale: this.locale,\n });\n } else {\n return null;\n }\n }\n\n /**\n * Get whether this zone's offset ever changes, as in a DST.\n * @type {boolean}\n */\n get isOffsetFixed() {\n return this.isValid ? this.zone.isUniversal : null;\n }\n\n /**\n * Get whether the DateTime is in a DST.\n * @type {boolean}\n */\n get isInDST() {\n if (this.isOffsetFixed) {\n return false;\n } else {\n return (\n this.offset > this.set({ month: 1, day: 1 }).offset ||\n this.offset > this.set({ month: 5 }).offset\n );\n }\n }\n\n /**\n * Get those DateTimes which have the same local time as this DateTime, but a different offset from UTC\n * in this DateTime's zone. During DST changes local time can be ambiguous, for example\n * `2023-10-29T02:30:00` in `Europe/Berlin` can have offset `+01:00` or `+02:00`.\n * This method will return both possible DateTimes if this DateTime's local time is ambiguous.\n * @returns {DateTime[]}\n */\n getPossibleOffsets() {\n if (!this.isValid || this.isOffsetFixed) {\n return [this];\n }\n const dayMs = 86400000;\n const minuteMs = 60000;\n const localTS = objToLocalTS(this.c);\n const oEarlier = this.zone.offset(localTS - dayMs);\n const oLater = this.zone.offset(localTS + dayMs);\n\n const o1 = this.zone.offset(localTS - oEarlier * minuteMs);\n const o2 = this.zone.offset(localTS - oLater * minuteMs);\n if (o1 === o2) {\n return [this];\n }\n const ts1 = localTS - o1 * minuteMs;\n const ts2 = localTS - o2 * minuteMs;\n const c1 = tsToObj(ts1, o1);\n const c2 = tsToObj(ts2, o2);\n if (\n c1.hour === c2.hour &&\n c1.minute === c2.minute &&\n c1.second === c2.second &&\n c1.millisecond === c2.millisecond\n ) {\n return [clone(this, { ts: ts1 }), clone(this, { ts: ts2 })];\n }\n return [this];\n }\n\n /**\n * Returns true if this DateTime is in a leap year, false otherwise\n * @example DateTime.local(2016).isInLeapYear //=> true\n * @example DateTime.local(2013).isInLeapYear //=> false\n * @type {boolean}\n */\n get isInLeapYear() {\n return isLeapYear(this.year);\n }\n\n /**\n * Returns the number of days in this DateTime's month\n * @example DateTime.local(2016, 2).daysInMonth //=> 29\n * @example DateTime.local(2016, 3).daysInMonth //=> 31\n * @type {number}\n */\n get daysInMonth() {\n return daysInMonth(this.year, this.month);\n }\n\n /**\n * Returns the number of days in this DateTime's year\n * @example DateTime.local(2016).daysInYear //=> 366\n * @example DateTime.local(2013).daysInYear //=> 365\n * @type {number}\n */\n get daysInYear() {\n return this.isValid ? daysInYear(this.year) : NaN;\n }\n\n /**\n * Returns the number of weeks in this DateTime's year\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2004).weeksInWeekYear //=> 53\n * @example DateTime.local(2013).weeksInWeekYear //=> 52\n * @type {number}\n */\n get weeksInWeekYear() {\n return this.isValid ? weeksInWeekYear(this.weekYear) : NaN;\n }\n\n /**\n * Returns the number of weeks in this DateTime's local week year\n * @example DateTime.local(2020, 6, {locale: 'en-US'}).weeksInLocalWeekYear //=> 52\n * @example DateTime.local(2020, 6, {locale: 'de-DE'}).weeksInLocalWeekYear //=> 53\n * @type {number}\n */\n get weeksInLocalWeekYear() {\n return this.isValid\n ? weeksInWeekYear(\n this.localWeekYear,\n this.loc.getMinDaysInFirstWeek(),\n this.loc.getStartOfWeek()\n )\n : NaN;\n }\n\n /**\n * Returns the resolved Intl options for this DateTime.\n * This is useful in understanding the behavior of formatting methods\n * @param {Object} opts - the same options as toLocaleString\n * @return {Object}\n */\n resolvedLocaleOptions(opts = {}) {\n const { locale, numberingSystem, calendar } = Formatter.create(\n this.loc.clone(opts),\n opts\n ).resolvedOptions(this);\n return { locale, numberingSystem, outputCalendar: calendar };\n }\n\n // TRANSFORM\n\n /**\n * \"Set\" the DateTime's zone to UTC. Returns a newly-constructed DateTime.\n *\n * Equivalent to {@link DateTime#setZone}('utc')\n * @param {number} [offset=0] - optionally, an offset from UTC in minutes\n * @param {Object} [opts={}] - options to pass to `setZone()`\n * @return {DateTime}\n */\n toUTC(offset = 0, opts = {}) {\n return this.setZone(FixedOffsetZone.instance(offset), opts);\n }\n\n /**\n * \"Set\" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime.\n *\n * Equivalent to `setZone('local')`\n * @return {DateTime}\n */\n toLocal() {\n return this.setZone(Settings.defaultZone);\n }\n\n /**\n * \"Set\" the DateTime's zone to specified zone. Returns a newly-constructed DateTime.\n *\n * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link DateTime#plus}. You may wish to use {@link DateTime#toLocal} and {@link DateTime#toUTC} which provide simple convenience wrappers for commonly used zones.\n * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link DateTime#Zone} class.\n * @param {Object} opts - options\n * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this.\n * @return {DateTime}\n */\n setZone(zone, { keepLocalTime = false, keepCalendarTime = false } = {}) {\n zone = normalizeZone(zone, Settings.defaultZone);\n if (zone.equals(this.zone)) {\n return this;\n } else if (!zone.isValid) {\n return DateTime.invalid(unsupportedZone(zone));\n } else {\n let newTS = this.ts;\n if (keepLocalTime || keepCalendarTime) {\n const offsetGuess = zone.offset(this.ts);\n const asObj = this.toObject();\n [newTS] = objToTS(asObj, offsetGuess, zone);\n }\n return clone(this, { ts: newTS, zone });\n }\n }\n\n /**\n * \"Set\" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime.\n * @param {Object} properties - the properties to set\n * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' })\n * @return {DateTime}\n */\n reconfigure({ locale, numberingSystem, outputCalendar } = {}) {\n const loc = this.loc.clone({ locale, numberingSystem, outputCalendar });\n return clone(this, { loc });\n }\n\n /**\n * \"Set\" the locale. Returns a newly-constructed DateTime.\n * Just a convenient alias for reconfigure({ locale })\n * @example DateTime.local(2017, 5, 25).setLocale('en-GB')\n * @return {DateTime}\n */\n setLocale(locale) {\n return this.reconfigure({ locale });\n }\n\n /**\n * \"Set\" the values of specified units. Returns a newly-constructed DateTime.\n * You can only set units with this method; for \"setting\" metadata, see {@link DateTime#reconfigure} and {@link DateTime#setZone}.\n *\n * This method also supports setting locale-based week units, i.e. `localWeekday`, `localWeekNumber` and `localWeekYear`.\n * They cannot be mixed with ISO-week units like `weekday`.\n * @param {Object} values - a mapping of units to numbers\n * @example dt.set({ year: 2017 })\n * @example dt.set({ hour: 8, minute: 30 })\n * @example dt.set({ weekday: 5 })\n * @example dt.set({ year: 2005, ordinal: 234 })\n * @return {DateTime}\n */\n set(values) {\n if (!this.isValid) return this;\n\n const normalized = normalizeObject(values, normalizeUnitWithLocalWeeks);\n const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, this.loc);\n\n const settingWeekStuff =\n !isUndefined(normalized.weekYear) ||\n !isUndefined(normalized.weekNumber) ||\n !isUndefined(normalized.weekday),\n containsOrdinal = !isUndefined(normalized.ordinal),\n containsGregorYear = !isUndefined(normalized.year),\n containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n containsGregor = containsGregorYear || containsGregorMD,\n definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n throw new ConflictingSpecificationError(\n \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n );\n }\n\n if (containsGregorMD && containsOrdinal) {\n throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n }\n\n let mixed;\n if (settingWeekStuff) {\n mixed = weekToGregorian(\n { ...gregorianToWeek(this.c, minDaysInFirstWeek, startOfWeek), ...normalized },\n minDaysInFirstWeek,\n startOfWeek\n );\n } else if (!isUndefined(normalized.ordinal)) {\n mixed = ordinalToGregorian({ ...gregorianToOrdinal(this.c), ...normalized });\n } else {\n mixed = { ...this.toObject(), ...normalized };\n\n // if we didn't set the day but we ended up on an overflow date,\n // use the last day of the right month\n if (isUndefined(normalized.day)) {\n mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day);\n }\n }\n\n const [ts, o] = objToTS(mixed, this.o, this.zone);\n return clone(this, { ts, o });\n }\n\n /**\n * Add a period of time to this DateTime and return the resulting DateTime\n *\n * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between.\n * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @example DateTime.now().plus(123) //~> in 123 milliseconds\n * @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes\n * @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow\n * @example DateTime.now().plus({ days: -1 }) //~> this time yesterday\n * @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min\n * @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min\n * @return {DateTime}\n */\n plus(duration) {\n if (!this.isValid) return this;\n const dur = Duration.fromDurationLike(duration);\n return clone(this, adjustTime(this, dur));\n }\n\n /**\n * Subtract a period of time to this DateTime and return the resulting DateTime\n * See {@link DateTime#plus}\n * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n @return {DateTime}\n */\n minus(duration) {\n if (!this.isValid) return this;\n const dur = Duration.fromDurationLike(duration).negate();\n return clone(this, adjustTime(this, dur));\n }\n\n /**\n * \"Set\" this DateTime to the beginning of a unit of time.\n * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week\n * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01'\n * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01'\n * @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays\n * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00'\n * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00'\n * @return {DateTime}\n */\n startOf(unit, { useLocaleWeeks = false } = {}) {\n if (!this.isValid) return this;\n\n const o = {},\n normalizedUnit = Duration.normalizeUnit(unit);\n switch (normalizedUnit) {\n case \"years\":\n o.month = 1;\n // falls through\n case \"quarters\":\n case \"months\":\n o.day = 1;\n // falls through\n case \"weeks\":\n case \"days\":\n o.hour = 0;\n // falls through\n case \"hours\":\n o.minute = 0;\n // falls through\n case \"minutes\":\n o.second = 0;\n // falls through\n case \"seconds\":\n o.millisecond = 0;\n break;\n case \"milliseconds\":\n break;\n // no default, invalid units throw in normalizeUnit()\n }\n\n if (normalizedUnit === \"weeks\") {\n if (useLocaleWeeks) {\n const startOfWeek = this.loc.getStartOfWeek();\n const { weekday } = this;\n if (weekday < startOfWeek) {\n o.weekNumber = this.weekNumber - 1;\n }\n o.weekday = startOfWeek;\n } else {\n o.weekday = 1;\n }\n }\n\n if (normalizedUnit === \"quarters\") {\n const q = Math.ceil(this.month / 3);\n o.month = (q - 1) * 3 + 1;\n }\n\n return this.set(o);\n }\n\n /**\n * \"Set\" this DateTime to the end (meaning the last millisecond) of a unit of time\n * @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week\n * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays\n * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00'\n * @return {DateTime}\n */\n endOf(unit, opts) {\n return this.isValid\n ? this.plus({ [unit]: 1 })\n .startOf(unit, opts)\n .minus(1)\n : this;\n }\n\n // OUTPUT\n\n /**\n * Returns a string representation of this DateTime formatted according to the specified format string.\n * **You may not want this.** See {@link DateTime#toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/formatting?id=table-of-tokens).\n * Defaults to en-US if no locale has been specified, regardless of the system's locale.\n * @param {string} fmt - the format string\n * @param {Object} opts - opts to override the configuration options on this DateTime\n * @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22'\n * @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22'\n * @example DateTime.now().toFormat('yyyy LLL dd', { locale: \"fr\" }) //=> '2017 avr. 22'\n * @example DateTime.now().toFormat(\"HH 'hours and' mm 'minutes'\") //=> '20 hours and 55 minutes'\n * @return {string}\n */\n toFormat(fmt, opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt)\n : INVALID;\n }\n\n /**\n * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`.\n * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation\n * of the DateTime in the assigned locale.\n * Defaults to the system's locale if no locale has been specified\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param formatOpts {Object} - Intl.DateTimeFormat constructor options and configuration options\n * @param {Object} opts - opts to override the configuration options on this DateTime\n * @example DateTime.now().toLocaleString(); //=> 4/20/2017\n * @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017'\n * @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017'\n * @example DateTime.now().toLocaleString(DateTime.DATE_FULL, { locale: 'fr' }); //=> '28 août 2022'\n * @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM'\n * @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM'\n * @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20'\n * @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM'\n * @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }); //=> '11:32'\n * @return {string}\n */\n toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this)\n : INVALID;\n }\n\n /**\n * Returns an array of format \"parts\", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output.\n * Defaults to the system's locale if no locale has been specified\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts\n * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`.\n * @example DateTime.now().toLocaleParts(); //=> [\n * //=> { type: 'day', value: '25' },\n * //=> { type: 'literal', value: '/' },\n * //=> { type: 'month', value: '05' },\n * //=> { type: 'literal', value: '/' },\n * //=> { type: 'year', value: '1982' }\n * //=> ]\n */\n toLocaleParts(opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this)\n : [];\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.extendedZone=false] - add the time zone format extension\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'years', 'months', 'days', 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0.\n * @example DateTime.utc(1983, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z'\n * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00'\n * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335'\n * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400'\n * @example DateTime.now().toISO({ precision: 'day' }) //=> '2017-04-22Z'\n * @example DateTime.now().toISO({ precision: 'minute' }) //=> '2017-04-22T20:47Z'\n * @return {string|null}\n */\n toISO({\n format = \"extended\",\n suppressSeconds = false,\n suppressMilliseconds = false,\n includeOffset = true,\n extendedZone = false,\n precision = \"milliseconds\",\n } = {}) {\n if (!this.isValid) {\n return null;\n }\n\n precision = normalizeUnit(precision);\n const ext = format === \"extended\";\n\n let c = toISODate(this, ext, precision);\n if (orderedUnits.indexOf(precision) >= 3) c += \"T\";\n c += toISOTime(\n this,\n ext,\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n );\n return c;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's date component\n * @param {Object} opts - options\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='day'] - truncate output to desired precision: 'years', 'months', or 'days'.\n * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25'\n * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525'\n * @example DateTime.utc(1982, 5, 25).toISODate({ precision: 'month' }) //=> '1982-05'\n * @return {string|null}\n */\n toISODate({ format = \"extended\", precision = \"day\" } = {}) {\n if (!this.isValid) {\n return null;\n }\n return toISODate(this, format === \"extended\", normalizeUnit(precision));\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's week date\n * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2'\n * @return {string}\n */\n toISOWeekDate() {\n return toTechFormat(this, \"kkkk-'W'WW-c\");\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's time component\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.extendedZone=true] - add the time zone format extension\n * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0.\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34, second: 56 }).toISOTime({ precision: 'minute' }) //=> '07:34Z'\n * @return {string}\n */\n toISOTime({\n suppressMilliseconds = false,\n suppressSeconds = false,\n includeOffset = true,\n includePrefix = false,\n extendedZone = false,\n format = \"extended\",\n precision = \"milliseconds\",\n } = {}) {\n if (!this.isValid) {\n return null;\n }\n\n precision = normalizeUnit(precision);\n let c = includePrefix && orderedUnits.indexOf(precision) >= 3 ? \"T\" : \"\";\n return (\n c +\n toISOTime(\n this,\n format === \"extended\",\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n )\n );\n }\n\n /**\n * Returns an RFC 2822-compatible string representation of this DateTime\n * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000'\n * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400'\n * @return {string}\n */\n toRFC2822() {\n return toTechFormat(this, \"EEE, dd LLL yyyy HH:mm:ss ZZZ\", false);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in HTTP headers. The output is always expressed in GMT.\n * Specifically, the string conforms to RFC 1123.\n * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT'\n * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT'\n * @return {string}\n */\n toHTTP() {\n return toTechFormat(this.toUTC(), \"EEE, dd LLL yyyy HH:mm:ss 'GMT'\");\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL Date\n * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13'\n * @return {string|null}\n */\n toSQLDate() {\n if (!this.isValid) {\n return null;\n }\n return toISODate(this, true);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL Time\n * @param {Object} opts - options\n * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00'\n * @example DateTime.utc().toSQL() //=> '05:15:16.345'\n * @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00'\n * @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345'\n * @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York'\n * @return {string}\n */\n toSQLTime({ includeOffset = true, includeZone = false, includeOffsetSpace = true } = {}) {\n let fmt = \"HH:mm:ss.SSS\";\n\n if (includeZone || includeOffset) {\n if (includeOffsetSpace) {\n fmt += \" \";\n }\n if (includeZone) {\n fmt += \"z\";\n } else if (includeOffset) {\n fmt += \"ZZ\";\n }\n }\n\n return toTechFormat(this, fmt, true);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL DateTime\n * @param {Object} opts - options\n * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00'\n * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z'\n * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00'\n * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000'\n * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York'\n * @return {string}\n */\n toSQL(opts = {}) {\n if (!this.isValid) {\n return null;\n }\n\n return `${this.toSQLDate()} ${this.toSQLTime(opts)}`;\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for debugging\n * @return {string}\n */\n toString() {\n return this.isValid ? this.toISO() : INVALID;\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `DateTime { ts: ${this.toISO()}, zone: ${this.zone.name}, locale: ${this.locale} }`;\n } else {\n return `DateTime { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns the epoch milliseconds of this DateTime. Alias of {@link DateTime#toMillis}\n * @return {number}\n */\n valueOf() {\n return this.toMillis();\n }\n\n /**\n * Returns the epoch milliseconds of this DateTime.\n * @return {number}\n */\n toMillis() {\n return this.isValid ? this.ts : NaN;\n }\n\n /**\n * Returns the epoch seconds (including milliseconds in the fractional part) of this DateTime.\n * @return {number}\n */\n toSeconds() {\n return this.isValid ? this.ts / 1000 : NaN;\n }\n\n /**\n * Returns the epoch seconds (as a whole number) of this DateTime.\n * @return {number}\n */\n toUnixInteger() {\n return this.isValid ? Math.floor(this.ts / 1000) : NaN;\n }\n\n /**\n * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON.\n * @return {string}\n */\n toJSON() {\n return this.toISO();\n }\n\n /**\n * Returns a BSON serializable equivalent to this DateTime.\n * @return {Date}\n */\n toBSON() {\n return this.toJSDate();\n }\n\n /**\n * Returns a JavaScript object with this DateTime's year, month, day, and so on.\n * @param opts - options for generating the object\n * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output\n * @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 }\n * @return {Object}\n */\n toObject(opts = {}) {\n if (!this.isValid) return {};\n\n const base = { ...this.c };\n\n if (opts.includeConfig) {\n base.outputCalendar = this.outputCalendar;\n base.numberingSystem = this.loc.numberingSystem;\n base.locale = this.loc.locale;\n }\n return base;\n }\n\n /**\n * Returns a JavaScript Date equivalent to this DateTime.\n * @return {Date}\n */\n toJSDate() {\n return new Date(this.isValid ? this.ts : NaN);\n }\n\n // COMPARE\n\n /**\n * Return the difference between two DateTimes as a Duration.\n * @param {DateTime} otherDateTime - the DateTime to compare this one to\n * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration.\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @example\n * var i1 = DateTime.fromISO('1982-05-25T09:45'),\n * i2 = DateTime.fromISO('1983-10-14T10:30');\n * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 }\n * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 }\n * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 }\n * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 }\n * @return {Duration}\n */\n diff(otherDateTime, unit = \"milliseconds\", opts = {}) {\n if (!this.isValid || !otherDateTime.isValid) {\n return Duration.invalid(\"created by diffing an invalid DateTime\");\n }\n\n const durOpts = { locale: this.locale, numberingSystem: this.numberingSystem, ...opts };\n\n const units = maybeArray(unit).map(Duration.normalizeUnit),\n otherIsLater = otherDateTime.valueOf() > this.valueOf(),\n earlier = otherIsLater ? this : otherDateTime,\n later = otherIsLater ? otherDateTime : this,\n diffed = diff(earlier, later, units, durOpts);\n\n return otherIsLater ? diffed.negate() : diffed;\n }\n\n /**\n * Return the difference between this DateTime and right now.\n * See {@link DateTime#diff}\n * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @return {Duration}\n */\n diffNow(unit = \"milliseconds\", opts = {}) {\n return this.diff(DateTime.now(), unit, opts);\n }\n\n /**\n * Return an Interval spanning between this DateTime and another DateTime\n * @param {DateTime} otherDateTime - the other end point of the Interval\n * @return {Interval|DateTime}\n */\n until(otherDateTime) {\n return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this;\n }\n\n /**\n * Return whether this DateTime is in the same unit of time as another DateTime.\n * Higher-order units must also be identical for this function to return `true`.\n * Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link DateTime#setZone} to convert one of the dates if needed.\n * @param {DateTime} otherDateTime - the other DateTime\n * @param {string} unit - the unit of time to check sameness on\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; only the locale of this DateTime is used\n * @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day\n * @return {boolean}\n */\n hasSame(otherDateTime, unit, opts) {\n if (!this.isValid) return false;\n\n const inputMs = otherDateTime.valueOf();\n const adjustedToZone = this.setZone(otherDateTime.zone, { keepLocalTime: true });\n return (\n adjustedToZone.startOf(unit, opts) <= inputMs && inputMs <= adjustedToZone.endOf(unit, opts)\n );\n }\n\n /**\n * Equality check\n * Two DateTimes are equal if and only if they represent the same millisecond, have the same zone and location, and are both valid.\n * To compare just the millisecond values, use `+dt1 === +dt2`.\n * @param {DateTime} other - the other DateTime\n * @return {boolean}\n */\n equals(other) {\n return (\n this.isValid &&\n other.isValid &&\n this.valueOf() === other.valueOf() &&\n this.zone.equals(other.zone) &&\n this.loc.equals(other.loc)\n );\n }\n\n /**\n * Returns a string representation of a this time relative to now, such as \"in two days\". Can only internationalize if your\n * platform supports Intl.RelativeTimeFormat. Rounds towards zero by default.\n * @param {Object} options - options that affect the output\n * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n * @param {string} [options.style=\"long\"] - the style of units, must be \"long\", \"short\", or \"narrow\"\n * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of \"years\", \"quarters\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", or \"seconds\"\n * @param {boolean} [options.round=true] - whether to round the numbers in the output.\n * @param {string} [options.rounding=\"trunc\"] - rounding method to use when rounding the numbers in the output. Can be \"trunc\" (toward zero), \"expand\" (away from zero), \"round\", \"floor\", or \"ceil\".\n * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding.\n * @param {string} options.locale - override the locale of this DateTime\n * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n * @example DateTime.now().plus({ days: 1 }).toRelative() //=> \"in 1 day\"\n * @example DateTime.now().setLocale(\"es\").toRelative({ days: 1 }) //=> \"dentro de 1 día\"\n * @example DateTime.now().plus({ days: 1 }).toRelative({ locale: \"fr\" }) //=> \"dans 23 heures\"\n * @example DateTime.now().minus({ days: 2 }).toRelative() //=> \"2 days ago\"\n * @example DateTime.now().minus({ days: 2 }).toRelative({ unit: \"hours\" }) //=> \"48 hours ago\"\n * @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> \"1.5 days ago\"\n */\n toRelative(options = {}) {\n if (!this.isValid) return null;\n const base = options.base || DateTime.fromObject({}, { zone: this.zone }),\n padding = options.padding ? (this < base ? -options.padding : options.padding) : 0;\n let units = [\"years\", \"months\", \"days\", \"hours\", \"minutes\", \"seconds\"];\n let unit = options.unit;\n if (Array.isArray(options.unit)) {\n units = options.unit;\n unit = undefined;\n }\n return diffRelative(base, this.plus(padding), {\n ...options,\n numeric: \"always\",\n units,\n unit,\n });\n }\n\n /**\n * Returns a string representation of this date relative to today, such as \"yesterday\" or \"next month\".\n * Only internationalizes on platforms that supports Intl.RelativeTimeFormat.\n * @param {Object} options - options that affect the output\n * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n * @param {string} options.locale - override the locale of this DateTime\n * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of \"years\", \"quarters\", \"months\", \"weeks\", or \"days\"\n * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> \"tomorrow\"\n * @example DateTime.now().setLocale(\"es\").plus({ days: 1 }).toRelative() //=> \"\"mañana\"\n * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: \"fr\" }) //=> \"demain\"\n * @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> \"2 days ago\"\n */\n toRelativeCalendar(options = {}) {\n if (!this.isValid) return null;\n\n return diffRelative(options.base || DateTime.fromObject({}, { zone: this.zone }), this, {\n ...options,\n numeric: \"auto\",\n units: [\"years\", \"months\", \"days\"],\n calendary: true,\n });\n }\n\n /**\n * Return the min of several date times\n * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum\n * @return {DateTime} the min DateTime, or undefined if called with no argument\n */\n static min(...dateTimes) {\n if (!dateTimes.every(DateTime.isDateTime)) {\n throw new InvalidArgumentError(\"min requires all arguments be DateTimes\");\n }\n return bestBy(dateTimes, (i) => i.valueOf(), Math.min);\n }\n\n /**\n * Return the max of several date times\n * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum\n * @return {DateTime} the max DateTime, or undefined if called with no argument\n */\n static max(...dateTimes) {\n if (!dateTimes.every(DateTime.isDateTime)) {\n throw new InvalidArgumentError(\"max requires all arguments be DateTimes\");\n }\n return bestBy(dateTimes, (i) => i.valueOf(), Math.max);\n }\n\n // MISC\n\n /**\n * Explain how a string would be parsed by fromFormat()\n * @param {string} text - the string to parse\n * @param {string} fmt - the format the string is expected to be in (see description)\n * @param {Object} options - options taken by fromFormat()\n * @return {Object}\n */\n static fromFormatExplain(text, fmt, options = {}) {\n const { locale = null, numberingSystem = null } = options,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n return explainFromTokens(localeToUse, text, fmt);\n }\n\n /**\n * @deprecated use fromFormatExplain instead\n */\n static fromStringExplain(text, fmt, options = {}) {\n return DateTime.fromFormatExplain(text, fmt, options);\n }\n\n /**\n * Build a parser for `fmt` using the given locale. This parser can be passed\n * to {@link DateTime.fromFormatParser} to a parse a date in this format. This\n * can be used to optimize cases where many dates need to be parsed in a\n * specific format.\n *\n * @param {String} fmt - the format the string is expected to be in (see\n * description)\n * @param {Object} options - options used to set locale and numberingSystem\n * for parser\n * @returns {TokenParser} - opaque object to be used\n */\n static buildFormatParser(fmt, options = {}) {\n const { locale = null, numberingSystem = null } = options,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n return new TokenParser(localeToUse, fmt);\n }\n\n /**\n * Create a DateTime from an input string and format parser.\n *\n * The format parser must have been created with the same locale as this call.\n *\n * @param {String} text - the string to parse\n * @param {TokenParser} formatParser - parser from {@link DateTime.buildFormatParser}\n * @param {Object} opts - options taken by fromFormat()\n * @returns {DateTime}\n */\n static fromFormatParser(text, formatParser, opts = {}) {\n if (isUndefined(text) || isUndefined(formatParser)) {\n throw new InvalidArgumentError(\n \"fromFormatParser requires an input string and a format parser\"\n );\n }\n const { locale = null, numberingSystem = null } = opts,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n\n if (!localeToUse.equals(formatParser.locale)) {\n throw new InvalidArgumentError(\n `fromFormatParser called with a locale of ${localeToUse}, ` +\n `but the format parser was created for ${formatParser.locale}`\n );\n }\n\n const { result, zone, specificOffset, invalidReason } = formatParser.explainFromTokens(text);\n\n if (invalidReason) {\n return DateTime.invalid(invalidReason);\n } else {\n return parseDataToDateTime(\n result,\n zone,\n opts,\n `format ${formatParser.format}`,\n text,\n specificOffset\n );\n }\n }\n\n // FORMAT PRESETS\n\n /**\n * {@link DateTime#toLocaleString} format like 10/14/1983\n * @type {Object}\n */\n static get DATE_SHORT() {\n return Formats.DATE_SHORT;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983'\n * @type {Object}\n */\n static get DATE_MED() {\n return Formats.DATE_MED;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Fri, Oct 14, 1983'\n * @type {Object}\n */\n static get DATE_MED_WITH_WEEKDAY() {\n return Formats.DATE_MED_WITH_WEEKDAY;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983'\n * @type {Object}\n */\n static get DATE_FULL() {\n return Formats.DATE_FULL;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Tuesday, October 14, 1983'\n * @type {Object}\n */\n static get DATE_HUGE() {\n return Formats.DATE_HUGE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_SIMPLE() {\n return Formats.TIME_SIMPLE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_SECONDS() {\n return Formats.TIME_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_SHORT_OFFSET() {\n return Formats.TIME_WITH_SHORT_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_LONG_OFFSET() {\n return Formats.TIME_WITH_LONG_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_SIMPLE() {\n return Formats.TIME_24_SIMPLE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_SECONDS() {\n return Formats.TIME_24_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 EDT', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_SHORT_OFFSET() {\n return Formats.TIME_24_WITH_SHORT_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_LONG_OFFSET() {\n return Formats.TIME_24_WITH_LONG_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_SHORT() {\n return Formats.DATETIME_SHORT;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_SHORT_WITH_SECONDS() {\n return Formats.DATETIME_SHORT_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED() {\n return Formats.DATETIME_MED;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED_WITH_SECONDS() {\n return Formats.DATETIME_MED_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED_WITH_WEEKDAY() {\n return Formats.DATETIME_MED_WITH_WEEKDAY;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_FULL() {\n return Formats.DATETIME_FULL;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_FULL_WITH_SECONDS() {\n return Formats.DATETIME_FULL_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_HUGE() {\n return Formats.DATETIME_HUGE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_HUGE_WITH_SECONDS() {\n return Formats.DATETIME_HUGE_WITH_SECONDS;\n }\n}\n\n/**\n * @private\n */\nexport function friendlyDateTime(dateTimeish) {\n if (DateTime.isDateTime(dateTimeish)) {\n return dateTimeish;\n } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) {\n return DateTime.fromJSDate(dateTimeish);\n } else if (dateTimeish && typeof dateTimeish === \"object\") {\n return DateTime.fromObject(dateTimeish);\n } else {\n throw new InvalidArgumentError(\n `Unknown datetime argument: ${dateTimeish}, of type ${typeof dateTimeish}`\n );\n }\n}\n","import DateTime from \"./datetime.js\";\nimport Duration from \"./duration.js\";\nimport Interval from \"./interval.js\";\nimport Info from \"./info.js\";\nimport Zone from \"./zone.js\";\nimport FixedOffsetZone from \"./zones/fixedOffsetZone.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport InvalidZone from \"./zones/invalidZone.js\";\nimport SystemZone from \"./zones/systemZone.js\";\nimport Settings from \"./settings.js\";\n\nconst VERSION = \"3.7.2\";\n\nexport {\n VERSION,\n DateTime,\n Duration,\n Interval,\n Info,\n Zone,\n FixedOffsetZone,\n IANAZone,\n InvalidZone,\n SystemZone,\n Settings,\n};\n"],"names":["LuxonError","_Error","_inheritsLoose","apply","arguments","_wrapNativeSuper","Error","InvalidDateTimeError","_LuxonError","reason","call","toMessage","InvalidIntervalError","_LuxonError2","InvalidDurationError","_LuxonError3","ConflictingSpecificationError","_LuxonError4","InvalidUnitError","_LuxonError5","unit","InvalidArgumentError","_LuxonError6","ZoneIsAbstractError","_LuxonError7","n","s","l","DATE_SHORT","year","month","day","DATE_MED","DATE_MED_WITH_WEEKDAY","weekday","DATE_FULL","DATE_HUGE","TIME_SIMPLE","hour","minute","TIME_WITH_SECONDS","second","TIME_WITH_SHORT_OFFSET","timeZoneName","TIME_WITH_LONG_OFFSET","TIME_24_SIMPLE","hourCycle","TIME_24_WITH_SECONDS","TIME_24_WITH_SHORT_OFFSET","TIME_24_WITH_LONG_OFFSET","DATETIME_SHORT","DATETIME_SHORT_WITH_SECONDS","DATETIME_MED","DATETIME_MED_WITH_SECONDS","DATETIME_MED_WITH_WEEKDAY","DATETIME_FULL","DATETIME_FULL_WITH_SECONDS","DATETIME_HUGE","DATETIME_HUGE_WITH_SECONDS","Zone","_proto","prototype","offsetName","ts","opts","formatOffset","format","offset","equals","otherZone","_createClass","key","get","name","singleton","SystemZone","_Zone","_ref","locale","parseZoneInfo","Date","getTimezoneOffset","type","Intl","DateTimeFormat","resolvedOptions","timeZone","dtfCache","Map","makeDTF","zoneName","dtf","undefined","hour12","era","set","typeToPos","hackyOffset","date","formatted","replace","parsed","exec","fMonth","fDay","fYear","fadOrBc","fHour","fMinute","fSecond","partsOffset","formatToParts","filled","i","length","_formatted$i","value","pos","isUndefined","parseInt","ianaZoneCache","IANAZone","create","zone","resetCache","clear","isValidSpecifier","isValidZone","e","_this","valid","NaN","isNaN","_ref2","adOrBc","Math","abs","adjustedHour","asUTC","objToLocalTS","millisecond","asTS","over","intlLFCache","getCachedLF","locString","JSON","stringify","ListFormat","intlDTCache","getCachedDTF","intlNumCache","getCachedINF","inf","NumberFormat","intlRelCache","getCachedRTF","_opts","base","cacheKeyOpts","_objectWithoutPropertiesLoose","_excluded","RelativeTimeFormat","sysLocaleCache","systemLocale","intlResolvedOptionsCache","getCachedIntResolvedOptions","weekInfoCache","getCachedWeekInfo","data","Locale","getWeekInfo","weekInfo","_extends","fallbackWeekSettings","parseLocaleString","localeStr","xIndex","indexOf","substring","uIndex","options","selectedStr","smaller","_options","numberingSystem","calendar","intlConfigString","outputCalendar","includes","mapMonths","f","ms","dt","DateTime","utc","push","mapWeekdays","listStuff","loc","englishFn","intlFn","mode","listingMode","supportsFastNumbers","startsWith","PolyNumberFormatter","intl","forceSimple","padTo","floor","otherOpts","_excluded2","Object","keys","intlOpts","useGrouping","minimumIntegerDigits","fixed","roundTo","padStart","PolyDateFormatter","originalZone","z","gmtOffset","offsetZ","setZone","plus","minutes","_proto2","map","join","toJSDate","parts","part","PolyRelFormatter","isEnglish","style","hasRelative","rtf","_proto3","count","English","numeric","firstDay","minimalDays","weekend","fromOpts","weekSettings","defaultToEN","specifiedLocale","Settings","defaultLocale","localeR","numberingSystemR","defaultNumberingSystem","outputCalendarR","defaultOutputCalendar","weekSettingsR","validateWeekSettings","defaultWeekSettings","fromObject","_temp","numbering","_parseLocaleString","parsedLocale","parsedNumberingSystem","parsedOutputCalendar","weekdaysCache","standalone","monthsCache","meridiemCache","eraCache","fastNumbersCached","_proto4","isActuallyEn","hasNoWeirdness","clone","alts","getOwnPropertyNames","redefaultToEN","redefaultToSystem","months","_this2","monthSpecialCase","formatStr","mapper","extract","dtFormatter","weekdays","_this3","meridiems","_this4","eras","_this5","field","df","results","matching","find","m","toLowerCase","numberFormatter","fastNumbers","relFormatter","listFormatter","getWeekSettings","hasLocaleWeekInfo","getStartOfWeek","getMinDaysInFirstWeek","getWeekendDays","other","toString","FixedOffsetZone","instance","utcInstance","parseSpecifier","r","match","signedOffset","InvalidZone","normalizeZone","input","defaultZone","isString","lowered","isNumber","numberingSystems","arab","arabext","bali","beng","deva","fullwide","gujr","hanidec","khmr","knda","laoo","limb","mlym","mong","mymr","orya","tamldec","telu","thai","tibt","latn","numberingSystemsUTF16","hanidecChars","split","parseDigits","str","code","charCodeAt","search","_numberingSystemsUTF","min","max","digitRegexCache","resetDigitRegexCache","digitRegex","append","ns","appendCache","regex","RegExp","now","twoDigitCutoffYear","throwOnInvalid","resetCaches","cutoffYear","t","Invalid","explanation","nonLeapLadder","leapLadder","unitOutOfRange","dayOfWeek","d","UTC","setUTCFullYear","getUTCFullYear","js","getUTCDay","computeOrdinal","isLeapYear","uncomputeOrdinal","ordinal","table","month0","findIndex","isoWeekdayToLocal","isoWeekday","startOfWeek","gregorianToWeek","gregObj","minDaysInFirstWeek","weekNumber","weekYear","weeksInWeekYear","timeObject","weekToGregorian","weekData","weekdayOfJan4","yearInDays","daysInYear","_uncomputeOrdinal","gregorianToOrdinal","gregData","ordinalToGregorian","ordinalData","_uncomputeOrdinal2","usesLocalWeekValues","obj","hasLocaleWeekData","localWeekday","localWeekNumber","localWeekYear","hasIsoWeekData","hasInvalidWeekData","validYear","isInteger","validWeek","integerBetween","validWeekday","hasInvalidOrdinalData","validOrdinal","hasInvalidGregorianData","validMonth","validDay","daysInMonth","hasInvalidTimeData","validHour","validMinute","validSecond","validMillisecond","o","isDate","maybeArray","thing","Array","isArray","bestBy","arr","by","compare","reduce","best","next","pair","pick","a","k","hasOwnProperty","prop","settings","some","v","from","bottom","top","floorMod","x","isNeg","padded","parseInteger","string","parseFloating","parseFloat","parseMillis","fraction","number","digits","rounding","factor","pow","ceil","trunc","round","RangeError","modMonth","modYear","firstWeekOffset","fwdlw","weekOffset","weekOffsetNext","untruncateYear","offsetFormat","modified","offHourStr","offMinuteStr","offHour","Number","offMin","offMinSigned","is","asNumber","numericValue","isFinite","normalizeObject","normalizer","normalized","u","hours","sign","monthsLong","monthsShort","monthsNarrow","concat","weekdaysLong","weekdaysShort","weekdaysNarrow","erasLong","erasShort","erasNarrow","meridiemForDateTime","weekdayForDateTime","monthForDateTime","eraForDateTime","formatRelativeTime","narrow","units","years","quarters","weeks","days","seconds","lastable","isDay","isInPast","fmtValue","singular","lilUnits","fmtUnit","stringifyTokens","splits","tokenToString","_iterator","_createForOfIteratorHelperLoose","_step","done","token","literal","val","macroTokenToFormatOpts","D","Formats","DD","DDD","DDDD","tt","ttt","tttt","T","TT","TTT","TTTT","ff","fff","ffff","F","FF","FFF","FFFF","Formatter","parseFormat","fmt","current","currentFull","bracketed","c","charAt","test","formatOpts","systemLoc","formatWithSystemDefault","formatDateTime","formatDateTimeParts","formatInterval","interval","start","formatRange","end","num","p","signDisplay","formatDateTimeFromString","knownEnglish","useDateTimeFormatter","isOffsetFixed","allowZ","isValid","meridiem","maybeMacro","slice","quarter","formatDurationFromString","dur","invertLargest","signMode","tokenToField","lildur","info","mapped","inversionFactor","isNegativeDuration","largestUnit","tokens","realTokens","found","collapsed","shiftTo","filter","durationInfo","values","ianaRegex","combineRegexes","_len","regexes","_key","full","source","combineExtractors","_len2","extractors","_key2","ex","mergedVals","mergedZone","cursor","_ex","parse","_len3","patterns","_key3","_i","_patterns","_patterns$_i","extractor","simpleParse","_len4","_key4","ret","offsetRegex","isoExtendedZone","isoTimeBaseRegex","isoTimeRegex","isoTimeExtensionRegex","isoYmdRegex","isoWeekRegex","isoOrdinalRegex","extractISOWeekData","extractISOOrdinalData","sqlYmdRegex","sqlTimeRegex","sqlTimeExtensionRegex","int","fallback","extractISOYmd","item","extractISOTime","milliseconds","extractISOOffset","local","fullOffset","extractIANAZone","isoTimeOnly","isoDuration","extractISODuration","yearStr","monthStr","weekStr","dayStr","hourStr","minuteStr","secondStr","millisecondsStr","hasNegativePrefix","negativeSeconds","maybeNegate","force","obsOffsets","GMT","EDT","EST","CDT","CST","MDT","MST","PDT","PST","fromStrings","weekdayStr","result","rfc2822","extractRFC2822","obsOffset","milOffset","preprocessRFC2822","trim","rfc1123","rfc850","ascii","extractRFC1123Or850","extractASCII","isoYmdWithTimeExtensionRegex","isoWeekWithTimeExtensionRegex","isoOrdinalWithTimeExtensionRegex","isoTimeCombinedRegex","extractISOYmdTimeAndOffset","extractISOWeekTimeAndOffset","extractISOOrdinalDateAndTime","extractISOTimeAndOffset","parseISODate","parseRFC2822Date","parseHTTPDate","parseISODuration","extractISOTimeOnly","parseISOTimeOnly","sqlYmdWithTimeExtensionRegex","sqlTimeCombinedRegex","extractISOTimeOffsetAndIANAZone","parseSQL","INVALID","lowOrderMatrix","casualMatrix","daysInYearAccurate","daysInMonthAccurate","accurateMatrix","orderedUnits","reverseUnits","reverse","conf","conversionAccuracy","matrix","Duration","durationToMillis","vals","_vals$milliseconds","sum","normalizeValues","reduceRight","previous","previousVal","conv","rollUp","removeZeroes","newVals","_Object$entries","entries","_Object$entries$_i","_Symbol$for","config","accurate","invalid","isLuxonDuration","fromMillis","normalizeUnit","fromDurationLike","durationLike","isDuration","fromISO","text","_parseISODuration","fromISOTime","_parseISOTimeOnly","week","toFormat","fmtOpts","toHuman","showZeros","unitDisplay","listStyle","toObject","toISO","toISOTime","millis","toMillis","suppressMilliseconds","suppressSeconds","includePrefix","includeOffset","dateTime","toJSON","invalidReason","valueOf","duration","_i2","_orderedUnits","minus","negate","mapUnits","fn","_i3","_Object$keys","mixed","reconfigure","as","normalize","rescale","shiftToAll","built","accumulated","lastUnit","_i4","_orderedUnits2","own","ak","negated","_i5","_Object$keys2","removeZeros","eq","v1","v2","_i6","_orderedUnits3","Symbol","for","validateStartEnd","Interval","isLuxonInterval","fromDateTimes","builtStart","friendlyDateTime","builtEnd","validateError","after","before","_split","startIsValid","endIsValid","isInterval","toDuration","startOf","useLocaleWeeks","diff","hasSame","isEmpty","isAfter","isBefore","contains","splitAt","dateTimes","sorted","sort","b","added","splitBy","idx","divideEqually","numberOfParts","overlaps","abutsStart","abutsEnd","engulfs","intersection","union","merge","intervals","_intervals$sort$reduc","sofar","final","xor","_Array$prototype","currentCount","ends","time","flattened","difference","toLocaleString","toISODate","dateFormat","_temp2","_ref3","_ref3$separator","separator","mapEndpoints","mapFn","Info","hasDST","proto","isUniversal","isValidIANAZone","_ref$locale","_ref$locObj","locObj","getMinimumDaysInFirstWeek","_ref2$locale","_ref2$locObj","getWeekendWeekdays","_temp3","_ref3$locale","_ref3$locObj","_temp4","_ref4","_ref4$locale","_ref4$numberingSystem","_ref4$locObj","_ref4$outputCalendar","monthsFormat","_temp5","_ref5","_ref5$locale","_ref5$numberingSystem","_ref5$locObj","_ref5$outputCalendar","_temp6","_ref6","_ref6$locale","_ref6$numberingSystem","_ref6$locObj","weekdaysFormat","_temp7","_ref7","_ref7$locale","_ref7$numberingSystem","_ref7$locObj","_temp8","_ref8","_ref8$locale","_temp9","_ref9","_ref9$locale","features","relative","localeWeek","dayDiff","earlier","later","utcDayStart","toUTC","keepLocalTime","highOrderDiffs","differs","lowestOrder","highWater","_differs","_differs$_i","differ","_highOrderDiffs","remainingMillis","lowerOrderUnits","_cursor$plus","_Duration$fromMillis","MISSING_FTP","intUnit","post","deser","NBSP","String","fromCharCode","spaceOrNBSP","spaceOrNBSPRegExp","fixListRegex","stripInsensitivities","oneOf","strings","startIndex","groups","h","simple","escapeToken","unitForToken","one","two","three","four","six","oneOrTwo","oneToThree","oneToSix","oneToNine","twoToFour","fourToSix","unitate","partTypeStyleToTokenVal","short","long","dayperiod","dayPeriod","hour24","tokenForPart","resolvedOpts","isSpace","actualType","buildRegex","re","handlers","matches","all","matchIndex","dateTimeFromMatches","toField","specificOffset","Z","q","M","G","y","S","dummyDateTimeCache","getDummyDateTime","maybeExpandMacroToken","formatOptsToTokens","expandMacroTokens","TokenParser","disqualifyingUnit","_buildRegex","regexString","explainFromTokens","_match","rawMatches","parser","parseFromTokens","_explainFromTokens","formatter","MAX_DATE","unsupportedZone","possiblyCachedWeekData","possiblyCachedLocalWeekData","localWeekData","inst","old","fixOffset","localTS","tz","utcGuess","o2","o3","tsToObj","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","objToTS","adjustTime","oPre","millisToAdd","_fixOffset","parseDataToDateTime","parsedZone","interpretationZone","toTechFormat","extended","precision","longFormat","extendedZone","showSeconds","ianaName","defaultUnitValues","defaultWeekUnitValues","defaultOrdinalUnitValues","orderedWeekUnits","orderedOrdinalUnits","weeknumber","weeksnumber","weeknumbers","weekyear","weekyears","normalizeUnitWithLocalWeeks","guessOffsetForZone","zoneOffsetTs","offsetGuess","zoneOffsetGuessCache","quickDT","offsetProvis","_objToTS","diffRelative","calendary","lastOpts","argList","args","unchanged","ot","_zone","isLuxonDateTime","_lastOpts","_lastOpts2","fromJSDate","zoneToUse","fromSeconds","_usesLocalWeekValues","tsNow","containsOrdinal","containsGregorYear","containsGregorMD","containsGregor","definiteWeekDef","useWeekData","defaultValues","objNow","foundFirst","_iterator2","_step2","higherOrderInvalid","gregorian","_objToTS2","tsFinal","offsetFinal","_parseISODate","fromRFC2822","_parseRFC2822Date","fromHTTP","_parseHTTPDate","fromFormat","_opts$locale","_opts$numberingSystem","localeToUse","_parseFromTokens","fromString","fromSQL","_parseSQL","isDateTime","parseFormatForOpts","localeOpts","tokenList","expandFormat","expanded","getPossibleOffsets","dayMs","minuteMs","oEarlier","oLater","o1","ts1","ts2","c1","c2","resolvedLocaleOptions","_Formatter$create$res","toLocal","_ref2$keepLocalTime","_ref2$keepCalendarTim","keepCalendarTime","newTS","asObj","_objToTS3","setLocale","_usesLocalWeekValues2","settingWeekStuff","_objToTS4","_ref4$useLocaleWeeks","normalizedUnit","endOf","_this$plus","toLocaleParts","_ref5$format","_ref5$suppressSeconds","_ref5$suppressMillise","_ref5$includeOffset","_ref5$extendedZone","_ref5$precision","ext","_ref6$format","_ref6$precision","toISOWeekDate","_ref7$suppressMillise","_ref7$suppressSeconds","_ref7$includeOffset","_ref7$includePrefix","_ref7$extendedZone","_ref7$format","_ref7$precision","toRFC2822","toHTTP","toSQLDate","toSQLTime","_ref8$includeOffset","_ref8$includeZone","includeZone","_ref8$includeOffsetSp","includeOffsetSpace","toSQL","toSeconds","toUnixInteger","toBSON","includeConfig","otherDateTime","durOpts","otherIsLater","diffed","diffNow","until","inputMs","adjustedToZone","toRelative","padding","toRelativeCalendar","every","fromFormatExplain","_options$locale","_options$numberingSys","fromStringExplain","buildFormatParser","_options2","_options2$locale","_options2$numberingSy","fromFormatParser","formatParser","_opts2","_opts2$locale","_opts2$numberingSyste","_formatParser$explain","dateTimeish","VERSION"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/luxon/build/global/luxon.min.js b/node_modules/luxon/build/global/luxon.min.js new file mode 100644 index 00000000..9b013034 --- /dev/null +++ b/node_modules/luxon/build/global/luxon.min.js @@ -0,0 +1 @@ +var luxon=function(e){"use strict";function L(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[n++]}};throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var t=function(e){function t(){return e.apply(this,arguments)||this}return o(t,e),t}(q(Error)),P=function(t){function e(e){return t.call(this,"Invalid DateTime: "+e.toMessage())||this}return o(e,t),e}(t),Y=function(t){function e(e){return t.call(this,"Invalid Interval: "+e.toMessage())||this}return o(e,t),e}(t),H=function(t){function e(e){return t.call(this,"Invalid Duration: "+e.toMessage())||this}return o(e,t),e}(t),w=function(e){function t(){return e.apply(this,arguments)||this}return o(t,e),t}(t),J=function(t){function e(e){return t.call(this,"Invalid unit "+e)||this}return o(e,t),e}(t),u=function(e){function t(){return e.apply(this,arguments)||this}return o(t,e),t}(t),n=function(e){function t(){return e.call(this,"Zone is an abstract class")||this}return o(t,e),t}(t),t="numeric",r="short",a="long",G={year:t,month:t,day:t},$={year:t,month:r,day:t},B={year:t,month:r,day:t,weekday:r},Q={year:t,month:a,day:t},K={year:t,month:a,day:t,weekday:a},X={hour:t,minute:t},ee={hour:t,minute:t,second:t},te={hour:t,minute:t,second:t,timeZoneName:r},ne={hour:t,minute:t,second:t,timeZoneName:a},re={hour:t,minute:t,hourCycle:"h23"},ie={hour:t,minute:t,second:t,hourCycle:"h23"},oe={hour:t,minute:t,second:t,hourCycle:"h23",timeZoneName:r},ae={hour:t,minute:t,second:t,hourCycle:"h23",timeZoneName:a},se={year:t,month:t,day:t,hour:t,minute:t},ue={year:t,month:t,day:t,hour:t,minute:t,second:t},le={year:t,month:r,day:t,hour:t,minute:t},ce={year:t,month:r,day:t,hour:t,minute:t,second:t},fe={year:t,month:r,day:t,weekday:r,hour:t,minute:t},de={year:t,month:a,day:t,hour:t,minute:t,timeZoneName:r},he={year:t,month:a,day:t,hour:t,minute:t,second:t,timeZoneName:r},me={year:t,month:a,day:t,weekday:a,hour:t,minute:t,timeZoneName:a},ye={year:t,month:a,day:t,weekday:a,hour:t,minute:t,second:t,timeZoneName:a},s=function(){function e(){}var t=e.prototype;return t.offsetName=function(e,t){throw new n},t.formatOffset=function(e,t){throw new n},t.offset=function(e){throw new n},t.equals=function(e){throw new n},i(e,[{key:"type",get:function(){throw new n}},{key:"name",get:function(){throw new n}},{key:"ianaName",get:function(){return this.name}},{key:"isUniversal",get:function(){throw new n}},{key:"isValid",get:function(){throw new n}}]),e}(),ve=null,ge=function(e){function t(){return e.apply(this,arguments)||this}o(t,e);var n=t.prototype;return n.offsetName=function(e,t){return Ot(e,t.format,t.locale)},n.formatOffset=function(e,t){return Dt(this.offset(e),t)},n.offset=function(e){return-new Date(e).getTimezoneOffset()},n.equals=function(e){return"system"===e.type},i(t,[{key:"type",get:function(){return"system"}},{key:"name",get:function(){return(new Intl.DateTimeFormat).resolvedOptions().timeZone}},{key:"isUniversal",get:function(){return!1}},{key:"isValid",get:function(){return!0}}],[{key:"instance",get:function(){return ve=null===ve?new t:ve}}]),t}(s),pe=new Map;var ke={year:0,month:1,day:2,era:3,hour:4,minute:5,second:6};var we=new Map,c=function(n){function r(e){var t=n.call(this)||this;return t.zoneName=e,t.valid=r.isValidZone(e),t}o(r,n),r.create=function(e){var t=we.get(e);return void 0===t&&we.set(e,t=new r(e)),t},r.resetCache=function(){we.clear(),pe.clear()},r.isValidSpecifier=function(e){return this.isValidZone(e)},r.isValidZone=function(e){if(!e)return!1;try{return new Intl.DateTimeFormat("en-US",{timeZone:e}).format(),!0}catch(e){return!1}};var e=r.prototype;return e.offsetName=function(e,t){return Ot(e,t.format,t.locale,this.name)},e.formatOffset=function(e,t){return Dt(this.offset(e),t)},e.offset=function(e){var t,n,r,i,o,a,s,u;return!this.valid||(e=new Date(e),isNaN(e))?NaN:(i=this.name,void 0===(o=pe.get(i))&&(o=new Intl.DateTimeFormat("en-US",{hour12:!1,timeZone:i,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",era:"short"}),pe.set(i,o)),a=(i=(i=o).formatToParts?function(e,t){for(var n=e.formatToParts(t),r=[],i=0;ibt(i,t,n)?(r=i+1,a=1):r=i,l({weekYear:r,weekNumber:a,weekday:o},It(e))}function it(e,t,n){void 0===n&&(n=1);var r,i=e.weekYear,o=e.weekNumber,a=e.weekday,n=nt(Xe(i,1,t=void 0===t?4:t),n),s=D(i),o=7*o+a-n-7+t,a=(o<1?o+=D(r=i-1):sO.twoDigitCutoffYear?1900+e:2e3+e}function Ot(e,t,n,r){void 0===r&&(r=null);var e=new Date(e),i={hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"},r=(r&&(i.timeZone=r),l({timeZoneName:t},i)),t=new Intl.DateTimeFormat(n,r).formatToParts(e).find(function(e){return"timezonename"===e.type.toLowerCase()});return t?t.value:null}function Tt(e,t){e=parseInt(e,10),Number.isNaN(e)&&(e=0),t=parseInt(t,10)||0;return 60*e+(e<0||Object.is(e,-0)?-t:t)}function Nt(e){var t=Number(e);if("boolean"!=typeof e&&""!==e&&Number.isFinite(t))return t;throw new u("Invalid unit value "+e)}function Mt(e,t){var n,r,i={};for(n in e)h(e,n)&&null!=(r=e[n])&&(i[t(n)]=Nt(r));return i}function Dt(e,t){var n=Math.trunc(Math.abs(e/60)),r=Math.trunc(Math.abs(e%60)),i=0<=e?"+":"-";switch(t){case"short":return i+m(n,2)+":"+m(r,2);case"narrow":return i+n+(0e},t.isBefore=function(e){return!!this.isValid&&this.e<=e},t.contains=function(e){return!!this.isValid&&this.s<=e&&this.e>e},t.set=function(e){var e=void 0===e?{}:e,t=e.start,e=e.end;return this.isValid?l.fromDateTimes(t||this.s,e||this.e):this},t.splitAt=function(){var t=this;if(!this.isValid)return[];for(var e=arguments.length,n=new Array(e),r=0;r+this.e?this.e:u;o.push(l.fromDateTimes(a,u)),a=u,s+=1}return o},t.splitBy=function(e){var t=x.fromDurationLike(e);if(!this.isValid||!t.isValid||0===t.as("milliseconds"))return[];for(var n=this.s,r=1,i=[];n+this.e?this.e:o;i.push(l.fromDateTimes(n,o)),n=o,r+=1}return i},t.divideEqually=function(e){return this.isValid?this.splitBy(this.length()/e).slice(0,e):[]},t.overlaps=function(e){return this.e>e.s&&this.s=e.e},t.equals=function(e){return!(!this.isValid||!e.isValid)&&this.s.equals(e.s)&&this.e.equals(e.e)},t.intersection=function(e){var t;return this.isValid?(t=(this.s>e.s?this:e).s,(e=(this.ee.e?this:e).e,l.fromDateTimes(t,e)):this},l.merge=function(e){var e=e.sort(function(e,t){return e.s-t.s}).reduce(function(e,t){var n=e[0],e=e[1];return e?e.overlaps(t)||e.abutsStart(t)?[n,e.union(t)]:[n.concat([e]),t]:[n,t]},[[],null]),t=e[0],e=e[1];return e&&t.push(e),t},l.xor=function(e){for(var t,n=null,r=0,i=[],e=e.map(function(e){return[{time:e.s,type:"s"},{time:e.e,type:"e"}]}),o=R((t=Array.prototype).concat.apply(t,e).sort(function(e,t){return e.time-t.time}));!(a=o()).done;)var a=a.value,n=1===(r+="s"===a.type?1:-1)?a.time:(n&&+n!=+a.time&&i.push(l.fromDateTimes(n,a.time)),null);return l.merge(i)},t.difference=function(){for(var t=this,e=arguments.length,n=new Array(e),r=0;rthis.valueOf())?this:e,r?e:this,t,n),r?e.negate():e):x.invalid("created by diffing an invalid DateTime")},t.diffNow=function(e,t){return void 0===e&&(e="milliseconds"),void 0===t&&(t={}),this.diff(k.now(),e,t)},t.until=function(e){return this.isValid?Zn.fromDateTimes(this,e):this},t.hasSame=function(e,t,n){var r;return!!this.isValid&&(r=e.valueOf(),(e=this.setZone(e.zone,{keepLocalTime:!0})).startOf(t,n)<=r)&&r<=e.endOf(t,n)},t.equals=function(e){return this.isValid&&e.isValid&&this.valueOf()===e.valueOf()&&this.zone.equals(e.zone)&&this.loc.equals(e.loc)},t.toRelative=function(e){var t,n,r,i;return this.isValid?(t=(e=void 0===e?{}:e).base||k.fromObject({},{zone:this.zone}),n=e.padding?thisthis.set({month:1,day:1}).offset||this.offset>this.set({month:5}).offset)}},{key:"isInLeapYear",get:function(){return gt(this.year)}},{key:"daysInMonth",get:function(){return pt(this.year,this.month)}},{key:"daysInYear",get:function(){return this.isValid?D(this.year):NaN}},{key:"weeksInWeekYear",get:function(){return this.isValid?bt(this.weekYear):NaN}},{key:"weeksInLocalWeekYear",get:function(){return this.isValid?bt(this.localWeekYear,this.loc.getMinDaysInFirstWeek(),this.loc.getStartOfWeek()):NaN}}],[{key:"DATE_SHORT",get:function(){return G}},{key:"DATE_MED",get:function(){return $}},{key:"DATE_MED_WITH_WEEKDAY",get:function(){return B}},{key:"DATE_FULL",get:function(){return Q}},{key:"DATE_HUGE",get:function(){return K}},{key:"TIME_SIMPLE",get:function(){return X}},{key:"TIME_WITH_SECONDS",get:function(){return ee}},{key:"TIME_WITH_SHORT_OFFSET",get:function(){return te}},{key:"TIME_WITH_LONG_OFFSET",get:function(){return ne}},{key:"TIME_24_SIMPLE",get:function(){return re}},{key:"TIME_24_WITH_SECONDS",get:function(){return ie}},{key:"TIME_24_WITH_SHORT_OFFSET",get:function(){return oe}},{key:"TIME_24_WITH_LONG_OFFSET",get:function(){return ae}},{key:"DATETIME_SHORT",get:function(){return se}},{key:"DATETIME_SHORT_WITH_SECONDS",get:function(){return ue}},{key:"DATETIME_MED",get:function(){return le}},{key:"DATETIME_MED_WITH_SECONDS",get:function(){return ce}},{key:"DATETIME_MED_WITH_WEEKDAY",get:function(){return fe}},{key:"DATETIME_FULL",get:function(){return de}},{key:"DATETIME_FULL_WITH_SECONDS",get:function(){return he}},{key:"DATETIME_HUGE",get:function(){return me}},{key:"DATETIME_HUGE_WITH_SECONDS",get:function(){return ye}}]),k}(Symbol.for("nodejs.util.inspect.custom"));function Or(e){if(W.isDateTime(e))return e;if(e&&e.valueOf&&v(e.valueOf()))return W.fromJSDate(e);if(e&&"object"==typeof e)return W.fromObject(e);throw new u("Unknown datetime argument: "+e+", of type "+typeof e)}return e.DateTime=W,e.Duration=x,e.FixedOffsetZone=f,e.IANAZone=c,e.Info=Wn,e.Interval=Zn,e.InvalidZone=ze,e.Settings=O,e.SystemZone=ge,e.VERSION="3.7.2",e.Zone=s,Object.defineProperty(e,"__esModule",{value:!0}),e}({}); \ No newline at end of file diff --git a/node_modules/luxon/build/global/luxon.min.js.map b/node_modules/luxon/build/global/luxon.min.js.map new file mode 100644 index 00000000..64d99aa3 --- /dev/null +++ b/node_modules/luxon/build/global/luxon.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"build/global/luxon.js","sources":["0"],"names":["luxon","exports","_defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","arg","key","input","hint","prim","Symbol","toPrimitive","undefined","String","Number","res","call","TypeError","_createClass","Constructor","protoProps","staticProps","prototype","_extends","assign","bind","arguments","source","hasOwnProperty","apply","this","_inheritsLoose","subClass","superClass","create","_setPrototypeOf","constructor","_getPrototypeOf","o","setPrototypeOf","getPrototypeOf","__proto__","p","_construct","Parent","args","Class","Reflect","construct","sham","Proxy","Boolean","valueOf","e","a","push","instance","Function","_wrapNativeSuper","_cache","Map","toString","indexOf","has","get","set","Wrapper","value","_objectWithoutPropertiesLoose","excluded","sourceKeys","keys","_arrayLikeToArray","arr","len","arr2","Array","_createForOfIteratorHelperLoose","allowArrayLike","it","iterator","next","isArray","minLen","n","slice","name","from","test","done","LuxonError","_Error","Error","InvalidDateTimeError","_LuxonError","reason","toMessage","InvalidIntervalError","_LuxonError2","InvalidDurationError","_LuxonError3","ConflictingSpecificationError","_LuxonError4","InvalidUnitError","_LuxonError5","unit","InvalidArgumentError","_LuxonError6","ZoneIsAbstractError","_LuxonError7","s","l","DATE_SHORT","year","month","day","DATE_MED","DATE_MED_WITH_WEEKDAY","weekday","DATE_FULL","DATE_HUGE","TIME_SIMPLE","hour","minute","TIME_WITH_SECONDS","second","TIME_WITH_SHORT_OFFSET","timeZoneName","TIME_WITH_LONG_OFFSET","TIME_24_SIMPLE","hourCycle","TIME_24_WITH_SECONDS","TIME_24_WITH_SHORT_OFFSET","TIME_24_WITH_LONG_OFFSET","DATETIME_SHORT","DATETIME_SHORT_WITH_SECONDS","DATETIME_MED","DATETIME_MED_WITH_SECONDS","DATETIME_MED_WITH_WEEKDAY","DATETIME_FULL","DATETIME_FULL_WITH_SECONDS","DATETIME_HUGE","DATETIME_HUGE_WITH_SECONDS","Zone","_proto","offsetName","ts","opts","formatOffset","format","offset","equals","otherZone","singleton$1","SystemZone","_Zone","_ref","parseZoneInfo","locale","Date","getTimezoneOffset","type","Intl","DateTimeFormat","resolvedOptions","timeZone","dtfCache","typeToPos","era","ianaZoneCache","IANAZone","_this","zoneName","valid","isValidZone","zone","resetCache","clear","isValidSpecifier","adOrBc","dtf","date","fDay","adjustedHour","over","isNaN","NaN","hour12","_ref2","formatToParts","formatted","filled","_formatted$i","pos","isUndefined","parseInt","replace","fMonth","parsed","exec","asTS","objToLocalTS","Math","abs","millisecond","_excluded","_excluded2","intlLFCache","intlDTCache","getCachedDTF","locString","JSON","stringify","intlNumCache","intlRelCache","sysLocaleCache","intlResolvedOptionsCache","getCachedIntResolvedOptions","weekInfoCache","listStuff","loc","englishFn","intlFn","mode","listingMode","PolyNumberFormatter","intl","forceSimple","padTo","floor","otherOpts","intlOpts","useGrouping","minimumIntegerDigits","inf","NumberFormat","fixed","padStart","roundTo","PolyDateFormatter","dt","z","originalZone","offsetZ","gmtOffset","setZone","plus","minutes","_proto2","map","join","toJSDate","parts","part","PolyRelFormatter","isEnglish","style","hasRelative","rtf","_opts","base","cacheKeyOpts","RelativeTimeFormat","_proto3","count","formatRelativeTime","numeric","narrow","units","years","quarters","months","weeks","days","hours","seconds","lastable","isDay","isInPast","is","singular","fmtValue","lilUnits","fmtUnit","fallbackWeekSettings","firstDay","minimalDays","weekend","Locale","numbering","outputCalendar","weekSettings","specifiedLocale","_parseLocaleString","localeStr","xIndex","uIndex","substring","options","selectedStr","smaller","_options","numberingSystem","calendar","parsedLocale","parsedNumberingSystem","parsedOutputCalendar","includes","weekdaysCache","standalone","monthsCache","meridiemCache","eraCache","fastNumbersCached","fromOpts","defaultToEN","Settings","defaultLocale","defaultNumberingSystem","defaultOutputCalendar","validateWeekSettings","defaultWeekSettings","fromObject","_temp","_proto4","isActuallyEn","hasNoWeirdness","clone","alts","getOwnPropertyNames","redefaultToEN","redefaultToSystem","_this2","monthSpecialCase","startsWith","formatStr","f","ms","DateTime","utc","dtFormatter","extract","weekdays","_this3","meridiems","_this4","eras","_this5","field","matching","find","m","toLowerCase","numberFormatter","fastNumbers","relFormatter","listFormatter","ListFormat","getWeekSettings","hasLocaleWeekInfo","data","getWeekInfo","weekInfo","getStartOfWeek","getMinDaysInFirstWeek","getWeekendDays","other","singleton","FixedOffsetZone","utcInstance","parseSpecifier","r","match","signedOffset","InvalidZone","normalizeZone","defaultZone","lowered","isNumber","numberingSystems","arab","arabext","bali","beng","deva","fullwide","gujr","hanidec","khmr","knda","laoo","limb","mlym","mong","mymr","orya","tamldec","telu","thai","tibt","latn","numberingSystemsUTF16","hanidecChars","split","digitRegexCache","digitRegex","append","ns","appendCache","regex","RegExp","throwOnInvalid","now","twoDigitCutoffYear","resetCaches","cutoffYear","t","Invalid","explanation","nonLeapLadder","leapLadder","unitOutOfRange","dayOfWeek","d","UTC","setUTCFullYear","getUTCFullYear","js","getUTCDay","computeOrdinal","isLeapYear","uncomputeOrdinal","ordinal","table","month0","findIndex","isoWeekdayToLocal","isoWeekday","startOfWeek","gregorianToWeek","gregObj","minDaysInFirstWeek","weekYear","weekNumber","weeksInWeekYear","timeObject","weekToGregorian","weekData","weekdayOfJan4","yearInDays","daysInYear","_uncomputeOrdinal","gregorianToOrdinal","gregData","ordinalToGregorian","ordinalData","_uncomputeOrdinal2","usesLocalWeekValues","obj","localWeekday","localWeekNumber","localWeekYear","hasInvalidGregorianData","validYear","isInteger","validMonth","integerBetween","validDay","daysInMonth","hasInvalidTimeData","validHour","validMinute","validSecond","validMillisecond","bestBy","by","compare","reduce","best","pair","prop","settings","some","v","thing","bottom","top","padded","parseInteger","string","parseFloating","parseFloat","parseMillis","fraction","number","digits","rounding","factor","pow","ceil","trunc","round","RangeError","modMonth","x","firstWeekOffset","weekOffset","weekOffsetNext","untruncateYear","offsetFormat","modified","offHourStr","offMinuteStr","offHour","offMin","asNumber","numericValue","isFinite","normalizeObject","normalizer","u","normalized","sign","k","monthsLong","monthsShort","monthsNarrow","concat","weekdaysLong","weekdaysShort","weekdaysNarrow","erasLong","erasShort","erasNarrow","stringifyTokens","splits","tokenToString","_iterator","_step","token","literal","val","_macroTokenToFormatOpts","D","DD","DDD","DDDD","tt","ttt","tttt","T","TT","TTT","TTTT","ff","fff","ffff","F","FF","FFF","FFFF","Formatter","formatOpts","systemLoc","parseFormat","fmt","current","currentFull","bracketed","c","charAt","macroTokenToFormatOpts","formatWithSystemDefault","formatDateTime","formatDateTimeParts","formatInterval","interval","start","formatRange","end","num","signDisplay","formatDateTimeFromString","knownEnglish","useDateTimeFormatter","isOffsetFixed","allowZ","isValid","meridiem","maybeMacro","quarter","formatDurationFromString","dur","lildur","info","invertLargest","signMode","tokenToField","tokens","realTokens","found","collapsed","shiftTo","filter","durationInfo","isNegativeDuration","largestUnit","values","inversionFactor","mapped","ianaRegex","combineRegexes","_len","regexes","_key","full","combineExtractors","_len2","extractors","_key2","ex","mergedVals","mergedZone","cursor","_ex","parse","_len3","patterns","_key3","_i","_patterns","_patterns$_i","extractor","simpleParse","_len4","_key4","ret","offsetRegex","isoTimeBaseRegex","isoTimeRegex","isoTimeExtensionRegex","extractISOWeekData","extractISOOrdinalData","sqlTimeRegex","sqlTimeExtensionRegex","int","fallback","extractISOTime","milliseconds","extractISOOffset","local","fullOffset","extractIANAZone","isoTimeOnly","isoDuration","extractISODuration","maybeNegate","force","hasNegativePrefix","yearStr","monthStr","weekStr","dayStr","hourStr","minuteStr","secondStr","millisecondsStr","negativeSeconds","obsOffsets","GMT","EDT","EST","CDT","CST","MDT","MST","PDT","PST","fromStrings","weekdayStr","result","rfc2822","extractRFC2822","obsOffset","milOffset","rfc1123","rfc850","ascii","extractRFC1123Or850","extractASCII","isoYmdWithTimeExtensionRegex","isoWeekWithTimeExtensionRegex","isoOrdinalWithTimeExtensionRegex","isoTimeCombinedRegex","extractISOYmdTimeAndOffset","extractISOWeekTimeAndOffset","extractISOOrdinalDateAndTime","extractISOTimeAndOffset","extractISOTimeOnly","sqlYmdWithTimeExtensionRegex","sqlTimeCombinedRegex","extractISOTimeOffsetAndIANAZone","INVALID$2","lowOrderMatrix","casualMatrix","daysInYearAccurate","daysInMonthAccurate","accurateMatrix","orderedUnits$1","reverseUnits","reverse","clone$1","conf","conversionAccuracy","matrix","Duration","durationToMillis","vals","_vals$milliseconds","sum","normalizeValues","reduceRight","previous","conv","rollUp","previousVal","removeZeroes","newVals","_Object$entries","entries","_Object$entries$_i","_Symbol$for","config","accurate","invalid","isLuxonDuration","fromMillis","normalizeUnit","fromDurationLike","durationLike","isDuration","fromISO","text","fromISOTime","week","toFormat","fmtOpts","toHuman","showZeros","unitDisplay","listStyle","toObject","toISO","toISOTime","millis","toMillis","suppressMilliseconds","suppressSeconds","includePrefix","includeOffset","toJSON","invalidReason","duration","_i2","_orderedUnits","minus","negate","mapUnits","fn","_i3","_Object$keys","reconfigure","as","normalize","rescale","shiftToAll","built","accumulated","_i4","_orderedUnits2","ak","lastUnit","own","negated","_i5","_Object$keys2","removeZeros","v1","_i6","_orderedUnits3","v2","for","INVALID$1","Interval","isLuxonInterval","fromDateTimes","builtStart","friendlyDateTime","builtEnd","validateError","after","before","endIsValid","_split","startIsValid","_dur","isInterval","toDuration","startOf","useLocaleWeeks","diff","hasSame","isEmpty","isAfter","dateTime","isBefore","contains","splitAt","dateTimes","sorted","sort","b","results","added","splitBy","idx","divideEqually","numberOfParts","overlaps","abutsStart","abutsEnd","engulfs","intersection","union","merge","intervals","_intervals$sort$reduc","item","sofar","final","xor","_Array$prototype","currentCount","ends","time","difference","toLocaleString","toISODate","dateFormat","_temp2","_ref3$separator","separator","mapEndpoints","mapFn","Info","hasDST","proto","isUniversal","isValidIANAZone","_ref$locale","_ref$locObj","locObj","getMinimumDaysInFirstWeek","_ref2$locale","_ref2$locObj","getWeekendWeekdays","_temp3","_ref3","_ref3$locale","_ref3$locObj","_temp4","_ref4","_ref4$locale","_ref4$numberingSystem","_ref4$locObj","_ref4$outputCalendar","monthsFormat","_temp5","_ref5","_ref5$locale","_ref5$numberingSystem","_ref5$locObj","_ref5$outputCalendar","_temp6","_ref6","_ref6$locale","_ref6$numberingSystem","_ref6$locObj","weekdaysFormat","_temp7","_ref7","_ref7$locale","_ref7$numberingSystem","_ref7$locObj","_temp8","_ref8$locale","_temp9","_ref9$locale","features","relative","localeWeek","dayDiff","earlier","later","utcDayStart","toUTC","keepLocalTime","_diff","_highOrderDiffs","lowestOrder","highWater","_differs","_differs$_i","differ","remainingMillis","lowerOrderUnits","_cursor$plus","_Duration$fromMillis","MISSING_FTP","intUnit","post","deser","str","code","charCodeAt","search","_numberingSystemsUTF","min","max","spaceOrNBSP","fromCharCode","spaceOrNBSPRegExp","fixListRegex","stripInsensitivities","oneOf","strings","startIndex","groups","simple","unitForToken","one","two","three","four","six","oneOrTwo","oneToThree","oneToSix","oneToNine","twoToFour","fourToSix","partTypeStyleToTokenVal","2-digit","short","long","dayperiod","dayPeriod","hour24","dummyDateTimeCache","expandMacroTokens","formatOptsToTokens","TokenParser","handlers","disqualifyingUnit","_buildRegex","explainFromTokens","_match","matches","h","all","matchIndex","rawMatches","Z","specificOffset","q","M","G","y","S","resolvedOpts","df","isSpace","actualType","INVALID","unsupportedZone","possiblyCachedWeekData","possiblyCachedLocalWeekData","localWeekData","inst","old","fixOffset","localTS","tz","utcGuess","o2","o3","tsToObj","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","objToTS","adjustTime","oPre","millisToAdd","_fixOffset","parseDataToDateTime","parsedZone","toTechFormat","_toISODate","extended","precision","longFormat","_toISOTime","extendedZone","showSeconds","ianaName","zoneOffsetTs","defaultUnitValues","defaultWeekUnitValues","defaultOrdinalUnitValues","orderedUnits","orderedWeekUnits","orderedOrdinalUnits","weeknumber","weeksnumber","weeknumbers","weekyear","weekyears","normalizeUnitWithLocalWeeks","quickDT","offsetGuess","_objToTS","zoneOffsetGuessCache","diffRelative","calendary","lastOpts","argList","ot","_zone","isLuxonDateTime","_lastOpts","_lastOpts2","fromJSDate","zoneToUse","fromSeconds","_usesLocalWeekValues","tsNow","offsetProvis","containsOrdinal","containsGregorYear","containsGregorMD","containsGregor","definiteWeekDef","defaultValues","useWeekData","objNow","foundFirst","_iterator2","_step2","validWeek","validWeekday","validOrdinal","_objToTS2","_parseISODate","fromRFC2822","_parseRFC2822Date","trim","fromHTTP","_parseHTTPDate","fromFormat","_opts$locale","_opts$numberingSystem","localeToUse","_parseFromTokens","_explainFromTokens","fromString","fromSQL","_parseSQL","isDateTime","parseFormatForOpts","localeOpts","tokenList","expandFormat","getPossibleOffsets","ts1","ts2","c1","c2","oEarlier","oLater","o1","resolvedLocaleOptions","_Formatter$create$res","toLocal","newTS","_ref2$keepLocalTime","_ref2$keepCalendarTim","keepCalendarTime","setLocale","mixed","_usesLocalWeekValues2","settingWeekStuff","_objToTS4","_ref4$useLocaleWeeks","normalizedUnit","endOf","_this$plus","toLocaleParts","_ref5$format","_ref5$suppressSeconds","_ref5$suppressMillise","_ref5$includeOffset","_ref5$extendedZone","_ref5$precision","ext","_ref6$format","_ref6$precision","toISOWeekDate","_ref7$suppressMillise","_ref7$suppressSeconds","_ref7$includeOffset","_ref7$includePrefix","_ref7$extendedZone","_ref7$format","_ref7$precision","toRFC2822","toHTTP","toSQLDate","toSQLTime","_ref8","_ref8$includeOffset","_ref8$includeZone","includeZone","_ref8$includeOffsetSp","includeOffsetSpace","toSQL","toSeconds","toUnixInteger","toBSON","includeConfig","otherDateTime","otherIsLater","durOpts","diffed","diffNow","until","inputMs","adjustedToZone","toRelative","padding","toRelativeCalendar","every","fromFormatExplain","_options$locale","_options$numberingSys","fromStringExplain","buildFormatParser","_options2","_options2$locale","_options2$numberingSy","fromFormatParser","formatParser","_opts2","_opts2$locale","_opts2$numberingSyste","_formatParser$explain","dateTimeish","VERSION"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/luxon/build/node/luxon.js b/node_modules/luxon/build/node/luxon.js new file mode 100644 index 00000000..a8ee891f --- /dev/null +++ b/node_modules/luxon/build/node/luxon.js @@ -0,0 +1,7792 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +// these aren't really private, but nor are they really useful to document + +/** + * @private + */ +class LuxonError extends Error {} + +/** + * @private + */ +class InvalidDateTimeError extends LuxonError { + constructor(reason) { + super(`Invalid DateTime: ${reason.toMessage()}`); + } +} + +/** + * @private + */ +class InvalidIntervalError extends LuxonError { + constructor(reason) { + super(`Invalid Interval: ${reason.toMessage()}`); + } +} + +/** + * @private + */ +class InvalidDurationError extends LuxonError { + constructor(reason) { + super(`Invalid Duration: ${reason.toMessage()}`); + } +} + +/** + * @private + */ +class ConflictingSpecificationError extends LuxonError {} + +/** + * @private + */ +class InvalidUnitError extends LuxonError { + constructor(unit) { + super(`Invalid unit ${unit}`); + } +} + +/** + * @private + */ +class InvalidArgumentError extends LuxonError {} + +/** + * @private + */ +class ZoneIsAbstractError extends LuxonError { + constructor() { + super("Zone is an abstract class"); + } +} + +/** + * @private + */ + +const n = "numeric", + s = "short", + l = "long"; +const DATE_SHORT = { + year: n, + month: n, + day: n +}; +const DATE_MED = { + year: n, + month: s, + day: n +}; +const DATE_MED_WITH_WEEKDAY = { + year: n, + month: s, + day: n, + weekday: s +}; +const DATE_FULL = { + year: n, + month: l, + day: n +}; +const DATE_HUGE = { + year: n, + month: l, + day: n, + weekday: l +}; +const TIME_SIMPLE = { + hour: n, + minute: n +}; +const TIME_WITH_SECONDS = { + hour: n, + minute: n, + second: n +}; +const TIME_WITH_SHORT_OFFSET = { + hour: n, + minute: n, + second: n, + timeZoneName: s +}; +const TIME_WITH_LONG_OFFSET = { + hour: n, + minute: n, + second: n, + timeZoneName: l +}; +const TIME_24_SIMPLE = { + hour: n, + minute: n, + hourCycle: "h23" +}; +const TIME_24_WITH_SECONDS = { + hour: n, + minute: n, + second: n, + hourCycle: "h23" +}; +const TIME_24_WITH_SHORT_OFFSET = { + hour: n, + minute: n, + second: n, + hourCycle: "h23", + timeZoneName: s +}; +const TIME_24_WITH_LONG_OFFSET = { + hour: n, + minute: n, + second: n, + hourCycle: "h23", + timeZoneName: l +}; +const DATETIME_SHORT = { + year: n, + month: n, + day: n, + hour: n, + minute: n +}; +const DATETIME_SHORT_WITH_SECONDS = { + year: n, + month: n, + day: n, + hour: n, + minute: n, + second: n +}; +const DATETIME_MED = { + year: n, + month: s, + day: n, + hour: n, + minute: n +}; +const DATETIME_MED_WITH_SECONDS = { + year: n, + month: s, + day: n, + hour: n, + minute: n, + second: n +}; +const DATETIME_MED_WITH_WEEKDAY = { + year: n, + month: s, + day: n, + weekday: s, + hour: n, + minute: n +}; +const DATETIME_FULL = { + year: n, + month: l, + day: n, + hour: n, + minute: n, + timeZoneName: s +}; +const DATETIME_FULL_WITH_SECONDS = { + year: n, + month: l, + day: n, + hour: n, + minute: n, + second: n, + timeZoneName: s +}; +const DATETIME_HUGE = { + year: n, + month: l, + day: n, + weekday: l, + hour: n, + minute: n, + timeZoneName: l +}; +const DATETIME_HUGE_WITH_SECONDS = { + year: n, + month: l, + day: n, + weekday: l, + hour: n, + minute: n, + second: n, + timeZoneName: l +}; + +/** + * @interface + */ +class Zone { + /** + * The type of zone + * @abstract + * @type {string} + */ + get type() { + throw new ZoneIsAbstractError(); + } + + /** + * The name of this zone. + * @abstract + * @type {string} + */ + get name() { + throw new ZoneIsAbstractError(); + } + + /** + * The IANA name of this zone. + * Defaults to `name` if not overwritten by a subclass. + * @abstract + * @type {string} + */ + get ianaName() { + return this.name; + } + + /** + * Returns whether the offset is known to be fixed for the whole year. + * @abstract + * @type {boolean} + */ + get isUniversal() { + throw new ZoneIsAbstractError(); + } + + /** + * Returns the offset's common name (such as EST) at the specified timestamp + * @abstract + * @param {number} ts - Epoch milliseconds for which to get the name + * @param {Object} opts - Options to affect the format + * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'. + * @param {string} opts.locale - What locale to return the offset name in. + * @return {string} + */ + offsetName(ts, opts) { + throw new ZoneIsAbstractError(); + } + + /** + * Returns the offset's value as a string + * @abstract + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */ + formatOffset(ts, format) { + throw new ZoneIsAbstractError(); + } + + /** + * Return the offset in minutes for this zone at the specified timestamp. + * @abstract + * @param {number} ts - Epoch milliseconds for which to compute the offset + * @return {number} + */ + offset(ts) { + throw new ZoneIsAbstractError(); + } + + /** + * Return whether this Zone is equal to another zone + * @abstract + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */ + equals(otherZone) { + throw new ZoneIsAbstractError(); + } + + /** + * Return whether this Zone is valid. + * @abstract + * @type {boolean} + */ + get isValid() { + throw new ZoneIsAbstractError(); + } +} + +let singleton$1 = null; + +/** + * Represents the local zone for this JavaScript environment. + * @implements {Zone} + */ +class SystemZone extends Zone { + /** + * Get a singleton instance of the local zone + * @return {SystemZone} + */ + static get instance() { + if (singleton$1 === null) { + singleton$1 = new SystemZone(); + } + return singleton$1; + } + + /** @override **/ + get type() { + return "system"; + } + + /** @override **/ + get name() { + return new Intl.DateTimeFormat().resolvedOptions().timeZone; + } + + /** @override **/ + get isUniversal() { + return false; + } + + /** @override **/ + offsetName(ts, { + format, + locale + }) { + return parseZoneInfo(ts, format, locale); + } + + /** @override **/ + formatOffset(ts, format) { + return formatOffset(this.offset(ts), format); + } + + /** @override **/ + offset(ts) { + return -new Date(ts).getTimezoneOffset(); + } + + /** @override **/ + equals(otherZone) { + return otherZone.type === "system"; + } + + /** @override **/ + get isValid() { + return true; + } +} + +const dtfCache = new Map(); +function makeDTF(zoneName) { + let dtf = dtfCache.get(zoneName); + if (dtf === undefined) { + dtf = new Intl.DateTimeFormat("en-US", { + hour12: false, + timeZone: zoneName, + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + era: "short" + }); + dtfCache.set(zoneName, dtf); + } + return dtf; +} +const typeToPos = { + year: 0, + month: 1, + day: 2, + era: 3, + hour: 4, + minute: 5, + second: 6 +}; +function hackyOffset(dtf, date) { + const formatted = dtf.format(date).replace(/\u200E/g, ""), + parsed = /(\d+)\/(\d+)\/(\d+) (AD|BC),? (\d+):(\d+):(\d+)/.exec(formatted), + [, fMonth, fDay, fYear, fadOrBc, fHour, fMinute, fSecond] = parsed; + return [fYear, fMonth, fDay, fadOrBc, fHour, fMinute, fSecond]; +} +function partsOffset(dtf, date) { + const formatted = dtf.formatToParts(date); + const filled = []; + for (let i = 0; i < formatted.length; i++) { + const { + type, + value + } = formatted[i]; + const pos = typeToPos[type]; + if (type === "era") { + filled[pos] = value; + } else if (!isUndefined(pos)) { + filled[pos] = parseInt(value, 10); + } + } + return filled; +} +const ianaZoneCache = new Map(); +/** + * A zone identified by an IANA identifier, like America/New_York + * @implements {Zone} + */ +class IANAZone extends Zone { + /** + * @param {string} name - Zone name + * @return {IANAZone} + */ + static create(name) { + let zone = ianaZoneCache.get(name); + if (zone === undefined) { + ianaZoneCache.set(name, zone = new IANAZone(name)); + } + return zone; + } + + /** + * Reset local caches. Should only be necessary in testing scenarios. + * @return {void} + */ + static resetCache() { + ianaZoneCache.clear(); + dtfCache.clear(); + } + + /** + * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that. + * @param {string} s - The string to check validity on + * @example IANAZone.isValidSpecifier("America/New_York") //=> true + * @example IANAZone.isValidSpecifier("Sport~~blorp") //=> false + * @deprecated For backward compatibility, this forwards to isValidZone, better use `isValidZone()` directly instead. + * @return {boolean} + */ + static isValidSpecifier(s) { + return this.isValidZone(s); + } + + /** + * Returns whether the provided string identifies a real zone + * @param {string} zone - The string to check + * @example IANAZone.isValidZone("America/New_York") //=> true + * @example IANAZone.isValidZone("Fantasia/Castle") //=> false + * @example IANAZone.isValidZone("Sport~~blorp") //=> false + * @return {boolean} + */ + static isValidZone(zone) { + if (!zone) { + return false; + } + try { + new Intl.DateTimeFormat("en-US", { + timeZone: zone + }).format(); + return true; + } catch (e) { + return false; + } + } + constructor(name) { + super(); + /** @private **/ + this.zoneName = name; + /** @private **/ + this.valid = IANAZone.isValidZone(name); + } + + /** + * The type of zone. `iana` for all instances of `IANAZone`. + * @override + * @type {string} + */ + get type() { + return "iana"; + } + + /** + * The name of this zone (i.e. the IANA zone name). + * @override + * @type {string} + */ + get name() { + return this.zoneName; + } + + /** + * Returns whether the offset is known to be fixed for the whole year: + * Always returns false for all IANA zones. + * @override + * @type {boolean} + */ + get isUniversal() { + return false; + } + + /** + * Returns the offset's common name (such as EST) at the specified timestamp + * @override + * @param {number} ts - Epoch milliseconds for which to get the name + * @param {Object} opts - Options to affect the format + * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'. + * @param {string} opts.locale - What locale to return the offset name in. + * @return {string} + */ + offsetName(ts, { + format, + locale + }) { + return parseZoneInfo(ts, format, locale, this.name); + } + + /** + * Returns the offset's value as a string + * @override + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */ + formatOffset(ts, format) { + return formatOffset(this.offset(ts), format); + } + + /** + * Return the offset in minutes for this zone at the specified timestamp. + * @override + * @param {number} ts - Epoch milliseconds for which to compute the offset + * @return {number} + */ + offset(ts) { + if (!this.valid) return NaN; + const date = new Date(ts); + if (isNaN(date)) return NaN; + const dtf = makeDTF(this.name); + let [year, month, day, adOrBc, hour, minute, second] = dtf.formatToParts ? partsOffset(dtf, date) : hackyOffset(dtf, date); + if (adOrBc === "BC") { + year = -Math.abs(year) + 1; + } + + // because we're using hour12 and https://bugs.chromium.org/p/chromium/issues/detail?id=1025564&can=2&q=%2224%3A00%22%20datetimeformat + const adjustedHour = hour === 24 ? 0 : hour; + const asUTC = objToLocalTS({ + year, + month, + day, + hour: adjustedHour, + minute, + second, + millisecond: 0 + }); + let asTS = +date; + const over = asTS % 1000; + asTS -= over >= 0 ? over : 1000 + over; + return (asUTC - asTS) / (60 * 1000); + } + + /** + * Return whether this Zone is equal to another zone + * @override + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */ + equals(otherZone) { + return otherZone.type === "iana" && otherZone.name === this.name; + } + + /** + * Return whether this Zone is valid. + * @override + * @type {boolean} + */ + get isValid() { + return this.valid; + } +} + +// todo - remap caching + +let intlLFCache = {}; +function getCachedLF(locString, opts = {}) { + const key = JSON.stringify([locString, opts]); + let dtf = intlLFCache[key]; + if (!dtf) { + dtf = new Intl.ListFormat(locString, opts); + intlLFCache[key] = dtf; + } + return dtf; +} +const intlDTCache = new Map(); +function getCachedDTF(locString, opts = {}) { + const key = JSON.stringify([locString, opts]); + let dtf = intlDTCache.get(key); + if (dtf === undefined) { + dtf = new Intl.DateTimeFormat(locString, opts); + intlDTCache.set(key, dtf); + } + return dtf; +} +const intlNumCache = new Map(); +function getCachedINF(locString, opts = {}) { + const key = JSON.stringify([locString, opts]); + let inf = intlNumCache.get(key); + if (inf === undefined) { + inf = new Intl.NumberFormat(locString, opts); + intlNumCache.set(key, inf); + } + return inf; +} +const intlRelCache = new Map(); +function getCachedRTF(locString, opts = {}) { + const { + base, + ...cacheKeyOpts + } = opts; // exclude `base` from the options + const key = JSON.stringify([locString, cacheKeyOpts]); + let inf = intlRelCache.get(key); + if (inf === undefined) { + inf = new Intl.RelativeTimeFormat(locString, opts); + intlRelCache.set(key, inf); + } + return inf; +} +let sysLocaleCache = null; +function systemLocale() { + if (sysLocaleCache) { + return sysLocaleCache; + } else { + sysLocaleCache = new Intl.DateTimeFormat().resolvedOptions().locale; + return sysLocaleCache; + } +} +const intlResolvedOptionsCache = new Map(); +function getCachedIntResolvedOptions(locString) { + let opts = intlResolvedOptionsCache.get(locString); + if (opts === undefined) { + opts = new Intl.DateTimeFormat(locString).resolvedOptions(); + intlResolvedOptionsCache.set(locString, opts); + } + return opts; +} +const weekInfoCache = new Map(); +function getCachedWeekInfo(locString) { + let data = weekInfoCache.get(locString); + if (!data) { + const locale = new Intl.Locale(locString); + // browsers currently implement this as a property, but spec says it should be a getter function + data = "getWeekInfo" in locale ? locale.getWeekInfo() : locale.weekInfo; + // minimalDays was removed from WeekInfo: https://github.com/tc39/proposal-intl-locale-info/issues/86 + if (!("minimalDays" in data)) { + data = { + ...fallbackWeekSettings, + ...data + }; + } + weekInfoCache.set(locString, data); + } + return data; +} +function parseLocaleString(localeStr) { + // I really want to avoid writing a BCP 47 parser + // see, e.g. https://github.com/wooorm/bcp-47 + // Instead, we'll do this: + + // a) if the string has no -u extensions, just leave it alone + // b) if it does, use Intl to resolve everything + // c) if Intl fails, try again without the -u + + // private subtags and unicode subtags have ordering requirements, + // and we're not properly parsing this, so just strip out the + // private ones if they exist. + const xIndex = localeStr.indexOf("-x-"); + if (xIndex !== -1) { + localeStr = localeStr.substring(0, xIndex); + } + const uIndex = localeStr.indexOf("-u-"); + if (uIndex === -1) { + return [localeStr]; + } else { + let options; + let selectedStr; + try { + options = getCachedDTF(localeStr).resolvedOptions(); + selectedStr = localeStr; + } catch (e) { + const smaller = localeStr.substring(0, uIndex); + options = getCachedDTF(smaller).resolvedOptions(); + selectedStr = smaller; + } + const { + numberingSystem, + calendar + } = options; + return [selectedStr, numberingSystem, calendar]; + } +} +function intlConfigString(localeStr, numberingSystem, outputCalendar) { + if (outputCalendar || numberingSystem) { + if (!localeStr.includes("-u-")) { + localeStr += "-u"; + } + if (outputCalendar) { + localeStr += `-ca-${outputCalendar}`; + } + if (numberingSystem) { + localeStr += `-nu-${numberingSystem}`; + } + return localeStr; + } else { + return localeStr; + } +} +function mapMonths(f) { + const ms = []; + for (let i = 1; i <= 12; i++) { + const dt = DateTime.utc(2009, i, 1); + ms.push(f(dt)); + } + return ms; +} +function mapWeekdays(f) { + const ms = []; + for (let i = 1; i <= 7; i++) { + const dt = DateTime.utc(2016, 11, 13 + i); + ms.push(f(dt)); + } + return ms; +} +function listStuff(loc, length, englishFn, intlFn) { + const mode = loc.listingMode(); + if (mode === "error") { + return null; + } else if (mode === "en") { + return englishFn(length); + } else { + return intlFn(length); + } +} +function supportsFastNumbers(loc) { + if (loc.numberingSystem && loc.numberingSystem !== "latn") { + return false; + } else { + return loc.numberingSystem === "latn" || !loc.locale || loc.locale.startsWith("en") || getCachedIntResolvedOptions(loc.locale).numberingSystem === "latn"; + } +} + +/** + * @private + */ + +class PolyNumberFormatter { + constructor(intl, forceSimple, opts) { + this.padTo = opts.padTo || 0; + this.floor = opts.floor || false; + const { + padTo, + floor, + ...otherOpts + } = opts; + if (!forceSimple || Object.keys(otherOpts).length > 0) { + const intlOpts = { + useGrouping: false, + ...opts + }; + if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo; + this.inf = getCachedINF(intl, intlOpts); + } + } + format(i) { + if (this.inf) { + const fixed = this.floor ? Math.floor(i) : i; + return this.inf.format(fixed); + } else { + // to match the browser's numberformatter defaults + const fixed = this.floor ? Math.floor(i) : roundTo(i, 3); + return padStart(fixed, this.padTo); + } + } +} + +/** + * @private + */ + +class PolyDateFormatter { + constructor(dt, intl, opts) { + this.opts = opts; + this.originalZone = undefined; + let z = undefined; + if (this.opts.timeZone) { + // Don't apply any workarounds if a timeZone is explicitly provided in opts + this.dt = dt; + } else if (dt.zone.type === "fixed") { + // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like. + // That is why fixed-offset TZ is set to that unless it is: + // 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT. + // 2. Unsupported by the browser: + // - some do not support Etc/ + // - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata + const gmtOffset = -1 * (dt.offset / 60); + const offsetZ = gmtOffset >= 0 ? `Etc/GMT+${gmtOffset}` : `Etc/GMT${gmtOffset}`; + if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) { + z = offsetZ; + this.dt = dt; + } else { + // Not all fixed-offset zones like Etc/+4:30 are present in tzdata so + // we manually apply the offset and substitute the zone as needed. + z = "UTC"; + this.dt = dt.offset === 0 ? dt : dt.setZone("UTC").plus({ + minutes: dt.offset + }); + this.originalZone = dt.zone; + } + } else if (dt.zone.type === "system") { + this.dt = dt; + } else if (dt.zone.type === "iana") { + this.dt = dt; + z = dt.zone.name; + } else { + // Custom zones can have any offset / offsetName so we just manually + // apply the offset and substitute the zone as needed. + z = "UTC"; + this.dt = dt.setZone("UTC").plus({ + minutes: dt.offset + }); + this.originalZone = dt.zone; + } + const intlOpts = { + ...this.opts + }; + intlOpts.timeZone = intlOpts.timeZone || z; + this.dtf = getCachedDTF(intl, intlOpts); + } + format() { + if (this.originalZone) { + // If we have to substitute in the actual zone name, we have to use + // formatToParts so that the timezone can be replaced. + return this.formatToParts().map(({ + value + }) => value).join(""); + } + return this.dtf.format(this.dt.toJSDate()); + } + formatToParts() { + const parts = this.dtf.formatToParts(this.dt.toJSDate()); + if (this.originalZone) { + return parts.map(part => { + if (part.type === "timeZoneName") { + const offsetName = this.originalZone.offsetName(this.dt.ts, { + locale: this.dt.locale, + format: this.opts.timeZoneName + }); + return { + ...part, + value: offsetName + }; + } else { + return part; + } + }); + } + return parts; + } + resolvedOptions() { + return this.dtf.resolvedOptions(); + } +} + +/** + * @private + */ +class PolyRelFormatter { + constructor(intl, isEnglish, opts) { + this.opts = { + style: "long", + ...opts + }; + if (!isEnglish && hasRelative()) { + this.rtf = getCachedRTF(intl, opts); + } + } + format(count, unit) { + if (this.rtf) { + return this.rtf.format(count, unit); + } else { + return formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== "long"); + } + } + formatToParts(count, unit) { + if (this.rtf) { + return this.rtf.formatToParts(count, unit); + } else { + return []; + } + } +} +const fallbackWeekSettings = { + firstDay: 1, + minimalDays: 4, + weekend: [6, 7] +}; + +/** + * @private + */ +class Locale { + static fromOpts(opts) { + return Locale.create(opts.locale, opts.numberingSystem, opts.outputCalendar, opts.weekSettings, opts.defaultToEN); + } + static create(locale, numberingSystem, outputCalendar, weekSettings, defaultToEN = false) { + const specifiedLocale = locale || Settings.defaultLocale; + // the system locale is useful for human-readable strings but annoying for parsing/formatting known formats + const localeR = specifiedLocale || (defaultToEN ? "en-US" : systemLocale()); + const numberingSystemR = numberingSystem || Settings.defaultNumberingSystem; + const outputCalendarR = outputCalendar || Settings.defaultOutputCalendar; + const weekSettingsR = validateWeekSettings(weekSettings) || Settings.defaultWeekSettings; + return new Locale(localeR, numberingSystemR, outputCalendarR, weekSettingsR, specifiedLocale); + } + static resetCache() { + sysLocaleCache = null; + intlDTCache.clear(); + intlNumCache.clear(); + intlRelCache.clear(); + intlResolvedOptionsCache.clear(); + weekInfoCache.clear(); + } + static fromObject({ + locale, + numberingSystem, + outputCalendar, + weekSettings + } = {}) { + return Locale.create(locale, numberingSystem, outputCalendar, weekSettings); + } + constructor(locale, numbering, outputCalendar, weekSettings, specifiedLocale) { + const [parsedLocale, parsedNumberingSystem, parsedOutputCalendar] = parseLocaleString(locale); + this.locale = parsedLocale; + this.numberingSystem = numbering || parsedNumberingSystem || null; + this.outputCalendar = outputCalendar || parsedOutputCalendar || null; + this.weekSettings = weekSettings; + this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar); + this.weekdaysCache = { + format: {}, + standalone: {} + }; + this.monthsCache = { + format: {}, + standalone: {} + }; + this.meridiemCache = null; + this.eraCache = {}; + this.specifiedLocale = specifiedLocale; + this.fastNumbersCached = null; + } + get fastNumbers() { + if (this.fastNumbersCached == null) { + this.fastNumbersCached = supportsFastNumbers(this); + } + return this.fastNumbersCached; + } + listingMode() { + const isActuallyEn = this.isEnglish(); + const hasNoWeirdness = (this.numberingSystem === null || this.numberingSystem === "latn") && (this.outputCalendar === null || this.outputCalendar === "gregory"); + return isActuallyEn && hasNoWeirdness ? "en" : "intl"; + } + clone(alts) { + if (!alts || Object.getOwnPropertyNames(alts).length === 0) { + return this; + } else { + return Locale.create(alts.locale || this.specifiedLocale, alts.numberingSystem || this.numberingSystem, alts.outputCalendar || this.outputCalendar, validateWeekSettings(alts.weekSettings) || this.weekSettings, alts.defaultToEN || false); + } + } + redefaultToEN(alts = {}) { + return this.clone({ + ...alts, + defaultToEN: true + }); + } + redefaultToSystem(alts = {}) { + return this.clone({ + ...alts, + defaultToEN: false + }); + } + months(length, format = false) { + return listStuff(this, length, months, () => { + // Workaround for "ja" locale: formatToParts does not label all parts of the month + // as "month" and for this locale there is no difference between "format" and "non-format". + // As such, just use format() instead of formatToParts() and take the whole string + const monthSpecialCase = this.intl === "ja" || this.intl.startsWith("ja-"); + format &= !monthSpecialCase; + const intl = format ? { + month: length, + day: "numeric" + } : { + month: length + }, + formatStr = format ? "format" : "standalone"; + if (!this.monthsCache[formatStr][length]) { + const mapper = !monthSpecialCase ? dt => this.extract(dt, intl, "month") : dt => this.dtFormatter(dt, intl).format(); + this.monthsCache[formatStr][length] = mapMonths(mapper); + } + return this.monthsCache[formatStr][length]; + }); + } + weekdays(length, format = false) { + return listStuff(this, length, weekdays, () => { + const intl = format ? { + weekday: length, + year: "numeric", + month: "long", + day: "numeric" + } : { + weekday: length + }, + formatStr = format ? "format" : "standalone"; + if (!this.weekdaysCache[formatStr][length]) { + this.weekdaysCache[formatStr][length] = mapWeekdays(dt => this.extract(dt, intl, "weekday")); + } + return this.weekdaysCache[formatStr][length]; + }); + } + meridiems() { + return listStuff(this, undefined, () => meridiems, () => { + // In theory there could be aribitrary day periods. We're gonna assume there are exactly two + // for AM and PM. This is probably wrong, but it's makes parsing way easier. + if (!this.meridiemCache) { + const intl = { + hour: "numeric", + hourCycle: "h12" + }; + this.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map(dt => this.extract(dt, intl, "dayperiod")); + } + return this.meridiemCache; + }); + } + eras(length) { + return listStuff(this, length, eras, () => { + const intl = { + era: length + }; + + // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates + // to definitely enumerate them. + if (!this.eraCache[length]) { + this.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map(dt => this.extract(dt, intl, "era")); + } + return this.eraCache[length]; + }); + } + extract(dt, intlOpts, field) { + const df = this.dtFormatter(dt, intlOpts), + results = df.formatToParts(), + matching = results.find(m => m.type.toLowerCase() === field); + return matching ? matching.value : null; + } + numberFormatter(opts = {}) { + // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave) + // (in contrast, the rest of the condition is used heavily) + return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts); + } + dtFormatter(dt, intlOpts = {}) { + return new PolyDateFormatter(dt, this.intl, intlOpts); + } + relFormatter(opts = {}) { + return new PolyRelFormatter(this.intl, this.isEnglish(), opts); + } + listFormatter(opts = {}) { + return getCachedLF(this.intl, opts); + } + isEnglish() { + return this.locale === "en" || this.locale.toLowerCase() === "en-us" || getCachedIntResolvedOptions(this.intl).locale.startsWith("en-us"); + } + getWeekSettings() { + if (this.weekSettings) { + return this.weekSettings; + } else if (!hasLocaleWeekInfo()) { + return fallbackWeekSettings; + } else { + return getCachedWeekInfo(this.locale); + } + } + getStartOfWeek() { + return this.getWeekSettings().firstDay; + } + getMinDaysInFirstWeek() { + return this.getWeekSettings().minimalDays; + } + getWeekendDays() { + return this.getWeekSettings().weekend; + } + equals(other) { + return this.locale === other.locale && this.numberingSystem === other.numberingSystem && this.outputCalendar === other.outputCalendar; + } + toString() { + return `Locale(${this.locale}, ${this.numberingSystem}, ${this.outputCalendar})`; + } +} + +let singleton = null; + +/** + * A zone with a fixed offset (meaning no DST) + * @implements {Zone} + */ +class FixedOffsetZone extends Zone { + /** + * Get a singleton instance of UTC + * @return {FixedOffsetZone} + */ + static get utcInstance() { + if (singleton === null) { + singleton = new FixedOffsetZone(0); + } + return singleton; + } + + /** + * Get an instance with a specified offset + * @param {number} offset - The offset in minutes + * @return {FixedOffsetZone} + */ + static instance(offset) { + return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset); + } + + /** + * Get an instance of FixedOffsetZone from a UTC offset string, like "UTC+6" + * @param {string} s - The offset string to parse + * @example FixedOffsetZone.parseSpecifier("UTC+6") + * @example FixedOffsetZone.parseSpecifier("UTC+06") + * @example FixedOffsetZone.parseSpecifier("UTC-6:00") + * @return {FixedOffsetZone} + */ + static parseSpecifier(s) { + if (s) { + const r = s.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i); + if (r) { + return new FixedOffsetZone(signedOffset(r[1], r[2])); + } + } + return null; + } + constructor(offset) { + super(); + /** @private **/ + this.fixed = offset; + } + + /** + * The type of zone. `fixed` for all instances of `FixedOffsetZone`. + * @override + * @type {string} + */ + get type() { + return "fixed"; + } + + /** + * The name of this zone. + * All fixed zones' names always start with "UTC" (plus optional offset) + * @override + * @type {string} + */ + get name() { + return this.fixed === 0 ? "UTC" : `UTC${formatOffset(this.fixed, "narrow")}`; + } + + /** + * The IANA name of this zone, i.e. `Etc/UTC` or `Etc/GMT+/-nn` + * + * @override + * @type {string} + */ + get ianaName() { + if (this.fixed === 0) { + return "Etc/UTC"; + } else { + return `Etc/GMT${formatOffset(-this.fixed, "narrow")}`; + } + } + + /** + * Returns the offset's common name at the specified timestamp. + * + * For fixed offset zones this equals to the zone name. + * @override + */ + offsetName() { + return this.name; + } + + /** + * Returns the offset's value as a string + * @override + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */ + formatOffset(ts, format) { + return formatOffset(this.fixed, format); + } + + /** + * Returns whether the offset is known to be fixed for the whole year: + * Always returns true for all fixed offset zones. + * @override + * @type {boolean} + */ + get isUniversal() { + return true; + } + + /** + * Return the offset in minutes for this zone at the specified timestamp. + * + * For fixed offset zones, this is constant and does not depend on a timestamp. + * @override + * @return {number} + */ + offset() { + return this.fixed; + } + + /** + * Return whether this Zone is equal to another zone (i.e. also fixed and same offset) + * @override + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */ + equals(otherZone) { + return otherZone.type === "fixed" && otherZone.fixed === this.fixed; + } + + /** + * Return whether this Zone is valid: + * All fixed offset zones are valid. + * @override + * @type {boolean} + */ + get isValid() { + return true; + } +} + +/** + * A zone that failed to parse. You should never need to instantiate this. + * @implements {Zone} + */ +class InvalidZone extends Zone { + constructor(zoneName) { + super(); + /** @private */ + this.zoneName = zoneName; + } + + /** @override **/ + get type() { + return "invalid"; + } + + /** @override **/ + get name() { + return this.zoneName; + } + + /** @override **/ + get isUniversal() { + return false; + } + + /** @override **/ + offsetName() { + return null; + } + + /** @override **/ + formatOffset() { + return ""; + } + + /** @override **/ + offset() { + return NaN; + } + + /** @override **/ + equals() { + return false; + } + + /** @override **/ + get isValid() { + return false; + } +} + +/** + * @private + */ +function normalizeZone(input, defaultZone) { + if (isUndefined(input) || input === null) { + return defaultZone; + } else if (input instanceof Zone) { + return input; + } else if (isString(input)) { + const lowered = input.toLowerCase(); + if (lowered === "default") return defaultZone;else if (lowered === "local" || lowered === "system") return SystemZone.instance;else if (lowered === "utc" || lowered === "gmt") return FixedOffsetZone.utcInstance;else return FixedOffsetZone.parseSpecifier(lowered) || IANAZone.create(input); + } else if (isNumber(input)) { + return FixedOffsetZone.instance(input); + } else if (typeof input === "object" && "offset" in input && typeof input.offset === "function") { + // This is dumb, but the instanceof check above doesn't seem to really work + // so we're duck checking it + return input; + } else { + return new InvalidZone(input); + } +} + +const numberingSystems = { + arab: "[\u0660-\u0669]", + arabext: "[\u06F0-\u06F9]", + bali: "[\u1B50-\u1B59]", + beng: "[\u09E6-\u09EF]", + deva: "[\u0966-\u096F]", + fullwide: "[\uFF10-\uFF19]", + gujr: "[\u0AE6-\u0AEF]", + hanidec: "[〇|一|二|三|四|五|六|七|八|九]", + khmr: "[\u17E0-\u17E9]", + knda: "[\u0CE6-\u0CEF]", + laoo: "[\u0ED0-\u0ED9]", + limb: "[\u1946-\u194F]", + mlym: "[\u0D66-\u0D6F]", + mong: "[\u1810-\u1819]", + mymr: "[\u1040-\u1049]", + orya: "[\u0B66-\u0B6F]", + tamldec: "[\u0BE6-\u0BEF]", + telu: "[\u0C66-\u0C6F]", + thai: "[\u0E50-\u0E59]", + tibt: "[\u0F20-\u0F29]", + latn: "\\d" +}; +const numberingSystemsUTF16 = { + arab: [1632, 1641], + arabext: [1776, 1785], + bali: [6992, 7001], + beng: [2534, 2543], + deva: [2406, 2415], + fullwide: [65296, 65303], + gujr: [2790, 2799], + khmr: [6112, 6121], + knda: [3302, 3311], + laoo: [3792, 3801], + limb: [6470, 6479], + mlym: [3430, 3439], + mong: [6160, 6169], + mymr: [4160, 4169], + orya: [2918, 2927], + tamldec: [3046, 3055], + telu: [3174, 3183], + thai: [3664, 3673], + tibt: [3872, 3881] +}; +const hanidecChars = numberingSystems.hanidec.replace(/[\[|\]]/g, "").split(""); +function parseDigits(str) { + let value = parseInt(str, 10); + if (isNaN(value)) { + value = ""; + for (let i = 0; i < str.length; i++) { + const code = str.charCodeAt(i); + if (str[i].search(numberingSystems.hanidec) !== -1) { + value += hanidecChars.indexOf(str[i]); + } else { + for (const key in numberingSystemsUTF16) { + const [min, max] = numberingSystemsUTF16[key]; + if (code >= min && code <= max) { + value += code - min; + } + } + } + } + return parseInt(value, 10); + } else { + return value; + } +} + +// cache of {numberingSystem: {append: regex}} +const digitRegexCache = new Map(); +function resetDigitRegexCache() { + digitRegexCache.clear(); +} +function digitRegex({ + numberingSystem +}, append = "") { + const ns = numberingSystem || "latn"; + let appendCache = digitRegexCache.get(ns); + if (appendCache === undefined) { + appendCache = new Map(); + digitRegexCache.set(ns, appendCache); + } + let regex = appendCache.get(append); + if (regex === undefined) { + regex = new RegExp(`${numberingSystems[ns]}${append}`); + appendCache.set(append, regex); + } + return regex; +} + +let now = () => Date.now(), + defaultZone = "system", + defaultLocale = null, + defaultNumberingSystem = null, + defaultOutputCalendar = null, + twoDigitCutoffYear = 60, + throwOnInvalid, + defaultWeekSettings = null; + +/** + * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here. + */ +class Settings { + /** + * Get the callback for returning the current timestamp. + * @type {function} + */ + static get now() { + return now; + } + + /** + * Set the callback for returning the current timestamp. + * The function should return a number, which will be interpreted as an Epoch millisecond count + * @type {function} + * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future + * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time + */ + static set now(n) { + now = n; + } + + /** + * Set the default time zone to create DateTimes in. Does not affect existing instances. + * Use the value "system" to reset this value to the system's time zone. + * @type {string} + */ + static set defaultZone(zone) { + defaultZone = zone; + } + + /** + * Get the default time zone object currently used to create DateTimes. Does not affect existing instances. + * The default value is the system's time zone (the one set on the machine that runs this code). + * @type {Zone} + */ + static get defaultZone() { + return normalizeZone(defaultZone, SystemZone.instance); + } + + /** + * Get the default locale to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + static get defaultLocale() { + return defaultLocale; + } + + /** + * Set the default locale to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + static set defaultLocale(locale) { + defaultLocale = locale; + } + + /** + * Get the default numbering system to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + static get defaultNumberingSystem() { + return defaultNumberingSystem; + } + + /** + * Set the default numbering system to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + static set defaultNumberingSystem(numberingSystem) { + defaultNumberingSystem = numberingSystem; + } + + /** + * Get the default output calendar to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + static get defaultOutputCalendar() { + return defaultOutputCalendar; + } + + /** + * Set the default output calendar to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + static set defaultOutputCalendar(outputCalendar) { + defaultOutputCalendar = outputCalendar; + } + + /** + * @typedef {Object} WeekSettings + * @property {number} firstDay + * @property {number} minimalDays + * @property {number[]} weekend + */ + + /** + * @return {WeekSettings|null} + */ + static get defaultWeekSettings() { + return defaultWeekSettings; + } + + /** + * Allows overriding the default locale week settings, i.e. the start of the week, the weekend and + * how many days are required in the first week of a year. + * Does not affect existing instances. + * + * @param {WeekSettings|null} weekSettings + */ + static set defaultWeekSettings(weekSettings) { + defaultWeekSettings = validateWeekSettings(weekSettings); + } + + /** + * Get the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx. + * @type {number} + */ + static get twoDigitCutoffYear() { + return twoDigitCutoffYear; + } + + /** + * Set the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx. + * @type {number} + * @example Settings.twoDigitCutoffYear = 0 // all 'yy' are interpreted as 20th century + * @example Settings.twoDigitCutoffYear = 99 // all 'yy' are interpreted as 21st century + * @example Settings.twoDigitCutoffYear = 50 // '49' -> 2049; '50' -> 1950 + * @example Settings.twoDigitCutoffYear = 1950 // interpreted as 50 + * @example Settings.twoDigitCutoffYear = 2050 // ALSO interpreted as 50 + */ + static set twoDigitCutoffYear(cutoffYear) { + twoDigitCutoffYear = cutoffYear % 100; + } + + /** + * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals + * @type {boolean} + */ + static get throwOnInvalid() { + return throwOnInvalid; + } + + /** + * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals + * @type {boolean} + */ + static set throwOnInvalid(t) { + throwOnInvalid = t; + } + + /** + * Reset Luxon's global caches. Should only be necessary in testing scenarios. + * @return {void} + */ + static resetCaches() { + Locale.resetCache(); + IANAZone.resetCache(); + DateTime.resetCache(); + resetDigitRegexCache(); + } +} + +class Invalid { + constructor(reason, explanation) { + this.reason = reason; + this.explanation = explanation; + } + toMessage() { + if (this.explanation) { + return `${this.reason}: ${this.explanation}`; + } else { + return this.reason; + } + } +} + +const nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334], + leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335]; +function unitOutOfRange(unit, value) { + return new Invalid("unit out of range", `you specified ${value} (of type ${typeof value}) as a ${unit}, which is invalid`); +} +function dayOfWeek(year, month, day) { + const d = new Date(Date.UTC(year, month - 1, day)); + if (year < 100 && year >= 0) { + d.setUTCFullYear(d.getUTCFullYear() - 1900); + } + const js = d.getUTCDay(); + return js === 0 ? 7 : js; +} +function computeOrdinal(year, month, day) { + return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1]; +} +function uncomputeOrdinal(year, ordinal) { + const table = isLeapYear(year) ? leapLadder : nonLeapLadder, + month0 = table.findIndex(i => i < ordinal), + day = ordinal - table[month0]; + return { + month: month0 + 1, + day + }; +} +function isoWeekdayToLocal(isoWeekday, startOfWeek) { + return (isoWeekday - startOfWeek + 7) % 7 + 1; +} + +/** + * @private + */ + +function gregorianToWeek(gregObj, minDaysInFirstWeek = 4, startOfWeek = 1) { + const { + year, + month, + day + } = gregObj, + ordinal = computeOrdinal(year, month, day), + weekday = isoWeekdayToLocal(dayOfWeek(year, month, day), startOfWeek); + let weekNumber = Math.floor((ordinal - weekday + 14 - minDaysInFirstWeek) / 7), + weekYear; + if (weekNumber < 1) { + weekYear = year - 1; + weekNumber = weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek); + } else if (weekNumber > weeksInWeekYear(year, minDaysInFirstWeek, startOfWeek)) { + weekYear = year + 1; + weekNumber = 1; + } else { + weekYear = year; + } + return { + weekYear, + weekNumber, + weekday, + ...timeObject(gregObj) + }; +} +function weekToGregorian(weekData, minDaysInFirstWeek = 4, startOfWeek = 1) { + const { + weekYear, + weekNumber, + weekday + } = weekData, + weekdayOfJan4 = isoWeekdayToLocal(dayOfWeek(weekYear, 1, minDaysInFirstWeek), startOfWeek), + yearInDays = daysInYear(weekYear); + let ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 7 + minDaysInFirstWeek, + year; + if (ordinal < 1) { + year = weekYear - 1; + ordinal += daysInYear(year); + } else if (ordinal > yearInDays) { + year = weekYear + 1; + ordinal -= daysInYear(weekYear); + } else { + year = weekYear; + } + const { + month, + day + } = uncomputeOrdinal(year, ordinal); + return { + year, + month, + day, + ...timeObject(weekData) + }; +} +function gregorianToOrdinal(gregData) { + const { + year, + month, + day + } = gregData; + const ordinal = computeOrdinal(year, month, day); + return { + year, + ordinal, + ...timeObject(gregData) + }; +} +function ordinalToGregorian(ordinalData) { + const { + year, + ordinal + } = ordinalData; + const { + month, + day + } = uncomputeOrdinal(year, ordinal); + return { + year, + month, + day, + ...timeObject(ordinalData) + }; +} + +/** + * Check if local week units like localWeekday are used in obj. + * If so, validates that they are not mixed with ISO week units and then copies them to the normal week unit properties. + * Modifies obj in-place! + * @param obj the object values + */ +function usesLocalWeekValues(obj, loc) { + const hasLocaleWeekData = !isUndefined(obj.localWeekday) || !isUndefined(obj.localWeekNumber) || !isUndefined(obj.localWeekYear); + if (hasLocaleWeekData) { + const hasIsoWeekData = !isUndefined(obj.weekday) || !isUndefined(obj.weekNumber) || !isUndefined(obj.weekYear); + if (hasIsoWeekData) { + throw new ConflictingSpecificationError("Cannot mix locale-based week fields with ISO-based week fields"); + } + if (!isUndefined(obj.localWeekday)) obj.weekday = obj.localWeekday; + if (!isUndefined(obj.localWeekNumber)) obj.weekNumber = obj.localWeekNumber; + if (!isUndefined(obj.localWeekYear)) obj.weekYear = obj.localWeekYear; + delete obj.localWeekday; + delete obj.localWeekNumber; + delete obj.localWeekYear; + return { + minDaysInFirstWeek: loc.getMinDaysInFirstWeek(), + startOfWeek: loc.getStartOfWeek() + }; + } else { + return { + minDaysInFirstWeek: 4, + startOfWeek: 1 + }; + } +} +function hasInvalidWeekData(obj, minDaysInFirstWeek = 4, startOfWeek = 1) { + const validYear = isInteger(obj.weekYear), + validWeek = integerBetween(obj.weekNumber, 1, weeksInWeekYear(obj.weekYear, minDaysInFirstWeek, startOfWeek)), + validWeekday = integerBetween(obj.weekday, 1, 7); + if (!validYear) { + return unitOutOfRange("weekYear", obj.weekYear); + } else if (!validWeek) { + return unitOutOfRange("week", obj.weekNumber); + } else if (!validWeekday) { + return unitOutOfRange("weekday", obj.weekday); + } else return false; +} +function hasInvalidOrdinalData(obj) { + const validYear = isInteger(obj.year), + validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year)); + if (!validYear) { + return unitOutOfRange("year", obj.year); + } else if (!validOrdinal) { + return unitOutOfRange("ordinal", obj.ordinal); + } else return false; +} +function hasInvalidGregorianData(obj) { + const validYear = isInteger(obj.year), + validMonth = integerBetween(obj.month, 1, 12), + validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month)); + if (!validYear) { + return unitOutOfRange("year", obj.year); + } else if (!validMonth) { + return unitOutOfRange("month", obj.month); + } else if (!validDay) { + return unitOutOfRange("day", obj.day); + } else return false; +} +function hasInvalidTimeData(obj) { + const { + hour, + minute, + second, + millisecond + } = obj; + const validHour = integerBetween(hour, 0, 23) || hour === 24 && minute === 0 && second === 0 && millisecond === 0, + validMinute = integerBetween(minute, 0, 59), + validSecond = integerBetween(second, 0, 59), + validMillisecond = integerBetween(millisecond, 0, 999); + if (!validHour) { + return unitOutOfRange("hour", hour); + } else if (!validMinute) { + return unitOutOfRange("minute", minute); + } else if (!validSecond) { + return unitOutOfRange("second", second); + } else if (!validMillisecond) { + return unitOutOfRange("millisecond", millisecond); + } else return false; +} + +/* + This is just a junk drawer, containing anything used across multiple classes. + Because Luxon is small(ish), this should stay small and we won't worry about splitting + it up into, say, parsingUtil.js and basicUtil.js and so on. But they are divided up by feature area. +*/ + +/** + * @private + */ + +// TYPES + +function isUndefined(o) { + return typeof o === "undefined"; +} +function isNumber(o) { + return typeof o === "number"; +} +function isInteger(o) { + return typeof o === "number" && o % 1 === 0; +} +function isString(o) { + return typeof o === "string"; +} +function isDate(o) { + return Object.prototype.toString.call(o) === "[object Date]"; +} + +// CAPABILITIES + +function hasRelative() { + try { + return typeof Intl !== "undefined" && !!Intl.RelativeTimeFormat; + } catch (e) { + return false; + } +} +function hasLocaleWeekInfo() { + try { + return typeof Intl !== "undefined" && !!Intl.Locale && ("weekInfo" in Intl.Locale.prototype || "getWeekInfo" in Intl.Locale.prototype); + } catch (e) { + return false; + } +} + +// OBJECTS AND ARRAYS + +function maybeArray(thing) { + return Array.isArray(thing) ? thing : [thing]; +} +function bestBy(arr, by, compare) { + if (arr.length === 0) { + return undefined; + } + return arr.reduce((best, next) => { + const pair = [by(next), next]; + if (!best) { + return pair; + } else if (compare(best[0], pair[0]) === best[0]) { + return best; + } else { + return pair; + } + }, null)[1]; +} +function pick(obj, keys) { + return keys.reduce((a, k) => { + a[k] = obj[k]; + return a; + }, {}); +} +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} +function validateWeekSettings(settings) { + if (settings == null) { + return null; + } else if (typeof settings !== "object") { + throw new InvalidArgumentError("Week settings must be an object"); + } else { + if (!integerBetween(settings.firstDay, 1, 7) || !integerBetween(settings.minimalDays, 1, 7) || !Array.isArray(settings.weekend) || settings.weekend.some(v => !integerBetween(v, 1, 7))) { + throw new InvalidArgumentError("Invalid week settings"); + } + return { + firstDay: settings.firstDay, + minimalDays: settings.minimalDays, + weekend: Array.from(settings.weekend) + }; + } +} + +// NUMBERS AND STRINGS + +function integerBetween(thing, bottom, top) { + return isInteger(thing) && thing >= bottom && thing <= top; +} + +// x % n but takes the sign of n instead of x +function floorMod(x, n) { + return x - n * Math.floor(x / n); +} +function padStart(input, n = 2) { + const isNeg = input < 0; + let padded; + if (isNeg) { + padded = "-" + ("" + -input).padStart(n, "0"); + } else { + padded = ("" + input).padStart(n, "0"); + } + return padded; +} +function parseInteger(string) { + if (isUndefined(string) || string === null || string === "") { + return undefined; + } else { + return parseInt(string, 10); + } +} +function parseFloating(string) { + if (isUndefined(string) || string === null || string === "") { + return undefined; + } else { + return parseFloat(string); + } +} +function parseMillis(fraction) { + // Return undefined (instead of 0) in these cases, where fraction is not set + if (isUndefined(fraction) || fraction === null || fraction === "") { + return undefined; + } else { + const f = parseFloat("0." + fraction) * 1000; + return Math.floor(f); + } +} +function roundTo(number, digits, rounding = "round") { + const factor = 10 ** digits; + switch (rounding) { + case "expand": + return number > 0 ? Math.ceil(number * factor) / factor : Math.floor(number * factor) / factor; + case "trunc": + return Math.trunc(number * factor) / factor; + case "round": + return Math.round(number * factor) / factor; + case "floor": + return Math.floor(number * factor) / factor; + case "ceil": + return Math.ceil(number * factor) / factor; + default: + throw new RangeError(`Value rounding ${rounding} is out of range`); + } +} + +// DATE BASICS + +function isLeapYear(year) { + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); +} +function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; +} +function daysInMonth(year, month) { + const modMonth = floorMod(month - 1, 12) + 1, + modYear = year + (month - modMonth) / 12; + if (modMonth === 2) { + return isLeapYear(modYear) ? 29 : 28; + } else { + return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1]; + } +} + +// convert a calendar object to a local timestamp (epoch, but with the offset baked in) +function objToLocalTS(obj) { + let d = Date.UTC(obj.year, obj.month - 1, obj.day, obj.hour, obj.minute, obj.second, obj.millisecond); + + // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that + if (obj.year < 100 && obj.year >= 0) { + d = new Date(d); + // set the month and day again, this is necessary because year 2000 is a leap year, but year 100 is not + // so if obj.year is in 99, but obj.day makes it roll over into year 100, + // the calculations done by Date.UTC are using year 2000 - which is incorrect + d.setUTCFullYear(obj.year, obj.month - 1, obj.day); + } + return +d; +} + +// adapted from moment.js: https://github.com/moment/moment/blob/000ac1800e620f770f4eb31b5ae908f6167b0ab2/src/lib/units/week-calendar-utils.js +function firstWeekOffset(year, minDaysInFirstWeek, startOfWeek) { + const fwdlw = isoWeekdayToLocal(dayOfWeek(year, 1, minDaysInFirstWeek), startOfWeek); + return -fwdlw + minDaysInFirstWeek - 1; +} +function weeksInWeekYear(weekYear, minDaysInFirstWeek = 4, startOfWeek = 1) { + const weekOffset = firstWeekOffset(weekYear, minDaysInFirstWeek, startOfWeek); + const weekOffsetNext = firstWeekOffset(weekYear + 1, minDaysInFirstWeek, startOfWeek); + return (daysInYear(weekYear) - weekOffset + weekOffsetNext) / 7; +} +function untruncateYear(year) { + if (year > 99) { + return year; + } else return year > Settings.twoDigitCutoffYear ? 1900 + year : 2000 + year; +} + +// PARSING + +function parseZoneInfo(ts, offsetFormat, locale, timeZone = null) { + const date = new Date(ts), + intlOpts = { + hourCycle: "h23", + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit" + }; + if (timeZone) { + intlOpts.timeZone = timeZone; + } + const modified = { + timeZoneName: offsetFormat, + ...intlOpts + }; + const parsed = new Intl.DateTimeFormat(locale, modified).formatToParts(date).find(m => m.type.toLowerCase() === "timezonename"); + return parsed ? parsed.value : null; +} + +// signedOffset('-5', '30') -> -330 +function signedOffset(offHourStr, offMinuteStr) { + let offHour = parseInt(offHourStr, 10); + + // don't || this because we want to preserve -0 + if (Number.isNaN(offHour)) { + offHour = 0; + } + const offMin = parseInt(offMinuteStr, 10) || 0, + offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin; + return offHour * 60 + offMinSigned; +} + +// COERCION + +function asNumber(value) { + const numericValue = Number(value); + if (typeof value === "boolean" || value === "" || !Number.isFinite(numericValue)) throw new InvalidArgumentError(`Invalid unit value ${value}`); + return numericValue; +} +function normalizeObject(obj, normalizer) { + const normalized = {}; + for (const u in obj) { + if (hasOwnProperty(obj, u)) { + const v = obj[u]; + if (v === undefined || v === null) continue; + normalized[normalizer(u)] = asNumber(v); + } + } + return normalized; +} + +/** + * Returns the offset's value as a string + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */ +function formatOffset(offset, format) { + const hours = Math.trunc(Math.abs(offset / 60)), + minutes = Math.trunc(Math.abs(offset % 60)), + sign = offset >= 0 ? "+" : "-"; + switch (format) { + case "short": + return `${sign}${padStart(hours, 2)}:${padStart(minutes, 2)}`; + case "narrow": + return `${sign}${hours}${minutes > 0 ? `:${minutes}` : ""}`; + case "techie": + return `${sign}${padStart(hours, 2)}${padStart(minutes, 2)}`; + default: + throw new RangeError(`Value format ${format} is out of range for property format`); + } +} +function timeObject(obj) { + return pick(obj, ["hour", "minute", "second", "millisecond"]); +} + +/** + * @private + */ + +const monthsLong = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; +const monthsShort = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; +const monthsNarrow = ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"]; +function months(length) { + switch (length) { + case "narrow": + return [...monthsNarrow]; + case "short": + return [...monthsShort]; + case "long": + return [...monthsLong]; + case "numeric": + return ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"]; + case "2-digit": + return ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]; + default: + return null; + } +} +const weekdaysLong = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]; +const weekdaysShort = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; +const weekdaysNarrow = ["M", "T", "W", "T", "F", "S", "S"]; +function weekdays(length) { + switch (length) { + case "narrow": + return [...weekdaysNarrow]; + case "short": + return [...weekdaysShort]; + case "long": + return [...weekdaysLong]; + case "numeric": + return ["1", "2", "3", "4", "5", "6", "7"]; + default: + return null; + } +} +const meridiems = ["AM", "PM"]; +const erasLong = ["Before Christ", "Anno Domini"]; +const erasShort = ["BC", "AD"]; +const erasNarrow = ["B", "A"]; +function eras(length) { + switch (length) { + case "narrow": + return [...erasNarrow]; + case "short": + return [...erasShort]; + case "long": + return [...erasLong]; + default: + return null; + } +} +function meridiemForDateTime(dt) { + return meridiems[dt.hour < 12 ? 0 : 1]; +} +function weekdayForDateTime(dt, length) { + return weekdays(length)[dt.weekday - 1]; +} +function monthForDateTime(dt, length) { + return months(length)[dt.month - 1]; +} +function eraForDateTime(dt, length) { + return eras(length)[dt.year < 0 ? 0 : 1]; +} +function formatRelativeTime(unit, count, numeric = "always", narrow = false) { + const units = { + years: ["year", "yr."], + quarters: ["quarter", "qtr."], + months: ["month", "mo."], + weeks: ["week", "wk."], + days: ["day", "day", "days"], + hours: ["hour", "hr."], + minutes: ["minute", "min."], + seconds: ["second", "sec."] + }; + const lastable = ["hours", "minutes", "seconds"].indexOf(unit) === -1; + if (numeric === "auto" && lastable) { + const isDay = unit === "days"; + switch (count) { + case 1: + return isDay ? "tomorrow" : `next ${units[unit][0]}`; + case -1: + return isDay ? "yesterday" : `last ${units[unit][0]}`; + case 0: + return isDay ? "today" : `this ${units[unit][0]}`; + } + } + + const isInPast = Object.is(count, -0) || count < 0, + fmtValue = Math.abs(count), + singular = fmtValue === 1, + lilUnits = units[unit], + fmtUnit = narrow ? singular ? lilUnits[1] : lilUnits[2] || lilUnits[1] : singular ? units[unit][0] : unit; + return isInPast ? `${fmtValue} ${fmtUnit} ago` : `in ${fmtValue} ${fmtUnit}`; +} + +function stringifyTokens(splits, tokenToString) { + let s = ""; + for (const token of splits) { + if (token.literal) { + s += token.val; + } else { + s += tokenToString(token.val); + } + } + return s; +} +const macroTokenToFormatOpts = { + D: DATE_SHORT, + DD: DATE_MED, + DDD: DATE_FULL, + DDDD: DATE_HUGE, + t: TIME_SIMPLE, + tt: TIME_WITH_SECONDS, + ttt: TIME_WITH_SHORT_OFFSET, + tttt: TIME_WITH_LONG_OFFSET, + T: TIME_24_SIMPLE, + TT: TIME_24_WITH_SECONDS, + TTT: TIME_24_WITH_SHORT_OFFSET, + TTTT: TIME_24_WITH_LONG_OFFSET, + f: DATETIME_SHORT, + ff: DATETIME_MED, + fff: DATETIME_FULL, + ffff: DATETIME_HUGE, + F: DATETIME_SHORT_WITH_SECONDS, + FF: DATETIME_MED_WITH_SECONDS, + FFF: DATETIME_FULL_WITH_SECONDS, + FFFF: DATETIME_HUGE_WITH_SECONDS +}; + +/** + * @private + */ + +class Formatter { + static create(locale, opts = {}) { + return new Formatter(locale, opts); + } + static parseFormat(fmt) { + // white-space is always considered a literal in user-provided formats + // the " " token has a special meaning (see unitForToken) + + let current = null, + currentFull = "", + bracketed = false; + const splits = []; + for (let i = 0; i < fmt.length; i++) { + const c = fmt.charAt(i); + if (c === "'") { + // turn '' into a literal signal quote instead of just skipping the empty literal + if (currentFull.length > 0 || bracketed) { + splits.push({ + literal: bracketed || /^\s+$/.test(currentFull), + val: currentFull === "" ? "'" : currentFull + }); + } + current = null; + currentFull = ""; + bracketed = !bracketed; + } else if (bracketed) { + currentFull += c; + } else if (c === current) { + currentFull += c; + } else { + if (currentFull.length > 0) { + splits.push({ + literal: /^\s+$/.test(currentFull), + val: currentFull + }); + } + currentFull = c; + current = c; + } + } + if (currentFull.length > 0) { + splits.push({ + literal: bracketed || /^\s+$/.test(currentFull), + val: currentFull + }); + } + return splits; + } + static macroTokenToFormatOpts(token) { + return macroTokenToFormatOpts[token]; + } + constructor(locale, formatOpts) { + this.opts = formatOpts; + this.loc = locale; + this.systemLoc = null; + } + formatWithSystemDefault(dt, opts) { + if (this.systemLoc === null) { + this.systemLoc = this.loc.redefaultToSystem(); + } + const df = this.systemLoc.dtFormatter(dt, { + ...this.opts, + ...opts + }); + return df.format(); + } + dtFormatter(dt, opts = {}) { + return this.loc.dtFormatter(dt, { + ...this.opts, + ...opts + }); + } + formatDateTime(dt, opts) { + return this.dtFormatter(dt, opts).format(); + } + formatDateTimeParts(dt, opts) { + return this.dtFormatter(dt, opts).formatToParts(); + } + formatInterval(interval, opts) { + const df = this.dtFormatter(interval.start, opts); + return df.dtf.formatRange(interval.start.toJSDate(), interval.end.toJSDate()); + } + resolvedOptions(dt, opts) { + return this.dtFormatter(dt, opts).resolvedOptions(); + } + num(n, p = 0, signDisplay = undefined) { + // we get some perf out of doing this here, annoyingly + if (this.opts.forceSimple) { + return padStart(n, p); + } + const opts = { + ...this.opts + }; + if (p > 0) { + opts.padTo = p; + } + if (signDisplay) { + opts.signDisplay = signDisplay; + } + return this.loc.numberFormatter(opts).format(n); + } + formatDateTimeFromString(dt, fmt) { + const knownEnglish = this.loc.listingMode() === "en", + useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== "gregory", + string = (opts, extract) => this.loc.extract(dt, opts, extract), + formatOffset = opts => { + if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) { + return "Z"; + } + return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : ""; + }, + meridiem = () => knownEnglish ? meridiemForDateTime(dt) : string({ + hour: "numeric", + hourCycle: "h12" + }, "dayperiod"), + month = (length, standalone) => knownEnglish ? monthForDateTime(dt, length) : string(standalone ? { + month: length + } : { + month: length, + day: "numeric" + }, "month"), + weekday = (length, standalone) => knownEnglish ? weekdayForDateTime(dt, length) : string(standalone ? { + weekday: length + } : { + weekday: length, + month: "long", + day: "numeric" + }, "weekday"), + maybeMacro = token => { + const formatOpts = Formatter.macroTokenToFormatOpts(token); + if (formatOpts) { + return this.formatWithSystemDefault(dt, formatOpts); + } else { + return token; + } + }, + era = length => knownEnglish ? eraForDateTime(dt, length) : string({ + era: length + }, "era"), + tokenToString = token => { + // Where possible: https://cldr.unicode.org/translation/date-time/date-time-symbols + switch (token) { + // ms + case "S": + return this.num(dt.millisecond); + case "u": + // falls through + case "SSS": + return this.num(dt.millisecond, 3); + // seconds + case "s": + return this.num(dt.second); + case "ss": + return this.num(dt.second, 2); + // fractional seconds + case "uu": + return this.num(Math.floor(dt.millisecond / 10), 2); + case "uuu": + return this.num(Math.floor(dt.millisecond / 100)); + // minutes + case "m": + return this.num(dt.minute); + case "mm": + return this.num(dt.minute, 2); + // hours + case "h": + return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12); + case "hh": + return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2); + case "H": + return this.num(dt.hour); + case "HH": + return this.num(dt.hour, 2); + // offset + case "Z": + // like +6 + return formatOffset({ + format: "narrow", + allowZ: this.opts.allowZ + }); + case "ZZ": + // like +06:00 + return formatOffset({ + format: "short", + allowZ: this.opts.allowZ + }); + case "ZZZ": + // like +0600 + return formatOffset({ + format: "techie", + allowZ: this.opts.allowZ + }); + case "ZZZZ": + // like EST + return dt.zone.offsetName(dt.ts, { + format: "short", + locale: this.loc.locale + }); + case "ZZZZZ": + // like Eastern Standard Time + return dt.zone.offsetName(dt.ts, { + format: "long", + locale: this.loc.locale + }); + // zone + case "z": + // like America/New_York + return dt.zoneName; + // meridiems + case "a": + return meridiem(); + // dates + case "d": + return useDateTimeFormatter ? string({ + day: "numeric" + }, "day") : this.num(dt.day); + case "dd": + return useDateTimeFormatter ? string({ + day: "2-digit" + }, "day") : this.num(dt.day, 2); + // weekdays - standalone + case "c": + // like 1 + return this.num(dt.weekday); + case "ccc": + // like 'Tues' + return weekday("short", true); + case "cccc": + // like 'Tuesday' + return weekday("long", true); + case "ccccc": + // like 'T' + return weekday("narrow", true); + // weekdays - format + case "E": + // like 1 + return this.num(dt.weekday); + case "EEE": + // like 'Tues' + return weekday("short", false); + case "EEEE": + // like 'Tuesday' + return weekday("long", false); + case "EEEEE": + // like 'T' + return weekday("narrow", false); + // months - standalone + case "L": + // like 1 + return useDateTimeFormatter ? string({ + month: "numeric", + day: "numeric" + }, "month") : this.num(dt.month); + case "LL": + // like 01, doesn't seem to work + return useDateTimeFormatter ? string({ + month: "2-digit", + day: "numeric" + }, "month") : this.num(dt.month, 2); + case "LLL": + // like Jan + return month("short", true); + case "LLLL": + // like January + return month("long", true); + case "LLLLL": + // like J + return month("narrow", true); + // months - format + case "M": + // like 1 + return useDateTimeFormatter ? string({ + month: "numeric" + }, "month") : this.num(dt.month); + case "MM": + // like 01 + return useDateTimeFormatter ? string({ + month: "2-digit" + }, "month") : this.num(dt.month, 2); + case "MMM": + // like Jan + return month("short", false); + case "MMMM": + // like January + return month("long", false); + case "MMMMM": + // like J + return month("narrow", false); + // years + case "y": + // like 2014 + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : this.num(dt.year); + case "yy": + // like 14 + return useDateTimeFormatter ? string({ + year: "2-digit" + }, "year") : this.num(dt.year.toString().slice(-2), 2); + case "yyyy": + // like 0012 + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : this.num(dt.year, 4); + case "yyyyyy": + // like 000012 + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : this.num(dt.year, 6); + // eras + case "G": + // like AD + return era("short"); + case "GG": + // like Anno Domini + return era("long"); + case "GGGGG": + return era("narrow"); + case "kk": + return this.num(dt.weekYear.toString().slice(-2), 2); + case "kkkk": + return this.num(dt.weekYear, 4); + case "W": + return this.num(dt.weekNumber); + case "WW": + return this.num(dt.weekNumber, 2); + case "n": + return this.num(dt.localWeekNumber); + case "nn": + return this.num(dt.localWeekNumber, 2); + case "ii": + return this.num(dt.localWeekYear.toString().slice(-2), 2); + case "iiii": + return this.num(dt.localWeekYear, 4); + case "o": + return this.num(dt.ordinal); + case "ooo": + return this.num(dt.ordinal, 3); + case "q": + // like 1 + return this.num(dt.quarter); + case "qq": + // like 01 + return this.num(dt.quarter, 2); + case "X": + return this.num(Math.floor(dt.ts / 1000)); + case "x": + return this.num(dt.ts); + default: + return maybeMacro(token); + } + }; + return stringifyTokens(Formatter.parseFormat(fmt), tokenToString); + } + formatDurationFromString(dur, fmt) { + const invertLargest = this.opts.signMode === "negativeLargestOnly" ? -1 : 1; + const tokenToField = token => { + switch (token[0]) { + case "S": + return "milliseconds"; + case "s": + return "seconds"; + case "m": + return "minutes"; + case "h": + return "hours"; + case "d": + return "days"; + case "w": + return "weeks"; + case "M": + return "months"; + case "y": + return "years"; + default: + return null; + } + }, + tokenToString = (lildur, info) => token => { + const mapped = tokenToField(token); + if (mapped) { + const inversionFactor = info.isNegativeDuration && mapped !== info.largestUnit ? invertLargest : 1; + let signDisplay; + if (this.opts.signMode === "negativeLargestOnly" && mapped !== info.largestUnit) { + signDisplay = "never"; + } else if (this.opts.signMode === "all") { + signDisplay = "always"; + } else { + // "auto" and "negative" are the same, but "auto" has better support + signDisplay = "auto"; + } + return this.num(lildur.get(mapped) * inversionFactor, token.length, signDisplay); + } else { + return token; + } + }, + tokens = Formatter.parseFormat(fmt), + realTokens = tokens.reduce((found, { + literal, + val + }) => literal ? found : found.concat(val), []), + collapsed = dur.shiftTo(...realTokens.map(tokenToField).filter(t => t)), + durationInfo = { + isNegativeDuration: collapsed < 0, + // this relies on "collapsed" being based on "shiftTo", which builds up the object + // in order + largestUnit: Object.keys(collapsed.values)[0] + }; + return stringifyTokens(tokens, tokenToString(collapsed, durationInfo)); + } +} + +/* + * This file handles parsing for well-specified formats. Here's how it works: + * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match. + * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object + * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence. + * Extractors can take a "cursor" representing the offset in the match to look at. This makes it easy to combine extractors. + * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions. + * Some extractions are super dumb and simpleParse and fromStrings help DRY them. + */ + +const ianaRegex = /[A-Za-z_+-]{1,256}(?::?\/[A-Za-z0-9_+-]{1,256}(?:\/[A-Za-z0-9_+-]{1,256})?)?/; +function combineRegexes(...regexes) { + const full = regexes.reduce((f, r) => f + r.source, ""); + return RegExp(`^${full}$`); +} +function combineExtractors(...extractors) { + return m => extractors.reduce(([mergedVals, mergedZone, cursor], ex) => { + const [val, zone, next] = ex(m, cursor); + return [{ + ...mergedVals, + ...val + }, zone || mergedZone, next]; + }, [{}, null, 1]).slice(0, 2); +} +function parse(s, ...patterns) { + if (s == null) { + return [null, null]; + } + for (const [regex, extractor] of patterns) { + const m = regex.exec(s); + if (m) { + return extractor(m); + } + } + return [null, null]; +} +function simpleParse(...keys) { + return (match, cursor) => { + const ret = {}; + let i; + for (i = 0; i < keys.length; i++) { + ret[keys[i]] = parseInteger(match[cursor + i]); + } + return [ret, null, cursor + i]; + }; +} + +// ISO and SQL parsing +const offsetRegex = /(?:([Zz])|([+-]\d\d)(?::?(\d\d))?)/; +const isoExtendedZone = `(?:${offsetRegex.source}?(?:\\[(${ianaRegex.source})\\])?)?`; +const isoTimeBaseRegex = /(\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,30}))?)?)?/; +const isoTimeRegex = RegExp(`${isoTimeBaseRegex.source}${isoExtendedZone}`); +const isoTimeExtensionRegex = RegExp(`(?:[Tt]${isoTimeRegex.source})?`); +const isoYmdRegex = /([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/; +const isoWeekRegex = /(\d{4})-?W(\d\d)(?:-?(\d))?/; +const isoOrdinalRegex = /(\d{4})-?(\d{3})/; +const extractISOWeekData = simpleParse("weekYear", "weekNumber", "weekDay"); +const extractISOOrdinalData = simpleParse("year", "ordinal"); +const sqlYmdRegex = /(\d{4})-(\d\d)-(\d\d)/; // dumbed-down version of the ISO one +const sqlTimeRegex = RegExp(`${isoTimeBaseRegex.source} ?(?:${offsetRegex.source}|(${ianaRegex.source}))?`); +const sqlTimeExtensionRegex = RegExp(`(?: ${sqlTimeRegex.source})?`); +function int(match, pos, fallback) { + const m = match[pos]; + return isUndefined(m) ? fallback : parseInteger(m); +} +function extractISOYmd(match, cursor) { + const item = { + year: int(match, cursor), + month: int(match, cursor + 1, 1), + day: int(match, cursor + 2, 1) + }; + return [item, null, cursor + 3]; +} +function extractISOTime(match, cursor) { + const item = { + hours: int(match, cursor, 0), + minutes: int(match, cursor + 1, 0), + seconds: int(match, cursor + 2, 0), + milliseconds: parseMillis(match[cursor + 3]) + }; + return [item, null, cursor + 4]; +} +function extractISOOffset(match, cursor) { + const local = !match[cursor] && !match[cursor + 1], + fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]), + zone = local ? null : FixedOffsetZone.instance(fullOffset); + return [{}, zone, cursor + 3]; +} +function extractIANAZone(match, cursor) { + const zone = match[cursor] ? IANAZone.create(match[cursor]) : null; + return [{}, zone, cursor + 1]; +} + +// ISO time parsing + +const isoTimeOnly = RegExp(`^T?${isoTimeBaseRegex.source}$`); + +// ISO duration parsing + +const isoDuration = /^-?P(?:(?:(-?\d{1,20}(?:\.\d{1,20})?)Y)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20}(?:\.\d{1,20})?)W)?(?:(-?\d{1,20}(?:\.\d{1,20})?)D)?(?:T(?:(-?\d{1,20}(?:\.\d{1,20})?)H)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20})(?:[.,](-?\d{1,20}))?S)?)?)$/; +function extractISODuration(match) { + const [s, yearStr, monthStr, weekStr, dayStr, hourStr, minuteStr, secondStr, millisecondsStr] = match; + const hasNegativePrefix = s[0] === "-"; + const negativeSeconds = secondStr && secondStr[0] === "-"; + const maybeNegate = (num, force = false) => num !== undefined && (force || num && hasNegativePrefix) ? -num : num; + return [{ + years: maybeNegate(parseFloating(yearStr)), + months: maybeNegate(parseFloating(monthStr)), + weeks: maybeNegate(parseFloating(weekStr)), + days: maybeNegate(parseFloating(dayStr)), + hours: maybeNegate(parseFloating(hourStr)), + minutes: maybeNegate(parseFloating(minuteStr)), + seconds: maybeNegate(parseFloating(secondStr), secondStr === "-0"), + milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds) + }]; +} + +// These are a little braindead. EDT *should* tell us that we're in, say, America/New_York +// and not just that we're in -240 *right now*. But since I don't think these are used that often +// I'm just going to ignore that +const obsOffsets = { + GMT: 0, + EDT: -4 * 60, + EST: -5 * 60, + CDT: -5 * 60, + CST: -6 * 60, + MDT: -6 * 60, + MST: -7 * 60, + PDT: -7 * 60, + PST: -8 * 60 +}; +function fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { + const result = { + year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr), + month: monthsShort.indexOf(monthStr) + 1, + day: parseInteger(dayStr), + hour: parseInteger(hourStr), + minute: parseInteger(minuteStr) + }; + if (secondStr) result.second = parseInteger(secondStr); + if (weekdayStr) { + result.weekday = weekdayStr.length > 3 ? weekdaysLong.indexOf(weekdayStr) + 1 : weekdaysShort.indexOf(weekdayStr) + 1; + } + return result; +} + +// RFC 2822/5322 +const rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/; +function extractRFC2822(match) { + const [, weekdayStr, dayStr, monthStr, yearStr, hourStr, minuteStr, secondStr, obsOffset, milOffset, offHourStr, offMinuteStr] = match, + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + let offset; + if (obsOffset) { + offset = obsOffsets[obsOffset]; + } else if (milOffset) { + offset = 0; + } else { + offset = signedOffset(offHourStr, offMinuteStr); + } + return [result, new FixedOffsetZone(offset)]; +} +function preprocessRFC2822(s) { + // Remove comments and folding whitespace and replace multiple-spaces with a single space + return s.replace(/\([^()]*\)|[\n\t]/g, " ").replace(/(\s\s+)/g, " ").trim(); +} + +// http date + +const rfc1123 = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/, + rfc850 = /^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/, + ascii = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/; +function extractRFC1123Or850(match) { + const [, weekdayStr, dayStr, monthStr, yearStr, hourStr, minuteStr, secondStr] = match, + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + return [result, FixedOffsetZone.utcInstance]; +} +function extractASCII(match) { + const [, weekdayStr, monthStr, dayStr, hourStr, minuteStr, secondStr, yearStr] = match, + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + return [result, FixedOffsetZone.utcInstance]; +} +const isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex); +const isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex); +const isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex); +const isoTimeCombinedRegex = combineRegexes(isoTimeRegex); +const extractISOYmdTimeAndOffset = combineExtractors(extractISOYmd, extractISOTime, extractISOOffset, extractIANAZone); +const extractISOWeekTimeAndOffset = combineExtractors(extractISOWeekData, extractISOTime, extractISOOffset, extractIANAZone); +const extractISOOrdinalDateAndTime = combineExtractors(extractISOOrdinalData, extractISOTime, extractISOOffset, extractIANAZone); +const extractISOTimeAndOffset = combineExtractors(extractISOTime, extractISOOffset, extractIANAZone); + +/* + * @private + */ + +function parseISODate(s) { + return parse(s, [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset], [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime], [isoTimeCombinedRegex, extractISOTimeAndOffset]); +} +function parseRFC2822Date(s) { + return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]); +} +function parseHTTPDate(s) { + return parse(s, [rfc1123, extractRFC1123Or850], [rfc850, extractRFC1123Or850], [ascii, extractASCII]); +} +function parseISODuration(s) { + return parse(s, [isoDuration, extractISODuration]); +} +const extractISOTimeOnly = combineExtractors(extractISOTime); +function parseISOTimeOnly(s) { + return parse(s, [isoTimeOnly, extractISOTimeOnly]); +} +const sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex); +const sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex); +const extractISOTimeOffsetAndIANAZone = combineExtractors(extractISOTime, extractISOOffset, extractIANAZone); +function parseSQL(s) { + return parse(s, [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]); +} + +const INVALID$2 = "Invalid Duration"; + +// unit conversion constants +const lowOrderMatrix = { + weeks: { + days: 7, + hours: 7 * 24, + minutes: 7 * 24 * 60, + seconds: 7 * 24 * 60 * 60, + milliseconds: 7 * 24 * 60 * 60 * 1000 + }, + days: { + hours: 24, + minutes: 24 * 60, + seconds: 24 * 60 * 60, + milliseconds: 24 * 60 * 60 * 1000 + }, + hours: { + minutes: 60, + seconds: 60 * 60, + milliseconds: 60 * 60 * 1000 + }, + minutes: { + seconds: 60, + milliseconds: 60 * 1000 + }, + seconds: { + milliseconds: 1000 + } + }, + casualMatrix = { + years: { + quarters: 4, + months: 12, + weeks: 52, + days: 365, + hours: 365 * 24, + minutes: 365 * 24 * 60, + seconds: 365 * 24 * 60 * 60, + milliseconds: 365 * 24 * 60 * 60 * 1000 + }, + quarters: { + months: 3, + weeks: 13, + days: 91, + hours: 91 * 24, + minutes: 91 * 24 * 60, + seconds: 91 * 24 * 60 * 60, + milliseconds: 91 * 24 * 60 * 60 * 1000 + }, + months: { + weeks: 4, + days: 30, + hours: 30 * 24, + minutes: 30 * 24 * 60, + seconds: 30 * 24 * 60 * 60, + milliseconds: 30 * 24 * 60 * 60 * 1000 + }, + ...lowOrderMatrix + }, + daysInYearAccurate = 146097.0 / 400, + daysInMonthAccurate = 146097.0 / 4800, + accurateMatrix = { + years: { + quarters: 4, + months: 12, + weeks: daysInYearAccurate / 7, + days: daysInYearAccurate, + hours: daysInYearAccurate * 24, + minutes: daysInYearAccurate * 24 * 60, + seconds: daysInYearAccurate * 24 * 60 * 60, + milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000 + }, + quarters: { + months: 3, + weeks: daysInYearAccurate / 28, + days: daysInYearAccurate / 4, + hours: daysInYearAccurate * 24 / 4, + minutes: daysInYearAccurate * 24 * 60 / 4, + seconds: daysInYearAccurate * 24 * 60 * 60 / 4, + milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000 / 4 + }, + months: { + weeks: daysInMonthAccurate / 7, + days: daysInMonthAccurate, + hours: daysInMonthAccurate * 24, + minutes: daysInMonthAccurate * 24 * 60, + seconds: daysInMonthAccurate * 24 * 60 * 60, + milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000 + }, + ...lowOrderMatrix + }; + +// units ordered by size +const orderedUnits$1 = ["years", "quarters", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds"]; +const reverseUnits = orderedUnits$1.slice(0).reverse(); + +// clone really means "create another instance just like this one, but with these changes" +function clone$1(dur, alts, clear = false) { + // deep merge for vals + const conf = { + values: clear ? alts.values : { + ...dur.values, + ...(alts.values || {}) + }, + loc: dur.loc.clone(alts.loc), + conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy, + matrix: alts.matrix || dur.matrix + }; + return new Duration(conf); +} +function durationToMillis(matrix, vals) { + var _vals$milliseconds; + let sum = (_vals$milliseconds = vals.milliseconds) != null ? _vals$milliseconds : 0; + for (const unit of reverseUnits.slice(1)) { + if (vals[unit]) { + sum += vals[unit] * matrix[unit]["milliseconds"]; + } + } + return sum; +} + +// NB: mutates parameters +function normalizeValues(matrix, vals) { + // the logic below assumes the overall value of the duration is positive + // if this is not the case, factor is used to make it so + const factor = durationToMillis(matrix, vals) < 0 ? -1 : 1; + orderedUnits$1.reduceRight((previous, current) => { + if (!isUndefined(vals[current])) { + if (previous) { + const previousVal = vals[previous] * factor; + const conv = matrix[current][previous]; + + // if (previousVal < 0): + // lower order unit is negative (e.g. { years: 2, days: -2 }) + // normalize this by reducing the higher order unit by the appropriate amount + // and increasing the lower order unit + // this can never make the higher order unit negative, because this function only operates + // on positive durations, so the amount of time represented by the lower order unit cannot + // be larger than the higher order unit + // else: + // lower order unit is positive (e.g. { years: 2, days: 450 } or { years: -2, days: 450 }) + // in this case we attempt to convert as much as possible from the lower order unit into + // the higher order one + // + // Math.floor takes care of both of these cases, rounding away from 0 + // if previousVal < 0 it makes the absolute value larger + // if previousVal >= it makes the absolute value smaller + const rollUp = Math.floor(previousVal / conv); + vals[current] += rollUp * factor; + vals[previous] -= rollUp * conv * factor; + } + return current; + } else { + return previous; + } + }, null); + + // try to convert any decimals into smaller units if possible + // for example for { years: 2.5, days: 0, seconds: 0 } we want to get { years: 2, days: 182, hours: 12 } + orderedUnits$1.reduce((previous, current) => { + if (!isUndefined(vals[current])) { + if (previous) { + const fraction = vals[previous] % 1; + vals[previous] -= fraction; + vals[current] += fraction * matrix[previous][current]; + } + return current; + } else { + return previous; + } + }, null); +} + +// Remove all properties with a value of 0 from an object +function removeZeroes(vals) { + const newVals = {}; + for (const [key, value] of Object.entries(vals)) { + if (value !== 0) { + newVals[key] = value; + } + } + return newVals; +} + +/** + * A Duration object represents a period of time, like "2 months" or "1 day, 1 hour". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime#plus} to add a Duration object to a DateTime, producing another DateTime. + * + * Here is a brief overview of commonly used methods and getters in Duration: + * + * * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}. + * * **Unit values** See the {@link Duration#years}, {@link Duration#months}, {@link Duration#weeks}, {@link Duration#days}, {@link Duration#hours}, {@link Duration#minutes}, {@link Duration#seconds}, {@link Duration#milliseconds} accessors. + * * **Configuration** See {@link Duration#locale} and {@link Duration#numberingSystem} accessors. + * * **Transformation** To create new Durations out of old ones use {@link Duration#plus}, {@link Duration#minus}, {@link Duration#normalize}, {@link Duration#set}, {@link Duration#reconfigure}, {@link Duration#shiftTo}, and {@link Duration#negate}. + * * **Output** To convert the Duration into other representations, see {@link Duration#as}, {@link Duration#toISO}, {@link Duration#toFormat}, and {@link Duration#toJSON} + * + * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation. + */ +class Duration { + /** + * @private + */ + constructor(config) { + const accurate = config.conversionAccuracy === "longterm" || false; + let matrix = accurate ? accurateMatrix : casualMatrix; + if (config.matrix) { + matrix = config.matrix; + } + + /** + * @access private + */ + this.values = config.values; + /** + * @access private + */ + this.loc = config.loc || Locale.create(); + /** + * @access private + */ + this.conversionAccuracy = accurate ? "longterm" : "casual"; + /** + * @access private + */ + this.invalid = config.invalid || null; + /** + * @access private + */ + this.matrix = matrix; + /** + * @access private + */ + this.isLuxonDuration = true; + } + + /** + * Create Duration from a number of milliseconds. + * @param {number} count of milliseconds + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @return {Duration} + */ + static fromMillis(count, opts) { + return Duration.fromObject({ + milliseconds: count + }, opts); + } + + /** + * Create a Duration from a JavaScript object with keys like 'years' and 'hours'. + * If this object is empty then a zero milliseconds duration is returned. + * @param {Object} obj - the object to create the DateTime from + * @param {number} obj.years + * @param {number} obj.quarters + * @param {number} obj.months + * @param {number} obj.weeks + * @param {number} obj.days + * @param {number} obj.hours + * @param {number} obj.minutes + * @param {number} obj.seconds + * @param {number} obj.milliseconds + * @param {Object} [opts=[]] - options for creating this Duration + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the custom conversion system to use + * @return {Duration} + */ + static fromObject(obj, opts = {}) { + if (obj == null || typeof obj !== "object") { + throw new InvalidArgumentError(`Duration.fromObject: argument expected to be an object, got ${obj === null ? "null" : typeof obj}`); + } + return new Duration({ + values: normalizeObject(obj, Duration.normalizeUnit), + loc: Locale.fromObject(opts), + conversionAccuracy: opts.conversionAccuracy, + matrix: opts.matrix + }); + } + + /** + * Create a Duration from DurationLike. + * + * @param {Object | number | Duration} durationLike + * One of: + * - object with keys like 'years' and 'hours'. + * - number representing milliseconds + * - Duration instance + * @return {Duration} + */ + static fromDurationLike(durationLike) { + if (isNumber(durationLike)) { + return Duration.fromMillis(durationLike); + } else if (Duration.isDuration(durationLike)) { + return durationLike; + } else if (typeof durationLike === "object") { + return Duration.fromObject(durationLike); + } else { + throw new InvalidArgumentError(`Unknown duration argument ${durationLike} of type ${typeof durationLike}`); + } + } + + /** + * Create a Duration from an ISO 8601 duration string. + * @param {string} text - text to parse + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the preset conversion system to use + * @see https://en.wikipedia.org/wiki/ISO_8601#Durations + * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 } + * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 } + * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 } + * @return {Duration} + */ + static fromISO(text, opts) { + const [parsed] = parseISODuration(text); + if (parsed) { + return Duration.fromObject(parsed, opts); + } else { + return Duration.invalid("unparsable", `the input "${text}" can't be parsed as ISO 8601`); + } + } + + /** + * Create a Duration from an ISO 8601 time string. + * @param {string} text - text to parse + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the conversion system to use + * @see https://en.wikipedia.org/wiki/ISO_8601#Times + * @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 } + * @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @return {Duration} + */ + static fromISOTime(text, opts) { + const [parsed] = parseISOTimeOnly(text); + if (parsed) { + return Duration.fromObject(parsed, opts); + } else { + return Duration.invalid("unparsable", `the input "${text}" can't be parsed as ISO 8601`); + } + } + + /** + * Create an invalid Duration. + * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {Duration} + */ + static invalid(reason, explanation = null) { + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the Duration is invalid"); + } + const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidDurationError(invalid); + } else { + return new Duration({ + invalid + }); + } + } + + /** + * @private + */ + static normalizeUnit(unit) { + const normalized = { + year: "years", + years: "years", + quarter: "quarters", + quarters: "quarters", + month: "months", + months: "months", + week: "weeks", + weeks: "weeks", + day: "days", + days: "days", + hour: "hours", + hours: "hours", + minute: "minutes", + minutes: "minutes", + second: "seconds", + seconds: "seconds", + millisecond: "milliseconds", + milliseconds: "milliseconds" + }[unit ? unit.toLowerCase() : unit]; + if (!normalized) throw new InvalidUnitError(unit); + return normalized; + } + + /** + * Check if an object is a Duration. Works across context boundaries + * @param {object} o + * @return {boolean} + */ + static isDuration(o) { + return o && o.isLuxonDuration || false; + } + + /** + * Get the locale of a Duration, such 'en-GB' + * @type {string} + */ + get locale() { + return this.isValid ? this.loc.locale : null; + } + + /** + * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration + * + * @type {string} + */ + get numberingSystem() { + return this.isValid ? this.loc.numberingSystem : null; + } + + /** + * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens: + * * `S` for milliseconds + * * `s` for seconds + * * `m` for minutes + * * `h` for hours + * * `d` for days + * * `w` for weeks + * * `M` for months + * * `y` for years + * Notes: + * * Add padding by repeating the token, e.g. "yy" pads the years to two digits, "hhhh" pads the hours out to four digits + * * Tokens can be escaped by wrapping with single quotes. + * * The duration will be converted to the set of units in the format string using {@link Duration#shiftTo} and the Durations's conversion accuracy setting. + * @param {string} fmt - the format string + * @param {Object} opts - options + * @param {boolean} [opts.floor=true] - floor numerical values + * @param {'negative'|'all'|'negativeLargestOnly'} [opts.signMode=negative] - How to handle signs + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("y d s") //=> "1 6 2" + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("yy dd sss") //=> "01 06 002" + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("M S") //=> "12 518402000" + * @example Duration.fromObject({ days: 6, seconds: 2 }).toFormat("d s", { signMode: "all" }) //=> "+6 +2" + * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat("d s", { signMode: "all" }) //=> "-6 -2" + * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat("d s", { signMode: "negativeLargestOnly" }) //=> "-6 2" + * @return {string} + */ + toFormat(fmt, opts = {}) { + // reverse-compat since 1.2; we always round down now, never up, and we do it by default + const fmtOpts = { + ...opts, + floor: opts.round !== false && opts.floor !== false + }; + return this.isValid ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt) : INVALID$2; + } + + /** + * Returns a string representation of a Duration with all units included. + * To modify its behavior, use `listStyle` and any Intl.NumberFormat option, though `unitDisplay` is especially relevant. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options + * @param {Object} opts - Formatting options. Accepts the same keys as the options parameter of the native `Intl.NumberFormat` constructor, as well as `listStyle`. + * @param {string} [opts.listStyle='narrow'] - How to format the merged list. Corresponds to the `style` property of the options parameter of the native `Intl.ListFormat` constructor. + * @param {boolean} [opts.showZeros=true] - Show all units previously used by the duration even if they are zero + * @example + * ```js + * var dur = Duration.fromObject({ months: 1, weeks: 0, hours: 5, minutes: 6 }) + * dur.toHuman() //=> '1 month, 0 weeks, 5 hours, 6 minutes' + * dur.toHuman({ listStyle: "long" }) //=> '1 month, 0 weeks, 5 hours, and 6 minutes' + * dur.toHuman({ unitDisplay: "short" }) //=> '1 mth, 0 wks, 5 hr, 6 min' + * dur.toHuman({ showZeros: false }) //=> '1 month, 5 hours, 6 minutes' + * ``` + */ + toHuman(opts = {}) { + if (!this.isValid) return INVALID$2; + const showZeros = opts.showZeros !== false; + const l = orderedUnits$1.map(unit => { + const val = this.values[unit]; + if (isUndefined(val) || val === 0 && !showZeros) { + return null; + } + return this.loc.numberFormatter({ + style: "unit", + unitDisplay: "long", + ...opts, + unit: unit.slice(0, -1) + }).format(val); + }).filter(n => n); + return this.loc.listFormatter({ + type: "conjunction", + style: opts.listStyle || "narrow", + ...opts + }).format(l); + } + + /** + * Returns a JavaScript object with this Duration's values. + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 } + * @return {Object} + */ + toObject() { + if (!this.isValid) return {}; + return { + ...this.values + }; + } + + /** + * Returns an ISO 8601-compliant string representation of this Duration. + * @see https://en.wikipedia.org/wiki/ISO_8601#Durations + * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S' + * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S' + * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M' + * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M' + * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S' + * @return {string} + */ + toISO() { + // we could use the formatter, but this is an easier way to get the minimum string + if (!this.isValid) return null; + let s = "P"; + if (this.years !== 0) s += this.years + "Y"; + if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + "M"; + if (this.weeks !== 0) s += this.weeks + "W"; + if (this.days !== 0) s += this.days + "D"; + if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0) s += "T"; + if (this.hours !== 0) s += this.hours + "H"; + if (this.minutes !== 0) s += this.minutes + "M"; + if (this.seconds !== 0 || this.milliseconds !== 0) + // this will handle "floating point madness" by removing extra decimal places + // https://stackoverflow.com/questions/588004/is-floating-point-math-broken + s += roundTo(this.seconds + this.milliseconds / 1000, 3) + "S"; + if (s === "P") s += "T0S"; + return s; + } + + /** + * Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day. + * Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours. + * @see https://en.wikipedia.org/wiki/ISO_8601#Times + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includePrefix=false] - include the `T` prefix + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000' + * @return {string} + */ + toISOTime(opts = {}) { + if (!this.isValid) return null; + const millis = this.toMillis(); + if (millis < 0 || millis >= 86400000) return null; + opts = { + suppressMilliseconds: false, + suppressSeconds: false, + includePrefix: false, + format: "extended", + ...opts, + includeOffset: false + }; + const dateTime = DateTime.fromMillis(millis, { + zone: "UTC" + }); + return dateTime.toISOTime(opts); + } + + /** + * Returns an ISO 8601 representation of this Duration appropriate for use in JSON. + * @return {string} + */ + toJSON() { + return this.toISO(); + } + + /** + * Returns an ISO 8601 representation of this Duration appropriate for use in debugging. + * @return {string} + */ + toString() { + return this.toISO(); + } + + /** + * Returns a string representation of this Duration appropriate for the REPL. + * @return {string} + */ + [Symbol.for("nodejs.util.inspect.custom")]() { + if (this.isValid) { + return `Duration { values: ${JSON.stringify(this.values)} }`; + } else { + return `Duration { Invalid, reason: ${this.invalidReason} }`; + } + } + + /** + * Returns an milliseconds value of this Duration. + * @return {number} + */ + toMillis() { + if (!this.isValid) return NaN; + return durationToMillis(this.matrix, this.values); + } + + /** + * Returns an milliseconds value of this Duration. Alias of {@link toMillis} + * @return {number} + */ + valueOf() { + return this.toMillis(); + } + + /** + * Make this Duration longer by the specified amount. Return a newly-constructed Duration. + * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @return {Duration} + */ + plus(duration) { + if (!this.isValid) return this; + const dur = Duration.fromDurationLike(duration), + result = {}; + for (const k of orderedUnits$1) { + if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) { + result[k] = dur.get(k) + this.get(k); + } + } + return clone$1(this, { + values: result + }, true); + } + + /** + * Make this Duration shorter by the specified amount. Return a newly-constructed Duration. + * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @return {Duration} + */ + minus(duration) { + if (!this.isValid) return this; + const dur = Duration.fromDurationLike(duration); + return this.plus(dur.negate()); + } + + /** + * Scale this Duration by the specified amount. Return a newly-constructed Duration. + * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number. + * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits(x => x * 2) //=> { hours: 2, minutes: 60 } + * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits((x, u) => u === "hours" ? x * 2 : x) //=> { hours: 2, minutes: 30 } + * @return {Duration} + */ + mapUnits(fn) { + if (!this.isValid) return this; + const result = {}; + for (const k of Object.keys(this.values)) { + result[k] = asNumber(fn(this.values[k], k)); + } + return clone$1(this, { + values: result + }, true); + } + + /** + * Get the value of unit. + * @param {string} unit - a unit such as 'minute' or 'day' + * @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2 + * @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0 + * @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3 + * @return {number} + */ + get(unit) { + return this[Duration.normalizeUnit(unit)]; + } + + /** + * "Set" the values of specified units. Return a newly-constructed Duration. + * @param {Object} values - a mapping of units to numbers + * @example dur.set({ years: 2017 }) + * @example dur.set({ hours: 8, minutes: 30 }) + * @return {Duration} + */ + set(values) { + if (!this.isValid) return this; + const mixed = { + ...this.values, + ...normalizeObject(values, Duration.normalizeUnit) + }; + return clone$1(this, { + values: mixed + }); + } + + /** + * "Set" the locale and/or numberingSystem. Returns a newly-constructed Duration. + * @example dur.reconfigure({ locale: 'en-GB' }) + * @return {Duration} + */ + reconfigure({ + locale, + numberingSystem, + conversionAccuracy, + matrix + } = {}) { + const loc = this.loc.clone({ + locale, + numberingSystem + }); + const opts = { + loc, + matrix, + conversionAccuracy + }; + return clone$1(this, opts); + } + + /** + * Return the length of the duration in the specified unit. + * @param {string} unit - a unit such as 'minutes' or 'days' + * @example Duration.fromObject({years: 1}).as('days') //=> 365 + * @example Duration.fromObject({years: 1}).as('months') //=> 12 + * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5 + * @return {number} + */ + as(unit) { + return this.isValid ? this.shiftTo(unit).get(unit) : NaN; + } + + /** + * Reduce this Duration to its canonical representation in its current units. + * Assuming the overall value of the Duration is positive, this means: + * - excessive values for lower-order units are converted to higher-order units (if possible, see first and second example) + * - negative lower-order units are converted to higher order units (there must be such a higher order unit, otherwise + * the overall value would be negative, see third example) + * - fractional values for higher-order units are converted to lower-order units (if possible, see fourth example) + * + * If the overall value is negative, the result of this method is equivalent to `this.negate().normalize().negate()`. + * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 } + * @example Duration.fromObject({ days: 5000 }).normalize().toObject() //=> { days: 5000 } + * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 } + * @example Duration.fromObject({ years: 2.5, days: 0, hours: 0 }).normalize().toObject() //=> { years: 2, days: 182, hours: 12 } + * @return {Duration} + */ + normalize() { + if (!this.isValid) return this; + const vals = this.toObject(); + normalizeValues(this.matrix, vals); + return clone$1(this, { + values: vals + }, true); + } + + /** + * Rescale units to its largest representation + * @example Duration.fromObject({ milliseconds: 90000 }).rescale().toObject() //=> { minutes: 1, seconds: 30 } + * @return {Duration} + */ + rescale() { + if (!this.isValid) return this; + const vals = removeZeroes(this.normalize().shiftToAll().toObject()); + return clone$1(this, { + values: vals + }, true); + } + + /** + * Convert this Duration into its representation in a different set of units. + * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 } + * @return {Duration} + */ + shiftTo(...units) { + if (!this.isValid) return this; + if (units.length === 0) { + return this; + } + units = units.map(u => Duration.normalizeUnit(u)); + const built = {}, + accumulated = {}, + vals = this.toObject(); + let lastUnit; + for (const k of orderedUnits$1) { + if (units.indexOf(k) >= 0) { + lastUnit = k; + let own = 0; + + // anything we haven't boiled down yet should get boiled to this unit + for (const ak in accumulated) { + own += this.matrix[ak][k] * accumulated[ak]; + accumulated[ak] = 0; + } + + // plus anything that's already in this unit + if (isNumber(vals[k])) { + own += vals[k]; + } + + // only keep the integer part for now in the hopes of putting any decimal part + // into a smaller unit later + const i = Math.trunc(own); + built[k] = i; + accumulated[k] = (own * 1000 - i * 1000) / 1000; + + // otherwise, keep it in the wings to boil it later + } else if (isNumber(vals[k])) { + accumulated[k] = vals[k]; + } + } + + // anything leftover becomes the decimal for the last unit + // lastUnit must be defined since units is not empty + for (const key in accumulated) { + if (accumulated[key] !== 0) { + built[lastUnit] += key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key]; + } + } + normalizeValues(this.matrix, built); + return clone$1(this, { + values: built + }, true); + } + + /** + * Shift this Duration to all available units. + * Same as shiftTo("years", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds") + * @return {Duration} + */ + shiftToAll() { + if (!this.isValid) return this; + return this.shiftTo("years", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds"); + } + + /** + * Return the negative of this Duration. + * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 } + * @return {Duration} + */ + negate() { + if (!this.isValid) return this; + const negated = {}; + for (const k of Object.keys(this.values)) { + negated[k] = this.values[k] === 0 ? 0 : -this.values[k]; + } + return clone$1(this, { + values: negated + }, true); + } + + /** + * Removes all units with values equal to 0 from this Duration. + * @example Duration.fromObject({ years: 2, days: 0, hours: 0, minutes: 0 }).removeZeros().toObject() //=> { years: 2 } + * @return {Duration} + */ + removeZeros() { + if (!this.isValid) return this; + const vals = removeZeroes(this.values); + return clone$1(this, { + values: vals + }, true); + } + + /** + * Get the years. + * @type {number} + */ + get years() { + return this.isValid ? this.values.years || 0 : NaN; + } + + /** + * Get the quarters. + * @type {number} + */ + get quarters() { + return this.isValid ? this.values.quarters || 0 : NaN; + } + + /** + * Get the months. + * @type {number} + */ + get months() { + return this.isValid ? this.values.months || 0 : NaN; + } + + /** + * Get the weeks + * @type {number} + */ + get weeks() { + return this.isValid ? this.values.weeks || 0 : NaN; + } + + /** + * Get the days. + * @type {number} + */ + get days() { + return this.isValid ? this.values.days || 0 : NaN; + } + + /** + * Get the hours. + * @type {number} + */ + get hours() { + return this.isValid ? this.values.hours || 0 : NaN; + } + + /** + * Get the minutes. + * @type {number} + */ + get minutes() { + return this.isValid ? this.values.minutes || 0 : NaN; + } + + /** + * Get the seconds. + * @return {number} + */ + get seconds() { + return this.isValid ? this.values.seconds || 0 : NaN; + } + + /** + * Get the milliseconds. + * @return {number} + */ + get milliseconds() { + return this.isValid ? this.values.milliseconds || 0 : NaN; + } + + /** + * Returns whether the Duration is invalid. Invalid durations are returned by diff operations + * on invalid DateTimes or Intervals. + * @return {boolean} + */ + get isValid() { + return this.invalid === null; + } + + /** + * Returns an error code if this Duration became invalid, or null if the Duration is valid + * @return {string} + */ + get invalidReason() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this Duration became invalid, or null if the Duration is valid + * @type {string} + */ + get invalidExplanation() { + return this.invalid ? this.invalid.explanation : null; + } + + /** + * Equality check + * Two Durations are equal iff they have the same units and the same values for each unit. + * @param {Duration} other + * @return {boolean} + */ + equals(other) { + if (!this.isValid || !other.isValid) { + return false; + } + if (!this.loc.equals(other.loc)) { + return false; + } + function eq(v1, v2) { + // Consider 0 and undefined as equal + if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0; + return v1 === v2; + } + for (const u of orderedUnits$1) { + if (!eq(this.values[u], other.values[u])) { + return false; + } + } + return true; + } +} + +const INVALID$1 = "Invalid Interval"; + +// checks if the start is equal to or before the end +function validateStartEnd(start, end) { + if (!start || !start.isValid) { + return Interval.invalid("missing or invalid start"); + } else if (!end || !end.isValid) { + return Interval.invalid("missing or invalid end"); + } else if (end < start) { + return Interval.invalid("end before start", `The end of an interval must be after its start, but you had start=${start.toISO()} and end=${end.toISO()}`); + } else { + return null; + } +} + +/** + * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them. + * + * Here is a brief overview of the most commonly used methods and getters in Interval: + * + * * **Creation** To create an Interval, use {@link Interval.fromDateTimes}, {@link Interval.after}, {@link Interval.before}, or {@link Interval.fromISO}. + * * **Accessors** Use {@link Interval#start} and {@link Interval#end} to get the start and end. + * * **Interrogation** To analyze the Interval, use {@link Interval#count}, {@link Interval#length}, {@link Interval#hasSame}, {@link Interval#contains}, {@link Interval#isAfter}, or {@link Interval#isBefore}. + * * **Transformation** To create other Intervals out of this one, use {@link Interval#set}, {@link Interval#splitAt}, {@link Interval#splitBy}, {@link Interval#divideEqually}, {@link Interval.merge}, {@link Interval.xor}, {@link Interval#union}, {@link Interval#intersection}, or {@link Interval#difference}. + * * **Comparison** To compare this Interval to another one, use {@link Interval#equals}, {@link Interval#overlaps}, {@link Interval#abutsStart}, {@link Interval#abutsEnd}, {@link Interval#engulfs} + * * **Output** To convert the Interval into other representations, see {@link Interval#toString}, {@link Interval#toLocaleString}, {@link Interval#toISO}, {@link Interval#toISODate}, {@link Interval#toISOTime}, {@link Interval#toFormat}, and {@link Interval#toDuration}. + */ +class Interval { + /** + * @private + */ + constructor(config) { + /** + * @access private + */ + this.s = config.start; + /** + * @access private + */ + this.e = config.end; + /** + * @access private + */ + this.invalid = config.invalid || null; + /** + * @access private + */ + this.isLuxonInterval = true; + } + + /** + * Create an invalid Interval. + * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {Interval} + */ + static invalid(reason, explanation = null) { + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the Interval is invalid"); + } + const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidIntervalError(invalid); + } else { + return new Interval({ + invalid + }); + } + } + + /** + * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end. + * @param {DateTime|Date|Object} start + * @param {DateTime|Date|Object} end + * @return {Interval} + */ + static fromDateTimes(start, end) { + const builtStart = friendlyDateTime(start), + builtEnd = friendlyDateTime(end); + const validateError = validateStartEnd(builtStart, builtEnd); + if (validateError == null) { + return new Interval({ + start: builtStart, + end: builtEnd + }); + } else { + return validateError; + } + } + + /** + * Create an Interval from a start DateTime and a Duration to extend to. + * @param {DateTime|Date|Object} start + * @param {Duration|Object|number} duration - the length of the Interval. + * @return {Interval} + */ + static after(start, duration) { + const dur = Duration.fromDurationLike(duration), + dt = friendlyDateTime(start); + return Interval.fromDateTimes(dt, dt.plus(dur)); + } + + /** + * Create an Interval from an end DateTime and a Duration to extend backwards to. + * @param {DateTime|Date|Object} end + * @param {Duration|Object|number} duration - the length of the Interval. + * @return {Interval} + */ + static before(end, duration) { + const dur = Duration.fromDurationLike(duration), + dt = friendlyDateTime(end); + return Interval.fromDateTimes(dt.minus(dur), dt); + } + + /** + * Create an Interval from an ISO 8601 string. + * Accepts `/`, `/`, and `/` formats. + * @param {string} text - the ISO string to parse + * @param {Object} [opts] - options to pass {@link DateTime#fromISO} and optionally {@link Duration#fromISO} + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @return {Interval} + */ + static fromISO(text, opts) { + const [s, e] = (text || "").split("/", 2); + if (s && e) { + let start, startIsValid; + try { + start = DateTime.fromISO(s, opts); + startIsValid = start.isValid; + } catch (e) { + startIsValid = false; + } + let end, endIsValid; + try { + end = DateTime.fromISO(e, opts); + endIsValid = end.isValid; + } catch (e) { + endIsValid = false; + } + if (startIsValid && endIsValid) { + return Interval.fromDateTimes(start, end); + } + if (startIsValid) { + const dur = Duration.fromISO(e, opts); + if (dur.isValid) { + return Interval.after(start, dur); + } + } else if (endIsValid) { + const dur = Duration.fromISO(s, opts); + if (dur.isValid) { + return Interval.before(end, dur); + } + } + } + return Interval.invalid("unparsable", `the input "${text}" can't be parsed as ISO 8601`); + } + + /** + * Check if an object is an Interval. Works across context boundaries + * @param {object} o + * @return {boolean} + */ + static isInterval(o) { + return o && o.isLuxonInterval || false; + } + + /** + * Returns the start of the Interval + * @type {DateTime} + */ + get start() { + return this.isValid ? this.s : null; + } + + /** + * Returns the end of the Interval. This is the first instant which is not part of the interval + * (Interval is half-open). + * @type {DateTime} + */ + get end() { + return this.isValid ? this.e : null; + } + + /** + * Returns the last DateTime included in the interval (since end is not part of the interval) + * @type {DateTime} + */ + get lastDateTime() { + return this.isValid ? this.e ? this.e.minus(1) : null : null; + } + + /** + * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'. + * @type {boolean} + */ + get isValid() { + return this.invalidReason === null; + } + + /** + * Returns an error code if this Interval is invalid, or null if the Interval is valid + * @type {string} + */ + get invalidReason() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this Interval became invalid, or null if the Interval is valid + * @type {string} + */ + get invalidExplanation() { + return this.invalid ? this.invalid.explanation : null; + } + + /** + * Returns the length of the Interval in the specified unit. + * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in. + * @return {number} + */ + length(unit = "milliseconds") { + return this.isValid ? this.toDuration(...[unit]).get(unit) : NaN; + } + + /** + * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part. + * Unlike {@link Interval#length} this counts sections of the calendar, not periods of time, e.g. specifying 'day' + * asks 'what dates are included in this interval?', not 'how many days long is this interval?' + * @param {string} [unit='milliseconds'] - the unit of time to count. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; this operation will always use the locale of the start DateTime + * @return {number} + */ + count(unit = "milliseconds", opts) { + if (!this.isValid) return NaN; + const start = this.start.startOf(unit, opts); + let end; + if (opts != null && opts.useLocaleWeeks) { + end = this.end.reconfigure({ + locale: start.locale + }); + } else { + end = this.end; + } + end = end.startOf(unit, opts); + return Math.floor(end.diff(start, unit).get(unit)) + (end.valueOf() !== this.end.valueOf()); + } + + /** + * Returns whether this Interval's start and end are both in the same unit of time + * @param {string} unit - the unit of time to check sameness on + * @return {boolean} + */ + hasSame(unit) { + return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false; + } + + /** + * Return whether this Interval has the same start and end DateTimes. + * @return {boolean} + */ + isEmpty() { + return this.s.valueOf() === this.e.valueOf(); + } + + /** + * Return whether this Interval's start is after the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */ + isAfter(dateTime) { + if (!this.isValid) return false; + return this.s > dateTime; + } + + /** + * Return whether this Interval's end is before the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */ + isBefore(dateTime) { + if (!this.isValid) return false; + return this.e <= dateTime; + } + + /** + * Return whether this Interval contains the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */ + contains(dateTime) { + if (!this.isValid) return false; + return this.s <= dateTime && this.e > dateTime; + } + + /** + * "Sets" the start and/or end dates. Returns a newly-constructed Interval. + * @param {Object} values - the values to set + * @param {DateTime} values.start - the starting DateTime + * @param {DateTime} values.end - the ending DateTime + * @return {Interval} + */ + set({ + start, + end + } = {}) { + if (!this.isValid) return this; + return Interval.fromDateTimes(start || this.s, end || this.e); + } + + /** + * Split this Interval at each of the specified DateTimes + * @param {...DateTime} dateTimes - the unit of time to count. + * @return {Array} + */ + splitAt(...dateTimes) { + if (!this.isValid) return []; + const sorted = dateTimes.map(friendlyDateTime).filter(d => this.contains(d)).sort((a, b) => a.toMillis() - b.toMillis()), + results = []; + let { + s + } = this, + i = 0; + while (s < this.e) { + const added = sorted[i] || this.e, + next = +added > +this.e ? this.e : added; + results.push(Interval.fromDateTimes(s, next)); + s = next; + i += 1; + } + return results; + } + + /** + * Split this Interval into smaller Intervals, each of the specified length. + * Left over time is grouped into a smaller interval + * @param {Duration|Object|number} duration - The length of each resulting interval. + * @return {Array} + */ + splitBy(duration) { + const dur = Duration.fromDurationLike(duration); + if (!this.isValid || !dur.isValid || dur.as("milliseconds") === 0) { + return []; + } + let { + s + } = this, + idx = 1, + next; + const results = []; + while (s < this.e) { + const added = this.start.plus(dur.mapUnits(x => x * idx)); + next = +added > +this.e ? this.e : added; + results.push(Interval.fromDateTimes(s, next)); + s = next; + idx += 1; + } + return results; + } + + /** + * Split this Interval into the specified number of smaller intervals. + * @param {number} numberOfParts - The number of Intervals to divide the Interval into. + * @return {Array} + */ + divideEqually(numberOfParts) { + if (!this.isValid) return []; + return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts); + } + + /** + * Return whether this Interval overlaps with the specified Interval + * @param {Interval} other + * @return {boolean} + */ + overlaps(other) { + return this.e > other.s && this.s < other.e; + } + + /** + * Return whether this Interval's end is adjacent to the specified Interval's start. + * @param {Interval} other + * @return {boolean} + */ + abutsStart(other) { + if (!this.isValid) return false; + return +this.e === +other.s; + } + + /** + * Return whether this Interval's start is adjacent to the specified Interval's end. + * @param {Interval} other + * @return {boolean} + */ + abutsEnd(other) { + if (!this.isValid) return false; + return +other.e === +this.s; + } + + /** + * Returns true if this Interval fully contains the specified Interval, specifically if the intersect (of this Interval and the other Interval) is equal to the other Interval; false otherwise. + * @param {Interval} other + * @return {boolean} + */ + engulfs(other) { + if (!this.isValid) return false; + return this.s <= other.s && this.e >= other.e; + } + + /** + * Return whether this Interval has the same start and end as the specified Interval. + * @param {Interval} other + * @return {boolean} + */ + equals(other) { + if (!this.isValid || !other.isValid) { + return false; + } + return this.s.equals(other.s) && this.e.equals(other.e); + } + + /** + * Return an Interval representing the intersection of this Interval and the specified Interval. + * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals. + * Returns null if the intersection is empty, meaning, the intervals don't intersect. + * @param {Interval} other + * @return {Interval} + */ + intersection(other) { + if (!this.isValid) return this; + const s = this.s > other.s ? this.s : other.s, + e = this.e < other.e ? this.e : other.e; + if (s >= e) { + return null; + } else { + return Interval.fromDateTimes(s, e); + } + } + + /** + * Return an Interval representing the union of this Interval and the specified Interval. + * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals. + * @param {Interval} other + * @return {Interval} + */ + union(other) { + if (!this.isValid) return this; + const s = this.s < other.s ? this.s : other.s, + e = this.e > other.e ? this.e : other.e; + return Interval.fromDateTimes(s, e); + } + + /** + * Merge an array of Intervals into an equivalent minimal set of Intervals. + * Combines overlapping and adjacent Intervals. + * The resulting array will contain the Intervals in ascending order, that is, starting with the earliest Interval + * and ending with the latest. + * + * @param {Array} intervals + * @return {Array} + */ + static merge(intervals) { + const [found, final] = intervals.sort((a, b) => a.s - b.s).reduce(([sofar, current], item) => { + if (!current) { + return [sofar, item]; + } else if (current.overlaps(item) || current.abutsStart(item)) { + return [sofar, current.union(item)]; + } else { + return [sofar.concat([current]), item]; + } + }, [[], null]); + if (final) { + found.push(final); + } + return found; + } + + /** + * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals. + * @param {Array} intervals + * @return {Array} + */ + static xor(intervals) { + let start = null, + currentCount = 0; + const results = [], + ends = intervals.map(i => [{ + time: i.s, + type: "s" + }, { + time: i.e, + type: "e" + }]), + flattened = Array.prototype.concat(...ends), + arr = flattened.sort((a, b) => a.time - b.time); + for (const i of arr) { + currentCount += i.type === "s" ? 1 : -1; + if (currentCount === 1) { + start = i.time; + } else { + if (start && +start !== +i.time) { + results.push(Interval.fromDateTimes(start, i.time)); + } + start = null; + } + } + return Interval.merge(results); + } + + /** + * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals. + * @param {...Interval} intervals + * @return {Array} + */ + difference(...intervals) { + return Interval.xor([this].concat(intervals)).map(i => this.intersection(i)).filter(i => i && !i.isEmpty()); + } + + /** + * Returns a string representation of this Interval appropriate for debugging. + * @return {string} + */ + toString() { + if (!this.isValid) return INVALID$1; + return `[${this.s.toISO()} – ${this.e.toISO()})`; + } + + /** + * Returns a string representation of this Interval appropriate for the REPL. + * @return {string} + */ + [Symbol.for("nodejs.util.inspect.custom")]() { + if (this.isValid) { + return `Interval { start: ${this.s.toISO()}, end: ${this.e.toISO()} }`; + } else { + return `Interval { Invalid, reason: ${this.invalidReason} }`; + } + } + + /** + * Returns a localized string representing this Interval. Accepts the same options as the + * Intl.DateTimeFormat constructor and any presets defined by Luxon, such as + * {@link DateTime.DATE_FULL} or {@link DateTime.TIME_SIMPLE}. The exact behavior of this method + * is browser-specific, but in general it will return an appropriate representation of the + * Interval in the assigned locale. Defaults to the system's locale if no locale has been + * specified. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {Object} [formatOpts=DateTime.DATE_SHORT] - Either a DateTime preset or + * Intl.DateTimeFormat constructor options. + * @param {Object} opts - Options to override the configuration of the start DateTime. + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(); //=> 11/7/2022 – 11/8/2022 + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL); //=> November 7 – 8, 2022 + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL, { locale: 'fr-FR' }); //=> 7–8 novembre 2022 + * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString(DateTime.TIME_SIMPLE); //=> 6:00 – 8:00 PM + * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> Mon, Nov 07, 6:00 – 8:00 p + * @return {string} + */ + toLocaleString(formatOpts = DATE_SHORT, opts = {}) { + return this.isValid ? Formatter.create(this.s.loc.clone(opts), formatOpts).formatInterval(this) : INVALID$1; + } + + /** + * Returns an ISO 8601-compliant string representation of this Interval. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @param {Object} opts - The same options as {@link DateTime#toISO} + * @return {string} + */ + toISO(opts) { + if (!this.isValid) return INVALID$1; + return `${this.s.toISO(opts)}/${this.e.toISO(opts)}`; + } + + /** + * Returns an ISO 8601-compliant string representation of date of this Interval. + * The time components are ignored. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @return {string} + */ + toISODate() { + if (!this.isValid) return INVALID$1; + return `${this.s.toISODate()}/${this.e.toISODate()}`; + } + + /** + * Returns an ISO 8601-compliant string representation of time of this Interval. + * The date components are ignored. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @param {Object} opts - The same options as {@link DateTime#toISO} + * @return {string} + */ + toISOTime(opts) { + if (!this.isValid) return INVALID$1; + return `${this.s.toISOTime(opts)}/${this.e.toISOTime(opts)}`; + } + + /** + * Returns a string representation of this Interval formatted according to the specified format + * string. **You may not want this.** See {@link Interval#toLocaleString} for a more flexible + * formatting tool. + * @param {string} dateFormat - The format string. This string formats the start and end time. + * See {@link DateTime#toFormat} for details. + * @param {Object} opts - Options. + * @param {string} [opts.separator = ' – '] - A separator to place between the start and end + * representations. + * @return {string} + */ + toFormat(dateFormat, { + separator = " – " + } = {}) { + if (!this.isValid) return INVALID$1; + return `${this.s.toFormat(dateFormat)}${separator}${this.e.toFormat(dateFormat)}`; + } + + /** + * Return a Duration representing the time spanned by this interval. + * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration. + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 } + * @return {Duration} + */ + toDuration(unit, opts) { + if (!this.isValid) { + return Duration.invalid(this.invalidReason); + } + return this.e.diff(this.s, unit, opts); + } + + /** + * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes + * @param {function} mapFn + * @return {Interval} + * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC()) + * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 })) + */ + mapEndpoints(mapFn) { + return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e)); + } +} + +/** + * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment. + */ +class Info { + /** + * Return whether the specified zone contains a DST. + * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone. + * @return {boolean} + */ + static hasDST(zone = Settings.defaultZone) { + const proto = DateTime.now().setZone(zone).set({ + month: 12 + }); + return !zone.isUniversal && proto.offset !== proto.set({ + month: 6 + }).offset; + } + + /** + * Return whether the specified zone is a valid IANA specifier. + * @param {string} zone - Zone to check + * @return {boolean} + */ + static isValidIANAZone(zone) { + return IANAZone.isValidZone(zone); + } + + /** + * Converts the input into a {@link Zone} instance. + * + * * If `input` is already a Zone instance, it is returned unchanged. + * * If `input` is a string containing a valid time zone name, a Zone instance + * with that name is returned. + * * If `input` is a string that doesn't refer to a known time zone, a Zone + * instance with {@link Zone#isValid} == false is returned. + * * If `input is a number, a Zone instance with the specified fixed offset + * in minutes is returned. + * * If `input` is `null` or `undefined`, the default zone is returned. + * @param {string|Zone|number} [input] - the value to be converted + * @return {Zone} + */ + static normalizeZone(input) { + return normalizeZone(input, Settings.defaultZone); + } + + /** + * Get the weekday on which the week starts according to the given locale. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number} the start of the week, 1 for Monday through 7 for Sunday + */ + static getStartOfWeek({ + locale = null, + locObj = null + } = {}) { + return (locObj || Locale.create(locale)).getStartOfWeek(); + } + + /** + * Get the minimum number of days necessary in a week before it is considered part of the next year according + * to the given locale. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number} + */ + static getMinimumDaysInFirstWeek({ + locale = null, + locObj = null + } = {}) { + return (locObj || Locale.create(locale)).getMinDaysInFirstWeek(); + } + + /** + * Get the weekdays, which are considered the weekend according to the given locale + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number[]} an array of weekdays, 1 for Monday through 7 for Sunday + */ + static getWeekendWeekdays({ + locale = null, + locObj = null + } = {}) { + // copy the array, because we cache it internally + return (locObj || Locale.create(locale)).getWeekendDays().slice(); + } + + /** + * Return an array of standalone month names. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long" + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @param {string} [opts.outputCalendar='gregory'] - the calendar + * @example Info.months()[0] //=> 'January' + * @example Info.months('short')[0] //=> 'Jan' + * @example Info.months('numeric')[0] //=> '1' + * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.' + * @example Info.months('numeric', { locale: 'ar' })[0] //=> '١' + * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I' + * @return {Array} + */ + static months(length = "long", { + locale = null, + numberingSystem = null, + locObj = null, + outputCalendar = "gregory" + } = {}) { + return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length); + } + + /** + * Return an array of format month names. + * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that + * changes the string. + * See {@link Info#months} + * @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long" + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @param {string} [opts.outputCalendar='gregory'] - the calendar + * @return {Array} + */ + static monthsFormat(length = "long", { + locale = null, + numberingSystem = null, + locObj = null, + outputCalendar = "gregory" + } = {}) { + return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true); + } + + /** + * Return an array of standalone week names. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {string} [length='long'] - the length of the weekday representation, such as "narrow", "short", "long". + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @example Info.weekdays()[0] //=> 'Monday' + * @example Info.weekdays('short')[0] //=> 'Mon' + * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.' + * @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين' + * @return {Array} + */ + static weekdays(length = "long", { + locale = null, + numberingSystem = null, + locObj = null + } = {}) { + return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length); + } + + /** + * Return an array of format week names. + * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that + * changes the string. + * See {@link Info#weekdays} + * @param {string} [length='long'] - the length of the month representation, such as "narrow", "short", "long". + * @param {Object} opts - options + * @param {string} [opts.locale=null] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @return {Array} + */ + static weekdaysFormat(length = "long", { + locale = null, + numberingSystem = null, + locObj = null + } = {}) { + return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true); + } + + /** + * Return an array of meridiems. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @example Info.meridiems() //=> [ 'AM', 'PM' ] + * @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ] + * @return {Array} + */ + static meridiems({ + locale = null + } = {}) { + return Locale.create(locale).meridiems(); + } + + /** + * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian. + * @param {string} [length='short'] - the length of the era representation, such as "short" or "long". + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @example Info.eras() //=> [ 'BC', 'AD' ] + * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ] + * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ] + * @return {Array} + */ + static eras(length = "short", { + locale = null + } = {}) { + return Locale.create(locale, null, "gregory").eras(length); + } + + /** + * Return the set of available features in this environment. + * Some features of Luxon are not available in all environments. For example, on older browsers, relative time formatting support is not available. Use this function to figure out if that's the case. + * Keys: + * * `relative`: whether this environment supports relative time formatting + * * `localeWeek`: whether this environment supports different weekdays for the start of the week based on the locale + * @example Info.features() //=> { relative: false, localeWeek: true } + * @return {Object} + */ + static features() { + return { + relative: hasRelative(), + localeWeek: hasLocaleWeekInfo() + }; + } +} + +function dayDiff(earlier, later) { + const utcDayStart = dt => dt.toUTC(0, { + keepLocalTime: true + }).startOf("day").valueOf(), + ms = utcDayStart(later) - utcDayStart(earlier); + return Math.floor(Duration.fromMillis(ms).as("days")); +} +function highOrderDiffs(cursor, later, units) { + const differs = [["years", (a, b) => b.year - a.year], ["quarters", (a, b) => b.quarter - a.quarter + (b.year - a.year) * 4], ["months", (a, b) => b.month - a.month + (b.year - a.year) * 12], ["weeks", (a, b) => { + const days = dayDiff(a, b); + return (days - days % 7) / 7; + }], ["days", dayDiff]]; + const results = {}; + const earlier = cursor; + let lowestOrder, highWater; + + /* This loop tries to diff using larger units first. + If we overshoot, we backtrack and try the next smaller unit. + "cursor" starts out at the earlier timestamp and moves closer and closer to "later" + as we use smaller and smaller units. + highWater keeps track of where we would be if we added one more of the smallest unit, + this is used later to potentially convert any difference smaller than the smallest higher order unit + into a fraction of that smallest higher order unit + */ + for (const [unit, differ] of differs) { + if (units.indexOf(unit) >= 0) { + lowestOrder = unit; + results[unit] = differ(cursor, later); + highWater = earlier.plus(results); + if (highWater > later) { + // we overshot the end point, backtrack cursor by 1 + results[unit]--; + cursor = earlier.plus(results); + + // if we are still overshooting now, we need to backtrack again + // this happens in certain situations when diffing times in different zones, + // because this calculation ignores time zones + if (cursor > later) { + // keep the "overshot by 1" around as highWater + highWater = cursor; + // backtrack cursor by 1 + results[unit]--; + cursor = earlier.plus(results); + } + } else { + cursor = highWater; + } + } + } + return [cursor, results, highWater, lowestOrder]; +} +function diff (earlier, later, units, opts) { + let [cursor, results, highWater, lowestOrder] = highOrderDiffs(earlier, later, units); + const remainingMillis = later - cursor; + const lowerOrderUnits = units.filter(u => ["hours", "minutes", "seconds", "milliseconds"].indexOf(u) >= 0); + if (lowerOrderUnits.length === 0) { + if (highWater < later) { + highWater = cursor.plus({ + [lowestOrder]: 1 + }); + } + if (highWater !== cursor) { + results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor); + } + } + const duration = Duration.fromObject(results, opts); + if (lowerOrderUnits.length > 0) { + return Duration.fromMillis(remainingMillis, opts).shiftTo(...lowerOrderUnits).plus(duration); + } else { + return duration; + } +} + +const MISSING_FTP = "missing Intl.DateTimeFormat.formatToParts support"; +function intUnit(regex, post = i => i) { + return { + regex, + deser: ([s]) => post(parseDigits(s)) + }; +} +const NBSP = String.fromCharCode(160); +const spaceOrNBSP = `[ ${NBSP}]`; +const spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, "g"); +function fixListRegex(s) { + // make dots optional and also make them literal + // make space and non breakable space characters interchangeable + return s.replace(/\./g, "\\.?").replace(spaceOrNBSPRegExp, spaceOrNBSP); +} +function stripInsensitivities(s) { + return s.replace(/\./g, "") // ignore dots that were made optional + .replace(spaceOrNBSPRegExp, " ") // interchange space and nbsp + .toLowerCase(); +} +function oneOf(strings, startIndex) { + if (strings === null) { + return null; + } else { + return { + regex: RegExp(strings.map(fixListRegex).join("|")), + deser: ([s]) => strings.findIndex(i => stripInsensitivities(s) === stripInsensitivities(i)) + startIndex + }; + } +} +function offset(regex, groups) { + return { + regex, + deser: ([, h, m]) => signedOffset(h, m), + groups + }; +} +function simple(regex) { + return { + regex, + deser: ([s]) => s + }; +} +function escapeToken(value) { + return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); +} + +/** + * @param token + * @param {Locale} loc + */ +function unitForToken(token, loc) { + const one = digitRegex(loc), + two = digitRegex(loc, "{2}"), + three = digitRegex(loc, "{3}"), + four = digitRegex(loc, "{4}"), + six = digitRegex(loc, "{6}"), + oneOrTwo = digitRegex(loc, "{1,2}"), + oneToThree = digitRegex(loc, "{1,3}"), + oneToSix = digitRegex(loc, "{1,6}"), + oneToNine = digitRegex(loc, "{1,9}"), + twoToFour = digitRegex(loc, "{2,4}"), + fourToSix = digitRegex(loc, "{4,6}"), + literal = t => ({ + regex: RegExp(escapeToken(t.val)), + deser: ([s]) => s, + literal: true + }), + unitate = t => { + if (token.literal) { + return literal(t); + } + switch (t.val) { + // era + case "G": + return oneOf(loc.eras("short"), 0); + case "GG": + return oneOf(loc.eras("long"), 0); + // years + case "y": + return intUnit(oneToSix); + case "yy": + return intUnit(twoToFour, untruncateYear); + case "yyyy": + return intUnit(four); + case "yyyyy": + return intUnit(fourToSix); + case "yyyyyy": + return intUnit(six); + // months + case "M": + return intUnit(oneOrTwo); + case "MM": + return intUnit(two); + case "MMM": + return oneOf(loc.months("short", true), 1); + case "MMMM": + return oneOf(loc.months("long", true), 1); + case "L": + return intUnit(oneOrTwo); + case "LL": + return intUnit(two); + case "LLL": + return oneOf(loc.months("short", false), 1); + case "LLLL": + return oneOf(loc.months("long", false), 1); + // dates + case "d": + return intUnit(oneOrTwo); + case "dd": + return intUnit(two); + // ordinals + case "o": + return intUnit(oneToThree); + case "ooo": + return intUnit(three); + // time + case "HH": + return intUnit(two); + case "H": + return intUnit(oneOrTwo); + case "hh": + return intUnit(two); + case "h": + return intUnit(oneOrTwo); + case "mm": + return intUnit(two); + case "m": + return intUnit(oneOrTwo); + case "q": + return intUnit(oneOrTwo); + case "qq": + return intUnit(two); + case "s": + return intUnit(oneOrTwo); + case "ss": + return intUnit(two); + case "S": + return intUnit(oneToThree); + case "SSS": + return intUnit(three); + case "u": + return simple(oneToNine); + case "uu": + return simple(oneOrTwo); + case "uuu": + return intUnit(one); + // meridiem + case "a": + return oneOf(loc.meridiems(), 0); + // weekYear (k) + case "kkkk": + return intUnit(four); + case "kk": + return intUnit(twoToFour, untruncateYear); + // weekNumber (W) + case "W": + return intUnit(oneOrTwo); + case "WW": + return intUnit(two); + // weekdays + case "E": + case "c": + return intUnit(one); + case "EEE": + return oneOf(loc.weekdays("short", false), 1); + case "EEEE": + return oneOf(loc.weekdays("long", false), 1); + case "ccc": + return oneOf(loc.weekdays("short", true), 1); + case "cccc": + return oneOf(loc.weekdays("long", true), 1); + // offset/zone + case "Z": + case "ZZ": + return offset(new RegExp(`([+-]${oneOrTwo.source})(?::(${two.source}))?`), 2); + case "ZZZ": + return offset(new RegExp(`([+-]${oneOrTwo.source})(${two.source})?`), 2); + // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing + // because we don't have any way to figure out what they are + case "z": + return simple(/[a-z_+-/]{1,256}?/i); + // this special-case "token" represents a place where a macro-token expanded into a white-space literal + // in this case we accept any non-newline white-space + case " ": + return simple(/[^\S\n\r]/); + default: + return literal(t); + } + }; + const unit = unitate(token) || { + invalidReason: MISSING_FTP + }; + unit.token = token; + return unit; +} +const partTypeStyleToTokenVal = { + year: { + "2-digit": "yy", + numeric: "yyyyy" + }, + month: { + numeric: "M", + "2-digit": "MM", + short: "MMM", + long: "MMMM" + }, + day: { + numeric: "d", + "2-digit": "dd" + }, + weekday: { + short: "EEE", + long: "EEEE" + }, + dayperiod: "a", + dayPeriod: "a", + hour12: { + numeric: "h", + "2-digit": "hh" + }, + hour24: { + numeric: "H", + "2-digit": "HH" + }, + minute: { + numeric: "m", + "2-digit": "mm" + }, + second: { + numeric: "s", + "2-digit": "ss" + }, + timeZoneName: { + long: "ZZZZZ", + short: "ZZZ" + } +}; +function tokenForPart(part, formatOpts, resolvedOpts) { + const { + type, + value + } = part; + if (type === "literal") { + const isSpace = /^\s+$/.test(value); + return { + literal: !isSpace, + val: isSpace ? " " : value + }; + } + const style = formatOpts[type]; + + // The user might have explicitly specified hour12 or hourCycle + // if so, respect their decision + // if not, refer back to the resolvedOpts, which are based on the locale + let actualType = type; + if (type === "hour") { + if (formatOpts.hour12 != null) { + actualType = formatOpts.hour12 ? "hour12" : "hour24"; + } else if (formatOpts.hourCycle != null) { + if (formatOpts.hourCycle === "h11" || formatOpts.hourCycle === "h12") { + actualType = "hour12"; + } else { + actualType = "hour24"; + } + } else { + // tokens only differentiate between 24 hours or not, + // so we do not need to check hourCycle here, which is less supported anyways + actualType = resolvedOpts.hour12 ? "hour12" : "hour24"; + } + } + let val = partTypeStyleToTokenVal[actualType]; + if (typeof val === "object") { + val = val[style]; + } + if (val) { + return { + literal: false, + val + }; + } + return undefined; +} +function buildRegex(units) { + const re = units.map(u => u.regex).reduce((f, r) => `${f}(${r.source})`, ""); + return [`^${re}$`, units]; +} +function match(input, regex, handlers) { + const matches = input.match(regex); + if (matches) { + const all = {}; + let matchIndex = 1; + for (const i in handlers) { + if (hasOwnProperty(handlers, i)) { + const h = handlers[i], + groups = h.groups ? h.groups + 1 : 1; + if (!h.literal && h.token) { + all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups)); + } + matchIndex += groups; + } + } + return [matches, all]; + } else { + return [matches, {}]; + } +} +function dateTimeFromMatches(matches) { + const toField = token => { + switch (token) { + case "S": + return "millisecond"; + case "s": + return "second"; + case "m": + return "minute"; + case "h": + case "H": + return "hour"; + case "d": + return "day"; + case "o": + return "ordinal"; + case "L": + case "M": + return "month"; + case "y": + return "year"; + case "E": + case "c": + return "weekday"; + case "W": + return "weekNumber"; + case "k": + return "weekYear"; + case "q": + return "quarter"; + default: + return null; + } + }; + let zone = null; + let specificOffset; + if (!isUndefined(matches.z)) { + zone = IANAZone.create(matches.z); + } + if (!isUndefined(matches.Z)) { + if (!zone) { + zone = new FixedOffsetZone(matches.Z); + } + specificOffset = matches.Z; + } + if (!isUndefined(matches.q)) { + matches.M = (matches.q - 1) * 3 + 1; + } + if (!isUndefined(matches.h)) { + if (matches.h < 12 && matches.a === 1) { + matches.h += 12; + } else if (matches.h === 12 && matches.a === 0) { + matches.h = 0; + } + } + if (matches.G === 0 && matches.y) { + matches.y = -matches.y; + } + if (!isUndefined(matches.u)) { + matches.S = parseMillis(matches.u); + } + const vals = Object.keys(matches).reduce((r, k) => { + const f = toField(k); + if (f) { + r[f] = matches[k]; + } + return r; + }, {}); + return [vals, zone, specificOffset]; +} +let dummyDateTimeCache = null; +function getDummyDateTime() { + if (!dummyDateTimeCache) { + dummyDateTimeCache = DateTime.fromMillis(1555555555555); + } + return dummyDateTimeCache; +} +function maybeExpandMacroToken(token, locale) { + if (token.literal) { + return token; + } + const formatOpts = Formatter.macroTokenToFormatOpts(token.val); + const tokens = formatOptsToTokens(formatOpts, locale); + if (tokens == null || tokens.includes(undefined)) { + return token; + } + return tokens; +} +function expandMacroTokens(tokens, locale) { + return Array.prototype.concat(...tokens.map(t => maybeExpandMacroToken(t, locale))); +} + +/** + * @private + */ + +class TokenParser { + constructor(locale, format) { + this.locale = locale; + this.format = format; + this.tokens = expandMacroTokens(Formatter.parseFormat(format), locale); + this.units = this.tokens.map(t => unitForToken(t, locale)); + this.disqualifyingUnit = this.units.find(t => t.invalidReason); + if (!this.disqualifyingUnit) { + const [regexString, handlers] = buildRegex(this.units); + this.regex = RegExp(regexString, "i"); + this.handlers = handlers; + } + } + explainFromTokens(input) { + if (!this.isValid) { + return { + input, + tokens: this.tokens, + invalidReason: this.invalidReason + }; + } else { + const [rawMatches, matches] = match(input, this.regex, this.handlers), + [result, zone, specificOffset] = matches ? dateTimeFromMatches(matches) : [null, null, undefined]; + if (hasOwnProperty(matches, "a") && hasOwnProperty(matches, "H")) { + throw new ConflictingSpecificationError("Can't include meridiem when specifying 24-hour format"); + } + return { + input, + tokens: this.tokens, + regex: this.regex, + rawMatches, + matches, + result, + zone, + specificOffset + }; + } + } + get isValid() { + return !this.disqualifyingUnit; + } + get invalidReason() { + return this.disqualifyingUnit ? this.disqualifyingUnit.invalidReason : null; + } +} +function explainFromTokens(locale, input, format) { + const parser = new TokenParser(locale, format); + return parser.explainFromTokens(input); +} +function parseFromTokens(locale, input, format) { + const { + result, + zone, + specificOffset, + invalidReason + } = explainFromTokens(locale, input, format); + return [result, zone, specificOffset, invalidReason]; +} +function formatOptsToTokens(formatOpts, locale) { + if (!formatOpts) { + return null; + } + const formatter = Formatter.create(locale, formatOpts); + const df = formatter.dtFormatter(getDummyDateTime()); + const parts = df.formatToParts(); + const resolvedOpts = df.resolvedOptions(); + return parts.map(p => tokenForPart(p, formatOpts, resolvedOpts)); +} + +const INVALID = "Invalid DateTime"; +const MAX_DATE = 8.64e15; +function unsupportedZone(zone) { + return new Invalid("unsupported zone", `the zone "${zone.name}" is not supported`); +} + +// we cache week data on the DT object and this intermediates the cache +/** + * @param {DateTime} dt + */ +function possiblyCachedWeekData(dt) { + if (dt.weekData === null) { + dt.weekData = gregorianToWeek(dt.c); + } + return dt.weekData; +} + +/** + * @param {DateTime} dt + */ +function possiblyCachedLocalWeekData(dt) { + if (dt.localWeekData === null) { + dt.localWeekData = gregorianToWeek(dt.c, dt.loc.getMinDaysInFirstWeek(), dt.loc.getStartOfWeek()); + } + return dt.localWeekData; +} + +// clone really means, "make a new object with these modifications". all "setters" really use this +// to create a new object while only changing some of the properties +function clone(inst, alts) { + const current = { + ts: inst.ts, + zone: inst.zone, + c: inst.c, + o: inst.o, + loc: inst.loc, + invalid: inst.invalid + }; + return new DateTime({ + ...current, + ...alts, + old: current + }); +} + +// find the right offset a given local time. The o input is our guess, which determines which +// offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST) +function fixOffset(localTS, o, tz) { + // Our UTC time is just a guess because our offset is just a guess + let utcGuess = localTS - o * 60 * 1000; + + // Test whether the zone matches the offset for this ts + const o2 = tz.offset(utcGuess); + + // If so, offset didn't change and we're done + if (o === o2) { + return [utcGuess, o]; + } + + // If not, change the ts by the difference in the offset + utcGuess -= (o2 - o) * 60 * 1000; + + // If that gives us the local time we want, we're done + const o3 = tz.offset(utcGuess); + if (o2 === o3) { + return [utcGuess, o2]; + } + + // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time + return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)]; +} + +// convert an epoch timestamp into a calendar object with the given offset +function tsToObj(ts, offset) { + ts += offset * 60 * 1000; + const d = new Date(ts); + return { + year: d.getUTCFullYear(), + month: d.getUTCMonth() + 1, + day: d.getUTCDate(), + hour: d.getUTCHours(), + minute: d.getUTCMinutes(), + second: d.getUTCSeconds(), + millisecond: d.getUTCMilliseconds() + }; +} + +// convert a calendar object to a epoch timestamp +function objToTS(obj, offset, zone) { + return fixOffset(objToLocalTS(obj), offset, zone); +} + +// create a new DT instance by adding a duration, adjusting for DSTs +function adjustTime(inst, dur) { + const oPre = inst.o, + year = inst.c.year + Math.trunc(dur.years), + month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3, + c = { + ...inst.c, + year, + month, + day: Math.min(inst.c.day, daysInMonth(year, month)) + Math.trunc(dur.days) + Math.trunc(dur.weeks) * 7 + }, + millisToAdd = Duration.fromObject({ + years: dur.years - Math.trunc(dur.years), + quarters: dur.quarters - Math.trunc(dur.quarters), + months: dur.months - Math.trunc(dur.months), + weeks: dur.weeks - Math.trunc(dur.weeks), + days: dur.days - Math.trunc(dur.days), + hours: dur.hours, + minutes: dur.minutes, + seconds: dur.seconds, + milliseconds: dur.milliseconds + }).as("milliseconds"), + localTS = objToLocalTS(c); + let [ts, o] = fixOffset(localTS, oPre, inst.zone); + if (millisToAdd !== 0) { + ts += millisToAdd; + // that could have changed the offset by going over a DST, but we want to keep the ts the same + o = inst.zone.offset(ts); + } + return { + ts, + o + }; +} + +// helper useful in turning the results of parsing into real dates +// by handling the zone options +function parseDataToDateTime(parsed, parsedZone, opts, format, text, specificOffset) { + const { + setZone, + zone + } = opts; + if (parsed && Object.keys(parsed).length !== 0 || parsedZone) { + const interpretationZone = parsedZone || zone, + inst = DateTime.fromObject(parsed, { + ...opts, + zone: interpretationZone, + specificOffset + }); + return setZone ? inst : inst.setZone(zone); + } else { + return DateTime.invalid(new Invalid("unparsable", `the input "${text}" can't be parsed as ${format}`)); + } +} + +// if you want to output a technical format (e.g. RFC 2822), this helper +// helps handle the details +function toTechFormat(dt, format, allowZ = true) { + return dt.isValid ? Formatter.create(Locale.create("en-US"), { + allowZ, + forceSimple: true + }).formatDateTimeFromString(dt, format) : null; +} +function toISODate(o, extended, precision) { + const longFormat = o.c.year > 9999 || o.c.year < 0; + let c = ""; + if (longFormat && o.c.year >= 0) c += "+"; + c += padStart(o.c.year, longFormat ? 6 : 4); + if (precision === "year") return c; + if (extended) { + c += "-"; + c += padStart(o.c.month); + if (precision === "month") return c; + c += "-"; + } else { + c += padStart(o.c.month); + if (precision === "month") return c; + } + c += padStart(o.c.day); + return c; +} +function toISOTime(o, extended, suppressSeconds, suppressMilliseconds, includeOffset, extendedZone, precision) { + let showSeconds = !suppressSeconds || o.c.millisecond !== 0 || o.c.second !== 0, + c = ""; + switch (precision) { + case "day": + case "month": + case "year": + break; + default: + c += padStart(o.c.hour); + if (precision === "hour") break; + if (extended) { + c += ":"; + c += padStart(o.c.minute); + if (precision === "minute") break; + if (showSeconds) { + c += ":"; + c += padStart(o.c.second); + } + } else { + c += padStart(o.c.minute); + if (precision === "minute") break; + if (showSeconds) { + c += padStart(o.c.second); + } + } + if (precision === "second") break; + if (showSeconds && (!suppressMilliseconds || o.c.millisecond !== 0)) { + c += "."; + c += padStart(o.c.millisecond, 3); + } + } + if (includeOffset) { + if (o.isOffsetFixed && o.offset === 0 && !extendedZone) { + c += "Z"; + } else if (o.o < 0) { + c += "-"; + c += padStart(Math.trunc(-o.o / 60)); + c += ":"; + c += padStart(Math.trunc(-o.o % 60)); + } else { + c += "+"; + c += padStart(Math.trunc(o.o / 60)); + c += ":"; + c += padStart(Math.trunc(o.o % 60)); + } + } + if (extendedZone) { + c += "[" + o.zone.ianaName + "]"; + } + return c; +} + +// defaults for unspecified units in the supported calendars +const defaultUnitValues = { + month: 1, + day: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }, + defaultWeekUnitValues = { + weekNumber: 1, + weekday: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }, + defaultOrdinalUnitValues = { + ordinal: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }; + +// Units in the supported calendars, sorted by bigness +const orderedUnits = ["year", "month", "day", "hour", "minute", "second", "millisecond"], + orderedWeekUnits = ["weekYear", "weekNumber", "weekday", "hour", "minute", "second", "millisecond"], + orderedOrdinalUnits = ["year", "ordinal", "hour", "minute", "second", "millisecond"]; + +// standardize case and plurality in units +function normalizeUnit(unit) { + const normalized = { + year: "year", + years: "year", + month: "month", + months: "month", + day: "day", + days: "day", + hour: "hour", + hours: "hour", + minute: "minute", + minutes: "minute", + quarter: "quarter", + quarters: "quarter", + second: "second", + seconds: "second", + millisecond: "millisecond", + milliseconds: "millisecond", + weekday: "weekday", + weekdays: "weekday", + weeknumber: "weekNumber", + weeksnumber: "weekNumber", + weeknumbers: "weekNumber", + weekyear: "weekYear", + weekyears: "weekYear", + ordinal: "ordinal" + }[unit.toLowerCase()]; + if (!normalized) throw new InvalidUnitError(unit); + return normalized; +} +function normalizeUnitWithLocalWeeks(unit) { + switch (unit.toLowerCase()) { + case "localweekday": + case "localweekdays": + return "localWeekday"; + case "localweeknumber": + case "localweeknumbers": + return "localWeekNumber"; + case "localweekyear": + case "localweekyears": + return "localWeekYear"; + default: + return normalizeUnit(unit); + } +} + +// cache offsets for zones based on the current timestamp when this function is +// first called. When we are handling a datetime from components like (year, +// month, day, hour) in a time zone, we need a guess about what the timezone +// offset is so that we can convert into a UTC timestamp. One way is to find the +// offset of now in the zone. The actual date may have a different offset (for +// example, if we handle a date in June while we're in December in a zone that +// observes DST), but we can check and adjust that. +// +// When handling many dates, calculating the offset for now every time is +// expensive. It's just a guess, so we can cache the offset to use even if we +// are right on a time change boundary (we'll just correct in the other +// direction). Using a timestamp from first read is a slight optimization for +// handling dates close to the current date, since those dates will usually be +// in the same offset (we could set the timestamp statically, instead). We use a +// single timestamp for all zones to make things a bit more predictable. +// +// This is safe for quickDT (used by local() and utc()) because we don't fill in +// higher-order units from tsNow (as we do in fromObject, this requires that +// offset is calculated from tsNow). +/** + * @param {Zone} zone + * @return {number} + */ +function guessOffsetForZone(zone) { + if (zoneOffsetTs === undefined) { + zoneOffsetTs = Settings.now(); + } + + // Do not cache anything but IANA zones, because it is not safe to do so. + // Guessing an offset which is not present in the zone can cause wrong results from fixOffset + if (zone.type !== "iana") { + return zone.offset(zoneOffsetTs); + } + const zoneName = zone.name; + let offsetGuess = zoneOffsetGuessCache.get(zoneName); + if (offsetGuess === undefined) { + offsetGuess = zone.offset(zoneOffsetTs); + zoneOffsetGuessCache.set(zoneName, offsetGuess); + } + return offsetGuess; +} + +// this is a dumbed down version of fromObject() that runs about 60% faster +// but doesn't do any validation, makes a bunch of assumptions about what units +// are present, and so on. +function quickDT(obj, opts) { + const zone = normalizeZone(opts.zone, Settings.defaultZone); + if (!zone.isValid) { + return DateTime.invalid(unsupportedZone(zone)); + } + const loc = Locale.fromObject(opts); + let ts, o; + + // assume we have the higher-order units + if (!isUndefined(obj.year)) { + for (const u of orderedUnits) { + if (isUndefined(obj[u])) { + obj[u] = defaultUnitValues[u]; + } + } + const invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj); + if (invalid) { + return DateTime.invalid(invalid); + } + const offsetProvis = guessOffsetForZone(zone); + [ts, o] = objToTS(obj, offsetProvis, zone); + } else { + ts = Settings.now(); + } + return new DateTime({ + ts, + zone, + loc, + o + }); +} +function diffRelative(start, end, opts) { + const round = isUndefined(opts.round) ? true : opts.round, + rounding = isUndefined(opts.rounding) ? "trunc" : opts.rounding, + format = (c, unit) => { + c = roundTo(c, round || opts.calendary ? 0 : 2, opts.calendary ? "round" : rounding); + const formatter = end.loc.clone(opts).relFormatter(opts); + return formatter.format(c, unit); + }, + differ = unit => { + if (opts.calendary) { + if (!end.hasSame(start, unit)) { + return end.startOf(unit).diff(start.startOf(unit), unit).get(unit); + } else return 0; + } else { + return end.diff(start, unit).get(unit); + } + }; + if (opts.unit) { + return format(differ(opts.unit), opts.unit); + } + for (const unit of opts.units) { + const count = differ(unit); + if (Math.abs(count) >= 1) { + return format(count, unit); + } + } + return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]); +} +function lastOpts(argList) { + let opts = {}, + args; + if (argList.length > 0 && typeof argList[argList.length - 1] === "object") { + opts = argList[argList.length - 1]; + args = Array.from(argList).slice(0, argList.length - 1); + } else { + args = Array.from(argList); + } + return [opts, args]; +} + +/** + * Timestamp to use for cached zone offset guesses (exposed for test) + */ +let zoneOffsetTs; +/** + * Cache for zone offset guesses (exposed for test). + * + * This optimizes quickDT via guessOffsetForZone to avoid repeated calls of + * zone.offset(). + */ +const zoneOffsetGuessCache = new Map(); + +/** + * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them. + * + * A DateTime comprises of: + * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch. + * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone). + * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`. + * + * Here is a brief overview of the most commonly used functionality it provides: + * + * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link DateTime.local}, {@link DateTime.utc}, and (most flexibly) {@link DateTime.fromObject}. To create one from a standard string format, use {@link DateTime.fromISO}, {@link DateTime.fromHTTP}, and {@link DateTime.fromRFC2822}. To create one from a custom string format, use {@link DateTime.fromFormat}. To create one from a native JS date, use {@link DateTime.fromJSDate}. + * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link DateTime#toObject}), use the {@link DateTime#year}, {@link DateTime#month}, + * {@link DateTime#day}, {@link DateTime#hour}, {@link DateTime#minute}, {@link DateTime#second}, {@link DateTime#millisecond} accessors. + * * **Week calendar**: For ISO week calendar attributes, see the {@link DateTime#weekYear}, {@link DateTime#weekNumber}, and {@link DateTime#weekday} accessors. + * * **Configuration** See the {@link DateTime#locale} and {@link DateTime#numberingSystem} accessors. + * * **Transformation**: To transform the DateTime into other DateTimes, use {@link DateTime#set}, {@link DateTime#reconfigure}, {@link DateTime#setZone}, {@link DateTime#setLocale}, {@link DateTime.plus}, {@link DateTime#minus}, {@link DateTime#endOf}, {@link DateTime#startOf}, {@link DateTime#toUTC}, and {@link DateTime#toLocal}. + * * **Output**: To convert the DateTime to other representations, use the {@link DateTime#toRelative}, {@link DateTime#toRelativeCalendar}, {@link DateTime#toJSON}, {@link DateTime#toISO}, {@link DateTime#toHTTP}, {@link DateTime#toObject}, {@link DateTime#toRFC2822}, {@link DateTime#toString}, {@link DateTime#toLocaleString}, {@link DateTime#toFormat}, {@link DateTime#toMillis} and {@link DateTime#toJSDate}. + * + * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation. + */ +class DateTime { + /** + * @access private + */ + constructor(config) { + const zone = config.zone || Settings.defaultZone; + let invalid = config.invalid || (Number.isNaN(config.ts) ? new Invalid("invalid input") : null) || (!zone.isValid ? unsupportedZone(zone) : null); + /** + * @access private + */ + this.ts = isUndefined(config.ts) ? Settings.now() : config.ts; + let c = null, + o = null; + if (!invalid) { + const unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone); + if (unchanged) { + [c, o] = [config.old.c, config.old.o]; + } else { + // If an offset has been passed and we have not been called from + // clone(), we can trust it and avoid the offset calculation. + const ot = isNumber(config.o) && !config.old ? config.o : zone.offset(this.ts); + c = tsToObj(this.ts, ot); + invalid = Number.isNaN(c.year) ? new Invalid("invalid input") : null; + c = invalid ? null : c; + o = invalid ? null : ot; + } + } + + /** + * @access private + */ + this._zone = zone; + /** + * @access private + */ + this.loc = config.loc || Locale.create(); + /** + * @access private + */ + this.invalid = invalid; + /** + * @access private + */ + this.weekData = null; + /** + * @access private + */ + this.localWeekData = null; + /** + * @access private + */ + this.c = c; + /** + * @access private + */ + this.o = o; + /** + * @access private + */ + this.isLuxonDateTime = true; + } + + // CONSTRUCT + + /** + * Create a DateTime for the current instant, in the system's time zone. + * + * Use Settings to override these default values if needed. + * @example DateTime.now().toISO() //~> now in the ISO format + * @return {DateTime} + */ + static now() { + return new DateTime({}); + } + + /** + * Create a local DateTime + * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used + * @param {number} [month=1] - The month, 1-indexed + * @param {number} [day=1] - The day of the month, 1-indexed + * @param {number} [hour=0] - The hour of the day, in 24-hour time + * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59 + * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59 + * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999 + * @example DateTime.local() //~> now + * @example DateTime.local({ zone: "America/New_York" }) //~> now, in US east coast time + * @example DateTime.local(2017) //~> 2017-01-01T00:00:00 + * @example DateTime.local(2017, 3) //~> 2017-03-01T00:00:00 + * @example DateTime.local(2017, 3, 12, { locale: "fr" }) //~> 2017-03-12T00:00:00, with a French locale + * @example DateTime.local(2017, 3, 12, 5) //~> 2017-03-12T05:00:00 + * @example DateTime.local(2017, 3, 12, 5, { zone: "utc" }) //~> 2017-03-12T05:00:00, in UTC + * @example DateTime.local(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00 + * @example DateTime.local(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10 + * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765 + * @return {DateTime} + */ + static local() { + const [opts, args] = lastOpts(arguments), + [year, month, day, hour, minute, second, millisecond] = args; + return quickDT({ + year, + month, + day, + hour, + minute, + second, + millisecond + }, opts); + } + + /** + * Create a DateTime in UTC + * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used + * @param {number} [month=1] - The month, 1-indexed + * @param {number} [day=1] - The day of the month + * @param {number} [hour=0] - The hour of the day, in 24-hour time + * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59 + * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59 + * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999 + * @param {Object} options - configuration options for the DateTime + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} [options.outputCalendar] - the output calendar to set on the resulting DateTime instance + * @param {string} [options.numberingSystem] - the numbering system to set on the resulting DateTime instance + * @param {string} [options.weekSettings] - the week settings to set on the resulting DateTime instance + * @example DateTime.utc() //~> now + * @example DateTime.utc(2017) //~> 2017-01-01T00:00:00Z + * @example DateTime.utc(2017, 3) //~> 2017-03-01T00:00:00Z + * @example DateTime.utc(2017, 3, 12) //~> 2017-03-12T00:00:00Z + * @example DateTime.utc(2017, 3, 12, 5) //~> 2017-03-12T05:00:00Z + * @example DateTime.utc(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00Z + * @example DateTime.utc(2017, 3, 12, 5, 45, { locale: "fr" }) //~> 2017-03-12T05:45:00Z with a French locale + * @example DateTime.utc(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10Z + * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765, { locale: "fr" }) //~> 2017-03-12T05:45:10.765Z with a French locale + * @return {DateTime} + */ + static utc() { + const [opts, args] = lastOpts(arguments), + [year, month, day, hour, minute, second, millisecond] = args; + opts.zone = FixedOffsetZone.utcInstance; + return quickDT({ + year, + month, + day, + hour, + minute, + second, + millisecond + }, opts); + } + + /** + * Create a DateTime from a JavaScript Date object. Uses the default zone. + * @param {Date} date - a JavaScript Date object + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @return {DateTime} + */ + static fromJSDate(date, options = {}) { + const ts = isDate(date) ? date.valueOf() : NaN; + if (Number.isNaN(ts)) { + return DateTime.invalid("invalid input"); + } + const zoneToUse = normalizeZone(options.zone, Settings.defaultZone); + if (!zoneToUse.isValid) { + return DateTime.invalid(unsupportedZone(zoneToUse)); + } + return new DateTime({ + ts: ts, + zone: zoneToUse, + loc: Locale.fromObject(options) + }); + } + + /** + * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone. + * @param {number} milliseconds - a number of milliseconds since 1970 UTC + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance + * @return {DateTime} + */ + static fromMillis(milliseconds, options = {}) { + if (!isNumber(milliseconds)) { + throw new InvalidArgumentError(`fromMillis requires a numerical input, but received a ${typeof milliseconds} with value ${milliseconds}`); + } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) { + // this isn't perfect because we can still end up out of range because of additional shifting, but it's a start + return DateTime.invalid("Timestamp out of range"); + } else { + return new DateTime({ + ts: milliseconds, + zone: normalizeZone(options.zone, Settings.defaultZone), + loc: Locale.fromObject(options) + }); + } + } + + /** + * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone. + * @param {number} seconds - a number of seconds since 1970 UTC + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance + * @return {DateTime} + */ + static fromSeconds(seconds, options = {}) { + if (!isNumber(seconds)) { + throw new InvalidArgumentError("fromSeconds requires a numerical input"); + } else { + return new DateTime({ + ts: seconds * 1000, + zone: normalizeZone(options.zone, Settings.defaultZone), + loc: Locale.fromObject(options) + }); + } + } + + /** + * Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults. + * @param {Object} obj - the object to create the DateTime from + * @param {number} obj.year - a year, such as 1987 + * @param {number} obj.month - a month, 1-12 + * @param {number} obj.day - a day of the month, 1-31, depending on the month + * @param {number} obj.ordinal - day of the year, 1-365 or 366 + * @param {number} obj.weekYear - an ISO week year + * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year + * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday + * @param {number} obj.localWeekYear - a week year, according to the locale + * @param {number} obj.localWeekNumber - a week number, between 1 and 52 or 53, depending on the year, according to the locale + * @param {number} obj.localWeekday - a weekday, 1-7, where 1 is the first and 7 is the last day of the week, according to the locale + * @param {number} obj.hour - hour of the day, 0-23 + * @param {number} obj.minute - minute of the hour, 0-59 + * @param {number} obj.second - second of the minute, 0-59 + * @param {number} obj.millisecond - millisecond of the second, 0-999 + * @param {Object} opts - options for creating this DateTime + * @param {string|Zone} [opts.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone() + * @param {string} [opts.locale='system\'s locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25' + * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01' + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06 + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'utc' }), + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'local' }) + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'America/New_York' }) + * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13' + * @example DateTime.fromObject({ localWeekYear: 2022, localWeekNumber: 1, localWeekday: 1 }, { locale: "en-US" }).toISODate() //=> '2021-12-26' + * @return {DateTime} + */ + static fromObject(obj, opts = {}) { + obj = obj || {}; + const zoneToUse = normalizeZone(opts.zone, Settings.defaultZone); + if (!zoneToUse.isValid) { + return DateTime.invalid(unsupportedZone(zoneToUse)); + } + const loc = Locale.fromObject(opts); + const normalized = normalizeObject(obj, normalizeUnitWithLocalWeeks); + const { + minDaysInFirstWeek, + startOfWeek + } = usesLocalWeekValues(normalized, loc); + const tsNow = Settings.now(), + offsetProvis = !isUndefined(opts.specificOffset) ? opts.specificOffset : zoneToUse.offset(tsNow), + containsOrdinal = !isUndefined(normalized.ordinal), + containsGregorYear = !isUndefined(normalized.year), + containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), + containsGregor = containsGregorYear || containsGregorMD, + definiteWeekDef = normalized.weekYear || normalized.weekNumber; + + // cases: + // just a weekday -> this week's instance of that weekday, no worries + // (gregorian data or ordinal) + (weekYear or weekNumber) -> error + // (gregorian month or day) + ordinal -> error + // otherwise just use weeks or ordinals or gregorian, depending on what's specified + + if ((containsGregor || containsOrdinal) && definiteWeekDef) { + throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals"); + } + if (containsGregorMD && containsOrdinal) { + throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); + } + const useWeekData = definiteWeekDef || normalized.weekday && !containsGregor; + + // configure ourselves to deal with gregorian dates or week stuff + let units, + defaultValues, + objNow = tsToObj(tsNow, offsetProvis); + if (useWeekData) { + units = orderedWeekUnits; + defaultValues = defaultWeekUnitValues; + objNow = gregorianToWeek(objNow, minDaysInFirstWeek, startOfWeek); + } else if (containsOrdinal) { + units = orderedOrdinalUnits; + defaultValues = defaultOrdinalUnitValues; + objNow = gregorianToOrdinal(objNow); + } else { + units = orderedUnits; + defaultValues = defaultUnitValues; + } + + // set default values for missing stuff + let foundFirst = false; + for (const u of units) { + const v = normalized[u]; + if (!isUndefined(v)) { + foundFirst = true; + } else if (foundFirst) { + normalized[u] = defaultValues[u]; + } else { + normalized[u] = objNow[u]; + } + } + + // make sure the values we have are in range + const higherOrderInvalid = useWeekData ? hasInvalidWeekData(normalized, minDaysInFirstWeek, startOfWeek) : containsOrdinal ? hasInvalidOrdinalData(normalized) : hasInvalidGregorianData(normalized), + invalid = higherOrderInvalid || hasInvalidTimeData(normalized); + if (invalid) { + return DateTime.invalid(invalid); + } + + // compute the actual time + const gregorian = useWeekData ? weekToGregorian(normalized, minDaysInFirstWeek, startOfWeek) : containsOrdinal ? ordinalToGregorian(normalized) : normalized, + [tsFinal, offsetFinal] = objToTS(gregorian, offsetProvis, zoneToUse), + inst = new DateTime({ + ts: tsFinal, + zone: zoneToUse, + o: offsetFinal, + loc + }); + + // gregorian data + weekday serves only to validate + if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) { + return DateTime.invalid("mismatched weekday", `you can't specify both a weekday of ${normalized.weekday} and a date of ${inst.toISO()}`); + } + if (!inst.isValid) { + return DateTime.invalid(inst.invalid); + } + return inst; + } + + /** + * Create a DateTime from an ISO 8601 string + * @param {string} text - the ISO string + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance + * @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance + * @param {string} [opts.weekSettings] - the week settings to set on the resulting DateTime instance + * @example DateTime.fromISO('2016-05-25T09:08:34.123') + * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00') + * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true}) + * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'}) + * @example DateTime.fromISO('2016-W05-4') + * @return {DateTime} + */ + static fromISO(text, opts = {}) { + const [vals, parsedZone] = parseISODate(text); + return parseDataToDateTime(vals, parsedZone, opts, "ISO 8601", text); + } + + /** + * Create a DateTime from an RFC 2822 string + * @param {string} text - the RFC 2822 string + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in. + * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT') + * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600') + * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z') + * @return {DateTime} + */ + static fromRFC2822(text, opts = {}) { + const [vals, parsedZone] = parseRFC2822Date(text); + return parseDataToDateTime(vals, parsedZone, opts, "RFC 2822", text); + } + + /** + * Create a DateTime from an HTTP header date + * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 + * @param {string} text - the HTTP header date + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in. + * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods. + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT') + * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT') + * @example DateTime.fromHTTP('Sun Nov 6 08:49:37 1994') + * @return {DateTime} + */ + static fromHTTP(text, opts = {}) { + const [vals, parsedZone] = parseHTTPDate(text); + return parseDataToDateTime(vals, parsedZone, opts, "HTTP", opts); + } + + /** + * Create a DateTime from an input string and format string. + * Defaults to en-US if no locale has been specified, regardless of the system's locale. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/parsing?id=table-of-tokens). + * @param {string} text - the string to parse + * @param {string} fmt - the format the string is expected to be in (see the link below for the formats) + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale + * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @return {DateTime} + */ + static fromFormat(text, fmt, opts = {}) { + if (isUndefined(text) || isUndefined(fmt)) { + throw new InvalidArgumentError("fromFormat requires an input string and a format"); + } + const { + locale = null, + numberingSystem = null + } = opts, + localeToUse = Locale.fromOpts({ + locale, + numberingSystem, + defaultToEN: true + }), + [vals, parsedZone, specificOffset, invalid] = parseFromTokens(localeToUse, text, fmt); + if (invalid) { + return DateTime.invalid(invalid); + } else { + return parseDataToDateTime(vals, parsedZone, opts, `format ${fmt}`, text, specificOffset); + } + } + + /** + * @deprecated use fromFormat instead + */ + static fromString(text, fmt, opts = {}) { + return DateTime.fromFormat(text, fmt, opts); + } + + /** + * Create a DateTime from a SQL date, time, or datetime + * Defaults to en-US if no locale has been specified, regardless of the system's locale + * @param {string} text - the string to parse + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale + * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @example DateTime.fromSQL('2017-05-15') + * @example DateTime.fromSQL('2017-05-15 09:12:34') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true }) + * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' }) + * @example DateTime.fromSQL('09:12:34.342') + * @return {DateTime} + */ + static fromSQL(text, opts = {}) { + const [vals, parsedZone] = parseSQL(text); + return parseDataToDateTime(vals, parsedZone, opts, "SQL", text); + } + + /** + * Create an invalid DateTime. + * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent. + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {DateTime} + */ + static invalid(reason, explanation = null) { + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the DateTime is invalid"); + } + const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidDateTimeError(invalid); + } else { + return new DateTime({ + invalid + }); + } + } + + /** + * Check if an object is an instance of DateTime. Works across context boundaries + * @param {object} o + * @return {boolean} + */ + static isDateTime(o) { + return o && o.isLuxonDateTime || false; + } + + /** + * Produce the format string for a set of options + * @param formatOpts + * @param localeOpts + * @returns {string} + */ + static parseFormatForOpts(formatOpts, localeOpts = {}) { + const tokenList = formatOptsToTokens(formatOpts, Locale.fromObject(localeOpts)); + return !tokenList ? null : tokenList.map(t => t ? t.val : null).join(""); + } + + /** + * Produce the the fully expanded format token for the locale + * Does NOT quote characters, so quoted tokens will not round trip correctly + * @param fmt + * @param localeOpts + * @returns {string} + */ + static expandFormat(fmt, localeOpts = {}) { + const expanded = expandMacroTokens(Formatter.parseFormat(fmt), Locale.fromObject(localeOpts)); + return expanded.map(t => t.val).join(""); + } + static resetCache() { + zoneOffsetTs = undefined; + zoneOffsetGuessCache.clear(); + } + + // INFO + + /** + * Get the value of unit. + * @param {string} unit - a unit such as 'minute' or 'day' + * @example DateTime.local(2017, 7, 4).get('month'); //=> 7 + * @example DateTime.local(2017, 7, 4).get('day'); //=> 4 + * @return {number} + */ + get(unit) { + return this[unit]; + } + + /** + * Returns whether the DateTime is valid. Invalid DateTimes occur when: + * * The DateTime was created from invalid calendar information, such as the 13th month or February 30 + * * The DateTime was created by an operation on another invalid date + * @type {boolean} + */ + get isValid() { + return this.invalid === null; + } + + /** + * Returns an error code if this DateTime is invalid, or null if the DateTime is valid + * @type {string} + */ + get invalidReason() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid + * @type {string} + */ + get invalidExplanation() { + return this.invalid ? this.invalid.explanation : null; + } + + /** + * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime + * + * @type {string} + */ + get locale() { + return this.isValid ? this.loc.locale : null; + } + + /** + * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime + * + * @type {string} + */ + get numberingSystem() { + return this.isValid ? this.loc.numberingSystem : null; + } + + /** + * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime + * + * @type {string} + */ + get outputCalendar() { + return this.isValid ? this.loc.outputCalendar : null; + } + + /** + * Get the time zone associated with this DateTime. + * @type {Zone} + */ + get zone() { + return this._zone; + } + + /** + * Get the name of the time zone. + * @type {string} + */ + get zoneName() { + return this.isValid ? this.zone.name : null; + } + + /** + * Get the year + * @example DateTime.local(2017, 5, 25).year //=> 2017 + * @type {number} + */ + get year() { + return this.isValid ? this.c.year : NaN; + } + + /** + * Get the quarter + * @example DateTime.local(2017, 5, 25).quarter //=> 2 + * @type {number} + */ + get quarter() { + return this.isValid ? Math.ceil(this.c.month / 3) : NaN; + } + + /** + * Get the month (1-12). + * @example DateTime.local(2017, 5, 25).month //=> 5 + * @type {number} + */ + get month() { + return this.isValid ? this.c.month : NaN; + } + + /** + * Get the day of the month (1-30ish). + * @example DateTime.local(2017, 5, 25).day //=> 25 + * @type {number} + */ + get day() { + return this.isValid ? this.c.day : NaN; + } + + /** + * Get the hour of the day (0-23). + * @example DateTime.local(2017, 5, 25, 9).hour //=> 9 + * @type {number} + */ + get hour() { + return this.isValid ? this.c.hour : NaN; + } + + /** + * Get the minute of the hour (0-59). + * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30 + * @type {number} + */ + get minute() { + return this.isValid ? this.c.minute : NaN; + } + + /** + * Get the second of the minute (0-59). + * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52 + * @type {number} + */ + get second() { + return this.isValid ? this.c.second : NaN; + } + + /** + * Get the millisecond of the second (0-999). + * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654 + * @type {number} + */ + get millisecond() { + return this.isValid ? this.c.millisecond : NaN; + } + + /** + * Get the week year + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2014, 12, 31).weekYear //=> 2015 + * @type {number} + */ + get weekYear() { + return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN; + } + + /** + * Get the week number of the week year (1-52ish). + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2017, 5, 25).weekNumber //=> 21 + * @type {number} + */ + get weekNumber() { + return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN; + } + + /** + * Get the day of the week. + * 1 is Monday and 7 is Sunday + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2014, 11, 31).weekday //=> 4 + * @type {number} + */ + get weekday() { + return this.isValid ? possiblyCachedWeekData(this).weekday : NaN; + } + + /** + * Returns true if this date is on a weekend according to the locale, false otherwise + * @returns {boolean} + */ + get isWeekend() { + return this.isValid && this.loc.getWeekendDays().includes(this.weekday); + } + + /** + * Get the day of the week according to the locale. + * 1 is the first day of the week and 7 is the last day of the week. + * If the locale assigns Sunday as the first day of the week, then a date which is a Sunday will return 1, + * @returns {number} + */ + get localWeekday() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekday : NaN; + } + + /** + * Get the week number of the week year according to the locale. Different locales assign week numbers differently, + * because the week can start on different days of the week (see localWeekday) and because a different number of days + * is required for a week to count as the first week of a year. + * @returns {number} + */ + get localWeekNumber() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekNumber : NaN; + } + + /** + * Get the week year according to the locale. Different locales assign week numbers (and therefor week years) + * differently, see localWeekNumber. + * @returns {number} + */ + get localWeekYear() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekYear : NaN; + } + + /** + * Get the ordinal (meaning the day of the year) + * @example DateTime.local(2017, 5, 25).ordinal //=> 145 + * @type {number|DateTime} + */ + get ordinal() { + return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN; + } + + /** + * Get the human readable short month name, such as 'Oct'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).monthShort //=> Oct + * @type {string} + */ + get monthShort() { + return this.isValid ? Info.months("short", { + locObj: this.loc + })[this.month - 1] : null; + } + + /** + * Get the human readable long month name, such as 'October'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).monthLong //=> October + * @type {string} + */ + get monthLong() { + return this.isValid ? Info.months("long", { + locObj: this.loc + })[this.month - 1] : null; + } + + /** + * Get the human readable short weekday, such as 'Mon'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon + * @type {string} + */ + get weekdayShort() { + return this.isValid ? Info.weekdays("short", { + locObj: this.loc + })[this.weekday - 1] : null; + } + + /** + * Get the human readable long weekday, such as 'Monday'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday + * @type {string} + */ + get weekdayLong() { + return this.isValid ? Info.weekdays("long", { + locObj: this.loc + })[this.weekday - 1] : null; + } + + /** + * Get the UTC offset of this DateTime in minutes + * @example DateTime.now().offset //=> -240 + * @example DateTime.utc().offset //=> 0 + * @type {number} + */ + get offset() { + return this.isValid ? +this.o : NaN; + } + + /** + * Get the short human name for the zone's current offset, for example "EST" or "EDT". + * Defaults to the system's locale if no locale has been specified + * @type {string} + */ + get offsetNameShort() { + if (this.isValid) { + return this.zone.offsetName(this.ts, { + format: "short", + locale: this.locale + }); + } else { + return null; + } + } + + /** + * Get the long human name for the zone's current offset, for example "Eastern Standard Time" or "Eastern Daylight Time". + * Defaults to the system's locale if no locale has been specified + * @type {string} + */ + get offsetNameLong() { + if (this.isValid) { + return this.zone.offsetName(this.ts, { + format: "long", + locale: this.locale + }); + } else { + return null; + } + } + + /** + * Get whether this zone's offset ever changes, as in a DST. + * @type {boolean} + */ + get isOffsetFixed() { + return this.isValid ? this.zone.isUniversal : null; + } + + /** + * Get whether the DateTime is in a DST. + * @type {boolean} + */ + get isInDST() { + if (this.isOffsetFixed) { + return false; + } else { + return this.offset > this.set({ + month: 1, + day: 1 + }).offset || this.offset > this.set({ + month: 5 + }).offset; + } + } + + /** + * Get those DateTimes which have the same local time as this DateTime, but a different offset from UTC + * in this DateTime's zone. During DST changes local time can be ambiguous, for example + * `2023-10-29T02:30:00` in `Europe/Berlin` can have offset `+01:00` or `+02:00`. + * This method will return both possible DateTimes if this DateTime's local time is ambiguous. + * @returns {DateTime[]} + */ + getPossibleOffsets() { + if (!this.isValid || this.isOffsetFixed) { + return [this]; + } + const dayMs = 86400000; + const minuteMs = 60000; + const localTS = objToLocalTS(this.c); + const oEarlier = this.zone.offset(localTS - dayMs); + const oLater = this.zone.offset(localTS + dayMs); + const o1 = this.zone.offset(localTS - oEarlier * minuteMs); + const o2 = this.zone.offset(localTS - oLater * minuteMs); + if (o1 === o2) { + return [this]; + } + const ts1 = localTS - o1 * minuteMs; + const ts2 = localTS - o2 * minuteMs; + const c1 = tsToObj(ts1, o1); + const c2 = tsToObj(ts2, o2); + if (c1.hour === c2.hour && c1.minute === c2.minute && c1.second === c2.second && c1.millisecond === c2.millisecond) { + return [clone(this, { + ts: ts1 + }), clone(this, { + ts: ts2 + })]; + } + return [this]; + } + + /** + * Returns true if this DateTime is in a leap year, false otherwise + * @example DateTime.local(2016).isInLeapYear //=> true + * @example DateTime.local(2013).isInLeapYear //=> false + * @type {boolean} + */ + get isInLeapYear() { + return isLeapYear(this.year); + } + + /** + * Returns the number of days in this DateTime's month + * @example DateTime.local(2016, 2).daysInMonth //=> 29 + * @example DateTime.local(2016, 3).daysInMonth //=> 31 + * @type {number} + */ + get daysInMonth() { + return daysInMonth(this.year, this.month); + } + + /** + * Returns the number of days in this DateTime's year + * @example DateTime.local(2016).daysInYear //=> 366 + * @example DateTime.local(2013).daysInYear //=> 365 + * @type {number} + */ + get daysInYear() { + return this.isValid ? daysInYear(this.year) : NaN; + } + + /** + * Returns the number of weeks in this DateTime's year + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2004).weeksInWeekYear //=> 53 + * @example DateTime.local(2013).weeksInWeekYear //=> 52 + * @type {number} + */ + get weeksInWeekYear() { + return this.isValid ? weeksInWeekYear(this.weekYear) : NaN; + } + + /** + * Returns the number of weeks in this DateTime's local week year + * @example DateTime.local(2020, 6, {locale: 'en-US'}).weeksInLocalWeekYear //=> 52 + * @example DateTime.local(2020, 6, {locale: 'de-DE'}).weeksInLocalWeekYear //=> 53 + * @type {number} + */ + get weeksInLocalWeekYear() { + return this.isValid ? weeksInWeekYear(this.localWeekYear, this.loc.getMinDaysInFirstWeek(), this.loc.getStartOfWeek()) : NaN; + } + + /** + * Returns the resolved Intl options for this DateTime. + * This is useful in understanding the behavior of formatting methods + * @param {Object} opts - the same options as toLocaleString + * @return {Object} + */ + resolvedLocaleOptions(opts = {}) { + const { + locale, + numberingSystem, + calendar + } = Formatter.create(this.loc.clone(opts), opts).resolvedOptions(this); + return { + locale, + numberingSystem, + outputCalendar: calendar + }; + } + + // TRANSFORM + + /** + * "Set" the DateTime's zone to UTC. Returns a newly-constructed DateTime. + * + * Equivalent to {@link DateTime#setZone}('utc') + * @param {number} [offset=0] - optionally, an offset from UTC in minutes + * @param {Object} [opts={}] - options to pass to `setZone()` + * @return {DateTime} + */ + toUTC(offset = 0, opts = {}) { + return this.setZone(FixedOffsetZone.instance(offset), opts); + } + + /** + * "Set" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime. + * + * Equivalent to `setZone('local')` + * @return {DateTime} + */ + toLocal() { + return this.setZone(Settings.defaultZone); + } + + /** + * "Set" the DateTime's zone to specified zone. Returns a newly-constructed DateTime. + * + * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link DateTime#plus}. You may wish to use {@link DateTime#toLocal} and {@link DateTime#toUTC} which provide simple convenience wrappers for commonly used zones. + * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link DateTime#Zone} class. + * @param {Object} opts - options + * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this. + * @return {DateTime} + */ + setZone(zone, { + keepLocalTime = false, + keepCalendarTime = false + } = {}) { + zone = normalizeZone(zone, Settings.defaultZone); + if (zone.equals(this.zone)) { + return this; + } else if (!zone.isValid) { + return DateTime.invalid(unsupportedZone(zone)); + } else { + let newTS = this.ts; + if (keepLocalTime || keepCalendarTime) { + const offsetGuess = zone.offset(this.ts); + const asObj = this.toObject(); + [newTS] = objToTS(asObj, offsetGuess, zone); + } + return clone(this, { + ts: newTS, + zone + }); + } + } + + /** + * "Set" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime. + * @param {Object} properties - the properties to set + * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' }) + * @return {DateTime} + */ + reconfigure({ + locale, + numberingSystem, + outputCalendar + } = {}) { + const loc = this.loc.clone({ + locale, + numberingSystem, + outputCalendar + }); + return clone(this, { + loc + }); + } + + /** + * "Set" the locale. Returns a newly-constructed DateTime. + * Just a convenient alias for reconfigure({ locale }) + * @example DateTime.local(2017, 5, 25).setLocale('en-GB') + * @return {DateTime} + */ + setLocale(locale) { + return this.reconfigure({ + locale + }); + } + + /** + * "Set" the values of specified units. Returns a newly-constructed DateTime. + * You can only set units with this method; for "setting" metadata, see {@link DateTime#reconfigure} and {@link DateTime#setZone}. + * + * This method also supports setting locale-based week units, i.e. `localWeekday`, `localWeekNumber` and `localWeekYear`. + * They cannot be mixed with ISO-week units like `weekday`. + * @param {Object} values - a mapping of units to numbers + * @example dt.set({ year: 2017 }) + * @example dt.set({ hour: 8, minute: 30 }) + * @example dt.set({ weekday: 5 }) + * @example dt.set({ year: 2005, ordinal: 234 }) + * @return {DateTime} + */ + set(values) { + if (!this.isValid) return this; + const normalized = normalizeObject(values, normalizeUnitWithLocalWeeks); + const { + minDaysInFirstWeek, + startOfWeek + } = usesLocalWeekValues(normalized, this.loc); + const settingWeekStuff = !isUndefined(normalized.weekYear) || !isUndefined(normalized.weekNumber) || !isUndefined(normalized.weekday), + containsOrdinal = !isUndefined(normalized.ordinal), + containsGregorYear = !isUndefined(normalized.year), + containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), + containsGregor = containsGregorYear || containsGregorMD, + definiteWeekDef = normalized.weekYear || normalized.weekNumber; + if ((containsGregor || containsOrdinal) && definiteWeekDef) { + throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals"); + } + if (containsGregorMD && containsOrdinal) { + throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); + } + let mixed; + if (settingWeekStuff) { + mixed = weekToGregorian({ + ...gregorianToWeek(this.c, minDaysInFirstWeek, startOfWeek), + ...normalized + }, minDaysInFirstWeek, startOfWeek); + } else if (!isUndefined(normalized.ordinal)) { + mixed = ordinalToGregorian({ + ...gregorianToOrdinal(this.c), + ...normalized + }); + } else { + mixed = { + ...this.toObject(), + ...normalized + }; + + // if we didn't set the day but we ended up on an overflow date, + // use the last day of the right month + if (isUndefined(normalized.day)) { + mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day); + } + } + const [ts, o] = objToTS(mixed, this.o, this.zone); + return clone(this, { + ts, + o + }); + } + + /** + * Add a period of time to this DateTime and return the resulting DateTime + * + * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between. + * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @example DateTime.now().plus(123) //~> in 123 milliseconds + * @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes + * @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow + * @example DateTime.now().plus({ days: -1 }) //~> this time yesterday + * @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min + * @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min + * @return {DateTime} + */ + plus(duration) { + if (!this.isValid) return this; + const dur = Duration.fromDurationLike(duration); + return clone(this, adjustTime(this, dur)); + } + + /** + * Subtract a period of time to this DateTime and return the resulting DateTime + * See {@link DateTime#plus} + * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + @return {DateTime} + */ + minus(duration) { + if (!this.isValid) return this; + const dur = Duration.fromDurationLike(duration).negate(); + return clone(this, adjustTime(this, dur)); + } + + /** + * "Set" this DateTime to the beginning of a unit of time. + * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week + * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01' + * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01' + * @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays + * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00' + * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00' + * @return {DateTime} + */ + startOf(unit, { + useLocaleWeeks = false + } = {}) { + if (!this.isValid) return this; + const o = {}, + normalizedUnit = Duration.normalizeUnit(unit); + switch (normalizedUnit) { + case "years": + o.month = 1; + // falls through + case "quarters": + case "months": + o.day = 1; + // falls through + case "weeks": + case "days": + o.hour = 0; + // falls through + case "hours": + o.minute = 0; + // falls through + case "minutes": + o.second = 0; + // falls through + case "seconds": + o.millisecond = 0; + break; + // no default, invalid units throw in normalizeUnit() + } + + if (normalizedUnit === "weeks") { + if (useLocaleWeeks) { + const startOfWeek = this.loc.getStartOfWeek(); + const { + weekday + } = this; + if (weekday < startOfWeek) { + o.weekNumber = this.weekNumber - 1; + } + o.weekday = startOfWeek; + } else { + o.weekday = 1; + } + } + if (normalizedUnit === "quarters") { + const q = Math.ceil(this.month / 3); + o.month = (q - 1) * 3 + 1; + } + return this.set(o); + } + + /** + * "Set" this DateTime to the end (meaning the last millisecond) of a unit of time + * @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week + * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays + * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00' + * @return {DateTime} + */ + endOf(unit, opts) { + return this.isValid ? this.plus({ + [unit]: 1 + }).startOf(unit, opts).minus(1) : this; + } + + // OUTPUT + + /** + * Returns a string representation of this DateTime formatted according to the specified format string. + * **You may not want this.** See {@link DateTime#toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/formatting?id=table-of-tokens). + * Defaults to en-US if no locale has been specified, regardless of the system's locale. + * @param {string} fmt - the format string + * @param {Object} opts - opts to override the configuration options on this DateTime + * @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22' + * @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22' + * @example DateTime.now().toFormat('yyyy LLL dd', { locale: "fr" }) //=> '2017 avr. 22' + * @example DateTime.now().toFormat("HH 'hours and' mm 'minutes'") //=> '20 hours and 55 minutes' + * @return {string} + */ + toFormat(fmt, opts = {}) { + return this.isValid ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt) : INVALID; + } + + /** + * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`. + * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation + * of the DateTime in the assigned locale. + * Defaults to the system's locale if no locale has been specified + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param formatOpts {Object} - Intl.DateTimeFormat constructor options and configuration options + * @param {Object} opts - opts to override the configuration options on this DateTime + * @example DateTime.now().toLocaleString(); //=> 4/20/2017 + * @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017' + * @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017' + * @example DateTime.now().toLocaleString(DateTime.DATE_FULL, { locale: 'fr' }); //=> '28 août 2022' + * @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM' + * @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM' + * @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20' + * @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM' + * @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }); //=> '11:32' + * @return {string} + */ + toLocaleString(formatOpts = DATE_SHORT, opts = {}) { + return this.isValid ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this) : INVALID; + } + + /** + * Returns an array of format "parts", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output. + * Defaults to the system's locale if no locale has been specified + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts + * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`. + * @example DateTime.now().toLocaleParts(); //=> [ + * //=> { type: 'day', value: '25' }, + * //=> { type: 'literal', value: '/' }, + * //=> { type: 'month', value: '05' }, + * //=> { type: 'literal', value: '/' }, + * //=> { type: 'year', value: '1982' } + * //=> ] + */ + toLocaleParts(opts = {}) { + return this.isValid ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this) : []; + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.extendedZone=false] - add the time zone format extension + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'years', 'months', 'days', 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0. + * @example DateTime.utc(1983, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z' + * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00' + * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335' + * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400' + * @example DateTime.now().toISO({ precision: 'day' }) //=> '2017-04-22Z' + * @example DateTime.now().toISO({ precision: 'minute' }) //=> '2017-04-22T20:47Z' + * @return {string|null} + */ + toISO({ + format = "extended", + suppressSeconds = false, + suppressMilliseconds = false, + includeOffset = true, + extendedZone = false, + precision = "milliseconds" + } = {}) { + if (!this.isValid) { + return null; + } + precision = normalizeUnit(precision); + const ext = format === "extended"; + let c = toISODate(this, ext, precision); + if (orderedUnits.indexOf(precision) >= 3) c += "T"; + c += toISOTime(this, ext, suppressSeconds, suppressMilliseconds, includeOffset, extendedZone, precision); + return c; + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's date component + * @param {Object} opts - options + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='day'] - truncate output to desired precision: 'years', 'months', or 'days'. + * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25' + * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525' + * @example DateTime.utc(1982, 5, 25).toISODate({ precision: 'month' }) //=> '1982-05' + * @return {string|null} + */ + toISODate({ + format = "extended", + precision = "day" + } = {}) { + if (!this.isValid) { + return null; + } + return toISODate(this, format === "extended", normalizeUnit(precision)); + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's week date + * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2' + * @return {string} + */ + toISOWeekDate() { + return toTechFormat(this, "kkkk-'W'WW-c"); + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's time component + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.extendedZone=true] - add the time zone format extension + * @param {boolean} [opts.includePrefix=false] - include the `T` prefix + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0. + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z' + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34, second: 56 }).toISOTime({ precision: 'minute' }) //=> '07:34Z' + * @return {string} + */ + toISOTime({ + suppressMilliseconds = false, + suppressSeconds = false, + includeOffset = true, + includePrefix = false, + extendedZone = false, + format = "extended", + precision = "milliseconds" + } = {}) { + if (!this.isValid) { + return null; + } + precision = normalizeUnit(precision); + let c = includePrefix && orderedUnits.indexOf(precision) >= 3 ? "T" : ""; + return c + toISOTime(this, format === "extended", suppressSeconds, suppressMilliseconds, includeOffset, extendedZone, precision); + } + + /** + * Returns an RFC 2822-compatible string representation of this DateTime + * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000' + * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400' + * @return {string} + */ + toRFC2822() { + return toTechFormat(this, "EEE, dd LLL yyyy HH:mm:ss ZZZ", false); + } + + /** + * Returns a string representation of this DateTime appropriate for use in HTTP headers. The output is always expressed in GMT. + * Specifically, the string conforms to RFC 1123. + * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 + * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT' + * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT' + * @return {string} + */ + toHTTP() { + return toTechFormat(this.toUTC(), "EEE, dd LLL yyyy HH:mm:ss 'GMT'"); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL Date + * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13' + * @return {string|null} + */ + toSQLDate() { + if (!this.isValid) { + return null; + } + return toISODate(this, true); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL Time + * @param {Object} opts - options + * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset. + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00' + * @example DateTime.utc().toSQL() //=> '05:15:16.345' + * @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00' + * @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345' + * @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York' + * @return {string} + */ + toSQLTime({ + includeOffset = true, + includeZone = false, + includeOffsetSpace = true + } = {}) { + let fmt = "HH:mm:ss.SSS"; + if (includeZone || includeOffset) { + if (includeOffsetSpace) { + fmt += " "; + } + if (includeZone) { + fmt += "z"; + } else if (includeOffset) { + fmt += "ZZ"; + } + } + return toTechFormat(this, fmt, true); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL DateTime + * @param {Object} opts - options + * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset. + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00' + * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z' + * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00' + * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000' + * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York' + * @return {string} + */ + toSQL(opts = {}) { + if (!this.isValid) { + return null; + } + return `${this.toSQLDate()} ${this.toSQLTime(opts)}`; + } + + /** + * Returns a string representation of this DateTime appropriate for debugging + * @return {string} + */ + toString() { + return this.isValid ? this.toISO() : INVALID; + } + + /** + * Returns a string representation of this DateTime appropriate for the REPL. + * @return {string} + */ + [Symbol.for("nodejs.util.inspect.custom")]() { + if (this.isValid) { + return `DateTime { ts: ${this.toISO()}, zone: ${this.zone.name}, locale: ${this.locale} }`; + } else { + return `DateTime { Invalid, reason: ${this.invalidReason} }`; + } + } + + /** + * Returns the epoch milliseconds of this DateTime. Alias of {@link DateTime#toMillis} + * @return {number} + */ + valueOf() { + return this.toMillis(); + } + + /** + * Returns the epoch milliseconds of this DateTime. + * @return {number} + */ + toMillis() { + return this.isValid ? this.ts : NaN; + } + + /** + * Returns the epoch seconds (including milliseconds in the fractional part) of this DateTime. + * @return {number} + */ + toSeconds() { + return this.isValid ? this.ts / 1000 : NaN; + } + + /** + * Returns the epoch seconds (as a whole number) of this DateTime. + * @return {number} + */ + toUnixInteger() { + return this.isValid ? Math.floor(this.ts / 1000) : NaN; + } + + /** + * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON. + * @return {string} + */ + toJSON() { + return this.toISO(); + } + + /** + * Returns a BSON serializable equivalent to this DateTime. + * @return {Date} + */ + toBSON() { + return this.toJSDate(); + } + + /** + * Returns a JavaScript object with this DateTime's year, month, day, and so on. + * @param opts - options for generating the object + * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output + * @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 } + * @return {Object} + */ + toObject(opts = {}) { + if (!this.isValid) return {}; + const base = { + ...this.c + }; + if (opts.includeConfig) { + base.outputCalendar = this.outputCalendar; + base.numberingSystem = this.loc.numberingSystem; + base.locale = this.loc.locale; + } + return base; + } + + /** + * Returns a JavaScript Date equivalent to this DateTime. + * @return {Date} + */ + toJSDate() { + return new Date(this.isValid ? this.ts : NaN); + } + + // COMPARE + + /** + * Return the difference between two DateTimes as a Duration. + * @param {DateTime} otherDateTime - the DateTime to compare this one to + * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration. + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @example + * var i1 = DateTime.fromISO('1982-05-25T09:45'), + * i2 = DateTime.fromISO('1983-10-14T10:30'); + * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 } + * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 } + * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 } + * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 } + * @return {Duration} + */ + diff(otherDateTime, unit = "milliseconds", opts = {}) { + if (!this.isValid || !otherDateTime.isValid) { + return Duration.invalid("created by diffing an invalid DateTime"); + } + const durOpts = { + locale: this.locale, + numberingSystem: this.numberingSystem, + ...opts + }; + const units = maybeArray(unit).map(Duration.normalizeUnit), + otherIsLater = otherDateTime.valueOf() > this.valueOf(), + earlier = otherIsLater ? this : otherDateTime, + later = otherIsLater ? otherDateTime : this, + diffed = diff(earlier, later, units, durOpts); + return otherIsLater ? diffed.negate() : diffed; + } + + /** + * Return the difference between this DateTime and right now. + * See {@link DateTime#diff} + * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @return {Duration} + */ + diffNow(unit = "milliseconds", opts = {}) { + return this.diff(DateTime.now(), unit, opts); + } + + /** + * Return an Interval spanning between this DateTime and another DateTime + * @param {DateTime} otherDateTime - the other end point of the Interval + * @return {Interval|DateTime} + */ + until(otherDateTime) { + return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this; + } + + /** + * Return whether this DateTime is in the same unit of time as another DateTime. + * Higher-order units must also be identical for this function to return `true`. + * Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link DateTime#setZone} to convert one of the dates if needed. + * @param {DateTime} otherDateTime - the other DateTime + * @param {string} unit - the unit of time to check sameness on + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; only the locale of this DateTime is used + * @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day + * @return {boolean} + */ + hasSame(otherDateTime, unit, opts) { + if (!this.isValid) return false; + const inputMs = otherDateTime.valueOf(); + const adjustedToZone = this.setZone(otherDateTime.zone, { + keepLocalTime: true + }); + return adjustedToZone.startOf(unit, opts) <= inputMs && inputMs <= adjustedToZone.endOf(unit, opts); + } + + /** + * Equality check + * Two DateTimes are equal if and only if they represent the same millisecond, have the same zone and location, and are both valid. + * To compare just the millisecond values, use `+dt1 === +dt2`. + * @param {DateTime} other - the other DateTime + * @return {boolean} + */ + equals(other) { + return this.isValid && other.isValid && this.valueOf() === other.valueOf() && this.zone.equals(other.zone) && this.loc.equals(other.loc); + } + + /** + * Returns a string representation of a this time relative to now, such as "in two days". Can only internationalize if your + * platform supports Intl.RelativeTimeFormat. Rounds towards zero by default. + * @param {Object} options - options that affect the output + * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now. + * @param {string} [options.style="long"] - the style of units, must be "long", "short", or "narrow" + * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of "years", "quarters", "months", "weeks", "days", "hours", "minutes", or "seconds" + * @param {boolean} [options.round=true] - whether to round the numbers in the output. + * @param {string} [options.rounding="trunc"] - rounding method to use when rounding the numbers in the output. Can be "trunc" (toward zero), "expand" (away from zero), "round", "floor", or "ceil". + * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding. + * @param {string} options.locale - override the locale of this DateTime + * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this + * @example DateTime.now().plus({ days: 1 }).toRelative() //=> "in 1 day" + * @example DateTime.now().setLocale("es").toRelative({ days: 1 }) //=> "dentro de 1 día" + * @example DateTime.now().plus({ days: 1 }).toRelative({ locale: "fr" }) //=> "dans 23 heures" + * @example DateTime.now().minus({ days: 2 }).toRelative() //=> "2 days ago" + * @example DateTime.now().minus({ days: 2 }).toRelative({ unit: "hours" }) //=> "48 hours ago" + * @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> "1.5 days ago" + */ + toRelative(options = {}) { + if (!this.isValid) return null; + const base = options.base || DateTime.fromObject({}, { + zone: this.zone + }), + padding = options.padding ? this < base ? -options.padding : options.padding : 0; + let units = ["years", "months", "days", "hours", "minutes", "seconds"]; + let unit = options.unit; + if (Array.isArray(options.unit)) { + units = options.unit; + unit = undefined; + } + return diffRelative(base, this.plus(padding), { + ...options, + numeric: "always", + units, + unit + }); + } + + /** + * Returns a string representation of this date relative to today, such as "yesterday" or "next month". + * Only internationalizes on platforms that supports Intl.RelativeTimeFormat. + * @param {Object} options - options that affect the output + * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now. + * @param {string} options.locale - override the locale of this DateTime + * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of "years", "quarters", "months", "weeks", or "days" + * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this + * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> "tomorrow" + * @example DateTime.now().setLocale("es").plus({ days: 1 }).toRelative() //=> ""mañana" + * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: "fr" }) //=> "demain" + * @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> "2 days ago" + */ + toRelativeCalendar(options = {}) { + if (!this.isValid) return null; + return diffRelative(options.base || DateTime.fromObject({}, { + zone: this.zone + }), this, { + ...options, + numeric: "auto", + units: ["years", "months", "days"], + calendary: true + }); + } + + /** + * Return the min of several date times + * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum + * @return {DateTime} the min DateTime, or undefined if called with no argument + */ + static min(...dateTimes) { + if (!dateTimes.every(DateTime.isDateTime)) { + throw new InvalidArgumentError("min requires all arguments be DateTimes"); + } + return bestBy(dateTimes, i => i.valueOf(), Math.min); + } + + /** + * Return the max of several date times + * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum + * @return {DateTime} the max DateTime, or undefined if called with no argument + */ + static max(...dateTimes) { + if (!dateTimes.every(DateTime.isDateTime)) { + throw new InvalidArgumentError("max requires all arguments be DateTimes"); + } + return bestBy(dateTimes, i => i.valueOf(), Math.max); + } + + // MISC + + /** + * Explain how a string would be parsed by fromFormat() + * @param {string} text - the string to parse + * @param {string} fmt - the format the string is expected to be in (see description) + * @param {Object} options - options taken by fromFormat() + * @return {Object} + */ + static fromFormatExplain(text, fmt, options = {}) { + const { + locale = null, + numberingSystem = null + } = options, + localeToUse = Locale.fromOpts({ + locale, + numberingSystem, + defaultToEN: true + }); + return explainFromTokens(localeToUse, text, fmt); + } + + /** + * @deprecated use fromFormatExplain instead + */ + static fromStringExplain(text, fmt, options = {}) { + return DateTime.fromFormatExplain(text, fmt, options); + } + + /** + * Build a parser for `fmt` using the given locale. This parser can be passed + * to {@link DateTime.fromFormatParser} to a parse a date in this format. This + * can be used to optimize cases where many dates need to be parsed in a + * specific format. + * + * @param {String} fmt - the format the string is expected to be in (see + * description) + * @param {Object} options - options used to set locale and numberingSystem + * for parser + * @returns {TokenParser} - opaque object to be used + */ + static buildFormatParser(fmt, options = {}) { + const { + locale = null, + numberingSystem = null + } = options, + localeToUse = Locale.fromOpts({ + locale, + numberingSystem, + defaultToEN: true + }); + return new TokenParser(localeToUse, fmt); + } + + /** + * Create a DateTime from an input string and format parser. + * + * The format parser must have been created with the same locale as this call. + * + * @param {String} text - the string to parse + * @param {TokenParser} formatParser - parser from {@link DateTime.buildFormatParser} + * @param {Object} opts - options taken by fromFormat() + * @returns {DateTime} + */ + static fromFormatParser(text, formatParser, opts = {}) { + if (isUndefined(text) || isUndefined(formatParser)) { + throw new InvalidArgumentError("fromFormatParser requires an input string and a format parser"); + } + const { + locale = null, + numberingSystem = null + } = opts, + localeToUse = Locale.fromOpts({ + locale, + numberingSystem, + defaultToEN: true + }); + if (!localeToUse.equals(formatParser.locale)) { + throw new InvalidArgumentError(`fromFormatParser called with a locale of ${localeToUse}, ` + `but the format parser was created for ${formatParser.locale}`); + } + const { + result, + zone, + specificOffset, + invalidReason + } = formatParser.explainFromTokens(text); + if (invalidReason) { + return DateTime.invalid(invalidReason); + } else { + return parseDataToDateTime(result, zone, opts, `format ${formatParser.format}`, text, specificOffset); + } + } + + // FORMAT PRESETS + + /** + * {@link DateTime#toLocaleString} format like 10/14/1983 + * @type {Object} + */ + static get DATE_SHORT() { + return DATE_SHORT; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983' + * @type {Object} + */ + static get DATE_MED() { + return DATE_MED; + } + + /** + * {@link DateTime#toLocaleString} format like 'Fri, Oct 14, 1983' + * @type {Object} + */ + static get DATE_MED_WITH_WEEKDAY() { + return DATE_MED_WITH_WEEKDAY; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983' + * @type {Object} + */ + static get DATE_FULL() { + return DATE_FULL; + } + + /** + * {@link DateTime#toLocaleString} format like 'Tuesday, October 14, 1983' + * @type {Object} + */ + static get DATE_HUGE() { + return DATE_HUGE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + static get TIME_SIMPLE() { + return TIME_SIMPLE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + static get TIME_WITH_SECONDS() { + return TIME_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + static get TIME_WITH_SHORT_OFFSET() { + return TIME_WITH_SHORT_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + static get TIME_WITH_LONG_OFFSET() { + return TIME_WITH_LONG_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30', always 24-hour. + * @type {Object} + */ + static get TIME_24_SIMPLE() { + return TIME_24_SIMPLE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23', always 24-hour. + * @type {Object} + */ + static get TIME_24_WITH_SECONDS() { + return TIME_24_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 EDT', always 24-hour. + * @type {Object} + */ + static get TIME_24_WITH_SHORT_OFFSET() { + return TIME_24_WITH_SHORT_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour. + * @type {Object} + */ + static get TIME_24_WITH_LONG_OFFSET() { + return TIME_24_WITH_LONG_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_SHORT() { + return DATETIME_SHORT; + } + + /** + * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_SHORT_WITH_SECONDS() { + return DATETIME_SHORT_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_MED() { + return DATETIME_MED; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_MED_WITH_SECONDS() { + return DATETIME_MED_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_MED_WITH_WEEKDAY() { + return DATETIME_MED_WITH_WEEKDAY; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_FULL() { + return DATETIME_FULL; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_FULL_WITH_SECONDS() { + return DATETIME_FULL_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_HUGE() { + return DATETIME_HUGE; + } + + /** + * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_HUGE_WITH_SECONDS() { + return DATETIME_HUGE_WITH_SECONDS; + } +} + +/** + * @private + */ +function friendlyDateTime(dateTimeish) { + if (DateTime.isDateTime(dateTimeish)) { + return dateTimeish; + } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) { + return DateTime.fromJSDate(dateTimeish); + } else if (dateTimeish && typeof dateTimeish === "object") { + return DateTime.fromObject(dateTimeish); + } else { + throw new InvalidArgumentError(`Unknown datetime argument: ${dateTimeish}, of type ${typeof dateTimeish}`); + } +} + +const VERSION = "3.7.2"; + +exports.DateTime = DateTime; +exports.Duration = Duration; +exports.FixedOffsetZone = FixedOffsetZone; +exports.IANAZone = IANAZone; +exports.Info = Info; +exports.Interval = Interval; +exports.InvalidZone = InvalidZone; +exports.Settings = Settings; +exports.SystemZone = SystemZone; +exports.VERSION = VERSION; +exports.Zone = Zone; +//# sourceMappingURL=luxon.js.map diff --git a/node_modules/luxon/build/node/luxon.js.map b/node_modules/luxon/build/node/luxon.js.map new file mode 100644 index 00000000..bcb08350 --- /dev/null +++ b/node_modules/luxon/build/node/luxon.js.map @@ -0,0 +1 @@ +{"version":3,"file":"luxon.js","sources":["../../src/errors.js","../../src/impl/formats.js","../../src/zone.js","../../src/zones/systemZone.js","../../src/zones/IANAZone.js","../../src/impl/locale.js","../../src/zones/fixedOffsetZone.js","../../src/zones/invalidZone.js","../../src/impl/zoneUtil.js","../../src/impl/digits.js","../../src/settings.js","../../src/impl/invalid.js","../../src/impl/conversions.js","../../src/impl/util.js","../../src/impl/english.js","../../src/impl/formatter.js","../../src/impl/regexParser.js","../../src/duration.js","../../src/interval.js","../../src/info.js","../../src/impl/diff.js","../../src/impl/tokenParser.js","../../src/datetime.js","../../src/luxon.js"],"sourcesContent":["// these aren't really private, but nor are they really useful to document\n\n/**\n * @private\n */\nclass LuxonError extends Error {}\n\n/**\n * @private\n */\nexport class InvalidDateTimeError extends LuxonError {\n constructor(reason) {\n super(`Invalid DateTime: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidIntervalError extends LuxonError {\n constructor(reason) {\n super(`Invalid Interval: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidDurationError extends LuxonError {\n constructor(reason) {\n super(`Invalid Duration: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class ConflictingSpecificationError extends LuxonError {}\n\n/**\n * @private\n */\nexport class InvalidUnitError extends LuxonError {\n constructor(unit) {\n super(`Invalid unit ${unit}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidArgumentError extends LuxonError {}\n\n/**\n * @private\n */\nexport class ZoneIsAbstractError extends LuxonError {\n constructor() {\n super(\"Zone is an abstract class\");\n }\n}\n","/**\n * @private\n */\n\nconst n = \"numeric\",\n s = \"short\",\n l = \"long\";\n\nexport const DATE_SHORT = {\n year: n,\n month: n,\n day: n,\n};\n\nexport const DATE_MED = {\n year: n,\n month: s,\n day: n,\n};\n\nexport const DATE_MED_WITH_WEEKDAY = {\n year: n,\n month: s,\n day: n,\n weekday: s,\n};\n\nexport const DATE_FULL = {\n year: n,\n month: l,\n day: n,\n};\n\nexport const DATE_HUGE = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n};\n\nexport const TIME_SIMPLE = {\n hour: n,\n minute: n,\n};\n\nexport const TIME_WITH_SECONDS = {\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const TIME_WITH_SHORT_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n timeZoneName: s,\n};\n\nexport const TIME_WITH_LONG_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n timeZoneName: l,\n};\n\nexport const TIME_24_SIMPLE = {\n hour: n,\n minute: n,\n hourCycle: \"h23\",\n};\n\nexport const TIME_24_WITH_SECONDS = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n};\n\nexport const TIME_24_WITH_SHORT_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n timeZoneName: s,\n};\n\nexport const TIME_24_WITH_LONG_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n timeZoneName: l,\n};\n\nexport const DATETIME_SHORT = {\n year: n,\n month: n,\n day: n,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_SHORT_WITH_SECONDS = {\n year: n,\n month: n,\n day: n,\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const DATETIME_MED = {\n year: n,\n month: s,\n day: n,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_MED_WITH_SECONDS = {\n year: n,\n month: s,\n day: n,\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const DATETIME_MED_WITH_WEEKDAY = {\n year: n,\n month: s,\n day: n,\n weekday: s,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_FULL = {\n year: n,\n month: l,\n day: n,\n hour: n,\n minute: n,\n timeZoneName: s,\n};\n\nexport const DATETIME_FULL_WITH_SECONDS = {\n year: n,\n month: l,\n day: n,\n hour: n,\n minute: n,\n second: n,\n timeZoneName: s,\n};\n\nexport const DATETIME_HUGE = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n hour: n,\n minute: n,\n timeZoneName: l,\n};\n\nexport const DATETIME_HUGE_WITH_SECONDS = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n hour: n,\n minute: n,\n second: n,\n timeZoneName: l,\n};\n","import { ZoneIsAbstractError } from \"./errors.js\";\n\n/**\n * @interface\n */\nexport default class Zone {\n /**\n * The type of zone\n * @abstract\n * @type {string}\n */\n get type() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * The name of this zone.\n * @abstract\n * @type {string}\n */\n get name() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * The IANA name of this zone.\n * Defaults to `name` if not overwritten by a subclass.\n * @abstract\n * @type {string}\n */\n get ianaName() {\n return this.name;\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year.\n * @abstract\n * @type {boolean}\n */\n get isUniversal() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Returns the offset's common name (such as EST) at the specified timestamp\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to get the name\n * @param {Object} opts - Options to affect the format\n * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.\n * @param {string} opts.locale - What locale to return the offset name in.\n * @return {string}\n */\n offsetName(ts, opts) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Returns the offset's value as a string\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to compute the offset\n * @return {number}\n */\n offset(ts) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return whether this Zone is equal to another zone\n * @abstract\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return whether this Zone is valid.\n * @abstract\n * @type {boolean}\n */\n get isValid() {\n throw new ZoneIsAbstractError();\n }\n}\n","import { formatOffset, parseZoneInfo } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet singleton = null;\n\n/**\n * Represents the local zone for this JavaScript environment.\n * @implements {Zone}\n */\nexport default class SystemZone extends Zone {\n /**\n * Get a singleton instance of the local zone\n * @return {SystemZone}\n */\n static get instance() {\n if (singleton === null) {\n singleton = new SystemZone();\n }\n return singleton;\n }\n\n /** @override **/\n get type() {\n return \"system\";\n }\n\n /** @override **/\n get name() {\n return new Intl.DateTimeFormat().resolvedOptions().timeZone;\n }\n\n /** @override **/\n get isUniversal() {\n return false;\n }\n\n /** @override **/\n offsetName(ts, { format, locale }) {\n return parseZoneInfo(ts, format, locale);\n }\n\n /** @override **/\n formatOffset(ts, format) {\n return formatOffset(this.offset(ts), format);\n }\n\n /** @override **/\n offset(ts) {\n return -new Date(ts).getTimezoneOffset();\n }\n\n /** @override **/\n equals(otherZone) {\n return otherZone.type === \"system\";\n }\n\n /** @override **/\n get isValid() {\n return true;\n }\n}\n","import { formatOffset, parseZoneInfo, isUndefined, objToLocalTS } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nconst dtfCache = new Map();\nfunction makeDTF(zoneName) {\n let dtf = dtfCache.get(zoneName);\n if (dtf === undefined) {\n dtf = new Intl.DateTimeFormat(\"en-US\", {\n hour12: false,\n timeZone: zoneName,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n era: \"short\",\n });\n dtfCache.set(zoneName, dtf);\n }\n return dtf;\n}\n\nconst typeToPos = {\n year: 0,\n month: 1,\n day: 2,\n era: 3,\n hour: 4,\n minute: 5,\n second: 6,\n};\n\nfunction hackyOffset(dtf, date) {\n const formatted = dtf.format(date).replace(/\\u200E/g, \"\"),\n parsed = /(\\d+)\\/(\\d+)\\/(\\d+) (AD|BC),? (\\d+):(\\d+):(\\d+)/.exec(formatted),\n [, fMonth, fDay, fYear, fadOrBc, fHour, fMinute, fSecond] = parsed;\n return [fYear, fMonth, fDay, fadOrBc, fHour, fMinute, fSecond];\n}\n\nfunction partsOffset(dtf, date) {\n const formatted = dtf.formatToParts(date);\n const filled = [];\n for (let i = 0; i < formatted.length; i++) {\n const { type, value } = formatted[i];\n const pos = typeToPos[type];\n\n if (type === \"era\") {\n filled[pos] = value;\n } else if (!isUndefined(pos)) {\n filled[pos] = parseInt(value, 10);\n }\n }\n return filled;\n}\n\nconst ianaZoneCache = new Map();\n/**\n * A zone identified by an IANA identifier, like America/New_York\n * @implements {Zone}\n */\nexport default class IANAZone extends Zone {\n /**\n * @param {string} name - Zone name\n * @return {IANAZone}\n */\n static create(name) {\n let zone = ianaZoneCache.get(name);\n if (zone === undefined) {\n ianaZoneCache.set(name, (zone = new IANAZone(name)));\n }\n return zone;\n }\n\n /**\n * Reset local caches. Should only be necessary in testing scenarios.\n * @return {void}\n */\n static resetCache() {\n ianaZoneCache.clear();\n dtfCache.clear();\n }\n\n /**\n * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that.\n * @param {string} s - The string to check validity on\n * @example IANAZone.isValidSpecifier(\"America/New_York\") //=> true\n * @example IANAZone.isValidSpecifier(\"Sport~~blorp\") //=> false\n * @deprecated For backward compatibility, this forwards to isValidZone, better use `isValidZone()` directly instead.\n * @return {boolean}\n */\n static isValidSpecifier(s) {\n return this.isValidZone(s);\n }\n\n /**\n * Returns whether the provided string identifies a real zone\n * @param {string} zone - The string to check\n * @example IANAZone.isValidZone(\"America/New_York\") //=> true\n * @example IANAZone.isValidZone(\"Fantasia/Castle\") //=> false\n * @example IANAZone.isValidZone(\"Sport~~blorp\") //=> false\n * @return {boolean}\n */\n static isValidZone(zone) {\n if (!zone) {\n return false;\n }\n try {\n new Intl.DateTimeFormat(\"en-US\", { timeZone: zone }).format();\n return true;\n } catch (e) {\n return false;\n }\n }\n\n constructor(name) {\n super();\n /** @private **/\n this.zoneName = name;\n /** @private **/\n this.valid = IANAZone.isValidZone(name);\n }\n\n /**\n * The type of zone. `iana` for all instances of `IANAZone`.\n * @override\n * @type {string}\n */\n get type() {\n return \"iana\";\n }\n\n /**\n * The name of this zone (i.e. the IANA zone name).\n * @override\n * @type {string}\n */\n get name() {\n return this.zoneName;\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year:\n * Always returns false for all IANA zones.\n * @override\n * @type {boolean}\n */\n get isUniversal() {\n return false;\n }\n\n /**\n * Returns the offset's common name (such as EST) at the specified timestamp\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the name\n * @param {Object} opts - Options to affect the format\n * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.\n * @param {string} opts.locale - What locale to return the offset name in.\n * @return {string}\n */\n offsetName(ts, { format, locale }) {\n return parseZoneInfo(ts, format, locale, this.name);\n }\n\n /**\n * Returns the offset's value as a string\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n return formatOffset(this.offset(ts), format);\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n * @override\n * @param {number} ts - Epoch milliseconds for which to compute the offset\n * @return {number}\n */\n offset(ts) {\n if (!this.valid) return NaN;\n const date = new Date(ts);\n\n if (isNaN(date)) return NaN;\n\n const dtf = makeDTF(this.name);\n let [year, month, day, adOrBc, hour, minute, second] = dtf.formatToParts\n ? partsOffset(dtf, date)\n : hackyOffset(dtf, date);\n\n if (adOrBc === \"BC\") {\n year = -Math.abs(year) + 1;\n }\n\n // because we're using hour12 and https://bugs.chromium.org/p/chromium/issues/detail?id=1025564&can=2&q=%2224%3A00%22%20datetimeformat\n const adjustedHour = hour === 24 ? 0 : hour;\n\n const asUTC = objToLocalTS({\n year,\n month,\n day,\n hour: adjustedHour,\n minute,\n second,\n millisecond: 0,\n });\n\n let asTS = +date;\n const over = asTS % 1000;\n asTS -= over >= 0 ? over : 1000 + over;\n return (asUTC - asTS) / (60 * 1000);\n }\n\n /**\n * Return whether this Zone is equal to another zone\n * @override\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n return otherZone.type === \"iana\" && otherZone.name === this.name;\n }\n\n /**\n * Return whether this Zone is valid.\n * @override\n * @type {boolean}\n */\n get isValid() {\n return this.valid;\n }\n}\n","import { hasLocaleWeekInfo, hasRelative, padStart, roundTo, validateWeekSettings } from \"./util.js\";\nimport * as English from \"./english.js\";\nimport Settings from \"../settings.js\";\nimport DateTime from \"../datetime.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\n\n// todo - remap caching\n\nlet intlLFCache = {};\nfunction getCachedLF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let dtf = intlLFCache[key];\n if (!dtf) {\n dtf = new Intl.ListFormat(locString, opts);\n intlLFCache[key] = dtf;\n }\n return dtf;\n}\n\nconst intlDTCache = new Map();\nfunction getCachedDTF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let dtf = intlDTCache.get(key);\n if (dtf === undefined) {\n dtf = new Intl.DateTimeFormat(locString, opts);\n intlDTCache.set(key, dtf);\n }\n return dtf;\n}\n\nconst intlNumCache = new Map();\nfunction getCachedINF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let inf = intlNumCache.get(key);\n if (inf === undefined) {\n inf = new Intl.NumberFormat(locString, opts);\n intlNumCache.set(key, inf);\n }\n return inf;\n}\n\nconst intlRelCache = new Map();\nfunction getCachedRTF(locString, opts = {}) {\n const { base, ...cacheKeyOpts } = opts; // exclude `base` from the options\n const key = JSON.stringify([locString, cacheKeyOpts]);\n let inf = intlRelCache.get(key);\n if (inf === undefined) {\n inf = new Intl.RelativeTimeFormat(locString, opts);\n intlRelCache.set(key, inf);\n }\n return inf;\n}\n\nlet sysLocaleCache = null;\nfunction systemLocale() {\n if (sysLocaleCache) {\n return sysLocaleCache;\n } else {\n sysLocaleCache = new Intl.DateTimeFormat().resolvedOptions().locale;\n return sysLocaleCache;\n }\n}\n\nconst intlResolvedOptionsCache = new Map();\nfunction getCachedIntResolvedOptions(locString) {\n let opts = intlResolvedOptionsCache.get(locString);\n if (opts === undefined) {\n opts = new Intl.DateTimeFormat(locString).resolvedOptions();\n intlResolvedOptionsCache.set(locString, opts);\n }\n return opts;\n}\n\nconst weekInfoCache = new Map();\nfunction getCachedWeekInfo(locString) {\n let data = weekInfoCache.get(locString);\n if (!data) {\n const locale = new Intl.Locale(locString);\n // browsers currently implement this as a property, but spec says it should be a getter function\n data = \"getWeekInfo\" in locale ? locale.getWeekInfo() : locale.weekInfo;\n // minimalDays was removed from WeekInfo: https://github.com/tc39/proposal-intl-locale-info/issues/86\n if (!(\"minimalDays\" in data)) {\n data = { ...fallbackWeekSettings, ...data };\n }\n weekInfoCache.set(locString, data);\n }\n return data;\n}\n\nfunction parseLocaleString(localeStr) {\n // I really want to avoid writing a BCP 47 parser\n // see, e.g. https://github.com/wooorm/bcp-47\n // Instead, we'll do this:\n\n // a) if the string has no -u extensions, just leave it alone\n // b) if it does, use Intl to resolve everything\n // c) if Intl fails, try again without the -u\n\n // private subtags and unicode subtags have ordering requirements,\n // and we're not properly parsing this, so just strip out the\n // private ones if they exist.\n const xIndex = localeStr.indexOf(\"-x-\");\n if (xIndex !== -1) {\n localeStr = localeStr.substring(0, xIndex);\n }\n\n const uIndex = localeStr.indexOf(\"-u-\");\n if (uIndex === -1) {\n return [localeStr];\n } else {\n let options;\n let selectedStr;\n try {\n options = getCachedDTF(localeStr).resolvedOptions();\n selectedStr = localeStr;\n } catch (e) {\n const smaller = localeStr.substring(0, uIndex);\n options = getCachedDTF(smaller).resolvedOptions();\n selectedStr = smaller;\n }\n\n const { numberingSystem, calendar } = options;\n return [selectedStr, numberingSystem, calendar];\n }\n}\n\nfunction intlConfigString(localeStr, numberingSystem, outputCalendar) {\n if (outputCalendar || numberingSystem) {\n if (!localeStr.includes(\"-u-\")) {\n localeStr += \"-u\";\n }\n\n if (outputCalendar) {\n localeStr += `-ca-${outputCalendar}`;\n }\n\n if (numberingSystem) {\n localeStr += `-nu-${numberingSystem}`;\n }\n return localeStr;\n } else {\n return localeStr;\n }\n}\n\nfunction mapMonths(f) {\n const ms = [];\n for (let i = 1; i <= 12; i++) {\n const dt = DateTime.utc(2009, i, 1);\n ms.push(f(dt));\n }\n return ms;\n}\n\nfunction mapWeekdays(f) {\n const ms = [];\n for (let i = 1; i <= 7; i++) {\n const dt = DateTime.utc(2016, 11, 13 + i);\n ms.push(f(dt));\n }\n return ms;\n}\n\nfunction listStuff(loc, length, englishFn, intlFn) {\n const mode = loc.listingMode();\n\n if (mode === \"error\") {\n return null;\n } else if (mode === \"en\") {\n return englishFn(length);\n } else {\n return intlFn(length);\n }\n}\n\nfunction supportsFastNumbers(loc) {\n if (loc.numberingSystem && loc.numberingSystem !== \"latn\") {\n return false;\n } else {\n return (\n loc.numberingSystem === \"latn\" ||\n !loc.locale ||\n loc.locale.startsWith(\"en\") ||\n getCachedIntResolvedOptions(loc.locale).numberingSystem === \"latn\"\n );\n }\n}\n\n/**\n * @private\n */\n\nclass PolyNumberFormatter {\n constructor(intl, forceSimple, opts) {\n this.padTo = opts.padTo || 0;\n this.floor = opts.floor || false;\n\n const { padTo, floor, ...otherOpts } = opts;\n\n if (!forceSimple || Object.keys(otherOpts).length > 0) {\n const intlOpts = { useGrouping: false, ...opts };\n if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo;\n this.inf = getCachedINF(intl, intlOpts);\n }\n }\n\n format(i) {\n if (this.inf) {\n const fixed = this.floor ? Math.floor(i) : i;\n return this.inf.format(fixed);\n } else {\n // to match the browser's numberformatter defaults\n const fixed = this.floor ? Math.floor(i) : roundTo(i, 3);\n return padStart(fixed, this.padTo);\n }\n }\n}\n\n/**\n * @private\n */\n\nclass PolyDateFormatter {\n constructor(dt, intl, opts) {\n this.opts = opts;\n this.originalZone = undefined;\n\n let z = undefined;\n if (this.opts.timeZone) {\n // Don't apply any workarounds if a timeZone is explicitly provided in opts\n this.dt = dt;\n } else if (dt.zone.type === \"fixed\") {\n // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like.\n // That is why fixed-offset TZ is set to that unless it is:\n // 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT.\n // 2. Unsupported by the browser:\n // - some do not support Etc/\n // - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata\n const gmtOffset = -1 * (dt.offset / 60);\n const offsetZ = gmtOffset >= 0 ? `Etc/GMT+${gmtOffset}` : `Etc/GMT${gmtOffset}`;\n if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) {\n z = offsetZ;\n this.dt = dt;\n } else {\n // Not all fixed-offset zones like Etc/+4:30 are present in tzdata so\n // we manually apply the offset and substitute the zone as needed.\n z = \"UTC\";\n this.dt = dt.offset === 0 ? dt : dt.setZone(\"UTC\").plus({ minutes: dt.offset });\n this.originalZone = dt.zone;\n }\n } else if (dt.zone.type === \"system\") {\n this.dt = dt;\n } else if (dt.zone.type === \"iana\") {\n this.dt = dt;\n z = dt.zone.name;\n } else {\n // Custom zones can have any offset / offsetName so we just manually\n // apply the offset and substitute the zone as needed.\n z = \"UTC\";\n this.dt = dt.setZone(\"UTC\").plus({ minutes: dt.offset });\n this.originalZone = dt.zone;\n }\n\n const intlOpts = { ...this.opts };\n intlOpts.timeZone = intlOpts.timeZone || z;\n this.dtf = getCachedDTF(intl, intlOpts);\n }\n\n format() {\n if (this.originalZone) {\n // If we have to substitute in the actual zone name, we have to use\n // formatToParts so that the timezone can be replaced.\n return this.formatToParts()\n .map(({ value }) => value)\n .join(\"\");\n }\n return this.dtf.format(this.dt.toJSDate());\n }\n\n formatToParts() {\n const parts = this.dtf.formatToParts(this.dt.toJSDate());\n if (this.originalZone) {\n return parts.map((part) => {\n if (part.type === \"timeZoneName\") {\n const offsetName = this.originalZone.offsetName(this.dt.ts, {\n locale: this.dt.locale,\n format: this.opts.timeZoneName,\n });\n return {\n ...part,\n value: offsetName,\n };\n } else {\n return part;\n }\n });\n }\n return parts;\n }\n\n resolvedOptions() {\n return this.dtf.resolvedOptions();\n }\n}\n\n/**\n * @private\n */\nclass PolyRelFormatter {\n constructor(intl, isEnglish, opts) {\n this.opts = { style: \"long\", ...opts };\n if (!isEnglish && hasRelative()) {\n this.rtf = getCachedRTF(intl, opts);\n }\n }\n\n format(count, unit) {\n if (this.rtf) {\n return this.rtf.format(count, unit);\n } else {\n return English.formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== \"long\");\n }\n }\n\n formatToParts(count, unit) {\n if (this.rtf) {\n return this.rtf.formatToParts(count, unit);\n } else {\n return [];\n }\n }\n}\n\nconst fallbackWeekSettings = {\n firstDay: 1,\n minimalDays: 4,\n weekend: [6, 7],\n};\n\n/**\n * @private\n */\nexport default class Locale {\n static fromOpts(opts) {\n return Locale.create(\n opts.locale,\n opts.numberingSystem,\n opts.outputCalendar,\n opts.weekSettings,\n opts.defaultToEN\n );\n }\n\n static create(locale, numberingSystem, outputCalendar, weekSettings, defaultToEN = false) {\n const specifiedLocale = locale || Settings.defaultLocale;\n // the system locale is useful for human-readable strings but annoying for parsing/formatting known formats\n const localeR = specifiedLocale || (defaultToEN ? \"en-US\" : systemLocale());\n const numberingSystemR = numberingSystem || Settings.defaultNumberingSystem;\n const outputCalendarR = outputCalendar || Settings.defaultOutputCalendar;\n const weekSettingsR = validateWeekSettings(weekSettings) || Settings.defaultWeekSettings;\n return new Locale(localeR, numberingSystemR, outputCalendarR, weekSettingsR, specifiedLocale);\n }\n\n static resetCache() {\n sysLocaleCache = null;\n intlDTCache.clear();\n intlNumCache.clear();\n intlRelCache.clear();\n intlResolvedOptionsCache.clear();\n weekInfoCache.clear();\n }\n\n static fromObject({ locale, numberingSystem, outputCalendar, weekSettings } = {}) {\n return Locale.create(locale, numberingSystem, outputCalendar, weekSettings);\n }\n\n constructor(locale, numbering, outputCalendar, weekSettings, specifiedLocale) {\n const [parsedLocale, parsedNumberingSystem, parsedOutputCalendar] = parseLocaleString(locale);\n\n this.locale = parsedLocale;\n this.numberingSystem = numbering || parsedNumberingSystem || null;\n this.outputCalendar = outputCalendar || parsedOutputCalendar || null;\n this.weekSettings = weekSettings;\n this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar);\n\n this.weekdaysCache = { format: {}, standalone: {} };\n this.monthsCache = { format: {}, standalone: {} };\n this.meridiemCache = null;\n this.eraCache = {};\n\n this.specifiedLocale = specifiedLocale;\n this.fastNumbersCached = null;\n }\n\n get fastNumbers() {\n if (this.fastNumbersCached == null) {\n this.fastNumbersCached = supportsFastNumbers(this);\n }\n\n return this.fastNumbersCached;\n }\n\n listingMode() {\n const isActuallyEn = this.isEnglish();\n const hasNoWeirdness =\n (this.numberingSystem === null || this.numberingSystem === \"latn\") &&\n (this.outputCalendar === null || this.outputCalendar === \"gregory\");\n return isActuallyEn && hasNoWeirdness ? \"en\" : \"intl\";\n }\n\n clone(alts) {\n if (!alts || Object.getOwnPropertyNames(alts).length === 0) {\n return this;\n } else {\n return Locale.create(\n alts.locale || this.specifiedLocale,\n alts.numberingSystem || this.numberingSystem,\n alts.outputCalendar || this.outputCalendar,\n validateWeekSettings(alts.weekSettings) || this.weekSettings,\n alts.defaultToEN || false\n );\n }\n }\n\n redefaultToEN(alts = {}) {\n return this.clone({ ...alts, defaultToEN: true });\n }\n\n redefaultToSystem(alts = {}) {\n return this.clone({ ...alts, defaultToEN: false });\n }\n\n months(length, format = false) {\n return listStuff(this, length, English.months, () => {\n // Workaround for \"ja\" locale: formatToParts does not label all parts of the month\n // as \"month\" and for this locale there is no difference between \"format\" and \"non-format\".\n // As such, just use format() instead of formatToParts() and take the whole string\n const monthSpecialCase = this.intl === \"ja\" || this.intl.startsWith(\"ja-\");\n format &= !monthSpecialCase;\n const intl = format ? { month: length, day: \"numeric\" } : { month: length },\n formatStr = format ? \"format\" : \"standalone\";\n if (!this.monthsCache[formatStr][length]) {\n const mapper = !monthSpecialCase\n ? (dt) => this.extract(dt, intl, \"month\")\n : (dt) => this.dtFormatter(dt, intl).format();\n this.monthsCache[formatStr][length] = mapMonths(mapper);\n }\n return this.monthsCache[formatStr][length];\n });\n }\n\n weekdays(length, format = false) {\n return listStuff(this, length, English.weekdays, () => {\n const intl = format\n ? { weekday: length, year: \"numeric\", month: \"long\", day: \"numeric\" }\n : { weekday: length },\n formatStr = format ? \"format\" : \"standalone\";\n if (!this.weekdaysCache[formatStr][length]) {\n this.weekdaysCache[formatStr][length] = mapWeekdays((dt) =>\n this.extract(dt, intl, \"weekday\")\n );\n }\n return this.weekdaysCache[formatStr][length];\n });\n }\n\n meridiems() {\n return listStuff(\n this,\n undefined,\n () => English.meridiems,\n () => {\n // In theory there could be aribitrary day periods. We're gonna assume there are exactly two\n // for AM and PM. This is probably wrong, but it's makes parsing way easier.\n if (!this.meridiemCache) {\n const intl = { hour: \"numeric\", hourCycle: \"h12\" };\n this.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map(\n (dt) => this.extract(dt, intl, \"dayperiod\")\n );\n }\n\n return this.meridiemCache;\n }\n );\n }\n\n eras(length) {\n return listStuff(this, length, English.eras, () => {\n const intl = { era: length };\n\n // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates\n // to definitely enumerate them.\n if (!this.eraCache[length]) {\n this.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map((dt) =>\n this.extract(dt, intl, \"era\")\n );\n }\n\n return this.eraCache[length];\n });\n }\n\n extract(dt, intlOpts, field) {\n const df = this.dtFormatter(dt, intlOpts),\n results = df.formatToParts(),\n matching = results.find((m) => m.type.toLowerCase() === field);\n return matching ? matching.value : null;\n }\n\n numberFormatter(opts = {}) {\n // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave)\n // (in contrast, the rest of the condition is used heavily)\n return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts);\n }\n\n dtFormatter(dt, intlOpts = {}) {\n return new PolyDateFormatter(dt, this.intl, intlOpts);\n }\n\n relFormatter(opts = {}) {\n return new PolyRelFormatter(this.intl, this.isEnglish(), opts);\n }\n\n listFormatter(opts = {}) {\n return getCachedLF(this.intl, opts);\n }\n\n isEnglish() {\n return (\n this.locale === \"en\" ||\n this.locale.toLowerCase() === \"en-us\" ||\n getCachedIntResolvedOptions(this.intl).locale.startsWith(\"en-us\")\n );\n }\n\n getWeekSettings() {\n if (this.weekSettings) {\n return this.weekSettings;\n } else if (!hasLocaleWeekInfo()) {\n return fallbackWeekSettings;\n } else {\n return getCachedWeekInfo(this.locale);\n }\n }\n\n getStartOfWeek() {\n return this.getWeekSettings().firstDay;\n }\n\n getMinDaysInFirstWeek() {\n return this.getWeekSettings().minimalDays;\n }\n\n getWeekendDays() {\n return this.getWeekSettings().weekend;\n }\n\n equals(other) {\n return (\n this.locale === other.locale &&\n this.numberingSystem === other.numberingSystem &&\n this.outputCalendar === other.outputCalendar\n );\n }\n\n toString() {\n return `Locale(${this.locale}, ${this.numberingSystem}, ${this.outputCalendar})`;\n }\n}\n","import { formatOffset, signedOffset } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet singleton = null;\n\n/**\n * A zone with a fixed offset (meaning no DST)\n * @implements {Zone}\n */\nexport default class FixedOffsetZone extends Zone {\n /**\n * Get a singleton instance of UTC\n * @return {FixedOffsetZone}\n */\n static get utcInstance() {\n if (singleton === null) {\n singleton = new FixedOffsetZone(0);\n }\n return singleton;\n }\n\n /**\n * Get an instance with a specified offset\n * @param {number} offset - The offset in minutes\n * @return {FixedOffsetZone}\n */\n static instance(offset) {\n return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset);\n }\n\n /**\n * Get an instance of FixedOffsetZone from a UTC offset string, like \"UTC+6\"\n * @param {string} s - The offset string to parse\n * @example FixedOffsetZone.parseSpecifier(\"UTC+6\")\n * @example FixedOffsetZone.parseSpecifier(\"UTC+06\")\n * @example FixedOffsetZone.parseSpecifier(\"UTC-6:00\")\n * @return {FixedOffsetZone}\n */\n static parseSpecifier(s) {\n if (s) {\n const r = s.match(/^utc(?:([+-]\\d{1,2})(?::(\\d{2}))?)?$/i);\n if (r) {\n return new FixedOffsetZone(signedOffset(r[1], r[2]));\n }\n }\n return null;\n }\n\n constructor(offset) {\n super();\n /** @private **/\n this.fixed = offset;\n }\n\n /**\n * The type of zone. `fixed` for all instances of `FixedOffsetZone`.\n * @override\n * @type {string}\n */\n get type() {\n return \"fixed\";\n }\n\n /**\n * The name of this zone.\n * All fixed zones' names always start with \"UTC\" (plus optional offset)\n * @override\n * @type {string}\n */\n get name() {\n return this.fixed === 0 ? \"UTC\" : `UTC${formatOffset(this.fixed, \"narrow\")}`;\n }\n\n /**\n * The IANA name of this zone, i.e. `Etc/UTC` or `Etc/GMT+/-nn`\n *\n * @override\n * @type {string}\n */\n get ianaName() {\n if (this.fixed === 0) {\n return \"Etc/UTC\";\n } else {\n return `Etc/GMT${formatOffset(-this.fixed, \"narrow\")}`;\n }\n }\n\n /**\n * Returns the offset's common name at the specified timestamp.\n *\n * For fixed offset zones this equals to the zone name.\n * @override\n */\n offsetName() {\n return this.name;\n }\n\n /**\n * Returns the offset's value as a string\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n return formatOffset(this.fixed, format);\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year:\n * Always returns true for all fixed offset zones.\n * @override\n * @type {boolean}\n */\n get isUniversal() {\n return true;\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n *\n * For fixed offset zones, this is constant and does not depend on a timestamp.\n * @override\n * @return {number}\n */\n offset() {\n return this.fixed;\n }\n\n /**\n * Return whether this Zone is equal to another zone (i.e. also fixed and same offset)\n * @override\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n return otherZone.type === \"fixed\" && otherZone.fixed === this.fixed;\n }\n\n /**\n * Return whether this Zone is valid:\n * All fixed offset zones are valid.\n * @override\n * @type {boolean}\n */\n get isValid() {\n return true;\n }\n}\n","import Zone from \"../zone.js\";\n\n/**\n * A zone that failed to parse. You should never need to instantiate this.\n * @implements {Zone}\n */\nexport default class InvalidZone extends Zone {\n constructor(zoneName) {\n super();\n /** @private */\n this.zoneName = zoneName;\n }\n\n /** @override **/\n get type() {\n return \"invalid\";\n }\n\n /** @override **/\n get name() {\n return this.zoneName;\n }\n\n /** @override **/\n get isUniversal() {\n return false;\n }\n\n /** @override **/\n offsetName() {\n return null;\n }\n\n /** @override **/\n formatOffset() {\n return \"\";\n }\n\n /** @override **/\n offset() {\n return NaN;\n }\n\n /** @override **/\n equals() {\n return false;\n }\n\n /** @override **/\n get isValid() {\n return false;\n }\n}\n","/**\n * @private\n */\n\nimport Zone from \"../zone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport InvalidZone from \"../zones/invalidZone.js\";\n\nimport { isUndefined, isString, isNumber } from \"./util.js\";\nimport SystemZone from \"../zones/systemZone.js\";\n\nexport function normalizeZone(input, defaultZone) {\n let offset;\n if (isUndefined(input) || input === null) {\n return defaultZone;\n } else if (input instanceof Zone) {\n return input;\n } else if (isString(input)) {\n const lowered = input.toLowerCase();\n if (lowered === \"default\") return defaultZone;\n else if (lowered === \"local\" || lowered === \"system\") return SystemZone.instance;\n else if (lowered === \"utc\" || lowered === \"gmt\") return FixedOffsetZone.utcInstance;\n else return FixedOffsetZone.parseSpecifier(lowered) || IANAZone.create(input);\n } else if (isNumber(input)) {\n return FixedOffsetZone.instance(input);\n } else if (typeof input === \"object\" && \"offset\" in input && typeof input.offset === \"function\") {\n // This is dumb, but the instanceof check above doesn't seem to really work\n // so we're duck checking it\n return input;\n } else {\n return new InvalidZone(input);\n }\n}\n","const numberingSystems = {\n arab: \"[\\u0660-\\u0669]\",\n arabext: \"[\\u06F0-\\u06F9]\",\n bali: \"[\\u1B50-\\u1B59]\",\n beng: \"[\\u09E6-\\u09EF]\",\n deva: \"[\\u0966-\\u096F]\",\n fullwide: \"[\\uFF10-\\uFF19]\",\n gujr: \"[\\u0AE6-\\u0AEF]\",\n hanidec: \"[〇|一|二|三|四|五|六|七|八|九]\",\n khmr: \"[\\u17E0-\\u17E9]\",\n knda: \"[\\u0CE6-\\u0CEF]\",\n laoo: \"[\\u0ED0-\\u0ED9]\",\n limb: \"[\\u1946-\\u194F]\",\n mlym: \"[\\u0D66-\\u0D6F]\",\n mong: \"[\\u1810-\\u1819]\",\n mymr: \"[\\u1040-\\u1049]\",\n orya: \"[\\u0B66-\\u0B6F]\",\n tamldec: \"[\\u0BE6-\\u0BEF]\",\n telu: \"[\\u0C66-\\u0C6F]\",\n thai: \"[\\u0E50-\\u0E59]\",\n tibt: \"[\\u0F20-\\u0F29]\",\n latn: \"\\\\d\",\n};\n\nconst numberingSystemsUTF16 = {\n arab: [1632, 1641],\n arabext: [1776, 1785],\n bali: [6992, 7001],\n beng: [2534, 2543],\n deva: [2406, 2415],\n fullwide: [65296, 65303],\n gujr: [2790, 2799],\n khmr: [6112, 6121],\n knda: [3302, 3311],\n laoo: [3792, 3801],\n limb: [6470, 6479],\n mlym: [3430, 3439],\n mong: [6160, 6169],\n mymr: [4160, 4169],\n orya: [2918, 2927],\n tamldec: [3046, 3055],\n telu: [3174, 3183],\n thai: [3664, 3673],\n tibt: [3872, 3881],\n};\n\nconst hanidecChars = numberingSystems.hanidec.replace(/[\\[|\\]]/g, \"\").split(\"\");\n\nexport function parseDigits(str) {\n let value = parseInt(str, 10);\n if (isNaN(value)) {\n value = \"\";\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n\n if (str[i].search(numberingSystems.hanidec) !== -1) {\n value += hanidecChars.indexOf(str[i]);\n } else {\n for (const key in numberingSystemsUTF16) {\n const [min, max] = numberingSystemsUTF16[key];\n if (code >= min && code <= max) {\n value += code - min;\n }\n }\n }\n }\n return parseInt(value, 10);\n } else {\n return value;\n }\n}\n\n// cache of {numberingSystem: {append: regex}}\nconst digitRegexCache = new Map();\nexport function resetDigitRegexCache() {\n digitRegexCache.clear();\n}\n\nexport function digitRegex({ numberingSystem }, append = \"\") {\n const ns = numberingSystem || \"latn\";\n\n let appendCache = digitRegexCache.get(ns);\n if (appendCache === undefined) {\n appendCache = new Map();\n digitRegexCache.set(ns, appendCache);\n }\n let regex = appendCache.get(append);\n if (regex === undefined) {\n regex = new RegExp(`${numberingSystems[ns]}${append}`);\n appendCache.set(append, regex);\n }\n\n return regex;\n}\n","import SystemZone from \"./zones/systemZone.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport Locale from \"./impl/locale.js\";\nimport DateTime from \"./datetime.js\";\n\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\nimport { validateWeekSettings } from \"./impl/util.js\";\nimport { resetDigitRegexCache } from \"./impl/digits.js\";\n\nlet now = () => Date.now(),\n defaultZone = \"system\",\n defaultLocale = null,\n defaultNumberingSystem = null,\n defaultOutputCalendar = null,\n twoDigitCutoffYear = 60,\n throwOnInvalid,\n defaultWeekSettings = null;\n\n/**\n * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here.\n */\nexport default class Settings {\n /**\n * Get the callback for returning the current timestamp.\n * @type {function}\n */\n static get now() {\n return now;\n }\n\n /**\n * Set the callback for returning the current timestamp.\n * The function should return a number, which will be interpreted as an Epoch millisecond count\n * @type {function}\n * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future\n * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time\n */\n static set now(n) {\n now = n;\n }\n\n /**\n * Set the default time zone to create DateTimes in. Does not affect existing instances.\n * Use the value \"system\" to reset this value to the system's time zone.\n * @type {string}\n */\n static set defaultZone(zone) {\n defaultZone = zone;\n }\n\n /**\n * Get the default time zone object currently used to create DateTimes. Does not affect existing instances.\n * The default value is the system's time zone (the one set on the machine that runs this code).\n * @type {Zone}\n */\n static get defaultZone() {\n return normalizeZone(defaultZone, SystemZone.instance);\n }\n\n /**\n * Get the default locale to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultLocale() {\n return defaultLocale;\n }\n\n /**\n * Set the default locale to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultLocale(locale) {\n defaultLocale = locale;\n }\n\n /**\n * Get the default numbering system to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultNumberingSystem() {\n return defaultNumberingSystem;\n }\n\n /**\n * Set the default numbering system to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultNumberingSystem(numberingSystem) {\n defaultNumberingSystem = numberingSystem;\n }\n\n /**\n * Get the default output calendar to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultOutputCalendar() {\n return defaultOutputCalendar;\n }\n\n /**\n * Set the default output calendar to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultOutputCalendar(outputCalendar) {\n defaultOutputCalendar = outputCalendar;\n }\n\n /**\n * @typedef {Object} WeekSettings\n * @property {number} firstDay\n * @property {number} minimalDays\n * @property {number[]} weekend\n */\n\n /**\n * @return {WeekSettings|null}\n */\n static get defaultWeekSettings() {\n return defaultWeekSettings;\n }\n\n /**\n * Allows overriding the default locale week settings, i.e. the start of the week, the weekend and\n * how many days are required in the first week of a year.\n * Does not affect existing instances.\n *\n * @param {WeekSettings|null} weekSettings\n */\n static set defaultWeekSettings(weekSettings) {\n defaultWeekSettings = validateWeekSettings(weekSettings);\n }\n\n /**\n * Get the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx.\n * @type {number}\n */\n static get twoDigitCutoffYear() {\n return twoDigitCutoffYear;\n }\n\n /**\n * Set the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx.\n * @type {number}\n * @example Settings.twoDigitCutoffYear = 0 // all 'yy' are interpreted as 20th century\n * @example Settings.twoDigitCutoffYear = 99 // all 'yy' are interpreted as 21st century\n * @example Settings.twoDigitCutoffYear = 50 // '49' -> 2049; '50' -> 1950\n * @example Settings.twoDigitCutoffYear = 1950 // interpreted as 50\n * @example Settings.twoDigitCutoffYear = 2050 // ALSO interpreted as 50\n */\n static set twoDigitCutoffYear(cutoffYear) {\n twoDigitCutoffYear = cutoffYear % 100;\n }\n\n /**\n * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n * @type {boolean}\n */\n static get throwOnInvalid() {\n return throwOnInvalid;\n }\n\n /**\n * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n * @type {boolean}\n */\n static set throwOnInvalid(t) {\n throwOnInvalid = t;\n }\n\n /**\n * Reset Luxon's global caches. Should only be necessary in testing scenarios.\n * @return {void}\n */\n static resetCaches() {\n Locale.resetCache();\n IANAZone.resetCache();\n DateTime.resetCache();\n resetDigitRegexCache();\n }\n}\n","export default class Invalid {\n constructor(reason, explanation) {\n this.reason = reason;\n this.explanation = explanation;\n }\n\n toMessage() {\n if (this.explanation) {\n return `${this.reason}: ${this.explanation}`;\n } else {\n return this.reason;\n }\n }\n}\n","import {\n integerBetween,\n isLeapYear,\n timeObject,\n daysInYear,\n daysInMonth,\n weeksInWeekYear,\n isInteger,\n isUndefined,\n} from \"./util.js\";\nimport Invalid from \"./invalid.js\";\nimport { ConflictingSpecificationError } from \"../errors.js\";\n\nconst nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334],\n leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335];\n\nfunction unitOutOfRange(unit, value) {\n return new Invalid(\n \"unit out of range\",\n `you specified ${value} (of type ${typeof value}) as a ${unit}, which is invalid`\n );\n}\n\nexport function dayOfWeek(year, month, day) {\n const d = new Date(Date.UTC(year, month - 1, day));\n\n if (year < 100 && year >= 0) {\n d.setUTCFullYear(d.getUTCFullYear() - 1900);\n }\n\n const js = d.getUTCDay();\n\n return js === 0 ? 7 : js;\n}\n\nfunction computeOrdinal(year, month, day) {\n return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1];\n}\n\nfunction uncomputeOrdinal(year, ordinal) {\n const table = isLeapYear(year) ? leapLadder : nonLeapLadder,\n month0 = table.findIndex((i) => i < ordinal),\n day = ordinal - table[month0];\n return { month: month0 + 1, day };\n}\n\nexport function isoWeekdayToLocal(isoWeekday, startOfWeek) {\n return ((isoWeekday - startOfWeek + 7) % 7) + 1;\n}\n\n/**\n * @private\n */\n\nexport function gregorianToWeek(gregObj, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const { year, month, day } = gregObj,\n ordinal = computeOrdinal(year, month, day),\n weekday = isoWeekdayToLocal(dayOfWeek(year, month, day), startOfWeek);\n\n let weekNumber = Math.floor((ordinal - weekday + 14 - minDaysInFirstWeek) / 7),\n weekYear;\n\n if (weekNumber < 1) {\n weekYear = year - 1;\n weekNumber = weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek);\n } else if (weekNumber > weeksInWeekYear(year, minDaysInFirstWeek, startOfWeek)) {\n weekYear = year + 1;\n weekNumber = 1;\n } else {\n weekYear = year;\n }\n\n return { weekYear, weekNumber, weekday, ...timeObject(gregObj) };\n}\n\nexport function weekToGregorian(weekData, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const { weekYear, weekNumber, weekday } = weekData,\n weekdayOfJan4 = isoWeekdayToLocal(dayOfWeek(weekYear, 1, minDaysInFirstWeek), startOfWeek),\n yearInDays = daysInYear(weekYear);\n\n let ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 7 + minDaysInFirstWeek,\n year;\n\n if (ordinal < 1) {\n year = weekYear - 1;\n ordinal += daysInYear(year);\n } else if (ordinal > yearInDays) {\n year = weekYear + 1;\n ordinal -= daysInYear(weekYear);\n } else {\n year = weekYear;\n }\n\n const { month, day } = uncomputeOrdinal(year, ordinal);\n return { year, month, day, ...timeObject(weekData) };\n}\n\nexport function gregorianToOrdinal(gregData) {\n const { year, month, day } = gregData;\n const ordinal = computeOrdinal(year, month, day);\n return { year, ordinal, ...timeObject(gregData) };\n}\n\nexport function ordinalToGregorian(ordinalData) {\n const { year, ordinal } = ordinalData;\n const { month, day } = uncomputeOrdinal(year, ordinal);\n return { year, month, day, ...timeObject(ordinalData) };\n}\n\n/**\n * Check if local week units like localWeekday are used in obj.\n * If so, validates that they are not mixed with ISO week units and then copies them to the normal week unit properties.\n * Modifies obj in-place!\n * @param obj the object values\n */\nexport function usesLocalWeekValues(obj, loc) {\n const hasLocaleWeekData =\n !isUndefined(obj.localWeekday) ||\n !isUndefined(obj.localWeekNumber) ||\n !isUndefined(obj.localWeekYear);\n if (hasLocaleWeekData) {\n const hasIsoWeekData =\n !isUndefined(obj.weekday) || !isUndefined(obj.weekNumber) || !isUndefined(obj.weekYear);\n\n if (hasIsoWeekData) {\n throw new ConflictingSpecificationError(\n \"Cannot mix locale-based week fields with ISO-based week fields\"\n );\n }\n if (!isUndefined(obj.localWeekday)) obj.weekday = obj.localWeekday;\n if (!isUndefined(obj.localWeekNumber)) obj.weekNumber = obj.localWeekNumber;\n if (!isUndefined(obj.localWeekYear)) obj.weekYear = obj.localWeekYear;\n delete obj.localWeekday;\n delete obj.localWeekNumber;\n delete obj.localWeekYear;\n return {\n minDaysInFirstWeek: loc.getMinDaysInFirstWeek(),\n startOfWeek: loc.getStartOfWeek(),\n };\n } else {\n return { minDaysInFirstWeek: 4, startOfWeek: 1 };\n }\n}\n\nexport function hasInvalidWeekData(obj, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const validYear = isInteger(obj.weekYear),\n validWeek = integerBetween(\n obj.weekNumber,\n 1,\n weeksInWeekYear(obj.weekYear, minDaysInFirstWeek, startOfWeek)\n ),\n validWeekday = integerBetween(obj.weekday, 1, 7);\n\n if (!validYear) {\n return unitOutOfRange(\"weekYear\", obj.weekYear);\n } else if (!validWeek) {\n return unitOutOfRange(\"week\", obj.weekNumber);\n } else if (!validWeekday) {\n return unitOutOfRange(\"weekday\", obj.weekday);\n } else return false;\n}\n\nexport function hasInvalidOrdinalData(obj) {\n const validYear = isInteger(obj.year),\n validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year));\n\n if (!validYear) {\n return unitOutOfRange(\"year\", obj.year);\n } else if (!validOrdinal) {\n return unitOutOfRange(\"ordinal\", obj.ordinal);\n } else return false;\n}\n\nexport function hasInvalidGregorianData(obj) {\n const validYear = isInteger(obj.year),\n validMonth = integerBetween(obj.month, 1, 12),\n validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month));\n\n if (!validYear) {\n return unitOutOfRange(\"year\", obj.year);\n } else if (!validMonth) {\n return unitOutOfRange(\"month\", obj.month);\n } else if (!validDay) {\n return unitOutOfRange(\"day\", obj.day);\n } else return false;\n}\n\nexport function hasInvalidTimeData(obj) {\n const { hour, minute, second, millisecond } = obj;\n const validHour =\n integerBetween(hour, 0, 23) ||\n (hour === 24 && minute === 0 && second === 0 && millisecond === 0),\n validMinute = integerBetween(minute, 0, 59),\n validSecond = integerBetween(second, 0, 59),\n validMillisecond = integerBetween(millisecond, 0, 999);\n\n if (!validHour) {\n return unitOutOfRange(\"hour\", hour);\n } else if (!validMinute) {\n return unitOutOfRange(\"minute\", minute);\n } else if (!validSecond) {\n return unitOutOfRange(\"second\", second);\n } else if (!validMillisecond) {\n return unitOutOfRange(\"millisecond\", millisecond);\n } else return false;\n}\n","/*\n This is just a junk drawer, containing anything used across multiple classes.\n Because Luxon is small(ish), this should stay small and we won't worry about splitting\n it up into, say, parsingUtil.js and basicUtil.js and so on. But they are divided up by feature area.\n*/\n\nimport { InvalidArgumentError } from \"../errors.js\";\nimport Settings from \"../settings.js\";\nimport { dayOfWeek, isoWeekdayToLocal } from \"./conversions.js\";\n\n/**\n * @private\n */\n\n// TYPES\n\nexport function isUndefined(o) {\n return typeof o === \"undefined\";\n}\n\nexport function isNumber(o) {\n return typeof o === \"number\";\n}\n\nexport function isInteger(o) {\n return typeof o === \"number\" && o % 1 === 0;\n}\n\nexport function isString(o) {\n return typeof o === \"string\";\n}\n\nexport function isDate(o) {\n return Object.prototype.toString.call(o) === \"[object Date]\";\n}\n\n// CAPABILITIES\n\nexport function hasRelative() {\n try {\n return typeof Intl !== \"undefined\" && !!Intl.RelativeTimeFormat;\n } catch (e) {\n return false;\n }\n}\n\nexport function hasLocaleWeekInfo() {\n try {\n return (\n typeof Intl !== \"undefined\" &&\n !!Intl.Locale &&\n (\"weekInfo\" in Intl.Locale.prototype || \"getWeekInfo\" in Intl.Locale.prototype)\n );\n } catch (e) {\n return false;\n }\n}\n\n// OBJECTS AND ARRAYS\n\nexport function maybeArray(thing) {\n return Array.isArray(thing) ? thing : [thing];\n}\n\nexport function bestBy(arr, by, compare) {\n if (arr.length === 0) {\n return undefined;\n }\n return arr.reduce((best, next) => {\n const pair = [by(next), next];\n if (!best) {\n return pair;\n } else if (compare(best[0], pair[0]) === best[0]) {\n return best;\n } else {\n return pair;\n }\n }, null)[1];\n}\n\nexport function pick(obj, keys) {\n return keys.reduce((a, k) => {\n a[k] = obj[k];\n return a;\n }, {});\n}\n\nexport function hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nexport function validateWeekSettings(settings) {\n if (settings == null) {\n return null;\n } else if (typeof settings !== \"object\") {\n throw new InvalidArgumentError(\"Week settings must be an object\");\n } else {\n if (\n !integerBetween(settings.firstDay, 1, 7) ||\n !integerBetween(settings.minimalDays, 1, 7) ||\n !Array.isArray(settings.weekend) ||\n settings.weekend.some((v) => !integerBetween(v, 1, 7))\n ) {\n throw new InvalidArgumentError(\"Invalid week settings\");\n }\n return {\n firstDay: settings.firstDay,\n minimalDays: settings.minimalDays,\n weekend: Array.from(settings.weekend),\n };\n }\n}\n\n// NUMBERS AND STRINGS\n\nexport function integerBetween(thing, bottom, top) {\n return isInteger(thing) && thing >= bottom && thing <= top;\n}\n\n// x % n but takes the sign of n instead of x\nexport function floorMod(x, n) {\n return x - n * Math.floor(x / n);\n}\n\nexport function padStart(input, n = 2) {\n const isNeg = input < 0;\n let padded;\n if (isNeg) {\n padded = \"-\" + (\"\" + -input).padStart(n, \"0\");\n } else {\n padded = (\"\" + input).padStart(n, \"0\");\n }\n return padded;\n}\n\nexport function parseInteger(string) {\n if (isUndefined(string) || string === null || string === \"\") {\n return undefined;\n } else {\n return parseInt(string, 10);\n }\n}\n\nexport function parseFloating(string) {\n if (isUndefined(string) || string === null || string === \"\") {\n return undefined;\n } else {\n return parseFloat(string);\n }\n}\n\nexport function parseMillis(fraction) {\n // Return undefined (instead of 0) in these cases, where fraction is not set\n if (isUndefined(fraction) || fraction === null || fraction === \"\") {\n return undefined;\n } else {\n const f = parseFloat(\"0.\" + fraction) * 1000;\n return Math.floor(f);\n }\n}\n\nexport function roundTo(number, digits, rounding = \"round\") {\n const factor = 10 ** digits;\n switch (rounding) {\n case \"expand\":\n return number > 0\n ? Math.ceil(number * factor) / factor\n : Math.floor(number * factor) / factor;\n case \"trunc\":\n return Math.trunc(number * factor) / factor;\n case \"round\":\n return Math.round(number * factor) / factor;\n case \"floor\":\n return Math.floor(number * factor) / factor;\n case \"ceil\":\n return Math.ceil(number * factor) / factor;\n default:\n throw new RangeError(`Value rounding ${rounding} is out of range`);\n }\n}\n\n// DATE BASICS\n\nexport function isLeapYear(year) {\n return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n}\n\nexport function daysInYear(year) {\n return isLeapYear(year) ? 366 : 365;\n}\n\nexport function daysInMonth(year, month) {\n const modMonth = floorMod(month - 1, 12) + 1,\n modYear = year + (month - modMonth) / 12;\n\n if (modMonth === 2) {\n return isLeapYear(modYear) ? 29 : 28;\n } else {\n return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1];\n }\n}\n\n// convert a calendar object to a local timestamp (epoch, but with the offset baked in)\nexport function objToLocalTS(obj) {\n let d = Date.UTC(\n obj.year,\n obj.month - 1,\n obj.day,\n obj.hour,\n obj.minute,\n obj.second,\n obj.millisecond\n );\n\n // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that\n if (obj.year < 100 && obj.year >= 0) {\n d = new Date(d);\n // set the month and day again, this is necessary because year 2000 is a leap year, but year 100 is not\n // so if obj.year is in 99, but obj.day makes it roll over into year 100,\n // the calculations done by Date.UTC are using year 2000 - which is incorrect\n d.setUTCFullYear(obj.year, obj.month - 1, obj.day);\n }\n return +d;\n}\n\n// adapted from moment.js: https://github.com/moment/moment/blob/000ac1800e620f770f4eb31b5ae908f6167b0ab2/src/lib/units/week-calendar-utils.js\nfunction firstWeekOffset(year, minDaysInFirstWeek, startOfWeek) {\n const fwdlw = isoWeekdayToLocal(dayOfWeek(year, 1, minDaysInFirstWeek), startOfWeek);\n return -fwdlw + minDaysInFirstWeek - 1;\n}\n\nexport function weeksInWeekYear(weekYear, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const weekOffset = firstWeekOffset(weekYear, minDaysInFirstWeek, startOfWeek);\n const weekOffsetNext = firstWeekOffset(weekYear + 1, minDaysInFirstWeek, startOfWeek);\n return (daysInYear(weekYear) - weekOffset + weekOffsetNext) / 7;\n}\n\nexport function untruncateYear(year) {\n if (year > 99) {\n return year;\n } else return year > Settings.twoDigitCutoffYear ? 1900 + year : 2000 + year;\n}\n\n// PARSING\n\nexport function parseZoneInfo(ts, offsetFormat, locale, timeZone = null) {\n const date = new Date(ts),\n intlOpts = {\n hourCycle: \"h23\",\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n };\n\n if (timeZone) {\n intlOpts.timeZone = timeZone;\n }\n\n const modified = { timeZoneName: offsetFormat, ...intlOpts };\n\n const parsed = new Intl.DateTimeFormat(locale, modified)\n .formatToParts(date)\n .find((m) => m.type.toLowerCase() === \"timezonename\");\n return parsed ? parsed.value : null;\n}\n\n// signedOffset('-5', '30') -> -330\nexport function signedOffset(offHourStr, offMinuteStr) {\n let offHour = parseInt(offHourStr, 10);\n\n // don't || this because we want to preserve -0\n if (Number.isNaN(offHour)) {\n offHour = 0;\n }\n\n const offMin = parseInt(offMinuteStr, 10) || 0,\n offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin;\n return offHour * 60 + offMinSigned;\n}\n\n// COERCION\n\nexport function asNumber(value) {\n const numericValue = Number(value);\n if (typeof value === \"boolean\" || value === \"\" || !Number.isFinite(numericValue))\n throw new InvalidArgumentError(`Invalid unit value ${value}`);\n return numericValue;\n}\n\nexport function normalizeObject(obj, normalizer) {\n const normalized = {};\n for (const u in obj) {\n if (hasOwnProperty(obj, u)) {\n const v = obj[u];\n if (v === undefined || v === null) continue;\n normalized[normalizer(u)] = asNumber(v);\n }\n }\n return normalized;\n}\n\n/**\n * Returns the offset's value as a string\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\nexport function formatOffset(offset, format) {\n const hours = Math.trunc(Math.abs(offset / 60)),\n minutes = Math.trunc(Math.abs(offset % 60)),\n sign = offset >= 0 ? \"+\" : \"-\";\n\n switch (format) {\n case \"short\":\n return `${sign}${padStart(hours, 2)}:${padStart(minutes, 2)}`;\n case \"narrow\":\n return `${sign}${hours}${minutes > 0 ? `:${minutes}` : \"\"}`;\n case \"techie\":\n return `${sign}${padStart(hours, 2)}${padStart(minutes, 2)}`;\n default:\n throw new RangeError(`Value format ${format} is out of range for property format`);\n }\n}\n\nexport function timeObject(obj) {\n return pick(obj, [\"hour\", \"minute\", \"second\", \"millisecond\"]);\n}\n","import * as Formats from \"./formats.js\";\nimport { pick } from \"./util.js\";\n\nfunction stringify(obj) {\n return JSON.stringify(obj, Object.keys(obj).sort());\n}\n\n/**\n * @private\n */\n\nexport const monthsLong = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\nexport const monthsShort = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n];\n\nexport const monthsNarrow = [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"];\n\nexport function months(length) {\n switch (length) {\n case \"narrow\":\n return [...monthsNarrow];\n case \"short\":\n return [...monthsShort];\n case \"long\":\n return [...monthsLong];\n case \"numeric\":\n return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\"];\n case \"2-digit\":\n return [\"01\", \"02\", \"03\", \"04\", \"05\", \"06\", \"07\", \"08\", \"09\", \"10\", \"11\", \"12\"];\n default:\n return null;\n }\n}\n\nexport const weekdaysLong = [\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n \"Sunday\",\n];\n\nexport const weekdaysShort = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\n\nexport const weekdaysNarrow = [\"M\", \"T\", \"W\", \"T\", \"F\", \"S\", \"S\"];\n\nexport function weekdays(length) {\n switch (length) {\n case \"narrow\":\n return [...weekdaysNarrow];\n case \"short\":\n return [...weekdaysShort];\n case \"long\":\n return [...weekdaysLong];\n case \"numeric\":\n return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\"];\n default:\n return null;\n }\n}\n\nexport const meridiems = [\"AM\", \"PM\"];\n\nexport const erasLong = [\"Before Christ\", \"Anno Domini\"];\n\nexport const erasShort = [\"BC\", \"AD\"];\n\nexport const erasNarrow = [\"B\", \"A\"];\n\nexport function eras(length) {\n switch (length) {\n case \"narrow\":\n return [...erasNarrow];\n case \"short\":\n return [...erasShort];\n case \"long\":\n return [...erasLong];\n default:\n return null;\n }\n}\n\nexport function meridiemForDateTime(dt) {\n return meridiems[dt.hour < 12 ? 0 : 1];\n}\n\nexport function weekdayForDateTime(dt, length) {\n return weekdays(length)[dt.weekday - 1];\n}\n\nexport function monthForDateTime(dt, length) {\n return months(length)[dt.month - 1];\n}\n\nexport function eraForDateTime(dt, length) {\n return eras(length)[dt.year < 0 ? 0 : 1];\n}\n\nexport function formatRelativeTime(unit, count, numeric = \"always\", narrow = false) {\n const units = {\n years: [\"year\", \"yr.\"],\n quarters: [\"quarter\", \"qtr.\"],\n months: [\"month\", \"mo.\"],\n weeks: [\"week\", \"wk.\"],\n days: [\"day\", \"day\", \"days\"],\n hours: [\"hour\", \"hr.\"],\n minutes: [\"minute\", \"min.\"],\n seconds: [\"second\", \"sec.\"],\n };\n\n const lastable = [\"hours\", \"minutes\", \"seconds\"].indexOf(unit) === -1;\n\n if (numeric === \"auto\" && lastable) {\n const isDay = unit === \"days\";\n switch (count) {\n case 1:\n return isDay ? \"tomorrow\" : `next ${units[unit][0]}`;\n case -1:\n return isDay ? \"yesterday\" : `last ${units[unit][0]}`;\n case 0:\n return isDay ? \"today\" : `this ${units[unit][0]}`;\n default: // fall through\n }\n }\n\n const isInPast = Object.is(count, -0) || count < 0,\n fmtValue = Math.abs(count),\n singular = fmtValue === 1,\n lilUnits = units[unit],\n fmtUnit = narrow\n ? singular\n ? lilUnits[1]\n : lilUnits[2] || lilUnits[1]\n : singular\n ? units[unit][0]\n : unit;\n return isInPast ? `${fmtValue} ${fmtUnit} ago` : `in ${fmtValue} ${fmtUnit}`;\n}\n\nexport function formatString(knownFormat) {\n // these all have the offsets removed because we don't have access to them\n // without all the intl stuff this is backfilling\n const filtered = pick(knownFormat, [\n \"weekday\",\n \"era\",\n \"year\",\n \"month\",\n \"day\",\n \"hour\",\n \"minute\",\n \"second\",\n \"timeZoneName\",\n \"hourCycle\",\n ]),\n key = stringify(filtered),\n dateTimeHuge = \"EEEE, LLLL d, yyyy, h:mm a\";\n switch (key) {\n case stringify(Formats.DATE_SHORT):\n return \"M/d/yyyy\";\n case stringify(Formats.DATE_MED):\n return \"LLL d, yyyy\";\n case stringify(Formats.DATE_MED_WITH_WEEKDAY):\n return \"EEE, LLL d, yyyy\";\n case stringify(Formats.DATE_FULL):\n return \"LLLL d, yyyy\";\n case stringify(Formats.DATE_HUGE):\n return \"EEEE, LLLL d, yyyy\";\n case stringify(Formats.TIME_SIMPLE):\n return \"h:mm a\";\n case stringify(Formats.TIME_WITH_SECONDS):\n return \"h:mm:ss a\";\n case stringify(Formats.TIME_WITH_SHORT_OFFSET):\n return \"h:mm a\";\n case stringify(Formats.TIME_WITH_LONG_OFFSET):\n return \"h:mm a\";\n case stringify(Formats.TIME_24_SIMPLE):\n return \"HH:mm\";\n case stringify(Formats.TIME_24_WITH_SECONDS):\n return \"HH:mm:ss\";\n case stringify(Formats.TIME_24_WITH_SHORT_OFFSET):\n return \"HH:mm\";\n case stringify(Formats.TIME_24_WITH_LONG_OFFSET):\n return \"HH:mm\";\n case stringify(Formats.DATETIME_SHORT):\n return \"M/d/yyyy, h:mm a\";\n case stringify(Formats.DATETIME_MED):\n return \"LLL d, yyyy, h:mm a\";\n case stringify(Formats.DATETIME_FULL):\n return \"LLLL d, yyyy, h:mm a\";\n case stringify(Formats.DATETIME_HUGE):\n return dateTimeHuge;\n case stringify(Formats.DATETIME_SHORT_WITH_SECONDS):\n return \"M/d/yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_MED_WITH_SECONDS):\n return \"LLL d, yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_MED_WITH_WEEKDAY):\n return \"EEE, d LLL yyyy, h:mm a\";\n case stringify(Formats.DATETIME_FULL_WITH_SECONDS):\n return \"LLLL d, yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_HUGE_WITH_SECONDS):\n return \"EEEE, LLLL d, yyyy, h:mm:ss a\";\n default:\n return dateTimeHuge;\n }\n}\n","import * as English from \"./english.js\";\nimport * as Formats from \"./formats.js\";\nimport { padStart } from \"./util.js\";\n\nfunction stringifyTokens(splits, tokenToString) {\n let s = \"\";\n for (const token of splits) {\n if (token.literal) {\n s += token.val;\n } else {\n s += tokenToString(token.val);\n }\n }\n return s;\n}\n\nconst macroTokenToFormatOpts = {\n D: Formats.DATE_SHORT,\n DD: Formats.DATE_MED,\n DDD: Formats.DATE_FULL,\n DDDD: Formats.DATE_HUGE,\n t: Formats.TIME_SIMPLE,\n tt: Formats.TIME_WITH_SECONDS,\n ttt: Formats.TIME_WITH_SHORT_OFFSET,\n tttt: Formats.TIME_WITH_LONG_OFFSET,\n T: Formats.TIME_24_SIMPLE,\n TT: Formats.TIME_24_WITH_SECONDS,\n TTT: Formats.TIME_24_WITH_SHORT_OFFSET,\n TTTT: Formats.TIME_24_WITH_LONG_OFFSET,\n f: Formats.DATETIME_SHORT,\n ff: Formats.DATETIME_MED,\n fff: Formats.DATETIME_FULL,\n ffff: Formats.DATETIME_HUGE,\n F: Formats.DATETIME_SHORT_WITH_SECONDS,\n FF: Formats.DATETIME_MED_WITH_SECONDS,\n FFF: Formats.DATETIME_FULL_WITH_SECONDS,\n FFFF: Formats.DATETIME_HUGE_WITH_SECONDS,\n};\n\n/**\n * @private\n */\n\nexport default class Formatter {\n static create(locale, opts = {}) {\n return new Formatter(locale, opts);\n }\n\n static parseFormat(fmt) {\n // white-space is always considered a literal in user-provided formats\n // the \" \" token has a special meaning (see unitForToken)\n\n let current = null,\n currentFull = \"\",\n bracketed = false;\n const splits = [];\n for (let i = 0; i < fmt.length; i++) {\n const c = fmt.charAt(i);\n if (c === \"'\") {\n // turn '' into a literal signal quote instead of just skipping the empty literal\n if (currentFull.length > 0 || bracketed) {\n splits.push({\n literal: bracketed || /^\\s+$/.test(currentFull),\n val: currentFull === \"\" ? \"'\" : currentFull,\n });\n }\n current = null;\n currentFull = \"\";\n bracketed = !bracketed;\n } else if (bracketed) {\n currentFull += c;\n } else if (c === current) {\n currentFull += c;\n } else {\n if (currentFull.length > 0) {\n splits.push({ literal: /^\\s+$/.test(currentFull), val: currentFull });\n }\n currentFull = c;\n current = c;\n }\n }\n\n if (currentFull.length > 0) {\n splits.push({ literal: bracketed || /^\\s+$/.test(currentFull), val: currentFull });\n }\n\n return splits;\n }\n\n static macroTokenToFormatOpts(token) {\n return macroTokenToFormatOpts[token];\n }\n\n constructor(locale, formatOpts) {\n this.opts = formatOpts;\n this.loc = locale;\n this.systemLoc = null;\n }\n\n formatWithSystemDefault(dt, opts) {\n if (this.systemLoc === null) {\n this.systemLoc = this.loc.redefaultToSystem();\n }\n const df = this.systemLoc.dtFormatter(dt, { ...this.opts, ...opts });\n return df.format();\n }\n\n dtFormatter(dt, opts = {}) {\n return this.loc.dtFormatter(dt, { ...this.opts, ...opts });\n }\n\n formatDateTime(dt, opts) {\n return this.dtFormatter(dt, opts).format();\n }\n\n formatDateTimeParts(dt, opts) {\n return this.dtFormatter(dt, opts).formatToParts();\n }\n\n formatInterval(interval, opts) {\n const df = this.dtFormatter(interval.start, opts);\n return df.dtf.formatRange(interval.start.toJSDate(), interval.end.toJSDate());\n }\n\n resolvedOptions(dt, opts) {\n return this.dtFormatter(dt, opts).resolvedOptions();\n }\n\n num(n, p = 0, signDisplay = undefined) {\n // we get some perf out of doing this here, annoyingly\n if (this.opts.forceSimple) {\n return padStart(n, p);\n }\n\n const opts = { ...this.opts };\n\n if (p > 0) {\n opts.padTo = p;\n }\n if (signDisplay) {\n opts.signDisplay = signDisplay;\n }\n\n return this.loc.numberFormatter(opts).format(n);\n }\n\n formatDateTimeFromString(dt, fmt) {\n const knownEnglish = this.loc.listingMode() === \"en\",\n useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== \"gregory\",\n string = (opts, extract) => this.loc.extract(dt, opts, extract),\n formatOffset = (opts) => {\n if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) {\n return \"Z\";\n }\n\n return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : \"\";\n },\n meridiem = () =>\n knownEnglish\n ? English.meridiemForDateTime(dt)\n : string({ hour: \"numeric\", hourCycle: \"h12\" }, \"dayperiod\"),\n month = (length, standalone) =>\n knownEnglish\n ? English.monthForDateTime(dt, length)\n : string(standalone ? { month: length } : { month: length, day: \"numeric\" }, \"month\"),\n weekday = (length, standalone) =>\n knownEnglish\n ? English.weekdayForDateTime(dt, length)\n : string(\n standalone ? { weekday: length } : { weekday: length, month: \"long\", day: \"numeric\" },\n \"weekday\"\n ),\n maybeMacro = (token) => {\n const formatOpts = Formatter.macroTokenToFormatOpts(token);\n if (formatOpts) {\n return this.formatWithSystemDefault(dt, formatOpts);\n } else {\n return token;\n }\n },\n era = (length) =>\n knownEnglish ? English.eraForDateTime(dt, length) : string({ era: length }, \"era\"),\n tokenToString = (token) => {\n // Where possible: https://cldr.unicode.org/translation/date-time/date-time-symbols\n switch (token) {\n // ms\n case \"S\":\n return this.num(dt.millisecond);\n case \"u\":\n // falls through\n case \"SSS\":\n return this.num(dt.millisecond, 3);\n // seconds\n case \"s\":\n return this.num(dt.second);\n case \"ss\":\n return this.num(dt.second, 2);\n // fractional seconds\n case \"uu\":\n return this.num(Math.floor(dt.millisecond / 10), 2);\n case \"uuu\":\n return this.num(Math.floor(dt.millisecond / 100));\n // minutes\n case \"m\":\n return this.num(dt.minute);\n case \"mm\":\n return this.num(dt.minute, 2);\n // hours\n case \"h\":\n return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12);\n case \"hh\":\n return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2);\n case \"H\":\n return this.num(dt.hour);\n case \"HH\":\n return this.num(dt.hour, 2);\n // offset\n case \"Z\":\n // like +6\n return formatOffset({ format: \"narrow\", allowZ: this.opts.allowZ });\n case \"ZZ\":\n // like +06:00\n return formatOffset({ format: \"short\", allowZ: this.opts.allowZ });\n case \"ZZZ\":\n // like +0600\n return formatOffset({ format: \"techie\", allowZ: this.opts.allowZ });\n case \"ZZZZ\":\n // like EST\n return dt.zone.offsetName(dt.ts, { format: \"short\", locale: this.loc.locale });\n case \"ZZZZZ\":\n // like Eastern Standard Time\n return dt.zone.offsetName(dt.ts, { format: \"long\", locale: this.loc.locale });\n // zone\n case \"z\":\n // like America/New_York\n return dt.zoneName;\n // meridiems\n case \"a\":\n return meridiem();\n // dates\n case \"d\":\n return useDateTimeFormatter ? string({ day: \"numeric\" }, \"day\") : this.num(dt.day);\n case \"dd\":\n return useDateTimeFormatter ? string({ day: \"2-digit\" }, \"day\") : this.num(dt.day, 2);\n // weekdays - standalone\n case \"c\":\n // like 1\n return this.num(dt.weekday);\n case \"ccc\":\n // like 'Tues'\n return weekday(\"short\", true);\n case \"cccc\":\n // like 'Tuesday'\n return weekday(\"long\", true);\n case \"ccccc\":\n // like 'T'\n return weekday(\"narrow\", true);\n // weekdays - format\n case \"E\":\n // like 1\n return this.num(dt.weekday);\n case \"EEE\":\n // like 'Tues'\n return weekday(\"short\", false);\n case \"EEEE\":\n // like 'Tuesday'\n return weekday(\"long\", false);\n case \"EEEEE\":\n // like 'T'\n return weekday(\"narrow\", false);\n // months - standalone\n case \"L\":\n // like 1\n return useDateTimeFormatter\n ? string({ month: \"numeric\", day: \"numeric\" }, \"month\")\n : this.num(dt.month);\n case \"LL\":\n // like 01, doesn't seem to work\n return useDateTimeFormatter\n ? string({ month: \"2-digit\", day: \"numeric\" }, \"month\")\n : this.num(dt.month, 2);\n case \"LLL\":\n // like Jan\n return month(\"short\", true);\n case \"LLLL\":\n // like January\n return month(\"long\", true);\n case \"LLLLL\":\n // like J\n return month(\"narrow\", true);\n // months - format\n case \"M\":\n // like 1\n return useDateTimeFormatter\n ? string({ month: \"numeric\" }, \"month\")\n : this.num(dt.month);\n case \"MM\":\n // like 01\n return useDateTimeFormatter\n ? string({ month: \"2-digit\" }, \"month\")\n : this.num(dt.month, 2);\n case \"MMM\":\n // like Jan\n return month(\"short\", false);\n case \"MMMM\":\n // like January\n return month(\"long\", false);\n case \"MMMMM\":\n // like J\n return month(\"narrow\", false);\n // years\n case \"y\":\n // like 2014\n return useDateTimeFormatter ? string({ year: \"numeric\" }, \"year\") : this.num(dt.year);\n case \"yy\":\n // like 14\n return useDateTimeFormatter\n ? string({ year: \"2-digit\" }, \"year\")\n : this.num(dt.year.toString().slice(-2), 2);\n case \"yyyy\":\n // like 0012\n return useDateTimeFormatter\n ? string({ year: \"numeric\" }, \"year\")\n : this.num(dt.year, 4);\n case \"yyyyyy\":\n // like 000012\n return useDateTimeFormatter\n ? string({ year: \"numeric\" }, \"year\")\n : this.num(dt.year, 6);\n // eras\n case \"G\":\n // like AD\n return era(\"short\");\n case \"GG\":\n // like Anno Domini\n return era(\"long\");\n case \"GGGGG\":\n return era(\"narrow\");\n case \"kk\":\n return this.num(dt.weekYear.toString().slice(-2), 2);\n case \"kkkk\":\n return this.num(dt.weekYear, 4);\n case \"W\":\n return this.num(dt.weekNumber);\n case \"WW\":\n return this.num(dt.weekNumber, 2);\n case \"n\":\n return this.num(dt.localWeekNumber);\n case \"nn\":\n return this.num(dt.localWeekNumber, 2);\n case \"ii\":\n return this.num(dt.localWeekYear.toString().slice(-2), 2);\n case \"iiii\":\n return this.num(dt.localWeekYear, 4);\n case \"o\":\n return this.num(dt.ordinal);\n case \"ooo\":\n return this.num(dt.ordinal, 3);\n case \"q\":\n // like 1\n return this.num(dt.quarter);\n case \"qq\":\n // like 01\n return this.num(dt.quarter, 2);\n case \"X\":\n return this.num(Math.floor(dt.ts / 1000));\n case \"x\":\n return this.num(dt.ts);\n default:\n return maybeMacro(token);\n }\n };\n\n return stringifyTokens(Formatter.parseFormat(fmt), tokenToString);\n }\n\n formatDurationFromString(dur, fmt) {\n const invertLargest = this.opts.signMode === \"negativeLargestOnly\" ? -1 : 1;\n const tokenToField = (token) => {\n switch (token[0]) {\n case \"S\":\n return \"milliseconds\";\n case \"s\":\n return \"seconds\";\n case \"m\":\n return \"minutes\";\n case \"h\":\n return \"hours\";\n case \"d\":\n return \"days\";\n case \"w\":\n return \"weeks\";\n case \"M\":\n return \"months\";\n case \"y\":\n return \"years\";\n default:\n return null;\n }\n },\n tokenToString = (lildur, info) => (token) => {\n const mapped = tokenToField(token);\n if (mapped) {\n const inversionFactor =\n info.isNegativeDuration && mapped !== info.largestUnit ? invertLargest : 1;\n let signDisplay;\n if (this.opts.signMode === \"negativeLargestOnly\" && mapped !== info.largestUnit) {\n signDisplay = \"never\";\n } else if (this.opts.signMode === \"all\") {\n signDisplay = \"always\";\n } else {\n // \"auto\" and \"negative\" are the same, but \"auto\" has better support\n signDisplay = \"auto\";\n }\n return this.num(lildur.get(mapped) * inversionFactor, token.length, signDisplay);\n } else {\n return token;\n }\n },\n tokens = Formatter.parseFormat(fmt),\n realTokens = tokens.reduce(\n (found, { literal, val }) => (literal ? found : found.concat(val)),\n []\n ),\n collapsed = dur.shiftTo(...realTokens.map(tokenToField).filter((t) => t)),\n durationInfo = {\n isNegativeDuration: collapsed < 0,\n // this relies on \"collapsed\" being based on \"shiftTo\", which builds up the object\n // in order\n largestUnit: Object.keys(collapsed.values)[0],\n };\n return stringifyTokens(tokens, tokenToString(collapsed, durationInfo));\n }\n}\n","import {\n untruncateYear,\n signedOffset,\n parseInteger,\n parseMillis,\n isUndefined,\n parseFloating,\n} from \"./util.js\";\nimport * as English from \"./english.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\n\n/*\n * This file handles parsing for well-specified formats. Here's how it works:\n * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match.\n * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object\n * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence.\n * Extractors can take a \"cursor\" representing the offset in the match to look at. This makes it easy to combine extractors.\n * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions.\n * Some extractions are super dumb and simpleParse and fromStrings help DRY them.\n */\n\nconst ianaRegex = /[A-Za-z_+-]{1,256}(?::?\\/[A-Za-z0-9_+-]{1,256}(?:\\/[A-Za-z0-9_+-]{1,256})?)?/;\n\nfunction combineRegexes(...regexes) {\n const full = regexes.reduce((f, r) => f + r.source, \"\");\n return RegExp(`^${full}$`);\n}\n\nfunction combineExtractors(...extractors) {\n return (m) =>\n extractors\n .reduce(\n ([mergedVals, mergedZone, cursor], ex) => {\n const [val, zone, next] = ex(m, cursor);\n return [{ ...mergedVals, ...val }, zone || mergedZone, next];\n },\n [{}, null, 1]\n )\n .slice(0, 2);\n}\n\nfunction parse(s, ...patterns) {\n if (s == null) {\n return [null, null];\n }\n\n for (const [regex, extractor] of patterns) {\n const m = regex.exec(s);\n if (m) {\n return extractor(m);\n }\n }\n return [null, null];\n}\n\nfunction simpleParse(...keys) {\n return (match, cursor) => {\n const ret = {};\n let i;\n\n for (i = 0; i < keys.length; i++) {\n ret[keys[i]] = parseInteger(match[cursor + i]);\n }\n return [ret, null, cursor + i];\n };\n}\n\n// ISO and SQL parsing\nconst offsetRegex = /(?:([Zz])|([+-]\\d\\d)(?::?(\\d\\d))?)/;\nconst isoExtendedZone = `(?:${offsetRegex.source}?(?:\\\\[(${ianaRegex.source})\\\\])?)?`;\nconst isoTimeBaseRegex = /(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:[.,](\\d{1,30}))?)?)?/;\nconst isoTimeRegex = RegExp(`${isoTimeBaseRegex.source}${isoExtendedZone}`);\nconst isoTimeExtensionRegex = RegExp(`(?:[Tt]${isoTimeRegex.source})?`);\nconst isoYmdRegex = /([+-]\\d{6}|\\d{4})(?:-?(\\d\\d)(?:-?(\\d\\d))?)?/;\nconst isoWeekRegex = /(\\d{4})-?W(\\d\\d)(?:-?(\\d))?/;\nconst isoOrdinalRegex = /(\\d{4})-?(\\d{3})/;\nconst extractISOWeekData = simpleParse(\"weekYear\", \"weekNumber\", \"weekDay\");\nconst extractISOOrdinalData = simpleParse(\"year\", \"ordinal\");\nconst sqlYmdRegex = /(\\d{4})-(\\d\\d)-(\\d\\d)/; // dumbed-down version of the ISO one\nconst sqlTimeRegex = RegExp(\n `${isoTimeBaseRegex.source} ?(?:${offsetRegex.source}|(${ianaRegex.source}))?`\n);\nconst sqlTimeExtensionRegex = RegExp(`(?: ${sqlTimeRegex.source})?`);\n\nfunction int(match, pos, fallback) {\n const m = match[pos];\n return isUndefined(m) ? fallback : parseInteger(m);\n}\n\nfunction extractISOYmd(match, cursor) {\n const item = {\n year: int(match, cursor),\n month: int(match, cursor + 1, 1),\n day: int(match, cursor + 2, 1),\n };\n\n return [item, null, cursor + 3];\n}\n\nfunction extractISOTime(match, cursor) {\n const item = {\n hours: int(match, cursor, 0),\n minutes: int(match, cursor + 1, 0),\n seconds: int(match, cursor + 2, 0),\n milliseconds: parseMillis(match[cursor + 3]),\n };\n\n return [item, null, cursor + 4];\n}\n\nfunction extractISOOffset(match, cursor) {\n const local = !match[cursor] && !match[cursor + 1],\n fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]),\n zone = local ? null : FixedOffsetZone.instance(fullOffset);\n return [{}, zone, cursor + 3];\n}\n\nfunction extractIANAZone(match, cursor) {\n const zone = match[cursor] ? IANAZone.create(match[cursor]) : null;\n return [{}, zone, cursor + 1];\n}\n\n// ISO time parsing\n\nconst isoTimeOnly = RegExp(`^T?${isoTimeBaseRegex.source}$`);\n\n// ISO duration parsing\n\nconst isoDuration =\n /^-?P(?:(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)Y)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)M)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)W)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)D)?(?:T(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)H)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)M)?(?:(-?\\d{1,20})(?:[.,](-?\\d{1,20}))?S)?)?)$/;\n\nfunction extractISODuration(match) {\n const [s, yearStr, monthStr, weekStr, dayStr, hourStr, minuteStr, secondStr, millisecondsStr] =\n match;\n\n const hasNegativePrefix = s[0] === \"-\";\n const negativeSeconds = secondStr && secondStr[0] === \"-\";\n\n const maybeNegate = (num, force = false) =>\n num !== undefined && (force || (num && hasNegativePrefix)) ? -num : num;\n\n return [\n {\n years: maybeNegate(parseFloating(yearStr)),\n months: maybeNegate(parseFloating(monthStr)),\n weeks: maybeNegate(parseFloating(weekStr)),\n days: maybeNegate(parseFloating(dayStr)),\n hours: maybeNegate(parseFloating(hourStr)),\n minutes: maybeNegate(parseFloating(minuteStr)),\n seconds: maybeNegate(parseFloating(secondStr), secondStr === \"-0\"),\n milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds),\n },\n ];\n}\n\n// These are a little braindead. EDT *should* tell us that we're in, say, America/New_York\n// and not just that we're in -240 *right now*. But since I don't think these are used that often\n// I'm just going to ignore that\nconst obsOffsets = {\n GMT: 0,\n EDT: -4 * 60,\n EST: -5 * 60,\n CDT: -5 * 60,\n CST: -6 * 60,\n MDT: -6 * 60,\n MST: -7 * 60,\n PDT: -7 * 60,\n PST: -8 * 60,\n};\n\nfunction fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n const result = {\n year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr),\n month: English.monthsShort.indexOf(monthStr) + 1,\n day: parseInteger(dayStr),\n hour: parseInteger(hourStr),\n minute: parseInteger(minuteStr),\n };\n\n if (secondStr) result.second = parseInteger(secondStr);\n if (weekdayStr) {\n result.weekday =\n weekdayStr.length > 3\n ? English.weekdaysLong.indexOf(weekdayStr) + 1\n : English.weekdaysShort.indexOf(weekdayStr) + 1;\n }\n\n return result;\n}\n\n// RFC 2822/5322\nconst rfc2822 =\n /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\\d\\d)(\\d\\d)))$/;\n\nfunction extractRFC2822(match) {\n const [\n ,\n weekdayStr,\n dayStr,\n monthStr,\n yearStr,\n hourStr,\n minuteStr,\n secondStr,\n obsOffset,\n milOffset,\n offHourStr,\n offMinuteStr,\n ] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n\n let offset;\n if (obsOffset) {\n offset = obsOffsets[obsOffset];\n } else if (milOffset) {\n offset = 0;\n } else {\n offset = signedOffset(offHourStr, offMinuteStr);\n }\n\n return [result, new FixedOffsetZone(offset)];\n}\n\nfunction preprocessRFC2822(s) {\n // Remove comments and folding whitespace and replace multiple-spaces with a single space\n return s\n .replace(/\\([^()]*\\)|[\\n\\t]/g, \" \")\n .replace(/(\\s\\s+)/g, \" \")\n .trim();\n}\n\n// http date\n\nconst rfc1123 =\n /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\\d\\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\\d{4}) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n rfc850 =\n /^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\\d\\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n ascii =\n /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \\d|\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) (\\d{4})$/;\n\nfunction extractRFC1123Or850(match) {\n const [, weekdayStr, dayStr, monthStr, yearStr, hourStr, minuteStr, secondStr] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n return [result, FixedOffsetZone.utcInstance];\n}\n\nfunction extractASCII(match) {\n const [, weekdayStr, monthStr, dayStr, hourStr, minuteStr, secondStr, yearStr] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n return [result, FixedOffsetZone.utcInstance];\n}\n\nconst isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex);\nconst isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex);\nconst isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex);\nconst isoTimeCombinedRegex = combineRegexes(isoTimeRegex);\n\nconst extractISOYmdTimeAndOffset = combineExtractors(\n extractISOYmd,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOWeekTimeAndOffset = combineExtractors(\n extractISOWeekData,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOOrdinalDateAndTime = combineExtractors(\n extractISOOrdinalData,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOTimeAndOffset = combineExtractors(\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\n\n/*\n * @private\n */\n\nexport function parseISODate(s) {\n return parse(\n s,\n [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset],\n [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime],\n [isoTimeCombinedRegex, extractISOTimeAndOffset]\n );\n}\n\nexport function parseRFC2822Date(s) {\n return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]);\n}\n\nexport function parseHTTPDate(s) {\n return parse(\n s,\n [rfc1123, extractRFC1123Or850],\n [rfc850, extractRFC1123Or850],\n [ascii, extractASCII]\n );\n}\n\nexport function parseISODuration(s) {\n return parse(s, [isoDuration, extractISODuration]);\n}\n\nconst extractISOTimeOnly = combineExtractors(extractISOTime);\n\nexport function parseISOTimeOnly(s) {\n return parse(s, [isoTimeOnly, extractISOTimeOnly]);\n}\n\nconst sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex);\nconst sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex);\n\nconst extractISOTimeOffsetAndIANAZone = combineExtractors(\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\n\nexport function parseSQL(s) {\n return parse(\n s,\n [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]\n );\n}\n","import { InvalidArgumentError, InvalidDurationError, InvalidUnitError } from \"./errors.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport Invalid from \"./impl/invalid.js\";\nimport Locale from \"./impl/locale.js\";\nimport { parseISODuration, parseISOTimeOnly } from \"./impl/regexParser.js\";\nimport {\n asNumber,\n hasOwnProperty,\n isNumber,\n isUndefined,\n normalizeObject,\n roundTo,\n} from \"./impl/util.js\";\nimport Settings from \"./settings.js\";\nimport DateTime from \"./datetime.js\";\n\nconst INVALID = \"Invalid Duration\";\n\n// unit conversion constants\nexport const lowOrderMatrix = {\n weeks: {\n days: 7,\n hours: 7 * 24,\n minutes: 7 * 24 * 60,\n seconds: 7 * 24 * 60 * 60,\n milliseconds: 7 * 24 * 60 * 60 * 1000,\n },\n days: {\n hours: 24,\n minutes: 24 * 60,\n seconds: 24 * 60 * 60,\n milliseconds: 24 * 60 * 60 * 1000,\n },\n hours: { minutes: 60, seconds: 60 * 60, milliseconds: 60 * 60 * 1000 },\n minutes: { seconds: 60, milliseconds: 60 * 1000 },\n seconds: { milliseconds: 1000 },\n },\n casualMatrix = {\n years: {\n quarters: 4,\n months: 12,\n weeks: 52,\n days: 365,\n hours: 365 * 24,\n minutes: 365 * 24 * 60,\n seconds: 365 * 24 * 60 * 60,\n milliseconds: 365 * 24 * 60 * 60 * 1000,\n },\n quarters: {\n months: 3,\n weeks: 13,\n days: 91,\n hours: 91 * 24,\n minutes: 91 * 24 * 60,\n seconds: 91 * 24 * 60 * 60,\n milliseconds: 91 * 24 * 60 * 60 * 1000,\n },\n months: {\n weeks: 4,\n days: 30,\n hours: 30 * 24,\n minutes: 30 * 24 * 60,\n seconds: 30 * 24 * 60 * 60,\n milliseconds: 30 * 24 * 60 * 60 * 1000,\n },\n\n ...lowOrderMatrix,\n },\n daysInYearAccurate = 146097.0 / 400,\n daysInMonthAccurate = 146097.0 / 4800,\n accurateMatrix = {\n years: {\n quarters: 4,\n months: 12,\n weeks: daysInYearAccurate / 7,\n days: daysInYearAccurate,\n hours: daysInYearAccurate * 24,\n minutes: daysInYearAccurate * 24 * 60,\n seconds: daysInYearAccurate * 24 * 60 * 60,\n milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000,\n },\n quarters: {\n months: 3,\n weeks: daysInYearAccurate / 28,\n days: daysInYearAccurate / 4,\n hours: (daysInYearAccurate * 24) / 4,\n minutes: (daysInYearAccurate * 24 * 60) / 4,\n seconds: (daysInYearAccurate * 24 * 60 * 60) / 4,\n milliseconds: (daysInYearAccurate * 24 * 60 * 60 * 1000) / 4,\n },\n months: {\n weeks: daysInMonthAccurate / 7,\n days: daysInMonthAccurate,\n hours: daysInMonthAccurate * 24,\n minutes: daysInMonthAccurate * 24 * 60,\n seconds: daysInMonthAccurate * 24 * 60 * 60,\n milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000,\n },\n ...lowOrderMatrix,\n };\n\n// units ordered by size\nconst orderedUnits = [\n \"years\",\n \"quarters\",\n \"months\",\n \"weeks\",\n \"days\",\n \"hours\",\n \"minutes\",\n \"seconds\",\n \"milliseconds\",\n];\n\nconst reverseUnits = orderedUnits.slice(0).reverse();\n\n// clone really means \"create another instance just like this one, but with these changes\"\nfunction clone(dur, alts, clear = false) {\n // deep merge for vals\n const conf = {\n values: clear ? alts.values : { ...dur.values, ...(alts.values || {}) },\n loc: dur.loc.clone(alts.loc),\n conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy,\n matrix: alts.matrix || dur.matrix,\n };\n return new Duration(conf);\n}\n\nfunction durationToMillis(matrix, vals) {\n let sum = vals.milliseconds ?? 0;\n for (const unit of reverseUnits.slice(1)) {\n if (vals[unit]) {\n sum += vals[unit] * matrix[unit][\"milliseconds\"];\n }\n }\n return sum;\n}\n\n// NB: mutates parameters\nfunction normalizeValues(matrix, vals) {\n // the logic below assumes the overall value of the duration is positive\n // if this is not the case, factor is used to make it so\n const factor = durationToMillis(matrix, vals) < 0 ? -1 : 1;\n\n orderedUnits.reduceRight((previous, current) => {\n if (!isUndefined(vals[current])) {\n if (previous) {\n const previousVal = vals[previous] * factor;\n const conv = matrix[current][previous];\n\n // if (previousVal < 0):\n // lower order unit is negative (e.g. { years: 2, days: -2 })\n // normalize this by reducing the higher order unit by the appropriate amount\n // and increasing the lower order unit\n // this can never make the higher order unit negative, because this function only operates\n // on positive durations, so the amount of time represented by the lower order unit cannot\n // be larger than the higher order unit\n // else:\n // lower order unit is positive (e.g. { years: 2, days: 450 } or { years: -2, days: 450 })\n // in this case we attempt to convert as much as possible from the lower order unit into\n // the higher order one\n //\n // Math.floor takes care of both of these cases, rounding away from 0\n // if previousVal < 0 it makes the absolute value larger\n // if previousVal >= it makes the absolute value smaller\n const rollUp = Math.floor(previousVal / conv);\n vals[current] += rollUp * factor;\n vals[previous] -= rollUp * conv * factor;\n }\n return current;\n } else {\n return previous;\n }\n }, null);\n\n // try to convert any decimals into smaller units if possible\n // for example for { years: 2.5, days: 0, seconds: 0 } we want to get { years: 2, days: 182, hours: 12 }\n orderedUnits.reduce((previous, current) => {\n if (!isUndefined(vals[current])) {\n if (previous) {\n const fraction = vals[previous] % 1;\n vals[previous] -= fraction;\n vals[current] += fraction * matrix[previous][current];\n }\n return current;\n } else {\n return previous;\n }\n }, null);\n}\n\n// Remove all properties with a value of 0 from an object\nfunction removeZeroes(vals) {\n const newVals = {};\n for (const [key, value] of Object.entries(vals)) {\n if (value !== 0) {\n newVals[key] = value;\n }\n }\n return newVals;\n}\n\n/**\n * A Duration object represents a period of time, like \"2 months\" or \"1 day, 1 hour\". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime#plus} to add a Duration object to a DateTime, producing another DateTime.\n *\n * Here is a brief overview of commonly used methods and getters in Duration:\n *\n * * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}.\n * * **Unit values** See the {@link Duration#years}, {@link Duration#months}, {@link Duration#weeks}, {@link Duration#days}, {@link Duration#hours}, {@link Duration#minutes}, {@link Duration#seconds}, {@link Duration#milliseconds} accessors.\n * * **Configuration** See {@link Duration#locale} and {@link Duration#numberingSystem} accessors.\n * * **Transformation** To create new Durations out of old ones use {@link Duration#plus}, {@link Duration#minus}, {@link Duration#normalize}, {@link Duration#set}, {@link Duration#reconfigure}, {@link Duration#shiftTo}, and {@link Duration#negate}.\n * * **Output** To convert the Duration into other representations, see {@link Duration#as}, {@link Duration#toISO}, {@link Duration#toFormat}, and {@link Duration#toJSON}\n *\n * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation.\n */\nexport default class Duration {\n /**\n * @private\n */\n constructor(config) {\n const accurate = config.conversionAccuracy === \"longterm\" || false;\n let matrix = accurate ? accurateMatrix : casualMatrix;\n\n if (config.matrix) {\n matrix = config.matrix;\n }\n\n /**\n * @access private\n */\n this.values = config.values;\n /**\n * @access private\n */\n this.loc = config.loc || Locale.create();\n /**\n * @access private\n */\n this.conversionAccuracy = accurate ? \"longterm\" : \"casual\";\n /**\n * @access private\n */\n this.invalid = config.invalid || null;\n /**\n * @access private\n */\n this.matrix = matrix;\n /**\n * @access private\n */\n this.isLuxonDuration = true;\n }\n\n /**\n * Create Duration from a number of milliseconds.\n * @param {number} count of milliseconds\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @return {Duration}\n */\n static fromMillis(count, opts) {\n return Duration.fromObject({ milliseconds: count }, opts);\n }\n\n /**\n * Create a Duration from a JavaScript object with keys like 'years' and 'hours'.\n * If this object is empty then a zero milliseconds duration is returned.\n * @param {Object} obj - the object to create the DateTime from\n * @param {number} obj.years\n * @param {number} obj.quarters\n * @param {number} obj.months\n * @param {number} obj.weeks\n * @param {number} obj.days\n * @param {number} obj.hours\n * @param {number} obj.minutes\n * @param {number} obj.seconds\n * @param {number} obj.milliseconds\n * @param {Object} [opts=[]] - options for creating this Duration\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the custom conversion system to use\n * @return {Duration}\n */\n static fromObject(obj, opts = {}) {\n if (obj == null || typeof obj !== \"object\") {\n throw new InvalidArgumentError(\n `Duration.fromObject: argument expected to be an object, got ${\n obj === null ? \"null\" : typeof obj\n }`\n );\n }\n\n return new Duration({\n values: normalizeObject(obj, Duration.normalizeUnit),\n loc: Locale.fromObject(opts),\n conversionAccuracy: opts.conversionAccuracy,\n matrix: opts.matrix,\n });\n }\n\n /**\n * Create a Duration from DurationLike.\n *\n * @param {Object | number | Duration} durationLike\n * One of:\n * - object with keys like 'years' and 'hours'.\n * - number representing milliseconds\n * - Duration instance\n * @return {Duration}\n */\n static fromDurationLike(durationLike) {\n if (isNumber(durationLike)) {\n return Duration.fromMillis(durationLike);\n } else if (Duration.isDuration(durationLike)) {\n return durationLike;\n } else if (typeof durationLike === \"object\") {\n return Duration.fromObject(durationLike);\n } else {\n throw new InvalidArgumentError(\n `Unknown duration argument ${durationLike} of type ${typeof durationLike}`\n );\n }\n }\n\n /**\n * Create a Duration from an ISO 8601 duration string.\n * @param {string} text - text to parse\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the preset conversion system to use\n * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 }\n * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 }\n * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 }\n * @return {Duration}\n */\n static fromISO(text, opts) {\n const [parsed] = parseISODuration(text);\n if (parsed) {\n return Duration.fromObject(parsed, opts);\n } else {\n return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n }\n\n /**\n * Create a Duration from an ISO 8601 time string.\n * @param {string} text - text to parse\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the conversion system to use\n * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n * @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 }\n * @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @return {Duration}\n */\n static fromISOTime(text, opts) {\n const [parsed] = parseISOTimeOnly(text);\n if (parsed) {\n return Duration.fromObject(parsed, opts);\n } else {\n return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n }\n\n /**\n * Create an invalid Duration.\n * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {Duration}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the Duration is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidDurationError(invalid);\n } else {\n return new Duration({ invalid });\n }\n }\n\n /**\n * @private\n */\n static normalizeUnit(unit) {\n const normalized = {\n year: \"years\",\n years: \"years\",\n quarter: \"quarters\",\n quarters: \"quarters\",\n month: \"months\",\n months: \"months\",\n week: \"weeks\",\n weeks: \"weeks\",\n day: \"days\",\n days: \"days\",\n hour: \"hours\",\n hours: \"hours\",\n minute: \"minutes\",\n minutes: \"minutes\",\n second: \"seconds\",\n seconds: \"seconds\",\n millisecond: \"milliseconds\",\n milliseconds: \"milliseconds\",\n }[unit ? unit.toLowerCase() : unit];\n\n if (!normalized) throw new InvalidUnitError(unit);\n\n return normalized;\n }\n\n /**\n * Check if an object is a Duration. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isDuration(o) {\n return (o && o.isLuxonDuration) || false;\n }\n\n /**\n * Get the locale of a Duration, such 'en-GB'\n * @type {string}\n */\n get locale() {\n return this.isValid ? this.loc.locale : null;\n }\n\n /**\n * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration\n *\n * @type {string}\n */\n get numberingSystem() {\n return this.isValid ? this.loc.numberingSystem : null;\n }\n\n /**\n * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens:\n * * `S` for milliseconds\n * * `s` for seconds\n * * `m` for minutes\n * * `h` for hours\n * * `d` for days\n * * `w` for weeks\n * * `M` for months\n * * `y` for years\n * Notes:\n * * Add padding by repeating the token, e.g. \"yy\" pads the years to two digits, \"hhhh\" pads the hours out to four digits\n * * Tokens can be escaped by wrapping with single quotes.\n * * The duration will be converted to the set of units in the format string using {@link Duration#shiftTo} and the Durations's conversion accuracy setting.\n * @param {string} fmt - the format string\n * @param {Object} opts - options\n * @param {boolean} [opts.floor=true] - floor numerical values\n * @param {'negative'|'all'|'negativeLargestOnly'} [opts.signMode=negative] - How to handle signs\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"y d s\") //=> \"1 6 2\"\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"yy dd sss\") //=> \"01 06 002\"\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"M S\") //=> \"12 518402000\"\n * @example Duration.fromObject({ days: 6, seconds: 2 }).toFormat(\"d s\", { signMode: \"all\" }) //=> \"+6 +2\"\n * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat(\"d s\", { signMode: \"all\" }) //=> \"-6 -2\"\n * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat(\"d s\", { signMode: \"negativeLargestOnly\" }) //=> \"-6 2\"\n * @return {string}\n */\n toFormat(fmt, opts = {}) {\n // reverse-compat since 1.2; we always round down now, never up, and we do it by default\n const fmtOpts = {\n ...opts,\n floor: opts.round !== false && opts.floor !== false,\n };\n return this.isValid\n ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt)\n : INVALID;\n }\n\n /**\n * Returns a string representation of a Duration with all units included.\n * To modify its behavior, use `listStyle` and any Intl.NumberFormat option, though `unitDisplay` is especially relevant.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options\n * @param {Object} opts - Formatting options. Accepts the same keys as the options parameter of the native `Intl.NumberFormat` constructor, as well as `listStyle`.\n * @param {string} [opts.listStyle='narrow'] - How to format the merged list. Corresponds to the `style` property of the options parameter of the native `Intl.ListFormat` constructor.\n * @param {boolean} [opts.showZeros=true] - Show all units previously used by the duration even if they are zero\n * @example\n * ```js\n * var dur = Duration.fromObject({ months: 1, weeks: 0, hours: 5, minutes: 6 })\n * dur.toHuman() //=> '1 month, 0 weeks, 5 hours, 6 minutes'\n * dur.toHuman({ listStyle: \"long\" }) //=> '1 month, 0 weeks, 5 hours, and 6 minutes'\n * dur.toHuman({ unitDisplay: \"short\" }) //=> '1 mth, 0 wks, 5 hr, 6 min'\n * dur.toHuman({ showZeros: false }) //=> '1 month, 5 hours, 6 minutes'\n * ```\n */\n toHuman(opts = {}) {\n if (!this.isValid) return INVALID;\n\n const showZeros = opts.showZeros !== false;\n\n const l = orderedUnits\n .map((unit) => {\n const val = this.values[unit];\n if (isUndefined(val) || (val === 0 && !showZeros)) {\n return null;\n }\n return this.loc\n .numberFormatter({ style: \"unit\", unitDisplay: \"long\", ...opts, unit: unit.slice(0, -1) })\n .format(val);\n })\n .filter((n) => n);\n\n return this.loc\n .listFormatter({ type: \"conjunction\", style: opts.listStyle || \"narrow\", ...opts })\n .format(l);\n }\n\n /**\n * Returns a JavaScript object with this Duration's values.\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 }\n * @return {Object}\n */\n toObject() {\n if (!this.isValid) return {};\n return { ...this.values };\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Duration.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S'\n * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S'\n * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M'\n * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M'\n * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S'\n * @return {string}\n */\n toISO() {\n // we could use the formatter, but this is an easier way to get the minimum string\n if (!this.isValid) return null;\n\n let s = \"P\";\n if (this.years !== 0) s += this.years + \"Y\";\n if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + \"M\";\n if (this.weeks !== 0) s += this.weeks + \"W\";\n if (this.days !== 0) s += this.days + \"D\";\n if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0)\n s += \"T\";\n if (this.hours !== 0) s += this.hours + \"H\";\n if (this.minutes !== 0) s += this.minutes + \"M\";\n if (this.seconds !== 0 || this.milliseconds !== 0)\n // this will handle \"floating point madness\" by removing extra decimal places\n // https://stackoverflow.com/questions/588004/is-floating-point-math-broken\n s += roundTo(this.seconds + this.milliseconds / 1000, 3) + \"S\";\n if (s === \"P\") s += \"T0S\";\n return s;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day.\n * Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000'\n * @return {string}\n */\n toISOTime(opts = {}) {\n if (!this.isValid) return null;\n\n const millis = this.toMillis();\n if (millis < 0 || millis >= 86400000) return null;\n\n opts = {\n suppressMilliseconds: false,\n suppressSeconds: false,\n includePrefix: false,\n format: \"extended\",\n ...opts,\n includeOffset: false,\n };\n\n const dateTime = DateTime.fromMillis(millis, { zone: \"UTC\" });\n return dateTime.toISOTime(opts);\n }\n\n /**\n * Returns an ISO 8601 representation of this Duration appropriate for use in JSON.\n * @return {string}\n */\n toJSON() {\n return this.toISO();\n }\n\n /**\n * Returns an ISO 8601 representation of this Duration appropriate for use in debugging.\n * @return {string}\n */\n toString() {\n return this.toISO();\n }\n\n /**\n * Returns a string representation of this Duration appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `Duration { values: ${JSON.stringify(this.values)} }`;\n } else {\n return `Duration { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns an milliseconds value of this Duration.\n * @return {number}\n */\n toMillis() {\n if (!this.isValid) return NaN;\n\n return durationToMillis(this.matrix, this.values);\n }\n\n /**\n * Returns an milliseconds value of this Duration. Alias of {@link toMillis}\n * @return {number}\n */\n valueOf() {\n return this.toMillis();\n }\n\n /**\n * Make this Duration longer by the specified amount. Return a newly-constructed Duration.\n * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @return {Duration}\n */\n plus(duration) {\n if (!this.isValid) return this;\n\n const dur = Duration.fromDurationLike(duration),\n result = {};\n\n for (const k of orderedUnits) {\n if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) {\n result[k] = dur.get(k) + this.get(k);\n }\n }\n\n return clone(this, { values: result }, true);\n }\n\n /**\n * Make this Duration shorter by the specified amount. Return a newly-constructed Duration.\n * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @return {Duration}\n */\n minus(duration) {\n if (!this.isValid) return this;\n\n const dur = Duration.fromDurationLike(duration);\n return this.plus(dur.negate());\n }\n\n /**\n * Scale this Duration by the specified amount. Return a newly-constructed Duration.\n * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number.\n * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits(x => x * 2) //=> { hours: 2, minutes: 60 }\n * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits((x, u) => u === \"hours\" ? x * 2 : x) //=> { hours: 2, minutes: 30 }\n * @return {Duration}\n */\n mapUnits(fn) {\n if (!this.isValid) return this;\n const result = {};\n for (const k of Object.keys(this.values)) {\n result[k] = asNumber(fn(this.values[k], k));\n }\n return clone(this, { values: result }, true);\n }\n\n /**\n * Get the value of unit.\n * @param {string} unit - a unit such as 'minute' or 'day'\n * @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2\n * @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0\n * @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3\n * @return {number}\n */\n get(unit) {\n return this[Duration.normalizeUnit(unit)];\n }\n\n /**\n * \"Set\" the values of specified units. Return a newly-constructed Duration.\n * @param {Object} values - a mapping of units to numbers\n * @example dur.set({ years: 2017 })\n * @example dur.set({ hours: 8, minutes: 30 })\n * @return {Duration}\n */\n set(values) {\n if (!this.isValid) return this;\n\n const mixed = { ...this.values, ...normalizeObject(values, Duration.normalizeUnit) };\n return clone(this, { values: mixed });\n }\n\n /**\n * \"Set\" the locale and/or numberingSystem. Returns a newly-constructed Duration.\n * @example dur.reconfigure({ locale: 'en-GB' })\n * @return {Duration}\n */\n reconfigure({ locale, numberingSystem, conversionAccuracy, matrix } = {}) {\n const loc = this.loc.clone({ locale, numberingSystem });\n const opts = { loc, matrix, conversionAccuracy };\n return clone(this, opts);\n }\n\n /**\n * Return the length of the duration in the specified unit.\n * @param {string} unit - a unit such as 'minutes' or 'days'\n * @example Duration.fromObject({years: 1}).as('days') //=> 365\n * @example Duration.fromObject({years: 1}).as('months') //=> 12\n * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5\n * @return {number}\n */\n as(unit) {\n return this.isValid ? this.shiftTo(unit).get(unit) : NaN;\n }\n\n /**\n * Reduce this Duration to its canonical representation in its current units.\n * Assuming the overall value of the Duration is positive, this means:\n * - excessive values for lower-order units are converted to higher-order units (if possible, see first and second example)\n * - negative lower-order units are converted to higher order units (there must be such a higher order unit, otherwise\n * the overall value would be negative, see third example)\n * - fractional values for higher-order units are converted to lower-order units (if possible, see fourth example)\n *\n * If the overall value is negative, the result of this method is equivalent to `this.negate().normalize().negate()`.\n * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 }\n * @example Duration.fromObject({ days: 5000 }).normalize().toObject() //=> { days: 5000 }\n * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 }\n * @example Duration.fromObject({ years: 2.5, days: 0, hours: 0 }).normalize().toObject() //=> { years: 2, days: 182, hours: 12 }\n * @return {Duration}\n */\n normalize() {\n if (!this.isValid) return this;\n const vals = this.toObject();\n normalizeValues(this.matrix, vals);\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Rescale units to its largest representation\n * @example Duration.fromObject({ milliseconds: 90000 }).rescale().toObject() //=> { minutes: 1, seconds: 30 }\n * @return {Duration}\n */\n rescale() {\n if (!this.isValid) return this;\n const vals = removeZeroes(this.normalize().shiftToAll().toObject());\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Convert this Duration into its representation in a different set of units.\n * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 }\n * @return {Duration}\n */\n shiftTo(...units) {\n if (!this.isValid) return this;\n\n if (units.length === 0) {\n return this;\n }\n\n units = units.map((u) => Duration.normalizeUnit(u));\n\n const built = {},\n accumulated = {},\n vals = this.toObject();\n let lastUnit;\n\n for (const k of orderedUnits) {\n if (units.indexOf(k) >= 0) {\n lastUnit = k;\n\n let own = 0;\n\n // anything we haven't boiled down yet should get boiled to this unit\n for (const ak in accumulated) {\n own += this.matrix[ak][k] * accumulated[ak];\n accumulated[ak] = 0;\n }\n\n // plus anything that's already in this unit\n if (isNumber(vals[k])) {\n own += vals[k];\n }\n\n // only keep the integer part for now in the hopes of putting any decimal part\n // into a smaller unit later\n const i = Math.trunc(own);\n built[k] = i;\n accumulated[k] = (own * 1000 - i * 1000) / 1000;\n\n // otherwise, keep it in the wings to boil it later\n } else if (isNumber(vals[k])) {\n accumulated[k] = vals[k];\n }\n }\n\n // anything leftover becomes the decimal for the last unit\n // lastUnit must be defined since units is not empty\n for (const key in accumulated) {\n if (accumulated[key] !== 0) {\n built[lastUnit] +=\n key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key];\n }\n }\n\n normalizeValues(this.matrix, built);\n return clone(this, { values: built }, true);\n }\n\n /**\n * Shift this Duration to all available units.\n * Same as shiftTo(\"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", \"seconds\", \"milliseconds\")\n * @return {Duration}\n */\n shiftToAll() {\n if (!this.isValid) return this;\n return this.shiftTo(\n \"years\",\n \"months\",\n \"weeks\",\n \"days\",\n \"hours\",\n \"minutes\",\n \"seconds\",\n \"milliseconds\"\n );\n }\n\n /**\n * Return the negative of this Duration.\n * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 }\n * @return {Duration}\n */\n negate() {\n if (!this.isValid) return this;\n const negated = {};\n for (const k of Object.keys(this.values)) {\n negated[k] = this.values[k] === 0 ? 0 : -this.values[k];\n }\n return clone(this, { values: negated }, true);\n }\n\n /**\n * Removes all units with values equal to 0 from this Duration.\n * @example Duration.fromObject({ years: 2, days: 0, hours: 0, minutes: 0 }).removeZeros().toObject() //=> { years: 2 }\n * @return {Duration}\n */\n removeZeros() {\n if (!this.isValid) return this;\n const vals = removeZeroes(this.values);\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Get the years.\n * @type {number}\n */\n get years() {\n return this.isValid ? this.values.years || 0 : NaN;\n }\n\n /**\n * Get the quarters.\n * @type {number}\n */\n get quarters() {\n return this.isValid ? this.values.quarters || 0 : NaN;\n }\n\n /**\n * Get the months.\n * @type {number}\n */\n get months() {\n return this.isValid ? this.values.months || 0 : NaN;\n }\n\n /**\n * Get the weeks\n * @type {number}\n */\n get weeks() {\n return this.isValid ? this.values.weeks || 0 : NaN;\n }\n\n /**\n * Get the days.\n * @type {number}\n */\n get days() {\n return this.isValid ? this.values.days || 0 : NaN;\n }\n\n /**\n * Get the hours.\n * @type {number}\n */\n get hours() {\n return this.isValid ? this.values.hours || 0 : NaN;\n }\n\n /**\n * Get the minutes.\n * @type {number}\n */\n get minutes() {\n return this.isValid ? this.values.minutes || 0 : NaN;\n }\n\n /**\n * Get the seconds.\n * @return {number}\n */\n get seconds() {\n return this.isValid ? this.values.seconds || 0 : NaN;\n }\n\n /**\n * Get the milliseconds.\n * @return {number}\n */\n get milliseconds() {\n return this.isValid ? this.values.milliseconds || 0 : NaN;\n }\n\n /**\n * Returns whether the Duration is invalid. Invalid durations are returned by diff operations\n * on invalid DateTimes or Intervals.\n * @return {boolean}\n */\n get isValid() {\n return this.invalid === null;\n }\n\n /**\n * Returns an error code if this Duration became invalid, or null if the Duration is valid\n * @return {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this Duration became invalid, or null if the Duration is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Equality check\n * Two Durations are equal iff they have the same units and the same values for each unit.\n * @param {Duration} other\n * @return {boolean}\n */\n equals(other) {\n if (!this.isValid || !other.isValid) {\n return false;\n }\n\n if (!this.loc.equals(other.loc)) {\n return false;\n }\n\n function eq(v1, v2) {\n // Consider 0 and undefined as equal\n if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0;\n return v1 === v2;\n }\n\n for (const u of orderedUnits) {\n if (!eq(this.values[u], other.values[u])) {\n return false;\n }\n }\n return true;\n }\n}\n","import DateTime, { friendlyDateTime } from \"./datetime.js\";\nimport Duration from \"./duration.js\";\nimport Settings from \"./settings.js\";\nimport { InvalidArgumentError, InvalidIntervalError } from \"./errors.js\";\nimport Invalid from \"./impl/invalid.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport * as Formats from \"./impl/formats.js\";\n\nconst INVALID = \"Invalid Interval\";\n\n// checks if the start is equal to or before the end\nfunction validateStartEnd(start, end) {\n if (!start || !start.isValid) {\n return Interval.invalid(\"missing or invalid start\");\n } else if (!end || !end.isValid) {\n return Interval.invalid(\"missing or invalid end\");\n } else if (end < start) {\n return Interval.invalid(\n \"end before start\",\n `The end of an interval must be after its start, but you had start=${start.toISO()} and end=${end.toISO()}`\n );\n } else {\n return null;\n }\n}\n\n/**\n * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them.\n *\n * Here is a brief overview of the most commonly used methods and getters in Interval:\n *\n * * **Creation** To create an Interval, use {@link Interval.fromDateTimes}, {@link Interval.after}, {@link Interval.before}, or {@link Interval.fromISO}.\n * * **Accessors** Use {@link Interval#start} and {@link Interval#end} to get the start and end.\n * * **Interrogation** To analyze the Interval, use {@link Interval#count}, {@link Interval#length}, {@link Interval#hasSame}, {@link Interval#contains}, {@link Interval#isAfter}, or {@link Interval#isBefore}.\n * * **Transformation** To create other Intervals out of this one, use {@link Interval#set}, {@link Interval#splitAt}, {@link Interval#splitBy}, {@link Interval#divideEqually}, {@link Interval.merge}, {@link Interval.xor}, {@link Interval#union}, {@link Interval#intersection}, or {@link Interval#difference}.\n * * **Comparison** To compare this Interval to another one, use {@link Interval#equals}, {@link Interval#overlaps}, {@link Interval#abutsStart}, {@link Interval#abutsEnd}, {@link Interval#engulfs}\n * * **Output** To convert the Interval into other representations, see {@link Interval#toString}, {@link Interval#toLocaleString}, {@link Interval#toISO}, {@link Interval#toISODate}, {@link Interval#toISOTime}, {@link Interval#toFormat}, and {@link Interval#toDuration}.\n */\nexport default class Interval {\n /**\n * @private\n */\n constructor(config) {\n /**\n * @access private\n */\n this.s = config.start;\n /**\n * @access private\n */\n this.e = config.end;\n /**\n * @access private\n */\n this.invalid = config.invalid || null;\n /**\n * @access private\n */\n this.isLuxonInterval = true;\n }\n\n /**\n * Create an invalid Interval.\n * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {Interval}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the Interval is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidIntervalError(invalid);\n } else {\n return new Interval({ invalid });\n }\n }\n\n /**\n * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end.\n * @param {DateTime|Date|Object} start\n * @param {DateTime|Date|Object} end\n * @return {Interval}\n */\n static fromDateTimes(start, end) {\n const builtStart = friendlyDateTime(start),\n builtEnd = friendlyDateTime(end);\n\n const validateError = validateStartEnd(builtStart, builtEnd);\n\n if (validateError == null) {\n return new Interval({\n start: builtStart,\n end: builtEnd,\n });\n } else {\n return validateError;\n }\n }\n\n /**\n * Create an Interval from a start DateTime and a Duration to extend to.\n * @param {DateTime|Date|Object} start\n * @param {Duration|Object|number} duration - the length of the Interval.\n * @return {Interval}\n */\n static after(start, duration) {\n const dur = Duration.fromDurationLike(duration),\n dt = friendlyDateTime(start);\n return Interval.fromDateTimes(dt, dt.plus(dur));\n }\n\n /**\n * Create an Interval from an end DateTime and a Duration to extend backwards to.\n * @param {DateTime|Date|Object} end\n * @param {Duration|Object|number} duration - the length of the Interval.\n * @return {Interval}\n */\n static before(end, duration) {\n const dur = Duration.fromDurationLike(duration),\n dt = friendlyDateTime(end);\n return Interval.fromDateTimes(dt.minus(dur), dt);\n }\n\n /**\n * Create an Interval from an ISO 8601 string.\n * Accepts `/`, `/`, and `/` formats.\n * @param {string} text - the ISO string to parse\n * @param {Object} [opts] - options to pass {@link DateTime#fromISO} and optionally {@link Duration#fromISO}\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @return {Interval}\n */\n static fromISO(text, opts) {\n const [s, e] = (text || \"\").split(\"/\", 2);\n if (s && e) {\n let start, startIsValid;\n try {\n start = DateTime.fromISO(s, opts);\n startIsValid = start.isValid;\n } catch (e) {\n startIsValid = false;\n }\n\n let end, endIsValid;\n try {\n end = DateTime.fromISO(e, opts);\n endIsValid = end.isValid;\n } catch (e) {\n endIsValid = false;\n }\n\n if (startIsValid && endIsValid) {\n return Interval.fromDateTimes(start, end);\n }\n\n if (startIsValid) {\n const dur = Duration.fromISO(e, opts);\n if (dur.isValid) {\n return Interval.after(start, dur);\n }\n } else if (endIsValid) {\n const dur = Duration.fromISO(s, opts);\n if (dur.isValid) {\n return Interval.before(end, dur);\n }\n }\n }\n return Interval.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n\n /**\n * Check if an object is an Interval. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isInterval(o) {\n return (o && o.isLuxonInterval) || false;\n }\n\n /**\n * Returns the start of the Interval\n * @type {DateTime}\n */\n get start() {\n return this.isValid ? this.s : null;\n }\n\n /**\n * Returns the end of the Interval. This is the first instant which is not part of the interval\n * (Interval is half-open).\n * @type {DateTime}\n */\n get end() {\n return this.isValid ? this.e : null;\n }\n\n /**\n * Returns the last DateTime included in the interval (since end is not part of the interval)\n * @type {DateTime}\n */\n get lastDateTime() {\n return this.isValid ? (this.e ? this.e.minus(1) : null) : null;\n }\n\n /**\n * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'.\n * @type {boolean}\n */\n get isValid() {\n return this.invalidReason === null;\n }\n\n /**\n * Returns an error code if this Interval is invalid, or null if the Interval is valid\n * @type {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this Interval became invalid, or null if the Interval is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Returns the length of the Interval in the specified unit.\n * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in.\n * @return {number}\n */\n length(unit = \"milliseconds\") {\n return this.isValid ? this.toDuration(...[unit]).get(unit) : NaN;\n }\n\n /**\n * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part.\n * Unlike {@link Interval#length} this counts sections of the calendar, not periods of time, e.g. specifying 'day'\n * asks 'what dates are included in this interval?', not 'how many days long is this interval?'\n * @param {string} [unit='milliseconds'] - the unit of time to count.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; this operation will always use the locale of the start DateTime\n * @return {number}\n */\n count(unit = \"milliseconds\", opts) {\n if (!this.isValid) return NaN;\n const start = this.start.startOf(unit, opts);\n let end;\n if (opts?.useLocaleWeeks) {\n end = this.end.reconfigure({ locale: start.locale });\n } else {\n end = this.end;\n }\n end = end.startOf(unit, opts);\n return Math.floor(end.diff(start, unit).get(unit)) + (end.valueOf() !== this.end.valueOf());\n }\n\n /**\n * Returns whether this Interval's start and end are both in the same unit of time\n * @param {string} unit - the unit of time to check sameness on\n * @return {boolean}\n */\n hasSame(unit) {\n return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false;\n }\n\n /**\n * Return whether this Interval has the same start and end DateTimes.\n * @return {boolean}\n */\n isEmpty() {\n return this.s.valueOf() === this.e.valueOf();\n }\n\n /**\n * Return whether this Interval's start is after the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n isAfter(dateTime) {\n if (!this.isValid) return false;\n return this.s > dateTime;\n }\n\n /**\n * Return whether this Interval's end is before the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n isBefore(dateTime) {\n if (!this.isValid) return false;\n return this.e <= dateTime;\n }\n\n /**\n * Return whether this Interval contains the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n contains(dateTime) {\n if (!this.isValid) return false;\n return this.s <= dateTime && this.e > dateTime;\n }\n\n /**\n * \"Sets\" the start and/or end dates. Returns a newly-constructed Interval.\n * @param {Object} values - the values to set\n * @param {DateTime} values.start - the starting DateTime\n * @param {DateTime} values.end - the ending DateTime\n * @return {Interval}\n */\n set({ start, end } = {}) {\n if (!this.isValid) return this;\n return Interval.fromDateTimes(start || this.s, end || this.e);\n }\n\n /**\n * Split this Interval at each of the specified DateTimes\n * @param {...DateTime} dateTimes - the unit of time to count.\n * @return {Array}\n */\n splitAt(...dateTimes) {\n if (!this.isValid) return [];\n const sorted = dateTimes\n .map(friendlyDateTime)\n .filter((d) => this.contains(d))\n .sort((a, b) => a.toMillis() - b.toMillis()),\n results = [];\n let { s } = this,\n i = 0;\n\n while (s < this.e) {\n const added = sorted[i] || this.e,\n next = +added > +this.e ? this.e : added;\n results.push(Interval.fromDateTimes(s, next));\n s = next;\n i += 1;\n }\n\n return results;\n }\n\n /**\n * Split this Interval into smaller Intervals, each of the specified length.\n * Left over time is grouped into a smaller interval\n * @param {Duration|Object|number} duration - The length of each resulting interval.\n * @return {Array}\n */\n splitBy(duration) {\n const dur = Duration.fromDurationLike(duration);\n\n if (!this.isValid || !dur.isValid || dur.as(\"milliseconds\") === 0) {\n return [];\n }\n\n let { s } = this,\n idx = 1,\n next;\n\n const results = [];\n while (s < this.e) {\n const added = this.start.plus(dur.mapUnits((x) => x * idx));\n next = +added > +this.e ? this.e : added;\n results.push(Interval.fromDateTimes(s, next));\n s = next;\n idx += 1;\n }\n\n return results;\n }\n\n /**\n * Split this Interval into the specified number of smaller intervals.\n * @param {number} numberOfParts - The number of Intervals to divide the Interval into.\n * @return {Array}\n */\n divideEqually(numberOfParts) {\n if (!this.isValid) return [];\n return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts);\n }\n\n /**\n * Return whether this Interval overlaps with the specified Interval\n * @param {Interval} other\n * @return {boolean}\n */\n overlaps(other) {\n return this.e > other.s && this.s < other.e;\n }\n\n /**\n * Return whether this Interval's end is adjacent to the specified Interval's start.\n * @param {Interval} other\n * @return {boolean}\n */\n abutsStart(other) {\n if (!this.isValid) return false;\n return +this.e === +other.s;\n }\n\n /**\n * Return whether this Interval's start is adjacent to the specified Interval's end.\n * @param {Interval} other\n * @return {boolean}\n */\n abutsEnd(other) {\n if (!this.isValid) return false;\n return +other.e === +this.s;\n }\n\n /**\n * Returns true if this Interval fully contains the specified Interval, specifically if the intersect (of this Interval and the other Interval) is equal to the other Interval; false otherwise.\n * @param {Interval} other\n * @return {boolean}\n */\n engulfs(other) {\n if (!this.isValid) return false;\n return this.s <= other.s && this.e >= other.e;\n }\n\n /**\n * Return whether this Interval has the same start and end as the specified Interval.\n * @param {Interval} other\n * @return {boolean}\n */\n equals(other) {\n if (!this.isValid || !other.isValid) {\n return false;\n }\n\n return this.s.equals(other.s) && this.e.equals(other.e);\n }\n\n /**\n * Return an Interval representing the intersection of this Interval and the specified Interval.\n * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals.\n * Returns null if the intersection is empty, meaning, the intervals don't intersect.\n * @param {Interval} other\n * @return {Interval}\n */\n intersection(other) {\n if (!this.isValid) return this;\n const s = this.s > other.s ? this.s : other.s,\n e = this.e < other.e ? this.e : other.e;\n\n if (s >= e) {\n return null;\n } else {\n return Interval.fromDateTimes(s, e);\n }\n }\n\n /**\n * Return an Interval representing the union of this Interval and the specified Interval.\n * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals.\n * @param {Interval} other\n * @return {Interval}\n */\n union(other) {\n if (!this.isValid) return this;\n const s = this.s < other.s ? this.s : other.s,\n e = this.e > other.e ? this.e : other.e;\n return Interval.fromDateTimes(s, e);\n }\n\n /**\n * Merge an array of Intervals into an equivalent minimal set of Intervals.\n * Combines overlapping and adjacent Intervals.\n * The resulting array will contain the Intervals in ascending order, that is, starting with the earliest Interval\n * and ending with the latest.\n *\n * @param {Array} intervals\n * @return {Array}\n */\n static merge(intervals) {\n const [found, final] = intervals\n .sort((a, b) => a.s - b.s)\n .reduce(\n ([sofar, current], item) => {\n if (!current) {\n return [sofar, item];\n } else if (current.overlaps(item) || current.abutsStart(item)) {\n return [sofar, current.union(item)];\n } else {\n return [sofar.concat([current]), item];\n }\n },\n [[], null]\n );\n if (final) {\n found.push(final);\n }\n return found;\n }\n\n /**\n * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals.\n * @param {Array} intervals\n * @return {Array}\n */\n static xor(intervals) {\n let start = null,\n currentCount = 0;\n const results = [],\n ends = intervals.map((i) => [\n { time: i.s, type: \"s\" },\n { time: i.e, type: \"e\" },\n ]),\n flattened = Array.prototype.concat(...ends),\n arr = flattened.sort((a, b) => a.time - b.time);\n\n for (const i of arr) {\n currentCount += i.type === \"s\" ? 1 : -1;\n\n if (currentCount === 1) {\n start = i.time;\n } else {\n if (start && +start !== +i.time) {\n results.push(Interval.fromDateTimes(start, i.time));\n }\n\n start = null;\n }\n }\n\n return Interval.merge(results);\n }\n\n /**\n * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals.\n * @param {...Interval} intervals\n * @return {Array}\n */\n difference(...intervals) {\n return Interval.xor([this].concat(intervals))\n .map((i) => this.intersection(i))\n .filter((i) => i && !i.isEmpty());\n }\n\n /**\n * Returns a string representation of this Interval appropriate for debugging.\n * @return {string}\n */\n toString() {\n if (!this.isValid) return INVALID;\n return `[${this.s.toISO()} – ${this.e.toISO()})`;\n }\n\n /**\n * Returns a string representation of this Interval appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `Interval { start: ${this.s.toISO()}, end: ${this.e.toISO()} }`;\n } else {\n return `Interval { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns a localized string representing this Interval. Accepts the same options as the\n * Intl.DateTimeFormat constructor and any presets defined by Luxon, such as\n * {@link DateTime.DATE_FULL} or {@link DateTime.TIME_SIMPLE}. The exact behavior of this method\n * is browser-specific, but in general it will return an appropriate representation of the\n * Interval in the assigned locale. Defaults to the system's locale if no locale has been\n * specified.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {Object} [formatOpts=DateTime.DATE_SHORT] - Either a DateTime preset or\n * Intl.DateTimeFormat constructor options.\n * @param {Object} opts - Options to override the configuration of the start DateTime.\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(); //=> 11/7/2022 – 11/8/2022\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL); //=> November 7 – 8, 2022\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL, { locale: 'fr-FR' }); //=> 7–8 novembre 2022\n * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString(DateTime.TIME_SIMPLE); //=> 6:00 – 8:00 PM\n * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> Mon, Nov 07, 6:00 – 8:00 p\n * @return {string}\n */\n toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) {\n return this.isValid\n ? Formatter.create(this.s.loc.clone(opts), formatOpts).formatInterval(this)\n : INVALID;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Interval.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @param {Object} opts - The same options as {@link DateTime#toISO}\n * @return {string}\n */\n toISO(opts) {\n if (!this.isValid) return INVALID;\n return `${this.s.toISO(opts)}/${this.e.toISO(opts)}`;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of date of this Interval.\n * The time components are ignored.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @return {string}\n */\n toISODate() {\n if (!this.isValid) return INVALID;\n return `${this.s.toISODate()}/${this.e.toISODate()}`;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of time of this Interval.\n * The date components are ignored.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @param {Object} opts - The same options as {@link DateTime#toISO}\n * @return {string}\n */\n toISOTime(opts) {\n if (!this.isValid) return INVALID;\n return `${this.s.toISOTime(opts)}/${this.e.toISOTime(opts)}`;\n }\n\n /**\n * Returns a string representation of this Interval formatted according to the specified format\n * string. **You may not want this.** See {@link Interval#toLocaleString} for a more flexible\n * formatting tool.\n * @param {string} dateFormat - The format string. This string formats the start and end time.\n * See {@link DateTime#toFormat} for details.\n * @param {Object} opts - Options.\n * @param {string} [opts.separator = ' – '] - A separator to place between the start and end\n * representations.\n * @return {string}\n */\n toFormat(dateFormat, { separator = \" – \" } = {}) {\n if (!this.isValid) return INVALID;\n return `${this.s.toFormat(dateFormat)}${separator}${this.e.toFormat(dateFormat)}`;\n }\n\n /**\n * Return a Duration representing the time spanned by this interval.\n * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration.\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 }\n * @return {Duration}\n */\n toDuration(unit, opts) {\n if (!this.isValid) {\n return Duration.invalid(this.invalidReason);\n }\n return this.e.diff(this.s, unit, opts);\n }\n\n /**\n * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes\n * @param {function} mapFn\n * @return {Interval}\n * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC())\n * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 }))\n */\n mapEndpoints(mapFn) {\n return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e));\n }\n}\n","import DateTime from \"./datetime.js\";\nimport Settings from \"./settings.js\";\nimport Locale from \"./impl/locale.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\n\nimport { hasLocaleWeekInfo, hasRelative } from \"./impl/util.js\";\n\n/**\n * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment.\n */\nexport default class Info {\n /**\n * Return whether the specified zone contains a DST.\n * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone.\n * @return {boolean}\n */\n static hasDST(zone = Settings.defaultZone) {\n const proto = DateTime.now().setZone(zone).set({ month: 12 });\n\n return !zone.isUniversal && proto.offset !== proto.set({ month: 6 }).offset;\n }\n\n /**\n * Return whether the specified zone is a valid IANA specifier.\n * @param {string} zone - Zone to check\n * @return {boolean}\n */\n static isValidIANAZone(zone) {\n return IANAZone.isValidZone(zone);\n }\n\n /**\n * Converts the input into a {@link Zone} instance.\n *\n * * If `input` is already a Zone instance, it is returned unchanged.\n * * If `input` is a string containing a valid time zone name, a Zone instance\n * with that name is returned.\n * * If `input` is a string that doesn't refer to a known time zone, a Zone\n * instance with {@link Zone#isValid} == false is returned.\n * * If `input is a number, a Zone instance with the specified fixed offset\n * in minutes is returned.\n * * If `input` is `null` or `undefined`, the default zone is returned.\n * @param {string|Zone|number} [input] - the value to be converted\n * @return {Zone}\n */\n static normalizeZone(input) {\n return normalizeZone(input, Settings.defaultZone);\n }\n\n /**\n * Get the weekday on which the week starts according to the given locale.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number} the start of the week, 1 for Monday through 7 for Sunday\n */\n static getStartOfWeek({ locale = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale)).getStartOfWeek();\n }\n\n /**\n * Get the minimum number of days necessary in a week before it is considered part of the next year according\n * to the given locale.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number}\n */\n static getMinimumDaysInFirstWeek({ locale = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale)).getMinDaysInFirstWeek();\n }\n\n /**\n * Get the weekdays, which are considered the weekend according to the given locale\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number[]} an array of weekdays, 1 for Monday through 7 for Sunday\n */\n static getWeekendWeekdays({ locale = null, locObj = null } = {}) {\n // copy the array, because we cache it internally\n return (locObj || Locale.create(locale)).getWeekendDays().slice();\n }\n\n /**\n * Return an array of standalone month names.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @param {string} [opts.outputCalendar='gregory'] - the calendar\n * @example Info.months()[0] //=> 'January'\n * @example Info.months('short')[0] //=> 'Jan'\n * @example Info.months('numeric')[0] //=> '1'\n * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.'\n * @example Info.months('numeric', { locale: 'ar' })[0] //=> '١'\n * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I'\n * @return {Array}\n */\n static months(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length);\n }\n\n /**\n * Return an array of format month names.\n * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that\n * changes the string.\n * See {@link Info#months}\n * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @param {string} [opts.outputCalendar='gregory'] - the calendar\n * @return {Array}\n */\n static monthsFormat(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true);\n }\n\n /**\n * Return an array of standalone week names.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {string} [length='long'] - the length of the weekday representation, such as \"narrow\", \"short\", \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @example Info.weekdays()[0] //=> 'Monday'\n * @example Info.weekdays('short')[0] //=> 'Mon'\n * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.'\n * @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين'\n * @return {Array}\n */\n static weekdays(length = \"long\", { locale = null, numberingSystem = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length);\n }\n\n /**\n * Return an array of format week names.\n * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that\n * changes the string.\n * See {@link Info#weekdays}\n * @param {string} [length='long'] - the length of the month representation, such as \"narrow\", \"short\", \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale=null] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @return {Array}\n */\n static weekdaysFormat(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true);\n }\n\n /**\n * Return an array of meridiems.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @example Info.meridiems() //=> [ 'AM', 'PM' ]\n * @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ]\n * @return {Array}\n */\n static meridiems({ locale = null } = {}) {\n return Locale.create(locale).meridiems();\n }\n\n /**\n * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian.\n * @param {string} [length='short'] - the length of the era representation, such as \"short\" or \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @example Info.eras() //=> [ 'BC', 'AD' ]\n * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ]\n * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ]\n * @return {Array}\n */\n static eras(length = \"short\", { locale = null } = {}) {\n return Locale.create(locale, null, \"gregory\").eras(length);\n }\n\n /**\n * Return the set of available features in this environment.\n * Some features of Luxon are not available in all environments. For example, on older browsers, relative time formatting support is not available. Use this function to figure out if that's the case.\n * Keys:\n * * `relative`: whether this environment supports relative time formatting\n * * `localeWeek`: whether this environment supports different weekdays for the start of the week based on the locale\n * @example Info.features() //=> { relative: false, localeWeek: true }\n * @return {Object}\n */\n static features() {\n return { relative: hasRelative(), localeWeek: hasLocaleWeekInfo() };\n }\n}\n","import Duration from \"../duration.js\";\n\nfunction dayDiff(earlier, later) {\n const utcDayStart = (dt) => dt.toUTC(0, { keepLocalTime: true }).startOf(\"day\").valueOf(),\n ms = utcDayStart(later) - utcDayStart(earlier);\n return Math.floor(Duration.fromMillis(ms).as(\"days\"));\n}\n\nfunction highOrderDiffs(cursor, later, units) {\n const differs = [\n [\"years\", (a, b) => b.year - a.year],\n [\"quarters\", (a, b) => b.quarter - a.quarter + (b.year - a.year) * 4],\n [\"months\", (a, b) => b.month - a.month + (b.year - a.year) * 12],\n [\n \"weeks\",\n (a, b) => {\n const days = dayDiff(a, b);\n return (days - (days % 7)) / 7;\n },\n ],\n [\"days\", dayDiff],\n ];\n\n const results = {};\n const earlier = cursor;\n let lowestOrder, highWater;\n\n /* This loop tries to diff using larger units first.\n If we overshoot, we backtrack and try the next smaller unit.\n \"cursor\" starts out at the earlier timestamp and moves closer and closer to \"later\"\n as we use smaller and smaller units.\n highWater keeps track of where we would be if we added one more of the smallest unit,\n this is used later to potentially convert any difference smaller than the smallest higher order unit\n into a fraction of that smallest higher order unit\n */\n for (const [unit, differ] of differs) {\n if (units.indexOf(unit) >= 0) {\n lowestOrder = unit;\n\n results[unit] = differ(cursor, later);\n highWater = earlier.plus(results);\n\n if (highWater > later) {\n // we overshot the end point, backtrack cursor by 1\n results[unit]--;\n cursor = earlier.plus(results);\n\n // if we are still overshooting now, we need to backtrack again\n // this happens in certain situations when diffing times in different zones,\n // because this calculation ignores time zones\n if (cursor > later) {\n // keep the \"overshot by 1\" around as highWater\n highWater = cursor;\n // backtrack cursor by 1\n results[unit]--;\n cursor = earlier.plus(results);\n }\n } else {\n cursor = highWater;\n }\n }\n }\n\n return [cursor, results, highWater, lowestOrder];\n}\n\nexport default function (earlier, later, units, opts) {\n let [cursor, results, highWater, lowestOrder] = highOrderDiffs(earlier, later, units);\n\n const remainingMillis = later - cursor;\n\n const lowerOrderUnits = units.filter(\n (u) => [\"hours\", \"minutes\", \"seconds\", \"milliseconds\"].indexOf(u) >= 0\n );\n\n if (lowerOrderUnits.length === 0) {\n if (highWater < later) {\n highWater = cursor.plus({ [lowestOrder]: 1 });\n }\n\n if (highWater !== cursor) {\n results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor);\n }\n }\n\n const duration = Duration.fromObject(results, opts);\n\n if (lowerOrderUnits.length > 0) {\n return Duration.fromMillis(remainingMillis, opts)\n .shiftTo(...lowerOrderUnits)\n .plus(duration);\n } else {\n return duration;\n }\n}\n","import { parseMillis, isUndefined, untruncateYear, signedOffset, hasOwnProperty } from \"./util.js\";\nimport Formatter from \"./formatter.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\nimport DateTime from \"../datetime.js\";\nimport { digitRegex, parseDigits } from \"./digits.js\";\nimport { ConflictingSpecificationError } from \"../errors.js\";\n\nconst MISSING_FTP = \"missing Intl.DateTimeFormat.formatToParts support\";\n\nfunction intUnit(regex, post = (i) => i) {\n return { regex, deser: ([s]) => post(parseDigits(s)) };\n}\n\nconst NBSP = String.fromCharCode(160);\nconst spaceOrNBSP = `[ ${NBSP}]`;\nconst spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, \"g\");\n\nfunction fixListRegex(s) {\n // make dots optional and also make them literal\n // make space and non breakable space characters interchangeable\n return s.replace(/\\./g, \"\\\\.?\").replace(spaceOrNBSPRegExp, spaceOrNBSP);\n}\n\nfunction stripInsensitivities(s) {\n return s\n .replace(/\\./g, \"\") // ignore dots that were made optional\n .replace(spaceOrNBSPRegExp, \" \") // interchange space and nbsp\n .toLowerCase();\n}\n\nfunction oneOf(strings, startIndex) {\n if (strings === null) {\n return null;\n } else {\n return {\n regex: RegExp(strings.map(fixListRegex).join(\"|\")),\n deser: ([s]) =>\n strings.findIndex((i) => stripInsensitivities(s) === stripInsensitivities(i)) + startIndex,\n };\n }\n}\n\nfunction offset(regex, groups) {\n return { regex, deser: ([, h, m]) => signedOffset(h, m), groups };\n}\n\nfunction simple(regex) {\n return { regex, deser: ([s]) => s };\n}\n\nfunction escapeToken(value) {\n return value.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\");\n}\n\n/**\n * @param token\n * @param {Locale} loc\n */\nfunction unitForToken(token, loc) {\n const one = digitRegex(loc),\n two = digitRegex(loc, \"{2}\"),\n three = digitRegex(loc, \"{3}\"),\n four = digitRegex(loc, \"{4}\"),\n six = digitRegex(loc, \"{6}\"),\n oneOrTwo = digitRegex(loc, \"{1,2}\"),\n oneToThree = digitRegex(loc, \"{1,3}\"),\n oneToSix = digitRegex(loc, \"{1,6}\"),\n oneToNine = digitRegex(loc, \"{1,9}\"),\n twoToFour = digitRegex(loc, \"{2,4}\"),\n fourToSix = digitRegex(loc, \"{4,6}\"),\n literal = (t) => ({ regex: RegExp(escapeToken(t.val)), deser: ([s]) => s, literal: true }),\n unitate = (t) => {\n if (token.literal) {\n return literal(t);\n }\n switch (t.val) {\n // era\n case \"G\":\n return oneOf(loc.eras(\"short\"), 0);\n case \"GG\":\n return oneOf(loc.eras(\"long\"), 0);\n // years\n case \"y\":\n return intUnit(oneToSix);\n case \"yy\":\n return intUnit(twoToFour, untruncateYear);\n case \"yyyy\":\n return intUnit(four);\n case \"yyyyy\":\n return intUnit(fourToSix);\n case \"yyyyyy\":\n return intUnit(six);\n // months\n case \"M\":\n return intUnit(oneOrTwo);\n case \"MM\":\n return intUnit(two);\n case \"MMM\":\n return oneOf(loc.months(\"short\", true), 1);\n case \"MMMM\":\n return oneOf(loc.months(\"long\", true), 1);\n case \"L\":\n return intUnit(oneOrTwo);\n case \"LL\":\n return intUnit(two);\n case \"LLL\":\n return oneOf(loc.months(\"short\", false), 1);\n case \"LLLL\":\n return oneOf(loc.months(\"long\", false), 1);\n // dates\n case \"d\":\n return intUnit(oneOrTwo);\n case \"dd\":\n return intUnit(two);\n // ordinals\n case \"o\":\n return intUnit(oneToThree);\n case \"ooo\":\n return intUnit(three);\n // time\n case \"HH\":\n return intUnit(two);\n case \"H\":\n return intUnit(oneOrTwo);\n case \"hh\":\n return intUnit(two);\n case \"h\":\n return intUnit(oneOrTwo);\n case \"mm\":\n return intUnit(two);\n case \"m\":\n return intUnit(oneOrTwo);\n case \"q\":\n return intUnit(oneOrTwo);\n case \"qq\":\n return intUnit(two);\n case \"s\":\n return intUnit(oneOrTwo);\n case \"ss\":\n return intUnit(two);\n case \"S\":\n return intUnit(oneToThree);\n case \"SSS\":\n return intUnit(three);\n case \"u\":\n return simple(oneToNine);\n case \"uu\":\n return simple(oneOrTwo);\n case \"uuu\":\n return intUnit(one);\n // meridiem\n case \"a\":\n return oneOf(loc.meridiems(), 0);\n // weekYear (k)\n case \"kkkk\":\n return intUnit(four);\n case \"kk\":\n return intUnit(twoToFour, untruncateYear);\n // weekNumber (W)\n case \"W\":\n return intUnit(oneOrTwo);\n case \"WW\":\n return intUnit(two);\n // weekdays\n case \"E\":\n case \"c\":\n return intUnit(one);\n case \"EEE\":\n return oneOf(loc.weekdays(\"short\", false), 1);\n case \"EEEE\":\n return oneOf(loc.weekdays(\"long\", false), 1);\n case \"ccc\":\n return oneOf(loc.weekdays(\"short\", true), 1);\n case \"cccc\":\n return oneOf(loc.weekdays(\"long\", true), 1);\n // offset/zone\n case \"Z\":\n case \"ZZ\":\n return offset(new RegExp(`([+-]${oneOrTwo.source})(?::(${two.source}))?`), 2);\n case \"ZZZ\":\n return offset(new RegExp(`([+-]${oneOrTwo.source})(${two.source})?`), 2);\n // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing\n // because we don't have any way to figure out what they are\n case \"z\":\n return simple(/[a-z_+-/]{1,256}?/i);\n // this special-case \"token\" represents a place where a macro-token expanded into a white-space literal\n // in this case we accept any non-newline white-space\n case \" \":\n return simple(/[^\\S\\n\\r]/);\n default:\n return literal(t);\n }\n };\n\n const unit = unitate(token) || {\n invalidReason: MISSING_FTP,\n };\n\n unit.token = token;\n\n return unit;\n}\n\nconst partTypeStyleToTokenVal = {\n year: {\n \"2-digit\": \"yy\",\n numeric: \"yyyyy\",\n },\n month: {\n numeric: \"M\",\n \"2-digit\": \"MM\",\n short: \"MMM\",\n long: \"MMMM\",\n },\n day: {\n numeric: \"d\",\n \"2-digit\": \"dd\",\n },\n weekday: {\n short: \"EEE\",\n long: \"EEEE\",\n },\n dayperiod: \"a\",\n dayPeriod: \"a\",\n hour12: {\n numeric: \"h\",\n \"2-digit\": \"hh\",\n },\n hour24: {\n numeric: \"H\",\n \"2-digit\": \"HH\",\n },\n minute: {\n numeric: \"m\",\n \"2-digit\": \"mm\",\n },\n second: {\n numeric: \"s\",\n \"2-digit\": \"ss\",\n },\n timeZoneName: {\n long: \"ZZZZZ\",\n short: \"ZZZ\",\n },\n};\n\nfunction tokenForPart(part, formatOpts, resolvedOpts) {\n const { type, value } = part;\n\n if (type === \"literal\") {\n const isSpace = /^\\s+$/.test(value);\n return {\n literal: !isSpace,\n val: isSpace ? \" \" : value,\n };\n }\n\n const style = formatOpts[type];\n\n // The user might have explicitly specified hour12 or hourCycle\n // if so, respect their decision\n // if not, refer back to the resolvedOpts, which are based on the locale\n let actualType = type;\n if (type === \"hour\") {\n if (formatOpts.hour12 != null) {\n actualType = formatOpts.hour12 ? \"hour12\" : \"hour24\";\n } else if (formatOpts.hourCycle != null) {\n if (formatOpts.hourCycle === \"h11\" || formatOpts.hourCycle === \"h12\") {\n actualType = \"hour12\";\n } else {\n actualType = \"hour24\";\n }\n } else {\n // tokens only differentiate between 24 hours or not,\n // so we do not need to check hourCycle here, which is less supported anyways\n actualType = resolvedOpts.hour12 ? \"hour12\" : \"hour24\";\n }\n }\n let val = partTypeStyleToTokenVal[actualType];\n if (typeof val === \"object\") {\n val = val[style];\n }\n\n if (val) {\n return {\n literal: false,\n val,\n };\n }\n\n return undefined;\n}\n\nfunction buildRegex(units) {\n const re = units.map((u) => u.regex).reduce((f, r) => `${f}(${r.source})`, \"\");\n return [`^${re}$`, units];\n}\n\nfunction match(input, regex, handlers) {\n const matches = input.match(regex);\n\n if (matches) {\n const all = {};\n let matchIndex = 1;\n for (const i in handlers) {\n if (hasOwnProperty(handlers, i)) {\n const h = handlers[i],\n groups = h.groups ? h.groups + 1 : 1;\n if (!h.literal && h.token) {\n all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups));\n }\n matchIndex += groups;\n }\n }\n return [matches, all];\n } else {\n return [matches, {}];\n }\n}\n\nfunction dateTimeFromMatches(matches) {\n const toField = (token) => {\n switch (token) {\n case \"S\":\n return \"millisecond\";\n case \"s\":\n return \"second\";\n case \"m\":\n return \"minute\";\n case \"h\":\n case \"H\":\n return \"hour\";\n case \"d\":\n return \"day\";\n case \"o\":\n return \"ordinal\";\n case \"L\":\n case \"M\":\n return \"month\";\n case \"y\":\n return \"year\";\n case \"E\":\n case \"c\":\n return \"weekday\";\n case \"W\":\n return \"weekNumber\";\n case \"k\":\n return \"weekYear\";\n case \"q\":\n return \"quarter\";\n default:\n return null;\n }\n };\n\n let zone = null;\n let specificOffset;\n if (!isUndefined(matches.z)) {\n zone = IANAZone.create(matches.z);\n }\n\n if (!isUndefined(matches.Z)) {\n if (!zone) {\n zone = new FixedOffsetZone(matches.Z);\n }\n specificOffset = matches.Z;\n }\n\n if (!isUndefined(matches.q)) {\n matches.M = (matches.q - 1) * 3 + 1;\n }\n\n if (!isUndefined(matches.h)) {\n if (matches.h < 12 && matches.a === 1) {\n matches.h += 12;\n } else if (matches.h === 12 && matches.a === 0) {\n matches.h = 0;\n }\n }\n\n if (matches.G === 0 && matches.y) {\n matches.y = -matches.y;\n }\n\n if (!isUndefined(matches.u)) {\n matches.S = parseMillis(matches.u);\n }\n\n const vals = Object.keys(matches).reduce((r, k) => {\n const f = toField(k);\n if (f) {\n r[f] = matches[k];\n }\n\n return r;\n }, {});\n\n return [vals, zone, specificOffset];\n}\n\nlet dummyDateTimeCache = null;\n\nfunction getDummyDateTime() {\n if (!dummyDateTimeCache) {\n dummyDateTimeCache = DateTime.fromMillis(1555555555555);\n }\n\n return dummyDateTimeCache;\n}\n\nfunction maybeExpandMacroToken(token, locale) {\n if (token.literal) {\n return token;\n }\n\n const formatOpts = Formatter.macroTokenToFormatOpts(token.val);\n const tokens = formatOptsToTokens(formatOpts, locale);\n\n if (tokens == null || tokens.includes(undefined)) {\n return token;\n }\n\n return tokens;\n}\n\nexport function expandMacroTokens(tokens, locale) {\n return Array.prototype.concat(...tokens.map((t) => maybeExpandMacroToken(t, locale)));\n}\n\n/**\n * @private\n */\n\nexport class TokenParser {\n constructor(locale, format) {\n this.locale = locale;\n this.format = format;\n this.tokens = expandMacroTokens(Formatter.parseFormat(format), locale);\n this.units = this.tokens.map((t) => unitForToken(t, locale));\n this.disqualifyingUnit = this.units.find((t) => t.invalidReason);\n\n if (!this.disqualifyingUnit) {\n const [regexString, handlers] = buildRegex(this.units);\n this.regex = RegExp(regexString, \"i\");\n this.handlers = handlers;\n }\n }\n\n explainFromTokens(input) {\n if (!this.isValid) {\n return { input, tokens: this.tokens, invalidReason: this.invalidReason };\n } else {\n const [rawMatches, matches] = match(input, this.regex, this.handlers),\n [result, zone, specificOffset] = matches\n ? dateTimeFromMatches(matches)\n : [null, null, undefined];\n if (hasOwnProperty(matches, \"a\") && hasOwnProperty(matches, \"H\")) {\n throw new ConflictingSpecificationError(\n \"Can't include meridiem when specifying 24-hour format\"\n );\n }\n return {\n input,\n tokens: this.tokens,\n regex: this.regex,\n rawMatches,\n matches,\n result,\n zone,\n specificOffset,\n };\n }\n }\n\n get isValid() {\n return !this.disqualifyingUnit;\n }\n\n get invalidReason() {\n return this.disqualifyingUnit ? this.disqualifyingUnit.invalidReason : null;\n }\n}\n\nexport function explainFromTokens(locale, input, format) {\n const parser = new TokenParser(locale, format);\n return parser.explainFromTokens(input);\n}\n\nexport function parseFromTokens(locale, input, format) {\n const { result, zone, specificOffset, invalidReason } = explainFromTokens(locale, input, format);\n return [result, zone, specificOffset, invalidReason];\n}\n\nexport function formatOptsToTokens(formatOpts, locale) {\n if (!formatOpts) {\n return null;\n }\n\n const formatter = Formatter.create(locale, formatOpts);\n const df = formatter.dtFormatter(getDummyDateTime());\n const parts = df.formatToParts();\n const resolvedOpts = df.resolvedOptions();\n return parts.map((p) => tokenForPart(p, formatOpts, resolvedOpts));\n}\n","import Duration from \"./duration.js\";\nimport Interval from \"./interval.js\";\nimport Settings from \"./settings.js\";\nimport Info from \"./info.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport FixedOffsetZone from \"./zones/fixedOffsetZone.js\";\nimport Locale from \"./impl/locale.js\";\nimport {\n isUndefined,\n maybeArray,\n isDate,\n isNumber,\n bestBy,\n daysInMonth,\n daysInYear,\n isLeapYear,\n weeksInWeekYear,\n normalizeObject,\n roundTo,\n objToLocalTS,\n padStart,\n} from \"./impl/util.js\";\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\nimport diff from \"./impl/diff.js\";\nimport { parseRFC2822Date, parseISODate, parseHTTPDate, parseSQL } from \"./impl/regexParser.js\";\nimport {\n parseFromTokens,\n explainFromTokens,\n formatOptsToTokens,\n expandMacroTokens,\n TokenParser,\n} from \"./impl/tokenParser.js\";\nimport {\n gregorianToWeek,\n weekToGregorian,\n gregorianToOrdinal,\n ordinalToGregorian,\n hasInvalidGregorianData,\n hasInvalidWeekData,\n hasInvalidOrdinalData,\n hasInvalidTimeData,\n usesLocalWeekValues,\n isoWeekdayToLocal,\n} from \"./impl/conversions.js\";\nimport * as Formats from \"./impl/formats.js\";\nimport {\n InvalidArgumentError,\n ConflictingSpecificationError,\n InvalidUnitError,\n InvalidDateTimeError,\n} from \"./errors.js\";\nimport Invalid from \"./impl/invalid.js\";\n\nconst INVALID = \"Invalid DateTime\";\nconst MAX_DATE = 8.64e15;\n\nfunction unsupportedZone(zone) {\n return new Invalid(\"unsupported zone\", `the zone \"${zone.name}\" is not supported`);\n}\n\n// we cache week data on the DT object and this intermediates the cache\n/**\n * @param {DateTime} dt\n */\nfunction possiblyCachedWeekData(dt) {\n if (dt.weekData === null) {\n dt.weekData = gregorianToWeek(dt.c);\n }\n return dt.weekData;\n}\n\n/**\n * @param {DateTime} dt\n */\nfunction possiblyCachedLocalWeekData(dt) {\n if (dt.localWeekData === null) {\n dt.localWeekData = gregorianToWeek(\n dt.c,\n dt.loc.getMinDaysInFirstWeek(),\n dt.loc.getStartOfWeek()\n );\n }\n return dt.localWeekData;\n}\n\n// clone really means, \"make a new object with these modifications\". all \"setters\" really use this\n// to create a new object while only changing some of the properties\nfunction clone(inst, alts) {\n const current = {\n ts: inst.ts,\n zone: inst.zone,\n c: inst.c,\n o: inst.o,\n loc: inst.loc,\n invalid: inst.invalid,\n };\n return new DateTime({ ...current, ...alts, old: current });\n}\n\n// find the right offset a given local time. The o input is our guess, which determines which\n// offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST)\nfunction fixOffset(localTS, o, tz) {\n // Our UTC time is just a guess because our offset is just a guess\n let utcGuess = localTS - o * 60 * 1000;\n\n // Test whether the zone matches the offset for this ts\n const o2 = tz.offset(utcGuess);\n\n // If so, offset didn't change and we're done\n if (o === o2) {\n return [utcGuess, o];\n }\n\n // If not, change the ts by the difference in the offset\n utcGuess -= (o2 - o) * 60 * 1000;\n\n // If that gives us the local time we want, we're done\n const o3 = tz.offset(utcGuess);\n if (o2 === o3) {\n return [utcGuess, o2];\n }\n\n // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time\n return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)];\n}\n\n// convert an epoch timestamp into a calendar object with the given offset\nfunction tsToObj(ts, offset) {\n ts += offset * 60 * 1000;\n\n const d = new Date(ts);\n\n return {\n year: d.getUTCFullYear(),\n month: d.getUTCMonth() + 1,\n day: d.getUTCDate(),\n hour: d.getUTCHours(),\n minute: d.getUTCMinutes(),\n second: d.getUTCSeconds(),\n millisecond: d.getUTCMilliseconds(),\n };\n}\n\n// convert a calendar object to a epoch timestamp\nfunction objToTS(obj, offset, zone) {\n return fixOffset(objToLocalTS(obj), offset, zone);\n}\n\n// create a new DT instance by adding a duration, adjusting for DSTs\nfunction adjustTime(inst, dur) {\n const oPre = inst.o,\n year = inst.c.year + Math.trunc(dur.years),\n month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3,\n c = {\n ...inst.c,\n year,\n month,\n day:\n Math.min(inst.c.day, daysInMonth(year, month)) +\n Math.trunc(dur.days) +\n Math.trunc(dur.weeks) * 7,\n },\n millisToAdd = Duration.fromObject({\n years: dur.years - Math.trunc(dur.years),\n quarters: dur.quarters - Math.trunc(dur.quarters),\n months: dur.months - Math.trunc(dur.months),\n weeks: dur.weeks - Math.trunc(dur.weeks),\n days: dur.days - Math.trunc(dur.days),\n hours: dur.hours,\n minutes: dur.minutes,\n seconds: dur.seconds,\n milliseconds: dur.milliseconds,\n }).as(\"milliseconds\"),\n localTS = objToLocalTS(c);\n\n let [ts, o] = fixOffset(localTS, oPre, inst.zone);\n\n if (millisToAdd !== 0) {\n ts += millisToAdd;\n // that could have changed the offset by going over a DST, but we want to keep the ts the same\n o = inst.zone.offset(ts);\n }\n\n return { ts, o };\n}\n\n// helper useful in turning the results of parsing into real dates\n// by handling the zone options\nfunction parseDataToDateTime(parsed, parsedZone, opts, format, text, specificOffset) {\n const { setZone, zone } = opts;\n if ((parsed && Object.keys(parsed).length !== 0) || parsedZone) {\n const interpretationZone = parsedZone || zone,\n inst = DateTime.fromObject(parsed, {\n ...opts,\n zone: interpretationZone,\n specificOffset,\n });\n return setZone ? inst : inst.setZone(zone);\n } else {\n return DateTime.invalid(\n new Invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ${format}`)\n );\n }\n}\n\n// if you want to output a technical format (e.g. RFC 2822), this helper\n// helps handle the details\nfunction toTechFormat(dt, format, allowZ = true) {\n return dt.isValid\n ? Formatter.create(Locale.create(\"en-US\"), {\n allowZ,\n forceSimple: true,\n }).formatDateTimeFromString(dt, format)\n : null;\n}\n\nfunction toISODate(o, extended, precision) {\n const longFormat = o.c.year > 9999 || o.c.year < 0;\n let c = \"\";\n if (longFormat && o.c.year >= 0) c += \"+\";\n c += padStart(o.c.year, longFormat ? 6 : 4);\n if (precision === \"year\") return c;\n if (extended) {\n c += \"-\";\n c += padStart(o.c.month);\n if (precision === \"month\") return c;\n c += \"-\";\n } else {\n c += padStart(o.c.month);\n if (precision === \"month\") return c;\n }\n c += padStart(o.c.day);\n return c;\n}\n\nfunction toISOTime(\n o,\n extended,\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n) {\n let showSeconds = !suppressSeconds || o.c.millisecond !== 0 || o.c.second !== 0,\n c = \"\";\n switch (precision) {\n case \"day\":\n case \"month\":\n case \"year\":\n break;\n default:\n c += padStart(o.c.hour);\n if (precision === \"hour\") break;\n if (extended) {\n c += \":\";\n c += padStart(o.c.minute);\n if (precision === \"minute\") break;\n if (showSeconds) {\n c += \":\";\n c += padStart(o.c.second);\n }\n } else {\n c += padStart(o.c.minute);\n if (precision === \"minute\") break;\n if (showSeconds) {\n c += padStart(o.c.second);\n }\n }\n if (precision === \"second\") break;\n if (showSeconds && (!suppressMilliseconds || o.c.millisecond !== 0)) {\n c += \".\";\n c += padStart(o.c.millisecond, 3);\n }\n }\n\n if (includeOffset) {\n if (o.isOffsetFixed && o.offset === 0 && !extendedZone) {\n c += \"Z\";\n } else if (o.o < 0) {\n c += \"-\";\n c += padStart(Math.trunc(-o.o / 60));\n c += \":\";\n c += padStart(Math.trunc(-o.o % 60));\n } else {\n c += \"+\";\n c += padStart(Math.trunc(o.o / 60));\n c += \":\";\n c += padStart(Math.trunc(o.o % 60));\n }\n }\n\n if (extendedZone) {\n c += \"[\" + o.zone.ianaName + \"]\";\n }\n return c;\n}\n\n// defaults for unspecified units in the supported calendars\nconst defaultUnitValues = {\n month: 1,\n day: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n },\n defaultWeekUnitValues = {\n weekNumber: 1,\n weekday: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n },\n defaultOrdinalUnitValues = {\n ordinal: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n };\n\n// Units in the supported calendars, sorted by bigness\nconst orderedUnits = [\"year\", \"month\", \"day\", \"hour\", \"minute\", \"second\", \"millisecond\"],\n orderedWeekUnits = [\n \"weekYear\",\n \"weekNumber\",\n \"weekday\",\n \"hour\",\n \"minute\",\n \"second\",\n \"millisecond\",\n ],\n orderedOrdinalUnits = [\"year\", \"ordinal\", \"hour\", \"minute\", \"second\", \"millisecond\"];\n\n// standardize case and plurality in units\nfunction normalizeUnit(unit) {\n const normalized = {\n year: \"year\",\n years: \"year\",\n month: \"month\",\n months: \"month\",\n day: \"day\",\n days: \"day\",\n hour: \"hour\",\n hours: \"hour\",\n minute: \"minute\",\n minutes: \"minute\",\n quarter: \"quarter\",\n quarters: \"quarter\",\n second: \"second\",\n seconds: \"second\",\n millisecond: \"millisecond\",\n milliseconds: \"millisecond\",\n weekday: \"weekday\",\n weekdays: \"weekday\",\n weeknumber: \"weekNumber\",\n weeksnumber: \"weekNumber\",\n weeknumbers: \"weekNumber\",\n weekyear: \"weekYear\",\n weekyears: \"weekYear\",\n ordinal: \"ordinal\",\n }[unit.toLowerCase()];\n\n if (!normalized) throw new InvalidUnitError(unit);\n\n return normalized;\n}\n\nfunction normalizeUnitWithLocalWeeks(unit) {\n switch (unit.toLowerCase()) {\n case \"localweekday\":\n case \"localweekdays\":\n return \"localWeekday\";\n case \"localweeknumber\":\n case \"localweeknumbers\":\n return \"localWeekNumber\";\n case \"localweekyear\":\n case \"localweekyears\":\n return \"localWeekYear\";\n default:\n return normalizeUnit(unit);\n }\n}\n\n// cache offsets for zones based on the current timestamp when this function is\n// first called. When we are handling a datetime from components like (year,\n// month, day, hour) in a time zone, we need a guess about what the timezone\n// offset is so that we can convert into a UTC timestamp. One way is to find the\n// offset of now in the zone. The actual date may have a different offset (for\n// example, if we handle a date in June while we're in December in a zone that\n// observes DST), but we can check and adjust that.\n//\n// When handling many dates, calculating the offset for now every time is\n// expensive. It's just a guess, so we can cache the offset to use even if we\n// are right on a time change boundary (we'll just correct in the other\n// direction). Using a timestamp from first read is a slight optimization for\n// handling dates close to the current date, since those dates will usually be\n// in the same offset (we could set the timestamp statically, instead). We use a\n// single timestamp for all zones to make things a bit more predictable.\n//\n// This is safe for quickDT (used by local() and utc()) because we don't fill in\n// higher-order units from tsNow (as we do in fromObject, this requires that\n// offset is calculated from tsNow).\n/**\n * @param {Zone} zone\n * @return {number}\n */\nfunction guessOffsetForZone(zone) {\n if (zoneOffsetTs === undefined) {\n zoneOffsetTs = Settings.now();\n }\n\n // Do not cache anything but IANA zones, because it is not safe to do so.\n // Guessing an offset which is not present in the zone can cause wrong results from fixOffset\n if (zone.type !== \"iana\") {\n return zone.offset(zoneOffsetTs);\n }\n const zoneName = zone.name;\n let offsetGuess = zoneOffsetGuessCache.get(zoneName);\n if (offsetGuess === undefined) {\n offsetGuess = zone.offset(zoneOffsetTs);\n zoneOffsetGuessCache.set(zoneName, offsetGuess);\n }\n return offsetGuess;\n}\n\n// this is a dumbed down version of fromObject() that runs about 60% faster\n// but doesn't do any validation, makes a bunch of assumptions about what units\n// are present, and so on.\nfunction quickDT(obj, opts) {\n const zone = normalizeZone(opts.zone, Settings.defaultZone);\n if (!zone.isValid) {\n return DateTime.invalid(unsupportedZone(zone));\n }\n\n const loc = Locale.fromObject(opts);\n\n let ts, o;\n\n // assume we have the higher-order units\n if (!isUndefined(obj.year)) {\n for (const u of orderedUnits) {\n if (isUndefined(obj[u])) {\n obj[u] = defaultUnitValues[u];\n }\n }\n\n const invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj);\n if (invalid) {\n return DateTime.invalid(invalid);\n }\n\n const offsetProvis = guessOffsetForZone(zone);\n [ts, o] = objToTS(obj, offsetProvis, zone);\n } else {\n ts = Settings.now();\n }\n\n return new DateTime({ ts, zone, loc, o });\n}\n\nfunction diffRelative(start, end, opts) {\n const round = isUndefined(opts.round) ? true : opts.round,\n rounding = isUndefined(opts.rounding) ? \"trunc\" : opts.rounding,\n format = (c, unit) => {\n c = roundTo(c, round || opts.calendary ? 0 : 2, opts.calendary ? \"round\" : rounding);\n const formatter = end.loc.clone(opts).relFormatter(opts);\n return formatter.format(c, unit);\n },\n differ = (unit) => {\n if (opts.calendary) {\n if (!end.hasSame(start, unit)) {\n return end.startOf(unit).diff(start.startOf(unit), unit).get(unit);\n } else return 0;\n } else {\n return end.diff(start, unit).get(unit);\n }\n };\n\n if (opts.unit) {\n return format(differ(opts.unit), opts.unit);\n }\n\n for (const unit of opts.units) {\n const count = differ(unit);\n if (Math.abs(count) >= 1) {\n return format(count, unit);\n }\n }\n return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]);\n}\n\nfunction lastOpts(argList) {\n let opts = {},\n args;\n if (argList.length > 0 && typeof argList[argList.length - 1] === \"object\") {\n opts = argList[argList.length - 1];\n args = Array.from(argList).slice(0, argList.length - 1);\n } else {\n args = Array.from(argList);\n }\n return [opts, args];\n}\n\n/**\n * Timestamp to use for cached zone offset guesses (exposed for test)\n */\nlet zoneOffsetTs;\n/**\n * Cache for zone offset guesses (exposed for test).\n *\n * This optimizes quickDT via guessOffsetForZone to avoid repeated calls of\n * zone.offset().\n */\nconst zoneOffsetGuessCache = new Map();\n\n/**\n * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them.\n *\n * A DateTime comprises of:\n * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch.\n * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone).\n * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`.\n *\n * Here is a brief overview of the most commonly used functionality it provides:\n *\n * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link DateTime.local}, {@link DateTime.utc}, and (most flexibly) {@link DateTime.fromObject}. To create one from a standard string format, use {@link DateTime.fromISO}, {@link DateTime.fromHTTP}, and {@link DateTime.fromRFC2822}. To create one from a custom string format, use {@link DateTime.fromFormat}. To create one from a native JS date, use {@link DateTime.fromJSDate}.\n * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link DateTime#toObject}), use the {@link DateTime#year}, {@link DateTime#month},\n * {@link DateTime#day}, {@link DateTime#hour}, {@link DateTime#minute}, {@link DateTime#second}, {@link DateTime#millisecond} accessors.\n * * **Week calendar**: For ISO week calendar attributes, see the {@link DateTime#weekYear}, {@link DateTime#weekNumber}, and {@link DateTime#weekday} accessors.\n * * **Configuration** See the {@link DateTime#locale} and {@link DateTime#numberingSystem} accessors.\n * * **Transformation**: To transform the DateTime into other DateTimes, use {@link DateTime#set}, {@link DateTime#reconfigure}, {@link DateTime#setZone}, {@link DateTime#setLocale}, {@link DateTime.plus}, {@link DateTime#minus}, {@link DateTime#endOf}, {@link DateTime#startOf}, {@link DateTime#toUTC}, and {@link DateTime#toLocal}.\n * * **Output**: To convert the DateTime to other representations, use the {@link DateTime#toRelative}, {@link DateTime#toRelativeCalendar}, {@link DateTime#toJSON}, {@link DateTime#toISO}, {@link DateTime#toHTTP}, {@link DateTime#toObject}, {@link DateTime#toRFC2822}, {@link DateTime#toString}, {@link DateTime#toLocaleString}, {@link DateTime#toFormat}, {@link DateTime#toMillis} and {@link DateTime#toJSDate}.\n *\n * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation.\n */\nexport default class DateTime {\n /**\n * @access private\n */\n constructor(config) {\n const zone = config.zone || Settings.defaultZone;\n\n let invalid =\n config.invalid ||\n (Number.isNaN(config.ts) ? new Invalid(\"invalid input\") : null) ||\n (!zone.isValid ? unsupportedZone(zone) : null);\n /**\n * @access private\n */\n this.ts = isUndefined(config.ts) ? Settings.now() : config.ts;\n\n let c = null,\n o = null;\n if (!invalid) {\n const unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone);\n\n if (unchanged) {\n [c, o] = [config.old.c, config.old.o];\n } else {\n // If an offset has been passed and we have not been called from\n // clone(), we can trust it and avoid the offset calculation.\n const ot = isNumber(config.o) && !config.old ? config.o : zone.offset(this.ts);\n c = tsToObj(this.ts, ot);\n invalid = Number.isNaN(c.year) ? new Invalid(\"invalid input\") : null;\n c = invalid ? null : c;\n o = invalid ? null : ot;\n }\n }\n\n /**\n * @access private\n */\n this._zone = zone;\n /**\n * @access private\n */\n this.loc = config.loc || Locale.create();\n /**\n * @access private\n */\n this.invalid = invalid;\n /**\n * @access private\n */\n this.weekData = null;\n /**\n * @access private\n */\n this.localWeekData = null;\n /**\n * @access private\n */\n this.c = c;\n /**\n * @access private\n */\n this.o = o;\n /**\n * @access private\n */\n this.isLuxonDateTime = true;\n }\n\n // CONSTRUCT\n\n /**\n * Create a DateTime for the current instant, in the system's time zone.\n *\n * Use Settings to override these default values if needed.\n * @example DateTime.now().toISO() //~> now in the ISO format\n * @return {DateTime}\n */\n static now() {\n return new DateTime({});\n }\n\n /**\n * Create a local DateTime\n * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used\n * @param {number} [month=1] - The month, 1-indexed\n * @param {number} [day=1] - The day of the month, 1-indexed\n * @param {number} [hour=0] - The hour of the day, in 24-hour time\n * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n * @example DateTime.local() //~> now\n * @example DateTime.local({ zone: \"America/New_York\" }) //~> now, in US east coast time\n * @example DateTime.local(2017) //~> 2017-01-01T00:00:00\n * @example DateTime.local(2017, 3) //~> 2017-03-01T00:00:00\n * @example DateTime.local(2017, 3, 12, { locale: \"fr\" }) //~> 2017-03-12T00:00:00, with a French locale\n * @example DateTime.local(2017, 3, 12, 5) //~> 2017-03-12T05:00:00\n * @example DateTime.local(2017, 3, 12, 5, { zone: \"utc\" }) //~> 2017-03-12T05:00:00, in UTC\n * @example DateTime.local(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00\n * @example DateTime.local(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10\n * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765\n * @return {DateTime}\n */\n static local() {\n const [opts, args] = lastOpts(arguments),\n [year, month, day, hour, minute, second, millisecond] = args;\n return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n }\n\n /**\n * Create a DateTime in UTC\n * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used\n * @param {number} [month=1] - The month, 1-indexed\n * @param {number} [day=1] - The day of the month\n * @param {number} [hour=0] - The hour of the day, in 24-hour time\n * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n * @param {Object} options - configuration options for the DateTime\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} [options.outputCalendar] - the output calendar to set on the resulting DateTime instance\n * @param {string} [options.numberingSystem] - the numbering system to set on the resulting DateTime instance\n * @param {string} [options.weekSettings] - the week settings to set on the resulting DateTime instance\n * @example DateTime.utc() //~> now\n * @example DateTime.utc(2017) //~> 2017-01-01T00:00:00Z\n * @example DateTime.utc(2017, 3) //~> 2017-03-01T00:00:00Z\n * @example DateTime.utc(2017, 3, 12) //~> 2017-03-12T00:00:00Z\n * @example DateTime.utc(2017, 3, 12, 5) //~> 2017-03-12T05:00:00Z\n * @example DateTime.utc(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00Z\n * @example DateTime.utc(2017, 3, 12, 5, 45, { locale: \"fr\" }) //~> 2017-03-12T05:45:00Z with a French locale\n * @example DateTime.utc(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10Z\n * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765, { locale: \"fr\" }) //~> 2017-03-12T05:45:10.765Z with a French locale\n * @return {DateTime}\n */\n static utc() {\n const [opts, args] = lastOpts(arguments),\n [year, month, day, hour, minute, second, millisecond] = args;\n\n opts.zone = FixedOffsetZone.utcInstance;\n return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n }\n\n /**\n * Create a DateTime from a JavaScript Date object. Uses the default zone.\n * @param {Date} date - a JavaScript Date object\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @return {DateTime}\n */\n static fromJSDate(date, options = {}) {\n const ts = isDate(date) ? date.valueOf() : NaN;\n if (Number.isNaN(ts)) {\n return DateTime.invalid(\"invalid input\");\n }\n\n const zoneToUse = normalizeZone(options.zone, Settings.defaultZone);\n if (!zoneToUse.isValid) {\n return DateTime.invalid(unsupportedZone(zoneToUse));\n }\n\n return new DateTime({\n ts: ts,\n zone: zoneToUse,\n loc: Locale.fromObject(options),\n });\n }\n\n /**\n * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n * @param {number} milliseconds - a number of milliseconds since 1970 UTC\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromMillis(milliseconds, options = {}) {\n if (!isNumber(milliseconds)) {\n throw new InvalidArgumentError(\n `fromMillis requires a numerical input, but received a ${typeof milliseconds} with value ${milliseconds}`\n );\n } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) {\n // this isn't perfect because we can still end up out of range because of additional shifting, but it's a start\n return DateTime.invalid(\"Timestamp out of range\");\n } else {\n return new DateTime({\n ts: milliseconds,\n zone: normalizeZone(options.zone, Settings.defaultZone),\n loc: Locale.fromObject(options),\n });\n }\n }\n\n /**\n * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n * @param {number} seconds - a number of seconds since 1970 UTC\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromSeconds(seconds, options = {}) {\n if (!isNumber(seconds)) {\n throw new InvalidArgumentError(\"fromSeconds requires a numerical input\");\n } else {\n return new DateTime({\n ts: seconds * 1000,\n zone: normalizeZone(options.zone, Settings.defaultZone),\n loc: Locale.fromObject(options),\n });\n }\n }\n\n /**\n * Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults.\n * @param {Object} obj - the object to create the DateTime from\n * @param {number} obj.year - a year, such as 1987\n * @param {number} obj.month - a month, 1-12\n * @param {number} obj.day - a day of the month, 1-31, depending on the month\n * @param {number} obj.ordinal - day of the year, 1-365 or 366\n * @param {number} obj.weekYear - an ISO week year\n * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year\n * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday\n * @param {number} obj.localWeekYear - a week year, according to the locale\n * @param {number} obj.localWeekNumber - a week number, between 1 and 52 or 53, depending on the year, according to the locale\n * @param {number} obj.localWeekday - a weekday, 1-7, where 1 is the first and 7 is the last day of the week, according to the locale\n * @param {number} obj.hour - hour of the day, 0-23\n * @param {number} obj.minute - minute of the hour, 0-59\n * @param {number} obj.second - second of the minute, 0-59\n * @param {number} obj.millisecond - millisecond of the second, 0-999\n * @param {Object} opts - options for creating this DateTime\n * @param {string|Zone} [opts.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone()\n * @param {string} [opts.locale='system\\'s locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25'\n * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01'\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'utc' }),\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'local' })\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'America/New_York' })\n * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13'\n * @example DateTime.fromObject({ localWeekYear: 2022, localWeekNumber: 1, localWeekday: 1 }, { locale: \"en-US\" }).toISODate() //=> '2021-12-26'\n * @return {DateTime}\n */\n static fromObject(obj, opts = {}) {\n obj = obj || {};\n const zoneToUse = normalizeZone(opts.zone, Settings.defaultZone);\n if (!zoneToUse.isValid) {\n return DateTime.invalid(unsupportedZone(zoneToUse));\n }\n\n const loc = Locale.fromObject(opts);\n const normalized = normalizeObject(obj, normalizeUnitWithLocalWeeks);\n const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, loc);\n\n const tsNow = Settings.now(),\n offsetProvis = !isUndefined(opts.specificOffset)\n ? opts.specificOffset\n : zoneToUse.offset(tsNow),\n containsOrdinal = !isUndefined(normalized.ordinal),\n containsGregorYear = !isUndefined(normalized.year),\n containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n containsGregor = containsGregorYear || containsGregorMD,\n definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n // cases:\n // just a weekday -> this week's instance of that weekday, no worries\n // (gregorian data or ordinal) + (weekYear or weekNumber) -> error\n // (gregorian month or day) + ordinal -> error\n // otherwise just use weeks or ordinals or gregorian, depending on what's specified\n\n if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n throw new ConflictingSpecificationError(\n \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n );\n }\n\n if (containsGregorMD && containsOrdinal) {\n throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n }\n\n const useWeekData = definiteWeekDef || (normalized.weekday && !containsGregor);\n\n // configure ourselves to deal with gregorian dates or week stuff\n let units,\n defaultValues,\n objNow = tsToObj(tsNow, offsetProvis);\n if (useWeekData) {\n units = orderedWeekUnits;\n defaultValues = defaultWeekUnitValues;\n objNow = gregorianToWeek(objNow, minDaysInFirstWeek, startOfWeek);\n } else if (containsOrdinal) {\n units = orderedOrdinalUnits;\n defaultValues = defaultOrdinalUnitValues;\n objNow = gregorianToOrdinal(objNow);\n } else {\n units = orderedUnits;\n defaultValues = defaultUnitValues;\n }\n\n // set default values for missing stuff\n let foundFirst = false;\n for (const u of units) {\n const v = normalized[u];\n if (!isUndefined(v)) {\n foundFirst = true;\n } else if (foundFirst) {\n normalized[u] = defaultValues[u];\n } else {\n normalized[u] = objNow[u];\n }\n }\n\n // make sure the values we have are in range\n const higherOrderInvalid = useWeekData\n ? hasInvalidWeekData(normalized, minDaysInFirstWeek, startOfWeek)\n : containsOrdinal\n ? hasInvalidOrdinalData(normalized)\n : hasInvalidGregorianData(normalized),\n invalid = higherOrderInvalid || hasInvalidTimeData(normalized);\n\n if (invalid) {\n return DateTime.invalid(invalid);\n }\n\n // compute the actual time\n const gregorian = useWeekData\n ? weekToGregorian(normalized, minDaysInFirstWeek, startOfWeek)\n : containsOrdinal\n ? ordinalToGregorian(normalized)\n : normalized,\n [tsFinal, offsetFinal] = objToTS(gregorian, offsetProvis, zoneToUse),\n inst = new DateTime({\n ts: tsFinal,\n zone: zoneToUse,\n o: offsetFinal,\n loc,\n });\n\n // gregorian data + weekday serves only to validate\n if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) {\n return DateTime.invalid(\n \"mismatched weekday\",\n `you can't specify both a weekday of ${normalized.weekday} and a date of ${inst.toISO()}`\n );\n }\n\n if (!inst.isValid) {\n return DateTime.invalid(inst.invalid);\n }\n\n return inst;\n }\n\n /**\n * Create a DateTime from an ISO 8601 string\n * @param {string} text - the ISO string\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance\n * @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance\n * @param {string} [opts.weekSettings] - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromISO('2016-05-25T09:08:34.123')\n * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00')\n * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true})\n * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'})\n * @example DateTime.fromISO('2016-W05-4')\n * @return {DateTime}\n */\n static fromISO(text, opts = {}) {\n const [vals, parsedZone] = parseISODate(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"ISO 8601\", text);\n }\n\n /**\n * Create a DateTime from an RFC 2822 string\n * @param {string} text - the RFC 2822 string\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT')\n * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600')\n * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z')\n * @return {DateTime}\n */\n static fromRFC2822(text, opts = {}) {\n const [vals, parsedZone] = parseRFC2822Date(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"RFC 2822\", text);\n }\n\n /**\n * Create a DateTime from an HTTP header date\n * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n * @param {string} text - the HTTP header date\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods.\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT')\n * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT')\n * @example DateTime.fromHTTP('Sun Nov 6 08:49:37 1994')\n * @return {DateTime}\n */\n static fromHTTP(text, opts = {}) {\n const [vals, parsedZone] = parseHTTPDate(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"HTTP\", opts);\n }\n\n /**\n * Create a DateTime from an input string and format string.\n * Defaults to en-US if no locale has been specified, regardless of the system's locale. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/parsing?id=table-of-tokens).\n * @param {string} text - the string to parse\n * @param {string} fmt - the format the string is expected to be in (see the link below for the formats)\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromFormat(text, fmt, opts = {}) {\n if (isUndefined(text) || isUndefined(fmt)) {\n throw new InvalidArgumentError(\"fromFormat requires an input string and a format\");\n }\n\n const { locale = null, numberingSystem = null } = opts,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n }),\n [vals, parsedZone, specificOffset, invalid] = parseFromTokens(localeToUse, text, fmt);\n if (invalid) {\n return DateTime.invalid(invalid);\n } else {\n return parseDataToDateTime(vals, parsedZone, opts, `format ${fmt}`, text, specificOffset);\n }\n }\n\n /**\n * @deprecated use fromFormat instead\n */\n static fromString(text, fmt, opts = {}) {\n return DateTime.fromFormat(text, fmt, opts);\n }\n\n /**\n * Create a DateTime from a SQL date, time, or datetime\n * Defaults to en-US if no locale has been specified, regardless of the system's locale\n * @param {string} text - the string to parse\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @example DateTime.fromSQL('2017-05-15')\n * @example DateTime.fromSQL('2017-05-15 09:12:34')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true })\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' })\n * @example DateTime.fromSQL('09:12:34.342')\n * @return {DateTime}\n */\n static fromSQL(text, opts = {}) {\n const [vals, parsedZone] = parseSQL(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"SQL\", text);\n }\n\n /**\n * Create an invalid DateTime.\n * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent.\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {DateTime}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the DateTime is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidDateTimeError(invalid);\n } else {\n return new DateTime({ invalid });\n }\n }\n\n /**\n * Check if an object is an instance of DateTime. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isDateTime(o) {\n return (o && o.isLuxonDateTime) || false;\n }\n\n /**\n * Produce the format string for a set of options\n * @param formatOpts\n * @param localeOpts\n * @returns {string}\n */\n static parseFormatForOpts(formatOpts, localeOpts = {}) {\n const tokenList = formatOptsToTokens(formatOpts, Locale.fromObject(localeOpts));\n return !tokenList ? null : tokenList.map((t) => (t ? t.val : null)).join(\"\");\n }\n\n /**\n * Produce the the fully expanded format token for the locale\n * Does NOT quote characters, so quoted tokens will not round trip correctly\n * @param fmt\n * @param localeOpts\n * @returns {string}\n */\n static expandFormat(fmt, localeOpts = {}) {\n const expanded = expandMacroTokens(Formatter.parseFormat(fmt), Locale.fromObject(localeOpts));\n return expanded.map((t) => t.val).join(\"\");\n }\n\n static resetCache() {\n zoneOffsetTs = undefined;\n zoneOffsetGuessCache.clear();\n }\n\n // INFO\n\n /**\n * Get the value of unit.\n * @param {string} unit - a unit such as 'minute' or 'day'\n * @example DateTime.local(2017, 7, 4).get('month'); //=> 7\n * @example DateTime.local(2017, 7, 4).get('day'); //=> 4\n * @return {number}\n */\n get(unit) {\n return this[unit];\n }\n\n /**\n * Returns whether the DateTime is valid. Invalid DateTimes occur when:\n * * The DateTime was created from invalid calendar information, such as the 13th month or February 30\n * * The DateTime was created by an operation on another invalid date\n * @type {boolean}\n */\n get isValid() {\n return this.invalid === null;\n }\n\n /**\n * Returns an error code if this DateTime is invalid, or null if the DateTime is valid\n * @type {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime\n *\n * @type {string}\n */\n get locale() {\n return this.isValid ? this.loc.locale : null;\n }\n\n /**\n * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime\n *\n * @type {string}\n */\n get numberingSystem() {\n return this.isValid ? this.loc.numberingSystem : null;\n }\n\n /**\n * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime\n *\n * @type {string}\n */\n get outputCalendar() {\n return this.isValid ? this.loc.outputCalendar : null;\n }\n\n /**\n * Get the time zone associated with this DateTime.\n * @type {Zone}\n */\n get zone() {\n return this._zone;\n }\n\n /**\n * Get the name of the time zone.\n * @type {string}\n */\n get zoneName() {\n return this.isValid ? this.zone.name : null;\n }\n\n /**\n * Get the year\n * @example DateTime.local(2017, 5, 25).year //=> 2017\n * @type {number}\n */\n get year() {\n return this.isValid ? this.c.year : NaN;\n }\n\n /**\n * Get the quarter\n * @example DateTime.local(2017, 5, 25).quarter //=> 2\n * @type {number}\n */\n get quarter() {\n return this.isValid ? Math.ceil(this.c.month / 3) : NaN;\n }\n\n /**\n * Get the month (1-12).\n * @example DateTime.local(2017, 5, 25).month //=> 5\n * @type {number}\n */\n get month() {\n return this.isValid ? this.c.month : NaN;\n }\n\n /**\n * Get the day of the month (1-30ish).\n * @example DateTime.local(2017, 5, 25).day //=> 25\n * @type {number}\n */\n get day() {\n return this.isValid ? this.c.day : NaN;\n }\n\n /**\n * Get the hour of the day (0-23).\n * @example DateTime.local(2017, 5, 25, 9).hour //=> 9\n * @type {number}\n */\n get hour() {\n return this.isValid ? this.c.hour : NaN;\n }\n\n /**\n * Get the minute of the hour (0-59).\n * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30\n * @type {number}\n */\n get minute() {\n return this.isValid ? this.c.minute : NaN;\n }\n\n /**\n * Get the second of the minute (0-59).\n * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52\n * @type {number}\n */\n get second() {\n return this.isValid ? this.c.second : NaN;\n }\n\n /**\n * Get the millisecond of the second (0-999).\n * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654\n * @type {number}\n */\n get millisecond() {\n return this.isValid ? this.c.millisecond : NaN;\n }\n\n /**\n * Get the week year\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2014, 12, 31).weekYear //=> 2015\n * @type {number}\n */\n get weekYear() {\n return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN;\n }\n\n /**\n * Get the week number of the week year (1-52ish).\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2017, 5, 25).weekNumber //=> 21\n * @type {number}\n */\n get weekNumber() {\n return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN;\n }\n\n /**\n * Get the day of the week.\n * 1 is Monday and 7 is Sunday\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2014, 11, 31).weekday //=> 4\n * @type {number}\n */\n get weekday() {\n return this.isValid ? possiblyCachedWeekData(this).weekday : NaN;\n }\n\n /**\n * Returns true if this date is on a weekend according to the locale, false otherwise\n * @returns {boolean}\n */\n get isWeekend() {\n return this.isValid && this.loc.getWeekendDays().includes(this.weekday);\n }\n\n /**\n * Get the day of the week according to the locale.\n * 1 is the first day of the week and 7 is the last day of the week.\n * If the locale assigns Sunday as the first day of the week, then a date which is a Sunday will return 1,\n * @returns {number}\n */\n get localWeekday() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekday : NaN;\n }\n\n /**\n * Get the week number of the week year according to the locale. Different locales assign week numbers differently,\n * because the week can start on different days of the week (see localWeekday) and because a different number of days\n * is required for a week to count as the first week of a year.\n * @returns {number}\n */\n get localWeekNumber() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekNumber : NaN;\n }\n\n /**\n * Get the week year according to the locale. Different locales assign week numbers (and therefor week years)\n * differently, see localWeekNumber.\n * @returns {number}\n */\n get localWeekYear() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekYear : NaN;\n }\n\n /**\n * Get the ordinal (meaning the day of the year)\n * @example DateTime.local(2017, 5, 25).ordinal //=> 145\n * @type {number|DateTime}\n */\n get ordinal() {\n return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN;\n }\n\n /**\n * Get the human readable short month name, such as 'Oct'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).monthShort //=> Oct\n * @type {string}\n */\n get monthShort() {\n return this.isValid ? Info.months(\"short\", { locObj: this.loc })[this.month - 1] : null;\n }\n\n /**\n * Get the human readable long month name, such as 'October'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).monthLong //=> October\n * @type {string}\n */\n get monthLong() {\n return this.isValid ? Info.months(\"long\", { locObj: this.loc })[this.month - 1] : null;\n }\n\n /**\n * Get the human readable short weekday, such as 'Mon'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon\n * @type {string}\n */\n get weekdayShort() {\n return this.isValid ? Info.weekdays(\"short\", { locObj: this.loc })[this.weekday - 1] : null;\n }\n\n /**\n * Get the human readable long weekday, such as 'Monday'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday\n * @type {string}\n */\n get weekdayLong() {\n return this.isValid ? Info.weekdays(\"long\", { locObj: this.loc })[this.weekday - 1] : null;\n }\n\n /**\n * Get the UTC offset of this DateTime in minutes\n * @example DateTime.now().offset //=> -240\n * @example DateTime.utc().offset //=> 0\n * @type {number}\n */\n get offset() {\n return this.isValid ? +this.o : NaN;\n }\n\n /**\n * Get the short human name for the zone's current offset, for example \"EST\" or \"EDT\".\n * Defaults to the system's locale if no locale has been specified\n * @type {string}\n */\n get offsetNameShort() {\n if (this.isValid) {\n return this.zone.offsetName(this.ts, {\n format: \"short\",\n locale: this.locale,\n });\n } else {\n return null;\n }\n }\n\n /**\n * Get the long human name for the zone's current offset, for example \"Eastern Standard Time\" or \"Eastern Daylight Time\".\n * Defaults to the system's locale if no locale has been specified\n * @type {string}\n */\n get offsetNameLong() {\n if (this.isValid) {\n return this.zone.offsetName(this.ts, {\n format: \"long\",\n locale: this.locale,\n });\n } else {\n return null;\n }\n }\n\n /**\n * Get whether this zone's offset ever changes, as in a DST.\n * @type {boolean}\n */\n get isOffsetFixed() {\n return this.isValid ? this.zone.isUniversal : null;\n }\n\n /**\n * Get whether the DateTime is in a DST.\n * @type {boolean}\n */\n get isInDST() {\n if (this.isOffsetFixed) {\n return false;\n } else {\n return (\n this.offset > this.set({ month: 1, day: 1 }).offset ||\n this.offset > this.set({ month: 5 }).offset\n );\n }\n }\n\n /**\n * Get those DateTimes which have the same local time as this DateTime, but a different offset from UTC\n * in this DateTime's zone. During DST changes local time can be ambiguous, for example\n * `2023-10-29T02:30:00` in `Europe/Berlin` can have offset `+01:00` or `+02:00`.\n * This method will return both possible DateTimes if this DateTime's local time is ambiguous.\n * @returns {DateTime[]}\n */\n getPossibleOffsets() {\n if (!this.isValid || this.isOffsetFixed) {\n return [this];\n }\n const dayMs = 86400000;\n const minuteMs = 60000;\n const localTS = objToLocalTS(this.c);\n const oEarlier = this.zone.offset(localTS - dayMs);\n const oLater = this.zone.offset(localTS + dayMs);\n\n const o1 = this.zone.offset(localTS - oEarlier * minuteMs);\n const o2 = this.zone.offset(localTS - oLater * minuteMs);\n if (o1 === o2) {\n return [this];\n }\n const ts1 = localTS - o1 * minuteMs;\n const ts2 = localTS - o2 * minuteMs;\n const c1 = tsToObj(ts1, o1);\n const c2 = tsToObj(ts2, o2);\n if (\n c1.hour === c2.hour &&\n c1.minute === c2.minute &&\n c1.second === c2.second &&\n c1.millisecond === c2.millisecond\n ) {\n return [clone(this, { ts: ts1 }), clone(this, { ts: ts2 })];\n }\n return [this];\n }\n\n /**\n * Returns true if this DateTime is in a leap year, false otherwise\n * @example DateTime.local(2016).isInLeapYear //=> true\n * @example DateTime.local(2013).isInLeapYear //=> false\n * @type {boolean}\n */\n get isInLeapYear() {\n return isLeapYear(this.year);\n }\n\n /**\n * Returns the number of days in this DateTime's month\n * @example DateTime.local(2016, 2).daysInMonth //=> 29\n * @example DateTime.local(2016, 3).daysInMonth //=> 31\n * @type {number}\n */\n get daysInMonth() {\n return daysInMonth(this.year, this.month);\n }\n\n /**\n * Returns the number of days in this DateTime's year\n * @example DateTime.local(2016).daysInYear //=> 366\n * @example DateTime.local(2013).daysInYear //=> 365\n * @type {number}\n */\n get daysInYear() {\n return this.isValid ? daysInYear(this.year) : NaN;\n }\n\n /**\n * Returns the number of weeks in this DateTime's year\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2004).weeksInWeekYear //=> 53\n * @example DateTime.local(2013).weeksInWeekYear //=> 52\n * @type {number}\n */\n get weeksInWeekYear() {\n return this.isValid ? weeksInWeekYear(this.weekYear) : NaN;\n }\n\n /**\n * Returns the number of weeks in this DateTime's local week year\n * @example DateTime.local(2020, 6, {locale: 'en-US'}).weeksInLocalWeekYear //=> 52\n * @example DateTime.local(2020, 6, {locale: 'de-DE'}).weeksInLocalWeekYear //=> 53\n * @type {number}\n */\n get weeksInLocalWeekYear() {\n return this.isValid\n ? weeksInWeekYear(\n this.localWeekYear,\n this.loc.getMinDaysInFirstWeek(),\n this.loc.getStartOfWeek()\n )\n : NaN;\n }\n\n /**\n * Returns the resolved Intl options for this DateTime.\n * This is useful in understanding the behavior of formatting methods\n * @param {Object} opts - the same options as toLocaleString\n * @return {Object}\n */\n resolvedLocaleOptions(opts = {}) {\n const { locale, numberingSystem, calendar } = Formatter.create(\n this.loc.clone(opts),\n opts\n ).resolvedOptions(this);\n return { locale, numberingSystem, outputCalendar: calendar };\n }\n\n // TRANSFORM\n\n /**\n * \"Set\" the DateTime's zone to UTC. Returns a newly-constructed DateTime.\n *\n * Equivalent to {@link DateTime#setZone}('utc')\n * @param {number} [offset=0] - optionally, an offset from UTC in minutes\n * @param {Object} [opts={}] - options to pass to `setZone()`\n * @return {DateTime}\n */\n toUTC(offset = 0, opts = {}) {\n return this.setZone(FixedOffsetZone.instance(offset), opts);\n }\n\n /**\n * \"Set\" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime.\n *\n * Equivalent to `setZone('local')`\n * @return {DateTime}\n */\n toLocal() {\n return this.setZone(Settings.defaultZone);\n }\n\n /**\n * \"Set\" the DateTime's zone to specified zone. Returns a newly-constructed DateTime.\n *\n * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link DateTime#plus}. You may wish to use {@link DateTime#toLocal} and {@link DateTime#toUTC} which provide simple convenience wrappers for commonly used zones.\n * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link DateTime#Zone} class.\n * @param {Object} opts - options\n * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this.\n * @return {DateTime}\n */\n setZone(zone, { keepLocalTime = false, keepCalendarTime = false } = {}) {\n zone = normalizeZone(zone, Settings.defaultZone);\n if (zone.equals(this.zone)) {\n return this;\n } else if (!zone.isValid) {\n return DateTime.invalid(unsupportedZone(zone));\n } else {\n let newTS = this.ts;\n if (keepLocalTime || keepCalendarTime) {\n const offsetGuess = zone.offset(this.ts);\n const asObj = this.toObject();\n [newTS] = objToTS(asObj, offsetGuess, zone);\n }\n return clone(this, { ts: newTS, zone });\n }\n }\n\n /**\n * \"Set\" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime.\n * @param {Object} properties - the properties to set\n * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' })\n * @return {DateTime}\n */\n reconfigure({ locale, numberingSystem, outputCalendar } = {}) {\n const loc = this.loc.clone({ locale, numberingSystem, outputCalendar });\n return clone(this, { loc });\n }\n\n /**\n * \"Set\" the locale. Returns a newly-constructed DateTime.\n * Just a convenient alias for reconfigure({ locale })\n * @example DateTime.local(2017, 5, 25).setLocale('en-GB')\n * @return {DateTime}\n */\n setLocale(locale) {\n return this.reconfigure({ locale });\n }\n\n /**\n * \"Set\" the values of specified units. Returns a newly-constructed DateTime.\n * You can only set units with this method; for \"setting\" metadata, see {@link DateTime#reconfigure} and {@link DateTime#setZone}.\n *\n * This method also supports setting locale-based week units, i.e. `localWeekday`, `localWeekNumber` and `localWeekYear`.\n * They cannot be mixed with ISO-week units like `weekday`.\n * @param {Object} values - a mapping of units to numbers\n * @example dt.set({ year: 2017 })\n * @example dt.set({ hour: 8, minute: 30 })\n * @example dt.set({ weekday: 5 })\n * @example dt.set({ year: 2005, ordinal: 234 })\n * @return {DateTime}\n */\n set(values) {\n if (!this.isValid) return this;\n\n const normalized = normalizeObject(values, normalizeUnitWithLocalWeeks);\n const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, this.loc);\n\n const settingWeekStuff =\n !isUndefined(normalized.weekYear) ||\n !isUndefined(normalized.weekNumber) ||\n !isUndefined(normalized.weekday),\n containsOrdinal = !isUndefined(normalized.ordinal),\n containsGregorYear = !isUndefined(normalized.year),\n containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n containsGregor = containsGregorYear || containsGregorMD,\n definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n throw new ConflictingSpecificationError(\n \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n );\n }\n\n if (containsGregorMD && containsOrdinal) {\n throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n }\n\n let mixed;\n if (settingWeekStuff) {\n mixed = weekToGregorian(\n { ...gregorianToWeek(this.c, minDaysInFirstWeek, startOfWeek), ...normalized },\n minDaysInFirstWeek,\n startOfWeek\n );\n } else if (!isUndefined(normalized.ordinal)) {\n mixed = ordinalToGregorian({ ...gregorianToOrdinal(this.c), ...normalized });\n } else {\n mixed = { ...this.toObject(), ...normalized };\n\n // if we didn't set the day but we ended up on an overflow date,\n // use the last day of the right month\n if (isUndefined(normalized.day)) {\n mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day);\n }\n }\n\n const [ts, o] = objToTS(mixed, this.o, this.zone);\n return clone(this, { ts, o });\n }\n\n /**\n * Add a period of time to this DateTime and return the resulting DateTime\n *\n * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between.\n * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @example DateTime.now().plus(123) //~> in 123 milliseconds\n * @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes\n * @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow\n * @example DateTime.now().plus({ days: -1 }) //~> this time yesterday\n * @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min\n * @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min\n * @return {DateTime}\n */\n plus(duration) {\n if (!this.isValid) return this;\n const dur = Duration.fromDurationLike(duration);\n return clone(this, adjustTime(this, dur));\n }\n\n /**\n * Subtract a period of time to this DateTime and return the resulting DateTime\n * See {@link DateTime#plus}\n * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n @return {DateTime}\n */\n minus(duration) {\n if (!this.isValid) return this;\n const dur = Duration.fromDurationLike(duration).negate();\n return clone(this, adjustTime(this, dur));\n }\n\n /**\n * \"Set\" this DateTime to the beginning of a unit of time.\n * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week\n * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01'\n * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01'\n * @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays\n * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00'\n * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00'\n * @return {DateTime}\n */\n startOf(unit, { useLocaleWeeks = false } = {}) {\n if (!this.isValid) return this;\n\n const o = {},\n normalizedUnit = Duration.normalizeUnit(unit);\n switch (normalizedUnit) {\n case \"years\":\n o.month = 1;\n // falls through\n case \"quarters\":\n case \"months\":\n o.day = 1;\n // falls through\n case \"weeks\":\n case \"days\":\n o.hour = 0;\n // falls through\n case \"hours\":\n o.minute = 0;\n // falls through\n case \"minutes\":\n o.second = 0;\n // falls through\n case \"seconds\":\n o.millisecond = 0;\n break;\n case \"milliseconds\":\n break;\n // no default, invalid units throw in normalizeUnit()\n }\n\n if (normalizedUnit === \"weeks\") {\n if (useLocaleWeeks) {\n const startOfWeek = this.loc.getStartOfWeek();\n const { weekday } = this;\n if (weekday < startOfWeek) {\n o.weekNumber = this.weekNumber - 1;\n }\n o.weekday = startOfWeek;\n } else {\n o.weekday = 1;\n }\n }\n\n if (normalizedUnit === \"quarters\") {\n const q = Math.ceil(this.month / 3);\n o.month = (q - 1) * 3 + 1;\n }\n\n return this.set(o);\n }\n\n /**\n * \"Set\" this DateTime to the end (meaning the last millisecond) of a unit of time\n * @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week\n * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays\n * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00'\n * @return {DateTime}\n */\n endOf(unit, opts) {\n return this.isValid\n ? this.plus({ [unit]: 1 })\n .startOf(unit, opts)\n .minus(1)\n : this;\n }\n\n // OUTPUT\n\n /**\n * Returns a string representation of this DateTime formatted according to the specified format string.\n * **You may not want this.** See {@link DateTime#toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/formatting?id=table-of-tokens).\n * Defaults to en-US if no locale has been specified, regardless of the system's locale.\n * @param {string} fmt - the format string\n * @param {Object} opts - opts to override the configuration options on this DateTime\n * @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22'\n * @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22'\n * @example DateTime.now().toFormat('yyyy LLL dd', { locale: \"fr\" }) //=> '2017 avr. 22'\n * @example DateTime.now().toFormat(\"HH 'hours and' mm 'minutes'\") //=> '20 hours and 55 minutes'\n * @return {string}\n */\n toFormat(fmt, opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt)\n : INVALID;\n }\n\n /**\n * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`.\n * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation\n * of the DateTime in the assigned locale.\n * Defaults to the system's locale if no locale has been specified\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param formatOpts {Object} - Intl.DateTimeFormat constructor options and configuration options\n * @param {Object} opts - opts to override the configuration options on this DateTime\n * @example DateTime.now().toLocaleString(); //=> 4/20/2017\n * @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017'\n * @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017'\n * @example DateTime.now().toLocaleString(DateTime.DATE_FULL, { locale: 'fr' }); //=> '28 août 2022'\n * @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM'\n * @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM'\n * @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20'\n * @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM'\n * @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }); //=> '11:32'\n * @return {string}\n */\n toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this)\n : INVALID;\n }\n\n /**\n * Returns an array of format \"parts\", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output.\n * Defaults to the system's locale if no locale has been specified\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts\n * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`.\n * @example DateTime.now().toLocaleParts(); //=> [\n * //=> { type: 'day', value: '25' },\n * //=> { type: 'literal', value: '/' },\n * //=> { type: 'month', value: '05' },\n * //=> { type: 'literal', value: '/' },\n * //=> { type: 'year', value: '1982' }\n * //=> ]\n */\n toLocaleParts(opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this)\n : [];\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.extendedZone=false] - add the time zone format extension\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'years', 'months', 'days', 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0.\n * @example DateTime.utc(1983, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z'\n * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00'\n * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335'\n * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400'\n * @example DateTime.now().toISO({ precision: 'day' }) //=> '2017-04-22Z'\n * @example DateTime.now().toISO({ precision: 'minute' }) //=> '2017-04-22T20:47Z'\n * @return {string|null}\n */\n toISO({\n format = \"extended\",\n suppressSeconds = false,\n suppressMilliseconds = false,\n includeOffset = true,\n extendedZone = false,\n precision = \"milliseconds\",\n } = {}) {\n if (!this.isValid) {\n return null;\n }\n\n precision = normalizeUnit(precision);\n const ext = format === \"extended\";\n\n let c = toISODate(this, ext, precision);\n if (orderedUnits.indexOf(precision) >= 3) c += \"T\";\n c += toISOTime(\n this,\n ext,\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n );\n return c;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's date component\n * @param {Object} opts - options\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='day'] - truncate output to desired precision: 'years', 'months', or 'days'.\n * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25'\n * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525'\n * @example DateTime.utc(1982, 5, 25).toISODate({ precision: 'month' }) //=> '1982-05'\n * @return {string|null}\n */\n toISODate({ format = \"extended\", precision = \"day\" } = {}) {\n if (!this.isValid) {\n return null;\n }\n return toISODate(this, format === \"extended\", normalizeUnit(precision));\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's week date\n * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2'\n * @return {string}\n */\n toISOWeekDate() {\n return toTechFormat(this, \"kkkk-'W'WW-c\");\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's time component\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.extendedZone=true] - add the time zone format extension\n * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0.\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34, second: 56 }).toISOTime({ precision: 'minute' }) //=> '07:34Z'\n * @return {string}\n */\n toISOTime({\n suppressMilliseconds = false,\n suppressSeconds = false,\n includeOffset = true,\n includePrefix = false,\n extendedZone = false,\n format = \"extended\",\n precision = \"milliseconds\",\n } = {}) {\n if (!this.isValid) {\n return null;\n }\n\n precision = normalizeUnit(precision);\n let c = includePrefix && orderedUnits.indexOf(precision) >= 3 ? \"T\" : \"\";\n return (\n c +\n toISOTime(\n this,\n format === \"extended\",\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n )\n );\n }\n\n /**\n * Returns an RFC 2822-compatible string representation of this DateTime\n * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000'\n * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400'\n * @return {string}\n */\n toRFC2822() {\n return toTechFormat(this, \"EEE, dd LLL yyyy HH:mm:ss ZZZ\", false);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in HTTP headers. The output is always expressed in GMT.\n * Specifically, the string conforms to RFC 1123.\n * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT'\n * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT'\n * @return {string}\n */\n toHTTP() {\n return toTechFormat(this.toUTC(), \"EEE, dd LLL yyyy HH:mm:ss 'GMT'\");\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL Date\n * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13'\n * @return {string|null}\n */\n toSQLDate() {\n if (!this.isValid) {\n return null;\n }\n return toISODate(this, true);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL Time\n * @param {Object} opts - options\n * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00'\n * @example DateTime.utc().toSQL() //=> '05:15:16.345'\n * @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00'\n * @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345'\n * @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York'\n * @return {string}\n */\n toSQLTime({ includeOffset = true, includeZone = false, includeOffsetSpace = true } = {}) {\n let fmt = \"HH:mm:ss.SSS\";\n\n if (includeZone || includeOffset) {\n if (includeOffsetSpace) {\n fmt += \" \";\n }\n if (includeZone) {\n fmt += \"z\";\n } else if (includeOffset) {\n fmt += \"ZZ\";\n }\n }\n\n return toTechFormat(this, fmt, true);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL DateTime\n * @param {Object} opts - options\n * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00'\n * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z'\n * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00'\n * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000'\n * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York'\n * @return {string}\n */\n toSQL(opts = {}) {\n if (!this.isValid) {\n return null;\n }\n\n return `${this.toSQLDate()} ${this.toSQLTime(opts)}`;\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for debugging\n * @return {string}\n */\n toString() {\n return this.isValid ? this.toISO() : INVALID;\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `DateTime { ts: ${this.toISO()}, zone: ${this.zone.name}, locale: ${this.locale} }`;\n } else {\n return `DateTime { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns the epoch milliseconds of this DateTime. Alias of {@link DateTime#toMillis}\n * @return {number}\n */\n valueOf() {\n return this.toMillis();\n }\n\n /**\n * Returns the epoch milliseconds of this DateTime.\n * @return {number}\n */\n toMillis() {\n return this.isValid ? this.ts : NaN;\n }\n\n /**\n * Returns the epoch seconds (including milliseconds in the fractional part) of this DateTime.\n * @return {number}\n */\n toSeconds() {\n return this.isValid ? this.ts / 1000 : NaN;\n }\n\n /**\n * Returns the epoch seconds (as a whole number) of this DateTime.\n * @return {number}\n */\n toUnixInteger() {\n return this.isValid ? Math.floor(this.ts / 1000) : NaN;\n }\n\n /**\n * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON.\n * @return {string}\n */\n toJSON() {\n return this.toISO();\n }\n\n /**\n * Returns a BSON serializable equivalent to this DateTime.\n * @return {Date}\n */\n toBSON() {\n return this.toJSDate();\n }\n\n /**\n * Returns a JavaScript object with this DateTime's year, month, day, and so on.\n * @param opts - options for generating the object\n * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output\n * @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 }\n * @return {Object}\n */\n toObject(opts = {}) {\n if (!this.isValid) return {};\n\n const base = { ...this.c };\n\n if (opts.includeConfig) {\n base.outputCalendar = this.outputCalendar;\n base.numberingSystem = this.loc.numberingSystem;\n base.locale = this.loc.locale;\n }\n return base;\n }\n\n /**\n * Returns a JavaScript Date equivalent to this DateTime.\n * @return {Date}\n */\n toJSDate() {\n return new Date(this.isValid ? this.ts : NaN);\n }\n\n // COMPARE\n\n /**\n * Return the difference between two DateTimes as a Duration.\n * @param {DateTime} otherDateTime - the DateTime to compare this one to\n * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration.\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @example\n * var i1 = DateTime.fromISO('1982-05-25T09:45'),\n * i2 = DateTime.fromISO('1983-10-14T10:30');\n * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 }\n * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 }\n * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 }\n * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 }\n * @return {Duration}\n */\n diff(otherDateTime, unit = \"milliseconds\", opts = {}) {\n if (!this.isValid || !otherDateTime.isValid) {\n return Duration.invalid(\"created by diffing an invalid DateTime\");\n }\n\n const durOpts = { locale: this.locale, numberingSystem: this.numberingSystem, ...opts };\n\n const units = maybeArray(unit).map(Duration.normalizeUnit),\n otherIsLater = otherDateTime.valueOf() > this.valueOf(),\n earlier = otherIsLater ? this : otherDateTime,\n later = otherIsLater ? otherDateTime : this,\n diffed = diff(earlier, later, units, durOpts);\n\n return otherIsLater ? diffed.negate() : diffed;\n }\n\n /**\n * Return the difference between this DateTime and right now.\n * See {@link DateTime#diff}\n * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @return {Duration}\n */\n diffNow(unit = \"milliseconds\", opts = {}) {\n return this.diff(DateTime.now(), unit, opts);\n }\n\n /**\n * Return an Interval spanning between this DateTime and another DateTime\n * @param {DateTime} otherDateTime - the other end point of the Interval\n * @return {Interval|DateTime}\n */\n until(otherDateTime) {\n return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this;\n }\n\n /**\n * Return whether this DateTime is in the same unit of time as another DateTime.\n * Higher-order units must also be identical for this function to return `true`.\n * Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link DateTime#setZone} to convert one of the dates if needed.\n * @param {DateTime} otherDateTime - the other DateTime\n * @param {string} unit - the unit of time to check sameness on\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; only the locale of this DateTime is used\n * @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day\n * @return {boolean}\n */\n hasSame(otherDateTime, unit, opts) {\n if (!this.isValid) return false;\n\n const inputMs = otherDateTime.valueOf();\n const adjustedToZone = this.setZone(otherDateTime.zone, { keepLocalTime: true });\n return (\n adjustedToZone.startOf(unit, opts) <= inputMs && inputMs <= adjustedToZone.endOf(unit, opts)\n );\n }\n\n /**\n * Equality check\n * Two DateTimes are equal if and only if they represent the same millisecond, have the same zone and location, and are both valid.\n * To compare just the millisecond values, use `+dt1 === +dt2`.\n * @param {DateTime} other - the other DateTime\n * @return {boolean}\n */\n equals(other) {\n return (\n this.isValid &&\n other.isValid &&\n this.valueOf() === other.valueOf() &&\n this.zone.equals(other.zone) &&\n this.loc.equals(other.loc)\n );\n }\n\n /**\n * Returns a string representation of a this time relative to now, such as \"in two days\". Can only internationalize if your\n * platform supports Intl.RelativeTimeFormat. Rounds towards zero by default.\n * @param {Object} options - options that affect the output\n * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n * @param {string} [options.style=\"long\"] - the style of units, must be \"long\", \"short\", or \"narrow\"\n * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of \"years\", \"quarters\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", or \"seconds\"\n * @param {boolean} [options.round=true] - whether to round the numbers in the output.\n * @param {string} [options.rounding=\"trunc\"] - rounding method to use when rounding the numbers in the output. Can be \"trunc\" (toward zero), \"expand\" (away from zero), \"round\", \"floor\", or \"ceil\".\n * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding.\n * @param {string} options.locale - override the locale of this DateTime\n * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n * @example DateTime.now().plus({ days: 1 }).toRelative() //=> \"in 1 day\"\n * @example DateTime.now().setLocale(\"es\").toRelative({ days: 1 }) //=> \"dentro de 1 día\"\n * @example DateTime.now().plus({ days: 1 }).toRelative({ locale: \"fr\" }) //=> \"dans 23 heures\"\n * @example DateTime.now().minus({ days: 2 }).toRelative() //=> \"2 days ago\"\n * @example DateTime.now().minus({ days: 2 }).toRelative({ unit: \"hours\" }) //=> \"48 hours ago\"\n * @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> \"1.5 days ago\"\n */\n toRelative(options = {}) {\n if (!this.isValid) return null;\n const base = options.base || DateTime.fromObject({}, { zone: this.zone }),\n padding = options.padding ? (this < base ? -options.padding : options.padding) : 0;\n let units = [\"years\", \"months\", \"days\", \"hours\", \"minutes\", \"seconds\"];\n let unit = options.unit;\n if (Array.isArray(options.unit)) {\n units = options.unit;\n unit = undefined;\n }\n return diffRelative(base, this.plus(padding), {\n ...options,\n numeric: \"always\",\n units,\n unit,\n });\n }\n\n /**\n * Returns a string representation of this date relative to today, such as \"yesterday\" or \"next month\".\n * Only internationalizes on platforms that supports Intl.RelativeTimeFormat.\n * @param {Object} options - options that affect the output\n * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n * @param {string} options.locale - override the locale of this DateTime\n * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of \"years\", \"quarters\", \"months\", \"weeks\", or \"days\"\n * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> \"tomorrow\"\n * @example DateTime.now().setLocale(\"es\").plus({ days: 1 }).toRelative() //=> \"\"mañana\"\n * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: \"fr\" }) //=> \"demain\"\n * @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> \"2 days ago\"\n */\n toRelativeCalendar(options = {}) {\n if (!this.isValid) return null;\n\n return diffRelative(options.base || DateTime.fromObject({}, { zone: this.zone }), this, {\n ...options,\n numeric: \"auto\",\n units: [\"years\", \"months\", \"days\"],\n calendary: true,\n });\n }\n\n /**\n * Return the min of several date times\n * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum\n * @return {DateTime} the min DateTime, or undefined if called with no argument\n */\n static min(...dateTimes) {\n if (!dateTimes.every(DateTime.isDateTime)) {\n throw new InvalidArgumentError(\"min requires all arguments be DateTimes\");\n }\n return bestBy(dateTimes, (i) => i.valueOf(), Math.min);\n }\n\n /**\n * Return the max of several date times\n * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum\n * @return {DateTime} the max DateTime, or undefined if called with no argument\n */\n static max(...dateTimes) {\n if (!dateTimes.every(DateTime.isDateTime)) {\n throw new InvalidArgumentError(\"max requires all arguments be DateTimes\");\n }\n return bestBy(dateTimes, (i) => i.valueOf(), Math.max);\n }\n\n // MISC\n\n /**\n * Explain how a string would be parsed by fromFormat()\n * @param {string} text - the string to parse\n * @param {string} fmt - the format the string is expected to be in (see description)\n * @param {Object} options - options taken by fromFormat()\n * @return {Object}\n */\n static fromFormatExplain(text, fmt, options = {}) {\n const { locale = null, numberingSystem = null } = options,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n return explainFromTokens(localeToUse, text, fmt);\n }\n\n /**\n * @deprecated use fromFormatExplain instead\n */\n static fromStringExplain(text, fmt, options = {}) {\n return DateTime.fromFormatExplain(text, fmt, options);\n }\n\n /**\n * Build a parser for `fmt` using the given locale. This parser can be passed\n * to {@link DateTime.fromFormatParser} to a parse a date in this format. This\n * can be used to optimize cases where many dates need to be parsed in a\n * specific format.\n *\n * @param {String} fmt - the format the string is expected to be in (see\n * description)\n * @param {Object} options - options used to set locale and numberingSystem\n * for parser\n * @returns {TokenParser} - opaque object to be used\n */\n static buildFormatParser(fmt, options = {}) {\n const { locale = null, numberingSystem = null } = options,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n return new TokenParser(localeToUse, fmt);\n }\n\n /**\n * Create a DateTime from an input string and format parser.\n *\n * The format parser must have been created with the same locale as this call.\n *\n * @param {String} text - the string to parse\n * @param {TokenParser} formatParser - parser from {@link DateTime.buildFormatParser}\n * @param {Object} opts - options taken by fromFormat()\n * @returns {DateTime}\n */\n static fromFormatParser(text, formatParser, opts = {}) {\n if (isUndefined(text) || isUndefined(formatParser)) {\n throw new InvalidArgumentError(\n \"fromFormatParser requires an input string and a format parser\"\n );\n }\n const { locale = null, numberingSystem = null } = opts,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n\n if (!localeToUse.equals(formatParser.locale)) {\n throw new InvalidArgumentError(\n `fromFormatParser called with a locale of ${localeToUse}, ` +\n `but the format parser was created for ${formatParser.locale}`\n );\n }\n\n const { result, zone, specificOffset, invalidReason } = formatParser.explainFromTokens(text);\n\n if (invalidReason) {\n return DateTime.invalid(invalidReason);\n } else {\n return parseDataToDateTime(\n result,\n zone,\n opts,\n `format ${formatParser.format}`,\n text,\n specificOffset\n );\n }\n }\n\n // FORMAT PRESETS\n\n /**\n * {@link DateTime#toLocaleString} format like 10/14/1983\n * @type {Object}\n */\n static get DATE_SHORT() {\n return Formats.DATE_SHORT;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983'\n * @type {Object}\n */\n static get DATE_MED() {\n return Formats.DATE_MED;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Fri, Oct 14, 1983'\n * @type {Object}\n */\n static get DATE_MED_WITH_WEEKDAY() {\n return Formats.DATE_MED_WITH_WEEKDAY;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983'\n * @type {Object}\n */\n static get DATE_FULL() {\n return Formats.DATE_FULL;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Tuesday, October 14, 1983'\n * @type {Object}\n */\n static get DATE_HUGE() {\n return Formats.DATE_HUGE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_SIMPLE() {\n return Formats.TIME_SIMPLE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_SECONDS() {\n return Formats.TIME_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_SHORT_OFFSET() {\n return Formats.TIME_WITH_SHORT_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_LONG_OFFSET() {\n return Formats.TIME_WITH_LONG_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_SIMPLE() {\n return Formats.TIME_24_SIMPLE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_SECONDS() {\n return Formats.TIME_24_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 EDT', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_SHORT_OFFSET() {\n return Formats.TIME_24_WITH_SHORT_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_LONG_OFFSET() {\n return Formats.TIME_24_WITH_LONG_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_SHORT() {\n return Formats.DATETIME_SHORT;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_SHORT_WITH_SECONDS() {\n return Formats.DATETIME_SHORT_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED() {\n return Formats.DATETIME_MED;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED_WITH_SECONDS() {\n return Formats.DATETIME_MED_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED_WITH_WEEKDAY() {\n return Formats.DATETIME_MED_WITH_WEEKDAY;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_FULL() {\n return Formats.DATETIME_FULL;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_FULL_WITH_SECONDS() {\n return Formats.DATETIME_FULL_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_HUGE() {\n return Formats.DATETIME_HUGE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_HUGE_WITH_SECONDS() {\n return Formats.DATETIME_HUGE_WITH_SECONDS;\n }\n}\n\n/**\n * @private\n */\nexport function friendlyDateTime(dateTimeish) {\n if (DateTime.isDateTime(dateTimeish)) {\n return dateTimeish;\n } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) {\n return DateTime.fromJSDate(dateTimeish);\n } else if (dateTimeish && typeof dateTimeish === \"object\") {\n return DateTime.fromObject(dateTimeish);\n } else {\n throw new InvalidArgumentError(\n `Unknown datetime argument: ${dateTimeish}, of type ${typeof dateTimeish}`\n );\n }\n}\n","import DateTime from \"./datetime.js\";\nimport Duration from \"./duration.js\";\nimport Interval from \"./interval.js\";\nimport Info from \"./info.js\";\nimport Zone from \"./zone.js\";\nimport FixedOffsetZone from \"./zones/fixedOffsetZone.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport InvalidZone from \"./zones/invalidZone.js\";\nimport SystemZone from \"./zones/systemZone.js\";\nimport Settings from \"./settings.js\";\n\nconst VERSION = \"3.7.2\";\n\nexport {\n VERSION,\n DateTime,\n Duration,\n Interval,\n Info,\n Zone,\n FixedOffsetZone,\n IANAZone,\n InvalidZone,\n SystemZone,\n Settings,\n};\n"],"names":["LuxonError","Error","InvalidDateTimeError","constructor","reason","toMessage","InvalidIntervalError","InvalidDurationError","ConflictingSpecificationError","InvalidUnitError","unit","InvalidArgumentError","ZoneIsAbstractError","n","s","l","DATE_SHORT","year","month","day","DATE_MED","DATE_MED_WITH_WEEKDAY","weekday","DATE_FULL","DATE_HUGE","TIME_SIMPLE","hour","minute","TIME_WITH_SECONDS","second","TIME_WITH_SHORT_OFFSET","timeZoneName","TIME_WITH_LONG_OFFSET","TIME_24_SIMPLE","hourCycle","TIME_24_WITH_SECONDS","TIME_24_WITH_SHORT_OFFSET","TIME_24_WITH_LONG_OFFSET","DATETIME_SHORT","DATETIME_SHORT_WITH_SECONDS","DATETIME_MED","DATETIME_MED_WITH_SECONDS","DATETIME_MED_WITH_WEEKDAY","DATETIME_FULL","DATETIME_FULL_WITH_SECONDS","DATETIME_HUGE","DATETIME_HUGE_WITH_SECONDS","Zone","type","name","ianaName","isUniversal","offsetName","ts","opts","formatOffset","format","offset","equals","otherZone","isValid","singleton","SystemZone","instance","Intl","DateTimeFormat","resolvedOptions","timeZone","locale","parseZoneInfo","Date","getTimezoneOffset","dtfCache","Map","makeDTF","zoneName","dtf","get","undefined","hour12","era","set","typeToPos","hackyOffset","date","formatted","replace","parsed","exec","fMonth","fDay","fYear","fadOrBc","fHour","fMinute","fSecond","partsOffset","formatToParts","filled","i","length","value","pos","isUndefined","parseInt","ianaZoneCache","IANAZone","create","zone","resetCache","clear","isValidSpecifier","isValidZone","e","valid","NaN","isNaN","adOrBc","Math","abs","adjustedHour","asUTC","objToLocalTS","millisecond","asTS","over","intlLFCache","getCachedLF","locString","key","JSON","stringify","ListFormat","intlDTCache","getCachedDTF","intlNumCache","getCachedINF","inf","NumberFormat","intlRelCache","getCachedRTF","base","cacheKeyOpts","RelativeTimeFormat","sysLocaleCache","systemLocale","intlResolvedOptionsCache","getCachedIntResolvedOptions","weekInfoCache","getCachedWeekInfo","data","Locale","getWeekInfo","weekInfo","fallbackWeekSettings","parseLocaleString","localeStr","xIndex","indexOf","substring","uIndex","options","selectedStr","smaller","numberingSystem","calendar","intlConfigString","outputCalendar","includes","mapMonths","f","ms","dt","DateTime","utc","push","mapWeekdays","listStuff","loc","englishFn","intlFn","mode","listingMode","supportsFastNumbers","startsWith","PolyNumberFormatter","intl","forceSimple","padTo","floor","otherOpts","Object","keys","intlOpts","useGrouping","minimumIntegerDigits","fixed","roundTo","padStart","PolyDateFormatter","originalZone","z","gmtOffset","offsetZ","setZone","plus","minutes","map","join","toJSDate","parts","part","PolyRelFormatter","isEnglish","style","hasRelative","rtf","count","English","numeric","firstDay","minimalDays","weekend","fromOpts","weekSettings","defaultToEN","specifiedLocale","Settings","defaultLocale","localeR","numberingSystemR","defaultNumberingSystem","outputCalendarR","defaultOutputCalendar","weekSettingsR","validateWeekSettings","defaultWeekSettings","fromObject","numbering","parsedLocale","parsedNumberingSystem","parsedOutputCalendar","weekdaysCache","standalone","monthsCache","meridiemCache","eraCache","fastNumbersCached","fastNumbers","isActuallyEn","hasNoWeirdness","clone","alts","getOwnPropertyNames","redefaultToEN","redefaultToSystem","months","monthSpecialCase","formatStr","mapper","extract","dtFormatter","weekdays","meridiems","eras","field","df","results","matching","find","m","toLowerCase","numberFormatter","relFormatter","listFormatter","getWeekSettings","hasLocaleWeekInfo","getStartOfWeek","getMinDaysInFirstWeek","getWeekendDays","other","toString","FixedOffsetZone","utcInstance","parseSpecifier","r","match","signedOffset","InvalidZone","normalizeZone","input","defaultZone","isString","lowered","isNumber","numberingSystems","arab","arabext","bali","beng","deva","fullwide","gujr","hanidec","khmr","knda","laoo","limb","mlym","mong","mymr","orya","tamldec","telu","thai","tibt","latn","numberingSystemsUTF16","hanidecChars","split","parseDigits","str","code","charCodeAt","search","min","max","digitRegexCache","resetDigitRegexCache","digitRegex","append","ns","appendCache","regex","RegExp","now","twoDigitCutoffYear","throwOnInvalid","cutoffYear","t","resetCaches","Invalid","explanation","nonLeapLadder","leapLadder","unitOutOfRange","dayOfWeek","d","UTC","setUTCFullYear","getUTCFullYear","js","getUTCDay","computeOrdinal","isLeapYear","uncomputeOrdinal","ordinal","table","month0","findIndex","isoWeekdayToLocal","isoWeekday","startOfWeek","gregorianToWeek","gregObj","minDaysInFirstWeek","weekNumber","weekYear","weeksInWeekYear","timeObject","weekToGregorian","weekData","weekdayOfJan4","yearInDays","daysInYear","gregorianToOrdinal","gregData","ordinalToGregorian","ordinalData","usesLocalWeekValues","obj","hasLocaleWeekData","localWeekday","localWeekNumber","localWeekYear","hasIsoWeekData","hasInvalidWeekData","validYear","isInteger","validWeek","integerBetween","validWeekday","hasInvalidOrdinalData","validOrdinal","hasInvalidGregorianData","validMonth","validDay","daysInMonth","hasInvalidTimeData","validHour","validMinute","validSecond","validMillisecond","o","isDate","prototype","call","maybeArray","thing","Array","isArray","bestBy","arr","by","compare","reduce","best","next","pair","pick","a","k","hasOwnProperty","prop","settings","some","v","from","bottom","top","floorMod","x","isNeg","padded","parseInteger","string","parseFloating","parseFloat","parseMillis","fraction","number","digits","rounding","factor","ceil","trunc","round","RangeError","modMonth","modYear","firstWeekOffset","fwdlw","weekOffset","weekOffsetNext","untruncateYear","offsetFormat","modified","offHourStr","offMinuteStr","offHour","Number","offMin","offMinSigned","is","asNumber","numericValue","isFinite","normalizeObject","normalizer","normalized","u","hours","sign","monthsLong","monthsShort","monthsNarrow","weekdaysLong","weekdaysShort","weekdaysNarrow","erasLong","erasShort","erasNarrow","meridiemForDateTime","weekdayForDateTime","monthForDateTime","eraForDateTime","formatRelativeTime","narrow","units","years","quarters","weeks","days","seconds","lastable","isDay","isInPast","fmtValue","singular","lilUnits","fmtUnit","stringifyTokens","splits","tokenToString","token","literal","val","macroTokenToFormatOpts","D","Formats","DD","DDD","DDDD","tt","ttt","tttt","T","TT","TTT","TTTT","ff","fff","ffff","F","FF","FFF","FFFF","Formatter","parseFormat","fmt","current","currentFull","bracketed","c","charAt","test","formatOpts","systemLoc","formatWithSystemDefault","formatDateTime","formatDateTimeParts","formatInterval","interval","start","formatRange","end","num","p","signDisplay","formatDateTimeFromString","knownEnglish","useDateTimeFormatter","isOffsetFixed","allowZ","meridiem","maybeMacro","slice","quarter","formatDurationFromString","dur","invertLargest","signMode","tokenToField","lildur","info","mapped","inversionFactor","isNegativeDuration","largestUnit","tokens","realTokens","found","concat","collapsed","shiftTo","filter","durationInfo","values","ianaRegex","combineRegexes","regexes","full","source","combineExtractors","extractors","mergedVals","mergedZone","cursor","ex","parse","patterns","extractor","simpleParse","ret","offsetRegex","isoExtendedZone","isoTimeBaseRegex","isoTimeRegex","isoTimeExtensionRegex","isoYmdRegex","isoWeekRegex","isoOrdinalRegex","extractISOWeekData","extractISOOrdinalData","sqlYmdRegex","sqlTimeRegex","sqlTimeExtensionRegex","int","fallback","extractISOYmd","item","extractISOTime","milliseconds","extractISOOffset","local","fullOffset","extractIANAZone","isoTimeOnly","isoDuration","extractISODuration","yearStr","monthStr","weekStr","dayStr","hourStr","minuteStr","secondStr","millisecondsStr","hasNegativePrefix","negativeSeconds","maybeNegate","force","obsOffsets","GMT","EDT","EST","CDT","CST","MDT","MST","PDT","PST","fromStrings","weekdayStr","result","rfc2822","extractRFC2822","obsOffset","milOffset","preprocessRFC2822","trim","rfc1123","rfc850","ascii","extractRFC1123Or850","extractASCII","isoYmdWithTimeExtensionRegex","isoWeekWithTimeExtensionRegex","isoOrdinalWithTimeExtensionRegex","isoTimeCombinedRegex","extractISOYmdTimeAndOffset","extractISOWeekTimeAndOffset","extractISOOrdinalDateAndTime","extractISOTimeAndOffset","parseISODate","parseRFC2822Date","parseHTTPDate","parseISODuration","extractISOTimeOnly","parseISOTimeOnly","sqlYmdWithTimeExtensionRegex","sqlTimeCombinedRegex","extractISOTimeOffsetAndIANAZone","parseSQL","INVALID","lowOrderMatrix","casualMatrix","daysInYearAccurate","daysInMonthAccurate","accurateMatrix","orderedUnits","reverseUnits","reverse","conf","conversionAccuracy","matrix","Duration","durationToMillis","vals","_vals$milliseconds","sum","normalizeValues","reduceRight","previous","previousVal","conv","rollUp","removeZeroes","newVals","entries","config","accurate","invalid","isLuxonDuration","fromMillis","normalizeUnit","fromDurationLike","durationLike","isDuration","fromISO","text","fromISOTime","week","toFormat","fmtOpts","toHuman","showZeros","unitDisplay","listStyle","toObject","toISO","toISOTime","millis","toMillis","suppressMilliseconds","suppressSeconds","includePrefix","includeOffset","dateTime","toJSON","Symbol","for","invalidReason","valueOf","duration","minus","negate","mapUnits","fn","mixed","reconfigure","as","normalize","rescale","shiftToAll","built","accumulated","lastUnit","own","ak","negated","removeZeros","invalidExplanation","eq","v1","v2","validateStartEnd","Interval","isLuxonInterval","fromDateTimes","builtStart","friendlyDateTime","builtEnd","validateError","after","before","startIsValid","endIsValid","isInterval","lastDateTime","toDuration","startOf","useLocaleWeeks","diff","hasSame","isEmpty","isAfter","isBefore","contains","splitAt","dateTimes","sorted","sort","b","added","splitBy","idx","divideEqually","numberOfParts","overlaps","abutsStart","abutsEnd","engulfs","intersection","union","merge","intervals","final","sofar","xor","currentCount","ends","time","flattened","difference","toLocaleString","toISODate","dateFormat","separator","mapEndpoints","mapFn","Info","hasDST","proto","isValidIANAZone","locObj","getMinimumDaysInFirstWeek","getWeekendWeekdays","monthsFormat","weekdaysFormat","features","relative","localeWeek","dayDiff","earlier","later","utcDayStart","toUTC","keepLocalTime","highOrderDiffs","differs","lowestOrder","highWater","differ","remainingMillis","lowerOrderUnits","MISSING_FTP","intUnit","post","deser","NBSP","String","fromCharCode","spaceOrNBSP","spaceOrNBSPRegExp","fixListRegex","stripInsensitivities","oneOf","strings","startIndex","groups","h","simple","escapeToken","unitForToken","one","two","three","four","six","oneOrTwo","oneToThree","oneToSix","oneToNine","twoToFour","fourToSix","unitate","partTypeStyleToTokenVal","short","long","dayperiod","dayPeriod","hour24","tokenForPart","resolvedOpts","isSpace","actualType","buildRegex","re","handlers","matches","all","matchIndex","dateTimeFromMatches","toField","specificOffset","Z","q","M","G","y","S","dummyDateTimeCache","getDummyDateTime","maybeExpandMacroToken","formatOptsToTokens","expandMacroTokens","TokenParser","disqualifyingUnit","regexString","explainFromTokens","rawMatches","parser","parseFromTokens","formatter","MAX_DATE","unsupportedZone","possiblyCachedWeekData","possiblyCachedLocalWeekData","localWeekData","inst","old","fixOffset","localTS","tz","utcGuess","o2","o3","tsToObj","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","objToTS","adjustTime","oPre","millisToAdd","parseDataToDateTime","parsedZone","interpretationZone","toTechFormat","extended","precision","longFormat","extendedZone","showSeconds","defaultUnitValues","defaultWeekUnitValues","defaultOrdinalUnitValues","orderedWeekUnits","orderedOrdinalUnits","weeknumber","weeksnumber","weeknumbers","weekyear","weekyears","normalizeUnitWithLocalWeeks","guessOffsetForZone","zoneOffsetTs","offsetGuess","zoneOffsetGuessCache","quickDT","offsetProvis","diffRelative","calendary","lastOpts","argList","args","unchanged","ot","_zone","isLuxonDateTime","arguments","fromJSDate","zoneToUse","fromSeconds","tsNow","containsOrdinal","containsGregorYear","containsGregorMD","containsGregor","definiteWeekDef","useWeekData","defaultValues","objNow","foundFirst","higherOrderInvalid","gregorian","tsFinal","offsetFinal","fromRFC2822","fromHTTP","fromFormat","localeToUse","fromString","fromSQL","isDateTime","parseFormatForOpts","localeOpts","tokenList","expandFormat","expanded","isWeekend","monthShort","monthLong","weekdayShort","weekdayLong","offsetNameShort","offsetNameLong","isInDST","getPossibleOffsets","dayMs","minuteMs","oEarlier","oLater","o1","ts1","ts2","c1","c2","isInLeapYear","weeksInLocalWeekYear","resolvedLocaleOptions","toLocal","keepCalendarTime","newTS","asObj","setLocale","settingWeekStuff","normalizedUnit","endOf","toLocaleParts","ext","toISOWeekDate","toRFC2822","toHTTP","toSQLDate","toSQLTime","includeZone","includeOffsetSpace","toSQL","toSeconds","toUnixInteger","toBSON","includeConfig","otherDateTime","durOpts","otherIsLater","diffed","diffNow","until","inputMs","adjustedToZone","toRelative","padding","toRelativeCalendar","every","fromFormatExplain","fromStringExplain","buildFormatParser","fromFormatParser","formatParser","dateTimeish","VERSION"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/luxon/package.json b/node_modules/luxon/package.json new file mode 100644 index 00000000..f80269b1 --- /dev/null +++ b/node_modules/luxon/package.json @@ -0,0 +1,87 @@ +{ + "name": "luxon", + "version": "3.7.2", + "description": "Immutable date wrapper", + "author": "Isaac Cambron", + "keywords": [ + "date", + "immutable" + ], + "repository": "https://github.com/moment/luxon", + "exports": { + ".": { + "import": "./build/es6/luxon.mjs", + "require": "./build/node/luxon.js" + }, + "./package.json": "./package.json" + }, + "scripts": { + "build": "babel-node tasks/buildAll.js", + "build-node": "babel-node tasks/buildNode.js", + "build-global": "babel-node tasks/buildGlobal.js", + "jest": "jest", + "test": "jest --coverage", + "api-docs": "mkdir -p build && documentation build src/luxon.js -f html -o build/api-docs && sed -i.bak 's/<\\/body>/ +``` + +``` +// "lite" version + +``` + +## Quick Start + +For the full version (800+ MIME types, 1,000+ extensions): + +```javascript +const mime = require('mime'); + +mime.getType('txt'); // ⇨ 'text/plain' +mime.getExtension('text/plain'); // ⇨ 'txt' +``` + +See [Mime API](#mime-api) below for API details. + +## Lite Version + +The "lite" version of this module omits vendor-specific (`*/vnd.*`) and +experimental (`*/x-*`) types. It weighs in at ~2.5KB, compared to 8KB for the +full version. To load the lite version: + +```javascript +const mime = require('mime/lite'); +``` + +## Mime .vs. mime-types .vs. mime-db modules + +For those of you wondering about the difference between these [popular] NPM modules, +here's a brief rundown ... + +[`mime-db`](https://github.com/jshttp/mime-db) is "the source of +truth" for MIME type information. It is not an API. Rather, it is a canonical +dataset of mime type definitions pulled from IANA, Apache, NGINX, and custom mappings +submitted by the Node.js community. + +[`mime-types`](https://github.com/jshttp/mime-types) is a thin +wrapper around mime-db that provides an API drop-in compatible(ish) with `mime @ < v1.3.6` API. + +`mime` is, as of v2, a self-contained module bundled with a pre-optimized version +of the `mime-db` dataset. It provides a simplified API with the following characteristics: + +* Intelligently resolved type conflicts (See [mime-score](https://github.com/broofa/mime-score) for details) +* Method naming consistent with industry best-practices +* Compact footprint. E.g. The minified+compressed sizes of the various modules: + +Module | Size +--- | --- +`mime-db` | 18 KB +`mime-types` | same as mime-db +`mime` | 8 KB +`mime/lite` | 2 KB + +## Mime API + +Both `require('mime')` and `require('mime/lite')` return instances of the MIME +class, documented below. + +Note: Inputs to this API are case-insensitive. Outputs (returned values) will +be lowercase. + +### new Mime(typeMap, ... more maps) + +Most users of this module will not need to create Mime instances directly. +However if you would like to create custom mappings, you may do so as follows +... + +```javascript +// Require Mime class +const Mime = require('mime/Mime'); + +// Define mime type -> extensions map +const typeMap = { + 'text/abc': ['abc', 'alpha', 'bet'], + 'text/def': ['leppard'] +}; + +// Create and use Mime instance +const myMime = new Mime(typeMap); +myMime.getType('abc'); // ⇨ 'text/abc' +myMime.getExtension('text/def'); // ⇨ 'leppard' +``` + +If more than one map argument is provided, each map is `define()`ed (see below), in order. + +### mime.getType(pathOrExtension) + +Get mime type for the given path or extension. E.g. + +```javascript +mime.getType('js'); // ⇨ 'application/javascript' +mime.getType('json'); // ⇨ 'application/json' + +mime.getType('txt'); // ⇨ 'text/plain' +mime.getType('dir/text.txt'); // ⇨ 'text/plain' +mime.getType('dir\\text.txt'); // ⇨ 'text/plain' +mime.getType('.text.txt'); // ⇨ 'text/plain' +mime.getType('.txt'); // ⇨ 'text/plain' +``` + +`null` is returned in cases where an extension is not detected or recognized + +```javascript +mime.getType('foo/txt'); // ⇨ null +mime.getType('bogus_type'); // ⇨ null +``` + +### mime.getExtension(type) +Get extension for the given mime type. Charset options (often included in +Content-Type headers) are ignored. + +```javascript +mime.getExtension('text/plain'); // ⇨ 'txt' +mime.getExtension('application/json'); // ⇨ 'json' +mime.getExtension('text/html; charset=utf8'); // ⇨ 'html' +``` + +### mime.define(typeMap[, force = false]) + +Define [more] type mappings. + +`typeMap` is a map of type -> extensions, as documented in `new Mime`, above. + +By default this method will throw an error if you try to map a type to an +extension that is already assigned to another type. Passing `true` for the +`force` argument will suppress this behavior (overriding any previous mapping). + +```javascript +mime.define({'text/x-abc': ['abc', 'abcd']}); + +mime.getType('abcd'); // ⇨ 'text/x-abc' +mime.getExtension('text/x-abc') // ⇨ 'abc' +``` + +## Command Line + + mime [path_or_extension] + +E.g. + + > mime scripts/jquery.js + application/javascript + +---- +Markdown generated from [src/README_js.md](src/README_js.md) by [![RunMD Logo](http://i.imgur.com/h0FVyzU.png)](https://github.com/broofa/runmd) \ No newline at end of file diff --git a/node_modules/mime/cli.js b/node_modules/mime/cli.js new file mode 100644 index 00000000..ab70a49c --- /dev/null +++ b/node_modules/mime/cli.js @@ -0,0 +1,46 @@ +#!/usr/bin/env node + +'use strict'; + +process.title = 'mime'; +let mime = require('.'); +let pkg = require('./package.json'); +let args = process.argv.splice(2); + +if (args.includes('--version') || args.includes('-v') || args.includes('--v')) { + console.log(pkg.version); + process.exit(0); +} else if (args.includes('--name') || args.includes('-n') || args.includes('--n')) { + console.log(pkg.name); + process.exit(0); +} else if (args.includes('--help') || args.includes('-h') || args.includes('--h')) { + console.log(pkg.name + ' - ' + pkg.description + '\n'); + console.log(`Usage: + + mime [flags] [path_or_extension] + + Flags: + --help, -h Show this message + --version, -v Display the version + --name, -n Print the name of the program + + Note: the command will exit after it executes if a command is specified + The path_or_extension is the path to the file or the extension of the file. + + Examples: + mime --help + mime --version + mime --name + mime -v + mime src/log.js + mime new.py + mime foo.sh + `); + process.exit(0); +} + +let file = args[0]; +let type = mime.getType(file); + +process.stdout.write(type + '\n'); + diff --git a/node_modules/mime/index.js b/node_modules/mime/index.js new file mode 100644 index 00000000..fadcf8d6 --- /dev/null +++ b/node_modules/mime/index.js @@ -0,0 +1,4 @@ +'use strict'; + +let Mime = require('./Mime'); +module.exports = new Mime(require('./types/standard'), require('./types/other')); diff --git a/node_modules/mime/lite.js b/node_modules/mime/lite.js new file mode 100644 index 00000000..835cffb3 --- /dev/null +++ b/node_modules/mime/lite.js @@ -0,0 +1,4 @@ +'use strict'; + +let Mime = require('./Mime'); +module.exports = new Mime(require('./types/standard')); diff --git a/node_modules/mime/package.json b/node_modules/mime/package.json new file mode 100644 index 00000000..84f51323 --- /dev/null +++ b/node_modules/mime/package.json @@ -0,0 +1,52 @@ +{ + "author": { + "name": "Robert Kieffer", + "url": "http://github.com/broofa", + "email": "robert@broofa.com" + }, + "engines": { + "node": ">=10.0.0" + }, + "bin": { + "mime": "cli.js" + }, + "contributors": [], + "description": "A comprehensive library for mime-type mapping", + "license": "MIT", + "dependencies": {}, + "devDependencies": { + "benchmark": "*", + "chalk": "4.1.2", + "eslint": "8.1.0", + "mime-db": "1.50.0", + "mime-score": "1.2.0", + "mime-types": "2.1.33", + "mocha": "9.1.3", + "runmd": "*", + "standard-version": "9.3.2" + }, + "files": [ + "index.js", + "lite.js", + "Mime.js", + "cli.js", + "/types" + ], + "scripts": { + "prepare": "node src/build.js && runmd --output README.md src/README_js.md", + "release": "standard-version", + "benchmark": "node src/benchmark.js", + "md": "runmd --watch --output README.md src/README_js.md", + "test": "mocha src/test.js" + }, + "keywords": [ + "util", + "mime" + ], + "name": "mime", + "repository": { + "url": "https://github.com/broofa/mime", + "type": "git" + }, + "version": "3.0.0" +} diff --git a/node_modules/mime/types/other.js b/node_modules/mime/types/other.js new file mode 100644 index 00000000..bb6a0353 --- /dev/null +++ b/node_modules/mime/types/other.js @@ -0,0 +1 @@ +module.exports = {"application/prs.cww":["cww"],"application/vnd.1000minds.decision-model+xml":["1km"],"application/vnd.3gpp.pic-bw-large":["plb"],"application/vnd.3gpp.pic-bw-small":["psb"],"application/vnd.3gpp.pic-bw-var":["pvb"],"application/vnd.3gpp2.tcap":["tcap"],"application/vnd.3m.post-it-notes":["pwn"],"application/vnd.accpac.simply.aso":["aso"],"application/vnd.accpac.simply.imp":["imp"],"application/vnd.acucobol":["acu"],"application/vnd.acucorp":["atc","acutc"],"application/vnd.adobe.air-application-installer-package+zip":["air"],"application/vnd.adobe.formscentral.fcdt":["fcdt"],"application/vnd.adobe.fxp":["fxp","fxpl"],"application/vnd.adobe.xdp+xml":["xdp"],"application/vnd.adobe.xfdf":["xfdf"],"application/vnd.ahead.space":["ahead"],"application/vnd.airzip.filesecure.azf":["azf"],"application/vnd.airzip.filesecure.azs":["azs"],"application/vnd.amazon.ebook":["azw"],"application/vnd.americandynamics.acc":["acc"],"application/vnd.amiga.ami":["ami"],"application/vnd.android.package-archive":["apk"],"application/vnd.anser-web-certificate-issue-initiation":["cii"],"application/vnd.anser-web-funds-transfer-initiation":["fti"],"application/vnd.antix.game-component":["atx"],"application/vnd.apple.installer+xml":["mpkg"],"application/vnd.apple.keynote":["key"],"application/vnd.apple.mpegurl":["m3u8"],"application/vnd.apple.numbers":["numbers"],"application/vnd.apple.pages":["pages"],"application/vnd.apple.pkpass":["pkpass"],"application/vnd.aristanetworks.swi":["swi"],"application/vnd.astraea-software.iota":["iota"],"application/vnd.audiograph":["aep"],"application/vnd.balsamiq.bmml+xml":["bmml"],"application/vnd.blueice.multipass":["mpm"],"application/vnd.bmi":["bmi"],"application/vnd.businessobjects":["rep"],"application/vnd.chemdraw+xml":["cdxml"],"application/vnd.chipnuts.karaoke-mmd":["mmd"],"application/vnd.cinderella":["cdy"],"application/vnd.citationstyles.style+xml":["csl"],"application/vnd.claymore":["cla"],"application/vnd.cloanto.rp9":["rp9"],"application/vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"application/vnd.cluetrust.cartomobile-config":["c11amc"],"application/vnd.cluetrust.cartomobile-config-pkg":["c11amz"],"application/vnd.commonspace":["csp"],"application/vnd.contact.cmsg":["cdbcmsg"],"application/vnd.cosmocaller":["cmc"],"application/vnd.crick.clicker":["clkx"],"application/vnd.crick.clicker.keyboard":["clkk"],"application/vnd.crick.clicker.palette":["clkp"],"application/vnd.crick.clicker.template":["clkt"],"application/vnd.crick.clicker.wordbank":["clkw"],"application/vnd.criticaltools.wbs+xml":["wbs"],"application/vnd.ctc-posml":["pml"],"application/vnd.cups-ppd":["ppd"],"application/vnd.curl.car":["car"],"application/vnd.curl.pcurl":["pcurl"],"application/vnd.dart":["dart"],"application/vnd.data-vision.rdz":["rdz"],"application/vnd.dbf":["dbf"],"application/vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"application/vnd.dece.ttml+xml":["uvt","uvvt"],"application/vnd.dece.unspecified":["uvx","uvvx"],"application/vnd.dece.zip":["uvz","uvvz"],"application/vnd.denovo.fcselayout-link":["fe_launch"],"application/vnd.dna":["dna"],"application/vnd.dolby.mlp":["mlp"],"application/vnd.dpgraph":["dpg"],"application/vnd.dreamfactory":["dfac"],"application/vnd.ds-keypoint":["kpxx"],"application/vnd.dvb.ait":["ait"],"application/vnd.dvb.service":["svc"],"application/vnd.dynageo":["geo"],"application/vnd.ecowin.chart":["mag"],"application/vnd.enliven":["nml"],"application/vnd.epson.esf":["esf"],"application/vnd.epson.msf":["msf"],"application/vnd.epson.quickanime":["qam"],"application/vnd.epson.salt":["slt"],"application/vnd.epson.ssf":["ssf"],"application/vnd.eszigno3+xml":["es3","et3"],"application/vnd.ezpix-album":["ez2"],"application/vnd.ezpix-package":["ez3"],"application/vnd.fdf":["fdf"],"application/vnd.fdsn.mseed":["mseed"],"application/vnd.fdsn.seed":["seed","dataless"],"application/vnd.flographit":["gph"],"application/vnd.fluxtime.clip":["ftc"],"application/vnd.framemaker":["fm","frame","maker","book"],"application/vnd.frogans.fnc":["fnc"],"application/vnd.frogans.ltf":["ltf"],"application/vnd.fsc.weblaunch":["fsc"],"application/vnd.fujitsu.oasys":["oas"],"application/vnd.fujitsu.oasys2":["oa2"],"application/vnd.fujitsu.oasys3":["oa3"],"application/vnd.fujitsu.oasysgp":["fg5"],"application/vnd.fujitsu.oasysprs":["bh2"],"application/vnd.fujixerox.ddd":["ddd"],"application/vnd.fujixerox.docuworks":["xdw"],"application/vnd.fujixerox.docuworks.binder":["xbd"],"application/vnd.fuzzysheet":["fzs"],"application/vnd.genomatix.tuxedo":["txd"],"application/vnd.geogebra.file":["ggb"],"application/vnd.geogebra.tool":["ggt"],"application/vnd.geometry-explorer":["gex","gre"],"application/vnd.geonext":["gxt"],"application/vnd.geoplan":["g2w"],"application/vnd.geospace":["g3w"],"application/vnd.gmx":["gmx"],"application/vnd.google-apps.document":["gdoc"],"application/vnd.google-apps.presentation":["gslides"],"application/vnd.google-apps.spreadsheet":["gsheet"],"application/vnd.google-earth.kml+xml":["kml"],"application/vnd.google-earth.kmz":["kmz"],"application/vnd.grafeq":["gqf","gqs"],"application/vnd.groove-account":["gac"],"application/vnd.groove-help":["ghf"],"application/vnd.groove-identity-message":["gim"],"application/vnd.groove-injector":["grv"],"application/vnd.groove-tool-message":["gtm"],"application/vnd.groove-tool-template":["tpl"],"application/vnd.groove-vcard":["vcg"],"application/vnd.hal+xml":["hal"],"application/vnd.handheld-entertainment+xml":["zmm"],"application/vnd.hbci":["hbci"],"application/vnd.hhe.lesson-player":["les"],"application/vnd.hp-hpgl":["hpgl"],"application/vnd.hp-hpid":["hpid"],"application/vnd.hp-hps":["hps"],"application/vnd.hp-jlyt":["jlt"],"application/vnd.hp-pcl":["pcl"],"application/vnd.hp-pclxl":["pclxl"],"application/vnd.hydrostatix.sof-data":["sfd-hdstx"],"application/vnd.ibm.minipay":["mpy"],"application/vnd.ibm.modcap":["afp","listafp","list3820"],"application/vnd.ibm.rights-management":["irm"],"application/vnd.ibm.secure-container":["sc"],"application/vnd.iccprofile":["icc","icm"],"application/vnd.igloader":["igl"],"application/vnd.immervision-ivp":["ivp"],"application/vnd.immervision-ivu":["ivu"],"application/vnd.insors.igm":["igm"],"application/vnd.intercon.formnet":["xpw","xpx"],"application/vnd.intergeo":["i2g"],"application/vnd.intu.qbo":["qbo"],"application/vnd.intu.qfx":["qfx"],"application/vnd.ipunplugged.rcprofile":["rcprofile"],"application/vnd.irepository.package+xml":["irp"],"application/vnd.is-xpr":["xpr"],"application/vnd.isac.fcs":["fcs"],"application/vnd.jam":["jam"],"application/vnd.jcp.javame.midlet-rms":["rms"],"application/vnd.jisp":["jisp"],"application/vnd.joost.joda-archive":["joda"],"application/vnd.kahootz":["ktz","ktr"],"application/vnd.kde.karbon":["karbon"],"application/vnd.kde.kchart":["chrt"],"application/vnd.kde.kformula":["kfo"],"application/vnd.kde.kivio":["flw"],"application/vnd.kde.kontour":["kon"],"application/vnd.kde.kpresenter":["kpr","kpt"],"application/vnd.kde.kspread":["ksp"],"application/vnd.kde.kword":["kwd","kwt"],"application/vnd.kenameaapp":["htke"],"application/vnd.kidspiration":["kia"],"application/vnd.kinar":["kne","knp"],"application/vnd.koan":["skp","skd","skt","skm"],"application/vnd.kodak-descriptor":["sse"],"application/vnd.las.las+xml":["lasxml"],"application/vnd.llamagraphics.life-balance.desktop":["lbd"],"application/vnd.llamagraphics.life-balance.exchange+xml":["lbe"],"application/vnd.lotus-1-2-3":["123"],"application/vnd.lotus-approach":["apr"],"application/vnd.lotus-freelance":["pre"],"application/vnd.lotus-notes":["nsf"],"application/vnd.lotus-organizer":["org"],"application/vnd.lotus-screencam":["scm"],"application/vnd.lotus-wordpro":["lwp"],"application/vnd.macports.portpkg":["portpkg"],"application/vnd.mapbox-vector-tile":["mvt"],"application/vnd.mcd":["mcd"],"application/vnd.medcalcdata":["mc1"],"application/vnd.mediastation.cdkey":["cdkey"],"application/vnd.mfer":["mwf"],"application/vnd.mfmp":["mfm"],"application/vnd.micrografx.flo":["flo"],"application/vnd.micrografx.igx":["igx"],"application/vnd.mif":["mif"],"application/vnd.mobius.daf":["daf"],"application/vnd.mobius.dis":["dis"],"application/vnd.mobius.mbk":["mbk"],"application/vnd.mobius.mqy":["mqy"],"application/vnd.mobius.msl":["msl"],"application/vnd.mobius.plc":["plc"],"application/vnd.mobius.txf":["txf"],"application/vnd.mophun.application":["mpn"],"application/vnd.mophun.certificate":["mpc"],"application/vnd.mozilla.xul+xml":["xul"],"application/vnd.ms-artgalry":["cil"],"application/vnd.ms-cab-compressed":["cab"],"application/vnd.ms-excel":["xls","xlm","xla","xlc","xlt","xlw"],"application/vnd.ms-excel.addin.macroenabled.12":["xlam"],"application/vnd.ms-excel.sheet.binary.macroenabled.12":["xlsb"],"application/vnd.ms-excel.sheet.macroenabled.12":["xlsm"],"application/vnd.ms-excel.template.macroenabled.12":["xltm"],"application/vnd.ms-fontobject":["eot"],"application/vnd.ms-htmlhelp":["chm"],"application/vnd.ms-ims":["ims"],"application/vnd.ms-lrm":["lrm"],"application/vnd.ms-officetheme":["thmx"],"application/vnd.ms-outlook":["msg"],"application/vnd.ms-pki.seccat":["cat"],"application/vnd.ms-pki.stl":["*stl"],"application/vnd.ms-powerpoint":["ppt","pps","pot"],"application/vnd.ms-powerpoint.addin.macroenabled.12":["ppam"],"application/vnd.ms-powerpoint.presentation.macroenabled.12":["pptm"],"application/vnd.ms-powerpoint.slide.macroenabled.12":["sldm"],"application/vnd.ms-powerpoint.slideshow.macroenabled.12":["ppsm"],"application/vnd.ms-powerpoint.template.macroenabled.12":["potm"],"application/vnd.ms-project":["mpp","mpt"],"application/vnd.ms-word.document.macroenabled.12":["docm"],"application/vnd.ms-word.template.macroenabled.12":["dotm"],"application/vnd.ms-works":["wps","wks","wcm","wdb"],"application/vnd.ms-wpl":["wpl"],"application/vnd.ms-xpsdocument":["xps"],"application/vnd.mseq":["mseq"],"application/vnd.musician":["mus"],"application/vnd.muvee.style":["msty"],"application/vnd.mynfc":["taglet"],"application/vnd.neurolanguage.nlu":["nlu"],"application/vnd.nitf":["ntf","nitf"],"application/vnd.noblenet-directory":["nnd"],"application/vnd.noblenet-sealer":["nns"],"application/vnd.noblenet-web":["nnw"],"application/vnd.nokia.n-gage.ac+xml":["*ac"],"application/vnd.nokia.n-gage.data":["ngdat"],"application/vnd.nokia.n-gage.symbian.install":["n-gage"],"application/vnd.nokia.radio-preset":["rpst"],"application/vnd.nokia.radio-presets":["rpss"],"application/vnd.novadigm.edm":["edm"],"application/vnd.novadigm.edx":["edx"],"application/vnd.novadigm.ext":["ext"],"application/vnd.oasis.opendocument.chart":["odc"],"application/vnd.oasis.opendocument.chart-template":["otc"],"application/vnd.oasis.opendocument.database":["odb"],"application/vnd.oasis.opendocument.formula":["odf"],"application/vnd.oasis.opendocument.formula-template":["odft"],"application/vnd.oasis.opendocument.graphics":["odg"],"application/vnd.oasis.opendocument.graphics-template":["otg"],"application/vnd.oasis.opendocument.image":["odi"],"application/vnd.oasis.opendocument.image-template":["oti"],"application/vnd.oasis.opendocument.presentation":["odp"],"application/vnd.oasis.opendocument.presentation-template":["otp"],"application/vnd.oasis.opendocument.spreadsheet":["ods"],"application/vnd.oasis.opendocument.spreadsheet-template":["ots"],"application/vnd.oasis.opendocument.text":["odt"],"application/vnd.oasis.opendocument.text-master":["odm"],"application/vnd.oasis.opendocument.text-template":["ott"],"application/vnd.oasis.opendocument.text-web":["oth"],"application/vnd.olpc-sugar":["xo"],"application/vnd.oma.dd2+xml":["dd2"],"application/vnd.openblox.game+xml":["obgx"],"application/vnd.openofficeorg.extension":["oxt"],"application/vnd.openstreetmap.data+xml":["osm"],"application/vnd.openxmlformats-officedocument.presentationml.presentation":["pptx"],"application/vnd.openxmlformats-officedocument.presentationml.slide":["sldx"],"application/vnd.openxmlformats-officedocument.presentationml.slideshow":["ppsx"],"application/vnd.openxmlformats-officedocument.presentationml.template":["potx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":["xlsx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.template":["xltx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.document":["docx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.template":["dotx"],"application/vnd.osgeo.mapguide.package":["mgp"],"application/vnd.osgi.dp":["dp"],"application/vnd.osgi.subsystem":["esa"],"application/vnd.palm":["pdb","pqa","oprc"],"application/vnd.pawaafile":["paw"],"application/vnd.pg.format":["str"],"application/vnd.pg.osasli":["ei6"],"application/vnd.picsel":["efif"],"application/vnd.pmi.widget":["wg"],"application/vnd.pocketlearn":["plf"],"application/vnd.powerbuilder6":["pbd"],"application/vnd.previewsystems.box":["box"],"application/vnd.proteus.magazine":["mgz"],"application/vnd.publishare-delta-tree":["qps"],"application/vnd.pvi.ptid1":["ptid"],"application/vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"application/vnd.rar":["rar"],"application/vnd.realvnc.bed":["bed"],"application/vnd.recordare.musicxml":["mxl"],"application/vnd.recordare.musicxml+xml":["musicxml"],"application/vnd.rig.cryptonote":["cryptonote"],"application/vnd.rim.cod":["cod"],"application/vnd.rn-realmedia":["rm"],"application/vnd.rn-realmedia-vbr":["rmvb"],"application/vnd.route66.link66+xml":["link66"],"application/vnd.sailingtracker.track":["st"],"application/vnd.seemail":["see"],"application/vnd.sema":["sema"],"application/vnd.semd":["semd"],"application/vnd.semf":["semf"],"application/vnd.shana.informed.formdata":["ifm"],"application/vnd.shana.informed.formtemplate":["itp"],"application/vnd.shana.informed.interchange":["iif"],"application/vnd.shana.informed.package":["ipk"],"application/vnd.simtech-mindmapper":["twd","twds"],"application/vnd.smaf":["mmf"],"application/vnd.smart.teacher":["teacher"],"application/vnd.software602.filler.form+xml":["fo"],"application/vnd.solent.sdkm+xml":["sdkm","sdkd"],"application/vnd.spotfire.dxp":["dxp"],"application/vnd.spotfire.sfs":["sfs"],"application/vnd.stardivision.calc":["sdc"],"application/vnd.stardivision.draw":["sda"],"application/vnd.stardivision.impress":["sdd"],"application/vnd.stardivision.math":["smf"],"application/vnd.stardivision.writer":["sdw","vor"],"application/vnd.stardivision.writer-global":["sgl"],"application/vnd.stepmania.package":["smzip"],"application/vnd.stepmania.stepchart":["sm"],"application/vnd.sun.wadl+xml":["wadl"],"application/vnd.sun.xml.calc":["sxc"],"application/vnd.sun.xml.calc.template":["stc"],"application/vnd.sun.xml.draw":["sxd"],"application/vnd.sun.xml.draw.template":["std"],"application/vnd.sun.xml.impress":["sxi"],"application/vnd.sun.xml.impress.template":["sti"],"application/vnd.sun.xml.math":["sxm"],"application/vnd.sun.xml.writer":["sxw"],"application/vnd.sun.xml.writer.global":["sxg"],"application/vnd.sun.xml.writer.template":["stw"],"application/vnd.sus-calendar":["sus","susp"],"application/vnd.svd":["svd"],"application/vnd.symbian.install":["sis","sisx"],"application/vnd.syncml+xml":["xsm"],"application/vnd.syncml.dm+wbxml":["bdm"],"application/vnd.syncml.dm+xml":["xdm"],"application/vnd.syncml.dmddf+xml":["ddf"],"application/vnd.tao.intent-module-archive":["tao"],"application/vnd.tcpdump.pcap":["pcap","cap","dmp"],"application/vnd.tmobile-livetv":["tmo"],"application/vnd.trid.tpt":["tpt"],"application/vnd.triscape.mxs":["mxs"],"application/vnd.trueapp":["tra"],"application/vnd.ufdl":["ufd","ufdl"],"application/vnd.uiq.theme":["utz"],"application/vnd.umajin":["umj"],"application/vnd.unity":["unityweb"],"application/vnd.uoml+xml":["uoml"],"application/vnd.vcx":["vcx"],"application/vnd.visio":["vsd","vst","vss","vsw"],"application/vnd.visionary":["vis"],"application/vnd.vsf":["vsf"],"application/vnd.wap.wbxml":["wbxml"],"application/vnd.wap.wmlc":["wmlc"],"application/vnd.wap.wmlscriptc":["wmlsc"],"application/vnd.webturbo":["wtb"],"application/vnd.wolfram.player":["nbp"],"application/vnd.wordperfect":["wpd"],"application/vnd.wqd":["wqd"],"application/vnd.wt.stf":["stf"],"application/vnd.xara":["xar"],"application/vnd.xfdl":["xfdl"],"application/vnd.yamaha.hv-dic":["hvd"],"application/vnd.yamaha.hv-script":["hvs"],"application/vnd.yamaha.hv-voice":["hvp"],"application/vnd.yamaha.openscoreformat":["osf"],"application/vnd.yamaha.openscoreformat.osfpvg+xml":["osfpvg"],"application/vnd.yamaha.smaf-audio":["saf"],"application/vnd.yamaha.smaf-phrase":["spf"],"application/vnd.yellowriver-custom-menu":["cmp"],"application/vnd.zul":["zir","zirz"],"application/vnd.zzazz.deck+xml":["zaz"],"application/x-7z-compressed":["7z"],"application/x-abiword":["abw"],"application/x-ace-compressed":["ace"],"application/x-apple-diskimage":["*dmg"],"application/x-arj":["arj"],"application/x-authorware-bin":["aab","x32","u32","vox"],"application/x-authorware-map":["aam"],"application/x-authorware-seg":["aas"],"application/x-bcpio":["bcpio"],"application/x-bdoc":["*bdoc"],"application/x-bittorrent":["torrent"],"application/x-blorb":["blb","blorb"],"application/x-bzip":["bz"],"application/x-bzip2":["bz2","boz"],"application/x-cbr":["cbr","cba","cbt","cbz","cb7"],"application/x-cdlink":["vcd"],"application/x-cfs-compressed":["cfs"],"application/x-chat":["chat"],"application/x-chess-pgn":["pgn"],"application/x-chrome-extension":["crx"],"application/x-cocoa":["cco"],"application/x-conference":["nsc"],"application/x-cpio":["cpio"],"application/x-csh":["csh"],"application/x-debian-package":["*deb","udeb"],"application/x-dgc-compressed":["dgc"],"application/x-director":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"],"application/x-doom":["wad"],"application/x-dtbncx+xml":["ncx"],"application/x-dtbook+xml":["dtb"],"application/x-dtbresource+xml":["res"],"application/x-dvi":["dvi"],"application/x-envoy":["evy"],"application/x-eva":["eva"],"application/x-font-bdf":["bdf"],"application/x-font-ghostscript":["gsf"],"application/x-font-linux-psf":["psf"],"application/x-font-pcf":["pcf"],"application/x-font-snf":["snf"],"application/x-font-type1":["pfa","pfb","pfm","afm"],"application/x-freearc":["arc"],"application/x-futuresplash":["spl"],"application/x-gca-compressed":["gca"],"application/x-glulx":["ulx"],"application/x-gnumeric":["gnumeric"],"application/x-gramps-xml":["gramps"],"application/x-gtar":["gtar"],"application/x-hdf":["hdf"],"application/x-httpd-php":["php"],"application/x-install-instructions":["install"],"application/x-iso9660-image":["*iso"],"application/x-iwork-keynote-sffkey":["*key"],"application/x-iwork-numbers-sffnumbers":["*numbers"],"application/x-iwork-pages-sffpages":["*pages"],"application/x-java-archive-diff":["jardiff"],"application/x-java-jnlp-file":["jnlp"],"application/x-keepass2":["kdbx"],"application/x-latex":["latex"],"application/x-lua-bytecode":["luac"],"application/x-lzh-compressed":["lzh","lha"],"application/x-makeself":["run"],"application/x-mie":["mie"],"application/x-mobipocket-ebook":["prc","mobi"],"application/x-ms-application":["application"],"application/x-ms-shortcut":["lnk"],"application/x-ms-wmd":["wmd"],"application/x-ms-wmz":["wmz"],"application/x-ms-xbap":["xbap"],"application/x-msaccess":["mdb"],"application/x-msbinder":["obd"],"application/x-mscardfile":["crd"],"application/x-msclip":["clp"],"application/x-msdos-program":["*exe"],"application/x-msdownload":["*exe","*dll","com","bat","*msi"],"application/x-msmediaview":["mvb","m13","m14"],"application/x-msmetafile":["*wmf","*wmz","*emf","emz"],"application/x-msmoney":["mny"],"application/x-mspublisher":["pub"],"application/x-msschedule":["scd"],"application/x-msterminal":["trm"],"application/x-mswrite":["wri"],"application/x-netcdf":["nc","cdf"],"application/x-ns-proxy-autoconfig":["pac"],"application/x-nzb":["nzb"],"application/x-perl":["pl","pm"],"application/x-pilot":["*prc","*pdb"],"application/x-pkcs12":["p12","pfx"],"application/x-pkcs7-certificates":["p7b","spc"],"application/x-pkcs7-certreqresp":["p7r"],"application/x-rar-compressed":["*rar"],"application/x-redhat-package-manager":["rpm"],"application/x-research-info-systems":["ris"],"application/x-sea":["sea"],"application/x-sh":["sh"],"application/x-shar":["shar"],"application/x-shockwave-flash":["swf"],"application/x-silverlight-app":["xap"],"application/x-sql":["sql"],"application/x-stuffit":["sit"],"application/x-stuffitx":["sitx"],"application/x-subrip":["srt"],"application/x-sv4cpio":["sv4cpio"],"application/x-sv4crc":["sv4crc"],"application/x-t3vm-image":["t3"],"application/x-tads":["gam"],"application/x-tar":["tar"],"application/x-tcl":["tcl","tk"],"application/x-tex":["tex"],"application/x-tex-tfm":["tfm"],"application/x-texinfo":["texinfo","texi"],"application/x-tgif":["*obj"],"application/x-ustar":["ustar"],"application/x-virtualbox-hdd":["hdd"],"application/x-virtualbox-ova":["ova"],"application/x-virtualbox-ovf":["ovf"],"application/x-virtualbox-vbox":["vbox"],"application/x-virtualbox-vbox-extpack":["vbox-extpack"],"application/x-virtualbox-vdi":["vdi"],"application/x-virtualbox-vhd":["vhd"],"application/x-virtualbox-vmdk":["vmdk"],"application/x-wais-source":["src"],"application/x-web-app-manifest+json":["webapp"],"application/x-x509-ca-cert":["der","crt","pem"],"application/x-xfig":["fig"],"application/x-xliff+xml":["*xlf"],"application/x-xpinstall":["xpi"],"application/x-xz":["xz"],"application/x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"audio/vnd.dece.audio":["uva","uvva"],"audio/vnd.digital-winds":["eol"],"audio/vnd.dra":["dra"],"audio/vnd.dts":["dts"],"audio/vnd.dts.hd":["dtshd"],"audio/vnd.lucent.voice":["lvp"],"audio/vnd.ms-playready.media.pya":["pya"],"audio/vnd.nuera.ecelp4800":["ecelp4800"],"audio/vnd.nuera.ecelp7470":["ecelp7470"],"audio/vnd.nuera.ecelp9600":["ecelp9600"],"audio/vnd.rip":["rip"],"audio/x-aac":["aac"],"audio/x-aiff":["aif","aiff","aifc"],"audio/x-caf":["caf"],"audio/x-flac":["flac"],"audio/x-m4a":["*m4a"],"audio/x-matroska":["mka"],"audio/x-mpegurl":["m3u"],"audio/x-ms-wax":["wax"],"audio/x-ms-wma":["wma"],"audio/x-pn-realaudio":["ram","ra"],"audio/x-pn-realaudio-plugin":["rmp"],"audio/x-realaudio":["*ra"],"audio/x-wav":["*wav"],"chemical/x-cdx":["cdx"],"chemical/x-cif":["cif"],"chemical/x-cmdf":["cmdf"],"chemical/x-cml":["cml"],"chemical/x-csml":["csml"],"chemical/x-xyz":["xyz"],"image/prs.btif":["btif"],"image/prs.pti":["pti"],"image/vnd.adobe.photoshop":["psd"],"image/vnd.airzip.accelerator.azv":["azv"],"image/vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"image/vnd.djvu":["djvu","djv"],"image/vnd.dvb.subtitle":["*sub"],"image/vnd.dwg":["dwg"],"image/vnd.dxf":["dxf"],"image/vnd.fastbidsheet":["fbs"],"image/vnd.fpx":["fpx"],"image/vnd.fst":["fst"],"image/vnd.fujixerox.edmics-mmr":["mmr"],"image/vnd.fujixerox.edmics-rlc":["rlc"],"image/vnd.microsoft.icon":["ico"],"image/vnd.ms-dds":["dds"],"image/vnd.ms-modi":["mdi"],"image/vnd.ms-photo":["wdp"],"image/vnd.net-fpx":["npx"],"image/vnd.pco.b16":["b16"],"image/vnd.tencent.tap":["tap"],"image/vnd.valve.source.texture":["vtf"],"image/vnd.wap.wbmp":["wbmp"],"image/vnd.xiff":["xif"],"image/vnd.zbrush.pcx":["pcx"],"image/x-3ds":["3ds"],"image/x-cmu-raster":["ras"],"image/x-cmx":["cmx"],"image/x-freehand":["fh","fhc","fh4","fh5","fh7"],"image/x-icon":["*ico"],"image/x-jng":["jng"],"image/x-mrsid-image":["sid"],"image/x-ms-bmp":["*bmp"],"image/x-pcx":["*pcx"],"image/x-pict":["pic","pct"],"image/x-portable-anymap":["pnm"],"image/x-portable-bitmap":["pbm"],"image/x-portable-graymap":["pgm"],"image/x-portable-pixmap":["ppm"],"image/x-rgb":["rgb"],"image/x-tga":["tga"],"image/x-xbitmap":["xbm"],"image/x-xpixmap":["xpm"],"image/x-xwindowdump":["xwd"],"message/vnd.wfa.wsc":["wsc"],"model/vnd.collada+xml":["dae"],"model/vnd.dwf":["dwf"],"model/vnd.gdl":["gdl"],"model/vnd.gtw":["gtw"],"model/vnd.mts":["mts"],"model/vnd.opengex":["ogex"],"model/vnd.parasolid.transmit.binary":["x_b"],"model/vnd.parasolid.transmit.text":["x_t"],"model/vnd.sap.vds":["vds"],"model/vnd.usdz+zip":["usdz"],"model/vnd.valve.source.compiled-map":["bsp"],"model/vnd.vtu":["vtu"],"text/prs.lines.tag":["dsc"],"text/vnd.curl":["curl"],"text/vnd.curl.dcurl":["dcurl"],"text/vnd.curl.mcurl":["mcurl"],"text/vnd.curl.scurl":["scurl"],"text/vnd.dvb.subtitle":["sub"],"text/vnd.fly":["fly"],"text/vnd.fmi.flexstor":["flx"],"text/vnd.graphviz":["gv"],"text/vnd.in3d.3dml":["3dml"],"text/vnd.in3d.spot":["spot"],"text/vnd.sun.j2me.app-descriptor":["jad"],"text/vnd.wap.wml":["wml"],"text/vnd.wap.wmlscript":["wmls"],"text/x-asm":["s","asm"],"text/x-c":["c","cc","cxx","cpp","h","hh","dic"],"text/x-component":["htc"],"text/x-fortran":["f","for","f77","f90"],"text/x-handlebars-template":["hbs"],"text/x-java-source":["java"],"text/x-lua":["lua"],"text/x-markdown":["mkd"],"text/x-nfo":["nfo"],"text/x-opml":["opml"],"text/x-org":["*org"],"text/x-pascal":["p","pas"],"text/x-processing":["pde"],"text/x-sass":["sass"],"text/x-scss":["scss"],"text/x-setext":["etx"],"text/x-sfv":["sfv"],"text/x-suse-ymp":["ymp"],"text/x-uuencode":["uu"],"text/x-vcalendar":["vcs"],"text/x-vcard":["vcf"],"video/vnd.dece.hd":["uvh","uvvh"],"video/vnd.dece.mobile":["uvm","uvvm"],"video/vnd.dece.pd":["uvp","uvvp"],"video/vnd.dece.sd":["uvs","uvvs"],"video/vnd.dece.video":["uvv","uvvv"],"video/vnd.dvb.file":["dvb"],"video/vnd.fvt":["fvt"],"video/vnd.mpegurl":["mxu","m4u"],"video/vnd.ms-playready.media.pyv":["pyv"],"video/vnd.uvvu.mp4":["uvu","uvvu"],"video/vnd.vivo":["viv"],"video/x-f4v":["f4v"],"video/x-fli":["fli"],"video/x-flv":["flv"],"video/x-m4v":["m4v"],"video/x-matroska":["mkv","mk3d","mks"],"video/x-mng":["mng"],"video/x-ms-asf":["asf","asx"],"video/x-ms-vob":["vob"],"video/x-ms-wm":["wm"],"video/x-ms-wmv":["wmv"],"video/x-ms-wmx":["wmx"],"video/x-ms-wvx":["wvx"],"video/x-msvideo":["avi"],"video/x-sgi-movie":["movie"],"video/x-smv":["smv"],"x-conference/x-cooltalk":["ice"]}; \ No newline at end of file diff --git a/node_modules/mime/types/standard.js b/node_modules/mime/types/standard.js new file mode 100644 index 00000000..5ee9937e --- /dev/null +++ b/node_modules/mime/types/standard.js @@ -0,0 +1 @@ +module.exports = {"application/andrew-inset":["ez"],"application/applixware":["aw"],"application/atom+xml":["atom"],"application/atomcat+xml":["atomcat"],"application/atomdeleted+xml":["atomdeleted"],"application/atomsvc+xml":["atomsvc"],"application/atsc-dwd+xml":["dwd"],"application/atsc-held+xml":["held"],"application/atsc-rsat+xml":["rsat"],"application/bdoc":["bdoc"],"application/calendar+xml":["xcs"],"application/ccxml+xml":["ccxml"],"application/cdfx+xml":["cdfx"],"application/cdmi-capability":["cdmia"],"application/cdmi-container":["cdmic"],"application/cdmi-domain":["cdmid"],"application/cdmi-object":["cdmio"],"application/cdmi-queue":["cdmiq"],"application/cu-seeme":["cu"],"application/dash+xml":["mpd"],"application/davmount+xml":["davmount"],"application/docbook+xml":["dbk"],"application/dssc+der":["dssc"],"application/dssc+xml":["xdssc"],"application/ecmascript":["es","ecma"],"application/emma+xml":["emma"],"application/emotionml+xml":["emotionml"],"application/epub+zip":["epub"],"application/exi":["exi"],"application/express":["exp"],"application/fdt+xml":["fdt"],"application/font-tdpfr":["pfr"],"application/geo+json":["geojson"],"application/gml+xml":["gml"],"application/gpx+xml":["gpx"],"application/gxf":["gxf"],"application/gzip":["gz"],"application/hjson":["hjson"],"application/hyperstudio":["stk"],"application/inkml+xml":["ink","inkml"],"application/ipfix":["ipfix"],"application/its+xml":["its"],"application/java-archive":["jar","war","ear"],"application/java-serialized-object":["ser"],"application/java-vm":["class"],"application/javascript":["js","mjs"],"application/json":["json","map"],"application/json5":["json5"],"application/jsonml+json":["jsonml"],"application/ld+json":["jsonld"],"application/lgr+xml":["lgr"],"application/lost+xml":["lostxml"],"application/mac-binhex40":["hqx"],"application/mac-compactpro":["cpt"],"application/mads+xml":["mads"],"application/manifest+json":["webmanifest"],"application/marc":["mrc"],"application/marcxml+xml":["mrcx"],"application/mathematica":["ma","nb","mb"],"application/mathml+xml":["mathml"],"application/mbox":["mbox"],"application/mediaservercontrol+xml":["mscml"],"application/metalink+xml":["metalink"],"application/metalink4+xml":["meta4"],"application/mets+xml":["mets"],"application/mmt-aei+xml":["maei"],"application/mmt-usd+xml":["musd"],"application/mods+xml":["mods"],"application/mp21":["m21","mp21"],"application/mp4":["mp4s","m4p"],"application/msword":["doc","dot"],"application/mxf":["mxf"],"application/n-quads":["nq"],"application/n-triples":["nt"],"application/node":["cjs"],"application/octet-stream":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"],"application/oda":["oda"],"application/oebps-package+xml":["opf"],"application/ogg":["ogx"],"application/omdoc+xml":["omdoc"],"application/onenote":["onetoc","onetoc2","onetmp","onepkg"],"application/oxps":["oxps"],"application/p2p-overlay+xml":["relo"],"application/patch-ops-error+xml":["xer"],"application/pdf":["pdf"],"application/pgp-encrypted":["pgp"],"application/pgp-signature":["asc","sig"],"application/pics-rules":["prf"],"application/pkcs10":["p10"],"application/pkcs7-mime":["p7m","p7c"],"application/pkcs7-signature":["p7s"],"application/pkcs8":["p8"],"application/pkix-attr-cert":["ac"],"application/pkix-cert":["cer"],"application/pkix-crl":["crl"],"application/pkix-pkipath":["pkipath"],"application/pkixcmp":["pki"],"application/pls+xml":["pls"],"application/postscript":["ai","eps","ps"],"application/provenance+xml":["provx"],"application/pskc+xml":["pskcxml"],"application/raml+yaml":["raml"],"application/rdf+xml":["rdf","owl"],"application/reginfo+xml":["rif"],"application/relax-ng-compact-syntax":["rnc"],"application/resource-lists+xml":["rl"],"application/resource-lists-diff+xml":["rld"],"application/rls-services+xml":["rs"],"application/route-apd+xml":["rapd"],"application/route-s-tsid+xml":["sls"],"application/route-usd+xml":["rusd"],"application/rpki-ghostbusters":["gbr"],"application/rpki-manifest":["mft"],"application/rpki-roa":["roa"],"application/rsd+xml":["rsd"],"application/rss+xml":["rss"],"application/rtf":["rtf"],"application/sbml+xml":["sbml"],"application/scvp-cv-request":["scq"],"application/scvp-cv-response":["scs"],"application/scvp-vp-request":["spq"],"application/scvp-vp-response":["spp"],"application/sdp":["sdp"],"application/senml+xml":["senmlx"],"application/sensml+xml":["sensmlx"],"application/set-payment-initiation":["setpay"],"application/set-registration-initiation":["setreg"],"application/shf+xml":["shf"],"application/sieve":["siv","sieve"],"application/smil+xml":["smi","smil"],"application/sparql-query":["rq"],"application/sparql-results+xml":["srx"],"application/srgs":["gram"],"application/srgs+xml":["grxml"],"application/sru+xml":["sru"],"application/ssdl+xml":["ssdl"],"application/ssml+xml":["ssml"],"application/swid+xml":["swidtag"],"application/tei+xml":["tei","teicorpus"],"application/thraud+xml":["tfi"],"application/timestamped-data":["tsd"],"application/toml":["toml"],"application/trig":["trig"],"application/ttml+xml":["ttml"],"application/ubjson":["ubj"],"application/urc-ressheet+xml":["rsheet"],"application/urc-targetdesc+xml":["td"],"application/voicexml+xml":["vxml"],"application/wasm":["wasm"],"application/widget":["wgt"],"application/winhlp":["hlp"],"application/wsdl+xml":["wsdl"],"application/wspolicy+xml":["wspolicy"],"application/xaml+xml":["xaml"],"application/xcap-att+xml":["xav"],"application/xcap-caps+xml":["xca"],"application/xcap-diff+xml":["xdf"],"application/xcap-el+xml":["xel"],"application/xcap-ns+xml":["xns"],"application/xenc+xml":["xenc"],"application/xhtml+xml":["xhtml","xht"],"application/xliff+xml":["xlf"],"application/xml":["xml","xsl","xsd","rng"],"application/xml-dtd":["dtd"],"application/xop+xml":["xop"],"application/xproc+xml":["xpl"],"application/xslt+xml":["*xsl","xslt"],"application/xspf+xml":["xspf"],"application/xv+xml":["mxml","xhvml","xvml","xvm"],"application/yang":["yang"],"application/yin+xml":["yin"],"application/zip":["zip"],"audio/3gpp":["*3gpp"],"audio/adpcm":["adp"],"audio/amr":["amr"],"audio/basic":["au","snd"],"audio/midi":["mid","midi","kar","rmi"],"audio/mobile-xmf":["mxmf"],"audio/mp3":["*mp3"],"audio/mp4":["m4a","mp4a"],"audio/mpeg":["mpga","mp2","mp2a","mp3","m2a","m3a"],"audio/ogg":["oga","ogg","spx","opus"],"audio/s3m":["s3m"],"audio/silk":["sil"],"audio/wav":["wav"],"audio/wave":["*wav"],"audio/webm":["weba"],"audio/xm":["xm"],"font/collection":["ttc"],"font/otf":["otf"],"font/ttf":["ttf"],"font/woff":["woff"],"font/woff2":["woff2"],"image/aces":["exr"],"image/apng":["apng"],"image/avif":["avif"],"image/bmp":["bmp"],"image/cgm":["cgm"],"image/dicom-rle":["drle"],"image/emf":["emf"],"image/fits":["fits"],"image/g3fax":["g3"],"image/gif":["gif"],"image/heic":["heic"],"image/heic-sequence":["heics"],"image/heif":["heif"],"image/heif-sequence":["heifs"],"image/hej2k":["hej2"],"image/hsj2":["hsj2"],"image/ief":["ief"],"image/jls":["jls"],"image/jp2":["jp2","jpg2"],"image/jpeg":["jpeg","jpg","jpe"],"image/jph":["jph"],"image/jphc":["jhc"],"image/jpm":["jpm"],"image/jpx":["jpx","jpf"],"image/jxr":["jxr"],"image/jxra":["jxra"],"image/jxrs":["jxrs"],"image/jxs":["jxs"],"image/jxsc":["jxsc"],"image/jxsi":["jxsi"],"image/jxss":["jxss"],"image/ktx":["ktx"],"image/ktx2":["ktx2"],"image/png":["png"],"image/sgi":["sgi"],"image/svg+xml":["svg","svgz"],"image/t38":["t38"],"image/tiff":["tif","tiff"],"image/tiff-fx":["tfx"],"image/webp":["webp"],"image/wmf":["wmf"],"message/disposition-notification":["disposition-notification"],"message/global":["u8msg"],"message/global-delivery-status":["u8dsn"],"message/global-disposition-notification":["u8mdn"],"message/global-headers":["u8hdr"],"message/rfc822":["eml","mime"],"model/3mf":["3mf"],"model/gltf+json":["gltf"],"model/gltf-binary":["glb"],"model/iges":["igs","iges"],"model/mesh":["msh","mesh","silo"],"model/mtl":["mtl"],"model/obj":["obj"],"model/step+xml":["stpx"],"model/step+zip":["stpz"],"model/step-xml+zip":["stpxz"],"model/stl":["stl"],"model/vrml":["wrl","vrml"],"model/x3d+binary":["*x3db","x3dbz"],"model/x3d+fastinfoset":["x3db"],"model/x3d+vrml":["*x3dv","x3dvz"],"model/x3d+xml":["x3d","x3dz"],"model/x3d-vrml":["x3dv"],"text/cache-manifest":["appcache","manifest"],"text/calendar":["ics","ifb"],"text/coffeescript":["coffee","litcoffee"],"text/css":["css"],"text/csv":["csv"],"text/html":["html","htm","shtml"],"text/jade":["jade"],"text/jsx":["jsx"],"text/less":["less"],"text/markdown":["markdown","md"],"text/mathml":["mml"],"text/mdx":["mdx"],"text/n3":["n3"],"text/plain":["txt","text","conf","def","list","log","in","ini"],"text/richtext":["rtx"],"text/rtf":["*rtf"],"text/sgml":["sgml","sgm"],"text/shex":["shex"],"text/slim":["slim","slm"],"text/spdx":["spdx"],"text/stylus":["stylus","styl"],"text/tab-separated-values":["tsv"],"text/troff":["t","tr","roff","man","me","ms"],"text/turtle":["ttl"],"text/uri-list":["uri","uris","urls"],"text/vcard":["vcard"],"text/vtt":["vtt"],"text/xml":["*xml"],"text/yaml":["yaml","yml"],"video/3gpp":["3gp","3gpp"],"video/3gpp2":["3g2"],"video/h261":["h261"],"video/h263":["h263"],"video/h264":["h264"],"video/iso.segment":["m4s"],"video/jpeg":["jpgv"],"video/jpm":["*jpm","jpgm"],"video/mj2":["mj2","mjp2"],"video/mp2t":["ts"],"video/mp4":["mp4","mp4v","mpg4"],"video/mpeg":["mpeg","mpg","mpe","m1v","m2v"],"video/ogg":["ogv"],"video/quicktime":["qt","mov"],"video/webm":["webm"]}; \ No newline at end of file diff --git a/node_modules/minimatch/LICENSE.md b/node_modules/minimatch/LICENSE.md new file mode 100644 index 00000000..8cb5cc6e --- /dev/null +++ b/node_modules/minimatch/LICENSE.md @@ -0,0 +1,55 @@ +# Blue Oak Model License + +Version 1.0.0 + +## Purpose + +This license gives everyone as much permission to work with +this software as possible, while protecting contributors +from liability. + +## Acceptance + +In order to receive this license, you must agree to its +rules. The rules of this license are both obligations +under that agreement and conditions to your license. +You must not do anything with this software that triggers +a rule that you cannot or will not follow. + +## Copyright + +Each contributor licenses you to do everything with this +software that would otherwise infringe that contributor's +copyright in it. + +## Notices + +You must ensure that everyone who gets a copy of +any part of this software from you, with or without +changes, also gets the text of this license or a link to +. + +## Excuse + +If anyone notifies you in writing that you have not +complied with [Notices](#notices), you can keep your +license by taking all practical steps to comply within 30 +days after the notice. If you do not do so, your license +ends immediately. + +## Patent + +Each contributor licenses you to do everything with this +software that would otherwise infringe any patent claims +they can license or become able to license. + +## Reliability + +No contributor can revoke this license. + +## No Liability + +**_As far as the law allows, this software comes as is, +without any warranty or condition, and no contributor +will be liable to anyone for any damages related to this +software or this license, under any kind of legal claim._** diff --git a/node_modules/minimatch/README.md b/node_modules/minimatch/README.md new file mode 100644 index 00000000..1a068fab --- /dev/null +++ b/node_modules/minimatch/README.md @@ -0,0 +1,528 @@ +# minimatch + +A minimal matching utility. + +This is the matching library used internally by npm. + +It works by converting glob expressions into JavaScript `RegExp` +objects. + +## Important Security Consideration! + +> [!WARNING] +> This library uses JavaScript regular expressions. Please read +> the following warning carefully, and be thoughtful about what +> you provide to this library in production systems. + +_Any_ library in JavaScript that deals with matching string +patterns using regular expressions will be subject to +[ReDoS](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS) +if the pattern is generated using untrusted input. + +Efforts have been made to mitigate risk as much as is feasible in +such a library, providing maximum recursion depths and so forth, +but these measures can only ultimately protect against accidents, +not malice. A dedicated attacker can _always_ find patterns that +cannot be defended against by a bash-compatible glob pattern +matching system that uses JavaScript regular expressions. + +To be extremely clear: + +> [!WARNING] +> **If you create a system where you take user input, and use +> that input as the source of a Regular Expression pattern, in +> this or any extant glob matcher in JavaScript, you will be +> pwned.** + +A future version of this library _may_ use a different matching +algorithm which does not exhibit backtracking problems. If and +when that happens, it will likely be a sweeping change, and those +improvements will **not** be backported to legacy versions. + +In the near term, it is not reasonable to continue to play +whack-a-mole with security advisories, and so any future ReDoS +reports will be considered "working as intended", and resolved +entirely by this warning. + +## Usage + +```js +// hybrid module, load with require() or import +import { minimatch } from 'minimatch' +// or: +const { minimatch } = require('minimatch') + +minimatch('bar.foo', '*.foo') // true! +minimatch('bar.foo', '*.bar') // false! +minimatch('bar.foo', '*.+(bar|foo)', { debug: true }) // true, and noisy! +``` + +## Features + +Supports these glob features: + +- Brace Expansion +- Extended glob matching +- "Globstar" `**` matching +- [Posix character + classes](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html), + like `[[:alpha:]]`, supporting the full range of Unicode + characters. For example, `[[:alpha:]]` will match against + `'é'`, though `[a-zA-Z]` will not. Collating symbol and set + matching is not supported, so `[[=e=]]` will _not_ match `'é'` + and `[[.ch.]]` will not match `'ch'` in locales where `ch` is + considered a single character. + +See: + +- `man sh` +- `man bash` [Pattern + Matching](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html) +- `man 3 fnmatch` +- `man 5 gitignore` + +## Windows + +**Please only use forward-slashes in glob expressions.** + +Though windows uses either `/` or `\` as its path separator, only `/` +characters are used by this glob implementation. You must use +forward-slashes **only** in glob expressions. Back-slashes in patterns +will always be interpreted as escape characters, not path separators. + +Note that `\` or `/` _will_ be interpreted as path separators in paths on +Windows, and will match against `/` in glob expressions. + +So just always use `/` in patterns. + +### UNC Paths + +On Windows, UNC paths like `//?/c:/...` or +`//ComputerName/Share/...` are handled specially. + +- Patterns starting with a double-slash followed by some + non-slash characters will preserve their double-slash. As a + result, a pattern like `//*` will match `//x`, but not `/x`. +- Patterns staring with `//?/:` will _not_ treat + the `?` as a wildcard character. Instead, it will be treated + as a normal string. +- Patterns starting with `//?/:/...` will match + file paths starting with `:/...`, and vice versa, + as if the `//?/` was not present. This behavior only is + present when the drive letters are a case-insensitive match to + one another. The remaining portions of the path/pattern are + compared case sensitively, unless `nocase:true` is set. + +Note that specifying a UNC path using `\` characters as path +separators is always allowed in the file path argument, but only +allowed in the pattern argument when `windowsPathsNoEscape: true` +is set in the options. + +## Minimatch Class + +Create a minimatch object by instantiating the `minimatch.Minimatch` class. + +```javascript +var Minimatch = require('minimatch').Minimatch +var mm = new Minimatch(pattern, options) +``` + +### Properties + +- `pattern` The original pattern the minimatch object represents. +- `options` The options supplied to the constructor. +- `set` A 2-dimensional array of regexp or string expressions. + Each row in the + array corresponds to a brace-expanded pattern. Each item in the row + corresponds to a single path-part. For example, the pattern + `{a,b/c}/d` would expand to a set of patterns like: + + [ [ a, d ] + , [ b, c, d ] ] + + If a portion of the pattern doesn't have any "magic" in it + (that is, it's something like `"foo"` rather than `fo*o?`), then it + will be left as a string rather than converted to a regular + expression. + +- `regexp` Created by the `makeRe` method. A single regular expression + expressing the entire pattern. This is useful in cases where you wish + to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled. +- `negate` True if the pattern is negated. +- `comment` True if the pattern is a comment. +- `empty` True if the pattern is `""`. + +### Methods + +- `makeRe()` Generate the `regexp` member if necessary, and return it. + Will return `false` if the pattern is invalid. +- `match(fname)` Return true if the filename matches the pattern, or + false otherwise. +- `matchOne(fileArray, patternArray, partial)` Take a `/`-split + filename, and match it against a single row in the `regExpSet`. This + method is mainly for internal use, but is exposed so that it can be + used by a glob-walker that needs to avoid excessive filesystem calls. +- `hasMagic()` Returns true if the parsed pattern contains any + magic characters. Returns false if all comparator parts are + string literals. If the `magicalBraces` option is set on the + constructor, then it will consider brace expansions which are + not otherwise magical to be magic. If not set, then a pattern + like `a{b,c}d` will return `false`, because neither `abd` nor + `acd` contain any special glob characters. + + This does **not** mean that the pattern string can be used as a + literal filename, as it may contain magic glob characters that + are escaped. For example, the pattern `\\*` or `[*]` would not + be considered to have magic, as the matching portion parses to + the literal string `'*'` and would match a path named `'*'`, + not `'\\*'` or `'[*]'`. The `minimatch.unescape()` method may + be used to remove escape characters. + +All other methods are internal, and will be called as necessary. + +### minimatch(path, pattern, options) + +Main export. Tests a path against the pattern using the options. + +```javascript +var isJS = minimatch(file, '*.js', { matchBase: true }) +``` + +### minimatch.filter(pattern, options) + +Returns a function that tests its +supplied argument, suitable for use with `Array.filter`. Example: + +```javascript +var javascripts = fileList.filter( + minimatch.filter('*.js', { matchBase: true }), +) +``` + +### minimatch.escape(pattern, options = {}) + +Escape all magic characters in a glob pattern, so that it will +only ever match literal strings. + +If the `windowsPathsNoEscape` option is used, then characters are +escaped by wrapping in `[]`, because a magic character wrapped in +a character class can only be satisfied by that exact character. + +Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot +be escaped or unescaped. + +### minimatch.unescape(pattern, options = {}) + +Un-escape a glob string that may contain some escaped characters. + +If the `windowsPathsNoEscape` option is used, then square-brace +escapes are removed, but not backslash escapes. For example, it +will turn the string `'[*]'` into `*`, but it will not turn +`'\\*'` into `'*'`, because `\` is a path separator in +`windowsPathsNoEscape` mode. + +When `windowsPathsNoEscape` is not set, then both brace escapes +and backslash escapes are removed. + +Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot +be escaped or unescaped. + +### minimatch.match(list, pattern, options) + +Match against the list of +files, in the style of fnmatch or glob. If nothing is matched, and +options.nonull is set, then return a list containing the pattern itself. + +```javascript +var javascripts = minimatch.match(fileList, '*.js', { matchBase: true }) +``` + +### minimatch.makeRe(pattern, options) + +Make a regular expression object from the pattern. + +## Options + +All options are `false` by default. + +### debug + +Dump a ton of stuff to stderr. + +### nobrace + +Do not expand `{a,b}` and `{1..3}` brace sets. + +### noglobstar + +Disable `**` matching against multiple folder names. + +### dot + +Allow patterns to match filenames starting with a period, even if +the pattern does not explicitly have a period in that spot. + +Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot` +is set. + +### noext + +Disable "extglob" style patterns like `+(a|b)`. + +### nocase + +Perform a case-insensitive match. + +### nocaseMagicOnly + +When used with `{nocase: true}`, create regular expressions that +are case-insensitive, but leave string match portions untouched. +Has no effect when used without `{nocase: true}`. + +Useful when some other form of case-insensitive matching is used, +or if the original string representation is useful in some other +way. + +### nonull + +When a match is not found by `minimatch.match`, return a list containing +the pattern itself if this option is set. When not set, an empty list +is returned if there are no matches. + +### magicalBraces + +This only affects the results of the `Minimatch.hasMagic` method. + +If the pattern contains brace expansions, such as `a{b,c}d`, but +no other magic characters, then the `Minimatch.hasMagic()` method +will return `false` by default. When this option set, it will +return `true` for brace expansion as well as other magic glob +characters. + +### matchBase + +If set, then patterns without slashes will be matched +against the basename of the path if it contains slashes. For example, +`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`. + +### nocomment + +Suppress the behavior of treating `#` at the start of a pattern as a +comment. + +### nonegate + +Suppress the behavior of treating a leading `!` character as negation. + +### flipNegate + +Returns from negate expressions the same as if they were not negated. +(Ie, true on a hit, false on a miss.) + +### partial + +Compare a partial path to a pattern. As long as the parts of the path that +are present are not contradicted by the pattern, it will be treated as a +match. This is useful in applications where you're walking through a +folder structure, and don't yet have the full path, but want to ensure that +you do not walk down paths that can never be a match. + +For example, + +```js +minimatch('/a/b', '/a/*/c/d', { partial: true }) // true, might be /a/b/c/d +minimatch('/a/b', '/**/d', { partial: true }) // true, might be /a/b/.../d +minimatch('/x/y/z', '/a/**/z', { partial: true }) // false, because x !== a +``` + +### windowsPathsNoEscape + +Use `\\` as a path separator _only_, and _never_ as an escape +character. If set, all `\\` characters are replaced with `/` in +the pattern. Note that this makes it **impossible** to match +against paths containing literal glob pattern characters, but +allows matching with patterns constructed using `path.join()` and +`path.resolve()` on Windows platforms, mimicking the (buggy!) +behavior of earlier versions on Windows. Please use with +caution, and be mindful of [the caveat about Windows +paths](#windows). + +For legacy reasons, this is also set if +`options.allowWindowsEscape` is set to the exact value `false`. + +### windowsNoMagicRoot + +When a pattern starts with a UNC path or drive letter, and in +`nocase:true` mode, do not convert the root portions of the +pattern into a case-insensitive regular expression, and instead +leave them as strings. + +This is the default when the platform is `win32` and +`nocase:true` is set. + +### preserveMultipleSlashes + +By default, multiple `/` characters (other than the leading `//` +in a UNC path, see "UNC Paths" above) are treated as a single +`/`. + +That is, a pattern like `a///b` will match the file path `a/b`. + +Set `preserveMultipleSlashes: true` to suppress this behavior. + +### optimizationLevel + +A number indicating the level of optimization that should be done +to the pattern prior to parsing and using it for matches. + +Globstar parts `**` are always converted to `*` when `noglobstar` +is set, and multiple adjacent `**` parts are converted into a +single `**` (ie, `a/**/**/b` will be treated as `a/**/b`, as this +is equivalent in all cases). + +- `0` - Make no further changes. In this mode, `.` and `..` are + maintained in the pattern, meaning that they must also appear + in the same position in the test path string. Eg, a pattern + like `a/*/../c` will match the string `a/b/../c` but not the + string `a/c`. +- `1` - (default) Remove cases where a double-dot `..` follows a + pattern portion that is not `**`, `.`, `..`, or empty `''`. For + example, the pattern `./a/b/../*` is converted to `./a/*`, and + so it will match the path string `./a/c`, but not the path + string `./a/b/../c`. Dots and empty path portions in the + pattern are preserved. +- `2` (or higher) - Much more aggressive optimizations, suitable + for use with file-walking cases: + - Remove cases where a double-dot `..` follows a pattern + portion that is not `**`, `.`, or empty `''`. Remove empty + and `.` portions of the pattern, where safe to do so (ie, + anywhere other than the last position, the first position, or + the second position in a pattern starting with `/`, as this + may indicate a UNC path on Windows). + - Convert patterns containing `
      /**/../

      /` into the + equivalent `

      /{..,**}/

      /`, where `

      ` is a + a pattern portion other than `.`, `..`, `**`, or empty + `''`. + - Dedupe patterns where a `**` portion is present in one and + omitted in another, and it is not the final path portion, and + they are otherwise equivalent. So `{a/**/b,a/b}` becomes + `a/**/b`, because `**` matches against an empty path portion. + - Dedupe patterns where a `*` portion is present in one, and a + non-dot pattern other than `**`, `.`, `..`, or `''` is in the + same position in the other. So `a/{*,x}/b` becomes `a/*/b`, + because `*` can match against `x`. + + While these optimizations improve the performance of + file-walking use cases such as [glob](http://npm.im/glob) (ie, + the reason this module exists), there are cases where it will + fail to match a literal string that would have been matched in + optimization level 1 or 0. + + Specifically, while the `Minimatch.match()` method will + optimize the file path string in the same ways, resulting in + the same matches, it will fail when tested with the regular + expression provided by `Minimatch.makeRe()`, unless the path + string is first processed with + `minimatch.levelTwoFileOptimize()` or similar. + +### platform + +When set to `win32`, this will trigger all windows-specific +behaviors (special handling for UNC paths, and treating `\` as +separators in file paths for comparison.) + +Defaults to the value of `process.platform`. + +### maxGlobstarRecursion + +Max number of non-adjacent `**` patterns to recursively walk +down. + +The default of `200` is almost certainly high enough for most +purposes, and can handle absurdly excessive patterns. + +If the limit is exceeded (which would require very excessively +long patterns and paths containing lots of `**` patterns!), then +it is treated as non-matching, even if the path would normally +match the pattern provided. + +That is, this is an intentional false negative, deemed an +acceptable break in correctness for security and performance. + +### maxExtglobRecursion + +Max depth to traverse for nested extglobs like `*(a|b|c)` + +Default is 2, which is quite low, but any higher value swiftly +results in punishing performance impacts. Note that this is _not_ +relevant when the globstar types can be safely coalesced into a +single set. + +For example, `*(a|@(b|c)|d)` would be flattened into +`*(a|b|c|d)`. Thus, many common extglobs will retain good +performance and never hit this limit, even if they are +excessively deep and complicated. + +If the limit is hit, then the extglob characters are simply not +parsed, and the pattern effectively switches into `noextglob: +true` mode for the contents of that nested sub-pattern. This will +typically _not_ result in a match, but is considered a valid +trade-off for security and performance. + +## Comparisons to other fnmatch/glob implementations + +While strict compliance with the existing standards is a +worthwhile goal, some discrepancies exist between minimatch and +other implementations. Some are intentional, and some are +unavoidable. + +If the pattern starts with a `!` character, then it is negated. Set the +`nonegate` flag to suppress this behavior, and treat leading `!` +characters normally. This is perhaps relevant if you wish to start the +pattern with a negative extglob pattern like `!(a|B)`. Multiple `!` +characters at the start of a pattern will negate the pattern multiple +times. + +If a pattern starts with `#`, then it is treated as a comment, and +will not match anything. Use `\#` to match a literal `#` at the +start of a line, or set the `nocomment` flag to suppress this behavior. + +The double-star character `**` is supported by default, unless the +`noglobstar` flag is set. This is supported in the manner of bsdglob +and bash 4.1, where `**` only has special significance if it is the only +thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but +`a/**b` will not. + +If an escaped pattern has no matches, and the `nonull` flag is set, +then minimatch.match returns the pattern as-provided, rather than +interpreting the character escapes. For example, +`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than +`"*a?"`. This is akin to setting the `nullglob` option in bash, except +that it does not resolve escaped pattern characters. + +If brace expansion is not disabled, then it is performed before any +other interpretation of the glob pattern. Thus, a pattern like +`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded +**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are +checked for validity. Since those two are valid, matching proceeds. + +Negated extglob patterns are handled as closely as possible to +Bash semantics, but there are some cases with negative extglobs +which are exceedingly difficult to express in a JavaScript +regular expression. In particular the negated pattern +`!(*|)*` will in bash match anything that does +not start with ``. However, +`!(*)*` _will_ match paths starting with +``, because the empty string can match against +the negated portion. In this library, `!(*|)*` +will _not_ match any pattern starting with ``, due to a +difference in precisely which patterns are considered "greedy" in +Regular Expressions vs bash path expansion. This may be fixable, +but not without incurring some complexity and performance costs, +and the trade-off seems to not be worth pursuing. + +Note that `fnmatch(3)` in libc is an extremely naive string comparison +matcher, which does not do anything special for slashes. This library is +designed to be used in glob searching and file walkers, and so it does do +special things with `/`. Thus, `foo*` will not match `foo/bar` in this +library, even though it would in `fnmatch(3)`. diff --git a/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts b/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts new file mode 100644 index 00000000..34d7a78a --- /dev/null +++ b/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts @@ -0,0 +1,2 @@ +export declare const assertValidPattern: (pattern: unknown) => void; +//# sourceMappingURL=assert-valid-pattern.d.ts.map \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map b/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map new file mode 100644 index 00000000..30ddcd51 --- /dev/null +++ b/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"assert-valid-pattern.d.ts","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,kBAAkB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAUtD,CAAA"} \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js b/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js new file mode 100644 index 00000000..5fc86bbd --- /dev/null +++ b/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js @@ -0,0 +1,14 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.assertValidPattern = void 0; +const MAX_PATTERN_LENGTH = 1024 * 64; +const assertValidPattern = (pattern) => { + if (typeof pattern !== 'string') { + throw new TypeError('invalid pattern'); + } + if (pattern.length > MAX_PATTERN_LENGTH) { + throw new TypeError('pattern is too long'); + } +}; +exports.assertValidPattern = assertValidPattern; +//# sourceMappingURL=assert-valid-pattern.js.map \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js.map b/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js.map new file mode 100644 index 00000000..9fc27a93 --- /dev/null +++ b/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js.map @@ -0,0 +1 @@ +{"version":3,"file":"assert-valid-pattern.js","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":";;;AAAA,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAE,CAAA;AAC7B,MAAM,kBAAkB,GAA+B,CAC5D,OAAgB,EACW,EAAE;IAC7B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAA;IACxC,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACxC,MAAM,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAA;IAC5C,CAAC;AACH,CAAC,CAAA;AAVY,QAAA,kBAAkB,sBAU9B","sourcesContent":["const MAX_PATTERN_LENGTH = 1024 * 64\nexport const assertValidPattern: (pattern: unknown) => void = (\n pattern: unknown,\n): asserts pattern is string => {\n if (typeof pattern !== 'string') {\n throw new TypeError('invalid pattern')\n }\n\n if (pattern.length > MAX_PATTERN_LENGTH) {\n throw new TypeError('pattern is too long')\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/ast.d.ts b/node_modules/minimatch/dist/commonjs/ast.d.ts new file mode 100644 index 00000000..74f2cf93 --- /dev/null +++ b/node_modules/minimatch/dist/commonjs/ast.d.ts @@ -0,0 +1,22 @@ +import type { MinimatchOptions, MMRegExp } from './index.js'; +export type ExtglobType = '!' | '?' | '+' | '*' | '@'; +export declare class AST { + #private; + type: ExtglobType | null; + id: number; + get depth(): number; + constructor(type: ExtglobType | null, parent?: AST, options?: MinimatchOptions); + get hasMagic(): boolean | undefined; + toString(): string; + push(...parts: (string | AST)[]): void; + toJSON(): unknown[]; + isStart(): boolean; + isEnd(): boolean; + copyIn(part: AST | string): void; + clone(parent: AST): AST; + static fromGlob(pattern: string, options?: MinimatchOptions): AST; + toMMPattern(): MMRegExp | string; + get options(): MinimatchOptions; + toRegExpSource(allowDot?: boolean): [re: string, body: string, hasMagic: boolean, uflag: boolean]; +} +//# sourceMappingURL=ast.d.ts.map \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/ast.d.ts.map b/node_modules/minimatch/dist/commonjs/ast.d.ts.map new file mode 100644 index 00000000..8965fd6a --- /dev/null +++ b/node_modules/minimatch/dist/commonjs/ast.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAwC5D,MAAM,MAAM,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AAgJrD,qBAAa,GAAG;;IACd,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;IAexB,EAAE,SAAO;IAET,IAAI,KAAK,IAAI,MAAM,CAElB;gBAgBC,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,MAAM,CAAC,EAAE,GAAG,EACZ,OAAO,GAAE,gBAAqB;IAahC,IAAI,QAAQ,IAAI,OAAO,GAAG,SAAS,CAUlC;IAGD,QAAQ,IAAI,MAAM;IAkDlB,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE;IAe/B,MAAM;IAkBN,OAAO,IAAI,OAAO;IAgBlB,KAAK,IAAI,OAAO;IAYhB,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM;IAKzB,KAAK,CAAC,MAAM,EAAE,GAAG;IAsQjB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;IAQ/D,WAAW,IAAI,QAAQ,GAAG,MAAM;IA2BhC,IAAI,OAAO,qBAEV;IAuED,cAAc,CACZ,QAAQ,CAAC,EAAE,OAAO,GACjB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC;CA6OjE"} \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/ast.js b/node_modules/minimatch/dist/commonjs/ast.js new file mode 100644 index 00000000..33df3769 --- /dev/null +++ b/node_modules/minimatch/dist/commonjs/ast.js @@ -0,0 +1,845 @@ +"use strict"; +// parse a single path portion +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AST = void 0; +const brace_expressions_js_1 = require("./brace-expressions.js"); +const unescape_js_1 = require("./unescape.js"); +const types = new Set(['!', '?', '+', '*', '@']); +const isExtglobType = (c) => types.has(c); +const isExtglobAST = (c) => isExtglobType(c.type); +// Map of which extglob types can adopt the children of a nested extglob +// +// anything but ! can adopt a matching type: +// +(a|+(b|c)|d) => +(a|b|c|d) +// *(a|*(b|c)|d) => *(a|b|c|d) +// @(a|@(b|c)|d) => @(a|b|c|d) +// ?(a|?(b|c)|d) => ?(a|b|c|d) +// +// * can adopt anything, because 0 or repetition is allowed +// *(a|?(b|c)|d) => *(a|b|c|d) +// *(a|+(b|c)|d) => *(a|b|c|d) +// *(a|@(b|c)|d) => *(a|b|c|d) +// +// + can adopt @, because 1 or repetition is allowed +// +(a|@(b|c)|d) => +(a|b|c|d) +// +// + and @ CANNOT adopt *, because 0 would be allowed +// +(a|*(b|c)|d) => would match "", on *(b|c) +// @(a|*(b|c)|d) => would match "", on *(b|c) +// +// + and @ CANNOT adopt ?, because 0 would be allowed +// +(a|?(b|c)|d) => would match "", on ?(b|c) +// @(a|?(b|c)|d) => would match "", on ?(b|c) +// +// ? can adopt @, because 0 or 1 is allowed +// ?(a|@(b|c)|d) => ?(a|b|c|d) +// +// ? and @ CANNOT adopt * or +, because >1 would be allowed +// ?(a|*(b|c)|d) => would match bbb on *(b|c) +// @(a|*(b|c)|d) => would match bbb on *(b|c) +// ?(a|+(b|c)|d) => would match bbb on +(b|c) +// @(a|+(b|c)|d) => would match bbb on +(b|c) +// +// ! CANNOT adopt ! (nothing else can either) +// !(a|!(b|c)|d) => !(a|b|c|d) would fail to match on b (not not b|c) +// +// ! can adopt @ +// !(a|@(b|c)|d) => !(a|b|c|d) +// +// ! CANNOT adopt * +// !(a|*(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed +// +// ! CANNOT adopt + +// !(a|+(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed +// +// ! CANNOT adopt ? +// x!(a|?(b|c)|d) => x!(a|b|c|d) would fail to match "x" +const adoptionMap = new Map([ + ['!', ['@']], + ['?', ['?', '@']], + ['@', ['@']], + ['*', ['*', '+', '?', '@']], + ['+', ['+', '@']], +]); +// nested extglobs that can be adopted in, but with the addition of +// a blank '' element. +const adoptionWithSpaceMap = new Map([ + ['!', ['?']], + ['@', ['?']], + ['+', ['?', '*']], +]); +// union of the previous two maps +const adoptionAnyMap = new Map([ + ['!', ['?', '@']], + ['?', ['?', '@']], + ['@', ['?', '@']], + ['*', ['*', '+', '?', '@']], + ['+', ['+', '@', '?', '*']], +]); +// Extglobs that can take over their parent if they are the only child +// the key is parent, value maps child to resulting extglob parent type +// '@' is omitted because it's a special case. An `@` extglob with a single +// member can always be usurped by that subpattern. +const usurpMap = new Map([ + ['!', new Map([['!', '@']])], + [ + '?', + new Map([ + ['*', '*'], + ['+', '*'], + ]), + ], + [ + '@', + new Map([ + ['!', '!'], + ['?', '?'], + ['@', '@'], + ['*', '*'], + ['+', '+'], + ]), + ], + [ + '+', + new Map([ + ['?', '*'], + ['*', '*'], + ]), + ], +]); +// Patterns that get prepended to bind to the start of either the +// entire string, or just a single path portion, to prevent dots +// and/or traversal patterns, when needed. +// Exts don't need the ^ or / bit, because the root binds that already. +const startNoTraversal = '(?!(?:^|/)\\.\\.?(?:$|/))'; +const startNoDot = '(?!\\.)'; +// characters that indicate a start of pattern needs the "no dots" bit, +// because a dot *might* be matched. ( is not in the list, because in +// the case of a child extglob, it will handle the prevention itself. +const addPatternStart = new Set(['[', '.']); +// cases where traversal is A-OK, no dot prevention needed +const justDots = new Set(['..', '.']); +const reSpecials = new Set('().*{}+?[]^$\\!'); +const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); +// any single thing other than / +const qmark = '[^/]'; +// * => any number of characters +const star = qmark + '*?'; +// use + when we need to ensure that *something* matches, because the * is +// the only thing in the path portion. +const starNoEmpty = qmark + '+?'; +// remove the \ chars that we added if we end up doing a nonmagic compare +// const deslash = (s: string) => s.replace(/\\(.)/g, '$1') +let ID = 0; +class AST { + type; + #root; + #hasMagic; + #uflag = false; + #parts = []; + #parent; + #parentIndex; + #negs; + #filledNegs = false; + #options; + #toString; + // set to true if it's an extglob with no children + // (which really means one child of '') + #emptyExt = false; + id = ++ID; + get depth() { + return (this.#parent?.depth ?? -1) + 1; + } + [Symbol.for('nodejs.util.inspect.custom')]() { + return { + '@@type': 'AST', + id: this.id, + type: this.type, + root: this.#root.id, + parent: this.#parent?.id, + depth: this.depth, + partsLength: this.#parts.length, + parts: this.#parts, + }; + } + constructor(type, parent, options = {}) { + this.type = type; + // extglobs are inherently magical + if (type) + this.#hasMagic = true; + this.#parent = parent; + this.#root = this.#parent ? this.#parent.#root : this; + this.#options = this.#root === this ? options : this.#root.#options; + this.#negs = this.#root === this ? [] : this.#root.#negs; + if (type === '!' && !this.#root.#filledNegs) + this.#negs.push(this); + this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0; + } + get hasMagic() { + /* c8 ignore start */ + if (this.#hasMagic !== undefined) + return this.#hasMagic; + /* c8 ignore stop */ + for (const p of this.#parts) { + if (typeof p === 'string') + continue; + if (p.type || p.hasMagic) + return (this.#hasMagic = true); + } + // note: will be undefined until we generate the regexp src and find out + return this.#hasMagic; + } + // reconstructs the pattern + toString() { + return (this.#toString !== undefined ? this.#toString + : !this.type ? + (this.#toString = this.#parts.map(p => String(p)).join('')) + : (this.#toString = + this.type + + '(' + + this.#parts.map(p => String(p)).join('|') + + ')')); + } + #fillNegs() { + /* c8 ignore start */ + if (this !== this.#root) + throw new Error('should only call on root'); + if (this.#filledNegs) + return this; + /* c8 ignore stop */ + // call toString() once to fill this out + this.toString(); + this.#filledNegs = true; + let n; + while ((n = this.#negs.pop())) { + if (n.type !== '!') + continue; + // walk up the tree, appending everthing that comes AFTER parentIndex + let p = n; + let pp = p.#parent; + while (pp) { + for (let i = p.#parentIndex + 1; !pp.type && i < pp.#parts.length; i++) { + for (const part of n.#parts) { + /* c8 ignore start */ + if (typeof part === 'string') { + throw new Error('string part in extglob AST??'); + } + /* c8 ignore stop */ + part.copyIn(pp.#parts[i]); + } + } + p = pp; + pp = p.#parent; + } + } + return this; + } + push(...parts) { + for (const p of parts) { + if (p === '') + continue; + /* c8 ignore start */ + if (typeof p !== 'string' && + !(p instanceof _a && p.#parent === this)) { + throw new Error('invalid part: ' + p); + } + /* c8 ignore stop */ + this.#parts.push(p); + } + } + toJSON() { + const ret = this.type === null ? + this.#parts + .slice() + .map(p => (typeof p === 'string' ? p : p.toJSON())) + : [this.type, ...this.#parts.map(p => p.toJSON())]; + if (this.isStart() && !this.type) + ret.unshift([]); + if (this.isEnd() && + (this === this.#root || + (this.#root.#filledNegs && this.#parent?.type === '!'))) { + ret.push({}); + } + return ret; + } + isStart() { + if (this.#root === this) + return true; + // if (this.type) return !!this.#parent?.isStart() + if (!this.#parent?.isStart()) + return false; + if (this.#parentIndex === 0) + return true; + // if everything AHEAD of this is a negation, then it's still the "start" + const p = this.#parent; + for (let i = 0; i < this.#parentIndex; i++) { + const pp = p.#parts[i]; + if (!(pp instanceof _a && pp.type === '!')) { + return false; + } + } + return true; + } + isEnd() { + if (this.#root === this) + return true; + if (this.#parent?.type === '!') + return true; + if (!this.#parent?.isEnd()) + return false; + if (!this.type) + return this.#parent?.isEnd(); + // if not root, it'll always have a parent + /* c8 ignore start */ + const pl = this.#parent ? this.#parent.#parts.length : 0; + /* c8 ignore stop */ + return this.#parentIndex === pl - 1; + } + copyIn(part) { + if (typeof part === 'string') + this.push(part); + else + this.push(part.clone(this)); + } + clone(parent) { + const c = new _a(this.type, parent); + for (const p of this.#parts) { + c.copyIn(p); + } + return c; + } + static #parseAST(str, ast, pos, opt, extDepth) { + const maxDepth = opt.maxExtglobRecursion ?? 2; + let escaping = false; + let inBrace = false; + let braceStart = -1; + let braceNeg = false; + if (ast.type === null) { + // outside of a extglob, append until we find a start + let i = pos; + let acc = ''; + while (i < str.length) { + const c = str.charAt(i++); + // still accumulate escapes at this point, but we do ignore + // starts that are escaped + if (escaping || c === '\\') { + escaping = !escaping; + acc += c; + continue; + } + if (inBrace) { + if (i === braceStart + 1) { + if (c === '^' || c === '!') { + braceNeg = true; + } + } + else if (c === ']' && !(i === braceStart + 2 && braceNeg)) { + inBrace = false; + } + acc += c; + continue; + } + else if (c === '[') { + inBrace = true; + braceStart = i; + braceNeg = false; + acc += c; + continue; + } + // we don't have to check for adoption here, because that's + // done at the other recursion point. + const doRecurse = !opt.noext && + isExtglobType(c) && + str.charAt(i) === '(' && + extDepth <= maxDepth; + if (doRecurse) { + ast.push(acc); + acc = ''; + const ext = new _a(c, ast); + i = _a.#parseAST(str, ext, i, opt, extDepth + 1); + ast.push(ext); + continue; + } + acc += c; + } + ast.push(acc); + return i; + } + // some kind of extglob, pos is at the ( + // find the next | or ) + let i = pos + 1; + let part = new _a(null, ast); + const parts = []; + let acc = ''; + while (i < str.length) { + const c = str.charAt(i++); + // still accumulate escapes at this point, but we do ignore + // starts that are escaped + if (escaping || c === '\\') { + escaping = !escaping; + acc += c; + continue; + } + if (inBrace) { + if (i === braceStart + 1) { + if (c === '^' || c === '!') { + braceNeg = true; + } + } + else if (c === ']' && !(i === braceStart + 2 && braceNeg)) { + inBrace = false; + } + acc += c; + continue; + } + else if (c === '[') { + inBrace = true; + braceStart = i; + braceNeg = false; + acc += c; + continue; + } + const doRecurse = !opt.noext && + isExtglobType(c) && + str.charAt(i) === '(' && + /* c8 ignore start - the maxDepth is sufficient here */ + (extDepth <= maxDepth || (ast && ast.#canAdoptType(c))); + /* c8 ignore stop */ + if (doRecurse) { + const depthAdd = ast && ast.#canAdoptType(c) ? 0 : 1; + part.push(acc); + acc = ''; + const ext = new _a(c, part); + part.push(ext); + i = _a.#parseAST(str, ext, i, opt, extDepth + depthAdd); + continue; + } + if (c === '|') { + part.push(acc); + acc = ''; + parts.push(part); + part = new _a(null, ast); + continue; + } + if (c === ')') { + if (acc === '' && ast.#parts.length === 0) { + ast.#emptyExt = true; + } + part.push(acc); + acc = ''; + ast.push(...parts, part); + return i; + } + acc += c; + } + // unfinished extglob + // if we got here, it was a malformed extglob! not an extglob, but + // maybe something else in there. + ast.type = null; + ast.#hasMagic = undefined; + ast.#parts = [str.substring(pos - 1)]; + return i; + } + #canAdoptWithSpace(child) { + return this.#canAdopt(child, adoptionWithSpaceMap); + } + #canAdopt(child, map = adoptionMap) { + if (!child || + typeof child !== 'object' || + child.type !== null || + child.#parts.length !== 1 || + this.type === null) { + return false; + } + const gc = child.#parts[0]; + if (!gc || typeof gc !== 'object' || gc.type === null) { + return false; + } + return this.#canAdoptType(gc.type, map); + } + #canAdoptType(c, map = adoptionAnyMap) { + return !!map.get(this.type)?.includes(c); + } + #adoptWithSpace(child, index) { + const gc = child.#parts[0]; + const blank = new _a(null, gc, this.options); + blank.#parts.push(''); + gc.push(blank); + this.#adopt(child, index); + } + #adopt(child, index) { + const gc = child.#parts[0]; + this.#parts.splice(index, 1, ...gc.#parts); + for (const p of gc.#parts) { + if (typeof p === 'object') + p.#parent = this; + } + this.#toString = undefined; + } + #canUsurpType(c) { + const m = usurpMap.get(this.type); + return !!m?.has(c); + } + #canUsurp(child) { + if (!child || + typeof child !== 'object' || + child.type !== null || + child.#parts.length !== 1 || + this.type === null || + this.#parts.length !== 1) { + return false; + } + const gc = child.#parts[0]; + if (!gc || typeof gc !== 'object' || gc.type === null) { + return false; + } + return this.#canUsurpType(gc.type); + } + #usurp(child) { + const m = usurpMap.get(this.type); + const gc = child.#parts[0]; + const nt = m?.get(gc.type); + /* c8 ignore start - impossible */ + if (!nt) + return false; + /* c8 ignore stop */ + this.#parts = gc.#parts; + for (const p of this.#parts) { + if (typeof p === 'object') { + p.#parent = this; + } + } + this.type = nt; + this.#toString = undefined; + this.#emptyExt = false; + } + static fromGlob(pattern, options = {}) { + const ast = new _a(null, undefined, options); + _a.#parseAST(pattern, ast, 0, options, 0); + return ast; + } + // returns the regular expression if there's magic, or the unescaped + // string if not. + toMMPattern() { + // should only be called on root + /* c8 ignore start */ + if (this !== this.#root) + return this.#root.toMMPattern(); + /* c8 ignore stop */ + const glob = this.toString(); + const [re, body, hasMagic, uflag] = this.toRegExpSource(); + // if we're in nocase mode, and not nocaseMagicOnly, then we do + // still need a regular expression if we have to case-insensitively + // match capital/lowercase characters. + const anyMagic = hasMagic || + this.#hasMagic || + (this.#options.nocase && + !this.#options.nocaseMagicOnly && + glob.toUpperCase() !== glob.toLowerCase()); + if (!anyMagic) { + return body; + } + const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : ''); + return Object.assign(new RegExp(`^${re}$`, flags), { + _src: re, + _glob: glob, + }); + } + get options() { + return this.#options; + } + // returns the string match, the regexp source, whether there's magic + // in the regexp (so a regular expression is required) and whether or + // not the uflag is needed for the regular expression (for posix classes) + // TODO: instead of injecting the start/end at this point, just return + // the BODY of the regexp, along with the start/end portions suitable + // for binding the start/end in either a joined full-path makeRe context + // (where we bind to (^|/), or a standalone matchPart context (where + // we bind to ^, and not /). Otherwise slashes get duped! + // + // In part-matching mode, the start is: + // - if not isStart: nothing + // - if traversal possible, but not allowed: ^(?!\.\.?$) + // - if dots allowed or not possible: ^ + // - if dots possible and not allowed: ^(?!\.) + // end is: + // - if not isEnd(): nothing + // - else: $ + // + // In full-path matching mode, we put the slash at the START of the + // pattern, so start is: + // - if first pattern: same as part-matching mode + // - if not isStart(): nothing + // - if traversal possible, but not allowed: /(?!\.\.?(?:$|/)) + // - if dots allowed or not possible: / + // - if dots possible and not allowed: /(?!\.) + // end is: + // - if last pattern, same as part-matching mode + // - else nothing + // + // Always put the (?:$|/) on negated tails, though, because that has to be + // there to bind the end of the negated pattern portion, and it's easier to + // just stick it in now rather than try to inject it later in the middle of + // the pattern. + // + // We can just always return the same end, and leave it up to the caller + // to know whether it's going to be used joined or in parts. + // And, if the start is adjusted slightly, can do the same there: + // - if not isStart: nothing + // - if traversal possible, but not allowed: (?:/|^)(?!\.\.?$) + // - if dots allowed or not possible: (?:/|^) + // - if dots possible and not allowed: (?:/|^)(?!\.) + // + // But it's better to have a simpler binding without a conditional, for + // performance, so probably better to return both start options. + // + // Then the caller just ignores the end if it's not the first pattern, + // and the start always gets applied. + // + // But that's always going to be $ if it's the ending pattern, or nothing, + // so the caller can just attach $ at the end of the pattern when building. + // + // So the todo is: + // - better detect what kind of start is needed + // - return both flavors of starting pattern + // - attach $ at the end of the pattern when creating the actual RegExp + // + // Ah, but wait, no, that all only applies to the root when the first pattern + // is not an extglob. If the first pattern IS an extglob, then we need all + // that dot prevention biz to live in the extglob portions, because eg + // +(*|.x*) can match .xy but not .yx. + // + // So, return the two flavors if it's #root and the first child is not an + // AST, otherwise leave it to the child AST to handle it, and there, + // use the (?:^|/) style of start binding. + // + // Even simplified further: + // - Since the start for a join is eg /(?!\.) and the start for a part + // is ^(?!\.), we can just prepend (?!\.) to the pattern (either root + // or start or whatever) and prepend ^ or / at the Regexp construction. + toRegExpSource(allowDot) { + const dot = allowDot ?? !!this.#options.dot; + if (this.#root === this) { + this.#flatten(); + this.#fillNegs(); + } + if (!isExtglobAST(this)) { + const noEmpty = this.isStart() && + this.isEnd() && + !this.#parts.some(s => typeof s !== 'string'); + const src = this.#parts + .map(p => { + const [re, _, hasMagic, uflag] = typeof p === 'string' ? + _a.#parseGlob(p, this.#hasMagic, noEmpty) + : p.toRegExpSource(allowDot); + this.#hasMagic = this.#hasMagic || hasMagic; + this.#uflag = this.#uflag || uflag; + return re; + }) + .join(''); + let start = ''; + if (this.isStart()) { + if (typeof this.#parts[0] === 'string') { + // this is the string that will match the start of the pattern, + // so we need to protect against dots and such. + // '.' and '..' cannot match unless the pattern is that exactly, + // even if it starts with . or dot:true is set. + const dotTravAllowed = this.#parts.length === 1 && justDots.has(this.#parts[0]); + if (!dotTravAllowed) { + const aps = addPatternStart; + // check if we have a possibility of matching . or .., + // and prevent that. + const needNoTrav = + // dots are allowed, and the pattern starts with [ or . + (dot && aps.has(src.charAt(0))) || + // the pattern starts with \., and then [ or . + (src.startsWith('\\.') && aps.has(src.charAt(2))) || + // the pattern starts with \.\., and then [ or . + (src.startsWith('\\.\\.') && aps.has(src.charAt(4))); + // no need to prevent dots if it can't match a dot, or if a + // sub-pattern will be preventing it anyway. + const needNoDot = !dot && !allowDot && aps.has(src.charAt(0)); + start = + needNoTrav ? startNoTraversal + : needNoDot ? startNoDot + : ''; + } + } + } + // append the "end of path portion" pattern to negation tails + let end = ''; + if (this.isEnd() && + this.#root.#filledNegs && + this.#parent?.type === '!') { + end = '(?:$|\\/)'; + } + const final = start + src + end; + return [ + final, + (0, unescape_js_1.unescape)(src), + (this.#hasMagic = !!this.#hasMagic), + this.#uflag, + ]; + } + // We need to calculate the body *twice* if it's a repeat pattern + // at the start, once in nodot mode, then again in dot mode, so a + // pattern like *(?) can match 'x.y' + const repeated = this.type === '*' || this.type === '+'; + // some kind of extglob + const start = this.type === '!' ? '(?:(?!(?:' : '(?:'; + let body = this.#partsToRegExp(dot); + if (this.isStart() && this.isEnd() && !body && this.type !== '!') { + // invalid extglob, has to at least be *something* present, if it's + // the entire path portion. + const s = this.toString(); + const me = this; + me.#parts = [s]; + me.type = null; + me.#hasMagic = undefined; + return [s, (0, unescape_js_1.unescape)(this.toString()), false, false]; + } + let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot ? + '' + : this.#partsToRegExp(true); + if (bodyDotAllowed === body) { + bodyDotAllowed = ''; + } + if (bodyDotAllowed) { + body = `(?:${body})(?:${bodyDotAllowed})*?`; + } + // an empty !() is exactly equivalent to a starNoEmpty + let final = ''; + if (this.type === '!' && this.#emptyExt) { + final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty; + } + else { + const close = this.type === '!' ? + // !() must match something,but !(x) can match '' + '))' + + (this.isStart() && !dot && !allowDot ? startNoDot : '') + + star + + ')' + : this.type === '@' ? ')' + : this.type === '?' ? ')?' + : this.type === '+' && bodyDotAllowed ? ')' + : this.type === '*' && bodyDotAllowed ? `)?` + : `)${this.type}`; + final = start + body + close; + } + return [ + final, + (0, unescape_js_1.unescape)(body), + (this.#hasMagic = !!this.#hasMagic), + this.#uflag, + ]; + } + #flatten() { + if (!isExtglobAST(this)) { + for (const p of this.#parts) { + if (typeof p === 'object') { + p.#flatten(); + } + } + } + else { + // do up to 10 passes to flatten as much as possible + let iterations = 0; + let done = false; + do { + done = true; + for (let i = 0; i < this.#parts.length; i++) { + const c = this.#parts[i]; + if (typeof c === 'object') { + c.#flatten(); + if (this.#canAdopt(c)) { + done = false; + this.#adopt(c, i); + } + else if (this.#canAdoptWithSpace(c)) { + done = false; + this.#adoptWithSpace(c, i); + } + else if (this.#canUsurp(c)) { + done = false; + this.#usurp(c); + } + } + } + } while (!done && ++iterations < 10); + } + this.#toString = undefined; + } + #partsToRegExp(dot) { + return this.#parts + .map(p => { + // extglob ASTs should only contain parent ASTs + /* c8 ignore start */ + if (typeof p === 'string') { + throw new Error('string type in extglob ast??'); + } + /* c8 ignore stop */ + // can ignore hasMagic, because extglobs are already always magic + const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot); + this.#uflag = this.#uflag || uflag; + return re; + }) + .filter(p => !(this.isStart() && this.isEnd()) || !!p) + .join('|'); + } + static #parseGlob(glob, hasMagic, noEmpty = false) { + let escaping = false; + let re = ''; + let uflag = false; + // multiple stars that aren't globstars coalesce into one * + let inStar = false; + for (let i = 0; i < glob.length; i++) { + const c = glob.charAt(i); + if (escaping) { + escaping = false; + re += (reSpecials.has(c) ? '\\' : '') + c; + continue; + } + if (c === '*') { + if (inStar) + continue; + inStar = true; + re += noEmpty && /^[*]+$/.test(glob) ? starNoEmpty : star; + hasMagic = true; + continue; + } + else { + inStar = false; + } + if (c === '\\') { + if (i === glob.length - 1) { + re += '\\\\'; + } + else { + escaping = true; + } + continue; + } + if (c === '[') { + const [src, needUflag, consumed, magic] = (0, brace_expressions_js_1.parseClass)(glob, i); + if (consumed) { + re += src; + uflag = uflag || needUflag; + i += consumed - 1; + hasMagic = hasMagic || magic; + continue; + } + } + if (c === '?') { + re += qmark; + hasMagic = true; + continue; + } + re += regExpEscape(c); + } + return [re, (0, unescape_js_1.unescape)(glob), !!hasMagic, uflag]; + } +} +exports.AST = AST; +_a = AST; +//# sourceMappingURL=ast.js.map \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/ast.js.map b/node_modules/minimatch/dist/commonjs/ast.js.map new file mode 100644 index 00000000..3498fb26 --- /dev/null +++ b/node_modules/minimatch/dist/commonjs/ast.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":";AAAA,8BAA8B;;;;AAE9B,iEAAmD;AAEnD,+CAAwC;AAwCxC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;AAC7D,MAAM,aAAa,GAAG,CAAC,CAAgB,EAAoB,EAAE,CAC3D,KAAK,CAAC,GAAG,CAAC,CAAgB,CAAC,CAAA;AAC7B,MAAM,YAAY,GAAG,CAAC,CAAM,EAAoC,EAAE,CAChE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;AAEvB,wEAAwE;AACxE,EAAE;AACF,4CAA4C;AAC5C,8BAA8B;AAC9B,8BAA8B;AAC9B,8BAA8B;AAC9B,8BAA8B;AAC9B,EAAE;AACF,2DAA2D;AAC3D,8BAA8B;AAC9B,8BAA8B;AAC9B,8BAA8B;AAC9B,EAAE;AACF,oDAAoD;AACpD,8BAA8B;AAC9B,EAAE;AACF,qDAAqD;AACrD,6CAA6C;AAC7C,6CAA6C;AAC7C,EAAE;AACF,qDAAqD;AACrD,6CAA6C;AAC7C,6CAA6C;AAC7C,EAAE;AACF,2CAA2C;AAC3C,8BAA8B;AAC9B,EAAE;AACF,2DAA2D;AAC3D,6CAA6C;AAC7C,6CAA6C;AAC7C,6CAA6C;AAC7C,6CAA6C;AAC7C,EAAE;AACF,6CAA6C;AAC7C,qEAAqE;AACrE,EAAE;AACF,gBAAgB;AAChB,8BAA8B;AAC9B,EAAE;AACF,mBAAmB;AACnB,8DAA8D;AAC9D,EAAE;AACF,mBAAmB;AACnB,8DAA8D;AAC9D,EAAE;AACF,mBAAmB;AACnB,wDAAwD;AACxD,MAAM,WAAW,GAAG,IAAI,GAAG,CAA6B;IACtD,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IACZ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACjB,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IACZ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAC3B,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;CAClB,CAAC,CAAA;AAEF,mEAAmE;AACnE,sBAAsB;AACtB,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAA6B;IAC/D,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IACZ,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IACZ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;CAClB,CAAC,CAAA;AAEF,iCAAiC;AACjC,MAAM,cAAc,GAAG,IAAI,GAAG,CAA6B;IACzD,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACjB,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACjB,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACjB,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAC3B,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;CAC5B,CAAC,CAAA;AAEF,sEAAsE;AACtE,uEAAuE;AACvE,2EAA2E;AAC3E,mDAAmD;AACnD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAGtB;IACA,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5B;QACE,GAAG;QACH,IAAI,GAAG,CAAC;YACN,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;SACX,CAAC;KACH;IACD;QACE,GAAG;QACH,IAAI,GAAG,CAAC;YACN,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;SACX,CAAC;KACH;IACD;QACE,GAAG;QACH,IAAI,GAAG,CAAC;YACN,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;SACX,CAAC;KACH;CACF,CAAC,CAAA;AAEF,iEAAiE;AACjE,gEAAgE;AAChE,0CAA0C;AAC1C,uEAAuE;AACvE,MAAM,gBAAgB,GAAG,2BAA2B,CAAA;AACpD,MAAM,UAAU,GAAG,SAAS,CAAA;AAE5B,uEAAuE;AACvE,qEAAqE;AACrE,qEAAqE;AACrE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;AAC3C,0DAA0D;AAC1D,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;AACrC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,CAAA;AAC7C,MAAM,YAAY,GAAG,CAAC,CAAS,EAAE,EAAE,CACjC,CAAC,CAAC,OAAO,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAA;AAE/C,gCAAgC;AAChC,MAAM,KAAK,GAAG,MAAM,CAAA;AAEpB,gCAAgC;AAChC,MAAM,IAAI,GAAG,KAAK,GAAG,IAAI,CAAA;AACzB,0EAA0E;AAC1E,sCAAsC;AACtC,MAAM,WAAW,GAAG,KAAK,GAAG,IAAI,CAAA;AAEhC,yEAAyE;AACzE,2DAA2D;AAE3D,IAAI,EAAE,GAAG,CAAC,CAAA;AACV,MAAa,GAAG;IACd,IAAI,CAAoB;IACf,KAAK,CAAK;IAEnB,SAAS,CAAU;IACnB,MAAM,GAAY,KAAK,CAAA;IACvB,MAAM,GAAqB,EAAE,CAAA;IAC7B,OAAO,CAAM;IACb,YAAY,CAAQ;IACpB,KAAK,CAAO;IACZ,WAAW,GAAY,KAAK,CAAA;IAC5B,QAAQ,CAAkB;IAC1B,SAAS,CAAS;IAClB,kDAAkD;IAClD,uCAAuC;IACvC,SAAS,GAAY,KAAK,CAAA;IAC1B,EAAE,GAAG,EAAE,EAAE,CAAA;IAET,IAAI,KAAK;QACP,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IACxC,CAAC;IAED,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QACxC,OAAO;YACL,QAAQ,EAAE,KAAK;YACf,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE;YACnB,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE;YACxB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAC/B,KAAK,EAAE,IAAI,CAAC,MAAM;SACnB,CAAA;IACH,CAAC;IAED,YACE,IAAwB,EACxB,MAAY,EACZ,UAA4B,EAAE;QAE9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,kCAAkC;QAClC,IAAI,IAAI;YAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;QAC/B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;QACrB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;QACrD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAA;QACnE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAA;QACxD,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW;YAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IACnE,CAAC;IAED,IAAI,QAAQ;QACV,qBAAqB;QACrB,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,SAAS,CAAA;QACvD,oBAAoB;QACpB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,SAAQ;YACnC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,QAAQ;gBAAE,OAAO,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAA;QAC1D,CAAC;QACD,wEAAwE;QACxE,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IAED,2BAA2B;IAC3B,QAAQ;QACN,OAAO,CACL,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS;YAC7C,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACZ,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC7D,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS;oBACb,IAAI,CAAC,IAAI;wBACT,GAAG;wBACH,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;wBACzC,GAAG,CAAC,CACT,CAAA;IACH,CAAC;IAED,SAAS;QACP,qBAAqB;QACrB,IAAI,IAAI,KAAK,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;QACpE,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAA;QACjC,oBAAoB;QAEpB,wCAAwC;QACxC,IAAI,CAAC,QAAQ,EAAE,CAAA;QACf,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;QACvB,IAAI,CAAkB,CAAA;QACtB,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG;gBAAE,SAAQ;YAC5B,qEAAqE;YACrE,IAAI,CAAC,GAAoB,CAAC,CAAA;YAC1B,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAA;YAClB,OAAO,EAAE,EAAE,CAAC;gBACV,KACE,IAAI,CAAC,GAAG,CAAC,CAAC,YAAY,GAAG,CAAC,EAC1B,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,EAChC,CAAC,EAAE,EACH,CAAC;oBACD,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;wBAC5B,qBAAqB;wBACrB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;4BAC7B,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;wBACjD,CAAC;wBACD,oBAAoB;wBACpB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;oBAC3B,CAAC;gBACH,CAAC;gBACD,CAAC,GAAG,EAAE,CAAA;gBACN,EAAE,GAAG,CAAC,CAAC,OAAO,CAAA;YAChB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,CAAC,GAAG,KAAuB;QAC7B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,KAAK,EAAE;gBAAE,SAAQ;YACtB,qBAAqB;YACrB,IACE,OAAO,CAAC,KAAK,QAAQ;gBACrB,CAAC,CAAC,CAAC,YAAY,EAAG,IAAI,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,EACzC,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAA;YACvC,CAAC;YACD,oBAAoB;YACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACrB,CAAC;IACH,CAAC;IAED,MAAM;QACJ,MAAM,GAAG,GACP,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YAClB,IAAI,CAAC,MAAM;iBACR,KAAK,EAAE;iBACP,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YACvD,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,CAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;QAC7D,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACjD,IACE,IAAI,CAAC,KAAK,EAAE;YACZ,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK;gBAClB,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,GAAG,CAAC,CAAC,EACzD,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACd,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;YAAE,OAAO,IAAI,CAAA;QACpC,kDAAkD;QAClD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE;YAAE,OAAO,KAAK,CAAA;QAC1C,IAAI,IAAI,CAAC,YAAY,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QACxC,yEAAyE;QACzE,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAA;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;YACtB,IAAI,CAAC,CAAC,EAAE,YAAY,EAAG,IAAI,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBAC5C,OAAO,KAAK,CAAA;YACd,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;YAAE,OAAO,IAAI,CAAA;QACpC,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,GAAG;YAAE,OAAO,IAAI,CAAA;QAC3C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE;YAAE,OAAO,KAAK,CAAA;QACxC,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAA;QAC5C,0CAA0C;QAC1C,qBAAqB;QACrB,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QACxD,oBAAoB;QACpB,OAAO,IAAI,CAAC,YAAY,KAAK,EAAE,GAAG,CAAC,CAAA;IACrC,CAAC;IAED,MAAM,CAAC,IAAkB;QACvB,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;;YACxC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;IAClC,CAAC;IAED,KAAK,CAAC,MAAW;QACf,MAAM,CAAC,GAAG,IAAI,EAAG,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QACpC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACb,CAAC;QACD,OAAO,CAAC,CAAA;IACV,CAAC;IAED,MAAM,CAAC,SAAS,CACd,GAAW,EACX,GAAQ,EACR,GAAW,EACX,GAAqB,EACrB,QAAgB;QAEhB,MAAM,QAAQ,GAAG,GAAG,CAAC,mBAAmB,IAAI,CAAC,CAAA;QAC7C,IAAI,QAAQ,GAAG,KAAK,CAAA;QACpB,IAAI,OAAO,GAAG,KAAK,CAAA;QACnB,IAAI,UAAU,GAAG,CAAC,CAAC,CAAA;QACnB,IAAI,QAAQ,GAAG,KAAK,CAAA;QACpB,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACtB,qDAAqD;YACrD,IAAI,CAAC,GAAG,GAAG,CAAA;YACX,IAAI,GAAG,GAAG,EAAE,CAAA;YACZ,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;gBACtB,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAA;gBACzB,2DAA2D;gBAC3D,0BAA0B;gBAC1B,IAAI,QAAQ,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;oBAC3B,QAAQ,GAAG,CAAC,QAAQ,CAAA;oBACpB,GAAG,IAAI,CAAC,CAAA;oBACR,SAAQ;gBACV,CAAC;gBAED,IAAI,OAAO,EAAE,CAAC;oBACZ,IAAI,CAAC,KAAK,UAAU,GAAG,CAAC,EAAE,CAAC;wBACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;4BAC3B,QAAQ,GAAG,IAAI,CAAA;wBACjB,CAAC;oBACH,CAAC;yBAAM,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,GAAG,CAAC,IAAI,QAAQ,CAAC,EAAE,CAAC;wBAC5D,OAAO,GAAG,KAAK,CAAA;oBACjB,CAAC;oBACD,GAAG,IAAI,CAAC,CAAA;oBACR,SAAQ;gBACV,CAAC;qBAAM,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;oBACrB,OAAO,GAAG,IAAI,CAAA;oBACd,UAAU,GAAG,CAAC,CAAA;oBACd,QAAQ,GAAG,KAAK,CAAA;oBAChB,GAAG,IAAI,CAAC,CAAA;oBACR,SAAQ;gBACV,CAAC;gBAED,2DAA2D;gBAC3D,qCAAqC;gBACrC,MAAM,SAAS,GACb,CAAC,GAAG,CAAC,KAAK;oBACV,aAAa,CAAC,CAAC,CAAC;oBAChB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG;oBACrB,QAAQ,IAAI,QAAQ,CAAA;gBACtB,IAAI,SAAS,EAAE,CAAC;oBACd,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;oBACb,GAAG,GAAG,EAAE,CAAA;oBACR,MAAM,GAAG,GAAG,IAAI,EAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;oBAC3B,CAAC,GAAG,EAAG,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAA;oBACjD,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;oBACb,SAAQ;gBACV,CAAC;gBACD,GAAG,IAAI,CAAC,CAAA;YACV,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACb,OAAO,CAAC,CAAA;QACV,CAAC;QAED,wCAAwC;QACxC,uBAAuB;QACvB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,CAAA;QACf,IAAI,IAAI,GAAG,IAAI,EAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QAC7B,MAAM,KAAK,GAAU,EAAE,CAAA;QACvB,IAAI,GAAG,GAAG,EAAE,CAAA;QACZ,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAA;YACzB,2DAA2D;YAC3D,0BAA0B;YAC1B,IAAI,QAAQ,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC3B,QAAQ,GAAG,CAAC,QAAQ,CAAA;gBACpB,GAAG,IAAI,CAAC,CAAA;gBACR,SAAQ;YACV,CAAC;YAED,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,CAAC,KAAK,UAAU,GAAG,CAAC,EAAE,CAAC;oBACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;wBAC3B,QAAQ,GAAG,IAAI,CAAA;oBACjB,CAAC;gBACH,CAAC;qBAAM,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,GAAG,CAAC,IAAI,QAAQ,CAAC,EAAE,CAAC;oBAC5D,OAAO,GAAG,KAAK,CAAA;gBACjB,CAAC;gBACD,GAAG,IAAI,CAAC,CAAA;gBACR,SAAQ;YACV,CAAC;iBAAM,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;gBACrB,OAAO,GAAG,IAAI,CAAA;gBACd,UAAU,GAAG,CAAC,CAAA;gBACd,QAAQ,GAAG,KAAK,CAAA;gBAChB,GAAG,IAAI,CAAC,CAAA;gBACR,SAAQ;YACV,CAAC;YAED,MAAM,SAAS,GACb,CAAC,GAAG,CAAC,KAAK;gBACV,aAAa,CAAC,CAAC,CAAC;gBAChB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG;gBACrB,uDAAuD;gBACvD,CAAC,QAAQ,IAAI,QAAQ,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACzD,oBAAoB;YACpB,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,QAAQ,GAAG,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;gBACpD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACd,GAAG,GAAG,EAAE,CAAA;gBACR,MAAM,GAAG,GAAG,IAAI,EAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;gBAC5B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACd,CAAC,GAAG,EAAG,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,GAAG,QAAQ,CAAC,CAAA;gBACxD,SAAQ;YACV,CAAC;YACD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;gBACd,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACd,GAAG,GAAG,EAAE,CAAA;gBACR,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAChB,IAAI,GAAG,IAAI,EAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;gBACzB,SAAQ;YACV,CAAC;YACD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;gBACd,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC1C,GAAG,CAAC,SAAS,GAAG,IAAI,CAAA;gBACtB,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACd,GAAG,GAAG,EAAE,CAAA;gBACR,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,CAAA;gBACxB,OAAO,CAAC,CAAA;YACV,CAAC;YACD,GAAG,IAAI,CAAC,CAAA;QACV,CAAC;QAED,qBAAqB;QACrB,kEAAkE;QAClE,iCAAiC;QACjC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAA;QACf,GAAG,CAAC,SAAS,GAAG,SAAS,CAAA;QACzB,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;QACrC,OAAO,CAAC,CAAA;IACV,CAAC;IAED,kBAAkB,CAAC,KAAoB;QAIrC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAA;IACpD,CAAC;IAED,SAAS,CACP,KAAoB,EACpB,MAAuC,WAAW;QAKlD,IACE,CAAC,KAAK;YACN,OAAO,KAAK,KAAK,QAAQ;YACzB,KAAK,CAAC,IAAI,KAAK,IAAI;YACnB,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YACzB,IAAI,CAAC,IAAI,KAAK,IAAI,EAClB,CAAC;YACD,OAAO,KAAK,CAAA;QACd,CAAC;QACD,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QAC1B,IAAI,CAAC,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACtD,OAAO,KAAK,CAAA;QACd,CAAC;QACD,OAAQ,IAAoC,CAAC,aAAa,CACxD,EAAE,CAAC,IAAI,EACP,GAAG,CACJ,CAAA;IACH,CAAC;IACD,aAAa,CACX,CAAS,EACT,MAAuC,cAAc;QAErD,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAmB,CAAC,EAAE,QAAQ,CAAC,CAAgB,CAAC,CAAA;IACxE,CAAC;IAED,eAAe,CAEb,KAEC,EACD,KAAa;QAEb,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAgC,CAAA;QACzD,MAAM,KAAK,GAAG,IAAI,EAAG,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QAC7C,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACrB,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACd,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IAC3B,CAAC;IAED,MAAM,CACJ,KAEC,EACD,KAAa;QAEb,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAgC,CAAA;QACzD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAA;QAC1C,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;YAC1B,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,CAAC,CAAC,OAAO,GAAG,IAAI,CAAA;QAC7C,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;IAED,aAAa,CAAC,CAAS;QACrB,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAmB,CAAC,CAAA;QAChD,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAgB,CAAC,CAAA;IACnC,CAAC;IAED,SAAS,CAAC,KAAoB;QAI5B,IACE,CAAC,KAAK;YACN,OAAO,KAAK,KAAK,QAAQ;YACzB,KAAK,CAAC,IAAI,KAAK,IAAI;YACnB,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YACzB,IAAI,CAAC,IAAI,KAAK,IAAI;YAClB,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EACxB,CAAC;YACD,OAAO,KAAK,CAAA;QACd,CAAC;QACD,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QAC1B,IAAI,CAAC,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACtD,OAAO,KAAK,CAAA;QACd,CAAC;QACD,OAAQ,IAAoC,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;IACrE,CAAC;IAED,MAAM,CAAoC,KAA2B;QACnE,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAmB,CAAC,CAAA;QAChD,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAgC,CAAA;QACzD,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;QAC1B,kCAAkC;QAClC,IAAI,CAAC,EAAE;YAAE,OAAO,KAAK,CAAA;QACrB,oBAAoB;QACpB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM,CAAA;QACvB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC1B,CAAC,CAAC,OAAO,GAAG,IAAI,CAAA;YAClB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,EAAE,CAAA;QACd,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;IACxB,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,OAAe,EAAE,UAA4B,EAAE;QAC7D,MAAM,GAAG,GAAG,IAAI,EAAG,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAA;QAC7C,EAAG,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;QAC1C,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,oEAAoE;IACpE,iBAAiB;IACjB,WAAW;QACT,gCAAgC;QAChC,qBAAqB;QACrB,IAAI,IAAI,KAAK,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAA;QACxD,oBAAoB;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAC5B,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;QACzD,+DAA+D;QAC/D,mEAAmE;QACnE,sCAAsC;QACtC,MAAM,QAAQ,GACZ,QAAQ;YACR,IAAI,CAAC,SAAS;YACd,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM;gBACnB,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe;gBAC9B,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;QAC9C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QACpE,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE;YACjD,IAAI,EAAE,EAAE;YACR,KAAK,EAAE,IAAI;SACZ,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAED,qEAAqE;IACrE,qEAAqE;IACrE,yEAAyE;IACzE,sEAAsE;IACtE,qEAAqE;IACrE,wEAAwE;IACxE,oEAAoE;IACpE,0DAA0D;IAC1D,EAAE;IACF,uCAAuC;IACvC,4BAA4B;IAC5B,wDAAwD;IACxD,uCAAuC;IACvC,8CAA8C;IAC9C,UAAU;IACV,4BAA4B;IAC5B,YAAY;IACZ,EAAE;IACF,mEAAmE;IACnE,wBAAwB;IACxB,iDAAiD;IACjD,8BAA8B;IAC9B,8DAA8D;IAC9D,uCAAuC;IACvC,8CAA8C;IAC9C,UAAU;IACV,gDAAgD;IAChD,iBAAiB;IACjB,EAAE;IACF,0EAA0E;IAC1E,2EAA2E;IAC3E,2EAA2E;IAC3E,eAAe;IACf,EAAE;IACF,wEAAwE;IACxE,4DAA4D;IAC5D,iEAAiE;IACjE,4BAA4B;IAC5B,8DAA8D;IAC9D,6CAA6C;IAC7C,oDAAoD;IACpD,EAAE;IACF,uEAAuE;IACvE,gEAAgE;IAChE,EAAE;IACF,sEAAsE;IACtE,qCAAqC;IACrC,EAAE;IACF,0EAA0E;IAC1E,2EAA2E;IAC3E,EAAE;IACF,kBAAkB;IAClB,+CAA+C;IAC/C,4CAA4C;IAC5C,uEAAuE;IACvE,EAAE;IACF,6EAA6E;IAC7E,0EAA0E;IAC1E,sEAAsE;IACtE,sCAAsC;IACtC,EAAE;IACF,yEAAyE;IACzE,oEAAoE;IACpE,0CAA0C;IAC1C,EAAE;IACF,2BAA2B;IAC3B,sEAAsE;IACtE,qEAAqE;IACrE,uEAAuE;IACvE,cAAc,CACZ,QAAkB;QAElB,MAAM,GAAG,GAAG,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAA;QAC3C,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,QAAQ,EAAE,CAAA;YACf,IAAI,CAAC,SAAS,EAAE,CAAA;QAClB,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,OAAO,GACX,IAAI,CAAC,OAAO,EAAE;gBACd,IAAI,CAAC,KAAK,EAAE;gBACZ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAA;YAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM;iBACpB,GAAG,CAAC,CAAC,CAAC,EAAE;gBACP,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,GAC5B,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;oBACrB,EAAG,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC;oBAC5C,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAA;gBAC9B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,QAAQ,CAAA;gBAC3C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAA;gBAClC,OAAO,EAAE,CAAA;YACX,CAAC,CAAC;iBACD,IAAI,CAAC,EAAE,CAAC,CAAA;YAEX,IAAI,KAAK,GAAG,EAAE,CAAA;YACd,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;gBACnB,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;oBACvC,+DAA+D;oBAC/D,+CAA+C;oBAE/C,gEAAgE;oBAChE,+CAA+C;oBAC/C,MAAM,cAAc,GAClB,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;oBAC1D,IAAI,CAAC,cAAc,EAAE,CAAC;wBACpB,MAAM,GAAG,GAAG,eAAe,CAAA;wBAC3B,sDAAsD;wBACtD,oBAAoB;wBACpB,MAAM,UAAU;wBACd,uDAAuD;wBACvD,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;4BAC/B,8CAA8C;4BAC9C,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;4BACjD,gDAAgD;4BAChD,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;wBACtD,2DAA2D;wBAC3D,4CAA4C;wBAC5C,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;wBAE7D,KAAK;4BACH,UAAU,CAAC,CAAC,CAAC,gBAAgB;gCAC7B,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;oCACxB,CAAC,CAAC,EAAE,CAAA;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;YAED,6DAA6D;YAC7D,IAAI,GAAG,GAAG,EAAE,CAAA;YACZ,IACE,IAAI,CAAC,KAAK,EAAE;gBACZ,IAAI,CAAC,KAAK,CAAC,WAAW;gBACtB,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,GAAG,EAC1B,CAAC;gBACD,GAAG,GAAG,WAAW,CAAA;YACnB,CAAC;YACD,MAAM,KAAK,GAAG,KAAK,GAAG,GAAG,GAAG,GAAG,CAAA;YAC/B,OAAO;gBACL,KAAK;gBACL,IAAA,sBAAQ,EAAC,GAAG,CAAC;gBACb,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;gBACnC,IAAI,CAAC,MAAM;aACZ,CAAA;QACH,CAAC;QAED,iEAAiE;QACjE,iEAAiE;QACjE,oCAAoC;QAEpC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,CAAA;QACvD,uBAAuB;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAA;QACrD,IAAI,IAAI,GAAI,IAAoC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA;QAEpE,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;YACjE,mEAAmE;YACnE,2BAA2B;YAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;YACzB,MAAM,EAAE,GAAG,IAAW,CAAA;YACtB,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;YACf,EAAE,CAAC,IAAI,GAAG,IAAI,CAAA;YACd,EAAE,CAAC,SAAS,GAAG,SAAS,CAAA;YACxB,OAAO,CAAC,CAAC,EAAE,IAAA,sBAAQ,EAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;QACrD,CAAC;QAED,IAAI,cAAc,GAChB,CAAC,QAAQ,IAAI,QAAQ,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;YAC3C,EAAE;YACJ,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;QAC7B,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;YAC5B,cAAc,GAAG,EAAE,CAAA;QACrB,CAAC;QACD,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,GAAG,MAAM,IAAI,OAAO,cAAc,KAAK,CAAA;QAC7C,CAAC;QAED,sDAAsD;QACtD,IAAI,KAAK,GAAG,EAAE,CAAA;QACd,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACxC,KAAK,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,CAAA;QAClE,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GACT,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;gBACjB,iDAAiD;gBACjD,IAAI;oBACJ,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;oBACvD,IAAI;oBACJ,GAAG;gBACL,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG;oBACzB,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI;wBAC1B,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG;4BAC3C,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,cAAc,CAAC,CAAC,CAAC,IAAI;gCAC5C,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAA;YACnB,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,CAAA;QAC9B,CAAC;QACD,OAAO;YACL,KAAK;YACL,IAAA,sBAAQ,EAAC,IAAI,CAAC;YACd,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;YACnC,IAAI,CAAC,MAAM;SACZ,CAAA;IACH,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC5B,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;oBAC1B,CAAC,CAAC,QAAQ,EAAE,CAAA;gBACd,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,oDAAoD;YACpD,IAAI,UAAU,GAAG,CAAC,CAAA;YAClB,IAAI,IAAI,GAAG,KAAK,CAAA;YAChB,GAAG,CAAC;gBACF,IAAI,GAAG,IAAI,CAAA;gBACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC5C,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;oBACxB,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;wBAC1B,CAAC,CAAC,QAAQ,EAAE,CAAA;wBACZ,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;4BACtB,IAAI,GAAG,KAAK,CAAA;4BACZ,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;wBACnB,CAAC;6BAAM,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;4BACtC,IAAI,GAAG,KAAK,CACX;4BAAC,IAAoC,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;wBAC9D,CAAC;6BAAM,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;4BAC7B,IAAI,GAAG,KAAK,CACX;4BAAC,IAAoC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;wBAClD,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,UAAU,GAAG,EAAE,EAAC;QACtC,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;IAED,cAAc,CAAoC,GAAY;QAC5D,OAAO,IAAI,CAAC,MAAM;aACf,GAAG,CAAC,CAAC,CAAC,EAAE;YACP,+CAA+C;YAC/C,qBAAqB;YACrB,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;YACjD,CAAC;YACD,oBAAoB;YACpB,iEAAiE;YACjE,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA;YACvD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAA;YAClC,OAAO,EAAE,CAAA;QACX,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACrD,IAAI,CAAC,GAAG,CAAC,CAAA;IACd,CAAC;IAED,MAAM,CAAC,UAAU,CACf,IAAY,EACZ,QAA6B,EAC7B,UAAmB,KAAK;QAExB,IAAI,QAAQ,GAAG,KAAK,CAAA;QACpB,IAAI,EAAE,GAAG,EAAE,CAAA;QACX,IAAI,KAAK,GAAG,KAAK,CAAA;QACjB,2DAA2D;QAC3D,IAAI,MAAM,GAAG,KAAK,CAAA;QAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;YACxB,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,GAAG,KAAK,CAAA;gBAChB,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;gBACzC,SAAQ;YACV,CAAC;YACD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;gBACd,IAAI,MAAM;oBAAE,SAAQ;gBACpB,MAAM,GAAG,IAAI,CAAA;gBACb,EAAE,IAAI,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAA;gBACzD,QAAQ,GAAG,IAAI,CAAA;gBACf,SAAQ;YACV,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,KAAK,CAAA;YAChB,CAAC;YACD,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBACf,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC1B,EAAE,IAAI,MAAM,CAAA;gBACd,CAAC;qBAAM,CAAC;oBACN,QAAQ,GAAG,IAAI,CAAA;gBACjB,CAAC;gBACD,SAAQ;YACV,CAAC;YACD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;gBACd,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,IAAA,iCAAU,EAAC,IAAI,EAAE,CAAC,CAAC,CAAA;gBAC7D,IAAI,QAAQ,EAAE,CAAC;oBACb,EAAE,IAAI,GAAG,CAAA;oBACT,KAAK,GAAG,KAAK,IAAI,SAAS,CAAA;oBAC1B,CAAC,IAAI,QAAQ,GAAG,CAAC,CAAA;oBACjB,QAAQ,GAAG,QAAQ,IAAI,KAAK,CAAA;oBAC5B,SAAQ;gBACV,CAAC;YACH,CAAC;YACD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;gBACd,EAAE,IAAI,KAAK,CAAA;gBACX,QAAQ,GAAG,IAAI,CAAA;gBACf,SAAQ;YACV,CAAC;YACD,EAAE,IAAI,YAAY,CAAC,CAAC,CAAC,CAAA;QACvB,CAAC;QACD,OAAO,CAAC,EAAE,EAAE,IAAA,sBAAQ,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;IAChD,CAAC;CACF;AArxBD,kBAqxBC","sourcesContent":["// parse a single path portion\n\nimport { parseClass } from './brace-expressions.js'\nimport type { MinimatchOptions, MMRegExp } from './index.js'\nimport { unescape } from './unescape.js'\n\n// classes [] are handled by the parseClass method\n// for positive extglobs, we sub-parse the contents, and combine,\n// with the appropriate regexp close.\n// for negative extglobs, we sub-parse the contents, but then\n// have to include the rest of the pattern, then the parent, etc.,\n// as the thing that cannot be because RegExp negative lookaheads\n// are different from globs.\n//\n// So for example:\n// a@(i|w!(x|y)z|j)b => ^a(i|w((!?(x|y)zb).*)z|j)b$\n// 1 2 3 4 5 6 1 2 3 46 5 6\n//\n// Assembling the extglob requires not just the negated patterns themselves,\n// but also anything following the negative patterns up to the boundary\n// of the current pattern, plus anything following in the parent pattern.\n//\n//\n// So, first, we parse the string into an AST of extglobs, without turning\n// anything into regexps yet.\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y']}, 'z'], ['j']]}, 'b']\n//\n// Then, for all the negative extglobs, we append whatever comes after in\n// each parent as their tail\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y'], 'z', 'b'}, 'z'], ['j']]}, 'b']\n//\n// Lastly, we turn each of these pieces into a regexp, and join\n//\n// v----- .* because there's more following,\n// v v otherwise, .+ because it must be\n// v v *something* there.\n// ['^a', {@ ['i', 'w(?:(!?(?:x|y).*zb$).*)z', 'j' ]}, 'b$']\n// copy what follows into here--^^^^^\n// ['^a', '(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)', 'b$']\n// ['^a(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)b$']\n\nexport type ExtglobType = '!' | '?' | '+' | '*' | '@'\nconst types = new Set(['!', '?', '+', '*', '@'])\nconst isExtglobType = (c: string | null): c is ExtglobType =>\n types.has(c as ExtglobType)\nconst isExtglobAST = (c: AST): c is AST & { type: ExtglobType } =>\n isExtglobType(c.type)\n\n// Map of which extglob types can adopt the children of a nested extglob\n//\n// anything but ! can adopt a matching type:\n// +(a|+(b|c)|d) => +(a|b|c|d)\n// *(a|*(b|c)|d) => *(a|b|c|d)\n// @(a|@(b|c)|d) => @(a|b|c|d)\n// ?(a|?(b|c)|d) => ?(a|b|c|d)\n//\n// * can adopt anything, because 0 or repetition is allowed\n// *(a|?(b|c)|d) => *(a|b|c|d)\n// *(a|+(b|c)|d) => *(a|b|c|d)\n// *(a|@(b|c)|d) => *(a|b|c|d)\n//\n// + can adopt @, because 1 or repetition is allowed\n// +(a|@(b|c)|d) => +(a|b|c|d)\n//\n// + and @ CANNOT adopt *, because 0 would be allowed\n// +(a|*(b|c)|d) => would match \"\", on *(b|c)\n// @(a|*(b|c)|d) => would match \"\", on *(b|c)\n//\n// + and @ CANNOT adopt ?, because 0 would be allowed\n// +(a|?(b|c)|d) => would match \"\", on ?(b|c)\n// @(a|?(b|c)|d) => would match \"\", on ?(b|c)\n//\n// ? can adopt @, because 0 or 1 is allowed\n// ?(a|@(b|c)|d) => ?(a|b|c|d)\n//\n// ? and @ CANNOT adopt * or +, because >1 would be allowed\n// ?(a|*(b|c)|d) => would match bbb on *(b|c)\n// @(a|*(b|c)|d) => would match bbb on *(b|c)\n// ?(a|+(b|c)|d) => would match bbb on +(b|c)\n// @(a|+(b|c)|d) => would match bbb on +(b|c)\n//\n// ! CANNOT adopt ! (nothing else can either)\n// !(a|!(b|c)|d) => !(a|b|c|d) would fail to match on b (not not b|c)\n//\n// ! can adopt @\n// !(a|@(b|c)|d) => !(a|b|c|d)\n//\n// ! CANNOT adopt *\n// !(a|*(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed\n//\n// ! CANNOT adopt +\n// !(a|+(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed\n//\n// ! CANNOT adopt ?\n// x!(a|?(b|c)|d) => x!(a|b|c|d) would fail to match \"x\"\nconst adoptionMap = new Map([\n ['!', ['@']],\n ['?', ['?', '@']],\n ['@', ['@']],\n ['*', ['*', '+', '?', '@']],\n ['+', ['+', '@']],\n])\n\n// nested extglobs that can be adopted in, but with the addition of\n// a blank '' element.\nconst adoptionWithSpaceMap = new Map([\n ['!', ['?']],\n ['@', ['?']],\n ['+', ['?', '*']],\n])\n\n// union of the previous two maps\nconst adoptionAnyMap = new Map([\n ['!', ['?', '@']],\n ['?', ['?', '@']],\n ['@', ['?', '@']],\n ['*', ['*', '+', '?', '@']],\n ['+', ['+', '@', '?', '*']],\n])\n\n// Extglobs that can take over their parent if they are the only child\n// the key is parent, value maps child to resulting extglob parent type\n// '@' is omitted because it's a special case. An `@` extglob with a single\n// member can always be usurped by that subpattern.\nconst usurpMap = new Map<\n ExtglobType,\n Map\n>([\n ['!', new Map([['!', '@']])],\n [\n '?',\n new Map([\n ['*', '*'],\n ['+', '*'],\n ]),\n ],\n [\n '@',\n new Map([\n ['!', '!'],\n ['?', '?'],\n ['@', '@'],\n ['*', '*'],\n ['+', '+'],\n ]),\n ],\n [\n '+',\n new Map([\n ['?', '*'],\n ['*', '*'],\n ]),\n ],\n])\n\n// Patterns that get prepended to bind to the start of either the\n// entire string, or just a single path portion, to prevent dots\n// and/or traversal patterns, when needed.\n// Exts don't need the ^ or / bit, because the root binds that already.\nconst startNoTraversal = '(?!(?:^|/)\\\\.\\\\.?(?:$|/))'\nconst startNoDot = '(?!\\\\.)'\n\n// characters that indicate a start of pattern needs the \"no dots\" bit,\n// because a dot *might* be matched. ( is not in the list, because in\n// the case of a child extglob, it will handle the prevention itself.\nconst addPatternStart = new Set(['[', '.'])\n// cases where traversal is A-OK, no dot prevention needed\nconst justDots = new Set(['..', '.'])\nconst reSpecials = new Set('().*{}+?[]^$\\\\!')\nconst regExpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// any single thing other than /\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n// use + when we need to ensure that *something* matches, because the * is\n// the only thing in the path portion.\nconst starNoEmpty = qmark + '+?'\n\n// remove the \\ chars that we added if we end up doing a nonmagic compare\n// const deslash = (s: string) => s.replace(/\\\\(.)/g, '$1')\n\nlet ID = 0\nexport class AST {\n type: ExtglobType | null\n readonly #root: AST\n\n #hasMagic?: boolean\n #uflag: boolean = false\n #parts: (string | AST)[] = []\n #parent?: AST\n #parentIndex: number\n #negs: AST[]\n #filledNegs: boolean = false\n #options: MinimatchOptions\n #toString?: string\n // set to true if it's an extglob with no children\n // (which really means one child of '')\n #emptyExt: boolean = false\n id = ++ID\n\n get depth(): number {\n return (this.#parent?.depth ?? -1) + 1\n }\n\n [Symbol.for('nodejs.util.inspect.custom')]() {\n return {\n '@@type': 'AST',\n id: this.id,\n type: this.type,\n root: this.#root.id,\n parent: this.#parent?.id,\n depth: this.depth,\n partsLength: this.#parts.length,\n parts: this.#parts,\n }\n }\n\n constructor(\n type: ExtglobType | null,\n parent?: AST,\n options: MinimatchOptions = {},\n ) {\n this.type = type\n // extglobs are inherently magical\n if (type) this.#hasMagic = true\n this.#parent = parent\n this.#root = this.#parent ? this.#parent.#root : this\n this.#options = this.#root === this ? options : this.#root.#options\n this.#negs = this.#root === this ? [] : this.#root.#negs\n if (type === '!' && !this.#root.#filledNegs) this.#negs.push(this)\n this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0\n }\n\n get hasMagic(): boolean | undefined {\n /* c8 ignore start */\n if (this.#hasMagic !== undefined) return this.#hasMagic\n /* c8 ignore stop */\n for (const p of this.#parts) {\n if (typeof p === 'string') continue\n if (p.type || p.hasMagic) return (this.#hasMagic = true)\n }\n // note: will be undefined until we generate the regexp src and find out\n return this.#hasMagic\n }\n\n // reconstructs the pattern\n toString(): string {\n return (\n this.#toString !== undefined ? this.#toString\n : !this.type ?\n (this.#toString = this.#parts.map(p => String(p)).join(''))\n : (this.#toString =\n this.type +\n '(' +\n this.#parts.map(p => String(p)).join('|') +\n ')')\n )\n }\n\n #fillNegs() {\n /* c8 ignore start */\n if (this !== this.#root) throw new Error('should only call on root')\n if (this.#filledNegs) return this\n /* c8 ignore stop */\n\n // call toString() once to fill this out\n this.toString()\n this.#filledNegs = true\n let n: AST | undefined\n while ((n = this.#negs.pop())) {\n if (n.type !== '!') continue\n // walk up the tree, appending everthing that comes AFTER parentIndex\n let p: AST | undefined = n\n let pp = p.#parent\n while (pp) {\n for (\n let i = p.#parentIndex + 1;\n !pp.type && i < pp.#parts.length;\n i++\n ) {\n for (const part of n.#parts) {\n /* c8 ignore start */\n if (typeof part === 'string') {\n throw new Error('string part in extglob AST??')\n }\n /* c8 ignore stop */\n part.copyIn(pp.#parts[i])\n }\n }\n p = pp\n pp = p.#parent\n }\n }\n return this\n }\n\n push(...parts: (string | AST)[]) {\n for (const p of parts) {\n if (p === '') continue\n /* c8 ignore start */\n if (\n typeof p !== 'string' &&\n !(p instanceof AST && p.#parent === this)\n ) {\n throw new Error('invalid part: ' + p)\n }\n /* c8 ignore stop */\n this.#parts.push(p)\n }\n }\n\n toJSON() {\n const ret: unknown[] =\n this.type === null ?\n this.#parts\n .slice()\n .map(p => (typeof p === 'string' ? p : p.toJSON()))\n : [this.type, ...this.#parts.map(p => (p as AST).toJSON())]\n if (this.isStart() && !this.type) ret.unshift([])\n if (\n this.isEnd() &&\n (this === this.#root ||\n (this.#root.#filledNegs && this.#parent?.type === '!'))\n ) {\n ret.push({})\n }\n return ret\n }\n\n isStart(): boolean {\n if (this.#root === this) return true\n // if (this.type) return !!this.#parent?.isStart()\n if (!this.#parent?.isStart()) return false\n if (this.#parentIndex === 0) return true\n // if everything AHEAD of this is a negation, then it's still the \"start\"\n const p = this.#parent\n for (let i = 0; i < this.#parentIndex; i++) {\n const pp = p.#parts[i]\n if (!(pp instanceof AST && pp.type === '!')) {\n return false\n }\n }\n return true\n }\n\n isEnd(): boolean {\n if (this.#root === this) return true\n if (this.#parent?.type === '!') return true\n if (!this.#parent?.isEnd()) return false\n if (!this.type) return this.#parent?.isEnd()\n // if not root, it'll always have a parent\n /* c8 ignore start */\n const pl = this.#parent ? this.#parent.#parts.length : 0\n /* c8 ignore stop */\n return this.#parentIndex === pl - 1\n }\n\n copyIn(part: AST | string) {\n if (typeof part === 'string') this.push(part)\n else this.push(part.clone(this))\n }\n\n clone(parent: AST) {\n const c = new AST(this.type, parent)\n for (const p of this.#parts) {\n c.copyIn(p)\n }\n return c\n }\n\n static #parseAST(\n str: string,\n ast: AST,\n pos: number,\n opt: MinimatchOptions,\n extDepth: number,\n ): number {\n const maxDepth = opt.maxExtglobRecursion ?? 2\n let escaping = false\n let inBrace = false\n let braceStart = -1\n let braceNeg = false\n if (ast.type === null) {\n // outside of a extglob, append until we find a start\n let i = pos\n let acc = ''\n while (i < str.length) {\n const c = str.charAt(i++)\n // still accumulate escapes at this point, but we do ignore\n // starts that are escaped\n if (escaping || c === '\\\\') {\n escaping = !escaping\n acc += c\n continue\n }\n\n if (inBrace) {\n if (i === braceStart + 1) {\n if (c === '^' || c === '!') {\n braceNeg = true\n }\n } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n inBrace = false\n }\n acc += c\n continue\n } else if (c === '[') {\n inBrace = true\n braceStart = i\n braceNeg = false\n acc += c\n continue\n }\n\n // we don't have to check for adoption here, because that's\n // done at the other recursion point.\n const doRecurse =\n !opt.noext &&\n isExtglobType(c) &&\n str.charAt(i) === '(' &&\n extDepth <= maxDepth\n if (doRecurse) {\n ast.push(acc)\n acc = ''\n const ext = new AST(c, ast)\n i = AST.#parseAST(str, ext, i, opt, extDepth + 1)\n ast.push(ext)\n continue\n }\n acc += c\n }\n ast.push(acc)\n return i\n }\n\n // some kind of extglob, pos is at the (\n // find the next | or )\n let i = pos + 1\n let part = new AST(null, ast)\n const parts: AST[] = []\n let acc = ''\n while (i < str.length) {\n const c = str.charAt(i++)\n // still accumulate escapes at this point, but we do ignore\n // starts that are escaped\n if (escaping || c === '\\\\') {\n escaping = !escaping\n acc += c\n continue\n }\n\n if (inBrace) {\n if (i === braceStart + 1) {\n if (c === '^' || c === '!') {\n braceNeg = true\n }\n } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n inBrace = false\n }\n acc += c\n continue\n } else if (c === '[') {\n inBrace = true\n braceStart = i\n braceNeg = false\n acc += c\n continue\n }\n\n const doRecurse =\n !opt.noext &&\n isExtglobType(c) &&\n str.charAt(i) === '(' &&\n /* c8 ignore start - the maxDepth is sufficient here */\n (extDepth <= maxDepth || (ast && ast.#canAdoptType(c)))\n /* c8 ignore stop */\n if (doRecurse) {\n const depthAdd = ast && ast.#canAdoptType(c) ? 0 : 1\n part.push(acc)\n acc = ''\n const ext = new AST(c, part)\n part.push(ext)\n i = AST.#parseAST(str, ext, i, opt, extDepth + depthAdd)\n continue\n }\n if (c === '|') {\n part.push(acc)\n acc = ''\n parts.push(part)\n part = new AST(null, ast)\n continue\n }\n if (c === ')') {\n if (acc === '' && ast.#parts.length === 0) {\n ast.#emptyExt = true\n }\n part.push(acc)\n acc = ''\n ast.push(...parts, part)\n return i\n }\n acc += c\n }\n\n // unfinished extglob\n // if we got here, it was a malformed extglob! not an extglob, but\n // maybe something else in there.\n ast.type = null\n ast.#hasMagic = undefined\n ast.#parts = [str.substring(pos - 1)]\n return i\n }\n\n #canAdoptWithSpace(child?: AST | string): child is AST & {\n type: null\n parts: [AST & { type: ExtglobType }]\n } {\n return this.#canAdopt(child, adoptionWithSpaceMap)\n }\n\n #canAdopt(\n child?: AST | string,\n map: Map = adoptionMap,\n ): child is AST & {\n type: null\n parts: [AST & { type: ExtglobType }]\n } {\n if (\n !child ||\n typeof child !== 'object' ||\n child.type !== null ||\n child.#parts.length !== 1 ||\n this.type === null\n ) {\n return false\n }\n const gc = child.#parts[0]\n if (!gc || typeof gc !== 'object' || gc.type === null) {\n return false\n }\n return (this as AST & { type: ExtglobType }).#canAdoptType(\n gc.type,\n map,\n )\n }\n #canAdoptType(\n c: string,\n map: Map = adoptionAnyMap,\n ): c is ExtglobType {\n return !!map.get(this.type as ExtglobType)?.includes(c as ExtglobType)\n }\n\n #adoptWithSpace(\n this: AST & { type: ExtglobType },\n child: AST & {\n type: null\n },\n index: number,\n ) {\n const gc = child.#parts[0] as AST & { type: ExtglobType }\n const blank = new AST(null, gc, this.options)\n blank.#parts.push('')\n gc.push(blank)\n this.#adopt(child, index)\n }\n\n #adopt(\n child: AST & {\n type: null\n },\n index: number,\n ) {\n const gc = child.#parts[0] as AST & { type: ExtglobType }\n this.#parts.splice(index, 1, ...gc.#parts)\n for (const p of gc.#parts) {\n if (typeof p === 'object') p.#parent = this\n }\n this.#toString = undefined\n }\n\n #canUsurpType(c: string): boolean {\n const m = usurpMap.get(this.type as ExtglobType)\n return !!m?.has(c as ExtglobType)\n }\n\n #canUsurp(child?: AST | string): child is AST & {\n type: null\n parts: [AST & { type: ExtglobType }]\n } {\n if (\n !child ||\n typeof child !== 'object' ||\n child.type !== null ||\n child.#parts.length !== 1 ||\n this.type === null ||\n this.#parts.length !== 1\n ) {\n return false\n }\n const gc = child.#parts[0]\n if (!gc || typeof gc !== 'object' || gc.type === null) {\n return false\n }\n return (this as AST & { type: ExtglobType }).#canUsurpType(gc.type)\n }\n\n #usurp(this: AST & { type: ExtglobType }, child: AST & { type: null }) {\n const m = usurpMap.get(this.type as ExtglobType)\n const gc = child.#parts[0] as AST & { type: ExtglobType }\n const nt = m?.get(gc.type)\n /* c8 ignore start - impossible */\n if (!nt) return false\n /* c8 ignore stop */\n this.#parts = gc.#parts\n for (const p of this.#parts) {\n if (typeof p === 'object') {\n p.#parent = this\n }\n }\n this.type = nt\n this.#toString = undefined\n this.#emptyExt = false\n }\n\n static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n const ast = new AST(null, undefined, options)\n AST.#parseAST(pattern, ast, 0, options, 0)\n return ast\n }\n\n // returns the regular expression if there's magic, or the unescaped\n // string if not.\n toMMPattern(): MMRegExp | string {\n // should only be called on root\n /* c8 ignore start */\n if (this !== this.#root) return this.#root.toMMPattern()\n /* c8 ignore stop */\n const glob = this.toString()\n const [re, body, hasMagic, uflag] = this.toRegExpSource()\n // if we're in nocase mode, and not nocaseMagicOnly, then we do\n // still need a regular expression if we have to case-insensitively\n // match capital/lowercase characters.\n const anyMagic =\n hasMagic ||\n this.#hasMagic ||\n (this.#options.nocase &&\n !this.#options.nocaseMagicOnly &&\n glob.toUpperCase() !== glob.toLowerCase())\n if (!anyMagic) {\n return body\n }\n\n const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '')\n return Object.assign(new RegExp(`^${re}$`, flags), {\n _src: re,\n _glob: glob,\n })\n }\n\n get options() {\n return this.#options\n }\n\n // returns the string match, the regexp source, whether there's magic\n // in the regexp (so a regular expression is required) and whether or\n // not the uflag is needed for the regular expression (for posix classes)\n // TODO: instead of injecting the start/end at this point, just return\n // the BODY of the regexp, along with the start/end portions suitable\n // for binding the start/end in either a joined full-path makeRe context\n // (where we bind to (^|/), or a standalone matchPart context (where\n // we bind to ^, and not /). Otherwise slashes get duped!\n //\n // In part-matching mode, the start is:\n // - if not isStart: nothing\n // - if traversal possible, but not allowed: ^(?!\\.\\.?$)\n // - if dots allowed or not possible: ^\n // - if dots possible and not allowed: ^(?!\\.)\n // end is:\n // - if not isEnd(): nothing\n // - else: $\n //\n // In full-path matching mode, we put the slash at the START of the\n // pattern, so start is:\n // - if first pattern: same as part-matching mode\n // - if not isStart(): nothing\n // - if traversal possible, but not allowed: /(?!\\.\\.?(?:$|/))\n // - if dots allowed or not possible: /\n // - if dots possible and not allowed: /(?!\\.)\n // end is:\n // - if last pattern, same as part-matching mode\n // - else nothing\n //\n // Always put the (?:$|/) on negated tails, though, because that has to be\n // there to bind the end of the negated pattern portion, and it's easier to\n // just stick it in now rather than try to inject it later in the middle of\n // the pattern.\n //\n // We can just always return the same end, and leave it up to the caller\n // to know whether it's going to be used joined or in parts.\n // And, if the start is adjusted slightly, can do the same there:\n // - if not isStart: nothing\n // - if traversal possible, but not allowed: (?:/|^)(?!\\.\\.?$)\n // - if dots allowed or not possible: (?:/|^)\n // - if dots possible and not allowed: (?:/|^)(?!\\.)\n //\n // But it's better to have a simpler binding without a conditional, for\n // performance, so probably better to return both start options.\n //\n // Then the caller just ignores the end if it's not the first pattern,\n // and the start always gets applied.\n //\n // But that's always going to be $ if it's the ending pattern, or nothing,\n // so the caller can just attach $ at the end of the pattern when building.\n //\n // So the todo is:\n // - better detect what kind of start is needed\n // - return both flavors of starting pattern\n // - attach $ at the end of the pattern when creating the actual RegExp\n //\n // Ah, but wait, no, that all only applies to the root when the first pattern\n // is not an extglob. If the first pattern IS an extglob, then we need all\n // that dot prevention biz to live in the extglob portions, because eg\n // +(*|.x*) can match .xy but not .yx.\n //\n // So, return the two flavors if it's #root and the first child is not an\n // AST, otherwise leave it to the child AST to handle it, and there,\n // use the (?:^|/) style of start binding.\n //\n // Even simplified further:\n // - Since the start for a join is eg /(?!\\.) and the start for a part\n // is ^(?!\\.), we can just prepend (?!\\.) to the pattern (either root\n // or start or whatever) and prepend ^ or / at the Regexp construction.\n toRegExpSource(\n allowDot?: boolean,\n ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n const dot = allowDot ?? !!this.#options.dot\n if (this.#root === this) {\n this.#flatten()\n this.#fillNegs()\n }\n if (!isExtglobAST(this)) {\n const noEmpty =\n this.isStart() &&\n this.isEnd() &&\n !this.#parts.some(s => typeof s !== 'string')\n const src = this.#parts\n .map(p => {\n const [re, _, hasMagic, uflag] =\n typeof p === 'string' ?\n AST.#parseGlob(p, this.#hasMagic, noEmpty)\n : p.toRegExpSource(allowDot)\n this.#hasMagic = this.#hasMagic || hasMagic\n this.#uflag = this.#uflag || uflag\n return re\n })\n .join('')\n\n let start = ''\n if (this.isStart()) {\n if (typeof this.#parts[0] === 'string') {\n // this is the string that will match the start of the pattern,\n // so we need to protect against dots and such.\n\n // '.' and '..' cannot match unless the pattern is that exactly,\n // even if it starts with . or dot:true is set.\n const dotTravAllowed =\n this.#parts.length === 1 && justDots.has(this.#parts[0])\n if (!dotTravAllowed) {\n const aps = addPatternStart\n // check if we have a possibility of matching . or ..,\n // and prevent that.\n const needNoTrav =\n // dots are allowed, and the pattern starts with [ or .\n (dot && aps.has(src.charAt(0))) ||\n // the pattern starts with \\., and then [ or .\n (src.startsWith('\\\\.') && aps.has(src.charAt(2))) ||\n // the pattern starts with \\.\\., and then [ or .\n (src.startsWith('\\\\.\\\\.') && aps.has(src.charAt(4)))\n // no need to prevent dots if it can't match a dot, or if a\n // sub-pattern will be preventing it anyway.\n const needNoDot = !dot && !allowDot && aps.has(src.charAt(0))\n\n start =\n needNoTrav ? startNoTraversal\n : needNoDot ? startNoDot\n : ''\n }\n }\n }\n\n // append the \"end of path portion\" pattern to negation tails\n let end = ''\n if (\n this.isEnd() &&\n this.#root.#filledNegs &&\n this.#parent?.type === '!'\n ) {\n end = '(?:$|\\\\/)'\n }\n const final = start + src + end\n return [\n final,\n unescape(src),\n (this.#hasMagic = !!this.#hasMagic),\n this.#uflag,\n ]\n }\n\n // We need to calculate the body *twice* if it's a repeat pattern\n // at the start, once in nodot mode, then again in dot mode, so a\n // pattern like *(?) can match 'x.y'\n\n const repeated = this.type === '*' || this.type === '+'\n // some kind of extglob\n const start = this.type === '!' ? '(?:(?!(?:' : '(?:'\n let body = (this as AST & { type: ExtglobType }).#partsToRegExp(dot)\n\n if (this.isStart() && this.isEnd() && !body && this.type !== '!') {\n // invalid extglob, has to at least be *something* present, if it's\n // the entire path portion.\n const s = this.toString()\n const me = this as AST\n me.#parts = [s]\n me.type = null\n me.#hasMagic = undefined\n return [s, unescape(this.toString()), false, false]\n }\n\n let bodyDotAllowed =\n !repeated || allowDot || dot || !startNoDot ?\n ''\n : this.#partsToRegExp(true)\n if (bodyDotAllowed === body) {\n bodyDotAllowed = ''\n }\n if (bodyDotAllowed) {\n body = `(?:${body})(?:${bodyDotAllowed})*?`\n }\n\n // an empty !() is exactly equivalent to a starNoEmpty\n let final = ''\n if (this.type === '!' && this.#emptyExt) {\n final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty\n } else {\n const close =\n this.type === '!' ?\n // !() must match something,but !(x) can match ''\n '))' +\n (this.isStart() && !dot && !allowDot ? startNoDot : '') +\n star +\n ')'\n : this.type === '@' ? ')'\n : this.type === '?' ? ')?'\n : this.type === '+' && bodyDotAllowed ? ')'\n : this.type === '*' && bodyDotAllowed ? `)?`\n : `)${this.type}`\n final = start + body + close\n }\n return [\n final,\n unescape(body),\n (this.#hasMagic = !!this.#hasMagic),\n this.#uflag,\n ]\n }\n\n #flatten() {\n if (!isExtglobAST(this)) {\n for (const p of this.#parts) {\n if (typeof p === 'object') {\n p.#flatten()\n }\n }\n } else {\n // do up to 10 passes to flatten as much as possible\n let iterations = 0\n let done = false\n do {\n done = true\n for (let i = 0; i < this.#parts.length; i++) {\n const c = this.#parts[i]\n if (typeof c === 'object') {\n c.#flatten()\n if (this.#canAdopt(c)) {\n done = false\n this.#adopt(c, i)\n } else if (this.#canAdoptWithSpace(c)) {\n done = false\n ;(this as AST & { type: ExtglobType }).#adoptWithSpace(c, i)\n } else if (this.#canUsurp(c)) {\n done = false\n ;(this as AST & { type: ExtglobType }).#usurp(c)\n }\n }\n }\n } while (!done && ++iterations < 10)\n }\n this.#toString = undefined\n }\n\n #partsToRegExp(this: AST & { type: ExtglobType }, dot: boolean) {\n return this.#parts\n .map(p => {\n // extglob ASTs should only contain parent ASTs\n /* c8 ignore start */\n if (typeof p === 'string') {\n throw new Error('string type in extglob ast??')\n }\n /* c8 ignore stop */\n // can ignore hasMagic, because extglobs are already always magic\n const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot)\n this.#uflag = this.#uflag || uflag\n return re\n })\n .filter(p => !(this.isStart() && this.isEnd()) || !!p)\n .join('|')\n }\n\n static #parseGlob(\n glob: string,\n hasMagic: boolean | undefined,\n noEmpty: boolean = false,\n ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n let escaping = false\n let re = ''\n let uflag = false\n // multiple stars that aren't globstars coalesce into one *\n let inStar = false\n for (let i = 0; i < glob.length; i++) {\n const c = glob.charAt(i)\n if (escaping) {\n escaping = false\n re += (reSpecials.has(c) ? '\\\\' : '') + c\n continue\n }\n if (c === '*') {\n if (inStar) continue\n inStar = true\n re += noEmpty && /^[*]+$/.test(glob) ? starNoEmpty : star\n hasMagic = true\n continue\n } else {\n inStar = false\n }\n if (c === '\\\\') {\n if (i === glob.length - 1) {\n re += '\\\\\\\\'\n } else {\n escaping = true\n }\n continue\n }\n if (c === '[') {\n const [src, needUflag, consumed, magic] = parseClass(glob, i)\n if (consumed) {\n re += src\n uflag = uflag || needUflag\n i += consumed - 1\n hasMagic = hasMagic || magic\n continue\n }\n }\n if (c === '?') {\n re += qmark\n hasMagic = true\n continue\n }\n re += regExpEscape(c)\n }\n return [re, unescape(glob), !!hasMagic, uflag]\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts b/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts new file mode 100644 index 00000000..b1572deb --- /dev/null +++ b/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts @@ -0,0 +1,8 @@ +export type ParseClassResult = [ + src: string, + uFlag: boolean, + consumed: number, + hasMagic: boolean +]; +export declare const parseClass: (glob: string, position: number) => ParseClassResult; +//# sourceMappingURL=brace-expressions.d.ts.map \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts.map b/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts.map new file mode 100644 index 00000000..09b4c110 --- /dev/null +++ b/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"brace-expressions.d.ts","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"AAgCA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,OAAO;CAClB,CAAA;AAQD,eAAO,MAAM,UAAU,GACrB,MAAM,MAAM,EACZ,UAAU,MAAM,KACf,gBA2HF,CAAA"} \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/brace-expressions.js b/node_modules/minimatch/dist/commonjs/brace-expressions.js new file mode 100644 index 00000000..2b7b0371 --- /dev/null +++ b/node_modules/minimatch/dist/commonjs/brace-expressions.js @@ -0,0 +1,150 @@ +"use strict"; +// translate the various posix character classes into unicode properties +// this works across all unicode locales +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseClass = void 0; +// { : [, /u flag required, negated] +const posixClasses = { + '[:alnum:]': ['\\p{L}\\p{Nl}\\p{Nd}', true], + '[:alpha:]': ['\\p{L}\\p{Nl}', true], + '[:ascii:]': ['\\x' + '00-\\x' + '7f', false], + '[:blank:]': ['\\p{Zs}\\t', true], + '[:cntrl:]': ['\\p{Cc}', true], + '[:digit:]': ['\\p{Nd}', true], + '[:graph:]': ['\\p{Z}\\p{C}', true, true], + '[:lower:]': ['\\p{Ll}', true], + '[:print:]': ['\\p{C}', true], + '[:punct:]': ['\\p{P}', true], + '[:space:]': ['\\p{Z}\\t\\r\\n\\v\\f', true], + '[:upper:]': ['\\p{Lu}', true], + '[:word:]': ['\\p{L}\\p{Nl}\\p{Nd}\\p{Pc}', true], + '[:xdigit:]': ['A-Fa-f0-9', false], +}; +// only need to escape a few things inside of brace expressions +// escapes: [ \ ] - +const braceEscape = (s) => s.replace(/[[\]\\-]/g, '\\$&'); +// escape all regexp magic characters +const regexpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); +// everything has already been escaped, we just have to join +const rangesToString = (ranges) => ranges.join(''); +// takes a glob string at a posix brace expression, and returns +// an equivalent regular expression source, and boolean indicating +// whether the /u flag needs to be applied, and the number of chars +// consumed to parse the character class. +// This also removes out of order ranges, and returns ($.) if the +// entire class just no good. +const parseClass = (glob, position) => { + const pos = position; + /* c8 ignore start */ + if (glob.charAt(pos) !== '[') { + throw new Error('not in a brace expression'); + } + /* c8 ignore stop */ + const ranges = []; + const negs = []; + let i = pos + 1; + let sawStart = false; + let uflag = false; + let escaping = false; + let negate = false; + let endPos = pos; + let rangeStart = ''; + WHILE: while (i < glob.length) { + const c = glob.charAt(i); + if ((c === '!' || c === '^') && i === pos + 1) { + negate = true; + i++; + continue; + } + if (c === ']' && sawStart && !escaping) { + endPos = i + 1; + break; + } + sawStart = true; + if (c === '\\') { + if (!escaping) { + escaping = true; + i++; + continue; + } + // escaped \ char, fall through and treat like normal char + } + if (c === '[' && !escaping) { + // either a posix class, a collation equivalent, or just a [ + for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) { + if (glob.startsWith(cls, i)) { + // invalid, [a-[] is fine, but not [a-[:alpha]] + if (rangeStart) { + return ['$.', false, glob.length - pos, true]; + } + i += cls.length; + if (neg) + negs.push(unip); + else + ranges.push(unip); + uflag = uflag || u; + continue WHILE; + } + } + } + // now it's just a normal character, effectively + escaping = false; + if (rangeStart) { + // throw this range away if it's not valid, but others + // can still match. + if (c > rangeStart) { + ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c)); + } + else if (c === rangeStart) { + ranges.push(braceEscape(c)); + } + rangeStart = ''; + i++; + continue; + } + // now might be the start of a range. + // can be either c-d or c-] or c] or c] at this point + if (glob.startsWith('-]', i + 1)) { + ranges.push(braceEscape(c + '-')); + i += 2; + continue; + } + if (glob.startsWith('-', i + 1)) { + rangeStart = c; + i += 2; + continue; + } + // not the start of a range, just a single character + ranges.push(braceEscape(c)); + i++; + } + if (endPos < i) { + // didn't see the end of the class, not a valid class, + // but might still be valid as a literal match. + return ['', false, 0, false]; + } + // if we got no ranges and no negates, then we have a range that + // cannot possibly match anything, and that poisons the whole glob + if (!ranges.length && !negs.length) { + return ['$.', false, glob.length - pos, true]; + } + // if we got one positive range, and it's a single character, then that's + // not actually a magic pattern, it's just that one literal character. + // we should not treat that as "magic", we should just return the literal + // character. [_] is a perfectly valid way to escape glob magic chars. + if (negs.length === 0 && + ranges.length === 1 && + /^\\?.$/.test(ranges[0]) && + !negate) { + const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0]; + return [regexpEscape(r), false, endPos - pos, false]; + } + const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']'; + const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']'; + const comb = ranges.length && negs.length ? '(' + sranges + '|' + snegs + ')' + : ranges.length ? sranges + : snegs; + return [comb, uflag, endPos - pos, true]; +}; +exports.parseClass = parseClass; +//# sourceMappingURL=brace-expressions.js.map \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/brace-expressions.js.map b/node_modules/minimatch/dist/commonjs/brace-expressions.js.map new file mode 100644 index 00000000..3cc3b343 --- /dev/null +++ b/node_modules/minimatch/dist/commonjs/brace-expressions.js.map @@ -0,0 +1 @@ +{"version":3,"file":"brace-expressions.js","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"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","sourcesContent":["// translate the various posix character classes into unicode properties\n// this works across all unicode locales\n\n// { : [, /u flag required, negated]\nconst posixClasses: { [k: string]: [e: string, u: boolean, n?: boolean] } =\n {\n '[:alnum:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}', true],\n '[:alpha:]': ['\\\\p{L}\\\\p{Nl}', true],\n '[:ascii:]': ['\\\\x' + '00-\\\\x' + '7f', false],\n '[:blank:]': ['\\\\p{Zs}\\\\t', true],\n '[:cntrl:]': ['\\\\p{Cc}', true],\n '[:digit:]': ['\\\\p{Nd}', true],\n '[:graph:]': ['\\\\p{Z}\\\\p{C}', true, true],\n '[:lower:]': ['\\\\p{Ll}', true],\n '[:print:]': ['\\\\p{C}', true],\n '[:punct:]': ['\\\\p{P}', true],\n '[:space:]': ['\\\\p{Z}\\\\t\\\\r\\\\n\\\\v\\\\f', true],\n '[:upper:]': ['\\\\p{Lu}', true],\n '[:word:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}\\\\p{Pc}', true],\n '[:xdigit:]': ['A-Fa-f0-9', false],\n }\n\n// only need to escape a few things inside of brace expressions\n// escapes: [ \\ ] -\nconst braceEscape = (s: string) => s.replace(/[[\\]\\\\-]/g, '\\\\$&')\n// escape all regexp magic characters\nconst regexpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// everything has already been escaped, we just have to join\nconst rangesToString = (ranges: string[]): string => ranges.join('')\n\nexport type ParseClassResult = [\n src: string,\n uFlag: boolean,\n consumed: number,\n hasMagic: boolean,\n]\n\n// takes a glob string at a posix brace expression, and returns\n// an equivalent regular expression source, and boolean indicating\n// whether the /u flag needs to be applied, and the number of chars\n// consumed to parse the character class.\n// This also removes out of order ranges, and returns ($.) if the\n// entire class just no good.\nexport const parseClass = (\n glob: string,\n position: number,\n): ParseClassResult => {\n const pos = position\n /* c8 ignore start */\n if (glob.charAt(pos) !== '[') {\n throw new Error('not in a brace expression')\n }\n /* c8 ignore stop */\n const ranges: string[] = []\n const negs: string[] = []\n\n let i = pos + 1\n let sawStart = false\n let uflag = false\n let escaping = false\n let negate = false\n let endPos = pos\n let rangeStart = ''\n WHILE: while (i < glob.length) {\n const c = glob.charAt(i)\n if ((c === '!' || c === '^') && i === pos + 1) {\n negate = true\n i++\n continue\n }\n\n if (c === ']' && sawStart && !escaping) {\n endPos = i + 1\n break\n }\n\n sawStart = true\n if (c === '\\\\') {\n if (!escaping) {\n escaping = true\n i++\n continue\n }\n // escaped \\ char, fall through and treat like normal char\n }\n if (c === '[' && !escaping) {\n // either a posix class, a collation equivalent, or just a [\n for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {\n if (glob.startsWith(cls, i)) {\n // invalid, [a-[] is fine, but not [a-[:alpha]]\n if (rangeStart) {\n return ['$.', false, glob.length - pos, true]\n }\n i += cls.length\n if (neg) negs.push(unip)\n else ranges.push(unip)\n uflag = uflag || u\n continue WHILE\n }\n }\n }\n\n // now it's just a normal character, effectively\n escaping = false\n if (rangeStart) {\n // throw this range away if it's not valid, but others\n // can still match.\n if (c > rangeStart) {\n ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c))\n } else if (c === rangeStart) {\n ranges.push(braceEscape(c))\n }\n rangeStart = ''\n i++\n continue\n }\n\n // now might be the start of a range.\n // can be either c-d or c-] or c] or c] at this point\n if (glob.startsWith('-]', i + 1)) {\n ranges.push(braceEscape(c + '-'))\n i += 2\n continue\n }\n if (glob.startsWith('-', i + 1)) {\n rangeStart = c\n i += 2\n continue\n }\n\n // not the start of a range, just a single character\n ranges.push(braceEscape(c))\n i++\n }\n\n if (endPos < i) {\n // didn't see the end of the class, not a valid class,\n // but might still be valid as a literal match.\n return ['', false, 0, false]\n }\n\n // if we got no ranges and no negates, then we have a range that\n // cannot possibly match anything, and that poisons the whole glob\n if (!ranges.length && !negs.length) {\n return ['$.', false, glob.length - pos, true]\n }\n\n // if we got one positive range, and it's a single character, then that's\n // not actually a magic pattern, it's just that one literal character.\n // we should not treat that as \"magic\", we should just return the literal\n // character. [_] is a perfectly valid way to escape glob magic chars.\n if (\n negs.length === 0 &&\n ranges.length === 1 &&\n /^\\\\?.$/.test(ranges[0]) &&\n !negate\n ) {\n const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0]\n return [regexpEscape(r), false, endPos - pos, false]\n }\n\n const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']'\n const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']'\n const comb =\n ranges.length && negs.length ? '(' + sranges + '|' + snegs + ')'\n : ranges.length ? sranges\n : snegs\n\n return [comb, uflag, endPos - pos, true]\n}\n"]} \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/escape.d.ts b/node_modules/minimatch/dist/commonjs/escape.d.ts new file mode 100644 index 00000000..141024a0 --- /dev/null +++ b/node_modules/minimatch/dist/commonjs/escape.d.ts @@ -0,0 +1,15 @@ +import type { MinimatchOptions } from './index.js'; +/** + * Escape all magic characters in a glob pattern. + * + * If the {@link MinimatchOptions.windowsPathsNoEscape} + * option is used, then characters are escaped by wrapping in `[]`, because + * a magic character wrapped in a character class can only be satisfied by + * that exact character. In this mode, `\` is _not_ escaped, because it is + * not interpreted as a magic character, but instead as a path separator. + * + * If the {@link MinimatchOptions.magicalBraces} option is used, + * then braces (`{` and `}`) will be escaped. + */ +export declare const escape: (s: string, { windowsPathsNoEscape, magicalBraces, }?: Pick) => string; +//# sourceMappingURL=escape.d.ts.map \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/escape.d.ts.map b/node_modules/minimatch/dist/commonjs/escape.d.ts.map new file mode 100644 index 00000000..e167e300 --- /dev/null +++ b/node_modules/minimatch/dist/commonjs/escape.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"escape.d.ts","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,MAAM,GACjB,GAAG,MAAM,EACT,2CAGG,IAAI,CAAC,gBAAgB,EAAE,sBAAsB,GAAG,eAAe,CAAM,WAazE,CAAA"} \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/escape.js b/node_modules/minimatch/dist/commonjs/escape.js new file mode 100644 index 00000000..83a713a2 --- /dev/null +++ b/node_modules/minimatch/dist/commonjs/escape.js @@ -0,0 +1,30 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.escape = void 0; +/** + * Escape all magic characters in a glob pattern. + * + * If the {@link MinimatchOptions.windowsPathsNoEscape} + * option is used, then characters are escaped by wrapping in `[]`, because + * a magic character wrapped in a character class can only be satisfied by + * that exact character. In this mode, `\` is _not_ escaped, because it is + * not interpreted as a magic character, but instead as a path separator. + * + * If the {@link MinimatchOptions.magicalBraces} option is used, + * then braces (`{` and `}`) will be escaped. + */ +const escape = (s, { windowsPathsNoEscape = false, magicalBraces = false, } = {}) => { + // don't need to escape +@! because we escape the parens + // that make those magic, and escaping ! as [!] isn't valid, + // because [!]] is a valid glob class meaning not ']'. + if (magicalBraces) { + return windowsPathsNoEscape ? + s.replace(/[?*()[\]{}]/g, '[$&]') + : s.replace(/[?*()[\]\\{}]/g, '\\$&'); + } + return windowsPathsNoEscape ? + s.replace(/[?*()[\]]/g, '[$&]') + : s.replace(/[?*()[\]\\]/g, '\\$&'); +}; +exports.escape = escape; +//# sourceMappingURL=escape.js.map \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/escape.js.map b/node_modules/minimatch/dist/commonjs/escape.js.map new file mode 100644 index 00000000..f963f0a1 --- /dev/null +++ b/node_modules/minimatch/dist/commonjs/escape.js.map @@ -0,0 +1 @@ +{"version":3,"file":"escape.js","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;;;;GAWG;AACI,MAAM,MAAM,GAAG,CACpB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,EAC5B,aAAa,GAAG,KAAK,MAC+C,EAAE,EACxE,EAAE;IACF,wDAAwD;IACxD,4DAA4D;IAC5D,sDAAsD;IACtD,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,oBAAoB,CAAC,CAAC;YACzB,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC;YACnC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAA;IACzC,CAAC;IACD,OAAO,oBAAoB,CAAC,CAAC;QACzB,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC;QACjC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;AACvC,CAAC,CAAA;AAlBY,QAAA,MAAM,UAkBlB","sourcesContent":["import type { MinimatchOptions } from './index.js'\n\n/**\n * Escape all magic characters in a glob pattern.\n *\n * If the {@link MinimatchOptions.windowsPathsNoEscape}\n * option is used, then characters are escaped by wrapping in `[]`, because\n * a magic character wrapped in a character class can only be satisfied by\n * that exact character. In this mode, `\\` is _not_ escaped, because it is\n * not interpreted as a magic character, but instead as a path separator.\n *\n * If the {@link MinimatchOptions.magicalBraces} option is used,\n * then braces (`{` and `}`) will be escaped.\n */\nexport const escape = (\n s: string,\n {\n windowsPathsNoEscape = false,\n magicalBraces = false,\n }: Pick = {},\n) => {\n // don't need to escape +@! because we escape the parens\n // that make those magic, and escaping ! as [!] isn't valid,\n // because [!]] is a valid glob class meaning not ']'.\n if (magicalBraces) {\n return windowsPathsNoEscape ?\n s.replace(/[?*()[\\]{}]/g, '[$&]')\n : s.replace(/[?*()[\\]\\\\{}]/g, '\\\\$&')\n }\n return windowsPathsNoEscape ?\n s.replace(/[?*()[\\]]/g, '[$&]')\n : s.replace(/[?*()[\\]\\\\]/g, '\\\\$&')\n}\n"]} \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/index.d.ts b/node_modules/minimatch/dist/commonjs/index.d.ts new file mode 100644 index 00000000..7e1fc2ed --- /dev/null +++ b/node_modules/minimatch/dist/commonjs/index.d.ts @@ -0,0 +1,174 @@ +import { AST } from './ast.js'; +export type Platform = 'aix' | 'android' | 'darwin' | 'freebsd' | 'haiku' | 'linux' | 'openbsd' | 'sunos' | 'win32' | 'cygwin' | 'netbsd'; +export interface MinimatchOptions { + /** do not expand `{x,y}` style braces */ + nobrace?: boolean; + /** do not treat patterns starting with `#` as a comment */ + nocomment?: boolean; + /** do not treat patterns starting with `!` as a negation */ + nonegate?: boolean; + /** print LOTS of debugging output */ + debug?: boolean; + /** treat `**` the same as `*` */ + noglobstar?: boolean; + /** do not expand extglobs like `+(a|b)` */ + noext?: boolean; + /** return the pattern if nothing matches */ + nonull?: boolean; + /** treat `\\` as a path separator, not an escape character */ + windowsPathsNoEscape?: boolean; + /** + * inverse of {@link MinimatchOptions.windowsPathsNoEscape} + * @deprecated + */ + allowWindowsEscape?: boolean; + /** + * Compare a partial path to a pattern. As long as the parts + * of the path that are present are not contradicted by the + * pattern, it will be treated as a match. This is useful in + * applications where you're walking through a folder structure, + * and don't yet have the full path, but want to ensure that you + * do not walk down paths that can never be a match. + */ + partial?: boolean; + /** allow matches that start with `.` even if the pattern does not */ + dot?: boolean; + /** ignore case */ + nocase?: boolean; + /** ignore case only in wildcard patterns */ + nocaseMagicOnly?: boolean; + /** consider braces to be "magic" for the purpose of `hasMagic` */ + magicalBraces?: boolean; + /** + * If set, then patterns without slashes will be matched + * against the basename of the path if it contains slashes. + * For example, `a?b` would match the path `/xyz/123/acb`, but + * not `/xyz/acb/123`. + */ + matchBase?: boolean; + /** invert the results of negated matches */ + flipNegate?: boolean; + /** do not collapse multiple `/` into a single `/` */ + preserveMultipleSlashes?: boolean; + /** + * A number indicating the level of optimization that should be done + * to the pattern prior to parsing and using it for matches. + */ + optimizationLevel?: number; + /** operating system platform */ + platform?: Platform; + /** + * When a pattern starts with a UNC path or drive letter, and in + * `nocase:true` mode, do not convert the root portions of the + * pattern into a case-insensitive regular expression, and instead + * leave them as strings. + * + * This is the default when the platform is `win32` and + * `nocase:true` is set. + */ + windowsNoMagicRoot?: boolean; + /** + * max number of `{...}` patterns to expand. Default 100_000. + */ + braceExpandMax?: number; + /** + * Max number of non-adjacent `**` patterns to recursively walk down. + * + * The default of 200 is almost certainly high enough for most purposes, + * and can handle absurdly excessive patterns. + */ + maxGlobstarRecursion?: number; + /** + * Max depth to traverse for nested extglobs like `*(a|b|c)` + * + * Default is 2, which is quite low, but any higher value + * swiftly results in punishing performance impacts. Note + * that this is *not* relevant when the globstar types can + * be safely coalesced into a single set. + * + * For example, `*(a|@(b|c)|d)` would be flattened into + * `*(a|b|c|d)`. Thus, many common extglobs will retain good + * performance and never hit this limit, even if they are + * excessively deep and complicated. + * + * If the limit is hit, then the extglob characters are simply + * not parsed, and the pattern effectively switches into + * `noextglob: true` mode for the contents of that nested + * sub-pattern. This will typically _not_ result in a match, + * but is considered a valid trade-off for security and + * performance. + */ + maxExtglobRecursion?: number; +} +export declare const minimatch: { + (p: string, pattern: string, options?: MinimatchOptions): boolean; + sep: Sep; + GLOBSTAR: typeof GLOBSTAR; + filter: (pattern: string, options?: MinimatchOptions) => (p: string) => boolean; + defaults: (def: MinimatchOptions) => typeof minimatch; + braceExpand: (pattern: string, options?: MinimatchOptions) => string[]; + makeRe: (pattern: string, options?: MinimatchOptions) => false | MMRegExp; + match: (list: string[], pattern: string, options?: MinimatchOptions) => string[]; + AST: typeof AST; + Minimatch: typeof Minimatch; + escape: (s: string, { windowsPathsNoEscape, magicalBraces, }?: Pick) => string; + unescape: (s: string, { windowsPathsNoEscape, magicalBraces, }?: Pick) => string; +}; +export type Sep = '\\' | '/'; +export declare const sep: Sep; +export declare const GLOBSTAR: unique symbol; +export declare const filter: (pattern: string, options?: MinimatchOptions) => (p: string) => boolean; +export declare const defaults: (def: MinimatchOptions) => typeof minimatch; +export declare const braceExpand: (pattern: string, options?: MinimatchOptions) => string[]; +export declare const makeRe: (pattern: string, options?: MinimatchOptions) => false | MMRegExp; +export declare const match: (list: string[], pattern: string, options?: MinimatchOptions) => string[]; +export type MMRegExp = RegExp & { + _src?: string; + _glob?: string; +}; +export type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR; +export type ParseReturn = ParseReturnFiltered | false; +export declare class Minimatch { + #private; + options: MinimatchOptions; + set: ParseReturnFiltered[][]; + pattern: string; + windowsPathsNoEscape: boolean; + nonegate: boolean; + negate: boolean; + comment: boolean; + empty: boolean; + preserveMultipleSlashes: boolean; + partial: boolean; + globSet: string[]; + globParts: string[][]; + nocase: boolean; + isWindows: boolean; + platform: Platform; + windowsNoMagicRoot: boolean; + maxGlobstarRecursion: number; + regexp: false | null | MMRegExp; + constructor(pattern: string, options?: MinimatchOptions); + hasMagic(): boolean; + debug(..._: unknown[]): void; + make(): void; + preprocess(globParts: string[][]): string[][]; + adjascentGlobstarOptimize(globParts: string[][]): string[][]; + levelOneOptimize(globParts: string[][]): string[][]; + levelTwoFileOptimize(parts: string | string[]): string[]; + firstPhasePreProcess(globParts: string[][]): string[][]; + secondPhasePreProcess(globParts: string[][]): string[][]; + partsMatch(a: string[], b: string[], emptyGSMatch?: boolean): false | string[]; + parseNegate(): void; + matchOne(file: string[], pattern: ParseReturn[], partial?: boolean): boolean; + braceExpand(): string[]; + parse(pattern: string): ParseReturn; + makeRe(): false | MMRegExp; + slashSplit(p: string): string[]; + match(f: string, partial?: boolean): boolean; + static defaults(def: MinimatchOptions): typeof Minimatch; +} +export { AST } from './ast.js'; +export { escape } from './escape.js'; +export { unescape } from './unescape.js'; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/index.d.ts.map b/node_modules/minimatch/dist/commonjs/index.d.ts.map new file mode 100644 index 00000000..7620db91 --- /dev/null +++ b/node_modules/minimatch/dist/commonjs/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/index.js b/node_modules/minimatch/dist/commonjs/index.js new file mode 100644 index 00000000..5a698348 --- /dev/null +++ b/node_modules/minimatch/dist/commonjs/index.js @@ -0,0 +1,1127 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.unescape = exports.escape = exports.AST = exports.Minimatch = exports.match = exports.makeRe = exports.braceExpand = exports.defaults = exports.filter = exports.GLOBSTAR = exports.sep = exports.minimatch = void 0; +const brace_expansion_1 = require("brace-expansion"); +const assert_valid_pattern_js_1 = require("./assert-valid-pattern.js"); +const ast_js_1 = require("./ast.js"); +const escape_js_1 = require("./escape.js"); +const unescape_js_1 = require("./unescape.js"); +const minimatch = (p, pattern, options = {}) => { + (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); + // shortcut: comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + return false; + } + return new Minimatch(pattern, options).match(p); +}; +exports.minimatch = minimatch; +// Optimized checking for the most common glob patterns. +const starDotExtRE = /^\*+([^+@!?*[(]*)$/; +const starDotExtTest = (ext) => (f) => !f.startsWith('.') && f.endsWith(ext); +const starDotExtTestDot = (ext) => (f) => f.endsWith(ext); +const starDotExtTestNocase = (ext) => { + ext = ext.toLowerCase(); + return (f) => !f.startsWith('.') && f.toLowerCase().endsWith(ext); +}; +const starDotExtTestNocaseDot = (ext) => { + ext = ext.toLowerCase(); + return (f) => f.toLowerCase().endsWith(ext); +}; +const starDotStarRE = /^\*+\.\*+$/; +const starDotStarTest = (f) => !f.startsWith('.') && f.includes('.'); +const starDotStarTestDot = (f) => f !== '.' && f !== '..' && f.includes('.'); +const dotStarRE = /^\.\*+$/; +const dotStarTest = (f) => f !== '.' && f !== '..' && f.startsWith('.'); +const starRE = /^\*+$/; +const starTest = (f) => f.length !== 0 && !f.startsWith('.'); +const starTestDot = (f) => f.length !== 0 && f !== '.' && f !== '..'; +const qmarksRE = /^\?+([^+@!?*[(]*)?$/; +const qmarksTestNocase = ([$0, ext = '']) => { + const noext = qmarksTestNoExt([$0]); + if (!ext) + return noext; + ext = ext.toLowerCase(); + return (f) => noext(f) && f.toLowerCase().endsWith(ext); +}; +const qmarksTestNocaseDot = ([$0, ext = '']) => { + const noext = qmarksTestNoExtDot([$0]); + if (!ext) + return noext; + ext = ext.toLowerCase(); + return (f) => noext(f) && f.toLowerCase().endsWith(ext); +}; +const qmarksTestDot = ([$0, ext = '']) => { + const noext = qmarksTestNoExtDot([$0]); + return !ext ? noext : (f) => noext(f) && f.endsWith(ext); +}; +const qmarksTest = ([$0, ext = '']) => { + const noext = qmarksTestNoExt([$0]); + return !ext ? noext : (f) => noext(f) && f.endsWith(ext); +}; +const qmarksTestNoExt = ([$0]) => { + const len = $0.length; + return (f) => f.length === len && !f.startsWith('.'); +}; +const qmarksTestNoExtDot = ([$0]) => { + const len = $0.length; + return (f) => f.length === len && f !== '.' && f !== '..'; +}; +/* c8 ignore start */ +const defaultPlatform = (typeof process === 'object' && process ? + (typeof process.env === 'object' && + process.env && + process.env.__MINIMATCH_TESTING_PLATFORM__) || + process.platform + : 'posix'); +const path = { + win32: { sep: '\\' }, + posix: { sep: '/' }, +}; +/* c8 ignore stop */ +exports.sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep; +exports.minimatch.sep = exports.sep; +exports.GLOBSTAR = Symbol('globstar **'); +exports.minimatch.GLOBSTAR = exports.GLOBSTAR; +// any single thing other than / +// don't need to escape / when using new RegExp() +const qmark = '[^/]'; +// * => any number of characters +const star = qmark + '*?'; +// ** when dots are allowed. Anything goes, except .. and . +// not (^ or / followed by one or two dots followed by $ or /), +// followed by anything, any number of times. +const twoStarDot = '(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?'; +// not a ^ or / followed by a dot, +// followed by anything, any number of times. +const twoStarNoDot = '(?:(?!(?:\\/|^)\\.).)*?'; +const filter = (pattern, options = {}) => (p) => (0, exports.minimatch)(p, pattern, options); +exports.filter = filter; +exports.minimatch.filter = exports.filter; +const ext = (a, b = {}) => Object.assign({}, a, b); +const defaults = (def) => { + if (!def || typeof def !== 'object' || !Object.keys(def).length) { + return exports.minimatch; + } + const orig = exports.minimatch; + const m = (p, pattern, options = {}) => orig(p, pattern, ext(def, options)); + return Object.assign(m, { + Minimatch: class Minimatch extends orig.Minimatch { + constructor(pattern, options = {}) { + super(pattern, ext(def, options)); + } + static defaults(options) { + return orig.defaults(ext(def, options)).Minimatch; + } + }, + AST: class AST extends orig.AST { + /* c8 ignore start */ + constructor(type, parent, options = {}) { + super(type, parent, ext(def, options)); + } + /* c8 ignore stop */ + static fromGlob(pattern, options = {}) { + return orig.AST.fromGlob(pattern, ext(def, options)); + } + }, + unescape: (s, options = {}) => orig.unescape(s, ext(def, options)), + escape: (s, options = {}) => orig.escape(s, ext(def, options)), + filter: (pattern, options = {}) => orig.filter(pattern, ext(def, options)), + defaults: (options) => orig.defaults(ext(def, options)), + makeRe: (pattern, options = {}) => orig.makeRe(pattern, ext(def, options)), + braceExpand: (pattern, options = {}) => orig.braceExpand(pattern, ext(def, options)), + match: (list, pattern, options = {}) => orig.match(list, pattern, ext(def, options)), + sep: orig.sep, + GLOBSTAR: exports.GLOBSTAR, + }); +}; +exports.defaults = defaults; +exports.minimatch.defaults = exports.defaults; +// Brace expansion: +// a{b,c}d -> abd acd +// a{b,}c -> abc ac +// a{0..3}d -> a0d a1d a2d a3d +// a{b,c{d,e}f}g -> abg acdfg acefg +// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg +// +// Invalid sets are not expanded. +// a{2..}b -> a{2..}b +// a{b}c -> a{b}c +const braceExpand = (pattern, options = {}) => { + (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); + // Thanks to Yeting Li for + // improving this regexp to avoid a ReDOS vulnerability. + if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) { + // shortcut. no need to expand. + return [pattern]; + } + return (0, brace_expansion_1.expand)(pattern, { max: options.braceExpandMax }); +}; +exports.braceExpand = braceExpand; +exports.minimatch.braceExpand = exports.braceExpand; +// parse a component of the expanded set. +// At this point, no pattern may contain "/" in it +// so we're going to return a 2d array, where each entry is the full +// pattern, split on '/', and then turned into a regular expression. +// A regexp is made at the end which joins each array with an +// escaped /, and another full one which joins each regexp with |. +// +// Following the lead of Bash 4.1, note that "**" only has special meaning +// when it is the *only* thing in a path portion. Otherwise, any series +// of * is equivalent to a single *. Globstar behavior is enabled by +// default, and can be disabled by setting options.noglobstar. +const makeRe = (pattern, options = {}) => new Minimatch(pattern, options).makeRe(); +exports.makeRe = makeRe; +exports.minimatch.makeRe = exports.makeRe; +const match = (list, pattern, options = {}) => { + const mm = new Minimatch(pattern, options); + list = list.filter(f => mm.match(f)); + if (mm.options.nonull && !list.length) { + list.push(pattern); + } + return list; +}; +exports.match = match; +exports.minimatch.match = exports.match; +// replace stuff like \* with * +const globMagic = /[?*]|[+@!]\(.*?\)|\[|\]/; +const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); +class Minimatch { + options; + set; + pattern; + windowsPathsNoEscape; + nonegate; + negate; + comment; + empty; + preserveMultipleSlashes; + partial; + globSet; + globParts; + nocase; + isWindows; + platform; + windowsNoMagicRoot; + maxGlobstarRecursion; + regexp; + constructor(pattern, options = {}) { + (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); + options = options || {}; + this.options = options; + this.maxGlobstarRecursion = options.maxGlobstarRecursion ?? 200; + this.pattern = pattern; + this.platform = options.platform || defaultPlatform; + this.isWindows = this.platform === 'win32'; + // avoid the annoying deprecation flag lol + const awe = ('allowWindow' + 'sEscape'); + this.windowsPathsNoEscape = + !!options.windowsPathsNoEscape || options[awe] === false; + if (this.windowsPathsNoEscape) { + this.pattern = this.pattern.replace(/\\/g, '/'); + } + this.preserveMultipleSlashes = !!options.preserveMultipleSlashes; + this.regexp = null; + this.negate = false; + this.nonegate = !!options.nonegate; + this.comment = false; + this.empty = false; + this.partial = !!options.partial; + this.nocase = !!this.options.nocase; + this.windowsNoMagicRoot = + options.windowsNoMagicRoot !== undefined ? + options.windowsNoMagicRoot + : !!(this.isWindows && this.nocase); + this.globSet = []; + this.globParts = []; + this.set = []; + // make the set of regexps etc. + this.make(); + } + hasMagic() { + if (this.options.magicalBraces && this.set.length > 1) { + return true; + } + for (const pattern of this.set) { + for (const part of pattern) { + if (typeof part !== 'string') + return true; + } + } + return false; + } + debug(..._) { } + make() { + const pattern = this.pattern; + const options = this.options; + // empty patterns and comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + this.comment = true; + return; + } + if (!pattern) { + this.empty = true; + return; + } + // step 1: figure out negation, etc. + this.parseNegate(); + // step 2: expand braces + this.globSet = [...new Set(this.braceExpand())]; + if (options.debug) { + //oxlint-disable-next-line no-console + this.debug = (...args) => console.error(...args); + } + this.debug(this.pattern, this.globSet); + // step 3: now we have a set, so turn each one into a series of + // path-portion matching patterns. + // These will be regexps, except in the case of "**", which is + // set to the GLOBSTAR object for globstar behavior, + // and will not contain any / characters + // + // First, we preprocess to make the glob pattern sets a bit simpler + // and deduped. There are some perf-killing patterns that can cause + // problems with a glob walk, but we can simplify them down a bit. + const rawGlobParts = this.globSet.map(s => this.slashSplit(s)); + this.globParts = this.preprocess(rawGlobParts); + this.debug(this.pattern, this.globParts); + // glob --> regexps + let set = this.globParts.map((s, _, __) => { + if (this.isWindows && this.windowsNoMagicRoot) { + // check if it's a drive or unc path. + const isUNC = s[0] === '' && + s[1] === '' && + (s[2] === '?' || !globMagic.test(s[2])) && + !globMagic.test(s[3]); + const isDrive = /^[a-z]:/i.test(s[0]); + if (isUNC) { + return [ + ...s.slice(0, 4), + ...s.slice(4).map(ss => this.parse(ss)), + ]; + } + else if (isDrive) { + return [s[0], ...s.slice(1).map(ss => this.parse(ss))]; + } + } + return s.map(ss => this.parse(ss)); + }); + this.debug(this.pattern, set); + // filter out everything that didn't compile properly. + this.set = set.filter(s => s.indexOf(false) === -1); + // do not treat the ? in UNC paths as magic + if (this.isWindows) { + for (let i = 0; i < this.set.length; i++) { + const p = this.set[i]; + if (p[0] === '' && + p[1] === '' && + this.globParts[i][2] === '?' && + typeof p[3] === 'string' && + /^[a-z]:$/i.test(p[3])) { + p[2] = '?'; + } + } + } + this.debug(this.pattern, this.set); + } + // various transforms to equivalent pattern sets that are + // faster to process in a filesystem walk. The goal is to + // eliminate what we can, and push all ** patterns as far + // to the right as possible, even if it increases the number + // of patterns that we have to process. + preprocess(globParts) { + // if we're not in globstar mode, then turn ** into * + if (this.options.noglobstar) { + for (const partset of globParts) { + for (let j = 0; j < partset.length; j++) { + if (partset[j] === '**') { + partset[j] = '*'; + } + } + } + } + const { optimizationLevel = 1 } = this.options; + if (optimizationLevel >= 2) { + // aggressive optimization for the purpose of fs walking + globParts = this.firstPhasePreProcess(globParts); + globParts = this.secondPhasePreProcess(globParts); + } + else if (optimizationLevel >= 1) { + // just basic optimizations to remove some .. parts + globParts = this.levelOneOptimize(globParts); + } + else { + // just collapse multiple ** portions into one + globParts = this.adjascentGlobstarOptimize(globParts); + } + return globParts; + } + // just get rid of adjascent ** portions + adjascentGlobstarOptimize(globParts) { + return globParts.map(parts => { + let gs = -1; + while (-1 !== (gs = parts.indexOf('**', gs + 1))) { + let i = gs; + while (parts[i + 1] === '**') { + i++; + } + if (i !== gs) { + parts.splice(gs, i - gs); + } + } + return parts; + }); + } + // get rid of adjascent ** and resolve .. portions + levelOneOptimize(globParts) { + return globParts.map(parts => { + parts = parts.reduce((set, part) => { + const prev = set[set.length - 1]; + if (part === '**' && prev === '**') { + return set; + } + if (part === '..') { + if (prev && prev !== '..' && prev !== '.' && prev !== '**') { + set.pop(); + return set; + } + } + set.push(part); + return set; + }, []); + return parts.length === 0 ? [''] : parts; + }); + } + levelTwoFileOptimize(parts) { + if (!Array.isArray(parts)) { + parts = this.slashSplit(parts); + } + let didSomething = false; + do { + didSomething = false; + //

      // -> 
      /
      +            if (!this.preserveMultipleSlashes) {
      +                for (let i = 1; i < parts.length - 1; i++) {
      +                    const p = parts[i];
      +                    // don't squeeze out UNC patterns
      +                    if (i === 1 && p === '' && parts[0] === '')
      +                        continue;
      +                    if (p === '.' || p === '') {
      +                        didSomething = true;
      +                        parts.splice(i, 1);
      +                        i--;
      +                    }
      +                }
      +                if (parts[0] === '.' &&
      +                    parts.length === 2 &&
      +                    (parts[1] === '.' || parts[1] === '')) {
      +                    didSomething = true;
      +                    parts.pop();
      +                }
      +            }
      +            // 
      /

      /../ ->

      /
      +            let dd = 0;
      +            while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
      +                const p = parts[dd - 1];
      +                if (p &&
      +                    p !== '.' &&
      +                    p !== '..' &&
      +                    p !== '**' &&
      +                    !(this.isWindows && /^[a-z]:$/i.test(p))) {
      +                    didSomething = true;
      +                    parts.splice(dd - 1, 2);
      +                    dd -= 2;
      +                }
      +            }
      +        } while (didSomething);
      +        return parts.length === 0 ? [''] : parts;
      +    }
      +    // First phase: single-pattern processing
      +    // 
       is 1 or more portions
      +    //  is 1 or more portions
      +    // 

      is any portion other than ., .., '', or ** + // is . or '' + // + // **/.. is *brutal* for filesystem walking performance, because + // it effectively resets the recursive walk each time it occurs, + // and ** cannot be reduced out by a .. pattern part like a regexp + // or most strings (other than .., ., and '') can be. + // + //

      /**/../

      /

      / -> {

      /../

      /

      /,

      /**/

      /

      /} + //

      // -> 
      /
      +    // 
      /

      /../ ->

      /
      +    // **/**/ -> **/
      +    //
      +    // **/*/ -> */**/ <== not valid because ** doesn't follow
      +    // this WOULD be allowed if ** did follow symlinks, or * didn't
      +    firstPhasePreProcess(globParts) {
      +        let didSomething = false;
      +        do {
      +            didSomething = false;
      +            // 
      /**/../

      /

      / -> {

      /../

      /

      /,

      /**/

      /

      /} + for (let parts of globParts) { + let gs = -1; + while (-1 !== (gs = parts.indexOf('**', gs + 1))) { + let gss = gs; + while (parts[gss + 1] === '**') { + //

      /**/**/ -> 
      /**/
      +                        gss++;
      +                    }
      +                    // eg, if gs is 2 and gss is 4, that means we have 3 **
      +                    // parts, and can remove 2 of them.
      +                    if (gss > gs) {
      +                        parts.splice(gs + 1, gss - gs);
      +                    }
      +                    let next = parts[gs + 1];
      +                    const p = parts[gs + 2];
      +                    const p2 = parts[gs + 3];
      +                    if (next !== '..')
      +                        continue;
      +                    if (!p ||
      +                        p === '.' ||
      +                        p === '..' ||
      +                        !p2 ||
      +                        p2 === '.' ||
      +                        p2 === '..') {
      +                        continue;
      +                    }
      +                    didSomething = true;
      +                    // edit parts in place, and push the new one
      +                    parts.splice(gs, 1);
      +                    const other = parts.slice(0);
      +                    other[gs] = '**';
      +                    globParts.push(other);
      +                    gs--;
      +                }
      +                // 
      // -> 
      /
      +                if (!this.preserveMultipleSlashes) {
      +                    for (let i = 1; i < parts.length - 1; i++) {
      +                        const p = parts[i];
      +                        // don't squeeze out UNC patterns
      +                        if (i === 1 && p === '' && parts[0] === '')
      +                            continue;
      +                        if (p === '.' || p === '') {
      +                            didSomething = true;
      +                            parts.splice(i, 1);
      +                            i--;
      +                        }
      +                    }
      +                    if (parts[0] === '.' &&
      +                        parts.length === 2 &&
      +                        (parts[1] === '.' || parts[1] === '')) {
      +                        didSomething = true;
      +                        parts.pop();
      +                    }
      +                }
      +                // 
      /

      /../ ->

      /
      +                let dd = 0;
      +                while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
      +                    const p = parts[dd - 1];
      +                    if (p && p !== '.' && p !== '..' && p !== '**') {
      +                        didSomething = true;
      +                        const needDot = dd === 1 && parts[dd + 1] === '**';
      +                        const splin = needDot ? ['.'] : [];
      +                        parts.splice(dd - 1, 2, ...splin);
      +                        if (parts.length === 0)
      +                            parts.push('');
      +                        dd -= 2;
      +                    }
      +                }
      +            }
      +        } while (didSomething);
      +        return globParts;
      +    }
      +    // second phase: multi-pattern dedupes
      +    // {
      /*/,
      /

      /} ->

      /*/
      +    // {
      /,
      /} -> 
      /
      +    // {
      /**/,
      /} -> 
      /**/
      +    //
      +    // {
      /**/,
      /**/

      /} ->

      /**/
      +    // ^-- not valid because ** doens't follow symlinks
      +    secondPhasePreProcess(globParts) {
      +        for (let i = 0; i < globParts.length - 1; i++) {
      +            for (let j = i + 1; j < globParts.length; j++) {
      +                const matched = this.partsMatch(globParts[i], globParts[j], !this.preserveMultipleSlashes);
      +                if (matched) {
      +                    globParts[i] = [];
      +                    globParts[j] = matched;
      +                    break;
      +                }
      +            }
      +        }
      +        return globParts.filter(gs => gs.length);
      +    }
      +    partsMatch(a, b, emptyGSMatch = false) {
      +        let ai = 0;
      +        let bi = 0;
      +        let result = [];
      +        let which = '';
      +        while (ai < a.length && bi < b.length) {
      +            if (a[ai] === b[bi]) {
      +                result.push(which === 'b' ? b[bi] : a[ai]);
      +                ai++;
      +                bi++;
      +            }
      +            else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {
      +                result.push(a[ai]);
      +                ai++;
      +            }
      +            else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {
      +                result.push(b[bi]);
      +                bi++;
      +            }
      +            else if (a[ai] === '*' &&
      +                b[bi] &&
      +                (this.options.dot || !b[bi].startsWith('.')) &&
      +                b[bi] !== '**') {
      +                if (which === 'b')
      +                    return false;
      +                which = 'a';
      +                result.push(a[ai]);
      +                ai++;
      +                bi++;
      +            }
      +            else if (b[bi] === '*' &&
      +                a[ai] &&
      +                (this.options.dot || !a[ai].startsWith('.')) &&
      +                a[ai] !== '**') {
      +                if (which === 'a')
      +                    return false;
      +                which = 'b';
      +                result.push(b[bi]);
      +                ai++;
      +                bi++;
      +            }
      +            else {
      +                return false;
      +            }
      +        }
      +        // if we fall out of the loop, it means they two are identical
      +        // as long as their lengths match
      +        return a.length === b.length && result;
      +    }
      +    parseNegate() {
      +        if (this.nonegate)
      +            return;
      +        const pattern = this.pattern;
      +        let negate = false;
      +        let negateOffset = 0;
      +        for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {
      +            negate = !negate;
      +            negateOffset++;
      +        }
      +        if (negateOffset)
      +            this.pattern = pattern.slice(negateOffset);
      +        this.negate = negate;
      +    }
      +    // set partial to true to test if, for example,
      +    // "/a/b" matches the start of "/*/b/*/d"
      +    // Partial means, if you run out of file before you run
      +    // out of pattern, then that's fine, as long as all
      +    // the parts match.
      +    matchOne(file, pattern, partial = false) {
      +        let fileStartIndex = 0;
      +        let patternStartIndex = 0;
      +        // UNC paths like //?/X:/... can match X:/... and vice versa
      +        // Drive letters in absolute drive or unc paths are always compared
      +        // case-insensitively.
      +        if (this.isWindows) {
      +            const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0]);
      +            const fileUNC = !fileDrive &&
      +                file[0] === '' &&
      +                file[1] === '' &&
      +                file[2] === '?' &&
      +                /^[a-z]:$/i.test(file[3]);
      +            const patternDrive = typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0]);
      +            const patternUNC = !patternDrive &&
      +                pattern[0] === '' &&
      +                pattern[1] === '' &&
      +                pattern[2] === '?' &&
      +                typeof pattern[3] === 'string' &&
      +                /^[a-z]:$/i.test(pattern[3]);
      +            const fdi = fileUNC ? 3
      +                : fileDrive ? 0
      +                    : undefined;
      +            const pdi = patternUNC ? 3
      +                : patternDrive ? 0
      +                    : undefined;
      +            if (typeof fdi === 'number' && typeof pdi === 'number') {
      +                const [fd, pd] = [
      +                    file[fdi],
      +                    pattern[pdi],
      +                ];
      +                // start matching at the drive letter index of each
      +                if (fd.toLowerCase() === pd.toLowerCase()) {
      +                    pattern[pdi] = fd;
      +                    patternStartIndex = pdi;
      +                    fileStartIndex = fdi;
      +                }
      +            }
      +        }
      +        // resolve and reduce . and .. portions in the file as well.
      +        // don't need to do the second phase, because it's only one string[]
      +        const { optimizationLevel = 1 } = this.options;
      +        if (optimizationLevel >= 2) {
      +            file = this.levelTwoFileOptimize(file);
      +        }
      +        if (pattern.includes(exports.GLOBSTAR)) {
      +            return this.#matchGlobstar(file, pattern, partial, fileStartIndex, patternStartIndex);
      +        }
      +        return this.#matchOne(file, pattern, partial, fileStartIndex, patternStartIndex);
      +    }
      +    #matchGlobstar(file, pattern, partial, fileIndex, patternIndex) {
      +        // split the pattern into head, tail, and middle of ** delimited parts
      +        const firstgs = pattern.indexOf(exports.GLOBSTAR, patternIndex);
      +        const lastgs = pattern.lastIndexOf(exports.GLOBSTAR);
      +        // split the pattern up into globstar-delimited sections
      +        // the tail has to be at the end, and the others just have
      +        // to be found in order from the head.
      +        const [head, body, tail] = partial ?
      +            [
      +                pattern.slice(patternIndex, firstgs),
      +                pattern.slice(firstgs + 1),
      +                [],
      +            ]
      +            : [
      +                pattern.slice(patternIndex, firstgs),
      +                pattern.slice(firstgs + 1, lastgs),
      +                pattern.slice(lastgs + 1),
      +            ];
      +        // check the head, from the current file/pattern index.
      +        if (head.length) {
      +            const fileHead = file.slice(fileIndex, fileIndex + head.length);
      +            if (!this.#matchOne(fileHead, head, partial, 0, 0)) {
      +                return false;
      +            }
      +            fileIndex += head.length;
      +            patternIndex += head.length;
      +        }
      +        // now we know the head matches!
      +        // if the last portion is not empty, it MUST match the end
      +        // check the tail
      +        let fileTailMatch = 0;
      +        if (tail.length) {
      +            // if head + tail > file, then we cannot possibly match
      +            if (tail.length + fileIndex > file.length)
      +                return false;
      +            // try to match the tail
      +            let tailStart = file.length - tail.length;
      +            if (this.#matchOne(file, tail, partial, tailStart, 0)) {
      +                fileTailMatch = tail.length;
      +            }
      +            else {
      +                // affordance for stuff like a/**/* matching a/b/
      +                // if the last file portion is '', and there's more to the pattern
      +                // then try without the '' bit.
      +                if (file[file.length - 1] !== '' ||
      +                    fileIndex + tail.length === file.length) {
      +                    return false;
      +                }
      +                tailStart--;
      +                if (!this.#matchOne(file, tail, partial, tailStart, 0)) {
      +                    return false;
      +                }
      +                fileTailMatch = tail.length + 1;
      +            }
      +        }
      +        // now we know the tail matches!
      +        // the middle is zero or more portions wrapped in **, possibly
      +        // containing more ** sections.
      +        // so a/**/b/**/c/**/d has become **/b/**/c/**
      +        // if it's empty, it means a/**/b, just verify we have no bad dots
      +        // if there's no tail, so it ends on /**, then we must have *something*
      +        // after the head, or it's not a matc
      +        if (!body.length) {
      +            let sawSome = !!fileTailMatch;
      +            for (let i = fileIndex; i < file.length - fileTailMatch; i++) {
      +                const f = String(file[i]);
      +                sawSome = true;
      +                if (f === '.' ||
      +                    f === '..' ||
      +                    (!this.options.dot && f.startsWith('.'))) {
      +                    return false;
      +                }
      +            }
      +            // in partial mode, we just need to get past all file parts
      +            return partial || sawSome;
      +        }
      +        // now we know that there's one or more body sections, which can
      +        // be matched anywhere from the 0 index (because the head was pruned)
      +        // through to the length-fileTailMatch index.
      +        // split the body up into sections, and note the minimum index it can
      +        // be found at (start with the length of all previous segments)
      +        // [section, before, after]
      +        const bodySegments = [[[], 0]];
      +        let currentBody = bodySegments[0];
      +        let nonGsParts = 0;
      +        const nonGsPartsSums = [0];
      +        for (const b of body) {
      +            if (b === exports.GLOBSTAR) {
      +                nonGsPartsSums.push(nonGsParts);
      +                currentBody = [[], 0];
      +                bodySegments.push(currentBody);
      +            }
      +            else {
      +                currentBody[0].push(b);
      +                nonGsParts++;
      +            }
      +        }
      +        let i = bodySegments.length - 1;
      +        const fileLength = file.length - fileTailMatch;
      +        for (const b of bodySegments) {
      +            b[1] = fileLength - (nonGsPartsSums[i--] + b[0].length);
      +        }
      +        return !!this.#matchGlobStarBodySections(file, bodySegments, fileIndex, 0, partial, 0, !!fileTailMatch);
      +    }
      +    // return false for "nope, not matching"
      +    // return null for "not matching, cannot keep trying"
      +    #matchGlobStarBodySections(file, 
      +    // pattern section, last possible position for it
      +    bodySegments, fileIndex, bodyIndex, partial, globStarDepth, sawTail) {
      +        // take the first body segment, and walk from fileIndex to its "after"
      +        // value at the end
      +        // If it doesn't match at that position, we increment, until we hit
      +        // that final possible position, and give up.
      +        // If it does match, then advance and try to rest.
      +        // If any of them fail we keep walking forward.
      +        // this is still a bit recursively painful, but it's more constrained
      +        // than previous implementations, because we never test something that
      +        // can't possibly be a valid matching condition.
      +        const bs = bodySegments[bodyIndex];
      +        if (!bs) {
      +            // just make sure that there's no bad dots
      +            for (let i = fileIndex; i < file.length; i++) {
      +                sawTail = true;
      +                const f = file[i];
      +                if (f === '.' ||
      +                    f === '..' ||
      +                    (!this.options.dot && f.startsWith('.'))) {
      +                    return false;
      +                }
      +            }
      +            return sawTail;
      +        }
      +        // have a non-globstar body section to test
      +        const [body, after] = bs;
      +        while (fileIndex <= after) {
      +            const m = this.#matchOne(file.slice(0, fileIndex + body.length), body, partial, fileIndex, 0);
      +            // if limit exceeded, no match. intentional false negative,
      +            // acceptable break in correctness for security.
      +            if (m && globStarDepth < this.maxGlobstarRecursion) {
      +                // match! see if the rest match. if so, we're done!
      +                const sub = this.#matchGlobStarBodySections(file, bodySegments, fileIndex + body.length, bodyIndex + 1, partial, globStarDepth + 1, sawTail);
      +                if (sub !== false) {
      +                    return sub;
      +                }
      +            }
      +            const f = file[fileIndex];
      +            if (f === '.' ||
      +                f === '..' ||
      +                (!this.options.dot && f.startsWith('.'))) {
      +                return false;
      +            }
      +            fileIndex++;
      +        }
      +        // walked off. no point continuing
      +        return partial || null;
      +    }
      +    #matchOne(file, pattern, partial, fileIndex, patternIndex) {
      +        let fi;
      +        let pi;
      +        let pl;
      +        let fl;
      +        for (fi = fileIndex,
      +            pi = patternIndex,
      +            fl = file.length,
      +            pl = pattern.length; fi < fl && pi < pl; fi++, pi++) {
      +            this.debug('matchOne loop');
      +            let p = pattern[pi];
      +            let f = file[fi];
      +            this.debug(pattern, p, f);
      +            // should be impossible.
      +            // some invalid regexp stuff in the set.
      +            /* c8 ignore start */
      +            if (p === false || p === exports.GLOBSTAR) {
      +                return false;
      +            }
      +            /* c8 ignore stop */
      +            // something other than **
      +            // non-magic patterns just have to match exactly
      +            // patterns with magic have been turned into regexps.
      +            let hit;
      +            if (typeof p === 'string') {
      +                hit = f === p;
      +                this.debug('string match', p, f, hit);
      +            }
      +            else {
      +                hit = p.test(f);
      +                this.debug('pattern match', p, f, hit);
      +            }
      +            if (!hit)
      +                return false;
      +        }
      +        // Note: ending in / means that we'll get a final ""
      +        // at the end of the pattern.  This can only match a
      +        // corresponding "" at the end of the file.
      +        // If the file ends in /, then it can only match a
      +        // a pattern that ends in /, unless the pattern just
      +        // doesn't have any more for it. But, a/b/ should *not*
      +        // match "a/b/*", even though "" matches against the
      +        // [^/]*? pattern, except in partial mode, where it might
      +        // simply not be reached yet.
      +        // However, a/b/ should still satisfy a/*
      +        // now either we fell off the end of the pattern, or we're done.
      +        if (fi === fl && pi === pl) {
      +            // ran out of pattern and filename at the same time.
      +            // an exact hit!
      +            return true;
      +        }
      +        else if (fi === fl) {
      +            // ran out of file, but still had pattern left.
      +            // this is ok if we're doing the match as part of
      +            // a glob fs traversal.
      +            return partial;
      +        }
      +        else if (pi === pl) {
      +            // ran out of pattern, still have file left.
      +            // this is only acceptable if we're on the very last
      +            // empty segment of a file with a trailing slash.
      +            // a/* should match a/b/
      +            return fi === fl - 1 && file[fi] === '';
      +            /* c8 ignore start */
      +        }
      +        else {
      +            // should be unreachable.
      +            throw new Error('wtf?');
      +        }
      +        /* c8 ignore stop */
      +    }
      +    braceExpand() {
      +        return (0, exports.braceExpand)(this.pattern, this.options);
      +    }
      +    parse(pattern) {
      +        (0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
      +        const options = this.options;
      +        // shortcuts
      +        if (pattern === '**')
      +            return exports.GLOBSTAR;
      +        if (pattern === '')
      +            return '';
      +        // far and away, the most common glob pattern parts are
      +        // *, *.*, and *.  Add a fast check method for those.
      +        let m;
      +        let fastTest = null;
      +        if ((m = pattern.match(starRE))) {
      +            fastTest = options.dot ? starTestDot : starTest;
      +        }
      +        else if ((m = pattern.match(starDotExtRE))) {
      +            fastTest = (options.nocase ?
      +                options.dot ?
      +                    starDotExtTestNocaseDot
      +                    : starDotExtTestNocase
      +                : options.dot ? starDotExtTestDot
      +                    : starDotExtTest)(m[1]);
      +        }
      +        else if ((m = pattern.match(qmarksRE))) {
      +            fastTest = (options.nocase ?
      +                options.dot ?
      +                    qmarksTestNocaseDot
      +                    : qmarksTestNocase
      +                : options.dot ? qmarksTestDot
      +                    : qmarksTest)(m);
      +        }
      +        else if ((m = pattern.match(starDotStarRE))) {
      +            fastTest = options.dot ? starDotStarTestDot : starDotStarTest;
      +        }
      +        else if ((m = pattern.match(dotStarRE))) {
      +            fastTest = dotStarTest;
      +        }
      +        const re = ast_js_1.AST.fromGlob(pattern, this.options).toMMPattern();
      +        if (fastTest && typeof re === 'object') {
      +            // Avoids overriding in frozen environments
      +            Reflect.defineProperty(re, 'test', { value: fastTest });
      +        }
      +        return re;
      +    }
      +    makeRe() {
      +        if (this.regexp || this.regexp === false)
      +            return this.regexp;
      +        // at this point, this.set is a 2d array of partial
      +        // pattern strings, or "**".
      +        //
      +        // It's better to use .match().  This function shouldn't
      +        // be used, really, but it's pretty convenient sometimes,
      +        // when you just want to work with a regex.
      +        const set = this.set;
      +        if (!set.length) {
      +            this.regexp = false;
      +            return this.regexp;
      +        }
      +        const options = this.options;
      +        const twoStar = options.noglobstar ? star
      +            : options.dot ? twoStarDot
      +                : twoStarNoDot;
      +        const flags = new Set(options.nocase ? ['i'] : []);
      +        // regexpify non-globstar patterns
      +        // if ** is only item, then we just do one twoStar
      +        // if ** is first, and there are more, prepend (\/|twoStar\/)? to next
      +        // if ** is last, append (\/twoStar|) to previous
      +        // if ** is in the middle, append (\/|\/twoStar\/) to previous
      +        // then filter out GLOBSTAR symbols
      +        let re = set
      +            .map(pattern => {
      +            const pp = pattern.map(p => {
      +                if (p instanceof RegExp) {
      +                    for (const f of p.flags.split(''))
      +                        flags.add(f);
      +                }
      +                return (typeof p === 'string' ? regExpEscape(p)
      +                    : p === exports.GLOBSTAR ? exports.GLOBSTAR
      +                        : p._src);
      +            });
      +            pp.forEach((p, i) => {
      +                const next = pp[i + 1];
      +                const prev = pp[i - 1];
      +                if (p !== exports.GLOBSTAR || prev === exports.GLOBSTAR) {
      +                    return;
      +                }
      +                if (prev === undefined) {
      +                    if (next !== undefined && next !== exports.GLOBSTAR) {
      +                        pp[i + 1] = '(?:\\/|' + twoStar + '\\/)?' + next;
      +                    }
      +                    else {
      +                        pp[i] = twoStar;
      +                    }
      +                }
      +                else if (next === undefined) {
      +                    pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + ')?';
      +                }
      +                else if (next !== exports.GLOBSTAR) {
      +                    pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + '\\/)' + next;
      +                    pp[i + 1] = exports.GLOBSTAR;
      +                }
      +            });
      +            const filtered = pp.filter(p => p !== exports.GLOBSTAR);
      +            // For partial matches, we need to make the pattern match
      +            // any prefix of the full path. We do this by generating
      +            // alternative patterns that match progressively longer prefixes.
      +            if (this.partial && filtered.length >= 1) {
      +                const prefixes = [];
      +                for (let i = 1; i <= filtered.length; i++) {
      +                    prefixes.push(filtered.slice(0, i).join('/'));
      +                }
      +                return '(?:' + prefixes.join('|') + ')';
      +            }
      +            return filtered.join('/');
      +        })
      +            .join('|');
      +        // need to wrap in parens if we had more than one thing with |,
      +        // otherwise only the first will be anchored to ^ and the last to $
      +        const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', ''];
      +        // must match entire pattern
      +        // ending in a * or ** will make it less strict.
      +        re = '^' + open + re + close + '$';
      +        // In partial mode, '/' should always match as it's a valid prefix for any pattern
      +        if (this.partial) {
      +            re = '^(?:\\/|' + open + re.slice(1, -1) + close + ')$';
      +        }
      +        // can match anything, as long as it's not this.
      +        if (this.negate)
      +            re = '^(?!' + re + ').+$';
      +        try {
      +            this.regexp = new RegExp(re, [...flags].join(''));
      +            /* c8 ignore start */
      +        }
      +        catch {
      +            // should be impossible
      +            this.regexp = false;
      +        }
      +        /* c8 ignore stop */
      +        return this.regexp;
      +    }
      +    slashSplit(p) {
      +        // if p starts with // on windows, we preserve that
      +        // so that UNC paths aren't broken.  Otherwise, any number of
      +        // / characters are coalesced into one, unless
      +        // preserveMultipleSlashes is set to true.
      +        if (this.preserveMultipleSlashes) {
      +            return p.split('/');
      +        }
      +        else if (this.isWindows && /^\/\/[^/]+/.test(p)) {
      +            // add an extra '' for the one we lose
      +            return ['', ...p.split(/\/+/)];
      +        }
      +        else {
      +            return p.split(/\/+/);
      +        }
      +    }
      +    match(f, partial = this.partial) {
      +        this.debug('match', f, this.pattern);
      +        // short-circuit in the case of busted things.
      +        // comments, etc.
      +        if (this.comment) {
      +            return false;
      +        }
      +        if (this.empty) {
      +            return f === '';
      +        }
      +        if (f === '/' && partial) {
      +            return true;
      +        }
      +        const options = this.options;
      +        // windows: need to use /, not \
      +        if (this.isWindows) {
      +            f = f.split('\\').join('/');
      +        }
      +        // treat the test path as a set of pathparts.
      +        const ff = this.slashSplit(f);
      +        this.debug(this.pattern, 'split', ff);
      +        // just ONE of the pattern sets in this.set needs to match
      +        // in order for it to be valid.  If negating, then just one
      +        // match means that we have failed.
      +        // Either way, return on the first hit.
      +        const set = this.set;
      +        this.debug(this.pattern, 'set', set);
      +        // Find the basename of the path by looking for the last non-empty segment
      +        let filename = ff[ff.length - 1];
      +        if (!filename) {
      +            for (let i = ff.length - 2; !filename && i >= 0; i--) {
      +                filename = ff[i];
      +            }
      +        }
      +        for (const pattern of set) {
      +            let file = ff;
      +            if (options.matchBase && pattern.length === 1) {
      +                file = [filename];
      +            }
      +            const hit = this.matchOne(file, pattern, partial);
      +            if (hit) {
      +                if (options.flipNegate) {
      +                    return true;
      +                }
      +                return !this.negate;
      +            }
      +        }
      +        // didn't get any hits.  this is success if it's a negative
      +        // pattern, failure otherwise.
      +        if (options.flipNegate) {
      +            return false;
      +        }
      +        return this.negate;
      +    }
      +    static defaults(def) {
      +        return exports.minimatch.defaults(def).Minimatch;
      +    }
      +}
      +exports.Minimatch = Minimatch;
      +/* c8 ignore start */
      +var ast_js_2 = require("./ast.js");
      +Object.defineProperty(exports, "AST", { enumerable: true, get: function () { return ast_js_2.AST; } });
      +var escape_js_2 = require("./escape.js");
      +Object.defineProperty(exports, "escape", { enumerable: true, get: function () { return escape_js_2.escape; } });
      +var unescape_js_2 = require("./unescape.js");
      +Object.defineProperty(exports, "unescape", { enumerable: true, get: function () { return unescape_js_2.unescape; } });
      +/* c8 ignore stop */
      +exports.minimatch.AST = ast_js_1.AST;
      +exports.minimatch.Minimatch = Minimatch;
      +exports.minimatch.escape = escape_js_1.escape;
      +exports.minimatch.unescape = unescape_js_1.unescape;
      +//# sourceMappingURL=index.js.map
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/commonjs/index.js.map b/node_modules/minimatch/dist/commonjs/index.js.map
      new file mode 100644
      index 00000000..f0b81f03
      --- /dev/null
      +++ b/node_modules/minimatch/dist/commonjs/index.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { expand } from 'brace-expansion'\nimport { assertValidPattern } from './assert-valid-pattern.js'\nimport type { ExtglobType } from './ast.js'\nimport { AST } from './ast.js'\nimport { escape } from './escape.js'\nimport { unescape } from './unescape.js'\n\nexport type Platform =\n  | 'aix'\n  | 'android'\n  | 'darwin'\n  | 'freebsd'\n  | 'haiku'\n  | 'linux'\n  | 'openbsd'\n  | 'sunos'\n  | 'win32'\n  | 'cygwin'\n  | 'netbsd'\n\nexport interface MinimatchOptions {\n  /** do not expand `{x,y}` style braces */\n  nobrace?: boolean\n  /** do not treat patterns starting with `#` as a comment */\n  nocomment?: boolean\n  /** do not treat patterns starting with `!` as a negation */\n  nonegate?: boolean\n  /** print LOTS of debugging output */\n  debug?: boolean\n  /** treat `**` the same as `*` */\n  noglobstar?: boolean\n  /** do not expand extglobs like `+(a|b)` */\n  noext?: boolean\n  /** return the pattern if nothing matches */\n  nonull?: boolean\n  /** treat `\\\\` as a path separator, not an escape character */\n  windowsPathsNoEscape?: boolean\n  /**\n   * inverse of {@link MinimatchOptions.windowsPathsNoEscape}\n   * @deprecated\n   */\n  allowWindowsEscape?: boolean\n  /**\n   * Compare a partial path to a pattern. As long as the parts\n   * of the path that are present are not contradicted by the\n   * pattern, it will be treated as a match. This is useful in\n   * applications where you're walking through a folder structure,\n   * and don't yet have the full path, but want to ensure that you\n   * do not walk down paths that can never be a match.\n   */\n  partial?: boolean\n  /** allow matches that start with `.` even if the pattern does not */\n  dot?: boolean\n  /** ignore case */\n  nocase?: boolean\n  /** ignore case only in wildcard patterns */\n  nocaseMagicOnly?: boolean\n  /** consider braces to be \"magic\" for the purpose of `hasMagic` */\n  magicalBraces?: boolean\n  /**\n   * If set, then patterns without slashes will be matched\n   * against the basename of the path if it contains slashes.\n   * For example, `a?b` would match the path `/xyz/123/acb`, but\n   * not `/xyz/acb/123`.\n   */\n  matchBase?: boolean\n  /** invert the results of negated matches */\n  flipNegate?: boolean\n  /** do not collapse multiple `/` into a single `/` */\n  preserveMultipleSlashes?: boolean\n  /**\n   * A number indicating the level of optimization that should be done\n   * to the pattern prior to parsing and using it for matches.\n   */\n  optimizationLevel?: number\n  /** operating system platform */\n  platform?: Platform\n  /**\n   * When a pattern starts with a UNC path or drive letter, and in\n   * `nocase:true` mode, do not convert the root portions of the\n   * pattern into a case-insensitive regular expression, and instead\n   * leave them as strings.\n   *\n   * This is the default when the platform is `win32` and\n   * `nocase:true` is set.\n   */\n  windowsNoMagicRoot?: boolean\n  /**\n   * max number of `{...}` patterns to expand. Default 100_000.\n   */\n  braceExpandMax?: number\n  /**\n   * Max number of non-adjacent `**` patterns to recursively walk down.\n   *\n   * The default of 200 is almost certainly high enough for most purposes,\n   * and can handle absurdly excessive patterns.\n   */\n  maxGlobstarRecursion?: number\n\n  /**\n   * Max depth to traverse for nested extglobs like `*(a|b|c)`\n   *\n   * Default is 2, which is quite low, but any higher value\n   * swiftly results in punishing performance impacts. Note\n   * that this is *not*  relevant when the globstar types can\n   * be safely coalesced into a single set.\n   *\n   * For example, `*(a|@(b|c)|d)` would be flattened into\n   * `*(a|b|c|d)`. Thus, many common extglobs will retain good\n   * performance and  never hit this limit, even if they are\n   * excessively deep and complicated.\n   *\n   * If the limit is hit, then the extglob characters are simply\n   * not parsed, and the pattern effectively switches into\n   * `noextglob: true` mode for the contents of that nested\n   * sub-pattern. This will typically _not_ result in a match,\n   * but is considered a valid trade-off for security and\n   * performance.\n   */\n  maxExtglobRecursion?: number\n}\n\nexport const minimatch = (\n  p: string,\n  pattern: string,\n  options: MinimatchOptions = {},\n) => {\n  assertValidPattern(pattern)\n\n  // shortcut: comments match nothing.\n  if (!options.nocomment && pattern.charAt(0) === '#') {\n    return false\n  }\n\n  return new Minimatch(pattern, options).match(p)\n}\n\n// Optimized checking for the most common glob patterns.\nconst starDotExtRE = /^\\*+([^+@!?*[(]*)$/\nconst starDotExtTest = (ext: string) => (f: string) =>\n  !f.startsWith('.') && f.endsWith(ext)\nconst starDotExtTestDot = (ext: string) => (f: string) => f.endsWith(ext)\nconst starDotExtTestNocase = (ext: string) => {\n  ext = ext.toLowerCase()\n  return (f: string) => !f.startsWith('.') && f.toLowerCase().endsWith(ext)\n}\nconst starDotExtTestNocaseDot = (ext: string) => {\n  ext = ext.toLowerCase()\n  return (f: string) => f.toLowerCase().endsWith(ext)\n}\nconst starDotStarRE = /^\\*+\\.\\*+$/\nconst starDotStarTest = (f: string) =>\n  !f.startsWith('.') && f.includes('.')\nconst starDotStarTestDot = (f: string) =>\n  f !== '.' && f !== '..' && f.includes('.')\nconst dotStarRE = /^\\.\\*+$/\nconst dotStarTest = (f: string) =>\n  f !== '.' && f !== '..' && f.startsWith('.')\nconst starRE = /^\\*+$/\nconst starTest = (f: string) => f.length !== 0 && !f.startsWith('.')\nconst starTestDot = (f: string) =>\n  f.length !== 0 && f !== '.' && f !== '..'\nconst qmarksRE = /^\\?+([^+@!?*[(]*)?$/\nconst qmarksTestNocase = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExt([$0])\n  if (!ext) return noext\n  ext = ext.toLowerCase()\n  return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestNocaseDot = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExtDot([$0])\n  if (!ext) return noext\n  ext = ext.toLowerCase()\n  return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestDot = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExtDot([$0])\n  return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTest = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExt([$0])\n  return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTestNoExt = ([$0]: RegExpMatchArray) => {\n  const len = $0.length\n  return (f: string) => f.length === len && !f.startsWith('.')\n}\nconst qmarksTestNoExtDot = ([$0]: RegExpMatchArray) => {\n  const len = $0.length\n  return (f: string) => f.length === len && f !== '.' && f !== '..'\n}\n\n/* c8 ignore start */\nconst defaultPlatform: Platform = (\n  typeof process === 'object' && process ?\n    (typeof process.env === 'object' &&\n      process.env &&\n      process.env.__MINIMATCH_TESTING_PLATFORM__) ||\n    process.platform\n  : 'posix') as Platform\n\nexport type Sep = '\\\\' | '/'\n\nconst path: { [k: string]: { sep: Sep } } = {\n  win32: { sep: '\\\\' },\n  posix: { sep: '/' },\n}\n/* c8 ignore stop */\n\nexport const sep =\n  defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep\nminimatch.sep = sep\n\nexport const GLOBSTAR = Symbol('globstar **')\nminimatch.GLOBSTAR = GLOBSTAR\n\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n\n// ** when dots are allowed.  Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nconst twoStarDot = '(?:(?!(?:\\\\/|^)(?:\\\\.{1,2})($|\\\\/)).)*?'\n\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nconst twoStarNoDot = '(?:(?!(?:\\\\/|^)\\\\.).)*?'\n\nexport const filter =\n  (pattern: string, options: MinimatchOptions = {}) =>\n  (p: string) =>\n    minimatch(p, pattern, options)\nminimatch.filter = filter\n\nconst ext = (a: MinimatchOptions, b: MinimatchOptions = {}) =>\n  Object.assign({}, a, b)\n\nexport const defaults = (def: MinimatchOptions): typeof minimatch => {\n  if (!def || typeof def !== 'object' || !Object.keys(def).length) {\n    return minimatch\n  }\n\n  const orig = minimatch\n\n  const m = (p: string, pattern: string, options: MinimatchOptions = {}) =>\n    orig(p, pattern, ext(def, options))\n\n  return Object.assign(m, {\n    Minimatch: class Minimatch extends orig.Minimatch {\n      constructor(pattern: string, options: MinimatchOptions = {}) {\n        super(pattern, ext(def, options))\n      }\n      static defaults(options: MinimatchOptions) {\n        return orig.defaults(ext(def, options)).Minimatch\n      }\n    },\n\n    AST: class AST extends orig.AST {\n      /* c8 ignore start */\n      constructor(\n        type: ExtglobType | null,\n        parent?: AST,\n        options: MinimatchOptions = {},\n      ) {\n        super(type, parent, ext(def, options))\n      }\n      /* c8 ignore stop */\n\n      static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n        return orig.AST.fromGlob(pattern, ext(def, options))\n      }\n    },\n\n    unescape: (\n      s: string,\n      options: Pick<\n        MinimatchOptions,\n        'windowsPathsNoEscape' | 'magicalBraces'\n      > = {},\n    ) => orig.unescape(s, ext(def, options)),\n\n    escape: (\n      s: string,\n      options: Pick<\n        MinimatchOptions,\n        'windowsPathsNoEscape' | 'magicalBraces'\n      > = {},\n    ) => orig.escape(s, ext(def, options)),\n\n    filter: (pattern: string, options: MinimatchOptions = {}) =>\n      orig.filter(pattern, ext(def, options)),\n\n    defaults: (options: MinimatchOptions) =>\n      orig.defaults(ext(def, options)),\n\n    makeRe: (pattern: string, options: MinimatchOptions = {}) =>\n      orig.makeRe(pattern, ext(def, options)),\n\n    braceExpand: (pattern: string, options: MinimatchOptions = {}) =>\n      orig.braceExpand(pattern, ext(def, options)),\n\n    match: (\n      list: string[],\n      pattern: string,\n      options: MinimatchOptions = {},\n    ) => orig.match(list, pattern, ext(def, options)),\n\n    sep: orig.sep,\n    GLOBSTAR: GLOBSTAR as typeof GLOBSTAR,\n  })\n}\nminimatch.defaults = defaults\n\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nexport const braceExpand = (\n  pattern: string,\n  options: MinimatchOptions = {},\n) => {\n  assertValidPattern(pattern)\n\n  // Thanks to Yeting Li  for\n  // improving this regexp to avoid a ReDOS vulnerability.\n  if (options.nobrace || !/\\{(?:(?!\\{).)*\\}/.test(pattern)) {\n    // shortcut. no need to expand.\n    return [pattern]\n  }\n\n  return expand(pattern, { max: options.braceExpandMax })\n}\nminimatch.braceExpand = braceExpand\n\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion.  Otherwise, any series\n// of * is equivalent to a single *.  Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\n\nexport const makeRe = (pattern: string, options: MinimatchOptions = {}) =>\n  new Minimatch(pattern, options).makeRe()\nminimatch.makeRe = makeRe\n\nexport const match = (\n  list: string[],\n  pattern: string,\n  options: MinimatchOptions = {},\n) => {\n  const mm = new Minimatch(pattern, options)\n  list = list.filter(f => mm.match(f))\n  if (mm.options.nonull && !list.length) {\n    list.push(pattern)\n  }\n  return list\n}\nminimatch.match = match\n\n// replace stuff like \\* with *\nconst globMagic = /[?*]|[+@!]\\(.*?\\)|\\[|\\]/\nconst regExpEscape = (s: string) =>\n  s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\nexport type MMRegExp = RegExp & {\n  _src?: string\n  _glob?: string\n}\n\nexport type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR\nexport type ParseReturn = ParseReturnFiltered | false\n\nexport class Minimatch {\n  options: MinimatchOptions\n  set: ParseReturnFiltered[][]\n  pattern: string\n\n  windowsPathsNoEscape: boolean\n  nonegate: boolean\n  negate: boolean\n  comment: boolean\n  empty: boolean\n  preserveMultipleSlashes: boolean\n  partial: boolean\n  globSet: string[]\n  globParts: string[][]\n  nocase: boolean\n\n  isWindows: boolean\n  platform: Platform\n  windowsNoMagicRoot: boolean\n  maxGlobstarRecursion: number\n\n  regexp: false | null | MMRegExp\n  constructor(pattern: string, options: MinimatchOptions = {}) {\n    assertValidPattern(pattern)\n\n    options = options || {}\n    this.options = options\n    this.maxGlobstarRecursion = options.maxGlobstarRecursion ?? 200\n    this.pattern = pattern\n    this.platform = options.platform || defaultPlatform\n    this.isWindows = this.platform === 'win32'\n    // avoid the annoying deprecation flag lol\n    const awe = ('allowWindow' + 'sEscape') as keyof MinimatchOptions\n    this.windowsPathsNoEscape =\n      !!options.windowsPathsNoEscape || options[awe] === false\n    if (this.windowsPathsNoEscape) {\n      this.pattern = this.pattern.replace(/\\\\/g, '/')\n    }\n    this.preserveMultipleSlashes = !!options.preserveMultipleSlashes\n    this.regexp = null\n    this.negate = false\n    this.nonegate = !!options.nonegate\n    this.comment = false\n    this.empty = false\n    this.partial = !!options.partial\n    this.nocase = !!this.options.nocase\n    this.windowsNoMagicRoot =\n      options.windowsNoMagicRoot !== undefined ?\n        options.windowsNoMagicRoot\n      : !!(this.isWindows && this.nocase)\n\n    this.globSet = []\n    this.globParts = []\n    this.set = []\n\n    // make the set of regexps etc.\n    this.make()\n  }\n\n  hasMagic(): boolean {\n    if (this.options.magicalBraces && this.set.length > 1) {\n      return true\n    }\n    for (const pattern of this.set) {\n      for (const part of pattern) {\n        if (typeof part !== 'string') return true\n      }\n    }\n    return false\n  }\n\n  debug(..._: unknown[]) {}\n\n  make() {\n    const pattern = this.pattern\n    const options = this.options\n\n    // empty patterns and comments match nothing.\n    if (!options.nocomment && pattern.charAt(0) === '#') {\n      this.comment = true\n      return\n    }\n\n    if (!pattern) {\n      this.empty = true\n      return\n    }\n\n    // step 1: figure out negation, etc.\n    this.parseNegate()\n\n    // step 2: expand braces\n    this.globSet = [...new Set(this.braceExpand())]\n\n    if (options.debug) {\n      //oxlint-disable-next-line no-console\n      this.debug = (...args: unknown[]) => console.error(...args)\n    }\n\n    this.debug(this.pattern, this.globSet)\n\n    // step 3: now we have a set, so turn each one into a series of\n    // path-portion matching patterns.\n    // These will be regexps, except in the case of \"**\", which is\n    // set to the GLOBSTAR object for globstar behavior,\n    // and will not contain any / characters\n    //\n    // First, we preprocess to make the glob pattern sets a bit simpler\n    // and deduped.  There are some perf-killing patterns that can cause\n    // problems with a glob walk, but we can simplify them down a bit.\n    const rawGlobParts = this.globSet.map(s => this.slashSplit(s))\n    this.globParts = this.preprocess(rawGlobParts)\n    this.debug(this.pattern, this.globParts)\n\n    // glob --> regexps\n    let set = this.globParts.map((s, _, __) => {\n      if (this.isWindows && this.windowsNoMagicRoot) {\n        // check if it's a drive or unc path.\n        const isUNC =\n          s[0] === '' &&\n          s[1] === '' &&\n          (s[2] === '?' || !globMagic.test(s[2])) &&\n          !globMagic.test(s[3])\n        const isDrive = /^[a-z]:/i.test(s[0])\n        if (isUNC) {\n          return [\n            ...s.slice(0, 4),\n            ...s.slice(4).map(ss => this.parse(ss)),\n          ]\n        } else if (isDrive) {\n          return [s[0], ...s.slice(1).map(ss => this.parse(ss))]\n        }\n      }\n      return s.map(ss => this.parse(ss))\n    })\n\n    this.debug(this.pattern, set)\n\n    // filter out everything that didn't compile properly.\n    this.set = set.filter(\n      s => s.indexOf(false) === -1,\n    ) as ParseReturnFiltered[][]\n\n    // do not treat the ? in UNC paths as magic\n    if (this.isWindows) {\n      for (let i = 0; i < this.set.length; i++) {\n        const p = this.set[i]\n        if (\n          p[0] === '' &&\n          p[1] === '' &&\n          this.globParts[i][2] === '?' &&\n          typeof p[3] === 'string' &&\n          /^[a-z]:$/i.test(p[3])\n        ) {\n          p[2] = '?'\n        }\n      }\n    }\n\n    this.debug(this.pattern, this.set)\n  }\n\n  // various transforms to equivalent pattern sets that are\n  // faster to process in a filesystem walk.  The goal is to\n  // eliminate what we can, and push all ** patterns as far\n  // to the right as possible, even if it increases the number\n  // of patterns that we have to process.\n  preprocess(globParts: string[][]) {\n    // if we're not in globstar mode, then turn ** into *\n    if (this.options.noglobstar) {\n      for (const partset of globParts) {\n        for (let j = 0; j < partset.length; j++) {\n          if (partset[j] === '**') {\n            partset[j] = '*'\n          }\n        }\n      }\n    }\n\n    const { optimizationLevel = 1 } = this.options\n\n    if (optimizationLevel >= 2) {\n      // aggressive optimization for the purpose of fs walking\n      globParts = this.firstPhasePreProcess(globParts)\n      globParts = this.secondPhasePreProcess(globParts)\n    } else if (optimizationLevel >= 1) {\n      // just basic optimizations to remove some .. parts\n      globParts = this.levelOneOptimize(globParts)\n    } else {\n      // just collapse multiple ** portions into one\n      globParts = this.adjascentGlobstarOptimize(globParts)\n    }\n\n    return globParts\n  }\n\n  // just get rid of adjascent ** portions\n  adjascentGlobstarOptimize(globParts: string[][]) {\n    return globParts.map(parts => {\n      let gs: number = -1\n      while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n        let i = gs\n        while (parts[i + 1] === '**') {\n          i++\n        }\n        if (i !== gs) {\n          parts.splice(gs, i - gs)\n        }\n      }\n      return parts\n    })\n  }\n\n  // get rid of adjascent ** and resolve .. portions\n  levelOneOptimize(globParts: string[][]) {\n    return globParts.map(parts => {\n      parts = parts.reduce((set: string[], part) => {\n        const prev = set[set.length - 1]\n        if (part === '**' && prev === '**') {\n          return set\n        }\n        if (part === '..') {\n          if (prev && prev !== '..' && prev !== '.' && prev !== '**') {\n            set.pop()\n            return set\n          }\n        }\n        set.push(part)\n        return set\n      }, [])\n      return parts.length === 0 ? [''] : parts\n    })\n  }\n\n  levelTwoFileOptimize(parts: string | string[]) {\n    if (!Array.isArray(parts)) {\n      parts = this.slashSplit(parts)\n    }\n    let didSomething: boolean = false\n\n    do {\n      didSomething = false\n      // 
      // -> 
      /\n      if (!this.preserveMultipleSlashes) {\n        for (let i = 1; i < parts.length - 1; i++) {\n          const p = parts[i]\n          // don't squeeze out UNC patterns\n          if (i === 1 && p === '' && parts[0] === '') continue\n          if (p === '.' || p === '') {\n            didSomething = true\n            parts.splice(i, 1)\n            i--\n          }\n        }\n        if (\n          parts[0] === '.' &&\n          parts.length === 2 &&\n          (parts[1] === '.' || parts[1] === '')\n        ) {\n          didSomething = true\n          parts.pop()\n        }\n      }\n\n      // 
      /

      /../ ->

      /\n      let dd: number = 0\n      while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n        const p = parts[dd - 1]\n        if (\n          p &&\n          p !== '.' &&\n          p !== '..' &&\n          p !== '**' &&\n          !(this.isWindows && /^[a-z]:$/i.test(p))\n        ) {\n          didSomething = true\n          parts.splice(dd - 1, 2)\n          dd -= 2\n        }\n      }\n    } while (didSomething)\n    return parts.length === 0 ? [''] : parts\n  }\n\n  // First phase: single-pattern processing\n  // 
       is 1 or more portions\n  //  is 1 or more portions\n  // 

      is any portion other than ., .., '', or **\n // is . or ''\n //\n // **/.. is *brutal* for filesystem walking performance, because\n // it effectively resets the recursive walk each time it occurs,\n // and ** cannot be reduced out by a .. pattern part like a regexp\n // or most strings (other than .., ., and '') can be.\n //\n //

      /**/../

      /

      / -> {

      /../

      /

      /,

      /**/

      /

      /}\n //

      // -> 
      /\n  // 
      /

      /../ ->

      /\n  // **/**/ -> **/\n  //\n  // **/*/ -> */**/ <== not valid because ** doesn't follow\n  // this WOULD be allowed if ** did follow symlinks, or * didn't\n  firstPhasePreProcess(globParts: string[][]) {\n    let didSomething = false\n    do {\n      didSomething = false\n      // 
      /**/../

      /

      / -> {

      /../

      /

      /,

      /**/

      /

      /}\n for (let parts of globParts) {\n let gs: number = -1\n while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n let gss: number = gs\n while (parts[gss + 1] === '**') {\n //

      /**/**/ -> 
      /**/\n            gss++\n          }\n          // eg, if gs is 2 and gss is 4, that means we have 3 **\n          // parts, and can remove 2 of them.\n          if (gss > gs) {\n            parts.splice(gs + 1, gss - gs)\n          }\n\n          let next = parts[gs + 1]\n          const p = parts[gs + 2]\n          const p2 = parts[gs + 3]\n          if (next !== '..') continue\n          if (\n            !p ||\n            p === '.' ||\n            p === '..' ||\n            !p2 ||\n            p2 === '.' ||\n            p2 === '..'\n          ) {\n            continue\n          }\n          didSomething = true\n          // edit parts in place, and push the new one\n          parts.splice(gs, 1)\n          const other = parts.slice(0)\n          other[gs] = '**'\n          globParts.push(other)\n          gs--\n        }\n\n        // 
      // -> 
      /\n        if (!this.preserveMultipleSlashes) {\n          for (let i = 1; i < parts.length - 1; i++) {\n            const p = parts[i]\n            // don't squeeze out UNC patterns\n            if (i === 1 && p === '' && parts[0] === '') continue\n            if (p === '.' || p === '') {\n              didSomething = true\n              parts.splice(i, 1)\n              i--\n            }\n          }\n          if (\n            parts[0] === '.' &&\n            parts.length === 2 &&\n            (parts[1] === '.' || parts[1] === '')\n          ) {\n            didSomething = true\n            parts.pop()\n          }\n        }\n\n        // 
      /

      /../ ->

      /\n        let dd: number = 0\n        while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n          const p = parts[dd - 1]\n          if (p && p !== '.' && p !== '..' && p !== '**') {\n            didSomething = true\n            const needDot = dd === 1 && parts[dd + 1] === '**'\n            const splin = needDot ? ['.'] : []\n            parts.splice(dd - 1, 2, ...splin)\n            if (parts.length === 0) parts.push('')\n            dd -= 2\n          }\n        }\n      }\n    } while (didSomething)\n\n    return globParts\n  }\n\n  // second phase: multi-pattern dedupes\n  // {
      /*/,
      /

      /} ->

      /*/\n  // {
      /,
      /} -> 
      /\n  // {
      /**/,
      /} -> 
      /**/\n  //\n  // {
      /**/,
      /**/

      /} ->

      /**/\n  // ^-- not valid because ** doens't follow symlinks\n  secondPhasePreProcess(globParts: string[][]): string[][] {\n    for (let i = 0; i < globParts.length - 1; i++) {\n      for (let j = i + 1; j < globParts.length; j++) {\n        const matched = this.partsMatch(\n          globParts[i],\n          globParts[j],\n          !this.preserveMultipleSlashes,\n        )\n        if (matched) {\n          globParts[i] = []\n          globParts[j] = matched\n          break\n        }\n      }\n    }\n    return globParts.filter(gs => gs.length)\n  }\n\n  partsMatch(\n    a: string[],\n    b: string[],\n    emptyGSMatch: boolean = false,\n  ): false | string[] {\n    let ai = 0\n    let bi = 0\n    let result: string[] = []\n    let which: string = ''\n    while (ai < a.length && bi < b.length) {\n      if (a[ai] === b[bi]) {\n        result.push(which === 'b' ? b[bi] : a[ai])\n        ai++\n        bi++\n      } else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {\n        result.push(a[ai])\n        ai++\n      } else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {\n        result.push(b[bi])\n        bi++\n      } else if (\n        a[ai] === '*' &&\n        b[bi] &&\n        (this.options.dot || !b[bi].startsWith('.')) &&\n        b[bi] !== '**'\n      ) {\n        if (which === 'b') return false\n        which = 'a'\n        result.push(a[ai])\n        ai++\n        bi++\n      } else if (\n        b[bi] === '*' &&\n        a[ai] &&\n        (this.options.dot || !a[ai].startsWith('.')) &&\n        a[ai] !== '**'\n      ) {\n        if (which === 'a') return false\n        which = 'b'\n        result.push(b[bi])\n        ai++\n        bi++\n      } else {\n        return false\n      }\n    }\n    // if we fall out of the loop, it means they two are identical\n    // as long as their lengths match\n    return a.length === b.length && result\n  }\n\n  parseNegate() {\n    if (this.nonegate) return\n\n    const pattern = this.pattern\n    let negate = false\n    let negateOffset = 0\n\n    for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {\n      negate = !negate\n      negateOffset++\n    }\n\n    if (negateOffset) this.pattern = pattern.slice(negateOffset)\n    this.negate = negate\n  }\n\n  // set partial to true to test if, for example,\n  // \"/a/b\" matches the start of \"/*/b/*/d\"\n  // Partial means, if you run out of file before you run\n  // out of pattern, then that's fine, as long as all\n  // the parts match.\n  matchOne(\n    file: string[],\n    pattern: ParseReturn[],\n    partial: boolean = false,\n  ) {\n    let fileStartIndex = 0\n    let patternStartIndex = 0\n\n    // UNC paths like //?/X:/... can match X:/... and vice versa\n    // Drive letters in absolute drive or unc paths are always compared\n    // case-insensitively.\n    if (this.isWindows) {\n      const fileDrive =\n        typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0])\n      const fileUNC =\n        !fileDrive &&\n        file[0] === '' &&\n        file[1] === '' &&\n        file[2] === '?' &&\n        /^[a-z]:$/i.test(file[3])\n\n      const patternDrive =\n        typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0])\n      const patternUNC =\n        !patternDrive &&\n        pattern[0] === '' &&\n        pattern[1] === '' &&\n        pattern[2] === '?' &&\n        typeof pattern[3] === 'string' &&\n        /^[a-z]:$/i.test(pattern[3])\n\n      const fdi =\n        fileUNC ? 3\n        : fileDrive ? 0\n        : undefined\n      const pdi =\n        patternUNC ? 3\n        : patternDrive ? 0\n        : undefined\n      if (typeof fdi === 'number' && typeof pdi === 'number') {\n        const [fd, pd]: [string, string] = [\n          file[fdi],\n          pattern[pdi] as string,\n        ]\n        // start matching at the drive letter index of each\n        if (fd.toLowerCase() === pd.toLowerCase()) {\n          pattern[pdi] = fd\n          patternStartIndex = pdi\n          fileStartIndex = fdi\n        }\n      }\n    }\n\n    // resolve and reduce . and .. portions in the file as well.\n    // don't need to do the second phase, because it's only one string[]\n    const { optimizationLevel = 1 } = this.options\n    if (optimizationLevel >= 2) {\n      file = this.levelTwoFileOptimize(file)\n    }\n\n    if (pattern.includes(GLOBSTAR)) {\n      return this.#matchGlobstar(\n        file,\n        pattern,\n        partial,\n        fileStartIndex,\n        patternStartIndex,\n      )\n    }\n\n    return this.#matchOne(\n      file,\n      pattern,\n      partial,\n      fileStartIndex,\n      patternStartIndex,\n    )\n  }\n\n  #matchGlobstar(\n    file: string[],\n    pattern: ParseReturn[],\n    partial: boolean,\n    fileIndex: number,\n    patternIndex: number,\n  ) {\n    // split the pattern into head, tail, and middle of ** delimited parts\n    const firstgs = pattern.indexOf(GLOBSTAR, patternIndex)\n    const lastgs = pattern.lastIndexOf(GLOBSTAR)\n\n    // split the pattern up into globstar-delimited sections\n    // the tail has to be at the end, and the others just have\n    // to be found in order from the head.\n    const [head, body, tail] =\n      partial ?\n        [\n          pattern.slice(patternIndex, firstgs),\n          pattern.slice(firstgs + 1),\n          [],\n        ]\n      : [\n          pattern.slice(patternIndex, firstgs),\n          pattern.slice(firstgs + 1, lastgs),\n          pattern.slice(lastgs + 1),\n        ]\n\n    // check the head, from the current file/pattern index.\n    if (head.length) {\n      const fileHead = file.slice(fileIndex, fileIndex + head.length)\n      if (!this.#matchOne(fileHead, head, partial, 0, 0)) {\n        return false\n      }\n      fileIndex += head.length\n      patternIndex += head.length\n    }\n    // now we know the head matches!\n\n    // if the last portion is not empty, it MUST match the end\n    // check the tail\n    let fileTailMatch: number = 0\n    if (tail.length) {\n      // if head + tail > file, then we cannot possibly match\n      if (tail.length + fileIndex > file.length) return false\n\n      // try to match the tail\n      let tailStart = file.length - tail.length\n      if (this.#matchOne(file, tail, partial, tailStart, 0)) {\n        fileTailMatch = tail.length\n      } else {\n        // affordance for stuff like a/**/* matching a/b/\n        // if the last file portion is '', and there's more to the pattern\n        // then try without the '' bit.\n        if (\n          file[file.length - 1] !== '' ||\n          fileIndex + tail.length === file.length\n        ) {\n          return false\n        }\n        tailStart--\n        if (!this.#matchOne(file, tail, partial, tailStart, 0)) {\n          return false\n        }\n        fileTailMatch = tail.length + 1\n      }\n    }\n\n    // now we know the tail matches!\n\n    // the middle is zero or more portions wrapped in **, possibly\n    // containing more ** sections.\n    // so a/**/b/**/c/**/d has become **/b/**/c/**\n    // if it's empty, it means a/**/b, just verify we have no bad dots\n    // if there's no tail, so it ends on /**, then we must have *something*\n    // after the head, or it's not a matc\n    if (!body.length) {\n      let sawSome = !!fileTailMatch\n      for (let i = fileIndex; i < file.length - fileTailMatch; i++) {\n        const f = String(file[i])\n        sawSome = true\n        if (\n          f === '.' ||\n          f === '..' ||\n          (!this.options.dot && f.startsWith('.'))\n        ) {\n          return false\n        }\n      }\n      // in partial mode, we just need to get past all file parts\n      return partial || sawSome\n    }\n\n    // now we know that there's one or more body sections, which can\n    // be matched anywhere from the 0 index (because the head was pruned)\n    // through to the length-fileTailMatch index.\n    // split the body up into sections, and note the minimum index it can\n    // be found at (start with the length of all previous segments)\n    // [section, before, after]\n    const bodySegments: [ParseReturn[], number][] = [[[], 0]]\n    let currentBody: [ParseReturn[], number] = bodySegments[0]\n    let nonGsParts = 0\n    const nonGsPartsSums: number[] = [0]\n    for (const b of body) {\n      if (b === GLOBSTAR) {\n        nonGsPartsSums.push(nonGsParts)\n        currentBody = [[], 0]\n        bodySegments.push(currentBody)\n      } else {\n        currentBody[0].push(b)\n        nonGsParts++\n      }\n    }\n    let i = bodySegments.length - 1\n    const fileLength = file.length - fileTailMatch\n    for (const b of bodySegments) {\n      b[1] = fileLength - ((nonGsPartsSums[i--] as number) + b[0].length)\n    }\n\n    return !!this.#matchGlobStarBodySections(\n      file,\n      bodySegments,\n      fileIndex,\n      0,\n      partial,\n      0,\n      !!fileTailMatch,\n    )\n  }\n\n  // return false for \"nope, not matching\"\n  // return null for \"not matching, cannot keep trying\"\n  #matchGlobStarBodySections(\n    file: string[],\n    // pattern section, last possible position for it\n    bodySegments: [ParseReturn[], number][],\n    fileIndex: number,\n    bodyIndex: number,\n    partial: boolean,\n    globStarDepth: number,\n    sawTail: boolean,\n  ): boolean | null {\n    // take the first body segment, and walk from fileIndex to its \"after\"\n    // value at the end\n    // If it doesn't match at that position, we increment, until we hit\n    // that final possible position, and give up.\n    // If it does match, then advance and try to rest.\n    // If any of them fail we keep walking forward.\n    // this is still a bit recursively painful, but it's more constrained\n    // than previous implementations, because we never test something that\n    // can't possibly be a valid matching condition.\n    const bs = bodySegments[bodyIndex]\n    if (!bs) {\n      // just make sure that there's no bad dots\n      for (let i = fileIndex; i < file.length; i++) {\n        sawTail = true\n        const f = file[i]\n        if (\n          f === '.' ||\n          f === '..' ||\n          (!this.options.dot && f.startsWith('.'))\n        ) {\n          return false\n        }\n      }\n      return sawTail\n    }\n\n    // have a non-globstar body section to test\n    const [body, after] = bs\n    while (fileIndex <= after) {\n      const m = this.#matchOne(\n        file.slice(0, fileIndex + body.length),\n        body,\n        partial,\n        fileIndex,\n        0,\n      )\n      // if limit exceeded, no match. intentional false negative,\n      // acceptable break in correctness for security.\n      if (m && globStarDepth < this.maxGlobstarRecursion) {\n        // match! see if the rest match. if so, we're done!\n        const sub = this.#matchGlobStarBodySections(\n          file,\n          bodySegments,\n          fileIndex + body.length,\n          bodyIndex + 1,\n          partial,\n          globStarDepth + 1,\n          sawTail,\n        )\n        if (sub !== false) {\n          return sub\n        }\n      }\n      const f = file[fileIndex]\n      if (\n        f === '.' ||\n        f === '..' ||\n        (!this.options.dot && f.startsWith('.'))\n      ) {\n        return false\n      }\n\n      fileIndex++\n    }\n    // walked off. no point continuing\n    return partial || null\n  }\n\n  #matchOne(\n    file: string[],\n    pattern: ParseReturn[],\n    partial: boolean,\n    fileIndex: number,\n    patternIndex: number,\n  ) {\n    let fi: number\n    let pi: number\n    let pl: number\n    let fl: number\n    for (\n      fi = fileIndex,\n        pi = patternIndex,\n        fl = file.length,\n        pl = pattern.length;\n      fi < fl && pi < pl;\n      fi++, pi++\n    ) {\n      this.debug('matchOne loop')\n      let p = pattern[pi]\n      let f = file[fi]\n\n      this.debug(pattern, p, f)\n\n      // should be impossible.\n      // some invalid regexp stuff in the set.\n      /* c8 ignore start */\n      if (p === false || p === GLOBSTAR) {\n        return false\n      }\n      /* c8 ignore stop */\n\n      // something other than **\n      // non-magic patterns just have to match exactly\n      // patterns with magic have been turned into regexps.\n      let hit: boolean\n      if (typeof p === 'string') {\n        hit = f === p\n        this.debug('string match', p, f, hit)\n      } else {\n        hit = p.test(f)\n        this.debug('pattern match', p, f, hit)\n      }\n\n      if (!hit) return false\n    }\n\n    // Note: ending in / means that we'll get a final \"\"\n    // at the end of the pattern.  This can only match a\n    // corresponding \"\" at the end of the file.\n    // If the file ends in /, then it can only match a\n    // a pattern that ends in /, unless the pattern just\n    // doesn't have any more for it. But, a/b/ should *not*\n    // match \"a/b/*\", even though \"\" matches against the\n    // [^/]*? pattern, except in partial mode, where it might\n    // simply not be reached yet.\n    // However, a/b/ should still satisfy a/*\n\n    // now either we fell off the end of the pattern, or we're done.\n    if (fi === fl && pi === pl) {\n      // ran out of pattern and filename at the same time.\n      // an exact hit!\n      return true\n    } else if (fi === fl) {\n      // ran out of file, but still had pattern left.\n      // this is ok if we're doing the match as part of\n      // a glob fs traversal.\n      return partial\n    } else if (pi === pl) {\n      // ran out of pattern, still have file left.\n      // this is only acceptable if we're on the very last\n      // empty segment of a file with a trailing slash.\n      // a/* should match a/b/\n      return fi === fl - 1 && file[fi] === ''\n\n      /* c8 ignore start */\n    } else {\n      // should be unreachable.\n      throw new Error('wtf?')\n    }\n    /* c8 ignore stop */\n  }\n\n  braceExpand() {\n    return braceExpand(this.pattern, this.options)\n  }\n\n  parse(pattern: string): ParseReturn {\n    assertValidPattern(pattern)\n\n    const options = this.options\n\n    // shortcuts\n    if (pattern === '**') return GLOBSTAR\n    if (pattern === '') return ''\n\n    // far and away, the most common glob pattern parts are\n    // *, *.*, and *.  Add a fast check method for those.\n    let m: RegExpMatchArray | null\n    let fastTest: null | ((f: string) => boolean) = null\n    if ((m = pattern.match(starRE))) {\n      fastTest = options.dot ? starTestDot : starTest\n    } else if ((m = pattern.match(starDotExtRE))) {\n      fastTest = (\n        options.nocase ?\n          options.dot ?\n            starDotExtTestNocaseDot\n          : starDotExtTestNocase\n        : options.dot ? starDotExtTestDot\n        : starDotExtTest)(m[1])\n    } else if ((m = pattern.match(qmarksRE))) {\n      fastTest = (\n        options.nocase ?\n          options.dot ?\n            qmarksTestNocaseDot\n          : qmarksTestNocase\n        : options.dot ? qmarksTestDot\n        : qmarksTest)(m)\n    } else if ((m = pattern.match(starDotStarRE))) {\n      fastTest = options.dot ? starDotStarTestDot : starDotStarTest\n    } else if ((m = pattern.match(dotStarRE))) {\n      fastTest = dotStarTest\n    }\n\n    const re = AST.fromGlob(pattern, this.options).toMMPattern()\n    if (fastTest && typeof re === 'object') {\n      // Avoids overriding in frozen environments\n      Reflect.defineProperty(re, 'test', { value: fastTest })\n    }\n    return re\n  }\n\n  makeRe() {\n    if (this.regexp || this.regexp === false) return this.regexp\n\n    // at this point, this.set is a 2d array of partial\n    // pattern strings, or \"**\".\n    //\n    // It's better to use .match().  This function shouldn't\n    // be used, really, but it's pretty convenient sometimes,\n    // when you just want to work with a regex.\n    const set = this.set\n\n    if (!set.length) {\n      this.regexp = false\n      return this.regexp\n    }\n    const options = this.options\n\n    const twoStar =\n      options.noglobstar ? star\n      : options.dot ? twoStarDot\n      : twoStarNoDot\n    const flags = new Set(options.nocase ? ['i'] : [])\n\n    // regexpify non-globstar patterns\n    // if ** is only item, then we just do one twoStar\n    // if ** is first, and there are more, prepend (\\/|twoStar\\/)? to next\n    // if ** is last, append (\\/twoStar|) to previous\n    // if ** is in the middle, append (\\/|\\/twoStar\\/) to previous\n    // then filter out GLOBSTAR symbols\n    let re = set\n      .map(pattern => {\n        const pp: (string | typeof GLOBSTAR)[] = pattern.map(p => {\n          if (p instanceof RegExp) {\n            for (const f of p.flags.split('')) flags.add(f)\n          }\n          return (\n            typeof p === 'string' ? regExpEscape(p)\n            : p === GLOBSTAR ? GLOBSTAR\n            : p._src\n          )\n        }) as (string | typeof GLOBSTAR)[]\n        pp.forEach((p, i) => {\n          const next = pp[i + 1]\n          const prev = pp[i - 1]\n          if (p !== GLOBSTAR || prev === GLOBSTAR) {\n            return\n          }\n          if (prev === undefined) {\n            if (next !== undefined && next !== GLOBSTAR) {\n              pp[i + 1] = '(?:\\\\/|' + twoStar + '\\\\/)?' + next\n            } else {\n              pp[i] = twoStar\n            }\n          } else if (next === undefined) {\n            pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + ')?'\n          } else if (next !== GLOBSTAR) {\n            pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + '\\\\/)' + next\n            pp[i + 1] = GLOBSTAR\n          }\n        })\n        const filtered = pp.filter(p => p !== GLOBSTAR)\n\n        // For partial matches, we need to make the pattern match\n        // any prefix of the full path. We do this by generating\n        // alternative patterns that match progressively longer prefixes.\n        if (this.partial && filtered.length >= 1) {\n          const prefixes: string[] = []\n          for (let i = 1; i <= filtered.length; i++) {\n            prefixes.push(filtered.slice(0, i).join('/'))\n          }\n          return '(?:' + prefixes.join('|') + ')'\n        }\n\n        return filtered.join('/')\n      })\n      .join('|')\n\n    // need to wrap in parens if we had more than one thing with |,\n    // otherwise only the first will be anchored to ^ and the last to $\n    const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', '']\n    // must match entire pattern\n    // ending in a * or ** will make it less strict.\n    re = '^' + open + re + close + '$'\n\n    // In partial mode, '/' should always match as it's a valid prefix for any pattern\n    if (this.partial) {\n      re = '^(?:\\\\/|' + open + re.slice(1, -1) + close + ')$'\n    }\n\n    // can match anything, as long as it's not this.\n    if (this.negate) re = '^(?!' + re + ').+$'\n\n    try {\n      this.regexp = new RegExp(re, [...flags].join(''))\n      /* c8 ignore start */\n    } catch {\n      // should be impossible\n      this.regexp = false\n    }\n    /* c8 ignore stop */\n    return this.regexp\n  }\n\n  slashSplit(p: string) {\n    // if p starts with // on windows, we preserve that\n    // so that UNC paths aren't broken.  Otherwise, any number of\n    // / characters are coalesced into one, unless\n    // preserveMultipleSlashes is set to true.\n    if (this.preserveMultipleSlashes) {\n      return p.split('/')\n    } else if (this.isWindows && /^\\/\\/[^/]+/.test(p)) {\n      // add an extra '' for the one we lose\n      return ['', ...p.split(/\\/+/)]\n    } else {\n      return p.split(/\\/+/)\n    }\n  }\n\n  match(f: string, partial = this.partial) {\n    this.debug('match', f, this.pattern)\n    // short-circuit in the case of busted things.\n    // comments, etc.\n    if (this.comment) {\n      return false\n    }\n    if (this.empty) {\n      return f === ''\n    }\n\n    if (f === '/' && partial) {\n      return true\n    }\n\n    const options = this.options\n\n    // windows: need to use /, not \\\n    if (this.isWindows) {\n      f = f.split('\\\\').join('/')\n    }\n\n    // treat the test path as a set of pathparts.\n    const ff = this.slashSplit(f)\n    this.debug(this.pattern, 'split', ff)\n\n    // just ONE of the pattern sets in this.set needs to match\n    // in order for it to be valid.  If negating, then just one\n    // match means that we have failed.\n    // Either way, return on the first hit.\n\n    const set = this.set\n    this.debug(this.pattern, 'set', set)\n\n    // Find the basename of the path by looking for the last non-empty segment\n    let filename: string = ff[ff.length - 1]\n    if (!filename) {\n      for (let i = ff.length - 2; !filename && i >= 0; i--) {\n        filename = ff[i]\n      }\n    }\n\n    for (const pattern of set) {\n      let file = ff\n      if (options.matchBase && pattern.length === 1) {\n        file = [filename]\n      }\n      const hit = this.matchOne(file, pattern, partial)\n      if (hit) {\n        if (options.flipNegate) {\n          return true\n        }\n        return !this.negate\n      }\n    }\n\n    // didn't get any hits.  this is success if it's a negative\n    // pattern, failure otherwise.\n    if (options.flipNegate) {\n      return false\n    }\n    return this.negate\n  }\n\n  static defaults(def: MinimatchOptions) {\n    return minimatch.defaults(def).Minimatch\n  }\n}\n/* c8 ignore start */\nexport { AST } from './ast.js'\nexport { escape } from './escape.js'\nexport { unescape } from './unescape.js'\n/* c8 ignore stop */\nminimatch.AST = AST\nminimatch.Minimatch = Minimatch\nminimatch.escape = escape\nminimatch.unescape = unescape\n"]}
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/commonjs/package.json b/node_modules/minimatch/dist/commonjs/package.json
      new file mode 100644
      index 00000000..5bbefffb
      --- /dev/null
      +++ b/node_modules/minimatch/dist/commonjs/package.json
      @@ -0,0 +1,3 @@
      +{
      +  "type": "commonjs"
      +}
      diff --git a/node_modules/minimatch/dist/commonjs/unescape.d.ts b/node_modules/minimatch/dist/commonjs/unescape.d.ts
      new file mode 100644
      index 00000000..c4a14473
      --- /dev/null
      +++ b/node_modules/minimatch/dist/commonjs/unescape.d.ts
      @@ -0,0 +1,22 @@
      +import type { MinimatchOptions } from './index.js';
      +/**
      + * Un-escape a string that has been escaped with {@link escape}.
      + *
      + * If the {@link MinimatchOptions.windowsPathsNoEscape} option is used, then
      + * square-bracket escapes are removed, but not backslash escapes.
      + *
      + * For example, it will turn the string `'[*]'` into `*`, but it will not
      + * turn `'\\*'` into `'*'`, because `\` is a path separator in
      + * `windowsPathsNoEscape` mode.
      + *
      + * When `windowsPathsNoEscape` is not set, then both square-bracket escapes and
      + * backslash escapes are removed.
      + *
      + * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped
      + * or unescaped.
      + *
      + * When `magicalBraces` is not set, escapes of braces (`{` and `}`) will not be
      + * unescaped.
      + */
      +export declare const unescape: (s: string, { windowsPathsNoEscape, magicalBraces, }?: Pick) => string;
      +//# sourceMappingURL=unescape.d.ts.map
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/commonjs/unescape.d.ts.map b/node_modules/minimatch/dist/commonjs/unescape.d.ts.map
      new file mode 100644
      index 00000000..09d6eab4
      --- /dev/null
      +++ b/node_modules/minimatch/dist/commonjs/unescape.d.ts.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"unescape.d.ts","sourceRoot":"","sources":["../../src/unescape.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD;;;;;;;;;;;;;;;;;;GAkBG;AAEH,eAAO,MAAM,QAAQ,GACnB,GAAG,MAAM,EACT,2CAGG,IAAI,CAAC,gBAAgB,EAAE,sBAAsB,GAAG,eAAe,CAAM,WAczE,CAAA"}
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/commonjs/unescape.js b/node_modules/minimatch/dist/commonjs/unescape.js
      new file mode 100644
      index 00000000..ad648fba
      --- /dev/null
      +++ b/node_modules/minimatch/dist/commonjs/unescape.js
      @@ -0,0 +1,38 @@
      +"use strict";
      +Object.defineProperty(exports, "__esModule", { value: true });
      +exports.unescape = void 0;
      +/**
      + * Un-escape a string that has been escaped with {@link escape}.
      + *
      + * If the {@link MinimatchOptions.windowsPathsNoEscape} option is used, then
      + * square-bracket escapes are removed, but not backslash escapes.
      + *
      + * For example, it will turn the string `'[*]'` into `*`, but it will not
      + * turn `'\\*'` into `'*'`, because `\` is a path separator in
      + * `windowsPathsNoEscape` mode.
      + *
      + * When `windowsPathsNoEscape` is not set, then both square-bracket escapes and
      + * backslash escapes are removed.
      + *
      + * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped
      + * or unescaped.
      + *
      + * When `magicalBraces` is not set, escapes of braces (`{` and `}`) will not be
      + * unescaped.
      + */
      +const unescape = (s, { windowsPathsNoEscape = false, magicalBraces = true, } = {}) => {
      +    if (magicalBraces) {
      +        return windowsPathsNoEscape ?
      +            s.replace(/\[([^/\\])\]/g, '$1')
      +            : s
      +                .replace(/((?!\\).|^)\[([^/\\])\]/g, '$1$2')
      +                .replace(/\\([^/])/g, '$1');
      +    }
      +    return windowsPathsNoEscape ?
      +        s.replace(/\[([^/\\{}])\]/g, '$1')
      +        : s
      +            .replace(/((?!\\).|^)\[([^/\\{}])\]/g, '$1$2')
      +            .replace(/\\([^/{}])/g, '$1');
      +};
      +exports.unescape = unescape;
      +//# sourceMappingURL=unescape.js.map
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/commonjs/unescape.js.map b/node_modules/minimatch/dist/commonjs/unescape.js.map
      new file mode 100644
      index 00000000..44387ec5
      --- /dev/null
      +++ b/node_modules/minimatch/dist/commonjs/unescape.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"unescape.js","sourceRoot":"","sources":["../../src/unescape.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;;;;;;;;;;;GAkBG;AAEI,MAAM,QAAQ,GAAG,CACtB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,EAC5B,aAAa,GAAG,IAAI,MACgD,EAAE,EACxE,EAAE;IACF,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,oBAAoB,CAAC,CAAC;YACzB,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC;YAClC,CAAC,CAAC,CAAC;iBACE,OAAO,CAAC,0BAA0B,EAAE,MAAM,CAAC;iBAC3C,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;IACnC,CAAC;IACD,OAAO,oBAAoB,CAAC,CAAC;QACzB,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC;QACpC,CAAC,CAAC,CAAC;aACE,OAAO,CAAC,4BAA4B,EAAE,MAAM,CAAC;aAC7C,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,CAAA;AACrC,CAAC,CAAA;AAnBY,QAAA,QAAQ,YAmBpB","sourcesContent":["import type { MinimatchOptions } from './index.js'\n\n/**\n * Un-escape a string that has been escaped with {@link escape}.\n *\n * If the {@link MinimatchOptions.windowsPathsNoEscape} option is used, then\n * square-bracket escapes are removed, but not backslash escapes.\n *\n * For example, it will turn the string `'[*]'` into `*`, but it will not\n * turn `'\\\\*'` into `'*'`, because `\\` is a path separator in\n * `windowsPathsNoEscape` mode.\n *\n * When `windowsPathsNoEscape` is not set, then both square-bracket escapes and\n * backslash escapes are removed.\n *\n * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped\n * or unescaped.\n *\n * When `magicalBraces` is not set, escapes of braces (`{` and `}`) will not be\n * unescaped.\n */\n\nexport const unescape = (\n  s: string,\n  {\n    windowsPathsNoEscape = false,\n    magicalBraces = true,\n  }: Pick = {},\n) => {\n  if (magicalBraces) {\n    return windowsPathsNoEscape ?\n        s.replace(/\\[([^/\\\\])\\]/g, '$1')\n      : s\n          .replace(/((?!\\\\).|^)\\[([^/\\\\])\\]/g, '$1$2')\n          .replace(/\\\\([^/])/g, '$1')\n  }\n  return windowsPathsNoEscape ?\n      s.replace(/\\[([^/\\\\{}])\\]/g, '$1')\n    : s\n        .replace(/((?!\\\\).|^)\\[([^/\\\\{}])\\]/g, '$1$2')\n        .replace(/\\\\([^/{}])/g, '$1')\n}\n"]}
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts b/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts
      new file mode 100644
      index 00000000..34d7a78a
      --- /dev/null
      +++ b/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts
      @@ -0,0 +1,2 @@
      +export declare const assertValidPattern: (pattern: unknown) => void;
      +//# sourceMappingURL=assert-valid-pattern.d.ts.map
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts.map b/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts.map
      new file mode 100644
      index 00000000..30ddcd51
      --- /dev/null
      +++ b/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"assert-valid-pattern.d.ts","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,kBAAkB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAUtD,CAAA"}
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/esm/assert-valid-pattern.js b/node_modules/minimatch/dist/esm/assert-valid-pattern.js
      new file mode 100644
      index 00000000..7b534fc3
      --- /dev/null
      +++ b/node_modules/minimatch/dist/esm/assert-valid-pattern.js
      @@ -0,0 +1,10 @@
      +const MAX_PATTERN_LENGTH = 1024 * 64;
      +export const assertValidPattern = (pattern) => {
      +    if (typeof pattern !== 'string') {
      +        throw new TypeError('invalid pattern');
      +    }
      +    if (pattern.length > MAX_PATTERN_LENGTH) {
      +        throw new TypeError('pattern is too long');
      +    }
      +};
      +//# sourceMappingURL=assert-valid-pattern.js.map
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/esm/assert-valid-pattern.js.map b/node_modules/minimatch/dist/esm/assert-valid-pattern.js.map
      new file mode 100644
      index 00000000..550f61df
      --- /dev/null
      +++ b/node_modules/minimatch/dist/esm/assert-valid-pattern.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"assert-valid-pattern.js","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAE,CAAA;AACpC,MAAM,CAAC,MAAM,kBAAkB,GAA+B,CAC5D,OAAgB,EACW,EAAE;IAC7B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAA;IACxC,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACxC,MAAM,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAA;IAC5C,CAAC;AACH,CAAC,CAAA","sourcesContent":["const MAX_PATTERN_LENGTH = 1024 * 64\nexport const assertValidPattern: (pattern: unknown) => void = (\n  pattern: unknown,\n): asserts pattern is string => {\n  if (typeof pattern !== 'string') {\n    throw new TypeError('invalid pattern')\n  }\n\n  if (pattern.length > MAX_PATTERN_LENGTH) {\n    throw new TypeError('pattern is too long')\n  }\n}\n"]}
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/esm/ast.d.ts b/node_modules/minimatch/dist/esm/ast.d.ts
      new file mode 100644
      index 00000000..74f2cf93
      --- /dev/null
      +++ b/node_modules/minimatch/dist/esm/ast.d.ts
      @@ -0,0 +1,22 @@
      +import type { MinimatchOptions, MMRegExp } from './index.js';
      +export type ExtglobType = '!' | '?' | '+' | '*' | '@';
      +export declare class AST {
      +    #private;
      +    type: ExtglobType | null;
      +    id: number;
      +    get depth(): number;
      +    constructor(type: ExtglobType | null, parent?: AST, options?: MinimatchOptions);
      +    get hasMagic(): boolean | undefined;
      +    toString(): string;
      +    push(...parts: (string | AST)[]): void;
      +    toJSON(): unknown[];
      +    isStart(): boolean;
      +    isEnd(): boolean;
      +    copyIn(part: AST | string): void;
      +    clone(parent: AST): AST;
      +    static fromGlob(pattern: string, options?: MinimatchOptions): AST;
      +    toMMPattern(): MMRegExp | string;
      +    get options(): MinimatchOptions;
      +    toRegExpSource(allowDot?: boolean): [re: string, body: string, hasMagic: boolean, uflag: boolean];
      +}
      +//# sourceMappingURL=ast.d.ts.map
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/esm/ast.d.ts.map b/node_modules/minimatch/dist/esm/ast.d.ts.map
      new file mode 100644
      index 00000000..8965fd6a
      --- /dev/null
      +++ b/node_modules/minimatch/dist/esm/ast.d.ts.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAwC5D,MAAM,MAAM,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AAgJrD,qBAAa,GAAG;;IACd,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;IAexB,EAAE,SAAO;IAET,IAAI,KAAK,IAAI,MAAM,CAElB;gBAgBC,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,MAAM,CAAC,EAAE,GAAG,EACZ,OAAO,GAAE,gBAAqB;IAahC,IAAI,QAAQ,IAAI,OAAO,GAAG,SAAS,CAUlC;IAGD,QAAQ,IAAI,MAAM;IAkDlB,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE;IAe/B,MAAM;IAkBN,OAAO,IAAI,OAAO;IAgBlB,KAAK,IAAI,OAAO;IAYhB,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM;IAKzB,KAAK,CAAC,MAAM,EAAE,GAAG;IAsQjB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;IAQ/D,WAAW,IAAI,QAAQ,GAAG,MAAM;IA2BhC,IAAI,OAAO,qBAEV;IAuED,cAAc,CACZ,QAAQ,CAAC,EAAE,OAAO,GACjB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC;CA6OjE"}
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/esm/ast.js b/node_modules/minimatch/dist/esm/ast.js
      new file mode 100644
      index 00000000..f6395465
      --- /dev/null
      +++ b/node_modules/minimatch/dist/esm/ast.js
      @@ -0,0 +1,841 @@
      +// parse a single path portion
      +var _a;
      +import { parseClass } from './brace-expressions.js';
      +import { unescape } from './unescape.js';
      +const types = new Set(['!', '?', '+', '*', '@']);
      +const isExtglobType = (c) => types.has(c);
      +const isExtglobAST = (c) => isExtglobType(c.type);
      +// Map of which extglob types can adopt the children of a nested extglob
      +//
      +// anything but ! can adopt a matching type:
      +// +(a|+(b|c)|d) => +(a|b|c|d)
      +// *(a|*(b|c)|d) => *(a|b|c|d)
      +// @(a|@(b|c)|d) => @(a|b|c|d)
      +// ?(a|?(b|c)|d) => ?(a|b|c|d)
      +//
      +// * can adopt anything, because 0 or repetition is allowed
      +// *(a|?(b|c)|d) => *(a|b|c|d)
      +// *(a|+(b|c)|d) => *(a|b|c|d)
      +// *(a|@(b|c)|d) => *(a|b|c|d)
      +//
      +// + can adopt @, because 1 or repetition is allowed
      +// +(a|@(b|c)|d) => +(a|b|c|d)
      +//
      +// + and @ CANNOT adopt *, because 0 would be allowed
      +// +(a|*(b|c)|d) => would match "", on *(b|c)
      +// @(a|*(b|c)|d) => would match "", on *(b|c)
      +//
      +// + and @ CANNOT adopt ?, because 0 would be allowed
      +// +(a|?(b|c)|d) => would match "", on ?(b|c)
      +// @(a|?(b|c)|d) => would match "", on ?(b|c)
      +//
      +// ? can adopt @, because 0 or 1 is allowed
      +// ?(a|@(b|c)|d) => ?(a|b|c|d)
      +//
      +// ? and @ CANNOT adopt * or +, because >1 would be allowed
      +// ?(a|*(b|c)|d) => would match bbb on *(b|c)
      +// @(a|*(b|c)|d) => would match bbb on *(b|c)
      +// ?(a|+(b|c)|d) => would match bbb on +(b|c)
      +// @(a|+(b|c)|d) => would match bbb on +(b|c)
      +//
      +// ! CANNOT adopt ! (nothing else can either)
      +// !(a|!(b|c)|d) => !(a|b|c|d) would fail to match on b (not not b|c)
      +//
      +// ! can adopt @
      +// !(a|@(b|c)|d) => !(a|b|c|d)
      +//
      +// ! CANNOT adopt *
      +// !(a|*(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed
      +//
      +// ! CANNOT adopt +
      +// !(a|+(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed
      +//
      +// ! CANNOT adopt ?
      +// x!(a|?(b|c)|d) => x!(a|b|c|d) would fail to match "x"
      +const adoptionMap = new Map([
      +    ['!', ['@']],
      +    ['?', ['?', '@']],
      +    ['@', ['@']],
      +    ['*', ['*', '+', '?', '@']],
      +    ['+', ['+', '@']],
      +]);
      +// nested extglobs that can be adopted in, but with the addition of
      +// a blank '' element.
      +const adoptionWithSpaceMap = new Map([
      +    ['!', ['?']],
      +    ['@', ['?']],
      +    ['+', ['?', '*']],
      +]);
      +// union of the previous two maps
      +const adoptionAnyMap = new Map([
      +    ['!', ['?', '@']],
      +    ['?', ['?', '@']],
      +    ['@', ['?', '@']],
      +    ['*', ['*', '+', '?', '@']],
      +    ['+', ['+', '@', '?', '*']],
      +]);
      +// Extglobs that can take over their parent if they are the only child
      +// the key is parent, value maps child to resulting extglob parent type
      +// '@' is omitted because it's a special case. An `@` extglob with a single
      +// member can always be usurped by that subpattern.
      +const usurpMap = new Map([
      +    ['!', new Map([['!', '@']])],
      +    [
      +        '?',
      +        new Map([
      +            ['*', '*'],
      +            ['+', '*'],
      +        ]),
      +    ],
      +    [
      +        '@',
      +        new Map([
      +            ['!', '!'],
      +            ['?', '?'],
      +            ['@', '@'],
      +            ['*', '*'],
      +            ['+', '+'],
      +        ]),
      +    ],
      +    [
      +        '+',
      +        new Map([
      +            ['?', '*'],
      +            ['*', '*'],
      +        ]),
      +    ],
      +]);
      +// Patterns that get prepended to bind to the start of either the
      +// entire string, or just a single path portion, to prevent dots
      +// and/or traversal patterns, when needed.
      +// Exts don't need the ^ or / bit, because the root binds that already.
      +const startNoTraversal = '(?!(?:^|/)\\.\\.?(?:$|/))';
      +const startNoDot = '(?!\\.)';
      +// characters that indicate a start of pattern needs the "no dots" bit,
      +// because a dot *might* be matched. ( is not in the list, because in
      +// the case of a child extglob, it will handle the prevention itself.
      +const addPatternStart = new Set(['[', '.']);
      +// cases where traversal is A-OK, no dot prevention needed
      +const justDots = new Set(['..', '.']);
      +const reSpecials = new Set('().*{}+?[]^$\\!');
      +const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
      +// any single thing other than /
      +const qmark = '[^/]';
      +// * => any number of characters
      +const star = qmark + '*?';
      +// use + when we need to ensure that *something* matches, because the * is
      +// the only thing in the path portion.
      +const starNoEmpty = qmark + '+?';
      +// remove the \ chars that we added if we end up doing a nonmagic compare
      +// const deslash = (s: string) => s.replace(/\\(.)/g, '$1')
      +let ID = 0;
      +export class AST {
      +    type;
      +    #root;
      +    #hasMagic;
      +    #uflag = false;
      +    #parts = [];
      +    #parent;
      +    #parentIndex;
      +    #negs;
      +    #filledNegs = false;
      +    #options;
      +    #toString;
      +    // set to true if it's an extglob with no children
      +    // (which really means one child of '')
      +    #emptyExt = false;
      +    id = ++ID;
      +    get depth() {
      +        return (this.#parent?.depth ?? -1) + 1;
      +    }
      +    [Symbol.for('nodejs.util.inspect.custom')]() {
      +        return {
      +            '@@type': 'AST',
      +            id: this.id,
      +            type: this.type,
      +            root: this.#root.id,
      +            parent: this.#parent?.id,
      +            depth: this.depth,
      +            partsLength: this.#parts.length,
      +            parts: this.#parts,
      +        };
      +    }
      +    constructor(type, parent, options = {}) {
      +        this.type = type;
      +        // extglobs are inherently magical
      +        if (type)
      +            this.#hasMagic = true;
      +        this.#parent = parent;
      +        this.#root = this.#parent ? this.#parent.#root : this;
      +        this.#options = this.#root === this ? options : this.#root.#options;
      +        this.#negs = this.#root === this ? [] : this.#root.#negs;
      +        if (type === '!' && !this.#root.#filledNegs)
      +            this.#negs.push(this);
      +        this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0;
      +    }
      +    get hasMagic() {
      +        /* c8 ignore start */
      +        if (this.#hasMagic !== undefined)
      +            return this.#hasMagic;
      +        /* c8 ignore stop */
      +        for (const p of this.#parts) {
      +            if (typeof p === 'string')
      +                continue;
      +            if (p.type || p.hasMagic)
      +                return (this.#hasMagic = true);
      +        }
      +        // note: will be undefined until we generate the regexp src and find out
      +        return this.#hasMagic;
      +    }
      +    // reconstructs the pattern
      +    toString() {
      +        return (this.#toString !== undefined ? this.#toString
      +            : !this.type ?
      +                (this.#toString = this.#parts.map(p => String(p)).join(''))
      +                : (this.#toString =
      +                    this.type +
      +                        '(' +
      +                        this.#parts.map(p => String(p)).join('|') +
      +                        ')'));
      +    }
      +    #fillNegs() {
      +        /* c8 ignore start */
      +        if (this !== this.#root)
      +            throw new Error('should only call on root');
      +        if (this.#filledNegs)
      +            return this;
      +        /* c8 ignore stop */
      +        // call toString() once to fill this out
      +        this.toString();
      +        this.#filledNegs = true;
      +        let n;
      +        while ((n = this.#negs.pop())) {
      +            if (n.type !== '!')
      +                continue;
      +            // walk up the tree, appending everthing that comes AFTER parentIndex
      +            let p = n;
      +            let pp = p.#parent;
      +            while (pp) {
      +                for (let i = p.#parentIndex + 1; !pp.type && i < pp.#parts.length; i++) {
      +                    for (const part of n.#parts) {
      +                        /* c8 ignore start */
      +                        if (typeof part === 'string') {
      +                            throw new Error('string part in extglob AST??');
      +                        }
      +                        /* c8 ignore stop */
      +                        part.copyIn(pp.#parts[i]);
      +                    }
      +                }
      +                p = pp;
      +                pp = p.#parent;
      +            }
      +        }
      +        return this;
      +    }
      +    push(...parts) {
      +        for (const p of parts) {
      +            if (p === '')
      +                continue;
      +            /* c8 ignore start */
      +            if (typeof p !== 'string' &&
      +                !(p instanceof _a && p.#parent === this)) {
      +                throw new Error('invalid part: ' + p);
      +            }
      +            /* c8 ignore stop */
      +            this.#parts.push(p);
      +        }
      +    }
      +    toJSON() {
      +        const ret = this.type === null ?
      +            this.#parts
      +                .slice()
      +                .map(p => (typeof p === 'string' ? p : p.toJSON()))
      +            : [this.type, ...this.#parts.map(p => p.toJSON())];
      +        if (this.isStart() && !this.type)
      +            ret.unshift([]);
      +        if (this.isEnd() &&
      +            (this === this.#root ||
      +                (this.#root.#filledNegs && this.#parent?.type === '!'))) {
      +            ret.push({});
      +        }
      +        return ret;
      +    }
      +    isStart() {
      +        if (this.#root === this)
      +            return true;
      +        // if (this.type) return !!this.#parent?.isStart()
      +        if (!this.#parent?.isStart())
      +            return false;
      +        if (this.#parentIndex === 0)
      +            return true;
      +        // if everything AHEAD of this is a negation, then it's still the "start"
      +        const p = this.#parent;
      +        for (let i = 0; i < this.#parentIndex; i++) {
      +            const pp = p.#parts[i];
      +            if (!(pp instanceof _a && pp.type === '!')) {
      +                return false;
      +            }
      +        }
      +        return true;
      +    }
      +    isEnd() {
      +        if (this.#root === this)
      +            return true;
      +        if (this.#parent?.type === '!')
      +            return true;
      +        if (!this.#parent?.isEnd())
      +            return false;
      +        if (!this.type)
      +            return this.#parent?.isEnd();
      +        // if not root, it'll always have a parent
      +        /* c8 ignore start */
      +        const pl = this.#parent ? this.#parent.#parts.length : 0;
      +        /* c8 ignore stop */
      +        return this.#parentIndex === pl - 1;
      +    }
      +    copyIn(part) {
      +        if (typeof part === 'string')
      +            this.push(part);
      +        else
      +            this.push(part.clone(this));
      +    }
      +    clone(parent) {
      +        const c = new _a(this.type, parent);
      +        for (const p of this.#parts) {
      +            c.copyIn(p);
      +        }
      +        return c;
      +    }
      +    static #parseAST(str, ast, pos, opt, extDepth) {
      +        const maxDepth = opt.maxExtglobRecursion ?? 2;
      +        let escaping = false;
      +        let inBrace = false;
      +        let braceStart = -1;
      +        let braceNeg = false;
      +        if (ast.type === null) {
      +            // outside of a extglob, append until we find a start
      +            let i = pos;
      +            let acc = '';
      +            while (i < str.length) {
      +                const c = str.charAt(i++);
      +                // still accumulate escapes at this point, but we do ignore
      +                // starts that are escaped
      +                if (escaping || c === '\\') {
      +                    escaping = !escaping;
      +                    acc += c;
      +                    continue;
      +                }
      +                if (inBrace) {
      +                    if (i === braceStart + 1) {
      +                        if (c === '^' || c === '!') {
      +                            braceNeg = true;
      +                        }
      +                    }
      +                    else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {
      +                        inBrace = false;
      +                    }
      +                    acc += c;
      +                    continue;
      +                }
      +                else if (c === '[') {
      +                    inBrace = true;
      +                    braceStart = i;
      +                    braceNeg = false;
      +                    acc += c;
      +                    continue;
      +                }
      +                // we don't have to check for adoption here, because that's
      +                // done at the other recursion point.
      +                const doRecurse = !opt.noext &&
      +                    isExtglobType(c) &&
      +                    str.charAt(i) === '(' &&
      +                    extDepth <= maxDepth;
      +                if (doRecurse) {
      +                    ast.push(acc);
      +                    acc = '';
      +                    const ext = new _a(c, ast);
      +                    i = _a.#parseAST(str, ext, i, opt, extDepth + 1);
      +                    ast.push(ext);
      +                    continue;
      +                }
      +                acc += c;
      +            }
      +            ast.push(acc);
      +            return i;
      +        }
      +        // some kind of extglob, pos is at the (
      +        // find the next | or )
      +        let i = pos + 1;
      +        let part = new _a(null, ast);
      +        const parts = [];
      +        let acc = '';
      +        while (i < str.length) {
      +            const c = str.charAt(i++);
      +            // still accumulate escapes at this point, but we do ignore
      +            // starts that are escaped
      +            if (escaping || c === '\\') {
      +                escaping = !escaping;
      +                acc += c;
      +                continue;
      +            }
      +            if (inBrace) {
      +                if (i === braceStart + 1) {
      +                    if (c === '^' || c === '!') {
      +                        braceNeg = true;
      +                    }
      +                }
      +                else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {
      +                    inBrace = false;
      +                }
      +                acc += c;
      +                continue;
      +            }
      +            else if (c === '[') {
      +                inBrace = true;
      +                braceStart = i;
      +                braceNeg = false;
      +                acc += c;
      +                continue;
      +            }
      +            const doRecurse = !opt.noext &&
      +                isExtglobType(c) &&
      +                str.charAt(i) === '(' &&
      +                /* c8 ignore start - the maxDepth is sufficient here */
      +                (extDepth <= maxDepth || (ast && ast.#canAdoptType(c)));
      +            /* c8 ignore stop */
      +            if (doRecurse) {
      +                const depthAdd = ast && ast.#canAdoptType(c) ? 0 : 1;
      +                part.push(acc);
      +                acc = '';
      +                const ext = new _a(c, part);
      +                part.push(ext);
      +                i = _a.#parseAST(str, ext, i, opt, extDepth + depthAdd);
      +                continue;
      +            }
      +            if (c === '|') {
      +                part.push(acc);
      +                acc = '';
      +                parts.push(part);
      +                part = new _a(null, ast);
      +                continue;
      +            }
      +            if (c === ')') {
      +                if (acc === '' && ast.#parts.length === 0) {
      +                    ast.#emptyExt = true;
      +                }
      +                part.push(acc);
      +                acc = '';
      +                ast.push(...parts, part);
      +                return i;
      +            }
      +            acc += c;
      +        }
      +        // unfinished extglob
      +        // if we got here, it was a malformed extglob! not an extglob, but
      +        // maybe something else in there.
      +        ast.type = null;
      +        ast.#hasMagic = undefined;
      +        ast.#parts = [str.substring(pos - 1)];
      +        return i;
      +    }
      +    #canAdoptWithSpace(child) {
      +        return this.#canAdopt(child, adoptionWithSpaceMap);
      +    }
      +    #canAdopt(child, map = adoptionMap) {
      +        if (!child ||
      +            typeof child !== 'object' ||
      +            child.type !== null ||
      +            child.#parts.length !== 1 ||
      +            this.type === null) {
      +            return false;
      +        }
      +        const gc = child.#parts[0];
      +        if (!gc || typeof gc !== 'object' || gc.type === null) {
      +            return false;
      +        }
      +        return this.#canAdoptType(gc.type, map);
      +    }
      +    #canAdoptType(c, map = adoptionAnyMap) {
      +        return !!map.get(this.type)?.includes(c);
      +    }
      +    #adoptWithSpace(child, index) {
      +        const gc = child.#parts[0];
      +        const blank = new _a(null, gc, this.options);
      +        blank.#parts.push('');
      +        gc.push(blank);
      +        this.#adopt(child, index);
      +    }
      +    #adopt(child, index) {
      +        const gc = child.#parts[0];
      +        this.#parts.splice(index, 1, ...gc.#parts);
      +        for (const p of gc.#parts) {
      +            if (typeof p === 'object')
      +                p.#parent = this;
      +        }
      +        this.#toString = undefined;
      +    }
      +    #canUsurpType(c) {
      +        const m = usurpMap.get(this.type);
      +        return !!m?.has(c);
      +    }
      +    #canUsurp(child) {
      +        if (!child ||
      +            typeof child !== 'object' ||
      +            child.type !== null ||
      +            child.#parts.length !== 1 ||
      +            this.type === null ||
      +            this.#parts.length !== 1) {
      +            return false;
      +        }
      +        const gc = child.#parts[0];
      +        if (!gc || typeof gc !== 'object' || gc.type === null) {
      +            return false;
      +        }
      +        return this.#canUsurpType(gc.type);
      +    }
      +    #usurp(child) {
      +        const m = usurpMap.get(this.type);
      +        const gc = child.#parts[0];
      +        const nt = m?.get(gc.type);
      +        /* c8 ignore start - impossible */
      +        if (!nt)
      +            return false;
      +        /* c8 ignore stop */
      +        this.#parts = gc.#parts;
      +        for (const p of this.#parts) {
      +            if (typeof p === 'object') {
      +                p.#parent = this;
      +            }
      +        }
      +        this.type = nt;
      +        this.#toString = undefined;
      +        this.#emptyExt = false;
      +    }
      +    static fromGlob(pattern, options = {}) {
      +        const ast = new _a(null, undefined, options);
      +        _a.#parseAST(pattern, ast, 0, options, 0);
      +        return ast;
      +    }
      +    // returns the regular expression if there's magic, or the unescaped
      +    // string if not.
      +    toMMPattern() {
      +        // should only be called on root
      +        /* c8 ignore start */
      +        if (this !== this.#root)
      +            return this.#root.toMMPattern();
      +        /* c8 ignore stop */
      +        const glob = this.toString();
      +        const [re, body, hasMagic, uflag] = this.toRegExpSource();
      +        // if we're in nocase mode, and not nocaseMagicOnly, then we do
      +        // still need a regular expression if we have to case-insensitively
      +        // match capital/lowercase characters.
      +        const anyMagic = hasMagic ||
      +            this.#hasMagic ||
      +            (this.#options.nocase &&
      +                !this.#options.nocaseMagicOnly &&
      +                glob.toUpperCase() !== glob.toLowerCase());
      +        if (!anyMagic) {
      +            return body;
      +        }
      +        const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '');
      +        return Object.assign(new RegExp(`^${re}$`, flags), {
      +            _src: re,
      +            _glob: glob,
      +        });
      +    }
      +    get options() {
      +        return this.#options;
      +    }
      +    // returns the string match, the regexp source, whether there's magic
      +    // in the regexp (so a regular expression is required) and whether or
      +    // not the uflag is needed for the regular expression (for posix classes)
      +    // TODO: instead of injecting the start/end at this point, just return
      +    // the BODY of the regexp, along with the start/end portions suitable
      +    // for binding the start/end in either a joined full-path makeRe context
      +    // (where we bind to (^|/), or a standalone matchPart context (where
      +    // we bind to ^, and not /).  Otherwise slashes get duped!
      +    //
      +    // In part-matching mode, the start is:
      +    // - if not isStart: nothing
      +    // - if traversal possible, but not allowed: ^(?!\.\.?$)
      +    // - if dots allowed or not possible: ^
      +    // - if dots possible and not allowed: ^(?!\.)
      +    // end is:
      +    // - if not isEnd(): nothing
      +    // - else: $
      +    //
      +    // In full-path matching mode, we put the slash at the START of the
      +    // pattern, so start is:
      +    // - if first pattern: same as part-matching mode
      +    // - if not isStart(): nothing
      +    // - if traversal possible, but not allowed: /(?!\.\.?(?:$|/))
      +    // - if dots allowed or not possible: /
      +    // - if dots possible and not allowed: /(?!\.)
      +    // end is:
      +    // - if last pattern, same as part-matching mode
      +    // - else nothing
      +    //
      +    // Always put the (?:$|/) on negated tails, though, because that has to be
      +    // there to bind the end of the negated pattern portion, and it's easier to
      +    // just stick it in now rather than try to inject it later in the middle of
      +    // the pattern.
      +    //
      +    // We can just always return the same end, and leave it up to the caller
      +    // to know whether it's going to be used joined or in parts.
      +    // And, if the start is adjusted slightly, can do the same there:
      +    // - if not isStart: nothing
      +    // - if traversal possible, but not allowed: (?:/|^)(?!\.\.?$)
      +    // - if dots allowed or not possible: (?:/|^)
      +    // - if dots possible and not allowed: (?:/|^)(?!\.)
      +    //
      +    // But it's better to have a simpler binding without a conditional, for
      +    // performance, so probably better to return both start options.
      +    //
      +    // Then the caller just ignores the end if it's not the first pattern,
      +    // and the start always gets applied.
      +    //
      +    // But that's always going to be $ if it's the ending pattern, or nothing,
      +    // so the caller can just attach $ at the end of the pattern when building.
      +    //
      +    // So the todo is:
      +    // - better detect what kind of start is needed
      +    // - return both flavors of starting pattern
      +    // - attach $ at the end of the pattern when creating the actual RegExp
      +    //
      +    // Ah, but wait, no, that all only applies to the root when the first pattern
      +    // is not an extglob. If the first pattern IS an extglob, then we need all
      +    // that dot prevention biz to live in the extglob portions, because eg
      +    // +(*|.x*) can match .xy but not .yx.
      +    //
      +    // So, return the two flavors if it's #root and the first child is not an
      +    // AST, otherwise leave it to the child AST to handle it, and there,
      +    // use the (?:^|/) style of start binding.
      +    //
      +    // Even simplified further:
      +    // - Since the start for a join is eg /(?!\.) and the start for a part
      +    // is ^(?!\.), we can just prepend (?!\.) to the pattern (either root
      +    // or start or whatever) and prepend ^ or / at the Regexp construction.
      +    toRegExpSource(allowDot) {
      +        const dot = allowDot ?? !!this.#options.dot;
      +        if (this.#root === this) {
      +            this.#flatten();
      +            this.#fillNegs();
      +        }
      +        if (!isExtglobAST(this)) {
      +            const noEmpty = this.isStart() &&
      +                this.isEnd() &&
      +                !this.#parts.some(s => typeof s !== 'string');
      +            const src = this.#parts
      +                .map(p => {
      +                const [re, _, hasMagic, uflag] = typeof p === 'string' ?
      +                    _a.#parseGlob(p, this.#hasMagic, noEmpty)
      +                    : p.toRegExpSource(allowDot);
      +                this.#hasMagic = this.#hasMagic || hasMagic;
      +                this.#uflag = this.#uflag || uflag;
      +                return re;
      +            })
      +                .join('');
      +            let start = '';
      +            if (this.isStart()) {
      +                if (typeof this.#parts[0] === 'string') {
      +                    // this is the string that will match the start of the pattern,
      +                    // so we need to protect against dots and such.
      +                    // '.' and '..' cannot match unless the pattern is that exactly,
      +                    // even if it starts with . or dot:true is set.
      +                    const dotTravAllowed = this.#parts.length === 1 && justDots.has(this.#parts[0]);
      +                    if (!dotTravAllowed) {
      +                        const aps = addPatternStart;
      +                        // check if we have a possibility of matching . or ..,
      +                        // and prevent that.
      +                        const needNoTrav = 
      +                        // dots are allowed, and the pattern starts with [ or .
      +                        (dot && aps.has(src.charAt(0))) ||
      +                            // the pattern starts with \., and then [ or .
      +                            (src.startsWith('\\.') && aps.has(src.charAt(2))) ||
      +                            // the pattern starts with \.\., and then [ or .
      +                            (src.startsWith('\\.\\.') && aps.has(src.charAt(4)));
      +                        // no need to prevent dots if it can't match a dot, or if a
      +                        // sub-pattern will be preventing it anyway.
      +                        const needNoDot = !dot && !allowDot && aps.has(src.charAt(0));
      +                        start =
      +                            needNoTrav ? startNoTraversal
      +                                : needNoDot ? startNoDot
      +                                    : '';
      +                    }
      +                }
      +            }
      +            // append the "end of path portion" pattern to negation tails
      +            let end = '';
      +            if (this.isEnd() &&
      +                this.#root.#filledNegs &&
      +                this.#parent?.type === '!') {
      +                end = '(?:$|\\/)';
      +            }
      +            const final = start + src + end;
      +            return [
      +                final,
      +                unescape(src),
      +                (this.#hasMagic = !!this.#hasMagic),
      +                this.#uflag,
      +            ];
      +        }
      +        // We need to calculate the body *twice* if it's a repeat pattern
      +        // at the start, once in nodot mode, then again in dot mode, so a
      +        // pattern like *(?) can match 'x.y'
      +        const repeated = this.type === '*' || this.type === '+';
      +        // some kind of extglob
      +        const start = this.type === '!' ? '(?:(?!(?:' : '(?:';
      +        let body = this.#partsToRegExp(dot);
      +        if (this.isStart() && this.isEnd() && !body && this.type !== '!') {
      +            // invalid extglob, has to at least be *something* present, if it's
      +            // the entire path portion.
      +            const s = this.toString();
      +            const me = this;
      +            me.#parts = [s];
      +            me.type = null;
      +            me.#hasMagic = undefined;
      +            return [s, unescape(this.toString()), false, false];
      +        }
      +        let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot ?
      +            ''
      +            : this.#partsToRegExp(true);
      +        if (bodyDotAllowed === body) {
      +            bodyDotAllowed = '';
      +        }
      +        if (bodyDotAllowed) {
      +            body = `(?:${body})(?:${bodyDotAllowed})*?`;
      +        }
      +        // an empty !() is exactly equivalent to a starNoEmpty
      +        let final = '';
      +        if (this.type === '!' && this.#emptyExt) {
      +            final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty;
      +        }
      +        else {
      +            const close = this.type === '!' ?
      +                // !() must match something,but !(x) can match ''
      +                '))' +
      +                    (this.isStart() && !dot && !allowDot ? startNoDot : '') +
      +                    star +
      +                    ')'
      +                : this.type === '@' ? ')'
      +                    : this.type === '?' ? ')?'
      +                        : this.type === '+' && bodyDotAllowed ? ')'
      +                            : this.type === '*' && bodyDotAllowed ? `)?`
      +                                : `)${this.type}`;
      +            final = start + body + close;
      +        }
      +        return [
      +            final,
      +            unescape(body),
      +            (this.#hasMagic = !!this.#hasMagic),
      +            this.#uflag,
      +        ];
      +    }
      +    #flatten() {
      +        if (!isExtglobAST(this)) {
      +            for (const p of this.#parts) {
      +                if (typeof p === 'object') {
      +                    p.#flatten();
      +                }
      +            }
      +        }
      +        else {
      +            // do up to 10 passes to flatten as much as possible
      +            let iterations = 0;
      +            let done = false;
      +            do {
      +                done = true;
      +                for (let i = 0; i < this.#parts.length; i++) {
      +                    const c = this.#parts[i];
      +                    if (typeof c === 'object') {
      +                        c.#flatten();
      +                        if (this.#canAdopt(c)) {
      +                            done = false;
      +                            this.#adopt(c, i);
      +                        }
      +                        else if (this.#canAdoptWithSpace(c)) {
      +                            done = false;
      +                            this.#adoptWithSpace(c, i);
      +                        }
      +                        else if (this.#canUsurp(c)) {
      +                            done = false;
      +                            this.#usurp(c);
      +                        }
      +                    }
      +                }
      +            } while (!done && ++iterations < 10);
      +        }
      +        this.#toString = undefined;
      +    }
      +    #partsToRegExp(dot) {
      +        return this.#parts
      +            .map(p => {
      +            // extglob ASTs should only contain parent ASTs
      +            /* c8 ignore start */
      +            if (typeof p === 'string') {
      +                throw new Error('string type in extglob ast??');
      +            }
      +            /* c8 ignore stop */
      +            // can ignore hasMagic, because extglobs are already always magic
      +            const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot);
      +            this.#uflag = this.#uflag || uflag;
      +            return re;
      +        })
      +            .filter(p => !(this.isStart() && this.isEnd()) || !!p)
      +            .join('|');
      +    }
      +    static #parseGlob(glob, hasMagic, noEmpty = false) {
      +        let escaping = false;
      +        let re = '';
      +        let uflag = false;
      +        // multiple stars that aren't globstars coalesce into one *
      +        let inStar = false;
      +        for (let i = 0; i < glob.length; i++) {
      +            const c = glob.charAt(i);
      +            if (escaping) {
      +                escaping = false;
      +                re += (reSpecials.has(c) ? '\\' : '') + c;
      +                continue;
      +            }
      +            if (c === '*') {
      +                if (inStar)
      +                    continue;
      +                inStar = true;
      +                re += noEmpty && /^[*]+$/.test(glob) ? starNoEmpty : star;
      +                hasMagic = true;
      +                continue;
      +            }
      +            else {
      +                inStar = false;
      +            }
      +            if (c === '\\') {
      +                if (i === glob.length - 1) {
      +                    re += '\\\\';
      +                }
      +                else {
      +                    escaping = true;
      +                }
      +                continue;
      +            }
      +            if (c === '[') {
      +                const [src, needUflag, consumed, magic] = parseClass(glob, i);
      +                if (consumed) {
      +                    re += src;
      +                    uflag = uflag || needUflag;
      +                    i += consumed - 1;
      +                    hasMagic = hasMagic || magic;
      +                    continue;
      +                }
      +            }
      +            if (c === '?') {
      +                re += qmark;
      +                hasMagic = true;
      +                continue;
      +            }
      +            re += regExpEscape(c);
      +        }
      +        return [re, unescape(glob), !!hasMagic, uflag];
      +    }
      +}
      +_a = AST;
      +//# sourceMappingURL=ast.js.map
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/esm/ast.js.map b/node_modules/minimatch/dist/esm/ast.js.map
      new file mode 100644
      index 00000000..f5cc3ee9
      --- /dev/null
      +++ b/node_modules/minimatch/dist/esm/ast.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"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","sourcesContent":["// parse a single path portion\n\nimport { parseClass } from './brace-expressions.js'\nimport type { MinimatchOptions, MMRegExp } from './index.js'\nimport { unescape } from './unescape.js'\n\n// classes [] are handled by the parseClass method\n// for positive extglobs, we sub-parse the contents, and combine,\n// with the appropriate regexp close.\n// for negative extglobs, we sub-parse the contents, but then\n// have to include the rest of the pattern, then the parent, etc.,\n// as the thing that cannot be because RegExp negative lookaheads\n// are different from globs.\n//\n// So for example:\n// a@(i|w!(x|y)z|j)b => ^a(i|w((!?(x|y)zb).*)z|j)b$\n//   1   2 3   4 5 6      1   2    3   46      5 6\n//\n// Assembling the extglob requires not just the negated patterns themselves,\n// but also anything following the negative patterns up to the boundary\n// of the current pattern, plus anything following in the parent pattern.\n//\n//\n// So, first, we parse the string into an AST of extglobs, without turning\n// anything into regexps yet.\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y']}, 'z'], ['j']]}, 'b']\n//\n// Then, for all the negative extglobs, we append whatever comes after in\n// each parent as their tail\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y'], 'z', 'b'}, 'z'], ['j']]}, 'b']\n//\n// Lastly, we turn each of these pieces into a regexp, and join\n//\n//                                 v----- .* because there's more following,\n//                                 v    v  otherwise, .+ because it must be\n//                                 v    v  *something* there.\n// ['^a', {@ ['i', 'w(?:(!?(?:x|y).*zb$).*)z', 'j' ]}, 'b$']\n//   copy what follows into here--^^^^^\n// ['^a', '(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)', 'b$']\n// ['^a(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)b$']\n\nexport type ExtglobType = '!' | '?' | '+' | '*' | '@'\nconst types = new Set(['!', '?', '+', '*', '@'])\nconst isExtglobType = (c: string | null): c is ExtglobType =>\n  types.has(c as ExtglobType)\nconst isExtglobAST = (c: AST): c is AST & { type: ExtglobType } =>\n  isExtglobType(c.type)\n\n// Map of which extglob types can adopt the children of a nested extglob\n//\n// anything but ! can adopt a matching type:\n// +(a|+(b|c)|d) => +(a|b|c|d)\n// *(a|*(b|c)|d) => *(a|b|c|d)\n// @(a|@(b|c)|d) => @(a|b|c|d)\n// ?(a|?(b|c)|d) => ?(a|b|c|d)\n//\n// * can adopt anything, because 0 or repetition is allowed\n// *(a|?(b|c)|d) => *(a|b|c|d)\n// *(a|+(b|c)|d) => *(a|b|c|d)\n// *(a|@(b|c)|d) => *(a|b|c|d)\n//\n// + can adopt @, because 1 or repetition is allowed\n// +(a|@(b|c)|d) => +(a|b|c|d)\n//\n// + and @ CANNOT adopt *, because 0 would be allowed\n// +(a|*(b|c)|d) => would match \"\", on *(b|c)\n// @(a|*(b|c)|d) => would match \"\", on *(b|c)\n//\n// + and @ CANNOT adopt ?, because 0 would be allowed\n// +(a|?(b|c)|d) => would match \"\", on ?(b|c)\n// @(a|?(b|c)|d) => would match \"\", on ?(b|c)\n//\n// ? can adopt @, because 0 or 1 is allowed\n// ?(a|@(b|c)|d) => ?(a|b|c|d)\n//\n// ? and @ CANNOT adopt * or +, because >1 would be allowed\n// ?(a|*(b|c)|d) => would match bbb on *(b|c)\n// @(a|*(b|c)|d) => would match bbb on *(b|c)\n// ?(a|+(b|c)|d) => would match bbb on +(b|c)\n// @(a|+(b|c)|d) => would match bbb on +(b|c)\n//\n// ! CANNOT adopt ! (nothing else can either)\n// !(a|!(b|c)|d) => !(a|b|c|d) would fail to match on b (not not b|c)\n//\n// ! can adopt @\n// !(a|@(b|c)|d) => !(a|b|c|d)\n//\n// ! CANNOT adopt *\n// !(a|*(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed\n//\n// ! CANNOT adopt +\n// !(a|+(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed\n//\n// ! CANNOT adopt ?\n// x!(a|?(b|c)|d) => x!(a|b|c|d) would fail to match \"x\"\nconst adoptionMap = new Map([\n  ['!', ['@']],\n  ['?', ['?', '@']],\n  ['@', ['@']],\n  ['*', ['*', '+', '?', '@']],\n  ['+', ['+', '@']],\n])\n\n// nested extglobs that can be adopted in, but with the addition of\n// a blank '' element.\nconst adoptionWithSpaceMap = new Map([\n  ['!', ['?']],\n  ['@', ['?']],\n  ['+', ['?', '*']],\n])\n\n// union of the previous two maps\nconst adoptionAnyMap = new Map([\n  ['!', ['?', '@']],\n  ['?', ['?', '@']],\n  ['@', ['?', '@']],\n  ['*', ['*', '+', '?', '@']],\n  ['+', ['+', '@', '?', '*']],\n])\n\n// Extglobs that can take over their parent if they are the only child\n// the key is parent, value maps child to resulting extglob parent type\n// '@' is omitted because it's a special case. An `@` extglob with a single\n// member can always be usurped by that subpattern.\nconst usurpMap = new Map<\n  ExtglobType,\n  Map\n>([\n  ['!', new Map([['!', '@']])],\n  [\n    '?',\n    new Map([\n      ['*', '*'],\n      ['+', '*'],\n    ]),\n  ],\n  [\n    '@',\n    new Map([\n      ['!', '!'],\n      ['?', '?'],\n      ['@', '@'],\n      ['*', '*'],\n      ['+', '+'],\n    ]),\n  ],\n  [\n    '+',\n    new Map([\n      ['?', '*'],\n      ['*', '*'],\n    ]),\n  ],\n])\n\n// Patterns that get prepended to bind to the start of either the\n// entire string, or just a single path portion, to prevent dots\n// and/or traversal patterns, when needed.\n// Exts don't need the ^ or / bit, because the root binds that already.\nconst startNoTraversal = '(?!(?:^|/)\\\\.\\\\.?(?:$|/))'\nconst startNoDot = '(?!\\\\.)'\n\n// characters that indicate a start of pattern needs the \"no dots\" bit,\n// because a dot *might* be matched. ( is not in the list, because in\n// the case of a child extglob, it will handle the prevention itself.\nconst addPatternStart = new Set(['[', '.'])\n// cases where traversal is A-OK, no dot prevention needed\nconst justDots = new Set(['..', '.'])\nconst reSpecials = new Set('().*{}+?[]^$\\\\!')\nconst regExpEscape = (s: string) =>\n  s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// any single thing other than /\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n// use + when we need to ensure that *something* matches, because the * is\n// the only thing in the path portion.\nconst starNoEmpty = qmark + '+?'\n\n// remove the \\ chars that we added if we end up doing a nonmagic compare\n// const deslash = (s: string) => s.replace(/\\\\(.)/g, '$1')\n\nlet ID = 0\nexport class AST {\n  type: ExtglobType | null\n  readonly #root: AST\n\n  #hasMagic?: boolean\n  #uflag: boolean = false\n  #parts: (string | AST)[] = []\n  #parent?: AST\n  #parentIndex: number\n  #negs: AST[]\n  #filledNegs: boolean = false\n  #options: MinimatchOptions\n  #toString?: string\n  // set to true if it's an extglob with no children\n  // (which really means one child of '')\n  #emptyExt: boolean = false\n  id = ++ID\n\n  get depth(): number {\n    return (this.#parent?.depth ?? -1) + 1\n  }\n\n  [Symbol.for('nodejs.util.inspect.custom')]() {\n    return {\n      '@@type': 'AST',\n      id: this.id,\n      type: this.type,\n      root: this.#root.id,\n      parent: this.#parent?.id,\n      depth: this.depth,\n      partsLength: this.#parts.length,\n      parts: this.#parts,\n    }\n  }\n\n  constructor(\n    type: ExtglobType | null,\n    parent?: AST,\n    options: MinimatchOptions = {},\n  ) {\n    this.type = type\n    // extglobs are inherently magical\n    if (type) this.#hasMagic = true\n    this.#parent = parent\n    this.#root = this.#parent ? this.#parent.#root : this\n    this.#options = this.#root === this ? options : this.#root.#options\n    this.#negs = this.#root === this ? [] : this.#root.#negs\n    if (type === '!' && !this.#root.#filledNegs) this.#negs.push(this)\n    this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0\n  }\n\n  get hasMagic(): boolean | undefined {\n    /* c8 ignore start */\n    if (this.#hasMagic !== undefined) return this.#hasMagic\n    /* c8 ignore stop */\n    for (const p of this.#parts) {\n      if (typeof p === 'string') continue\n      if (p.type || p.hasMagic) return (this.#hasMagic = true)\n    }\n    // note: will be undefined until we generate the regexp src and find out\n    return this.#hasMagic\n  }\n\n  // reconstructs the pattern\n  toString(): string {\n    return (\n      this.#toString !== undefined ? this.#toString\n      : !this.type ?\n        (this.#toString = this.#parts.map(p => String(p)).join(''))\n      : (this.#toString =\n          this.type +\n          '(' +\n          this.#parts.map(p => String(p)).join('|') +\n          ')')\n    )\n  }\n\n  #fillNegs() {\n    /* c8 ignore start */\n    if (this !== this.#root) throw new Error('should only call on root')\n    if (this.#filledNegs) return this\n    /* c8 ignore stop */\n\n    // call toString() once to fill this out\n    this.toString()\n    this.#filledNegs = true\n    let n: AST | undefined\n    while ((n = this.#negs.pop())) {\n      if (n.type !== '!') continue\n      // walk up the tree, appending everthing that comes AFTER parentIndex\n      let p: AST | undefined = n\n      let pp = p.#parent\n      while (pp) {\n        for (\n          let i = p.#parentIndex + 1;\n          !pp.type && i < pp.#parts.length;\n          i++\n        ) {\n          for (const part of n.#parts) {\n            /* c8 ignore start */\n            if (typeof part === 'string') {\n              throw new Error('string part in extglob AST??')\n            }\n            /* c8 ignore stop */\n            part.copyIn(pp.#parts[i])\n          }\n        }\n        p = pp\n        pp = p.#parent\n      }\n    }\n    return this\n  }\n\n  push(...parts: (string | AST)[]) {\n    for (const p of parts) {\n      if (p === '') continue\n      /* c8 ignore start */\n      if (\n        typeof p !== 'string' &&\n        !(p instanceof AST && p.#parent === this)\n      ) {\n        throw new Error('invalid part: ' + p)\n      }\n      /* c8 ignore stop */\n      this.#parts.push(p)\n    }\n  }\n\n  toJSON() {\n    const ret: unknown[] =\n      this.type === null ?\n        this.#parts\n          .slice()\n          .map(p => (typeof p === 'string' ? p : p.toJSON()))\n      : [this.type, ...this.#parts.map(p => (p as AST).toJSON())]\n    if (this.isStart() && !this.type) ret.unshift([])\n    if (\n      this.isEnd() &&\n      (this === this.#root ||\n        (this.#root.#filledNegs && this.#parent?.type === '!'))\n    ) {\n      ret.push({})\n    }\n    return ret\n  }\n\n  isStart(): boolean {\n    if (this.#root === this) return true\n    // if (this.type) return !!this.#parent?.isStart()\n    if (!this.#parent?.isStart()) return false\n    if (this.#parentIndex === 0) return true\n    // if everything AHEAD of this is a negation, then it's still the \"start\"\n    const p = this.#parent\n    for (let i = 0; i < this.#parentIndex; i++) {\n      const pp = p.#parts[i]\n      if (!(pp instanceof AST && pp.type === '!')) {\n        return false\n      }\n    }\n    return true\n  }\n\n  isEnd(): boolean {\n    if (this.#root === this) return true\n    if (this.#parent?.type === '!') return true\n    if (!this.#parent?.isEnd()) return false\n    if (!this.type) return this.#parent?.isEnd()\n    // if not root, it'll always have a parent\n    /* c8 ignore start */\n    const pl = this.#parent ? this.#parent.#parts.length : 0\n    /* c8 ignore stop */\n    return this.#parentIndex === pl - 1\n  }\n\n  copyIn(part: AST | string) {\n    if (typeof part === 'string') this.push(part)\n    else this.push(part.clone(this))\n  }\n\n  clone(parent: AST) {\n    const c = new AST(this.type, parent)\n    for (const p of this.#parts) {\n      c.copyIn(p)\n    }\n    return c\n  }\n\n  static #parseAST(\n    str: string,\n    ast: AST,\n    pos: number,\n    opt: MinimatchOptions,\n    extDepth: number,\n  ): number {\n    const maxDepth = opt.maxExtglobRecursion ?? 2\n    let escaping = false\n    let inBrace = false\n    let braceStart = -1\n    let braceNeg = false\n    if (ast.type === null) {\n      // outside of a extglob, append until we find a start\n      let i = pos\n      let acc = ''\n      while (i < str.length) {\n        const c = str.charAt(i++)\n        // still accumulate escapes at this point, but we do ignore\n        // starts that are escaped\n        if (escaping || c === '\\\\') {\n          escaping = !escaping\n          acc += c\n          continue\n        }\n\n        if (inBrace) {\n          if (i === braceStart + 1) {\n            if (c === '^' || c === '!') {\n              braceNeg = true\n            }\n          } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n            inBrace = false\n          }\n          acc += c\n          continue\n        } else if (c === '[') {\n          inBrace = true\n          braceStart = i\n          braceNeg = false\n          acc += c\n          continue\n        }\n\n        // we don't have to check for adoption here, because that's\n        // done at the other recursion point.\n        const doRecurse =\n          !opt.noext &&\n          isExtglobType(c) &&\n          str.charAt(i) === '(' &&\n          extDepth <= maxDepth\n        if (doRecurse) {\n          ast.push(acc)\n          acc = ''\n          const ext = new AST(c, ast)\n          i = AST.#parseAST(str, ext, i, opt, extDepth + 1)\n          ast.push(ext)\n          continue\n        }\n        acc += c\n      }\n      ast.push(acc)\n      return i\n    }\n\n    // some kind of extglob, pos is at the (\n    // find the next | or )\n    let i = pos + 1\n    let part = new AST(null, ast)\n    const parts: AST[] = []\n    let acc = ''\n    while (i < str.length) {\n      const c = str.charAt(i++)\n      // still accumulate escapes at this point, but we do ignore\n      // starts that are escaped\n      if (escaping || c === '\\\\') {\n        escaping = !escaping\n        acc += c\n        continue\n      }\n\n      if (inBrace) {\n        if (i === braceStart + 1) {\n          if (c === '^' || c === '!') {\n            braceNeg = true\n          }\n        } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n          inBrace = false\n        }\n        acc += c\n        continue\n      } else if (c === '[') {\n        inBrace = true\n        braceStart = i\n        braceNeg = false\n        acc += c\n        continue\n      }\n\n      const doRecurse =\n        !opt.noext &&\n        isExtglobType(c) &&\n        str.charAt(i) === '(' &&\n        /* c8 ignore start - the maxDepth is sufficient here */\n        (extDepth <= maxDepth || (ast && ast.#canAdoptType(c)))\n      /* c8 ignore stop */\n      if (doRecurse) {\n        const depthAdd = ast && ast.#canAdoptType(c) ? 0 : 1\n        part.push(acc)\n        acc = ''\n        const ext = new AST(c, part)\n        part.push(ext)\n        i = AST.#parseAST(str, ext, i, opt, extDepth + depthAdd)\n        continue\n      }\n      if (c === '|') {\n        part.push(acc)\n        acc = ''\n        parts.push(part)\n        part = new AST(null, ast)\n        continue\n      }\n      if (c === ')') {\n        if (acc === '' && ast.#parts.length === 0) {\n          ast.#emptyExt = true\n        }\n        part.push(acc)\n        acc = ''\n        ast.push(...parts, part)\n        return i\n      }\n      acc += c\n    }\n\n    // unfinished extglob\n    // if we got here, it was a malformed extglob! not an extglob, but\n    // maybe something else in there.\n    ast.type = null\n    ast.#hasMagic = undefined\n    ast.#parts = [str.substring(pos - 1)]\n    return i\n  }\n\n  #canAdoptWithSpace(child?: AST | string): child is AST & {\n    type: null\n    parts: [AST & { type: ExtglobType }]\n  } {\n    return this.#canAdopt(child, adoptionWithSpaceMap)\n  }\n\n  #canAdopt(\n    child?: AST | string,\n    map: Map = adoptionMap,\n  ): child is AST & {\n    type: null\n    parts: [AST & { type: ExtglobType }]\n  } {\n    if (\n      !child ||\n      typeof child !== 'object' ||\n      child.type !== null ||\n      child.#parts.length !== 1 ||\n      this.type === null\n    ) {\n      return false\n    }\n    const gc = child.#parts[0]\n    if (!gc || typeof gc !== 'object' || gc.type === null) {\n      return false\n    }\n    return (this as AST & { type: ExtglobType }).#canAdoptType(\n      gc.type,\n      map,\n    )\n  }\n  #canAdoptType(\n    c: string,\n    map: Map = adoptionAnyMap,\n  ): c is ExtglobType {\n    return !!map.get(this.type as ExtglobType)?.includes(c as ExtglobType)\n  }\n\n  #adoptWithSpace(\n    this: AST & { type: ExtglobType },\n    child: AST & {\n      type: null\n    },\n    index: number,\n  ) {\n    const gc = child.#parts[0] as AST & { type: ExtglobType }\n    const blank = new AST(null, gc, this.options)\n    blank.#parts.push('')\n    gc.push(blank)\n    this.#adopt(child, index)\n  }\n\n  #adopt(\n    child: AST & {\n      type: null\n    },\n    index: number,\n  ) {\n    const gc = child.#parts[0] as AST & { type: ExtglobType }\n    this.#parts.splice(index, 1, ...gc.#parts)\n    for (const p of gc.#parts) {\n      if (typeof p === 'object') p.#parent = this\n    }\n    this.#toString = undefined\n  }\n\n  #canUsurpType(c: string): boolean {\n    const m = usurpMap.get(this.type as ExtglobType)\n    return !!m?.has(c as ExtglobType)\n  }\n\n  #canUsurp(child?: AST | string): child is AST & {\n    type: null\n    parts: [AST & { type: ExtglobType }]\n  } {\n    if (\n      !child ||\n      typeof child !== 'object' ||\n      child.type !== null ||\n      child.#parts.length !== 1 ||\n      this.type === null ||\n      this.#parts.length !== 1\n    ) {\n      return false\n    }\n    const gc = child.#parts[0]\n    if (!gc || typeof gc !== 'object' || gc.type === null) {\n      return false\n    }\n    return (this as AST & { type: ExtglobType }).#canUsurpType(gc.type)\n  }\n\n  #usurp(this: AST & { type: ExtglobType }, child: AST & { type: null }) {\n    const m = usurpMap.get(this.type as ExtglobType)\n    const gc = child.#parts[0] as AST & { type: ExtglobType }\n    const nt = m?.get(gc.type)\n    /* c8 ignore start - impossible */\n    if (!nt) return false\n    /* c8 ignore stop */\n    this.#parts = gc.#parts\n    for (const p of this.#parts) {\n      if (typeof p === 'object') {\n        p.#parent = this\n      }\n    }\n    this.type = nt\n    this.#toString = undefined\n    this.#emptyExt = false\n  }\n\n  static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n    const ast = new AST(null, undefined, options)\n    AST.#parseAST(pattern, ast, 0, options, 0)\n    return ast\n  }\n\n  // returns the regular expression if there's magic, or the unescaped\n  // string if not.\n  toMMPattern(): MMRegExp | string {\n    // should only be called on root\n    /* c8 ignore start */\n    if (this !== this.#root) return this.#root.toMMPattern()\n    /* c8 ignore stop */\n    const glob = this.toString()\n    const [re, body, hasMagic, uflag] = this.toRegExpSource()\n    // if we're in nocase mode, and not nocaseMagicOnly, then we do\n    // still need a regular expression if we have to case-insensitively\n    // match capital/lowercase characters.\n    const anyMagic =\n      hasMagic ||\n      this.#hasMagic ||\n      (this.#options.nocase &&\n        !this.#options.nocaseMagicOnly &&\n        glob.toUpperCase() !== glob.toLowerCase())\n    if (!anyMagic) {\n      return body\n    }\n\n    const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '')\n    return Object.assign(new RegExp(`^${re}$`, flags), {\n      _src: re,\n      _glob: glob,\n    })\n  }\n\n  get options() {\n    return this.#options\n  }\n\n  // returns the string match, the regexp source, whether there's magic\n  // in the regexp (so a regular expression is required) and whether or\n  // not the uflag is needed for the regular expression (for posix classes)\n  // TODO: instead of injecting the start/end at this point, just return\n  // the BODY of the regexp, along with the start/end portions suitable\n  // for binding the start/end in either a joined full-path makeRe context\n  // (where we bind to (^|/), or a standalone matchPart context (where\n  // we bind to ^, and not /).  Otherwise slashes get duped!\n  //\n  // In part-matching mode, the start is:\n  // - if not isStart: nothing\n  // - if traversal possible, but not allowed: ^(?!\\.\\.?$)\n  // - if dots allowed or not possible: ^\n  // - if dots possible and not allowed: ^(?!\\.)\n  // end is:\n  // - if not isEnd(): nothing\n  // - else: $\n  //\n  // In full-path matching mode, we put the slash at the START of the\n  // pattern, so start is:\n  // - if first pattern: same as part-matching mode\n  // - if not isStart(): nothing\n  // - if traversal possible, but not allowed: /(?!\\.\\.?(?:$|/))\n  // - if dots allowed or not possible: /\n  // - if dots possible and not allowed: /(?!\\.)\n  // end is:\n  // - if last pattern, same as part-matching mode\n  // - else nothing\n  //\n  // Always put the (?:$|/) on negated tails, though, because that has to be\n  // there to bind the end of the negated pattern portion, and it's easier to\n  // just stick it in now rather than try to inject it later in the middle of\n  // the pattern.\n  //\n  // We can just always return the same end, and leave it up to the caller\n  // to know whether it's going to be used joined or in parts.\n  // And, if the start is adjusted slightly, can do the same there:\n  // - if not isStart: nothing\n  // - if traversal possible, but not allowed: (?:/|^)(?!\\.\\.?$)\n  // - if dots allowed or not possible: (?:/|^)\n  // - if dots possible and not allowed: (?:/|^)(?!\\.)\n  //\n  // But it's better to have a simpler binding without a conditional, for\n  // performance, so probably better to return both start options.\n  //\n  // Then the caller just ignores the end if it's not the first pattern,\n  // and the start always gets applied.\n  //\n  // But that's always going to be $ if it's the ending pattern, or nothing,\n  // so the caller can just attach $ at the end of the pattern when building.\n  //\n  // So the todo is:\n  // - better detect what kind of start is needed\n  // - return both flavors of starting pattern\n  // - attach $ at the end of the pattern when creating the actual RegExp\n  //\n  // Ah, but wait, no, that all only applies to the root when the first pattern\n  // is not an extglob. If the first pattern IS an extglob, then we need all\n  // that dot prevention biz to live in the extglob portions, because eg\n  // +(*|.x*) can match .xy but not .yx.\n  //\n  // So, return the two flavors if it's #root and the first child is not an\n  // AST, otherwise leave it to the child AST to handle it, and there,\n  // use the (?:^|/) style of start binding.\n  //\n  // Even simplified further:\n  // - Since the start for a join is eg /(?!\\.) and the start for a part\n  // is ^(?!\\.), we can just prepend (?!\\.) to the pattern (either root\n  // or start or whatever) and prepend ^ or / at the Regexp construction.\n  toRegExpSource(\n    allowDot?: boolean,\n  ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n    const dot = allowDot ?? !!this.#options.dot\n    if (this.#root === this) {\n      this.#flatten()\n      this.#fillNegs()\n    }\n    if (!isExtglobAST(this)) {\n      const noEmpty =\n        this.isStart() &&\n        this.isEnd() &&\n        !this.#parts.some(s => typeof s !== 'string')\n      const src = this.#parts\n        .map(p => {\n          const [re, _, hasMagic, uflag] =\n            typeof p === 'string' ?\n              AST.#parseGlob(p, this.#hasMagic, noEmpty)\n            : p.toRegExpSource(allowDot)\n          this.#hasMagic = this.#hasMagic || hasMagic\n          this.#uflag = this.#uflag || uflag\n          return re\n        })\n        .join('')\n\n      let start = ''\n      if (this.isStart()) {\n        if (typeof this.#parts[0] === 'string') {\n          // this is the string that will match the start of the pattern,\n          // so we need to protect against dots and such.\n\n          // '.' and '..' cannot match unless the pattern is that exactly,\n          // even if it starts with . or dot:true is set.\n          const dotTravAllowed =\n            this.#parts.length === 1 && justDots.has(this.#parts[0])\n          if (!dotTravAllowed) {\n            const aps = addPatternStart\n            // check if we have a possibility of matching . or ..,\n            // and prevent that.\n            const needNoTrav =\n              // dots are allowed, and the pattern starts with [ or .\n              (dot && aps.has(src.charAt(0))) ||\n              // the pattern starts with \\., and then [ or .\n              (src.startsWith('\\\\.') && aps.has(src.charAt(2))) ||\n              // the pattern starts with \\.\\., and then [ or .\n              (src.startsWith('\\\\.\\\\.') && aps.has(src.charAt(4)))\n            // no need to prevent dots if it can't match a dot, or if a\n            // sub-pattern will be preventing it anyway.\n            const needNoDot = !dot && !allowDot && aps.has(src.charAt(0))\n\n            start =\n              needNoTrav ? startNoTraversal\n              : needNoDot ? startNoDot\n              : ''\n          }\n        }\n      }\n\n      // append the \"end of path portion\" pattern to negation tails\n      let end = ''\n      if (\n        this.isEnd() &&\n        this.#root.#filledNegs &&\n        this.#parent?.type === '!'\n      ) {\n        end = '(?:$|\\\\/)'\n      }\n      const final = start + src + end\n      return [\n        final,\n        unescape(src),\n        (this.#hasMagic = !!this.#hasMagic),\n        this.#uflag,\n      ]\n    }\n\n    // We need to calculate the body *twice* if it's a repeat pattern\n    // at the start, once in nodot mode, then again in dot mode, so a\n    // pattern like *(?) can match 'x.y'\n\n    const repeated = this.type === '*' || this.type === '+'\n    // some kind of extglob\n    const start = this.type === '!' ? '(?:(?!(?:' : '(?:'\n    let body = (this as AST & { type: ExtglobType }).#partsToRegExp(dot)\n\n    if (this.isStart() && this.isEnd() && !body && this.type !== '!') {\n      // invalid extglob, has to at least be *something* present, if it's\n      // the entire path portion.\n      const s = this.toString()\n      const me = this as AST\n      me.#parts = [s]\n      me.type = null\n      me.#hasMagic = undefined\n      return [s, unescape(this.toString()), false, false]\n    }\n\n    let bodyDotAllowed =\n      !repeated || allowDot || dot || !startNoDot ?\n        ''\n      : this.#partsToRegExp(true)\n    if (bodyDotAllowed === body) {\n      bodyDotAllowed = ''\n    }\n    if (bodyDotAllowed) {\n      body = `(?:${body})(?:${bodyDotAllowed})*?`\n    }\n\n    // an empty !() is exactly equivalent to a starNoEmpty\n    let final = ''\n    if (this.type === '!' && this.#emptyExt) {\n      final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty\n    } else {\n      const close =\n        this.type === '!' ?\n          // !() must match something,but !(x) can match ''\n          '))' +\n          (this.isStart() && !dot && !allowDot ? startNoDot : '') +\n          star +\n          ')'\n        : this.type === '@' ? ')'\n        : this.type === '?' ? ')?'\n        : this.type === '+' && bodyDotAllowed ? ')'\n        : this.type === '*' && bodyDotAllowed ? `)?`\n        : `)${this.type}`\n      final = start + body + close\n    }\n    return [\n      final,\n      unescape(body),\n      (this.#hasMagic = !!this.#hasMagic),\n      this.#uflag,\n    ]\n  }\n\n  #flatten() {\n    if (!isExtglobAST(this)) {\n      for (const p of this.#parts) {\n        if (typeof p === 'object') {\n          p.#flatten()\n        }\n      }\n    } else {\n      // do up to 10 passes to flatten as much as possible\n      let iterations = 0\n      let done = false\n      do {\n        done = true\n        for (let i = 0; i < this.#parts.length; i++) {\n          const c = this.#parts[i]\n          if (typeof c === 'object') {\n            c.#flatten()\n            if (this.#canAdopt(c)) {\n              done = false\n              this.#adopt(c, i)\n            } else if (this.#canAdoptWithSpace(c)) {\n              done = false\n              ;(this as AST & { type: ExtglobType }).#adoptWithSpace(c, i)\n            } else if (this.#canUsurp(c)) {\n              done = false\n              ;(this as AST & { type: ExtglobType }).#usurp(c)\n            }\n          }\n        }\n      } while (!done && ++iterations < 10)\n    }\n    this.#toString = undefined\n  }\n\n  #partsToRegExp(this: AST & { type: ExtglobType }, dot: boolean) {\n    return this.#parts\n      .map(p => {\n        // extglob ASTs should only contain parent ASTs\n        /* c8 ignore start */\n        if (typeof p === 'string') {\n          throw new Error('string type in extglob ast??')\n        }\n        /* c8 ignore stop */\n        // can ignore hasMagic, because extglobs are already always magic\n        const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot)\n        this.#uflag = this.#uflag || uflag\n        return re\n      })\n      .filter(p => !(this.isStart() && this.isEnd()) || !!p)\n      .join('|')\n  }\n\n  static #parseGlob(\n    glob: string,\n    hasMagic: boolean | undefined,\n    noEmpty: boolean = false,\n  ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n    let escaping = false\n    let re = ''\n    let uflag = false\n    // multiple stars that aren't globstars coalesce into one *\n    let inStar = false\n    for (let i = 0; i < glob.length; i++) {\n      const c = glob.charAt(i)\n      if (escaping) {\n        escaping = false\n        re += (reSpecials.has(c) ? '\\\\' : '') + c\n        continue\n      }\n      if (c === '*') {\n        if (inStar) continue\n        inStar = true\n        re += noEmpty && /^[*]+$/.test(glob) ? starNoEmpty : star\n        hasMagic = true\n        continue\n      } else {\n        inStar = false\n      }\n      if (c === '\\\\') {\n        if (i === glob.length - 1) {\n          re += '\\\\\\\\'\n        } else {\n          escaping = true\n        }\n        continue\n      }\n      if (c === '[') {\n        const [src, needUflag, consumed, magic] = parseClass(glob, i)\n        if (consumed) {\n          re += src\n          uflag = uflag || needUflag\n          i += consumed - 1\n          hasMagic = hasMagic || magic\n          continue\n        }\n      }\n      if (c === '?') {\n        re += qmark\n        hasMagic = true\n        continue\n      }\n      re += regExpEscape(c)\n    }\n    return [re, unescape(glob), !!hasMagic, uflag]\n  }\n}\n"]}
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/esm/brace-expressions.d.ts b/node_modules/minimatch/dist/esm/brace-expressions.d.ts
      new file mode 100644
      index 00000000..b1572deb
      --- /dev/null
      +++ b/node_modules/minimatch/dist/esm/brace-expressions.d.ts
      @@ -0,0 +1,8 @@
      +export type ParseClassResult = [
      +    src: string,
      +    uFlag: boolean,
      +    consumed: number,
      +    hasMagic: boolean
      +];
      +export declare const parseClass: (glob: string, position: number) => ParseClassResult;
      +//# sourceMappingURL=brace-expressions.d.ts.map
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/esm/brace-expressions.d.ts.map b/node_modules/minimatch/dist/esm/brace-expressions.d.ts.map
      new file mode 100644
      index 00000000..09b4c110
      --- /dev/null
      +++ b/node_modules/minimatch/dist/esm/brace-expressions.d.ts.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"brace-expressions.d.ts","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"AAgCA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,OAAO;CAClB,CAAA;AAQD,eAAO,MAAM,UAAU,GACrB,MAAM,MAAM,EACZ,UAAU,MAAM,KACf,gBA2HF,CAAA"}
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/esm/brace-expressions.js b/node_modules/minimatch/dist/esm/brace-expressions.js
      new file mode 100644
      index 00000000..4b49d40b
      --- /dev/null
      +++ b/node_modules/minimatch/dist/esm/brace-expressions.js
      @@ -0,0 +1,146 @@
      +// translate the various posix character classes into unicode properties
      +// this works across all unicode locales
      +// { : [, /u flag required, negated]
      +const posixClasses = {
      +    '[:alnum:]': ['\\p{L}\\p{Nl}\\p{Nd}', true],
      +    '[:alpha:]': ['\\p{L}\\p{Nl}', true],
      +    '[:ascii:]': ['\\x' + '00-\\x' + '7f', false],
      +    '[:blank:]': ['\\p{Zs}\\t', true],
      +    '[:cntrl:]': ['\\p{Cc}', true],
      +    '[:digit:]': ['\\p{Nd}', true],
      +    '[:graph:]': ['\\p{Z}\\p{C}', true, true],
      +    '[:lower:]': ['\\p{Ll}', true],
      +    '[:print:]': ['\\p{C}', true],
      +    '[:punct:]': ['\\p{P}', true],
      +    '[:space:]': ['\\p{Z}\\t\\r\\n\\v\\f', true],
      +    '[:upper:]': ['\\p{Lu}', true],
      +    '[:word:]': ['\\p{L}\\p{Nl}\\p{Nd}\\p{Pc}', true],
      +    '[:xdigit:]': ['A-Fa-f0-9', false],
      +};
      +// only need to escape a few things inside of brace expressions
      +// escapes: [ \ ] -
      +const braceEscape = (s) => s.replace(/[[\]\\-]/g, '\\$&');
      +// escape all regexp magic characters
      +const regexpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
      +// everything has already been escaped, we just have to join
      +const rangesToString = (ranges) => ranges.join('');
      +// takes a glob string at a posix brace expression, and returns
      +// an equivalent regular expression source, and boolean indicating
      +// whether the /u flag needs to be applied, and the number of chars
      +// consumed to parse the character class.
      +// This also removes out of order ranges, and returns ($.) if the
      +// entire class just no good.
      +export const parseClass = (glob, position) => {
      +    const pos = position;
      +    /* c8 ignore start */
      +    if (glob.charAt(pos) !== '[') {
      +        throw new Error('not in a brace expression');
      +    }
      +    /* c8 ignore stop */
      +    const ranges = [];
      +    const negs = [];
      +    let i = pos + 1;
      +    let sawStart = false;
      +    let uflag = false;
      +    let escaping = false;
      +    let negate = false;
      +    let endPos = pos;
      +    let rangeStart = '';
      +    WHILE: while (i < glob.length) {
      +        const c = glob.charAt(i);
      +        if ((c === '!' || c === '^') && i === pos + 1) {
      +            negate = true;
      +            i++;
      +            continue;
      +        }
      +        if (c === ']' && sawStart && !escaping) {
      +            endPos = i + 1;
      +            break;
      +        }
      +        sawStart = true;
      +        if (c === '\\') {
      +            if (!escaping) {
      +                escaping = true;
      +                i++;
      +                continue;
      +            }
      +            // escaped \ char, fall through and treat like normal char
      +        }
      +        if (c === '[' && !escaping) {
      +            // either a posix class, a collation equivalent, or just a [
      +            for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {
      +                if (glob.startsWith(cls, i)) {
      +                    // invalid, [a-[] is fine, but not [a-[:alpha]]
      +                    if (rangeStart) {
      +                        return ['$.', false, glob.length - pos, true];
      +                    }
      +                    i += cls.length;
      +                    if (neg)
      +                        negs.push(unip);
      +                    else
      +                        ranges.push(unip);
      +                    uflag = uflag || u;
      +                    continue WHILE;
      +                }
      +            }
      +        }
      +        // now it's just a normal character, effectively
      +        escaping = false;
      +        if (rangeStart) {
      +            // throw this range away if it's not valid, but others
      +            // can still match.
      +            if (c > rangeStart) {
      +                ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c));
      +            }
      +            else if (c === rangeStart) {
      +                ranges.push(braceEscape(c));
      +            }
      +            rangeStart = '';
      +            i++;
      +            continue;
      +        }
      +        // now might be the start of a range.
      +        // can be either c-d or c-] or c] or c] at this point
      +        if (glob.startsWith('-]', i + 1)) {
      +            ranges.push(braceEscape(c + '-'));
      +            i += 2;
      +            continue;
      +        }
      +        if (glob.startsWith('-', i + 1)) {
      +            rangeStart = c;
      +            i += 2;
      +            continue;
      +        }
      +        // not the start of a range, just a single character
      +        ranges.push(braceEscape(c));
      +        i++;
      +    }
      +    if (endPos < i) {
      +        // didn't see the end of the class, not a valid class,
      +        // but might still be valid as a literal match.
      +        return ['', false, 0, false];
      +    }
      +    // if we got no ranges and no negates, then we have a range that
      +    // cannot possibly match anything, and that poisons the whole glob
      +    if (!ranges.length && !negs.length) {
      +        return ['$.', false, glob.length - pos, true];
      +    }
      +    // if we got one positive range, and it's a single character, then that's
      +    // not actually a magic pattern, it's just that one literal character.
      +    // we should not treat that as "magic", we should just return the literal
      +    // character. [_] is a perfectly valid way to escape glob magic chars.
      +    if (negs.length === 0 &&
      +        ranges.length === 1 &&
      +        /^\\?.$/.test(ranges[0]) &&
      +        !negate) {
      +        const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0];
      +        return [regexpEscape(r), false, endPos - pos, false];
      +    }
      +    const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']';
      +    const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']';
      +    const comb = ranges.length && negs.length ? '(' + sranges + '|' + snegs + ')'
      +        : ranges.length ? sranges
      +            : snegs;
      +    return [comb, uflag, endPos - pos, true];
      +};
      +//# sourceMappingURL=brace-expressions.js.map
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/esm/brace-expressions.js.map b/node_modules/minimatch/dist/esm/brace-expressions.js.map
      new file mode 100644
      index 00000000..184b5a89
      --- /dev/null
      +++ b/node_modules/minimatch/dist/esm/brace-expressions.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"brace-expressions.js","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"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","sourcesContent":["// translate the various posix character classes into unicode properties\n// this works across all unicode locales\n\n// { : [, /u flag required, negated]\nconst posixClasses: { [k: string]: [e: string, u: boolean, n?: boolean] } =\n  {\n    '[:alnum:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}', true],\n    '[:alpha:]': ['\\\\p{L}\\\\p{Nl}', true],\n    '[:ascii:]': ['\\\\x' + '00-\\\\x' + '7f', false],\n    '[:blank:]': ['\\\\p{Zs}\\\\t', true],\n    '[:cntrl:]': ['\\\\p{Cc}', true],\n    '[:digit:]': ['\\\\p{Nd}', true],\n    '[:graph:]': ['\\\\p{Z}\\\\p{C}', true, true],\n    '[:lower:]': ['\\\\p{Ll}', true],\n    '[:print:]': ['\\\\p{C}', true],\n    '[:punct:]': ['\\\\p{P}', true],\n    '[:space:]': ['\\\\p{Z}\\\\t\\\\r\\\\n\\\\v\\\\f', true],\n    '[:upper:]': ['\\\\p{Lu}', true],\n    '[:word:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}\\\\p{Pc}', true],\n    '[:xdigit:]': ['A-Fa-f0-9', false],\n  }\n\n// only need to escape a few things inside of brace expressions\n// escapes: [ \\ ] -\nconst braceEscape = (s: string) => s.replace(/[[\\]\\\\-]/g, '\\\\$&')\n// escape all regexp magic characters\nconst regexpEscape = (s: string) =>\n  s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// everything has already been escaped, we just have to join\nconst rangesToString = (ranges: string[]): string => ranges.join('')\n\nexport type ParseClassResult = [\n  src: string,\n  uFlag: boolean,\n  consumed: number,\n  hasMagic: boolean,\n]\n\n// takes a glob string at a posix brace expression, and returns\n// an equivalent regular expression source, and boolean indicating\n// whether the /u flag needs to be applied, and the number of chars\n// consumed to parse the character class.\n// This also removes out of order ranges, and returns ($.) if the\n// entire class just no good.\nexport const parseClass = (\n  glob: string,\n  position: number,\n): ParseClassResult => {\n  const pos = position\n  /* c8 ignore start */\n  if (glob.charAt(pos) !== '[') {\n    throw new Error('not in a brace expression')\n  }\n  /* c8 ignore stop */\n  const ranges: string[] = []\n  const negs: string[] = []\n\n  let i = pos + 1\n  let sawStart = false\n  let uflag = false\n  let escaping = false\n  let negate = false\n  let endPos = pos\n  let rangeStart = ''\n  WHILE: while (i < glob.length) {\n    const c = glob.charAt(i)\n    if ((c === '!' || c === '^') && i === pos + 1) {\n      negate = true\n      i++\n      continue\n    }\n\n    if (c === ']' && sawStart && !escaping) {\n      endPos = i + 1\n      break\n    }\n\n    sawStart = true\n    if (c === '\\\\') {\n      if (!escaping) {\n        escaping = true\n        i++\n        continue\n      }\n      // escaped \\ char, fall through and treat like normal char\n    }\n    if (c === '[' && !escaping) {\n      // either a posix class, a collation equivalent, or just a [\n      for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {\n        if (glob.startsWith(cls, i)) {\n          // invalid, [a-[] is fine, but not [a-[:alpha]]\n          if (rangeStart) {\n            return ['$.', false, glob.length - pos, true]\n          }\n          i += cls.length\n          if (neg) negs.push(unip)\n          else ranges.push(unip)\n          uflag = uflag || u\n          continue WHILE\n        }\n      }\n    }\n\n    // now it's just a normal character, effectively\n    escaping = false\n    if (rangeStart) {\n      // throw this range away if it's not valid, but others\n      // can still match.\n      if (c > rangeStart) {\n        ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c))\n      } else if (c === rangeStart) {\n        ranges.push(braceEscape(c))\n      }\n      rangeStart = ''\n      i++\n      continue\n    }\n\n    // now might be the start of a range.\n    // can be either c-d or c-] or c] or c] at this point\n    if (glob.startsWith('-]', i + 1)) {\n      ranges.push(braceEscape(c + '-'))\n      i += 2\n      continue\n    }\n    if (glob.startsWith('-', i + 1)) {\n      rangeStart = c\n      i += 2\n      continue\n    }\n\n    // not the start of a range, just a single character\n    ranges.push(braceEscape(c))\n    i++\n  }\n\n  if (endPos < i) {\n    // didn't see the end of the class, not a valid class,\n    // but might still be valid as a literal match.\n    return ['', false, 0, false]\n  }\n\n  // if we got no ranges and no negates, then we have a range that\n  // cannot possibly match anything, and that poisons the whole glob\n  if (!ranges.length && !negs.length) {\n    return ['$.', false, glob.length - pos, true]\n  }\n\n  // if we got one positive range, and it's a single character, then that's\n  // not actually a magic pattern, it's just that one literal character.\n  // we should not treat that as \"magic\", we should just return the literal\n  // character. [_] is a perfectly valid way to escape glob magic chars.\n  if (\n    negs.length === 0 &&\n    ranges.length === 1 &&\n    /^\\\\?.$/.test(ranges[0]) &&\n    !negate\n  ) {\n    const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0]\n    return [regexpEscape(r), false, endPos - pos, false]\n  }\n\n  const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']'\n  const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']'\n  const comb =\n    ranges.length && negs.length ? '(' + sranges + '|' + snegs + ')'\n    : ranges.length ? sranges\n    : snegs\n\n  return [comb, uflag, endPos - pos, true]\n}\n"]}
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/esm/escape.d.ts b/node_modules/minimatch/dist/esm/escape.d.ts
      new file mode 100644
      index 00000000..141024a0
      --- /dev/null
      +++ b/node_modules/minimatch/dist/esm/escape.d.ts
      @@ -0,0 +1,15 @@
      +import type { MinimatchOptions } from './index.js';
      +/**
      + * Escape all magic characters in a glob pattern.
      + *
      + * If the {@link MinimatchOptions.windowsPathsNoEscape}
      + * option is used, then characters are escaped by wrapping in `[]`, because
      + * a magic character wrapped in a character class can only be satisfied by
      + * that exact character.  In this mode, `\` is _not_ escaped, because it is
      + * not interpreted as a magic character, but instead as a path separator.
      + *
      + * If the {@link MinimatchOptions.magicalBraces} option is used,
      + * then braces (`{` and `}`) will be escaped.
      + */
      +export declare const escape: (s: string, { windowsPathsNoEscape, magicalBraces, }?: Pick) => string;
      +//# sourceMappingURL=escape.d.ts.map
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/esm/escape.d.ts.map b/node_modules/minimatch/dist/esm/escape.d.ts.map
      new file mode 100644
      index 00000000..e167e300
      --- /dev/null
      +++ b/node_modules/minimatch/dist/esm/escape.d.ts.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"escape.d.ts","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,MAAM,GACjB,GAAG,MAAM,EACT,2CAGG,IAAI,CAAC,gBAAgB,EAAE,sBAAsB,GAAG,eAAe,CAAM,WAazE,CAAA"}
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/esm/escape.js b/node_modules/minimatch/dist/esm/escape.js
      new file mode 100644
      index 00000000..46d0ec88
      --- /dev/null
      +++ b/node_modules/minimatch/dist/esm/escape.js
      @@ -0,0 +1,26 @@
      +/**
      + * Escape all magic characters in a glob pattern.
      + *
      + * If the {@link MinimatchOptions.windowsPathsNoEscape}
      + * option is used, then characters are escaped by wrapping in `[]`, because
      + * a magic character wrapped in a character class can only be satisfied by
      + * that exact character.  In this mode, `\` is _not_ escaped, because it is
      + * not interpreted as a magic character, but instead as a path separator.
      + *
      + * If the {@link MinimatchOptions.magicalBraces} option is used,
      + * then braces (`{` and `}`) will be escaped.
      + */
      +export const escape = (s, { windowsPathsNoEscape = false, magicalBraces = false, } = {}) => {
      +    // don't need to escape +@! because we escape the parens
      +    // that make those magic, and escaping ! as [!] isn't valid,
      +    // because [!]] is a valid glob class meaning not ']'.
      +    if (magicalBraces) {
      +        return windowsPathsNoEscape ?
      +            s.replace(/[?*()[\]{}]/g, '[$&]')
      +            : s.replace(/[?*()[\]\\{}]/g, '\\$&');
      +    }
      +    return windowsPathsNoEscape ?
      +        s.replace(/[?*()[\]]/g, '[$&]')
      +        : s.replace(/[?*()[\]\\]/g, '\\$&');
      +};
      +//# sourceMappingURL=escape.js.map
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/esm/escape.js.map b/node_modules/minimatch/dist/esm/escape.js.map
      new file mode 100644
      index 00000000..4740508f
      --- /dev/null
      +++ b/node_modules/minimatch/dist/esm/escape.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"escape.js","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CACpB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,EAC5B,aAAa,GAAG,KAAK,MAC+C,EAAE,EACxE,EAAE;IACF,wDAAwD;IACxD,4DAA4D;IAC5D,sDAAsD;IACtD,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,oBAAoB,CAAC,CAAC;YACzB,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC;YACnC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAA;IACzC,CAAC;IACD,OAAO,oBAAoB,CAAC,CAAC;QACzB,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC;QACjC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;AACvC,CAAC,CAAA","sourcesContent":["import type { MinimatchOptions } from './index.js'\n\n/**\n * Escape all magic characters in a glob pattern.\n *\n * If the {@link MinimatchOptions.windowsPathsNoEscape}\n * option is used, then characters are escaped by wrapping in `[]`, because\n * a magic character wrapped in a character class can only be satisfied by\n * that exact character.  In this mode, `\\` is _not_ escaped, because it is\n * not interpreted as a magic character, but instead as a path separator.\n *\n * If the {@link MinimatchOptions.magicalBraces} option is used,\n * then braces (`{` and `}`) will be escaped.\n */\nexport const escape = (\n  s: string,\n  {\n    windowsPathsNoEscape = false,\n    magicalBraces = false,\n  }: Pick = {},\n) => {\n  // don't need to escape +@! because we escape the parens\n  // that make those magic, and escaping ! as [!] isn't valid,\n  // because [!]] is a valid glob class meaning not ']'.\n  if (magicalBraces) {\n    return windowsPathsNoEscape ?\n        s.replace(/[?*()[\\]{}]/g, '[$&]')\n      : s.replace(/[?*()[\\]\\\\{}]/g, '\\\\$&')\n  }\n  return windowsPathsNoEscape ?\n      s.replace(/[?*()[\\]]/g, '[$&]')\n    : s.replace(/[?*()[\\]\\\\]/g, '\\\\$&')\n}\n"]}
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/esm/index.d.ts b/node_modules/minimatch/dist/esm/index.d.ts
      new file mode 100644
      index 00000000..7e1fc2ed
      --- /dev/null
      +++ b/node_modules/minimatch/dist/esm/index.d.ts
      @@ -0,0 +1,174 @@
      +import { AST } from './ast.js';
      +export type Platform = 'aix' | 'android' | 'darwin' | 'freebsd' | 'haiku' | 'linux' | 'openbsd' | 'sunos' | 'win32' | 'cygwin' | 'netbsd';
      +export interface MinimatchOptions {
      +    /** do not expand `{x,y}` style braces */
      +    nobrace?: boolean;
      +    /** do not treat patterns starting with `#` as a comment */
      +    nocomment?: boolean;
      +    /** do not treat patterns starting with `!` as a negation */
      +    nonegate?: boolean;
      +    /** print LOTS of debugging output */
      +    debug?: boolean;
      +    /** treat `**` the same as `*` */
      +    noglobstar?: boolean;
      +    /** do not expand extglobs like `+(a|b)` */
      +    noext?: boolean;
      +    /** return the pattern if nothing matches */
      +    nonull?: boolean;
      +    /** treat `\\` as a path separator, not an escape character */
      +    windowsPathsNoEscape?: boolean;
      +    /**
      +     * inverse of {@link MinimatchOptions.windowsPathsNoEscape}
      +     * @deprecated
      +     */
      +    allowWindowsEscape?: boolean;
      +    /**
      +     * Compare a partial path to a pattern. As long as the parts
      +     * of the path that are present are not contradicted by the
      +     * pattern, it will be treated as a match. This is useful in
      +     * applications where you're walking through a folder structure,
      +     * and don't yet have the full path, but want to ensure that you
      +     * do not walk down paths that can never be a match.
      +     */
      +    partial?: boolean;
      +    /** allow matches that start with `.` even if the pattern does not */
      +    dot?: boolean;
      +    /** ignore case */
      +    nocase?: boolean;
      +    /** ignore case only in wildcard patterns */
      +    nocaseMagicOnly?: boolean;
      +    /** consider braces to be "magic" for the purpose of `hasMagic` */
      +    magicalBraces?: boolean;
      +    /**
      +     * If set, then patterns without slashes will be matched
      +     * against the basename of the path if it contains slashes.
      +     * For example, `a?b` would match the path `/xyz/123/acb`, but
      +     * not `/xyz/acb/123`.
      +     */
      +    matchBase?: boolean;
      +    /** invert the results of negated matches */
      +    flipNegate?: boolean;
      +    /** do not collapse multiple `/` into a single `/` */
      +    preserveMultipleSlashes?: boolean;
      +    /**
      +     * A number indicating the level of optimization that should be done
      +     * to the pattern prior to parsing and using it for matches.
      +     */
      +    optimizationLevel?: number;
      +    /** operating system platform */
      +    platform?: Platform;
      +    /**
      +     * When a pattern starts with a UNC path or drive letter, and in
      +     * `nocase:true` mode, do not convert the root portions of the
      +     * pattern into a case-insensitive regular expression, and instead
      +     * leave them as strings.
      +     *
      +     * This is the default when the platform is `win32` and
      +     * `nocase:true` is set.
      +     */
      +    windowsNoMagicRoot?: boolean;
      +    /**
      +     * max number of `{...}` patterns to expand. Default 100_000.
      +     */
      +    braceExpandMax?: number;
      +    /**
      +     * Max number of non-adjacent `**` patterns to recursively walk down.
      +     *
      +     * The default of 200 is almost certainly high enough for most purposes,
      +     * and can handle absurdly excessive patterns.
      +     */
      +    maxGlobstarRecursion?: number;
      +    /**
      +     * Max depth to traverse for nested extglobs like `*(a|b|c)`
      +     *
      +     * Default is 2, which is quite low, but any higher value
      +     * swiftly results in punishing performance impacts. Note
      +     * that this is *not*  relevant when the globstar types can
      +     * be safely coalesced into a single set.
      +     *
      +     * For example, `*(a|@(b|c)|d)` would be flattened into
      +     * `*(a|b|c|d)`. Thus, many common extglobs will retain good
      +     * performance and  never hit this limit, even if they are
      +     * excessively deep and complicated.
      +     *
      +     * If the limit is hit, then the extglob characters are simply
      +     * not parsed, and the pattern effectively switches into
      +     * `noextglob: true` mode for the contents of that nested
      +     * sub-pattern. This will typically _not_ result in a match,
      +     * but is considered a valid trade-off for security and
      +     * performance.
      +     */
      +    maxExtglobRecursion?: number;
      +}
      +export declare const minimatch: {
      +    (p: string, pattern: string, options?: MinimatchOptions): boolean;
      +    sep: Sep;
      +    GLOBSTAR: typeof GLOBSTAR;
      +    filter: (pattern: string, options?: MinimatchOptions) => (p: string) => boolean;
      +    defaults: (def: MinimatchOptions) => typeof minimatch;
      +    braceExpand: (pattern: string, options?: MinimatchOptions) => string[];
      +    makeRe: (pattern: string, options?: MinimatchOptions) => false | MMRegExp;
      +    match: (list: string[], pattern: string, options?: MinimatchOptions) => string[];
      +    AST: typeof AST;
      +    Minimatch: typeof Minimatch;
      +    escape: (s: string, { windowsPathsNoEscape, magicalBraces, }?: Pick) => string;
      +    unescape: (s: string, { windowsPathsNoEscape, magicalBraces, }?: Pick) => string;
      +};
      +export type Sep = '\\' | '/';
      +export declare const sep: Sep;
      +export declare const GLOBSTAR: unique symbol;
      +export declare const filter: (pattern: string, options?: MinimatchOptions) => (p: string) => boolean;
      +export declare const defaults: (def: MinimatchOptions) => typeof minimatch;
      +export declare const braceExpand: (pattern: string, options?: MinimatchOptions) => string[];
      +export declare const makeRe: (pattern: string, options?: MinimatchOptions) => false | MMRegExp;
      +export declare const match: (list: string[], pattern: string, options?: MinimatchOptions) => string[];
      +export type MMRegExp = RegExp & {
      +    _src?: string;
      +    _glob?: string;
      +};
      +export type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR;
      +export type ParseReturn = ParseReturnFiltered | false;
      +export declare class Minimatch {
      +    #private;
      +    options: MinimatchOptions;
      +    set: ParseReturnFiltered[][];
      +    pattern: string;
      +    windowsPathsNoEscape: boolean;
      +    nonegate: boolean;
      +    negate: boolean;
      +    comment: boolean;
      +    empty: boolean;
      +    preserveMultipleSlashes: boolean;
      +    partial: boolean;
      +    globSet: string[];
      +    globParts: string[][];
      +    nocase: boolean;
      +    isWindows: boolean;
      +    platform: Platform;
      +    windowsNoMagicRoot: boolean;
      +    maxGlobstarRecursion: number;
      +    regexp: false | null | MMRegExp;
      +    constructor(pattern: string, options?: MinimatchOptions);
      +    hasMagic(): boolean;
      +    debug(..._: unknown[]): void;
      +    make(): void;
      +    preprocess(globParts: string[][]): string[][];
      +    adjascentGlobstarOptimize(globParts: string[][]): string[][];
      +    levelOneOptimize(globParts: string[][]): string[][];
      +    levelTwoFileOptimize(parts: string | string[]): string[];
      +    firstPhasePreProcess(globParts: string[][]): string[][];
      +    secondPhasePreProcess(globParts: string[][]): string[][];
      +    partsMatch(a: string[], b: string[], emptyGSMatch?: boolean): false | string[];
      +    parseNegate(): void;
      +    matchOne(file: string[], pattern: ParseReturn[], partial?: boolean): boolean;
      +    braceExpand(): string[];
      +    parse(pattern: string): ParseReturn;
      +    makeRe(): false | MMRegExp;
      +    slashSplit(p: string): string[];
      +    match(f: string, partial?: boolean): boolean;
      +    static defaults(def: MinimatchOptions): typeof Minimatch;
      +}
      +export { AST } from './ast.js';
      +export { escape } from './escape.js';
      +export { unescape } from './unescape.js';
      +//# sourceMappingURL=index.d.ts.map
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/esm/index.d.ts.map b/node_modules/minimatch/dist/esm/index.d.ts.map
      new file mode 100644
      index 00000000..7620db91
      --- /dev/null
      +++ b/node_modules/minimatch/dist/esm/index.d.ts.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/esm/index.js b/node_modules/minimatch/dist/esm/index.js
      new file mode 100644
      index 00000000..a5e6fa88
      --- /dev/null
      +++ b/node_modules/minimatch/dist/esm/index.js
      @@ -0,0 +1,1114 @@
      +import { expand } from 'brace-expansion';
      +import { assertValidPattern } from './assert-valid-pattern.js';
      +import { AST } from './ast.js';
      +import { escape } from './escape.js';
      +import { unescape } from './unescape.js';
      +export const minimatch = (p, pattern, options = {}) => {
      +    assertValidPattern(pattern);
      +    // shortcut: comments match nothing.
      +    if (!options.nocomment && pattern.charAt(0) === '#') {
      +        return false;
      +    }
      +    return new Minimatch(pattern, options).match(p);
      +};
      +// Optimized checking for the most common glob patterns.
      +const starDotExtRE = /^\*+([^+@!?*[(]*)$/;
      +const starDotExtTest = (ext) => (f) => !f.startsWith('.') && f.endsWith(ext);
      +const starDotExtTestDot = (ext) => (f) => f.endsWith(ext);
      +const starDotExtTestNocase = (ext) => {
      +    ext = ext.toLowerCase();
      +    return (f) => !f.startsWith('.') && f.toLowerCase().endsWith(ext);
      +};
      +const starDotExtTestNocaseDot = (ext) => {
      +    ext = ext.toLowerCase();
      +    return (f) => f.toLowerCase().endsWith(ext);
      +};
      +const starDotStarRE = /^\*+\.\*+$/;
      +const starDotStarTest = (f) => !f.startsWith('.') && f.includes('.');
      +const starDotStarTestDot = (f) => f !== '.' && f !== '..' && f.includes('.');
      +const dotStarRE = /^\.\*+$/;
      +const dotStarTest = (f) => f !== '.' && f !== '..' && f.startsWith('.');
      +const starRE = /^\*+$/;
      +const starTest = (f) => f.length !== 0 && !f.startsWith('.');
      +const starTestDot = (f) => f.length !== 0 && f !== '.' && f !== '..';
      +const qmarksRE = /^\?+([^+@!?*[(]*)?$/;
      +const qmarksTestNocase = ([$0, ext = '']) => {
      +    const noext = qmarksTestNoExt([$0]);
      +    if (!ext)
      +        return noext;
      +    ext = ext.toLowerCase();
      +    return (f) => noext(f) && f.toLowerCase().endsWith(ext);
      +};
      +const qmarksTestNocaseDot = ([$0, ext = '']) => {
      +    const noext = qmarksTestNoExtDot([$0]);
      +    if (!ext)
      +        return noext;
      +    ext = ext.toLowerCase();
      +    return (f) => noext(f) && f.toLowerCase().endsWith(ext);
      +};
      +const qmarksTestDot = ([$0, ext = '']) => {
      +    const noext = qmarksTestNoExtDot([$0]);
      +    return !ext ? noext : (f) => noext(f) && f.endsWith(ext);
      +};
      +const qmarksTest = ([$0, ext = '']) => {
      +    const noext = qmarksTestNoExt([$0]);
      +    return !ext ? noext : (f) => noext(f) && f.endsWith(ext);
      +};
      +const qmarksTestNoExt = ([$0]) => {
      +    const len = $0.length;
      +    return (f) => f.length === len && !f.startsWith('.');
      +};
      +const qmarksTestNoExtDot = ([$0]) => {
      +    const len = $0.length;
      +    return (f) => f.length === len && f !== '.' && f !== '..';
      +};
      +/* c8 ignore start */
      +const defaultPlatform = (typeof process === 'object' && process ?
      +    (typeof process.env === 'object' &&
      +        process.env &&
      +        process.env.__MINIMATCH_TESTING_PLATFORM__) ||
      +        process.platform
      +    : 'posix');
      +const path = {
      +    win32: { sep: '\\' },
      +    posix: { sep: '/' },
      +};
      +/* c8 ignore stop */
      +export const sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep;
      +minimatch.sep = sep;
      +export const GLOBSTAR = Symbol('globstar **');
      +minimatch.GLOBSTAR = GLOBSTAR;
      +// any single thing other than /
      +// don't need to escape / when using new RegExp()
      +const qmark = '[^/]';
      +// * => any number of characters
      +const star = qmark + '*?';
      +// ** when dots are allowed.  Anything goes, except .. and .
      +// not (^ or / followed by one or two dots followed by $ or /),
      +// followed by anything, any number of times.
      +const twoStarDot = '(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?';
      +// not a ^ or / followed by a dot,
      +// followed by anything, any number of times.
      +const twoStarNoDot = '(?:(?!(?:\\/|^)\\.).)*?';
      +export const filter = (pattern, options = {}) => (p) => minimatch(p, pattern, options);
      +minimatch.filter = filter;
      +const ext = (a, b = {}) => Object.assign({}, a, b);
      +export const defaults = (def) => {
      +    if (!def || typeof def !== 'object' || !Object.keys(def).length) {
      +        return minimatch;
      +    }
      +    const orig = minimatch;
      +    const m = (p, pattern, options = {}) => orig(p, pattern, ext(def, options));
      +    return Object.assign(m, {
      +        Minimatch: class Minimatch extends orig.Minimatch {
      +            constructor(pattern, options = {}) {
      +                super(pattern, ext(def, options));
      +            }
      +            static defaults(options) {
      +                return orig.defaults(ext(def, options)).Minimatch;
      +            }
      +        },
      +        AST: class AST extends orig.AST {
      +            /* c8 ignore start */
      +            constructor(type, parent, options = {}) {
      +                super(type, parent, ext(def, options));
      +            }
      +            /* c8 ignore stop */
      +            static fromGlob(pattern, options = {}) {
      +                return orig.AST.fromGlob(pattern, ext(def, options));
      +            }
      +        },
      +        unescape: (s, options = {}) => orig.unescape(s, ext(def, options)),
      +        escape: (s, options = {}) => orig.escape(s, ext(def, options)),
      +        filter: (pattern, options = {}) => orig.filter(pattern, ext(def, options)),
      +        defaults: (options) => orig.defaults(ext(def, options)),
      +        makeRe: (pattern, options = {}) => orig.makeRe(pattern, ext(def, options)),
      +        braceExpand: (pattern, options = {}) => orig.braceExpand(pattern, ext(def, options)),
      +        match: (list, pattern, options = {}) => orig.match(list, pattern, ext(def, options)),
      +        sep: orig.sep,
      +        GLOBSTAR: GLOBSTAR,
      +    });
      +};
      +minimatch.defaults = defaults;
      +// Brace expansion:
      +// a{b,c}d -> abd acd
      +// a{b,}c -> abc ac
      +// a{0..3}d -> a0d a1d a2d a3d
      +// a{b,c{d,e}f}g -> abg acdfg acefg
      +// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
      +//
      +// Invalid sets are not expanded.
      +// a{2..}b -> a{2..}b
      +// a{b}c -> a{b}c
      +export const braceExpand = (pattern, options = {}) => {
      +    assertValidPattern(pattern);
      +    // Thanks to Yeting Li  for
      +    // improving this regexp to avoid a ReDOS vulnerability.
      +    if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) {
      +        // shortcut. no need to expand.
      +        return [pattern];
      +    }
      +    return expand(pattern, { max: options.braceExpandMax });
      +};
      +minimatch.braceExpand = braceExpand;
      +// parse a component of the expanded set.
      +// At this point, no pattern may contain "/" in it
      +// so we're going to return a 2d array, where each entry is the full
      +// pattern, split on '/', and then turned into a regular expression.
      +// A regexp is made at the end which joins each array with an
      +// escaped /, and another full one which joins each regexp with |.
      +//
      +// Following the lead of Bash 4.1, note that "**" only has special meaning
      +// when it is the *only* thing in a path portion.  Otherwise, any series
      +// of * is equivalent to a single *.  Globstar behavior is enabled by
      +// default, and can be disabled by setting options.noglobstar.
      +export const makeRe = (pattern, options = {}) => new Minimatch(pattern, options).makeRe();
      +minimatch.makeRe = makeRe;
      +export const match = (list, pattern, options = {}) => {
      +    const mm = new Minimatch(pattern, options);
      +    list = list.filter(f => mm.match(f));
      +    if (mm.options.nonull && !list.length) {
      +        list.push(pattern);
      +    }
      +    return list;
      +};
      +minimatch.match = match;
      +// replace stuff like \* with *
      +const globMagic = /[?*]|[+@!]\(.*?\)|\[|\]/;
      +const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
      +export class Minimatch {
      +    options;
      +    set;
      +    pattern;
      +    windowsPathsNoEscape;
      +    nonegate;
      +    negate;
      +    comment;
      +    empty;
      +    preserveMultipleSlashes;
      +    partial;
      +    globSet;
      +    globParts;
      +    nocase;
      +    isWindows;
      +    platform;
      +    windowsNoMagicRoot;
      +    maxGlobstarRecursion;
      +    regexp;
      +    constructor(pattern, options = {}) {
      +        assertValidPattern(pattern);
      +        options = options || {};
      +        this.options = options;
      +        this.maxGlobstarRecursion = options.maxGlobstarRecursion ?? 200;
      +        this.pattern = pattern;
      +        this.platform = options.platform || defaultPlatform;
      +        this.isWindows = this.platform === 'win32';
      +        // avoid the annoying deprecation flag lol
      +        const awe = ('allowWindow' + 'sEscape');
      +        this.windowsPathsNoEscape =
      +            !!options.windowsPathsNoEscape || options[awe] === false;
      +        if (this.windowsPathsNoEscape) {
      +            this.pattern = this.pattern.replace(/\\/g, '/');
      +        }
      +        this.preserveMultipleSlashes = !!options.preserveMultipleSlashes;
      +        this.regexp = null;
      +        this.negate = false;
      +        this.nonegate = !!options.nonegate;
      +        this.comment = false;
      +        this.empty = false;
      +        this.partial = !!options.partial;
      +        this.nocase = !!this.options.nocase;
      +        this.windowsNoMagicRoot =
      +            options.windowsNoMagicRoot !== undefined ?
      +                options.windowsNoMagicRoot
      +                : !!(this.isWindows && this.nocase);
      +        this.globSet = [];
      +        this.globParts = [];
      +        this.set = [];
      +        // make the set of regexps etc.
      +        this.make();
      +    }
      +    hasMagic() {
      +        if (this.options.magicalBraces && this.set.length > 1) {
      +            return true;
      +        }
      +        for (const pattern of this.set) {
      +            for (const part of pattern) {
      +                if (typeof part !== 'string')
      +                    return true;
      +            }
      +        }
      +        return false;
      +    }
      +    debug(..._) { }
      +    make() {
      +        const pattern = this.pattern;
      +        const options = this.options;
      +        // empty patterns and comments match nothing.
      +        if (!options.nocomment && pattern.charAt(0) === '#') {
      +            this.comment = true;
      +            return;
      +        }
      +        if (!pattern) {
      +            this.empty = true;
      +            return;
      +        }
      +        // step 1: figure out negation, etc.
      +        this.parseNegate();
      +        // step 2: expand braces
      +        this.globSet = [...new Set(this.braceExpand())];
      +        if (options.debug) {
      +            //oxlint-disable-next-line no-console
      +            this.debug = (...args) => console.error(...args);
      +        }
      +        this.debug(this.pattern, this.globSet);
      +        // step 3: now we have a set, so turn each one into a series of
      +        // path-portion matching patterns.
      +        // These will be regexps, except in the case of "**", which is
      +        // set to the GLOBSTAR object for globstar behavior,
      +        // and will not contain any / characters
      +        //
      +        // First, we preprocess to make the glob pattern sets a bit simpler
      +        // and deduped.  There are some perf-killing patterns that can cause
      +        // problems with a glob walk, but we can simplify them down a bit.
      +        const rawGlobParts = this.globSet.map(s => this.slashSplit(s));
      +        this.globParts = this.preprocess(rawGlobParts);
      +        this.debug(this.pattern, this.globParts);
      +        // glob --> regexps
      +        let set = this.globParts.map((s, _, __) => {
      +            if (this.isWindows && this.windowsNoMagicRoot) {
      +                // check if it's a drive or unc path.
      +                const isUNC = s[0] === '' &&
      +                    s[1] === '' &&
      +                    (s[2] === '?' || !globMagic.test(s[2])) &&
      +                    !globMagic.test(s[3]);
      +                const isDrive = /^[a-z]:/i.test(s[0]);
      +                if (isUNC) {
      +                    return [
      +                        ...s.slice(0, 4),
      +                        ...s.slice(4).map(ss => this.parse(ss)),
      +                    ];
      +                }
      +                else if (isDrive) {
      +                    return [s[0], ...s.slice(1).map(ss => this.parse(ss))];
      +                }
      +            }
      +            return s.map(ss => this.parse(ss));
      +        });
      +        this.debug(this.pattern, set);
      +        // filter out everything that didn't compile properly.
      +        this.set = set.filter(s => s.indexOf(false) === -1);
      +        // do not treat the ? in UNC paths as magic
      +        if (this.isWindows) {
      +            for (let i = 0; i < this.set.length; i++) {
      +                const p = this.set[i];
      +                if (p[0] === '' &&
      +                    p[1] === '' &&
      +                    this.globParts[i][2] === '?' &&
      +                    typeof p[3] === 'string' &&
      +                    /^[a-z]:$/i.test(p[3])) {
      +                    p[2] = '?';
      +                }
      +            }
      +        }
      +        this.debug(this.pattern, this.set);
      +    }
      +    // various transforms to equivalent pattern sets that are
      +    // faster to process in a filesystem walk.  The goal is to
      +    // eliminate what we can, and push all ** patterns as far
      +    // to the right as possible, even if it increases the number
      +    // of patterns that we have to process.
      +    preprocess(globParts) {
      +        // if we're not in globstar mode, then turn ** into *
      +        if (this.options.noglobstar) {
      +            for (const partset of globParts) {
      +                for (let j = 0; j < partset.length; j++) {
      +                    if (partset[j] === '**') {
      +                        partset[j] = '*';
      +                    }
      +                }
      +            }
      +        }
      +        const { optimizationLevel = 1 } = this.options;
      +        if (optimizationLevel >= 2) {
      +            // aggressive optimization for the purpose of fs walking
      +            globParts = this.firstPhasePreProcess(globParts);
      +            globParts = this.secondPhasePreProcess(globParts);
      +        }
      +        else if (optimizationLevel >= 1) {
      +            // just basic optimizations to remove some .. parts
      +            globParts = this.levelOneOptimize(globParts);
      +        }
      +        else {
      +            // just collapse multiple ** portions into one
      +            globParts = this.adjascentGlobstarOptimize(globParts);
      +        }
      +        return globParts;
      +    }
      +    // just get rid of adjascent ** portions
      +    adjascentGlobstarOptimize(globParts) {
      +        return globParts.map(parts => {
      +            let gs = -1;
      +            while (-1 !== (gs = parts.indexOf('**', gs + 1))) {
      +                let i = gs;
      +                while (parts[i + 1] === '**') {
      +                    i++;
      +                }
      +                if (i !== gs) {
      +                    parts.splice(gs, i - gs);
      +                }
      +            }
      +            return parts;
      +        });
      +    }
      +    // get rid of adjascent ** and resolve .. portions
      +    levelOneOptimize(globParts) {
      +        return globParts.map(parts => {
      +            parts = parts.reduce((set, part) => {
      +                const prev = set[set.length - 1];
      +                if (part === '**' && prev === '**') {
      +                    return set;
      +                }
      +                if (part === '..') {
      +                    if (prev && prev !== '..' && prev !== '.' && prev !== '**') {
      +                        set.pop();
      +                        return set;
      +                    }
      +                }
      +                set.push(part);
      +                return set;
      +            }, []);
      +            return parts.length === 0 ? [''] : parts;
      +        });
      +    }
      +    levelTwoFileOptimize(parts) {
      +        if (!Array.isArray(parts)) {
      +            parts = this.slashSplit(parts);
      +        }
      +        let didSomething = false;
      +        do {
      +            didSomething = false;
      +            // 
      // -> 
      /
      +            if (!this.preserveMultipleSlashes) {
      +                for (let i = 1; i < parts.length - 1; i++) {
      +                    const p = parts[i];
      +                    // don't squeeze out UNC patterns
      +                    if (i === 1 && p === '' && parts[0] === '')
      +                        continue;
      +                    if (p === '.' || p === '') {
      +                        didSomething = true;
      +                        parts.splice(i, 1);
      +                        i--;
      +                    }
      +                }
      +                if (parts[0] === '.' &&
      +                    parts.length === 2 &&
      +                    (parts[1] === '.' || parts[1] === '')) {
      +                    didSomething = true;
      +                    parts.pop();
      +                }
      +            }
      +            // 
      /

      /../ ->

      /
      +            let dd = 0;
      +            while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
      +                const p = parts[dd - 1];
      +                if (p &&
      +                    p !== '.' &&
      +                    p !== '..' &&
      +                    p !== '**' &&
      +                    !(this.isWindows && /^[a-z]:$/i.test(p))) {
      +                    didSomething = true;
      +                    parts.splice(dd - 1, 2);
      +                    dd -= 2;
      +                }
      +            }
      +        } while (didSomething);
      +        return parts.length === 0 ? [''] : parts;
      +    }
      +    // First phase: single-pattern processing
      +    // 
       is 1 or more portions
      +    //  is 1 or more portions
      +    // 

      is any portion other than ., .., '', or ** + // is . or '' + // + // **/.. is *brutal* for filesystem walking performance, because + // it effectively resets the recursive walk each time it occurs, + // and ** cannot be reduced out by a .. pattern part like a regexp + // or most strings (other than .., ., and '') can be. + // + //

      /**/../

      /

      / -> {

      /../

      /

      /,

      /**/

      /

      /} + //

      // -> 
      /
      +    // 
      /

      /../ ->

      /
      +    // **/**/ -> **/
      +    //
      +    // **/*/ -> */**/ <== not valid because ** doesn't follow
      +    // this WOULD be allowed if ** did follow symlinks, or * didn't
      +    firstPhasePreProcess(globParts) {
      +        let didSomething = false;
      +        do {
      +            didSomething = false;
      +            // 
      /**/../

      /

      / -> {

      /../

      /

      /,

      /**/

      /

      /} + for (let parts of globParts) { + let gs = -1; + while (-1 !== (gs = parts.indexOf('**', gs + 1))) { + let gss = gs; + while (parts[gss + 1] === '**') { + //

      /**/**/ -> 
      /**/
      +                        gss++;
      +                    }
      +                    // eg, if gs is 2 and gss is 4, that means we have 3 **
      +                    // parts, and can remove 2 of them.
      +                    if (gss > gs) {
      +                        parts.splice(gs + 1, gss - gs);
      +                    }
      +                    let next = parts[gs + 1];
      +                    const p = parts[gs + 2];
      +                    const p2 = parts[gs + 3];
      +                    if (next !== '..')
      +                        continue;
      +                    if (!p ||
      +                        p === '.' ||
      +                        p === '..' ||
      +                        !p2 ||
      +                        p2 === '.' ||
      +                        p2 === '..') {
      +                        continue;
      +                    }
      +                    didSomething = true;
      +                    // edit parts in place, and push the new one
      +                    parts.splice(gs, 1);
      +                    const other = parts.slice(0);
      +                    other[gs] = '**';
      +                    globParts.push(other);
      +                    gs--;
      +                }
      +                // 
      // -> 
      /
      +                if (!this.preserveMultipleSlashes) {
      +                    for (let i = 1; i < parts.length - 1; i++) {
      +                        const p = parts[i];
      +                        // don't squeeze out UNC patterns
      +                        if (i === 1 && p === '' && parts[0] === '')
      +                            continue;
      +                        if (p === '.' || p === '') {
      +                            didSomething = true;
      +                            parts.splice(i, 1);
      +                            i--;
      +                        }
      +                    }
      +                    if (parts[0] === '.' &&
      +                        parts.length === 2 &&
      +                        (parts[1] === '.' || parts[1] === '')) {
      +                        didSomething = true;
      +                        parts.pop();
      +                    }
      +                }
      +                // 
      /

      /../ ->

      /
      +                let dd = 0;
      +                while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
      +                    const p = parts[dd - 1];
      +                    if (p && p !== '.' && p !== '..' && p !== '**') {
      +                        didSomething = true;
      +                        const needDot = dd === 1 && parts[dd + 1] === '**';
      +                        const splin = needDot ? ['.'] : [];
      +                        parts.splice(dd - 1, 2, ...splin);
      +                        if (parts.length === 0)
      +                            parts.push('');
      +                        dd -= 2;
      +                    }
      +                }
      +            }
      +        } while (didSomething);
      +        return globParts;
      +    }
      +    // second phase: multi-pattern dedupes
      +    // {
      /*/,
      /

      /} ->

      /*/
      +    // {
      /,
      /} -> 
      /
      +    // {
      /**/,
      /} -> 
      /**/
      +    //
      +    // {
      /**/,
      /**/

      /} ->

      /**/
      +    // ^-- not valid because ** doens't follow symlinks
      +    secondPhasePreProcess(globParts) {
      +        for (let i = 0; i < globParts.length - 1; i++) {
      +            for (let j = i + 1; j < globParts.length; j++) {
      +                const matched = this.partsMatch(globParts[i], globParts[j], !this.preserveMultipleSlashes);
      +                if (matched) {
      +                    globParts[i] = [];
      +                    globParts[j] = matched;
      +                    break;
      +                }
      +            }
      +        }
      +        return globParts.filter(gs => gs.length);
      +    }
      +    partsMatch(a, b, emptyGSMatch = false) {
      +        let ai = 0;
      +        let bi = 0;
      +        let result = [];
      +        let which = '';
      +        while (ai < a.length && bi < b.length) {
      +            if (a[ai] === b[bi]) {
      +                result.push(which === 'b' ? b[bi] : a[ai]);
      +                ai++;
      +                bi++;
      +            }
      +            else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {
      +                result.push(a[ai]);
      +                ai++;
      +            }
      +            else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {
      +                result.push(b[bi]);
      +                bi++;
      +            }
      +            else if (a[ai] === '*' &&
      +                b[bi] &&
      +                (this.options.dot || !b[bi].startsWith('.')) &&
      +                b[bi] !== '**') {
      +                if (which === 'b')
      +                    return false;
      +                which = 'a';
      +                result.push(a[ai]);
      +                ai++;
      +                bi++;
      +            }
      +            else if (b[bi] === '*' &&
      +                a[ai] &&
      +                (this.options.dot || !a[ai].startsWith('.')) &&
      +                a[ai] !== '**') {
      +                if (which === 'a')
      +                    return false;
      +                which = 'b';
      +                result.push(b[bi]);
      +                ai++;
      +                bi++;
      +            }
      +            else {
      +                return false;
      +            }
      +        }
      +        // if we fall out of the loop, it means they two are identical
      +        // as long as their lengths match
      +        return a.length === b.length && result;
      +    }
      +    parseNegate() {
      +        if (this.nonegate)
      +            return;
      +        const pattern = this.pattern;
      +        let negate = false;
      +        let negateOffset = 0;
      +        for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {
      +            negate = !negate;
      +            negateOffset++;
      +        }
      +        if (negateOffset)
      +            this.pattern = pattern.slice(negateOffset);
      +        this.negate = negate;
      +    }
      +    // set partial to true to test if, for example,
      +    // "/a/b" matches the start of "/*/b/*/d"
      +    // Partial means, if you run out of file before you run
      +    // out of pattern, then that's fine, as long as all
      +    // the parts match.
      +    matchOne(file, pattern, partial = false) {
      +        let fileStartIndex = 0;
      +        let patternStartIndex = 0;
      +        // UNC paths like //?/X:/... can match X:/... and vice versa
      +        // Drive letters in absolute drive or unc paths are always compared
      +        // case-insensitively.
      +        if (this.isWindows) {
      +            const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0]);
      +            const fileUNC = !fileDrive &&
      +                file[0] === '' &&
      +                file[1] === '' &&
      +                file[2] === '?' &&
      +                /^[a-z]:$/i.test(file[3]);
      +            const patternDrive = typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0]);
      +            const patternUNC = !patternDrive &&
      +                pattern[0] === '' &&
      +                pattern[1] === '' &&
      +                pattern[2] === '?' &&
      +                typeof pattern[3] === 'string' &&
      +                /^[a-z]:$/i.test(pattern[3]);
      +            const fdi = fileUNC ? 3
      +                : fileDrive ? 0
      +                    : undefined;
      +            const pdi = patternUNC ? 3
      +                : patternDrive ? 0
      +                    : undefined;
      +            if (typeof fdi === 'number' && typeof pdi === 'number') {
      +                const [fd, pd] = [
      +                    file[fdi],
      +                    pattern[pdi],
      +                ];
      +                // start matching at the drive letter index of each
      +                if (fd.toLowerCase() === pd.toLowerCase()) {
      +                    pattern[pdi] = fd;
      +                    patternStartIndex = pdi;
      +                    fileStartIndex = fdi;
      +                }
      +            }
      +        }
      +        // resolve and reduce . and .. portions in the file as well.
      +        // don't need to do the second phase, because it's only one string[]
      +        const { optimizationLevel = 1 } = this.options;
      +        if (optimizationLevel >= 2) {
      +            file = this.levelTwoFileOptimize(file);
      +        }
      +        if (pattern.includes(GLOBSTAR)) {
      +            return this.#matchGlobstar(file, pattern, partial, fileStartIndex, patternStartIndex);
      +        }
      +        return this.#matchOne(file, pattern, partial, fileStartIndex, patternStartIndex);
      +    }
      +    #matchGlobstar(file, pattern, partial, fileIndex, patternIndex) {
      +        // split the pattern into head, tail, and middle of ** delimited parts
      +        const firstgs = pattern.indexOf(GLOBSTAR, patternIndex);
      +        const lastgs = pattern.lastIndexOf(GLOBSTAR);
      +        // split the pattern up into globstar-delimited sections
      +        // the tail has to be at the end, and the others just have
      +        // to be found in order from the head.
      +        const [head, body, tail] = partial ?
      +            [
      +                pattern.slice(patternIndex, firstgs),
      +                pattern.slice(firstgs + 1),
      +                [],
      +            ]
      +            : [
      +                pattern.slice(patternIndex, firstgs),
      +                pattern.slice(firstgs + 1, lastgs),
      +                pattern.slice(lastgs + 1),
      +            ];
      +        // check the head, from the current file/pattern index.
      +        if (head.length) {
      +            const fileHead = file.slice(fileIndex, fileIndex + head.length);
      +            if (!this.#matchOne(fileHead, head, partial, 0, 0)) {
      +                return false;
      +            }
      +            fileIndex += head.length;
      +            patternIndex += head.length;
      +        }
      +        // now we know the head matches!
      +        // if the last portion is not empty, it MUST match the end
      +        // check the tail
      +        let fileTailMatch = 0;
      +        if (tail.length) {
      +            // if head + tail > file, then we cannot possibly match
      +            if (tail.length + fileIndex > file.length)
      +                return false;
      +            // try to match the tail
      +            let tailStart = file.length - tail.length;
      +            if (this.#matchOne(file, tail, partial, tailStart, 0)) {
      +                fileTailMatch = tail.length;
      +            }
      +            else {
      +                // affordance for stuff like a/**/* matching a/b/
      +                // if the last file portion is '', and there's more to the pattern
      +                // then try without the '' bit.
      +                if (file[file.length - 1] !== '' ||
      +                    fileIndex + tail.length === file.length) {
      +                    return false;
      +                }
      +                tailStart--;
      +                if (!this.#matchOne(file, tail, partial, tailStart, 0)) {
      +                    return false;
      +                }
      +                fileTailMatch = tail.length + 1;
      +            }
      +        }
      +        // now we know the tail matches!
      +        // the middle is zero or more portions wrapped in **, possibly
      +        // containing more ** sections.
      +        // so a/**/b/**/c/**/d has become **/b/**/c/**
      +        // if it's empty, it means a/**/b, just verify we have no bad dots
      +        // if there's no tail, so it ends on /**, then we must have *something*
      +        // after the head, or it's not a matc
      +        if (!body.length) {
      +            let sawSome = !!fileTailMatch;
      +            for (let i = fileIndex; i < file.length - fileTailMatch; i++) {
      +                const f = String(file[i]);
      +                sawSome = true;
      +                if (f === '.' ||
      +                    f === '..' ||
      +                    (!this.options.dot && f.startsWith('.'))) {
      +                    return false;
      +                }
      +            }
      +            // in partial mode, we just need to get past all file parts
      +            return partial || sawSome;
      +        }
      +        // now we know that there's one or more body sections, which can
      +        // be matched anywhere from the 0 index (because the head was pruned)
      +        // through to the length-fileTailMatch index.
      +        // split the body up into sections, and note the minimum index it can
      +        // be found at (start with the length of all previous segments)
      +        // [section, before, after]
      +        const bodySegments = [[[], 0]];
      +        let currentBody = bodySegments[0];
      +        let nonGsParts = 0;
      +        const nonGsPartsSums = [0];
      +        for (const b of body) {
      +            if (b === GLOBSTAR) {
      +                nonGsPartsSums.push(nonGsParts);
      +                currentBody = [[], 0];
      +                bodySegments.push(currentBody);
      +            }
      +            else {
      +                currentBody[0].push(b);
      +                nonGsParts++;
      +            }
      +        }
      +        let i = bodySegments.length - 1;
      +        const fileLength = file.length - fileTailMatch;
      +        for (const b of bodySegments) {
      +            b[1] = fileLength - (nonGsPartsSums[i--] + b[0].length);
      +        }
      +        return !!this.#matchGlobStarBodySections(file, bodySegments, fileIndex, 0, partial, 0, !!fileTailMatch);
      +    }
      +    // return false for "nope, not matching"
      +    // return null for "not matching, cannot keep trying"
      +    #matchGlobStarBodySections(file, 
      +    // pattern section, last possible position for it
      +    bodySegments, fileIndex, bodyIndex, partial, globStarDepth, sawTail) {
      +        // take the first body segment, and walk from fileIndex to its "after"
      +        // value at the end
      +        // If it doesn't match at that position, we increment, until we hit
      +        // that final possible position, and give up.
      +        // If it does match, then advance and try to rest.
      +        // If any of them fail we keep walking forward.
      +        // this is still a bit recursively painful, but it's more constrained
      +        // than previous implementations, because we never test something that
      +        // can't possibly be a valid matching condition.
      +        const bs = bodySegments[bodyIndex];
      +        if (!bs) {
      +            // just make sure that there's no bad dots
      +            for (let i = fileIndex; i < file.length; i++) {
      +                sawTail = true;
      +                const f = file[i];
      +                if (f === '.' ||
      +                    f === '..' ||
      +                    (!this.options.dot && f.startsWith('.'))) {
      +                    return false;
      +                }
      +            }
      +            return sawTail;
      +        }
      +        // have a non-globstar body section to test
      +        const [body, after] = bs;
      +        while (fileIndex <= after) {
      +            const m = this.#matchOne(file.slice(0, fileIndex + body.length), body, partial, fileIndex, 0);
      +            // if limit exceeded, no match. intentional false negative,
      +            // acceptable break in correctness for security.
      +            if (m && globStarDepth < this.maxGlobstarRecursion) {
      +                // match! see if the rest match. if so, we're done!
      +                const sub = this.#matchGlobStarBodySections(file, bodySegments, fileIndex + body.length, bodyIndex + 1, partial, globStarDepth + 1, sawTail);
      +                if (sub !== false) {
      +                    return sub;
      +                }
      +            }
      +            const f = file[fileIndex];
      +            if (f === '.' ||
      +                f === '..' ||
      +                (!this.options.dot && f.startsWith('.'))) {
      +                return false;
      +            }
      +            fileIndex++;
      +        }
      +        // walked off. no point continuing
      +        return partial || null;
      +    }
      +    #matchOne(file, pattern, partial, fileIndex, patternIndex) {
      +        let fi;
      +        let pi;
      +        let pl;
      +        let fl;
      +        for (fi = fileIndex,
      +            pi = patternIndex,
      +            fl = file.length,
      +            pl = pattern.length; fi < fl && pi < pl; fi++, pi++) {
      +            this.debug('matchOne loop');
      +            let p = pattern[pi];
      +            let f = file[fi];
      +            this.debug(pattern, p, f);
      +            // should be impossible.
      +            // some invalid regexp stuff in the set.
      +            /* c8 ignore start */
      +            if (p === false || p === GLOBSTAR) {
      +                return false;
      +            }
      +            /* c8 ignore stop */
      +            // something other than **
      +            // non-magic patterns just have to match exactly
      +            // patterns with magic have been turned into regexps.
      +            let hit;
      +            if (typeof p === 'string') {
      +                hit = f === p;
      +                this.debug('string match', p, f, hit);
      +            }
      +            else {
      +                hit = p.test(f);
      +                this.debug('pattern match', p, f, hit);
      +            }
      +            if (!hit)
      +                return false;
      +        }
      +        // Note: ending in / means that we'll get a final ""
      +        // at the end of the pattern.  This can only match a
      +        // corresponding "" at the end of the file.
      +        // If the file ends in /, then it can only match a
      +        // a pattern that ends in /, unless the pattern just
      +        // doesn't have any more for it. But, a/b/ should *not*
      +        // match "a/b/*", even though "" matches against the
      +        // [^/]*? pattern, except in partial mode, where it might
      +        // simply not be reached yet.
      +        // However, a/b/ should still satisfy a/*
      +        // now either we fell off the end of the pattern, or we're done.
      +        if (fi === fl && pi === pl) {
      +            // ran out of pattern and filename at the same time.
      +            // an exact hit!
      +            return true;
      +        }
      +        else if (fi === fl) {
      +            // ran out of file, but still had pattern left.
      +            // this is ok if we're doing the match as part of
      +            // a glob fs traversal.
      +            return partial;
      +        }
      +        else if (pi === pl) {
      +            // ran out of pattern, still have file left.
      +            // this is only acceptable if we're on the very last
      +            // empty segment of a file with a trailing slash.
      +            // a/* should match a/b/
      +            return fi === fl - 1 && file[fi] === '';
      +            /* c8 ignore start */
      +        }
      +        else {
      +            // should be unreachable.
      +            throw new Error('wtf?');
      +        }
      +        /* c8 ignore stop */
      +    }
      +    braceExpand() {
      +        return braceExpand(this.pattern, this.options);
      +    }
      +    parse(pattern) {
      +        assertValidPattern(pattern);
      +        const options = this.options;
      +        // shortcuts
      +        if (pattern === '**')
      +            return GLOBSTAR;
      +        if (pattern === '')
      +            return '';
      +        // far and away, the most common glob pattern parts are
      +        // *, *.*, and *.  Add a fast check method for those.
      +        let m;
      +        let fastTest = null;
      +        if ((m = pattern.match(starRE))) {
      +            fastTest = options.dot ? starTestDot : starTest;
      +        }
      +        else if ((m = pattern.match(starDotExtRE))) {
      +            fastTest = (options.nocase ?
      +                options.dot ?
      +                    starDotExtTestNocaseDot
      +                    : starDotExtTestNocase
      +                : options.dot ? starDotExtTestDot
      +                    : starDotExtTest)(m[1]);
      +        }
      +        else if ((m = pattern.match(qmarksRE))) {
      +            fastTest = (options.nocase ?
      +                options.dot ?
      +                    qmarksTestNocaseDot
      +                    : qmarksTestNocase
      +                : options.dot ? qmarksTestDot
      +                    : qmarksTest)(m);
      +        }
      +        else if ((m = pattern.match(starDotStarRE))) {
      +            fastTest = options.dot ? starDotStarTestDot : starDotStarTest;
      +        }
      +        else if ((m = pattern.match(dotStarRE))) {
      +            fastTest = dotStarTest;
      +        }
      +        const re = AST.fromGlob(pattern, this.options).toMMPattern();
      +        if (fastTest && typeof re === 'object') {
      +            // Avoids overriding in frozen environments
      +            Reflect.defineProperty(re, 'test', { value: fastTest });
      +        }
      +        return re;
      +    }
      +    makeRe() {
      +        if (this.regexp || this.regexp === false)
      +            return this.regexp;
      +        // at this point, this.set is a 2d array of partial
      +        // pattern strings, or "**".
      +        //
      +        // It's better to use .match().  This function shouldn't
      +        // be used, really, but it's pretty convenient sometimes,
      +        // when you just want to work with a regex.
      +        const set = this.set;
      +        if (!set.length) {
      +            this.regexp = false;
      +            return this.regexp;
      +        }
      +        const options = this.options;
      +        const twoStar = options.noglobstar ? star
      +            : options.dot ? twoStarDot
      +                : twoStarNoDot;
      +        const flags = new Set(options.nocase ? ['i'] : []);
      +        // regexpify non-globstar patterns
      +        // if ** is only item, then we just do one twoStar
      +        // if ** is first, and there are more, prepend (\/|twoStar\/)? to next
      +        // if ** is last, append (\/twoStar|) to previous
      +        // if ** is in the middle, append (\/|\/twoStar\/) to previous
      +        // then filter out GLOBSTAR symbols
      +        let re = set
      +            .map(pattern => {
      +            const pp = pattern.map(p => {
      +                if (p instanceof RegExp) {
      +                    for (const f of p.flags.split(''))
      +                        flags.add(f);
      +                }
      +                return (typeof p === 'string' ? regExpEscape(p)
      +                    : p === GLOBSTAR ? GLOBSTAR
      +                        : p._src);
      +            });
      +            pp.forEach((p, i) => {
      +                const next = pp[i + 1];
      +                const prev = pp[i - 1];
      +                if (p !== GLOBSTAR || prev === GLOBSTAR) {
      +                    return;
      +                }
      +                if (prev === undefined) {
      +                    if (next !== undefined && next !== GLOBSTAR) {
      +                        pp[i + 1] = '(?:\\/|' + twoStar + '\\/)?' + next;
      +                    }
      +                    else {
      +                        pp[i] = twoStar;
      +                    }
      +                }
      +                else if (next === undefined) {
      +                    pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + ')?';
      +                }
      +                else if (next !== GLOBSTAR) {
      +                    pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + '\\/)' + next;
      +                    pp[i + 1] = GLOBSTAR;
      +                }
      +            });
      +            const filtered = pp.filter(p => p !== GLOBSTAR);
      +            // For partial matches, we need to make the pattern match
      +            // any prefix of the full path. We do this by generating
      +            // alternative patterns that match progressively longer prefixes.
      +            if (this.partial && filtered.length >= 1) {
      +                const prefixes = [];
      +                for (let i = 1; i <= filtered.length; i++) {
      +                    prefixes.push(filtered.slice(0, i).join('/'));
      +                }
      +                return '(?:' + prefixes.join('|') + ')';
      +            }
      +            return filtered.join('/');
      +        })
      +            .join('|');
      +        // need to wrap in parens if we had more than one thing with |,
      +        // otherwise only the first will be anchored to ^ and the last to $
      +        const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', ''];
      +        // must match entire pattern
      +        // ending in a * or ** will make it less strict.
      +        re = '^' + open + re + close + '$';
      +        // In partial mode, '/' should always match as it's a valid prefix for any pattern
      +        if (this.partial) {
      +            re = '^(?:\\/|' + open + re.slice(1, -1) + close + ')$';
      +        }
      +        // can match anything, as long as it's not this.
      +        if (this.negate)
      +            re = '^(?!' + re + ').+$';
      +        try {
      +            this.regexp = new RegExp(re, [...flags].join(''));
      +            /* c8 ignore start */
      +        }
      +        catch {
      +            // should be impossible
      +            this.regexp = false;
      +        }
      +        /* c8 ignore stop */
      +        return this.regexp;
      +    }
      +    slashSplit(p) {
      +        // if p starts with // on windows, we preserve that
      +        // so that UNC paths aren't broken.  Otherwise, any number of
      +        // / characters are coalesced into one, unless
      +        // preserveMultipleSlashes is set to true.
      +        if (this.preserveMultipleSlashes) {
      +            return p.split('/');
      +        }
      +        else if (this.isWindows && /^\/\/[^/]+/.test(p)) {
      +            // add an extra '' for the one we lose
      +            return ['', ...p.split(/\/+/)];
      +        }
      +        else {
      +            return p.split(/\/+/);
      +        }
      +    }
      +    match(f, partial = this.partial) {
      +        this.debug('match', f, this.pattern);
      +        // short-circuit in the case of busted things.
      +        // comments, etc.
      +        if (this.comment) {
      +            return false;
      +        }
      +        if (this.empty) {
      +            return f === '';
      +        }
      +        if (f === '/' && partial) {
      +            return true;
      +        }
      +        const options = this.options;
      +        // windows: need to use /, not \
      +        if (this.isWindows) {
      +            f = f.split('\\').join('/');
      +        }
      +        // treat the test path as a set of pathparts.
      +        const ff = this.slashSplit(f);
      +        this.debug(this.pattern, 'split', ff);
      +        // just ONE of the pattern sets in this.set needs to match
      +        // in order for it to be valid.  If negating, then just one
      +        // match means that we have failed.
      +        // Either way, return on the first hit.
      +        const set = this.set;
      +        this.debug(this.pattern, 'set', set);
      +        // Find the basename of the path by looking for the last non-empty segment
      +        let filename = ff[ff.length - 1];
      +        if (!filename) {
      +            for (let i = ff.length - 2; !filename && i >= 0; i--) {
      +                filename = ff[i];
      +            }
      +        }
      +        for (const pattern of set) {
      +            let file = ff;
      +            if (options.matchBase && pattern.length === 1) {
      +                file = [filename];
      +            }
      +            const hit = this.matchOne(file, pattern, partial);
      +            if (hit) {
      +                if (options.flipNegate) {
      +                    return true;
      +                }
      +                return !this.negate;
      +            }
      +        }
      +        // didn't get any hits.  this is success if it's a negative
      +        // pattern, failure otherwise.
      +        if (options.flipNegate) {
      +            return false;
      +        }
      +        return this.negate;
      +    }
      +    static defaults(def) {
      +        return minimatch.defaults(def).Minimatch;
      +    }
      +}
      +/* c8 ignore start */
      +export { AST } from './ast.js';
      +export { escape } from './escape.js';
      +export { unescape } from './unescape.js';
      +/* c8 ignore stop */
      +minimatch.AST = AST;
      +minimatch.Minimatch = Minimatch;
      +minimatch.escape = escape;
      +minimatch.unescape = unescape;
      +//# sourceMappingURL=index.js.map
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/esm/index.js.map b/node_modules/minimatch/dist/esm/index.js.map
      new file mode 100644
      index 00000000..431b3a15
      --- /dev/null
      +++ b/node_modules/minimatch/dist/esm/index.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { expand } from 'brace-expansion'\nimport { assertValidPattern } from './assert-valid-pattern.js'\nimport type { ExtglobType } from './ast.js'\nimport { AST } from './ast.js'\nimport { escape } from './escape.js'\nimport { unescape } from './unescape.js'\n\nexport type Platform =\n  | 'aix'\n  | 'android'\n  | 'darwin'\n  | 'freebsd'\n  | 'haiku'\n  | 'linux'\n  | 'openbsd'\n  | 'sunos'\n  | 'win32'\n  | 'cygwin'\n  | 'netbsd'\n\nexport interface MinimatchOptions {\n  /** do not expand `{x,y}` style braces */\n  nobrace?: boolean\n  /** do not treat patterns starting with `#` as a comment */\n  nocomment?: boolean\n  /** do not treat patterns starting with `!` as a negation */\n  nonegate?: boolean\n  /** print LOTS of debugging output */\n  debug?: boolean\n  /** treat `**` the same as `*` */\n  noglobstar?: boolean\n  /** do not expand extglobs like `+(a|b)` */\n  noext?: boolean\n  /** return the pattern if nothing matches */\n  nonull?: boolean\n  /** treat `\\\\` as a path separator, not an escape character */\n  windowsPathsNoEscape?: boolean\n  /**\n   * inverse of {@link MinimatchOptions.windowsPathsNoEscape}\n   * @deprecated\n   */\n  allowWindowsEscape?: boolean\n  /**\n   * Compare a partial path to a pattern. As long as the parts\n   * of the path that are present are not contradicted by the\n   * pattern, it will be treated as a match. This is useful in\n   * applications where you're walking through a folder structure,\n   * and don't yet have the full path, but want to ensure that you\n   * do not walk down paths that can never be a match.\n   */\n  partial?: boolean\n  /** allow matches that start with `.` even if the pattern does not */\n  dot?: boolean\n  /** ignore case */\n  nocase?: boolean\n  /** ignore case only in wildcard patterns */\n  nocaseMagicOnly?: boolean\n  /** consider braces to be \"magic\" for the purpose of `hasMagic` */\n  magicalBraces?: boolean\n  /**\n   * If set, then patterns without slashes will be matched\n   * against the basename of the path if it contains slashes.\n   * For example, `a?b` would match the path `/xyz/123/acb`, but\n   * not `/xyz/acb/123`.\n   */\n  matchBase?: boolean\n  /** invert the results of negated matches */\n  flipNegate?: boolean\n  /** do not collapse multiple `/` into a single `/` */\n  preserveMultipleSlashes?: boolean\n  /**\n   * A number indicating the level of optimization that should be done\n   * to the pattern prior to parsing and using it for matches.\n   */\n  optimizationLevel?: number\n  /** operating system platform */\n  platform?: Platform\n  /**\n   * When a pattern starts with a UNC path or drive letter, and in\n   * `nocase:true` mode, do not convert the root portions of the\n   * pattern into a case-insensitive regular expression, and instead\n   * leave them as strings.\n   *\n   * This is the default when the platform is `win32` and\n   * `nocase:true` is set.\n   */\n  windowsNoMagicRoot?: boolean\n  /**\n   * max number of `{...}` patterns to expand. Default 100_000.\n   */\n  braceExpandMax?: number\n  /**\n   * Max number of non-adjacent `**` patterns to recursively walk down.\n   *\n   * The default of 200 is almost certainly high enough for most purposes,\n   * and can handle absurdly excessive patterns.\n   */\n  maxGlobstarRecursion?: number\n\n  /**\n   * Max depth to traverse for nested extglobs like `*(a|b|c)`\n   *\n   * Default is 2, which is quite low, but any higher value\n   * swiftly results in punishing performance impacts. Note\n   * that this is *not*  relevant when the globstar types can\n   * be safely coalesced into a single set.\n   *\n   * For example, `*(a|@(b|c)|d)` would be flattened into\n   * `*(a|b|c|d)`. Thus, many common extglobs will retain good\n   * performance and  never hit this limit, even if they are\n   * excessively deep and complicated.\n   *\n   * If the limit is hit, then the extglob characters are simply\n   * not parsed, and the pattern effectively switches into\n   * `noextglob: true` mode for the contents of that nested\n   * sub-pattern. This will typically _not_ result in a match,\n   * but is considered a valid trade-off for security and\n   * performance.\n   */\n  maxExtglobRecursion?: number\n}\n\nexport const minimatch = (\n  p: string,\n  pattern: string,\n  options: MinimatchOptions = {},\n) => {\n  assertValidPattern(pattern)\n\n  // shortcut: comments match nothing.\n  if (!options.nocomment && pattern.charAt(0) === '#') {\n    return false\n  }\n\n  return new Minimatch(pattern, options).match(p)\n}\n\n// Optimized checking for the most common glob patterns.\nconst starDotExtRE = /^\\*+([^+@!?*[(]*)$/\nconst starDotExtTest = (ext: string) => (f: string) =>\n  !f.startsWith('.') && f.endsWith(ext)\nconst starDotExtTestDot = (ext: string) => (f: string) => f.endsWith(ext)\nconst starDotExtTestNocase = (ext: string) => {\n  ext = ext.toLowerCase()\n  return (f: string) => !f.startsWith('.') && f.toLowerCase().endsWith(ext)\n}\nconst starDotExtTestNocaseDot = (ext: string) => {\n  ext = ext.toLowerCase()\n  return (f: string) => f.toLowerCase().endsWith(ext)\n}\nconst starDotStarRE = /^\\*+\\.\\*+$/\nconst starDotStarTest = (f: string) =>\n  !f.startsWith('.') && f.includes('.')\nconst starDotStarTestDot = (f: string) =>\n  f !== '.' && f !== '..' && f.includes('.')\nconst dotStarRE = /^\\.\\*+$/\nconst dotStarTest = (f: string) =>\n  f !== '.' && f !== '..' && f.startsWith('.')\nconst starRE = /^\\*+$/\nconst starTest = (f: string) => f.length !== 0 && !f.startsWith('.')\nconst starTestDot = (f: string) =>\n  f.length !== 0 && f !== '.' && f !== '..'\nconst qmarksRE = /^\\?+([^+@!?*[(]*)?$/\nconst qmarksTestNocase = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExt([$0])\n  if (!ext) return noext\n  ext = ext.toLowerCase()\n  return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestNocaseDot = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExtDot([$0])\n  if (!ext) return noext\n  ext = ext.toLowerCase()\n  return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestDot = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExtDot([$0])\n  return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTest = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExt([$0])\n  return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTestNoExt = ([$0]: RegExpMatchArray) => {\n  const len = $0.length\n  return (f: string) => f.length === len && !f.startsWith('.')\n}\nconst qmarksTestNoExtDot = ([$0]: RegExpMatchArray) => {\n  const len = $0.length\n  return (f: string) => f.length === len && f !== '.' && f !== '..'\n}\n\n/* c8 ignore start */\nconst defaultPlatform: Platform = (\n  typeof process === 'object' && process ?\n    (typeof process.env === 'object' &&\n      process.env &&\n      process.env.__MINIMATCH_TESTING_PLATFORM__) ||\n    process.platform\n  : 'posix') as Platform\n\nexport type Sep = '\\\\' | '/'\n\nconst path: { [k: string]: { sep: Sep } } = {\n  win32: { sep: '\\\\' },\n  posix: { sep: '/' },\n}\n/* c8 ignore stop */\n\nexport const sep =\n  defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep\nminimatch.sep = sep\n\nexport const GLOBSTAR = Symbol('globstar **')\nminimatch.GLOBSTAR = GLOBSTAR\n\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n\n// ** when dots are allowed.  Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nconst twoStarDot = '(?:(?!(?:\\\\/|^)(?:\\\\.{1,2})($|\\\\/)).)*?'\n\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nconst twoStarNoDot = '(?:(?!(?:\\\\/|^)\\\\.).)*?'\n\nexport const filter =\n  (pattern: string, options: MinimatchOptions = {}) =>\n  (p: string) =>\n    minimatch(p, pattern, options)\nminimatch.filter = filter\n\nconst ext = (a: MinimatchOptions, b: MinimatchOptions = {}) =>\n  Object.assign({}, a, b)\n\nexport const defaults = (def: MinimatchOptions): typeof minimatch => {\n  if (!def || typeof def !== 'object' || !Object.keys(def).length) {\n    return minimatch\n  }\n\n  const orig = minimatch\n\n  const m = (p: string, pattern: string, options: MinimatchOptions = {}) =>\n    orig(p, pattern, ext(def, options))\n\n  return Object.assign(m, {\n    Minimatch: class Minimatch extends orig.Minimatch {\n      constructor(pattern: string, options: MinimatchOptions = {}) {\n        super(pattern, ext(def, options))\n      }\n      static defaults(options: MinimatchOptions) {\n        return orig.defaults(ext(def, options)).Minimatch\n      }\n    },\n\n    AST: class AST extends orig.AST {\n      /* c8 ignore start */\n      constructor(\n        type: ExtglobType | null,\n        parent?: AST,\n        options: MinimatchOptions = {},\n      ) {\n        super(type, parent, ext(def, options))\n      }\n      /* c8 ignore stop */\n\n      static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n        return orig.AST.fromGlob(pattern, ext(def, options))\n      }\n    },\n\n    unescape: (\n      s: string,\n      options: Pick<\n        MinimatchOptions,\n        'windowsPathsNoEscape' | 'magicalBraces'\n      > = {},\n    ) => orig.unescape(s, ext(def, options)),\n\n    escape: (\n      s: string,\n      options: Pick<\n        MinimatchOptions,\n        'windowsPathsNoEscape' | 'magicalBraces'\n      > = {},\n    ) => orig.escape(s, ext(def, options)),\n\n    filter: (pattern: string, options: MinimatchOptions = {}) =>\n      orig.filter(pattern, ext(def, options)),\n\n    defaults: (options: MinimatchOptions) =>\n      orig.defaults(ext(def, options)),\n\n    makeRe: (pattern: string, options: MinimatchOptions = {}) =>\n      orig.makeRe(pattern, ext(def, options)),\n\n    braceExpand: (pattern: string, options: MinimatchOptions = {}) =>\n      orig.braceExpand(pattern, ext(def, options)),\n\n    match: (\n      list: string[],\n      pattern: string,\n      options: MinimatchOptions = {},\n    ) => orig.match(list, pattern, ext(def, options)),\n\n    sep: orig.sep,\n    GLOBSTAR: GLOBSTAR as typeof GLOBSTAR,\n  })\n}\nminimatch.defaults = defaults\n\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nexport const braceExpand = (\n  pattern: string,\n  options: MinimatchOptions = {},\n) => {\n  assertValidPattern(pattern)\n\n  // Thanks to Yeting Li  for\n  // improving this regexp to avoid a ReDOS vulnerability.\n  if (options.nobrace || !/\\{(?:(?!\\{).)*\\}/.test(pattern)) {\n    // shortcut. no need to expand.\n    return [pattern]\n  }\n\n  return expand(pattern, { max: options.braceExpandMax })\n}\nminimatch.braceExpand = braceExpand\n\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion.  Otherwise, any series\n// of * is equivalent to a single *.  Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\n\nexport const makeRe = (pattern: string, options: MinimatchOptions = {}) =>\n  new Minimatch(pattern, options).makeRe()\nminimatch.makeRe = makeRe\n\nexport const match = (\n  list: string[],\n  pattern: string,\n  options: MinimatchOptions = {},\n) => {\n  const mm = new Minimatch(pattern, options)\n  list = list.filter(f => mm.match(f))\n  if (mm.options.nonull && !list.length) {\n    list.push(pattern)\n  }\n  return list\n}\nminimatch.match = match\n\n// replace stuff like \\* with *\nconst globMagic = /[?*]|[+@!]\\(.*?\\)|\\[|\\]/\nconst regExpEscape = (s: string) =>\n  s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\nexport type MMRegExp = RegExp & {\n  _src?: string\n  _glob?: string\n}\n\nexport type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR\nexport type ParseReturn = ParseReturnFiltered | false\n\nexport class Minimatch {\n  options: MinimatchOptions\n  set: ParseReturnFiltered[][]\n  pattern: string\n\n  windowsPathsNoEscape: boolean\n  nonegate: boolean\n  negate: boolean\n  comment: boolean\n  empty: boolean\n  preserveMultipleSlashes: boolean\n  partial: boolean\n  globSet: string[]\n  globParts: string[][]\n  nocase: boolean\n\n  isWindows: boolean\n  platform: Platform\n  windowsNoMagicRoot: boolean\n  maxGlobstarRecursion: number\n\n  regexp: false | null | MMRegExp\n  constructor(pattern: string, options: MinimatchOptions = {}) {\n    assertValidPattern(pattern)\n\n    options = options || {}\n    this.options = options\n    this.maxGlobstarRecursion = options.maxGlobstarRecursion ?? 200\n    this.pattern = pattern\n    this.platform = options.platform || defaultPlatform\n    this.isWindows = this.platform === 'win32'\n    // avoid the annoying deprecation flag lol\n    const awe = ('allowWindow' + 'sEscape') as keyof MinimatchOptions\n    this.windowsPathsNoEscape =\n      !!options.windowsPathsNoEscape || options[awe] === false\n    if (this.windowsPathsNoEscape) {\n      this.pattern = this.pattern.replace(/\\\\/g, '/')\n    }\n    this.preserveMultipleSlashes = !!options.preserveMultipleSlashes\n    this.regexp = null\n    this.negate = false\n    this.nonegate = !!options.nonegate\n    this.comment = false\n    this.empty = false\n    this.partial = !!options.partial\n    this.nocase = !!this.options.nocase\n    this.windowsNoMagicRoot =\n      options.windowsNoMagicRoot !== undefined ?\n        options.windowsNoMagicRoot\n      : !!(this.isWindows && this.nocase)\n\n    this.globSet = []\n    this.globParts = []\n    this.set = []\n\n    // make the set of regexps etc.\n    this.make()\n  }\n\n  hasMagic(): boolean {\n    if (this.options.magicalBraces && this.set.length > 1) {\n      return true\n    }\n    for (const pattern of this.set) {\n      for (const part of pattern) {\n        if (typeof part !== 'string') return true\n      }\n    }\n    return false\n  }\n\n  debug(..._: unknown[]) {}\n\n  make() {\n    const pattern = this.pattern\n    const options = this.options\n\n    // empty patterns and comments match nothing.\n    if (!options.nocomment && pattern.charAt(0) === '#') {\n      this.comment = true\n      return\n    }\n\n    if (!pattern) {\n      this.empty = true\n      return\n    }\n\n    // step 1: figure out negation, etc.\n    this.parseNegate()\n\n    // step 2: expand braces\n    this.globSet = [...new Set(this.braceExpand())]\n\n    if (options.debug) {\n      //oxlint-disable-next-line no-console\n      this.debug = (...args: unknown[]) => console.error(...args)\n    }\n\n    this.debug(this.pattern, this.globSet)\n\n    // step 3: now we have a set, so turn each one into a series of\n    // path-portion matching patterns.\n    // These will be regexps, except in the case of \"**\", which is\n    // set to the GLOBSTAR object for globstar behavior,\n    // and will not contain any / characters\n    //\n    // First, we preprocess to make the glob pattern sets a bit simpler\n    // and deduped.  There are some perf-killing patterns that can cause\n    // problems with a glob walk, but we can simplify them down a bit.\n    const rawGlobParts = this.globSet.map(s => this.slashSplit(s))\n    this.globParts = this.preprocess(rawGlobParts)\n    this.debug(this.pattern, this.globParts)\n\n    // glob --> regexps\n    let set = this.globParts.map((s, _, __) => {\n      if (this.isWindows && this.windowsNoMagicRoot) {\n        // check if it's a drive or unc path.\n        const isUNC =\n          s[0] === '' &&\n          s[1] === '' &&\n          (s[2] === '?' || !globMagic.test(s[2])) &&\n          !globMagic.test(s[3])\n        const isDrive = /^[a-z]:/i.test(s[0])\n        if (isUNC) {\n          return [\n            ...s.slice(0, 4),\n            ...s.slice(4).map(ss => this.parse(ss)),\n          ]\n        } else if (isDrive) {\n          return [s[0], ...s.slice(1).map(ss => this.parse(ss))]\n        }\n      }\n      return s.map(ss => this.parse(ss))\n    })\n\n    this.debug(this.pattern, set)\n\n    // filter out everything that didn't compile properly.\n    this.set = set.filter(\n      s => s.indexOf(false) === -1,\n    ) as ParseReturnFiltered[][]\n\n    // do not treat the ? in UNC paths as magic\n    if (this.isWindows) {\n      for (let i = 0; i < this.set.length; i++) {\n        const p = this.set[i]\n        if (\n          p[0] === '' &&\n          p[1] === '' &&\n          this.globParts[i][2] === '?' &&\n          typeof p[3] === 'string' &&\n          /^[a-z]:$/i.test(p[3])\n        ) {\n          p[2] = '?'\n        }\n      }\n    }\n\n    this.debug(this.pattern, this.set)\n  }\n\n  // various transforms to equivalent pattern sets that are\n  // faster to process in a filesystem walk.  The goal is to\n  // eliminate what we can, and push all ** patterns as far\n  // to the right as possible, even if it increases the number\n  // of patterns that we have to process.\n  preprocess(globParts: string[][]) {\n    // if we're not in globstar mode, then turn ** into *\n    if (this.options.noglobstar) {\n      for (const partset of globParts) {\n        for (let j = 0; j < partset.length; j++) {\n          if (partset[j] === '**') {\n            partset[j] = '*'\n          }\n        }\n      }\n    }\n\n    const { optimizationLevel = 1 } = this.options\n\n    if (optimizationLevel >= 2) {\n      // aggressive optimization for the purpose of fs walking\n      globParts = this.firstPhasePreProcess(globParts)\n      globParts = this.secondPhasePreProcess(globParts)\n    } else if (optimizationLevel >= 1) {\n      // just basic optimizations to remove some .. parts\n      globParts = this.levelOneOptimize(globParts)\n    } else {\n      // just collapse multiple ** portions into one\n      globParts = this.adjascentGlobstarOptimize(globParts)\n    }\n\n    return globParts\n  }\n\n  // just get rid of adjascent ** portions\n  adjascentGlobstarOptimize(globParts: string[][]) {\n    return globParts.map(parts => {\n      let gs: number = -1\n      while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n        let i = gs\n        while (parts[i + 1] === '**') {\n          i++\n        }\n        if (i !== gs) {\n          parts.splice(gs, i - gs)\n        }\n      }\n      return parts\n    })\n  }\n\n  // get rid of adjascent ** and resolve .. portions\n  levelOneOptimize(globParts: string[][]) {\n    return globParts.map(parts => {\n      parts = parts.reduce((set: string[], part) => {\n        const prev = set[set.length - 1]\n        if (part === '**' && prev === '**') {\n          return set\n        }\n        if (part === '..') {\n          if (prev && prev !== '..' && prev !== '.' && prev !== '**') {\n            set.pop()\n            return set\n          }\n        }\n        set.push(part)\n        return set\n      }, [])\n      return parts.length === 0 ? [''] : parts\n    })\n  }\n\n  levelTwoFileOptimize(parts: string | string[]) {\n    if (!Array.isArray(parts)) {\n      parts = this.slashSplit(parts)\n    }\n    let didSomething: boolean = false\n\n    do {\n      didSomething = false\n      // 
      // -> 
      /\n      if (!this.preserveMultipleSlashes) {\n        for (let i = 1; i < parts.length - 1; i++) {\n          const p = parts[i]\n          // don't squeeze out UNC patterns\n          if (i === 1 && p === '' && parts[0] === '') continue\n          if (p === '.' || p === '') {\n            didSomething = true\n            parts.splice(i, 1)\n            i--\n          }\n        }\n        if (\n          parts[0] === '.' &&\n          parts.length === 2 &&\n          (parts[1] === '.' || parts[1] === '')\n        ) {\n          didSomething = true\n          parts.pop()\n        }\n      }\n\n      // 
      /

      /../ ->

      /\n      let dd: number = 0\n      while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n        const p = parts[dd - 1]\n        if (\n          p &&\n          p !== '.' &&\n          p !== '..' &&\n          p !== '**' &&\n          !(this.isWindows && /^[a-z]:$/i.test(p))\n        ) {\n          didSomething = true\n          parts.splice(dd - 1, 2)\n          dd -= 2\n        }\n      }\n    } while (didSomething)\n    return parts.length === 0 ? [''] : parts\n  }\n\n  // First phase: single-pattern processing\n  // 
       is 1 or more portions\n  //  is 1 or more portions\n  // 

      is any portion other than ., .., '', or **\n // is . or ''\n //\n // **/.. is *brutal* for filesystem walking performance, because\n // it effectively resets the recursive walk each time it occurs,\n // and ** cannot be reduced out by a .. pattern part like a regexp\n // or most strings (other than .., ., and '') can be.\n //\n //

      /**/../

      /

      / -> {

      /../

      /

      /,

      /**/

      /

      /}\n //

      // -> 
      /\n  // 
      /

      /../ ->

      /\n  // **/**/ -> **/\n  //\n  // **/*/ -> */**/ <== not valid because ** doesn't follow\n  // this WOULD be allowed if ** did follow symlinks, or * didn't\n  firstPhasePreProcess(globParts: string[][]) {\n    let didSomething = false\n    do {\n      didSomething = false\n      // 
      /**/../

      /

      / -> {

      /../

      /

      /,

      /**/

      /

      /}\n for (let parts of globParts) {\n let gs: number = -1\n while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n let gss: number = gs\n while (parts[gss + 1] === '**') {\n //

      /**/**/ -> 
      /**/\n            gss++\n          }\n          // eg, if gs is 2 and gss is 4, that means we have 3 **\n          // parts, and can remove 2 of them.\n          if (gss > gs) {\n            parts.splice(gs + 1, gss - gs)\n          }\n\n          let next = parts[gs + 1]\n          const p = parts[gs + 2]\n          const p2 = parts[gs + 3]\n          if (next !== '..') continue\n          if (\n            !p ||\n            p === '.' ||\n            p === '..' ||\n            !p2 ||\n            p2 === '.' ||\n            p2 === '..'\n          ) {\n            continue\n          }\n          didSomething = true\n          // edit parts in place, and push the new one\n          parts.splice(gs, 1)\n          const other = parts.slice(0)\n          other[gs] = '**'\n          globParts.push(other)\n          gs--\n        }\n\n        // 
      // -> 
      /\n        if (!this.preserveMultipleSlashes) {\n          for (let i = 1; i < parts.length - 1; i++) {\n            const p = parts[i]\n            // don't squeeze out UNC patterns\n            if (i === 1 && p === '' && parts[0] === '') continue\n            if (p === '.' || p === '') {\n              didSomething = true\n              parts.splice(i, 1)\n              i--\n            }\n          }\n          if (\n            parts[0] === '.' &&\n            parts.length === 2 &&\n            (parts[1] === '.' || parts[1] === '')\n          ) {\n            didSomething = true\n            parts.pop()\n          }\n        }\n\n        // 
      /

      /../ ->

      /\n        let dd: number = 0\n        while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n          const p = parts[dd - 1]\n          if (p && p !== '.' && p !== '..' && p !== '**') {\n            didSomething = true\n            const needDot = dd === 1 && parts[dd + 1] === '**'\n            const splin = needDot ? ['.'] : []\n            parts.splice(dd - 1, 2, ...splin)\n            if (parts.length === 0) parts.push('')\n            dd -= 2\n          }\n        }\n      }\n    } while (didSomething)\n\n    return globParts\n  }\n\n  // second phase: multi-pattern dedupes\n  // {
      /*/,
      /

      /} ->

      /*/\n  // {
      /,
      /} -> 
      /\n  // {
      /**/,
      /} -> 
      /**/\n  //\n  // {
      /**/,
      /**/

      /} ->

      /**/\n  // ^-- not valid because ** doens't follow symlinks\n  secondPhasePreProcess(globParts: string[][]): string[][] {\n    for (let i = 0; i < globParts.length - 1; i++) {\n      for (let j = i + 1; j < globParts.length; j++) {\n        const matched = this.partsMatch(\n          globParts[i],\n          globParts[j],\n          !this.preserveMultipleSlashes,\n        )\n        if (matched) {\n          globParts[i] = []\n          globParts[j] = matched\n          break\n        }\n      }\n    }\n    return globParts.filter(gs => gs.length)\n  }\n\n  partsMatch(\n    a: string[],\n    b: string[],\n    emptyGSMatch: boolean = false,\n  ): false | string[] {\n    let ai = 0\n    let bi = 0\n    let result: string[] = []\n    let which: string = ''\n    while (ai < a.length && bi < b.length) {\n      if (a[ai] === b[bi]) {\n        result.push(which === 'b' ? b[bi] : a[ai])\n        ai++\n        bi++\n      } else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {\n        result.push(a[ai])\n        ai++\n      } else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {\n        result.push(b[bi])\n        bi++\n      } else if (\n        a[ai] === '*' &&\n        b[bi] &&\n        (this.options.dot || !b[bi].startsWith('.')) &&\n        b[bi] !== '**'\n      ) {\n        if (which === 'b') return false\n        which = 'a'\n        result.push(a[ai])\n        ai++\n        bi++\n      } else if (\n        b[bi] === '*' &&\n        a[ai] &&\n        (this.options.dot || !a[ai].startsWith('.')) &&\n        a[ai] !== '**'\n      ) {\n        if (which === 'a') return false\n        which = 'b'\n        result.push(b[bi])\n        ai++\n        bi++\n      } else {\n        return false\n      }\n    }\n    // if we fall out of the loop, it means they two are identical\n    // as long as their lengths match\n    return a.length === b.length && result\n  }\n\n  parseNegate() {\n    if (this.nonegate) return\n\n    const pattern = this.pattern\n    let negate = false\n    let negateOffset = 0\n\n    for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {\n      negate = !negate\n      negateOffset++\n    }\n\n    if (negateOffset) this.pattern = pattern.slice(negateOffset)\n    this.negate = negate\n  }\n\n  // set partial to true to test if, for example,\n  // \"/a/b\" matches the start of \"/*/b/*/d\"\n  // Partial means, if you run out of file before you run\n  // out of pattern, then that's fine, as long as all\n  // the parts match.\n  matchOne(\n    file: string[],\n    pattern: ParseReturn[],\n    partial: boolean = false,\n  ) {\n    let fileStartIndex = 0\n    let patternStartIndex = 0\n\n    // UNC paths like //?/X:/... can match X:/... and vice versa\n    // Drive letters in absolute drive or unc paths are always compared\n    // case-insensitively.\n    if (this.isWindows) {\n      const fileDrive =\n        typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0])\n      const fileUNC =\n        !fileDrive &&\n        file[0] === '' &&\n        file[1] === '' &&\n        file[2] === '?' &&\n        /^[a-z]:$/i.test(file[3])\n\n      const patternDrive =\n        typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0])\n      const patternUNC =\n        !patternDrive &&\n        pattern[0] === '' &&\n        pattern[1] === '' &&\n        pattern[2] === '?' &&\n        typeof pattern[3] === 'string' &&\n        /^[a-z]:$/i.test(pattern[3])\n\n      const fdi =\n        fileUNC ? 3\n        : fileDrive ? 0\n        : undefined\n      const pdi =\n        patternUNC ? 3\n        : patternDrive ? 0\n        : undefined\n      if (typeof fdi === 'number' && typeof pdi === 'number') {\n        const [fd, pd]: [string, string] = [\n          file[fdi],\n          pattern[pdi] as string,\n        ]\n        // start matching at the drive letter index of each\n        if (fd.toLowerCase() === pd.toLowerCase()) {\n          pattern[pdi] = fd\n          patternStartIndex = pdi\n          fileStartIndex = fdi\n        }\n      }\n    }\n\n    // resolve and reduce . and .. portions in the file as well.\n    // don't need to do the second phase, because it's only one string[]\n    const { optimizationLevel = 1 } = this.options\n    if (optimizationLevel >= 2) {\n      file = this.levelTwoFileOptimize(file)\n    }\n\n    if (pattern.includes(GLOBSTAR)) {\n      return this.#matchGlobstar(\n        file,\n        pattern,\n        partial,\n        fileStartIndex,\n        patternStartIndex,\n      )\n    }\n\n    return this.#matchOne(\n      file,\n      pattern,\n      partial,\n      fileStartIndex,\n      patternStartIndex,\n    )\n  }\n\n  #matchGlobstar(\n    file: string[],\n    pattern: ParseReturn[],\n    partial: boolean,\n    fileIndex: number,\n    patternIndex: number,\n  ) {\n    // split the pattern into head, tail, and middle of ** delimited parts\n    const firstgs = pattern.indexOf(GLOBSTAR, patternIndex)\n    const lastgs = pattern.lastIndexOf(GLOBSTAR)\n\n    // split the pattern up into globstar-delimited sections\n    // the tail has to be at the end, and the others just have\n    // to be found in order from the head.\n    const [head, body, tail] =\n      partial ?\n        [\n          pattern.slice(patternIndex, firstgs),\n          pattern.slice(firstgs + 1),\n          [],\n        ]\n      : [\n          pattern.slice(patternIndex, firstgs),\n          pattern.slice(firstgs + 1, lastgs),\n          pattern.slice(lastgs + 1),\n        ]\n\n    // check the head, from the current file/pattern index.\n    if (head.length) {\n      const fileHead = file.slice(fileIndex, fileIndex + head.length)\n      if (!this.#matchOne(fileHead, head, partial, 0, 0)) {\n        return false\n      }\n      fileIndex += head.length\n      patternIndex += head.length\n    }\n    // now we know the head matches!\n\n    // if the last portion is not empty, it MUST match the end\n    // check the tail\n    let fileTailMatch: number = 0\n    if (tail.length) {\n      // if head + tail > file, then we cannot possibly match\n      if (tail.length + fileIndex > file.length) return false\n\n      // try to match the tail\n      let tailStart = file.length - tail.length\n      if (this.#matchOne(file, tail, partial, tailStart, 0)) {\n        fileTailMatch = tail.length\n      } else {\n        // affordance for stuff like a/**/* matching a/b/\n        // if the last file portion is '', and there's more to the pattern\n        // then try without the '' bit.\n        if (\n          file[file.length - 1] !== '' ||\n          fileIndex + tail.length === file.length\n        ) {\n          return false\n        }\n        tailStart--\n        if (!this.#matchOne(file, tail, partial, tailStart, 0)) {\n          return false\n        }\n        fileTailMatch = tail.length + 1\n      }\n    }\n\n    // now we know the tail matches!\n\n    // the middle is zero or more portions wrapped in **, possibly\n    // containing more ** sections.\n    // so a/**/b/**/c/**/d has become **/b/**/c/**\n    // if it's empty, it means a/**/b, just verify we have no bad dots\n    // if there's no tail, so it ends on /**, then we must have *something*\n    // after the head, or it's not a matc\n    if (!body.length) {\n      let sawSome = !!fileTailMatch\n      for (let i = fileIndex; i < file.length - fileTailMatch; i++) {\n        const f = String(file[i])\n        sawSome = true\n        if (\n          f === '.' ||\n          f === '..' ||\n          (!this.options.dot && f.startsWith('.'))\n        ) {\n          return false\n        }\n      }\n      // in partial mode, we just need to get past all file parts\n      return partial || sawSome\n    }\n\n    // now we know that there's one or more body sections, which can\n    // be matched anywhere from the 0 index (because the head was pruned)\n    // through to the length-fileTailMatch index.\n    // split the body up into sections, and note the minimum index it can\n    // be found at (start with the length of all previous segments)\n    // [section, before, after]\n    const bodySegments: [ParseReturn[], number][] = [[[], 0]]\n    let currentBody: [ParseReturn[], number] = bodySegments[0]\n    let nonGsParts = 0\n    const nonGsPartsSums: number[] = [0]\n    for (const b of body) {\n      if (b === GLOBSTAR) {\n        nonGsPartsSums.push(nonGsParts)\n        currentBody = [[], 0]\n        bodySegments.push(currentBody)\n      } else {\n        currentBody[0].push(b)\n        nonGsParts++\n      }\n    }\n    let i = bodySegments.length - 1\n    const fileLength = file.length - fileTailMatch\n    for (const b of bodySegments) {\n      b[1] = fileLength - ((nonGsPartsSums[i--] as number) + b[0].length)\n    }\n\n    return !!this.#matchGlobStarBodySections(\n      file,\n      bodySegments,\n      fileIndex,\n      0,\n      partial,\n      0,\n      !!fileTailMatch,\n    )\n  }\n\n  // return false for \"nope, not matching\"\n  // return null for \"not matching, cannot keep trying\"\n  #matchGlobStarBodySections(\n    file: string[],\n    // pattern section, last possible position for it\n    bodySegments: [ParseReturn[], number][],\n    fileIndex: number,\n    bodyIndex: number,\n    partial: boolean,\n    globStarDepth: number,\n    sawTail: boolean,\n  ): boolean | null {\n    // take the first body segment, and walk from fileIndex to its \"after\"\n    // value at the end\n    // If it doesn't match at that position, we increment, until we hit\n    // that final possible position, and give up.\n    // If it does match, then advance and try to rest.\n    // If any of them fail we keep walking forward.\n    // this is still a bit recursively painful, but it's more constrained\n    // than previous implementations, because we never test something that\n    // can't possibly be a valid matching condition.\n    const bs = bodySegments[bodyIndex]\n    if (!bs) {\n      // just make sure that there's no bad dots\n      for (let i = fileIndex; i < file.length; i++) {\n        sawTail = true\n        const f = file[i]\n        if (\n          f === '.' ||\n          f === '..' ||\n          (!this.options.dot && f.startsWith('.'))\n        ) {\n          return false\n        }\n      }\n      return sawTail\n    }\n\n    // have a non-globstar body section to test\n    const [body, after] = bs\n    while (fileIndex <= after) {\n      const m = this.#matchOne(\n        file.slice(0, fileIndex + body.length),\n        body,\n        partial,\n        fileIndex,\n        0,\n      )\n      // if limit exceeded, no match. intentional false negative,\n      // acceptable break in correctness for security.\n      if (m && globStarDepth < this.maxGlobstarRecursion) {\n        // match! see if the rest match. if so, we're done!\n        const sub = this.#matchGlobStarBodySections(\n          file,\n          bodySegments,\n          fileIndex + body.length,\n          bodyIndex + 1,\n          partial,\n          globStarDepth + 1,\n          sawTail,\n        )\n        if (sub !== false) {\n          return sub\n        }\n      }\n      const f = file[fileIndex]\n      if (\n        f === '.' ||\n        f === '..' ||\n        (!this.options.dot && f.startsWith('.'))\n      ) {\n        return false\n      }\n\n      fileIndex++\n    }\n    // walked off. no point continuing\n    return partial || null\n  }\n\n  #matchOne(\n    file: string[],\n    pattern: ParseReturn[],\n    partial: boolean,\n    fileIndex: number,\n    patternIndex: number,\n  ) {\n    let fi: number\n    let pi: number\n    let pl: number\n    let fl: number\n    for (\n      fi = fileIndex,\n        pi = patternIndex,\n        fl = file.length,\n        pl = pattern.length;\n      fi < fl && pi < pl;\n      fi++, pi++\n    ) {\n      this.debug('matchOne loop')\n      let p = pattern[pi]\n      let f = file[fi]\n\n      this.debug(pattern, p, f)\n\n      // should be impossible.\n      // some invalid regexp stuff in the set.\n      /* c8 ignore start */\n      if (p === false || p === GLOBSTAR) {\n        return false\n      }\n      /* c8 ignore stop */\n\n      // something other than **\n      // non-magic patterns just have to match exactly\n      // patterns with magic have been turned into regexps.\n      let hit: boolean\n      if (typeof p === 'string') {\n        hit = f === p\n        this.debug('string match', p, f, hit)\n      } else {\n        hit = p.test(f)\n        this.debug('pattern match', p, f, hit)\n      }\n\n      if (!hit) return false\n    }\n\n    // Note: ending in / means that we'll get a final \"\"\n    // at the end of the pattern.  This can only match a\n    // corresponding \"\" at the end of the file.\n    // If the file ends in /, then it can only match a\n    // a pattern that ends in /, unless the pattern just\n    // doesn't have any more for it. But, a/b/ should *not*\n    // match \"a/b/*\", even though \"\" matches against the\n    // [^/]*? pattern, except in partial mode, where it might\n    // simply not be reached yet.\n    // However, a/b/ should still satisfy a/*\n\n    // now either we fell off the end of the pattern, or we're done.\n    if (fi === fl && pi === pl) {\n      // ran out of pattern and filename at the same time.\n      // an exact hit!\n      return true\n    } else if (fi === fl) {\n      // ran out of file, but still had pattern left.\n      // this is ok if we're doing the match as part of\n      // a glob fs traversal.\n      return partial\n    } else if (pi === pl) {\n      // ran out of pattern, still have file left.\n      // this is only acceptable if we're on the very last\n      // empty segment of a file with a trailing slash.\n      // a/* should match a/b/\n      return fi === fl - 1 && file[fi] === ''\n\n      /* c8 ignore start */\n    } else {\n      // should be unreachable.\n      throw new Error('wtf?')\n    }\n    /* c8 ignore stop */\n  }\n\n  braceExpand() {\n    return braceExpand(this.pattern, this.options)\n  }\n\n  parse(pattern: string): ParseReturn {\n    assertValidPattern(pattern)\n\n    const options = this.options\n\n    // shortcuts\n    if (pattern === '**') return GLOBSTAR\n    if (pattern === '') return ''\n\n    // far and away, the most common glob pattern parts are\n    // *, *.*, and *.  Add a fast check method for those.\n    let m: RegExpMatchArray | null\n    let fastTest: null | ((f: string) => boolean) = null\n    if ((m = pattern.match(starRE))) {\n      fastTest = options.dot ? starTestDot : starTest\n    } else if ((m = pattern.match(starDotExtRE))) {\n      fastTest = (\n        options.nocase ?\n          options.dot ?\n            starDotExtTestNocaseDot\n          : starDotExtTestNocase\n        : options.dot ? starDotExtTestDot\n        : starDotExtTest)(m[1])\n    } else if ((m = pattern.match(qmarksRE))) {\n      fastTest = (\n        options.nocase ?\n          options.dot ?\n            qmarksTestNocaseDot\n          : qmarksTestNocase\n        : options.dot ? qmarksTestDot\n        : qmarksTest)(m)\n    } else if ((m = pattern.match(starDotStarRE))) {\n      fastTest = options.dot ? starDotStarTestDot : starDotStarTest\n    } else if ((m = pattern.match(dotStarRE))) {\n      fastTest = dotStarTest\n    }\n\n    const re = AST.fromGlob(pattern, this.options).toMMPattern()\n    if (fastTest && typeof re === 'object') {\n      // Avoids overriding in frozen environments\n      Reflect.defineProperty(re, 'test', { value: fastTest })\n    }\n    return re\n  }\n\n  makeRe() {\n    if (this.regexp || this.regexp === false) return this.regexp\n\n    // at this point, this.set is a 2d array of partial\n    // pattern strings, or \"**\".\n    //\n    // It's better to use .match().  This function shouldn't\n    // be used, really, but it's pretty convenient sometimes,\n    // when you just want to work with a regex.\n    const set = this.set\n\n    if (!set.length) {\n      this.regexp = false\n      return this.regexp\n    }\n    const options = this.options\n\n    const twoStar =\n      options.noglobstar ? star\n      : options.dot ? twoStarDot\n      : twoStarNoDot\n    const flags = new Set(options.nocase ? ['i'] : [])\n\n    // regexpify non-globstar patterns\n    // if ** is only item, then we just do one twoStar\n    // if ** is first, and there are more, prepend (\\/|twoStar\\/)? to next\n    // if ** is last, append (\\/twoStar|) to previous\n    // if ** is in the middle, append (\\/|\\/twoStar\\/) to previous\n    // then filter out GLOBSTAR symbols\n    let re = set\n      .map(pattern => {\n        const pp: (string | typeof GLOBSTAR)[] = pattern.map(p => {\n          if (p instanceof RegExp) {\n            for (const f of p.flags.split('')) flags.add(f)\n          }\n          return (\n            typeof p === 'string' ? regExpEscape(p)\n            : p === GLOBSTAR ? GLOBSTAR\n            : p._src\n          )\n        }) as (string | typeof GLOBSTAR)[]\n        pp.forEach((p, i) => {\n          const next = pp[i + 1]\n          const prev = pp[i - 1]\n          if (p !== GLOBSTAR || prev === GLOBSTAR) {\n            return\n          }\n          if (prev === undefined) {\n            if (next !== undefined && next !== GLOBSTAR) {\n              pp[i + 1] = '(?:\\\\/|' + twoStar + '\\\\/)?' + next\n            } else {\n              pp[i] = twoStar\n            }\n          } else if (next === undefined) {\n            pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + ')?'\n          } else if (next !== GLOBSTAR) {\n            pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + '\\\\/)' + next\n            pp[i + 1] = GLOBSTAR\n          }\n        })\n        const filtered = pp.filter(p => p !== GLOBSTAR)\n\n        // For partial matches, we need to make the pattern match\n        // any prefix of the full path. We do this by generating\n        // alternative patterns that match progressively longer prefixes.\n        if (this.partial && filtered.length >= 1) {\n          const prefixes: string[] = []\n          for (let i = 1; i <= filtered.length; i++) {\n            prefixes.push(filtered.slice(0, i).join('/'))\n          }\n          return '(?:' + prefixes.join('|') + ')'\n        }\n\n        return filtered.join('/')\n      })\n      .join('|')\n\n    // need to wrap in parens if we had more than one thing with |,\n    // otherwise only the first will be anchored to ^ and the last to $\n    const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', '']\n    // must match entire pattern\n    // ending in a * or ** will make it less strict.\n    re = '^' + open + re + close + '$'\n\n    // In partial mode, '/' should always match as it's a valid prefix for any pattern\n    if (this.partial) {\n      re = '^(?:\\\\/|' + open + re.slice(1, -1) + close + ')$'\n    }\n\n    // can match anything, as long as it's not this.\n    if (this.negate) re = '^(?!' + re + ').+$'\n\n    try {\n      this.regexp = new RegExp(re, [...flags].join(''))\n      /* c8 ignore start */\n    } catch {\n      // should be impossible\n      this.regexp = false\n    }\n    /* c8 ignore stop */\n    return this.regexp\n  }\n\n  slashSplit(p: string) {\n    // if p starts with // on windows, we preserve that\n    // so that UNC paths aren't broken.  Otherwise, any number of\n    // / characters are coalesced into one, unless\n    // preserveMultipleSlashes is set to true.\n    if (this.preserveMultipleSlashes) {\n      return p.split('/')\n    } else if (this.isWindows && /^\\/\\/[^/]+/.test(p)) {\n      // add an extra '' for the one we lose\n      return ['', ...p.split(/\\/+/)]\n    } else {\n      return p.split(/\\/+/)\n    }\n  }\n\n  match(f: string, partial = this.partial) {\n    this.debug('match', f, this.pattern)\n    // short-circuit in the case of busted things.\n    // comments, etc.\n    if (this.comment) {\n      return false\n    }\n    if (this.empty) {\n      return f === ''\n    }\n\n    if (f === '/' && partial) {\n      return true\n    }\n\n    const options = this.options\n\n    // windows: need to use /, not \\\n    if (this.isWindows) {\n      f = f.split('\\\\').join('/')\n    }\n\n    // treat the test path as a set of pathparts.\n    const ff = this.slashSplit(f)\n    this.debug(this.pattern, 'split', ff)\n\n    // just ONE of the pattern sets in this.set needs to match\n    // in order for it to be valid.  If negating, then just one\n    // match means that we have failed.\n    // Either way, return on the first hit.\n\n    const set = this.set\n    this.debug(this.pattern, 'set', set)\n\n    // Find the basename of the path by looking for the last non-empty segment\n    let filename: string = ff[ff.length - 1]\n    if (!filename) {\n      for (let i = ff.length - 2; !filename && i >= 0; i--) {\n        filename = ff[i]\n      }\n    }\n\n    for (const pattern of set) {\n      let file = ff\n      if (options.matchBase && pattern.length === 1) {\n        file = [filename]\n      }\n      const hit = this.matchOne(file, pattern, partial)\n      if (hit) {\n        if (options.flipNegate) {\n          return true\n        }\n        return !this.negate\n      }\n    }\n\n    // didn't get any hits.  this is success if it's a negative\n    // pattern, failure otherwise.\n    if (options.flipNegate) {\n      return false\n    }\n    return this.negate\n  }\n\n  static defaults(def: MinimatchOptions) {\n    return minimatch.defaults(def).Minimatch\n  }\n}\n/* c8 ignore start */\nexport { AST } from './ast.js'\nexport { escape } from './escape.js'\nexport { unescape } from './unescape.js'\n/* c8 ignore stop */\nminimatch.AST = AST\nminimatch.Minimatch = Minimatch\nminimatch.escape = escape\nminimatch.unescape = unescape\n"]}
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/esm/package.json b/node_modules/minimatch/dist/esm/package.json
      new file mode 100644
      index 00000000..3dbc1ca5
      --- /dev/null
      +++ b/node_modules/minimatch/dist/esm/package.json
      @@ -0,0 +1,3 @@
      +{
      +  "type": "module"
      +}
      diff --git a/node_modules/minimatch/dist/esm/unescape.d.ts b/node_modules/minimatch/dist/esm/unescape.d.ts
      new file mode 100644
      index 00000000..c4a14473
      --- /dev/null
      +++ b/node_modules/minimatch/dist/esm/unescape.d.ts
      @@ -0,0 +1,22 @@
      +import type { MinimatchOptions } from './index.js';
      +/**
      + * Un-escape a string that has been escaped with {@link escape}.
      + *
      + * If the {@link MinimatchOptions.windowsPathsNoEscape} option is used, then
      + * square-bracket escapes are removed, but not backslash escapes.
      + *
      + * For example, it will turn the string `'[*]'` into `*`, but it will not
      + * turn `'\\*'` into `'*'`, because `\` is a path separator in
      + * `windowsPathsNoEscape` mode.
      + *
      + * When `windowsPathsNoEscape` is not set, then both square-bracket escapes and
      + * backslash escapes are removed.
      + *
      + * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped
      + * or unescaped.
      + *
      + * When `magicalBraces` is not set, escapes of braces (`{` and `}`) will not be
      + * unescaped.
      + */
      +export declare const unescape: (s: string, { windowsPathsNoEscape, magicalBraces, }?: Pick) => string;
      +//# sourceMappingURL=unescape.d.ts.map
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/esm/unescape.d.ts.map b/node_modules/minimatch/dist/esm/unescape.d.ts.map
      new file mode 100644
      index 00000000..09d6eab4
      --- /dev/null
      +++ b/node_modules/minimatch/dist/esm/unescape.d.ts.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"unescape.d.ts","sourceRoot":"","sources":["../../src/unescape.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD;;;;;;;;;;;;;;;;;;GAkBG;AAEH,eAAO,MAAM,QAAQ,GACnB,GAAG,MAAM,EACT,2CAGG,IAAI,CAAC,gBAAgB,EAAE,sBAAsB,GAAG,eAAe,CAAM,WAczE,CAAA"}
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/esm/unescape.js b/node_modules/minimatch/dist/esm/unescape.js
      new file mode 100644
      index 00000000..19ce86e7
      --- /dev/null
      +++ b/node_modules/minimatch/dist/esm/unescape.js
      @@ -0,0 +1,34 @@
      +/**
      + * Un-escape a string that has been escaped with {@link escape}.
      + *
      + * If the {@link MinimatchOptions.windowsPathsNoEscape} option is used, then
      + * square-bracket escapes are removed, but not backslash escapes.
      + *
      + * For example, it will turn the string `'[*]'` into `*`, but it will not
      + * turn `'\\*'` into `'*'`, because `\` is a path separator in
      + * `windowsPathsNoEscape` mode.
      + *
      + * When `windowsPathsNoEscape` is not set, then both square-bracket escapes and
      + * backslash escapes are removed.
      + *
      + * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped
      + * or unescaped.
      + *
      + * When `magicalBraces` is not set, escapes of braces (`{` and `}`) will not be
      + * unescaped.
      + */
      +export const unescape = (s, { windowsPathsNoEscape = false, magicalBraces = true, } = {}) => {
      +    if (magicalBraces) {
      +        return windowsPathsNoEscape ?
      +            s.replace(/\[([^/\\])\]/g, '$1')
      +            : s
      +                .replace(/((?!\\).|^)\[([^/\\])\]/g, '$1$2')
      +                .replace(/\\([^/])/g, '$1');
      +    }
      +    return windowsPathsNoEscape ?
      +        s.replace(/\[([^/\\{}])\]/g, '$1')
      +        : s
      +            .replace(/((?!\\).|^)\[([^/\\{}])\]/g, '$1$2')
      +            .replace(/\\([^/{}])/g, '$1');
      +};
      +//# sourceMappingURL=unescape.js.map
      \ No newline at end of file
      diff --git a/node_modules/minimatch/dist/esm/unescape.js.map b/node_modules/minimatch/dist/esm/unescape.js.map
      new file mode 100644
      index 00000000..6d507391
      --- /dev/null
      +++ b/node_modules/minimatch/dist/esm/unescape.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"unescape.js","sourceRoot":"","sources":["../../src/unescape.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,EAC5B,aAAa,GAAG,IAAI,MACgD,EAAE,EACxE,EAAE;IACF,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,oBAAoB,CAAC,CAAC;YACzB,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC;YAClC,CAAC,CAAC,CAAC;iBACE,OAAO,CAAC,0BAA0B,EAAE,MAAM,CAAC;iBAC3C,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;IACnC,CAAC;IACD,OAAO,oBAAoB,CAAC,CAAC;QACzB,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC;QACpC,CAAC,CAAC,CAAC;aACE,OAAO,CAAC,4BAA4B,EAAE,MAAM,CAAC;aAC7C,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,CAAA;AACrC,CAAC,CAAA","sourcesContent":["import type { MinimatchOptions } from './index.js'\n\n/**\n * Un-escape a string that has been escaped with {@link escape}.\n *\n * If the {@link MinimatchOptions.windowsPathsNoEscape} option is used, then\n * square-bracket escapes are removed, but not backslash escapes.\n *\n * For example, it will turn the string `'[*]'` into `*`, but it will not\n * turn `'\\\\*'` into `'*'`, because `\\` is a path separator in\n * `windowsPathsNoEscape` mode.\n *\n * When `windowsPathsNoEscape` is not set, then both square-bracket escapes and\n * backslash escapes are removed.\n *\n * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped\n * or unescaped.\n *\n * When `magicalBraces` is not set, escapes of braces (`{` and `}`) will not be\n * unescaped.\n */\n\nexport const unescape = (\n  s: string,\n  {\n    windowsPathsNoEscape = false,\n    magicalBraces = true,\n  }: Pick = {},\n) => {\n  if (magicalBraces) {\n    return windowsPathsNoEscape ?\n        s.replace(/\\[([^/\\\\])\\]/g, '$1')\n      : s\n          .replace(/((?!\\\\).|^)\\[([^/\\\\])\\]/g, '$1$2')\n          .replace(/\\\\([^/])/g, '$1')\n  }\n  return windowsPathsNoEscape ?\n      s.replace(/\\[([^/\\\\{}])\\]/g, '$1')\n    : s\n        .replace(/((?!\\\\).|^)\\[([^/\\\\{}])\\]/g, '$1$2')\n        .replace(/\\\\([^/{}])/g, '$1')\n}\n"]}
      \ No newline at end of file
      diff --git a/node_modules/minimatch/package.json b/node_modules/minimatch/package.json
      new file mode 100644
      index 00000000..211875c6
      --- /dev/null
      +++ b/node_modules/minimatch/package.json
      @@ -0,0 +1,73 @@
      +{
      +  "author": "Isaac Z. Schlueter  (http://blog.izs.me)",
      +  "name": "minimatch",
      +  "description": "a glob matcher in javascript",
      +  "version": "10.2.5",
      +  "repository": {
      +    "type": "git",
      +    "url": "git@github.com:isaacs/minimatch"
      +  },
      +  "main": "./dist/commonjs/index.js",
      +  "types": "./dist/commonjs/index.d.ts",
      +  "exports": {
      +    "./package.json": "./package.json",
      +    ".": {
      +      "import": {
      +        "types": "./dist/esm/index.d.ts",
      +        "default": "./dist/esm/index.js"
      +      },
      +      "require": {
      +        "types": "./dist/commonjs/index.d.ts",
      +        "default": "./dist/commonjs/index.js"
      +      }
      +    }
      +  },
      +  "files": [
      +    "dist"
      +  ],
      +  "scripts": {
      +    "preversion": "npm test",
      +    "postversion": "npm publish",
      +    "prepublishOnly": "git push origin --follow-tags",
      +    "prepare": "tshy",
      +    "pretest": "npm run prepare",
      +    "presnap": "npm run prepare",
      +    "test": "tap",
      +    "snap": "tap",
      +    "format": "prettier --write .",
      +    "benchmark": "node benchmark/index.js",
      +    "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts",
      +    "lint": "oxlint --fix src test",
      +    "postsnap": "npm run lint",
      +    "postlint": "npm run format"
      +  },
      +  "engines": {
      +    "node": "18 || 20 || >=22"
      +  },
      +  "devDependencies": {
      +    "@types/node": "^25.5.0",
      +    "mkdirp": "^3.0.1",
      +    "oxlint": "^1.57.0",
      +    "oxlint-tsgolint": "^0.18.1",
      +    "prettier": "^3.8.1",
      +    "tap": "^21.6.2",
      +    "tshy": "^4.0.0",
      +    "typedoc": "^0.28.18"
      +  },
      +  "funding": {
      +    "url": "https://github.com/sponsors/isaacs"
      +  },
      +  "license": "BlueOak-1.0.0",
      +  "tshy": {
      +    "exports": {
      +      "./package.json": "./package.json",
      +      ".": "./src/index.ts"
      +    },
      +    "selfLink": false
      +  },
      +  "type": "module",
      +  "module": "./dist/esm/index.js",
      +  "dependencies": {
      +    "brace-expansion": "^5.0.5"
      +  }
      +}
      diff --git a/node_modules/minipass/LICENSE.md b/node_modules/minipass/LICENSE.md
      new file mode 100644
      index 00000000..c5402b95
      --- /dev/null
      +++ b/node_modules/minipass/LICENSE.md
      @@ -0,0 +1,55 @@
      +# Blue Oak Model License
      +
      +Version 1.0.0
      +
      +## Purpose
      +
      +This license gives everyone as much permission to work with
      +this software as possible, while protecting contributors
      +from liability.
      +
      +## Acceptance
      +
      +In order to receive this license, you must agree to its
      +rules.  The rules of this license are both obligations
      +under that agreement and conditions to your license.
      +You must not do anything with this software that triggers
      +a rule that you cannot or will not follow.
      +
      +## Copyright
      +
      +Each contributor licenses you to do everything with this
      +software that would otherwise infringe that contributor's
      +copyright in it.
      +
      +## Notices
      +
      +You must ensure that everyone who gets a copy of
      +any part of this software from you, with or without
      +changes, also gets the text of this license or a link to
      +.
      +
      +## Excuse
      +
      +If anyone notifies you in writing that you have not
      +complied with [Notices](#notices), you can keep your
      +license by taking all practical steps to comply within 30
      +days after the notice.  If you do not do so, your license
      +ends immediately.
      +
      +## Patent
      +
      +Each contributor licenses you to do everything with this
      +software that would otherwise infringe any patent claims
      +they can license or become able to license.
      +
      +## Reliability
      +
      +No contributor can revoke this license.
      +
      +## No Liability
      +
      +***As far as the law allows, this software comes as is,
      +without any warranty or condition, and no contributor
      +will be liable to anyone for any damages related to this
      +software or this license, under any kind of legal claim.***
      diff --git a/node_modules/minipass/README.md b/node_modules/minipass/README.md
      new file mode 100644
      index 00000000..11263305
      --- /dev/null
      +++ b/node_modules/minipass/README.md
      @@ -0,0 +1,825 @@
      +# minipass
      +
      +A _very_ minimal implementation of a [PassThrough
      +stream](https://nodejs.org/api/stream.html#stream_class_stream_passthrough)
      +
      +[It's very
      +fast](https://docs.google.com/spreadsheets/d/1K_HR5oh3r80b8WVMWCPPjfuWXUgfkmhlX7FGI6JJ8tY/edit?usp=sharing)
      +for objects, strings, and buffers.
      +
      +Supports `pipe()`ing (including multi-`pipe()` and backpressure
      +transmission), buffering data until either a `data` event handler
      +or `pipe()` is added (so you don't lose the first chunk), and
      +most other cases where PassThrough is a good idea.
      +
      +There is a `read()` method, but it's much more efficient to
      +consume data from this stream via `'data'` events or by calling
      +`pipe()` into some other stream. Calling `read()` requires the
      +buffer to be flattened in some cases, which requires copying
      +memory.
      +
      +If you set `objectMode: true` in the options, then whatever is
      +written will be emitted. Otherwise, it'll do a minimal amount of
      +Buffer copying to ensure proper Streams semantics when `read(n)`
      +is called.
      +
      +`objectMode` can only be set at instantiation. Attempting to
      +write something other than a String or Buffer without having set
      +`objectMode` in the options will throw an error.
      +
      +This is not a `through` or `through2` stream. It doesn't
      +transform the data, it just passes it right through. If you want
      +to transform the data, extend the class, and override the
      +`write()` method. Once you're done transforming the data however
      +you want, call `super.write()` with the transform output.
      +
      +For some examples of streams that extend Minipass in various
      +ways, check out:
      +
      +- [minizlib](http://npm.im/minizlib)
      +- [fs-minipass](http://npm.im/fs-minipass)
      +- [tar](http://npm.im/tar)
      +- [minipass-collect](http://npm.im/minipass-collect)
      +- [minipass-flush](http://npm.im/minipass-flush)
      +- [minipass-pipeline](http://npm.im/minipass-pipeline)
      +- [tap](http://npm.im/tap)
      +- [tap-parser](http://npm.im/tap-parser)
      +- [treport](http://npm.im/treport)
      +- [minipass-fetch](http://npm.im/minipass-fetch)
      +- [pacote](http://npm.im/pacote)
      +- [make-fetch-happen](http://npm.im/make-fetch-happen)
      +- [cacache](http://npm.im/cacache)
      +- [ssri](http://npm.im/ssri)
      +- [npm-registry-fetch](http://npm.im/npm-registry-fetch)
      +- [minipass-json-stream](http://npm.im/minipass-json-stream)
      +- [minipass-sized](http://npm.im/minipass-sized)
      +
      +## Usage in TypeScript
      +
      +The `Minipass` class takes three type template definitions:
      +
      +- `RType` the type being read, which defaults to `Buffer`. If
      +  `RType` is `string`, then the constructor _must_ get an options
      +  object specifying either an `encoding` or `objectMode: true`.
      +  If it's anything other than `string` or `Buffer`, then it
      +  _must_ get an options object specifying `objectMode: true`.
      +- `WType` the type being written. If `RType` is `Buffer` or
      +  `string`, then this defaults to `ContiguousData` (Buffer,
      +  string, ArrayBuffer, or ArrayBufferView). Otherwise, it
      +  defaults to `RType`.
      +- `Events` type mapping event names to the arguments emitted
      +  with that event, which extends `Minipass.Events`.
      +
      +To declare types for custom events in subclasses, extend the
      +third parameter with your own event signatures. For example:
      +
      +```js
      +import { Minipass } from 'minipass'
      +
      +// a NDJSON stream that emits 'jsonError' when it can't stringify
      +export interface Events extends Minipass.Events {
      +  jsonError: [e: Error]
      +}
      +
      +export class NDJSONStream extends Minipass {
      +  constructor() {
      +    super({ objectMode: true })
      +  }
      +
      +  // data is type `any` because that's WType
      +  write(data, encoding, cb) {
      +    try {
      +      const json = JSON.stringify(data)
      +      return super.write(json + '\n', encoding, cb)
      +    } catch (er) {
      +      if (!er instanceof Error) {
      +        er = Object.assign(new Error('json stringify failed'), {
      +          cause: er,
      +        })
      +      }
      +      // trying to emit with something OTHER than an error will
      +      // fail, because we declared the event arguments type.
      +      this.emit('jsonError', er)
      +    }
      +  }
      +}
      +
      +const s = new NDJSONStream()
      +s.on('jsonError', e => {
      +  // here, TS knows that e is an Error
      +})
      +```
      +
      +Emitting/handling events that aren't declared in this way is
      +fine, but the arguments will be typed as `unknown`.
      +
      +## Differences from Node.js Streams
      +
      +There are several things that make Minipass streams different
      +from (and in some ways superior to) Node.js core streams.
      +
      +Please read these caveats if you are familiar with node-core
      +streams and intend to use Minipass streams in your programs.
      +
      +You can avoid most of these differences entirely (for a very
      +small performance penalty) by setting `{async: true}` in the
      +constructor options.
      +
      +### Timing
      +
      +Minipass streams are designed to support synchronous use-cases.
      +Thus, data is emitted as soon as it is available, always. It is
      +buffered until read, but no longer. Another way to look at it is
      +that Minipass streams are exactly as synchronous as the logic
      +that writes into them.
      +
      +This can be surprising if your code relies on
      +`PassThrough.write()` always providing data on the next tick
      +rather than the current one, or being able to call `resume()` and
      +not have the entire buffer disappear immediately.
      +
      +However, without this synchronicity guarantee, there would be no
      +way for Minipass to achieve the speeds it does, or support the
      +synchronous use cases that it does. Simply put, waiting takes
      +time.
      +
      +This non-deferring approach makes Minipass streams much easier to
      +reason about, especially in the context of Promises and other
      +flow-control mechanisms.
      +
      +Example:
      +
      +```js
      +// hybrid module, either works
      +import { Minipass } from 'minipass'
      +// or:
      +const { Minipass } = require('minipass')
      +
      +const stream = new Minipass()
      +stream.on('data', () => console.log('data event'))
      +console.log('before write')
      +stream.write('hello')
      +console.log('after write')
      +// output:
      +// before write
      +// data event
      +// after write
      +```
      +
      +### Exception: Async Opt-In
      +
      +If you wish to have a Minipass stream with behavior that more
      +closely mimics Node.js core streams, you can set the stream in
      +async mode either by setting `async: true` in the constructor
      +options, or by setting `stream.async = true` later on.
      +
      +```js
      +// hybrid module, either works
      +import { Minipass } from 'minipass'
      +// or:
      +const { Minipass } = require('minipass')
      +
      +const asyncStream = new Minipass({ async: true })
      +asyncStream.on('data', () => console.log('data event'))
      +console.log('before write')
      +asyncStream.write('hello')
      +console.log('after write')
      +// output:
      +// before write
      +// after write
      +// data event <-- this is deferred until the next tick
      +```
      +
      +Switching _out_ of async mode is unsafe, as it could cause data
      +corruption, and so is not enabled. Example:
      +
      +```js
      +import { Minipass } from 'minipass'
      +const stream = new Minipass({ encoding: 'utf8' })
      +stream.on('data', chunk => console.log(chunk))
      +stream.async = true
      +console.log('before writes')
      +stream.write('hello')
      +setStreamSyncAgainSomehow(stream) // <-- this doesn't actually exist!
      +stream.write('world')
      +console.log('after writes')
      +// hypothetical output would be:
      +// before writes
      +// world
      +// after writes
      +// hello
      +// NOT GOOD!
      +```
      +
      +To avoid this problem, once set into async mode, any attempt to
      +make the stream sync again will be ignored.
      +
      +```js
      +const { Minipass } = require('minipass')
      +const stream = new Minipass({ encoding: 'utf8' })
      +stream.on('data', chunk => console.log(chunk))
      +stream.async = true
      +console.log('before writes')
      +stream.write('hello')
      +stream.async = false // <-- no-op, stream already async
      +stream.write('world')
      +console.log('after writes')
      +// actual output:
      +// before writes
      +// after writes
      +// hello
      +// world
      +```
      +
      +### No High/Low Water Marks
      +
      +Node.js core streams will optimistically fill up a buffer,
      +returning `true` on all writes until the limit is hit, even if
      +the data has nowhere to go. Then, they will not attempt to draw
      +more data in until the buffer size dips below a minimum value.
      +
      +Minipass streams are much simpler. The `write()` method will
      +return `true` if the data has somewhere to go (which is to say,
      +given the timing guarantees, that the data is already there by
      +the time `write()` returns).
      +
      +If the data has nowhere to go, then `write()` returns false, and
      +the data sits in a buffer, to be drained out immediately as soon
      +as anyone consumes it.
      +
      +Since nothing is ever buffered unnecessarily, there is much less
      +copying data, and less bookkeeping about buffer capacity levels.
      +
      +### Hazards of Buffering (or: Why Minipass Is So Fast)
      +
      +Since data written to a Minipass stream is immediately written
      +all the way through the pipeline, and `write()` always returns
      +true/false based on whether the data was fully flushed,
      +backpressure is communicated immediately to the upstream caller.
      +This minimizes buffering.
      +
      +Consider this case:
      +
      +```js
      +const { PassThrough } = require('stream')
      +const p1 = new PassThrough({ highWaterMark: 1024 })
      +const p2 = new PassThrough({ highWaterMark: 1024 })
      +const p3 = new PassThrough({ highWaterMark: 1024 })
      +const p4 = new PassThrough({ highWaterMark: 1024 })
      +
      +p1.pipe(p2).pipe(p3).pipe(p4)
      +p4.on('data', () => console.log('made it through'))
      +
      +// this returns false and buffers, then writes to p2 on next tick (1)
      +// p2 returns false and buffers, pausing p1, then writes to p3 on next tick (2)
      +// p3 returns false and buffers, pausing p2, then writes to p4 on next tick (3)
      +// p4 returns false and buffers, pausing p3, then emits 'data' and 'drain'
      +// on next tick (4)
      +// p3 sees p4's 'drain' event, and calls resume(), emitting 'resume' and
      +// 'drain' on next tick (5)
      +// p2 sees p3's 'drain', calls resume(), emits 'resume' and 'drain' on next tick (6)
      +// p1 sees p2's 'drain', calls resume(), emits 'resume' and 'drain' on next
      +// tick (7)
      +
      +p1.write(Buffer.alloc(2048)) // returns false
      +```
      +
      +Along the way, the data was buffered and deferred at each stage,
      +and multiple event deferrals happened, for an unblocked pipeline
      +where it was perfectly safe to write all the way through!
      +
      +Furthermore, setting a `highWaterMark` of `1024` might lead
      +someone reading the code to think an advisory maximum of 1KiB is
      +being set for the pipeline. However, the actual advisory
      +buffering level is the _sum_ of `highWaterMark` values, since
      +each one has its own bucket.
      +
      +Consider the Minipass case:
      +
      +```js
      +const m1 = new Minipass()
      +const m2 = new Minipass()
      +const m3 = new Minipass()
      +const m4 = new Minipass()
      +
      +m1.pipe(m2).pipe(m3).pipe(m4)
      +m4.on('data', () => console.log('made it through'))
      +
      +// m1 is flowing, so it writes the data to m2 immediately
      +// m2 is flowing, so it writes the data to m3 immediately
      +// m3 is flowing, so it writes the data to m4 immediately
      +// m4 is flowing, so it fires the 'data' event immediately, returns true
      +// m4's write returned true, so m3 is still flowing, returns true
      +// m3's write returned true, so m2 is still flowing, returns true
      +// m2's write returned true, so m1 is still flowing, returns true
      +// No event deferrals or buffering along the way!
      +
      +m1.write(Buffer.alloc(2048)) // returns true
      +```
      +
      +It is extremely unlikely that you _don't_ want to buffer any data
      +written, or _ever_ buffer data that can be flushed all the way
      +through. Neither node-core streams nor Minipass ever fail to
      +buffer written data, but node-core streams do a lot of
      +unnecessary buffering and pausing.
      +
      +As always, the faster implementation is the one that does less
      +stuff and waits less time to do it.
      +
      +### Immediately emit `end` for empty streams (when not paused)
      +
      +If a stream is not paused, and `end()` is called before writing
      +any data into it, then it will emit `end` immediately.
      +
      +If you have logic that occurs on the `end` event which you don't
      +want to potentially happen immediately (for example, closing file
      +descriptors, moving on to the next entry in an archive parse
      +stream, etc.) then be sure to call `stream.pause()` on creation,
      +and then `stream.resume()` once you are ready to respond to the
      +`end` event.
      +
      +However, this is _usually_ not a problem because:
      +
      +### Emit `end` When Asked
      +
      +One hazard of immediately emitting `'end'` is that you may not
      +yet have had a chance to add a listener. In order to avoid this
      +hazard, Minipass streams safely re-emit the `'end'` event if a
      +new listener is added after `'end'` has been emitted.
      +
      +Ie, if you do `stream.on('end', someFunction)`, and the stream
      +has already emitted `end`, then it will call the handler right
      +away. (You can think of this somewhat like attaching a new
      +`.then(fn)` to a previously-resolved Promise.)
      +
      +To prevent calling handlers multiple times who would not expect
      +multiple ends to occur, all listeners are removed from the
      +`'end'` event whenever it is emitted.
      +
      +### Emit `error` When Asked
      +
      +The most recent error object passed to the `'error'` event is
      +stored on the stream. If a new `'error'` event handler is added,
      +and an error was previously emitted, then the event handler will
      +be called immediately (or on `process.nextTick` in the case of
      +async streams).
      +
      +This makes it much more difficult to end up trying to interact
      +with a broken stream, if the error handler is added after an
      +error was previously emitted.
      +
      +### Impact of "immediate flow" on Tee-streams
      +
      +A "tee stream" is a stream piping to multiple destinations:
      +
      +```js
      +const tee = new Minipass()
      +t.pipe(dest1)
      +t.pipe(dest2)
      +t.write('foo') // goes to both destinations
      +```
      +
      +Since Minipass streams _immediately_ process any pending data
      +through the pipeline when a new pipe destination is added, this
      +can have surprising effects, especially when a stream comes in
      +from some other function and may or may not have data in its
      +buffer.
      +
      +```js
      +// WARNING! WILL LOSE DATA!
      +const src = new Minipass()
      +src.write('foo')
      +src.pipe(dest1) // 'foo' chunk flows to dest1 immediately, and is gone
      +src.pipe(dest2) // gets nothing!
      +```
      +
      +One solution is to create a dedicated tee-stream junction that
      +pipes to both locations, and then pipe to _that_ instead.
      +
      +```js
      +// Safe example: tee to both places
      +const src = new Minipass()
      +src.write('foo')
      +const tee = new Minipass()
      +tee.pipe(dest1)
      +tee.pipe(dest2)
      +src.pipe(tee) // tee gets 'foo', pipes to both locations
      +```
      +
      +The same caveat applies to `on('data')` event listeners. The
      +first one added will _immediately_ receive all of the data,
      +leaving nothing for the second:
      +
      +```js
      +// WARNING! WILL LOSE DATA!
      +const src = new Minipass()
      +src.write('foo')
      +src.on('data', handler1) // receives 'foo' right away
      +src.on('data', handler2) // nothing to see here!
      +```
      +
      +Using a dedicated tee-stream can be used in this case as well:
      +
      +```js
      +// Safe example: tee to both data handlers
      +const src = new Minipass()
      +src.write('foo')
      +const tee = new Minipass()
      +tee.on('data', handler1)
      +tee.on('data', handler2)
      +src.pipe(tee)
      +```
      +
      +All of the hazards in this section are avoided by setting `{
      +async: true }` in the Minipass constructor, or by setting
      +`stream.async = true` afterwards. Note that this does add some
      +overhead, so should only be done in cases where you are willing
      +to lose a bit of performance in order to avoid having to refactor
      +program logic.
      +
      +## USAGE
      +
      +It's a stream! Use it like a stream and it'll most likely do what
      +you want.
      +
      +```js
      +import { Minipass } from 'minipass'
      +const mp = new Minipass(options) // options is optional
      +mp.write('foo')
      +mp.pipe(someOtherStream)
      +mp.end('bar')
      +```
      +
      +### OPTIONS
      +
      +- `encoding` How would you like the data coming _out_ of the
      +  stream to be encoded? Accepts any values that can be passed to
      +  `Buffer.toString()`.
      +- `objectMode` Emit data exactly as it comes in. This will be
      +  flipped on by default if you write() something other than a
      +  string or Buffer at any point. Setting `objectMode: true` will
      +  prevent setting any encoding value.
      +- `async` Defaults to `false`. Set to `true` to defer data
      +  emission until next tick. This reduces performance slightly,
      +  but makes Minipass streams use timing behavior closer to Node
      +  core streams. See [Timing](#timing) for more details.
      +- `signal` An `AbortSignal` that will cause the stream to unhook
      +  itself from everything and become as inert as possible. Note
      +  that providing a `signal` parameter will make `'error'` events
      +  no longer throw if they are unhandled, but they will still be
      +  emitted to handlers if any are attached.
      +
      +### API
      +
      +Implements the user-facing portions of Node.js's `Readable` and
      +`Writable` streams.
      +
      +### Methods
      +
      +- `write(chunk, [encoding], [callback])` - Put data in. (Note
      +  that, in the base Minipass class, the same data will come out.)
      +  Returns `false` if the stream will buffer the next write, or
      +  true if it's still in "flowing" mode.
      +- `end([chunk, [encoding]], [callback])` - Signal that you have
      +  no more data to write. This will queue an `end` event to be
      +  fired when all the data has been consumed.
      +- `pause()` - No more data for a while, please. This also
      +  prevents `end` from being emitted for empty streams until the
      +  stream is resumed.
      +- `resume()` - Resume the stream. If there's data in the buffer,
      +  it is all discarded. Any buffered events are immediately
      +  emitted.
      +- `pipe(dest)` - Send all output to the stream provided. When
      +  data is emitted, it is immediately written to any and all pipe
      +  destinations. (Or written on next tick in `async` mode.)
      +- `unpipe(dest)` - Stop piping to the destination stream. This is
      +  immediate, meaning that any asynchronously queued data will
      +  _not_ make it to the destination when running in `async` mode.
      +  - `options.end` - Boolean, end the destination stream when the
      +    source stream ends. Default `true`.
      +  - `options.proxyErrors` - Boolean, proxy `error` events from
      +    the source stream to the destination stream. Note that errors
      +    are _not_ proxied after the pipeline terminates, either due
      +    to the source emitting `'end'` or manually unpiping with
      +    `src.unpipe(dest)`. Default `false`.
      +- `on(ev, fn)`, `emit(ev, fn)` - Minipass streams are
      +  EventEmitters. Some events are given special treatment,
      +  however. (See below under "events".)
      +- `promise()` - Returns a Promise that resolves when the stream
      +  emits `end`, or rejects if the stream emits `error`.
      +- `collect()` - Return a Promise that resolves on `end` with an
      +  array containing each chunk of data that was emitted, or
      +  rejects if the stream emits `error`. Note that this consumes
      +  the stream data.
      +- `concat()` - Same as `collect()`, but concatenates the data
      +  into a single Buffer object. Will reject the returned promise
      +  if the stream is in objectMode, or if it goes into objectMode
      +  by the end of the data.
      +- `read(n)` - Consume `n` bytes of data out of the buffer. If `n`
      +  is not provided, then consume all of it. If `n` bytes are not
      +  available, then it returns null. **Note** consuming streams in
      +  this way is less efficient, and can lead to unnecessary Buffer
      +  copying.
      +- `destroy([er])` - Destroy the stream. If an error is provided,
      +  then an `'error'` event is emitted. If the stream has a
      +  `close()` method, and has not emitted a `'close'` event yet,
      +  then `stream.close()` will be called. Any Promises returned by
      +  `.promise()`, `.collect()` or `.concat()` will be rejected.
      +  After being destroyed, writing to the stream will emit an
      +  error. No more data will be emitted if the stream is destroyed,
      +  even if it was previously buffered.
      +
      +### Properties
      +
      +- `bufferLength` Read-only. Total number of bytes buffered, or in
      +  the case of objectMode, the total number of objects.
      +- `encoding` Read-only. The encoding that has been set.
      +- `flowing` Read-only. Boolean indicating whether a chunk written
      +  to the stream will be immediately emitted.
      +- `emittedEnd` Read-only. Boolean indicating whether the end-ish
      +  events (ie, `end`, `prefinish`, `finish`) have been emitted.
      +  Note that listening on any end-ish event will immediateyl
      +  re-emit it if it has already been emitted.
      +- `writable` Whether the stream is writable. Default `true`. Set
      +  to `false` when `end()`
      +- `readable` Whether the stream is readable. Default `true`.
      +- `pipes` An array of Pipe objects referencing streams that this
      +  stream is piping into.
      +- `destroyed` A getter that indicates whether the stream was
      +  destroyed.
      +- `paused` True if the stream has been explicitly paused,
      +  otherwise false.
      +- `objectMode` Indicates whether the stream is in `objectMode`.
      +- `aborted` Readonly property set when the `AbortSignal`
      +  dispatches an `abort` event.
      +
      +### Events
      +
      +- `data` Emitted when there's data to read. Argument is the data
      +  to read. This is never emitted while not flowing. If a listener
      +  is attached, that will resume the stream.
      +- `end` Emitted when there's no more data to read. This will be
      +  emitted immediately for empty streams when `end()` is called.
      +  If a listener is attached, and `end` was already emitted, then
      +  it will be emitted again. All listeners are removed when `end`
      +  is emitted.
      +- `prefinish` An end-ish event that follows the same logic as
      +  `end` and is emitted in the same conditions where `end` is
      +  emitted. Emitted after `'end'`.
      +- `finish` An end-ish event that follows the same logic as `end`
      +  and is emitted in the same conditions where `end` is emitted.
      +  Emitted after `'prefinish'`.
      +- `close` An indication that an underlying resource has been
      +  released. Minipass does not emit this event, but will defer it
      +  until after `end` has been emitted, since it throws off some
      +  stream libraries otherwise.
      +- `drain` Emitted when the internal buffer empties, and it is
      +  again suitable to `write()` into the stream.
      +- `readable` Emitted when data is buffered and ready to be read
      +  by a consumer.
      +- `resume` Emitted when stream changes state from buffering to
      +  flowing mode. (Ie, when `resume` is called, `pipe` is called,
      +  or a `data` event listener is added.)
      +
      +### Static Methods
      +
      +- `Minipass.isStream(stream)` Returns `true` if the argument is a
      +  stream, and false otherwise. To be considered a stream, the
      +  object must be either an instance of Minipass, or an
      +  EventEmitter that has either a `pipe()` method, or both
      +  `write()` and `end()` methods. (Pretty much any stream in
      +  node-land will return `true` for this.)
      +
      +## EXAMPLES
      +
      +Here are some examples of things you can do with Minipass
      +streams.
      +
      +### simple "are you done yet" promise
      +
      +```js
      +mp.promise().then(
      +  () => {
      +    // stream is finished
      +  },
      +  er => {
      +    // stream emitted an error
      +  }
      +)
      +```
      +
      +### collecting
      +
      +```js
      +mp.collect().then(all => {
      +  // all is an array of all the data emitted
      +  // encoding is supported in this case, so
      +  // so the result will be a collection of strings if
      +  // an encoding is specified, or buffers/objects if not.
      +  //
      +  // In an async function, you may do
      +  // const data = await stream.collect()
      +})
      +```
      +
      +### collecting into a single blob
      +
      +This is a bit slower because it concatenates the data into one
      +chunk for you, but if you're going to do it yourself anyway, it's
      +convenient this way:
      +
      +```js
      +mp.concat().then(onebigchunk => {
      +  // onebigchunk is a string if the stream
      +  // had an encoding set, or a buffer otherwise.
      +})
      +```
      +
      +### iteration
      +
      +You can iterate over streams synchronously or asynchronously in
      +platforms that support it.
      +
      +Synchronous iteration will end when the currently available data
      +is consumed, even if the `end` event has not been reached. In
      +string and buffer mode, the data is concatenated, so unless
      +multiple writes are occurring in the same tick as the `read()`,
      +sync iteration loops will generally only have a single iteration.
      +
      +To consume chunks in this way exactly as they have been written,
      +with no flattening, create the stream with the `{ objectMode:
      +true }` option.
      +
      +```js
      +const mp = new Minipass({ objectMode: true })
      +mp.write('a')
      +mp.write('b')
      +for (let letter of mp) {
      +  console.log(letter) // a, b
      +}
      +mp.write('c')
      +mp.write('d')
      +for (let letter of mp) {
      +  console.log(letter) // c, d
      +}
      +mp.write('e')
      +mp.end()
      +for (let letter of mp) {
      +  console.log(letter) // e
      +}
      +for (let letter of mp) {
      +  console.log(letter) // nothing
      +}
      +```
      +
      +Asynchronous iteration will continue until the end event is reached,
      +consuming all of the data.
      +
      +```js
      +const mp = new Minipass({ encoding: 'utf8' })
      +
      +// some source of some data
      +let i = 5
      +const inter = setInterval(() => {
      +  if (i-- > 0) mp.write(Buffer.from('foo\n', 'utf8'))
      +  else {
      +    mp.end()
      +    clearInterval(inter)
      +  }
      +}, 100)
      +
      +// consume the data with asynchronous iteration
      +async function consume() {
      +  for await (let chunk of mp) {
      +    console.log(chunk)
      +  }
      +  return 'ok'
      +}
      +
      +consume().then(res => console.log(res))
      +// logs `foo\n` 5 times, and then `ok`
      +```
      +
      +### subclass that `console.log()`s everything written into it
      +
      +```js
      +class Logger extends Minipass {
      +  write(chunk, encoding, callback) {
      +    console.log('WRITE', chunk, encoding)
      +    return super.write(chunk, encoding, callback)
      +  }
      +  end(chunk, encoding, callback) {
      +    console.log('END', chunk, encoding)
      +    return super.end(chunk, encoding, callback)
      +  }
      +}
      +
      +someSource.pipe(new Logger()).pipe(someDest)
      +```
      +
      +### same thing, but using an inline anonymous class
      +
      +```js
      +// js classes are fun
      +someSource
      +  .pipe(
      +    new (class extends Minipass {
      +      emit(ev, ...data) {
      +        // let's also log events, because debugging some weird thing
      +        console.log('EMIT', ev)
      +        return super.emit(ev, ...data)
      +      }
      +      write(chunk, encoding, callback) {
      +        console.log('WRITE', chunk, encoding)
      +        return super.write(chunk, encoding, callback)
      +      }
      +      end(chunk, encoding, callback) {
      +        console.log('END', chunk, encoding)
      +        return super.end(chunk, encoding, callback)
      +      }
      +    })()
      +  )
      +  .pipe(someDest)
      +```
      +
      +### subclass that defers 'end' for some reason
      +
      +```js
      +class SlowEnd extends Minipass {
      +  emit(ev, ...args) {
      +    if (ev === 'end') {
      +      console.log('going to end, hold on a sec')
      +      setTimeout(() => {
      +        console.log('ok, ready to end now')
      +        super.emit('end', ...args)
      +      }, 100)
      +      return true
      +    } else {
      +      return super.emit(ev, ...args)
      +    }
      +  }
      +}
      +```
      +
      +### transform that creates newline-delimited JSON
      +
      +```js
      +class NDJSONEncode extends Minipass {
      +  write(obj, cb) {
      +    try {
      +      // JSON.stringify can throw, emit an error on that
      +      return super.write(JSON.stringify(obj) + '\n', 'utf8', cb)
      +    } catch (er) {
      +      this.emit('error', er)
      +    }
      +  }
      +  end(obj, cb) {
      +    if (typeof obj === 'function') {
      +      cb = obj
      +      obj = undefined
      +    }
      +    if (obj !== undefined) {
      +      this.write(obj)
      +    }
      +    return super.end(cb)
      +  }
      +}
      +```
      +
      +### transform that parses newline-delimited JSON
      +
      +```js
      +class NDJSONDecode extends Minipass {
      +  constructor(options) {
      +    // always be in object mode, as far as Minipass is concerned
      +    super({ objectMode: true })
      +    this._jsonBuffer = ''
      +  }
      +  write(chunk, encoding, cb) {
      +    if (
      +      typeof chunk === 'string' &&
      +      typeof encoding === 'string' &&
      +      encoding !== 'utf8'
      +    ) {
      +      chunk = Buffer.from(chunk, encoding).toString()
      +    } else if (Buffer.isBuffer(chunk)) {
      +      chunk = chunk.toString()
      +    }
      +    if (typeof encoding === 'function') {
      +      cb = encoding
      +    }
      +    const jsonData = (this._jsonBuffer + chunk).split('\n')
      +    this._jsonBuffer = jsonData.pop()
      +    for (let i = 0; i < jsonData.length; i++) {
      +      try {
      +        // JSON.parse can throw, emit an error on that
      +        super.write(JSON.parse(jsonData[i]))
      +      } catch (er) {
      +        this.emit('error', er)
      +        continue
      +      }
      +    }
      +    if (cb) cb()
      +  }
      +}
      +```
      diff --git a/node_modules/minipass/dist/commonjs/index.d.ts b/node_modules/minipass/dist/commonjs/index.d.ts
      new file mode 100644
      index 00000000..3e75b578
      --- /dev/null
      +++ b/node_modules/minipass/dist/commonjs/index.d.ts
      @@ -0,0 +1,545 @@
      +import { EventEmitter } from 'node:events';
      +import { StringDecoder } from 'node:string_decoder';
      +/**
      + * Same as StringDecoder, but exposing the `lastNeed` flag on the type
      + */
      +type SD = StringDecoder & {
      +    lastNeed: boolean;
      +};
      +export type { SD, Pipe, PipeProxyErrors };
      +/**
      + * Return true if the argument is a Minipass stream, Node stream, or something
      + * else that Minipass can interact with.
      + */
      +export declare const isStream: (s: any) => s is Minipass | NodeJS.ReadStream | NodeJS.WriteStream | (EventEmitter & {
      +    end(): any;
      +    write(chunk: any, ...args: any[]): any;
      +}) | (EventEmitter & {
      +    pause(): any;
      +    resume(): any;
      +    pipe(...destArgs: any[]): any;
      +}) | (NodeJS.ReadStream & {
      +    fd: number;
      +}) | (NodeJS.WriteStream & {
      +    fd: number;
      +});
      +/**
      + * Return true if the argument is a valid {@link Minipass.Readable}
      + */
      +export declare const isReadable: (s: any) => s is Minipass.Readable;
      +/**
      + * Return true if the argument is a valid {@link Minipass.Writable}
      + */
      +export declare const isWritable: (s: any) => s is Minipass.Readable;
      +declare const EOF: unique symbol;
      +declare const MAYBE_EMIT_END: unique symbol;
      +declare const EMITTED_END: unique symbol;
      +declare const EMITTING_END: unique symbol;
      +declare const EMITTED_ERROR: unique symbol;
      +declare const CLOSED: unique symbol;
      +declare const READ: unique symbol;
      +declare const FLUSH: unique symbol;
      +declare const FLUSHCHUNK: unique symbol;
      +declare const ENCODING: unique symbol;
      +declare const DECODER: unique symbol;
      +declare const FLOWING: unique symbol;
      +declare const PAUSED: unique symbol;
      +declare const RESUME: unique symbol;
      +declare const BUFFER: unique symbol;
      +declare const PIPES: unique symbol;
      +declare const BUFFERLENGTH: unique symbol;
      +declare const BUFFERPUSH: unique symbol;
      +declare const BUFFERSHIFT: unique symbol;
      +declare const OBJECTMODE: unique symbol;
      +declare const DESTROYED: unique symbol;
      +declare const ERROR: unique symbol;
      +declare const EMITDATA: unique symbol;
      +declare const EMITEND: unique symbol;
      +declare const EMITEND2: unique symbol;
      +declare const ASYNC: unique symbol;
      +declare const ABORT: unique symbol;
      +declare const ABORTED: unique symbol;
      +declare const SIGNAL: unique symbol;
      +declare const DATALISTENERS: unique symbol;
      +declare const DISCARDED: unique symbol;
      +/**
      + * Options that may be passed to stream.pipe()
      + */
      +export interface PipeOptions {
      +    /**
      +     * end the destination stream when the source stream ends
      +     */
      +    end?: boolean;
      +    /**
      +     * proxy errors from the source stream to the destination stream
      +     */
      +    proxyErrors?: boolean;
      +}
      +/**
      + * Internal class representing a pipe to a destination stream.
      + *
      + * @internal
      + */
      +declare class Pipe {
      +    src: Minipass;
      +    dest: Minipass;
      +    opts: PipeOptions;
      +    ondrain: () => any;
      +    constructor(src: Minipass, dest: Minipass.Writable, opts: PipeOptions);
      +    unpipe(): void;
      +    proxyErrors(_er: any): void;
      +    end(): void;
      +}
      +/**
      + * Internal class representing a pipe to a destination stream where
      + * errors are proxied.
      + *
      + * @internal
      + */
      +declare class PipeProxyErrors extends Pipe {
      +    unpipe(): void;
      +    constructor(src: Minipass, dest: Minipass.Writable, opts: PipeOptions);
      +}
      +export declare namespace Minipass {
      +    /**
      +     * Encoding used to create a stream that outputs strings rather than
      +     * Buffer objects.
      +     */
      +    export type Encoding = BufferEncoding | 'buffer' | null;
      +    /**
      +     * Any stream that Minipass can pipe into
      +     */
      +    export type Writable = Minipass | NodeJS.WriteStream | (NodeJS.WriteStream & {
      +        fd: number;
      +    }) | (EventEmitter & {
      +        end(): any;
      +        write(chunk: any, ...args: any[]): any;
      +    });
      +    /**
      +     * Any stream that can be read from
      +     */
      +    export type Readable = Minipass | NodeJS.ReadStream | (NodeJS.ReadStream & {
      +        fd: number;
      +    }) | (EventEmitter & {
      +        pause(): any;
      +        resume(): any;
      +        pipe(...destArgs: any[]): any;
      +    });
      +    /**
      +     * Utility type that can be iterated sync or async
      +     */
      +    export type DualIterable = Iterable & AsyncIterable;
      +    type EventArguments = Record;
      +    /**
      +     * The listing of events that a Minipass class can emit.
      +     * Extend this when extending the Minipass class, and pass as
      +     * the third template argument.  The key is the name of the event,
      +     * and the value is the argument list.
      +     *
      +     * Any undeclared events will still be allowed, but the handler will get
      +     * arguments as `unknown[]`.
      +     */
      +    export interface Events extends EventArguments {
      +        readable: [];
      +        data: [chunk: RType];
      +        error: [er: unknown];
      +        abort: [reason: unknown];
      +        drain: [];
      +        resume: [];
      +        end: [];
      +        finish: [];
      +        prefinish: [];
      +        close: [];
      +        [DESTROYED]: [er?: unknown];
      +        [ERROR]: [er: unknown];
      +    }
      +    /**
      +     * String or buffer-like data that can be joined and sliced
      +     */
      +    export type ContiguousData = Buffer | ArrayBufferLike | ArrayBufferView | string;
      +    export type BufferOrString = Buffer | string;
      +    /**
      +     * Options passed to the Minipass constructor.
      +     */
      +    export type SharedOptions = {
      +        /**
      +         * Defer all data emission and other events until the end of the
      +         * current tick, similar to Node core streams
      +         */
      +        async?: boolean;
      +        /**
      +         * A signal which will abort the stream
      +         */
      +        signal?: AbortSignal;
      +        /**
      +         * Output string encoding. Set to `null` or `'buffer'` (or omit) to
      +         * emit Buffer objects rather than strings.
      +         *
      +         * Conflicts with `objectMode`
      +         */
      +        encoding?: BufferEncoding | null | 'buffer';
      +        /**
      +         * Output data exactly as it was written, supporting non-buffer/string
      +         * data (such as arbitrary objects, falsey values, etc.)
      +         *
      +         * Conflicts with `encoding`
      +         */
      +        objectMode?: boolean;
      +    };
      +    /**
      +     * Options for a string encoded output
      +     */
      +    export type EncodingOptions = SharedOptions & {
      +        encoding: BufferEncoding;
      +        objectMode?: false;
      +    };
      +    /**
      +     * Options for contiguous data buffer output
      +     */
      +    export type BufferOptions = SharedOptions & {
      +        encoding?: null | 'buffer';
      +        objectMode?: false;
      +    };
      +    /**
      +     * Options for objectMode arbitrary output
      +     */
      +    export type ObjectModeOptions = SharedOptions & {
      +        objectMode: true;
      +        encoding?: null;
      +    };
      +    /**
      +     * Utility type to determine allowed options based on read type
      +     */
      +    export type Options = ObjectModeOptions | (T extends string ? EncodingOptions : T extends Buffer ? BufferOptions : SharedOptions);
      +    export {};
      +}
      +/**
      + * Main export, the Minipass class
      + *
      + * `RType` is the type of data emitted, defaults to Buffer
      + *
      + * `WType` is the type of data to be written, if RType is buffer or string,
      + * then any {@link Minipass.ContiguousData} is allowed.
      + *
      + * `Events` is the set of event handler signatures that this object
      + * will emit, see {@link Minipass.Events}
      + */
      +export declare class Minipass = Minipass.Events> extends EventEmitter implements Minipass.DualIterable {
      +    [FLOWING]: boolean;
      +    [PAUSED]: boolean;
      +    [PIPES]: Pipe[];
      +    [BUFFER]: RType[];
      +    [OBJECTMODE]: boolean;
      +    [ENCODING]: BufferEncoding | null;
      +    [ASYNC]: boolean;
      +    [DECODER]: SD | null;
      +    [EOF]: boolean;
      +    [EMITTED_END]: boolean;
      +    [EMITTING_END]: boolean;
      +    [CLOSED]: boolean;
      +    [EMITTED_ERROR]: unknown;
      +    [BUFFERLENGTH]: number;
      +    [DESTROYED]: boolean;
      +    [SIGNAL]?: AbortSignal;
      +    [ABORTED]: boolean;
      +    [DATALISTENERS]: number;
      +    [DISCARDED]: boolean;
      +    /**
      +     * true if the stream can be written
      +     */
      +    writable: boolean;
      +    /**
      +     * true if the stream can be read
      +     */
      +    readable: boolean;
      +    /**
      +     * If `RType` is Buffer, then options do not need to be provided.
      +     * Otherwise, an options object must be provided to specify either
      +     * {@link Minipass.SharedOptions.objectMode} or
      +     * {@link Minipass.SharedOptions.encoding}, as appropriate.
      +     */
      +    constructor(...args: [Minipass.ObjectModeOptions] | (RType extends Buffer ? [] | [Minipass.Options] : [Minipass.Options]));
      +    /**
      +     * The amount of data stored in the buffer waiting to be read.
      +     *
      +     * For Buffer strings, this will be the total byte length.
      +     * For string encoding streams, this will be the string character length,
      +     * according to JavaScript's `string.length` logic.
      +     * For objectMode streams, this is a count of the items waiting to be
      +     * emitted.
      +     */
      +    get bufferLength(): number;
      +    /**
      +     * The `BufferEncoding` currently in use, or `null`
      +     */
      +    get encoding(): BufferEncoding | null;
      +    /**
      +     * @deprecated - This is a read only property
      +     */
      +    set encoding(_enc: BufferEncoding | null);
      +    /**
      +     * @deprecated - Encoding may only be set at instantiation time
      +     */
      +    setEncoding(_enc: Minipass.Encoding): void;
      +    /**
      +     * True if this is an objectMode stream
      +     */
      +    get objectMode(): boolean;
      +    /**
      +     * @deprecated - This is a read-only property
      +     */
      +    set objectMode(_om: boolean);
      +    /**
      +     * true if this is an async stream
      +     */
      +    get ['async'](): boolean;
      +    /**
      +     * Set to true to make this stream async.
      +     *
      +     * Once set, it cannot be unset, as this would potentially cause incorrect
      +     * behavior.  Ie, a sync stream can be made async, but an async stream
      +     * cannot be safely made sync.
      +     */
      +    set ['async'](a: boolean);
      +    [ABORT](): void;
      +    /**
      +     * True if the stream has been aborted.
      +     */
      +    get aborted(): boolean;
      +    /**
      +     * No-op setter. Stream aborted status is set via the AbortSignal provided
      +     * in the constructor options.
      +     */
      +    set aborted(_: boolean);
      +    /**
      +     * Write data into the stream
      +     *
      +     * If the chunk written is a string, and encoding is not specified, then
      +     * `utf8` will be assumed. If the stream encoding matches the encoding of
      +     * a written string, and the state of the string decoder allows it, then
      +     * the string will be passed through to either the output or the internal
      +     * buffer without any processing. Otherwise, it will be turned into a
      +     * Buffer object for processing into the desired encoding.
      +     *
      +     * If provided, `cb` function is called immediately before return for
      +     * sync streams, or on next tick for async streams, because for this
      +     * base class, a chunk is considered "processed" once it is accepted
      +     * and either emitted or buffered. That is, the callback does not indicate
      +     * that the chunk has been eventually emitted, though of course child
      +     * classes can override this function to do whatever processing is required
      +     * and call `super.write(...)` only once processing is completed.
      +     */
      +    write(chunk: WType, cb?: () => void): boolean;
      +    write(chunk: WType, encoding?: Minipass.Encoding, cb?: () => void): boolean;
      +    /**
      +     * Low-level explicit read method.
      +     *
      +     * In objectMode, the argument is ignored, and one item is returned if
      +     * available.
      +     *
      +     * `n` is the number of bytes (or in the case of encoding streams,
      +     * characters) to consume. If `n` is not provided, then the entire buffer
      +     * is returned, or `null` is returned if no data is available.
      +     *
      +     * If `n` is greater that the amount of data in the internal buffer,
      +     * then `null` is returned.
      +     */
      +    read(n?: number | null): RType | null;
      +    [READ](n: number | null, chunk: RType): RType;
      +    /**
      +     * End the stream, optionally providing a final write.
      +     *
      +     * See {@link Minipass#write} for argument descriptions
      +     */
      +    end(cb?: () => void): this;
      +    end(chunk: WType, cb?: () => void): this;
      +    end(chunk: WType, encoding?: Minipass.Encoding, cb?: () => void): this;
      +    [RESUME](): void;
      +    /**
      +     * Resume the stream if it is currently in a paused state
      +     *
      +     * If called when there are no pipe destinations or `data` event listeners,
      +     * this will place the stream in a "discarded" state, where all data will
      +     * be thrown away. The discarded state is removed if a pipe destination or
      +     * data handler is added, if pause() is called, or if any synchronous or
      +     * asynchronous iteration is started.
      +     */
      +    resume(): void;
      +    /**
      +     * Pause the stream
      +     */
      +    pause(): void;
      +    /**
      +     * true if the stream has been forcibly destroyed
      +     */
      +    get destroyed(): boolean;
      +    /**
      +     * true if the stream is currently in a flowing state, meaning that
      +     * any writes will be immediately emitted.
      +     */
      +    get flowing(): boolean;
      +    /**
      +     * true if the stream is currently in a paused state
      +     */
      +    get paused(): boolean;
      +    [BUFFERPUSH](chunk: RType): void;
      +    [BUFFERSHIFT](): RType;
      +    [FLUSH](noDrain?: boolean): void;
      +    [FLUSHCHUNK](chunk: RType): boolean;
      +    /**
      +     * Pipe all data emitted by this stream into the destination provided.
      +     *
      +     * Triggers the flow of data.
      +     */
      +    pipe(dest: W, opts?: PipeOptions): W;
      +    /**
      +     * Fully unhook a piped destination stream.
      +     *
      +     * If the destination stream was the only consumer of this stream (ie,
      +     * there are no other piped destinations or `'data'` event listeners)
      +     * then the flow of data will stop until there is another consumer or
      +     * {@link Minipass#resume} is explicitly called.
      +     */
      +    unpipe(dest: W): void;
      +    /**
      +     * Alias for {@link Minipass#on}
      +     */
      +    addListener(ev: Event, handler: (...args: Events[Event]) => any): this;
      +    /**
      +     * Mostly identical to `EventEmitter.on`, with the following
      +     * behavior differences to prevent data loss and unnecessary hangs:
      +     *
      +     * - Adding a 'data' event handler will trigger the flow of data
      +     *
      +     * - Adding a 'readable' event handler when there is data waiting to be read
      +     *   will cause 'readable' to be emitted immediately.
      +     *
      +     * - Adding an 'endish' event handler ('end', 'finish', etc.) which has
      +     *   already passed will cause the event to be emitted immediately and all
      +     *   handlers removed.
      +     *
      +     * - Adding an 'error' event handler after an error has been emitted will
      +     *   cause the event to be re-emitted immediately with the error previously
      +     *   raised.
      +     */
      +    on(ev: Event, handler: (...args: Events[Event]) => any): this;
      +    /**
      +     * Alias for {@link Minipass#off}
      +     */
      +    removeListener(ev: Event, handler: (...args: Events[Event]) => any): this;
      +    /**
      +     * Mostly identical to `EventEmitter.off`
      +     *
      +     * If a 'data' event handler is removed, and it was the last consumer
      +     * (ie, there are no pipe destinations or other 'data' event listeners),
      +     * then the flow of data will stop until there is another consumer or
      +     * {@link Minipass#resume} is explicitly called.
      +     */
      +    off(ev: Event, handler: (...args: Events[Event]) => any): this;
      +    /**
      +     * Mostly identical to `EventEmitter.removeAllListeners`
      +     *
      +     * If all 'data' event handlers are removed, and they were the last consumer
      +     * (ie, there are no pipe destinations), then the flow of data will stop
      +     * until there is another consumer or {@link Minipass#resume} is explicitly
      +     * called.
      +     */
      +    removeAllListeners(ev?: Event): this;
      +    /**
      +     * true if the 'end' event has been emitted
      +     */
      +    get emittedEnd(): boolean;
      +    [MAYBE_EMIT_END](): void;
      +    /**
      +     * Mostly identical to `EventEmitter.emit`, with the following
      +     * behavior differences to prevent data loss and unnecessary hangs:
      +     *
      +     * If the stream has been destroyed, and the event is something other
      +     * than 'close' or 'error', then `false` is returned and no handlers
      +     * are called.
      +     *
      +     * If the event is 'end', and has already been emitted, then the event
      +     * is ignored. If the stream is in a paused or non-flowing state, then
      +     * the event will be deferred until data flow resumes. If the stream is
      +     * async, then handlers will be called on the next tick rather than
      +     * immediately.
      +     *
      +     * If the event is 'close', and 'end' has not yet been emitted, then
      +     * the event will be deferred until after 'end' is emitted.
      +     *
      +     * If the event is 'error', and an AbortSignal was provided for the stream,
      +     * and there are no listeners, then the event is ignored, matching the
      +     * behavior of node core streams in the presense of an AbortSignal.
      +     *
      +     * If the event is 'finish' or 'prefinish', then all listeners will be
      +     * removed after emitting the event, to prevent double-firing.
      +     */
      +    emit(ev: Event, ...args: Events[Event]): boolean;
      +    [EMITDATA](data: RType): boolean;
      +    [EMITEND](): boolean;
      +    [EMITEND2](): boolean;
      +    /**
      +     * Return a Promise that resolves to an array of all emitted data once
      +     * the stream ends.
      +     */
      +    collect(): Promise;
      +    /**
      +     * Return a Promise that resolves to the concatenation of all emitted data
      +     * once the stream ends.
      +     *
      +     * Not allowed on objectMode streams.
      +     */
      +    concat(): Promise;
      +    /**
      +     * Return a void Promise that resolves once the stream ends.
      +     */
      +    promise(): Promise;
      +    /**
      +     * Asynchronous `for await of` iteration.
      +     *
      +     * This will continue emitting all chunks until the stream terminates.
      +     */
      +    [Symbol.asyncIterator](): AsyncGenerator;
      +    /**
      +     * Synchronous `for of` iteration.
      +     *
      +     * The iteration will terminate when the internal buffer runs out, even
      +     * if the stream has not yet terminated.
      +     */
      +    [Symbol.iterator](): Generator;
      +    /**
      +     * Destroy a stream, preventing it from being used for any further purpose.
      +     *
      +     * If the stream has a `close()` method, then it will be called on
      +     * destruction.
      +     *
      +     * After destruction, any attempt to write data, read data, or emit most
      +     * events will be ignored.
      +     *
      +     * If an error argument is provided, then it will be emitted in an
      +     * 'error' event.
      +     */
      +    destroy(er?: unknown): this;
      +    /**
      +     * Alias for {@link isStream}
      +     *
      +     * Former export location, maintained for backwards compatibility.
      +     *
      +     * @deprecated
      +     */
      +    static get isStream(): (s: any) => s is Minipass | NodeJS.ReadStream | NodeJS.WriteStream | (EventEmitter & {
      +        end(): any;
      +        write(chunk: any, ...args: any[]): any;
      +    }) | (EventEmitter & {
      +        pause(): any;
      +        resume(): any;
      +        pipe(...destArgs: any[]): any;
      +    }) | (NodeJS.ReadStream & {
      +        fd: number;
      +    }) | (NodeJS.WriteStream & {
      +        fd: number;
      +    });
      +}
      +//# sourceMappingURL=index.d.ts.map
      \ No newline at end of file
      diff --git a/node_modules/minipass/dist/commonjs/index.d.ts.map b/node_modules/minipass/dist/commonjs/index.d.ts.map
      new file mode 100644
      index 00000000..7bce611b
      --- /dev/null
      +++ b/node_modules/minipass/dist/commonjs/index.d.ts.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD;;GAEG;AACH,KAAK,EAAE,GAAG,aAAa,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAA;AAE/C,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAA;AAEzC;;;GAGG;AACH,eAAO,MAAM,QAAQ;;;;;;;;;;;EAQH,CAAA;AAElB;;GAEG;AACH,eAAO,MAAM,UAAU,oCAM2C,CAAA;AAElE;;GAEG;AACH,eAAO,MAAM,UAAU,oCAK6B,CAAA;AAEpD,QAAA,MAAM,GAAG,eAAgB,CAAA;AACzB,QAAA,MAAM,cAAc,eAAyB,CAAA;AAC7C,QAAA,MAAM,WAAW,eAAuB,CAAA;AACxC,QAAA,MAAM,YAAY,eAAwB,CAAA;AAC1C,QAAA,MAAM,aAAa,eAAyB,CAAA;AAC5C,QAAA,MAAM,MAAM,eAAmB,CAAA;AAC/B,QAAA,MAAM,IAAI,eAAiB,CAAA;AAC3B,QAAA,MAAM,KAAK,eAAkB,CAAA;AAC7B,QAAA,MAAM,UAAU,eAAuB,CAAA;AACvC,QAAA,MAAM,QAAQ,eAAqB,CAAA;AACnC,QAAA,MAAM,OAAO,eAAoB,CAAA;AACjC,QAAA,MAAM,OAAO,eAAoB,CAAA;AACjC,QAAA,MAAM,MAAM,eAAmB,CAAA;AAC/B,QAAA,MAAM,MAAM,eAAmB,CAAA;AAC/B,QAAA,MAAM,MAAM,eAAmB,CAAA;AAC/B,QAAA,MAAM,KAAK,eAAkB,CAAA;AAC7B,QAAA,MAAM,YAAY,eAAyB,CAAA;AAC3C,QAAA,MAAM,UAAU,eAAuB,CAAA;AACvC,QAAA,MAAM,WAAW,eAAwB,CAAA;AACzC,QAAA,MAAM,UAAU,eAAuB,CAAA;AAEvC,QAAA,MAAM,SAAS,eAAsB,CAAA;AAErC,QAAA,MAAM,KAAK,eAAkB,CAAA;AAC7B,QAAA,MAAM,QAAQ,eAAqB,CAAA;AACnC,QAAA,MAAM,OAAO,eAAoB,CAAA;AACjC,QAAA,MAAM,QAAQ,eAAqB,CAAA;AACnC,QAAA,MAAM,KAAK,eAAkB,CAAA;AAC7B,QAAA,MAAM,KAAK,eAAkB,CAAA;AAC7B,QAAA,MAAM,OAAO,eAAoB,CAAA;AACjC,QAAA,MAAM,MAAM,eAAmB,CAAA;AAC/B,QAAA,MAAM,aAAa,eAA0B,CAAA;AAC7C,QAAA,MAAM,SAAS,eAAsB,CAAA;AAuBrC;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,GAAG,CAAC,EAAE,OAAO,CAAA;IACb;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED;;;;GAIG;AACH,cAAM,IAAI,CAAC,CAAC,SAAS,OAAO;IAC1B,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;IAChB,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;IACtB,IAAI,EAAE,WAAW,CAAA;IACjB,OAAO,EAAE,MAAM,GAAG,CAAA;IAClB,YACE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,EAChB,IAAI,EAAE,QAAQ,CAAC,QAAQ,EACvB,IAAI,EAAE,WAAW,EAOlB;IACD,MAAM,SAEL;IAGD,WAAW,CAAC,GAAG,EAAE,GAAG,QAAI;IAExB,GAAG,SAGF;CACF;AAED;;;;;GAKG;AACH,cAAM,eAAe,CAAC,CAAC,CAAE,SAAQ,IAAI,CAAC,CAAC,CAAC;IACtC,MAAM,SAGL;IACD,YACE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,EAChB,IAAI,EAAE,QAAQ,CAAC,QAAQ,EACvB,IAAI,EAAE,WAAW,EAKlB;CACF;AAED,yBAAiB,QAAQ,CAAC,CAAC;IACzB;;;OAGG;IACH,MAAM,MAAM,QAAQ,GAAG,cAAc,GAAG,QAAQ,GAAG,IAAI,CAAA;IAEvD;;OAEG;IACH,MAAM,MAAM,QAAQ,GAChB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GACvB,MAAM,CAAC,WAAW,GAClB,CAAC,MAAM,CAAC,WAAW,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,GACrC,CAAC,YAAY,GAAG;QACd,GAAG,IAAI,GAAG,CAAA;QACV,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAAA;KACvC,CAAC,CAAA;IAEN;;OAEG;IACH,MAAM,MAAM,QAAQ,GAChB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GACvB,MAAM,CAAC,UAAU,GACjB,CAAC,MAAM,CAAC,UAAU,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,GACpC,CAAC,YAAY,GAAG;QACd,KAAK,IAAI,GAAG,CAAA;QACZ,MAAM,IAAI,GAAG,CAAA;QACb,IAAI,CAAC,GAAG,QAAQ,EAAE,GAAG,EAAE,GAAG,GAAG,CAAA;KAC9B,CAAC,CAAA;IAEN;;OAEG;IACH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;IAE5D,KAAK,cAAc,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;IAExD;;;;;;;;OAQG;IACH,MAAM,WAAW,MAAM,CAAC,KAAK,SAAS,GAAG,GAAG,MAAM,CAChD,SAAQ,cAAc;QACtB,QAAQ,EAAE,EAAE,CAAA;QACZ,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;QACpB,KAAK,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;QACpB,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACxB,KAAK,EAAE,EAAE,CAAA;QACT,MAAM,EAAE,EAAE,CAAA;QACV,GAAG,EAAE,EAAE,CAAA;QACP,MAAM,EAAE,EAAE,CAAA;QACV,SAAS,EAAE,EAAE,CAAA;QACb,KAAK,EAAE,EAAE,CAAA;QACT,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAA;QAC3B,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;KACvB;IAED;;OAEG;IACH,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,eAAe,GACf,eAAe,GACf,MAAM,CAAA;IACV,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,CAAA;IAE5C;;OAEG;IACH,MAAM,MAAM,aAAa,GAAG;QAC1B;;;WAGG;QACH,KAAK,CAAC,EAAE,OAAO,CAAA;QACf;;WAEG;QACH,MAAM,CAAC,EAAE,WAAW,CAAA;QACpB;;;;;WAKG;QACH,QAAQ,CAAC,EAAE,cAAc,GAAG,IAAI,GAAG,QAAQ,CAAA;QAC3C;;;;;WAKG;QACH,UAAU,CAAC,EAAE,OAAO,CAAA;KACrB,CAAA;IAED;;OAEG;IACH,MAAM,MAAM,eAAe,GAAG,aAAa,GAAG;QAC5C,QAAQ,EAAE,cAAc,CAAA;QACxB,UAAU,CAAC,EAAE,KAAK,CAAA;KACnB,CAAA;IAED;;OAEG;IACH,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG;QAC1C,QAAQ,CAAC,EAAE,IAAI,GAAG,QAAQ,CAAA;QAC1B,UAAU,CAAC,EAAE,KAAK,CAAA;KACnB,CAAA;IAED;;OAEG;IACH,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG;QAC9C,UAAU,EAAE,IAAI,CAAA;QAChB,QAAQ,CAAC,EAAE,IAAI,CAAA;KAChB,CAAA;IAED;;OAEG;IACH,MAAM,MAAM,OAAO,CAAC,CAAC,IACjB,iBAAiB,GACjB,CAAC,CAAC,SAAS,MAAM,GACb,eAAe,GACf,CAAC,SAAS,MAAM,GAChB,aAAa,GACb,aAAa,CAAC,CAAA;;CACvB;AAWD;;;;;;;;;;GAUG;AACH,qBAAa,QAAQ,CACjB,KAAK,SAAS,OAAO,GAAG,MAAM,EAC9B,KAAK,SAAS,OAAO,GAAG,KAAK,SAAS,QAAQ,CAAC,cAAc,GACzD,QAAQ,CAAC,cAAc,GACvB,KAAK,EACT,MAAM,SAAS,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAEhE,SAAQ,YACR,YAAW,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC;IAEvC,CAAC,OAAO,CAAC,EAAE,OAAO,CAAS;IAC3B,CAAC,MAAM,CAAC,EAAE,OAAO,CAAS;IAC1B,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAM;IAC5B,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAM;IACvB,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IACtB,CAAC,QAAQ,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAClC,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACjB,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC;IACrB,CAAC,GAAG,CAAC,EAAE,OAAO,CAAS;IACvB,CAAC,WAAW,CAAC,EAAE,OAAO,CAAS;IAC/B,CAAC,YAAY,CAAC,EAAE,OAAO,CAAS;IAChC,CAAC,MAAM,CAAC,EAAE,OAAO,CAAS;IAC1B,CAAC,aAAa,CAAC,EAAE,OAAO,CAAQ;IAChC,CAAC,YAAY,CAAC,EAAE,MAAM,CAAK;IAC3B,CAAC,SAAS,CAAC,EAAE,OAAO,CAAS;IAC7B,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC;IACvB,CAAC,OAAO,CAAC,EAAE,OAAO,CAAS;IAC3B,CAAC,aAAa,CAAC,EAAE,MAAM,CAAK;IAC5B,CAAC,SAAS,CAAC,EAAE,OAAO,CAAQ;IAE5B;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAO;IACxB;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAO;IAExB;;;;;OAKG;IACH,YACE,GAAG,IAAI,EACH,CAAC,QAAQ,CAAC,iBAAiB,CAAC,GAC5B,CAAC,KAAK,SAAS,MAAM,GACjB,EAAE,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAC9B,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EA2CnC;IAED;;;;;;;;OAQG;IACH,IAAI,YAAY,WAEf;IAED;;OAEG;IACH,IAAI,QAAQ,0BAEX;IAED;;OAEG;IACH,IAAI,QAAQ,CAAC,IAAI,uBAAA,EAEhB;IAED;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,QAElC;IAED;;OAEG;IACH,IAAI,UAAU,YAEb;IAED;;OAEG;IACH,IAAI,UAAU,CAAC,GAAG,SAAA,EAEjB;IAED;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,CAEvB;IACD;;;;;;OAMG;IACH,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAEvB;IAGD,CAAC,KAAK,CAAC,SAIN;IAED;;OAEG;IACH,IAAI,OAAO,YAEV;IACD;;;OAGG;IACH,IAAI,OAAO,CAAC,CAAC,SAAA,EAAI;IAEjB;;;;;;;;;;;;;;;;;OAiBG;IACH,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAA;IAC7C,KAAK,CACH,KAAK,EAAE,KAAK,EACZ,QAAQ,CAAC,EAAE,QAAQ,CAAC,QAAQ,EAC5B,EAAE,CAAC,EAAE,MAAM,IAAI,GACd,OAAO,CAAA;IA0GV;;;;;;;;;;;;OAYG;IACH,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,CA+BpC;IAED,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,SAqBpC;IAED;;;;OAIG;IACH,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;IAC1B,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;IACxC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;IA4BtE,CAAC,MAAM,CAAC,SAYP;IAED;;;;;;;;OAQG;IACH,MAAM,SAEL;IAED;;OAEG;IACH,KAAK,SAIJ;IAED;;OAEG;IACH,IAAI,SAAS,YAEZ;IAED;;;OAGG;IACH,IAAI,OAAO,YAEV;IAED;;OAEG;IACH,IAAI,MAAM,YAET;IAED,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,KAAK,QAIxB;IAED,CAAC,WAAW,CAAC,IAAI,KAAK,CAOrB;IAED,CAAC,KAAK,CAAC,CAAC,OAAO,GAAE,OAAe,QAO/B;IAED,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,KAAK,WAGxB;IAED;;;;OAIG;IACH,IAAI,CAAC,CAAC,SAAS,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,CAAC,CA0BhE;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,CAAC,SAAS,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,QAW1C;IAED;;OAEG;IACH,WAAW,CAAC,KAAK,SAAS,MAAM,MAAM,EACpC,EAAE,EAAE,KAAK,EACT,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,GACvC,IAAI,CAEN;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,EAAE,CAAC,KAAK,SAAS,MAAM,MAAM,EAC3B,EAAE,EAAE,KAAK,EACT,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,GACvC,IAAI,CAsBN;IAED;;OAEG;IACH,cAAc,CAAC,KAAK,SAAS,MAAM,MAAM,EACvC,EAAE,EAAE,KAAK,EACT,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,QAGzC;IAED;;;;;;;OAOG;IACH,GAAG,CAAC,KAAK,SAAS,MAAM,MAAM,EAC5B,EAAE,EAAE,KAAK,EACT,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,QAoBzC;IAED;;;;;;;OAOG;IACH,kBAAkB,CAAC,KAAK,SAAS,MAAM,MAAM,EAAE,EAAE,CAAC,EAAE,KAAK,QASxD;IAED;;OAEG;IACH,IAAI,UAAU,YAEb;IAED,CAAC,cAAc,CAAC,SAef;IAED;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,IAAI,CAAC,KAAK,SAAS,MAAM,MAAM,EAC7B,EAAE,EAAE,KAAK,EACT,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,GACrB,OAAO,CAgDT;IAED,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,KAAK,WAOrB;IAED,CAAC,OAAO,CAAC,YAQR;IAED,CAAC,QAAQ,CAAC,YAiBT;IAED;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,GAAG;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAezD;IAED;;;;;OAKG;IACG,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,CAU7B;IAED;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAM7B;IAED;;;;OAIG;IACH,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CA4D1D;IAED;;;;;OAKG;IACH,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAiChD;IAED;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,QAwBnB;IAED;;;;;;OAMG;IACH,MAAM,KAAK,QAAQ;;;;;;;;;;;OAElB;CACF","sourcesContent":["const proc =\n  typeof process === 'object' && process\n    ? process\n    : {\n        stdout: null,\n        stderr: null,\n      }\nimport { EventEmitter } from 'node:events'\nimport Stream from 'node:stream'\nimport { StringDecoder } from 'node:string_decoder'\n\n/**\n * Same as StringDecoder, but exposing the `lastNeed` flag on the type\n */\ntype SD = StringDecoder & { lastNeed: boolean }\n\nexport type { SD, Pipe, PipeProxyErrors }\n\n/**\n * Return true if the argument is a Minipass stream, Node stream, or something\n * else that Minipass can interact with.\n */\nexport const isStream = (\n  s: any\n): s is Minipass.Readable | Minipass.Writable =>\n  !!s &&\n  typeof s === 'object' &&\n  (s instanceof Minipass ||\n    s instanceof Stream ||\n    isReadable(s) ||\n    isWritable(s))\n\n/**\n * Return true if the argument is a valid {@link Minipass.Readable}\n */\nexport const isReadable = (s: any): s is Minipass.Readable =>\n  !!s &&\n  typeof s === 'object' &&\n  s instanceof EventEmitter &&\n  typeof (s as Minipass.Readable).pipe === 'function' &&\n  // node core Writable streams have a pipe() method, but it throws\n  (s as Minipass.Readable).pipe !== Stream.Writable.prototype.pipe\n\n/**\n * Return true if the argument is a valid {@link Minipass.Writable}\n */\nexport const isWritable = (s: any): s is Minipass.Readable =>\n  !!s &&\n  typeof s === 'object' &&\n  s instanceof EventEmitter &&\n  typeof (s as Minipass.Writable).write === 'function' &&\n  typeof (s as Minipass.Writable).end === 'function'\n\nconst EOF = Symbol('EOF')\nconst MAYBE_EMIT_END = Symbol('maybeEmitEnd')\nconst EMITTED_END = Symbol('emittedEnd')\nconst EMITTING_END = Symbol('emittingEnd')\nconst EMITTED_ERROR = Symbol('emittedError')\nconst CLOSED = Symbol('closed')\nconst READ = Symbol('read')\nconst FLUSH = Symbol('flush')\nconst FLUSHCHUNK = Symbol('flushChunk')\nconst ENCODING = Symbol('encoding')\nconst DECODER = Symbol('decoder')\nconst FLOWING = Symbol('flowing')\nconst PAUSED = Symbol('paused')\nconst RESUME = Symbol('resume')\nconst BUFFER = Symbol('buffer')\nconst PIPES = Symbol('pipes')\nconst BUFFERLENGTH = Symbol('bufferLength')\nconst BUFFERPUSH = Symbol('bufferPush')\nconst BUFFERSHIFT = Symbol('bufferShift')\nconst OBJECTMODE = Symbol('objectMode')\n// internal event when stream is destroyed\nconst DESTROYED = Symbol('destroyed')\n// internal event when stream has an error\nconst ERROR = Symbol('error')\nconst EMITDATA = Symbol('emitData')\nconst EMITEND = Symbol('emitEnd')\nconst EMITEND2 = Symbol('emitEnd2')\nconst ASYNC = Symbol('async')\nconst ABORT = Symbol('abort')\nconst ABORTED = Symbol('aborted')\nconst SIGNAL = Symbol('signal')\nconst DATALISTENERS = Symbol('dataListeners')\nconst DISCARDED = Symbol('discarded')\n\nconst defer = (fn: (...a: any[]) => any) => Promise.resolve().then(fn)\nconst nodefer = (fn: (...a: any[]) => any) => fn()\n\n// events that mean 'the stream is over'\n// these are treated specially, and re-emitted\n// if they are listened for after emitting.\ntype EndishEvent = 'end' | 'finish' | 'prefinish'\nconst isEndish = (ev: any): ev is EndishEvent =>\n  ev === 'end' || ev === 'finish' || ev === 'prefinish'\n\nconst isArrayBufferLike = (b: any): b is ArrayBufferLike =>\n  b instanceof ArrayBuffer ||\n  (!!b &&\n    typeof b === 'object' &&\n    b.constructor &&\n    b.constructor.name === 'ArrayBuffer' &&\n    b.byteLength >= 0)\n\nconst isArrayBufferView = (b: any): b is ArrayBufferView =>\n  !Buffer.isBuffer(b) && ArrayBuffer.isView(b)\n\n/**\n * Options that may be passed to stream.pipe()\n */\nexport interface PipeOptions {\n  /**\n   * end the destination stream when the source stream ends\n   */\n  end?: boolean\n  /**\n   * proxy errors from the source stream to the destination stream\n   */\n  proxyErrors?: boolean\n}\n\n/**\n * Internal class representing a pipe to a destination stream.\n *\n * @internal\n */\nclass Pipe {\n  src: Minipass\n  dest: Minipass\n  opts: PipeOptions\n  ondrain: () => any\n  constructor(\n    src: Minipass,\n    dest: Minipass.Writable,\n    opts: PipeOptions\n  ) {\n    this.src = src\n    this.dest = dest as Minipass\n    this.opts = opts\n    this.ondrain = () => src[RESUME]()\n    this.dest.on('drain', this.ondrain)\n  }\n  unpipe() {\n    this.dest.removeListener('drain', this.ondrain)\n  }\n  // only here for the prototype\n  /* c8 ignore start */\n  proxyErrors(_er: any) {}\n  /* c8 ignore stop */\n  end() {\n    this.unpipe()\n    if (this.opts.end) this.dest.end()\n  }\n}\n\n/**\n * Internal class representing a pipe to a destination stream where\n * errors are proxied.\n *\n * @internal\n */\nclass PipeProxyErrors extends Pipe {\n  unpipe() {\n    this.src.removeListener('error', this.proxyErrors)\n    super.unpipe()\n  }\n  constructor(\n    src: Minipass,\n    dest: Minipass.Writable,\n    opts: PipeOptions\n  ) {\n    super(src, dest, opts)\n    this.proxyErrors = (er: Error) => this.dest.emit('error', er)\n    src.on('error', this.proxyErrors)\n  }\n}\n\nexport namespace Minipass {\n  /**\n   * Encoding used to create a stream that outputs strings rather than\n   * Buffer objects.\n   */\n  export type Encoding = BufferEncoding | 'buffer' | null\n\n  /**\n   * Any stream that Minipass can pipe into\n   */\n  export type Writable =\n    | Minipass\n    | NodeJS.WriteStream\n    | (NodeJS.WriteStream & { fd: number })\n    | (EventEmitter & {\n        end(): any\n        write(chunk: any, ...args: any[]): any\n      })\n\n  /**\n   * Any stream that can be read from\n   */\n  export type Readable =\n    | Minipass\n    | NodeJS.ReadStream\n    | (NodeJS.ReadStream & { fd: number })\n    | (EventEmitter & {\n        pause(): any\n        resume(): any\n        pipe(...destArgs: any[]): any\n      })\n\n  /**\n   * Utility type that can be iterated sync or async\n   */\n  export type DualIterable = Iterable & AsyncIterable\n\n  type EventArguments = Record\n\n  /**\n   * The listing of events that a Minipass class can emit.\n   * Extend this when extending the Minipass class, and pass as\n   * the third template argument.  The key is the name of the event,\n   * and the value is the argument list.\n   *\n   * Any undeclared events will still be allowed, but the handler will get\n   * arguments as `unknown[]`.\n   */\n  export interface Events\n    extends EventArguments {\n    readable: []\n    data: [chunk: RType]\n    error: [er: unknown]\n    abort: [reason: unknown]\n    drain: []\n    resume: []\n    end: []\n    finish: []\n    prefinish: []\n    close: []\n    [DESTROYED]: [er?: unknown]\n    [ERROR]: [er: unknown]\n  }\n\n  /**\n   * String or buffer-like data that can be joined and sliced\n   */\n  export type ContiguousData =\n    | Buffer\n    | ArrayBufferLike\n    | ArrayBufferView\n    | string\n  export type BufferOrString = Buffer | string\n\n  /**\n   * Options passed to the Minipass constructor.\n   */\n  export type SharedOptions = {\n    /**\n     * Defer all data emission and other events until the end of the\n     * current tick, similar to Node core streams\n     */\n    async?: boolean\n    /**\n     * A signal which will abort the stream\n     */\n    signal?: AbortSignal\n    /**\n     * Output string encoding. Set to `null` or `'buffer'` (or omit) to\n     * emit Buffer objects rather than strings.\n     *\n     * Conflicts with `objectMode`\n     */\n    encoding?: BufferEncoding | null | 'buffer'\n    /**\n     * Output data exactly as it was written, supporting non-buffer/string\n     * data (such as arbitrary objects, falsey values, etc.)\n     *\n     * Conflicts with `encoding`\n     */\n    objectMode?: boolean\n  }\n\n  /**\n   * Options for a string encoded output\n   */\n  export type EncodingOptions = SharedOptions & {\n    encoding: BufferEncoding\n    objectMode?: false\n  }\n\n  /**\n   * Options for contiguous data buffer output\n   */\n  export type BufferOptions = SharedOptions & {\n    encoding?: null | 'buffer'\n    objectMode?: false\n  }\n\n  /**\n   * Options for objectMode arbitrary output\n   */\n  export type ObjectModeOptions = SharedOptions & {\n    objectMode: true\n    encoding?: null\n  }\n\n  /**\n   * Utility type to determine allowed options based on read type\n   */\n  export type Options =\n    | ObjectModeOptions\n    | (T extends string\n        ? EncodingOptions\n        : T extends Buffer\n        ? BufferOptions\n        : SharedOptions)\n}\n\nconst isObjectModeOptions = (\n  o: Minipass.SharedOptions\n): o is Minipass.ObjectModeOptions => !!o.objectMode\n\nconst isEncodingOptions = (\n  o: Minipass.SharedOptions\n): o is Minipass.EncodingOptions =>\n  !o.objectMode && !!o.encoding && o.encoding !== 'buffer'\n\n/**\n * Main export, the Minipass class\n *\n * `RType` is the type of data emitted, defaults to Buffer\n *\n * `WType` is the type of data to be written, if RType is buffer or string,\n * then any {@link Minipass.ContiguousData} is allowed.\n *\n * `Events` is the set of event handler signatures that this object\n * will emit, see {@link Minipass.Events}\n */\nexport class Minipass<\n    RType extends unknown = Buffer,\n    WType extends unknown = RType extends Minipass.BufferOrString\n      ? Minipass.ContiguousData\n      : RType,\n    Events extends Minipass.Events = Minipass.Events\n  >\n  extends EventEmitter\n  implements Minipass.DualIterable\n{\n  [FLOWING]: boolean = false;\n  [PAUSED]: boolean = false;\n  [PIPES]: Pipe[] = [];\n  [BUFFER]: RType[] = [];\n  [OBJECTMODE]: boolean;\n  [ENCODING]: BufferEncoding | null;\n  [ASYNC]: boolean;\n  [DECODER]: SD | null;\n  [EOF]: boolean = false;\n  [EMITTED_END]: boolean = false;\n  [EMITTING_END]: boolean = false;\n  [CLOSED]: boolean = false;\n  [EMITTED_ERROR]: unknown = null;\n  [BUFFERLENGTH]: number = 0;\n  [DESTROYED]: boolean = false;\n  [SIGNAL]?: AbortSignal;\n  [ABORTED]: boolean = false;\n  [DATALISTENERS]: number = 0;\n  [DISCARDED]: boolean = false\n\n  /**\n   * true if the stream can be written\n   */\n  writable: boolean = true\n  /**\n   * true if the stream can be read\n   */\n  readable: boolean = true\n\n  /**\n   * If `RType` is Buffer, then options do not need to be provided.\n   * Otherwise, an options object must be provided to specify either\n   * {@link Minipass.SharedOptions.objectMode} or\n   * {@link Minipass.SharedOptions.encoding}, as appropriate.\n   */\n  constructor(\n    ...args:\n      | [Minipass.ObjectModeOptions]\n      | (RType extends Buffer\n          ? [] | [Minipass.Options]\n          : [Minipass.Options])\n  ) {\n    const options: Minipass.Options = (args[0] ||\n      {}) as Minipass.Options\n    super()\n    if (options.objectMode && typeof options.encoding === 'string') {\n      throw new TypeError(\n        'Encoding and objectMode may not be used together'\n      )\n    }\n    if (isObjectModeOptions(options)) {\n      this[OBJECTMODE] = true\n      this[ENCODING] = null\n    } else if (isEncodingOptions(options)) {\n      this[ENCODING] = options.encoding\n      this[OBJECTMODE] = false\n    } else {\n      this[OBJECTMODE] = false\n      this[ENCODING] = null\n    }\n    this[ASYNC] = !!options.async\n    this[DECODER] = this[ENCODING]\n      ? (new StringDecoder(this[ENCODING]) as SD)\n      : null\n\n    //@ts-ignore - private option for debugging and testing\n    if (options && options.debugExposeBuffer === true) {\n      Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] })\n    }\n    //@ts-ignore - private option for debugging and testing\n    if (options && options.debugExposePipes === true) {\n      Object.defineProperty(this, 'pipes', { get: () => this[PIPES] })\n    }\n\n    const { signal } = options\n    if (signal) {\n      this[SIGNAL] = signal\n      if (signal.aborted) {\n        this[ABORT]()\n      } else {\n        signal.addEventListener('abort', () => this[ABORT]())\n      }\n    }\n  }\n\n  /**\n   * The amount of data stored in the buffer waiting to be read.\n   *\n   * For Buffer strings, this will be the total byte length.\n   * For string encoding streams, this will be the string character length,\n   * according to JavaScript's `string.length` logic.\n   * For objectMode streams, this is a count of the items waiting to be\n   * emitted.\n   */\n  get bufferLength() {\n    return this[BUFFERLENGTH]\n  }\n\n  /**\n   * The `BufferEncoding` currently in use, or `null`\n   */\n  get encoding() {\n    return this[ENCODING]\n  }\n\n  /**\n   * @deprecated - This is a read only property\n   */\n  set encoding(_enc) {\n    throw new Error('Encoding must be set at instantiation time')\n  }\n\n  /**\n   * @deprecated - Encoding may only be set at instantiation time\n   */\n  setEncoding(_enc: Minipass.Encoding) {\n    throw new Error('Encoding must be set at instantiation time')\n  }\n\n  /**\n   * True if this is an objectMode stream\n   */\n  get objectMode() {\n    return this[OBJECTMODE]\n  }\n\n  /**\n   * @deprecated - This is a read-only property\n   */\n  set objectMode(_om) {\n    throw new Error('objectMode must be set at instantiation time')\n  }\n\n  /**\n   * true if this is an async stream\n   */\n  get ['async'](): boolean {\n    return this[ASYNC]\n  }\n  /**\n   * Set to true to make this stream async.\n   *\n   * Once set, it cannot be unset, as this would potentially cause incorrect\n   * behavior.  Ie, a sync stream can be made async, but an async stream\n   * cannot be safely made sync.\n   */\n  set ['async'](a: boolean) {\n    this[ASYNC] = this[ASYNC] || !!a\n  }\n\n  // drop everything and get out of the flow completely\n  [ABORT]() {\n    this[ABORTED] = true\n    this.emit('abort', this[SIGNAL]?.reason)\n    this.destroy(this[SIGNAL]?.reason)\n  }\n\n  /**\n   * True if the stream has been aborted.\n   */\n  get aborted() {\n    return this[ABORTED]\n  }\n  /**\n   * No-op setter. Stream aborted status is set via the AbortSignal provided\n   * in the constructor options.\n   */\n  set aborted(_) {}\n\n  /**\n   * Write data into the stream\n   *\n   * If the chunk written is a string, and encoding is not specified, then\n   * `utf8` will be assumed. If the stream encoding matches the encoding of\n   * a written string, and the state of the string decoder allows it, then\n   * the string will be passed through to either the output or the internal\n   * buffer without any processing. Otherwise, it will be turned into a\n   * Buffer object for processing into the desired encoding.\n   *\n   * If provided, `cb` function is called immediately before return for\n   * sync streams, or on next tick for async streams, because for this\n   * base class, a chunk is considered \"processed\" once it is accepted\n   * and either emitted or buffered. That is, the callback does not indicate\n   * that the chunk has been eventually emitted, though of course child\n   * classes can override this function to do whatever processing is required\n   * and call `super.write(...)` only once processing is completed.\n   */\n  write(chunk: WType, cb?: () => void): boolean\n  write(\n    chunk: WType,\n    encoding?: Minipass.Encoding,\n    cb?: () => void\n  ): boolean\n  write(\n    chunk: WType,\n    encoding?: Minipass.Encoding | (() => void),\n    cb?: () => void\n  ): boolean {\n    if (this[ABORTED]) return false\n    if (this[EOF]) throw new Error('write after end')\n\n    if (this[DESTROYED]) {\n      this.emit(\n        'error',\n        Object.assign(\n          new Error('Cannot call write after a stream was destroyed'),\n          { code: 'ERR_STREAM_DESTROYED' }\n        )\n      )\n      return true\n    }\n\n    if (typeof encoding === 'function') {\n      cb = encoding\n      encoding = 'utf8'\n    }\n\n    if (!encoding) encoding = 'utf8'\n\n    const fn = this[ASYNC] ? defer : nodefer\n\n    // convert array buffers and typed array views into buffers\n    // at some point in the future, we may want to do the opposite!\n    // leave strings and buffers as-is\n    // anything is only allowed if in object mode, so throw\n    if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) {\n      if (isArrayBufferView(chunk)) {\n        //@ts-ignore - sinful unsafe type changing\n        chunk = Buffer.from(\n          chunk.buffer,\n          chunk.byteOffset,\n          chunk.byteLength\n        )\n      } else if (isArrayBufferLike(chunk)) {\n        //@ts-ignore - sinful unsafe type changing\n        chunk = Buffer.from(chunk)\n      } else if (typeof chunk !== 'string') {\n        throw new Error(\n          'Non-contiguous data written to non-objectMode stream'\n        )\n      }\n    }\n\n    // handle object mode up front, since it's simpler\n    // this yields better performance, fewer checks later.\n    if (this[OBJECTMODE]) {\n      // maybe impossible?\n      /* c8 ignore start */\n      if (this[FLOWING] && this[BUFFERLENGTH] !== 0) this[FLUSH](true)\n      /* c8 ignore stop */\n\n      if (this[FLOWING]) this.emit('data', chunk as unknown as RType)\n      else this[BUFFERPUSH](chunk as unknown as RType)\n\n      if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n\n      if (cb) fn(cb)\n\n      return this[FLOWING]\n    }\n\n    // at this point the chunk is a buffer or string\n    // don't buffer it up or send it to the decoder\n    if (!(chunk as Minipass.BufferOrString).length) {\n      if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n      if (cb) fn(cb)\n      return this[FLOWING]\n    }\n\n    // fast-path writing strings of same encoding to a stream with\n    // an empty buffer, skipping the buffer/decoder dance\n    if (\n      typeof chunk === 'string' &&\n      // unless it is a string already ready for us to use\n      !(encoding === this[ENCODING] && !this[DECODER]?.lastNeed)\n    ) {\n      //@ts-ignore - sinful unsafe type change\n      chunk = Buffer.from(chunk, encoding)\n    }\n\n    if (Buffer.isBuffer(chunk) && this[ENCODING]) {\n      //@ts-ignore - sinful unsafe type change\n      chunk = this[DECODER].write(chunk)\n    }\n\n    // Note: flushing CAN potentially switch us into not-flowing mode\n    if (this[FLOWING] && this[BUFFERLENGTH] !== 0) this[FLUSH](true)\n\n    if (this[FLOWING]) this.emit('data', chunk as unknown as RType)\n    else this[BUFFERPUSH](chunk as unknown as RType)\n\n    if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n\n    if (cb) fn(cb)\n\n    return this[FLOWING]\n  }\n\n  /**\n   * Low-level explicit read method.\n   *\n   * In objectMode, the argument is ignored, and one item is returned if\n   * available.\n   *\n   * `n` is the number of bytes (or in the case of encoding streams,\n   * characters) to consume. If `n` is not provided, then the entire buffer\n   * is returned, or `null` is returned if no data is available.\n   *\n   * If `n` is greater that the amount of data in the internal buffer,\n   * then `null` is returned.\n   */\n  read(n?: number | null): RType | null {\n    if (this[DESTROYED]) return null\n    this[DISCARDED] = false\n\n    if (\n      this[BUFFERLENGTH] === 0 ||\n      n === 0 ||\n      (n && n > this[BUFFERLENGTH])\n    ) {\n      this[MAYBE_EMIT_END]()\n      return null\n    }\n\n    if (this[OBJECTMODE]) n = null\n\n    if (this[BUFFER].length > 1 && !this[OBJECTMODE]) {\n      // not object mode, so if we have an encoding, then RType is string\n      // otherwise, must be Buffer\n      this[BUFFER] = [\n        (this[ENCODING]\n          ? this[BUFFER].join('')\n          : Buffer.concat(\n              this[BUFFER] as Buffer[],\n              this[BUFFERLENGTH]\n            )) as RType,\n      ]\n    }\n\n    const ret = this[READ](n || null, this[BUFFER][0] as RType)\n    this[MAYBE_EMIT_END]()\n    return ret\n  }\n\n  [READ](n: number | null, chunk: RType) {\n    if (this[OBJECTMODE]) this[BUFFERSHIFT]()\n    else {\n      const c = chunk as Minipass.BufferOrString\n      if (n === c.length || n === null) this[BUFFERSHIFT]()\n      else if (typeof c === 'string') {\n        this[BUFFER][0] = c.slice(n) as RType\n        chunk = c.slice(0, n) as RType\n        this[BUFFERLENGTH] -= n\n      } else {\n        this[BUFFER][0] = c.subarray(n) as RType\n        chunk = c.subarray(0, n) as RType\n        this[BUFFERLENGTH] -= n\n      }\n    }\n\n    this.emit('data', chunk)\n\n    if (!this[BUFFER].length && !this[EOF]) this.emit('drain')\n\n    return chunk\n  }\n\n  /**\n   * End the stream, optionally providing a final write.\n   *\n   * See {@link Minipass#write} for argument descriptions\n   */\n  end(cb?: () => void): this\n  end(chunk: WType, cb?: () => void): this\n  end(chunk: WType, encoding?: Minipass.Encoding, cb?: () => void): this\n  end(\n    chunk?: WType | (() => void),\n    encoding?: Minipass.Encoding | (() => void),\n    cb?: () => void\n  ): this {\n    if (typeof chunk === 'function') {\n      cb = chunk as () => void\n      chunk = undefined\n    }\n    if (typeof encoding === 'function') {\n      cb = encoding\n      encoding = 'utf8'\n    }\n    if (chunk !== undefined) this.write(chunk, encoding)\n    if (cb) this.once('end', cb)\n    this[EOF] = true\n    this.writable = false\n\n    // if we haven't written anything, then go ahead and emit,\n    // even if we're not reading.\n    // we'll re-emit if a new 'end' listener is added anyway.\n    // This makes MP more suitable to write-only use cases.\n    if (this[FLOWING] || !this[PAUSED]) this[MAYBE_EMIT_END]()\n    return this\n  }\n\n  // don't let the internal resume be overwritten\n  [RESUME]() {\n    if (this[DESTROYED]) return\n\n    if (!this[DATALISTENERS] && !this[PIPES].length) {\n      this[DISCARDED] = true\n    }\n    this[PAUSED] = false\n    this[FLOWING] = true\n    this.emit('resume')\n    if (this[BUFFER].length) this[FLUSH]()\n    else if (this[EOF]) this[MAYBE_EMIT_END]()\n    else this.emit('drain')\n  }\n\n  /**\n   * Resume the stream if it is currently in a paused state\n   *\n   * If called when there are no pipe destinations or `data` event listeners,\n   * this will place the stream in a \"discarded\" state, where all data will\n   * be thrown away. The discarded state is removed if a pipe destination or\n   * data handler is added, if pause() is called, or if any synchronous or\n   * asynchronous iteration is started.\n   */\n  resume() {\n    return this[RESUME]()\n  }\n\n  /**\n   * Pause the stream\n   */\n  pause() {\n    this[FLOWING] = false\n    this[PAUSED] = true\n    this[DISCARDED] = false\n  }\n\n  /**\n   * true if the stream has been forcibly destroyed\n   */\n  get destroyed() {\n    return this[DESTROYED]\n  }\n\n  /**\n   * true if the stream is currently in a flowing state, meaning that\n   * any writes will be immediately emitted.\n   */\n  get flowing() {\n    return this[FLOWING]\n  }\n\n  /**\n   * true if the stream is currently in a paused state\n   */\n  get paused() {\n    return this[PAUSED]\n  }\n\n  [BUFFERPUSH](chunk: RType) {\n    if (this[OBJECTMODE]) this[BUFFERLENGTH] += 1\n    else this[BUFFERLENGTH] += (chunk as Minipass.BufferOrString).length\n    this[BUFFER].push(chunk)\n  }\n\n  [BUFFERSHIFT](): RType {\n    if (this[OBJECTMODE]) this[BUFFERLENGTH] -= 1\n    else\n      this[BUFFERLENGTH] -= (\n        this[BUFFER][0] as Minipass.BufferOrString\n      ).length\n    return this[BUFFER].shift() as RType\n  }\n\n  [FLUSH](noDrain: boolean = false) {\n    do {} while (\n      this[FLUSHCHUNK](this[BUFFERSHIFT]()) &&\n      this[BUFFER].length\n    )\n\n    if (!noDrain && !this[BUFFER].length && !this[EOF]) this.emit('drain')\n  }\n\n  [FLUSHCHUNK](chunk: RType) {\n    this.emit('data', chunk)\n    return this[FLOWING]\n  }\n\n  /**\n   * Pipe all data emitted by this stream into the destination provided.\n   *\n   * Triggers the flow of data.\n   */\n  pipe(dest: W, opts?: PipeOptions): W {\n    if (this[DESTROYED]) return dest\n    this[DISCARDED] = false\n\n    const ended = this[EMITTED_END]\n    opts = opts || {}\n    if (dest === proc.stdout || dest === proc.stderr) opts.end = false\n    else opts.end = opts.end !== false\n    opts.proxyErrors = !!opts.proxyErrors\n\n    // piping an ended stream ends immediately\n    if (ended) {\n      if (opts.end) dest.end()\n    } else {\n      // \"as\" here just ignores the WType, which pipes don't care about,\n      // since they're only consuming from us, and writing to the dest\n      this[PIPES].push(\n        !opts.proxyErrors\n          ? new Pipe(this as Minipass, dest, opts)\n          : new PipeProxyErrors(this as Minipass, dest, opts)\n      )\n      if (this[ASYNC]) defer(() => this[RESUME]())\n      else this[RESUME]()\n    }\n\n    return dest\n  }\n\n  /**\n   * Fully unhook a piped destination stream.\n   *\n   * If the destination stream was the only consumer of this stream (ie,\n   * there are no other piped destinations or `'data'` event listeners)\n   * then the flow of data will stop until there is another consumer or\n   * {@link Minipass#resume} is explicitly called.\n   */\n  unpipe(dest: W) {\n    const p = this[PIPES].find(p => p.dest === dest)\n    if (p) {\n      if (this[PIPES].length === 1) {\n        if (this[FLOWING] && this[DATALISTENERS] === 0) {\n          this[FLOWING] = false\n        }\n        this[PIPES] = []\n      } else this[PIPES].splice(this[PIPES].indexOf(p), 1)\n      p.unpipe()\n    }\n  }\n\n  /**\n   * Alias for {@link Minipass#on}\n   */\n  addListener(\n    ev: Event,\n    handler: (...args: Events[Event]) => any\n  ): this {\n    return this.on(ev, handler)\n  }\n\n  /**\n   * Mostly identical to `EventEmitter.on`, with the following\n   * behavior differences to prevent data loss and unnecessary hangs:\n   *\n   * - Adding a 'data' event handler will trigger the flow of data\n   *\n   * - Adding a 'readable' event handler when there is data waiting to be read\n   *   will cause 'readable' to be emitted immediately.\n   *\n   * - Adding an 'endish' event handler ('end', 'finish', etc.) which has\n   *   already passed will cause the event to be emitted immediately and all\n   *   handlers removed.\n   *\n   * - Adding an 'error' event handler after an error has been emitted will\n   *   cause the event to be re-emitted immediately with the error previously\n   *   raised.\n   */\n  on(\n    ev: Event,\n    handler: (...args: Events[Event]) => any\n  ): this {\n    const ret = super.on(\n      ev as string | symbol,\n      handler as (...a: any[]) => any\n    )\n    if (ev === 'data') {\n      this[DISCARDED] = false\n      this[DATALISTENERS]++\n      if (!this[PIPES].length && !this[FLOWING]) {\n        this[RESUME]()\n      }\n    } else if (ev === 'readable' && this[BUFFERLENGTH] !== 0) {\n      super.emit('readable')\n    } else if (isEndish(ev) && this[EMITTED_END]) {\n      super.emit(ev)\n      this.removeAllListeners(ev)\n    } else if (ev === 'error' && this[EMITTED_ERROR]) {\n      const h = handler as (...a: Events['error']) => any\n      if (this[ASYNC]) defer(() => h.call(this, this[EMITTED_ERROR]))\n      else h.call(this, this[EMITTED_ERROR])\n    }\n    return ret\n  }\n\n  /**\n   * Alias for {@link Minipass#off}\n   */\n  removeListener(\n    ev: Event,\n    handler: (...args: Events[Event]) => any\n  ) {\n    return this.off(ev, handler)\n  }\n\n  /**\n   * Mostly identical to `EventEmitter.off`\n   *\n   * If a 'data' event handler is removed, and it was the last consumer\n   * (ie, there are no pipe destinations or other 'data' event listeners),\n   * then the flow of data will stop until there is another consumer or\n   * {@link Minipass#resume} is explicitly called.\n   */\n  off(\n    ev: Event,\n    handler: (...args: Events[Event]) => any\n  ) {\n    const ret = super.off(\n      ev as string | symbol,\n      handler as (...a: any[]) => any\n    )\n    // if we previously had listeners, and now we don't, and we don't\n    // have any pipes, then stop the flow, unless it's been explicitly\n    // put in a discarded flowing state via stream.resume().\n    if (ev === 'data') {\n      this[DATALISTENERS] = this.listeners('data').length\n      if (\n        this[DATALISTENERS] === 0 &&\n        !this[DISCARDED] &&\n        !this[PIPES].length\n      ) {\n        this[FLOWING] = false\n      }\n    }\n    return ret\n  }\n\n  /**\n   * Mostly identical to `EventEmitter.removeAllListeners`\n   *\n   * If all 'data' event handlers are removed, and they were the last consumer\n   * (ie, there are no pipe destinations), then the flow of data will stop\n   * until there is another consumer or {@link Minipass#resume} is explicitly\n   * called.\n   */\n  removeAllListeners(ev?: Event) {\n    const ret = super.removeAllListeners(ev as string | symbol | undefined)\n    if (ev === 'data' || ev === undefined) {\n      this[DATALISTENERS] = 0\n      if (!this[DISCARDED] && !this[PIPES].length) {\n        this[FLOWING] = false\n      }\n    }\n    return ret\n  }\n\n  /**\n   * true if the 'end' event has been emitted\n   */\n  get emittedEnd() {\n    return this[EMITTED_END]\n  }\n\n  [MAYBE_EMIT_END]() {\n    if (\n      !this[EMITTING_END] &&\n      !this[EMITTED_END] &&\n      !this[DESTROYED] &&\n      this[BUFFER].length === 0 &&\n      this[EOF]\n    ) {\n      this[EMITTING_END] = true\n      this.emit('end')\n      this.emit('prefinish')\n      this.emit('finish')\n      if (this[CLOSED]) this.emit('close')\n      this[EMITTING_END] = false\n    }\n  }\n\n  /**\n   * Mostly identical to `EventEmitter.emit`, with the following\n   * behavior differences to prevent data loss and unnecessary hangs:\n   *\n   * If the stream has been destroyed, and the event is something other\n   * than 'close' or 'error', then `false` is returned and no handlers\n   * are called.\n   *\n   * If the event is 'end', and has already been emitted, then the event\n   * is ignored. If the stream is in a paused or non-flowing state, then\n   * the event will be deferred until data flow resumes. If the stream is\n   * async, then handlers will be called on the next tick rather than\n   * immediately.\n   *\n   * If the event is 'close', and 'end' has not yet been emitted, then\n   * the event will be deferred until after 'end' is emitted.\n   *\n   * If the event is 'error', and an AbortSignal was provided for the stream,\n   * and there are no listeners, then the event is ignored, matching the\n   * behavior of node core streams in the presense of an AbortSignal.\n   *\n   * If the event is 'finish' or 'prefinish', then all listeners will be\n   * removed after emitting the event, to prevent double-firing.\n   */\n  emit(\n    ev: Event,\n    ...args: Events[Event]\n  ): boolean {\n    const data = args[0]\n    // error and close are only events allowed after calling destroy()\n    if (\n      ev !== 'error' &&\n      ev !== 'close' &&\n      ev !== DESTROYED &&\n      this[DESTROYED]\n    ) {\n      return false\n    } else if (ev === 'data') {\n      return !this[OBJECTMODE] && !data\n        ? false\n        : this[ASYNC]\n        ? (defer(() => this[EMITDATA](data as RType)), true)\n        : this[EMITDATA](data as RType)\n    } else if (ev === 'end') {\n      return this[EMITEND]()\n    } else if (ev === 'close') {\n      this[CLOSED] = true\n      // don't emit close before 'end' and 'finish'\n      if (!this[EMITTED_END] && !this[DESTROYED]) return false\n      const ret = super.emit('close')\n      this.removeAllListeners('close')\n      return ret\n    } else if (ev === 'error') {\n      this[EMITTED_ERROR] = data\n      super.emit(ERROR, data)\n      const ret =\n        !this[SIGNAL] || this.listeners('error').length\n          ? super.emit('error', data)\n          : false\n      this[MAYBE_EMIT_END]()\n      return ret\n    } else if (ev === 'resume') {\n      const ret = super.emit('resume')\n      this[MAYBE_EMIT_END]()\n      return ret\n    } else if (ev === 'finish' || ev === 'prefinish') {\n      const ret = super.emit(ev)\n      this.removeAllListeners(ev)\n      return ret\n    }\n\n    // Some other unknown event\n    const ret = super.emit(ev as string, ...args)\n    this[MAYBE_EMIT_END]()\n    return ret\n  }\n\n  [EMITDATA](data: RType) {\n    for (const p of this[PIPES]) {\n      if (p.dest.write(data as RType) === false) this.pause()\n    }\n    const ret = this[DISCARDED] ? false : super.emit('data', data)\n    this[MAYBE_EMIT_END]()\n    return ret\n  }\n\n  [EMITEND]() {\n    if (this[EMITTED_END]) return false\n\n    this[EMITTED_END] = true\n    this.readable = false\n    return this[ASYNC]\n      ? (defer(() => this[EMITEND2]()), true)\n      : this[EMITEND2]()\n  }\n\n  [EMITEND2]() {\n    if (this[DECODER]) {\n      const data = this[DECODER].end()\n      if (data) {\n        for (const p of this[PIPES]) {\n          p.dest.write(data as RType)\n        }\n        if (!this[DISCARDED]) super.emit('data', data)\n      }\n    }\n\n    for (const p of this[PIPES]) {\n      p.end()\n    }\n    const ret = super.emit('end')\n    this.removeAllListeners('end')\n    return ret\n  }\n\n  /**\n   * Return a Promise that resolves to an array of all emitted data once\n   * the stream ends.\n   */\n  async collect(): Promise {\n    const buf: RType[] & { dataLength: number } = Object.assign([], {\n      dataLength: 0,\n    })\n    if (!this[OBJECTMODE]) buf.dataLength = 0\n    // set the promise first, in case an error is raised\n    // by triggering the flow here.\n    const p = this.promise()\n    this.on('data', c => {\n      buf.push(c)\n      if (!this[OBJECTMODE])\n        buf.dataLength += (c as Minipass.BufferOrString).length\n    })\n    await p\n    return buf\n  }\n\n  /**\n   * Return a Promise that resolves to the concatenation of all emitted data\n   * once the stream ends.\n   *\n   * Not allowed on objectMode streams.\n   */\n  async concat(): Promise {\n    if (this[OBJECTMODE]) {\n      throw new Error('cannot concat in objectMode')\n    }\n    const buf = await this.collect()\n    return (\n      this[ENCODING]\n        ? buf.join('')\n        : Buffer.concat(buf as Buffer[], buf.dataLength)\n    ) as RType\n  }\n\n  /**\n   * Return a void Promise that resolves once the stream ends.\n   */\n  async promise(): Promise {\n    return new Promise((resolve, reject) => {\n      this.on(DESTROYED, () => reject(new Error('stream destroyed')))\n      this.on('error', er => reject(er))\n      this.on('end', () => resolve())\n    })\n  }\n\n  /**\n   * Asynchronous `for await of` iteration.\n   *\n   * This will continue emitting all chunks until the stream terminates.\n   */\n  [Symbol.asyncIterator](): AsyncGenerator {\n    // set this up front, in case the consumer doesn't call next()\n    // right away.\n    this[DISCARDED] = false\n    let stopped = false\n    const stop = async (): Promise> => {\n      this.pause()\n      stopped = true\n      return { value: undefined, done: true }\n    }\n    const next = (): Promise> => {\n      if (stopped) return stop()\n      const res = this.read()\n      if (res !== null) return Promise.resolve({ done: false, value: res })\n\n      if (this[EOF]) return stop()\n\n      let resolve!: (res: IteratorResult) => void\n      let reject!: (er: unknown) => void\n      const onerr = (er: unknown) => {\n        this.off('data', ondata)\n        this.off('end', onend)\n        this.off(DESTROYED, ondestroy)\n        stop()\n        reject(er)\n      }\n      const ondata = (value: RType) => {\n        this.off('error', onerr)\n        this.off('end', onend)\n        this.off(DESTROYED, ondestroy)\n        this.pause()\n        resolve({ value, done: !!this[EOF] })\n      }\n      const onend = () => {\n        this.off('error', onerr)\n        this.off('data', ondata)\n        this.off(DESTROYED, ondestroy)\n        stop()\n        resolve({ done: true, value: undefined })\n      }\n      const ondestroy = () => onerr(new Error('stream destroyed'))\n      return new Promise>((res, rej) => {\n        reject = rej\n        resolve = res\n        this.once(DESTROYED, ondestroy)\n        this.once('error', onerr)\n        this.once('end', onend)\n        this.once('data', ondata)\n      })\n    }\n\n    return {\n      next,\n      throw: stop,\n      return: stop,\n      [Symbol.asyncIterator]() {\n        return this\n      },\n      [Symbol.asyncDispose]: async () => {},\n    }\n  }\n\n  /**\n   * Synchronous `for of` iteration.\n   *\n   * The iteration will terminate when the internal buffer runs out, even\n   * if the stream has not yet terminated.\n   */\n  [Symbol.iterator](): Generator {\n    // set this up front, in case the consumer doesn't call next()\n    // right away.\n    this[DISCARDED] = false\n    let stopped = false\n    const stop = (): IteratorReturnResult => {\n      this.pause()\n      this.off(ERROR, stop)\n      this.off(DESTROYED, stop)\n      this.off('end', stop)\n      stopped = true\n      return { done: true, value: undefined }\n    }\n\n    const next = (): IteratorResult => {\n      if (stopped) return stop()\n      const value = this.read()\n      return value === null ? stop() : { done: false, value }\n    }\n\n    this.once('end', stop)\n    this.once(ERROR, stop)\n    this.once(DESTROYED, stop)\n\n    return {\n      next,\n      throw: stop,\n      return: stop,\n      [Symbol.iterator]() {\n        return this\n      },\n      [Symbol.dispose]: () => {},\n    }\n  }\n\n  /**\n   * Destroy a stream, preventing it from being used for any further purpose.\n   *\n   * If the stream has a `close()` method, then it will be called on\n   * destruction.\n   *\n   * After destruction, any attempt to write data, read data, or emit most\n   * events will be ignored.\n   *\n   * If an error argument is provided, then it will be emitted in an\n   * 'error' event.\n   */\n  destroy(er?: unknown) {\n    if (this[DESTROYED]) {\n      if (er) this.emit('error', er)\n      else this.emit(DESTROYED)\n      return this\n    }\n\n    this[DESTROYED] = true\n    this[DISCARDED] = true\n\n    // throw away all buffered data, it's never coming out\n    this[BUFFER].length = 0\n    this[BUFFERLENGTH] = 0\n\n    const wc = this as Minipass & {\n      close?: () => void\n    }\n    if (typeof wc.close === 'function' && !this[CLOSED]) wc.close()\n\n    if (er) this.emit('error', er)\n    // if no error to emit, still reject pending promises\n    else this.emit(DESTROYED)\n\n    return this\n  }\n\n  /**\n   * Alias for {@link isStream}\n   *\n   * Former export location, maintained for backwards compatibility.\n   *\n   * @deprecated\n   */\n  static get isStream() {\n    return isStream\n  }\n}\n"]}
      \ No newline at end of file
      diff --git a/node_modules/minipass/dist/commonjs/index.js b/node_modules/minipass/dist/commonjs/index.js
      new file mode 100644
      index 00000000..91f3a5cf
      --- /dev/null
      +++ b/node_modules/minipass/dist/commonjs/index.js
      @@ -0,0 +1,1038 @@
      +"use strict";
      +var __importDefault = (this && this.__importDefault) || function (mod) {
      +    return (mod && mod.__esModule) ? mod : { "default": mod };
      +};
      +Object.defineProperty(exports, "__esModule", { value: true });
      +exports.Minipass = exports.isWritable = exports.isReadable = exports.isStream = void 0;
      +const proc = typeof process === 'object' && process
      +    ? process
      +    : {
      +        stdout: null,
      +        stderr: null,
      +    };
      +const node_events_1 = require("node:events");
      +const node_stream_1 = __importDefault(require("node:stream"));
      +const node_string_decoder_1 = require("node:string_decoder");
      +/**
      + * Return true if the argument is a Minipass stream, Node stream, or something
      + * else that Minipass can interact with.
      + */
      +const isStream = (s) => !!s &&
      +    typeof s === 'object' &&
      +    (s instanceof Minipass ||
      +        s instanceof node_stream_1.default ||
      +        (0, exports.isReadable)(s) ||
      +        (0, exports.isWritable)(s))
      +/**
      + * Return true if the argument is a valid {@link Minipass.Readable}
      + */
      +;
      +exports.isStream = isStream;
      +/**
      + * Return true if the argument is a valid {@link Minipass.Readable}
      + */
      +const isReadable = (s) => !!s &&
      +    typeof s === 'object' &&
      +    s instanceof node_events_1.EventEmitter &&
      +    typeof s.pipe === 'function' &&
      +    // node core Writable streams have a pipe() method, but it throws
      +    s.pipe !== node_stream_1.default.Writable.prototype.pipe
      +/**
      + * Return true if the argument is a valid {@link Minipass.Writable}
      + */
      +;
      +exports.isReadable = isReadable;
      +/**
      + * Return true if the argument is a valid {@link Minipass.Writable}
      + */
      +const isWritable = (s) => !!s &&
      +    typeof s === 'object' &&
      +    s instanceof node_events_1.EventEmitter &&
      +    typeof s.write === 'function' &&
      +    typeof s.end === 'function';
      +exports.isWritable = isWritable;
      +const EOF = Symbol('EOF');
      +const MAYBE_EMIT_END = Symbol('maybeEmitEnd');
      +const EMITTED_END = Symbol('emittedEnd');
      +const EMITTING_END = Symbol('emittingEnd');
      +const EMITTED_ERROR = Symbol('emittedError');
      +const CLOSED = Symbol('closed');
      +const READ = Symbol('read');
      +const FLUSH = Symbol('flush');
      +const FLUSHCHUNK = Symbol('flushChunk');
      +const ENCODING = Symbol('encoding');
      +const DECODER = Symbol('decoder');
      +const FLOWING = Symbol('flowing');
      +const PAUSED = Symbol('paused');
      +const RESUME = Symbol('resume');
      +const BUFFER = Symbol('buffer');
      +const PIPES = Symbol('pipes');
      +const BUFFERLENGTH = Symbol('bufferLength');
      +const BUFFERPUSH = Symbol('bufferPush');
      +const BUFFERSHIFT = Symbol('bufferShift');
      +const OBJECTMODE = Symbol('objectMode');
      +// internal event when stream is destroyed
      +const DESTROYED = Symbol('destroyed');
      +// internal event when stream has an error
      +const ERROR = Symbol('error');
      +const EMITDATA = Symbol('emitData');
      +const EMITEND = Symbol('emitEnd');
      +const EMITEND2 = Symbol('emitEnd2');
      +const ASYNC = Symbol('async');
      +const ABORT = Symbol('abort');
      +const ABORTED = Symbol('aborted');
      +const SIGNAL = Symbol('signal');
      +const DATALISTENERS = Symbol('dataListeners');
      +const DISCARDED = Symbol('discarded');
      +const defer = (fn) => Promise.resolve().then(fn);
      +const nodefer = (fn) => fn();
      +const isEndish = (ev) => ev === 'end' || ev === 'finish' || ev === 'prefinish';
      +const isArrayBufferLike = (b) => b instanceof ArrayBuffer ||
      +    (!!b &&
      +        typeof b === 'object' &&
      +        b.constructor &&
      +        b.constructor.name === 'ArrayBuffer' &&
      +        b.byteLength >= 0);
      +const isArrayBufferView = (b) => !Buffer.isBuffer(b) && ArrayBuffer.isView(b);
      +/**
      + * Internal class representing a pipe to a destination stream.
      + *
      + * @internal
      + */
      +class Pipe {
      +    src;
      +    dest;
      +    opts;
      +    ondrain;
      +    constructor(src, dest, opts) {
      +        this.src = src;
      +        this.dest = dest;
      +        this.opts = opts;
      +        this.ondrain = () => src[RESUME]();
      +        this.dest.on('drain', this.ondrain);
      +    }
      +    unpipe() {
      +        this.dest.removeListener('drain', this.ondrain);
      +    }
      +    // only here for the prototype
      +    /* c8 ignore start */
      +    proxyErrors(_er) { }
      +    /* c8 ignore stop */
      +    end() {
      +        this.unpipe();
      +        if (this.opts.end)
      +            this.dest.end();
      +    }
      +}
      +/**
      + * Internal class representing a pipe to a destination stream where
      + * errors are proxied.
      + *
      + * @internal
      + */
      +class PipeProxyErrors extends Pipe {
      +    unpipe() {
      +        this.src.removeListener('error', this.proxyErrors);
      +        super.unpipe();
      +    }
      +    constructor(src, dest, opts) {
      +        super(src, dest, opts);
      +        this.proxyErrors = (er) => this.dest.emit('error', er);
      +        src.on('error', this.proxyErrors);
      +    }
      +}
      +const isObjectModeOptions = (o) => !!o.objectMode;
      +const isEncodingOptions = (o) => !o.objectMode && !!o.encoding && o.encoding !== 'buffer';
      +/**
      + * Main export, the Minipass class
      + *
      + * `RType` is the type of data emitted, defaults to Buffer
      + *
      + * `WType` is the type of data to be written, if RType is buffer or string,
      + * then any {@link Minipass.ContiguousData} is allowed.
      + *
      + * `Events` is the set of event handler signatures that this object
      + * will emit, see {@link Minipass.Events}
      + */
      +class Minipass extends node_events_1.EventEmitter {
      +    [FLOWING] = false;
      +    [PAUSED] = false;
      +    [PIPES] = [];
      +    [BUFFER] = [];
      +    [OBJECTMODE];
      +    [ENCODING];
      +    [ASYNC];
      +    [DECODER];
      +    [EOF] = false;
      +    [EMITTED_END] = false;
      +    [EMITTING_END] = false;
      +    [CLOSED] = false;
      +    [EMITTED_ERROR] = null;
      +    [BUFFERLENGTH] = 0;
      +    [DESTROYED] = false;
      +    [SIGNAL];
      +    [ABORTED] = false;
      +    [DATALISTENERS] = 0;
      +    [DISCARDED] = false;
      +    /**
      +     * true if the stream can be written
      +     */
      +    writable = true;
      +    /**
      +     * true if the stream can be read
      +     */
      +    readable = true;
      +    /**
      +     * If `RType` is Buffer, then options do not need to be provided.
      +     * Otherwise, an options object must be provided to specify either
      +     * {@link Minipass.SharedOptions.objectMode} or
      +     * {@link Minipass.SharedOptions.encoding}, as appropriate.
      +     */
      +    constructor(...args) {
      +        const options = (args[0] ||
      +            {});
      +        super();
      +        if (options.objectMode && typeof options.encoding === 'string') {
      +            throw new TypeError('Encoding and objectMode may not be used together');
      +        }
      +        if (isObjectModeOptions(options)) {
      +            this[OBJECTMODE] = true;
      +            this[ENCODING] = null;
      +        }
      +        else if (isEncodingOptions(options)) {
      +            this[ENCODING] = options.encoding;
      +            this[OBJECTMODE] = false;
      +        }
      +        else {
      +            this[OBJECTMODE] = false;
      +            this[ENCODING] = null;
      +        }
      +        this[ASYNC] = !!options.async;
      +        this[DECODER] = this[ENCODING]
      +            ? new node_string_decoder_1.StringDecoder(this[ENCODING])
      +            : null;
      +        //@ts-ignore - private option for debugging and testing
      +        if (options && options.debugExposeBuffer === true) {
      +            Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] });
      +        }
      +        //@ts-ignore - private option for debugging and testing
      +        if (options && options.debugExposePipes === true) {
      +            Object.defineProperty(this, 'pipes', { get: () => this[PIPES] });
      +        }
      +        const { signal } = options;
      +        if (signal) {
      +            this[SIGNAL] = signal;
      +            if (signal.aborted) {
      +                this[ABORT]();
      +            }
      +            else {
      +                signal.addEventListener('abort', () => this[ABORT]());
      +            }
      +        }
      +    }
      +    /**
      +     * The amount of data stored in the buffer waiting to be read.
      +     *
      +     * For Buffer strings, this will be the total byte length.
      +     * For string encoding streams, this will be the string character length,
      +     * according to JavaScript's `string.length` logic.
      +     * For objectMode streams, this is a count of the items waiting to be
      +     * emitted.
      +     */
      +    get bufferLength() {
      +        return this[BUFFERLENGTH];
      +    }
      +    /**
      +     * The `BufferEncoding` currently in use, or `null`
      +     */
      +    get encoding() {
      +        return this[ENCODING];
      +    }
      +    /**
      +     * @deprecated - This is a read only property
      +     */
      +    set encoding(_enc) {
      +        throw new Error('Encoding must be set at instantiation time');
      +    }
      +    /**
      +     * @deprecated - Encoding may only be set at instantiation time
      +     */
      +    setEncoding(_enc) {
      +        throw new Error('Encoding must be set at instantiation time');
      +    }
      +    /**
      +     * True if this is an objectMode stream
      +     */
      +    get objectMode() {
      +        return this[OBJECTMODE];
      +    }
      +    /**
      +     * @deprecated - This is a read-only property
      +     */
      +    set objectMode(_om) {
      +        throw new Error('objectMode must be set at instantiation time');
      +    }
      +    /**
      +     * true if this is an async stream
      +     */
      +    get ['async']() {
      +        return this[ASYNC];
      +    }
      +    /**
      +     * Set to true to make this stream async.
      +     *
      +     * Once set, it cannot be unset, as this would potentially cause incorrect
      +     * behavior.  Ie, a sync stream can be made async, but an async stream
      +     * cannot be safely made sync.
      +     */
      +    set ['async'](a) {
      +        this[ASYNC] = this[ASYNC] || !!a;
      +    }
      +    // drop everything and get out of the flow completely
      +    [ABORT]() {
      +        this[ABORTED] = true;
      +        this.emit('abort', this[SIGNAL]?.reason);
      +        this.destroy(this[SIGNAL]?.reason);
      +    }
      +    /**
      +     * True if the stream has been aborted.
      +     */
      +    get aborted() {
      +        return this[ABORTED];
      +    }
      +    /**
      +     * No-op setter. Stream aborted status is set via the AbortSignal provided
      +     * in the constructor options.
      +     */
      +    set aborted(_) { }
      +    write(chunk, encoding, cb) {
      +        if (this[ABORTED])
      +            return false;
      +        if (this[EOF])
      +            throw new Error('write after end');
      +        if (this[DESTROYED]) {
      +            this.emit('error', Object.assign(new Error('Cannot call write after a stream was destroyed'), { code: 'ERR_STREAM_DESTROYED' }));
      +            return true;
      +        }
      +        if (typeof encoding === 'function') {
      +            cb = encoding;
      +            encoding = 'utf8';
      +        }
      +        if (!encoding)
      +            encoding = 'utf8';
      +        const fn = this[ASYNC] ? defer : nodefer;
      +        // convert array buffers and typed array views into buffers
      +        // at some point in the future, we may want to do the opposite!
      +        // leave strings and buffers as-is
      +        // anything is only allowed if in object mode, so throw
      +        if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) {
      +            if (isArrayBufferView(chunk)) {
      +                //@ts-ignore - sinful unsafe type changing
      +                chunk = Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength);
      +            }
      +            else if (isArrayBufferLike(chunk)) {
      +                //@ts-ignore - sinful unsafe type changing
      +                chunk = Buffer.from(chunk);
      +            }
      +            else if (typeof chunk !== 'string') {
      +                throw new Error('Non-contiguous data written to non-objectMode stream');
      +            }
      +        }
      +        // handle object mode up front, since it's simpler
      +        // this yields better performance, fewer checks later.
      +        if (this[OBJECTMODE]) {
      +            // maybe impossible?
      +            /* c8 ignore start */
      +            if (this[FLOWING] && this[BUFFERLENGTH] !== 0)
      +                this[FLUSH](true);
      +            /* c8 ignore stop */
      +            if (this[FLOWING])
      +                this.emit('data', chunk);
      +            else
      +                this[BUFFERPUSH](chunk);
      +            if (this[BUFFERLENGTH] !== 0)
      +                this.emit('readable');
      +            if (cb)
      +                fn(cb);
      +            return this[FLOWING];
      +        }
      +        // at this point the chunk is a buffer or string
      +        // don't buffer it up or send it to the decoder
      +        if (!chunk.length) {
      +            if (this[BUFFERLENGTH] !== 0)
      +                this.emit('readable');
      +            if (cb)
      +                fn(cb);
      +            return this[FLOWING];
      +        }
      +        // fast-path writing strings of same encoding to a stream with
      +        // an empty buffer, skipping the buffer/decoder dance
      +        if (typeof chunk === 'string' &&
      +            // unless it is a string already ready for us to use
      +            !(encoding === this[ENCODING] && !this[DECODER]?.lastNeed)) {
      +            //@ts-ignore - sinful unsafe type change
      +            chunk = Buffer.from(chunk, encoding);
      +        }
      +        if (Buffer.isBuffer(chunk) && this[ENCODING]) {
      +            //@ts-ignore - sinful unsafe type change
      +            chunk = this[DECODER].write(chunk);
      +        }
      +        // Note: flushing CAN potentially switch us into not-flowing mode
      +        if (this[FLOWING] && this[BUFFERLENGTH] !== 0)
      +            this[FLUSH](true);
      +        if (this[FLOWING])
      +            this.emit('data', chunk);
      +        else
      +            this[BUFFERPUSH](chunk);
      +        if (this[BUFFERLENGTH] !== 0)
      +            this.emit('readable');
      +        if (cb)
      +            fn(cb);
      +        return this[FLOWING];
      +    }
      +    /**
      +     * Low-level explicit read method.
      +     *
      +     * In objectMode, the argument is ignored, and one item is returned if
      +     * available.
      +     *
      +     * `n` is the number of bytes (or in the case of encoding streams,
      +     * characters) to consume. If `n` is not provided, then the entire buffer
      +     * is returned, or `null` is returned if no data is available.
      +     *
      +     * If `n` is greater that the amount of data in the internal buffer,
      +     * then `null` is returned.
      +     */
      +    read(n) {
      +        if (this[DESTROYED])
      +            return null;
      +        this[DISCARDED] = false;
      +        if (this[BUFFERLENGTH] === 0 ||
      +            n === 0 ||
      +            (n && n > this[BUFFERLENGTH])) {
      +            this[MAYBE_EMIT_END]();
      +            return null;
      +        }
      +        if (this[OBJECTMODE])
      +            n = null;
      +        if (this[BUFFER].length > 1 && !this[OBJECTMODE]) {
      +            // not object mode, so if we have an encoding, then RType is string
      +            // otherwise, must be Buffer
      +            this[BUFFER] = [
      +                (this[ENCODING]
      +                    ? this[BUFFER].join('')
      +                    : Buffer.concat(this[BUFFER], this[BUFFERLENGTH])),
      +            ];
      +        }
      +        const ret = this[READ](n || null, this[BUFFER][0]);
      +        this[MAYBE_EMIT_END]();
      +        return ret;
      +    }
      +    [READ](n, chunk) {
      +        if (this[OBJECTMODE])
      +            this[BUFFERSHIFT]();
      +        else {
      +            const c = chunk;
      +            if (n === c.length || n === null)
      +                this[BUFFERSHIFT]();
      +            else if (typeof c === 'string') {
      +                this[BUFFER][0] = c.slice(n);
      +                chunk = c.slice(0, n);
      +                this[BUFFERLENGTH] -= n;
      +            }
      +            else {
      +                this[BUFFER][0] = c.subarray(n);
      +                chunk = c.subarray(0, n);
      +                this[BUFFERLENGTH] -= n;
      +            }
      +        }
      +        this.emit('data', chunk);
      +        if (!this[BUFFER].length && !this[EOF])
      +            this.emit('drain');
      +        return chunk;
      +    }
      +    end(chunk, encoding, cb) {
      +        if (typeof chunk === 'function') {
      +            cb = chunk;
      +            chunk = undefined;
      +        }
      +        if (typeof encoding === 'function') {
      +            cb = encoding;
      +            encoding = 'utf8';
      +        }
      +        if (chunk !== undefined)
      +            this.write(chunk, encoding);
      +        if (cb)
      +            this.once('end', cb);
      +        this[EOF] = true;
      +        this.writable = false;
      +        // if we haven't written anything, then go ahead and emit,
      +        // even if we're not reading.
      +        // we'll re-emit if a new 'end' listener is added anyway.
      +        // This makes MP more suitable to write-only use cases.
      +        if (this[FLOWING] || !this[PAUSED])
      +            this[MAYBE_EMIT_END]();
      +        return this;
      +    }
      +    // don't let the internal resume be overwritten
      +    [RESUME]() {
      +        if (this[DESTROYED])
      +            return;
      +        if (!this[DATALISTENERS] && !this[PIPES].length) {
      +            this[DISCARDED] = true;
      +        }
      +        this[PAUSED] = false;
      +        this[FLOWING] = true;
      +        this.emit('resume');
      +        if (this[BUFFER].length)
      +            this[FLUSH]();
      +        else if (this[EOF])
      +            this[MAYBE_EMIT_END]();
      +        else
      +            this.emit('drain');
      +    }
      +    /**
      +     * Resume the stream if it is currently in a paused state
      +     *
      +     * If called when there are no pipe destinations or `data` event listeners,
      +     * this will place the stream in a "discarded" state, where all data will
      +     * be thrown away. The discarded state is removed if a pipe destination or
      +     * data handler is added, if pause() is called, or if any synchronous or
      +     * asynchronous iteration is started.
      +     */
      +    resume() {
      +        return this[RESUME]();
      +    }
      +    /**
      +     * Pause the stream
      +     */
      +    pause() {
      +        this[FLOWING] = false;
      +        this[PAUSED] = true;
      +        this[DISCARDED] = false;
      +    }
      +    /**
      +     * true if the stream has been forcibly destroyed
      +     */
      +    get destroyed() {
      +        return this[DESTROYED];
      +    }
      +    /**
      +     * true if the stream is currently in a flowing state, meaning that
      +     * any writes will be immediately emitted.
      +     */
      +    get flowing() {
      +        return this[FLOWING];
      +    }
      +    /**
      +     * true if the stream is currently in a paused state
      +     */
      +    get paused() {
      +        return this[PAUSED];
      +    }
      +    [BUFFERPUSH](chunk) {
      +        if (this[OBJECTMODE])
      +            this[BUFFERLENGTH] += 1;
      +        else
      +            this[BUFFERLENGTH] += chunk.length;
      +        this[BUFFER].push(chunk);
      +    }
      +    [BUFFERSHIFT]() {
      +        if (this[OBJECTMODE])
      +            this[BUFFERLENGTH] -= 1;
      +        else
      +            this[BUFFERLENGTH] -= this[BUFFER][0].length;
      +        return this[BUFFER].shift();
      +    }
      +    [FLUSH](noDrain = false) {
      +        do { } while (this[FLUSHCHUNK](this[BUFFERSHIFT]()) &&
      +            this[BUFFER].length);
      +        if (!noDrain && !this[BUFFER].length && !this[EOF])
      +            this.emit('drain');
      +    }
      +    [FLUSHCHUNK](chunk) {
      +        this.emit('data', chunk);
      +        return this[FLOWING];
      +    }
      +    /**
      +     * Pipe all data emitted by this stream into the destination provided.
      +     *
      +     * Triggers the flow of data.
      +     */
      +    pipe(dest, opts) {
      +        if (this[DESTROYED])
      +            return dest;
      +        this[DISCARDED] = false;
      +        const ended = this[EMITTED_END];
      +        opts = opts || {};
      +        if (dest === proc.stdout || dest === proc.stderr)
      +            opts.end = false;
      +        else
      +            opts.end = opts.end !== false;
      +        opts.proxyErrors = !!opts.proxyErrors;
      +        // piping an ended stream ends immediately
      +        if (ended) {
      +            if (opts.end)
      +                dest.end();
      +        }
      +        else {
      +            // "as" here just ignores the WType, which pipes don't care about,
      +            // since they're only consuming from us, and writing to the dest
      +            this[PIPES].push(!opts.proxyErrors
      +                ? new Pipe(this, dest, opts)
      +                : new PipeProxyErrors(this, dest, opts));
      +            if (this[ASYNC])
      +                defer(() => this[RESUME]());
      +            else
      +                this[RESUME]();
      +        }
      +        return dest;
      +    }
      +    /**
      +     * Fully unhook a piped destination stream.
      +     *
      +     * If the destination stream was the only consumer of this stream (ie,
      +     * there are no other piped destinations or `'data'` event listeners)
      +     * then the flow of data will stop until there is another consumer or
      +     * {@link Minipass#resume} is explicitly called.
      +     */
      +    unpipe(dest) {
      +        const p = this[PIPES].find(p => p.dest === dest);
      +        if (p) {
      +            if (this[PIPES].length === 1) {
      +                if (this[FLOWING] && this[DATALISTENERS] === 0) {
      +                    this[FLOWING] = false;
      +                }
      +                this[PIPES] = [];
      +            }
      +            else
      +                this[PIPES].splice(this[PIPES].indexOf(p), 1);
      +            p.unpipe();
      +        }
      +    }
      +    /**
      +     * Alias for {@link Minipass#on}
      +     */
      +    addListener(ev, handler) {
      +        return this.on(ev, handler);
      +    }
      +    /**
      +     * Mostly identical to `EventEmitter.on`, with the following
      +     * behavior differences to prevent data loss and unnecessary hangs:
      +     *
      +     * - Adding a 'data' event handler will trigger the flow of data
      +     *
      +     * - Adding a 'readable' event handler when there is data waiting to be read
      +     *   will cause 'readable' to be emitted immediately.
      +     *
      +     * - Adding an 'endish' event handler ('end', 'finish', etc.) which has
      +     *   already passed will cause the event to be emitted immediately and all
      +     *   handlers removed.
      +     *
      +     * - Adding an 'error' event handler after an error has been emitted will
      +     *   cause the event to be re-emitted immediately with the error previously
      +     *   raised.
      +     */
      +    on(ev, handler) {
      +        const ret = super.on(ev, handler);
      +        if (ev === 'data') {
      +            this[DISCARDED] = false;
      +            this[DATALISTENERS]++;
      +            if (!this[PIPES].length && !this[FLOWING]) {
      +                this[RESUME]();
      +            }
      +        }
      +        else if (ev === 'readable' && this[BUFFERLENGTH] !== 0) {
      +            super.emit('readable');
      +        }
      +        else if (isEndish(ev) && this[EMITTED_END]) {
      +            super.emit(ev);
      +            this.removeAllListeners(ev);
      +        }
      +        else if (ev === 'error' && this[EMITTED_ERROR]) {
      +            const h = handler;
      +            if (this[ASYNC])
      +                defer(() => h.call(this, this[EMITTED_ERROR]));
      +            else
      +                h.call(this, this[EMITTED_ERROR]);
      +        }
      +        return ret;
      +    }
      +    /**
      +     * Alias for {@link Minipass#off}
      +     */
      +    removeListener(ev, handler) {
      +        return this.off(ev, handler);
      +    }
      +    /**
      +     * Mostly identical to `EventEmitter.off`
      +     *
      +     * If a 'data' event handler is removed, and it was the last consumer
      +     * (ie, there are no pipe destinations or other 'data' event listeners),
      +     * then the flow of data will stop until there is another consumer or
      +     * {@link Minipass#resume} is explicitly called.
      +     */
      +    off(ev, handler) {
      +        const ret = super.off(ev, handler);
      +        // if we previously had listeners, and now we don't, and we don't
      +        // have any pipes, then stop the flow, unless it's been explicitly
      +        // put in a discarded flowing state via stream.resume().
      +        if (ev === 'data') {
      +            this[DATALISTENERS] = this.listeners('data').length;
      +            if (this[DATALISTENERS] === 0 &&
      +                !this[DISCARDED] &&
      +                !this[PIPES].length) {
      +                this[FLOWING] = false;
      +            }
      +        }
      +        return ret;
      +    }
      +    /**
      +     * Mostly identical to `EventEmitter.removeAllListeners`
      +     *
      +     * If all 'data' event handlers are removed, and they were the last consumer
      +     * (ie, there are no pipe destinations), then the flow of data will stop
      +     * until there is another consumer or {@link Minipass#resume} is explicitly
      +     * called.
      +     */
      +    removeAllListeners(ev) {
      +        const ret = super.removeAllListeners(ev);
      +        if (ev === 'data' || ev === undefined) {
      +            this[DATALISTENERS] = 0;
      +            if (!this[DISCARDED] && !this[PIPES].length) {
      +                this[FLOWING] = false;
      +            }
      +        }
      +        return ret;
      +    }
      +    /**
      +     * true if the 'end' event has been emitted
      +     */
      +    get emittedEnd() {
      +        return this[EMITTED_END];
      +    }
      +    [MAYBE_EMIT_END]() {
      +        if (!this[EMITTING_END] &&
      +            !this[EMITTED_END] &&
      +            !this[DESTROYED] &&
      +            this[BUFFER].length === 0 &&
      +            this[EOF]) {
      +            this[EMITTING_END] = true;
      +            this.emit('end');
      +            this.emit('prefinish');
      +            this.emit('finish');
      +            if (this[CLOSED])
      +                this.emit('close');
      +            this[EMITTING_END] = false;
      +        }
      +    }
      +    /**
      +     * Mostly identical to `EventEmitter.emit`, with the following
      +     * behavior differences to prevent data loss and unnecessary hangs:
      +     *
      +     * If the stream has been destroyed, and the event is something other
      +     * than 'close' or 'error', then `false` is returned and no handlers
      +     * are called.
      +     *
      +     * If the event is 'end', and has already been emitted, then the event
      +     * is ignored. If the stream is in a paused or non-flowing state, then
      +     * the event will be deferred until data flow resumes. If the stream is
      +     * async, then handlers will be called on the next tick rather than
      +     * immediately.
      +     *
      +     * If the event is 'close', and 'end' has not yet been emitted, then
      +     * the event will be deferred until after 'end' is emitted.
      +     *
      +     * If the event is 'error', and an AbortSignal was provided for the stream,
      +     * and there are no listeners, then the event is ignored, matching the
      +     * behavior of node core streams in the presense of an AbortSignal.
      +     *
      +     * If the event is 'finish' or 'prefinish', then all listeners will be
      +     * removed after emitting the event, to prevent double-firing.
      +     */
      +    emit(ev, ...args) {
      +        const data = args[0];
      +        // error and close are only events allowed after calling destroy()
      +        if (ev !== 'error' &&
      +            ev !== 'close' &&
      +            ev !== DESTROYED &&
      +            this[DESTROYED]) {
      +            return false;
      +        }
      +        else if (ev === 'data') {
      +            return !this[OBJECTMODE] && !data
      +                ? false
      +                : this[ASYNC]
      +                    ? (defer(() => this[EMITDATA](data)), true)
      +                    : this[EMITDATA](data);
      +        }
      +        else if (ev === 'end') {
      +            return this[EMITEND]();
      +        }
      +        else if (ev === 'close') {
      +            this[CLOSED] = true;
      +            // don't emit close before 'end' and 'finish'
      +            if (!this[EMITTED_END] && !this[DESTROYED])
      +                return false;
      +            const ret = super.emit('close');
      +            this.removeAllListeners('close');
      +            return ret;
      +        }
      +        else if (ev === 'error') {
      +            this[EMITTED_ERROR] = data;
      +            super.emit(ERROR, data);
      +            const ret = !this[SIGNAL] || this.listeners('error').length
      +                ? super.emit('error', data)
      +                : false;
      +            this[MAYBE_EMIT_END]();
      +            return ret;
      +        }
      +        else if (ev === 'resume') {
      +            const ret = super.emit('resume');
      +            this[MAYBE_EMIT_END]();
      +            return ret;
      +        }
      +        else if (ev === 'finish' || ev === 'prefinish') {
      +            const ret = super.emit(ev);
      +            this.removeAllListeners(ev);
      +            return ret;
      +        }
      +        // Some other unknown event
      +        const ret = super.emit(ev, ...args);
      +        this[MAYBE_EMIT_END]();
      +        return ret;
      +    }
      +    [EMITDATA](data) {
      +        for (const p of this[PIPES]) {
      +            if (p.dest.write(data) === false)
      +                this.pause();
      +        }
      +        const ret = this[DISCARDED] ? false : super.emit('data', data);
      +        this[MAYBE_EMIT_END]();
      +        return ret;
      +    }
      +    [EMITEND]() {
      +        if (this[EMITTED_END])
      +            return false;
      +        this[EMITTED_END] = true;
      +        this.readable = false;
      +        return this[ASYNC]
      +            ? (defer(() => this[EMITEND2]()), true)
      +            : this[EMITEND2]();
      +    }
      +    [EMITEND2]() {
      +        if (this[DECODER]) {
      +            const data = this[DECODER].end();
      +            if (data) {
      +                for (const p of this[PIPES]) {
      +                    p.dest.write(data);
      +                }
      +                if (!this[DISCARDED])
      +                    super.emit('data', data);
      +            }
      +        }
      +        for (const p of this[PIPES]) {
      +            p.end();
      +        }
      +        const ret = super.emit('end');
      +        this.removeAllListeners('end');
      +        return ret;
      +    }
      +    /**
      +     * Return a Promise that resolves to an array of all emitted data once
      +     * the stream ends.
      +     */
      +    async collect() {
      +        const buf = Object.assign([], {
      +            dataLength: 0,
      +        });
      +        if (!this[OBJECTMODE])
      +            buf.dataLength = 0;
      +        // set the promise first, in case an error is raised
      +        // by triggering the flow here.
      +        const p = this.promise();
      +        this.on('data', c => {
      +            buf.push(c);
      +            if (!this[OBJECTMODE])
      +                buf.dataLength += c.length;
      +        });
      +        await p;
      +        return buf;
      +    }
      +    /**
      +     * Return a Promise that resolves to the concatenation of all emitted data
      +     * once the stream ends.
      +     *
      +     * Not allowed on objectMode streams.
      +     */
      +    async concat() {
      +        if (this[OBJECTMODE]) {
      +            throw new Error('cannot concat in objectMode');
      +        }
      +        const buf = await this.collect();
      +        return (this[ENCODING]
      +            ? buf.join('')
      +            : Buffer.concat(buf, buf.dataLength));
      +    }
      +    /**
      +     * Return a void Promise that resolves once the stream ends.
      +     */
      +    async promise() {
      +        return new Promise((resolve, reject) => {
      +            this.on(DESTROYED, () => reject(new Error('stream destroyed')));
      +            this.on('error', er => reject(er));
      +            this.on('end', () => resolve());
      +        });
      +    }
      +    /**
      +     * Asynchronous `for await of` iteration.
      +     *
      +     * This will continue emitting all chunks until the stream terminates.
      +     */
      +    [Symbol.asyncIterator]() {
      +        // set this up front, in case the consumer doesn't call next()
      +        // right away.
      +        this[DISCARDED] = false;
      +        let stopped = false;
      +        const stop = async () => {
      +            this.pause();
      +            stopped = true;
      +            return { value: undefined, done: true };
      +        };
      +        const next = () => {
      +            if (stopped)
      +                return stop();
      +            const res = this.read();
      +            if (res !== null)
      +                return Promise.resolve({ done: false, value: res });
      +            if (this[EOF])
      +                return stop();
      +            let resolve;
      +            let reject;
      +            const onerr = (er) => {
      +                this.off('data', ondata);
      +                this.off('end', onend);
      +                this.off(DESTROYED, ondestroy);
      +                stop();
      +                reject(er);
      +            };
      +            const ondata = (value) => {
      +                this.off('error', onerr);
      +                this.off('end', onend);
      +                this.off(DESTROYED, ondestroy);
      +                this.pause();
      +                resolve({ value, done: !!this[EOF] });
      +            };
      +            const onend = () => {
      +                this.off('error', onerr);
      +                this.off('data', ondata);
      +                this.off(DESTROYED, ondestroy);
      +                stop();
      +                resolve({ done: true, value: undefined });
      +            };
      +            const ondestroy = () => onerr(new Error('stream destroyed'));
      +            return new Promise((res, rej) => {
      +                reject = rej;
      +                resolve = res;
      +                this.once(DESTROYED, ondestroy);
      +                this.once('error', onerr);
      +                this.once('end', onend);
      +                this.once('data', ondata);
      +            });
      +        };
      +        return {
      +            next,
      +            throw: stop,
      +            return: stop,
      +            [Symbol.asyncIterator]() {
      +                return this;
      +            },
      +            [Symbol.asyncDispose]: async () => { },
      +        };
      +    }
      +    /**
      +     * Synchronous `for of` iteration.
      +     *
      +     * The iteration will terminate when the internal buffer runs out, even
      +     * if the stream has not yet terminated.
      +     */
      +    [Symbol.iterator]() {
      +        // set this up front, in case the consumer doesn't call next()
      +        // right away.
      +        this[DISCARDED] = false;
      +        let stopped = false;
      +        const stop = () => {
      +            this.pause();
      +            this.off(ERROR, stop);
      +            this.off(DESTROYED, stop);
      +            this.off('end', stop);
      +            stopped = true;
      +            return { done: true, value: undefined };
      +        };
      +        const next = () => {
      +            if (stopped)
      +                return stop();
      +            const value = this.read();
      +            return value === null ? stop() : { done: false, value };
      +        };
      +        this.once('end', stop);
      +        this.once(ERROR, stop);
      +        this.once(DESTROYED, stop);
      +        return {
      +            next,
      +            throw: stop,
      +            return: stop,
      +            [Symbol.iterator]() {
      +                return this;
      +            },
      +            [Symbol.dispose]: () => { },
      +        };
      +    }
      +    /**
      +     * Destroy a stream, preventing it from being used for any further purpose.
      +     *
      +     * If the stream has a `close()` method, then it will be called on
      +     * destruction.
      +     *
      +     * After destruction, any attempt to write data, read data, or emit most
      +     * events will be ignored.
      +     *
      +     * If an error argument is provided, then it will be emitted in an
      +     * 'error' event.
      +     */
      +    destroy(er) {
      +        if (this[DESTROYED]) {
      +            if (er)
      +                this.emit('error', er);
      +            else
      +                this.emit(DESTROYED);
      +            return this;
      +        }
      +        this[DESTROYED] = true;
      +        this[DISCARDED] = true;
      +        // throw away all buffered data, it's never coming out
      +        this[BUFFER].length = 0;
      +        this[BUFFERLENGTH] = 0;
      +        const wc = this;
      +        if (typeof wc.close === 'function' && !this[CLOSED])
      +            wc.close();
      +        if (er)
      +            this.emit('error', er);
      +        // if no error to emit, still reject pending promises
      +        else
      +            this.emit(DESTROYED);
      +        return this;
      +    }
      +    /**
      +     * Alias for {@link isStream}
      +     *
      +     * Former export location, maintained for backwards compatibility.
      +     *
      +     * @deprecated
      +     */
      +    static get isStream() {
      +        return exports.isStream;
      +    }
      +}
      +exports.Minipass = Minipass;
      +//# sourceMappingURL=index.js.map
      \ No newline at end of file
      diff --git a/node_modules/minipass/dist/commonjs/index.js.map b/node_modules/minipass/dist/commonjs/index.js.map
      new file mode 100644
      index 00000000..1687b4c9
      --- /dev/null
      +++ b/node_modules/minipass/dist/commonjs/index.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["const proc =\n  typeof process === 'object' && process\n    ? process\n    : {\n        stdout: null,\n        stderr: null,\n      }\nimport { EventEmitter } from 'node:events'\nimport Stream from 'node:stream'\nimport { StringDecoder } from 'node:string_decoder'\n\n/**\n * Same as StringDecoder, but exposing the `lastNeed` flag on the type\n */\ntype SD = StringDecoder & { lastNeed: boolean }\n\nexport type { SD, Pipe, PipeProxyErrors }\n\n/**\n * Return true if the argument is a Minipass stream, Node stream, or something\n * else that Minipass can interact with.\n */\nexport const isStream = (\n  s: any\n): s is Minipass.Readable | Minipass.Writable =>\n  !!s &&\n  typeof s === 'object' &&\n  (s instanceof Minipass ||\n    s instanceof Stream ||\n    isReadable(s) ||\n    isWritable(s))\n\n/**\n * Return true if the argument is a valid {@link Minipass.Readable}\n */\nexport const isReadable = (s: any): s is Minipass.Readable =>\n  !!s &&\n  typeof s === 'object' &&\n  s instanceof EventEmitter &&\n  typeof (s as Minipass.Readable).pipe === 'function' &&\n  // node core Writable streams have a pipe() method, but it throws\n  (s as Minipass.Readable).pipe !== Stream.Writable.prototype.pipe\n\n/**\n * Return true if the argument is a valid {@link Minipass.Writable}\n */\nexport const isWritable = (s: any): s is Minipass.Readable =>\n  !!s &&\n  typeof s === 'object' &&\n  s instanceof EventEmitter &&\n  typeof (s as Minipass.Writable).write === 'function' &&\n  typeof (s as Minipass.Writable).end === 'function'\n\nconst EOF = Symbol('EOF')\nconst MAYBE_EMIT_END = Symbol('maybeEmitEnd')\nconst EMITTED_END = Symbol('emittedEnd')\nconst EMITTING_END = Symbol('emittingEnd')\nconst EMITTED_ERROR = Symbol('emittedError')\nconst CLOSED = Symbol('closed')\nconst READ = Symbol('read')\nconst FLUSH = Symbol('flush')\nconst FLUSHCHUNK = Symbol('flushChunk')\nconst ENCODING = Symbol('encoding')\nconst DECODER = Symbol('decoder')\nconst FLOWING = Symbol('flowing')\nconst PAUSED = Symbol('paused')\nconst RESUME = Symbol('resume')\nconst BUFFER = Symbol('buffer')\nconst PIPES = Symbol('pipes')\nconst BUFFERLENGTH = Symbol('bufferLength')\nconst BUFFERPUSH = Symbol('bufferPush')\nconst BUFFERSHIFT = Symbol('bufferShift')\nconst OBJECTMODE = Symbol('objectMode')\n// internal event when stream is destroyed\nconst DESTROYED = Symbol('destroyed')\n// internal event when stream has an error\nconst ERROR = Symbol('error')\nconst EMITDATA = Symbol('emitData')\nconst EMITEND = Symbol('emitEnd')\nconst EMITEND2 = Symbol('emitEnd2')\nconst ASYNC = Symbol('async')\nconst ABORT = Symbol('abort')\nconst ABORTED = Symbol('aborted')\nconst SIGNAL = Symbol('signal')\nconst DATALISTENERS = Symbol('dataListeners')\nconst DISCARDED = Symbol('discarded')\n\nconst defer = (fn: (...a: any[]) => any) => Promise.resolve().then(fn)\nconst nodefer = (fn: (...a: any[]) => any) => fn()\n\n// events that mean 'the stream is over'\n// these are treated specially, and re-emitted\n// if they are listened for after emitting.\ntype EndishEvent = 'end' | 'finish' | 'prefinish'\nconst isEndish = (ev: any): ev is EndishEvent =>\n  ev === 'end' || ev === 'finish' || ev === 'prefinish'\n\nconst isArrayBufferLike = (b: any): b is ArrayBufferLike =>\n  b instanceof ArrayBuffer ||\n  (!!b &&\n    typeof b === 'object' &&\n    b.constructor &&\n    b.constructor.name === 'ArrayBuffer' &&\n    b.byteLength >= 0)\n\nconst isArrayBufferView = (b: any): b is ArrayBufferView =>\n  !Buffer.isBuffer(b) && ArrayBuffer.isView(b)\n\n/**\n * Options that may be passed to stream.pipe()\n */\nexport interface PipeOptions {\n  /**\n   * end the destination stream when the source stream ends\n   */\n  end?: boolean\n  /**\n   * proxy errors from the source stream to the destination stream\n   */\n  proxyErrors?: boolean\n}\n\n/**\n * Internal class representing a pipe to a destination stream.\n *\n * @internal\n */\nclass Pipe {\n  src: Minipass\n  dest: Minipass\n  opts: PipeOptions\n  ondrain: () => any\n  constructor(\n    src: Minipass,\n    dest: Minipass.Writable,\n    opts: PipeOptions\n  ) {\n    this.src = src\n    this.dest = dest as Minipass\n    this.opts = opts\n    this.ondrain = () => src[RESUME]()\n    this.dest.on('drain', this.ondrain)\n  }\n  unpipe() {\n    this.dest.removeListener('drain', this.ondrain)\n  }\n  // only here for the prototype\n  /* c8 ignore start */\n  proxyErrors(_er: any) {}\n  /* c8 ignore stop */\n  end() {\n    this.unpipe()\n    if (this.opts.end) this.dest.end()\n  }\n}\n\n/**\n * Internal class representing a pipe to a destination stream where\n * errors are proxied.\n *\n * @internal\n */\nclass PipeProxyErrors extends Pipe {\n  unpipe() {\n    this.src.removeListener('error', this.proxyErrors)\n    super.unpipe()\n  }\n  constructor(\n    src: Minipass,\n    dest: Minipass.Writable,\n    opts: PipeOptions\n  ) {\n    super(src, dest, opts)\n    this.proxyErrors = (er: Error) => this.dest.emit('error', er)\n    src.on('error', this.proxyErrors)\n  }\n}\n\nexport namespace Minipass {\n  /**\n   * Encoding used to create a stream that outputs strings rather than\n   * Buffer objects.\n   */\n  export type Encoding = BufferEncoding | 'buffer' | null\n\n  /**\n   * Any stream that Minipass can pipe into\n   */\n  export type Writable =\n    | Minipass\n    | NodeJS.WriteStream\n    | (NodeJS.WriteStream & { fd: number })\n    | (EventEmitter & {\n        end(): any\n        write(chunk: any, ...args: any[]): any\n      })\n\n  /**\n   * Any stream that can be read from\n   */\n  export type Readable =\n    | Minipass\n    | NodeJS.ReadStream\n    | (NodeJS.ReadStream & { fd: number })\n    | (EventEmitter & {\n        pause(): any\n        resume(): any\n        pipe(...destArgs: any[]): any\n      })\n\n  /**\n   * Utility type that can be iterated sync or async\n   */\n  export type DualIterable = Iterable & AsyncIterable\n\n  type EventArguments = Record\n\n  /**\n   * The listing of events that a Minipass class can emit.\n   * Extend this when extending the Minipass class, and pass as\n   * the third template argument.  The key is the name of the event,\n   * and the value is the argument list.\n   *\n   * Any undeclared events will still be allowed, but the handler will get\n   * arguments as `unknown[]`.\n   */\n  export interface Events\n    extends EventArguments {\n    readable: []\n    data: [chunk: RType]\n    error: [er: unknown]\n    abort: [reason: unknown]\n    drain: []\n    resume: []\n    end: []\n    finish: []\n    prefinish: []\n    close: []\n    [DESTROYED]: [er?: unknown]\n    [ERROR]: [er: unknown]\n  }\n\n  /**\n   * String or buffer-like data that can be joined and sliced\n   */\n  export type ContiguousData =\n    | Buffer\n    | ArrayBufferLike\n    | ArrayBufferView\n    | string\n  export type BufferOrString = Buffer | string\n\n  /**\n   * Options passed to the Minipass constructor.\n   */\n  export type SharedOptions = {\n    /**\n     * Defer all data emission and other events until the end of the\n     * current tick, similar to Node core streams\n     */\n    async?: boolean\n    /**\n     * A signal which will abort the stream\n     */\n    signal?: AbortSignal\n    /**\n     * Output string encoding. Set to `null` or `'buffer'` (or omit) to\n     * emit Buffer objects rather than strings.\n     *\n     * Conflicts with `objectMode`\n     */\n    encoding?: BufferEncoding | null | 'buffer'\n    /**\n     * Output data exactly as it was written, supporting non-buffer/string\n     * data (such as arbitrary objects, falsey values, etc.)\n     *\n     * Conflicts with `encoding`\n     */\n    objectMode?: boolean\n  }\n\n  /**\n   * Options for a string encoded output\n   */\n  export type EncodingOptions = SharedOptions & {\n    encoding: BufferEncoding\n    objectMode?: false\n  }\n\n  /**\n   * Options for contiguous data buffer output\n   */\n  export type BufferOptions = SharedOptions & {\n    encoding?: null | 'buffer'\n    objectMode?: false\n  }\n\n  /**\n   * Options for objectMode arbitrary output\n   */\n  export type ObjectModeOptions = SharedOptions & {\n    objectMode: true\n    encoding?: null\n  }\n\n  /**\n   * Utility type to determine allowed options based on read type\n   */\n  export type Options =\n    | ObjectModeOptions\n    | (T extends string\n        ? EncodingOptions\n        : T extends Buffer\n        ? BufferOptions\n        : SharedOptions)\n}\n\nconst isObjectModeOptions = (\n  o: Minipass.SharedOptions\n): o is Minipass.ObjectModeOptions => !!o.objectMode\n\nconst isEncodingOptions = (\n  o: Minipass.SharedOptions\n): o is Minipass.EncodingOptions =>\n  !o.objectMode && !!o.encoding && o.encoding !== 'buffer'\n\n/**\n * Main export, the Minipass class\n *\n * `RType` is the type of data emitted, defaults to Buffer\n *\n * `WType` is the type of data to be written, if RType is buffer or string,\n * then any {@link Minipass.ContiguousData} is allowed.\n *\n * `Events` is the set of event handler signatures that this object\n * will emit, see {@link Minipass.Events}\n */\nexport class Minipass<\n    RType extends unknown = Buffer,\n    WType extends unknown = RType extends Minipass.BufferOrString\n      ? Minipass.ContiguousData\n      : RType,\n    Events extends Minipass.Events = Minipass.Events\n  >\n  extends EventEmitter\n  implements Minipass.DualIterable\n{\n  [FLOWING]: boolean = false;\n  [PAUSED]: boolean = false;\n  [PIPES]: Pipe[] = [];\n  [BUFFER]: RType[] = [];\n  [OBJECTMODE]: boolean;\n  [ENCODING]: BufferEncoding | null;\n  [ASYNC]: boolean;\n  [DECODER]: SD | null;\n  [EOF]: boolean = false;\n  [EMITTED_END]: boolean = false;\n  [EMITTING_END]: boolean = false;\n  [CLOSED]: boolean = false;\n  [EMITTED_ERROR]: unknown = null;\n  [BUFFERLENGTH]: number = 0;\n  [DESTROYED]: boolean = false;\n  [SIGNAL]?: AbortSignal;\n  [ABORTED]: boolean = false;\n  [DATALISTENERS]: number = 0;\n  [DISCARDED]: boolean = false\n\n  /**\n   * true if the stream can be written\n   */\n  writable: boolean = true\n  /**\n   * true if the stream can be read\n   */\n  readable: boolean = true\n\n  /**\n   * If `RType` is Buffer, then options do not need to be provided.\n   * Otherwise, an options object must be provided to specify either\n   * {@link Minipass.SharedOptions.objectMode} or\n   * {@link Minipass.SharedOptions.encoding}, as appropriate.\n   */\n  constructor(\n    ...args:\n      | [Minipass.ObjectModeOptions]\n      | (RType extends Buffer\n          ? [] | [Minipass.Options]\n          : [Minipass.Options])\n  ) {\n    const options: Minipass.Options = (args[0] ||\n      {}) as Minipass.Options\n    super()\n    if (options.objectMode && typeof options.encoding === 'string') {\n      throw new TypeError(\n        'Encoding and objectMode may not be used together'\n      )\n    }\n    if (isObjectModeOptions(options)) {\n      this[OBJECTMODE] = true\n      this[ENCODING] = null\n    } else if (isEncodingOptions(options)) {\n      this[ENCODING] = options.encoding\n      this[OBJECTMODE] = false\n    } else {\n      this[OBJECTMODE] = false\n      this[ENCODING] = null\n    }\n    this[ASYNC] = !!options.async\n    this[DECODER] = this[ENCODING]\n      ? (new StringDecoder(this[ENCODING]) as SD)\n      : null\n\n    //@ts-ignore - private option for debugging and testing\n    if (options && options.debugExposeBuffer === true) {\n      Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] })\n    }\n    //@ts-ignore - private option for debugging and testing\n    if (options && options.debugExposePipes === true) {\n      Object.defineProperty(this, 'pipes', { get: () => this[PIPES] })\n    }\n\n    const { signal } = options\n    if (signal) {\n      this[SIGNAL] = signal\n      if (signal.aborted) {\n        this[ABORT]()\n      } else {\n        signal.addEventListener('abort', () => this[ABORT]())\n      }\n    }\n  }\n\n  /**\n   * The amount of data stored in the buffer waiting to be read.\n   *\n   * For Buffer strings, this will be the total byte length.\n   * For string encoding streams, this will be the string character length,\n   * according to JavaScript's `string.length` logic.\n   * For objectMode streams, this is a count of the items waiting to be\n   * emitted.\n   */\n  get bufferLength() {\n    return this[BUFFERLENGTH]\n  }\n\n  /**\n   * The `BufferEncoding` currently in use, or `null`\n   */\n  get encoding() {\n    return this[ENCODING]\n  }\n\n  /**\n   * @deprecated - This is a read only property\n   */\n  set encoding(_enc) {\n    throw new Error('Encoding must be set at instantiation time')\n  }\n\n  /**\n   * @deprecated - Encoding may only be set at instantiation time\n   */\n  setEncoding(_enc: Minipass.Encoding) {\n    throw new Error('Encoding must be set at instantiation time')\n  }\n\n  /**\n   * True if this is an objectMode stream\n   */\n  get objectMode() {\n    return this[OBJECTMODE]\n  }\n\n  /**\n   * @deprecated - This is a read-only property\n   */\n  set objectMode(_om) {\n    throw new Error('objectMode must be set at instantiation time')\n  }\n\n  /**\n   * true if this is an async stream\n   */\n  get ['async'](): boolean {\n    return this[ASYNC]\n  }\n  /**\n   * Set to true to make this stream async.\n   *\n   * Once set, it cannot be unset, as this would potentially cause incorrect\n   * behavior.  Ie, a sync stream can be made async, but an async stream\n   * cannot be safely made sync.\n   */\n  set ['async'](a: boolean) {\n    this[ASYNC] = this[ASYNC] || !!a\n  }\n\n  // drop everything and get out of the flow completely\n  [ABORT]() {\n    this[ABORTED] = true\n    this.emit('abort', this[SIGNAL]?.reason)\n    this.destroy(this[SIGNAL]?.reason)\n  }\n\n  /**\n   * True if the stream has been aborted.\n   */\n  get aborted() {\n    return this[ABORTED]\n  }\n  /**\n   * No-op setter. Stream aborted status is set via the AbortSignal provided\n   * in the constructor options.\n   */\n  set aborted(_) {}\n\n  /**\n   * Write data into the stream\n   *\n   * If the chunk written is a string, and encoding is not specified, then\n   * `utf8` will be assumed. If the stream encoding matches the encoding of\n   * a written string, and the state of the string decoder allows it, then\n   * the string will be passed through to either the output or the internal\n   * buffer without any processing. Otherwise, it will be turned into a\n   * Buffer object for processing into the desired encoding.\n   *\n   * If provided, `cb` function is called immediately before return for\n   * sync streams, or on next tick for async streams, because for this\n   * base class, a chunk is considered \"processed\" once it is accepted\n   * and either emitted or buffered. That is, the callback does not indicate\n   * that the chunk has been eventually emitted, though of course child\n   * classes can override this function to do whatever processing is required\n   * and call `super.write(...)` only once processing is completed.\n   */\n  write(chunk: WType, cb?: () => void): boolean\n  write(\n    chunk: WType,\n    encoding?: Minipass.Encoding,\n    cb?: () => void\n  ): boolean\n  write(\n    chunk: WType,\n    encoding?: Minipass.Encoding | (() => void),\n    cb?: () => void\n  ): boolean {\n    if (this[ABORTED]) return false\n    if (this[EOF]) throw new Error('write after end')\n\n    if (this[DESTROYED]) {\n      this.emit(\n        'error',\n        Object.assign(\n          new Error('Cannot call write after a stream was destroyed'),\n          { code: 'ERR_STREAM_DESTROYED' }\n        )\n      )\n      return true\n    }\n\n    if (typeof encoding === 'function') {\n      cb = encoding\n      encoding = 'utf8'\n    }\n\n    if (!encoding) encoding = 'utf8'\n\n    const fn = this[ASYNC] ? defer : nodefer\n\n    // convert array buffers and typed array views into buffers\n    // at some point in the future, we may want to do the opposite!\n    // leave strings and buffers as-is\n    // anything is only allowed if in object mode, so throw\n    if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) {\n      if (isArrayBufferView(chunk)) {\n        //@ts-ignore - sinful unsafe type changing\n        chunk = Buffer.from(\n          chunk.buffer,\n          chunk.byteOffset,\n          chunk.byteLength\n        )\n      } else if (isArrayBufferLike(chunk)) {\n        //@ts-ignore - sinful unsafe type changing\n        chunk = Buffer.from(chunk)\n      } else if (typeof chunk !== 'string') {\n        throw new Error(\n          'Non-contiguous data written to non-objectMode stream'\n        )\n      }\n    }\n\n    // handle object mode up front, since it's simpler\n    // this yields better performance, fewer checks later.\n    if (this[OBJECTMODE]) {\n      // maybe impossible?\n      /* c8 ignore start */\n      if (this[FLOWING] && this[BUFFERLENGTH] !== 0) this[FLUSH](true)\n      /* c8 ignore stop */\n\n      if (this[FLOWING]) this.emit('data', chunk as unknown as RType)\n      else this[BUFFERPUSH](chunk as unknown as RType)\n\n      if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n\n      if (cb) fn(cb)\n\n      return this[FLOWING]\n    }\n\n    // at this point the chunk is a buffer or string\n    // don't buffer it up or send it to the decoder\n    if (!(chunk as Minipass.BufferOrString).length) {\n      if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n      if (cb) fn(cb)\n      return this[FLOWING]\n    }\n\n    // fast-path writing strings of same encoding to a stream with\n    // an empty buffer, skipping the buffer/decoder dance\n    if (\n      typeof chunk === 'string' &&\n      // unless it is a string already ready for us to use\n      !(encoding === this[ENCODING] && !this[DECODER]?.lastNeed)\n    ) {\n      //@ts-ignore - sinful unsafe type change\n      chunk = Buffer.from(chunk, encoding)\n    }\n\n    if (Buffer.isBuffer(chunk) && this[ENCODING]) {\n      //@ts-ignore - sinful unsafe type change\n      chunk = this[DECODER].write(chunk)\n    }\n\n    // Note: flushing CAN potentially switch us into not-flowing mode\n    if (this[FLOWING] && this[BUFFERLENGTH] !== 0) this[FLUSH](true)\n\n    if (this[FLOWING]) this.emit('data', chunk as unknown as RType)\n    else this[BUFFERPUSH](chunk as unknown as RType)\n\n    if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n\n    if (cb) fn(cb)\n\n    return this[FLOWING]\n  }\n\n  /**\n   * Low-level explicit read method.\n   *\n   * In objectMode, the argument is ignored, and one item is returned if\n   * available.\n   *\n   * `n` is the number of bytes (or in the case of encoding streams,\n   * characters) to consume. If `n` is not provided, then the entire buffer\n   * is returned, or `null` is returned if no data is available.\n   *\n   * If `n` is greater that the amount of data in the internal buffer,\n   * then `null` is returned.\n   */\n  read(n?: number | null): RType | null {\n    if (this[DESTROYED]) return null\n    this[DISCARDED] = false\n\n    if (\n      this[BUFFERLENGTH] === 0 ||\n      n === 0 ||\n      (n && n > this[BUFFERLENGTH])\n    ) {\n      this[MAYBE_EMIT_END]()\n      return null\n    }\n\n    if (this[OBJECTMODE]) n = null\n\n    if (this[BUFFER].length > 1 && !this[OBJECTMODE]) {\n      // not object mode, so if we have an encoding, then RType is string\n      // otherwise, must be Buffer\n      this[BUFFER] = [\n        (this[ENCODING]\n          ? this[BUFFER].join('')\n          : Buffer.concat(\n              this[BUFFER] as Buffer[],\n              this[BUFFERLENGTH]\n            )) as RType,\n      ]\n    }\n\n    const ret = this[READ](n || null, this[BUFFER][0] as RType)\n    this[MAYBE_EMIT_END]()\n    return ret\n  }\n\n  [READ](n: number | null, chunk: RType) {\n    if (this[OBJECTMODE]) this[BUFFERSHIFT]()\n    else {\n      const c = chunk as Minipass.BufferOrString\n      if (n === c.length || n === null) this[BUFFERSHIFT]()\n      else if (typeof c === 'string') {\n        this[BUFFER][0] = c.slice(n) as RType\n        chunk = c.slice(0, n) as RType\n        this[BUFFERLENGTH] -= n\n      } else {\n        this[BUFFER][0] = c.subarray(n) as RType\n        chunk = c.subarray(0, n) as RType\n        this[BUFFERLENGTH] -= n\n      }\n    }\n\n    this.emit('data', chunk)\n\n    if (!this[BUFFER].length && !this[EOF]) this.emit('drain')\n\n    return chunk\n  }\n\n  /**\n   * End the stream, optionally providing a final write.\n   *\n   * See {@link Minipass#write} for argument descriptions\n   */\n  end(cb?: () => void): this\n  end(chunk: WType, cb?: () => void): this\n  end(chunk: WType, encoding?: Minipass.Encoding, cb?: () => void): this\n  end(\n    chunk?: WType | (() => void),\n    encoding?: Minipass.Encoding | (() => void),\n    cb?: () => void\n  ): this {\n    if (typeof chunk === 'function') {\n      cb = chunk as () => void\n      chunk = undefined\n    }\n    if (typeof encoding === 'function') {\n      cb = encoding\n      encoding = 'utf8'\n    }\n    if (chunk !== undefined) this.write(chunk, encoding)\n    if (cb) this.once('end', cb)\n    this[EOF] = true\n    this.writable = false\n\n    // if we haven't written anything, then go ahead and emit,\n    // even if we're not reading.\n    // we'll re-emit if a new 'end' listener is added anyway.\n    // This makes MP more suitable to write-only use cases.\n    if (this[FLOWING] || !this[PAUSED]) this[MAYBE_EMIT_END]()\n    return this\n  }\n\n  // don't let the internal resume be overwritten\n  [RESUME]() {\n    if (this[DESTROYED]) return\n\n    if (!this[DATALISTENERS] && !this[PIPES].length) {\n      this[DISCARDED] = true\n    }\n    this[PAUSED] = false\n    this[FLOWING] = true\n    this.emit('resume')\n    if (this[BUFFER].length) this[FLUSH]()\n    else if (this[EOF]) this[MAYBE_EMIT_END]()\n    else this.emit('drain')\n  }\n\n  /**\n   * Resume the stream if it is currently in a paused state\n   *\n   * If called when there are no pipe destinations or `data` event listeners,\n   * this will place the stream in a \"discarded\" state, where all data will\n   * be thrown away. The discarded state is removed if a pipe destination or\n   * data handler is added, if pause() is called, or if any synchronous or\n   * asynchronous iteration is started.\n   */\n  resume() {\n    return this[RESUME]()\n  }\n\n  /**\n   * Pause the stream\n   */\n  pause() {\n    this[FLOWING] = false\n    this[PAUSED] = true\n    this[DISCARDED] = false\n  }\n\n  /**\n   * true if the stream has been forcibly destroyed\n   */\n  get destroyed() {\n    return this[DESTROYED]\n  }\n\n  /**\n   * true if the stream is currently in a flowing state, meaning that\n   * any writes will be immediately emitted.\n   */\n  get flowing() {\n    return this[FLOWING]\n  }\n\n  /**\n   * true if the stream is currently in a paused state\n   */\n  get paused() {\n    return this[PAUSED]\n  }\n\n  [BUFFERPUSH](chunk: RType) {\n    if (this[OBJECTMODE]) this[BUFFERLENGTH] += 1\n    else this[BUFFERLENGTH] += (chunk as Minipass.BufferOrString).length\n    this[BUFFER].push(chunk)\n  }\n\n  [BUFFERSHIFT](): RType {\n    if (this[OBJECTMODE]) this[BUFFERLENGTH] -= 1\n    else\n      this[BUFFERLENGTH] -= (\n        this[BUFFER][0] as Minipass.BufferOrString\n      ).length\n    return this[BUFFER].shift() as RType\n  }\n\n  [FLUSH](noDrain: boolean = false) {\n    do {} while (\n      this[FLUSHCHUNK](this[BUFFERSHIFT]()) &&\n      this[BUFFER].length\n    )\n\n    if (!noDrain && !this[BUFFER].length && !this[EOF]) this.emit('drain')\n  }\n\n  [FLUSHCHUNK](chunk: RType) {\n    this.emit('data', chunk)\n    return this[FLOWING]\n  }\n\n  /**\n   * Pipe all data emitted by this stream into the destination provided.\n   *\n   * Triggers the flow of data.\n   */\n  pipe(dest: W, opts?: PipeOptions): W {\n    if (this[DESTROYED]) return dest\n    this[DISCARDED] = false\n\n    const ended = this[EMITTED_END]\n    opts = opts || {}\n    if (dest === proc.stdout || dest === proc.stderr) opts.end = false\n    else opts.end = opts.end !== false\n    opts.proxyErrors = !!opts.proxyErrors\n\n    // piping an ended stream ends immediately\n    if (ended) {\n      if (opts.end) dest.end()\n    } else {\n      // \"as\" here just ignores the WType, which pipes don't care about,\n      // since they're only consuming from us, and writing to the dest\n      this[PIPES].push(\n        !opts.proxyErrors\n          ? new Pipe(this as Minipass, dest, opts)\n          : new PipeProxyErrors(this as Minipass, dest, opts)\n      )\n      if (this[ASYNC]) defer(() => this[RESUME]())\n      else this[RESUME]()\n    }\n\n    return dest\n  }\n\n  /**\n   * Fully unhook a piped destination stream.\n   *\n   * If the destination stream was the only consumer of this stream (ie,\n   * there are no other piped destinations or `'data'` event listeners)\n   * then the flow of data will stop until there is another consumer or\n   * {@link Minipass#resume} is explicitly called.\n   */\n  unpipe(dest: W) {\n    const p = this[PIPES].find(p => p.dest === dest)\n    if (p) {\n      if (this[PIPES].length === 1) {\n        if (this[FLOWING] && this[DATALISTENERS] === 0) {\n          this[FLOWING] = false\n        }\n        this[PIPES] = []\n      } else this[PIPES].splice(this[PIPES].indexOf(p), 1)\n      p.unpipe()\n    }\n  }\n\n  /**\n   * Alias for {@link Minipass#on}\n   */\n  addListener(\n    ev: Event,\n    handler: (...args: Events[Event]) => any\n  ): this {\n    return this.on(ev, handler)\n  }\n\n  /**\n   * Mostly identical to `EventEmitter.on`, with the following\n   * behavior differences to prevent data loss and unnecessary hangs:\n   *\n   * - Adding a 'data' event handler will trigger the flow of data\n   *\n   * - Adding a 'readable' event handler when there is data waiting to be read\n   *   will cause 'readable' to be emitted immediately.\n   *\n   * - Adding an 'endish' event handler ('end', 'finish', etc.) which has\n   *   already passed will cause the event to be emitted immediately and all\n   *   handlers removed.\n   *\n   * - Adding an 'error' event handler after an error has been emitted will\n   *   cause the event to be re-emitted immediately with the error previously\n   *   raised.\n   */\n  on(\n    ev: Event,\n    handler: (...args: Events[Event]) => any\n  ): this {\n    const ret = super.on(\n      ev as string | symbol,\n      handler as (...a: any[]) => any\n    )\n    if (ev === 'data') {\n      this[DISCARDED] = false\n      this[DATALISTENERS]++\n      if (!this[PIPES].length && !this[FLOWING]) {\n        this[RESUME]()\n      }\n    } else if (ev === 'readable' && this[BUFFERLENGTH] !== 0) {\n      super.emit('readable')\n    } else if (isEndish(ev) && this[EMITTED_END]) {\n      super.emit(ev)\n      this.removeAllListeners(ev)\n    } else if (ev === 'error' && this[EMITTED_ERROR]) {\n      const h = handler as (...a: Events['error']) => any\n      if (this[ASYNC]) defer(() => h.call(this, this[EMITTED_ERROR]))\n      else h.call(this, this[EMITTED_ERROR])\n    }\n    return ret\n  }\n\n  /**\n   * Alias for {@link Minipass#off}\n   */\n  removeListener(\n    ev: Event,\n    handler: (...args: Events[Event]) => any\n  ) {\n    return this.off(ev, handler)\n  }\n\n  /**\n   * Mostly identical to `EventEmitter.off`\n   *\n   * If a 'data' event handler is removed, and it was the last consumer\n   * (ie, there are no pipe destinations or other 'data' event listeners),\n   * then the flow of data will stop until there is another consumer or\n   * {@link Minipass#resume} is explicitly called.\n   */\n  off(\n    ev: Event,\n    handler: (...args: Events[Event]) => any\n  ) {\n    const ret = super.off(\n      ev as string | symbol,\n      handler as (...a: any[]) => any\n    )\n    // if we previously had listeners, and now we don't, and we don't\n    // have any pipes, then stop the flow, unless it's been explicitly\n    // put in a discarded flowing state via stream.resume().\n    if (ev === 'data') {\n      this[DATALISTENERS] = this.listeners('data').length\n      if (\n        this[DATALISTENERS] === 0 &&\n        !this[DISCARDED] &&\n        !this[PIPES].length\n      ) {\n        this[FLOWING] = false\n      }\n    }\n    return ret\n  }\n\n  /**\n   * Mostly identical to `EventEmitter.removeAllListeners`\n   *\n   * If all 'data' event handlers are removed, and they were the last consumer\n   * (ie, there are no pipe destinations), then the flow of data will stop\n   * until there is another consumer or {@link Minipass#resume} is explicitly\n   * called.\n   */\n  removeAllListeners(ev?: Event) {\n    const ret = super.removeAllListeners(ev as string | symbol | undefined)\n    if (ev === 'data' || ev === undefined) {\n      this[DATALISTENERS] = 0\n      if (!this[DISCARDED] && !this[PIPES].length) {\n        this[FLOWING] = false\n      }\n    }\n    return ret\n  }\n\n  /**\n   * true if the 'end' event has been emitted\n   */\n  get emittedEnd() {\n    return this[EMITTED_END]\n  }\n\n  [MAYBE_EMIT_END]() {\n    if (\n      !this[EMITTING_END] &&\n      !this[EMITTED_END] &&\n      !this[DESTROYED] &&\n      this[BUFFER].length === 0 &&\n      this[EOF]\n    ) {\n      this[EMITTING_END] = true\n      this.emit('end')\n      this.emit('prefinish')\n      this.emit('finish')\n      if (this[CLOSED]) this.emit('close')\n      this[EMITTING_END] = false\n    }\n  }\n\n  /**\n   * Mostly identical to `EventEmitter.emit`, with the following\n   * behavior differences to prevent data loss and unnecessary hangs:\n   *\n   * If the stream has been destroyed, and the event is something other\n   * than 'close' or 'error', then `false` is returned and no handlers\n   * are called.\n   *\n   * If the event is 'end', and has already been emitted, then the event\n   * is ignored. If the stream is in a paused or non-flowing state, then\n   * the event will be deferred until data flow resumes. If the stream is\n   * async, then handlers will be called on the next tick rather than\n   * immediately.\n   *\n   * If the event is 'close', and 'end' has not yet been emitted, then\n   * the event will be deferred until after 'end' is emitted.\n   *\n   * If the event is 'error', and an AbortSignal was provided for the stream,\n   * and there are no listeners, then the event is ignored, matching the\n   * behavior of node core streams in the presense of an AbortSignal.\n   *\n   * If the event is 'finish' or 'prefinish', then all listeners will be\n   * removed after emitting the event, to prevent double-firing.\n   */\n  emit(\n    ev: Event,\n    ...args: Events[Event]\n  ): boolean {\n    const data = args[0]\n    // error and close are only events allowed after calling destroy()\n    if (\n      ev !== 'error' &&\n      ev !== 'close' &&\n      ev !== DESTROYED &&\n      this[DESTROYED]\n    ) {\n      return false\n    } else if (ev === 'data') {\n      return !this[OBJECTMODE] && !data\n        ? false\n        : this[ASYNC]\n        ? (defer(() => this[EMITDATA](data as RType)), true)\n        : this[EMITDATA](data as RType)\n    } else if (ev === 'end') {\n      return this[EMITEND]()\n    } else if (ev === 'close') {\n      this[CLOSED] = true\n      // don't emit close before 'end' and 'finish'\n      if (!this[EMITTED_END] && !this[DESTROYED]) return false\n      const ret = super.emit('close')\n      this.removeAllListeners('close')\n      return ret\n    } else if (ev === 'error') {\n      this[EMITTED_ERROR] = data\n      super.emit(ERROR, data)\n      const ret =\n        !this[SIGNAL] || this.listeners('error').length\n          ? super.emit('error', data)\n          : false\n      this[MAYBE_EMIT_END]()\n      return ret\n    } else if (ev === 'resume') {\n      const ret = super.emit('resume')\n      this[MAYBE_EMIT_END]()\n      return ret\n    } else if (ev === 'finish' || ev === 'prefinish') {\n      const ret = super.emit(ev)\n      this.removeAllListeners(ev)\n      return ret\n    }\n\n    // Some other unknown event\n    const ret = super.emit(ev as string, ...args)\n    this[MAYBE_EMIT_END]()\n    return ret\n  }\n\n  [EMITDATA](data: RType) {\n    for (const p of this[PIPES]) {\n      if (p.dest.write(data as RType) === false) this.pause()\n    }\n    const ret = this[DISCARDED] ? false : super.emit('data', data)\n    this[MAYBE_EMIT_END]()\n    return ret\n  }\n\n  [EMITEND]() {\n    if (this[EMITTED_END]) return false\n\n    this[EMITTED_END] = true\n    this.readable = false\n    return this[ASYNC]\n      ? (defer(() => this[EMITEND2]()), true)\n      : this[EMITEND2]()\n  }\n\n  [EMITEND2]() {\n    if (this[DECODER]) {\n      const data = this[DECODER].end()\n      if (data) {\n        for (const p of this[PIPES]) {\n          p.dest.write(data as RType)\n        }\n        if (!this[DISCARDED]) super.emit('data', data)\n      }\n    }\n\n    for (const p of this[PIPES]) {\n      p.end()\n    }\n    const ret = super.emit('end')\n    this.removeAllListeners('end')\n    return ret\n  }\n\n  /**\n   * Return a Promise that resolves to an array of all emitted data once\n   * the stream ends.\n   */\n  async collect(): Promise {\n    const buf: RType[] & { dataLength: number } = Object.assign([], {\n      dataLength: 0,\n    })\n    if (!this[OBJECTMODE]) buf.dataLength = 0\n    // set the promise first, in case an error is raised\n    // by triggering the flow here.\n    const p = this.promise()\n    this.on('data', c => {\n      buf.push(c)\n      if (!this[OBJECTMODE])\n        buf.dataLength += (c as Minipass.BufferOrString).length\n    })\n    await p\n    return buf\n  }\n\n  /**\n   * Return a Promise that resolves to the concatenation of all emitted data\n   * once the stream ends.\n   *\n   * Not allowed on objectMode streams.\n   */\n  async concat(): Promise {\n    if (this[OBJECTMODE]) {\n      throw new Error('cannot concat in objectMode')\n    }\n    const buf = await this.collect()\n    return (\n      this[ENCODING]\n        ? buf.join('')\n        : Buffer.concat(buf as Buffer[], buf.dataLength)\n    ) as RType\n  }\n\n  /**\n   * Return a void Promise that resolves once the stream ends.\n   */\n  async promise(): Promise {\n    return new Promise((resolve, reject) => {\n      this.on(DESTROYED, () => reject(new Error('stream destroyed')))\n      this.on('error', er => reject(er))\n      this.on('end', () => resolve())\n    })\n  }\n\n  /**\n   * Asynchronous `for await of` iteration.\n   *\n   * This will continue emitting all chunks until the stream terminates.\n   */\n  [Symbol.asyncIterator](): AsyncGenerator {\n    // set this up front, in case the consumer doesn't call next()\n    // right away.\n    this[DISCARDED] = false\n    let stopped = false\n    const stop = async (): Promise> => {\n      this.pause()\n      stopped = true\n      return { value: undefined, done: true }\n    }\n    const next = (): Promise> => {\n      if (stopped) return stop()\n      const res = this.read()\n      if (res !== null) return Promise.resolve({ done: false, value: res })\n\n      if (this[EOF]) return stop()\n\n      let resolve!: (res: IteratorResult) => void\n      let reject!: (er: unknown) => void\n      const onerr = (er: unknown) => {\n        this.off('data', ondata)\n        this.off('end', onend)\n        this.off(DESTROYED, ondestroy)\n        stop()\n        reject(er)\n      }\n      const ondata = (value: RType) => {\n        this.off('error', onerr)\n        this.off('end', onend)\n        this.off(DESTROYED, ondestroy)\n        this.pause()\n        resolve({ value, done: !!this[EOF] })\n      }\n      const onend = () => {\n        this.off('error', onerr)\n        this.off('data', ondata)\n        this.off(DESTROYED, ondestroy)\n        stop()\n        resolve({ done: true, value: undefined })\n      }\n      const ondestroy = () => onerr(new Error('stream destroyed'))\n      return new Promise>((res, rej) => {\n        reject = rej\n        resolve = res\n        this.once(DESTROYED, ondestroy)\n        this.once('error', onerr)\n        this.once('end', onend)\n        this.once('data', ondata)\n      })\n    }\n\n    return {\n      next,\n      throw: stop,\n      return: stop,\n      [Symbol.asyncIterator]() {\n        return this\n      },\n      [Symbol.asyncDispose]: async () => {},\n    }\n  }\n\n  /**\n   * Synchronous `for of` iteration.\n   *\n   * The iteration will terminate when the internal buffer runs out, even\n   * if the stream has not yet terminated.\n   */\n  [Symbol.iterator](): Generator {\n    // set this up front, in case the consumer doesn't call next()\n    // right away.\n    this[DISCARDED] = false\n    let stopped = false\n    const stop = (): IteratorReturnResult => {\n      this.pause()\n      this.off(ERROR, stop)\n      this.off(DESTROYED, stop)\n      this.off('end', stop)\n      stopped = true\n      return { done: true, value: undefined }\n    }\n\n    const next = (): IteratorResult => {\n      if (stopped) return stop()\n      const value = this.read()\n      return value === null ? stop() : { done: false, value }\n    }\n\n    this.once('end', stop)\n    this.once(ERROR, stop)\n    this.once(DESTROYED, stop)\n\n    return {\n      next,\n      throw: stop,\n      return: stop,\n      [Symbol.iterator]() {\n        return this\n      },\n      [Symbol.dispose]: () => {},\n    }\n  }\n\n  /**\n   * Destroy a stream, preventing it from being used for any further purpose.\n   *\n   * If the stream has a `close()` method, then it will be called on\n   * destruction.\n   *\n   * After destruction, any attempt to write data, read data, or emit most\n   * events will be ignored.\n   *\n   * If an error argument is provided, then it will be emitted in an\n   * 'error' event.\n   */\n  destroy(er?: unknown) {\n    if (this[DESTROYED]) {\n      if (er) this.emit('error', er)\n      else this.emit(DESTROYED)\n      return this\n    }\n\n    this[DESTROYED] = true\n    this[DISCARDED] = true\n\n    // throw away all buffered data, it's never coming out\n    this[BUFFER].length = 0\n    this[BUFFERLENGTH] = 0\n\n    const wc = this as Minipass & {\n      close?: () => void\n    }\n    if (typeof wc.close === 'function' && !this[CLOSED]) wc.close()\n\n    if (er) this.emit('error', er)\n    // if no error to emit, still reject pending promises\n    else this.emit(DESTROYED)\n\n    return this\n  }\n\n  /**\n   * Alias for {@link isStream}\n   *\n   * Former export location, maintained for backwards compatibility.\n   *\n   * @deprecated\n   */\n  static get isStream() {\n    return isStream\n  }\n}\n"]}
      \ No newline at end of file
      diff --git a/node_modules/minipass/dist/commonjs/package.json b/node_modules/minipass/dist/commonjs/package.json
      new file mode 100644
      index 00000000..5bbefffb
      --- /dev/null
      +++ b/node_modules/minipass/dist/commonjs/package.json
      @@ -0,0 +1,3 @@
      +{
      +  "type": "commonjs"
      +}
      diff --git a/node_modules/minipass/dist/esm/index.d.ts b/node_modules/minipass/dist/esm/index.d.ts
      new file mode 100644
      index 00000000..3e75b578
      --- /dev/null
      +++ b/node_modules/minipass/dist/esm/index.d.ts
      @@ -0,0 +1,545 @@
      +import { EventEmitter } from 'node:events';
      +import { StringDecoder } from 'node:string_decoder';
      +/**
      + * Same as StringDecoder, but exposing the `lastNeed` flag on the type
      + */
      +type SD = StringDecoder & {
      +    lastNeed: boolean;
      +};
      +export type { SD, Pipe, PipeProxyErrors };
      +/**
      + * Return true if the argument is a Minipass stream, Node stream, or something
      + * else that Minipass can interact with.
      + */
      +export declare const isStream: (s: any) => s is Minipass | NodeJS.ReadStream | NodeJS.WriteStream | (EventEmitter & {
      +    end(): any;
      +    write(chunk: any, ...args: any[]): any;
      +}) | (EventEmitter & {
      +    pause(): any;
      +    resume(): any;
      +    pipe(...destArgs: any[]): any;
      +}) | (NodeJS.ReadStream & {
      +    fd: number;
      +}) | (NodeJS.WriteStream & {
      +    fd: number;
      +});
      +/**
      + * Return true if the argument is a valid {@link Minipass.Readable}
      + */
      +export declare const isReadable: (s: any) => s is Minipass.Readable;
      +/**
      + * Return true if the argument is a valid {@link Minipass.Writable}
      + */
      +export declare const isWritable: (s: any) => s is Minipass.Readable;
      +declare const EOF: unique symbol;
      +declare const MAYBE_EMIT_END: unique symbol;
      +declare const EMITTED_END: unique symbol;
      +declare const EMITTING_END: unique symbol;
      +declare const EMITTED_ERROR: unique symbol;
      +declare const CLOSED: unique symbol;
      +declare const READ: unique symbol;
      +declare const FLUSH: unique symbol;
      +declare const FLUSHCHUNK: unique symbol;
      +declare const ENCODING: unique symbol;
      +declare const DECODER: unique symbol;
      +declare const FLOWING: unique symbol;
      +declare const PAUSED: unique symbol;
      +declare const RESUME: unique symbol;
      +declare const BUFFER: unique symbol;
      +declare const PIPES: unique symbol;
      +declare const BUFFERLENGTH: unique symbol;
      +declare const BUFFERPUSH: unique symbol;
      +declare const BUFFERSHIFT: unique symbol;
      +declare const OBJECTMODE: unique symbol;
      +declare const DESTROYED: unique symbol;
      +declare const ERROR: unique symbol;
      +declare const EMITDATA: unique symbol;
      +declare const EMITEND: unique symbol;
      +declare const EMITEND2: unique symbol;
      +declare const ASYNC: unique symbol;
      +declare const ABORT: unique symbol;
      +declare const ABORTED: unique symbol;
      +declare const SIGNAL: unique symbol;
      +declare const DATALISTENERS: unique symbol;
      +declare const DISCARDED: unique symbol;
      +/**
      + * Options that may be passed to stream.pipe()
      + */
      +export interface PipeOptions {
      +    /**
      +     * end the destination stream when the source stream ends
      +     */
      +    end?: boolean;
      +    /**
      +     * proxy errors from the source stream to the destination stream
      +     */
      +    proxyErrors?: boolean;
      +}
      +/**
      + * Internal class representing a pipe to a destination stream.
      + *
      + * @internal
      + */
      +declare class Pipe {
      +    src: Minipass;
      +    dest: Minipass;
      +    opts: PipeOptions;
      +    ondrain: () => any;
      +    constructor(src: Minipass, dest: Minipass.Writable, opts: PipeOptions);
      +    unpipe(): void;
      +    proxyErrors(_er: any): void;
      +    end(): void;
      +}
      +/**
      + * Internal class representing a pipe to a destination stream where
      + * errors are proxied.
      + *
      + * @internal
      + */
      +declare class PipeProxyErrors extends Pipe {
      +    unpipe(): void;
      +    constructor(src: Minipass, dest: Minipass.Writable, opts: PipeOptions);
      +}
      +export declare namespace Minipass {
      +    /**
      +     * Encoding used to create a stream that outputs strings rather than
      +     * Buffer objects.
      +     */
      +    export type Encoding = BufferEncoding | 'buffer' | null;
      +    /**
      +     * Any stream that Minipass can pipe into
      +     */
      +    export type Writable = Minipass | NodeJS.WriteStream | (NodeJS.WriteStream & {
      +        fd: number;
      +    }) | (EventEmitter & {
      +        end(): any;
      +        write(chunk: any, ...args: any[]): any;
      +    });
      +    /**
      +     * Any stream that can be read from
      +     */
      +    export type Readable = Minipass | NodeJS.ReadStream | (NodeJS.ReadStream & {
      +        fd: number;
      +    }) | (EventEmitter & {
      +        pause(): any;
      +        resume(): any;
      +        pipe(...destArgs: any[]): any;
      +    });
      +    /**
      +     * Utility type that can be iterated sync or async
      +     */
      +    export type DualIterable = Iterable & AsyncIterable;
      +    type EventArguments = Record;
      +    /**
      +     * The listing of events that a Minipass class can emit.
      +     * Extend this when extending the Minipass class, and pass as
      +     * the third template argument.  The key is the name of the event,
      +     * and the value is the argument list.
      +     *
      +     * Any undeclared events will still be allowed, but the handler will get
      +     * arguments as `unknown[]`.
      +     */
      +    export interface Events extends EventArguments {
      +        readable: [];
      +        data: [chunk: RType];
      +        error: [er: unknown];
      +        abort: [reason: unknown];
      +        drain: [];
      +        resume: [];
      +        end: [];
      +        finish: [];
      +        prefinish: [];
      +        close: [];
      +        [DESTROYED]: [er?: unknown];
      +        [ERROR]: [er: unknown];
      +    }
      +    /**
      +     * String or buffer-like data that can be joined and sliced
      +     */
      +    export type ContiguousData = Buffer | ArrayBufferLike | ArrayBufferView | string;
      +    export type BufferOrString = Buffer | string;
      +    /**
      +     * Options passed to the Minipass constructor.
      +     */
      +    export type SharedOptions = {
      +        /**
      +         * Defer all data emission and other events until the end of the
      +         * current tick, similar to Node core streams
      +         */
      +        async?: boolean;
      +        /**
      +         * A signal which will abort the stream
      +         */
      +        signal?: AbortSignal;
      +        /**
      +         * Output string encoding. Set to `null` or `'buffer'` (or omit) to
      +         * emit Buffer objects rather than strings.
      +         *
      +         * Conflicts with `objectMode`
      +         */
      +        encoding?: BufferEncoding | null | 'buffer';
      +        /**
      +         * Output data exactly as it was written, supporting non-buffer/string
      +         * data (such as arbitrary objects, falsey values, etc.)
      +         *
      +         * Conflicts with `encoding`
      +         */
      +        objectMode?: boolean;
      +    };
      +    /**
      +     * Options for a string encoded output
      +     */
      +    export type EncodingOptions = SharedOptions & {
      +        encoding: BufferEncoding;
      +        objectMode?: false;
      +    };
      +    /**
      +     * Options for contiguous data buffer output
      +     */
      +    export type BufferOptions = SharedOptions & {
      +        encoding?: null | 'buffer';
      +        objectMode?: false;
      +    };
      +    /**
      +     * Options for objectMode arbitrary output
      +     */
      +    export type ObjectModeOptions = SharedOptions & {
      +        objectMode: true;
      +        encoding?: null;
      +    };
      +    /**
      +     * Utility type to determine allowed options based on read type
      +     */
      +    export type Options = ObjectModeOptions | (T extends string ? EncodingOptions : T extends Buffer ? BufferOptions : SharedOptions);
      +    export {};
      +}
      +/**
      + * Main export, the Minipass class
      + *
      + * `RType` is the type of data emitted, defaults to Buffer
      + *
      + * `WType` is the type of data to be written, if RType is buffer or string,
      + * then any {@link Minipass.ContiguousData} is allowed.
      + *
      + * `Events` is the set of event handler signatures that this object
      + * will emit, see {@link Minipass.Events}
      + */
      +export declare class Minipass = Minipass.Events> extends EventEmitter implements Minipass.DualIterable {
      +    [FLOWING]: boolean;
      +    [PAUSED]: boolean;
      +    [PIPES]: Pipe[];
      +    [BUFFER]: RType[];
      +    [OBJECTMODE]: boolean;
      +    [ENCODING]: BufferEncoding | null;
      +    [ASYNC]: boolean;
      +    [DECODER]: SD | null;
      +    [EOF]: boolean;
      +    [EMITTED_END]: boolean;
      +    [EMITTING_END]: boolean;
      +    [CLOSED]: boolean;
      +    [EMITTED_ERROR]: unknown;
      +    [BUFFERLENGTH]: number;
      +    [DESTROYED]: boolean;
      +    [SIGNAL]?: AbortSignal;
      +    [ABORTED]: boolean;
      +    [DATALISTENERS]: number;
      +    [DISCARDED]: boolean;
      +    /**
      +     * true if the stream can be written
      +     */
      +    writable: boolean;
      +    /**
      +     * true if the stream can be read
      +     */
      +    readable: boolean;
      +    /**
      +     * If `RType` is Buffer, then options do not need to be provided.
      +     * Otherwise, an options object must be provided to specify either
      +     * {@link Minipass.SharedOptions.objectMode} or
      +     * {@link Minipass.SharedOptions.encoding}, as appropriate.
      +     */
      +    constructor(...args: [Minipass.ObjectModeOptions] | (RType extends Buffer ? [] | [Minipass.Options] : [Minipass.Options]));
      +    /**
      +     * The amount of data stored in the buffer waiting to be read.
      +     *
      +     * For Buffer strings, this will be the total byte length.
      +     * For string encoding streams, this will be the string character length,
      +     * according to JavaScript's `string.length` logic.
      +     * For objectMode streams, this is a count of the items waiting to be
      +     * emitted.
      +     */
      +    get bufferLength(): number;
      +    /**
      +     * The `BufferEncoding` currently in use, or `null`
      +     */
      +    get encoding(): BufferEncoding | null;
      +    /**
      +     * @deprecated - This is a read only property
      +     */
      +    set encoding(_enc: BufferEncoding | null);
      +    /**
      +     * @deprecated - Encoding may only be set at instantiation time
      +     */
      +    setEncoding(_enc: Minipass.Encoding): void;
      +    /**
      +     * True if this is an objectMode stream
      +     */
      +    get objectMode(): boolean;
      +    /**
      +     * @deprecated - This is a read-only property
      +     */
      +    set objectMode(_om: boolean);
      +    /**
      +     * true if this is an async stream
      +     */
      +    get ['async'](): boolean;
      +    /**
      +     * Set to true to make this stream async.
      +     *
      +     * Once set, it cannot be unset, as this would potentially cause incorrect
      +     * behavior.  Ie, a sync stream can be made async, but an async stream
      +     * cannot be safely made sync.
      +     */
      +    set ['async'](a: boolean);
      +    [ABORT](): void;
      +    /**
      +     * True if the stream has been aborted.
      +     */
      +    get aborted(): boolean;
      +    /**
      +     * No-op setter. Stream aborted status is set via the AbortSignal provided
      +     * in the constructor options.
      +     */
      +    set aborted(_: boolean);
      +    /**
      +     * Write data into the stream
      +     *
      +     * If the chunk written is a string, and encoding is not specified, then
      +     * `utf8` will be assumed. If the stream encoding matches the encoding of
      +     * a written string, and the state of the string decoder allows it, then
      +     * the string will be passed through to either the output or the internal
      +     * buffer without any processing. Otherwise, it will be turned into a
      +     * Buffer object for processing into the desired encoding.
      +     *
      +     * If provided, `cb` function is called immediately before return for
      +     * sync streams, or on next tick for async streams, because for this
      +     * base class, a chunk is considered "processed" once it is accepted
      +     * and either emitted or buffered. That is, the callback does not indicate
      +     * that the chunk has been eventually emitted, though of course child
      +     * classes can override this function to do whatever processing is required
      +     * and call `super.write(...)` only once processing is completed.
      +     */
      +    write(chunk: WType, cb?: () => void): boolean;
      +    write(chunk: WType, encoding?: Minipass.Encoding, cb?: () => void): boolean;
      +    /**
      +     * Low-level explicit read method.
      +     *
      +     * In objectMode, the argument is ignored, and one item is returned if
      +     * available.
      +     *
      +     * `n` is the number of bytes (or in the case of encoding streams,
      +     * characters) to consume. If `n` is not provided, then the entire buffer
      +     * is returned, or `null` is returned if no data is available.
      +     *
      +     * If `n` is greater that the amount of data in the internal buffer,
      +     * then `null` is returned.
      +     */
      +    read(n?: number | null): RType | null;
      +    [READ](n: number | null, chunk: RType): RType;
      +    /**
      +     * End the stream, optionally providing a final write.
      +     *
      +     * See {@link Minipass#write} for argument descriptions
      +     */
      +    end(cb?: () => void): this;
      +    end(chunk: WType, cb?: () => void): this;
      +    end(chunk: WType, encoding?: Minipass.Encoding, cb?: () => void): this;
      +    [RESUME](): void;
      +    /**
      +     * Resume the stream if it is currently in a paused state
      +     *
      +     * If called when there are no pipe destinations or `data` event listeners,
      +     * this will place the stream in a "discarded" state, where all data will
      +     * be thrown away. The discarded state is removed if a pipe destination or
      +     * data handler is added, if pause() is called, or if any synchronous or
      +     * asynchronous iteration is started.
      +     */
      +    resume(): void;
      +    /**
      +     * Pause the stream
      +     */
      +    pause(): void;
      +    /**
      +     * true if the stream has been forcibly destroyed
      +     */
      +    get destroyed(): boolean;
      +    /**
      +     * true if the stream is currently in a flowing state, meaning that
      +     * any writes will be immediately emitted.
      +     */
      +    get flowing(): boolean;
      +    /**
      +     * true if the stream is currently in a paused state
      +     */
      +    get paused(): boolean;
      +    [BUFFERPUSH](chunk: RType): void;
      +    [BUFFERSHIFT](): RType;
      +    [FLUSH](noDrain?: boolean): void;
      +    [FLUSHCHUNK](chunk: RType): boolean;
      +    /**
      +     * Pipe all data emitted by this stream into the destination provided.
      +     *
      +     * Triggers the flow of data.
      +     */
      +    pipe(dest: W, opts?: PipeOptions): W;
      +    /**
      +     * Fully unhook a piped destination stream.
      +     *
      +     * If the destination stream was the only consumer of this stream (ie,
      +     * there are no other piped destinations or `'data'` event listeners)
      +     * then the flow of data will stop until there is another consumer or
      +     * {@link Minipass#resume} is explicitly called.
      +     */
      +    unpipe(dest: W): void;
      +    /**
      +     * Alias for {@link Minipass#on}
      +     */
      +    addListener(ev: Event, handler: (...args: Events[Event]) => any): this;
      +    /**
      +     * Mostly identical to `EventEmitter.on`, with the following
      +     * behavior differences to prevent data loss and unnecessary hangs:
      +     *
      +     * - Adding a 'data' event handler will trigger the flow of data
      +     *
      +     * - Adding a 'readable' event handler when there is data waiting to be read
      +     *   will cause 'readable' to be emitted immediately.
      +     *
      +     * - Adding an 'endish' event handler ('end', 'finish', etc.) which has
      +     *   already passed will cause the event to be emitted immediately and all
      +     *   handlers removed.
      +     *
      +     * - Adding an 'error' event handler after an error has been emitted will
      +     *   cause the event to be re-emitted immediately with the error previously
      +     *   raised.
      +     */
      +    on(ev: Event, handler: (...args: Events[Event]) => any): this;
      +    /**
      +     * Alias for {@link Minipass#off}
      +     */
      +    removeListener(ev: Event, handler: (...args: Events[Event]) => any): this;
      +    /**
      +     * Mostly identical to `EventEmitter.off`
      +     *
      +     * If a 'data' event handler is removed, and it was the last consumer
      +     * (ie, there are no pipe destinations or other 'data' event listeners),
      +     * then the flow of data will stop until there is another consumer or
      +     * {@link Minipass#resume} is explicitly called.
      +     */
      +    off(ev: Event, handler: (...args: Events[Event]) => any): this;
      +    /**
      +     * Mostly identical to `EventEmitter.removeAllListeners`
      +     *
      +     * If all 'data' event handlers are removed, and they were the last consumer
      +     * (ie, there are no pipe destinations), then the flow of data will stop
      +     * until there is another consumer or {@link Minipass#resume} is explicitly
      +     * called.
      +     */
      +    removeAllListeners(ev?: Event): this;
      +    /**
      +     * true if the 'end' event has been emitted
      +     */
      +    get emittedEnd(): boolean;
      +    [MAYBE_EMIT_END](): void;
      +    /**
      +     * Mostly identical to `EventEmitter.emit`, with the following
      +     * behavior differences to prevent data loss and unnecessary hangs:
      +     *
      +     * If the stream has been destroyed, and the event is something other
      +     * than 'close' or 'error', then `false` is returned and no handlers
      +     * are called.
      +     *
      +     * If the event is 'end', and has already been emitted, then the event
      +     * is ignored. If the stream is in a paused or non-flowing state, then
      +     * the event will be deferred until data flow resumes. If the stream is
      +     * async, then handlers will be called on the next tick rather than
      +     * immediately.
      +     *
      +     * If the event is 'close', and 'end' has not yet been emitted, then
      +     * the event will be deferred until after 'end' is emitted.
      +     *
      +     * If the event is 'error', and an AbortSignal was provided for the stream,
      +     * and there are no listeners, then the event is ignored, matching the
      +     * behavior of node core streams in the presense of an AbortSignal.
      +     *
      +     * If the event is 'finish' or 'prefinish', then all listeners will be
      +     * removed after emitting the event, to prevent double-firing.
      +     */
      +    emit(ev: Event, ...args: Events[Event]): boolean;
      +    [EMITDATA](data: RType): boolean;
      +    [EMITEND](): boolean;
      +    [EMITEND2](): boolean;
      +    /**
      +     * Return a Promise that resolves to an array of all emitted data once
      +     * the stream ends.
      +     */
      +    collect(): Promise;
      +    /**
      +     * Return a Promise that resolves to the concatenation of all emitted data
      +     * once the stream ends.
      +     *
      +     * Not allowed on objectMode streams.
      +     */
      +    concat(): Promise;
      +    /**
      +     * Return a void Promise that resolves once the stream ends.
      +     */
      +    promise(): Promise;
      +    /**
      +     * Asynchronous `for await of` iteration.
      +     *
      +     * This will continue emitting all chunks until the stream terminates.
      +     */
      +    [Symbol.asyncIterator](): AsyncGenerator;
      +    /**
      +     * Synchronous `for of` iteration.
      +     *
      +     * The iteration will terminate when the internal buffer runs out, even
      +     * if the stream has not yet terminated.
      +     */
      +    [Symbol.iterator](): Generator;
      +    /**
      +     * Destroy a stream, preventing it from being used for any further purpose.
      +     *
      +     * If the stream has a `close()` method, then it will be called on
      +     * destruction.
      +     *
      +     * After destruction, any attempt to write data, read data, or emit most
      +     * events will be ignored.
      +     *
      +     * If an error argument is provided, then it will be emitted in an
      +     * 'error' event.
      +     */
      +    destroy(er?: unknown): this;
      +    /**
      +     * Alias for {@link isStream}
      +     *
      +     * Former export location, maintained for backwards compatibility.
      +     *
      +     * @deprecated
      +     */
      +    static get isStream(): (s: any) => s is Minipass | NodeJS.ReadStream | NodeJS.WriteStream | (EventEmitter & {
      +        end(): any;
      +        write(chunk: any, ...args: any[]): any;
      +    }) | (EventEmitter & {
      +        pause(): any;
      +        resume(): any;
      +        pipe(...destArgs: any[]): any;
      +    }) | (NodeJS.ReadStream & {
      +        fd: number;
      +    }) | (NodeJS.WriteStream & {
      +        fd: number;
      +    });
      +}
      +//# sourceMappingURL=index.d.ts.map
      \ No newline at end of file
      diff --git a/node_modules/minipass/dist/esm/index.d.ts.map b/node_modules/minipass/dist/esm/index.d.ts.map
      new file mode 100644
      index 00000000..7bce611b
      --- /dev/null
      +++ b/node_modules/minipass/dist/esm/index.d.ts.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["const proc =\n  typeof process === 'object' && process\n    ? process\n    : {\n        stdout: null,\n        stderr: null,\n      }\nimport { EventEmitter } from 'node:events'\nimport Stream from 'node:stream'\nimport { StringDecoder } from 'node:string_decoder'\n\n/**\n * Same as StringDecoder, but exposing the `lastNeed` flag on the type\n */\ntype SD = StringDecoder & { lastNeed: boolean }\n\nexport type { SD, Pipe, PipeProxyErrors }\n\n/**\n * Return true if the argument is a Minipass stream, Node stream, or something\n * else that Minipass can interact with.\n */\nexport const isStream = (\n  s: any\n): s is Minipass.Readable | Minipass.Writable =>\n  !!s &&\n  typeof s === 'object' &&\n  (s instanceof Minipass ||\n    s instanceof Stream ||\n    isReadable(s) ||\n    isWritable(s))\n\n/**\n * Return true if the argument is a valid {@link Minipass.Readable}\n */\nexport const isReadable = (s: any): s is Minipass.Readable =>\n  !!s &&\n  typeof s === 'object' &&\n  s instanceof EventEmitter &&\n  typeof (s as Minipass.Readable).pipe === 'function' &&\n  // node core Writable streams have a pipe() method, but it throws\n  (s as Minipass.Readable).pipe !== Stream.Writable.prototype.pipe\n\n/**\n * Return true if the argument is a valid {@link Minipass.Writable}\n */\nexport const isWritable = (s: any): s is Minipass.Readable =>\n  !!s &&\n  typeof s === 'object' &&\n  s instanceof EventEmitter &&\n  typeof (s as Minipass.Writable).write === 'function' &&\n  typeof (s as Minipass.Writable).end === 'function'\n\nconst EOF = Symbol('EOF')\nconst MAYBE_EMIT_END = Symbol('maybeEmitEnd')\nconst EMITTED_END = Symbol('emittedEnd')\nconst EMITTING_END = Symbol('emittingEnd')\nconst EMITTED_ERROR = Symbol('emittedError')\nconst CLOSED = Symbol('closed')\nconst READ = Symbol('read')\nconst FLUSH = Symbol('flush')\nconst FLUSHCHUNK = Symbol('flushChunk')\nconst ENCODING = Symbol('encoding')\nconst DECODER = Symbol('decoder')\nconst FLOWING = Symbol('flowing')\nconst PAUSED = Symbol('paused')\nconst RESUME = Symbol('resume')\nconst BUFFER = Symbol('buffer')\nconst PIPES = Symbol('pipes')\nconst BUFFERLENGTH = Symbol('bufferLength')\nconst BUFFERPUSH = Symbol('bufferPush')\nconst BUFFERSHIFT = Symbol('bufferShift')\nconst OBJECTMODE = Symbol('objectMode')\n// internal event when stream is destroyed\nconst DESTROYED = Symbol('destroyed')\n// internal event when stream has an error\nconst ERROR = Symbol('error')\nconst EMITDATA = Symbol('emitData')\nconst EMITEND = Symbol('emitEnd')\nconst EMITEND2 = Symbol('emitEnd2')\nconst ASYNC = Symbol('async')\nconst ABORT = Symbol('abort')\nconst ABORTED = Symbol('aborted')\nconst SIGNAL = Symbol('signal')\nconst DATALISTENERS = Symbol('dataListeners')\nconst DISCARDED = Symbol('discarded')\n\nconst defer = (fn: (...a: any[]) => any) => Promise.resolve().then(fn)\nconst nodefer = (fn: (...a: any[]) => any) => fn()\n\n// events that mean 'the stream is over'\n// these are treated specially, and re-emitted\n// if they are listened for after emitting.\ntype EndishEvent = 'end' | 'finish' | 'prefinish'\nconst isEndish = (ev: any): ev is EndishEvent =>\n  ev === 'end' || ev === 'finish' || ev === 'prefinish'\n\nconst isArrayBufferLike = (b: any): b is ArrayBufferLike =>\n  b instanceof ArrayBuffer ||\n  (!!b &&\n    typeof b === 'object' &&\n    b.constructor &&\n    b.constructor.name === 'ArrayBuffer' &&\n    b.byteLength >= 0)\n\nconst isArrayBufferView = (b: any): b is ArrayBufferView =>\n  !Buffer.isBuffer(b) && ArrayBuffer.isView(b)\n\n/**\n * Options that may be passed to stream.pipe()\n */\nexport interface PipeOptions {\n  /**\n   * end the destination stream when the source stream ends\n   */\n  end?: boolean\n  /**\n   * proxy errors from the source stream to the destination stream\n   */\n  proxyErrors?: boolean\n}\n\n/**\n * Internal class representing a pipe to a destination stream.\n *\n * @internal\n */\nclass Pipe {\n  src: Minipass\n  dest: Minipass\n  opts: PipeOptions\n  ondrain: () => any\n  constructor(\n    src: Minipass,\n    dest: Minipass.Writable,\n    opts: PipeOptions\n  ) {\n    this.src = src\n    this.dest = dest as Minipass\n    this.opts = opts\n    this.ondrain = () => src[RESUME]()\n    this.dest.on('drain', this.ondrain)\n  }\n  unpipe() {\n    this.dest.removeListener('drain', this.ondrain)\n  }\n  // only here for the prototype\n  /* c8 ignore start */\n  proxyErrors(_er: any) {}\n  /* c8 ignore stop */\n  end() {\n    this.unpipe()\n    if (this.opts.end) this.dest.end()\n  }\n}\n\n/**\n * Internal class representing a pipe to a destination stream where\n * errors are proxied.\n *\n * @internal\n */\nclass PipeProxyErrors extends Pipe {\n  unpipe() {\n    this.src.removeListener('error', this.proxyErrors)\n    super.unpipe()\n  }\n  constructor(\n    src: Minipass,\n    dest: Minipass.Writable,\n    opts: PipeOptions\n  ) {\n    super(src, dest, opts)\n    this.proxyErrors = (er: Error) => this.dest.emit('error', er)\n    src.on('error', this.proxyErrors)\n  }\n}\n\nexport namespace Minipass {\n  /**\n   * Encoding used to create a stream that outputs strings rather than\n   * Buffer objects.\n   */\n  export type Encoding = BufferEncoding | 'buffer' | null\n\n  /**\n   * Any stream that Minipass can pipe into\n   */\n  export type Writable =\n    | Minipass\n    | NodeJS.WriteStream\n    | (NodeJS.WriteStream & { fd: number })\n    | (EventEmitter & {\n        end(): any\n        write(chunk: any, ...args: any[]): any\n      })\n\n  /**\n   * Any stream that can be read from\n   */\n  export type Readable =\n    | Minipass\n    | NodeJS.ReadStream\n    | (NodeJS.ReadStream & { fd: number })\n    | (EventEmitter & {\n        pause(): any\n        resume(): any\n        pipe(...destArgs: any[]): any\n      })\n\n  /**\n   * Utility type that can be iterated sync or async\n   */\n  export type DualIterable = Iterable & AsyncIterable\n\n  type EventArguments = Record\n\n  /**\n   * The listing of events that a Minipass class can emit.\n   * Extend this when extending the Minipass class, and pass as\n   * the third template argument.  The key is the name of the event,\n   * and the value is the argument list.\n   *\n   * Any undeclared events will still be allowed, but the handler will get\n   * arguments as `unknown[]`.\n   */\n  export interface Events\n    extends EventArguments {\n    readable: []\n    data: [chunk: RType]\n    error: [er: unknown]\n    abort: [reason: unknown]\n    drain: []\n    resume: []\n    end: []\n    finish: []\n    prefinish: []\n    close: []\n    [DESTROYED]: [er?: unknown]\n    [ERROR]: [er: unknown]\n  }\n\n  /**\n   * String or buffer-like data that can be joined and sliced\n   */\n  export type ContiguousData =\n    | Buffer\n    | ArrayBufferLike\n    | ArrayBufferView\n    | string\n  export type BufferOrString = Buffer | string\n\n  /**\n   * Options passed to the Minipass constructor.\n   */\n  export type SharedOptions = {\n    /**\n     * Defer all data emission and other events until the end of the\n     * current tick, similar to Node core streams\n     */\n    async?: boolean\n    /**\n     * A signal which will abort the stream\n     */\n    signal?: AbortSignal\n    /**\n     * Output string encoding. Set to `null` or `'buffer'` (or omit) to\n     * emit Buffer objects rather than strings.\n     *\n     * Conflicts with `objectMode`\n     */\n    encoding?: BufferEncoding | null | 'buffer'\n    /**\n     * Output data exactly as it was written, supporting non-buffer/string\n     * data (such as arbitrary objects, falsey values, etc.)\n     *\n     * Conflicts with `encoding`\n     */\n    objectMode?: boolean\n  }\n\n  /**\n   * Options for a string encoded output\n   */\n  export type EncodingOptions = SharedOptions & {\n    encoding: BufferEncoding\n    objectMode?: false\n  }\n\n  /**\n   * Options for contiguous data buffer output\n   */\n  export type BufferOptions = SharedOptions & {\n    encoding?: null | 'buffer'\n    objectMode?: false\n  }\n\n  /**\n   * Options for objectMode arbitrary output\n   */\n  export type ObjectModeOptions = SharedOptions & {\n    objectMode: true\n    encoding?: null\n  }\n\n  /**\n   * Utility type to determine allowed options based on read type\n   */\n  export type Options =\n    | ObjectModeOptions\n    | (T extends string\n        ? EncodingOptions\n        : T extends Buffer\n        ? BufferOptions\n        : SharedOptions)\n}\n\nconst isObjectModeOptions = (\n  o: Minipass.SharedOptions\n): o is Minipass.ObjectModeOptions => !!o.objectMode\n\nconst isEncodingOptions = (\n  o: Minipass.SharedOptions\n): o is Minipass.EncodingOptions =>\n  !o.objectMode && !!o.encoding && o.encoding !== 'buffer'\n\n/**\n * Main export, the Minipass class\n *\n * `RType` is the type of data emitted, defaults to Buffer\n *\n * `WType` is the type of data to be written, if RType is buffer or string,\n * then any {@link Minipass.ContiguousData} is allowed.\n *\n * `Events` is the set of event handler signatures that this object\n * will emit, see {@link Minipass.Events}\n */\nexport class Minipass<\n    RType extends unknown = Buffer,\n    WType extends unknown = RType extends Minipass.BufferOrString\n      ? Minipass.ContiguousData\n      : RType,\n    Events extends Minipass.Events = Minipass.Events\n  >\n  extends EventEmitter\n  implements Minipass.DualIterable\n{\n  [FLOWING]: boolean = false;\n  [PAUSED]: boolean = false;\n  [PIPES]: Pipe[] = [];\n  [BUFFER]: RType[] = [];\n  [OBJECTMODE]: boolean;\n  [ENCODING]: BufferEncoding | null;\n  [ASYNC]: boolean;\n  [DECODER]: SD | null;\n  [EOF]: boolean = false;\n  [EMITTED_END]: boolean = false;\n  [EMITTING_END]: boolean = false;\n  [CLOSED]: boolean = false;\n  [EMITTED_ERROR]: unknown = null;\n  [BUFFERLENGTH]: number = 0;\n  [DESTROYED]: boolean = false;\n  [SIGNAL]?: AbortSignal;\n  [ABORTED]: boolean = false;\n  [DATALISTENERS]: number = 0;\n  [DISCARDED]: boolean = false\n\n  /**\n   * true if the stream can be written\n   */\n  writable: boolean = true\n  /**\n   * true if the stream can be read\n   */\n  readable: boolean = true\n\n  /**\n   * If `RType` is Buffer, then options do not need to be provided.\n   * Otherwise, an options object must be provided to specify either\n   * {@link Minipass.SharedOptions.objectMode} or\n   * {@link Minipass.SharedOptions.encoding}, as appropriate.\n   */\n  constructor(\n    ...args:\n      | [Minipass.ObjectModeOptions]\n      | (RType extends Buffer\n          ? [] | [Minipass.Options]\n          : [Minipass.Options])\n  ) {\n    const options: Minipass.Options = (args[0] ||\n      {}) as Minipass.Options\n    super()\n    if (options.objectMode && typeof options.encoding === 'string') {\n      throw new TypeError(\n        'Encoding and objectMode may not be used together'\n      )\n    }\n    if (isObjectModeOptions(options)) {\n      this[OBJECTMODE] = true\n      this[ENCODING] = null\n    } else if (isEncodingOptions(options)) {\n      this[ENCODING] = options.encoding\n      this[OBJECTMODE] = false\n    } else {\n      this[OBJECTMODE] = false\n      this[ENCODING] = null\n    }\n    this[ASYNC] = !!options.async\n    this[DECODER] = this[ENCODING]\n      ? (new StringDecoder(this[ENCODING]) as SD)\n      : null\n\n    //@ts-ignore - private option for debugging and testing\n    if (options && options.debugExposeBuffer === true) {\n      Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] })\n    }\n    //@ts-ignore - private option for debugging and testing\n    if (options && options.debugExposePipes === true) {\n      Object.defineProperty(this, 'pipes', { get: () => this[PIPES] })\n    }\n\n    const { signal } = options\n    if (signal) {\n      this[SIGNAL] = signal\n      if (signal.aborted) {\n        this[ABORT]()\n      } else {\n        signal.addEventListener('abort', () => this[ABORT]())\n      }\n    }\n  }\n\n  /**\n   * The amount of data stored in the buffer waiting to be read.\n   *\n   * For Buffer strings, this will be the total byte length.\n   * For string encoding streams, this will be the string character length,\n   * according to JavaScript's `string.length` logic.\n   * For objectMode streams, this is a count of the items waiting to be\n   * emitted.\n   */\n  get bufferLength() {\n    return this[BUFFERLENGTH]\n  }\n\n  /**\n   * The `BufferEncoding` currently in use, or `null`\n   */\n  get encoding() {\n    return this[ENCODING]\n  }\n\n  /**\n   * @deprecated - This is a read only property\n   */\n  set encoding(_enc) {\n    throw new Error('Encoding must be set at instantiation time')\n  }\n\n  /**\n   * @deprecated - Encoding may only be set at instantiation time\n   */\n  setEncoding(_enc: Minipass.Encoding) {\n    throw new Error('Encoding must be set at instantiation time')\n  }\n\n  /**\n   * True if this is an objectMode stream\n   */\n  get objectMode() {\n    return this[OBJECTMODE]\n  }\n\n  /**\n   * @deprecated - This is a read-only property\n   */\n  set objectMode(_om) {\n    throw new Error('objectMode must be set at instantiation time')\n  }\n\n  /**\n   * true if this is an async stream\n   */\n  get ['async'](): boolean {\n    return this[ASYNC]\n  }\n  /**\n   * Set to true to make this stream async.\n   *\n   * Once set, it cannot be unset, as this would potentially cause incorrect\n   * behavior.  Ie, a sync stream can be made async, but an async stream\n   * cannot be safely made sync.\n   */\n  set ['async'](a: boolean) {\n    this[ASYNC] = this[ASYNC] || !!a\n  }\n\n  // drop everything and get out of the flow completely\n  [ABORT]() {\n    this[ABORTED] = true\n    this.emit('abort', this[SIGNAL]?.reason)\n    this.destroy(this[SIGNAL]?.reason)\n  }\n\n  /**\n   * True if the stream has been aborted.\n   */\n  get aborted() {\n    return this[ABORTED]\n  }\n  /**\n   * No-op setter. Stream aborted status is set via the AbortSignal provided\n   * in the constructor options.\n   */\n  set aborted(_) {}\n\n  /**\n   * Write data into the stream\n   *\n   * If the chunk written is a string, and encoding is not specified, then\n   * `utf8` will be assumed. If the stream encoding matches the encoding of\n   * a written string, and the state of the string decoder allows it, then\n   * the string will be passed through to either the output or the internal\n   * buffer without any processing. Otherwise, it will be turned into a\n   * Buffer object for processing into the desired encoding.\n   *\n   * If provided, `cb` function is called immediately before return for\n   * sync streams, or on next tick for async streams, because for this\n   * base class, a chunk is considered \"processed\" once it is accepted\n   * and either emitted or buffered. That is, the callback does not indicate\n   * that the chunk has been eventually emitted, though of course child\n   * classes can override this function to do whatever processing is required\n   * and call `super.write(...)` only once processing is completed.\n   */\n  write(chunk: WType, cb?: () => void): boolean\n  write(\n    chunk: WType,\n    encoding?: Minipass.Encoding,\n    cb?: () => void\n  ): boolean\n  write(\n    chunk: WType,\n    encoding?: Minipass.Encoding | (() => void),\n    cb?: () => void\n  ): boolean {\n    if (this[ABORTED]) return false\n    if (this[EOF]) throw new Error('write after end')\n\n    if (this[DESTROYED]) {\n      this.emit(\n        'error',\n        Object.assign(\n          new Error('Cannot call write after a stream was destroyed'),\n          { code: 'ERR_STREAM_DESTROYED' }\n        )\n      )\n      return true\n    }\n\n    if (typeof encoding === 'function') {\n      cb = encoding\n      encoding = 'utf8'\n    }\n\n    if (!encoding) encoding = 'utf8'\n\n    const fn = this[ASYNC] ? defer : nodefer\n\n    // convert array buffers and typed array views into buffers\n    // at some point in the future, we may want to do the opposite!\n    // leave strings and buffers as-is\n    // anything is only allowed if in object mode, so throw\n    if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) {\n      if (isArrayBufferView(chunk)) {\n        //@ts-ignore - sinful unsafe type changing\n        chunk = Buffer.from(\n          chunk.buffer,\n          chunk.byteOffset,\n          chunk.byteLength\n        )\n      } else if (isArrayBufferLike(chunk)) {\n        //@ts-ignore - sinful unsafe type changing\n        chunk = Buffer.from(chunk)\n      } else if (typeof chunk !== 'string') {\n        throw new Error(\n          'Non-contiguous data written to non-objectMode stream'\n        )\n      }\n    }\n\n    // handle object mode up front, since it's simpler\n    // this yields better performance, fewer checks later.\n    if (this[OBJECTMODE]) {\n      // maybe impossible?\n      /* c8 ignore start */\n      if (this[FLOWING] && this[BUFFERLENGTH] !== 0) this[FLUSH](true)\n      /* c8 ignore stop */\n\n      if (this[FLOWING]) this.emit('data', chunk as unknown as RType)\n      else this[BUFFERPUSH](chunk as unknown as RType)\n\n      if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n\n      if (cb) fn(cb)\n\n      return this[FLOWING]\n    }\n\n    // at this point the chunk is a buffer or string\n    // don't buffer it up or send it to the decoder\n    if (!(chunk as Minipass.BufferOrString).length) {\n      if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n      if (cb) fn(cb)\n      return this[FLOWING]\n    }\n\n    // fast-path writing strings of same encoding to a stream with\n    // an empty buffer, skipping the buffer/decoder dance\n    if (\n      typeof chunk === 'string' &&\n      // unless it is a string already ready for us to use\n      !(encoding === this[ENCODING] && !this[DECODER]?.lastNeed)\n    ) {\n      //@ts-ignore - sinful unsafe type change\n      chunk = Buffer.from(chunk, encoding)\n    }\n\n    if (Buffer.isBuffer(chunk) && this[ENCODING]) {\n      //@ts-ignore - sinful unsafe type change\n      chunk = this[DECODER].write(chunk)\n    }\n\n    // Note: flushing CAN potentially switch us into not-flowing mode\n    if (this[FLOWING] && this[BUFFERLENGTH] !== 0) this[FLUSH](true)\n\n    if (this[FLOWING]) this.emit('data', chunk as unknown as RType)\n    else this[BUFFERPUSH](chunk as unknown as RType)\n\n    if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n\n    if (cb) fn(cb)\n\n    return this[FLOWING]\n  }\n\n  /**\n   * Low-level explicit read method.\n   *\n   * In objectMode, the argument is ignored, and one item is returned if\n   * available.\n   *\n   * `n` is the number of bytes (or in the case of encoding streams,\n   * characters) to consume. If `n` is not provided, then the entire buffer\n   * is returned, or `null` is returned if no data is available.\n   *\n   * If `n` is greater that the amount of data in the internal buffer,\n   * then `null` is returned.\n   */\n  read(n?: number | null): RType | null {\n    if (this[DESTROYED]) return null\n    this[DISCARDED] = false\n\n    if (\n      this[BUFFERLENGTH] === 0 ||\n      n === 0 ||\n      (n && n > this[BUFFERLENGTH])\n    ) {\n      this[MAYBE_EMIT_END]()\n      return null\n    }\n\n    if (this[OBJECTMODE]) n = null\n\n    if (this[BUFFER].length > 1 && !this[OBJECTMODE]) {\n      // not object mode, so if we have an encoding, then RType is string\n      // otherwise, must be Buffer\n      this[BUFFER] = [\n        (this[ENCODING]\n          ? this[BUFFER].join('')\n          : Buffer.concat(\n              this[BUFFER] as Buffer[],\n              this[BUFFERLENGTH]\n            )) as RType,\n      ]\n    }\n\n    const ret = this[READ](n || null, this[BUFFER][0] as RType)\n    this[MAYBE_EMIT_END]()\n    return ret\n  }\n\n  [READ](n: number | null, chunk: RType) {\n    if (this[OBJECTMODE]) this[BUFFERSHIFT]()\n    else {\n      const c = chunk as Minipass.BufferOrString\n      if (n === c.length || n === null) this[BUFFERSHIFT]()\n      else if (typeof c === 'string') {\n        this[BUFFER][0] = c.slice(n) as RType\n        chunk = c.slice(0, n) as RType\n        this[BUFFERLENGTH] -= n\n      } else {\n        this[BUFFER][0] = c.subarray(n) as RType\n        chunk = c.subarray(0, n) as RType\n        this[BUFFERLENGTH] -= n\n      }\n    }\n\n    this.emit('data', chunk)\n\n    if (!this[BUFFER].length && !this[EOF]) this.emit('drain')\n\n    return chunk\n  }\n\n  /**\n   * End the stream, optionally providing a final write.\n   *\n   * See {@link Minipass#write} for argument descriptions\n   */\n  end(cb?: () => void): this\n  end(chunk: WType, cb?: () => void): this\n  end(chunk: WType, encoding?: Minipass.Encoding, cb?: () => void): this\n  end(\n    chunk?: WType | (() => void),\n    encoding?: Minipass.Encoding | (() => void),\n    cb?: () => void\n  ): this {\n    if (typeof chunk === 'function') {\n      cb = chunk as () => void\n      chunk = undefined\n    }\n    if (typeof encoding === 'function') {\n      cb = encoding\n      encoding = 'utf8'\n    }\n    if (chunk !== undefined) this.write(chunk, encoding)\n    if (cb) this.once('end', cb)\n    this[EOF] = true\n    this.writable = false\n\n    // if we haven't written anything, then go ahead and emit,\n    // even if we're not reading.\n    // we'll re-emit if a new 'end' listener is added anyway.\n    // This makes MP more suitable to write-only use cases.\n    if (this[FLOWING] || !this[PAUSED]) this[MAYBE_EMIT_END]()\n    return this\n  }\n\n  // don't let the internal resume be overwritten\n  [RESUME]() {\n    if (this[DESTROYED]) return\n\n    if (!this[DATALISTENERS] && !this[PIPES].length) {\n      this[DISCARDED] = true\n    }\n    this[PAUSED] = false\n    this[FLOWING] = true\n    this.emit('resume')\n    if (this[BUFFER].length) this[FLUSH]()\n    else if (this[EOF]) this[MAYBE_EMIT_END]()\n    else this.emit('drain')\n  }\n\n  /**\n   * Resume the stream if it is currently in a paused state\n   *\n   * If called when there are no pipe destinations or `data` event listeners,\n   * this will place the stream in a \"discarded\" state, where all data will\n   * be thrown away. The discarded state is removed if a pipe destination or\n   * data handler is added, if pause() is called, or if any synchronous or\n   * asynchronous iteration is started.\n   */\n  resume() {\n    return this[RESUME]()\n  }\n\n  /**\n   * Pause the stream\n   */\n  pause() {\n    this[FLOWING] = false\n    this[PAUSED] = true\n    this[DISCARDED] = false\n  }\n\n  /**\n   * true if the stream has been forcibly destroyed\n   */\n  get destroyed() {\n    return this[DESTROYED]\n  }\n\n  /**\n   * true if the stream is currently in a flowing state, meaning that\n   * any writes will be immediately emitted.\n   */\n  get flowing() {\n    return this[FLOWING]\n  }\n\n  /**\n   * true if the stream is currently in a paused state\n   */\n  get paused() {\n    return this[PAUSED]\n  }\n\n  [BUFFERPUSH](chunk: RType) {\n    if (this[OBJECTMODE]) this[BUFFERLENGTH] += 1\n    else this[BUFFERLENGTH] += (chunk as Minipass.BufferOrString).length\n    this[BUFFER].push(chunk)\n  }\n\n  [BUFFERSHIFT](): RType {\n    if (this[OBJECTMODE]) this[BUFFERLENGTH] -= 1\n    else\n      this[BUFFERLENGTH] -= (\n        this[BUFFER][0] as Minipass.BufferOrString\n      ).length\n    return this[BUFFER].shift() as RType\n  }\n\n  [FLUSH](noDrain: boolean = false) {\n    do {} while (\n      this[FLUSHCHUNK](this[BUFFERSHIFT]()) &&\n      this[BUFFER].length\n    )\n\n    if (!noDrain && !this[BUFFER].length && !this[EOF]) this.emit('drain')\n  }\n\n  [FLUSHCHUNK](chunk: RType) {\n    this.emit('data', chunk)\n    return this[FLOWING]\n  }\n\n  /**\n   * Pipe all data emitted by this stream into the destination provided.\n   *\n   * Triggers the flow of data.\n   */\n  pipe(dest: W, opts?: PipeOptions): W {\n    if (this[DESTROYED]) return dest\n    this[DISCARDED] = false\n\n    const ended = this[EMITTED_END]\n    opts = opts || {}\n    if (dest === proc.stdout || dest === proc.stderr) opts.end = false\n    else opts.end = opts.end !== false\n    opts.proxyErrors = !!opts.proxyErrors\n\n    // piping an ended stream ends immediately\n    if (ended) {\n      if (opts.end) dest.end()\n    } else {\n      // \"as\" here just ignores the WType, which pipes don't care about,\n      // since they're only consuming from us, and writing to the dest\n      this[PIPES].push(\n        !opts.proxyErrors\n          ? new Pipe(this as Minipass, dest, opts)\n          : new PipeProxyErrors(this as Minipass, dest, opts)\n      )\n      if (this[ASYNC]) defer(() => this[RESUME]())\n      else this[RESUME]()\n    }\n\n    return dest\n  }\n\n  /**\n   * Fully unhook a piped destination stream.\n   *\n   * If the destination stream was the only consumer of this stream (ie,\n   * there are no other piped destinations or `'data'` event listeners)\n   * then the flow of data will stop until there is another consumer or\n   * {@link Minipass#resume} is explicitly called.\n   */\n  unpipe(dest: W) {\n    const p = this[PIPES].find(p => p.dest === dest)\n    if (p) {\n      if (this[PIPES].length === 1) {\n        if (this[FLOWING] && this[DATALISTENERS] === 0) {\n          this[FLOWING] = false\n        }\n        this[PIPES] = []\n      } else this[PIPES].splice(this[PIPES].indexOf(p), 1)\n      p.unpipe()\n    }\n  }\n\n  /**\n   * Alias for {@link Minipass#on}\n   */\n  addListener(\n    ev: Event,\n    handler: (...args: Events[Event]) => any\n  ): this {\n    return this.on(ev, handler)\n  }\n\n  /**\n   * Mostly identical to `EventEmitter.on`, with the following\n   * behavior differences to prevent data loss and unnecessary hangs:\n   *\n   * - Adding a 'data' event handler will trigger the flow of data\n   *\n   * - Adding a 'readable' event handler when there is data waiting to be read\n   *   will cause 'readable' to be emitted immediately.\n   *\n   * - Adding an 'endish' event handler ('end', 'finish', etc.) which has\n   *   already passed will cause the event to be emitted immediately and all\n   *   handlers removed.\n   *\n   * - Adding an 'error' event handler after an error has been emitted will\n   *   cause the event to be re-emitted immediately with the error previously\n   *   raised.\n   */\n  on(\n    ev: Event,\n    handler: (...args: Events[Event]) => any\n  ): this {\n    const ret = super.on(\n      ev as string | symbol,\n      handler as (...a: any[]) => any\n    )\n    if (ev === 'data') {\n      this[DISCARDED] = false\n      this[DATALISTENERS]++\n      if (!this[PIPES].length && !this[FLOWING]) {\n        this[RESUME]()\n      }\n    } else if (ev === 'readable' && this[BUFFERLENGTH] !== 0) {\n      super.emit('readable')\n    } else if (isEndish(ev) && this[EMITTED_END]) {\n      super.emit(ev)\n      this.removeAllListeners(ev)\n    } else if (ev === 'error' && this[EMITTED_ERROR]) {\n      const h = handler as (...a: Events['error']) => any\n      if (this[ASYNC]) defer(() => h.call(this, this[EMITTED_ERROR]))\n      else h.call(this, this[EMITTED_ERROR])\n    }\n    return ret\n  }\n\n  /**\n   * Alias for {@link Minipass#off}\n   */\n  removeListener(\n    ev: Event,\n    handler: (...args: Events[Event]) => any\n  ) {\n    return this.off(ev, handler)\n  }\n\n  /**\n   * Mostly identical to `EventEmitter.off`\n   *\n   * If a 'data' event handler is removed, and it was the last consumer\n   * (ie, there are no pipe destinations or other 'data' event listeners),\n   * then the flow of data will stop until there is another consumer or\n   * {@link Minipass#resume} is explicitly called.\n   */\n  off(\n    ev: Event,\n    handler: (...args: Events[Event]) => any\n  ) {\n    const ret = super.off(\n      ev as string | symbol,\n      handler as (...a: any[]) => any\n    )\n    // if we previously had listeners, and now we don't, and we don't\n    // have any pipes, then stop the flow, unless it's been explicitly\n    // put in a discarded flowing state via stream.resume().\n    if (ev === 'data') {\n      this[DATALISTENERS] = this.listeners('data').length\n      if (\n        this[DATALISTENERS] === 0 &&\n        !this[DISCARDED] &&\n        !this[PIPES].length\n      ) {\n        this[FLOWING] = false\n      }\n    }\n    return ret\n  }\n\n  /**\n   * Mostly identical to `EventEmitter.removeAllListeners`\n   *\n   * If all 'data' event handlers are removed, and they were the last consumer\n   * (ie, there are no pipe destinations), then the flow of data will stop\n   * until there is another consumer or {@link Minipass#resume} is explicitly\n   * called.\n   */\n  removeAllListeners(ev?: Event) {\n    const ret = super.removeAllListeners(ev as string | symbol | undefined)\n    if (ev === 'data' || ev === undefined) {\n      this[DATALISTENERS] = 0\n      if (!this[DISCARDED] && !this[PIPES].length) {\n        this[FLOWING] = false\n      }\n    }\n    return ret\n  }\n\n  /**\n   * true if the 'end' event has been emitted\n   */\n  get emittedEnd() {\n    return this[EMITTED_END]\n  }\n\n  [MAYBE_EMIT_END]() {\n    if (\n      !this[EMITTING_END] &&\n      !this[EMITTED_END] &&\n      !this[DESTROYED] &&\n      this[BUFFER].length === 0 &&\n      this[EOF]\n    ) {\n      this[EMITTING_END] = true\n      this.emit('end')\n      this.emit('prefinish')\n      this.emit('finish')\n      if (this[CLOSED]) this.emit('close')\n      this[EMITTING_END] = false\n    }\n  }\n\n  /**\n   * Mostly identical to `EventEmitter.emit`, with the following\n   * behavior differences to prevent data loss and unnecessary hangs:\n   *\n   * If the stream has been destroyed, and the event is something other\n   * than 'close' or 'error', then `false` is returned and no handlers\n   * are called.\n   *\n   * If the event is 'end', and has already been emitted, then the event\n   * is ignored. If the stream is in a paused or non-flowing state, then\n   * the event will be deferred until data flow resumes. If the stream is\n   * async, then handlers will be called on the next tick rather than\n   * immediately.\n   *\n   * If the event is 'close', and 'end' has not yet been emitted, then\n   * the event will be deferred until after 'end' is emitted.\n   *\n   * If the event is 'error', and an AbortSignal was provided for the stream,\n   * and there are no listeners, then the event is ignored, matching the\n   * behavior of node core streams in the presense of an AbortSignal.\n   *\n   * If the event is 'finish' or 'prefinish', then all listeners will be\n   * removed after emitting the event, to prevent double-firing.\n   */\n  emit(\n    ev: Event,\n    ...args: Events[Event]\n  ): boolean {\n    const data = args[0]\n    // error and close are only events allowed after calling destroy()\n    if (\n      ev !== 'error' &&\n      ev !== 'close' &&\n      ev !== DESTROYED &&\n      this[DESTROYED]\n    ) {\n      return false\n    } else if (ev === 'data') {\n      return !this[OBJECTMODE] && !data\n        ? false\n        : this[ASYNC]\n        ? (defer(() => this[EMITDATA](data as RType)), true)\n        : this[EMITDATA](data as RType)\n    } else if (ev === 'end') {\n      return this[EMITEND]()\n    } else if (ev === 'close') {\n      this[CLOSED] = true\n      // don't emit close before 'end' and 'finish'\n      if (!this[EMITTED_END] && !this[DESTROYED]) return false\n      const ret = super.emit('close')\n      this.removeAllListeners('close')\n      return ret\n    } else if (ev === 'error') {\n      this[EMITTED_ERROR] = data\n      super.emit(ERROR, data)\n      const ret =\n        !this[SIGNAL] || this.listeners('error').length\n          ? super.emit('error', data)\n          : false\n      this[MAYBE_EMIT_END]()\n      return ret\n    } else if (ev === 'resume') {\n      const ret = super.emit('resume')\n      this[MAYBE_EMIT_END]()\n      return ret\n    } else if (ev === 'finish' || ev === 'prefinish') {\n      const ret = super.emit(ev)\n      this.removeAllListeners(ev)\n      return ret\n    }\n\n    // Some other unknown event\n    const ret = super.emit(ev as string, ...args)\n    this[MAYBE_EMIT_END]()\n    return ret\n  }\n\n  [EMITDATA](data: RType) {\n    for (const p of this[PIPES]) {\n      if (p.dest.write(data as RType) === false) this.pause()\n    }\n    const ret = this[DISCARDED] ? false : super.emit('data', data)\n    this[MAYBE_EMIT_END]()\n    return ret\n  }\n\n  [EMITEND]() {\n    if (this[EMITTED_END]) return false\n\n    this[EMITTED_END] = true\n    this.readable = false\n    return this[ASYNC]\n      ? (defer(() => this[EMITEND2]()), true)\n      : this[EMITEND2]()\n  }\n\n  [EMITEND2]() {\n    if (this[DECODER]) {\n      const data = this[DECODER].end()\n      if (data) {\n        for (const p of this[PIPES]) {\n          p.dest.write(data as RType)\n        }\n        if (!this[DISCARDED]) super.emit('data', data)\n      }\n    }\n\n    for (const p of this[PIPES]) {\n      p.end()\n    }\n    const ret = super.emit('end')\n    this.removeAllListeners('end')\n    return ret\n  }\n\n  /**\n   * Return a Promise that resolves to an array of all emitted data once\n   * the stream ends.\n   */\n  async collect(): Promise {\n    const buf: RType[] & { dataLength: number } = Object.assign([], {\n      dataLength: 0,\n    })\n    if (!this[OBJECTMODE]) buf.dataLength = 0\n    // set the promise first, in case an error is raised\n    // by triggering the flow here.\n    const p = this.promise()\n    this.on('data', c => {\n      buf.push(c)\n      if (!this[OBJECTMODE])\n        buf.dataLength += (c as Minipass.BufferOrString).length\n    })\n    await p\n    return buf\n  }\n\n  /**\n   * Return a Promise that resolves to the concatenation of all emitted data\n   * once the stream ends.\n   *\n   * Not allowed on objectMode streams.\n   */\n  async concat(): Promise {\n    if (this[OBJECTMODE]) {\n      throw new Error('cannot concat in objectMode')\n    }\n    const buf = await this.collect()\n    return (\n      this[ENCODING]\n        ? buf.join('')\n        : Buffer.concat(buf as Buffer[], buf.dataLength)\n    ) as RType\n  }\n\n  /**\n   * Return a void Promise that resolves once the stream ends.\n   */\n  async promise(): Promise {\n    return new Promise((resolve, reject) => {\n      this.on(DESTROYED, () => reject(new Error('stream destroyed')))\n      this.on('error', er => reject(er))\n      this.on('end', () => resolve())\n    })\n  }\n\n  /**\n   * Asynchronous `for await of` iteration.\n   *\n   * This will continue emitting all chunks until the stream terminates.\n   */\n  [Symbol.asyncIterator](): AsyncGenerator {\n    // set this up front, in case the consumer doesn't call next()\n    // right away.\n    this[DISCARDED] = false\n    let stopped = false\n    const stop = async (): Promise> => {\n      this.pause()\n      stopped = true\n      return { value: undefined, done: true }\n    }\n    const next = (): Promise> => {\n      if (stopped) return stop()\n      const res = this.read()\n      if (res !== null) return Promise.resolve({ done: false, value: res })\n\n      if (this[EOF]) return stop()\n\n      let resolve!: (res: IteratorResult) => void\n      let reject!: (er: unknown) => void\n      const onerr = (er: unknown) => {\n        this.off('data', ondata)\n        this.off('end', onend)\n        this.off(DESTROYED, ondestroy)\n        stop()\n        reject(er)\n      }\n      const ondata = (value: RType) => {\n        this.off('error', onerr)\n        this.off('end', onend)\n        this.off(DESTROYED, ondestroy)\n        this.pause()\n        resolve({ value, done: !!this[EOF] })\n      }\n      const onend = () => {\n        this.off('error', onerr)\n        this.off('data', ondata)\n        this.off(DESTROYED, ondestroy)\n        stop()\n        resolve({ done: true, value: undefined })\n      }\n      const ondestroy = () => onerr(new Error('stream destroyed'))\n      return new Promise>((res, rej) => {\n        reject = rej\n        resolve = res\n        this.once(DESTROYED, ondestroy)\n        this.once('error', onerr)\n        this.once('end', onend)\n        this.once('data', ondata)\n      })\n    }\n\n    return {\n      next,\n      throw: stop,\n      return: stop,\n      [Symbol.asyncIterator]() {\n        return this\n      },\n      [Symbol.asyncDispose]: async () => {},\n    }\n  }\n\n  /**\n   * Synchronous `for of` iteration.\n   *\n   * The iteration will terminate when the internal buffer runs out, even\n   * if the stream has not yet terminated.\n   */\n  [Symbol.iterator](): Generator {\n    // set this up front, in case the consumer doesn't call next()\n    // right away.\n    this[DISCARDED] = false\n    let stopped = false\n    const stop = (): IteratorReturnResult => {\n      this.pause()\n      this.off(ERROR, stop)\n      this.off(DESTROYED, stop)\n      this.off('end', stop)\n      stopped = true\n      return { done: true, value: undefined }\n    }\n\n    const next = (): IteratorResult => {\n      if (stopped) return stop()\n      const value = this.read()\n      return value === null ? stop() : { done: false, value }\n    }\n\n    this.once('end', stop)\n    this.once(ERROR, stop)\n    this.once(DESTROYED, stop)\n\n    return {\n      next,\n      throw: stop,\n      return: stop,\n      [Symbol.iterator]() {\n        return this\n      },\n      [Symbol.dispose]: () => {},\n    }\n  }\n\n  /**\n   * Destroy a stream, preventing it from being used for any further purpose.\n   *\n   * If the stream has a `close()` method, then it will be called on\n   * destruction.\n   *\n   * After destruction, any attempt to write data, read data, or emit most\n   * events will be ignored.\n   *\n   * If an error argument is provided, then it will be emitted in an\n   * 'error' event.\n   */\n  destroy(er?: unknown) {\n    if (this[DESTROYED]) {\n      if (er) this.emit('error', er)\n      else this.emit(DESTROYED)\n      return this\n    }\n\n    this[DESTROYED] = true\n    this[DISCARDED] = true\n\n    // throw away all buffered data, it's never coming out\n    this[BUFFER].length = 0\n    this[BUFFERLENGTH] = 0\n\n    const wc = this as Minipass & {\n      close?: () => void\n    }\n    if (typeof wc.close === 'function' && !this[CLOSED]) wc.close()\n\n    if (er) this.emit('error', er)\n    // if no error to emit, still reject pending promises\n    else this.emit(DESTROYED)\n\n    return this\n  }\n\n  /**\n   * Alias for {@link isStream}\n   *\n   * Former export location, maintained for backwards compatibility.\n   *\n   * @deprecated\n   */\n  static get isStream() {\n    return isStream\n  }\n}\n"]}
      \ No newline at end of file
      diff --git a/node_modules/minipass/dist/esm/index.js b/node_modules/minipass/dist/esm/index.js
      new file mode 100644
      index 00000000..5df55461
      --- /dev/null
      +++ b/node_modules/minipass/dist/esm/index.js
      @@ -0,0 +1,1020 @@
      +const proc = typeof process === 'object' && process
      +    ? process
      +    : {
      +        stdout: null,
      +        stderr: null,
      +    };
      +import { EventEmitter } from 'node:events';
      +import Stream from 'node:stream';
      +import { StringDecoder } from 'node:string_decoder';
      +/**
      + * Return true if the argument is a Minipass stream, Node stream, or something
      + * else that Minipass can interact with.
      + */
      +export const isStream = (s) => !!s &&
      +    typeof s === 'object' &&
      +    (s instanceof Minipass ||
      +        s instanceof Stream ||
      +        isReadable(s) ||
      +        isWritable(s));
      +/**
      + * Return true if the argument is a valid {@link Minipass.Readable}
      + */
      +export const isReadable = (s) => !!s &&
      +    typeof s === 'object' &&
      +    s instanceof EventEmitter &&
      +    typeof s.pipe === 'function' &&
      +    // node core Writable streams have a pipe() method, but it throws
      +    s.pipe !== Stream.Writable.prototype.pipe;
      +/**
      + * Return true if the argument is a valid {@link Minipass.Writable}
      + */
      +export const isWritable = (s) => !!s &&
      +    typeof s === 'object' &&
      +    s instanceof EventEmitter &&
      +    typeof s.write === 'function' &&
      +    typeof s.end === 'function';
      +const EOF = Symbol('EOF');
      +const MAYBE_EMIT_END = Symbol('maybeEmitEnd');
      +const EMITTED_END = Symbol('emittedEnd');
      +const EMITTING_END = Symbol('emittingEnd');
      +const EMITTED_ERROR = Symbol('emittedError');
      +const CLOSED = Symbol('closed');
      +const READ = Symbol('read');
      +const FLUSH = Symbol('flush');
      +const FLUSHCHUNK = Symbol('flushChunk');
      +const ENCODING = Symbol('encoding');
      +const DECODER = Symbol('decoder');
      +const FLOWING = Symbol('flowing');
      +const PAUSED = Symbol('paused');
      +const RESUME = Symbol('resume');
      +const BUFFER = Symbol('buffer');
      +const PIPES = Symbol('pipes');
      +const BUFFERLENGTH = Symbol('bufferLength');
      +const BUFFERPUSH = Symbol('bufferPush');
      +const BUFFERSHIFT = Symbol('bufferShift');
      +const OBJECTMODE = Symbol('objectMode');
      +// internal event when stream is destroyed
      +const DESTROYED = Symbol('destroyed');
      +// internal event when stream has an error
      +const ERROR = Symbol('error');
      +const EMITDATA = Symbol('emitData');
      +const EMITEND = Symbol('emitEnd');
      +const EMITEND2 = Symbol('emitEnd2');
      +const ASYNC = Symbol('async');
      +const ABORT = Symbol('abort');
      +const ABORTED = Symbol('aborted');
      +const SIGNAL = Symbol('signal');
      +const DATALISTENERS = Symbol('dataListeners');
      +const DISCARDED = Symbol('discarded');
      +const defer = (fn) => Promise.resolve().then(fn);
      +const nodefer = (fn) => fn();
      +const isEndish = (ev) => ev === 'end' || ev === 'finish' || ev === 'prefinish';
      +const isArrayBufferLike = (b) => b instanceof ArrayBuffer ||
      +    (!!b &&
      +        typeof b === 'object' &&
      +        b.constructor &&
      +        b.constructor.name === 'ArrayBuffer' &&
      +        b.byteLength >= 0);
      +const isArrayBufferView = (b) => !Buffer.isBuffer(b) && ArrayBuffer.isView(b);
      +/**
      + * Internal class representing a pipe to a destination stream.
      + *
      + * @internal
      + */
      +class Pipe {
      +    src;
      +    dest;
      +    opts;
      +    ondrain;
      +    constructor(src, dest, opts) {
      +        this.src = src;
      +        this.dest = dest;
      +        this.opts = opts;
      +        this.ondrain = () => src[RESUME]();
      +        this.dest.on('drain', this.ondrain);
      +    }
      +    unpipe() {
      +        this.dest.removeListener('drain', this.ondrain);
      +    }
      +    // only here for the prototype
      +    /* c8 ignore start */
      +    proxyErrors(_er) { }
      +    /* c8 ignore stop */
      +    end() {
      +        this.unpipe();
      +        if (this.opts.end)
      +            this.dest.end();
      +    }
      +}
      +/**
      + * Internal class representing a pipe to a destination stream where
      + * errors are proxied.
      + *
      + * @internal
      + */
      +class PipeProxyErrors extends Pipe {
      +    unpipe() {
      +        this.src.removeListener('error', this.proxyErrors);
      +        super.unpipe();
      +    }
      +    constructor(src, dest, opts) {
      +        super(src, dest, opts);
      +        this.proxyErrors = (er) => this.dest.emit('error', er);
      +        src.on('error', this.proxyErrors);
      +    }
      +}
      +const isObjectModeOptions = (o) => !!o.objectMode;
      +const isEncodingOptions = (o) => !o.objectMode && !!o.encoding && o.encoding !== 'buffer';
      +/**
      + * Main export, the Minipass class
      + *
      + * `RType` is the type of data emitted, defaults to Buffer
      + *
      + * `WType` is the type of data to be written, if RType is buffer or string,
      + * then any {@link Minipass.ContiguousData} is allowed.
      + *
      + * `Events` is the set of event handler signatures that this object
      + * will emit, see {@link Minipass.Events}
      + */
      +export class Minipass extends EventEmitter {
      +    [FLOWING] = false;
      +    [PAUSED] = false;
      +    [PIPES] = [];
      +    [BUFFER] = [];
      +    [OBJECTMODE];
      +    [ENCODING];
      +    [ASYNC];
      +    [DECODER];
      +    [EOF] = false;
      +    [EMITTED_END] = false;
      +    [EMITTING_END] = false;
      +    [CLOSED] = false;
      +    [EMITTED_ERROR] = null;
      +    [BUFFERLENGTH] = 0;
      +    [DESTROYED] = false;
      +    [SIGNAL];
      +    [ABORTED] = false;
      +    [DATALISTENERS] = 0;
      +    [DISCARDED] = false;
      +    /**
      +     * true if the stream can be written
      +     */
      +    writable = true;
      +    /**
      +     * true if the stream can be read
      +     */
      +    readable = true;
      +    /**
      +     * If `RType` is Buffer, then options do not need to be provided.
      +     * Otherwise, an options object must be provided to specify either
      +     * {@link Minipass.SharedOptions.objectMode} or
      +     * {@link Minipass.SharedOptions.encoding}, as appropriate.
      +     */
      +    constructor(...args) {
      +        const options = (args[0] ||
      +            {});
      +        super();
      +        if (options.objectMode && typeof options.encoding === 'string') {
      +            throw new TypeError('Encoding and objectMode may not be used together');
      +        }
      +        if (isObjectModeOptions(options)) {
      +            this[OBJECTMODE] = true;
      +            this[ENCODING] = null;
      +        }
      +        else if (isEncodingOptions(options)) {
      +            this[ENCODING] = options.encoding;
      +            this[OBJECTMODE] = false;
      +        }
      +        else {
      +            this[OBJECTMODE] = false;
      +            this[ENCODING] = null;
      +        }
      +        this[ASYNC] = !!options.async;
      +        this[DECODER] = this[ENCODING]
      +            ? new StringDecoder(this[ENCODING])
      +            : null;
      +        //@ts-ignore - private option for debugging and testing
      +        if (options && options.debugExposeBuffer === true) {
      +            Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] });
      +        }
      +        //@ts-ignore - private option for debugging and testing
      +        if (options && options.debugExposePipes === true) {
      +            Object.defineProperty(this, 'pipes', { get: () => this[PIPES] });
      +        }
      +        const { signal } = options;
      +        if (signal) {
      +            this[SIGNAL] = signal;
      +            if (signal.aborted) {
      +                this[ABORT]();
      +            }
      +            else {
      +                signal.addEventListener('abort', () => this[ABORT]());
      +            }
      +        }
      +    }
      +    /**
      +     * The amount of data stored in the buffer waiting to be read.
      +     *
      +     * For Buffer strings, this will be the total byte length.
      +     * For string encoding streams, this will be the string character length,
      +     * according to JavaScript's `string.length` logic.
      +     * For objectMode streams, this is a count of the items waiting to be
      +     * emitted.
      +     */
      +    get bufferLength() {
      +        return this[BUFFERLENGTH];
      +    }
      +    /**
      +     * The `BufferEncoding` currently in use, or `null`
      +     */
      +    get encoding() {
      +        return this[ENCODING];
      +    }
      +    /**
      +     * @deprecated - This is a read only property
      +     */
      +    set encoding(_enc) {
      +        throw new Error('Encoding must be set at instantiation time');
      +    }
      +    /**
      +     * @deprecated - Encoding may only be set at instantiation time
      +     */
      +    setEncoding(_enc) {
      +        throw new Error('Encoding must be set at instantiation time');
      +    }
      +    /**
      +     * True if this is an objectMode stream
      +     */
      +    get objectMode() {
      +        return this[OBJECTMODE];
      +    }
      +    /**
      +     * @deprecated - This is a read-only property
      +     */
      +    set objectMode(_om) {
      +        throw new Error('objectMode must be set at instantiation time');
      +    }
      +    /**
      +     * true if this is an async stream
      +     */
      +    get ['async']() {
      +        return this[ASYNC];
      +    }
      +    /**
      +     * Set to true to make this stream async.
      +     *
      +     * Once set, it cannot be unset, as this would potentially cause incorrect
      +     * behavior.  Ie, a sync stream can be made async, but an async stream
      +     * cannot be safely made sync.
      +     */
      +    set ['async'](a) {
      +        this[ASYNC] = this[ASYNC] || !!a;
      +    }
      +    // drop everything and get out of the flow completely
      +    [ABORT]() {
      +        this[ABORTED] = true;
      +        this.emit('abort', this[SIGNAL]?.reason);
      +        this.destroy(this[SIGNAL]?.reason);
      +    }
      +    /**
      +     * True if the stream has been aborted.
      +     */
      +    get aborted() {
      +        return this[ABORTED];
      +    }
      +    /**
      +     * No-op setter. Stream aborted status is set via the AbortSignal provided
      +     * in the constructor options.
      +     */
      +    set aborted(_) { }
      +    write(chunk, encoding, cb) {
      +        if (this[ABORTED])
      +            return false;
      +        if (this[EOF])
      +            throw new Error('write after end');
      +        if (this[DESTROYED]) {
      +            this.emit('error', Object.assign(new Error('Cannot call write after a stream was destroyed'), { code: 'ERR_STREAM_DESTROYED' }));
      +            return true;
      +        }
      +        if (typeof encoding === 'function') {
      +            cb = encoding;
      +            encoding = 'utf8';
      +        }
      +        if (!encoding)
      +            encoding = 'utf8';
      +        const fn = this[ASYNC] ? defer : nodefer;
      +        // convert array buffers and typed array views into buffers
      +        // at some point in the future, we may want to do the opposite!
      +        // leave strings and buffers as-is
      +        // anything is only allowed if in object mode, so throw
      +        if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) {
      +            if (isArrayBufferView(chunk)) {
      +                //@ts-ignore - sinful unsafe type changing
      +                chunk = Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength);
      +            }
      +            else if (isArrayBufferLike(chunk)) {
      +                //@ts-ignore - sinful unsafe type changing
      +                chunk = Buffer.from(chunk);
      +            }
      +            else if (typeof chunk !== 'string') {
      +                throw new Error('Non-contiguous data written to non-objectMode stream');
      +            }
      +        }
      +        // handle object mode up front, since it's simpler
      +        // this yields better performance, fewer checks later.
      +        if (this[OBJECTMODE]) {
      +            // maybe impossible?
      +            /* c8 ignore start */
      +            if (this[FLOWING] && this[BUFFERLENGTH] !== 0)
      +                this[FLUSH](true);
      +            /* c8 ignore stop */
      +            if (this[FLOWING])
      +                this.emit('data', chunk);
      +            else
      +                this[BUFFERPUSH](chunk);
      +            if (this[BUFFERLENGTH] !== 0)
      +                this.emit('readable');
      +            if (cb)
      +                fn(cb);
      +            return this[FLOWING];
      +        }
      +        // at this point the chunk is a buffer or string
      +        // don't buffer it up or send it to the decoder
      +        if (!chunk.length) {
      +            if (this[BUFFERLENGTH] !== 0)
      +                this.emit('readable');
      +            if (cb)
      +                fn(cb);
      +            return this[FLOWING];
      +        }
      +        // fast-path writing strings of same encoding to a stream with
      +        // an empty buffer, skipping the buffer/decoder dance
      +        if (typeof chunk === 'string' &&
      +            // unless it is a string already ready for us to use
      +            !(encoding === this[ENCODING] && !this[DECODER]?.lastNeed)) {
      +            //@ts-ignore - sinful unsafe type change
      +            chunk = Buffer.from(chunk, encoding);
      +        }
      +        if (Buffer.isBuffer(chunk) && this[ENCODING]) {
      +            //@ts-ignore - sinful unsafe type change
      +            chunk = this[DECODER].write(chunk);
      +        }
      +        // Note: flushing CAN potentially switch us into not-flowing mode
      +        if (this[FLOWING] && this[BUFFERLENGTH] !== 0)
      +            this[FLUSH](true);
      +        if (this[FLOWING])
      +            this.emit('data', chunk);
      +        else
      +            this[BUFFERPUSH](chunk);
      +        if (this[BUFFERLENGTH] !== 0)
      +            this.emit('readable');
      +        if (cb)
      +            fn(cb);
      +        return this[FLOWING];
      +    }
      +    /**
      +     * Low-level explicit read method.
      +     *
      +     * In objectMode, the argument is ignored, and one item is returned if
      +     * available.
      +     *
      +     * `n` is the number of bytes (or in the case of encoding streams,
      +     * characters) to consume. If `n` is not provided, then the entire buffer
      +     * is returned, or `null` is returned if no data is available.
      +     *
      +     * If `n` is greater that the amount of data in the internal buffer,
      +     * then `null` is returned.
      +     */
      +    read(n) {
      +        if (this[DESTROYED])
      +            return null;
      +        this[DISCARDED] = false;
      +        if (this[BUFFERLENGTH] === 0 ||
      +            n === 0 ||
      +            (n && n > this[BUFFERLENGTH])) {
      +            this[MAYBE_EMIT_END]();
      +            return null;
      +        }
      +        if (this[OBJECTMODE])
      +            n = null;
      +        if (this[BUFFER].length > 1 && !this[OBJECTMODE]) {
      +            // not object mode, so if we have an encoding, then RType is string
      +            // otherwise, must be Buffer
      +            this[BUFFER] = [
      +                (this[ENCODING]
      +                    ? this[BUFFER].join('')
      +                    : Buffer.concat(this[BUFFER], this[BUFFERLENGTH])),
      +            ];
      +        }
      +        const ret = this[READ](n || null, this[BUFFER][0]);
      +        this[MAYBE_EMIT_END]();
      +        return ret;
      +    }
      +    [READ](n, chunk) {
      +        if (this[OBJECTMODE])
      +            this[BUFFERSHIFT]();
      +        else {
      +            const c = chunk;
      +            if (n === c.length || n === null)
      +                this[BUFFERSHIFT]();
      +            else if (typeof c === 'string') {
      +                this[BUFFER][0] = c.slice(n);
      +                chunk = c.slice(0, n);
      +                this[BUFFERLENGTH] -= n;
      +            }
      +            else {
      +                this[BUFFER][0] = c.subarray(n);
      +                chunk = c.subarray(0, n);
      +                this[BUFFERLENGTH] -= n;
      +            }
      +        }
      +        this.emit('data', chunk);
      +        if (!this[BUFFER].length && !this[EOF])
      +            this.emit('drain');
      +        return chunk;
      +    }
      +    end(chunk, encoding, cb) {
      +        if (typeof chunk === 'function') {
      +            cb = chunk;
      +            chunk = undefined;
      +        }
      +        if (typeof encoding === 'function') {
      +            cb = encoding;
      +            encoding = 'utf8';
      +        }
      +        if (chunk !== undefined)
      +            this.write(chunk, encoding);
      +        if (cb)
      +            this.once('end', cb);
      +        this[EOF] = true;
      +        this.writable = false;
      +        // if we haven't written anything, then go ahead and emit,
      +        // even if we're not reading.
      +        // we'll re-emit if a new 'end' listener is added anyway.
      +        // This makes MP more suitable to write-only use cases.
      +        if (this[FLOWING] || !this[PAUSED])
      +            this[MAYBE_EMIT_END]();
      +        return this;
      +    }
      +    // don't let the internal resume be overwritten
      +    [RESUME]() {
      +        if (this[DESTROYED])
      +            return;
      +        if (!this[DATALISTENERS] && !this[PIPES].length) {
      +            this[DISCARDED] = true;
      +        }
      +        this[PAUSED] = false;
      +        this[FLOWING] = true;
      +        this.emit('resume');
      +        if (this[BUFFER].length)
      +            this[FLUSH]();
      +        else if (this[EOF])
      +            this[MAYBE_EMIT_END]();
      +        else
      +            this.emit('drain');
      +    }
      +    /**
      +     * Resume the stream if it is currently in a paused state
      +     *
      +     * If called when there are no pipe destinations or `data` event listeners,
      +     * this will place the stream in a "discarded" state, where all data will
      +     * be thrown away. The discarded state is removed if a pipe destination or
      +     * data handler is added, if pause() is called, or if any synchronous or
      +     * asynchronous iteration is started.
      +     */
      +    resume() {
      +        return this[RESUME]();
      +    }
      +    /**
      +     * Pause the stream
      +     */
      +    pause() {
      +        this[FLOWING] = false;
      +        this[PAUSED] = true;
      +        this[DISCARDED] = false;
      +    }
      +    /**
      +     * true if the stream has been forcibly destroyed
      +     */
      +    get destroyed() {
      +        return this[DESTROYED];
      +    }
      +    /**
      +     * true if the stream is currently in a flowing state, meaning that
      +     * any writes will be immediately emitted.
      +     */
      +    get flowing() {
      +        return this[FLOWING];
      +    }
      +    /**
      +     * true if the stream is currently in a paused state
      +     */
      +    get paused() {
      +        return this[PAUSED];
      +    }
      +    [BUFFERPUSH](chunk) {
      +        if (this[OBJECTMODE])
      +            this[BUFFERLENGTH] += 1;
      +        else
      +            this[BUFFERLENGTH] += chunk.length;
      +        this[BUFFER].push(chunk);
      +    }
      +    [BUFFERSHIFT]() {
      +        if (this[OBJECTMODE])
      +            this[BUFFERLENGTH] -= 1;
      +        else
      +            this[BUFFERLENGTH] -= this[BUFFER][0].length;
      +        return this[BUFFER].shift();
      +    }
      +    [FLUSH](noDrain = false) {
      +        do { } while (this[FLUSHCHUNK](this[BUFFERSHIFT]()) &&
      +            this[BUFFER].length);
      +        if (!noDrain && !this[BUFFER].length && !this[EOF])
      +            this.emit('drain');
      +    }
      +    [FLUSHCHUNK](chunk) {
      +        this.emit('data', chunk);
      +        return this[FLOWING];
      +    }
      +    /**
      +     * Pipe all data emitted by this stream into the destination provided.
      +     *
      +     * Triggers the flow of data.
      +     */
      +    pipe(dest, opts) {
      +        if (this[DESTROYED])
      +            return dest;
      +        this[DISCARDED] = false;
      +        const ended = this[EMITTED_END];
      +        opts = opts || {};
      +        if (dest === proc.stdout || dest === proc.stderr)
      +            opts.end = false;
      +        else
      +            opts.end = opts.end !== false;
      +        opts.proxyErrors = !!opts.proxyErrors;
      +        // piping an ended stream ends immediately
      +        if (ended) {
      +            if (opts.end)
      +                dest.end();
      +        }
      +        else {
      +            // "as" here just ignores the WType, which pipes don't care about,
      +            // since they're only consuming from us, and writing to the dest
      +            this[PIPES].push(!opts.proxyErrors
      +                ? new Pipe(this, dest, opts)
      +                : new PipeProxyErrors(this, dest, opts));
      +            if (this[ASYNC])
      +                defer(() => this[RESUME]());
      +            else
      +                this[RESUME]();
      +        }
      +        return dest;
      +    }
      +    /**
      +     * Fully unhook a piped destination stream.
      +     *
      +     * If the destination stream was the only consumer of this stream (ie,
      +     * there are no other piped destinations or `'data'` event listeners)
      +     * then the flow of data will stop until there is another consumer or
      +     * {@link Minipass#resume} is explicitly called.
      +     */
      +    unpipe(dest) {
      +        const p = this[PIPES].find(p => p.dest === dest);
      +        if (p) {
      +            if (this[PIPES].length === 1) {
      +                if (this[FLOWING] && this[DATALISTENERS] === 0) {
      +                    this[FLOWING] = false;
      +                }
      +                this[PIPES] = [];
      +            }
      +            else
      +                this[PIPES].splice(this[PIPES].indexOf(p), 1);
      +            p.unpipe();
      +        }
      +    }
      +    /**
      +     * Alias for {@link Minipass#on}
      +     */
      +    addListener(ev, handler) {
      +        return this.on(ev, handler);
      +    }
      +    /**
      +     * Mostly identical to `EventEmitter.on`, with the following
      +     * behavior differences to prevent data loss and unnecessary hangs:
      +     *
      +     * - Adding a 'data' event handler will trigger the flow of data
      +     *
      +     * - Adding a 'readable' event handler when there is data waiting to be read
      +     *   will cause 'readable' to be emitted immediately.
      +     *
      +     * - Adding an 'endish' event handler ('end', 'finish', etc.) which has
      +     *   already passed will cause the event to be emitted immediately and all
      +     *   handlers removed.
      +     *
      +     * - Adding an 'error' event handler after an error has been emitted will
      +     *   cause the event to be re-emitted immediately with the error previously
      +     *   raised.
      +     */
      +    on(ev, handler) {
      +        const ret = super.on(ev, handler);
      +        if (ev === 'data') {
      +            this[DISCARDED] = false;
      +            this[DATALISTENERS]++;
      +            if (!this[PIPES].length && !this[FLOWING]) {
      +                this[RESUME]();
      +            }
      +        }
      +        else if (ev === 'readable' && this[BUFFERLENGTH] !== 0) {
      +            super.emit('readable');
      +        }
      +        else if (isEndish(ev) && this[EMITTED_END]) {
      +            super.emit(ev);
      +            this.removeAllListeners(ev);
      +        }
      +        else if (ev === 'error' && this[EMITTED_ERROR]) {
      +            const h = handler;
      +            if (this[ASYNC])
      +                defer(() => h.call(this, this[EMITTED_ERROR]));
      +            else
      +                h.call(this, this[EMITTED_ERROR]);
      +        }
      +        return ret;
      +    }
      +    /**
      +     * Alias for {@link Minipass#off}
      +     */
      +    removeListener(ev, handler) {
      +        return this.off(ev, handler);
      +    }
      +    /**
      +     * Mostly identical to `EventEmitter.off`
      +     *
      +     * If a 'data' event handler is removed, and it was the last consumer
      +     * (ie, there are no pipe destinations or other 'data' event listeners),
      +     * then the flow of data will stop until there is another consumer or
      +     * {@link Minipass#resume} is explicitly called.
      +     */
      +    off(ev, handler) {
      +        const ret = super.off(ev, handler);
      +        // if we previously had listeners, and now we don't, and we don't
      +        // have any pipes, then stop the flow, unless it's been explicitly
      +        // put in a discarded flowing state via stream.resume().
      +        if (ev === 'data') {
      +            this[DATALISTENERS] = this.listeners('data').length;
      +            if (this[DATALISTENERS] === 0 &&
      +                !this[DISCARDED] &&
      +                !this[PIPES].length) {
      +                this[FLOWING] = false;
      +            }
      +        }
      +        return ret;
      +    }
      +    /**
      +     * Mostly identical to `EventEmitter.removeAllListeners`
      +     *
      +     * If all 'data' event handlers are removed, and they were the last consumer
      +     * (ie, there are no pipe destinations), then the flow of data will stop
      +     * until there is another consumer or {@link Minipass#resume} is explicitly
      +     * called.
      +     */
      +    removeAllListeners(ev) {
      +        const ret = super.removeAllListeners(ev);
      +        if (ev === 'data' || ev === undefined) {
      +            this[DATALISTENERS] = 0;
      +            if (!this[DISCARDED] && !this[PIPES].length) {
      +                this[FLOWING] = false;
      +            }
      +        }
      +        return ret;
      +    }
      +    /**
      +     * true if the 'end' event has been emitted
      +     */
      +    get emittedEnd() {
      +        return this[EMITTED_END];
      +    }
      +    [MAYBE_EMIT_END]() {
      +        if (!this[EMITTING_END] &&
      +            !this[EMITTED_END] &&
      +            !this[DESTROYED] &&
      +            this[BUFFER].length === 0 &&
      +            this[EOF]) {
      +            this[EMITTING_END] = true;
      +            this.emit('end');
      +            this.emit('prefinish');
      +            this.emit('finish');
      +            if (this[CLOSED])
      +                this.emit('close');
      +            this[EMITTING_END] = false;
      +        }
      +    }
      +    /**
      +     * Mostly identical to `EventEmitter.emit`, with the following
      +     * behavior differences to prevent data loss and unnecessary hangs:
      +     *
      +     * If the stream has been destroyed, and the event is something other
      +     * than 'close' or 'error', then `false` is returned and no handlers
      +     * are called.
      +     *
      +     * If the event is 'end', and has already been emitted, then the event
      +     * is ignored. If the stream is in a paused or non-flowing state, then
      +     * the event will be deferred until data flow resumes. If the stream is
      +     * async, then handlers will be called on the next tick rather than
      +     * immediately.
      +     *
      +     * If the event is 'close', and 'end' has not yet been emitted, then
      +     * the event will be deferred until after 'end' is emitted.
      +     *
      +     * If the event is 'error', and an AbortSignal was provided for the stream,
      +     * and there are no listeners, then the event is ignored, matching the
      +     * behavior of node core streams in the presense of an AbortSignal.
      +     *
      +     * If the event is 'finish' or 'prefinish', then all listeners will be
      +     * removed after emitting the event, to prevent double-firing.
      +     */
      +    emit(ev, ...args) {
      +        const data = args[0];
      +        // error and close are only events allowed after calling destroy()
      +        if (ev !== 'error' &&
      +            ev !== 'close' &&
      +            ev !== DESTROYED &&
      +            this[DESTROYED]) {
      +            return false;
      +        }
      +        else if (ev === 'data') {
      +            return !this[OBJECTMODE] && !data
      +                ? false
      +                : this[ASYNC]
      +                    ? (defer(() => this[EMITDATA](data)), true)
      +                    : this[EMITDATA](data);
      +        }
      +        else if (ev === 'end') {
      +            return this[EMITEND]();
      +        }
      +        else if (ev === 'close') {
      +            this[CLOSED] = true;
      +            // don't emit close before 'end' and 'finish'
      +            if (!this[EMITTED_END] && !this[DESTROYED])
      +                return false;
      +            const ret = super.emit('close');
      +            this.removeAllListeners('close');
      +            return ret;
      +        }
      +        else if (ev === 'error') {
      +            this[EMITTED_ERROR] = data;
      +            super.emit(ERROR, data);
      +            const ret = !this[SIGNAL] || this.listeners('error').length
      +                ? super.emit('error', data)
      +                : false;
      +            this[MAYBE_EMIT_END]();
      +            return ret;
      +        }
      +        else if (ev === 'resume') {
      +            const ret = super.emit('resume');
      +            this[MAYBE_EMIT_END]();
      +            return ret;
      +        }
      +        else if (ev === 'finish' || ev === 'prefinish') {
      +            const ret = super.emit(ev);
      +            this.removeAllListeners(ev);
      +            return ret;
      +        }
      +        // Some other unknown event
      +        const ret = super.emit(ev, ...args);
      +        this[MAYBE_EMIT_END]();
      +        return ret;
      +    }
      +    [EMITDATA](data) {
      +        for (const p of this[PIPES]) {
      +            if (p.dest.write(data) === false)
      +                this.pause();
      +        }
      +        const ret = this[DISCARDED] ? false : super.emit('data', data);
      +        this[MAYBE_EMIT_END]();
      +        return ret;
      +    }
      +    [EMITEND]() {
      +        if (this[EMITTED_END])
      +            return false;
      +        this[EMITTED_END] = true;
      +        this.readable = false;
      +        return this[ASYNC]
      +            ? (defer(() => this[EMITEND2]()), true)
      +            : this[EMITEND2]();
      +    }
      +    [EMITEND2]() {
      +        if (this[DECODER]) {
      +            const data = this[DECODER].end();
      +            if (data) {
      +                for (const p of this[PIPES]) {
      +                    p.dest.write(data);
      +                }
      +                if (!this[DISCARDED])
      +                    super.emit('data', data);
      +            }
      +        }
      +        for (const p of this[PIPES]) {
      +            p.end();
      +        }
      +        const ret = super.emit('end');
      +        this.removeAllListeners('end');
      +        return ret;
      +    }
      +    /**
      +     * Return a Promise that resolves to an array of all emitted data once
      +     * the stream ends.
      +     */
      +    async collect() {
      +        const buf = Object.assign([], {
      +            dataLength: 0,
      +        });
      +        if (!this[OBJECTMODE])
      +            buf.dataLength = 0;
      +        // set the promise first, in case an error is raised
      +        // by triggering the flow here.
      +        const p = this.promise();
      +        this.on('data', c => {
      +            buf.push(c);
      +            if (!this[OBJECTMODE])
      +                buf.dataLength += c.length;
      +        });
      +        await p;
      +        return buf;
      +    }
      +    /**
      +     * Return a Promise that resolves to the concatenation of all emitted data
      +     * once the stream ends.
      +     *
      +     * Not allowed on objectMode streams.
      +     */
      +    async concat() {
      +        if (this[OBJECTMODE]) {
      +            throw new Error('cannot concat in objectMode');
      +        }
      +        const buf = await this.collect();
      +        return (this[ENCODING]
      +            ? buf.join('')
      +            : Buffer.concat(buf, buf.dataLength));
      +    }
      +    /**
      +     * Return a void Promise that resolves once the stream ends.
      +     */
      +    async promise() {
      +        return new Promise((resolve, reject) => {
      +            this.on(DESTROYED, () => reject(new Error('stream destroyed')));
      +            this.on('error', er => reject(er));
      +            this.on('end', () => resolve());
      +        });
      +    }
      +    /**
      +     * Asynchronous `for await of` iteration.
      +     *
      +     * This will continue emitting all chunks until the stream terminates.
      +     */
      +    [Symbol.asyncIterator]() {
      +        // set this up front, in case the consumer doesn't call next()
      +        // right away.
      +        this[DISCARDED] = false;
      +        let stopped = false;
      +        const stop = async () => {
      +            this.pause();
      +            stopped = true;
      +            return { value: undefined, done: true };
      +        };
      +        const next = () => {
      +            if (stopped)
      +                return stop();
      +            const res = this.read();
      +            if (res !== null)
      +                return Promise.resolve({ done: false, value: res });
      +            if (this[EOF])
      +                return stop();
      +            let resolve;
      +            let reject;
      +            const onerr = (er) => {
      +                this.off('data', ondata);
      +                this.off('end', onend);
      +                this.off(DESTROYED, ondestroy);
      +                stop();
      +                reject(er);
      +            };
      +            const ondata = (value) => {
      +                this.off('error', onerr);
      +                this.off('end', onend);
      +                this.off(DESTROYED, ondestroy);
      +                this.pause();
      +                resolve({ value, done: !!this[EOF] });
      +            };
      +            const onend = () => {
      +                this.off('error', onerr);
      +                this.off('data', ondata);
      +                this.off(DESTROYED, ondestroy);
      +                stop();
      +                resolve({ done: true, value: undefined });
      +            };
      +            const ondestroy = () => onerr(new Error('stream destroyed'));
      +            return new Promise((res, rej) => {
      +                reject = rej;
      +                resolve = res;
      +                this.once(DESTROYED, ondestroy);
      +                this.once('error', onerr);
      +                this.once('end', onend);
      +                this.once('data', ondata);
      +            });
      +        };
      +        return {
      +            next,
      +            throw: stop,
      +            return: stop,
      +            [Symbol.asyncIterator]() {
      +                return this;
      +            },
      +            [Symbol.asyncDispose]: async () => { },
      +        };
      +    }
      +    /**
      +     * Synchronous `for of` iteration.
      +     *
      +     * The iteration will terminate when the internal buffer runs out, even
      +     * if the stream has not yet terminated.
      +     */
      +    [Symbol.iterator]() {
      +        // set this up front, in case the consumer doesn't call next()
      +        // right away.
      +        this[DISCARDED] = false;
      +        let stopped = false;
      +        const stop = () => {
      +            this.pause();
      +            this.off(ERROR, stop);
      +            this.off(DESTROYED, stop);
      +            this.off('end', stop);
      +            stopped = true;
      +            return { done: true, value: undefined };
      +        };
      +        const next = () => {
      +            if (stopped)
      +                return stop();
      +            const value = this.read();
      +            return value === null ? stop() : { done: false, value };
      +        };
      +        this.once('end', stop);
      +        this.once(ERROR, stop);
      +        this.once(DESTROYED, stop);
      +        return {
      +            next,
      +            throw: stop,
      +            return: stop,
      +            [Symbol.iterator]() {
      +                return this;
      +            },
      +            [Symbol.dispose]: () => { },
      +        };
      +    }
      +    /**
      +     * Destroy a stream, preventing it from being used for any further purpose.
      +     *
      +     * If the stream has a `close()` method, then it will be called on
      +     * destruction.
      +     *
      +     * After destruction, any attempt to write data, read data, or emit most
      +     * events will be ignored.
      +     *
      +     * If an error argument is provided, then it will be emitted in an
      +     * 'error' event.
      +     */
      +    destroy(er) {
      +        if (this[DESTROYED]) {
      +            if (er)
      +                this.emit('error', er);
      +            else
      +                this.emit(DESTROYED);
      +            return this;
      +        }
      +        this[DESTROYED] = true;
      +        this[DISCARDED] = true;
      +        // throw away all buffered data, it's never coming out
      +        this[BUFFER].length = 0;
      +        this[BUFFERLENGTH] = 0;
      +        const wc = this;
      +        if (typeof wc.close === 'function' && !this[CLOSED])
      +            wc.close();
      +        if (er)
      +            this.emit('error', er);
      +        // if no error to emit, still reject pending promises
      +        else
      +            this.emit(DESTROYED);
      +        return this;
      +    }
      +    /**
      +     * Alias for {@link isStream}
      +     *
      +     * Former export location, maintained for backwards compatibility.
      +     *
      +     * @deprecated
      +     */
      +    static get isStream() {
      +        return isStream;
      +    }
      +}
      +//# sourceMappingURL=index.js.map
      \ No newline at end of file
      diff --git a/node_modules/minipass/dist/esm/index.js.map b/node_modules/minipass/dist/esm/index.js.map
      new file mode 100644
      index 00000000..4d87920c
      --- /dev/null
      +++ b/node_modules/minipass/dist/esm/index.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["const proc =\n  typeof process === 'object' && process\n    ? process\n    : {\n        stdout: null,\n        stderr: null,\n      }\nimport { EventEmitter } from 'node:events'\nimport Stream from 'node:stream'\nimport { StringDecoder } from 'node:string_decoder'\n\n/**\n * Same as StringDecoder, but exposing the `lastNeed` flag on the type\n */\ntype SD = StringDecoder & { lastNeed: boolean }\n\nexport type { SD, Pipe, PipeProxyErrors }\n\n/**\n * Return true if the argument is a Minipass stream, Node stream, or something\n * else that Minipass can interact with.\n */\nexport const isStream = (\n  s: any\n): s is Minipass.Readable | Minipass.Writable =>\n  !!s &&\n  typeof s === 'object' &&\n  (s instanceof Minipass ||\n    s instanceof Stream ||\n    isReadable(s) ||\n    isWritable(s))\n\n/**\n * Return true if the argument is a valid {@link Minipass.Readable}\n */\nexport const isReadable = (s: any): s is Minipass.Readable =>\n  !!s &&\n  typeof s === 'object' &&\n  s instanceof EventEmitter &&\n  typeof (s as Minipass.Readable).pipe === 'function' &&\n  // node core Writable streams have a pipe() method, but it throws\n  (s as Minipass.Readable).pipe !== Stream.Writable.prototype.pipe\n\n/**\n * Return true if the argument is a valid {@link Minipass.Writable}\n */\nexport const isWritable = (s: any): s is Minipass.Readable =>\n  !!s &&\n  typeof s === 'object' &&\n  s instanceof EventEmitter &&\n  typeof (s as Minipass.Writable).write === 'function' &&\n  typeof (s as Minipass.Writable).end === 'function'\n\nconst EOF = Symbol('EOF')\nconst MAYBE_EMIT_END = Symbol('maybeEmitEnd')\nconst EMITTED_END = Symbol('emittedEnd')\nconst EMITTING_END = Symbol('emittingEnd')\nconst EMITTED_ERROR = Symbol('emittedError')\nconst CLOSED = Symbol('closed')\nconst READ = Symbol('read')\nconst FLUSH = Symbol('flush')\nconst FLUSHCHUNK = Symbol('flushChunk')\nconst ENCODING = Symbol('encoding')\nconst DECODER = Symbol('decoder')\nconst FLOWING = Symbol('flowing')\nconst PAUSED = Symbol('paused')\nconst RESUME = Symbol('resume')\nconst BUFFER = Symbol('buffer')\nconst PIPES = Symbol('pipes')\nconst BUFFERLENGTH = Symbol('bufferLength')\nconst BUFFERPUSH = Symbol('bufferPush')\nconst BUFFERSHIFT = Symbol('bufferShift')\nconst OBJECTMODE = Symbol('objectMode')\n// internal event when stream is destroyed\nconst DESTROYED = Symbol('destroyed')\n// internal event when stream has an error\nconst ERROR = Symbol('error')\nconst EMITDATA = Symbol('emitData')\nconst EMITEND = Symbol('emitEnd')\nconst EMITEND2 = Symbol('emitEnd2')\nconst ASYNC = Symbol('async')\nconst ABORT = Symbol('abort')\nconst ABORTED = Symbol('aborted')\nconst SIGNAL = Symbol('signal')\nconst DATALISTENERS = Symbol('dataListeners')\nconst DISCARDED = Symbol('discarded')\n\nconst defer = (fn: (...a: any[]) => any) => Promise.resolve().then(fn)\nconst nodefer = (fn: (...a: any[]) => any) => fn()\n\n// events that mean 'the stream is over'\n// these are treated specially, and re-emitted\n// if they are listened for after emitting.\ntype EndishEvent = 'end' | 'finish' | 'prefinish'\nconst isEndish = (ev: any): ev is EndishEvent =>\n  ev === 'end' || ev === 'finish' || ev === 'prefinish'\n\nconst isArrayBufferLike = (b: any): b is ArrayBufferLike =>\n  b instanceof ArrayBuffer ||\n  (!!b &&\n    typeof b === 'object' &&\n    b.constructor &&\n    b.constructor.name === 'ArrayBuffer' &&\n    b.byteLength >= 0)\n\nconst isArrayBufferView = (b: any): b is ArrayBufferView =>\n  !Buffer.isBuffer(b) && ArrayBuffer.isView(b)\n\n/**\n * Options that may be passed to stream.pipe()\n */\nexport interface PipeOptions {\n  /**\n   * end the destination stream when the source stream ends\n   */\n  end?: boolean\n  /**\n   * proxy errors from the source stream to the destination stream\n   */\n  proxyErrors?: boolean\n}\n\n/**\n * Internal class representing a pipe to a destination stream.\n *\n * @internal\n */\nclass Pipe {\n  src: Minipass\n  dest: Minipass\n  opts: PipeOptions\n  ondrain: () => any\n  constructor(\n    src: Minipass,\n    dest: Minipass.Writable,\n    opts: PipeOptions\n  ) {\n    this.src = src\n    this.dest = dest as Minipass\n    this.opts = opts\n    this.ondrain = () => src[RESUME]()\n    this.dest.on('drain', this.ondrain)\n  }\n  unpipe() {\n    this.dest.removeListener('drain', this.ondrain)\n  }\n  // only here for the prototype\n  /* c8 ignore start */\n  proxyErrors(_er: any) {}\n  /* c8 ignore stop */\n  end() {\n    this.unpipe()\n    if (this.opts.end) this.dest.end()\n  }\n}\n\n/**\n * Internal class representing a pipe to a destination stream where\n * errors are proxied.\n *\n * @internal\n */\nclass PipeProxyErrors extends Pipe {\n  unpipe() {\n    this.src.removeListener('error', this.proxyErrors)\n    super.unpipe()\n  }\n  constructor(\n    src: Minipass,\n    dest: Minipass.Writable,\n    opts: PipeOptions\n  ) {\n    super(src, dest, opts)\n    this.proxyErrors = (er: Error) => this.dest.emit('error', er)\n    src.on('error', this.proxyErrors)\n  }\n}\n\nexport namespace Minipass {\n  /**\n   * Encoding used to create a stream that outputs strings rather than\n   * Buffer objects.\n   */\n  export type Encoding = BufferEncoding | 'buffer' | null\n\n  /**\n   * Any stream that Minipass can pipe into\n   */\n  export type Writable =\n    | Minipass\n    | NodeJS.WriteStream\n    | (NodeJS.WriteStream & { fd: number })\n    | (EventEmitter & {\n        end(): any\n        write(chunk: any, ...args: any[]): any\n      })\n\n  /**\n   * Any stream that can be read from\n   */\n  export type Readable =\n    | Minipass\n    | NodeJS.ReadStream\n    | (NodeJS.ReadStream & { fd: number })\n    | (EventEmitter & {\n        pause(): any\n        resume(): any\n        pipe(...destArgs: any[]): any\n      })\n\n  /**\n   * Utility type that can be iterated sync or async\n   */\n  export type DualIterable = Iterable & AsyncIterable\n\n  type EventArguments = Record\n\n  /**\n   * The listing of events that a Minipass class can emit.\n   * Extend this when extending the Minipass class, and pass as\n   * the third template argument.  The key is the name of the event,\n   * and the value is the argument list.\n   *\n   * Any undeclared events will still be allowed, but the handler will get\n   * arguments as `unknown[]`.\n   */\n  export interface Events\n    extends EventArguments {\n    readable: []\n    data: [chunk: RType]\n    error: [er: unknown]\n    abort: [reason: unknown]\n    drain: []\n    resume: []\n    end: []\n    finish: []\n    prefinish: []\n    close: []\n    [DESTROYED]: [er?: unknown]\n    [ERROR]: [er: unknown]\n  }\n\n  /**\n   * String or buffer-like data that can be joined and sliced\n   */\n  export type ContiguousData =\n    | Buffer\n    | ArrayBufferLike\n    | ArrayBufferView\n    | string\n  export type BufferOrString = Buffer | string\n\n  /**\n   * Options passed to the Minipass constructor.\n   */\n  export type SharedOptions = {\n    /**\n     * Defer all data emission and other events until the end of the\n     * current tick, similar to Node core streams\n     */\n    async?: boolean\n    /**\n     * A signal which will abort the stream\n     */\n    signal?: AbortSignal\n    /**\n     * Output string encoding. Set to `null` or `'buffer'` (or omit) to\n     * emit Buffer objects rather than strings.\n     *\n     * Conflicts with `objectMode`\n     */\n    encoding?: BufferEncoding | null | 'buffer'\n    /**\n     * Output data exactly as it was written, supporting non-buffer/string\n     * data (such as arbitrary objects, falsey values, etc.)\n     *\n     * Conflicts with `encoding`\n     */\n    objectMode?: boolean\n  }\n\n  /**\n   * Options for a string encoded output\n   */\n  export type EncodingOptions = SharedOptions & {\n    encoding: BufferEncoding\n    objectMode?: false\n  }\n\n  /**\n   * Options for contiguous data buffer output\n   */\n  export type BufferOptions = SharedOptions & {\n    encoding?: null | 'buffer'\n    objectMode?: false\n  }\n\n  /**\n   * Options for objectMode arbitrary output\n   */\n  export type ObjectModeOptions = SharedOptions & {\n    objectMode: true\n    encoding?: null\n  }\n\n  /**\n   * Utility type to determine allowed options based on read type\n   */\n  export type Options =\n    | ObjectModeOptions\n    | (T extends string\n        ? EncodingOptions\n        : T extends Buffer\n        ? BufferOptions\n        : SharedOptions)\n}\n\nconst isObjectModeOptions = (\n  o: Minipass.SharedOptions\n): o is Minipass.ObjectModeOptions => !!o.objectMode\n\nconst isEncodingOptions = (\n  o: Minipass.SharedOptions\n): o is Minipass.EncodingOptions =>\n  !o.objectMode && !!o.encoding && o.encoding !== 'buffer'\n\n/**\n * Main export, the Minipass class\n *\n * `RType` is the type of data emitted, defaults to Buffer\n *\n * `WType` is the type of data to be written, if RType is buffer or string,\n * then any {@link Minipass.ContiguousData} is allowed.\n *\n * `Events` is the set of event handler signatures that this object\n * will emit, see {@link Minipass.Events}\n */\nexport class Minipass<\n    RType extends unknown = Buffer,\n    WType extends unknown = RType extends Minipass.BufferOrString\n      ? Minipass.ContiguousData\n      : RType,\n    Events extends Minipass.Events = Minipass.Events\n  >\n  extends EventEmitter\n  implements Minipass.DualIterable\n{\n  [FLOWING]: boolean = false;\n  [PAUSED]: boolean = false;\n  [PIPES]: Pipe[] = [];\n  [BUFFER]: RType[] = [];\n  [OBJECTMODE]: boolean;\n  [ENCODING]: BufferEncoding | null;\n  [ASYNC]: boolean;\n  [DECODER]: SD | null;\n  [EOF]: boolean = false;\n  [EMITTED_END]: boolean = false;\n  [EMITTING_END]: boolean = false;\n  [CLOSED]: boolean = false;\n  [EMITTED_ERROR]: unknown = null;\n  [BUFFERLENGTH]: number = 0;\n  [DESTROYED]: boolean = false;\n  [SIGNAL]?: AbortSignal;\n  [ABORTED]: boolean = false;\n  [DATALISTENERS]: number = 0;\n  [DISCARDED]: boolean = false\n\n  /**\n   * true if the stream can be written\n   */\n  writable: boolean = true\n  /**\n   * true if the stream can be read\n   */\n  readable: boolean = true\n\n  /**\n   * If `RType` is Buffer, then options do not need to be provided.\n   * Otherwise, an options object must be provided to specify either\n   * {@link Minipass.SharedOptions.objectMode} or\n   * {@link Minipass.SharedOptions.encoding}, as appropriate.\n   */\n  constructor(\n    ...args:\n      | [Minipass.ObjectModeOptions]\n      | (RType extends Buffer\n          ? [] | [Minipass.Options]\n          : [Minipass.Options])\n  ) {\n    const options: Minipass.Options = (args[0] ||\n      {}) as Minipass.Options\n    super()\n    if (options.objectMode && typeof options.encoding === 'string') {\n      throw new TypeError(\n        'Encoding and objectMode may not be used together'\n      )\n    }\n    if (isObjectModeOptions(options)) {\n      this[OBJECTMODE] = true\n      this[ENCODING] = null\n    } else if (isEncodingOptions(options)) {\n      this[ENCODING] = options.encoding\n      this[OBJECTMODE] = false\n    } else {\n      this[OBJECTMODE] = false\n      this[ENCODING] = null\n    }\n    this[ASYNC] = !!options.async\n    this[DECODER] = this[ENCODING]\n      ? (new StringDecoder(this[ENCODING]) as SD)\n      : null\n\n    //@ts-ignore - private option for debugging and testing\n    if (options && options.debugExposeBuffer === true) {\n      Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] })\n    }\n    //@ts-ignore - private option for debugging and testing\n    if (options && options.debugExposePipes === true) {\n      Object.defineProperty(this, 'pipes', { get: () => this[PIPES] })\n    }\n\n    const { signal } = options\n    if (signal) {\n      this[SIGNAL] = signal\n      if (signal.aborted) {\n        this[ABORT]()\n      } else {\n        signal.addEventListener('abort', () => this[ABORT]())\n      }\n    }\n  }\n\n  /**\n   * The amount of data stored in the buffer waiting to be read.\n   *\n   * For Buffer strings, this will be the total byte length.\n   * For string encoding streams, this will be the string character length,\n   * according to JavaScript's `string.length` logic.\n   * For objectMode streams, this is a count of the items waiting to be\n   * emitted.\n   */\n  get bufferLength() {\n    return this[BUFFERLENGTH]\n  }\n\n  /**\n   * The `BufferEncoding` currently in use, or `null`\n   */\n  get encoding() {\n    return this[ENCODING]\n  }\n\n  /**\n   * @deprecated - This is a read only property\n   */\n  set encoding(_enc) {\n    throw new Error('Encoding must be set at instantiation time')\n  }\n\n  /**\n   * @deprecated - Encoding may only be set at instantiation time\n   */\n  setEncoding(_enc: Minipass.Encoding) {\n    throw new Error('Encoding must be set at instantiation time')\n  }\n\n  /**\n   * True if this is an objectMode stream\n   */\n  get objectMode() {\n    return this[OBJECTMODE]\n  }\n\n  /**\n   * @deprecated - This is a read-only property\n   */\n  set objectMode(_om) {\n    throw new Error('objectMode must be set at instantiation time')\n  }\n\n  /**\n   * true if this is an async stream\n   */\n  get ['async'](): boolean {\n    return this[ASYNC]\n  }\n  /**\n   * Set to true to make this stream async.\n   *\n   * Once set, it cannot be unset, as this would potentially cause incorrect\n   * behavior.  Ie, a sync stream can be made async, but an async stream\n   * cannot be safely made sync.\n   */\n  set ['async'](a: boolean) {\n    this[ASYNC] = this[ASYNC] || !!a\n  }\n\n  // drop everything and get out of the flow completely\n  [ABORT]() {\n    this[ABORTED] = true\n    this.emit('abort', this[SIGNAL]?.reason)\n    this.destroy(this[SIGNAL]?.reason)\n  }\n\n  /**\n   * True if the stream has been aborted.\n   */\n  get aborted() {\n    return this[ABORTED]\n  }\n  /**\n   * No-op setter. Stream aborted status is set via the AbortSignal provided\n   * in the constructor options.\n   */\n  set aborted(_) {}\n\n  /**\n   * Write data into the stream\n   *\n   * If the chunk written is a string, and encoding is not specified, then\n   * `utf8` will be assumed. If the stream encoding matches the encoding of\n   * a written string, and the state of the string decoder allows it, then\n   * the string will be passed through to either the output or the internal\n   * buffer without any processing. Otherwise, it will be turned into a\n   * Buffer object for processing into the desired encoding.\n   *\n   * If provided, `cb` function is called immediately before return for\n   * sync streams, or on next tick for async streams, because for this\n   * base class, a chunk is considered \"processed\" once it is accepted\n   * and either emitted or buffered. That is, the callback does not indicate\n   * that the chunk has been eventually emitted, though of course child\n   * classes can override this function to do whatever processing is required\n   * and call `super.write(...)` only once processing is completed.\n   */\n  write(chunk: WType, cb?: () => void): boolean\n  write(\n    chunk: WType,\n    encoding?: Minipass.Encoding,\n    cb?: () => void\n  ): boolean\n  write(\n    chunk: WType,\n    encoding?: Minipass.Encoding | (() => void),\n    cb?: () => void\n  ): boolean {\n    if (this[ABORTED]) return false\n    if (this[EOF]) throw new Error('write after end')\n\n    if (this[DESTROYED]) {\n      this.emit(\n        'error',\n        Object.assign(\n          new Error('Cannot call write after a stream was destroyed'),\n          { code: 'ERR_STREAM_DESTROYED' }\n        )\n      )\n      return true\n    }\n\n    if (typeof encoding === 'function') {\n      cb = encoding\n      encoding = 'utf8'\n    }\n\n    if (!encoding) encoding = 'utf8'\n\n    const fn = this[ASYNC] ? defer : nodefer\n\n    // convert array buffers and typed array views into buffers\n    // at some point in the future, we may want to do the opposite!\n    // leave strings and buffers as-is\n    // anything is only allowed if in object mode, so throw\n    if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) {\n      if (isArrayBufferView(chunk)) {\n        //@ts-ignore - sinful unsafe type changing\n        chunk = Buffer.from(\n          chunk.buffer,\n          chunk.byteOffset,\n          chunk.byteLength\n        )\n      } else if (isArrayBufferLike(chunk)) {\n        //@ts-ignore - sinful unsafe type changing\n        chunk = Buffer.from(chunk)\n      } else if (typeof chunk !== 'string') {\n        throw new Error(\n          'Non-contiguous data written to non-objectMode stream'\n        )\n      }\n    }\n\n    // handle object mode up front, since it's simpler\n    // this yields better performance, fewer checks later.\n    if (this[OBJECTMODE]) {\n      // maybe impossible?\n      /* c8 ignore start */\n      if (this[FLOWING] && this[BUFFERLENGTH] !== 0) this[FLUSH](true)\n      /* c8 ignore stop */\n\n      if (this[FLOWING]) this.emit('data', chunk as unknown as RType)\n      else this[BUFFERPUSH](chunk as unknown as RType)\n\n      if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n\n      if (cb) fn(cb)\n\n      return this[FLOWING]\n    }\n\n    // at this point the chunk is a buffer or string\n    // don't buffer it up or send it to the decoder\n    if (!(chunk as Minipass.BufferOrString).length) {\n      if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n      if (cb) fn(cb)\n      return this[FLOWING]\n    }\n\n    // fast-path writing strings of same encoding to a stream with\n    // an empty buffer, skipping the buffer/decoder dance\n    if (\n      typeof chunk === 'string' &&\n      // unless it is a string already ready for us to use\n      !(encoding === this[ENCODING] && !this[DECODER]?.lastNeed)\n    ) {\n      //@ts-ignore - sinful unsafe type change\n      chunk = Buffer.from(chunk, encoding)\n    }\n\n    if (Buffer.isBuffer(chunk) && this[ENCODING]) {\n      //@ts-ignore - sinful unsafe type change\n      chunk = this[DECODER].write(chunk)\n    }\n\n    // Note: flushing CAN potentially switch us into not-flowing mode\n    if (this[FLOWING] && this[BUFFERLENGTH] !== 0) this[FLUSH](true)\n\n    if (this[FLOWING]) this.emit('data', chunk as unknown as RType)\n    else this[BUFFERPUSH](chunk as unknown as RType)\n\n    if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n\n    if (cb) fn(cb)\n\n    return this[FLOWING]\n  }\n\n  /**\n   * Low-level explicit read method.\n   *\n   * In objectMode, the argument is ignored, and one item is returned if\n   * available.\n   *\n   * `n` is the number of bytes (or in the case of encoding streams,\n   * characters) to consume. If `n` is not provided, then the entire buffer\n   * is returned, or `null` is returned if no data is available.\n   *\n   * If `n` is greater that the amount of data in the internal buffer,\n   * then `null` is returned.\n   */\n  read(n?: number | null): RType | null {\n    if (this[DESTROYED]) return null\n    this[DISCARDED] = false\n\n    if (\n      this[BUFFERLENGTH] === 0 ||\n      n === 0 ||\n      (n && n > this[BUFFERLENGTH])\n    ) {\n      this[MAYBE_EMIT_END]()\n      return null\n    }\n\n    if (this[OBJECTMODE]) n = null\n\n    if (this[BUFFER].length > 1 && !this[OBJECTMODE]) {\n      // not object mode, so if we have an encoding, then RType is string\n      // otherwise, must be Buffer\n      this[BUFFER] = [\n        (this[ENCODING]\n          ? this[BUFFER].join('')\n          : Buffer.concat(\n              this[BUFFER] as Buffer[],\n              this[BUFFERLENGTH]\n            )) as RType,\n      ]\n    }\n\n    const ret = this[READ](n || null, this[BUFFER][0] as RType)\n    this[MAYBE_EMIT_END]()\n    return ret\n  }\n\n  [READ](n: number | null, chunk: RType) {\n    if (this[OBJECTMODE]) this[BUFFERSHIFT]()\n    else {\n      const c = chunk as Minipass.BufferOrString\n      if (n === c.length || n === null) this[BUFFERSHIFT]()\n      else if (typeof c === 'string') {\n        this[BUFFER][0] = c.slice(n) as RType\n        chunk = c.slice(0, n) as RType\n        this[BUFFERLENGTH] -= n\n      } else {\n        this[BUFFER][0] = c.subarray(n) as RType\n        chunk = c.subarray(0, n) as RType\n        this[BUFFERLENGTH] -= n\n      }\n    }\n\n    this.emit('data', chunk)\n\n    if (!this[BUFFER].length && !this[EOF]) this.emit('drain')\n\n    return chunk\n  }\n\n  /**\n   * End the stream, optionally providing a final write.\n   *\n   * See {@link Minipass#write} for argument descriptions\n   */\n  end(cb?: () => void): this\n  end(chunk: WType, cb?: () => void): this\n  end(chunk: WType, encoding?: Minipass.Encoding, cb?: () => void): this\n  end(\n    chunk?: WType | (() => void),\n    encoding?: Minipass.Encoding | (() => void),\n    cb?: () => void\n  ): this {\n    if (typeof chunk === 'function') {\n      cb = chunk as () => void\n      chunk = undefined\n    }\n    if (typeof encoding === 'function') {\n      cb = encoding\n      encoding = 'utf8'\n    }\n    if (chunk !== undefined) this.write(chunk, encoding)\n    if (cb) this.once('end', cb)\n    this[EOF] = true\n    this.writable = false\n\n    // if we haven't written anything, then go ahead and emit,\n    // even if we're not reading.\n    // we'll re-emit if a new 'end' listener is added anyway.\n    // This makes MP more suitable to write-only use cases.\n    if (this[FLOWING] || !this[PAUSED]) this[MAYBE_EMIT_END]()\n    return this\n  }\n\n  // don't let the internal resume be overwritten\n  [RESUME]() {\n    if (this[DESTROYED]) return\n\n    if (!this[DATALISTENERS] && !this[PIPES].length) {\n      this[DISCARDED] = true\n    }\n    this[PAUSED] = false\n    this[FLOWING] = true\n    this.emit('resume')\n    if (this[BUFFER].length) this[FLUSH]()\n    else if (this[EOF]) this[MAYBE_EMIT_END]()\n    else this.emit('drain')\n  }\n\n  /**\n   * Resume the stream if it is currently in a paused state\n   *\n   * If called when there are no pipe destinations or `data` event listeners,\n   * this will place the stream in a \"discarded\" state, where all data will\n   * be thrown away. The discarded state is removed if a pipe destination or\n   * data handler is added, if pause() is called, or if any synchronous or\n   * asynchronous iteration is started.\n   */\n  resume() {\n    return this[RESUME]()\n  }\n\n  /**\n   * Pause the stream\n   */\n  pause() {\n    this[FLOWING] = false\n    this[PAUSED] = true\n    this[DISCARDED] = false\n  }\n\n  /**\n   * true if the stream has been forcibly destroyed\n   */\n  get destroyed() {\n    return this[DESTROYED]\n  }\n\n  /**\n   * true if the stream is currently in a flowing state, meaning that\n   * any writes will be immediately emitted.\n   */\n  get flowing() {\n    return this[FLOWING]\n  }\n\n  /**\n   * true if the stream is currently in a paused state\n   */\n  get paused() {\n    return this[PAUSED]\n  }\n\n  [BUFFERPUSH](chunk: RType) {\n    if (this[OBJECTMODE]) this[BUFFERLENGTH] += 1\n    else this[BUFFERLENGTH] += (chunk as Minipass.BufferOrString).length\n    this[BUFFER].push(chunk)\n  }\n\n  [BUFFERSHIFT](): RType {\n    if (this[OBJECTMODE]) this[BUFFERLENGTH] -= 1\n    else\n      this[BUFFERLENGTH] -= (\n        this[BUFFER][0] as Minipass.BufferOrString\n      ).length\n    return this[BUFFER].shift() as RType\n  }\n\n  [FLUSH](noDrain: boolean = false) {\n    do {} while (\n      this[FLUSHCHUNK](this[BUFFERSHIFT]()) &&\n      this[BUFFER].length\n    )\n\n    if (!noDrain && !this[BUFFER].length && !this[EOF]) this.emit('drain')\n  }\n\n  [FLUSHCHUNK](chunk: RType) {\n    this.emit('data', chunk)\n    return this[FLOWING]\n  }\n\n  /**\n   * Pipe all data emitted by this stream into the destination provided.\n   *\n   * Triggers the flow of data.\n   */\n  pipe(dest: W, opts?: PipeOptions): W {\n    if (this[DESTROYED]) return dest\n    this[DISCARDED] = false\n\n    const ended = this[EMITTED_END]\n    opts = opts || {}\n    if (dest === proc.stdout || dest === proc.stderr) opts.end = false\n    else opts.end = opts.end !== false\n    opts.proxyErrors = !!opts.proxyErrors\n\n    // piping an ended stream ends immediately\n    if (ended) {\n      if (opts.end) dest.end()\n    } else {\n      // \"as\" here just ignores the WType, which pipes don't care about,\n      // since they're only consuming from us, and writing to the dest\n      this[PIPES].push(\n        !opts.proxyErrors\n          ? new Pipe(this as Minipass, dest, opts)\n          : new PipeProxyErrors(this as Minipass, dest, opts)\n      )\n      if (this[ASYNC]) defer(() => this[RESUME]())\n      else this[RESUME]()\n    }\n\n    return dest\n  }\n\n  /**\n   * Fully unhook a piped destination stream.\n   *\n   * If the destination stream was the only consumer of this stream (ie,\n   * there are no other piped destinations or `'data'` event listeners)\n   * then the flow of data will stop until there is another consumer or\n   * {@link Minipass#resume} is explicitly called.\n   */\n  unpipe(dest: W) {\n    const p = this[PIPES].find(p => p.dest === dest)\n    if (p) {\n      if (this[PIPES].length === 1) {\n        if (this[FLOWING] && this[DATALISTENERS] === 0) {\n          this[FLOWING] = false\n        }\n        this[PIPES] = []\n      } else this[PIPES].splice(this[PIPES].indexOf(p), 1)\n      p.unpipe()\n    }\n  }\n\n  /**\n   * Alias for {@link Minipass#on}\n   */\n  addListener(\n    ev: Event,\n    handler: (...args: Events[Event]) => any\n  ): this {\n    return this.on(ev, handler)\n  }\n\n  /**\n   * Mostly identical to `EventEmitter.on`, with the following\n   * behavior differences to prevent data loss and unnecessary hangs:\n   *\n   * - Adding a 'data' event handler will trigger the flow of data\n   *\n   * - Adding a 'readable' event handler when there is data waiting to be read\n   *   will cause 'readable' to be emitted immediately.\n   *\n   * - Adding an 'endish' event handler ('end', 'finish', etc.) which has\n   *   already passed will cause the event to be emitted immediately and all\n   *   handlers removed.\n   *\n   * - Adding an 'error' event handler after an error has been emitted will\n   *   cause the event to be re-emitted immediately with the error previously\n   *   raised.\n   */\n  on(\n    ev: Event,\n    handler: (...args: Events[Event]) => any\n  ): this {\n    const ret = super.on(\n      ev as string | symbol,\n      handler as (...a: any[]) => any\n    )\n    if (ev === 'data') {\n      this[DISCARDED] = false\n      this[DATALISTENERS]++\n      if (!this[PIPES].length && !this[FLOWING]) {\n        this[RESUME]()\n      }\n    } else if (ev === 'readable' && this[BUFFERLENGTH] !== 0) {\n      super.emit('readable')\n    } else if (isEndish(ev) && this[EMITTED_END]) {\n      super.emit(ev)\n      this.removeAllListeners(ev)\n    } else if (ev === 'error' && this[EMITTED_ERROR]) {\n      const h = handler as (...a: Events['error']) => any\n      if (this[ASYNC]) defer(() => h.call(this, this[EMITTED_ERROR]))\n      else h.call(this, this[EMITTED_ERROR])\n    }\n    return ret\n  }\n\n  /**\n   * Alias for {@link Minipass#off}\n   */\n  removeListener(\n    ev: Event,\n    handler: (...args: Events[Event]) => any\n  ) {\n    return this.off(ev, handler)\n  }\n\n  /**\n   * Mostly identical to `EventEmitter.off`\n   *\n   * If a 'data' event handler is removed, and it was the last consumer\n   * (ie, there are no pipe destinations or other 'data' event listeners),\n   * then the flow of data will stop until there is another consumer or\n   * {@link Minipass#resume} is explicitly called.\n   */\n  off(\n    ev: Event,\n    handler: (...args: Events[Event]) => any\n  ) {\n    const ret = super.off(\n      ev as string | symbol,\n      handler as (...a: any[]) => any\n    )\n    // if we previously had listeners, and now we don't, and we don't\n    // have any pipes, then stop the flow, unless it's been explicitly\n    // put in a discarded flowing state via stream.resume().\n    if (ev === 'data') {\n      this[DATALISTENERS] = this.listeners('data').length\n      if (\n        this[DATALISTENERS] === 0 &&\n        !this[DISCARDED] &&\n        !this[PIPES].length\n      ) {\n        this[FLOWING] = false\n      }\n    }\n    return ret\n  }\n\n  /**\n   * Mostly identical to `EventEmitter.removeAllListeners`\n   *\n   * If all 'data' event handlers are removed, and they were the last consumer\n   * (ie, there are no pipe destinations), then the flow of data will stop\n   * until there is another consumer or {@link Minipass#resume} is explicitly\n   * called.\n   */\n  removeAllListeners(ev?: Event) {\n    const ret = super.removeAllListeners(ev as string | symbol | undefined)\n    if (ev === 'data' || ev === undefined) {\n      this[DATALISTENERS] = 0\n      if (!this[DISCARDED] && !this[PIPES].length) {\n        this[FLOWING] = false\n      }\n    }\n    return ret\n  }\n\n  /**\n   * true if the 'end' event has been emitted\n   */\n  get emittedEnd() {\n    return this[EMITTED_END]\n  }\n\n  [MAYBE_EMIT_END]() {\n    if (\n      !this[EMITTING_END] &&\n      !this[EMITTED_END] &&\n      !this[DESTROYED] &&\n      this[BUFFER].length === 0 &&\n      this[EOF]\n    ) {\n      this[EMITTING_END] = true\n      this.emit('end')\n      this.emit('prefinish')\n      this.emit('finish')\n      if (this[CLOSED]) this.emit('close')\n      this[EMITTING_END] = false\n    }\n  }\n\n  /**\n   * Mostly identical to `EventEmitter.emit`, with the following\n   * behavior differences to prevent data loss and unnecessary hangs:\n   *\n   * If the stream has been destroyed, and the event is something other\n   * than 'close' or 'error', then `false` is returned and no handlers\n   * are called.\n   *\n   * If the event is 'end', and has already been emitted, then the event\n   * is ignored. If the stream is in a paused or non-flowing state, then\n   * the event will be deferred until data flow resumes. If the stream is\n   * async, then handlers will be called on the next tick rather than\n   * immediately.\n   *\n   * If the event is 'close', and 'end' has not yet been emitted, then\n   * the event will be deferred until after 'end' is emitted.\n   *\n   * If the event is 'error', and an AbortSignal was provided for the stream,\n   * and there are no listeners, then the event is ignored, matching the\n   * behavior of node core streams in the presense of an AbortSignal.\n   *\n   * If the event is 'finish' or 'prefinish', then all listeners will be\n   * removed after emitting the event, to prevent double-firing.\n   */\n  emit(\n    ev: Event,\n    ...args: Events[Event]\n  ): boolean {\n    const data = args[0]\n    // error and close are only events allowed after calling destroy()\n    if (\n      ev !== 'error' &&\n      ev !== 'close' &&\n      ev !== DESTROYED &&\n      this[DESTROYED]\n    ) {\n      return false\n    } else if (ev === 'data') {\n      return !this[OBJECTMODE] && !data\n        ? false\n        : this[ASYNC]\n        ? (defer(() => this[EMITDATA](data as RType)), true)\n        : this[EMITDATA](data as RType)\n    } else if (ev === 'end') {\n      return this[EMITEND]()\n    } else if (ev === 'close') {\n      this[CLOSED] = true\n      // don't emit close before 'end' and 'finish'\n      if (!this[EMITTED_END] && !this[DESTROYED]) return false\n      const ret = super.emit('close')\n      this.removeAllListeners('close')\n      return ret\n    } else if (ev === 'error') {\n      this[EMITTED_ERROR] = data\n      super.emit(ERROR, data)\n      const ret =\n        !this[SIGNAL] || this.listeners('error').length\n          ? super.emit('error', data)\n          : false\n      this[MAYBE_EMIT_END]()\n      return ret\n    } else if (ev === 'resume') {\n      const ret = super.emit('resume')\n      this[MAYBE_EMIT_END]()\n      return ret\n    } else if (ev === 'finish' || ev === 'prefinish') {\n      const ret = super.emit(ev)\n      this.removeAllListeners(ev)\n      return ret\n    }\n\n    // Some other unknown event\n    const ret = super.emit(ev as string, ...args)\n    this[MAYBE_EMIT_END]()\n    return ret\n  }\n\n  [EMITDATA](data: RType) {\n    for (const p of this[PIPES]) {\n      if (p.dest.write(data as RType) === false) this.pause()\n    }\n    const ret = this[DISCARDED] ? false : super.emit('data', data)\n    this[MAYBE_EMIT_END]()\n    return ret\n  }\n\n  [EMITEND]() {\n    if (this[EMITTED_END]) return false\n\n    this[EMITTED_END] = true\n    this.readable = false\n    return this[ASYNC]\n      ? (defer(() => this[EMITEND2]()), true)\n      : this[EMITEND2]()\n  }\n\n  [EMITEND2]() {\n    if (this[DECODER]) {\n      const data = this[DECODER].end()\n      if (data) {\n        for (const p of this[PIPES]) {\n          p.dest.write(data as RType)\n        }\n        if (!this[DISCARDED]) super.emit('data', data)\n      }\n    }\n\n    for (const p of this[PIPES]) {\n      p.end()\n    }\n    const ret = super.emit('end')\n    this.removeAllListeners('end')\n    return ret\n  }\n\n  /**\n   * Return a Promise that resolves to an array of all emitted data once\n   * the stream ends.\n   */\n  async collect(): Promise {\n    const buf: RType[] & { dataLength: number } = Object.assign([], {\n      dataLength: 0,\n    })\n    if (!this[OBJECTMODE]) buf.dataLength = 0\n    // set the promise first, in case an error is raised\n    // by triggering the flow here.\n    const p = this.promise()\n    this.on('data', c => {\n      buf.push(c)\n      if (!this[OBJECTMODE])\n        buf.dataLength += (c as Minipass.BufferOrString).length\n    })\n    await p\n    return buf\n  }\n\n  /**\n   * Return a Promise that resolves to the concatenation of all emitted data\n   * once the stream ends.\n   *\n   * Not allowed on objectMode streams.\n   */\n  async concat(): Promise {\n    if (this[OBJECTMODE]) {\n      throw new Error('cannot concat in objectMode')\n    }\n    const buf = await this.collect()\n    return (\n      this[ENCODING]\n        ? buf.join('')\n        : Buffer.concat(buf as Buffer[], buf.dataLength)\n    ) as RType\n  }\n\n  /**\n   * Return a void Promise that resolves once the stream ends.\n   */\n  async promise(): Promise {\n    return new Promise((resolve, reject) => {\n      this.on(DESTROYED, () => reject(new Error('stream destroyed')))\n      this.on('error', er => reject(er))\n      this.on('end', () => resolve())\n    })\n  }\n\n  /**\n   * Asynchronous `for await of` iteration.\n   *\n   * This will continue emitting all chunks until the stream terminates.\n   */\n  [Symbol.asyncIterator](): AsyncGenerator {\n    // set this up front, in case the consumer doesn't call next()\n    // right away.\n    this[DISCARDED] = false\n    let stopped = false\n    const stop = async (): Promise> => {\n      this.pause()\n      stopped = true\n      return { value: undefined, done: true }\n    }\n    const next = (): Promise> => {\n      if (stopped) return stop()\n      const res = this.read()\n      if (res !== null) return Promise.resolve({ done: false, value: res })\n\n      if (this[EOF]) return stop()\n\n      let resolve!: (res: IteratorResult) => void\n      let reject!: (er: unknown) => void\n      const onerr = (er: unknown) => {\n        this.off('data', ondata)\n        this.off('end', onend)\n        this.off(DESTROYED, ondestroy)\n        stop()\n        reject(er)\n      }\n      const ondata = (value: RType) => {\n        this.off('error', onerr)\n        this.off('end', onend)\n        this.off(DESTROYED, ondestroy)\n        this.pause()\n        resolve({ value, done: !!this[EOF] })\n      }\n      const onend = () => {\n        this.off('error', onerr)\n        this.off('data', ondata)\n        this.off(DESTROYED, ondestroy)\n        stop()\n        resolve({ done: true, value: undefined })\n      }\n      const ondestroy = () => onerr(new Error('stream destroyed'))\n      return new Promise>((res, rej) => {\n        reject = rej\n        resolve = res\n        this.once(DESTROYED, ondestroy)\n        this.once('error', onerr)\n        this.once('end', onend)\n        this.once('data', ondata)\n      })\n    }\n\n    return {\n      next,\n      throw: stop,\n      return: stop,\n      [Symbol.asyncIterator]() {\n        return this\n      },\n      [Symbol.asyncDispose]: async () => {},\n    }\n  }\n\n  /**\n   * Synchronous `for of` iteration.\n   *\n   * The iteration will terminate when the internal buffer runs out, even\n   * if the stream has not yet terminated.\n   */\n  [Symbol.iterator](): Generator {\n    // set this up front, in case the consumer doesn't call next()\n    // right away.\n    this[DISCARDED] = false\n    let stopped = false\n    const stop = (): IteratorReturnResult => {\n      this.pause()\n      this.off(ERROR, stop)\n      this.off(DESTROYED, stop)\n      this.off('end', stop)\n      stopped = true\n      return { done: true, value: undefined }\n    }\n\n    const next = (): IteratorResult => {\n      if (stopped) return stop()\n      const value = this.read()\n      return value === null ? stop() : { done: false, value }\n    }\n\n    this.once('end', stop)\n    this.once(ERROR, stop)\n    this.once(DESTROYED, stop)\n\n    return {\n      next,\n      throw: stop,\n      return: stop,\n      [Symbol.iterator]() {\n        return this\n      },\n      [Symbol.dispose]: () => {},\n    }\n  }\n\n  /**\n   * Destroy a stream, preventing it from being used for any further purpose.\n   *\n   * If the stream has a `close()` method, then it will be called on\n   * destruction.\n   *\n   * After destruction, any attempt to write data, read data, or emit most\n   * events will be ignored.\n   *\n   * If an error argument is provided, then it will be emitted in an\n   * 'error' event.\n   */\n  destroy(er?: unknown) {\n    if (this[DESTROYED]) {\n      if (er) this.emit('error', er)\n      else this.emit(DESTROYED)\n      return this\n    }\n\n    this[DESTROYED] = true\n    this[DISCARDED] = true\n\n    // throw away all buffered data, it's never coming out\n    this[BUFFER].length = 0\n    this[BUFFERLENGTH] = 0\n\n    const wc = this as Minipass & {\n      close?: () => void\n    }\n    if (typeof wc.close === 'function' && !this[CLOSED]) wc.close()\n\n    if (er) this.emit('error', er)\n    // if no error to emit, still reject pending promises\n    else this.emit(DESTROYED)\n\n    return this\n  }\n\n  /**\n   * Alias for {@link isStream}\n   *\n   * Former export location, maintained for backwards compatibility.\n   *\n   * @deprecated\n   */\n  static get isStream() {\n    return isStream\n  }\n}\n"]}
      \ No newline at end of file
      diff --git a/node_modules/minipass/dist/esm/package.json b/node_modules/minipass/dist/esm/package.json
      new file mode 100644
      index 00000000..3dbc1ca5
      --- /dev/null
      +++ b/node_modules/minipass/dist/esm/package.json
      @@ -0,0 +1,3 @@
      +{
      +  "type": "module"
      +}
      diff --git a/node_modules/minipass/package.json b/node_modules/minipass/package.json
      new file mode 100644
      index 00000000..800f215c
      --- /dev/null
      +++ b/node_modules/minipass/package.json
      @@ -0,0 +1,77 @@
      +{
      +  "name": "minipass",
      +  "version": "7.1.3",
      +  "description": "minimal implementation of a PassThrough stream",
      +  "main": "./dist/commonjs/index.js",
      +  "types": "./dist/commonjs/index.d.ts",
      +  "module": "./dist/esm/index.js",
      +  "type": "module",
      +  "tshy": {
      +    "selfLink": false,
      +    "compiler": "tsgo",
      +    "exports": {
      +      "./package.json": "./package.json",
      +      ".": "./src/index.ts"
      +    }
      +  },
      +  "exports": {
      +    "./package.json": "./package.json",
      +    ".": {
      +      "import": {
      +        "types": "./dist/esm/index.d.ts",
      +        "default": "./dist/esm/index.js"
      +      },
      +      "require": {
      +        "types": "./dist/commonjs/index.d.ts",
      +        "default": "./dist/commonjs/index.js"
      +      }
      +    }
      +  },
      +  "files": [
      +    "dist"
      +  ],
      +  "scripts": {
      +    "preversion": "npm test",
      +    "postversion": "npm publish",
      +    "prepublishOnly": "git push origin --follow-tags",
      +    "prepare": "tshy",
      +    "pretest": "npm run prepare",
      +    "presnap": "npm run prepare",
      +    "test": "tap",
      +    "snap": "tap",
      +    "format": "prettier --write . --loglevel warn",
      +    "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts"
      +  },
      +  "prettier": {
      +    "semi": false,
      +    "printWidth": 75,
      +    "tabWidth": 2,
      +    "useTabs": false,
      +    "singleQuote": true,
      +    "jsxSingleQuote": false,
      +    "bracketSameLine": true,
      +    "arrowParens": "avoid",
      +    "endOfLine": "lf"
      +  },
      +  "devDependencies": {
      +    "@types/end-of-stream": "^1.4.2",
      +    "@types/node": "^25.2.3",
      +    "end-of-stream": "^1.4.0",
      +    "node-abort-controller": "^3.1.1",
      +    "prettier": "^3.8.1",
      +    "tap": "^21.6.1",
      +    "through2": "^2.0.3",
      +    "tshy": "^3.3.2",
      +    "typedoc": "^0.28.17"
      +  },
      +  "repository": "https://github.com/isaacs/minipass",
      +  "keywords": [
      +    "passthrough",
      +    "stream"
      +  ],
      +  "author": "Isaac Z. Schlueter  (http://blog.izs.me/)",
      +  "license": "BlueOak-1.0.0",
      +  "engines": {
      +    "node": ">=16 || 14 >=14.17"
      +  }
      +}
      diff --git a/node_modules/mkdirp/LICENSE b/node_modules/mkdirp/LICENSE
      new file mode 100644
      index 00000000..0a034db7
      --- /dev/null
      +++ b/node_modules/mkdirp/LICENSE
      @@ -0,0 +1,21 @@
      +Copyright (c) 2011-2023 James Halliday (mail@substack.net) and Isaac Z. Schlueter (i@izs.me)
      +
      +This project is free software released under the MIT license:
      +
      +Permission is hereby granted, free of charge, to any person obtaining a copy
      +of this software and associated documentation files (the "Software"), to deal
      +in the Software without restriction, including without limitation the rights
      +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
      +copies of the Software, and to permit persons to whom the Software is
      +furnished to do so, subject to the following conditions:
      +
      +The above copyright notice and this permission notice shall be included in
      +all copies or substantial portions of the Software.
      +
      +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
      +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
      +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
      +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
      +THE SOFTWARE.
      diff --git a/node_modules/mkdirp/dist/cjs/package.json b/node_modules/mkdirp/dist/cjs/package.json
      new file mode 100644
      index 00000000..9d04a66e
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/package.json
      @@ -0,0 +1,91 @@
      +{
      +    "name": "mkdirp",
      +    "description": "Recursively mkdir, like `mkdir -p`",
      +    "version": "3.0.1",
      +    "keywords": [
      +        "mkdir",
      +        "directory",
      +        "make dir",
      +        "make",
      +        "dir",
      +        "recursive",
      +        "native"
      +    ],
      +    "bin": "./dist/cjs/src/bin.js",
      +    "main": "./dist/cjs/src/index.js",
      +    "module": "./dist/mjs/index.js",
      +    "types": "./dist/mjs/index.d.ts",
      +    "exports": {
      +        ".": {
      +            "import": {
      +                "types": "./dist/mjs/index.d.ts",
      +                "default": "./dist/mjs/index.js"
      +            },
      +            "require": {
      +                "types": "./dist/cjs/src/index.d.ts",
      +                "default": "./dist/cjs/src/index.js"
      +            }
      +        }
      +    },
      +    "files": [
      +        "dist"
      +    ],
      +    "scripts": {
      +        "preversion": "npm test",
      +        "postversion": "npm publish",
      +        "prepublishOnly": "git push origin --follow-tags",
      +        "preprepare": "rm -rf dist",
      +        "prepare": "tsc -p tsconfig.json && tsc -p tsconfig-esm.json",
      +        "postprepare": "bash fixup.sh",
      +        "pretest": "npm run prepare",
      +        "presnap": "npm run prepare",
      +        "test": "c8 tap",
      +        "snap": "c8 tap",
      +        "format": "prettier --write . --loglevel warn",
      +        "benchmark": "node benchmark/index.js",
      +        "typedoc": "typedoc --tsconfig tsconfig-esm.json ./src/*.ts"
      +    },
      +    "prettier": {
      +        "semi": false,
      +        "printWidth": 80,
      +        "tabWidth": 2,
      +        "useTabs": false,
      +        "singleQuote": true,
      +        "jsxSingleQuote": false,
      +        "bracketSameLine": true,
      +        "arrowParens": "avoid",
      +        "endOfLine": "lf"
      +    },
      +    "devDependencies": {
      +        "@types/brace-expansion": "^1.1.0",
      +        "@types/node": "^18.11.9",
      +        "@types/tap": "^15.0.7",
      +        "c8": "^7.12.0",
      +        "eslint-config-prettier": "^8.6.0",
      +        "prettier": "^2.8.2",
      +        "tap": "^16.3.3",
      +        "ts-node": "^10.9.1",
      +        "typedoc": "^0.23.21",
      +        "typescript": "^4.9.3"
      +    },
      +    "tap": {
      +        "coverage": false,
      +        "node-arg": [
      +            "--no-warnings",
      +            "--loader",
      +            "ts-node/esm"
      +        ],
      +        "ts": false
      +    },
      +    "funding": {
      +        "url": "https://github.com/sponsors/isaacs"
      +    },
      +    "repository": {
      +        "type": "git",
      +        "url": "https://github.com/isaacs/node-mkdirp.git"
      +    },
      +    "license": "MIT",
      +    "engines": {
      +        "node": ">=10"
      +    }
      +}
      diff --git a/node_modules/mkdirp/dist/cjs/src/bin.d.ts b/node_modules/mkdirp/dist/cjs/src/bin.d.ts
      new file mode 100644
      index 00000000..34e00522
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/bin.d.ts
      @@ -0,0 +1,3 @@
      +#!/usr/bin/env node
      +export {};
      +//# sourceMappingURL=bin.d.ts.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/bin.d.ts.map b/node_modules/mkdirp/dist/cjs/src/bin.d.ts.map
      new file mode 100644
      index 00000000..c10c656e
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/bin.d.ts.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../../../src/bin.ts"],"names":[],"mappings":""}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/bin.js b/node_modules/mkdirp/dist/cjs/src/bin.js
      new file mode 100644
      index 00000000..757aae1f
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/bin.js
      @@ -0,0 +1,80 @@
      +#!/usr/bin/env node
      +"use strict";
      +Object.defineProperty(exports, "__esModule", { value: true });
      +const package_json_1 = require("../package.json");
      +const usage = () => `
      +usage: mkdirp [DIR1,DIR2..] {OPTIONS}
      +
      +  Create each supplied directory including any necessary parent directories
      +  that don't yet exist.
      +
      +  If the directory already exists, do nothing.
      +
      +OPTIONS are:
      +
      +  -m       If a directory needs to be created, set the mode as an octal
      +  --mode=  permission string.
      +
      +  -v --version   Print the mkdirp version number
      +
      +  -h --help      Print this helpful banner
      +
      +  -p --print     Print the first directories created for each path provided
      +
      +  --manual       Use manual implementation, even if native is available
      +`;
      +const dirs = [];
      +const opts = {};
      +let doPrint = false;
      +let dashdash = false;
      +let manual = false;
      +for (const arg of process.argv.slice(2)) {
      +    if (dashdash)
      +        dirs.push(arg);
      +    else if (arg === '--')
      +        dashdash = true;
      +    else if (arg === '--manual')
      +        manual = true;
      +    else if (/^-h/.test(arg) || /^--help/.test(arg)) {
      +        console.log(usage());
      +        process.exit(0);
      +    }
      +    else if (arg === '-v' || arg === '--version') {
      +        console.log(package_json_1.version);
      +        process.exit(0);
      +    }
      +    else if (arg === '-p' || arg === '--print') {
      +        doPrint = true;
      +    }
      +    else if (/^-m/.test(arg) || /^--mode=/.test(arg)) {
      +        // these don't get covered in CI, but work locally
      +        // weird because the tests below show as passing in the output.
      +        /* c8 ignore start */
      +        const mode = parseInt(arg.replace(/^(-m|--mode=)/, ''), 8);
      +        if (isNaN(mode)) {
      +            console.error(`invalid mode argument: ${arg}\nMust be an octal number.`);
      +            process.exit(1);
      +        }
      +        /* c8 ignore stop */
      +        opts.mode = mode;
      +    }
      +    else
      +        dirs.push(arg);
      +}
      +const index_js_1 = require("./index.js");
      +const impl = manual ? index_js_1.mkdirp.manual : index_js_1.mkdirp;
      +if (dirs.length === 0) {
      +    console.error(usage());
      +}
      +// these don't get covered in CI, but work locally
      +/* c8 ignore start */
      +Promise.all(dirs.map(dir => impl(dir, opts)))
      +    .then(made => (doPrint ? made.forEach(m => m && console.log(m)) : null))
      +    .catch(er => {
      +    console.error(er.message);
      +    if (er.code)
      +        console.error('  code: ' + er.code);
      +    process.exit(1);
      +});
      +/* c8 ignore stop */
      +//# sourceMappingURL=bin.js.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/bin.js.map b/node_modules/mkdirp/dist/cjs/src/bin.js.map
      new file mode 100644
      index 00000000..d9929530
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/bin.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"bin.js","sourceRoot":"","sources":["../../../src/bin.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n\nimport { version } from '../package.json'\nimport { MkdirpOptions } from './opts-arg.js'\n\nconst usage = () => `\nusage: mkdirp [DIR1,DIR2..] {OPTIONS}\n\n  Create each supplied directory including any necessary parent directories\n  that don't yet exist.\n\n  If the directory already exists, do nothing.\n\nOPTIONS are:\n\n  -m       If a directory needs to be created, set the mode as an octal\n  --mode=  permission string.\n\n  -v --version   Print the mkdirp version number\n\n  -h --help      Print this helpful banner\n\n  -p --print     Print the first directories created for each path provided\n\n  --manual       Use manual implementation, even if native is available\n`\n\nconst dirs: string[] = []\nconst opts: MkdirpOptions = {}\nlet doPrint: boolean = false\nlet dashdash = false\nlet manual = false\nfor (const arg of process.argv.slice(2)) {\n  if (dashdash) dirs.push(arg)\n  else if (arg === '--') dashdash = true\n  else if (arg === '--manual') manual = true\n  else if (/^-h/.test(arg) || /^--help/.test(arg)) {\n    console.log(usage())\n    process.exit(0)\n  } else if (arg === '-v' || arg === '--version') {\n    console.log(version)\n    process.exit(0)\n  } else if (arg === '-p' || arg === '--print') {\n    doPrint = true\n  } else if (/^-m/.test(arg) || /^--mode=/.test(arg)) {\n    // these don't get covered in CI, but work locally\n    // weird because the tests below show as passing in the output.\n    /* c8 ignore start */\n    const mode = parseInt(arg.replace(/^(-m|--mode=)/, ''), 8)\n    if (isNaN(mode)) {\n      console.error(`invalid mode argument: ${arg}\\nMust be an octal number.`)\n      process.exit(1)\n    }\n    /* c8 ignore stop */\n    opts.mode = mode\n  } else dirs.push(arg)\n}\n\nimport { mkdirp } from './index.js'\nconst impl = manual ? mkdirp.manual : mkdirp\nif (dirs.length === 0) {\n  console.error(usage())\n}\n\n// these don't get covered in CI, but work locally\n/* c8 ignore start */\nPromise.all(dirs.map(dir => impl(dir, opts)))\n  .then(made => (doPrint ? made.forEach(m => m && console.log(m)) : null))\n  .catch(er => {\n    console.error(er.message)\n    if (er.code) console.error('  code: ' + er.code)\n    process.exit(1)\n  })\n/* c8 ignore stop */\n"]}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/find-made.d.ts b/node_modules/mkdirp/dist/cjs/src/find-made.d.ts
      new file mode 100644
      index 00000000..e47794b3
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/find-made.d.ts
      @@ -0,0 +1,4 @@
      +import { MkdirpOptionsResolved } from './opts-arg.js';
      +export declare const findMade: (opts: MkdirpOptionsResolved, parent: string, path?: string) => Promise;
      +export declare const findMadeSync: (opts: MkdirpOptionsResolved, parent: string, path?: string) => undefined | string;
      +//# sourceMappingURL=find-made.d.ts.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/find-made.d.ts.map b/node_modules/mkdirp/dist/cjs/src/find-made.d.ts.map
      new file mode 100644
      index 00000000..00d5d1a4
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/find-made.d.ts.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"find-made.d.ts","sourceRoot":"","sources":["../../../src/find-made.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAErD,eAAO,MAAM,QAAQ,SACb,qBAAqB,UACnB,MAAM,SACP,MAAM,KACZ,QAAQ,SAAS,GAAG,MAAM,CAe5B,CAAA;AAED,eAAO,MAAM,YAAY,SACjB,qBAAqB,UACnB,MAAM,SACP,MAAM,KACZ,SAAS,GAAG,MAad,CAAA"}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/find-made.js b/node_modules/mkdirp/dist/cjs/src/find-made.js
      new file mode 100644
      index 00000000..e831ef27
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/find-made.js
      @@ -0,0 +1,35 @@
      +"use strict";
      +Object.defineProperty(exports, "__esModule", { value: true });
      +exports.findMadeSync = exports.findMade = void 0;
      +const path_1 = require("path");
      +const findMade = async (opts, parent, path) => {
      +    // we never want the 'made' return value to be a root directory
      +    if (path === parent) {
      +        return;
      +    }
      +    return opts.statAsync(parent).then(st => (st.isDirectory() ? path : undefined), // will fail later
      +    // will fail later
      +    er => {
      +        const fer = er;
      +        return fer && fer.code === 'ENOENT'
      +            ? (0, exports.findMade)(opts, (0, path_1.dirname)(parent), parent)
      +            : undefined;
      +    });
      +};
      +exports.findMade = findMade;
      +const findMadeSync = (opts, parent, path) => {
      +    if (path === parent) {
      +        return undefined;
      +    }
      +    try {
      +        return opts.statSync(parent).isDirectory() ? path : undefined;
      +    }
      +    catch (er) {
      +        const fer = er;
      +        return fer && fer.code === 'ENOENT'
      +            ? (0, exports.findMadeSync)(opts, (0, path_1.dirname)(parent), parent)
      +            : undefined;
      +    }
      +};
      +exports.findMadeSync = findMadeSync;
      +//# sourceMappingURL=find-made.js.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/find-made.js.map b/node_modules/mkdirp/dist/cjs/src/find-made.js.map
      new file mode 100644
      index 00000000..30a0d663
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/find-made.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"find-made.js","sourceRoot":"","sources":["../../../src/find-made.ts"],"names":[],"mappings":";;;AAAA,+BAA8B;AAGvB,MAAM,QAAQ,GAAG,KAAK,EAC3B,IAA2B,EAC3B,MAAc,EACd,IAAa,EACgB,EAAE;IAC/B,+DAA+D;IAC/D,IAAI,IAAI,KAAK,MAAM,EAAE;QACnB,OAAM;KACP;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAChC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,kBAAkB;IAC/D,AAD6C,kBAAkB;IAC/D,EAAE,CAAC,EAAE;QACH,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YACjC,CAAC,CAAC,IAAA,gBAAQ,EAAC,IAAI,EAAE,IAAA,cAAO,EAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YACzC,CAAC,CAAC,SAAS,CAAA;IACf,CAAC,CACF,CAAA;AACH,CAAC,CAAA;AAnBY,QAAA,QAAQ,YAmBpB;AAEM,MAAM,YAAY,GAAG,CAC1B,IAA2B,EAC3B,MAAc,EACd,IAAa,EACO,EAAE;IACtB,IAAI,IAAI,KAAK,MAAM,EAAE;QACnB,OAAO,SAAS,CAAA;KACjB;IAED,IAAI;QACF,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;KAC9D;IAAC,OAAO,EAAE,EAAE;QACX,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YACjC,CAAC,CAAC,IAAA,oBAAY,EAAC,IAAI,EAAE,IAAA,cAAO,EAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YAC7C,CAAC,CAAC,SAAS,CAAA;KACd;AACH,CAAC,CAAA;AAjBY,QAAA,YAAY,gBAiBxB","sourcesContent":["import { dirname } from 'path'\nimport { MkdirpOptionsResolved } from './opts-arg.js'\n\nexport const findMade = async (\n  opts: MkdirpOptionsResolved,\n  parent: string,\n  path?: string\n): Promise => {\n  // we never want the 'made' return value to be a root directory\n  if (path === parent) {\n    return\n  }\n\n  return opts.statAsync(parent).then(\n    st => (st.isDirectory() ? path : undefined), // will fail later\n    er => {\n      const fer = er as NodeJS.ErrnoException\n      return fer && fer.code === 'ENOENT'\n        ? findMade(opts, dirname(parent), parent)\n        : undefined\n    }\n  )\n}\n\nexport const findMadeSync = (\n  opts: MkdirpOptionsResolved,\n  parent: string,\n  path?: string\n): undefined | string => {\n  if (path === parent) {\n    return undefined\n  }\n\n  try {\n    return opts.statSync(parent).isDirectory() ? path : undefined\n  } catch (er) {\n    const fer = er as NodeJS.ErrnoException\n    return fer && fer.code === 'ENOENT'\n      ? findMadeSync(opts, dirname(parent), parent)\n      : undefined\n  }\n}\n"]}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/index.d.ts b/node_modules/mkdirp/dist/cjs/src/index.d.ts
      new file mode 100644
      index 00000000..fc9e43b3
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/index.d.ts
      @@ -0,0 +1,39 @@
      +import { MkdirpOptions } from './opts-arg.js';
      +export { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js';
      +export { mkdirpNative, mkdirpNativeSync } from './mkdirp-native.js';
      +export { useNative, useNativeSync } from './use-native.js';
      +export declare const mkdirpSync: (path: string, opts?: MkdirpOptions) => string | void;
      +export declare const sync: (path: string, opts?: MkdirpOptions) => string | void;
      +export declare const manual: ((path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => Promise) & {
      +    sync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined;
      +};
      +export declare const manualSync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined;
      +export declare const native: ((path: string, options?: MkdirpOptions | undefined) => Promise) & {
      +    sync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined;
      +};
      +export declare const nativeSync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined;
      +export declare const mkdirp: ((path: string, opts?: MkdirpOptions) => Promise) & {
      +    mkdirpSync: (path: string, opts?: MkdirpOptions) => string | void;
      +    mkdirpNative: ((path: string, options?: MkdirpOptions | undefined) => Promise) & {
      +        sync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined;
      +    };
      +    mkdirpNativeSync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined;
      +    mkdirpManual: ((path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => Promise) & {
      +        sync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined;
      +    };
      +    mkdirpManualSync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined;
      +    sync: (path: string, opts?: MkdirpOptions) => string | void;
      +    native: ((path: string, options?: MkdirpOptions | undefined) => Promise) & {
      +        sync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined;
      +    };
      +    nativeSync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined;
      +    manual: ((path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => Promise) & {
      +        sync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined;
      +    };
      +    manualSync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined;
      +    useNative: ((opts?: MkdirpOptions | undefined) => boolean) & {
      +        sync: (opts?: MkdirpOptions | undefined) => boolean;
      +    };
      +    useNativeSync: (opts?: MkdirpOptions | undefined) => boolean;
      +};
      +//# sourceMappingURL=index.d.ts.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/index.d.ts.map b/node_modules/mkdirp/dist/cjs/src/index.d.ts.map
      new file mode 100644
      index 00000000..0e915bbc
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/index.d.ts.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAW,MAAM,eAAe,CAAA;AAItD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAG1D,eAAO,MAAM,UAAU,SAAU,MAAM,SAAS,aAAa,kBAM5D,CAAA;AAED,eAAO,MAAM,IAAI,SARgB,MAAM,SAAS,aAAa,kBAQ/B,CAAA;AAC9B,eAAO,MAAM,MAAM;;CAAe,CAAA;AAClC,eAAO,MAAM,UAAU,oHAAmB,CAAA;AAC1C,eAAO,MAAM,MAAM;;CAAe,CAAA;AAClC,eAAO,MAAM,UAAU,kFAAmB,CAAA;AAC1C,eAAO,MAAM,MAAM,UACJ,MAAM,SAAS,aAAa;uBAdV,MAAM,SAAS,aAAa;;;;;;;;;iBAA5B,MAAM,SAAS,aAAa;;;;;;;;;;;;;CAoC5D,CAAA"}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/index.js b/node_modules/mkdirp/dist/cjs/src/index.js
      new file mode 100644
      index 00000000..ab9dc62c
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/index.js
      @@ -0,0 +1,53 @@
      +"use strict";
      +Object.defineProperty(exports, "__esModule", { value: true });
      +exports.mkdirp = exports.nativeSync = exports.native = exports.manualSync = exports.manual = exports.sync = exports.mkdirpSync = exports.useNativeSync = exports.useNative = exports.mkdirpNativeSync = exports.mkdirpNative = exports.mkdirpManualSync = exports.mkdirpManual = void 0;
      +const mkdirp_manual_js_1 = require("./mkdirp-manual.js");
      +const mkdirp_native_js_1 = require("./mkdirp-native.js");
      +const opts_arg_js_1 = require("./opts-arg.js");
      +const path_arg_js_1 = require("./path-arg.js");
      +const use_native_js_1 = require("./use-native.js");
      +/* c8 ignore start */
      +var mkdirp_manual_js_2 = require("./mkdirp-manual.js");
      +Object.defineProperty(exports, "mkdirpManual", { enumerable: true, get: function () { return mkdirp_manual_js_2.mkdirpManual; } });
      +Object.defineProperty(exports, "mkdirpManualSync", { enumerable: true, get: function () { return mkdirp_manual_js_2.mkdirpManualSync; } });
      +var mkdirp_native_js_2 = require("./mkdirp-native.js");
      +Object.defineProperty(exports, "mkdirpNative", { enumerable: true, get: function () { return mkdirp_native_js_2.mkdirpNative; } });
      +Object.defineProperty(exports, "mkdirpNativeSync", { enumerable: true, get: function () { return mkdirp_native_js_2.mkdirpNativeSync; } });
      +var use_native_js_2 = require("./use-native.js");
      +Object.defineProperty(exports, "useNative", { enumerable: true, get: function () { return use_native_js_2.useNative; } });
      +Object.defineProperty(exports, "useNativeSync", { enumerable: true, get: function () { return use_native_js_2.useNativeSync; } });
      +/* c8 ignore stop */
      +const mkdirpSync = (path, opts) => {
      +    path = (0, path_arg_js_1.pathArg)(path);
      +    const resolved = (0, opts_arg_js_1.optsArg)(opts);
      +    return (0, use_native_js_1.useNativeSync)(resolved)
      +        ? (0, mkdirp_native_js_1.mkdirpNativeSync)(path, resolved)
      +        : (0, mkdirp_manual_js_1.mkdirpManualSync)(path, resolved);
      +};
      +exports.mkdirpSync = mkdirpSync;
      +exports.sync = exports.mkdirpSync;
      +exports.manual = mkdirp_manual_js_1.mkdirpManual;
      +exports.manualSync = mkdirp_manual_js_1.mkdirpManualSync;
      +exports.native = mkdirp_native_js_1.mkdirpNative;
      +exports.nativeSync = mkdirp_native_js_1.mkdirpNativeSync;
      +exports.mkdirp = Object.assign(async (path, opts) => {
      +    path = (0, path_arg_js_1.pathArg)(path);
      +    const resolved = (0, opts_arg_js_1.optsArg)(opts);
      +    return (0, use_native_js_1.useNative)(resolved)
      +        ? (0, mkdirp_native_js_1.mkdirpNative)(path, resolved)
      +        : (0, mkdirp_manual_js_1.mkdirpManual)(path, resolved);
      +}, {
      +    mkdirpSync: exports.mkdirpSync,
      +    mkdirpNative: mkdirp_native_js_1.mkdirpNative,
      +    mkdirpNativeSync: mkdirp_native_js_1.mkdirpNativeSync,
      +    mkdirpManual: mkdirp_manual_js_1.mkdirpManual,
      +    mkdirpManualSync: mkdirp_manual_js_1.mkdirpManualSync,
      +    sync: exports.mkdirpSync,
      +    native: mkdirp_native_js_1.mkdirpNative,
      +    nativeSync: mkdirp_native_js_1.mkdirpNativeSync,
      +    manual: mkdirp_manual_js_1.mkdirpManual,
      +    manualSync: mkdirp_manual_js_1.mkdirpManualSync,
      +    useNative: use_native_js_1.useNative,
      +    useNativeSync: use_native_js_1.useNativeSync,
      +});
      +//# sourceMappingURL=index.js.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/index.js.map b/node_modules/mkdirp/dist/cjs/src/index.js.map
      new file mode 100644
      index 00000000..fdb57267
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/index.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":";;;AAAA,yDAAmE;AACnE,yDAAmE;AACnE,+CAAsD;AACtD,+CAAuC;AACvC,mDAA0D;AAC1D,qBAAqB;AACrB,uDAAmE;AAA1D,gHAAA,YAAY,OAAA;AAAE,oHAAA,gBAAgB,OAAA;AACvC,uDAAmE;AAA1D,gHAAA,YAAY,OAAA;AAAE,oHAAA,gBAAgB,OAAA;AACvC,iDAA0D;AAAjD,0GAAA,SAAS,OAAA;AAAE,8GAAA,aAAa,OAAA;AACjC,oBAAoB;AAEb,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,IAAoB,EAAE,EAAE;IAC/D,IAAI,GAAG,IAAA,qBAAO,EAAC,IAAI,CAAC,CAAA;IACpB,MAAM,QAAQ,GAAG,IAAA,qBAAO,EAAC,IAAI,CAAC,CAAA;IAC9B,OAAO,IAAA,6BAAa,EAAC,QAAQ,CAAC;QAC5B,CAAC,CAAC,IAAA,mCAAgB,EAAC,IAAI,EAAE,QAAQ,CAAC;QAClC,CAAC,CAAC,IAAA,mCAAgB,EAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AACtC,CAAC,CAAA;AANY,QAAA,UAAU,cAMtB;AAEY,QAAA,IAAI,GAAG,kBAAU,CAAA;AACjB,QAAA,MAAM,GAAG,+BAAY,CAAA;AACrB,QAAA,UAAU,GAAG,mCAAgB,CAAA;AAC7B,QAAA,MAAM,GAAG,+BAAY,CAAA;AACrB,QAAA,UAAU,GAAG,mCAAgB,CAAA;AAC7B,QAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CACjC,KAAK,EAAE,IAAY,EAAE,IAAoB,EAAE,EAAE;IAC3C,IAAI,GAAG,IAAA,qBAAO,EAAC,IAAI,CAAC,CAAA;IACpB,MAAM,QAAQ,GAAG,IAAA,qBAAO,EAAC,IAAI,CAAC,CAAA;IAC9B,OAAO,IAAA,yBAAS,EAAC,QAAQ,CAAC;QACxB,CAAC,CAAC,IAAA,+BAAY,EAAC,IAAI,EAAE,QAAQ,CAAC;QAC9B,CAAC,CAAC,IAAA,+BAAY,EAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AAClC,CAAC,EACD;IACE,UAAU,EAAV,kBAAU;IACV,YAAY,EAAZ,+BAAY;IACZ,gBAAgB,EAAhB,mCAAgB;IAChB,YAAY,EAAZ,+BAAY;IACZ,gBAAgB,EAAhB,mCAAgB;IAEhB,IAAI,EAAE,kBAAU;IAChB,MAAM,EAAE,+BAAY;IACpB,UAAU,EAAE,mCAAgB;IAC5B,MAAM,EAAE,+BAAY;IACpB,UAAU,EAAE,mCAAgB;IAC5B,SAAS,EAAT,yBAAS;IACT,aAAa,EAAb,6BAAa;CACd,CACF,CAAA","sourcesContent":["import { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'\nimport { mkdirpNative, mkdirpNativeSync } from './mkdirp-native.js'\nimport { MkdirpOptions, optsArg } from './opts-arg.js'\nimport { pathArg } from './path-arg.js'\nimport { useNative, useNativeSync } from './use-native.js'\n/* c8 ignore start */\nexport { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'\nexport { mkdirpNative, mkdirpNativeSync } from './mkdirp-native.js'\nexport { useNative, useNativeSync } from './use-native.js'\n/* c8 ignore stop */\n\nexport const mkdirpSync = (path: string, opts?: MkdirpOptions) => {\n  path = pathArg(path)\n  const resolved = optsArg(opts)\n  return useNativeSync(resolved)\n    ? mkdirpNativeSync(path, resolved)\n    : mkdirpManualSync(path, resolved)\n}\n\nexport const sync = mkdirpSync\nexport const manual = mkdirpManual\nexport const manualSync = mkdirpManualSync\nexport const native = mkdirpNative\nexport const nativeSync = mkdirpNativeSync\nexport const mkdirp = Object.assign(\n  async (path: string, opts?: MkdirpOptions) => {\n    path = pathArg(path)\n    const resolved = optsArg(opts)\n    return useNative(resolved)\n      ? mkdirpNative(path, resolved)\n      : mkdirpManual(path, resolved)\n  },\n  {\n    mkdirpSync,\n    mkdirpNative,\n    mkdirpNativeSync,\n    mkdirpManual,\n    mkdirpManualSync,\n\n    sync: mkdirpSync,\n    native: mkdirpNative,\n    nativeSync: mkdirpNativeSync,\n    manual: mkdirpManual,\n    manualSync: mkdirpManualSync,\n    useNative,\n    useNativeSync,\n  }\n)\n"]}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.d.ts b/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.d.ts
      new file mode 100644
      index 00000000..e49cdf9f
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.d.ts
      @@ -0,0 +1,6 @@
      +import { MkdirpOptions } from './opts-arg.js';
      +export declare const mkdirpManualSync: (path: string, options?: MkdirpOptions, made?: string | undefined | void) => string | undefined | void;
      +export declare const mkdirpManual: ((path: string, options?: MkdirpOptions, made?: string | undefined | void) => Promise) & {
      +    sync: (path: string, options?: MkdirpOptions, made?: string | undefined | void) => string | undefined | void;
      +};
      +//# sourceMappingURL=mkdirp-manual.d.ts.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.d.ts.map b/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.d.ts.map
      new file mode 100644
      index 00000000..9301bab1
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.d.ts.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"mkdirp-manual.d.ts","sourceRoot":"","sources":["../../../src/mkdirp-manual.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAW,MAAM,eAAe,CAAA;AAEtD,eAAO,MAAM,gBAAgB,SACrB,MAAM,YACF,aAAa,SAChB,MAAM,GAAG,SAAS,GAAG,IAAI,KAC/B,MAAM,GAAG,SAAS,GAAG,IAmCvB,CAAA;AAED,eAAO,MAAM,YAAY,UAEf,MAAM,YACF,aAAa,SAChB,MAAM,GAAG,SAAS,GAAG,IAAI,KAC/B,QAAQ,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;iBA7C/B,MAAM,YACF,aAAa,SAChB,MAAM,GAAG,SAAS,GAAG,IAAI,KAC/B,MAAM,GAAG,SAAS,GAAG,IAAI;CAqF3B,CAAA"}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.js b/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.js
      new file mode 100644
      index 00000000..d9bd1d8b
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.js
      @@ -0,0 +1,79 @@
      +"use strict";
      +Object.defineProperty(exports, "__esModule", { value: true });
      +exports.mkdirpManual = exports.mkdirpManualSync = void 0;
      +const path_1 = require("path");
      +const opts_arg_js_1 = require("./opts-arg.js");
      +const mkdirpManualSync = (path, options, made) => {
      +    const parent = (0, path_1.dirname)(path);
      +    const opts = { ...(0, opts_arg_js_1.optsArg)(options), recursive: false };
      +    if (parent === path) {
      +        try {
      +            return opts.mkdirSync(path, opts);
      +        }
      +        catch (er) {
      +            // swallowed by recursive implementation on posix systems
      +            // any other error is a failure
      +            const fer = er;
      +            if (fer && fer.code !== 'EISDIR') {
      +                throw er;
      +            }
      +            return;
      +        }
      +    }
      +    try {
      +        opts.mkdirSync(path, opts);
      +        return made || path;
      +    }
      +    catch (er) {
      +        const fer = er;
      +        if (fer && fer.code === 'ENOENT') {
      +            return (0, exports.mkdirpManualSync)(path, opts, (0, exports.mkdirpManualSync)(parent, opts, made));
      +        }
      +        if (fer && fer.code !== 'EEXIST' && fer && fer.code !== 'EROFS') {
      +            throw er;
      +        }
      +        try {
      +            if (!opts.statSync(path).isDirectory())
      +                throw er;
      +        }
      +        catch (_) {
      +            throw er;
      +        }
      +    }
      +};
      +exports.mkdirpManualSync = mkdirpManualSync;
      +exports.mkdirpManual = Object.assign(async (path, options, made) => {
      +    const opts = (0, opts_arg_js_1.optsArg)(options);
      +    opts.recursive = false;
      +    const parent = (0, path_1.dirname)(path);
      +    if (parent === path) {
      +        return opts.mkdirAsync(path, opts).catch(er => {
      +            // swallowed by recursive implementation on posix systems
      +            // any other error is a failure
      +            const fer = er;
      +            if (fer && fer.code !== 'EISDIR') {
      +                throw er;
      +            }
      +        });
      +    }
      +    return opts.mkdirAsync(path, opts).then(() => made || path, async (er) => {
      +        const fer = er;
      +        if (fer && fer.code === 'ENOENT') {
      +            return (0, exports.mkdirpManual)(parent, opts).then((made) => (0, exports.mkdirpManual)(path, opts, made));
      +        }
      +        if (fer && fer.code !== 'EEXIST' && fer.code !== 'EROFS') {
      +            throw er;
      +        }
      +        return opts.statAsync(path).then(st => {
      +            if (st.isDirectory()) {
      +                return made;
      +            }
      +            else {
      +                throw er;
      +            }
      +        }, () => {
      +            throw er;
      +        });
      +    });
      +}, { sync: exports.mkdirpManualSync });
      +//# sourceMappingURL=mkdirp-manual.js.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.js.map b/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.js.map
      new file mode 100644
      index 00000000..ff7ba24d
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"mkdirp-manual.js","sourceRoot":"","sources":["../../../src/mkdirp-manual.ts"],"names":[],"mappings":";;;AAAA,+BAA8B;AAC9B,+CAAsD;AAE/C,MAAM,gBAAgB,GAAG,CAC9B,IAAY,EACZ,OAAuB,EACvB,IAAgC,EACL,EAAE;IAC7B,MAAM,MAAM,GAAG,IAAA,cAAO,EAAC,IAAI,CAAC,CAAA;IAC5B,MAAM,IAAI,GAAG,EAAE,GAAG,IAAA,qBAAO,EAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;IAEtD,IAAI,MAAM,KAAK,IAAI,EAAE;QACnB,IAAI;YACF,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;SAClC;QAAC,OAAO,EAAE,EAAE;YACX,yDAAyD;YACzD,+BAA+B;YAC/B,MAAM,GAAG,GAAG,EAA2B,CAAA;YACvC,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;gBAChC,MAAM,EAAE,CAAA;aACT;YACD,OAAM;SACP;KACF;IAED,IAAI;QACF,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC1B,OAAO,IAAI,IAAI,IAAI,CAAA;KACpB;IAAC,OAAO,EAAE,EAAE;QACX,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;YAChC,OAAO,IAAA,wBAAgB,EAAC,IAAI,EAAE,IAAI,EAAE,IAAA,wBAAgB,EAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;SAC1E;QACD,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE;YAC/D,MAAM,EAAE,CAAA;SACT;QACD,IAAI;YACF,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE;gBAAE,MAAM,EAAE,CAAA;SACjD;QAAC,OAAO,CAAC,EAAE;YACV,MAAM,EAAE,CAAA;SACT;KACF;AACH,CAAC,CAAA;AAvCY,QAAA,gBAAgB,oBAuC5B;AAEY,QAAA,YAAY,GAAG,MAAM,CAAC,MAAM,CACvC,KAAK,EACH,IAAY,EACZ,OAAuB,EACvB,IAAgC,EACI,EAAE;IACtC,MAAM,IAAI,GAAG,IAAA,qBAAO,EAAC,OAAO,CAAC,CAAA;IAC7B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;IACtB,MAAM,MAAM,GAAG,IAAA,cAAO,EAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,MAAM,KAAK,IAAI,EAAE;QACnB,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;YAC5C,yDAAyD;YACzD,+BAA+B;YAC/B,MAAM,GAAG,GAAG,EAA2B,CAAA;YACvC,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;gBAChC,MAAM,EAAE,CAAA;aACT;QACH,CAAC,CAAC,CAAA;KACH;IAED,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CACrC,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,EAClB,KAAK,EAAC,EAAE,EAAC,EAAE;QACT,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;YAChC,OAAO,IAAA,oBAAY,EAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CACpC,CAAC,IAAgC,EAAE,EAAE,CAAC,IAAA,oBAAY,EAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CACrE,CAAA;SACF;QACD,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE;YACxD,MAAM,EAAE,CAAA;SACT;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAC9B,EAAE,CAAC,EAAE;YACH,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;gBACpB,OAAO,IAAI,CAAA;aACZ;iBAAM;gBACL,MAAM,EAAE,CAAA;aACT;QACH,CAAC,EACD,GAAG,EAAE;YACH,MAAM,EAAE,CAAA;QACV,CAAC,CACF,CAAA;IACH,CAAC,CACF,CAAA;AACH,CAAC,EACD,EAAE,IAAI,EAAE,wBAAgB,EAAE,CAC3B,CAAA","sourcesContent":["import { dirname } from 'path'\nimport { MkdirpOptions, optsArg } from './opts-arg.js'\n\nexport const mkdirpManualSync = (\n  path: string,\n  options?: MkdirpOptions,\n  made?: string | undefined | void\n): string | undefined | void => {\n  const parent = dirname(path)\n  const opts = { ...optsArg(options), recursive: false }\n\n  if (parent === path) {\n    try {\n      return opts.mkdirSync(path, opts)\n    } catch (er) {\n      // swallowed by recursive implementation on posix systems\n      // any other error is a failure\n      const fer = er as NodeJS.ErrnoException\n      if (fer && fer.code !== 'EISDIR') {\n        throw er\n      }\n      return\n    }\n  }\n\n  try {\n    opts.mkdirSync(path, opts)\n    return made || path\n  } catch (er) {\n    const fer = er as NodeJS.ErrnoException\n    if (fer && fer.code === 'ENOENT') {\n      return mkdirpManualSync(path, opts, mkdirpManualSync(parent, opts, made))\n    }\n    if (fer && fer.code !== 'EEXIST' && fer && fer.code !== 'EROFS') {\n      throw er\n    }\n    try {\n      if (!opts.statSync(path).isDirectory()) throw er\n    } catch (_) {\n      throw er\n    }\n  }\n}\n\nexport const mkdirpManual = Object.assign(\n  async (\n    path: string,\n    options?: MkdirpOptions,\n    made?: string | undefined | void\n  ): Promise => {\n    const opts = optsArg(options)\n    opts.recursive = false\n    const parent = dirname(path)\n    if (parent === path) {\n      return opts.mkdirAsync(path, opts).catch(er => {\n        // swallowed by recursive implementation on posix systems\n        // any other error is a failure\n        const fer = er as NodeJS.ErrnoException\n        if (fer && fer.code !== 'EISDIR') {\n          throw er\n        }\n      })\n    }\n\n    return opts.mkdirAsync(path, opts).then(\n      () => made || path,\n      async er => {\n        const fer = er as NodeJS.ErrnoException\n        if (fer && fer.code === 'ENOENT') {\n          return mkdirpManual(parent, opts).then(\n            (made?: string | undefined | void) => mkdirpManual(path, opts, made)\n          )\n        }\n        if (fer && fer.code !== 'EEXIST' && fer.code !== 'EROFS') {\n          throw er\n        }\n        return opts.statAsync(path).then(\n          st => {\n            if (st.isDirectory()) {\n              return made\n            } else {\n              throw er\n            }\n          },\n          () => {\n            throw er\n          }\n        )\n      }\n    )\n  },\n  { sync: mkdirpManualSync }\n)\n"]}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/mkdirp-native.d.ts b/node_modules/mkdirp/dist/cjs/src/mkdirp-native.d.ts
      new file mode 100644
      index 00000000..28b64814
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/mkdirp-native.d.ts
      @@ -0,0 +1,6 @@
      +import { MkdirpOptions } from './opts-arg.js';
      +export declare const mkdirpNativeSync: (path: string, options?: MkdirpOptions) => string | void | undefined;
      +export declare const mkdirpNative: ((path: string, options?: MkdirpOptions) => Promise) & {
      +    sync: (path: string, options?: MkdirpOptions) => string | void | undefined;
      +};
      +//# sourceMappingURL=mkdirp-native.d.ts.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/mkdirp-native.d.ts.map b/node_modules/mkdirp/dist/cjs/src/mkdirp-native.d.ts.map
      new file mode 100644
      index 00000000..379c0f65
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/mkdirp-native.d.ts.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"mkdirp-native.d.ts","sourceRoot":"","sources":["../../../src/mkdirp-native.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAW,MAAM,eAAe,CAAA;AAEtD,eAAO,MAAM,gBAAgB,SACrB,MAAM,YACF,aAAa,KACtB,MAAM,GAAG,IAAI,GAAG,SAoBlB,CAAA;AAED,eAAO,MAAM,YAAY,UAEf,MAAM,YACF,aAAa,KACtB,QAAQ,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;iBA5B/B,MAAM,YACF,aAAa,KACtB,MAAM,GAAG,IAAI,GAAG,SAAS;CAgD3B,CAAA"}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/mkdirp-native.js b/node_modules/mkdirp/dist/cjs/src/mkdirp-native.js
      new file mode 100644
      index 00000000..9f00567d
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/mkdirp-native.js
      @@ -0,0 +1,50 @@
      +"use strict";
      +Object.defineProperty(exports, "__esModule", { value: true });
      +exports.mkdirpNative = exports.mkdirpNativeSync = void 0;
      +const path_1 = require("path");
      +const find_made_js_1 = require("./find-made.js");
      +const mkdirp_manual_js_1 = require("./mkdirp-manual.js");
      +const opts_arg_js_1 = require("./opts-arg.js");
      +const mkdirpNativeSync = (path, options) => {
      +    const opts = (0, opts_arg_js_1.optsArg)(options);
      +    opts.recursive = true;
      +    const parent = (0, path_1.dirname)(path);
      +    if (parent === path) {
      +        return opts.mkdirSync(path, opts);
      +    }
      +    const made = (0, find_made_js_1.findMadeSync)(opts, path);
      +    try {
      +        opts.mkdirSync(path, opts);
      +        return made;
      +    }
      +    catch (er) {
      +        const fer = er;
      +        if (fer && fer.code === 'ENOENT') {
      +            return (0, mkdirp_manual_js_1.mkdirpManualSync)(path, opts);
      +        }
      +        else {
      +            throw er;
      +        }
      +    }
      +};
      +exports.mkdirpNativeSync = mkdirpNativeSync;
      +exports.mkdirpNative = Object.assign(async (path, options) => {
      +    const opts = { ...(0, opts_arg_js_1.optsArg)(options), recursive: true };
      +    const parent = (0, path_1.dirname)(path);
      +    if (parent === path) {
      +        return await opts.mkdirAsync(path, opts);
      +    }
      +    return (0, find_made_js_1.findMade)(opts, path).then((made) => opts
      +        .mkdirAsync(path, opts)
      +        .then(m => made || m)
      +        .catch(er => {
      +        const fer = er;
      +        if (fer && fer.code === 'ENOENT') {
      +            return (0, mkdirp_manual_js_1.mkdirpManual)(path, opts);
      +        }
      +        else {
      +            throw er;
      +        }
      +    }));
      +}, { sync: exports.mkdirpNativeSync });
      +//# sourceMappingURL=mkdirp-native.js.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/mkdirp-native.js.map b/node_modules/mkdirp/dist/cjs/src/mkdirp-native.js.map
      new file mode 100644
      index 00000000..1f889ee9
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/mkdirp-native.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"mkdirp-native.js","sourceRoot":"","sources":["../../../src/mkdirp-native.ts"],"names":[],"mappings":";;;AAAA,+BAA8B;AAC9B,iDAAuD;AACvD,yDAAmE;AACnE,+CAAsD;AAE/C,MAAM,gBAAgB,GAAG,CAC9B,IAAY,EACZ,OAAuB,EACI,EAAE;IAC7B,MAAM,IAAI,GAAG,IAAA,qBAAO,EAAC,OAAO,CAAC,CAAA;IAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;IACrB,MAAM,MAAM,GAAG,IAAA,cAAO,EAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,MAAM,KAAK,IAAI,EAAE;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;KAClC;IAED,MAAM,IAAI,GAAG,IAAA,2BAAY,EAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IACrC,IAAI;QACF,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC1B,OAAO,IAAI,CAAA;KACZ;IAAC,OAAO,EAAE,EAAE;QACX,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;YAChC,OAAO,IAAA,mCAAgB,EAAC,IAAI,EAAE,IAAI,CAAC,CAAA;SACpC;aAAM;YACL,MAAM,EAAE,CAAA;SACT;KACF;AACH,CAAC,CAAA;AAvBY,QAAA,gBAAgB,oBAuB5B;AAEY,QAAA,YAAY,GAAG,MAAM,CAAC,MAAM,CACvC,KAAK,EACH,IAAY,EACZ,OAAuB,EACa,EAAE;IACtC,MAAM,IAAI,GAAG,EAAE,GAAG,IAAA,qBAAO,EAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;IACrD,MAAM,MAAM,GAAG,IAAA,cAAO,EAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,MAAM,KAAK,IAAI,EAAE;QACnB,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;KACzC;IAED,OAAO,IAAA,uBAAQ,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAyB,EAAE,EAAE,CAC7D,IAAI;SACD,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC;SACtB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC;SACpB,KAAK,CAAC,EAAE,CAAC,EAAE;QACV,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;YAChC,OAAO,IAAA,+BAAY,EAAC,IAAI,EAAE,IAAI,CAAC,CAAA;SAChC;aAAM;YACL,MAAM,EAAE,CAAA;SACT;IACH,CAAC,CAAC,CACL,CAAA;AACH,CAAC,EACD,EAAE,IAAI,EAAE,wBAAgB,EAAE,CAC3B,CAAA","sourcesContent":["import { dirname } from 'path'\nimport { findMade, findMadeSync } from './find-made.js'\nimport { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'\nimport { MkdirpOptions, optsArg } from './opts-arg.js'\n\nexport const mkdirpNativeSync = (\n  path: string,\n  options?: MkdirpOptions\n): string | void | undefined => {\n  const opts = optsArg(options)\n  opts.recursive = true\n  const parent = dirname(path)\n  if (parent === path) {\n    return opts.mkdirSync(path, opts)\n  }\n\n  const made = findMadeSync(opts, path)\n  try {\n    opts.mkdirSync(path, opts)\n    return made\n  } catch (er) {\n    const fer = er as NodeJS.ErrnoException\n    if (fer && fer.code === 'ENOENT') {\n      return mkdirpManualSync(path, opts)\n    } else {\n      throw er\n    }\n  }\n}\n\nexport const mkdirpNative = Object.assign(\n  async (\n    path: string,\n    options?: MkdirpOptions\n  ): Promise => {\n    const opts = { ...optsArg(options), recursive: true }\n    const parent = dirname(path)\n    if (parent === path) {\n      return await opts.mkdirAsync(path, opts)\n    }\n\n    return findMade(opts, path).then((made?: string | undefined) =>\n      opts\n        .mkdirAsync(path, opts)\n        .then(m => made || m)\n        .catch(er => {\n          const fer = er as NodeJS.ErrnoException\n          if (fer && fer.code === 'ENOENT') {\n            return mkdirpManual(path, opts)\n          } else {\n            throw er\n          }\n        })\n    )\n  },\n  { sync: mkdirpNativeSync }\n)\n"]}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/opts-arg.d.ts b/node_modules/mkdirp/dist/cjs/src/opts-arg.d.ts
      new file mode 100644
      index 00000000..73d076b3
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/opts-arg.d.ts
      @@ -0,0 +1,42 @@
      +/// 
      +/// 
      +import { MakeDirectoryOptions, Stats } from 'fs';
      +export interface FsProvider {
      +    stat?: (path: string, callback: (err: NodeJS.ErrnoException | null, stats: Stats) => any) => any;
      +    mkdir?: (path: string, opts: MakeDirectoryOptions & {
      +        recursive?: boolean;
      +    }, callback: (err: NodeJS.ErrnoException | null, made?: string) => any) => any;
      +    statSync?: (path: string) => Stats;
      +    mkdirSync?: (path: string, opts: MakeDirectoryOptions & {
      +        recursive?: boolean;
      +    }) => string | undefined;
      +}
      +interface Options extends FsProvider {
      +    mode?: number | string;
      +    fs?: FsProvider;
      +    mkdirAsync?: (path: string, opts: MakeDirectoryOptions & {
      +        recursive?: boolean;
      +    }) => Promise;
      +    statAsync?: (path: string) => Promise;
      +}
      +export type MkdirpOptions = Options | number | string;
      +export interface MkdirpOptionsResolved {
      +    mode: number;
      +    fs: FsProvider;
      +    mkdirAsync: (path: string, opts: MakeDirectoryOptions & {
      +        recursive?: boolean;
      +    }) => Promise;
      +    statAsync: (path: string) => Promise;
      +    stat: (path: string, callback: (err: NodeJS.ErrnoException | null, stats: Stats) => any) => any;
      +    mkdir: (path: string, opts: MakeDirectoryOptions & {
      +        recursive?: boolean;
      +    }, callback: (err: NodeJS.ErrnoException | null, made?: string) => any) => any;
      +    statSync: (path: string) => Stats;
      +    mkdirSync: (path: string, opts: MakeDirectoryOptions & {
      +        recursive?: boolean;
      +    }) => string | undefined;
      +    recursive?: boolean;
      +}
      +export declare const optsArg: (opts?: MkdirpOptions) => MkdirpOptionsResolved;
      +export {};
      +//# sourceMappingURL=opts-arg.d.ts.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/opts-arg.d.ts.map b/node_modules/mkdirp/dist/cjs/src/opts-arg.d.ts.map
      new file mode 100644
      index 00000000..e5751617
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/opts-arg.d.ts.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"opts-arg.d.ts","sourceRoot":"","sources":["../../../src/opts-arg.ts"],"names":[],"mappings":";;AAAA,OAAO,EACL,oBAAoB,EAIpB,KAAK,EAEN,MAAM,IAAI,CAAA;AAEX,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,CACL,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,GAAG,KAC/D,GAAG,CAAA;IACR,KAAK,CAAC,EAAE,CACN,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,EACpD,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,GAAG,KAChE,GAAG,CAAA;IACR,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAA;IAClC,SAAS,CAAC,EAAE,CACV,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KACjD,MAAM,GAAG,SAAS,CAAA;CACxB;AAED,UAAU,OAAQ,SAAQ,UAAU;IAClC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB,EAAE,CAAC,EAAE,UAAU,CAAA;IACf,UAAU,CAAC,EAAE,CACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KACjD,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAChC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;CAC7C;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;AAErD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,UAAU,CAAA;IACd,UAAU,EAAE,CACV,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KACjD,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAChC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;IAC3C,IAAI,EAAE,CACJ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,GAAG,KAC/D,GAAG,CAAA;IACR,KAAK,EAAE,CACL,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,EACpD,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,GAAG,KAChE,GAAG,CAAA;IACR,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAA;IACjC,SAAS,EAAE,CACT,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KACjD,MAAM,GAAG,SAAS,CAAA;IACvB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,eAAO,MAAM,OAAO,UAAW,aAAa,KAAG,qBA2C9C,CAAA"}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/opts-arg.js b/node_modules/mkdirp/dist/cjs/src/opts-arg.js
      new file mode 100644
      index 00000000..e8f486c0
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/opts-arg.js
      @@ -0,0 +1,38 @@
      +"use strict";
      +Object.defineProperty(exports, "__esModule", { value: true });
      +exports.optsArg = void 0;
      +const fs_1 = require("fs");
      +const optsArg = (opts) => {
      +    if (!opts) {
      +        opts = { mode: 0o777 };
      +    }
      +    else if (typeof opts === 'object') {
      +        opts = { mode: 0o777, ...opts };
      +    }
      +    else if (typeof opts === 'number') {
      +        opts = { mode: opts };
      +    }
      +    else if (typeof opts === 'string') {
      +        opts = { mode: parseInt(opts, 8) };
      +    }
      +    else {
      +        throw new TypeError('invalid options argument');
      +    }
      +    const resolved = opts;
      +    const optsFs = opts.fs || {};
      +    opts.mkdir = opts.mkdir || optsFs.mkdir || fs_1.mkdir;
      +    opts.mkdirAsync = opts.mkdirAsync
      +        ? opts.mkdirAsync
      +        : async (path, options) => {
      +            return new Promise((res, rej) => resolved.mkdir(path, options, (er, made) => er ? rej(er) : res(made)));
      +        };
      +    opts.stat = opts.stat || optsFs.stat || fs_1.stat;
      +    opts.statAsync = opts.statAsync
      +        ? opts.statAsync
      +        : async (path) => new Promise((res, rej) => resolved.stat(path, (err, stats) => (err ? rej(err) : res(stats))));
      +    opts.statSync = opts.statSync || optsFs.statSync || fs_1.statSync;
      +    opts.mkdirSync = opts.mkdirSync || optsFs.mkdirSync || fs_1.mkdirSync;
      +    return resolved;
      +};
      +exports.optsArg = optsArg;
      +//# sourceMappingURL=opts-arg.js.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/opts-arg.js.map b/node_modules/mkdirp/dist/cjs/src/opts-arg.js.map
      new file mode 100644
      index 00000000..fd5590f4
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/opts-arg.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"opts-arg.js","sourceRoot":"","sources":["../../../src/opts-arg.ts"],"names":[],"mappings":";;;AAAA,2BAOW;AAwDJ,MAAM,OAAO,GAAG,CAAC,IAAoB,EAAyB,EAAE;IACrE,IAAI,CAAC,IAAI,EAAE;QACT,IAAI,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;KACvB;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QACnC,IAAI,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,CAAA;KAChC;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QACnC,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;KACtB;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QACnC,IAAI,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAA;KACnC;SAAM;QACL,MAAM,IAAI,SAAS,CAAC,0BAA0B,CAAC,CAAA;KAChD;IAED,MAAM,QAAQ,GAAG,IAA6B,CAAA;IAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,CAAA;IAE5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,UAAK,CAAA;IAEhD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;QAC/B,CAAC,CAAC,IAAI,CAAC,UAAU;QACjB,CAAC,CAAC,KAAK,EACH,IAAY,EACZ,OAAuD,EAC1B,EAAE;YAC/B,OAAO,IAAI,OAAO,CAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAClD,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CACzC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CACzB,CACF,CAAA;QACH,CAAC,CAAA;IAEL,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,SAAI,CAAA;IAC5C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;QAC7B,CAAC,CAAC,IAAI,CAAC,SAAS;QAChB,CAAC,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE,CACrB,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CACvB,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CACnE,CAAA;IAEP,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,IAAI,aAAQ,CAAA;IAC5D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI,cAAS,CAAA;IAEhE,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AA3CY,QAAA,OAAO,WA2CnB","sourcesContent":["import {\n  MakeDirectoryOptions,\n  mkdir,\n  mkdirSync,\n  stat,\n  Stats,\n  statSync,\n} from 'fs'\n\nexport interface FsProvider {\n  stat?: (\n    path: string,\n    callback: (err: NodeJS.ErrnoException | null, stats: Stats) => any\n  ) => any\n  mkdir?: (\n    path: string,\n    opts: MakeDirectoryOptions & { recursive?: boolean },\n    callback: (err: NodeJS.ErrnoException | null, made?: string) => any\n  ) => any\n  statSync?: (path: string) => Stats\n  mkdirSync?: (\n    path: string,\n    opts: MakeDirectoryOptions & { recursive?: boolean }\n  ) => string | undefined\n}\n\ninterface Options extends FsProvider {\n  mode?: number | string\n  fs?: FsProvider\n  mkdirAsync?: (\n    path: string,\n    opts: MakeDirectoryOptions & { recursive?: boolean }\n  ) => Promise\n  statAsync?: (path: string) => Promise\n}\n\nexport type MkdirpOptions = Options | number | string\n\nexport interface MkdirpOptionsResolved {\n  mode: number\n  fs: FsProvider\n  mkdirAsync: (\n    path: string,\n    opts: MakeDirectoryOptions & { recursive?: boolean }\n  ) => Promise\n  statAsync: (path: string) => Promise\n  stat: (\n    path: string,\n    callback: (err: NodeJS.ErrnoException | null, stats: Stats) => any\n  ) => any\n  mkdir: (\n    path: string,\n    opts: MakeDirectoryOptions & { recursive?: boolean },\n    callback: (err: NodeJS.ErrnoException | null, made?: string) => any\n  ) => any\n  statSync: (path: string) => Stats\n  mkdirSync: (\n    path: string,\n    opts: MakeDirectoryOptions & { recursive?: boolean }\n  ) => string | undefined\n  recursive?: boolean\n}\n\nexport const optsArg = (opts?: MkdirpOptions): MkdirpOptionsResolved => {\n  if (!opts) {\n    opts = { mode: 0o777 }\n  } else if (typeof opts === 'object') {\n    opts = { mode: 0o777, ...opts }\n  } else if (typeof opts === 'number') {\n    opts = { mode: opts }\n  } else if (typeof opts === 'string') {\n    opts = { mode: parseInt(opts, 8) }\n  } else {\n    throw new TypeError('invalid options argument')\n  }\n\n  const resolved = opts as MkdirpOptionsResolved\n  const optsFs = opts.fs || {}\n\n  opts.mkdir = opts.mkdir || optsFs.mkdir || mkdir\n\n  opts.mkdirAsync = opts.mkdirAsync\n    ? opts.mkdirAsync\n    : async (\n        path: string,\n        options: MakeDirectoryOptions & { recursive?: boolean }\n      ): Promise => {\n        return new Promise((res, rej) =>\n          resolved.mkdir(path, options, (er, made) =>\n            er ? rej(er) : res(made)\n          )\n        )\n      }\n\n  opts.stat = opts.stat || optsFs.stat || stat\n  opts.statAsync = opts.statAsync\n    ? opts.statAsync\n    : async (path: string) =>\n        new Promise((res, rej) =>\n          resolved.stat(path, (err, stats) => (err ? rej(err) : res(stats)))\n        )\n\n  opts.statSync = opts.statSync || optsFs.statSync || statSync\n  opts.mkdirSync = opts.mkdirSync || optsFs.mkdirSync || mkdirSync\n\n  return resolved\n}\n"]}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/path-arg.d.ts b/node_modules/mkdirp/dist/cjs/src/path-arg.d.ts
      new file mode 100644
      index 00000000..ad0ccfc4
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/path-arg.d.ts
      @@ -0,0 +1,2 @@
      +export declare const pathArg: (path: string) => string;
      +//# sourceMappingURL=path-arg.d.ts.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/path-arg.d.ts.map b/node_modules/mkdirp/dist/cjs/src/path-arg.d.ts.map
      new file mode 100644
      index 00000000..3b52b077
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/path-arg.d.ts.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"path-arg.d.ts","sourceRoot":"","sources":["../../../src/path-arg.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,OAAO,SAAU,MAAM,WAyBnC,CAAA"}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/path-arg.js b/node_modules/mkdirp/dist/cjs/src/path-arg.js
      new file mode 100644
      index 00000000..a6b457f6
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/path-arg.js
      @@ -0,0 +1,28 @@
      +"use strict";
      +Object.defineProperty(exports, "__esModule", { value: true });
      +exports.pathArg = void 0;
      +const platform = process.env.__TESTING_MKDIRP_PLATFORM__ || process.platform;
      +const path_1 = require("path");
      +const pathArg = (path) => {
      +    if (/\0/.test(path)) {
      +        // simulate same failure that node raises
      +        throw Object.assign(new TypeError('path must be a string without null bytes'), {
      +            path,
      +            code: 'ERR_INVALID_ARG_VALUE',
      +        });
      +    }
      +    path = (0, path_1.resolve)(path);
      +    if (platform === 'win32') {
      +        const badWinChars = /[*|"<>?:]/;
      +        const { root } = (0, path_1.parse)(path);
      +        if (badWinChars.test(path.substring(root.length))) {
      +            throw Object.assign(new Error('Illegal characters in path.'), {
      +                path,
      +                code: 'EINVAL',
      +            });
      +        }
      +    }
      +    return path;
      +};
      +exports.pathArg = pathArg;
      +//# sourceMappingURL=path-arg.js.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/path-arg.js.map b/node_modules/mkdirp/dist/cjs/src/path-arg.js.map
      new file mode 100644
      index 00000000..ad3b5d38
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/path-arg.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"path-arg.js","sourceRoot":"","sources":["../../../src/path-arg.ts"],"names":[],"mappings":";;;AAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,OAAO,CAAC,QAAQ,CAAA;AAC5E,+BAAqC;AAC9B,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE;IACtC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACnB,yCAAyC;QACzC,MAAM,MAAM,CAAC,MAAM,CACjB,IAAI,SAAS,CAAC,0CAA0C,CAAC,EACzD;YACE,IAAI;YACJ,IAAI,EAAE,uBAAuB;SAC9B,CACF,CAAA;KACF;IAED,IAAI,GAAG,IAAA,cAAO,EAAC,IAAI,CAAC,CAAA;IACpB,IAAI,QAAQ,KAAK,OAAO,EAAE;QACxB,MAAM,WAAW,GAAG,WAAW,CAAA;QAC/B,MAAM,EAAE,IAAI,EAAE,GAAG,IAAA,YAAK,EAAC,IAAI,CAAC,CAAA;QAC5B,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE;YACjD,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,EAAE;gBAC5D,IAAI;gBACJ,IAAI,EAAE,QAAQ;aACf,CAAC,CAAA;SACH;KACF;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAzBY,QAAA,OAAO,WAyBnB","sourcesContent":["const platform = process.env.__TESTING_MKDIRP_PLATFORM__ || process.platform\nimport { parse, resolve } from 'path'\nexport const pathArg = (path: string) => {\n  if (/\\0/.test(path)) {\n    // simulate same failure that node raises\n    throw Object.assign(\n      new TypeError('path must be a string without null bytes'),\n      {\n        path,\n        code: 'ERR_INVALID_ARG_VALUE',\n      }\n    )\n  }\n\n  path = resolve(path)\n  if (platform === 'win32') {\n    const badWinChars = /[*|\"<>?:]/\n    const { root } = parse(path)\n    if (badWinChars.test(path.substring(root.length))) {\n      throw Object.assign(new Error('Illegal characters in path.'), {\n        path,\n        code: 'EINVAL',\n      })\n    }\n  }\n\n  return path\n}\n"]}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/use-native.d.ts b/node_modules/mkdirp/dist/cjs/src/use-native.d.ts
      new file mode 100644
      index 00000000..1c6cb619
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/use-native.d.ts
      @@ -0,0 +1,6 @@
      +import { MkdirpOptions } from './opts-arg.js';
      +export declare const useNativeSync: (opts?: MkdirpOptions) => boolean;
      +export declare const useNative: ((opts?: MkdirpOptions) => boolean) & {
      +    sync: (opts?: MkdirpOptions) => boolean;
      +};
      +//# sourceMappingURL=use-native.d.ts.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/use-native.d.ts.map b/node_modules/mkdirp/dist/cjs/src/use-native.d.ts.map
      new file mode 100644
      index 00000000..7dc275e3
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/use-native.d.ts.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"use-native.d.ts","sourceRoot":"","sources":["../../../src/use-native.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAW,MAAM,eAAe,CAAA;AAMtD,eAAO,MAAM,aAAa,UAEd,aAAa,YAA0C,CAAA;AAEnE,eAAO,MAAM,SAAS,WAGR,aAAa;kBALf,aAAa;CASxB,CAAA"}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/use-native.js b/node_modules/mkdirp/dist/cjs/src/use-native.js
      new file mode 100644
      index 00000000..550b3452
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/use-native.js
      @@ -0,0 +1,17 @@
      +"use strict";
      +Object.defineProperty(exports, "__esModule", { value: true });
      +exports.useNative = exports.useNativeSync = void 0;
      +const fs_1 = require("fs");
      +const opts_arg_js_1 = require("./opts-arg.js");
      +const version = process.env.__TESTING_MKDIRP_NODE_VERSION__ || process.version;
      +const versArr = version.replace(/^v/, '').split('.');
      +const hasNative = +versArr[0] > 10 || (+versArr[0] === 10 && +versArr[1] >= 12);
      +exports.useNativeSync = !hasNative
      +    ? () => false
      +    : (opts) => (0, opts_arg_js_1.optsArg)(opts).mkdirSync === fs_1.mkdirSync;
      +exports.useNative = Object.assign(!hasNative
      +    ? () => false
      +    : (opts) => (0, opts_arg_js_1.optsArg)(opts).mkdir === fs_1.mkdir, {
      +    sync: exports.useNativeSync,
      +});
      +//# sourceMappingURL=use-native.js.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/cjs/src/use-native.js.map b/node_modules/mkdirp/dist/cjs/src/use-native.js.map
      new file mode 100644
      index 00000000..9a15efeb
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/cjs/src/use-native.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"use-native.js","sourceRoot":"","sources":["../../../src/use-native.ts"],"names":[],"mappings":";;;AAAA,2BAAqC;AACrC,+CAAsD;AAEtD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,OAAO,CAAC,OAAO,CAAA;AAC9E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AACpD,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;AAElE,QAAA,aAAa,GAAG,CAAC,SAAS;IACrC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK;IACb,CAAC,CAAC,CAAC,IAAoB,EAAE,EAAE,CAAC,IAAA,qBAAO,EAAC,IAAI,CAAC,CAAC,SAAS,KAAK,cAAS,CAAA;AAEtD,QAAA,SAAS,GAAG,MAAM,CAAC,MAAM,CACpC,CAAC,SAAS;IACR,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK;IACb,CAAC,CAAC,CAAC,IAAoB,EAAE,EAAE,CAAC,IAAA,qBAAO,EAAC,IAAI,CAAC,CAAC,KAAK,KAAK,UAAK,EAC3D;IACE,IAAI,EAAE,qBAAa;CACpB,CACF,CAAA","sourcesContent":["import { mkdir, mkdirSync } from 'fs'\nimport { MkdirpOptions, optsArg } from './opts-arg.js'\n\nconst version = process.env.__TESTING_MKDIRP_NODE_VERSION__ || process.version\nconst versArr = version.replace(/^v/, '').split('.')\nconst hasNative = +versArr[0] > 10 || (+versArr[0] === 10 && +versArr[1] >= 12)\n\nexport const useNativeSync = !hasNative\n  ? () => false\n  : (opts?: MkdirpOptions) => optsArg(opts).mkdirSync === mkdirSync\n\nexport const useNative = Object.assign(\n  !hasNative\n    ? () => false\n    : (opts?: MkdirpOptions) => optsArg(opts).mkdir === mkdir,\n  {\n    sync: useNativeSync,\n  }\n)\n"]}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/mjs/find-made.d.ts b/node_modules/mkdirp/dist/mjs/find-made.d.ts
      new file mode 100644
      index 00000000..e47794b3
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/find-made.d.ts
      @@ -0,0 +1,4 @@
      +import { MkdirpOptionsResolved } from './opts-arg.js';
      +export declare const findMade: (opts: MkdirpOptionsResolved, parent: string, path?: string) => Promise;
      +export declare const findMadeSync: (opts: MkdirpOptionsResolved, parent: string, path?: string) => undefined | string;
      +//# sourceMappingURL=find-made.d.ts.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/mjs/find-made.d.ts.map b/node_modules/mkdirp/dist/mjs/find-made.d.ts.map
      new file mode 100644
      index 00000000..411aad14
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/find-made.d.ts.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"find-made.d.ts","sourceRoot":"","sources":["../../src/find-made.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAErD,eAAO,MAAM,QAAQ,SACb,qBAAqB,UACnB,MAAM,SACP,MAAM,KACZ,QAAQ,SAAS,GAAG,MAAM,CAe5B,CAAA;AAED,eAAO,MAAM,YAAY,SACjB,qBAAqB,UACnB,MAAM,SACP,MAAM,KACZ,SAAS,GAAG,MAad,CAAA"}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/mjs/find-made.js b/node_modules/mkdirp/dist/mjs/find-made.js
      new file mode 100644
      index 00000000..3e72fd59
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/find-made.js
      @@ -0,0 +1,30 @@
      +import { dirname } from 'path';
      +export const findMade = async (opts, parent, path) => {
      +    // we never want the 'made' return value to be a root directory
      +    if (path === parent) {
      +        return;
      +    }
      +    return opts.statAsync(parent).then(st => (st.isDirectory() ? path : undefined), // will fail later
      +    // will fail later
      +    er => {
      +        const fer = er;
      +        return fer && fer.code === 'ENOENT'
      +            ? findMade(opts, dirname(parent), parent)
      +            : undefined;
      +    });
      +};
      +export const findMadeSync = (opts, parent, path) => {
      +    if (path === parent) {
      +        return undefined;
      +    }
      +    try {
      +        return opts.statSync(parent).isDirectory() ? path : undefined;
      +    }
      +    catch (er) {
      +        const fer = er;
      +        return fer && fer.code === 'ENOENT'
      +            ? findMadeSync(opts, dirname(parent), parent)
      +            : undefined;
      +    }
      +};
      +//# sourceMappingURL=find-made.js.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/mjs/find-made.js.map b/node_modules/mkdirp/dist/mjs/find-made.js.map
      new file mode 100644
      index 00000000..7b58089c
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/find-made.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"find-made.js","sourceRoot":"","sources":["../../src/find-made.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAG9B,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,IAA2B,EAC3B,MAAc,EACd,IAAa,EACgB,EAAE;IAC/B,+DAA+D;IAC/D,IAAI,IAAI,KAAK,MAAM,EAAE;QACnB,OAAM;KACP;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAChC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,kBAAkB;IAC/D,AAD6C,kBAAkB;IAC/D,EAAE,CAAC,EAAE;QACH,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YACjC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YACzC,CAAC,CAAC,SAAS,CAAA;IACf,CAAC,CACF,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,IAA2B,EAC3B,MAAc,EACd,IAAa,EACO,EAAE;IACtB,IAAI,IAAI,KAAK,MAAM,EAAE;QACnB,OAAO,SAAS,CAAA;KACjB;IAED,IAAI;QACF,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;KAC9D;IAAC,OAAO,EAAE,EAAE;QACX,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YACjC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YAC7C,CAAC,CAAC,SAAS,CAAA;KACd;AACH,CAAC,CAAA","sourcesContent":["import { dirname } from 'path'\nimport { MkdirpOptionsResolved } from './opts-arg.js'\n\nexport const findMade = async (\n  opts: MkdirpOptionsResolved,\n  parent: string,\n  path?: string\n): Promise => {\n  // we never want the 'made' return value to be a root directory\n  if (path === parent) {\n    return\n  }\n\n  return opts.statAsync(parent).then(\n    st => (st.isDirectory() ? path : undefined), // will fail later\n    er => {\n      const fer = er as NodeJS.ErrnoException\n      return fer && fer.code === 'ENOENT'\n        ? findMade(opts, dirname(parent), parent)\n        : undefined\n    }\n  )\n}\n\nexport const findMadeSync = (\n  opts: MkdirpOptionsResolved,\n  parent: string,\n  path?: string\n): undefined | string => {\n  if (path === parent) {\n    return undefined\n  }\n\n  try {\n    return opts.statSync(parent).isDirectory() ? path : undefined\n  } catch (er) {\n    const fer = er as NodeJS.ErrnoException\n    return fer && fer.code === 'ENOENT'\n      ? findMadeSync(opts, dirname(parent), parent)\n      : undefined\n  }\n}\n"]}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/mjs/index.d.ts b/node_modules/mkdirp/dist/mjs/index.d.ts
      new file mode 100644
      index 00000000..fc9e43b3
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/index.d.ts
      @@ -0,0 +1,39 @@
      +import { MkdirpOptions } from './opts-arg.js';
      +export { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js';
      +export { mkdirpNative, mkdirpNativeSync } from './mkdirp-native.js';
      +export { useNative, useNativeSync } from './use-native.js';
      +export declare const mkdirpSync: (path: string, opts?: MkdirpOptions) => string | void;
      +export declare const sync: (path: string, opts?: MkdirpOptions) => string | void;
      +export declare const manual: ((path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => Promise) & {
      +    sync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined;
      +};
      +export declare const manualSync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined;
      +export declare const native: ((path: string, options?: MkdirpOptions | undefined) => Promise) & {
      +    sync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined;
      +};
      +export declare const nativeSync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined;
      +export declare const mkdirp: ((path: string, opts?: MkdirpOptions) => Promise) & {
      +    mkdirpSync: (path: string, opts?: MkdirpOptions) => string | void;
      +    mkdirpNative: ((path: string, options?: MkdirpOptions | undefined) => Promise) & {
      +        sync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined;
      +    };
      +    mkdirpNativeSync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined;
      +    mkdirpManual: ((path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => Promise) & {
      +        sync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined;
      +    };
      +    mkdirpManualSync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined;
      +    sync: (path: string, opts?: MkdirpOptions) => string | void;
      +    native: ((path: string, options?: MkdirpOptions | undefined) => Promise) & {
      +        sync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined;
      +    };
      +    nativeSync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined;
      +    manual: ((path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => Promise) & {
      +        sync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined;
      +    };
      +    manualSync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined;
      +    useNative: ((opts?: MkdirpOptions | undefined) => boolean) & {
      +        sync: (opts?: MkdirpOptions | undefined) => boolean;
      +    };
      +    useNativeSync: (opts?: MkdirpOptions | undefined) => boolean;
      +};
      +//# sourceMappingURL=index.d.ts.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/mjs/index.d.ts.map b/node_modules/mkdirp/dist/mjs/index.d.ts.map
      new file mode 100644
      index 00000000..cfcc7808
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/index.d.ts.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAW,MAAM,eAAe,CAAA;AAItD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAG1D,eAAO,MAAM,UAAU,SAAU,MAAM,SAAS,aAAa,kBAM5D,CAAA;AAED,eAAO,MAAM,IAAI,SARgB,MAAM,SAAS,aAAa,kBAQ/B,CAAA;AAC9B,eAAO,MAAM,MAAM;;CAAe,CAAA;AAClC,eAAO,MAAM,UAAU,oHAAmB,CAAA;AAC1C,eAAO,MAAM,MAAM;;CAAe,CAAA;AAClC,eAAO,MAAM,UAAU,kFAAmB,CAAA;AAC1C,eAAO,MAAM,MAAM,UACJ,MAAM,SAAS,aAAa;uBAdV,MAAM,SAAS,aAAa;;;;;;;;;iBAA5B,MAAM,SAAS,aAAa;;;;;;;;;;;;;CAoC5D,CAAA"}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/mjs/index.js b/node_modules/mkdirp/dist/mjs/index.js
      new file mode 100644
      index 00000000..0217ecc8
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/index.js
      @@ -0,0 +1,43 @@
      +import { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js';
      +import { mkdirpNative, mkdirpNativeSync } from './mkdirp-native.js';
      +import { optsArg } from './opts-arg.js';
      +import { pathArg } from './path-arg.js';
      +import { useNative, useNativeSync } from './use-native.js';
      +/* c8 ignore start */
      +export { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js';
      +export { mkdirpNative, mkdirpNativeSync } from './mkdirp-native.js';
      +export { useNative, useNativeSync } from './use-native.js';
      +/* c8 ignore stop */
      +export const mkdirpSync = (path, opts) => {
      +    path = pathArg(path);
      +    const resolved = optsArg(opts);
      +    return useNativeSync(resolved)
      +        ? mkdirpNativeSync(path, resolved)
      +        : mkdirpManualSync(path, resolved);
      +};
      +export const sync = mkdirpSync;
      +export const manual = mkdirpManual;
      +export const manualSync = mkdirpManualSync;
      +export const native = mkdirpNative;
      +export const nativeSync = mkdirpNativeSync;
      +export const mkdirp = Object.assign(async (path, opts) => {
      +    path = pathArg(path);
      +    const resolved = optsArg(opts);
      +    return useNative(resolved)
      +        ? mkdirpNative(path, resolved)
      +        : mkdirpManual(path, resolved);
      +}, {
      +    mkdirpSync,
      +    mkdirpNative,
      +    mkdirpNativeSync,
      +    mkdirpManual,
      +    mkdirpManualSync,
      +    sync: mkdirpSync,
      +    native: mkdirpNative,
      +    nativeSync: mkdirpNativeSync,
      +    manual: mkdirpManual,
      +    manualSync: mkdirpManualSync,
      +    useNative,
      +    useNativeSync,
      +});
      +//# sourceMappingURL=index.js.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/mjs/index.js.map b/node_modules/mkdirp/dist/mjs/index.js.map
      new file mode 100644
      index 00000000..47a8133a
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/index.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAiB,OAAO,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC1D,qBAAqB;AACrB,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC1D,oBAAoB;AAEpB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,IAAoB,EAAE,EAAE;IAC/D,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpB,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9B,OAAO,aAAa,CAAC,QAAQ,CAAC;QAC5B,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC;QAClC,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AACtC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,UAAU,CAAA;AAC9B,MAAM,CAAC,MAAM,MAAM,GAAG,YAAY,CAAA;AAClC,MAAM,CAAC,MAAM,UAAU,GAAG,gBAAgB,CAAA;AAC1C,MAAM,CAAC,MAAM,MAAM,GAAG,YAAY,CAAA;AAClC,MAAM,CAAC,MAAM,UAAU,GAAG,gBAAgB,CAAA;AAC1C,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CACjC,KAAK,EAAE,IAAY,EAAE,IAAoB,EAAE,EAAE;IAC3C,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpB,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9B,OAAO,SAAS,CAAC,QAAQ,CAAC;QACxB,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC;QAC9B,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AAClC,CAAC,EACD;IACE,UAAU;IACV,YAAY;IACZ,gBAAgB;IAChB,YAAY;IACZ,gBAAgB;IAEhB,IAAI,EAAE,UAAU;IAChB,MAAM,EAAE,YAAY;IACpB,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,YAAY;IACpB,UAAU,EAAE,gBAAgB;IAC5B,SAAS;IACT,aAAa;CACd,CACF,CAAA","sourcesContent":["import { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'\nimport { mkdirpNative, mkdirpNativeSync } from './mkdirp-native.js'\nimport { MkdirpOptions, optsArg } from './opts-arg.js'\nimport { pathArg } from './path-arg.js'\nimport { useNative, useNativeSync } from './use-native.js'\n/* c8 ignore start */\nexport { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'\nexport { mkdirpNative, mkdirpNativeSync } from './mkdirp-native.js'\nexport { useNative, useNativeSync } from './use-native.js'\n/* c8 ignore stop */\n\nexport const mkdirpSync = (path: string, opts?: MkdirpOptions) => {\n  path = pathArg(path)\n  const resolved = optsArg(opts)\n  return useNativeSync(resolved)\n    ? mkdirpNativeSync(path, resolved)\n    : mkdirpManualSync(path, resolved)\n}\n\nexport const sync = mkdirpSync\nexport const manual = mkdirpManual\nexport const manualSync = mkdirpManualSync\nexport const native = mkdirpNative\nexport const nativeSync = mkdirpNativeSync\nexport const mkdirp = Object.assign(\n  async (path: string, opts?: MkdirpOptions) => {\n    path = pathArg(path)\n    const resolved = optsArg(opts)\n    return useNative(resolved)\n      ? mkdirpNative(path, resolved)\n      : mkdirpManual(path, resolved)\n  },\n  {\n    mkdirpSync,\n    mkdirpNative,\n    mkdirpNativeSync,\n    mkdirpManual,\n    mkdirpManualSync,\n\n    sync: mkdirpSync,\n    native: mkdirpNative,\n    nativeSync: mkdirpNativeSync,\n    manual: mkdirpManual,\n    manualSync: mkdirpManualSync,\n    useNative,\n    useNativeSync,\n  }\n)\n"]}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/mjs/mkdirp-manual.d.ts b/node_modules/mkdirp/dist/mjs/mkdirp-manual.d.ts
      new file mode 100644
      index 00000000..e49cdf9f
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/mkdirp-manual.d.ts
      @@ -0,0 +1,6 @@
      +import { MkdirpOptions } from './opts-arg.js';
      +export declare const mkdirpManualSync: (path: string, options?: MkdirpOptions, made?: string | undefined | void) => string | undefined | void;
      +export declare const mkdirpManual: ((path: string, options?: MkdirpOptions, made?: string | undefined | void) => Promise) & {
      +    sync: (path: string, options?: MkdirpOptions, made?: string | undefined | void) => string | undefined | void;
      +};
      +//# sourceMappingURL=mkdirp-manual.d.ts.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/mjs/mkdirp-manual.d.ts.map b/node_modules/mkdirp/dist/mjs/mkdirp-manual.d.ts.map
      new file mode 100644
      index 00000000..ae7f243d
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/mkdirp-manual.d.ts.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"mkdirp-manual.d.ts","sourceRoot":"","sources":["../../src/mkdirp-manual.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAW,MAAM,eAAe,CAAA;AAEtD,eAAO,MAAM,gBAAgB,SACrB,MAAM,YACF,aAAa,SAChB,MAAM,GAAG,SAAS,GAAG,IAAI,KAC/B,MAAM,GAAG,SAAS,GAAG,IAmCvB,CAAA;AAED,eAAO,MAAM,YAAY,UAEf,MAAM,YACF,aAAa,SAChB,MAAM,GAAG,SAAS,GAAG,IAAI,KAC/B,QAAQ,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;iBA7C/B,MAAM,YACF,aAAa,SAChB,MAAM,GAAG,SAAS,GAAG,IAAI,KAC/B,MAAM,GAAG,SAAS,GAAG,IAAI;CAqF3B,CAAA"}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/mjs/mkdirp-manual.js b/node_modules/mkdirp/dist/mjs/mkdirp-manual.js
      new file mode 100644
      index 00000000..a4d044e0
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/mkdirp-manual.js
      @@ -0,0 +1,75 @@
      +import { dirname } from 'path';
      +import { optsArg } from './opts-arg.js';
      +export const mkdirpManualSync = (path, options, made) => {
      +    const parent = dirname(path);
      +    const opts = { ...optsArg(options), recursive: false };
      +    if (parent === path) {
      +        try {
      +            return opts.mkdirSync(path, opts);
      +        }
      +        catch (er) {
      +            // swallowed by recursive implementation on posix systems
      +            // any other error is a failure
      +            const fer = er;
      +            if (fer && fer.code !== 'EISDIR') {
      +                throw er;
      +            }
      +            return;
      +        }
      +    }
      +    try {
      +        opts.mkdirSync(path, opts);
      +        return made || path;
      +    }
      +    catch (er) {
      +        const fer = er;
      +        if (fer && fer.code === 'ENOENT') {
      +            return mkdirpManualSync(path, opts, mkdirpManualSync(parent, opts, made));
      +        }
      +        if (fer && fer.code !== 'EEXIST' && fer && fer.code !== 'EROFS') {
      +            throw er;
      +        }
      +        try {
      +            if (!opts.statSync(path).isDirectory())
      +                throw er;
      +        }
      +        catch (_) {
      +            throw er;
      +        }
      +    }
      +};
      +export const mkdirpManual = Object.assign(async (path, options, made) => {
      +    const opts = optsArg(options);
      +    opts.recursive = false;
      +    const parent = dirname(path);
      +    if (parent === path) {
      +        return opts.mkdirAsync(path, opts).catch(er => {
      +            // swallowed by recursive implementation on posix systems
      +            // any other error is a failure
      +            const fer = er;
      +            if (fer && fer.code !== 'EISDIR') {
      +                throw er;
      +            }
      +        });
      +    }
      +    return opts.mkdirAsync(path, opts).then(() => made || path, async (er) => {
      +        const fer = er;
      +        if (fer && fer.code === 'ENOENT') {
      +            return mkdirpManual(parent, opts).then((made) => mkdirpManual(path, opts, made));
      +        }
      +        if (fer && fer.code !== 'EEXIST' && fer.code !== 'EROFS') {
      +            throw er;
      +        }
      +        return opts.statAsync(path).then(st => {
      +            if (st.isDirectory()) {
      +                return made;
      +            }
      +            else {
      +                throw er;
      +            }
      +        }, () => {
      +            throw er;
      +        });
      +    });
      +}, { sync: mkdirpManualSync });
      +//# sourceMappingURL=mkdirp-manual.js.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/mjs/mkdirp-manual.js.map b/node_modules/mkdirp/dist/mjs/mkdirp-manual.js.map
      new file mode 100644
      index 00000000..29eab250
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/mkdirp-manual.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"mkdirp-manual.js","sourceRoot":"","sources":["../../src/mkdirp-manual.ts"],"names":[],"mappings":"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","sourcesContent":["import { dirname } from 'path'\nimport { MkdirpOptions, optsArg } from './opts-arg.js'\n\nexport const mkdirpManualSync = (\n  path: string,\n  options?: MkdirpOptions,\n  made?: string | undefined | void\n): string | undefined | void => {\n  const parent = dirname(path)\n  const opts = { ...optsArg(options), recursive: false }\n\n  if (parent === path) {\n    try {\n      return opts.mkdirSync(path, opts)\n    } catch (er) {\n      // swallowed by recursive implementation on posix systems\n      // any other error is a failure\n      const fer = er as NodeJS.ErrnoException\n      if (fer && fer.code !== 'EISDIR') {\n        throw er\n      }\n      return\n    }\n  }\n\n  try {\n    opts.mkdirSync(path, opts)\n    return made || path\n  } catch (er) {\n    const fer = er as NodeJS.ErrnoException\n    if (fer && fer.code === 'ENOENT') {\n      return mkdirpManualSync(path, opts, mkdirpManualSync(parent, opts, made))\n    }\n    if (fer && fer.code !== 'EEXIST' && fer && fer.code !== 'EROFS') {\n      throw er\n    }\n    try {\n      if (!opts.statSync(path).isDirectory()) throw er\n    } catch (_) {\n      throw er\n    }\n  }\n}\n\nexport const mkdirpManual = Object.assign(\n  async (\n    path: string,\n    options?: MkdirpOptions,\n    made?: string | undefined | void\n  ): Promise => {\n    const opts = optsArg(options)\n    opts.recursive = false\n    const parent = dirname(path)\n    if (parent === path) {\n      return opts.mkdirAsync(path, opts).catch(er => {\n        // swallowed by recursive implementation on posix systems\n        // any other error is a failure\n        const fer = er as NodeJS.ErrnoException\n        if (fer && fer.code !== 'EISDIR') {\n          throw er\n        }\n      })\n    }\n\n    return opts.mkdirAsync(path, opts).then(\n      () => made || path,\n      async er => {\n        const fer = er as NodeJS.ErrnoException\n        if (fer && fer.code === 'ENOENT') {\n          return mkdirpManual(parent, opts).then(\n            (made?: string | undefined | void) => mkdirpManual(path, opts, made)\n          )\n        }\n        if (fer && fer.code !== 'EEXIST' && fer.code !== 'EROFS') {\n          throw er\n        }\n        return opts.statAsync(path).then(\n          st => {\n            if (st.isDirectory()) {\n              return made\n            } else {\n              throw er\n            }\n          },\n          () => {\n            throw er\n          }\n        )\n      }\n    )\n  },\n  { sync: mkdirpManualSync }\n)\n"]}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/mjs/mkdirp-native.d.ts b/node_modules/mkdirp/dist/mjs/mkdirp-native.d.ts
      new file mode 100644
      index 00000000..28b64814
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/mkdirp-native.d.ts
      @@ -0,0 +1,6 @@
      +import { MkdirpOptions } from './opts-arg.js';
      +export declare const mkdirpNativeSync: (path: string, options?: MkdirpOptions) => string | void | undefined;
      +export declare const mkdirpNative: ((path: string, options?: MkdirpOptions) => Promise) & {
      +    sync: (path: string, options?: MkdirpOptions) => string | void | undefined;
      +};
      +//# sourceMappingURL=mkdirp-native.d.ts.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/mjs/mkdirp-native.d.ts.map b/node_modules/mkdirp/dist/mjs/mkdirp-native.d.ts.map
      new file mode 100644
      index 00000000..517dfabe
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/mkdirp-native.d.ts.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"mkdirp-native.d.ts","sourceRoot":"","sources":["../../src/mkdirp-native.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAW,MAAM,eAAe,CAAA;AAEtD,eAAO,MAAM,gBAAgB,SACrB,MAAM,YACF,aAAa,KACtB,MAAM,GAAG,IAAI,GAAG,SAoBlB,CAAA;AAED,eAAO,MAAM,YAAY,UAEf,MAAM,YACF,aAAa,KACtB,QAAQ,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;iBA5B/B,MAAM,YACF,aAAa,KACtB,MAAM,GAAG,IAAI,GAAG,SAAS;CAgD3B,CAAA"}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/mjs/mkdirp-native.js b/node_modules/mkdirp/dist/mjs/mkdirp-native.js
      new file mode 100644
      index 00000000..99d10a54
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/mkdirp-native.js
      @@ -0,0 +1,46 @@
      +import { dirname } from 'path';
      +import { findMade, findMadeSync } from './find-made.js';
      +import { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js';
      +import { optsArg } from './opts-arg.js';
      +export const mkdirpNativeSync = (path, options) => {
      +    const opts = optsArg(options);
      +    opts.recursive = true;
      +    const parent = dirname(path);
      +    if (parent === path) {
      +        return opts.mkdirSync(path, opts);
      +    }
      +    const made = findMadeSync(opts, path);
      +    try {
      +        opts.mkdirSync(path, opts);
      +        return made;
      +    }
      +    catch (er) {
      +        const fer = er;
      +        if (fer && fer.code === 'ENOENT') {
      +            return mkdirpManualSync(path, opts);
      +        }
      +        else {
      +            throw er;
      +        }
      +    }
      +};
      +export const mkdirpNative = Object.assign(async (path, options) => {
      +    const opts = { ...optsArg(options), recursive: true };
      +    const parent = dirname(path);
      +    if (parent === path) {
      +        return await opts.mkdirAsync(path, opts);
      +    }
      +    return findMade(opts, path).then((made) => opts
      +        .mkdirAsync(path, opts)
      +        .then(m => made || m)
      +        .catch(er => {
      +        const fer = er;
      +        if (fer && fer.code === 'ENOENT') {
      +            return mkdirpManual(path, opts);
      +        }
      +        else {
      +            throw er;
      +        }
      +    }));
      +}, { sync: mkdirpNativeSync });
      +//# sourceMappingURL=mkdirp-native.js.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/mjs/mkdirp-native.js.map b/node_modules/mkdirp/dist/mjs/mkdirp-native.js.map
      new file mode 100644
      index 00000000..27de32d9
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/mkdirp-native.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"mkdirp-native.js","sourceRoot":"","sources":["../../src/mkdirp-native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAC9B,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAiB,OAAO,EAAE,MAAM,eAAe,CAAA;AAEtD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,IAAY,EACZ,OAAuB,EACI,EAAE;IAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;IACrB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,MAAM,KAAK,IAAI,EAAE;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;KAClC;IAED,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IACrC,IAAI;QACF,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC1B,OAAO,IAAI,CAAA;KACZ;IAAC,OAAO,EAAE,EAAE;QACX,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;YAChC,OAAO,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;SACpC;aAAM;YACL,MAAM,EAAE,CAAA;SACT;KACF;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CACvC,KAAK,EACH,IAAY,EACZ,OAAuB,EACa,EAAE;IACtC,MAAM,IAAI,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;IACrD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,MAAM,KAAK,IAAI,EAAE;QACnB,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;KACzC;IAED,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAyB,EAAE,EAAE,CAC7D,IAAI;SACD,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC;SACtB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC;SACpB,KAAK,CAAC,EAAE,CAAC,EAAE;QACV,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;YAChC,OAAO,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;SAChC;aAAM;YACL,MAAM,EAAE,CAAA;SACT;IACH,CAAC,CAAC,CACL,CAAA;AACH,CAAC,EACD,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAC3B,CAAA","sourcesContent":["import { dirname } from 'path'\nimport { findMade, findMadeSync } from './find-made.js'\nimport { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'\nimport { MkdirpOptions, optsArg } from './opts-arg.js'\n\nexport const mkdirpNativeSync = (\n  path: string,\n  options?: MkdirpOptions\n): string | void | undefined => {\n  const opts = optsArg(options)\n  opts.recursive = true\n  const parent = dirname(path)\n  if (parent === path) {\n    return opts.mkdirSync(path, opts)\n  }\n\n  const made = findMadeSync(opts, path)\n  try {\n    opts.mkdirSync(path, opts)\n    return made\n  } catch (er) {\n    const fer = er as NodeJS.ErrnoException\n    if (fer && fer.code === 'ENOENT') {\n      return mkdirpManualSync(path, opts)\n    } else {\n      throw er\n    }\n  }\n}\n\nexport const mkdirpNative = Object.assign(\n  async (\n    path: string,\n    options?: MkdirpOptions\n  ): Promise => {\n    const opts = { ...optsArg(options), recursive: true }\n    const parent = dirname(path)\n    if (parent === path) {\n      return await opts.mkdirAsync(path, opts)\n    }\n\n    return findMade(opts, path).then((made?: string | undefined) =>\n      opts\n        .mkdirAsync(path, opts)\n        .then(m => made || m)\n        .catch(er => {\n          const fer = er as NodeJS.ErrnoException\n          if (fer && fer.code === 'ENOENT') {\n            return mkdirpManual(path, opts)\n          } else {\n            throw er\n          }\n        })\n    )\n  },\n  { sync: mkdirpNativeSync }\n)\n"]}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/mjs/opts-arg.d.ts b/node_modules/mkdirp/dist/mjs/opts-arg.d.ts
      new file mode 100644
      index 00000000..73d076b3
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/opts-arg.d.ts
      @@ -0,0 +1,42 @@
      +/// 
      +/// 
      +import { MakeDirectoryOptions, Stats } from 'fs';
      +export interface FsProvider {
      +    stat?: (path: string, callback: (err: NodeJS.ErrnoException | null, stats: Stats) => any) => any;
      +    mkdir?: (path: string, opts: MakeDirectoryOptions & {
      +        recursive?: boolean;
      +    }, callback: (err: NodeJS.ErrnoException | null, made?: string) => any) => any;
      +    statSync?: (path: string) => Stats;
      +    mkdirSync?: (path: string, opts: MakeDirectoryOptions & {
      +        recursive?: boolean;
      +    }) => string | undefined;
      +}
      +interface Options extends FsProvider {
      +    mode?: number | string;
      +    fs?: FsProvider;
      +    mkdirAsync?: (path: string, opts: MakeDirectoryOptions & {
      +        recursive?: boolean;
      +    }) => Promise;
      +    statAsync?: (path: string) => Promise;
      +}
      +export type MkdirpOptions = Options | number | string;
      +export interface MkdirpOptionsResolved {
      +    mode: number;
      +    fs: FsProvider;
      +    mkdirAsync: (path: string, opts: MakeDirectoryOptions & {
      +        recursive?: boolean;
      +    }) => Promise;
      +    statAsync: (path: string) => Promise;
      +    stat: (path: string, callback: (err: NodeJS.ErrnoException | null, stats: Stats) => any) => any;
      +    mkdir: (path: string, opts: MakeDirectoryOptions & {
      +        recursive?: boolean;
      +    }, callback: (err: NodeJS.ErrnoException | null, made?: string) => any) => any;
      +    statSync: (path: string) => Stats;
      +    mkdirSync: (path: string, opts: MakeDirectoryOptions & {
      +        recursive?: boolean;
      +    }) => string | undefined;
      +    recursive?: boolean;
      +}
      +export declare const optsArg: (opts?: MkdirpOptions) => MkdirpOptionsResolved;
      +export {};
      +//# sourceMappingURL=opts-arg.d.ts.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/mjs/opts-arg.d.ts.map b/node_modules/mkdirp/dist/mjs/opts-arg.d.ts.map
      new file mode 100644
      index 00000000..717deb5f
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/opts-arg.d.ts.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"opts-arg.d.ts","sourceRoot":"","sources":["../../src/opts-arg.ts"],"names":[],"mappings":";;AAAA,OAAO,EACL,oBAAoB,EAIpB,KAAK,EAEN,MAAM,IAAI,CAAA;AAEX,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,CACL,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,GAAG,KAC/D,GAAG,CAAA;IACR,KAAK,CAAC,EAAE,CACN,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,EACpD,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,GAAG,KAChE,GAAG,CAAA;IACR,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAA;IAClC,SAAS,CAAC,EAAE,CACV,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KACjD,MAAM,GAAG,SAAS,CAAA;CACxB;AAED,UAAU,OAAQ,SAAQ,UAAU;IAClC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB,EAAE,CAAC,EAAE,UAAU,CAAA;IACf,UAAU,CAAC,EAAE,CACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KACjD,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAChC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;CAC7C;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;AAErD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,UAAU,CAAA;IACd,UAAU,EAAE,CACV,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KACjD,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAChC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;IAC3C,IAAI,EAAE,CACJ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,GAAG,KAC/D,GAAG,CAAA;IACR,KAAK,EAAE,CACL,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,EACpD,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,GAAG,KAChE,GAAG,CAAA;IACR,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAA;IACjC,SAAS,EAAE,CACT,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KACjD,MAAM,GAAG,SAAS,CAAA;IACvB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,eAAO,MAAM,OAAO,UAAW,aAAa,KAAG,qBA2C9C,CAAA"}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/mjs/opts-arg.js b/node_modules/mkdirp/dist/mjs/opts-arg.js
      new file mode 100644
      index 00000000..d47e2927
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/opts-arg.js
      @@ -0,0 +1,34 @@
      +import { mkdir, mkdirSync, stat, statSync, } from 'fs';
      +export const optsArg = (opts) => {
      +    if (!opts) {
      +        opts = { mode: 0o777 };
      +    }
      +    else if (typeof opts === 'object') {
      +        opts = { mode: 0o777, ...opts };
      +    }
      +    else if (typeof opts === 'number') {
      +        opts = { mode: opts };
      +    }
      +    else if (typeof opts === 'string') {
      +        opts = { mode: parseInt(opts, 8) };
      +    }
      +    else {
      +        throw new TypeError('invalid options argument');
      +    }
      +    const resolved = opts;
      +    const optsFs = opts.fs || {};
      +    opts.mkdir = opts.mkdir || optsFs.mkdir || mkdir;
      +    opts.mkdirAsync = opts.mkdirAsync
      +        ? opts.mkdirAsync
      +        : async (path, options) => {
      +            return new Promise((res, rej) => resolved.mkdir(path, options, (er, made) => er ? rej(er) : res(made)));
      +        };
      +    opts.stat = opts.stat || optsFs.stat || stat;
      +    opts.statAsync = opts.statAsync
      +        ? opts.statAsync
      +        : async (path) => new Promise((res, rej) => resolved.stat(path, (err, stats) => (err ? rej(err) : res(stats))));
      +    opts.statSync = opts.statSync || optsFs.statSync || statSync;
      +    opts.mkdirSync = opts.mkdirSync || optsFs.mkdirSync || mkdirSync;
      +    return resolved;
      +};
      +//# sourceMappingURL=opts-arg.js.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/mjs/opts-arg.js.map b/node_modules/mkdirp/dist/mjs/opts-arg.js.map
      new file mode 100644
      index 00000000..663286dc
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/opts-arg.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"opts-arg.js","sourceRoot":"","sources":["../../src/opts-arg.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,EACL,SAAS,EACT,IAAI,EAEJ,QAAQ,GACT,MAAM,IAAI,CAAA;AAwDX,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAoB,EAAyB,EAAE;IACrE,IAAI,CAAC,IAAI,EAAE;QACT,IAAI,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;KACvB;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QACnC,IAAI,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,CAAA;KAChC;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QACnC,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;KACtB;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QACnC,IAAI,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAA;KACnC;SAAM;QACL,MAAM,IAAI,SAAS,CAAC,0BAA0B,CAAC,CAAA;KAChD;IAED,MAAM,QAAQ,GAAG,IAA6B,CAAA;IAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,CAAA;IAE5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,KAAK,CAAA;IAEhD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;QAC/B,CAAC,CAAC,IAAI,CAAC,UAAU;QACjB,CAAC,CAAC,KAAK,EACH,IAAY,EACZ,OAAuD,EAC1B,EAAE;YAC/B,OAAO,IAAI,OAAO,CAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAClD,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CACzC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CACzB,CACF,CAAA;QACH,CAAC,CAAA;IAEL,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,IAAI,CAAA;IAC5C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;QAC7B,CAAC,CAAC,IAAI,CAAC,SAAS;QAChB,CAAC,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE,CACrB,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CACvB,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CACnE,CAAA;IAEP,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAA;IAC5D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI,SAAS,CAAA;IAEhE,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA","sourcesContent":["import {\n  MakeDirectoryOptions,\n  mkdir,\n  mkdirSync,\n  stat,\n  Stats,\n  statSync,\n} from 'fs'\n\nexport interface FsProvider {\n  stat?: (\n    path: string,\n    callback: (err: NodeJS.ErrnoException | null, stats: Stats) => any\n  ) => any\n  mkdir?: (\n    path: string,\n    opts: MakeDirectoryOptions & { recursive?: boolean },\n    callback: (err: NodeJS.ErrnoException | null, made?: string) => any\n  ) => any\n  statSync?: (path: string) => Stats\n  mkdirSync?: (\n    path: string,\n    opts: MakeDirectoryOptions & { recursive?: boolean }\n  ) => string | undefined\n}\n\ninterface Options extends FsProvider {\n  mode?: number | string\n  fs?: FsProvider\n  mkdirAsync?: (\n    path: string,\n    opts: MakeDirectoryOptions & { recursive?: boolean }\n  ) => Promise\n  statAsync?: (path: string) => Promise\n}\n\nexport type MkdirpOptions = Options | number | string\n\nexport interface MkdirpOptionsResolved {\n  mode: number\n  fs: FsProvider\n  mkdirAsync: (\n    path: string,\n    opts: MakeDirectoryOptions & { recursive?: boolean }\n  ) => Promise\n  statAsync: (path: string) => Promise\n  stat: (\n    path: string,\n    callback: (err: NodeJS.ErrnoException | null, stats: Stats) => any\n  ) => any\n  mkdir: (\n    path: string,\n    opts: MakeDirectoryOptions & { recursive?: boolean },\n    callback: (err: NodeJS.ErrnoException | null, made?: string) => any\n  ) => any\n  statSync: (path: string) => Stats\n  mkdirSync: (\n    path: string,\n    opts: MakeDirectoryOptions & { recursive?: boolean }\n  ) => string | undefined\n  recursive?: boolean\n}\n\nexport const optsArg = (opts?: MkdirpOptions): MkdirpOptionsResolved => {\n  if (!opts) {\n    opts = { mode: 0o777 }\n  } else if (typeof opts === 'object') {\n    opts = { mode: 0o777, ...opts }\n  } else if (typeof opts === 'number') {\n    opts = { mode: opts }\n  } else if (typeof opts === 'string') {\n    opts = { mode: parseInt(opts, 8) }\n  } else {\n    throw new TypeError('invalid options argument')\n  }\n\n  const resolved = opts as MkdirpOptionsResolved\n  const optsFs = opts.fs || {}\n\n  opts.mkdir = opts.mkdir || optsFs.mkdir || mkdir\n\n  opts.mkdirAsync = opts.mkdirAsync\n    ? opts.mkdirAsync\n    : async (\n        path: string,\n        options: MakeDirectoryOptions & { recursive?: boolean }\n      ): Promise => {\n        return new Promise((res, rej) =>\n          resolved.mkdir(path, options, (er, made) =>\n            er ? rej(er) : res(made)\n          )\n        )\n      }\n\n  opts.stat = opts.stat || optsFs.stat || stat\n  opts.statAsync = opts.statAsync\n    ? opts.statAsync\n    : async (path: string) =>\n        new Promise((res, rej) =>\n          resolved.stat(path, (err, stats) => (err ? rej(err) : res(stats)))\n        )\n\n  opts.statSync = opts.statSync || optsFs.statSync || statSync\n  opts.mkdirSync = opts.mkdirSync || optsFs.mkdirSync || mkdirSync\n\n  return resolved\n}\n"]}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/mjs/package.json b/node_modules/mkdirp/dist/mjs/package.json
      new file mode 100644
      index 00000000..3dbc1ca5
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/package.json
      @@ -0,0 +1,3 @@
      +{
      +  "type": "module"
      +}
      diff --git a/node_modules/mkdirp/dist/mjs/path-arg.d.ts b/node_modules/mkdirp/dist/mjs/path-arg.d.ts
      new file mode 100644
      index 00000000..ad0ccfc4
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/path-arg.d.ts
      @@ -0,0 +1,2 @@
      +export declare const pathArg: (path: string) => string;
      +//# sourceMappingURL=path-arg.d.ts.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/mjs/path-arg.d.ts.map b/node_modules/mkdirp/dist/mjs/path-arg.d.ts.map
      new file mode 100644
      index 00000000..801799e7
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/path-arg.d.ts.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"path-arg.d.ts","sourceRoot":"","sources":["../../src/path-arg.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,OAAO,SAAU,MAAM,WAyBnC,CAAA"}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/mjs/path-arg.js b/node_modules/mkdirp/dist/mjs/path-arg.js
      new file mode 100644
      index 00000000..03539cc5
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/path-arg.js
      @@ -0,0 +1,24 @@
      +const platform = process.env.__TESTING_MKDIRP_PLATFORM__ || process.platform;
      +import { parse, resolve } from 'path';
      +export const pathArg = (path) => {
      +    if (/\0/.test(path)) {
      +        // simulate same failure that node raises
      +        throw Object.assign(new TypeError('path must be a string without null bytes'), {
      +            path,
      +            code: 'ERR_INVALID_ARG_VALUE',
      +        });
      +    }
      +    path = resolve(path);
      +    if (platform === 'win32') {
      +        const badWinChars = /[*|"<>?:]/;
      +        const { root } = parse(path);
      +        if (badWinChars.test(path.substring(root.length))) {
      +            throw Object.assign(new Error('Illegal characters in path.'), {
      +                path,
      +                code: 'EINVAL',
      +            });
      +        }
      +    }
      +    return path;
      +};
      +//# sourceMappingURL=path-arg.js.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/mjs/path-arg.js.map b/node_modules/mkdirp/dist/mjs/path-arg.js.map
      new file mode 100644
      index 00000000..43efe1e3
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/path-arg.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"path-arg.js","sourceRoot":"","sources":["../../src/path-arg.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,OAAO,CAAC,QAAQ,CAAA;AAC5E,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AACrC,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE;IACtC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACnB,yCAAyC;QACzC,MAAM,MAAM,CAAC,MAAM,CACjB,IAAI,SAAS,CAAC,0CAA0C,CAAC,EACzD;YACE,IAAI;YACJ,IAAI,EAAE,uBAAuB;SAC9B,CACF,CAAA;KACF;IAED,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpB,IAAI,QAAQ,KAAK,OAAO,EAAE;QACxB,MAAM,WAAW,GAAG,WAAW,CAAA;QAC/B,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAA;QAC5B,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE;YACjD,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,EAAE;gBAC5D,IAAI;gBACJ,IAAI,EAAE,QAAQ;aACf,CAAC,CAAA;SACH;KACF;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA","sourcesContent":["const platform = process.env.__TESTING_MKDIRP_PLATFORM__ || process.platform\nimport { parse, resolve } from 'path'\nexport const pathArg = (path: string) => {\n  if (/\\0/.test(path)) {\n    // simulate same failure that node raises\n    throw Object.assign(\n      new TypeError('path must be a string without null bytes'),\n      {\n        path,\n        code: 'ERR_INVALID_ARG_VALUE',\n      }\n    )\n  }\n\n  path = resolve(path)\n  if (platform === 'win32') {\n    const badWinChars = /[*|\"<>?:]/\n    const { root } = parse(path)\n    if (badWinChars.test(path.substring(root.length))) {\n      throw Object.assign(new Error('Illegal characters in path.'), {\n        path,\n        code: 'EINVAL',\n      })\n    }\n  }\n\n  return path\n}\n"]}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/mjs/use-native.d.ts b/node_modules/mkdirp/dist/mjs/use-native.d.ts
      new file mode 100644
      index 00000000..1c6cb619
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/use-native.d.ts
      @@ -0,0 +1,6 @@
      +import { MkdirpOptions } from './opts-arg.js';
      +export declare const useNativeSync: (opts?: MkdirpOptions) => boolean;
      +export declare const useNative: ((opts?: MkdirpOptions) => boolean) & {
      +    sync: (opts?: MkdirpOptions) => boolean;
      +};
      +//# sourceMappingURL=use-native.d.ts.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/mjs/use-native.d.ts.map b/node_modules/mkdirp/dist/mjs/use-native.d.ts.map
      new file mode 100644
      index 00000000..e2484228
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/use-native.d.ts.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"use-native.d.ts","sourceRoot":"","sources":["../../src/use-native.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAW,MAAM,eAAe,CAAA;AAMtD,eAAO,MAAM,aAAa,UAEd,aAAa,YAA0C,CAAA;AAEnE,eAAO,MAAM,SAAS,WAGR,aAAa;kBALf,aAAa;CASxB,CAAA"}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/mjs/use-native.js b/node_modules/mkdirp/dist/mjs/use-native.js
      new file mode 100644
      index 00000000..ad209386
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/use-native.js
      @@ -0,0 +1,14 @@
      +import { mkdir, mkdirSync } from 'fs';
      +import { optsArg } from './opts-arg.js';
      +const version = process.env.__TESTING_MKDIRP_NODE_VERSION__ || process.version;
      +const versArr = version.replace(/^v/, '').split('.');
      +const hasNative = +versArr[0] > 10 || (+versArr[0] === 10 && +versArr[1] >= 12);
      +export const useNativeSync = !hasNative
      +    ? () => false
      +    : (opts) => optsArg(opts).mkdirSync === mkdirSync;
      +export const useNative = Object.assign(!hasNative
      +    ? () => false
      +    : (opts) => optsArg(opts).mkdir === mkdir, {
      +    sync: useNativeSync,
      +});
      +//# sourceMappingURL=use-native.js.map
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/dist/mjs/use-native.js.map b/node_modules/mkdirp/dist/mjs/use-native.js.map
      new file mode 100644
      index 00000000..08c616d3
      --- /dev/null
      +++ b/node_modules/mkdirp/dist/mjs/use-native.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"use-native.js","sourceRoot":"","sources":["../../src/use-native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AACrC,OAAO,EAAiB,OAAO,EAAE,MAAM,eAAe,CAAA;AAEtD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,OAAO,CAAC,OAAO,CAAA;AAC9E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AACpD,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;AAE/E,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAS;IACrC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK;IACb,CAAC,CAAC,CAAC,IAAoB,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,CAAA;AAEnE,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CACpC,CAAC,SAAS;IACR,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK;IACb,CAAC,CAAC,CAAC,IAAoB,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,EAC3D;IACE,IAAI,EAAE,aAAa;CACpB,CACF,CAAA","sourcesContent":["import { mkdir, mkdirSync } from 'fs'\nimport { MkdirpOptions, optsArg } from './opts-arg.js'\n\nconst version = process.env.__TESTING_MKDIRP_NODE_VERSION__ || process.version\nconst versArr = version.replace(/^v/, '').split('.')\nconst hasNative = +versArr[0] > 10 || (+versArr[0] === 10 && +versArr[1] >= 12)\n\nexport const useNativeSync = !hasNative\n  ? () => false\n  : (opts?: MkdirpOptions) => optsArg(opts).mkdirSync === mkdirSync\n\nexport const useNative = Object.assign(\n  !hasNative\n    ? () => false\n    : (opts?: MkdirpOptions) => optsArg(opts).mkdir === mkdir,\n  {\n    sync: useNativeSync,\n  }\n)\n"]}
      \ No newline at end of file
      diff --git a/node_modules/mkdirp/package.json b/node_modules/mkdirp/package.json
      new file mode 100644
      index 00000000..f31ac331
      --- /dev/null
      +++ b/node_modules/mkdirp/package.json
      @@ -0,0 +1,91 @@
      +{
      +  "name": "mkdirp",
      +  "description": "Recursively mkdir, like `mkdir -p`",
      +  "version": "3.0.1",
      +  "keywords": [
      +    "mkdir",
      +    "directory",
      +    "make dir",
      +    "make",
      +    "dir",
      +    "recursive",
      +    "native"
      +  ],
      +  "bin": "./dist/cjs/src/bin.js",
      +  "main": "./dist/cjs/src/index.js",
      +  "module": "./dist/mjs/index.js",
      +  "types": "./dist/mjs/index.d.ts",
      +  "exports": {
      +    ".": {
      +      "import": {
      +        "types": "./dist/mjs/index.d.ts",
      +        "default": "./dist/mjs/index.js"
      +      },
      +      "require": {
      +        "types": "./dist/cjs/src/index.d.ts",
      +        "default": "./dist/cjs/src/index.js"
      +      }
      +    }
      +  },
      +  "files": [
      +    "dist"
      +  ],
      +  "scripts": {
      +    "preversion": "npm test",
      +    "postversion": "npm publish",
      +    "prepublishOnly": "git push origin --follow-tags",
      +    "preprepare": "rm -rf dist",
      +    "prepare": "tsc -p tsconfig.json && tsc -p tsconfig-esm.json",
      +    "postprepare": "bash fixup.sh",
      +    "pretest": "npm run prepare",
      +    "presnap": "npm run prepare",
      +    "test": "c8 tap",
      +    "snap": "c8 tap",
      +    "format": "prettier --write . --loglevel warn",
      +    "benchmark": "node benchmark/index.js",
      +    "typedoc": "typedoc --tsconfig tsconfig-esm.json ./src/*.ts"
      +  },
      +  "prettier": {
      +    "semi": false,
      +    "printWidth": 80,
      +    "tabWidth": 2,
      +    "useTabs": false,
      +    "singleQuote": true,
      +    "jsxSingleQuote": false,
      +    "bracketSameLine": true,
      +    "arrowParens": "avoid",
      +    "endOfLine": "lf"
      +  },
      +  "devDependencies": {
      +    "@types/brace-expansion": "^1.1.0",
      +    "@types/node": "^18.11.9",
      +    "@types/tap": "^15.0.7",
      +    "c8": "^7.12.0",
      +    "eslint-config-prettier": "^8.6.0",
      +    "prettier": "^2.8.2",
      +    "tap": "^16.3.3",
      +    "ts-node": "^10.9.1",
      +    "typedoc": "^0.23.21",
      +    "typescript": "^4.9.3"
      +  },
      +  "tap": {
      +    "coverage": false,
      +    "node-arg": [
      +      "--no-warnings",
      +      "--loader",
      +      "ts-node/esm"
      +    ],
      +    "ts": false
      +  },
      +  "funding": {
      +    "url": "https://github.com/sponsors/isaacs"
      +  },
      +  "repository": {
      +    "type": "git",
      +    "url": "https://github.com/isaacs/node-mkdirp.git"
      +  },
      +  "license": "MIT",
      +  "engines": {
      +    "node": ">=10"
      +  }
      +}
      diff --git a/node_modules/mkdirp/readme.markdown b/node_modules/mkdirp/readme.markdown
      new file mode 100644
      index 00000000..df654b80
      --- /dev/null
      +++ b/node_modules/mkdirp/readme.markdown
      @@ -0,0 +1,281 @@
      +# mkdirp
      +
      +Like `mkdir -p`, but in Node.js!
      +
      +Now with a modern API and no\* bugs!
      +
      +\* may contain some bugs
      +
      +# example
      +
      +## pow.js
      +
      +```js
      +// hybrid module, import or require() both work
      +import { mkdirp } from 'mkdirp'
      +// or:
      +const { mkdirp } = require('mkdirp')
      +
      +// return value is a Promise resolving to the first directory created
      +mkdirp('/tmp/foo/bar/baz').then(made =>
      +  console.log(`made directories, starting with ${made}`)
      +)
      +```
      +
      +Output (where `/tmp/foo` already exists)
      +
      +```
      +made directories, starting with /tmp/foo/bar
      +```
      +
      +Or, if you don't have time to wait around for promises:
      +
      +```js
      +import { mkdirp } from 'mkdirp'
      +
      +// return value is the first directory created
      +const made = mkdirp.sync('/tmp/foo/bar/baz')
      +console.log(`made directories, starting with ${made}`)
      +```
      +
      +And now /tmp/foo/bar/baz exists, huzzah!
      +
      +# methods
      +
      +```js
      +import { mkdirp } from 'mkdirp'
      +```
      +
      +## `mkdirp(dir: string, opts?: MkdirpOptions) => Promise`
      +
      +Create a new directory and any necessary subdirectories at `dir`
      +with octal permission string `opts.mode`. If `opts` is a string
      +or number, it will be treated as the `opts.mode`.
      +
      +If `opts.mode` isn't specified, it defaults to `0o777`.
      +
      +Promise resolves to first directory `made` that had to be
      +created, or `undefined` if everything already exists. Promise
      +rejects if any errors are encountered. Note that, in the case of
      +promise rejection, some directories _may_ have been created, as
      +recursive directory creation is not an atomic operation.
      +
      +You can optionally pass in an alternate `fs` implementation by
      +passing in `opts.fs`. Your implementation should have
      +`opts.fs.mkdir(path, opts, cb)` and `opts.fs.stat(path, cb)`.
      +
      +You can also override just one or the other of `mkdir` and `stat`
      +by passing in `opts.stat` or `opts.mkdir`, or providing an `fs`
      +option that only overrides one of these.
      +
      +## `mkdirp.sync(dir: string, opts: MkdirpOptions) => string|undefined`
      +
      +Synchronously create a new directory and any necessary
      +subdirectories at `dir` with octal permission string `opts.mode`.
      +If `opts` is a string or number, it will be treated as the
      +`opts.mode`.
      +
      +If `opts.mode` isn't specified, it defaults to `0o777`.
      +
      +Returns the first directory that had to be created, or undefined
      +if everything already exists.
      +
      +You can optionally pass in an alternate `fs` implementation by
      +passing in `opts.fs`. Your implementation should have
      +`opts.fs.mkdirSync(path, mode)` and `opts.fs.statSync(path)`.
      +
      +You can also override just one or the other of `mkdirSync` and
      +`statSync` by passing in `opts.statSync` or `opts.mkdirSync`, or
      +providing an `fs` option that only overrides one of these.
      +
      +## `mkdirp.manual`, `mkdirp.manualSync`
      +
      +Use the manual implementation (not the native one). This is the
      +default when the native implementation is not available or the
      +stat/mkdir implementation is overridden.
      +
      +## `mkdirp.native`, `mkdirp.nativeSync`
      +
      +Use the native implementation (not the manual one). This is the
      +default when the native implementation is available and
      +stat/mkdir are not overridden.
      +
      +# implementation
      +
      +On Node.js v10.12.0 and above, use the native `fs.mkdir(p,
      +{recursive:true})` option, unless `fs.mkdir`/`fs.mkdirSync` has
      +been overridden by an option.
      +
      +## native implementation
      +
      +- If the path is a root directory, then pass it to the underlying
      +  implementation and return the result/error. (In this case,
      +  it'll either succeed or fail, but we aren't actually creating
      +  any dirs.)
      +- Walk up the path statting each directory, to find the first
      +  path that will be created, `made`.
      +- Call `fs.mkdir(path, { recursive: true })` (or `fs.mkdirSync`)
      +- If error, raise it to the caller.
      +- Return `made`.
      +
      +## manual implementation
      +
      +- Call underlying `fs.mkdir` implementation, with `recursive:
      +false`
      +- If error:
      +  - If path is a root directory, raise to the caller and do not
      +    handle it
      +  - If ENOENT, mkdirp parent dir, store result as `made`
      +  - stat(path)
      +    - If error, raise original `mkdir` error
      +    - If directory, return `made`
      +    - Else, raise original `mkdir` error
      +- else
      +  - return `undefined` if a root dir, or `made` if set, or `path`
      +
      +## windows vs unix caveat
      +
      +On Windows file systems, attempts to create a root directory (ie,
      +a drive letter or root UNC path) will fail. If the root
      +directory exists, then it will fail with `EPERM`. If the root
      +directory does not exist, then it will fail with `ENOENT`.
      +
      +On posix file systems, attempts to create a root directory (in
      +recursive mode) will succeed silently, as it is treated like just
      +another directory that already exists. (In non-recursive mode,
      +of course, it fails with `EEXIST`.)
      +
      +In order to preserve this system-specific behavior (and because
      +it's not as if we can create the parent of a root directory
      +anyway), attempts to create a root directory are passed directly
      +to the `fs` implementation, and any errors encountered are not
      +handled.
      +
      +## native error caveat
      +
      +The native implementation (as of at least Node.js v13.4.0) does
      +not provide appropriate errors in some cases (see
      +[nodejs/node#31481](https://github.com/nodejs/node/issues/31481)
      +and
      +[nodejs/node#28015](https://github.com/nodejs/node/issues/28015)).
      +
      +In order to work around this issue, the native implementation
      +will fall back to the manual implementation if an `ENOENT` error
      +is encountered.
      +
      +# choosing a recursive mkdir implementation
      +
      +There are a few to choose from! Use the one that suits your
      +needs best :D
      +
      +## use `fs.mkdir(path, {recursive: true}, cb)` if:
      +
      +- You wish to optimize performance even at the expense of other
      +  factors.
      +- You don't need to know the first dir created.
      +- You are ok with getting `ENOENT` as the error when some other
      +  problem is the actual cause.
      +- You can limit your platforms to Node.js v10.12 and above.
      +- You're ok with using callbacks instead of promises.
      +- You don't need/want a CLI.
      +- You don't need to override the `fs` methods in use.
      +
      +## use this module (mkdirp 1.x or 2.x) if:
      +
      +- You need to know the first directory that was created.
      +- You wish to use the native implementation if available, but
      +  fall back when it's not.
      +- You prefer promise-returning APIs to callback-taking APIs.
      +- You want more useful error messages than the native recursive
      +  mkdir provides (at least as of Node.js v13.4), and are ok with
      +  re-trying on `ENOENT` to achieve this.
      +- You need (or at least, are ok with) a CLI.
      +- You need to override the `fs` methods in use.
      +
      +## use [`make-dir`](http://npm.im/make-dir) if:
      +
      +- You do not need to know the first dir created (and wish to save
      +  a few `stat` calls when using the native implementation for
      +  this reason).
      +- You wish to use the native implementation if available, but
      +  fall back when it's not.
      +- You prefer promise-returning APIs to callback-taking APIs.
      +- You are ok with occasionally getting `ENOENT` errors for
      +  failures that are actually related to something other than a
      +  missing file system entry.
      +- You don't need/want a CLI.
      +- You need to override the `fs` methods in use.
      +
      +## use mkdirp 0.x if:
      +
      +- You need to know the first directory that was created.
      +- You need (or at least, are ok with) a CLI.
      +- You need to override the `fs` methods in use.
      +- You're ok with using callbacks instead of promises.
      +- You are not running on Windows, where the root-level ENOENT
      +  errors can lead to infinite regress.
      +- You think vinyl just sounds warmer and richer for some weird
      +  reason.
      +- You are supporting truly ancient Node.js versions, before even
      +  the advent of a `Promise` language primitive. (Please don't.
      +  You deserve better.)
      +
      +# cli
      +
      +This package also ships with a `mkdirp` command.
      +
      +```
      +$ mkdirp -h
      +
      +usage: mkdirp [DIR1,DIR2..] {OPTIONS}
      +
      +  Create each supplied directory including any necessary parent directories
      +  that don't yet exist.
      +
      +  If the directory already exists, do nothing.
      +
      +OPTIONS are:
      +
      +  -m       If a directory needs to be created, set the mode as an octal
      +  --mode=  permission string.
      +
      +  -v --version   Print the mkdirp version number
      +
      +  -h --help      Print this helpful banner
      +
      +  -p --print     Print the first directories created for each path provided
      +
      +  --manual       Use manual implementation, even if native is available
      +```
      +
      +# install
      +
      +With [npm](http://npmjs.org) do:
      +
      +```
      +npm install mkdirp
      +```
      +
      +to get the library locally, or
      +
      +```
      +npm install -g mkdirp
      +```
      +
      +to get the command everywhere, or
      +
      +```
      +npx mkdirp ...
      +```
      +
      +to run the command without installing it globally.
      +
      +# platform support
      +
      +This module works on node v8, but only v10 and above are officially
      +supported, as Node v8 reached its LTS end of life 2020-01-01, which is in
      +the past, as of this writing.
      +
      +# license
      +
      +MIT
      diff --git a/node_modules/ms/index.js b/node_modules/ms/index.js
      new file mode 100644
      index 00000000..ea734fb7
      --- /dev/null
      +++ b/node_modules/ms/index.js
      @@ -0,0 +1,162 @@
      +/**
      + * Helpers.
      + */
      +
      +var s = 1000;
      +var m = s * 60;
      +var h = m * 60;
      +var d = h * 24;
      +var w = d * 7;
      +var y = d * 365.25;
      +
      +/**
      + * Parse or format the given `val`.
      + *
      + * Options:
      + *
      + *  - `long` verbose formatting [false]
      + *
      + * @param {String|Number} val
      + * @param {Object} [options]
      + * @throws {Error} throw an error if val is not a non-empty string or a number
      + * @return {String|Number}
      + * @api public
      + */
      +
      +module.exports = function (val, options) {
      +  options = options || {};
      +  var type = typeof val;
      +  if (type === 'string' && val.length > 0) {
      +    return parse(val);
      +  } else if (type === 'number' && isFinite(val)) {
      +    return options.long ? fmtLong(val) : fmtShort(val);
      +  }
      +  throw new Error(
      +    'val is not a non-empty string or a valid number. val=' +
      +      JSON.stringify(val)
      +  );
      +};
      +
      +/**
      + * Parse the given `str` and return milliseconds.
      + *
      + * @param {String} str
      + * @return {Number}
      + * @api private
      + */
      +
      +function parse(str) {
      +  str = String(str);
      +  if (str.length > 100) {
      +    return;
      +  }
      +  var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(
      +    str
      +  );
      +  if (!match) {
      +    return;
      +  }
      +  var n = parseFloat(match[1]);
      +  var type = (match[2] || 'ms').toLowerCase();
      +  switch (type) {
      +    case 'years':
      +    case 'year':
      +    case 'yrs':
      +    case 'yr':
      +    case 'y':
      +      return n * y;
      +    case 'weeks':
      +    case 'week':
      +    case 'w':
      +      return n * w;
      +    case 'days':
      +    case 'day':
      +    case 'd':
      +      return n * d;
      +    case 'hours':
      +    case 'hour':
      +    case 'hrs':
      +    case 'hr':
      +    case 'h':
      +      return n * h;
      +    case 'minutes':
      +    case 'minute':
      +    case 'mins':
      +    case 'min':
      +    case 'm':
      +      return n * m;
      +    case 'seconds':
      +    case 'second':
      +    case 'secs':
      +    case 'sec':
      +    case 's':
      +      return n * s;
      +    case 'milliseconds':
      +    case 'millisecond':
      +    case 'msecs':
      +    case 'msec':
      +    case 'ms':
      +      return n;
      +    default:
      +      return undefined;
      +  }
      +}
      +
      +/**
      + * Short format for `ms`.
      + *
      + * @param {Number} ms
      + * @return {String}
      + * @api private
      + */
      +
      +function fmtShort(ms) {
      +  var msAbs = Math.abs(ms);
      +  if (msAbs >= d) {
      +    return Math.round(ms / d) + 'd';
      +  }
      +  if (msAbs >= h) {
      +    return Math.round(ms / h) + 'h';
      +  }
      +  if (msAbs >= m) {
      +    return Math.round(ms / m) + 'm';
      +  }
      +  if (msAbs >= s) {
      +    return Math.round(ms / s) + 's';
      +  }
      +  return ms + 'ms';
      +}
      +
      +/**
      + * Long format for `ms`.
      + *
      + * @param {Number} ms
      + * @return {String}
      + * @api private
      + */
      +
      +function fmtLong(ms) {
      +  var msAbs = Math.abs(ms);
      +  if (msAbs >= d) {
      +    return plural(ms, msAbs, d, 'day');
      +  }
      +  if (msAbs >= h) {
      +    return plural(ms, msAbs, h, 'hour');
      +  }
      +  if (msAbs >= m) {
      +    return plural(ms, msAbs, m, 'minute');
      +  }
      +  if (msAbs >= s) {
      +    return plural(ms, msAbs, s, 'second');
      +  }
      +  return ms + ' ms';
      +}
      +
      +/**
      + * Pluralization helper.
      + */
      +
      +function plural(ms, msAbs, n, name) {
      +  var isPlural = msAbs >= n * 1.5;
      +  return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
      +}
      diff --git a/node_modules/ms/license.md b/node_modules/ms/license.md
      new file mode 100644
      index 00000000..fa5d39b6
      --- /dev/null
      +++ b/node_modules/ms/license.md
      @@ -0,0 +1,21 @@
      +The MIT License (MIT)
      +
      +Copyright (c) 2020 Vercel, Inc.
      +
      +Permission is hereby granted, free of charge, to any person obtaining a copy
      +of this software and associated documentation files (the "Software"), to deal
      +in the Software without restriction, including without limitation the rights
      +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
      +copies of the Software, and to permit persons to whom the Software is
      +furnished to do so, subject to the following conditions:
      +
      +The above copyright notice and this permission notice shall be included in all
      +copies or substantial portions of the Software.
      +
      +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
      +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
      +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
      +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
      +SOFTWARE.
      diff --git a/node_modules/ms/package.json b/node_modules/ms/package.json
      new file mode 100644
      index 00000000..49971890
      --- /dev/null
      +++ b/node_modules/ms/package.json
      @@ -0,0 +1,38 @@
      +{
      +  "name": "ms",
      +  "version": "2.1.3",
      +  "description": "Tiny millisecond conversion utility",
      +  "repository": "vercel/ms",
      +  "main": "./index",
      +  "files": [
      +    "index.js"
      +  ],
      +  "scripts": {
      +    "precommit": "lint-staged",
      +    "lint": "eslint lib/* bin/*",
      +    "test": "mocha tests.js"
      +  },
      +  "eslintConfig": {
      +    "extends": "eslint:recommended",
      +    "env": {
      +      "node": true,
      +      "es6": true
      +    }
      +  },
      +  "lint-staged": {
      +    "*.js": [
      +      "npm run lint",
      +      "prettier --single-quote --write",
      +      "git add"
      +    ]
      +  },
      +  "license": "MIT",
      +  "devDependencies": {
      +    "eslint": "4.18.2",
      +    "expect.js": "0.3.1",
      +    "husky": "0.14.3",
      +    "lint-staged": "5.0.0",
      +    "mocha": "4.0.1",
      +    "prettier": "2.0.5"
      +  }
      +}
      diff --git a/node_modules/ms/readme.md b/node_modules/ms/readme.md
      new file mode 100644
      index 00000000..0fc1abb3
      --- /dev/null
      +++ b/node_modules/ms/readme.md
      @@ -0,0 +1,59 @@
      +# ms
      +
      +![CI](https://github.com/vercel/ms/workflows/CI/badge.svg)
      +
      +Use this package to easily convert various time formats to milliseconds.
      +
      +## Examples
      +
      +```js
      +ms('2 days')  // 172800000
      +ms('1d')      // 86400000
      +ms('10h')     // 36000000
      +ms('2.5 hrs') // 9000000
      +ms('2h')      // 7200000
      +ms('1m')      // 60000
      +ms('5s')      // 5000
      +ms('1y')      // 31557600000
      +ms('100')     // 100
      +ms('-3 days') // -259200000
      +ms('-1h')     // -3600000
      +ms('-200')    // -200
      +```
      +
      +### Convert from Milliseconds
      +
      +```js
      +ms(60000)             // "1m"
      +ms(2 * 60000)         // "2m"
      +ms(-3 * 60000)        // "-3m"
      +ms(ms('10 hours'))    // "10h"
      +```
      +
      +### Time Format Written-Out
      +
      +```js
      +ms(60000, { long: true })             // "1 minute"
      +ms(2 * 60000, { long: true })         // "2 minutes"
      +ms(-3 * 60000, { long: true })        // "-3 minutes"
      +ms(ms('10 hours'), { long: true })    // "10 hours"
      +```
      +
      +## Features
      +
      +- Works both in [Node.js](https://nodejs.org) and in the browser
      +- If a number is supplied to `ms`, a string with a unit is returned
      +- If a string that contains the number is supplied, it returns it as a number (e.g.: it returns `100` for `'100'`)
      +- If you pass a string with a number and a valid unit, the number of equivalent milliseconds is returned
      +
      +## Related Packages
      +
      +- [ms.macro](https://github.com/knpwrs/ms.macro) - Run `ms` as a macro at build-time.
      +
      +## Caught a Bug?
      +
      +1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device
      +2. Link the package to the global module directory: `npm link`
      +3. Within the module you want to test your local development instance of ms, just link it to the dependencies: `npm link ms`. Instead of the default one from npm, Node.js will now use your clone of ms!
      +
      +As always, you can run the tests using: `npm test`
      diff --git a/node_modules/mz/HISTORY.md b/node_modules/mz/HISTORY.md
      new file mode 100644
      index 00000000..6ebee21d
      --- /dev/null
      +++ b/node_modules/mz/HISTORY.md
      @@ -0,0 +1,66 @@
      +
      +2.7.0 / 2017-09-13
      +==================
      +
      +  * feat: support fs.copyFile (#58)
      +
      +2.6.0 / 2016-11-22
      +==================
      +
      +  * Added fdatasync to fs api (#46)
      +
      +2.5.0 / 2016-11-04
      +==================
      +
      +  * feat: support fs.mkdtemp
      +
      +2.4.0 / 2016-03-23
      +==================
      +
      +  * add `fs.truncate()` [#34](https://github.com/normalize/mz/pull/34)
      +
      +2.3.1 / 2016-02-01
      +==================
      +
      +  * update `any-promise@v1`
      +
      +2.3.0 / 2016-01-30
      +==================
      +
      +  * feat(package): switch to `any-promise` to support more promise engines
      +
      +2.2.0 / 2016-01-24
      +==================
      +
      +  * feat(package): add index.js to files
      +
      +2.1.0 / 2015-10-15
      +==================
      +
      + * support for readline library
      +
      +2.0.0 / 2015-05-24
      +==================
      +
      + * support callbacks as well
      +
      +1.2.0 / 2014-12-16
      +==================
      +
      + * refactor promisification to `thenify` and `thenify-all`
      +
      +1.1.0 / 2014-11-14
      +==================
      +
      + * use `graceful-fs` if available
      +
      +1.0.1 / 2014-08-18
      +==================
      +
      + * don't use `bluebird.promisify()` - unnecessarily wraps runtime errors, causing issues
      +
      +1.0.0 / 2014-06-18
      +==================
      +
      + * use `bluebird` by default if found
      + * support node 0.8
      diff --git a/node_modules/mz/LICENSE b/node_modules/mz/LICENSE
      new file mode 100644
      index 00000000..1835f3d9
      --- /dev/null
      +++ b/node_modules/mz/LICENSE
      @@ -0,0 +1,22 @@
      +
      +The MIT License (MIT)
      +
      +Copyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and Contributors
      +
      +Permission is hereby granted, free of charge, to any person obtaining a copy
      +of this software and associated documentation files (the "Software"), to deal
      +in the Software without restriction, including without limitation the rights
      +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
      +copies of the Software, and to permit persons to whom the Software is
      +furnished to do so, subject to the following conditions:
      +
      +The above copyright notice and this permission notice shall be included in
      +all copies or substantial portions of the Software.
      +
      +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
      +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
      +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
      +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
      +THE SOFTWARE.
      diff --git a/node_modules/mz/README.md b/node_modules/mz/README.md
      new file mode 100644
      index 00000000..50d6557c
      --- /dev/null
      +++ b/node_modules/mz/README.md
      @@ -0,0 +1,106 @@
      +
      +# MZ - Modernize node.js
      +
      +[![NPM version][npm-image]][npm-url]
      +[![Build status][travis-image]][travis-url]
      +[![Test coverage][coveralls-image]][coveralls-url]
      +[![Dependency Status][david-image]][david-url]
      +[![License][license-image]][license-url]
      +[![Downloads][downloads-image]][downloads-url]
      +
      +Modernize node.js to current ECMAScript specifications!
      +node.js will not update their API to ES6+ [for a while](https://github.com/joyent/node/issues/7549).
      +This library is a wrapper for various aspects of node.js' API.
      +
      +## Installation and Usage
      +
      +Set `mz` as a dependency and install it.
      +
      +```bash
      +npm i mz
      +```
      +
      +Then prefix the relevant `require()`s with `mz/`:
      +
      +```js
      +var fs = require('mz/fs')
      +
      +fs.exists(__filename).then(function (exists) {
      +  if (exists) // do something
      +})
      +```
      +
      +With ES2017, this will allow you to use async functions cleanly with node's core API:
      +
      +```js
      +const fs = require('mz/fs')
      +
      +
      +async function doSomething () {
      +  if (await fs.exists(__filename)) // do something
      +}
      +```
      +
      +## Promisification
      +
      +Many node methods are converted into promises.
      +Any properties that are deprecated or aren't asynchronous will simply be proxied.
      +The modules wrapped are:
      +
      +- `child_process`
      +- `crypto`
      +- `dns`
      +- `fs` (uses `graceful-fs` if available)
      +- `readline`
      +- `zlib`
      +
      +```js
      +var exec = require('mz/child_process').exec
      +
      +exec('node --version').then(function (stdout) {
      +  console.log(stdout)
      +})
      +```
      +
      +## Promise Engine
      +
      +`mz` uses [`any-promise`](https://github.com/kevinbeaty/any-promise).
      +
      +## FAQ
      +
      +### Can I use this in production?
      +
      +Yes, Node 4.x ships with stable promises support. For older engines,
      +you should probably install your own promise implementation and register it with
      +`require('any-promise/register')('bluebird')`.
      +
      +### Will this make my app faster?
      +
      +Nope, probably slower actually.
      +
      +### Can I add more features?
      +
      +Sure.
      +Open an issue.
      +
      +Currently, the plans are to eventually support:
      +
      +- New APIs in node.js that are not available in older versions of node
      +- ECMAScript7 Streams
      +
      +[bluebird]: https://github.com/petkaantonov/bluebird
      +
      +[npm-image]: https://img.shields.io/npm/v/mz.svg?style=flat-square
      +[npm-url]: https://npmjs.org/package/mz
      +[github-tag]: http://img.shields.io/github/tag/normalize/mz.svg?style=flat-square
      +[github-url]: https://github.com/normalize/mz/tags
      +[travis-image]: https://img.shields.io/travis/normalize/mz.svg?style=flat-square
      +[travis-url]: https://travis-ci.org/normalize/mz
      +[coveralls-image]: https://img.shields.io/coveralls/normalize/mz.svg?style=flat-square
      +[coveralls-url]: https://coveralls.io/r/normalize/mz?branch=master
      +[david-image]: http://img.shields.io/david/normalize/mz.svg?style=flat-square
      +[david-url]: https://david-dm.org/normalize/mz
      +[license-image]: http://img.shields.io/npm/l/mz.svg?style=flat-square
      +[license-url]: LICENSE
      +[downloads-image]: http://img.shields.io/npm/dm/mz.svg?style=flat-square
      +[downloads-url]: https://npmjs.org/package/mz
      diff --git a/node_modules/mz/child_process.js b/node_modules/mz/child_process.js
      new file mode 100644
      index 00000000..06d5d9e3
      --- /dev/null
      +++ b/node_modules/mz/child_process.js
      @@ -0,0 +1,8 @@
      +
      +require('thenify-all').withCallback(
      +  require('child_process'),
      +  exports, [
      +    'exec',
      +    'execFile',
      +  ]
      +)
      diff --git a/node_modules/mz/crypto.js b/node_modules/mz/crypto.js
      new file mode 100644
      index 00000000..d8cff57f
      --- /dev/null
      +++ b/node_modules/mz/crypto.js
      @@ -0,0 +1,9 @@
      +
      +require('thenify-all').withCallback(
      +  require('crypto'),
      +  exports, [
      +    'pbkdf2',
      +    'pseudoRandomBytes',
      +    'randomBytes'
      +  ]
      +)
      diff --git a/node_modules/mz/dns.js b/node_modules/mz/dns.js
      new file mode 100644
      index 00000000..c1035822
      --- /dev/null
      +++ b/node_modules/mz/dns.js
      @@ -0,0 +1,16 @@
      +
      +require('thenify-all').withCallback(
      +  require('dns'),
      +  exports, [
      +    'lookup',
      +    'resolve',
      +    'resolve4',
      +    'resolve6',
      +    'resolveCname',
      +    'resolveMx',
      +    'resolveNs',
      +    'resolveSrv',
      +    'resolveTxt',
      +    'reverse'
      +  ]
      +)
      diff --git a/node_modules/mz/fs.js b/node_modules/mz/fs.js
      new file mode 100644
      index 00000000..1cfd2d77
      --- /dev/null
      +++ b/node_modules/mz/fs.js
      @@ -0,0 +1,62 @@
      +
      +var Promise = require('any-promise')
      +var fs
      +try {
      +  fs = require('graceful-fs')
      +} catch(err) {
      +  fs = require('fs')
      +}
      +
      +var api = [
      +  'appendFile',
      +  'chmod',
      +  'chown',
      +  'close',
      +  'fchmod',
      +  'fchown',
      +  'fdatasync',
      +  'fstat',
      +  'fsync',
      +  'ftruncate',
      +  'futimes',
      +  'lchown',
      +  'link',
      +  'lstat',
      +  'mkdir',
      +  'open',
      +  'read',
      +  'readFile',
      +  'readdir',
      +  'readlink',
      +  'realpath',
      +  'rename',
      +  'rmdir',
      +  'stat',
      +  'symlink',
      +  'truncate',
      +  'unlink',
      +  'utimes',
      +  'write',
      +  'writeFile'
      +]
      +
      +typeof fs.access === 'function' && api.push('access')
      +typeof fs.copyFile === 'function' && api.push('copyFile')
      +typeof fs.mkdtemp === 'function' && api.push('mkdtemp')
      +
      +require('thenify-all').withCallback(fs, exports, api)
      +
      +exports.exists = function (filename, callback) {
      +  // callback
      +  if (typeof callback === 'function') {
      +    return fs.stat(filename, function (err) {
      +      callback(null, !err);
      +    })
      +  }
      +  // or promise
      +  return new Promise(function (resolve) {
      +    fs.stat(filename, function (err) {
      +      resolve(!err)
      +    })
      +  })
      +}
      diff --git a/node_modules/mz/index.js b/node_modules/mz/index.js
      new file mode 100644
      index 00000000..cef508dc
      --- /dev/null
      +++ b/node_modules/mz/index.js
      @@ -0,0 +1,8 @@
      +module.exports = {
      +  fs: require('./fs'),
      +  dns: require('./dns'),
      +  zlib: require('./zlib'),
      +  crypto: require('./crypto'),
      +  readline: require('./readline'),
      +  child_process: require('./child_process')
      +}
      diff --git a/node_modules/mz/package.json b/node_modules/mz/package.json
      new file mode 100644
      index 00000000..de8d542c
      --- /dev/null
      +++ b/node_modules/mz/package.json
      @@ -0,0 +1,44 @@
      +{
      +  "name": "mz",
      +  "description": "modernize node.js to current ECMAScript standards",
      +  "version": "2.7.0",
      +  "author": {
      +    "name": "Jonathan Ong",
      +    "email": "me@jongleberry.com",
      +    "url": "http://jongleberry.com",
      +    "twitter": "https://twitter.com/jongleberry"
      +  },
      +  "license": "MIT",
      +  "repository": "normalize/mz",
      +  "dependencies": {
      +    "any-promise": "^1.0.0",
      +    "object-assign": "^4.0.1",
      +    "thenify-all": "^1.0.0"
      +  },
      +  "devDependencies": {
      +    "istanbul": "^0.4.0",
      +    "bluebird": "^3.0.0",
      +    "mocha": "^3.0.0"
      +  },
      +  "scripts": {
      +    "test": "mocha --reporter spec",
      +    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot",
      +    "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter dot"
      +  },
      +  "keywords": [
      +    "promisify",
      +    "promise",
      +    "thenify",
      +    "then",
      +    "es6"
      +  ],
      +  "files": [
      +    "index.js",
      +    "child_process.js",
      +    "crypto.js",
      +    "dns.js",
      +    "fs.js",
      +    "readline.js",
      +    "zlib.js"
      +  ]
      +}
      diff --git a/node_modules/mz/readline.js b/node_modules/mz/readline.js
      new file mode 100644
      index 00000000..eb70c46f
      --- /dev/null
      +++ b/node_modules/mz/readline.js
      @@ -0,0 +1,64 @@
      +var readline = require('readline')
      +var Promise = require('any-promise')
      +var objectAssign = require('object-assign')
      +var Interface = readline.Interface
      +
      +function wrapCompleter (completer) {
      +  if (completer.length === 2) return completer
      +
      +  return function (line, cb) {
      +    var result = completer(line)
      +
      +    if (typeof result.then !== 'function') {
      +      return cb(null, result)
      +    }
      +
      +    result.catch(cb).then(function (result) {
      +      process.nextTick(function () { cb(null, result) })
      +    })
      +  }
      +}
      +
      +function InterfaceAsPromised (input, output, completer, terminal) {
      +  if (arguments.length === 1) {
      +    var options = input
      +
      +    if (typeof options.completer === 'function') {
      +      options = objectAssign({}, options, {
      +        completer: wrapCompleter(options.completer)
      +      })
      +    }
      +
      +    Interface.call(this, options)
      +  } else {
      +    if (typeof completer === 'function') {
      +      completer = wrapCompleter(completer)
      +    }
      +
      +    Interface.call(this, input, output, completer, terminal)
      +  }
      +}
      +
      +InterfaceAsPromised.prototype = Object.create(Interface.prototype)
      +
      +InterfaceAsPromised.prototype.question = function (question, callback) {
      +  if (typeof callback === 'function') {
      +    return Interface.prototype.question.call(this, question, callback)
      +  }
      +
      +  var self = this
      +  return new Promise(function (resolve) {
      +    Interface.prototype.question.call(self, question, resolve)
      +  })
      +}
      +
      +objectAssign(exports, readline, {
      +  Interface: InterfaceAsPromised,
      +  createInterface: function (input, output, completer, terminal) {
      +    if (arguments.length === 1) {
      +      return new InterfaceAsPromised(input)
      +    }
      +
      +    return new InterfaceAsPromised(input, output, completer, terminal)
      +  }
      +})
      diff --git a/node_modules/mz/zlib.js b/node_modules/mz/zlib.js
      new file mode 100644
      index 00000000..a05c26a6
      --- /dev/null
      +++ b/node_modules/mz/zlib.js
      @@ -0,0 +1,13 @@
      +
      +require('thenify-all').withCallback(
      +  require('zlib'),
      +  exports, [
      +    'deflate',
      +    'deflateRaw',
      +    'gzip',
      +    'gunzip',
      +    'inflate',
      +    'inflateRaw',
      +    'unzip',
      +  ]
      +)
      diff --git a/node_modules/no-case/LICENSE b/node_modules/no-case/LICENSE
      new file mode 100644
      index 00000000..983fbe8a
      --- /dev/null
      +++ b/node_modules/no-case/LICENSE
      @@ -0,0 +1,21 @@
      +The MIT License (MIT)
      +
      +Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com)
      +
      +Permission is hereby granted, free of charge, to any person obtaining a copy
      +of this software and associated documentation files (the "Software"), to deal
      +in the Software without restriction, including without limitation the rights
      +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
      +copies of the Software, and to permit persons to whom the Software is
      +furnished to do so, subject to the following conditions:
      +
      +The above copyright notice and this permission notice shall be included in
      +all copies or substantial portions of the Software.
      +
      +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
      +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
      +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
      +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
      +THE SOFTWARE.
      diff --git a/node_modules/no-case/README.md b/node_modules/no-case/README.md
      new file mode 100644
      index 00000000..6ce3b81f
      --- /dev/null
      +++ b/node_modules/no-case/README.md
      @@ -0,0 +1,37 @@
      +# No Case
      +
      +[![NPM version][npm-image]][npm-url]
      +[![NPM downloads][downloads-image]][downloads-url]
      +[![Bundle size][bundlephobia-image]][bundlephobia-url]
      +
      +> Transform into a lower cased string with spaces between words.
      +
      +## Installation
      +
      +```
      +npm install no-case --save
      +```
      +
      +## Usage
      +
      +```js
      +import { noCase } from "no-case";
      +
      +noCase("string"); //=> "string"
      +noCase("dot.case"); //=> "dot case"
      +noCase("PascalCase"); //=> "pascal case"
      +noCase("version 1.2.10"); //=> "version 1 2 10"
      +```
      +
      +The function also accepts [`options`](https://github.com/blakeembrey/change-case#options).
      +
      +## License
      +
      +MIT
      +
      +[npm-image]: https://img.shields.io/npm/v/no-case.svg?style=flat
      +[npm-url]: https://npmjs.org/package/no-case
      +[downloads-image]: https://img.shields.io/npm/dm/no-case.svg?style=flat
      +[downloads-url]: https://npmjs.org/package/no-case
      +[bundlephobia-image]: https://img.shields.io/bundlephobia/minzip/no-case.svg
      +[bundlephobia-url]: https://bundlephobia.com/result?p=no-case
      diff --git a/node_modules/no-case/dist.es2015/index.d.ts b/node_modules/no-case/dist.es2015/index.d.ts
      new file mode 100644
      index 00000000..4b24f804
      --- /dev/null
      +++ b/node_modules/no-case/dist.es2015/index.d.ts
      @@ -0,0 +1,10 @@
      +export interface Options {
      +    splitRegexp?: RegExp | RegExp[];
      +    stripRegexp?: RegExp | RegExp[];
      +    delimiter?: string;
      +    transform?: (part: string, index: number, parts: string[]) => string;
      +}
      +/**
      + * Normalize the string into something other libraries can manipulate easier.
      + */
      +export declare function noCase(input: string, options?: Options): string;
      diff --git a/node_modules/no-case/dist.es2015/index.js b/node_modules/no-case/dist.es2015/index.js
      new file mode 100644
      index 00000000..8aa0ce10
      --- /dev/null
      +++ b/node_modules/no-case/dist.es2015/index.js
      @@ -0,0 +1,31 @@
      +import { lowerCase } from "lower-case";
      +// Support camel case ("camelCase" -> "camel Case" and "CAMELCase" -> "CAMEL Case").
      +var DEFAULT_SPLIT_REGEXP = [/([a-z0-9])([A-Z])/g, /([A-Z])([A-Z][a-z])/g];
      +// Remove all non-word characters.
      +var DEFAULT_STRIP_REGEXP = /[^A-Z0-9]+/gi;
      +/**
      + * Normalize the string into something other libraries can manipulate easier.
      + */
      +export function noCase(input, options) {
      +    if (options === void 0) { options = {}; }
      +    var _a = options.splitRegexp, splitRegexp = _a === void 0 ? DEFAULT_SPLIT_REGEXP : _a, _b = options.stripRegexp, stripRegexp = _b === void 0 ? DEFAULT_STRIP_REGEXP : _b, _c = options.transform, transform = _c === void 0 ? lowerCase : _c, _d = options.delimiter, delimiter = _d === void 0 ? " " : _d;
      +    var result = replace(replace(input, splitRegexp, "$1\0$2"), stripRegexp, "\0");
      +    var start = 0;
      +    var end = result.length;
      +    // Trim the delimiter from around the output string.
      +    while (result.charAt(start) === "\0")
      +        start++;
      +    while (result.charAt(end - 1) === "\0")
      +        end--;
      +    // Transform each token independently.
      +    return result.slice(start, end).split("\0").map(transform).join(delimiter);
      +}
      +/**
      + * Replace `re` in the input string with the replacement value.
      + */
      +function replace(input, re, value) {
      +    if (re instanceof RegExp)
      +        return input.replace(re, value);
      +    return re.reduce(function (input, re) { return input.replace(re, value); }, input);
      +}
      +//# sourceMappingURL=index.js.map
      \ No newline at end of file
      diff --git a/node_modules/no-case/dist.es2015/index.js.map b/node_modules/no-case/dist.es2015/index.js.map
      new file mode 100644
      index 00000000..fe9541f5
      --- /dev/null
      +++ b/node_modules/no-case/dist.es2015/index.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AASvC,oFAAoF;AACpF,IAAM,oBAAoB,GAAG,CAAC,oBAAoB,EAAE,sBAAsB,CAAC,CAAC;AAE5E,kCAAkC;AAClC,IAAM,oBAAoB,GAAG,cAAc,CAAC;AAE5C;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,KAAa,EAAE,OAAqB;IAArB,wBAAA,EAAA,YAAqB;IAEvD,IAAA,KAIE,OAAO,YAJyB,EAAlC,WAAW,mBAAG,oBAAoB,KAAA,EAClC,KAGE,OAAO,YAHyB,EAAlC,WAAW,mBAAG,oBAAoB,KAAA,EAClC,KAEE,OAAO,UAFY,EAArB,SAAS,mBAAG,SAAS,KAAA,EACrB,KACE,OAAO,UADM,EAAf,SAAS,mBAAG,GAAG,KAAA,CACL;IAEZ,IAAI,MAAM,GAAG,OAAO,CAClB,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,EACrC,WAAW,EACX,IAAI,CACL,CAAC;IACF,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;IAExB,oDAAoD;IACpD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI;QAAE,KAAK,EAAE,CAAC;IAC9C,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI;QAAE,GAAG,EAAE,CAAC;IAE9C,sCAAsC;IACtC,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC7E,CAAC;AAED;;GAEG;AACH,SAAS,OAAO,CAAC,KAAa,EAAE,EAAqB,EAAE,KAAa;IAClE,IAAI,EAAE,YAAY,MAAM;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC1D,OAAO,EAAE,CAAC,MAAM,CAAC,UAAC,KAAK,EAAE,EAAE,IAAK,OAAA,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,EAAxB,CAAwB,EAAE,KAAK,CAAC,CAAC;AACnE,CAAC","sourcesContent":["import { lowerCase } from \"lower-case\";\n\nexport interface Options {\n  splitRegexp?: RegExp | RegExp[];\n  stripRegexp?: RegExp | RegExp[];\n  delimiter?: string;\n  transform?: (part: string, index: number, parts: string[]) => string;\n}\n\n// Support camel case (\"camelCase\" -> \"camel Case\" and \"CAMELCase\" -> \"CAMEL Case\").\nconst DEFAULT_SPLIT_REGEXP = [/([a-z0-9])([A-Z])/g, /([A-Z])([A-Z][a-z])/g];\n\n// Remove all non-word characters.\nconst DEFAULT_STRIP_REGEXP = /[^A-Z0-9]+/gi;\n\n/**\n * Normalize the string into something other libraries can manipulate easier.\n */\nexport function noCase(input: string, options: Options = {}) {\n  const {\n    splitRegexp = DEFAULT_SPLIT_REGEXP,\n    stripRegexp = DEFAULT_STRIP_REGEXP,\n    transform = lowerCase,\n    delimiter = \" \",\n  } = options;\n\n  let result = replace(\n    replace(input, splitRegexp, \"$1\\0$2\"),\n    stripRegexp,\n    \"\\0\"\n  );\n  let start = 0;\n  let end = result.length;\n\n  // Trim the delimiter from around the output string.\n  while (result.charAt(start) === \"\\0\") start++;\n  while (result.charAt(end - 1) === \"\\0\") end--;\n\n  // Transform each token independently.\n  return result.slice(start, end).split(\"\\0\").map(transform).join(delimiter);\n}\n\n/**\n * Replace `re` in the input string with the replacement value.\n */\nfunction replace(input: string, re: RegExp | RegExp[], value: string) {\n  if (re instanceof RegExp) return input.replace(re, value);\n  return re.reduce((input, re) => input.replace(re, value), input);\n}\n"]}
      \ No newline at end of file
      diff --git a/node_modules/no-case/dist.es2015/index.spec.d.ts b/node_modules/no-case/dist.es2015/index.spec.d.ts
      new file mode 100644
      index 00000000..cb0ff5c3
      --- /dev/null
      +++ b/node_modules/no-case/dist.es2015/index.spec.d.ts
      @@ -0,0 +1 @@
      +export {};
      diff --git a/node_modules/no-case/dist.es2015/index.spec.js b/node_modules/no-case/dist.es2015/index.spec.js
      new file mode 100644
      index 00000000..5fd9b15c
      --- /dev/null
      +++ b/node_modules/no-case/dist.es2015/index.spec.js
      @@ -0,0 +1,57 @@
      +import { noCase } from ".";
      +var TEST_CASES = [
      +    // Single words.
      +    ["test", "test"],
      +    ["TEST", "test"],
      +    // Camel case.
      +    ["testString", "test string"],
      +    ["testString123", "test string123"],
      +    ["testString_1_2_3", "test string 1 2 3"],
      +    ["x_256", "x 256"],
      +    ["anHTMLTag", "an html tag"],
      +    ["ID123String", "id123 string"],
      +    ["Id123String", "id123 string"],
      +    ["foo bar123", "foo bar123"],
      +    ["a1bStar", "a1b star"],
      +    // Constant case.
      +    ["CONSTANT_CASE ", "constant case"],
      +    ["CONST123_FOO", "const123 foo"],
      +    // Random cases.
      +    ["FOO_bar", "foo bar"],
      +    ["XMLHttpRequest", "xml http request"],
      +    ["IQueryAArgs", "i query a args"],
      +    // Non-alphanumeric separators.
      +    ["dot.case", "dot case"],
      +    ["path/case", "path case"],
      +    ["snake_case", "snake case"],
      +    ["snake_case123", "snake case123"],
      +    ["snake_case_123", "snake case 123"],
      +    // Punctuation.
      +    ['"quotes"', "quotes"],
      +    // Space between number parts.
      +    ["version 0.45.0", "version 0 45 0"],
      +    ["version 0..78..9", "version 0 78 9"],
      +    ["version 4_99/4", "version 4 99 4"],
      +    // Whitespace.
      +    ["  test  ", "test"],
      +    // Number string input.
      +    ["something_2014_other", "something 2014 other"],
      +    // https://github.com/blakeembrey/change-case/issues/21
      +    ["amazon s3 data", "amazon s3 data"],
      +    ["foo_13_bar", "foo 13 bar"],
      +    // Customization.
      +    ["camel2019", "camel 2019", { splitRegexp: /([a-z])([A-Z0-9])/g }],
      +    ["minifyURLs", "minify urls", { splitRegexp: /([a-z])([A-Z0-9])/g }],
      +];
      +describe("no case", function () {
      +    var _loop_1 = function (input, result, options) {
      +        it(input + " -> " + result, function () {
      +            expect(noCase(input, options)).toEqual(result);
      +        });
      +    };
      +    for (var _i = 0, TEST_CASES_1 = TEST_CASES; _i < TEST_CASES_1.length; _i++) {
      +        var _a = TEST_CASES_1[_i], input = _a[0], result = _a[1], options = _a[2];
      +        _loop_1(input, result, options);
      +    }
      +});
      +//# sourceMappingURL=index.spec.js.map
      \ No newline at end of file
      diff --git a/node_modules/no-case/dist.es2015/index.spec.js.map b/node_modules/no-case/dist.es2015/index.spec.js.map
      new file mode 100644
      index 00000000..d0325524
      --- /dev/null
      +++ b/node_modules/no-case/dist.es2015/index.spec.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"index.spec.js","sourceRoot":"","sources":["../src/index.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAW,MAAM,GAAG,CAAC;AAEpC,IAAM,UAAU,GAAiC;IAC/C,gBAAgB;IAChB,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,MAAM,EAAE,MAAM,CAAC;IAEhB,cAAc;IACd,CAAC,YAAY,EAAE,aAAa,CAAC;IAC7B,CAAC,eAAe,EAAE,gBAAgB,CAAC;IACnC,CAAC,kBAAkB,EAAE,mBAAmB,CAAC;IACzC,CAAC,OAAO,EAAE,OAAO,CAAC;IAClB,CAAC,WAAW,EAAE,aAAa,CAAC;IAC5B,CAAC,aAAa,EAAE,cAAc,CAAC;IAC/B,CAAC,aAAa,EAAE,cAAc,CAAC;IAC/B,CAAC,YAAY,EAAE,YAAY,CAAC;IAC5B,CAAC,SAAS,EAAE,UAAU,CAAC;IAEvB,iBAAiB;IACjB,CAAC,gBAAgB,EAAE,eAAe,CAAC;IACnC,CAAC,cAAc,EAAE,cAAc,CAAC;IAEhC,gBAAgB;IAChB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,gBAAgB,EAAE,kBAAkB,CAAC;IACtC,CAAC,aAAa,EAAE,gBAAgB,CAAC;IAEjC,+BAA+B;IAC/B,CAAC,UAAU,EAAE,UAAU,CAAC;IACxB,CAAC,WAAW,EAAE,WAAW,CAAC;IAC1B,CAAC,YAAY,EAAE,YAAY,CAAC;IAC5B,CAAC,eAAe,EAAE,eAAe,CAAC;IAClC,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAEpC,eAAe;IACf,CAAC,UAAU,EAAE,QAAQ,CAAC;IAEtB,8BAA8B;IAC9B,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IACpC,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;IACtC,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAEpC,cAAc;IACd,CAAC,UAAU,EAAE,MAAM,CAAC;IAEpB,uBAAuB;IACvB,CAAC,sBAAsB,EAAE,sBAAsB,CAAC;IAEhD,uDAAuD;IACvD,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IACpC,CAAC,YAAY,EAAE,YAAY,CAAC;IAE5B,iBAAiB;IACjB,CAAC,WAAW,EAAE,YAAY,EAAE,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC;IAClE,CAAC,YAAY,EAAE,aAAa,EAAE,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC;CACrE,CAAC;AAEF,QAAQ,CAAC,SAAS,EAAE;4BACN,KAAK,EAAE,MAAM,EAAE,OAAO;QAChC,EAAE,CAAI,KAAK,YAAO,MAAQ,EAAE;YAC1B,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;;IAHL,KAAuC,UAAU,EAAV,yBAAU,EAAV,wBAAU,EAAV,IAAU;QAAtC,IAAA,qBAAwB,EAAvB,KAAK,QAAA,EAAE,MAAM,QAAA,EAAE,OAAO,QAAA;gBAAtB,KAAK,EAAE,MAAM,EAAE,OAAO;KAIjC;AACH,CAAC,CAAC,CAAC","sourcesContent":["import { noCase, Options } from \".\";\n\nconst TEST_CASES: [string, string, Options?][] = [\n  // Single words.\n  [\"test\", \"test\"],\n  [\"TEST\", \"test\"],\n\n  // Camel case.\n  [\"testString\", \"test string\"],\n  [\"testString123\", \"test string123\"],\n  [\"testString_1_2_3\", \"test string 1 2 3\"],\n  [\"x_256\", \"x 256\"],\n  [\"anHTMLTag\", \"an html tag\"],\n  [\"ID123String\", \"id123 string\"],\n  [\"Id123String\", \"id123 string\"],\n  [\"foo bar123\", \"foo bar123\"],\n  [\"a1bStar\", \"a1b star\"],\n\n  // Constant case.\n  [\"CONSTANT_CASE \", \"constant case\"],\n  [\"CONST123_FOO\", \"const123 foo\"],\n\n  // Random cases.\n  [\"FOO_bar\", \"foo bar\"],\n  [\"XMLHttpRequest\", \"xml http request\"],\n  [\"IQueryAArgs\", \"i query a args\"],\n\n  // Non-alphanumeric separators.\n  [\"dot.case\", \"dot case\"],\n  [\"path/case\", \"path case\"],\n  [\"snake_case\", \"snake case\"],\n  [\"snake_case123\", \"snake case123\"],\n  [\"snake_case_123\", \"snake case 123\"],\n\n  // Punctuation.\n  ['\"quotes\"', \"quotes\"],\n\n  // Space between number parts.\n  [\"version 0.45.0\", \"version 0 45 0\"],\n  [\"version 0..78..9\", \"version 0 78 9\"],\n  [\"version 4_99/4\", \"version 4 99 4\"],\n\n  // Whitespace.\n  [\"  test  \", \"test\"],\n\n  // Number string input.\n  [\"something_2014_other\", \"something 2014 other\"],\n\n  // https://github.com/blakeembrey/change-case/issues/21\n  [\"amazon s3 data\", \"amazon s3 data\"],\n  [\"foo_13_bar\", \"foo 13 bar\"],\n\n  // Customization.\n  [\"camel2019\", \"camel 2019\", { splitRegexp: /([a-z])([A-Z0-9])/g }],\n  [\"minifyURLs\", \"minify urls\", { splitRegexp: /([a-z])([A-Z0-9])/g }],\n];\n\ndescribe(\"no case\", () => {\n  for (const [input, result, options] of TEST_CASES) {\n    it(`${input} -> ${result}`, () => {\n      expect(noCase(input, options)).toEqual(result);\n    });\n  }\n});\n"]}
      \ No newline at end of file
      diff --git a/node_modules/no-case/dist/index.d.ts b/node_modules/no-case/dist/index.d.ts
      new file mode 100644
      index 00000000..4b24f804
      --- /dev/null
      +++ b/node_modules/no-case/dist/index.d.ts
      @@ -0,0 +1,10 @@
      +export interface Options {
      +    splitRegexp?: RegExp | RegExp[];
      +    stripRegexp?: RegExp | RegExp[];
      +    delimiter?: string;
      +    transform?: (part: string, index: number, parts: string[]) => string;
      +}
      +/**
      + * Normalize the string into something other libraries can manipulate easier.
      + */
      +export declare function noCase(input: string, options?: Options): string;
      diff --git a/node_modules/no-case/dist/index.js b/node_modules/no-case/dist/index.js
      new file mode 100644
      index 00000000..0adeaf43
      --- /dev/null
      +++ b/node_modules/no-case/dist/index.js
      @@ -0,0 +1,35 @@
      +"use strict";
      +Object.defineProperty(exports, "__esModule", { value: true });
      +exports.noCase = void 0;
      +var lower_case_1 = require("lower-case");
      +// Support camel case ("camelCase" -> "camel Case" and "CAMELCase" -> "CAMEL Case").
      +var DEFAULT_SPLIT_REGEXP = [/([a-z0-9])([A-Z])/g, /([A-Z])([A-Z][a-z])/g];
      +// Remove all non-word characters.
      +var DEFAULT_STRIP_REGEXP = /[^A-Z0-9]+/gi;
      +/**
      + * Normalize the string into something other libraries can manipulate easier.
      + */
      +function noCase(input, options) {
      +    if (options === void 0) { options = {}; }
      +    var _a = options.splitRegexp, splitRegexp = _a === void 0 ? DEFAULT_SPLIT_REGEXP : _a, _b = options.stripRegexp, stripRegexp = _b === void 0 ? DEFAULT_STRIP_REGEXP : _b, _c = options.transform, transform = _c === void 0 ? lower_case_1.lowerCase : _c, _d = options.delimiter, delimiter = _d === void 0 ? " " : _d;
      +    var result = replace(replace(input, splitRegexp, "$1\0$2"), stripRegexp, "\0");
      +    var start = 0;
      +    var end = result.length;
      +    // Trim the delimiter from around the output string.
      +    while (result.charAt(start) === "\0")
      +        start++;
      +    while (result.charAt(end - 1) === "\0")
      +        end--;
      +    // Transform each token independently.
      +    return result.slice(start, end).split("\0").map(transform).join(delimiter);
      +}
      +exports.noCase = noCase;
      +/**
      + * Replace `re` in the input string with the replacement value.
      + */
      +function replace(input, re, value) {
      +    if (re instanceof RegExp)
      +        return input.replace(re, value);
      +    return re.reduce(function (input, re) { return input.replace(re, value); }, input);
      +}
      +//# sourceMappingURL=index.js.map
      \ No newline at end of file
      diff --git a/node_modules/no-case/dist/index.js.map b/node_modules/no-case/dist/index.js.map
      new file mode 100644
      index 00000000..493a884e
      --- /dev/null
      +++ b/node_modules/no-case/dist/index.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,yCAAuC;AASvC,oFAAoF;AACpF,IAAM,oBAAoB,GAAG,CAAC,oBAAoB,EAAE,sBAAsB,CAAC,CAAC;AAE5E,kCAAkC;AAClC,IAAM,oBAAoB,GAAG,cAAc,CAAC;AAE5C;;GAEG;AACH,SAAgB,MAAM,CAAC,KAAa,EAAE,OAAqB;IAArB,wBAAA,EAAA,YAAqB;IAEvD,IAAA,KAIE,OAAO,YAJyB,EAAlC,WAAW,mBAAG,oBAAoB,KAAA,EAClC,KAGE,OAAO,YAHyB,EAAlC,WAAW,mBAAG,oBAAoB,KAAA,EAClC,KAEE,OAAO,UAFY,EAArB,SAAS,mBAAG,sBAAS,KAAA,EACrB,KACE,OAAO,UADM,EAAf,SAAS,mBAAG,GAAG,KAAA,CACL;IAEZ,IAAI,MAAM,GAAG,OAAO,CAClB,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,EACrC,WAAW,EACX,IAAI,CACL,CAAC;IACF,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;IAExB,oDAAoD;IACpD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI;QAAE,KAAK,EAAE,CAAC;IAC9C,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI;QAAE,GAAG,EAAE,CAAC;IAE9C,sCAAsC;IACtC,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC7E,CAAC;AAtBD,wBAsBC;AAED;;GAEG;AACH,SAAS,OAAO,CAAC,KAAa,EAAE,EAAqB,EAAE,KAAa;IAClE,IAAI,EAAE,YAAY,MAAM;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC1D,OAAO,EAAE,CAAC,MAAM,CAAC,UAAC,KAAK,EAAE,EAAE,IAAK,OAAA,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,EAAxB,CAAwB,EAAE,KAAK,CAAC,CAAC;AACnE,CAAC","sourcesContent":["import { lowerCase } from \"lower-case\";\n\nexport interface Options {\n  splitRegexp?: RegExp | RegExp[];\n  stripRegexp?: RegExp | RegExp[];\n  delimiter?: string;\n  transform?: (part: string, index: number, parts: string[]) => string;\n}\n\n// Support camel case (\"camelCase\" -> \"camel Case\" and \"CAMELCase\" -> \"CAMEL Case\").\nconst DEFAULT_SPLIT_REGEXP = [/([a-z0-9])([A-Z])/g, /([A-Z])([A-Z][a-z])/g];\n\n// Remove all non-word characters.\nconst DEFAULT_STRIP_REGEXP = /[^A-Z0-9]+/gi;\n\n/**\n * Normalize the string into something other libraries can manipulate easier.\n */\nexport function noCase(input: string, options: Options = {}) {\n  const {\n    splitRegexp = DEFAULT_SPLIT_REGEXP,\n    stripRegexp = DEFAULT_STRIP_REGEXP,\n    transform = lowerCase,\n    delimiter = \" \",\n  } = options;\n\n  let result = replace(\n    replace(input, splitRegexp, \"$1\\0$2\"),\n    stripRegexp,\n    \"\\0\"\n  );\n  let start = 0;\n  let end = result.length;\n\n  // Trim the delimiter from around the output string.\n  while (result.charAt(start) === \"\\0\") start++;\n  while (result.charAt(end - 1) === \"\\0\") end--;\n\n  // Transform each token independently.\n  return result.slice(start, end).split(\"\\0\").map(transform).join(delimiter);\n}\n\n/**\n * Replace `re` in the input string with the replacement value.\n */\nfunction replace(input: string, re: RegExp | RegExp[], value: string) {\n  if (re instanceof RegExp) return input.replace(re, value);\n  return re.reduce((input, re) => input.replace(re, value), input);\n}\n"]}
      \ No newline at end of file
      diff --git a/node_modules/no-case/dist/index.spec.d.ts b/node_modules/no-case/dist/index.spec.d.ts
      new file mode 100644
      index 00000000..cb0ff5c3
      --- /dev/null
      +++ b/node_modules/no-case/dist/index.spec.d.ts
      @@ -0,0 +1 @@
      +export {};
      diff --git a/node_modules/no-case/dist/index.spec.js b/node_modules/no-case/dist/index.spec.js
      new file mode 100644
      index 00000000..199432c2
      --- /dev/null
      +++ b/node_modules/no-case/dist/index.spec.js
      @@ -0,0 +1,59 @@
      +"use strict";
      +Object.defineProperty(exports, "__esModule", { value: true });
      +var _1 = require(".");
      +var TEST_CASES = [
      +    // Single words.
      +    ["test", "test"],
      +    ["TEST", "test"],
      +    // Camel case.
      +    ["testString", "test string"],
      +    ["testString123", "test string123"],
      +    ["testString_1_2_3", "test string 1 2 3"],
      +    ["x_256", "x 256"],
      +    ["anHTMLTag", "an html tag"],
      +    ["ID123String", "id123 string"],
      +    ["Id123String", "id123 string"],
      +    ["foo bar123", "foo bar123"],
      +    ["a1bStar", "a1b star"],
      +    // Constant case.
      +    ["CONSTANT_CASE ", "constant case"],
      +    ["CONST123_FOO", "const123 foo"],
      +    // Random cases.
      +    ["FOO_bar", "foo bar"],
      +    ["XMLHttpRequest", "xml http request"],
      +    ["IQueryAArgs", "i query a args"],
      +    // Non-alphanumeric separators.
      +    ["dot.case", "dot case"],
      +    ["path/case", "path case"],
      +    ["snake_case", "snake case"],
      +    ["snake_case123", "snake case123"],
      +    ["snake_case_123", "snake case 123"],
      +    // Punctuation.
      +    ['"quotes"', "quotes"],
      +    // Space between number parts.
      +    ["version 0.45.0", "version 0 45 0"],
      +    ["version 0..78..9", "version 0 78 9"],
      +    ["version 4_99/4", "version 4 99 4"],
      +    // Whitespace.
      +    ["  test  ", "test"],
      +    // Number string input.
      +    ["something_2014_other", "something 2014 other"],
      +    // https://github.com/blakeembrey/change-case/issues/21
      +    ["amazon s3 data", "amazon s3 data"],
      +    ["foo_13_bar", "foo 13 bar"],
      +    // Customization.
      +    ["camel2019", "camel 2019", { splitRegexp: /([a-z])([A-Z0-9])/g }],
      +    ["minifyURLs", "minify urls", { splitRegexp: /([a-z])([A-Z0-9])/g }],
      +];
      +describe("no case", function () {
      +    var _loop_1 = function (input, result, options) {
      +        it(input + " -> " + result, function () {
      +            expect(_1.noCase(input, options)).toEqual(result);
      +        });
      +    };
      +    for (var _i = 0, TEST_CASES_1 = TEST_CASES; _i < TEST_CASES_1.length; _i++) {
      +        var _a = TEST_CASES_1[_i], input = _a[0], result = _a[1], options = _a[2];
      +        _loop_1(input, result, options);
      +    }
      +});
      +//# sourceMappingURL=index.spec.js.map
      \ No newline at end of file
      diff --git a/node_modules/no-case/dist/index.spec.js.map b/node_modules/no-case/dist/index.spec.js.map
      new file mode 100644
      index 00000000..1a0d9574
      --- /dev/null
      +++ b/node_modules/no-case/dist/index.spec.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"index.spec.js","sourceRoot":"","sources":["../src/index.spec.ts"],"names":[],"mappings":";;AAAA,sBAAoC;AAEpC,IAAM,UAAU,GAAiC;IAC/C,gBAAgB;IAChB,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,MAAM,EAAE,MAAM,CAAC;IAEhB,cAAc;IACd,CAAC,YAAY,EAAE,aAAa,CAAC;IAC7B,CAAC,eAAe,EAAE,gBAAgB,CAAC;IACnC,CAAC,kBAAkB,EAAE,mBAAmB,CAAC;IACzC,CAAC,OAAO,EAAE,OAAO,CAAC;IAClB,CAAC,WAAW,EAAE,aAAa,CAAC;IAC5B,CAAC,aAAa,EAAE,cAAc,CAAC;IAC/B,CAAC,aAAa,EAAE,cAAc,CAAC;IAC/B,CAAC,YAAY,EAAE,YAAY,CAAC;IAC5B,CAAC,SAAS,EAAE,UAAU,CAAC;IAEvB,iBAAiB;IACjB,CAAC,gBAAgB,EAAE,eAAe,CAAC;IACnC,CAAC,cAAc,EAAE,cAAc,CAAC;IAEhC,gBAAgB;IAChB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,gBAAgB,EAAE,kBAAkB,CAAC;IACtC,CAAC,aAAa,EAAE,gBAAgB,CAAC;IAEjC,+BAA+B;IAC/B,CAAC,UAAU,EAAE,UAAU,CAAC;IACxB,CAAC,WAAW,EAAE,WAAW,CAAC;IAC1B,CAAC,YAAY,EAAE,YAAY,CAAC;IAC5B,CAAC,eAAe,EAAE,eAAe,CAAC;IAClC,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAEpC,eAAe;IACf,CAAC,UAAU,EAAE,QAAQ,CAAC;IAEtB,8BAA8B;IAC9B,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IACpC,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;IACtC,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAEpC,cAAc;IACd,CAAC,UAAU,EAAE,MAAM,CAAC;IAEpB,uBAAuB;IACvB,CAAC,sBAAsB,EAAE,sBAAsB,CAAC;IAEhD,uDAAuD;IACvD,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IACpC,CAAC,YAAY,EAAE,YAAY,CAAC;IAE5B,iBAAiB;IACjB,CAAC,WAAW,EAAE,YAAY,EAAE,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC;IAClE,CAAC,YAAY,EAAE,aAAa,EAAE,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC;CACrE,CAAC;AAEF,QAAQ,CAAC,SAAS,EAAE;4BACN,KAAK,EAAE,MAAM,EAAE,OAAO;QAChC,EAAE,CAAI,KAAK,YAAO,MAAQ,EAAE;YAC1B,MAAM,CAAC,SAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;;IAHL,KAAuC,UAAU,EAAV,yBAAU,EAAV,wBAAU,EAAV,IAAU;QAAtC,IAAA,qBAAwB,EAAvB,KAAK,QAAA,EAAE,MAAM,QAAA,EAAE,OAAO,QAAA;gBAAtB,KAAK,EAAE,MAAM,EAAE,OAAO;KAIjC;AACH,CAAC,CAAC,CAAC","sourcesContent":["import { noCase, Options } from \".\";\n\nconst TEST_CASES: [string, string, Options?][] = [\n  // Single words.\n  [\"test\", \"test\"],\n  [\"TEST\", \"test\"],\n\n  // Camel case.\n  [\"testString\", \"test string\"],\n  [\"testString123\", \"test string123\"],\n  [\"testString_1_2_3\", \"test string 1 2 3\"],\n  [\"x_256\", \"x 256\"],\n  [\"anHTMLTag\", \"an html tag\"],\n  [\"ID123String\", \"id123 string\"],\n  [\"Id123String\", \"id123 string\"],\n  [\"foo bar123\", \"foo bar123\"],\n  [\"a1bStar\", \"a1b star\"],\n\n  // Constant case.\n  [\"CONSTANT_CASE \", \"constant case\"],\n  [\"CONST123_FOO\", \"const123 foo\"],\n\n  // Random cases.\n  [\"FOO_bar\", \"foo bar\"],\n  [\"XMLHttpRequest\", \"xml http request\"],\n  [\"IQueryAArgs\", \"i query a args\"],\n\n  // Non-alphanumeric separators.\n  [\"dot.case\", \"dot case\"],\n  [\"path/case\", \"path case\"],\n  [\"snake_case\", \"snake case\"],\n  [\"snake_case123\", \"snake case123\"],\n  [\"snake_case_123\", \"snake case 123\"],\n\n  // Punctuation.\n  ['\"quotes\"', \"quotes\"],\n\n  // Space between number parts.\n  [\"version 0.45.0\", \"version 0 45 0\"],\n  [\"version 0..78..9\", \"version 0 78 9\"],\n  [\"version 4_99/4\", \"version 4 99 4\"],\n\n  // Whitespace.\n  [\"  test  \", \"test\"],\n\n  // Number string input.\n  [\"something_2014_other\", \"something 2014 other\"],\n\n  // https://github.com/blakeembrey/change-case/issues/21\n  [\"amazon s3 data\", \"amazon s3 data\"],\n  [\"foo_13_bar\", \"foo 13 bar\"],\n\n  // Customization.\n  [\"camel2019\", \"camel 2019\", { splitRegexp: /([a-z])([A-Z0-9])/g }],\n  [\"minifyURLs\", \"minify urls\", { splitRegexp: /([a-z])([A-Z0-9])/g }],\n];\n\ndescribe(\"no case\", () => {\n  for (const [input, result, options] of TEST_CASES) {\n    it(`${input} -> ${result}`, () => {\n      expect(noCase(input, options)).toEqual(result);\n    });\n  }\n});\n"]}
      \ No newline at end of file
      diff --git a/node_modules/no-case/package.json b/node_modules/no-case/package.json
      new file mode 100644
      index 00000000..b2a4d67c
      --- /dev/null
      +++ b/node_modules/no-case/package.json
      @@ -0,0 +1,85 @@
      +{
      +  "name": "no-case",
      +  "version": "3.0.4",
      +  "description": "Transform into a lower cased string with spaces between words",
      +  "main": "dist/index.js",
      +  "typings": "dist/index.d.ts",
      +  "module": "dist.es2015/index.js",
      +  "sideEffects": false,
      +  "jsnext:main": "dist.es2015/index.js",
      +  "files": [
      +    "dist/",
      +    "dist.es2015/",
      +    "LICENSE"
      +  ],
      +  "scripts": {
      +    "lint": "tslint \"src/**/*\" --project tsconfig.json",
      +    "build": "rimraf dist/ dist.es2015/ && tsc && tsc -P tsconfig.es2015.json",
      +    "specs": "jest --coverage",
      +    "test": "npm run build && npm run lint && npm run specs",
      +    "size": "size-limit",
      +    "prepare": "npm run build"
      +  },
      +  "repository": {
      +    "type": "git",
      +    "url": "git://github.com/blakeembrey/change-case.git"
      +  },
      +  "keywords": [
      +    "no",
      +    "case",
      +    "space",
      +    "lower",
      +    "convert",
      +    "transform"
      +  ],
      +  "author": {
      +    "name": "Blake Embrey",
      +    "email": "hello@blakeembrey.com",
      +    "url": "http://blakeembrey.me"
      +  },
      +  "license": "MIT",
      +  "bugs": {
      +    "url": "https://github.com/blakeembrey/change-case/issues"
      +  },
      +  "homepage": "https://github.com/blakeembrey/change-case/tree/master/packages/no-case#readme",
      +  "size-limit": [
      +    {
      +      "path": "dist/index.js",
      +      "limit": "550 B"
      +    }
      +  ],
      +  "jest": {
      +    "roots": [
      +      "/src/"
      +    ],
      +    "transform": {
      +      "\\.tsx?$": "ts-jest"
      +    },
      +    "testRegex": "(/__tests__/.*|\\.(test|spec))\\.(tsx?|jsx?)$",
      +    "moduleFileExtensions": [
      +      "ts",
      +      "tsx",
      +      "js",
      +      "jsx",
      +      "json",
      +      "node"
      +    ]
      +  },
      +  "dependencies": {
      +    "lower-case": "^2.0.2",
      +    "tslib": "^2.0.3"
      +  },
      +  "devDependencies": {
      +    "@size-limit/preset-small-lib": "^2.2.1",
      +    "@types/jest": "^24.0.23",
      +    "@types/node": "^12.12.14",
      +    "jest": "^24.9.0",
      +    "rimraf": "^3.0.0",
      +    "ts-jest": "^24.2.0",
      +    "tslint": "^5.20.1",
      +    "tslint-config-prettier": "^1.18.0",
      +    "tslint-config-standard": "^9.0.0",
      +    "typescript": "^4.1.2"
      +  },
      +  "gitHead": "76a21a7f6f2a226521ef6abd345ff309cbd01fb0"
      +}
      diff --git a/node_modules/normalize-package-data/LICENSE b/node_modules/normalize-package-data/LICENSE
      new file mode 100644
      index 00000000..19d1364a
      --- /dev/null
      +++ b/node_modules/normalize-package-data/LICENSE
      @@ -0,0 +1,15 @@
      +This package contains code originally written by Isaac Z. Schlueter.
      +Used with permission.
      +
      +Copyright (c) Meryn Stol ("Author")
      +All rights reserved.
      +
      +The BSD License
      +
      +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
      +
      +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
      +
      +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
      +
      +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
      diff --git a/node_modules/normalize-package-data/README.md b/node_modules/normalize-package-data/README.md
      new file mode 100644
      index 00000000..58cbbcae
      --- /dev/null
      +++ b/node_modules/normalize-package-data/README.md
      @@ -0,0 +1,108 @@
      +# normalize-package-data
      +
      +[![Build Status](https://img.shields.io/github/actions/workflow/status/npm/normalize-package-data/ci.yml?branch=main)](https://github.com/npm/normalize-package-data)
      +
      +normalize-package-data exports a function that normalizes package metadata. This data is typically found in a package.json file, but in principle could come from any source - for example the npm registry.
      +
      +normalize-package-data is used by [read-package-json](https://npmjs.org/package/read-package-json) to normalize the data it reads from a package.json file. In turn, read-package-json is used by [npm](https://npmjs.org/package/npm) and various npm-related tools.
      +
      +## Installation
      +
      +```
      +npm install normalize-package-data
      +```
      +
      +## Usage
      +
      +Basic usage is really simple. You call the function that normalize-package-data exports. Let's call it `normalizeData`.
      +
      +```javascript
      +normalizeData = require('normalize-package-data')
      +packageData = require("./package.json")
      +normalizeData(packageData)
      +// packageData is now normalized
      +```
      +
      +#### Strict mode
      +
      +You may activate strict validation by passing true as the second argument.
      +
      +```javascript
      +normalizeData = require('normalize-package-data')
      +packageData = require("./package.json")
      +normalizeData(packageData, true)
      +// packageData is now normalized
      +```
      +
      +If strict mode is activated, only Semver 2.0 version strings are accepted. Otherwise, Semver 1.0 strings are accepted as well. Packages must have a name, and the name field must not have contain leading or trailing whitespace.
      +
      +#### Warnings
      +
      +Optionally, you may pass a "warning" function. It gets called whenever the `normalizeData` function encounters something that doesn't look right. It indicates less than perfect input data.
      +
      +```javascript
      +normalizeData = require('normalize-package-data')
      +packageData = require("./package.json")
      +warnFn = function(msg) { console.error(msg) }
      +normalizeData(packageData, warnFn)
      +// packageData is now normalized. Any number of warnings may have been logged.
      +```
      +
      +You may combine strict validation with warnings by passing `true` as the second argument, and `warnFn` as third.
      +
      +When `private` field is set to `true`, warnings will be suppressed.
      +
      +### Potential exceptions
      +
      +If the supplied data has an invalid name or version field, `normalizeData` will throw an error. Depending on where you call `normalizeData`, you may want to catch these errors so can pass them to a callback.
      +
      +## What normalization (currently) entails
      +
      +* The value of `name` field gets trimmed (unless in strict mode).
      +* The value of the `version` field gets cleaned by `semver.clean`. See [documentation for the semver module](https://github.com/isaacs/node-semver).
      +* If `name` and/or `version` fields are missing, they are set to empty strings.
      +* If `files` field is not an array, it will be removed.
      +* If `bin` field is a string, then `bin` field will become an object with `name` set to the value of the `name` field, and `bin` set to the original string value.
      +* If `man` field is a string, it will become an array with the original string as its sole member.
      +* If `keywords` field is string, it is considered to be a list of keywords separated by one or more white-space characters. It gets converted to an array by splitting on `\s+`.
      +* All people fields (`author`, `maintainers`, `contributors`) get converted into objects with name, email and url properties.
      +* If `bundledDependencies` field (a typo) exists and `bundleDependencies` field does not, `bundledDependencies` will get renamed to `bundleDependencies`.
      +* If the value of any of the dependencies fields  (`dependencies`, `devDependencies`, `optionalDependencies`) is a string, it gets converted into an object with familiar `name=>value` pairs.
      +* The values in `optionalDependencies` get added to `dependencies`. The `optionalDependencies` array is left untouched.
      +* As of v2: Dependencies that point at known hosted git providers (currently: github, bitbucket, gitlab) will have their URLs canonicalized, but protocols will be preserved.
      +* As of v2: Dependencies that use shortcuts for hosted git providers (`org/proj`, `github:org/proj`, `bitbucket:org/proj`, `gitlab:org/proj`, `gist:docid`) will have the shortcut left in place. (In the case of github, the `org/proj` form will be expanded to `github:org/proj`.) THIS MARKS A BREAKING CHANGE FROM V1, where the shortcut was previously expanded to a URL.
      +* If `description` field does not exist, but `readme` field does, then (more or less) the first paragraph of text that's found in the readme is taken as value for `description`.
      +* If `repository` field is a string, it will become an object with `url` set to the original string value, and `type` set to `"git"`.
      +* If `repository.url` is not a valid url, but in the style of "[owner-name]/[repo-name]", `repository.url` will be set to git+https://github.com/[owner-name]/[repo-name].git
      +* If `bugs` field is a string, the value of `bugs` field is changed into an object with `url` set to the original string value.
      +* If `bugs` field does not exist, but `repository` field points to a repository hosted on GitHub, the value of the `bugs` field gets set to an url in the form of https://github.com/[owner-name]/[repo-name]/issues . If the repository field points to a GitHub Gist repo url, the associated http url is chosen.
      +* If `bugs` field is an object, the resulting value only has email and url properties. If email and url properties are not strings, they are ignored. If no valid values for either email or url is found, bugs field will be removed.
      +* If `homepage` field is not a string, it will be removed.
      +* If the url in the `homepage` field does not specify a protocol, then http is assumed. For example, `myproject.org` will be changed to `http://myproject.org`.
      +* If `homepage` field does not exist, but `repository` field points to a repository hosted on GitHub, the value of the `homepage` field gets set to an url in the form of https://github.com/[owner-name]/[repo-name]#readme . If the repository field points to a GitHub Gist repo url, the associated http url is chosen.
      +
      +### Rules for name field
      +
      +If `name` field is given, the value of the name field must be a string. The string may not:
      +
      +* start with a period.
      +* contain the following characters: `/@\s+%`
      +* contain any characters that would need to be encoded for use in urls.
      +* resemble the word `node_modules` or `favicon.ico` (case doesn't matter).
      +
      +### Rules for version field
      +
      +If `version` field is given, the value of the version field must be a valid *semver* string, as determined by the `semver.valid` method. See [documentation for the semver module](https://github.com/isaacs/node-semver).
      +
      +### Rules for license field
      +
      +The `license`/`licence` field should be a valid *SPDX license expression* or one of the special values allowed by [validate-npm-package-license](https://npmjs.com/package/validate-npm-package-license). See [documentation for the license field in package.json](https://docs.npmjs.com/files/package.json#license).
      +
      +## Credits
      +
      +This package contains code based on read-package-json written by Isaac Z. Schlueter. Used with permission.
      +
      +## License
      +
      +normalize-package-data is released under the [BSD 2-Clause License](https://opensource.org/licenses/BSD-2-Clause).
      +Copyright (c) 2013 Meryn Stol
      diff --git a/node_modules/normalize-package-data/lib/extract_description.js b/node_modules/normalize-package-data/lib/extract_description.js
      new file mode 100644
      index 00000000..631966b5
      --- /dev/null
      +++ b/node_modules/normalize-package-data/lib/extract_description.js
      @@ -0,0 +1,24 @@
      +module.exports = extractDescription
      +
      +// Extracts description from contents of a readme file in markdown format
      +function extractDescription (d) {
      +  if (!d) {
      +    return
      +  }
      +  if (d === 'ERROR: No README data found!') {
      +    return
      +  }
      +  // the first block of text before the first heading
      +  // that isn't the first line heading
      +  d = d.trim().split('\n')
      +  let s = 0
      +  while (d[s] && d[s].trim().match(/^(#|$)/)) {
      +    s++
      +  }
      +  const l = d.length
      +  let e = s + 1
      +  while (e < l && d[e].trim()) {
      +    e++
      +  }
      +  return d.slice(s, e).join(' ').trim()
      +}
      diff --git a/node_modules/normalize-package-data/lib/fixer.js b/node_modules/normalize-package-data/lib/fixer.js
      new file mode 100644
      index 00000000..49b97f5e
      --- /dev/null
      +++ b/node_modules/normalize-package-data/lib/fixer.js
      @@ -0,0 +1,472 @@
      +var { URL } = require('node:url')
      +var isValidSemver = require('semver/functions/valid')
      +var cleanSemver = require('semver/functions/clean')
      +var validateLicense = require('validate-npm-package-license')
      +var hostedGitInfo = require('hosted-git-info')
      +var { isBuiltin } = require('node:module')
      +var depTypes = ['dependencies', 'devDependencies', 'optionalDependencies']
      +var extractDescription = require('./extract_description')
      +var typos = require('./typos.json')
      +
      +var isEmail = str => str.includes('@') && (str.indexOf('@') < str.lastIndexOf('.'))
      +
      +module.exports = {
      +  // default warning function
      +  warn: function () {},
      +
      +  fixRepositoryField: function (data) {
      +    if (data.repositories) {
      +      this.warn('repositories')
      +      data.repository = data.repositories[0]
      +    }
      +    if (!data.repository) {
      +      return this.warn('missingRepository')
      +    }
      +    if (typeof data.repository === 'string') {
      +      data.repository = {
      +        type: 'git',
      +        url: data.repository,
      +      }
      +    }
      +    var r = data.repository.url || ''
      +    if (r) {
      +      var hosted = hostedGitInfo.fromUrl(r)
      +      if (hosted) {
      +        r = data.repository.url
      +          = hosted.getDefaultRepresentation() === 'shortcut' ? hosted.https() : hosted.toString()
      +      }
      +    }
      +
      +    if (r.match(/github.com\/[^/]+\/[^/]+\.git\.git$/)) {
      +      this.warn('brokenGitUrl', r)
      +    }
      +  },
      +
      +  fixTypos: function (data) {
      +    Object.keys(typos.topLevel).forEach(function (d) {
      +      if (Object.prototype.hasOwnProperty.call(data, d)) {
      +        this.warn('typo', d, typos.topLevel[d])
      +      }
      +    }, this)
      +  },
      +
      +  fixScriptsField: function (data) {
      +    if (!data.scripts) {
      +      return
      +    }
      +    if (typeof data.scripts !== 'object') {
      +      this.warn('nonObjectScripts')
      +      delete data.scripts
      +      return
      +    }
      +    Object.keys(data.scripts).forEach(function (k) {
      +      if (typeof data.scripts[k] !== 'string') {
      +        this.warn('nonStringScript')
      +        delete data.scripts[k]
      +      } else if (typos.script[k] && !data.scripts[typos.script[k]]) {
      +        this.warn('typo', k, typos.script[k], 'scripts')
      +      }
      +    }, this)
      +  },
      +
      +  fixFilesField: function (data) {
      +    var files = data.files
      +    if (files && !Array.isArray(files)) {
      +      this.warn('nonArrayFiles')
      +      delete data.files
      +    } else if (data.files) {
      +      data.files = data.files.filter(function (file) {
      +        if (!file || typeof file !== 'string') {
      +          this.warn('invalidFilename', file)
      +          return false
      +        } else {
      +          return true
      +        }
      +      }, this)
      +    }
      +  },
      +
      +  fixBinField: function (data) {
      +    if (!data.bin) {
      +      return
      +    }
      +    if (typeof data.bin === 'string') {
      +      var b = {}
      +      var match
      +      if (match = data.name.match(/^@[^/]+[/](.*)$/)) {
      +        b[match[1]] = data.bin
      +      } else {
      +        b[data.name] = data.bin
      +      }
      +      data.bin = b
      +    }
      +  },
      +
      +  fixManField: function (data) {
      +    if (!data.man) {
      +      return
      +    }
      +    if (typeof data.man === 'string') {
      +      data.man = [data.man]
      +    }
      +  },
      +  fixBundleDependenciesField: function (data) {
      +    var bdd = 'bundledDependencies'
      +    var bd = 'bundleDependencies'
      +    if (data[bdd] && !data[bd]) {
      +      data[bd] = data[bdd]
      +      delete data[bdd]
      +    }
      +    if (data[bd] && !Array.isArray(data[bd])) {
      +      this.warn('nonArrayBundleDependencies')
      +      delete data[bd]
      +    } else if (data[bd]) {
      +      data[bd] = data[bd].filter(function (filtered) {
      +        if (!filtered || typeof filtered !== 'string') {
      +          this.warn('nonStringBundleDependency', filtered)
      +          return false
      +        } else {
      +          if (!data.dependencies) {
      +            data.dependencies = {}
      +          }
      +          if (!Object.prototype.hasOwnProperty.call(data.dependencies, filtered)) {
      +            this.warn('nonDependencyBundleDependency', filtered)
      +            data.dependencies[filtered] = '*'
      +          }
      +          return true
      +        }
      +      }, this)
      +    }
      +  },
      +
      +  fixDependencies: function (data) {
      +    objectifyDeps(data, this.warn)
      +    addOptionalDepsToDeps(data, this.warn)
      +    this.fixBundleDependenciesField(data)
      +
      +    ;['dependencies', 'devDependencies'].forEach(function (deps) {
      +      if (!(deps in data)) {
      +        return
      +      }
      +      if (!data[deps] || typeof data[deps] !== 'object') {
      +        this.warn('nonObjectDependencies', deps)
      +        delete data[deps]
      +        return
      +      }
      +      Object.keys(data[deps]).forEach(function (d) {
      +        var r = data[deps][d]
      +        if (typeof r !== 'string') {
      +          this.warn('nonStringDependency', d, JSON.stringify(r))
      +          delete data[deps][d]
      +        }
      +        var hosted = hostedGitInfo.fromUrl(data[deps][d])
      +        if (hosted) {
      +          data[deps][d] = hosted.toString()
      +        }
      +      }, this)
      +    }, this)
      +  },
      +
      +  fixModulesField: function (data) {
      +    if (data.modules) {
      +      this.warn('deprecatedModules')
      +      delete data.modules
      +    }
      +  },
      +
      +  fixKeywordsField: function (data) {
      +    if (typeof data.keywords === 'string') {
      +      data.keywords = data.keywords.split(/,\s+/)
      +    }
      +    if (data.keywords && !Array.isArray(data.keywords)) {
      +      delete data.keywords
      +      this.warn('nonArrayKeywords')
      +    } else if (data.keywords) {
      +      data.keywords = data.keywords.filter(function (kw) {
      +        if (typeof kw !== 'string' || !kw) {
      +          this.warn('nonStringKeyword')
      +          return false
      +        } else {
      +          return true
      +        }
      +      }, this)
      +    }
      +  },
      +
      +  fixVersionField: function (data, strict) {
      +    // allow "loose" semver 1.0 versions in non-strict mode
      +    // enforce strict semver 2.0 compliance in strict mode
      +    var loose = !strict
      +    if (!data.version) {
      +      data.version = ''
      +      return true
      +    }
      +    if (!isValidSemver(data.version, loose)) {
      +      throw new Error('Invalid version: "' + data.version + '"')
      +    }
      +    data.version = cleanSemver(data.version, loose)
      +    return true
      +  },
      +
      +  fixPeople: function (data) {
      +    modifyPeople(data, unParsePerson)
      +    modifyPeople(data, parsePerson)
      +  },
      +
      +  fixNameField: function (data, options) {
      +    if (typeof options === 'boolean') {
      +      options = { strict: options }
      +    } else if (typeof options === 'undefined') {
      +      options = {}
      +    }
      +    var strict = options.strict
      +    if (!data.name && !strict) {
      +      data.name = ''
      +      return
      +    }
      +    if (typeof data.name !== 'string') {
      +      throw new Error('name field must be a string.')
      +    }
      +    if (!strict) {
      +      data.name = data.name.trim()
      +    }
      +    ensureValidName(data.name, strict, options.allowLegacyCase)
      +    if (isBuiltin(data.name)) {
      +      this.warn('conflictingName', data.name)
      +    }
      +  },
      +
      +  fixDescriptionField: function (data) {
      +    if (data.description && typeof data.description !== 'string') {
      +      this.warn('nonStringDescription')
      +      delete data.description
      +    }
      +    if (data.readme && !data.description) {
      +      data.description = extractDescription(data.readme)
      +    }
      +    if (data.description === undefined) {
      +      delete data.description
      +    }
      +    if (!data.description) {
      +      this.warn('missingDescription')
      +    }
      +  },
      +
      +  fixReadmeField: function (data) {
      +    if (!data.readme) {
      +      this.warn('missingReadme')
      +      data.readme = 'ERROR: No README data found!'
      +    }
      +  },
      +
      +  fixBugsField: function (data) {
      +    if (!data.bugs && data.repository && data.repository.url) {
      +      var hosted = hostedGitInfo.fromUrl(data.repository.url)
      +      if (hosted && hosted.bugs()) {
      +        data.bugs = { url: hosted.bugs() }
      +      }
      +    } else if (data.bugs) {
      +      if (typeof data.bugs === 'string') {
      +        if (isEmail(data.bugs)) {
      +          data.bugs = { email: data.bugs }
      +        } else if (URL.canParse(data.bugs)) {
      +          data.bugs = { url: data.bugs }
      +        } else {
      +          this.warn('nonEmailUrlBugsString')
      +        }
      +      } else {
      +        bugsTypos(data.bugs, this.warn)
      +        var oldBugs = data.bugs
      +        data.bugs = {}
      +        if (oldBugs.url) {
      +          if (URL.canParse(oldBugs.url)) {
      +            data.bugs.url = oldBugs.url
      +          } else {
      +            this.warn('nonUrlBugsUrlField')
      +          }
      +        }
      +        if (oldBugs.email) {
      +          if (typeof (oldBugs.email) === 'string' && isEmail(oldBugs.email)) {
      +            data.bugs.email = oldBugs.email
      +          } else {
      +            this.warn('nonEmailBugsEmailField')
      +          }
      +        }
      +      }
      +      if (!data.bugs.email && !data.bugs.url) {
      +        delete data.bugs
      +        this.warn('emptyNormalizedBugs')
      +      }
      +    }
      +  },
      +
      +  fixHomepageField: function (data) {
      +    if (!data.homepage && data.repository && data.repository.url) {
      +      var hosted = hostedGitInfo.fromUrl(data.repository.url)
      +      if (hosted && hosted.docs()) {
      +        data.homepage = hosted.docs()
      +      }
      +    }
      +    if (!data.homepage) {
      +      return
      +    }
      +
      +    if (typeof data.homepage !== 'string') {
      +      this.warn('nonUrlHomepage')
      +      return delete data.homepage
      +    }
      +    if (!URL.canParse(data.homepage)) {
      +      data.homepage = 'http://' + data.homepage
      +    }
      +  },
      +
      +  fixLicenseField: function (data) {
      +    const license = data.license || data.licence
      +    if (!license) {
      +      return this.warn('missingLicense')
      +    }
      +    if (
      +      typeof (license) !== 'string' ||
      +      license.length < 1 ||
      +      license.trim() === ''
      +    ) {
      +      return this.warn('invalidLicense')
      +    }
      +    if (!validateLicense(license).validForNewPackages) {
      +      return this.warn('invalidLicense')
      +    }
      +  },
      +}
      +
      +function isValidScopedPackageName (spec) {
      +  if (spec.charAt(0) !== '@') {
      +    return false
      +  }
      +
      +  var rest = spec.slice(1).split('/')
      +  if (rest.length !== 2) {
      +    return false
      +  }
      +
      +  return rest[0] && rest[1] &&
      +    rest[0] === encodeURIComponent(rest[0]) &&
      +    rest[1] === encodeURIComponent(rest[1])
      +}
      +
      +function isCorrectlyEncodedName (spec) {
      +  return !spec.match(/[/@\s+%:]/) &&
      +    spec === encodeURIComponent(spec)
      +}
      +
      +function ensureValidName (name, strict, allowLegacyCase) {
      +  if (name.charAt(0) === '.' ||
      +      !(isValidScopedPackageName(name) || isCorrectlyEncodedName(name)) ||
      +      (strict && (!allowLegacyCase) && name !== name.toLowerCase()) ||
      +      name.toLowerCase() === 'node_modules' ||
      +      name.toLowerCase() === 'favicon.ico') {
      +    throw new Error('Invalid name: ' + JSON.stringify(name))
      +  }
      +}
      +
      +function modifyPeople (data, fn) {
      +  if (data.author) {
      +    data.author = fn(data.author)
      +  }['maintainers', 'contributors'].forEach(function (set) {
      +    if (!Array.isArray(data[set])) {
      +      return
      +    }
      +    data[set] = data[set].map(fn)
      +  })
      +  return data
      +}
      +
      +function unParsePerson (person) {
      +  if (typeof person === 'string') {
      +    return person
      +  }
      +  var name = person.name || ''
      +  var u = person.url || person.web
      +  var wrappedUrl = u ? (' (' + u + ')') : ''
      +  var e = person.email || person.mail
      +  var wrappedEmail = e ? (' <' + e + '>') : ''
      +  return name + wrappedEmail + wrappedUrl
      +}
      +
      +function parsePerson (person) {
      +  if (typeof person !== 'string') {
      +    return person
      +  }
      +  var matchedName = person.match(/^([^(<]+)/)
      +  var matchedUrl = person.match(/\(([^()]+)\)/)
      +  var matchedEmail = person.match(/<([^<>]+)>/)
      +  var obj = {}
      +  if (matchedName && matchedName[0].trim()) {
      +    obj.name = matchedName[0].trim()
      +  }
      +  if (matchedEmail) {
      +    obj.email = matchedEmail[1]
      +  }
      +  if (matchedUrl) {
      +    obj.url = matchedUrl[1]
      +  }
      +  return obj
      +}
      +
      +function addOptionalDepsToDeps (data) {
      +  var o = data.optionalDependencies
      +  if (!o) {
      +    return
      +  }
      +  var d = data.dependencies || {}
      +  Object.keys(o).forEach(function (k) {
      +    d[k] = o[k]
      +  })
      +  data.dependencies = d
      +}
      +
      +function depObjectify (deps, type, warn) {
      +  if (!deps) {
      +    return {}
      +  }
      +  if (typeof deps === 'string') {
      +    deps = deps.trim().split(/[\n\r\s\t ,]+/)
      +  }
      +  if (!Array.isArray(deps)) {
      +    return deps
      +  }
      +  warn('deprecatedArrayDependencies', type)
      +  var o = {}
      +  deps.filter(function (d) {
      +    return typeof d === 'string'
      +  }).forEach(function (d) {
      +    d = d.trim().split(/(:?[@\s><=])/)
      +    var dn = d.shift()
      +    var dv = d.join('')
      +    dv = dv.trim()
      +    dv = dv.replace(/^@/, '')
      +    o[dn] = dv
      +  })
      +  return o
      +}
      +
      +function objectifyDeps (data, warn) {
      +  depTypes.forEach(function (type) {
      +    if (!data[type]) {
      +      return
      +    }
      +    data[type] = depObjectify(data[type], type, warn)
      +  })
      +}
      +
      +function bugsTypos (bugs, warn) {
      +  if (!bugs) {
      +    return
      +  }
      +  Object.keys(bugs).forEach(function (k) {
      +    if (typos.bugs[k]) {
      +      warn('typo', k, typos.bugs[k], 'bugs')
      +      bugs[typos.bugs[k]] = bugs[k]
      +      delete bugs[k]
      +    }
      +  })
      +}
      diff --git a/node_modules/normalize-package-data/lib/make_warning.js b/node_modules/normalize-package-data/lib/make_warning.js
      new file mode 100644
      index 00000000..3be9c865
      --- /dev/null
      +++ b/node_modules/normalize-package-data/lib/make_warning.js
      @@ -0,0 +1,22 @@
      +var util = require('util')
      +var messages = require('./warning_messages.json')
      +
      +module.exports = function () {
      +  var args = Array.prototype.slice.call(arguments, 0)
      +  var warningName = args.shift()
      +  if (warningName === 'typo') {
      +    return makeTypoWarning.apply(null, args)
      +  } else {
      +    var msgTemplate = messages[warningName] ? messages[warningName] : warningName + ": '%s'"
      +    args.unshift(msgTemplate)
      +    return util.format.apply(null, args)
      +  }
      +}
      +
      +function makeTypoWarning (providedName, probableName, field) {
      +  if (field) {
      +    providedName = field + "['" + providedName + "']"
      +    probableName = field + "['" + probableName + "']"
      +  }
      +  return util.format(messages.typo, providedName, probableName)
      +}
      diff --git a/node_modules/normalize-package-data/lib/normalize.js b/node_modules/normalize-package-data/lib/normalize.js
      new file mode 100644
      index 00000000..e806f110
      --- /dev/null
      +++ b/node_modules/normalize-package-data/lib/normalize.js
      @@ -0,0 +1,48 @@
      +module.exports = normalize
      +
      +var fixer = require('./fixer')
      +normalize.fixer = fixer
      +
      +var makeWarning = require('./make_warning')
      +
      +var fieldsToFix = ['name', 'version', 'description', 'repository', 'modules', 'scripts',
      +  'files', 'bin', 'man', 'bugs', 'keywords', 'readme', 'homepage', 'license']
      +var otherThingsToFix = ['dependencies', 'people', 'typos']
      +
      +var thingsToFix = fieldsToFix.map(function (fieldName) {
      +  return ucFirst(fieldName) + 'Field'
      +})
      +// two ways to do this in CoffeeScript on only one line, sub-70 chars:
      +// thingsToFix = fieldsToFix.map (name) -> ucFirst(name) + "Field"
      +// thingsToFix = (ucFirst(name) + "Field" for name in fieldsToFix)
      +thingsToFix = thingsToFix.concat(otherThingsToFix)
      +
      +function normalize (data, warn, strict) {
      +  if (warn === true) {
      +    warn = null
      +    strict = true
      +  }
      +  if (!strict) {
      +    strict = false
      +  }
      +  if (!warn || data.private) {
      +    warn = function () { /* noop */ }
      +  }
      +
      +  if (data.scripts &&
      +      data.scripts.install === 'node-gyp rebuild' &&
      +      !data.scripts.preinstall) {
      +    data.gypfile = true
      +  }
      +  fixer.warn = function () {
      +    warn(makeWarning.apply(null, arguments))
      +  }
      +  thingsToFix.forEach(function (thingName) {
      +    fixer['fix' + ucFirst(thingName)](data, strict)
      +  })
      +  data._id = data.name + '@' + data.version
      +}
      +
      +function ucFirst (string) {
      +  return string.charAt(0).toUpperCase() + string.slice(1)
      +}
      diff --git a/node_modules/normalize-package-data/lib/safe_format.js b/node_modules/normalize-package-data/lib/safe_format.js
      new file mode 100644
      index 00000000..5fc888e5
      --- /dev/null
      +++ b/node_modules/normalize-package-data/lib/safe_format.js
      @@ -0,0 +1,11 @@
      +var util = require('util')
      +
      +module.exports = function () {
      +  var args = Array.prototype.slice.call(arguments, 0)
      +  args.forEach(function (arg) {
      +    if (!arg) {
      +      throw new TypeError('Bad arguments.')
      +    }
      +  })
      +  return util.format.apply(null, arguments)
      +}
      diff --git a/node_modules/normalize-package-data/lib/typos.json b/node_modules/normalize-package-data/lib/typos.json
      new file mode 100644
      index 00000000..7f9dd283
      --- /dev/null
      +++ b/node_modules/normalize-package-data/lib/typos.json
      @@ -0,0 +1,25 @@
      +{
      +  "topLevel": {
      +    "dependancies": "dependencies"
      +   ,"dependecies": "dependencies"
      +   ,"depdenencies": "dependencies"
      +   ,"devEependencies": "devDependencies"
      +   ,"depends": "dependencies"
      +   ,"dev-dependencies": "devDependencies"
      +   ,"devDependences": "devDependencies"
      +   ,"devDepenencies": "devDependencies"
      +   ,"devdependencies": "devDependencies"
      +   ,"repostitory": "repository"
      +   ,"repo": "repository"
      +   ,"prefereGlobal": "preferGlobal"
      +   ,"hompage": "homepage"
      +   ,"hampage": "homepage"
      +   ,"autohr": "author"
      +   ,"autor": "author"
      +   ,"contributers": "contributors"
      +   ,"publicationConfig": "publishConfig"
      +   ,"script": "scripts"
      +  },
      +  "bugs": { "web": "url", "name": "url" },
      +  "script": { "server": "start", "tests": "test" }
      +}
      diff --git a/node_modules/normalize-package-data/lib/warning_messages.json b/node_modules/normalize-package-data/lib/warning_messages.json
      new file mode 100644
      index 00000000..4890f506
      --- /dev/null
      +++ b/node_modules/normalize-package-data/lib/warning_messages.json
      @@ -0,0 +1,30 @@
      +{
      +  "repositories": "'repositories' (plural) Not supported. Please pick one as the 'repository' field"
      +  ,"missingRepository": "No repository field."
      +  ,"brokenGitUrl": "Probably broken git url: %s"
      +  ,"nonObjectScripts": "scripts must be an object"
      +  ,"nonStringScript": "script values must be string commands"
      +  ,"nonArrayFiles": "Invalid 'files' member"
      +  ,"invalidFilename": "Invalid filename in 'files' list: %s"
      +  ,"nonArrayBundleDependencies": "Invalid 'bundleDependencies' list. Must be array of package names"
      +  ,"nonStringBundleDependency": "Invalid bundleDependencies member: %s"
      +  ,"nonDependencyBundleDependency": "Non-dependency in bundleDependencies: %s"
      +  ,"nonObjectDependencies": "%s field must be an object"
      +  ,"nonStringDependency": "Invalid dependency: %s %s"
      +  ,"deprecatedArrayDependencies": "specifying %s as array is deprecated"
      +  ,"deprecatedModules": "modules field is deprecated"
      +  ,"nonArrayKeywords": "keywords should be an array of strings"
      +  ,"nonStringKeyword": "keywords should be an array of strings"
      +  ,"conflictingName": "%s is also the name of a node core module."
      +  ,"nonStringDescription": "'description' field should be a string"
      +  ,"missingDescription": "No description"
      +  ,"missingReadme": "No README data"
      +  ,"missingLicense": "No license field."
      +  ,"nonEmailUrlBugsString": "Bug string field must be url, email, or {email,url}"
      +  ,"nonUrlBugsUrlField": "bugs.url field must be a string url. Deleted."
      +  ,"nonEmailBugsEmailField": "bugs.email field must be a string email. Deleted."
      +  ,"emptyNormalizedBugs": "Normalized value of bugs field is an empty object. Deleted."
      +  ,"nonUrlHomepage": "homepage field must be a string url. Deleted."
      +  ,"invalidLicense": "license should be a valid SPDX license expression"
      +  ,"typo": "%s should probably be %s."
      +}
      diff --git a/node_modules/normalize-package-data/package.json b/node_modules/normalize-package-data/package.json
      new file mode 100644
      index 00000000..e4fbdddc
      --- /dev/null
      +++ b/node_modules/normalize-package-data/package.json
      @@ -0,0 +1,56 @@
      +{
      +  "name": "normalize-package-data",
      +  "version": "8.0.0",
      +  "author": "GitHub Inc.",
      +  "description": "Normalizes data that can be found in package.json files.",
      +  "license": "BSD-2-Clause",
      +  "repository": {
      +    "type": "git",
      +    "url": "git+https://github.com/npm/normalize-package-data.git"
      +  },
      +  "main": "lib/normalize.js",
      +  "scripts": {
      +    "test": "tap",
      +    "npmclilint": "npmcli-lint",
      +    "lint": "npm run eslint",
      +    "lintfix": "npm run eslint -- --fix",
      +    "posttest": "npm run lint",
      +    "postsnap": "npm run lintfix --",
      +    "postlint": "template-oss-check",
      +    "snap": "tap",
      +    "template-oss-apply": "template-oss-apply --force",
      +    "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\""
      +  },
      +  "dependencies": {
      +    "hosted-git-info": "^9.0.0",
      +    "semver": "^7.3.5",
      +    "validate-npm-package-license": "^3.0.4"
      +  },
      +  "devDependencies": {
      +    "@npmcli/eslint-config": "^5.0.0",
      +    "@npmcli/template-oss": "4.25.0",
      +    "tap": "^16.0.1"
      +  },
      +  "files": [
      +    "bin/",
      +    "lib/"
      +  ],
      +  "engines": {
      +    "node": "^20.17.0 || >=22.9.0"
      +  },
      +  "templateOSS": {
      +    "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
      +    "version": "4.25.0",
      +    "publish": "true"
      +  },
      +  "tap": {
      +    "branches": 86,
      +    "functions": 92,
      +    "lines": 86,
      +    "statements": 86,
      +    "nyc-arg": [
      +      "--exclude",
      +      "tap-snapshots/**"
      +    ]
      +  }
      +}
      diff --git a/node_modules/object-assign/index.js b/node_modules/object-assign/index.js
      new file mode 100644
      index 00000000..0930cf88
      --- /dev/null
      +++ b/node_modules/object-assign/index.js
      @@ -0,0 +1,90 @@
      +/*
      +object-assign
      +(c) Sindre Sorhus
      +@license MIT
      +*/
      +
      +'use strict';
      +/* eslint-disable no-unused-vars */
      +var getOwnPropertySymbols = Object.getOwnPropertySymbols;
      +var hasOwnProperty = Object.prototype.hasOwnProperty;
      +var propIsEnumerable = Object.prototype.propertyIsEnumerable;
      +
      +function toObject(val) {
      +	if (val === null || val === undefined) {
      +		throw new TypeError('Object.assign cannot be called with null or undefined');
      +	}
      +
      +	return Object(val);
      +}
      +
      +function shouldUseNative() {
      +	try {
      +		if (!Object.assign) {
      +			return false;
      +		}
      +
      +		// Detect buggy property enumeration order in older V8 versions.
      +
      +		// https://bugs.chromium.org/p/v8/issues/detail?id=4118
      +		var test1 = new String('abc');  // eslint-disable-line no-new-wrappers
      +		test1[5] = 'de';
      +		if (Object.getOwnPropertyNames(test1)[0] === '5') {
      +			return false;
      +		}
      +
      +		// https://bugs.chromium.org/p/v8/issues/detail?id=3056
      +		var test2 = {};
      +		for (var i = 0; i < 10; i++) {
      +			test2['_' + String.fromCharCode(i)] = i;
      +		}
      +		var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
      +			return test2[n];
      +		});
      +		if (order2.join('') !== '0123456789') {
      +			return false;
      +		}
      +
      +		// https://bugs.chromium.org/p/v8/issues/detail?id=3056
      +		var test3 = {};
      +		'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
      +			test3[letter] = letter;
      +		});
      +		if (Object.keys(Object.assign({}, test3)).join('') !==
      +				'abcdefghijklmnopqrst') {
      +			return false;
      +		}
      +
      +		return true;
      +	} catch (err) {
      +		// We don't expect any of the above to throw, but better to be safe.
      +		return false;
      +	}
      +}
      +
      +module.exports = shouldUseNative() ? Object.assign : function (target, source) {
      +	var from;
      +	var to = toObject(target);
      +	var symbols;
      +
      +	for (var s = 1; s < arguments.length; s++) {
      +		from = Object(arguments[s]);
      +
      +		for (var key in from) {
      +			if (hasOwnProperty.call(from, key)) {
      +				to[key] = from[key];
      +			}
      +		}
      +
      +		if (getOwnPropertySymbols) {
      +			symbols = getOwnPropertySymbols(from);
      +			for (var i = 0; i < symbols.length; i++) {
      +				if (propIsEnumerable.call(from, symbols[i])) {
      +					to[symbols[i]] = from[symbols[i]];
      +				}
      +			}
      +		}
      +	}
      +
      +	return to;
      +};
      diff --git a/node_modules/object-assign/license b/node_modules/object-assign/license
      new file mode 100644
      index 00000000..654d0bfe
      --- /dev/null
      +++ b/node_modules/object-assign/license
      @@ -0,0 +1,21 @@
      +The MIT License (MIT)
      +
      +Copyright (c) Sindre Sorhus  (sindresorhus.com)
      +
      +Permission is hereby granted, free of charge, to any person obtaining a copy
      +of this software and associated documentation files (the "Software"), to deal
      +in the Software without restriction, including without limitation the rights
      +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
      +copies of the Software, and to permit persons to whom the Software is
      +furnished to do so, subject to the following conditions:
      +
      +The above copyright notice and this permission notice shall be included in
      +all copies or substantial portions of the Software.
      +
      +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
      +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
      +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
      +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
      +THE SOFTWARE.
      diff --git a/node_modules/object-assign/package.json b/node_modules/object-assign/package.json
      new file mode 100644
      index 00000000..503eb1e6
      --- /dev/null
      +++ b/node_modules/object-assign/package.json
      @@ -0,0 +1,42 @@
      +{
      +  "name": "object-assign",
      +  "version": "4.1.1",
      +  "description": "ES2015 `Object.assign()` ponyfill",
      +  "license": "MIT",
      +  "repository": "sindresorhus/object-assign",
      +  "author": {
      +    "name": "Sindre Sorhus",
      +    "email": "sindresorhus@gmail.com",
      +    "url": "sindresorhus.com"
      +  },
      +  "engines": {
      +    "node": ">=0.10.0"
      +  },
      +  "scripts": {
      +    "test": "xo && ava",
      +    "bench": "matcha bench.js"
      +  },
      +  "files": [
      +    "index.js"
      +  ],
      +  "keywords": [
      +    "object",
      +    "assign",
      +    "extend",
      +    "properties",
      +    "es2015",
      +    "ecmascript",
      +    "harmony",
      +    "ponyfill",
      +    "prollyfill",
      +    "polyfill",
      +    "shim",
      +    "browser"
      +  ],
      +  "devDependencies": {
      +    "ava": "^0.16.0",
      +    "lodash": "^4.16.4",
      +    "matcha": "^0.7.0",
      +    "xo": "^0.16.0"
      +  }
      +}
      diff --git a/node_modules/object-assign/readme.md b/node_modules/object-assign/readme.md
      new file mode 100644
      index 00000000..1be09d35
      --- /dev/null
      +++ b/node_modules/object-assign/readme.md
      @@ -0,0 +1,61 @@
      +# object-assign [![Build Status](https://travis-ci.org/sindresorhus/object-assign.svg?branch=master)](https://travis-ci.org/sindresorhus/object-assign)
      +
      +> ES2015 [`Object.assign()`](http://www.2ality.com/2014/01/object-assign.html) [ponyfill](https://ponyfill.com)
      +
      +
      +## Use the built-in
      +
      +Node.js 4 and up, as well as every evergreen browser (Chrome, Edge, Firefox, Opera, Safari),
      +support `Object.assign()` :tada:. If you target only those environments, then by all
      +means, use `Object.assign()` instead of this package.
      +
      +
      +## Install
      +
      +```
      +$ npm install --save object-assign
      +```
      +
      +
      +## Usage
      +
      +```js
      +const objectAssign = require('object-assign');
      +
      +objectAssign({foo: 0}, {bar: 1});
      +//=> {foo: 0, bar: 1}
      +
      +// multiple sources
      +objectAssign({foo: 0}, {bar: 1}, {baz: 2});
      +//=> {foo: 0, bar: 1, baz: 2}
      +
      +// overwrites equal keys
      +objectAssign({foo: 0}, {foo: 1}, {foo: 2});
      +//=> {foo: 2}
      +
      +// ignores null and undefined sources
      +objectAssign({foo: 0}, null, {bar: 1}, undefined);
      +//=> {foo: 0, bar: 1}
      +```
      +
      +
      +## API
      +
      +### objectAssign(target, [source, ...])
      +
      +Assigns enumerable own properties of `source` objects to the `target` object and returns the `target` object. Additional `source` objects will overwrite previous ones.
      +
      +
      +## Resources
      +
      +- [ES2015 spec - Object.assign](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign)
      +
      +
      +## Related
      +
      +- [deep-assign](https://github.com/sindresorhus/deep-assign) - Recursive `Object.assign()`
      +
      +
      +## License
      +
      +MIT © [Sindre Sorhus](https://sindresorhus.com)
      diff --git a/node_modules/pad-right/LICENSE b/node_modules/pad-right/LICENSE
      new file mode 100644
      index 00000000..b576e8d4
      --- /dev/null
      +++ b/node_modules/pad-right/LICENSE
      @@ -0,0 +1,21 @@
      +The MIT License (MIT)
      +
      +Copyright (c) 2014 Jon Schlinkert
      +
      +Permission is hereby granted, free of charge, to any person obtaining a copy
      +of this software and associated documentation files (the "Software"), to deal
      +in the Software without restriction, including without limitation the rights
      +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
      +copies of the Software, and to permit persons to whom the Software is
      +furnished to do so, subject to the following conditions:
      +
      +The above copyright notice and this permission notice shall be included in
      +all copies or substantial portions of the Software.
      +
      +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
      +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
      +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
      +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
      +THE SOFTWARE.
      diff --git a/node_modules/pad-right/README.md b/node_modules/pad-right/README.md
      new file mode 100644
      index 00000000..97106f46
      --- /dev/null
      +++ b/node_modules/pad-right/README.md
      @@ -0,0 +1,71 @@
      +# pad-right [![NPM version](https://badge.fury.io/js/pad-right.svg)](http://badge.fury.io/js/pad-right)
      +
      +> Right pad a string with zeros or a specified string. Fastest implementation.
      +
      +Install with [npm](https://www.npmjs.com/)
      +
      +```sh
      +$ npm i pad-right --save
      +```
      +
      +## Run tests
      +
      +```bash
      +npm test
      +```
      +
      +## Usage
      +
      +```js
      +var pad = require('pad-right');
      +pad('abc', 5)
      +// 'abc00'
      +pad('abc', 10)
      +// 'abc0000000'
      +pad('abc', 10, '~')
      +// 'abc~~~~~~~'
      +pad('abc', 10, ' ')
      +// 'abc       '
      +```
      +
      +## Related
      +
      +* [align-text](https://github.com/jonschlinkert/align-text): Align the text in a string.
      +* [center-align](https://github.com/jonschlinkert/center-align): Center-align the text in a string.
      +* [justified](https://github.com/jonschlinkert/justified): Wrap words to a specified length and justified the text.
      +* [pad-left](https://github.com/jonschlinkert/pad-left): Left pad a string with zeros or a specified string. Fastest implementation.
      +* [repeat-string](https://github.com/jonschlinkert/repeat-string): Repeat the given string n times. Fastest implementation for repeating a string.
      +* [right-align](https://github.com/jonschlinkert/right-align): Right-align the text in a string.
      +* [right-align-keys](https://github.com/jonschlinkert/right-align-keys): Right align the keys of an object.
      +* [right-align-values](https://github.com/jonschlinkert/right-align-values): Right align the values of a given property for each object in an array. Useful… [more](https://github.com/jonschlinkert/right-align-values)
      +* [right-pad-keys](https://github.com/jonschlinkert/right-pad-keys): Right pad the keys of an object.
      +* [right-pad-values](https://github.com/jonschlinkert/right-pad-values): Right pad the values of a given property for each object in an array. Useful… [more](https://github.com/jonschlinkert/right-pad-values)
      +* [word-wrap](https://github.com/jonschlinkert/word-wrap): Wrap words to a specified length.
      +
      +## Running tests
      +
      +Install dev dependencies:
      +
      +```sh
      +$ npm i -d && npm test
      +```
      +
      +## Contributing
      +
      +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/pad-right/issues/new)
      +
      +## Author
      +
      +**Jon Schlinkert**
      +
      ++ [github/jonschlinkert](https://github.com/jonschlinkert)
      ++ [twitter/jonschlinkert](http://twitter.com/jonschlinkert)
      +
      +## License
      +
      +Copyright © 2014-2015 Jon Schlinkert
      +Released under the MIT license.
      +
      +***
      +
      +_This file was generated by [verb-cli](https://github.com/assemble/verb-cli) on August 15, 2015._
      \ No newline at end of file
      diff --git a/node_modules/pad-right/index.js b/node_modules/pad-right/index.js
      new file mode 100644
      index 00000000..70127666
      --- /dev/null
      +++ b/node_modules/pad-right/index.js
      @@ -0,0 +1,20 @@
      +'use strict';
      +
      +var repeat = require('repeat-string');
      +
      +module.exports = function padLeft(val, num, str) {
      +  var padding = '';
      +  var diff = num - val.length;
      +
      +  // Breakpoints based on benchmarks to use the fastest approach
      +  // for the given number of zeros
      +  if (diff <= 5 && !str) {
      +    padding = '00000';
      +  } else if (diff <= 25 && !str) {
      +    padding = '000000000000000000000000000';
      +  } else {
      +    return val + repeat(str || '0', diff);
      +  }
      +
      +  return val + padding.slice(0, diff);
      +};
      diff --git a/node_modules/pad-right/package.json b/node_modules/pad-right/package.json
      new file mode 100644
      index 00000000..cc18490d
      --- /dev/null
      +++ b/node_modules/pad-right/package.json
      @@ -0,0 +1,64 @@
      +{
      +  "name": "pad-right",
      +  "description": "Right pad a string with zeros or a specified string. Fastest implementation.",
      +  "version": "0.2.2",
      +  "homepage": "https://github.com/jonschlinkert/pad-right",
      +  "author": "Jon Schlinkert (https://github.com/jonschlinkert)",
      +  "repository": "jonschlinkert/pad-right",
      +  "bugs": {
      +    "url": "https://github.com/jonschlinkert/pad-right/issues"
      +  },
      +  "license": "MIT",
      +  "main": "index.js",
      +  "files": [
      +    "index.js"
      +  ],
      +  "engines": {
      +    "node": ">=0.10.0"
      +  },
      +  "scripts": {
      +    "test": "mocha"
      +  },
      +  "dependencies": {
      +    "repeat-string": "^1.5.2"
      +  },
      +  "devDependencies": {
      +    "mocha": "*",
      +    "should": "*"
      +  },
      +  "keywords": [
      +    "align",
      +    "alignment",
      +    "fill",
      +    "left",
      +    "pad",
      +    "pad-left",
      +    "pad-right",
      +    "padded",
      +    "padding",
      +    "right",
      +    "right-pad",
      +    "spaces",
      +    "string",
      +    "zero",
      +    "zero-fill",
      +    "zeros"
      +  ],
      +  "verb": {
      +    "related": {
      +      "list": [
      +        "align-text",
      +        "center-align",
      +        "justified",
      +        "pad-left",
      +        "repeat-string",
      +        "right-align",
      +        "right-align-keys",
      +        "right-align-values",
      +        "right-pad-keys",
      +        "right-pad-values",
      +        "word-wrap"
      +      ]
      +    }
      +  }
      +}
      diff --git a/node_modules/parse-json/index.d.ts b/node_modules/parse-json/index.d.ts
      new file mode 100644
      index 00000000..683d141b
      --- /dev/null
      +++ b/node_modules/parse-json/index.d.ts
      @@ -0,0 +1,144 @@
      +import type {JsonObject} from 'type-fest';
      +
      +/**
      +Exposed for `instanceof` checking.
      +*/
      +export class JSONError extends Error { // eslint-disable-line @typescript-eslint/naming-convention
      +	/**
      +	The filename displayed in the error message, if any.
      +	*/
      +	fileName: string;
      +
      +	/**
      +	The printable section of the JSON which produces the error.
      +	*/
      +	readonly codeFrame: string;
      +
      +	/**
      +	The raw version of `codeFrame` without colors.
      +	*/
      +	readonly rawCodeFrame: string;
      +}
      +
      +// Get `reviver`` parameter from `JSON.parse()`.
      +export type Reviver = Parameters['1'];
      +
      +/**
      +Parse JSON with more helpful errors.
      +
      +@param string - A valid JSON string.
      +@param reviver - Prescribes how the value originally produced by parsing is transformed, before being returned. See [`JSON.parse` docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse#Using_the_reviver_parameter
      +) for more.
      +@param filename - The filename displayed in the error message.
      +@returns A parsed JSON object.
      +@throws A {@link JSONError} when there is a parsing error.
      +
      +@example
      +```
      +import parseJson, {JSONError} from 'parse-json';
      +
      +const json = '{\n\t"foo": true,\n}';
      +
      +parseJson(json);
      +// JSONError: Expected double-quoted property name in JSON at position 16 (line 3 column 1)
      +
      +//   1 | {
      +//   2 |   "foo": true,
      +// > 3 | }
      +//     | ^
      +
      +parseJson(json, 'foo.json');
      +// JSONError: Expected double-quoted property name in JSON at position 16 (line 3 column 1) in foo.json
      +
      +//   1 | {
      +//   2 |   "foo": true,
      +// > 3 | }
      +//     | ^
      +//   fileName: 'foo.json',
      +//   [cause]: SyntaxError: Expected double-quoted property name in JSON at position 16 (line 3 column 1)
      +//       at JSON.parse ()
      +//       at ...
      +
      +// You can also add the filename at a later point
      +try {
      +	parseJson(json);
      +} catch (error) {
      +	if (error instanceof JSONError) {
      +		error.fileName = 'foo.json';
      +	}
      +
      +	throw error;
      +}
      +// JSONError: Expected double-quoted property name in JSON at position 16 (line 3 column 1) in foo.json
      +
      +//   1 | {
      +//   2 |   "foo": true,
      +// > 3 | }
      +//     | ^
      +
      +//   fileName: 'foo.json',
      +//   [cause]: SyntaxError: Expected double-quoted property name in JSON at position 16 (line 3 column 1)
      +//       at JSON.parse ()
      +//       at ...
      +```
      +*/
      +export default function parseJson(string: string, reviver?: Reviver, filename?: string): JsonObject;
      +
      +/**
      +Parse JSON with more helpful errors.
      +
      +@param string - A valid JSON string.
      +@param filename - The filename displayed in the error message.
      +@returns A parsed JSON object.
      +@throws A {@link JSONError} when there is a parsing error.
      +
      +@example
      +```
      +import parseJson, {JSONError} from 'parse-json';
      +
      +const json = '{\n\t"foo": true,\n}';
      +
      +parseJson(json);
      +// JSONError: Expected double-quoted property name in JSON at position 16 (line 3 column 1)
      +
      +//   1 | {
      +//   2 |   "foo": true,
      +// > 3 | }
      +//     | ^
      +
      +parseJson(json, 'foo.json');
      +// JSONError: Expected double-quoted property name in JSON at position 16 (line 3 column 1) in foo.json
      +
      +//   1 | {
      +//   2 |   "foo": true,
      +// > 3 | }
      +//     | ^
      +//   fileName: 'foo.json',
      +//   [cause]: SyntaxError: Expected double-quoted property name in JSON at position 16 (line 3 column 1)
      +//       at JSON.parse ()
      +//       at ...
      +
      +// You can also add the filename at a later point
      +try {
      +	parseJson(json);
      +} catch (error) {
      +	if (error instanceof JSONError) {
      +		error.fileName = 'foo.json';
      +	}
      +
      +	throw error;
      +}
      +// JSONError: Expected double-quoted property name in JSON at position 16 (line 3 column 1) in foo.json
      +
      +//   1 | {
      +//   2 |   "foo": true,
      +// > 3 | }
      +//     | ^
      +
      +//   fileName: 'foo.json',
      +//   [cause]: SyntaxError: Expected double-quoted property name in JSON at position 16 (line 3 column 1)
      +//       at JSON.parse ()
      +//       at ...
      +```
      +*/
      +export default function parseJson(string: string, filename?: string): JsonObject;
      diff --git a/node_modules/parse-json/index.js b/node_modules/parse-json/index.js
      new file mode 100644
      index 00000000..5d1e3a2c
      --- /dev/null
      +++ b/node_modules/parse-json/index.js
      @@ -0,0 +1,110 @@
      +import {codeFrameColumns} from '@babel/code-frame';
      +import indexToPosition from 'index-to-position';
      +
      +const getCodePoint = character => `\\u{${character.codePointAt(0).toString(16)}}`;
      +
      +export class JSONError extends Error {
      +	name = 'JSONError';
      +	fileName;
      +	#input;
      +	#jsonParseError;
      +	#message;
      +	#codeFrame;
      +	#rawCodeFrame;
      +
      +	constructor(messageOrOptions) {
      +		// JSONError constructor used accept string
      +		// TODO[>=9]: Remove this `if` on next major version
      +		if (typeof messageOrOptions === 'string') {
      +			super();
      +			this.#message = messageOrOptions;
      +		} else {
      +			const {jsonParseError, fileName, input} = messageOrOptions;
      +			// We cannot pass message to `super()`, otherwise the message accessor will be overridden.
      +			// https://262.ecma-international.org/14.0/#sec-error-message
      +			super(undefined, {cause: jsonParseError});
      +
      +			this.#input = input;
      +			this.#jsonParseError = jsonParseError;
      +			this.fileName = fileName;
      +		}
      +
      +		Error.captureStackTrace?.(this, JSONError);
      +	}
      +
      +	get message() {
      +		this.#message ??= `${addCodePointToUnexpectedToken(this.#jsonParseError.message)}${this.#input === '' ? ' while parsing empty string' : ''}`;
      +
      +		const {codeFrame} = this;
      +		return `${this.#message}${this.fileName ? ` in ${this.fileName}` : ''}${codeFrame ? `\n\n${codeFrame}\n` : ''}`;
      +	}
      +
      +	set message(message) {
      +		this.#message = message;
      +	}
      +
      +	#getCodeFrame(highlightCode) {
      +		// TODO[>=9]: Remove this `if` on next major version
      +		if (!this.#jsonParseError) {
      +			return;
      +		}
      +
      +		const input = this.#input;
      +
      +		const location = getErrorLocation(input, this.#jsonParseError.message);
      +		if (!location) {
      +			return;
      +		}
      +
      +		return codeFrameColumns(input, {start: location}, {highlightCode});
      +	}
      +
      +	get codeFrame() {
      +		this.#codeFrame ??= this.#getCodeFrame(/* highlightCode */ true);
      +		return this.#codeFrame;
      +	}
      +
      +	get rawCodeFrame() {
      +		this.#rawCodeFrame ??= this.#getCodeFrame(/* highlightCode */ false);
      +		return this.#rawCodeFrame;
      +	}
      +}
      +
      +const getErrorLocation = (string, message) => {
      +	const match = message.match(/in JSON at position (?\d+)(?: \(line (?\d+) column (?\d+)\))?$/);
      +
      +	if (!match) {
      +		return;
      +	}
      +
      +	const {index, line, column} = match.groups;
      +
      +	if (line && column) {
      +		return {line: Number(line), column: Number(column)};
      +	}
      +
      +	return indexToPosition(string, Number(index), {oneBased: true});
      +};
      +
      +const addCodePointToUnexpectedToken = message => message.replace(
      +	// TODO[engine:node@>=20]: The token always quoted after Node.js 20
      +	/(?<=^Unexpected token )(?')?(.)\k/,
      +	(_, _quote, token) => `"${token}"(${getCodePoint(token)})`,
      +);
      +
      +export default function parseJson(string, reviver, fileName) {
      +	if (typeof reviver === 'string') {
      +		fileName = reviver;
      +		reviver = undefined;
      +	}
      +
      +	try {
      +		return JSON.parse(string, reviver);
      +	} catch (error) {
      +		throw new JSONError({
      +			jsonParseError: error,
      +			fileName,
      +			input: string,
      +		});
      +	}
      +}
      diff --git a/node_modules/parse-json/license b/node_modules/parse-json/license
      new file mode 100644
      index 00000000..fa7ceba3
      --- /dev/null
      +++ b/node_modules/parse-json/license
      @@ -0,0 +1,9 @@
      +MIT License
      +
      +Copyright (c) Sindre Sorhus  (https://sindresorhus.com)
      +
      +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
      +
      +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
      +
      +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
      diff --git a/node_modules/parse-json/package.json b/node_modules/parse-json/package.json
      new file mode 100644
      index 00000000..72a196ff
      --- /dev/null
      +++ b/node_modules/parse-json/package.json
      @@ -0,0 +1,53 @@
      +{
      +	"name": "parse-json",
      +	"version": "8.3.0",
      +	"description": "Parse JSON with more helpful errors",
      +	"license": "MIT",
      +	"repository": "sindresorhus/parse-json",
      +	"funding": "https://github.com/sponsors/sindresorhus",
      +	"author": {
      +		"name": "Sindre Sorhus",
      +		"email": "sindresorhus@gmail.com",
      +		"url": "https://sindresorhus.com"
      +	},
      +	"type": "module",
      +	"exports": {
      +		"types": "./index.d.ts",
      +		"default": "./index.js"
      +	},
      +	"sideEffects": false,
      +	"engines": {
      +		"node": ">=18"
      +	},
      +	"scripts": {
      +		"test": "xo && c8 ava && tsd"
      +	},
      +	"files": [
      +		"index.js",
      +		"index.d.ts"
      +	],
      +	"keywords": [
      +		"parse",
      +		"json",
      +		"graceful",
      +		"error",
      +		"message",
      +		"humanize",
      +		"friendly",
      +		"helpful",
      +		"string"
      +	],
      +	"dependencies": {
      +		"@babel/code-frame": "^7.26.2",
      +		"index-to-position": "^1.1.0",
      +		"type-fest": "^4.39.1"
      +	},
      +	"devDependencies": {
      +		"ava": "^6.2.0",
      +		"c8": "^10.1.3",
      +		"outdent": "^0.8.0",
      +		"strip-ansi": "^7.1.0",
      +		"tsd": "^0.31.2",
      +		"xo": "^0.60.0"
      +	}
      +}
      diff --git a/node_modules/parse-json/readme.md b/node_modules/parse-json/readme.md
      new file mode 100644
      index 00000000..be57c752
      --- /dev/null
      +++ b/node_modules/parse-json/readme.md
      @@ -0,0 +1,119 @@
      +# parse-json
      +
      +> Parse JSON with more helpful errors
      +
      +## Install
      +
      +```sh
      +npm install parse-json
      +```
      +
      +## Usage
      +
      +```js
      +import parseJson, {JSONError} from 'parse-json';
      +
      +const json = '{\n\t"foo": true,\n}';
      +
      +
      +JSON.parse(json);
      +/*
      +SyntaxError: Expected double-quoted property name in JSON at position 16 (line 3 column 1)
      +*/
      +
      +
      +parseJson(json);
      +/*
      +JSONError: Expected double-quoted property name in JSON at position 16 (line 3 column 1)
      +
      +  1 | {
      +  2 |   "foo": true,
      +> 3 | }
      +    | ^
      +*/
      +
      +
      +parseJson(json, 'foo.json');
      +/*
      +JSONError: Expected double-quoted property name in JSON at position 16 (line 3 column 1) in foo.json
      +
      +  1 | {
      +  2 |   "foo": true,
      +> 3 | }
      +    | ^
      +  fileName: 'foo.json',
      +  [cause]: SyntaxError: Expected double-quoted property name in JSON at position 16 (line 3 column 1)
      +      at JSON.parse ()
      +      at ...
      +*/
      +
      +
      +// You can also add the filename at a later point
      +try {
      +	parseJson(json);
      +} catch (error) {
      +	if (error instanceof JSONError) {
      +		error.fileName = 'foo.json';
      +	}
      +
      +	throw error;
      +}
      +/*
      +JSONError: Expected double-quoted property name in JSON at position 16 (line 3 column 1) in foo.json
      +
      +  1 | {
      +  2 |   "foo": true,
      +> 3 | }
      +    | ^
      +
      +  fileName: 'foo.json',
      +  [cause]: SyntaxError: Expected double-quoted property name in JSON at position 16 (line 3 column 1)
      +      at JSON.parse ()
      +      at ...
      +*/
      +```
      +
      +## API
      +
      +### parseJson(string, reviver?, filename?)
      +
      +Throws a `JSONError` when there is a parsing error.
      +
      +#### string
      +
      +Type: `string`
      +
      +#### reviver
      +
      +Type: `Function`
      +
      +Prescribes how the value originally produced by parsing is transformed, before being returned. See [`JSON.parse` docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse#Using_the_reviver_parameter
      +) for more.
      +
      +#### filename
      +
      +Type: `string`
      +
      +The filename displayed in the error message.
      +
      +### JSONError
      +
      +Exposed for `instanceof` checking.
      +
      +#### fileName
      +
      +Type: `string`
      +
      +The filename displayed in the error message.
      +
      +#### codeFrame
      +
      +Type: `string`
      +
      +The printable section of the JSON which produces the error.
      +
      +#### rawCodeFrame
      +
      +Type: `string`
      +
      +The raw version of `codeFrame` without colors.
      diff --git a/node_modules/path-scurry/LICENSE.md b/node_modules/path-scurry/LICENSE.md
      new file mode 100644
      index 00000000..c5402b95
      --- /dev/null
      +++ b/node_modules/path-scurry/LICENSE.md
      @@ -0,0 +1,55 @@
      +# Blue Oak Model License
      +
      +Version 1.0.0
      +
      +## Purpose
      +
      +This license gives everyone as much permission to work with
      +this software as possible, while protecting contributors
      +from liability.
      +
      +## Acceptance
      +
      +In order to receive this license, you must agree to its
      +rules.  The rules of this license are both obligations
      +under that agreement and conditions to your license.
      +You must not do anything with this software that triggers
      +a rule that you cannot or will not follow.
      +
      +## Copyright
      +
      +Each contributor licenses you to do everything with this
      +software that would otherwise infringe that contributor's
      +copyright in it.
      +
      +## Notices
      +
      +You must ensure that everyone who gets a copy of
      +any part of this software from you, with or without
      +changes, also gets the text of this license or a link to
      +.
      +
      +## Excuse
      +
      +If anyone notifies you in writing that you have not
      +complied with [Notices](#notices), you can keep your
      +license by taking all practical steps to comply within 30
      +days after the notice.  If you do not do so, your license
      +ends immediately.
      +
      +## Patent
      +
      +Each contributor licenses you to do everything with this
      +software that would otherwise infringe any patent claims
      +they can license or become able to license.
      +
      +## Reliability
      +
      +No contributor can revoke this license.
      +
      +## No Liability
      +
      +***As far as the law allows, this software comes as is,
      +without any warranty or condition, and no contributor
      +will be liable to anyone for any damages related to this
      +software or this license, under any kind of legal claim.***
      diff --git a/node_modules/path-scurry/README.md b/node_modules/path-scurry/README.md
      new file mode 100644
      index 00000000..b5cb495c
      --- /dev/null
      +++ b/node_modules/path-scurry/README.md
      @@ -0,0 +1,636 @@
      +# path-scurry
      +
      +Extremely high performant utility for building tools that read
      +the file system, minimizing filesystem and path string munging
      +operations to the greatest degree possible.
      +
      +## Ugh, yet another file traversal thing on npm?
      +
      +Yes. None of the existing ones gave me exactly what I wanted.
      +
      +## Well what is it you wanted?
      +
      +While working on [glob](http://npm.im/glob), I found that I
      +needed a module to very efficiently manage the traversal over a
      +folder tree, such that:
      +
      +1. No `readdir()` or `stat()` would ever be called on the same
      +   file or directory more than one time.
      +2. No `readdir()` calls would be made if we can be reasonably
      +   sure that the path is not a directory. (Ie, a previous
      +   `readdir()` or `stat()` covered the path, and
      +   `ent.isDirectory()` is false.)
      +3. `path.resolve()`, `dirname()`, `basename()`, and other
      +   string-parsing/munging operations are be minimized. This means
      +   it has to track "provisional" child nodes that may not exist
      +   (and if we find that they _don't_ exist, store that
      +   information as well, so we don't have to ever check again).
      +4. The API is not limited to use as a stream/iterator/etc. There
      +   are many cases where an API like node's `fs` is preferrable.
      +5. It's more important to prevent excess syscalls than to be up
      +   to date, but it should be smart enough to know what it
      +   _doesn't_ know, and go get it seamlessly when requested.
      +6. Do not blow up the JS heap allocation if operating on a
      +   directory with a huge number of entries.
      +7. Handle all the weird aspects of Windows paths, like UNC paths
      +   and drive letters and wrongway slashes, so that the consumer
      +   can return canonical platform-specific paths without having to
      +   parse or join or do any error-prone string munging.
      +
      +## PERFORMANCE
      +
      +JavaScript people throw around the word "blazing" a lot. I hope
      +that this module doesn't blaze anyone. But it does go very fast,
      +in the cases it's optimized for, if used properly.
      +
      +PathScurry provides ample opportunities to get extremely good
      +performance, as well as several options to trade performance for
      +convenience.
      +
      +Benchmarks can be run by executing `npm run bench`.
      +
      +As is always the case, doing more means going slower, doing less
      +means going faster, and there are trade offs between speed and
      +memory usage.
      +
      +PathScurry makes heavy use of [LRUCache](http://npm.im/lru-cache)
      +to efficiently cache whatever it can, and `Path` objects remain
      +in the graph for the lifetime of the walker, so repeated calls
      +with a single PathScurry object will be extremely fast. However,
      +adding items to a cold cache means "doing more", so in those
      +cases, we pay a price. Nothing is free, but every effort has been
      +made to reduce costs wherever possible.
      +
      +Also, note that a "cache as long as possible" approach means that
      +changes to the filesystem may not be reflected in the results of
      +repeated PathScurry operations.
      +
      +For resolving string paths, `PathScurry` ranges from 5-50 times
      +faster than `path.resolve` on repeated resolutions, but around
      +100 to 1000 times _slower_ on the first resolution. If your
      +program is spending a lot of time resolving the _same_ paths
      +repeatedly (like, thousands or millions of times), then this can
      +be beneficial. But both implementations are pretty fast, and
      +speeding up an infrequent operation from 4µs to 400ns is not
      +going to move the needle on your app's performance.
      +
      +For walking file system directory trees, a lot depends on how
      +often a given PathScurry object will be used, and also on the
      +walk method used.
      +
      +With default settings on a folder tree of 100,000 items,
      +consisting of around a 10-to-1 ratio of normal files to
      +directories, PathScurry performs comparably to
      +[@nodelib/fs.walk](http://npm.im/@nodelib/fs.walk), which is the
      +fastest and most reliable file system walker I could find. As far
      +as I can tell, it's almost impossible to go much faster in a
      +Node.js program, just based on how fast you can push syscalls out
      +to the fs thread pool.
      +
      +On my machine, that is about 1000-1200 completed walks per second
      +for async or stream walks, and around 500-600 walks per second
      +synchronously.
      +
      +In the warm cache state, PathScurry's performance increases
      +around 4x for async `for await` iteration, 10-15x faster for
      +streams and synchronous `for of` iteration, and anywhere from 30x
      +to 80x faster for the rest.
      +
      +```
      +# walk 100,000 fs entries, 10/1 file/dir ratio
      +# operations / ms
      + New PathScurry object  |  Reuse PathScurry object
      +     stream:  1112.589  |  13974.917
      +sync stream:   492.718  |  15028.343
      + async walk:  1095.648  |  32706.395
      +  sync walk:   527.632  |  46129.772
      + async iter:  1288.821  |   5045.510
      +  sync iter:   498.496  |  17920.746
      +```
      +
      +A hand-rolled walk calling `entry.readdir()` and recursing
      +through the entries can benefit even more from caching, with
      +greater flexibility and without the overhead of streams or
      +generators.
      +
      +The cold cache state is still limited by the costs of file system
      +operations, but with a warm cache, the only bottleneck is CPU
      +speed and VM optimizations. Of course, in that case, some care
      +must be taken to ensure that you don't lose performance as a
      +result of silly mistakes, like calling `readdir()` on entries
      +that you know are not directories.
      +
      +```
      +# manual recursive iteration functions
      +      cold cache  |  warm cache
      +async:  1164.901  |  17923.320
      +   cb:  1101.127  |  40999.344
      +zalgo:  1082.240  |  66689.936
      + sync:   526.935  |  87097.591
      +```
      +
      +In this case, the speed improves by around 10-20x in the async
      +case, 40x in the case of using `entry.readdirCB` with protections
      +against synchronous callbacks, and 50-100x with callback
      +deferrals disabled, and _several hundred times faster_ for
      +synchronous iteration.
      +
      +If you can think of a case that is not covered in these
      +benchmarks, or an implementation that performs significantly
      +better than PathScurry, please [let me
      +know](https://github.com/isaacs/path-scurry/issues).
      +
      +## USAGE
      +
      +```ts
      +// hybrid module, load with either method
      +import { PathScurry, Path } from 'path-scurry'
      +// or:
      +const { PathScurry, Path } = require('path-scurry')
      +
      +// very simple example, say we want to find and
      +// delete all the .DS_Store files in a given path
      +// note that the API is very similar to just a
      +// naive walk with fs.readdir()
      +import { unlink } from 'fs/promises'
      +
      +// easy way, iterate over the directory and do the thing
      +const pw = new PathScurry(process.cwd())
      +for await (const entry of pw) {
      +  if (entry.isFile() && entry.name === '.DS_Store') {
      +    unlink(entry.fullpath())
      +  }
      +}
      +
      +// here it is as a manual recursive method
      +const walk = async (entry: Path) => {
      +  const promises: Promise = []
      +  // readdir doesn't throw on non-directories, it just doesn't
      +  // return any entries, to save stack trace costs.
      +  // Items are returned in arbitrary unsorted order
      +  for (const child of await pw.readdir(entry)) {
      +    // each child is a Path object
      +    if (child.name === '.DS_Store' && child.isFile()) {
      +      // could also do pw.resolve(entry, child.name),
      +      // just like fs.readdir walking, but .fullpath is
      +      // a *slightly* more efficient shorthand.
      +      promises.push(unlink(child.fullpath()))
      +    } else if (child.isDirectory()) {
      +      promises.push(walk(child))
      +    }
      +  }
      +  return Promise.all(promises)
      +}
      +
      +walk(pw.cwd).then(() => {
      +  console.log('all .DS_Store files removed')
      +})
      +
      +const pw2 = new PathScurry('/a/b/c') // pw2.cwd is the Path for /a/b/c
      +const relativeDir = pw2.cwd.resolve('../x') // Path entry for '/a/b/x'
      +const relative2 = pw2.cwd.resolve('/a/b/d/../x') // same path, same entry
      +assert.equal(relativeDir, relative2)
      +```
      +
      +## API
      +
      +[Full TypeDoc API](https://isaacs.github.io/path-scurry)
      +
      +There are platform-specific classes exported, but for the most
      +part, the default `PathScurry` and `Path` exports are what you
      +most likely need, unless you are testing behavior for other
      +platforms.
      +
      +Intended public API is documented here, but the full
      +documentation does include internal types, which should not be
      +accessed directly.
      +
      +### Interface `PathScurryOpts`
      +
      +The type of the `options` argument passed to the `PathScurry`
      +constructor.
      +
      +- `nocase`: Boolean indicating that file names should be compared
      +  case-insensitively. Defaults to `true` on darwin and win32
      +  implementations, `false` elsewhere.
      +
      +  **Warning** Performing case-insensitive matching on a
      +  case-sensitive filesystem will result in occasionally very
      +  bizarre behavior. Performing case-sensitive matching on a
      +  case-insensitive filesystem may negatively impact performance.
      +
      +- `childrenCacheSize`: Number of child entries to cache, in order
      +  to speed up `resolve()` and `readdir()` calls. Defaults to
      +  `16 * 1024` (ie, `16384`).
      +
      +  Setting it to a higher value will run the risk of JS heap
      +  allocation errors on large directory trees. Setting it to `256`
      +  or smaller will significantly reduce the construction time and
      +  data consumption overhead, but with the downside of operations
      +  being slower on large directory trees. Setting it to `0` will
      +  mean that effectively no operations are cached, and this module
      +  will be roughly the same speed as `fs` for file system
      +  operations, and _much_ slower than `path.resolve()` for
      +  repeated path resolution.
      +
      +- `fs` An object that will be used to override the default `fs`
      +  methods. Any methods that are not overridden will use Node's
      +  built-in implementations.
      +
      +  - lstatSync
      +  - readdir (callback `withFileTypes` Dirent variant, used for
      +    readdirCB and most walks)
      +  - readdirSync
      +  - readlinkSync
      +  - realpathSync
      +  - promises: Object containing the following async methods:
      +    - lstat
      +    - readdir (Dirent variant only)
      +    - readlink
      +    - realpath
      +
      +### Interface `WalkOptions`
      +
      +The options object that may be passed to all walk methods.
      +
      +- `withFileTypes`: Boolean, default true. Indicates that `Path`
      +  objects should be returned. Set to `false` to get string paths
      +  instead.
      +- `follow`: Boolean, default false. Attempt to read directory
      +  entries from symbolic links. Otherwise, only actual directories
      +  are traversed. Regardless of this setting, a given target path
      +  will only ever be walked once, meaning that a symbolic link to
      +  a previously traversed directory will never be followed.
      +
      +  Setting this imposes a slight performance penalty, because
      +  `readlink` must be called on all symbolic links encountered, in
      +  order to avoid infinite cycles.
      +
      +- `filter`: Function `(entry: Path) => boolean`. If provided,
      +  will prevent the inclusion of any entry for which it returns a
      +  falsey value. This will not prevent directories from being
      +  traversed if they do not pass the filter, though it will
      +  prevent the directories themselves from being included in the
      +  results. By default, if no filter is provided, then all entries
      +  are included in the results.
      +- `walkFilter`: Function `(entry: Path) => boolean`. If provided,
      +  will prevent the traversal of any directory (or in the case of
      +  `follow:true` symbolic links to directories) for which the
      +  function returns false. This will not prevent the directories
      +  themselves from being included in the result set. Use `filter`
      +  for that.
      +
      +Note that TypeScript return types will only be inferred properly
      +from static analysis if the `withFileTypes` option is omitted, or
      +a constant `true` or `false` value.
      +
      +### Class `PathScurry`
      +
      +The main interface. Defaults to an appropriate class based on the
      +current platform.
      +
      +Use `PathScurryWin32`, `PathScurryDarwin`, or `PathScurryPosix`
      +if implementation-specific behavior is desired.
      +
      +All walk methods may be called with a `WalkOptions` argument to
      +walk over the object's current working directory with the
      +supplied options.
      +
      +#### `async pw.walk(entry?: string | Path | WalkOptions, opts?: WalkOptions)`
      +
      +Walk the directory tree according to the options provided,
      +resolving to an array of all entries found.
      +
      +#### `pw.walkSync(entry?: string | Path | WalkOptions, opts?: WalkOptions)`
      +
      +Walk the directory tree according to the options provided,
      +returning an array of all entries found.
      +
      +#### `pw.iterate(entry?: string | Path | WalkOptions, opts?: WalkOptions)`
      +
      +Iterate over the directory asynchronously, for use with `for
      +await of`. This is also the default async iterator method.
      +
      +#### `pw.iterateSync(entry?: string | Path | WalkOptions, opts?: WalkOptions)`
      +
      +Iterate over the directory synchronously, for use with `for of`.
      +This is also the default sync iterator method.
      +
      +#### `pw.stream(entry?: string | Path | WalkOptions, opts?: WalkOptions)`
      +
      +Return a [Minipass](http://npm.im/minipass) stream that emits
      +each entry or path string in the walk. Results are made available
      +asynchronously.
      +
      +#### `pw.streamSync(entry?: string | Path | WalkOptions, opts?: WalkOptions)`
      +
      +Return a [Minipass](http://npm.im/minipass) stream that emits
      +each entry or path string in the walk. Results are made available
      +synchronously, meaning that the walk will complete in a single
      +tick if the stream is fully consumed.
      +
      +#### `pw.cwd`
      +
      +Path object representing the current working directory for the
      +PathScurry.
      +
      +#### `pw.chdir(path: string)`
      +
      +Set the new effective current working directory for the scurry
      +object, so that `path.relative()` and `path.relativePosix()`
      +return values relative to the new cwd path.
      +
      +#### `pw.depth(path?: Path | string): number`
      +
      +Return the depth of the specified path (or the PathScurry cwd)
      +within the directory tree.
      +
      +Root entries have a depth of `0`.
      +
      +#### `pw.resolve(...paths: string[])`
      +
      +Caching `path.resolve()`.
      +
      +Significantly faster than `path.resolve()` if called repeatedly
      +with the same paths. Significantly slower otherwise, as it builds
      +out the cached Path entries.
      +
      +To get a `Path` object resolved from the `PathScurry`, use
      +`pw.cwd.resolve(path)`. Note that `Path.resolve` only takes a
      +single string argument, not multiple.
      +
      +#### `pw.resolvePosix(...paths: string[])`
      +
      +Caching `path.resolve()`, but always using posix style paths.
      +
      +This is identical to `pw.resolve(...paths)` on posix systems (ie,
      +everywhere except Windows).
      +
      +On Windows, it returns the full absolute UNC path using `/`
      +separators. Ie, instead of `'C:\\foo\\bar`, it would return
      +`//?/C:/foo/bar`.
      +
      +#### `pw.relative(path: string | Path): string`
      +
      +Return the relative path from the PathWalker cwd to the supplied
      +path string or entry.
      +
      +If the nearest common ancestor is the root, then an absolute path
      +is returned.
      +
      +#### `pw.relativePosix(path: string | Path): string`
      +
      +Return the relative path from the PathWalker cwd to the supplied
      +path string or entry, using `/` path separators.
      +
      +If the nearest common ancestor is the root, then an absolute path
      +is returned.
      +
      +On posix platforms (ie, all platforms except Windows), this is
      +identical to `pw.relative(path)`.
      +
      +On Windows systems, it returns the resulting string as a
      +`/`-delimited path. If an absolute path is returned (because the
      +target does not share a common ancestor with `pw.cwd`), then a
      +full absolute UNC path will be returned. Ie, instead of
      +`'C:\\foo\\bar`, it would return `//?/C:/foo/bar`.
      +
      +#### `pw.basename(path: string | Path): string`
      +
      +Return the basename of the provided string or Path.
      +
      +#### `pw.dirname(path: string | Path): string`
      +
      +Return the parent directory of the supplied string or Path.
      +
      +#### `async pw.readdir(dir = pw.cwd, opts = { withFileTypes: true })`
      +
      +Read the directory and resolve to an array of strings if
      +`withFileTypes` is explicitly set to `false` or Path objects
      +otherwise.
      +
      +Can be called as `pw.readdir({ withFileTypes: boolean })` as
      +well.
      +
      +Returns `[]` if no entries are found, or if any error occurs.
      +
      +Note that TypeScript return types will only be inferred properly
      +from static analysis if the `withFileTypes` option is omitted, or
      +a constant `true` or `false` value.
      +
      +#### `pw.readdirSync(dir = pw.cwd, opts = { withFileTypes: true })`
      +
      +Synchronous `pw.readdir()`
      +
      +#### `async pw.readlink(link = pw.cwd, opts = { withFileTypes: false })`
      +
      +Call `fs.readlink` on the supplied string or Path object, and
      +return the result.
      +
      +Can be called as `pw.readlink({ withFileTypes: boolean })` as
      +well.
      +
      +Returns `undefined` if any error occurs (for example, if the
      +argument is not a symbolic link), or a `Path` object if
      +`withFileTypes` is explicitly set to `true`, or a string
      +otherwise.
      +
      +Note that TypeScript return types will only be inferred properly
      +from static analysis if the `withFileTypes` option is omitted, or
      +a constant `true` or `false` value.
      +
      +#### `pw.readlinkSync(link = pw.cwd, opts = { withFileTypes: false })`
      +
      +Synchronous `pw.readlink()`
      +
      +#### `async pw.lstat(entry = pw.cwd)`
      +
      +Call `fs.lstat` on the supplied string or Path object, and fill
      +in as much information as possible, returning the updated `Path`
      +object.
      +
      +Returns `undefined` if the entry does not exist, or if any error
      +is encountered.
      +
      +Note that some `Stats` data (such as `ino`, `dev`, and `mode`)
      +will not be supplied. For those things, you'll need to call
      +`fs.lstat` yourself.
      +
      +#### `pw.lstatSync(entry = pw.cwd)`
      +
      +Synchronous `pw.lstat()`
      +
      +#### `pw.realpath(entry = pw.cwd, opts = { withFileTypes: false })`
      +
      +Call `fs.realpath` on the supplied string or Path object, and
      +return the realpath if available.
      +
      +Returns `undefined` if any error occurs.
      +
      +May be called as `pw.realpath({ withFileTypes: boolean })` to run
      +on `pw.cwd`.
      +
      +#### `pw.realpathSync(entry = pw.cwd, opts = { withFileTypes: false })`
      +
      +Synchronous `pw.realpath()`
      +
      +### Class `Path` implements [fs.Dirent](https://nodejs.org/docs/latest/api/fs.html#class-fsdirent)
      +
      +Object representing a given path on the filesystem, which may or
      +may not exist.
      +
      +Note that the actual class in use will be either `PathWin32` or
      +`PathPosix`, depending on the implementation of `PathScurry` in
      +use. They differ in the separators used to split and join path
      +strings, and the handling of root paths.
      +
      +In `PathPosix` implementations, paths are split and joined using
      +the `'/'` character, and `'/'` is the only root path ever in use.
      +
      +In `PathWin32` implementations, paths are split using either
      +`'/'` or `'\\'` and joined using `'\\'`, and multiple roots may
      +be in use based on the drives and UNC paths encountered. UNC
      +paths such as `//?/C:/` that identify a drive letter, will be
      +treated as an alias for the same root entry as their associated
      +drive letter (in this case `'C:\\'`).
      +
      +#### `path.name`
      +
      +Name of this file system entry.
      +
      +**Important**: _always_ test the path name against any test
      +string using the `isNamed` method, and not by directly comparing
      +this string. Otherwise, unicode path strings that the system sees
      +as identical will not be properly treated as the same path,
      +leading to incorrect behavior and possible security issues.
      +
      +#### `path.isNamed(name: string): boolean`
      +
      +Return true if the path is a match for the given path name. This
      +handles case sensitivity and unicode normalization.
      +
      +Note: even on case-sensitive systems, it is **not** safe to test
      +the equality of the `.name` property to determine whether a given
      +pathname matches, due to unicode normalization mismatches.
      +
      +Always use this method instead of testing the `path.name`
      +property directly.
      +
      +#### `path.isCWD`
      +
      +Set to true if this `Path` object is the current working
      +directory of the `PathScurry` collection that contains it.
      +
      +#### `path.getType()`
      +
      +Returns the type of the Path object, `'File'`, `'Directory'`,
      +etc.
      +
      +#### `path.isType(t: type)`
      +
      +Returns true if `is{t}()` returns true.
      +
      +For example, `path.isType('Directory')` is equivalent to
      +`path.isDirectory()`.
      +
      +#### `path.depth()`
      +
      +Return the depth of the Path entry within the directory tree.
      +Root paths have a depth of `0`.
      +
      +#### `path.fullpath()`
      +
      +The fully resolved path to the entry.
      +
      +#### `path.fullpathPosix()`
      +
      +The fully resolved path to the entry, using `/` separators.
      +
      +On posix systems, this is identical to `path.fullpath()`. On
      +windows, this will return a fully resolved absolute UNC path
      +using `/` separators. Eg, instead of `'C:\\foo\\bar'`, it will
      +return `'//?/C:/foo/bar'`.
      +
      +#### `path.isFile()`, `path.isDirectory()`, etc.
      +
      +Same as the identical `fs.Dirent.isX()` methods.
      +
      +#### `path.isUnknown()`
      +
      +Returns true if the path's type is unknown. Always returns true
      +when the path is known to not exist.
      +
      +#### `path.resolve(p: string)`
      +
      +Return a `Path` object associated with the provided path string
      +as resolved from the current Path object.
      +
      +#### `path.relative(): string`
      +
      +Return the relative path from the PathWalker cwd to the supplied
      +path string or entry.
      +
      +If the nearest common ancestor is the root, then an absolute path
      +is returned.
      +
      +#### `path.relativePosix(): string`
      +
      +Return the relative path from the PathWalker cwd to the supplied
      +path string or entry, using `/` path separators.
      +
      +If the nearest common ancestor is the root, then an absolute path
      +is returned.
      +
      +On posix platforms (ie, all platforms except Windows), this is
      +identical to `pw.relative(path)`.
      +
      +On Windows systems, it returns the resulting string as a
      +`/`-delimited path. If an absolute path is returned (because the
      +target does not share a common ancestor with `pw.cwd`), then a
      +full absolute UNC path will be returned. Ie, instead of
      +`'C:\\foo\\bar`, it would return `//?/C:/foo/bar`.
      +
      +#### `async path.readdir()`
      +
      +Return an array of `Path` objects found by reading the associated
      +path entry.
      +
      +If path is not a directory, or if any error occurs, returns `[]`,
      +and marks all children as provisional and non-existent.
      +
      +#### `path.readdirSync()`
      +
      +Synchronous `path.readdir()`
      +
      +#### `async path.readlink()`
      +
      +Return the `Path` object referenced by the `path` as a symbolic
      +link.
      +
      +If the `path` is not a symbolic link, or any error occurs,
      +returns `undefined`.
      +
      +#### `path.readlinkSync()`
      +
      +Synchronous `path.readlink()`
      +
      +#### `async path.lstat()`
      +
      +Call `lstat` on the path object, and fill it in with details
      +determined.
      +
      +If path does not exist, or any other error occurs, returns
      +`undefined`, and marks the path as "unknown" type.
      +
      +#### `path.lstatSync()`
      +
      +Synchronous `path.lstat()`
      +
      +#### `async path.realpath()`
      +
      +Call `realpath` on the path, and return a Path object
      +corresponding to the result, or `undefined` if any error occurs.
      +
      +#### `path.realpathSync()`
      +
      +Synchornous `path.realpath()`
      diff --git a/node_modules/path-scurry/dist/commonjs/index.d.ts b/node_modules/path-scurry/dist/commonjs/index.d.ts
      new file mode 100644
      index 00000000..ef31b1b7
      --- /dev/null
      +++ b/node_modules/path-scurry/dist/commonjs/index.d.ts
      @@ -0,0 +1,1115 @@
      +import { LRUCache } from 'lru-cache';
      +import { posix, win32 } from 'node:path';
      +import { Minipass } from 'minipass';
      +import type { Dirent, Stats } from 'node:fs';
      +/**
      + * An object that will be used to override the default `fs`
      + * methods.  Any methods that are not overridden will use Node's
      + * built-in implementations.
      + *
      + * - lstatSync
      + * - readdir (callback `withFileTypes` Dirent variant, used for
      + *   readdirCB and most walks)
      + * - readdirSync
      + * - readlinkSync
      + * - realpathSync
      + * - promises: Object containing the following async methods:
      + *   - lstat
      + *   - readdir (Dirent variant only)
      + *   - readlink
      + *   - realpath
      + */
      +export interface FSOption {
      +    lstatSync?: (path: string) => Stats;
      +    readdir?: (path: string, options: {
      +        withFileTypes: true;
      +    }, cb: (er: NodeJS.ErrnoException | null, entries?: Dirent[]) => any) => void;
      +    readdirSync?: (path: string, options: {
      +        withFileTypes: true;
      +    }) => Dirent[];
      +    readlinkSync?: (path: string) => string;
      +    realpathSync?: (path: string) => string;
      +    promises?: {
      +        lstat?: (path: string) => Promise;
      +        readdir?: (path: string, options: {
      +            withFileTypes: true;
      +        }) => Promise;
      +        readlink?: (path: string) => Promise;
      +        realpath?: (path: string) => Promise;
      +        [k: string]: any;
      +    };
      +    [k: string]: any;
      +}
      +interface FSValue {
      +    lstatSync: (path: string) => Stats;
      +    readdir: (path: string, options: {
      +        withFileTypes: true;
      +    }, cb: (er: NodeJS.ErrnoException | null, entries?: Dirent[]) => any) => void;
      +    readdirSync: (path: string, options: {
      +        withFileTypes: true;
      +    }) => Dirent[];
      +    readlinkSync: (path: string) => string;
      +    realpathSync: (path: string) => string;
      +    promises: {
      +        lstat: (path: string) => Promise;
      +        readdir: (path: string, options: {
      +            withFileTypes: true;
      +        }) => Promise;
      +        readlink: (path: string) => Promise;
      +        realpath: (path: string) => Promise;
      +        [k: string]: any;
      +    };
      +    [k: string]: any;
      +}
      +export type Type = 'Unknown' | 'FIFO' | 'CharacterDevice' | 'Directory' | 'BlockDevice' | 'File' | 'SymbolicLink' | 'Socket';
      +/**
      + * Options that may be provided to the Path constructor
      + */
      +export interface PathOpts {
      +    fullpath?: string;
      +    relative?: string;
      +    relativePosix?: string;
      +    parent?: PathBase;
      +    /**
      +     * See {@link FSOption}
      +     */
      +    fs?: FSOption;
      +}
      +/**
      + * An LRUCache for storing resolved path strings or Path objects.
      + * @internal
      + */
      +export declare class ResolveCache extends LRUCache {
      +    constructor();
      +}
      +/**
      + * an LRUCache for storing child entries.
      + * @internal
      + */
      +export declare class ChildrenCache extends LRUCache {
      +    constructor(maxSize?: number);
      +}
      +/**
      + * Array of Path objects, plus a marker indicating the first provisional entry
      + *
      + * @internal
      + */
      +export type Children = PathBase[] & {
      +    provisional: number;
      +};
      +declare const setAsCwd: unique symbol;
      +/**
      + * Path objects are sort of like a super-powered
      + * {@link https://nodejs.org/docs/latest/api/fs.html#class-fsdirent fs.Dirent}
      + *
      + * Each one represents a single filesystem entry on disk, which may or may not
      + * exist. It includes methods for reading various types of information via
      + * lstat, readlink, and readdir, and caches all information to the greatest
      + * degree possible.
      + *
      + * Note that fs operations that would normally throw will instead return an
      + * "empty" value. This is in order to prevent excessive overhead from error
      + * stack traces.
      + */
      +export declare abstract class PathBase implements Dirent {
      +    #private;
      +    /**
      +     * the basename of this path
      +     *
      +     * **Important**: *always* test the path name against any test string
      +     * usingthe {@link isNamed} method, and not by directly comparing this
      +     * string. Otherwise, unicode path strings that the system sees as identical
      +     * will not be properly treated as the same path, leading to incorrect
      +     * behavior and possible security issues.
      +     */
      +    name: string;
      +    /**
      +     * the Path entry corresponding to the path root.
      +     *
      +     * @internal
      +     */
      +    root: PathBase;
      +    /**
      +     * All roots found within the current PathScurry family
      +     *
      +     * @internal
      +     */
      +    roots: {
      +        [k: string]: PathBase;
      +    };
      +    /**
      +     * a reference to the parent path, or undefined in the case of root entries
      +     *
      +     * @internal
      +     */
      +    parent?: PathBase;
      +    /**
      +     * boolean indicating whether paths are compared case-insensitively
      +     * @internal
      +     */
      +    nocase: boolean;
      +    /**
      +     * boolean indicating that this path is the current working directory
      +     * of the PathScurry collection that contains it.
      +     */
      +    isCWD: boolean;
      +    /**
      +     * the string or regexp used to split paths. On posix, it is `'/'`, and on
      +     * windows it is a RegExp matching either `'/'` or `'\\'`
      +     */
      +    abstract splitSep: string | RegExp;
      +    /**
      +     * The path separator string to use when joining paths
      +     */
      +    abstract sep: string;
      +    get dev(): number | undefined;
      +    get mode(): number | undefined;
      +    get nlink(): number | undefined;
      +    get uid(): number | undefined;
      +    get gid(): number | undefined;
      +    get rdev(): number | undefined;
      +    get blksize(): number | undefined;
      +    get ino(): number | undefined;
      +    get size(): number | undefined;
      +    get blocks(): number | undefined;
      +    get atimeMs(): number | undefined;
      +    get mtimeMs(): number | undefined;
      +    get ctimeMs(): number | undefined;
      +    get birthtimeMs(): number | undefined;
      +    get atime(): Date | undefined;
      +    get mtime(): Date | undefined;
      +    get ctime(): Date | undefined;
      +    get birthtime(): Date | undefined;
      +    /**
      +     * This property is for compatibility with the Dirent class as of
      +     * Node v20, where Dirent['parentPath'] refers to the path of the
      +     * directory that was passed to readdir. For root entries, it's the path
      +     * to the entry itself.
      +     */
      +    get parentPath(): string;
      +    /**
      +     * Deprecated alias for Dirent['parentPath'] Somewhat counterintuitively,
      +     * this property refers to the *parent* path, not the path object itself.
      +     *
      +     * @deprecated
      +     */
      +    get path(): string;
      +    /**
      +     * Do not create new Path objects directly.  They should always be accessed
      +     * via the PathScurry class or other methods on the Path class.
      +     *
      +     * @internal
      +     */
      +    constructor(name: string, type: number | undefined, root: PathBase | undefined, roots: {
      +        [k: string]: PathBase;
      +    }, nocase: boolean, children: ChildrenCache, opts: PathOpts);
      +    /**
      +     * Returns the depth of the Path object from its root.
      +     *
      +     * For example, a path at `/foo/bar` would have a depth of 2.
      +     */
      +    depth(): number;
      +    /**
      +     * @internal
      +     */
      +    abstract getRootString(path: string): string;
      +    /**
      +     * @internal
      +     */
      +    abstract getRoot(rootPath: string): PathBase;
      +    /**
      +     * @internal
      +     */
      +    abstract newChild(name: string, type?: number, opts?: PathOpts): PathBase;
      +    /**
      +     * @internal
      +     */
      +    childrenCache(): ChildrenCache;
      +    /**
      +     * Get the Path object referenced by the string path, resolved from this Path
      +     */
      +    resolve(path?: string): PathBase;
      +    /**
      +     * Returns the cached children Path objects, if still available.  If they
      +     * have fallen out of the cache, then returns an empty array, and resets the
      +     * READDIR_CALLED bit, so that future calls to readdir() will require an fs
      +     * lookup.
      +     *
      +     * @internal
      +     */
      +    children(): Children;
      +    /**
      +     * Resolves a path portion and returns or creates the child Path.
      +     *
      +     * Returns `this` if pathPart is `''` or `'.'`, or `parent` if pathPart is
      +     * `'..'`.
      +     *
      +     * This should not be called directly.  If `pathPart` contains any path
      +     * separators, it will lead to unsafe undefined behavior.
      +     *
      +     * Use `Path.resolve()` instead.
      +     *
      +     * @internal
      +     */
      +    child(pathPart: string, opts?: PathOpts): PathBase;
      +    /**
      +     * The relative path from the cwd. If it does not share an ancestor with
      +     * the cwd, then this ends up being equivalent to the fullpath()
      +     */
      +    relative(): string;
      +    /**
      +     * The relative path from the cwd, using / as the path separator.
      +     * If it does not share an ancestor with
      +     * the cwd, then this ends up being equivalent to the fullpathPosix()
      +     * On posix systems, this is identical to relative().
      +     */
      +    relativePosix(): string;
      +    /**
      +     * The fully resolved path string for this Path entry
      +     */
      +    fullpath(): string;
      +    /**
      +     * On platforms other than windows, this is identical to fullpath.
      +     *
      +     * On windows, this is overridden to return the forward-slash form of the
      +     * full UNC path.
      +     */
      +    fullpathPosix(): string;
      +    /**
      +     * Is the Path of an unknown type?
      +     *
      +     * Note that we might know *something* about it if there has been a previous
      +     * filesystem operation, for example that it does not exist, or is not a
      +     * link, or whether it has child entries.
      +     */
      +    isUnknown(): boolean;
      +    isType(type: Type): boolean;
      +    getType(): Type;
      +    /**
      +     * Is the Path a regular file?
      +     */
      +    isFile(): boolean;
      +    /**
      +     * Is the Path a directory?
      +     */
      +    isDirectory(): boolean;
      +    /**
      +     * Is the path a character device?
      +     */
      +    isCharacterDevice(): boolean;
      +    /**
      +     * Is the path a block device?
      +     */
      +    isBlockDevice(): boolean;
      +    /**
      +     * Is the path a FIFO pipe?
      +     */
      +    isFIFO(): boolean;
      +    /**
      +     * Is the path a socket?
      +     */
      +    isSocket(): boolean;
      +    /**
      +     * Is the path a symbolic link?
      +     */
      +    isSymbolicLink(): boolean;
      +    /**
      +     * Return the entry if it has been subject of a successful lstat, or
      +     * undefined otherwise.
      +     *
      +     * Does not read the filesystem, so an undefined result *could* simply
      +     * mean that we haven't called lstat on it.
      +     */
      +    lstatCached(): PathBase | undefined;
      +    /**
      +     * Return the cached link target if the entry has been the subject of a
      +     * successful readlink, or undefined otherwise.
      +     *
      +     * Does not read the filesystem, so an undefined result *could* just mean we
      +     * don't have any cached data. Only use it if you are very sure that a
      +     * readlink() has been called at some point.
      +     */
      +    readlinkCached(): PathBase | undefined;
      +    /**
      +     * Returns the cached realpath target if the entry has been the subject
      +     * of a successful realpath, or undefined otherwise.
      +     *
      +     * Does not read the filesystem, so an undefined result *could* just mean we
      +     * don't have any cached data. Only use it if you are very sure that a
      +     * realpath() has been called at some point.
      +     */
      +    realpathCached(): PathBase | undefined;
      +    /**
      +     * Returns the cached child Path entries array if the entry has been the
      +     * subject of a successful readdir(), or [] otherwise.
      +     *
      +     * Does not read the filesystem, so an empty array *could* just mean we
      +     * don't have any cached data. Only use it if you are very sure that a
      +     * readdir() has been called recently enough to still be valid.
      +     */
      +    readdirCached(): PathBase[];
      +    /**
      +     * Return true if it's worth trying to readlink.  Ie, we don't (yet) have
      +     * any indication that readlink will definitely fail.
      +     *
      +     * Returns false if the path is known to not be a symlink, if a previous
      +     * readlink failed, or if the entry does not exist.
      +     */
      +    canReadlink(): boolean;
      +    /**
      +     * Return true if readdir has previously been successfully called on this
      +     * path, indicating that cachedReaddir() is likely valid.
      +     */
      +    calledReaddir(): boolean;
      +    /**
      +     * Returns true if the path is known to not exist. That is, a previous lstat
      +     * or readdir failed to verify its existence when that would have been
      +     * expected, or a parent entry was marked either enoent or enotdir.
      +     */
      +    isENOENT(): boolean;
      +    /**
      +     * Return true if the path is a match for the given path name.  This handles
      +     * case sensitivity and unicode normalization.
      +     *
      +     * Note: even on case-sensitive systems, it is **not** safe to test the
      +     * equality of the `.name` property to determine whether a given pathname
      +     * matches, due to unicode normalization mismatches.
      +     *
      +     * Always use this method instead of testing the `path.name` property
      +     * directly.
      +     */
      +    isNamed(n: string): boolean;
      +    /**
      +     * Return the Path object corresponding to the target of a symbolic link.
      +     *
      +     * If the Path is not a symbolic link, or if the readlink call fails for any
      +     * reason, `undefined` is returned.
      +     *
      +     * Result is cached, and thus may be outdated if the filesystem is mutated.
      +     */
      +    readlink(): Promise;
      +    /**
      +     * Synchronous {@link PathBase.readlink}
      +     */
      +    readlinkSync(): PathBase | undefined;
      +    /**
      +     * Call lstat() on this Path, and update all known information that can be
      +     * determined.
      +     *
      +     * Note that unlike `fs.lstat()`, the returned value does not contain some
      +     * information, such as `mode`, `dev`, `nlink`, and `ino`.  If that
      +     * information is required, you will need to call `fs.lstat` yourself.
      +     *
      +     * If the Path refers to a nonexistent file, or if the lstat call fails for
      +     * any reason, `undefined` is returned.  Otherwise the updated Path object is
      +     * returned.
      +     *
      +     * Results are cached, and thus may be out of date if the filesystem is
      +     * mutated.
      +     */
      +    lstat(): Promise;
      +    /**
      +     * synchronous {@link PathBase.lstat}
      +     */
      +    lstatSync(): PathBase | undefined;
      +    /**
      +     * Standard node-style callback interface to get list of directory entries.
      +     *
      +     * If the Path cannot or does not contain any children, then an empty array
      +     * is returned.
      +     *
      +     * Results are cached, and thus may be out of date if the filesystem is
      +     * mutated.
      +     *
      +     * @param cb The callback called with (er, entries).  Note that the `er`
      +     * param is somewhat extraneous, as all readdir() errors are handled and
      +     * simply result in an empty set of entries being returned.
      +     * @param allowZalgo Boolean indicating that immediately known results should
      +     * *not* be deferred with `queueMicrotask`. Defaults to `false`. Release
      +     * zalgo at your peril, the dark pony lord is devious and unforgiving.
      +     */
      +    readdirCB(cb: (er: NodeJS.ErrnoException | null, entries: PathBase[]) => any, allowZalgo?: boolean): void;
      +    /**
      +     * Return an array of known child entries.
      +     *
      +     * If the Path cannot or does not contain any children, then an empty array
      +     * is returned.
      +     *
      +     * Results are cached, and thus may be out of date if the filesystem is
      +     * mutated.
      +     */
      +    readdir(): Promise;
      +    /**
      +     * synchronous {@link PathBase.readdir}
      +     */
      +    readdirSync(): PathBase[];
      +    canReaddir(): boolean;
      +    shouldWalk(dirs: Set, walkFilter?: (e: PathBase) => boolean): boolean;
      +    /**
      +     * Return the Path object corresponding to path as resolved
      +     * by realpath(3).
      +     *
      +     * If the realpath call fails for any reason, `undefined` is returned.
      +     *
      +     * Result is cached, and thus may be outdated if the filesystem is mutated.
      +     * On success, returns a Path object.
      +     */
      +    realpath(): Promise;
      +    /**
      +     * Synchronous {@link realpath}
      +     */
      +    realpathSync(): PathBase | undefined;
      +    /**
      +     * Internal method to mark this Path object as the scurry cwd,
      +     * called by {@link PathScurry#chdir}
      +     *
      +     * @internal
      +     */
      +    [setAsCwd](oldCwd: PathBase): void;
      +}
      +/**
      + * Path class used on win32 systems
      + *
      + * Uses `'\\'` as the path separator for returned paths, either `'\\'` or `'/'`
      + * as the path separator for parsing paths.
      + */
      +export declare class PathWin32 extends PathBase {
      +    /**
      +     * Separator for generating path strings.
      +     */
      +    sep: '\\';
      +    /**
      +     * Separator for parsing path strings.
      +     */
      +    splitSep: RegExp;
      +    /**
      +     * Do not create new Path objects directly.  They should always be accessed
      +     * via the PathScurry class or other methods on the Path class.
      +     *
      +     * @internal
      +     */
      +    constructor(name: string, type: number | undefined, root: PathBase | undefined, roots: {
      +        [k: string]: PathBase;
      +    }, nocase: boolean, children: ChildrenCache, opts: PathOpts);
      +    /**
      +     * @internal
      +     */
      +    newChild(name: string, type?: number, opts?: PathOpts): PathWin32;
      +    /**
      +     * @internal
      +     */
      +    getRootString(path: string): string;
      +    /**
      +     * @internal
      +     */
      +    getRoot(rootPath: string): PathBase;
      +    /**
      +     * @internal
      +     */
      +    sameRoot(rootPath: string, compare?: string): boolean;
      +}
      +/**
      + * Path class used on all posix systems.
      + *
      + * Uses `'/'` as the path separator.
      + */
      +export declare class PathPosix extends PathBase {
      +    /**
      +     * separator for parsing path strings
      +     */
      +    splitSep: '/';
      +    /**
      +     * separator for generating path strings
      +     */
      +    sep: '/';
      +    /**
      +     * Do not create new Path objects directly.  They should always be accessed
      +     * via the PathScurry class or other methods on the Path class.
      +     *
      +     * @internal
      +     */
      +    constructor(name: string, type: number | undefined, root: PathBase | undefined, roots: {
      +        [k: string]: PathBase;
      +    }, nocase: boolean, children: ChildrenCache, opts: PathOpts);
      +    /**
      +     * @internal
      +     */
      +    getRootString(path: string): string;
      +    /**
      +     * @internal
      +     */
      +    getRoot(_rootPath: string): PathBase;
      +    /**
      +     * @internal
      +     */
      +    newChild(name: string, type?: number, opts?: PathOpts): PathPosix;
      +}
      +/**
      + * Options that may be provided to the PathScurry constructor
      + */
      +export interface PathScurryOpts {
      +    /**
      +     * perform case-insensitive path matching. Default based on platform
      +     * subclass.
      +     */
      +    nocase?: boolean;
      +    /**
      +     * Number of Path entries to keep in the cache of Path child references.
      +     *
      +     * Setting this higher than 65536 will dramatically increase the data
      +     * consumption and construction time overhead of each PathScurry.
      +     *
      +     * Setting this value to 256 or lower will significantly reduce the data
      +     * consumption and construction time overhead, but may also reduce resolve()
      +     * and readdir() performance on large filesystems.
      +     *
      +     * Default `16384`.
      +     */
      +    childrenCacheSize?: number;
      +    /**
      +     * An object that overrides the built-in functions from the fs and
      +     * fs/promises modules.
      +     *
      +     * See {@link FSOption}
      +     */
      +    fs?: FSOption;
      +}
      +/**
      + * The base class for all PathScurry classes, providing the interface for path
      + * resolution and filesystem operations.
      + *
      + * Typically, you should *not* instantiate this class directly, but rather one
      + * of the platform-specific classes, or the exported {@link PathScurry} which
      + * defaults to the current platform.
      + */
      +export declare abstract class PathScurryBase {
      +    #private;
      +    /**
      +     * The root Path entry for the current working directory of this Scurry
      +     */
      +    root: PathBase;
      +    /**
      +     * The string path for the root of this Scurry's current working directory
      +     */
      +    rootPath: string;
      +    /**
      +     * A collection of all roots encountered, referenced by rootPath
      +     */
      +    roots: {
      +        [k: string]: PathBase;
      +    };
      +    /**
      +     * The Path entry corresponding to this PathScurry's current working directory.
      +     */
      +    cwd: PathBase;
      +    /**
      +     * Perform path comparisons case-insensitively.
      +     *
      +     * Defaults true on Darwin and Windows systems, false elsewhere.
      +     */
      +    nocase: boolean;
      +    /**
      +     * The path separator used for parsing paths
      +     *
      +     * `'/'` on Posix systems, either `'/'` or `'\\'` on Windows
      +     */
      +    abstract sep: string | RegExp;
      +    /**
      +     * This class should not be instantiated directly.
      +     *
      +     * Use PathScurryWin32, PathScurryDarwin, PathScurryPosix, or PathScurry
      +     *
      +     * @internal
      +     */
      +    constructor(cwd: (URL | string) | undefined, pathImpl: typeof win32 | typeof posix, sep: string | RegExp, { nocase, childrenCacheSize, fs, }?: PathScurryOpts);
      +    /**
      +     * Get the depth of a provided path, string, or the cwd
      +     */
      +    depth(path?: Path | string): number;
      +    /**
      +     * Parse the root portion of a path string
      +     *
      +     * @internal
      +     */
      +    abstract parseRootPath(dir: string): string;
      +    /**
      +     * create a new Path to use as root during construction.
      +     *
      +     * @internal
      +     */
      +    abstract newRoot(fs: FSValue): PathBase;
      +    /**
      +     * Determine whether a given path string is absolute
      +     */
      +    abstract isAbsolute(p: string): boolean;
      +    /**
      +     * Return the cache of child entries.  Exposed so subclasses can create
      +     * child Path objects in a platform-specific way.
      +     *
      +     * @internal
      +     */
      +    childrenCache(): ChildrenCache;
      +    /**
      +     * Resolve one or more path strings to a resolved string
      +     *
      +     * Same interface as require('path').resolve.
      +     *
      +     * Much faster than path.resolve() when called multiple times for the same
      +     * path, because the resolved Path objects are cached.  Much slower
      +     * otherwise.
      +     */
      +    resolve(...paths: string[]): string;
      +    /**
      +     * Resolve one or more path strings to a resolved string, returning
      +     * the posix path.  Identical to .resolve() on posix systems, but on
      +     * windows will return a forward-slash separated UNC path.
      +     *
      +     * Same interface as require('path').resolve.
      +     *
      +     * Much faster than path.resolve() when called multiple times for the same
      +     * path, because the resolved Path objects are cached.  Much slower
      +     * otherwise.
      +     */
      +    resolvePosix(...paths: string[]): string;
      +    /**
      +     * find the relative path from the cwd to the supplied path string or entry
      +     */
      +    relative(entry?: PathBase | string): string;
      +    /**
      +     * find the relative path from the cwd to the supplied path string or
      +     * entry, using / as the path delimiter, even on Windows.
      +     */
      +    relativePosix(entry?: PathBase | string): string;
      +    /**
      +     * Return the basename for the provided string or Path object
      +     */
      +    basename(entry?: PathBase | string): string;
      +    /**
      +     * Return the dirname for the provided string or Path object
      +     */
      +    dirname(entry?: PathBase | string): string;
      +    /**
      +     * Return an array of known child entries.
      +     *
      +     * First argument may be either a string, or a Path object.
      +     *
      +     * If the Path cannot or does not contain any children, then an empty array
      +     * is returned.
      +     *
      +     * Results are cached, and thus may be out of date if the filesystem is
      +     * mutated.
      +     *
      +     * Unlike `fs.readdir()`, the `withFileTypes` option defaults to `true`. Set
      +     * `{ withFileTypes: false }` to return strings.
      +     */
      +    readdir(): Promise;
      +    readdir(opts: {
      +        withFileTypes: true;
      +    }): Promise;
      +    readdir(opts: {
      +        withFileTypes: false;
      +    }): Promise;
      +    readdir(opts: {
      +        withFileTypes: boolean;
      +    }): Promise;
      +    readdir(entry: PathBase | string): Promise;
      +    readdir(entry: PathBase | string, opts: {
      +        withFileTypes: true;
      +    }): Promise;
      +    readdir(entry: PathBase | string, opts: {
      +        withFileTypes: false;
      +    }): Promise;
      +    readdir(entry: PathBase | string, opts: {
      +        withFileTypes: boolean;
      +    }): Promise;
      +    /**
      +     * synchronous {@link PathScurryBase.readdir}
      +     */
      +    readdirSync(): PathBase[];
      +    readdirSync(opts: {
      +        withFileTypes: true;
      +    }): PathBase[];
      +    readdirSync(opts: {
      +        withFileTypes: false;
      +    }): string[];
      +    readdirSync(opts: {
      +        withFileTypes: boolean;
      +    }): PathBase[] | string[];
      +    readdirSync(entry: PathBase | string): PathBase[];
      +    readdirSync(entry: PathBase | string, opts: {
      +        withFileTypes: true;
      +    }): PathBase[];
      +    readdirSync(entry: PathBase | string, opts: {
      +        withFileTypes: false;
      +    }): string[];
      +    readdirSync(entry: PathBase | string, opts: {
      +        withFileTypes: boolean;
      +    }): PathBase[] | string[];
      +    /**
      +     * Call lstat() on the string or Path object, and update all known
      +     * information that can be determined.
      +     *
      +     * Note that unlike `fs.lstat()`, the returned value does not contain some
      +     * information, such as `mode`, `dev`, `nlink`, and `ino`.  If that
      +     * information is required, you will need to call `fs.lstat` yourself.
      +     *
      +     * If the Path refers to a nonexistent file, or if the lstat call fails for
      +     * any reason, `undefined` is returned.  Otherwise the updated Path object is
      +     * returned.
      +     *
      +     * Results are cached, and thus may be out of date if the filesystem is
      +     * mutated.
      +     */
      +    lstat(entry?: string | PathBase): Promise;
      +    /**
      +     * synchronous {@link PathScurryBase.lstat}
      +     */
      +    lstatSync(entry?: string | PathBase): PathBase | undefined;
      +    /**
      +     * Return the Path object or string path corresponding to the target of a
      +     * symbolic link.
      +     *
      +     * If the path is not a symbolic link, or if the readlink call fails for any
      +     * reason, `undefined` is returned.
      +     *
      +     * Result is cached, and thus may be outdated if the filesystem is mutated.
      +     *
      +     * `{withFileTypes}` option defaults to `false`.
      +     *
      +     * On success, returns a Path object if `withFileTypes` option is true,
      +     * otherwise a string.
      +     */
      +    readlink(): Promise;
      +    readlink(opt: {
      +        withFileTypes: false;
      +    }): Promise;
      +    readlink(opt: {
      +        withFileTypes: true;
      +    }): Promise;
      +    readlink(opt: {
      +        withFileTypes: boolean;
      +    }): Promise;
      +    readlink(entry: string | PathBase, opt?: {
      +        withFileTypes: false;
      +    }): Promise;
      +    readlink(entry: string | PathBase, opt: {
      +        withFileTypes: true;
      +    }): Promise;
      +    readlink(entry: string | PathBase, opt: {
      +        withFileTypes: boolean;
      +    }): Promise;
      +    /**
      +     * synchronous {@link PathScurryBase.readlink}
      +     */
      +    readlinkSync(): string | undefined;
      +    readlinkSync(opt: {
      +        withFileTypes: false;
      +    }): string | undefined;
      +    readlinkSync(opt: {
      +        withFileTypes: true;
      +    }): PathBase | undefined;
      +    readlinkSync(opt: {
      +        withFileTypes: boolean;
      +    }): PathBase | string | undefined;
      +    readlinkSync(entry: string | PathBase, opt?: {
      +        withFileTypes: false;
      +    }): string | undefined;
      +    readlinkSync(entry: string | PathBase, opt: {
      +        withFileTypes: true;
      +    }): PathBase | undefined;
      +    readlinkSync(entry: string | PathBase, opt: {
      +        withFileTypes: boolean;
      +    }): string | PathBase | undefined;
      +    /**
      +     * Return the Path object or string path corresponding to path as resolved
      +     * by realpath(3).
      +     *
      +     * If the realpath call fails for any reason, `undefined` is returned.
      +     *
      +     * Result is cached, and thus may be outdated if the filesystem is mutated.
      +     *
      +     * `{withFileTypes}` option defaults to `false`.
      +     *
      +     * On success, returns a Path object if `withFileTypes` option is true,
      +     * otherwise a string.
      +     */
      +    realpath(): Promise;
      +    realpath(opt: {
      +        withFileTypes: false;
      +    }): Promise;
      +    realpath(opt: {
      +        withFileTypes: true;
      +    }): Promise;
      +    realpath(opt: {
      +        withFileTypes: boolean;
      +    }): Promise;
      +    realpath(entry: string | PathBase, opt?: {
      +        withFileTypes: false;
      +    }): Promise;
      +    realpath(entry: string | PathBase, opt: {
      +        withFileTypes: true;
      +    }): Promise;
      +    realpath(entry: string | PathBase, opt: {
      +        withFileTypes: boolean;
      +    }): Promise;
      +    realpathSync(): string | undefined;
      +    realpathSync(opt: {
      +        withFileTypes: false;
      +    }): string | undefined;
      +    realpathSync(opt: {
      +        withFileTypes: true;
      +    }): PathBase | undefined;
      +    realpathSync(opt: {
      +        withFileTypes: boolean;
      +    }): PathBase | string | undefined;
      +    realpathSync(entry: string | PathBase, opt?: {
      +        withFileTypes: false;
      +    }): string | undefined;
      +    realpathSync(entry: string | PathBase, opt: {
      +        withFileTypes: true;
      +    }): PathBase | undefined;
      +    realpathSync(entry: string | PathBase, opt: {
      +        withFileTypes: boolean;
      +    }): string | PathBase | undefined;
      +    /**
      +     * Asynchronously walk the directory tree, returning an array of
      +     * all path strings or Path objects found.
      +     *
      +     * Note that this will be extremely memory-hungry on large filesystems.
      +     * In such cases, it may be better to use the stream or async iterator
      +     * walk implementation.
      +     */
      +    walk(): Promise;
      +    walk(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Promise;
      +    walk(opts: WalkOptionsWithFileTypesFalse): Promise;
      +    walk(opts: WalkOptions): Promise;
      +    walk(entry: string | PathBase): Promise;
      +    walk(entry: string | PathBase, opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Promise;
      +    walk(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): Promise;
      +    walk(entry: string | PathBase, opts: WalkOptions): Promise;
      +    /**
      +     * Synchronously walk the directory tree, returning an array of
      +     * all path strings or Path objects found.
      +     *
      +     * Note that this will be extremely memory-hungry on large filesystems.
      +     * In such cases, it may be better to use the stream or async iterator
      +     * walk implementation.
      +     */
      +    walkSync(): PathBase[];
      +    walkSync(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): PathBase[];
      +    walkSync(opts: WalkOptionsWithFileTypesFalse): string[];
      +    walkSync(opts: WalkOptions): string[] | PathBase[];
      +    walkSync(entry: string | PathBase): PathBase[];
      +    walkSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesUnset | WalkOptionsWithFileTypesTrue): PathBase[];
      +    walkSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): string[];
      +    walkSync(entry: string | PathBase, opts: WalkOptions): PathBase[] | string[];
      +    /**
      +     * Support for `for await`
      +     *
      +     * Alias for {@link PathScurryBase.iterate}
      +     *
      +     * Note: As of Node 19, this is very slow, compared to other methods of
      +     * walking.  Consider using {@link PathScurryBase.stream} if memory overhead
      +     * and backpressure are concerns, or {@link PathScurryBase.walk} if not.
      +     */
      +    [Symbol.asyncIterator](): AsyncGenerator;
      +    /**
      +     * Async generator form of {@link PathScurryBase.walk}
      +     *
      +     * Note: As of Node 19, this is very slow, compared to other methods of
      +     * walking, especially if most/all of the directory tree has been previously
      +     * walked.  Consider using {@link PathScurryBase.stream} if memory overhead
      +     * and backpressure are concerns, or {@link PathScurryBase.walk} if not.
      +     */
      +    iterate(): AsyncGenerator;
      +    iterate(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): AsyncGenerator;
      +    iterate(opts: WalkOptionsWithFileTypesFalse): AsyncGenerator;
      +    iterate(opts: WalkOptions): AsyncGenerator;
      +    iterate(entry: string | PathBase): AsyncGenerator;
      +    iterate(entry: string | PathBase, opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): AsyncGenerator;
      +    iterate(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): AsyncGenerator;
      +    iterate(entry: string | PathBase, opts: WalkOptions): AsyncGenerator;
      +    /**
      +     * Iterating over a PathScurry performs a synchronous walk.
      +     *
      +     * Alias for {@link PathScurryBase.iterateSync}
      +     */
      +    [Symbol.iterator](): Generator;
      +    iterateSync(): Generator;
      +    iterateSync(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Generator;
      +    iterateSync(opts: WalkOptionsWithFileTypesFalse): Generator;
      +    iterateSync(opts: WalkOptions): Generator;
      +    iterateSync(entry: string | PathBase): Generator;
      +    iterateSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Generator;
      +    iterateSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): Generator;
      +    iterateSync(entry: string | PathBase, opts: WalkOptions): Generator;
      +    /**
      +     * Stream form of {@link PathScurryBase.walk}
      +     *
      +     * Returns a Minipass stream that emits {@link PathBase} objects by default,
      +     * or strings if `{ withFileTypes: false }` is set in the options.
      +     */
      +    stream(): Minipass;
      +    stream(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Minipass;
      +    stream(opts: WalkOptionsWithFileTypesFalse): Minipass;
      +    stream(opts: WalkOptions): Minipass;
      +    stream(entry: string | PathBase): Minipass;
      +    stream(entry: string | PathBase, opts: WalkOptionsWithFileTypesUnset | WalkOptionsWithFileTypesTrue): Minipass;
      +    stream(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): Minipass;
      +    stream(entry: string | PathBase, opts: WalkOptions): Minipass | Minipass;
      +    /**
      +     * Synchronous form of {@link PathScurryBase.stream}
      +     *
      +     * Returns a Minipass stream that emits {@link PathBase} objects by default,
      +     * or strings if `{ withFileTypes: false }` is set in the options.
      +     *
      +     * Will complete the walk in a single tick if the stream is consumed fully.
      +     * Otherwise, will pause as needed for stream backpressure.
      +     */
      +    streamSync(): Minipass;
      +    streamSync(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Minipass;
      +    streamSync(opts: WalkOptionsWithFileTypesFalse): Minipass;
      +    streamSync(opts: WalkOptions): Minipass;
      +    streamSync(entry: string | PathBase): Minipass;
      +    streamSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesUnset | WalkOptionsWithFileTypesTrue): Minipass;
      +    streamSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): Minipass;
      +    streamSync(entry: string | PathBase, opts: WalkOptions): Minipass | Minipass;
      +    chdir(path?: string | Path): void;
      +}
      +/**
      + * Options provided to all walk methods.
      + */
      +export interface WalkOptions {
      +    /**
      +     * Return results as {@link PathBase} objects rather than strings.
      +     * When set to false, results are fully resolved paths, as returned by
      +     * {@link PathBase.fullpath}.
      +     * @default true
      +     */
      +    withFileTypes?: boolean;
      +    /**
      +     *  Attempt to read directory entries from symbolic links. Otherwise, only
      +     *  actual directories are traversed. Regardless of this setting, a given
      +     *  target path will only ever be walked once, meaning that a symbolic link
      +     *  to a previously traversed directory will never be followed.
      +     *
      +     *  Setting this imposes a slight performance penalty, because `readlink`
      +     *  must be called on all symbolic links encountered, in order to avoid
      +     *  infinite cycles.
      +     * @default false
      +     */
      +    follow?: boolean;
      +    /**
      +     * Only return entries where the provided function returns true.
      +     *
      +     * This will not prevent directories from being traversed, even if they do
      +     * not pass the filter, though it will prevent directories themselves from
      +     * being included in the result set.  See {@link walkFilter}
      +     *
      +     * Asynchronous functions are not supported here.
      +     *
      +     * By default, if no filter is provided, all entries and traversed
      +     * directories are included.
      +     */
      +    filter?: (entry: PathBase) => boolean;
      +    /**
      +     * Only traverse directories (and in the case of {@link follow} being set to
      +     * true, symbolic links to directories) if the provided function returns
      +     * true.
      +     *
      +     * This will not prevent directories from being included in the result set,
      +     * even if they do not pass the supplied filter function.  See {@link filter}
      +     * to do that.
      +     *
      +     * Asynchronous functions are not supported here.
      +     */
      +    walkFilter?: (entry: PathBase) => boolean;
      +}
      +export type WalkOptionsWithFileTypesUnset = WalkOptions & {
      +    withFileTypes?: undefined;
      +};
      +export type WalkOptionsWithFileTypesTrue = WalkOptions & {
      +    withFileTypes: true;
      +};
      +export type WalkOptionsWithFileTypesFalse = WalkOptions & {
      +    withFileTypes: false;
      +};
      +/**
      + * Windows implementation of {@link PathScurryBase}
      + *
      + * Defaults to case insensitve, uses `'\\'` to generate path strings.  Uses
      + * {@link PathWin32} for Path objects.
      + */
      +export declare class PathScurryWin32 extends PathScurryBase {
      +    /**
      +     * separator for generating path strings
      +     */
      +    sep: '\\';
      +    constructor(cwd?: URL | string, opts?: PathScurryOpts);
      +    /**
      +     * @internal
      +     */
      +    parseRootPath(dir: string): string;
      +    /**
      +     * @internal
      +     */
      +    newRoot(fs: FSValue): PathWin32;
      +    /**
      +     * Return true if the provided path string is an absolute path
      +     */
      +    isAbsolute(p: string): boolean;
      +}
      +/**
      + * {@link PathScurryBase} implementation for all posix systems other than Darwin.
      + *
      + * Defaults to case-sensitive matching, uses `'/'` to generate path strings.
      + *
      + * Uses {@link PathPosix} for Path objects.
      + */
      +export declare class PathScurryPosix extends PathScurryBase {
      +    /**
      +     * separator for generating path strings
      +     */
      +    sep: '/';
      +    constructor(cwd?: URL | string, opts?: PathScurryOpts);
      +    /**
      +     * @internal
      +     */
      +    parseRootPath(_dir: string): string;
      +    /**
      +     * @internal
      +     */
      +    newRoot(fs: FSValue): PathPosix;
      +    /**
      +     * Return true if the provided path string is an absolute path
      +     */
      +    isAbsolute(p: string): boolean;
      +}
      +/**
      + * {@link PathScurryBase} implementation for Darwin (macOS) systems.
      + *
      + * Defaults to case-insensitive matching, uses `'/'` for generating path
      + * strings.
      + *
      + * Uses {@link PathPosix} for Path objects.
      + */
      +export declare class PathScurryDarwin extends PathScurryPosix {
      +    constructor(cwd?: URL | string, opts?: PathScurryOpts);
      +}
      +/**
      + * Default {@link PathBase} implementation for the current platform.
      + *
      + * {@link PathWin32} on Windows systems, {@link PathPosix} on all others.
      + */
      +export declare const Path: typeof PathWin32 | typeof PathPosix;
      +export type Path = PathBase | InstanceType;
      +/**
      + * Default {@link PathScurryBase} implementation for the current platform.
      + *
      + * {@link PathScurryWin32} on Windows systems, {@link PathScurryDarwin} on
      + * Darwin (macOS) systems, {@link PathScurryPosix} on all others.
      + */
      +export declare const PathScurry: typeof PathScurryWin32 | typeof PathScurryDarwin | typeof PathScurryPosix;
      +export type PathScurry = PathScurryBase | InstanceType;
      +export {};
      +//# sourceMappingURL=index.d.ts.map
      \ No newline at end of file
      diff --git a/node_modules/path-scurry/dist/commonjs/index.d.ts.map b/node_modules/path-scurry/dist/commonjs/index.d.ts.map
      new file mode 100644
      index 00000000..bf58a3a3
      --- /dev/null
      +++ b/node_modules/path-scurry/dist/commonjs/index.d.ts.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AAmBxC,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAE5C;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,QAAQ;IACvB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAA;IACnC,OAAO,CAAC,EAAE,CACR,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QAAE,aAAa,EAAE,IAAI,CAAA;KAAE,EAChC,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,GAAG,KAC9D,IAAI,CAAA;IACT,WAAW,CAAC,EAAE,CACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QAAE,aAAa,EAAE,IAAI,CAAA;KAAE,KAC7B,MAAM,EAAE,CAAA;IACb,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;IACvC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;IACvC,QAAQ,CAAC,EAAE;QACT,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;QACxC,OAAO,CAAC,EAAE,CACR,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;YAAE,aAAa,EAAE,IAAI,CAAA;SAAE,KAC7B,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;QACtB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;QAC5C,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;QAC5C,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAA;KACjB,CAAA;IACD,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAA;CACjB;AAED,UAAU,OAAO;IACf,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAA;IAClC,OAAO,EAAE,CACP,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QAAE,aAAa,EAAE,IAAI,CAAA;KAAE,EAChC,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,GAAG,KAC9D,IAAI,CAAA;IACT,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,aAAa,EAAE,IAAI,CAAA;KAAE,KAAK,MAAM,EAAE,CAAA;IACzE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;IACtC,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;IACtC,QAAQ,EAAE;QACR,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;QACvC,OAAO,EAAE,CACP,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;YAAE,aAAa,EAAE,IAAI,CAAA;SAAE,KAC7B,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;QACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;QAC3C,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;QAC3C,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAA;KACjB,CAAA;IACD,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAA;CACjB;AA+CD,MAAM,MAAM,IAAI,GACZ,SAAS,GACT,MAAM,GACN,iBAAiB,GACjB,WAAW,GACX,aAAa,GACb,MAAM,GACN,cAAc,GACd,QAAQ,CAAA;AAoDZ;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,MAAM,CAAC,EAAE,QAAQ,CAAA;IACjB;;OAEG;IACH,EAAE,CAAC,EAAE,QAAQ,CAAA;CACd;AAED;;;GAGG;AACH,qBAAa,YAAa,SAAQ,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;;CAIzD;AAcD;;;GAGG;AACH,qBAAa,aAAc,SAAQ,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;gBACjD,OAAO,GAAE,MAAkB;CAOxC;AAED;;;;GAIG;AACH,MAAM,MAAM,QAAQ,GAAG,QAAQ,EAAE,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAAA;AAE3D,QAAA,MAAM,QAAQ,eAAgC,CAAA;AAE9C;;;;;;;;;;;;GAYG;AACH,8BAAsB,QAAS,YAAW,MAAM;;IAC9C;;;;;;;;OAQG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ;;;;OAIG;IACH,IAAI,EAAE,QAAQ,CAAA;IACd;;;;OAIG;IACH,KAAK,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;KAAE,CAAA;IAChC;;;;OAIG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAA;IACjB;;;OAGG;IACH,MAAM,EAAE,OAAO,CAAA;IAEf;;;OAGG;IACH,KAAK,EAAE,OAAO,CAAQ;IAEtB;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;IAClC;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IAOpB,IAAI,GAAG,uBAEN;IAED,IAAI,IAAI,uBAEP;IAED,IAAI,KAAK,uBAER;IAED,IAAI,GAAG,uBAEN;IAED,IAAI,GAAG,uBAEN;IAED,IAAI,IAAI,uBAEP;IAED,IAAI,OAAO,uBAEV;IAED,IAAI,GAAG,uBAEN;IAED,IAAI,IAAI,uBAEP;IAED,IAAI,MAAM,uBAET;IAED,IAAI,OAAO,uBAEV;IAED,IAAI,OAAO,uBAEV;IAED,IAAI,OAAO,uBAEV;IAED,IAAI,WAAW,uBAEd;IAED,IAAI,KAAK,qBAER;IAED,IAAI,KAAK,qBAER;IAED,IAAI,KAAK,qBAER;IAED,IAAI,SAAS,qBAEZ;IAaD;;;;;OAKG;IACH,IAAI,UAAU,IAAI,MAAM,CAEvB;IAGD;;;;;OAKG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAGD;;;;;OAKG;gBAED,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,YAAU,EACtB,IAAI,EAAE,QAAQ,GAAG,SAAS,EAC1B,KAAK,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;KAAE,EAChC,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,QAAQ;IAoBhB;;;;OAIG;IACH,KAAK,IAAI,MAAM;IAMf;;OAEG;IACH,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAC5C;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ;IAC5C;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ;IAEzE;;OAEG;IACH,aAAa;IAIb;;OAEG;IACH,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ;IAsBhC;;;;;;;OAOG;IACH,QAAQ,IAAI,QAAQ;IAWpB;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ;IAwClD;;;OAGG;IACH,QAAQ,IAAI,MAAM;IAclB;;;;;OAKG;IACH,aAAa,IAAI,MAAM;IAavB;;OAEG;IACH,QAAQ,IAAI,MAAM;IAclB;;;;;OAKG;IACH,aAAa,IAAI,MAAM;IAiBvB;;;;;;OAMG;IACH,SAAS,IAAI,OAAO;IAIpB,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO;IAI3B,OAAO,IAAI,IAAI;IAef;;OAEG;IACH,MAAM,IAAI,OAAO;IAIjB;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,iBAAiB,IAAI,OAAO;IAI5B;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,MAAM,IAAI,OAAO;IAIjB;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;OAEG;IACH,cAAc,IAAI,OAAO;IAIzB;;;;;;OAMG;IACH,WAAW,IAAI,QAAQ,GAAG,SAAS;IAInC;;;;;;;OAOG;IACH,cAAc,IAAI,QAAQ,GAAG,SAAS;IAItC;;;;;;;OAOG;IACH,cAAc,IAAI,QAAQ,GAAG,SAAS;IAItC;;;;;;;OAOG;IACH,aAAa,IAAI,QAAQ,EAAE;IAK3B;;;;;;OAMG;IACH,WAAW,IAAI,OAAO;IAYtB;;;OAGG;IACH,aAAa,IAAI,OAAO;IAIxB;;;;OAIG;IACH,QAAQ,IAAI,OAAO;IAInB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAM3B;;;;;;;OAOG;IACG,QAAQ,IAAI,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IA0B/C;;OAEG;IACH,YAAY,IAAI,QAAQ,GAAG,SAAS;IA8KpC;;;;;;;;;;;;;;OAcG;IACG,KAAK,IAAI,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAW5C;;OAEG;IACH,SAAS,IAAI,QAAQ,GAAG,SAAS;IAsEjC;;;;;;;;;;;;;;;OAeG;IACH,SAAS,CACP,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,GAAG,EAClE,UAAU,GAAE,OAAe,GAC1B,IAAI;IA4CP;;;;;;;;OAQG;IACG,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAuCpC;;OAEG;IACH,WAAW,IAAI,QAAQ,EAAE;IA2BzB,UAAU;IAYV,UAAU,CACR,IAAI,EAAE,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC,EAC/B,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,OAAO,GACpC,OAAO;IASV;;;;;;;;OAQG;IACG,QAAQ,IAAI,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAW/C;;OAEG;IACH,YAAY,IAAI,QAAQ,GAAG,SAAS;IAWpC;;;;;OAKG;IACH,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI;CAuBnC;AAED;;;;;GAKG;AACH,qBAAa,SAAU,SAAQ,QAAQ;IACrC;;OAEG;IACH,GAAG,EAAE,IAAI,CAAO;IAChB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAY;IAE5B;;;;;OAKG;gBAED,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,YAAU,EACtB,IAAI,EAAE,QAAQ,GAAG,SAAS,EAC1B,KAAK,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;KAAE,EAChC,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,QAAQ;IAKhB;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAgB,EAAE,IAAI,GAAE,QAAa;IAYlE;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAInC;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ;IAkBnC;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,MAAuB,GAAG,OAAO;CAUtE;AAED;;;;GAIG;AACH,qBAAa,SAAU,SAAQ,QAAQ;IACrC;;OAEG;IACH,QAAQ,EAAE,GAAG,CAAM;IACnB;;OAEG;IACH,GAAG,EAAE,GAAG,CAAM;IAEd;;;;;OAKG;gBAED,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,YAAU,EACtB,IAAI,EAAE,QAAQ,GAAG,SAAS,EAC1B,KAAK,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;KAAE,EAChC,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,QAAQ;IAKhB;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAInC;;OAEG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ;IAIpC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAgB,EAAE,IAAI,GAAE,QAAa;CAWnE;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB;;;;;;;;;;;OAWG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;;;;OAKG;IACH,EAAE,CAAC,EAAE,QAAQ,CAAA;CACd;AAED;;;;;;;GAOG;AACH,8BAAsB,cAAc;;IAClC;;OAEG;IACH,IAAI,EAAE,QAAQ,CAAA;IACd;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,KAAK,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;KAAE,CAAA;IAChC;;OAEG;IACH,GAAG,EAAE,QAAQ,CAAA;IAIb;;;;OAIG;IACH,MAAM,EAAE,OAAO,CAAA;IAEf;;;;OAIG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;IAI7B;;;;;;OAMG;gBAED,GAAG,GAAE,GAAG,GAAG,MAAM,aAAgB,EACjC,QAAQ,EAAE,OAAO,KAAK,GAAG,OAAO,KAAK,EACrC,GAAG,EAAE,MAAM,GAAG,MAAM,EACpB,EACE,MAAM,EACN,iBAA6B,EAC7B,EAAc,GACf,GAAE,cAAmB;IA+CxB;;OAEG;IACH,KAAK,CAAC,IAAI,GAAE,IAAI,GAAG,MAAiB,GAAG,MAAM;IAO7C;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAC3C;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,GAAG,QAAQ;IACvC;;OAEG;IACH,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAEvC;;;;;OAKG;IACH,aAAa;IAIb;;;;;;;;OAQG;IACH,OAAO,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM;IAqBnC;;;;;;;;;;OAUG;IACH,YAAY,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM;IAqBxC;;OAEG;IACH,QAAQ,CAAC,KAAK,GAAE,QAAQ,GAAG,MAAiB,GAAG,MAAM;IAOrD;;;OAGG;IACH,aAAa,CAAC,KAAK,GAAE,QAAQ,GAAG,MAAiB,GAAG,MAAM;IAO1D;;OAEG;IACH,QAAQ,CAAC,KAAK,GAAE,QAAQ,GAAG,MAAiB,GAAG,MAAM;IAOrD;;OAEG;IACH,OAAO,CAAC,KAAK,GAAE,QAAQ,GAAG,MAAiB,GAAG,MAAM;IAOpD;;;;;;;;;;;;;OAaG;IAEH,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC9B,OAAO,CAAC,IAAI,EAAE;QAAE,aAAa,EAAE,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC3D,OAAO,CAAC,IAAI,EAAE;QAAE,aAAa,EAAE,KAAK,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAC1D,OAAO,CAAC,IAAI,EAAE;QAAE,aAAa,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC;IACzE,OAAO,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IACtD,OAAO,CACL,KAAK,EAAE,QAAQ,GAAG,MAAM,EACxB,IAAI,EAAE;QAAE,aAAa,EAAE,IAAI,CAAA;KAAE,GAC5B,OAAO,CAAC,QAAQ,EAAE,CAAC;IACtB,OAAO,CACL,KAAK,EAAE,QAAQ,GAAG,MAAM,EACxB,IAAI,EAAE;QAAE,aAAa,EAAE,KAAK,CAAA;KAAE,GAC7B,OAAO,CAAC,MAAM,EAAE,CAAC;IACpB,OAAO,CACL,KAAK,EAAE,QAAQ,GAAG,MAAM,EACxB,IAAI,EAAE;QAAE,aAAa,EAAE,OAAO,CAAA;KAAE,GAC/B,OAAO,CAAC,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC;IAsBjC;;OAEG;IACH,WAAW,IAAI,QAAQ,EAAE;IACzB,WAAW,CAAC,IAAI,EAAE;QAAE,aAAa,EAAE,IAAI,CAAA;KAAE,GAAG,QAAQ,EAAE;IACtD,WAAW,CAAC,IAAI,EAAE;QAAE,aAAa,EAAE,KAAK,CAAA;KAAE,GAAG,MAAM,EAAE;IACrD,WAAW,CAAC,IAAI,EAAE;QAAE,aAAa,EAAE,OAAO,CAAA;KAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,EAAE;IACpE,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ,EAAE;IACjD,WAAW,CACT,KAAK,EAAE,QAAQ,GAAG,MAAM,EACxB,IAAI,EAAE;QAAE,aAAa,EAAE,IAAI,CAAA;KAAE,GAC5B,QAAQ,EAAE;IACb,WAAW,CACT,KAAK,EAAE,QAAQ,GAAG,MAAM,EACxB,IAAI,EAAE;QAAE,aAAa,EAAE,KAAK,CAAA;KAAE,GAC7B,MAAM,EAAE;IACX,WAAW,CACT,KAAK,EAAE,QAAQ,GAAG,MAAM,EACxB,IAAI,EAAE;QAAE,aAAa,EAAE,OAAO,CAAA;KAAE,GAC/B,QAAQ,EAAE,GAAG,MAAM,EAAE;IAuBxB;;;;;;;;;;;;;;OAcG;IACG,KAAK,CACT,KAAK,GAAE,MAAM,GAAG,QAAmB,GAClC,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAOhC;;OAEG;IACH,SAAS,CAAC,KAAK,GAAE,MAAM,GAAG,QAAmB,GAAG,QAAQ,GAAG,SAAS;IAOpE;;;;;;;;;;;;;OAaG;IACH,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,GAAG,EAAE;QAAE,aAAa,EAAE,KAAK,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IACpE,QAAQ,CAAC,GAAG,EAAE;QAAE,aAAa,EAAE,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IACrE,QAAQ,CAAC,GAAG,EAAE;QACZ,aAAa,EAAE,OAAO,CAAA;KACvB,GAAG,OAAO,CAAC,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CACN,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,GAAG,CAAC,EAAE;QAAE,aAAa,EAAE,KAAK,CAAA;KAAE,GAC7B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAC9B,QAAQ,CACN,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,GAAG,EAAE;QAAE,aAAa,EAAE,IAAI,CAAA;KAAE,GAC3B,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAChC,QAAQ,CACN,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,GAAG,EAAE;QAAE,aAAa,EAAE,OAAO,CAAA;KAAE,GAC9B,OAAO,CAAC,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IAiBzC;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,SAAS;IAClC,YAAY,CAAC,GAAG,EAAE;QAAE,aAAa,EAAE,KAAK,CAAA;KAAE,GAAG,MAAM,GAAG,SAAS;IAC/D,YAAY,CAAC,GAAG,EAAE;QAAE,aAAa,EAAE,IAAI,CAAA;KAAE,GAAG,QAAQ,GAAG,SAAS;IAChE,YAAY,CAAC,GAAG,EAAE;QAChB,aAAa,EAAE,OAAO,CAAA;KACvB,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS;IACjC,YAAY,CACV,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,GAAG,CAAC,EAAE;QAAE,aAAa,EAAE,KAAK,CAAA;KAAE,GAC7B,MAAM,GAAG,SAAS;IACrB,YAAY,CACV,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,GAAG,EAAE;QAAE,aAAa,EAAE,IAAI,CAAA;KAAE,GAC3B,QAAQ,GAAG,SAAS;IACvB,YAAY,CACV,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,GAAG,EAAE;QAAE,aAAa,EAAE,OAAO,CAAA;KAAE,GAC9B,MAAM,GAAG,QAAQ,GAAG,SAAS;IAiBhC;;;;;;;;;;;;OAYG;IACH,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,GAAG,EAAE;QAAE,aAAa,EAAE,KAAK,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IACpE,QAAQ,CAAC,GAAG,EAAE;QAAE,aAAa,EAAE,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IACrE,QAAQ,CAAC,GAAG,EAAE;QACZ,aAAa,EAAE,OAAO,CAAA;KACvB,GAAG,OAAO,CAAC,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CACN,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,GAAG,CAAC,EAAE;QAAE,aAAa,EAAE,KAAK,CAAA;KAAE,GAC7B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAC9B,QAAQ,CACN,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,GAAG,EAAE;QAAE,aAAa,EAAE,IAAI,CAAA;KAAE,GAC3B,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAChC,QAAQ,CACN,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,GAAG,EAAE;QAAE,aAAa,EAAE,OAAO,CAAA;KAAE,GAC9B,OAAO,CAAC,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IAiBzC,YAAY,IAAI,MAAM,GAAG,SAAS;IAClC,YAAY,CAAC,GAAG,EAAE;QAAE,aAAa,EAAE,KAAK,CAAA;KAAE,GAAG,MAAM,GAAG,SAAS;IAC/D,YAAY,CAAC,GAAG,EAAE;QAAE,aAAa,EAAE,IAAI,CAAA;KAAE,GAAG,QAAQ,GAAG,SAAS;IAChE,YAAY,CAAC,GAAG,EAAE;QAChB,aAAa,EAAE,OAAO,CAAA;KACvB,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS;IACjC,YAAY,CACV,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,GAAG,CAAC,EAAE;QAAE,aAAa,EAAE,KAAK,CAAA;KAAE,GAC7B,MAAM,GAAG,SAAS;IACrB,YAAY,CACV,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,GAAG,EAAE;QAAE,aAAa,EAAE,IAAI,CAAA;KAAE,GAC3B,QAAQ,GAAG,SAAS;IACvB,YAAY,CACV,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,GAAG,EAAE;QAAE,aAAa,EAAE,OAAO,CAAA;KAAE,GAC9B,MAAM,GAAG,QAAQ,GAAG,SAAS;IAiBhC;;;;;;;OAOG;IACH,IAAI,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC3B,IAAI,CACF,IAAI,EAAE,4BAA4B,GAAG,6BAA6B,GACjE,OAAO,CAAC,QAAQ,EAAE,CAAC;IACtB,IAAI,CAAC,IAAI,EAAE,6BAA6B,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAC5D,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC;IACvD,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IACnD,IAAI,CACF,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,IAAI,EAAE,4BAA4B,GAAG,6BAA6B,GACjE,OAAO,CAAC,QAAQ,EAAE,CAAC;IACtB,IAAI,CACF,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,IAAI,EAAE,6BAA6B,GAClC,OAAO,CAAC,MAAM,EAAE,CAAC;IACpB,IAAI,CACF,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC;IAwEjC;;;;;;;OAOG;IACH,QAAQ,IAAI,QAAQ,EAAE;IACtB,QAAQ,CACN,IAAI,EAAE,4BAA4B,GAAG,6BAA6B,GACjE,QAAQ,EAAE;IACb,QAAQ,CAAC,IAAI,EAAE,6BAA6B,GAAG,MAAM,EAAE;IACvD,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,EAAE,GAAG,QAAQ,EAAE;IAClD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,EAAE;IAC9C,QAAQ,CACN,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,IAAI,EAAE,6BAA6B,GAAG,4BAA4B,GACjE,QAAQ,EAAE;IACb,QAAQ,CACN,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,IAAI,EAAE,6BAA6B,GAClC,MAAM,EAAE;IACX,QAAQ,CACN,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,IAAI,EAAE,WAAW,GAChB,QAAQ,EAAE,GAAG,MAAM,EAAE;IAyCxB;;;;;;;;OAQG;IACH,CAAC,MAAM,CAAC,aAAa,CAAC;IAItB;;;;;;;OAOG;IACH,OAAO,IAAI,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC;IAC/C,OAAO,CACL,IAAI,EAAE,4BAA4B,GAAG,6BAA6B,GACjE,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC;IACvC,OAAO,CACL,IAAI,EAAE,6BAA6B,GAClC,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC;IACrC,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,cAAc,CAAC,MAAM,GAAG,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC;IACzE,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC;IACvE,OAAO,CACL,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,IAAI,EAAE,4BAA4B,GAAG,6BAA6B,GACjE,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC;IACvC,OAAO,CACL,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,IAAI,EAAE,6BAA6B,GAClC,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC;IACrC,OAAO,CACL,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,IAAI,EAAE,WAAW,GAChB,cAAc,CAAC,QAAQ,GAAG,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC;IAiBhD;;;;OAIG;IACH,CAAC,MAAM,CAAC,QAAQ,CAAC;IAIjB,WAAW,IAAI,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC;IAC9C,WAAW,CACT,IAAI,EAAE,4BAA4B,GAAG,6BAA6B,GACjE,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC;IAClC,WAAW,CACT,IAAI,EAAE,6BAA6B,GAClC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC;IAChC,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,CAAC,MAAM,GAAG,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC;IACxE,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC;IACtE,WAAW,CACT,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,IAAI,EAAE,4BAA4B,GAAG,6BAA6B,GACjE,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC;IAClC,WAAW,CACT,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,IAAI,EAAE,6BAA6B,GAClC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC;IAChC,WAAW,CACT,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,IAAI,EAAE,WAAW,GAChB,SAAS,CAAC,QAAQ,GAAG,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC;IAuC3C;;;;;OAKG;IACH,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC;IAC5B,MAAM,CACJ,IAAI,EAAE,4BAA4B,GAAG,6BAA6B,GACjE,QAAQ,CAAC,QAAQ,CAAC;IACrB,MAAM,CAAC,IAAI,EAAE,6BAA6B,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC7D,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC;IACtD,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACpD,MAAM,CACJ,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,IAAI,EAAE,6BAA6B,GAAG,4BAA4B,GACjE,QAAQ,CAAC,QAAQ,CAAC;IACrB,MAAM,CACJ,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,IAAI,EAAE,6BAA6B,GAClC,QAAQ,CAAC,MAAM,CAAC;IACnB,MAAM,CACJ,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,IAAI,EAAE,WAAW,GAChB,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC;IAiGxC;;;;;;;;OAQG;IACH,UAAU,IAAI,QAAQ,CAAC,QAAQ,CAAC;IAChC,UAAU,CACR,IAAI,EAAE,4BAA4B,GAAG,6BAA6B,GACjE,QAAQ,CAAC,QAAQ,CAAC;IACrB,UAAU,CAAC,IAAI,EAAE,6BAA6B,GAAG,QAAQ,CAAC,MAAM,CAAC;IACjE,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC;IAC1D,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACxD,UAAU,CACR,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,IAAI,EAAE,6BAA6B,GAAG,4BAA4B,GACjE,QAAQ,CAAC,QAAQ,CAAC;IACrB,UAAU,CACR,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,IAAI,EAAE,6BAA6B,GAClC,QAAQ,CAAC,MAAM,CAAC;IACnB,UAAU,CACR,KAAK,EAAE,MAAM,GAAG,QAAQ,EACxB,IAAI,EAAE,WAAW,GAChB,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC;IA6DxC,KAAK,CAAC,IAAI,GAAE,MAAM,GAAG,IAAe;CAKrC;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IAEvB;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAEhB;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAA;IAErC;;;;;;;;;;OAUG;IACH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAA;CAC1C;AAED,MAAM,MAAM,6BAA6B,GAAG,WAAW,GAAG;IACxD,aAAa,CAAC,EAAE,SAAS,CAAA;CAC1B,CAAA;AACD,MAAM,MAAM,4BAA4B,GAAG,WAAW,GAAG;IACvD,aAAa,EAAE,IAAI,CAAA;CACpB,CAAA;AACD,MAAM,MAAM,6BAA6B,GAAG,WAAW,GAAG;IACxD,aAAa,EAAE,KAAK,CAAA;CACrB,CAAA;AAED;;;;;GAKG;AACH,qBAAa,eAAgB,SAAQ,cAAc;IACjD;;OAEG;IACH,GAAG,EAAE,IAAI,CAAO;gBAGd,GAAG,GAAE,GAAG,GAAG,MAAsB,EACjC,IAAI,GAAE,cAAmB;IAU3B;;OAEG;IACH,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAOlC;;OAEG;IACH,OAAO,CAAC,EAAE,EAAE,OAAO;IAYnB;;OAEG;IACH,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;CAK/B;AAED;;;;;;GAMG;AACH,qBAAa,eAAgB,SAAQ,cAAc;IACjD;;OAEG;IACH,GAAG,EAAE,GAAG,CAAM;gBAEZ,GAAG,GAAE,GAAG,GAAG,MAAsB,EACjC,IAAI,GAAE,cAAmB;IAO3B;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAInC;;OAEG;IACH,OAAO,CAAC,EAAE,EAAE,OAAO;IAYnB;;OAEG;IACH,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;CAG/B;AAED;;;;;;;GAOG;AACH,qBAAa,gBAAiB,SAAQ,eAAe;gBAEjD,GAAG,GAAE,GAAG,GAAG,MAAsB,EACjC,IAAI,GAAE,cAAmB;CAK5B;AAED;;;;GAIG;AACH,eAAO,MAAM,IAAI,qCAAuD,CAAA;AACxE,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,YAAY,CAAC,OAAO,IAAI,CAAC,CAAA;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,UAAU,EACnB,OAAO,eAAe,GACtB,OAAO,gBAAgB,GACvB,OAAO,eAGQ,CAAA;AACnB,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,YAAY,CAAC,OAAO,UAAU,CAAC,CAAA"}
      \ No newline at end of file
      diff --git a/node_modules/path-scurry/dist/commonjs/index.js b/node_modules/path-scurry/dist/commonjs/index.js
      new file mode 100644
      index 00000000..112f732d
      --- /dev/null
      +++ b/node_modules/path-scurry/dist/commonjs/index.js
      @@ -0,0 +1,2018 @@
      +"use strict";
      +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
      +    if (k2 === undefined) k2 = k;
      +    var desc = Object.getOwnPropertyDescriptor(m, k);
      +    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      +      desc = { enumerable: true, get: function() { return m[k]; } };
      +    }
      +    Object.defineProperty(o, k2, desc);
      +}) : (function(o, m, k, k2) {
      +    if (k2 === undefined) k2 = k;
      +    o[k2] = m[k];
      +}));
      +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
      +    Object.defineProperty(o, "default", { enumerable: true, value: v });
      +}) : function(o, v) {
      +    o["default"] = v;
      +});
      +var __importStar = (this && this.__importStar) || function (mod) {
      +    if (mod && mod.__esModule) return mod;
      +    var result = {};
      +    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
      +    __setModuleDefault(result, mod);
      +    return result;
      +};
      +Object.defineProperty(exports, "__esModule", { value: true });
      +exports.PathScurry = exports.Path = exports.PathScurryDarwin = exports.PathScurryPosix = exports.PathScurryWin32 = exports.PathScurryBase = exports.PathPosix = exports.PathWin32 = exports.PathBase = exports.ChildrenCache = exports.ResolveCache = void 0;
      +const lru_cache_1 = require("lru-cache");
      +const node_path_1 = require("node:path");
      +const node_url_1 = require("node:url");
      +const fs_1 = require("fs");
      +const actualFS = __importStar(require("node:fs"));
      +const realpathSync = fs_1.realpathSync.native;
      +// TODO: test perf of fs/promises realpath vs realpathCB,
      +// since the promises one uses realpath.native
      +const promises_1 = require("node:fs/promises");
      +const minipass_1 = require("minipass");
      +const defaultFS = {
      +    lstatSync: fs_1.lstatSync,
      +    readdir: fs_1.readdir,
      +    readdirSync: fs_1.readdirSync,
      +    readlinkSync: fs_1.readlinkSync,
      +    realpathSync,
      +    promises: {
      +        lstat: promises_1.lstat,
      +        readdir: promises_1.readdir,
      +        readlink: promises_1.readlink,
      +        realpath: promises_1.realpath,
      +    },
      +};
      +// if they just gave us require('fs') then use our default
      +const fsFromOption = (fsOption) => !fsOption || fsOption === defaultFS || fsOption === actualFS ?
      +    defaultFS
      +    : {
      +        ...defaultFS,
      +        ...fsOption,
      +        promises: {
      +            ...defaultFS.promises,
      +            ...(fsOption.promises || {}),
      +        },
      +    };
      +// turn something like //?/c:/ into c:\
      +const uncDriveRegexp = /^\\\\\?\\([a-z]:)\\?$/i;
      +const uncToDrive = (rootPath) => rootPath.replace(/\//g, '\\').replace(uncDriveRegexp, '$1\\');
      +// windows paths are separated by either / or \
      +const eitherSep = /[\\\/]/;
      +const UNKNOWN = 0; // may not even exist, for all we know
      +const IFIFO = 0b0001;
      +const IFCHR = 0b0010;
      +const IFDIR = 0b0100;
      +const IFBLK = 0b0110;
      +const IFREG = 0b1000;
      +const IFLNK = 0b1010;
      +const IFSOCK = 0b1100;
      +const IFMT = 0b1111;
      +// mask to unset low 4 bits
      +const IFMT_UNKNOWN = ~IFMT;
      +// set after successfully calling readdir() and getting entries.
      +const READDIR_CALLED = 0b0000_0001_0000;
      +// set after a successful lstat()
      +const LSTAT_CALLED = 0b0000_0010_0000;
      +// set if an entry (or one of its parents) is definitely not a dir
      +const ENOTDIR = 0b0000_0100_0000;
      +// set if an entry (or one of its parents) does not exist
      +// (can also be set on lstat errors like EACCES or ENAMETOOLONG)
      +const ENOENT = 0b0000_1000_0000;
      +// cannot have child entries -- also verify &IFMT is either IFDIR or IFLNK
      +// set if we fail to readlink
      +const ENOREADLINK = 0b0001_0000_0000;
      +// set if we know realpath() will fail
      +const ENOREALPATH = 0b0010_0000_0000;
      +const ENOCHILD = ENOTDIR | ENOENT | ENOREALPATH;
      +const TYPEMASK = 0b0011_1111_1111;
      +const entToType = (s) => s.isFile() ? IFREG
      +    : s.isDirectory() ? IFDIR
      +        : s.isSymbolicLink() ? IFLNK
      +            : s.isCharacterDevice() ? IFCHR
      +                : s.isBlockDevice() ? IFBLK
      +                    : s.isSocket() ? IFSOCK
      +                        : s.isFIFO() ? IFIFO
      +                            : UNKNOWN;
      +// normalize unicode path names
      +const normalizeCache = new lru_cache_1.LRUCache({ max: 2 ** 12 });
      +const normalize = (s) => {
      +    const c = normalizeCache.get(s);
      +    if (c)
      +        return c;
      +    const n = s.normalize('NFKD');
      +    normalizeCache.set(s, n);
      +    return n;
      +};
      +const normalizeNocaseCache = new lru_cache_1.LRUCache({ max: 2 ** 12 });
      +const normalizeNocase = (s) => {
      +    const c = normalizeNocaseCache.get(s);
      +    if (c)
      +        return c;
      +    const n = normalize(s.toLowerCase());
      +    normalizeNocaseCache.set(s, n);
      +    return n;
      +};
      +/**
      + * An LRUCache for storing resolved path strings or Path objects.
      + * @internal
      + */
      +class ResolveCache extends lru_cache_1.LRUCache {
      +    constructor() {
      +        super({ max: 256 });
      +    }
      +}
      +exports.ResolveCache = ResolveCache;
      +// In order to prevent blowing out the js heap by allocating hundreds of
      +// thousands of Path entries when walking extremely large trees, the "children"
      +// in this tree are represented by storing an array of Path entries in an
      +// LRUCache, indexed by the parent.  At any time, Path.children() may return an
      +// empty array, indicating that it doesn't know about any of its children, and
      +// thus has to rebuild that cache.  This is fine, it just means that we don't
      +// benefit as much from having the cached entries, but huge directory walks
      +// don't blow out the stack, and smaller ones are still as fast as possible.
      +//
      +//It does impose some complexity when building up the readdir data, because we
      +//need to pass a reference to the children array that we started with.
      +/**
      + * an LRUCache for storing child entries.
      + * @internal
      + */
      +class ChildrenCache extends lru_cache_1.LRUCache {
      +    constructor(maxSize = 16 * 1024) {
      +        super({
      +            maxSize,
      +            // parent + children
      +            sizeCalculation: a => a.length + 1,
      +        });
      +    }
      +}
      +exports.ChildrenCache = ChildrenCache;
      +const setAsCwd = Symbol('PathScurry setAsCwd');
      +/**
      + * Path objects are sort of like a super-powered
      + * {@link https://nodejs.org/docs/latest/api/fs.html#class-fsdirent fs.Dirent}
      + *
      + * Each one represents a single filesystem entry on disk, which may or may not
      + * exist. It includes methods for reading various types of information via
      + * lstat, readlink, and readdir, and caches all information to the greatest
      + * degree possible.
      + *
      + * Note that fs operations that would normally throw will instead return an
      + * "empty" value. This is in order to prevent excessive overhead from error
      + * stack traces.
      + */
      +class PathBase {
      +    /**
      +     * the basename of this path
      +     *
      +     * **Important**: *always* test the path name against any test string
      +     * usingthe {@link isNamed} method, and not by directly comparing this
      +     * string. Otherwise, unicode path strings that the system sees as identical
      +     * will not be properly treated as the same path, leading to incorrect
      +     * behavior and possible security issues.
      +     */
      +    name;
      +    /**
      +     * the Path entry corresponding to the path root.
      +     *
      +     * @internal
      +     */
      +    root;
      +    /**
      +     * All roots found within the current PathScurry family
      +     *
      +     * @internal
      +     */
      +    roots;
      +    /**
      +     * a reference to the parent path, or undefined in the case of root entries
      +     *
      +     * @internal
      +     */
      +    parent;
      +    /**
      +     * boolean indicating whether paths are compared case-insensitively
      +     * @internal
      +     */
      +    nocase;
      +    /**
      +     * boolean indicating that this path is the current working directory
      +     * of the PathScurry collection that contains it.
      +     */
      +    isCWD = false;
      +    // potential default fs override
      +    #fs;
      +    // Stats fields
      +    #dev;
      +    get dev() {
      +        return this.#dev;
      +    }
      +    #mode;
      +    get mode() {
      +        return this.#mode;
      +    }
      +    #nlink;
      +    get nlink() {
      +        return this.#nlink;
      +    }
      +    #uid;
      +    get uid() {
      +        return this.#uid;
      +    }
      +    #gid;
      +    get gid() {
      +        return this.#gid;
      +    }
      +    #rdev;
      +    get rdev() {
      +        return this.#rdev;
      +    }
      +    #blksize;
      +    get blksize() {
      +        return this.#blksize;
      +    }
      +    #ino;
      +    get ino() {
      +        return this.#ino;
      +    }
      +    #size;
      +    get size() {
      +        return this.#size;
      +    }
      +    #blocks;
      +    get blocks() {
      +        return this.#blocks;
      +    }
      +    #atimeMs;
      +    get atimeMs() {
      +        return this.#atimeMs;
      +    }
      +    #mtimeMs;
      +    get mtimeMs() {
      +        return this.#mtimeMs;
      +    }
      +    #ctimeMs;
      +    get ctimeMs() {
      +        return this.#ctimeMs;
      +    }
      +    #birthtimeMs;
      +    get birthtimeMs() {
      +        return this.#birthtimeMs;
      +    }
      +    #atime;
      +    get atime() {
      +        return this.#atime;
      +    }
      +    #mtime;
      +    get mtime() {
      +        return this.#mtime;
      +    }
      +    #ctime;
      +    get ctime() {
      +        return this.#ctime;
      +    }
      +    #birthtime;
      +    get birthtime() {
      +        return this.#birthtime;
      +    }
      +    #matchName;
      +    #depth;
      +    #fullpath;
      +    #fullpathPosix;
      +    #relative;
      +    #relativePosix;
      +    #type;
      +    #children;
      +    #linkTarget;
      +    #realpath;
      +    /**
      +     * This property is for compatibility with the Dirent class as of
      +     * Node v20, where Dirent['parentPath'] refers to the path of the
      +     * directory that was passed to readdir. For root entries, it's the path
      +     * to the entry itself.
      +     */
      +    get parentPath() {
      +        return (this.parent || this).fullpath();
      +    }
      +    /* c8 ignore start */
      +    /**
      +     * Deprecated alias for Dirent['parentPath'] Somewhat counterintuitively,
      +     * this property refers to the *parent* path, not the path object itself.
      +     *
      +     * @deprecated
      +     */
      +    get path() {
      +        return this.parentPath;
      +    }
      +    /* c8 ignore stop */
      +    /**
      +     * Do not create new Path objects directly.  They should always be accessed
      +     * via the PathScurry class or other methods on the Path class.
      +     *
      +     * @internal
      +     */
      +    constructor(name, type = UNKNOWN, root, roots, nocase, children, opts) {
      +        this.name = name;
      +        this.#matchName = nocase ? normalizeNocase(name) : normalize(name);
      +        this.#type = type & TYPEMASK;
      +        this.nocase = nocase;
      +        this.roots = roots;
      +        this.root = root || this;
      +        this.#children = children;
      +        this.#fullpath = opts.fullpath;
      +        this.#relative = opts.relative;
      +        this.#relativePosix = opts.relativePosix;
      +        this.parent = opts.parent;
      +        if (this.parent) {
      +            this.#fs = this.parent.#fs;
      +        }
      +        else {
      +            this.#fs = fsFromOption(opts.fs);
      +        }
      +    }
      +    /**
      +     * Returns the depth of the Path object from its root.
      +     *
      +     * For example, a path at `/foo/bar` would have a depth of 2.
      +     */
      +    depth() {
      +        if (this.#depth !== undefined)
      +            return this.#depth;
      +        if (!this.parent)
      +            return (this.#depth = 0);
      +        return (this.#depth = this.parent.depth() + 1);
      +    }
      +    /**
      +     * @internal
      +     */
      +    childrenCache() {
      +        return this.#children;
      +    }
      +    /**
      +     * Get the Path object referenced by the string path, resolved from this Path
      +     */
      +    resolve(path) {
      +        if (!path) {
      +            return this;
      +        }
      +        const rootPath = this.getRootString(path);
      +        const dir = path.substring(rootPath.length);
      +        const dirParts = dir.split(this.splitSep);
      +        const result = rootPath ?
      +            this.getRoot(rootPath).#resolveParts(dirParts)
      +            : this.#resolveParts(dirParts);
      +        return result;
      +    }
      +    #resolveParts(dirParts) {
      +        let p = this;
      +        for (const part of dirParts) {
      +            p = p.child(part);
      +        }
      +        return p;
      +    }
      +    /**
      +     * Returns the cached children Path objects, if still available.  If they
      +     * have fallen out of the cache, then returns an empty array, and resets the
      +     * READDIR_CALLED bit, so that future calls to readdir() will require an fs
      +     * lookup.
      +     *
      +     * @internal
      +     */
      +    children() {
      +        const cached = this.#children.get(this);
      +        if (cached) {
      +            return cached;
      +        }
      +        const children = Object.assign([], { provisional: 0 });
      +        this.#children.set(this, children);
      +        this.#type &= ~READDIR_CALLED;
      +        return children;
      +    }
      +    /**
      +     * Resolves a path portion and returns or creates the child Path.
      +     *
      +     * Returns `this` if pathPart is `''` or `'.'`, or `parent` if pathPart is
      +     * `'..'`.
      +     *
      +     * This should not be called directly.  If `pathPart` contains any path
      +     * separators, it will lead to unsafe undefined behavior.
      +     *
      +     * Use `Path.resolve()` instead.
      +     *
      +     * @internal
      +     */
      +    child(pathPart, opts) {
      +        if (pathPart === '' || pathPart === '.') {
      +            return this;
      +        }
      +        if (pathPart === '..') {
      +            return this.parent || this;
      +        }
      +        // find the child
      +        const children = this.children();
      +        const name = this.nocase ? normalizeNocase(pathPart) : normalize(pathPart);
      +        for (const p of children) {
      +            if (p.#matchName === name) {
      +                return p;
      +            }
      +        }
      +        // didn't find it, create provisional child, since it might not
      +        // actually exist.  If we know the parent isn't a dir, then
      +        // in fact it CAN'T exist.
      +        const s = this.parent ? this.sep : '';
      +        const fullpath = this.#fullpath ? this.#fullpath + s + pathPart : undefined;
      +        const pchild = this.newChild(pathPart, UNKNOWN, {
      +            ...opts,
      +            parent: this,
      +            fullpath,
      +        });
      +        if (!this.canReaddir()) {
      +            pchild.#type |= ENOENT;
      +        }
      +        // don't have to update provisional, because if we have real children,
      +        // then provisional is set to children.length, otherwise a lower number
      +        children.push(pchild);
      +        return pchild;
      +    }
      +    /**
      +     * The relative path from the cwd. If it does not share an ancestor with
      +     * the cwd, then this ends up being equivalent to the fullpath()
      +     */
      +    relative() {
      +        if (this.isCWD)
      +            return '';
      +        if (this.#relative !== undefined) {
      +            return this.#relative;
      +        }
      +        const name = this.name;
      +        const p = this.parent;
      +        if (!p) {
      +            return (this.#relative = this.name);
      +        }
      +        const pv = p.relative();
      +        return pv + (!pv || !p.parent ? '' : this.sep) + name;
      +    }
      +    /**
      +     * The relative path from the cwd, using / as the path separator.
      +     * If it does not share an ancestor with
      +     * the cwd, then this ends up being equivalent to the fullpathPosix()
      +     * On posix systems, this is identical to relative().
      +     */
      +    relativePosix() {
      +        if (this.sep === '/')
      +            return this.relative();
      +        if (this.isCWD)
      +            return '';
      +        if (this.#relativePosix !== undefined)
      +            return this.#relativePosix;
      +        const name = this.name;
      +        const p = this.parent;
      +        if (!p) {
      +            return (this.#relativePosix = this.fullpathPosix());
      +        }
      +        const pv = p.relativePosix();
      +        return pv + (!pv || !p.parent ? '' : '/') + name;
      +    }
      +    /**
      +     * The fully resolved path string for this Path entry
      +     */
      +    fullpath() {
      +        if (this.#fullpath !== undefined) {
      +            return this.#fullpath;
      +        }
      +        const name = this.name;
      +        const p = this.parent;
      +        if (!p) {
      +            return (this.#fullpath = this.name);
      +        }
      +        const pv = p.fullpath();
      +        const fp = pv + (!p.parent ? '' : this.sep) + name;
      +        return (this.#fullpath = fp);
      +    }
      +    /**
      +     * On platforms other than windows, this is identical to fullpath.
      +     *
      +     * On windows, this is overridden to return the forward-slash form of the
      +     * full UNC path.
      +     */
      +    fullpathPosix() {
      +        if (this.#fullpathPosix !== undefined)
      +            return this.#fullpathPosix;
      +        if (this.sep === '/')
      +            return (this.#fullpathPosix = this.fullpath());
      +        if (!this.parent) {
      +            const p = this.fullpath().replace(/\\/g, '/');
      +            if (/^[a-z]:\//i.test(p)) {
      +                return (this.#fullpathPosix = `//?/${p}`);
      +            }
      +            else {
      +                return (this.#fullpathPosix = p);
      +            }
      +        }
      +        const p = this.parent;
      +        const pfpp = p.fullpathPosix();
      +        const fpp = pfpp + (!pfpp || !p.parent ? '' : '/') + this.name;
      +        return (this.#fullpathPosix = fpp);
      +    }
      +    /**
      +     * Is the Path of an unknown type?
      +     *
      +     * Note that we might know *something* about it if there has been a previous
      +     * filesystem operation, for example that it does not exist, or is not a
      +     * link, or whether it has child entries.
      +     */
      +    isUnknown() {
      +        return (this.#type & IFMT) === UNKNOWN;
      +    }
      +    isType(type) {
      +        return this[`is${type}`]();
      +    }
      +    getType() {
      +        return (this.isUnknown() ? 'Unknown'
      +            : this.isDirectory() ? 'Directory'
      +                : this.isFile() ? 'File'
      +                    : this.isSymbolicLink() ? 'SymbolicLink'
      +                        : this.isFIFO() ? 'FIFO'
      +                            : this.isCharacterDevice() ? 'CharacterDevice'
      +                                : this.isBlockDevice() ? 'BlockDevice'
      +                                    : /* c8 ignore start */ this.isSocket() ? 'Socket'
      +                                        : 'Unknown');
      +        /* c8 ignore stop */
      +    }
      +    /**
      +     * Is the Path a regular file?
      +     */
      +    isFile() {
      +        return (this.#type & IFMT) === IFREG;
      +    }
      +    /**
      +     * Is the Path a directory?
      +     */
      +    isDirectory() {
      +        return (this.#type & IFMT) === IFDIR;
      +    }
      +    /**
      +     * Is the path a character device?
      +     */
      +    isCharacterDevice() {
      +        return (this.#type & IFMT) === IFCHR;
      +    }
      +    /**
      +     * Is the path a block device?
      +     */
      +    isBlockDevice() {
      +        return (this.#type & IFMT) === IFBLK;
      +    }
      +    /**
      +     * Is the path a FIFO pipe?
      +     */
      +    isFIFO() {
      +        return (this.#type & IFMT) === IFIFO;
      +    }
      +    /**
      +     * Is the path a socket?
      +     */
      +    isSocket() {
      +        return (this.#type & IFMT) === IFSOCK;
      +    }
      +    /**
      +     * Is the path a symbolic link?
      +     */
      +    isSymbolicLink() {
      +        return (this.#type & IFLNK) === IFLNK;
      +    }
      +    /**
      +     * Return the entry if it has been subject of a successful lstat, or
      +     * undefined otherwise.
      +     *
      +     * Does not read the filesystem, so an undefined result *could* simply
      +     * mean that we haven't called lstat on it.
      +     */
      +    lstatCached() {
      +        return this.#type & LSTAT_CALLED ? this : undefined;
      +    }
      +    /**
      +     * Return the cached link target if the entry has been the subject of a
      +     * successful readlink, or undefined otherwise.
      +     *
      +     * Does not read the filesystem, so an undefined result *could* just mean we
      +     * don't have any cached data. Only use it if you are very sure that a
      +     * readlink() has been called at some point.
      +     */
      +    readlinkCached() {
      +        return this.#linkTarget;
      +    }
      +    /**
      +     * Returns the cached realpath target if the entry has been the subject
      +     * of a successful realpath, or undefined otherwise.
      +     *
      +     * Does not read the filesystem, so an undefined result *could* just mean we
      +     * don't have any cached data. Only use it if you are very sure that a
      +     * realpath() has been called at some point.
      +     */
      +    realpathCached() {
      +        return this.#realpath;
      +    }
      +    /**
      +     * Returns the cached child Path entries array if the entry has been the
      +     * subject of a successful readdir(), or [] otherwise.
      +     *
      +     * Does not read the filesystem, so an empty array *could* just mean we
      +     * don't have any cached data. Only use it if you are very sure that a
      +     * readdir() has been called recently enough to still be valid.
      +     */
      +    readdirCached() {
      +        const children = this.children();
      +        return children.slice(0, children.provisional);
      +    }
      +    /**
      +     * Return true if it's worth trying to readlink.  Ie, we don't (yet) have
      +     * any indication that readlink will definitely fail.
      +     *
      +     * Returns false if the path is known to not be a symlink, if a previous
      +     * readlink failed, or if the entry does not exist.
      +     */
      +    canReadlink() {
      +        if (this.#linkTarget)
      +            return true;
      +        if (!this.parent)
      +            return false;
      +        // cases where it cannot possibly succeed
      +        const ifmt = this.#type & IFMT;
      +        return !((ifmt !== UNKNOWN && ifmt !== IFLNK) ||
      +            this.#type & ENOREADLINK ||
      +            this.#type & ENOENT);
      +    }
      +    /**
      +     * Return true if readdir has previously been successfully called on this
      +     * path, indicating that cachedReaddir() is likely valid.
      +     */
      +    calledReaddir() {
      +        return !!(this.#type & READDIR_CALLED);
      +    }
      +    /**
      +     * Returns true if the path is known to not exist. That is, a previous lstat
      +     * or readdir failed to verify its existence when that would have been
      +     * expected, or a parent entry was marked either enoent or enotdir.
      +     */
      +    isENOENT() {
      +        return !!(this.#type & ENOENT);
      +    }
      +    /**
      +     * Return true if the path is a match for the given path name.  This handles
      +     * case sensitivity and unicode normalization.
      +     *
      +     * Note: even on case-sensitive systems, it is **not** safe to test the
      +     * equality of the `.name` property to determine whether a given pathname
      +     * matches, due to unicode normalization mismatches.
      +     *
      +     * Always use this method instead of testing the `path.name` property
      +     * directly.
      +     */
      +    isNamed(n) {
      +        return !this.nocase ?
      +            this.#matchName === normalize(n)
      +            : this.#matchName === normalizeNocase(n);
      +    }
      +    /**
      +     * Return the Path object corresponding to the target of a symbolic link.
      +     *
      +     * If the Path is not a symbolic link, or if the readlink call fails for any
      +     * reason, `undefined` is returned.
      +     *
      +     * Result is cached, and thus may be outdated if the filesystem is mutated.
      +     */
      +    async readlink() {
      +        const target = this.#linkTarget;
      +        if (target) {
      +            return target;
      +        }
      +        if (!this.canReadlink()) {
      +            return undefined;
      +        }
      +        /* c8 ignore start */
      +        // already covered by the canReadlink test, here for ts grumples
      +        if (!this.parent) {
      +            return undefined;
      +        }
      +        /* c8 ignore stop */
      +        try {
      +            const read = await this.#fs.promises.readlink(this.fullpath());
      +            const linkTarget = (await this.parent.realpath())?.resolve(read);
      +            if (linkTarget) {
      +                return (this.#linkTarget = linkTarget);
      +            }
      +        }
      +        catch (er) {
      +            this.#readlinkFail(er.code);
      +            return undefined;
      +        }
      +    }
      +    /**
      +     * Synchronous {@link PathBase.readlink}
      +     */
      +    readlinkSync() {
      +        const target = this.#linkTarget;
      +        if (target) {
      +            return target;
      +        }
      +        if (!this.canReadlink()) {
      +            return undefined;
      +        }
      +        /* c8 ignore start */
      +        // already covered by the canReadlink test, here for ts grumples
      +        if (!this.parent) {
      +            return undefined;
      +        }
      +        /* c8 ignore stop */
      +        try {
      +            const read = this.#fs.readlinkSync(this.fullpath());
      +            const linkTarget = this.parent.realpathSync()?.resolve(read);
      +            if (linkTarget) {
      +                return (this.#linkTarget = linkTarget);
      +            }
      +        }
      +        catch (er) {
      +            this.#readlinkFail(er.code);
      +            return undefined;
      +        }
      +    }
      +    #readdirSuccess(children) {
      +        // succeeded, mark readdir called bit
      +        this.#type |= READDIR_CALLED;
      +        // mark all remaining provisional children as ENOENT
      +        for (let p = children.provisional; p < children.length; p++) {
      +            const c = children[p];
      +            if (c)
      +                c.#markENOENT();
      +        }
      +    }
      +    #markENOENT() {
      +        // mark as UNKNOWN and ENOENT
      +        if (this.#type & ENOENT)
      +            return;
      +        this.#type = (this.#type | ENOENT) & IFMT_UNKNOWN;
      +        this.#markChildrenENOENT();
      +    }
      +    #markChildrenENOENT() {
      +        // all children are provisional and do not exist
      +        const children = this.children();
      +        children.provisional = 0;
      +        for (const p of children) {
      +            p.#markENOENT();
      +        }
      +    }
      +    #markENOREALPATH() {
      +        this.#type |= ENOREALPATH;
      +        this.#markENOTDIR();
      +    }
      +    // save the information when we know the entry is not a dir
      +    #markENOTDIR() {
      +        // entry is not a directory, so any children can't exist.
      +        // this *should* be impossible, since any children created
      +        // after it's been marked ENOTDIR should be marked ENOENT,
      +        // so it won't even get to this point.
      +        /* c8 ignore start */
      +        if (this.#type & ENOTDIR)
      +            return;
      +        /* c8 ignore stop */
      +        let t = this.#type;
      +        // this could happen if we stat a dir, then delete it,
      +        // then try to read it or one of its children.
      +        if ((t & IFMT) === IFDIR)
      +            t &= IFMT_UNKNOWN;
      +        this.#type = t | ENOTDIR;
      +        this.#markChildrenENOENT();
      +    }
      +    #readdirFail(code = '') {
      +        // markENOTDIR and markENOENT also set provisional=0
      +        if (code === 'ENOTDIR' || code === 'EPERM') {
      +            this.#markENOTDIR();
      +        }
      +        else if (code === 'ENOENT') {
      +            this.#markENOENT();
      +        }
      +        else {
      +            this.children().provisional = 0;
      +        }
      +    }
      +    #lstatFail(code = '') {
      +        // Windows just raises ENOENT in this case, disable for win CI
      +        /* c8 ignore start */
      +        if (code === 'ENOTDIR') {
      +            // already know it has a parent by this point
      +            const p = this.parent;
      +            p.#markENOTDIR();
      +        }
      +        else if (code === 'ENOENT') {
      +            /* c8 ignore stop */
      +            this.#markENOENT();
      +        }
      +    }
      +    #readlinkFail(code = '') {
      +        let ter = this.#type;
      +        ter |= ENOREADLINK;
      +        if (code === 'ENOENT')
      +            ter |= ENOENT;
      +        // windows gets a weird error when you try to readlink a file
      +        if (code === 'EINVAL' || code === 'UNKNOWN') {
      +            // exists, but not a symlink, we don't know WHAT it is, so remove
      +            // all IFMT bits.
      +            ter &= IFMT_UNKNOWN;
      +        }
      +        this.#type = ter;
      +        // windows just gets ENOENT in this case.  We do cover the case,
      +        // just disabled because it's impossible on Windows CI
      +        /* c8 ignore start */
      +        if (code === 'ENOTDIR' && this.parent) {
      +            this.parent.#markENOTDIR();
      +        }
      +        /* c8 ignore stop */
      +    }
      +    #readdirAddChild(e, c) {
      +        return (this.#readdirMaybePromoteChild(e, c) ||
      +            this.#readdirAddNewChild(e, c));
      +    }
      +    #readdirAddNewChild(e, c) {
      +        // alloc new entry at head, so it's never provisional
      +        const type = entToType(e);
      +        const child = this.newChild(e.name, type, { parent: this });
      +        const ifmt = child.#type & IFMT;
      +        if (ifmt !== IFDIR && ifmt !== IFLNK && ifmt !== UNKNOWN) {
      +            child.#type |= ENOTDIR;
      +        }
      +        c.unshift(child);
      +        c.provisional++;
      +        return child;
      +    }
      +    #readdirMaybePromoteChild(e, c) {
      +        for (let p = c.provisional; p < c.length; p++) {
      +            const pchild = c[p];
      +            const name = this.nocase ? normalizeNocase(e.name) : normalize(e.name);
      +            if (name !== pchild.#matchName) {
      +                continue;
      +            }
      +            return this.#readdirPromoteChild(e, pchild, p, c);
      +        }
      +    }
      +    #readdirPromoteChild(e, p, index, c) {
      +        const v = p.name;
      +        // retain any other flags, but set ifmt from dirent
      +        p.#type = (p.#type & IFMT_UNKNOWN) | entToType(e);
      +        // case sensitivity fixing when we learn the true name.
      +        if (v !== e.name)
      +            p.name = e.name;
      +        // just advance provisional index (potentially off the list),
      +        // otherwise we have to splice/pop it out and re-insert at head
      +        if (index !== c.provisional) {
      +            if (index === c.length - 1)
      +                c.pop();
      +            else
      +                c.splice(index, 1);
      +            c.unshift(p);
      +        }
      +        c.provisional++;
      +        return p;
      +    }
      +    /**
      +     * Call lstat() on this Path, and update all known information that can be
      +     * determined.
      +     *
      +     * Note that unlike `fs.lstat()`, the returned value does not contain some
      +     * information, such as `mode`, `dev`, `nlink`, and `ino`.  If that
      +     * information is required, you will need to call `fs.lstat` yourself.
      +     *
      +     * If the Path refers to a nonexistent file, or if the lstat call fails for
      +     * any reason, `undefined` is returned.  Otherwise the updated Path object is
      +     * returned.
      +     *
      +     * Results are cached, and thus may be out of date if the filesystem is
      +     * mutated.
      +     */
      +    async lstat() {
      +        if ((this.#type & ENOENT) === 0) {
      +            try {
      +                this.#applyStat(await this.#fs.promises.lstat(this.fullpath()));
      +                return this;
      +            }
      +            catch (er) {
      +                this.#lstatFail(er.code);
      +            }
      +        }
      +    }
      +    /**
      +     * synchronous {@link PathBase.lstat}
      +     */
      +    lstatSync() {
      +        if ((this.#type & ENOENT) === 0) {
      +            try {
      +                this.#applyStat(this.#fs.lstatSync(this.fullpath()));
      +                return this;
      +            }
      +            catch (er) {
      +                this.#lstatFail(er.code);
      +            }
      +        }
      +    }
      +    #applyStat(st) {
      +        const { atime, atimeMs, birthtime, birthtimeMs, blksize, blocks, ctime, ctimeMs, dev, gid, ino, mode, mtime, mtimeMs, nlink, rdev, size, uid, } = st;
      +        this.#atime = atime;
      +        this.#atimeMs = atimeMs;
      +        this.#birthtime = birthtime;
      +        this.#birthtimeMs = birthtimeMs;
      +        this.#blksize = blksize;
      +        this.#blocks = blocks;
      +        this.#ctime = ctime;
      +        this.#ctimeMs = ctimeMs;
      +        this.#dev = dev;
      +        this.#gid = gid;
      +        this.#ino = ino;
      +        this.#mode = mode;
      +        this.#mtime = mtime;
      +        this.#mtimeMs = mtimeMs;
      +        this.#nlink = nlink;
      +        this.#rdev = rdev;
      +        this.#size = size;
      +        this.#uid = uid;
      +        const ifmt = entToType(st);
      +        // retain any other flags, but set the ifmt
      +        this.#type = (this.#type & IFMT_UNKNOWN) | ifmt | LSTAT_CALLED;
      +        if (ifmt !== UNKNOWN && ifmt !== IFDIR && ifmt !== IFLNK) {
      +            this.#type |= ENOTDIR;
      +        }
      +    }
      +    #onReaddirCB = [];
      +    #readdirCBInFlight = false;
      +    #callOnReaddirCB(children) {
      +        this.#readdirCBInFlight = false;
      +        const cbs = this.#onReaddirCB.slice();
      +        this.#onReaddirCB.length = 0;
      +        cbs.forEach(cb => cb(null, children));
      +    }
      +    /**
      +     * Standard node-style callback interface to get list of directory entries.
      +     *
      +     * If the Path cannot or does not contain any children, then an empty array
      +     * is returned.
      +     *
      +     * Results are cached, and thus may be out of date if the filesystem is
      +     * mutated.
      +     *
      +     * @param cb The callback called with (er, entries).  Note that the `er`
      +     * param is somewhat extraneous, as all readdir() errors are handled and
      +     * simply result in an empty set of entries being returned.
      +     * @param allowZalgo Boolean indicating that immediately known results should
      +     * *not* be deferred with `queueMicrotask`. Defaults to `false`. Release
      +     * zalgo at your peril, the dark pony lord is devious and unforgiving.
      +     */
      +    readdirCB(cb, allowZalgo = false) {
      +        if (!this.canReaddir()) {
      +            if (allowZalgo)
      +                cb(null, []);
      +            else
      +                queueMicrotask(() => cb(null, []));
      +            return;
      +        }
      +        const children = this.children();
      +        if (this.calledReaddir()) {
      +            const c = children.slice(0, children.provisional);
      +            if (allowZalgo)
      +                cb(null, c);
      +            else
      +                queueMicrotask(() => cb(null, c));
      +            return;
      +        }
      +        // don't have to worry about zalgo at this point.
      +        this.#onReaddirCB.push(cb);
      +        if (this.#readdirCBInFlight) {
      +            return;
      +        }
      +        this.#readdirCBInFlight = true;
      +        // else read the directory, fill up children
      +        // de-provisionalize any provisional children.
      +        const fullpath = this.fullpath();
      +        this.#fs.readdir(fullpath, { withFileTypes: true }, (er, entries) => {
      +            if (er) {
      +                this.#readdirFail(er.code);
      +                children.provisional = 0;
      +            }
      +            else {
      +                // if we didn't get an error, we always get entries.
      +                //@ts-ignore
      +                for (const e of entries) {
      +                    this.#readdirAddChild(e, children);
      +                }
      +                this.#readdirSuccess(children);
      +            }
      +            this.#callOnReaddirCB(children.slice(0, children.provisional));
      +            return;
      +        });
      +    }
      +    #asyncReaddirInFlight;
      +    /**
      +     * Return an array of known child entries.
      +     *
      +     * If the Path cannot or does not contain any children, then an empty array
      +     * is returned.
      +     *
      +     * Results are cached, and thus may be out of date if the filesystem is
      +     * mutated.
      +     */
      +    async readdir() {
      +        if (!this.canReaddir()) {
      +            return [];
      +        }
      +        const children = this.children();
      +        if (this.calledReaddir()) {
      +            return children.slice(0, children.provisional);
      +        }
      +        // else read the directory, fill up children
      +        // de-provisionalize any provisional children.
      +        const fullpath = this.fullpath();
      +        if (this.#asyncReaddirInFlight) {
      +            await this.#asyncReaddirInFlight;
      +        }
      +        else {
      +            /* c8 ignore start */
      +            let resolve = () => { };
      +            /* c8 ignore stop */
      +            this.#asyncReaddirInFlight = new Promise(res => (resolve = res));
      +            try {
      +                for (const e of await this.#fs.promises.readdir(fullpath, {
      +                    withFileTypes: true,
      +                })) {
      +                    this.#readdirAddChild(e, children);
      +                }
      +                this.#readdirSuccess(children);
      +            }
      +            catch (er) {
      +                this.#readdirFail(er.code);
      +                children.provisional = 0;
      +            }
      +            this.#asyncReaddirInFlight = undefined;
      +            resolve();
      +        }
      +        return children.slice(0, children.provisional);
      +    }
      +    /**
      +     * synchronous {@link PathBase.readdir}
      +     */
      +    readdirSync() {
      +        if (!this.canReaddir()) {
      +            return [];
      +        }
      +        const children = this.children();
      +        if (this.calledReaddir()) {
      +            return children.slice(0, children.provisional);
      +        }
      +        // else read the directory, fill up children
      +        // de-provisionalize any provisional children.
      +        const fullpath = this.fullpath();
      +        try {
      +            for (const e of this.#fs.readdirSync(fullpath, {
      +                withFileTypes: true,
      +            })) {
      +                this.#readdirAddChild(e, children);
      +            }
      +            this.#readdirSuccess(children);
      +        }
      +        catch (er) {
      +            this.#readdirFail(er.code);
      +            children.provisional = 0;
      +        }
      +        return children.slice(0, children.provisional);
      +    }
      +    canReaddir() {
      +        if (this.#type & ENOCHILD)
      +            return false;
      +        const ifmt = IFMT & this.#type;
      +        // we always set ENOTDIR when setting IFMT, so should be impossible
      +        /* c8 ignore start */
      +        if (!(ifmt === UNKNOWN || ifmt === IFDIR || ifmt === IFLNK)) {
      +            return false;
      +        }
      +        /* c8 ignore stop */
      +        return true;
      +    }
      +    shouldWalk(dirs, walkFilter) {
      +        return ((this.#type & IFDIR) === IFDIR &&
      +            !(this.#type & ENOCHILD) &&
      +            !dirs.has(this) &&
      +            (!walkFilter || walkFilter(this)));
      +    }
      +    /**
      +     * Return the Path object corresponding to path as resolved
      +     * by realpath(3).
      +     *
      +     * If the realpath call fails for any reason, `undefined` is returned.
      +     *
      +     * Result is cached, and thus may be outdated if the filesystem is mutated.
      +     * On success, returns a Path object.
      +     */
      +    async realpath() {
      +        if (this.#realpath)
      +            return this.#realpath;
      +        if ((ENOREALPATH | ENOREADLINK | ENOENT) & this.#type)
      +            return undefined;
      +        try {
      +            const rp = await this.#fs.promises.realpath(this.fullpath());
      +            return (this.#realpath = this.resolve(rp));
      +        }
      +        catch (_) {
      +            this.#markENOREALPATH();
      +        }
      +    }
      +    /**
      +     * Synchronous {@link realpath}
      +     */
      +    realpathSync() {
      +        if (this.#realpath)
      +            return this.#realpath;
      +        if ((ENOREALPATH | ENOREADLINK | ENOENT) & this.#type)
      +            return undefined;
      +        try {
      +            const rp = this.#fs.realpathSync(this.fullpath());
      +            return (this.#realpath = this.resolve(rp));
      +        }
      +        catch (_) {
      +            this.#markENOREALPATH();
      +        }
      +    }
      +    /**
      +     * Internal method to mark this Path object as the scurry cwd,
      +     * called by {@link PathScurry#chdir}
      +     *
      +     * @internal
      +     */
      +    [setAsCwd](oldCwd) {
      +        if (oldCwd === this)
      +            return;
      +        oldCwd.isCWD = false;
      +        this.isCWD = true;
      +        const changed = new Set([]);
      +        let rp = [];
      +        let p = this;
      +        while (p && p.parent) {
      +            changed.add(p);
      +            p.#relative = rp.join(this.sep);
      +            p.#relativePosix = rp.join('/');
      +            p = p.parent;
      +            rp.push('..');
      +        }
      +        // now un-memoize parents of old cwd
      +        p = oldCwd;
      +        while (p && p.parent && !changed.has(p)) {
      +            p.#relative = undefined;
      +            p.#relativePosix = undefined;
      +            p = p.parent;
      +        }
      +    }
      +}
      +exports.PathBase = PathBase;
      +/**
      + * Path class used on win32 systems
      + *
      + * Uses `'\\'` as the path separator for returned paths, either `'\\'` or `'/'`
      + * as the path separator for parsing paths.
      + */
      +class PathWin32 extends PathBase {
      +    /**
      +     * Separator for generating path strings.
      +     */
      +    sep = '\\';
      +    /**
      +     * Separator for parsing path strings.
      +     */
      +    splitSep = eitherSep;
      +    /**
      +     * Do not create new Path objects directly.  They should always be accessed
      +     * via the PathScurry class or other methods on the Path class.
      +     *
      +     * @internal
      +     */
      +    constructor(name, type = UNKNOWN, root, roots, nocase, children, opts) {
      +        super(name, type, root, roots, nocase, children, opts);
      +    }
      +    /**
      +     * @internal
      +     */
      +    newChild(name, type = UNKNOWN, opts = {}) {
      +        return new PathWin32(name, type, this.root, this.roots, this.nocase, this.childrenCache(), opts);
      +    }
      +    /**
      +     * @internal
      +     */
      +    getRootString(path) {
      +        return node_path_1.win32.parse(path).root;
      +    }
      +    /**
      +     * @internal
      +     */
      +    getRoot(rootPath) {
      +        rootPath = uncToDrive(rootPath.toUpperCase());
      +        if (rootPath === this.root.name) {
      +            return this.root;
      +        }
      +        // ok, not that one, check if it matches another we know about
      +        for (const [compare, root] of Object.entries(this.roots)) {
      +            if (this.sameRoot(rootPath, compare)) {
      +                return (this.roots[rootPath] = root);
      +            }
      +        }
      +        // otherwise, have to create a new one.
      +        return (this.roots[rootPath] = new PathScurryWin32(rootPath, this).root);
      +    }
      +    /**
      +     * @internal
      +     */
      +    sameRoot(rootPath, compare = this.root.name) {
      +        // windows can (rarely) have case-sensitive filesystem, but
      +        // UNC and drive letters are always case-insensitive, and canonically
      +        // represented uppercase.
      +        rootPath = rootPath
      +            .toUpperCase()
      +            .replace(/\//g, '\\')
      +            .replace(uncDriveRegexp, '$1\\');
      +        return rootPath === compare;
      +    }
      +}
      +exports.PathWin32 = PathWin32;
      +/**
      + * Path class used on all posix systems.
      + *
      + * Uses `'/'` as the path separator.
      + */
      +class PathPosix extends PathBase {
      +    /**
      +     * separator for parsing path strings
      +     */
      +    splitSep = '/';
      +    /**
      +     * separator for generating path strings
      +     */
      +    sep = '/';
      +    /**
      +     * Do not create new Path objects directly.  They should always be accessed
      +     * via the PathScurry class or other methods on the Path class.
      +     *
      +     * @internal
      +     */
      +    constructor(name, type = UNKNOWN, root, roots, nocase, children, opts) {
      +        super(name, type, root, roots, nocase, children, opts);
      +    }
      +    /**
      +     * @internal
      +     */
      +    getRootString(path) {
      +        return path.startsWith('/') ? '/' : '';
      +    }
      +    /**
      +     * @internal
      +     */
      +    getRoot(_rootPath) {
      +        return this.root;
      +    }
      +    /**
      +     * @internal
      +     */
      +    newChild(name, type = UNKNOWN, opts = {}) {
      +        return new PathPosix(name, type, this.root, this.roots, this.nocase, this.childrenCache(), opts);
      +    }
      +}
      +exports.PathPosix = PathPosix;
      +/**
      + * The base class for all PathScurry classes, providing the interface for path
      + * resolution and filesystem operations.
      + *
      + * Typically, you should *not* instantiate this class directly, but rather one
      + * of the platform-specific classes, or the exported {@link PathScurry} which
      + * defaults to the current platform.
      + */
      +class PathScurryBase {
      +    /**
      +     * The root Path entry for the current working directory of this Scurry
      +     */
      +    root;
      +    /**
      +     * The string path for the root of this Scurry's current working directory
      +     */
      +    rootPath;
      +    /**
      +     * A collection of all roots encountered, referenced by rootPath
      +     */
      +    roots;
      +    /**
      +     * The Path entry corresponding to this PathScurry's current working directory.
      +     */
      +    cwd;
      +    #resolveCache;
      +    #resolvePosixCache;
      +    #children;
      +    /**
      +     * Perform path comparisons case-insensitively.
      +     *
      +     * Defaults true on Darwin and Windows systems, false elsewhere.
      +     */
      +    nocase;
      +    #fs;
      +    /**
      +     * This class should not be instantiated directly.
      +     *
      +     * Use PathScurryWin32, PathScurryDarwin, PathScurryPosix, or PathScurry
      +     *
      +     * @internal
      +     */
      +    constructor(cwd = process.cwd(), pathImpl, sep, { nocase, childrenCacheSize = 16 * 1024, fs = defaultFS, } = {}) {
      +        this.#fs = fsFromOption(fs);
      +        if (cwd instanceof URL || cwd.startsWith('file://')) {
      +            cwd = (0, node_url_1.fileURLToPath)(cwd);
      +        }
      +        // resolve and split root, and then add to the store.
      +        // this is the only time we call path.resolve()
      +        const cwdPath = pathImpl.resolve(cwd);
      +        this.roots = Object.create(null);
      +        this.rootPath = this.parseRootPath(cwdPath);
      +        this.#resolveCache = new ResolveCache();
      +        this.#resolvePosixCache = new ResolveCache();
      +        this.#children = new ChildrenCache(childrenCacheSize);
      +        const split = cwdPath.substring(this.rootPath.length).split(sep);
      +        // resolve('/') leaves '', splits to [''], we don't want that.
      +        if (split.length === 1 && !split[0]) {
      +            split.pop();
      +        }
      +        /* c8 ignore start */
      +        if (nocase === undefined) {
      +            throw new TypeError('must provide nocase setting to PathScurryBase ctor');
      +        }
      +        /* c8 ignore stop */
      +        this.nocase = nocase;
      +        this.root = this.newRoot(this.#fs);
      +        this.roots[this.rootPath] = this.root;
      +        let prev = this.root;
      +        let len = split.length - 1;
      +        const joinSep = pathImpl.sep;
      +        let abs = this.rootPath;
      +        let sawFirst = false;
      +        for (const part of split) {
      +            const l = len--;
      +            prev = prev.child(part, {
      +                relative: new Array(l).fill('..').join(joinSep),
      +                relativePosix: new Array(l).fill('..').join('/'),
      +                fullpath: (abs += (sawFirst ? '' : joinSep) + part),
      +            });
      +            sawFirst = true;
      +        }
      +        this.cwd = prev;
      +    }
      +    /**
      +     * Get the depth of a provided path, string, or the cwd
      +     */
      +    depth(path = this.cwd) {
      +        if (typeof path === 'string') {
      +            path = this.cwd.resolve(path);
      +        }
      +        return path.depth();
      +    }
      +    /**
      +     * Return the cache of child entries.  Exposed so subclasses can create
      +     * child Path objects in a platform-specific way.
      +     *
      +     * @internal
      +     */
      +    childrenCache() {
      +        return this.#children;
      +    }
      +    /**
      +     * Resolve one or more path strings to a resolved string
      +     *
      +     * Same interface as require('path').resolve.
      +     *
      +     * Much faster than path.resolve() when called multiple times for the same
      +     * path, because the resolved Path objects are cached.  Much slower
      +     * otherwise.
      +     */
      +    resolve(...paths) {
      +        // first figure out the minimum number of paths we have to test
      +        // we always start at cwd, but any absolutes will bump the start
      +        let r = '';
      +        for (let i = paths.length - 1; i >= 0; i--) {
      +            const p = paths[i];
      +            if (!p || p === '.')
      +                continue;
      +            r = r ? `${p}/${r}` : p;
      +            if (this.isAbsolute(p)) {
      +                break;
      +            }
      +        }
      +        const cached = this.#resolveCache.get(r);
      +        if (cached !== undefined) {
      +            return cached;
      +        }
      +        const result = this.cwd.resolve(r).fullpath();
      +        this.#resolveCache.set(r, result);
      +        return result;
      +    }
      +    /**
      +     * Resolve one or more path strings to a resolved string, returning
      +     * the posix path.  Identical to .resolve() on posix systems, but on
      +     * windows will return a forward-slash separated UNC path.
      +     *
      +     * Same interface as require('path').resolve.
      +     *
      +     * Much faster than path.resolve() when called multiple times for the same
      +     * path, because the resolved Path objects are cached.  Much slower
      +     * otherwise.
      +     */
      +    resolvePosix(...paths) {
      +        // first figure out the minimum number of paths we have to test
      +        // we always start at cwd, but any absolutes will bump the start
      +        let r = '';
      +        for (let i = paths.length - 1; i >= 0; i--) {
      +            const p = paths[i];
      +            if (!p || p === '.')
      +                continue;
      +            r = r ? `${p}/${r}` : p;
      +            if (this.isAbsolute(p)) {
      +                break;
      +            }
      +        }
      +        const cached = this.#resolvePosixCache.get(r);
      +        if (cached !== undefined) {
      +            return cached;
      +        }
      +        const result = this.cwd.resolve(r).fullpathPosix();
      +        this.#resolvePosixCache.set(r, result);
      +        return result;
      +    }
      +    /**
      +     * find the relative path from the cwd to the supplied path string or entry
      +     */
      +    relative(entry = this.cwd) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        return entry.relative();
      +    }
      +    /**
      +     * find the relative path from the cwd to the supplied path string or
      +     * entry, using / as the path delimiter, even on Windows.
      +     */
      +    relativePosix(entry = this.cwd) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        return entry.relativePosix();
      +    }
      +    /**
      +     * Return the basename for the provided string or Path object
      +     */
      +    basename(entry = this.cwd) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        return entry.name;
      +    }
      +    /**
      +     * Return the dirname for the provided string or Path object
      +     */
      +    dirname(entry = this.cwd) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        return (entry.parent || entry).fullpath();
      +    }
      +    async readdir(entry = this.cwd, opts = {
      +        withFileTypes: true,
      +    }) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        else if (!(entry instanceof PathBase)) {
      +            opts = entry;
      +            entry = this.cwd;
      +        }
      +        const { withFileTypes } = opts;
      +        if (!entry.canReaddir()) {
      +            return [];
      +        }
      +        else {
      +            const p = await entry.readdir();
      +            return withFileTypes ? p : p.map(e => e.name);
      +        }
      +    }
      +    readdirSync(entry = this.cwd, opts = {
      +        withFileTypes: true,
      +    }) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        else if (!(entry instanceof PathBase)) {
      +            opts = entry;
      +            entry = this.cwd;
      +        }
      +        const { withFileTypes = true } = opts;
      +        if (!entry.canReaddir()) {
      +            return [];
      +        }
      +        else if (withFileTypes) {
      +            return entry.readdirSync();
      +        }
      +        else {
      +            return entry.readdirSync().map(e => e.name);
      +        }
      +    }
      +    /**
      +     * Call lstat() on the string or Path object, and update all known
      +     * information that can be determined.
      +     *
      +     * Note that unlike `fs.lstat()`, the returned value does not contain some
      +     * information, such as `mode`, `dev`, `nlink`, and `ino`.  If that
      +     * information is required, you will need to call `fs.lstat` yourself.
      +     *
      +     * If the Path refers to a nonexistent file, or if the lstat call fails for
      +     * any reason, `undefined` is returned.  Otherwise the updated Path object is
      +     * returned.
      +     *
      +     * Results are cached, and thus may be out of date if the filesystem is
      +     * mutated.
      +     */
      +    async lstat(entry = this.cwd) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        return entry.lstat();
      +    }
      +    /**
      +     * synchronous {@link PathScurryBase.lstat}
      +     */
      +    lstatSync(entry = this.cwd) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        return entry.lstatSync();
      +    }
      +    async readlink(entry = this.cwd, { withFileTypes } = {
      +        withFileTypes: false,
      +    }) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        else if (!(entry instanceof PathBase)) {
      +            withFileTypes = entry.withFileTypes;
      +            entry = this.cwd;
      +        }
      +        const e = await entry.readlink();
      +        return withFileTypes ? e : e?.fullpath();
      +    }
      +    readlinkSync(entry = this.cwd, { withFileTypes } = {
      +        withFileTypes: false,
      +    }) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        else if (!(entry instanceof PathBase)) {
      +            withFileTypes = entry.withFileTypes;
      +            entry = this.cwd;
      +        }
      +        const e = entry.readlinkSync();
      +        return withFileTypes ? e : e?.fullpath();
      +    }
      +    async realpath(entry = this.cwd, { withFileTypes } = {
      +        withFileTypes: false,
      +    }) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        else if (!(entry instanceof PathBase)) {
      +            withFileTypes = entry.withFileTypes;
      +            entry = this.cwd;
      +        }
      +        const e = await entry.realpath();
      +        return withFileTypes ? e : e?.fullpath();
      +    }
      +    realpathSync(entry = this.cwd, { withFileTypes } = {
      +        withFileTypes: false,
      +    }) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        else if (!(entry instanceof PathBase)) {
      +            withFileTypes = entry.withFileTypes;
      +            entry = this.cwd;
      +        }
      +        const e = entry.realpathSync();
      +        return withFileTypes ? e : e?.fullpath();
      +    }
      +    async walk(entry = this.cwd, opts = {}) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        else if (!(entry instanceof PathBase)) {
      +            opts = entry;
      +            entry = this.cwd;
      +        }
      +        const { withFileTypes = true, follow = false, filter, walkFilter, } = opts;
      +        const results = [];
      +        if (!filter || filter(entry)) {
      +            results.push(withFileTypes ? entry : entry.fullpath());
      +        }
      +        const dirs = new Set();
      +        const walk = (dir, cb) => {
      +            dirs.add(dir);
      +            dir.readdirCB((er, entries) => {
      +                /* c8 ignore start */
      +                if (er) {
      +                    return cb(er);
      +                }
      +                /* c8 ignore stop */
      +                let len = entries.length;
      +                if (!len)
      +                    return cb();
      +                const next = () => {
      +                    if (--len === 0) {
      +                        cb();
      +                    }
      +                };
      +                for (const e of entries) {
      +                    if (!filter || filter(e)) {
      +                        results.push(withFileTypes ? e : e.fullpath());
      +                    }
      +                    if (follow && e.isSymbolicLink()) {
      +                        e.realpath()
      +                            .then(r => (r?.isUnknown() ? r.lstat() : r))
      +                            .then(r => r?.shouldWalk(dirs, walkFilter) ? walk(r, next) : next());
      +                    }
      +                    else {
      +                        if (e.shouldWalk(dirs, walkFilter)) {
      +                            walk(e, next);
      +                        }
      +                        else {
      +                            next();
      +                        }
      +                    }
      +                }
      +            }, true); // zalgooooooo
      +        };
      +        const start = entry;
      +        return new Promise((res, rej) => {
      +            walk(start, er => {
      +                /* c8 ignore start */
      +                if (er)
      +                    return rej(er);
      +                /* c8 ignore stop */
      +                res(results);
      +            });
      +        });
      +    }
      +    walkSync(entry = this.cwd, opts = {}) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        else if (!(entry instanceof PathBase)) {
      +            opts = entry;
      +            entry = this.cwd;
      +        }
      +        const { withFileTypes = true, follow = false, filter, walkFilter, } = opts;
      +        const results = [];
      +        if (!filter || filter(entry)) {
      +            results.push(withFileTypes ? entry : entry.fullpath());
      +        }
      +        const dirs = new Set([entry]);
      +        for (const dir of dirs) {
      +            const entries = dir.readdirSync();
      +            for (const e of entries) {
      +                if (!filter || filter(e)) {
      +                    results.push(withFileTypes ? e : e.fullpath());
      +                }
      +                let r = e;
      +                if (e.isSymbolicLink()) {
      +                    if (!(follow && (r = e.realpathSync())))
      +                        continue;
      +                    if (r.isUnknown())
      +                        r.lstatSync();
      +                }
      +                if (r.shouldWalk(dirs, walkFilter)) {
      +                    dirs.add(r);
      +                }
      +            }
      +        }
      +        return results;
      +    }
      +    /**
      +     * Support for `for await`
      +     *
      +     * Alias for {@link PathScurryBase.iterate}
      +     *
      +     * Note: As of Node 19, this is very slow, compared to other methods of
      +     * walking.  Consider using {@link PathScurryBase.stream} if memory overhead
      +     * and backpressure are concerns, or {@link PathScurryBase.walk} if not.
      +     */
      +    [Symbol.asyncIterator]() {
      +        return this.iterate();
      +    }
      +    iterate(entry = this.cwd, options = {}) {
      +        // iterating async over the stream is significantly more performant,
      +        // especially in the warm-cache scenario, because it buffers up directory
      +        // entries in the background instead of waiting for a yield for each one.
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        else if (!(entry instanceof PathBase)) {
      +            options = entry;
      +            entry = this.cwd;
      +        }
      +        return this.stream(entry, options)[Symbol.asyncIterator]();
      +    }
      +    /**
      +     * Iterating over a PathScurry performs a synchronous walk.
      +     *
      +     * Alias for {@link PathScurryBase.iterateSync}
      +     */
      +    [Symbol.iterator]() {
      +        return this.iterateSync();
      +    }
      +    *iterateSync(entry = this.cwd, opts = {}) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        else if (!(entry instanceof PathBase)) {
      +            opts = entry;
      +            entry = this.cwd;
      +        }
      +        const { withFileTypes = true, follow = false, filter, walkFilter, } = opts;
      +        if (!filter || filter(entry)) {
      +            yield withFileTypes ? entry : entry.fullpath();
      +        }
      +        const dirs = new Set([entry]);
      +        for (const dir of dirs) {
      +            const entries = dir.readdirSync();
      +            for (const e of entries) {
      +                if (!filter || filter(e)) {
      +                    yield withFileTypes ? e : e.fullpath();
      +                }
      +                let r = e;
      +                if (e.isSymbolicLink()) {
      +                    if (!(follow && (r = e.realpathSync())))
      +                        continue;
      +                    if (r.isUnknown())
      +                        r.lstatSync();
      +                }
      +                if (r.shouldWalk(dirs, walkFilter)) {
      +                    dirs.add(r);
      +                }
      +            }
      +        }
      +    }
      +    stream(entry = this.cwd, opts = {}) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        else if (!(entry instanceof PathBase)) {
      +            opts = entry;
      +            entry = this.cwd;
      +        }
      +        const { withFileTypes = true, follow = false, filter, walkFilter, } = opts;
      +        const results = new minipass_1.Minipass({ objectMode: true });
      +        if (!filter || filter(entry)) {
      +            results.write(withFileTypes ? entry : entry.fullpath());
      +        }
      +        const dirs = new Set();
      +        const queue = [entry];
      +        let processing = 0;
      +        const process = () => {
      +            let paused = false;
      +            while (!paused) {
      +                const dir = queue.shift();
      +                if (!dir) {
      +                    if (processing === 0)
      +                        results.end();
      +                    return;
      +                }
      +                processing++;
      +                dirs.add(dir);
      +                const onReaddir = (er, entries, didRealpaths = false) => {
      +                    /* c8 ignore start */
      +                    if (er)
      +                        return results.emit('error', er);
      +                    /* c8 ignore stop */
      +                    if (follow && !didRealpaths) {
      +                        const promises = [];
      +                        for (const e of entries) {
      +                            if (e.isSymbolicLink()) {
      +                                promises.push(e
      +                                    .realpath()
      +                                    .then((r) => r?.isUnknown() ? r.lstat() : r));
      +                            }
      +                        }
      +                        if (promises.length) {
      +                            Promise.all(promises).then(() => onReaddir(null, entries, true));
      +                            return;
      +                        }
      +                    }
      +                    for (const e of entries) {
      +                        if (e && (!filter || filter(e))) {
      +                            if (!results.write(withFileTypes ? e : e.fullpath())) {
      +                                paused = true;
      +                            }
      +                        }
      +                    }
      +                    processing--;
      +                    for (const e of entries) {
      +                        const r = e.realpathCached() || e;
      +                        if (r.shouldWalk(dirs, walkFilter)) {
      +                            queue.push(r);
      +                        }
      +                    }
      +                    if (paused && !results.flowing) {
      +                        results.once('drain', process);
      +                    }
      +                    else if (!sync) {
      +                        process();
      +                    }
      +                };
      +                // zalgo containment
      +                let sync = true;
      +                dir.readdirCB(onReaddir, true);
      +                sync = false;
      +            }
      +        };
      +        process();
      +        return results;
      +    }
      +    streamSync(entry = this.cwd, opts = {}) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        else if (!(entry instanceof PathBase)) {
      +            opts = entry;
      +            entry = this.cwd;
      +        }
      +        const { withFileTypes = true, follow = false, filter, walkFilter, } = opts;
      +        const results = new minipass_1.Minipass({ objectMode: true });
      +        const dirs = new Set();
      +        if (!filter || filter(entry)) {
      +            results.write(withFileTypes ? entry : entry.fullpath());
      +        }
      +        const queue = [entry];
      +        let processing = 0;
      +        const process = () => {
      +            let paused = false;
      +            while (!paused) {
      +                const dir = queue.shift();
      +                if (!dir) {
      +                    if (processing === 0)
      +                        results.end();
      +                    return;
      +                }
      +                processing++;
      +                dirs.add(dir);
      +                const entries = dir.readdirSync();
      +                for (const e of entries) {
      +                    if (!filter || filter(e)) {
      +                        if (!results.write(withFileTypes ? e : e.fullpath())) {
      +                            paused = true;
      +                        }
      +                    }
      +                }
      +                processing--;
      +                for (const e of entries) {
      +                    let r = e;
      +                    if (e.isSymbolicLink()) {
      +                        if (!(follow && (r = e.realpathSync())))
      +                            continue;
      +                        if (r.isUnknown())
      +                            r.lstatSync();
      +                    }
      +                    if (r.shouldWalk(dirs, walkFilter)) {
      +                        queue.push(r);
      +                    }
      +                }
      +            }
      +            if (paused && !results.flowing)
      +                results.once('drain', process);
      +        };
      +        process();
      +        return results;
      +    }
      +    chdir(path = this.cwd) {
      +        const oldCwd = this.cwd;
      +        this.cwd = typeof path === 'string' ? this.cwd.resolve(path) : path;
      +        this.cwd[setAsCwd](oldCwd);
      +    }
      +}
      +exports.PathScurryBase = PathScurryBase;
      +/**
      + * Windows implementation of {@link PathScurryBase}
      + *
      + * Defaults to case insensitve, uses `'\\'` to generate path strings.  Uses
      + * {@link PathWin32} for Path objects.
      + */
      +class PathScurryWin32 extends PathScurryBase {
      +    /**
      +     * separator for generating path strings
      +     */
      +    sep = '\\';
      +    constructor(cwd = process.cwd(), opts = {}) {
      +        const { nocase = true } = opts;
      +        super(cwd, node_path_1.win32, '\\', { ...opts, nocase });
      +        this.nocase = nocase;
      +        for (let p = this.cwd; p; p = p.parent) {
      +            p.nocase = this.nocase;
      +        }
      +    }
      +    /**
      +     * @internal
      +     */
      +    parseRootPath(dir) {
      +        // if the path starts with a single separator, it's not a UNC, and we'll
      +        // just get separator as the root, and driveFromUNC will return \
      +        // In that case, mount \ on the root from the cwd.
      +        return node_path_1.win32.parse(dir).root.toUpperCase();
      +    }
      +    /**
      +     * @internal
      +     */
      +    newRoot(fs) {
      +        return new PathWin32(this.rootPath, IFDIR, undefined, this.roots, this.nocase, this.childrenCache(), { fs });
      +    }
      +    /**
      +     * Return true if the provided path string is an absolute path
      +     */
      +    isAbsolute(p) {
      +        return (p.startsWith('/') || p.startsWith('\\') || /^[a-z]:(\/|\\)/i.test(p));
      +    }
      +}
      +exports.PathScurryWin32 = PathScurryWin32;
      +/**
      + * {@link PathScurryBase} implementation for all posix systems other than Darwin.
      + *
      + * Defaults to case-sensitive matching, uses `'/'` to generate path strings.
      + *
      + * Uses {@link PathPosix} for Path objects.
      + */
      +class PathScurryPosix extends PathScurryBase {
      +    /**
      +     * separator for generating path strings
      +     */
      +    sep = '/';
      +    constructor(cwd = process.cwd(), opts = {}) {
      +        const { nocase = false } = opts;
      +        super(cwd, node_path_1.posix, '/', { ...opts, nocase });
      +        this.nocase = nocase;
      +    }
      +    /**
      +     * @internal
      +     */
      +    parseRootPath(_dir) {
      +        return '/';
      +    }
      +    /**
      +     * @internal
      +     */
      +    newRoot(fs) {
      +        return new PathPosix(this.rootPath, IFDIR, undefined, this.roots, this.nocase, this.childrenCache(), { fs });
      +    }
      +    /**
      +     * Return true if the provided path string is an absolute path
      +     */
      +    isAbsolute(p) {
      +        return p.startsWith('/');
      +    }
      +}
      +exports.PathScurryPosix = PathScurryPosix;
      +/**
      + * {@link PathScurryBase} implementation for Darwin (macOS) systems.
      + *
      + * Defaults to case-insensitive matching, uses `'/'` for generating path
      + * strings.
      + *
      + * Uses {@link PathPosix} for Path objects.
      + */
      +class PathScurryDarwin extends PathScurryPosix {
      +    constructor(cwd = process.cwd(), opts = {}) {
      +        const { nocase = true } = opts;
      +        super(cwd, { ...opts, nocase });
      +    }
      +}
      +exports.PathScurryDarwin = PathScurryDarwin;
      +/**
      + * Default {@link PathBase} implementation for the current platform.
      + *
      + * {@link PathWin32} on Windows systems, {@link PathPosix} on all others.
      + */
      +exports.Path = process.platform === 'win32' ? PathWin32 : PathPosix;
      +/**
      + * Default {@link PathScurryBase} implementation for the current platform.
      + *
      + * {@link PathScurryWin32} on Windows systems, {@link PathScurryDarwin} on
      + * Darwin (macOS) systems, {@link PathScurryPosix} on all others.
      + */
      +exports.PathScurry = process.platform === 'win32' ? PathScurryWin32
      +    : process.platform === 'darwin' ? PathScurryDarwin
      +        : PathScurryPosix;
      +//# sourceMappingURL=index.js.map
      \ No newline at end of file
      diff --git a/node_modules/path-scurry/dist/commonjs/index.js.map b/node_modules/path-scurry/dist/commonjs/index.js.map
      new file mode 100644
      index 00000000..a20f78ad
      --- /dev/null
      +++ b/node_modules/path-scurry/dist/commonjs/index.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { LRUCache } from 'lru-cache'\nimport { posix, win32 } from 'node:path'\n\nimport { fileURLToPath } from 'node:url'\n\nimport {\n  lstatSync,\n  readdir as readdirCB,\n  readdirSync,\n  readlinkSync,\n  realpathSync as rps,\n} from 'fs'\nimport * as actualFS from 'node:fs'\n\nconst realpathSync = rps.native\n// TODO: test perf of fs/promises realpath vs realpathCB,\n// since the promises one uses realpath.native\n\nimport { lstat, readdir, readlink, realpath } from 'node:fs/promises'\n\nimport { Minipass } from 'minipass'\nimport type { Dirent, Stats } from 'node:fs'\n\n/**\n * An object that will be used to override the default `fs`\n * methods.  Any methods that are not overridden will use Node's\n * built-in implementations.\n *\n * - lstatSync\n * - readdir (callback `withFileTypes` Dirent variant, used for\n *   readdirCB and most walks)\n * - readdirSync\n * - readlinkSync\n * - realpathSync\n * - promises: Object containing the following async methods:\n *   - lstat\n *   - readdir (Dirent variant only)\n *   - readlink\n *   - realpath\n */\nexport interface FSOption {\n  lstatSync?: (path: string) => Stats\n  readdir?: (\n    path: string,\n    options: { withFileTypes: true },\n    cb: (er: NodeJS.ErrnoException | null, entries?: Dirent[]) => any,\n  ) => void\n  readdirSync?: (\n    path: string,\n    options: { withFileTypes: true },\n  ) => Dirent[]\n  readlinkSync?: (path: string) => string\n  realpathSync?: (path: string) => string\n  promises?: {\n    lstat?: (path: string) => Promise\n    readdir?: (\n      path: string,\n      options: { withFileTypes: true },\n    ) => Promise\n    readlink?: (path: string) => Promise\n    realpath?: (path: string) => Promise\n    [k: string]: any\n  }\n  [k: string]: any\n}\n\ninterface FSValue {\n  lstatSync: (path: string) => Stats\n  readdir: (\n    path: string,\n    options: { withFileTypes: true },\n    cb: (er: NodeJS.ErrnoException | null, entries?: Dirent[]) => any,\n  ) => void\n  readdirSync: (path: string, options: { withFileTypes: true }) => Dirent[]\n  readlinkSync: (path: string) => string\n  realpathSync: (path: string) => string\n  promises: {\n    lstat: (path: string) => Promise\n    readdir: (\n      path: string,\n      options: { withFileTypes: true },\n    ) => Promise\n    readlink: (path: string) => Promise\n    realpath: (path: string) => Promise\n    [k: string]: any\n  }\n  [k: string]: any\n}\n\nconst defaultFS: FSValue = {\n  lstatSync,\n  readdir: readdirCB,\n  readdirSync,\n  readlinkSync,\n  realpathSync,\n  promises: {\n    lstat,\n    readdir,\n    readlink,\n    realpath,\n  },\n}\n\n// if they just gave us require('fs') then use our default\nconst fsFromOption = (fsOption?: FSOption): FSValue =>\n  !fsOption || fsOption === defaultFS || fsOption === actualFS ?\n    defaultFS\n  : {\n      ...defaultFS,\n      ...fsOption,\n      promises: {\n        ...defaultFS.promises,\n        ...(fsOption.promises || {}),\n      },\n    }\n\n// turn something like //?/c:/ into c:\\\nconst uncDriveRegexp = /^\\\\\\\\\\?\\\\([a-z]:)\\\\?$/i\nconst uncToDrive = (rootPath: string): string =>\n  rootPath.replace(/\\//g, '\\\\').replace(uncDriveRegexp, '$1\\\\')\n\n// windows paths are separated by either / or \\\nconst eitherSep = /[\\\\\\/]/\n\nconst UNKNOWN = 0 // may not even exist, for all we know\nconst IFIFO = 0b0001\nconst IFCHR = 0b0010\nconst IFDIR = 0b0100\nconst IFBLK = 0b0110\nconst IFREG = 0b1000\nconst IFLNK = 0b1010\nconst IFSOCK = 0b1100\nconst IFMT = 0b1111\n\nexport type Type =\n  | 'Unknown'\n  | 'FIFO'\n  | 'CharacterDevice'\n  | 'Directory'\n  | 'BlockDevice'\n  | 'File'\n  | 'SymbolicLink'\n  | 'Socket'\n\n// mask to unset low 4 bits\nconst IFMT_UNKNOWN = ~IFMT\n\n// set after successfully calling readdir() and getting entries.\nconst READDIR_CALLED = 0b0000_0001_0000\n// set after a successful lstat()\nconst LSTAT_CALLED = 0b0000_0010_0000\n// set if an entry (or one of its parents) is definitely not a dir\nconst ENOTDIR = 0b0000_0100_0000\n// set if an entry (or one of its parents) does not exist\n// (can also be set on lstat errors like EACCES or ENAMETOOLONG)\nconst ENOENT = 0b0000_1000_0000\n// cannot have child entries -- also verify &IFMT is either IFDIR or IFLNK\n// set if we fail to readlink\nconst ENOREADLINK = 0b0001_0000_0000\n// set if we know realpath() will fail\nconst ENOREALPATH = 0b0010_0000_0000\n\nconst ENOCHILD = ENOTDIR | ENOENT | ENOREALPATH\nconst TYPEMASK = 0b0011_1111_1111\n\nconst entToType = (s: Dirent | Stats) =>\n  s.isFile() ? IFREG\n  : s.isDirectory() ? IFDIR\n  : s.isSymbolicLink() ? IFLNK\n  : s.isCharacterDevice() ? IFCHR\n  : s.isBlockDevice() ? IFBLK\n  : s.isSocket() ? IFSOCK\n  : s.isFIFO() ? IFIFO\n  : UNKNOWN\n\n// normalize unicode path names\nconst normalizeCache = new LRUCache({ max: 2 ** 12 })\nconst normalize = (s: string) => {\n  const c = normalizeCache.get(s)\n  if (c) return c\n  const n = s.normalize('NFKD')\n  normalizeCache.set(s, n)\n  return n\n}\n\nconst normalizeNocaseCache = new LRUCache({ max: 2 ** 12 })\nconst normalizeNocase = (s: string) => {\n  const c = normalizeNocaseCache.get(s)\n  if (c) return c\n  const n = normalize(s.toLowerCase())\n  normalizeNocaseCache.set(s, n)\n  return n\n}\n\n/**\n * Options that may be provided to the Path constructor\n */\nexport interface PathOpts {\n  fullpath?: string\n  relative?: string\n  relativePosix?: string\n  parent?: PathBase\n  /**\n   * See {@link FSOption}\n   */\n  fs?: FSOption\n}\n\n/**\n * An LRUCache for storing resolved path strings or Path objects.\n * @internal\n */\nexport class ResolveCache extends LRUCache {\n  constructor() {\n    super({ max: 256 })\n  }\n}\n\n// In order to prevent blowing out the js heap by allocating hundreds of\n// thousands of Path entries when walking extremely large trees, the \"children\"\n// in this tree are represented by storing an array of Path entries in an\n// LRUCache, indexed by the parent.  At any time, Path.children() may return an\n// empty array, indicating that it doesn't know about any of its children, and\n// thus has to rebuild that cache.  This is fine, it just means that we don't\n// benefit as much from having the cached entries, but huge directory walks\n// don't blow out the stack, and smaller ones are still as fast as possible.\n//\n//It does impose some complexity when building up the readdir data, because we\n//need to pass a reference to the children array that we started with.\n\n/**\n * an LRUCache for storing child entries.\n * @internal\n */\nexport class ChildrenCache extends LRUCache {\n  constructor(maxSize: number = 16 * 1024) {\n    super({\n      maxSize,\n      // parent + children\n      sizeCalculation: a => a.length + 1,\n    })\n  }\n}\n\n/**\n * Array of Path objects, plus a marker indicating the first provisional entry\n *\n * @internal\n */\nexport type Children = PathBase[] & { provisional: number }\n\nconst setAsCwd = Symbol('PathScurry setAsCwd')\n\n/**\n * Path objects are sort of like a super-powered\n * {@link https://nodejs.org/docs/latest/api/fs.html#class-fsdirent fs.Dirent}\n *\n * Each one represents a single filesystem entry on disk, which may or may not\n * exist. It includes methods for reading various types of information via\n * lstat, readlink, and readdir, and caches all information to the greatest\n * degree possible.\n *\n * Note that fs operations that would normally throw will instead return an\n * \"empty\" value. This is in order to prevent excessive overhead from error\n * stack traces.\n */\nexport abstract class PathBase implements Dirent {\n  /**\n   * the basename of this path\n   *\n   * **Important**: *always* test the path name against any test string\n   * usingthe {@link isNamed} method, and not by directly comparing this\n   * string. Otherwise, unicode path strings that the system sees as identical\n   * will not be properly treated as the same path, leading to incorrect\n   * behavior and possible security issues.\n   */\n  name: string\n  /**\n   * the Path entry corresponding to the path root.\n   *\n   * @internal\n   */\n  root: PathBase\n  /**\n   * All roots found within the current PathScurry family\n   *\n   * @internal\n   */\n  roots: { [k: string]: PathBase }\n  /**\n   * a reference to the parent path, or undefined in the case of root entries\n   *\n   * @internal\n   */\n  parent?: PathBase\n  /**\n   * boolean indicating whether paths are compared case-insensitively\n   * @internal\n   */\n  nocase: boolean\n\n  /**\n   * boolean indicating that this path is the current working directory\n   * of the PathScurry collection that contains it.\n   */\n  isCWD: boolean = false\n\n  /**\n   * the string or regexp used to split paths. On posix, it is `'/'`, and on\n   * windows it is a RegExp matching either `'/'` or `'\\\\'`\n   */\n  abstract splitSep: string | RegExp\n  /**\n   * The path separator string to use when joining paths\n   */\n  abstract sep: string\n\n  // potential default fs override\n  #fs: FSValue\n\n  // Stats fields\n  #dev?: number\n  get dev() {\n    return this.#dev\n  }\n  #mode?: number\n  get mode() {\n    return this.#mode\n  }\n  #nlink?: number\n  get nlink() {\n    return this.#nlink\n  }\n  #uid?: number\n  get uid() {\n    return this.#uid\n  }\n  #gid?: number\n  get gid() {\n    return this.#gid\n  }\n  #rdev?: number\n  get rdev() {\n    return this.#rdev\n  }\n  #blksize?: number\n  get blksize() {\n    return this.#blksize\n  }\n  #ino?: number\n  get ino() {\n    return this.#ino\n  }\n  #size?: number\n  get size() {\n    return this.#size\n  }\n  #blocks?: number\n  get blocks() {\n    return this.#blocks\n  }\n  #atimeMs?: number\n  get atimeMs() {\n    return this.#atimeMs\n  }\n  #mtimeMs?: number\n  get mtimeMs() {\n    return this.#mtimeMs\n  }\n  #ctimeMs?: number\n  get ctimeMs() {\n    return this.#ctimeMs\n  }\n  #birthtimeMs?: number\n  get birthtimeMs() {\n    return this.#birthtimeMs\n  }\n  #atime?: Date\n  get atime() {\n    return this.#atime\n  }\n  #mtime?: Date\n  get mtime() {\n    return this.#mtime\n  }\n  #ctime?: Date\n  get ctime() {\n    return this.#ctime\n  }\n  #birthtime?: Date\n  get birthtime() {\n    return this.#birthtime\n  }\n\n  #matchName: string\n  #depth?: number\n  #fullpath?: string\n  #fullpathPosix?: string\n  #relative?: string\n  #relativePosix?: string\n  #type: number\n  #children: ChildrenCache\n  #linkTarget?: PathBase\n  #realpath?: PathBase\n\n  /**\n   * This property is for compatibility with the Dirent class as of\n   * Node v20, where Dirent['parentPath'] refers to the path of the\n   * directory that was passed to readdir. For root entries, it's the path\n   * to the entry itself.\n   */\n  get parentPath(): string {\n    return (this.parent || this).fullpath()\n  }\n\n  /* c8 ignore start */\n  /**\n   * Deprecated alias for Dirent['parentPath'] Somewhat counterintuitively,\n   * this property refers to the *parent* path, not the path object itself.\n   *\n   * @deprecated\n   */\n  get path(): string {\n    return this.parentPath\n  }\n  /* c8 ignore stop */\n\n  /**\n   * Do not create new Path objects directly.  They should always be accessed\n   * via the PathScurry class or other methods on the Path class.\n   *\n   * @internal\n   */\n  constructor(\n    name: string,\n    type: number = UNKNOWN,\n    root: PathBase | undefined,\n    roots: { [k: string]: PathBase },\n    nocase: boolean,\n    children: ChildrenCache,\n    opts: PathOpts,\n  ) {\n    this.name = name\n    this.#matchName = nocase ? normalizeNocase(name) : normalize(name)\n    this.#type = type & TYPEMASK\n    this.nocase = nocase\n    this.roots = roots\n    this.root = root || this\n    this.#children = children\n    this.#fullpath = opts.fullpath\n    this.#relative = opts.relative\n    this.#relativePosix = opts.relativePosix\n    this.parent = opts.parent\n    if (this.parent) {\n      this.#fs = this.parent.#fs\n    } else {\n      this.#fs = fsFromOption(opts.fs)\n    }\n  }\n\n  /**\n   * Returns the depth of the Path object from its root.\n   *\n   * For example, a path at `/foo/bar` would have a depth of 2.\n   */\n  depth(): number {\n    if (this.#depth !== undefined) return this.#depth\n    if (!this.parent) return (this.#depth = 0)\n    return (this.#depth = this.parent.depth() + 1)\n  }\n\n  /**\n   * @internal\n   */\n  abstract getRootString(path: string): string\n  /**\n   * @internal\n   */\n  abstract getRoot(rootPath: string): PathBase\n  /**\n   * @internal\n   */\n  abstract newChild(name: string, type?: number, opts?: PathOpts): PathBase\n\n  /**\n   * @internal\n   */\n  childrenCache() {\n    return this.#children\n  }\n\n  /**\n   * Get the Path object referenced by the string path, resolved from this Path\n   */\n  resolve(path?: string): PathBase {\n    if (!path) {\n      return this\n    }\n    const rootPath = this.getRootString(path)\n    const dir = path.substring(rootPath.length)\n    const dirParts = dir.split(this.splitSep)\n    const result: PathBase =\n      rootPath ?\n        this.getRoot(rootPath).#resolveParts(dirParts)\n      : this.#resolveParts(dirParts)\n    return result\n  }\n\n  #resolveParts(dirParts: string[]) {\n    let p: PathBase = this\n    for (const part of dirParts) {\n      p = p.child(part)\n    }\n    return p\n  }\n\n  /**\n   * Returns the cached children Path objects, if still available.  If they\n   * have fallen out of the cache, then returns an empty array, and resets the\n   * READDIR_CALLED bit, so that future calls to readdir() will require an fs\n   * lookup.\n   *\n   * @internal\n   */\n  children(): Children {\n    const cached = this.#children.get(this)\n    if (cached) {\n      return cached\n    }\n    const children: Children = Object.assign([], { provisional: 0 })\n    this.#children.set(this, children)\n    this.#type &= ~READDIR_CALLED\n    return children\n  }\n\n  /**\n   * Resolves a path portion and returns or creates the child Path.\n   *\n   * Returns `this` if pathPart is `''` or `'.'`, or `parent` if pathPart is\n   * `'..'`.\n   *\n   * This should not be called directly.  If `pathPart` contains any path\n   * separators, it will lead to unsafe undefined behavior.\n   *\n   * Use `Path.resolve()` instead.\n   *\n   * @internal\n   */\n  child(pathPart: string, opts?: PathOpts): PathBase {\n    if (pathPart === '' || pathPart === '.') {\n      return this\n    }\n    if (pathPart === '..') {\n      return this.parent || this\n    }\n\n    // find the child\n    const children = this.children()\n    const name =\n      this.nocase ? normalizeNocase(pathPart) : normalize(pathPart)\n    for (const p of children) {\n      if (p.#matchName === name) {\n        return p\n      }\n    }\n\n    // didn't find it, create provisional child, since it might not\n    // actually exist.  If we know the parent isn't a dir, then\n    // in fact it CAN'T exist.\n    const s = this.parent ? this.sep : ''\n    const fullpath =\n      this.#fullpath ? this.#fullpath + s + pathPart : undefined\n    const pchild = this.newChild(pathPart, UNKNOWN, {\n      ...opts,\n      parent: this,\n      fullpath,\n    })\n\n    if (!this.canReaddir()) {\n      pchild.#type |= ENOENT\n    }\n\n    // don't have to update provisional, because if we have real children,\n    // then provisional is set to children.length, otherwise a lower number\n    children.push(pchild)\n    return pchild\n  }\n\n  /**\n   * The relative path from the cwd. If it does not share an ancestor with\n   * the cwd, then this ends up being equivalent to the fullpath()\n   */\n  relative(): string {\n    if (this.isCWD) return ''\n    if (this.#relative !== undefined) {\n      return this.#relative\n    }\n    const name = this.name\n    const p = this.parent\n    if (!p) {\n      return (this.#relative = this.name)\n    }\n    const pv = p.relative()\n    return pv + (!pv || !p.parent ? '' : this.sep) + name\n  }\n\n  /**\n   * The relative path from the cwd, using / as the path separator.\n   * If it does not share an ancestor with\n   * the cwd, then this ends up being equivalent to the fullpathPosix()\n   * On posix systems, this is identical to relative().\n   */\n  relativePosix(): string {\n    if (this.sep === '/') return this.relative()\n    if (this.isCWD) return ''\n    if (this.#relativePosix !== undefined) return this.#relativePosix\n    const name = this.name\n    const p = this.parent\n    if (!p) {\n      return (this.#relativePosix = this.fullpathPosix())\n    }\n    const pv = p.relativePosix()\n    return pv + (!pv || !p.parent ? '' : '/') + name\n  }\n\n  /**\n   * The fully resolved path string for this Path entry\n   */\n  fullpath(): string {\n    if (this.#fullpath !== undefined) {\n      return this.#fullpath\n    }\n    const name = this.name\n    const p = this.parent\n    if (!p) {\n      return (this.#fullpath = this.name)\n    }\n    const pv = p.fullpath()\n    const fp = pv + (!p.parent ? '' : this.sep) + name\n    return (this.#fullpath = fp)\n  }\n\n  /**\n   * On platforms other than windows, this is identical to fullpath.\n   *\n   * On windows, this is overridden to return the forward-slash form of the\n   * full UNC path.\n   */\n  fullpathPosix(): string {\n    if (this.#fullpathPosix !== undefined) return this.#fullpathPosix\n    if (this.sep === '/') return (this.#fullpathPosix = this.fullpath())\n    if (!this.parent) {\n      const p = this.fullpath().replace(/\\\\/g, '/')\n      if (/^[a-z]:\\//i.test(p)) {\n        return (this.#fullpathPosix = `//?/${p}`)\n      } else {\n        return (this.#fullpathPosix = p)\n      }\n    }\n    const p = this.parent\n    const pfpp = p.fullpathPosix()\n    const fpp = pfpp + (!pfpp || !p.parent ? '' : '/') + this.name\n    return (this.#fullpathPosix = fpp)\n  }\n\n  /**\n   * Is the Path of an unknown type?\n   *\n   * Note that we might know *something* about it if there has been a previous\n   * filesystem operation, for example that it does not exist, or is not a\n   * link, or whether it has child entries.\n   */\n  isUnknown(): boolean {\n    return (this.#type & IFMT) === UNKNOWN\n  }\n\n  isType(type: Type): boolean {\n    return this[`is${type}`]()\n  }\n\n  getType(): Type {\n    return (\n      this.isUnknown() ? 'Unknown'\n      : this.isDirectory() ? 'Directory'\n      : this.isFile() ? 'File'\n      : this.isSymbolicLink() ? 'SymbolicLink'\n      : this.isFIFO() ? 'FIFO'\n      : this.isCharacterDevice() ? 'CharacterDevice'\n      : this.isBlockDevice() ? 'BlockDevice'\n      : /* c8 ignore start */ this.isSocket() ? 'Socket'\n      : 'Unknown'\n    )\n    /* c8 ignore stop */\n  }\n\n  /**\n   * Is the Path a regular file?\n   */\n  isFile(): boolean {\n    return (this.#type & IFMT) === IFREG\n  }\n\n  /**\n   * Is the Path a directory?\n   */\n  isDirectory(): boolean {\n    return (this.#type & IFMT) === IFDIR\n  }\n\n  /**\n   * Is the path a character device?\n   */\n  isCharacterDevice(): boolean {\n    return (this.#type & IFMT) === IFCHR\n  }\n\n  /**\n   * Is the path a block device?\n   */\n  isBlockDevice(): boolean {\n    return (this.#type & IFMT) === IFBLK\n  }\n\n  /**\n   * Is the path a FIFO pipe?\n   */\n  isFIFO(): boolean {\n    return (this.#type & IFMT) === IFIFO\n  }\n\n  /**\n   * Is the path a socket?\n   */\n  isSocket(): boolean {\n    return (this.#type & IFMT) === IFSOCK\n  }\n\n  /**\n   * Is the path a symbolic link?\n   */\n  isSymbolicLink(): boolean {\n    return (this.#type & IFLNK) === IFLNK\n  }\n\n  /**\n   * Return the entry if it has been subject of a successful lstat, or\n   * undefined otherwise.\n   *\n   * Does not read the filesystem, so an undefined result *could* simply\n   * mean that we haven't called lstat on it.\n   */\n  lstatCached(): PathBase | undefined {\n    return this.#type & LSTAT_CALLED ? this : undefined\n  }\n\n  /**\n   * Return the cached link target if the entry has been the subject of a\n   * successful readlink, or undefined otherwise.\n   *\n   * Does not read the filesystem, so an undefined result *could* just mean we\n   * don't have any cached data. Only use it if you are very sure that a\n   * readlink() has been called at some point.\n   */\n  readlinkCached(): PathBase | undefined {\n    return this.#linkTarget\n  }\n\n  /**\n   * Returns the cached realpath target if the entry has been the subject\n   * of a successful realpath, or undefined otherwise.\n   *\n   * Does not read the filesystem, so an undefined result *could* just mean we\n   * don't have any cached data. Only use it if you are very sure that a\n   * realpath() has been called at some point.\n   */\n  realpathCached(): PathBase | undefined {\n    return this.#realpath\n  }\n\n  /**\n   * Returns the cached child Path entries array if the entry has been the\n   * subject of a successful readdir(), or [] otherwise.\n   *\n   * Does not read the filesystem, so an empty array *could* just mean we\n   * don't have any cached data. Only use it if you are very sure that a\n   * readdir() has been called recently enough to still be valid.\n   */\n  readdirCached(): PathBase[] {\n    const children = this.children()\n    return children.slice(0, children.provisional)\n  }\n\n  /**\n   * Return true if it's worth trying to readlink.  Ie, we don't (yet) have\n   * any indication that readlink will definitely fail.\n   *\n   * Returns false if the path is known to not be a symlink, if a previous\n   * readlink failed, or if the entry does not exist.\n   */\n  canReadlink(): boolean {\n    if (this.#linkTarget) return true\n    if (!this.parent) return false\n    // cases where it cannot possibly succeed\n    const ifmt = this.#type & IFMT\n    return !(\n      (ifmt !== UNKNOWN && ifmt !== IFLNK) ||\n      this.#type & ENOREADLINK ||\n      this.#type & ENOENT\n    )\n  }\n\n  /**\n   * Return true if readdir has previously been successfully called on this\n   * path, indicating that cachedReaddir() is likely valid.\n   */\n  calledReaddir(): boolean {\n    return !!(this.#type & READDIR_CALLED)\n  }\n\n  /**\n   * Returns true if the path is known to not exist. That is, a previous lstat\n   * or readdir failed to verify its existence when that would have been\n   * expected, or a parent entry was marked either enoent or enotdir.\n   */\n  isENOENT(): boolean {\n    return !!(this.#type & ENOENT)\n  }\n\n  /**\n   * Return true if the path is a match for the given path name.  This handles\n   * case sensitivity and unicode normalization.\n   *\n   * Note: even on case-sensitive systems, it is **not** safe to test the\n   * equality of the `.name` property to determine whether a given pathname\n   * matches, due to unicode normalization mismatches.\n   *\n   * Always use this method instead of testing the `path.name` property\n   * directly.\n   */\n  isNamed(n: string): boolean {\n    return !this.nocase ?\n        this.#matchName === normalize(n)\n      : this.#matchName === normalizeNocase(n)\n  }\n\n  /**\n   * Return the Path object corresponding to the target of a symbolic link.\n   *\n   * If the Path is not a symbolic link, or if the readlink call fails for any\n   * reason, `undefined` is returned.\n   *\n   * Result is cached, and thus may be outdated if the filesystem is mutated.\n   */\n  async readlink(): Promise {\n    const target = this.#linkTarget\n    if (target) {\n      return target\n    }\n    if (!this.canReadlink()) {\n      return undefined\n    }\n    /* c8 ignore start */\n    // already covered by the canReadlink test, here for ts grumples\n    if (!this.parent) {\n      return undefined\n    }\n    /* c8 ignore stop */\n    try {\n      const read = await this.#fs.promises.readlink(this.fullpath())\n      const linkTarget = (await this.parent.realpath())?.resolve(read)\n      if (linkTarget) {\n        return (this.#linkTarget = linkTarget)\n      }\n    } catch (er) {\n      this.#readlinkFail((er as NodeJS.ErrnoException).code)\n      return undefined\n    }\n  }\n\n  /**\n   * Synchronous {@link PathBase.readlink}\n   */\n  readlinkSync(): PathBase | undefined {\n    const target = this.#linkTarget\n    if (target) {\n      return target\n    }\n    if (!this.canReadlink()) {\n      return undefined\n    }\n    /* c8 ignore start */\n    // already covered by the canReadlink test, here for ts grumples\n    if (!this.parent) {\n      return undefined\n    }\n    /* c8 ignore stop */\n    try {\n      const read = this.#fs.readlinkSync(this.fullpath())\n      const linkTarget = this.parent.realpathSync()?.resolve(read)\n      if (linkTarget) {\n        return (this.#linkTarget = linkTarget)\n      }\n    } catch (er) {\n      this.#readlinkFail((er as NodeJS.ErrnoException).code)\n      return undefined\n    }\n  }\n\n  #readdirSuccess(children: Children) {\n    // succeeded, mark readdir called bit\n    this.#type |= READDIR_CALLED\n    // mark all remaining provisional children as ENOENT\n    for (let p = children.provisional; p < children.length; p++) {\n      const c = children[p]\n      if (c) c.#markENOENT()\n    }\n  }\n\n  #markENOENT() {\n    // mark as UNKNOWN and ENOENT\n    if (this.#type & ENOENT) return\n    this.#type = (this.#type | ENOENT) & IFMT_UNKNOWN\n    this.#markChildrenENOENT()\n  }\n\n  #markChildrenENOENT() {\n    // all children are provisional and do not exist\n    const children = this.children()\n    children.provisional = 0\n    for (const p of children) {\n      p.#markENOENT()\n    }\n  }\n\n  #markENOREALPATH() {\n    this.#type |= ENOREALPATH\n    this.#markENOTDIR()\n  }\n\n  // save the information when we know the entry is not a dir\n  #markENOTDIR() {\n    // entry is not a directory, so any children can't exist.\n    // this *should* be impossible, since any children created\n    // after it's been marked ENOTDIR should be marked ENOENT,\n    // so it won't even get to this point.\n    /* c8 ignore start */\n    if (this.#type & ENOTDIR) return\n    /* c8 ignore stop */\n    let t = this.#type\n    // this could happen if we stat a dir, then delete it,\n    // then try to read it or one of its children.\n    if ((t & IFMT) === IFDIR) t &= IFMT_UNKNOWN\n    this.#type = t | ENOTDIR\n    this.#markChildrenENOENT()\n  }\n\n  #readdirFail(code: string = '') {\n    // markENOTDIR and markENOENT also set provisional=0\n    if (code === 'ENOTDIR' || code === 'EPERM') {\n      this.#markENOTDIR()\n    } else if (code === 'ENOENT') {\n      this.#markENOENT()\n    } else {\n      this.children().provisional = 0\n    }\n  }\n\n  #lstatFail(code: string = '') {\n    // Windows just raises ENOENT in this case, disable for win CI\n    /* c8 ignore start */\n    if (code === 'ENOTDIR') {\n      // already know it has a parent by this point\n      const p = this.parent as PathBase\n      p.#markENOTDIR()\n    } else if (code === 'ENOENT') {\n      /* c8 ignore stop */\n      this.#markENOENT()\n    }\n  }\n\n  #readlinkFail(code: string = '') {\n    let ter = this.#type\n    ter |= ENOREADLINK\n    if (code === 'ENOENT') ter |= ENOENT\n    // windows gets a weird error when you try to readlink a file\n    if (code === 'EINVAL' || code === 'UNKNOWN') {\n      // exists, but not a symlink, we don't know WHAT it is, so remove\n      // all IFMT bits.\n      ter &= IFMT_UNKNOWN\n    }\n    this.#type = ter\n    // windows just gets ENOENT in this case.  We do cover the case,\n    // just disabled because it's impossible on Windows CI\n    /* c8 ignore start */\n    if (code === 'ENOTDIR' && this.parent) {\n      this.parent.#markENOTDIR()\n    }\n    /* c8 ignore stop */\n  }\n\n  #readdirAddChild(e: Dirent, c: Children) {\n    return (\n      this.#readdirMaybePromoteChild(e, c) ||\n      this.#readdirAddNewChild(e, c)\n    )\n  }\n\n  #readdirAddNewChild(e: Dirent, c: Children): PathBase {\n    // alloc new entry at head, so it's never provisional\n    const type = entToType(e)\n    const child = this.newChild(e.name, type, { parent: this })\n    const ifmt = child.#type & IFMT\n    if (ifmt !== IFDIR && ifmt !== IFLNK && ifmt !== UNKNOWN) {\n      child.#type |= ENOTDIR\n    }\n    c.unshift(child)\n    c.provisional++\n    return child\n  }\n\n  #readdirMaybePromoteChild(e: Dirent, c: Children): PathBase | undefined {\n    for (let p = c.provisional; p < c.length; p++) {\n      const pchild = c[p]\n      const name =\n        this.nocase ? normalizeNocase(e.name) : normalize(e.name)\n      if (name !== pchild!.#matchName) {\n        continue\n      }\n\n      return this.#readdirPromoteChild(e, pchild!, p, c)\n    }\n  }\n\n  #readdirPromoteChild(\n    e: Dirent,\n    p: PathBase,\n    index: number,\n    c: Children,\n  ): PathBase {\n    const v = p.name\n    // retain any other flags, but set ifmt from dirent\n    p.#type = (p.#type & IFMT_UNKNOWN) | entToType(e)\n    // case sensitivity fixing when we learn the true name.\n    if (v !== e.name) p.name = e.name\n\n    // just advance provisional index (potentially off the list),\n    // otherwise we have to splice/pop it out and re-insert at head\n    if (index !== c.provisional) {\n      if (index === c.length - 1) c.pop()\n      else c.splice(index, 1)\n      c.unshift(p)\n    }\n    c.provisional++\n    return p\n  }\n\n  /**\n   * Call lstat() on this Path, and update all known information that can be\n   * determined.\n   *\n   * Note that unlike `fs.lstat()`, the returned value does not contain some\n   * information, such as `mode`, `dev`, `nlink`, and `ino`.  If that\n   * information is required, you will need to call `fs.lstat` yourself.\n   *\n   * If the Path refers to a nonexistent file, or if the lstat call fails for\n   * any reason, `undefined` is returned.  Otherwise the updated Path object is\n   * returned.\n   *\n   * Results are cached, and thus may be out of date if the filesystem is\n   * mutated.\n   */\n  async lstat(): Promise {\n    if ((this.#type & ENOENT) === 0) {\n      try {\n        this.#applyStat(await this.#fs.promises.lstat(this.fullpath()))\n        return this\n      } catch (er) {\n        this.#lstatFail((er as NodeJS.ErrnoException).code)\n      }\n    }\n  }\n\n  /**\n   * synchronous {@link PathBase.lstat}\n   */\n  lstatSync(): PathBase | undefined {\n    if ((this.#type & ENOENT) === 0) {\n      try {\n        this.#applyStat(this.#fs.lstatSync(this.fullpath()))\n        return this\n      } catch (er) {\n        this.#lstatFail((er as NodeJS.ErrnoException).code)\n      }\n    }\n  }\n\n  #applyStat(st: Stats) {\n    const {\n      atime,\n      atimeMs,\n      birthtime,\n      birthtimeMs,\n      blksize,\n      blocks,\n      ctime,\n      ctimeMs,\n      dev,\n      gid,\n      ino,\n      mode,\n      mtime,\n      mtimeMs,\n      nlink,\n      rdev,\n      size,\n      uid,\n    } = st\n    this.#atime = atime\n    this.#atimeMs = atimeMs\n    this.#birthtime = birthtime\n    this.#birthtimeMs = birthtimeMs\n    this.#blksize = blksize\n    this.#blocks = blocks\n    this.#ctime = ctime\n    this.#ctimeMs = ctimeMs\n    this.#dev = dev\n    this.#gid = gid\n    this.#ino = ino\n    this.#mode = mode\n    this.#mtime = mtime\n    this.#mtimeMs = mtimeMs\n    this.#nlink = nlink\n    this.#rdev = rdev\n    this.#size = size\n    this.#uid = uid\n    const ifmt = entToType(st)\n    // retain any other flags, but set the ifmt\n    this.#type = (this.#type & IFMT_UNKNOWN) | ifmt | LSTAT_CALLED\n    if (ifmt !== UNKNOWN && ifmt !== IFDIR && ifmt !== IFLNK) {\n      this.#type |= ENOTDIR\n    }\n  }\n\n  #onReaddirCB: ((\n    er: NodeJS.ErrnoException | null,\n    entries: Path[],\n  ) => any)[] = []\n  #readdirCBInFlight: boolean = false\n  #callOnReaddirCB(children: Path[]) {\n    this.#readdirCBInFlight = false\n    const cbs = this.#onReaddirCB.slice()\n    this.#onReaddirCB.length = 0\n    cbs.forEach(cb => cb(null, children))\n  }\n\n  /**\n   * Standard node-style callback interface to get list of directory entries.\n   *\n   * If the Path cannot or does not contain any children, then an empty array\n   * is returned.\n   *\n   * Results are cached, and thus may be out of date if the filesystem is\n   * mutated.\n   *\n   * @param cb The callback called with (er, entries).  Note that the `er`\n   * param is somewhat extraneous, as all readdir() errors are handled and\n   * simply result in an empty set of entries being returned.\n   * @param allowZalgo Boolean indicating that immediately known results should\n   * *not* be deferred with `queueMicrotask`. Defaults to `false`. Release\n   * zalgo at your peril, the dark pony lord is devious and unforgiving.\n   */\n  readdirCB(\n    cb: (er: NodeJS.ErrnoException | null, entries: PathBase[]) => any,\n    allowZalgo: boolean = false,\n  ): void {\n    if (!this.canReaddir()) {\n      if (allowZalgo) cb(null, [])\n      else queueMicrotask(() => cb(null, []))\n      return\n    }\n\n    const children = this.children()\n    if (this.calledReaddir()) {\n      const c = children.slice(0, children.provisional)\n      if (allowZalgo) cb(null, c)\n      else queueMicrotask(() => cb(null, c))\n      return\n    }\n\n    // don't have to worry about zalgo at this point.\n    this.#onReaddirCB.push(cb)\n    if (this.#readdirCBInFlight) {\n      return\n    }\n    this.#readdirCBInFlight = true\n\n    // else read the directory, fill up children\n    // de-provisionalize any provisional children.\n    const fullpath = this.fullpath()\n    this.#fs.readdir(fullpath, { withFileTypes: true }, (er, entries) => {\n      if (er) {\n        this.#readdirFail((er as NodeJS.ErrnoException).code)\n        children.provisional = 0\n      } else {\n        // if we didn't get an error, we always get entries.\n        //@ts-ignore\n        for (const e of entries) {\n          this.#readdirAddChild(e, children)\n        }\n        this.#readdirSuccess(children)\n      }\n      this.#callOnReaddirCB(children.slice(0, children.provisional))\n      return\n    })\n  }\n\n  #asyncReaddirInFlight?: Promise\n\n  /**\n   * Return an array of known child entries.\n   *\n   * If the Path cannot or does not contain any children, then an empty array\n   * is returned.\n   *\n   * Results are cached, and thus may be out of date if the filesystem is\n   * mutated.\n   */\n  async readdir(): Promise {\n    if (!this.canReaddir()) {\n      return []\n    }\n\n    const children = this.children()\n    if (this.calledReaddir()) {\n      return children.slice(0, children.provisional)\n    }\n\n    // else read the directory, fill up children\n    // de-provisionalize any provisional children.\n    const fullpath = this.fullpath()\n    if (this.#asyncReaddirInFlight) {\n      await this.#asyncReaddirInFlight\n    } else {\n      /* c8 ignore start */\n      let resolve: () => void = () => {}\n      /* c8 ignore stop */\n      this.#asyncReaddirInFlight = new Promise(\n        res => (resolve = res),\n      )\n      try {\n        for (const e of await this.#fs.promises.readdir(fullpath, {\n          withFileTypes: true,\n        })) {\n          this.#readdirAddChild(e, children)\n        }\n        this.#readdirSuccess(children)\n      } catch (er) {\n        this.#readdirFail((er as NodeJS.ErrnoException).code)\n        children.provisional = 0\n      }\n      this.#asyncReaddirInFlight = undefined\n      resolve()\n    }\n    return children.slice(0, children.provisional)\n  }\n\n  /**\n   * synchronous {@link PathBase.readdir}\n   */\n  readdirSync(): PathBase[] {\n    if (!this.canReaddir()) {\n      return []\n    }\n\n    const children = this.children()\n    if (this.calledReaddir()) {\n      return children.slice(0, children.provisional)\n    }\n\n    // else read the directory, fill up children\n    // de-provisionalize any provisional children.\n    const fullpath = this.fullpath()\n    try {\n      for (const e of this.#fs.readdirSync(fullpath, {\n        withFileTypes: true,\n      })) {\n        this.#readdirAddChild(e, children)\n      }\n      this.#readdirSuccess(children)\n    } catch (er) {\n      this.#readdirFail((er as NodeJS.ErrnoException).code)\n      children.provisional = 0\n    }\n    return children.slice(0, children.provisional)\n  }\n\n  canReaddir() {\n    if (this.#type & ENOCHILD) return false\n    const ifmt = IFMT & this.#type\n    // we always set ENOTDIR when setting IFMT, so should be impossible\n    /* c8 ignore start */\n    if (!(ifmt === UNKNOWN || ifmt === IFDIR || ifmt === IFLNK)) {\n      return false\n    }\n    /* c8 ignore stop */\n    return true\n  }\n\n  shouldWalk(\n    dirs: Set,\n    walkFilter?: (e: PathBase) => boolean,\n  ): boolean {\n    return (\n      (this.#type & IFDIR) === IFDIR &&\n      !(this.#type & ENOCHILD) &&\n      !dirs.has(this) &&\n      (!walkFilter || walkFilter(this))\n    )\n  }\n\n  /**\n   * Return the Path object corresponding to path as resolved\n   * by realpath(3).\n   *\n   * If the realpath call fails for any reason, `undefined` is returned.\n   *\n   * Result is cached, and thus may be outdated if the filesystem is mutated.\n   * On success, returns a Path object.\n   */\n  async realpath(): Promise {\n    if (this.#realpath) return this.#realpath\n    if ((ENOREALPATH | ENOREADLINK | ENOENT) & this.#type) return undefined\n    try {\n      const rp = await this.#fs.promises.realpath(this.fullpath())\n      return (this.#realpath = this.resolve(rp))\n    } catch (_) {\n      this.#markENOREALPATH()\n    }\n  }\n\n  /**\n   * Synchronous {@link realpath}\n   */\n  realpathSync(): PathBase | undefined {\n    if (this.#realpath) return this.#realpath\n    if ((ENOREALPATH | ENOREADLINK | ENOENT) & this.#type) return undefined\n    try {\n      const rp = this.#fs.realpathSync(this.fullpath())\n      return (this.#realpath = this.resolve(rp))\n    } catch (_) {\n      this.#markENOREALPATH()\n    }\n  }\n\n  /**\n   * Internal method to mark this Path object as the scurry cwd,\n   * called by {@link PathScurry#chdir}\n   *\n   * @internal\n   */\n  [setAsCwd](oldCwd: PathBase): void {\n    if (oldCwd === this) return\n    oldCwd.isCWD = false\n    this.isCWD = true\n\n    const changed = new Set([])\n    let rp = []\n    let p: PathBase = this\n    while (p && p.parent) {\n      changed.add(p)\n      p.#relative = rp.join(this.sep)\n      p.#relativePosix = rp.join('/')\n      p = p.parent\n      rp.push('..')\n    }\n    // now un-memoize parents of old cwd\n    p = oldCwd\n    while (p && p.parent && !changed.has(p)) {\n      p.#relative = undefined\n      p.#relativePosix = undefined\n      p = p.parent\n    }\n  }\n}\n\n/**\n * Path class used on win32 systems\n *\n * Uses `'\\\\'` as the path separator for returned paths, either `'\\\\'` or `'/'`\n * as the path separator for parsing paths.\n */\nexport class PathWin32 extends PathBase {\n  /**\n   * Separator for generating path strings.\n   */\n  sep: '\\\\' = '\\\\'\n  /**\n   * Separator for parsing path strings.\n   */\n  splitSep: RegExp = eitherSep\n\n  /**\n   * Do not create new Path objects directly.  They should always be accessed\n   * via the PathScurry class or other methods on the Path class.\n   *\n   * @internal\n   */\n  constructor(\n    name: string,\n    type: number = UNKNOWN,\n    root: PathBase | undefined,\n    roots: { [k: string]: PathBase },\n    nocase: boolean,\n    children: ChildrenCache,\n    opts: PathOpts,\n  ) {\n    super(name, type, root, roots, nocase, children, opts)\n  }\n\n  /**\n   * @internal\n   */\n  newChild(name: string, type: number = UNKNOWN, opts: PathOpts = {}) {\n    return new PathWin32(\n      name,\n      type,\n      this.root,\n      this.roots,\n      this.nocase,\n      this.childrenCache(),\n      opts,\n    )\n  }\n\n  /**\n   * @internal\n   */\n  getRootString(path: string): string {\n    return win32.parse(path).root\n  }\n\n  /**\n   * @internal\n   */\n  getRoot(rootPath: string): PathBase {\n    rootPath = uncToDrive(rootPath.toUpperCase())\n    if (rootPath === this.root.name) {\n      return this.root\n    }\n    // ok, not that one, check if it matches another we know about\n    for (const [compare, root] of Object.entries(this.roots)) {\n      if (this.sameRoot(rootPath, compare)) {\n        return (this.roots[rootPath] = root)\n      }\n    }\n    // otherwise, have to create a new one.\n    return (this.roots[rootPath] = new PathScurryWin32(\n      rootPath,\n      this,\n    ).root)\n  }\n\n  /**\n   * @internal\n   */\n  sameRoot(rootPath: string, compare: string = this.root.name): boolean {\n    // windows can (rarely) have case-sensitive filesystem, but\n    // UNC and drive letters are always case-insensitive, and canonically\n    // represented uppercase.\n    rootPath = rootPath\n      .toUpperCase()\n      .replace(/\\//g, '\\\\')\n      .replace(uncDriveRegexp, '$1\\\\')\n    return rootPath === compare\n  }\n}\n\n/**\n * Path class used on all posix systems.\n *\n * Uses `'/'` as the path separator.\n */\nexport class PathPosix extends PathBase {\n  /**\n   * separator for parsing path strings\n   */\n  splitSep: '/' = '/'\n  /**\n   * separator for generating path strings\n   */\n  sep: '/' = '/'\n\n  /**\n   * Do not create new Path objects directly.  They should always be accessed\n   * via the PathScurry class or other methods on the Path class.\n   *\n   * @internal\n   */\n  constructor(\n    name: string,\n    type: number = UNKNOWN,\n    root: PathBase | undefined,\n    roots: { [k: string]: PathBase },\n    nocase: boolean,\n    children: ChildrenCache,\n    opts: PathOpts,\n  ) {\n    super(name, type, root, roots, nocase, children, opts)\n  }\n\n  /**\n   * @internal\n   */\n  getRootString(path: string): string {\n    return path.startsWith('/') ? '/' : ''\n  }\n\n  /**\n   * @internal\n   */\n  getRoot(_rootPath: string): PathBase {\n    return this.root\n  }\n\n  /**\n   * @internal\n   */\n  newChild(name: string, type: number = UNKNOWN, opts: PathOpts = {}) {\n    return new PathPosix(\n      name,\n      type,\n      this.root,\n      this.roots,\n      this.nocase,\n      this.childrenCache(),\n      opts,\n    )\n  }\n}\n\n/**\n * Options that may be provided to the PathScurry constructor\n */\nexport interface PathScurryOpts {\n  /**\n   * perform case-insensitive path matching. Default based on platform\n   * subclass.\n   */\n  nocase?: boolean\n  /**\n   * Number of Path entries to keep in the cache of Path child references.\n   *\n   * Setting this higher than 65536 will dramatically increase the data\n   * consumption and construction time overhead of each PathScurry.\n   *\n   * Setting this value to 256 or lower will significantly reduce the data\n   * consumption and construction time overhead, but may also reduce resolve()\n   * and readdir() performance on large filesystems.\n   *\n   * Default `16384`.\n   */\n  childrenCacheSize?: number\n  /**\n   * An object that overrides the built-in functions from the fs and\n   * fs/promises modules.\n   *\n   * See {@link FSOption}\n   */\n  fs?: FSOption\n}\n\n/**\n * The base class for all PathScurry classes, providing the interface for path\n * resolution and filesystem operations.\n *\n * Typically, you should *not* instantiate this class directly, but rather one\n * of the platform-specific classes, or the exported {@link PathScurry} which\n * defaults to the current platform.\n */\nexport abstract class PathScurryBase {\n  /**\n   * The root Path entry for the current working directory of this Scurry\n   */\n  root: PathBase\n  /**\n   * The string path for the root of this Scurry's current working directory\n   */\n  rootPath: string\n  /**\n   * A collection of all roots encountered, referenced by rootPath\n   */\n  roots: { [k: string]: PathBase }\n  /**\n   * The Path entry corresponding to this PathScurry's current working directory.\n   */\n  cwd: PathBase\n  #resolveCache: ResolveCache\n  #resolvePosixCache: ResolveCache\n  #children: ChildrenCache\n  /**\n   * Perform path comparisons case-insensitively.\n   *\n   * Defaults true on Darwin and Windows systems, false elsewhere.\n   */\n  nocase: boolean\n\n  /**\n   * The path separator used for parsing paths\n   *\n   * `'/'` on Posix systems, either `'/'` or `'\\\\'` on Windows\n   */\n  abstract sep: string | RegExp\n\n  #fs: FSValue\n\n  /**\n   * This class should not be instantiated directly.\n   *\n   * Use PathScurryWin32, PathScurryDarwin, PathScurryPosix, or PathScurry\n   *\n   * @internal\n   */\n  constructor(\n    cwd: URL | string = process.cwd(),\n    pathImpl: typeof win32 | typeof posix,\n    sep: string | RegExp,\n    {\n      nocase,\n      childrenCacheSize = 16 * 1024,\n      fs = defaultFS,\n    }: PathScurryOpts = {},\n  ) {\n    this.#fs = fsFromOption(fs)\n    if (cwd instanceof URL || cwd.startsWith('file://')) {\n      cwd = fileURLToPath(cwd)\n    }\n    // resolve and split root, and then add to the store.\n    // this is the only time we call path.resolve()\n    const cwdPath = pathImpl.resolve(cwd)\n    this.roots = Object.create(null)\n    this.rootPath = this.parseRootPath(cwdPath)\n    this.#resolveCache = new ResolveCache()\n    this.#resolvePosixCache = new ResolveCache()\n    this.#children = new ChildrenCache(childrenCacheSize)\n\n    const split = cwdPath.substring(this.rootPath.length).split(sep)\n    // resolve('/') leaves '', splits to [''], we don't want that.\n    if (split.length === 1 && !split[0]) {\n      split.pop()\n    }\n    /* c8 ignore start */\n    if (nocase === undefined) {\n      throw new TypeError(\n        'must provide nocase setting to PathScurryBase ctor',\n      )\n    }\n    /* c8 ignore stop */\n    this.nocase = nocase\n    this.root = this.newRoot(this.#fs)\n    this.roots[this.rootPath] = this.root\n    let prev: PathBase = this.root\n    let len = split.length - 1\n    const joinSep = pathImpl.sep\n    let abs = this.rootPath\n    let sawFirst = false\n    for (const part of split) {\n      const l = len--\n      prev = prev.child(part, {\n        relative: new Array(l).fill('..').join(joinSep),\n        relativePosix: new Array(l).fill('..').join('/'),\n        fullpath: (abs += (sawFirst ? '' : joinSep) + part),\n      })\n      sawFirst = true\n    }\n    this.cwd = prev\n  }\n\n  /**\n   * Get the depth of a provided path, string, or the cwd\n   */\n  depth(path: Path | string = this.cwd): number {\n    if (typeof path === 'string') {\n      path = this.cwd.resolve(path)\n    }\n    return path.depth()\n  }\n\n  /**\n   * Parse the root portion of a path string\n   *\n   * @internal\n   */\n  abstract parseRootPath(dir: string): string\n  /**\n   * create a new Path to use as root during construction.\n   *\n   * @internal\n   */\n  abstract newRoot(fs: FSValue): PathBase\n  /**\n   * Determine whether a given path string is absolute\n   */\n  abstract isAbsolute(p: string): boolean\n\n  /**\n   * Return the cache of child entries.  Exposed so subclasses can create\n   * child Path objects in a platform-specific way.\n   *\n   * @internal\n   */\n  childrenCache() {\n    return this.#children\n  }\n\n  /**\n   * Resolve one or more path strings to a resolved string\n   *\n   * Same interface as require('path').resolve.\n   *\n   * Much faster than path.resolve() when called multiple times for the same\n   * path, because the resolved Path objects are cached.  Much slower\n   * otherwise.\n   */\n  resolve(...paths: string[]): string {\n    // first figure out the minimum number of paths we have to test\n    // we always start at cwd, but any absolutes will bump the start\n    let r = ''\n    for (let i = paths.length - 1; i >= 0; i--) {\n      const p = paths[i]\n      if (!p || p === '.') continue\n      r = r ? `${p}/${r}` : p\n      if (this.isAbsolute(p)) {\n        break\n      }\n    }\n    const cached = this.#resolveCache.get(r)\n    if (cached !== undefined) {\n      return cached\n    }\n    const result = this.cwd.resolve(r).fullpath()\n    this.#resolveCache.set(r, result)\n    return result\n  }\n\n  /**\n   * Resolve one or more path strings to a resolved string, returning\n   * the posix path.  Identical to .resolve() on posix systems, but on\n   * windows will return a forward-slash separated UNC path.\n   *\n   * Same interface as require('path').resolve.\n   *\n   * Much faster than path.resolve() when called multiple times for the same\n   * path, because the resolved Path objects are cached.  Much slower\n   * otherwise.\n   */\n  resolvePosix(...paths: string[]): string {\n    // first figure out the minimum number of paths we have to test\n    // we always start at cwd, but any absolutes will bump the start\n    let r = ''\n    for (let i = paths.length - 1; i >= 0; i--) {\n      const p = paths[i]\n      if (!p || p === '.') continue\n      r = r ? `${p}/${r}` : p\n      if (this.isAbsolute(p)) {\n        break\n      }\n    }\n    const cached = this.#resolvePosixCache.get(r)\n    if (cached !== undefined) {\n      return cached\n    }\n    const result = this.cwd.resolve(r).fullpathPosix()\n    this.#resolvePosixCache.set(r, result)\n    return result\n  }\n\n  /**\n   * find the relative path from the cwd to the supplied path string or entry\n   */\n  relative(entry: PathBase | string = this.cwd): string {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    }\n    return entry.relative()\n  }\n\n  /**\n   * find the relative path from the cwd to the supplied path string or\n   * entry, using / as the path delimiter, even on Windows.\n   */\n  relativePosix(entry: PathBase | string = this.cwd): string {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    }\n    return entry.relativePosix()\n  }\n\n  /**\n   * Return the basename for the provided string or Path object\n   */\n  basename(entry: PathBase | string = this.cwd): string {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    }\n    return entry.name\n  }\n\n  /**\n   * Return the dirname for the provided string or Path object\n   */\n  dirname(entry: PathBase | string = this.cwd): string {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    }\n    return (entry.parent || entry).fullpath()\n  }\n\n  /**\n   * Return an array of known child entries.\n   *\n   * First argument may be either a string, or a Path object.\n   *\n   * If the Path cannot or does not contain any children, then an empty array\n   * is returned.\n   *\n   * Results are cached, and thus may be out of date if the filesystem is\n   * mutated.\n   *\n   * Unlike `fs.readdir()`, the `withFileTypes` option defaults to `true`. Set\n   * `{ withFileTypes: false }` to return strings.\n   */\n\n  readdir(): Promise\n  readdir(opts: { withFileTypes: true }): Promise\n  readdir(opts: { withFileTypes: false }): Promise\n  readdir(opts: { withFileTypes: boolean }): Promise\n  readdir(entry: PathBase | string): Promise\n  readdir(\n    entry: PathBase | string,\n    opts: { withFileTypes: true },\n  ): Promise\n  readdir(\n    entry: PathBase | string,\n    opts: { withFileTypes: false },\n  ): Promise\n  readdir(\n    entry: PathBase | string,\n    opts: { withFileTypes: boolean },\n  ): Promise\n  async readdir(\n    entry: PathBase | string | { withFileTypes: boolean } = this.cwd,\n    opts: { withFileTypes: boolean } = {\n      withFileTypes: true,\n    },\n  ): Promise {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    } else if (!(entry instanceof PathBase)) {\n      opts = entry\n      entry = this.cwd\n    }\n    const { withFileTypes } = opts\n    if (!entry.canReaddir()) {\n      return []\n    } else {\n      const p = await entry.readdir()\n      return withFileTypes ? p : p.map(e => e.name)\n    }\n  }\n\n  /**\n   * synchronous {@link PathScurryBase.readdir}\n   */\n  readdirSync(): PathBase[]\n  readdirSync(opts: { withFileTypes: true }): PathBase[]\n  readdirSync(opts: { withFileTypes: false }): string[]\n  readdirSync(opts: { withFileTypes: boolean }): PathBase[] | string[]\n  readdirSync(entry: PathBase | string): PathBase[]\n  readdirSync(\n    entry: PathBase | string,\n    opts: { withFileTypes: true },\n  ): PathBase[]\n  readdirSync(\n    entry: PathBase | string,\n    opts: { withFileTypes: false },\n  ): string[]\n  readdirSync(\n    entry: PathBase | string,\n    opts: { withFileTypes: boolean },\n  ): PathBase[] | string[]\n  readdirSync(\n    entry: PathBase | string | { withFileTypes: boolean } = this.cwd,\n    opts: { withFileTypes: boolean } = {\n      withFileTypes: true,\n    },\n  ): PathBase[] | string[] {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    } else if (!(entry instanceof PathBase)) {\n      opts = entry\n      entry = this.cwd\n    }\n    const { withFileTypes = true } = opts\n    if (!entry.canReaddir()) {\n      return []\n    } else if (withFileTypes) {\n      return entry.readdirSync()\n    } else {\n      return entry.readdirSync().map(e => e.name)\n    }\n  }\n\n  /**\n   * Call lstat() on the string or Path object, and update all known\n   * information that can be determined.\n   *\n   * Note that unlike `fs.lstat()`, the returned value does not contain some\n   * information, such as `mode`, `dev`, `nlink`, and `ino`.  If that\n   * information is required, you will need to call `fs.lstat` yourself.\n   *\n   * If the Path refers to a nonexistent file, or if the lstat call fails for\n   * any reason, `undefined` is returned.  Otherwise the updated Path object is\n   * returned.\n   *\n   * Results are cached, and thus may be out of date if the filesystem is\n   * mutated.\n   */\n  async lstat(\n    entry: string | PathBase = this.cwd,\n  ): Promise {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    }\n    return entry.lstat()\n  }\n\n  /**\n   * synchronous {@link PathScurryBase.lstat}\n   */\n  lstatSync(entry: string | PathBase = this.cwd): PathBase | undefined {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    }\n    return entry.lstatSync()\n  }\n\n  /**\n   * Return the Path object or string path corresponding to the target of a\n   * symbolic link.\n   *\n   * If the path is not a symbolic link, or if the readlink call fails for any\n   * reason, `undefined` is returned.\n   *\n   * Result is cached, and thus may be outdated if the filesystem is mutated.\n   *\n   * `{withFileTypes}` option defaults to `false`.\n   *\n   * On success, returns a Path object if `withFileTypes` option is true,\n   * otherwise a string.\n   */\n  readlink(): Promise\n  readlink(opt: { withFileTypes: false }): Promise\n  readlink(opt: { withFileTypes: true }): Promise\n  readlink(opt: {\n    withFileTypes: boolean\n  }): Promise\n  readlink(\n    entry: string | PathBase,\n    opt?: { withFileTypes: false },\n  ): Promise\n  readlink(\n    entry: string | PathBase,\n    opt: { withFileTypes: true },\n  ): Promise\n  readlink(\n    entry: string | PathBase,\n    opt: { withFileTypes: boolean },\n  ): Promise\n  async readlink(\n    entry: string | PathBase | { withFileTypes: boolean } = this.cwd,\n    { withFileTypes }: { withFileTypes: boolean } = {\n      withFileTypes: false,\n    },\n  ): Promise {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    } else if (!(entry instanceof PathBase)) {\n      withFileTypes = entry.withFileTypes\n      entry = this.cwd\n    }\n    const e = await entry.readlink()\n    return withFileTypes ? e : e?.fullpath()\n  }\n\n  /**\n   * synchronous {@link PathScurryBase.readlink}\n   */\n  readlinkSync(): string | undefined\n  readlinkSync(opt: { withFileTypes: false }): string | undefined\n  readlinkSync(opt: { withFileTypes: true }): PathBase | undefined\n  readlinkSync(opt: {\n    withFileTypes: boolean\n  }): PathBase | string | undefined\n  readlinkSync(\n    entry: string | PathBase,\n    opt?: { withFileTypes: false },\n  ): string | undefined\n  readlinkSync(\n    entry: string | PathBase,\n    opt: { withFileTypes: true },\n  ): PathBase | undefined\n  readlinkSync(\n    entry: string | PathBase,\n    opt: { withFileTypes: boolean },\n  ): string | PathBase | undefined\n  readlinkSync(\n    entry: string | PathBase | { withFileTypes: boolean } = this.cwd,\n    { withFileTypes }: { withFileTypes: boolean } = {\n      withFileTypes: false,\n    },\n  ): string | PathBase | undefined {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    } else if (!(entry instanceof PathBase)) {\n      withFileTypes = entry.withFileTypes\n      entry = this.cwd\n    }\n    const e = entry.readlinkSync()\n    return withFileTypes ? e : e?.fullpath()\n  }\n\n  /**\n   * Return the Path object or string path corresponding to path as resolved\n   * by realpath(3).\n   *\n   * If the realpath call fails for any reason, `undefined` is returned.\n   *\n   * Result is cached, and thus may be outdated if the filesystem is mutated.\n   *\n   * `{withFileTypes}` option defaults to `false`.\n   *\n   * On success, returns a Path object if `withFileTypes` option is true,\n   * otherwise a string.\n   */\n  realpath(): Promise\n  realpath(opt: { withFileTypes: false }): Promise\n  realpath(opt: { withFileTypes: true }): Promise\n  realpath(opt: {\n    withFileTypes: boolean\n  }): Promise\n  realpath(\n    entry: string | PathBase,\n    opt?: { withFileTypes: false },\n  ): Promise\n  realpath(\n    entry: string | PathBase,\n    opt: { withFileTypes: true },\n  ): Promise\n  realpath(\n    entry: string | PathBase,\n    opt: { withFileTypes: boolean },\n  ): Promise\n  async realpath(\n    entry: string | PathBase | { withFileTypes: boolean } = this.cwd,\n    { withFileTypes }: { withFileTypes: boolean } = {\n      withFileTypes: false,\n    },\n  ): Promise {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    } else if (!(entry instanceof PathBase)) {\n      withFileTypes = entry.withFileTypes\n      entry = this.cwd\n    }\n    const e = await entry.realpath()\n    return withFileTypes ? e : e?.fullpath()\n  }\n\n  realpathSync(): string | undefined\n  realpathSync(opt: { withFileTypes: false }): string | undefined\n  realpathSync(opt: { withFileTypes: true }): PathBase | undefined\n  realpathSync(opt: {\n    withFileTypes: boolean\n  }): PathBase | string | undefined\n  realpathSync(\n    entry: string | PathBase,\n    opt?: { withFileTypes: false },\n  ): string | undefined\n  realpathSync(\n    entry: string | PathBase,\n    opt: { withFileTypes: true },\n  ): PathBase | undefined\n  realpathSync(\n    entry: string | PathBase,\n    opt: { withFileTypes: boolean },\n  ): string | PathBase | undefined\n  realpathSync(\n    entry: string | PathBase | { withFileTypes: boolean } = this.cwd,\n    { withFileTypes }: { withFileTypes: boolean } = {\n      withFileTypes: false,\n    },\n  ): string | PathBase | undefined {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    } else if (!(entry instanceof PathBase)) {\n      withFileTypes = entry.withFileTypes\n      entry = this.cwd\n    }\n    const e = entry.realpathSync()\n    return withFileTypes ? e : e?.fullpath()\n  }\n\n  /**\n   * Asynchronously walk the directory tree, returning an array of\n   * all path strings or Path objects found.\n   *\n   * Note that this will be extremely memory-hungry on large filesystems.\n   * In such cases, it may be better to use the stream or async iterator\n   * walk implementation.\n   */\n  walk(): Promise\n  walk(\n    opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n  ): Promise\n  walk(opts: WalkOptionsWithFileTypesFalse): Promise\n  walk(opts: WalkOptions): Promise\n  walk(entry: string | PathBase): Promise\n  walk(\n    entry: string | PathBase,\n    opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n  ): Promise\n  walk(\n    entry: string | PathBase,\n    opts: WalkOptionsWithFileTypesFalse,\n  ): Promise\n  walk(\n    entry: string | PathBase,\n    opts: WalkOptions,\n  ): Promise\n  async walk(\n    entry: string | PathBase | WalkOptions = this.cwd,\n    opts: WalkOptions = {},\n  ): Promise {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    } else if (!(entry instanceof PathBase)) {\n      opts = entry\n      entry = this.cwd\n    }\n    const {\n      withFileTypes = true,\n      follow = false,\n      filter,\n      walkFilter,\n    } = opts\n    const results: (string | PathBase)[] = []\n    if (!filter || filter(entry)) {\n      results.push(withFileTypes ? entry : entry.fullpath())\n    }\n    const dirs = new Set()\n    const walk = (\n      dir: PathBase,\n      cb: (er?: NodeJS.ErrnoException) => void,\n    ) => {\n      dirs.add(dir)\n      dir.readdirCB((er, entries) => {\n        /* c8 ignore start */\n        if (er) {\n          return cb(er)\n        }\n        /* c8 ignore stop */\n        let len = entries.length\n        if (!len) return cb()\n        const next = () => {\n          if (--len === 0) {\n            cb()\n          }\n        }\n        for (const e of entries) {\n          if (!filter || filter(e)) {\n            results.push(withFileTypes ? e : e.fullpath())\n          }\n          if (follow && e.isSymbolicLink()) {\n            e.realpath()\n              .then(r => (r?.isUnknown() ? r.lstat() : r))\n              .then(r =>\n                r?.shouldWalk(dirs, walkFilter) ? walk(r, next) : next(),\n              )\n          } else {\n            if (e.shouldWalk(dirs, walkFilter)) {\n              walk(e, next)\n            } else {\n              next()\n            }\n          }\n        }\n      }, true) // zalgooooooo\n    }\n\n    const start = entry\n    return new Promise((res, rej) => {\n      walk(start, er => {\n        /* c8 ignore start */\n        if (er) return rej(er)\n        /* c8 ignore stop */\n        res(results as PathBase[] | string[])\n      })\n    })\n  }\n\n  /**\n   * Synchronously walk the directory tree, returning an array of\n   * all path strings or Path objects found.\n   *\n   * Note that this will be extremely memory-hungry on large filesystems.\n   * In such cases, it may be better to use the stream or async iterator\n   * walk implementation.\n   */\n  walkSync(): PathBase[]\n  walkSync(\n    opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n  ): PathBase[]\n  walkSync(opts: WalkOptionsWithFileTypesFalse): string[]\n  walkSync(opts: WalkOptions): string[] | PathBase[]\n  walkSync(entry: string | PathBase): PathBase[]\n  walkSync(\n    entry: string | PathBase,\n    opts: WalkOptionsWithFileTypesUnset | WalkOptionsWithFileTypesTrue,\n  ): PathBase[]\n  walkSync(\n    entry: string | PathBase,\n    opts: WalkOptionsWithFileTypesFalse,\n  ): string[]\n  walkSync(\n    entry: string | PathBase,\n    opts: WalkOptions,\n  ): PathBase[] | string[]\n  walkSync(\n    entry: string | PathBase | WalkOptions = this.cwd,\n    opts: WalkOptions = {},\n  ): PathBase[] | string[] {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    } else if (!(entry instanceof PathBase)) {\n      opts = entry\n      entry = this.cwd\n    }\n    const {\n      withFileTypes = true,\n      follow = false,\n      filter,\n      walkFilter,\n    } = opts\n    const results: (string | PathBase)[] = []\n    if (!filter || filter(entry)) {\n      results.push(withFileTypes ? entry : entry.fullpath())\n    }\n    const dirs = new Set([entry])\n    for (const dir of dirs) {\n      const entries = dir.readdirSync()\n      for (const e of entries) {\n        if (!filter || filter(e)) {\n          results.push(withFileTypes ? e : e.fullpath())\n        }\n        let r: PathBase | undefined = e\n        if (e.isSymbolicLink()) {\n          if (!(follow && (r = e.realpathSync()))) continue\n          if (r.isUnknown()) r.lstatSync()\n        }\n        if (r.shouldWalk(dirs, walkFilter)) {\n          dirs.add(r)\n        }\n      }\n    }\n    return results as string[] | PathBase[]\n  }\n\n  /**\n   * Support for `for await`\n   *\n   * Alias for {@link PathScurryBase.iterate}\n   *\n   * Note: As of Node 19, this is very slow, compared to other methods of\n   * walking.  Consider using {@link PathScurryBase.stream} if memory overhead\n   * and backpressure are concerns, or {@link PathScurryBase.walk} if not.\n   */\n  [Symbol.asyncIterator]() {\n    return this.iterate()\n  }\n\n  /**\n   * Async generator form of {@link PathScurryBase.walk}\n   *\n   * Note: As of Node 19, this is very slow, compared to other methods of\n   * walking, especially if most/all of the directory tree has been previously\n   * walked.  Consider using {@link PathScurryBase.stream} if memory overhead\n   * and backpressure are concerns, or {@link PathScurryBase.walk} if not.\n   */\n  iterate(): AsyncGenerator\n  iterate(\n    opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n  ): AsyncGenerator\n  iterate(\n    opts: WalkOptionsWithFileTypesFalse,\n  ): AsyncGenerator\n  iterate(opts: WalkOptions): AsyncGenerator\n  iterate(entry: string | PathBase): AsyncGenerator\n  iterate(\n    entry: string | PathBase,\n    opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n  ): AsyncGenerator\n  iterate(\n    entry: string | PathBase,\n    opts: WalkOptionsWithFileTypesFalse,\n  ): AsyncGenerator\n  iterate(\n    entry: string | PathBase,\n    opts: WalkOptions,\n  ): AsyncGenerator\n  iterate(\n    entry: string | PathBase | WalkOptions = this.cwd,\n    options: WalkOptions = {},\n  ): AsyncGenerator {\n    // iterating async over the stream is significantly more performant,\n    // especially in the warm-cache scenario, because it buffers up directory\n    // entries in the background instead of waiting for a yield for each one.\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    } else if (!(entry instanceof PathBase)) {\n      options = entry\n      entry = this.cwd\n    }\n    return this.stream(entry, options)[Symbol.asyncIterator]()\n  }\n\n  /**\n   * Iterating over a PathScurry performs a synchronous walk.\n   *\n   * Alias for {@link PathScurryBase.iterateSync}\n   */\n  [Symbol.iterator]() {\n    return this.iterateSync()\n  }\n\n  iterateSync(): Generator\n  iterateSync(\n    opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n  ): Generator\n  iterateSync(\n    opts: WalkOptionsWithFileTypesFalse,\n  ): Generator\n  iterateSync(opts: WalkOptions): Generator\n  iterateSync(entry: string | PathBase): Generator\n  iterateSync(\n    entry: string | PathBase,\n    opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n  ): Generator\n  iterateSync(\n    entry: string | PathBase,\n    opts: WalkOptionsWithFileTypesFalse,\n  ): Generator\n  iterateSync(\n    entry: string | PathBase,\n    opts: WalkOptions,\n  ): Generator\n  *iterateSync(\n    entry: string | PathBase | WalkOptions = this.cwd,\n    opts: WalkOptions = {},\n  ): Generator {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    } else if (!(entry instanceof PathBase)) {\n      opts = entry\n      entry = this.cwd\n    }\n    const {\n      withFileTypes = true,\n      follow = false,\n      filter,\n      walkFilter,\n    } = opts\n    if (!filter || filter(entry)) {\n      yield withFileTypes ? entry : entry.fullpath()\n    }\n    const dirs = new Set([entry])\n    for (const dir of dirs) {\n      const entries = dir.readdirSync()\n      for (const e of entries) {\n        if (!filter || filter(e)) {\n          yield withFileTypes ? e : e.fullpath()\n        }\n        let r: PathBase | undefined = e\n        if (e.isSymbolicLink()) {\n          if (!(follow && (r = e.realpathSync()))) continue\n          if (r.isUnknown()) r.lstatSync()\n        }\n        if (r.shouldWalk(dirs, walkFilter)) {\n          dirs.add(r)\n        }\n      }\n    }\n  }\n\n  /**\n   * Stream form of {@link PathScurryBase.walk}\n   *\n   * Returns a Minipass stream that emits {@link PathBase} objects by default,\n   * or strings if `{ withFileTypes: false }` is set in the options.\n   */\n  stream(): Minipass\n  stream(\n    opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n  ): Minipass\n  stream(opts: WalkOptionsWithFileTypesFalse): Minipass\n  stream(opts: WalkOptions): Minipass\n  stream(entry: string | PathBase): Minipass\n  stream(\n    entry: string | PathBase,\n    opts: WalkOptionsWithFileTypesUnset | WalkOptionsWithFileTypesTrue,\n  ): Minipass\n  stream(\n    entry: string | PathBase,\n    opts: WalkOptionsWithFileTypesFalse,\n  ): Minipass\n  stream(\n    entry: string | PathBase,\n    opts: WalkOptions,\n  ): Minipass | Minipass\n  stream(\n    entry: string | PathBase | WalkOptions = this.cwd,\n    opts: WalkOptions = {},\n  ): Minipass | Minipass {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    } else if (!(entry instanceof PathBase)) {\n      opts = entry\n      entry = this.cwd\n    }\n    const {\n      withFileTypes = true,\n      follow = false,\n      filter,\n      walkFilter,\n    } = opts\n    const results = new Minipass({ objectMode: true })\n    if (!filter || filter(entry)) {\n      results.write(withFileTypes ? entry : entry.fullpath())\n    }\n    const dirs = new Set()\n    const queue: PathBase[] = [entry]\n    let processing = 0\n    const process = () => {\n      let paused = false\n      while (!paused) {\n        const dir = queue.shift()\n        if (!dir) {\n          if (processing === 0) results.end()\n          return\n        }\n\n        processing++\n        dirs.add(dir)\n\n        const onReaddir = (\n          er: null | NodeJS.ErrnoException,\n          entries: PathBase[],\n          didRealpaths: boolean = false,\n        ) => {\n          /* c8 ignore start */\n          if (er) return results.emit('error', er)\n          /* c8 ignore stop */\n          if (follow && !didRealpaths) {\n            const promises: Promise[] = []\n            for (const e of entries) {\n              if (e.isSymbolicLink()) {\n                promises.push(\n                  e\n                    .realpath()\n                    .then((r: PathBase | undefined) =>\n                      r?.isUnknown() ? r.lstat() : r,\n                    ),\n                )\n              }\n            }\n            if (promises.length) {\n              Promise.all(promises).then(() =>\n                onReaddir(null, entries, true),\n              )\n              return\n            }\n          }\n\n          for (const e of entries) {\n            if (e && (!filter || filter(e))) {\n              if (!results.write(withFileTypes ? e : e.fullpath())) {\n                paused = true\n              }\n            }\n          }\n\n          processing--\n          for (const e of entries) {\n            const r = e.realpathCached() || e\n            if (r.shouldWalk(dirs, walkFilter)) {\n              queue.push(r)\n            }\n          }\n          if (paused && !results.flowing) {\n            results.once('drain', process)\n          } else if (!sync) {\n            process()\n          }\n        }\n\n        // zalgo containment\n        let sync = true\n        dir.readdirCB(onReaddir, true)\n        sync = false\n      }\n    }\n    process()\n    return results as Minipass | Minipass\n  }\n\n  /**\n   * Synchronous form of {@link PathScurryBase.stream}\n   *\n   * Returns a Minipass stream that emits {@link PathBase} objects by default,\n   * or strings if `{ withFileTypes: false }` is set in the options.\n   *\n   * Will complete the walk in a single tick if the stream is consumed fully.\n   * Otherwise, will pause as needed for stream backpressure.\n   */\n  streamSync(): Minipass\n  streamSync(\n    opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n  ): Minipass\n  streamSync(opts: WalkOptionsWithFileTypesFalse): Minipass\n  streamSync(opts: WalkOptions): Minipass\n  streamSync(entry: string | PathBase): Minipass\n  streamSync(\n    entry: string | PathBase,\n    opts: WalkOptionsWithFileTypesUnset | WalkOptionsWithFileTypesTrue,\n  ): Minipass\n  streamSync(\n    entry: string | PathBase,\n    opts: WalkOptionsWithFileTypesFalse,\n  ): Minipass\n  streamSync(\n    entry: string | PathBase,\n    opts: WalkOptions,\n  ): Minipass | Minipass\n  streamSync(\n    entry: string | PathBase | WalkOptions = this.cwd,\n    opts: WalkOptions = {},\n  ): Minipass | Minipass {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    } else if (!(entry instanceof PathBase)) {\n      opts = entry\n      entry = this.cwd\n    }\n    const {\n      withFileTypes = true,\n      follow = false,\n      filter,\n      walkFilter,\n    } = opts\n    const results = new Minipass({ objectMode: true })\n    const dirs = new Set()\n    if (!filter || filter(entry)) {\n      results.write(withFileTypes ? entry : entry.fullpath())\n    }\n    const queue: PathBase[] = [entry]\n    let processing = 0\n    const process = () => {\n      let paused = false\n      while (!paused) {\n        const dir = queue.shift()\n        if (!dir) {\n          if (processing === 0) results.end()\n          return\n        }\n        processing++\n        dirs.add(dir)\n\n        const entries = dir.readdirSync()\n        for (const e of entries) {\n          if (!filter || filter(e)) {\n            if (!results.write(withFileTypes ? e : e.fullpath())) {\n              paused = true\n            }\n          }\n        }\n        processing--\n        for (const e of entries) {\n          let r: PathBase | undefined = e\n          if (e.isSymbolicLink()) {\n            if (!(follow && (r = e.realpathSync()))) continue\n            if (r.isUnknown()) r.lstatSync()\n          }\n          if (r.shouldWalk(dirs, walkFilter)) {\n            queue.push(r)\n          }\n        }\n      }\n      if (paused && !results.flowing) results.once('drain', process)\n    }\n    process()\n    return results as Minipass | Minipass\n  }\n\n  chdir(path: string | Path = this.cwd) {\n    const oldCwd = this.cwd\n    this.cwd = typeof path === 'string' ? this.cwd.resolve(path) : path\n    this.cwd[setAsCwd](oldCwd)\n  }\n}\n\n/**\n * Options provided to all walk methods.\n */\nexport interface WalkOptions {\n  /**\n   * Return results as {@link PathBase} objects rather than strings.\n   * When set to false, results are fully resolved paths, as returned by\n   * {@link PathBase.fullpath}.\n   * @default true\n   */\n  withFileTypes?: boolean\n\n  /**\n   *  Attempt to read directory entries from symbolic links. Otherwise, only\n   *  actual directories are traversed. Regardless of this setting, a given\n   *  target path will only ever be walked once, meaning that a symbolic link\n   *  to a previously traversed directory will never be followed.\n   *\n   *  Setting this imposes a slight performance penalty, because `readlink`\n   *  must be called on all symbolic links encountered, in order to avoid\n   *  infinite cycles.\n   * @default false\n   */\n  follow?: boolean\n\n  /**\n   * Only return entries where the provided function returns true.\n   *\n   * This will not prevent directories from being traversed, even if they do\n   * not pass the filter, though it will prevent directories themselves from\n   * being included in the result set.  See {@link walkFilter}\n   *\n   * Asynchronous functions are not supported here.\n   *\n   * By default, if no filter is provided, all entries and traversed\n   * directories are included.\n   */\n  filter?: (entry: PathBase) => boolean\n\n  /**\n   * Only traverse directories (and in the case of {@link follow} being set to\n   * true, symbolic links to directories) if the provided function returns\n   * true.\n   *\n   * This will not prevent directories from being included in the result set,\n   * even if they do not pass the supplied filter function.  See {@link filter}\n   * to do that.\n   *\n   * Asynchronous functions are not supported here.\n   */\n  walkFilter?: (entry: PathBase) => boolean\n}\n\nexport type WalkOptionsWithFileTypesUnset = WalkOptions & {\n  withFileTypes?: undefined\n}\nexport type WalkOptionsWithFileTypesTrue = WalkOptions & {\n  withFileTypes: true\n}\nexport type WalkOptionsWithFileTypesFalse = WalkOptions & {\n  withFileTypes: false\n}\n\n/**\n * Windows implementation of {@link PathScurryBase}\n *\n * Defaults to case insensitve, uses `'\\\\'` to generate path strings.  Uses\n * {@link PathWin32} for Path objects.\n */\nexport class PathScurryWin32 extends PathScurryBase {\n  /**\n   * separator for generating path strings\n   */\n  sep: '\\\\' = '\\\\'\n\n  constructor(\n    cwd: URL | string = process.cwd(),\n    opts: PathScurryOpts = {},\n  ) {\n    const { nocase = true } = opts\n    super(cwd, win32, '\\\\', { ...opts, nocase })\n    this.nocase = nocase\n    for (let p: PathBase | undefined = this.cwd; p; p = p.parent) {\n      p.nocase = this.nocase\n    }\n  }\n\n  /**\n   * @internal\n   */\n  parseRootPath(dir: string): string {\n    // if the path starts with a single separator, it's not a UNC, and we'll\n    // just get separator as the root, and driveFromUNC will return \\\n    // In that case, mount \\ on the root from the cwd.\n    return win32.parse(dir).root.toUpperCase()\n  }\n\n  /**\n   * @internal\n   */\n  newRoot(fs: FSValue) {\n    return new PathWin32(\n      this.rootPath,\n      IFDIR,\n      undefined,\n      this.roots,\n      this.nocase,\n      this.childrenCache(),\n      { fs },\n    )\n  }\n\n  /**\n   * Return true if the provided path string is an absolute path\n   */\n  isAbsolute(p: string): boolean {\n    return (\n      p.startsWith('/') || p.startsWith('\\\\') || /^[a-z]:(\\/|\\\\)/i.test(p)\n    )\n  }\n}\n\n/**\n * {@link PathScurryBase} implementation for all posix systems other than Darwin.\n *\n * Defaults to case-sensitive matching, uses `'/'` to generate path strings.\n *\n * Uses {@link PathPosix} for Path objects.\n */\nexport class PathScurryPosix extends PathScurryBase {\n  /**\n   * separator for generating path strings\n   */\n  sep: '/' = '/'\n  constructor(\n    cwd: URL | string = process.cwd(),\n    opts: PathScurryOpts = {},\n  ) {\n    const { nocase = false } = opts\n    super(cwd, posix, '/', { ...opts, nocase })\n    this.nocase = nocase\n  }\n\n  /**\n   * @internal\n   */\n  parseRootPath(_dir: string): string {\n    return '/'\n  }\n\n  /**\n   * @internal\n   */\n  newRoot(fs: FSValue) {\n    return new PathPosix(\n      this.rootPath,\n      IFDIR,\n      undefined,\n      this.roots,\n      this.nocase,\n      this.childrenCache(),\n      { fs },\n    )\n  }\n\n  /**\n   * Return true if the provided path string is an absolute path\n   */\n  isAbsolute(p: string): boolean {\n    return p.startsWith('/')\n  }\n}\n\n/**\n * {@link PathScurryBase} implementation for Darwin (macOS) systems.\n *\n * Defaults to case-insensitive matching, uses `'/'` for generating path\n * strings.\n *\n * Uses {@link PathPosix} for Path objects.\n */\nexport class PathScurryDarwin extends PathScurryPosix {\n  constructor(\n    cwd: URL | string = process.cwd(),\n    opts: PathScurryOpts = {},\n  ) {\n    const { nocase = true } = opts\n    super(cwd, { ...opts, nocase })\n  }\n}\n\n/**\n * Default {@link PathBase} implementation for the current platform.\n *\n * {@link PathWin32} on Windows systems, {@link PathPosix} on all others.\n */\nexport const Path = process.platform === 'win32' ? PathWin32 : PathPosix\nexport type Path = PathBase | InstanceType\n\n/**\n * Default {@link PathScurryBase} implementation for the current platform.\n *\n * {@link PathScurryWin32} on Windows systems, {@link PathScurryDarwin} on\n * Darwin (macOS) systems, {@link PathScurryPosix} on all others.\n */\nexport const PathScurry:\n  | typeof PathScurryWin32\n  | typeof PathScurryDarwin\n  | typeof PathScurryPosix =\n  process.platform === 'win32' ? PathScurryWin32\n  : process.platform === 'darwin' ? PathScurryDarwin\n  : PathScurryPosix\nexport type PathScurry = PathScurryBase | InstanceType\n"]}
      \ No newline at end of file
      diff --git a/node_modules/path-scurry/dist/commonjs/package.json b/node_modules/path-scurry/dist/commonjs/package.json
      new file mode 100644
      index 00000000..5bbefffb
      --- /dev/null
      +++ b/node_modules/path-scurry/dist/commonjs/package.json
      @@ -0,0 +1,3 @@
      +{
      +  "type": "commonjs"
      +}
      diff --git a/node_modules/path-scurry/dist/esm/index.d.ts b/node_modules/path-scurry/dist/esm/index.d.ts
      new file mode 100644
      index 00000000..ef31b1b7
      --- /dev/null
      +++ b/node_modules/path-scurry/dist/esm/index.d.ts
      @@ -0,0 +1,1115 @@
      +import { LRUCache } from 'lru-cache';
      +import { posix, win32 } from 'node:path';
      +import { Minipass } from 'minipass';
      +import type { Dirent, Stats } from 'node:fs';
      +/**
      + * An object that will be used to override the default `fs`
      + * methods.  Any methods that are not overridden will use Node's
      + * built-in implementations.
      + *
      + * - lstatSync
      + * - readdir (callback `withFileTypes` Dirent variant, used for
      + *   readdirCB and most walks)
      + * - readdirSync
      + * - readlinkSync
      + * - realpathSync
      + * - promises: Object containing the following async methods:
      + *   - lstat
      + *   - readdir (Dirent variant only)
      + *   - readlink
      + *   - realpath
      + */
      +export interface FSOption {
      +    lstatSync?: (path: string) => Stats;
      +    readdir?: (path: string, options: {
      +        withFileTypes: true;
      +    }, cb: (er: NodeJS.ErrnoException | null, entries?: Dirent[]) => any) => void;
      +    readdirSync?: (path: string, options: {
      +        withFileTypes: true;
      +    }) => Dirent[];
      +    readlinkSync?: (path: string) => string;
      +    realpathSync?: (path: string) => string;
      +    promises?: {
      +        lstat?: (path: string) => Promise;
      +        readdir?: (path: string, options: {
      +            withFileTypes: true;
      +        }) => Promise;
      +        readlink?: (path: string) => Promise;
      +        realpath?: (path: string) => Promise;
      +        [k: string]: any;
      +    };
      +    [k: string]: any;
      +}
      +interface FSValue {
      +    lstatSync: (path: string) => Stats;
      +    readdir: (path: string, options: {
      +        withFileTypes: true;
      +    }, cb: (er: NodeJS.ErrnoException | null, entries?: Dirent[]) => any) => void;
      +    readdirSync: (path: string, options: {
      +        withFileTypes: true;
      +    }) => Dirent[];
      +    readlinkSync: (path: string) => string;
      +    realpathSync: (path: string) => string;
      +    promises: {
      +        lstat: (path: string) => Promise;
      +        readdir: (path: string, options: {
      +            withFileTypes: true;
      +        }) => Promise;
      +        readlink: (path: string) => Promise;
      +        realpath: (path: string) => Promise;
      +        [k: string]: any;
      +    };
      +    [k: string]: any;
      +}
      +export type Type = 'Unknown' | 'FIFO' | 'CharacterDevice' | 'Directory' | 'BlockDevice' | 'File' | 'SymbolicLink' | 'Socket';
      +/**
      + * Options that may be provided to the Path constructor
      + */
      +export interface PathOpts {
      +    fullpath?: string;
      +    relative?: string;
      +    relativePosix?: string;
      +    parent?: PathBase;
      +    /**
      +     * See {@link FSOption}
      +     */
      +    fs?: FSOption;
      +}
      +/**
      + * An LRUCache for storing resolved path strings or Path objects.
      + * @internal
      + */
      +export declare class ResolveCache extends LRUCache {
      +    constructor();
      +}
      +/**
      + * an LRUCache for storing child entries.
      + * @internal
      + */
      +export declare class ChildrenCache extends LRUCache {
      +    constructor(maxSize?: number);
      +}
      +/**
      + * Array of Path objects, plus a marker indicating the first provisional entry
      + *
      + * @internal
      + */
      +export type Children = PathBase[] & {
      +    provisional: number;
      +};
      +declare const setAsCwd: unique symbol;
      +/**
      + * Path objects are sort of like a super-powered
      + * {@link https://nodejs.org/docs/latest/api/fs.html#class-fsdirent fs.Dirent}
      + *
      + * Each one represents a single filesystem entry on disk, which may or may not
      + * exist. It includes methods for reading various types of information via
      + * lstat, readlink, and readdir, and caches all information to the greatest
      + * degree possible.
      + *
      + * Note that fs operations that would normally throw will instead return an
      + * "empty" value. This is in order to prevent excessive overhead from error
      + * stack traces.
      + */
      +export declare abstract class PathBase implements Dirent {
      +    #private;
      +    /**
      +     * the basename of this path
      +     *
      +     * **Important**: *always* test the path name against any test string
      +     * usingthe {@link isNamed} method, and not by directly comparing this
      +     * string. Otherwise, unicode path strings that the system sees as identical
      +     * will not be properly treated as the same path, leading to incorrect
      +     * behavior and possible security issues.
      +     */
      +    name: string;
      +    /**
      +     * the Path entry corresponding to the path root.
      +     *
      +     * @internal
      +     */
      +    root: PathBase;
      +    /**
      +     * All roots found within the current PathScurry family
      +     *
      +     * @internal
      +     */
      +    roots: {
      +        [k: string]: PathBase;
      +    };
      +    /**
      +     * a reference to the parent path, or undefined in the case of root entries
      +     *
      +     * @internal
      +     */
      +    parent?: PathBase;
      +    /**
      +     * boolean indicating whether paths are compared case-insensitively
      +     * @internal
      +     */
      +    nocase: boolean;
      +    /**
      +     * boolean indicating that this path is the current working directory
      +     * of the PathScurry collection that contains it.
      +     */
      +    isCWD: boolean;
      +    /**
      +     * the string or regexp used to split paths. On posix, it is `'/'`, and on
      +     * windows it is a RegExp matching either `'/'` or `'\\'`
      +     */
      +    abstract splitSep: string | RegExp;
      +    /**
      +     * The path separator string to use when joining paths
      +     */
      +    abstract sep: string;
      +    get dev(): number | undefined;
      +    get mode(): number | undefined;
      +    get nlink(): number | undefined;
      +    get uid(): number | undefined;
      +    get gid(): number | undefined;
      +    get rdev(): number | undefined;
      +    get blksize(): number | undefined;
      +    get ino(): number | undefined;
      +    get size(): number | undefined;
      +    get blocks(): number | undefined;
      +    get atimeMs(): number | undefined;
      +    get mtimeMs(): number | undefined;
      +    get ctimeMs(): number | undefined;
      +    get birthtimeMs(): number | undefined;
      +    get atime(): Date | undefined;
      +    get mtime(): Date | undefined;
      +    get ctime(): Date | undefined;
      +    get birthtime(): Date | undefined;
      +    /**
      +     * This property is for compatibility with the Dirent class as of
      +     * Node v20, where Dirent['parentPath'] refers to the path of the
      +     * directory that was passed to readdir. For root entries, it's the path
      +     * to the entry itself.
      +     */
      +    get parentPath(): string;
      +    /**
      +     * Deprecated alias for Dirent['parentPath'] Somewhat counterintuitively,
      +     * this property refers to the *parent* path, not the path object itself.
      +     *
      +     * @deprecated
      +     */
      +    get path(): string;
      +    /**
      +     * Do not create new Path objects directly.  They should always be accessed
      +     * via the PathScurry class or other methods on the Path class.
      +     *
      +     * @internal
      +     */
      +    constructor(name: string, type: number | undefined, root: PathBase | undefined, roots: {
      +        [k: string]: PathBase;
      +    }, nocase: boolean, children: ChildrenCache, opts: PathOpts);
      +    /**
      +     * Returns the depth of the Path object from its root.
      +     *
      +     * For example, a path at `/foo/bar` would have a depth of 2.
      +     */
      +    depth(): number;
      +    /**
      +     * @internal
      +     */
      +    abstract getRootString(path: string): string;
      +    /**
      +     * @internal
      +     */
      +    abstract getRoot(rootPath: string): PathBase;
      +    /**
      +     * @internal
      +     */
      +    abstract newChild(name: string, type?: number, opts?: PathOpts): PathBase;
      +    /**
      +     * @internal
      +     */
      +    childrenCache(): ChildrenCache;
      +    /**
      +     * Get the Path object referenced by the string path, resolved from this Path
      +     */
      +    resolve(path?: string): PathBase;
      +    /**
      +     * Returns the cached children Path objects, if still available.  If they
      +     * have fallen out of the cache, then returns an empty array, and resets the
      +     * READDIR_CALLED bit, so that future calls to readdir() will require an fs
      +     * lookup.
      +     *
      +     * @internal
      +     */
      +    children(): Children;
      +    /**
      +     * Resolves a path portion and returns or creates the child Path.
      +     *
      +     * Returns `this` if pathPart is `''` or `'.'`, or `parent` if pathPart is
      +     * `'..'`.
      +     *
      +     * This should not be called directly.  If `pathPart` contains any path
      +     * separators, it will lead to unsafe undefined behavior.
      +     *
      +     * Use `Path.resolve()` instead.
      +     *
      +     * @internal
      +     */
      +    child(pathPart: string, opts?: PathOpts): PathBase;
      +    /**
      +     * The relative path from the cwd. If it does not share an ancestor with
      +     * the cwd, then this ends up being equivalent to the fullpath()
      +     */
      +    relative(): string;
      +    /**
      +     * The relative path from the cwd, using / as the path separator.
      +     * If it does not share an ancestor with
      +     * the cwd, then this ends up being equivalent to the fullpathPosix()
      +     * On posix systems, this is identical to relative().
      +     */
      +    relativePosix(): string;
      +    /**
      +     * The fully resolved path string for this Path entry
      +     */
      +    fullpath(): string;
      +    /**
      +     * On platforms other than windows, this is identical to fullpath.
      +     *
      +     * On windows, this is overridden to return the forward-slash form of the
      +     * full UNC path.
      +     */
      +    fullpathPosix(): string;
      +    /**
      +     * Is the Path of an unknown type?
      +     *
      +     * Note that we might know *something* about it if there has been a previous
      +     * filesystem operation, for example that it does not exist, or is not a
      +     * link, or whether it has child entries.
      +     */
      +    isUnknown(): boolean;
      +    isType(type: Type): boolean;
      +    getType(): Type;
      +    /**
      +     * Is the Path a regular file?
      +     */
      +    isFile(): boolean;
      +    /**
      +     * Is the Path a directory?
      +     */
      +    isDirectory(): boolean;
      +    /**
      +     * Is the path a character device?
      +     */
      +    isCharacterDevice(): boolean;
      +    /**
      +     * Is the path a block device?
      +     */
      +    isBlockDevice(): boolean;
      +    /**
      +     * Is the path a FIFO pipe?
      +     */
      +    isFIFO(): boolean;
      +    /**
      +     * Is the path a socket?
      +     */
      +    isSocket(): boolean;
      +    /**
      +     * Is the path a symbolic link?
      +     */
      +    isSymbolicLink(): boolean;
      +    /**
      +     * Return the entry if it has been subject of a successful lstat, or
      +     * undefined otherwise.
      +     *
      +     * Does not read the filesystem, so an undefined result *could* simply
      +     * mean that we haven't called lstat on it.
      +     */
      +    lstatCached(): PathBase | undefined;
      +    /**
      +     * Return the cached link target if the entry has been the subject of a
      +     * successful readlink, or undefined otherwise.
      +     *
      +     * Does not read the filesystem, so an undefined result *could* just mean we
      +     * don't have any cached data. Only use it if you are very sure that a
      +     * readlink() has been called at some point.
      +     */
      +    readlinkCached(): PathBase | undefined;
      +    /**
      +     * Returns the cached realpath target if the entry has been the subject
      +     * of a successful realpath, or undefined otherwise.
      +     *
      +     * Does not read the filesystem, so an undefined result *could* just mean we
      +     * don't have any cached data. Only use it if you are very sure that a
      +     * realpath() has been called at some point.
      +     */
      +    realpathCached(): PathBase | undefined;
      +    /**
      +     * Returns the cached child Path entries array if the entry has been the
      +     * subject of a successful readdir(), or [] otherwise.
      +     *
      +     * Does not read the filesystem, so an empty array *could* just mean we
      +     * don't have any cached data. Only use it if you are very sure that a
      +     * readdir() has been called recently enough to still be valid.
      +     */
      +    readdirCached(): PathBase[];
      +    /**
      +     * Return true if it's worth trying to readlink.  Ie, we don't (yet) have
      +     * any indication that readlink will definitely fail.
      +     *
      +     * Returns false if the path is known to not be a symlink, if a previous
      +     * readlink failed, or if the entry does not exist.
      +     */
      +    canReadlink(): boolean;
      +    /**
      +     * Return true if readdir has previously been successfully called on this
      +     * path, indicating that cachedReaddir() is likely valid.
      +     */
      +    calledReaddir(): boolean;
      +    /**
      +     * Returns true if the path is known to not exist. That is, a previous lstat
      +     * or readdir failed to verify its existence when that would have been
      +     * expected, or a parent entry was marked either enoent or enotdir.
      +     */
      +    isENOENT(): boolean;
      +    /**
      +     * Return true if the path is a match for the given path name.  This handles
      +     * case sensitivity and unicode normalization.
      +     *
      +     * Note: even on case-sensitive systems, it is **not** safe to test the
      +     * equality of the `.name` property to determine whether a given pathname
      +     * matches, due to unicode normalization mismatches.
      +     *
      +     * Always use this method instead of testing the `path.name` property
      +     * directly.
      +     */
      +    isNamed(n: string): boolean;
      +    /**
      +     * Return the Path object corresponding to the target of a symbolic link.
      +     *
      +     * If the Path is not a symbolic link, or if the readlink call fails for any
      +     * reason, `undefined` is returned.
      +     *
      +     * Result is cached, and thus may be outdated if the filesystem is mutated.
      +     */
      +    readlink(): Promise;
      +    /**
      +     * Synchronous {@link PathBase.readlink}
      +     */
      +    readlinkSync(): PathBase | undefined;
      +    /**
      +     * Call lstat() on this Path, and update all known information that can be
      +     * determined.
      +     *
      +     * Note that unlike `fs.lstat()`, the returned value does not contain some
      +     * information, such as `mode`, `dev`, `nlink`, and `ino`.  If that
      +     * information is required, you will need to call `fs.lstat` yourself.
      +     *
      +     * If the Path refers to a nonexistent file, or if the lstat call fails for
      +     * any reason, `undefined` is returned.  Otherwise the updated Path object is
      +     * returned.
      +     *
      +     * Results are cached, and thus may be out of date if the filesystem is
      +     * mutated.
      +     */
      +    lstat(): Promise;
      +    /**
      +     * synchronous {@link PathBase.lstat}
      +     */
      +    lstatSync(): PathBase | undefined;
      +    /**
      +     * Standard node-style callback interface to get list of directory entries.
      +     *
      +     * If the Path cannot or does not contain any children, then an empty array
      +     * is returned.
      +     *
      +     * Results are cached, and thus may be out of date if the filesystem is
      +     * mutated.
      +     *
      +     * @param cb The callback called with (er, entries).  Note that the `er`
      +     * param is somewhat extraneous, as all readdir() errors are handled and
      +     * simply result in an empty set of entries being returned.
      +     * @param allowZalgo Boolean indicating that immediately known results should
      +     * *not* be deferred with `queueMicrotask`. Defaults to `false`. Release
      +     * zalgo at your peril, the dark pony lord is devious and unforgiving.
      +     */
      +    readdirCB(cb: (er: NodeJS.ErrnoException | null, entries: PathBase[]) => any, allowZalgo?: boolean): void;
      +    /**
      +     * Return an array of known child entries.
      +     *
      +     * If the Path cannot or does not contain any children, then an empty array
      +     * is returned.
      +     *
      +     * Results are cached, and thus may be out of date if the filesystem is
      +     * mutated.
      +     */
      +    readdir(): Promise;
      +    /**
      +     * synchronous {@link PathBase.readdir}
      +     */
      +    readdirSync(): PathBase[];
      +    canReaddir(): boolean;
      +    shouldWalk(dirs: Set, walkFilter?: (e: PathBase) => boolean): boolean;
      +    /**
      +     * Return the Path object corresponding to path as resolved
      +     * by realpath(3).
      +     *
      +     * If the realpath call fails for any reason, `undefined` is returned.
      +     *
      +     * Result is cached, and thus may be outdated if the filesystem is mutated.
      +     * On success, returns a Path object.
      +     */
      +    realpath(): Promise;
      +    /**
      +     * Synchronous {@link realpath}
      +     */
      +    realpathSync(): PathBase | undefined;
      +    /**
      +     * Internal method to mark this Path object as the scurry cwd,
      +     * called by {@link PathScurry#chdir}
      +     *
      +     * @internal
      +     */
      +    [setAsCwd](oldCwd: PathBase): void;
      +}
      +/**
      + * Path class used on win32 systems
      + *
      + * Uses `'\\'` as the path separator for returned paths, either `'\\'` or `'/'`
      + * as the path separator for parsing paths.
      + */
      +export declare class PathWin32 extends PathBase {
      +    /**
      +     * Separator for generating path strings.
      +     */
      +    sep: '\\';
      +    /**
      +     * Separator for parsing path strings.
      +     */
      +    splitSep: RegExp;
      +    /**
      +     * Do not create new Path objects directly.  They should always be accessed
      +     * via the PathScurry class or other methods on the Path class.
      +     *
      +     * @internal
      +     */
      +    constructor(name: string, type: number | undefined, root: PathBase | undefined, roots: {
      +        [k: string]: PathBase;
      +    }, nocase: boolean, children: ChildrenCache, opts: PathOpts);
      +    /**
      +     * @internal
      +     */
      +    newChild(name: string, type?: number, opts?: PathOpts): PathWin32;
      +    /**
      +     * @internal
      +     */
      +    getRootString(path: string): string;
      +    /**
      +     * @internal
      +     */
      +    getRoot(rootPath: string): PathBase;
      +    /**
      +     * @internal
      +     */
      +    sameRoot(rootPath: string, compare?: string): boolean;
      +}
      +/**
      + * Path class used on all posix systems.
      + *
      + * Uses `'/'` as the path separator.
      + */
      +export declare class PathPosix extends PathBase {
      +    /**
      +     * separator for parsing path strings
      +     */
      +    splitSep: '/';
      +    /**
      +     * separator for generating path strings
      +     */
      +    sep: '/';
      +    /**
      +     * Do not create new Path objects directly.  They should always be accessed
      +     * via the PathScurry class or other methods on the Path class.
      +     *
      +     * @internal
      +     */
      +    constructor(name: string, type: number | undefined, root: PathBase | undefined, roots: {
      +        [k: string]: PathBase;
      +    }, nocase: boolean, children: ChildrenCache, opts: PathOpts);
      +    /**
      +     * @internal
      +     */
      +    getRootString(path: string): string;
      +    /**
      +     * @internal
      +     */
      +    getRoot(_rootPath: string): PathBase;
      +    /**
      +     * @internal
      +     */
      +    newChild(name: string, type?: number, opts?: PathOpts): PathPosix;
      +}
      +/**
      + * Options that may be provided to the PathScurry constructor
      + */
      +export interface PathScurryOpts {
      +    /**
      +     * perform case-insensitive path matching. Default based on platform
      +     * subclass.
      +     */
      +    nocase?: boolean;
      +    /**
      +     * Number of Path entries to keep in the cache of Path child references.
      +     *
      +     * Setting this higher than 65536 will dramatically increase the data
      +     * consumption and construction time overhead of each PathScurry.
      +     *
      +     * Setting this value to 256 or lower will significantly reduce the data
      +     * consumption and construction time overhead, but may also reduce resolve()
      +     * and readdir() performance on large filesystems.
      +     *
      +     * Default `16384`.
      +     */
      +    childrenCacheSize?: number;
      +    /**
      +     * An object that overrides the built-in functions from the fs and
      +     * fs/promises modules.
      +     *
      +     * See {@link FSOption}
      +     */
      +    fs?: FSOption;
      +}
      +/**
      + * The base class for all PathScurry classes, providing the interface for path
      + * resolution and filesystem operations.
      + *
      + * Typically, you should *not* instantiate this class directly, but rather one
      + * of the platform-specific classes, or the exported {@link PathScurry} which
      + * defaults to the current platform.
      + */
      +export declare abstract class PathScurryBase {
      +    #private;
      +    /**
      +     * The root Path entry for the current working directory of this Scurry
      +     */
      +    root: PathBase;
      +    /**
      +     * The string path for the root of this Scurry's current working directory
      +     */
      +    rootPath: string;
      +    /**
      +     * A collection of all roots encountered, referenced by rootPath
      +     */
      +    roots: {
      +        [k: string]: PathBase;
      +    };
      +    /**
      +     * The Path entry corresponding to this PathScurry's current working directory.
      +     */
      +    cwd: PathBase;
      +    /**
      +     * Perform path comparisons case-insensitively.
      +     *
      +     * Defaults true on Darwin and Windows systems, false elsewhere.
      +     */
      +    nocase: boolean;
      +    /**
      +     * The path separator used for parsing paths
      +     *
      +     * `'/'` on Posix systems, either `'/'` or `'\\'` on Windows
      +     */
      +    abstract sep: string | RegExp;
      +    /**
      +     * This class should not be instantiated directly.
      +     *
      +     * Use PathScurryWin32, PathScurryDarwin, PathScurryPosix, or PathScurry
      +     *
      +     * @internal
      +     */
      +    constructor(cwd: (URL | string) | undefined, pathImpl: typeof win32 | typeof posix, sep: string | RegExp, { nocase, childrenCacheSize, fs, }?: PathScurryOpts);
      +    /**
      +     * Get the depth of a provided path, string, or the cwd
      +     */
      +    depth(path?: Path | string): number;
      +    /**
      +     * Parse the root portion of a path string
      +     *
      +     * @internal
      +     */
      +    abstract parseRootPath(dir: string): string;
      +    /**
      +     * create a new Path to use as root during construction.
      +     *
      +     * @internal
      +     */
      +    abstract newRoot(fs: FSValue): PathBase;
      +    /**
      +     * Determine whether a given path string is absolute
      +     */
      +    abstract isAbsolute(p: string): boolean;
      +    /**
      +     * Return the cache of child entries.  Exposed so subclasses can create
      +     * child Path objects in a platform-specific way.
      +     *
      +     * @internal
      +     */
      +    childrenCache(): ChildrenCache;
      +    /**
      +     * Resolve one or more path strings to a resolved string
      +     *
      +     * Same interface as require('path').resolve.
      +     *
      +     * Much faster than path.resolve() when called multiple times for the same
      +     * path, because the resolved Path objects are cached.  Much slower
      +     * otherwise.
      +     */
      +    resolve(...paths: string[]): string;
      +    /**
      +     * Resolve one or more path strings to a resolved string, returning
      +     * the posix path.  Identical to .resolve() on posix systems, but on
      +     * windows will return a forward-slash separated UNC path.
      +     *
      +     * Same interface as require('path').resolve.
      +     *
      +     * Much faster than path.resolve() when called multiple times for the same
      +     * path, because the resolved Path objects are cached.  Much slower
      +     * otherwise.
      +     */
      +    resolvePosix(...paths: string[]): string;
      +    /**
      +     * find the relative path from the cwd to the supplied path string or entry
      +     */
      +    relative(entry?: PathBase | string): string;
      +    /**
      +     * find the relative path from the cwd to the supplied path string or
      +     * entry, using / as the path delimiter, even on Windows.
      +     */
      +    relativePosix(entry?: PathBase | string): string;
      +    /**
      +     * Return the basename for the provided string or Path object
      +     */
      +    basename(entry?: PathBase | string): string;
      +    /**
      +     * Return the dirname for the provided string or Path object
      +     */
      +    dirname(entry?: PathBase | string): string;
      +    /**
      +     * Return an array of known child entries.
      +     *
      +     * First argument may be either a string, or a Path object.
      +     *
      +     * If the Path cannot or does not contain any children, then an empty array
      +     * is returned.
      +     *
      +     * Results are cached, and thus may be out of date if the filesystem is
      +     * mutated.
      +     *
      +     * Unlike `fs.readdir()`, the `withFileTypes` option defaults to `true`. Set
      +     * `{ withFileTypes: false }` to return strings.
      +     */
      +    readdir(): Promise;
      +    readdir(opts: {
      +        withFileTypes: true;
      +    }): Promise;
      +    readdir(opts: {
      +        withFileTypes: false;
      +    }): Promise;
      +    readdir(opts: {
      +        withFileTypes: boolean;
      +    }): Promise;
      +    readdir(entry: PathBase | string): Promise;
      +    readdir(entry: PathBase | string, opts: {
      +        withFileTypes: true;
      +    }): Promise;
      +    readdir(entry: PathBase | string, opts: {
      +        withFileTypes: false;
      +    }): Promise;
      +    readdir(entry: PathBase | string, opts: {
      +        withFileTypes: boolean;
      +    }): Promise;
      +    /**
      +     * synchronous {@link PathScurryBase.readdir}
      +     */
      +    readdirSync(): PathBase[];
      +    readdirSync(opts: {
      +        withFileTypes: true;
      +    }): PathBase[];
      +    readdirSync(opts: {
      +        withFileTypes: false;
      +    }): string[];
      +    readdirSync(opts: {
      +        withFileTypes: boolean;
      +    }): PathBase[] | string[];
      +    readdirSync(entry: PathBase | string): PathBase[];
      +    readdirSync(entry: PathBase | string, opts: {
      +        withFileTypes: true;
      +    }): PathBase[];
      +    readdirSync(entry: PathBase | string, opts: {
      +        withFileTypes: false;
      +    }): string[];
      +    readdirSync(entry: PathBase | string, opts: {
      +        withFileTypes: boolean;
      +    }): PathBase[] | string[];
      +    /**
      +     * Call lstat() on the string or Path object, and update all known
      +     * information that can be determined.
      +     *
      +     * Note that unlike `fs.lstat()`, the returned value does not contain some
      +     * information, such as `mode`, `dev`, `nlink`, and `ino`.  If that
      +     * information is required, you will need to call `fs.lstat` yourself.
      +     *
      +     * If the Path refers to a nonexistent file, or if the lstat call fails for
      +     * any reason, `undefined` is returned.  Otherwise the updated Path object is
      +     * returned.
      +     *
      +     * Results are cached, and thus may be out of date if the filesystem is
      +     * mutated.
      +     */
      +    lstat(entry?: string | PathBase): Promise;
      +    /**
      +     * synchronous {@link PathScurryBase.lstat}
      +     */
      +    lstatSync(entry?: string | PathBase): PathBase | undefined;
      +    /**
      +     * Return the Path object or string path corresponding to the target of a
      +     * symbolic link.
      +     *
      +     * If the path is not a symbolic link, or if the readlink call fails for any
      +     * reason, `undefined` is returned.
      +     *
      +     * Result is cached, and thus may be outdated if the filesystem is mutated.
      +     *
      +     * `{withFileTypes}` option defaults to `false`.
      +     *
      +     * On success, returns a Path object if `withFileTypes` option is true,
      +     * otherwise a string.
      +     */
      +    readlink(): Promise;
      +    readlink(opt: {
      +        withFileTypes: false;
      +    }): Promise;
      +    readlink(opt: {
      +        withFileTypes: true;
      +    }): Promise;
      +    readlink(opt: {
      +        withFileTypes: boolean;
      +    }): Promise;
      +    readlink(entry: string | PathBase, opt?: {
      +        withFileTypes: false;
      +    }): Promise;
      +    readlink(entry: string | PathBase, opt: {
      +        withFileTypes: true;
      +    }): Promise;
      +    readlink(entry: string | PathBase, opt: {
      +        withFileTypes: boolean;
      +    }): Promise;
      +    /**
      +     * synchronous {@link PathScurryBase.readlink}
      +     */
      +    readlinkSync(): string | undefined;
      +    readlinkSync(opt: {
      +        withFileTypes: false;
      +    }): string | undefined;
      +    readlinkSync(opt: {
      +        withFileTypes: true;
      +    }): PathBase | undefined;
      +    readlinkSync(opt: {
      +        withFileTypes: boolean;
      +    }): PathBase | string | undefined;
      +    readlinkSync(entry: string | PathBase, opt?: {
      +        withFileTypes: false;
      +    }): string | undefined;
      +    readlinkSync(entry: string | PathBase, opt: {
      +        withFileTypes: true;
      +    }): PathBase | undefined;
      +    readlinkSync(entry: string | PathBase, opt: {
      +        withFileTypes: boolean;
      +    }): string | PathBase | undefined;
      +    /**
      +     * Return the Path object or string path corresponding to path as resolved
      +     * by realpath(3).
      +     *
      +     * If the realpath call fails for any reason, `undefined` is returned.
      +     *
      +     * Result is cached, and thus may be outdated if the filesystem is mutated.
      +     *
      +     * `{withFileTypes}` option defaults to `false`.
      +     *
      +     * On success, returns a Path object if `withFileTypes` option is true,
      +     * otherwise a string.
      +     */
      +    realpath(): Promise;
      +    realpath(opt: {
      +        withFileTypes: false;
      +    }): Promise;
      +    realpath(opt: {
      +        withFileTypes: true;
      +    }): Promise;
      +    realpath(opt: {
      +        withFileTypes: boolean;
      +    }): Promise;
      +    realpath(entry: string | PathBase, opt?: {
      +        withFileTypes: false;
      +    }): Promise;
      +    realpath(entry: string | PathBase, opt: {
      +        withFileTypes: true;
      +    }): Promise;
      +    realpath(entry: string | PathBase, opt: {
      +        withFileTypes: boolean;
      +    }): Promise;
      +    realpathSync(): string | undefined;
      +    realpathSync(opt: {
      +        withFileTypes: false;
      +    }): string | undefined;
      +    realpathSync(opt: {
      +        withFileTypes: true;
      +    }): PathBase | undefined;
      +    realpathSync(opt: {
      +        withFileTypes: boolean;
      +    }): PathBase | string | undefined;
      +    realpathSync(entry: string | PathBase, opt?: {
      +        withFileTypes: false;
      +    }): string | undefined;
      +    realpathSync(entry: string | PathBase, opt: {
      +        withFileTypes: true;
      +    }): PathBase | undefined;
      +    realpathSync(entry: string | PathBase, opt: {
      +        withFileTypes: boolean;
      +    }): string | PathBase | undefined;
      +    /**
      +     * Asynchronously walk the directory tree, returning an array of
      +     * all path strings or Path objects found.
      +     *
      +     * Note that this will be extremely memory-hungry on large filesystems.
      +     * In such cases, it may be better to use the stream or async iterator
      +     * walk implementation.
      +     */
      +    walk(): Promise;
      +    walk(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Promise;
      +    walk(opts: WalkOptionsWithFileTypesFalse): Promise;
      +    walk(opts: WalkOptions): Promise;
      +    walk(entry: string | PathBase): Promise;
      +    walk(entry: string | PathBase, opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Promise;
      +    walk(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): Promise;
      +    walk(entry: string | PathBase, opts: WalkOptions): Promise;
      +    /**
      +     * Synchronously walk the directory tree, returning an array of
      +     * all path strings or Path objects found.
      +     *
      +     * Note that this will be extremely memory-hungry on large filesystems.
      +     * In such cases, it may be better to use the stream or async iterator
      +     * walk implementation.
      +     */
      +    walkSync(): PathBase[];
      +    walkSync(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): PathBase[];
      +    walkSync(opts: WalkOptionsWithFileTypesFalse): string[];
      +    walkSync(opts: WalkOptions): string[] | PathBase[];
      +    walkSync(entry: string | PathBase): PathBase[];
      +    walkSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesUnset | WalkOptionsWithFileTypesTrue): PathBase[];
      +    walkSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): string[];
      +    walkSync(entry: string | PathBase, opts: WalkOptions): PathBase[] | string[];
      +    /**
      +     * Support for `for await`
      +     *
      +     * Alias for {@link PathScurryBase.iterate}
      +     *
      +     * Note: As of Node 19, this is very slow, compared to other methods of
      +     * walking.  Consider using {@link PathScurryBase.stream} if memory overhead
      +     * and backpressure are concerns, or {@link PathScurryBase.walk} if not.
      +     */
      +    [Symbol.asyncIterator](): AsyncGenerator;
      +    /**
      +     * Async generator form of {@link PathScurryBase.walk}
      +     *
      +     * Note: As of Node 19, this is very slow, compared to other methods of
      +     * walking, especially if most/all of the directory tree has been previously
      +     * walked.  Consider using {@link PathScurryBase.stream} if memory overhead
      +     * and backpressure are concerns, or {@link PathScurryBase.walk} if not.
      +     */
      +    iterate(): AsyncGenerator;
      +    iterate(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): AsyncGenerator;
      +    iterate(opts: WalkOptionsWithFileTypesFalse): AsyncGenerator;
      +    iterate(opts: WalkOptions): AsyncGenerator;
      +    iterate(entry: string | PathBase): AsyncGenerator;
      +    iterate(entry: string | PathBase, opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): AsyncGenerator;
      +    iterate(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): AsyncGenerator;
      +    iterate(entry: string | PathBase, opts: WalkOptions): AsyncGenerator;
      +    /**
      +     * Iterating over a PathScurry performs a synchronous walk.
      +     *
      +     * Alias for {@link PathScurryBase.iterateSync}
      +     */
      +    [Symbol.iterator](): Generator;
      +    iterateSync(): Generator;
      +    iterateSync(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Generator;
      +    iterateSync(opts: WalkOptionsWithFileTypesFalse): Generator;
      +    iterateSync(opts: WalkOptions): Generator;
      +    iterateSync(entry: string | PathBase): Generator;
      +    iterateSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Generator;
      +    iterateSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): Generator;
      +    iterateSync(entry: string | PathBase, opts: WalkOptions): Generator;
      +    /**
      +     * Stream form of {@link PathScurryBase.walk}
      +     *
      +     * Returns a Minipass stream that emits {@link PathBase} objects by default,
      +     * or strings if `{ withFileTypes: false }` is set in the options.
      +     */
      +    stream(): Minipass;
      +    stream(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Minipass;
      +    stream(opts: WalkOptionsWithFileTypesFalse): Minipass;
      +    stream(opts: WalkOptions): Minipass;
      +    stream(entry: string | PathBase): Minipass;
      +    stream(entry: string | PathBase, opts: WalkOptionsWithFileTypesUnset | WalkOptionsWithFileTypesTrue): Minipass;
      +    stream(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): Minipass;
      +    stream(entry: string | PathBase, opts: WalkOptions): Minipass | Minipass;
      +    /**
      +     * Synchronous form of {@link PathScurryBase.stream}
      +     *
      +     * Returns a Minipass stream that emits {@link PathBase} objects by default,
      +     * or strings if `{ withFileTypes: false }` is set in the options.
      +     *
      +     * Will complete the walk in a single tick if the stream is consumed fully.
      +     * Otherwise, will pause as needed for stream backpressure.
      +     */
      +    streamSync(): Minipass;
      +    streamSync(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Minipass;
      +    streamSync(opts: WalkOptionsWithFileTypesFalse): Minipass;
      +    streamSync(opts: WalkOptions): Minipass;
      +    streamSync(entry: string | PathBase): Minipass;
      +    streamSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesUnset | WalkOptionsWithFileTypesTrue): Minipass;
      +    streamSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): Minipass;
      +    streamSync(entry: string | PathBase, opts: WalkOptions): Minipass | Minipass;
      +    chdir(path?: string | Path): void;
      +}
      +/**
      + * Options provided to all walk methods.
      + */
      +export interface WalkOptions {
      +    /**
      +     * Return results as {@link PathBase} objects rather than strings.
      +     * When set to false, results are fully resolved paths, as returned by
      +     * {@link PathBase.fullpath}.
      +     * @default true
      +     */
      +    withFileTypes?: boolean;
      +    /**
      +     *  Attempt to read directory entries from symbolic links. Otherwise, only
      +     *  actual directories are traversed. Regardless of this setting, a given
      +     *  target path will only ever be walked once, meaning that a symbolic link
      +     *  to a previously traversed directory will never be followed.
      +     *
      +     *  Setting this imposes a slight performance penalty, because `readlink`
      +     *  must be called on all symbolic links encountered, in order to avoid
      +     *  infinite cycles.
      +     * @default false
      +     */
      +    follow?: boolean;
      +    /**
      +     * Only return entries where the provided function returns true.
      +     *
      +     * This will not prevent directories from being traversed, even if they do
      +     * not pass the filter, though it will prevent directories themselves from
      +     * being included in the result set.  See {@link walkFilter}
      +     *
      +     * Asynchronous functions are not supported here.
      +     *
      +     * By default, if no filter is provided, all entries and traversed
      +     * directories are included.
      +     */
      +    filter?: (entry: PathBase) => boolean;
      +    /**
      +     * Only traverse directories (and in the case of {@link follow} being set to
      +     * true, symbolic links to directories) if the provided function returns
      +     * true.
      +     *
      +     * This will not prevent directories from being included in the result set,
      +     * even if they do not pass the supplied filter function.  See {@link filter}
      +     * to do that.
      +     *
      +     * Asynchronous functions are not supported here.
      +     */
      +    walkFilter?: (entry: PathBase) => boolean;
      +}
      +export type WalkOptionsWithFileTypesUnset = WalkOptions & {
      +    withFileTypes?: undefined;
      +};
      +export type WalkOptionsWithFileTypesTrue = WalkOptions & {
      +    withFileTypes: true;
      +};
      +export type WalkOptionsWithFileTypesFalse = WalkOptions & {
      +    withFileTypes: false;
      +};
      +/**
      + * Windows implementation of {@link PathScurryBase}
      + *
      + * Defaults to case insensitve, uses `'\\'` to generate path strings.  Uses
      + * {@link PathWin32} for Path objects.
      + */
      +export declare class PathScurryWin32 extends PathScurryBase {
      +    /**
      +     * separator for generating path strings
      +     */
      +    sep: '\\';
      +    constructor(cwd?: URL | string, opts?: PathScurryOpts);
      +    /**
      +     * @internal
      +     */
      +    parseRootPath(dir: string): string;
      +    /**
      +     * @internal
      +     */
      +    newRoot(fs: FSValue): PathWin32;
      +    /**
      +     * Return true if the provided path string is an absolute path
      +     */
      +    isAbsolute(p: string): boolean;
      +}
      +/**
      + * {@link PathScurryBase} implementation for all posix systems other than Darwin.
      + *
      + * Defaults to case-sensitive matching, uses `'/'` to generate path strings.
      + *
      + * Uses {@link PathPosix} for Path objects.
      + */
      +export declare class PathScurryPosix extends PathScurryBase {
      +    /**
      +     * separator for generating path strings
      +     */
      +    sep: '/';
      +    constructor(cwd?: URL | string, opts?: PathScurryOpts);
      +    /**
      +     * @internal
      +     */
      +    parseRootPath(_dir: string): string;
      +    /**
      +     * @internal
      +     */
      +    newRoot(fs: FSValue): PathPosix;
      +    /**
      +     * Return true if the provided path string is an absolute path
      +     */
      +    isAbsolute(p: string): boolean;
      +}
      +/**
      + * {@link PathScurryBase} implementation for Darwin (macOS) systems.
      + *
      + * Defaults to case-insensitive matching, uses `'/'` for generating path
      + * strings.
      + *
      + * Uses {@link PathPosix} for Path objects.
      + */
      +export declare class PathScurryDarwin extends PathScurryPosix {
      +    constructor(cwd?: URL | string, opts?: PathScurryOpts);
      +}
      +/**
      + * Default {@link PathBase} implementation for the current platform.
      + *
      + * {@link PathWin32} on Windows systems, {@link PathPosix} on all others.
      + */
      +export declare const Path: typeof PathWin32 | typeof PathPosix;
      +export type Path = PathBase | InstanceType;
      +/**
      + * Default {@link PathScurryBase} implementation for the current platform.
      + *
      + * {@link PathScurryWin32} on Windows systems, {@link PathScurryDarwin} on
      + * Darwin (macOS) systems, {@link PathScurryPosix} on all others.
      + */
      +export declare const PathScurry: typeof PathScurryWin32 | typeof PathScurryDarwin | typeof PathScurryPosix;
      +export type PathScurry = PathScurryBase | InstanceType;
      +export {};
      +//# sourceMappingURL=index.d.ts.map
      \ No newline at end of file
      diff --git a/node_modules/path-scurry/dist/esm/index.d.ts.map b/node_modules/path-scurry/dist/esm/index.d.ts.map
      new file mode 100644
      index 00000000..bf58a3a3
      --- /dev/null
      +++ b/node_modules/path-scurry/dist/esm/index.d.ts.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
      \ No newline at end of file
      diff --git a/node_modules/path-scurry/dist/esm/index.js b/node_modules/path-scurry/dist/esm/index.js
      new file mode 100644
      index 00000000..dc7cae49
      --- /dev/null
      +++ b/node_modules/path-scurry/dist/esm/index.js
      @@ -0,0 +1,1983 @@
      +import { LRUCache } from 'lru-cache';
      +import { posix, win32 } from 'node:path';
      +import { fileURLToPath } from 'node:url';
      +import { lstatSync, readdir as readdirCB, readdirSync, readlinkSync, realpathSync as rps, } from 'fs';
      +import * as actualFS from 'node:fs';
      +const realpathSync = rps.native;
      +// TODO: test perf of fs/promises realpath vs realpathCB,
      +// since the promises one uses realpath.native
      +import { lstat, readdir, readlink, realpath } from 'node:fs/promises';
      +import { Minipass } from 'minipass';
      +const defaultFS = {
      +    lstatSync,
      +    readdir: readdirCB,
      +    readdirSync,
      +    readlinkSync,
      +    realpathSync,
      +    promises: {
      +        lstat,
      +        readdir,
      +        readlink,
      +        realpath,
      +    },
      +};
      +// if they just gave us require('fs') then use our default
      +const fsFromOption = (fsOption) => !fsOption || fsOption === defaultFS || fsOption === actualFS ?
      +    defaultFS
      +    : {
      +        ...defaultFS,
      +        ...fsOption,
      +        promises: {
      +            ...defaultFS.promises,
      +            ...(fsOption.promises || {}),
      +        },
      +    };
      +// turn something like //?/c:/ into c:\
      +const uncDriveRegexp = /^\\\\\?\\([a-z]:)\\?$/i;
      +const uncToDrive = (rootPath) => rootPath.replace(/\//g, '\\').replace(uncDriveRegexp, '$1\\');
      +// windows paths are separated by either / or \
      +const eitherSep = /[\\\/]/;
      +const UNKNOWN = 0; // may not even exist, for all we know
      +const IFIFO = 0b0001;
      +const IFCHR = 0b0010;
      +const IFDIR = 0b0100;
      +const IFBLK = 0b0110;
      +const IFREG = 0b1000;
      +const IFLNK = 0b1010;
      +const IFSOCK = 0b1100;
      +const IFMT = 0b1111;
      +// mask to unset low 4 bits
      +const IFMT_UNKNOWN = ~IFMT;
      +// set after successfully calling readdir() and getting entries.
      +const READDIR_CALLED = 0b0000_0001_0000;
      +// set after a successful lstat()
      +const LSTAT_CALLED = 0b0000_0010_0000;
      +// set if an entry (or one of its parents) is definitely not a dir
      +const ENOTDIR = 0b0000_0100_0000;
      +// set if an entry (or one of its parents) does not exist
      +// (can also be set on lstat errors like EACCES or ENAMETOOLONG)
      +const ENOENT = 0b0000_1000_0000;
      +// cannot have child entries -- also verify &IFMT is either IFDIR or IFLNK
      +// set if we fail to readlink
      +const ENOREADLINK = 0b0001_0000_0000;
      +// set if we know realpath() will fail
      +const ENOREALPATH = 0b0010_0000_0000;
      +const ENOCHILD = ENOTDIR | ENOENT | ENOREALPATH;
      +const TYPEMASK = 0b0011_1111_1111;
      +const entToType = (s) => s.isFile() ? IFREG
      +    : s.isDirectory() ? IFDIR
      +        : s.isSymbolicLink() ? IFLNK
      +            : s.isCharacterDevice() ? IFCHR
      +                : s.isBlockDevice() ? IFBLK
      +                    : s.isSocket() ? IFSOCK
      +                        : s.isFIFO() ? IFIFO
      +                            : UNKNOWN;
      +// normalize unicode path names
      +const normalizeCache = new LRUCache({ max: 2 ** 12 });
      +const normalize = (s) => {
      +    const c = normalizeCache.get(s);
      +    if (c)
      +        return c;
      +    const n = s.normalize('NFKD');
      +    normalizeCache.set(s, n);
      +    return n;
      +};
      +const normalizeNocaseCache = new LRUCache({ max: 2 ** 12 });
      +const normalizeNocase = (s) => {
      +    const c = normalizeNocaseCache.get(s);
      +    if (c)
      +        return c;
      +    const n = normalize(s.toLowerCase());
      +    normalizeNocaseCache.set(s, n);
      +    return n;
      +};
      +/**
      + * An LRUCache for storing resolved path strings or Path objects.
      + * @internal
      + */
      +export class ResolveCache extends LRUCache {
      +    constructor() {
      +        super({ max: 256 });
      +    }
      +}
      +// In order to prevent blowing out the js heap by allocating hundreds of
      +// thousands of Path entries when walking extremely large trees, the "children"
      +// in this tree are represented by storing an array of Path entries in an
      +// LRUCache, indexed by the parent.  At any time, Path.children() may return an
      +// empty array, indicating that it doesn't know about any of its children, and
      +// thus has to rebuild that cache.  This is fine, it just means that we don't
      +// benefit as much from having the cached entries, but huge directory walks
      +// don't blow out the stack, and smaller ones are still as fast as possible.
      +//
      +//It does impose some complexity when building up the readdir data, because we
      +//need to pass a reference to the children array that we started with.
      +/**
      + * an LRUCache for storing child entries.
      + * @internal
      + */
      +export class ChildrenCache extends LRUCache {
      +    constructor(maxSize = 16 * 1024) {
      +        super({
      +            maxSize,
      +            // parent + children
      +            sizeCalculation: a => a.length + 1,
      +        });
      +    }
      +}
      +const setAsCwd = Symbol('PathScurry setAsCwd');
      +/**
      + * Path objects are sort of like a super-powered
      + * {@link https://nodejs.org/docs/latest/api/fs.html#class-fsdirent fs.Dirent}
      + *
      + * Each one represents a single filesystem entry on disk, which may or may not
      + * exist. It includes methods for reading various types of information via
      + * lstat, readlink, and readdir, and caches all information to the greatest
      + * degree possible.
      + *
      + * Note that fs operations that would normally throw will instead return an
      + * "empty" value. This is in order to prevent excessive overhead from error
      + * stack traces.
      + */
      +export class PathBase {
      +    /**
      +     * the basename of this path
      +     *
      +     * **Important**: *always* test the path name against any test string
      +     * usingthe {@link isNamed} method, and not by directly comparing this
      +     * string. Otherwise, unicode path strings that the system sees as identical
      +     * will not be properly treated as the same path, leading to incorrect
      +     * behavior and possible security issues.
      +     */
      +    name;
      +    /**
      +     * the Path entry corresponding to the path root.
      +     *
      +     * @internal
      +     */
      +    root;
      +    /**
      +     * All roots found within the current PathScurry family
      +     *
      +     * @internal
      +     */
      +    roots;
      +    /**
      +     * a reference to the parent path, or undefined in the case of root entries
      +     *
      +     * @internal
      +     */
      +    parent;
      +    /**
      +     * boolean indicating whether paths are compared case-insensitively
      +     * @internal
      +     */
      +    nocase;
      +    /**
      +     * boolean indicating that this path is the current working directory
      +     * of the PathScurry collection that contains it.
      +     */
      +    isCWD = false;
      +    // potential default fs override
      +    #fs;
      +    // Stats fields
      +    #dev;
      +    get dev() {
      +        return this.#dev;
      +    }
      +    #mode;
      +    get mode() {
      +        return this.#mode;
      +    }
      +    #nlink;
      +    get nlink() {
      +        return this.#nlink;
      +    }
      +    #uid;
      +    get uid() {
      +        return this.#uid;
      +    }
      +    #gid;
      +    get gid() {
      +        return this.#gid;
      +    }
      +    #rdev;
      +    get rdev() {
      +        return this.#rdev;
      +    }
      +    #blksize;
      +    get blksize() {
      +        return this.#blksize;
      +    }
      +    #ino;
      +    get ino() {
      +        return this.#ino;
      +    }
      +    #size;
      +    get size() {
      +        return this.#size;
      +    }
      +    #blocks;
      +    get blocks() {
      +        return this.#blocks;
      +    }
      +    #atimeMs;
      +    get atimeMs() {
      +        return this.#atimeMs;
      +    }
      +    #mtimeMs;
      +    get mtimeMs() {
      +        return this.#mtimeMs;
      +    }
      +    #ctimeMs;
      +    get ctimeMs() {
      +        return this.#ctimeMs;
      +    }
      +    #birthtimeMs;
      +    get birthtimeMs() {
      +        return this.#birthtimeMs;
      +    }
      +    #atime;
      +    get atime() {
      +        return this.#atime;
      +    }
      +    #mtime;
      +    get mtime() {
      +        return this.#mtime;
      +    }
      +    #ctime;
      +    get ctime() {
      +        return this.#ctime;
      +    }
      +    #birthtime;
      +    get birthtime() {
      +        return this.#birthtime;
      +    }
      +    #matchName;
      +    #depth;
      +    #fullpath;
      +    #fullpathPosix;
      +    #relative;
      +    #relativePosix;
      +    #type;
      +    #children;
      +    #linkTarget;
      +    #realpath;
      +    /**
      +     * This property is for compatibility with the Dirent class as of
      +     * Node v20, where Dirent['parentPath'] refers to the path of the
      +     * directory that was passed to readdir. For root entries, it's the path
      +     * to the entry itself.
      +     */
      +    get parentPath() {
      +        return (this.parent || this).fullpath();
      +    }
      +    /* c8 ignore start */
      +    /**
      +     * Deprecated alias for Dirent['parentPath'] Somewhat counterintuitively,
      +     * this property refers to the *parent* path, not the path object itself.
      +     *
      +     * @deprecated
      +     */
      +    get path() {
      +        return this.parentPath;
      +    }
      +    /* c8 ignore stop */
      +    /**
      +     * Do not create new Path objects directly.  They should always be accessed
      +     * via the PathScurry class or other methods on the Path class.
      +     *
      +     * @internal
      +     */
      +    constructor(name, type = UNKNOWN, root, roots, nocase, children, opts) {
      +        this.name = name;
      +        this.#matchName = nocase ? normalizeNocase(name) : normalize(name);
      +        this.#type = type & TYPEMASK;
      +        this.nocase = nocase;
      +        this.roots = roots;
      +        this.root = root || this;
      +        this.#children = children;
      +        this.#fullpath = opts.fullpath;
      +        this.#relative = opts.relative;
      +        this.#relativePosix = opts.relativePosix;
      +        this.parent = opts.parent;
      +        if (this.parent) {
      +            this.#fs = this.parent.#fs;
      +        }
      +        else {
      +            this.#fs = fsFromOption(opts.fs);
      +        }
      +    }
      +    /**
      +     * Returns the depth of the Path object from its root.
      +     *
      +     * For example, a path at `/foo/bar` would have a depth of 2.
      +     */
      +    depth() {
      +        if (this.#depth !== undefined)
      +            return this.#depth;
      +        if (!this.parent)
      +            return (this.#depth = 0);
      +        return (this.#depth = this.parent.depth() + 1);
      +    }
      +    /**
      +     * @internal
      +     */
      +    childrenCache() {
      +        return this.#children;
      +    }
      +    /**
      +     * Get the Path object referenced by the string path, resolved from this Path
      +     */
      +    resolve(path) {
      +        if (!path) {
      +            return this;
      +        }
      +        const rootPath = this.getRootString(path);
      +        const dir = path.substring(rootPath.length);
      +        const dirParts = dir.split(this.splitSep);
      +        const result = rootPath ?
      +            this.getRoot(rootPath).#resolveParts(dirParts)
      +            : this.#resolveParts(dirParts);
      +        return result;
      +    }
      +    #resolveParts(dirParts) {
      +        let p = this;
      +        for (const part of dirParts) {
      +            p = p.child(part);
      +        }
      +        return p;
      +    }
      +    /**
      +     * Returns the cached children Path objects, if still available.  If they
      +     * have fallen out of the cache, then returns an empty array, and resets the
      +     * READDIR_CALLED bit, so that future calls to readdir() will require an fs
      +     * lookup.
      +     *
      +     * @internal
      +     */
      +    children() {
      +        const cached = this.#children.get(this);
      +        if (cached) {
      +            return cached;
      +        }
      +        const children = Object.assign([], { provisional: 0 });
      +        this.#children.set(this, children);
      +        this.#type &= ~READDIR_CALLED;
      +        return children;
      +    }
      +    /**
      +     * Resolves a path portion and returns or creates the child Path.
      +     *
      +     * Returns `this` if pathPart is `''` or `'.'`, or `parent` if pathPart is
      +     * `'..'`.
      +     *
      +     * This should not be called directly.  If `pathPart` contains any path
      +     * separators, it will lead to unsafe undefined behavior.
      +     *
      +     * Use `Path.resolve()` instead.
      +     *
      +     * @internal
      +     */
      +    child(pathPart, opts) {
      +        if (pathPart === '' || pathPart === '.') {
      +            return this;
      +        }
      +        if (pathPart === '..') {
      +            return this.parent || this;
      +        }
      +        // find the child
      +        const children = this.children();
      +        const name = this.nocase ? normalizeNocase(pathPart) : normalize(pathPart);
      +        for (const p of children) {
      +            if (p.#matchName === name) {
      +                return p;
      +            }
      +        }
      +        // didn't find it, create provisional child, since it might not
      +        // actually exist.  If we know the parent isn't a dir, then
      +        // in fact it CAN'T exist.
      +        const s = this.parent ? this.sep : '';
      +        const fullpath = this.#fullpath ? this.#fullpath + s + pathPart : undefined;
      +        const pchild = this.newChild(pathPart, UNKNOWN, {
      +            ...opts,
      +            parent: this,
      +            fullpath,
      +        });
      +        if (!this.canReaddir()) {
      +            pchild.#type |= ENOENT;
      +        }
      +        // don't have to update provisional, because if we have real children,
      +        // then provisional is set to children.length, otherwise a lower number
      +        children.push(pchild);
      +        return pchild;
      +    }
      +    /**
      +     * The relative path from the cwd. If it does not share an ancestor with
      +     * the cwd, then this ends up being equivalent to the fullpath()
      +     */
      +    relative() {
      +        if (this.isCWD)
      +            return '';
      +        if (this.#relative !== undefined) {
      +            return this.#relative;
      +        }
      +        const name = this.name;
      +        const p = this.parent;
      +        if (!p) {
      +            return (this.#relative = this.name);
      +        }
      +        const pv = p.relative();
      +        return pv + (!pv || !p.parent ? '' : this.sep) + name;
      +    }
      +    /**
      +     * The relative path from the cwd, using / as the path separator.
      +     * If it does not share an ancestor with
      +     * the cwd, then this ends up being equivalent to the fullpathPosix()
      +     * On posix systems, this is identical to relative().
      +     */
      +    relativePosix() {
      +        if (this.sep === '/')
      +            return this.relative();
      +        if (this.isCWD)
      +            return '';
      +        if (this.#relativePosix !== undefined)
      +            return this.#relativePosix;
      +        const name = this.name;
      +        const p = this.parent;
      +        if (!p) {
      +            return (this.#relativePosix = this.fullpathPosix());
      +        }
      +        const pv = p.relativePosix();
      +        return pv + (!pv || !p.parent ? '' : '/') + name;
      +    }
      +    /**
      +     * The fully resolved path string for this Path entry
      +     */
      +    fullpath() {
      +        if (this.#fullpath !== undefined) {
      +            return this.#fullpath;
      +        }
      +        const name = this.name;
      +        const p = this.parent;
      +        if (!p) {
      +            return (this.#fullpath = this.name);
      +        }
      +        const pv = p.fullpath();
      +        const fp = pv + (!p.parent ? '' : this.sep) + name;
      +        return (this.#fullpath = fp);
      +    }
      +    /**
      +     * On platforms other than windows, this is identical to fullpath.
      +     *
      +     * On windows, this is overridden to return the forward-slash form of the
      +     * full UNC path.
      +     */
      +    fullpathPosix() {
      +        if (this.#fullpathPosix !== undefined)
      +            return this.#fullpathPosix;
      +        if (this.sep === '/')
      +            return (this.#fullpathPosix = this.fullpath());
      +        if (!this.parent) {
      +            const p = this.fullpath().replace(/\\/g, '/');
      +            if (/^[a-z]:\//i.test(p)) {
      +                return (this.#fullpathPosix = `//?/${p}`);
      +            }
      +            else {
      +                return (this.#fullpathPosix = p);
      +            }
      +        }
      +        const p = this.parent;
      +        const pfpp = p.fullpathPosix();
      +        const fpp = pfpp + (!pfpp || !p.parent ? '' : '/') + this.name;
      +        return (this.#fullpathPosix = fpp);
      +    }
      +    /**
      +     * Is the Path of an unknown type?
      +     *
      +     * Note that we might know *something* about it if there has been a previous
      +     * filesystem operation, for example that it does not exist, or is not a
      +     * link, or whether it has child entries.
      +     */
      +    isUnknown() {
      +        return (this.#type & IFMT) === UNKNOWN;
      +    }
      +    isType(type) {
      +        return this[`is${type}`]();
      +    }
      +    getType() {
      +        return (this.isUnknown() ? 'Unknown'
      +            : this.isDirectory() ? 'Directory'
      +                : this.isFile() ? 'File'
      +                    : this.isSymbolicLink() ? 'SymbolicLink'
      +                        : this.isFIFO() ? 'FIFO'
      +                            : this.isCharacterDevice() ? 'CharacterDevice'
      +                                : this.isBlockDevice() ? 'BlockDevice'
      +                                    : /* c8 ignore start */ this.isSocket() ? 'Socket'
      +                                        : 'Unknown');
      +        /* c8 ignore stop */
      +    }
      +    /**
      +     * Is the Path a regular file?
      +     */
      +    isFile() {
      +        return (this.#type & IFMT) === IFREG;
      +    }
      +    /**
      +     * Is the Path a directory?
      +     */
      +    isDirectory() {
      +        return (this.#type & IFMT) === IFDIR;
      +    }
      +    /**
      +     * Is the path a character device?
      +     */
      +    isCharacterDevice() {
      +        return (this.#type & IFMT) === IFCHR;
      +    }
      +    /**
      +     * Is the path a block device?
      +     */
      +    isBlockDevice() {
      +        return (this.#type & IFMT) === IFBLK;
      +    }
      +    /**
      +     * Is the path a FIFO pipe?
      +     */
      +    isFIFO() {
      +        return (this.#type & IFMT) === IFIFO;
      +    }
      +    /**
      +     * Is the path a socket?
      +     */
      +    isSocket() {
      +        return (this.#type & IFMT) === IFSOCK;
      +    }
      +    /**
      +     * Is the path a symbolic link?
      +     */
      +    isSymbolicLink() {
      +        return (this.#type & IFLNK) === IFLNK;
      +    }
      +    /**
      +     * Return the entry if it has been subject of a successful lstat, or
      +     * undefined otherwise.
      +     *
      +     * Does not read the filesystem, so an undefined result *could* simply
      +     * mean that we haven't called lstat on it.
      +     */
      +    lstatCached() {
      +        return this.#type & LSTAT_CALLED ? this : undefined;
      +    }
      +    /**
      +     * Return the cached link target if the entry has been the subject of a
      +     * successful readlink, or undefined otherwise.
      +     *
      +     * Does not read the filesystem, so an undefined result *could* just mean we
      +     * don't have any cached data. Only use it if you are very sure that a
      +     * readlink() has been called at some point.
      +     */
      +    readlinkCached() {
      +        return this.#linkTarget;
      +    }
      +    /**
      +     * Returns the cached realpath target if the entry has been the subject
      +     * of a successful realpath, or undefined otherwise.
      +     *
      +     * Does not read the filesystem, so an undefined result *could* just mean we
      +     * don't have any cached data. Only use it if you are very sure that a
      +     * realpath() has been called at some point.
      +     */
      +    realpathCached() {
      +        return this.#realpath;
      +    }
      +    /**
      +     * Returns the cached child Path entries array if the entry has been the
      +     * subject of a successful readdir(), or [] otherwise.
      +     *
      +     * Does not read the filesystem, so an empty array *could* just mean we
      +     * don't have any cached data. Only use it if you are very sure that a
      +     * readdir() has been called recently enough to still be valid.
      +     */
      +    readdirCached() {
      +        const children = this.children();
      +        return children.slice(0, children.provisional);
      +    }
      +    /**
      +     * Return true if it's worth trying to readlink.  Ie, we don't (yet) have
      +     * any indication that readlink will definitely fail.
      +     *
      +     * Returns false if the path is known to not be a symlink, if a previous
      +     * readlink failed, or if the entry does not exist.
      +     */
      +    canReadlink() {
      +        if (this.#linkTarget)
      +            return true;
      +        if (!this.parent)
      +            return false;
      +        // cases where it cannot possibly succeed
      +        const ifmt = this.#type & IFMT;
      +        return !((ifmt !== UNKNOWN && ifmt !== IFLNK) ||
      +            this.#type & ENOREADLINK ||
      +            this.#type & ENOENT);
      +    }
      +    /**
      +     * Return true if readdir has previously been successfully called on this
      +     * path, indicating that cachedReaddir() is likely valid.
      +     */
      +    calledReaddir() {
      +        return !!(this.#type & READDIR_CALLED);
      +    }
      +    /**
      +     * Returns true if the path is known to not exist. That is, a previous lstat
      +     * or readdir failed to verify its existence when that would have been
      +     * expected, or a parent entry was marked either enoent or enotdir.
      +     */
      +    isENOENT() {
      +        return !!(this.#type & ENOENT);
      +    }
      +    /**
      +     * Return true if the path is a match for the given path name.  This handles
      +     * case sensitivity and unicode normalization.
      +     *
      +     * Note: even on case-sensitive systems, it is **not** safe to test the
      +     * equality of the `.name` property to determine whether a given pathname
      +     * matches, due to unicode normalization mismatches.
      +     *
      +     * Always use this method instead of testing the `path.name` property
      +     * directly.
      +     */
      +    isNamed(n) {
      +        return !this.nocase ?
      +            this.#matchName === normalize(n)
      +            : this.#matchName === normalizeNocase(n);
      +    }
      +    /**
      +     * Return the Path object corresponding to the target of a symbolic link.
      +     *
      +     * If the Path is not a symbolic link, or if the readlink call fails for any
      +     * reason, `undefined` is returned.
      +     *
      +     * Result is cached, and thus may be outdated if the filesystem is mutated.
      +     */
      +    async readlink() {
      +        const target = this.#linkTarget;
      +        if (target) {
      +            return target;
      +        }
      +        if (!this.canReadlink()) {
      +            return undefined;
      +        }
      +        /* c8 ignore start */
      +        // already covered by the canReadlink test, here for ts grumples
      +        if (!this.parent) {
      +            return undefined;
      +        }
      +        /* c8 ignore stop */
      +        try {
      +            const read = await this.#fs.promises.readlink(this.fullpath());
      +            const linkTarget = (await this.parent.realpath())?.resolve(read);
      +            if (linkTarget) {
      +                return (this.#linkTarget = linkTarget);
      +            }
      +        }
      +        catch (er) {
      +            this.#readlinkFail(er.code);
      +            return undefined;
      +        }
      +    }
      +    /**
      +     * Synchronous {@link PathBase.readlink}
      +     */
      +    readlinkSync() {
      +        const target = this.#linkTarget;
      +        if (target) {
      +            return target;
      +        }
      +        if (!this.canReadlink()) {
      +            return undefined;
      +        }
      +        /* c8 ignore start */
      +        // already covered by the canReadlink test, here for ts grumples
      +        if (!this.parent) {
      +            return undefined;
      +        }
      +        /* c8 ignore stop */
      +        try {
      +            const read = this.#fs.readlinkSync(this.fullpath());
      +            const linkTarget = this.parent.realpathSync()?.resolve(read);
      +            if (linkTarget) {
      +                return (this.#linkTarget = linkTarget);
      +            }
      +        }
      +        catch (er) {
      +            this.#readlinkFail(er.code);
      +            return undefined;
      +        }
      +    }
      +    #readdirSuccess(children) {
      +        // succeeded, mark readdir called bit
      +        this.#type |= READDIR_CALLED;
      +        // mark all remaining provisional children as ENOENT
      +        for (let p = children.provisional; p < children.length; p++) {
      +            const c = children[p];
      +            if (c)
      +                c.#markENOENT();
      +        }
      +    }
      +    #markENOENT() {
      +        // mark as UNKNOWN and ENOENT
      +        if (this.#type & ENOENT)
      +            return;
      +        this.#type = (this.#type | ENOENT) & IFMT_UNKNOWN;
      +        this.#markChildrenENOENT();
      +    }
      +    #markChildrenENOENT() {
      +        // all children are provisional and do not exist
      +        const children = this.children();
      +        children.provisional = 0;
      +        for (const p of children) {
      +            p.#markENOENT();
      +        }
      +    }
      +    #markENOREALPATH() {
      +        this.#type |= ENOREALPATH;
      +        this.#markENOTDIR();
      +    }
      +    // save the information when we know the entry is not a dir
      +    #markENOTDIR() {
      +        // entry is not a directory, so any children can't exist.
      +        // this *should* be impossible, since any children created
      +        // after it's been marked ENOTDIR should be marked ENOENT,
      +        // so it won't even get to this point.
      +        /* c8 ignore start */
      +        if (this.#type & ENOTDIR)
      +            return;
      +        /* c8 ignore stop */
      +        let t = this.#type;
      +        // this could happen if we stat a dir, then delete it,
      +        // then try to read it or one of its children.
      +        if ((t & IFMT) === IFDIR)
      +            t &= IFMT_UNKNOWN;
      +        this.#type = t | ENOTDIR;
      +        this.#markChildrenENOENT();
      +    }
      +    #readdirFail(code = '') {
      +        // markENOTDIR and markENOENT also set provisional=0
      +        if (code === 'ENOTDIR' || code === 'EPERM') {
      +            this.#markENOTDIR();
      +        }
      +        else if (code === 'ENOENT') {
      +            this.#markENOENT();
      +        }
      +        else {
      +            this.children().provisional = 0;
      +        }
      +    }
      +    #lstatFail(code = '') {
      +        // Windows just raises ENOENT in this case, disable for win CI
      +        /* c8 ignore start */
      +        if (code === 'ENOTDIR') {
      +            // already know it has a parent by this point
      +            const p = this.parent;
      +            p.#markENOTDIR();
      +        }
      +        else if (code === 'ENOENT') {
      +            /* c8 ignore stop */
      +            this.#markENOENT();
      +        }
      +    }
      +    #readlinkFail(code = '') {
      +        let ter = this.#type;
      +        ter |= ENOREADLINK;
      +        if (code === 'ENOENT')
      +            ter |= ENOENT;
      +        // windows gets a weird error when you try to readlink a file
      +        if (code === 'EINVAL' || code === 'UNKNOWN') {
      +            // exists, but not a symlink, we don't know WHAT it is, so remove
      +            // all IFMT bits.
      +            ter &= IFMT_UNKNOWN;
      +        }
      +        this.#type = ter;
      +        // windows just gets ENOENT in this case.  We do cover the case,
      +        // just disabled because it's impossible on Windows CI
      +        /* c8 ignore start */
      +        if (code === 'ENOTDIR' && this.parent) {
      +            this.parent.#markENOTDIR();
      +        }
      +        /* c8 ignore stop */
      +    }
      +    #readdirAddChild(e, c) {
      +        return (this.#readdirMaybePromoteChild(e, c) ||
      +            this.#readdirAddNewChild(e, c));
      +    }
      +    #readdirAddNewChild(e, c) {
      +        // alloc new entry at head, so it's never provisional
      +        const type = entToType(e);
      +        const child = this.newChild(e.name, type, { parent: this });
      +        const ifmt = child.#type & IFMT;
      +        if (ifmt !== IFDIR && ifmt !== IFLNK && ifmt !== UNKNOWN) {
      +            child.#type |= ENOTDIR;
      +        }
      +        c.unshift(child);
      +        c.provisional++;
      +        return child;
      +    }
      +    #readdirMaybePromoteChild(e, c) {
      +        for (let p = c.provisional; p < c.length; p++) {
      +            const pchild = c[p];
      +            const name = this.nocase ? normalizeNocase(e.name) : normalize(e.name);
      +            if (name !== pchild.#matchName) {
      +                continue;
      +            }
      +            return this.#readdirPromoteChild(e, pchild, p, c);
      +        }
      +    }
      +    #readdirPromoteChild(e, p, index, c) {
      +        const v = p.name;
      +        // retain any other flags, but set ifmt from dirent
      +        p.#type = (p.#type & IFMT_UNKNOWN) | entToType(e);
      +        // case sensitivity fixing when we learn the true name.
      +        if (v !== e.name)
      +            p.name = e.name;
      +        // just advance provisional index (potentially off the list),
      +        // otherwise we have to splice/pop it out and re-insert at head
      +        if (index !== c.provisional) {
      +            if (index === c.length - 1)
      +                c.pop();
      +            else
      +                c.splice(index, 1);
      +            c.unshift(p);
      +        }
      +        c.provisional++;
      +        return p;
      +    }
      +    /**
      +     * Call lstat() on this Path, and update all known information that can be
      +     * determined.
      +     *
      +     * Note that unlike `fs.lstat()`, the returned value does not contain some
      +     * information, such as `mode`, `dev`, `nlink`, and `ino`.  If that
      +     * information is required, you will need to call `fs.lstat` yourself.
      +     *
      +     * If the Path refers to a nonexistent file, or if the lstat call fails for
      +     * any reason, `undefined` is returned.  Otherwise the updated Path object is
      +     * returned.
      +     *
      +     * Results are cached, and thus may be out of date if the filesystem is
      +     * mutated.
      +     */
      +    async lstat() {
      +        if ((this.#type & ENOENT) === 0) {
      +            try {
      +                this.#applyStat(await this.#fs.promises.lstat(this.fullpath()));
      +                return this;
      +            }
      +            catch (er) {
      +                this.#lstatFail(er.code);
      +            }
      +        }
      +    }
      +    /**
      +     * synchronous {@link PathBase.lstat}
      +     */
      +    lstatSync() {
      +        if ((this.#type & ENOENT) === 0) {
      +            try {
      +                this.#applyStat(this.#fs.lstatSync(this.fullpath()));
      +                return this;
      +            }
      +            catch (er) {
      +                this.#lstatFail(er.code);
      +            }
      +        }
      +    }
      +    #applyStat(st) {
      +        const { atime, atimeMs, birthtime, birthtimeMs, blksize, blocks, ctime, ctimeMs, dev, gid, ino, mode, mtime, mtimeMs, nlink, rdev, size, uid, } = st;
      +        this.#atime = atime;
      +        this.#atimeMs = atimeMs;
      +        this.#birthtime = birthtime;
      +        this.#birthtimeMs = birthtimeMs;
      +        this.#blksize = blksize;
      +        this.#blocks = blocks;
      +        this.#ctime = ctime;
      +        this.#ctimeMs = ctimeMs;
      +        this.#dev = dev;
      +        this.#gid = gid;
      +        this.#ino = ino;
      +        this.#mode = mode;
      +        this.#mtime = mtime;
      +        this.#mtimeMs = mtimeMs;
      +        this.#nlink = nlink;
      +        this.#rdev = rdev;
      +        this.#size = size;
      +        this.#uid = uid;
      +        const ifmt = entToType(st);
      +        // retain any other flags, but set the ifmt
      +        this.#type = (this.#type & IFMT_UNKNOWN) | ifmt | LSTAT_CALLED;
      +        if (ifmt !== UNKNOWN && ifmt !== IFDIR && ifmt !== IFLNK) {
      +            this.#type |= ENOTDIR;
      +        }
      +    }
      +    #onReaddirCB = [];
      +    #readdirCBInFlight = false;
      +    #callOnReaddirCB(children) {
      +        this.#readdirCBInFlight = false;
      +        const cbs = this.#onReaddirCB.slice();
      +        this.#onReaddirCB.length = 0;
      +        cbs.forEach(cb => cb(null, children));
      +    }
      +    /**
      +     * Standard node-style callback interface to get list of directory entries.
      +     *
      +     * If the Path cannot or does not contain any children, then an empty array
      +     * is returned.
      +     *
      +     * Results are cached, and thus may be out of date if the filesystem is
      +     * mutated.
      +     *
      +     * @param cb The callback called with (er, entries).  Note that the `er`
      +     * param is somewhat extraneous, as all readdir() errors are handled and
      +     * simply result in an empty set of entries being returned.
      +     * @param allowZalgo Boolean indicating that immediately known results should
      +     * *not* be deferred with `queueMicrotask`. Defaults to `false`. Release
      +     * zalgo at your peril, the dark pony lord is devious and unforgiving.
      +     */
      +    readdirCB(cb, allowZalgo = false) {
      +        if (!this.canReaddir()) {
      +            if (allowZalgo)
      +                cb(null, []);
      +            else
      +                queueMicrotask(() => cb(null, []));
      +            return;
      +        }
      +        const children = this.children();
      +        if (this.calledReaddir()) {
      +            const c = children.slice(0, children.provisional);
      +            if (allowZalgo)
      +                cb(null, c);
      +            else
      +                queueMicrotask(() => cb(null, c));
      +            return;
      +        }
      +        // don't have to worry about zalgo at this point.
      +        this.#onReaddirCB.push(cb);
      +        if (this.#readdirCBInFlight) {
      +            return;
      +        }
      +        this.#readdirCBInFlight = true;
      +        // else read the directory, fill up children
      +        // de-provisionalize any provisional children.
      +        const fullpath = this.fullpath();
      +        this.#fs.readdir(fullpath, { withFileTypes: true }, (er, entries) => {
      +            if (er) {
      +                this.#readdirFail(er.code);
      +                children.provisional = 0;
      +            }
      +            else {
      +                // if we didn't get an error, we always get entries.
      +                //@ts-ignore
      +                for (const e of entries) {
      +                    this.#readdirAddChild(e, children);
      +                }
      +                this.#readdirSuccess(children);
      +            }
      +            this.#callOnReaddirCB(children.slice(0, children.provisional));
      +            return;
      +        });
      +    }
      +    #asyncReaddirInFlight;
      +    /**
      +     * Return an array of known child entries.
      +     *
      +     * If the Path cannot or does not contain any children, then an empty array
      +     * is returned.
      +     *
      +     * Results are cached, and thus may be out of date if the filesystem is
      +     * mutated.
      +     */
      +    async readdir() {
      +        if (!this.canReaddir()) {
      +            return [];
      +        }
      +        const children = this.children();
      +        if (this.calledReaddir()) {
      +            return children.slice(0, children.provisional);
      +        }
      +        // else read the directory, fill up children
      +        // de-provisionalize any provisional children.
      +        const fullpath = this.fullpath();
      +        if (this.#asyncReaddirInFlight) {
      +            await this.#asyncReaddirInFlight;
      +        }
      +        else {
      +            /* c8 ignore start */
      +            let resolve = () => { };
      +            /* c8 ignore stop */
      +            this.#asyncReaddirInFlight = new Promise(res => (resolve = res));
      +            try {
      +                for (const e of await this.#fs.promises.readdir(fullpath, {
      +                    withFileTypes: true,
      +                })) {
      +                    this.#readdirAddChild(e, children);
      +                }
      +                this.#readdirSuccess(children);
      +            }
      +            catch (er) {
      +                this.#readdirFail(er.code);
      +                children.provisional = 0;
      +            }
      +            this.#asyncReaddirInFlight = undefined;
      +            resolve();
      +        }
      +        return children.slice(0, children.provisional);
      +    }
      +    /**
      +     * synchronous {@link PathBase.readdir}
      +     */
      +    readdirSync() {
      +        if (!this.canReaddir()) {
      +            return [];
      +        }
      +        const children = this.children();
      +        if (this.calledReaddir()) {
      +            return children.slice(0, children.provisional);
      +        }
      +        // else read the directory, fill up children
      +        // de-provisionalize any provisional children.
      +        const fullpath = this.fullpath();
      +        try {
      +            for (const e of this.#fs.readdirSync(fullpath, {
      +                withFileTypes: true,
      +            })) {
      +                this.#readdirAddChild(e, children);
      +            }
      +            this.#readdirSuccess(children);
      +        }
      +        catch (er) {
      +            this.#readdirFail(er.code);
      +            children.provisional = 0;
      +        }
      +        return children.slice(0, children.provisional);
      +    }
      +    canReaddir() {
      +        if (this.#type & ENOCHILD)
      +            return false;
      +        const ifmt = IFMT & this.#type;
      +        // we always set ENOTDIR when setting IFMT, so should be impossible
      +        /* c8 ignore start */
      +        if (!(ifmt === UNKNOWN || ifmt === IFDIR || ifmt === IFLNK)) {
      +            return false;
      +        }
      +        /* c8 ignore stop */
      +        return true;
      +    }
      +    shouldWalk(dirs, walkFilter) {
      +        return ((this.#type & IFDIR) === IFDIR &&
      +            !(this.#type & ENOCHILD) &&
      +            !dirs.has(this) &&
      +            (!walkFilter || walkFilter(this)));
      +    }
      +    /**
      +     * Return the Path object corresponding to path as resolved
      +     * by realpath(3).
      +     *
      +     * If the realpath call fails for any reason, `undefined` is returned.
      +     *
      +     * Result is cached, and thus may be outdated if the filesystem is mutated.
      +     * On success, returns a Path object.
      +     */
      +    async realpath() {
      +        if (this.#realpath)
      +            return this.#realpath;
      +        if ((ENOREALPATH | ENOREADLINK | ENOENT) & this.#type)
      +            return undefined;
      +        try {
      +            const rp = await this.#fs.promises.realpath(this.fullpath());
      +            return (this.#realpath = this.resolve(rp));
      +        }
      +        catch (_) {
      +            this.#markENOREALPATH();
      +        }
      +    }
      +    /**
      +     * Synchronous {@link realpath}
      +     */
      +    realpathSync() {
      +        if (this.#realpath)
      +            return this.#realpath;
      +        if ((ENOREALPATH | ENOREADLINK | ENOENT) & this.#type)
      +            return undefined;
      +        try {
      +            const rp = this.#fs.realpathSync(this.fullpath());
      +            return (this.#realpath = this.resolve(rp));
      +        }
      +        catch (_) {
      +            this.#markENOREALPATH();
      +        }
      +    }
      +    /**
      +     * Internal method to mark this Path object as the scurry cwd,
      +     * called by {@link PathScurry#chdir}
      +     *
      +     * @internal
      +     */
      +    [setAsCwd](oldCwd) {
      +        if (oldCwd === this)
      +            return;
      +        oldCwd.isCWD = false;
      +        this.isCWD = true;
      +        const changed = new Set([]);
      +        let rp = [];
      +        let p = this;
      +        while (p && p.parent) {
      +            changed.add(p);
      +            p.#relative = rp.join(this.sep);
      +            p.#relativePosix = rp.join('/');
      +            p = p.parent;
      +            rp.push('..');
      +        }
      +        // now un-memoize parents of old cwd
      +        p = oldCwd;
      +        while (p && p.parent && !changed.has(p)) {
      +            p.#relative = undefined;
      +            p.#relativePosix = undefined;
      +            p = p.parent;
      +        }
      +    }
      +}
      +/**
      + * Path class used on win32 systems
      + *
      + * Uses `'\\'` as the path separator for returned paths, either `'\\'` or `'/'`
      + * as the path separator for parsing paths.
      + */
      +export class PathWin32 extends PathBase {
      +    /**
      +     * Separator for generating path strings.
      +     */
      +    sep = '\\';
      +    /**
      +     * Separator for parsing path strings.
      +     */
      +    splitSep = eitherSep;
      +    /**
      +     * Do not create new Path objects directly.  They should always be accessed
      +     * via the PathScurry class or other methods on the Path class.
      +     *
      +     * @internal
      +     */
      +    constructor(name, type = UNKNOWN, root, roots, nocase, children, opts) {
      +        super(name, type, root, roots, nocase, children, opts);
      +    }
      +    /**
      +     * @internal
      +     */
      +    newChild(name, type = UNKNOWN, opts = {}) {
      +        return new PathWin32(name, type, this.root, this.roots, this.nocase, this.childrenCache(), opts);
      +    }
      +    /**
      +     * @internal
      +     */
      +    getRootString(path) {
      +        return win32.parse(path).root;
      +    }
      +    /**
      +     * @internal
      +     */
      +    getRoot(rootPath) {
      +        rootPath = uncToDrive(rootPath.toUpperCase());
      +        if (rootPath === this.root.name) {
      +            return this.root;
      +        }
      +        // ok, not that one, check if it matches another we know about
      +        for (const [compare, root] of Object.entries(this.roots)) {
      +            if (this.sameRoot(rootPath, compare)) {
      +                return (this.roots[rootPath] = root);
      +            }
      +        }
      +        // otherwise, have to create a new one.
      +        return (this.roots[rootPath] = new PathScurryWin32(rootPath, this).root);
      +    }
      +    /**
      +     * @internal
      +     */
      +    sameRoot(rootPath, compare = this.root.name) {
      +        // windows can (rarely) have case-sensitive filesystem, but
      +        // UNC and drive letters are always case-insensitive, and canonically
      +        // represented uppercase.
      +        rootPath = rootPath
      +            .toUpperCase()
      +            .replace(/\//g, '\\')
      +            .replace(uncDriveRegexp, '$1\\');
      +        return rootPath === compare;
      +    }
      +}
      +/**
      + * Path class used on all posix systems.
      + *
      + * Uses `'/'` as the path separator.
      + */
      +export class PathPosix extends PathBase {
      +    /**
      +     * separator for parsing path strings
      +     */
      +    splitSep = '/';
      +    /**
      +     * separator for generating path strings
      +     */
      +    sep = '/';
      +    /**
      +     * Do not create new Path objects directly.  They should always be accessed
      +     * via the PathScurry class or other methods on the Path class.
      +     *
      +     * @internal
      +     */
      +    constructor(name, type = UNKNOWN, root, roots, nocase, children, opts) {
      +        super(name, type, root, roots, nocase, children, opts);
      +    }
      +    /**
      +     * @internal
      +     */
      +    getRootString(path) {
      +        return path.startsWith('/') ? '/' : '';
      +    }
      +    /**
      +     * @internal
      +     */
      +    getRoot(_rootPath) {
      +        return this.root;
      +    }
      +    /**
      +     * @internal
      +     */
      +    newChild(name, type = UNKNOWN, opts = {}) {
      +        return new PathPosix(name, type, this.root, this.roots, this.nocase, this.childrenCache(), opts);
      +    }
      +}
      +/**
      + * The base class for all PathScurry classes, providing the interface for path
      + * resolution and filesystem operations.
      + *
      + * Typically, you should *not* instantiate this class directly, but rather one
      + * of the platform-specific classes, or the exported {@link PathScurry} which
      + * defaults to the current platform.
      + */
      +export class PathScurryBase {
      +    /**
      +     * The root Path entry for the current working directory of this Scurry
      +     */
      +    root;
      +    /**
      +     * The string path for the root of this Scurry's current working directory
      +     */
      +    rootPath;
      +    /**
      +     * A collection of all roots encountered, referenced by rootPath
      +     */
      +    roots;
      +    /**
      +     * The Path entry corresponding to this PathScurry's current working directory.
      +     */
      +    cwd;
      +    #resolveCache;
      +    #resolvePosixCache;
      +    #children;
      +    /**
      +     * Perform path comparisons case-insensitively.
      +     *
      +     * Defaults true on Darwin and Windows systems, false elsewhere.
      +     */
      +    nocase;
      +    #fs;
      +    /**
      +     * This class should not be instantiated directly.
      +     *
      +     * Use PathScurryWin32, PathScurryDarwin, PathScurryPosix, or PathScurry
      +     *
      +     * @internal
      +     */
      +    constructor(cwd = process.cwd(), pathImpl, sep, { nocase, childrenCacheSize = 16 * 1024, fs = defaultFS, } = {}) {
      +        this.#fs = fsFromOption(fs);
      +        if (cwd instanceof URL || cwd.startsWith('file://')) {
      +            cwd = fileURLToPath(cwd);
      +        }
      +        // resolve and split root, and then add to the store.
      +        // this is the only time we call path.resolve()
      +        const cwdPath = pathImpl.resolve(cwd);
      +        this.roots = Object.create(null);
      +        this.rootPath = this.parseRootPath(cwdPath);
      +        this.#resolveCache = new ResolveCache();
      +        this.#resolvePosixCache = new ResolveCache();
      +        this.#children = new ChildrenCache(childrenCacheSize);
      +        const split = cwdPath.substring(this.rootPath.length).split(sep);
      +        // resolve('/') leaves '', splits to [''], we don't want that.
      +        if (split.length === 1 && !split[0]) {
      +            split.pop();
      +        }
      +        /* c8 ignore start */
      +        if (nocase === undefined) {
      +            throw new TypeError('must provide nocase setting to PathScurryBase ctor');
      +        }
      +        /* c8 ignore stop */
      +        this.nocase = nocase;
      +        this.root = this.newRoot(this.#fs);
      +        this.roots[this.rootPath] = this.root;
      +        let prev = this.root;
      +        let len = split.length - 1;
      +        const joinSep = pathImpl.sep;
      +        let abs = this.rootPath;
      +        let sawFirst = false;
      +        for (const part of split) {
      +            const l = len--;
      +            prev = prev.child(part, {
      +                relative: new Array(l).fill('..').join(joinSep),
      +                relativePosix: new Array(l).fill('..').join('/'),
      +                fullpath: (abs += (sawFirst ? '' : joinSep) + part),
      +            });
      +            sawFirst = true;
      +        }
      +        this.cwd = prev;
      +    }
      +    /**
      +     * Get the depth of a provided path, string, or the cwd
      +     */
      +    depth(path = this.cwd) {
      +        if (typeof path === 'string') {
      +            path = this.cwd.resolve(path);
      +        }
      +        return path.depth();
      +    }
      +    /**
      +     * Return the cache of child entries.  Exposed so subclasses can create
      +     * child Path objects in a platform-specific way.
      +     *
      +     * @internal
      +     */
      +    childrenCache() {
      +        return this.#children;
      +    }
      +    /**
      +     * Resolve one or more path strings to a resolved string
      +     *
      +     * Same interface as require('path').resolve.
      +     *
      +     * Much faster than path.resolve() when called multiple times for the same
      +     * path, because the resolved Path objects are cached.  Much slower
      +     * otherwise.
      +     */
      +    resolve(...paths) {
      +        // first figure out the minimum number of paths we have to test
      +        // we always start at cwd, but any absolutes will bump the start
      +        let r = '';
      +        for (let i = paths.length - 1; i >= 0; i--) {
      +            const p = paths[i];
      +            if (!p || p === '.')
      +                continue;
      +            r = r ? `${p}/${r}` : p;
      +            if (this.isAbsolute(p)) {
      +                break;
      +            }
      +        }
      +        const cached = this.#resolveCache.get(r);
      +        if (cached !== undefined) {
      +            return cached;
      +        }
      +        const result = this.cwd.resolve(r).fullpath();
      +        this.#resolveCache.set(r, result);
      +        return result;
      +    }
      +    /**
      +     * Resolve one or more path strings to a resolved string, returning
      +     * the posix path.  Identical to .resolve() on posix systems, but on
      +     * windows will return a forward-slash separated UNC path.
      +     *
      +     * Same interface as require('path').resolve.
      +     *
      +     * Much faster than path.resolve() when called multiple times for the same
      +     * path, because the resolved Path objects are cached.  Much slower
      +     * otherwise.
      +     */
      +    resolvePosix(...paths) {
      +        // first figure out the minimum number of paths we have to test
      +        // we always start at cwd, but any absolutes will bump the start
      +        let r = '';
      +        for (let i = paths.length - 1; i >= 0; i--) {
      +            const p = paths[i];
      +            if (!p || p === '.')
      +                continue;
      +            r = r ? `${p}/${r}` : p;
      +            if (this.isAbsolute(p)) {
      +                break;
      +            }
      +        }
      +        const cached = this.#resolvePosixCache.get(r);
      +        if (cached !== undefined) {
      +            return cached;
      +        }
      +        const result = this.cwd.resolve(r).fullpathPosix();
      +        this.#resolvePosixCache.set(r, result);
      +        return result;
      +    }
      +    /**
      +     * find the relative path from the cwd to the supplied path string or entry
      +     */
      +    relative(entry = this.cwd) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        return entry.relative();
      +    }
      +    /**
      +     * find the relative path from the cwd to the supplied path string or
      +     * entry, using / as the path delimiter, even on Windows.
      +     */
      +    relativePosix(entry = this.cwd) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        return entry.relativePosix();
      +    }
      +    /**
      +     * Return the basename for the provided string or Path object
      +     */
      +    basename(entry = this.cwd) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        return entry.name;
      +    }
      +    /**
      +     * Return the dirname for the provided string or Path object
      +     */
      +    dirname(entry = this.cwd) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        return (entry.parent || entry).fullpath();
      +    }
      +    async readdir(entry = this.cwd, opts = {
      +        withFileTypes: true,
      +    }) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        else if (!(entry instanceof PathBase)) {
      +            opts = entry;
      +            entry = this.cwd;
      +        }
      +        const { withFileTypes } = opts;
      +        if (!entry.canReaddir()) {
      +            return [];
      +        }
      +        else {
      +            const p = await entry.readdir();
      +            return withFileTypes ? p : p.map(e => e.name);
      +        }
      +    }
      +    readdirSync(entry = this.cwd, opts = {
      +        withFileTypes: true,
      +    }) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        else if (!(entry instanceof PathBase)) {
      +            opts = entry;
      +            entry = this.cwd;
      +        }
      +        const { withFileTypes = true } = opts;
      +        if (!entry.canReaddir()) {
      +            return [];
      +        }
      +        else if (withFileTypes) {
      +            return entry.readdirSync();
      +        }
      +        else {
      +            return entry.readdirSync().map(e => e.name);
      +        }
      +    }
      +    /**
      +     * Call lstat() on the string or Path object, and update all known
      +     * information that can be determined.
      +     *
      +     * Note that unlike `fs.lstat()`, the returned value does not contain some
      +     * information, such as `mode`, `dev`, `nlink`, and `ino`.  If that
      +     * information is required, you will need to call `fs.lstat` yourself.
      +     *
      +     * If the Path refers to a nonexistent file, or if the lstat call fails for
      +     * any reason, `undefined` is returned.  Otherwise the updated Path object is
      +     * returned.
      +     *
      +     * Results are cached, and thus may be out of date if the filesystem is
      +     * mutated.
      +     */
      +    async lstat(entry = this.cwd) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        return entry.lstat();
      +    }
      +    /**
      +     * synchronous {@link PathScurryBase.lstat}
      +     */
      +    lstatSync(entry = this.cwd) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        return entry.lstatSync();
      +    }
      +    async readlink(entry = this.cwd, { withFileTypes } = {
      +        withFileTypes: false,
      +    }) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        else if (!(entry instanceof PathBase)) {
      +            withFileTypes = entry.withFileTypes;
      +            entry = this.cwd;
      +        }
      +        const e = await entry.readlink();
      +        return withFileTypes ? e : e?.fullpath();
      +    }
      +    readlinkSync(entry = this.cwd, { withFileTypes } = {
      +        withFileTypes: false,
      +    }) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        else if (!(entry instanceof PathBase)) {
      +            withFileTypes = entry.withFileTypes;
      +            entry = this.cwd;
      +        }
      +        const e = entry.readlinkSync();
      +        return withFileTypes ? e : e?.fullpath();
      +    }
      +    async realpath(entry = this.cwd, { withFileTypes } = {
      +        withFileTypes: false,
      +    }) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        else if (!(entry instanceof PathBase)) {
      +            withFileTypes = entry.withFileTypes;
      +            entry = this.cwd;
      +        }
      +        const e = await entry.realpath();
      +        return withFileTypes ? e : e?.fullpath();
      +    }
      +    realpathSync(entry = this.cwd, { withFileTypes } = {
      +        withFileTypes: false,
      +    }) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        else if (!(entry instanceof PathBase)) {
      +            withFileTypes = entry.withFileTypes;
      +            entry = this.cwd;
      +        }
      +        const e = entry.realpathSync();
      +        return withFileTypes ? e : e?.fullpath();
      +    }
      +    async walk(entry = this.cwd, opts = {}) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        else if (!(entry instanceof PathBase)) {
      +            opts = entry;
      +            entry = this.cwd;
      +        }
      +        const { withFileTypes = true, follow = false, filter, walkFilter, } = opts;
      +        const results = [];
      +        if (!filter || filter(entry)) {
      +            results.push(withFileTypes ? entry : entry.fullpath());
      +        }
      +        const dirs = new Set();
      +        const walk = (dir, cb) => {
      +            dirs.add(dir);
      +            dir.readdirCB((er, entries) => {
      +                /* c8 ignore start */
      +                if (er) {
      +                    return cb(er);
      +                }
      +                /* c8 ignore stop */
      +                let len = entries.length;
      +                if (!len)
      +                    return cb();
      +                const next = () => {
      +                    if (--len === 0) {
      +                        cb();
      +                    }
      +                };
      +                for (const e of entries) {
      +                    if (!filter || filter(e)) {
      +                        results.push(withFileTypes ? e : e.fullpath());
      +                    }
      +                    if (follow && e.isSymbolicLink()) {
      +                        e.realpath()
      +                            .then(r => (r?.isUnknown() ? r.lstat() : r))
      +                            .then(r => r?.shouldWalk(dirs, walkFilter) ? walk(r, next) : next());
      +                    }
      +                    else {
      +                        if (e.shouldWalk(dirs, walkFilter)) {
      +                            walk(e, next);
      +                        }
      +                        else {
      +                            next();
      +                        }
      +                    }
      +                }
      +            }, true); // zalgooooooo
      +        };
      +        const start = entry;
      +        return new Promise((res, rej) => {
      +            walk(start, er => {
      +                /* c8 ignore start */
      +                if (er)
      +                    return rej(er);
      +                /* c8 ignore stop */
      +                res(results);
      +            });
      +        });
      +    }
      +    walkSync(entry = this.cwd, opts = {}) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        else if (!(entry instanceof PathBase)) {
      +            opts = entry;
      +            entry = this.cwd;
      +        }
      +        const { withFileTypes = true, follow = false, filter, walkFilter, } = opts;
      +        const results = [];
      +        if (!filter || filter(entry)) {
      +            results.push(withFileTypes ? entry : entry.fullpath());
      +        }
      +        const dirs = new Set([entry]);
      +        for (const dir of dirs) {
      +            const entries = dir.readdirSync();
      +            for (const e of entries) {
      +                if (!filter || filter(e)) {
      +                    results.push(withFileTypes ? e : e.fullpath());
      +                }
      +                let r = e;
      +                if (e.isSymbolicLink()) {
      +                    if (!(follow && (r = e.realpathSync())))
      +                        continue;
      +                    if (r.isUnknown())
      +                        r.lstatSync();
      +                }
      +                if (r.shouldWalk(dirs, walkFilter)) {
      +                    dirs.add(r);
      +                }
      +            }
      +        }
      +        return results;
      +    }
      +    /**
      +     * Support for `for await`
      +     *
      +     * Alias for {@link PathScurryBase.iterate}
      +     *
      +     * Note: As of Node 19, this is very slow, compared to other methods of
      +     * walking.  Consider using {@link PathScurryBase.stream} if memory overhead
      +     * and backpressure are concerns, or {@link PathScurryBase.walk} if not.
      +     */
      +    [Symbol.asyncIterator]() {
      +        return this.iterate();
      +    }
      +    iterate(entry = this.cwd, options = {}) {
      +        // iterating async over the stream is significantly more performant,
      +        // especially in the warm-cache scenario, because it buffers up directory
      +        // entries in the background instead of waiting for a yield for each one.
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        else if (!(entry instanceof PathBase)) {
      +            options = entry;
      +            entry = this.cwd;
      +        }
      +        return this.stream(entry, options)[Symbol.asyncIterator]();
      +    }
      +    /**
      +     * Iterating over a PathScurry performs a synchronous walk.
      +     *
      +     * Alias for {@link PathScurryBase.iterateSync}
      +     */
      +    [Symbol.iterator]() {
      +        return this.iterateSync();
      +    }
      +    *iterateSync(entry = this.cwd, opts = {}) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        else if (!(entry instanceof PathBase)) {
      +            opts = entry;
      +            entry = this.cwd;
      +        }
      +        const { withFileTypes = true, follow = false, filter, walkFilter, } = opts;
      +        if (!filter || filter(entry)) {
      +            yield withFileTypes ? entry : entry.fullpath();
      +        }
      +        const dirs = new Set([entry]);
      +        for (const dir of dirs) {
      +            const entries = dir.readdirSync();
      +            for (const e of entries) {
      +                if (!filter || filter(e)) {
      +                    yield withFileTypes ? e : e.fullpath();
      +                }
      +                let r = e;
      +                if (e.isSymbolicLink()) {
      +                    if (!(follow && (r = e.realpathSync())))
      +                        continue;
      +                    if (r.isUnknown())
      +                        r.lstatSync();
      +                }
      +                if (r.shouldWalk(dirs, walkFilter)) {
      +                    dirs.add(r);
      +                }
      +            }
      +        }
      +    }
      +    stream(entry = this.cwd, opts = {}) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        else if (!(entry instanceof PathBase)) {
      +            opts = entry;
      +            entry = this.cwd;
      +        }
      +        const { withFileTypes = true, follow = false, filter, walkFilter, } = opts;
      +        const results = new Minipass({ objectMode: true });
      +        if (!filter || filter(entry)) {
      +            results.write(withFileTypes ? entry : entry.fullpath());
      +        }
      +        const dirs = new Set();
      +        const queue = [entry];
      +        let processing = 0;
      +        const process = () => {
      +            let paused = false;
      +            while (!paused) {
      +                const dir = queue.shift();
      +                if (!dir) {
      +                    if (processing === 0)
      +                        results.end();
      +                    return;
      +                }
      +                processing++;
      +                dirs.add(dir);
      +                const onReaddir = (er, entries, didRealpaths = false) => {
      +                    /* c8 ignore start */
      +                    if (er)
      +                        return results.emit('error', er);
      +                    /* c8 ignore stop */
      +                    if (follow && !didRealpaths) {
      +                        const promises = [];
      +                        for (const e of entries) {
      +                            if (e.isSymbolicLink()) {
      +                                promises.push(e
      +                                    .realpath()
      +                                    .then((r) => r?.isUnknown() ? r.lstat() : r));
      +                            }
      +                        }
      +                        if (promises.length) {
      +                            Promise.all(promises).then(() => onReaddir(null, entries, true));
      +                            return;
      +                        }
      +                    }
      +                    for (const e of entries) {
      +                        if (e && (!filter || filter(e))) {
      +                            if (!results.write(withFileTypes ? e : e.fullpath())) {
      +                                paused = true;
      +                            }
      +                        }
      +                    }
      +                    processing--;
      +                    for (const e of entries) {
      +                        const r = e.realpathCached() || e;
      +                        if (r.shouldWalk(dirs, walkFilter)) {
      +                            queue.push(r);
      +                        }
      +                    }
      +                    if (paused && !results.flowing) {
      +                        results.once('drain', process);
      +                    }
      +                    else if (!sync) {
      +                        process();
      +                    }
      +                };
      +                // zalgo containment
      +                let sync = true;
      +                dir.readdirCB(onReaddir, true);
      +                sync = false;
      +            }
      +        };
      +        process();
      +        return results;
      +    }
      +    streamSync(entry = this.cwd, opts = {}) {
      +        if (typeof entry === 'string') {
      +            entry = this.cwd.resolve(entry);
      +        }
      +        else if (!(entry instanceof PathBase)) {
      +            opts = entry;
      +            entry = this.cwd;
      +        }
      +        const { withFileTypes = true, follow = false, filter, walkFilter, } = opts;
      +        const results = new Minipass({ objectMode: true });
      +        const dirs = new Set();
      +        if (!filter || filter(entry)) {
      +            results.write(withFileTypes ? entry : entry.fullpath());
      +        }
      +        const queue = [entry];
      +        let processing = 0;
      +        const process = () => {
      +            let paused = false;
      +            while (!paused) {
      +                const dir = queue.shift();
      +                if (!dir) {
      +                    if (processing === 0)
      +                        results.end();
      +                    return;
      +                }
      +                processing++;
      +                dirs.add(dir);
      +                const entries = dir.readdirSync();
      +                for (const e of entries) {
      +                    if (!filter || filter(e)) {
      +                        if (!results.write(withFileTypes ? e : e.fullpath())) {
      +                            paused = true;
      +                        }
      +                    }
      +                }
      +                processing--;
      +                for (const e of entries) {
      +                    let r = e;
      +                    if (e.isSymbolicLink()) {
      +                        if (!(follow && (r = e.realpathSync())))
      +                            continue;
      +                        if (r.isUnknown())
      +                            r.lstatSync();
      +                    }
      +                    if (r.shouldWalk(dirs, walkFilter)) {
      +                        queue.push(r);
      +                    }
      +                }
      +            }
      +            if (paused && !results.flowing)
      +                results.once('drain', process);
      +        };
      +        process();
      +        return results;
      +    }
      +    chdir(path = this.cwd) {
      +        const oldCwd = this.cwd;
      +        this.cwd = typeof path === 'string' ? this.cwd.resolve(path) : path;
      +        this.cwd[setAsCwd](oldCwd);
      +    }
      +}
      +/**
      + * Windows implementation of {@link PathScurryBase}
      + *
      + * Defaults to case insensitve, uses `'\\'` to generate path strings.  Uses
      + * {@link PathWin32} for Path objects.
      + */
      +export class PathScurryWin32 extends PathScurryBase {
      +    /**
      +     * separator for generating path strings
      +     */
      +    sep = '\\';
      +    constructor(cwd = process.cwd(), opts = {}) {
      +        const { nocase = true } = opts;
      +        super(cwd, win32, '\\', { ...opts, nocase });
      +        this.nocase = nocase;
      +        for (let p = this.cwd; p; p = p.parent) {
      +            p.nocase = this.nocase;
      +        }
      +    }
      +    /**
      +     * @internal
      +     */
      +    parseRootPath(dir) {
      +        // if the path starts with a single separator, it's not a UNC, and we'll
      +        // just get separator as the root, and driveFromUNC will return \
      +        // In that case, mount \ on the root from the cwd.
      +        return win32.parse(dir).root.toUpperCase();
      +    }
      +    /**
      +     * @internal
      +     */
      +    newRoot(fs) {
      +        return new PathWin32(this.rootPath, IFDIR, undefined, this.roots, this.nocase, this.childrenCache(), { fs });
      +    }
      +    /**
      +     * Return true if the provided path string is an absolute path
      +     */
      +    isAbsolute(p) {
      +        return (p.startsWith('/') || p.startsWith('\\') || /^[a-z]:(\/|\\)/i.test(p));
      +    }
      +}
      +/**
      + * {@link PathScurryBase} implementation for all posix systems other than Darwin.
      + *
      + * Defaults to case-sensitive matching, uses `'/'` to generate path strings.
      + *
      + * Uses {@link PathPosix} for Path objects.
      + */
      +export class PathScurryPosix extends PathScurryBase {
      +    /**
      +     * separator for generating path strings
      +     */
      +    sep = '/';
      +    constructor(cwd = process.cwd(), opts = {}) {
      +        const { nocase = false } = opts;
      +        super(cwd, posix, '/', { ...opts, nocase });
      +        this.nocase = nocase;
      +    }
      +    /**
      +     * @internal
      +     */
      +    parseRootPath(_dir) {
      +        return '/';
      +    }
      +    /**
      +     * @internal
      +     */
      +    newRoot(fs) {
      +        return new PathPosix(this.rootPath, IFDIR, undefined, this.roots, this.nocase, this.childrenCache(), { fs });
      +    }
      +    /**
      +     * Return true if the provided path string is an absolute path
      +     */
      +    isAbsolute(p) {
      +        return p.startsWith('/');
      +    }
      +}
      +/**
      + * {@link PathScurryBase} implementation for Darwin (macOS) systems.
      + *
      + * Defaults to case-insensitive matching, uses `'/'` for generating path
      + * strings.
      + *
      + * Uses {@link PathPosix} for Path objects.
      + */
      +export class PathScurryDarwin extends PathScurryPosix {
      +    constructor(cwd = process.cwd(), opts = {}) {
      +        const { nocase = true } = opts;
      +        super(cwd, { ...opts, nocase });
      +    }
      +}
      +/**
      + * Default {@link PathBase} implementation for the current platform.
      + *
      + * {@link PathWin32} on Windows systems, {@link PathPosix} on all others.
      + */
      +export const Path = process.platform === 'win32' ? PathWin32 : PathPosix;
      +/**
      + * Default {@link PathScurryBase} implementation for the current platform.
      + *
      + * {@link PathScurryWin32} on Windows systems, {@link PathScurryDarwin} on
      + * Darwin (macOS) systems, {@link PathScurryPosix} on all others.
      + */
      +export const PathScurry = process.platform === 'win32' ? PathScurryWin32
      +    : process.platform === 'darwin' ? PathScurryDarwin
      +        : PathScurryPosix;
      +//# sourceMappingURL=index.js.map
      \ No newline at end of file
      diff --git a/node_modules/path-scurry/dist/esm/index.js.map b/node_modules/path-scurry/dist/esm/index.js.map
      new file mode 100644
      index 00000000..51e56ee1
      --- /dev/null
      +++ b/node_modules/path-scurry/dist/esm/index.js.map
      @@ -0,0 +1 @@
      +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { LRUCache } from 'lru-cache'\nimport { posix, win32 } from 'node:path'\n\nimport { fileURLToPath } from 'node:url'\n\nimport {\n  lstatSync,\n  readdir as readdirCB,\n  readdirSync,\n  readlinkSync,\n  realpathSync as rps,\n} from 'fs'\nimport * as actualFS from 'node:fs'\n\nconst realpathSync = rps.native\n// TODO: test perf of fs/promises realpath vs realpathCB,\n// since the promises one uses realpath.native\n\nimport { lstat, readdir, readlink, realpath } from 'node:fs/promises'\n\nimport { Minipass } from 'minipass'\nimport type { Dirent, Stats } from 'node:fs'\n\n/**\n * An object that will be used to override the default `fs`\n * methods.  Any methods that are not overridden will use Node's\n * built-in implementations.\n *\n * - lstatSync\n * - readdir (callback `withFileTypes` Dirent variant, used for\n *   readdirCB and most walks)\n * - readdirSync\n * - readlinkSync\n * - realpathSync\n * - promises: Object containing the following async methods:\n *   - lstat\n *   - readdir (Dirent variant only)\n *   - readlink\n *   - realpath\n */\nexport interface FSOption {\n  lstatSync?: (path: string) => Stats\n  readdir?: (\n    path: string,\n    options: { withFileTypes: true },\n    cb: (er: NodeJS.ErrnoException | null, entries?: Dirent[]) => any,\n  ) => void\n  readdirSync?: (\n    path: string,\n    options: { withFileTypes: true },\n  ) => Dirent[]\n  readlinkSync?: (path: string) => string\n  realpathSync?: (path: string) => string\n  promises?: {\n    lstat?: (path: string) => Promise\n    readdir?: (\n      path: string,\n      options: { withFileTypes: true },\n    ) => Promise\n    readlink?: (path: string) => Promise\n    realpath?: (path: string) => Promise\n    [k: string]: any\n  }\n  [k: string]: any\n}\n\ninterface FSValue {\n  lstatSync: (path: string) => Stats\n  readdir: (\n    path: string,\n    options: { withFileTypes: true },\n    cb: (er: NodeJS.ErrnoException | null, entries?: Dirent[]) => any,\n  ) => void\n  readdirSync: (path: string, options: { withFileTypes: true }) => Dirent[]\n  readlinkSync: (path: string) => string\n  realpathSync: (path: string) => string\n  promises: {\n    lstat: (path: string) => Promise\n    readdir: (\n      path: string,\n      options: { withFileTypes: true },\n    ) => Promise\n    readlink: (path: string) => Promise\n    realpath: (path: string) => Promise\n    [k: string]: any\n  }\n  [k: string]: any\n}\n\nconst defaultFS: FSValue = {\n  lstatSync,\n  readdir: readdirCB,\n  readdirSync,\n  readlinkSync,\n  realpathSync,\n  promises: {\n    lstat,\n    readdir,\n    readlink,\n    realpath,\n  },\n}\n\n// if they just gave us require('fs') then use our default\nconst fsFromOption = (fsOption?: FSOption): FSValue =>\n  !fsOption || fsOption === defaultFS || fsOption === actualFS ?\n    defaultFS\n  : {\n      ...defaultFS,\n      ...fsOption,\n      promises: {\n        ...defaultFS.promises,\n        ...(fsOption.promises || {}),\n      },\n    }\n\n// turn something like //?/c:/ into c:\\\nconst uncDriveRegexp = /^\\\\\\\\\\?\\\\([a-z]:)\\\\?$/i\nconst uncToDrive = (rootPath: string): string =>\n  rootPath.replace(/\\//g, '\\\\').replace(uncDriveRegexp, '$1\\\\')\n\n// windows paths are separated by either / or \\\nconst eitherSep = /[\\\\\\/]/\n\nconst UNKNOWN = 0 // may not even exist, for all we know\nconst IFIFO = 0b0001\nconst IFCHR = 0b0010\nconst IFDIR = 0b0100\nconst IFBLK = 0b0110\nconst IFREG = 0b1000\nconst IFLNK = 0b1010\nconst IFSOCK = 0b1100\nconst IFMT = 0b1111\n\nexport type Type =\n  | 'Unknown'\n  | 'FIFO'\n  | 'CharacterDevice'\n  | 'Directory'\n  | 'BlockDevice'\n  | 'File'\n  | 'SymbolicLink'\n  | 'Socket'\n\n// mask to unset low 4 bits\nconst IFMT_UNKNOWN = ~IFMT\n\n// set after successfully calling readdir() and getting entries.\nconst READDIR_CALLED = 0b0000_0001_0000\n// set after a successful lstat()\nconst LSTAT_CALLED = 0b0000_0010_0000\n// set if an entry (or one of its parents) is definitely not a dir\nconst ENOTDIR = 0b0000_0100_0000\n// set if an entry (or one of its parents) does not exist\n// (can also be set on lstat errors like EACCES or ENAMETOOLONG)\nconst ENOENT = 0b0000_1000_0000\n// cannot have child entries -- also verify &IFMT is either IFDIR or IFLNK\n// set if we fail to readlink\nconst ENOREADLINK = 0b0001_0000_0000\n// set if we know realpath() will fail\nconst ENOREALPATH = 0b0010_0000_0000\n\nconst ENOCHILD = ENOTDIR | ENOENT | ENOREALPATH\nconst TYPEMASK = 0b0011_1111_1111\n\nconst entToType = (s: Dirent | Stats) =>\n  s.isFile() ? IFREG\n  : s.isDirectory() ? IFDIR\n  : s.isSymbolicLink() ? IFLNK\n  : s.isCharacterDevice() ? IFCHR\n  : s.isBlockDevice() ? IFBLK\n  : s.isSocket() ? IFSOCK\n  : s.isFIFO() ? IFIFO\n  : UNKNOWN\n\n// normalize unicode path names\nconst normalizeCache = new LRUCache({ max: 2 ** 12 })\nconst normalize = (s: string) => {\n  const c = normalizeCache.get(s)\n  if (c) return c\n  const n = s.normalize('NFKD')\n  normalizeCache.set(s, n)\n  return n\n}\n\nconst normalizeNocaseCache = new LRUCache({ max: 2 ** 12 })\nconst normalizeNocase = (s: string) => {\n  const c = normalizeNocaseCache.get(s)\n  if (c) return c\n  const n = normalize(s.toLowerCase())\n  normalizeNocaseCache.set(s, n)\n  return n\n}\n\n/**\n * Options that may be provided to the Path constructor\n */\nexport interface PathOpts {\n  fullpath?: string\n  relative?: string\n  relativePosix?: string\n  parent?: PathBase\n  /**\n   * See {@link FSOption}\n   */\n  fs?: FSOption\n}\n\n/**\n * An LRUCache for storing resolved path strings or Path objects.\n * @internal\n */\nexport class ResolveCache extends LRUCache {\n  constructor() {\n    super({ max: 256 })\n  }\n}\n\n// In order to prevent blowing out the js heap by allocating hundreds of\n// thousands of Path entries when walking extremely large trees, the \"children\"\n// in this tree are represented by storing an array of Path entries in an\n// LRUCache, indexed by the parent.  At any time, Path.children() may return an\n// empty array, indicating that it doesn't know about any of its children, and\n// thus has to rebuild that cache.  This is fine, it just means that we don't\n// benefit as much from having the cached entries, but huge directory walks\n// don't blow out the stack, and smaller ones are still as fast as possible.\n//\n//It does impose some complexity when building up the readdir data, because we\n//need to pass a reference to the children array that we started with.\n\n/**\n * an LRUCache for storing child entries.\n * @internal\n */\nexport class ChildrenCache extends LRUCache {\n  constructor(maxSize: number = 16 * 1024) {\n    super({\n      maxSize,\n      // parent + children\n      sizeCalculation: a => a.length + 1,\n    })\n  }\n}\n\n/**\n * Array of Path objects, plus a marker indicating the first provisional entry\n *\n * @internal\n */\nexport type Children = PathBase[] & { provisional: number }\n\nconst setAsCwd = Symbol('PathScurry setAsCwd')\n\n/**\n * Path objects are sort of like a super-powered\n * {@link https://nodejs.org/docs/latest/api/fs.html#class-fsdirent fs.Dirent}\n *\n * Each one represents a single filesystem entry on disk, which may or may not\n * exist. It includes methods for reading various types of information via\n * lstat, readlink, and readdir, and caches all information to the greatest\n * degree possible.\n *\n * Note that fs operations that would normally throw will instead return an\n * \"empty\" value. This is in order to prevent excessive overhead from error\n * stack traces.\n */\nexport abstract class PathBase implements Dirent {\n  /**\n   * the basename of this path\n   *\n   * **Important**: *always* test the path name against any test string\n   * usingthe {@link isNamed} method, and not by directly comparing this\n   * string. Otherwise, unicode path strings that the system sees as identical\n   * will not be properly treated as the same path, leading to incorrect\n   * behavior and possible security issues.\n   */\n  name: string\n  /**\n   * the Path entry corresponding to the path root.\n   *\n   * @internal\n   */\n  root: PathBase\n  /**\n   * All roots found within the current PathScurry family\n   *\n   * @internal\n   */\n  roots: { [k: string]: PathBase }\n  /**\n   * a reference to the parent path, or undefined in the case of root entries\n   *\n   * @internal\n   */\n  parent?: PathBase\n  /**\n   * boolean indicating whether paths are compared case-insensitively\n   * @internal\n   */\n  nocase: boolean\n\n  /**\n   * boolean indicating that this path is the current working directory\n   * of the PathScurry collection that contains it.\n   */\n  isCWD: boolean = false\n\n  /**\n   * the string or regexp used to split paths. On posix, it is `'/'`, and on\n   * windows it is a RegExp matching either `'/'` or `'\\\\'`\n   */\n  abstract splitSep: string | RegExp\n  /**\n   * The path separator string to use when joining paths\n   */\n  abstract sep: string\n\n  // potential default fs override\n  #fs: FSValue\n\n  // Stats fields\n  #dev?: number\n  get dev() {\n    return this.#dev\n  }\n  #mode?: number\n  get mode() {\n    return this.#mode\n  }\n  #nlink?: number\n  get nlink() {\n    return this.#nlink\n  }\n  #uid?: number\n  get uid() {\n    return this.#uid\n  }\n  #gid?: number\n  get gid() {\n    return this.#gid\n  }\n  #rdev?: number\n  get rdev() {\n    return this.#rdev\n  }\n  #blksize?: number\n  get blksize() {\n    return this.#blksize\n  }\n  #ino?: number\n  get ino() {\n    return this.#ino\n  }\n  #size?: number\n  get size() {\n    return this.#size\n  }\n  #blocks?: number\n  get blocks() {\n    return this.#blocks\n  }\n  #atimeMs?: number\n  get atimeMs() {\n    return this.#atimeMs\n  }\n  #mtimeMs?: number\n  get mtimeMs() {\n    return this.#mtimeMs\n  }\n  #ctimeMs?: number\n  get ctimeMs() {\n    return this.#ctimeMs\n  }\n  #birthtimeMs?: number\n  get birthtimeMs() {\n    return this.#birthtimeMs\n  }\n  #atime?: Date\n  get atime() {\n    return this.#atime\n  }\n  #mtime?: Date\n  get mtime() {\n    return this.#mtime\n  }\n  #ctime?: Date\n  get ctime() {\n    return this.#ctime\n  }\n  #birthtime?: Date\n  get birthtime() {\n    return this.#birthtime\n  }\n\n  #matchName: string\n  #depth?: number\n  #fullpath?: string\n  #fullpathPosix?: string\n  #relative?: string\n  #relativePosix?: string\n  #type: number\n  #children: ChildrenCache\n  #linkTarget?: PathBase\n  #realpath?: PathBase\n\n  /**\n   * This property is for compatibility with the Dirent class as of\n   * Node v20, where Dirent['parentPath'] refers to the path of the\n   * directory that was passed to readdir. For root entries, it's the path\n   * to the entry itself.\n   */\n  get parentPath(): string {\n    return (this.parent || this).fullpath()\n  }\n\n  /* c8 ignore start */\n  /**\n   * Deprecated alias for Dirent['parentPath'] Somewhat counterintuitively,\n   * this property refers to the *parent* path, not the path object itself.\n   *\n   * @deprecated\n   */\n  get path(): string {\n    return this.parentPath\n  }\n  /* c8 ignore stop */\n\n  /**\n   * Do not create new Path objects directly.  They should always be accessed\n   * via the PathScurry class or other methods on the Path class.\n   *\n   * @internal\n   */\n  constructor(\n    name: string,\n    type: number = UNKNOWN,\n    root: PathBase | undefined,\n    roots: { [k: string]: PathBase },\n    nocase: boolean,\n    children: ChildrenCache,\n    opts: PathOpts,\n  ) {\n    this.name = name\n    this.#matchName = nocase ? normalizeNocase(name) : normalize(name)\n    this.#type = type & TYPEMASK\n    this.nocase = nocase\n    this.roots = roots\n    this.root = root || this\n    this.#children = children\n    this.#fullpath = opts.fullpath\n    this.#relative = opts.relative\n    this.#relativePosix = opts.relativePosix\n    this.parent = opts.parent\n    if (this.parent) {\n      this.#fs = this.parent.#fs\n    } else {\n      this.#fs = fsFromOption(opts.fs)\n    }\n  }\n\n  /**\n   * Returns the depth of the Path object from its root.\n   *\n   * For example, a path at `/foo/bar` would have a depth of 2.\n   */\n  depth(): number {\n    if (this.#depth !== undefined) return this.#depth\n    if (!this.parent) return (this.#depth = 0)\n    return (this.#depth = this.parent.depth() + 1)\n  }\n\n  /**\n   * @internal\n   */\n  abstract getRootString(path: string): string\n  /**\n   * @internal\n   */\n  abstract getRoot(rootPath: string): PathBase\n  /**\n   * @internal\n   */\n  abstract newChild(name: string, type?: number, opts?: PathOpts): PathBase\n\n  /**\n   * @internal\n   */\n  childrenCache() {\n    return this.#children\n  }\n\n  /**\n   * Get the Path object referenced by the string path, resolved from this Path\n   */\n  resolve(path?: string): PathBase {\n    if (!path) {\n      return this\n    }\n    const rootPath = this.getRootString(path)\n    const dir = path.substring(rootPath.length)\n    const dirParts = dir.split(this.splitSep)\n    const result: PathBase =\n      rootPath ?\n        this.getRoot(rootPath).#resolveParts(dirParts)\n      : this.#resolveParts(dirParts)\n    return result\n  }\n\n  #resolveParts(dirParts: string[]) {\n    let p: PathBase = this\n    for (const part of dirParts) {\n      p = p.child(part)\n    }\n    return p\n  }\n\n  /**\n   * Returns the cached children Path objects, if still available.  If they\n   * have fallen out of the cache, then returns an empty array, and resets the\n   * READDIR_CALLED bit, so that future calls to readdir() will require an fs\n   * lookup.\n   *\n   * @internal\n   */\n  children(): Children {\n    const cached = this.#children.get(this)\n    if (cached) {\n      return cached\n    }\n    const children: Children = Object.assign([], { provisional: 0 })\n    this.#children.set(this, children)\n    this.#type &= ~READDIR_CALLED\n    return children\n  }\n\n  /**\n   * Resolves a path portion and returns or creates the child Path.\n   *\n   * Returns `this` if pathPart is `''` or `'.'`, or `parent` if pathPart is\n   * `'..'`.\n   *\n   * This should not be called directly.  If `pathPart` contains any path\n   * separators, it will lead to unsafe undefined behavior.\n   *\n   * Use `Path.resolve()` instead.\n   *\n   * @internal\n   */\n  child(pathPart: string, opts?: PathOpts): PathBase {\n    if (pathPart === '' || pathPart === '.') {\n      return this\n    }\n    if (pathPart === '..') {\n      return this.parent || this\n    }\n\n    // find the child\n    const children = this.children()\n    const name =\n      this.nocase ? normalizeNocase(pathPart) : normalize(pathPart)\n    for (const p of children) {\n      if (p.#matchName === name) {\n        return p\n      }\n    }\n\n    // didn't find it, create provisional child, since it might not\n    // actually exist.  If we know the parent isn't a dir, then\n    // in fact it CAN'T exist.\n    const s = this.parent ? this.sep : ''\n    const fullpath =\n      this.#fullpath ? this.#fullpath + s + pathPart : undefined\n    const pchild = this.newChild(pathPart, UNKNOWN, {\n      ...opts,\n      parent: this,\n      fullpath,\n    })\n\n    if (!this.canReaddir()) {\n      pchild.#type |= ENOENT\n    }\n\n    // don't have to update provisional, because if we have real children,\n    // then provisional is set to children.length, otherwise a lower number\n    children.push(pchild)\n    return pchild\n  }\n\n  /**\n   * The relative path from the cwd. If it does not share an ancestor with\n   * the cwd, then this ends up being equivalent to the fullpath()\n   */\n  relative(): string {\n    if (this.isCWD) return ''\n    if (this.#relative !== undefined) {\n      return this.#relative\n    }\n    const name = this.name\n    const p = this.parent\n    if (!p) {\n      return (this.#relative = this.name)\n    }\n    const pv = p.relative()\n    return pv + (!pv || !p.parent ? '' : this.sep) + name\n  }\n\n  /**\n   * The relative path from the cwd, using / as the path separator.\n   * If it does not share an ancestor with\n   * the cwd, then this ends up being equivalent to the fullpathPosix()\n   * On posix systems, this is identical to relative().\n   */\n  relativePosix(): string {\n    if (this.sep === '/') return this.relative()\n    if (this.isCWD) return ''\n    if (this.#relativePosix !== undefined) return this.#relativePosix\n    const name = this.name\n    const p = this.parent\n    if (!p) {\n      return (this.#relativePosix = this.fullpathPosix())\n    }\n    const pv = p.relativePosix()\n    return pv + (!pv || !p.parent ? '' : '/') + name\n  }\n\n  /**\n   * The fully resolved path string for this Path entry\n   */\n  fullpath(): string {\n    if (this.#fullpath !== undefined) {\n      return this.#fullpath\n    }\n    const name = this.name\n    const p = this.parent\n    if (!p) {\n      return (this.#fullpath = this.name)\n    }\n    const pv = p.fullpath()\n    const fp = pv + (!p.parent ? '' : this.sep) + name\n    return (this.#fullpath = fp)\n  }\n\n  /**\n   * On platforms other than windows, this is identical to fullpath.\n   *\n   * On windows, this is overridden to return the forward-slash form of the\n   * full UNC path.\n   */\n  fullpathPosix(): string {\n    if (this.#fullpathPosix !== undefined) return this.#fullpathPosix\n    if (this.sep === '/') return (this.#fullpathPosix = this.fullpath())\n    if (!this.parent) {\n      const p = this.fullpath().replace(/\\\\/g, '/')\n      if (/^[a-z]:\\//i.test(p)) {\n        return (this.#fullpathPosix = `//?/${p}`)\n      } else {\n        return (this.#fullpathPosix = p)\n      }\n    }\n    const p = this.parent\n    const pfpp = p.fullpathPosix()\n    const fpp = pfpp + (!pfpp || !p.parent ? '' : '/') + this.name\n    return (this.#fullpathPosix = fpp)\n  }\n\n  /**\n   * Is the Path of an unknown type?\n   *\n   * Note that we might know *something* about it if there has been a previous\n   * filesystem operation, for example that it does not exist, or is not a\n   * link, or whether it has child entries.\n   */\n  isUnknown(): boolean {\n    return (this.#type & IFMT) === UNKNOWN\n  }\n\n  isType(type: Type): boolean {\n    return this[`is${type}`]()\n  }\n\n  getType(): Type {\n    return (\n      this.isUnknown() ? 'Unknown'\n      : this.isDirectory() ? 'Directory'\n      : this.isFile() ? 'File'\n      : this.isSymbolicLink() ? 'SymbolicLink'\n      : this.isFIFO() ? 'FIFO'\n      : this.isCharacterDevice() ? 'CharacterDevice'\n      : this.isBlockDevice() ? 'BlockDevice'\n      : /* c8 ignore start */ this.isSocket() ? 'Socket'\n      : 'Unknown'\n    )\n    /* c8 ignore stop */\n  }\n\n  /**\n   * Is the Path a regular file?\n   */\n  isFile(): boolean {\n    return (this.#type & IFMT) === IFREG\n  }\n\n  /**\n   * Is the Path a directory?\n   */\n  isDirectory(): boolean {\n    return (this.#type & IFMT) === IFDIR\n  }\n\n  /**\n   * Is the path a character device?\n   */\n  isCharacterDevice(): boolean {\n    return (this.#type & IFMT) === IFCHR\n  }\n\n  /**\n   * Is the path a block device?\n   */\n  isBlockDevice(): boolean {\n    return (this.#type & IFMT) === IFBLK\n  }\n\n  /**\n   * Is the path a FIFO pipe?\n   */\n  isFIFO(): boolean {\n    return (this.#type & IFMT) === IFIFO\n  }\n\n  /**\n   * Is the path a socket?\n   */\n  isSocket(): boolean {\n    return (this.#type & IFMT) === IFSOCK\n  }\n\n  /**\n   * Is the path a symbolic link?\n   */\n  isSymbolicLink(): boolean {\n    return (this.#type & IFLNK) === IFLNK\n  }\n\n  /**\n   * Return the entry if it has been subject of a successful lstat, or\n   * undefined otherwise.\n   *\n   * Does not read the filesystem, so an undefined result *could* simply\n   * mean that we haven't called lstat on it.\n   */\n  lstatCached(): PathBase | undefined {\n    return this.#type & LSTAT_CALLED ? this : undefined\n  }\n\n  /**\n   * Return the cached link target if the entry has been the subject of a\n   * successful readlink, or undefined otherwise.\n   *\n   * Does not read the filesystem, so an undefined result *could* just mean we\n   * don't have any cached data. Only use it if you are very sure that a\n   * readlink() has been called at some point.\n   */\n  readlinkCached(): PathBase | undefined {\n    return this.#linkTarget\n  }\n\n  /**\n   * Returns the cached realpath target if the entry has been the subject\n   * of a successful realpath, or undefined otherwise.\n   *\n   * Does not read the filesystem, so an undefined result *could* just mean we\n   * don't have any cached data. Only use it if you are very sure that a\n   * realpath() has been called at some point.\n   */\n  realpathCached(): PathBase | undefined {\n    return this.#realpath\n  }\n\n  /**\n   * Returns the cached child Path entries array if the entry has been the\n   * subject of a successful readdir(), or [] otherwise.\n   *\n   * Does not read the filesystem, so an empty array *could* just mean we\n   * don't have any cached data. Only use it if you are very sure that a\n   * readdir() has been called recently enough to still be valid.\n   */\n  readdirCached(): PathBase[] {\n    const children = this.children()\n    return children.slice(0, children.provisional)\n  }\n\n  /**\n   * Return true if it's worth trying to readlink.  Ie, we don't (yet) have\n   * any indication that readlink will definitely fail.\n   *\n   * Returns false if the path is known to not be a symlink, if a previous\n   * readlink failed, or if the entry does not exist.\n   */\n  canReadlink(): boolean {\n    if (this.#linkTarget) return true\n    if (!this.parent) return false\n    // cases where it cannot possibly succeed\n    const ifmt = this.#type & IFMT\n    return !(\n      (ifmt !== UNKNOWN && ifmt !== IFLNK) ||\n      this.#type & ENOREADLINK ||\n      this.#type & ENOENT\n    )\n  }\n\n  /**\n   * Return true if readdir has previously been successfully called on this\n   * path, indicating that cachedReaddir() is likely valid.\n   */\n  calledReaddir(): boolean {\n    return !!(this.#type & READDIR_CALLED)\n  }\n\n  /**\n   * Returns true if the path is known to not exist. That is, a previous lstat\n   * or readdir failed to verify its existence when that would have been\n   * expected, or a parent entry was marked either enoent or enotdir.\n   */\n  isENOENT(): boolean {\n    return !!(this.#type & ENOENT)\n  }\n\n  /**\n   * Return true if the path is a match for the given path name.  This handles\n   * case sensitivity and unicode normalization.\n   *\n   * Note: even on case-sensitive systems, it is **not** safe to test the\n   * equality of the `.name` property to determine whether a given pathname\n   * matches, due to unicode normalization mismatches.\n   *\n   * Always use this method instead of testing the `path.name` property\n   * directly.\n   */\n  isNamed(n: string): boolean {\n    return !this.nocase ?\n        this.#matchName === normalize(n)\n      : this.#matchName === normalizeNocase(n)\n  }\n\n  /**\n   * Return the Path object corresponding to the target of a symbolic link.\n   *\n   * If the Path is not a symbolic link, or if the readlink call fails for any\n   * reason, `undefined` is returned.\n   *\n   * Result is cached, and thus may be outdated if the filesystem is mutated.\n   */\n  async readlink(): Promise {\n    const target = this.#linkTarget\n    if (target) {\n      return target\n    }\n    if (!this.canReadlink()) {\n      return undefined\n    }\n    /* c8 ignore start */\n    // already covered by the canReadlink test, here for ts grumples\n    if (!this.parent) {\n      return undefined\n    }\n    /* c8 ignore stop */\n    try {\n      const read = await this.#fs.promises.readlink(this.fullpath())\n      const linkTarget = (await this.parent.realpath())?.resolve(read)\n      if (linkTarget) {\n        return (this.#linkTarget = linkTarget)\n      }\n    } catch (er) {\n      this.#readlinkFail((er as NodeJS.ErrnoException).code)\n      return undefined\n    }\n  }\n\n  /**\n   * Synchronous {@link PathBase.readlink}\n   */\n  readlinkSync(): PathBase | undefined {\n    const target = this.#linkTarget\n    if (target) {\n      return target\n    }\n    if (!this.canReadlink()) {\n      return undefined\n    }\n    /* c8 ignore start */\n    // already covered by the canReadlink test, here for ts grumples\n    if (!this.parent) {\n      return undefined\n    }\n    /* c8 ignore stop */\n    try {\n      const read = this.#fs.readlinkSync(this.fullpath())\n      const linkTarget = this.parent.realpathSync()?.resolve(read)\n      if (linkTarget) {\n        return (this.#linkTarget = linkTarget)\n      }\n    } catch (er) {\n      this.#readlinkFail((er as NodeJS.ErrnoException).code)\n      return undefined\n    }\n  }\n\n  #readdirSuccess(children: Children) {\n    // succeeded, mark readdir called bit\n    this.#type |= READDIR_CALLED\n    // mark all remaining provisional children as ENOENT\n    for (let p = children.provisional; p < children.length; p++) {\n      const c = children[p]\n      if (c) c.#markENOENT()\n    }\n  }\n\n  #markENOENT() {\n    // mark as UNKNOWN and ENOENT\n    if (this.#type & ENOENT) return\n    this.#type = (this.#type | ENOENT) & IFMT_UNKNOWN\n    this.#markChildrenENOENT()\n  }\n\n  #markChildrenENOENT() {\n    // all children are provisional and do not exist\n    const children = this.children()\n    children.provisional = 0\n    for (const p of children) {\n      p.#markENOENT()\n    }\n  }\n\n  #markENOREALPATH() {\n    this.#type |= ENOREALPATH\n    this.#markENOTDIR()\n  }\n\n  // save the information when we know the entry is not a dir\n  #markENOTDIR() {\n    // entry is not a directory, so any children can't exist.\n    // this *should* be impossible, since any children created\n    // after it's been marked ENOTDIR should be marked ENOENT,\n    // so it won't even get to this point.\n    /* c8 ignore start */\n    if (this.#type & ENOTDIR) return\n    /* c8 ignore stop */\n    let t = this.#type\n    // this could happen if we stat a dir, then delete it,\n    // then try to read it or one of its children.\n    if ((t & IFMT) === IFDIR) t &= IFMT_UNKNOWN\n    this.#type = t | ENOTDIR\n    this.#markChildrenENOENT()\n  }\n\n  #readdirFail(code: string = '') {\n    // markENOTDIR and markENOENT also set provisional=0\n    if (code === 'ENOTDIR' || code === 'EPERM') {\n      this.#markENOTDIR()\n    } else if (code === 'ENOENT') {\n      this.#markENOENT()\n    } else {\n      this.children().provisional = 0\n    }\n  }\n\n  #lstatFail(code: string = '') {\n    // Windows just raises ENOENT in this case, disable for win CI\n    /* c8 ignore start */\n    if (code === 'ENOTDIR') {\n      // already know it has a parent by this point\n      const p = this.parent as PathBase\n      p.#markENOTDIR()\n    } else if (code === 'ENOENT') {\n      /* c8 ignore stop */\n      this.#markENOENT()\n    }\n  }\n\n  #readlinkFail(code: string = '') {\n    let ter = this.#type\n    ter |= ENOREADLINK\n    if (code === 'ENOENT') ter |= ENOENT\n    // windows gets a weird error when you try to readlink a file\n    if (code === 'EINVAL' || code === 'UNKNOWN') {\n      // exists, but not a symlink, we don't know WHAT it is, so remove\n      // all IFMT bits.\n      ter &= IFMT_UNKNOWN\n    }\n    this.#type = ter\n    // windows just gets ENOENT in this case.  We do cover the case,\n    // just disabled because it's impossible on Windows CI\n    /* c8 ignore start */\n    if (code === 'ENOTDIR' && this.parent) {\n      this.parent.#markENOTDIR()\n    }\n    /* c8 ignore stop */\n  }\n\n  #readdirAddChild(e: Dirent, c: Children) {\n    return (\n      this.#readdirMaybePromoteChild(e, c) ||\n      this.#readdirAddNewChild(e, c)\n    )\n  }\n\n  #readdirAddNewChild(e: Dirent, c: Children): PathBase {\n    // alloc new entry at head, so it's never provisional\n    const type = entToType(e)\n    const child = this.newChild(e.name, type, { parent: this })\n    const ifmt = child.#type & IFMT\n    if (ifmt !== IFDIR && ifmt !== IFLNK && ifmt !== UNKNOWN) {\n      child.#type |= ENOTDIR\n    }\n    c.unshift(child)\n    c.provisional++\n    return child\n  }\n\n  #readdirMaybePromoteChild(e: Dirent, c: Children): PathBase | undefined {\n    for (let p = c.provisional; p < c.length; p++) {\n      const pchild = c[p]\n      const name =\n        this.nocase ? normalizeNocase(e.name) : normalize(e.name)\n      if (name !== pchild!.#matchName) {\n        continue\n      }\n\n      return this.#readdirPromoteChild(e, pchild!, p, c)\n    }\n  }\n\n  #readdirPromoteChild(\n    e: Dirent,\n    p: PathBase,\n    index: number,\n    c: Children,\n  ): PathBase {\n    const v = p.name\n    // retain any other flags, but set ifmt from dirent\n    p.#type = (p.#type & IFMT_UNKNOWN) | entToType(e)\n    // case sensitivity fixing when we learn the true name.\n    if (v !== e.name) p.name = e.name\n\n    // just advance provisional index (potentially off the list),\n    // otherwise we have to splice/pop it out and re-insert at head\n    if (index !== c.provisional) {\n      if (index === c.length - 1) c.pop()\n      else c.splice(index, 1)\n      c.unshift(p)\n    }\n    c.provisional++\n    return p\n  }\n\n  /**\n   * Call lstat() on this Path, and update all known information that can be\n   * determined.\n   *\n   * Note that unlike `fs.lstat()`, the returned value does not contain some\n   * information, such as `mode`, `dev`, `nlink`, and `ino`.  If that\n   * information is required, you will need to call `fs.lstat` yourself.\n   *\n   * If the Path refers to a nonexistent file, or if the lstat call fails for\n   * any reason, `undefined` is returned.  Otherwise the updated Path object is\n   * returned.\n   *\n   * Results are cached, and thus may be out of date if the filesystem is\n   * mutated.\n   */\n  async lstat(): Promise {\n    if ((this.#type & ENOENT) === 0) {\n      try {\n        this.#applyStat(await this.#fs.promises.lstat(this.fullpath()))\n        return this\n      } catch (er) {\n        this.#lstatFail((er as NodeJS.ErrnoException).code)\n      }\n    }\n  }\n\n  /**\n   * synchronous {@link PathBase.lstat}\n   */\n  lstatSync(): PathBase | undefined {\n    if ((this.#type & ENOENT) === 0) {\n      try {\n        this.#applyStat(this.#fs.lstatSync(this.fullpath()))\n        return this\n      } catch (er) {\n        this.#lstatFail((er as NodeJS.ErrnoException).code)\n      }\n    }\n  }\n\n  #applyStat(st: Stats) {\n    const {\n      atime,\n      atimeMs,\n      birthtime,\n      birthtimeMs,\n      blksize,\n      blocks,\n      ctime,\n      ctimeMs,\n      dev,\n      gid,\n      ino,\n      mode,\n      mtime,\n      mtimeMs,\n      nlink,\n      rdev,\n      size,\n      uid,\n    } = st\n    this.#atime = atime\n    this.#atimeMs = atimeMs\n    this.#birthtime = birthtime\n    this.#birthtimeMs = birthtimeMs\n    this.#blksize = blksize\n    this.#blocks = blocks\n    this.#ctime = ctime\n    this.#ctimeMs = ctimeMs\n    this.#dev = dev\n    this.#gid = gid\n    this.#ino = ino\n    this.#mode = mode\n    this.#mtime = mtime\n    this.#mtimeMs = mtimeMs\n    this.#nlink = nlink\n    this.#rdev = rdev\n    this.#size = size\n    this.#uid = uid\n    const ifmt = entToType(st)\n    // retain any other flags, but set the ifmt\n    this.#type = (this.#type & IFMT_UNKNOWN) | ifmt | LSTAT_CALLED\n    if (ifmt !== UNKNOWN && ifmt !== IFDIR && ifmt !== IFLNK) {\n      this.#type |= ENOTDIR\n    }\n  }\n\n  #onReaddirCB: ((\n    er: NodeJS.ErrnoException | null,\n    entries: Path[],\n  ) => any)[] = []\n  #readdirCBInFlight: boolean = false\n  #callOnReaddirCB(children: Path[]) {\n    this.#readdirCBInFlight = false\n    const cbs = this.#onReaddirCB.slice()\n    this.#onReaddirCB.length = 0\n    cbs.forEach(cb => cb(null, children))\n  }\n\n  /**\n   * Standard node-style callback interface to get list of directory entries.\n   *\n   * If the Path cannot or does not contain any children, then an empty array\n   * is returned.\n   *\n   * Results are cached, and thus may be out of date if the filesystem is\n   * mutated.\n   *\n   * @param cb The callback called with (er, entries).  Note that the `er`\n   * param is somewhat extraneous, as all readdir() errors are handled and\n   * simply result in an empty set of entries being returned.\n   * @param allowZalgo Boolean indicating that immediately known results should\n   * *not* be deferred with `queueMicrotask`. Defaults to `false`. Release\n   * zalgo at your peril, the dark pony lord is devious and unforgiving.\n   */\n  readdirCB(\n    cb: (er: NodeJS.ErrnoException | null, entries: PathBase[]) => any,\n    allowZalgo: boolean = false,\n  ): void {\n    if (!this.canReaddir()) {\n      if (allowZalgo) cb(null, [])\n      else queueMicrotask(() => cb(null, []))\n      return\n    }\n\n    const children = this.children()\n    if (this.calledReaddir()) {\n      const c = children.slice(0, children.provisional)\n      if (allowZalgo) cb(null, c)\n      else queueMicrotask(() => cb(null, c))\n      return\n    }\n\n    // don't have to worry about zalgo at this point.\n    this.#onReaddirCB.push(cb)\n    if (this.#readdirCBInFlight) {\n      return\n    }\n    this.#readdirCBInFlight = true\n\n    // else read the directory, fill up children\n    // de-provisionalize any provisional children.\n    const fullpath = this.fullpath()\n    this.#fs.readdir(fullpath, { withFileTypes: true }, (er, entries) => {\n      if (er) {\n        this.#readdirFail((er as NodeJS.ErrnoException).code)\n        children.provisional = 0\n      } else {\n        // if we didn't get an error, we always get entries.\n        //@ts-ignore\n        for (const e of entries) {\n          this.#readdirAddChild(e, children)\n        }\n        this.#readdirSuccess(children)\n      }\n      this.#callOnReaddirCB(children.slice(0, children.provisional))\n      return\n    })\n  }\n\n  #asyncReaddirInFlight?: Promise\n\n  /**\n   * Return an array of known child entries.\n   *\n   * If the Path cannot or does not contain any children, then an empty array\n   * is returned.\n   *\n   * Results are cached, and thus may be out of date if the filesystem is\n   * mutated.\n   */\n  async readdir(): Promise {\n    if (!this.canReaddir()) {\n      return []\n    }\n\n    const children = this.children()\n    if (this.calledReaddir()) {\n      return children.slice(0, children.provisional)\n    }\n\n    // else read the directory, fill up children\n    // de-provisionalize any provisional children.\n    const fullpath = this.fullpath()\n    if (this.#asyncReaddirInFlight) {\n      await this.#asyncReaddirInFlight\n    } else {\n      /* c8 ignore start */\n      let resolve: () => void = () => {}\n      /* c8 ignore stop */\n      this.#asyncReaddirInFlight = new Promise(\n        res => (resolve = res),\n      )\n      try {\n        for (const e of await this.#fs.promises.readdir(fullpath, {\n          withFileTypes: true,\n        })) {\n          this.#readdirAddChild(e, children)\n        }\n        this.#readdirSuccess(children)\n      } catch (er) {\n        this.#readdirFail((er as NodeJS.ErrnoException).code)\n        children.provisional = 0\n      }\n      this.#asyncReaddirInFlight = undefined\n      resolve()\n    }\n    return children.slice(0, children.provisional)\n  }\n\n  /**\n   * synchronous {@link PathBase.readdir}\n   */\n  readdirSync(): PathBase[] {\n    if (!this.canReaddir()) {\n      return []\n    }\n\n    const children = this.children()\n    if (this.calledReaddir()) {\n      return children.slice(0, children.provisional)\n    }\n\n    // else read the directory, fill up children\n    // de-provisionalize any provisional children.\n    const fullpath = this.fullpath()\n    try {\n      for (const e of this.#fs.readdirSync(fullpath, {\n        withFileTypes: true,\n      })) {\n        this.#readdirAddChild(e, children)\n      }\n      this.#readdirSuccess(children)\n    } catch (er) {\n      this.#readdirFail((er as NodeJS.ErrnoException).code)\n      children.provisional = 0\n    }\n    return children.slice(0, children.provisional)\n  }\n\n  canReaddir() {\n    if (this.#type & ENOCHILD) return false\n    const ifmt = IFMT & this.#type\n    // we always set ENOTDIR when setting IFMT, so should be impossible\n    /* c8 ignore start */\n    if (!(ifmt === UNKNOWN || ifmt === IFDIR || ifmt === IFLNK)) {\n      return false\n    }\n    /* c8 ignore stop */\n    return true\n  }\n\n  shouldWalk(\n    dirs: Set,\n    walkFilter?: (e: PathBase) => boolean,\n  ): boolean {\n    return (\n      (this.#type & IFDIR) === IFDIR &&\n      !(this.#type & ENOCHILD) &&\n      !dirs.has(this) &&\n      (!walkFilter || walkFilter(this))\n    )\n  }\n\n  /**\n   * Return the Path object corresponding to path as resolved\n   * by realpath(3).\n   *\n   * If the realpath call fails for any reason, `undefined` is returned.\n   *\n   * Result is cached, and thus may be outdated if the filesystem is mutated.\n   * On success, returns a Path object.\n   */\n  async realpath(): Promise {\n    if (this.#realpath) return this.#realpath\n    if ((ENOREALPATH | ENOREADLINK | ENOENT) & this.#type) return undefined\n    try {\n      const rp = await this.#fs.promises.realpath(this.fullpath())\n      return (this.#realpath = this.resolve(rp))\n    } catch (_) {\n      this.#markENOREALPATH()\n    }\n  }\n\n  /**\n   * Synchronous {@link realpath}\n   */\n  realpathSync(): PathBase | undefined {\n    if (this.#realpath) return this.#realpath\n    if ((ENOREALPATH | ENOREADLINK | ENOENT) & this.#type) return undefined\n    try {\n      const rp = this.#fs.realpathSync(this.fullpath())\n      return (this.#realpath = this.resolve(rp))\n    } catch (_) {\n      this.#markENOREALPATH()\n    }\n  }\n\n  /**\n   * Internal method to mark this Path object as the scurry cwd,\n   * called by {@link PathScurry#chdir}\n   *\n   * @internal\n   */\n  [setAsCwd](oldCwd: PathBase): void {\n    if (oldCwd === this) return\n    oldCwd.isCWD = false\n    this.isCWD = true\n\n    const changed = new Set([])\n    let rp = []\n    let p: PathBase = this\n    while (p && p.parent) {\n      changed.add(p)\n      p.#relative = rp.join(this.sep)\n      p.#relativePosix = rp.join('/')\n      p = p.parent\n      rp.push('..')\n    }\n    // now un-memoize parents of old cwd\n    p = oldCwd\n    while (p && p.parent && !changed.has(p)) {\n      p.#relative = undefined\n      p.#relativePosix = undefined\n      p = p.parent\n    }\n  }\n}\n\n/**\n * Path class used on win32 systems\n *\n * Uses `'\\\\'` as the path separator for returned paths, either `'\\\\'` or `'/'`\n * as the path separator for parsing paths.\n */\nexport class PathWin32 extends PathBase {\n  /**\n   * Separator for generating path strings.\n   */\n  sep: '\\\\' = '\\\\'\n  /**\n   * Separator for parsing path strings.\n   */\n  splitSep: RegExp = eitherSep\n\n  /**\n   * Do not create new Path objects directly.  They should always be accessed\n   * via the PathScurry class or other methods on the Path class.\n   *\n   * @internal\n   */\n  constructor(\n    name: string,\n    type: number = UNKNOWN,\n    root: PathBase | undefined,\n    roots: { [k: string]: PathBase },\n    nocase: boolean,\n    children: ChildrenCache,\n    opts: PathOpts,\n  ) {\n    super(name, type, root, roots, nocase, children, opts)\n  }\n\n  /**\n   * @internal\n   */\n  newChild(name: string, type: number = UNKNOWN, opts: PathOpts = {}) {\n    return new PathWin32(\n      name,\n      type,\n      this.root,\n      this.roots,\n      this.nocase,\n      this.childrenCache(),\n      opts,\n    )\n  }\n\n  /**\n   * @internal\n   */\n  getRootString(path: string): string {\n    return win32.parse(path).root\n  }\n\n  /**\n   * @internal\n   */\n  getRoot(rootPath: string): PathBase {\n    rootPath = uncToDrive(rootPath.toUpperCase())\n    if (rootPath === this.root.name) {\n      return this.root\n    }\n    // ok, not that one, check if it matches another we know about\n    for (const [compare, root] of Object.entries(this.roots)) {\n      if (this.sameRoot(rootPath, compare)) {\n        return (this.roots[rootPath] = root)\n      }\n    }\n    // otherwise, have to create a new one.\n    return (this.roots[rootPath] = new PathScurryWin32(\n      rootPath,\n      this,\n    ).root)\n  }\n\n  /**\n   * @internal\n   */\n  sameRoot(rootPath: string, compare: string = this.root.name): boolean {\n    // windows can (rarely) have case-sensitive filesystem, but\n    // UNC and drive letters are always case-insensitive, and canonically\n    // represented uppercase.\n    rootPath = rootPath\n      .toUpperCase()\n      .replace(/\\//g, '\\\\')\n      .replace(uncDriveRegexp, '$1\\\\')\n    return rootPath === compare\n  }\n}\n\n/**\n * Path class used on all posix systems.\n *\n * Uses `'/'` as the path separator.\n */\nexport class PathPosix extends PathBase {\n  /**\n   * separator for parsing path strings\n   */\n  splitSep: '/' = '/'\n  /**\n   * separator for generating path strings\n   */\n  sep: '/' = '/'\n\n  /**\n   * Do not create new Path objects directly.  They should always be accessed\n   * via the PathScurry class or other methods on the Path class.\n   *\n   * @internal\n   */\n  constructor(\n    name: string,\n    type: number = UNKNOWN,\n    root: PathBase | undefined,\n    roots: { [k: string]: PathBase },\n    nocase: boolean,\n    children: ChildrenCache,\n    opts: PathOpts,\n  ) {\n    super(name, type, root, roots, nocase, children, opts)\n  }\n\n  /**\n   * @internal\n   */\n  getRootString(path: string): string {\n    return path.startsWith('/') ? '/' : ''\n  }\n\n  /**\n   * @internal\n   */\n  getRoot(_rootPath: string): PathBase {\n    return this.root\n  }\n\n  /**\n   * @internal\n   */\n  newChild(name: string, type: number = UNKNOWN, opts: PathOpts = {}) {\n    return new PathPosix(\n      name,\n      type,\n      this.root,\n      this.roots,\n      this.nocase,\n      this.childrenCache(),\n      opts,\n    )\n  }\n}\n\n/**\n * Options that may be provided to the PathScurry constructor\n */\nexport interface PathScurryOpts {\n  /**\n   * perform case-insensitive path matching. Default based on platform\n   * subclass.\n   */\n  nocase?: boolean\n  /**\n   * Number of Path entries to keep in the cache of Path child references.\n   *\n   * Setting this higher than 65536 will dramatically increase the data\n   * consumption and construction time overhead of each PathScurry.\n   *\n   * Setting this value to 256 or lower will significantly reduce the data\n   * consumption and construction time overhead, but may also reduce resolve()\n   * and readdir() performance on large filesystems.\n   *\n   * Default `16384`.\n   */\n  childrenCacheSize?: number\n  /**\n   * An object that overrides the built-in functions from the fs and\n   * fs/promises modules.\n   *\n   * See {@link FSOption}\n   */\n  fs?: FSOption\n}\n\n/**\n * The base class for all PathScurry classes, providing the interface for path\n * resolution and filesystem operations.\n *\n * Typically, you should *not* instantiate this class directly, but rather one\n * of the platform-specific classes, or the exported {@link PathScurry} which\n * defaults to the current platform.\n */\nexport abstract class PathScurryBase {\n  /**\n   * The root Path entry for the current working directory of this Scurry\n   */\n  root: PathBase\n  /**\n   * The string path for the root of this Scurry's current working directory\n   */\n  rootPath: string\n  /**\n   * A collection of all roots encountered, referenced by rootPath\n   */\n  roots: { [k: string]: PathBase }\n  /**\n   * The Path entry corresponding to this PathScurry's current working directory.\n   */\n  cwd: PathBase\n  #resolveCache: ResolveCache\n  #resolvePosixCache: ResolveCache\n  #children: ChildrenCache\n  /**\n   * Perform path comparisons case-insensitively.\n   *\n   * Defaults true on Darwin and Windows systems, false elsewhere.\n   */\n  nocase: boolean\n\n  /**\n   * The path separator used for parsing paths\n   *\n   * `'/'` on Posix systems, either `'/'` or `'\\\\'` on Windows\n   */\n  abstract sep: string | RegExp\n\n  #fs: FSValue\n\n  /**\n   * This class should not be instantiated directly.\n   *\n   * Use PathScurryWin32, PathScurryDarwin, PathScurryPosix, or PathScurry\n   *\n   * @internal\n   */\n  constructor(\n    cwd: URL | string = process.cwd(),\n    pathImpl: typeof win32 | typeof posix,\n    sep: string | RegExp,\n    {\n      nocase,\n      childrenCacheSize = 16 * 1024,\n      fs = defaultFS,\n    }: PathScurryOpts = {},\n  ) {\n    this.#fs = fsFromOption(fs)\n    if (cwd instanceof URL || cwd.startsWith('file://')) {\n      cwd = fileURLToPath(cwd)\n    }\n    // resolve and split root, and then add to the store.\n    // this is the only time we call path.resolve()\n    const cwdPath = pathImpl.resolve(cwd)\n    this.roots = Object.create(null)\n    this.rootPath = this.parseRootPath(cwdPath)\n    this.#resolveCache = new ResolveCache()\n    this.#resolvePosixCache = new ResolveCache()\n    this.#children = new ChildrenCache(childrenCacheSize)\n\n    const split = cwdPath.substring(this.rootPath.length).split(sep)\n    // resolve('/') leaves '', splits to [''], we don't want that.\n    if (split.length === 1 && !split[0]) {\n      split.pop()\n    }\n    /* c8 ignore start */\n    if (nocase === undefined) {\n      throw new TypeError(\n        'must provide nocase setting to PathScurryBase ctor',\n      )\n    }\n    /* c8 ignore stop */\n    this.nocase = nocase\n    this.root = this.newRoot(this.#fs)\n    this.roots[this.rootPath] = this.root\n    let prev: PathBase = this.root\n    let len = split.length - 1\n    const joinSep = pathImpl.sep\n    let abs = this.rootPath\n    let sawFirst = false\n    for (const part of split) {\n      const l = len--\n      prev = prev.child(part, {\n        relative: new Array(l).fill('..').join(joinSep),\n        relativePosix: new Array(l).fill('..').join('/'),\n        fullpath: (abs += (sawFirst ? '' : joinSep) + part),\n      })\n      sawFirst = true\n    }\n    this.cwd = prev\n  }\n\n  /**\n   * Get the depth of a provided path, string, or the cwd\n   */\n  depth(path: Path | string = this.cwd): number {\n    if (typeof path === 'string') {\n      path = this.cwd.resolve(path)\n    }\n    return path.depth()\n  }\n\n  /**\n   * Parse the root portion of a path string\n   *\n   * @internal\n   */\n  abstract parseRootPath(dir: string): string\n  /**\n   * create a new Path to use as root during construction.\n   *\n   * @internal\n   */\n  abstract newRoot(fs: FSValue): PathBase\n  /**\n   * Determine whether a given path string is absolute\n   */\n  abstract isAbsolute(p: string): boolean\n\n  /**\n   * Return the cache of child entries.  Exposed so subclasses can create\n   * child Path objects in a platform-specific way.\n   *\n   * @internal\n   */\n  childrenCache() {\n    return this.#children\n  }\n\n  /**\n   * Resolve one or more path strings to a resolved string\n   *\n   * Same interface as require('path').resolve.\n   *\n   * Much faster than path.resolve() when called multiple times for the same\n   * path, because the resolved Path objects are cached.  Much slower\n   * otherwise.\n   */\n  resolve(...paths: string[]): string {\n    // first figure out the minimum number of paths we have to test\n    // we always start at cwd, but any absolutes will bump the start\n    let r = ''\n    for (let i = paths.length - 1; i >= 0; i--) {\n      const p = paths[i]\n      if (!p || p === '.') continue\n      r = r ? `${p}/${r}` : p\n      if (this.isAbsolute(p)) {\n        break\n      }\n    }\n    const cached = this.#resolveCache.get(r)\n    if (cached !== undefined) {\n      return cached\n    }\n    const result = this.cwd.resolve(r).fullpath()\n    this.#resolveCache.set(r, result)\n    return result\n  }\n\n  /**\n   * Resolve one or more path strings to a resolved string, returning\n   * the posix path.  Identical to .resolve() on posix systems, but on\n   * windows will return a forward-slash separated UNC path.\n   *\n   * Same interface as require('path').resolve.\n   *\n   * Much faster than path.resolve() when called multiple times for the same\n   * path, because the resolved Path objects are cached.  Much slower\n   * otherwise.\n   */\n  resolvePosix(...paths: string[]): string {\n    // first figure out the minimum number of paths we have to test\n    // we always start at cwd, but any absolutes will bump the start\n    let r = ''\n    for (let i = paths.length - 1; i >= 0; i--) {\n      const p = paths[i]\n      if (!p || p === '.') continue\n      r = r ? `${p}/${r}` : p\n      if (this.isAbsolute(p)) {\n        break\n      }\n    }\n    const cached = this.#resolvePosixCache.get(r)\n    if (cached !== undefined) {\n      return cached\n    }\n    const result = this.cwd.resolve(r).fullpathPosix()\n    this.#resolvePosixCache.set(r, result)\n    return result\n  }\n\n  /**\n   * find the relative path from the cwd to the supplied path string or entry\n   */\n  relative(entry: PathBase | string = this.cwd): string {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    }\n    return entry.relative()\n  }\n\n  /**\n   * find the relative path from the cwd to the supplied path string or\n   * entry, using / as the path delimiter, even on Windows.\n   */\n  relativePosix(entry: PathBase | string = this.cwd): string {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    }\n    return entry.relativePosix()\n  }\n\n  /**\n   * Return the basename for the provided string or Path object\n   */\n  basename(entry: PathBase | string = this.cwd): string {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    }\n    return entry.name\n  }\n\n  /**\n   * Return the dirname for the provided string or Path object\n   */\n  dirname(entry: PathBase | string = this.cwd): string {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    }\n    return (entry.parent || entry).fullpath()\n  }\n\n  /**\n   * Return an array of known child entries.\n   *\n   * First argument may be either a string, or a Path object.\n   *\n   * If the Path cannot or does not contain any children, then an empty array\n   * is returned.\n   *\n   * Results are cached, and thus may be out of date if the filesystem is\n   * mutated.\n   *\n   * Unlike `fs.readdir()`, the `withFileTypes` option defaults to `true`. Set\n   * `{ withFileTypes: false }` to return strings.\n   */\n\n  readdir(): Promise\n  readdir(opts: { withFileTypes: true }): Promise\n  readdir(opts: { withFileTypes: false }): Promise\n  readdir(opts: { withFileTypes: boolean }): Promise\n  readdir(entry: PathBase | string): Promise\n  readdir(\n    entry: PathBase | string,\n    opts: { withFileTypes: true },\n  ): Promise\n  readdir(\n    entry: PathBase | string,\n    opts: { withFileTypes: false },\n  ): Promise\n  readdir(\n    entry: PathBase | string,\n    opts: { withFileTypes: boolean },\n  ): Promise\n  async readdir(\n    entry: PathBase | string | { withFileTypes: boolean } = this.cwd,\n    opts: { withFileTypes: boolean } = {\n      withFileTypes: true,\n    },\n  ): Promise {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    } else if (!(entry instanceof PathBase)) {\n      opts = entry\n      entry = this.cwd\n    }\n    const { withFileTypes } = opts\n    if (!entry.canReaddir()) {\n      return []\n    } else {\n      const p = await entry.readdir()\n      return withFileTypes ? p : p.map(e => e.name)\n    }\n  }\n\n  /**\n   * synchronous {@link PathScurryBase.readdir}\n   */\n  readdirSync(): PathBase[]\n  readdirSync(opts: { withFileTypes: true }): PathBase[]\n  readdirSync(opts: { withFileTypes: false }): string[]\n  readdirSync(opts: { withFileTypes: boolean }): PathBase[] | string[]\n  readdirSync(entry: PathBase | string): PathBase[]\n  readdirSync(\n    entry: PathBase | string,\n    opts: { withFileTypes: true },\n  ): PathBase[]\n  readdirSync(\n    entry: PathBase | string,\n    opts: { withFileTypes: false },\n  ): string[]\n  readdirSync(\n    entry: PathBase | string,\n    opts: { withFileTypes: boolean },\n  ): PathBase[] | string[]\n  readdirSync(\n    entry: PathBase | string | { withFileTypes: boolean } = this.cwd,\n    opts: { withFileTypes: boolean } = {\n      withFileTypes: true,\n    },\n  ): PathBase[] | string[] {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    } else if (!(entry instanceof PathBase)) {\n      opts = entry\n      entry = this.cwd\n    }\n    const { withFileTypes = true } = opts\n    if (!entry.canReaddir()) {\n      return []\n    } else if (withFileTypes) {\n      return entry.readdirSync()\n    } else {\n      return entry.readdirSync().map(e => e.name)\n    }\n  }\n\n  /**\n   * Call lstat() on the string or Path object, and update all known\n   * information that can be determined.\n   *\n   * Note that unlike `fs.lstat()`, the returned value does not contain some\n   * information, such as `mode`, `dev`, `nlink`, and `ino`.  If that\n   * information is required, you will need to call `fs.lstat` yourself.\n   *\n   * If the Path refers to a nonexistent file, or if the lstat call fails for\n   * any reason, `undefined` is returned.  Otherwise the updated Path object is\n   * returned.\n   *\n   * Results are cached, and thus may be out of date if the filesystem is\n   * mutated.\n   */\n  async lstat(\n    entry: string | PathBase = this.cwd,\n  ): Promise {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    }\n    return entry.lstat()\n  }\n\n  /**\n   * synchronous {@link PathScurryBase.lstat}\n   */\n  lstatSync(entry: string | PathBase = this.cwd): PathBase | undefined {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    }\n    return entry.lstatSync()\n  }\n\n  /**\n   * Return the Path object or string path corresponding to the target of a\n   * symbolic link.\n   *\n   * If the path is not a symbolic link, or if the readlink call fails for any\n   * reason, `undefined` is returned.\n   *\n   * Result is cached, and thus may be outdated if the filesystem is mutated.\n   *\n   * `{withFileTypes}` option defaults to `false`.\n   *\n   * On success, returns a Path object if `withFileTypes` option is true,\n   * otherwise a string.\n   */\n  readlink(): Promise\n  readlink(opt: { withFileTypes: false }): Promise\n  readlink(opt: { withFileTypes: true }): Promise\n  readlink(opt: {\n    withFileTypes: boolean\n  }): Promise\n  readlink(\n    entry: string | PathBase,\n    opt?: { withFileTypes: false },\n  ): Promise\n  readlink(\n    entry: string | PathBase,\n    opt: { withFileTypes: true },\n  ): Promise\n  readlink(\n    entry: string | PathBase,\n    opt: { withFileTypes: boolean },\n  ): Promise\n  async readlink(\n    entry: string | PathBase | { withFileTypes: boolean } = this.cwd,\n    { withFileTypes }: { withFileTypes: boolean } = {\n      withFileTypes: false,\n    },\n  ): Promise {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    } else if (!(entry instanceof PathBase)) {\n      withFileTypes = entry.withFileTypes\n      entry = this.cwd\n    }\n    const e = await entry.readlink()\n    return withFileTypes ? e : e?.fullpath()\n  }\n\n  /**\n   * synchronous {@link PathScurryBase.readlink}\n   */\n  readlinkSync(): string | undefined\n  readlinkSync(opt: { withFileTypes: false }): string | undefined\n  readlinkSync(opt: { withFileTypes: true }): PathBase | undefined\n  readlinkSync(opt: {\n    withFileTypes: boolean\n  }): PathBase | string | undefined\n  readlinkSync(\n    entry: string | PathBase,\n    opt?: { withFileTypes: false },\n  ): string | undefined\n  readlinkSync(\n    entry: string | PathBase,\n    opt: { withFileTypes: true },\n  ): PathBase | undefined\n  readlinkSync(\n    entry: string | PathBase,\n    opt: { withFileTypes: boolean },\n  ): string | PathBase | undefined\n  readlinkSync(\n    entry: string | PathBase | { withFileTypes: boolean } = this.cwd,\n    { withFileTypes }: { withFileTypes: boolean } = {\n      withFileTypes: false,\n    },\n  ): string | PathBase | undefined {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    } else if (!(entry instanceof PathBase)) {\n      withFileTypes = entry.withFileTypes\n      entry = this.cwd\n    }\n    const e = entry.readlinkSync()\n    return withFileTypes ? e : e?.fullpath()\n  }\n\n  /**\n   * Return the Path object or string path corresponding to path as resolved\n   * by realpath(3).\n   *\n   * If the realpath call fails for any reason, `undefined` is returned.\n   *\n   * Result is cached, and thus may be outdated if the filesystem is mutated.\n   *\n   * `{withFileTypes}` option defaults to `false`.\n   *\n   * On success, returns a Path object if `withFileTypes` option is true,\n   * otherwise a string.\n   */\n  realpath(): Promise\n  realpath(opt: { withFileTypes: false }): Promise\n  realpath(opt: { withFileTypes: true }): Promise\n  realpath(opt: {\n    withFileTypes: boolean\n  }): Promise\n  realpath(\n    entry: string | PathBase,\n    opt?: { withFileTypes: false },\n  ): Promise\n  realpath(\n    entry: string | PathBase,\n    opt: { withFileTypes: true },\n  ): Promise\n  realpath(\n    entry: string | PathBase,\n    opt: { withFileTypes: boolean },\n  ): Promise\n  async realpath(\n    entry: string | PathBase | { withFileTypes: boolean } = this.cwd,\n    { withFileTypes }: { withFileTypes: boolean } = {\n      withFileTypes: false,\n    },\n  ): Promise {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    } else if (!(entry instanceof PathBase)) {\n      withFileTypes = entry.withFileTypes\n      entry = this.cwd\n    }\n    const e = await entry.realpath()\n    return withFileTypes ? e : e?.fullpath()\n  }\n\n  realpathSync(): string | undefined\n  realpathSync(opt: { withFileTypes: false }): string | undefined\n  realpathSync(opt: { withFileTypes: true }): PathBase | undefined\n  realpathSync(opt: {\n    withFileTypes: boolean\n  }): PathBase | string | undefined\n  realpathSync(\n    entry: string | PathBase,\n    opt?: { withFileTypes: false },\n  ): string | undefined\n  realpathSync(\n    entry: string | PathBase,\n    opt: { withFileTypes: true },\n  ): PathBase | undefined\n  realpathSync(\n    entry: string | PathBase,\n    opt: { withFileTypes: boolean },\n  ): string | PathBase | undefined\n  realpathSync(\n    entry: string | PathBase | { withFileTypes: boolean } = this.cwd,\n    { withFileTypes }: { withFileTypes: boolean } = {\n      withFileTypes: false,\n    },\n  ): string | PathBase | undefined {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    } else if (!(entry instanceof PathBase)) {\n      withFileTypes = entry.withFileTypes\n      entry = this.cwd\n    }\n    const e = entry.realpathSync()\n    return withFileTypes ? e : e?.fullpath()\n  }\n\n  /**\n   * Asynchronously walk the directory tree, returning an array of\n   * all path strings or Path objects found.\n   *\n   * Note that this will be extremely memory-hungry on large filesystems.\n   * In such cases, it may be better to use the stream or async iterator\n   * walk implementation.\n   */\n  walk(): Promise\n  walk(\n    opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n  ): Promise\n  walk(opts: WalkOptionsWithFileTypesFalse): Promise\n  walk(opts: WalkOptions): Promise\n  walk(entry: string | PathBase): Promise\n  walk(\n    entry: string | PathBase,\n    opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n  ): Promise\n  walk(\n    entry: string | PathBase,\n    opts: WalkOptionsWithFileTypesFalse,\n  ): Promise\n  walk(\n    entry: string | PathBase,\n    opts: WalkOptions,\n  ): Promise\n  async walk(\n    entry: string | PathBase | WalkOptions = this.cwd,\n    opts: WalkOptions = {},\n  ): Promise {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    } else if (!(entry instanceof PathBase)) {\n      opts = entry\n      entry = this.cwd\n    }\n    const {\n      withFileTypes = true,\n      follow = false,\n      filter,\n      walkFilter,\n    } = opts\n    const results: (string | PathBase)[] = []\n    if (!filter || filter(entry)) {\n      results.push(withFileTypes ? entry : entry.fullpath())\n    }\n    const dirs = new Set()\n    const walk = (\n      dir: PathBase,\n      cb: (er?: NodeJS.ErrnoException) => void,\n    ) => {\n      dirs.add(dir)\n      dir.readdirCB((er, entries) => {\n        /* c8 ignore start */\n        if (er) {\n          return cb(er)\n        }\n        /* c8 ignore stop */\n        let len = entries.length\n        if (!len) return cb()\n        const next = () => {\n          if (--len === 0) {\n            cb()\n          }\n        }\n        for (const e of entries) {\n          if (!filter || filter(e)) {\n            results.push(withFileTypes ? e : e.fullpath())\n          }\n          if (follow && e.isSymbolicLink()) {\n            e.realpath()\n              .then(r => (r?.isUnknown() ? r.lstat() : r))\n              .then(r =>\n                r?.shouldWalk(dirs, walkFilter) ? walk(r, next) : next(),\n              )\n          } else {\n            if (e.shouldWalk(dirs, walkFilter)) {\n              walk(e, next)\n            } else {\n              next()\n            }\n          }\n        }\n      }, true) // zalgooooooo\n    }\n\n    const start = entry\n    return new Promise((res, rej) => {\n      walk(start, er => {\n        /* c8 ignore start */\n        if (er) return rej(er)\n        /* c8 ignore stop */\n        res(results as PathBase[] | string[])\n      })\n    })\n  }\n\n  /**\n   * Synchronously walk the directory tree, returning an array of\n   * all path strings or Path objects found.\n   *\n   * Note that this will be extremely memory-hungry on large filesystems.\n   * In such cases, it may be better to use the stream or async iterator\n   * walk implementation.\n   */\n  walkSync(): PathBase[]\n  walkSync(\n    opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n  ): PathBase[]\n  walkSync(opts: WalkOptionsWithFileTypesFalse): string[]\n  walkSync(opts: WalkOptions): string[] | PathBase[]\n  walkSync(entry: string | PathBase): PathBase[]\n  walkSync(\n    entry: string | PathBase,\n    opts: WalkOptionsWithFileTypesUnset | WalkOptionsWithFileTypesTrue,\n  ): PathBase[]\n  walkSync(\n    entry: string | PathBase,\n    opts: WalkOptionsWithFileTypesFalse,\n  ): string[]\n  walkSync(\n    entry: string | PathBase,\n    opts: WalkOptions,\n  ): PathBase[] | string[]\n  walkSync(\n    entry: string | PathBase | WalkOptions = this.cwd,\n    opts: WalkOptions = {},\n  ): PathBase[] | string[] {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    } else if (!(entry instanceof PathBase)) {\n      opts = entry\n      entry = this.cwd\n    }\n    const {\n      withFileTypes = true,\n      follow = false,\n      filter,\n      walkFilter,\n    } = opts\n    const results: (string | PathBase)[] = []\n    if (!filter || filter(entry)) {\n      results.push(withFileTypes ? entry : entry.fullpath())\n    }\n    const dirs = new Set([entry])\n    for (const dir of dirs) {\n      const entries = dir.readdirSync()\n      for (const e of entries) {\n        if (!filter || filter(e)) {\n          results.push(withFileTypes ? e : e.fullpath())\n        }\n        let r: PathBase | undefined = e\n        if (e.isSymbolicLink()) {\n          if (!(follow && (r = e.realpathSync()))) continue\n          if (r.isUnknown()) r.lstatSync()\n        }\n        if (r.shouldWalk(dirs, walkFilter)) {\n          dirs.add(r)\n        }\n      }\n    }\n    return results as string[] | PathBase[]\n  }\n\n  /**\n   * Support for `for await`\n   *\n   * Alias for {@link PathScurryBase.iterate}\n   *\n   * Note: As of Node 19, this is very slow, compared to other methods of\n   * walking.  Consider using {@link PathScurryBase.stream} if memory overhead\n   * and backpressure are concerns, or {@link PathScurryBase.walk} if not.\n   */\n  [Symbol.asyncIterator]() {\n    return this.iterate()\n  }\n\n  /**\n   * Async generator form of {@link PathScurryBase.walk}\n   *\n   * Note: As of Node 19, this is very slow, compared to other methods of\n   * walking, especially if most/all of the directory tree has been previously\n   * walked.  Consider using {@link PathScurryBase.stream} if memory overhead\n   * and backpressure are concerns, or {@link PathScurryBase.walk} if not.\n   */\n  iterate(): AsyncGenerator\n  iterate(\n    opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n  ): AsyncGenerator\n  iterate(\n    opts: WalkOptionsWithFileTypesFalse,\n  ): AsyncGenerator\n  iterate(opts: WalkOptions): AsyncGenerator\n  iterate(entry: string | PathBase): AsyncGenerator\n  iterate(\n    entry: string | PathBase,\n    opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n  ): AsyncGenerator\n  iterate(\n    entry: string | PathBase,\n    opts: WalkOptionsWithFileTypesFalse,\n  ): AsyncGenerator\n  iterate(\n    entry: string | PathBase,\n    opts: WalkOptions,\n  ): AsyncGenerator\n  iterate(\n    entry: string | PathBase | WalkOptions = this.cwd,\n    options: WalkOptions = {},\n  ): AsyncGenerator {\n    // iterating async over the stream is significantly more performant,\n    // especially in the warm-cache scenario, because it buffers up directory\n    // entries in the background instead of waiting for a yield for each one.\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    } else if (!(entry instanceof PathBase)) {\n      options = entry\n      entry = this.cwd\n    }\n    return this.stream(entry, options)[Symbol.asyncIterator]()\n  }\n\n  /**\n   * Iterating over a PathScurry performs a synchronous walk.\n   *\n   * Alias for {@link PathScurryBase.iterateSync}\n   */\n  [Symbol.iterator]() {\n    return this.iterateSync()\n  }\n\n  iterateSync(): Generator\n  iterateSync(\n    opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n  ): Generator\n  iterateSync(\n    opts: WalkOptionsWithFileTypesFalse,\n  ): Generator\n  iterateSync(opts: WalkOptions): Generator\n  iterateSync(entry: string | PathBase): Generator\n  iterateSync(\n    entry: string | PathBase,\n    opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n  ): Generator\n  iterateSync(\n    entry: string | PathBase,\n    opts: WalkOptionsWithFileTypesFalse,\n  ): Generator\n  iterateSync(\n    entry: string | PathBase,\n    opts: WalkOptions,\n  ): Generator\n  *iterateSync(\n    entry: string | PathBase | WalkOptions = this.cwd,\n    opts: WalkOptions = {},\n  ): Generator {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    } else if (!(entry instanceof PathBase)) {\n      opts = entry\n      entry = this.cwd\n    }\n    const {\n      withFileTypes = true,\n      follow = false,\n      filter,\n      walkFilter,\n    } = opts\n    if (!filter || filter(entry)) {\n      yield withFileTypes ? entry : entry.fullpath()\n    }\n    const dirs = new Set([entry])\n    for (const dir of dirs) {\n      const entries = dir.readdirSync()\n      for (const e of entries) {\n        if (!filter || filter(e)) {\n          yield withFileTypes ? e : e.fullpath()\n        }\n        let r: PathBase | undefined = e\n        if (e.isSymbolicLink()) {\n          if (!(follow && (r = e.realpathSync()))) continue\n          if (r.isUnknown()) r.lstatSync()\n        }\n        if (r.shouldWalk(dirs, walkFilter)) {\n          dirs.add(r)\n        }\n      }\n    }\n  }\n\n  /**\n   * Stream form of {@link PathScurryBase.walk}\n   *\n   * Returns a Minipass stream that emits {@link PathBase} objects by default,\n   * or strings if `{ withFileTypes: false }` is set in the options.\n   */\n  stream(): Minipass\n  stream(\n    opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n  ): Minipass\n  stream(opts: WalkOptionsWithFileTypesFalse): Minipass\n  stream(opts: WalkOptions): Minipass\n  stream(entry: string | PathBase): Minipass\n  stream(\n    entry: string | PathBase,\n    opts: WalkOptionsWithFileTypesUnset | WalkOptionsWithFileTypesTrue,\n  ): Minipass\n  stream(\n    entry: string | PathBase,\n    opts: WalkOptionsWithFileTypesFalse,\n  ): Minipass\n  stream(\n    entry: string | PathBase,\n    opts: WalkOptions,\n  ): Minipass | Minipass\n  stream(\n    entry: string | PathBase | WalkOptions = this.cwd,\n    opts: WalkOptions = {},\n  ): Minipass | Minipass {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    } else if (!(entry instanceof PathBase)) {\n      opts = entry\n      entry = this.cwd\n    }\n    const {\n      withFileTypes = true,\n      follow = false,\n      filter,\n      walkFilter,\n    } = opts\n    const results = new Minipass({ objectMode: true })\n    if (!filter || filter(entry)) {\n      results.write(withFileTypes ? entry : entry.fullpath())\n    }\n    const dirs = new Set()\n    const queue: PathBase[] = [entry]\n    let processing = 0\n    const process = () => {\n      let paused = false\n      while (!paused) {\n        const dir = queue.shift()\n        if (!dir) {\n          if (processing === 0) results.end()\n          return\n        }\n\n        processing++\n        dirs.add(dir)\n\n        const onReaddir = (\n          er: null | NodeJS.ErrnoException,\n          entries: PathBase[],\n          didRealpaths: boolean = false,\n        ) => {\n          /* c8 ignore start */\n          if (er) return results.emit('error', er)\n          /* c8 ignore stop */\n          if (follow && !didRealpaths) {\n            const promises: Promise[] = []\n            for (const e of entries) {\n              if (e.isSymbolicLink()) {\n                promises.push(\n                  e\n                    .realpath()\n                    .then((r: PathBase | undefined) =>\n                      r?.isUnknown() ? r.lstat() : r,\n                    ),\n                )\n              }\n            }\n            if (promises.length) {\n              Promise.all(promises).then(() =>\n                onReaddir(null, entries, true),\n              )\n              return\n            }\n          }\n\n          for (const e of entries) {\n            if (e && (!filter || filter(e))) {\n              if (!results.write(withFileTypes ? e : e.fullpath())) {\n                paused = true\n              }\n            }\n          }\n\n          processing--\n          for (const e of entries) {\n            const r = e.realpathCached() || e\n            if (r.shouldWalk(dirs, walkFilter)) {\n              queue.push(r)\n            }\n          }\n          if (paused && !results.flowing) {\n            results.once('drain', process)\n          } else if (!sync) {\n            process()\n          }\n        }\n\n        // zalgo containment\n        let sync = true\n        dir.readdirCB(onReaddir, true)\n        sync = false\n      }\n    }\n    process()\n    return results as Minipass | Minipass\n  }\n\n  /**\n   * Synchronous form of {@link PathScurryBase.stream}\n   *\n   * Returns a Minipass stream that emits {@link PathBase} objects by default,\n   * or strings if `{ withFileTypes: false }` is set in the options.\n   *\n   * Will complete the walk in a single tick if the stream is consumed fully.\n   * Otherwise, will pause as needed for stream backpressure.\n   */\n  streamSync(): Minipass\n  streamSync(\n    opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n  ): Minipass\n  streamSync(opts: WalkOptionsWithFileTypesFalse): Minipass\n  streamSync(opts: WalkOptions): Minipass\n  streamSync(entry: string | PathBase): Minipass\n  streamSync(\n    entry: string | PathBase,\n    opts: WalkOptionsWithFileTypesUnset | WalkOptionsWithFileTypesTrue,\n  ): Minipass\n  streamSync(\n    entry: string | PathBase,\n    opts: WalkOptionsWithFileTypesFalse,\n  ): Minipass\n  streamSync(\n    entry: string | PathBase,\n    opts: WalkOptions,\n  ): Minipass | Minipass\n  streamSync(\n    entry: string | PathBase | WalkOptions = this.cwd,\n    opts: WalkOptions = {},\n  ): Minipass | Minipass {\n    if (typeof entry === 'string') {\n      entry = this.cwd.resolve(entry)\n    } else if (!(entry instanceof PathBase)) {\n      opts = entry\n      entry = this.cwd\n    }\n    const {\n      withFileTypes = true,\n      follow = false,\n      filter,\n      walkFilter,\n    } = opts\n    const results = new Minipass({ objectMode: true })\n    const dirs = new Set()\n    if (!filter || filter(entry)) {\n      results.write(withFileTypes ? entry : entry.fullpath())\n    }\n    const queue: PathBase[] = [entry]\n    let processing = 0\n    const process = () => {\n      let paused = false\n      while (!paused) {\n        const dir = queue.shift()\n        if (!dir) {\n          if (processing === 0) results.end()\n          return\n        }\n        processing++\n        dirs.add(dir)\n\n        const entries = dir.readdirSync()\n        for (const e of entries) {\n          if (!filter || filter(e)) {\n            if (!results.write(withFileTypes ? e : e.fullpath())) {\n              paused = true\n            }\n          }\n        }\n        processing--\n        for (const e of entries) {\n          let r: PathBase | undefined = e\n          if (e.isSymbolicLink()) {\n            if (!(follow && (r = e.realpathSync()))) continue\n            if (r.isUnknown()) r.lstatSync()\n          }\n          if (r.shouldWalk(dirs, walkFilter)) {\n            queue.push(r)\n          }\n        }\n      }\n      if (paused && !results.flowing) results.once('drain', process)\n    }\n    process()\n    return results as Minipass | Minipass\n  }\n\n  chdir(path: string | Path = this.cwd) {\n    const oldCwd = this.cwd\n    this.cwd = typeof path === 'string' ? this.cwd.resolve(path) : path\n    this.cwd[setAsCwd](oldCwd)\n  }\n}\n\n/**\n * Options provided to all walk methods.\n */\nexport interface WalkOptions {\n  /**\n   * Return results as {@link PathBase} objects rather than strings.\n   * When set to false, results are fully resolved paths, as returned by\n   * {@link PathBase.fullpath}.\n   * @default true\n   */\n  withFileTypes?: boolean\n\n  /**\n   *  Attempt to read directory entries from symbolic links. Otherwise, only\n   *  actual directories are traversed. Regardless of this setting, a given\n   *  target path will only ever be walked once, meaning that a symbolic link\n   *  to a previously traversed directory will never be followed.\n   *\n   *  Setting this imposes a slight performance penalty, because `readlink`\n   *  must be called on all symbolic links encountered, in order to avoid\n   *  infinite cycles.\n   * @default false\n   */\n  follow?: boolean\n\n  /**\n   * Only return entries where the provided function returns true.\n   *\n   * This will not prevent directories from being traversed, even if they do\n   * not pass the filter, though it will prevent directories themselves from\n   * being included in the result set.  See {@link walkFilter}\n   *\n   * Asynchronous functions are not supported here.\n   *\n   * By default, if no filter is provided, all entries and traversed\n   * directories are included.\n   */\n  filter?: (entry: PathBase) => boolean\n\n  /**\n   * Only traverse directories (and in the case of {@link follow} being set to\n   * true, symbolic links to directories) if the provided function returns\n   * true.\n   *\n   * This will not prevent directories from being included in the result set,\n   * even if they do not pass the supplied filter function.  See {@link filter}\n   * to do that.\n   *\n   * Asynchronous functions are not supported here.\n   */\n  walkFilter?: (entry: PathBase) => boolean\n}\n\nexport type WalkOptionsWithFileTypesUnset = WalkOptions & {\n  withFileTypes?: undefined\n}\nexport type WalkOptionsWithFileTypesTrue = WalkOptions & {\n  withFileTypes: true\n}\nexport type WalkOptionsWithFileTypesFalse = WalkOptions & {\n  withFileTypes: false\n}\n\n/**\n * Windows implementation of {@link PathScurryBase}\n *\n * Defaults to case insensitve, uses `'\\\\'` to generate path strings.  Uses\n * {@link PathWin32} for Path objects.\n */\nexport class PathScurryWin32 extends PathScurryBase {\n  /**\n   * separator for generating path strings\n   */\n  sep: '\\\\' = '\\\\'\n\n  constructor(\n    cwd: URL | string = process.cwd(),\n    opts: PathScurryOpts = {},\n  ) {\n    const { nocase = true } = opts\n    super(cwd, win32, '\\\\', { ...opts, nocase })\n    this.nocase = nocase\n    for (let p: PathBase | undefined = this.cwd; p; p = p.parent) {\n      p.nocase = this.nocase\n    }\n  }\n\n  /**\n   * @internal\n   */\n  parseRootPath(dir: string): string {\n    // if the path starts with a single separator, it's not a UNC, and we'll\n    // just get separator as the root, and driveFromUNC will return \\\n    // In that case, mount \\ on the root from the cwd.\n    return win32.parse(dir).root.toUpperCase()\n  }\n\n  /**\n   * @internal\n   */\n  newRoot(fs: FSValue) {\n    return new PathWin32(\n      this.rootPath,\n      IFDIR,\n      undefined,\n      this.roots,\n      this.nocase,\n      this.childrenCache(),\n      { fs },\n    )\n  }\n\n  /**\n   * Return true if the provided path string is an absolute path\n   */\n  isAbsolute(p: string): boolean {\n    return (\n      p.startsWith('/') || p.startsWith('\\\\') || /^[a-z]:(\\/|\\\\)/i.test(p)\n    )\n  }\n}\n\n/**\n * {@link PathScurryBase} implementation for all posix systems other than Darwin.\n *\n * Defaults to case-sensitive matching, uses `'/'` to generate path strings.\n *\n * Uses {@link PathPosix} for Path objects.\n */\nexport class PathScurryPosix extends PathScurryBase {\n  /**\n   * separator for generating path strings\n   */\n  sep: '/' = '/'\n  constructor(\n    cwd: URL | string = process.cwd(),\n    opts: PathScurryOpts = {},\n  ) {\n    const { nocase = false } = opts\n    super(cwd, posix, '/', { ...opts, nocase })\n    this.nocase = nocase\n  }\n\n  /**\n   * @internal\n   */\n  parseRootPath(_dir: string): string {\n    return '/'\n  }\n\n  /**\n   * @internal\n   */\n  newRoot(fs: FSValue) {\n    return new PathPosix(\n      this.rootPath,\n      IFDIR,\n      undefined,\n      this.roots,\n      this.nocase,\n      this.childrenCache(),\n      { fs },\n    )\n  }\n\n  /**\n   * Return true if the provided path string is an absolute path\n   */\n  isAbsolute(p: string): boolean {\n    return p.startsWith('/')\n  }\n}\n\n/**\n * {@link PathScurryBase} implementation for Darwin (macOS) systems.\n *\n * Defaults to case-insensitive matching, uses `'/'` for generating path\n * strings.\n *\n * Uses {@link PathPosix} for Path objects.\n */\nexport class PathScurryDarwin extends PathScurryPosix {\n  constructor(\n    cwd: URL | string = process.cwd(),\n    opts: PathScurryOpts = {},\n  ) {\n    const { nocase = true } = opts\n    super(cwd, { ...opts, nocase })\n  }\n}\n\n/**\n * Default {@link PathBase} implementation for the current platform.\n *\n * {@link PathWin32} on Windows systems, {@link PathPosix} on all others.\n */\nexport const Path = process.platform === 'win32' ? PathWin32 : PathPosix\nexport type Path = PathBase | InstanceType\n\n/**\n * Default {@link PathScurryBase} implementation for the current platform.\n *\n * {@link PathScurryWin32} on Windows systems, {@link PathScurryDarwin} on\n * Darwin (macOS) systems, {@link PathScurryPosix} on all others.\n */\nexport const PathScurry:\n  | typeof PathScurryWin32\n  | typeof PathScurryDarwin\n  | typeof PathScurryPosix =\n  process.platform === 'win32' ? PathScurryWin32\n  : process.platform === 'darwin' ? PathScurryDarwin\n  : PathScurryPosix\nexport type PathScurry = PathScurryBase | InstanceType\n"]}
      \ No newline at end of file
      diff --git a/node_modules/path-scurry/dist/esm/package.json b/node_modules/path-scurry/dist/esm/package.json
      new file mode 100644
      index 00000000..3dbc1ca5
      --- /dev/null
      +++ b/node_modules/path-scurry/dist/esm/package.json
      @@ -0,0 +1,3 @@
      +{
      +  "type": "module"
      +}
      diff --git a/node_modules/path-scurry/package.json b/node_modules/path-scurry/package.json
      new file mode 100644
      index 00000000..68123fb7
      --- /dev/null
      +++ b/node_modules/path-scurry/package.json
      @@ -0,0 +1,72 @@
      +{
      +  "name": "path-scurry",
      +  "version": "2.0.2",
      +  "description": "walk paths fast and efficiently",
      +  "author": "Isaac Z. Schlueter  (https://blog.izs.me)",
      +  "main": "./dist/commonjs/index.js",
      +  "type": "module",
      +  "exports": {
      +    "./package.json": "./package.json",
      +    ".": {
      +      "import": {
      +        "types": "./dist/esm/index.d.ts",
      +        "default": "./dist/esm/index.js"
      +      },
      +      "require": {
      +        "types": "./dist/commonjs/index.d.ts",
      +        "default": "./dist/commonjs/index.js"
      +      }
      +    }
      +  },
      +  "files": [
      +    "dist"
      +  ],
      +  "license": "BlueOak-1.0.0",
      +  "scripts": {
      +    "preversion": "npm test",
      +    "postversion": "npm publish",
      +    "prepublishOnly": "git push origin --follow-tags",
      +    "prepare": "tshy",
      +    "pretest": "npm run prepare",
      +    "presnap": "npm run prepare",
      +    "test": "tap",
      +    "snap": "tap",
      +    "format": "prettier --write . --log-level warn",
      +    "typedoc": "typedoc --tsconfig tsconfig-esm.json ./src/*.ts",
      +    "bench": "bash ./scripts/bench.sh"
      +  },
      +  "devDependencies": {
      +    "@nodelib/fs.walk": "^3.0.1",
      +    "@types/node": "^25.3.0",
      +    "mkdirp": "^3.0.0",
      +    "prettier": "^3.3.2",
      +    "rimraf": "^6.1.3",
      +    "tap": "^21.6.1",
      +    "ts-node": "^10.9.2",
      +    "tshy": "^3.3.2",
      +    "typedoc": "^0.28.17"
      +  },
      +  "engines": {
      +    "node": "18 || 20 || >=22"
      +  },
      +  "funding": {
      +    "url": "https://github.com/sponsors/isaacs"
      +  },
      +  "repository": {
      +    "type": "git",
      +    "url": "git+https://github.com/isaacs/path-scurry"
      +  },
      +  "dependencies": {
      +    "lru-cache": "^11.0.0",
      +    "minipass": "^7.1.2"
      +  },
      +  "tshy": {
      +    "selfLink": false,
      +    "exports": {
      +      "./package.json": "./package.json",
      +      ".": "./src/index.ts"
      +    }
      +  },
      +  "types": "./dist/commonjs/index.d.ts",
      +  "module": "./dist/esm/index.js"
      +}
      diff --git a/node_modules/picocolors/LICENSE b/node_modules/picocolors/LICENSE
      new file mode 100644
      index 00000000..46c9b95d
      --- /dev/null
      +++ b/node_modules/picocolors/LICENSE
      @@ -0,0 +1,15 @@
      +ISC License
      +
      +Copyright (c) 2021-2024 Oleksii Raspopov, Kostiantyn Denysov, Anton Verinov
      +
      +Permission to use, copy, modify, and/or distribute this software for any
      +purpose with or without fee is hereby granted, provided that the above
      +copyright notice and this permission notice appear in all copies.
      +
      +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
      +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
      +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
      +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
      +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
      +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
      +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
      diff --git a/node_modules/picocolors/README.md b/node_modules/picocolors/README.md
      new file mode 100644
      index 00000000..8e47aa8e
      --- /dev/null
      +++ b/node_modules/picocolors/README.md
      @@ -0,0 +1,21 @@
      +# picocolors
      +
      +The tiniest and the fastest library for terminal output formatting with ANSI colors.
      +
      +```javascript
      +import pc from "picocolors"
      +
      +console.log(
      +  pc.green(`How are ${pc.italic(`you`)} doing?`)
      +)
      +```
      +
      +- **No dependencies.**
      +- **14 times** smaller and **2 times** faster than chalk.
      +- Used by popular tools like PostCSS, SVGO, Stylelint, and Browserslist.
      +- Node.js v6+ & browsers support. Support for both CJS and ESM projects.
      +- TypeScript type declarations included.
      +- [`NO_COLOR`](https://no-color.org/) friendly.
      +
      +## Docs
      +Read **[full docs](https://github.com/alexeyraspopov/picocolors#readme)** on GitHub.
      diff --git a/node_modules/picocolors/package.json b/node_modules/picocolors/package.json
      new file mode 100644
      index 00000000..372d4b64
      --- /dev/null
      +++ b/node_modules/picocolors/package.json
      @@ -0,0 +1,25 @@
      +{
      +  "name": "picocolors",
      +  "version": "1.1.1",
      +  "main": "./picocolors.js",
      +  "types": "./picocolors.d.ts",
      +  "browser": {
      +    "./picocolors.js": "./picocolors.browser.js"
      +  },
      +  "sideEffects": false,
      +  "description": "The tiniest and the fastest library for terminal output formatting with ANSI colors",
      +  "files": [
      +    "picocolors.*",
      +    "types.d.ts"
      +  ],
      +  "keywords": [
      +    "terminal",
      +    "colors",
      +    "formatting",
      +    "cli",
      +    "console"
      +  ],
      +  "author": "Alexey Raspopov",
      +  "repository": "alexeyraspopov/picocolors",
      +  "license": "ISC"
      +}
      diff --git a/node_modules/picocolors/picocolors.browser.js b/node_modules/picocolors/picocolors.browser.js
      new file mode 100644
      index 00000000..9dcf637c
      --- /dev/null
      +++ b/node_modules/picocolors/picocolors.browser.js
      @@ -0,0 +1,4 @@
      +var x=String;
      +var create=function() {return {isColorSupported:false,reset:x,bold:x,dim:x,italic:x,underline:x,inverse:x,hidden:x,strikethrough:x,black:x,red:x,green:x,yellow:x,blue:x,magenta:x,cyan:x,white:x,gray:x,bgBlack:x,bgRed:x,bgGreen:x,bgYellow:x,bgBlue:x,bgMagenta:x,bgCyan:x,bgWhite:x,blackBright:x,redBright:x,greenBright:x,yellowBright:x,blueBright:x,magentaBright:x,cyanBright:x,whiteBright:x,bgBlackBright:x,bgRedBright:x,bgGreenBright:x,bgYellowBright:x,bgBlueBright:x,bgMagentaBright:x,bgCyanBright:x,bgWhiteBright:x}};
      +module.exports=create();
      +module.exports.createColors = create;
      diff --git a/node_modules/picocolors/picocolors.d.ts b/node_modules/picocolors/picocolors.d.ts
      new file mode 100644
      index 00000000..94e146a8
      --- /dev/null
      +++ b/node_modules/picocolors/picocolors.d.ts
      @@ -0,0 +1,5 @@
      +import { Colors } from "./types"
      +
      +declare const picocolors: Colors & { createColors: (enabled?: boolean) => Colors }
      +
      +export = picocolors
      diff --git a/node_modules/picocolors/picocolors.js b/node_modules/picocolors/picocolors.js
      new file mode 100644
      index 00000000..e32df854
      --- /dev/null
      +++ b/node_modules/picocolors/picocolors.js
      @@ -0,0 +1,75 @@
      +let p = process || {}, argv = p.argv || [], env = p.env || {}
      +let isColorSupported =
      +	!(!!env.NO_COLOR || argv.includes("--no-color")) &&
      +	(!!env.FORCE_COLOR || argv.includes("--color") || p.platform === "win32" || ((p.stdout || {}).isTTY && env.TERM !== "dumb") || !!env.CI)
      +
      +let formatter = (open, close, replace = open) =>
      +	input => {
      +		let string = "" + input, index = string.indexOf(close, open.length)
      +		return ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close
      +	}
      +
      +let replaceClose = (string, close, replace, index) => {
      +	let result = "", cursor = 0
      +	do {
      +		result += string.substring(cursor, index) + replace
      +		cursor = index + close.length
      +		index = string.indexOf(close, cursor)
      +	} while (~index)
      +	return result + string.substring(cursor)
      +}
      +
      +let createColors = (enabled = isColorSupported) => {
      +	let f = enabled ? formatter : () => String
      +	return {
      +		isColorSupported: enabled,
      +		reset: f("\x1b[0m", "\x1b[0m"),
      +		bold: f("\x1b[1m", "\x1b[22m", "\x1b[22m\x1b[1m"),
      +		dim: f("\x1b[2m", "\x1b[22m", "\x1b[22m\x1b[2m"),
      +		italic: f("\x1b[3m", "\x1b[23m"),
      +		underline: f("\x1b[4m", "\x1b[24m"),
      +		inverse: f("\x1b[7m", "\x1b[27m"),
      +		hidden: f("\x1b[8m", "\x1b[28m"),
      +		strikethrough: f("\x1b[9m", "\x1b[29m"),
      +
      +		black: f("\x1b[30m", "\x1b[39m"),
      +		red: f("\x1b[31m", "\x1b[39m"),
      +		green: f("\x1b[32m", "\x1b[39m"),
      +		yellow: f("\x1b[33m", "\x1b[39m"),
      +		blue: f("\x1b[34m", "\x1b[39m"),
      +		magenta: f("\x1b[35m", "\x1b[39m"),
      +		cyan: f("\x1b[36m", "\x1b[39m"),
      +		white: f("\x1b[37m", "\x1b[39m"),
      +		gray: f("\x1b[90m", "\x1b[39m"),
      +
      +		bgBlack: f("\x1b[40m", "\x1b[49m"),
      +		bgRed: f("\x1b[41m", "\x1b[49m"),
      +		bgGreen: f("\x1b[42m", "\x1b[49m"),
      +		bgYellow: f("\x1b[43m", "\x1b[49m"),
      +		bgBlue: f("\x1b[44m", "\x1b[49m"),
      +		bgMagenta: f("\x1b[45m", "\x1b[49m"),
      +		bgCyan: f("\x1b[46m", "\x1b[49m"),
      +		bgWhite: f("\x1b[47m", "\x1b[49m"),
      +
      +		blackBright: f("\x1b[90m", "\x1b[39m"),
      +		redBright: f("\x1b[91m", "\x1b[39m"),
      +		greenBright: f("\x1b[92m", "\x1b[39m"),
      +		yellowBright: f("\x1b[93m", "\x1b[39m"),
      +		blueBright: f("\x1b[94m", "\x1b[39m"),
      +		magentaBright: f("\x1b[95m", "\x1b[39m"),
      +		cyanBright: f("\x1b[96m", "\x1b[39m"),
      +		whiteBright: f("\x1b[97m", "\x1b[39m"),
      +
      +		bgBlackBright: f("\x1b[100m", "\x1b[49m"),
      +		bgRedBright: f("\x1b[101m", "\x1b[49m"),
      +		bgGreenBright: f("\x1b[102m", "\x1b[49m"),
      +		bgYellowBright: f("\x1b[103m", "\x1b[49m"),
      +		bgBlueBright: f("\x1b[104m", "\x1b[49m"),
      +		bgMagentaBright: f("\x1b[105m", "\x1b[49m"),
      +		bgCyanBright: f("\x1b[106m", "\x1b[49m"),
      +		bgWhiteBright: f("\x1b[107m", "\x1b[49m"),
      +	}
      +}
      +
      +module.exports = createColors()
      +module.exports.createColors = createColors
      diff --git a/node_modules/picocolors/types.d.ts b/node_modules/picocolors/types.d.ts
      new file mode 100644
      index 00000000..cd1aec46
      --- /dev/null
      +++ b/node_modules/picocolors/types.d.ts
      @@ -0,0 +1,51 @@
      +export type Formatter = (input: string | number | null | undefined) => string
      +
      +export interface Colors {
      +	isColorSupported: boolean
      +
      +	reset: Formatter
      +	bold: Formatter
      +	dim: Formatter
      +	italic: Formatter
      +	underline: Formatter
      +	inverse: Formatter
      +	hidden: Formatter
      +	strikethrough: Formatter
      +
      +	black: Formatter
      +	red: Formatter
      +	green: Formatter
      +	yellow: Formatter
      +	blue: Formatter
      +	magenta: Formatter
      +	cyan: Formatter
      +	white: Formatter
      +	gray: Formatter
      +
      +	bgBlack: Formatter
      +	bgRed: Formatter
      +	bgGreen: Formatter
      +	bgYellow: Formatter
      +	bgBlue: Formatter
      +	bgMagenta: Formatter
      +	bgCyan: Formatter
      +	bgWhite: Formatter
      +
      +	blackBright: Formatter
      +	redBright: Formatter
      +	greenBright: Formatter
      +	yellowBright: Formatter
      +	blueBright: Formatter
      +	magentaBright: Formatter
      +	cyanBright: Formatter
      +	whiteBright: Formatter
      +
      +	bgBlackBright: Formatter
      +	bgRedBright: Formatter
      +	bgGreenBright: Formatter
      +	bgYellowBright: Formatter
      +	bgBlueBright: Formatter
      +	bgMagentaBright: Formatter
      +	bgCyanBright: Formatter
      +	bgWhiteBright: Formatter
      +}
      diff --git a/node_modules/playwright-core/LICENSE b/node_modules/playwright-core/LICENSE
      new file mode 100644
      index 00000000..4ace03dd
      --- /dev/null
      +++ b/node_modules/playwright-core/LICENSE
      @@ -0,0 +1,202 @@
      +                                 Apache License
      +                           Version 2.0, January 2004
      +                        http://www.apache.org/licenses/
      +
      +   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
      +
      +   1. Definitions.
      +
      +      "License" shall mean the terms and conditions for use, reproduction,
      +      and distribution as defined by Sections 1 through 9 of this document.
      +
      +      "Licensor" shall mean the copyright owner or entity authorized by
      +      the copyright owner that is granting the License.
      +
      +      "Legal Entity" shall mean the union of the acting entity and all
      +      other entities that control, are controlled by, or are under common
      +      control with that entity. For the purposes of this definition,
      +      "control" means (i) the power, direct or indirect, to cause the
      +      direction or management of such entity, whether by contract or
      +      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      +      outstanding shares, or (iii) beneficial ownership of such entity.
      +
      +      "You" (or "Your") shall mean an individual or Legal Entity
      +      exercising permissions granted by this License.
      +
      +      "Source" form shall mean the preferred form for making modifications,
      +      including but not limited to software source code, documentation
      +      source, and configuration files.
      +
      +      "Object" form shall mean any form resulting from mechanical
      +      transformation or translation of a Source form, including but
      +      not limited to compiled object code, generated documentation,
      +      and conversions to other media types.
      +
      +      "Work" shall mean the work of authorship, whether in Source or
      +      Object form, made available under the License, as indicated by a
      +      copyright notice that is included in or attached to the work
      +      (an example is provided in the Appendix below).
      +
      +      "Derivative Works" shall mean any work, whether in Source or Object
      +      form, that is based on (or derived from) the Work and for which the
      +      editorial revisions, annotations, elaborations, or other modifications
      +      represent, as a whole, an original work of authorship. For the purposes
      +      of this License, Derivative Works shall not include works that remain
      +      separable from, or merely link (or bind by name) to the interfaces of,
      +      the Work and Derivative Works thereof.
      +
      +      "Contribution" shall mean any work of authorship, including
      +      the original version of the Work and any modifications or additions
      +      to that Work or Derivative Works thereof, that is intentionally
      +      submitted to Licensor for inclusion in the Work by the copyright owner
      +      or by an individual or Legal Entity authorized to submit on behalf of
      +      the copyright owner. For the purposes of this definition, "submitted"
      +      means any form of electronic, verbal, or written communication sent
      +      to the Licensor or its representatives, including but not limited to
      +      communication on electronic mailing lists, source code control systems,
      +      and issue tracking systems that are managed by, or on behalf of, the
      +      Licensor for the purpose of discussing and improving the Work, but
      +      excluding communication that is conspicuously marked or otherwise
      +      designated in writing by the copyright owner as "Not a Contribution."
      +
      +      "Contributor" shall mean Licensor and any individual or Legal Entity
      +      on behalf of whom a Contribution has been received by Licensor and
      +      subsequently incorporated within the Work.
      +
      +   2. Grant of Copyright License. Subject to the terms and conditions of
      +      this License, each Contributor hereby grants to You a perpetual,
      +      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      +      copyright license to reproduce, prepare Derivative Works of,
      +      publicly display, publicly perform, sublicense, and distribute the
      +      Work and such Derivative Works in Source or Object form.
      +
      +   3. Grant of Patent License. Subject to the terms and conditions of
      +      this License, each Contributor hereby grants to You a perpetual,
      +      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      +      (except as stated in this section) patent license to make, have made,
      +      use, offer to sell, sell, import, and otherwise transfer the Work,
      +      where such license applies only to those patent claims licensable
      +      by such Contributor that are necessarily infringed by their
      +      Contribution(s) alone or by combination of their Contribution(s)
      +      with the Work to which such Contribution(s) was submitted. If You
      +      institute patent litigation against any entity (including a
      +      cross-claim or counterclaim in a lawsuit) alleging that the Work
      +      or a Contribution incorporated within the Work constitutes direct
      +      or contributory patent infringement, then any patent licenses
      +      granted to You under this License for that Work shall terminate
      +      as of the date such litigation is filed.
      +
      +   4. Redistribution. You may reproduce and distribute copies of the
      +      Work or Derivative Works thereof in any medium, with or without
      +      modifications, and in Source or Object form, provided that You
      +      meet the following conditions:
      +
      +      (a) You must give any other recipients of the Work or
      +          Derivative Works a copy of this License; and
      +
      +      (b) You must cause any modified files to carry prominent notices
      +          stating that You changed the files; and
      +
      +      (c) You must retain, in the Source form of any Derivative Works
      +          that You distribute, all copyright, patent, trademark, and
      +          attribution notices from the Source form of the Work,
      +          excluding those notices that do not pertain to any part of
      +          the Derivative Works; and
      +
      +      (d) If the Work includes a "NOTICE" text file as part of its
      +          distribution, then any Derivative Works that You distribute must
      +          include a readable copy of the attribution notices contained
      +          within such NOTICE file, excluding those notices that do not
      +          pertain to any part of the Derivative Works, in at least one
      +          of the following places: within a NOTICE text file distributed
      +          as part of the Derivative Works; within the Source form or
      +          documentation, if provided along with the Derivative Works; or,
      +          within a display generated by the Derivative Works, if and
      +          wherever such third-party notices normally appear. The contents
      +          of the NOTICE file are for informational purposes only and
      +          do not modify the License. You may add Your own attribution
      +          notices within Derivative Works that You distribute, alongside
      +          or as an addendum to the NOTICE text from the Work, provided
      +          that such additional attribution notices cannot be construed
      +          as modifying the License.
      +
      +      You may add Your own copyright statement to Your modifications and
      +      may provide additional or different license terms and conditions
      +      for use, reproduction, or distribution of Your modifications, or
      +      for any such Derivative Works as a whole, provided Your use,
      +      reproduction, and distribution of the Work otherwise complies with
      +      the conditions stated in this License.
      +
      +   5. Submission of Contributions. Unless You explicitly state otherwise,
      +      any Contribution intentionally submitted for inclusion in the Work
      +      by You to the Licensor shall be under the terms and conditions of
      +      this License, without any additional terms or conditions.
      +      Notwithstanding the above, nothing herein shall supersede or modify
      +      the terms of any separate license agreement you may have executed
      +      with Licensor regarding such Contributions.
      +
      +   6. Trademarks. This License does not grant permission to use the trade
      +      names, trademarks, service marks, or product names of the Licensor,
      +      except as required for reasonable and customary use in describing the
      +      origin of the Work and reproducing the content of the NOTICE file.
      +
      +   7. Disclaimer of Warranty. Unless required by applicable law or
      +      agreed to in writing, Licensor provides the Work (and each
      +      Contributor provides its Contributions) on an "AS IS" BASIS,
      +      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      +      implied, including, without limitation, any warranties or conditions
      +      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      +      PARTICULAR PURPOSE. You are solely responsible for determining the
      +      appropriateness of using or redistributing the Work and assume any
      +      risks associated with Your exercise of permissions under this License.
      +
      +   8. Limitation of Liability. In no event and under no legal theory,
      +      whether in tort (including negligence), contract, or otherwise,
      +      unless required by applicable law (such as deliberate and grossly
      +      negligent acts) or agreed to in writing, shall any Contributor be
      +      liable to You for damages, including any direct, indirect, special,
      +      incidental, or consequential damages of any character arising as a
      +      result of this License or out of the use or inability to use the
      +      Work (including but not limited to damages for loss of goodwill,
      +      work stoppage, computer failure or malfunction, or any and all
      +      other commercial damages or losses), even if such Contributor
      +      has been advised of the possibility of such damages.
      +
      +   9. Accepting Warranty or Additional Liability. While redistributing
      +      the Work or Derivative Works thereof, You may choose to offer,
      +      and charge a fee for, acceptance of support, warranty, indemnity,
      +      or other liability obligations and/or rights consistent with this
      +      License. However, in accepting such obligations, You may act only
      +      on Your own behalf and on Your sole responsibility, not on behalf
      +      of any other Contributor, and only if You agree to indemnify,
      +      defend, and hold each Contributor harmless for any liability
      +      incurred by, or claims asserted against, such Contributor by reason
      +      of your accepting any such warranty or additional liability.
      +
      +   END OF TERMS AND CONDITIONS
      +
      +   APPENDIX: How to apply the Apache License to your work.
      +
      +      To apply the Apache License to your work, attach the following
      +      boilerplate notice, with the fields enclosed by brackets "[]"
      +      replaced with your own identifying information. (Don't include
      +      the brackets!)  The text should be enclosed in the appropriate
      +      comment syntax for the file format. We also recommend that a
      +      file or class name and description of purpose be included on the
      +      same "printed page" as the copyright notice for easier
      +      identification within third-party archives.
      +
      +   Portions Copyright (c) Microsoft Corporation.
      +   Portions Copyright 2017 Google Inc.
      +
      +   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/node_modules/playwright-core/NOTICE b/node_modules/playwright-core/NOTICE
      new file mode 100644
      index 00000000..814ec169
      --- /dev/null
      +++ b/node_modules/playwright-core/NOTICE
      @@ -0,0 +1,5 @@
      +Playwright
      +Copyright (c) Microsoft Corporation
      +
      +This software contains code derived from the Puppeteer project (https://github.com/puppeteer/puppeteer),
      +available under the Apache 2.0 license (https://github.com/puppeteer/puppeteer/blob/master/LICENSE).
      diff --git a/node_modules/playwright-core/README.md b/node_modules/playwright-core/README.md
      new file mode 100644
      index 00000000..422b3739
      --- /dev/null
      +++ b/node_modules/playwright-core/README.md
      @@ -0,0 +1,3 @@
      +# playwright-core
      +
      +This package contains the no-browser flavor of [Playwright](http://github.com/microsoft/playwright).
      diff --git a/node_modules/playwright-core/ThirdPartyNotices.txt b/node_modules/playwright-core/ThirdPartyNotices.txt
      new file mode 100644
      index 00000000..369e2025
      --- /dev/null
      +++ b/node_modules/playwright-core/ThirdPartyNotices.txt
      @@ -0,0 +1,13 @@
      +microsoft/playwright-core
      +
      +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION
      +
      +This package bundles third-party software inside individual files under
      +`lib/`. Each bundled output has a sidecar `.js.LICENSE` file next
      +to it listing every npm package whose source was inlined into that
      +bundle, together with the full license text for each.
      +
      +For example:
      +- lib/utilsBundle.js.LICENSE
      +
      +This project incorporates components from the projects listed below. The original copyright notices and the licenses under which Microsoft received such components are set forth below. Microsoft reserves all rights not expressly granted herein, whether by implication, estoppel or otherwise.
      diff --git a/node_modules/playwright-core/bin/install_media_pack.ps1 b/node_modules/playwright-core/bin/install_media_pack.ps1
      new file mode 100644
      index 00000000..61707542
      --- /dev/null
      +++ b/node_modules/playwright-core/bin/install_media_pack.ps1
      @@ -0,0 +1,5 @@
      +$osInfo = Get-WmiObject -Class Win32_OperatingSystem
      +# check if running on Windows Server
      +if ($osInfo.ProductType -eq 3) {
      +  Install-WindowsFeature Server-Media-Foundation
      +}
      diff --git a/node_modules/playwright-core/bin/install_webkit_wsl.ps1 b/node_modules/playwright-core/bin/install_webkit_wsl.ps1
      new file mode 100644
      index 00000000..ccaaf156
      --- /dev/null
      +++ b/node_modules/playwright-core/bin/install_webkit_wsl.ps1
      @@ -0,0 +1,33 @@
      +$ErrorActionPreference = 'Stop'
      +
      +# This script sets up a WSL distribution that will be used to run WebKit.
      +
      +$Distribution = "playwright"
      +$Username = "pwuser"
      +
      +$distributions = (wsl --list --quiet) -split "\r?\n"
      +if ($distributions -contains $Distribution) {
      +    Write-Host "WSL distribution '$Distribution' already exists. Skipping installation."
      +} else {
      +    Write-Host "Installing new WSL distribution '$Distribution'..."
      +    $VhdSize = "10GB"
      +    wsl --install -d Ubuntu-24.04 --name $Distribution --no-launch --vhd-size $VhdSize
      +    wsl -d $Distribution -u root adduser --gecos GECOS --disabled-password $Username
      +}
      +
      +$pwshDirname = (Resolve-Path -Path $PSScriptRoot).Path;
      +$playwrightCoreRoot = Resolve-Path (Join-Path $pwshDirname "..")
      +
      +$initScript = @"
      +if [ ! -f "/home/$Username/node/bin/node" ]; then
      +  mkdir -p /home/$Username/node
      +  curl -fsSL https://nodejs.org/dist/v22.17.0/node-v22.17.0-linux-x64.tar.xz -o /home/$Username/node/node-v22.17.0-linux-x64.tar.xz
      +  tar -xJf /home/$Username/node/node-v22.17.0-linux-x64.tar.xz -C /home/$Username/node --strip-components=1
      +  sudo -u $Username echo 'export PATH=/home/$Username/node/bin:\`$PATH' >> /home/$Username/.profile
      +fi
      +/home/$Username/node/bin/node cli.js install-deps webkit
      +sudo -u $Username PLAYWRIGHT_SKIP_BROWSER_GC=1 /home/$Username/node/bin/node cli.js install webkit
      +"@ -replace "\r\n", "`n"
      +
      +wsl -d $Distribution --cd $playwrightCoreRoot -u root -- bash -c "$initScript"
      +Write-Host "Done!"
      \ No newline at end of file
      diff --git a/node_modules/playwright-core/bin/reinstall_chrome_beta_linux.sh b/node_modules/playwright-core/bin/reinstall_chrome_beta_linux.sh
      new file mode 100644
      index 00000000..13d55dfa
      --- /dev/null
      +++ b/node_modules/playwright-core/bin/reinstall_chrome_beta_linux.sh
      @@ -0,0 +1,42 @@
      +#!/usr/bin/env bash
      +set -e
      +set -x
      +
      +if [[ $(arch) == "aarch64" ]]; then
      +  echo "ERROR: not supported on Linux Arm64"
      +  exit 1
      +fi
      +
      +if [ -z "$PLAYWRIGHT_HOST_PLATFORM_OVERRIDE" ]; then
      +  if [[ ! -f "/etc/os-release" ]]; then
      +    echo "ERROR: cannot install on unknown linux distribution (/etc/os-release is missing)"
      +    exit 1
      +  fi
      +
      +  ID=$(bash -c 'source /etc/os-release && echo $ID')
      +  if [[ "${ID}" != "ubuntu" && "${ID}" != "debian" ]]; then
      +    echo "ERROR: cannot install on $ID distribution - only Ubuntu and Debian are supported"
      +    exit 1
      +  fi
      +fi
      +
      +# 1. make sure to remove old beta if any.
      +if dpkg --get-selections | grep -q "^google-chrome-beta[[:space:]]*install$" >/dev/null; then
      +  apt-get remove -y google-chrome-beta
      +fi
      +
      +# 2. Update apt lists (needed to install curl and chrome dependencies)
      +apt-get update
      +
      +# 3. Install curl to download chrome
      +if ! command -v curl >/dev/null; then
      +  apt-get install -y curl
      +fi
      +
      +# 4. download chrome beta from dl.google.com and install it.
      +cd /tmp
      +curl -L -O https://dl.google.com/linux/direct/google-chrome-beta_current_amd64.deb
      +apt-get install -y ./google-chrome-beta_current_amd64.deb
      +rm -rf ./google-chrome-beta_current_amd64.deb
      +cd -
      +google-chrome-beta --version
      diff --git a/node_modules/playwright-core/bin/reinstall_chrome_beta_mac.sh b/node_modules/playwright-core/bin/reinstall_chrome_beta_mac.sh
      new file mode 100644
      index 00000000..60b4b7fc
      --- /dev/null
      +++ b/node_modules/playwright-core/bin/reinstall_chrome_beta_mac.sh
      @@ -0,0 +1,13 @@
      +#!/usr/bin/env bash
      +set -e
      +set -x
      +
      +rm -rf "/Applications/Google Chrome Beta.app"
      +cd /tmp
      +curl -L --retry 3 -o ./googlechromebeta.dmg https://dl.google.com/chrome/mac/universal/beta/googlechromebeta.dmg
      +hdiutil attach -nobrowse -quiet -noautofsck -noautoopen -mountpoint /Volumes/googlechromebeta.dmg ./googlechromebeta.dmg
      +cp -pR "/Volumes/googlechromebeta.dmg/Google Chrome Beta.app" /Applications
      +hdiutil detach /Volumes/googlechromebeta.dmg
      +rm -rf /tmp/googlechromebeta.dmg
      +
      +/Applications/Google\ Chrome\ Beta.app/Contents/MacOS/Google\ Chrome\ Beta --version
      diff --git a/node_modules/playwright-core/bin/reinstall_chrome_beta_win.ps1 b/node_modules/playwright-core/bin/reinstall_chrome_beta_win.ps1
      new file mode 100644
      index 00000000..3fbe5515
      --- /dev/null
      +++ b/node_modules/playwright-core/bin/reinstall_chrome_beta_win.ps1
      @@ -0,0 +1,24 @@
      +$ErrorActionPreference = 'Stop'
      +
      +$url = 'https://dl.google.com/tag/s/dl/chrome/install/beta/googlechromebetastandaloneenterprise64.msi'
      +
      +Write-Host "Downloading Google Chrome Beta"
      +$wc = New-Object net.webclient
      +$msiInstaller = "$env:temp\google-chrome-beta.msi"
      +$wc.Downloadfile($url, $msiInstaller)
      +
      +Write-Host "Installing Google Chrome Beta"
      +$arguments = "/i `"$msiInstaller`" /quiet"
      +Start-Process msiexec.exe -ArgumentList $arguments -Wait
      +Remove-Item $msiInstaller
      +
      +$suffix = "\\Google\\Chrome Beta\\Application\\chrome.exe"
      +if (Test-Path "${env:ProgramFiles(x86)}$suffix") {
      +    (Get-Item "${env:ProgramFiles(x86)}$suffix").VersionInfo
      +} elseif (Test-Path "${env:ProgramFiles}$suffix") {
      +    (Get-Item "${env:ProgramFiles}$suffix").VersionInfo
      +} else {
      +    Write-Host "ERROR: Failed to install Google Chrome Beta."
      +    Write-Host "ERROR: This could be due to insufficient privileges, in which case re-running as Administrator may help."
      +    exit 1
      +}
      diff --git a/node_modules/playwright-core/bin/reinstall_chrome_stable_linux.sh b/node_modules/playwright-core/bin/reinstall_chrome_stable_linux.sh
      new file mode 100644
      index 00000000..64bc1393
      --- /dev/null
      +++ b/node_modules/playwright-core/bin/reinstall_chrome_stable_linux.sh
      @@ -0,0 +1,42 @@
      +#!/usr/bin/env bash
      +set -e
      +set -x
      +
      +if [[ $(arch) == "aarch64" ]]; then
      +  echo "ERROR: not supported on Linux Arm64"
      +  exit 1
      +fi
      +
      +if [ -z "$PLAYWRIGHT_HOST_PLATFORM_OVERRIDE" ]; then
      +  if [[ ! -f "/etc/os-release" ]]; then
      +    echo "ERROR: cannot install on unknown linux distribution (/etc/os-release is missing)"
      +    exit 1
      +  fi
      +
      +  ID=$(bash -c 'source /etc/os-release && echo $ID')
      +  if [[ "${ID}" != "ubuntu" && "${ID}" != "debian" ]]; then
      +    echo "ERROR: cannot install on $ID distribution - only Ubuntu and Debian are supported"
      +    exit 1
      +  fi
      +fi
      +
      +# 1. make sure to remove old stable if any.
      +if dpkg --get-selections | grep -q "^google-chrome[[:space:]]*install$" >/dev/null; then
      +  apt-get remove -y google-chrome
      +fi
      +
      +# 2. Update apt lists (needed to install curl and chrome dependencies)
      +apt-get update
      +
      +# 3. Install curl to download chrome
      +if ! command -v curl >/dev/null; then
      +  apt-get install -y curl
      +fi
      +
      +# 4. download chrome stable from dl.google.com and install it.
      +cd /tmp
      +curl -L -O https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
      +apt-get install -y ./google-chrome-stable_current_amd64.deb
      +rm -rf ./google-chrome-stable_current_amd64.deb
      +cd -
      +google-chrome --version
      diff --git a/node_modules/playwright-core/bin/reinstall_chrome_stable_mac.sh b/node_modules/playwright-core/bin/reinstall_chrome_stable_mac.sh
      new file mode 100644
      index 00000000..7db7a0f1
      --- /dev/null
      +++ b/node_modules/playwright-core/bin/reinstall_chrome_stable_mac.sh
      @@ -0,0 +1,12 @@
      +#!/usr/bin/env bash
      +set -e
      +set -x
      +
      +rm -rf "/Applications/Google Chrome.app"
      +cd /tmp
      +curl -L --retry 3 -o ./googlechrome.dmg https://dl.google.com/chrome/mac/universal/stable/GGRO/googlechrome.dmg
      +hdiutil attach -nobrowse -quiet -noautofsck -noautoopen -mountpoint /Volumes/googlechrome.dmg ./googlechrome.dmg
      +cp -pR "/Volumes/googlechrome.dmg/Google Chrome.app" /Applications
      +hdiutil detach /Volumes/googlechrome.dmg
      +rm -rf /tmp/googlechrome.dmg
      +/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --version
      diff --git a/node_modules/playwright-core/bin/reinstall_chrome_stable_win.ps1 b/node_modules/playwright-core/bin/reinstall_chrome_stable_win.ps1
      new file mode 100644
      index 00000000..7ca2dbaf
      --- /dev/null
      +++ b/node_modules/playwright-core/bin/reinstall_chrome_stable_win.ps1
      @@ -0,0 +1,24 @@
      +$ErrorActionPreference = 'Stop'
      +$url = 'https://dl.google.com/tag/s/dl/chrome/install/googlechromestandaloneenterprise64.msi'
      +
      +$wc = New-Object net.webclient
      +$msiInstaller = "$env:temp\google-chrome.msi"
      +Write-Host "Downloading Google Chrome"
      +$wc.Downloadfile($url, $msiInstaller)
      +
      +Write-Host "Installing Google Chrome"
      +$arguments = "/i `"$msiInstaller`" /quiet"
      +Start-Process msiexec.exe -ArgumentList $arguments -Wait
      +Remove-Item $msiInstaller
      +
      +
      +$suffix = "\\Google\\Chrome\\Application\\chrome.exe"
      +if (Test-Path "${env:ProgramFiles(x86)}$suffix") {
      +    (Get-Item "${env:ProgramFiles(x86)}$suffix").VersionInfo
      +} elseif (Test-Path "${env:ProgramFiles}$suffix") {
      +    (Get-Item "${env:ProgramFiles}$suffix").VersionInfo
      +} else {
      +    Write-Host "ERROR: Failed to install Google Chrome."
      +    Write-Host "ERROR: This could be due to insufficient privileges, in which case re-running as Administrator may help."
      +    exit 1
      +}
      diff --git a/node_modules/playwright-core/bin/reinstall_msedge_beta_linux.sh b/node_modules/playwright-core/bin/reinstall_msedge_beta_linux.sh
      new file mode 100644
      index 00000000..e1f156a0
      --- /dev/null
      +++ b/node_modules/playwright-core/bin/reinstall_msedge_beta_linux.sh
      @@ -0,0 +1,48 @@
      +#!/usr/bin/env bash
      +
      +set -e
      +set -x
      +
      +if [[ $(arch) == "aarch64" ]]; then
      +  echo "ERROR: not supported on Linux Arm64"
      +  exit 1
      +fi
      +
      +if [ -z "$PLAYWRIGHT_HOST_PLATFORM_OVERRIDE" ]; then
      +  if [[ ! -f "/etc/os-release" ]]; then
      +    echo "ERROR: cannot install on unknown linux distribution (/etc/os-release is missing)"
      +    exit 1
      +  fi
      +
      +  ID=$(bash -c 'source /etc/os-release && echo $ID')
      +  if [[ "${ID}" != "ubuntu" && "${ID}" != "debian" ]]; then
      +    echo "ERROR: cannot install on $ID distribution - only Ubuntu and Debian are supported"
      +    exit 1
      +  fi
      +fi
      +
      +# 1. make sure to remove old beta if any.
      +if dpkg --get-selections | grep -q "^microsoft-edge-beta[[:space:]]*install$" >/dev/null; then
      +  apt-get remove -y microsoft-edge-beta
      +fi
      +
      +# 2. Install curl to download Microsoft gpg key
      +if ! command -v curl >/dev/null; then
      +  apt-get update
      +  apt-get install -y curl
      +fi
      +
      +# GnuPG is not preinstalled in slim images
      +if ! command -v gpg >/dev/null; then
      +  apt-get update
      +  apt-get install -y gpg
      +fi
      +
      +# 3. Add the GPG key, the apt repo, update the apt cache, and install the package
      +curl -L https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /tmp/microsoft.gpg
      +install -o root -g root -m 644 /tmp/microsoft.gpg /etc/apt/trusted.gpg.d/
      +sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/edge stable main" > /etc/apt/sources.list.d/microsoft-edge-dev.list'
      +rm /tmp/microsoft.gpg
      +apt-get update && apt-get install -y microsoft-edge-beta
      +
      +microsoft-edge-beta --version
      diff --git a/node_modules/playwright-core/bin/reinstall_msedge_beta_mac.sh b/node_modules/playwright-core/bin/reinstall_msedge_beta_mac.sh
      new file mode 100644
      index 00000000..528a0e71
      --- /dev/null
      +++ b/node_modules/playwright-core/bin/reinstall_msedge_beta_mac.sh
      @@ -0,0 +1,11 @@
      +#!/usr/bin/env bash
      +set -e
      +set -x
      +
      +cd /tmp
      +curl -L --retry 3 -o ./msedge_beta.pkg "$1"
      +# Note: there's no way to uninstall previously installed MSEdge.
      +# However, running PKG again seems to update installation.
      +sudo installer -pkg /tmp/msedge_beta.pkg -target /
      +rm -rf /tmp/msedge_beta.pkg
      +/Applications/Microsoft\ Edge\ Beta.app/Contents/MacOS/Microsoft\ Edge\ Beta --version
      diff --git a/node_modules/playwright-core/bin/reinstall_msedge_beta_win.ps1 b/node_modules/playwright-core/bin/reinstall_msedge_beta_win.ps1
      new file mode 100644
      index 00000000..cce0d0bf
      --- /dev/null
      +++ b/node_modules/playwright-core/bin/reinstall_msedge_beta_win.ps1
      @@ -0,0 +1,23 @@
      +$ErrorActionPreference = 'Stop'
      +$url = $args[0]
      +
      +Write-Host "Downloading Microsoft Edge Beta"
      +$wc = New-Object net.webclient
      +$msiInstaller = "$env:temp\microsoft-edge-beta.msi"
      +$wc.Downloadfile($url, $msiInstaller)
      +
      +Write-Host "Installing Microsoft Edge Beta"
      +$arguments = "/i `"$msiInstaller`" /quiet"
      +Start-Process msiexec.exe -ArgumentList $arguments -Wait
      +Remove-Item $msiInstaller
      +
      +$suffix = "\\Microsoft\\Edge Beta\\Application\\msedge.exe"
      +if (Test-Path "${env:ProgramFiles(x86)}$suffix") {
      +    (Get-Item "${env:ProgramFiles(x86)}$suffix").VersionInfo
      +} elseif (Test-Path "${env:ProgramFiles}$suffix") {
      +    (Get-Item "${env:ProgramFiles}$suffix").VersionInfo
      +} else {
      +    Write-Host "ERROR: Failed to install Microsoft Edge Beta."
      +    Write-Host "ERROR: This could be due to insufficient privileges, in which case re-running as Administrator may help."
      +    exit 1
      +}
      diff --git a/node_modules/playwright-core/bin/reinstall_msedge_dev_linux.sh b/node_modules/playwright-core/bin/reinstall_msedge_dev_linux.sh
      new file mode 100644
      index 00000000..6c1a151c
      --- /dev/null
      +++ b/node_modules/playwright-core/bin/reinstall_msedge_dev_linux.sh
      @@ -0,0 +1,48 @@
      +#!/usr/bin/env bash
      +
      +set -e
      +set -x
      +
      +if [[ $(arch) == "aarch64" ]]; then
      +  echo "ERROR: not supported on Linux Arm64"
      +  exit 1
      +fi
      +
      +if [ -z "$PLAYWRIGHT_HOST_PLATFORM_OVERRIDE" ]; then
      +  if [[ ! -f "/etc/os-release" ]]; then
      +    echo "ERROR: cannot install on unknown linux distribution (/etc/os-release is missing)"
      +    exit 1
      +  fi
      +
      +  ID=$(bash -c 'source /etc/os-release && echo $ID')
      +  if [[ "${ID}" != "ubuntu" && "${ID}" != "debian" ]]; then
      +    echo "ERROR: cannot install on $ID distribution - only Ubuntu and Debian are supported"
      +    exit 1
      +  fi
      +fi
      +
      +# 1. make sure to remove old dev if any.
      +if dpkg --get-selections | grep -q "^microsoft-edge-dev[[:space:]]*install$" >/dev/null; then
      +  apt-get remove -y microsoft-edge-dev
      +fi
      +
      +# 2. Install curl to download Microsoft gpg key
      +if ! command -v curl >/dev/null; then
      +  apt-get update
      +  apt-get install -y curl
      +fi
      +
      +# GnuPG is not preinstalled in slim images
      +if ! command -v gpg >/dev/null; then
      +  apt-get update
      +  apt-get install -y gpg
      +fi
      +
      +# 3. Add the GPG key, the apt repo, update the apt cache, and install the package
      +curl -L https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /tmp/microsoft.gpg
      +install -o root -g root -m 644 /tmp/microsoft.gpg /etc/apt/trusted.gpg.d/
      +sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/edge stable main" > /etc/apt/sources.list.d/microsoft-edge-dev.list'
      +rm /tmp/microsoft.gpg
      +apt-get update && apt-get install -y microsoft-edge-dev
      +
      +microsoft-edge-dev --version
      diff --git a/node_modules/playwright-core/bin/reinstall_msedge_dev_mac.sh b/node_modules/playwright-core/bin/reinstall_msedge_dev_mac.sh
      new file mode 100644
      index 00000000..e35ea4e6
      --- /dev/null
      +++ b/node_modules/playwright-core/bin/reinstall_msedge_dev_mac.sh
      @@ -0,0 +1,11 @@
      +#!/usr/bin/env bash
      +set -e
      +set -x
      +
      +cd /tmp
      +curl -L --retry 3 -o ./msedge_dev.pkg "$1"
      +# Note: there's no way to uninstall previously installed MSEdge.
      +# However, running PKG again seems to update installation.
      +sudo installer -pkg /tmp/msedge_dev.pkg -target /
      +rm -rf /tmp/msedge_dev.pkg
      +/Applications/Microsoft\ Edge\ Dev.app/Contents/MacOS/Microsoft\ Edge\ Dev --version
      diff --git a/node_modules/playwright-core/bin/reinstall_msedge_dev_win.ps1 b/node_modules/playwright-core/bin/reinstall_msedge_dev_win.ps1
      new file mode 100644
      index 00000000..22e6db84
      --- /dev/null
      +++ b/node_modules/playwright-core/bin/reinstall_msedge_dev_win.ps1
      @@ -0,0 +1,23 @@
      +$ErrorActionPreference = 'Stop'
      +$url = $args[0]
      +
      +Write-Host "Downloading Microsoft Edge Dev"
      +$wc = New-Object net.webclient
      +$msiInstaller = "$env:temp\microsoft-edge-dev.msi"
      +$wc.Downloadfile($url, $msiInstaller)
      +
      +Write-Host "Installing Microsoft Edge Dev"
      +$arguments = "/i `"$msiInstaller`" /quiet"
      +Start-Process msiexec.exe -ArgumentList $arguments -Wait
      +Remove-Item $msiInstaller
      +
      +$suffix = "\\Microsoft\\Edge Dev\\Application\\msedge.exe"
      +if (Test-Path "${env:ProgramFiles(x86)}$suffix") {
      +    (Get-Item "${env:ProgramFiles(x86)}$suffix").VersionInfo
      +} elseif (Test-Path "${env:ProgramFiles}$suffix") {
      +    (Get-Item "${env:ProgramFiles}$suffix").VersionInfo
      +} else {
      +    Write-Host "ERROR: Failed to install Microsoft Edge Dev."
      +    Write-Host "ERROR: This could be due to insufficient privileges, in which case re-running as Administrator may help."
      +    exit 1
      +}
      diff --git a/node_modules/playwright-core/bin/reinstall_msedge_stable_linux.sh b/node_modules/playwright-core/bin/reinstall_msedge_stable_linux.sh
      new file mode 100644
      index 00000000..93bd766b
      --- /dev/null
      +++ b/node_modules/playwright-core/bin/reinstall_msedge_stable_linux.sh
      @@ -0,0 +1,48 @@
      +#!/usr/bin/env bash
      +
      +set -e
      +set -x
      +
      +if [[ $(arch) == "aarch64" ]]; then
      +  echo "ERROR: not supported on Linux Arm64"
      +  exit 1
      +fi
      +
      +if [ -z "$PLAYWRIGHT_HOST_PLATFORM_OVERRIDE" ]; then
      +  if [[ ! -f "/etc/os-release" ]]; then
      +    echo "ERROR: cannot install on unknown linux distribution (/etc/os-release is missing)"
      +    exit 1
      +  fi
      +
      +  ID=$(bash -c 'source /etc/os-release && echo $ID')
      +  if [[ "${ID}" != "ubuntu" && "${ID}" != "debian" ]]; then
      +    echo "ERROR: cannot install on $ID distribution - only Ubuntu and Debian are supported"
      +    exit 1
      +  fi
      +fi
      +
      +# 1. make sure to remove old stable if any.
      +if dpkg --get-selections | grep -q "^microsoft-edge-stable[[:space:]]*install$" >/dev/null; then
      +  apt-get remove -y microsoft-edge-stable
      +fi
      +
      +# 2. Install curl to download Microsoft gpg key
      +if ! command -v curl >/dev/null; then
      +  apt-get update
      +  apt-get install -y curl
      +fi
      +
      +# GnuPG is not preinstalled in slim images
      +if ! command -v gpg >/dev/null; then
      +  apt-get update
      +  apt-get install -y gpg
      +fi
      +
      +# 3. Add the GPG key, the apt repo, update the apt cache, and install the package
      +curl -L https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /tmp/microsoft.gpg
      +install -o root -g root -m 644 /tmp/microsoft.gpg /etc/apt/trusted.gpg.d/
      +sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/edge stable main" > /etc/apt/sources.list.d/microsoft-edge-stable.list'
      +rm /tmp/microsoft.gpg
      +apt-get update && apt-get install -y microsoft-edge-stable
      +
      +microsoft-edge-stable --version
      diff --git a/node_modules/playwright-core/bin/reinstall_msedge_stable_mac.sh b/node_modules/playwright-core/bin/reinstall_msedge_stable_mac.sh
      new file mode 100644
      index 00000000..44e5a56f
      --- /dev/null
      +++ b/node_modules/playwright-core/bin/reinstall_msedge_stable_mac.sh
      @@ -0,0 +1,11 @@
      +#!/usr/bin/env bash
      +set -e
      +set -x
      +
      +cd /tmp
      +curl -L --retry 3 -o ./msedge_stable.pkg "$1"
      +# Note: there's no way to uninstall previously installed MSEdge.
      +# However, running PKG again seems to update installation.
      +sudo installer -pkg /tmp/msedge_stable.pkg -target /
      +rm -rf /tmp/msedge_stable.pkg
      +/Applications/Microsoft\ Edge.app/Contents/MacOS/Microsoft\ Edge --version
      diff --git a/node_modules/playwright-core/bin/reinstall_msedge_stable_win.ps1 b/node_modules/playwright-core/bin/reinstall_msedge_stable_win.ps1
      new file mode 100644
      index 00000000..31fdf513
      --- /dev/null
      +++ b/node_modules/playwright-core/bin/reinstall_msedge_stable_win.ps1
      @@ -0,0 +1,24 @@
      +$ErrorActionPreference = 'Stop'
      +
      +$url = $args[0]
      +
      +Write-Host "Downloading Microsoft Edge"
      +$wc = New-Object net.webclient
      +$msiInstaller = "$env:temp\microsoft-edge-stable.msi"
      +$wc.Downloadfile($url, $msiInstaller)
      +
      +Write-Host "Installing Microsoft Edge"
      +$arguments = "/i `"$msiInstaller`" /quiet"
      +Start-Process msiexec.exe -ArgumentList $arguments -Wait
      +Remove-Item $msiInstaller
      +
      +$suffix = "\\Microsoft\\Edge\\Application\\msedge.exe"
      +if (Test-Path "${env:ProgramFiles(x86)}$suffix") {
      +    (Get-Item "${env:ProgramFiles(x86)}$suffix").VersionInfo
      +} elseif (Test-Path "${env:ProgramFiles}$suffix") {
      +    (Get-Item "${env:ProgramFiles}$suffix").VersionInfo
      +} else {
      +    Write-Host "ERROR: Failed to install Microsoft Edge."
      +    Write-Host "ERROR: This could be due to insufficient privileges, in which case re-running as Administrator may help."
      +    exit 1
      +}
      \ No newline at end of file
      diff --git a/node_modules/playwright-core/browsers.json b/node_modules/playwright-core/browsers.json
      new file mode 100644
      index 00000000..a0651c74
      --- /dev/null
      +++ b/node_modules/playwright-core/browsers.json
      @@ -0,0 +1,81 @@
      +{
      +  "comment": "Do not edit this file, use utils/roll_browser.js",
      +  "browsers": [
      +    {
      +      "name": "chromium",
      +      "revision": "1228",
      +      "installByDefault": true,
      +      "browserVersion": "149.0.7827.55",
      +      "title": "Chrome for Testing"
      +    },
      +    {
      +      "name": "chromium-headless-shell",
      +      "revision": "1228",
      +      "installByDefault": true,
      +      "browserVersion": "149.0.7827.55",
      +      "title": "Chrome Headless Shell"
      +    },
      +    {
      +      "name": "chromium-tip-of-tree",
      +      "revision": "1432",
      +      "installByDefault": false,
      +      "browserVersion": "151.0.7886.0",
      +      "title": "Chrome Canary for Testing"
      +    },
      +    {
      +      "name": "chromium-tip-of-tree-headless-shell",
      +      "revision": "1432",
      +      "installByDefault": false,
      +      "browserVersion": "151.0.7886.0",
      +      "title": "Chrome Canary Headless Shell"
      +    },
      +    {
      +      "name": "firefox",
      +      "revision": "1532",
      +      "installByDefault": true,
      +      "browserVersion": "151.0",
      +      "title": "Firefox"
      +    },
      +    {
      +      "name": "firefox-beta",
      +      "revision": "1526",
      +      "installByDefault": false,
      +      "browserVersion": "152.0b1",
      +      "title": "Firefox Beta"
      +    },
      +    {
      +      "name": "webkit",
      +      "revision": "2311",
      +      "installByDefault": true,
      +      "revisionOverrides": {
      +        "mac14": "2251",
      +        "mac14-arm64": "2251",
      +        "debian11-x64": "2105",
      +        "debian11-arm64": "2105",
      +        "ubuntu20.04-x64": "2092",
      +        "ubuntu20.04-arm64": "2092"
      +      },
      +      "browserVersion": "26.5",
      +      "title": "WebKit"
      +    },
      +    {
      +      "name": "ffmpeg",
      +      "revision": "1011",
      +      "installByDefault": true,
      +      "revisionOverrides": {
      +        "mac12": "1010",
      +        "mac12-arm64": "1010"
      +      }
      +    },
      +    {
      +      "name": "winldd",
      +      "revision": "1007",
      +      "installByDefault": false
      +    },
      +    {
      +      "name": "android",
      +      "revision": "1001",
      +      "installByDefault": false
      +    }
      +  ]
      +}
      diff --git a/node_modules/playwright-core/cli.js b/node_modules/playwright-core/cli.js
      new file mode 100644
      index 00000000..f275a033
      --- /dev/null
      +++ b/node_modules/playwright-core/cli.js
      @@ -0,0 +1,21 @@
      +#!/usr/bin/env node
      +/**
      + * Copyright (c) Microsoft Corporation.
      + *
      + * 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.
      + */
      +const { libCli, libCliTestStub } = require('./lib/coreBundle');
      +const { program } = require('./lib/utilsBundle');
      +libCli.decorateProgram(program);
      +libCliTestStub.decorateProgram(program);
      +program.parse(process.argv);
      diff --git a/node_modules/playwright-core/index.d.ts b/node_modules/playwright-core/index.d.ts
      new file mode 100644
      index 00000000..97c14936
      --- /dev/null
      +++ b/node_modules/playwright-core/index.d.ts
      @@ -0,0 +1,17 @@
      +/**
      + * Copyright (c) Microsoft Corporation.
      + *
      + * 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.
      + */
      +
      +export * from './types/types';
      diff --git a/node_modules/playwright-core/index.js b/node_modules/playwright-core/index.js
      new file mode 100644
      index 00000000..9fc51a4d
      --- /dev/null
      +++ b/node_modules/playwright-core/index.js
      @@ -0,0 +1,17 @@
      +/**
      + * Copyright (c) Microsoft Corporation.
      + *
      + * 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.
      + */
      +require('./lib/bootstrap');
      +module.exports = require('./lib/coreBundle').inprocess.playwright;
      diff --git a/node_modules/playwright-core/index.mjs b/node_modules/playwright-core/index.mjs
      new file mode 100644
      index 00000000..3b3c75b0
      --- /dev/null
      +++ b/node_modules/playwright-core/index.mjs
      @@ -0,0 +1,28 @@
      +/**
      + * Copyright (c) Microsoft Corporation.
      + *
      + * 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.
      + */
      +
      +import playwright from './index.js';
      +
      +export const chromium = playwright.chromium;
      +export const firefox = playwright.firefox;
      +export const webkit = playwright.webkit;
      +export const selectors = playwright.selectors;
      +export const devices = playwright.devices;
      +export const errors = playwright.errors;
      +export const request = playwright.request;
      +export const _electron = playwright._electron;
      +export const _android = playwright._android;
      +export default playwright;
      diff --git a/node_modules/playwright-core/lib/bootstrap.js b/node_modules/playwright-core/lib/bootstrap.js
      new file mode 100644
      index 00000000..9825a9a4
      --- /dev/null
      +++ b/node_modules/playwright-core/lib/bootstrap.js
      @@ -0,0 +1,88 @@
      +"use strict";
      +const minimumMajorNodeVersion = 18;
      +const currentNodeVersion = process.versions.node;
      +const major = +currentNodeVersion.split(".")[0];
      +if (major < minimumMajorNodeVersion) {
      +  console.error(
      +    "You are running Node.js " + currentNodeVersion + `.
      +Playwright requires Node.js ${minimumMajorNodeVersion} or higher. 
      +Please update your version of Node.js.`
      +  );
      +  process.exit(1);
      +}
      +if (process.env.PW_INSTRUMENT_MODULES) {
      +  const Module = require("module");
      +  const originalLoad = Module._load;
      +  const root = { name: "", selfMs: 0, totalMs: 0, childrenMs: 0, children: [] };
      +  let current = root;
      +  const stack = [];
      +  Module._load = function(request, _parent, _isMain) {
      +    const node = { name: request, selfMs: 0, totalMs: 0, childrenMs: 0, children: [] };
      +    current.children.push(node);
      +    stack.push(current);
      +    current = node;
      +    const start = performance.now();
      +    let result;
      +    try {
      +      result = originalLoad.apply(this, arguments);
      +    } catch (e) {
      +      current = stack.pop();
      +      current.children.pop();
      +      throw e;
      +    }
      +    const duration = performance.now() - start;
      +    node.totalMs = duration;
      +    node.selfMs = Math.max(0, duration - node.childrenMs);
      +    current = stack.pop();
      +    current.childrenMs += duration;
      +    return result;
      +  };
      +  process.on("exit", () => {
      +    function printTree(node, prefix, isLast, lines2, depth) {
      +      if (node.totalMs < 1 && depth > 0)
      +        return;
      +      const connector = depth === 0 ? "" : isLast ? "\u2514\u2500\u2500 " : "\u251C\u2500\u2500 ";
      +      const time = `${node.totalMs.toFixed(1).padStart(8)}ms`;
      +      const self = node.children.length ? ` (self: ${node.selfMs.toFixed(1)}ms)` : "";
      +      lines2.push(`${time}  ${prefix}${connector}${node.name}${self}`);
      +      const childPrefix = prefix + (depth === 0 ? "" : isLast ? "    " : "\u2502   ");
      +      const sorted2 = node.children.slice().sort((a, b) => b.totalMs - a.totalMs);
      +      for (let i = 0; i < sorted2.length; i++)
      +        printTree(sorted2[i], childPrefix, i === sorted2.length - 1, lines2, depth + 1);
      +    }
      +    let totalModules = 0;
      +    function count(n) {
      +      totalModules++;
      +      n.children.forEach(count);
      +    }
      +    root.children.forEach(count);
      +    const lines = [];
      +    const sorted = root.children.slice().sort((a, b) => b.totalMs - a.totalMs);
      +    for (let i = 0; i < sorted.length; i++)
      +      printTree(sorted[i], "", i === sorted.length - 1, lines, 0);
      +    const totalMs = root.children.reduce((s, c) => s + c.totalMs, 0);
      +    process.stderr.write(`
      +--- Module load tree: ${totalModules} modules, ${totalMs.toFixed(0)}ms total ---
      +` + lines.join("\n") + "\n");
      +    const flat = /* @__PURE__ */ new Map();
      +    function gather(n) {
      +      const existing = flat.get(n.name);
      +      if (existing) {
      +        existing.selfMs += n.selfMs;
      +        existing.totalMs += n.totalMs;
      +        existing.count++;
      +      } else {
      +        flat.set(n.name, { selfMs: n.selfMs, totalMs: n.totalMs, count: 1 });
      +      }
      +      n.children.forEach(gather);
      +    }
      +    root.children.forEach(gather);
      +    const top50 = [...flat.entries()].sort((a, b) => b[1].selfMs - a[1].selfMs).slice(0, 50);
      +    const flatLines = top50.map(
      +      ([mod, { selfMs, totalMs: totalMs2, count: count2 }]) => `${selfMs.toFixed(1).padStart(8)}ms self ${totalMs2.toFixed(1).padStart(8)}ms total  (x${String(count2).padStart(3)})  ${mod}`
      +    );
      +    process.stderr.write(`
      +--- Top 50 modules by self time ---
      +` + flatLines.join("\n") + "\n");
      +  });
      +}
      diff --git a/node_modules/playwright-core/lib/coreBundle.js b/node_modules/playwright-core/lib/coreBundle.js
      new file mode 100644
      index 00000000..1d36a373
      --- /dev/null
      +++ b/node_modules/playwright-core/lib/coreBundle.js
      @@ -0,0 +1,73385 @@
      +"use strict";
      +var __create = Object.create;
      +var __defProp = Object.defineProperty;
      +var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
      +var __getOwnPropNames = Object.getOwnPropertyNames;
      +var __getProtoOf = Object.getPrototypeOf;
      +var __hasOwnProp = Object.prototype.hasOwnProperty;
      +var __esm = (fn, res) => function __init() {
      +  return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
      +};
      +var __commonJS = (cb, mod) => function __require() {
      +  return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
      +};
      +var __export = (target, all) => {
      +  for (var name in all)
      +    __defProp(target, name, { get: all[name], enumerable: true });
      +};
      +var __copyProps = (to, from, except, desc) => {
      +  if (from && typeof from === "object" || typeof from === "function") {
      +    for (let key of __getOwnPropNames(from))
      +      if (!__hasOwnProp.call(to, key) && key !== except)
      +        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
      +  }
      +  return to;
      +};
      +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
      +  // If the importer is in node compatibility mode or this is not an ESM
      +  // file that has been converted to a CommonJS file using a Babel-
      +  // compatible transform (i.e. "__esModule" has not been set), then set
      +  // "default" to the CommonJS "module.exports" for node compatibility.
      +  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
      +  mod
      +));
      +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
      +
      +// packages/isomorphic/ariaSnapshot.ts
      +function ariaNodesEqual(a, b) {
      +  if (a.role !== b.role || a.name !== b.name)
      +    return false;
      +  if (!ariaPropsEqual(a, b) || hasPointerCursor(a) !== hasPointerCursor(b))
      +    return false;
      +  const aKeys = Object.keys(a.props);
      +  const bKeys = Object.keys(b.props);
      +  return aKeys.length === bKeys.length && aKeys.every((k) => a.props[k] === b.props[k]);
      +}
      +function hasPointerCursor(ariaNode) {
      +  return ariaNode.box.cursor === "pointer";
      +}
      +function ariaPropsEqual(a, b) {
      +  return a.active === b.active && a.checked === b.checked && a.disabled === b.disabled && a.expanded === b.expanded && a.invalid === b.invalid && a.selected === b.selected && a.level === b.level && a.pressed === b.pressed;
      +}
      +function parseAriaSnapshotUnsafe(yaml3, text2, options = {}) {
      +  const result2 = parseAriaSnapshot(yaml3, text2, options);
      +  if (result2.errors.length)
      +    throw new Error(result2.errors[0].message);
      +  return result2.fragment;
      +}
      +function parseAriaSnapshot(yaml3, text2, options = {}) {
      +  const lineCounter = new yaml3.LineCounter();
      +  const parseOptions = {
      +    keepSourceTokens: true,
      +    lineCounter,
      +    ...options
      +  };
      +  const yamlDoc = yaml3.parseDocument(text2, parseOptions);
      +  const errors = [];
      +  const convertRange = (range) => {
      +    return [lineCounter.linePos(range[0]), lineCounter.linePos(range[1])];
      +  };
      +  const addError = (error) => {
      +    errors.push({
      +      message: error.message,
      +      range: [lineCounter.linePos(error.pos[0]), lineCounter.linePos(error.pos[1])]
      +    });
      +  };
      +  const convertSeq = (container, seq) => {
      +    for (const item of seq.items) {
      +      const itemIsString = item instanceof yaml3.Scalar && typeof item.value === "string";
      +      if (itemIsString) {
      +        const childNode = KeyParser.parse(item, parseOptions, errors);
      +        if (childNode) {
      +          container.children = container.children || [];
      +          container.children.push(childNode);
      +        }
      +        continue;
      +      }
      +      const itemIsMap = item instanceof yaml3.YAMLMap;
      +      if (itemIsMap) {
      +        convertMap(container, item);
      +        continue;
      +      }
      +      errors.push({
      +        message: "Sequence items should be strings or maps",
      +        range: convertRange(item.range || seq.range)
      +      });
      +    }
      +  };
      +  const convertMap = (container, map) => {
      +    for (const entry of map.items) {
      +      container.children = container.children || [];
      +      const keyIsString = entry.key instanceof yaml3.Scalar && typeof entry.key.value === "string";
      +      if (!keyIsString) {
      +        errors.push({
      +          message: "Only string keys are supported",
      +          range: convertRange(entry.key.range || map.range)
      +        });
      +        continue;
      +      }
      +      const key = entry.key;
      +      const value2 = entry.value;
      +      if (key.value === "text") {
      +        const valueIsString = value2 instanceof yaml3.Scalar && typeof value2.value === "string";
      +        if (!valueIsString) {
      +          errors.push({
      +            message: "Text value should be a string",
      +            range: convertRange(entry.value.range || map.range)
      +          });
      +          continue;
      +        }
      +        container.children.push({
      +          kind: "text",
      +          text: textValue(value2.value)
      +        });
      +        continue;
      +      }
      +      if (key.value === "/children") {
      +        const valueIsString = value2 instanceof yaml3.Scalar && typeof value2.value === "string";
      +        if (!valueIsString || value2.value !== "contain" && value2.value !== "equal" && value2.value !== "deep-equal") {
      +          errors.push({
      +            message: 'Strict value should be "contain", "equal" or "deep-equal"',
      +            range: convertRange(entry.value.range || map.range)
      +          });
      +          continue;
      +        }
      +        container.containerMode = value2.value;
      +        continue;
      +      }
      +      if (key.value.startsWith("/")) {
      +        const valueIsString = value2 instanceof yaml3.Scalar && typeof value2.value === "string";
      +        if (!valueIsString) {
      +          errors.push({
      +            message: "Property value should be a string",
      +            range: convertRange(entry.value.range || map.range)
      +          });
      +          continue;
      +        }
      +        container.props = container.props ?? {};
      +        container.props[key.value.slice(1)] = textValue(value2.value);
      +        continue;
      +      }
      +      const childNode = KeyParser.parse(key, parseOptions, errors);
      +      if (!childNode)
      +        continue;
      +      const valueIsScalar = value2 instanceof yaml3.Scalar;
      +      if (valueIsScalar) {
      +        const type3 = typeof value2.value;
      +        if (type3 !== "string" && type3 !== "number" && type3 !== "boolean") {
      +          errors.push({
      +            message: "Node value should be a string or a sequence",
      +            range: convertRange(entry.value.range || map.range)
      +          });
      +          continue;
      +        }
      +        container.children.push({
      +          ...childNode,
      +          children: [{
      +            kind: "text",
      +            text: textValue(String(value2.value))
      +          }]
      +        });
      +        continue;
      +      }
      +      const valueIsSequence = value2 instanceof yaml3.YAMLSeq;
      +      if (valueIsSequence) {
      +        container.children.push(childNode);
      +        convertSeq(childNode, value2);
      +        continue;
      +      }
      +      errors.push({
      +        message: "Map values should be strings or sequences",
      +        range: convertRange(entry.value.range || map.range)
      +      });
      +    }
      +  };
      +  const fragment = { kind: "role", role: "fragment" };
      +  yamlDoc.errors.forEach(addError);
      +  if (errors.length)
      +    return { errors, fragment };
      +  if (!(yamlDoc.contents instanceof yaml3.YAMLSeq)) {
      +    errors.push({
      +      message: 'Aria snapshot must be a YAML sequence, elements starting with " -"',
      +      range: yamlDoc.contents ? convertRange(yamlDoc.contents.range) : [{ line: 0, col: 0 }, { line: 0, col: 0 }]
      +    });
      +  }
      +  if (errors.length)
      +    return { errors, fragment };
      +  convertSeq(fragment, yamlDoc.contents);
      +  if (errors.length)
      +    return { errors, fragment: emptyFragment };
      +  if (fragment.children?.length === 1 && (!fragment.containerMode || fragment.containerMode === "contain"))
      +    return { fragment: fragment.children[0], errors: [] };
      +  return { fragment, errors: [] };
      +}
      +function normalizeWhitespace(text2) {
      +  return text2.replace(/[\u200b\u00ad]/g, "").replace(/[\r\n\s\t]+/g, " ").trim();
      +}
      +function textValue(value2) {
      +  return {
      +    raw: value2,
      +    normalized: normalizeWhitespace(value2)
      +  };
      +}
      +function findNewNode(from, to) {
      +  function fillMap(root, map, position) {
      +    let size = 1;
      +    let childPosition = position + size;
      +    for (const child of root.children || []) {
      +      if (typeof child === "string") {
      +        size++;
      +        childPosition++;
      +      } else {
      +        size += fillMap(child, map, childPosition);
      +        childPosition += size;
      +      }
      +    }
      +    if (!["none", "presentation", "fragment", "iframe", "generic"].includes(root.role) && root.name) {
      +      let byRole = map.get(root.role);
      +      if (!byRole) {
      +        byRole = /* @__PURE__ */ new Map();
      +        map.set(root.role, byRole);
      +      }
      +      const existing = byRole.get(root.name);
      +      const sizeAndPosition = size * 100 - position;
      +      if (!existing || existing.sizeAndPosition < sizeAndPosition)
      +        byRole.set(root.name, { node: root, sizeAndPosition });
      +    }
      +    return size;
      +  }
      +  const fromMap = /* @__PURE__ */ new Map();
      +  if (from)
      +    fillMap(from, fromMap, 0);
      +  const toMap = /* @__PURE__ */ new Map();
      +  fillMap(to, toMap, 0);
      +  const result2 = [];
      +  for (const [role, byRole] of toMap) {
      +    for (const [name, byName] of byRole) {
      +      const inFrom = fromMap.get(role)?.get(name);
      +      if (!inFrom)
      +        result2.push(byName);
      +    }
      +  }
      +  result2.sort((a, b) => b.sizeAndPosition - a.sizeAndPosition);
      +  return result2[0]?.node;
      +}
      +var emptyFragment, KeyParser, ParserError;
      +var init_ariaSnapshot = __esm({
      +  "packages/isomorphic/ariaSnapshot.ts"() {
      +    "use strict";
      +    emptyFragment = { kind: "role", role: "fragment" };
      +    KeyParser = class _KeyParser {
      +      static parse(text2, options, errors) {
      +        try {
      +          return new _KeyParser(text2.value)._parse();
      +        } catch (e) {
      +          if (e instanceof ParserError) {
      +            const message = options.prettyErrors === false ? e.message : e.message + ":\n\n" + text2.value + "\n" + " ".repeat(e.pos) + "^\n";
      +            errors.push({
      +              message,
      +              range: [options.lineCounter.linePos(text2.range[0]), options.lineCounter.linePos(text2.range[0] + e.pos)]
      +            });
      +            return null;
      +          }
      +          throw e;
      +        }
      +      }
      +      constructor(input) {
      +        this._input = input;
      +        this._pos = 0;
      +        this._length = input.length;
      +      }
      +      _peek() {
      +        return this._input[this._pos] || "";
      +      }
      +      _next() {
      +        if (this._pos < this._length)
      +          return this._input[this._pos++];
      +        return null;
      +      }
      +      _eof() {
      +        return this._pos >= this._length;
      +      }
      +      _isWhitespace() {
      +        return !this._eof() && /\s/.test(this._peek());
      +      }
      +      _skipWhitespace() {
      +        while (this._isWhitespace())
      +          this._pos++;
      +      }
      +      _readIdentifier(type3) {
      +        if (this._eof())
      +          this._throwError(`Unexpected end of input when expecting ${type3}`);
      +        const start3 = this._pos;
      +        while (!this._eof() && /[a-zA-Z]/.test(this._peek()))
      +          this._pos++;
      +        return this._input.slice(start3, this._pos);
      +      }
      +      _readString() {
      +        let result2 = "";
      +        let escaped2 = false;
      +        while (!this._eof()) {
      +          const ch = this._next();
      +          if (escaped2) {
      +            result2 += ch;
      +            escaped2 = false;
      +          } else if (ch === "\\") {
      +            escaped2 = true;
      +          } else if (ch === '"') {
      +            return result2;
      +          } else {
      +            result2 += ch;
      +          }
      +        }
      +        this._throwError("Unterminated string");
      +      }
      +      _throwError(message, offset = 0) {
      +        throw new ParserError(message, offset || this._pos);
      +      }
      +      _readRegex() {
      +        let result2 = "";
      +        let escaped2 = false;
      +        let insideClass = false;
      +        while (!this._eof()) {
      +          const ch = this._next();
      +          if (escaped2) {
      +            result2 += ch;
      +            escaped2 = false;
      +          } else if (ch === "\\") {
      +            escaped2 = true;
      +            result2 += ch;
      +          } else if (ch === "/" && !insideClass) {
      +            return { pattern: result2 };
      +          } else if (ch === "[") {
      +            insideClass = true;
      +            result2 += ch;
      +          } else if (ch === "]" && insideClass) {
      +            result2 += ch;
      +            insideClass = false;
      +          } else {
      +            result2 += ch;
      +          }
      +        }
      +        this._throwError("Unterminated regex");
      +      }
      +      _readStringOrRegex() {
      +        const ch = this._peek();
      +        if (ch === '"') {
      +          this._next();
      +          return normalizeWhitespace(this._readString());
      +        }
      +        if (ch === "/") {
      +          this._next();
      +          return this._readRegex();
      +        }
      +        return null;
      +      }
      +      _readAttributes(result2) {
      +        let errorPos = this._pos;
      +        while (true) {
      +          this._skipWhitespace();
      +          if (this._peek() === "[") {
      +            this._next();
      +            this._skipWhitespace();
      +            errorPos = this._pos;
      +            const flagName = this._readIdentifier("attribute");
      +            this._skipWhitespace();
      +            let flagValue = "";
      +            if (this._peek() === "=") {
      +              this._next();
      +              this._skipWhitespace();
      +              errorPos = this._pos;
      +              while (this._peek() !== "]" && !this._isWhitespace() && !this._eof())
      +                flagValue += this._next();
      +            }
      +            this._skipWhitespace();
      +            if (this._peek() !== "]")
      +              this._throwError("Expected ]");
      +            this._next();
      +            this._applyAttribute(result2, flagName, flagValue || "true", errorPos);
      +          } else {
      +            break;
      +          }
      +        }
      +      }
      +      _parse() {
      +        this._skipWhitespace();
      +        const role = this._readIdentifier("role");
      +        this._skipWhitespace();
      +        const name = this._readStringOrRegex() || "";
      +        const result2 = { kind: "role", role, name };
      +        this._readAttributes(result2);
      +        this._skipWhitespace();
      +        if (!this._eof())
      +          this._throwError("Unexpected input");
      +        return result2;
      +      }
      +      _applyAttribute(node, key, value2, errorPos) {
      +        if (key === "checked") {
      +          this._assert(value2 === "true" || value2 === "false" || value2 === "mixed", 'Value of "checked" attribute must be a boolean or "mixed"', errorPos);
      +          node.checked = value2 === "true" ? true : value2 === "false" ? false : "mixed";
      +          return;
      +        }
      +        if (key === "disabled") {
      +          this._assert(value2 === "true" || value2 === "false", 'Value of "disabled" attribute must be a boolean', errorPos);
      +          node.disabled = value2 === "true";
      +          return;
      +        }
      +        if (key === "expanded") {
      +          this._assert(value2 === "true" || value2 === "false", 'Value of "expanded" attribute must be a boolean', errorPos);
      +          node.expanded = value2 === "true";
      +          return;
      +        }
      +        if (key === "active") {
      +          this._assert(value2 === "true" || value2 === "false", 'Value of "active" attribute must be a boolean', errorPos);
      +          node.active = value2 === "true";
      +          return;
      +        }
      +        if (key === "invalid") {
      +          this._assert(value2 === "true" || value2 === "false" || value2 === "grammar" || value2 === "spelling", 'Value of "invalid" attribute must be a boolean, "grammar" or "spelling"', errorPos);
      +          node.invalid = value2 === "true" ? true : value2 === "false" ? false : value2;
      +          return;
      +        }
      +        if (key === "level") {
      +          this._assert(!isNaN(Number(value2)), 'Value of "level" attribute must be a number', errorPos);
      +          node.level = Number(value2);
      +          return;
      +        }
      +        if (key === "pressed") {
      +          this._assert(value2 === "true" || value2 === "false" || value2 === "mixed", 'Value of "pressed" attribute must be a boolean or "mixed"', errorPos);
      +          node.pressed = value2 === "true" ? true : value2 === "false" ? false : "mixed";
      +          return;
      +        }
      +        if (key === "selected") {
      +          this._assert(value2 === "true" || value2 === "false", 'Value of "selected" attribute must be a boolean', errorPos);
      +          node.selected = value2 === "true";
      +          return;
      +        }
      +        this._assert(false, `Unsupported attribute [${key}]`, errorPos);
      +      }
      +      _assert(value2, message, valuePos) {
      +        if (!value2)
      +          this._throwError(message || "Assertion error", valuePos);
      +      }
      +    };
      +    ParserError = class extends Error {
      +      constructor(message, pos) {
      +        super(message);
      +        this.pos = pos;
      +      }
      +    };
      +  }
      +});
      +
      +// packages/isomorphic/stringUtils.ts
      +function escapeWithQuotes(text2, char = "'") {
      +  const stringified = JSON.stringify(text2);
      +  const escapedText = stringified.substring(1, stringified.length - 1).replace(/\\"/g, '"');
      +  if (char === "'")
      +    return char + escapedText.replace(/[']/g, "\\'") + char;
      +  if (char === '"')
      +    return char + escapedText.replace(/["]/g, '\\"') + char;
      +  if (char === "`")
      +    return char + escapedText.replace(/[`]/g, "\\`") + char;
      +  throw new Error("Invalid escape char");
      +}
      +function escapeTemplateString(text2) {
      +  return text2.replace(/\\/g, "\\\\").replace(/`/g, "\\`").replace(/\$\{/g, "\\${");
      +}
      +function isString(obj) {
      +  return typeof obj === "string" || obj instanceof String;
      +}
      +function toTitleCase(name) {
      +  return name.charAt(0).toUpperCase() + name.substring(1);
      +}
      +function toSnakeCase(name) {
      +  return name.replace(/([a-z0-9])([A-Z])/g, "$1_$2").replace(/([A-Z])([A-Z][a-z])/g, "$1_$2").toLowerCase();
      +}
      +function formatObject(value2, indent = "  ", mode = "multiline") {
      +  if (typeof value2 === "string")
      +    return escapeWithQuotes(value2, "'");
      +  if (Array.isArray(value2))
      +    return `[${value2.map((o) => formatObject(o)).join(", ")}]`;
      +  if (typeof value2 === "object") {
      +    const keys = Object.keys(value2).filter((key) => key !== "timeout" && value2[key] !== void 0).sort();
      +    if (!keys.length)
      +      return "{}";
      +    const tokens = [];
      +    for (const key of keys)
      +      tokens.push(`${key}: ${formatObject(value2[key])}`);
      +    if (mode === "multiline")
      +      return `{
      +${tokens.map((t) => indent + t).join(`,
      +`)}
      +}`;
      +    return `{ ${tokens.join(", ")} }`;
      +  }
      +  return String(value2);
      +}
      +function formatObjectOrVoid(value2, indent = "  ") {
      +  const result2 = formatObject(value2, indent);
      +  return result2 === "{}" ? "" : result2;
      +}
      +function quoteCSSAttributeValue(text2) {
      +  return `"${text2.replace(/["\\]/g, (char) => "\\" + char)}"`;
      +}
      +function cacheNormalizedWhitespaces() {
      +  normalizedWhitespaceCache = /* @__PURE__ */ new Map();
      +}
      +function normalizeWhiteSpace(text2) {
      +  let result2 = normalizedWhitespaceCache?.get(text2);
      +  if (result2 === void 0) {
      +    result2 = text2.replace(/[\u200b\u00ad]/g, "").trim().replace(/\s+/g, " ");
      +    normalizedWhitespaceCache?.set(text2, result2);
      +  }
      +  return result2;
      +}
      +function normalizeEscapedRegexQuotes(source11) {
      +  return source11.replace(/(^|[^\\])(\\\\)*\\(['"`])/g, "$1$2$3");
      +}
      +function escapeRegexForSelector(re2) {
      +  if (re2.unicode || re2.unicodeSets)
      +    return String(re2);
      +  return String(re2).replace(/(^|[^\\])(\\\\)*(["'`])/g, "$1$2\\$3").replace(/>>/g, "\\>\\>");
      +}
      +function escapeForTextSelector(text2, exact) {
      +  if (typeof text2 !== "string")
      +    return escapeRegexForSelector(text2);
      +  return `${JSON.stringify(text2)}${exact ? "s" : "i"}`;
      +}
      +function escapeForAttributeSelector(value2, exact) {
      +  if (typeof value2 !== "string")
      +    return escapeRegexForSelector(value2);
      +  return `"${value2.replace(/\\/g, "\\\\").replace(/["]/g, '\\"')}"${exact ? "s" : "i"}`;
      +}
      +function trimString(input, cap, suffix = "") {
      +  if (input.length <= cap)
      +    return input;
      +  const chars = [...input];
      +  if (chars.length > cap)
      +    return chars.slice(0, cap - suffix.length).join("") + suffix;
      +  return chars.join("");
      +}
      +function trimStringWithEllipsis(input, cap) {
      +  return trimString(input, cap, "\u2026");
      +}
      +function escapeRegExp(s) {
      +  return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
      +}
      +function escapeHTMLAttribute(s) {
      +  return s.replace(/[&<>"']/ug, (char) => escaped[char]);
      +}
      +function escapeHTML(s) {
      +  return s.replace(/[&<]/ug, (char) => escaped[char]);
      +}
      +function longestCommonSubstring(s1, s2) {
      +  const n = s1.length;
      +  const m = s2.length;
      +  let maxLen = 0;
      +  let endingIndex = 0;
      +  const dp = Array(n + 1).fill(null).map(() => Array(m + 1).fill(0));
      +  for (let i = 1; i <= n; i++) {
      +    for (let j = 1; j <= m; j++) {
      +      if (s1[i - 1] === s2[j - 1]) {
      +        dp[i][j] = dp[i - 1][j - 1] + 1;
      +        if (dp[i][j] > maxLen) {
      +          maxLen = dp[i][j];
      +          endingIndex = i;
      +        }
      +      }
      +    }
      +  }
      +  return s1.slice(endingIndex - maxLen, endingIndex);
      +}
      +function parseRegex(regex) {
      +  if (regex[0] !== "/")
      +    throw new Error(`Invalid regex, must start with '/': ${regex}`);
      +  const lastSlash = regex.lastIndexOf("/");
      +  if (lastSlash <= 0)
      +    throw new Error(`Invalid regex, must end with '/' followed by optional flags: ${regex}`);
      +  const source11 = regex.slice(1, lastSlash);
      +  const flags = regex.slice(lastSlash + 1);
      +  return new RegExp(source11, flags);
      +}
      +function tomlBasicString(value2) {
      +  return JSON.stringify(value2);
      +}
      +function tomlArray(values) {
      +  return `[${values.map((value2) => tomlBasicString(value2)).join(", ")}]`;
      +}
      +function tomlMultilineBasicString(value2) {
      +  const escaped2 = value2.replace(/\\/g, "\\\\").replace(/"""/g, '\\"\\"\\"');
      +  return `"""
      +${escaped2}
      +"""`;
      +}
      +function stripAnsiEscapes(str) {
      +  return str.replace(ansiRegex, "");
      +}
      +var normalizedWhitespaceCache, escaped, ansiRegex;
      +var init_stringUtils = __esm({
      +  "packages/isomorphic/stringUtils.ts"() {
      +    "use strict";
      +    escaped = { "&": "&", "<": "<", ">": ">", '"': """, "'": "'" };
      +    ansiRegex = new RegExp("([\\u001B\\u009B][[\\]()#?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)|(?:(?:\\d{0,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~])))", "g");
      +  }
      +});
      +
      +// packages/isomorphic/rtti.ts
      +function isRegExp(obj) {
      +  return obj instanceof RegExp || Object.prototype.toString.call(obj) === "[object RegExp]";
      +}
      +function isRegexString(value2) {
      +  try {
      +    new RegExp(value2);
      +    return true;
      +  } catch {
      +    return false;
      +  }
      +}
      +function isObject(obj) {
      +  return typeof obj === "object" && obj !== null;
      +}
      +function isError(obj) {
      +  return obj instanceof Error || obj && Object.getPrototypeOf(obj)?.name === "Error";
      +}
      +var init_rtti = __esm({
      +  "packages/isomorphic/rtti.ts"() {
      +    "use strict";
      +    init_stringUtils();
      +  }
      +});
      +
      +// packages/isomorphic/expectUtils.ts
      +function serializeExpectedTextValues(items, options = {}) {
      +  return items.map((i) => ({
      +    string: isString(i) ? i : void 0,
      +    regexSource: isRegExp(i) ? i.source : void 0,
      +    regexFlags: isRegExp(i) ? i.flags : void 0,
      +    matchSubstring: options.matchSubstring,
      +    ignoreCase: options.ignoreCase,
      +    normalizeWhiteSpace: options.normalizeWhiteSpace
      +  }));
      +}
      +var init_expectUtils = __esm({
      +  "packages/isomorphic/expectUtils.ts"() {
      +    "use strict";
      +    init_rtti();
      +  }
      +});
      +
      +// packages/isomorphic/assert.ts
      +function assert(value2, message) {
      +  if (!value2)
      +    throw new Error(message || "Assertion error");
      +}
      +var init_assert = __esm({
      +  "packages/isomorphic/assert.ts"() {
      +    "use strict";
      +  }
      +});
      +
      +// packages/isomorphic/base64.ts
      +function base64ByteLength(data) {
      +  if (!data)
      +    return 0;
      +  const padding = data[data.length - 2] === "=" ? 2 : data[data.length - 1] === "=" ? 1 : 0;
      +  return Math.max(0, Math.floor(data.length * 3 / 4) - padding);
      +}
      +var init_base64 = __esm({
      +  "packages/isomorphic/base64.ts"() {
      +    "use strict";
      +  }
      +});
      +
      +// packages/isomorphic/colors.ts
      +var webColors, noColors, applyStyle;
      +var init_colors = __esm({
      +  "packages/isomorphic/colors.ts"() {
      +    "use strict";
      +    webColors = {
      +      enabled: true,
      +      reset: (text2) => applyStyle(0, 0, text2),
      +      bold: (text2) => applyStyle(1, 22, text2),
      +      dim: (text2) => applyStyle(2, 22, text2),
      +      italic: (text2) => applyStyle(3, 23, text2),
      +      underline: (text2) => applyStyle(4, 24, text2),
      +      inverse: (text2) => applyStyle(7, 27, text2),
      +      hidden: (text2) => applyStyle(8, 28, text2),
      +      strikethrough: (text2) => applyStyle(9, 29, text2),
      +      black: (text2) => applyStyle(30, 39, text2),
      +      red: (text2) => applyStyle(31, 39, text2),
      +      green: (text2) => applyStyle(32, 39, text2),
      +      yellow: (text2) => applyStyle(33, 39, text2),
      +      blue: (text2) => applyStyle(34, 39, text2),
      +      magenta: (text2) => applyStyle(35, 39, text2),
      +      cyan: (text2) => applyStyle(36, 39, text2),
      +      white: (text2) => applyStyle(37, 39, text2),
      +      gray: (text2) => applyStyle(90, 39, text2),
      +      grey: (text2) => applyStyle(90, 39, text2)
      +    };
      +    noColors = {
      +      enabled: false,
      +      reset: (t) => t,
      +      bold: (t) => t,
      +      dim: (t) => t,
      +      italic: (t) => t,
      +      underline: (t) => t,
      +      inverse: (t) => t,
      +      hidden: (t) => t,
      +      strikethrough: (t) => t,
      +      black: (t) => t,
      +      red: (t) => t,
      +      green: (t) => t,
      +      yellow: (t) => t,
      +      blue: (t) => t,
      +      magenta: (t) => t,
      +      cyan: (t) => t,
      +      white: (t) => t,
      +      gray: (t) => t,
      +      grey: (t) => t
      +    };
      +    applyStyle = (open5, close3, text2) => `\x1B[${open5}m${text2}\x1B[${close3}m`;
      +  }
      +});
      +
      +// packages/isomorphic/headers.ts
      +function headersObjectToArray(headers, separator, setCookieSeparator) {
      +  if (!setCookieSeparator)
      +    setCookieSeparator = separator;
      +  const result2 = [];
      +  for (const name in headers) {
      +    const values = headers[name];
      +    if (values === void 0)
      +      continue;
      +    if (separator) {
      +      const sep = name.toLowerCase() === "set-cookie" ? setCookieSeparator : separator;
      +      for (const value2 of values.split(sep))
      +        result2.push({ name, value: value2.trim() });
      +    } else {
      +      result2.push({ name, value: values });
      +    }
      +  }
      +  return result2;
      +}
      +function headersArrayToObject(headers, lowerCase) {
      +  const result2 = {};
      +  for (const { name, value: value2 } of headers)
      +    result2[lowerCase ? name.toLowerCase() : name] = value2;
      +  return result2;
      +}
      +var init_headers = __esm({
      +  "packages/isomorphic/headers.ts"() {
      +    "use strict";
      +  }
      +});
      +
      +// packages/isomorphic/imageUtils.ts
      +function padImageToSize(image, size) {
      +  if (image.width === size.width && image.height === size.height)
      +    return image;
      +  const buffer = new Uint8Array(size.width * size.height * 4);
      +  for (let y = 0; y < size.height; y++) {
      +    for (let x = 0; x < size.width; x++) {
      +      const to = (y * size.width + x) * 4;
      +      if (y < image.height && x < image.width) {
      +        const from = (y * image.width + x) * 4;
      +        buffer[to] = image.data[from];
      +        buffer[to + 1] = image.data[from + 1];
      +        buffer[to + 2] = image.data[from + 2];
      +        buffer[to + 3] = image.data[from + 3];
      +      } else {
      +        buffer[to] = 0;
      +        buffer[to + 1] = 0;
      +        buffer[to + 2] = 0;
      +        buffer[to + 3] = 0;
      +      }
      +    }
      +  }
      +  return { data: Buffer.from(buffer), width: size.width, height: size.height };
      +}
      +function scaleImageToSize(image, size) {
      +  const { data: src, width: w1, height: h1 } = image;
      +  const w2 = Math.max(1, Math.floor(size.width));
      +  const h2 = Math.max(1, Math.floor(size.height));
      +  if (w1 === w2 && h1 === h2)
      +    return image;
      +  if (w1 <= 0 || h1 <= 0)
      +    throw new Error("Invalid input image");
      +  if (size.width <= 0 || size.height <= 0 || !isFinite(size.width) || !isFinite(size.height))
      +    throw new Error("Invalid output dimensions");
      +  const clamp = (v, lo, hi) => v < lo ? lo : v > hi ? hi : v;
      +  const weights = (t, o) => {
      +    const t2 = t * t;
      +    const t3 = t2 * t;
      +    o[0] = -0.5 * t + 1 * t2 - 0.5 * t3;
      +    o[1] = 1 - 2.5 * t2 + 1.5 * t3;
      +    o[2] = 0.5 * t + 2 * t2 - 1.5 * t3;
      +    o[3] = -0.5 * t2 + 0.5 * t3;
      +  };
      +  const srcRowStride = w1 * 4;
      +  const dstRowStride = w2 * 4;
      +  const xOff = new Int32Array(w2 * 4);
      +  const xW = new Float32Array(w2 * 4);
      +  const wx = new Float32Array(4);
      +  const xScale = w1 / w2;
      +  for (let x = 0; x < w2; x++) {
      +    const sx = (x + 0.5) * xScale - 0.5;
      +    const sxi = Math.floor(sx);
      +    const t = sx - sxi;
      +    weights(t, wx);
      +    const b = x * 4;
      +    const i0 = clamp(sxi - 1, 0, w1 - 1);
      +    const i1 = clamp(sxi + 0, 0, w1 - 1);
      +    const i2 = clamp(sxi + 1, 0, w1 - 1);
      +    const i3 = clamp(sxi + 2, 0, w1 - 1);
      +    xOff[b + 0] = i0 << 2;
      +    xOff[b + 1] = i1 << 2;
      +    xOff[b + 2] = i2 << 2;
      +    xOff[b + 3] = i3 << 2;
      +    xW[b + 0] = wx[0];
      +    xW[b + 1] = wx[1];
      +    xW[b + 2] = wx[2];
      +    xW[b + 3] = wx[3];
      +  }
      +  const yRow = new Int32Array(h2 * 4);
      +  const yW = new Float32Array(h2 * 4);
      +  const wy = new Float32Array(4);
      +  const yScale = h1 / h2;
      +  for (let y = 0; y < h2; y++) {
      +    const sy = (y + 0.5) * yScale - 0.5;
      +    const syi = Math.floor(sy);
      +    const t = sy - syi;
      +    weights(t, wy);
      +    const b = y * 4;
      +    const j0 = clamp(syi - 1, 0, h1 - 1);
      +    const j1 = clamp(syi + 0, 0, h1 - 1);
      +    const j2 = clamp(syi + 1, 0, h1 - 1);
      +    const j3 = clamp(syi + 2, 0, h1 - 1);
      +    yRow[b + 0] = j0 * srcRowStride;
      +    yRow[b + 1] = j1 * srcRowStride;
      +    yRow[b + 2] = j2 * srcRowStride;
      +    yRow[b + 3] = j3 * srcRowStride;
      +    yW[b + 0] = wy[0];
      +    yW[b + 1] = wy[1];
      +    yW[b + 2] = wy[2];
      +    yW[b + 3] = wy[3];
      +  }
      +  const dst = new Uint8Array(w2 * h2 * 4);
      +  for (let y = 0; y < h2; y++) {
      +    const yb = y * 4;
      +    const rb0 = yRow[yb + 0];
      +    const rb1 = yRow[yb + 1];
      +    const rb2 = yRow[yb + 2];
      +    const rb3 = yRow[yb + 3];
      +    const wy0 = yW[yb + 0];
      +    const wy1 = yW[yb + 1];
      +    const wy2 = yW[yb + 2];
      +    const wy3 = yW[yb + 3];
      +    const dstBase = y * dstRowStride;
      +    for (let x = 0; x < w2; x++) {
      +      const xb = x * 4;
      +      const xo0 = xOff[xb + 0];
      +      const xo1 = xOff[xb + 1];
      +      const xo2 = xOff[xb + 2];
      +      const xo3 = xOff[xb + 3];
      +      const wx0 = xW[xb + 0];
      +      const wx1 = xW[xb + 1];
      +      const wx2 = xW[xb + 2];
      +      const wx3 = xW[xb + 3];
      +      const di = dstBase + (x << 2);
      +      for (let c = 0; c < 4; c++) {
      +        const r0 = src[rb0 + xo0 + c] * wx0 + src[rb0 + xo1 + c] * wx1 + src[rb0 + xo2 + c] * wx2 + src[rb0 + xo3 + c] * wx3;
      +        const r1 = src[rb1 + xo0 + c] * wx0 + src[rb1 + xo1 + c] * wx1 + src[rb1 + xo2 + c] * wx2 + src[rb1 + xo3 + c] * wx3;
      +        const r2 = src[rb2 + xo0 + c] * wx0 + src[rb2 + xo1 + c] * wx1 + src[rb2 + xo2 + c] * wx2 + src[rb2 + xo3 + c] * wx3;
      +        const r3 = src[rb3 + xo0 + c] * wx0 + src[rb3 + xo1 + c] * wx1 + src[rb3 + xo2 + c] * wx2 + src[rb3 + xo3 + c] * wx3;
      +        const v = r0 * wy0 + r1 * wy1 + r2 * wy2 + r3 * wy3;
      +        dst[di + c] = v < 0 ? 0 : v > 255 ? 255 : v | 0;
      +      }
      +    }
      +  }
      +  return { data: Buffer.from(dst.buffer), width: w2, height: h2 };
      +}
      +var init_imageUtils = __esm({
      +  "packages/isomorphic/imageUtils.ts"() {
      +    "use strict";
      +  }
      +});
      +
      +// packages/isomorphic/jsonSchema.ts
      +function validate(value2, schema, path59) {
      +  const errors = [];
      +  if (schema.oneOf) {
      +    let bestErrors;
      +    for (const variant of schema.oneOf) {
      +      const variantErrors = validate(value2, variant, path59);
      +      if (variantErrors.length === 0)
      +        return [];
      +      if (!bestErrors || variantErrors.length < bestErrors.length)
      +        bestErrors = variantErrors;
      +    }
      +    if (bestErrors.length === 1 && bestErrors[0].startsWith(`${path59}: expected `))
      +      return [`${path59}: does not match any of the expected types`];
      +    return bestErrors;
      +  }
      +  if (schema.type === "string") {
      +    if (typeof value2 !== "string") {
      +      errors.push(`${path59}: expected string, got ${typeof value2}`);
      +      return errors;
      +    }
      +    if (schema.pattern && !cachedRegex(schema.pattern).test(value2))
      +      errors.push(schema.patternError || `${path59}: must match pattern "${schema.pattern}"`);
      +    return errors;
      +  }
      +  if (schema.type === "array") {
      +    if (!Array.isArray(value2)) {
      +      errors.push(`${path59}: expected array, got ${typeof value2}`);
      +      return errors;
      +    }
      +    if (schema.items) {
      +      for (let i = 0; i < value2.length; i++)
      +        errors.push(...validate(value2[i], schema.items, `${path59}[${i}]`));
      +    }
      +    return errors;
      +  }
      +  if (schema.type === "object") {
      +    if (!value2 || typeof value2 !== "object" || Array.isArray(value2)) {
      +      errors.push(`${path59}: expected object, got ${Array.isArray(value2) ? "array" : typeof value2}`);
      +      return errors;
      +    }
      +    const obj = value2;
      +    for (const key of schema.required || []) {
      +      if (obj[key] === void 0)
      +        errors.push(`${path59}.${key}: required`);
      +    }
      +    for (const [key, propSchema] of Object.entries(schema.properties || {})) {
      +      if (obj[key] !== void 0)
      +        errors.push(...validate(obj[key], propSchema, `${path59}.${key}`));
      +    }
      +    return errors;
      +  }
      +  return errors;
      +}
      +function cachedRegex(pattern) {
      +  let regex = regexCache.get(pattern);
      +  if (!regex) {
      +    regex = new RegExp(pattern);
      +    regexCache.set(pattern, regex);
      +  }
      +  return regex;
      +}
      +var regexCache;
      +var init_jsonSchema = __esm({
      +  "packages/isomorphic/jsonSchema.ts"() {
      +    "use strict";
      +    regexCache = /* @__PURE__ */ new Map();
      +  }
      +});
      +
      +// packages/isomorphic/cssTokenizer.ts
      +function digit(code) {
      +  return between(code, 48, 57);
      +}
      +function hexdigit(code) {
      +  return digit(code) || between(code, 65, 70) || between(code, 97, 102);
      +}
      +function uppercaseletter(code) {
      +  return between(code, 65, 90);
      +}
      +function lowercaseletter(code) {
      +  return between(code, 97, 122);
      +}
      +function letter(code) {
      +  return uppercaseletter(code) || lowercaseletter(code);
      +}
      +function nonascii(code) {
      +  return code >= 128;
      +}
      +function namestartchar(code) {
      +  return letter(code) || nonascii(code) || code === 95;
      +}
      +function namechar(code) {
      +  return namestartchar(code) || digit(code) || code === 45;
      +}
      +function nonprintable(code) {
      +  return between(code, 0, 8) || code === 11 || between(code, 14, 31) || code === 127;
      +}
      +function newline(code) {
      +  return code === 10;
      +}
      +function whitespace(code) {
      +  return newline(code) || code === 9 || code === 32;
      +}
      +function preprocess(str) {
      +  const codepoints = [];
      +  for (let i = 0; i < str.length; i++) {
      +    let code = str.charCodeAt(i);
      +    if (code === 13 && str.charCodeAt(i + 1) === 10) {
      +      code = 10;
      +      i++;
      +    }
      +    if (code === 13 || code === 12)
      +      code = 10;
      +    if (code === 0)
      +      code = 65533;
      +    if (between(code, 55296, 56319) && between(str.charCodeAt(i + 1), 56320, 57343)) {
      +      const lead = code - 55296;
      +      const trail = str.charCodeAt(i + 1) - 56320;
      +      code = Math.pow(2, 16) + lead * Math.pow(2, 10) + trail;
      +      i++;
      +    }
      +    codepoints.push(code);
      +  }
      +  return codepoints;
      +}
      +function stringFromCode(code) {
      +  if (code <= 65535)
      +    return String.fromCharCode(code);
      +  code -= Math.pow(2, 16);
      +  const lead = Math.floor(code / Math.pow(2, 10)) + 55296;
      +  const trail = code % Math.pow(2, 10) + 56320;
      +  return String.fromCharCode(lead) + String.fromCharCode(trail);
      +}
      +function tokenize(str1) {
      +  const str = preprocess(str1);
      +  let i = -1;
      +  const tokens = [];
      +  let code;
      +  let line = 0;
      +  let column = 0;
      +  let lastLineLength = 0;
      +  const incrLineno = function() {
      +    line += 1;
      +    lastLineLength = column;
      +    column = 0;
      +  };
      +  const locStart = { line, column };
      +  const codepoint = function(i2) {
      +    if (i2 >= str.length)
      +      return -1;
      +    return str[i2];
      +  };
      +  const next = function(num) {
      +    if (num === void 0)
      +      num = 1;
      +    if (num > 3)
      +      throw "Spec Error: no more than three codepoints of lookahead.";
      +    return codepoint(i + num);
      +  };
      +  const consume = function(num) {
      +    if (num === void 0)
      +      num = 1;
      +    i += num;
      +    code = codepoint(i);
      +    if (newline(code))
      +      incrLineno();
      +    else
      +      column += num;
      +    return true;
      +  };
      +  const reconsume = function() {
      +    i -= 1;
      +    if (newline(code)) {
      +      line -= 1;
      +      column = lastLineLength;
      +    } else {
      +      column -= 1;
      +    }
      +    locStart.line = line;
      +    locStart.column = column;
      +    return true;
      +  };
      +  const eof = function(codepoint2) {
      +    if (codepoint2 === void 0)
      +      codepoint2 = code;
      +    return codepoint2 === -1;
      +  };
      +  const donothing = function() {
      +  };
      +  const parseerror = function() {
      +  };
      +  const consumeAToken = function() {
      +    consumeComments();
      +    consume();
      +    if (whitespace(code)) {
      +      while (whitespace(next()))
      +        consume();
      +      return new WhitespaceToken();
      +    } else if (code === 34) {
      +      return consumeAStringToken();
      +    } else if (code === 35) {
      +      if (namechar(next()) || areAValidEscape(next(1), next(2))) {
      +        const token = new HashToken("");
      +        if (wouldStartAnIdentifier(next(1), next(2), next(3)))
      +          token.type = "id";
      +        token.value = consumeAName();
      +        return token;
      +      } else {
      +        return new DelimToken(code);
      +      }
      +    } else if (code === 36) {
      +      if (next() === 61) {
      +        consume();
      +        return new SuffixMatchToken();
      +      } else {
      +        return new DelimToken(code);
      +      }
      +    } else if (code === 39) {
      +      return consumeAStringToken();
      +    } else if (code === 40) {
      +      return new OpenParenToken();
      +    } else if (code === 41) {
      +      return new CloseParenToken();
      +    } else if (code === 42) {
      +      if (next() === 61) {
      +        consume();
      +        return new SubstringMatchToken();
      +      } else {
      +        return new DelimToken(code);
      +      }
      +    } else if (code === 43) {
      +      if (startsWithANumber()) {
      +        reconsume();
      +        return consumeANumericToken();
      +      } else {
      +        return new DelimToken(code);
      +      }
      +    } else if (code === 44) {
      +      return new CommaToken();
      +    } else if (code === 45) {
      +      if (startsWithANumber()) {
      +        reconsume();
      +        return consumeANumericToken();
      +      } else if (next(1) === 45 && next(2) === 62) {
      +        consume(2);
      +        return new CDCToken();
      +      } else if (startsWithAnIdentifier()) {
      +        reconsume();
      +        return consumeAnIdentlikeToken();
      +      } else {
      +        return new DelimToken(code);
      +      }
      +    } else if (code === 46) {
      +      if (startsWithANumber()) {
      +        reconsume();
      +        return consumeANumericToken();
      +      } else {
      +        return new DelimToken(code);
      +      }
      +    } else if (code === 58) {
      +      return new ColonToken();
      +    } else if (code === 59) {
      +      return new SemicolonToken();
      +    } else if (code === 60) {
      +      if (next(1) === 33 && next(2) === 45 && next(3) === 45) {
      +        consume(3);
      +        return new CDOToken();
      +      } else {
      +        return new DelimToken(code);
      +      }
      +    } else if (code === 64) {
      +      if (wouldStartAnIdentifier(next(1), next(2), next(3)))
      +        return new AtKeywordToken(consumeAName());
      +      else
      +        return new DelimToken(code);
      +    } else if (code === 91) {
      +      return new OpenSquareToken();
      +    } else if (code === 92) {
      +      if (startsWithAValidEscape()) {
      +        reconsume();
      +        return consumeAnIdentlikeToken();
      +      } else {
      +        parseerror();
      +        return new DelimToken(code);
      +      }
      +    } else if (code === 93) {
      +      return new CloseSquareToken();
      +    } else if (code === 94) {
      +      if (next() === 61) {
      +        consume();
      +        return new PrefixMatchToken();
      +      } else {
      +        return new DelimToken(code);
      +      }
      +    } else if (code === 123) {
      +      return new OpenCurlyToken();
      +    } else if (code === 124) {
      +      if (next() === 61) {
      +        consume();
      +        return new DashMatchToken();
      +      } else if (next() === 124) {
      +        consume();
      +        return new ColumnToken();
      +      } else {
      +        return new DelimToken(code);
      +      }
      +    } else if (code === 125) {
      +      return new CloseCurlyToken();
      +    } else if (code === 126) {
      +      if (next() === 61) {
      +        consume();
      +        return new IncludeMatchToken();
      +      } else {
      +        return new DelimToken(code);
      +      }
      +    } else if (digit(code)) {
      +      reconsume();
      +      return consumeANumericToken();
      +    } else if (namestartchar(code)) {
      +      reconsume();
      +      return consumeAnIdentlikeToken();
      +    } else if (eof()) {
      +      return new EOFToken();
      +    } else {
      +      return new DelimToken(code);
      +    }
      +  };
      +  const consumeComments = function() {
      +    while (next(1) === 47 && next(2) === 42) {
      +      consume(2);
      +      while (true) {
      +        consume();
      +        if (code === 42 && next() === 47) {
      +          consume();
      +          break;
      +        } else if (eof()) {
      +          parseerror();
      +          return;
      +        }
      +      }
      +    }
      +  };
      +  const consumeANumericToken = function() {
      +    const num = consumeANumber();
      +    if (wouldStartAnIdentifier(next(1), next(2), next(3))) {
      +      const token = new DimensionToken();
      +      token.value = num.value;
      +      token.repr = num.repr;
      +      token.type = num.type;
      +      token.unit = consumeAName();
      +      return token;
      +    } else if (next() === 37) {
      +      consume();
      +      const token = new PercentageToken();
      +      token.value = num.value;
      +      token.repr = num.repr;
      +      return token;
      +    } else {
      +      const token = new NumberToken();
      +      token.value = num.value;
      +      token.repr = num.repr;
      +      token.type = num.type;
      +      return token;
      +    }
      +  };
      +  const consumeAnIdentlikeToken = function() {
      +    const str2 = consumeAName();
      +    if (str2.toLowerCase() === "url" && next() === 40) {
      +      consume();
      +      while (whitespace(next(1)) && whitespace(next(2)))
      +        consume();
      +      if (next() === 34 || next() === 39)
      +        return new FunctionToken(str2);
      +      else if (whitespace(next()) && (next(2) === 34 || next(2) === 39))
      +        return new FunctionToken(str2);
      +      else
      +        return consumeAURLToken();
      +    } else if (next() === 40) {
      +      consume();
      +      return new FunctionToken(str2);
      +    } else {
      +      return new IdentToken(str2);
      +    }
      +  };
      +  const consumeAStringToken = function(endingCodePoint) {
      +    if (endingCodePoint === void 0)
      +      endingCodePoint = code;
      +    let string = "";
      +    while (consume()) {
      +      if (code === endingCodePoint || eof()) {
      +        return new StringToken(string);
      +      } else if (newline(code)) {
      +        parseerror();
      +        reconsume();
      +        return new BadStringToken();
      +      } else if (code === 92) {
      +        if (eof(next()))
      +          donothing();
      +        else if (newline(next()))
      +          consume();
      +        else
      +          string += stringFromCode(consumeEscape());
      +      } else {
      +        string += stringFromCode(code);
      +      }
      +    }
      +    throw new Error("Internal error");
      +  };
      +  const consumeAURLToken = function() {
      +    const token = new URLToken("");
      +    while (whitespace(next()))
      +      consume();
      +    if (eof(next()))
      +      return token;
      +    while (consume()) {
      +      if (code === 41 || eof()) {
      +        return token;
      +      } else if (whitespace(code)) {
      +        while (whitespace(next()))
      +          consume();
      +        if (next() === 41 || eof(next())) {
      +          consume();
      +          return token;
      +        } else {
      +          consumeTheRemnantsOfABadURL();
      +          return new BadURLToken();
      +        }
      +      } else if (code === 34 || code === 39 || code === 40 || nonprintable(code)) {
      +        parseerror();
      +        consumeTheRemnantsOfABadURL();
      +        return new BadURLToken();
      +      } else if (code === 92) {
      +        if (startsWithAValidEscape()) {
      +          token.value += stringFromCode(consumeEscape());
      +        } else {
      +          parseerror();
      +          consumeTheRemnantsOfABadURL();
      +          return new BadURLToken();
      +        }
      +      } else {
      +        token.value += stringFromCode(code);
      +      }
      +    }
      +    throw new Error("Internal error");
      +  };
      +  const consumeEscape = function() {
      +    consume();
      +    if (hexdigit(code)) {
      +      const digits = [code];
      +      for (let total = 0; total < 5; total++) {
      +        if (hexdigit(next())) {
      +          consume();
      +          digits.push(code);
      +        } else {
      +          break;
      +        }
      +      }
      +      if (whitespace(next()))
      +        consume();
      +      let value2 = parseInt(digits.map(function(x) {
      +        return String.fromCharCode(x);
      +      }).join(""), 16);
      +      if (value2 > maximumallowedcodepoint)
      +        value2 = 65533;
      +      return value2;
      +    } else if (eof()) {
      +      return 65533;
      +    } else {
      +      return code;
      +    }
      +  };
      +  const areAValidEscape = function(c1, c2) {
      +    if (c1 !== 92)
      +      return false;
      +    if (newline(c2))
      +      return false;
      +    return true;
      +  };
      +  const startsWithAValidEscape = function() {
      +    return areAValidEscape(code, next());
      +  };
      +  const wouldStartAnIdentifier = function(c1, c2, c3) {
      +    if (c1 === 45)
      +      return namestartchar(c2) || c2 === 45 || areAValidEscape(c2, c3);
      +    else if (namestartchar(c1))
      +      return true;
      +    else if (c1 === 92)
      +      return areAValidEscape(c1, c2);
      +    else
      +      return false;
      +  };
      +  const startsWithAnIdentifier = function() {
      +    return wouldStartAnIdentifier(code, next(1), next(2));
      +  };
      +  const wouldStartANumber = function(c1, c2, c3) {
      +    if (c1 === 43 || c1 === 45) {
      +      if (digit(c2))
      +        return true;
      +      if (c2 === 46 && digit(c3))
      +        return true;
      +      return false;
      +    } else if (c1 === 46) {
      +      if (digit(c2))
      +        return true;
      +      return false;
      +    } else if (digit(c1)) {
      +      return true;
      +    } else {
      +      return false;
      +    }
      +  };
      +  const startsWithANumber = function() {
      +    return wouldStartANumber(code, next(1), next(2));
      +  };
      +  const consumeAName = function() {
      +    let result2 = "";
      +    while (consume()) {
      +      if (namechar(code)) {
      +        result2 += stringFromCode(code);
      +      } else if (startsWithAValidEscape()) {
      +        result2 += stringFromCode(consumeEscape());
      +      } else {
      +        reconsume();
      +        return result2;
      +      }
      +    }
      +    throw new Error("Internal parse error");
      +  };
      +  const consumeANumber = function() {
      +    let repr = "";
      +    let type3 = "integer";
      +    if (next() === 43 || next() === 45) {
      +      consume();
      +      repr += stringFromCode(code);
      +    }
      +    while (digit(next())) {
      +      consume();
      +      repr += stringFromCode(code);
      +    }
      +    if (next(1) === 46 && digit(next(2))) {
      +      consume();
      +      repr += stringFromCode(code);
      +      consume();
      +      repr += stringFromCode(code);
      +      type3 = "number";
      +      while (digit(next())) {
      +        consume();
      +        repr += stringFromCode(code);
      +      }
      +    }
      +    const c1 = next(1);
      +    const c2 = next(2);
      +    const c3 = next(3);
      +    if ((c1 === 69 || c1 === 101) && digit(c2)) {
      +      consume();
      +      repr += stringFromCode(code);
      +      consume();
      +      repr += stringFromCode(code);
      +      type3 = "number";
      +      while (digit(next())) {
      +        consume();
      +        repr += stringFromCode(code);
      +      }
      +    } else if ((c1 === 69 || c1 === 101) && (c2 === 43 || c2 === 45) && digit(c3)) {
      +      consume();
      +      repr += stringFromCode(code);
      +      consume();
      +      repr += stringFromCode(code);
      +      consume();
      +      repr += stringFromCode(code);
      +      type3 = "number";
      +      while (digit(next())) {
      +        consume();
      +        repr += stringFromCode(code);
      +      }
      +    }
      +    const value2 = convertAStringToANumber(repr);
      +    return { type: type3, value: value2, repr };
      +  };
      +  const convertAStringToANumber = function(string) {
      +    return +string;
      +  };
      +  const consumeTheRemnantsOfABadURL = function() {
      +    while (consume()) {
      +      if (code === 41 || eof()) {
      +        return;
      +      } else if (startsWithAValidEscape()) {
      +        consumeEscape();
      +        donothing();
      +      } else {
      +        donothing();
      +      }
      +    }
      +  };
      +  let iterationCount = 0;
      +  while (!eof(next())) {
      +    tokens.push(consumeAToken());
      +    iterationCount++;
      +    if (iterationCount > str.length * 2)
      +      throw new Error("I'm infinite-looping!");
      +  }
      +  return tokens;
      +}
      +function escapeIdent(string) {
      +  string = "" + string;
      +  let result2 = "";
      +  const firstcode = string.charCodeAt(0);
      +  for (let i = 0; i < string.length; i++) {
      +    const code = string.charCodeAt(i);
      +    if (code === 0)
      +      throw new InvalidCharacterError("Invalid character: the input contains U+0000.");
      +    if (between(code, 1, 31) || code === 127 || i === 0 && between(code, 48, 57) || i === 1 && between(code, 48, 57) && firstcode === 45)
      +      result2 += "\\" + code.toString(16) + " ";
      +    else if (code >= 128 || code === 45 || code === 95 || between(code, 48, 57) || between(code, 65, 90) || between(code, 97, 122))
      +      result2 += string[i];
      +    else
      +      result2 += "\\" + string[i];
      +  }
      +  return result2;
      +}
      +function escapeHash(string) {
      +  string = "" + string;
      +  let result2 = "";
      +  for (let i = 0; i < string.length; i++) {
      +    const code = string.charCodeAt(i);
      +    if (code === 0)
      +      throw new InvalidCharacterError("Invalid character: the input contains U+0000.");
      +    if (code >= 128 || code === 45 || code === 95 || between(code, 48, 57) || between(code, 65, 90) || between(code, 97, 122))
      +      result2 += string[i];
      +    else
      +      result2 += "\\" + code.toString(16) + " ";
      +  }
      +  return result2;
      +}
      +function escapeString(string) {
      +  string = "" + string;
      +  let result2 = "";
      +  for (let i = 0; i < string.length; i++) {
      +    const code = string.charCodeAt(i);
      +    if (code === 0)
      +      throw new InvalidCharacterError("Invalid character: the input contains U+0000.");
      +    if (between(code, 1, 31) || code === 127)
      +      result2 += "\\" + code.toString(16) + " ";
      +    else if (code === 34 || code === 92)
      +      result2 += "\\" + string[i];
      +    else
      +      result2 += string[i];
      +  }
      +  return result2;
      +}
      +var between, maximumallowedcodepoint, InvalidCharacterError, CSSParserToken, BadStringToken, BadURLToken, WhitespaceToken, CDOToken, CDCToken, ColonToken, SemicolonToken, CommaToken, GroupingToken, OpenCurlyToken, CloseCurlyToken, OpenSquareToken, CloseSquareToken, OpenParenToken, CloseParenToken, IncludeMatchToken, DashMatchToken, PrefixMatchToken, SuffixMatchToken, SubstringMatchToken, ColumnToken, EOFToken, DelimToken, StringValuedToken, IdentToken, FunctionToken, AtKeywordToken, HashToken, StringToken, URLToken, NumberToken, PercentageToken, DimensionToken;
      +var init_cssTokenizer = __esm({
      +  "packages/isomorphic/cssTokenizer.ts"() {
      +    "use strict";
      +    between = function(num, first, last) {
      +      return num >= first && num <= last;
      +    };
      +    maximumallowedcodepoint = 1114111;
      +    InvalidCharacterError = class extends Error {
      +      constructor(message) {
      +        super(message);
      +        this.name = "InvalidCharacterError";
      +      }
      +    };
      +    CSSParserToken = class {
      +      constructor() {
      +        this.tokenType = "";
      +      }
      +      toJSON() {
      +        return { token: this.tokenType };
      +      }
      +      toString() {
      +        return this.tokenType;
      +      }
      +      toSource() {
      +        return "" + this;
      +      }
      +    };
      +    BadStringToken = class extends CSSParserToken {
      +      constructor() {
      +        super(...arguments);
      +        this.tokenType = "BADSTRING";
      +      }
      +    };
      +    BadURLToken = class extends CSSParserToken {
      +      constructor() {
      +        super(...arguments);
      +        this.tokenType = "BADURL";
      +      }
      +    };
      +    WhitespaceToken = class extends CSSParserToken {
      +      constructor() {
      +        super(...arguments);
      +        this.tokenType = "WHITESPACE";
      +      }
      +      toString() {
      +        return "WS";
      +      }
      +      toSource() {
      +        return " ";
      +      }
      +    };
      +    CDOToken = class extends CSSParserToken {
      +      constructor() {
      +        super(...arguments);
      +        this.tokenType = "CDO";
      +      }
      +      toSource() {
      +        return "";
      +      }
      +    };
      +    ColonToken = class extends CSSParserToken {
      +      constructor() {
      +        super(...arguments);
      +        this.tokenType = ":";
      +      }
      +    };
      +    SemicolonToken = class extends CSSParserToken {
      +      constructor() {
      +        super(...arguments);
      +        this.tokenType = ";";
      +      }
      +    };
      +    CommaToken = class extends CSSParserToken {
      +      constructor() {
      +        super(...arguments);
      +        this.tokenType = ",";
      +      }
      +    };
      +    GroupingToken = class extends CSSParserToken {
      +      constructor() {
      +        super(...arguments);
      +        this.value = "";
      +        this.mirror = "";
      +      }
      +    };
      +    OpenCurlyToken = class extends GroupingToken {
      +      constructor() {
      +        super();
      +        this.tokenType = "{";
      +        this.value = "{";
      +        this.mirror = "}";
      +      }
      +    };
      +    CloseCurlyToken = class extends GroupingToken {
      +      constructor() {
      +        super();
      +        this.tokenType = "}";
      +        this.value = "}";
      +        this.mirror = "{";
      +      }
      +    };
      +    OpenSquareToken = class extends GroupingToken {
      +      constructor() {
      +        super();
      +        this.tokenType = "[";
      +        this.value = "[";
      +        this.mirror = "]";
      +      }
      +    };
      +    CloseSquareToken = class extends GroupingToken {
      +      constructor() {
      +        super();
      +        this.tokenType = "]";
      +        this.value = "]";
      +        this.mirror = "[";
      +      }
      +    };
      +    OpenParenToken = class extends GroupingToken {
      +      constructor() {
      +        super();
      +        this.tokenType = "(";
      +        this.value = "(";
      +        this.mirror = ")";
      +      }
      +    };
      +    CloseParenToken = class extends GroupingToken {
      +      constructor() {
      +        super();
      +        this.tokenType = ")";
      +        this.value = ")";
      +        this.mirror = "(";
      +      }
      +    };
      +    IncludeMatchToken = class extends CSSParserToken {
      +      constructor() {
      +        super(...arguments);
      +        this.tokenType = "~=";
      +      }
      +    };
      +    DashMatchToken = class extends CSSParserToken {
      +      constructor() {
      +        super(...arguments);
      +        this.tokenType = "|=";
      +      }
      +    };
      +    PrefixMatchToken = class extends CSSParserToken {
      +      constructor() {
      +        super(...arguments);
      +        this.tokenType = "^=";
      +      }
      +    };
      +    SuffixMatchToken = class extends CSSParserToken {
      +      constructor() {
      +        super(...arguments);
      +        this.tokenType = "$=";
      +      }
      +    };
      +    SubstringMatchToken = class extends CSSParserToken {
      +      constructor() {
      +        super(...arguments);
      +        this.tokenType = "*=";
      +      }
      +    };
      +    ColumnToken = class extends CSSParserToken {
      +      constructor() {
      +        super(...arguments);
      +        this.tokenType = "||";
      +      }
      +    };
      +    EOFToken = class extends CSSParserToken {
      +      constructor() {
      +        super(...arguments);
      +        this.tokenType = "EOF";
      +      }
      +      toSource() {
      +        return "";
      +      }
      +    };
      +    DelimToken = class extends CSSParserToken {
      +      constructor(code) {
      +        super();
      +        this.tokenType = "DELIM";
      +        this.value = "";
      +        this.value = stringFromCode(code);
      +      }
      +      toString() {
      +        return "DELIM(" + this.value + ")";
      +      }
      +      toJSON() {
      +        const json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
      +        json.value = this.value;
      +        return json;
      +      }
      +      toSource() {
      +        if (this.value === "\\")
      +          return "\\\n";
      +        else
      +          return this.value;
      +      }
      +    };
      +    StringValuedToken = class extends CSSParserToken {
      +      constructor() {
      +        super(...arguments);
      +        this.value = "";
      +      }
      +      ASCIIMatch(str) {
      +        return this.value.toLowerCase() === str.toLowerCase();
      +      }
      +      toJSON() {
      +        const json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
      +        json.value = this.value;
      +        return json;
      +      }
      +    };
      +    IdentToken = class extends StringValuedToken {
      +      constructor(val) {
      +        super();
      +        this.tokenType = "IDENT";
      +        this.value = val;
      +      }
      +      toString() {
      +        return "IDENT(" + this.value + ")";
      +      }
      +      toSource() {
      +        return escapeIdent(this.value);
      +      }
      +    };
      +    FunctionToken = class extends StringValuedToken {
      +      constructor(val) {
      +        super();
      +        this.tokenType = "FUNCTION";
      +        this.value = val;
      +        this.mirror = ")";
      +      }
      +      toString() {
      +        return "FUNCTION(" + this.value + ")";
      +      }
      +      toSource() {
      +        return escapeIdent(this.value) + "(";
      +      }
      +    };
      +    AtKeywordToken = class extends StringValuedToken {
      +      constructor(val) {
      +        super();
      +        this.tokenType = "AT-KEYWORD";
      +        this.value = val;
      +      }
      +      toString() {
      +        return "AT(" + this.value + ")";
      +      }
      +      toSource() {
      +        return "@" + escapeIdent(this.value);
      +      }
      +    };
      +    HashToken = class extends StringValuedToken {
      +      constructor(val) {
      +        super();
      +        this.tokenType = "HASH";
      +        this.value = val;
      +        this.type = "unrestricted";
      +      }
      +      toString() {
      +        return "HASH(" + this.value + ")";
      +      }
      +      toJSON() {
      +        const json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
      +        json.value = this.value;
      +        json.type = this.type;
      +        return json;
      +      }
      +      toSource() {
      +        if (this.type === "id")
      +          return "#" + escapeIdent(this.value);
      +        else
      +          return "#" + escapeHash(this.value);
      +      }
      +    };
      +    StringToken = class extends StringValuedToken {
      +      constructor(val) {
      +        super();
      +        this.tokenType = "STRING";
      +        this.value = val;
      +      }
      +      toString() {
      +        return '"' + escapeString(this.value) + '"';
      +      }
      +    };
      +    URLToken = class extends StringValuedToken {
      +      constructor(val) {
      +        super();
      +        this.tokenType = "URL";
      +        this.value = val;
      +      }
      +      toString() {
      +        return "URL(" + this.value + ")";
      +      }
      +      toSource() {
      +        return 'url("' + escapeString(this.value) + '")';
      +      }
      +    };
      +    NumberToken = class extends CSSParserToken {
      +      constructor() {
      +        super();
      +        this.tokenType = "NUMBER";
      +        this.type = "integer";
      +        this.repr = "";
      +      }
      +      toString() {
      +        if (this.type === "integer")
      +          return "INT(" + this.value + ")";
      +        return "NUMBER(" + this.value + ")";
      +      }
      +      toJSON() {
      +        const json = super.toJSON();
      +        json.value = this.value;
      +        json.type = this.type;
      +        json.repr = this.repr;
      +        return json;
      +      }
      +      toSource() {
      +        return this.repr;
      +      }
      +    };
      +    PercentageToken = class extends CSSParserToken {
      +      constructor() {
      +        super();
      +        this.tokenType = "PERCENTAGE";
      +        this.repr = "";
      +      }
      +      toString() {
      +        return "PERCENTAGE(" + this.value + ")";
      +      }
      +      toJSON() {
      +        const json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
      +        json.value = this.value;
      +        json.repr = this.repr;
      +        return json;
      +      }
      +      toSource() {
      +        return this.repr + "%";
      +      }
      +    };
      +    DimensionToken = class extends CSSParserToken {
      +      constructor() {
      +        super();
      +        this.tokenType = "DIMENSION";
      +        this.type = "integer";
      +        this.repr = "";
      +        this.unit = "";
      +      }
      +      toString() {
      +        return "DIM(" + this.value + "," + this.unit + ")";
      +      }
      +      toJSON() {
      +        const json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
      +        json.value = this.value;
      +        json.type = this.type;
      +        json.repr = this.repr;
      +        json.unit = this.unit;
      +        return json;
      +      }
      +      toSource() {
      +        const source11 = this.repr;
      +        let unit = escapeIdent(this.unit);
      +        if (unit[0].toLowerCase() === "e" && (unit[1] === "-" || between(unit.charCodeAt(1), 48, 57))) {
      +          unit = "\\65 " + unit.slice(1, unit.length);
      +        }
      +        return source11 + unit;
      +      }
      +    };
      +  }
      +});
      +
      +// packages/isomorphic/cssParser.ts
      +function isInvalidSelectorError(error) {
      +  return error instanceof InvalidSelectorError;
      +}
      +function parseCSS(selector, customNames) {
      +  let tokens;
      +  try {
      +    tokens = tokenize(selector);
      +    if (!(tokens[tokens.length - 1] instanceof EOFToken))
      +      tokens.push(new EOFToken());
      +  } catch (e) {
      +    const newMessage = e.message + ` while parsing css selector "${selector}". Did you mean to CSS.escape it?`;
      +    const index = (e.stack || "").indexOf(e.message);
      +    if (index !== -1)
      +      e.stack = e.stack.substring(0, index) + newMessage + e.stack.substring(index + e.message.length);
      +    e.message = newMessage;
      +    throw e;
      +  }
      +  const unsupportedToken = tokens.find((token) => {
      +    return token instanceof AtKeywordToken || token instanceof BadStringToken || token instanceof BadURLToken || token instanceof ColumnToken || token instanceof CDOToken || token instanceof CDCToken || token instanceof SemicolonToken || // TODO: Consider using these for something, e.g. to escape complex strings.
      +    // For example :xpath{ (//div/bar[@attr="foo"])[2]/baz }
      +    // Or this way :xpath( {complex-xpath-goes-here("hello")} )
      +    token instanceof OpenCurlyToken || token instanceof CloseCurlyToken || // TODO: Consider treating these as strings?
      +    token instanceof URLToken || token instanceof PercentageToken;
      +  });
      +  if (unsupportedToken)
      +    throw new InvalidSelectorError(`Unsupported token "${unsupportedToken.toSource()}" while parsing css selector "${selector}". Did you mean to CSS.escape it?`);
      +  let pos = 0;
      +  const names = /* @__PURE__ */ new Set();
      +  function unexpected() {
      +    return new InvalidSelectorError(`Unexpected token "${tokens[pos].toSource()}" while parsing css selector "${selector}". Did you mean to CSS.escape it?`);
      +  }
      +  function skipWhitespace() {
      +    while (tokens[pos] instanceof WhitespaceToken)
      +      pos++;
      +  }
      +  function isIdent(p = pos) {
      +    return tokens[p] instanceof IdentToken;
      +  }
      +  function isString2(p = pos) {
      +    return tokens[p] instanceof StringToken;
      +  }
      +  function isNumber(p = pos) {
      +    return tokens[p] instanceof NumberToken;
      +  }
      +  function isComma(p = pos) {
      +    return tokens[p] instanceof CommaToken;
      +  }
      +  function isOpenParen(p = pos) {
      +    return tokens[p] instanceof OpenParenToken;
      +  }
      +  function isCloseParen(p = pos) {
      +    return tokens[p] instanceof CloseParenToken;
      +  }
      +  function isFunction2(p = pos) {
      +    return tokens[p] instanceof FunctionToken;
      +  }
      +  function isStar(p = pos) {
      +    return tokens[p] instanceof DelimToken && tokens[p].value === "*";
      +  }
      +  function isEOF(p = pos) {
      +    return tokens[p] instanceof EOFToken;
      +  }
      +  function isClauseCombinator(p = pos) {
      +    return tokens[p] instanceof DelimToken && [">", "+", "~"].includes(tokens[p].value);
      +  }
      +  function isSelectorClauseEnd(p = pos) {
      +    return isComma(p) || isCloseParen(p) || isEOF(p) || isClauseCombinator(p) || tokens[p] instanceof WhitespaceToken;
      +  }
      +  function consumeFunctionArguments() {
      +    const result3 = [consumeArgument()];
      +    while (true) {
      +      skipWhitespace();
      +      if (!isComma())
      +        break;
      +      pos++;
      +      result3.push(consumeArgument());
      +    }
      +    return result3;
      +  }
      +  function consumeArgument() {
      +    skipWhitespace();
      +    if (isNumber())
      +      return tokens[pos++].value;
      +    if (isString2())
      +      return tokens[pos++].value;
      +    return consumeComplexSelector();
      +  }
      +  function consumeComplexSelector() {
      +    const result3 = { simples: [] };
      +    skipWhitespace();
      +    if (isClauseCombinator()) {
      +      result3.simples.push({ selector: { functions: [{ name: "scope", args: [] }] }, combinator: "" });
      +    } else {
      +      result3.simples.push({ selector: consumeSimpleSelector(), combinator: "" });
      +    }
      +    while (true) {
      +      skipWhitespace();
      +      if (isClauseCombinator()) {
      +        result3.simples[result3.simples.length - 1].combinator = tokens[pos++].value;
      +        skipWhitespace();
      +      } else if (isSelectorClauseEnd()) {
      +        break;
      +      }
      +      result3.simples.push({ combinator: "", selector: consumeSimpleSelector() });
      +    }
      +    return result3;
      +  }
      +  function consumeSimpleSelector() {
      +    let rawCSSString = "";
      +    const functions = [];
      +    while (!isSelectorClauseEnd()) {
      +      if (isIdent() || isStar()) {
      +        rawCSSString += tokens[pos++].toSource();
      +      } else if (tokens[pos] instanceof HashToken) {
      +        rawCSSString += tokens[pos++].toSource();
      +      } else if (tokens[pos] instanceof DelimToken && tokens[pos].value === ".") {
      +        pos++;
      +        if (isIdent())
      +          rawCSSString += "." + tokens[pos++].toSource();
      +        else
      +          throw unexpected();
      +      } else if (tokens[pos] instanceof ColonToken) {
      +        pos++;
      +        if (isIdent()) {
      +          if (!customNames.has(tokens[pos].value.toLowerCase())) {
      +            rawCSSString += ":" + tokens[pos++].toSource();
      +          } else {
      +            const name = tokens[pos++].value.toLowerCase();
      +            functions.push({ name, args: [] });
      +            names.add(name);
      +          }
      +        } else if (isFunction2()) {
      +          const name = tokens[pos++].value.toLowerCase();
      +          if (!customNames.has(name)) {
      +            rawCSSString += `:${name}(${consumeBuiltinFunctionArguments()})`;
      +          } else {
      +            functions.push({ name, args: consumeFunctionArguments() });
      +            names.add(name);
      +          }
      +          skipWhitespace();
      +          if (!isCloseParen())
      +            throw unexpected();
      +          pos++;
      +        } else {
      +          throw unexpected();
      +        }
      +      } else if (tokens[pos] instanceof OpenSquareToken) {
      +        rawCSSString += "[";
      +        pos++;
      +        while (!(tokens[pos] instanceof CloseSquareToken) && !isEOF())
      +          rawCSSString += tokens[pos++].toSource();
      +        if (!(tokens[pos] instanceof CloseSquareToken))
      +          throw unexpected();
      +        rawCSSString += "]";
      +        pos++;
      +      } else {
      +        throw unexpected();
      +      }
      +    }
      +    if (!rawCSSString && !functions.length)
      +      throw unexpected();
      +    return { css: rawCSSString || void 0, functions };
      +  }
      +  function consumeBuiltinFunctionArguments() {
      +    let s = "";
      +    let balance = 1;
      +    while (!isEOF()) {
      +      if (isOpenParen() || isFunction2())
      +        balance++;
      +      if (isCloseParen())
      +        balance--;
      +      if (!balance)
      +        break;
      +      s += tokens[pos++].toSource();
      +    }
      +    return s;
      +  }
      +  const result2 = consumeFunctionArguments();
      +  if (!isEOF())
      +    throw unexpected();
      +  if (result2.some((arg) => typeof arg !== "object" || !("simples" in arg)))
      +    throw new InvalidSelectorError(`Error while parsing css selector "${selector}". Did you mean to CSS.escape it?`);
      +  return { selector: result2, names: Array.from(names) };
      +}
      +function serializeSelector(args) {
      +  return args.map((arg) => {
      +    if (typeof arg === "string")
      +      return `"${arg}"`;
      +    if (typeof arg === "number")
      +      return String(arg);
      +    return arg.simples.map(({ selector, combinator }) => {
      +      let s = selector.css || "";
      +      s = s + selector.functions.map((func) => `:${func.name}(${serializeSelector(func.args)})`).join("");
      +      if (combinator)
      +        s += " " + combinator;
      +      return s;
      +    }).join(" ");
      +  }).join(", ");
      +}
      +var InvalidSelectorError;
      +var init_cssParser = __esm({
      +  "packages/isomorphic/cssParser.ts"() {
      +    "use strict";
      +    init_cssTokenizer();
      +    InvalidSelectorError = class extends Error {
      +    };
      +  }
      +});
      +
      +// packages/isomorphic/selectorParser.ts
      +function parseSelector(selector) {
      +  const parsedStrings = parseSelectorString(selector);
      +  const parts = [];
      +  for (const part of parsedStrings.parts) {
      +    if (part.name === "css" || part.name === "css:light") {
      +      if (part.name === "css:light")
      +        part.body = ":light(" + part.body + ")";
      +      const parsedCSS = parseCSS(part.body, customCSSNames);
      +      parts.push({
      +        name: "css",
      +        body: parsedCSS.selector,
      +        source: part.body
      +      });
      +      continue;
      +    }
      +    if (kNestedSelectorNames.has(part.name)) {
      +      let innerSelector;
      +      let distance;
      +      try {
      +        const unescaped = JSON.parse("[" + part.body + "]");
      +        if (!Array.isArray(unescaped) || unescaped.length < 1 || unescaped.length > 2 || typeof unescaped[0] !== "string")
      +          throw new InvalidSelectorError(`Malformed selector: ${part.name}=` + part.body);
      +        innerSelector = unescaped[0];
      +        if (unescaped.length === 2) {
      +          if (typeof unescaped[1] !== "number" || !kNestedSelectorNamesWithDistance.has(part.name))
      +            throw new InvalidSelectorError(`Malformed selector: ${part.name}=` + part.body);
      +          distance = unescaped[1];
      +        }
      +      } catch (e) {
      +        throw new InvalidSelectorError(`Malformed selector: ${part.name}=` + part.body);
      +      }
      +      const nested = { name: part.name, source: part.body, body: { parsed: parseSelector(innerSelector), distance } };
      +      const lastFrame = [...nested.body.parsed.parts].reverse().find((part2) => part2.name === "internal:control" && part2.body === "enter-frame");
      +      const lastFrameIndex = lastFrame ? nested.body.parsed.parts.indexOf(lastFrame) : -1;
      +      if (lastFrameIndex !== -1 && selectorPartsEqual(nested.body.parsed.parts.slice(0, lastFrameIndex + 1), parts.slice(0, lastFrameIndex + 1)))
      +        nested.body.parsed.parts.splice(0, lastFrameIndex + 1);
      +      parts.push(nested);
      +      continue;
      +    }
      +    parts.push({ ...part, source: part.body });
      +  }
      +  if (kNestedSelectorNames.has(parts[0].name))
      +    throw new InvalidSelectorError(`"${parts[0].name}" selector cannot be first`);
      +  return {
      +    capture: parsedStrings.capture,
      +    parts
      +  };
      +}
      +function splitSelectorByFrame(selectorText) {
      +  const selector = parseSelector(selectorText);
      +  const result2 = [];
      +  let chunk = {
      +    parts: []
      +  };
      +  let chunkStartIndex = 0;
      +  for (let i = 0; i < selector.parts.length; ++i) {
      +    const part = selector.parts[i];
      +    if (part.name === "internal:control" && part.body === "enter-frame") {
      +      if (!chunk.parts.length)
      +        throw new InvalidSelectorError("Selector cannot start with entering frame, select the iframe first");
      +      result2.push(chunk);
      +      chunk = { parts: [] };
      +      chunkStartIndex = i + 1;
      +      continue;
      +    }
      +    if (selector.capture === i)
      +      chunk.capture = i - chunkStartIndex;
      +    chunk.parts.push(part);
      +  }
      +  if (!chunk.parts.length)
      +    throw new InvalidSelectorError(`Selector cannot end with entering frame, while parsing selector ${selectorText}`);
      +  result2.push(chunk);
      +  if (typeof selector.capture === "number" && typeof result2[result2.length - 1].capture !== "number")
      +    throw new InvalidSelectorError(`Can not capture the selector before diving into the frame. Only use * after the last frame has been selected`);
      +  return result2;
      +}
      +function selectorPartsEqual(list1, list2) {
      +  return stringifySelector({ parts: list1 }) === stringifySelector({ parts: list2 });
      +}
      +function stringifySelector(selector, forceEngineName) {
      +  if (typeof selector === "string")
      +    return selector;
      +  return selector.parts.map((p, i) => {
      +    let includeEngine = true;
      +    if (!forceEngineName && i !== selector.capture) {
      +      if (p.name === "css")
      +        includeEngine = false;
      +      else if (p.name === "xpath" && p.source.startsWith("//") || p.source.startsWith(".."))
      +        includeEngine = false;
      +    }
      +    const prefix = includeEngine ? p.name + "=" : "";
      +    return `${i === selector.capture ? "*" : ""}${prefix}${p.source}`;
      +  }).join(" >> ");
      +}
      +function visitAllSelectorParts(selector, visitor) {
      +  const visit = (selector2, nested) => {
      +    for (const part of selector2.parts) {
      +      visitor(part, nested);
      +      if (kNestedSelectorNames.has(part.name))
      +        visit(part.body.parsed, true);
      +    }
      +  };
      +  visit(selector, false);
      +}
      +function parseSelectorString(selector) {
      +  let index = 0;
      +  let quote5;
      +  let start3 = 0;
      +  const result2 = { parts: [] };
      +  const append = () => {
      +    const part = selector.substring(start3, index).trim();
      +    const eqIndex = part.indexOf("=");
      +    let name;
      +    let body;
      +    if (eqIndex !== -1 && part.substring(0, eqIndex).trim().match(/^[a-zA-Z_0-9-+:*]+$/)) {
      +      name = part.substring(0, eqIndex).trim();
      +      body = part.substring(eqIndex + 1);
      +    } else if (part.length > 1 && part[0] === '"' && part[part.length - 1] === '"') {
      +      name = "text";
      +      body = part;
      +    } else if (part.length > 1 && part[0] === "'" && part[part.length - 1] === "'") {
      +      name = "text";
      +      body = part;
      +    } else if (/^\(*\/\//.test(part) || part.startsWith("..")) {
      +      name = "xpath";
      +      body = part;
      +    } else {
      +      name = "css";
      +      body = part;
      +    }
      +    let capture = false;
      +    if (name[0] === "*") {
      +      capture = true;
      +      name = name.substring(1);
      +    }
      +    result2.parts.push({ name, body });
      +    if (capture) {
      +      if (result2.capture !== void 0)
      +        throw new InvalidSelectorError(`Only one of the selectors can capture using * modifier`);
      +      result2.capture = result2.parts.length - 1;
      +    }
      +  };
      +  if (!selector.includes(">>")) {
      +    index = selector.length;
      +    append();
      +    return result2;
      +  }
      +  const shouldIgnoreTextSelectorQuote = () => {
      +    const prefix = selector.substring(start3, index);
      +    const match = prefix.match(/^\s*text\s*=(.*)$/);
      +    return !!match && !!match[1];
      +  };
      +  while (index < selector.length) {
      +    const c = selector[index];
      +    if (c === "\\" && index + 1 < selector.length) {
      +      index += 2;
      +    } else if (c === quote5) {
      +      quote5 = void 0;
      +      index++;
      +    } else if (!quote5 && (c === '"' || c === "'" || c === "`") && !shouldIgnoreTextSelectorQuote()) {
      +      quote5 = c;
      +      index++;
      +    } else if (!quote5 && c === ">" && selector[index + 1] === ">") {
      +      append();
      +      index += 2;
      +      start3 = index;
      +    } else {
      +      index++;
      +    }
      +  }
      +  append();
      +  return result2;
      +}
      +function parseAttributeSelector(selector, allowUnquotedStrings) {
      +  let wp = 0;
      +  let EOL = selector.length === 0;
      +  const next = () => selector[wp] || "";
      +  const eat1 = () => {
      +    const result3 = next();
      +    ++wp;
      +    EOL = wp >= selector.length;
      +    return result3;
      +  };
      +  const syntaxError = (stage) => {
      +    if (EOL)
      +      throw new InvalidSelectorError(`Unexpected end of selector while parsing selector \`${selector}\``);
      +    throw new InvalidSelectorError(`Error while parsing selector \`${selector}\` - unexpected symbol "${next()}" at position ${wp}` + (stage ? " during " + stage : ""));
      +  };
      +  function skipSpaces() {
      +    while (!EOL && /\s/.test(next()))
      +      eat1();
      +  }
      +  function isCSSNameChar(char) {
      +    return char >= "\x80" || char >= "0" && char <= "9" || char >= "A" && char <= "Z" || char >= "a" && char <= "z" || char >= "0" && char <= "9" || char === "_" || char === "-";
      +  }
      +  function readIdentifier() {
      +    let result3 = "";
      +    skipSpaces();
      +    while (!EOL && isCSSNameChar(next()))
      +      result3 += eat1();
      +    return result3;
      +  }
      +  function readQuotedString(quote5) {
      +    let result3 = eat1();
      +    if (result3 !== quote5)
      +      syntaxError("parsing quoted string");
      +    while (!EOL && next() !== quote5) {
      +      if (next() === "\\")
      +        eat1();
      +      result3 += eat1();
      +    }
      +    if (next() !== quote5)
      +      syntaxError("parsing quoted string");
      +    result3 += eat1();
      +    return result3;
      +  }
      +  function readRegularExpression() {
      +    if (eat1() !== "/")
      +      syntaxError("parsing regular expression");
      +    let source11 = "";
      +    let inClass = false;
      +    while (!EOL) {
      +      if (next() === "\\") {
      +        source11 += eat1();
      +        if (EOL)
      +          syntaxError("parsing regular expression");
      +      } else if (inClass && next() === "]") {
      +        inClass = false;
      +      } else if (!inClass && next() === "[") {
      +        inClass = true;
      +      } else if (!inClass && next() === "/") {
      +        break;
      +      }
      +      source11 += eat1();
      +    }
      +    if (eat1() !== "/")
      +      syntaxError("parsing regular expression");
      +    let flags = "";
      +    while (!EOL && next().match(/[dgimsuy]/))
      +      flags += eat1();
      +    try {
      +      return new RegExp(source11, flags);
      +    } catch (e) {
      +      throw new InvalidSelectorError(`Error while parsing selector \`${selector}\`: ${e.message}`);
      +    }
      +  }
      +  function readAttributeToken() {
      +    let token = "";
      +    skipSpaces();
      +    if (next() === `'` || next() === `"`)
      +      token = readQuotedString(next()).slice(1, -1);
      +    else
      +      token = readIdentifier();
      +    if (!token)
      +      syntaxError("parsing property path");
      +    return token;
      +  }
      +  function readOperator() {
      +    skipSpaces();
      +    let op = "";
      +    if (!EOL)
      +      op += eat1();
      +    if (!EOL && op !== "=")
      +      op += eat1();
      +    if (!["=", "*=", "^=", "$=", "|=", "~="].includes(op))
      +      syntaxError("parsing operator");
      +    return op;
      +  }
      +  function readAttribute() {
      +    eat1();
      +    const jsonPath = [];
      +    jsonPath.push(readAttributeToken());
      +    skipSpaces();
      +    while (next() === ".") {
      +      eat1();
      +      jsonPath.push(readAttributeToken());
      +      skipSpaces();
      +    }
      +    if (next() === "]") {
      +      eat1();
      +      return { name: jsonPath.join("."), jsonPath, op: "", value: null, caseSensitive: false };
      +    }
      +    const operator = readOperator();
      +    let value2 = void 0;
      +    let caseSensitive = true;
      +    skipSpaces();
      +    if (next() === "/") {
      +      if (operator !== "=")
      +        throw new InvalidSelectorError(`Error while parsing selector \`${selector}\` - cannot use ${operator} in attribute with regular expression`);
      +      value2 = readRegularExpression();
      +    } else if (next() === `'` || next() === `"`) {
      +      value2 = readQuotedString(next()).slice(1, -1);
      +      skipSpaces();
      +      if (next() === "i" || next() === "I") {
      +        caseSensitive = false;
      +        eat1();
      +      } else if (next() === "s" || next() === "S") {
      +        caseSensitive = true;
      +        eat1();
      +      }
      +    } else {
      +      value2 = "";
      +      while (!EOL && (isCSSNameChar(next()) || next() === "+" || next() === "."))
      +        value2 += eat1();
      +      if (value2 === "true") {
      +        value2 = true;
      +      } else if (value2 === "false") {
      +        value2 = false;
      +      } else {
      +        if (!allowUnquotedStrings) {
      +          value2 = +value2;
      +          if (Number.isNaN(value2))
      +            syntaxError("parsing attribute value");
      +        }
      +      }
      +    }
      +    skipSpaces();
      +    if (next() !== "]")
      +      syntaxError("parsing attribute value");
      +    eat1();
      +    if (operator !== "=" && typeof value2 !== "string")
      +      throw new InvalidSelectorError(`Error while parsing selector \`${selector}\` - cannot use ${operator} in attribute with non-string matching value - ${value2}`);
      +    return { name: jsonPath.join("."), jsonPath, op: operator, value: value2, caseSensitive };
      +  }
      +  const result2 = {
      +    name: "",
      +    attributes: []
      +  };
      +  result2.name = readIdentifier();
      +  skipSpaces();
      +  while (next() === "[") {
      +    result2.attributes.push(readAttribute());
      +    skipSpaces();
      +  }
      +  if (!EOL)
      +    syntaxError(void 0);
      +  if (!result2.name && !result2.attributes.length)
      +    throw new InvalidSelectorError(`Error while parsing selector \`${selector}\` - selector cannot be empty`);
      +  return result2;
      +}
      +var kNestedSelectorNames, kNestedSelectorNamesWithDistance, customCSSNames;
      +var init_selectorParser = __esm({
      +  "packages/isomorphic/selectorParser.ts"() {
      +    "use strict";
      +    init_cssParser();
      +    init_cssParser();
      +    kNestedSelectorNames = /* @__PURE__ */ new Set(["internal:has", "internal:has-not", "internal:and", "internal:or", "internal:chain", "left-of", "right-of", "above", "below", "near"]);
      +    kNestedSelectorNamesWithDistance = /* @__PURE__ */ new Set(["left-of", "right-of", "above", "below", "near"]);
      +    customCSSNames = /* @__PURE__ */ new Set(["not", "is", "where", "has", "scope", "light", "visible", "text", "text-matches", "text-is", "has-text", "above", "below", "right-of", "left-of", "near", "nth-match"]);
      +  }
      +});
      +
      +// packages/isomorphic/locatorGenerators.ts
      +function asLocatorDescription(lang, selector) {
      +  try {
      +    const parsed = parseSelector(selector);
      +    const customDescription = parseCustomDescription(parsed);
      +    if (customDescription)
      +      return customDescription;
      +    return innerAsLocators(new generators[lang](), parsed, false, 1)[0];
      +  } catch (e) {
      +    return selector;
      +  }
      +}
      +function locatorCustomDescription(selector) {
      +  try {
      +    const parsed = parseSelector(selector);
      +    return parseCustomDescription(parsed);
      +  } catch (e) {
      +    return void 0;
      +  }
      +}
      +function parseCustomDescription(parsed) {
      +  const lastPart = parsed.parts[parsed.parts.length - 1];
      +  if (lastPart?.name === "internal:describe") {
      +    const description = JSON.parse(lastPart.body);
      +    if (typeof description === "string")
      +      return description;
      +  }
      +  return void 0;
      +}
      +function asLocator(lang, selector, isFrameLocator = false) {
      +  return asLocators(lang, selector, isFrameLocator, 1)[0];
      +}
      +function asLocators(lang, selector, isFrameLocator = false, maxOutputSize = 20, preferredQuote) {
      +  try {
      +    return innerAsLocators(new generators[lang](preferredQuote), parseSelector(selector), isFrameLocator, maxOutputSize);
      +  } catch (e) {
      +    return [selector];
      +  }
      +}
      +function innerAsLocators(factory, parsed, isFrameLocator = false, maxOutputSize = 20) {
      +  const parts = [...parsed.parts];
      +  const tokens = [];
      +  let nextBase = isFrameLocator ? "frame-locator" : "page";
      +  for (let index = 0; index < parts.length; index++) {
      +    const part = parts[index];
      +    const base = nextBase;
      +    nextBase = "locator";
      +    if (part.name === "internal:describe")
      +      continue;
      +    if (part.name === "nth") {
      +      if (part.body === "0")
      +        tokens.push([factory.generateLocator(base, "first", ""), factory.generateLocator(base, "nth", "0")]);
      +      else if (part.body === "-1")
      +        tokens.push([factory.generateLocator(base, "last", ""), factory.generateLocator(base, "nth", "-1")]);
      +      else
      +        tokens.push([factory.generateLocator(base, "nth", part.body)]);
      +      continue;
      +    }
      +    if (part.name === "visible") {
      +      tokens.push([factory.generateLocator(base, "visible", part.body), factory.generateLocator(base, "default", `visible=${part.body}`)]);
      +      continue;
      +    }
      +    if (part.name === "internal:text") {
      +      const { exact, text: text2 } = detectExact(part.body);
      +      tokens.push([factory.generateLocator(base, "text", text2, { exact })]);
      +      continue;
      +    }
      +    if (part.name === "internal:has-text") {
      +      const { exact, text: text2 } = detectExact(part.body);
      +      if (!exact) {
      +        tokens.push([factory.generateLocator(base, "has-text", text2, { exact })]);
      +        continue;
      +      }
      +    }
      +    if (part.name === "internal:has-not-text") {
      +      const { exact, text: text2 } = detectExact(part.body);
      +      if (!exact) {
      +        tokens.push([factory.generateLocator(base, "has-not-text", text2, { exact })]);
      +        continue;
      +      }
      +    }
      +    if (part.name === "internal:has") {
      +      const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize);
      +      tokens.push(inners.map((inner) => factory.generateLocator(base, "has", inner)));
      +      continue;
      +    }
      +    if (part.name === "internal:has-not") {
      +      const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize);
      +      tokens.push(inners.map((inner) => factory.generateLocator(base, "hasNot", inner)));
      +      continue;
      +    }
      +    if (part.name === "internal:and") {
      +      const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize);
      +      tokens.push(inners.map((inner) => factory.generateLocator(base, "and", inner)));
      +      continue;
      +    }
      +    if (part.name === "internal:or") {
      +      const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize);
      +      tokens.push(inners.map((inner) => factory.generateLocator(base, "or", inner)));
      +      continue;
      +    }
      +    if (part.name === "internal:chain") {
      +      const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize);
      +      tokens.push(inners.map((inner) => factory.generateLocator(base, "chain", inner)));
      +      continue;
      +    }
      +    if (part.name === "internal:label") {
      +      const { exact, text: text2 } = detectExact(part.body);
      +      tokens.push([factory.generateLocator(base, "label", text2, { exact })]);
      +      continue;
      +    }
      +    if (part.name === "internal:role") {
      +      const attrSelector = parseAttributeSelector(part.body, true);
      +      const options = { attrs: [] };
      +      for (const attr of attrSelector.attributes) {
      +        if (attr.name === "name") {
      +          if (options.exact !== void 0 && options.exact !== attr.caseSensitive)
      +            throw new Error(`Conflicting exactness in internal:role selector: ${stringifySelector({ parts: [part] })}`);
      +          options.exact = attr.caseSensitive;
      +          options.name = attr.value;
      +        } else if (attr.name === "description") {
      +          if (options.exact !== void 0 && options.exact !== attr.caseSensitive)
      +            throw new Error(`Conflicting exactness in internal:role selector: ${stringifySelector({ parts: [part] })}`);
      +          options.exact = attr.caseSensitive;
      +          options.description = attr.value;
      +        } else {
      +          if (attr.name === "level" && typeof attr.value === "string")
      +            attr.value = +attr.value;
      +          options.attrs.push({ name: attr.name === "include-hidden" ? "includeHidden" : attr.name, value: attr.value });
      +        }
      +      }
      +      tokens.push([factory.generateLocator(base, "role", attrSelector.name, options)]);
      +      continue;
      +    }
      +    if (part.name === "internal:testid") {
      +      const attrSelector = parseAttributeSelector(part.body, true);
      +      const { value: value2 } = attrSelector.attributes[0];
      +      tokens.push([factory.generateLocator(base, "test-id", value2)]);
      +      continue;
      +    }
      +    if (part.name === "internal:attr") {
      +      const attrSelector = parseAttributeSelector(part.body, true);
      +      const { name, value: value2, caseSensitive } = attrSelector.attributes[0];
      +      const text2 = value2;
      +      const exact = !!caseSensitive;
      +      if (name === "placeholder") {
      +        tokens.push([factory.generateLocator(base, "placeholder", text2, { exact })]);
      +        continue;
      +      }
      +      if (name === "alt") {
      +        tokens.push([factory.generateLocator(base, "alt", text2, { exact })]);
      +        continue;
      +      }
      +      if (name === "title") {
      +        tokens.push([factory.generateLocator(base, "title", text2, { exact })]);
      +        continue;
      +      }
      +    }
      +    if (part.name === "internal:control" && part.body === "enter-frame") {
      +      const lastTokens = tokens[tokens.length - 1];
      +      const lastPart = parts[index - 1];
      +      const transformed = lastTokens.map((token) => factory.chainLocators([token, factory.generateLocator(base, "frame", "")]));
      +      if (["xpath", "css"].includes(lastPart.name)) {
      +        transformed.push(
      +          factory.generateLocator(base, "frame-locator", stringifySelector({ parts: [lastPart] })),
      +          factory.generateLocator(base, "frame-locator", stringifySelector({ parts: [lastPart] }, true))
      +        );
      +      }
      +      lastTokens.splice(0, lastTokens.length, ...transformed);
      +      nextBase = "frame-locator";
      +      continue;
      +    }
      +    const nextPart = parts[index + 1];
      +    const selectorPart = stringifySelector({ parts: [part] });
      +    const locatorPart = factory.generateLocator(base, "default", selectorPart);
      +    if (nextPart && ["internal:has-text", "internal:has-not-text"].includes(nextPart.name)) {
      +      const { exact, text: text2 } = detectExact(nextPart.body);
      +      if (!exact) {
      +        const nextLocatorPart = factory.generateLocator("locator", nextPart.name === "internal:has-text" ? "has-text" : "has-not-text", text2, { exact });
      +        const options = {};
      +        if (nextPart.name === "internal:has-text")
      +          options.hasText = text2;
      +        else
      +          options.hasNotText = text2;
      +        const combinedPart = factory.generateLocator(base, "default", selectorPart, options);
      +        tokens.push([factory.chainLocators([locatorPart, nextLocatorPart]), combinedPart]);
      +        index++;
      +        continue;
      +      }
      +    }
      +    let locatorPartWithEngine;
      +    if (["xpath", "css"].includes(part.name)) {
      +      const selectorPart2 = stringifySelector(
      +        { parts: [part] },
      +        /* forceEngineName */
      +        true
      +      );
      +      locatorPartWithEngine = factory.generateLocator(base, "default", selectorPart2);
      +    }
      +    tokens.push([locatorPart, locatorPartWithEngine].filter(Boolean));
      +  }
      +  return combineTokens(factory, tokens, maxOutputSize);
      +}
      +function combineTokens(factory, tokens, maxOutputSize) {
      +  const currentTokens = tokens.map(() => "");
      +  const result2 = [];
      +  const visit = (index) => {
      +    if (index === tokens.length) {
      +      result2.push(factory.chainLocators(currentTokens));
      +      return result2.length < maxOutputSize;
      +    }
      +    for (const taken of tokens[index]) {
      +      currentTokens[index] = taken;
      +      if (!visit(index + 1))
      +        return false;
      +    }
      +    return true;
      +  };
      +  visit(0);
      +  return result2;
      +}
      +function detectExact(text2) {
      +  let exact = false;
      +  const match = text2.match(/^\/(.*)\/([igm]*)$/);
      +  if (match)
      +    return { text: new RegExp(match[1], match[2]) };
      +  if (text2.endsWith('"')) {
      +    text2 = JSON.parse(text2);
      +    exact = true;
      +  } else if (text2.endsWith('"s')) {
      +    text2 = JSON.parse(text2.substring(0, text2.length - 1));
      +    exact = true;
      +  } else if (text2.endsWith('"i')) {
      +    text2 = JSON.parse(text2.substring(0, text2.length - 1));
      +    exact = false;
      +  }
      +  return { exact, text: text2 };
      +}
      +function isRegExp2(obj) {
      +  return obj instanceof RegExp;
      +}
      +var JavaScriptLocatorFactory, PythonLocatorFactory, JavaLocatorFactory, CSharpLocatorFactory, JsonlLocatorFactory, generators;
      +var init_locatorGenerators = __esm({
      +  "packages/isomorphic/locatorGenerators.ts"() {
      +    "use strict";
      +    init_selectorParser();
      +    init_stringUtils();
      +    JavaScriptLocatorFactory = class {
      +      constructor(preferredQuote) {
      +        this.preferredQuote = preferredQuote;
      +      }
      +      generateLocator(base, kind, body, options = {}) {
      +        switch (kind) {
      +          case "default":
      +            if (options.hasText !== void 0)
      +              return `locator(${this.quote(body)}, { hasText: ${this.toHasText(options.hasText)} })`;
      +            if (options.hasNotText !== void 0)
      +              return `locator(${this.quote(body)}, { hasNotText: ${this.toHasText(options.hasNotText)} })`;
      +            return `locator(${this.quote(body)})`;
      +          case "frame-locator":
      +            return `frameLocator(${this.quote(body)})`;
      +          case "frame":
      +            return `contentFrame()`;
      +          case "nth":
      +            return `nth(${body})`;
      +          case "first":
      +            return `first()`;
      +          case "last":
      +            return `last()`;
      +          case "visible":
      +            return `filter({ visible: ${body === "true" ? "true" : "false"} })`;
      +          case "role":
      +            const attrs = [];
      +            if (isRegExp2(options.name))
      +              attrs.push(`name: ${this.regexToSourceString(options.name)}`);
      +            else if (typeof options.name === "string")
      +              attrs.push(`name: ${this.quote(options.name)}`);
      +            if (isRegExp2(options.description))
      +              attrs.push(`description: ${this.regexToSourceString(options.description)}`);
      +            else if (typeof options.description === "string")
      +              attrs.push(`description: ${this.quote(options.description)}`);
      +            if (options.exact && (typeof options.name === "string" || typeof options.description === "string"))
      +              attrs.push(`exact: true`);
      +            for (const { name, value: value2 } of options.attrs)
      +              attrs.push(`${name}: ${typeof value2 === "string" ? this.quote(value2) : value2}`);
      +            const attrString = attrs.length ? `, { ${attrs.join(", ")} }` : "";
      +            return `getByRole(${this.quote(body)}${attrString})`;
      +          case "has-text":
      +            return `filter({ hasText: ${this.toHasText(body)} })`;
      +          case "has-not-text":
      +            return `filter({ hasNotText: ${this.toHasText(body)} })`;
      +          case "has":
      +            return `filter({ has: ${body} })`;
      +          case "hasNot":
      +            return `filter({ hasNot: ${body} })`;
      +          case "and":
      +            return `and(${body})`;
      +          case "or":
      +            return `or(${body})`;
      +          case "chain":
      +            return `locator(${body})`;
      +          case "test-id":
      +            return `getByTestId(${this.toTestIdValue(body)})`;
      +          case "text":
      +            return this.toCallWithExact("getByText", body, !!options.exact);
      +          case "alt":
      +            return this.toCallWithExact("getByAltText", body, !!options.exact);
      +          case "placeholder":
      +            return this.toCallWithExact("getByPlaceholder", body, !!options.exact);
      +          case "label":
      +            return this.toCallWithExact("getByLabel", body, !!options.exact);
      +          case "title":
      +            return this.toCallWithExact("getByTitle", body, !!options.exact);
      +          default:
      +            throw new Error("Unknown selector kind " + kind);
      +        }
      +      }
      +      chainLocators(locators) {
      +        return locators.join(".");
      +      }
      +      regexToSourceString(re2) {
      +        return normalizeEscapedRegexQuotes(String(re2));
      +      }
      +      toCallWithExact(method, body, exact) {
      +        if (isRegExp2(body))
      +          return `${method}(${this.regexToSourceString(body)})`;
      +        return exact ? `${method}(${this.quote(body)}, { exact: true })` : `${method}(${this.quote(body)})`;
      +      }
      +      toHasText(body) {
      +        if (isRegExp2(body))
      +          return this.regexToSourceString(body);
      +        return this.quote(body);
      +      }
      +      toTestIdValue(value2) {
      +        if (isRegExp2(value2))
      +          return this.regexToSourceString(value2);
      +        return this.quote(value2);
      +      }
      +      quote(text2) {
      +        return escapeWithQuotes(text2, this.preferredQuote ?? "'");
      +      }
      +    };
      +    PythonLocatorFactory = class {
      +      generateLocator(base, kind, body, options = {}) {
      +        switch (kind) {
      +          case "default":
      +            if (options.hasText !== void 0)
      +              return `locator(${this.quote(body)}, has_text=${this.toHasText(options.hasText)})`;
      +            if (options.hasNotText !== void 0)
      +              return `locator(${this.quote(body)}, has_not_text=${this.toHasText(options.hasNotText)})`;
      +            return `locator(${this.quote(body)})`;
      +          case "frame-locator":
      +            return `frame_locator(${this.quote(body)})`;
      +          case "frame":
      +            return `content_frame`;
      +          case "nth":
      +            return `nth(${body})`;
      +          case "first":
      +            return `first`;
      +          case "last":
      +            return `last`;
      +          case "visible":
      +            return `filter(visible=${body === "true" ? "True" : "False"})`;
      +          case "role":
      +            const attrs = [];
      +            if (isRegExp2(options.name))
      +              attrs.push(`name=${this.regexToString(options.name)}`);
      +            else if (typeof options.name === "string")
      +              attrs.push(`name=${this.quote(options.name)}`);
      +            if (isRegExp2(options.description))
      +              attrs.push(`description=${this.regexToString(options.description)}`);
      +            else if (typeof options.description === "string")
      +              attrs.push(`description=${this.quote(options.description)}`);
      +            if (options.exact && (typeof options.name === "string" || typeof options.description === "string"))
      +              attrs.push(`exact=True`);
      +            for (const { name, value: value2 } of options.attrs) {
      +              let valueString = typeof value2 === "string" ? this.quote(value2) : value2;
      +              if (typeof value2 === "boolean")
      +                valueString = value2 ? "True" : "False";
      +              attrs.push(`${toSnakeCase(name)}=${valueString}`);
      +            }
      +            const attrString = attrs.length ? `, ${attrs.join(", ")}` : "";
      +            return `get_by_role(${this.quote(body)}${attrString})`;
      +          case "has-text":
      +            return `filter(has_text=${this.toHasText(body)})`;
      +          case "has-not-text":
      +            return `filter(has_not_text=${this.toHasText(body)})`;
      +          case "has":
      +            return `filter(has=${body})`;
      +          case "hasNot":
      +            return `filter(has_not=${body})`;
      +          case "and":
      +            return `and_(${body})`;
      +          case "or":
      +            return `or_(${body})`;
      +          case "chain":
      +            return `locator(${body})`;
      +          case "test-id":
      +            return `get_by_test_id(${this.toTestIdValue(body)})`;
      +          case "text":
      +            return this.toCallWithExact("get_by_text", body, !!options.exact);
      +          case "alt":
      +            return this.toCallWithExact("get_by_alt_text", body, !!options.exact);
      +          case "placeholder":
      +            return this.toCallWithExact("get_by_placeholder", body, !!options.exact);
      +          case "label":
      +            return this.toCallWithExact("get_by_label", body, !!options.exact);
      +          case "title":
      +            return this.toCallWithExact("get_by_title", body, !!options.exact);
      +          default:
      +            throw new Error("Unknown selector kind " + kind);
      +        }
      +      }
      +      chainLocators(locators) {
      +        return locators.join(".");
      +      }
      +      regexToString(body) {
      +        const suffix = body.flags.includes("i") ? ", re.IGNORECASE" : "";
      +        return `re.compile(r"${normalizeEscapedRegexQuotes(body.source).replace(/\\\//, "/").replace(/"/g, '\\"')}"${suffix})`;
      +      }
      +      toCallWithExact(method, body, exact) {
      +        if (isRegExp2(body))
      +          return `${method}(${this.regexToString(body)})`;
      +        if (exact)
      +          return `${method}(${this.quote(body)}, exact=True)`;
      +        return `${method}(${this.quote(body)})`;
      +      }
      +      toHasText(body) {
      +        if (isRegExp2(body))
      +          return this.regexToString(body);
      +        return `${this.quote(body)}`;
      +      }
      +      toTestIdValue(value2) {
      +        if (isRegExp2(value2))
      +          return this.regexToString(value2);
      +        return this.quote(value2);
      +      }
      +      quote(text2) {
      +        return escapeWithQuotes(text2, '"');
      +      }
      +    };
      +    JavaLocatorFactory = class {
      +      generateLocator(base, kind, body, options = {}) {
      +        let clazz;
      +        switch (base) {
      +          case "page":
      +            clazz = "Page";
      +            break;
      +          case "frame-locator":
      +            clazz = "FrameLocator";
      +            break;
      +          case "locator":
      +            clazz = "Locator";
      +            break;
      +        }
      +        switch (kind) {
      +          case "default":
      +            if (options.hasText !== void 0)
      +              return `locator(${this.quote(body)}, new ${clazz}.LocatorOptions().setHasText(${this.toHasText(options.hasText)}))`;
      +            if (options.hasNotText !== void 0)
      +              return `locator(${this.quote(body)}, new ${clazz}.LocatorOptions().setHasNotText(${this.toHasText(options.hasNotText)}))`;
      +            return `locator(${this.quote(body)})`;
      +          case "frame-locator":
      +            return `frameLocator(${this.quote(body)})`;
      +          case "frame":
      +            return `contentFrame()`;
      +          case "nth":
      +            return `nth(${body})`;
      +          case "first":
      +            return `first()`;
      +          case "last":
      +            return `last()`;
      +          case "visible":
      +            return `filter(new ${clazz}.FilterOptions().setVisible(${body === "true" ? "true" : "false"}))`;
      +          case "role":
      +            const attrs = [];
      +            if (isRegExp2(options.name))
      +              attrs.push(`.setName(${this.regexToString(options.name)})`);
      +            else if (typeof options.name === "string")
      +              attrs.push(`.setName(${this.quote(options.name)})`);
      +            if (isRegExp2(options.description))
      +              attrs.push(`.setDescription(${this.regexToString(options.description)})`);
      +            else if (typeof options.description === "string")
      +              attrs.push(`.setDescription(${this.quote(options.description)})`);
      +            if (options.exact && (typeof options.name === "string" || typeof options.description === "string"))
      +              attrs.push(`.setExact(true)`);
      +            for (const { name, value: value2 } of options.attrs)
      +              attrs.push(`.set${toTitleCase(name)}(${typeof value2 === "string" ? this.quote(value2) : value2})`);
      +            const attrString = attrs.length ? `, new ${clazz}.GetByRoleOptions()${attrs.join("")}` : "";
      +            return `getByRole(AriaRole.${toSnakeCase(body).toUpperCase()}${attrString})`;
      +          case "has-text":
      +            return `filter(new ${clazz}.FilterOptions().setHasText(${this.toHasText(body)}))`;
      +          case "has-not-text":
      +            return `filter(new ${clazz}.FilterOptions().setHasNotText(${this.toHasText(body)}))`;
      +          case "has":
      +            return `filter(new ${clazz}.FilterOptions().setHas(${body}))`;
      +          case "hasNot":
      +            return `filter(new ${clazz}.FilterOptions().setHasNot(${body}))`;
      +          case "and":
      +            return `and(${body})`;
      +          case "or":
      +            return `or(${body})`;
      +          case "chain":
      +            return `locator(${body})`;
      +          case "test-id":
      +            return `getByTestId(${this.toTestIdValue(body)})`;
      +          case "text":
      +            return this.toCallWithExact(clazz, "getByText", body, !!options.exact);
      +          case "alt":
      +            return this.toCallWithExact(clazz, "getByAltText", body, !!options.exact);
      +          case "placeholder":
      +            return this.toCallWithExact(clazz, "getByPlaceholder", body, !!options.exact);
      +          case "label":
      +            return this.toCallWithExact(clazz, "getByLabel", body, !!options.exact);
      +          case "title":
      +            return this.toCallWithExact(clazz, "getByTitle", body, !!options.exact);
      +          default:
      +            throw new Error("Unknown selector kind " + kind);
      +        }
      +      }
      +      chainLocators(locators) {
      +        return locators.join(".");
      +      }
      +      regexToString(body) {
      +        const suffix = body.flags.includes("i") ? ", Pattern.CASE_INSENSITIVE" : "";
      +        return `Pattern.compile(${this.quote(normalizeEscapedRegexQuotes(body.source))}${suffix})`;
      +      }
      +      toCallWithExact(clazz, method, body, exact) {
      +        if (isRegExp2(body))
      +          return `${method}(${this.regexToString(body)})`;
      +        if (exact)
      +          return `${method}(${this.quote(body)}, new ${clazz}.${toTitleCase(method)}Options().setExact(true))`;
      +        return `${method}(${this.quote(body)})`;
      +      }
      +      toHasText(body) {
      +        if (isRegExp2(body))
      +          return this.regexToString(body);
      +        return this.quote(body);
      +      }
      +      toTestIdValue(value2) {
      +        if (isRegExp2(value2))
      +          return this.regexToString(value2);
      +        return this.quote(value2);
      +      }
      +      quote(text2) {
      +        return escapeWithQuotes(text2, '"');
      +      }
      +    };
      +    CSharpLocatorFactory = class {
      +      generateLocator(base, kind, body, options = {}) {
      +        switch (kind) {
      +          case "default":
      +            if (options.hasText !== void 0)
      +              return `Locator(${this.quote(body)}, new() { ${this.toHasText(options.hasText)} })`;
      +            if (options.hasNotText !== void 0)
      +              return `Locator(${this.quote(body)}, new() { ${this.toHasNotText(options.hasNotText)} })`;
      +            return `Locator(${this.quote(body)})`;
      +          case "frame-locator":
      +            return `FrameLocator(${this.quote(body)})`;
      +          case "frame":
      +            return `ContentFrame`;
      +          case "nth":
      +            return `Nth(${body})`;
      +          case "first":
      +            return `First`;
      +          case "last":
      +            return `Last`;
      +          case "visible":
      +            return `Filter(new() { Visible = ${body === "true" ? "true" : "false"} })`;
      +          case "role":
      +            const attrs = [];
      +            if (isRegExp2(options.name))
      +              attrs.push(`NameRegex = ${this.regexToString(options.name)}`);
      +            else if (typeof options.name === "string")
      +              attrs.push(`Name = ${this.quote(options.name)}`);
      +            if (isRegExp2(options.description))
      +              attrs.push(`DescriptionRegex = ${this.regexToString(options.description)}`);
      +            else if (typeof options.description === "string")
      +              attrs.push(`Description = ${this.quote(options.description)}`);
      +            if (options.exact && (typeof options.name === "string" || typeof options.description === "string"))
      +              attrs.push(`Exact = true`);
      +            for (const { name, value: value2 } of options.attrs)
      +              attrs.push(`${toTitleCase(name)} = ${typeof value2 === "string" ? this.quote(value2) : value2}`);
      +            const attrString = attrs.length ? `, new() { ${attrs.join(", ")} }` : "";
      +            return `GetByRole(AriaRole.${toTitleCase(body)}${attrString})`;
      +          case "has-text":
      +            return `Filter(new() { ${this.toHasText(body)} })`;
      +          case "has-not-text":
      +            return `Filter(new() { ${this.toHasNotText(body)} })`;
      +          case "has":
      +            return `Filter(new() { Has = ${body} })`;
      +          case "hasNot":
      +            return `Filter(new() { HasNot = ${body} })`;
      +          case "and":
      +            return `And(${body})`;
      +          case "or":
      +            return `Or(${body})`;
      +          case "chain":
      +            return `Locator(${body})`;
      +          case "test-id":
      +            return `GetByTestId(${this.toTestIdValue(body)})`;
      +          case "text":
      +            return this.toCallWithExact("GetByText", body, !!options.exact);
      +          case "alt":
      +            return this.toCallWithExact("GetByAltText", body, !!options.exact);
      +          case "placeholder":
      +            return this.toCallWithExact("GetByPlaceholder", body, !!options.exact);
      +          case "label":
      +            return this.toCallWithExact("GetByLabel", body, !!options.exact);
      +          case "title":
      +            return this.toCallWithExact("GetByTitle", body, !!options.exact);
      +          default:
      +            throw new Error("Unknown selector kind " + kind);
      +        }
      +      }
      +      chainLocators(locators) {
      +        return locators.join(".");
      +      }
      +      regexToString(body) {
      +        const suffix = body.flags.includes("i") ? ", RegexOptions.IgnoreCase" : "";
      +        return `new Regex(${this.quote(normalizeEscapedRegexQuotes(body.source))}${suffix})`;
      +      }
      +      toCallWithExact(method, body, exact) {
      +        if (isRegExp2(body))
      +          return `${method}(${this.regexToString(body)})`;
      +        if (exact)
      +          return `${method}(${this.quote(body)}, new() { Exact = true })`;
      +        return `${method}(${this.quote(body)})`;
      +      }
      +      toHasText(body) {
      +        if (isRegExp2(body))
      +          return `HasTextRegex = ${this.regexToString(body)}`;
      +        return `HasText = ${this.quote(body)}`;
      +      }
      +      toTestIdValue(value2) {
      +        if (isRegExp2(value2))
      +          return this.regexToString(value2);
      +        return this.quote(value2);
      +      }
      +      toHasNotText(body) {
      +        if (isRegExp2(body))
      +          return `HasNotTextRegex = ${this.regexToString(body)}`;
      +        return `HasNotText = ${this.quote(body)}`;
      +      }
      +      quote(text2) {
      +        return escapeWithQuotes(text2, '"');
      +      }
      +    };
      +    JsonlLocatorFactory = class {
      +      generateLocator(base, kind, body, options = {}) {
      +        return JSON.stringify({
      +          kind,
      +          body,
      +          options
      +        });
      +      }
      +      chainLocators(locators) {
      +        const objects = locators.map((l) => JSON.parse(l));
      +        for (let i = 0; i < objects.length - 1; ++i)
      +          objects[i].next = objects[i + 1];
      +        return JSON.stringify(objects[0]);
      +      }
      +    };
      +    generators = {
      +      javascript: JavaScriptLocatorFactory,
      +      python: PythonLocatorFactory,
      +      java: JavaLocatorFactory,
      +      csharp: CSharpLocatorFactory,
      +      jsonl: JsonlLocatorFactory
      +    };
      +  }
      +});
      +
      +// packages/isomorphic/stackTrace.ts
      +function captureRawStack() {
      +  const stackTraceLimit = Error.stackTraceLimit;
      +  Error.stackTraceLimit = 50;
      +  const error = new Error();
      +  const stack = error.stack || "";
      +  Error.stackTraceLimit = stackTraceLimit;
      +  return stack.split("\n");
      +}
      +function parseStackFrame(text2, pathSeparator, showInternalStackFrames) {
      +  const match = text2 && text2.match(re);
      +  if (!match)
      +    return null;
      +  let fname = match[2];
      +  let file = match[7];
      +  if (!file)
      +    return null;
      +  if (!showInternalStackFrames && (file.startsWith("internal") || file.startsWith("node:")))
      +    return null;
      +  const line = match[8];
      +  const column = match[9];
      +  const closeParen = match[11] === ")";
      +  const frame = {
      +    file: "",
      +    line: 0,
      +    column: 0
      +  };
      +  if (line)
      +    frame.line = Number(line);
      +  if (column)
      +    frame.column = Number(column);
      +  if (closeParen && file) {
      +    let closes = 0;
      +    for (let i = file.length - 1; i > 0; i--) {
      +      if (file.charAt(i) === ")") {
      +        closes++;
      +      } else if (file.charAt(i) === "(" && file.charAt(i - 1) === " ") {
      +        closes--;
      +        if (closes === -1 && file.charAt(i - 1) === " ") {
      +          const before = file.slice(0, i - 1);
      +          const after = file.slice(i + 1);
      +          file = after;
      +          fname += ` (${before}`;
      +          break;
      +        }
      +      }
      +    }
      +  }
      +  if (fname) {
      +    const methodMatch = fname.match(methodRe);
      +    if (methodMatch)
      +      fname = methodMatch[1];
      +  }
      +  if (file) {
      +    if (file.startsWith("file://"))
      +      file = fileURLToPath(file, pathSeparator);
      +    frame.file = file;
      +  }
      +  if (fname)
      +    frame.function = fname;
      +  return frame;
      +}
      +function rewriteErrorMessage(e, newMessage) {
      +  const lines = (e.stack?.split("\n") || []).filter((l) => l.startsWith("    at "));
      +  e.message = newMessage;
      +  const errorTitle = `${e.name}: ${e.message}`;
      +  if (lines.length)
      +    e.stack = `${errorTitle}
      +${lines.join("\n")}`;
      +  return e;
      +}
      +function stringifyStackFrames(frames) {
      +  const stackLines = [];
      +  for (const frame of frames) {
      +    if (frame.function)
      +      stackLines.push(`    at ${frame.function} (${frame.file}:${frame.line}:${frame.column})`);
      +    else
      +      stackLines.push(`    at ${frame.file}:${frame.line}:${frame.column}`);
      +  }
      +  return stackLines;
      +}
      +function splitErrorMessage(message) {
      +  const separationIdx = message.indexOf(":");
      +  return {
      +    name: separationIdx !== -1 ? message.slice(0, separationIdx) : "",
      +    message: separationIdx !== -1 && separationIdx + 2 <= message.length ? message.substring(separationIdx + 2) : message
      +  };
      +}
      +function parseErrorStack(stack, pathSeparator, showInternalStackFrames = false) {
      +  const lines = stack.split("\n");
      +  let firstStackLine = lines.findIndex((line) => line.startsWith("    at "));
      +  if (firstStackLine === -1)
      +    firstStackLine = lines.length;
      +  const message = lines.slice(0, firstStackLine).join("\n");
      +  const stackLines = lines.slice(firstStackLine);
      +  let location2;
      +  for (const line of stackLines) {
      +    const frame = parseStackFrame(line, pathSeparator, showInternalStackFrames);
      +    if (!frame || !frame.file)
      +      continue;
      +    if (belongsToNodeModules(frame.file, pathSeparator))
      +      continue;
      +    location2 = { file: frame.file, column: frame.column || 0, line: frame.line || 0 };
      +    break;
      +  }
      +  return { message, stackLines, location: location2 };
      +}
      +function belongsToNodeModules(file, pathSeparator) {
      +  return file.includes(`${pathSeparator}node_modules${pathSeparator}`);
      +}
      +function fileURLToPath(fileUrl, pathSeparator) {
      +  if (!fileUrl.startsWith("file://"))
      +    return fileUrl;
      +  let path59 = decodeURIComponent(fileUrl.slice(7));
      +  if (path59.startsWith("/") && /^[a-zA-Z]:/.test(path59.slice(1)))
      +    path59 = path59.slice(1);
      +  return path59.replace(/\//g, pathSeparator);
      +}
      +var re, methodRe;
      +var init_stackTrace = __esm({
      +  "packages/isomorphic/stackTrace.ts"() {
      +    "use strict";
      +    re = new RegExp(
      +      "^(?:\\s*at )?(?:(new) )?(?:(.*?) \\()?(?:eval at ([^ ]+) \\((.+?):(\\d+):(\\d+)\\), )?(?:(.+?):(\\d+):(\\d+)|(native))(\\)?)$"
      +    );
      +    methodRe = /^(.*?) \[as (.*?)\]$/;
      +  }
      +});
      +
      +// packages/isomorphic/manualPromise.ts
      +function signalToPromise(signal) {
      +  if (signal.aborted)
      +    return { promise: Promise.resolve(), dispose: () => {
      +    } };
      +  let dispose;
      +  const promise = new Promise((resolve) => {
      +    const onAbort = () => resolve();
      +    signal.addEventListener("abort", onAbort, { once: true });
      +    dispose = () => signal.removeEventListener("abort", onAbort);
      +  });
      +  return { promise, dispose };
      +}
      +function cloneError(error, frames) {
      +  const clone = new Error();
      +  clone.name = error.name;
      +  clone.message = error.message;
      +  clone.stack = [error.name + ":" + error.message, ...frames].join("\n");
      +  return clone;
      +}
      +var ManualPromise, LongStandingScope;
      +var init_manualPromise = __esm({
      +  "packages/isomorphic/manualPromise.ts"() {
      +    "use strict";
      +    init_stackTrace();
      +    ManualPromise = class extends Promise {
      +      constructor() {
      +        let resolve;
      +        let reject;
      +        super((f, r) => {
      +          resolve = f;
      +          reject = r;
      +        });
      +        this._isDone = false;
      +        this._resolve = resolve;
      +        this._reject = reject;
      +      }
      +      isDone() {
      +        return this._isDone;
      +      }
      +      resolve(t) {
      +        this._isDone = true;
      +        this._resolve(t);
      +      }
      +      reject(e) {
      +        this._isDone = true;
      +        this._reject(e);
      +      }
      +      static get [Symbol.species]() {
      +        return Promise;
      +      }
      +      get [Symbol.toStringTag]() {
      +        return "ManualPromise";
      +      }
      +    };
      +    LongStandingScope = class {
      +      constructor() {
      +        this._terminatePromises = /* @__PURE__ */ new Map();
      +        this._isClosed = false;
      +      }
      +      reject(error) {
      +        this._isClosed = true;
      +        this._terminateError = error;
      +        for (const p of this._terminatePromises.keys())
      +          p.resolve(error);
      +      }
      +      close(error) {
      +        this._isClosed = true;
      +        this._closeError = error;
      +        for (const [p, frames] of this._terminatePromises)
      +          p.resolve(cloneError(error, frames));
      +      }
      +      isClosed() {
      +        return this._isClosed;
      +      }
      +      static async raceMultiple(scopes, promise) {
      +        return Promise.race(scopes.map((s) => s.race(promise)));
      +      }
      +      async race(promise) {
      +        return this._race(Array.isArray(promise) ? promise : [promise], false);
      +      }
      +      async safeRace(promise, defaultValue) {
      +        return this._race([promise], true, defaultValue);
      +      }
      +      async _race(promises, safe, defaultValue) {
      +        const terminatePromise = new ManualPromise();
      +        const frames = captureRawStack();
      +        if (this._terminateError)
      +          terminatePromise.resolve(this._terminateError);
      +        if (this._closeError)
      +          terminatePromise.resolve(cloneError(this._closeError, frames));
      +        this._terminatePromises.set(terminatePromise, frames);
      +        try {
      +          return await Promise.race([
      +            terminatePromise.then((e) => safe ? defaultValue : Promise.reject(e)),
      +            ...promises
      +          ]);
      +        } finally {
      +          this._terminatePromises.delete(terminatePromise);
      +        }
      +      }
      +    };
      +  }
      +});
      +
      +// packages/isomorphic/mimeType.ts
      +function isJsonMimeType(mimeType) {
      +  return !!mimeType.match(/^(application\/json|application\/.*?\+json|text\/(x-)?json)(;\s*charset=.*)?$/);
      +}
      +function isXmlMimeType(mimeType) {
      +  return !!mimeType.match(/^(application\/xml|application\/.*?\+xml|text\/xml)(;\s*charset=.*)?$/);
      +}
      +function isTextualMimeType(mimeType) {
      +  return !!mimeType.match(/^(text\/.*?|application\/(json|(x-)?javascript|xml.*?|ecmascript|graphql|x-www-form-urlencoded)|image\/svg(\+xml)?|application\/.*?(\+json|\+xml))(;\s*charset=.*)?$/);
      +}
      +function getMimeTypeForPath(path59) {
      +  const dotIndex = path59.lastIndexOf(".");
      +  if (dotIndex === -1)
      +    return null;
      +  const extension = path59.substring(dotIndex + 1);
      +  return types.get(extension) || null;
      +}
      +function getExtensionForMimeType(contentType) {
      +  const subtype = (contentType ?? "").split(";")[0].split("/")[1]?.trim().toLowerCase() ?? "";
      +  if (!subtype)
      +    return "bin";
      +  const tail = subtype.includes("+") ? subtype.split("+").pop() : subtype;
      +  if (tail === "plain")
      +    return "txt";
      +  if (tail === "javascript" || tail === "ecmascript")
      +    return "js";
      +  if (tail === "jpeg")
      +    return "jpg";
      +  return tail.replace(/[^a-z0-9]/g, "") || "bin";
      +}
      +var types;
      +var init_mimeType = __esm({
      +  "packages/isomorphic/mimeType.ts"() {
      +    "use strict";
      +    types = /* @__PURE__ */ new Map([
      +      ["ez", "application/andrew-inset"],
      +      ["aw", "application/applixware"],
      +      ["atom", "application/atom+xml"],
      +      ["atomcat", "application/atomcat+xml"],
      +      ["atomdeleted", "application/atomdeleted+xml"],
      +      ["atomsvc", "application/atomsvc+xml"],
      +      ["dwd", "application/atsc-dwd+xml"],
      +      ["held", "application/atsc-held+xml"],
      +      ["rsat", "application/atsc-rsat+xml"],
      +      ["bdoc", "application/bdoc"],
      +      ["xcs", "application/calendar+xml"],
      +      ["ccxml", "application/ccxml+xml"],
      +      ["cdfx", "application/cdfx+xml"],
      +      ["cdmia", "application/cdmi-capability"],
      +      ["cdmic", "application/cdmi-container"],
      +      ["cdmid", "application/cdmi-domain"],
      +      ["cdmio", "application/cdmi-object"],
      +      ["cdmiq", "application/cdmi-queue"],
      +      ["cu", "application/cu-seeme"],
      +      ["mpd", "application/dash+xml"],
      +      ["davmount", "application/davmount+xml"],
      +      ["dbk", "application/docbook+xml"],
      +      ["dssc", "application/dssc+der"],
      +      ["xdssc", "application/dssc+xml"],
      +      ["ecma", "application/ecmascript"],
      +      ["es", "application/ecmascript"],
      +      ["emma", "application/emma+xml"],
      +      ["emotionml", "application/emotionml+xml"],
      +      ["epub", "application/epub+zip"],
      +      ["exi", "application/exi"],
      +      ["exp", "application/express"],
      +      ["fdt", "application/fdt+xml"],
      +      ["pfr", "application/font-tdpfr"],
      +      ["geojson", "application/geo+json"],
      +      ["gml", "application/gml+xml"],
      +      ["gpx", "application/gpx+xml"],
      +      ["gxf", "application/gxf"],
      +      ["gz", "application/gzip"],
      +      ["hjson", "application/hjson"],
      +      ["stk", "application/hyperstudio"],
      +      ["ink", "application/inkml+xml"],
      +      ["inkml", "application/inkml+xml"],
      +      ["ipfix", "application/ipfix"],
      +      ["its", "application/its+xml"],
      +      ["ear", "application/java-archive"],
      +      ["jar", "application/java-archive"],
      +      ["war", "application/java-archive"],
      +      ["ser", "application/java-serialized-object"],
      +      ["class", "application/java-vm"],
      +      ["js", "application/javascript"],
      +      ["mjs", "application/javascript"],
      +      ["json", "application/json"],
      +      ["map", "application/json"],
      +      ["json5", "application/json5"],
      +      ["jsonml", "application/jsonml+json"],
      +      ["jsonld", "application/ld+json"],
      +      ["lgr", "application/lgr+xml"],
      +      ["lostxml", "application/lost+xml"],
      +      ["hqx", "application/mac-binhex40"],
      +      ["cpt", "application/mac-compactpro"],
      +      ["mads", "application/mads+xml"],
      +      ["webmanifest", "application/manifest+json"],
      +      ["mrc", "application/marc"],
      +      ["mrcx", "application/marcxml+xml"],
      +      ["ma", "application/mathematica"],
      +      ["mb", "application/mathematica"],
      +      ["nb", "application/mathematica"],
      +      ["mathml", "application/mathml+xml"],
      +      ["mbox", "application/mbox"],
      +      ["mscml", "application/mediaservercontrol+xml"],
      +      ["metalink", "application/metalink+xml"],
      +      ["meta4", "application/metalink4+xml"],
      +      ["mets", "application/mets+xml"],
      +      ["maei", "application/mmt-aei+xml"],
      +      ["musd", "application/mmt-usd+xml"],
      +      ["mods", "application/mods+xml"],
      +      ["m21", "application/mp21"],
      +      ["mp21", "application/mp21"],
      +      ["m4p", "application/mp4"],
      +      ["mp4s", "application/mp4"],
      +      ["doc", "application/msword"],
      +      ["dot", "application/msword"],
      +      ["mxf", "application/mxf"],
      +      ["nq", "application/n-quads"],
      +      ["nt", "application/n-triples"],
      +      ["cjs", "application/node"],
      +      ["bin", "application/octet-stream"],
      +      ["bpk", "application/octet-stream"],
      +      ["buffer", "application/octet-stream"],
      +      ["deb", "application/octet-stream"],
      +      ["deploy", "application/octet-stream"],
      +      ["dist", "application/octet-stream"],
      +      ["distz", "application/octet-stream"],
      +      ["dll", "application/octet-stream"],
      +      ["dmg", "application/octet-stream"],
      +      ["dms", "application/octet-stream"],
      +      ["dump", "application/octet-stream"],
      +      ["elc", "application/octet-stream"],
      +      ["exe", "application/octet-stream"],
      +      ["img", "application/octet-stream"],
      +      ["iso", "application/octet-stream"],
      +      ["lrf", "application/octet-stream"],
      +      ["mar", "application/octet-stream"],
      +      ["msi", "application/octet-stream"],
      +      ["msm", "application/octet-stream"],
      +      ["msp", "application/octet-stream"],
      +      ["pkg", "application/octet-stream"],
      +      ["so", "application/octet-stream"],
      +      ["oda", "application/oda"],
      +      ["opf", "application/oebps-package+xml"],
      +      ["ogx", "application/ogg"],
      +      ["omdoc", "application/omdoc+xml"],
      +      ["onepkg", "application/onenote"],
      +      ["onetmp", "application/onenote"],
      +      ["onetoc", "application/onenote"],
      +      ["onetoc2", "application/onenote"],
      +      ["oxps", "application/oxps"],
      +      ["relo", "application/p2p-overlay+xml"],
      +      ["xer", "application/patch-ops-error+xml"],
      +      ["pdf", "application/pdf"],
      +      ["pgp", "application/pgp-encrypted"],
      +      ["asc", "application/pgp-signature"],
      +      ["sig", "application/pgp-signature"],
      +      ["prf", "application/pics-rules"],
      +      ["p10", "application/pkcs10"],
      +      ["p7c", "application/pkcs7-mime"],
      +      ["p7m", "application/pkcs7-mime"],
      +      ["p7s", "application/pkcs7-signature"],
      +      ["p8", "application/pkcs8"],
      +      ["ac", "application/pkix-attr-cert"],
      +      ["cer", "application/pkix-cert"],
      +      ["crl", "application/pkix-crl"],
      +      ["pkipath", "application/pkix-pkipath"],
      +      ["pki", "application/pkixcmp"],
      +      ["pls", "application/pls+xml"],
      +      ["ai", "application/postscript"],
      +      ["eps", "application/postscript"],
      +      ["ps", "application/postscript"],
      +      ["provx", "application/provenance+xml"],
      +      ["pskcxml", "application/pskc+xml"],
      +      ["raml", "application/raml+yaml"],
      +      ["owl", "application/rdf+xml"],
      +      ["rdf", "application/rdf+xml"],
      +      ["rif", "application/reginfo+xml"],
      +      ["rnc", "application/relax-ng-compact-syntax"],
      +      ["rl", "application/resource-lists+xml"],
      +      ["rld", "application/resource-lists-diff+xml"],
      +      ["rs", "application/rls-services+xml"],
      +      ["rapd", "application/route-apd+xml"],
      +      ["sls", "application/route-s-tsid+xml"],
      +      ["rusd", "application/route-usd+xml"],
      +      ["gbr", "application/rpki-ghostbusters"],
      +      ["mft", "application/rpki-manifest"],
      +      ["roa", "application/rpki-roa"],
      +      ["rsd", "application/rsd+xml"],
      +      ["rss", "application/rss+xml"],
      +      ["rtf", "application/rtf"],
      +      ["sbml", "application/sbml+xml"],
      +      ["scq", "application/scvp-cv-request"],
      +      ["scs", "application/scvp-cv-response"],
      +      ["spq", "application/scvp-vp-request"],
      +      ["spp", "application/scvp-vp-response"],
      +      ["sdp", "application/sdp"],
      +      ["senmlx", "application/senml+xml"],
      +      ["sensmlx", "application/sensml+xml"],
      +      ["setpay", "application/set-payment-initiation"],
      +      ["setreg", "application/set-registration-initiation"],
      +      ["shf", "application/shf+xml"],
      +      ["sieve", "application/sieve"],
      +      ["siv", "application/sieve"],
      +      ["smi", "application/smil+xml"],
      +      ["smil", "application/smil+xml"],
      +      ["rq", "application/sparql-query"],
      +      ["srx", "application/sparql-results+xml"],
      +      ["gram", "application/srgs"],
      +      ["grxml", "application/srgs+xml"],
      +      ["sru", "application/sru+xml"],
      +      ["ssdl", "application/ssdl+xml"],
      +      ["ssml", "application/ssml+xml"],
      +      ["swidtag", "application/swid+xml"],
      +      ["tei", "application/tei+xml"],
      +      ["teicorpus", "application/tei+xml"],
      +      ["tfi", "application/thraud+xml"],
      +      ["tsd", "application/timestamped-data"],
      +      ["toml", "application/toml"],
      +      ["trig", "application/trig"],
      +      ["ttml", "application/ttml+xml"],
      +      ["ubj", "application/ubjson"],
      +      ["rsheet", "application/urc-ressheet+xml"],
      +      ["td", "application/urc-targetdesc+xml"],
      +      ["vxml", "application/voicexml+xml"],
      +      ["wasm", "application/wasm"],
      +      ["wgt", "application/widget"],
      +      ["hlp", "application/winhlp"],
      +      ["wsdl", "application/wsdl+xml"],
      +      ["wspolicy", "application/wspolicy+xml"],
      +      ["xaml", "application/xaml+xml"],
      +      ["xav", "application/xcap-att+xml"],
      +      ["xca", "application/xcap-caps+xml"],
      +      ["xdf", "application/xcap-diff+xml"],
      +      ["xel", "application/xcap-el+xml"],
      +      ["xns", "application/xcap-ns+xml"],
      +      ["xenc", "application/xenc+xml"],
      +      ["xht", "application/xhtml+xml"],
      +      ["xhtml", "application/xhtml+xml"],
      +      ["xlf", "application/xliff+xml"],
      +      ["rng", "application/xml"],
      +      ["xml", "application/xml"],
      +      ["xsd", "application/xml"],
      +      ["xsl", "application/xml"],
      +      ["dtd", "application/xml-dtd"],
      +      ["xop", "application/xop+xml"],
      +      ["xpl", "application/xproc+xml"],
      +      ["*xsl", "application/xslt+xml"],
      +      ["xslt", "application/xslt+xml"],
      +      ["xspf", "application/xspf+xml"],
      +      ["mxml", "application/xv+xml"],
      +      ["xhvml", "application/xv+xml"],
      +      ["xvm", "application/xv+xml"],
      +      ["xvml", "application/xv+xml"],
      +      ["yang", "application/yang"],
      +      ["yin", "application/yin+xml"],
      +      ["zip", "application/zip"],
      +      ["*3gpp", "audio/3gpp"],
      +      ["adp", "audio/adpcm"],
      +      ["amr", "audio/amr"],
      +      ["au", "audio/basic"],
      +      ["snd", "audio/basic"],
      +      ["kar", "audio/midi"],
      +      ["mid", "audio/midi"],
      +      ["midi", "audio/midi"],
      +      ["rmi", "audio/midi"],
      +      ["mxmf", "audio/mobile-xmf"],
      +      ["*mp3", "audio/mp3"],
      +      ["m4a", "audio/mp4"],
      +      ["mp4a", "audio/mp4"],
      +      ["m2a", "audio/mpeg"],
      +      ["m3a", "audio/mpeg"],
      +      ["mp2", "audio/mpeg"],
      +      ["mp2a", "audio/mpeg"],
      +      ["mp3", "audio/mpeg"],
      +      ["mpga", "audio/mpeg"],
      +      ["oga", "audio/ogg"],
      +      ["ogg", "audio/ogg"],
      +      ["opus", "audio/ogg"],
      +      ["spx", "audio/ogg"],
      +      ["s3m", "audio/s3m"],
      +      ["sil", "audio/silk"],
      +      ["wav", "audio/wav"],
      +      ["*wav", "audio/wave"],
      +      ["weba", "audio/webm"],
      +      ["xm", "audio/xm"],
      +      ["ttc", "font/collection"],
      +      ["otf", "font/otf"],
      +      ["ttf", "font/ttf"],
      +      ["woff", "font/woff"],
      +      ["woff2", "font/woff2"],
      +      ["exr", "image/aces"],
      +      ["apng", "image/apng"],
      +      ["avif", "image/avif"],
      +      ["bmp", "image/bmp"],
      +      ["cgm", "image/cgm"],
      +      ["drle", "image/dicom-rle"],
      +      ["emf", "image/emf"],
      +      ["fits", "image/fits"],
      +      ["g3", "image/g3fax"],
      +      ["gif", "image/gif"],
      +      ["heic", "image/heic"],
      +      ["heics", "image/heic-sequence"],
      +      ["heif", "image/heif"],
      +      ["heifs", "image/heif-sequence"],
      +      ["hej2", "image/hej2k"],
      +      ["hsj2", "image/hsj2"],
      +      ["ief", "image/ief"],
      +      ["jls", "image/jls"],
      +      ["jp2", "image/jp2"],
      +      ["jpg2", "image/jp2"],
      +      ["jpe", "image/jpeg"],
      +      ["jpeg", "image/jpeg"],
      +      ["jpg", "image/jpeg"],
      +      ["jph", "image/jph"],
      +      ["jhc", "image/jphc"],
      +      ["jpm", "image/jpm"],
      +      ["jpf", "image/jpx"],
      +      ["jpx", "image/jpx"],
      +      ["jxr", "image/jxr"],
      +      ["jxra", "image/jxra"],
      +      ["jxrs", "image/jxrs"],
      +      ["jxs", "image/jxs"],
      +      ["jxsc", "image/jxsc"],
      +      ["jxsi", "image/jxsi"],
      +      ["jxss", "image/jxss"],
      +      ["ktx", "image/ktx"],
      +      ["ktx2", "image/ktx2"],
      +      ["png", "image/png"],
      +      ["sgi", "image/sgi"],
      +      ["svg", "image/svg+xml"],
      +      ["svgz", "image/svg+xml"],
      +      ["t38", "image/t38"],
      +      ["tif", "image/tiff"],
      +      ["tiff", "image/tiff"],
      +      ["tfx", "image/tiff-fx"],
      +      ["webp", "image/webp"],
      +      ["wmf", "image/wmf"],
      +      ["disposition-notification", "message/disposition-notification"],
      +      ["u8msg", "message/global"],
      +      ["u8dsn", "message/global-delivery-status"],
      +      ["u8mdn", "message/global-disposition-notification"],
      +      ["u8hdr", "message/global-headers"],
      +      ["eml", "message/rfc822"],
      +      ["mime", "message/rfc822"],
      +      ["3mf", "model/3mf"],
      +      ["gltf", "model/gltf+json"],
      +      ["glb", "model/gltf-binary"],
      +      ["iges", "model/iges"],
      +      ["igs", "model/iges"],
      +      ["mesh", "model/mesh"],
      +      ["msh", "model/mesh"],
      +      ["silo", "model/mesh"],
      +      ["mtl", "model/mtl"],
      +      ["obj", "model/obj"],
      +      ["stpx", "model/step+xml"],
      +      ["stpz", "model/step+zip"],
      +      ["stpxz", "model/step-xml+zip"],
      +      ["stl", "model/stl"],
      +      ["vrml", "model/vrml"],
      +      ["wrl", "model/vrml"],
      +      ["*x3db", "model/x3d+binary"],
      +      ["x3dbz", "model/x3d+binary"],
      +      ["x3db", "model/x3d+fastinfoset"],
      +      ["*x3dv", "model/x3d+vrml"],
      +      ["x3dvz", "model/x3d+vrml"],
      +      ["x3d", "model/x3d+xml"],
      +      ["x3dz", "model/x3d+xml"],
      +      ["x3dv", "model/x3d-vrml"],
      +      ["appcache", "text/cache-manifest"],
      +      ["manifest", "text/cache-manifest"],
      +      ["ics", "text/calendar"],
      +      ["ifb", "text/calendar"],
      +      ["coffee", "text/coffeescript"],
      +      ["litcoffee", "text/coffeescript"],
      +      ["css", "text/css"],
      +      ["csv", "text/csv"],
      +      ["htm", "text/html"],
      +      ["html", "text/html"],
      +      ["shtml", "text/html"],
      +      ["jade", "text/jade"],
      +      ["jsx", "text/jsx"],
      +      ["less", "text/less"],
      +      ["markdown", "text/markdown"],
      +      ["md", "text/markdown"],
      +      ["mml", "text/mathml"],
      +      ["mdx", "text/mdx"],
      +      ["n3", "text/n3"],
      +      ["conf", "text/plain"],
      +      ["def", "text/plain"],
      +      ["in", "text/plain"],
      +      ["ini", "text/plain"],
      +      ["list", "text/plain"],
      +      ["log", "text/plain"],
      +      ["text", "text/plain"],
      +      ["txt", "text/plain"],
      +      ["rtx", "text/richtext"],
      +      ["*rtf", "text/rtf"],
      +      ["sgm", "text/sgml"],
      +      ["sgml", "text/sgml"],
      +      ["shex", "text/shex"],
      +      ["slim", "text/slim"],
      +      ["slm", "text/slim"],
      +      ["spdx", "text/spdx"],
      +      ["styl", "text/stylus"],
      +      ["stylus", "text/stylus"],
      +      ["tsv", "text/tab-separated-values"],
      +      ["man", "text/troff"],
      +      ["me", "text/troff"],
      +      ["ms", "text/troff"],
      +      ["roff", "text/troff"],
      +      ["t", "text/troff"],
      +      ["tr", "text/troff"],
      +      ["ttl", "text/turtle"],
      +      ["uri", "text/uri-list"],
      +      ["uris", "text/uri-list"],
      +      ["urls", "text/uri-list"],
      +      ["vcard", "text/vcard"],
      +      ["vtt", "text/vtt"],
      +      ["*xml", "text/xml"],
      +      ["yaml", "text/yaml"],
      +      ["yml", "text/yaml"],
      +      ["3gp", "video/3gpp"],
      +      ["3gpp", "video/3gpp"],
      +      ["3g2", "video/3gpp2"],
      +      ["h261", "video/h261"],
      +      ["h263", "video/h263"],
      +      ["h264", "video/h264"],
      +      ["m4s", "video/iso.segment"],
      +      ["jpgv", "video/jpeg"],
      +      ["jpm", "video/jpm"],
      +      ["jpgm", "video/jpm"],
      +      ["mj2", "video/mj2"],
      +      ["mjp2", "video/mj2"],
      +      ["ts", "application/typescript"],
      +      ["mp4", "video/mp4"],
      +      ["mp4v", "video/mp4"],
      +      ["mpg4", "video/mp4"],
      +      ["m1v", "video/mpeg"],
      +      ["m2v", "video/mpeg"],
      +      ["mpe", "video/mpeg"],
      +      ["mpeg", "video/mpeg"],
      +      ["mpg", "video/mpeg"],
      +      ["ogv", "video/ogg"],
      +      ["mov", "video/quicktime"],
      +      ["qt", "video/quicktime"],
      +      ["webm", "video/webm"]
      +    ]);
      +  }
      +});
      +
      +// packages/isomorphic/multimap.ts
      +var MultiMap;
      +var init_multimap = __esm({
      +  "packages/isomorphic/multimap.ts"() {
      +    "use strict";
      +    MultiMap = class {
      +      constructor() {
      +        this._map = /* @__PURE__ */ new Map();
      +      }
      +      set(key, value2) {
      +        let values = this._map.get(key);
      +        if (!values) {
      +          values = [];
      +          this._map.set(key, values);
      +        }
      +        values.push(value2);
      +      }
      +      get(key) {
      +        return this._map.get(key) || [];
      +      }
      +      has(key) {
      +        return this._map.has(key);
      +      }
      +      delete(key, value2) {
      +        const values = this._map.get(key);
      +        if (!values)
      +          return;
      +        if (values.includes(value2))
      +          this._map.set(key, values.filter((v) => value2 !== v));
      +      }
      +      deleteAll(key) {
      +        this._map.delete(key);
      +      }
      +      hasValue(key, value2) {
      +        const values = this._map.get(key);
      +        if (!values)
      +          return false;
      +        return values.includes(value2);
      +      }
      +      get size() {
      +        return this._map.size;
      +      }
      +      [Symbol.iterator]() {
      +        return this._map[Symbol.iterator]();
      +      }
      +      keys() {
      +        return this._map.keys();
      +      }
      +      values() {
      +        const result2 = [];
      +        for (const key of this.keys())
      +          result2.push(...this.get(key));
      +        return result2;
      +      }
      +      clear() {
      +        this._map.clear();
      +      }
      +    };
      +  }
      +});
      +
      +// packages/isomorphic/protocolMetainfo.ts
      +function getMetainfo(metadata) {
      +  return methodMetainfo.get(metadata.type + "." + metadata.method);
      +}
      +var methodMetainfo;
      +var init_protocolMetainfo = __esm({
      +  "packages/isomorphic/protocolMetainfo.ts"() {
      +    "use strict";
      +    methodMetainfo = /* @__PURE__ */ new Map([
      +      ["Android.devices", { internal: true }],
      +      ["AndroidSocket.write", { internal: true }],
      +      ["AndroidSocket.close", { internal: true }],
      +      ["AndroidDevice.wait", { title: "Wait" }],
      +      ["AndroidDevice.fill", { title: 'Fill "{text}"' }],
      +      ["AndroidDevice.tap", { title: "Tap" }],
      +      ["AndroidDevice.drag", { title: "Drag" }],
      +      ["AndroidDevice.fling", { title: "Fling" }],
      +      ["AndroidDevice.longTap", { title: "Long tap" }],
      +      ["AndroidDevice.pinchClose", { title: "Pinch close" }],
      +      ["AndroidDevice.pinchOpen", { title: "Pinch open" }],
      +      ["AndroidDevice.scroll", { title: "Scroll" }],
      +      ["AndroidDevice.swipe", { title: "Swipe" }],
      +      ["AndroidDevice.info", { internal: true }],
      +      ["AndroidDevice.screenshot", { title: "Screenshot" }],
      +      ["AndroidDevice.inputType", { title: "Type" }],
      +      ["AndroidDevice.inputPress", { title: "Press" }],
      +      ["AndroidDevice.inputTap", { title: "Tap" }],
      +      ["AndroidDevice.inputSwipe", { title: "Swipe" }],
      +      ["AndroidDevice.inputDrag", { title: "Drag" }],
      +      ["AndroidDevice.launchBrowser", { title: "Launch browser" }],
      +      ["AndroidDevice.open", { title: "Open app" }],
      +      ["AndroidDevice.shell", { title: "Execute shell command", group: "configuration" }],
      +      ["AndroidDevice.installApk", { title: "Install apk" }],
      +      ["AndroidDevice.push", { title: "Push" }],
      +      ["AndroidDevice.connectToWebView", { title: "Connect to Web View" }],
      +      ["AndroidDevice.close", { internal: true }],
      +      ["APIRequestContext.fetch", { title: '{method} "{url}"' }],
      +      ["APIRequestContext.fetchResponseBody", { title: "Get response body", group: "getter" }],
      +      ["APIRequestContext.fetchLog", { internal: true }],
      +      ["APIRequestContext.storageState", { title: "Get storage state", group: "configuration" }],
      +      ["APIRequestContext.disposeAPIResponse", { internal: true }],
      +      ["APIRequestContext.dispose", { internal: true, potentiallyClosesScope: true }],
      +      ["Artifact.pathAfterFinished", { internal: true }],
      +      ["Artifact.saveAs", { internal: true }],
      +      ["Artifact.saveAsStream", { internal: true }],
      +      ["Artifact.failure", { internal: true }],
      +      ["Artifact.stream", { internal: true }],
      +      ["Artifact.cancel", { internal: true }],
      +      ["Artifact.delete", { internal: true, potentiallyClosesScope: true }],
      +      ["Stream.read", { internal: true }],
      +      ["Stream.close", { internal: true }],
      +      ["WritableStream.write", { internal: true }],
      +      ["WritableStream.close", { internal: true }],
      +      ["Browser.startServer", { title: "Start server" }],
      +      ["Browser.stopServer", { title: "Stop server" }],
      +      ["Browser.close", { title: "Close browser", pause: true, potentiallyClosesScope: true }],
      +      ["Browser.killForTests", { internal: true, potentiallyClosesScope: true }],
      +      ["Browser.defaultUserAgentForTest", { internal: true }],
      +      ["Browser.newContext", { title: "Create context" }],
      +      ["Browser.newContextForReuse", { internal: true }],
      +      ["Browser.disconnectFromReusedContext", { internal: true }],
      +      ["Browser.newBrowserCDPSession", { title: "Create CDP session", group: "configuration" }],
      +      ["Browser.startTracing", { title: "Start browser tracing", group: "configuration" }],
      +      ["Browser.stopTracing", { title: "Stop browser tracing", group: "configuration" }],
      +      ["BrowserContext.addCookies", { title: "Add cookies", group: "configuration" }],
      +      ["BrowserContext.addInitScript", { title: "Add init script", group: "configuration" }],
      +      ["BrowserContext.clearCookies", { title: "Clear cookies", group: "configuration" }],
      +      ["BrowserContext.clearPermissions", { title: "Clear permissions", group: "configuration" }],
      +      ["BrowserContext.close", { title: "Close context", pause: true, potentiallyClosesScope: true }],
      +      ["BrowserContext.cookies", { title: "Get cookies", group: "getter" }],
      +      ["BrowserContext.exposeBinding", { title: "Expose binding", group: "configuration" }],
      +      ["BrowserContext.grantPermissions", { title: "Grant permissions", group: "configuration" }],
      +      ["BrowserContext.newPage", { title: "Create page" }],
      +      ["BrowserContext.registerSelectorEngine", { internal: true }],
      +      ["BrowserContext.setTestIdAttributeName", { internal: true }],
      +      ["BrowserContext.setExtraHTTPHeaders", { title: "Set extra HTTP headers", group: "configuration" }],
      +      ["BrowserContext.setGeolocation", { title: "Set geolocation", group: "configuration" }],
      +      ["BrowserContext.setHTTPCredentials", { title: "Set HTTP credentials", group: "configuration" }],
      +      ["BrowserContext.setNetworkInterceptionPatterns", { title: "Route requests", group: "route" }],
      +      ["BrowserContext.setWebSocketInterceptionPatterns", { title: "Route WebSockets", group: "route" }],
      +      ["BrowserContext.setOffline", { title: "Set offline mode" }],
      +      ["BrowserContext.storageState", { title: "Get storage state", group: "configuration" }],
      +      ["BrowserContext.setStorageState", { title: "Set storage state", group: "configuration" }],
      +      ["BrowserContext.pause", { title: "Pause" }],
      +      ["BrowserContext.enableRecorder", { internal: true }],
      +      ["BrowserContext.disableRecorder", { internal: true }],
      +      ["BrowserContext.exposeConsoleApi", { internal: true }],
      +      ["BrowserContext.newCDPSession", { title: "Create CDP session", group: "configuration" }],
      +      ["BrowserContext.createTempFiles", { internal: true }],
      +      ["BrowserContext.updateSubscription", { internal: true }],
      +      ["BrowserContext.clockFastForward", { title: 'Fast forward clock "{ticksNumber|ticksString}"' }],
      +      ["BrowserContext.clockInstall", { title: 'Install clock "{timeNumber|timeString}"' }],
      +      ["BrowserContext.clockPauseAt", { title: 'Pause clock "{timeNumber|timeString}"' }],
      +      ["BrowserContext.clockResume", { title: "Resume clock" }],
      +      ["BrowserContext.clockRunFor", { title: 'Run clock "{ticksNumber|ticksString}"' }],
      +      ["BrowserContext.clockSetFixedTime", { title: 'Set fixed time "{timeNumber|timeString}"' }],
      +      ["BrowserContext.clockSetSystemTime", { title: 'Set system time "{timeNumber|timeString}"' }],
      +      ["BrowserContext.credentialsInstall", { title: "Install virtual WebAuthn authenticator", group: "configuration" }],
      +      ["BrowserContext.credentialsCreate", { title: 'Create virtual credential for "{rpId}"', group: "configuration" }],
      +      ["BrowserContext.credentialsGet", { title: "Get virtual credentials", group: "configuration" }],
      +      ["BrowserContext.credentialsDelete", { title: "Delete virtual credential", group: "configuration" }],
      +      ["BrowserType.launch", { title: "Launch browser" }],
      +      ["BrowserType.launchPersistentContext", { title: "Launch persistent context" }],
      +      ["BrowserType.connectOverCDP", { title: "Connect over CDP" }],
      +      ["BrowserType.connectToWorker", { title: "Connect to worker" }],
      +      ["Disposable.dispose", { internal: true, potentiallyClosesScope: true }],
      +      ["Electron.launch", { title: "Launch electron" }],
      +      ["ElectronApplication.browserWindow", { internal: true }],
      +      ["ElectronApplication.evaluateExpression", { title: "Evaluate" }],
      +      ["ElectronApplication.evaluateExpressionHandle", { title: "Evaluate" }],
      +      ["ElectronApplication.updateSubscription", { internal: true }],
      +      ["Frame.evalOnSelector", { title: "Evaluate", snapshot: true, pause: true }],
      +      ["Frame.evalOnSelectorAll", { title: "Evaluate", snapshot: true, pause: true }],
      +      ["Frame.addScriptTag", { title: "Add script tag", snapshot: true, pause: true }],
      +      ["Frame.addStyleTag", { title: "Add style tag", snapshot: true, pause: true }],
      +      ["Frame.ariaSnapshot", { title: "Aria snapshot", group: "getter" }],
      +      ["Frame.blur", { title: "Blur", slowMo: true, snapshot: true, pause: true }],
      +      ["Frame.check", { title: "Check", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }],
      +      ["Frame.click", { title: "Click", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true, potentiallyClosesScope: true }],
      +      ["Frame.content", { title: "Get content", snapshot: true, pause: true }],
      +      ["Frame.dragAndDrop", { title: "Drag and drop", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }],
      +      ["Frame.drop", { title: "Drop files or data onto an element", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }],
      +      ["Frame.dblclick", { title: "Double click", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }],
      +      ["Frame.dispatchEvent", { title: 'Dispatch "{type}"', slowMo: true, snapshot: true, pause: true }],
      +      ["Frame.evaluateExpression", { title: "Evaluate", snapshot: true, pause: true }],
      +      ["Frame.evaluateExpressionHandle", { title: "Evaluate", snapshot: true, pause: true }],
      +      ["Frame.fill", { title: 'Fill "{value}"', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }],
      +      ["Frame.focus", { title: "Focus", slowMo: true, snapshot: true, pause: true }],
      +      ["Frame.frameElement", { title: "Get frame element", group: "getter" }],
      +      ["Frame.resolveSelector", { internal: true }],
      +      ["Frame.highlight", { internal: true }],
      +      ["Frame.hideHighlight", { internal: true }],
      +      ["Frame.getAttribute", { title: 'Get attribute "{name}"', snapshot: true, pause: true, group: "getter" }],
      +      ["Frame.goto", { title: 'Navigate to "{url}"', slowMo: true, snapshot: true, pause: true }],
      +      ["Frame.hover", { title: "Hover", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }],
      +      ["Frame.innerHTML", { title: "Get HTML", snapshot: true, pause: true, group: "getter" }],
      +      ["Frame.innerText", { title: "Get inner text", snapshot: true, pause: true, group: "getter" }],
      +      ["Frame.inputValue", { title: "Get input value", snapshot: true, pause: true, group: "getter" }],
      +      ["Frame.isChecked", { title: "Is checked", snapshot: true, pause: true, group: "getter" }],
      +      ["Frame.isDisabled", { title: "Is disabled", snapshot: true, pause: true, group: "getter" }],
      +      ["Frame.isEnabled", { title: "Is enabled", snapshot: true, pause: true, group: "getter" }],
      +      ["Frame.isHidden", { title: "Is hidden", snapshot: true, pause: true, group: "getter" }],
      +      ["Frame.isVisible", { title: "Is visible", snapshot: true, pause: true, group: "getter" }],
      +      ["Frame.isEditable", { title: "Is editable", snapshot: true, pause: true, group: "getter" }],
      +      ["Frame.press", { title: 'Press "{key}"', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }],
      +      ["Frame.querySelector", { title: "Query selector", snapshot: true }],
      +      ["Frame.querySelectorAll", { title: "Query selector all", snapshot: true }],
      +      ["Frame.queryCount", { title: "Query count", snapshot: true, pause: true }],
      +      ["Frame.selectOption", { title: "Select option", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }],
      +      ["Frame.setContent", { title: "Set content", snapshot: true, pause: true }],
      +      ["Frame.setInputFiles", { title: "Set input files", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }],
      +      ["Frame.tap", { title: "Tap", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }],
      +      ["Frame.textContent", { title: "Get text content", snapshot: true, pause: true, group: "getter" }],
      +      ["Frame.title", { title: "Get page title", group: "getter" }],
      +      ["Frame.type", { title: 'Type "{text}"', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }],
      +      ["Frame.uncheck", { title: "Uncheck", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }],
      +      ["Frame.waitForTimeout", { title: "Wait for timeout", snapshot: true }],
      +      ["Frame.waitForFunction", { title: "Wait for function", snapshot: true, pause: true }],
      +      ["Frame.waitForSelector", { title: "Wait for selector", snapshot: true }],
      +      ["Frame.expect", { title: 'Expect "{expression}"', snapshot: true, pause: true }],
      +      ["JSHandle.dispose", { internal: true, potentiallyClosesScope: true }],
      +      ["ElementHandle.dispose", { internal: true, potentiallyClosesScope: true }],
      +      ["JSHandle.evaluateExpression", { title: "Evaluate", snapshot: true, pause: true }],
      +      ["ElementHandle.evaluateExpression", { title: "Evaluate", snapshot: true, pause: true }],
      +      ["JSHandle.evaluateExpressionHandle", { title: "Evaluate", snapshot: true, pause: true }],
      +      ["ElementHandle.evaluateExpressionHandle", { title: "Evaluate", snapshot: true, pause: true }],
      +      ["JSHandle.getPropertyList", { title: "Get property list", group: "getter" }],
      +      ["ElementHandle.getPropertyList", { title: "Get property list", group: "getter" }],
      +      ["JSHandle.getProperty", { title: "Get JS property", group: "getter" }],
      +      ["ElementHandle.getProperty", { title: "Get JS property", group: "getter" }],
      +      ["JSHandle.jsonValue", { title: "Get JSON value", group: "getter" }],
      +      ["ElementHandle.jsonValue", { title: "Get JSON value", group: "getter" }],
      +      ["ElementHandle.evalOnSelector", { title: "Evaluate", snapshot: true, pause: true }],
      +      ["ElementHandle.evalOnSelectorAll", { title: "Evaluate", snapshot: true, pause: true }],
      +      ["ElementHandle.boundingBox", { title: "Get bounding box", snapshot: true, pause: true }],
      +      ["ElementHandle.check", { title: "Check", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }],
      +      ["ElementHandle.click", { title: "Click", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }],
      +      ["ElementHandle.contentFrame", { title: "Get content frame", group: "getter" }],
      +      ["ElementHandle.dblclick", { title: "Double click", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }],
      +      ["ElementHandle.dispatchEvent", { title: "Dispatch event", slowMo: true, snapshot: true, pause: true }],
      +      ["ElementHandle.fill", { title: 'Fill "{value}"', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }],
      +      ["ElementHandle.focus", { title: "Focus", slowMo: true, snapshot: true, pause: true }],
      +      ["ElementHandle.getAttribute", { title: "Get attribute", snapshot: true, pause: true, group: "getter" }],
      +      ["ElementHandle.hover", { title: "Hover", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }],
      +      ["ElementHandle.innerHTML", { title: "Get HTML", snapshot: true, pause: true, group: "getter" }],
      +      ["ElementHandle.innerText", { title: "Get inner text", snapshot: true, pause: true, group: "getter" }],
      +      ["ElementHandle.inputValue", { title: "Get input value", snapshot: true, pause: true, group: "getter" }],
      +      ["ElementHandle.isChecked", { title: "Is checked", snapshot: true, pause: true, group: "getter" }],
      +      ["ElementHandle.isDisabled", { title: "Is disabled", snapshot: true, pause: true, group: "getter" }],
      +      ["ElementHandle.isEditable", { title: "Is editable", snapshot: true, pause: true, group: "getter" }],
      +      ["ElementHandle.isEnabled", { title: "Is enabled", snapshot: true, pause: true, group: "getter" }],
      +      ["ElementHandle.isHidden", { title: "Is hidden", snapshot: true, pause: true, group: "getter" }],
      +      ["ElementHandle.isVisible", { title: "Is visible", snapshot: true, pause: true, group: "getter" }],
      +      ["ElementHandle.ownerFrame", { title: "Get owner frame", group: "getter" }],
      +      ["ElementHandle.press", { title: 'Press "{key}"', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }],
      +      ["ElementHandle.querySelector", { title: "Query selector", snapshot: true }],
      +      ["ElementHandle.querySelectorAll", { title: "Query selector all", snapshot: true }],
      +      ["ElementHandle.screenshot", { title: "Screenshot", snapshot: true, pause: true }],
      +      ["ElementHandle.scrollIntoViewIfNeeded", { title: "Scroll into view", slowMo: true, snapshot: true, pause: true }],
      +      ["ElementHandle.selectOption", { title: "Select option", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }],
      +      ["ElementHandle.selectText", { title: "Select text", slowMo: true, snapshot: true, pause: true }],
      +      ["ElementHandle.setInputFiles", { title: "Set input files", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }],
      +      ["ElementHandle.tap", { title: "Tap", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }],
      +      ["ElementHandle.textContent", { title: "Get text content", snapshot: true, pause: true, group: "getter" }],
      +      ["ElementHandle.type", { title: "Type", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }],
      +      ["ElementHandle.uncheck", { title: "Uncheck", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }],
      +      ["ElementHandle.waitForElementState", { title: "Wait for state", snapshot: true, pause: true }],
      +      ["ElementHandle.waitForSelector", { title: "Wait for selector", snapshot: true }],
      +      ["LocalUtils.zip", { internal: true }],
      +      ["LocalUtils.harOpen", { internal: true }],
      +      ["LocalUtils.harLookup", { internal: true }],
      +      ["LocalUtils.harClose", { internal: true }],
      +      ["LocalUtils.harUnzip", { internal: true }],
      +      ["LocalUtils.connect", { internal: true }],
      +      ["LocalUtils.tracingStarted", { internal: true }],
      +      ["LocalUtils.addStackToTracingNoReply", { internal: true }],
      +      ["LocalUtils.traceDiscarded", { internal: true }],
      +      ["LocalUtils.globToRegex", { internal: true }],
      +      ["Request.response", { internal: true }],
      +      ["Request.rawRequestHeaders", { internal: true }],
      +      ["Route.redirectNavigationRequest", { internal: true }],
      +      ["Route.abort", { title: "Abort request", group: "route" }],
      +      ["Route.continue", { title: "Continue request", group: "route" }],
      +      ["Route.fulfill", { title: "Fulfill request", group: "route" }],
      +      ["WebSocketRoute.connect", { title: "Connect WebSocket to server", group: "route" }],
      +      ["WebSocketRoute.ensureOpened", { internal: true }],
      +      ["WebSocketRoute.sendToPage", { title: "Send WebSocket message", group: "route" }],
      +      ["WebSocketRoute.sendToServer", { title: "Send WebSocket message", group: "route" }],
      +      ["WebSocketRoute.closePage", { internal: true }],
      +      ["WebSocketRoute.closeServer", { internal: true }],
      +      ["Response.body", { title: "Get response body", group: "getter" }],
      +      ["Response.securityDetails", { internal: true }],
      +      ["Response.serverAddr", { internal: true }],
      +      ["Response.rawResponseHeaders", { internal: true }],
      +      ["Response.httpVersion", { internal: true }],
      +      ["Response.sizes", { internal: true }],
      +      ["Page.addInitScript", { title: "Add init script", group: "configuration" }],
      +      ["Page.close", { title: "Close page", pause: true, potentiallyClosesScope: true }],
      +      ["Page.runBeforeUnload", { title: "Run beforeunload", pause: true }],
      +      ["Page.clearConsoleMessages", { title: "Clear console messages" }],
      +      ["Page.consoleMessages", { title: "Get console messages", group: "getter" }],
      +      ["Page.emulateMedia", { title: "Emulate media", snapshot: true, pause: true }],
      +      ["Page.exposeBinding", { title: "Expose binding", group: "configuration" }],
      +      ["Page.goBack", { title: "Go back", slowMo: true, snapshot: true, pause: true }],
      +      ["Page.goForward", { title: "Go forward", slowMo: true, snapshot: true, pause: true }],
      +      ["Page.requestGC", { title: "Request garbage collection", group: "configuration" }],
      +      ["Page.registerLocatorHandler", { title: "Register locator handler" }],
      +      ["Page.resolveLocatorHandlerNoReply", { internal: true }],
      +      ["Page.unregisterLocatorHandler", { title: "Unregister locator handler" }],
      +      ["Page.reload", { title: "Reload", slowMo: true, snapshot: true, pause: true }],
      +      ["Page.expectScreenshot", { title: "Expect screenshot", snapshot: true, pause: true }],
      +      ["Page.screenshot", { title: "Screenshot", snapshot: true, pause: true }],
      +      ["Page.setExtraHTTPHeaders", { title: "Set extra HTTP headers", group: "configuration" }],
      +      ["Page.setNetworkInterceptionPatterns", { title: "Route requests", group: "route" }],
      +      ["Page.setWebSocketInterceptionPatterns", { title: "Route WebSockets", group: "route" }],
      +      ["Page.setViewportSize", { title: "Set viewport size", snapshot: true, pause: true }],
      +      ["Page.keyboardDown", { title: 'Key down "{key}"', slowMo: true, snapshot: true, pause: true, input: true }],
      +      ["Page.keyboardUp", { title: 'Key up "{key}"', slowMo: true, snapshot: true, pause: true, input: true }],
      +      ["Page.keyboardInsertText", { title: 'Insert "{text}"', slowMo: true, snapshot: true, pause: true, input: true }],
      +      ["Page.keyboardType", { title: 'Type "{text}"', slowMo: true, snapshot: true, pause: true, input: true }],
      +      ["Page.keyboardPress", { title: 'Press "{key}"', slowMo: true, snapshot: true, pause: true, input: true }],
      +      ["Page.mouseMove", { title: "Mouse move", slowMo: true, snapshot: true, pause: true, input: true }],
      +      ["Page.mouseDown", { title: "Mouse down", slowMo: true, snapshot: true, pause: true, input: true }],
      +      ["Page.mouseUp", { title: "Mouse up", slowMo: true, snapshot: true, pause: true, input: true }],
      +      ["Page.mouseClick", { title: "Click", slowMo: true, snapshot: true, pause: true, input: true }],
      +      ["Page.mouseWheel", { title: "Mouse wheel", slowMo: true, snapshot: true, pause: true, input: true }],
      +      ["Page.touchscreenTap", { title: "Tap", slowMo: true, snapshot: true, pause: true, input: true }],
      +      ["Page.clearPageErrors", { title: "Clear page errors" }],
      +      ["Page.pageErrors", { title: "Get page errors", group: "getter" }],
      +      ["Page.pdf", { title: "PDF" }],
      +      ["Page.requests", { title: "Get network requests", group: "getter" }],
      +      ["Page.startJSCoverage", { title: "Start JS coverage", group: "configuration" }],
      +      ["Page.stopJSCoverage", { title: "Stop JS coverage", group: "configuration" }],
      +      ["Page.startCSSCoverage", { title: "Start CSS coverage", group: "configuration" }],
      +      ["Page.stopCSSCoverage", { title: "Stop CSS coverage", group: "configuration" }],
      +      ["Page.bringToFront", { title: "Bring to front" }],
      +      ["Page.pickLocator", { title: "Pick locator", group: "configuration" }],
      +      ["Page.cancelPickLocator", { title: "Cancel pick locator", group: "configuration" }],
      +      ["Page.hideHighlight", { title: "Hide all element highlights", group: "configuration" }],
      +      ["Page.screencastShowOverlay", { title: "Show overlay", group: "configuration" }],
      +      ["Page.screencastRemoveOverlay", { title: "Remove overlay", group: "configuration" }],
      +      ["Page.screencastChapter", { title: "Show chapter overlay", group: "configuration" }],
      +      ["Page.screencastSetOverlayVisible", { title: "Set overlay visibility", group: "configuration" }],
      +      ["Page.screencastShowActions", { title: "Show actions", group: "configuration" }],
      +      ["Page.screencastHideActions", { title: "Remove actions", group: "configuration" }],
      +      ["Page.screencastStart", { title: "Start screencast", group: "configuration" }],
      +      ["Page.screencastStop", { title: "Stop screencast", group: "configuration" }],
      +      ["Page.updateSubscription", { internal: true }],
      +      ["Page.setDockTile", { internal: true }],
      +      ["Page.webStorageItems", { title: "Get WebStorage items", group: "getter" }],
      +      ["Page.webStorageGetItem", { title: "Get WebStorage item", group: "getter" }],
      +      ["Page.webStorageSetItem", { title: "Set WebStorage item", group: "configuration" }],
      +      ["Page.webStorageRemoveItem", { title: "Remove WebStorage item", group: "configuration" }],
      +      ["Page.webStorageClear", { title: "Clear WebStorage", group: "configuration" }],
      +      ["Root.initialize", { internal: true }],
      +      ["Playwright.newRequest", { title: "Create request context" }],
      +      ["DebugController.initialize", { internal: true }],
      +      ["DebugController.setReportStateChanged", { internal: true }],
      +      ["DebugController.setRecorderMode", { internal: true }],
      +      ["DebugController.highlight", { internal: true }],
      +      ["DebugController.hideHighlight", { internal: true }],
      +      ["DebugController.resume", { internal: true }],
      +      ["DebugController.kill", { internal: true }],
      +      ["SocksSupport.socksConnected", { internal: true }],
      +      ["SocksSupport.socksFailed", { internal: true }],
      +      ["SocksSupport.socksData", { internal: true }],
      +      ["SocksSupport.socksError", { internal: true }],
      +      ["SocksSupport.socksEnd", { internal: true }],
      +      ["JsonPipe.send", { internal: true }],
      +      ["JsonPipe.close", { internal: true }],
      +      ["CDPSession.send", { title: "Send CDP command", group: "configuration" }],
      +      ["CDPSession.detach", { title: "Detach CDP session", potentiallyClosesScope: true, group: "configuration" }],
      +      ["BindingCall.reject", { internal: true }],
      +      ["BindingCall.resolve", { internal: true }],
      +      ["Debugger.requestPause", { title: "Pause on next call", group: "configuration" }],
      +      ["Debugger.resume", { title: "Resume", group: "configuration" }],
      +      ["Debugger.next", { title: "Step to next call", group: "configuration" }],
      +      ["Debugger.runTo", { title: "Run to location", group: "configuration" }],
      +      ["Dialog.accept", { title: "Accept dialog" }],
      +      ["Dialog.dismiss", { title: "Dismiss dialog" }],
      +      ["Tracing.tracingStart", { title: "Start tracing", group: "configuration" }],
      +      ["Tracing.tracingStartChunk", { title: "Start tracing", group: "configuration" }],
      +      ["Tracing.tracingGroup", { title: 'Trace "{name}"' }],
      +      ["Tracing.tracingGroupEnd", { title: "Group end" }],
      +      ["Tracing.tracingStopChunk", { title: "Stop tracing", group: "configuration" }],
      +      ["Tracing.tracingStop", { title: "Stop tracing", group: "configuration" }],
      +      ["Tracing.harStart", { internal: true }],
      +      ["Tracing.harExport", { internal: true }],
      +      ["Worker.disconnect", { title: "Disconnect from worker", potentiallyClosesScope: true }],
      +      ["Worker.evaluateExpression", { title: "Evaluate" }],
      +      ["Worker.evaluateExpressionHandle", { title: "Evaluate" }],
      +      ["Worker.updateSubscription", { internal: true }]
      +    ]);
      +  }
      +});
      +
      +// packages/isomorphic/protocolFormatter.ts
      +function formatProtocolParam(params2, alternatives) {
      +  return _formatProtocolParam(params2, alternatives)?.replaceAll("\n", "\\n");
      +}
      +function _formatProtocolParam(params2, alternatives) {
      +  if (!params2)
      +    return void 0;
      +  for (const name of alternatives.split("|")) {
      +    if (name === "url") {
      +      try {
      +        const urlObject = new URL(params2[name]);
      +        if (urlObject.protocol === "data:")
      +          return urlObject.protocol;
      +        if (["about:", "chrome:", "edge:"].includes(urlObject.protocol))
      +          return params2[name];
      +        return urlObject.pathname + urlObject.search;
      +      } catch (error) {
      +        if (params2[name] !== void 0)
      +          return params2[name];
      +      }
      +    }
      +    if (name === "timeNumber" && params2[name] !== void 0) {
      +      return new Date(params2[name]).toString();
      +    }
      +    const value2 = deepParam(params2, name);
      +    if (value2 !== void 0)
      +      return value2;
      +  }
      +}
      +function deepParam(params2, name) {
      +  const tokens = name.split(".");
      +  let current = params2;
      +  for (const token of tokens) {
      +    if (typeof current !== "object" || current === null)
      +      return void 0;
      +    current = current[token];
      +  }
      +  if (current === void 0)
      +    return void 0;
      +  return String(current);
      +}
      +function renderTitleForCall(metadata) {
      +  const titleFormat = metadata.title ?? getMetainfo(metadata)?.title ?? metadata.method;
      +  return titleFormat.replace(/\{([^}]+)\}/g, (fullMatch, p1) => {
      +    return formatProtocolParam(metadata.params, p1) ?? fullMatch;
      +  });
      +}
      +function getActionGroup(metadata) {
      +  return getMetainfo(metadata)?.group;
      +}
      +var init_protocolFormatter = __esm({
      +  "packages/isomorphic/protocolFormatter.ts"() {
      +    "use strict";
      +    init_protocolMetainfo();
      +  }
      +});
      +
      +// packages/isomorphic/semaphore.ts
      +var Semaphore;
      +var init_semaphore = __esm({
      +  "packages/isomorphic/semaphore.ts"() {
      +    "use strict";
      +    init_manualPromise();
      +    Semaphore = class {
      +      constructor(max) {
      +        this._acquired = 0;
      +        this._queue = [];
      +        this._max = max;
      +      }
      +      setMax(max) {
      +        this._max = max;
      +      }
      +      acquire() {
      +        const lock2 = new ManualPromise();
      +        this._queue.push(lock2);
      +        this._flush();
      +        return lock2;
      +      }
      +      release() {
      +        --this._acquired;
      +        this._flush();
      +      }
      +      _flush() {
      +        while (this._acquired < this._max && this._queue.length) {
      +          ++this._acquired;
      +          this._queue.shift().resolve();
      +        }
      +      }
      +    };
      +  }
      +});
      +
      +// packages/isomorphic/formatUtils.ts
      +function msToString(ms) {
      +  if (ms < 0 || !isFinite(ms))
      +    return "-";
      +  if (ms === 0)
      +    return "0ms";
      +  if (ms < 1e3)
      +    return ms.toFixed(0) + "ms";
      +  const seconds = ms / 1e3;
      +  if (seconds < 60)
      +    return seconds.toFixed(1) + "s";
      +  const minutes = seconds / 60;
      +  if (minutes < 60)
      +    return minutes.toFixed(1) + "m";
      +  const hours = minutes / 60;
      +  if (hours < 24)
      +    return hours.toFixed(1) + "h";
      +  const days = hours / 24;
      +  return days.toFixed(1) + "d";
      +}
      +function bytesToString(bytes) {
      +  if (bytes < 0 || !isFinite(bytes))
      +    return "-";
      +  if (bytes === 0)
      +    return "0";
      +  if (bytes < 1e3)
      +    return bytes.toFixed(0);
      +  const kb = bytes / 1024;
      +  if (kb < 1e3)
      +    return kb.toFixed(1) + "K";
      +  const mb = kb / 1024;
      +  if (mb < 1e3)
      +    return mb.toFixed(1) + "M";
      +  const gb = mb / 1024;
      +  return gb.toFixed(1) + "G";
      +}
      +var init_formatUtils = __esm({
      +  "packages/isomorphic/formatUtils.ts"() {
      +    "use strict";
      +  }
      +});
      +
      +// packages/isomorphic/time.ts
      +function setTimeOrigin(origin) {
      +  _timeOrigin = origin;
      +  _timeShift = performance.timeOrigin - origin;
      +}
      +function timeOrigin() {
      +  return _timeOrigin;
      +}
      +function monotonicTime() {
      +  return Math.floor((performance.now() + _timeShift) * 1e3) / 1e3;
      +}
      +var _timeOrigin, _timeShift, DEFAULT_PLAYWRIGHT_TIMEOUT, DEFAULT_PLAYWRIGHT_LAUNCH_TIMEOUT;
      +var init_time = __esm({
      +  "packages/isomorphic/time.ts"() {
      +    "use strict";
      +    _timeOrigin = performance.timeOrigin;
      +    _timeShift = 0;
      +    DEFAULT_PLAYWRIGHT_TIMEOUT = 3e4;
      +    DEFAULT_PLAYWRIGHT_LAUNCH_TIMEOUT = 3 * 60 * 1e3;
      +  }
      +});
      +
      +// packages/isomorphic/timeoutRunner.ts
      +async function raceAgainstDeadline(cb, deadline) {
      +  let timer;
      +  return await Promise.race([
      +    cb().then((result2) => {
      +      return { result: result2, timedOut: false };
      +    }),
      +    new Promise((resolve) => {
      +      if (!deadline)
      +        return;
      +      timer = setTimeout(() => resolve({ timedOut: true }), deadline - monotonicTime());
      +    })
      +  ]).finally(() => {
      +    clearTimeout(timer);
      +  });
      +}
      +async function pollAgainstDeadline(callback, deadline, pollIntervals = [100, 250, 500, 1e3]) {
      +  const lastPollInterval = pollIntervals.pop() ?? 1e3;
      +  let lastResult;
      +  const wrappedCallback = () => Promise.resolve().then(callback);
      +  while (true) {
      +    const time = monotonicTime();
      +    if (deadline && time >= deadline)
      +      break;
      +    const received = await raceAgainstDeadline(wrappedCallback, deadline);
      +    if (received.timedOut)
      +      break;
      +    lastResult = received.result.result;
      +    if (!received.result.continuePolling)
      +      return { result: lastResult, timedOut: false };
      +    const interval = pollIntervals.shift() ?? lastPollInterval;
      +    if (deadline && deadline <= monotonicTime() + interval)
      +      break;
      +    await new Promise((x) => setTimeout(x, interval));
      +  }
      +  return { timedOut: true, result: lastResult };
      +}
      +var init_timeoutRunner = __esm({
      +  "packages/isomorphic/timeoutRunner.ts"() {
      +    "use strict";
      +    init_time();
      +  }
      +});
      +
      +// packages/isomorphic/trace/snapshotServer.ts
      +function removeHash(url2) {
      +  try {
      +    const u = new URL(url2);
      +    u.hash = "";
      +    return u.toString();
      +  } catch (e) {
      +    return url2;
      +  }
      +}
      +var SnapshotServer;
      +var init_snapshotServer = __esm({
      +  "packages/isomorphic/trace/snapshotServer.ts"() {
      +    "use strict";
      +    SnapshotServer = class {
      +      constructor(snapshotStorage, resourceLoader) {
      +        this._snapshotIds = /* @__PURE__ */ new Map();
      +        this._snapshotStorage = snapshotStorage;
      +        this._resourceLoader = resourceLoader;
      +      }
      +      serveSnapshot(pageOrFrameId, searchParams, snapshotUrl) {
      +        const snapshot3 = this._snapshot(pageOrFrameId, searchParams);
      +        if (!snapshot3)
      +          return new Response(null, { status: 404 });
      +        const renderedSnapshot = snapshot3.render();
      +        this._snapshotIds.set(snapshotUrl, snapshot3);
      +        return new Response(renderedSnapshot.html, { status: 200, headers: { "Content-Type": "text/html; charset=utf-8" } });
      +      }
      +      async serveClosestScreenshot(pageOrFrameId, searchParams) {
      +        const snapshot3 = this._snapshot(pageOrFrameId, searchParams);
      +        const sha1 = snapshot3?.closestScreenshot();
      +        if (!sha1)
      +          return new Response(null, { status: 404 });
      +        return new Response(await this._resourceLoader(sha1));
      +      }
      +      serveSnapshotInfo(pageOrFrameId, searchParams) {
      +        const snapshot3 = this._snapshot(pageOrFrameId, searchParams);
      +        return this._respondWithJson(snapshot3 ? {
      +          viewport: snapshot3.viewport(),
      +          url: snapshot3.snapshot().frameUrl,
      +          timestamp: snapshot3.snapshot().timestamp,
      +          wallTime: snapshot3.snapshot().wallTime
      +        } : {
      +          error: "No snapshot found"
      +        });
      +      }
      +      _snapshot(pageOrFrameId, params2) {
      +        const name = params2.get("name");
      +        return this._snapshotStorage.snapshotByName(pageOrFrameId, name);
      +      }
      +      _respondWithJson(object) {
      +        return new Response(JSON.stringify(object), {
      +          status: 200,
      +          headers: {
      +            "Cache-Control": "public, max-age=31536000",
      +            "Content-Type": "application/json"
      +          }
      +        });
      +      }
      +      async serveResource(requestUrlAlternatives, method, snapshotUrl) {
      +        let resource;
      +        const snapshot3 = this._snapshotIds.get(snapshotUrl);
      +        for (const requestUrl of requestUrlAlternatives) {
      +          resource = snapshot3?.resourceByUrl(removeHash(requestUrl), method);
      +          if (resource)
      +            break;
      +        }
      +        if (!resource)
      +          return new Response(null, { status: 404 });
      +        const sha1 = resource.response.content._sha1;
      +        const content = sha1 ? await this._resourceLoader(sha1) || new Blob([]) : new Blob([]);
      +        let contentType = resource.response.content.mimeType;
      +        const isTextEncoding = /^text\/|^application\/(javascript|json)/.test(contentType);
      +        if (isTextEncoding && !contentType.includes("charset"))
      +          contentType = `${contentType}; charset=utf-8`;
      +        const headers = new Headers();
      +        if (contentType !== "x-unknown")
      +          headers.set("Content-Type", contentType);
      +        for (const { name, value: value2 } of resource.response.headers)
      +          headers.set(name, value2);
      +        headers.delete("Content-Encoding");
      +        headers.delete("Access-Control-Allow-Origin");
      +        headers.set("Access-Control-Allow-Origin", "*");
      +        headers.delete("Content-Length");
      +        headers.set("Content-Length", String(content.size));
      +        if (this._snapshotStorage.hasResourceOverride(resource.request.url))
      +          headers.set("Cache-Control", "no-store, no-cache, max-age=0");
      +        else
      +          headers.set("Cache-Control", "public, max-age=31536000");
      +        const { status } = resource.response;
      +        const isNullBodyStatus = status === 101 || status === 204 || status === 205 || status === 304;
      +        return new Response(isNullBodyStatus ? null : content, {
      +          headers,
      +          status: resource.response.status,
      +          statusText: resource.response.statusText
      +        });
      +      }
      +    };
      +  }
      +});
      +
      +// packages/isomorphic/urlMatch.ts
      +function isHttpUrl(url2, base) {
      +  try {
      +    return ["http:", "https:"].includes(new URL(url2, base).protocol);
      +  } catch {
      +    return false;
      +  }
      +}
      +function globToRegexPattern(glob) {
      +  const tokens = ["^"];
      +  let inGroup = false;
      +  for (let i = 0; i < glob.length; ++i) {
      +    const c = glob[i];
      +    if (c === "\\" && i + 1 < glob.length) {
      +      const char = glob[++i];
      +      tokens.push(escapedChars.has(char) ? "\\" + char : char);
      +      continue;
      +    }
      +    if (c === "*") {
      +      const charBefore = glob[i - 1];
      +      let starCount = 1;
      +      while (glob[i + 1] === "*") {
      +        starCount++;
      +        i++;
      +      }
      +      if (starCount > 1) {
      +        const charAfter = glob[i + 1];
      +        if (charAfter === "/") {
      +          if (charBefore === "/")
      +            tokens.push("((.+/)|)");
      +          else
      +            tokens.push("(.*/)");
      +          ++i;
      +        } else {
      +          tokens.push("(.*)");
      +        }
      +      } else {
      +        tokens.push("([^/]*)");
      +      }
      +      continue;
      +    }
      +    switch (c) {
      +      case "{":
      +        if (inGroup)
      +          throw new Error(`Invalid glob pattern ${JSON.stringify(glob)}: nested '{' is not supported`);
      +        inGroup = true;
      +        tokens.push("(");
      +        break;
      +      case "}":
      +        if (!inGroup)
      +          throw new Error(`Invalid glob pattern ${JSON.stringify(glob)}: unmatched '}'`);
      +        inGroup = false;
      +        tokens.push(")");
      +        break;
      +      case ",":
      +        if (inGroup) {
      +          tokens.push("|");
      +          break;
      +        }
      +        tokens.push("\\" + c);
      +        break;
      +      default:
      +        tokens.push(escapedChars.has(c) ? "\\" + c : c);
      +    }
      +  }
      +  if (inGroup)
      +    throw new Error(`Invalid glob pattern ${JSON.stringify(glob)}: unmatched '{'`);
      +  tokens.push("$");
      +  return tokens.join("");
      +}
      +function isRegExp3(obj) {
      +  return obj instanceof RegExp || Object.prototype.toString.call(obj) === "[object RegExp]";
      +}
      +function serializeURLPattern(v) {
      +  return {
      +    hash: v.hash,
      +    hostname: v.hostname,
      +    password: v.password,
      +    pathname: v.pathname,
      +    port: v.port,
      +    protocol: v.protocol,
      +    search: v.search,
      +    username: v.username
      +  };
      +}
      +function serializeURLMatch(match) {
      +  if (isString(match))
      +    return { glob: match };
      +  if (isRegExp3(match))
      +    return { regexSource: match.source, regexFlags: match.flags };
      +  if (isURLPattern(match))
      +    return { urlPattern: serializeURLPattern(match) };
      +  return void 0;
      +}
      +function deserializeURLPattern(v) {
      +  if (typeof globalThis.URLPattern !== "function")
      +    return () => true;
      +  return new globalThis.URLPattern({
      +    hash: v.hash,
      +    hostname: v.hostname,
      +    password: v.password,
      +    pathname: v.pathname,
      +    port: v.port,
      +    protocol: v.protocol,
      +    search: v.search,
      +    username: v.username
      +  });
      +}
      +function deserializeURLMatch(match) {
      +  if (match.regexSource)
      +    return new RegExp(match.regexSource, match.regexFlags);
      +  if (match.urlPattern)
      +    return deserializeURLPattern(match.urlPattern);
      +  return match.glob;
      +}
      +function urlMatchesEqual(match1, match2) {
      +  if (isRegExp3(match1) && isRegExp3(match2))
      +    return match1.source === match2.source && match1.flags === match2.flags;
      +  return match1 === match2;
      +}
      +function urlMatches(baseURL, urlString, match, webSocketUrl) {
      +  if (match === void 0 || match === "")
      +    return true;
      +  if (isString(match))
      +    match = new RegExp(resolveGlobToRegexPattern(baseURL, match, webSocketUrl));
      +  if (isRegExp3(match)) {
      +    const r = match.test(urlString);
      +    return r;
      +  }
      +  const url2 = parseURL(urlString);
      +  if (!url2)
      +    return false;
      +  if (isURLPattern(match))
      +    return match.test(url2.href);
      +  if (typeof match !== "function")
      +    throw new Error("url parameter should be string, RegExp, URLPattern or function");
      +  return match(url2);
      +}
      +function resolveGlobToRegexPattern(baseURL, glob, webSocketUrl) {
      +  if (webSocketUrl)
      +    baseURL = toWebSocketBaseUrl(baseURL);
      +  glob = resolveGlobBase(baseURL, glob);
      +  return globToRegexPattern(glob);
      +}
      +function toWebSocketBaseUrl(baseURL) {
      +  if (baseURL && /^https?:\/\//.test(baseURL))
      +    baseURL = baseURL.replace(/^http/, "ws");
      +  return baseURL;
      +}
      +function resolveGlobBase(baseURL, match) {
      +  if (!match.startsWith("*")) {
      +    let mapToken2 = function(original, replacement) {
      +      if (original.length === 0)
      +        return "";
      +      tokenMap.set(replacement, original);
      +      return replacement;
      +    };
      +    var mapToken = mapToken2;
      +    const tokenMap = /* @__PURE__ */ new Map();
      +    match = match.replaceAll(/\\\\\?/g, "?");
      +    if (match.startsWith("about:") || match.startsWith("data:") || match.startsWith("chrome:") || match.startsWith("edge:") || match.startsWith("file:"))
      +      return match;
      +    const relativePath = match.split("/").map((token, index) => {
      +      if (token === "." || token === ".." || token === "")
      +        return token;
      +      if (index === 0 && token.endsWith(":")) {
      +        if (token.indexOf("*") !== -1 || token.indexOf("{") !== -1)
      +          return mapToken2(token, "http:");
      +        return token;
      +      }
      +      const questionIndex = token.indexOf("?");
      +      if (questionIndex === -1)
      +        return mapToken2(token, `$_${index}_$`);
      +      const newPrefix = mapToken2(token.substring(0, questionIndex), `$_${index}_$`);
      +      const newSuffix = mapToken2(token.substring(questionIndex), `?$_${index}_$`);
      +      return newPrefix + newSuffix;
      +    }).join("/");
      +    const result2 = resolveBaseURL(baseURL, relativePath);
      +    let resolved = result2.resolved;
      +    for (const [token, original] of tokenMap) {
      +      const normalize = result2.caseInsensitivePart?.includes(token);
      +      resolved = resolved.replace(token, normalize ? original.toLowerCase() : original);
      +    }
      +    match = resolved;
      +  }
      +  return match;
      +}
      +function parseURL(url2) {
      +  try {
      +    return new URL(url2);
      +  } catch (e) {
      +    return null;
      +  }
      +}
      +function constructURLBasedOnBaseURL(baseURL, givenURL) {
      +  try {
      +    return resolveBaseURL(baseURL, givenURL).resolved;
      +  } catch (e) {
      +    return givenURL;
      +  }
      +}
      +function resolveBaseURL(baseURL, givenURL) {
      +  try {
      +    const url2 = new URL(givenURL, baseURL);
      +    const resolved = url2.toString();
      +    const caseInsensitivePrefix = url2.origin;
      +    return { resolved, caseInsensitivePart: caseInsensitivePrefix };
      +  } catch (e) {
      +    return { resolved: givenURL };
      +  }
      +}
      +var escapedChars, isURLPattern;
      +var init_urlMatch = __esm({
      +  "packages/isomorphic/urlMatch.ts"() {
      +    "use strict";
      +    init_stringUtils();
      +    escapedChars = /* @__PURE__ */ new Set(["$", "^", "+", ".", "*", "(", ")", "|", "\\", "?", "{", "}", "[", "]"]);
      +    isURLPattern = (v) => typeof globalThis.URLPattern === "function" && v instanceof globalThis.URLPattern;
      +  }
      +});
      +
      +// packages/isomorphic/locatorUtils.ts
      +function getByAttributeTextSelector(attrName, text2, options) {
      +  return `internal:attr=[${attrName}=${escapeForAttributeSelector(text2, options?.exact || false)}]`;
      +}
      +function encodeTestIdAttributeName(testIdAttributeName2) {
      +  return testIdAttributeName2.includes(",") ? JSON.stringify(testIdAttributeName2) : testIdAttributeName2;
      +}
      +function getByTestIdSelector(testIdAttributeName2, testId) {
      +  return `internal:testid=[${encodeTestIdAttributeName(testIdAttributeName2)}=${escapeForAttributeSelector(testId, true)}]`;
      +}
      +function getByLabelSelector(text2, options) {
      +  return "internal:label=" + escapeForTextSelector(text2, !!options?.exact);
      +}
      +function getByAltTextSelector(text2, options) {
      +  return getByAttributeTextSelector("alt", text2, options);
      +}
      +function getByTitleSelector(text2, options) {
      +  return getByAttributeTextSelector("title", text2, options);
      +}
      +function getByPlaceholderSelector(text2, options) {
      +  return getByAttributeTextSelector("placeholder", text2, options);
      +}
      +function getByTextSelector(text2, options) {
      +  return "internal:text=" + escapeForTextSelector(text2, !!options?.exact);
      +}
      +function getByRoleSelector(role, options = {}) {
      +  const props = [];
      +  if (options.checked !== void 0)
      +    props.push(["checked", String(options.checked)]);
      +  if (options.disabled !== void 0)
      +    props.push(["disabled", String(options.disabled)]);
      +  if (options.selected !== void 0)
      +    props.push(["selected", String(options.selected)]);
      +  if (options.expanded !== void 0)
      +    props.push(["expanded", String(options.expanded)]);
      +  if (options.includeHidden !== void 0)
      +    props.push(["include-hidden", String(options.includeHidden)]);
      +  if (options.level !== void 0)
      +    props.push(["level", String(options.level)]);
      +  if (options.name !== void 0)
      +    props.push(["name", escapeForAttributeSelector(options.name, !!options.exact)]);
      +  if (options.description !== void 0)
      +    props.push(["description", escapeForAttributeSelector(options.description, !!options.exact)]);
      +  if (options.pressed !== void 0)
      +    props.push(["pressed", String(options.pressed)]);
      +  return `internal:role=${role}${props.map(([n, v]) => `[${n}=${v}]`).join("")}`;
      +}
      +var init_locatorUtils = __esm({
      +  "packages/isomorphic/locatorUtils.ts"() {
      +    "use strict";
      +    init_stringUtils();
      +  }
      +});
      +
      +// packages/isomorphic/locatorParser.ts
      +function parseLocator(locator2, testIdAttributeName2) {
      +  locator2 = locator2.replace(/AriaRole\s*\.\s*([\w]+)/g, (_, group) => group.toLowerCase()).replace(/(get_by_role|getByRole)\s*\(\s*(?:["'`])([^'"`]+)['"`]/g, (_, group1, group2) => `${group1}(${group2.toLowerCase()}`);
      +  const params2 = [];
      +  let template = "";
      +  for (let i = 0; i < locator2.length; ++i) {
      +    const quote5 = locator2[i];
      +    if (quote5 !== '"' && quote5 !== "'" && quote5 !== "`" && quote5 !== "/") {
      +      template += quote5;
      +      continue;
      +    }
      +    const isRegexEscaping = locator2[i - 1] === "r" || locator2[i] === "/";
      +    ++i;
      +    let text2 = "";
      +    while (i < locator2.length) {
      +      if (locator2[i] === "\\") {
      +        if (isRegexEscaping) {
      +          if (locator2[i + 1] !== quote5)
      +            text2 += locator2[i];
      +          ++i;
      +          text2 += locator2[i];
      +        } else {
      +          ++i;
      +          if (locator2[i] === "n")
      +            text2 += "\n";
      +          else if (locator2[i] === "r")
      +            text2 += "\r";
      +          else if (locator2[i] === "t")
      +            text2 += "	";
      +          else
      +            text2 += locator2[i];
      +        }
      +        ++i;
      +        continue;
      +      }
      +      if (locator2[i] !== quote5) {
      +        text2 += locator2[i++];
      +        continue;
      +      }
      +      break;
      +    }
      +    params2.push({ quote: quote5, text: text2 });
      +    template += (quote5 === "/" ? "r" : "") + "$" + params2.length;
      +  }
      +  template = template.toLowerCase().replace(/get_by_alt_text/g, "getbyalttext").replace(/get_by_test_id/g, "getbytestid").replace(/get_by_([\w]+)/g, "getby$1").replace(/has_not_text/g, "hasnottext").replace(/has_text/g, "hastext").replace(/has_not/g, "hasnot").replace(/frame_locator/g, "framelocator").replace(/content_frame/g, "contentframe").replace(/[{}\s]/g, "").replace(/new\(\)/g, "").replace(/new[\w]+\.[\w]+options\(\)/g, "").replace(/\.set/g, ",set").replace(/\.or_\(/g, "or(").replace(/\.and_\(/g, "and(").replace(/:/g, "=").replace(/,re\.ignorecase/g, "i").replace(/,pattern.case_insensitive/g, "i").replace(/,regexoptions.ignorecase/g, "i").replace(/re.compile\(([^)]+)\)/g, "$1").replace(/pattern.compile\(([^)]+)\)/g, "r$1").replace(/newregex\(([^)]+)\)/g, "r$1").replace(/string=/g, "=").replace(/regex=/g, "=").replace(/,,/g, ",").replace(/,\)/g, ")");
      +  const preferredQuote = params2.map((p) => p.quote).filter((quote5) => "'\"`".includes(quote5))[0];
      +  return { selector: transform(template, params2, testIdAttributeName2), preferredQuote };
      +}
      +function countParams(template) {
      +  return [...template.matchAll(/\$\d+/g)].length;
      +}
      +function shiftParams(template, sub) {
      +  return template.replace(/\$(\d+)/g, (_, ordinal) => `$${ordinal - sub}`);
      +}
      +function transform(template, params2, testIdAttributeName2) {
      +  while (true) {
      +    const hasMatch = template.match(/filter\(,?(has=|hasnot=|sethas\(|sethasnot\()/);
      +    if (!hasMatch)
      +      break;
      +    const start3 = hasMatch.index + hasMatch[0].length;
      +    let balance = 0;
      +    let end = start3;
      +    for (; end < template.length; end++) {
      +      if (template[end] === "(")
      +        balance++;
      +      else if (template[end] === ")")
      +        balance--;
      +      if (balance < 0)
      +        break;
      +    }
      +    let prefix = template.substring(0, start3);
      +    let extraSymbol = 0;
      +    if (["sethas(", "sethasnot("].includes(hasMatch[1])) {
      +      extraSymbol = 1;
      +      prefix = prefix.replace(/sethas\($/, "has=").replace(/sethasnot\($/, "hasnot=");
      +    }
      +    const paramsCountBeforeHas = countParams(template.substring(0, start3));
      +    const hasTemplate = shiftParams(template.substring(start3, end), paramsCountBeforeHas);
      +    const paramsCountInHas = countParams(hasTemplate);
      +    const hasParams = params2.slice(paramsCountBeforeHas, paramsCountBeforeHas + paramsCountInHas);
      +    const hasSelector = JSON.stringify(transform(hasTemplate, hasParams, testIdAttributeName2));
      +    template = prefix.replace(/=$/, "2=") + `$${paramsCountBeforeHas + 1}` + shiftParams(template.substring(end + extraSymbol), paramsCountInHas - 1);
      +    const paramsBeforeHas = params2.slice(0, paramsCountBeforeHas);
      +    const paramsAfterHas = params2.slice(paramsCountBeforeHas + paramsCountInHas);
      +    params2 = paramsBeforeHas.concat([{ quote: '"', text: hasSelector }]).concat(paramsAfterHas);
      +  }
      +  template = template.replace(/\,set([\w]+)\(([^)]+)\)/g, (_, group1, group2) => "," + group1.toLowerCase() + "=" + group2.toLowerCase()).replace(/framelocator\(([^)]+)\)/g, "$1.internal:control=enter-frame").replace(/contentframe(\(\))?/g, "internal:control=enter-frame").replace(/locator\(([^)]+),hastext=([^),]+)\)/g, "locator($1).internal:has-text=$2").replace(/locator\(([^)]+),hasnottext=([^),]+)\)/g, "locator($1).internal:has-not-text=$2").replace(/locator\(([^)]+),hastext=([^),]+)\)/g, "locator($1).internal:has-text=$2").replace(/locator\(([^)]+)\)/g, "$1").replace(/getbyrole\(([^)]+)\)/g, "internal:role=$1").replace(/getbytext\(([^)]+)\)/g, "internal:text=$1").replace(/getbylabel\(([^)]+)\)/g, "internal:label=$1").replace(/getbytestid\(([^)]+)\)/g, `internal:testid=[${encodeTestIdAttributeName(testIdAttributeName2)}=$1]`).replace(/getby(placeholder|alt|title)(?:text)?\(([^)]+)\)/g, "internal:attr=[$1=$2]").replace(/first(\(\))?/g, "nth=0").replace(/last(\(\))?/g, "nth=-1").replace(/nth\(([^)]+)\)/g, "nth=$1").replace(/filter\(,?visible=true\)/g, "visible=true").replace(/filter\(,?visible=false\)/g, "visible=false").replace(/filter\(,?hastext=([^)]+)\)/g, "internal:has-text=$1").replace(/filter\(,?hasnottext=([^)]+)\)/g, "internal:has-not-text=$1").replace(/filter\(,?has2=([^)]+)\)/g, "internal:has=$1").replace(/filter\(,?hasnot2=([^)]+)\)/g, "internal:has-not=$1").replace(/,exact=false/g, "").replace(/(,name=\$\d+)(,description=\$\d+),exact=true/g, "$1s$2s").replace(/,exact=true/g, "s").replace(/,includehidden=/g, ",include-hidden=").replace(/\,/g, "][");
      +  const parts = template.split(".");
      +  for (let index = 0; index < parts.length - 1; index++) {
      +    if (parts[index] === "internal:control=enter-frame" && parts[index + 1].startsWith("nth=")) {
      +      const [nth] = parts.splice(index, 1);
      +      parts.splice(index + 1, 0, nth);
      +    }
      +  }
      +  return parts.map((t) => {
      +    if (!t.startsWith("internal:") || t === "internal:control")
      +      return t.replace(/\$(\d+)/g, (_, ordinal) => {
      +        const param = params2[+ordinal - 1];
      +        return param.text;
      +      });
      +    t = t.includes("[") ? t.replace(/\]/, "") + "]" : t;
      +    t = t.replace(/(?:r)\$(\d+)(i)?/g, (_, ordinal, suffix) => {
      +      const param = params2[+ordinal - 1];
      +      if (t.startsWith("internal:attr") || t.startsWith("internal:testid") || t.startsWith("internal:role"))
      +        return escapeForAttributeSelector(new RegExp(param.text), false) + (suffix || "");
      +      return escapeForTextSelector(new RegExp(param.text, suffix), false);
      +    }).replace(/\$(\d+)(i|s)?/g, (_, ordinal, suffix) => {
      +      const param = params2[+ordinal - 1];
      +      if (t.startsWith("internal:has=") || t.startsWith("internal:has-not="))
      +        return param.text;
      +      if (t.startsWith("internal:testid"))
      +        return escapeForAttributeSelector(param.text, true);
      +      if (t.startsWith("internal:attr") || t.startsWith("internal:role"))
      +        return escapeForAttributeSelector(param.text, suffix === "s");
      +      return escapeForTextSelector(param.text, suffix === "s");
      +    });
      +    return t;
      +  }).join(" >> ");
      +}
      +function locatorOrSelectorAsSelector(language, locator2, testIdAttributeName2 = "data-testid") {
      +  try {
      +    return unsafeLocatorOrSelectorAsSelector(language, locator2, testIdAttributeName2);
      +  } catch (e) {
      +    return "";
      +  }
      +}
      +function unsafeLocatorOrSelectorAsSelector(language, locator2, testIdAttributeName2 = "data-testid") {
      +  try {
      +    parseSelector(locator2);
      +    return locator2;
      +  } catch (e) {
      +  }
      +  const { selector, preferredQuote } = parseLocator(locator2, testIdAttributeName2);
      +  const locators = asLocators(language, selector, void 0, void 0, preferredQuote);
      +  const digest = digestForComparison(language, locator2);
      +  if (locators.some((candidate) => digestForComparison(language, candidate) === digest))
      +    return selector;
      +  return "";
      +}
      +function digestForComparison(language, locator2) {
      +  locator2 = locator2.replace(/\s/g, "");
      +  if (language === "javascript")
      +    locator2 = locator2.replace(/\\?["`]/g, "'").replace(/,{}/g, "");
      +  return locator2;
      +}
      +var init_locatorParser = __esm({
      +  "packages/isomorphic/locatorParser.ts"() {
      +    "use strict";
      +    init_locatorGenerators();
      +    init_locatorUtils();
      +    init_selectorParser();
      +    init_stringUtils();
      +  }
      +});
      +
      +// packages/isomorphic/trace/snapshotRenderer.ts
      +function findClosest(items, metric, target) {
      +  return items.find((item, index) => {
      +    if (index === items.length - 1)
      +      return true;
      +    const next = items[index + 1];
      +    return Math.abs(metric(item) - target) < Math.abs(metric(next) - target);
      +  });
      +}
      +function isNodeNameAttributesChildNodesSnapshot(n) {
      +  return Array.isArray(n) && typeof n[0] === "string";
      +}
      +function isSubtreeReferenceSnapshot(n) {
      +  return Array.isArray(n) && Array.isArray(n[0]);
      +}
      +function snapshotNodes(snapshot3) {
      +  if (!snapshot3._nodes) {
      +    const nodes = [];
      +    const visit = (n) => {
      +      if (typeof n === "string") {
      +        nodes.push(n);
      +      } else if (isNodeNameAttributesChildNodesSnapshot(n)) {
      +        const [, , ...children] = n;
      +        for (const child of children)
      +          visit(child);
      +        nodes.push(n);
      +      }
      +    };
      +    visit(snapshot3.html);
      +    snapshot3._nodes = nodes;
      +  }
      +  return snapshot3._nodes;
      +}
      +function snapshotScript(viewport, ...targetIds) {
      +  function applyPlaywrightAttributes(blankSnapshotUrl2, viewport2, ...targetIds2) {
      +    const win = window;
      +    const searchParams = new URLSearchParams(win.location.search);
      +    const shouldPopulateCanvasFromScreenshot = searchParams.has("shouldPopulateCanvasFromScreenshot");
      +    const isUnderTest2 = searchParams.has("isUnderTest");
      +    const frameBoundingRectsInfo = {
      +      viewport: viewport2,
      +      frames: /* @__PURE__ */ new WeakMap()
      +    };
      +    win["__playwright_frame_bounding_rects__"] = frameBoundingRectsInfo;
      +    const kPointerWarningTitle = "Recorded click position in absolute coordinates did not match the center of the clicked element. This is either due to the use of provided offset, or due to a difference between the test runner and the trace viewer operating systems.";
      +    const scrollTops = [];
      +    const scrollLefts = [];
      +    const targetElements = [];
      +    const canvasElements = [];
      +    let topSnapshotWindow = win;
      +    while (topSnapshotWindow !== topSnapshotWindow.parent && !topSnapshotWindow.location.pathname.match(/\/page@[a-z0-9]+$/))
      +      topSnapshotWindow = topSnapshotWindow.parent;
      +    const visit = (root) => {
      +      for (const e of root.querySelectorAll(`[__playwright_scroll_top_]`))
      +        scrollTops.push(e);
      +      for (const e of root.querySelectorAll(`[__playwright_scroll_left_]`))
      +        scrollLefts.push(e);
      +      for (const element2 of root.querySelectorAll(`[__playwright_value_]`)) {
      +        const inputElement = element2;
      +        if (inputElement.type !== "file")
      +          inputElement.value = inputElement.getAttribute("__playwright_value_");
      +        element2.removeAttribute("__playwright_value_");
      +      }
      +      for (const element2 of root.querySelectorAll(`[__playwright_checked_]`)) {
      +        element2.checked = element2.getAttribute("__playwright_checked_") === "true";
      +        element2.removeAttribute("__playwright_checked_");
      +      }
      +      for (const element2 of root.querySelectorAll(`[__playwright_selected_]`)) {
      +        element2.selected = element2.getAttribute("__playwright_selected_") === "true";
      +        element2.removeAttribute("__playwright_selected_");
      +      }
      +      for (const element2 of root.querySelectorAll(`[__playwright_popover_open_]`)) {
      +        try {
      +          element2.showPopover();
      +        } catch {
      +        }
      +        element2.removeAttribute("__playwright_popover_open_");
      +      }
      +      for (const element2 of root.querySelectorAll(`[__playwright_dialog_open_]`)) {
      +        try {
      +          if (element2.getAttribute("__playwright_dialog_open_") === "modal")
      +            element2.showModal();
      +          else
      +            element2.show();
      +        } catch {
      +        }
      +        element2.removeAttribute("__playwright_dialog_open_");
      +      }
      +      const highlightTarget = (target) => {
      +        const style = target.style;
      +        style.outline = "2px solid #006ab1";
      +        style.backgroundColor = "#6fa8dc7f";
      +        targetElements.push(target);
      +      };
      +      for (const target of root.querySelectorAll(`[__playwright_target__=""]`))
      +        highlightTarget(target);
      +      for (const targetId of targetIds2) {
      +        if (!targetId)
      +          continue;
      +        for (const target of root.querySelectorAll(`[__playwright_target__="${targetId}"]`))
      +          highlightTarget(target);
      +      }
      +      for (const iframe of root.querySelectorAll("iframe, frame")) {
      +        const boundingRectJson = iframe.getAttribute("__playwright_bounding_rect__");
      +        iframe.removeAttribute("__playwright_bounding_rect__");
      +        const boundingRect = boundingRectJson ? JSON.parse(boundingRectJson) : void 0;
      +        if (boundingRect)
      +          frameBoundingRectsInfo.frames.set(iframe, { boundingRect, scrollLeft: 0, scrollTop: 0 });
      +        const src = iframe.getAttribute("__playwright_src__");
      +        if (!src) {
      +          iframe.setAttribute("src", blankSnapshotUrl2);
      +        } else {
      +          const url2 = new URL(win.location.href);
      +          const index = url2.pathname.lastIndexOf("/snapshot/");
      +          if (index !== -1)
      +            url2.pathname = url2.pathname.substring(0, index + 1);
      +          url2.pathname += src.substring(1);
      +          iframe.setAttribute("src", url2.toString());
      +        }
      +      }
      +      {
      +        const body = root.querySelector(`body[__playwright_custom_elements__]`);
      +        if (body && win.customElements) {
      +          const customElements = (body.getAttribute("__playwright_custom_elements__") || "").split(",");
      +          for (const elementName of customElements)
      +            win.customElements.define(elementName, class extends HTMLElement {
      +            });
      +        }
      +      }
      +      for (const element2 of root.querySelectorAll(`template[__playwright_shadow_root_]`)) {
      +        const template = element2;
      +        const shadowRoot = template.parentElement.attachShadow({ mode: "open" });
      +        shadowRoot.appendChild(template.content);
      +        template.remove();
      +        visit(shadowRoot);
      +      }
      +      for (const element2 of root.querySelectorAll("a"))
      +        element2.addEventListener("click", (event) => {
      +          event.preventDefault();
      +        });
      +      if ("adoptedStyleSheets" in root) {
      +        const adoptedSheets = [...root.adoptedStyleSheets];
      +        for (const element2 of root.querySelectorAll(`template[__playwright_style_sheet_]`)) {
      +          const template = element2;
      +          const sheet = new CSSStyleSheet();
      +          sheet.replaceSync(template.getAttribute("__playwright_style_sheet_"));
      +          adoptedSheets.push(sheet);
      +        }
      +        root.adoptedStyleSheets = adoptedSheets;
      +      }
      +      canvasElements.push(...root.querySelectorAll("canvas"));
      +    };
      +    const onLoad = () => {
      +      win.removeEventListener("load", onLoad);
      +      for (const element2 of scrollTops) {
      +        element2.scrollTop = +element2.getAttribute("__playwright_scroll_top_");
      +        element2.removeAttribute("__playwright_scroll_top_");
      +        if (frameBoundingRectsInfo.frames.has(element2))
      +          frameBoundingRectsInfo.frames.get(element2).scrollTop = element2.scrollTop;
      +      }
      +      for (const element2 of scrollLefts) {
      +        element2.scrollLeft = +element2.getAttribute("__playwright_scroll_left_");
      +        element2.removeAttribute("__playwright_scroll_left_");
      +        if (frameBoundingRectsInfo.frames.has(element2))
      +          frameBoundingRectsInfo.frames.get(element2).scrollLeft = element2.scrollLeft;
      +      }
      +      win.document.styleSheets[0].disabled = true;
      +      const search = new URL(win.location.href).searchParams;
      +      const isTopFrame = win === topSnapshotWindow;
      +      if (isTopFrame && search.get("pointX") && search.get("pointY")) {
      +        const pointX = +search.get("pointX");
      +        const pointY = +search.get("pointY");
      +        const pointElement = win.document.createElement("x-pw-pointer");
      +        pointElement.style.position = "fixed";
      +        pointElement.style.backgroundColor = "#f44336";
      +        pointElement.style.width = "20px";
      +        pointElement.style.height = "20px";
      +        pointElement.style.borderRadius = "10px";
      +        pointElement.style.margin = "-10px 0 0 -10px";
      +        pointElement.style.zIndex = "2147483646";
      +        pointElement.style.display = "flex";
      +        pointElement.style.alignItems = "center";
      +        pointElement.style.justifyContent = "center";
      +        const target = targetElements[0];
      +        const targetBox = target?.getBoundingClientRect();
      +        const targetCenter = target ? { x: targetBox.left + targetBox.width / 2, y: targetBox.top + targetBox.height / 2 } : null;
      +        pointElement.style.left = (targetCenter?.x ?? pointX) + "px";
      +        pointElement.style.top = (targetCenter?.y ?? pointY) + "px";
      +        const isAligned = !targetCenter || Math.abs(targetCenter.x - pointX) <= 10 && Math.abs(targetCenter.y - pointY) <= 10;
      +        if (!isAligned) {
      +          const warningElement = win.document.createElement("x-pw-pointer-warning");
      +          warningElement.textContent = "\u26A0";
      +          warningElement.style.fontSize = "19px";
      +          warningElement.style.color = "white";
      +          warningElement.style.marginTop = "-3.5px";
      +          warningElement.style.userSelect = "none";
      +          pointElement.appendChild(warningElement);
      +          pointElement.setAttribute("title", kPointerWarningTitle);
      +        }
      +        win.document.documentElement.appendChild(pointElement);
      +      }
      +      if (canvasElements.length > 0) {
      +        let drawCheckerboard2 = function(context2, canvas) {
      +          function createCheckerboardPattern() {
      +            const pattern = win.document.createElement("canvas");
      +            pattern.width = pattern.width / Math.floor(pattern.width / 24);
      +            pattern.height = pattern.height / Math.floor(pattern.height / 24);
      +            const context3 = pattern.getContext("2d");
      +            context3.fillStyle = "lightgray";
      +            context3.fillRect(0, 0, pattern.width, pattern.height);
      +            context3.fillStyle = "white";
      +            context3.fillRect(0, 0, pattern.width / 2, pattern.height / 2);
      +            context3.fillRect(pattern.width / 2, pattern.height / 2, pattern.width, pattern.height);
      +            return context3.createPattern(pattern, "repeat");
      +          }
      +          context2.fillStyle = createCheckerboardPattern();
      +          context2.fillRect(0, 0, canvas.width, canvas.height);
      +        };
      +        var drawCheckerboard = drawCheckerboard2;
      +        const img = new Image();
      +        img.onload = () => {
      +          for (const canvas of canvasElements) {
      +            const context2 = canvas.getContext("2d");
      +            const boundingRectAttribute = canvas.getAttribute("__playwright_bounding_rect__");
      +            canvas.removeAttribute("__playwright_bounding_rect__");
      +            if (!boundingRectAttribute)
      +              continue;
      +            let boundingRect;
      +            try {
      +              boundingRect = JSON.parse(boundingRectAttribute);
      +            } catch (e) {
      +              continue;
      +            }
      +            let currWindow = win;
      +            while (currWindow !== topSnapshotWindow) {
      +              const iframe = currWindow.frameElement;
      +              currWindow = currWindow.parent;
      +              const iframeInfo = currWindow["__playwright_frame_bounding_rects__"]?.frames.get(iframe);
      +              if (!iframeInfo?.boundingRect)
      +                break;
      +              const leftOffset = iframeInfo.boundingRect.left - iframeInfo.scrollLeft;
      +              const topOffset = iframeInfo.boundingRect.top - iframeInfo.scrollTop;
      +              boundingRect.left += leftOffset;
      +              boundingRect.top += topOffset;
      +              boundingRect.right += leftOffset;
      +              boundingRect.bottom += topOffset;
      +            }
      +            const { width, height } = topSnapshotWindow["__playwright_frame_bounding_rects__"].viewport;
      +            boundingRect.left = boundingRect.left / width;
      +            boundingRect.top = boundingRect.top / height;
      +            boundingRect.right = boundingRect.right / width;
      +            boundingRect.bottom = boundingRect.bottom / height;
      +            const partiallyUncaptured = boundingRect.right > 1 || boundingRect.bottom > 1;
      +            const fullyUncaptured = boundingRect.left > 1 || boundingRect.top > 1;
      +            if (fullyUncaptured) {
      +              canvas.title = `Playwright couldn't capture canvas contents because it's located outside the viewport.`;
      +              continue;
      +            }
      +            drawCheckerboard2(context2, canvas);
      +            if (shouldPopulateCanvasFromScreenshot) {
      +              context2.drawImage(img, boundingRect.left * img.width, boundingRect.top * img.height, (boundingRect.right - boundingRect.left) * img.width, (boundingRect.bottom - boundingRect.top) * img.height, 0, 0, canvas.width, canvas.height);
      +              if (partiallyUncaptured)
      +                canvas.title = `Playwright couldn't capture full canvas contents because it's located partially outside the viewport.`;
      +              else
      +                canvas.title = `Canvas contents are displayed on a best-effort basis based on viewport screenshots taken during test execution.`;
      +            } else {
      +              canvas.title = "Canvas content display is disabled.";
      +            }
      +            if (isUnderTest2)
      +              console.log(`canvas drawn:`, JSON.stringify([boundingRect.left, boundingRect.top, boundingRect.right - boundingRect.left, boundingRect.bottom - boundingRect.top].map((v) => Math.floor(v * 100))));
      +          }
      +        };
      +        img.onerror = () => {
      +          for (const canvas of canvasElements) {
      +            const context2 = canvas.getContext("2d");
      +            drawCheckerboard2(context2, canvas);
      +            canvas.title = `Playwright couldn't show canvas contents because the screenshot failed to load.`;
      +          }
      +        };
      +        img.src = location.href.replace("/snapshot", "/closest-screenshot");
      +      }
      +    };
      +    const onDOMContentLoaded = () => visit(win.document);
      +    win.addEventListener("load", onLoad);
      +    win.addEventListener("DOMContentLoaded", onDOMContentLoaded);
      +  }
      +  const safe = (value2) => JSON.stringify(value2).replace(/ `, ${safe(String(id))}`).join("")})`;
      +}
      +function rewriteURLForCustomProtocol(href) {
      +  if (href.startsWith(kLegacyBlobPrefix))
      +    href = href.substring(kLegacyBlobPrefix.length);
      +  try {
      +    const url2 = new URL(href);
      +    if (url2.protocol === "javascript:" || url2.protocol === "vbscript:")
      +      return "javascript:void(0)";
      +    const isBlob = url2.protocol === "blob:";
      +    const isFile = url2.protocol === "file:";
      +    if (!isBlob && !isFile && schemas.includes(url2.protocol))
      +      return href;
      +    const prefix = "pw-" + url2.protocol.slice(0, url2.protocol.length - 1);
      +    if (!isFile)
      +      url2.protocol = "https:";
      +    url2.hostname = url2.hostname ? `${prefix}--${url2.hostname}` : prefix;
      +    if (isFile) {
      +      url2.protocol = "https:";
      +    }
      +    return url2.toString();
      +  } catch {
      +    return href;
      +  }
      +}
      +function rewriteURLsInStyleSheetForCustomProtocol(text2) {
      +  return text2.replace(urlInCSSRegex, (match, protocol) => {
      +    const isBlob = protocol === "blob:";
      +    const isFile = protocol === "file:";
      +    if (!isBlob && !isFile && schemas.includes(protocol))
      +      return match;
      +    return match.replace(protocol + "//", `https://pw-${protocol.slice(0, -1)}--`);
      +  });
      +}
      +function escapeURLsInStyleSheet(text2) {
      +  const replacer = (match, url2) => {
      +    if (url2.includes(" frame.frameSwapWallTime, wallTime) : findClosest(this._screencastFrames, (frame) => frame.timestamp, timestamp);
      +        return closestFrame?.sha1;
      +      }
      +      render() {
      +        const result2 = [];
      +        const visit = (n, snapshotIndex, parentTag, parentAttrs) => {
      +          if (typeof n === "string") {
      +            if (parentTag === "STYLE" || parentTag === "style")
      +              result2.push(escapeURLsInStyleSheet(rewriteURLsInStyleSheetForCustomProtocol(n)));
      +            else
      +              result2.push(escapeHTML(n));
      +            return;
      +          }
      +          if (isSubtreeReferenceSnapshot(n)) {
      +            const referenceIndex = snapshotIndex - n[0][0];
      +            if (referenceIndex >= 0 && referenceIndex <= snapshotIndex) {
      +              const nodes = snapshotNodes(this._snapshots[referenceIndex]);
      +              const nodeIndex = n[0][1];
      +              if (nodeIndex >= 0 && nodeIndex < nodes.length)
      +                return visit(nodes[nodeIndex], referenceIndex, parentTag, parentAttrs);
      +            }
      +          } else if (isNodeNameAttributesChildNodesSnapshot(n)) {
      +            const [name, nodeAttrs, ...children] = n;
      +            if (name.toUpperCase() === "SCRIPT")
      +              return;
      +            const upperName = name.toUpperCase();
      +            const nodeName = upperName === "NOSCRIPT" ? "X-NOSCRIPT" : name;
      +            const attrs = Object.entries(nodeAttrs || {});
      +            result2.push("<", nodeName);
      +            const kCurrentSrcAttribute = "__playwright_current_src__";
      +            const isFrame = upperName === "IFRAME" || upperName === "FRAME";
      +            const isAnchor = upperName === "A";
      +            const isImg = upperName === "IMG";
      +            const isMeta = upperName === "META";
      +            const isImgWithCurrentSrc = isImg && attrs.some((a) => a[0] === kCurrentSrcAttribute);
      +            const isSourceInsidePictureWithCurrentSrc = upperName === "SOURCE" && parentTag === "PICTURE" && parentAttrs?.some((a) => a[0] === kCurrentSrcAttribute);
      +            const hasUnsafeHttpEquiv = isMeta && attrs.some((a) => a[0].toLowerCase() === "http-equiv" && !kAllowedMetaHttpEquivs.has(a[1].trim().toLowerCase()));
      +            for (const [attr, value2] of attrs) {
      +              let attrName = attr;
      +              if (attr.toLowerCase().startsWith("on"))
      +                continue;
      +              if (isFrame && attr.toLowerCase() === "src") {
      +                attrName = "__playwright_src__";
      +              }
      +              if (isFrame && (attr.toLowerCase() === "srcdoc" || attr.toLowerCase() === "sandbox")) {
      +                attrName = "__playwright_" + attr.toLowerCase() + "__";
      +              }
      +              if (upperName === "OBJECT" && attr.toLowerCase() === "data")
      +                attrName = "__playwright_data__";
      +              if (upperName === "EMBED" && attr.toLowerCase() === "src")
      +                attrName = "__playwright_src__";
      +              if (isImg && attr === kCurrentSrcAttribute) {
      +                attrName = "src";
      +              }
      +              if (["src", "srcset"].includes(attr.toLowerCase()) && (isImgWithCurrentSrc || isSourceInsidePictureWithCurrentSrc)) {
      +                attrName = "_" + attrName;
      +              }
      +              if (hasUnsafeHttpEquiv && (attr.toLowerCase() === "http-equiv" || attr.toLowerCase() === "content")) {
      +                attrName = "_" + attr;
      +              }
      +              let attrValue = value2;
      +              if (!isAnchor && (attr.toLowerCase() === "href" || attr.toLowerCase() === "src" || attr === kCurrentSrcAttribute))
      +                attrValue = rewriteURLForCustomProtocol(value2);
      +              result2.push(" ", attrName, '="', escapeHTMLAttribute(attrValue), '"');
      +            }
      +            result2.push(">");
      +            for (const child of children)
      +              visit(child, snapshotIndex, nodeName, attrs);
      +            if (!autoClosing.has(nodeName))
      +              result2.push("");
      +            return;
      +          } else {
      +            return;
      +          }
      +        };
      +        const snapshot3 = this._snapshot;
      +        const html = this._htmlCache.getOrCompute(this, () => {
      +          visit(snapshot3.html, this._index, void 0, void 0);
      +          const safeDoctype = snapshot3.doctype?.replace(/[^a-zA-Z0-9]/g, "");
      +          const prefix = safeDoctype ? `` : "";
      +          const html2 = prefix + [
      +            // Hide the document in order to prevent flickering. We will unhide once script has processed shadow.
      +            "",
      +            ``
      +          ].join("") + result2.join("");
      +          return { value: html2, size: html2.length };
      +        });
      +        return { html, pageId: snapshot3.pageId, frameId: snapshot3.frameId, index: this._index };
      +      }
      +      resourceByUrl(url2, method) {
      +        const snapshot3 = this._snapshot;
      +        let sameFrameResource;
      +        let otherFrameResource;
      +        for (const resource of this._resources) {
      +          if (typeof resource._monotonicTime === "number" && resource._monotonicTime >= snapshot3.timestamp)
      +            break;
      +          if (resource.response.status === 304) {
      +            continue;
      +          }
      +          if (resource.request.url === url2 && resource.request.method === method) {
      +            if (resource._frameref === snapshot3.frameId)
      +              sameFrameResource = resource;
      +            else
      +              otherFrameResource = resource;
      +          }
      +        }
      +        let result2 = sameFrameResource ?? otherFrameResource;
      +        if (result2 && method.toUpperCase() === "GET") {
      +          let override = snapshot3.resourceOverrides.find((o) => o.url === url2);
      +          if (override?.ref) {
      +            const index = this._index - override.ref;
      +            if (index >= 0 && index < this._snapshots.length)
      +              override = this._snapshots[index].resourceOverrides.find((o) => o.url === url2);
      +          }
      +          if (override?.sha1) {
      +            result2 = {
      +              ...result2,
      +              response: {
      +                ...result2.response,
      +                content: {
      +                  ...result2.response.content,
      +                  _sha1: override.sha1
      +                }
      +              }
      +            };
      +          }
      +        }
      +        return result2;
      +      }
      +    };
      +    autoClosing = /* @__PURE__ */ new Set(["AREA", "BASE", "BR", "COL", "COMMAND", "EMBED", "HR", "IMG", "INPUT", "KEYGEN", "LINK", "MENUITEM", "META", "PARAM", "SOURCE", "TRACK", "WBR"]);
      +    kAllowedMetaHttpEquivs = /* @__PURE__ */ new Set(["content-type", "content-language", "default-style", "x-ua-compatible"]);
      +    schemas = ["about:", "blob:", "data:", "file:", "ftp:", "http:", "https:", "mailto:", "sftp:", "ws:", "wss:"];
      +    kLegacyBlobPrefix = "http://playwright.bloburl/#";
      +    urlInCSSRegex = /url\(['"]?([\w-]+:)\/\//ig;
      +    urlToEscapeRegex1 = /url\(\s*'([^']*)'\s*\)/ig;
      +    urlToEscapeRegex2 = /url\(\s*"([^"]*)"\s*\)/ig;
      +    blankSnapshotUrl = "data:text/html;base64," + btoa(``);
      +  }
      +});
      +
      +// packages/isomorphic/lruCache.ts
      +var LRUCache;
      +var init_lruCache = __esm({
      +  "packages/isomorphic/lruCache.ts"() {
      +    "use strict";
      +    LRUCache = class {
      +      constructor(maxSize) {
      +        this._maxSize = maxSize;
      +        this._map = /* @__PURE__ */ new Map();
      +        this._size = 0;
      +      }
      +      getOrCompute(key, compute) {
      +        if (this._map.has(key)) {
      +          const result3 = this._map.get(key);
      +          this._map.delete(key);
      +          this._map.set(key, result3);
      +          return result3.value;
      +        }
      +        const result2 = compute();
      +        while (this._map.size && this._size + result2.size > this._maxSize) {
      +          const [firstKey, firstValue] = this._map.entries().next().value;
      +          this._size -= firstValue.size;
      +          this._map.delete(firstKey);
      +        }
      +        this._map.set(key, result2);
      +        this._size += result2.size;
      +        return result2.value;
      +      }
      +    };
      +  }
      +});
      +
      +// packages/isomorphic/trace/snapshotStorage.ts
      +var SnapshotStorage;
      +var init_snapshotStorage = __esm({
      +  "packages/isomorphic/trace/snapshotStorage.ts"() {
      +    "use strict";
      +    init_snapshotRenderer();
      +    init_lruCache();
      +    SnapshotStorage = class {
      +      constructor() {
      +        this._frameSnapshots = /* @__PURE__ */ new Map();
      +        this._cache = new LRUCache(1e8);
      +        // 100MB per each trace
      +        this._contextToResources = /* @__PURE__ */ new Map();
      +        this._resourceUrlsWithOverrides = /* @__PURE__ */ new Set();
      +      }
      +      addResource(contextId4, resource) {
      +        resource.request.url = rewriteURLForCustomProtocol(resource.request.url);
      +        this._ensureResourcesForContext(contextId4).push(resource);
      +      }
      +      addFrameSnapshot(contextId4, snapshot3, screencastFrames) {
      +        for (const override of snapshot3.resourceOverrides)
      +          override.url = rewriteURLForCustomProtocol(override.url);
      +        let frameSnapshots = this._frameSnapshots.get(snapshot3.frameId);
      +        if (!frameSnapshots) {
      +          frameSnapshots = {
      +            raw: [],
      +            renderers: []
      +          };
      +          this._frameSnapshots.set(snapshot3.frameId, frameSnapshots);
      +          if (snapshot3.isMainFrame)
      +            this._frameSnapshots.set(snapshot3.pageId, frameSnapshots);
      +        }
      +        frameSnapshots.raw.push(snapshot3);
      +        const resources = this._ensureResourcesForContext(contextId4);
      +        const renderer = new SnapshotRenderer(this._cache, resources, frameSnapshots.raw, screencastFrames, frameSnapshots.raw.length - 1);
      +        frameSnapshots.renderers.push(renderer);
      +        return renderer;
      +      }
      +      snapshotByName(pageOrFrameId, snapshotName) {
      +        const snapshot3 = this._frameSnapshots.get(pageOrFrameId);
      +        return snapshot3?.renderers.find((r) => r.snapshotName === snapshotName);
      +      }
      +      snapshotsForTest() {
      +        return [...this._frameSnapshots.keys()];
      +      }
      +      finalize() {
      +        for (const resources of this._contextToResources.values())
      +          resources.sort((a, b) => (a._monotonicTime || 0) - (b._monotonicTime || 0));
      +        for (const frameSnapshots of this._frameSnapshots.values()) {
      +          for (const snapshot3 of frameSnapshots.raw) {
      +            for (const override of snapshot3.resourceOverrides)
      +              this._resourceUrlsWithOverrides.add(override.url);
      +          }
      +        }
      +      }
      +      hasResourceOverride(url2) {
      +        return this._resourceUrlsWithOverrides.has(url2);
      +      }
      +      _ensureResourcesForContext(contextId4) {
      +        let resources = this._contextToResources.get(contextId4);
      +        if (!resources) {
      +          resources = [];
      +          this._contextToResources.set(contextId4, resources);
      +        }
      +        return resources;
      +      }
      +    };
      +  }
      +});
      +
      +// packages/isomorphic/trace/traceUtils.ts
      +function parseClientSideCallMetadata(data) {
      +  const result2 = /* @__PURE__ */ new Map();
      +  const { files, stacks } = data;
      +  for (const s of stacks) {
      +    const [id, ff] = s;
      +    result2.set(`call@${id}`, ff.map((f) => ({ file: files[f[0]], line: f[1], column: f[2], function: f[3] })));
      +  }
      +  return result2;
      +}
      +function serializeClientSideCallMetadata(metadatas) {
      +  const fileNames = /* @__PURE__ */ new Map();
      +  const stacks = [];
      +  for (const m of metadatas) {
      +    if (!m.stack || !m.stack.length)
      +      continue;
      +    const stack = [];
      +    for (const frame of m.stack) {
      +      let ordinal = fileNames.get(frame.file);
      +      if (typeof ordinal !== "number") {
      +        ordinal = fileNames.size;
      +        fileNames.set(frame.file, ordinal);
      +      }
      +      const stackFrame = [ordinal, frame.line || 0, frame.column || 0, frame.function || ""];
      +      stack.push(stackFrame);
      +    }
      +    stacks.push([m.id, stack]);
      +  }
      +  return { files: [...fileNames.keys()], stacks };
      +}
      +var init_traceUtils = __esm({
      +  "packages/isomorphic/trace/traceUtils.ts"() {
      +    "use strict";
      +  }
      +});
      +
      +// packages/isomorphic/trace/traceModernizer.ts
      +var TraceVersionError, latestVersion, TraceModernizer;
      +var init_traceModernizer = __esm({
      +  "packages/isomorphic/trace/traceModernizer.ts"() {
      +    "use strict";
      +    TraceVersionError = class extends Error {
      +      constructor(message) {
      +        super(message);
      +        this.name = "TraceVersionError";
      +      }
      +    };
      +    latestVersion = 8;
      +    TraceModernizer = class {
      +      constructor(contextEntry, snapshotStorage) {
      +        this._actionMap = /* @__PURE__ */ new Map();
      +        this._pageEntries = /* @__PURE__ */ new Map();
      +        this._jsHandles = /* @__PURE__ */ new Map();
      +        this._consoleObjects = /* @__PURE__ */ new Map();
      +        this._contextEntry = contextEntry;
      +        this._snapshotStorage = snapshotStorage;
      +      }
      +      appendTrace(trace) {
      +        for (const line of trace.split("\n"))
      +          this._appendEvent(line);
      +      }
      +      actions() {
      +        return [...this._actionMap.values()];
      +      }
      +      _pageEntry(pageId4) {
      +        let pageEntry = this._pageEntries.get(pageId4);
      +        if (!pageEntry) {
      +          pageEntry = {
      +            pageId: pageId4,
      +            screencastFrames: []
      +          };
      +          this._pageEntries.set(pageId4, pageEntry);
      +          this._contextEntry.pages.push(pageEntry);
      +        }
      +        return pageEntry;
      +      }
      +      _appendEvent(line) {
      +        if (!line)
      +          return;
      +        const events = this._modernize(JSON.parse(line));
      +        for (const event of events)
      +          this._innerAppendEvent(event);
      +      }
      +      _innerAppendEvent(event) {
      +        const contextEntry = this._contextEntry;
      +        switch (event.type) {
      +          case "context-options": {
      +            if (event.version > latestVersion)
      +              throw new TraceVersionError("The trace was created by a newer version of Playwright and is not supported by this version of the viewer. Please use latest Playwright to open the trace.");
      +            this._version = event.version;
      +            contextEntry.origin = event.origin;
      +            contextEntry.browserName = event.browserName;
      +            contextEntry.channel = event.channel;
      +            contextEntry.title = event.title;
      +            contextEntry.platform = event.platform;
      +            contextEntry.playwrightVersion = event.playwrightVersion;
      +            contextEntry.wallTime = event.wallTime;
      +            contextEntry.startTime = event.monotonicTime;
      +            contextEntry.sdkLanguage = event.sdkLanguage;
      +            contextEntry.options = event.options;
      +            contextEntry.testIdAttributeName = event.testIdAttributeName;
      +            contextEntry.contextId = event.contextId ?? "";
      +            contextEntry.testTimeout = event.testTimeout;
      +            break;
      +          }
      +          case "screencast-frame": {
      +            this._pageEntry(event.pageId).screencastFrames.push(event);
      +            break;
      +          }
      +          case "before": {
      +            this._actionMap.set(event.callId, { ...event, type: "action", endTime: 0, log: [] });
      +            break;
      +          }
      +          case "input": {
      +            const existing = this._actionMap.get(event.callId);
      +            existing.inputSnapshot = event.inputSnapshot;
      +            existing.point = event.point;
      +            break;
      +          }
      +          case "log": {
      +            const existing = this._actionMap.get(event.callId);
      +            if (!existing)
      +              return;
      +            existing.log.push({
      +              time: event.time,
      +              message: event.message
      +            });
      +            break;
      +          }
      +          case "after": {
      +            const existing = this._actionMap.get(event.callId);
      +            existing.afterSnapshot = event.afterSnapshot;
      +            existing.endTime = event.endTime;
      +            existing.result = event.result;
      +            existing.error = event.error;
      +            existing.attachments = event.attachments;
      +            existing.annotations = event.annotations;
      +            if (event.point)
      +              existing.point = event.point;
      +            break;
      +          }
      +          case "action": {
      +            this._actionMap.set(event.callId, { ...event, log: [] });
      +            break;
      +          }
      +          case "event": {
      +            contextEntry.events.push(event);
      +            break;
      +          }
      +          case "stdout": {
      +            contextEntry.stdio.push(event);
      +            break;
      +          }
      +          case "stderr": {
      +            contextEntry.stdio.push(event);
      +            break;
      +          }
      +          case "error": {
      +            contextEntry.errors.push(event);
      +            break;
      +          }
      +          case "console": {
      +            contextEntry.events.push(event);
      +            break;
      +          }
      +          case "resource-snapshot":
      +            this._snapshotStorage.addResource(this._contextEntry.contextId, event.snapshot);
      +            contextEntry.resources.push(event.snapshot);
      +            break;
      +          case "frame-snapshot":
      +            this._snapshotStorage.addFrameSnapshot(this._contextEntry.contextId, event.snapshot, this._pageEntry(event.snapshot.pageId).screencastFrames);
      +            break;
      +        }
      +        if ("pageId" in event && event.pageId)
      +          this._pageEntry(event.pageId);
      +        if (event.type === "action" || event.type === "before")
      +          contextEntry.startTime = Math.min(contextEntry.startTime, event.startTime);
      +        if (event.type === "action" || event.type === "after")
      +          contextEntry.endTime = Math.max(contextEntry.endTime, event.endTime);
      +        if (event.type === "event") {
      +          contextEntry.startTime = Math.min(contextEntry.startTime, event.time);
      +          contextEntry.endTime = Math.max(contextEntry.endTime, event.time);
      +        }
      +        if (event.type === "screencast-frame") {
      +          contextEntry.startTime = Math.min(contextEntry.startTime, event.timestamp);
      +          contextEntry.endTime = Math.max(contextEntry.endTime, event.timestamp);
      +        }
      +      }
      +      _processedContextCreatedEvent() {
      +        return this._version !== void 0;
      +      }
      +      _modernize(event) {
      +        let version3 = this._version ?? event.version ?? 6;
      +        let events = [event];
      +        for (; version3 < latestVersion; ++version3)
      +          events = this[`_modernize_${version3}_to_${version3 + 1}`].call(this, events);
      +        return events;
      +      }
      +      _modernize_0_to_1(events) {
      +        for (const event of events) {
      +          if (event.type !== "action")
      +            continue;
      +          if (typeof event.metadata.error === "string")
      +            event.metadata.error = { error: { name: "Error", message: event.metadata.error } };
      +        }
      +        return events;
      +      }
      +      _modernize_1_to_2(events) {
      +        for (const event of events) {
      +          if (event.type !== "frame-snapshot" || !event.snapshot.isMainFrame)
      +            continue;
      +          event.snapshot.viewport = this._contextEntry.options?.viewport || { width: 1280, height: 720 };
      +        }
      +        return events;
      +      }
      +      _modernize_2_to_3(events) {
      +        for (const event of events) {
      +          if (event.type !== "resource-snapshot" || event.snapshot.request)
      +            continue;
      +          const resource = event.snapshot;
      +          event.snapshot = {
      +            _frameref: resource.frameId,
      +            request: {
      +              url: resource.url,
      +              method: resource.method,
      +              headers: resource.requestHeaders,
      +              postData: resource.requestSha1 ? { _sha1: resource.requestSha1 } : void 0
      +            },
      +            response: {
      +              status: resource.status,
      +              headers: resource.responseHeaders,
      +              content: {
      +                mimeType: resource.contentType,
      +                _sha1: resource.responseSha1
      +              }
      +            },
      +            _monotonicTime: resource.timestamp
      +          };
      +        }
      +        return events;
      +      }
      +      _modernize_3_to_4(events) {
      +        const result2 = [];
      +        for (const event of events) {
      +          const e = this._modernize_event_3_to_4(event);
      +          if (e)
      +            result2.push(e);
      +        }
      +        return result2;
      +      }
      +      _modernize_event_3_to_4(event) {
      +        if (event.type !== "action" && event.type !== "event") {
      +          return event;
      +        }
      +        const metadata = event.metadata;
      +        if (metadata.internal || metadata.method.startsWith("tracing"))
      +          return null;
      +        if (event.type === "event") {
      +          if (metadata.method === "__create__" && metadata.type === "ConsoleMessage") {
      +            return {
      +              type: "object",
      +              class: metadata.type,
      +              guid: metadata.params.guid,
      +              initializer: metadata.params.initializer
      +            };
      +          }
      +          return {
      +            type: "event",
      +            time: metadata.startTime,
      +            class: metadata.type,
      +            method: metadata.method,
      +            params: metadata.params,
      +            pageId: metadata.pageId
      +          };
      +        }
      +        return {
      +          type: "action",
      +          callId: metadata.id,
      +          startTime: metadata.startTime,
      +          endTime: metadata.endTime,
      +          apiName: metadata.apiName || metadata.type + "." + metadata.method,
      +          class: metadata.type,
      +          method: metadata.method,
      +          params: metadata.params,
      +          // eslint-disable-next-line no-restricted-globals
      +          wallTime: metadata.wallTime || Date.now(),
      +          log: metadata.log,
      +          beforeSnapshot: metadata.snapshots.find((s) => s.title === "before")?.snapshotName,
      +          inputSnapshot: metadata.snapshots.find((s) => s.title === "input")?.snapshotName,
      +          afterSnapshot: metadata.snapshots.find((s) => s.title === "after")?.snapshotName,
      +          error: metadata.error?.error,
      +          result: metadata.result,
      +          point: metadata.point,
      +          pageId: metadata.pageId
      +        };
      +      }
      +      _modernize_4_to_5(events) {
      +        const result2 = [];
      +        for (const event of events) {
      +          const e = this._modernize_event_4_to_5(event);
      +          if (e)
      +            result2.push(e);
      +        }
      +        return result2;
      +      }
      +      _modernize_event_4_to_5(event) {
      +        if (event.type === "event" && event.method === "__create__" && event.class === "JSHandle")
      +          this._jsHandles.set(event.params.guid, event.params.initializer);
      +        if (event.type === "object") {
      +          if (event.class !== "ConsoleMessage")
      +            return null;
      +          const args = event.initializer.args?.map((arg) => {
      +            if (arg.guid) {
      +              const handle = this._jsHandles.get(arg.guid);
      +              return { preview: handle?.preview || "", value: "" };
      +            }
      +            return { preview: arg.preview || "", value: arg.value || "" };
      +          });
      +          this._consoleObjects.set(event.guid, {
      +            type: event.initializer.type,
      +            text: event.initializer.text,
      +            location: event.initializer.location,
      +            args
      +          });
      +          return null;
      +        }
      +        if (event.type === "event" && event.method === "console") {
      +          const consoleMessage = this._consoleObjects.get(event.params.message?.guid || "");
      +          if (!consoleMessage)
      +            return null;
      +          return {
      +            type: "console",
      +            time: event.time,
      +            pageId: event.pageId,
      +            messageType: consoleMessage.type,
      +            text: consoleMessage.text,
      +            args: consoleMessage.args,
      +            location: consoleMessage.location
      +          };
      +        }
      +        return event;
      +      }
      +      _modernize_5_to_6(events) {
      +        const result2 = [];
      +        for (const event of events) {
      +          result2.push(event);
      +          if (event.type !== "after" || !event.log.length)
      +            continue;
      +          for (const log2 of event.log) {
      +            result2.push({
      +              type: "log",
      +              callId: event.callId,
      +              message: log2,
      +              time: -1
      +            });
      +          }
      +        }
      +        return result2;
      +      }
      +      _modernize_6_to_7(events) {
      +        const result2 = [];
      +        if (!this._processedContextCreatedEvent() && events[0].type !== "context-options") {
      +          const event = {
      +            type: "context-options",
      +            origin: "testRunner",
      +            version: 6,
      +            browserName: "",
      +            options: {},
      +            platform: "unknown",
      +            wallTime: 0,
      +            monotonicTime: 0,
      +            sdkLanguage: "javascript",
      +            contextId: ""
      +          };
      +          result2.push(event);
      +        }
      +        for (const event of events) {
      +          if (event.type === "context-options") {
      +            result2.push({ ...event, monotonicTime: 0, origin: "library", contextId: "" });
      +            continue;
      +          }
      +          if (event.type === "before" || event.type === "action") {
      +            if (!this._contextEntry.wallTime)
      +              this._contextEntry.wallTime = event.wallTime;
      +            const eventAsV6 = event;
      +            const eventAsV7 = event;
      +            eventAsV7.stepId = `${eventAsV6.apiName}@${eventAsV6.wallTime}`;
      +            result2.push(eventAsV7);
      +          } else {
      +            result2.push(event);
      +          }
      +        }
      +        return result2;
      +      }
      +      _modernize_7_to_8(events) {
      +        const result2 = [];
      +        for (const event of events) {
      +          if (event.type === "before" || event.type === "action") {
      +            const eventAsV7 = event;
      +            const eventAsV8 = event;
      +            if (eventAsV7.apiName) {
      +              eventAsV8.title = eventAsV7.apiName;
      +              delete eventAsV8.apiName;
      +            }
      +            eventAsV8.stepId = eventAsV7.stepId ?? eventAsV7.callId;
      +            result2.push(eventAsV8);
      +          } else {
      +            result2.push(event);
      +          }
      +        }
      +        return result2;
      +      }
      +    };
      +  }
      +});
      +
      +// packages/isomorphic/trace/traceLoader.ts
      +function stripEncodingFromContentType(contentType) {
      +  const charset = contentType.match(/^(.*);\s*charset=.*$/);
      +  if (charset)
      +    return charset[1];
      +  return contentType;
      +}
      +function createEmptyContext() {
      +  return {
      +    origin: "testRunner",
      +    startTime: Number.MAX_SAFE_INTEGER,
      +    wallTime: Number.MAX_SAFE_INTEGER,
      +    endTime: 0,
      +    browserName: "",
      +    options: {
      +      deviceScaleFactor: 1,
      +      isMobile: false,
      +      viewport: { width: 1280, height: 800 }
      +    },
      +    pages: [],
      +    resources: [],
      +    actions: [],
      +    events: [],
      +    errors: [],
      +    stdio: [],
      +    hasSource: false,
      +    contextId: ""
      +  };
      +}
      +var TraceLoader;
      +var init_traceLoader = __esm({
      +  "packages/isomorphic/trace/traceLoader.ts"() {
      +    "use strict";
      +    init_traceUtils();
      +    init_snapshotStorage();
      +    init_traceModernizer();
      +    TraceLoader = class {
      +      constructor() {
      +        this.contextEntries = [];
      +        this._resourceToContentType = /* @__PURE__ */ new Map();
      +      }
      +      async load(backend, traceFile, unzipProgress) {
      +        this._backend = backend;
      +        const prefix = traceFile?.match(/(.+)\.trace$/)?.[1];
      +        const prefixes = [];
      +        let hasSource = false;
      +        for (const entryName of await this._backend.entryNames()) {
      +          const match = entryName.match(/(.+)\.trace$/);
      +          if (match && (!prefix || prefix === match[1]))
      +            prefixes.push(match[1] || "");
      +          if (entryName.includes("src@"))
      +            hasSource = true;
      +        }
      +        if (!prefixes.length)
      +          throw new Error("Cannot find .trace file");
      +        this._snapshotStorage = new SnapshotStorage();
      +        const total = prefixes.length * 3;
      +        let done = 0;
      +        for (const prefix2 of prefixes) {
      +          const contextEntry = createEmptyContext();
      +          contextEntry.hasSource = hasSource;
      +          const modernizer = new TraceModernizer(contextEntry, this._snapshotStorage);
      +          const trace = await this._backend.readText(prefix2 + ".trace") || "";
      +          modernizer.appendTrace(trace);
      +          unzipProgress?.(++done, total);
      +          const network = await this._backend.readText(prefix2 + ".network") || "";
      +          modernizer.appendTrace(network);
      +          unzipProgress?.(++done, total);
      +          contextEntry.actions = modernizer.actions().sort((a1, a2) => a1.startTime - a2.startTime);
      +          if (!backend.isLive()) {
      +            for (const action of contextEntry.actions.slice().reverse()) {
      +              if (!action.endTime && !action.error) {
      +                for (const a of contextEntry.actions) {
      +                  if (a.parentId === action.callId && action.endTime < a.endTime)
      +                    action.endTime = a.endTime;
      +                }
      +              }
      +            }
      +          }
      +          const stacks = await this._backend.readText(prefix2 + ".stacks");
      +          if (stacks) {
      +            const callMetadata = parseClientSideCallMetadata(JSON.parse(stacks));
      +            for (const action of contextEntry.actions)
      +              action.stack = action.stack || callMetadata.get(action.callId);
      +          }
      +          unzipProgress?.(++done, total);
      +          for (const resource of contextEntry.resources) {
      +            if (resource.request.postData?._sha1)
      +              this._resourceToContentType.set(resource.request.postData._sha1, stripEncodingFromContentType(resource.request.postData.mimeType));
      +            if (resource.response.content?._sha1)
      +              this._resourceToContentType.set(resource.response.content._sha1, stripEncodingFromContentType(resource.response.content.mimeType));
      +          }
      +          this.contextEntries.push(contextEntry);
      +        }
      +        this._snapshotStorage.finalize();
      +      }
      +      async hasEntry(filename) {
      +        return this._backend.hasEntry(filename);
      +      }
      +      async resourceForSha1(sha1) {
      +        const blob = await this._backend.readBlob("resources/" + sha1);
      +        const contentType = this._resourceToContentType.get(sha1);
      +        if (!blob || contentType === void 0 || contentType === "x-unknown")
      +          return blob;
      +        return new Blob([blob], { type: contentType });
      +      }
      +      storage() {
      +        return this._snapshotStorage;
      +      }
      +    };
      +  }
      +});
      +
      +// packages/isomorphic/trace/traceModel.ts
      +function indexModel(context2) {
      +  for (const page of context2.pages)
      +    page[contextSymbol] = context2;
      +  for (let i = 0; i < context2.actions.length; ++i) {
      +    const action = context2.actions[i];
      +    action[contextSymbol] = context2;
      +  }
      +  let lastNonRouteAction = void 0;
      +  for (let i = context2.actions.length - 1; i >= 0; i--) {
      +    const action = context2.actions[i];
      +    action[nextInContextSymbol] = lastNonRouteAction;
      +    if (action.class !== "Route")
      +      lastNonRouteAction = action;
      +  }
      +  for (const event of context2.events)
      +    event[contextSymbol] = context2;
      +  for (const resource of context2.resources)
      +    resource[contextSymbol] = context2;
      +}
      +function mergeActionsAndUpdateTiming(contexts) {
      +  const result2 = [];
      +  const actions = mergeActionsAndUpdateTimingSameTrace(contexts);
      +  result2.push(...actions);
      +  result2.sort((a1, a2) => {
      +    if (a2.parentId === a1.callId)
      +      return 1;
      +    if (a1.parentId === a2.callId)
      +      return -1;
      +    return a1.endTime - a2.endTime;
      +  });
      +  for (let i = 1; i < result2.length; ++i)
      +    result2[i][prevByEndTimeSymbol] = result2[i - 1];
      +  result2.sort((a1, a2) => {
      +    if (a2.parentId === a1.callId)
      +      return -1;
      +    if (a1.parentId === a2.callId)
      +      return 1;
      +    return a1.startTime - a2.startTime;
      +  });
      +  for (let i = 0; i + 1 < result2.length; ++i)
      +    result2[i][nextByStartTimeSymbol] = result2[i + 1];
      +  return result2;
      +}
      +function mergeActionsAndUpdateTimingSameTrace(contexts) {
      +  const map = /* @__PURE__ */ new Map();
      +  const libraryContexts = contexts.filter((context2) => context2.origin === "library");
      +  const testRunnerContexts = contexts.filter((context2) => context2.origin === "testRunner");
      +  if (!testRunnerContexts.length || !libraryContexts.length) {
      +    return contexts.map((context2) => {
      +      return context2.actions.map((action) => ({ ...action, context: context2 }));
      +    }).flat();
      +  }
      +  for (const context2 of libraryContexts) {
      +    for (const action of context2.actions) {
      +      map.set(action.stepId || `tmp-step@${++lastTmpStepId}`, { ...action, context: context2 });
      +    }
      +  }
      +  const delta = monotonicTimeDeltaBetweenLibraryAndRunner(testRunnerContexts, map);
      +  if (delta)
      +    adjustMonotonicTime(libraryContexts, delta);
      +  const nonPrimaryIdToPrimaryId = /* @__PURE__ */ new Map();
      +  for (const context2 of testRunnerContexts) {
      +    for (const action of context2.actions) {
      +      const existing = action.stepId && map.get(action.stepId);
      +      if (existing) {
      +        nonPrimaryIdToPrimaryId.set(action.callId, existing.callId);
      +        if (action.error)
      +          existing.error = action.error;
      +        if (action.attachments)
      +          existing.attachments = action.attachments;
      +        if (action.annotations)
      +          existing.annotations = action.annotations;
      +        if (action.parentId)
      +          existing.parentId = nonPrimaryIdToPrimaryId.get(action.parentId) ?? action.parentId;
      +        if (action.group)
      +          existing.group = action.group;
      +        existing.startTime = action.startTime;
      +        existing.endTime = action.endTime;
      +        continue;
      +      }
      +      if (action.parentId)
      +        action.parentId = nonPrimaryIdToPrimaryId.get(action.parentId) ?? action.parentId;
      +      map.set(action.stepId || `tmp-step@${++lastTmpStepId}`, { ...action, context: context2 });
      +    }
      +  }
      +  return [...map.values()];
      +}
      +function adjustMonotonicTime(contexts, monotonicTimeDelta) {
      +  for (const context2 of contexts) {
      +    context2.startTime += monotonicTimeDelta;
      +    context2.endTime += monotonicTimeDelta;
      +    for (const action of context2.actions) {
      +      if (action.startTime)
      +        action.startTime += monotonicTimeDelta;
      +      if (action.endTime)
      +        action.endTime += monotonicTimeDelta;
      +    }
      +    for (const event of context2.events)
      +      event.time += monotonicTimeDelta;
      +    for (const event of context2.stdio)
      +      event.timestamp += monotonicTimeDelta;
      +    for (const page of context2.pages) {
      +      for (const frame of page.screencastFrames)
      +        frame.timestamp += monotonicTimeDelta;
      +    }
      +    for (const resource of context2.resources) {
      +      if (resource._monotonicTime)
      +        resource._monotonicTime += monotonicTimeDelta;
      +    }
      +  }
      +}
      +function monotonicTimeDeltaBetweenLibraryAndRunner(nonPrimaryContexts, libraryActions) {
      +  for (const context2 of nonPrimaryContexts) {
      +    for (const action of context2.actions) {
      +      if (!action.startTime)
      +        continue;
      +      const libraryAction = action.stepId ? libraryActions.get(action.stepId) : void 0;
      +      if (libraryAction)
      +        return action.startTime - libraryAction.startTime;
      +    }
      +  }
      +  return 0;
      +}
      +function buildActionTree(actions) {
      +  const itemMap = /* @__PURE__ */ new Map();
      +  for (const action of actions) {
      +    itemMap.set(action.callId, {
      +      id: action.callId,
      +      parent: void 0,
      +      children: [],
      +      action
      +    });
      +  }
      +  const rootItem = { action: { ...kFakeRootAction }, id: "", parent: void 0, children: [] };
      +  for (const item of itemMap.values()) {
      +    rootItem.action.startTime = Math.min(rootItem.action.startTime, item.action.startTime);
      +    rootItem.action.endTime = Math.max(rootItem.action.endTime, item.action.endTime);
      +    const parent = item.action.parentId ? itemMap.get(item.action.parentId) || rootItem : rootItem;
      +    parent.children.push(item);
      +    item.parent = parent;
      +  }
      +  const inheritStack = (item) => {
      +    for (const child of item.children) {
      +      child.action.stack = child.action.stack ?? item.action.stack;
      +      inheritStack(child);
      +    }
      +  };
      +  inheritStack(rootItem);
      +  return { rootItem, itemMap };
      +}
      +function context(action) {
      +  return action[contextSymbol];
      +}
      +function nextInContext(action) {
      +  return action[nextInContextSymbol];
      +}
      +function previousActionByEndTime(action) {
      +  return action[prevByEndTimeSymbol];
      +}
      +function nextActionByStartTime(action) {
      +  return action[nextByStartTimeSymbol];
      +}
      +function stats(action) {
      +  let errors = 0;
      +  let warnings = 0;
      +  for (const event of eventsForAction(action)) {
      +    if (event.type === "console") {
      +      const type3 = event.messageType;
      +      if (type3 === "warning")
      +        ++warnings;
      +      else if (type3 === "error")
      +        ++errors;
      +    }
      +    if (event.type === "event" && event.method === "pageError")
      +      ++errors;
      +  }
      +  return { errors, warnings };
      +}
      +function eventsForAction(action) {
      +  let result2 = action[eventsSymbol];
      +  if (result2)
      +    return result2;
      +  const nextAction = nextInContext(action);
      +  result2 = context(action).events.filter((event) => {
      +    return event.time >= action.startTime && (!nextAction || event.time < nextAction.startTime);
      +  });
      +  action[eventsSymbol] = result2;
      +  return result2;
      +}
      +function collectSources(actions, errorDescriptors) {
      +  const result2 = /* @__PURE__ */ new Map();
      +  for (const action of actions) {
      +    for (const frame of action.stack || []) {
      +      let source11 = result2.get(frame.file);
      +      if (!source11) {
      +        source11 = { errors: [], content: void 0 };
      +        result2.set(frame.file, source11);
      +      }
      +    }
      +  }
      +  for (const error of errorDescriptors) {
      +    const { action, stack, message } = error;
      +    if (!action || !stack)
      +      continue;
      +    result2.get(stack[0].file)?.errors.push({
      +      line: stack[0].line || 0,
      +      message
      +    });
      +  }
      +  return result2;
      +}
      +var contextSymbol, nextInContextSymbol, prevByEndTimeSymbol, nextByStartTimeSymbol, eventsSymbol, TraceModel, lastTmpStepId, kFakeRootAction;
      +var init_traceModel = __esm({
      +  "packages/isomorphic/trace/traceModel.ts"() {
      +    "use strict";
      +    init_protocolFormatter();
      +    contextSymbol = Symbol("context");
      +    nextInContextSymbol = Symbol("nextInContext");
      +    prevByEndTimeSymbol = Symbol("prevByEndTime");
      +    nextByStartTimeSymbol = Symbol("nextByStartTime");
      +    eventsSymbol = Symbol("events");
      +    TraceModel = class {
      +      constructor(traceUri, contexts) {
      +        contexts.forEach((contextEntry) => indexModel(contextEntry));
      +        const libraryContext = contexts.find((context2) => context2.origin === "library");
      +        this.traceUri = traceUri;
      +        this.browserName = libraryContext?.browserName || "";
      +        this.sdkLanguage = libraryContext?.sdkLanguage;
      +        this.channel = libraryContext?.channel;
      +        this.testIdAttributeName = libraryContext?.testIdAttributeName;
      +        this.platform = libraryContext?.platform || "";
      +        this.playwrightVersion = contexts.find((c) => c.playwrightVersion)?.playwrightVersion;
      +        this.title = libraryContext?.title || "";
      +        this.options = libraryContext?.options || {};
      +        this.testTimeout = contexts.find((c) => c.origin === "testRunner")?.testTimeout;
      +        this.actions = mergeActionsAndUpdateTiming(contexts);
      +        this.pages = [].concat(...contexts.map((c) => c.pages));
      +        this.wallTime = contexts.map((c) => c.wallTime).reduce((prev, cur) => Math.min(prev || Number.MAX_VALUE, cur), Number.MAX_VALUE);
      +        this.startTime = contexts.map((c) => c.startTime).reduce((prev, cur) => Math.min(prev, cur), Number.MAX_VALUE);
      +        this.endTime = contexts.map((c) => c.endTime).reduce((prev, cur) => Math.max(prev, cur), Number.MIN_VALUE);
      +        this.events = [].concat(...contexts.map((c) => c.events));
      +        this.stdio = [].concat(...contexts.map((c) => c.stdio));
      +        this.errors = [].concat(...contexts.map((c) => c.errors));
      +        this.hasSource = contexts.some((c) => c.hasSource);
      +        this.hasStepData = contexts.some((context2) => context2.origin === "testRunner");
      +        this.resources = [...contexts.map((c) => c.resources)].flat().map((entry) => ({ ...entry, id: `${entry.pageref}-${entry.startedDateTime}-${entry.request.url}` }));
      +        this.attachments = this.actions.flatMap((action) => action.attachments?.map((attachment) => ({ ...attachment, callId: action.callId, traceUri })) ?? []);
      +        this.visibleAttachments = this.attachments.filter((attachment) => !attachment.name.startsWith("_"));
      +        this.events.sort((a1, a2) => a1.time - a2.time);
      +        this.resources.sort((a1, a2) => a1._monotonicTime - a2._monotonicTime);
      +        this.errorDescriptors = this.hasStepData ? this._errorDescriptorsFromTestRunner() : this._errorDescriptorsFromActions();
      +        this.sources = collectSources(this.actions, this.errorDescriptors);
      +        this.actionCounters = /* @__PURE__ */ new Map();
      +        for (const action of this.actions) {
      +          action.group = action.group ?? getActionGroup({ type: action.class, method: action.method });
      +          if (action.group)
      +            this.actionCounters.set(action.group, 1 + (this.actionCounters.get(action.group) || 0));
      +        }
      +      }
      +      createRelativeUrl(path59) {
      +        const url2 = new URL("http://localhost/" + path59);
      +        url2.searchParams.set("trace", this.traceUri);
      +        return url2.toString().substring("http://localhost/".length);
      +      }
      +      failedAction() {
      +        return this.actions.findLast((a) => a.error);
      +      }
      +      filteredActions(actionsFilter) {
      +        const filter = new Set(actionsFilter);
      +        return this.actions.filter((action) => !action.group || filter.has(action.group));
      +      }
      +      renderActionTree(filter) {
      +        const actions = this.filteredActions(filter ?? []);
      +        const { rootItem } = buildActionTree(actions);
      +        const actionTree = [];
      +        const visit = (actionItem, indent) => {
      +          const title = renderTitleForCall({ ...actionItem.action, type: actionItem.action.class });
      +          actionTree.push(`${indent}${title || actionItem.id}`);
      +          for (const child of actionItem.children)
      +            visit(child, indent + "  ");
      +        };
      +        rootItem.children.forEach((a) => visit(a, ""));
      +        return actionTree;
      +      }
      +      _errorDescriptorsFromActions() {
      +        const errors = [];
      +        for (const action of this.actions || []) {
      +          if (!action.error?.message)
      +            continue;
      +          errors.push({
      +            action,
      +            stack: action.stack,
      +            message: action.error.message
      +          });
      +        }
      +        return errors;
      +      }
      +      _errorDescriptorsFromTestRunner() {
      +        return this.errors.filter((e) => !!e.message).map((error, i) => ({
      +          stack: error.stack,
      +          message: error.message
      +        }));
      +      }
      +    };
      +    lastTmpStepId = 0;
      +    kFakeRootAction = {
      +      type: "action",
      +      callId: "",
      +      startTime: 0,
      +      endTime: 0,
      +      class: "",
      +      method: "",
      +      params: {},
      +      log: [],
      +      context: {
      +        origin: "library",
      +        startTime: 0,
      +        endTime: 0,
      +        browserName: "",
      +        wallTime: 0,
      +        options: {},
      +        pages: [],
      +        resources: [],
      +        actions: [],
      +        events: [],
      +        stdio: [],
      +        errors: [],
      +        hasSource: false,
      +        contextId: ""
      +      }
      +    };
      +  }
      +});
      +
      +// packages/isomorphic/yaml.ts
      +function yamlEscapeKeyIfNeeded(str) {
      +  if (!yamlStringNeedsQuotes(str))
      +    return str;
      +  return `'` + str.replace(/'/g, `''`) + `'`;
      +}
      +function yamlEscapeValueIfNeeded(str) {
      +  if (!yamlStringNeedsQuotes(str))
      +    return str;
      +  return '"' + str.replace(/[\\"\x00-\x1f\x7f-\x9f]/g, (c) => {
      +    switch (c) {
      +      case "\\":
      +        return "\\\\";
      +      case '"':
      +        return '\\"';
      +      case "\b":
      +        return "\\b";
      +      case "\f":
      +        return "\\f";
      +      case "\n":
      +        return "\\n";
      +      case "\r":
      +        return "\\r";
      +      case "	":
      +        return "\\t";
      +      default:
      +        const code = c.charCodeAt(0);
      +        return "\\x" + code.toString(16).padStart(2, "0");
      +    }
      +  }) + '"';
      +}
      +function yamlStringNeedsQuotes(str) {
      +  if (str.length === 0)
      +    return true;
      +  if (/^\s|\s$/.test(str))
      +    return true;
      +  if (/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\x9f]/.test(str))
      +    return true;
      +  if (/^-/.test(str))
      +    return true;
      +  if (/[\n:](\s|$)/.test(str))
      +    return true;
      +  if (/\s#/.test(str))
      +    return true;
      +  if (/[\n\r]/.test(str))
      +    return true;
      +  if (/^[&*\],?!>|@"'#%]/.test(str))
      +    return true;
      +  if (/[{}`]/.test(str))
      +    return true;
      +  if (/^\[/.test(str))
      +    return true;
      +  if (!isNaN(Number(str)) || ["y", "n", "yes", "no", "true", "false", "on", "off", "null"].includes(str.toLowerCase()))
      +    return true;
      +  return false;
      +}
      +var init_yaml = __esm({
      +  "packages/isomorphic/yaml.ts"() {
      +    "use strict";
      +  }
      +});
      +
      +// packages/isomorphic/index.ts
      +var isomorphic_exports = {};
      +__export(isomorphic_exports, {
      +  CSharpLocatorFactory: () => CSharpLocatorFactory,
      +  DEFAULT_PLAYWRIGHT_LAUNCH_TIMEOUT: () => DEFAULT_PLAYWRIGHT_LAUNCH_TIMEOUT,
      +  DEFAULT_PLAYWRIGHT_TIMEOUT: () => DEFAULT_PLAYWRIGHT_TIMEOUT,
      +  InvalidSelectorError: () => InvalidSelectorError,
      +  JavaLocatorFactory: () => JavaLocatorFactory,
      +  JavaScriptLocatorFactory: () => JavaScriptLocatorFactory,
      +  JsonlLocatorFactory: () => JsonlLocatorFactory,
      +  KeyParser: () => KeyParser,
      +  LongStandingScope: () => LongStandingScope,
      +  ManualPromise: () => ManualPromise,
      +  MultiMap: () => MultiMap,
      +  ParserError: () => ParserError,
      +  PythonLocatorFactory: () => PythonLocatorFactory,
      +  Semaphore: () => Semaphore,
      +  SnapshotServer: () => SnapshotServer,
      +  SnapshotStorage: () => SnapshotStorage,
      +  TraceLoader: () => TraceLoader,
      +  TraceModel: () => TraceModel,
      +  ansiRegex: () => ansiRegex,
      +  ariaNodesEqual: () => ariaNodesEqual,
      +  asLocator: () => asLocator,
      +  asLocatorDescription: () => asLocatorDescription,
      +  asLocators: () => asLocators,
      +  assert: () => assert,
      +  base64ByteLength: () => base64ByteLength,
      +  buildActionTree: () => buildActionTree,
      +  bytesToString: () => bytesToString,
      +  cacheNormalizedWhitespaces: () => cacheNormalizedWhitespaces,
      +  captureRawStack: () => captureRawStack,
      +  constructURLBasedOnBaseURL: () => constructURLBasedOnBaseURL,
      +  context: () => context,
      +  customCSSNames: () => customCSSNames,
      +  deserializeURLMatch: () => deserializeURLMatch,
      +  escapeForAttributeSelector: () => escapeForAttributeSelector,
      +  escapeForTextSelector: () => escapeForTextSelector,
      +  escapeHTML: () => escapeHTML,
      +  escapeHTMLAttribute: () => escapeHTMLAttribute,
      +  escapeRegExp: () => escapeRegExp,
      +  escapeTemplateString: () => escapeTemplateString,
      +  escapeWithQuotes: () => escapeWithQuotes,
      +  eventsForAction: () => eventsForAction,
      +  findNewNode: () => findNewNode,
      +  formatObject: () => formatObject,
      +  formatObjectOrVoid: () => formatObjectOrVoid,
      +  formatProtocolParam: () => formatProtocolParam,
      +  getActionGroup: () => getActionGroup,
      +  getExtensionForMimeType: () => getExtensionForMimeType,
      +  getMetainfo: () => getMetainfo,
      +  getMimeTypeForPath: () => getMimeTypeForPath,
      +  globToRegexPattern: () => globToRegexPattern,
      +  hasPointerCursor: () => hasPointerCursor,
      +  headersArrayToObject: () => headersArrayToObject,
      +  headersObjectToArray: () => headersObjectToArray,
      +  isError: () => isError,
      +  isHttpUrl: () => isHttpUrl,
      +  isInvalidSelectorError: () => isInvalidSelectorError,
      +  isJsonMimeType: () => isJsonMimeType,
      +  isObject: () => isObject,
      +  isRegExp: () => isRegExp,
      +  isRegexString: () => isRegexString,
      +  isString: () => isString,
      +  isTextualMimeType: () => isTextualMimeType,
      +  isURLPattern: () => isURLPattern,
      +  isXmlMimeType: () => isXmlMimeType,
      +  locatorCustomDescription: () => locatorCustomDescription,
      +  locatorOrSelectorAsSelector: () => locatorOrSelectorAsSelector,
      +  longestCommonSubstring: () => longestCommonSubstring,
      +  methodMetainfo: () => methodMetainfo,
      +  monotonicTime: () => monotonicTime,
      +  msToString: () => msToString,
      +  nextActionByStartTime: () => nextActionByStartTime,
      +  noColors: () => noColors,
      +  normalizeEscapedRegexQuotes: () => normalizeEscapedRegexQuotes,
      +  normalizeWhiteSpace: () => normalizeWhiteSpace,
      +  padImageToSize: () => padImageToSize,
      +  parseAriaSnapshot: () => parseAriaSnapshot,
      +  parseAriaSnapshotUnsafe: () => parseAriaSnapshotUnsafe,
      +  parseAttributeSelector: () => parseAttributeSelector,
      +  parseCSS: () => parseCSS,
      +  parseClientSideCallMetadata: () => parseClientSideCallMetadata,
      +  parseErrorStack: () => parseErrorStack,
      +  parseRegex: () => parseRegex,
      +  parseSelector: () => parseSelector,
      +  parseStackFrame: () => parseStackFrame,
      +  pollAgainstDeadline: () => pollAgainstDeadline,
      +  previousActionByEndTime: () => previousActionByEndTime,
      +  quoteCSSAttributeValue: () => quoteCSSAttributeValue,
      +  raceAgainstDeadline: () => raceAgainstDeadline,
      +  renderTitleForCall: () => renderTitleForCall,
      +  resolveGlobToRegexPattern: () => resolveGlobToRegexPattern,
      +  rewriteErrorMessage: () => rewriteErrorMessage,
      +  scaleImageToSize: () => scaleImageToSize,
      +  serializeClientSideCallMetadata: () => serializeClientSideCallMetadata,
      +  serializeExpectedTextValues: () => serializeExpectedTextValues,
      +  serializeSelector: () => serializeSelector,
      +  serializeURLMatch: () => serializeURLMatch,
      +  serializeURLPattern: () => serializeURLPattern,
      +  setTimeOrigin: () => setTimeOrigin,
      +  signalToPromise: () => signalToPromise,
      +  splitErrorMessage: () => splitErrorMessage,
      +  splitSelectorByFrame: () => splitSelectorByFrame,
      +  stats: () => stats,
      +  stringifySelector: () => stringifySelector,
      +  stringifyStackFrames: () => stringifyStackFrames,
      +  stripAnsiEscapes: () => stripAnsiEscapes,
      +  textValue: () => textValue,
      +  timeOrigin: () => timeOrigin,
      +  toSnakeCase: () => toSnakeCase,
      +  toTitleCase: () => toTitleCase,
      +  tomlArray: () => tomlArray,
      +  tomlBasicString: () => tomlBasicString,
      +  tomlMultilineBasicString: () => tomlMultilineBasicString,
      +  trimString: () => trimString,
      +  trimStringWithEllipsis: () => trimStringWithEllipsis,
      +  unsafeLocatorOrSelectorAsSelector: () => unsafeLocatorOrSelectorAsSelector,
      +  urlMatches: () => urlMatches,
      +  urlMatchesEqual: () => urlMatchesEqual,
      +  validate: () => validate,
      +  visitAllSelectorParts: () => visitAllSelectorParts,
      +  webColors: () => webColors,
      +  yamlEscapeKeyIfNeeded: () => yamlEscapeKeyIfNeeded,
      +  yamlEscapeValueIfNeeded: () => yamlEscapeValueIfNeeded
      +});
      +var init_isomorphic = __esm({
      +  "packages/isomorphic/index.ts"() {
      +    "use strict";
      +    init_ariaSnapshot();
      +    init_expectUtils();
      +    init_assert();
      +    init_base64();
      +    init_colors();
      +    init_headers();
      +    init_imageUtils();
      +    init_jsonSchema();
      +    init_locatorGenerators();
      +    init_manualPromise();
      +    init_mimeType();
      +    init_multimap();
      +    init_protocolFormatter();
      +    init_protocolMetainfo();
      +    init_rtti();
      +    init_semaphore();
      +    init_stackTrace();
      +    init_stringUtils();
      +    init_formatUtils();
      +    init_time();
      +    init_timeoutRunner();
      +    init_snapshotServer();
      +    init_urlMatch();
      +    init_cssParser();
      +    init_locatorParser();
      +    init_selectorParser();
      +    init_snapshotStorage();
      +    init_traceLoader();
      +    init_traceModel();
      +    init_traceUtils();
      +    init_yaml();
      +  }
      +});
      +
      +// packages/utils/ascii.ts
      +function wrapInASCIIBox(text2, padding = 0) {
      +  const lines = text2.split("\n");
      +  const maxLength = Math.max(...lines.map((line) => line.length));
      +  return [
      +    "\u2554" + "\u2550".repeat(maxLength + padding * 2) + "\u2557",
      +    ...lines.map((line) => "\u2551" + " ".repeat(padding) + line + " ".repeat(maxLength - line.length + padding) + "\u2551"),
      +    "\u255A" + "\u2550".repeat(maxLength + padding * 2) + "\u255D"
      +  ].join("\n");
      +}
      +function jsonStringifyForceASCII(object) {
      +  return JSON.stringify(object).replace(
      +    /[\u007f-\uffff]/g,
      +    (c) => "\\u" + ("0000" + c.charCodeAt(0).toString(16)).slice(-4)
      +  );
      +}
      +var init_ascii = __esm({
      +  "packages/utils/ascii.ts"() {
      +    "use strict";
      +  }
      +});
      +
      +// packages/utils/chromiumChannels.ts
      +function defaultUserDataDirForChannel(channel) {
      +  return channelToDefaultUserDataDir.get(channel)?.[process.platform];
      +}
      +function isChromiumChannelName(channel) {
      +  return channelToDefaultUserDataDir.has(channel);
      +}
      +var import_os, import_path, channelToDefaultUserDataDir;
      +var init_chromiumChannels = __esm({
      +  "packages/utils/chromiumChannels.ts"() {
      +    "use strict";
      +    import_os = __toESM(require("os"));
      +    import_path = __toESM(require("path"));
      +    channelToDefaultUserDataDir = /* @__PURE__ */ new Map([
      +      ["chrome", {
      +        "linux": import_path.default.join(import_os.default.homedir(), ".config", "google-chrome"),
      +        "darwin": import_path.default.join(import_os.default.homedir(), "Library", "Application Support", "Google", "Chrome"),
      +        "win32": import_path.default.join(process.env.LOCALAPPDATA || import_path.default.join(import_os.default.homedir(), "AppData", "Local"), "Google", "Chrome", "User Data")
      +      }],
      +      ["chrome-beta", {
      +        "linux": import_path.default.join(import_os.default.homedir(), ".config", "google-chrome-beta"),
      +        "darwin": import_path.default.join(import_os.default.homedir(), "Library", "Application Support", "Google", "Chrome Beta"),
      +        "win32": import_path.default.join(process.env.LOCALAPPDATA || import_path.default.join(import_os.default.homedir(), "AppData", "Local"), "Google", "Chrome Beta", "User Data")
      +      }],
      +      ["chrome-dev", {
      +        "linux": import_path.default.join(import_os.default.homedir(), ".config", "google-chrome-unstable"),
      +        "darwin": import_path.default.join(import_os.default.homedir(), "Library", "Application Support", "Google", "Chrome Dev"),
      +        "win32": import_path.default.join(process.env.LOCALAPPDATA || import_path.default.join(import_os.default.homedir(), "AppData", "Local"), "Google", "Chrome Dev", "User Data")
      +      }],
      +      ["chrome-canary", {
      +        "linux": import_path.default.join(import_os.default.homedir(), ".config", "google-chrome-canary"),
      +        "darwin": import_path.default.join(import_os.default.homedir(), "Library", "Application Support", "Google", "Chrome Canary"),
      +        "win32": import_path.default.join(process.env.LOCALAPPDATA || import_path.default.join(import_os.default.homedir(), "AppData", "Local"), "Google", "Chrome SxS", "User Data")
      +      }],
      +      ["msedge", {
      +        "linux": import_path.default.join(import_os.default.homedir(), ".config", "microsoft-edge"),
      +        "darwin": import_path.default.join(import_os.default.homedir(), "Library", "Application Support", "Microsoft Edge"),
      +        "win32": import_path.default.join(process.env.LOCALAPPDATA || import_path.default.join(import_os.default.homedir(), "AppData", "Local"), "Microsoft", "Edge", "User Data")
      +      }],
      +      ["msedge-beta", {
      +        "linux": import_path.default.join(import_os.default.homedir(), ".config", "microsoft-edge-beta"),
      +        "darwin": import_path.default.join(import_os.default.homedir(), "Library", "Application Support", "Microsoft Edge Beta"),
      +        "win32": import_path.default.join(process.env.LOCALAPPDATA || import_path.default.join(import_os.default.homedir(), "AppData", "Local"), "Microsoft", "Edge Beta", "User Data")
      +      }],
      +      ["msedge-dev", {
      +        "linux": import_path.default.join(import_os.default.homedir(), ".config", "microsoft-edge-dev"),
      +        "darwin": import_path.default.join(import_os.default.homedir(), "Library", "Application Support", "Microsoft Edge Dev"),
      +        "win32": import_path.default.join(process.env.LOCALAPPDATA || import_path.default.join(import_os.default.homedir(), "AppData", "Local"), "Microsoft", "Edge Dev", "User Data")
      +      }],
      +      ["msedge-canary", {
      +        "linux": import_path.default.join(import_os.default.homedir(), ".config", "microsoft-edge-canary"),
      +        "darwin": import_path.default.join(import_os.default.homedir(), "Library", "Application Support", "Microsoft Edge Canary"),
      +        "win32": import_path.default.join(process.env.LOCALAPPDATA || import_path.default.join(import_os.default.homedir(), "AppData", "Local"), "Microsoft", "Edge SxS", "User Data")
      +      }]
      +    ]);
      +  }
      +});
      +
      +// packages/utils/third_party/pixelmatch.js
      +var require_pixelmatch = __commonJS({
      +  "packages/utils/third_party/pixelmatch.js"(exports2, module2) {
      +    "use strict";
      +    module2.exports = pixelmatch2;
      +    var defaultOptions = {
      +      threshold: 0.1,
      +      // matching threshold (0 to 1); smaller is more sensitive
      +      includeAA: false,
      +      // whether to skip anti-aliasing detection
      +      alpha: 0.1,
      +      // opacity of original image in diff output
      +      aaColor: [255, 255, 0],
      +      // color of anti-aliased pixels in diff output
      +      diffColor: [255, 0, 0],
      +      // color of different pixels in diff output
      +      diffColorAlt: null,
      +      // whether to detect dark on light differences between img1 and img2 and set an alternative color to differentiate between the two
      +      diffMask: false
      +      // draw the diff over a transparent background (a mask)
      +    };
      +    function pixelmatch2(img1, img2, output, width, height, options) {
      +      if (!isPixelData(img1) || !isPixelData(img2) || output && !isPixelData(output))
      +        throw new Error("Image data: Uint8Array, Uint8ClampedArray or Buffer expected.");
      +      if (img1.length !== img2.length || output && output.length !== img1.length)
      +        throw new Error("Image sizes do not match.");
      +      if (img1.length !== width * height * 4) throw new Error("Image data size does not match width/height.");
      +      options = Object.assign({}, defaultOptions, options);
      +      const len = width * height;
      +      const a32 = new Uint32Array(img1.buffer, img1.byteOffset, len);
      +      const b32 = new Uint32Array(img2.buffer, img2.byteOffset, len);
      +      let identical = true;
      +      for (let i = 0; i < len; i++) {
      +        if (a32[i] !== b32[i]) {
      +          identical = false;
      +          break;
      +        }
      +      }
      +      if (identical) {
      +        if (output && !options.diffMask) {
      +          for (let i = 0; i < len; i++) drawGrayPixel(img1, 4 * i, options.alpha, output);
      +        }
      +        return 0;
      +      }
      +      const maxDelta = 35215 * options.threshold * options.threshold;
      +      let diff2 = 0;
      +      for (let y = 0; y < height; y++) {
      +        for (let x = 0; x < width; x++) {
      +          const pos = (y * width + x) * 4;
      +          const delta = colorDelta(img1, img2, pos, pos);
      +          if (Math.abs(delta) > maxDelta) {
      +            if (!options.includeAA && (antialiased(img1, x, y, width, height, img2) || antialiased(img2, x, y, width, height, img1))) {
      +              if (output && !options.diffMask) drawPixel2(output, pos, ...options.aaColor);
      +            } else {
      +              if (output) {
      +                drawPixel2(output, pos, ...delta < 0 && options.diffColorAlt || options.diffColor);
      +              }
      +              diff2++;
      +            }
      +          } else if (output) {
      +            if (!options.diffMask) drawGrayPixel(img1, pos, options.alpha, output);
      +          }
      +        }
      +      }
      +      return diff2;
      +    }
      +    function isPixelData(arr) {
      +      return ArrayBuffer.isView(arr) && arr.constructor.BYTES_PER_ELEMENT === 1;
      +    }
      +    function antialiased(img, x1, y1, width, height, img2) {
      +      const x0 = Math.max(x1 - 1, 0);
      +      const y0 = Math.max(y1 - 1, 0);
      +      const x2 = Math.min(x1 + 1, width - 1);
      +      const y2 = Math.min(y1 + 1, height - 1);
      +      const pos = (y1 * width + x1) * 4;
      +      let zeroes = x1 === x0 || x1 === x2 || y1 === y0 || y1 === y2 ? 1 : 0;
      +      let min = 0;
      +      let max = 0;
      +      let minX, minY, maxX, maxY;
      +      for (let x = x0; x <= x2; x++) {
      +        for (let y = y0; y <= y2; y++) {
      +          if (x === x1 && y === y1) continue;
      +          const delta = colorDelta(img, img, pos, (y * width + x) * 4, true);
      +          if (delta === 0) {
      +            zeroes++;
      +            if (zeroes > 2) return false;
      +          } else if (delta < min) {
      +            min = delta;
      +            minX = x;
      +            minY = y;
      +          } else if (delta > max) {
      +            max = delta;
      +            maxX = x;
      +            maxY = y;
      +          }
      +        }
      +      }
      +      if (min === 0 || max === 0) return false;
      +      return hasManySiblings(img, minX, minY, width, height) && hasManySiblings(img2, minX, minY, width, height) || hasManySiblings(img, maxX, maxY, width, height) && hasManySiblings(img2, maxX, maxY, width, height);
      +    }
      +    function hasManySiblings(img, x1, y1, width, height) {
      +      const x0 = Math.max(x1 - 1, 0);
      +      const y0 = Math.max(y1 - 1, 0);
      +      const x2 = Math.min(x1 + 1, width - 1);
      +      const y2 = Math.min(y1 + 1, height - 1);
      +      const pos = (y1 * width + x1) * 4;
      +      let zeroes = x1 === x0 || x1 === x2 || y1 === y0 || y1 === y2 ? 1 : 0;
      +      for (let x = x0; x <= x2; x++) {
      +        for (let y = y0; y <= y2; y++) {
      +          if (x === x1 && y === y1) continue;
      +          const pos2 = (y * width + x) * 4;
      +          if (img[pos] === img[pos2] && img[pos + 1] === img[pos2 + 1] && img[pos + 2] === img[pos2 + 2] && img[pos + 3] === img[pos2 + 3]) zeroes++;
      +          if (zeroes > 2) return true;
      +        }
      +      }
      +      return false;
      +    }
      +    function colorDelta(img1, img2, k, m, yOnly) {
      +      let r1 = img1[k + 0];
      +      let g1 = img1[k + 1];
      +      let b1 = img1[k + 2];
      +      let a1 = img1[k + 3];
      +      let r2 = img2[m + 0];
      +      let g2 = img2[m + 1];
      +      let b2 = img2[m + 2];
      +      let a2 = img2[m + 3];
      +      if (a1 === a2 && r1 === r2 && g1 === g2 && b1 === b2) return 0;
      +      if (a1 < 255) {
      +        a1 /= 255;
      +        r1 = blend(r1, a1);
      +        g1 = blend(g1, a1);
      +        b1 = blend(b1, a1);
      +      }
      +      if (a2 < 255) {
      +        a2 /= 255;
      +        r2 = blend(r2, a2);
      +        g2 = blend(g2, a2);
      +        b2 = blend(b2, a2);
      +      }
      +      const y1 = rgb2y(r1, g1, b1);
      +      const y2 = rgb2y(r2, g2, b2);
      +      const y = y1 - y2;
      +      if (yOnly) return y;
      +      const i = rgb2i(r1, g1, b1) - rgb2i(r2, g2, b2);
      +      const q = rgb2q(r1, g1, b1) - rgb2q(r2, g2, b2);
      +      const delta = 0.5053 * y * y + 0.299 * i * i + 0.1957 * q * q;
      +      return y1 > y2 ? -delta : delta;
      +    }
      +    function rgb2y(r, g, b) {
      +      return r * 0.29889531 + g * 0.58662247 + b * 0.11448223;
      +    }
      +    function rgb2i(r, g, b) {
      +      return r * 0.59597799 - g * 0.2741761 - b * 0.32180189;
      +    }
      +    function rgb2q(r, g, b) {
      +      return r * 0.21147017 - g * 0.52261711 + b * 0.31114694;
      +    }
      +    function blend(c, a) {
      +      return 255 + (c - 255) * a;
      +    }
      +    function drawPixel2(output, pos, r, g, b) {
      +      output[pos + 0] = r;
      +      output[pos + 1] = g;
      +      output[pos + 2] = b;
      +      output[pos + 3] = 255;
      +    }
      +    function drawGrayPixel(img, i, alpha, output) {
      +      const r = img[i + 0];
      +      const g = img[i + 1];
      +      const b = img[i + 2];
      +      const val = blend(rgb2y(r, g, b), alpha * img[i + 3] / 255);
      +      drawPixel2(output, i, val, val, val);
      +    }
      +  }
      +});
      +
      +// packages/utils/image_tools/colorUtils.ts
      +function blendWithWhite(c, a) {
      +  return 255 + (c - 255) * a;
      +}
      +function rgb2gray(r, g, b) {
      +  return 77 * r + 150 * g + 29 * b + 128 >> 8;
      +}
      +function colorDeltaE94(rgb1, rgb2) {
      +  const [l1, a1, b1] = xyz2lab(srgb2xyz(rgb1));
      +  const [l2, a2, b2] = xyz2lab(srgb2xyz(rgb2));
      +  const deltaL = l1 - l2;
      +  const deltaA = a1 - a2;
      +  const deltaB = b1 - b2;
      +  const c1 = Math.sqrt(a1 ** 2 + b1 ** 2);
      +  const c2 = Math.sqrt(a2 ** 2 + b2 ** 2);
      +  const deltaC = c1 - c2;
      +  let deltaH = deltaA ** 2 + deltaB ** 2 - deltaC ** 2;
      +  deltaH = deltaH < 0 ? 0 : Math.sqrt(deltaH);
      +  const k1 = 0.045;
      +  const k2 = 0.015;
      +  const kL = 1;
      +  const kC = 1;
      +  const kH = 1;
      +  const sC = 1 + k1 * c1;
      +  const sH = 1 + k2 * c1;
      +  const sL = 1;
      +  return Math.sqrt((deltaL / sL / kL) ** 2 + (deltaC / sC / kC) ** 2 + (deltaH / sH / kH) ** 2);
      +}
      +function srgb2xyz(rgb) {
      +  let r = rgb[0] / 255;
      +  let g = rgb[1] / 255;
      +  let b = rgb[2] / 255;
      +  r = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92;
      +  g = g > 0.04045 ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92;
      +  b = b > 0.04045 ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92;
      +  return [
      +    r * 0.4124 + g * 0.3576 + b * 0.1805,
      +    r * 0.2126 + g * 0.7152 + b * 0.0722,
      +    r * 0.0193 + g * 0.1192 + b * 0.9505
      +  ];
      +}
      +function xyz2lab(xyz) {
      +  const x = xyz[0] / 0.950489;
      +  const y = xyz[1];
      +  const z31 = xyz[2] / 1.08884;
      +  const fx = x > sigma_pow3 ? x ** (1 / 3) : x / 3 / sigma_pow2 + 4 / 29;
      +  const fy = y > sigma_pow3 ? y ** (1 / 3) : y / 3 / sigma_pow2 + 4 / 29;
      +  const fz = z31 > sigma_pow3 ? z31 ** (1 / 3) : z31 / 3 / sigma_pow2 + 4 / 29;
      +  const l = 116 * fy - 16;
      +  const a = 500 * (fx - fy);
      +  const b = 200 * (fy - fz);
      +  return [l, a, b];
      +}
      +var sigma_pow2, sigma_pow3;
      +var init_colorUtils = __esm({
      +  "packages/utils/image_tools/colorUtils.ts"() {
      +    "use strict";
      +    sigma_pow2 = 6 * 6 / 29 / 29;
      +    sigma_pow3 = 6 * 6 * 6 / 29 / 29 / 29;
      +  }
      +});
      +
      +// packages/utils/image_tools/imageChannel.ts
      +var ImageChannel;
      +var init_imageChannel = __esm({
      +  "packages/utils/image_tools/imageChannel.ts"() {
      +    "use strict";
      +    init_colorUtils();
      +    ImageChannel = class _ImageChannel {
      +      static intoRGB(width, height, data, options = {}) {
      +        const {
      +          paddingSize = 0,
      +          paddingColorOdd = [255, 0, 255],
      +          paddingColorEven = [0, 255, 0]
      +        } = options;
      +        const newWidth = width + 2 * paddingSize;
      +        const newHeight = height + 2 * paddingSize;
      +        const r = new Uint8Array(newWidth * newHeight);
      +        const g = new Uint8Array(newWidth * newHeight);
      +        const b = new Uint8Array(newWidth * newHeight);
      +        for (let y = 0; y < newHeight; ++y) {
      +          for (let x = 0; x < newWidth; ++x) {
      +            const index = y * newWidth + x;
      +            if (y >= paddingSize && y < newHeight - paddingSize && x >= paddingSize && x < newWidth - paddingSize) {
      +              const offset = ((y - paddingSize) * width + (x - paddingSize)) * 4;
      +              const alpha = data[offset + 3] === 255 ? 1 : data[offset + 3] / 255;
      +              r[index] = blendWithWhite(data[offset], alpha);
      +              g[index] = blendWithWhite(data[offset + 1], alpha);
      +              b[index] = blendWithWhite(data[offset + 2], alpha);
      +            } else {
      +              const color = (y + x) % 2 === 0 ? paddingColorEven : paddingColorOdd;
      +              r[index] = color[0];
      +              g[index] = color[1];
      +              b[index] = color[2];
      +            }
      +          }
      +        }
      +        return [
      +          new _ImageChannel(newWidth, newHeight, r),
      +          new _ImageChannel(newWidth, newHeight, g),
      +          new _ImageChannel(newWidth, newHeight, b)
      +        ];
      +      }
      +      constructor(width, height, data) {
      +        this.data = data;
      +        this.width = width;
      +        this.height = height;
      +      }
      +      get(x, y) {
      +        return this.data[y * this.width + x];
      +      }
      +      boundXY(x, y) {
      +        return [
      +          Math.min(Math.max(x, 0), this.width - 1),
      +          Math.min(Math.max(y, 0), this.height - 1)
      +        ];
      +      }
      +    };
      +  }
      +});
      +
      +// packages/utils/image_tools/stats.ts
      +function ssim(stats2, x1, y1, x2, y2) {
      +  const mean1 = stats2.meanC1(x1, y1, x2, y2);
      +  const mean2 = stats2.meanC2(x1, y1, x2, y2);
      +  const var1 = stats2.varianceC1(x1, y1, x2, y2);
      +  const var2 = stats2.varianceC2(x1, y1, x2, y2);
      +  const cov = stats2.covariance(x1, y1, x2, y2);
      +  const c1 = (0.01 * DYNAMIC_RANGE) ** 2;
      +  const c2 = (0.03 * DYNAMIC_RANGE) ** 2;
      +  return (2 * mean1 * mean2 + c1) * (2 * cov + c2) / (mean1 ** 2 + mean2 ** 2 + c1) / (var1 + var2 + c2);
      +}
      +var DYNAMIC_RANGE, FastStats;
      +var init_stats = __esm({
      +  "packages/utils/image_tools/stats.ts"() {
      +    "use strict";
      +    DYNAMIC_RANGE = 2 ** 8 - 1;
      +    FastStats = class {
      +      constructor(c1, c2) {
      +        this.c1 = c1;
      +        this.c2 = c2;
      +        const { width, height } = c1;
      +        this._partialSumC1 = new Array(width * height);
      +        this._partialSumC2 = new Array(width * height);
      +        this._partialSumSq1 = new Array(width * height);
      +        this._partialSumSq2 = new Array(width * height);
      +        this._partialSumMult = new Array(width * height);
      +        const recalc = (mx, idx, initial, x, y) => {
      +          mx[idx] = initial;
      +          if (y > 0)
      +            mx[idx] += mx[(y - 1) * width + x];
      +          if (x > 0)
      +            mx[idx] += mx[y * width + x - 1];
      +          if (x > 0 && y > 0)
      +            mx[idx] -= mx[(y - 1) * width + x - 1];
      +        };
      +        for (let y = 0; y < height; ++y) {
      +          for (let x = 0; x < width; ++x) {
      +            const idx = y * width + x;
      +            recalc(this._partialSumC1, idx, this.c1.data[idx], x, y);
      +            recalc(this._partialSumC2, idx, this.c2.data[idx], x, y);
      +            recalc(this._partialSumSq1, idx, this.c1.data[idx] * this.c1.data[idx], x, y);
      +            recalc(this._partialSumSq2, idx, this.c2.data[idx] * this.c2.data[idx], x, y);
      +            recalc(this._partialSumMult, idx, this.c1.data[idx] * this.c2.data[idx], x, y);
      +          }
      +        }
      +      }
      +      _sum(partialSum, x1, y1, x2, y2) {
      +        const width = this.c1.width;
      +        let result2 = partialSum[y2 * width + x2];
      +        if (y1 > 0)
      +          result2 -= partialSum[(y1 - 1) * width + x2];
      +        if (x1 > 0)
      +          result2 -= partialSum[y2 * width + x1 - 1];
      +        if (x1 > 0 && y1 > 0)
      +          result2 += partialSum[(y1 - 1) * width + x1 - 1];
      +        return result2;
      +      }
      +      meanC1(x1, y1, x2, y2) {
      +        const N = (y2 - y1 + 1) * (x2 - x1 + 1);
      +        return this._sum(this._partialSumC1, x1, y1, x2, y2) / N;
      +      }
      +      meanC2(x1, y1, x2, y2) {
      +        const N = (y2 - y1 + 1) * (x2 - x1 + 1);
      +        return this._sum(this._partialSumC2, x1, y1, x2, y2) / N;
      +      }
      +      varianceC1(x1, y1, x2, y2) {
      +        const N = (y2 - y1 + 1) * (x2 - x1 + 1);
      +        return (this._sum(this._partialSumSq1, x1, y1, x2, y2) - this._sum(this._partialSumC1, x1, y1, x2, y2) ** 2 / N) / N;
      +      }
      +      varianceC2(x1, y1, x2, y2) {
      +        const N = (y2 - y1 + 1) * (x2 - x1 + 1);
      +        return (this._sum(this._partialSumSq2, x1, y1, x2, y2) - this._sum(this._partialSumC2, x1, y1, x2, y2) ** 2 / N) / N;
      +      }
      +      covariance(x1, y1, x2, y2) {
      +        const N = (y2 - y1 + 1) * (x2 - x1 + 1);
      +        return (this._sum(this._partialSumMult, x1, y1, x2, y2) - this._sum(this._partialSumC1, x1, y1, x2, y2) * this._sum(this._partialSumC2, x1, y1, x2, y2) / N) / N;
      +      }
      +    };
      +  }
      +});
      +
      +// packages/utils/image_tools/compare.ts
      +function drawPixel(width, data, x, y, r, g, b) {
      +  const idx = (y * width + x) * 4;
      +  data[idx + 0] = r;
      +  data[idx + 1] = g;
      +  data[idx + 2] = b;
      +  data[idx + 3] = 255;
      +}
      +function compare(actual, expected, diff2, width, height, options = {}) {
      +  const {
      +    maxColorDeltaE94 = 1
      +  } = options;
      +  const paddingSize = Math.max(VARIANCE_WINDOW_RADIUS, SSIM_WINDOW_RADIUS);
      +  const paddingColorEven = [255, 0, 255];
      +  const paddingColorOdd = [0, 255, 0];
      +  const [r1, g1, b1] = ImageChannel.intoRGB(width, height, expected, {
      +    paddingSize,
      +    paddingColorEven,
      +    paddingColorOdd
      +  });
      +  const [r2, g2, b2] = ImageChannel.intoRGB(width, height, actual, {
      +    paddingSize,
      +    paddingColorEven,
      +    paddingColorOdd
      +  });
      +  const noop = (x, y) => {
      +  };
      +  const drawRedPixel = diff2 ? (x, y) => drawPixel(width, diff2, x - paddingSize, y - paddingSize, 255, 0, 0) : noop;
      +  const drawYellowPixel = diff2 ? (x, y) => drawPixel(width, diff2, x - paddingSize, y - paddingSize, 255, 255, 0) : noop;
      +  const drawGrayPixel = diff2 ? (x, y) => {
      +    const gray = rgb2gray(r1.get(x, y), g1.get(x, y), b1.get(x, y));
      +    const value2 = blendWithWhite(gray, 0.1);
      +    drawPixel(width, diff2, x - paddingSize, y - paddingSize, value2, value2, value2);
      +  } : noop;
      +  let fastR;
      +  let fastG;
      +  let fastB;
      +  let diffCount = 0;
      +  for (let y = paddingSize; y < r1.height - paddingSize; ++y) {
      +    for (let x = paddingSize; x < r1.width - paddingSize; ++x) {
      +      if (r1.get(x, y) === r2.get(x, y) && g1.get(x, y) === g2.get(x, y) && b1.get(x, y) === b2.get(x, y)) {
      +        drawGrayPixel(x, y);
      +        continue;
      +      }
      +      const delta = colorDeltaE94(
      +        [r1.get(x, y), g1.get(x, y), b1.get(x, y)],
      +        [r2.get(x, y), g2.get(x, y), b2.get(x, y)]
      +      );
      +      if (delta <= maxColorDeltaE94) {
      +        drawGrayPixel(x, y);
      +        continue;
      +      }
      +      if (!fastR || !fastG || !fastB) {
      +        fastR = new FastStats(r1, r2);
      +        fastG = new FastStats(g1, g2);
      +        fastB = new FastStats(b1, b2);
      +      }
      +      const [varX1, varY1] = r1.boundXY(x - VARIANCE_WINDOW_RADIUS, y - VARIANCE_WINDOW_RADIUS);
      +      const [varX2, varY2] = r1.boundXY(x + VARIANCE_WINDOW_RADIUS, y + VARIANCE_WINDOW_RADIUS);
      +      const var1 = fastR.varianceC1(varX1, varY1, varX2, varY2) + fastG.varianceC1(varX1, varY1, varX2, varY2) + fastB.varianceC1(varX1, varY1, varX2, varY2);
      +      const var2 = fastR.varianceC2(varX1, varY1, varX2, varY2) + fastG.varianceC2(varX1, varY1, varX2, varY2) + fastB.varianceC2(varX1, varY1, varX2, varY2);
      +      if (var1 === 0 || var2 === 0) {
      +        drawRedPixel(x, y);
      +        ++diffCount;
      +        continue;
      +      }
      +      const [ssimX1, ssimY1] = r1.boundXY(x - SSIM_WINDOW_RADIUS, y - SSIM_WINDOW_RADIUS);
      +      const [ssimX2, ssimY2] = r1.boundXY(x + SSIM_WINDOW_RADIUS, y + SSIM_WINDOW_RADIUS);
      +      const ssimRGB = (ssim(fastR, ssimX1, ssimY1, ssimX2, ssimY2) + ssim(fastG, ssimX1, ssimY1, ssimX2, ssimY2) + ssim(fastB, ssimX1, ssimY1, ssimX2, ssimY2)) / 3;
      +      const isAntialiased = ssimRGB >= 0.99;
      +      if (isAntialiased) {
      +        drawYellowPixel(x, y);
      +      } else {
      +        drawRedPixel(x, y);
      +        ++diffCount;
      +      }
      +    }
      +  }
      +  return diffCount;
      +}
      +var SSIM_WINDOW_RADIUS, VARIANCE_WINDOW_RADIUS;
      +var init_compare = __esm({
      +  "packages/utils/image_tools/compare.ts"() {
      +    "use strict";
      +    init_colorUtils();
      +    init_imageChannel();
      +    init_stats();
      +    SSIM_WINDOW_RADIUS = 15;
      +    VARIANCE_WINDOW_RADIUS = 1;
      +  }
      +});
      +
      +// packages/utils/comparators.ts
      +function getComparator(mimeType) {
      +  if (mimeType === "image/png")
      +    return compareImages.bind(null, "image/png");
      +  if (mimeType === "image/jpeg")
      +    return compareImages.bind(null, "image/jpeg");
      +  if (mimeType === "text/plain")
      +    return compareText;
      +  return compareBuffersOrStrings;
      +}
      +function compareBuffersOrStrings(actualBuffer, expectedBuffer) {
      +  if (typeof actualBuffer === "string")
      +    return compareText(actualBuffer, expectedBuffer);
      +  if (!actualBuffer || !(actualBuffer instanceof Buffer))
      +    return { errorMessage: "Actual result should be a Buffer or a string." };
      +  if (Buffer.compare(actualBuffer, expectedBuffer))
      +    return { errorMessage: "Buffers differ" };
      +  return null;
      +}
      +function compareImages(mimeType, actualBuffer, expectedBuffer, options = {}) {
      +  if (!actualBuffer || !(actualBuffer instanceof Buffer))
      +    return { errorMessage: "Actual result should be a Buffer." };
      +  validateBuffer(expectedBuffer, mimeType);
      +  let actual = mimeType === "image/png" ? PNG.sync.read(actualBuffer) : jpegjs.decode(actualBuffer, { maxMemoryUsageInMB: JPEG_JS_MAX_BUFFER_SIZE_IN_MB });
      +  let expected = mimeType === "image/png" ? PNG.sync.read(expectedBuffer) : jpegjs.decode(expectedBuffer, { maxMemoryUsageInMB: JPEG_JS_MAX_BUFFER_SIZE_IN_MB });
      +  const size = { width: Math.max(expected.width, actual.width), height: Math.max(expected.height, actual.height) };
      +  let sizesMismatchError = "";
      +  if (expected.width !== actual.width || expected.height !== actual.height) {
      +    sizesMismatchError = `Expected an image ${expected.width}px by ${expected.height}px, received ${actual.width}px by ${actual.height}px. `;
      +    actual = padImageToSize(actual, size);
      +    expected = padImageToSize(expected, size);
      +  }
      +  const diff2 = new PNG({ width: size.width, height: size.height });
      +  let count;
      +  if (options.comparator === "ssim-cie94") {
      +    count = compare(expected.data, actual.data, diff2.data, size.width, size.height, {
      +      // All ΔE* formulae are originally designed to have the difference of 1.0 stand for a "just noticeable difference" (JND).
      +      // See https://en.wikipedia.org/wiki/Color_difference#CIELAB_%CE%94E*
      +      maxColorDeltaE94: 1
      +    });
      +  } else if ((options.comparator ?? "pixelmatch") === "pixelmatch") {
      +    count = (0, import_pixelmatch.default)(expected.data, actual.data, diff2.data, size.width, size.height, {
      +      threshold: options.threshold ?? 0.2
      +    });
      +  } else {
      +    throw new Error(`Configuration specifies unknown comparator "${options.comparator}"`);
      +  }
      +  const maxDiffPixels1 = options.maxDiffPixels;
      +  const maxDiffPixels2 = options.maxDiffPixelRatio !== void 0 ? expected.width * expected.height * options.maxDiffPixelRatio : void 0;
      +  let maxDiffPixels;
      +  if (maxDiffPixels1 !== void 0 && maxDiffPixels2 !== void 0)
      +    maxDiffPixels = Math.min(maxDiffPixels1, maxDiffPixels2);
      +  else
      +    maxDiffPixels = maxDiffPixels1 ?? maxDiffPixels2 ?? 0;
      +  const ratio = Math.ceil(count / (expected.width * expected.height) * 100) / 100;
      +  const pixelsMismatchError = count > maxDiffPixels ? `${count} pixels (ratio ${ratio.toFixed(2)} of all image pixels) are different.` : "";
      +  if (pixelsMismatchError || sizesMismatchError)
      +    return { errorMessage: sizesMismatchError + pixelsMismatchError, diff: PNG.sync.write(diff2) };
      +  return null;
      +}
      +function validateBuffer(buffer, mimeType) {
      +  if (mimeType === "image/png") {
      +    const pngMagicNumber = [137, 80, 78, 71, 13, 10, 26, 10];
      +    if (buffer.length < pngMagicNumber.length || !pngMagicNumber.every((byte, index) => buffer[index] === byte))
      +      throw new Error("Could not decode expected image as PNG.");
      +  } else if (mimeType === "image/jpeg") {
      +    const jpegMagicNumber = [255, 216];
      +    if (buffer.length < jpegMagicNumber.length || !jpegMagicNumber.every((byte, index) => buffer[index] === byte))
      +      throw new Error("Could not decode expected image as JPEG.");
      +  }
      +}
      +function compareText(actual, expectedBuffer) {
      +  if (typeof actual !== "string")
      +    return { errorMessage: "Actual result should be a string" };
      +  let expected = expectedBuffer.toString("utf-8");
      +  if (expected === actual)
      +    return null;
      +  if (!actual.endsWith("\n"))
      +    actual += "\n";
      +  if (!expected.endsWith("\n"))
      +    expected += "\n";
      +  const lines = diff.createPatch("file", expected, actual, void 0, void 0, { context: 5 }).split("\n");
      +  const coloredLines = lines.slice(4).map((line) => {
      +    if (line.startsWith("-"))
      +      return colors.green(line);
      +    if (line.startsWith("+"))
      +      return colors.red(line);
      +    if (line.startsWith("@@"))
      +      return colors.dim(line);
      +    return line;
      +  });
      +  const errorMessage = coloredLines.join("\n");
      +  return { errorMessage };
      +}
      +var import_pixelmatch, jpegjs, colors, diff, PNG, JPEG_JS_MAX_BUFFER_SIZE_IN_MB;
      +var init_comparators = __esm({
      +  "packages/utils/comparators.ts"() {
      +    "use strict";
      +    init_imageUtils();
      +    import_pixelmatch = __toESM(require_pixelmatch());
      +    init_compare();
      +    jpegjs = require("./utilsBundle").jpegjs;
      +    colors = require("./utilsBundle").colors;
      +    diff = require("./utilsBundle").diff;
      +    ({ PNG } = require("./utilsBundle"));
      +    JPEG_JS_MAX_BUFFER_SIZE_IN_MB = 5 * 1024;
      +  }
      +});
      +
      +// packages/utils/crypto.ts
      +function createGuid() {
      +  return import_crypto.default.randomBytes(16).toString("hex");
      +}
      +function calculateSha1(buffer) {
      +  const hash = import_crypto.default.createHash("sha1");
      +  hash.update(buffer);
      +  return hash.digest("hex");
      +}
      +function encodeBase128(value2) {
      +  const bytes = [];
      +  do {
      +    let byte = value2 & 127;
      +    value2 >>>= 7;
      +    if (bytes.length > 0)
      +      byte |= 128;
      +    bytes.push(byte);
      +  } while (value2 > 0);
      +  return Buffer.from(bytes.reverse());
      +}
      +function generateSelfSignedCertificate() {
      +  const { privateKey, publicKey } = import_crypto.default.generateKeyPairSync("rsa", { modulusLength: 2048 });
      +  const publicKeyDer = publicKey.export({ type: "pkcs1", format: "der" });
      +  const oneYearInMilliseconds = 365 * 24 * 60 * 60 * 1e3;
      +  const notBefore = new Date((/* @__PURE__ */ new Date()).getTime() - oneYearInMilliseconds);
      +  const notAfter = new Date((/* @__PURE__ */ new Date()).getTime() + oneYearInMilliseconds);
      +  const tbsCertificate = DER.encodeSequence([
      +    DER.encodeExplicitContextDependent(0, DER.encodeInteger(1)),
      +    // version
      +    DER.encodeInteger(1),
      +    // serialNumber
      +    DER.encodeSequence([
      +      DER.encodeObjectIdentifier("1.2.840.113549.1.1.11"),
      +      // sha256WithRSAEncryption PKCS #1
      +      DER.encodeNull()
      +    ]),
      +    // signature
      +    DER.encodeSequence([
      +      DER.encodeSet([
      +        DER.encodeSequence([
      +          DER.encodeObjectIdentifier("2.5.4.3"),
      +          // commonName X.520 DN component
      +          DER.encodePrintableString("localhost")
      +        ])
      +      ]),
      +      DER.encodeSet([
      +        DER.encodeSequence([
      +          DER.encodeObjectIdentifier("2.5.4.10"),
      +          // organizationName X.520 DN component
      +          DER.encodePrintableString("Playwright Client Certificate Support")
      +        ])
      +      ])
      +    ]),
      +    // issuer
      +    DER.encodeSequence([
      +      DER.encodeDate(notBefore),
      +      // notBefore
      +      DER.encodeDate(notAfter)
      +      // notAfter
      +    ]),
      +    // validity
      +    DER.encodeSequence([
      +      DER.encodeSet([
      +        DER.encodeSequence([
      +          DER.encodeObjectIdentifier("2.5.4.3"),
      +          // commonName X.520 DN component
      +          DER.encodePrintableString("localhost")
      +        ])
      +      ]),
      +      DER.encodeSet([
      +        DER.encodeSequence([
      +          DER.encodeObjectIdentifier("2.5.4.10"),
      +          // organizationName X.520 DN component
      +          DER.encodePrintableString("Playwright Client Certificate Support")
      +        ])
      +      ])
      +    ]),
      +    // subject
      +    DER.encodeSequence([
      +      DER.encodeSequence([
      +        DER.encodeObjectIdentifier("1.2.840.113549.1.1.1"),
      +        // rsaEncryption PKCS #1
      +        DER.encodeNull()
      +      ]),
      +      DER.encodeBitString(publicKeyDer)
      +    ])
      +    // SubjectPublicKeyInfo
      +  ]);
      +  const signature = import_crypto.default.sign("sha256", tbsCertificate, privateKey);
      +  const certificate = DER.encodeSequence([
      +    tbsCertificate,
      +    DER.encodeSequence([
      +      DER.encodeObjectIdentifier("1.2.840.113549.1.1.11"),
      +      // sha256WithRSAEncryption PKCS #1
      +      DER.encodeNull()
      +    ]),
      +    DER.encodeBitString(signature)
      +  ]);
      +  const certPem = [
      +    "-----BEGIN CERTIFICATE-----",
      +    // Split the base64 string into lines of 64 characters
      +    certificate.toString("base64").match(/.{1,64}/g).join("\n"),
      +    "-----END CERTIFICATE-----"
      +  ].join("\n");
      +  return {
      +    cert: certPem,
      +    key: privateKey.export({ type: "pkcs1", format: "pem" })
      +  };
      +}
      +var import_crypto, DER;
      +var init_crypto = __esm({
      +  "packages/utils/crypto.ts"() {
      +    "use strict";
      +    import_crypto = __toESM(require("crypto"));
      +    init_assert();
      +    DER = class {
      +      static encodeSequence(data) {
      +        return this._encode(48, Buffer.concat(data));
      +      }
      +      static encodeInteger(data) {
      +        assert(data >= -128 && data <= 127);
      +        return this._encode(2, Buffer.from([data]));
      +      }
      +      static encodeObjectIdentifier(oid) {
      +        const parts = oid.split(".").map((v) => Number(v));
      +        const output = [encodeBase128(40 * parts[0] + parts[1])];
      +        for (let i = 2; i < parts.length; i++)
      +          output.push(encodeBase128(parts[i]));
      +        return this._encode(6, Buffer.concat(output));
      +      }
      +      static encodeNull() {
      +        return Buffer.from([5, 0]);
      +      }
      +      static encodeSet(data) {
      +        assert(data.length === 1, "Only one item in the set is supported. We'd need to sort the data to support more.");
      +        return this._encode(49, Buffer.concat(data));
      +      }
      +      static encodeExplicitContextDependent(tag, data) {
      +        return this._encode(160 + tag, data);
      +      }
      +      static encodePrintableString(data) {
      +        return this._encode(19, Buffer.from(data));
      +      }
      +      static encodeBitString(data) {
      +        const unusedBits = 0;
      +        const content = Buffer.concat([Buffer.from([unusedBits]), data]);
      +        return this._encode(3, content);
      +      }
      +      static encodeDate(date) {
      +        const year = date.getUTCFullYear();
      +        const isGeneralizedTime = year >= 2050;
      +        const parts = [
      +          isGeneralizedTime ? year.toString() : year.toString().slice(-2),
      +          (date.getUTCMonth() + 1).toString().padStart(2, "0"),
      +          date.getUTCDate().toString().padStart(2, "0"),
      +          date.getUTCHours().toString().padStart(2, "0"),
      +          date.getUTCMinutes().toString().padStart(2, "0"),
      +          date.getUTCSeconds().toString().padStart(2, "0")
      +        ];
      +        const encodedDate = parts.join("") + "Z";
      +        const tag = isGeneralizedTime ? 24 : 23;
      +        return this._encode(tag, Buffer.from(encodedDate));
      +      }
      +      static _encode(tag, data) {
      +        const lengthBytes = this._encodeLength(data.length);
      +        return Buffer.concat([Buffer.from([tag]), lengthBytes, data]);
      +      }
      +      static _encodeLength(length) {
      +        if (length < 128) {
      +          return Buffer.from([length]);
      +        } else {
      +          const lengthBytes = [];
      +          while (length > 0) {
      +            lengthBytes.unshift(length & 255);
      +            length >>= 8;
      +          }
      +          return Buffer.from([128 | lengthBytes.length, ...lengthBytes]);
      +        }
      +      }
      +    };
      +  }
      +});
      +
      +// packages/utils/env.ts
      +function getFromENV(name) {
      +  let value2 = process.env[name];
      +  value2 = value2 === void 0 ? process.env[`npm_config_${name.toLowerCase()}`] : value2;
      +  value2 = value2 === void 0 ? process.env[`npm_package_config_${name.toLowerCase()}`] : value2;
      +  return value2;
      +}
      +function getAsBooleanFromENV(name, defaultValue) {
      +  const value2 = getFromENV(name);
      +  if (value2 === "false" || value2 === "0")
      +    return false;
      +  if (value2)
      +    return true;
      +  return !!defaultValue;
      +}
      +function getPackageManager() {
      +  const env = process.env.npm_config_user_agent || "";
      +  if (env.includes("yarn"))
      +    return "yarn";
      +  if (env.includes("pnpm"))
      +    return "pnpm";
      +  return "npm";
      +}
      +function getPackageManagerExecCommand() {
      +  const packageManager = getPackageManager();
      +  if (packageManager === "yarn")
      +    return "yarn";
      +  if (packageManager === "pnpm")
      +    return "pnpm exec";
      +  return "npx";
      +}
      +function isLikelyNpxGlobal() {
      +  return process.argv.length >= 2 && process.argv[1].includes("_npx");
      +}
      +function setPlaywrightTestProcessEnv() {
      +  return process.env["PLAYWRIGHT_TEST"] = "1";
      +}
      +function guessClientName() {
      +  if (process.env.CLAUDECODE)
      +    return "Claude Code";
      +  if (process.env.COPILOT_CLI)
      +    return "GitHub Copilot";
      +  return "playwright-cli";
      +}
      +function isCodingAgent() {
      +  return !!process.env.CLAUDECODE || !!process.env.COPILOT_CLI;
      +}
      +var init_env = __esm({
      +  "packages/utils/env.ts"() {
      +    "use strict";
      +  }
      +});
      +
      +// packages/utils/debug.ts
      +function debugMode() {
      +  if (_debugMode === "console")
      +    return "console";
      +  if (_debugMode === "0" || _debugMode === "false")
      +    return "";
      +  return _debugMode ? "inspector" : "";
      +}
      +function isUnderTest() {
      +  return _isUnderTest;
      +}
      +var _debugMode, _isUnderTest;
      +var init_debug = __esm({
      +  "packages/utils/debug.ts"() {
      +    "use strict";
      +    init_env();
      +    _debugMode = getFromENV("PWDEBUG") || "";
      +    _isUnderTest = getAsBooleanFromENV("PWTEST_UNDER_TEST");
      +  }
      +});
      +
      +// packages/utils/debugLogger.ts
      +var import_fs, debug, debugLoggerColorMap, DebugLogger, debugLogger, kLogCount, RecentLogsCollector;
      +var init_debugLogger = __esm({
      +  "packages/utils/debugLogger.ts"() {
      +    "use strict";
      +    import_fs = __toESM(require("fs"));
      +    debug = require("./utilsBundle").debug;
      +    debugLoggerColorMap = {
      +      "api": 45,
      +      // cyan
      +      "protocol": 34,
      +      // green
      +      "install": 34,
      +      // green
      +      "download": 34,
      +      // green
      +      "browser": 0,
      +      // reset
      +      "socks": 92,
      +      // purple
      +      "client-certificates": 92,
      +      // purple
      +      "error": 160,
      +      // red,
      +      "channel": 33,
      +      // blue
      +      "server": 45,
      +      // cyan
      +      "server:channel": 34,
      +      // green
      +      "server:metadata": 33,
      +      // blue,
      +      "recorder": 45
      +      // cyan
      +    };
      +    DebugLogger = class {
      +      constructor() {
      +        this._debuggers = /* @__PURE__ */ new Map();
      +        if (process.env.DEBUG_FILE) {
      +          const ansiRegex2 = new RegExp([
      +            "[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)",
      +            "(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"
      +          ].join("|"), "g");
      +          const stream3 = import_fs.default.createWriteStream(process.env.DEBUG_FILE);
      +          debug.log = (data) => {
      +            stream3.write(data.replace(ansiRegex2, ""));
      +            stream3.write("\n");
      +          };
      +        }
      +      }
      +      log(name, message) {
      +        let cachedDebugger = this._debuggers.get(name);
      +        if (!cachedDebugger) {
      +          cachedDebugger = debug(`pw:${name}`);
      +          this._debuggers.set(name, cachedDebugger);
      +          cachedDebugger.color = debugLoggerColorMap[name] || 0;
      +        }
      +        cachedDebugger(message);
      +      }
      +      isEnabled(name) {
      +        return debug.enabled(`pw:${name}`);
      +      }
      +    };
      +    debugLogger = new DebugLogger();
      +    kLogCount = 150;
      +    RecentLogsCollector = class {
      +      constructor() {
      +        this._logs = [];
      +        this._listeners = [];
      +      }
      +      log(message) {
      +        this._logs.push(message);
      +        if (this._logs.length === kLogCount * 2)
      +          this._logs.splice(0, kLogCount);
      +        for (const listener of this._listeners)
      +          listener(message);
      +      }
      +      recentLogs() {
      +        if (this._logs.length > kLogCount)
      +          return this._logs.slice(-kLogCount);
      +        return this._logs;
      +      }
      +      onMessage(listener) {
      +        for (const message of this._logs)
      +          listener(message);
      +        this._listeners.push(listener);
      +      }
      +    };
      +  }
      +});
      +
      +// packages/utils/eventsHelper.ts
      +var EventsHelper, eventsHelper;
      +var init_eventsHelper = __esm({
      +  "packages/utils/eventsHelper.ts"() {
      +    "use strict";
      +    EventsHelper = class {
      +      static addEventListener(emitter, eventName, handler) {
      +        emitter.on(eventName, handler);
      +        return { emitter, eventName, handler, dispose: async () => {
      +          emitter.removeListener(eventName, handler);
      +        } };
      +      }
      +      static removeEventListeners(listeners) {
      +        for (const listener of listeners)
      +          listener.emitter.removeListener(listener.eventName, listener.handler);
      +        listeners.splice(0, listeners.length);
      +      }
      +    };
      +    eventsHelper = EventsHelper;
      +  }
      +});
      +
      +// packages/utils/fileUtils.ts
      +async function mkdirIfNeeded(filePath) {
      +  await import_fs2.default.promises.mkdir(import_path2.default.dirname(filePath), { recursive: true }).catch(() => {
      +  });
      +}
      +async function removeFolders(dirs) {
      +  return await Promise.all(dirs.map(
      +    (dir) => import_fs2.default.promises.rm(dir, { recursive: true, force: true, maxRetries: 10 }).catch((e) => e)
      +  ));
      +}
      +function canAccessFile(file) {
      +  if (!file)
      +    return false;
      +  try {
      +    import_fs2.default.accessSync(file);
      +    return true;
      +  } catch (e) {
      +    return false;
      +  }
      +}
      +function isWritable(file) {
      +  try {
      +    import_fs2.default.accessSync(file, import_fs2.default.constants.W_OK);
      +    return true;
      +  } catch {
      +    return false;
      +  }
      +}
      +function isSystemDirectory(dir) {
      +  const resolved = import_path2.default.resolve(dir);
      +  if (process.platform === "win32") {
      +    const systemRoot = import_path2.default.resolve(process.env.SystemRoot || "C:\\Windows");
      +    return isPathInside(systemRoot.toLowerCase(), resolved.toLowerCase());
      +  }
      +  return resolved === "/";
      +}
      +async function copyFileAndMakeWritable(from, to) {
      +  await import_fs2.default.promises.copyFile(from, to);
      +  await import_fs2.default.promises.chmod(to, 436);
      +}
      +function addSuffixToFilePath(filePath, suffix) {
      +  const ext = import_path2.default.extname(filePath);
      +  const base = filePath.substring(0, filePath.length - ext.length);
      +  return base + suffix + ext;
      +}
      +function sanitizeForFilePath(s) {
      +  return s.replace(/[\x00-\x2C\x2E-\x2F\x3A-\x40\x5B-\x60\x7B-\x7F]+/g, "-");
      +}
      +function trimLongString(s, length = 100) {
      +  if (s.length <= length)
      +    return s;
      +  const hash = calculateSha1(s);
      +  const middle = `-${hash.substring(0, 5)}-`;
      +  const start3 = Math.floor((length - middle.length) / 2);
      +  const end = length - middle.length - start3;
      +  return s.substring(0, start3) + middle + s.slice(-end);
      +}
      +function isPathInside(root, candidate) {
      +  const resolvedRoot = import_path2.default.resolve(root);
      +  const resolvedCandidate = import_path2.default.resolve(candidate);
      +  if (resolvedCandidate === resolvedRoot)
      +    return true;
      +  return resolvedCandidate.startsWith(resolvedRoot + import_path2.default.sep);
      +}
      +function resolveWithinRoot(root, fileName) {
      +  if (import_path2.default.isAbsolute(fileName))
      +    return null;
      +  const resolvedFile = import_path2.default.resolve(root, fileName);
      +  return isPathInside(root, resolvedFile) ? resolvedFile : null;
      +}
      +function throwingResolveWithinRoot(root, fileName) {
      +  const resolved = resolveWithinRoot(root, fileName);
      +  if (!resolved)
      +    throw new Error(`Path '${fileName}' escapes root directory`);
      +  return resolved;
      +}
      +function toPosixPath(aPath) {
      +  return aPath.split(import_path2.default.sep).join(import_path2.default.posix.sep);
      +}
      +function makeSocketPath(domain, name) {
      +  const userNameHash = calculateSha1(process.env.USERNAME || process.env.USER || "default").slice(0, 8);
      +  if (process.platform === "win32") {
      +    const socketsDir = process.env.PWTEST_SOCKETS_DIR;
      +    const suffix2 = socketsDir ? `-${calculateSha1(socketsDir).slice(0, 8)}` : "";
      +    return `\\\\.\\pipe\\pw-${userNameHash}-${domain}-${name}${suffix2}`;
      +  }
      +  const baseDir = process.env.PWTEST_SOCKETS_DIR || import_path2.default.join(import_os2.default.tmpdir(), `pw-${userNameHash}`);
      +  const dir = import_path2.default.join(baseDir, domain);
      +  const suffix = ".sock";
      +  const maxNameLength = UNIX_SOCKET_PATH_MAX - dir.length - import_path2.default.sep.length - suffix.length;
      +  if (maxNameLength < 1)
      +    throw new Error(`Socket directory path is too long (${dir.length} chars); set PWTEST_SOCKETS_DIR to a shorter location.`);
      +  const fsFriendlyName = trimLongString(sanitizeForFilePath(name), maxNameLength);
      +  const result2 = import_path2.default.join(dir, `${fsFriendlyName}${suffix}`);
      +  import_fs2.default.mkdirSync(dir, { recursive: true });
      +  return result2;
      +}
      +var import_fs2, import_os2, import_path2, existsAsync, UNIX_SOCKET_PATH_MAX;
      +var init_fileUtils = __esm({
      +  "packages/utils/fileUtils.ts"() {
      +    "use strict";
      +    import_fs2 = __toESM(require("fs"));
      +    import_os2 = __toESM(require("os"));
      +    import_path2 = __toESM(require("path"));
      +    init_crypto();
      +    existsAsync = (path59) => new Promise((resolve) => import_fs2.default.stat(path59, (err) => resolve(!err)));
      +    UNIX_SOCKET_PATH_MAX = 103;
      +  }
      +});
      +
      +// packages/utils/linuxUtils.ts
      +function getLinuxDistributionInfoSync() {
      +  if (process.platform !== "linux")
      +    return void 0;
      +  if (!osRelease && !didFailToReadOSRelease) {
      +    try {
      +      const osReleaseText = import_fs3.default.readFileSync("/etc/os-release", "utf8");
      +      const fields = parseOSReleaseText(osReleaseText);
      +      osRelease = {
      +        id: fields.get("id") ?? "",
      +        version: fields.get("version_id") ?? ""
      +      };
      +    } catch (e) {
      +      didFailToReadOSRelease = true;
      +    }
      +  }
      +  return osRelease;
      +}
      +function parseOSReleaseText(osReleaseText) {
      +  const fields = /* @__PURE__ */ new Map();
      +  for (const line of osReleaseText.split("\n")) {
      +    const tokens = line.split("=");
      +    const name = tokens.shift();
      +    let value2 = tokens.join("=").trim();
      +    if (value2.startsWith('"') && value2.endsWith('"'))
      +      value2 = value2.substring(1, value2.length - 1);
      +    if (!name)
      +      continue;
      +    fields.set(name.toLowerCase(), value2);
      +  }
      +  return fields;
      +}
      +var import_fs3, didFailToReadOSRelease, osRelease;
      +var init_linuxUtils = __esm({
      +  "packages/utils/linuxUtils.ts"() {
      +    "use strict";
      +    import_fs3 = __toESM(require("fs"));
      +    didFailToReadOSRelease = false;
      +  }
      +});
      +
      +// packages/utils/hostPlatform.ts
      +function calculatePlatform() {
      +  if (process.env.PLAYWRIGHT_HOST_PLATFORM_OVERRIDE) {
      +    return {
      +      hostPlatform: process.env.PLAYWRIGHT_HOST_PLATFORM_OVERRIDE,
      +      isOfficiallySupportedPlatform: false
      +    };
      +  }
      +  const platform = import_os3.default.platform();
      +  if (platform === "darwin") {
      +    const ver = import_os3.default.release().split(".").map((a) => parseInt(a, 10));
      +    let macVersion = "";
      +    if (ver[0] < 18) {
      +      macVersion = "mac10.13";
      +    } else if (ver[0] === 18) {
      +      macVersion = "mac10.14";
      +    } else if (ver[0] === 19) {
      +      macVersion = "mac10.15";
      +    } else if (ver[0] < 25) {
      +      macVersion = "mac" + (ver[0] - 9);
      +      if (import_os3.default.cpus().some((cpu) => cpu.model.includes("Apple")))
      +        macVersion += "-arm64";
      +    } else {
      +      const LAST_STABLE_MACOS_MAJOR_VERSION = 26;
      +      macVersion = "mac" + Math.min(ver[0] + 1, LAST_STABLE_MACOS_MAJOR_VERSION);
      +      if (import_os3.default.cpus().some((cpu) => cpu.model.includes("Apple")))
      +        macVersion += "-arm64";
      +    }
      +    return { hostPlatform: macVersion, isOfficiallySupportedPlatform: true };
      +  }
      +  if (platform === "linux") {
      +    if (!["x64", "arm64"].includes(import_os3.default.arch()))
      +      return { hostPlatform: "", isOfficiallySupportedPlatform: false };
      +    const archSuffix = "-" + import_os3.default.arch();
      +    const distroInfo = getLinuxDistributionInfoSync();
      +    if (distroInfo?.id === "ubuntu" || distroInfo?.id === "pop" || distroInfo?.id === "neon" || distroInfo?.id === "tuxedo") {
      +      const isUbuntu = distroInfo?.id === "ubuntu";
      +      const version3 = distroInfo?.version;
      +      const major2 = parseInt(distroInfo.version, 10);
      +      if (major2 < 20)
      +        return { hostPlatform: "ubuntu18.04" + archSuffix, isOfficiallySupportedPlatform: false };
      +      if (major2 < 22)
      +        return { hostPlatform: "ubuntu20.04" + archSuffix, isOfficiallySupportedPlatform: isUbuntu && version3 === "20.04" };
      +      if (major2 < 24)
      +        return { hostPlatform: "ubuntu22.04" + archSuffix, isOfficiallySupportedPlatform: isUbuntu && version3 === "22.04" };
      +      if (major2 < 26)
      +        return { hostPlatform: "ubuntu24.04" + archSuffix, isOfficiallySupportedPlatform: isUbuntu && version3 === "24.04" };
      +      if (major2 < 28)
      +        return { hostPlatform: "ubuntu26.04" + archSuffix, isOfficiallySupportedPlatform: isUbuntu && version3 === "26.04" };
      +      return { hostPlatform: "ubuntu" + distroInfo.version + archSuffix, isOfficiallySupportedPlatform: false };
      +    }
      +    if (distroInfo?.id === "linuxmint") {
      +      const mintMajor = parseInt(distroInfo.version, 10);
      +      if (mintMajor <= 20)
      +        return { hostPlatform: "ubuntu20.04" + archSuffix, isOfficiallySupportedPlatform: false };
      +      if (mintMajor === 21)
      +        return { hostPlatform: "ubuntu22.04" + archSuffix, isOfficiallySupportedPlatform: false };
      +      return { hostPlatform: "ubuntu24.04" + archSuffix, isOfficiallySupportedPlatform: false };
      +    }
      +    if (distroInfo?.id === "debian" || distroInfo?.id === "raspbian") {
      +      const isOfficiallySupportedPlatform2 = distroInfo?.id === "debian";
      +      if (distroInfo?.version === "11")
      +        return { hostPlatform: "debian11" + archSuffix, isOfficiallySupportedPlatform: isOfficiallySupportedPlatform2 };
      +      if (distroInfo?.version === "12")
      +        return { hostPlatform: "debian12" + archSuffix, isOfficiallySupportedPlatform: isOfficiallySupportedPlatform2 };
      +      if (distroInfo?.version === "13")
      +        return { hostPlatform: "debian13" + archSuffix, isOfficiallySupportedPlatform: isOfficiallySupportedPlatform2 };
      +      if (distroInfo?.version === "")
      +        return { hostPlatform: "debian13" + archSuffix, isOfficiallySupportedPlatform: isOfficiallySupportedPlatform2 };
      +    }
      +    return { hostPlatform: "ubuntu24.04" + archSuffix, isOfficiallySupportedPlatform: false };
      +  }
      +  if (platform === "win32")
      +    return { hostPlatform: "win64", isOfficiallySupportedPlatform: true };
      +  return { hostPlatform: "", isOfficiallySupportedPlatform: false };
      +}
      +function toShortPlatform(hostPlatform2) {
      +  if (hostPlatform2 === "")
      +    return "";
      +  if (hostPlatform2 === "win64")
      +    return "win-x64";
      +  if (hostPlatform2.startsWith("mac"))
      +    return hostPlatform2.endsWith("arm64") ? "mac-arm64" : "mac-x64";
      +  return hostPlatform2.endsWith("arm64") ? "linux-arm64" : "linux-x64";
      +}
      +var import_os3, hostPlatform, isOfficiallySupportedPlatform, shortPlatform;
      +var init_hostPlatform = __esm({
      +  "packages/utils/hostPlatform.ts"() {
      +    "use strict";
      +    import_os3 = __toESM(require("os"));
      +    init_linuxUtils();
      +    ({ hostPlatform, isOfficiallySupportedPlatform } = calculatePlatform());
      +    shortPlatform = toShortPlatform(hostPlatform);
      +  }
      +});
      +
      +// packages/utils/happyEyeballs.ts
      +async function createSocket(host, port) {
      +  return new Promise((resolve, reject) => {
      +    if (import_net.default.isIP(host)) {
      +      const socket = import_net.default.createConnection({ host, port });
      +      socket.on("connect", () => resolve(socket));
      +      socket.on("error", (error) => reject(error));
      +    } else {
      +      createConnectionAsync(
      +        { host, port },
      +        (err, socket) => {
      +          if (err)
      +            reject(err);
      +          if (socket)
      +            resolve(socket);
      +        },
      +        /* useTLS */
      +        false
      +      ).catch((err) => reject(err));
      +    }
      +  });
      +}
      +async function createConnectionAsync(options, oncreate, useTLS) {
      +  const lookup = options.__testHookLookup || lookupAddresses;
      +  const hostname = clientRequestArgsToHostName(options);
      +  const addresses = await lookup(hostname);
      +  const dnsLookupAt = monotonicTime();
      +  const sockets = /* @__PURE__ */ new Set();
      +  let firstError;
      +  let errorCount = 0;
      +  const handleError = (socket, err) => {
      +    if (!sockets.delete(socket))
      +      return;
      +    ++errorCount;
      +    firstError ??= err;
      +    if (errorCount === addresses.length)
      +      oncreate?.(firstError);
      +  };
      +  const connected = new ManualPromise();
      +  for (const { address } of addresses) {
      +    const socket = useTLS ? import_tls.default.connect({
      +      ...options,
      +      port: options.port,
      +      host: address,
      +      servername: hostname
      +    }) : import_net.default.createConnection({
      +      ...options,
      +      port: options.port,
      +      host: address
      +    });
      +    socket[kDNSLookupAt] = dnsLookupAt;
      +    socket.on("connect", () => {
      +      socket[kTCPConnectionAt] = monotonicTime();
      +      connected.resolve();
      +      oncreate?.(null, socket);
      +      sockets.delete(socket);
      +      for (const s of sockets)
      +        s.destroy();
      +      sockets.clear();
      +    });
      +    socket.on("timeout", () => {
      +      socket.destroy();
      +      handleError(socket, new Error("Connection timeout"));
      +    });
      +    socket.on("error", (e) => handleError(socket, e));
      +    sockets.add(socket);
      +    await Promise.race([
      +      connected,
      +      new Promise((f) => setTimeout(f, connectionAttemptDelayMs))
      +    ]);
      +    if (connected.isDone())
      +      break;
      +  }
      +}
      +async function lookupAddresses(hostname) {
      +  const [v4Result, v6Result] = await Promise.allSettled([
      +    import_dns.default.promises.lookup(hostname, { all: true, family: 4 }),
      +    import_dns.default.promises.lookup(hostname, { all: true, family: 6 })
      +  ]);
      +  const v4Addresses = v4Result.status === "fulfilled" ? v4Result.value : [];
      +  const v6Addresses = v6Result.status === "fulfilled" ? v6Result.value : [];
      +  if (!v4Addresses.length && !v6Addresses.length) {
      +    if (v4Result.status === "rejected")
      +      throw v4Result.reason;
      +    throw v6Result.reason;
      +  }
      +  const result2 = [];
      +  for (let i = 0; i < Math.max(v4Addresses.length, v6Addresses.length); i++) {
      +    if (v6Addresses[i])
      +      result2.push(v6Addresses[i]);
      +    if (v4Addresses[i])
      +      result2.push(v4Addresses[i]);
      +  }
      +  return result2;
      +}
      +function clientRequestArgsToHostName(options) {
      +  if (options.hostname)
      +    return options.hostname;
      +  if (options.host)
      +    return options.host;
      +  throw new Error("Either options.hostname or options.host must be provided");
      +}
      +function timingForSocket(socket) {
      +  return {
      +    dnsLookupAt: socket[kDNSLookupAt],
      +    tcpConnectionAt: socket[kTCPConnectionAt]
      +  };
      +}
      +var import_dns, import_http, import_https, import_net, import_tls, connectionAttemptDelayMs, kDNSLookupAt, kTCPConnectionAt, HttpHappyEyeballsAgent, HttpsHappyEyeballsAgent, httpsHappyEyeballsAgent, httpHappyEyeballsAgent;
      +var init_happyEyeballs = __esm({
      +  "packages/utils/happyEyeballs.ts"() {
      +    "use strict";
      +    import_dns = __toESM(require("dns"));
      +    import_http = __toESM(require("http"));
      +    import_https = __toESM(require("https"));
      +    import_net = __toESM(require("net"));
      +    import_tls = __toESM(require("tls"));
      +    init_assert();
      +    init_manualPromise();
      +    init_time();
      +    connectionAttemptDelayMs = 300;
      +    kDNSLookupAt = Symbol("kDNSLookupAt");
      +    kTCPConnectionAt = Symbol("kTCPConnectionAt");
      +    HttpHappyEyeballsAgent = class extends import_http.default.Agent {
      +      createConnection(options, oncreate) {
      +        if (import_net.default.isIP(clientRequestArgsToHostName(options)))
      +          return import_net.default.createConnection(options);
      +        createConnectionAsync(
      +          options,
      +          oncreate,
      +          /* useTLS */
      +          false
      +        ).catch((err) => oncreate?.(err));
      +      }
      +    };
      +    HttpsHappyEyeballsAgent = class extends import_https.default.Agent {
      +      createConnection(options, oncreate) {
      +        if (import_net.default.isIP(clientRequestArgsToHostName(options)))
      +          return import_tls.default.connect(options);
      +        createConnectionAsync(
      +          options,
      +          oncreate,
      +          /* useTLS */
      +          true
      +        ).catch((err) => oncreate?.(err));
      +      }
      +    };
      +    httpsHappyEyeballsAgent = new HttpsHappyEyeballsAgent({ keepAlive: true });
      +    httpHappyEyeballsAgent = new HttpHappyEyeballsAgent({ keepAlive: true });
      +  }
      +});
      +
      +// packages/utils/network.ts
      +function httpRequest(params2, onResponse, onError) {
      +  let url2 = new URL(params2.url);
      +  const options = {
      +    method: params2.method || "GET",
      +    headers: params2.headers
      +  };
      +  if (params2.rejectUnauthorized !== void 0)
      +    options.rejectUnauthorized = params2.rejectUnauthorized;
      +  const proxyURL = getProxyForUrl(params2.url);
      +  if (proxyURL) {
      +    const parsedProxyURL = normalizeProxyURL(proxyURL);
      +    if (params2.url.startsWith("http:")) {
      +      options.path = url2.toString();
      +      const headers = options.headers || {};
      +      if (!Object.keys(headers).some((header) => header.toLowerCase() === "host"))
      +        headers.host = url2.host;
      +      options.headers = headers;
      +      url2 = parsedProxyURL;
      +    } else {
      +      options.agent = new HttpsProxyAgent(parsedProxyURL);
      +    }
      +  }
      +  options.agent ??= url2.protocol === "https:" ? httpsHappyEyeballsAgent : httpHappyEyeballsAgent;
      +  let cancelRequest;
      +  const requestCallback = (res) => {
      +    const statusCode = res.statusCode || 0;
      +    if (statusCode >= 300 && statusCode < 400 && res.headers.location) {
      +      request2.destroy();
      +      cancelRequest = httpRequest({ ...params2, url: new URL(res.headers.location, params2.url).toString() }, onResponse, onError).cancel;
      +    } else {
      +      onResponse(res);
      +    }
      +  };
      +  const request2 = url2.protocol === "https:" ? import_https2.default.request(url2, options, requestCallback) : import_http2.default.request(url2, options, requestCallback);
      +  request2.on("error", onError);
      +  if (params2.socketTimeout !== void 0) {
      +    request2.setTimeout(params2.socketTimeout, () => {
      +      onError(new Error(`Request to ${params2.url} timed out after ${params2.socketTimeout}ms`));
      +      request2.abort();
      +    });
      +  }
      +  cancelRequest = (e) => {
      +    try {
      +      request2.destroy(e);
      +    } catch {
      +    }
      +  };
      +  request2.end(params2.data);
      +  return { cancel: (e) => cancelRequest(e) };
      +}
      +function shouldBypassProxy(url2, bypass) {
      +  if (!bypass)
      +    return false;
      +  const domains = bypass.split(",").map((s) => {
      +    s = s.trim();
      +    if (!s.startsWith("."))
      +      s = "." + s;
      +    return s;
      +  });
      +  const domain = "." + url2.hostname;
      +  return domains.some((d) => domain.endsWith(d));
      +}
      +function normalizeProxyURL(proxy) {
      +  proxy = proxy.trim();
      +  if (!/^\w+:\/\//.test(proxy))
      +    proxy = "http://" + proxy;
      +  return new URL(proxy);
      +}
      +function createProxyAgent(proxy, forUrl) {
      +  if (!proxy)
      +    return;
      +  if (forUrl && proxy.bypass && shouldBypassProxy(forUrl, proxy.bypass))
      +    return;
      +  const proxyURL = normalizeProxyURL(proxy.server);
      +  if (proxyURL.protocol?.startsWith("socks")) {
      +    if (proxyURL.protocol === "socks5:")
      +      proxyURL.protocol = "socks5h:";
      +    else if (proxyURL.protocol === "socks4:")
      +      proxyURL.protocol = "socks4a:";
      +    return new SocksProxyAgent(proxyURL);
      +  }
      +  if (proxy.username) {
      +    proxyURL.username = proxy.username;
      +    proxyURL.password = proxy.password || "";
      +  }
      +  if (forUrl && ["ws:", "wss:"].includes(forUrl.protocol)) {
      +    return new HttpsProxyAgent(proxyURL);
      +  }
      +  return new HttpsProxyAgent(proxyURL);
      +}
      +function createHttpServer(...args) {
      +  const server = import_http2.default.createServer(...args);
      +  decorateServer(server);
      +  return server;
      +}
      +function createHttpsServer(...args) {
      +  const server = import_https2.default.createServer(...args);
      +  decorateServer(server);
      +  return server;
      +}
      +function createHttp2Server(...args) {
      +  const server = import_http22.default.createSecureServer(...args);
      +  decorateServer(server);
      +  return server;
      +}
      +async function startHttpServer(server, options) {
      +  const { host = "localhost", port = 0 } = options;
      +  const errorPromise = new ManualPromise();
      +  const errorListener = (error) => errorPromise.reject(error);
      +  server.on("error", errorListener);
      +  try {
      +    server.listen(port, host);
      +    await Promise.race([
      +      new Promise((cb) => server.once("listening", cb)),
      +      errorPromise
      +    ]);
      +  } finally {
      +    server.removeListener("error", errorListener);
      +  }
      +}
      +async function isURLAvailable(url2, ignoreHTTPSErrors, onLog, onStdErr) {
      +  let statusCode = await httpStatusCode(url2, ignoreHTTPSErrors, onLog, onStdErr);
      +  if (statusCode === 404 && url2.pathname === "/") {
      +    const indexUrl = new URL(url2);
      +    indexUrl.pathname = "/index.html";
      +    statusCode = await httpStatusCode(indexUrl, ignoreHTTPSErrors, onLog, onStdErr);
      +  }
      +  return statusCode >= 200 && statusCode < 404;
      +}
      +async function httpStatusCode(url2, ignoreHTTPSErrors, onLog, onStdErr) {
      +  return new Promise((resolve) => {
      +    onLog?.(`HTTP GET: ${url2}`);
      +    httpRequest({
      +      url: url2.toString(),
      +      headers: { Accept: "*/*" },
      +      rejectUnauthorized: !ignoreHTTPSErrors
      +    }, (res) => {
      +      res.resume();
      +      const statusCode = res.statusCode ?? 0;
      +      onLog?.(`HTTP Status: ${statusCode}`);
      +      resolve(statusCode);
      +    }, (error) => {
      +      if (error.code === "DEPTH_ZERO_SELF_SIGNED_CERT")
      +        onStdErr?.(`[WebServer] Self-signed certificate detected. Try adding ignoreHTTPSErrors: true to config.webServer.`);
      +      onLog?.(`Error while checking if ${url2} is available: ${error.message}`);
      +      resolve(0);
      +    });
      +  });
      +}
      +function decorateServer(server) {
      +  const sockets = /* @__PURE__ */ new Set();
      +  server.on("connection", (socket) => {
      +    sockets.add(socket);
      +    socket.once("close", () => sockets.delete(socket));
      +  });
      +  const close3 = server.close;
      +  server.close = (callback) => {
      +    for (const socket of sockets)
      +      socket.destroy();
      +    sockets.clear();
      +    return close3.call(server, callback);
      +  };
      +}
      +var import_http2, import_http22, import_https2, HttpsProxyAgent, SocksProxyAgent, getProxyForUrl, NET_DEFAULT_TIMEOUT;
      +var init_network = __esm({
      +  "packages/utils/network.ts"() {
      +    "use strict";
      +    import_http2 = __toESM(require("http"));
      +    import_http22 = __toESM(require("http2"));
      +    import_https2 = __toESM(require("https"));
      +    init_manualPromise();
      +    init_happyEyeballs();
      +    ({ HttpsProxyAgent } = require("./utilsBundle"));
      +    ({ SocksProxyAgent } = require("./utilsBundle"));
      +    ({ getProxyForUrl } = require("./utilsBundle"));
      +    NET_DEFAULT_TIMEOUT = 3e4;
      +  }
      +});
      +
      +// packages/utils/httpServer.ts
      +function computeAllowedHosts(requested, bound) {
      +  const loopback = /* @__PURE__ */ new Set(["127.0.0.1", "::1", "localhost"]);
      +  const isLoopback = (h) => h !== void 0 && loopback.has(h.toLowerCase());
      +  if (!isLoopback(requested) && requested !== void 0)
      +    return null;
      +  if (!isLoopback(bound) && requested === void 0)
      +    return null;
      +  return /* @__PURE__ */ new Set(["localhost", "127.0.0.1", "[::1]"]);
      +}
      +function urlHostFromAddress(address) {
      +  return address.family === "IPv6" ? `[${address.address}]` : address.address;
      +}
      +function hostnameFromHostHeader(host) {
      +  if (host.startsWith("[")) {
      +    const end = host.indexOf("]");
      +    return end < 0 ? host : host.substring(0, end + 1);
      +  }
      +  const colon = host.indexOf(":");
      +  return colon < 0 ? host : host.substring(0, colon);
      +}
      +function serveFolder(folder) {
      +  const server = new HttpServer(folder);
      +  server.routePrefix("/", (request2, response2) => {
      +    let relativePath = new URL("http://localhost" + request2.url).pathname;
      +    if (relativePath.startsWith("/trace/file")) {
      +      const url2 = new URL("http://localhost" + request2.url);
      +      const requested = url2.searchParams.get("path");
      +      if (!requested)
      +        return false;
      +      const resolved = import_path3.default.resolve(requested);
      +      try {
      +        return server.serveFile(request2, response2, resolved);
      +      } catch (e) {
      +        return false;
      +      }
      +    }
      +    if (relativePath === "/")
      +      relativePath = "/index.html";
      +    const absolutePath = import_path3.default.join(folder, ...relativePath.split("/"));
      +    return server.serveFile(request2, response2, absolutePath);
      +  });
      +  return server;
      +}
      +var import_fs4, import_path3, mime, wsServer, HttpServer;
      +var init_httpServer = __esm({
      +  "packages/utils/httpServer.ts"() {
      +    "use strict";
      +    import_fs4 = __toESM(require("fs"));
      +    import_path3 = __toESM(require("path"));
      +    init_assert();
      +    init_crypto();
      +    init_fileUtils();
      +    init_network();
      +    mime = require("./utilsBundle").mime;
      +    ({ wsServer } = require("./utilsBundle"));
      +    HttpServer = class {
      +      constructor(staticRoot) {
      +        this._urlPrefixPrecise = "";
      +        this._urlPrefixHumanReadable = "";
      +        this._port = 0;
      +        this._started = false;
      +        this._routes = [];
      +        // Allowed Host headers; null disables the check (host bound to a public address).
      +        this._allowedHosts = null;
      +        this._server = createHttpServer(this._onRequest.bind(this));
      +        this._staticRoot = staticRoot ? import_path3.default.resolve(staticRoot) : void 0;
      +      }
      +      server() {
      +        return this._server;
      +      }
      +      routePrefix(prefix, handler) {
      +        this._routes.push({ prefix, handler });
      +      }
      +      routePath(path59, handler) {
      +        this._routes.push({ exact: path59, handler });
      +      }
      +      port() {
      +        return this._port;
      +      }
      +      createWebSocket(transportFactory, guid) {
      +        assert(!this._wsGuid, "can only create one main websocket transport per server");
      +        this._wsGuid = guid || createGuid();
      +        const wsPath = "/" + this._wsGuid;
      +        const wss = new wsServer({ noServer: true });
      +        this._server.on("upgrade", (request2, socket, head) => {
      +          const pathname = new URL(request2.url ?? "/", "http://localhost").pathname;
      +          if (pathname !== wsPath)
      +            return;
      +          wss.handleUpgrade(request2, socket, head, (ws4) => wss.emit("connection", ws4, request2));
      +        });
      +        wss.on("connection", (ws4, request2) => {
      +          const url2 = new URL(request2.url ?? "/", "http://localhost");
      +          const transport = transportFactory(url2);
      +          transport.sendEvent = (method, params2) => ws4.send(JSON.stringify({ method, params: params2 }));
      +          transport.close = () => ws4.close();
      +          transport.onconnect();
      +          ws4.on("message", async (message) => {
      +            const { id, method, params: params2 } = JSON.parse(String(message));
      +            try {
      +              const result2 = await transport.dispatch(method, params2);
      +              ws4.send(JSON.stringify({ id, result: result2 }));
      +            } catch (e) {
      +              ws4.send(JSON.stringify({ id, error: String(e) }));
      +            }
      +          });
      +          ws4.on("close", () => transport.onclose());
      +          ws4.on("error", () => transport.onclose());
      +        });
      +      }
      +      wsGuid() {
      +        return this._wsGuid;
      +      }
      +      async createViteDevServer(options) {
      +        const loadVite = new Function('return import("vite")');
      +        const vite = await loadVite();
      +        return await vite.createServer({
      +          root: options.root,
      +          base: options.base,
      +          server: {
      +            middlewareMode: true,
      +            // Dedicated path so Vite's HMR websocket does not collide with any
      +            // websocket HttpServer owns via createWebSocket().
      +            hmr: { path: "/__vite_hmr", server: this._server }
      +          },
      +          appType: "spa",
      +          clearScreen: false
      +        });
      +      }
      +      // HMR end
      +      // Vite's middleware `next` callback for the "no middleware matched" case;
      +      // emits a 404 only if nothing downstream already responded.
      +      static notFoundFallback(response2) {
      +        return () => {
      +          if (!response2.headersSent) {
      +            response2.statusCode = 404;
      +            response2.end();
      +          }
      +        };
      +      }
      +      async start(options = {}) {
      +        assert(!this._started, "server already started");
      +        this._started = true;
      +        const host = options.host;
      +        if (options.preferredPort) {
      +          try {
      +            await startHttpServer(this._server, { port: options.preferredPort, host });
      +          } catch (e) {
      +            if (!e || !e.message || !e.message.includes("EADDRINUSE"))
      +              throw e;
      +            await startHttpServer(this._server, { host });
      +          }
      +        } else {
      +          await startHttpServer(this._server, { port: options.port, host });
      +        }
      +        const address = this._server.address();
      +        assert(address, "Could not bind server socket");
      +        if (typeof address === "string") {
      +          this._urlPrefixPrecise = address;
      +          this._urlPrefixHumanReadable = address;
      +        } else {
      +          this._port = address.port;
      +          this._urlPrefixPrecise = `http://${urlHostFromAddress(address)}:${address.port}`;
      +          this._urlPrefixHumanReadable = `http://${host ?? "localhost"}:${address.port}`;
      +          this._allowedHosts = computeAllowedHosts(host, address.address);
      +        }
      +      }
      +      async stop() {
      +        await new Promise((cb) => this._server.close(cb));
      +      }
      +      urlPrefix(purpose) {
      +        return purpose === "human-readable" ? this._urlPrefixHumanReadable : this._urlPrefixPrecise;
      +      }
      +      serveFile(request2, response2, absoluteFilePath, headers, options) {
      +        if (this._staticRoot && !options?.skipRootCheck && !isPathInside(this._staticRoot, absoluteFilePath)) {
      +          response2.statusCode = 403;
      +          response2.end();
      +          return true;
      +        }
      +        try {
      +          for (const [name, value2] of Object.entries(headers || {}))
      +            response2.setHeader(name, value2);
      +          if (request2.headers.range)
      +            this._serveRangeFile(request2, response2, absoluteFilePath);
      +          else
      +            this._serveFile(response2, absoluteFilePath);
      +          return true;
      +        } catch (e) {
      +          return false;
      +        }
      +      }
      +      _serveFile(response2, absoluteFilePath) {
      +        const content = import_fs4.default.readFileSync(absoluteFilePath);
      +        response2.statusCode = 200;
      +        const contentType = mime.getType(import_path3.default.extname(absoluteFilePath)) || "application/octet-stream";
      +        response2.setHeader("Content-Type", contentType);
      +        response2.setHeader("Content-Length", content.byteLength);
      +        response2.end(content);
      +      }
      +      _serveRangeFile(request2, response2, absoluteFilePath) {
      +        const range = request2.headers.range;
      +        if (!range || !range.startsWith("bytes=") || range.includes(", ") || [...range].filter((char) => char === "-").length !== 1) {
      +          response2.statusCode = 400;
      +          return response2.end("Bad request");
      +        }
      +        const [startStr, endStr] = range.replace(/bytes=/, "").split("-");
      +        let start3;
      +        let end;
      +        const size = import_fs4.default.statSync(absoluteFilePath).size;
      +        if (startStr !== "" && endStr === "") {
      +          start3 = +startStr;
      +          end = size - 1;
      +        } else if (startStr === "" && endStr !== "") {
      +          start3 = size - +endStr;
      +          end = size - 1;
      +        } else {
      +          start3 = +startStr;
      +          end = +endStr;
      +        }
      +        if (Number.isNaN(start3) || Number.isNaN(end) || start3 >= size || end >= size || start3 > end) {
      +          response2.writeHead(416, {
      +            "Content-Range": `bytes */${size}`
      +          });
      +          return response2.end();
      +        }
      +        response2.writeHead(206, {
      +          "Content-Range": `bytes ${start3}-${end}/${size}`,
      +          "Accept-Ranges": "bytes",
      +          "Content-Length": end - start3 + 1,
      +          "Content-Type": mime.getType(import_path3.default.extname(absoluteFilePath))
      +        });
      +        const readable = import_fs4.default.createReadStream(absoluteFilePath, { start: start3, end });
      +        readable.pipe(response2);
      +      }
      +      _onRequest(request2, response2) {
      +        if (request2.method === "OPTIONS") {
      +          response2.writeHead(200);
      +          response2.end();
      +          return;
      +        }
      +        if (this._allowedHosts) {
      +          const host = request2.headers.host?.toLowerCase();
      +          const hostname = host ? hostnameFromHostHeader(host) : void 0;
      +          if (!hostname || !this._allowedHosts.has(hostname)) {
      +            response2.statusCode = 403;
      +            response2.end();
      +            return;
      +          }
      +        }
      +        request2.on("error", () => response2.end());
      +        try {
      +          if (!request2.url) {
      +            response2.end();
      +            return;
      +          }
      +          const url2 = new URL("http://localhost" + request2.url);
      +          for (const route2 of this._routes) {
      +            if (route2.exact && url2.pathname === route2.exact && route2.handler(request2, response2))
      +              return;
      +            if (route2.prefix && url2.pathname.startsWith(route2.prefix) && route2.handler(request2, response2))
      +              return;
      +          }
      +          response2.statusCode = 404;
      +          response2.end();
      +        } catch (e) {
      +          response2.end();
      +        }
      +      }
      +    };
      +  }
      +});
      +
      +// packages/utils/zones.ts
      +function currentZone() {
      +  return asyncLocalStorage.getStore() ?? emptyZone;
      +}
      +var import_async_hooks, asyncLocalStorage, Zone, emptyZone;
      +var init_zones = __esm({
      +  "packages/utils/zones.ts"() {
      +    "use strict";
      +    import_async_hooks = require("async_hooks");
      +    asyncLocalStorage = new import_async_hooks.AsyncLocalStorage();
      +    Zone = class _Zone {
      +      constructor(asyncLocalStorage2, store) {
      +        this._asyncLocalStorage = asyncLocalStorage2;
      +        this._data = store;
      +      }
      +      with(type3, data) {
      +        return new _Zone(this._asyncLocalStorage, new Map(this._data).set(type3, data));
      +      }
      +      without(type3) {
      +        const data = type3 ? new Map(this._data) : /* @__PURE__ */ new Map();
      +        data.delete(type3);
      +        return new _Zone(this._asyncLocalStorage, data);
      +      }
      +      run(func) {
      +        return this._asyncLocalStorage.run(this, func);
      +      }
      +      data(type3) {
      +        return this._data.get(type3);
      +      }
      +    };
      +    emptyZone = new Zone(asyncLocalStorage, /* @__PURE__ */ new Map());
      +  }
      +});
      +
      +// packages/utils/nodePlatform.ts
      +function setBoxedStackPrefixes(prefixes) {
      +  boxedStackPrefixes = prefixes;
      +}
      +var import_crypto4, import_fs5, import_path4, util, import_stream, import_events, colors2, pipelineAsync, NodeZone, boxedStackPrefixes, nodePlatform, ReadableStreamImpl, WritableStreamImpl;
      +var init_nodePlatform = __esm({
      +  "packages/utils/nodePlatform.ts"() {
      +    "use strict";
      +    import_crypto4 = __toESM(require("crypto"));
      +    import_fs5 = __toESM(require("fs"));
      +    import_path4 = __toESM(require("path"));
      +    util = __toESM(require("util"));
      +    import_stream = require("stream");
      +    import_events = require("events");
      +    init_debugLogger();
      +    init_zones();
      +    init_debug();
      +    colors2 = require("./utilsBundle").colors;
      +    pipelineAsync = util.promisify(import_stream.pipeline);
      +    NodeZone = class _NodeZone {
      +      constructor(zone) {
      +        this._zone = zone;
      +      }
      +      push(data) {
      +        return new _NodeZone(this._zone.with("apiZone", data));
      +      }
      +      pop() {
      +        return new _NodeZone(this._zone.without("apiZone"));
      +      }
      +      run(func) {
      +        return this._zone.run(func);
      +      }
      +      data() {
      +        return this._zone.data("apiZone");
      +      }
      +    };
      +    boxedStackPrefixes = [];
      +    nodePlatform = (coreDir) => ({
      +      name: "node",
      +      boxedStackPrefixes: () => {
      +        if (process.env.PWDEBUGIMPL)
      +          return [];
      +        return [coreDir, ...boxedStackPrefixes];
      +      },
      +      calculateSha1: (text2) => {
      +        const sha1 = import_crypto4.default.createHash("sha1");
      +        sha1.update(text2);
      +        return Promise.resolve(sha1.digest("hex"));
      +      },
      +      colors: colors2,
      +      coreDir,
      +      createGuid: () => import_crypto4.default.randomBytes(16).toString("hex"),
      +      defaultMaxListeners: () => import_events.EventEmitter.defaultMaxListeners,
      +      fs: () => import_fs5.default,
      +      env: process.env,
      +      inspectCustom: util.inspect.custom,
      +      isDebugMode: () => debugMode() === "inspector",
      +      isJSDebuggerAttached: () => !!require("inspector").url(),
      +      isLogEnabled(name) {
      +        return debugLogger.isEnabled(name);
      +      },
      +      isUnderTest: () => isUnderTest(),
      +      log(name, message) {
      +        debugLogger.log(name, message);
      +      },
      +      path: () => import_path4.default,
      +      pathSeparator: import_path4.default.sep,
      +      showInternalStackFrames: () => !!process.env.PWDEBUGIMPL,
      +      async streamFile(path59, stream3) {
      +        await pipelineAsync(import_fs5.default.createReadStream(path59), stream3);
      +      },
      +      streamReadable: (channel) => {
      +        return new ReadableStreamImpl(channel);
      +      },
      +      streamWritable: (channel) => {
      +        return new WritableStreamImpl(channel);
      +      },
      +      zones: {
      +        current: () => new NodeZone(currentZone()),
      +        empty: new NodeZone(emptyZone)
      +      }
      +    });
      +    ReadableStreamImpl = class extends import_stream.Readable {
      +      constructor(channel) {
      +        super();
      +        this._channel = channel;
      +      }
      +      async _read() {
      +        const result2 = await this._channel.read({ size: 1024 * 1024 });
      +        if (result2.binary.byteLength)
      +          this.push(result2.binary);
      +        else
      +          this.push(null);
      +      }
      +      _destroy(error, callback) {
      +        this._channel.close().catch((e) => null);
      +        super._destroy(error, callback);
      +      }
      +    };
      +    WritableStreamImpl = class extends import_stream.Writable {
      +      constructor(channel) {
      +        super();
      +        this._channel = channel;
      +      }
      +      async _write(chunk, encoding, callback) {
      +        const error = await this._channel.write({ binary: typeof chunk === "string" ? Buffer.from(chunk) : chunk }).catch((e) => e);
      +        callback(error || null);
      +      }
      +      async _final(callback) {
      +        const error = await this._channel.close().catch((e) => e);
      +        callback(error || null);
      +      }
      +    };
      +  }
      +});
      +
      +// packages/utils/processLauncher.ts
      +async function gracefullyCloseAll() {
      +  await Promise.all(Array.from(gracefullyCloseSet).map((gracefullyClose) => gracefullyClose().catch((e) => {
      +  })));
      +}
      +function gracefullyProcessExitDoNotHang(code, onExit2) {
      +  const beforeExit = onExit2 ? () => onExit2().catch(() => {
      +  }) : () => Promise.resolve();
      +  const callback = () => beforeExit().then(() => process.exit(code));
      +  setTimeout(callback, 3e4);
      +  gracefullyCloseAll().then(callback);
      +}
      +function exitHandler() {
      +  for (const kill of killSet)
      +    kill();
      +}
      +function sigintHandler() {
      +  const exitWithCode130 = () => {
      +    if (isUnderTest()) {
      +      setTimeout(() => process.exit(130), 1e3);
      +    } else {
      +      process.exit(130);
      +    }
      +  };
      +  if (sigintHandlerCalled) {
      +    process.off("SIGINT", sigintHandler);
      +    for (const kill of killSet)
      +      kill();
      +    exitWithCode130();
      +  } else {
      +    sigintHandlerCalled = true;
      +    gracefullyCloseAll().then(() => exitWithCode130());
      +  }
      +}
      +function sigtermHandler() {
      +  gracefullyCloseAll();
      +}
      +function sighupHandler() {
      +  gracefullyCloseAll();
      +}
      +function addProcessHandlerIfNeeded(name) {
      +  if (!installedHandlers.has(name)) {
      +    installedHandlers.add(name);
      +    process.on(name, processHandlers[name]);
      +  }
      +}
      +function removeProcessHandlersIfNeeded() {
      +  if (killSet.size)
      +    return;
      +  for (const handler of installedHandlers)
      +    process.off(handler, processHandlers[handler]);
      +  installedHandlers.clear();
      +}
      +async function launchProcess(options) {
      +  const stdio = options.stdio === "pipe" ? ["ignore", "pipe", "pipe", "pipe", "pipe"] : ["pipe", "pipe", "pipe"];
      +  options.log(` ${options.command} ${options.args ? options.args.join(" ") : ""}`);
      +  const spawnOptions = {
      +    // On non-windows platforms, `detached: true` makes child process a leader of a new
      +    // process group, making it possible to kill child process tree with `.kill(-pid)` command.
      +    // @see https://nodejs.org/api/child_process.html#child_process_options_detached
      +    detached: process.platform !== "win32",
      +    env: options.env,
      +    cwd: options.cwd,
      +    shell: options.shell,
      +    stdio
      +  };
      +  const spawnedProcess = childProcess.spawn(options.command, options.args || [], spawnOptions);
      +  const cleanup = async () => {
      +    options.log(`[pid=${spawnedProcess.pid || "N/A"}] starting temporary directories cleanup`);
      +    const errors = await removeFolders(options.tempDirectories);
      +    for (let i = 0; i < options.tempDirectories.length; ++i) {
      +      if (errors[i])
      +        options.log(`[pid=${spawnedProcess.pid || "N/A"}] exception while removing ${options.tempDirectories[i]}: ${errors[i]}`);
      +    }
      +    options.log(`[pid=${spawnedProcess.pid || "N/A"}] finished temporary directories cleanup`);
      +  };
      +  spawnedProcess.on("error", () => {
      +  });
      +  if (!spawnedProcess.pid) {
      +    let failed;
      +    const failedPromise = new Promise((f, r) => failed = f);
      +    spawnedProcess.once("error", (error) => {
      +      failed(new Error("Failed to launch: " + error));
      +    });
      +    return failedPromise.then(async (error) => {
      +      await cleanup();
      +      throw error;
      +    });
      +  }
      +  options.log(` pid=${spawnedProcess.pid}`);
      +  const stdout = readline.createInterface({ input: spawnedProcess.stdout });
      +  stdout.on("line", (data) => {
      +    options.log(`[pid=${spawnedProcess.pid}][out] ` + data);
      +  });
      +  const stderr = readline.createInterface({ input: spawnedProcess.stderr });
      +  stderr.on("line", (data) => {
      +    options.log(`[pid=${spawnedProcess.pid}][err] ` + data);
      +  });
      +  let processClosed = false;
      +  let fulfillCleanup = () => {
      +  };
      +  const waitForCleanup = new Promise((f) => fulfillCleanup = f);
      +  spawnedProcess.once("close", (exitCode, signal) => {
      +    options.log(`[pid=${spawnedProcess.pid}] `);
      +    processClosed = true;
      +    gracefullyCloseSet.delete(gracefullyClose);
      +    killSet.delete(killProcessAndCleanup);
      +    removeProcessHandlersIfNeeded();
      +    options.onExit(exitCode, signal);
      +    cleanup().then(fulfillCleanup);
      +  });
      +  addProcessHandlerIfNeeded("exit");
      +  if (options.handleSIGINT)
      +    addProcessHandlerIfNeeded("SIGINT");
      +  if (options.handleSIGTERM)
      +    addProcessHandlerIfNeeded("SIGTERM");
      +  if (options.handleSIGHUP)
      +    addProcessHandlerIfNeeded("SIGHUP");
      +  gracefullyCloseSet.add(gracefullyClose);
      +  killSet.add(killProcessAndCleanup);
      +  let gracefullyClosing = false;
      +  async function gracefullyClose() {
      +    if (gracefullyClosing) {
      +      options.log(`[pid=${spawnedProcess.pid}] `);
      +      killProcess();
      +      await waitForCleanup;
      +      return;
      +    }
      +    gracefullyClosing = true;
      +    options.log(`[pid=${spawnedProcess.pid}] `);
      +    await options.attemptToGracefullyClose().catch(() => killProcess());
      +    await waitForCleanup;
      +    options.log(`[pid=${spawnedProcess.pid}] `);
      +  }
      +  function killProcess() {
      +    gracefullyCloseSet.delete(gracefullyClose);
      +    killSet.delete(killProcessAndCleanup);
      +    removeProcessHandlersIfNeeded();
      +    options.log(`[pid=${spawnedProcess.pid}] `);
      +    if (spawnedProcess.pid && !spawnedProcess.killed && !processClosed) {
      +      options.log(`[pid=${spawnedProcess.pid}] `);
      +      try {
      +        if (process.platform === "win32") {
      +          const taskkillProcess = childProcess.spawnSync(`taskkill /pid ${spawnedProcess.pid} /T /F`, { shell: true });
      +          const [stdout2, stderr2] = [taskkillProcess.stdout.toString(), taskkillProcess.stderr.toString()];
      +          if (stdout2)
      +            options.log(`[pid=${spawnedProcess.pid}] taskkill stdout: ${stdout2}`);
      +          if (stderr2)
      +            options.log(`[pid=${spawnedProcess.pid}] taskkill stderr: ${stderr2}`);
      +        } else {
      +          process.kill(-spawnedProcess.pid, "SIGKILL");
      +        }
      +      } catch (e) {
      +        options.log(`[pid=${spawnedProcess.pid}] exception while trying to kill process: ${e}`);
      +      }
      +    } else {
      +      options.log(`[pid=${spawnedProcess.pid}] `);
      +    }
      +  }
      +  function killProcessAndCleanup() {
      +    killProcess();
      +    options.log(`[pid=${spawnedProcess.pid || "N/A"}] starting temporary directories cleanup`);
      +    for (const dir of options.tempDirectories) {
      +      try {
      +        import_fs6.default.rmSync(dir, { force: true, recursive: true, maxRetries: 5 });
      +      } catch (e) {
      +        options.log(`[pid=${spawnedProcess.pid || "N/A"}] exception while removing ${dir}: ${e}`);
      +      }
      +    }
      +    options.log(`[pid=${spawnedProcess.pid || "N/A"}] finished temporary directories cleanup`);
      +  }
      +  function killAndWait() {
      +    killProcess();
      +    return waitForCleanup;
      +  }
      +  return { launchedProcess: spawnedProcess, gracefullyClose, kill: killAndWait };
      +}
      +function envArrayToObject(env) {
      +  const result2 = {};
      +  for (const { name, value: value2 } of env)
      +    result2[name] = value2;
      +  return result2;
      +}
      +var childProcess, import_fs6, readline, gracefullyCloseSet, killSet, sigintHandlerCalled, installedHandlers, processHandlers;
      +var init_processLauncher = __esm({
      +  "packages/utils/processLauncher.ts"() {
      +    "use strict";
      +    childProcess = __toESM(require("child_process"));
      +    import_fs6 = __toESM(require("fs"));
      +    readline = __toESM(require("readline"));
      +    init_fileUtils();
      +    init_debug();
      +    gracefullyCloseSet = /* @__PURE__ */ new Set();
      +    killSet = /* @__PURE__ */ new Set();
      +    sigintHandlerCalled = false;
      +    installedHandlers = /* @__PURE__ */ new Set();
      +    processHandlers = {
      +      exit: exitHandler,
      +      SIGINT: sigintHandler,
      +      SIGTERM: sigtermHandler,
      +      SIGHUP: sighupHandler
      +    };
      +  }
      +});
      +
      +// packages/utils/profiler.ts
      +async function startProfiling() {
      +  if (!profileDir)
      +    return;
      +  session = new (require("inspector")).Session();
      +  session.connect();
      +  await new Promise((f) => {
      +    session.post("Profiler.enable", () => {
      +      session.post("Profiler.start", f);
      +    });
      +  });
      +}
      +async function stopProfiling(profileName) {
      +  if (!profileDir)
      +    return;
      +  await new Promise((f) => session.post("Profiler.stop", (err, { profile }) => {
      +    if (!err) {
      +      import_fs7.default.mkdirSync(profileDir, { recursive: true });
      +      import_fs7.default.writeFileSync(import_path5.default.join(profileDir, profileName + ".json"), JSON.stringify(profile));
      +    }
      +    f();
      +  }));
      +}
      +var import_fs7, import_path5, profileDir, session;
      +var init_profiler = __esm({
      +  "packages/utils/profiler.ts"() {
      +    "use strict";
      +    import_fs7 = __toESM(require("fs"));
      +    import_path5 = __toESM(require("path"));
      +    profileDir = process.env.PWTEST_PROFILE_DIR || "";
      +  }
      +});
      +
      +// packages/utils/serializedFS.ts
      +var import_fs8, yazl, APPEND_CHUNK_SIZE, SerializedFS;
      +var init_serializedFS = __esm({
      +  "packages/utils/serializedFS.ts"() {
      +    "use strict";
      +    import_fs8 = __toESM(require("fs"));
      +    init_manualPromise();
      +    yazl = require("./utilsBundle").yazl;
      +    APPEND_CHUNK_SIZE = 64 * 1024;
      +    SerializedFS = class {
      +      constructor() {
      +        this._buffers = /* @__PURE__ */ new Map();
      +        this._operations = [];
      +        this._operationsDone = new ManualPromise();
      +        this._operationsDone.resolve();
      +      }
      +      mkdir(dir) {
      +        this._appendOperation({ op: "mkdir", dir });
      +      }
      +      writeFile(file, content, skipIfExists) {
      +        this._buffers.delete(file);
      +        this._appendOperation({ op: "writeFile", file, content, skipIfExists });
      +      }
      +      appendFile(file, text2, flush) {
      +        if (!this._buffers.has(file))
      +          this._buffers.set(file, []);
      +        const buffer = this._buffers.get(file);
      +        buffer.push(text2);
      +        let size = 0;
      +        for (const chunk of buffer)
      +          size += chunk.length;
      +        if (flush || size >= APPEND_CHUNK_SIZE)
      +          this._flushFile(file);
      +      }
      +      _flushFile(file) {
      +        const buffer = this._buffers.get(file);
      +        if (buffer === void 0)
      +          return;
      +        const content = buffer.join("");
      +        this._buffers.delete(file);
      +        this._appendOperation({ op: "appendFile", file, content });
      +      }
      +      copyFile(from, to) {
      +        this._flushFile(from);
      +        this._buffers.delete(to);
      +        this._appendOperation({ op: "copyFile", from, to });
      +      }
      +      async syncAndGetError() {
      +        for (const file of this._buffers.keys())
      +          this._flushFile(file);
      +        await this._operationsDone;
      +        return this._error;
      +      }
      +      zip(entries, zipFileName) {
      +        for (const file of this._buffers.keys())
      +          this._flushFile(file);
      +        this._appendOperation({ op: "zip", entries, zipFileName });
      +      }
      +      // This method serializes all writes to the trace.
      +      _appendOperation(op) {
      +        const last = this._operations[this._operations.length - 1];
      +        if (last?.op === "appendFile" && op.op === "appendFile" && last.file === op.file && last.content.length < APPEND_CHUNK_SIZE) {
      +          last.content += op.content;
      +          return;
      +        }
      +        this._operations.push(op);
      +        if (this._operationsDone.isDone())
      +          this._performOperations();
      +      }
      +      async _performOperations() {
      +        this._operationsDone = new ManualPromise();
      +        while (this._operations.length) {
      +          const op = this._operations.shift();
      +          if (this._error)
      +            continue;
      +          try {
      +            await this._performOperation(op);
      +          } catch (e) {
      +            this._error = e;
      +          }
      +        }
      +        this._operationsDone.resolve();
      +      }
      +      async _performOperation(op) {
      +        switch (op.op) {
      +          case "mkdir": {
      +            await import_fs8.default.promises.mkdir(op.dir, { recursive: true });
      +            return;
      +          }
      +          case "writeFile": {
      +            if (op.skipIfExists)
      +              await import_fs8.default.promises.writeFile(op.file, op.content, { flag: "wx" }).catch(() => {
      +              });
      +            else
      +              await import_fs8.default.promises.writeFile(op.file, op.content);
      +            return;
      +          }
      +          case "copyFile": {
      +            await import_fs8.default.promises.copyFile(op.from, op.to);
      +            return;
      +          }
      +          case "appendFile": {
      +            await import_fs8.default.promises.appendFile(op.file, op.content);
      +            return;
      +          }
      +          case "zip": {
      +            const zipFile = new yazl.ZipFile();
      +            const result2 = new ManualPromise();
      +            zipFile.on("error", (error) => result2.reject(error));
      +            for (const entry of op.entries)
      +              zipFile.addFile(entry.value, entry.name);
      +            zipFile.end();
      +            zipFile.outputStream.pipe(import_fs8.default.createWriteStream(op.zipFileName)).on("close", () => result2.resolve()).on("error", (error) => result2.reject(error));
      +            await result2;
      +            return;
      +          }
      +        }
      +      }
      +    };
      +  }
      +});
      +
      +// packages/utils/socksProxy.ts
      +function hexToNumber(hex) {
      +  return [...hex].reduce((value2, digit2) => {
      +    const code = digit2.charCodeAt(0);
      +    if (code >= 48 && code <= 57)
      +      return value2 + code;
      +    if (code >= 97 && code <= 102)
      +      return value2 + (code - 97) + 10;
      +    if (code >= 65 && code <= 70)
      +      return value2 + (code - 65) + 10;
      +    throw new Error("Invalid IPv6 token " + hex);
      +  }, 0);
      +}
      +function ipToSocksAddress(address) {
      +  const ipv4Mapped = /^::ffff:(\d+\.\d+\.\d+\.\d+)$/i.exec(address);
      +  if (ipv4Mapped)
      +    address = ipv4Mapped[1];
      +  if (import_net2.default.isIPv4(address)) {
      +    return [
      +      1,
      +      // IPv4
      +      ...address.split(".", 4).map((t) => +t & 255)
      +      // Address
      +    ];
      +  }
      +  if (import_net2.default.isIPv6(address)) {
      +    const result2 = [4];
      +    const tokens = address.split(":", 8);
      +    while (tokens.length < 8)
      +      tokens.unshift("");
      +    for (const token of tokens) {
      +      const value2 = hexToNumber(token);
      +      result2.push(value2 >> 8 & 255, value2 & 255);
      +    }
      +    return result2;
      +  }
      +  throw new Error("Only IPv4 and IPv6 addresses are supported");
      +}
      +function starMatchToRegex(pattern) {
      +  const source11 = pattern.split("*").map((s) => {
      +    return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
      +  }).join(".*");
      +  return new RegExp("^" + source11 + "$");
      +}
      +function parsePattern(pattern) {
      +  if (!pattern)
      +    return () => false;
      +  const matchers = pattern.split(",").map((token) => {
      +    const match = token.match(/^(.*?)(?::(\d+))?$/);
      +    if (!match)
      +      throw new Error(`Unsupported token "${token}" in pattern "${pattern}"`);
      +    const tokenPort = match[2] ? +match[2] : void 0;
      +    const portMatches = (port) => tokenPort === void 0 || tokenPort === port;
      +    let tokenHost = match[1];
      +    if (tokenHost === "") {
      +      return (host, port) => {
      +        if (!portMatches(port))
      +          return false;
      +        return host === "localhost" || host.endsWith(".localhost") || host === "127.0.0.1" || host === "[::1]";
      +      };
      +    }
      +    if (tokenHost === "*")
      +      return (host, port) => portMatches(port);
      +    if (import_net2.default.isIPv4(tokenHost) || import_net2.default.isIPv6(tokenHost))
      +      return (host, port) => host === tokenHost && portMatches(port);
      +    if (tokenHost[0] === ".")
      +      tokenHost = "*" + tokenHost;
      +    const tokenRegex = starMatchToRegex(tokenHost);
      +    return (host, port) => {
      +      if (!portMatches(port))
      +        return false;
      +      if (import_net2.default.isIPv4(host) || import_net2.default.isIPv6(host))
      +        return false;
      +      return !!host.match(tokenRegex);
      +    };
      +  });
      +  return (host, port) => matchers.some((matcher) => matcher(host, port));
      +}
      +var import_events2, import_net2, SocksConnection, SocksProxy, SocksProxyHandler;
      +var init_socksProxy = __esm({
      +  "packages/utils/socksProxy.ts"() {
      +    "use strict";
      +    import_events2 = __toESM(require("events"));
      +    import_net2 = __toESM(require("net"));
      +    init_assert();
      +    init_crypto();
      +    init_debugLogger();
      +    init_happyEyeballs();
      +    SocksConnection = class {
      +      constructor(uid, socket, client) {
      +        this._buffer = Buffer.from([]);
      +        this._offset = 0;
      +        this._fence = 0;
      +        this._uid = uid;
      +        this._socket = socket;
      +        this._client = client;
      +        this._boundOnData = this._onData.bind(this);
      +        socket.on("data", this._boundOnData);
      +        socket.on("close", () => this._onClose());
      +        socket.on("end", () => this._onClose());
      +        socket.on("error", () => this._onClose());
      +        this._run().catch(() => this._socket.end());
      +      }
      +      async _run() {
      +        assert(await this._authenticate());
      +        const { command, host, port } = await this._parseRequest();
      +        if (command !== 1 /* CONNECT */) {
      +          this._writeBytes(Buffer.from([
      +            5,
      +            7 /* CommandNotSupported */,
      +            0,
      +            // RSV
      +            1,
      +            // IPv4
      +            0,
      +            0,
      +            0,
      +            0,
      +            // Address
      +            0,
      +            0
      +            // Port
      +          ]));
      +          return;
      +        }
      +        this._socket.off("data", this._boundOnData);
      +        this._client.onSocketRequested({ uid: this._uid, host, port });
      +      }
      +      async _authenticate() {
      +        const version3 = await this._readByte();
      +        assert(version3 === 5, "The VER field must be set to x05 for this version of the protocol, was " + version3);
      +        const nMethods = await this._readByte();
      +        assert(nMethods, "No authentication methods specified");
      +        const methods = await this._readBytes(nMethods);
      +        for (const method of methods) {
      +          if (method === 0) {
      +            this._writeBytes(Buffer.from([version3, method]));
      +            return true;
      +          }
      +        }
      +        this._writeBytes(Buffer.from([version3, 255 /* NO_ACCEPTABLE_METHODS */]));
      +        return false;
      +      }
      +      async _parseRequest() {
      +        const version3 = await this._readByte();
      +        assert(version3 === 5, "The VER field must be set to x05 for this version of the protocol, was " + version3);
      +        const command = await this._readByte();
      +        await this._readByte();
      +        const addressType = await this._readByte();
      +        let host = "";
      +        switch (addressType) {
      +          case 1 /* IPv4 */:
      +            host = (await this._readBytes(4)).join(".");
      +            break;
      +          case 3 /* FqName */:
      +            const length = await this._readByte();
      +            host = (await this._readBytes(length)).toString();
      +            break;
      +          case 4 /* IPv6 */:
      +            const bytes = await this._readBytes(16);
      +            const tokens = [];
      +            for (let i = 0; i < 8; ++i)
      +              tokens.push(bytes.readUInt16BE(i * 2).toString(16));
      +            host = tokens.join(":");
      +            break;
      +        }
      +        const port = (await this._readBytes(2)).readUInt16BE(0);
      +        this._buffer = Buffer.from([]);
      +        this._offset = 0;
      +        this._fence = 0;
      +        return {
      +          command,
      +          host,
      +          port
      +        };
      +      }
      +      async _readByte() {
      +        const buffer = await this._readBytes(1);
      +        return buffer[0];
      +      }
      +      async _readBytes(length) {
      +        this._fence = this._offset + length;
      +        if (!this._buffer || this._buffer.length < this._fence)
      +          await new Promise((f) => this._fenceCallback = f);
      +        this._offset += length;
      +        return this._buffer.slice(this._offset - length, this._offset);
      +      }
      +      _writeBytes(buffer) {
      +        if (this._socket.writable)
      +          this._socket.write(buffer);
      +      }
      +      _onClose() {
      +        this._client.onSocketClosed({ uid: this._uid });
      +      }
      +      _onData(buffer) {
      +        this._buffer = Buffer.concat([this._buffer, buffer]);
      +        if (this._fenceCallback && this._buffer.length >= this._fence) {
      +          const callback = this._fenceCallback;
      +          this._fenceCallback = void 0;
      +          callback();
      +        }
      +      }
      +      socketConnected(host, port) {
      +        this._writeBytes(Buffer.from([
      +          5,
      +          0 /* Succeeded */,
      +          0,
      +          // RSV
      +          ...ipToSocksAddress(host),
      +          // ATYP, Address
      +          port >> 8,
      +          port & 255
      +          // Port
      +        ]));
      +        this._socket.on("data", (data) => this._client.onSocketData({ uid: this._uid, data }));
      +      }
      +      socketFailed(errorCode) {
      +        const buffer = Buffer.from([
      +          5,
      +          0,
      +          0,
      +          // RSV
      +          ...ipToSocksAddress("0.0.0.0"),
      +          // ATYP, Address
      +          0,
      +          0
      +          // Port
      +        ]);
      +        switch (errorCode) {
      +          case "ENOENT":
      +          case "ENOTFOUND":
      +          case "ETIMEDOUT":
      +          case "EHOSTUNREACH":
      +            buffer[1] = 4 /* HostUnreachable */;
      +            break;
      +          case "ENETUNREACH":
      +            buffer[1] = 3 /* NetworkUnreachable */;
      +            break;
      +          case "ECONNREFUSED":
      +            buffer[1] = 5 /* ConnectionRefused */;
      +            break;
      +          case "ERULESET":
      +            buffer[1] = 2 /* NotAllowedByRuleSet */;
      +            break;
      +        }
      +        this._writeBytes(buffer);
      +        this._socket.end();
      +      }
      +      sendData(data) {
      +        this._socket.write(data);
      +      }
      +      end() {
      +        this._socket.end();
      +      }
      +      error(error) {
      +        this._socket.destroy(new Error(error));
      +      }
      +    };
      +    SocksProxy = class _SocksProxy extends import_events2.default {
      +      constructor() {
      +        super();
      +        this._connections = /* @__PURE__ */ new Map();
      +        this._sockets = /* @__PURE__ */ new Set();
      +        this._closed = false;
      +        this._patternMatcher = () => false;
      +        this._directSockets = /* @__PURE__ */ new Map();
      +        this._server = new import_net2.default.Server((socket) => {
      +          const uid = createGuid();
      +          const connection = new SocksConnection(uid, socket, this);
      +          this._connections.set(uid, connection);
      +        });
      +        this._server.on("connection", (socket) => {
      +          if (this._closed) {
      +            socket.destroy();
      +            return;
      +          }
      +          this._sockets.add(socket);
      +          socket.once("close", () => this._sockets.delete(socket));
      +        });
      +      }
      +      static {
      +        this.Events = {
      +          SocksRequested: "socksRequested",
      +          SocksData: "socksData",
      +          SocksClosed: "socksClosed"
      +        };
      +      }
      +      setPattern(pattern) {
      +        try {
      +          this._patternMatcher = parsePattern(pattern);
      +        } catch (e) {
      +          this._patternMatcher = () => false;
      +        }
      +      }
      +      async _handleDirect(request2) {
      +        try {
      +          const socket = await createSocket(request2.host, request2.port);
      +          socket.on("data", (data) => this._connections.get(request2.uid)?.sendData(data));
      +          socket.on("error", (error) => {
      +            this._connections.get(request2.uid)?.error(error.message);
      +            this._directSockets.delete(request2.uid);
      +          });
      +          socket.on("end", () => {
      +            this._connections.get(request2.uid)?.end();
      +            this._directSockets.delete(request2.uid);
      +          });
      +          const localAddress = socket.localAddress;
      +          const localPort = socket.localPort;
      +          this._directSockets.set(request2.uid, socket);
      +          this._connections.get(request2.uid)?.socketConnected(localAddress, localPort);
      +        } catch (error) {
      +          this._connections.get(request2.uid)?.socketFailed(error.code);
      +        }
      +      }
      +      port() {
      +        return this._port;
      +      }
      +      async listen(port, hostname) {
      +        return new Promise((f) => {
      +          this._server.listen(port, hostname, () => {
      +            const port2 = this._server.address().port;
      +            this._port = port2;
      +            f(port2);
      +          });
      +        });
      +      }
      +      async close() {
      +        if (this._closed)
      +          return;
      +        this._closed = true;
      +        for (const socket of this._sockets)
      +          socket.destroy();
      +        this._sockets.clear();
      +        await new Promise((f) => this._server.close(f));
      +      }
      +      onSocketRequested(payload) {
      +        if (!this._patternMatcher(payload.host, payload.port)) {
      +          this._handleDirect(payload);
      +          return;
      +        }
      +        this.emit(_SocksProxy.Events.SocksRequested, payload);
      +      }
      +      onSocketData(payload) {
      +        const direct = this._directSockets.get(payload.uid);
      +        if (direct) {
      +          direct.write(payload.data);
      +          return;
      +        }
      +        this.emit(_SocksProxy.Events.SocksData, payload);
      +      }
      +      onSocketClosed(payload) {
      +        const direct = this._directSockets.get(payload.uid);
      +        if (direct) {
      +          direct.destroy();
      +          this._directSockets.delete(payload.uid);
      +          return;
      +        }
      +        this.emit(_SocksProxy.Events.SocksClosed, payload);
      +      }
      +      socketConnected({ uid, host, port }) {
      +        this._connections.get(uid)?.socketConnected(host, port);
      +      }
      +      socketFailed({ uid, errorCode }) {
      +        this._connections.get(uid)?.socketFailed(errorCode);
      +      }
      +      sendSocketData({ uid, data }) {
      +        this._connections.get(uid)?.sendData(data);
      +      }
      +      sendSocketEnd({ uid }) {
      +        this._connections.get(uid)?.end();
      +      }
      +      sendSocketError({ uid, error }) {
      +        this._connections.get(uid)?.error(error);
      +      }
      +    };
      +    SocksProxyHandler = class _SocksProxyHandler extends import_events2.default {
      +      constructor(pattern, redirectPortForTest) {
      +        super();
      +        this._sockets = /* @__PURE__ */ new Map();
      +        this._patternMatcher = () => false;
      +        this._patternMatcher = parsePattern(pattern);
      +        this._redirectPortForTest = redirectPortForTest;
      +      }
      +      static {
      +        this.Events = {
      +          SocksConnected: "socksConnected",
      +          SocksData: "socksData",
      +          SocksError: "socksError",
      +          SocksFailed: "socksFailed",
      +          SocksEnd: "socksEnd"
      +        };
      +      }
      +      cleanup() {
      +        for (const uid of this._sockets.keys())
      +          this.socketClosed({ uid });
      +      }
      +      async socketRequested({ uid, host, port }) {
      +        debugLogger.log("socks", `[${uid}] => request ${host}:${port}`);
      +        if (!this._patternMatcher(host, port)) {
      +          const payload = { uid, errorCode: "ERULESET" };
      +          debugLogger.log("socks", `[${uid}] <= pattern error ${payload.errorCode}`);
      +          this.emit(_SocksProxyHandler.Events.SocksFailed, payload);
      +          return;
      +        }
      +        if (host === "local.playwright")
      +          host = "localhost";
      +        try {
      +          if (this._redirectPortForTest)
      +            port = this._redirectPortForTest;
      +          const socket = await createSocket(host, port);
      +          socket.on("data", (data) => {
      +            const payload2 = { uid, data };
      +            this.emit(_SocksProxyHandler.Events.SocksData, payload2);
      +          });
      +          socket.on("error", (error) => {
      +            const payload2 = { uid, error: error.message };
      +            debugLogger.log("socks", `[${uid}] <= network socket error ${payload2.error}`);
      +            this.emit(_SocksProxyHandler.Events.SocksError, payload2);
      +            this._sockets.delete(uid);
      +          });
      +          socket.on("end", () => {
      +            const payload2 = { uid };
      +            debugLogger.log("socks", `[${uid}] <= network socket closed`);
      +            this.emit(_SocksProxyHandler.Events.SocksEnd, payload2);
      +            this._sockets.delete(uid);
      +          });
      +          const localAddress = socket.localAddress;
      +          const localPort = socket.localPort;
      +          this._sockets.set(uid, socket);
      +          const payload = { uid, host: localAddress, port: localPort };
      +          debugLogger.log("socks", `[${uid}] <= connected to network ${payload.host}:${payload.port}`);
      +          this.emit(_SocksProxyHandler.Events.SocksConnected, payload);
      +        } catch (error) {
      +          const payload = { uid, errorCode: error.code };
      +          debugLogger.log("socks", `[${uid}] <= connect error ${payload.errorCode}`);
      +          this.emit(_SocksProxyHandler.Events.SocksFailed, payload);
      +        }
      +      }
      +      sendSocketData({ uid, data }) {
      +        this._sockets.get(uid)?.write(data);
      +      }
      +      socketClosed({ uid }) {
      +        debugLogger.log("socks", `[${uid}] <= browser socket closed`);
      +        this._sockets.get(uid)?.destroy();
      +        this._sockets.delete(uid);
      +      }
      +    };
      +  }
      +});
      +
      +// packages/utils/spawnAsync.ts
      +function spawnAsync(cmd, args, options = {}) {
      +  const process2 = (0, import_child_process.spawn)(cmd, args, Object.assign({ windowsHide: true }, options));
      +  return new Promise((resolve) => {
      +    let stdout = "";
      +    let stderr = "";
      +    if (process2.stdout)
      +      process2.stdout.on("data", (data) => stdout += data.toString());
      +    if (process2.stderr)
      +      process2.stderr.on("data", (data) => stderr += data.toString());
      +    process2.on("close", (code) => resolve({ stdout, stderr, code }));
      +    process2.on("error", (error) => resolve({ stdout, stderr, code: 0, error }));
      +  });
      +}
      +var import_child_process;
      +var init_spawnAsync = __esm({
      +  "packages/utils/spawnAsync.ts"() {
      +    "use strict";
      +    import_child_process = require("child_process");
      +  }
      +});
      +
      +// packages/utils/stringWidth.ts
      +function characterWidth(c) {
      +  return getEastAsianWidth.eastAsianWidth(c.codePointAt(0));
      +}
      +function stringWidth(v) {
      +  let width = 0;
      +  for (const { segment } of new Intl.Segmenter(void 0, { granularity: "grapheme" }).segment(v))
      +    width += characterWidth(segment);
      +  return width;
      +}
      +function suffixOfWidth(v, width) {
      +  const segments = [...new Intl.Segmenter(void 0, { granularity: "grapheme" }).segment(v)];
      +  let suffixBegin = v.length;
      +  for (const { segment, index } of segments.reverse()) {
      +    const segmentWidth = stringWidth(segment);
      +    if (segmentWidth > width)
      +      break;
      +    width -= segmentWidth;
      +    suffixBegin = index;
      +  }
      +  return v.substring(suffixBegin);
      +}
      +function fitToWidth(line, width, prefix) {
      +  const prefixLength = prefix ? stripAnsiEscapes(prefix).length : 0;
      +  width -= prefixLength;
      +  if (stringWidth(line) <= width)
      +    return line;
      +  const parts = line.split(ansiRegex);
      +  const taken = [];
      +  for (let i = parts.length - 1; i >= 0; i--) {
      +    if (i % 2) {
      +      taken.push(parts[i]);
      +    } else {
      +      let part = suffixOfWidth(parts[i], width);
      +      const wasTruncated = part.length < parts[i].length;
      +      if (wasTruncated && parts[i].length > 0) {
      +        part = "\u2026" + suffixOfWidth(parts[i], width - 1);
      +      }
      +      taken.push(part);
      +      width -= stringWidth(part);
      +    }
      +  }
      +  return taken.reverse().join("");
      +}
      +var getEastAsianWidth;
      +var init_stringWidth = __esm({
      +  "packages/utils/stringWidth.ts"() {
      +    "use strict";
      +    init_stringUtils();
      +    getEastAsianWidth = require("./utilsBundle").getEastAsianWidth;
      +  }
      +});
      +
      +// packages/utils/task.ts
      +function makeWaitForNextTask() {
      +  if (process.versions.electron)
      +    return (callback) => setTimeout(callback, 0);
      +  if (parseInt(process.versions.node, 10) >= 11)
      +    return setImmediate;
      +  let spinning = false;
      +  const callbacks = [];
      +  const loop = () => {
      +    const callback = callbacks.shift();
      +    if (!callback) {
      +      spinning = false;
      +      return;
      +    }
      +    setImmediate(loop);
      +    callback();
      +  };
      +  return (callback) => {
      +    callbacks.push(callback);
      +    if (!spinning) {
      +      spinning = true;
      +      setImmediate(loop);
      +    }
      +  };
      +}
      +var init_task = __esm({
      +  "packages/utils/task.ts"() {
      +    "use strict";
      +  }
      +});
      +
      +// packages/utils/wsServer.ts
      +var wsServer2, lastConnectionId, kConnectionSymbol, perMessageDeflate, WSServer;
      +var init_wsServer = __esm({
      +  "packages/utils/wsServer.ts"() {
      +    "use strict";
      +    init_httpServer();
      +    init_network();
      +    init_debugLogger();
      +    ({ wsServer: wsServer2 } = require("./utilsBundle"));
      +    lastConnectionId = 0;
      +    kConnectionSymbol = Symbol("kConnection");
      +    perMessageDeflate = {
      +      serverNoContextTakeover: true,
      +      zlibDeflateOptions: {
      +        level: 3
      +      },
      +      zlibInflateOptions: {
      +        chunkSize: 10 * 1024
      +      },
      +      threshold: 10 * 1024
      +    };
      +    WSServer = class {
      +      constructor(delegate) {
      +        // Allowed Host headers for HTTP requests. null disables the check (server bound to a public address).
      +        this._allowedHosts = null;
      +        this._delegate = delegate;
      +      }
      +      async listen(port = 0, hostname, path59) {
      +        debugLogger.log("server", `Server started at ${/* @__PURE__ */ new Date()}`);
      +        hostname ??= "localhost";
      +        const server = createHttpServer((request2, response2) => this._onRequest(request2, response2));
      +        server.on("error", (error) => debugLogger.log("server", String(error)));
      +        this.server = server;
      +        const wsEndpoint = await new Promise((resolve, reject) => {
      +          server.listen(port, hostname, () => {
      +            const address = server.address();
      +            if (!address) {
      +              reject(new Error("Could not bind server socket"));
      +              return;
      +            }
      +            if (typeof address === "string") {
      +              resolve(`${address}${path59}`);
      +              return;
      +            }
      +            this._allowedHosts = computeAllowedHosts(hostname, address.address);
      +            resolve(`ws://${urlHostFromAddress(address)}:${address.port}${path59}`);
      +          }).on("error", reject);
      +        });
      +        debugLogger.log("server", "Listening at " + wsEndpoint);
      +        this._wsServer = new wsServer2({
      +          noServer: true,
      +          perMessageDeflate
      +        });
      +        this._wsServer.on("headers", (headers) => this._delegate.onHeaders(headers));
      +        server.on("upgrade", (request2, socket, head) => {
      +          const pathname = new URL("http://localhost" + request2.url).pathname;
      +          if (pathname !== path59) {
      +            socket.write(`HTTP/${request2.httpVersion} 400 Bad Request\r
      +\r
      +`);
      +            socket.destroy();
      +            return;
      +          }
      +          if (this._allowedHosts && !this._isAllowedOrigin(request2.headers.origin)) {
      +            socket.write(`HTTP/${request2.httpVersion} 403 Forbidden\r
      +\r
      +`);
      +            socket.destroy();
      +            return;
      +          }
      +          const upgradeResult = this._delegate.onUpgrade(request2, socket);
      +          if (upgradeResult) {
      +            socket.write(upgradeResult.error);
      +            socket.destroy();
      +            return;
      +          }
      +          this._wsServer.handleUpgrade(request2, socket, head, (ws4) => this._wsServer.emit("connection", ws4, request2));
      +        });
      +        this._wsServer.on("connection", (ws4, request2) => {
      +          debugLogger.log("server", "Connected client ws.extension=" + ws4.extensions);
      +          const url2 = new URL("http://localhost" + (request2.url || ""));
      +          const id = String(++lastConnectionId);
      +          debugLogger.log("server", `[${id}] serving connection: ${request2.url}`);
      +          const connection = this._delegate.onConnection(request2, url2, ws4, id);
      +          ws4[kConnectionSymbol] = connection;
      +        });
      +        return wsEndpoint;
      +      }
      +      _onRequest(request2, response2) {
      +        if (this._allowedHosts) {
      +          const host = request2.headers.host?.toLowerCase();
      +          const hostname = host ? hostnameFromHostHeader(host) : void 0;
      +          if (!hostname || !this._allowedHosts.has(hostname)) {
      +            response2.statusCode = 403;
      +            response2.end();
      +            return;
      +          }
      +        }
      +        this._delegate.onRequest(request2, response2);
      +      }
      +      _isAllowedOrigin(origin) {
      +        if (!origin)
      +          return true;
      +        try {
      +          const hostname = new URL(origin).hostname.toLowerCase();
      +          const bracketed = hostname.includes(":") ? `[${hostname}]` : hostname;
      +          return this._allowedHosts.has(hostname) || this._allowedHosts.has(bracketed);
      +        } catch {
      +          return false;
      +        }
      +      }
      +      async close() {
      +        const server = this._wsServer;
      +        if (!server)
      +          return;
      +        debugLogger.log("server", "closing websocket server");
      +        const waitForClose = new Promise((f) => server.close(f));
      +        await Promise.all(Array.from(server.clients).map(async (ws4) => {
      +          const connection = ws4[kConnectionSymbol];
      +          if (connection)
      +            await connection.close();
      +          try {
      +            ws4.terminate();
      +          } catch (e) {
      +          }
      +        }));
      +        await waitForClose;
      +        debugLogger.log("server", "closing http server");
      +        if (this.server)
      +          await new Promise((f) => this.server.close(f));
      +        this._wsServer = void 0;
      +        this.server = void 0;
      +        debugLogger.log("server", "closed server");
      +      }
      +    };
      +  }
      +});
      +
      +// packages/utils/zipFile.ts
      +var yauzl, ZipFile;
      +var init_zipFile = __esm({
      +  "packages/utils/zipFile.ts"() {
      +    "use strict";
      +    yauzl = require("./utilsBundle").yauzl;
      +    ZipFile = class {
      +      constructor(fileName) {
      +        this._entries = /* @__PURE__ */ new Map();
      +        this._fileName = fileName;
      +        this._openedPromise = this._open();
      +      }
      +      async _open() {
      +        await new Promise((fulfill, reject) => {
      +          yauzl.open(this._fileName, { autoClose: false }, (e, z31) => {
      +            if (e) {
      +              reject(e);
      +              return;
      +            }
      +            this._zipFile = z31;
      +            this._zipFile.on("entry", (entry) => {
      +              this._entries.set(entry.fileName, entry);
      +            });
      +            this._zipFile.on("end", fulfill);
      +          });
      +        });
      +      }
      +      async entries() {
      +        await this._openedPromise;
      +        return [...this._entries.keys()];
      +      }
      +      async read(entryPath) {
      +        await this._openedPromise;
      +        const entry = this._entries.get(entryPath);
      +        if (!entry)
      +          throw new Error(`${entryPath} not found in file ${this._fileName}`);
      +        return new Promise((resolve, reject) => {
      +          this._zipFile.openReadStream(entry, (error, readStream) => {
      +            if (error || !readStream) {
      +              reject(error || "Entry not found");
      +              return;
      +            }
      +            const buffers = [];
      +            readStream.on("data", (data) => buffers.push(data));
      +            readStream.on("end", () => resolve(Buffer.concat(buffers)));
      +          });
      +        });
      +      }
      +      close() {
      +        this._zipFile?.close();
      +      }
      +    };
      +  }
      +});
      +
      +// packages/utils/third_party/extractZip.ts
      +async function extractZip(zipPath, opts) {
      +  debug2("creating target directory", opts.dir);
      +  if (!import_path6.default.isAbsolute(opts.dir))
      +    throw new Error("Target directory is expected to be absolute");
      +  await import_fs9.promises.mkdir(opts.dir, { recursive: true });
      +  opts.dir = await import_fs9.promises.realpath(opts.dir);
      +  return new Extractor(zipPath, opts).extract();
      +}
      +var import_fs9, import_path6, import_stream2, import_util, debugPkg, getStream, yauzl2, debug2, openZip, pipeline2, Extractor;
      +var init_extractZip = __esm({
      +  "packages/utils/third_party/extractZip.ts"() {
      +    "use strict";
      +    import_fs9 = require("fs");
      +    import_path6 = __toESM(require("path"));
      +    import_stream2 = __toESM(require("stream"));
      +    import_util = require("util");
      +    debugPkg = require("./utilsBundle").debug;
      +    getStream = require("./utilsBundle").getStream;
      +    yauzl2 = require("./utilsBundle").yauzl;
      +    debug2 = debugPkg("extract-zip");
      +    openZip = (0, import_util.promisify)(yauzl2.open);
      +    pipeline2 = (0, import_util.promisify)(import_stream2.default.pipeline);
      +    Extractor = class {
      +      constructor(zipPath, opts) {
      +        this.canceled = false;
      +        this.zipPath = zipPath;
      +        this.opts = opts;
      +      }
      +      async extract() {
      +        debug2("opening", this.zipPath, "with opts", this.opts);
      +        this.zipfile = await openZip(this.zipPath, { lazyEntries: true });
      +        this.canceled = false;
      +        return new Promise((resolve, reject) => {
      +          this.zipfile.on("error", (err) => {
      +            this.canceled = true;
      +            reject(err);
      +          });
      +          this.zipfile.readEntry();
      +          this.zipfile.on("close", () => {
      +            if (!this.canceled) {
      +              debug2("zip extraction complete");
      +              resolve();
      +            }
      +          });
      +          this.zipfile.on("entry", async (entry) => {
      +            if (this.canceled) {
      +              debug2("skipping entry", entry.fileName, { cancelled: this.canceled });
      +              return;
      +            }
      +            debug2("zipfile entry", entry.fileName);
      +            if (entry.fileName.startsWith("__MACOSX/")) {
      +              this.zipfile.readEntry();
      +              return;
      +            }
      +            const destDir = import_path6.default.dirname(import_path6.default.join(this.opts.dir, entry.fileName));
      +            try {
      +              await import_fs9.promises.mkdir(destDir, { recursive: true });
      +              const canonicalDestDir = await import_fs9.promises.realpath(destDir);
      +              const relativeDestDir = import_path6.default.relative(this.opts.dir, canonicalDestDir);
      +              if (relativeDestDir.split(import_path6.default.sep).includes(".."))
      +                throw new Error(`Out of bound path "${canonicalDestDir}" found while processing file ${entry.fileName}`);
      +              await this.extractEntry(entry);
      +              debug2("finished processing", entry.fileName);
      +              this.zipfile.readEntry();
      +            } catch (err) {
      +              this.canceled = true;
      +              this.zipfile.close();
      +              reject(err);
      +            }
      +          });
      +        });
      +      }
      +      async extractEntry(entry) {
      +        if (this.canceled) {
      +          debug2("skipping entry extraction", entry.fileName, { cancelled: this.canceled });
      +          return;
      +        }
      +        if (this.opts.onEntry)
      +          this.opts.onEntry(entry, this.zipfile);
      +        const dest = import_path6.default.join(this.opts.dir, entry.fileName);
      +        const mode = entry.externalFileAttributes >> 16 & 65535;
      +        const IFMT = 61440;
      +        const IFDIR = 16384;
      +        const IFLNK = 40960;
      +        const symlink = (mode & IFMT) === IFLNK;
      +        let isDir = (mode & IFMT) === IFDIR;
      +        if (!isDir && entry.fileName.endsWith("/"))
      +          isDir = true;
      +        const madeBy = entry.versionMadeBy >> 8;
      +        if (!isDir)
      +          isDir = madeBy === 0 && entry.externalFileAttributes === 16;
      +        debug2("extracting entry", { filename: entry.fileName, isDir, isSymlink: symlink });
      +        const procMode = this.getExtractedMode(mode, isDir) & 511;
      +        const destDir = isDir ? dest : import_path6.default.dirname(dest);
      +        const mkdirOptions = { recursive: true };
      +        if (isDir)
      +          mkdirOptions.mode = procMode;
      +        debug2("mkdir", { dir: destDir, ...mkdirOptions });
      +        await import_fs9.promises.mkdir(destDir, mkdirOptions);
      +        if (isDir)
      +          return;
      +        debug2("opening read stream", dest);
      +        const readStream = await (0, import_util.promisify)(this.zipfile.openReadStream.bind(this.zipfile))(entry);
      +        if (symlink) {
      +          const link = await getStream(readStream);
      +          debug2("creating symlink", link, dest);
      +          await import_fs9.promises.symlink(link, dest);
      +        } else {
      +          await pipeline2(readStream, (0, import_fs9.createWriteStream)(dest, { mode: procMode }));
      +        }
      +      }
      +      getExtractedMode(entryMode, isDir) {
      +        let mode = entryMode;
      +        if (mode === 0) {
      +          if (isDir) {
      +            if (this.opts.defaultDirMode)
      +              mode = Number(this.opts.defaultDirMode);
      +            if (!mode)
      +              mode = 493;
      +          } else {
      +            if (this.opts.defaultFileMode)
      +              mode = Number(this.opts.defaultFileMode);
      +            if (!mode)
      +              mode = 420;
      +          }
      +        }
      +        return mode;
      +      }
      +    };
      +  }
      +});
      +
      +// packages/utils/third_party/lockfile.ts
      +function probe(file, fs61, callback) {
      +  const cachedPrecision = fs61[cacheSymbol];
      +  if (cachedPrecision) {
      +    return fs61.stat(file, (err, stat) => {
      +      if (err)
      +        return callback(err);
      +      callback(null, stat.mtime, cachedPrecision);
      +    });
      +  }
      +  const mtime = new Date(Math.ceil(Date.now() / 1e3) * 1e3 + 5);
      +  fs61.utimes(file, mtime, mtime, (err) => {
      +    if (err)
      +      return callback(err);
      +    fs61.stat(file, (err2, stat) => {
      +      if (err2)
      +        return callback(err2);
      +      const precision = stat.mtime.getTime() % 1e3 === 0 ? "s" : "ms";
      +      Object.defineProperty(fs61, cacheSymbol, { value: precision });
      +      callback(null, stat.mtime, precision);
      +    });
      +  });
      +}
      +function getMtime(precision) {
      +  let now = Date.now();
      +  if (precision === "s")
      +    now = Math.ceil(now / 1e3) * 1e3;
      +  return new Date(now);
      +}
      +function getLockFile(file, options) {
      +  return options.lockfilePath || `${file}.lock`;
      +}
      +function resolveCanonicalPath(file, options, callback) {
      +  if (!options.realpath)
      +    return callback(null, import_path7.default.resolve(file));
      +  options.fs.realpath(file, callback);
      +}
      +function acquireLock(file, options, callback) {
      +  const lockfilePath = getLockFile(file, options);
      +  options.fs.mkdir(lockfilePath, (err) => {
      +    if (!err) {
      +      return probe(lockfilePath, options.fs, (err2, mtime, mtimePrecision) => {
      +        if (err2) {
      +          options.fs.rmdir(lockfilePath, () => {
      +          });
      +          return callback(err2);
      +        }
      +        callback(null, mtime, mtimePrecision);
      +      });
      +    }
      +    if (err.code !== "EEXIST")
      +      return callback(err);
      +    if (options.stale <= 0)
      +      return callback(Object.assign(new Error("Lock file is already being held"), { code: "ELOCKED", file }));
      +    options.fs.stat(lockfilePath, (err2, stat) => {
      +      if (err2) {
      +        if (err2.code === "ENOENT")
      +          return acquireLock(file, { ...options, stale: 0 }, callback);
      +        return callback(err2);
      +      }
      +      if (!isLockStale(stat, options))
      +        return callback(Object.assign(new Error("Lock file is already being held"), { code: "ELOCKED", file }));
      +      removeLock(file, options, (err3) => {
      +        if (err3)
      +          return callback(err3);
      +        acquireLock(file, { ...options, stale: 0 }, callback);
      +      });
      +    });
      +  });
      +}
      +function isLockStale(stat, options) {
      +  return stat.mtime.getTime() < Date.now() - options.stale;
      +}
      +function removeLock(file, options, callback) {
      +  options.fs.rmdir(getLockFile(file, options), (err) => {
      +    if (err && err.code !== "ENOENT")
      +      return callback(err);
      +    callback(null);
      +  });
      +}
      +function updateLock(file, options) {
      +  const lock2 = locks[file];
      +  if (lock2.updateTimeout)
      +    return;
      +  lock2.updateDelay = lock2.updateDelay || options.update;
      +  lock2.updateTimeout = setTimeout(() => {
      +    lock2.updateTimeout = null;
      +    options.fs.stat(lock2.lockfilePath, (err, stat) => {
      +      const isOverThreshold = lock2.lastUpdate + options.stale < Date.now();
      +      if (err) {
      +        if (err.code === "ENOENT" || isOverThreshold)
      +          return setLockAsCompromised(file, lock2, Object.assign(err, { code: "ECOMPROMISED" }));
      +        lock2.updateDelay = 1e3;
      +        return updateLock(file, options);
      +      }
      +      const isMtimeOurs = lock2.mtime.getTime() === stat.mtime.getTime();
      +      if (!isMtimeOurs) {
      +        return setLockAsCompromised(
      +          file,
      +          lock2,
      +          Object.assign(
      +            new Error("Unable to update lock within the stale threshold"),
      +            { code: "ECOMPROMISED" }
      +          )
      +        );
      +      }
      +      const mtime = getMtime(lock2.mtimePrecision);
      +      options.fs.utimes(lock2.lockfilePath, mtime, mtime, (err2) => {
      +        const isOverThreshold2 = lock2.lastUpdate + options.stale < Date.now();
      +        if (lock2.released)
      +          return;
      +        if (err2) {
      +          if (err2.code === "ENOENT" || isOverThreshold2)
      +            return setLockAsCompromised(file, lock2, Object.assign(err2, { code: "ECOMPROMISED" }));
      +          lock2.updateDelay = 1e3;
      +          return updateLock(file, options);
      +        }
      +        lock2.mtime = mtime;
      +        lock2.lastUpdate = Date.now();
      +        lock2.updateDelay = null;
      +        updateLock(file, options);
      +      });
      +    });
      +  }, lock2.updateDelay);
      +  if (lock2.updateTimeout && lock2.updateTimeout.unref)
      +    lock2.updateTimeout.unref();
      +}
      +function setLockAsCompromised(file, lock2, err) {
      +  lock2.released = true;
      +  if (lock2.updateTimeout)
      +    clearTimeout(lock2.updateTimeout);
      +  if (locks[file] === lock2)
      +    delete locks[file];
      +  lock2.options.onCompromised(err);
      +}
      +function lockImpl(file, options, callback) {
      +  const resolvedOptions = {
      +    stale: 1e4,
      +    update: null,
      +    realpath: true,
      +    retries: 0,
      +    fs: gracefulFs,
      +    onCompromised: (err) => {
      +      throw err;
      +    },
      +    ...options
      +  };
      +  resolvedOptions.retries = resolvedOptions.retries || 0;
      +  resolvedOptions.retries = typeof resolvedOptions.retries === "number" ? { retries: resolvedOptions.retries } : resolvedOptions.retries;
      +  resolvedOptions.stale = Math.max(resolvedOptions.stale || 0, 2e3);
      +  resolvedOptions.update = resolvedOptions.update === null || resolvedOptions.update === void 0 ? resolvedOptions.stale / 2 : resolvedOptions.update || 0;
      +  resolvedOptions.update = Math.max(Math.min(resolvedOptions.update, resolvedOptions.stale / 2), 1e3);
      +  resolveCanonicalPath(file, resolvedOptions, (err, resolvedFile) => {
      +    if (err)
      +      return callback(err);
      +    const canonicalFile = resolvedFile;
      +    const operation = retry.operation(resolvedOptions.retries);
      +    operation.attempt(() => {
      +      acquireLock(canonicalFile, resolvedOptions, (err2, mtime, mtimePrecision) => {
      +        if (operation.retry(err2 || void 0))
      +          return;
      +        if (err2)
      +          return callback(operation.mainError());
      +        const lock2 = locks[canonicalFile] = {
      +          lockfilePath: getLockFile(canonicalFile, resolvedOptions),
      +          mtime,
      +          mtimePrecision,
      +          options: resolvedOptions,
      +          lastUpdate: Date.now()
      +        };
      +        updateLock(canonicalFile, resolvedOptions);
      +        callback(null, (releasedCallback) => {
      +          if (lock2.released) {
      +            return releasedCallback && releasedCallback(Object.assign(new Error("Lock is already released"), { code: "ERELEASED" }));
      +          }
      +          unlock(canonicalFile, { ...resolvedOptions, realpath: false }, releasedCallback || (() => {
      +          }));
      +        });
      +      });
      +    });
      +  });
      +}
      +function unlock(file, options, callback) {
      +  const resolvedOptions = {
      +    stale: 1e4,
      +    update: null,
      +    realpath: true,
      +    retries: 0,
      +    fs: gracefulFs,
      +    onCompromised: (err) => {
      +      throw err;
      +    },
      +    ...options
      +  };
      +  resolveCanonicalPath(file, resolvedOptions, (err, resolvedFile) => {
      +    if (err)
      +      return callback(err);
      +    const canonicalFile = resolvedFile;
      +    const lock2 = locks[canonicalFile];
      +    if (!lock2)
      +      return callback(Object.assign(new Error("Lock is not acquired/owned by you"), { code: "ENOTACQUIRED" }));
      +    if (lock2.updateTimeout)
      +      clearTimeout(lock2.updateTimeout);
      +    lock2.released = true;
      +    delete locks[canonicalFile];
      +    removeLock(canonicalFile, resolvedOptions, callback);
      +  });
      +}
      +function toPromise(method) {
      +  return (...args) => new Promise((resolve, reject) => {
      +    args.push((err, result2) => {
      +      if (err)
      +        reject(err);
      +      else
      +        resolve(result2);
      +    });
      +    method(...args);
      +  });
      +}
      +function ensureCleanup() {
      +  if (cleanupInitialized)
      +    return;
      +  cleanupInitialized = true;
      +  onExit(() => {
      +    for (const file in locks) {
      +      const options = locks[file].options;
      +      try {
      +        options.fs.rmdirSync(getLockFile(file, options));
      +      } catch (e) {
      +      }
      +    }
      +  });
      +}
      +async function lock(file, options) {
      +  ensureCleanup();
      +  const release = await toPromise(lockImpl)(file, options || {});
      +  return toPromise(release);
      +}
      +var import_path7, gracefulFs, retry, onExit, locks, cacheSymbol, cleanupInitialized;
      +var init_lockfile = __esm({
      +  "packages/utils/third_party/lockfile.ts"() {
      +    "use strict";
      +    import_path7 = __toESM(require("path"));
      +    gracefulFs = require("./utilsBundle").gracefulFs;
      +    retry = require("./utilsBundle").retry;
      +    onExit = require("./utilsBundle").onExit;
      +    locks = {};
      +    cacheSymbol = Symbol();
      +    cleanupInitialized = false;
      +  }
      +});
      +
      +// packages/utils/index.ts
      +var utils_exports = {};
      +__export(utils_exports, {
      +  FastStats: () => FastStats,
      +  HttpServer: () => HttpServer,
      +  ImageChannel: () => ImageChannel,
      +  NET_DEFAULT_TIMEOUT: () => NET_DEFAULT_TIMEOUT,
      +  RecentLogsCollector: () => RecentLogsCollector,
      +  SerializedFS: () => SerializedFS,
      +  SocksProxy: () => SocksProxy,
      +  SocksProxyHandler: () => SocksProxyHandler,
      +  WSServer: () => WSServer,
      +  ZipFile: () => ZipFile,
      +  Zone: () => Zone,
      +  addSuffixToFilePath: () => addSuffixToFilePath,
      +  blendWithWhite: () => blendWithWhite,
      +  calculateSha1: () => calculateSha1,
      +  canAccessFile: () => canAccessFile,
      +  colorDeltaE94: () => colorDeltaE94,
      +  compare: () => compare,
      +  compareBuffersOrStrings: () => compareBuffersOrStrings,
      +  computeAllowedHosts: () => computeAllowedHosts,
      +  copyFileAndMakeWritable: () => copyFileAndMakeWritable,
      +  createGuid: () => createGuid,
      +  createHttp2Server: () => createHttp2Server,
      +  createHttpServer: () => createHttpServer,
      +  createHttpsServer: () => createHttpsServer,
      +  createProxyAgent: () => createProxyAgent,
      +  currentZone: () => currentZone,
      +  debugLogger: () => debugLogger,
      +  debugMode: () => debugMode,
      +  decorateServer: () => decorateServer,
      +  defaultUserDataDirForChannel: () => defaultUserDataDirForChannel,
      +  emptyZone: () => emptyZone,
      +  envArrayToObject: () => envArrayToObject,
      +  eventsHelper: () => eventsHelper,
      +  existsAsync: () => existsAsync,
      +  extractZip: () => extractZip,
      +  fitToWidth: () => fitToWidth,
      +  generateSelfSignedCertificate: () => generateSelfSignedCertificate,
      +  getAsBooleanFromENV: () => getAsBooleanFromENV,
      +  getComparator: () => getComparator,
      +  getFromENV: () => getFromENV,
      +  getPackageManager: () => getPackageManager,
      +  getPackageManagerExecCommand: () => getPackageManagerExecCommand,
      +  gracefullyCloseAll: () => gracefullyCloseAll,
      +  gracefullyCloseSet: () => gracefullyCloseSet,
      +  gracefullyProcessExitDoNotHang: () => gracefullyProcessExitDoNotHang,
      +  guessClientName: () => guessClientName,
      +  hostPlatform: () => hostPlatform,
      +  hostnameFromHostHeader: () => hostnameFromHostHeader,
      +  httpRequest: () => httpRequest,
      +  isChromiumChannelName: () => isChromiumChannelName,
      +  isCodingAgent: () => isCodingAgent,
      +  isLikelyNpxGlobal: () => isLikelyNpxGlobal,
      +  isOfficiallySupportedPlatform: () => isOfficiallySupportedPlatform,
      +  isPathInside: () => isPathInside,
      +  isSystemDirectory: () => isSystemDirectory,
      +  isURLAvailable: () => isURLAvailable,
      +  isUnderTest: () => isUnderTest,
      +  isWritable: () => isWritable,
      +  jsonStringifyForceASCII: () => jsonStringifyForceASCII,
      +  launchProcess: () => launchProcess,
      +  lock: () => lock,
      +  makeSocketPath: () => makeSocketPath,
      +  makeWaitForNextTask: () => makeWaitForNextTask,
      +  mkdirIfNeeded: () => mkdirIfNeeded,
      +  nodePlatform: () => nodePlatform,
      +  parsePattern: () => parsePattern,
      +  perMessageDeflate: () => perMessageDeflate,
      +  removeFolders: () => removeFolders,
      +  resolveWithinRoot: () => resolveWithinRoot,
      +  rgb2gray: () => rgb2gray,
      +  sanitizeForFilePath: () => sanitizeForFilePath,
      +  serveFolder: () => serveFolder,
      +  setBoxedStackPrefixes: () => setBoxedStackPrefixes,
      +  setPlaywrightTestProcessEnv: () => setPlaywrightTestProcessEnv,
      +  shortPlatform: () => shortPlatform,
      +  spawnAsync: () => spawnAsync,
      +  srgb2xyz: () => srgb2xyz,
      +  ssim: () => ssim,
      +  startHttpServer: () => startHttpServer,
      +  startProfiling: () => startProfiling,
      +  stopProfiling: () => stopProfiling,
      +  stringWidth: () => stringWidth,
      +  throwingResolveWithinRoot: () => throwingResolveWithinRoot,
      +  toPosixPath: () => toPosixPath,
      +  trimLongString: () => trimLongString,
      +  urlHostFromAddress: () => urlHostFromAddress,
      +  wrapInASCIIBox: () => wrapInASCIIBox,
      +  xyz2lab: () => xyz2lab
      +});
      +var init_utils = __esm({
      +  "packages/utils/index.ts"() {
      +    "use strict";
      +    init_ascii();
      +    init_chromiumChannels();
      +    init_comparators();
      +    init_crypto();
      +    init_debug();
      +    init_debugLogger();
      +    init_env();
      +    init_eventsHelper();
      +    init_fileUtils();
      +    init_hostPlatform();
      +    init_httpServer();
      +    init_network();
      +    init_nodePlatform();
      +    init_processLauncher();
      +    init_profiler();
      +    init_serializedFS();
      +    init_socksProxy();
      +    init_spawnAsync();
      +    init_stringWidth();
      +    init_task();
      +    init_wsServer();
      +    init_zipFile();
      +    init_zones();
      +    init_extractZip();
      +    init_lockfile();
      +    init_colorUtils();
      +    init_compare();
      +    init_imageChannel();
      +    init_stats();
      +  }
      +});
      +
      +// packages/playwright-core/src/client/eventEmitter.ts
      +function checkListener(listener) {
      +  if (typeof listener !== "function")
      +    throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);
      +}
      +function unwrapListener(l) {
      +  return wrappedListener(l) ?? l;
      +}
      +function unwrapListeners(arr) {
      +  return arr.map((l) => wrappedListener(l) ?? l);
      +}
      +function wrappedListener(l) {
      +  return l.listener;
      +}
      +var EventEmitter3, OnceWrapper;
      +var init_eventEmitter = __esm({
      +  "packages/playwright-core/src/client/eventEmitter.ts"() {
      +    "use strict";
      +    EventEmitter3 = class {
      +      constructor(platform) {
      +        this._events = void 0;
      +        this._eventsCount = 0;
      +        this._maxListeners = void 0;
      +        this._pendingHandlers = /* @__PURE__ */ new Map();
      +        this._platform = platform;
      +        if (this._events === void 0 || this._events === Object.getPrototypeOf(this)._events) {
      +          this._events = /* @__PURE__ */ Object.create(null);
      +          this._eventsCount = 0;
      +        }
      +        this._maxListeners = this._maxListeners || void 0;
      +        this.on = this.addListener;
      +        this.off = this.removeListener;
      +      }
      +      setMaxListeners(n) {
      +        if (typeof n !== "number" || n < 0 || Number.isNaN(n))
      +          throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + ".");
      +        this._maxListeners = n;
      +        return this;
      +      }
      +      getMaxListeners() {
      +        return this._maxListeners === void 0 ? this._platform.defaultMaxListeners() : this._maxListeners;
      +      }
      +      emit(type3, ...args) {
      +        const events = this._events;
      +        if (events === void 0)
      +          return false;
      +        const handler = events?.[type3];
      +        if (handler === void 0)
      +          return false;
      +        if (typeof handler === "function") {
      +          this._callHandler(type3, handler, args);
      +        } else {
      +          const len = handler.length;
      +          const listeners = handler.slice();
      +          for (let i = 0; i < len; ++i)
      +            this._callHandler(type3, listeners[i], args);
      +        }
      +        return true;
      +      }
      +      _callHandler(type3, handler, args) {
      +        const promise = Reflect.apply(handler, this, args);
      +        if (!(promise instanceof Promise))
      +          return;
      +        let set = this._pendingHandlers.get(type3);
      +        if (!set) {
      +          set = /* @__PURE__ */ new Set();
      +          this._pendingHandlers.set(type3, set);
      +        }
      +        set.add(promise);
      +        promise.catch((e) => {
      +          if (this._rejectionHandler)
      +            this._rejectionHandler(e);
      +          else
      +            throw e;
      +        }).finally(() => set.delete(promise));
      +      }
      +      addListener(type3, listener) {
      +        return this._addListener(type3, listener, false);
      +      }
      +      on(type3, listener) {
      +        return this._addListener(type3, listener, false);
      +      }
      +      _addListener(type3, listener, prepend) {
      +        checkListener(listener);
      +        let events = this._events;
      +        let existing;
      +        if (events === void 0) {
      +          events = this._events = /* @__PURE__ */ Object.create(null);
      +          this._eventsCount = 0;
      +        } else {
      +          if (events.newListener !== void 0) {
      +            this.emit("newListener", type3, unwrapListener(listener));
      +            events = this._events;
      +          }
      +          existing = events[type3];
      +        }
      +        if (existing === void 0) {
      +          existing = events[type3] = listener;
      +          ++this._eventsCount;
      +        } else {
      +          if (typeof existing === "function") {
      +            existing = events[type3] = prepend ? [listener, existing] : [existing, listener];
      +          } else if (prepend) {
      +            existing.unshift(listener);
      +          } else {
      +            existing.push(listener);
      +          }
      +          const m = this.getMaxListeners();
      +          if (m > 0 && existing.length > m && !existing.warned) {
      +            existing.warned = true;
      +            const w = new Error("Possible EventEmitter memory leak detected. " + existing.length + " " + String(type3) + " listeners added. Use emitter.setMaxListeners() to increase limit");
      +            w.name = "MaxListenersExceededWarning";
      +            w.emitter = this;
      +            w.type = type3;
      +            w.count = existing.length;
      +            if (!this._platform.isUnderTest()) {
      +              console.warn(w);
      +            }
      +          }
      +        }
      +        return this;
      +      }
      +      prependListener(type3, listener) {
      +        return this._addListener(type3, listener, true);
      +      }
      +      once(type3, listener) {
      +        checkListener(listener);
      +        this.on(type3, new OnceWrapper(this, type3, listener).wrapperFunction);
      +        return this;
      +      }
      +      prependOnceListener(type3, listener) {
      +        checkListener(listener);
      +        this.prependListener(type3, new OnceWrapper(this, type3, listener).wrapperFunction);
      +        return this;
      +      }
      +      removeListener(type3, listener) {
      +        checkListener(listener);
      +        const events = this._events;
      +        if (events === void 0)
      +          return this;
      +        const list = events[type3];
      +        if (list === void 0)
      +          return this;
      +        if (list === listener || list.listener === listener) {
      +          if (--this._eventsCount === 0) {
      +            this._events = /* @__PURE__ */ Object.create(null);
      +          } else {
      +            delete events[type3];
      +            if (events.removeListener)
      +              this.emit("removeListener", type3, list.listener ?? listener);
      +          }
      +        } else if (typeof list !== "function") {
      +          let position = -1;
      +          let originalListener;
      +          for (let i = list.length - 1; i >= 0; i--) {
      +            if (list[i] === listener || wrappedListener(list[i]) === listener) {
      +              originalListener = wrappedListener(list[i]);
      +              position = i;
      +              break;
      +            }
      +          }
      +          if (position < 0)
      +            return this;
      +          if (position === 0)
      +            list.shift();
      +          else
      +            list.splice(position, 1);
      +          if (list.length === 1)
      +            events[type3] = list[0];
      +          if (events.removeListener !== void 0)
      +            this.emit("removeListener", type3, originalListener || listener);
      +        }
      +        return this;
      +      }
      +      off(type3, listener) {
      +        return this.removeListener(type3, listener);
      +      }
      +      removeAllListeners(type3, options) {
      +        this._removeAllListeners(type3);
      +        if (!options)
      +          return this;
      +        if (options.behavior === "wait") {
      +          const errors = [];
      +          this._rejectionHandler = (error) => errors.push(error);
      +          return this._waitFor(type3).then(() => {
      +            if (errors.length)
      +              throw errors[0];
      +          });
      +        }
      +        if (options.behavior === "ignoreErrors")
      +          this._rejectionHandler = () => {
      +          };
      +        return Promise.resolve();
      +      }
      +      _removeAllListeners(type3) {
      +        const events = this._events;
      +        if (!events)
      +          return;
      +        if (!events.removeListener) {
      +          if (type3 === void 0) {
      +            this._events = /* @__PURE__ */ Object.create(null);
      +            this._eventsCount = 0;
      +          } else if (events[type3] !== void 0) {
      +            if (--this._eventsCount === 0)
      +              this._events = /* @__PURE__ */ Object.create(null);
      +            else
      +              delete events[type3];
      +          }
      +          return;
      +        }
      +        if (type3 === void 0) {
      +          const keys = Object.keys(events);
      +          let key;
      +          for (let i = 0; i < keys.length; ++i) {
      +            key = keys[i];
      +            if (key === "removeListener")
      +              continue;
      +            this._removeAllListeners(key);
      +          }
      +          this._removeAllListeners("removeListener");
      +          this._events = /* @__PURE__ */ Object.create(null);
      +          this._eventsCount = 0;
      +          return;
      +        }
      +        const listeners = events[type3];
      +        if (typeof listeners === "function") {
      +          this.removeListener(type3, listeners);
      +        } else if (listeners !== void 0) {
      +          for (let i = listeners.length - 1; i >= 0; i--)
      +            this.removeListener(type3, listeners[i]);
      +        }
      +      }
      +      listeners(type3) {
      +        return this._listeners(this, type3, true);
      +      }
      +      rawListeners(type3) {
      +        return this._listeners(this, type3, false);
      +      }
      +      listenerCount(type3) {
      +        const events = this._events;
      +        if (events !== void 0) {
      +          const listener = events[type3];
      +          if (typeof listener === "function")
      +            return 1;
      +          if (listener !== void 0)
      +            return listener.length;
      +        }
      +        return 0;
      +      }
      +      eventNames() {
      +        return this._eventsCount > 0 && this._events ? Reflect.ownKeys(this._events) : [];
      +      }
      +      async _waitFor(type3) {
      +        let promises = [];
      +        if (type3) {
      +          promises = [...this._pendingHandlers.get(type3) || []];
      +        } else {
      +          promises = [];
      +          for (const [, pending] of this._pendingHandlers)
      +            promises.push(...pending);
      +        }
      +        await Promise.all(promises);
      +      }
      +      _listeners(target, type3, unwrap) {
      +        const events = target._events;
      +        if (events === void 0)
      +          return [];
      +        const listener = events[type3];
      +        if (listener === void 0)
      +          return [];
      +        if (typeof listener === "function")
      +          return unwrap ? [unwrapListener(listener)] : [listener];
      +        return unwrap ? unwrapListeners(listener) : listener.slice();
      +      }
      +    };
      +    OnceWrapper = class {
      +      constructor(eventEmitter, eventType, listener) {
      +        this._fired = false;
      +        this._eventEmitter = eventEmitter;
      +        this._eventType = eventType;
      +        this._listener = listener;
      +        this.wrapperFunction = this._handle.bind(this);
      +        this.wrapperFunction.listener = listener;
      +      }
      +      _handle(...args) {
      +        if (this._fired)
      +          return;
      +        this._fired = true;
      +        this._eventEmitter.removeListener(this._eventType, this.wrapperFunction);
      +        return this._listener.apply(this._eventEmitter, args);
      +      }
      +    };
      +  }
      +});
      +
      +// packages/playwright-core/src/bootstrap.ts
      +var minimumMajorNodeVersion, currentNodeVersion, major;
      +var init_bootstrap = __esm({
      +  "packages/playwright-core/src/bootstrap.ts"() {
      +    "use strict";
      +    minimumMajorNodeVersion = 18;
      +    currentNodeVersion = process.versions.node;
      +    major = +currentNodeVersion.split(".")[0];
      +    if (major < minimumMajorNodeVersion) {
      +      console.error(
      +        "You are running Node.js " + currentNodeVersion + `.
      +Playwright requires Node.js ${minimumMajorNodeVersion} or higher. 
      +Please update your version of Node.js.`
      +      );
      +      process.exit(1);
      +    }
      +    if (process.env.PW_INSTRUMENT_MODULES) {
      +      const Module = require("module");
      +      const originalLoad = Module._load;
      +      const root = { name: "", selfMs: 0, totalMs: 0, childrenMs: 0, children: [] };
      +      let current = root;
      +      const stack = [];
      +      Module._load = function(request2, _parent, _isMain) {
      +        const node = { name: request2, selfMs: 0, totalMs: 0, childrenMs: 0, children: [] };
      +        current.children.push(node);
      +        stack.push(current);
      +        current = node;
      +        const start3 = performance.now();
      +        let result2;
      +        try {
      +          result2 = originalLoad.apply(this, arguments);
      +        } catch (e) {
      +          current = stack.pop();
      +          current.children.pop();
      +          throw e;
      +        }
      +        const duration = performance.now() - start3;
      +        node.totalMs = duration;
      +        node.selfMs = Math.max(0, duration - node.childrenMs);
      +        current = stack.pop();
      +        current.childrenMs += duration;
      +        return result2;
      +      };
      +      process.on("exit", () => {
      +        function printTree(node, prefix, isLast, lines2, depth) {
      +          if (node.totalMs < 1 && depth > 0)
      +            return;
      +          const connector = depth === 0 ? "" : isLast ? "\u2514\u2500\u2500 " : "\u251C\u2500\u2500 ";
      +          const time = `${node.totalMs.toFixed(1).padStart(8)}ms`;
      +          const self2 = node.children.length ? ` (self: ${node.selfMs.toFixed(1)}ms)` : "";
      +          lines2.push(`${time}  ${prefix}${connector}${node.name}${self2}`);
      +          const childPrefix = prefix + (depth === 0 ? "" : isLast ? "    " : "\u2502   ");
      +          const sorted2 = node.children.slice().sort((a, b) => b.totalMs - a.totalMs);
      +          for (let i = 0; i < sorted2.length; i++)
      +            printTree(sorted2[i], childPrefix, i === sorted2.length - 1, lines2, depth + 1);
      +        }
      +        let totalModules = 0;
      +        function count(n) {
      +          totalModules++;
      +          n.children.forEach(count);
      +        }
      +        root.children.forEach(count);
      +        const lines = [];
      +        const sorted = root.children.slice().sort((a, b) => b.totalMs - a.totalMs);
      +        for (let i = 0; i < sorted.length; i++)
      +          printTree(sorted[i], "", i === sorted.length - 1, lines, 0);
      +        const totalMs = root.children.reduce((s, c) => s + c.totalMs, 0);
      +        process.stderr.write(`
      +--- Module load tree: ${totalModules} modules, ${totalMs.toFixed(0)}ms total ---
      +` + lines.join("\n") + "\n");
      +        const flat = /* @__PURE__ */ new Map();
      +        function gather(n) {
      +          const existing = flat.get(n.name);
      +          if (existing) {
      +            existing.selfMs += n.selfMs;
      +            existing.totalMs += n.totalMs;
      +            existing.count++;
      +          } else {
      +            flat.set(n.name, { selfMs: n.selfMs, totalMs: n.totalMs, count: 1 });
      +          }
      +          n.children.forEach(gather);
      +        }
      +        root.children.forEach(gather);
      +        const top50 = [...flat.entries()].sort((a, b) => b[1].selfMs - a[1].selfMs).slice(0, 50);
      +        const flatLines = top50.map(
      +          ([mod, { selfMs, totalMs: totalMs2, count: count2 }]) => `${selfMs.toFixed(1).padStart(8)}ms self ${totalMs2.toFixed(1).padStart(8)}ms total  (x${String(count2).padStart(3)})  ${mod}`
      +        );
      +        process.stderr.write(`
      +--- Top 50 modules by self time ---
      +` + flatLines.join("\n") + "\n");
      +      });
      +    }
      +  }
      +});
      +
      +// packages/playwright-core/src/package.ts
      +function libPath(...parts) {
      +  return import_path8.default.join(packageRoot, "lib", ...parts);
      +}
      +var import_path8, packageRoot, packageJSON, binPath;
      +var init_package = __esm({
      +  "packages/playwright-core/src/package.ts"() {
      +    "use strict";
      +    import_path8 = __toESM(require("path"));
      +    packageRoot = import_path8.default.join(__dirname, "..");
      +    packageJSON = require(import_path8.default.join(packageRoot, "package.json"));
      +    binPath = import_path8.default.join(packageRoot, "bin");
      +  }
      +});
      +
      +// packages/playwright-core/src/tools/trace/traceParser.ts
      +async function extractTrace(traceFile, outDir) {
      +  const zipFile = new ZipFile(traceFile);
      +  try {
      +    const entries = await zipFile.entries();
      +    for (const entry of entries) {
      +      const outPath = resolveWithinRoot(outDir, entry);
      +      if (!outPath)
      +        throw new Error(`Trace entry '${entry}' escapes output directory`);
      +      await import_fs10.default.promises.mkdir(import_path9.default.dirname(outPath), { recursive: true });
      +      const buffer = await zipFile.read(entry);
      +      await import_fs10.default.promises.writeFile(outPath, buffer);
      +    }
      +  } finally {
      +    zipFile.close();
      +  }
      +}
      +var import_fs10, import_path9, DirTraceLoaderBackend;
      +var init_traceParser = __esm({
      +  "packages/playwright-core/src/tools/trace/traceParser.ts"() {
      +    "use strict";
      +    import_fs10 = __toESM(require("fs"));
      +    import_path9 = __toESM(require("path"));
      +    init_fileUtils();
      +    init_zipFile();
      +    DirTraceLoaderBackend = class {
      +      constructor(dir) {
      +        this._dir = dir;
      +      }
      +      isLive() {
      +        return false;
      +      }
      +      async entryNames() {
      +        const entries = [];
      +        const walk = async (dir, prefix) => {
      +          const items = await import_fs10.default.promises.readdir(dir, { withFileTypes: true });
      +          for (const item of items) {
      +            if (item.isDirectory())
      +              await walk(import_path9.default.join(dir, item.name), prefix ? `${prefix}/${item.name}` : item.name);
      +            else
      +              entries.push(prefix ? `${prefix}/${item.name}` : item.name);
      +          }
      +        };
      +        await walk(this._dir, "");
      +        return entries;
      +      }
      +      async hasEntry(entryName) {
      +        const resolved = resolveWithinRoot(this._dir, entryName);
      +        if (!resolved)
      +          return false;
      +        try {
      +          await import_fs10.default.promises.access(resolved);
      +          return true;
      +        } catch {
      +          return false;
      +        }
      +      }
      +      async readText(entryName) {
      +        const resolved = resolveWithinRoot(this._dir, entryName);
      +        if (!resolved)
      +          return;
      +        try {
      +          return await import_fs10.default.promises.readFile(resolved, "utf-8");
      +        } catch {
      +        }
      +      }
      +      async readBlob(entryName) {
      +        const resolved = resolveWithinRoot(this._dir, entryName);
      +        if (!resolved)
      +          return;
      +        try {
      +          const buffer = await import_fs10.default.promises.readFile(resolved);
      +          return new Blob([new Uint8Array(buffer)]);
      +        } catch {
      +        }
      +      }
      +    };
      +  }
      +});
      +
      +// packages/playwright-core/src/tools/trace/traceUtils.ts
      +function ensureTraceOpen() {
      +  if (!import_fs11.default.existsSync(traceDir))
      +    throw new Error(`No trace opened. Run 'npx playwright trace open ' first.`);
      +  return traceDir;
      +}
      +async function closeTrace() {
      +  if (import_fs11.default.existsSync(traceDir))
      +    await import_fs11.default.promises.rm(traceDir, { recursive: true });
      +}
      +async function openTrace(traceFile) {
      +  const filePath = import_path10.default.resolve(traceFile);
      +  if (!import_fs11.default.existsSync(filePath))
      +    throw new Error(`Trace file not found: ${filePath}`);
      +  await closeTrace();
      +  await import_fs11.default.promises.mkdir(traceDir, { recursive: true });
      +  if (filePath.endsWith(".zip"))
      +    await extractTrace(filePath, traceDir);
      +  else
      +    await import_fs11.default.promises.writeFile(import_path10.default.join(traceDir, ".link"), filePath, "utf-8");
      +}
      +async function loadTrace() {
      +  const dir = ensureTraceOpen();
      +  const linkFile = import_path10.default.join(dir, ".link");
      +  let traceDir2;
      +  let traceFile;
      +  if (import_fs11.default.existsSync(linkFile)) {
      +    const tracePath = await import_fs11.default.promises.readFile(linkFile, "utf-8");
      +    traceDir2 = import_path10.default.dirname(tracePath);
      +    traceFile = import_path10.default.basename(tracePath);
      +  } else {
      +    traceDir2 = dir;
      +  }
      +  const backend = new DirTraceLoaderBackend(traceDir2);
      +  const loader = new TraceLoader();
      +  await loader.load(backend, traceFile);
      +  const model = new TraceModel(traceDir2, loader.contextEntries);
      +  return new LoadedTrace(model, loader, buildOrdinalMap(model));
      +}
      +function formatTimestamp(ms, base) {
      +  const relative = ms - base;
      +  if (relative < 0)
      +    return "0:00.000";
      +  const totalMs = Math.floor(relative);
      +  const minutes = Math.floor(totalMs / 6e4);
      +  const seconds = Math.floor(totalMs % 6e4 / 1e3);
      +  const millis = totalMs % 1e3;
      +  return `${minutes}:${seconds.toString().padStart(2, "0")}.${millis.toString().padStart(3, "0")}`;
      +}
      +function actionTitle(action) {
      +  return renderTitleForCall({ ...action, type: action.class }) || `${action.class}.${action.method}`;
      +}
      +async function saveOutputFile(fileName, content, explicitOutput) {
      +  let outFile;
      +  if (explicitOutput) {
      +    outFile = explicitOutput;
      +  } else {
      +    const resolved = resolveWithinRoot(cliOutputDir, fileName);
      +    if (!resolved)
      +      throw new Error(`Attachment name '${fileName}' escapes output directory`);
      +    await import_fs11.default.promises.mkdir(import_path10.default.dirname(resolved), { recursive: true });
      +    outFile = resolved;
      +  }
      +  await import_fs11.default.promises.writeFile(outFile, content);
      +  return outFile;
      +}
      +function buildOrdinalMap(model) {
      +  const actions = model.actions.filter((a) => a.group !== "configuration");
      +  const { rootItem } = buildActionTree(actions);
      +  const ordinalToCallId = /* @__PURE__ */ new Map();
      +  const callIdToOrdinal = /* @__PURE__ */ new Map();
      +  let ordinal = 1;
      +  const visit = (item) => {
      +    ordinalToCallId.set(ordinal, item.action.callId);
      +    callIdToOrdinal.set(item.action.callId, ordinal);
      +    ordinal++;
      +    for (const child of item.children)
      +      visit(child);
      +  };
      +  for (const child of rootItem.children)
      +    visit(child);
      +  return { ordinalToCallId, callIdToOrdinal };
      +}
      +var import_fs11, import_path10, traceDir, cliOutputDir, LoadedTrace;
      +var init_traceUtils2 = __esm({
      +  "packages/playwright-core/src/tools/trace/traceUtils.ts"() {
      +    "use strict";
      +    import_fs11 = __toESM(require("fs"));
      +    import_path10 = __toESM(require("path"));
      +    init_traceModel();
      +    init_traceLoader();
      +    init_protocolFormatter();
      +    init_fileUtils();
      +    init_traceParser();
      +    traceDir = import_path10.default.join(".playwright-cli", "trace");
      +    cliOutputDir = ".playwright-cli";
      +    LoadedTrace = class {
      +      constructor(model, loader, ordinals) {
      +        this.model = model;
      +        this.loader = loader;
      +        this.ordinalToCallId = ordinals.ordinalToCallId;
      +        this.callIdToOrdinal = ordinals.callIdToOrdinal;
      +      }
      +      resolveActionId(actionId) {
      +        const ordinal = parseInt(actionId, 10);
      +        if (!isNaN(ordinal)) {
      +          const callId = this.ordinalToCallId.get(ordinal);
      +          if (callId)
      +            return this.model.actions.find((a) => a.callId === callId);
      +        }
      +        return this.model.actions.find((a) => a.callId === actionId);
      +      }
      +    };
      +  }
      +});
      +
      +// packages/playwright-core/src/tools/trace/traceOpen.ts
      +async function traceOpen(traceFile) {
      +  await openTrace(traceFile);
      +  await traceInfo();
      +}
      +async function traceInfo() {
      +  const trace = await loadTrace();
      +  const model = trace.model;
      +  const info = {
      +    browser: model.browserName || "unknown",
      +    platform: model.platform || "unknown",
      +    playwrightVersion: model.playwrightVersion || "unknown",
      +    title: model.title || "",
      +    duration: msToString(model.endTime - model.startTime),
      +    durationMs: model.endTime - model.startTime,
      +    startTime: model.wallTime ? new Date(model.wallTime).toISOString() : "unknown",
      +    viewport: model.options.viewport ? `${model.options.viewport.width}x${model.options.viewport.height}` : "default",
      +    actions: model.actions.length,
      +    pages: model.pages.length,
      +    network: model.resources.length,
      +    errors: model.errorDescriptors.length,
      +    attachments: model.attachments.length,
      +    consoleMessages: model.events.filter((e) => e.type === "console").length
      +  };
      +  console.log("");
      +  console.log(`  Browser:      ${info.browser}`);
      +  console.log(`  Platform:     ${info.platform}`);
      +  console.log(`  Playwright:   ${info.playwrightVersion}`);
      +  if (info.title)
      +    console.log(`  Title:        ${info.title}`);
      +  console.log(`  Duration:     ${info.duration}`);
      +  console.log(`  Start time:   ${info.startTime}`);
      +  console.log(`  Viewport:     ${info.viewport}`);
      +  console.log(`  Actions:      ${info.actions}`);
      +  console.log(`  Pages:        ${info.pages}`);
      +  console.log(`  Network:      ${info.network} requests`);
      +  console.log(`  Errors:       ${info.errors}`);
      +  console.log(`  Attachments:  ${info.attachments}`);
      +  console.log(`  Console:      ${info.consoleMessages} messages`);
      +  console.log("");
      +}
      +var init_traceOpen = __esm({
      +  "packages/playwright-core/src/tools/trace/traceOpen.ts"() {
      +    "use strict";
      +    init_formatUtils();
      +    init_traceUtils2();
      +  }
      +});
      +
      +// packages/playwright-core/src/tools/trace/traceActions.ts
      +async function traceActions(options) {
      +  const trace = await loadTrace();
      +  const actions = filterActions(trace.model.actions, options);
      +  const { rootItem } = buildActionTree(actions);
      +  console.log(`  ${"#".padStart(4)} ${"Time".padEnd(9)}  ${"Action".padEnd(55)} ${"Duration".padStart(8)}`);
      +  console.log(`  ${"\u2500".repeat(4)} ${"\u2500".repeat(9)}  ${"\u2500".repeat(55)} ${"\u2500".repeat(8)}`);
      +  const visit = (item, indent) => {
      +    const action = item.action;
      +    const ordinal = trace.callIdToOrdinal.get(action.callId) ?? "?";
      +    const ts = formatTimestamp(action.startTime, trace.model.startTime);
      +    const duration = action.endTime ? msToString(action.endTime - action.startTime) : "running";
      +    const title = actionTitle(action);
      +    const locator2 = actionLocator(action);
      +    const error = action.error ? "  \u2717" : "";
      +    const prefix = `  ${(ordinal + ".").padStart(4)} ${ts}  ${indent}`;
      +    console.log(`${prefix}${title.padEnd(Math.max(1, 55 - indent.length))} ${duration.padStart(8)}${error}`);
      +    if (locator2)
      +      console.log(`${" ".repeat(prefix.length)}${locator2}`);
      +    for (const child of item.children)
      +      visit(child, indent + "  ");
      +  };
      +  for (const child of rootItem.children)
      +    visit(child, "");
      +}
      +function filterActions(actions, options) {
      +  let result2 = actions.filter((a) => a.group !== "configuration");
      +  if (options.grep) {
      +    const pattern = new RegExp(options.grep, "i");
      +    result2 = result2.filter((a) => pattern.test(actionTitle(a)) || pattern.test(actionLocator(a) || ""));
      +  }
      +  if (options.errorsOnly)
      +    result2 = result2.filter((a) => !!a.error);
      +  return result2;
      +}
      +function actionLocator(action, sdkLanguage) {
      +  return action.params.selector ? asLocatorDescription(sdkLanguage || "javascript", action.params.selector) : void 0;
      +}
      +async function traceAction(actionId) {
      +  const trace = await loadTrace();
      +  const action = trace.resolveActionId(actionId);
      +  if (!action) {
      +    console.error(`Action '${actionId}' not found. Use 'trace actions' to see available action IDs.`);
      +    process.exitCode = 1;
      +    return;
      +  }
      +  const title = actionTitle(action);
      +  console.log(`
      +  ${title}
      +`);
      +  console.log("  Time");
      +  console.log(`    start:     ${formatTimestamp(action.startTime, trace.model.startTime)}`);
      +  const duration = action.endTime ? msToString(action.endTime - action.startTime) : action.error ? "Timed Out" : "Running";
      +  console.log(`    duration:  ${duration}`);
      +  const paramKeys = Object.keys(action.params).filter((name) => name !== "info");
      +  if (paramKeys.length) {
      +    console.log("\n  Parameters");
      +    for (const key of paramKeys) {
      +      const value2 = formatParamValue(action.params[key]);
      +      console.log(`    ${key}: ${value2}`);
      +    }
      +  }
      +  if (action.result) {
      +    console.log("\n  Return value");
      +    for (const [key, value2] of Object.entries(action.result))
      +      console.log(`    ${key}: ${formatParamValue(value2)}`);
      +  }
      +  if (action.error) {
      +    console.log("\n  Error");
      +    console.log(`    ${action.error.message}`);
      +  }
      +  if (action.log.length) {
      +    console.log("\n  Log");
      +    for (const entry of action.log) {
      +      const time = entry.time !== -1 ? formatTimestamp(entry.time, trace.model.startTime) : "";
      +      console.log(`    ${time.padEnd(12)} ${entry.message}`);
      +    }
      +  }
      +  if (action.stack?.length) {
      +    console.log("\n  Source");
      +    for (const frame of action.stack.slice(0, 5)) {
      +      const file = frame.file.replace(/.*[/\\](.*)/, "$1");
      +      console.log(`    ${file}:${frame.line}:${frame.column}`);
      +    }
      +  }
      +  const snapshots = [];
      +  if (action.beforeSnapshot)
      +    snapshots.push("before");
      +  if (action.inputSnapshot)
      +    snapshots.push("input");
      +  if (action.afterSnapshot)
      +    snapshots.push("after");
      +  if (snapshots.length) {
      +    console.log("\n  Snapshots");
      +    console.log(`    available: ${snapshots.join(", ")}`);
      +    console.log(`    usage:     npx playwright trace snapshot ${actionId} --name <${snapshots.join("|")}>`);
      +  }
      +  console.log("");
      +}
      +function formatParamValue(value2) {
      +  if (value2 === void 0 || value2 === null)
      +    return String(value2);
      +  if (typeof value2 === "string")
      +    return `"${value2}"`;
      +  if (typeof value2 !== "object")
      +    return String(value2);
      +  if (value2.guid)
      +    return "";
      +  return JSON.stringify(value2).slice(0, 1e3);
      +}
      +var init_traceActions = __esm({
      +  "packages/playwright-core/src/tools/trace/traceActions.ts"() {
      +    "use strict";
      +    init_traceModel();
      +    init_locatorGenerators();
      +    init_formatUtils();
      +    init_traceUtils2();
      +  }
      +});
      +
      +// packages/playwright-core/src/tools/trace/traceRequests.ts
      +async function traceRequests(options) {
      +  const trace = await loadTrace();
      +  const model = trace.model;
      +  let indexed = model.resources.map((r, i) => ({ resource: r, ordinal: i + 1 }));
      +  if (options.grep) {
      +    const pattern = new RegExp(options.grep, "i");
      +    indexed = indexed.filter(({ resource: r }) => pattern.test(r.request.url));
      +  }
      +  if (options.method)
      +    indexed = indexed.filter(({ resource: r }) => r.request.method.toLowerCase() === options.method.toLowerCase());
      +  if (options.status) {
      +    const code = parseInt(options.status, 10);
      +    indexed = indexed.filter(({ resource: r }) => r.response.status === code);
      +  }
      +  if (options.failed)
      +    indexed = indexed.filter(({ resource: r }) => r.response.status >= 400 || r.response.status === -1);
      +  if (!indexed.length) {
      +    console.log("  No network requests");
      +    return;
      +  }
      +  console.log(`  ${"#".padStart(4)} ${"Method".padEnd(8)} ${"Status".padEnd(8)} ${"Name".padEnd(45)} ${"Duration".padStart(10)} ${"Size".padStart(8)} ${"Route".padEnd(10)}`);
      +  console.log(`  ${"\u2500".repeat(4)} ${"\u2500".repeat(8)} ${"\u2500".repeat(8)} ${"\u2500".repeat(45)} ${"\u2500".repeat(10)} ${"\u2500".repeat(8)} ${"\u2500".repeat(10)}`);
      +  for (const { resource: r, ordinal } of indexed) {
      +    let name;
      +    try {
      +      const url2 = new URL(r.request.url);
      +      name = url2.pathname.substring(url2.pathname.lastIndexOf("/") + 1);
      +      if (!name)
      +        name = url2.host;
      +      if (url2.search)
      +        name += url2.search;
      +    } catch {
      +      name = r.request.url;
      +    }
      +    if (name.length > 45)
      +      name = name.substring(0, 42) + "...";
      +    const status = r.response.status > 0 ? String(r.response.status) : "ERR";
      +    const size = r.response._transferSize > 0 ? r.response._transferSize : r.response.bodySize;
      +    const route2 = formatRouteStatus(r);
      +    console.log(`  ${(ordinal + ".").padStart(4)} ${r.request.method.padEnd(8)} ${status.padEnd(8)} ${name.padEnd(45)} ${msToString(r.time).padStart(10)} ${bytesToString2(size).padStart(8)} ${route2.padEnd(10)}`);
      +  }
      +}
      +async function traceRequest(requestId) {
      +  const trace = await loadTrace();
      +  const model = trace.model;
      +  const ordinal = parseInt(requestId, 10);
      +  const resource = !isNaN(ordinal) && ordinal >= 1 && ordinal <= model.resources.length ? model.resources[ordinal - 1] : void 0;
      +  if (!resource) {
      +    console.error(`Request '${requestId}' not found. Use 'trace requests' to see available request IDs.`);
      +    process.exitCode = 1;
      +    return;
      +  }
      +  const r = resource;
      +  const status = r.response.status > 0 ? `${r.response.status} ${r.response.statusText}` : "ERR";
      +  const size = r.response._transferSize > 0 ? r.response._transferSize : r.response.bodySize;
      +  console.log(`
      +  ${r.request.method} ${r.request.url}
      +`);
      +  console.log("  General");
      +  console.log(`    status:    ${status}`);
      +  console.log(`    duration:  ${msToString(r.time)}`);
      +  console.log(`    size:      ${bytesToString2(size)}`);
      +  if (r.response.content.mimeType)
      +    console.log(`    type:      ${r.response.content.mimeType}`);
      +  const route2 = formatRouteStatus(r);
      +  if (route2)
      +    console.log(`    route:     ${route2}`);
      +  if (r.serverIPAddress)
      +    console.log(`    server:    ${r.serverIPAddress}${r._serverPort ? ":" + r._serverPort : ""}`);
      +  if (r.response._failureText)
      +    console.log(`    error:     ${r.response._failureText}`);
      +  if (r.request.headers.length) {
      +    console.log("\n  Request headers");
      +    for (const h of r.request.headers)
      +      console.log(`    ${h.name}: ${h.value}`);
      +  }
      +  if (r.request.postData) {
      +    console.log("\n  Request body");
      +    const resource2 = r.request.postData._sha1 ?? r.request.postData._file;
      +    if (resource2) {
      +      console.log(`    ${import_path11.default.relative(process.cwd(), import_path11.default.join(trace.model.traceUri, "resources", resource2))}`);
      +    } else {
      +      const text2 = r.request.postData.text.length > 2e3 ? r.request.postData.text.substring(0, 2e3) + "..." : r.request.postData.text;
      +      console.log(`    ${text2}`);
      +    }
      +  }
      +  if (r.response.headers.length) {
      +    console.log("\n  Response headers");
      +    for (const h of r.response.headers)
      +      console.log(`    ${h.name}: ${h.value}`);
      +  }
      +  if (r.response.bodySize > 0) {
      +    const resource2 = r.response.content._sha1 ?? r.response.content._file;
      +    if (resource2) {
      +      console.log("\n  Response body");
      +      console.log(`    ${import_path11.default.relative(process.cwd(), import_path11.default.join(trace.model.traceUri, "resources", resource2))}`);
      +    } else if (r.response.content.text) {
      +      const text2 = r.response.content.text.length > 2e3 ? r.response.content.text.substring(0, 2e3) + "..." : r.response.content.text;
      +      console.log("\n  Response body");
      +      console.log(`    ${text2}`);
      +    }
      +  }
      +  if (r._securityDetails) {
      +    console.log("\n  Security");
      +    if (r._securityDetails.protocol)
      +      console.log(`    protocol:  ${r._securityDetails.protocol}`);
      +    if (r._securityDetails.subjectName)
      +      console.log(`    subject:   ${r._securityDetails.subjectName}`);
      +    if (r._securityDetails.issuer)
      +      console.log(`    issuer:    ${r._securityDetails.issuer}`);
      +  }
      +  console.log("");
      +}
      +function bytesToString2(bytes) {
      +  if (bytes < 0 || !isFinite(bytes))
      +    return "-";
      +  if (bytes === 0)
      +    return "0";
      +  if (bytes < 1e3)
      +    return bytes.toFixed(0);
      +  const kb = bytes / 1024;
      +  if (kb < 1e3)
      +    return kb.toFixed(1) + "K";
      +  const mb = kb / 1024;
      +  if (mb < 1e3)
      +    return mb.toFixed(1) + "M";
      +  const gb = mb / 1024;
      +  return gb.toFixed(1) + "G";
      +}
      +function formatRouteStatus(r) {
      +  if (r._wasAborted)
      +    return "aborted";
      +  if (r._wasContinued)
      +    return "continued";
      +  if (r._wasFulfilled)
      +    return "fulfilled";
      +  if (r._apiRequest)
      +    return "api";
      +  return "";
      +}
      +var import_path11;
      +var init_traceRequests = __esm({
      +  "packages/playwright-core/src/tools/trace/traceRequests.ts"() {
      +    "use strict";
      +    import_path11 = __toESM(require("path"));
      +    init_formatUtils();
      +    init_traceUtils2();
      +  }
      +});
      +
      +// packages/playwright-core/src/tools/trace/traceConsole.ts
      +async function traceConsole(options) {
      +  const trace = await loadTrace();
      +  const model = trace.model;
      +  const items = [];
      +  for (const event of model.events) {
      +    if (event.type === "console") {
      +      if (options.stdio)
      +        continue;
      +      const level = event.messageType;
      +      if (options.errorsOnly && level !== "error")
      +        continue;
      +      if (options.warnings && level !== "error" && level !== "warning")
      +        continue;
      +      const url2 = event.location.url;
      +      const filename = url2 ? url2.substring(url2.lastIndexOf("/") + 1) : "";
      +      items.push({
      +        type: "browser",
      +        level,
      +        text: event.text,
      +        location: `${filename}:${event.location.lineNumber}`,
      +        timestamp: event.time
      +      });
      +    }
      +    if (event.type === "event" && event.method === "pageError") {
      +      if (options.stdio)
      +        continue;
      +      const error = event.params.error;
      +      items.push({
      +        type: "browser",
      +        level: "error",
      +        text: error?.error?.message || String(error?.value || ""),
      +        timestamp: event.time
      +      });
      +    }
      +  }
      +  for (const event of model.stdio) {
      +    if (options.browser)
      +      continue;
      +    if (options.errorsOnly && event.type !== "stderr")
      +      continue;
      +    if (options.warnings && event.type !== "stderr")
      +      continue;
      +    let text2 = "";
      +    if (event.text)
      +      text2 = event.text.trim();
      +    if (event.base64)
      +      text2 = Buffer.from(event.base64, "base64").toString("utf-8").trim();
      +    if (!text2)
      +      continue;
      +    items.push({
      +      type: event.type,
      +      level: event.type === "stderr" ? "error" : "info",
      +      text: text2,
      +      timestamp: event.timestamp
      +    });
      +  }
      +  items.sort((a, b) => a.timestamp - b.timestamp);
      +  if (!items.length) {
      +    console.log("  No console entries");
      +    return;
      +  }
      +  for (const item of items) {
      +    const ts = formatTimestamp(item.timestamp, model.startTime);
      +    const source11 = item.type === "browser" ? "[browser]" : `[${item.type}]`;
      +    const level = item.level.padEnd(8);
      +    const location2 = item.location ? `  ${item.location}` : "";
      +    console.log(`  ${ts}  ${source11.padEnd(10)} ${level} ${item.text}${location2}`);
      +  }
      +}
      +var init_traceConsole = __esm({
      +  "packages/playwright-core/src/tools/trace/traceConsole.ts"() {
      +    "use strict";
      +    init_traceUtils2();
      +  }
      +});
      +
      +// packages/playwright-core/src/tools/trace/traceErrors.ts
      +async function traceErrors() {
      +  const trace = await loadTrace();
      +  const model = trace.model;
      +  if (!model.errorDescriptors.length) {
      +    console.log("  No errors");
      +    return;
      +  }
      +  for (const error of model.errorDescriptors) {
      +    if (error.action) {
      +      const title = actionTitle(error.action);
      +      console.log(`
      +  \u2717 ${title}`);
      +    } else {
      +      console.log(`
      +  \u2717 Error`);
      +    }
      +    if (error.stack?.length) {
      +      const frame = error.stack[0];
      +      const file = frame.file.replace(/.*[/\\](.*)/, "$1");
      +      console.log(`    at ${file}:${frame.line}:${frame.column}`);
      +    }
      +    console.log("");
      +    const indented = error.message.split("\n").map((l) => `    ${l}`).join("\n");
      +    console.log(indented);
      +  }
      +  console.log("");
      +}
      +var init_traceErrors = __esm({
      +  "packages/playwright-core/src/tools/trace/traceErrors.ts"() {
      +    "use strict";
      +    init_traceUtils2();
      +  }
      +});
      +
      +// packages/isomorphic/disposable.ts
      +async function disposeAll(disposables) {
      +  const copy = [...disposables];
      +  disposables.length = 0;
      +  await Promise.all(copy.map((d) => d.dispose()));
      +}
      +var init_disposable = __esm({
      +  "packages/isomorphic/disposable.ts"() {
      +    "use strict";
      +  }
      +});
      +
      +// packages/playwright-core/src/server/userAgent.ts
      +function getUserAgent() {
      +  if (cachedUserAgent)
      +    return cachedUserAgent;
      +  try {
      +    cachedUserAgent = determineUserAgent();
      +  } catch (e) {
      +    cachedUserAgent = "Playwright/unknown";
      +  }
      +  return cachedUserAgent;
      +}
      +function determineUserAgent() {
      +  let osIdentifier = "unknown";
      +  let osVersion = "unknown";
      +  if (process.platform === "win32") {
      +    const version3 = import_os4.default.release().split(".");
      +    osIdentifier = "windows";
      +    osVersion = `${version3[0]}.${version3[1]}`;
      +  } else if (process.platform === "darwin") {
      +    const version3 = (0, import_child_process2.execSync)("sw_vers -productVersion", { stdio: ["ignore", "pipe", "ignore"] }).toString().trim().split(".");
      +    osIdentifier = "macOS";
      +    osVersion = `${version3[0]}.${version3[1]}`;
      +  } else if (process.platform === "linux") {
      +    const distroInfo = getLinuxDistributionInfoSync();
      +    if (distroInfo) {
      +      osIdentifier = distroInfo.id || "linux";
      +      osVersion = distroInfo.version || "unknown";
      +    } else {
      +      osIdentifier = "linux";
      +    }
      +  }
      +  const additionalTokens = [];
      +  if (process.env.CI)
      +    additionalTokens.push("CI/1");
      +  const serializedTokens = additionalTokens.length ? " " + additionalTokens.join(" ") : "";
      +  const { embedderName, embedderVersion } = getEmbedderName();
      +  return `Playwright/${getPlaywrightVersion()} (${import_os4.default.arch()}; ${osIdentifier} ${osVersion}) ${embedderName}/${embedderVersion}${serializedTokens}`;
      +}
      +function getEmbedderName() {
      +  let embedderName = "unknown";
      +  let embedderVersion = "unknown";
      +  if (!process.env.PW_LANG_NAME) {
      +    embedderName = "node";
      +    embedderVersion = process.version.substring(1).split(".").slice(0, 2).join(".");
      +  } else if (["node", "python", "java", "csharp"].includes(process.env.PW_LANG_NAME)) {
      +    embedderName = process.env.PW_LANG_NAME;
      +    embedderVersion = process.env.PW_LANG_NAME_VERSION ?? "unknown";
      +  }
      +  return { embedderName, embedderVersion };
      +}
      +function getPlaywrightVersion(majorMinorOnly = false) {
      +  const version3 = process.env.PW_VERSION_OVERRIDE || packageJSON.version;
      +  return majorMinorOnly ? version3.split(".").slice(0, 2).join(".") : version3;
      +}
      +var import_child_process2, import_os4, cachedUserAgent;
      +var init_userAgent = __esm({
      +  "packages/playwright-core/src/server/userAgent.ts"() {
      +    "use strict";
      +    import_child_process2 = require("child_process");
      +    import_os4 = __toESM(require("os"));
      +    init_linuxUtils();
      +    init_package();
      +  }
      +});
      +
      +// packages/playwright-core/src/generated/clockSource.ts
      +var source;
      +var init_clockSource = __esm({
      +  "packages/playwright-core/src/generated/clockSource.ts"() {
      +    "use strict";
      +    source = '\nvar __commonJS = obj => {\n  let required = false;\n  let result;\n  return function __require() {\n    if (!required) {\n      required = true;\n      let fn;\n      for (const name in obj) { fn = obj[name]; break; }\n      const module = { exports: {} };\n      fn(module.exports, module);\n      result = module.exports;\n    }\n    return result;\n  }\n};\nvar __export = (target, all) => {for (var name in all) target[name] = all[name];};\nvar __toESM = mod => ({ ...mod, \'default\': mod });\nvar __toCommonJS = mod => ({ ...mod, __esModule: true });\n\n\n// packages/injected/src/clock.ts\nvar clock_exports = {};\n__export(clock_exports, {\n  ClockController: () => ClockController,\n  createClock: () => createClock,\n  inject: () => inject,\n  install: () => install\n});\nmodule.exports = __toCommonJS(clock_exports);\nvar ClockController = class {\n  constructor(embedder) {\n    this._duringTick = false;\n    this._uniqueTimerId = idCounterStart;\n    this.disposables = [];\n    this._log = [];\n    this._timers = /* @__PURE__ */ new Map();\n    this._now = { time: asWallTime(0), isFixedTime: false, ticks: 0, origin: asWallTime(-1) };\n    this._embedder = embedder;\n  }\n  uninstall() {\n    this.disposables.forEach((dispose) => dispose());\n    this.disposables.length = 0;\n  }\n  now() {\n    this._replayLogOnce();\n    this._syncRealTime();\n    return this._now.time;\n  }\n  install(time) {\n    this._replayLogOnce();\n    this._innerInstall(asWallTime(time));\n  }\n  setSystemTime(time) {\n    this._replayLogOnce();\n    this._innerSetTime(asWallTime(time));\n  }\n  setFixedTime(time) {\n    this._replayLogOnce();\n    this._innerSetFixedTime(asWallTime(time));\n  }\n  performanceNow() {\n    this._replayLogOnce();\n    this._syncRealTime();\n    return this._now.ticks;\n  }\n  _syncRealTime() {\n    if (!this._realTime)\n      return;\n    const now = this._embedder.performanceNow();\n    const sinceLastSync = now - this._realTime.lastSyncTicks;\n    if (sinceLastSync > 0) {\n      this._advanceNow(shiftTicks(this._now.ticks, sinceLastSync));\n      this._realTime.lastSyncTicks = now;\n    }\n  }\n  _innerSetTime(time) {\n    this._now.time = time;\n    this._now.isFixedTime = false;\n    if (this._now.origin < 0)\n      this._now.origin = this._now.time;\n  }\n  _innerInstall(time) {\n    if (this._now.origin < 0)\n      this._now.ticks = 0;\n    this._innerSetTime(time);\n  }\n  _innerSetFixedTime(time) {\n    this._innerSetTime(time);\n    this._now.isFixedTime = true;\n  }\n  _advanceNow(to) {\n    if (this._now.ticks > to) {\n      return;\n    }\n    if (!this._now.isFixedTime)\n      this._now.time = asWallTime(this._now.time + to - this._now.ticks);\n    this._now.ticks = to;\n  }\n  async log(type, time, param) {\n    this._log.push({ type, time, param });\n  }\n  async runFor(ticks) {\n    this._replayLogOnce();\n    if (ticks < 0)\n      throw new TypeError("Negative ticks are not supported");\n    await this._runWithDisabledRealTimeSync(async () => {\n      await this._runTo(shiftTicks(this._now.ticks, ticks));\n    });\n  }\n  async _runTo(to) {\n    to = Math.ceil(to);\n    if (this._now.ticks > to)\n      return;\n    let firstException;\n    while (true) {\n      const result = await this._callFirstTimer(to);\n      if (!result.timerFound)\n        break;\n      firstException = firstException || result.error;\n    }\n    this._advanceNow(to);\n    if (firstException)\n      throw firstException;\n  }\n  async pauseAt(time) {\n    this._replayLogOnce();\n    await this._innerPause();\n    const toConsume = time - this._now.time;\n    await this._innerFastForwardTo(shiftTicks(this._now.ticks, toConsume));\n    return toConsume;\n  }\n  async _innerPause() {\n    var _a;\n    this._realTime = void 0;\n    await ((_a = this._currentRealTimeTimer) == null ? void 0 : _a.dispose());\n    this._currentRealTimeTimer = void 0;\n  }\n  resume() {\n    this._replayLogOnce();\n    this._innerResume();\n  }\n  _innerResume() {\n    const now = this._embedder.performanceNow();\n    this._realTime = { startTicks: now, lastSyncTicks: now };\n    this._updateRealTimeTimer();\n  }\n  _updateRealTimeTimer() {\n    var _a;\n    if ((_a = this._currentRealTimeTimer) == null ? void 0 : _a.promise) {\n      return;\n    }\n    const firstTimer = this._firstTimer();\n    const nextTick = Math.min(firstTimer ? firstTimer.callAt : this._now.ticks + maxTimeout, this._now.ticks + 100);\n    const callAt = this._currentRealTimeTimer ? Math.min(this._currentRealTimeTimer.callAt, nextTick) : nextTick;\n    if (this._currentRealTimeTimer) {\n      this._currentRealTimeTimer.cancel();\n      this._currentRealTimeTimer = void 0;\n    }\n    const realTimeTimer = {\n      callAt,\n      promise: void 0,\n      cancel: this._embedder.setTimeout(() => {\n        this._syncRealTime();\n        realTimeTimer.promise = this._runTo(this._now.ticks).catch((e) => console.error(e));\n        void realTimeTimer.promise.then(() => {\n          this._currentRealTimeTimer = void 0;\n          if (this._realTime)\n            this._updateRealTimeTimer();\n        });\n      }, callAt - this._now.ticks),\n      dispose: async () => {\n        realTimeTimer.cancel();\n        await realTimeTimer.promise;\n      }\n    };\n    this._currentRealTimeTimer = realTimeTimer;\n  }\n  async _runWithDisabledRealTimeSync(fn) {\n    if (!this._realTime) {\n      await fn();\n      return;\n    }\n    await this._innerPause();\n    try {\n      await fn();\n    } finally {\n      this._innerResume();\n    }\n  }\n  async fastForward(ticks) {\n    this._replayLogOnce();\n    await this._runWithDisabledRealTimeSync(async () => {\n      await this._innerFastForwardTo(shiftTicks(this._now.ticks, ticks | 0));\n    });\n  }\n  async _innerFastForwardTo(to) {\n    if (to < this._now.ticks)\n      throw new Error("Cannot fast-forward to the past");\n    for (const timer of this._timers.values()) {\n      if (to > timer.callAt)\n        timer.callAt = to;\n    }\n    await this._runTo(to);\n  }\n  addTimer(options) {\n    this._replayLogOnce();\n    if (options.type === "AnimationFrame" /* AnimationFrame */ && !options.func)\n      throw new Error("Callback must be provided to requestAnimationFrame calls");\n    if (options.type === "IdleCallback" /* IdleCallback */ && !options.func)\n      throw new Error("Callback must be provided to requestIdleCallback calls");\n    if (["Timeout" /* Timeout */, "Interval" /* Interval */].includes(options.type) && !options.func && options.delay === void 0)\n      throw new Error("Callback must be provided to timer calls");\n    let delay = options.delay ? +options.delay : 0;\n    if (!Number.isFinite(delay))\n      delay = 0;\n    delay = delay > maxTimeout ? 1 : delay;\n    delay = Math.max(0, delay);\n    const timer = {\n      type: options.type,\n      func: options.func,\n      args: options.args || [],\n      delay,\n      callAt: shiftTicks(this._now.ticks, delay || (this._duringTick ? 1 : 0)),\n      createdAt: this._now.ticks,\n      id: this._uniqueTimerId++,\n      error: new Error()\n    };\n    this._timers.set(timer.id, timer);\n    if (this._realTime)\n      this._updateRealTimeTimer();\n    return timer.id;\n  }\n  countTimers() {\n    return this._timers.size;\n  }\n  _firstTimer(beforeTick) {\n    let firstTimer = null;\n    for (const timer of this._timers.values()) {\n      const isInRange = beforeTick === void 0 || timer.callAt <= beforeTick;\n      if (isInRange && (!firstTimer || compareTimers(firstTimer, timer) === 1))\n        firstTimer = timer;\n    }\n    return firstTimer;\n  }\n  _takeFirstTimer(beforeTick) {\n    const timer = this._firstTimer(beforeTick);\n    if (!timer)\n      return null;\n    this._advanceNow(timer.callAt);\n    if (timer.type === "Interval" /* Interval */)\n      timer.callAt = shiftTicks(timer.callAt, timer.delay);\n    else\n      this._timers.delete(timer.id);\n    return timer;\n  }\n  async _callFirstTimer(beforeTick) {\n    const timer = this._takeFirstTimer(beforeTick);\n    if (!timer)\n      return { timerFound: false };\n    this._duringTick = true;\n    try {\n      if (typeof timer.func !== "function") {\n        let error2;\n        try {\n          (() => {\n            globalThis.eval(timer.func);\n          })();\n        } catch (e) {\n          error2 = e;\n        }\n        await new Promise((f) => this._embedder.setTimeout(f));\n        return { timerFound: true, error: error2 };\n      }\n      let args = timer.args;\n      if (timer.type === "AnimationFrame" /* AnimationFrame */)\n        args = [this._now.ticks];\n      else if (timer.type === "IdleCallback" /* IdleCallback */)\n        args = [{ didTimeout: false, timeRemaining: () => 0 }];\n      let error;\n      try {\n        timer.func.apply(null, args);\n      } catch (e) {\n        error = e;\n      }\n      await new Promise((f) => this._embedder.setTimeout(f));\n      return { timerFound: true, error };\n    } finally {\n      this._duringTick = false;\n    }\n  }\n  getTimeToNextFrame() {\n    this._replayLogOnce();\n    return 16 - this._now.ticks % 16;\n  }\n  clearTimer(timerId, type) {\n    this._replayLogOnce();\n    if (!timerId) {\n      return;\n    }\n    const id = Number(timerId);\n    if (Number.isNaN(id) || id < idCounterStart) {\n      const handlerName = getClearHandler(type);\n      new Error(`Clock: ${handlerName} was invoked to clear a native timer instead of one created by the clock library.`);\n    }\n    const timer = this._timers.get(id);\n    if (timer) {\n      if (timer.type === type || timer.type === "Timeout" && type === "Interval" || timer.type === "Interval" && type === "Timeout") {\n        this._timers.delete(id);\n      } else {\n        const clear = getClearHandler(type);\n        const schedule = getScheduleHandler(timer.type);\n        throw new Error(\n          `Cannot clear timer: timer created with ${schedule}() but cleared with ${clear}()`\n        );\n      }\n    }\n  }\n  _replayLogOnce() {\n    if (!this._log.length)\n      return;\n    let lastLogTime = -1;\n    let isPaused = false;\n    for (const { type, time, param } of this._log) {\n      if (!isPaused && lastLogTime !== -1)\n        this._advanceNow(shiftTicks(this._now.ticks, time - lastLogTime));\n      lastLogTime = time;\n      if (type === "install") {\n        this._innerInstall(asWallTime(param));\n      } else if (type === "fastForward" || type === "runFor") {\n        this._advanceNow(shiftTicks(this._now.ticks, param));\n      } else if (type === "pauseAt") {\n        isPaused = true;\n        this._innerSetTime(asWallTime(param));\n      } else if (type === "resume") {\n        isPaused = false;\n      } else if (type === "setFixedTime") {\n        this._innerSetFixedTime(asWallTime(param));\n      } else if (type === "setSystemTime") {\n        this._innerSetTime(asWallTime(param));\n      }\n    }\n    if (!isPaused) {\n      if (lastLogTime > 0)\n        this._advanceNow(shiftTicks(this._now.ticks, this._embedder.dateNow() - lastLogTime));\n      this._innerResume();\n    } else {\n      this._realTime = void 0;\n    }\n    this._log.length = 0;\n  }\n};\nfunction mirrorDateProperties(target, source) {\n  for (const prop in source) {\n    if (source.hasOwnProperty(prop))\n      target[prop] = source[prop];\n  }\n  target.toString = () => source.toString();\n  target.prototype = source.prototype;\n  target.parse = source.parse;\n  target.UTC = source.UTC;\n  target.prototype.toUTCString = source.prototype.toUTCString;\n  target.isFake = true;\n  return target;\n}\nfunction createDate(clock, NativeDate) {\n  function ClockDate(year, month, date, hour, minute, second, ms) {\n    if (!(this instanceof ClockDate))\n      return new NativeDate(clock.now()).toString();\n    switch (arguments.length) {\n      case 0:\n        return new NativeDate(clock.now());\n      case 1:\n        return new NativeDate(year);\n      case 2:\n        return new NativeDate(year, month);\n      case 3:\n        return new NativeDate(year, month, date);\n      case 4:\n        return new NativeDate(year, month, date, hour);\n      case 5:\n        return new NativeDate(year, month, date, hour, minute);\n      case 6:\n        return new NativeDate(\n          year,\n          month,\n          date,\n          hour,\n          minute,\n          second\n        );\n      default:\n        return new NativeDate(\n          year,\n          month,\n          date,\n          hour,\n          minute,\n          second,\n          ms\n        );\n    }\n  }\n  ClockDate.now = () => clock.now();\n  return mirrorDateProperties(ClockDate, NativeDate);\n}\nfunction createIntl(clock, NativeIntl) {\n  const ClockIntl = {};\n  for (const key of Object.getOwnPropertyNames(NativeIntl))\n    ClockIntl[key] = NativeIntl[key];\n  ClockIntl.DateTimeFormat = function(...args) {\n    const realFormatter = new NativeIntl.DateTimeFormat(...args);\n    const formatter = {\n      formatRange: realFormatter.formatRange.bind(realFormatter),\n      formatRangeToParts: realFormatter.formatRangeToParts.bind(realFormatter),\n      resolvedOptions: realFormatter.resolvedOptions.bind(realFormatter),\n      format: (date) => realFormatter.format(date || clock.now()),\n      formatToParts: (date) => realFormatter.formatToParts(date || clock.now())\n    };\n    return formatter;\n  };\n  ClockIntl.DateTimeFormat.prototype = Object.create(\n    NativeIntl.DateTimeFormat.prototype\n  );\n  ClockIntl.DateTimeFormat.supportedLocalesOf = NativeIntl.DateTimeFormat.supportedLocalesOf;\n  return ClockIntl;\n}\nfunction compareTimers(a, b) {\n  if (a.callAt < b.callAt)\n    return -1;\n  if (a.callAt > b.callAt)\n    return 1;\n  if (a.type === "Immediate" /* Immediate */ && b.type !== "Immediate" /* Immediate */)\n    return -1;\n  if (a.type !== "Immediate" /* Immediate */ && b.type === "Immediate" /* Immediate */)\n    return 1;\n  if (a.createdAt < b.createdAt)\n    return -1;\n  if (a.createdAt > b.createdAt)\n    return 1;\n  if (a.id < b.id)\n    return -1;\n  if (a.id > b.id)\n    return 1;\n}\nvar maxTimeout = Math.pow(2, 31) - 1;\nvar idCounterStart = 1e12;\nfunction platformOriginals(globalObject) {\n  const raw = {\n    setTimeout: globalObject.setTimeout,\n    clearTimeout: globalObject.clearTimeout,\n    setInterval: globalObject.setInterval,\n    clearInterval: globalObject.clearInterval,\n    requestAnimationFrame: globalObject.requestAnimationFrame ? globalObject.requestAnimationFrame : void 0,\n    cancelAnimationFrame: globalObject.cancelAnimationFrame ? globalObject.cancelAnimationFrame : void 0,\n    requestIdleCallback: globalObject.requestIdleCallback ? globalObject.requestIdleCallback : void 0,\n    cancelIdleCallback: globalObject.cancelIdleCallback ? globalObject.cancelIdleCallback : void 0,\n    Date: globalObject.Date,\n    performance: globalObject.performance,\n    Intl: globalObject.Intl,\n    AbortSignal: globalObject.AbortSignal\n  };\n  const bound = { ...raw };\n  for (const key of Object.keys(bound)) {\n    if (key !== "Date" && key !== "AbortSignal" && typeof bound[key] === "function")\n      bound[key] = bound[key].bind(globalObject);\n  }\n  return { raw, bound };\n}\nfunction getScheduleHandler(type) {\n  if (type === "IdleCallback" || type === "AnimationFrame")\n    return `request${type}`;\n  return `set${type}`;\n}\nfunction createApi(clock, originals, browserName) {\n  return {\n    setTimeout: (func, timeout, ...args) => {\n      const delay = timeout ? +timeout : timeout;\n      return clock.addTimer({\n        type: "Timeout" /* Timeout */,\n        func,\n        args,\n        delay\n      });\n    },\n    clearTimeout: (timerId) => {\n      if (timerId)\n        clock.clearTimer(timerId, "Timeout" /* Timeout */);\n    },\n    setInterval: (func, timeout, ...args) => {\n      const delay = timeout ? +timeout : timeout;\n      return clock.addTimer({\n        type: "Interval" /* Interval */,\n        func,\n        args,\n        delay\n      });\n    },\n    clearInterval: (timerId) => {\n      if (timerId)\n        return clock.clearTimer(timerId, "Interval" /* Interval */);\n    },\n    requestAnimationFrame: (callback) => {\n      return clock.addTimer({\n        type: "AnimationFrame" /* AnimationFrame */,\n        func: callback,\n        delay: clock.getTimeToNextFrame()\n      });\n    },\n    cancelAnimationFrame: (timerId) => {\n      if (timerId)\n        return clock.clearTimer(timerId, "AnimationFrame" /* AnimationFrame */);\n    },\n    requestIdleCallback: (callback, options) => {\n      let timeToNextIdlePeriod = 0;\n      if (clock.countTimers() > 0)\n        timeToNextIdlePeriod = 50;\n      return clock.addTimer({\n        type: "IdleCallback" /* IdleCallback */,\n        func: callback,\n        delay: (options == null ? void 0 : options.timeout) ? Math.min(options == null ? void 0 : options.timeout, timeToNextIdlePeriod) : timeToNextIdlePeriod\n      });\n    },\n    cancelIdleCallback: (timerId) => {\n      if (timerId)\n        return clock.clearTimer(timerId, "IdleCallback" /* IdleCallback */);\n    },\n    Intl: originals.Intl ? createIntl(clock, originals.Intl) : void 0,\n    Date: createDate(clock, originals.Date),\n    performance: originals.performance ? fakePerformance(clock, originals.performance) : void 0,\n    AbortSignal: originals.AbortSignal ? fakeAbortSignal(clock, originals.AbortSignal, browserName) : void 0\n  };\n}\nfunction getClearHandler(type) {\n  if (type === "IdleCallback" || type === "AnimationFrame")\n    return `cancel${type}`;\n  return `clear${type}`;\n}\nvar FakePerformanceEntry = class {\n  constructor(name, entryType, startTime, duration) {\n    this.name = name;\n    this.entryType = entryType;\n    this.startTime = startTime;\n    this.duration = duration;\n  }\n  toJSON() {\n    return JSON.stringify({ ...this });\n  }\n};\nfunction fakePerformance(clock, performance) {\n  const result = {\n    now: () => clock.performanceNow()\n  };\n  result.__defineGetter__("timeOrigin", () => clock._now.origin || 0);\n  for (const key of Object.keys(performance.__proto__)) {\n    if (key === "now" || key === "timeOrigin")\n      continue;\n    if (key === "getEntries" || key === "getEntriesByName" || key === "getEntriesByType")\n      result[key] = () => [];\n    else if (key === "mark")\n      result[key] = (name) => new FakePerformanceEntry(name, "mark", 0, 0);\n    else if (key === "measure")\n      result[key] = (name) => new FakePerformanceEntry(name, "measure", 0, 50);\n    else\n      result[key] = () => {\n      };\n  }\n  return result;\n}\nfunction fakeAbortSignal(clock, abortSignal, browserName) {\n  Object.defineProperty(abortSignal, "timeout", {\n    value(ms) {\n      const controller = new AbortController();\n      clock.addTimer({\n        delay: ms,\n        type: "Timeout" /* Timeout */,\n        func: () => controller.abort(\n          new DOMException(\n            browserName === "chromium" ? "signal timed out" : "The operation timed out.",\n            "TimeoutError"\n          )\n        )\n      });\n      return controller.signal;\n    }\n  });\n  return abortSignal;\n}\nfunction createClock(globalObject, config = {}) {\n  const originals = platformOriginals(globalObject);\n  const embedder = {\n    dateNow: () => originals.raw.Date.now(),\n    performanceNow: () => Math.ceil(originals.raw.performance.now()),\n    setTimeout: (task, timeout) => {\n      const timerId = originals.bound.setTimeout(task, timeout);\n      return () => originals.bound.clearTimeout(timerId);\n    },\n    setInterval: (task, delay) => {\n      const intervalId = originals.bound.setInterval(task, delay);\n      return () => originals.bound.clearInterval(intervalId);\n    }\n  };\n  const clock = new ClockController(embedder);\n  const api = createApi(clock, originals.bound, config.browserName);\n  return { clock, api, originals: originals.raw };\n}\nfunction install(globalObject, config = {}) {\n  var _a, _b;\n  if ((_a = globalObject.Date) == null ? void 0 : _a.isFake) {\n    throw new TypeError(`Can\'t install fake timers twice on the same global object.`);\n  }\n  const { clock, api, originals } = createClock(globalObject, config);\n  const toFake = ((_b = config.toFake) == null ? void 0 : _b.length) ? config.toFake : Object.keys(originals);\n  for (const method of toFake) {\n    if (method === "Date") {\n      globalObject.Date = mirrorDateProperties(api.Date, globalObject.Date);\n    } else if (method === "Intl") {\n      globalObject.Intl = api[method];\n    } else if (method === "AbortSignal") {\n      globalObject.AbortSignal = api[method];\n    } else if (method === "performance") {\n      globalObject.performance = api[method];\n      const kEventTimeStamp = Symbol("playwrightEventTimeStamp");\n      Object.defineProperty(Event.prototype, "timeStamp", {\n        get() {\n          var _a2;\n          if (!this[kEventTimeStamp])\n            this[kEventTimeStamp] = (_a2 = api.performance) == null ? void 0 : _a2.now();\n          return this[kEventTimeStamp];\n        }\n      });\n    } else {\n      globalObject[method] = (...args) => {\n        return api[method].apply(api, args);\n      };\n    }\n    clock.disposables.push(() => {\n      globalObject[method] = originals[method];\n    });\n  }\n  return { clock, api, originals };\n}\nfunction inject(globalObject, browserName) {\n  const builtins = platformOriginals(globalObject).bound;\n  const { clock: controller } = install(globalObject, { browserName });\n  controller.resume();\n  return {\n    controller,\n    builtins\n  };\n}\nfunction asWallTime(n) {\n  return n;\n}\nfunction shiftTicks(ticks, ms) {\n  return ticks + ms;\n}\n';
      +  }
      +});
      +
      +// packages/playwright-core/src/protocol/serializers.ts
      +function parseSerializedValue(value2, handles) {
      +  return innerParseSerializedValue(value2, handles, /* @__PURE__ */ new Map(), []);
      +}
      +function innerParseSerializedValue(value2, handles, refs, accessChain) {
      +  if (value2.ref !== void 0)
      +    return refs.get(value2.ref);
      +  if (value2.n !== void 0)
      +    return value2.n;
      +  if (value2.s !== void 0)
      +    return value2.s;
      +  if (value2.b !== void 0)
      +    return value2.b;
      +  if (value2.v !== void 0) {
      +    if (value2.v === "undefined")
      +      return void 0;
      +    if (value2.v === "null")
      +      return null;
      +    if (value2.v === "NaN")
      +      return NaN;
      +    if (value2.v === "Infinity")
      +      return Infinity;
      +    if (value2.v === "-Infinity")
      +      return -Infinity;
      +    if (value2.v === "-0")
      +      return -0;
      +  }
      +  if (value2.d !== void 0)
      +    return new Date(value2.d);
      +  if (value2.u !== void 0)
      +    return new URL(value2.u);
      +  if (value2.bi !== void 0)
      +    return BigInt(value2.bi);
      +  if (value2.e !== void 0) {
      +    const error = new Error(value2.e.m);
      +    error.name = value2.e.n;
      +    error.stack = value2.e.s;
      +    return error;
      +  }
      +  if (value2.r !== void 0)
      +    return new RegExp(value2.r.p, value2.r.f);
      +  if (value2.ta !== void 0) {
      +    const ctor = typedArrayKindToConstructor[value2.ta.k];
      +    return new ctor(value2.ta.b.buffer, value2.ta.b.byteOffset, value2.ta.b.length / ctor.BYTES_PER_ELEMENT);
      +  }
      +  if (value2.a !== void 0) {
      +    const result2 = [];
      +    refs.set(value2.id, result2);
      +    for (let i = 0; i < value2.a.length; i++)
      +      result2.push(innerParseSerializedValue(value2.a[i], handles, refs, [...accessChain, i]));
      +    return result2;
      +  }
      +  if (value2.o !== void 0) {
      +    const result2 = {};
      +    refs.set(value2.id, result2);
      +    for (const { k, v } of value2.o)
      +      result2[k] = innerParseSerializedValue(v, handles, refs, [...accessChain, k]);
      +    return result2;
      +  }
      +  if (value2.h !== void 0) {
      +    if (handles === void 0)
      +      throw new Error("Unexpected handle");
      +    return handles[value2.h];
      +  }
      +  throw new Error(`Attempting to deserialize unexpected value${accessChainToDisplayString(accessChain)}: ${value2}`);
      +}
      +function serializeValue(value2, handleSerializer) {
      +  return innerSerializeValue(value2, handleSerializer, { lastId: 0, visited: /* @__PURE__ */ new Map() }, []);
      +}
      +function innerSerializeValue(value2, handleSerializer, visitorInfo, accessChain) {
      +  const handle = handleSerializer(value2);
      +  if ("fallThrough" in handle)
      +    value2 = handle.fallThrough;
      +  else
      +    return handle;
      +  if (typeof value2 === "symbol")
      +    return { v: "undefined" };
      +  if (Object.is(value2, void 0))
      +    return { v: "undefined" };
      +  if (Object.is(value2, null))
      +    return { v: "null" };
      +  if (Object.is(value2, NaN))
      +    return { v: "NaN" };
      +  if (Object.is(value2, Infinity))
      +    return { v: "Infinity" };
      +  if (Object.is(value2, -Infinity))
      +    return { v: "-Infinity" };
      +  if (Object.is(value2, -0))
      +    return { v: "-0" };
      +  if (typeof value2 === "boolean")
      +    return { b: value2 };
      +  if (typeof value2 === "number")
      +    return { n: value2 };
      +  if (typeof value2 === "string")
      +    return { s: value2 };
      +  if (typeof value2 === "bigint")
      +    return { bi: value2.toString() };
      +  if (isError2(value2))
      +    return { e: { n: value2.name, m: value2.message, s: value2.stack || "" } };
      +  if (isDate(value2))
      +    return { d: value2.toJSON() };
      +  if (isURL(value2))
      +    return { u: value2.toJSON() };
      +  if (isRegExp4(value2))
      +    return { r: { p: value2.source, f: value2.flags } };
      +  const typedArrayKind = constructorToTypedArrayKind.get(value2.constructor);
      +  if (typedArrayKind)
      +    return { ta: { b: Buffer.from(value2.buffer, value2.byteOffset, value2.byteLength), k: typedArrayKind } };
      +  const id = visitorInfo.visited.get(value2);
      +  if (id)
      +    return { ref: id };
      +  if (Array.isArray(value2)) {
      +    const a = [];
      +    const id2 = ++visitorInfo.lastId;
      +    visitorInfo.visited.set(value2, id2);
      +    for (let i = 0; i < value2.length; ++i)
      +      a.push(innerSerializeValue(value2[i], handleSerializer, visitorInfo, [...accessChain, i]));
      +    return { a, id: id2 };
      +  }
      +  if (typeof value2 === "object") {
      +    const o = [];
      +    const id2 = ++visitorInfo.lastId;
      +    visitorInfo.visited.set(value2, id2);
      +    for (const name of Object.keys(value2))
      +      o.push({ k: name, v: innerSerializeValue(value2[name], handleSerializer, visitorInfo, [...accessChain, name]) });
      +    return { o, id: id2 };
      +  }
      +  throw new Error(`Attempting to serialize unexpected value${accessChainToDisplayString(accessChain)}: ${value2}`);
      +}
      +function accessChainToDisplayString(accessChain) {
      +  const chainString = accessChain.map((accessor, i) => {
      +    if (typeof accessor === "string")
      +      return i ? `.${accessor}` : accessor;
      +    return `[${accessor}]`;
      +  }).join("");
      +  return chainString.length > 0 ? ` at position "${chainString}"` : "";
      +}
      +function isRegExp4(obj) {
      +  return obj instanceof RegExp || Object.prototype.toString.call(obj) === "[object RegExp]";
      +}
      +function isDate(obj) {
      +  return obj instanceof Date || Object.prototype.toString.call(obj) === "[object Date]";
      +}
      +function isURL(obj) {
      +  return obj instanceof URL || Object.prototype.toString.call(obj) === "[object URL]";
      +}
      +function isError2(obj) {
      +  const proto = obj ? Object.getPrototypeOf(obj) : null;
      +  return obj instanceof Error || proto?.name === "Error" || proto && isError2(proto);
      +}
      +var typedArrayKindToConstructor, constructorToTypedArrayKind;
      +var init_serializers = __esm({
      +  "packages/playwright-core/src/protocol/serializers.ts"() {
      +    "use strict";
      +    typedArrayKindToConstructor = {
      +      i8: Int8Array,
      +      ui8: Uint8Array,
      +      ui8c: Uint8ClampedArray,
      +      i16: Int16Array,
      +      ui16: Uint16Array,
      +      i32: Int32Array,
      +      ui32: Uint32Array,
      +      f32: Float32Array,
      +      f64: Float64Array,
      +      bi64: BigInt64Array,
      +      bui64: BigUint64Array
      +    };
      +    constructorToTypedArrayKind = new Map(Object.entries(typedArrayKindToConstructor).map(([k, v]) => [v, k]));
      +  }
      +});
      +
      +// packages/playwright-core/src/server/errors.ts
      +function isTargetClosedError(error) {
      +  return error instanceof TargetClosedError || error.name === "TargetClosedError";
      +}
      +function serializeError(e) {
      +  if (isError(e))
      +    return { error: { message: e.message, stack: e.stack, name: e.name } };
      +  return { value: serializeValue(e, (value2) => ({ fallThrough: value2 })) };
      +}
      +function parseError(error) {
      +  if (!error.error) {
      +    if (error.value === void 0)
      +      throw new Error("Serialized error must have either an error or a value");
      +    return parseSerializedValue(error.value, void 0);
      +  }
      +  const e = new Error(error.error.message);
      +  e.stack = error.error.stack || "";
      +  e.name = error.error.name;
      +  return e;
      +}
      +var CustomError, TimeoutError, TargetClosedError;
      +var init_errors = __esm({
      +  "packages/playwright-core/src/server/errors.ts"() {
      +    "use strict";
      +    init_rtti();
      +    init_serializers();
      +    CustomError = class extends Error {
      +      constructor(message) {
      +        super(message);
      +        this.name = this.constructor.name;
      +      }
      +    };
      +    TimeoutError = class extends CustomError {
      +    };
      +    TargetClosedError = class extends CustomError {
      +      constructor(cause, logs) {
      +        super((cause || "Target page, context or browser has been closed") + (logs || ""));
      +      }
      +    };
      +  }
      +});
      +
      +// packages/playwright-core/src/server/progress.ts
      +function isAbortError(error) {
      +  return error instanceof TimeoutError || !!error[kAbortErrorSymbol];
      +}
      +async function raceUncancellableOperationWithCleanup(progress2, run, cleanup) {
      +  let aborted = false;
      +  try {
      +    return await progress2.race(run().then(async (t) => {
      +      if (aborted)
      +        await cleanup(t);
      +      return t;
      +    }));
      +  } catch (error) {
      +    aborted = true;
      +    throw error;
      +  }
      +}
      +var ProgressController, kAbortErrorSymbol, nullProgress;
      +var init_progress = __esm({
      +  "packages/playwright-core/src/server/progress.ts"() {
      +    "use strict";
      +    init_manualPromise();
      +    init_assert();
      +    init_time();
      +    init_debugLogger();
      +    init_errors();
      +    ProgressController = class _ProgressController {
      +      constructor(metadata, onCallLog) {
      +        this._forceAbortPromise = new ManualPromise();
      +        this._donePromise = new ManualPromise();
      +        this._state = "before";
      +        this.metadata = metadata || { id: "", startTime: 0, endTime: 0, type: "Internal", method: "", params: {}, log: [], internal: true };
      +        this._onCallLog = onCallLog;
      +        this._forceAbortPromise.catch((e) => null);
      +        this._controller = new AbortController();
      +      }
      +      static createForSdkObject(sdkObject, callMetadata) {
      +        const logName = sdkObject.logName || "api";
      +        return new _ProgressController(callMetadata, (message) => {
      +          if (logName === "api" && sdkObject.attribution.playwright?.options.isInternalPlaywright)
      +            return;
      +          debugLogger.log(logName, message);
      +          sdkObject.instrumentation.onCallLog(sdkObject, callMetadata, logName, message);
      +        });
      +      }
      +      async abort(error) {
      +        if (this._state === "running") {
      +          error[kAbortErrorSymbol] = true;
      +          this._state = { error };
      +          this._forceAbortPromise.reject(error);
      +          this._controller.abort(error);
      +        }
      +        await this._donePromise;
      +      }
      +      async run(task, timeout) {
      +        const deadline = timeout ? monotonicTime() + timeout : 0;
      +        assert(this._state === "before");
      +        this._state = "running";
      +        let timer;
      +        let outerProgress;
      +        let allowConcurrent = false;
      +        const progress2 = {
      +          timeout: timeout ?? 0,
      +          deadline,
      +          disableTimeout: () => {
      +            clearTimeout(timer);
      +          },
      +          log: (message) => {
      +            if (this._state === "running")
      +              this.metadata.log.push(message);
      +            this._onCallLog?.(message);
      +          },
      +          metadata: this.metadata,
      +          setAllowConcurrentOrNestedRaces: (allow) => {
      +            allowConcurrent = allow;
      +          },
      +          race: (promise) => {
      +            if (process.env.PW_DETECT_NESTED_PROGRESS) {
      +              const innerProgress = new Error().stack;
      +              if (outerProgress && !allowConcurrent && outerProgress !== innerProgress) {
      +                console.error("Cannot call race() inside another race()");
      +                console.error("<<<<>>>>:", outerProgress);
      +                console.error("<<<<>>>>:", innerProgress);
      +              }
      +              outerProgress = innerProgress;
      +            }
      +            const promises = Array.isArray(promise) ? promise : [promise];
      +            if (!promises.length)
      +              return Promise.resolve();
      +            return Promise.race([...promises, this._forceAbortPromise]).finally(() => outerProgress = void 0);
      +          },
      +          wait: async (timeout2) => {
      +            let timer2;
      +            const promise = new Promise((f) => timer2 = setTimeout(f, timeout2));
      +            return progress2.race(promise).finally(() => clearTimeout(timer2));
      +          },
      +          signal: this._controller.signal
      +        };
      +        if (deadline) {
      +          const timeoutError = new TimeoutError(`Timeout ${timeout}ms exceeded.`);
      +          timer = setTimeout(() => {
      +            if (this.metadata.pauseStartTime && !this.metadata.pauseEndTime)
      +              return;
      +            if (this._state === "running") {
      +              this._state = { error: timeoutError };
      +              this._forceAbortPromise.reject(timeoutError);
      +              this._controller.abort(timeoutError);
      +            }
      +          }, deadline - monotonicTime());
      +        }
      +        try {
      +          const result2 = await task(progress2);
      +          this._state = "finished";
      +          return result2;
      +        } catch (error) {
      +          this._state = { error };
      +          throw error;
      +        } finally {
      +          clearTimeout(timer);
      +          this._donePromise.resolve();
      +        }
      +      }
      +    };
      +    kAbortErrorSymbol = Symbol("kAbortError");
      +    nullProgress = {
      +      timeout: 0,
      +      deadline: 0,
      +      disableTimeout() {
      +      },
      +      log() {
      +      },
      +      race(promise) {
      +        const promises = Array.isArray(promise) ? promise : [promise];
      +        return Promise.race(promises);
      +      },
      +      wait: async (timeout) => await new Promise((f) => setTimeout(f, timeout)),
      +      signal: new AbortController().signal,
      +      metadata: {
      +        id: "",
      +        startTime: 0,
      +        endTime: 0,
      +        type: "",
      +        method: "",
      +        params: {},
      +        log: [],
      +        internal: true
      +      },
      +      setAllowConcurrentOrNestedRaces() {
      +      }
      +    };
      +  }
      +});
      +
      +// packages/playwright-core/src/server/clock.ts
      +function parseTicks(value2) {
      +  if (typeof value2 === "number")
      +    return value2;
      +  if (!value2)
      +    return 0;
      +  const str = value2;
      +  const strings = str.split(":");
      +  const l = strings.length;
      +  let i = l;
      +  let ms = 0;
      +  let parsed;
      +  if (l > 3 || !/^(\d\d:){0,2}\d\d?$/.test(str)) {
      +    throw new Error(
      +      `Clock only understands numbers, 'mm:ss' and 'hh:mm:ss'`
      +    );
      +  }
      +  while (i--) {
      +    parsed = parseInt(strings[i], 10);
      +    if (parsed >= 60)
      +      throw new Error(`Invalid time ${str}`);
      +    ms += parsed * Math.pow(60, l - i - 1);
      +  }
      +  return ms * 1e3;
      +}
      +function parseTime(epoch) {
      +  if (!epoch)
      +    return 0;
      +  if (typeof epoch === "number")
      +    return epoch;
      +  const parsed = new Date(epoch);
      +  if (!isFinite(parsed.getTime()))
      +    throw new Error(`Invalid date: ${epoch}`);
      +  return parsed.getTime();
      +}
      +var Clock;
      +var init_clock = __esm({
      +  "packages/playwright-core/src/server/clock.ts"() {
      +    "use strict";
      +    init_clockSource();
      +    init_progress();
      +    Clock = class {
      +      constructor(browserContext) {
      +        this._initScripts = [];
      +        this._browserContext = browserContext;
      +      }
      +      async uninstall(progress2) {
      +        await progress2.race(Promise.all(this._initScripts.map((script) => script.dispose())));
      +        this._initScripts = [];
      +      }
      +      async fastForward(ticks) {
      +        await this._installIfNeeded();
      +        const ticksMillis = parseTicks(ticks);
      +        this._initScripts.push(await this._browserContext.addInitScript(nullProgress, `globalThis.__pwClock.controller.log('fastForward', ${Date.now()}, ${ticksMillis})`));
      +        await this._evaluateInFrames(`globalThis.__pwClock.controller.fastForward(${ticksMillis})`);
      +      }
      +      async install(time) {
      +        await this._installIfNeeded();
      +        const timeMillis = time !== void 0 ? parseTime(time) : Date.now();
      +        this._initScripts.push(await this._browserContext.addInitScript(nullProgress, `globalThis.__pwClock.controller.log('install', ${Date.now()}, ${timeMillis})`));
      +        await this._evaluateInFrames(`globalThis.__pwClock.controller.install(${timeMillis})`);
      +      }
      +      async pauseAt(ticks) {
      +        await this._installIfNeeded();
      +        const timeMillis = parseTime(ticks);
      +        this._initScripts.push(await this._browserContext.addInitScript(nullProgress, `globalThis.__pwClock.controller.log('pauseAt', ${Date.now()}, ${timeMillis})`));
      +        await this._evaluateInFrames(`globalThis.__pwClock.controller.pauseAt(${timeMillis})`);
      +      }
      +      resumeNoReply() {
      +        if (!this._initScripts.length)
      +          return;
      +        const doResume = async () => {
      +          this._initScripts.push(await this._browserContext.addInitScript(nullProgress, `globalThis.__pwClock.controller.log('resume', ${Date.now()})`));
      +          await this._evaluateInFrames(`globalThis.__pwClock.controller.resume()`);
      +        };
      +        doResume().catch(() => {
      +        });
      +      }
      +      async resume(progress2) {
      +        await progress2.race(this._installIfNeeded());
      +        this._initScripts.push(await this._browserContext.addInitScript(nullProgress, `globalThis.__pwClock.controller.log('resume', ${Date.now()})`));
      +        await progress2.race(this._evaluateInFrames(`globalThis.__pwClock.controller.resume()`));
      +      }
      +      async setFixedTime(time) {
      +        await this._installIfNeeded();
      +        const timeMillis = parseTime(time);
      +        this._initScripts.push(await this._browserContext.addInitScript(nullProgress, `globalThis.__pwClock.controller.log('setFixedTime', ${Date.now()}, ${timeMillis})`));
      +        await this._evaluateInFrames(`globalThis.__pwClock.controller.setFixedTime(${timeMillis})`);
      +      }
      +      async setSystemTime(time) {
      +        await this._installIfNeeded();
      +        const timeMillis = parseTime(time);
      +        this._initScripts.push(await this._browserContext.addInitScript(nullProgress, `globalThis.__pwClock.controller.log('setSystemTime', ${Date.now()}, ${timeMillis})`));
      +        await this._evaluateInFrames(`globalThis.__pwClock.controller.setSystemTime(${timeMillis})`);
      +      }
      +      async runFor(ticks) {
      +        await this._installIfNeeded();
      +        const ticksMillis = parseTicks(ticks);
      +        this._initScripts.push(await this._browserContext.addInitScript(nullProgress, `globalThis.__pwClock.controller.log('runFor', ${Date.now()}, ${ticksMillis})`));
      +        await this._evaluateInFrames(`globalThis.__pwClock.controller.runFor(${ticksMillis})`);
      +      }
      +      async _installIfNeeded() {
      +        if (this._initScripts.length)
      +          return;
      +        const script = `(() => {
      +      const module = {};
      +      ${source}
      +      if (!globalThis.__pwClock)
      +        globalThis.__pwClock = (module.exports.inject())(globalThis, ${JSON.stringify(this._browserContext._browser.options.name)});
      +    })();`;
      +        const initScript = await this._browserContext.addInitScript(nullProgress, script);
      +        await this._evaluateInFrames(script);
      +        this._initScripts.push(initScript);
      +      }
      +      async _evaluateInFrames(script) {
      +        await this._browserContext.safeNonStallingEvaluateInAllFrames(script, "main", { throwOnJSErrors: true });
      +      }
      +    };
      +  }
      +});
      +
      +// packages/playwright-core/src/generated/webAuthnSource.ts
      +var source2;
      +var init_webAuthnSource = __esm({
      +  "packages/playwright-core/src/generated/webAuthnSource.ts"() {
      +    "use strict";
      +    source2 = `
      +var __commonJS = obj => {
      +  let required = false;
      +  let result;
      +  return function __require() {
      +    if (!required) {
      +      required = true;
      +      let fn;
      +      for (const name in obj) { fn = obj[name]; break; }
      +      const module = { exports: {} };
      +      fn(module.exports, module);
      +      result = module.exports;
      +    }
      +    return result;
      +  }
      +};
      +var __export = (target, all) => {for (var name in all) target[name] = all[name];};
      +var __toESM = mod => ({ ...mod, 'default': mod });
      +var __toCommonJS = mod => ({ ...mod, __esModule: true });
      +
      +
      +// packages/injected/src/webAuthn.ts
      +var webAuthn_exports = {};
      +__export(webAuthn_exports, {
      +  inject: () => inject
      +});
      +module.exports = __toCommonJS(webAuthn_exports);
      +function inject(globalThis) {
      +  if (globalThis.__pwWebAuthnInstalled)
      +    return;
      +  globalThis.__pwWebAuthnInstalled = true;
      +  const binding = globalThis.__pwWebAuthnBinding;
      +  if (!binding || !globalThis.navigator)
      +    return;
      +  if (!globalThis.navigator.credentials) {
      +    Object.defineProperty(globalThis.navigator, "credentials", {
      +      value: { create: async () => null, get: async () => null },
      +      writable: true,
      +      configurable: true
      +    });
      +  }
      +  function toBase64Url(buf) {
      +    const bytes = buf instanceof ArrayBuffer ? new Uint8Array(buf) : new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
      +    let s = "";
      +    for (let i = 0; i < bytes.length; i++)
      +      s += String.fromCharCode(bytes[i]);
      +    return globalThis.btoa(s).replaceAll("+", "-").replaceAll("/", "_").replaceAll("=", "");
      +  }
      +  function fromBase64Url(s) {
      +    let str = s.replaceAll("-", "+").replaceAll("_", "/");
      +    while (str.length % 4)
      +      str += "=";
      +    const bin = globalThis.atob(str);
      +    const out = new Uint8Array(bin.length);
      +    for (let i = 0; i < bin.length; i++)
      +      out[i] = bin.charCodeAt(i);
      +    return out.buffer;
      +  }
      +  const PublicKeyCredentialCtor = globalThis.PublicKeyCredential;
      +  const AuthAttestationResponseCtor = globalThis.AuthenticatorAttestationResponse;
      +  const AuthAssertionResponseCtor = globalThis.AuthenticatorAssertionResponse;
      +  function defineReadonly(target, props) {
      +    for (const k of Object.keys(props))
      +      Object.defineProperty(target, k, { value: props[k], enumerable: true, configurable: true });
      +  }
      +  function makeAttestationResponse(clientDataJSON, attestationObject) {
      +    const proto = (AuthAttestationResponseCtor == null ? void 0 : AuthAttestationResponseCtor.prototype) || Object.prototype;
      +    const r = Object.create(proto);
      +    defineReadonly(r, { clientDataJSON, attestationObject });
      +    r.getTransports = () => ["internal"];
      +    r.getAuthenticatorData = () => {
      +      return attestationObject;
      +    };
      +    r.getPublicKey = () => null;
      +    r.getPublicKeyAlgorithm = () => -7;
      +    return r;
      +  }
      +  function makeAssertionResponse(clientDataJSON, authenticatorData, signature, userHandle) {
      +    const proto = (AuthAssertionResponseCtor == null ? void 0 : AuthAssertionResponseCtor.prototype) || Object.prototype;
      +    const r = Object.create(proto);
      +    defineReadonly(r, { clientDataJSON, authenticatorData, signature, userHandle });
      +    return r;
      +  }
      +  function makePublicKeyCredential(id, response) {
      +    const proto = (PublicKeyCredentialCtor == null ? void 0 : PublicKeyCredentialCtor.prototype) || Object.prototype;
      +    const cred = Object.create(proto);
      +    defineReadonly(cred, {
      +      id,
      +      rawId: fromBase64Url(id),
      +      type: "public-key",
      +      authenticatorAttachment: "platform",
      +      response
      +    });
      +    cred.getClientExtensionResults = () => ({});
      +    cred.toJSON = () => ({ id, rawId: id, type: "public-key", response: {} });
      +    return cred;
      +  }
      +  function toBuf(x) {
      +    if (!x)
      +      return new ArrayBuffer(0);
      +    if (x instanceof ArrayBuffer)
      +      return x;
      +    const v = x;
      +    const out = new Uint8Array(v.byteLength);
      +    out.set(new Uint8Array(v.buffer, v.byteOffset, v.byteLength));
      +    return out.buffer;
      +  }
      +  function failure(name, message) {
      +    const Ctor = globalThis.DOMException || Error;
      +    throw new Ctor(message, name);
      +  }
      +  const origCreate = globalThis.navigator.credentials.create.bind(globalThis.navigator.credentials);
      +  const origGet = globalThis.navigator.credentials.get.bind(globalThis.navigator.credentials);
      +  globalThis.navigator.credentials.create = async function(options) {
      +    var _a, _b, _c, _d, _e, _f, _g;
      +    if (!options || !options.publicKey)
      +      return origCreate(options);
      +    const pk = options.publicKey;
      +    const req = {
      +      type: "create",
      +      origin: globalThis.location.origin,
      +      challenge: toBase64Url(toBuf(pk.challenge)),
      +      rp: { id: (_a = pk.rp) == null ? void 0 : _a.id, name: ((_b = pk.rp) == null ? void 0 : _b.name) || "" },
      +      user: {
      +        id: toBase64Url(toBuf((_c = pk.user) == null ? void 0 : _c.id)),
      +        name: ((_d = pk.user) == null ? void 0 : _d.name) || "",
      +        displayName: ((_e = pk.user) == null ? void 0 : _e.displayName) || ""
      +      },
      +      pubKeyCredParams: (pk.pubKeyCredParams || []).map((p) => ({ type: p.type, alg: p.alg })),
      +      excludeCredentials: (pk.excludeCredentials || []).map((c) => ({ type: c.type, id: toBase64Url(toBuf(c.id)) })),
      +      userVerification: (_f = pk.authenticatorSelection) == null ? void 0 : _f.userVerification,
      +      residentKey: (_g = pk.authenticatorSelection) == null ? void 0 : _g.residentKey
      +    };
      +    const result = await binding(req);
      +    if (!result.ok)
      +      failure(result.name, result.message);
      +    const resp = makeAttestationResponse(fromBase64Url(result.clientDataJSON), fromBase64Url(result.attestationObject));
      +    return makePublicKeyCredential(result.id, resp);
      +  };
      +  globalThis.navigator.credentials.get = async function(options) {
      +    if (!options || !options.publicKey)
      +      return origGet(options);
      +    const pk = options.publicKey;
      +    const req = {
      +      type: "get",
      +      origin: globalThis.location.origin,
      +      challenge: toBase64Url(toBuf(pk.challenge)),
      +      rpId: pk.rpId || new URL(globalThis.location.origin).hostname,
      +      allowCredentials: (pk.allowCredentials || []).map((c) => ({ type: c.type, id: toBase64Url(toBuf(c.id)) })),
      +      userVerification: pk.userVerification
      +    };
      +    const result = await binding(req);
      +    if (!result.ok)
      +      failure(result.name, result.message);
      +    const resp = makeAssertionResponse(
      +      fromBase64Url(result.clientDataJSON),
      +      fromBase64Url(result.authenticatorData),
      +      fromBase64Url(result.signature),
      +      result.userHandle ? fromBase64Url(result.userHandle) : null
      +    );
      +    return makePublicKeyCredential(result.id, resp);
      +  };
      +  if (PublicKeyCredentialCtor) {
      +    PublicKeyCredentialCtor.isUserVerifyingPlatformAuthenticatorAvailable = async () => true;
      +    PublicKeyCredentialCtor.isConditionalMediationAvailable = async () => true;
      +  }
      +}
      +`;
      +  }
      +});
      +
      +// packages/playwright-core/src/server/credentials.ts
      +function toPublic(r) {
      +  return { id: r.id, rpId: r.rpId, userHandle: r.userHandle, privateKey: r.privateKey, publicKey: r.publicKey };
      +}
      +function randomBase64Url(bytes) {
      +  return bufToB64Url(import_crypto6.default.randomBytes(bytes));
      +}
      +function bufToB64Url(b) {
      +  return b.toString("base64").replaceAll("+", "-").replaceAll("/", "_").replaceAll("=", "");
      +}
      +function b64UrlToBuf(s) {
      +  return Buffer.from(s, "base64url");
      +}
      +function u32ToBytes(n) {
      +  const b = Buffer.alloc(4);
      +  b.writeUInt32BE(n >>> 0, 0);
      +  return b;
      +}
      +function cborHead(major2, value2) {
      +  const m = major2 << 5;
      +  if (value2 < 24)
      +    return Buffer.from([m | value2]);
      +  if (value2 < 256)
      +    return Buffer.from([m | 24, value2]);
      +  if (value2 < 65536)
      +    return Buffer.from([m | 25, value2 >> 8 & 255, value2 & 255]);
      +  return Buffer.from([m | 26, value2 >>> 24 & 255, value2 >> 16 & 255, value2 >> 8 & 255, value2 & 255]);
      +}
      +function cborUint(v) {
      +  return cborHead(0, v);
      +}
      +function cborNint(v) {
      +  return cborHead(1, -1 - v);
      +}
      +function cborBytes(b) {
      +  return Buffer.concat([cborHead(2, b.length), b]);
      +}
      +function cborText(s) {
      +  const b = Buffer.from(s, "utf8");
      +  return Buffer.concat([cborHead(3, b.length), b]);
      +}
      +function cborMap(entries) {
      +  return Buffer.concat([cborHead(5, entries.length), ...entries.flatMap(([k, v]) => [k, v])]);
      +}
      +function encodeCoseEs256PublicKey(publicKey) {
      +  const jwk = publicKey.export({ format: "jwk" });
      +  const x = Buffer.from(jwk.x, "base64url");
      +  const y = Buffer.from(jwk.y, "base64url");
      +  return cborMap([
      +    [cborUint(1), cborUint(2)],
      +    // kty = EC2
      +    [cborUint(3), cborNint(-7)],
      +    // alg = ES256
      +    [cborNint(-1), cborUint(1)],
      +    // crv = P-256
      +    [cborNint(-2), cborBytes(x)],
      +    [cborNint(-3), cborBytes(y)]
      +  ]);
      +}
      +function encodeAttestationObjectNone(authData) {
      +  return cborMap([
      +    [cborText("fmt"), cborText("none")],
      +    [cborText("attStmt"), cborMap([])],
      +    [cborText("authData"), cborBytes(authData)]
      +  ]);
      +}
      +var import_crypto6, kBindingName, kAuthenticatorAAGUID, Credentials;
      +var init_credentials = __esm({
      +  "packages/playwright-core/src/server/credentials.ts"() {
      +    "use strict";
      +    import_crypto6 = __toESM(require("crypto"));
      +    init_webAuthnSource();
      +    init_progress();
      +    kBindingName = "__pwWebAuthnBinding";
      +    kAuthenticatorAAGUID = Buffer.alloc(16);
      +    Credentials = class {
      +      constructor(browserContext) {
      +        this._initScripts = [];
      +        this._installed = false;
      +        this._registry = /* @__PURE__ */ new Map();
      +        this._browserContext = browserContext;
      +      }
      +      async create(options) {
      +        let privateKey = options.privateKey;
      +        let publicKey = options.publicKey;
      +        if (!privateKey || !publicKey) {
      +          const pair = import_crypto6.default.generateKeyPairSync("ec", { namedCurve: "P-256" });
      +          privateKey = bufToB64Url(pair.privateKey.export({ format: "der", type: "pkcs8" }));
      +          publicKey = bufToB64Url(pair.publicKey.export({ format: "der", type: "spki" }));
      +        }
      +        const record = {
      +          id: options.id || randomBase64Url(16),
      +          rpId: options.rpId,
      +          userHandle: options.userHandle || randomBase64Url(16),
      +          privateKey,
      +          publicKey,
      +          signCount: 0,
      +          isResident: true
      +        };
      +        this._registry.set(record.id, record);
      +        return toPublic(record);
      +      }
      +      async get(filter) {
      +        return [...this._registry.values()].filter((c) => {
      +          if (filter?.rpId && c.rpId !== filter.rpId)
      +            return false;
      +          if (filter?.id && c.id !== filter.id)
      +            return false;
      +          return true;
      +        }).map(toPublic);
      +      }
      +      async delete(id) {
      +        this._registry.delete(id);
      +      }
      +      async dispose(progress2) {
      +        await progress2.race(Promise.all(this._initScripts.map((s) => s.dispose())));
      +        this._initScripts = [];
      +        this._installed = false;
      +        this._registry.clear();
      +      }
      +      async install(progress2) {
      +        if (this._installed)
      +          return;
      +        this._installed = true;
      +        await this._browserContext.exposeBinding(progress2, kBindingName, async (_source, payload) => {
      +          try {
      +            if (payload?.type === "create")
      +              return await this._handleCreate(payload);
      +            if (payload?.type === "get")
      +              return this._handleGet(payload);
      +          } catch (e) {
      +            return { ok: false, name: "NotAllowedError", message: e.message };
      +          }
      +          return { ok: false, name: "NotAllowedError", message: "Unknown WebAuthn request" };
      +        });
      +        const script = `(() => {
      +      const module = {};
      +      ${source2}
      +      module.exports.inject()(globalThis);
      +    })();`;
      +        const initScript = await this._browserContext.addInitScript(nullProgress, script);
      +        this._initScripts.push(initScript);
      +        await progress2.race(this._browserContext.safeNonStallingEvaluateInAllFrames(script, "main", { throwOnJSErrors: false }));
      +      }
      +      async _handleCreate(req) {
      +        const rpId = req.rp?.id || new URL(req.origin).hostname;
      +        const userHandle = req.user.id;
      +        if (req.excludeCredentials?.length) {
      +          for (const desc of req.excludeCredentials) {
      +            if (this._registry.has(desc.id))
      +              return { ok: false, name: "InvalidStateError", message: "Credential excluded" };
      +          }
      +        }
      +        const pair = import_crypto6.default.generateKeyPairSync("ec", { namedCurve: "P-256" });
      +        const privateKey = bufToB64Url(pair.privateKey.export({ format: "der", type: "pkcs8" }));
      +        const publicKey = bufToB64Url(pair.publicKey.export({ format: "der", type: "spki" }));
      +        const credentialId = import_crypto6.default.randomBytes(16);
      +        const credentialIdB64 = bufToB64Url(credentialId);
      +        const record = {
      +          id: credentialIdB64,
      +          rpId,
      +          userHandle,
      +          privateKey,
      +          publicKey,
      +          signCount: 0,
      +          isResident: req.residentKey === "required" || req.residentKey === "preferred"
      +        };
      +        this._registry.set(credentialIdB64, record);
      +        const clientDataJSON = Buffer.from(JSON.stringify({
      +          type: "webauthn.create",
      +          challenge: req.challenge,
      +          origin: req.origin,
      +          crossOrigin: false
      +        }));
      +        const rpIdHash = import_crypto6.default.createHash("sha256").update(rpId).digest();
      +        const flags = 1 | 4 | 64;
      +        const signCountBuf = u32ToBytes(record.signCount);
      +        const cosePublicKey = encodeCoseEs256PublicKey(pair.publicKey);
      +        const credIdLenBuf = Buffer.from([credentialId.length >> 8 & 255, credentialId.length & 255]);
      +        const attestedCredentialData = Buffer.concat([kAuthenticatorAAGUID, credIdLenBuf, credentialId, cosePublicKey]);
      +        const authData = Buffer.concat([rpIdHash, Buffer.from([flags]), signCountBuf, attestedCredentialData]);
      +        const attestationObject = encodeAttestationObjectNone(authData);
      +        return {
      +          ok: true,
      +          id: credentialIdB64,
      +          clientDataJSON: bufToB64Url(clientDataJSON),
      +          attestationObject: bufToB64Url(attestationObject)
      +        };
      +      }
      +      _handleGet(req) {
      +        const rpId = req.rpId || new URL(req.origin).hostname;
      +        let candidate;
      +        if (req.allowCredentials?.length) {
      +          for (const desc of req.allowCredentials) {
      +            const c = this._registry.get(desc.id);
      +            if (c && c.rpId === rpId) {
      +              candidate = c;
      +              break;
      +            }
      +          }
      +        } else {
      +          for (const c of this._registry.values()) {
      +            if (c.rpId === rpId && c.isResident) {
      +              candidate = c;
      +              break;
      +            }
      +          }
      +        }
      +        if (!candidate)
      +          return { ok: false, name: "NotAllowedError", message: "No matching credential" };
      +        const clientDataJSON = Buffer.from(JSON.stringify({
      +          type: "webauthn.get",
      +          challenge: req.challenge,
      +          origin: req.origin,
      +          crossOrigin: false
      +        }));
      +        const rpIdHash = import_crypto6.default.createHash("sha256").update(rpId).digest();
      +        const flags = 1 | 4;
      +        candidate.signCount += 1;
      +        const signCountBuf = u32ToBytes(candidate.signCount);
      +        const authData = Buffer.concat([rpIdHash, Buffer.from([flags]), signCountBuf]);
      +        const clientDataHash = import_crypto6.default.createHash("sha256").update(clientDataJSON).digest();
      +        const toSign = Buffer.concat([authData, clientDataHash]);
      +        const privateKey = import_crypto6.default.createPrivateKey({ key: b64UrlToBuf(candidate.privateKey), format: "der", type: "pkcs8" });
      +        const signature = import_crypto6.default.sign("sha256", toSign, privateKey);
      +        return {
      +          ok: true,
      +          id: candidate.id,
      +          clientDataJSON: bufToB64Url(clientDataJSON),
      +          authenticatorData: bufToB64Url(authData),
      +          signature: bufToB64Url(signature),
      +          userHandle: candidate.userHandle || null
      +        };
      +      }
      +    };
      +  }
      +});
      +
      +// packages/playwright-core/src/server/instrumentation.ts
      +function createRootSdkObject() {
      +  const fakeParent = { attribution: {}, instrumentation: createInstrumentation() };
      +  const root = new SdkObject(fakeParent);
      +  root.guid = "";
      +  return root;
      +}
      +function createInstrumentation() {
      +  const listeners = /* @__PURE__ */ new Map();
      +  const lastListeners = /* @__PURE__ */ new Map();
      +  return new Proxy({}, {
      +    get: (obj, prop) => {
      +      if (typeof prop !== "string")
      +        return obj[prop];
      +      if (prop === "addListener") {
      +        return (listener, context2, options) => {
      +          if (options?.order === "last")
      +            lastListeners.set(listener, context2);
      +          else
      +            listeners.set(listener, context2);
      +        };
      +      }
      +      if (prop === "removeListener") {
      +        return (listener) => {
      +          listeners.delete(listener);
      +          lastListeners.delete(listener);
      +        };
      +      }
      +      if (!prop.startsWith("on"))
      +        return obj[prop];
      +      return async (sdkObject, ...params2) => {
      +        for (const [listener, context2] of listeners) {
      +          if (!context2 || sdkObject.attribution.context === context2)
      +            await listener[prop]?.(sdkObject, ...params2);
      +        }
      +        for (const [listener, context2] of lastListeners) {
      +          if (!context2 || sdkObject.attribution.context === context2)
      +            await listener[prop]?.(sdkObject, ...params2);
      +        }
      +      };
      +    }
      +  });
      +}
      +var import_events3, SdkObject;
      +var init_instrumentation = __esm({
      +  "packages/playwright-core/src/server/instrumentation.ts"() {
      +    "use strict";
      +    import_events3 = require("events");
      +    init_crypto();
      +    init_debugLogger();
      +    SdkObject = class extends import_events3.EventEmitter {
      +      constructor(parent, guidPrefix, guid) {
      +        super();
      +        this.guid = guid || `${guidPrefix || ""}@${createGuid()}`;
      +        this.setMaxListeners(0);
      +        this.attribution = { ...parent.attribution };
      +        this.instrumentation = parent.instrumentation;
      +      }
      +      apiLog(message) {
      +        if (!this.attribution.playwright.options.isInternalPlaywright)
      +          debugLogger.log("api", message);
      +      }
      +      closeReason() {
      +        return this.attribution.worker?._closeReason || this.attribution.page?._closeReason || this.attribution.context?._closeReason || this.attribution.browser?._closeReason;
      +      }
      +    };
      +  }
      +});
      +
      +// packages/playwright-core/src/server/debugger.ts
      +function matchesLocation(metadata, location2) {
      +  return !!metadata.location?.file.includes(location2.file) && (location2.line === void 0 || metadata.location.line === location2.line) && (location2.column === void 0 || metadata.location.column === location2.column);
      +}
      +var symbol, Debugger;
      +var init_debugger = __esm({
      +  "packages/playwright-core/src/server/debugger.ts"() {
      +    "use strict";
      +    init_protocolMetainfo();
      +    init_time();
      +    init_instrumentation();
      +    init_browserContext();
      +    symbol = Symbol("Debugger");
      +    Debugger = class _Debugger extends SdkObject {
      +      constructor(context2) {
      +        super(context2, "debugger");
      +        this._pauseAt = {};
      +        this._enabled = false;
      +        this._pauseBeforeWaitingActions = false;
      +        this._muted = false;
      +        this._context = context2;
      +        this._context[symbol] = this;
      +        context2.instrumentation.addListener(this, context2, { order: "last" });
      +        this._context.once(BrowserContext.Events.Close, () => {
      +          this._context.instrumentation.removeListener(this);
      +        });
      +      }
      +      static {
      +        this.Events = {
      +          PausedStateChanged: "pausedstatechanged"
      +        };
      +      }
      +      requestPause(progress2) {
      +        if (this.isPaused())
      +          throw new Error("Debugger is already paused");
      +        this.setPauseBeforeWaitingActions();
      +        this.setPauseAt({ next: true });
      +      }
      +      doResume(progress2) {
      +        if (!this.isPaused())
      +          throw new Error("Debugger is not paused");
      +        this.resume();
      +      }
      +      next(progress2) {
      +        if (!this.isPaused())
      +          throw new Error("Debugger is not paused");
      +        this.setPauseBeforeWaitingActions();
      +        this.setPauseAt({ next: true });
      +        this.resume();
      +      }
      +      runTo(progress2, location2) {
      +        if (!this.isPaused())
      +          throw new Error("Debugger is not paused");
      +        this.setPauseBeforeWaitingActions();
      +        this.setPauseAt({ location: location2 });
      +        this.resume();
      +      }
      +      async setMuted(muted) {
      +        this._muted = muted;
      +      }
      +      async onBeforeCall(sdkObject, metadata) {
      +        if (this._muted || metadata.internal)
      +          return;
      +        const metainfo = getMetainfo(metadata);
      +        const pauseOnPauseCall = this._enabled && metadata.type === "BrowserContext" && metadata.method === "pause";
      +        const pauseBeforeAction = !!this._pauseAt.next && !!metainfo?.pause && (this._pauseBeforeWaitingActions || !metainfo?.isAutoWaiting);
      +        const pauseOnLocation = !!this._pauseAt.location && matchesLocation(metadata, this._pauseAt.location);
      +        if (pauseOnPauseCall || pauseBeforeAction || pauseOnLocation)
      +          await this._pause(sdkObject, metadata);
      +      }
      +      async onBeforeInputAction(sdkObject, metadata) {
      +        if (this._muted || metadata.internal)
      +          return;
      +        const metainfo = getMetainfo(metadata);
      +        const pauseBeforeInput = !!this._pauseAt.next && !!metainfo?.pause && !!metainfo?.isAutoWaiting && !this._pauseBeforeWaitingActions;
      +        if (pauseBeforeInput)
      +          await this._pause(sdkObject, metadata);
      +      }
      +      async _pause(sdkObject, metadata) {
      +        if (this._muted || metadata.internal)
      +          return;
      +        if (this._pausedCall)
      +          return;
      +        this._pauseAt = {};
      +        metadata.pauseStartTime = monotonicTime();
      +        const result2 = new Promise((resolve) => {
      +          this._pausedCall = { metadata, sdkObject, resolve };
      +        });
      +        this.emit(_Debugger.Events.PausedStateChanged);
      +        return result2;
      +      }
      +      resume() {
      +        if (!this._pausedCall)
      +          return;
      +        this._pausedCall.metadata.pauseEndTime = monotonicTime();
      +        this._pausedCall.resolve();
      +        this._pausedCall = void 0;
      +        this.emit(_Debugger.Events.PausedStateChanged);
      +      }
      +      setPauseBeforeWaitingActions() {
      +        this._pauseBeforeWaitingActions = true;
      +      }
      +      setPauseAt(at = {}) {
      +        this._enabled = true;
      +        this._pauseAt = at;
      +      }
      +      isPaused(metadata) {
      +        if (metadata)
      +          return this._pausedCall?.metadata === metadata;
      +        return !!this._pausedCall;
      +      }
      +      pausedDetails() {
      +        return this._pausedCall;
      +      }
      +    };
      +  }
      +});
      +
      +// packages/playwright-core/src/server/dialog.ts
      +var Dialog, DialogManager;
      +var init_dialog = __esm({
      +  "packages/playwright-core/src/server/dialog.ts"() {
      +    "use strict";
      +    init_assert();
      +    init_instrumentation();
      +    Dialog = class extends SdkObject {
      +      constructor(page, type3, message, onHandle, defaultValue) {
      +        super(page, "dialog");
      +        this._handled = false;
      +        this._page = page;
      +        this._type = type3;
      +        this._message = message;
      +        this._onHandle = onHandle;
      +        this._defaultValue = defaultValue || "";
      +      }
      +      async accept(progress2, promptText) {
      +        await progress2.race(this._accept(promptText));
      +      }
      +      async dismiss(progress2) {
      +        await progress2.race(this._dismiss());
      +      }
      +      page() {
      +        return this._page;
      +      }
      +      type() {
      +        return this._type;
      +      }
      +      message() {
      +        return this._message;
      +      }
      +      defaultValue() {
      +        return this._defaultValue;
      +      }
      +      async _accept(promptText) {
      +        assert(!this._handled, "Cannot accept dialog which is already handled!");
      +        this._handled = true;
      +        this._page.browserContext.dialogManager._dialogWillClose(this);
      +        await this._onHandle(true, promptText);
      +      }
      +      async _dismiss() {
      +        assert(!this._handled, "Cannot dismiss dialog which is already handled!");
      +        this._handled = true;
      +        this._page.browserContext.dialogManager._dialogWillClose(this);
      +        await this._onHandle(false);
      +      }
      +      async _close() {
      +        if (this._type === "beforeunload")
      +          await this._accept();
      +        else
      +          await this._dismiss();
      +      }
      +    };
      +    DialogManager = class {
      +      constructor(instrumentation) {
      +        this._dialogHandlers = /* @__PURE__ */ new Set();
      +        this._openedDialogs = /* @__PURE__ */ new Set();
      +        this._instrumentation = instrumentation;
      +      }
      +      dialogDidOpen(dialog) {
      +        for (const frame of dialog.page().frameManager.frames())
      +          frame.invalidateNonStallingEvaluations("JavaScript dialog interrupted evaluation");
      +        this._openedDialogs.add(dialog);
      +        this._instrumentation.onDialog(dialog);
      +        let hasHandlers = false;
      +        for (const handler of this._dialogHandlers) {
      +          if (handler(dialog))
      +            hasHandlers = true;
      +        }
      +        if (!hasHandlers)
      +          dialog._close().then(() => {
      +          });
      +      }
      +      _dialogWillClose(dialog) {
      +        this._openedDialogs.delete(dialog);
      +      }
      +      addDialogHandler(handler) {
      +        this._dialogHandlers.add(handler);
      +      }
      +      removeDialogHandler(handler) {
      +        this._dialogHandlers.delete(handler);
      +        if (!this._dialogHandlers.size) {
      +          for (const dialog of this._openedDialogs)
      +            dialog._close().catch(() => {
      +            });
      +        }
      +      }
      +      hasOpenDialogsForPage(page) {
      +        return [...this._openedDialogs].some((dialog) => dialog.page() === page);
      +      }
      +      async closeBeforeUnloadDialogs() {
      +        await Promise.all([...this._openedDialogs].map(async (dialog) => {
      +          if (dialog.type() === "beforeunload")
      +            await dialog._dismiss();
      +        }));
      +      }
      +    };
      +  }
      +});
      +
      +// packages/playwright-core/src/server/network.ts
      +function filterCookies(cookies, urls) {
      +  const parsedURLs = urls.map((s) => new URL(s));
      +  return cookies.filter((c) => {
      +    if (!parsedURLs.length)
      +      return true;
      +    for (const parsedURL of parsedURLs) {
      +      let domain = c.domain;
      +      if (!domain.startsWith("."))
      +        domain = "." + domain;
      +      if (!("." + parsedURL.hostname).endsWith(domain))
      +        continue;
      +      if (!parsedURL.pathname.startsWith(c.path))
      +        continue;
      +      if (parsedURL.protocol !== "https:" && !isLocalHostname(parsedURL.hostname) && c.secure)
      +        continue;
      +      return true;
      +    }
      +    return false;
      +  });
      +}
      +function isLocalHostname(hostname) {
      +  return hostname === "localhost" || hostname.endsWith(".localhost");
      +}
      +function isForbiddenHeader(name, value2) {
      +  const lowerName = name.toLowerCase();
      +  if (FORBIDDEN_HEADER_NAMES.has(lowerName))
      +    return true;
      +  if (lowerName.startsWith("proxy-"))
      +    return true;
      +  if (lowerName.startsWith("sec-"))
      +    return true;
      +  if (lowerName === "x-http-method" || lowerName === "x-http-method-override" || lowerName === "x-method-override") {
      +    if (value2 && FORBIDDEN_METHODS.has(value2.toUpperCase()))
      +      return true;
      +  }
      +  return false;
      +}
      +function applyHeadersOverrides(original, overrides) {
      +  const forbiddenHeaders = original.filter((header) => isForbiddenHeader(header.name, header.value));
      +  const allowedHeaders = overrides.filter((header) => !isForbiddenHeader(header.name, header.value));
      +  return mergeHeaders([allowedHeaders, forbiddenHeaders]);
      +}
      +function rewriteCookies(cookies) {
      +  return cookies.map((c) => {
      +    assert(c.url || c.domain && c.path, "Cookie should have a url or a domain/path pair");
      +    assert(!(c.url && c.domain), "Cookie should have either url or domain");
      +    assert(!(c.url && c.path), "Cookie should have either url or path");
      +    assert(!(c.expires && c.expires < 0 && c.expires !== -1), "Cookie should have a valid expires, only -1 or a positive number for the unix timestamp in seconds is allowed");
      +    assert(!(c.expires && c.expires > 0 && c.expires > kMaxCookieExpiresDateInSeconds), "Cookie should have a valid expires, only -1 or a positive number for the unix timestamp in seconds is allowed");
      +    const copy = { ...c };
      +    if (copy.url) {
      +      assert(copy.url !== "about:blank", `Blank page can not have cookie "${c.name}"`);
      +      assert(!copy.url.startsWith("data:"), `Data URL page can not have cookie "${c.name}"`);
      +      const url2 = new URL(copy.url);
      +      copy.domain = url2.hostname;
      +      copy.path = url2.pathname.substring(0, url2.pathname.lastIndexOf("/") + 1);
      +      copy.secure = url2.protocol === "https:";
      +    }
      +    return copy;
      +  });
      +}
      +function parseURL2(url2) {
      +  try {
      +    return new URL(url2);
      +  } catch (e) {
      +    return null;
      +  }
      +}
      +function stripFragmentFromUrl(url2) {
      +  if (!url2.includes("#"))
      +    return url2;
      +  return url2.substring(0, url2.indexOf("#"));
      +}
      +function statusText(status) {
      +  return STATUS_TEXTS[String(status)] || "Unknown";
      +}
      +function singleHeader(name, value2) {
      +  return [{ name, value: value2 }];
      +}
      +function mergeHeaders(headers) {
      +  const lowerCaseToValue = /* @__PURE__ */ new Map();
      +  const lowerCaseToOriginalCase = /* @__PURE__ */ new Map();
      +  for (const h of headers) {
      +    if (!h)
      +      continue;
      +    for (const { name, value: value2 } of h) {
      +      const lower = name.toLowerCase();
      +      lowerCaseToOriginalCase.set(lower, name);
      +      lowerCaseToValue.set(lower, value2);
      +    }
      +  }
      +  const result2 = [];
      +  for (const [lower, value2] of lowerCaseToValue)
      +    result2.push({ name: lowerCaseToOriginalCase.get(lower), value: value2 });
      +  return result2;
      +}
      +function headersSize(headers) {
      +  let result2 = 0;
      +  for (const header of headers)
      +    result2 += header.name.length + header.value.length + 4;
      +  return result2;
      +}
      +function requestHeadersSize(headers, url2, method) {
      +  let result2 = 4;
      +  result2 += method.length;
      +  result2 += new URL(url2).pathname.length;
      +  result2 += 8;
      +  result2 += headersSize(headers);
      +  return result2;
      +}
      +function responseHeadersSize(headers, statusText2) {
      +  let result2 = 4;
      +  result2 += 8;
      +  result2 += 3;
      +  result2 += statusText2.length;
      +  result2 += headersSize(headers);
      +  result2 += 2;
      +  return result2;
      +}
      +var FORBIDDEN_HEADER_NAMES, FORBIDDEN_METHODS, kMaxCookieExpiresDateInSeconds, Request, Route, Response2, WebSocket, STATUS_TEXTS;
      +var init_network2 = __esm({
      +  "packages/playwright-core/src/server/network.ts"() {
      +    "use strict";
      +    init_manualPromise();
      +    init_assert();
      +    init_browserContext();
      +    init_fetch();
      +    init_instrumentation();
      +    FORBIDDEN_HEADER_NAMES = /* @__PURE__ */ new Set([
      +      "accept-charset",
      +      "accept-encoding",
      +      "access-control-request-headers",
      +      "access-control-request-method",
      +      "connection",
      +      "content-length",
      +      "cookie",
      +      "date",
      +      "dnt",
      +      "expect",
      +      "host",
      +      "keep-alive",
      +      "origin",
      +      "referer",
      +      "set-cookie",
      +      "te",
      +      "trailer",
      +      "transfer-encoding",
      +      "upgrade",
      +      "via"
      +    ]);
      +    FORBIDDEN_METHODS = /* @__PURE__ */ new Set(["CONNECT", "TRACE", "TRACK"]);
      +    kMaxCookieExpiresDateInSeconds = 253402300799;
      +    Request = class _Request extends SdkObject {
      +      constructor(context2, frame, serviceWorker, redirectedFrom, documentId, url2, resourceType, method, postData, headers, wallTimeMs) {
      +        super(frame || context2, "request");
      +        this._response = null;
      +        this._redirectedTo = null;
      +        this._failureText = null;
      +        this._frame = null;
      +        this._serviceWorker = null;
      +        this._rawRequestHeadersPromise = new ManualPromise();
      +        this._waitForResponsePromise = new ManualPromise();
      +        this._responseEndTiming = -1;
      +        assert(!url2.startsWith("data:"), "Data urls should not fire requests");
      +        this._context = context2;
      +        this._frame = frame;
      +        this._serviceWorker = serviceWorker;
      +        this._redirectedFrom = redirectedFrom;
      +        if (redirectedFrom)
      +          redirectedFrom._redirectedTo = this;
      +        this._documentId = documentId;
      +        this._url = stripFragmentFromUrl(url2);
      +        this._resourceType = resourceType;
      +        this._method = method;
      +        this._postData = postData;
      +        this._headers = headers;
      +        this._wallTimeMs = wallTimeMs;
      +        this._isFavicon = url2.endsWith("/favicon.ico") || !!redirectedFrom?._isFavicon;
      +      }
      +      static {
      +        this.Events = {
      +          Response: "response"
      +        };
      +      }
      +      wallTimeMs() {
      +        return this._wallTimeMs;
      +      }
      +      async raceWithPageClosure(progress2, promise) {
      +        const scope = this._serviceWorker?.openScope ?? this._frame?._page.openScope;
      +        if (scope)
      +          return await progress2.race(scope.race(promise));
      +        return await progress2.race(promise);
      +      }
      +      async rawRequestHeaders(progress2) {
      +        return await this.raceWithPageClosure(progress2, this.internalRawRequestHeaders());
      +      }
      +      async response(progress2) {
      +        return await this.raceWithPageClosure(progress2, this._waitForResponse());
      +      }
      +      _setFailureText(failureText) {
      +        this._failureText = failureText;
      +        this._waitForResponsePromise.resolve(null);
      +      }
      +      _applyOverrides(overrides) {
      +        this._overrides = { ...this._overrides, ...overrides };
      +        return this._overrides;
      +      }
      +      overrides() {
      +        return this._overrides;
      +      }
      +      url() {
      +        return this._overrides?.url || this._url;
      +      }
      +      resourceType() {
      +        return this._resourceType;
      +      }
      +      method() {
      +        return this._overrides?.method || this._method;
      +      }
      +      postDataBuffer() {
      +        return this._overrides?.postData || this._postData;
      +      }
      +      headers() {
      +        return this._overrides?.headers || this._headers;
      +      }
      +      headerValue(name) {
      +        const lowerCaseName = name.toLowerCase();
      +        return this.headers().find((h) => h.name.toLowerCase() === lowerCaseName)?.value;
      +      }
      +      // "null" means no raw headers available - we'll use provisional headers as raw headers.
      +      setRawRequestHeaders(headers) {
      +        if (!this._rawRequestHeadersPromise.isDone())
      +          this._rawRequestHeadersPromise.resolve(headers || this._headers);
      +      }
      +      async internalRawRequestHeaders() {
      +        return this._overrides?.headers || this._rawRequestHeadersPromise;
      +      }
      +      _waitForResponse() {
      +        return this._waitForResponsePromise;
      +      }
      +      _existingResponse() {
      +        return this._response;
      +      }
      +      _setResponse(response2) {
      +        this._response = response2;
      +        this._waitForResponsePromise.resolve(response2);
      +        this.emit(_Request.Events.Response, response2);
      +      }
      +      _finalRequest() {
      +        return this._redirectedTo ? this._redirectedTo._finalRequest() : this;
      +      }
      +      frame() {
      +        return this._frame;
      +      }
      +      serviceWorker() {
      +        return this._serviceWorker;
      +      }
      +      isNavigationRequest() {
      +        return !!this._documentId;
      +      }
      +      redirectedFrom() {
      +        return this._redirectedFrom;
      +      }
      +      failure() {
      +        if (this._failureText === null)
      +          return null;
      +        return {
      +          errorText: this._failureText
      +        };
      +      }
      +      // TODO(bidi): remove once post body is available.
      +      _setBodySize(size) {
      +        this._bodySize = size;
      +      }
      +      bodySize() {
      +        return this._bodySize || this.postDataBuffer()?.length || 0;
      +      }
      +      async _requestHeadersSize() {
      +        return requestHeadersSize(await this.internalRawRequestHeaders(), this.url(), this.method());
      +      }
      +    };
      +    Route = class extends SdkObject {
      +      constructor(request2, delegate) {
      +        super(request2._frame || request2._context, "route");
      +        this._handled = false;
      +        this._futureHandlers = [];
      +        this._request = request2;
      +        this._delegate = delegate;
      +        this._request._context.addRouteInFlight(this);
      +      }
      +      handle(handlers) {
      +        this._futureHandlers = [...handlers];
      +        this.continue({ isFallback: true }).catch(() => {
      +        });
      +      }
      +      async removeHandler(handler) {
      +        this._futureHandlers = this._futureHandlers.filter((h) => h !== handler);
      +        if (handler === this._currentHandler) {
      +          await this.continue({ isFallback: true }).catch(() => {
      +          });
      +          return;
      +        }
      +      }
      +      request() {
      +        return this._request;
      +      }
      +      async abort(errorCode = "failed") {
      +        this._startHandling();
      +        this._request._context.emit(BrowserContext.Events.RequestAborted, this._request);
      +        await this._delegate.abort(errorCode);
      +        this._endHandling();
      +      }
      +      redirectNavigationRequest(url2) {
      +        this._startHandling();
      +        assert(this._request.isNavigationRequest());
      +        this._request.frame().redirectNavigation(url2, this._request._documentId, this._request.headerValue("referer"));
      +        this._endHandling();
      +      }
      +      async fulfill(overrides) {
      +        this._startHandling();
      +        let body = overrides.body;
      +        let isBase64 = overrides.isBase64 || false;
      +        if (body === void 0) {
      +          if (overrides.fetchResponseUid) {
      +            const buffer = this._request._context.fetchRequest.fetchResponses.get(overrides.fetchResponseUid) || APIRequestContext.findResponseBody(overrides.fetchResponseUid);
      +            assert(buffer, "Fetch response has been disposed");
      +            body = buffer.toString("base64");
      +            isBase64 = true;
      +          } else {
      +            body = "";
      +            isBase64 = false;
      +          }
      +        } else if (!overrides.status || overrides.status < 200 || overrides.status >= 400) {
      +          this._request._responseBodyOverride = { body, isBase64 };
      +        }
      +        const headers = [...overrides.headers || []];
      +        this._maybeAddCorsHeaders(headers);
      +        this._request._context.emit(BrowserContext.Events.RequestFulfilled, this._request);
      +        await this._delegate.fulfill({
      +          status: overrides.status || 200,
      +          headers,
      +          body,
      +          isBase64
      +        });
      +        this._endHandling();
      +      }
      +      // See https://github.com/microsoft/playwright/issues/12929
      +      _maybeAddCorsHeaders(headers) {
      +        const origin = this._request.headerValue("origin");
      +        if (!origin)
      +          return;
      +        const requestUrl = new URL(this._request.url());
      +        if (!requestUrl.protocol.startsWith("http"))
      +          return;
      +        if (requestUrl.origin === origin.trim())
      +          return;
      +        const corsHeader = headers.find(({ name }) => name === "access-control-allow-origin");
      +        if (corsHeader)
      +          return;
      +        headers.push({ name: "access-control-allow-origin", value: origin });
      +        headers.push({ name: "access-control-allow-credentials", value: "true" });
      +        headers.push({ name: "vary", value: "Origin" });
      +      }
      +      async continue(overrides) {
      +        if (overrides.url) {
      +          const newUrl = new URL(overrides.url);
      +          const oldUrl = new URL(this._request.url());
      +          if (oldUrl.protocol !== newUrl.protocol)
      +            throw new Error("New URL must have same protocol as overridden URL");
      +        }
      +        if (overrides.headers) {
      +          overrides.headers = applyHeadersOverrides(this._request._headers, overrides.headers);
      +        }
      +        overrides = this._request._applyOverrides(overrides);
      +        const nextHandler = this._futureHandlers.shift();
      +        if (nextHandler) {
      +          this._currentHandler = nextHandler;
      +          nextHandler(this, this._request);
      +          return;
      +        }
      +        if (!overrides.isFallback)
      +          this._request._context.emit(BrowserContext.Events.RequestContinued, this._request);
      +        this._startHandling();
      +        await this._delegate.continue(overrides);
      +        this._endHandling();
      +      }
      +      _startHandling() {
      +        assert(!this._handled, "Route is already handled!");
      +        this._handled = true;
      +        this._currentHandler = void 0;
      +      }
      +      _endHandling() {
      +        this._futureHandlers = [];
      +        this._currentHandler = void 0;
      +        this._request._context.removeRouteInFlight(this);
      +      }
      +    };
      +    Response2 = class extends SdkObject {
      +      constructor(request2, status, statusText2, headers, timing, getResponseBodyCallback, fromServiceWorker) {
      +        super(request2.frame() || request2._context, "response");
      +        this._contentPromise = null;
      +        this._finishedPromise = new ManualPromise();
      +        this._headersMap = /* @__PURE__ */ new Map();
      +        this._serverAddrPromise = new ManualPromise();
      +        this._securityDetailsPromise = new ManualPromise();
      +        this._rawResponseHeadersPromise = new ManualPromise();
      +        this._httpVersionPromise = new ManualPromise();
      +        this._encodedBodySizePromise = new ManualPromise();
      +        this._transferSizePromise = new ManualPromise();
      +        this._responseHeadersSizePromise = new ManualPromise();
      +        this._request = request2;
      +        this._timing = timing;
      +        this._status = status;
      +        this._statusText = statusText2;
      +        this._url = request2.url();
      +        this._headers = headers;
      +        for (const { name, value: value2 } of this._headers)
      +          this._headersMap.set(name.toLowerCase(), value2);
      +        this._getResponseBodyCallback = getResponseBodyCallback;
      +        this._request._setResponse(this);
      +        this._fromServiceWorker = fromServiceWorker;
      +      }
      +      async body(progress2) {
      +        return await this._request.raceWithPageClosure(progress2, this.internalBody());
      +      }
      +      async securityDetails(progress2) {
      +        return await this._request.raceWithPageClosure(progress2, this.internalSecurityDetails());
      +      }
      +      async serverAddr(progress2) {
      +        return await this._request.raceWithPageClosure(progress2, this.internalServerAddr());
      +      }
      +      async rawResponseHeaders(progress2) {
      +        return await this._request.raceWithPageClosure(progress2, this.internalRawResponseHeaders());
      +      }
      +      async httpVersion(progress2) {
      +        return await this._request.raceWithPageClosure(progress2, this.internalHttpVersion());
      +      }
      +      async sizes(progress2) {
      +        return await this._request.raceWithPageClosure(progress2, this.internalSizes());
      +      }
      +      _serverAddrFinished(addr) {
      +        this._serverAddrPromise.resolve(addr);
      +      }
      +      _securityDetailsFinished(securityDetails) {
      +        this._securityDetailsPromise.resolve(securityDetails);
      +      }
      +      _requestFinished(responseEndTiming) {
      +        this._request._responseEndTiming = Math.max(responseEndTiming, this._timing.responseStart);
      +        if (this._timing.requestStart === -1)
      +          this._timing.requestStart = this._request._responseEndTiming;
      +        this._finishedPromise.resolve();
      +      }
      +      _setHttpVersion(httpVersion) {
      +        this._httpVersionPromise.resolve(httpVersion);
      +      }
      +      url() {
      +        return this._url;
      +      }
      +      status() {
      +        return this._status;
      +      }
      +      statusText() {
      +        return this._statusText;
      +      }
      +      headers() {
      +        return this._headers;
      +      }
      +      headerValue(name) {
      +        return this._headersMap.get(name);
      +      }
      +      // "null" means no raw headers available - we'll use provisional headers as raw headers.
      +      setRawResponseHeaders(headers) {
      +        if (!this._rawResponseHeadersPromise.isDone())
      +          this._rawResponseHeadersPromise.resolve(headers || this._headers);
      +      }
      +      setTransferSize(size) {
      +        this._transferSizePromise.resolve(size);
      +      }
      +      setEncodedBodySize(size) {
      +        this._encodedBodySizePromise.resolve(size);
      +      }
      +      setResponseHeadersSize(size) {
      +        this._responseHeadersSizePromise.resolve(size);
      +      }
      +      timing() {
      +        return this._timing;
      +      }
      +      async internalSecurityDetails() {
      +        return await this._securityDetailsPromise || null;
      +      }
      +      async internalServerAddr() {
      +        return await this._serverAddrPromise || null;
      +      }
      +      async internalRawResponseHeaders() {
      +        return await this._rawResponseHeadersPromise;
      +      }
      +      internalBody() {
      +        if (!this._contentPromise) {
      +          this._contentPromise = this._finishedPromise.then(async () => {
      +            if (this._status >= 300 && this._status <= 399)
      +              throw new Error("Response body is unavailable for redirect responses");
      +            if (this._request._responseBodyOverride) {
      +              const { body, isBase64 } = this._request._responseBodyOverride;
      +              return Buffer.from(body, isBase64 ? "base64" : "utf-8");
      +            }
      +            return this._getResponseBodyCallback();
      +          });
      +        }
      +        return this._contentPromise;
      +      }
      +      request() {
      +        return this._request;
      +      }
      +      finished() {
      +        return this._finishedPromise;
      +      }
      +      frame() {
      +        return this._request.frame();
      +      }
      +      async internalHttpVersion() {
      +        const httpVersion = await this._httpVersionPromise || null;
      +        if (!httpVersion)
      +          return "HTTP/1.1";
      +        if (httpVersion === "http/1.1")
      +          return "HTTP/1.1";
      +        if (httpVersion === "h2")
      +          return "HTTP/2.0";
      +        return httpVersion;
      +      }
      +      fromServiceWorker() {
      +        return this._fromServiceWorker;
      +      }
      +      async responseHeadersSize() {
      +        const availableSize = await this._responseHeadersSizePromise;
      +        if (availableSize !== null)
      +          return availableSize;
      +        return responseHeadersSize(await this._rawResponseHeadersPromise, this.statusText());
      +      }
      +      async internalSizes() {
      +        const requestHeadersSize2 = await this._request._requestHeadersSize();
      +        const responseHeadersSize2 = await this.responseHeadersSize();
      +        let encodedBodySize = await this._encodedBodySizePromise;
      +        if (encodedBodySize === null) {
      +          const headers = await this._rawResponseHeadersPromise;
      +          const contentLength = headers.find((h) => h.name.toLowerCase() === "content-length")?.value;
      +          encodedBodySize = contentLength ? +contentLength : 0;
      +        }
      +        let transferSize = await this._transferSizePromise;
      +        if (transferSize === null) {
      +          transferSize = responseHeadersSize2 + encodedBodySize;
      +        }
      +        return {
      +          requestBodySize: this._request.bodySize(),
      +          requestHeadersSize: requestHeadersSize2,
      +          responseBodySize: encodedBodySize,
      +          responseHeadersSize: responseHeadersSize2,
      +          transferSize
      +        };
      +      }
      +    };
      +    WebSocket = class _WebSocket extends SdkObject {
      +      constructor(parent, url2) {
      +        super(parent, "ws");
      +        this._notified = false;
      +        this._url = stripFragmentFromUrl(url2);
      +      }
      +      static {
      +        this.Events = {
      +          Close: "close",
      +          SocketError: "socketerror",
      +          FrameReceived: "framereceived",
      +          FrameSent: "framesent",
      +          Request: "request",
      +          Response: "response"
      +        };
      +      }
      +      markAsNotified() {
      +        if (this._notified)
      +          return false;
      +        this._notified = true;
      +        return true;
      +      }
      +      url() {
      +        return this._url;
      +      }
      +      wallTimeMs() {
      +        return this._wallTimeMs;
      +      }
      +      setWallTimeMs(wallTimeMs) {
      +        this._wallTimeMs = wallTimeMs;
      +      }
      +      requestSent(headers) {
      +        this.emit(_WebSocket.Events.Request, { headers });
      +      }
      +      responseReceived(status, statusText2, headers) {
      +        this.emit(_WebSocket.Events.Response, { status, statusText: statusText2, headers });
      +      }
      +      frameSent(opcode, data, wallTimeMs) {
      +        this.emit(_WebSocket.Events.FrameSent, { opcode, data, wallTimeMs });
      +      }
      +      frameReceived(opcode, data, wallTimeMs) {
      +        this.emit(_WebSocket.Events.FrameReceived, { opcode, data, wallTimeMs });
      +      }
      +      error(errorMessage) {
      +        this.emit(_WebSocket.Events.SocketError, errorMessage);
      +      }
      +      closed() {
      +        this.emit(_WebSocket.Events.Close);
      +      }
      +    };
      +    STATUS_TEXTS = {
      +      "100": "Continue",
      +      "101": "Switching Protocols",
      +      "102": "Processing",
      +      "103": "Early Hints",
      +      "200": "OK",
      +      "201": "Created",
      +      "202": "Accepted",
      +      "203": "Non-Authoritative Information",
      +      "204": "No Content",
      +      "205": "Reset Content",
      +      "206": "Partial Content",
      +      "207": "Multi-Status",
      +      "208": "Already Reported",
      +      "226": "IM Used",
      +      "300": "Multiple Choices",
      +      "301": "Moved Permanently",
      +      "302": "Found",
      +      "303": "See Other",
      +      "304": "Not Modified",
      +      "305": "Use Proxy",
      +      "306": "Switch Proxy",
      +      "307": "Temporary Redirect",
      +      "308": "Permanent Redirect",
      +      "400": "Bad Request",
      +      "401": "Unauthorized",
      +      "402": "Payment Required",
      +      "403": "Forbidden",
      +      "404": "Not Found",
      +      "405": "Method Not Allowed",
      +      "406": "Not Acceptable",
      +      "407": "Proxy Authentication Required",
      +      "408": "Request Timeout",
      +      "409": "Conflict",
      +      "410": "Gone",
      +      "411": "Length Required",
      +      "412": "Precondition Failed",
      +      "413": "Payload Too Large",
      +      "414": "URI Too Long",
      +      "415": "Unsupported Media Type",
      +      "416": "Range Not Satisfiable",
      +      "417": "Expectation Failed",
      +      "418": "I'm a teapot",
      +      "421": "Misdirected Request",
      +      "422": "Unprocessable Entity",
      +      "423": "Locked",
      +      "424": "Failed Dependency",
      +      "425": "Too Early",
      +      "426": "Upgrade Required",
      +      "428": "Precondition Required",
      +      "429": "Too Many Requests",
      +      "431": "Request Header Fields Too Large",
      +      "451": "Unavailable For Legal Reasons",
      +      "500": "Internal Server Error",
      +      "501": "Not Implemented",
      +      "502": "Bad Gateway",
      +      "503": "Service Unavailable",
      +      "504": "Gateway Timeout",
      +      "505": "HTTP Version Not Supported",
      +      "506": "Variant Also Negotiates",
      +      "507": "Insufficient Storage",
      +      "508": "Loop Detected",
      +      "510": "Not Extended",
      +      "511": "Network Authentication Required"
      +    };
      +  }
      +});
      +
      +// packages/playwright-core/src/server/cookieStore.ts
      +function parseRawCookie(header) {
      +  const pairs = header.split(";").filter((s) => s.trim().length > 0).map((p) => {
      +    let key = "";
      +    let value3 = "";
      +    const separatorPos = p.indexOf("=");
      +    if (separatorPos === -1) {
      +      key = p.trim();
      +    } else {
      +      key = p.slice(0, separatorPos).trim();
      +      value3 = p.slice(separatorPos + 1).trim();
      +    }
      +    return [key, value3];
      +  });
      +  if (!pairs.length)
      +    return null;
      +  const [name, value2] = pairs[0];
      +  const cookie = {
      +    name,
      +    value: value2
      +  };
      +  for (let i = 1; i < pairs.length; i++) {
      +    const [name2, value3] = pairs[i];
      +    switch (name2.toLowerCase()) {
      +      case "expires":
      +        const expiresMs = +new Date(value3);
      +        if (isFinite(expiresMs)) {
      +          if (expiresMs <= 0)
      +            cookie.expires = 0;
      +          else
      +            cookie.expires = Math.min(expiresMs / 1e3, kMaxCookieExpiresDateInSeconds);
      +        }
      +        break;
      +      case "max-age":
      +        const maxAgeSec = parseInt(value3, 10);
      +        if (isFinite(maxAgeSec)) {
      +          if (maxAgeSec <= 0)
      +            cookie.expires = 0;
      +          else
      +            cookie.expires = Math.min(Date.now() / 1e3 + maxAgeSec, kMaxCookieExpiresDateInSeconds);
      +        }
      +        break;
      +      case "domain":
      +        cookie.domain = value3.toLocaleLowerCase() || "";
      +        if (cookie.domain && !cookie.domain.startsWith(".") && cookie.domain.includes("."))
      +          cookie.domain = "." + cookie.domain;
      +        break;
      +      case "path":
      +        cookie.path = value3 || "";
      +        break;
      +      case "secure":
      +        cookie.secure = true;
      +        break;
      +      case "httponly":
      +        cookie.httpOnly = true;
      +        break;
      +      case "samesite":
      +        switch (value3.toLowerCase()) {
      +          case "none":
      +            cookie.sameSite = "None";
      +            break;
      +          case "lax":
      +            cookie.sameSite = "Lax";
      +            break;
      +          case "strict":
      +            cookie.sameSite = "Strict";
      +            break;
      +        }
      +        break;
      +    }
      +  }
      +  return cookie;
      +}
      +function domainMatches(value2, domain) {
      +  if (value2 === domain)
      +    return true;
      +  if (!domain.startsWith("."))
      +    return false;
      +  value2 = "." + value2;
      +  return value2.endsWith(domain);
      +}
      +function pathMatches(value2, path59) {
      +  if (value2 === path59)
      +    return true;
      +  if (!value2.endsWith("/"))
      +    value2 = value2 + "/";
      +  if (!path59.endsWith("/"))
      +    path59 = path59 + "/";
      +  return value2.startsWith(path59);
      +}
      +var Cookie, CookieStore;
      +var init_cookieStore = __esm({
      +  "packages/playwright-core/src/server/cookieStore.ts"() {
      +    "use strict";
      +    init_network2();
      +    Cookie = class {
      +      constructor(data) {
      +        this._raw = data;
      +      }
      +      _name() {
      +        return this._raw.name;
      +      }
      +      // https://datatracker.ietf.org/doc/html/rfc6265#section-5.4
      +      matches(url2) {
      +        if (this._raw.secure && (url2.protocol !== "https:" && !isLocalHostname(url2.hostname)))
      +          return false;
      +        if (!domainMatches(url2.hostname, this._raw.domain))
      +          return false;
      +        if (!pathMatches(url2.pathname, this._raw.path))
      +          return false;
      +        return true;
      +      }
      +      _equals(other) {
      +        return this._raw.name === other._raw.name && this._raw.domain === other._raw.domain && this._raw.path === other._raw.path;
      +      }
      +      _networkCookie() {
      +        return this._raw;
      +      }
      +      _updateExpiresFrom(other) {
      +        this._raw.expires = other._raw.expires;
      +      }
      +      _expired() {
      +        if (this._raw.expires === -1)
      +          return false;
      +        return this._raw.expires * 1e3 < Date.now();
      +      }
      +    };
      +    CookieStore = class _CookieStore {
      +      constructor() {
      +        this._nameToCookies = /* @__PURE__ */ new Map();
      +      }
      +      addCookies(cookies) {
      +        for (const cookie of cookies)
      +          this._addCookie(new Cookie(cookie));
      +      }
      +      cookies(url2) {
      +        const result2 = [];
      +        for (const cookie of this._cookiesIterator()) {
      +          if (cookie.matches(url2))
      +            result2.push(cookie._networkCookie());
      +        }
      +        return result2;
      +      }
      +      allCookies() {
      +        const result2 = [];
      +        for (const cookie of this._cookiesIterator())
      +          result2.push(cookie._networkCookie());
      +        return result2;
      +      }
      +      _addCookie(cookie) {
      +        let set = this._nameToCookies.get(cookie._name());
      +        if (!set) {
      +          set = /* @__PURE__ */ new Set();
      +          this._nameToCookies.set(cookie._name(), set);
      +        }
      +        for (const other of set) {
      +          if (other._equals(cookie))
      +            set.delete(other);
      +        }
      +        set.add(cookie);
      +        _CookieStore.pruneExpired(set);
      +      }
      +      *_cookiesIterator() {
      +        for (const [name, cookies] of this._nameToCookies) {
      +          _CookieStore.pruneExpired(cookies);
      +          for (const cookie of cookies)
      +            yield cookie;
      +          if (cookies.size === 0)
      +            this._nameToCookies.delete(name);
      +        }
      +      }
      +      static pruneExpired(cookies) {
      +        for (const cookie of cookies) {
      +          if (cookie._expired())
      +            cookies.delete(cookie);
      +        }
      +      }
      +    };
      +  }
      +});
      +
      +// packages/playwright-core/src/server/formData.ts
      +function generateUniqueBoundaryString() {
      +  const charCodes = [];
      +  for (let i = 0; i < 16; i++)
      +    charCodes.push(alphaNumericEncodingMap[Math.floor(Math.random() * alphaNumericEncodingMap.length)]);
      +  return "----WebKitFormBoundary" + String.fromCharCode(...charCodes);
      +}
      +var mime2, MultipartFormData, alphaNumericEncodingMap;
      +var init_formData = __esm({
      +  "packages/playwright-core/src/server/formData.ts"() {
      +    "use strict";
      +    mime2 = require("./utilsBundle").mime;
      +    MultipartFormData = class {
      +      constructor() {
      +        this._chunks = [];
      +        this._boundary = generateUniqueBoundaryString();
      +      }
      +      contentTypeHeader() {
      +        return `multipart/form-data; boundary=${this._boundary}`;
      +      }
      +      addField(name, value2) {
      +        this._beginMultiPartHeader(name);
      +        this._finishMultiPartHeader();
      +        this._chunks.push(Buffer.from(value2));
      +        this._finishMultiPartField();
      +      }
      +      addFileField(name, value2) {
      +        this._beginMultiPartHeader(name);
      +        this._chunks.push(Buffer.from(`; filename="${value2.name}"`));
      +        this._chunks.push(Buffer.from(`\r
      +content-type: ${value2.mimeType || mime2.getType(value2.name) || "application/octet-stream"}`));
      +        this._finishMultiPartHeader();
      +        this._chunks.push(value2.buffer);
      +        this._finishMultiPartField();
      +      }
      +      finish() {
      +        this._addBoundary(true);
      +        return Buffer.concat(this._chunks);
      +      }
      +      _beginMultiPartHeader(name) {
      +        this._addBoundary();
      +        this._chunks.push(Buffer.from(`content-disposition: form-data; name="${name}"`));
      +      }
      +      _finishMultiPartHeader() {
      +        this._chunks.push(Buffer.from(`\r
      +\r
      +`));
      +      }
      +      _finishMultiPartField() {
      +        this._chunks.push(Buffer.from(`\r
      +`));
      +      }
      +      _addBoundary(isLastBoundary) {
      +        this._chunks.push(Buffer.from("--" + this._boundary));
      +        if (isLastBoundary)
      +          this._chunks.push(Buffer.from("--"));
      +        this._chunks.push(Buffer.from("\r\n"));
      +      }
      +    };
      +    alphaNumericEncodingMap = [
      +      65,
      +      66,
      +      67,
      +      68,
      +      69,
      +      70,
      +      71,
      +      72,
      +      73,
      +      74,
      +      75,
      +      76,
      +      77,
      +      78,
      +      79,
      +      80,
      +      81,
      +      82,
      +      83,
      +      84,
      +      85,
      +      86,
      +      87,
      +      88,
      +      89,
      +      90,
      +      97,
      +      98,
      +      99,
      +      100,
      +      101,
      +      102,
      +      103,
      +      104,
      +      105,
      +      106,
      +      107,
      +      108,
      +      109,
      +      110,
      +      111,
      +      112,
      +      113,
      +      114,
      +      115,
      +      116,
      +      117,
      +      118,
      +      119,
      +      120,
      +      121,
      +      122,
      +      48,
      +      49,
      +      50,
      +      51,
      +      52,
      +      53,
      +      54,
      +      55,
      +      56,
      +      57,
      +      65,
      +      66
      +    ];
      +  }
      +});
      +
      +// packages/playwright-core/src/server/socksClientCertificatesInterceptor.ts
      +function loadDummyServerCertsIfNeeded() {
      +  if (dummyServerTlsOptions)
      +    return;
      +  const { cert, key } = generateSelfSignedCertificate();
      +  dummyServerTlsOptions = { key, cert };
      +}
      +function normalizeOrigin(origin) {
      +  try {
      +    return new URL(origin).origin;
      +  } catch (error) {
      +    return origin;
      +  }
      +}
      +function convertClientCertificatesToTLSOptions(clientCertificates) {
      +  if (!clientCertificates || !clientCertificates.length)
      +    return;
      +  const tlsOptions = {
      +    pfx: [],
      +    key: [],
      +    cert: []
      +  };
      +  for (const cert of clientCertificates) {
      +    if (cert.cert)
      +      tlsOptions.cert.push(cert.cert);
      +    if (cert.key)
      +      tlsOptions.key.push({ pem: cert.key, passphrase: cert.passphrase });
      +    if (cert.pfx)
      +      tlsOptions.pfx.push({ buf: cert.pfx, passphrase: cert.passphrase });
      +  }
      +  return tlsOptions;
      +}
      +function getMatchingTLSOptionsForOrigin(clientCertificates, origin) {
      +  const matchingCerts = clientCertificates?.filter(
      +    (c) => normalizeOrigin(c.origin) === origin
      +  );
      +  return convertClientCertificatesToTLSOptions(matchingCerts);
      +}
      +function rewriteToLocalhostIfNeeded(host) {
      +  return host === "local.playwright" ? "localhost" : host;
      +}
      +function rewriteOpenSSLErrorIfNeeded(error) {
      +  if (error.message !== "unsupported" && error.code !== "ERR_CRYPTO_UNSUPPORTED_OPERATION")
      +    return error;
      +  return rewriteErrorMessage(error, [
      +    "Unsupported TLS certificate.",
      +    "Most likely, the security algorithm of the given certificate was deprecated by OpenSSL.",
      +    "For more details, see https://github.com/openssl/openssl/blob/master/README-PROVIDERS.md#the-legacy-provider",
      +    "You could probably modernize the certificate by following the steps at https://github.com/nodejs/node/issues/40672#issuecomment-1243648223"
      +  ].join("\n"));
      +}
      +function parseALPNFromClientHello(buffer) {
      +  if (buffer.length < 6)
      +    return null;
      +  if (buffer[0] !== 22)
      +    return null;
      +  let offset = 5;
      +  if (buffer[offset] !== 1)
      +    return null;
      +  offset += 4;
      +  offset += 2;
      +  offset += 32;
      +  if (offset >= buffer.length)
      +    return null;
      +  const sessionIdLength = buffer[offset];
      +  offset += 1 + sessionIdLength;
      +  if (offset + 2 > buffer.length)
      +    return null;
      +  const cipherSuitesLength = buffer.readUInt16BE(offset);
      +  offset += 2 + cipherSuitesLength;
      +  if (offset >= buffer.length)
      +    return null;
      +  const compressionMethodsLength = buffer[offset];
      +  offset += 1 + compressionMethodsLength;
      +  if (offset + 2 > buffer.length)
      +    return null;
      +  const extensionsLength = buffer.readUInt16BE(offset);
      +  offset += 2;
      +  const extensionsEnd = offset + extensionsLength;
      +  if (extensionsEnd > buffer.length)
      +    return null;
      +  while (offset + 4 <= extensionsEnd) {
      +    const extensionType = buffer.readUInt16BE(offset);
      +    offset += 2;
      +    const extensionLength = buffer.readUInt16BE(offset);
      +    offset += 2;
      +    if (offset + extensionLength > extensionsEnd)
      +      return null;
      +    if (extensionType === 16)
      +      return parseALPNExtension(buffer.subarray(offset, offset + extensionLength));
      +    offset += extensionLength;
      +  }
      +  return null;
      +}
      +function parseALPNExtension(buffer) {
      +  if (buffer.length < 2)
      +    return null;
      +  const listLength = buffer.readUInt16BE(0);
      +  if (listLength !== buffer.length - 2)
      +    return null;
      +  const protocols = [];
      +  let offset = 2;
      +  while (offset < buffer.length) {
      +    const protocolLength = buffer[offset];
      +    offset += 1;
      +    if (offset + protocolLength > buffer.length)
      +      break;
      +    const protocol = buffer.subarray(offset, offset + protocolLength).toString("utf8");
      +    protocols.push(protocol);
      +    offset += protocolLength;
      +  }
      +  return protocols.length > 0 ? protocols : null;
      +}
      +var import_events4, import_http23, import_net3, import_stream3, import_tls2, getProxyForUrl2, dummyServerTlsOptions, SocksProxyConnection, ClientCertificatesProxy;
      +var init_socksClientCertificatesInterceptor = __esm({
      +  "packages/playwright-core/src/server/socksClientCertificatesInterceptor.ts"() {
      +    "use strict";
      +    import_events4 = require("events");
      +    import_http23 = __toESM(require("http2"));
      +    import_net3 = __toESM(require("net"));
      +    import_stream3 = __toESM(require("stream"));
      +    import_tls2 = __toESM(require("tls"));
      +    init_socksProxy();
      +    init_debugLogger();
      +    init_happyEyeballs();
      +    init_stringUtils();
      +    init_crypto();
      +    init_stackTrace();
      +    init_network();
      +    init_browserContext();
      +    ({ getProxyForUrl: getProxyForUrl2 } = require("./utilsBundle"));
      +    dummyServerTlsOptions = void 0;
      +    SocksProxyConnection = class {
      +      constructor(socksProxy, uid, host, port) {
      +        this._firstPackageReceived = false;
      +        this._closed = false;
      +        this.socksProxy = socksProxy;
      +        this.uid = uid;
      +        this.host = host;
      +        this.port = port;
      +        this._serverCloseEventListener = () => {
      +          this._browserEncrypted.destroy();
      +        };
      +        this._browserEncrypted = new import_stream3.default.Duplex({
      +          read: () => {
      +          },
      +          write: (data, encoding, callback) => {
      +            this.socksProxy._socksProxy.sendSocketData({ uid: this.uid, data });
      +            callback();
      +          },
      +          destroy: (error, callback) => {
      +            if (error)
      +              socksProxy._socksProxy.sendSocketError({ uid: this.uid, error: error.message });
      +            else
      +              socksProxy._socksProxy.sendSocketEnd({ uid: this.uid });
      +            callback();
      +          }
      +        });
      +      }
      +      async connect() {
      +        const proxyAgent = this.socksProxy._getProxyAgent(this.host, this.port);
      +        if (proxyAgent)
      +          this._serverEncrypted = await proxyAgent.connect(new import_events4.EventEmitter(), { host: rewriteToLocalhostIfNeeded(this.host), port: this.port, secureEndpoint: false });
      +        else
      +          this._serverEncrypted = await createSocket(rewriteToLocalhostIfNeeded(this.host), this.port);
      +        this._serverEncrypted.once("close", this._serverCloseEventListener);
      +        this._serverEncrypted.once("error", (error) => this._browserEncrypted.destroy(error));
      +        if (this._closed) {
      +          this._serverEncrypted.destroy();
      +          return;
      +        }
      +        this.socksProxy._socksProxy.socketConnected({
      +          uid: this.uid,
      +          host: this._serverEncrypted.localAddress,
      +          port: this._serverEncrypted.localPort
      +        });
      +      }
      +      onClose() {
      +        this._serverEncrypted.destroy();
      +        this._browserEncrypted.destroy();
      +        this._closed = true;
      +      }
      +      onData(data) {
      +        if (!this._firstPackageReceived) {
      +          this._firstPackageReceived = true;
      +          const secureContext = data[0] === 22 ? this.socksProxy.secureContextMap.get(normalizeOrigin(`https://${this.host}:${this.port}`)) : void 0;
      +          if (secureContext)
      +            this._establishTlsTunnel(this._browserEncrypted, data, secureContext);
      +          else
      +            this._establishPlaintextTunnel(this._browserEncrypted);
      +        }
      +        this._browserEncrypted.push(data);
      +      }
      +      _establishPlaintextTunnel(browserEncrypted) {
      +        browserEncrypted.pipe(this._serverEncrypted);
      +        this._serverEncrypted.pipe(browserEncrypted);
      +      }
      +      _establishTlsTunnel(browserEncrypted, clientHello, secureContext) {
      +        const browserALPNProtocols = parseALPNFromClientHello(clientHello) || ["http/1.1"];
      +        debugLogger.log("client-certificates", `Browser->Proxy ${this.host}:${this.port} offers ALPN ${browserALPNProtocols}`);
      +        const rejectUnauthorized = !this.socksProxy.ignoreHTTPSErrors;
      +        const serverDecrypted = import_tls2.default.connect({
      +          socket: this._serverEncrypted,
      +          host: this.host,
      +          port: this.port,
      +          rejectUnauthorized,
      +          ALPNProtocols: browserALPNProtocols,
      +          servername: !import_net3.default.isIP(this.host) ? this.host : void 0,
      +          secureContext
      +        }, async () => {
      +          const browserDecrypted = await this._upgradeToTLSIfNeeded(browserEncrypted, serverDecrypted.alpnProtocol);
      +          debugLogger.log("client-certificates", `Proxy->Server ${this.host}:${this.port} chooses ALPN ${browserDecrypted.alpnProtocol}`);
      +          browserDecrypted.pipe(serverDecrypted);
      +          serverDecrypted.pipe(browserDecrypted);
      +          const cleanup = (error) => this._serverEncrypted.destroy(error);
      +          browserDecrypted.once("error", cleanup);
      +          serverDecrypted.once("error", cleanup);
      +          browserDecrypted.once("close", cleanup);
      +          serverDecrypted.once("close", cleanup);
      +          if (this._closed)
      +            serverDecrypted.destroy();
      +        });
      +        serverDecrypted.once("error", async (error) => {
      +          debugLogger.log("client-certificates", `error when connecting to server: ${error.message.replaceAll("\n", " ")}`);
      +          this._serverEncrypted.removeListener("close", this._serverCloseEventListener);
      +          this._serverEncrypted.destroy();
      +          const browserDecrypted = await this._upgradeToTLSIfNeeded(this._browserEncrypted, serverDecrypted.alpnProtocol);
      +          const responseBody = escapeHTML("Playwright client-certificate error: " + error.message).replaceAll("\n", " 
      "); + if (browserDecrypted.alpnProtocol === "h2") { + if ("performServerHandshake" in import_http23.default) { + const session2 = import_http23.default.performServerHandshake(browserDecrypted); + session2.on("error", (error2) => { + this._browserEncrypted.destroy(error2); + }); + session2.once("stream", (stream3) => { + const cleanup = (error2) => { + session2.close(); + this._browserEncrypted.destroy(error2); + }; + stream3.once("end", cleanup); + stream3.once("error", cleanup); + stream3.respond({ + [import_http23.default.constants.HTTP2_HEADER_CONTENT_TYPE]: "text/html", + [import_http23.default.constants.HTTP2_HEADER_STATUS]: 503 + }); + stream3.end(responseBody); + }); + } else { + this._browserEncrypted.destroy(error); + } + } else { + browserDecrypted.end([ + "HTTP/1.1 503 Internal Server Error", + "Content-Type: text/html; charset=utf-8", + "Content-Length: " + Buffer.byteLength(responseBody), + "", + responseBody + ].join("\r\n")); + } + }); + } + async _upgradeToTLSIfNeeded(socket, alpnProtocol) { + this._brorwserDecrypted ??= new Promise((resolve, reject) => { + const dummyServer = import_tls2.default.createServer({ + ...dummyServerTlsOptions, + ALPNProtocols: [alpnProtocol || "http/1.1"] + }); + dummyServer.emit("connection", socket); + dummyServer.once("secureConnection", (tlsSocket) => { + dummyServer.close(); + resolve(tlsSocket); + }); + dummyServer.once("error", (error) => { + dummyServer.close(); + reject(error); + }); + }); + return this._brorwserDecrypted; + } + }; + ClientCertificatesProxy = class _ClientCertificatesProxy { + constructor(contextOptions) { + this._connections = /* @__PURE__ */ new Map(); + this.secureContextMap = /* @__PURE__ */ new Map(); + verifyClientCertificates(contextOptions.clientCertificates); + this.ignoreHTTPSErrors = contextOptions.ignoreHTTPSErrors; + this._proxy = contextOptions.proxy; + this._initSecureContexts(contextOptions.clientCertificates); + this._socksProxy = new SocksProxy(); + this._socksProxy.setPattern("*"); + this._socksProxy.addListener(SocksProxy.Events.SocksRequested, async (payload) => { + try { + const connection = new SocksProxyConnection(this, payload.uid, payload.host, payload.port); + await connection.connect(); + this._connections.set(payload.uid, connection); + } catch (error) { + debugLogger.log("client-certificates", `Failed to connect to ${payload.host}:${payload.port}: ${error.message}`); + this._socksProxy.socketFailed({ uid: payload.uid, errorCode: error.code }); + } + }); + this._socksProxy.addListener(SocksProxy.Events.SocksData, (payload) => { + this._connections.get(payload.uid)?.onData(payload.data); + }); + this._socksProxy.addListener(SocksProxy.Events.SocksClosed, (payload) => { + this._connections.get(payload.uid)?.onClose(); + this._connections.delete(payload.uid); + }); + loadDummyServerCertsIfNeeded(); + } + _getProxyAgent(host, port) { + const proxyFromOptions = createProxyAgent(this._proxy); + if (proxyFromOptions) + return proxyFromOptions; + const proxyFromEnv = getProxyForUrl2(`https://${host}:${port}`); + if (proxyFromEnv) + return createProxyAgent({ server: proxyFromEnv }); + } + _initSecureContexts(clientCertificates) { + const origin2certs = /* @__PURE__ */ new Map(); + for (const cert of clientCertificates || []) { + const origin = normalizeOrigin(cert.origin); + const certs = origin2certs.get(origin) || []; + certs.push(cert); + origin2certs.set(origin, certs); + } + for (const [origin, certs] of origin2certs) { + try { + this.secureContextMap.set(origin, import_tls2.default.createSecureContext(convertClientCertificatesToTLSOptions(certs))); + } catch (error) { + error = rewriteOpenSSLErrorIfNeeded(error); + throw rewriteErrorMessage(error, `Failed to load client certificate: ${error.message}`); + } + } + } + static async create(progress2, contextOptions) { + const proxy = new _ClientCertificatesProxy(contextOptions); + try { + await progress2.race(proxy._socksProxy.listen(0, "127.0.0.1")); + return proxy; + } catch (error) { + await progress2.race(proxy.close()); + throw error; + } + } + proxySettings() { + return { server: `socks5://127.0.0.1:${this._socksProxy.port()}` }; + } + async close() { + await this._socksProxy.close(); + } + }; + } +}); + +// packages/playwright-core/src/server/trace/recorder/snapshotterInjected.ts +function frameSnapshotStreamer(snapshotStreamer, removeNoScript) { + if (window[snapshotStreamer]) + return; + const kShadowAttribute = "__playwright_shadow_root_"; + const kValueAttribute = "__playwright_value_"; + const kCheckedAttribute = "__playwright_checked_"; + const kSelectedAttribute = "__playwright_selected_"; + const kScrollTopAttribute = "__playwright_scroll_top_"; + const kScrollLeftAttribute = "__playwright_scroll_left_"; + const kStyleSheetAttribute = "__playwright_style_sheet_"; + const kTargetAttribute = "__playwright_target__"; + const kCustomElementsAttribute = "__playwright_custom_elements__"; + const kCurrentSrcAttribute = "__playwright_current_src__"; + const kBoundingRectAttribute = "__playwright_bounding_rect__"; + const kPopoverOpenAttribute = "__playwright_popover_open_"; + const kDialogOpenAttribute = "__playwright_dialog_open_"; + const kSnapshotFrameId = Symbol("__playwright_snapshot_frameid_"); + const kCachedData = Symbol("__playwright_snapshot_cache_"); + const kEndOfList = Symbol("__playwright_end_of_list_"); + function resetCachedData(obj) { + delete obj[kCachedData]; + } + function ensureCachedData(obj) { + if (!obj[kCachedData]) + obj[kCachedData] = {}; + return obj[kCachedData]; + } + const kObserverConfig = { attributes: true, subtree: true }; + function removeHash2(url2) { + try { + const u = new URL(url2); + u.hash = ""; + return u.toString(); + } catch (e) { + return url2; + } + } + class Streamer { + constructor() { + this._lastSnapshotNumber = 0; + this._staleStyleSheets = /* @__PURE__ */ new Set(); + this._modifiedStyleSheets = /* @__PURE__ */ new Set(); + this._readingStyleSheet = false; + this._targetGeneration = 0; + const invalidateCSSGroupingRule = (rule) => { + if (rule.parentStyleSheet) + this._invalidateStyleSheet(rule.parentStyleSheet); + }; + this._interceptNativeMethod(window.CSSStyleSheet.prototype, "insertRule", (sheet) => this._invalidateStyleSheet(sheet)); + this._interceptNativeMethod(window.CSSStyleSheet.prototype, "deleteRule", (sheet) => this._invalidateStyleSheet(sheet)); + this._interceptNativeMethod(window.CSSStyleSheet.prototype, "addRule", (sheet) => this._invalidateStyleSheet(sheet)); + this._interceptNativeMethod(window.CSSStyleSheet.prototype, "removeRule", (sheet) => this._invalidateStyleSheet(sheet)); + this._interceptNativeGetter(window.CSSStyleSheet.prototype, "rules", (sheet) => this._invalidateStyleSheet(sheet)); + this._interceptNativeGetter(window.CSSStyleSheet.prototype, "cssRules", (sheet) => this._invalidateStyleSheet(sheet)); + this._interceptNativeMethod(window.CSSStyleSheet.prototype, "replaceSync", (sheet) => this._invalidateStyleSheet(sheet)); + this._interceptNativeMethod(window.CSSGroupingRule.prototype, "insertRule", invalidateCSSGroupingRule); + this._interceptNativeMethod(window.CSSGroupingRule.prototype, "deleteRule", invalidateCSSGroupingRule); + this._interceptNativeGetter(window.CSSGroupingRule.prototype, "cssRules", invalidateCSSGroupingRule); + this._interceptNativeSetter(window.StyleSheet.prototype, "disabled", (sheet) => { + if (sheet instanceof CSSStyleSheet) + this._invalidateStyleSheet(sheet); + }); + this._interceptNativeAsyncMethod(window.CSSStyleSheet.prototype, "replace", (sheet) => this._invalidateStyleSheet(sheet)); + this._fakeBase = document.createElement("base"); + this._observer = new MutationObserver((list) => this._handleMutations(list)); + this._ensureObservingCurrentDocument(); + } + _refreshListenersWhenNeeded() { + this._refreshListeners(); + const customEventName = "__playwright_snapshotter_global_listeners_check__"; + let seenEvent = false; + const handleCustomEvent = () => seenEvent = true; + window.addEventListener(customEventName, handleCustomEvent); + const observer = new MutationObserver((entries) => { + const newDocumentElement = entries.some((entry) => Array.from(entry.addedNodes).includes(document.documentElement)); + if (newDocumentElement) { + seenEvent = false; + window.dispatchEvent(new CustomEvent(customEventName)); + if (!seenEvent) { + window.addEventListener(customEventName, handleCustomEvent); + this._refreshListeners(); + } + } + }); + observer.observe(document, { childList: true }); + } + _refreshListeners() { + document.addEventListener("__playwright_mark_target__", (event) => { + const target = event.composedPath()[0]; + if (target?.nodeType !== Node.ELEMENT_NODE) + return; + target.__playwright_target__ = this._targetGeneration; + }); + document.addEventListener("__playwright_reset_targets__", () => { + ++this._targetGeneration; + }); + } + _interceptNativeMethod(obj, method, cb) { + const native = obj[method]; + if (!native) + return; + obj[method] = function(...args) { + const result2 = native.call(this, ...args); + cb(this, result2); + return result2; + }; + } + _interceptNativeAsyncMethod(obj, method, cb) { + const native = obj[method]; + if (!native) + return; + obj[method] = async function(...args) { + const result2 = await native.call(this, ...args); + cb(this, result2); + return result2; + }; + } + _interceptNativeGetter(obj, prop, cb) { + const descriptor = Object.getOwnPropertyDescriptor(obj, prop); + Object.defineProperty(obj, prop, { + ...descriptor, + get: function() { + const result2 = descriptor.get.call(this); + cb(this, result2); + return result2; + } + }); + } + _interceptNativeSetter(obj, prop, cb) { + const descriptor = Object.getOwnPropertyDescriptor(obj, prop); + Object.defineProperty(obj, prop, { + ...descriptor, + set: function(value2) { + const result2 = descriptor.set.call(this, value2); + cb(this, value2); + return result2; + } + }); + } + _handleMutations(list) { + for (const mutation of list) + ensureCachedData(mutation.target).attributesCached = void 0; + } + _ensureObservingCurrentDocument() { + if (this._observedDocument === document) + return; + this._observedDocument = document; + this._observer.disconnect(); + this._observer.observe(document, kObserverConfig); + this._refreshListenersWhenNeeded(); + } + _invalidateStyleSheet(sheet) { + if (this._readingStyleSheet) + return; + this._staleStyleSheets.add(sheet); + if (sheet.href !== null) + this._modifiedStyleSheets.add(sheet); + } + _updateStyleElementStyleSheetTextIfNeeded(sheet, forceText) { + const data = ensureCachedData(sheet); + if (this._staleStyleSheets.has(sheet) || forceText && data.cssText === void 0) { + this._staleStyleSheets.delete(sheet); + try { + data.cssText = this._getSheetText(sheet); + } catch (e) { + data.cssText = ""; + } + } + return data.cssText; + } + // Returns either content, ref, or no override. + _updateLinkStyleSheetTextIfNeeded(sheet, snapshotNumber) { + const data = ensureCachedData(sheet); + if (this._staleStyleSheets.has(sheet)) { + this._staleStyleSheets.delete(sheet); + try { + data.cssText = this._getSheetText(sheet); + data.cssRef = snapshotNumber; + return data.cssText; + } catch (e) { + } + } + return data.cssRef === void 0 ? void 0 : snapshotNumber - data.cssRef; + } + markIframe(iframeElement, frameId) { + iframeElement[kSnapshotFrameId] = frameId; + } + resetHistory() { + this._staleStyleSheets.clear(); + const visitNode = (node) => { + resetCachedData(node); + if (node.nodeType === Node.ELEMENT_NODE) { + const element2 = node; + if (element2.shadowRoot) + visitNode(element2.shadowRoot); + } + for (let child = node.firstChild; child; child = child.nextSibling) + visitNode(child); + }; + visitNode(document.documentElement); + visitNode(this._fakeBase); + } + __sanitizeMetaAttribute(name, value2, httpEquiv) { + if (name === "charset") + return "utf-8"; + if (httpEquiv.toLowerCase() !== "content-type" || name !== "content") + return value2; + const [type3, ...params2] = value2.split(";"); + if (type3 !== "text/html" || params2.length <= 0) + return value2; + const charsetParamIdx = params2.findIndex((param) => param.trim().startsWith("charset=")); + if (charsetParamIdx > -1) + params2[charsetParamIdx] = "charset=utf-8"; + return `${type3}; ${params2.join("; ")}`; + } + _sanitizeUrl(url2) { + if (url2.startsWith("javascript:") || url2.startsWith("vbscript:")) + return ""; + return url2; + } + _sanitizeSrcSet(srcset) { + return srcset.split(",").map((src) => { + src = src.trim(); + const spaceIndex = src.lastIndexOf(" "); + if (spaceIndex === -1) + return this._sanitizeUrl(src); + return this._sanitizeUrl(src.substring(0, spaceIndex).trim()) + src.substring(spaceIndex); + }).join(", "); + } + _resolveUrl(base, url2) { + if (url2 === "") + return ""; + try { + return new URL(url2, base).href; + } catch (e) { + return url2; + } + } + _getSheetBase(sheet) { + let rootSheet = sheet; + while (rootSheet.parentStyleSheet) + rootSheet = rootSheet.parentStyleSheet; + if (rootSheet.ownerNode) + return rootSheet.ownerNode.baseURI; + return document.baseURI; + } + _getSheetText(sheet) { + this._readingStyleSheet = true; + try { + if (sheet.disabled) + return ""; + const rules = []; + for (const rule of sheet.cssRules) + rules.push(rule.cssText); + return rules.join("\n"); + } finally { + this._readingStyleSheet = false; + } + } + captureSnapshot(reset) { + const timestamp = performance.now(); + const snapshotNumber = ++this._lastSnapshotNumber; + if (reset === "history") + this.resetHistory(); + if (reset) + ++this._targetGeneration; + let nodeCounter = 0; + let shadowDomNesting = 0; + let headNesting = 0; + this._ensureObservingCurrentDocument(); + this._handleMutations(this._observer.takeRecords()); + const definedCustomElements = /* @__PURE__ */ new Set(); + const visitNode = (node) => { + const nodeType = node.nodeType; + const nodeName = nodeType === Node.DOCUMENT_FRAGMENT_NODE ? "template" : node.nodeName; + if (nodeType !== Node.ELEMENT_NODE && nodeType !== Node.DOCUMENT_FRAGMENT_NODE && nodeType !== Node.TEXT_NODE) + return; + if (nodeName === "SCRIPT") + return; + if (nodeName === "LINK" && nodeType === Node.ELEMENT_NODE) { + const rel = node.getAttribute("rel")?.toLowerCase(); + if (rel === "preload" || rel === "prefetch") + return; + } + if (removeNoScript && nodeName === "NOSCRIPT") + return; + if (nodeName === "META") { + const httpEquiv = node.httpEquiv.toLowerCase(); + if (httpEquiv === "content-security-policy" || httpEquiv === "refresh" || httpEquiv === "set-cookie") + return; + } + if ((nodeName === "IFRAME" || nodeName === "FRAME") && headNesting) + return; + const data = ensureCachedData(node); + const values = []; + let equals = !!data.cached; + let extraNodes = 0; + const expectValue = (value2) => { + equals = equals && data.cached[values.length] === value2; + values.push(value2); + }; + const checkAndReturn = (n) => { + data.attributesCached = true; + if (equals) + return { equals: true, n: [[snapshotNumber - data.ref[0], data.ref[1]]] }; + nodeCounter += extraNodes; + data.ref = [snapshotNumber, nodeCounter++]; + data.cached = values; + return { equals: false, n }; + }; + if (nodeType === Node.TEXT_NODE) { + const value2 = node.nodeValue || ""; + expectValue(value2); + return checkAndReturn(value2); + } + if (nodeName === "STYLE") { + const sheet = node.sheet; + let cssText; + if (sheet) + cssText = this._updateStyleElementStyleSheetTextIfNeeded(sheet); + cssText = cssText || node.textContent || ""; + expectValue(cssText); + extraNodes++; + return checkAndReturn([nodeName, {}, cssText]); + } + const attrs = {}; + const result3 = [nodeName, attrs]; + const visitChild = (child) => { + const snapshot3 = visitNode(child); + if (snapshot3) { + result3.push(snapshot3.n); + expectValue(child); + equals = equals && snapshot3.equals; + } + }; + const visitChildStyleSheet = (child) => { + const snapshot3 = visitStyleSheet(child); + if (snapshot3) { + result3.push(snapshot3.n); + expectValue(child); + equals = equals && snapshot3.equals; + } + }; + if (nodeType === Node.DOCUMENT_FRAGMENT_NODE) + attrs[kShadowAttribute] = "open"; + if (nodeType === Node.ELEMENT_NODE) { + const element2 = node; + if (element2.localName.includes("-") && window.customElements?.get(element2.localName)) + definedCustomElements.add(element2.localName); + if (nodeName === "INPUT" || nodeName === "TEXTAREA") { + const value2 = element2.value; + expectValue(kValueAttribute); + expectValue(value2); + attrs[kValueAttribute] = value2; + } + if (nodeName === "INPUT" && ["checkbox", "radio"].includes(element2.type)) { + const value2 = element2.checked ? "true" : "false"; + expectValue(kCheckedAttribute); + expectValue(value2); + attrs[kCheckedAttribute] = value2; + } + if (nodeName === "OPTION") { + const value2 = element2.selected ? "true" : "false"; + expectValue(kSelectedAttribute); + expectValue(value2); + attrs[kSelectedAttribute] = value2; + } + if (nodeName === "CANVAS" || nodeName === "IFRAME" || nodeName === "FRAME") { + const boundingRect = element2.getBoundingClientRect(); + const value2 = JSON.stringify({ + left: boundingRect.left, + top: boundingRect.top, + right: boundingRect.right, + bottom: boundingRect.bottom + }); + expectValue(kBoundingRectAttribute); + expectValue(value2); + attrs[kBoundingRectAttribute] = value2; + } + if (element2.popover && element2.matches && element2.matches(":popover-open")) { + const value2 = "true"; + expectValue(kPopoverOpenAttribute); + expectValue(value2); + attrs[kPopoverOpenAttribute] = value2; + } + if (nodeName === "DIALOG" && element2.open) { + const value2 = element2.matches(":modal") ? "modal" : "true"; + expectValue(kDialogOpenAttribute); + expectValue(value2); + attrs[kDialogOpenAttribute] = value2; + } + if (element2.scrollTop) { + expectValue(kScrollTopAttribute); + expectValue(element2.scrollTop); + attrs[kScrollTopAttribute] = "" + element2.scrollTop; + } + if (element2.scrollLeft) { + expectValue(kScrollLeftAttribute); + expectValue(element2.scrollLeft); + attrs[kScrollLeftAttribute] = "" + element2.scrollLeft; + } + if (element2.shadowRoot) { + ++shadowDomNesting; + visitChild(element2.shadowRoot); + --shadowDomNesting; + } + if (element2.__playwright_target__ === this._targetGeneration) { + expectValue(kTargetAttribute); + attrs[kTargetAttribute] = ""; + } + } + if (nodeName === "HEAD") { + ++headNesting; + this._fakeBase.setAttribute("href", document.baseURI); + visitChild(this._fakeBase); + } + for (let child = node.firstChild; child; child = child.nextSibling) + visitChild(child); + if (nodeName === "HEAD") + --headNesting; + expectValue(kEndOfList); + let documentOrShadowRoot = null; + if (node.ownerDocument.documentElement === node) + documentOrShadowRoot = node.ownerDocument; + else if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) + documentOrShadowRoot = node; + if (documentOrShadowRoot) { + for (const sheet of documentOrShadowRoot.adoptedStyleSheets || []) + visitChildStyleSheet(sheet); + expectValue(kEndOfList); + } + if (nodeName === "IFRAME" || nodeName === "FRAME") { + const element2 = node; + const frameId = element2[kSnapshotFrameId]; + const name = "src"; + const value2 = frameId ? `/snapshot/${frameId}` : ""; + expectValue(name); + expectValue(value2); + attrs[name] = value2; + } + if (nodeName === "BODY" && definedCustomElements.size) { + const value2 = [...definedCustomElements].join(","); + expectValue(kCustomElementsAttribute); + expectValue(value2); + attrs[kCustomElementsAttribute] = value2; + } + if (nodeName === "IMG" || nodeName === "PICTURE") { + const value2 = nodeName === "PICTURE" ? "" : this._sanitizeUrl(node.currentSrc); + expectValue(kCurrentSrcAttribute); + expectValue(value2); + attrs[kCurrentSrcAttribute] = value2; + } + if (equals && data.attributesCached && !shadowDomNesting) + return checkAndReturn(result3); + if (nodeType === Node.ELEMENT_NODE) { + const element2 = node; + for (let i = 0; i < element2.attributes.length; i++) { + const name = element2.attributes[i].name; + if (nodeName === "LINK" && name === "integrity") + continue; + if (nodeName === "IFRAME" && (name === "src" || name === "srcdoc" || name === "sandbox")) + continue; + if (nodeName === "FRAME" && name === "src") + continue; + if (nodeName === "DIALOG" && name === "open") + continue; + let value2 = element2.attributes[i].value; + if (nodeName === "META") + value2 = this.__sanitizeMetaAttribute(name, value2, node.httpEquiv); + else if (name === "src" && nodeName === "IMG") + value2 = this._sanitizeUrl(value2); + else if (name === "srcset" && nodeName === "IMG") + value2 = this._sanitizeSrcSet(value2); + else if (name === "srcset" && nodeName === "SOURCE") + value2 = this._sanitizeSrcSet(value2); + else if (name === "href" && nodeName === "LINK") + value2 = this._sanitizeUrl(value2); + else if (name.startsWith("on")) + value2 = ""; + expectValue(name); + expectValue(value2); + attrs[name] = value2; + } + expectValue(kEndOfList); + } + if (result3.length === 2 && !Object.keys(attrs).length) + result3.pop(); + return checkAndReturn(result3); + }; + const visitStyleSheet = (sheet) => { + const data = ensureCachedData(sheet); + const oldCSSText = data.cssText; + const cssText = this._updateStyleElementStyleSheetTextIfNeeded( + sheet, + true + /* forceText */ + ); + if (cssText === oldCSSText) + return { equals: true, n: [[snapshotNumber - data.ref[0], data.ref[1]]] }; + data.ref = [snapshotNumber, nodeCounter++]; + return { + equals: false, + n: ["template", { + [kStyleSheetAttribute]: cssText + }] + }; + }; + let html; + if (document.documentElement) { + const { n } = visitNode(document.documentElement); + html = n; + } else { + html = ["html"]; + } + const result2 = { + html, + doctype: document.doctype ? document.doctype.name : void 0, + resourceOverrides: [], + viewport: { + width: window.innerWidth, + height: window.innerHeight + }, + url: location.href, + wallTime: Date.now(), + collectionTime: 0 + }; + for (const sheet of this._modifiedStyleSheets) { + if (sheet.href === null) + continue; + const content = this._updateLinkStyleSheetTextIfNeeded(sheet, snapshotNumber); + if (content === void 0) { + continue; + } + const base = this._getSheetBase(sheet); + const url2 = removeHash2(this._resolveUrl(base, sheet.href)); + result2.resourceOverrides.push({ url: url2, content, contentType: "text/css" }); + } + result2.collectionTime = performance.now() - timestamp; + return result2; + } + } + window[snapshotStreamer] = new Streamer(); +} +var init_snapshotterInjected = __esm({ + "packages/playwright-core/src/server/trace/recorder/snapshotterInjected.ts"() { + "use strict"; + } +}); + +// packages/playwright-core/src/server/trace/recorder/snapshotter.ts +var mime3, Snapshotter, kNeedsResetSymbol; +var init_snapshotter = __esm({ + "packages/playwright-core/src/server/trace/recorder/snapshotter.ts"() { + "use strict"; + init_time(); + init_crypto(); + init_debugLogger(); + init_eventsHelper(); + init_snapshotterInjected(); + init_browserContext(); + init_progress(); + mime3 = require("./utilsBundle").mime; + Snapshotter = class { + constructor(context2, delegate) { + this._eventListeners = []; + this._started = false; + this._context = context2; + this._delegate = delegate; + const guid = createGuid(); + this._snapshotStreamer = "__playwright_snapshot_streamer_" + guid; + } + started() { + return this._started; + } + async start(progress2) { + this._started = true; + if (!this._initScript) + await this._initialize(progress2); + await progress2.race(this.reset()); + } + async reset() { + if (this._started) + await this._context.safeNonStallingEvaluateInAllFrames(`window["${this._snapshotStreamer}"].resetHistory()`, "main"); + } + stop() { + this._started = false; + } + async resetForReuse() { + if (this._initScript) { + eventsHelper.removeEventListeners(this._eventListeners); + await this._initScript.dispose(); + this._initScript = void 0; + } + } + async _initialize(progress2) { + for (const page of this._context.pages()) + this._onPage(page); + this._eventListeners = [ + eventsHelper.addEventListener(this._context, BrowserContext.Events.Page, this._onPage.bind(this)), + eventsHelper.addEventListener(this._context, BrowserContext.Events.FrameAttached, (frame) => this._annotateFrameHierarchy(frame)) + ]; + const { javaScriptEnabled } = this._context._options; + const initScriptSource = `(${frameSnapshotStreamer})("${this._snapshotStreamer}", ${javaScriptEnabled || javaScriptEnabled === void 0})`; + this._initScript = await this._context.addInitScript(progress2, initScriptSource); + await progress2.race(this._context.safeNonStallingEvaluateInAllFrames(initScriptSource, "main")); + } + dispose() { + eventsHelper.removeEventListeners(this._eventListeners); + } + async _captureFrameSnapshot(frame, resetTargets) { + const needsHistoryReset = !!frame[kNeedsResetSymbol]; + frame[kNeedsResetSymbol] = false; + const reset = needsHistoryReset ? "history" : resetTargets ? "targets" : void 0; + const expression2 = `window["${this._snapshotStreamer}"].captureSnapshot(${JSON.stringify(reset)})`; + try { + return await frame.nonStallingRawEvaluateInExistingMainContext(expression2); + } catch (e) { + frame[kNeedsResetSymbol] = true; + debugLogger.log("error", e); + } + } + async captureSnapshot(page, callId, snapshotName, resetTargets) { + const snapshots = page.frames().map(async (frame) => { + const data = await this._captureFrameSnapshot(frame, resetTargets); + if (!data || !this._started) + return; + const snapshot3 = { + callId, + snapshotName, + pageId: page.guid, + frameId: frame.guid, + frameUrl: data.url, + doctype: data.doctype, + html: data.html, + viewport: data.viewport, + timestamp: monotonicTime(), + wallTime: data.wallTime, + collectionTime: data.collectionTime, + resourceOverrides: [], + isMainFrame: page.mainFrame() === frame + }; + for (const { url: url2, content, contentType } of data.resourceOverrides) { + if (typeof content === "string") { + const buffer = Buffer.from(content); + const sha1 = calculateSha1(buffer) + "." + (mime3.getExtension(contentType) || "dat"); + this._delegate.onSnapshotterBlob({ sha1, buffer }); + snapshot3.resourceOverrides.push({ url: url2, sha1 }); + } else { + snapshot3.resourceOverrides.push({ url: url2, ref: content }); + } + } + this._delegate.onFrameSnapshot(snapshot3); + }); + await Promise.all(snapshots); + } + _onPage(page) { + for (const frame of page.frames()) + this._annotateFrameHierarchy(frame); + } + _annotateFrameHierarchy(frame) { + (async () => { + const frameElement = await frame.frameElement(nullProgress); + const parent = frame.parentFrame(); + if (!parent) + return; + const context2 = await parent.mainContext(); + await context2?.evaluate(({ snapshotStreamer, frameElement: frameElement2, frameId }) => { + window[snapshotStreamer].markIframe(frameElement2, frameId); + }, { snapshotStreamer: this._snapshotStreamer, frameElement, frameId: frame.guid }); + frameElement.dispose(); + })().catch(() => { + }); + } + }; + kNeedsResetSymbol = Symbol("kNeedsReset"); + } +}); + +// packages/playwright-core/src/server/artifact.ts +var import_fs12, Artifact; +var init_artifact = __esm({ + "packages/playwright-core/src/server/artifact.ts"() { + "use strict"; + import_fs12 = __toESM(require("fs")); + init_manualPromise(); + init_assert(); + init_errors(); + init_instrumentation(); + Artifact = class extends SdkObject { + constructor(parent, localPath, unaccessibleErrorMessage, cancelCallback) { + super(parent, "artifact"); + this._finishedPromise = new ManualPromise(); + this._saveCallbacks = []; + this._finished = false; + this._deleted = false; + this._localPath = localPath; + this._unaccessibleErrorMessage = unaccessibleErrorMessage; + this._cancelCallback = cancelCallback; + } + async localPathAfterFinished(progress2) { + return await progress2.race(this._localPathAfterFinished()); + } + async failureError(progress2) { + return await progress2.race(this._failureError()); + } + async cancel(progress2) { + return await progress2.race(this._cancel()); + } + async delete(progress2) { + return await progress2.race(this._delete()); + } + localPath() { + return this._localPath; + } + async _localPathAfterFinished() { + if (this._unaccessibleErrorMessage) + throw new Error(this._unaccessibleErrorMessage); + await this._finishedPromise; + if (this._failureErrorValue) + throw this._failureErrorValue; + return this._localPath; + } + saveAs(progress2, saveCallback) { + if (this._unaccessibleErrorMessage) + throw new Error(this._unaccessibleErrorMessage); + if (this._deleted) + throw new Error(`File already deleted. Save before deleting.`); + if (this._failureErrorValue) + throw this._failureErrorValue; + if (this._finished) { + saveCallback(this._localPath).catch(() => { + }); + return; + } + this._saveCallbacks.push(saveCallback); + } + async _failureError() { + if (this._unaccessibleErrorMessage) + return this._unaccessibleErrorMessage; + await this._finishedPromise; + return this._failureErrorValue?.message || null; + } + async _cancel() { + assert(this._cancelCallback !== void 0); + return this._cancelCallback(); + } + async _delete() { + if (this._unaccessibleErrorMessage) + return; + const fileName = await this._localPathAfterFinished(); + if (this._deleted) + return; + this._deleted = true; + if (fileName) + await import_fs12.default.promises.unlink(fileName).catch((e) => { + }); + } + async deleteOnContextClose() { + if (this._deleted) + return; + this._deleted = true; + if (!this._unaccessibleErrorMessage) + await import_fs12.default.promises.unlink(this._localPath).catch((e) => { + }); + await this.reportFinished(new TargetClosedError(this.closeReason())); + } + async reportFinished(error) { + if (this._finished) + return; + this._finished = true; + this._failureErrorValue = error; + if (error) { + for (const callback of this._saveCallbacks) + await callback("", error); + } else { + for (const callback of this._saveCallbacks) + await callback(this._localPath); + } + this._saveCallbacks = []; + this._finishedPromise.resolve(); + } + }; + } +}); + +// packages/playwright-core/src/protocol/validatorPrimitives.ts +function findValidator(type3, method, kind) { + const validator = maybeFindValidator(type3, method, kind); + if (!validator) + throw new ValidationError(`Unknown scheme for ${kind}: ${type3}.${method}`); + return validator; +} +function maybeFindValidator(type3, method, kind) { + const schemeName = type3 + (kind === "Initializer" ? "" : method[0].toUpperCase() + method.substring(1)) + kind; + return scheme[schemeName]; +} +function createMetadataValidator() { + return tOptional(scheme["Metadata"]); +} +function createWaitInfoValidator() { + return scheme["WaitInfo"]; +} +var ValidationError, scheme, tFloat, tInt, tBoolean, tString, tBinary, tAny, tOptional, tArray, tObject, tEnum, tChannel, tType; +var init_validatorPrimitives = __esm({ + "packages/playwright-core/src/protocol/validatorPrimitives.ts"() { + "use strict"; + ValidationError = class extends Error { + }; + scheme = {}; + tFloat = (arg, path59, context2) => { + if (arg instanceof Number) + return arg.valueOf(); + if (typeof arg === "number") + return arg; + throw new ValidationError(`${path59}: expected float, got ${typeof arg}`); + }; + tInt = (arg, path59, context2) => { + let value2; + if (arg instanceof Number) + value2 = arg.valueOf(); + else if (typeof arg === "number") + value2 = arg; + else + throw new ValidationError(`${path59}: expected integer, got ${typeof arg}`); + if (!Number.isInteger(value2)) + throw new ValidationError(`${path59}: expected integer, got float ${value2}`); + return value2; + }; + tBoolean = (arg, path59, context2) => { + if (arg instanceof Boolean) + return arg.valueOf(); + if (typeof arg === "boolean") + return arg; + throw new ValidationError(`${path59}: expected boolean, got ${typeof arg}`); + }; + tString = (arg, path59, context2) => { + if (arg instanceof String) + return arg.valueOf(); + if (typeof arg === "string") + return arg; + throw new ValidationError(`${path59}: expected string, got ${typeof arg}`); + }; + tBinary = (arg, path59, context2) => { + if (context2.binary === "fromBase64") { + if (arg instanceof String) + return Buffer.from(arg.valueOf(), "base64"); + if (typeof arg === "string") + return Buffer.from(arg, "base64"); + throw new ValidationError(`${path59}: expected base64-encoded buffer, got ${typeof arg}`); + } + if (context2.binary === "toBase64") { + if (!(arg instanceof Buffer)) + throw new ValidationError(`${path59}: expected Buffer, got ${typeof arg}`); + return arg.toString("base64"); + } + if (context2.binary === "buffer") { + if (!(arg instanceof Buffer) && !(arg instanceof Object)) + throw new ValidationError(`${path59}: expected Buffer, got ${typeof arg}`); + return arg; + } + throw new ValidationError(`Unsupported binary behavior "${context2.binary}"`); + }; + tAny = (arg, path59, context2) => { + return arg; + }; + tOptional = (v) => { + return (arg, path59, context2) => { + if (Object.is(arg, void 0)) + return arg; + return v(arg, path59, context2); + }; + }; + tArray = (v) => { + return (arg, path59, context2) => { + if (!Array.isArray(arg)) + throw new ValidationError(`${path59}: expected array, got ${typeof arg}`); + return arg.map((x, index) => v(x, path59 + "[" + index + "]", context2)); + }; + }; + tObject = (s) => { + return (arg, path59, context2) => { + if (Object.is(arg, null)) + throw new ValidationError(`${path59}: expected object, got null`); + if (typeof arg !== "object") + throw new ValidationError(`${path59}: expected object, got ${typeof arg}`); + const result2 = {}; + for (const [key, v] of Object.entries(s)) { + const value2 = v(arg[key], path59 ? path59 + "." + key : key, context2); + if (!Object.is(value2, void 0)) + result2[key] = value2; + } + if (context2.isUnderTest()) { + for (const [key, value2] of Object.entries(arg)) { + if (key.startsWith("__testHook")) + result2[key] = value2; + } + } + return result2; + }; + }; + tEnum = (e) => { + return (arg, path59, context2) => { + if (!e.includes(arg)) + throw new ValidationError(`${path59}: expected one of (${e.join("|")})`); + return arg; + }; + }; + tChannel = (names) => { + return (arg, path59, context2) => { + return context2.tChannelImpl(names, arg, path59, context2); + }; + }; + tType = (name) => { + return (arg, path59, context2) => { + const v = scheme[name]; + if (!v) + throw new ValidationError(path59 + ': unknown type "' + name + '"'); + return v(arg, path59, context2); + }; + }; + } +}); + +// packages/playwright-core/src/protocol/validator.ts +var init_validator = __esm({ + "packages/playwright-core/src/protocol/validator.ts"() { + "use strict"; + init_validatorPrimitives(); + init_validatorPrimitives(); + scheme.AndroidInitializer = tOptional(tObject({})); + scheme.AndroidDevicesParams = tObject({ + host: tOptional(tString), + port: tOptional(tInt), + omitDriverInstall: tOptional(tBoolean) + }); + scheme.AndroidDevicesResult = tObject({ + devices: tArray(tChannel(["AndroidDevice"])) + }); + scheme.AndroidSocketInitializer = tOptional(tObject({})); + scheme.AndroidSocketDataEvent = tObject({ + data: tBinary + }); + scheme.AndroidSocketCloseEvent = tOptional(tObject({})); + scheme.AndroidSocketWriteParams = tObject({ + data: tBinary + }); + scheme.AndroidSocketWriteResult = tOptional(tObject({})); + scheme.AndroidSocketCloseParams = tOptional(tObject({})); + scheme.AndroidSocketCloseResult = tOptional(tObject({})); + scheme.AndroidDeviceInitializer = tObject({ + model: tString, + serial: tString + }); + scheme.AndroidDeviceCloseEvent = tOptional(tObject({})); + scheme.AndroidDeviceWebViewAddedEvent = tObject({ + webView: tType("AndroidWebView") + }); + scheme.AndroidDeviceWebViewRemovedEvent = tObject({ + socketName: tString + }); + scheme.AndroidDeviceWaitParams = tObject({ + androidSelector: tType("AndroidSelector"), + state: tOptional(tEnum(["gone"])), + timeout: tFloat + }); + scheme.AndroidDeviceWaitResult = tOptional(tObject({})); + scheme.AndroidDeviceFillParams = tObject({ + androidSelector: tType("AndroidSelector"), + text: tString, + timeout: tFloat + }); + scheme.AndroidDeviceFillResult = tOptional(tObject({})); + scheme.AndroidDeviceTapParams = tObject({ + androidSelector: tType("AndroidSelector"), + duration: tOptional(tFloat), + timeout: tFloat + }); + scheme.AndroidDeviceTapResult = tOptional(tObject({})); + scheme.AndroidDeviceDragParams = tObject({ + androidSelector: tType("AndroidSelector"), + dest: tType("Point"), + speed: tOptional(tFloat), + timeout: tFloat + }); + scheme.AndroidDeviceDragResult = tOptional(tObject({})); + scheme.AndroidDeviceFlingParams = tObject({ + androidSelector: tType("AndroidSelector"), + direction: tEnum(["up", "down", "left", "right"]), + speed: tOptional(tFloat), + timeout: tFloat + }); + scheme.AndroidDeviceFlingResult = tOptional(tObject({})); + scheme.AndroidDeviceLongTapParams = tObject({ + androidSelector: tType("AndroidSelector"), + timeout: tFloat + }); + scheme.AndroidDeviceLongTapResult = tOptional(tObject({})); + scheme.AndroidDevicePinchCloseParams = tObject({ + androidSelector: tType("AndroidSelector"), + percent: tFloat, + speed: tOptional(tFloat), + timeout: tFloat + }); + scheme.AndroidDevicePinchCloseResult = tOptional(tObject({})); + scheme.AndroidDevicePinchOpenParams = tObject({ + androidSelector: tType("AndroidSelector"), + percent: tFloat, + speed: tOptional(tFloat), + timeout: tFloat + }); + scheme.AndroidDevicePinchOpenResult = tOptional(tObject({})); + scheme.AndroidDeviceScrollParams = tObject({ + androidSelector: tType("AndroidSelector"), + direction: tEnum(["up", "down", "left", "right"]), + percent: tFloat, + speed: tOptional(tFloat), + timeout: tFloat + }); + scheme.AndroidDeviceScrollResult = tOptional(tObject({})); + scheme.AndroidDeviceSwipeParams = tObject({ + androidSelector: tType("AndroidSelector"), + direction: tEnum(["up", "down", "left", "right"]), + percent: tFloat, + speed: tOptional(tFloat), + timeout: tFloat + }); + scheme.AndroidDeviceSwipeResult = tOptional(tObject({})); + scheme.AndroidDeviceInfoParams = tObject({ + androidSelector: tType("AndroidSelector") + }); + scheme.AndroidDeviceInfoResult = tObject({ + info: tType("AndroidElementInfo") + }); + scheme.AndroidDeviceScreenshotParams = tOptional(tObject({})); + scheme.AndroidDeviceScreenshotResult = tObject({ + binary: tBinary + }); + scheme.AndroidDeviceInputTypeParams = tObject({ + text: tString + }); + scheme.AndroidDeviceInputTypeResult = tOptional(tObject({})); + scheme.AndroidDeviceInputPressParams = tObject({ + key: tString + }); + scheme.AndroidDeviceInputPressResult = tOptional(tObject({})); + scheme.AndroidDeviceInputTapParams = tObject({ + point: tType("Point") + }); + scheme.AndroidDeviceInputTapResult = tOptional(tObject({})); + scheme.AndroidDeviceInputSwipeParams = tObject({ + segments: tArray(tType("Point")), + steps: tInt + }); + scheme.AndroidDeviceInputSwipeResult = tOptional(tObject({})); + scheme.AndroidDeviceInputDragParams = tObject({ + from: tType("Point"), + to: tType("Point"), + steps: tInt + }); + scheme.AndroidDeviceInputDragResult = tOptional(tObject({})); + scheme.AndroidDeviceLaunchBrowserParams = tObject({ + noDefaultViewport: tOptional(tBoolean), + viewport: tOptional(tObject({ + width: tInt, + height: tInt + })), + screen: tOptional(tObject({ + width: tInt, + height: tInt + })), + ignoreHTTPSErrors: tOptional(tBoolean), + clientCertificates: tOptional(tArray(tObject({ + origin: tString, + cert: tOptional(tBinary), + key: tOptional(tBinary), + passphrase: tOptional(tString), + pfx: tOptional(tBinary) + }))), + javaScriptEnabled: tOptional(tBoolean), + bypassCSP: tOptional(tBoolean), + userAgent: tOptional(tString), + locale: tOptional(tString), + timezoneId: tOptional(tString), + geolocation: tOptional(tObject({ + longitude: tFloat, + latitude: tFloat, + accuracy: tOptional(tFloat) + })), + permissions: tOptional(tArray(tString)), + extraHTTPHeaders: tOptional(tArray(tType("NameValue"))), + offline: tOptional(tBoolean), + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + origin: tOptional(tString), + send: tOptional(tEnum(["always", "unauthorized"])) + })), + deviceScaleFactor: tOptional(tFloat), + isMobile: tOptional(tBoolean), + hasTouch: tOptional(tBoolean), + colorScheme: tOptional(tEnum(["dark", "light", "no-preference", "no-override"])), + reducedMotion: tOptional(tEnum(["reduce", "no-preference", "no-override"])), + forcedColors: tOptional(tEnum(["active", "none", "no-override"])), + acceptDownloads: tOptional(tEnum(["accept", "deny", "internal-browser-default"])), + contrast: tOptional(tEnum(["no-preference", "more", "no-override"])), + baseURL: tOptional(tString), + recordVideo: tOptional(tObject({ + dir: tOptional(tString), + size: tOptional(tObject({ + width: tInt, + height: tInt + })), + showActions: tOptional(tObject({ + duration: tOptional(tFloat), + position: tOptional(tEnum(["top-left", "top", "top-right", "bottom-left", "bottom", "bottom-right"])), + fontSize: tOptional(tInt), + cursor: tOptional(tEnum(["none", "pointer"])) + })) + })), + strictSelectors: tOptional(tBoolean), + serviceWorkers: tOptional(tEnum(["allow", "block"])), + selectorEngines: tOptional(tArray(tType("SelectorEngine"))), + testIdAttributeName: tOptional(tString), + pkg: tOptional(tString), + args: tOptional(tArray(tString)), + proxy: tOptional(tObject({ + server: tString, + bypass: tOptional(tString), + username: tOptional(tString), + password: tOptional(tString) + })) + }); + scheme.AndroidDeviceLaunchBrowserResult = tObject({ + context: tChannel(["BrowserContext"]) + }); + scheme.AndroidDeviceOpenParams = tObject({ + command: tString + }); + scheme.AndroidDeviceOpenResult = tObject({ + socket: tChannel(["AndroidSocket"]) + }); + scheme.AndroidDeviceShellParams = tObject({ + command: tString + }); + scheme.AndroidDeviceShellResult = tObject({ + result: tBinary + }); + scheme.AndroidDeviceInstallApkParams = tObject({ + file: tBinary, + args: tOptional(tArray(tString)) + }); + scheme.AndroidDeviceInstallApkResult = tOptional(tObject({})); + scheme.AndroidDevicePushParams = tObject({ + file: tBinary, + path: tString, + mode: tOptional(tInt) + }); + scheme.AndroidDevicePushResult = tOptional(tObject({})); + scheme.AndroidDeviceConnectToWebViewParams = tObject({ + socketName: tString + }); + scheme.AndroidDeviceConnectToWebViewResult = tObject({ + context: tChannel(["BrowserContext"]) + }); + scheme.AndroidDeviceCloseParams = tOptional(tObject({})); + scheme.AndroidDeviceCloseResult = tOptional(tObject({})); + scheme.AndroidWebView = tObject({ + pid: tInt, + pkg: tString, + socketName: tString + }); + scheme.AndroidSelector = tObject({ + checkable: tOptional(tBoolean), + checked: tOptional(tBoolean), + clazz: tOptional(tString), + clickable: tOptional(tBoolean), + depth: tOptional(tInt), + desc: tOptional(tString), + enabled: tOptional(tBoolean), + focusable: tOptional(tBoolean), + focused: tOptional(tBoolean), + hasChild: tOptional(tObject({ + androidSelector: tType("AndroidSelector") + })), + hasDescendant: tOptional(tObject({ + androidSelector: tType("AndroidSelector"), + maxDepth: tOptional(tInt) + })), + longClickable: tOptional(tBoolean), + pkg: tOptional(tString), + res: tOptional(tString), + scrollable: tOptional(tBoolean), + selected: tOptional(tBoolean), + text: tOptional(tString) + }); + scheme.AndroidElementInfo = tObject({ + children: tOptional(tArray(tType("AndroidElementInfo"))), + clazz: tString, + desc: tString, + res: tString, + pkg: tString, + text: tString, + bounds: tType("Rect"), + checkable: tBoolean, + checked: tBoolean, + clickable: tBoolean, + enabled: tBoolean, + focusable: tBoolean, + focused: tBoolean, + longClickable: tBoolean, + scrollable: tBoolean, + selected: tBoolean + }); + scheme.APIRequestContextInitializer = tObject({ + tracing: tChannel(["Tracing"]) + }); + scheme.APIRequestContextFetchParams = tObject({ + url: tString, + encodedParams: tOptional(tString), + params: tOptional(tArray(tType("NameValue"))), + method: tOptional(tString), + headers: tOptional(tArray(tType("NameValue"))), + postData: tOptional(tBinary), + jsonData: tOptional(tString), + formData: tOptional(tArray(tType("NameValue"))), + multipartData: tOptional(tArray(tType("FormField"))), + timeout: tFloat, + failOnStatusCode: tOptional(tBoolean), + ignoreHTTPSErrors: tOptional(tBoolean), + maxRedirects: tOptional(tInt), + maxRetries: tOptional(tInt) + }); + scheme.APIRequestContextFetchResult = tObject({ + response: tType("APIResponse") + }); + scheme.APIRequestContextFetchResponseBodyParams = tObject({ + fetchUid: tString + }); + scheme.APIRequestContextFetchResponseBodyResult = tObject({ + binary: tOptional(tBinary) + }); + scheme.APIRequestContextFetchLogParams = tObject({ + fetchUid: tString + }); + scheme.APIRequestContextFetchLogResult = tObject({ + log: tArray(tString) + }); + scheme.APIRequestContextStorageStateParams = tObject({ + indexedDB: tOptional(tBoolean) + }); + scheme.APIRequestContextStorageStateResult = tObject({ + cookies: tArray(tType("NetworkCookie")), + origins: tArray(tType("OriginStorage")) + }); + scheme.APIRequestContextDisposeAPIResponseParams = tObject({ + fetchUid: tString + }); + scheme.APIRequestContextDisposeAPIResponseResult = tOptional(tObject({})); + scheme.APIRequestContextDisposeParams = tObject({ + reason: tOptional(tString) + }); + scheme.APIRequestContextDisposeResult = tOptional(tObject({})); + scheme.APIResponse = tObject({ + fetchUid: tString, + url: tString, + status: tInt, + statusText: tString, + headers: tArray(tType("NameValue")), + securityDetails: tOptional(tType("SecurityDetails")), + serverAddr: tOptional(tType("RemoteAddr")) + }); + scheme.ArtifactInitializer = tObject({ + absolutePath: tString + }); + scheme.ArtifactPathAfterFinishedParams = tOptional(tObject({})); + scheme.ArtifactPathAfterFinishedResult = tObject({ + value: tString + }); + scheme.ArtifactSaveAsParams = tObject({ + path: tString + }); + scheme.ArtifactSaveAsResult = tOptional(tObject({})); + scheme.ArtifactSaveAsStreamParams = tOptional(tObject({})); + scheme.ArtifactSaveAsStreamResult = tObject({ + stream: tChannel(["Stream"]) + }); + scheme.ArtifactFailureParams = tOptional(tObject({})); + scheme.ArtifactFailureResult = tObject({ + error: tOptional(tString) + }); + scheme.ArtifactStreamParams = tOptional(tObject({})); + scheme.ArtifactStreamResult = tObject({ + stream: tChannel(["Stream"]) + }); + scheme.ArtifactCancelParams = tOptional(tObject({})); + scheme.ArtifactCancelResult = tOptional(tObject({})); + scheme.ArtifactDeleteParams = tOptional(tObject({})); + scheme.ArtifactDeleteResult = tOptional(tObject({})); + scheme.StreamInitializer = tOptional(tObject({})); + scheme.StreamReadParams = tObject({ + size: tOptional(tInt) + }); + scheme.StreamReadResult = tObject({ + binary: tBinary + }); + scheme.StreamCloseParams = tOptional(tObject({})); + scheme.StreamCloseResult = tOptional(tObject({})); + scheme.WritableStreamInitializer = tOptional(tObject({})); + scheme.WritableStreamWriteParams = tObject({ + binary: tBinary + }); + scheme.WritableStreamWriteResult = tOptional(tObject({})); + scheme.WritableStreamCloseParams = tOptional(tObject({})); + scheme.WritableStreamCloseResult = tOptional(tObject({})); + scheme.BrowserInitializer = tObject({ + version: tString, + name: tString, + browserName: tEnum(["chromium", "firefox", "webkit"]) + }); + scheme.BrowserContextEvent = tObject({ + context: tChannel(["BrowserContext"]) + }); + scheme.BrowserCloseEvent = tOptional(tObject({})); + scheme.BrowserStartServerParams = tObject({ + title: tString, + workspaceDir: tOptional(tString), + metadata: tOptional(tAny), + host: tOptional(tString), + port: tOptional(tInt) + }); + scheme.BrowserStartServerResult = tObject({ + endpoint: tString + }); + scheme.BrowserStopServerParams = tOptional(tObject({})); + scheme.BrowserStopServerResult = tOptional(tObject({})); + scheme.BrowserCloseParams = tObject({ + reason: tOptional(tString) + }); + scheme.BrowserCloseResult = tOptional(tObject({})); + scheme.BrowserKillForTestsParams = tOptional(tObject({})); + scheme.BrowserKillForTestsResult = tOptional(tObject({})); + scheme.BrowserDefaultUserAgentForTestParams = tOptional(tObject({})); + scheme.BrowserDefaultUserAgentForTestResult = tObject({ + userAgent: tString + }); + scheme.BrowserNewContextParams = tObject({ + noDefaultViewport: tOptional(tBoolean), + viewport: tOptional(tObject({ + width: tInt, + height: tInt + })), + screen: tOptional(tObject({ + width: tInt, + height: tInt + })), + ignoreHTTPSErrors: tOptional(tBoolean), + clientCertificates: tOptional(tArray(tObject({ + origin: tString, + cert: tOptional(tBinary), + key: tOptional(tBinary), + passphrase: tOptional(tString), + pfx: tOptional(tBinary) + }))), + javaScriptEnabled: tOptional(tBoolean), + bypassCSP: tOptional(tBoolean), + userAgent: tOptional(tString), + locale: tOptional(tString), + timezoneId: tOptional(tString), + geolocation: tOptional(tObject({ + longitude: tFloat, + latitude: tFloat, + accuracy: tOptional(tFloat) + })), + permissions: tOptional(tArray(tString)), + extraHTTPHeaders: tOptional(tArray(tType("NameValue"))), + offline: tOptional(tBoolean), + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + origin: tOptional(tString), + send: tOptional(tEnum(["always", "unauthorized"])) + })), + deviceScaleFactor: tOptional(tFloat), + isMobile: tOptional(tBoolean), + hasTouch: tOptional(tBoolean), + colorScheme: tOptional(tEnum(["dark", "light", "no-preference", "no-override"])), + reducedMotion: tOptional(tEnum(["reduce", "no-preference", "no-override"])), + forcedColors: tOptional(tEnum(["active", "none", "no-override"])), + acceptDownloads: tOptional(tEnum(["accept", "deny", "internal-browser-default"])), + contrast: tOptional(tEnum(["no-preference", "more", "no-override"])), + baseURL: tOptional(tString), + recordVideo: tOptional(tObject({ + dir: tOptional(tString), + size: tOptional(tObject({ + width: tInt, + height: tInt + })), + showActions: tOptional(tObject({ + duration: tOptional(tFloat), + position: tOptional(tEnum(["top-left", "top", "top-right", "bottom-left", "bottom", "bottom-right"])), + fontSize: tOptional(tInt), + cursor: tOptional(tEnum(["none", "pointer"])) + })) + })), + strictSelectors: tOptional(tBoolean), + serviceWorkers: tOptional(tEnum(["allow", "block"])), + selectorEngines: tOptional(tArray(tType("SelectorEngine"))), + testIdAttributeName: tOptional(tString), + proxy: tOptional(tObject({ + server: tString, + bypass: tOptional(tString), + username: tOptional(tString), + password: tOptional(tString) + })), + storageState: tOptional(tObject({ + cookies: tOptional(tArray(tType("SetNetworkCookie"))), + origins: tOptional(tArray(tType("SetOriginStorage"))) + })) + }); + scheme.BrowserNewContextResult = tObject({ + context: tChannel(["BrowserContext"]) + }); + scheme.BrowserNewContextForReuseParams = tObject({ + noDefaultViewport: tOptional(tBoolean), + viewport: tOptional(tObject({ + width: tInt, + height: tInt + })), + screen: tOptional(tObject({ + width: tInt, + height: tInt + })), + ignoreHTTPSErrors: tOptional(tBoolean), + clientCertificates: tOptional(tArray(tObject({ + origin: tString, + cert: tOptional(tBinary), + key: tOptional(tBinary), + passphrase: tOptional(tString), + pfx: tOptional(tBinary) + }))), + javaScriptEnabled: tOptional(tBoolean), + bypassCSP: tOptional(tBoolean), + userAgent: tOptional(tString), + locale: tOptional(tString), + timezoneId: tOptional(tString), + geolocation: tOptional(tObject({ + longitude: tFloat, + latitude: tFloat, + accuracy: tOptional(tFloat) + })), + permissions: tOptional(tArray(tString)), + extraHTTPHeaders: tOptional(tArray(tType("NameValue"))), + offline: tOptional(tBoolean), + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + origin: tOptional(tString), + send: tOptional(tEnum(["always", "unauthorized"])) + })), + deviceScaleFactor: tOptional(tFloat), + isMobile: tOptional(tBoolean), + hasTouch: tOptional(tBoolean), + colorScheme: tOptional(tEnum(["dark", "light", "no-preference", "no-override"])), + reducedMotion: tOptional(tEnum(["reduce", "no-preference", "no-override"])), + forcedColors: tOptional(tEnum(["active", "none", "no-override"])), + acceptDownloads: tOptional(tEnum(["accept", "deny", "internal-browser-default"])), + contrast: tOptional(tEnum(["no-preference", "more", "no-override"])), + baseURL: tOptional(tString), + recordVideo: tOptional(tObject({ + dir: tOptional(tString), + size: tOptional(tObject({ + width: tInt, + height: tInt + })), + showActions: tOptional(tObject({ + duration: tOptional(tFloat), + position: tOptional(tEnum(["top-left", "top", "top-right", "bottom-left", "bottom", "bottom-right"])), + fontSize: tOptional(tInt), + cursor: tOptional(tEnum(["none", "pointer"])) + })) + })), + strictSelectors: tOptional(tBoolean), + serviceWorkers: tOptional(tEnum(["allow", "block"])), + selectorEngines: tOptional(tArray(tType("SelectorEngine"))), + testIdAttributeName: tOptional(tString), + proxy: tOptional(tObject({ + server: tString, + bypass: tOptional(tString), + username: tOptional(tString), + password: tOptional(tString) + })), + storageState: tOptional(tObject({ + cookies: tOptional(tArray(tType("SetNetworkCookie"))), + origins: tOptional(tArray(tType("SetOriginStorage"))) + })) + }); + scheme.BrowserNewContextForReuseResult = tObject({ + context: tChannel(["BrowserContext"]) + }); + scheme.BrowserDisconnectFromReusedContextParams = tObject({ + reason: tString + }); + scheme.BrowserDisconnectFromReusedContextResult = tOptional(tObject({})); + scheme.BrowserNewBrowserCDPSessionParams = tOptional(tObject({})); + scheme.BrowserNewBrowserCDPSessionResult = tObject({ + session: tChannel(["CDPSession"]) + }); + scheme.BrowserStartTracingParams = tObject({ + page: tOptional(tChannel(["Page"])), + screenshots: tOptional(tBoolean), + categories: tOptional(tArray(tString)) + }); + scheme.BrowserStartTracingResult = tOptional(tObject({})); + scheme.BrowserStopTracingParams = tOptional(tObject({})); + scheme.BrowserStopTracingResult = tObject({ + artifact: tChannel(["Artifact"]) + }); + scheme.BrowserContextInitializer = tObject({ + debugger: tChannel(["Debugger"]), + requestContext: tChannel(["APIRequestContext"]), + tracing: tChannel(["Tracing"]), + options: tObject({ + noDefaultViewport: tOptional(tBoolean), + viewport: tOptional(tObject({ + width: tInt, + height: tInt + })), + screen: tOptional(tObject({ + width: tInt, + height: tInt + })), + ignoreHTTPSErrors: tOptional(tBoolean), + clientCertificates: tOptional(tArray(tObject({ + origin: tString, + cert: tOptional(tBinary), + key: tOptional(tBinary), + passphrase: tOptional(tString), + pfx: tOptional(tBinary) + }))), + javaScriptEnabled: tOptional(tBoolean), + bypassCSP: tOptional(tBoolean), + userAgent: tOptional(tString), + locale: tOptional(tString), + timezoneId: tOptional(tString), + geolocation: tOptional(tObject({ + longitude: tFloat, + latitude: tFloat, + accuracy: tOptional(tFloat) + })), + permissions: tOptional(tArray(tString)), + extraHTTPHeaders: tOptional(tArray(tType("NameValue"))), + offline: tOptional(tBoolean), + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + origin: tOptional(tString), + send: tOptional(tEnum(["always", "unauthorized"])) + })), + deviceScaleFactor: tOptional(tFloat), + isMobile: tOptional(tBoolean), + hasTouch: tOptional(tBoolean), + colorScheme: tOptional(tEnum(["dark", "light", "no-preference", "no-override"])), + reducedMotion: tOptional(tEnum(["reduce", "no-preference", "no-override"])), + forcedColors: tOptional(tEnum(["active", "none", "no-override"])), + acceptDownloads: tOptional(tEnum(["accept", "deny", "internal-browser-default"])), + contrast: tOptional(tEnum(["no-preference", "more", "no-override"])), + baseURL: tOptional(tString), + recordVideo: tOptional(tObject({ + dir: tOptional(tString), + size: tOptional(tObject({ + width: tInt, + height: tInt + })), + showActions: tOptional(tObject({ + duration: tOptional(tFloat), + position: tOptional(tEnum(["top-left", "top", "top-right", "bottom-left", "bottom", "bottom-right"])), + fontSize: tOptional(tInt), + cursor: tOptional(tEnum(["none", "pointer"])) + })) + })), + strictSelectors: tOptional(tBoolean), + serviceWorkers: tOptional(tEnum(["allow", "block"])), + selectorEngines: tOptional(tArray(tType("SelectorEngine"))), + testIdAttributeName: tOptional(tString) + }) + }); + scheme.BrowserContextBindingCallEvent = tObject({ + binding: tChannel(["BindingCall"]) + }); + scheme.BrowserContextConsoleEvent = tObject({ + type: tString, + text: tString, + args: tArray(tChannel(["ElementHandle", "JSHandle"])), + location: tObject({ + url: tString, + lineNumber: tInt, + columnNumber: tInt + }), + timestamp: tFloat, + page: tOptional(tChannel(["Page"])), + worker: tOptional(tChannel(["Worker"])) + }); + scheme.BrowserContextCloseEvent = tOptional(tObject({})); + scheme.BrowserContextDialogEvent = tObject({ + dialog: tChannel(["Dialog"]) + }); + scheme.BrowserContextPageEvent = tObject({ + page: tChannel(["Page"]) + }); + scheme.BrowserContextPageErrorEvent = tObject({ + error: tType("SerializedError"), + page: tChannel(["Page"]), + location: tObject({ + url: tString, + line: tInt, + column: tInt + }) + }); + scheme.BrowserContextRouteEvent = tObject({ + route: tChannel(["Route"]) + }); + scheme.BrowserContextWebSocketRouteEvent = tObject({ + webSocketRoute: tChannel(["WebSocketRoute"]) + }); + scheme.BrowserContextServiceWorkerEvent = tObject({ + worker: tChannel(["Worker"]) + }); + scheme.BrowserContextRequestEvent = tObject({ + request: tChannel(["Request"]), + page: tOptional(tChannel(["Page"])) + }); + scheme.BrowserContextRequestFailedEvent = tObject({ + request: tChannel(["Request"]), + failureText: tOptional(tString), + responseEndTiming: tFloat, + page: tOptional(tChannel(["Page"])) + }); + scheme.BrowserContextRequestFinishedEvent = tObject({ + request: tChannel(["Request"]), + response: tOptional(tChannel(["Response"])), + responseEndTiming: tFloat, + page: tOptional(tChannel(["Page"])) + }); + scheme.BrowserContextResponseEvent = tObject({ + response: tChannel(["Response"]), + page: tOptional(tChannel(["Page"])) + }); + scheme.BrowserContextRecorderEventEvent = tObject({ + event: tEnum(["actionAdded", "actionUpdated", "signalAdded"]), + data: tAny, + page: tChannel(["Page"]), + code: tString + }); + scheme.BrowserContextAddCookiesParams = tObject({ + cookies: tArray(tType("SetNetworkCookie")) + }); + scheme.BrowserContextAddCookiesResult = tOptional(tObject({})); + scheme.BrowserContextAddInitScriptParams = tObject({ + source: tString + }); + scheme.BrowserContextAddInitScriptResult = tObject({ + disposable: tChannel(["Disposable"]) + }); + scheme.BrowserContextClearCookiesParams = tObject({ + name: tOptional(tString), + nameRegexSource: tOptional(tString), + nameRegexFlags: tOptional(tString), + domain: tOptional(tString), + domainRegexSource: tOptional(tString), + domainRegexFlags: tOptional(tString), + path: tOptional(tString), + pathRegexSource: tOptional(tString), + pathRegexFlags: tOptional(tString) + }); + scheme.BrowserContextClearCookiesResult = tOptional(tObject({})); + scheme.BrowserContextClearPermissionsParams = tOptional(tObject({})); + scheme.BrowserContextClearPermissionsResult = tOptional(tObject({})); + scheme.BrowserContextCloseParams = tObject({ + reason: tOptional(tString) + }); + scheme.BrowserContextCloseResult = tOptional(tObject({})); + scheme.BrowserContextCookiesParams = tObject({ + urls: tArray(tString) + }); + scheme.BrowserContextCookiesResult = tObject({ + cookies: tArray(tType("NetworkCookie")) + }); + scheme.BrowserContextExposeBindingParams = tObject({ + name: tString + }); + scheme.BrowserContextExposeBindingResult = tObject({ + disposable: tChannel(["Disposable"]) + }); + scheme.BrowserContextGrantPermissionsParams = tObject({ + permissions: tArray(tString), + origin: tOptional(tString) + }); + scheme.BrowserContextGrantPermissionsResult = tOptional(tObject({})); + scheme.BrowserContextNewPageParams = tOptional(tObject({})); + scheme.BrowserContextNewPageResult = tObject({ + page: tChannel(["Page"]) + }); + scheme.BrowserContextRegisterSelectorEngineParams = tObject({ + selectorEngine: tType("SelectorEngine") + }); + scheme.BrowserContextRegisterSelectorEngineResult = tOptional(tObject({})); + scheme.BrowserContextSetTestIdAttributeNameParams = tObject({ + testIdAttributeName: tString + }); + scheme.BrowserContextSetTestIdAttributeNameResult = tOptional(tObject({})); + scheme.BrowserContextSetExtraHTTPHeadersParams = tObject({ + headers: tArray(tType("NameValue")) + }); + scheme.BrowserContextSetExtraHTTPHeadersResult = tOptional(tObject({})); + scheme.BrowserContextSetGeolocationParams = tObject({ + geolocation: tOptional(tObject({ + longitude: tFloat, + latitude: tFloat, + accuracy: tOptional(tFloat) + })) + }); + scheme.BrowserContextSetGeolocationResult = tOptional(tObject({})); + scheme.BrowserContextSetHTTPCredentialsParams = tObject({ + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + origin: tOptional(tString) + })) + }); + scheme.BrowserContextSetHTTPCredentialsResult = tOptional(tObject({})); + scheme.BrowserContextSetNetworkInterceptionPatternsParams = tObject({ + patterns: tArray(tObject({ + glob: tOptional(tString), + regexSource: tOptional(tString), + regexFlags: tOptional(tString), + urlPattern: tOptional(tType("URLPattern")) + })) + }); + scheme.BrowserContextSetNetworkInterceptionPatternsResult = tOptional(tObject({})); + scheme.BrowserContextSetWebSocketInterceptionPatternsParams = tObject({ + patterns: tArray(tObject({ + glob: tOptional(tString), + regexSource: tOptional(tString), + regexFlags: tOptional(tString), + urlPattern: tOptional(tType("URLPattern")) + })) + }); + scheme.BrowserContextSetWebSocketInterceptionPatternsResult = tOptional(tObject({})); + scheme.BrowserContextSetOfflineParams = tObject({ + offline: tBoolean + }); + scheme.BrowserContextSetOfflineResult = tOptional(tObject({})); + scheme.BrowserContextStorageStateParams = tObject({ + indexedDB: tOptional(tBoolean) + }); + scheme.BrowserContextStorageStateResult = tObject({ + cookies: tArray(tType("NetworkCookie")), + origins: tArray(tType("OriginStorage")) + }); + scheme.BrowserContextSetStorageStateParams = tObject({ + storageState: tOptional(tObject({ + cookies: tOptional(tArray(tType("SetNetworkCookie"))), + origins: tOptional(tArray(tType("SetOriginStorage"))) + })) + }); + scheme.BrowserContextSetStorageStateResult = tOptional(tObject({})); + scheme.BrowserContextPauseParams = tOptional(tObject({})); + scheme.BrowserContextPauseResult = tOptional(tObject({})); + scheme.BrowserContextEnableRecorderParams = tObject({ + language: tOptional(tString), + mode: tOptional(tEnum(["inspecting", "recording"])), + recorderMode: tOptional(tEnum(["default", "api"])), + pauseOnNextStatement: tOptional(tBoolean), + testIdAttributeName: tOptional(tString), + launchOptions: tOptional(tAny), + contextOptions: tOptional(tAny), + device: tOptional(tString), + saveStorage: tOptional(tString), + outputFile: tOptional(tString), + handleSIGINT: tOptional(tBoolean), + omitCallTracking: tOptional(tBoolean) + }); + scheme.BrowserContextEnableRecorderResult = tOptional(tObject({})); + scheme.BrowserContextDisableRecorderParams = tOptional(tObject({})); + scheme.BrowserContextDisableRecorderResult = tOptional(tObject({})); + scheme.BrowserContextExposeConsoleApiParams = tOptional(tObject({})); + scheme.BrowserContextExposeConsoleApiResult = tOptional(tObject({})); + scheme.BrowserContextNewCDPSessionParams = tObject({ + page: tOptional(tChannel(["Page"])), + frame: tOptional(tChannel(["Frame"])) + }); + scheme.BrowserContextNewCDPSessionResult = tObject({ + session: tChannel(["CDPSession"]) + }); + scheme.BrowserContextCreateTempFilesParams = tObject({ + rootDirName: tOptional(tString), + items: tArray(tObject({ + name: tString, + lastModifiedMs: tOptional(tFloat) + })) + }); + scheme.BrowserContextCreateTempFilesResult = tObject({ + rootDir: tOptional(tChannel(["WritableStream"])), + writableStreams: tArray(tChannel(["WritableStream"])) + }); + scheme.BrowserContextUpdateSubscriptionParams = tObject({ + event: tEnum(["console", "dialog", "request", "response", "requestFinished", "requestFailed"]), + enabled: tBoolean + }); + scheme.BrowserContextUpdateSubscriptionResult = tOptional(tObject({})); + scheme.BrowserContextClockFastForwardParams = tObject({ + ticksNumber: tOptional(tFloat), + ticksString: tOptional(tString) + }); + scheme.BrowserContextClockFastForwardResult = tOptional(tObject({})); + scheme.BrowserContextClockInstallParams = tObject({ + timeNumber: tOptional(tFloat), + timeString: tOptional(tString) + }); + scheme.BrowserContextClockInstallResult = tOptional(tObject({})); + scheme.BrowserContextClockPauseAtParams = tObject({ + timeNumber: tOptional(tFloat), + timeString: tOptional(tString) + }); + scheme.BrowserContextClockPauseAtResult = tOptional(tObject({})); + scheme.BrowserContextClockResumeParams = tOptional(tObject({})); + scheme.BrowserContextClockResumeResult = tOptional(tObject({})); + scheme.BrowserContextClockRunForParams = tObject({ + ticksNumber: tOptional(tFloat), + ticksString: tOptional(tString) + }); + scheme.BrowserContextClockRunForResult = tOptional(tObject({})); + scheme.BrowserContextClockSetFixedTimeParams = tObject({ + timeNumber: tOptional(tFloat), + timeString: tOptional(tString) + }); + scheme.BrowserContextClockSetFixedTimeResult = tOptional(tObject({})); + scheme.BrowserContextClockSetSystemTimeParams = tObject({ + timeNumber: tOptional(tFloat), + timeString: tOptional(tString) + }); + scheme.BrowserContextClockSetSystemTimeResult = tOptional(tObject({})); + scheme.BrowserContextCredentialsInstallParams = tOptional(tObject({})); + scheme.BrowserContextCredentialsInstallResult = tOptional(tObject({})); + scheme.BrowserContextCredentialsCreateParams = tObject({ + rpId: tString, + id: tOptional(tString), + userHandle: tOptional(tString), + privateKey: tOptional(tString), + publicKey: tOptional(tString) + }); + scheme.BrowserContextCredentialsCreateResult = tObject({ + credential: tType("VirtualCredential") + }); + scheme.BrowserContextCredentialsGetParams = tObject({ + rpId: tOptional(tString), + id: tOptional(tString) + }); + scheme.BrowserContextCredentialsGetResult = tObject({ + credentials: tArray(tType("VirtualCredential")) + }); + scheme.BrowserContextCredentialsDeleteParams = tObject({ + id: tString + }); + scheme.BrowserContextCredentialsDeleteResult = tOptional(tObject({})); + scheme.BrowserTypeInitializer = tObject({ + executablePath: tString, + name: tString + }); + scheme.BrowserTypeLaunchParams = tObject({ + channel: tOptional(tString), + executablePath: tOptional(tString), + args: tOptional(tArray(tString)), + ignoreAllDefaultArgs: tOptional(tBoolean), + ignoreDefaultArgs: tOptional(tArray(tString)), + handleSIGINT: tOptional(tBoolean), + handleSIGTERM: tOptional(tBoolean), + handleSIGHUP: tOptional(tBoolean), + timeout: tFloat, + env: tOptional(tArray(tType("NameValue"))), + headless: tOptional(tBoolean), + proxy: tOptional(tObject({ + server: tString, + bypass: tOptional(tString), + username: tOptional(tString), + password: tOptional(tString) + })), + downloadsPath: tOptional(tString), + tracesDir: tOptional(tString), + artifactsDir: tOptional(tString), + chromiumSandbox: tOptional(tBoolean), + firefoxUserPrefs: tOptional(tAny), + cdpPort: tOptional(tInt), + slowMo: tOptional(tFloat) + }); + scheme.BrowserTypeLaunchResult = tObject({ + browser: tChannel(["Browser"]) + }); + scheme.BrowserTypeLaunchPersistentContextParams = tObject({ + channel: tOptional(tString), + executablePath: tOptional(tString), + args: tOptional(tArray(tString)), + ignoreAllDefaultArgs: tOptional(tBoolean), + ignoreDefaultArgs: tOptional(tArray(tString)), + handleSIGINT: tOptional(tBoolean), + handleSIGTERM: tOptional(tBoolean), + handleSIGHUP: tOptional(tBoolean), + timeout: tFloat, + env: tOptional(tArray(tType("NameValue"))), + headless: tOptional(tBoolean), + proxy: tOptional(tObject({ + server: tString, + bypass: tOptional(tString), + username: tOptional(tString), + password: tOptional(tString) + })), + downloadsPath: tOptional(tString), + tracesDir: tOptional(tString), + artifactsDir: tOptional(tString), + chromiumSandbox: tOptional(tBoolean), + firefoxUserPrefs: tOptional(tAny), + cdpPort: tOptional(tInt), + noDefaultViewport: tOptional(tBoolean), + viewport: tOptional(tObject({ + width: tInt, + height: tInt + })), + screen: tOptional(tObject({ + width: tInt, + height: tInt + })), + ignoreHTTPSErrors: tOptional(tBoolean), + clientCertificates: tOptional(tArray(tObject({ + origin: tString, + cert: tOptional(tBinary), + key: tOptional(tBinary), + passphrase: tOptional(tString), + pfx: tOptional(tBinary) + }))), + javaScriptEnabled: tOptional(tBoolean), + bypassCSP: tOptional(tBoolean), + userAgent: tOptional(tString), + locale: tOptional(tString), + timezoneId: tOptional(tString), + geolocation: tOptional(tObject({ + longitude: tFloat, + latitude: tFloat, + accuracy: tOptional(tFloat) + })), + permissions: tOptional(tArray(tString)), + extraHTTPHeaders: tOptional(tArray(tType("NameValue"))), + offline: tOptional(tBoolean), + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + origin: tOptional(tString), + send: tOptional(tEnum(["always", "unauthorized"])) + })), + deviceScaleFactor: tOptional(tFloat), + isMobile: tOptional(tBoolean), + hasTouch: tOptional(tBoolean), + colorScheme: tOptional(tEnum(["dark", "light", "no-preference", "no-override"])), + reducedMotion: tOptional(tEnum(["reduce", "no-preference", "no-override"])), + forcedColors: tOptional(tEnum(["active", "none", "no-override"])), + acceptDownloads: tOptional(tEnum(["accept", "deny", "internal-browser-default"])), + contrast: tOptional(tEnum(["no-preference", "more", "no-override"])), + baseURL: tOptional(tString), + recordVideo: tOptional(tObject({ + dir: tOptional(tString), + size: tOptional(tObject({ + width: tInt, + height: tInt + })), + showActions: tOptional(tObject({ + duration: tOptional(tFloat), + position: tOptional(tEnum(["top-left", "top", "top-right", "bottom-left", "bottom", "bottom-right"])), + fontSize: tOptional(tInt), + cursor: tOptional(tEnum(["none", "pointer"])) + })) + })), + strictSelectors: tOptional(tBoolean), + serviceWorkers: tOptional(tEnum(["allow", "block"])), + selectorEngines: tOptional(tArray(tType("SelectorEngine"))), + testIdAttributeName: tOptional(tString), + userDataDir: tString, + slowMo: tOptional(tFloat) + }); + scheme.BrowserTypeLaunchPersistentContextResult = tObject({ + browser: tChannel(["Browser"]), + context: tChannel(["BrowserContext"]) + }); + scheme.BrowserTypeConnectOverCDPParams = tObject({ + endpointURL: tOptional(tString), + headers: tOptional(tArray(tType("NameValue"))), + slowMo: tOptional(tFloat), + timeout: tFloat, + isLocal: tOptional(tBoolean), + noDefaults: tOptional(tBoolean), + artifactsDir: tOptional(tString), + transport: tOptional(tBinary) + }); + scheme.BrowserTypeConnectOverCDPResult = tObject({ + browser: tChannel(["Browser"]), + defaultContext: tOptional(tChannel(["BrowserContext"])) + }); + scheme.BrowserTypeConnectToWorkerParams = tObject({ + endpoint: tString, + timeout: tFloat + }); + scheme.BrowserTypeConnectToWorkerResult = tObject({ + worker: tChannel(["Worker"]) + }); + scheme.Metadata = tObject({ + location: tOptional(tObject({ + file: tString, + line: tOptional(tInt), + column: tOptional(tInt) + })), + title: tOptional(tString), + internal: tOptional(tBoolean), + stepId: tOptional(tString) + }); + scheme.ClientSideCallMetadata = tObject({ + id: tInt, + stack: tOptional(tArray(tType("StackFrame"))) + }); + scheme.SDKLanguage = tEnum(["javascript", "python", "java", "csharp"]); + scheme.DisposableInitializer = tOptional(tObject({})); + scheme.DisposableDisposeParams = tOptional(tObject({})); + scheme.DisposableDisposeResult = tOptional(tObject({})); + scheme.WaitInfo = tObject({ + waitId: tString, + phase: tEnum(["before", "after", "log"]), + event: tOptional(tString), + message: tOptional(tString), + error: tOptional(tString) + }); + scheme.ElectronInitializer = tOptional(tObject({})); + scheme.ElectronLaunchParams = tObject({ + executablePath: tOptional(tString), + args: tOptional(tArray(tString)), + chromiumSandbox: tOptional(tBoolean), + cwd: tOptional(tString), + env: tOptional(tArray(tType("NameValue"))), + timeout: tFloat, + acceptDownloads: tOptional(tEnum(["accept", "deny", "internal-browser-default"])), + bypassCSP: tOptional(tBoolean), + colorScheme: tOptional(tEnum(["dark", "light", "no-preference", "no-override"])), + extraHTTPHeaders: tOptional(tArray(tType("NameValue"))), + geolocation: tOptional(tObject({ + longitude: tFloat, + latitude: tFloat, + accuracy: tOptional(tFloat) + })), + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + origin: tOptional(tString) + })), + ignoreHTTPSErrors: tOptional(tBoolean), + locale: tOptional(tString), + offline: tOptional(tBoolean), + recordVideo: tOptional(tObject({ + dir: tOptional(tString), + size: tOptional(tObject({ + width: tInt, + height: tInt + })), + showActions: tOptional(tObject({ + duration: tOptional(tFloat), + position: tOptional(tEnum(["top-left", "top", "top-right", "bottom-left", "bottom", "bottom-right"])), + fontSize: tOptional(tInt), + cursor: tOptional(tEnum(["none", "pointer"])) + })) + })), + strictSelectors: tOptional(tBoolean), + timezoneId: tOptional(tString), + tracesDir: tOptional(tString), + artifactsDir: tOptional(tString), + selectorEngines: tOptional(tArray(tType("SelectorEngine"))), + testIdAttributeName: tOptional(tString) + }); + scheme.ElectronLaunchResult = tObject({ + electronApplication: tChannel(["ElectronApplication"]) + }); + scheme.ElectronApplicationInitializer = tObject({ + context: tChannel(["BrowserContext"]) + }); + scheme.ElectronApplicationCloseEvent = tOptional(tObject({})); + scheme.ElectronApplicationConsoleEvent = tObject({ + type: tString, + text: tString, + args: tArray(tChannel(["ElementHandle", "JSHandle"])), + location: tObject({ + url: tString, + lineNumber: tInt, + columnNumber: tInt + }), + timestamp: tFloat + }); + scheme.ElectronApplicationBrowserWindowParams = tObject({ + page: tChannel(["Page"]) + }); + scheme.ElectronApplicationBrowserWindowResult = tObject({ + handle: tChannel(["ElementHandle", "JSHandle"]) + }); + scheme.ElectronApplicationEvaluateExpressionParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") + }); + scheme.ElectronApplicationEvaluateExpressionResult = tObject({ + value: tType("SerializedValue") + }); + scheme.ElectronApplicationEvaluateExpressionHandleParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") + }); + scheme.ElectronApplicationEvaluateExpressionHandleResult = tObject({ + handle: tChannel(["ElementHandle", "JSHandle"]) + }); + scheme.ElectronApplicationUpdateSubscriptionParams = tObject({ + event: tEnum(["console"]), + enabled: tBoolean + }); + scheme.ElectronApplicationUpdateSubscriptionResult = tOptional(tObject({})); + scheme.FrameInitializer = tObject({ + url: tString, + name: tString, + parentFrame: tOptional(tChannel(["Frame"])), + loadStates: tArray(tType("LifecycleEvent")) + }); + scheme.FrameLoadstateEvent = tObject({ + add: tOptional(tType("LifecycleEvent")), + remove: tOptional(tType("LifecycleEvent")) + }); + scheme.FrameNavigatedEvent = tObject({ + url: tString, + name: tString, + newDocument: tOptional(tObject({ + request: tOptional(tChannel(["Request"])) + })), + error: tOptional(tString) + }); + scheme.FrameEvalOnSelectorParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") + }); + scheme.FrameEvalOnSelectorResult = tObject({ + value: tType("SerializedValue") + }); + scheme.FrameEvalOnSelectorAllParams = tObject({ + selector: tString, + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") + }); + scheme.FrameEvalOnSelectorAllResult = tObject({ + value: tType("SerializedValue") + }); + scheme.FrameAddScriptTagParams = tObject({ + url: tOptional(tString), + content: tOptional(tString), + type: tOptional(tString) + }); + scheme.FrameAddScriptTagResult = tObject({ + element: tChannel(["ElementHandle"]) + }); + scheme.FrameAddStyleTagParams = tObject({ + url: tOptional(tString), + content: tOptional(tString) + }); + scheme.FrameAddStyleTagResult = tObject({ + element: tChannel(["ElementHandle"]) + }); + scheme.FrameAriaSnapshotParams = tObject({ + mode: tOptional(tEnum(["ai", "default"])), + track: tOptional(tString), + selector: tOptional(tString), + depth: tOptional(tInt), + boxes: tOptional(tBoolean), + timeout: tFloat + }); + scheme.FrameAriaSnapshotResult = tObject({ + snapshot: tString + }); + scheme.FrameBlurParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tFloat + }); + scheme.FrameBlurResult = tOptional(tObject({})); + scheme.FrameCheckParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + force: tOptional(tBoolean), + position: tOptional(tType("Point")), + timeout: tFloat, + trial: tOptional(tBoolean) + }); + scheme.FrameCheckResult = tOptional(tObject({})); + scheme.FrameClickParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + force: tOptional(tBoolean), + noWaitAfter: tOptional(tBoolean), + modifiers: tOptional(tArray(tEnum(["Alt", "Control", "ControlOrMeta", "Meta", "Shift"]))), + position: tOptional(tType("Point")), + delay: tOptional(tFloat), + button: tOptional(tEnum(["left", "right", "middle"])), + clickCount: tOptional(tInt), + timeout: tFloat, + trial: tOptional(tBoolean), + steps: tOptional(tInt) + }); + scheme.FrameClickResult = tOptional(tObject({})); + scheme.FrameContentParams = tOptional(tObject({})); + scheme.FrameContentResult = tObject({ + value: tString + }); + scheme.FrameDragAndDropParams = tObject({ + source: tString, + target: tString, + force: tOptional(tBoolean), + timeout: tFloat, + trial: tOptional(tBoolean), + sourcePosition: tOptional(tType("Point")), + targetPosition: tOptional(tType("Point")), + strict: tOptional(tBoolean), + steps: tOptional(tInt) + }); + scheme.FrameDragAndDropResult = tOptional(tObject({})); + scheme.FrameDropParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + position: tOptional(tType("Point")), + payloads: tOptional(tArray(tObject({ + name: tString, + mimeType: tOptional(tString), + buffer: tBinary + }))), + localPaths: tOptional(tArray(tString)), + streams: tOptional(tArray(tChannel(["WritableStream"]))), + data: tOptional(tArray(tObject({ + mimeType: tString, + value: tString + }))), + timeout: tFloat + }); + scheme.FrameDropResult = tOptional(tObject({})); + scheme.FrameDblclickParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + force: tOptional(tBoolean), + modifiers: tOptional(tArray(tEnum(["Alt", "Control", "ControlOrMeta", "Meta", "Shift"]))), + position: tOptional(tType("Point")), + delay: tOptional(tFloat), + button: tOptional(tEnum(["left", "right", "middle"])), + timeout: tFloat, + trial: tOptional(tBoolean), + steps: tOptional(tInt) + }); + scheme.FrameDblclickResult = tOptional(tObject({})); + scheme.FrameDispatchEventParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + type: tString, + eventInit: tType("SerializedArgument"), + timeout: tFloat + }); + scheme.FrameDispatchEventResult = tOptional(tObject({})); + scheme.FrameEvaluateExpressionParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") + }); + scheme.FrameEvaluateExpressionResult = tObject({ + value: tType("SerializedValue") + }); + scheme.FrameEvaluateExpressionHandleParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") + }); + scheme.FrameEvaluateExpressionHandleResult = tObject({ + handle: tChannel(["ElementHandle", "JSHandle"]) + }); + scheme.FrameFillParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + value: tString, + force: tOptional(tBoolean), + timeout: tFloat + }); + scheme.FrameFillResult = tOptional(tObject({})); + scheme.FrameFocusParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tFloat + }); + scheme.FrameFocusResult = tOptional(tObject({})); + scheme.FrameFrameElementParams = tOptional(tObject({})); + scheme.FrameFrameElementResult = tObject({ + element: tChannel(["ElementHandle"]) + }); + scheme.FrameResolveSelectorParams = tObject({ + selector: tString + }); + scheme.FrameResolveSelectorResult = tObject({ + resolvedSelector: tString + }); + scheme.FrameHighlightParams = tObject({ + selector: tString, + style: tOptional(tString) + }); + scheme.FrameHighlightResult = tOptional(tObject({})); + scheme.FrameHideHighlightParams = tObject({ + selector: tString + }); + scheme.FrameHideHighlightResult = tOptional(tObject({})); + scheme.FrameGetAttributeParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + name: tString, + timeout: tFloat + }); + scheme.FrameGetAttributeResult = tObject({ + value: tOptional(tString) + }); + scheme.FrameGotoParams = tObject({ + url: tString, + timeout: tFloat, + waitUntil: tOptional(tType("LifecycleEvent")), + referer: tOptional(tString) + }); + scheme.FrameGotoResult = tObject({ + response: tOptional(tChannel(["Response"])) + }); + scheme.FrameHoverParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + force: tOptional(tBoolean), + modifiers: tOptional(tArray(tEnum(["Alt", "Control", "ControlOrMeta", "Meta", "Shift"]))), + position: tOptional(tType("Point")), + timeout: tFloat, + trial: tOptional(tBoolean) + }); + scheme.FrameHoverResult = tOptional(tObject({})); + scheme.FrameInnerHTMLParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tFloat + }); + scheme.FrameInnerHTMLResult = tObject({ + value: tString + }); + scheme.FrameInnerTextParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tFloat + }); + scheme.FrameInnerTextResult = tObject({ + value: tString + }); + scheme.FrameInputValueParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tFloat + }); + scheme.FrameInputValueResult = tObject({ + value: tString + }); + scheme.FrameIsCheckedParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tFloat + }); + scheme.FrameIsCheckedResult = tObject({ + value: tBoolean + }); + scheme.FrameIsDisabledParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tFloat + }); + scheme.FrameIsDisabledResult = tObject({ + value: tBoolean + }); + scheme.FrameIsEnabledParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tFloat + }); + scheme.FrameIsEnabledResult = tObject({ + value: tBoolean + }); + scheme.FrameIsHiddenParams = tObject({ + selector: tString, + strict: tOptional(tBoolean) + }); + scheme.FrameIsHiddenResult = tObject({ + value: tBoolean + }); + scheme.FrameIsVisibleParams = tObject({ + selector: tString, + strict: tOptional(tBoolean) + }); + scheme.FrameIsVisibleResult = tObject({ + value: tBoolean + }); + scheme.FrameIsEditableParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tFloat + }); + scheme.FrameIsEditableResult = tObject({ + value: tBoolean + }); + scheme.FramePressParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + key: tString, + delay: tOptional(tFloat), + noWaitAfter: tOptional(tBoolean), + timeout: tFloat + }); + scheme.FramePressResult = tOptional(tObject({})); + scheme.FrameQuerySelectorParams = tObject({ + selector: tString, + strict: tOptional(tBoolean) + }); + scheme.FrameQuerySelectorResult = tObject({ + element: tOptional(tChannel(["ElementHandle"])) + }); + scheme.FrameQuerySelectorAllParams = tObject({ + selector: tString + }); + scheme.FrameQuerySelectorAllResult = tObject({ + elements: tArray(tChannel(["ElementHandle"])) + }); + scheme.FrameQueryCountParams = tObject({ + selector: tString + }); + scheme.FrameQueryCountResult = tObject({ + value: tInt + }); + scheme.FrameSelectOptionParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + elements: tOptional(tArray(tChannel(["ElementHandle"]))), + options: tOptional(tArray(tObject({ + valueOrLabel: tOptional(tString), + value: tOptional(tString), + label: tOptional(tString), + index: tOptional(tInt) + }))), + force: tOptional(tBoolean), + timeout: tFloat + }); + scheme.FrameSelectOptionResult = tObject({ + values: tArray(tString) + }); + scheme.FrameSetContentParams = tObject({ + html: tString, + timeout: tFloat, + waitUntil: tOptional(tType("LifecycleEvent")) + }); + scheme.FrameSetContentResult = tOptional(tObject({})); + scheme.FrameSetInputFilesParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + payloads: tOptional(tArray(tObject({ + name: tString, + mimeType: tOptional(tString), + buffer: tBinary + }))), + localDirectory: tOptional(tString), + directoryStream: tOptional(tChannel(["WritableStream"])), + localPaths: tOptional(tArray(tString)), + streams: tOptional(tArray(tChannel(["WritableStream"]))), + timeout: tFloat + }); + scheme.FrameSetInputFilesResult = tOptional(tObject({})); + scheme.FrameTapParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + force: tOptional(tBoolean), + modifiers: tOptional(tArray(tEnum(["Alt", "Control", "ControlOrMeta", "Meta", "Shift"]))), + position: tOptional(tType("Point")), + timeout: tFloat, + trial: tOptional(tBoolean) + }); + scheme.FrameTapResult = tOptional(tObject({})); + scheme.FrameTextContentParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tFloat + }); + scheme.FrameTextContentResult = tObject({ + value: tOptional(tString) + }); + scheme.FrameTitleParams = tOptional(tObject({})); + scheme.FrameTitleResult = tObject({ + value: tString + }); + scheme.FrameTypeParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + text: tString, + delay: tOptional(tFloat), + timeout: tFloat + }); + scheme.FrameTypeResult = tOptional(tObject({})); + scheme.FrameUncheckParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + force: tOptional(tBoolean), + position: tOptional(tType("Point")), + timeout: tFloat, + trial: tOptional(tBoolean) + }); + scheme.FrameUncheckResult = tOptional(tObject({})); + scheme.FrameWaitForTimeoutParams = tObject({ + waitTimeout: tFloat + }); + scheme.FrameWaitForTimeoutResult = tOptional(tObject({})); + scheme.FrameWaitForFunctionParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument"), + timeout: tFloat, + pollingInterval: tOptional(tFloat) + }); + scheme.FrameWaitForFunctionResult = tObject({ + handle: tChannel(["ElementHandle", "JSHandle"]) + }); + scheme.FrameWaitForSelectorParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tFloat, + state: tOptional(tEnum(["attached", "detached", "visible", "hidden"])), + omitReturnValue: tOptional(tBoolean) + }); + scheme.FrameWaitForSelectorResult = tObject({ + element: tOptional(tChannel(["ElementHandle"])) + }); + scheme.FrameExpectParams = tObject({ + selector: tOptional(tString), + expression: tString, + expressionArg: tOptional(tAny), + pseudo: tOptional(tEnum(["before", "after"])), + expectedText: tOptional(tArray(tType("ExpectedTextValue"))), + expectedNumber: tOptional(tFloat), + expectedValue: tOptional(tType("SerializedArgument")), + useInnerText: tOptional(tBoolean), + isNot: tBoolean, + timeout: tFloat + }); + scheme.FrameExpectResult = tOptional(tObject({})); + scheme.FrameExpectErrorDetails = tObject({ + received: tOptional(tObject({ + value: tOptional(tType("SerializedValue")), + ariaSnapshot: tOptional(tString) + })), + timedOut: tOptional(tBoolean), + customErrorMessage: tOptional(tString) + }); + scheme.JSHandleInitializer = tObject({ + preview: tString + }); + scheme.JSHandlePreviewUpdatedEvent = tObject({ + preview: tString + }); + scheme.ElementHandlePreviewUpdatedEvent = tType("JSHandlePreviewUpdatedEvent"); + scheme.JSHandleDisposeParams = tOptional(tObject({})); + scheme.ElementHandleDisposeParams = tType("JSHandleDisposeParams"); + scheme.JSHandleDisposeResult = tOptional(tObject({})); + scheme.ElementHandleDisposeResult = tType("JSHandleDisposeResult"); + scheme.JSHandleEvaluateExpressionParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") + }); + scheme.ElementHandleEvaluateExpressionParams = tType("JSHandleEvaluateExpressionParams"); + scheme.JSHandleEvaluateExpressionResult = tObject({ + value: tType("SerializedValue") + }); + scheme.ElementHandleEvaluateExpressionResult = tType("JSHandleEvaluateExpressionResult"); + scheme.JSHandleEvaluateExpressionHandleParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") + }); + scheme.ElementHandleEvaluateExpressionHandleParams = tType("JSHandleEvaluateExpressionHandleParams"); + scheme.JSHandleEvaluateExpressionHandleResult = tObject({ + handle: tChannel(["ElementHandle", "JSHandle"]) + }); + scheme.ElementHandleEvaluateExpressionHandleResult = tType("JSHandleEvaluateExpressionHandleResult"); + scheme.JSHandleGetPropertyListParams = tOptional(tObject({})); + scheme.ElementHandleGetPropertyListParams = tType("JSHandleGetPropertyListParams"); + scheme.JSHandleGetPropertyListResult = tObject({ + properties: tArray(tObject({ + name: tString, + value: tChannel(["ElementHandle", "JSHandle"]) + })) + }); + scheme.ElementHandleGetPropertyListResult = tType("JSHandleGetPropertyListResult"); + scheme.JSHandleGetPropertyParams = tObject({ + name: tString + }); + scheme.ElementHandleGetPropertyParams = tType("JSHandleGetPropertyParams"); + scheme.JSHandleGetPropertyResult = tObject({ + handle: tChannel(["ElementHandle", "JSHandle"]) + }); + scheme.ElementHandleGetPropertyResult = tType("JSHandleGetPropertyResult"); + scheme.JSHandleJsonValueParams = tOptional(tObject({})); + scheme.ElementHandleJsonValueParams = tType("JSHandleJsonValueParams"); + scheme.JSHandleJsonValueResult = tObject({ + value: tType("SerializedValue") + }); + scheme.ElementHandleJsonValueResult = tType("JSHandleJsonValueResult"); + scheme.ElementHandleInitializer = tObject({ + preview: tString + }); + scheme.ElementHandleEvalOnSelectorParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") + }); + scheme.ElementHandleEvalOnSelectorResult = tObject({ + value: tType("SerializedValue") + }); + scheme.ElementHandleEvalOnSelectorAllParams = tObject({ + selector: tString, + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") + }); + scheme.ElementHandleEvalOnSelectorAllResult = tObject({ + value: tType("SerializedValue") + }); + scheme.ElementHandleBoundingBoxParams = tOptional(tObject({})); + scheme.ElementHandleBoundingBoxResult = tObject({ + value: tOptional(tType("Rect")) + }); + scheme.ElementHandleCheckParams = tObject({ + force: tOptional(tBoolean), + position: tOptional(tType("Point")), + timeout: tFloat, + trial: tOptional(tBoolean) + }); + scheme.ElementHandleCheckResult = tOptional(tObject({})); + scheme.ElementHandleClickParams = tObject({ + force: tOptional(tBoolean), + noWaitAfter: tOptional(tBoolean), + modifiers: tOptional(tArray(tEnum(["Alt", "Control", "ControlOrMeta", "Meta", "Shift"]))), + position: tOptional(tType("Point")), + delay: tOptional(tFloat), + button: tOptional(tEnum(["left", "right", "middle"])), + clickCount: tOptional(tInt), + timeout: tFloat, + trial: tOptional(tBoolean), + steps: tOptional(tInt) + }); + scheme.ElementHandleClickResult = tOptional(tObject({})); + scheme.ElementHandleContentFrameParams = tOptional(tObject({})); + scheme.ElementHandleContentFrameResult = tObject({ + frame: tOptional(tChannel(["Frame"])) + }); + scheme.ElementHandleDblclickParams = tObject({ + force: tOptional(tBoolean), + modifiers: tOptional(tArray(tEnum(["Alt", "Control", "ControlOrMeta", "Meta", "Shift"]))), + position: tOptional(tType("Point")), + delay: tOptional(tFloat), + button: tOptional(tEnum(["left", "right", "middle"])), + timeout: tFloat, + trial: tOptional(tBoolean), + steps: tOptional(tInt) + }); + scheme.ElementHandleDblclickResult = tOptional(tObject({})); + scheme.ElementHandleDispatchEventParams = tObject({ + type: tString, + eventInit: tType("SerializedArgument") + }); + scheme.ElementHandleDispatchEventResult = tOptional(tObject({})); + scheme.ElementHandleFillParams = tObject({ + value: tString, + force: tOptional(tBoolean), + timeout: tFloat + }); + scheme.ElementHandleFillResult = tOptional(tObject({})); + scheme.ElementHandleFocusParams = tOptional(tObject({})); + scheme.ElementHandleFocusResult = tOptional(tObject({})); + scheme.ElementHandleGetAttributeParams = tObject({ + name: tString + }); + scheme.ElementHandleGetAttributeResult = tObject({ + value: tOptional(tString) + }); + scheme.ElementHandleHoverParams = tObject({ + force: tOptional(tBoolean), + modifiers: tOptional(tArray(tEnum(["Alt", "Control", "ControlOrMeta", "Meta", "Shift"]))), + position: tOptional(tType("Point")), + timeout: tFloat, + trial: tOptional(tBoolean) + }); + scheme.ElementHandleHoverResult = tOptional(tObject({})); + scheme.ElementHandleInnerHTMLParams = tOptional(tObject({})); + scheme.ElementHandleInnerHTMLResult = tObject({ + value: tString + }); + scheme.ElementHandleInnerTextParams = tOptional(tObject({})); + scheme.ElementHandleInnerTextResult = tObject({ + value: tString + }); + scheme.ElementHandleInputValueParams = tOptional(tObject({})); + scheme.ElementHandleInputValueResult = tObject({ + value: tString + }); + scheme.ElementHandleIsCheckedParams = tOptional(tObject({})); + scheme.ElementHandleIsCheckedResult = tObject({ + value: tBoolean + }); + scheme.ElementHandleIsDisabledParams = tOptional(tObject({})); + scheme.ElementHandleIsDisabledResult = tObject({ + value: tBoolean + }); + scheme.ElementHandleIsEditableParams = tOptional(tObject({})); + scheme.ElementHandleIsEditableResult = tObject({ + value: tBoolean + }); + scheme.ElementHandleIsEnabledParams = tOptional(tObject({})); + scheme.ElementHandleIsEnabledResult = tObject({ + value: tBoolean + }); + scheme.ElementHandleIsHiddenParams = tOptional(tObject({})); + scheme.ElementHandleIsHiddenResult = tObject({ + value: tBoolean + }); + scheme.ElementHandleIsVisibleParams = tOptional(tObject({})); + scheme.ElementHandleIsVisibleResult = tObject({ + value: tBoolean + }); + scheme.ElementHandleOwnerFrameParams = tOptional(tObject({})); + scheme.ElementHandleOwnerFrameResult = tObject({ + frame: tOptional(tChannel(["Frame"])) + }); + scheme.ElementHandlePressParams = tObject({ + key: tString, + delay: tOptional(tFloat), + timeout: tFloat, + noWaitAfter: tOptional(tBoolean) + }); + scheme.ElementHandlePressResult = tOptional(tObject({})); + scheme.ElementHandleQuerySelectorParams = tObject({ + selector: tString, + strict: tOptional(tBoolean) + }); + scheme.ElementHandleQuerySelectorResult = tObject({ + element: tOptional(tChannel(["ElementHandle"])) + }); + scheme.ElementHandleQuerySelectorAllParams = tObject({ + selector: tString + }); + scheme.ElementHandleQuerySelectorAllResult = tObject({ + elements: tArray(tChannel(["ElementHandle"])) + }); + scheme.ElementHandleScreenshotParams = tObject({ + timeout: tFloat, + type: tOptional(tEnum(["png", "jpeg"])), + quality: tOptional(tInt), + omitBackground: tOptional(tBoolean), + caret: tOptional(tEnum(["hide", "initial"])), + animations: tOptional(tEnum(["disabled", "allow"])), + scale: tOptional(tEnum(["css", "device"])), + mask: tOptional(tArray(tObject({ + frame: tChannel(["Frame"]), + selector: tString + }))), + maskColor: tOptional(tString), + style: tOptional(tString) + }); + scheme.ElementHandleScreenshotResult = tObject({ + binary: tBinary + }); + scheme.ElementHandleScrollIntoViewIfNeededParams = tObject({ + timeout: tFloat + }); + scheme.ElementHandleScrollIntoViewIfNeededResult = tOptional(tObject({})); + scheme.ElementHandleSelectOptionParams = tObject({ + elements: tOptional(tArray(tChannel(["ElementHandle"]))), + options: tOptional(tArray(tObject({ + valueOrLabel: tOptional(tString), + value: tOptional(tString), + label: tOptional(tString), + index: tOptional(tInt) + }))), + force: tOptional(tBoolean), + timeout: tFloat + }); + scheme.ElementHandleSelectOptionResult = tObject({ + values: tArray(tString) + }); + scheme.ElementHandleSelectTextParams = tObject({ + force: tOptional(tBoolean), + timeout: tFloat + }); + scheme.ElementHandleSelectTextResult = tOptional(tObject({})); + scheme.ElementHandleSetInputFilesParams = tObject({ + payloads: tOptional(tArray(tObject({ + name: tString, + mimeType: tOptional(tString), + buffer: tBinary + }))), + localDirectory: tOptional(tString), + directoryStream: tOptional(tChannel(["WritableStream"])), + localPaths: tOptional(tArray(tString)), + streams: tOptional(tArray(tChannel(["WritableStream"]))), + timeout: tFloat + }); + scheme.ElementHandleSetInputFilesResult = tOptional(tObject({})); + scheme.ElementHandleTapParams = tObject({ + force: tOptional(tBoolean), + modifiers: tOptional(tArray(tEnum(["Alt", "Control", "ControlOrMeta", "Meta", "Shift"]))), + position: tOptional(tType("Point")), + timeout: tFloat, + trial: tOptional(tBoolean) + }); + scheme.ElementHandleTapResult = tOptional(tObject({})); + scheme.ElementHandleTextContentParams = tOptional(tObject({})); + scheme.ElementHandleTextContentResult = tObject({ + value: tOptional(tString) + }); + scheme.ElementHandleTypeParams = tObject({ + text: tString, + delay: tOptional(tFloat), + timeout: tFloat + }); + scheme.ElementHandleTypeResult = tOptional(tObject({})); + scheme.ElementHandleUncheckParams = tObject({ + force: tOptional(tBoolean), + position: tOptional(tType("Point")), + timeout: tFloat, + trial: tOptional(tBoolean) + }); + scheme.ElementHandleUncheckResult = tOptional(tObject({})); + scheme.ElementHandleWaitForElementStateParams = tObject({ + state: tEnum(["visible", "hidden", "stable", "enabled", "disabled", "editable"]), + timeout: tFloat + }); + scheme.ElementHandleWaitForElementStateResult = tOptional(tObject({})); + scheme.ElementHandleWaitForSelectorParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tFloat, + state: tOptional(tEnum(["attached", "detached", "visible", "hidden"])) + }); + scheme.ElementHandleWaitForSelectorResult = tObject({ + element: tOptional(tChannel(["ElementHandle"])) + }); + scheme.LocalUtilsInitializer = tObject({ + deviceDescriptors: tArray(tObject({ + name: tString, + descriptor: tObject({ + userAgent: tString, + viewport: tObject({ + width: tInt, + height: tInt + }), + screen: tOptional(tObject({ + width: tInt, + height: tInt + })), + deviceScaleFactor: tFloat, + isMobile: tBoolean, + hasTouch: tBoolean, + defaultBrowserType: tEnum(["chromium", "firefox", "webkit"]) + }) + })) + }); + scheme.LocalUtilsZipParams = tObject({ + zipFile: tString, + entries: tArray(tType("NameValue")), + stacksId: tOptional(tString), + mode: tEnum(["write", "append"]), + includeSources: tBoolean, + additionalSources: tOptional(tArray(tString)) + }); + scheme.LocalUtilsZipResult = tOptional(tObject({})); + scheme.LocalUtilsHarOpenParams = tObject({ + file: tString + }); + scheme.LocalUtilsHarOpenResult = tObject({ + harId: tOptional(tString), + error: tOptional(tString) + }); + scheme.LocalUtilsHarLookupParams = tObject({ + harId: tString, + url: tString, + method: tString, + headers: tArray(tType("NameValue")), + postData: tOptional(tBinary), + isNavigationRequest: tBoolean + }); + scheme.LocalUtilsHarLookupResult = tObject({ + action: tEnum(["error", "redirect", "fulfill", "noentry"]), + message: tOptional(tString), + redirectURL: tOptional(tString), + status: tOptional(tInt), + headers: tOptional(tArray(tType("NameValue"))), + body: tOptional(tBinary) + }); + scheme.LocalUtilsHarCloseParams = tObject({ + harId: tString + }); + scheme.LocalUtilsHarCloseResult = tOptional(tObject({})); + scheme.LocalUtilsHarUnzipParams = tObject({ + zipFile: tString, + harFile: tString, + resourcesDir: tOptional(tString) + }); + scheme.LocalUtilsHarUnzipResult = tOptional(tObject({})); + scheme.LocalUtilsConnectParams = tObject({ + endpoint: tString, + headers: tOptional(tAny), + exposeNetwork: tOptional(tString), + slowMo: tOptional(tFloat), + timeout: tFloat, + socksProxyRedirectPortForTest: tOptional(tInt) + }); + scheme.LocalUtilsConnectResult = tObject({ + pipe: tChannel(["JsonPipe"]), + headers: tArray(tType("NameValue")) + }); + scheme.LocalUtilsTracingStartedParams = tObject({ + tracesDir: tOptional(tString), + traceName: tString, + live: tOptional(tBoolean) + }); + scheme.LocalUtilsTracingStartedResult = tObject({ + stacksId: tString + }); + scheme.LocalUtilsAddStackToTracingNoReplyParams = tObject({ + callData: tType("ClientSideCallMetadata") + }); + scheme.LocalUtilsAddStackToTracingNoReplyResult = tOptional(tObject({})); + scheme.LocalUtilsTraceDiscardedParams = tObject({ + stacksId: tString + }); + scheme.LocalUtilsTraceDiscardedResult = tOptional(tObject({})); + scheme.LocalUtilsGlobToRegexParams = tObject({ + glob: tString, + baseURL: tOptional(tString), + webSocketUrl: tOptional(tBoolean) + }); + scheme.LocalUtilsGlobToRegexResult = tObject({ + regex: tString + }); + scheme.SetNetworkCookie = tObject({ + name: tString, + value: tString, + url: tOptional(tString), + domain: tOptional(tString), + path: tOptional(tString), + expires: tOptional(tFloat), + httpOnly: tOptional(tBoolean), + secure: tOptional(tBoolean), + sameSite: tOptional(tEnum(["Strict", "Lax", "None"])), + partitionKey: tOptional(tString), + _crHasCrossSiteAncestor: tOptional(tBoolean) + }); + scheme.NetworkCookie = tObject({ + name: tString, + value: tString, + domain: tString, + path: tString, + expires: tFloat, + httpOnly: tBoolean, + secure: tBoolean, + sameSite: tEnum(["Strict", "Lax", "None"]), + partitionKey: tOptional(tString), + _crHasCrossSiteAncestor: tOptional(tBoolean) + }); + scheme.RequestInitializer = tObject({ + frame: tOptional(tChannel(["Frame"])), + serviceWorker: tOptional(tChannel(["Worker"])), + url: tString, + resourceType: tString, + method: tString, + postData: tOptional(tBinary), + headers: tArray(tType("NameValue")), + isNavigationRequest: tBoolean, + redirectedFrom: tOptional(tChannel(["Request"])) + }); + scheme.RequestResponseParams = tOptional(tObject({})); + scheme.RequestResponseResult = tObject({ + response: tOptional(tChannel(["Response"])) + }); + scheme.RequestRawRequestHeadersParams = tOptional(tObject({})); + scheme.RequestRawRequestHeadersResult = tObject({ + headers: tArray(tType("NameValue")) + }); + scheme.RouteInitializer = tObject({ + request: tChannel(["Request"]) + }); + scheme.RouteRedirectNavigationRequestParams = tObject({ + url: tString + }); + scheme.RouteRedirectNavigationRequestResult = tOptional(tObject({})); + scheme.RouteAbortParams = tObject({ + errorCode: tOptional(tString) + }); + scheme.RouteAbortResult = tOptional(tObject({})); + scheme.RouteContinueParams = tObject({ + url: tOptional(tString), + method: tOptional(tString), + headers: tOptional(tArray(tType("NameValue"))), + postData: tOptional(tBinary), + isFallback: tBoolean + }); + scheme.RouteContinueResult = tOptional(tObject({})); + scheme.RouteFulfillParams = tObject({ + status: tOptional(tInt), + headers: tOptional(tArray(tType("NameValue"))), + body: tOptional(tString), + isBase64: tOptional(tBoolean), + fetchResponseUid: tOptional(tString) + }); + scheme.RouteFulfillResult = tOptional(tObject({})); + scheme.WebSocketRouteInitializer = tObject({ + url: tString, + protocols: tArray(tString) + }); + scheme.WebSocketRouteMessageFromPageEvent = tObject({ + message: tString, + isBase64: tBoolean + }); + scheme.WebSocketRouteMessageFromServerEvent = tObject({ + message: tString, + isBase64: tBoolean + }); + scheme.WebSocketRouteClosePageEvent = tObject({ + code: tOptional(tInt), + reason: tOptional(tString), + wasClean: tBoolean + }); + scheme.WebSocketRouteCloseServerEvent = tObject({ + code: tOptional(tInt), + reason: tOptional(tString), + wasClean: tBoolean + }); + scheme.WebSocketRouteConnectParams = tOptional(tObject({})); + scheme.WebSocketRouteConnectResult = tOptional(tObject({})); + scheme.WebSocketRouteEnsureOpenedParams = tOptional(tObject({})); + scheme.WebSocketRouteEnsureOpenedResult = tOptional(tObject({})); + scheme.WebSocketRouteSendToPageParams = tObject({ + message: tString, + isBase64: tBoolean + }); + scheme.WebSocketRouteSendToPageResult = tOptional(tObject({})); + scheme.WebSocketRouteSendToServerParams = tObject({ + message: tString, + isBase64: tBoolean + }); + scheme.WebSocketRouteSendToServerResult = tOptional(tObject({})); + scheme.WebSocketRouteClosePageParams = tObject({ + code: tOptional(tInt), + reason: tOptional(tString), + wasClean: tBoolean + }); + scheme.WebSocketRouteClosePageResult = tOptional(tObject({})); + scheme.WebSocketRouteCloseServerParams = tObject({ + code: tOptional(tInt), + reason: tOptional(tString), + wasClean: tBoolean + }); + scheme.WebSocketRouteCloseServerResult = tOptional(tObject({})); + scheme.ResourceTiming = tObject({ + startTime: tFloat, + domainLookupStart: tFloat, + domainLookupEnd: tFloat, + connectStart: tFloat, + secureConnectionStart: tFloat, + connectEnd: tFloat, + requestStart: tFloat, + responseStart: tFloat + }); + scheme.ResponseInitializer = tObject({ + request: tChannel(["Request"]), + url: tString, + status: tInt, + statusText: tString, + headers: tArray(tType("NameValue")), + timing: tType("ResourceTiming"), + fromServiceWorker: tBoolean + }); + scheme.ResponseBodyParams = tOptional(tObject({})); + scheme.ResponseBodyResult = tObject({ + binary: tBinary + }); + scheme.ResponseSecurityDetailsParams = tOptional(tObject({})); + scheme.ResponseSecurityDetailsResult = tObject({ + value: tOptional(tType("SecurityDetails")) + }); + scheme.ResponseServerAddrParams = tOptional(tObject({})); + scheme.ResponseServerAddrResult = tObject({ + value: tOptional(tType("RemoteAddr")) + }); + scheme.ResponseRawResponseHeadersParams = tOptional(tObject({})); + scheme.ResponseRawResponseHeadersResult = tObject({ + headers: tArray(tType("NameValue")) + }); + scheme.ResponseHttpVersionParams = tOptional(tObject({})); + scheme.ResponseHttpVersionResult = tObject({ + value: tString + }); + scheme.ResponseSizesParams = tOptional(tObject({})); + scheme.ResponseSizesResult = tObject({ + sizes: tType("RequestSizes") + }); + scheme.SecurityDetails = tObject({ + issuer: tOptional(tString), + protocol: tOptional(tString), + subjectName: tOptional(tString), + validFrom: tOptional(tFloat), + validTo: tOptional(tFloat) + }); + scheme.RequestSizes = tObject({ + requestBodySize: tInt, + requestHeadersSize: tInt, + responseBodySize: tInt, + responseHeadersSize: tInt + }); + scheme.RemoteAddr = tObject({ + ipAddress: tString, + port: tInt + }); + scheme.WebSocketInitializer = tObject({ + url: tString + }); + scheme.WebSocketOpenEvent = tOptional(tObject({})); + scheme.WebSocketFrameSentEvent = tObject({ + opcode: tInt, + data: tString + }); + scheme.WebSocketFrameReceivedEvent = tObject({ + opcode: tInt, + data: tString + }); + scheme.WebSocketSocketErrorEvent = tObject({ + error: tString + }); + scheme.WebSocketCloseEvent = tOptional(tObject({})); + scheme.PageInitializer = tObject({ + mainFrame: tChannel(["Frame"]), + viewportSize: tOptional(tObject({ + width: tInt, + height: tInt + })), + isClosed: tBoolean, + opener: tOptional(tChannel(["Page"])), + video: tOptional(tChannel(["Artifact"])) + }); + scheme.PageBindingCallEvent = tObject({ + binding: tChannel(["BindingCall"]) + }); + scheme.PageCloseEvent = tOptional(tObject({})); + scheme.PageCrashEvent = tOptional(tObject({})); + scheme.PageDownloadEvent = tObject({ + url: tString, + suggestedFilename: tString, + artifact: tChannel(["Artifact"]) + }); + scheme.PageViewportSizeChangedEvent = tObject({ + viewportSize: tOptional(tObject({ + width: tInt, + height: tInt + })) + }); + scheme.PageFileChooserEvent = tObject({ + element: tChannel(["ElementHandle"]), + isMultiple: tBoolean + }); + scheme.PageFrameAttachedEvent = tObject({ + frame: tChannel(["Frame"]) + }); + scheme.PageFrameDetachedEvent = tObject({ + frame: tChannel(["Frame"]) + }); + scheme.PageLocatorHandlerTriggeredEvent = tObject({ + uid: tInt + }); + scheme.PageRouteEvent = tObject({ + route: tChannel(["Route"]) + }); + scheme.PageScreencastFrameEvent = tObject({ + data: tBinary, + timestamp: tFloat, + viewportWidth: tInt, + viewportHeight: tInt + }); + scheme.PageWebSocketRouteEvent = tObject({ + webSocketRoute: tChannel(["WebSocketRoute"]) + }); + scheme.PageWebSocketEvent = tObject({ + webSocket: tChannel(["WebSocket"]) + }); + scheme.PageWorkerEvent = tObject({ + worker: tChannel(["Worker"]) + }); + scheme.PageAddInitScriptParams = tObject({ + source: tString + }); + scheme.PageAddInitScriptResult = tObject({ + disposable: tChannel(["Disposable"]) + }); + scheme.PageCloseParams = tObject({ + reason: tOptional(tString) + }); + scheme.PageCloseResult = tOptional(tObject({})); + scheme.PageRunBeforeUnloadParams = tOptional(tObject({})); + scheme.PageRunBeforeUnloadResult = tOptional(tObject({})); + scheme.PageClearConsoleMessagesParams = tOptional(tObject({})); + scheme.PageClearConsoleMessagesResult = tOptional(tObject({})); + scheme.PageConsoleMessagesParams = tObject({ + filter: tOptional(tType("ConsoleMessagesFilter")) + }); + scheme.PageConsoleMessagesResult = tObject({ + messages: tArray(tObject({ + type: tString, + text: tString, + args: tArray(tChannel(["ElementHandle", "JSHandle"])), + location: tObject({ + url: tString, + lineNumber: tInt, + columnNumber: tInt + }), + timestamp: tFloat + })) + }); + scheme.PageEmulateMediaParams = tObject({ + media: tOptional(tEnum(["screen", "print", "no-override"])), + colorScheme: tOptional(tEnum(["dark", "light", "no-preference", "no-override"])), + reducedMotion: tOptional(tEnum(["reduce", "no-preference", "no-override"])), + forcedColors: tOptional(tEnum(["active", "none", "no-override"])), + contrast: tOptional(tEnum(["no-preference", "more", "no-override"])) + }); + scheme.PageEmulateMediaResult = tOptional(tObject({})); + scheme.PageExposeBindingParams = tObject({ + name: tString + }); + scheme.PageExposeBindingResult = tObject({ + disposable: tChannel(["Disposable"]) + }); + scheme.PageGoBackParams = tObject({ + timeout: tFloat, + waitUntil: tOptional(tType("LifecycleEvent")) + }); + scheme.PageGoBackResult = tObject({ + response: tOptional(tChannel(["Response"])) + }); + scheme.PageGoForwardParams = tObject({ + timeout: tFloat, + waitUntil: tOptional(tType("LifecycleEvent")) + }); + scheme.PageGoForwardResult = tObject({ + response: tOptional(tChannel(["Response"])) + }); + scheme.PageRequestGCParams = tOptional(tObject({})); + scheme.PageRequestGCResult = tOptional(tObject({})); + scheme.PageRegisterLocatorHandlerParams = tObject({ + selector: tString, + noWaitAfter: tOptional(tBoolean) + }); + scheme.PageRegisterLocatorHandlerResult = tObject({ + uid: tInt + }); + scheme.PageResolveLocatorHandlerNoReplyParams = tObject({ + uid: tInt, + remove: tOptional(tBoolean) + }); + scheme.PageResolveLocatorHandlerNoReplyResult = tOptional(tObject({})); + scheme.PageUnregisterLocatorHandlerParams = tObject({ + uid: tInt + }); + scheme.PageUnregisterLocatorHandlerResult = tOptional(tObject({})); + scheme.PageReloadParams = tObject({ + timeout: tFloat, + waitUntil: tOptional(tType("LifecycleEvent")) + }); + scheme.PageReloadResult = tObject({ + response: tOptional(tChannel(["Response"])) + }); + scheme.PageExpectScreenshotParams = tObject({ + expected: tOptional(tBinary), + timeout: tFloat, + isNot: tBoolean, + locator: tOptional(tObject({ + frame: tChannel(["Frame"]), + selector: tString + })), + comparator: tOptional(tString), + maxDiffPixels: tOptional(tInt), + maxDiffPixelRatio: tOptional(tFloat), + threshold: tOptional(tFloat), + fullPage: tOptional(tBoolean), + clip: tOptional(tType("Rect")), + omitBackground: tOptional(tBoolean), + caret: tOptional(tEnum(["hide", "initial"])), + animations: tOptional(tEnum(["disabled", "allow"])), + scale: tOptional(tEnum(["css", "device"])), + mask: tOptional(tArray(tObject({ + frame: tChannel(["Frame"]), + selector: tString + }))), + maskColor: tOptional(tString), + style: tOptional(tString) + }); + scheme.PageExpectScreenshotResult = tObject({ + actual: tOptional(tBinary) + }); + scheme.PageExpectScreenshotErrorDetails = tObject({ + diff: tOptional(tBinary), + customErrorMessage: tOptional(tString), + actual: tOptional(tBinary), + previous: tOptional(tBinary), + timedOut: tOptional(tBoolean), + log: tOptional(tArray(tString)) + }); + scheme.PageScreenshotParams = tObject({ + timeout: tFloat, + type: tOptional(tEnum(["png", "jpeg"])), + quality: tOptional(tInt), + fullPage: tOptional(tBoolean), + clip: tOptional(tType("Rect")), + omitBackground: tOptional(tBoolean), + caret: tOptional(tEnum(["hide", "initial"])), + animations: tOptional(tEnum(["disabled", "allow"])), + scale: tOptional(tEnum(["css", "device"])), + mask: tOptional(tArray(tObject({ + frame: tChannel(["Frame"]), + selector: tString + }))), + maskColor: tOptional(tString), + style: tOptional(tString) + }); + scheme.PageScreenshotResult = tObject({ + binary: tBinary + }); + scheme.PageSetExtraHTTPHeadersParams = tObject({ + headers: tArray(tType("NameValue")) + }); + scheme.PageSetExtraHTTPHeadersResult = tOptional(tObject({})); + scheme.PageSetNetworkInterceptionPatternsParams = tObject({ + patterns: tArray(tObject({ + glob: tOptional(tString), + regexSource: tOptional(tString), + regexFlags: tOptional(tString), + urlPattern: tOptional(tType("URLPattern")) + })) + }); + scheme.PageSetNetworkInterceptionPatternsResult = tOptional(tObject({})); + scheme.PageSetWebSocketInterceptionPatternsParams = tObject({ + patterns: tArray(tObject({ + glob: tOptional(tString), + regexSource: tOptional(tString), + regexFlags: tOptional(tString), + urlPattern: tOptional(tType("URLPattern")) + })) + }); + scheme.PageSetWebSocketInterceptionPatternsResult = tOptional(tObject({})); + scheme.PageSetViewportSizeParams = tObject({ + viewportSize: tObject({ + width: tInt, + height: tInt + }) + }); + scheme.PageSetViewportSizeResult = tOptional(tObject({})); + scheme.PageKeyboardDownParams = tObject({ + key: tString + }); + scheme.PageKeyboardDownResult = tOptional(tObject({})); + scheme.PageKeyboardUpParams = tObject({ + key: tString + }); + scheme.PageKeyboardUpResult = tOptional(tObject({})); + scheme.PageKeyboardInsertTextParams = tObject({ + text: tString + }); + scheme.PageKeyboardInsertTextResult = tOptional(tObject({})); + scheme.PageKeyboardTypeParams = tObject({ + text: tString, + delay: tOptional(tFloat) + }); + scheme.PageKeyboardTypeResult = tOptional(tObject({})); + scheme.PageKeyboardPressParams = tObject({ + key: tString, + delay: tOptional(tFloat) + }); + scheme.PageKeyboardPressResult = tOptional(tObject({})); + scheme.PageMouseMoveParams = tObject({ + x: tFloat, + y: tFloat, + steps: tOptional(tInt) + }); + scheme.PageMouseMoveResult = tOptional(tObject({})); + scheme.PageMouseDownParams = tObject({ + button: tOptional(tEnum(["left", "right", "middle"])), + clickCount: tOptional(tInt) + }); + scheme.PageMouseDownResult = tOptional(tObject({})); + scheme.PageMouseUpParams = tObject({ + button: tOptional(tEnum(["left", "right", "middle"])), + clickCount: tOptional(tInt) + }); + scheme.PageMouseUpResult = tOptional(tObject({})); + scheme.PageMouseClickParams = tObject({ + x: tFloat, + y: tFloat, + delay: tOptional(tFloat), + button: tOptional(tEnum(["left", "right", "middle"])), + clickCount: tOptional(tInt) + }); + scheme.PageMouseClickResult = tOptional(tObject({})); + scheme.PageMouseWheelParams = tObject({ + deltaX: tFloat, + deltaY: tFloat + }); + scheme.PageMouseWheelResult = tOptional(tObject({})); + scheme.PageTouchscreenTapParams = tObject({ + x: tFloat, + y: tFloat + }); + scheme.PageTouchscreenTapResult = tOptional(tObject({})); + scheme.PageClearPageErrorsParams = tOptional(tObject({})); + scheme.PageClearPageErrorsResult = tOptional(tObject({})); + scheme.PagePageErrorsParams = tObject({ + filter: tOptional(tType("ConsoleMessagesFilter")) + }); + scheme.PagePageErrorsResult = tObject({ + errors: tArray(tType("SerializedError")) + }); + scheme.PagePdfParams = tObject({ + scale: tOptional(tFloat), + displayHeaderFooter: tOptional(tBoolean), + headerTemplate: tOptional(tString), + footerTemplate: tOptional(tString), + printBackground: tOptional(tBoolean), + landscape: tOptional(tBoolean), + pageRanges: tOptional(tString), + format: tOptional(tString), + width: tOptional(tString), + height: tOptional(tString), + preferCSSPageSize: tOptional(tBoolean), + margin: tOptional(tObject({ + top: tOptional(tString), + bottom: tOptional(tString), + left: tOptional(tString), + right: tOptional(tString) + })), + tagged: tOptional(tBoolean), + outline: tOptional(tBoolean) + }); + scheme.PagePdfResult = tObject({ + pdf: tBinary + }); + scheme.PageRequestsParams = tOptional(tObject({})); + scheme.PageRequestsResult = tObject({ + requests: tArray(tChannel(["Request"])) + }); + scheme.PageStartJSCoverageParams = tObject({ + resetOnNavigation: tOptional(tBoolean), + reportAnonymousScripts: tOptional(tBoolean) + }); + scheme.PageStartJSCoverageResult = tOptional(tObject({})); + scheme.PageStopJSCoverageParams = tOptional(tObject({})); + scheme.PageStopJSCoverageResult = tObject({ + entries: tArray(tObject({ + url: tString, + scriptId: tString, + source: tOptional(tString), + functions: tArray(tObject({ + functionName: tString, + isBlockCoverage: tBoolean, + ranges: tArray(tObject({ + startOffset: tInt, + endOffset: tInt, + count: tInt + })) + })) + })) + }); + scheme.PageStartCSSCoverageParams = tObject({ + resetOnNavigation: tOptional(tBoolean) + }); + scheme.PageStartCSSCoverageResult = tOptional(tObject({})); + scheme.PageStopCSSCoverageParams = tOptional(tObject({})); + scheme.PageStopCSSCoverageResult = tObject({ + entries: tArray(tObject({ + url: tString, + text: tOptional(tString), + ranges: tArray(tObject({ + start: tInt, + end: tInt + })) + })) + }); + scheme.PageBringToFrontParams = tOptional(tObject({})); + scheme.PageBringToFrontResult = tOptional(tObject({})); + scheme.PagePickLocatorParams = tOptional(tObject({})); + scheme.PagePickLocatorResult = tObject({ + selector: tString + }); + scheme.PageCancelPickLocatorParams = tOptional(tObject({})); + scheme.PageCancelPickLocatorResult = tOptional(tObject({})); + scheme.PageHideHighlightParams = tOptional(tObject({})); + scheme.PageHideHighlightResult = tOptional(tObject({})); + scheme.PageScreencastShowOverlayParams = tObject({ + html: tString, + duration: tOptional(tFloat) + }); + scheme.PageScreencastShowOverlayResult = tObject({ + id: tString + }); + scheme.PageScreencastRemoveOverlayParams = tObject({ + id: tString + }); + scheme.PageScreencastRemoveOverlayResult = tOptional(tObject({})); + scheme.PageScreencastChapterParams = tObject({ + title: tString, + description: tOptional(tString), + duration: tOptional(tFloat) + }); + scheme.PageScreencastChapterResult = tOptional(tObject({})); + scheme.PageScreencastSetOverlayVisibleParams = tObject({ + visible: tBoolean + }); + scheme.PageScreencastSetOverlayVisibleResult = tOptional(tObject({})); + scheme.PageScreencastShowActionsParams = tObject({ + duration: tOptional(tFloat), + position: tOptional(tEnum(["top-left", "top", "top-right", "bottom-left", "bottom", "bottom-right"])), + fontSize: tOptional(tInt), + cursor: tOptional(tEnum(["none", "pointer"])) + }); + scheme.PageScreencastShowActionsResult = tOptional(tObject({})); + scheme.PageScreencastHideActionsParams = tOptional(tObject({})); + scheme.PageScreencastHideActionsResult = tOptional(tObject({})); + scheme.PageScreencastStartParams = tObject({ + size: tOptional(tObject({ + width: tInt, + height: tInt + })), + quality: tOptional(tInt), + sendFrames: tOptional(tBoolean), + record: tOptional(tBoolean) + }); + scheme.PageScreencastStartResult = tObject({ + artifact: tOptional(tChannel(["Artifact"])) + }); + scheme.PageScreencastStopParams = tOptional(tObject({})); + scheme.PageScreencastStopResult = tOptional(tObject({})); + scheme.PageUpdateSubscriptionParams = tObject({ + event: tEnum(["console", "dialog", "fileChooser", "request", "response", "requestFinished", "requestFailed"]), + enabled: tBoolean + }); + scheme.PageUpdateSubscriptionResult = tOptional(tObject({})); + scheme.PageSetDockTileParams = tObject({ + image: tBinary + }); + scheme.PageSetDockTileResult = tOptional(tObject({})); + scheme.PageWebStorageItemsParams = tObject({ + kind: tEnum(["local", "session"]) + }); + scheme.PageWebStorageItemsResult = tObject({ + items: tArray(tType("NameValue")) + }); + scheme.PageWebStorageGetItemParams = tObject({ + kind: tEnum(["local", "session"]), + name: tString + }); + scheme.PageWebStorageGetItemResult = tObject({ + value: tOptional(tString) + }); + scheme.PageWebStorageSetItemParams = tObject({ + kind: tEnum(["local", "session"]), + name: tString, + value: tString + }); + scheme.PageWebStorageSetItemResult = tOptional(tObject({})); + scheme.PageWebStorageRemoveItemParams = tObject({ + kind: tEnum(["local", "session"]), + name: tString + }); + scheme.PageWebStorageRemoveItemResult = tOptional(tObject({})); + scheme.PageWebStorageClearParams = tObject({ + kind: tEnum(["local", "session"]) + }); + scheme.PageWebStorageClearResult = tOptional(tObject({})); + scheme.RootInitializer = tOptional(tObject({})); + scheme.RootInitializeParams = tObject({ + sdkLanguage: tType("SDKLanguage") + }); + scheme.RootInitializeResult = tObject({ + playwright: tChannel(["Playwright"]) + }); + scheme.PlaywrightInitializer = tObject({ + chromium: tChannel(["BrowserType"]), + firefox: tChannel(["BrowserType"]), + webkit: tChannel(["BrowserType"]), + android: tChannel(["Android"]), + electron: tChannel(["Electron"]), + utils: tOptional(tChannel(["LocalUtils"])), + preLaunchedBrowser: tOptional(tChannel(["Browser"])), + preConnectedAndroidDevice: tOptional(tChannel(["AndroidDevice"])), + socksSupport: tOptional(tChannel(["SocksSupport"])) + }); + scheme.PlaywrightNewRequestParams = tObject({ + baseURL: tOptional(tString), + userAgent: tOptional(tString), + ignoreHTTPSErrors: tOptional(tBoolean), + extraHTTPHeaders: tOptional(tArray(tType("NameValue"))), + failOnStatusCode: tOptional(tBoolean), + clientCertificates: tOptional(tArray(tObject({ + origin: tString, + cert: tOptional(tBinary), + key: tOptional(tBinary), + passphrase: tOptional(tString), + pfx: tOptional(tBinary) + }))), + maxRedirects: tOptional(tInt), + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + origin: tOptional(tString), + send: tOptional(tEnum(["always", "unauthorized"])) + })), + proxy: tOptional(tObject({ + server: tString, + bypass: tOptional(tString), + username: tOptional(tString), + password: tOptional(tString) + })), + storageState: tOptional(tObject({ + cookies: tOptional(tArray(tType("NetworkCookie"))), + origins: tOptional(tArray(tType("SetOriginStorage"))) + })), + tracesDir: tOptional(tString) + }); + scheme.PlaywrightNewRequestResult = tObject({ + request: tChannel(["APIRequestContext"]) + }); + scheme.DebugControllerInitializer = tOptional(tObject({})); + scheme.DebugControllerInspectRequestedEvent = tObject({ + selector: tString, + locator: tString, + ariaSnapshot: tString + }); + scheme.DebugControllerSetModeRequestedEvent = tObject({ + mode: tString + }); + scheme.DebugControllerStateChangedEvent = tObject({ + pageCount: tInt + }); + scheme.DebugControllerSourceChangedEvent = tObject({ + text: tString, + header: tOptional(tString), + footer: tOptional(tString), + actions: tOptional(tArray(tString)) + }); + scheme.DebugControllerPausedEvent = tObject({ + paused: tBoolean + }); + scheme.DebugControllerInitializeParams = tObject({ + codegenId: tString, + sdkLanguage: tType("SDKLanguage") + }); + scheme.DebugControllerInitializeResult = tOptional(tObject({})); + scheme.DebugControllerSetReportStateChangedParams = tObject({ + enabled: tBoolean + }); + scheme.DebugControllerSetReportStateChangedResult = tOptional(tObject({})); + scheme.DebugControllerSetRecorderModeParams = tObject({ + mode: tEnum(["inspecting", "recording", "none"]), + testIdAttributeName: tOptional(tString), + generateAutoExpect: tOptional(tBoolean) + }); + scheme.DebugControllerSetRecorderModeResult = tOptional(tObject({})); + scheme.DebugControllerHighlightParams = tObject({ + selector: tOptional(tString), + ariaTemplate: tOptional(tString) + }); + scheme.DebugControllerHighlightResult = tOptional(tObject({})); + scheme.DebugControllerHideHighlightParams = tOptional(tObject({})); + scheme.DebugControllerHideHighlightResult = tOptional(tObject({})); + scheme.DebugControllerResumeParams = tOptional(tObject({})); + scheme.DebugControllerResumeResult = tOptional(tObject({})); + scheme.DebugControllerKillParams = tOptional(tObject({})); + scheme.DebugControllerKillResult = tOptional(tObject({})); + scheme.SocksSupportInitializer = tOptional(tObject({})); + scheme.SocksSupportSocksRequestedEvent = tObject({ + uid: tString, + host: tString, + port: tInt + }); + scheme.SocksSupportSocksDataEvent = tObject({ + uid: tString, + data: tBinary + }); + scheme.SocksSupportSocksClosedEvent = tObject({ + uid: tString + }); + scheme.SocksSupportSocksConnectedParams = tObject({ + uid: tString, + host: tString, + port: tInt + }); + scheme.SocksSupportSocksConnectedResult = tOptional(tObject({})); + scheme.SocksSupportSocksFailedParams = tObject({ + uid: tString, + errorCode: tString + }); + scheme.SocksSupportSocksFailedResult = tOptional(tObject({})); + scheme.SocksSupportSocksDataParams = tObject({ + uid: tString, + data: tBinary + }); + scheme.SocksSupportSocksDataResult = tOptional(tObject({})); + scheme.SocksSupportSocksErrorParams = tObject({ + uid: tString, + error: tString + }); + scheme.SocksSupportSocksErrorResult = tOptional(tObject({})); + scheme.SocksSupportSocksEndParams = tObject({ + uid: tString + }); + scheme.SocksSupportSocksEndResult = tOptional(tObject({})); + scheme.JsonPipeInitializer = tOptional(tObject({})); + scheme.JsonPipeMessageEvent = tObject({ + message: tAny + }); + scheme.JsonPipeClosedEvent = tObject({ + reason: tOptional(tString) + }); + scheme.JsonPipeSendParams = tObject({ + message: tAny + }); + scheme.JsonPipeSendResult = tOptional(tObject({})); + scheme.JsonPipeCloseParams = tOptional(tObject({})); + scheme.JsonPipeCloseResult = tOptional(tObject({})); + scheme.ExpectedTextValue = tObject({ + string: tOptional(tString), + regexSource: tOptional(tString), + regexFlags: tOptional(tString), + matchSubstring: tOptional(tBoolean), + ignoreCase: tOptional(tBoolean), + normalizeWhiteSpace: tOptional(tBoolean) + }); + scheme.SelectorEngine = tObject({ + name: tString, + source: tString, + contentScript: tOptional(tBoolean) + }); + scheme.FormField = tObject({ + name: tString, + value: tOptional(tString), + file: tOptional(tObject({ + name: tString, + mimeType: tOptional(tString), + buffer: tBinary + })) + }); + scheme.LifecycleEvent = tEnum(["load", "domcontentloaded", "networkidle", "commit"]); + scheme.ConsoleMessagesFilter = tEnum(["all", "since-navigation"]); + scheme.RecorderSource = tObject({ + isRecorded: tBoolean, + id: tString, + label: tString, + text: tString, + language: tString, + highlight: tArray(tObject({ + line: tInt, + type: tString + })), + revealLine: tOptional(tInt), + group: tOptional(tString) + }); + scheme.IndexedDBDatabase = tObject({ + name: tString, + version: tInt, + stores: tArray(tObject({ + name: tString, + autoIncrement: tBoolean, + keyPath: tOptional(tString), + keyPathArray: tOptional(tArray(tString)), + records: tArray(tObject({ + key: tOptional(tAny), + keyEncoded: tOptional(tAny), + value: tOptional(tAny), + valueEncoded: tOptional(tAny) + })), + indexes: tArray(tObject({ + name: tString, + keyPath: tOptional(tString), + keyPathArray: tOptional(tArray(tString)), + multiEntry: tBoolean, + unique: tBoolean + })) + })) + }); + scheme.SetOriginStorage = tObject({ + origin: tString, + localStorage: tArray(tType("NameValue")), + indexedDB: tOptional(tArray(tType("IndexedDBDatabase"))) + }); + scheme.OriginStorage = tObject({ + origin: tString, + localStorage: tArray(tType("NameValue")), + indexedDB: tOptional(tArray(tType("IndexedDBDatabase"))) + }); + scheme.RecordHarOptions = tObject({ + content: tOptional(tEnum(["embed", "attach", "omit"])), + mode: tOptional(tEnum(["full", "minimal"])), + urlGlob: tOptional(tString), + urlRegexSource: tOptional(tString), + urlRegexFlags: tOptional(tString), + harPath: tOptional(tString), + resourcesDir: tOptional(tString) + }); + scheme.CDPSessionInitializer = tOptional(tObject({})); + scheme.CDPSessionEventEvent = tObject({ + method: tString, + params: tOptional(tAny) + }); + scheme.CDPSessionCloseEvent = tOptional(tObject({})); + scheme.CDPSessionSendParams = tObject({ + method: tString, + params: tOptional(tAny) + }); + scheme.CDPSessionSendResult = tObject({ + result: tAny + }); + scheme.CDPSessionDetachParams = tOptional(tObject({})); + scheme.CDPSessionDetachResult = tOptional(tObject({})); + scheme.BindingCallInitializer = tObject({ + frame: tChannel(["Frame"]), + name: tString, + args: tArray(tType("SerializedValue")) + }); + scheme.BindingCallRejectParams = tObject({ + error: tType("SerializedError") + }); + scheme.BindingCallRejectResult = tOptional(tObject({})); + scheme.BindingCallResolveParams = tObject({ + result: tType("SerializedArgument") + }); + scheme.BindingCallResolveResult = tOptional(tObject({})); + scheme.DebuggerInitializer = tOptional(tObject({})); + scheme.DebuggerPausedStateChangedEvent = tObject({ + pausedDetails: tOptional(tObject({ + location: tObject({ + file: tString, + line: tOptional(tInt), + column: tOptional(tInt) + }), + title: tString, + stack: tOptional(tString) + })) + }); + scheme.DebuggerRequestPauseParams = tOptional(tObject({})); + scheme.DebuggerRequestPauseResult = tOptional(tObject({})); + scheme.DebuggerResumeParams = tOptional(tObject({})); + scheme.DebuggerResumeResult = tOptional(tObject({})); + scheme.DebuggerNextParams = tOptional(tObject({})); + scheme.DebuggerNextResult = tOptional(tObject({})); + scheme.DebuggerRunToParams = tObject({ + location: tObject({ + file: tString, + line: tOptional(tInt), + column: tOptional(tInt) + }) + }); + scheme.DebuggerRunToResult = tOptional(tObject({})); + scheme.DialogInitializer = tObject({ + page: tOptional(tChannel(["Page"])), + type: tString, + message: tString, + defaultValue: tString + }); + scheme.DialogAcceptParams = tObject({ + promptText: tOptional(tString) + }); + scheme.DialogAcceptResult = tOptional(tObject({})); + scheme.DialogDismissParams = tOptional(tObject({})); + scheme.DialogDismissResult = tOptional(tObject({})); + scheme.SerializedValue = tObject({ + n: tOptional(tFloat), + b: tOptional(tBoolean), + s: tOptional(tString), + v: tOptional(tEnum(["null", "undefined", "NaN", "Infinity", "-Infinity", "-0"])), + d: tOptional(tString), + u: tOptional(tString), + bi: tOptional(tString), + ta: tOptional(tObject({ + b: tBinary, + k: tEnum(["i8", "ui8", "ui8c", "i16", "ui16", "i32", "ui32", "f32", "f64", "bi64", "bui64"]) + })), + e: tOptional(tObject({ + m: tString, + n: tString, + s: tString + })), + r: tOptional(tObject({ + p: tString, + f: tString + })), + a: tOptional(tArray(tType("SerializedValue"))), + o: tOptional(tArray(tObject({ + k: tString, + v: tType("SerializedValue") + }))), + h: tOptional(tInt), + id: tOptional(tInt), + ref: tOptional(tInt) + }); + scheme.SerializedArgument = tObject({ + value: tType("SerializedValue"), + handles: tArray(tChannel("*")) + }); + scheme.SerializedError = tObject({ + error: tOptional(tObject({ + message: tString, + name: tString, + stack: tOptional(tString) + })), + value: tOptional(tType("SerializedValue")) + }); + scheme.StackFrame = tObject({ + file: tString, + line: tInt, + column: tInt, + function: tOptional(tString) + }); + scheme.VirtualCredential = tObject({ + id: tString, + rpId: tString, + userHandle: tString, + privateKey: tString, + publicKey: tString + }); + scheme.Point = tObject({ + x: tFloat, + y: tFloat + }); + scheme.Rect = tObject({ + x: tFloat, + y: tFloat, + width: tFloat, + height: tFloat + }); + scheme.URLPattern = tObject({ + hash: tString, + hostname: tString, + password: tString, + pathname: tString, + port: tString, + protocol: tString, + search: tString, + username: tString + }); + scheme.NameValue = tObject({ + name: tString, + value: tString + }); + scheme.TracingInitializer = tOptional(tObject({})); + scheme.TracingTracingStartParams = tObject({ + name: tOptional(tString), + snapshots: tOptional(tBoolean), + screenshots: tOptional(tBoolean), + live: tOptional(tBoolean) + }); + scheme.TracingTracingStartResult = tOptional(tObject({})); + scheme.TracingTracingStartChunkParams = tObject({ + name: tOptional(tString), + title: tOptional(tString) + }); + scheme.TracingTracingStartChunkResult = tObject({ + traceName: tString + }); + scheme.TracingTracingGroupParams = tObject({ + name: tString, + location: tOptional(tObject({ + file: tString, + line: tOptional(tInt), + column: tOptional(tInt) + })) + }); + scheme.TracingTracingGroupResult = tOptional(tObject({})); + scheme.TracingTracingGroupEndParams = tOptional(tObject({})); + scheme.TracingTracingGroupEndResult = tOptional(tObject({})); + scheme.TracingTracingStopChunkParams = tObject({ + mode: tEnum(["archive", "discard", "entries"]) + }); + scheme.TracingTracingStopChunkResult = tObject({ + artifact: tOptional(tChannel(["Artifact"])), + entries: tOptional(tArray(tType("NameValue"))) + }); + scheme.TracingTracingStopParams = tOptional(tObject({})); + scheme.TracingTracingStopResult = tOptional(tObject({})); + scheme.TracingHarStartParams = tObject({ + page: tOptional(tChannel(["Page"])), + options: tType("RecordHarOptions") + }); + scheme.TracingHarStartResult = tObject({ + harId: tString + }); + scheme.TracingHarExportParams = tObject({ + harId: tOptional(tString), + mode: tEnum(["archive", "entries"]) + }); + scheme.TracingHarExportResult = tObject({ + artifact: tOptional(tChannel(["Artifact"])), + entries: tOptional(tArray(tType("NameValue"))) + }); + scheme.WorkerInitializer = tObject({ + url: tString + }); + scheme.WorkerConsoleEvent = tObject({ + type: tString, + text: tString, + args: tArray(tChannel(["ElementHandle", "JSHandle"])), + location: tObject({ + url: tString, + lineNumber: tInt, + columnNumber: tInt + }), + timestamp: tFloat + }); + scheme.WorkerCloseEvent = tOptional(tObject({})); + scheme.WorkerDisconnectParams = tObject({ + reason: tOptional(tString) + }); + scheme.WorkerDisconnectResult = tOptional(tObject({})); + scheme.WorkerEvaluateExpressionParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") + }); + scheme.WorkerEvaluateExpressionResult = tObject({ + value: tType("SerializedValue") + }); + scheme.WorkerEvaluateExpressionHandleParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") + }); + scheme.WorkerEvaluateExpressionHandleResult = tObject({ + handle: tChannel(["ElementHandle", "JSHandle"]) + }); + scheme.WorkerUpdateSubscriptionParams = tObject({ + event: tEnum(["console"]), + enabled: tBoolean + }); + scheme.WorkerUpdateSubscriptionResult = tOptional(tObject({})); + } +}); + +// packages/playwright-core/src/server/protocolError.ts +function isProtocolError(e) { + return e instanceof ProtocolError; +} +function isSessionClosedError(e) { + return e instanceof ProtocolError && (e.type === "closed" || e.type === "crashed"); +} +var ProtocolError; +var init_protocolError = __esm({ + "packages/playwright-core/src/server/protocolError.ts"() { + "use strict"; + init_stackTrace(); + ProtocolError = class extends Error { + constructor(type3, method, logs) { + super(); + this.type = type3; + this.method = method; + this.logs = logs; + } + setMessage(message) { + rewriteErrorMessage(this, `Protocol error (${this.method}): ${message}`); + } + browserLogMessage() { + return this.logs ? "\nBrowser logs:\n" + this.logs : ""; + } + }; + } +}); + +// packages/playwright-core/src/server/callLog.ts +function compressCallLog(log2) { + const lines = []; + for (const block of findRepeatedSubsequences(log2)) { + for (let i = 0; i < block.sequence.length; i++) { + const line = block.sequence[i]; + const leadingWhitespace = line.match(/^\s*/); + const whitespacePrefix = " " + leadingWhitespace?.[0] || ""; + const countPrefix = `${block.count} \xD7 `; + if (block.count > 1 && i === 0) + lines.push(whitespacePrefix + countPrefix + line.trim()); + else if (block.count > 1) + lines.push(whitespacePrefix + " ".repeat(countPrefix.length - 2) + "- " + line.trim()); + else + lines.push(whitespacePrefix + "- " + line.trim()); + } + } + return lines; +} +function findRepeatedSubsequences(s) { + const n = s.length; + const result2 = []; + let i = 0; + const arraysEqual = (a1, a2) => { + if (a1.length !== a2.length) + return false; + for (let j = 0; j < a1.length; j++) { + if (a1[j] !== a2[j]) + return false; + } + return true; + }; + while (i < n) { + let maxRepeatCount = 1; + let maxRepeatSubstr = [s[i]]; + let maxRepeatLength = 1; + for (let p = 1; p <= n - i; p++) { + const substr = s.slice(i, i + p); + let k = 1; + while (i + p * k <= n && arraysEqual(s.slice(i + p * (k - 1), i + p * k), substr)) + k += 1; + k -= 1; + if (k > 1 && k * p > maxRepeatCount * maxRepeatLength) { + maxRepeatCount = k; + maxRepeatSubstr = substr; + maxRepeatLength = p; + } + } + result2.push({ sequence: maxRepeatSubstr, count: maxRepeatCount }); + i += maxRepeatLength * maxRepeatCount; + } + return result2; +} +var findRepeatedSubsequencesForTest; +var init_callLog = __esm({ + "packages/playwright-core/src/server/callLog.ts"() { + "use strict"; + findRepeatedSubsequencesForTest = findRepeatedSubsequences; + } +}); + +// packages/playwright-core/src/server/dispatchers/dispatcher.ts +function setMaxDispatchersForTest(value2) { + maxDispatchersOverride = value2; +} +function maxDispatchersForBucket(gcBucket) { + return maxDispatchersOverride ?? { + "JSHandle": 1e5, + "ElementHandle": 1e5 + }[gcBucket] ?? 1e4; +} +var import_events5, metadataValidator, waitInfoValidator, maxDispatchersOverride, Dispatcher, RootDispatcher, DispatcherConnection; +var init_dispatcher = __esm({ + "packages/playwright-core/src/server/dispatchers/dispatcher.ts"() { + "use strict"; + import_events5 = require("events"); + init_protocolMetainfo(); + init_eventsHelper(); + init_debug(); + init_assert(); + init_time(); + init_stackTrace(); + init_validator(); + init_errors(); + init_instrumentation(); + init_protocolError(); + init_callLog(); + init_progress(); + metadataValidator = createMetadataValidator(); + waitInfoValidator = createWaitInfoValidator(); + Dispatcher = class extends import_events5.EventEmitter { + constructor(parent, object, type3, initializer, gcBucket) { + super(); + this._dispatchers = /* @__PURE__ */ new Map(); + this._disposed = false; + this._eventListeners = []; + this._activeProgressControllers = /* @__PURE__ */ new Set(); + this.connection = parent instanceof DispatcherConnection ? parent : parent.connection; + this._parent = parent instanceof DispatcherConnection ? void 0 : parent; + const guid = object.guid; + this._guid = guid; + this._type = type3; + this._object = object; + this._gcBucket = gcBucket ?? type3; + this.connection.registerDispatcher(this); + if (this._parent) { + assert(!this._parent._dispatchers.has(guid)); + this._parent._dispatchers.set(guid, this); + } + if (this._parent) + this.connection.sendCreate(this._parent, type3, guid, initializer); + this.connection.maybeDisposeStaleDispatchers(this._gcBucket); + } + parentScope() { + return this._parent; + } + addObjectListener(eventName, handler) { + this._eventListeners.push(eventsHelper.addEventListener(this._object, eventName, handler)); + } + adopt(child) { + if (child._parent === this) + return; + const oldParent = child._parent; + oldParent._dispatchers.delete(child._guid); + this._dispatchers.set(child._guid, child); + child._parent = this; + this.connection.sendAdopt(this, child); + } + async _runCommand(callMetadata, method, validParams) { + const controller = ProgressController.createForSdkObject(this._object, callMetadata); + this._activeProgressControllers.add(controller); + try { + return await controller.run((progress2) => this[method](validParams, progress2), validParams?.timeout); + } finally { + this._activeProgressControllers.delete(controller); + } + } + _dispatchEvent(method, params2) { + if (this._disposed) { + if (isUnderTest()) + throw new Error(`${this._guid} is sending "${String(method)}" event after being disposed`); + return; + } + this.connection.sendEvent(this, method, params2); + } + _dispose(reason) { + this._disposeRecursively(new TargetClosedError(this._object.closeReason())); + this.connection.sendDispose(this, reason); + } + _onDispose() { + } + async stopPendingOperations(error) { + const controllers = []; + const collect = (dispatcher) => { + controllers.push(...dispatcher._activeProgressControllers); + for (const child of [...dispatcher._dispatchers.values()]) + collect(child); + }; + collect(this); + await Promise.all(controllers.map((controller) => controller.abort(error))); + } + _disposeRecursively(error) { + assert(!this._disposed, `${this._guid} is disposed more than once`); + this._onDispose(); + this._disposed = true; + eventsHelper.removeEventListeners(this._eventListeners); + this._parent?._dispatchers.delete(this._guid); + const list = this.connection._dispatchersByBucket.get(this._gcBucket); + list?.delete(this._guid); + this.connection._dispatcherByGuid.delete(this._guid); + this.connection._dispatcherByObject.delete(this._object); + for (const dispatcher of [...this._dispatchers.values()]) + dispatcher._disposeRecursively(error); + this._dispatchers.clear(); + } + _debugScopeState() { + return { + _guid: this._guid, + objects: Array.from(this._dispatchers.values()).map((o) => o._debugScopeState()) + }; + } + }; + RootDispatcher = class extends Dispatcher { + constructor(connection, createPlaywright2) { + super(connection, createRootSdkObject(), "Root", {}); + this.createPlaywright = createPlaywright2; + this._initialized = false; + } + async initialize(params2, progress2) { + assert(this.createPlaywright); + assert(!this._initialized); + this._initialized = true; + return { + playwright: await progress2.race(this.createPlaywright(this, params2)) + }; + } + }; + DispatcherConnection = class { + constructor(isInProcess) { + this._dispatcherByGuid = /* @__PURE__ */ new Map(); + this._dispatcherByObject = /* @__PURE__ */ new Map(); + this._dispatchersByBucket = /* @__PURE__ */ new Map(); + this.onmessage = (message) => { + }; + this._waitOperations = /* @__PURE__ */ new Map(); + this._isInProcess = !!isInProcess; + } + sendEvent(dispatcher, event, params2) { + const validator = findValidator(dispatcher._type, event, "Event"); + params2 = validator(params2, "", this._validatorToWireContext()); + this.onmessage({ guid: dispatcher._guid, method: event, params: params2 }); + } + sendCreate(parent, type3, guid, initializer) { + const validator = findValidator(type3, "", "Initializer"); + initializer = validator(initializer, "", this._validatorToWireContext()); + this.onmessage({ guid: parent._guid, method: "__create__", params: { type: type3, initializer, guid } }); + } + sendAdopt(parent, dispatcher) { + this.onmessage({ guid: parent._guid, method: "__adopt__", params: { guid: dispatcher._guid } }); + } + sendDispose(dispatcher, reason) { + this.onmessage({ guid: dispatcher._guid, method: "__dispose__", params: { reason } }); + } + _validatorToWireContext() { + return { + tChannelImpl: this._tChannelImplToWire.bind(this), + binary: this._isInProcess ? "buffer" : "toBase64", + isUnderTest + }; + } + _validatorFromWireContext() { + return { + tChannelImpl: this._tChannelImplFromWire.bind(this), + binary: this._isInProcess ? "buffer" : "fromBase64", + isUnderTest + }; + } + _tChannelImplFromWire(names, arg, path59, context2) { + if (arg && typeof arg === "object" && typeof arg.guid === "string") { + const guid = arg.guid; + const dispatcher = this._dispatcherByGuid.get(guid); + if (!dispatcher) + throw new ValidationError(`${path59}: no object with guid ${guid}`); + if (names !== "*" && !names.includes(dispatcher._type)) + throw new ValidationError(`${path59}: object with guid ${guid} has type ${dispatcher._type}, expected ${names.toString()}`); + return dispatcher; + } + throw new ValidationError(`${path59}: expected guid for ${names.toString()}`); + } + _tChannelImplToWire(names, arg, path59, context2) { + if (arg instanceof Dispatcher) { + if (names !== "*" && !names.includes(arg._type)) + throw new ValidationError(`${path59}: dispatcher with guid ${arg._guid} has type ${arg._type}, expected ${names.toString()}`); + return { guid: arg._guid }; + } + throw new ValidationError(`${path59}: expected dispatcher ${names.toString()}`); + } + existingDispatcher(object) { + return this._dispatcherByObject.get(object); + } + registerDispatcher(dispatcher) { + assert(!this._dispatcherByGuid.has(dispatcher._guid)); + this._dispatcherByGuid.set(dispatcher._guid, dispatcher); + this._dispatcherByObject.set(dispatcher._object, dispatcher); + let list = this._dispatchersByBucket.get(dispatcher._gcBucket); + if (!list) { + list = /* @__PURE__ */ new Set(); + this._dispatchersByBucket.set(dispatcher._gcBucket, list); + } + list.add(dispatcher._guid); + } + maybeDisposeStaleDispatchers(gcBucket) { + const maxDispatchers = maxDispatchersForBucket(gcBucket); + const list = this._dispatchersByBucket.get(gcBucket); + if (!list || list.size <= maxDispatchers) + return; + const dispatchersArray = [...list]; + const disposeCount = maxDispatchers / 10 | 0; + this._dispatchersByBucket.set(gcBucket, new Set(dispatchersArray.slice(disposeCount))); + for (let i = 0; i < disposeCount; ++i) { + const d = this._dispatcherByGuid.get(dispatchersArray[i]); + if (!d) + continue; + d._dispose("gc"); + } + } + async dispatch(message) { + const { id, guid, method, params: params2, metadata } = message; + const dispatcher = this._dispatcherByGuid.get(guid); + if (method === "__waitInfo__") { + if (dispatcher) + await this._dispatchWaitInfo(id, dispatcher, params2, metadata); + return; + } + if (!dispatcher) { + this.onmessage({ id, error: serializeError(new TargetClosedError(void 0)) }); + return; + } + let validParams; + let validMetadata; + try { + const validator = findValidator(dispatcher._type, method, "Params"); + const validatorContext = this._validatorFromWireContext(); + validParams = validator(params2, "", validatorContext); + validMetadata = metadataValidator(metadata, "", validatorContext); + if (typeof dispatcher[method] !== "function") + throw new Error(`Mismatching dispatcher: "${dispatcher._type}" does not implement "${method}"`); + } catch (e) { + this.onmessage({ id, error: serializeError(e) }); + return; + } + const metainfo = getMetainfo({ type: dispatcher._type, method }); + if (metainfo?.internal) { + validMetadata.internal = true; + } + const sdkObject = dispatcher._object; + const callMetadata = { + id: `call@${id}`, + location: validMetadata.location, + title: validMetadata.title, + internal: validMetadata.internal, + stepId: validMetadata.stepId, + objectId: sdkObject.guid, + pageId: sdkObject.attribution?.page?.guid, + frameId: sdkObject.attribution?.frame?.guid, + startTime: monotonicTime(), + endTime: 0, + type: dispatcher._type, + method, + params: params2 || {}, + log: [] + }; + await sdkObject.instrumentation.onBeforeCall(sdkObject, callMetadata); + const response2 = { id }; + try { + if (this._dispatcherByGuid.get(guid) !== dispatcher) + throw new TargetClosedError(sdkObject.closeReason()); + const result2 = await dispatcher._runCommand(callMetadata, method, validParams); + const validator = findValidator(dispatcher._type, method, "Result"); + response2.result = validator(result2, "", this._validatorToWireContext()); + callMetadata.result = result2; + } catch (e) { + if (isTargetClosedError(e)) { + const reason = sdkObject.closeReason(); + if (reason) + rewriteErrorMessage(e, reason); + } else if (isProtocolError(e)) { + if (e.type === "closed") + e = new TargetClosedError(sdkObject.closeReason(), e.browserLogMessage()); + else if (e.type === "crashed") + rewriteErrorMessage(e, "Target crashed " + e.browserLogMessage()); + } + response2.error = serializeError(e); + const detailsValidator = maybeFindValidator(dispatcher._type, method, "ErrorDetails"); + if (detailsValidator) + response2.errorDetails = detailsValidator(e?.details ?? {}, "", this._validatorToWireContext()); + callMetadata.error = response2.error; + } finally { + callMetadata.endTime = monotonicTime(); + await sdkObject.instrumentation.onAfterCall(sdkObject, callMetadata); + if (metainfo?.slowMo) + await this._doSlowMo(sdkObject); + } + if (response2.error) + response2.log = compressCallLog(callMetadata.log); + this.onmessage(response2); + } + async _doSlowMo(sdkObject) { + const slowMo = sdkObject.attribution.browser?.options.slowMo; + if (slowMo) + await new Promise((f) => setTimeout(f, slowMo)); + } + async _dispatchWaitInfo(id, dispatcher, params2, metadata) { + let info; + let validMetadata; + try { + const validatorContext = this._validatorFromWireContext(); + info = waitInfoValidator(params2, "", validatorContext); + validMetadata = metadataValidator(metadata, "", validatorContext); + } catch { + return; + } + const sdkObject = dispatcher._object; + if (info.phase === "before") { + const callMetadata = { + id: `call@${id}`, + location: validMetadata.location, + title: validMetadata.title, + internal: validMetadata.internal, + stepId: validMetadata.stepId, + objectId: sdkObject.guid, + pageId: sdkObject.attribution?.page?.guid, + frameId: sdkObject.attribution?.frame?.guid, + startTime: monotonicTime(), + endTime: 0, + type: dispatcher._type, + method: "__waitInfo__", + params: params2 || {}, + log: [] + }; + this._waitOperations.set(info.waitId, callMetadata); + await sdkObject.instrumentation.onBeforeCall(sdkObject, callMetadata).catch(() => { + }); + return; + } + const originalMetadata = this._waitOperations.get(info.waitId); + if (!originalMetadata) + return; + if (info.phase === "log" && info.message) { + originalMetadata.log.push(info.message); + sdkObject.instrumentation.onCallLog(sdkObject, originalMetadata, "api", info.message); + return; + } + if (info.phase === "after") { + originalMetadata.endTime = monotonicTime(); + originalMetadata.error = info.error ? { error: { name: "Error", message: info.error } } : void 0; + this._waitOperations.delete(info.waitId); + await sdkObject.instrumentation.onAfterCall(sdkObject, originalMetadata).catch(() => { + }); + } + } + }; + } +}); + +// packages/isomorphic/utilityScriptSerializers.ts +function isRegExp5(obj) { + try { + return obj instanceof RegExp || Object.prototype.toString.call(obj) === "[object RegExp]"; + } catch (error) { + return false; + } +} +function isDate2(obj) { + try { + return obj instanceof Date || Object.prototype.toString.call(obj) === "[object Date]"; + } catch (error) { + return false; + } +} +function isURL2(obj) { + try { + return obj instanceof URL || Object.prototype.toString.call(obj) === "[object URL]"; + } catch (error) { + return false; + } +} +function isError3(obj) { + try { + return obj instanceof Error || obj && Object.getPrototypeOf(obj)?.name === "Error"; + } catch (error) { + return false; + } +} +function isTypedArray(obj, constructor) { + try { + return obj instanceof constructor || Object.prototype.toString.call(obj) === `[object ${constructor.name}]`; + } catch (error) { + return false; + } +} +function isArrayBuffer(obj) { + try { + return obj instanceof ArrayBuffer || Object.prototype.toString.call(obj) === "[object ArrayBuffer]"; + } catch (error) { + return false; + } +} +function typedArrayToBase64(array) { + if ("toBase64" in array) + return array.toBase64(); + const binary = Array.from(new Uint8Array(array.buffer, array.byteOffset, array.byteLength)).map((b) => String.fromCharCode(b)).join(""); + return btoa(binary); +} +function base64ToTypedArray(base64, TypedArrayConstructor) { + const binary = atob(base64); + const bytes = new Uint8Array(binary.length); + for (let i = 0; i < binary.length; i++) + bytes[i] = binary.charCodeAt(i); + return new TypedArrayConstructor(bytes.buffer); +} +function parseEvaluationResultValue(value2, handles = [], refs = /* @__PURE__ */ new Map()) { + if (Object.is(value2, void 0)) + return void 0; + if (typeof value2 === "object" && value2) { + if ("ref" in value2) + return refs.get(value2.ref); + if ("v" in value2) { + if (value2.v === "undefined") + return void 0; + if (value2.v === "null") + return null; + if (value2.v === "NaN") + return NaN; + if (value2.v === "Infinity") + return Infinity; + if (value2.v === "-Infinity") + return -Infinity; + if (value2.v === "-0") + return -0; + return void 0; + } + if ("d" in value2) { + return new Date(value2.d); + } + if ("u" in value2) + return new URL(value2.u); + if ("bi" in value2) + return BigInt(value2.bi); + if ("e" in value2) { + const error = new Error(value2.e.m); + error.name = value2.e.n; + error.stack = value2.e.s; + return error; + } + if ("r" in value2) + return new RegExp(value2.r.p, value2.r.f); + if ("a" in value2) { + const result2 = []; + refs.set(value2.id, result2); + for (const a of value2.a) + result2.push(parseEvaluationResultValue(a, handles, refs)); + return result2; + } + if ("o" in value2) { + const result2 = {}; + refs.set(value2.id, result2); + for (const { k, v } of value2.o) { + if (k === "__proto__") + continue; + result2[k] = parseEvaluationResultValue(v, handles, refs); + } + return result2; + } + if ("h" in value2) + return handles[value2.h]; + if ("ta" in value2) + return base64ToTypedArray(value2.ta.b, typedArrayConstructors[value2.ta.k]); + if ("ab" in value2) + return base64ToTypedArray(value2.ab.b, Uint8Array).buffer; + } + return value2; +} +function serializeAsCallArgument(value2, handleSerializer) { + return serialize(value2, handleSerializer, { visited: /* @__PURE__ */ new Map(), lastId: 0 }); +} +function serialize(value2, handleSerializer, visitorInfo) { + if (value2 && typeof value2 === "object") { + if (typeof globalThis.Window === "function" && value2 instanceof globalThis.Window) + return "ref: "; + if (typeof globalThis.Document === "function" && value2 instanceof globalThis.Document) + return "ref: "; + if (typeof globalThis.Node === "function" && value2 instanceof globalThis.Node) + return "ref: "; + } + return innerSerialize(value2, handleSerializer, visitorInfo); +} +function innerSerialize(value2, handleSerializer, visitorInfo) { + const result2 = handleSerializer(value2); + if ("fallThrough" in result2) + value2 = result2.fallThrough; + else + return result2; + if (typeof value2 === "symbol") + return { v: "undefined" }; + if (Object.is(value2, void 0)) + return { v: "undefined" }; + if (Object.is(value2, null)) + return { v: "null" }; + if (Object.is(value2, NaN)) + return { v: "NaN" }; + if (Object.is(value2, Infinity)) + return { v: "Infinity" }; + if (Object.is(value2, -Infinity)) + return { v: "-Infinity" }; + if (Object.is(value2, -0)) + return { v: "-0" }; + if (typeof value2 === "boolean") + return value2; + if (typeof value2 === "number") + return value2; + if (typeof value2 === "string") + return value2; + if (typeof value2 === "bigint") + return { bi: value2.toString() }; + if (isError3(value2)) { + let stack; + if (value2.stack?.startsWith(value2.name + ": " + value2.message)) { + stack = value2.stack; + } else { + stack = `${value2.name}: ${value2.message} +${value2.stack}`; + } + return { e: { n: value2.name, m: value2.message, s: stack } }; + } + if (isDate2(value2)) + return { d: value2.toJSON() }; + if (isURL2(value2)) + return { u: value2.toJSON() }; + if (isRegExp5(value2)) + return { r: { p: value2.source, f: value2.flags } }; + for (const [k, ctor] of Object.entries(typedArrayConstructors)) { + if (isTypedArray(value2, ctor)) + return { ta: { b: typedArrayToBase64(value2), k } }; + } + if (isArrayBuffer(value2)) + return { ab: { b: typedArrayToBase64(new Uint8Array(value2)) } }; + const id = visitorInfo.visited.get(value2); + if (id) + return { ref: id }; + if (Array.isArray(value2)) { + const a = []; + const id2 = ++visitorInfo.lastId; + visitorInfo.visited.set(value2, id2); + for (let i = 0; i < value2.length; ++i) + a.push(serialize(value2[i], handleSerializer, visitorInfo)); + return { a, id: id2 }; + } + if (typeof value2 === "object") { + const o = []; + const id2 = ++visitorInfo.lastId; + visitorInfo.visited.set(value2, id2); + for (const name of Object.keys(value2)) { + let item; + try { + item = value2[name]; + } catch (e) { + continue; + } + if (name === "toJSON" && typeof item === "function") + o.push({ k: name, v: { o: [], id: 0 } }); + else + o.push({ k: name, v: serialize(item, handleSerializer, visitorInfo) }); + } + let jsonWrapper; + try { + if (o.length === 0 && value2.toJSON && typeof value2.toJSON === "function") + jsonWrapper = { value: value2.toJSON() }; + } catch (e) { + } + if (jsonWrapper) + return innerSerialize(jsonWrapper.value, handleSerializer, visitorInfo); + return { o, id: id2 }; + } +} +var typedArrayConstructors; +var init_utilityScriptSerializers = __esm({ + "packages/isomorphic/utilityScriptSerializers.ts"() { + "use strict"; + typedArrayConstructors = { + i8: Int8Array, + ui8: Uint8Array, + ui8c: Uint8ClampedArray, + i16: Int16Array, + ui16: Uint16Array, + i32: Int32Array, + ui32: Uint32Array, + // TODO: add Float16Array once it's in baseline + f32: Float32Array, + f64: Float64Array, + bi64: BigInt64Array, + bui64: BigUint64Array + }; + } +}); + +// packages/playwright-core/src/generated/utilityScriptSource.ts +var source3; +var init_utilityScriptSource = __esm({ + "packages/playwright-core/src/generated/utilityScriptSource.ts"() { + "use strict"; + source3 = '\nvar __commonJS = obj => {\n let required = false;\n let result;\n return function __require() {\n if (!required) {\n required = true;\n let fn;\n for (const name in obj) { fn = obj[name]; break; }\n const module = { exports: {} };\n fn(module.exports, module);\n result = module.exports;\n }\n return result;\n }\n};\nvar __export = (target, all) => {for (var name in all) target[name] = all[name];};\nvar __toESM = mod => ({ ...mod, \'default\': mod });\nvar __toCommonJS = mod => ({ ...mod, __esModule: true });\n\n\n// packages/injected/src/utilityScript.ts\nvar utilityScript_exports = {};\n__export(utilityScript_exports, {\n UtilityScript: () => UtilityScript\n});\nmodule.exports = __toCommonJS(utilityScript_exports);\n\n// packages/isomorphic/utilityScriptSerializers.ts\nfunction isRegExp(obj) {\n try {\n return obj instanceof RegExp || Object.prototype.toString.call(obj) === "[object RegExp]";\n } catch (error) {\n return false;\n }\n}\nfunction isDate(obj) {\n try {\n return obj instanceof Date || Object.prototype.toString.call(obj) === "[object Date]";\n } catch (error) {\n return false;\n }\n}\nfunction isURL(obj) {\n try {\n return obj instanceof URL || Object.prototype.toString.call(obj) === "[object URL]";\n } catch (error) {\n return false;\n }\n}\nfunction isError(obj) {\n var _a;\n try {\n return obj instanceof Error || obj && ((_a = Object.getPrototypeOf(obj)) == null ? void 0 : _a.name) === "Error";\n } catch (error) {\n return false;\n }\n}\nfunction isTypedArray(obj, constructor) {\n try {\n return obj instanceof constructor || Object.prototype.toString.call(obj) === `[object ${constructor.name}]`;\n } catch (error) {\n return false;\n }\n}\nfunction isArrayBuffer(obj) {\n try {\n return obj instanceof ArrayBuffer || Object.prototype.toString.call(obj) === "[object ArrayBuffer]";\n } catch (error) {\n return false;\n }\n}\nvar typedArrayConstructors = {\n i8: Int8Array,\n ui8: Uint8Array,\n ui8c: Uint8ClampedArray,\n i16: Int16Array,\n ui16: Uint16Array,\n i32: Int32Array,\n ui32: Uint32Array,\n // TODO: add Float16Array once it\'s in baseline\n f32: Float32Array,\n f64: Float64Array,\n bi64: BigInt64Array,\n bui64: BigUint64Array\n};\nfunction typedArrayToBase64(array) {\n if ("toBase64" in array)\n return array.toBase64();\n const binary = Array.from(new Uint8Array(array.buffer, array.byteOffset, array.byteLength)).map((b) => String.fromCharCode(b)).join("");\n return btoa(binary);\n}\nfunction base64ToTypedArray(base64, TypedArrayConstructor) {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++)\n bytes[i] = binary.charCodeAt(i);\n return new TypedArrayConstructor(bytes.buffer);\n}\nfunction parseEvaluationResultValue(value, handles = [], refs = /* @__PURE__ */ new Map()) {\n if (Object.is(value, void 0))\n return void 0;\n if (typeof value === "object" && value) {\n if ("ref" in value)\n return refs.get(value.ref);\n if ("v" in value) {\n if (value.v === "undefined")\n return void 0;\n if (value.v === "null")\n return null;\n if (value.v === "NaN")\n return NaN;\n if (value.v === "Infinity")\n return Infinity;\n if (value.v === "-Infinity")\n return -Infinity;\n if (value.v === "-0")\n return -0;\n return void 0;\n }\n if ("d" in value) {\n return new Date(value.d);\n }\n if ("u" in value)\n return new URL(value.u);\n if ("bi" in value)\n return BigInt(value.bi);\n if ("e" in value) {\n const error = new Error(value.e.m);\n error.name = value.e.n;\n error.stack = value.e.s;\n return error;\n }\n if ("r" in value)\n return new RegExp(value.r.p, value.r.f);\n if ("a" in value) {\n const result = [];\n refs.set(value.id, result);\n for (const a of value.a)\n result.push(parseEvaluationResultValue(a, handles, refs));\n return result;\n }\n if ("o" in value) {\n const result = {};\n refs.set(value.id, result);\n for (const { k, v } of value.o) {\n if (k === "__proto__")\n continue;\n result[k] = parseEvaluationResultValue(v, handles, refs);\n }\n return result;\n }\n if ("h" in value)\n return handles[value.h];\n if ("ta" in value)\n return base64ToTypedArray(value.ta.b, typedArrayConstructors[value.ta.k]);\n if ("ab" in value)\n return base64ToTypedArray(value.ab.b, Uint8Array).buffer;\n }\n return value;\n}\nfunction serializeAsCallArgument(value, handleSerializer) {\n return serialize(value, handleSerializer, { visited: /* @__PURE__ */ new Map(), lastId: 0 });\n}\nfunction serialize(value, handleSerializer, visitorInfo) {\n if (value && typeof value === "object") {\n if (typeof globalThis.Window === "function" && value instanceof globalThis.Window)\n return "ref: ";\n if (typeof globalThis.Document === "function" && value instanceof globalThis.Document)\n return "ref: ";\n if (typeof globalThis.Node === "function" && value instanceof globalThis.Node)\n return "ref: ";\n }\n return innerSerialize(value, handleSerializer, visitorInfo);\n}\nfunction innerSerialize(value, handleSerializer, visitorInfo) {\n var _a;\n const result = handleSerializer(value);\n if ("fallThrough" in result)\n value = result.fallThrough;\n else\n return result;\n if (typeof value === "symbol")\n return { v: "undefined" };\n if (Object.is(value, void 0))\n return { v: "undefined" };\n if (Object.is(value, null))\n return { v: "null" };\n if (Object.is(value, NaN))\n return { v: "NaN" };\n if (Object.is(value, Infinity))\n return { v: "Infinity" };\n if (Object.is(value, -Infinity))\n return { v: "-Infinity" };\n if (Object.is(value, -0))\n return { v: "-0" };\n if (typeof value === "boolean")\n return value;\n if (typeof value === "number")\n return value;\n if (typeof value === "string")\n return value;\n if (typeof value === "bigint")\n return { bi: value.toString() };\n if (isError(value)) {\n let stack;\n if ((_a = value.stack) == null ? void 0 : _a.startsWith(value.name + ": " + value.message)) {\n stack = value.stack;\n } else {\n stack = `${value.name}: ${value.message}\n${value.stack}`;\n }\n return { e: { n: value.name, m: value.message, s: stack } };\n }\n if (isDate(value))\n return { d: value.toJSON() };\n if (isURL(value))\n return { u: value.toJSON() };\n if (isRegExp(value))\n return { r: { p: value.source, f: value.flags } };\n for (const [k, ctor] of Object.entries(typedArrayConstructors)) {\n if (isTypedArray(value, ctor))\n return { ta: { b: typedArrayToBase64(value), k } };\n }\n if (isArrayBuffer(value))\n return { ab: { b: typedArrayToBase64(new Uint8Array(value)) } };\n const id = visitorInfo.visited.get(value);\n if (id)\n return { ref: id };\n if (Array.isArray(value)) {\n const a = [];\n const id2 = ++visitorInfo.lastId;\n visitorInfo.visited.set(value, id2);\n for (let i = 0; i < value.length; ++i)\n a.push(serialize(value[i], handleSerializer, visitorInfo));\n return { a, id: id2 };\n }\n if (typeof value === "object") {\n const o = [];\n const id2 = ++visitorInfo.lastId;\n visitorInfo.visited.set(value, id2);\n for (const name of Object.keys(value)) {\n let item;\n try {\n item = value[name];\n } catch (e) {\n continue;\n }\n if (name === "toJSON" && typeof item === "function")\n o.push({ k: name, v: { o: [], id: 0 } });\n else\n o.push({ k: name, v: serialize(item, handleSerializer, visitorInfo) });\n }\n let jsonWrapper;\n try {\n if (o.length === 0 && value.toJSON && typeof value.toJSON === "function")\n jsonWrapper = { value: value.toJSON() };\n } catch (e) {\n }\n if (jsonWrapper)\n return innerSerialize(jsonWrapper.value, handleSerializer, visitorInfo);\n return { o, id: id2 };\n }\n}\n\n// packages/injected/src/utilityScript.ts\nvar UtilityScript = class {\n constructor(global, isUnderTest) {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n this.global = global;\n this.isUnderTest = isUnderTest;\n if (global.__pwClock) {\n this.builtins = global.__pwClock.builtins;\n } else {\n this.builtins = {\n setTimeout: (_a = global.setTimeout) == null ? void 0 : _a.bind(global),\n clearTimeout: (_b = global.clearTimeout) == null ? void 0 : _b.bind(global),\n setInterval: (_c = global.setInterval) == null ? void 0 : _c.bind(global),\n clearInterval: (_d = global.clearInterval) == null ? void 0 : _d.bind(global),\n requestAnimationFrame: (_e = global.requestAnimationFrame) == null ? void 0 : _e.bind(global),\n cancelAnimationFrame: (_f = global.cancelAnimationFrame) == null ? void 0 : _f.bind(global),\n requestIdleCallback: (_g = global.requestIdleCallback) == null ? void 0 : _g.bind(global),\n cancelIdleCallback: (_h = global.cancelIdleCallback) == null ? void 0 : _h.bind(global),\n performance: global.performance,\n Intl: global.Intl,\n Date: global.Date,\n AbortSignal: global.AbortSignal\n };\n }\n if (this.isUnderTest)\n global.builtins = this.builtins;\n }\n evaluate(isFunction, returnByValue, expression, argCount, ...argsAndHandles) {\n const args = argsAndHandles.slice(0, argCount);\n const handles = argsAndHandles.slice(argCount);\n const parameters = [];\n for (let i = 0; i < args.length; i++)\n parameters[i] = parseEvaluationResultValue(args[i], handles);\n let result = this.global.eval(expression);\n if (isFunction === true) {\n result = result(...parameters);\n } else if (isFunction === false) {\n result = result;\n } else {\n if (typeof result === "function")\n result = result(...parameters);\n }\n return returnByValue ? this._promiseAwareJsonValueNoThrow(result) : result;\n }\n jsonValue(returnByValue, value) {\n if (value === void 0)\n return void 0;\n return serializeAsCallArgument(value, (value2) => ({ fallThrough: value2 }));\n }\n _promiseAwareJsonValueNoThrow(value) {\n const safeJson = (value2) => {\n try {\n return this.jsonValue(true, value2);\n } catch (e) {\n return void 0;\n }\n };\n if (value && typeof value === "object" && typeof value.then === "function") {\n return (async () => {\n const promiseValue = await value;\n return safeJson(promiseValue);\n })();\n }\n return safeJson(value);\n }\n};\n'; + } +}); + +// packages/playwright-core/src/server/javascript.ts +async function evaluate(context2, returnByValue, pageFunction, ...args) { + return evaluateExpression(context2, String(pageFunction), { returnByValue, isFunction: typeof pageFunction === "function" }, ...args); +} +async function evaluateExpression(context2, expression2, options, ...args) { + expression2 = normalizeEvaluationExpression(expression2, options.isFunction); + const handles = []; + const toDispose = []; + const pushHandle = (handle) => { + handles.push(handle); + return handles.length - 1; + }; + args = args.map((arg) => serializeAsCallArgument(arg, (handle) => { + if (handle instanceof JSHandle) { + if (!handle._objectId) + return { fallThrough: handle._value }; + if (handle._disposed) + throw new JavaScriptErrorInEvaluate("JSHandle is disposed!"); + const adopted = context2.adoptIfNeeded(handle); + if (adopted === null) + return { h: pushHandle(Promise.resolve(handle)) }; + toDispose.push(adopted); + return { h: pushHandle(adopted) }; + } + return { fallThrough: handle }; + })); + const utilityScriptObjects = []; + for (const handle of await Promise.all(handles)) { + if (handle._context !== context2) + throw new JavaScriptErrorInEvaluate("JSHandles can be evaluated only in the context they were created!"); + utilityScriptObjects.push(handle); + } + const utilityScriptValues = [options.isFunction, options.returnByValue, expression2, args.length, ...args]; + const script = `(utilityScript, ...args) => utilityScript.evaluate(...args)`; + try { + return await context2._evaluateWithArguments(script, options.returnByValue || false, utilityScriptValues, utilityScriptObjects); + } finally { + toDispose.map((handlePromise) => handlePromise.then((handle) => handle.dispose())); + } +} +function parseUnserializableValue(unserializableValue) { + if (unserializableValue === "NaN") + return NaN; + if (unserializableValue === "Infinity") + return Infinity; + if (unserializableValue === "-Infinity") + return -Infinity; + if (unserializableValue === "-0") + return -0; +} +function normalizeEvaluationExpression(expression2, isFunction2) { + expression2 = expression2.trim(); + if (isFunction2) { + try { + new Function("(" + expression2 + ")"); + } catch (e1) { + if (expression2.startsWith("async ")) + expression2 = "async function " + expression2.substring("async ".length); + else + expression2 = "function " + expression2; + try { + new Function("(" + expression2 + ")"); + } catch (e2) { + throw new Error("Passed function is not well-serializable!"); + } + } + } + if (/^(async)?\s*function(\s|\()/.test(expression2)) + expression2 = "(" + expression2 + ")"; + return expression2; +} +function isJavaScriptErrorInEvaluate(error) { + return error instanceof JavaScriptErrorInEvaluate; +} +function sparseArrayToString(entries) { + const arrayEntries = []; + for (const { name, value: value2 } of entries) { + const index = +name; + if (isNaN(index) || index < 0) + continue; + arrayEntries.push({ index, value: value2 }); + } + arrayEntries.sort((a, b) => a.index - b.index); + let lastIndex = -1; + const tokens = []; + for (const { index, value: value2 } of arrayEntries) { + const emptyItems = index - lastIndex - 1; + if (emptyItems === 1) + tokens.push(`empty`); + else if (emptyItems > 1) + tokens.push(`empty x ${emptyItems}`); + tokens.push(String(value2)); + lastIndex = index; + } + return "[" + tokens.join(", ") + "]"; +} +var ExecutionContext, JSHandle, JavaScriptErrorInEvaluate, snapshottedFunctionBuiltins, snapshottedObjectBuiltins, snapshottedTimerBuiltins, saveGlobalsSnapshotSource, mainWorldGlobalsSnapshotSource; +var init_javascript = __esm({ + "packages/playwright-core/src/server/javascript.ts"() { + "use strict"; + init_utilityScriptSerializers(); + init_manualPromise(); + init_debug(); + init_instrumentation(); + init_utilityScriptSource(); + ExecutionContext = class extends SdkObject { + constructor(parent, delegate, worldNameForTest, options) { + super(parent, "execution-context"); + this._contextDestroyedScope = new LongStandingScope(); + this.worldNameForTest = worldNameForTest; + this._noUtilityWorld = options?.noUtilityWorld; + this.delegate = delegate; + } + contextDestroyed(reason) { + this._contextDestroyedScope.close(new Error(reason)); + } + async raceAgainstContextDestroyed(promise) { + return this._contextDestroyedScope.race(promise); + } + rawEvaluateJSON(expression2) { + return this.raceAgainstContextDestroyed(this.delegate.rawEvaluateJSON(expression2)); + } + rawEvaluateHandle(expression2) { + return this.raceAgainstContextDestroyed(this.delegate.rawEvaluateHandle(this, expression2)); + } + async _evaluateWithArguments(expression2, returnByValue, values, handles) { + const utilityScript = await this._utilityScript(); + return this.raceAgainstContextDestroyed(this.delegate.evaluateWithArguments(expression2, returnByValue, utilityScript, values, handles)); + } + getProperties(object) { + return this.raceAgainstContextDestroyed(this.delegate.getProperties(object)); + } + _releaseHandle(handle) { + return this.delegate.releaseHandle(handle); + } + adoptIfNeeded(handle) { + return null; + } + _utilityScript() { + if (!this._utilityScriptPromise) { + const globalsSnapshot = this._noUtilityWorld ? mainWorldGlobalsSnapshotSource : ""; + const source11 = ` + (() => { + ${globalsSnapshot} + const module = {}; + ${source3} + return new (module.exports.UtilityScript())(globalThis, ${isUnderTest()}); + })();`; + this._utilityScriptPromise = this.raceAgainstContextDestroyed(this.delegate.rawEvaluateHandle(this, source11)).then((handle) => { + handle._setPreview("UtilityScript"); + return handle; + }); + } + return this._utilityScriptPromise; + } + }; + JSHandle = class extends SdkObject { + constructor(context2, type3, preview, objectId, value2) { + super(context2, "handle"); + this.__jshandle = true; + this._disposed = false; + this._context = context2; + this._objectId = objectId; + this._value = value2; + this._objectType = type3; + this._preview = this._objectId ? preview || `JSHandle@${this._objectType}` : String(value2); + if (this._objectId && globalThis.leakedJSHandles) + globalThis.leakedJSHandles.set(this, new Error("Leaked JSHandle")); + } + async evaluateExpression(progress2, expression2, options, arg) { + return await progress2.race(this.internalEvaluateExpression(expression2, options, arg)); + } + async evaluateExpressionHandle(progress2, expression2, options, arg) { + return await progress2.race(this._evaluateExpressionHandle(expression2, options, arg)); + } + async getProperty(progress2, propertyName) { + return await progress2.race(this._getProperty(propertyName)); + } + async getProperties(progress2) { + return await progress2.race(this.internalGetProperties()); + } + async jsonValue(progress2) { + return await progress2.race(this._jsonValue()); + } + async evaluate(pageFunction, arg) { + return evaluate(this._context, true, pageFunction, this, arg); + } + async evaluateHandle(pageFunction, arg) { + return evaluate(this._context, false, pageFunction, this, arg); + } + async internalEvaluateExpression(expression2, options, arg) { + return await evaluateExpression(this._context, expression2, { ...options, returnByValue: true }, this, arg); + } + async _evaluateExpressionHandle(expression2, options, arg) { + return await evaluateExpression(this._context, expression2, { ...options, returnByValue: false }, this, arg); + } + async _getProperty(propertyName) { + const objectHandle = await this.evaluateHandle((object, propertyName2) => { + const result3 = { __proto__: null }; + result3[propertyName2] = object[propertyName2]; + return result3; + }, propertyName); + const properties = await objectHandle.internalGetProperties(); + const result2 = properties.get(propertyName); + objectHandle.dispose(); + return result2; + } + async internalGetProperties() { + if (!this._objectId) + return /* @__PURE__ */ new Map(); + return this._context.getProperties(this); + } + rawValue() { + return this._value; + } + async _jsonValue() { + if (!this._objectId) + return this._value; + const script = `(utilityScript, ...args) => utilityScript.jsonValue(...args)`; + return this._context._evaluateWithArguments(script, true, [true], [this]); + } + asElement() { + return null; + } + dispose() { + if (this._disposed) + return; + this._disposed = true; + if (this._objectId) { + this._context._releaseHandle(this).catch((e) => { + }); + if (globalThis.leakedJSHandles) + globalThis.leakedJSHandles.delete(this); + } + } + toString() { + return this._preview; + } + _setPreviewCallback(callback) { + this._previewCallback = callback; + } + preview() { + return this._preview; + } + worldNameForTest() { + return this._context.worldNameForTest; + } + _setPreview(preview) { + this._preview = preview; + if (this._previewCallback) + this._previewCallback(preview); + } + }; + JavaScriptErrorInEvaluate = class extends Error { + }; + snapshottedFunctionBuiltins = [ + // DOM + "Node", + "Element", + "NodeFilter", + "HTMLElement", + "Document", + "ShadowRoot", + "MutationObserver", + "Event", + "CustomEvent", + "EventTarget", + // JS standard + "Map", + "Set", + "WeakMap", + "WeakSet", + "Promise", + "Symbol", + "Error", + "TypeError", + "RegExp", + "Array", + "Object" + ]; + snapshottedObjectBuiltins = ["JSON", "Math"]; + snapshottedTimerBuiltins = ["setTimeout"]; + saveGlobalsSnapshotSource = `window.__pwSnapshotGlobals = { +${[...snapshottedFunctionBuiltins, ...snapshottedObjectBuiltins, ...snapshottedTimerBuiltins].map((n) => ` ${n}: window.${n}`).join(",\n")} +};`; + mainWorldGlobalsSnapshotSource = ` + const __snap = globalThis.__pwSnapshotGlobals || {}; +${snapshottedFunctionBuiltins.map((n) => ` const ${n} = (typeof globalThis.${n} === 'function' ? globalThis.${n} : __snap.${n});`).join("\n")} +${snapshottedObjectBuiltins.map((n) => ` const ${n} = (typeof globalThis.${n} === 'object' && globalThis.${n} ? globalThis.${n} : __snap.${n});`).join("\n")} +`; + } +}); + +// packages/playwright-core/src/server/fileUploadUtils.ts +async function filesExceedUploadLimit(files) { + const sizes = await Promise.all(files.map(async (file) => (await import_fs13.default.promises.stat(file)).size)); + return sizes.reduce((total, size) => total + size, 0) >= fileUploadSizeLimit; +} +async function prepareFilesForUpload(frame, params2) { + const { payloads, streams, directoryStream } = params2; + let { localPaths, localDirectory } = params2; + if (localPaths && !frame.attribution.playwright.options.isClientCollocatedWithServer) + throw new Error("localPaths are not allowed when the client is not local"); + if ([payloads, localPaths, localDirectory, streams, directoryStream].filter(Boolean).length !== 1) + throw new Error("Exactly one of payloads, localPaths and streams must be provided"); + if (streams) + localPaths = streams.map((c) => c.path()); + if (directoryStream) + localDirectory = directoryStream.path(); + if (localPaths) { + for (const p of localPaths) + assert(import_path12.default.isAbsolute(p) && import_path12.default.resolve(p) === p, "Paths provided to localPaths must be absolute and fully resolved."); + } + let fileBuffers = payloads; + if (!frame._page.browserContext._browser._isBrowserCollocatedWithServer) { + if (localPaths) { + if (await filesExceedUploadLimit(localPaths)) + throw new Error("Cannot transfer files larger than 50Mb to a browser not co-located with the server"); + fileBuffers = await Promise.all(localPaths.map(async (item) => { + return { + name: import_path12.default.basename(item), + buffer: await import_fs13.default.promises.readFile(item), + lastModifiedMs: (await import_fs13.default.promises.stat(item)).mtimeMs + }; + })); + localPaths = void 0; + } + } + const filePayloads = fileBuffers?.map((payload) => ({ + name: payload.name, + mimeType: payload.mimeType || mime4.getType(payload.name) || "application/octet-stream", + buffer: payload.buffer.toString("base64"), + lastModifiedMs: payload.lastModifiedMs + })); + return { localPaths, localDirectory, filePayloads }; +} +var import_fs13, import_path12, mime4, fileUploadSizeLimit; +var init_fileUploadUtils = __esm({ + "packages/playwright-core/src/server/fileUploadUtils.ts"() { + "use strict"; + import_fs13 = __toESM(require("fs")); + import_path12 = __toESM(require("path")); + init_assert(); + mime4 = require("./utilsBundle").mime; + fileUploadSizeLimit = 50 * 1024 * 1024; + } +}); + +// packages/playwright-core/src/generated/injectedScriptSource.ts +var source4; +var init_injectedScriptSource = __esm({ + "packages/playwright-core/src/generated/injectedScriptSource.ts"() { + "use strict"; + source4 = '\nvar __commonJS = obj => {\n let required = false;\n let result;\n return function __require() {\n if (!required) {\n required = true;\n let fn;\n for (const name in obj) { fn = obj[name]; break; }\n const module = { exports: {} };\n fn(module.exports, module);\n result = module.exports;\n }\n return result;\n }\n};\nvar __export = (target, all) => {for (var name in all) target[name] = all[name];};\nvar __toESM = mod => ({ ...mod, \'default\': mod });\nvar __toCommonJS = mod => ({ ...mod, __esModule: true });\n\n\n// packages/injected/src/injectedScript.ts\nvar injectedScript_exports = {};\n__export(injectedScript_exports, {\n InjectedScript: () => InjectedScript\n});\nmodule.exports = __toCommonJS(injectedScript_exports);\n\n// packages/isomorphic/ariaSnapshot.ts\nfunction ariaNodesEqual(a, b) {\n if (a.role !== b.role || a.name !== b.name)\n return false;\n if (!ariaPropsEqual(a, b) || hasPointerCursor(a) !== hasPointerCursor(b))\n return false;\n const aKeys = Object.keys(a.props);\n const bKeys = Object.keys(b.props);\n return aKeys.length === bKeys.length && aKeys.every((k) => a.props[k] === b.props[k]);\n}\nfunction hasPointerCursor(ariaNode) {\n return ariaNode.box.cursor === "pointer";\n}\nfunction ariaPropsEqual(a, b) {\n return a.active === b.active && a.checked === b.checked && a.disabled === b.disabled && a.expanded === b.expanded && a.invalid === b.invalid && a.selected === b.selected && a.level === b.level && a.pressed === b.pressed;\n}\nfunction parseAriaSnapshot(yaml, text, options = {}) {\n var _a;\n const lineCounter = new yaml.LineCounter();\n const parseOptions = {\n keepSourceTokens: true,\n lineCounter,\n ...options\n };\n const yamlDoc = yaml.parseDocument(text, parseOptions);\n const errors = [];\n const convertRange = (range) => {\n return [lineCounter.linePos(range[0]), lineCounter.linePos(range[1])];\n };\n const addError = (error) => {\n errors.push({\n message: error.message,\n range: [lineCounter.linePos(error.pos[0]), lineCounter.linePos(error.pos[1])]\n });\n };\n const convertSeq = (container, seq) => {\n for (const item of seq.items) {\n const itemIsString = item instanceof yaml.Scalar && typeof item.value === "string";\n if (itemIsString) {\n const childNode = KeyParser.parse(item, parseOptions, errors);\n if (childNode) {\n container.children = container.children || [];\n container.children.push(childNode);\n }\n continue;\n }\n const itemIsMap = item instanceof yaml.YAMLMap;\n if (itemIsMap) {\n convertMap(container, item);\n continue;\n }\n errors.push({\n message: "Sequence items should be strings or maps",\n range: convertRange(item.range || seq.range)\n });\n }\n };\n const convertMap = (container, map) => {\n var _a2;\n for (const entry of map.items) {\n container.children = container.children || [];\n const keyIsString = entry.key instanceof yaml.Scalar && typeof entry.key.value === "string";\n if (!keyIsString) {\n errors.push({\n message: "Only string keys are supported",\n range: convertRange(entry.key.range || map.range)\n });\n continue;\n }\n const key = entry.key;\n const value = entry.value;\n if (key.value === "text") {\n const valueIsString = value instanceof yaml.Scalar && typeof value.value === "string";\n if (!valueIsString) {\n errors.push({\n message: "Text value should be a string",\n range: convertRange(entry.value.range || map.range)\n });\n continue;\n }\n container.children.push({\n kind: "text",\n text: textValue(value.value)\n });\n continue;\n }\n if (key.value === "/children") {\n const valueIsString = value instanceof yaml.Scalar && typeof value.value === "string";\n if (!valueIsString || value.value !== "contain" && value.value !== "equal" && value.value !== "deep-equal") {\n errors.push({\n message: \'Strict value should be "contain", "equal" or "deep-equal"\',\n range: convertRange(entry.value.range || map.range)\n });\n continue;\n }\n container.containerMode = value.value;\n continue;\n }\n if (key.value.startsWith("/")) {\n const valueIsString = value instanceof yaml.Scalar && typeof value.value === "string";\n if (!valueIsString) {\n errors.push({\n message: "Property value should be a string",\n range: convertRange(entry.value.range || map.range)\n });\n continue;\n }\n container.props = (_a2 = container.props) != null ? _a2 : {};\n container.props[key.value.slice(1)] = textValue(value.value);\n continue;\n }\n const childNode = KeyParser.parse(key, parseOptions, errors);\n if (!childNode)\n continue;\n const valueIsScalar = value instanceof yaml.Scalar;\n if (valueIsScalar) {\n const type = typeof value.value;\n if (type !== "string" && type !== "number" && type !== "boolean") {\n errors.push({\n message: "Node value should be a string or a sequence",\n range: convertRange(entry.value.range || map.range)\n });\n continue;\n }\n container.children.push({\n ...childNode,\n children: [{\n kind: "text",\n text: textValue(String(value.value))\n }]\n });\n continue;\n }\n const valueIsSequence = value instanceof yaml.YAMLSeq;\n if (valueIsSequence) {\n container.children.push(childNode);\n convertSeq(childNode, value);\n continue;\n }\n errors.push({\n message: "Map values should be strings or sequences",\n range: convertRange(entry.value.range || map.range)\n });\n }\n };\n const fragment = { kind: "role", role: "fragment" };\n yamlDoc.errors.forEach(addError);\n if (errors.length)\n return { errors, fragment };\n if (!(yamlDoc.contents instanceof yaml.YAMLSeq)) {\n errors.push({\n message: \'Aria snapshot must be a YAML sequence, elements starting with " -"\',\n range: yamlDoc.contents ? convertRange(yamlDoc.contents.range) : [{ line: 0, col: 0 }, { line: 0, col: 0 }]\n });\n }\n if (errors.length)\n return { errors, fragment };\n convertSeq(fragment, yamlDoc.contents);\n if (errors.length)\n return { errors, fragment: emptyFragment };\n if (((_a = fragment.children) == null ? void 0 : _a.length) === 1 && (!fragment.containerMode || fragment.containerMode === "contain"))\n return { fragment: fragment.children[0], errors: [] };\n return { fragment, errors: [] };\n}\nvar emptyFragment = { kind: "role", role: "fragment" };\nfunction normalizeWhitespace(text) {\n return text.replace(/[\\u200b\\u00ad]/g, "").replace(/[\\r\\n\\s\\t]+/g, " ").trim();\n}\nfunction textValue(value) {\n return {\n raw: value,\n normalized: normalizeWhitespace(value)\n };\n}\nvar KeyParser = class _KeyParser {\n static parse(text, options, errors) {\n try {\n return new _KeyParser(text.value)._parse();\n } catch (e) {\n if (e instanceof ParserError) {\n const message = options.prettyErrors === false ? e.message : e.message + ":\\n\\n" + text.value + "\\n" + " ".repeat(e.pos) + "^\\n";\n errors.push({\n message,\n range: [options.lineCounter.linePos(text.range[0]), options.lineCounter.linePos(text.range[0] + e.pos)]\n });\n return null;\n }\n throw e;\n }\n }\n constructor(input) {\n this._input = input;\n this._pos = 0;\n this._length = input.length;\n }\n _peek() {\n return this._input[this._pos] || "";\n }\n _next() {\n if (this._pos < this._length)\n return this._input[this._pos++];\n return null;\n }\n _eof() {\n return this._pos >= this._length;\n }\n _isWhitespace() {\n return !this._eof() && /\\s/.test(this._peek());\n }\n _skipWhitespace() {\n while (this._isWhitespace())\n this._pos++;\n }\n _readIdentifier(type) {\n if (this._eof())\n this._throwError(`Unexpected end of input when expecting ${type}`);\n const start = this._pos;\n while (!this._eof() && /[a-zA-Z]/.test(this._peek()))\n this._pos++;\n return this._input.slice(start, this._pos);\n }\n _readString() {\n let result = "";\n let escaped = false;\n while (!this._eof()) {\n const ch = this._next();\n if (escaped) {\n result += ch;\n escaped = false;\n } else if (ch === "\\\\") {\n escaped = true;\n } else if (ch === \'"\') {\n return result;\n } else {\n result += ch;\n }\n }\n this._throwError("Unterminated string");\n }\n _throwError(message, offset = 0) {\n throw new ParserError(message, offset || this._pos);\n }\n _readRegex() {\n let result = "";\n let escaped = false;\n let insideClass = false;\n while (!this._eof()) {\n const ch = this._next();\n if (escaped) {\n result += ch;\n escaped = false;\n } else if (ch === "\\\\") {\n escaped = true;\n result += ch;\n } else if (ch === "/" && !insideClass) {\n return { pattern: result };\n } else if (ch === "[") {\n insideClass = true;\n result += ch;\n } else if (ch === "]" && insideClass) {\n result += ch;\n insideClass = false;\n } else {\n result += ch;\n }\n }\n this._throwError("Unterminated regex");\n }\n _readStringOrRegex() {\n const ch = this._peek();\n if (ch === \'"\') {\n this._next();\n return normalizeWhitespace(this._readString());\n }\n if (ch === "/") {\n this._next();\n return this._readRegex();\n }\n return null;\n }\n _readAttributes(result) {\n let errorPos = this._pos;\n while (true) {\n this._skipWhitespace();\n if (this._peek() === "[") {\n this._next();\n this._skipWhitespace();\n errorPos = this._pos;\n const flagName = this._readIdentifier("attribute");\n this._skipWhitespace();\n let flagValue = "";\n if (this._peek() === "=") {\n this._next();\n this._skipWhitespace();\n errorPos = this._pos;\n while (this._peek() !== "]" && !this._isWhitespace() && !this._eof())\n flagValue += this._next();\n }\n this._skipWhitespace();\n if (this._peek() !== "]")\n this._throwError("Expected ]");\n this._next();\n this._applyAttribute(result, flagName, flagValue || "true", errorPos);\n } else {\n break;\n }\n }\n }\n _parse() {\n this._skipWhitespace();\n const role = this._readIdentifier("role");\n this._skipWhitespace();\n const name = this._readStringOrRegex() || "";\n const result = { kind: "role", role, name };\n this._readAttributes(result);\n this._skipWhitespace();\n if (!this._eof())\n this._throwError("Unexpected input");\n return result;\n }\n _applyAttribute(node, key, value, errorPos) {\n if (key === "checked") {\n this._assert(value === "true" || value === "false" || value === "mixed", \'Value of "checked" attribute must be a boolean or "mixed"\', errorPos);\n node.checked = value === "true" ? true : value === "false" ? false : "mixed";\n return;\n }\n if (key === "disabled") {\n this._assert(value === "true" || value === "false", \'Value of "disabled" attribute must be a boolean\', errorPos);\n node.disabled = value === "true";\n return;\n }\n if (key === "expanded") {\n this._assert(value === "true" || value === "false", \'Value of "expanded" attribute must be a boolean\', errorPos);\n node.expanded = value === "true";\n return;\n }\n if (key === "active") {\n this._assert(value === "true" || value === "false", \'Value of "active" attribute must be a boolean\', errorPos);\n node.active = value === "true";\n return;\n }\n if (key === "invalid") {\n this._assert(value === "true" || value === "false" || value === "grammar" || value === "spelling", \'Value of "invalid" attribute must be a boolean, "grammar" or "spelling"\', errorPos);\n node.invalid = value === "true" ? true : value === "false" ? false : value;\n return;\n }\n if (key === "level") {\n this._assert(!isNaN(Number(value)), \'Value of "level" attribute must be a number\', errorPos);\n node.level = Number(value);\n return;\n }\n if (key === "pressed") {\n this._assert(value === "true" || value === "false" || value === "mixed", \'Value of "pressed" attribute must be a boolean or "mixed"\', errorPos);\n node.pressed = value === "true" ? true : value === "false" ? false : "mixed";\n return;\n }\n if (key === "selected") {\n this._assert(value === "true" || value === "false", \'Value of "selected" attribute must be a boolean\', errorPos);\n node.selected = value === "true";\n return;\n }\n this._assert(false, `Unsupported attribute [${key}]`, errorPos);\n }\n _assert(value, message, valuePos) {\n if (!value)\n this._throwError(message || "Assertion error", valuePos);\n }\n};\nvar ParserError = class extends Error {\n constructor(message, pos) {\n super(message);\n this.pos = pos;\n }\n};\nfunction findNewNode(from, to) {\n var _a, _b;\n function fillMap(root, map, position) {\n let size = 1;\n let childPosition = position + size;\n for (const child of root.children || []) {\n if (typeof child === "string") {\n size++;\n childPosition++;\n } else {\n size += fillMap(child, map, childPosition);\n childPosition += size;\n }\n }\n if (!["none", "presentation", "fragment", "iframe", "generic"].includes(root.role) && root.name) {\n let byRole = map.get(root.role);\n if (!byRole) {\n byRole = /* @__PURE__ */ new Map();\n map.set(root.role, byRole);\n }\n const existing = byRole.get(root.name);\n const sizeAndPosition = size * 100 - position;\n if (!existing || existing.sizeAndPosition < sizeAndPosition)\n byRole.set(root.name, { node: root, sizeAndPosition });\n }\n return size;\n }\n const fromMap = /* @__PURE__ */ new Map();\n if (from)\n fillMap(from, fromMap, 0);\n const toMap = /* @__PURE__ */ new Map();\n fillMap(to, toMap, 0);\n const result = [];\n for (const [role, byRole] of toMap) {\n for (const [name, byName] of byRole) {\n const inFrom = (_a = fromMap.get(role)) == null ? void 0 : _a.get(name);\n if (!inFrom)\n result.push(byName);\n }\n }\n result.sort((a, b) => b.sizeAndPosition - a.sizeAndPosition);\n return (_b = result[0]) == null ? void 0 : _b.node;\n}\n\n// packages/isomorphic/cssTokenizer.ts\nvar between = function(num, first, last) {\n return num >= first && num <= last;\n};\nfunction digit(code) {\n return between(code, 48, 57);\n}\nfunction hexdigit(code) {\n return digit(code) || between(code, 65, 70) || between(code, 97, 102);\n}\nfunction uppercaseletter(code) {\n return between(code, 65, 90);\n}\nfunction lowercaseletter(code) {\n return between(code, 97, 122);\n}\nfunction letter(code) {\n return uppercaseletter(code) || lowercaseletter(code);\n}\nfunction nonascii(code) {\n return code >= 128;\n}\nfunction namestartchar(code) {\n return letter(code) || nonascii(code) || code === 95;\n}\nfunction namechar(code) {\n return namestartchar(code) || digit(code) || code === 45;\n}\nfunction nonprintable(code) {\n return between(code, 0, 8) || code === 11 || between(code, 14, 31) || code === 127;\n}\nfunction newline(code) {\n return code === 10;\n}\nfunction whitespace(code) {\n return newline(code) || code === 9 || code === 32;\n}\nvar maximumallowedcodepoint = 1114111;\nvar InvalidCharacterError = class extends Error {\n constructor(message) {\n super(message);\n this.name = "InvalidCharacterError";\n }\n};\nfunction preprocess(str) {\n const codepoints = [];\n for (let i = 0; i < str.length; i++) {\n let code = str.charCodeAt(i);\n if (code === 13 && str.charCodeAt(i + 1) === 10) {\n code = 10;\n i++;\n }\n if (code === 13 || code === 12)\n code = 10;\n if (code === 0)\n code = 65533;\n if (between(code, 55296, 56319) && between(str.charCodeAt(i + 1), 56320, 57343)) {\n const lead = code - 55296;\n const trail = str.charCodeAt(i + 1) - 56320;\n code = Math.pow(2, 16) + lead * Math.pow(2, 10) + trail;\n i++;\n }\n codepoints.push(code);\n }\n return codepoints;\n}\nfunction stringFromCode(code) {\n if (code <= 65535)\n return String.fromCharCode(code);\n code -= Math.pow(2, 16);\n const lead = Math.floor(code / Math.pow(2, 10)) + 55296;\n const trail = code % Math.pow(2, 10) + 56320;\n return String.fromCharCode(lead) + String.fromCharCode(trail);\n}\nfunction tokenize(str1) {\n const str = preprocess(str1);\n let i = -1;\n const tokens = [];\n let code;\n let line = 0;\n let column = 0;\n let lastLineLength = 0;\n const incrLineno = function() {\n line += 1;\n lastLineLength = column;\n column = 0;\n };\n const locStart = { line, column };\n const codepoint = function(i2) {\n if (i2 >= str.length)\n return -1;\n return str[i2];\n };\n const next = function(num) {\n if (num === void 0)\n num = 1;\n if (num > 3)\n throw "Spec Error: no more than three codepoints of lookahead.";\n return codepoint(i + num);\n };\n const consume = function(num) {\n if (num === void 0)\n num = 1;\n i += num;\n code = codepoint(i);\n if (newline(code))\n incrLineno();\n else\n column += num;\n return true;\n };\n const reconsume = function() {\n i -= 1;\n if (newline(code)) {\n line -= 1;\n column = lastLineLength;\n } else {\n column -= 1;\n }\n locStart.line = line;\n locStart.column = column;\n return true;\n };\n const eof = function(codepoint2) {\n if (codepoint2 === void 0)\n codepoint2 = code;\n return codepoint2 === -1;\n };\n const donothing = function() {\n };\n const parseerror = function() {\n };\n const consumeAToken = function() {\n consumeComments();\n consume();\n if (whitespace(code)) {\n while (whitespace(next()))\n consume();\n return new WhitespaceToken();\n } else if (code === 34) {\n return consumeAStringToken();\n } else if (code === 35) {\n if (namechar(next()) || areAValidEscape(next(1), next(2))) {\n const token = new HashToken("");\n if (wouldStartAnIdentifier(next(1), next(2), next(3)))\n token.type = "id";\n token.value = consumeAName();\n return token;\n } else {\n return new DelimToken(code);\n }\n } else if (code === 36) {\n if (next() === 61) {\n consume();\n return new SuffixMatchToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 39) {\n return consumeAStringToken();\n } else if (code === 40) {\n return new OpenParenToken();\n } else if (code === 41) {\n return new CloseParenToken();\n } else if (code === 42) {\n if (next() === 61) {\n consume();\n return new SubstringMatchToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 43) {\n if (startsWithANumber()) {\n reconsume();\n return consumeANumericToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 44) {\n return new CommaToken();\n } else if (code === 45) {\n if (startsWithANumber()) {\n reconsume();\n return consumeANumericToken();\n } else if (next(1) === 45 && next(2) === 62) {\n consume(2);\n return new CDCToken();\n } else if (startsWithAnIdentifier()) {\n reconsume();\n return consumeAnIdentlikeToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 46) {\n if (startsWithANumber()) {\n reconsume();\n return consumeANumericToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 58) {\n return new ColonToken();\n } else if (code === 59) {\n return new SemicolonToken();\n } else if (code === 60) {\n if (next(1) === 33 && next(2) === 45 && next(3) === 45) {\n consume(3);\n return new CDOToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 64) {\n if (wouldStartAnIdentifier(next(1), next(2), next(3)))\n return new AtKeywordToken(consumeAName());\n else\n return new DelimToken(code);\n } else if (code === 91) {\n return new OpenSquareToken();\n } else if (code === 92) {\n if (startsWithAValidEscape()) {\n reconsume();\n return consumeAnIdentlikeToken();\n } else {\n parseerror();\n return new DelimToken(code);\n }\n } else if (code === 93) {\n return new CloseSquareToken();\n } else if (code === 94) {\n if (next() === 61) {\n consume();\n return new PrefixMatchToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 123) {\n return new OpenCurlyToken();\n } else if (code === 124) {\n if (next() === 61) {\n consume();\n return new DashMatchToken();\n } else if (next() === 124) {\n consume();\n return new ColumnToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 125) {\n return new CloseCurlyToken();\n } else if (code === 126) {\n if (next() === 61) {\n consume();\n return new IncludeMatchToken();\n } else {\n return new DelimToken(code);\n }\n } else if (digit(code)) {\n reconsume();\n return consumeANumericToken();\n } else if (namestartchar(code)) {\n reconsume();\n return consumeAnIdentlikeToken();\n } else if (eof()) {\n return new EOFToken();\n } else {\n return new DelimToken(code);\n }\n };\n const consumeComments = function() {\n while (next(1) === 47 && next(2) === 42) {\n consume(2);\n while (true) {\n consume();\n if (code === 42 && next() === 47) {\n consume();\n break;\n } else if (eof()) {\n parseerror();\n return;\n }\n }\n }\n };\n const consumeANumericToken = function() {\n const num = consumeANumber();\n if (wouldStartAnIdentifier(next(1), next(2), next(3))) {\n const token = new DimensionToken();\n token.value = num.value;\n token.repr = num.repr;\n token.type = num.type;\n token.unit = consumeAName();\n return token;\n } else if (next() === 37) {\n consume();\n const token = new PercentageToken();\n token.value = num.value;\n token.repr = num.repr;\n return token;\n } else {\n const token = new NumberToken();\n token.value = num.value;\n token.repr = num.repr;\n token.type = num.type;\n return token;\n }\n };\n const consumeAnIdentlikeToken = function() {\n const str2 = consumeAName();\n if (str2.toLowerCase() === "url" && next() === 40) {\n consume();\n while (whitespace(next(1)) && whitespace(next(2)))\n consume();\n if (next() === 34 || next() === 39)\n return new FunctionToken(str2);\n else if (whitespace(next()) && (next(2) === 34 || next(2) === 39))\n return new FunctionToken(str2);\n else\n return consumeAURLToken();\n } else if (next() === 40) {\n consume();\n return new FunctionToken(str2);\n } else {\n return new IdentToken(str2);\n }\n };\n const consumeAStringToken = function(endingCodePoint) {\n if (endingCodePoint === void 0)\n endingCodePoint = code;\n let string = "";\n while (consume()) {\n if (code === endingCodePoint || eof()) {\n return new StringToken(string);\n } else if (newline(code)) {\n parseerror();\n reconsume();\n return new BadStringToken();\n } else if (code === 92) {\n if (eof(next()))\n donothing();\n else if (newline(next()))\n consume();\n else\n string += stringFromCode(consumeEscape());\n } else {\n string += stringFromCode(code);\n }\n }\n throw new Error("Internal error");\n };\n const consumeAURLToken = function() {\n const token = new URLToken("");\n while (whitespace(next()))\n consume();\n if (eof(next()))\n return token;\n while (consume()) {\n if (code === 41 || eof()) {\n return token;\n } else if (whitespace(code)) {\n while (whitespace(next()))\n consume();\n if (next() === 41 || eof(next())) {\n consume();\n return token;\n } else {\n consumeTheRemnantsOfABadURL();\n return new BadURLToken();\n }\n } else if (code === 34 || code === 39 || code === 40 || nonprintable(code)) {\n parseerror();\n consumeTheRemnantsOfABadURL();\n return new BadURLToken();\n } else if (code === 92) {\n if (startsWithAValidEscape()) {\n token.value += stringFromCode(consumeEscape());\n } else {\n parseerror();\n consumeTheRemnantsOfABadURL();\n return new BadURLToken();\n }\n } else {\n token.value += stringFromCode(code);\n }\n }\n throw new Error("Internal error");\n };\n const consumeEscape = function() {\n consume();\n if (hexdigit(code)) {\n const digits = [code];\n for (let total = 0; total < 5; total++) {\n if (hexdigit(next())) {\n consume();\n digits.push(code);\n } else {\n break;\n }\n }\n if (whitespace(next()))\n consume();\n let value = parseInt(digits.map(function(x) {\n return String.fromCharCode(x);\n }).join(""), 16);\n if (value > maximumallowedcodepoint)\n value = 65533;\n return value;\n } else if (eof()) {\n return 65533;\n } else {\n return code;\n }\n };\n const areAValidEscape = function(c1, c2) {\n if (c1 !== 92)\n return false;\n if (newline(c2))\n return false;\n return true;\n };\n const startsWithAValidEscape = function() {\n return areAValidEscape(code, next());\n };\n const wouldStartAnIdentifier = function(c1, c2, c3) {\n if (c1 === 45)\n return namestartchar(c2) || c2 === 45 || areAValidEscape(c2, c3);\n else if (namestartchar(c1))\n return true;\n else if (c1 === 92)\n return areAValidEscape(c1, c2);\n else\n return false;\n };\n const startsWithAnIdentifier = function() {\n return wouldStartAnIdentifier(code, next(1), next(2));\n };\n const wouldStartANumber = function(c1, c2, c3) {\n if (c1 === 43 || c1 === 45) {\n if (digit(c2))\n return true;\n if (c2 === 46 && digit(c3))\n return true;\n return false;\n } else if (c1 === 46) {\n if (digit(c2))\n return true;\n return false;\n } else if (digit(c1)) {\n return true;\n } else {\n return false;\n }\n };\n const startsWithANumber = function() {\n return wouldStartANumber(code, next(1), next(2));\n };\n const consumeAName = function() {\n let result = "";\n while (consume()) {\n if (namechar(code)) {\n result += stringFromCode(code);\n } else if (startsWithAValidEscape()) {\n result += stringFromCode(consumeEscape());\n } else {\n reconsume();\n return result;\n }\n }\n throw new Error("Internal parse error");\n };\n const consumeANumber = function() {\n let repr = "";\n let type = "integer";\n if (next() === 43 || next() === 45) {\n consume();\n repr += stringFromCode(code);\n }\n while (digit(next())) {\n consume();\n repr += stringFromCode(code);\n }\n if (next(1) === 46 && digit(next(2))) {\n consume();\n repr += stringFromCode(code);\n consume();\n repr += stringFromCode(code);\n type = "number";\n while (digit(next())) {\n consume();\n repr += stringFromCode(code);\n }\n }\n const c1 = next(1);\n const c2 = next(2);\n const c3 = next(3);\n if ((c1 === 69 || c1 === 101) && digit(c2)) {\n consume();\n repr += stringFromCode(code);\n consume();\n repr += stringFromCode(code);\n type = "number";\n while (digit(next())) {\n consume();\n repr += stringFromCode(code);\n }\n } else if ((c1 === 69 || c1 === 101) && (c2 === 43 || c2 === 45) && digit(c3)) {\n consume();\n repr += stringFromCode(code);\n consume();\n repr += stringFromCode(code);\n consume();\n repr += stringFromCode(code);\n type = "number";\n while (digit(next())) {\n consume();\n repr += stringFromCode(code);\n }\n }\n const value = convertAStringToANumber(repr);\n return { type, value, repr };\n };\n const convertAStringToANumber = function(string) {\n return +string;\n };\n const consumeTheRemnantsOfABadURL = function() {\n while (consume()) {\n if (code === 41 || eof()) {\n return;\n } else if (startsWithAValidEscape()) {\n consumeEscape();\n donothing();\n } else {\n donothing();\n }\n }\n };\n let iterationCount = 0;\n while (!eof(next())) {\n tokens.push(consumeAToken());\n iterationCount++;\n if (iterationCount > str.length * 2)\n throw new Error("I\'m infinite-looping!");\n }\n return tokens;\n}\nvar CSSParserToken = class {\n constructor() {\n this.tokenType = "";\n }\n toJSON() {\n return { token: this.tokenType };\n }\n toString() {\n return this.tokenType;\n }\n toSource() {\n return "" + this;\n }\n};\nvar BadStringToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "BADSTRING";\n }\n};\nvar BadURLToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "BADURL";\n }\n};\nvar WhitespaceToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "WHITESPACE";\n }\n toString() {\n return "WS";\n }\n toSource() {\n return " ";\n }\n};\nvar CDOToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "CDO";\n }\n toSource() {\n return "";\n }\n};\nvar ColonToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = ":";\n }\n};\nvar SemicolonToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = ";";\n }\n};\nvar CommaToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = ",";\n }\n};\nvar GroupingToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.value = "";\n this.mirror = "";\n }\n};\nvar OpenCurlyToken = class extends GroupingToken {\n constructor() {\n super();\n this.tokenType = "{";\n this.value = "{";\n this.mirror = "}";\n }\n};\nvar CloseCurlyToken = class extends GroupingToken {\n constructor() {\n super();\n this.tokenType = "}";\n this.value = "}";\n this.mirror = "{";\n }\n};\nvar OpenSquareToken = class extends GroupingToken {\n constructor() {\n super();\n this.tokenType = "[";\n this.value = "[";\n this.mirror = "]";\n }\n};\nvar CloseSquareToken = class extends GroupingToken {\n constructor() {\n super();\n this.tokenType = "]";\n this.value = "]";\n this.mirror = "[";\n }\n};\nvar OpenParenToken = class extends GroupingToken {\n constructor() {\n super();\n this.tokenType = "(";\n this.value = "(";\n this.mirror = ")";\n }\n};\nvar CloseParenToken = class extends GroupingToken {\n constructor() {\n super();\n this.tokenType = ")";\n this.value = ")";\n this.mirror = "(";\n }\n};\nvar IncludeMatchToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "~=";\n }\n};\nvar DashMatchToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "|=";\n }\n};\nvar PrefixMatchToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "^=";\n }\n};\nvar SuffixMatchToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "$=";\n }\n};\nvar SubstringMatchToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "*=";\n }\n};\nvar ColumnToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "||";\n }\n};\nvar EOFToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "EOF";\n }\n toSource() {\n return "";\n }\n};\nvar DelimToken = class extends CSSParserToken {\n constructor(code) {\n super();\n this.tokenType = "DELIM";\n this.value = "";\n this.value = stringFromCode(code);\n }\n toString() {\n return "DELIM(" + this.value + ")";\n }\n toJSON() {\n const json = this.constructor.prototype.constructor.prototype.toJSON.call(this);\n json.value = this.value;\n return json;\n }\n toSource() {\n if (this.value === "\\\\")\n return "\\\\\\n";\n else\n return this.value;\n }\n};\nvar StringValuedToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.value = "";\n }\n ASCIIMatch(str) {\n return this.value.toLowerCase() === str.toLowerCase();\n }\n toJSON() {\n const json = this.constructor.prototype.constructor.prototype.toJSON.call(this);\n json.value = this.value;\n return json;\n }\n};\nvar IdentToken = class extends StringValuedToken {\n constructor(val) {\n super();\n this.tokenType = "IDENT";\n this.value = val;\n }\n toString() {\n return "IDENT(" + this.value + ")";\n }\n toSource() {\n return escapeIdent(this.value);\n }\n};\nvar FunctionToken = class extends StringValuedToken {\n constructor(val) {\n super();\n this.tokenType = "FUNCTION";\n this.value = val;\n this.mirror = ")";\n }\n toString() {\n return "FUNCTION(" + this.value + ")";\n }\n toSource() {\n return escapeIdent(this.value) + "(";\n }\n};\nvar AtKeywordToken = class extends StringValuedToken {\n constructor(val) {\n super();\n this.tokenType = "AT-KEYWORD";\n this.value = val;\n }\n toString() {\n return "AT(" + this.value + ")";\n }\n toSource() {\n return "@" + escapeIdent(this.value);\n }\n};\nvar HashToken = class extends StringValuedToken {\n constructor(val) {\n super();\n this.tokenType = "HASH";\n this.value = val;\n this.type = "unrestricted";\n }\n toString() {\n return "HASH(" + this.value + ")";\n }\n toJSON() {\n const json = this.constructor.prototype.constructor.prototype.toJSON.call(this);\n json.value = this.value;\n json.type = this.type;\n return json;\n }\n toSource() {\n if (this.type === "id")\n return "#" + escapeIdent(this.value);\n else\n return "#" + escapeHash(this.value);\n }\n};\nvar StringToken = class extends StringValuedToken {\n constructor(val) {\n super();\n this.tokenType = "STRING";\n this.value = val;\n }\n toString() {\n return \'"\' + escapeString(this.value) + \'"\';\n }\n};\nvar URLToken = class extends StringValuedToken {\n constructor(val) {\n super();\n this.tokenType = "URL";\n this.value = val;\n }\n toString() {\n return "URL(" + this.value + ")";\n }\n toSource() {\n return \'url("\' + escapeString(this.value) + \'")\';\n }\n};\nvar NumberToken = class extends CSSParserToken {\n constructor() {\n super();\n this.tokenType = "NUMBER";\n this.type = "integer";\n this.repr = "";\n }\n toString() {\n if (this.type === "integer")\n return "INT(" + this.value + ")";\n return "NUMBER(" + this.value + ")";\n }\n toJSON() {\n const json = super.toJSON();\n json.value = this.value;\n json.type = this.type;\n json.repr = this.repr;\n return json;\n }\n toSource() {\n return this.repr;\n }\n};\nvar PercentageToken = class extends CSSParserToken {\n constructor() {\n super();\n this.tokenType = "PERCENTAGE";\n this.repr = "";\n }\n toString() {\n return "PERCENTAGE(" + this.value + ")";\n }\n toJSON() {\n const json = this.constructor.prototype.constructor.prototype.toJSON.call(this);\n json.value = this.value;\n json.repr = this.repr;\n return json;\n }\n toSource() {\n return this.repr + "%";\n }\n};\nvar DimensionToken = class extends CSSParserToken {\n constructor() {\n super();\n this.tokenType = "DIMENSION";\n this.type = "integer";\n this.repr = "";\n this.unit = "";\n }\n toString() {\n return "DIM(" + this.value + "," + this.unit + ")";\n }\n toJSON() {\n const json = this.constructor.prototype.constructor.prototype.toJSON.call(this);\n json.value = this.value;\n json.type = this.type;\n json.repr = this.repr;\n json.unit = this.unit;\n return json;\n }\n toSource() {\n const source = this.repr;\n let unit = escapeIdent(this.unit);\n if (unit[0].toLowerCase() === "e" && (unit[1] === "-" || between(unit.charCodeAt(1), 48, 57))) {\n unit = "\\\\65 " + unit.slice(1, unit.length);\n }\n return source + unit;\n }\n};\nfunction escapeIdent(string) {\n string = "" + string;\n let result = "";\n const firstcode = string.charCodeAt(0);\n for (let i = 0; i < string.length; i++) {\n const code = string.charCodeAt(i);\n if (code === 0)\n throw new InvalidCharacterError("Invalid character: the input contains U+0000.");\n if (between(code, 1, 31) || code === 127 || i === 0 && between(code, 48, 57) || i === 1 && between(code, 48, 57) && firstcode === 45)\n result += "\\\\" + code.toString(16) + " ";\n else if (code >= 128 || code === 45 || code === 95 || between(code, 48, 57) || between(code, 65, 90) || between(code, 97, 122))\n result += string[i];\n else\n result += "\\\\" + string[i];\n }\n return result;\n}\nfunction escapeHash(string) {\n string = "" + string;\n let result = "";\n for (let i = 0; i < string.length; i++) {\n const code = string.charCodeAt(i);\n if (code === 0)\n throw new InvalidCharacterError("Invalid character: the input contains U+0000.");\n if (code >= 128 || code === 45 || code === 95 || between(code, 48, 57) || between(code, 65, 90) || between(code, 97, 122))\n result += string[i];\n else\n result += "\\\\" + code.toString(16) + " ";\n }\n return result;\n}\nfunction escapeString(string) {\n string = "" + string;\n let result = "";\n for (let i = 0; i < string.length; i++) {\n const code = string.charCodeAt(i);\n if (code === 0)\n throw new InvalidCharacterError("Invalid character: the input contains U+0000.");\n if (between(code, 1, 31) || code === 127)\n result += "\\\\" + code.toString(16) + " ";\n else if (code === 34 || code === 92)\n result += "\\\\" + string[i];\n else\n result += string[i];\n }\n return result;\n}\n\n// packages/isomorphic/cssParser.ts\nvar InvalidSelectorError = class extends Error {\n};\nfunction parseCSS(selector, customNames) {\n let tokens;\n try {\n tokens = tokenize(selector);\n if (!(tokens[tokens.length - 1] instanceof EOFToken))\n tokens.push(new EOFToken());\n } catch (e) {\n const newMessage = e.message + ` while parsing css selector "${selector}". Did you mean to CSS.escape it?`;\n const index = (e.stack || "").indexOf(e.message);\n if (index !== -1)\n e.stack = e.stack.substring(0, index) + newMessage + e.stack.substring(index + e.message.length);\n e.message = newMessage;\n throw e;\n }\n const unsupportedToken = tokens.find((token) => {\n return token instanceof AtKeywordToken || token instanceof BadStringToken || token instanceof BadURLToken || token instanceof ColumnToken || token instanceof CDOToken || token instanceof CDCToken || token instanceof SemicolonToken || // TODO: Consider using these for something, e.g. to escape complex strings.\n // For example :xpath{ (//div/bar[@attr="foo"])[2]/baz }\n // Or this way :xpath( {complex-xpath-goes-here("hello")} )\n token instanceof OpenCurlyToken || token instanceof CloseCurlyToken || // TODO: Consider treating these as strings?\n token instanceof URLToken || token instanceof PercentageToken;\n });\n if (unsupportedToken)\n throw new InvalidSelectorError(`Unsupported token "${unsupportedToken.toSource()}" while parsing css selector "${selector}". Did you mean to CSS.escape it?`);\n let pos = 0;\n const names = /* @__PURE__ */ new Set();\n function unexpected() {\n return new InvalidSelectorError(`Unexpected token "${tokens[pos].toSource()}" while parsing css selector "${selector}". Did you mean to CSS.escape it?`);\n }\n function skipWhitespace() {\n while (tokens[pos] instanceof WhitespaceToken)\n pos++;\n }\n function isIdent(p = pos) {\n return tokens[p] instanceof IdentToken;\n }\n function isString(p = pos) {\n return tokens[p] instanceof StringToken;\n }\n function isNumber(p = pos) {\n return tokens[p] instanceof NumberToken;\n }\n function isComma(p = pos) {\n return tokens[p] instanceof CommaToken;\n }\n function isOpenParen(p = pos) {\n return tokens[p] instanceof OpenParenToken;\n }\n function isCloseParen(p = pos) {\n return tokens[p] instanceof CloseParenToken;\n }\n function isFunction(p = pos) {\n return tokens[p] instanceof FunctionToken;\n }\n function isStar(p = pos) {\n return tokens[p] instanceof DelimToken && tokens[p].value === "*";\n }\n function isEOF(p = pos) {\n return tokens[p] instanceof EOFToken;\n }\n function isClauseCombinator(p = pos) {\n return tokens[p] instanceof DelimToken && [">", "+", "~"].includes(tokens[p].value);\n }\n function isSelectorClauseEnd(p = pos) {\n return isComma(p) || isCloseParen(p) || isEOF(p) || isClauseCombinator(p) || tokens[p] instanceof WhitespaceToken;\n }\n function consumeFunctionArguments() {\n const result2 = [consumeArgument()];\n while (true) {\n skipWhitespace();\n if (!isComma())\n break;\n pos++;\n result2.push(consumeArgument());\n }\n return result2;\n }\n function consumeArgument() {\n skipWhitespace();\n if (isNumber())\n return tokens[pos++].value;\n if (isString())\n return tokens[pos++].value;\n return consumeComplexSelector();\n }\n function consumeComplexSelector() {\n const result2 = { simples: [] };\n skipWhitespace();\n if (isClauseCombinator()) {\n result2.simples.push({ selector: { functions: [{ name: "scope", args: [] }] }, combinator: "" });\n } else {\n result2.simples.push({ selector: consumeSimpleSelector(), combinator: "" });\n }\n while (true) {\n skipWhitespace();\n if (isClauseCombinator()) {\n result2.simples[result2.simples.length - 1].combinator = tokens[pos++].value;\n skipWhitespace();\n } else if (isSelectorClauseEnd()) {\n break;\n }\n result2.simples.push({ combinator: "", selector: consumeSimpleSelector() });\n }\n return result2;\n }\n function consumeSimpleSelector() {\n let rawCSSString = "";\n const functions = [];\n while (!isSelectorClauseEnd()) {\n if (isIdent() || isStar()) {\n rawCSSString += tokens[pos++].toSource();\n } else if (tokens[pos] instanceof HashToken) {\n rawCSSString += tokens[pos++].toSource();\n } else if (tokens[pos] instanceof DelimToken && tokens[pos].value === ".") {\n pos++;\n if (isIdent())\n rawCSSString += "." + tokens[pos++].toSource();\n else\n throw unexpected();\n } else if (tokens[pos] instanceof ColonToken) {\n pos++;\n if (isIdent()) {\n if (!customNames.has(tokens[pos].value.toLowerCase())) {\n rawCSSString += ":" + tokens[pos++].toSource();\n } else {\n const name = tokens[pos++].value.toLowerCase();\n functions.push({ name, args: [] });\n names.add(name);\n }\n } else if (isFunction()) {\n const name = tokens[pos++].value.toLowerCase();\n if (!customNames.has(name)) {\n rawCSSString += `:${name}(${consumeBuiltinFunctionArguments()})`;\n } else {\n functions.push({ name, args: consumeFunctionArguments() });\n names.add(name);\n }\n skipWhitespace();\n if (!isCloseParen())\n throw unexpected();\n pos++;\n } else {\n throw unexpected();\n }\n } else if (tokens[pos] instanceof OpenSquareToken) {\n rawCSSString += "[";\n pos++;\n while (!(tokens[pos] instanceof CloseSquareToken) && !isEOF())\n rawCSSString += tokens[pos++].toSource();\n if (!(tokens[pos] instanceof CloseSquareToken))\n throw unexpected();\n rawCSSString += "]";\n pos++;\n } else {\n throw unexpected();\n }\n }\n if (!rawCSSString && !functions.length)\n throw unexpected();\n return { css: rawCSSString || void 0, functions };\n }\n function consumeBuiltinFunctionArguments() {\n let s = "";\n let balance = 1;\n while (!isEOF()) {\n if (isOpenParen() || isFunction())\n balance++;\n if (isCloseParen())\n balance--;\n if (!balance)\n break;\n s += tokens[pos++].toSource();\n }\n return s;\n }\n const result = consumeFunctionArguments();\n if (!isEOF())\n throw unexpected();\n if (result.some((arg) => typeof arg !== "object" || !("simples" in arg)))\n throw new InvalidSelectorError(`Error while parsing css selector "${selector}". Did you mean to CSS.escape it?`);\n return { selector: result, names: Array.from(names) };\n}\n\n// packages/isomorphic/selectorParser.ts\nvar kNestedSelectorNames = /* @__PURE__ */ new Set(["internal:has", "internal:has-not", "internal:and", "internal:or", "internal:chain", "left-of", "right-of", "above", "below", "near"]);\nvar kNestedSelectorNamesWithDistance = /* @__PURE__ */ new Set(["left-of", "right-of", "above", "below", "near"]);\nvar customCSSNames = /* @__PURE__ */ new Set(["not", "is", "where", "has", "scope", "light", "visible", "text", "text-matches", "text-is", "has-text", "above", "below", "right-of", "left-of", "near", "nth-match"]);\nfunction parseSelector(selector) {\n const parsedStrings = parseSelectorString(selector);\n const parts = [];\n for (const part of parsedStrings.parts) {\n if (part.name === "css" || part.name === "css:light") {\n if (part.name === "css:light")\n part.body = ":light(" + part.body + ")";\n const parsedCSS = parseCSS(part.body, customCSSNames);\n parts.push({\n name: "css",\n body: parsedCSS.selector,\n source: part.body\n });\n continue;\n }\n if (kNestedSelectorNames.has(part.name)) {\n let innerSelector;\n let distance;\n try {\n const unescaped = JSON.parse("[" + part.body + "]");\n if (!Array.isArray(unescaped) || unescaped.length < 1 || unescaped.length > 2 || typeof unescaped[0] !== "string")\n throw new InvalidSelectorError(`Malformed selector: ${part.name}=` + part.body);\n innerSelector = unescaped[0];\n if (unescaped.length === 2) {\n if (typeof unescaped[1] !== "number" || !kNestedSelectorNamesWithDistance.has(part.name))\n throw new InvalidSelectorError(`Malformed selector: ${part.name}=` + part.body);\n distance = unescaped[1];\n }\n } catch (e) {\n throw new InvalidSelectorError(`Malformed selector: ${part.name}=` + part.body);\n }\n const nested = { name: part.name, source: part.body, body: { parsed: parseSelector(innerSelector), distance } };\n const lastFrame = [...nested.body.parsed.parts].reverse().find((part2) => part2.name === "internal:control" && part2.body === "enter-frame");\n const lastFrameIndex = lastFrame ? nested.body.parsed.parts.indexOf(lastFrame) : -1;\n if (lastFrameIndex !== -1 && selectorPartsEqual(nested.body.parsed.parts.slice(0, lastFrameIndex + 1), parts.slice(0, lastFrameIndex + 1)))\n nested.body.parsed.parts.splice(0, lastFrameIndex + 1);\n parts.push(nested);\n continue;\n }\n parts.push({ ...part, source: part.body });\n }\n if (kNestedSelectorNames.has(parts[0].name))\n throw new InvalidSelectorError(`"${parts[0].name}" selector cannot be first`);\n return {\n capture: parsedStrings.capture,\n parts\n };\n}\nfunction selectorPartsEqual(list1, list2) {\n return stringifySelector({ parts: list1 }) === stringifySelector({ parts: list2 });\n}\nfunction stringifySelector(selector, forceEngineName) {\n if (typeof selector === "string")\n return selector;\n return selector.parts.map((p, i) => {\n let includeEngine = true;\n if (!forceEngineName && i !== selector.capture) {\n if (p.name === "css")\n includeEngine = false;\n else if (p.name === "xpath" && p.source.startsWith("//") || p.source.startsWith(".."))\n includeEngine = false;\n }\n const prefix = includeEngine ? p.name + "=" : "";\n return `${i === selector.capture ? "*" : ""}${prefix}${p.source}`;\n }).join(" >> ");\n}\nfunction visitAllSelectorParts(selector, visitor) {\n const visit = (selector2, nested) => {\n for (const part of selector2.parts) {\n visitor(part, nested);\n if (kNestedSelectorNames.has(part.name))\n visit(part.body.parsed, true);\n }\n };\n visit(selector, false);\n}\nfunction parseSelectorString(selector) {\n let index = 0;\n let quote;\n let start = 0;\n const result = { parts: [] };\n const append = () => {\n const part = selector.substring(start, index).trim();\n const eqIndex = part.indexOf("=");\n let name;\n let body;\n if (eqIndex !== -1 && part.substring(0, eqIndex).trim().match(/^[a-zA-Z_0-9-+:*]+$/)) {\n name = part.substring(0, eqIndex).trim();\n body = part.substring(eqIndex + 1);\n } else if (part.length > 1 && part[0] === \'"\' && part[part.length - 1] === \'"\') {\n name = "text";\n body = part;\n } else if (part.length > 1 && part[0] === "\'" && part[part.length - 1] === "\'") {\n name = "text";\n body = part;\n } else if (/^\\(*\\/\\//.test(part) || part.startsWith("..")) {\n name = "xpath";\n body = part;\n } else {\n name = "css";\n body = part;\n }\n let capture = false;\n if (name[0] === "*") {\n capture = true;\n name = name.substring(1);\n }\n result.parts.push({ name, body });\n if (capture) {\n if (result.capture !== void 0)\n throw new InvalidSelectorError(`Only one of the selectors can capture using * modifier`);\n result.capture = result.parts.length - 1;\n }\n };\n if (!selector.includes(">>")) {\n index = selector.length;\n append();\n return result;\n }\n const shouldIgnoreTextSelectorQuote = () => {\n const prefix = selector.substring(start, index);\n const match = prefix.match(/^\\s*text\\s*=(.*)$/);\n return !!match && !!match[1];\n };\n while (index < selector.length) {\n const c = selector[index];\n if (c === "\\\\" && index + 1 < selector.length) {\n index += 2;\n } else if (c === quote) {\n quote = void 0;\n index++;\n } else if (!quote && (c === \'"\' || c === "\'" || c === "`") && !shouldIgnoreTextSelectorQuote()) {\n quote = c;\n index++;\n } else if (!quote && c === ">" && selector[index + 1] === ">") {\n append();\n index += 2;\n start = index;\n } else {\n index++;\n }\n }\n append();\n return result;\n}\nfunction parseAttributeSelector(selector, allowUnquotedStrings) {\n let wp = 0;\n let EOL = selector.length === 0;\n const next = () => selector[wp] || "";\n const eat1 = () => {\n const result2 = next();\n ++wp;\n EOL = wp >= selector.length;\n return result2;\n };\n const syntaxError = (stage) => {\n if (EOL)\n throw new InvalidSelectorError(`Unexpected end of selector while parsing selector \\`${selector}\\``);\n throw new InvalidSelectorError(`Error while parsing selector \\`${selector}\\` - unexpected symbol "${next()}" at position ${wp}` + (stage ? " during " + stage : ""));\n };\n function skipSpaces() {\n while (!EOL && /\\s/.test(next()))\n eat1();\n }\n function isCSSNameChar(char) {\n return char >= "\\x80" || char >= "0" && char <= "9" || char >= "A" && char <= "Z" || char >= "a" && char <= "z" || char >= "0" && char <= "9" || char === "_" || char === "-";\n }\n function readIdentifier() {\n let result2 = "";\n skipSpaces();\n while (!EOL && isCSSNameChar(next()))\n result2 += eat1();\n return result2;\n }\n function readQuotedString(quote) {\n let result2 = eat1();\n if (result2 !== quote)\n syntaxError("parsing quoted string");\n while (!EOL && next() !== quote) {\n if (next() === "\\\\")\n eat1();\n result2 += eat1();\n }\n if (next() !== quote)\n syntaxError("parsing quoted string");\n result2 += eat1();\n return result2;\n }\n function readRegularExpression() {\n if (eat1() !== "/")\n syntaxError("parsing regular expression");\n let source = "";\n let inClass = false;\n while (!EOL) {\n if (next() === "\\\\") {\n source += eat1();\n if (EOL)\n syntaxError("parsing regular expression");\n } else if (inClass && next() === "]") {\n inClass = false;\n } else if (!inClass && next() === "[") {\n inClass = true;\n } else if (!inClass && next() === "/") {\n break;\n }\n source += eat1();\n }\n if (eat1() !== "/")\n syntaxError("parsing regular expression");\n let flags = "";\n while (!EOL && next().match(/[dgimsuy]/))\n flags += eat1();\n try {\n return new RegExp(source, flags);\n } catch (e) {\n throw new InvalidSelectorError(`Error while parsing selector \\`${selector}\\`: ${e.message}`);\n }\n }\n function readAttributeToken() {\n let token = "";\n skipSpaces();\n if (next() === `\'` || next() === `"`)\n token = readQuotedString(next()).slice(1, -1);\n else\n token = readIdentifier();\n if (!token)\n syntaxError("parsing property path");\n return token;\n }\n function readOperator() {\n skipSpaces();\n let op = "";\n if (!EOL)\n op += eat1();\n if (!EOL && op !== "=")\n op += eat1();\n if (!["=", "*=", "^=", "$=", "|=", "~="].includes(op))\n syntaxError("parsing operator");\n return op;\n }\n function readAttribute() {\n eat1();\n const jsonPath = [];\n jsonPath.push(readAttributeToken());\n skipSpaces();\n while (next() === ".") {\n eat1();\n jsonPath.push(readAttributeToken());\n skipSpaces();\n }\n if (next() === "]") {\n eat1();\n return { name: jsonPath.join("."), jsonPath, op: "", value: null, caseSensitive: false };\n }\n const operator = readOperator();\n let value = void 0;\n let caseSensitive = true;\n skipSpaces();\n if (next() === "/") {\n if (operator !== "=")\n throw new InvalidSelectorError(`Error while parsing selector \\`${selector}\\` - cannot use ${operator} in attribute with regular expression`);\n value = readRegularExpression();\n } else if (next() === `\'` || next() === `"`) {\n value = readQuotedString(next()).slice(1, -1);\n skipSpaces();\n if (next() === "i" || next() === "I") {\n caseSensitive = false;\n eat1();\n } else if (next() === "s" || next() === "S") {\n caseSensitive = true;\n eat1();\n }\n } else {\n value = "";\n while (!EOL && (isCSSNameChar(next()) || next() === "+" || next() === "."))\n value += eat1();\n if (value === "true") {\n value = true;\n } else if (value === "false") {\n value = false;\n } else {\n if (!allowUnquotedStrings) {\n value = +value;\n if (Number.isNaN(value))\n syntaxError("parsing attribute value");\n }\n }\n }\n skipSpaces();\n if (next() !== "]")\n syntaxError("parsing attribute value");\n eat1();\n if (operator !== "=" && typeof value !== "string")\n throw new InvalidSelectorError(`Error while parsing selector \\`${selector}\\` - cannot use ${operator} in attribute with non-string matching value - ${value}`);\n return { name: jsonPath.join("."), jsonPath, op: operator, value, caseSensitive };\n }\n const result = {\n name: "",\n attributes: []\n };\n result.name = readIdentifier();\n skipSpaces();\n while (next() === "[") {\n result.attributes.push(readAttribute());\n skipSpaces();\n }\n if (!EOL)\n syntaxError(void 0);\n if (!result.name && !result.attributes.length)\n throw new InvalidSelectorError(`Error while parsing selector \\`${selector}\\` - selector cannot be empty`);\n return result;\n}\n\n// packages/isomorphic/stringUtils.ts\nfunction escapeWithQuotes(text, char = "\'") {\n const stringified = JSON.stringify(text);\n const escapedText = stringified.substring(1, stringified.length - 1).replace(/\\\\"/g, \'"\');\n if (char === "\'")\n return char + escapedText.replace(/[\']/g, "\\\\\'") + char;\n if (char === \'"\')\n return char + escapedText.replace(/["]/g, \'\\\\"\') + char;\n if (char === "`")\n return char + escapedText.replace(/[`]/g, "\\\\`") + char;\n throw new Error("Invalid escape char");\n}\nfunction toTitleCase(name) {\n return name.charAt(0).toUpperCase() + name.substring(1);\n}\nfunction toSnakeCase(name) {\n return name.replace(/([a-z0-9])([A-Z])/g, "$1_$2").replace(/([A-Z])([A-Z][a-z])/g, "$1_$2").toLowerCase();\n}\nfunction quoteCSSAttributeValue(text) {\n return `"${text.replace(/["\\\\]/g, (char) => "\\\\" + char)}"`;\n}\nvar normalizedWhitespaceCache;\nfunction cacheNormalizedWhitespaces() {\n normalizedWhitespaceCache = /* @__PURE__ */ new Map();\n}\nfunction normalizeWhiteSpace(text) {\n let result = normalizedWhitespaceCache == null ? void 0 : normalizedWhitespaceCache.get(text);\n if (result === void 0) {\n result = text.replace(/[\\u200b\\u00ad]/g, "").trim().replace(/\\s+/g, " ");\n normalizedWhitespaceCache == null ? void 0 : normalizedWhitespaceCache.set(text, result);\n }\n return result;\n}\nfunction normalizeEscapedRegexQuotes(source) {\n return source.replace(/(^|[^\\\\])(\\\\\\\\)*\\\\([\'"`])/g, "$1$2$3");\n}\nfunction escapeRegexForSelector(re) {\n if (re.unicode || re.unicodeSets)\n return String(re);\n return String(re).replace(/(^|[^\\\\])(\\\\\\\\)*(["\'`])/g, "$1$2\\\\$3").replace(/>>/g, "\\\\>\\\\>");\n}\nfunction escapeForTextSelector(text, exact) {\n if (typeof text !== "string")\n return escapeRegexForSelector(text);\n return `${JSON.stringify(text)}${exact ? "s" : "i"}`;\n}\nfunction escapeForAttributeSelector(value, exact) {\n if (typeof value !== "string")\n return escapeRegexForSelector(value);\n return `"${value.replace(/\\\\/g, "\\\\\\\\").replace(/["]/g, \'\\\\"\')}"${exact ? "s" : "i"}`;\n}\nfunction trimString(input, cap, suffix = "") {\n if (input.length <= cap)\n return input;\n const chars = [...input];\n if (chars.length > cap)\n return chars.slice(0, cap - suffix.length).join("") + suffix;\n return chars.join("");\n}\nfunction trimStringWithEllipsis(input, cap) {\n return trimString(input, cap, "\\u2026");\n}\nfunction escapeRegExp(s) {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, "\\\\$&");\n}\nfunction longestCommonSubstring(s1, s2) {\n const n = s1.length;\n const m = s2.length;\n let maxLen = 0;\n let endingIndex = 0;\n const dp = Array(n + 1).fill(null).map(() => Array(m + 1).fill(0));\n for (let i = 1; i <= n; i++) {\n for (let j = 1; j <= m; j++) {\n if (s1[i - 1] === s2[j - 1]) {\n dp[i][j] = dp[i - 1][j - 1] + 1;\n if (dp[i][j] > maxLen) {\n maxLen = dp[i][j];\n endingIndex = i;\n }\n }\n }\n }\n return s1.slice(endingIndex - maxLen, endingIndex);\n}\nvar ansiRegex = new RegExp("([\\\\u001B\\\\u009B][[\\\\]()#?]*(?:(?:(?:[a-zA-Z\\\\d]*(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)|(?:(?:\\\\d{0,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TZcf-ntqry=><~])))", "g");\n\n// packages/isomorphic/locatorGenerators.ts\nfunction asLocator(lang, selector, isFrameLocator = false) {\n return asLocators(lang, selector, isFrameLocator, 1)[0];\n}\nfunction asLocators(lang, selector, isFrameLocator = false, maxOutputSize = 20, preferredQuote) {\n try {\n return innerAsLocators(new generators[lang](preferredQuote), parseSelector(selector), isFrameLocator, maxOutputSize);\n } catch (e) {\n return [selector];\n }\n}\nfunction innerAsLocators(factory, parsed, isFrameLocator = false, maxOutputSize = 20) {\n const parts = [...parsed.parts];\n const tokens = [];\n let nextBase = isFrameLocator ? "frame-locator" : "page";\n for (let index = 0; index < parts.length; index++) {\n const part = parts[index];\n const base = nextBase;\n nextBase = "locator";\n if (part.name === "internal:describe")\n continue;\n if (part.name === "nth") {\n if (part.body === "0")\n tokens.push([factory.generateLocator(base, "first", ""), factory.generateLocator(base, "nth", "0")]);\n else if (part.body === "-1")\n tokens.push([factory.generateLocator(base, "last", ""), factory.generateLocator(base, "nth", "-1")]);\n else\n tokens.push([factory.generateLocator(base, "nth", part.body)]);\n continue;\n }\n if (part.name === "visible") {\n tokens.push([factory.generateLocator(base, "visible", part.body), factory.generateLocator(base, "default", `visible=${part.body}`)]);\n continue;\n }\n if (part.name === "internal:text") {\n const { exact, text } = detectExact(part.body);\n tokens.push([factory.generateLocator(base, "text", text, { exact })]);\n continue;\n }\n if (part.name === "internal:has-text") {\n const { exact, text } = detectExact(part.body);\n if (!exact) {\n tokens.push([factory.generateLocator(base, "has-text", text, { exact })]);\n continue;\n }\n }\n if (part.name === "internal:has-not-text") {\n const { exact, text } = detectExact(part.body);\n if (!exact) {\n tokens.push([factory.generateLocator(base, "has-not-text", text, { exact })]);\n continue;\n }\n }\n if (part.name === "internal:has") {\n const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize);\n tokens.push(inners.map((inner) => factory.generateLocator(base, "has", inner)));\n continue;\n }\n if (part.name === "internal:has-not") {\n const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize);\n tokens.push(inners.map((inner) => factory.generateLocator(base, "hasNot", inner)));\n continue;\n }\n if (part.name === "internal:and") {\n const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize);\n tokens.push(inners.map((inner) => factory.generateLocator(base, "and", inner)));\n continue;\n }\n if (part.name === "internal:or") {\n const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize);\n tokens.push(inners.map((inner) => factory.generateLocator(base, "or", inner)));\n continue;\n }\n if (part.name === "internal:chain") {\n const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize);\n tokens.push(inners.map((inner) => factory.generateLocator(base, "chain", inner)));\n continue;\n }\n if (part.name === "internal:label") {\n const { exact, text } = detectExact(part.body);\n tokens.push([factory.generateLocator(base, "label", text, { exact })]);\n continue;\n }\n if (part.name === "internal:role") {\n const attrSelector = parseAttributeSelector(part.body, true);\n const options = { attrs: [] };\n for (const attr of attrSelector.attributes) {\n if (attr.name === "name") {\n if (options.exact !== void 0 && options.exact !== attr.caseSensitive)\n throw new Error(`Conflicting exactness in internal:role selector: ${stringifySelector({ parts: [part] })}`);\n options.exact = attr.caseSensitive;\n options.name = attr.value;\n } else if (attr.name === "description") {\n if (options.exact !== void 0 && options.exact !== attr.caseSensitive)\n throw new Error(`Conflicting exactness in internal:role selector: ${stringifySelector({ parts: [part] })}`);\n options.exact = attr.caseSensitive;\n options.description = attr.value;\n } else {\n if (attr.name === "level" && typeof attr.value === "string")\n attr.value = +attr.value;\n options.attrs.push({ name: attr.name === "include-hidden" ? "includeHidden" : attr.name, value: attr.value });\n }\n }\n tokens.push([factory.generateLocator(base, "role", attrSelector.name, options)]);\n continue;\n }\n if (part.name === "internal:testid") {\n const attrSelector = parseAttributeSelector(part.body, true);\n const { value } = attrSelector.attributes[0];\n tokens.push([factory.generateLocator(base, "test-id", value)]);\n continue;\n }\n if (part.name === "internal:attr") {\n const attrSelector = parseAttributeSelector(part.body, true);\n const { name, value, caseSensitive } = attrSelector.attributes[0];\n const text = value;\n const exact = !!caseSensitive;\n if (name === "placeholder") {\n tokens.push([factory.generateLocator(base, "placeholder", text, { exact })]);\n continue;\n }\n if (name === "alt") {\n tokens.push([factory.generateLocator(base, "alt", text, { exact })]);\n continue;\n }\n if (name === "title") {\n tokens.push([factory.generateLocator(base, "title", text, { exact })]);\n continue;\n }\n }\n if (part.name === "internal:control" && part.body === "enter-frame") {\n const lastTokens = tokens[tokens.length - 1];\n const lastPart = parts[index - 1];\n const transformed = lastTokens.map((token) => factory.chainLocators([token, factory.generateLocator(base, "frame", "")]));\n if (["xpath", "css"].includes(lastPart.name)) {\n transformed.push(\n factory.generateLocator(base, "frame-locator", stringifySelector({ parts: [lastPart] })),\n factory.generateLocator(base, "frame-locator", stringifySelector({ parts: [lastPart] }, true))\n );\n }\n lastTokens.splice(0, lastTokens.length, ...transformed);\n nextBase = "frame-locator";\n continue;\n }\n const nextPart = parts[index + 1];\n const selectorPart = stringifySelector({ parts: [part] });\n const locatorPart = factory.generateLocator(base, "default", selectorPart);\n if (nextPart && ["internal:has-text", "internal:has-not-text"].includes(nextPart.name)) {\n const { exact, text } = detectExact(nextPart.body);\n if (!exact) {\n const nextLocatorPart = factory.generateLocator("locator", nextPart.name === "internal:has-text" ? "has-text" : "has-not-text", text, { exact });\n const options = {};\n if (nextPart.name === "internal:has-text")\n options.hasText = text;\n else\n options.hasNotText = text;\n const combinedPart = factory.generateLocator(base, "default", selectorPart, options);\n tokens.push([factory.chainLocators([locatorPart, nextLocatorPart]), combinedPart]);\n index++;\n continue;\n }\n }\n let locatorPartWithEngine;\n if (["xpath", "css"].includes(part.name)) {\n const selectorPart2 = stringifySelector(\n { parts: [part] },\n /* forceEngineName */\n true\n );\n locatorPartWithEngine = factory.generateLocator(base, "default", selectorPart2);\n }\n tokens.push([locatorPart, locatorPartWithEngine].filter(Boolean));\n }\n return combineTokens(factory, tokens, maxOutputSize);\n}\nfunction combineTokens(factory, tokens, maxOutputSize) {\n const currentTokens = tokens.map(() => "");\n const result = [];\n const visit = (index) => {\n if (index === tokens.length) {\n result.push(factory.chainLocators(currentTokens));\n return result.length < maxOutputSize;\n }\n for (const taken of tokens[index]) {\n currentTokens[index] = taken;\n if (!visit(index + 1))\n return false;\n }\n return true;\n };\n visit(0);\n return result;\n}\nfunction detectExact(text) {\n let exact = false;\n const match = text.match(/^\\/(.*)\\/([igm]*)$/);\n if (match)\n return { text: new RegExp(match[1], match[2]) };\n if (text.endsWith(\'"\')) {\n text = JSON.parse(text);\n exact = true;\n } else if (text.endsWith(\'"s\')) {\n text = JSON.parse(text.substring(0, text.length - 1));\n exact = true;\n } else if (text.endsWith(\'"i\')) {\n text = JSON.parse(text.substring(0, text.length - 1));\n exact = false;\n }\n return { exact, text };\n}\nvar JavaScriptLocatorFactory = class {\n constructor(preferredQuote) {\n this.preferredQuote = preferredQuote;\n }\n generateLocator(base, kind, body, options = {}) {\n switch (kind) {\n case "default":\n if (options.hasText !== void 0)\n return `locator(${this.quote(body)}, { hasText: ${this.toHasText(options.hasText)} })`;\n if (options.hasNotText !== void 0)\n return `locator(${this.quote(body)}, { hasNotText: ${this.toHasText(options.hasNotText)} })`;\n return `locator(${this.quote(body)})`;\n case "frame-locator":\n return `frameLocator(${this.quote(body)})`;\n case "frame":\n return `contentFrame()`;\n case "nth":\n return `nth(${body})`;\n case "first":\n return `first()`;\n case "last":\n return `last()`;\n case "visible":\n return `filter({ visible: ${body === "true" ? "true" : "false"} })`;\n case "role":\n const attrs = [];\n if (isRegExp(options.name))\n attrs.push(`name: ${this.regexToSourceString(options.name)}`);\n else if (typeof options.name === "string")\n attrs.push(`name: ${this.quote(options.name)}`);\n if (isRegExp(options.description))\n attrs.push(`description: ${this.regexToSourceString(options.description)}`);\n else if (typeof options.description === "string")\n attrs.push(`description: ${this.quote(options.description)}`);\n if (options.exact && (typeof options.name === "string" || typeof options.description === "string"))\n attrs.push(`exact: true`);\n for (const { name, value } of options.attrs)\n attrs.push(`${name}: ${typeof value === "string" ? this.quote(value) : value}`);\n const attrString = attrs.length ? `, { ${attrs.join(", ")} }` : "";\n return `getByRole(${this.quote(body)}${attrString})`;\n case "has-text":\n return `filter({ hasText: ${this.toHasText(body)} })`;\n case "has-not-text":\n return `filter({ hasNotText: ${this.toHasText(body)} })`;\n case "has":\n return `filter({ has: ${body} })`;\n case "hasNot":\n return `filter({ hasNot: ${body} })`;\n case "and":\n return `and(${body})`;\n case "or":\n return `or(${body})`;\n case "chain":\n return `locator(${body})`;\n case "test-id":\n return `getByTestId(${this.toTestIdValue(body)})`;\n case "text":\n return this.toCallWithExact("getByText", body, !!options.exact);\n case "alt":\n return this.toCallWithExact("getByAltText", body, !!options.exact);\n case "placeholder":\n return this.toCallWithExact("getByPlaceholder", body, !!options.exact);\n case "label":\n return this.toCallWithExact("getByLabel", body, !!options.exact);\n case "title":\n return this.toCallWithExact("getByTitle", body, !!options.exact);\n default:\n throw new Error("Unknown selector kind " + kind);\n }\n }\n chainLocators(locators) {\n return locators.join(".");\n }\n regexToSourceString(re) {\n return normalizeEscapedRegexQuotes(String(re));\n }\n toCallWithExact(method, body, exact) {\n if (isRegExp(body))\n return `${method}(${this.regexToSourceString(body)})`;\n return exact ? `${method}(${this.quote(body)}, { exact: true })` : `${method}(${this.quote(body)})`;\n }\n toHasText(body) {\n if (isRegExp(body))\n return this.regexToSourceString(body);\n return this.quote(body);\n }\n toTestIdValue(value) {\n if (isRegExp(value))\n return this.regexToSourceString(value);\n return this.quote(value);\n }\n quote(text) {\n var _a;\n return escapeWithQuotes(text, (_a = this.preferredQuote) != null ? _a : "\'");\n }\n};\nvar PythonLocatorFactory = class {\n generateLocator(base, kind, body, options = {}) {\n switch (kind) {\n case "default":\n if (options.hasText !== void 0)\n return `locator(${this.quote(body)}, has_text=${this.toHasText(options.hasText)})`;\n if (options.hasNotText !== void 0)\n return `locator(${this.quote(body)}, has_not_text=${this.toHasText(options.hasNotText)})`;\n return `locator(${this.quote(body)})`;\n case "frame-locator":\n return `frame_locator(${this.quote(body)})`;\n case "frame":\n return `content_frame`;\n case "nth":\n return `nth(${body})`;\n case "first":\n return `first`;\n case "last":\n return `last`;\n case "visible":\n return `filter(visible=${body === "true" ? "True" : "False"})`;\n case "role":\n const attrs = [];\n if (isRegExp(options.name))\n attrs.push(`name=${this.regexToString(options.name)}`);\n else if (typeof options.name === "string")\n attrs.push(`name=${this.quote(options.name)}`);\n if (isRegExp(options.description))\n attrs.push(`description=${this.regexToString(options.description)}`);\n else if (typeof options.description === "string")\n attrs.push(`description=${this.quote(options.description)}`);\n if (options.exact && (typeof options.name === "string" || typeof options.description === "string"))\n attrs.push(`exact=True`);\n for (const { name, value } of options.attrs) {\n let valueString = typeof value === "string" ? this.quote(value) : value;\n if (typeof value === "boolean")\n valueString = value ? "True" : "False";\n attrs.push(`${toSnakeCase(name)}=${valueString}`);\n }\n const attrString = attrs.length ? `, ${attrs.join(", ")}` : "";\n return `get_by_role(${this.quote(body)}${attrString})`;\n case "has-text":\n return `filter(has_text=${this.toHasText(body)})`;\n case "has-not-text":\n return `filter(has_not_text=${this.toHasText(body)})`;\n case "has":\n return `filter(has=${body})`;\n case "hasNot":\n return `filter(has_not=${body})`;\n case "and":\n return `and_(${body})`;\n case "or":\n return `or_(${body})`;\n case "chain":\n return `locator(${body})`;\n case "test-id":\n return `get_by_test_id(${this.toTestIdValue(body)})`;\n case "text":\n return this.toCallWithExact("get_by_text", body, !!options.exact);\n case "alt":\n return this.toCallWithExact("get_by_alt_text", body, !!options.exact);\n case "placeholder":\n return this.toCallWithExact("get_by_placeholder", body, !!options.exact);\n case "label":\n return this.toCallWithExact("get_by_label", body, !!options.exact);\n case "title":\n return this.toCallWithExact("get_by_title", body, !!options.exact);\n default:\n throw new Error("Unknown selector kind " + kind);\n }\n }\n chainLocators(locators) {\n return locators.join(".");\n }\n regexToString(body) {\n const suffix = body.flags.includes("i") ? ", re.IGNORECASE" : "";\n return `re.compile(r"${normalizeEscapedRegexQuotes(body.source).replace(/\\\\\\//, "/").replace(/"/g, \'\\\\"\')}"${suffix})`;\n }\n toCallWithExact(method, body, exact) {\n if (isRegExp(body))\n return `${method}(${this.regexToString(body)})`;\n if (exact)\n return `${method}(${this.quote(body)}, exact=True)`;\n return `${method}(${this.quote(body)})`;\n }\n toHasText(body) {\n if (isRegExp(body))\n return this.regexToString(body);\n return `${this.quote(body)}`;\n }\n toTestIdValue(value) {\n if (isRegExp(value))\n return this.regexToString(value);\n return this.quote(value);\n }\n quote(text) {\n return escapeWithQuotes(text, \'"\');\n }\n};\nvar JavaLocatorFactory = class {\n generateLocator(base, kind, body, options = {}) {\n let clazz;\n switch (base) {\n case "page":\n clazz = "Page";\n break;\n case "frame-locator":\n clazz = "FrameLocator";\n break;\n case "locator":\n clazz = "Locator";\n break;\n }\n switch (kind) {\n case "default":\n if (options.hasText !== void 0)\n return `locator(${this.quote(body)}, new ${clazz}.LocatorOptions().setHasText(${this.toHasText(options.hasText)}))`;\n if (options.hasNotText !== void 0)\n return `locator(${this.quote(body)}, new ${clazz}.LocatorOptions().setHasNotText(${this.toHasText(options.hasNotText)}))`;\n return `locator(${this.quote(body)})`;\n case "frame-locator":\n return `frameLocator(${this.quote(body)})`;\n case "frame":\n return `contentFrame()`;\n case "nth":\n return `nth(${body})`;\n case "first":\n return `first()`;\n case "last":\n return `last()`;\n case "visible":\n return `filter(new ${clazz}.FilterOptions().setVisible(${body === "true" ? "true" : "false"}))`;\n case "role":\n const attrs = [];\n if (isRegExp(options.name))\n attrs.push(`.setName(${this.regexToString(options.name)})`);\n else if (typeof options.name === "string")\n attrs.push(`.setName(${this.quote(options.name)})`);\n if (isRegExp(options.description))\n attrs.push(`.setDescription(${this.regexToString(options.description)})`);\n else if (typeof options.description === "string")\n attrs.push(`.setDescription(${this.quote(options.description)})`);\n if (options.exact && (typeof options.name === "string" || typeof options.description === "string"))\n attrs.push(`.setExact(true)`);\n for (const { name, value } of options.attrs)\n attrs.push(`.set${toTitleCase(name)}(${typeof value === "string" ? this.quote(value) : value})`);\n const attrString = attrs.length ? `, new ${clazz}.GetByRoleOptions()${attrs.join("")}` : "";\n return `getByRole(AriaRole.${toSnakeCase(body).toUpperCase()}${attrString})`;\n case "has-text":\n return `filter(new ${clazz}.FilterOptions().setHasText(${this.toHasText(body)}))`;\n case "has-not-text":\n return `filter(new ${clazz}.FilterOptions().setHasNotText(${this.toHasText(body)}))`;\n case "has":\n return `filter(new ${clazz}.FilterOptions().setHas(${body}))`;\n case "hasNot":\n return `filter(new ${clazz}.FilterOptions().setHasNot(${body}))`;\n case "and":\n return `and(${body})`;\n case "or":\n return `or(${body})`;\n case "chain":\n return `locator(${body})`;\n case "test-id":\n return `getByTestId(${this.toTestIdValue(body)})`;\n case "text":\n return this.toCallWithExact(clazz, "getByText", body, !!options.exact);\n case "alt":\n return this.toCallWithExact(clazz, "getByAltText", body, !!options.exact);\n case "placeholder":\n return this.toCallWithExact(clazz, "getByPlaceholder", body, !!options.exact);\n case "label":\n return this.toCallWithExact(clazz, "getByLabel", body, !!options.exact);\n case "title":\n return this.toCallWithExact(clazz, "getByTitle", body, !!options.exact);\n default:\n throw new Error("Unknown selector kind " + kind);\n }\n }\n chainLocators(locators) {\n return locators.join(".");\n }\n regexToString(body) {\n const suffix = body.flags.includes("i") ? ", Pattern.CASE_INSENSITIVE" : "";\n return `Pattern.compile(${this.quote(normalizeEscapedRegexQuotes(body.source))}${suffix})`;\n }\n toCallWithExact(clazz, method, body, exact) {\n if (isRegExp(body))\n return `${method}(${this.regexToString(body)})`;\n if (exact)\n return `${method}(${this.quote(body)}, new ${clazz}.${toTitleCase(method)}Options().setExact(true))`;\n return `${method}(${this.quote(body)})`;\n }\n toHasText(body) {\n if (isRegExp(body))\n return this.regexToString(body);\n return this.quote(body);\n }\n toTestIdValue(value) {\n if (isRegExp(value))\n return this.regexToString(value);\n return this.quote(value);\n }\n quote(text) {\n return escapeWithQuotes(text, \'"\');\n }\n};\nvar CSharpLocatorFactory = class {\n generateLocator(base, kind, body, options = {}) {\n switch (kind) {\n case "default":\n if (options.hasText !== void 0)\n return `Locator(${this.quote(body)}, new() { ${this.toHasText(options.hasText)} })`;\n if (options.hasNotText !== void 0)\n return `Locator(${this.quote(body)}, new() { ${this.toHasNotText(options.hasNotText)} })`;\n return `Locator(${this.quote(body)})`;\n case "frame-locator":\n return `FrameLocator(${this.quote(body)})`;\n case "frame":\n return `ContentFrame`;\n case "nth":\n return `Nth(${body})`;\n case "first":\n return `First`;\n case "last":\n return `Last`;\n case "visible":\n return `Filter(new() { Visible = ${body === "true" ? "true" : "false"} })`;\n case "role":\n const attrs = [];\n if (isRegExp(options.name))\n attrs.push(`NameRegex = ${this.regexToString(options.name)}`);\n else if (typeof options.name === "string")\n attrs.push(`Name = ${this.quote(options.name)}`);\n if (isRegExp(options.description))\n attrs.push(`DescriptionRegex = ${this.regexToString(options.description)}`);\n else if (typeof options.description === "string")\n attrs.push(`Description = ${this.quote(options.description)}`);\n if (options.exact && (typeof options.name === "string" || typeof options.description === "string"))\n attrs.push(`Exact = true`);\n for (const { name, value } of options.attrs)\n attrs.push(`${toTitleCase(name)} = ${typeof value === "string" ? this.quote(value) : value}`);\n const attrString = attrs.length ? `, new() { ${attrs.join(", ")} }` : "";\n return `GetByRole(AriaRole.${toTitleCase(body)}${attrString})`;\n case "has-text":\n return `Filter(new() { ${this.toHasText(body)} })`;\n case "has-not-text":\n return `Filter(new() { ${this.toHasNotText(body)} })`;\n case "has":\n return `Filter(new() { Has = ${body} })`;\n case "hasNot":\n return `Filter(new() { HasNot = ${body} })`;\n case "and":\n return `And(${body})`;\n case "or":\n return `Or(${body})`;\n case "chain":\n return `Locator(${body})`;\n case "test-id":\n return `GetByTestId(${this.toTestIdValue(body)})`;\n case "text":\n return this.toCallWithExact("GetByText", body, !!options.exact);\n case "alt":\n return this.toCallWithExact("GetByAltText", body, !!options.exact);\n case "placeholder":\n return this.toCallWithExact("GetByPlaceholder", body, !!options.exact);\n case "label":\n return this.toCallWithExact("GetByLabel", body, !!options.exact);\n case "title":\n return this.toCallWithExact("GetByTitle", body, !!options.exact);\n default:\n throw new Error("Unknown selector kind " + kind);\n }\n }\n chainLocators(locators) {\n return locators.join(".");\n }\n regexToString(body) {\n const suffix = body.flags.includes("i") ? ", RegexOptions.IgnoreCase" : "";\n return `new Regex(${this.quote(normalizeEscapedRegexQuotes(body.source))}${suffix})`;\n }\n toCallWithExact(method, body, exact) {\n if (isRegExp(body))\n return `${method}(${this.regexToString(body)})`;\n if (exact)\n return `${method}(${this.quote(body)}, new() { Exact = true })`;\n return `${method}(${this.quote(body)})`;\n }\n toHasText(body) {\n if (isRegExp(body))\n return `HasTextRegex = ${this.regexToString(body)}`;\n return `HasText = ${this.quote(body)}`;\n }\n toTestIdValue(value) {\n if (isRegExp(value))\n return this.regexToString(value);\n return this.quote(value);\n }\n toHasNotText(body) {\n if (isRegExp(body))\n return `HasNotTextRegex = ${this.regexToString(body)}`;\n return `HasNotText = ${this.quote(body)}`;\n }\n quote(text) {\n return escapeWithQuotes(text, \'"\');\n }\n};\nvar JsonlLocatorFactory = class {\n generateLocator(base, kind, body, options = {}) {\n return JSON.stringify({\n kind,\n body,\n options\n });\n }\n chainLocators(locators) {\n const objects = locators.map((l) => JSON.parse(l));\n for (let i = 0; i < objects.length - 1; ++i)\n objects[i].next = objects[i + 1];\n return JSON.stringify(objects[0]);\n }\n};\nvar generators = {\n javascript: JavaScriptLocatorFactory,\n python: PythonLocatorFactory,\n java: JavaLocatorFactory,\n csharp: CSharpLocatorFactory,\n jsonl: JsonlLocatorFactory\n};\nfunction isRegExp(obj) {\n return obj instanceof RegExp;\n}\n\n// packages/isomorphic/locatorUtils.ts\nfunction getByAttributeTextSelector(attrName, text, options) {\n return `internal:attr=[${attrName}=${escapeForAttributeSelector(text, (options == null ? void 0 : options.exact) || false)}]`;\n}\nfunction splitTestIdAttributeNames(testIdAttributeName) {\n return testIdAttributeName.split(",");\n}\nfunction encodeTestIdAttributeName(testIdAttributeName) {\n return testIdAttributeName.includes(",") ? JSON.stringify(testIdAttributeName) : testIdAttributeName;\n}\nfunction getByTestIdSelector(testIdAttributeName, testId) {\n return `internal:testid=[${encodeTestIdAttributeName(testIdAttributeName)}=${escapeForAttributeSelector(testId, true)}]`;\n}\nfunction getByLabelSelector(text, options) {\n return "internal:label=" + escapeForTextSelector(text, !!(options == null ? void 0 : options.exact));\n}\nfunction getByAltTextSelector(text, options) {\n return getByAttributeTextSelector("alt", text, options);\n}\nfunction getByTitleSelector(text, options) {\n return getByAttributeTextSelector("title", text, options);\n}\nfunction getByPlaceholderSelector(text, options) {\n return getByAttributeTextSelector("placeholder", text, options);\n}\nfunction getByTextSelector(text, options) {\n return "internal:text=" + escapeForTextSelector(text, !!(options == null ? void 0 : options.exact));\n}\nfunction getByRoleSelector(role, options = {}) {\n const props = [];\n if (options.checked !== void 0)\n props.push(["checked", String(options.checked)]);\n if (options.disabled !== void 0)\n props.push(["disabled", String(options.disabled)]);\n if (options.selected !== void 0)\n props.push(["selected", String(options.selected)]);\n if (options.expanded !== void 0)\n props.push(["expanded", String(options.expanded)]);\n if (options.includeHidden !== void 0)\n props.push(["include-hidden", String(options.includeHidden)]);\n if (options.level !== void 0)\n props.push(["level", String(options.level)]);\n if (options.name !== void 0)\n props.push(["name", escapeForAttributeSelector(options.name, !!options.exact)]);\n if (options.description !== void 0)\n props.push(["description", escapeForAttributeSelector(options.description, !!options.exact)]);\n if (options.pressed !== void 0)\n props.push(["pressed", String(options.pressed)]);\n return `internal:role=${role}${props.map(([n, v]) => `[${n}=${v}]`).join("")}`;\n}\n\n// packages/isomorphic/yaml.ts\nfunction yamlEscapeKeyIfNeeded(str) {\n if (!yamlStringNeedsQuotes(str))\n return str;\n return `\'` + str.replace(/\'/g, `\'\'`) + `\'`;\n}\nfunction yamlEscapeValueIfNeeded(str) {\n if (!yamlStringNeedsQuotes(str))\n return str;\n return \'"\' + str.replace(/[\\\\"\\x00-\\x1f\\x7f-\\x9f]/g, (c) => {\n switch (c) {\n case "\\\\":\n return "\\\\\\\\";\n case \'"\':\n return \'\\\\"\';\n case "\\b":\n return "\\\\b";\n case "\\f":\n return "\\\\f";\n case "\\n":\n return "\\\\n";\n case "\\r":\n return "\\\\r";\n case " ":\n return "\\\\t";\n default:\n const code = c.charCodeAt(0);\n return "\\\\x" + code.toString(16).padStart(2, "0");\n }\n }) + \'"\';\n}\nfunction yamlStringNeedsQuotes(str) {\n if (str.length === 0)\n return true;\n if (/^\\s|\\s$/.test(str))\n return true;\n if (/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f-\\x9f]/.test(str))\n return true;\n if (/^-/.test(str))\n return true;\n if (/[\\n:](\\s|$)/.test(str))\n return true;\n if (/\\s#/.test(str))\n return true;\n if (/[\\n\\r]/.test(str))\n return true;\n if (/^[&*\\],?!>|@"\'#%]/.test(str))\n return true;\n if (/[{}`]/.test(str))\n return true;\n if (/^\\[/.test(str))\n return true;\n if (!isNaN(Number(str)) || ["y", "n", "yes", "no", "true", "false", "on", "off", "null"].includes(str.toLowerCase()))\n return true;\n return false;\n}\n\n// packages/injected/src/domUtils.ts\nvar globalOptions = {};\nfunction setGlobalOptions(options) {\n globalOptions = options;\n}\nfunction isInsideScope(scope, element) {\n while (element) {\n if (scope.contains(element))\n return true;\n element = enclosingShadowHost(element);\n }\n return false;\n}\nfunction parentElementOrShadowHost(element) {\n if (element.parentElement)\n return element.parentElement;\n if (!element.parentNode)\n return;\n if (element.parentNode.nodeType === 11 && element.parentNode.host)\n return element.parentNode.host;\n}\nfunction enclosingShadowRootOrDocument(element) {\n let node = element;\n while (node.parentNode)\n node = node.parentNode;\n if (node.nodeType === 11 || node.nodeType === 9)\n return node;\n}\nfunction enclosingShadowHost(element) {\n while (element.parentElement)\n element = element.parentElement;\n return parentElementOrShadowHost(element);\n}\nfunction closestCrossShadow(element, css, scope) {\n while (element) {\n const closest = element.closest(css);\n if (scope && closest !== scope && (closest == null ? void 0 : closest.contains(scope)))\n return;\n if (closest)\n return closest;\n element = enclosingShadowHost(element);\n }\n}\nfunction getElementComputedStyle(element, pseudo) {\n const cache = pseudo === "::before" ? cacheStyleBefore : pseudo === "::after" ? cacheStyleAfter : cacheStyle;\n if (cache && cache.has(element))\n return cache.get(element);\n const style = element.ownerDocument && element.ownerDocument.defaultView ? element.ownerDocument.defaultView.getComputedStyle(element, pseudo) : void 0;\n cache == null ? void 0 : cache.set(element, style);\n return style;\n}\nfunction isElementStyleVisibilityVisible(element, style) {\n style = style != null ? style : getElementComputedStyle(element);\n if (!style)\n return true;\n if (Element.prototype.checkVisibility && globalOptions.browserNameForWorkarounds !== "webkit") {\n if (!element.checkVisibility())\n return false;\n } else {\n const detailsOrSummary = element.closest("details,summary");\n if (detailsOrSummary !== element && (detailsOrSummary == null ? void 0 : detailsOrSummary.nodeName) === "DETAILS" && !detailsOrSummary.open)\n return false;\n }\n if (style.visibility !== "visible")\n return false;\n return true;\n}\nfunction computeBox(element) {\n const style = getElementComputedStyle(element);\n if (!style)\n return { visible: true, inline: false };\n const cursor = style.cursor;\n if (style.display === "contents") {\n for (let child = element.firstChild; child; child = child.nextSibling) {\n if (child.nodeType === 1 && isElementVisible(child))\n return { visible: true, inline: false, cursor };\n if (child.nodeType === 3 && isVisibleTextNode(child))\n return { visible: true, inline: true, cursor };\n }\n return { visible: false, inline: false, cursor };\n }\n if (!isElementStyleVisibilityVisible(element, style))\n return { cursor, visible: false, inline: false };\n const rect = element.getBoundingClientRect();\n return { cursor, visible: rect.width > 0 && rect.height > 0, inline: style.display === "inline" };\n}\nfunction isElementVisible(element) {\n return computeBox(element).visible;\n}\nfunction isVisibleTextNode(node) {\n const range = node.ownerDocument.createRange();\n range.selectNode(node);\n const rect = range.getBoundingClientRect();\n return rect.width > 0 && rect.height > 0;\n}\nfunction elementSafeTagName(element) {\n const tagName = element.tagName;\n if (typeof tagName === "string")\n return tagName.toUpperCase();\n if (element instanceof HTMLFormElement)\n return "FORM";\n return element.tagName.toUpperCase();\n}\nvar cacheStyle;\nvar cacheStyleBefore;\nvar cacheStyleAfter;\nvar cachesCounter = 0;\nfunction beginDOMCaches() {\n ++cachesCounter;\n cacheStyle != null ? cacheStyle : cacheStyle = /* @__PURE__ */ new Map();\n cacheStyleBefore != null ? cacheStyleBefore : cacheStyleBefore = /* @__PURE__ */ new Map();\n cacheStyleAfter != null ? cacheStyleAfter : cacheStyleAfter = /* @__PURE__ */ new Map();\n}\nfunction endDOMCaches() {\n if (!--cachesCounter) {\n cacheStyle = void 0;\n cacheStyleBefore = void 0;\n cacheStyleAfter = void 0;\n }\n}\n\n// packages/injected/src/roleUtils.ts\nfunction hasExplicitAccessibleName(e) {\n return e.hasAttribute("aria-label") || e.hasAttribute("aria-labelledby");\n}\nvar kAncestorPreventingLandmark = "article:not([role]), aside:not([role]), main:not([role]), nav:not([role]), section:not([role]), [role=article], [role=complementary], [role=main], [role=navigation], [role=region]";\nvar kGlobalAriaAttributes = [\n ["aria-atomic", void 0],\n ["aria-busy", void 0],\n ["aria-controls", void 0],\n ["aria-current", void 0],\n ["aria-describedby", void 0],\n ["aria-details", void 0],\n // Global use deprecated in ARIA 1.2\n // [\'aria-disabled\', undefined],\n ["aria-dropeffect", void 0],\n // Global use deprecated in ARIA 1.2\n // [\'aria-errormessage\', undefined],\n ["aria-flowto", void 0],\n ["aria-grabbed", void 0],\n // Global use deprecated in ARIA 1.2\n // [\'aria-haspopup\', undefined],\n ["aria-hidden", void 0],\n // Global use deprecated in ARIA 1.2\n // [\'aria-invalid\', undefined],\n ["aria-keyshortcuts", void 0],\n ["aria-label", ["caption", "code", "deletion", "emphasis", "generic", "insertion", "paragraph", "presentation", "strong", "subscript", "superscript"]],\n ["aria-labelledby", ["caption", "code", "deletion", "emphasis", "generic", "insertion", "paragraph", "presentation", "strong", "subscript", "superscript"]],\n ["aria-live", void 0],\n ["aria-owns", void 0],\n ["aria-relevant", void 0],\n ["aria-roledescription", ["generic"]]\n];\nfunction hasGlobalAriaAttribute(element, forRole) {\n return kGlobalAriaAttributes.some(([attr, prohibited]) => {\n return !(prohibited == null ? void 0 : prohibited.includes(forRole || "")) && element.hasAttribute(attr);\n });\n}\nfunction hasTabIndex(element) {\n return !Number.isNaN(Number(String(element.getAttribute("tabindex"))));\n}\nfunction isFocusable(element) {\n return !isNativelyDisabled(element) && (isNativelyFocusable(element) || hasTabIndex(element));\n}\nfunction isNativelyFocusable(element) {\n const tagName = elementSafeTagName(element);\n if (["BUTTON", "DETAILS", "SELECT", "TEXTAREA"].includes(tagName))\n return true;\n if (tagName === "A" || tagName === "AREA")\n return element.hasAttribute("href");\n if (tagName === "INPUT")\n return !element.hidden;\n return false;\n}\nvar kImplicitRoleByTagName = {\n "A": (e) => {\n return e.hasAttribute("href") ? "link" : null;\n },\n "AREA": (e) => {\n return e.hasAttribute("href") ? "link" : null;\n },\n "ARTICLE": () => "article",\n "ASIDE": () => "complementary",\n "BLOCKQUOTE": () => "blockquote",\n "BUTTON": () => "button",\n "CAPTION": () => "caption",\n "CODE": () => "code",\n "DATALIST": () => "listbox",\n "DD": () => "definition",\n "DEL": () => "deletion",\n "DETAILS": () => "group",\n "DFN": () => "term",\n "DIALOG": () => "dialog",\n "DT": () => "term",\n "EM": () => "emphasis",\n "FIELDSET": () => "group",\n "FIGURE": () => "figure",\n "FOOTER": (e) => closestCrossShadow(e, kAncestorPreventingLandmark) ? null : "contentinfo",\n "FORM": (e) => hasExplicitAccessibleName(e) ? "form" : null,\n "H1": () => "heading",\n "H2": () => "heading",\n "H3": () => "heading",\n "H4": () => "heading",\n "H5": () => "heading",\n "H6": () => "heading",\n "HEADER": (e) => closestCrossShadow(e, kAncestorPreventingLandmark) ? null : "banner",\n "HR": () => "separator",\n "HTML": () => "document",\n "IMG": (e) => e.getAttribute("alt") === "" && !e.getAttribute("title") && !hasGlobalAriaAttribute(e) && !hasTabIndex(e) ? "presentation" : "img",\n "INPUT": (e) => {\n const type = e.type.toLowerCase();\n if (type === "search")\n return e.hasAttribute("list") ? "combobox" : "searchbox";\n if (["email", "tel", "text", "url", ""].includes(type)) {\n const list = getIdRefs(e, e.getAttribute("list"))[0];\n return list && elementSafeTagName(list) === "DATALIST" ? "combobox" : "textbox";\n }\n if (type === "hidden")\n return null;\n if (type === "file")\n return "button";\n return inputTypeToRole[type] || "textbox";\n },\n "INS": () => "insertion",\n "LI": () => "listitem",\n "MAIN": () => "main",\n "MARK": () => "mark",\n "MATH": () => "math",\n "MENU": () => "list",\n "METER": () => "meter",\n "NAV": () => "navigation",\n "OL": () => "list",\n "OPTGROUP": () => "group",\n "OPTION": () => "option",\n "OUTPUT": () => "status",\n "P": () => "paragraph",\n "PROGRESS": () => "progressbar",\n "SEARCH": () => "search",\n "SECTION": (e) => hasExplicitAccessibleName(e) ? "region" : null,\n "SELECT": (e) => e.hasAttribute("multiple") || e.size > 1 ? "listbox" : "combobox",\n "STRONG": () => "strong",\n "SUB": () => "subscript",\n "SUP": () => "superscript",\n // For we default to Chrome behavior:\n // - Chrome reports \'img\'.\n // - Firefox reports \'diagram\' that is not in official ARIA spec yet.\n // - Safari reports \'no role\', but still computes accessible name.\n "SVG": () => "img",\n "TABLE": () => "table",\n "TBODY": () => "rowgroup",\n "TD": (e) => {\n const table = closestCrossShadow(e, "table");\n const role = table ? getExplicitAriaRole(table) : "";\n return role === "grid" || role === "treegrid" ? "gridcell" : "cell";\n },\n "TEXTAREA": () => "textbox",\n "TFOOT": () => "rowgroup",\n "TH": (e) => {\n const scope = e.getAttribute("scope");\n if (scope === "col" || scope === "colgroup")\n return "columnheader";\n if (scope === "row" || scope === "rowgroup")\n return "rowheader";\n const nextSibling = e.nextElementSibling;\n const prevSibling = e.previousElementSibling;\n const row = !!e.parentElement && elementSafeTagName(e.parentElement) === "TR" ? e.parentElement : void 0;\n if (!nextSibling && !prevSibling) {\n if (row) {\n const table = closestCrossShadow(row, "table");\n if (table && table.rows.length <= 1)\n return null;\n }\n return "columnheader";\n }\n if (isHeaderCell(nextSibling) && isHeaderCell(prevSibling))\n return "columnheader";\n if (isNonEmptyDataCell(nextSibling) || isNonEmptyDataCell(prevSibling))\n return "rowheader";\n return "columnheader";\n },\n "THEAD": () => "rowgroup",\n "TIME": () => "time",\n "TR": () => "row",\n "UL": () => "list"\n};\nfunction isHeaderCell(element) {\n return !!element && elementSafeTagName(element) === "TH";\n}\nfunction isNonEmptyDataCell(element) {\n var _a;\n if (!element || elementSafeTagName(element) !== "TD")\n return false;\n return !!(((_a = element.textContent) == null ? void 0 : _a.trim()) || element.children.length > 0);\n}\nvar kPresentationInheritanceParents = {\n "DD": ["DL", "DIV"],\n "DIV": ["DL"],\n "DT": ["DL", "DIV"],\n "LI": ["OL", "UL"],\n "TBODY": ["TABLE"],\n "TD": ["TR"],\n "TFOOT": ["TABLE"],\n "TH": ["TR"],\n "THEAD": ["TABLE"],\n "TR": ["THEAD", "TBODY", "TFOOT", "TABLE"]\n};\nfunction getImplicitAriaRole(element) {\n var _a;\n const implicitRole = ((_a = kImplicitRoleByTagName[elementSafeTagName(element)]) == null ? void 0 : _a.call(kImplicitRoleByTagName, element)) || "";\n if (!implicitRole)\n return null;\n let ancestor = element;\n while (ancestor) {\n const parent = parentElementOrShadowHost(ancestor);\n const parents = kPresentationInheritanceParents[elementSafeTagName(ancestor)];\n if (!parents || !parent || !parents.includes(elementSafeTagName(parent)))\n break;\n const parentExplicitRole = getExplicitAriaRole(parent);\n if ((parentExplicitRole === "none" || parentExplicitRole === "presentation") && !hasPresentationConflictResolution(parent, parentExplicitRole))\n return parentExplicitRole;\n ancestor = parent;\n }\n return implicitRole;\n}\nvar validRoles = [\n "alert",\n "alertdialog",\n "application",\n "article",\n "banner",\n "blockquote",\n "button",\n "caption",\n "cell",\n "checkbox",\n "code",\n "columnheader",\n "combobox",\n "complementary",\n "contentinfo",\n "definition",\n "deletion",\n "dialog",\n "directory",\n "document",\n "emphasis",\n "feed",\n "figure",\n "form",\n "generic",\n "grid",\n "gridcell",\n "group",\n "heading",\n "img",\n "insertion",\n "link",\n "list",\n "listbox",\n "listitem",\n "log",\n "main",\n "mark",\n "marquee",\n "math",\n "meter",\n "menu",\n "menubar",\n "menuitem",\n "menuitemcheckbox",\n "menuitemradio",\n "navigation",\n "none",\n "note",\n "option",\n "paragraph",\n "presentation",\n "progressbar",\n "radio",\n "radiogroup",\n "region",\n "row",\n "rowgroup",\n "rowheader",\n "scrollbar",\n "search",\n "searchbox",\n "separator",\n "slider",\n "spinbutton",\n "status",\n "strong",\n "subscript",\n "superscript",\n "switch",\n "tab",\n "table",\n "tablist",\n "tabpanel",\n "term",\n "textbox",\n "time",\n "timer",\n "toolbar",\n "tooltip",\n "tree",\n "treegrid",\n "treeitem"\n];\nfunction getExplicitAriaRole(element) {\n const roles = (element.getAttribute("role") || "").split(" ").map((role) => role.trim());\n return roles.find((role) => validRoles.includes(role)) || null;\n}\nfunction hasPresentationConflictResolution(element, role) {\n return hasGlobalAriaAttribute(element, role) || isFocusable(element);\n}\nfunction getAriaRole(element) {\n const explicitRole = getExplicitAriaRole(element);\n if (!explicitRole)\n return getImplicitAriaRole(element);\n if (explicitRole === "none" || explicitRole === "presentation") {\n const implicitRole = getImplicitAriaRole(element);\n if (hasPresentationConflictResolution(element, implicitRole))\n return implicitRole;\n }\n return explicitRole;\n}\nfunction getAriaBoolean(attr) {\n return attr === null ? void 0 : attr.toLowerCase() === "true";\n}\nfunction isElementIgnoredForAria(element) {\n return ["STYLE", "SCRIPT", "NOSCRIPT", "TEMPLATE"].includes(elementSafeTagName(element));\n}\nfunction isElementHiddenForAria(element) {\n if (isElementIgnoredForAria(element))\n return true;\n const style = getElementComputedStyle(element);\n const isSlot = element.nodeName === "SLOT";\n if ((style == null ? void 0 : style.display) === "contents" && !isSlot) {\n for (let child = element.firstChild; child; child = child.nextSibling) {\n if (child.nodeType === 1 && !isElementHiddenForAria(child))\n return false;\n if (child.nodeType === 3 && isVisibleTextNode(child))\n return false;\n }\n return true;\n }\n const isOptionInsideSelect = element.nodeName === "OPTION" && !!element.closest("select");\n if (!isOptionInsideSelect && !isSlot && !isElementStyleVisibilityVisible(element, style))\n return true;\n return belongsToDisplayNoneOrAriaHiddenOrNonSlotted(element);\n}\nfunction belongsToDisplayNoneOrAriaHiddenOrNonSlotted(element) {\n let hidden = cacheIsHidden == null ? void 0 : cacheIsHidden.get(element);\n if (hidden === void 0) {\n hidden = false;\n if (element.parentElement && element.parentElement.shadowRoot && !element.assignedSlot)\n hidden = true;\n if (!hidden) {\n const style = getElementComputedStyle(element);\n hidden = !style || style.display === "none" || getAriaBoolean(element.getAttribute("aria-hidden")) === true;\n }\n if (!hidden) {\n const parent = parentElementOrShadowHost(element);\n if (parent)\n hidden = belongsToDisplayNoneOrAriaHiddenOrNonSlotted(parent);\n }\n cacheIsHidden == null ? void 0 : cacheIsHidden.set(element, hidden);\n }\n return hidden;\n}\nfunction getIdRefs(element, ref) {\n if (!ref)\n return [];\n const root = enclosingShadowRootOrDocument(element);\n if (!root)\n return [];\n try {\n const ids = ref.split(" ").filter((id) => !!id);\n const result = [];\n for (const id of ids) {\n const firstElement = root.querySelector("#" + CSS.escape(id));\n if (firstElement && !result.includes(firstElement))\n result.push(firstElement);\n }\n return result;\n } catch (e) {\n return [];\n }\n}\nfunction trimFlatString(s) {\n return s.trim();\n}\nfunction asFlatString(s) {\n return s.split("\\xA0").map((chunk) => chunk.replace(/\\r\\n/g, "\\n").replace(/[\\u200b\\u00ad]/g, "").replace(/\\s\\s*/g, " ")).join("\\xA0").trim();\n}\nfunction queryInAriaOwned(element, selector) {\n const result = [...element.querySelectorAll(selector)];\n for (const owned of getIdRefs(element, element.getAttribute("aria-owns"))) {\n if (owned.matches(selector))\n result.push(owned);\n result.push(...owned.querySelectorAll(selector));\n }\n return result;\n}\nfunction getCSSContent(element, pseudo) {\n const cache = pseudo === "::before" ? cachePseudoContentBefore : pseudo === "::after" ? cachePseudoContentAfter : cachePseudoContent;\n if (cache == null ? void 0 : cache.has(element))\n return cache == null ? void 0 : cache.get(element);\n const style = getElementComputedStyle(element, pseudo);\n let content;\n if (style) {\n const contentValue = style.content;\n if (contentValue && contentValue !== "none" && contentValue !== "normal") {\n if (style.display !== "none" && style.visibility !== "hidden") {\n content = parseCSSContentPropertyAsString(element, contentValue, !!pseudo);\n }\n }\n }\n if (pseudo && content !== void 0) {\n const display = (style == null ? void 0 : style.display) || "inline";\n if (display !== "inline")\n content = " " + content + " ";\n }\n if (cache)\n cache.set(element, content);\n return content;\n}\nfunction parseCSSContentPropertyAsString(element, content, isPseudo) {\n if (!content || content === "none" || content === "normal") {\n return;\n }\n try {\n let tokens = tokenize(content).filter((token) => !(token instanceof WhitespaceToken));\n const delimIndex = tokens.findIndex((token) => token instanceof DelimToken && token.value === "/");\n if (delimIndex !== -1) {\n tokens = tokens.slice(delimIndex + 1);\n } else if (!isPseudo) {\n return;\n }\n const accumulated = [];\n let index = 0;\n while (index < tokens.length) {\n if (tokens[index] instanceof StringToken) {\n accumulated.push(tokens[index].value);\n index++;\n } else if (index + 2 < tokens.length && tokens[index] instanceof FunctionToken && tokens[index].value === "attr" && tokens[index + 1] instanceof IdentToken && tokens[index + 2] instanceof CloseParenToken) {\n const attrName = tokens[index + 1].value;\n accumulated.push(element.getAttribute(attrName) || "");\n index += 3;\n } else {\n return;\n }\n }\n return accumulated.join("");\n } catch {\n }\n}\nfunction getAriaLabelledByElements(element) {\n const ref = element.getAttribute("aria-labelledby");\n if (ref === null)\n return null;\n const refs = getIdRefs(element, ref);\n return refs.length ? refs : null;\n}\nfunction allowsNameFromContent(role, targetDescendant) {\n const alwaysAllowsNameFromContent = ["button", "cell", "checkbox", "columnheader", "gridcell", "heading", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "row", "rowheader", "switch", "tab", "tooltip", "treeitem"].includes(role);\n const descendantAllowsNameFromContent = targetDescendant && ["", "caption", "code", "contentinfo", "definition", "deletion", "emphasis", "insertion", "list", "listitem", "mark", "none", "paragraph", "presentation", "region", "row", "rowgroup", "section", "strong", "subscript", "superscript", "table", "term", "time"].includes(role);\n return alwaysAllowsNameFromContent || descendantAllowsNameFromContent;\n}\nfunction getElementAccessibleName(element, includeHidden) {\n const cache = includeHidden ? cacheAccessibleNameHidden : cacheAccessibleName;\n let accessibleName = cache == null ? void 0 : cache.get(element);\n if (accessibleName === void 0) {\n accessibleName = "";\n const elementProhibitsNaming = ["caption", "code", "definition", "deletion", "emphasis", "generic", "insertion", "mark", "paragraph", "presentation", "strong", "subscript", "suggestion", "superscript", "term", "time"].includes(getAriaRole(element) || "");\n if (!elementProhibitsNaming) {\n accessibleName = asFlatString(getTextAlternativeInternal(element, {\n includeHidden,\n visitedElements: /* @__PURE__ */ new Set(),\n embeddedInTargetElement: "self"\n }));\n }\n cache == null ? void 0 : cache.set(element, accessibleName);\n }\n return accessibleName;\n}\nfunction getElementAccessibleDescription(element, includeHidden) {\n const cache = includeHidden ? cacheAccessibleDescriptionHidden : cacheAccessibleDescription;\n let accessibleDescription = cache == null ? void 0 : cache.get(element);\n if (accessibleDescription === void 0) {\n accessibleDescription = "";\n if (element.hasAttribute("aria-describedby")) {\n const describedBy = getIdRefs(element, element.getAttribute("aria-describedby"));\n accessibleDescription = asFlatString(describedBy.map((ref) => getTextAlternativeInternal(ref, {\n includeHidden,\n visitedElements: /* @__PURE__ */ new Set(),\n embeddedInDescribedBy: { element: ref, hidden: isElementHiddenForAria(ref) }\n })).join(" "));\n } else if (element.hasAttribute("aria-description")) {\n accessibleDescription = asFlatString(element.getAttribute("aria-description") || "");\n } else {\n accessibleDescription = asFlatString(element.getAttribute("title") || "");\n }\n cache == null ? void 0 : cache.set(element, accessibleDescription);\n }\n return accessibleDescription;\n}\nvar kAriaInvalidRoles = [\n "application",\n "checkbox",\n "columnheader",\n "combobox",\n "gridcell",\n "listbox",\n "radiogroup",\n "rowheader",\n "searchbox",\n "slider",\n "spinbutton",\n "switch",\n "textbox",\n "tree"\n];\nfunction getAriaInvalid(element) {\n const ariaInvalid = element.getAttribute("aria-invalid");\n if (!ariaInvalid || ariaInvalid.trim() === "" || ariaInvalid.toLocaleLowerCase() === "false")\n return "false";\n if (ariaInvalid === "true" || ariaInvalid === "grammar" || ariaInvalid === "spelling")\n return ariaInvalid;\n return "true";\n}\nfunction getValidityInvalid(element) {\n if ("validity" in element) {\n const validity = element.validity;\n return (validity == null ? void 0 : validity.valid) === false;\n }\n return false;\n}\nfunction getElementAccessibleErrorMessage(element) {\n const cache = cacheAccessibleErrorMessage;\n let accessibleErrorMessage = cacheAccessibleErrorMessage == null ? void 0 : cacheAccessibleErrorMessage.get(element);\n if (accessibleErrorMessage === void 0) {\n accessibleErrorMessage = "";\n const isAriaInvalid = getAriaInvalid(element) !== "false";\n const isValidityInvalid = getValidityInvalid(element);\n if (isAriaInvalid || isValidityInvalid) {\n const errorMessageId = element.getAttribute("aria-errormessage");\n const errorMessages = getIdRefs(element, errorMessageId);\n const parts = errorMessages.map((errorMessage) => asFlatString(\n getTextAlternativeInternal(errorMessage, {\n visitedElements: /* @__PURE__ */ new Set(),\n embeddedInDescribedBy: { element: errorMessage, hidden: isElementHiddenForAria(errorMessage) }\n })\n ));\n accessibleErrorMessage = parts.join(" ").trim();\n }\n cache == null ? void 0 : cache.set(element, accessibleErrorMessage);\n }\n return accessibleErrorMessage;\n}\nfunction getTextAlternativeInternal(element, options) {\n var _a, _b, _c, _d;\n if (options.visitedElements.has(element))\n return "";\n const childOptions = {\n ...options,\n embeddedInTargetElement: options.embeddedInTargetElement === "self" ? "descendant" : options.embeddedInTargetElement\n };\n if (!options.includeHidden) {\n const isEmbeddedInHiddenReferenceTraversal = !!((_a = options.embeddedInLabelledBy) == null ? void 0 : _a.hidden) || !!((_b = options.embeddedInDescribedBy) == null ? void 0 : _b.hidden) || !!((_c = options.embeddedInNativeTextAlternative) == null ? void 0 : _c.hidden) || !!((_d = options.embeddedInLabel) == null ? void 0 : _d.hidden);\n if (isElementIgnoredForAria(element) || !isEmbeddedInHiddenReferenceTraversal && isElementHiddenForAria(element)) {\n options.visitedElements.add(element);\n return "";\n }\n }\n const labelledBy = getAriaLabelledByElements(element);\n if (!options.embeddedInLabelledBy) {\n const accessibleName = (labelledBy || []).map((ref) => getTextAlternativeInternal(ref, {\n ...options,\n embeddedInLabelledBy: { element: ref, hidden: isElementHiddenForAria(ref) },\n embeddedInDescribedBy: void 0,\n embeddedInTargetElement: void 0,\n embeddedInLabel: void 0,\n embeddedInNativeTextAlternative: void 0\n })).join(" ");\n if (accessibleName)\n return accessibleName;\n }\n const role = getAriaRole(element) || "";\n const tagName = elementSafeTagName(element);\n if (!!options.embeddedInLabel || !!options.embeddedInLabelledBy || options.embeddedInTargetElement === "descendant") {\n const isOwnLabel = [...element.labels || []].includes(element);\n const isOwnLabelledBy = (labelledBy || []).includes(element);\n if (!isOwnLabel && !isOwnLabelledBy) {\n if (role === "textbox") {\n options.visitedElements.add(element);\n if (tagName === "INPUT" || tagName === "TEXTAREA")\n return element.value;\n return element.textContent || "";\n }\n if (["combobox", "listbox"].includes(role)) {\n options.visitedElements.add(element);\n let selectedOptions;\n if (tagName === "SELECT") {\n selectedOptions = [...element.selectedOptions];\n if (!selectedOptions.length && element.options.length)\n selectedOptions.push(element.options[0]);\n } else {\n const listbox = role === "combobox" ? queryInAriaOwned(element, "*").find((e) => getAriaRole(e) === "listbox") : element;\n selectedOptions = listbox ? queryInAriaOwned(listbox, \'[aria-selected="true"]\').filter((e) => getAriaRole(e) === "option") : [];\n }\n if (!selectedOptions.length && tagName === "INPUT") {\n return element.value;\n }\n return selectedOptions.map((option) => getTextAlternativeInternal(option, childOptions)).join(" ");\n }\n if (["progressbar", "scrollbar", "slider", "spinbutton", "meter"].includes(role)) {\n options.visitedElements.add(element);\n if (element.hasAttribute("aria-valuetext"))\n return element.getAttribute("aria-valuetext") || "";\n if (element.hasAttribute("aria-valuenow"))\n return element.getAttribute("aria-valuenow") || "";\n return element.getAttribute("value") || "";\n }\n if (["menu"].includes(role)) {\n options.visitedElements.add(element);\n return "";\n }\n }\n }\n const ariaLabel = element.getAttribute("aria-label") || "";\n if (trimFlatString(ariaLabel)) {\n options.visitedElements.add(element);\n return ariaLabel;\n }\n if (!["presentation", "none"].includes(role)) {\n if (tagName === "INPUT" && ["button", "submit", "reset"].includes(element.type)) {\n options.visitedElements.add(element);\n const value = element.value || "";\n if (trimFlatString(value))\n return value;\n if (element.type === "submit")\n return "Submit";\n if (element.type === "reset")\n return "Reset";\n const title = element.getAttribute("title") || "";\n return title;\n }\n if (tagName === "INPUT" && element.type === "file") {\n options.visitedElements.add(element);\n const labels = element.labels || [];\n if (labels.length && !options.embeddedInLabelledBy)\n return getAccessibleNameFromAssociatedLabels(labels, options);\n return "Choose File";\n }\n if (tagName === "INPUT" && element.type === "image") {\n options.visitedElements.add(element);\n const labels = element.labels || [];\n if (labels.length && !options.embeddedInLabelledBy)\n return getAccessibleNameFromAssociatedLabels(labels, options);\n const alt = element.getAttribute("alt") || "";\n if (trimFlatString(alt))\n return alt;\n const title = element.getAttribute("title") || "";\n if (trimFlatString(title))\n return title;\n return "Submit";\n }\n if (!labelledBy && tagName === "BUTTON") {\n options.visitedElements.add(element);\n const labels = element.labels || [];\n if (labels.length)\n return getAccessibleNameFromAssociatedLabels(labels, options);\n }\n if (!labelledBy && tagName === "OUTPUT") {\n options.visitedElements.add(element);\n const labels = element.labels || [];\n if (labels.length)\n return getAccessibleNameFromAssociatedLabels(labels, options);\n return element.getAttribute("title") || "";\n }\n if (!labelledBy && (tagName === "TEXTAREA" || tagName === "SELECT" || tagName === "INPUT")) {\n options.visitedElements.add(element);\n const labels = element.labels || [];\n if (labels.length)\n return getAccessibleNameFromAssociatedLabels(labels, options);\n const usePlaceholder = tagName === "INPUT" && ["text", "password", "search", "tel", "email", "url"].includes(element.type) || tagName === "TEXTAREA";\n const placeholder = element.getAttribute("placeholder") || "";\n const title = element.getAttribute("title") || "";\n if (!usePlaceholder || title)\n return title;\n return placeholder;\n }\n if (!labelledBy && tagName === "FIELDSET") {\n options.visitedElements.add(element);\n for (let child = element.firstElementChild; child; child = child.nextElementSibling) {\n if (elementSafeTagName(child) === "LEGEND") {\n return getTextAlternativeInternal(child, {\n ...childOptions,\n embeddedInNativeTextAlternative: { element: child, hidden: isElementHiddenForAria(child) }\n });\n }\n }\n const title = element.getAttribute("title") || "";\n return title;\n }\n if (!labelledBy && tagName === "FIGURE") {\n options.visitedElements.add(element);\n for (let child = element.firstElementChild; child; child = child.nextElementSibling) {\n if (elementSafeTagName(child) === "FIGCAPTION") {\n return getTextAlternativeInternal(child, {\n ...childOptions,\n embeddedInNativeTextAlternative: { element: child, hidden: isElementHiddenForAria(child) }\n });\n }\n }\n const title = element.getAttribute("title") || "";\n return title;\n }\n if (tagName === "IMG") {\n options.visitedElements.add(element);\n const alt = element.getAttribute("alt") || "";\n if (trimFlatString(alt))\n return alt;\n const title = element.getAttribute("title") || "";\n return title;\n }\n if (tagName === "TABLE") {\n options.visitedElements.add(element);\n for (let child = element.firstElementChild; child; child = child.nextElementSibling) {\n if (elementSafeTagName(child) === "CAPTION") {\n return getTextAlternativeInternal(child, {\n ...childOptions,\n embeddedInNativeTextAlternative: { element: child, hidden: isElementHiddenForAria(child) }\n });\n }\n }\n const summary = element.getAttribute("summary") || "";\n if (summary)\n return summary;\n }\n if (tagName === "AREA") {\n options.visitedElements.add(element);\n const alt = element.getAttribute("alt") || "";\n if (trimFlatString(alt))\n return alt;\n const title = element.getAttribute("title") || "";\n return title;\n }\n if (tagName === "SVG" || element.ownerSVGElement) {\n options.visitedElements.add(element);\n for (let child = element.firstElementChild; child; child = child.nextElementSibling) {\n if (elementSafeTagName(child) === "TITLE" && child.ownerSVGElement) {\n return getTextAlternativeInternal(child, {\n ...childOptions,\n embeddedInLabelledBy: { element: child, hidden: isElementHiddenForAria(child) }\n });\n }\n }\n }\n if (element.ownerSVGElement && tagName === "A") {\n const title = element.getAttribute("xlink:title") || "";\n if (trimFlatString(title)) {\n options.visitedElements.add(element);\n return title;\n }\n }\n }\n const shouldNameFromContentForSummary = tagName === "SUMMARY" && !["presentation", "none"].includes(role);\n if (allowsNameFromContent(role, options.embeddedInTargetElement === "descendant") || shouldNameFromContentForSummary || !!options.embeddedInLabelledBy || !!options.embeddedInDescribedBy || !!options.embeddedInLabel || !!options.embeddedInNativeTextAlternative) {\n options.visitedElements.add(element);\n const accessibleName = innerAccumulatedElementText(element, childOptions);\n const maybeTrimmedAccessibleName = options.embeddedInTargetElement === "self" ? trimFlatString(accessibleName) : accessibleName;\n if (maybeTrimmedAccessibleName)\n return accessibleName;\n }\n if (!["presentation", "none"].includes(role) || tagName === "IFRAME") {\n options.visitedElements.add(element);\n const title = element.getAttribute("title") || "";\n if (trimFlatString(title))\n return title;\n }\n options.visitedElements.add(element);\n return "";\n}\nfunction innerAccumulatedElementText(element, options) {\n const tokens = [];\n const visit = (node, skipSlotted) => {\n var _a;\n if (skipSlotted && node.assignedSlot)\n return;\n if (node.nodeType === 1) {\n const display = ((_a = getElementComputedStyle(node)) == null ? void 0 : _a.display) || "inline";\n let token = getTextAlternativeInternal(node, options);\n if (display !== "inline" || node.nodeName === "BR")\n token = " " + token + " ";\n tokens.push(token);\n } else if (node.nodeType === 3) {\n tokens.push(node.textContent || "");\n }\n };\n tokens.push(getCSSContent(element, "::before") || "");\n const content = getCSSContent(element);\n if (content !== void 0) {\n tokens.push(content);\n } else {\n const assignedNodes = element.nodeName === "SLOT" ? element.assignedNodes() : [];\n if (assignedNodes.length) {\n for (const child of assignedNodes)\n visit(child, false);\n } else {\n for (let child = element.firstChild; child; child = child.nextSibling)\n visit(child, true);\n if (element.shadowRoot) {\n for (let child = element.shadowRoot.firstChild; child; child = child.nextSibling)\n visit(child, true);\n }\n for (const owned of getIdRefs(element, element.getAttribute("aria-owns")))\n visit(owned, true);\n }\n }\n tokens.push(getCSSContent(element, "::after") || "");\n return tokens.join("");\n}\nvar kAriaSelectedRoles = ["gridcell", "option", "row", "tab", "rowheader", "columnheader", "treeitem"];\nfunction getAriaSelected(element) {\n if (elementSafeTagName(element) === "OPTION")\n return element.selected;\n if (kAriaSelectedRoles.includes(getAriaRole(element) || ""))\n return getAriaBoolean(element.getAttribute("aria-selected")) === true;\n return false;\n}\nvar kAriaCheckedRoles = ["checkbox", "menuitemcheckbox", "option", "radio", "switch", "menuitemradio", "treeitem"];\nfunction getAriaChecked(element) {\n const result = getChecked(element, true);\n return result === "error" ? false : result;\n}\nfunction getCheckedAllowMixed(element) {\n return getChecked(element, true);\n}\nfunction getCheckedWithoutMixed(element) {\n const result = getChecked(element, false);\n return result;\n}\nfunction getChecked(element, allowMixed) {\n const tagName = elementSafeTagName(element);\n if (allowMixed && tagName === "INPUT" && element.indeterminate)\n return "mixed";\n if (tagName === "INPUT" && ["checkbox", "radio"].includes(element.type))\n return element.checked;\n if (kAriaCheckedRoles.includes(getAriaRole(element) || "")) {\n const checked = element.getAttribute("aria-checked");\n if (checked === "true")\n return true;\n if (allowMixed && checked === "mixed")\n return "mixed";\n return false;\n }\n return "error";\n}\nvar kAriaReadonlyRoles = ["checkbox", "combobox", "grid", "gridcell", "listbox", "radiogroup", "slider", "spinbutton", "textbox", "columnheader", "rowheader", "searchbox", "switch", "treegrid"];\nfunction getReadonly(element) {\n const tagName = elementSafeTagName(element);\n if (["INPUT", "TEXTAREA", "SELECT"].includes(tagName))\n return element.hasAttribute("readonly");\n if (kAriaReadonlyRoles.includes(getAriaRole(element) || ""))\n return element.getAttribute("aria-readonly") === "true";\n if (element.isContentEditable)\n return false;\n return "error";\n}\nvar kAriaPressedRoles = ["button"];\nfunction getAriaPressed(element) {\n if (kAriaPressedRoles.includes(getAriaRole(element) || "")) {\n const pressed = element.getAttribute("aria-pressed");\n if (pressed === "true")\n return true;\n if (pressed === "mixed")\n return "mixed";\n }\n return false;\n}\nvar kAriaExpandedRoles = ["application", "button", "checkbox", "combobox", "gridcell", "link", "listbox", "menuitem", "row", "rowheader", "tab", "treeitem", "columnheader", "menuitemcheckbox", "menuitemradio", "rowheader", "switch"];\nfunction getAriaExpanded(element) {\n if (elementSafeTagName(element) === "DETAILS")\n return element.open;\n if (kAriaExpandedRoles.includes(getAriaRole(element) || "")) {\n const expanded = element.getAttribute("aria-expanded");\n if (expanded === null)\n return void 0;\n if (expanded === "true")\n return true;\n return false;\n }\n return void 0;\n}\nvar kAriaLevelRoles = ["heading", "listitem", "row", "treeitem"];\nfunction getAriaLevel(element) {\n const native = { "H1": 1, "H2": 2, "H3": 3, "H4": 4, "H5": 5, "H6": 6 }[elementSafeTagName(element)];\n if (native)\n return native;\n if (kAriaLevelRoles.includes(getAriaRole(element) || "")) {\n const attr = element.getAttribute("aria-level");\n const value = attr === null ? Number.NaN : Number(attr);\n if (Number.isInteger(value) && value >= 1)\n return value;\n }\n return 0;\n}\nvar kAriaDisabledRoles = ["application", "button", "composite", "gridcell", "group", "input", "link", "menuitem", "scrollbar", "separator", "tab", "checkbox", "columnheader", "combobox", "grid", "listbox", "menu", "menubar", "menuitemcheckbox", "menuitemradio", "option", "radio", "radiogroup", "row", "rowheader", "searchbox", "select", "slider", "spinbutton", "switch", "tablist", "textbox", "toolbar", "tree", "treegrid", "treeitem"];\nfunction getAriaDisabled(element) {\n return isNativelyDisabled(element) || hasExplicitAriaDisabled(element);\n}\nfunction isNativelyDisabled(element) {\n const isNativeFormControl = ["BUTTON", "INPUT", "SELECT", "TEXTAREA", "OPTION", "OPTGROUP"].includes(elementSafeTagName(element));\n return isNativeFormControl && (element.hasAttribute("disabled") || belongsToDisabledOptGroup(element) || belongsToDisabledFieldSet(element));\n}\nfunction belongsToDisabledOptGroup(element) {\n return elementSafeTagName(element) === "OPTION" && !!element.closest("OPTGROUP[DISABLED]");\n}\nfunction belongsToDisabledFieldSet(element) {\n const fieldSetElement = element == null ? void 0 : element.closest("FIELDSET[DISABLED]");\n if (!fieldSetElement)\n return false;\n const legendElement = fieldSetElement.querySelector(":scope > LEGEND");\n return !legendElement || !legendElement.contains(element);\n}\nfunction hasExplicitAriaDisabled(element, isAncestor = false) {\n if (!element)\n return false;\n if (isAncestor || kAriaDisabledRoles.includes(getAriaRole(element) || "")) {\n const attribute = (element.getAttribute("aria-disabled") || "").toLowerCase();\n if (attribute === "true")\n return true;\n if (attribute === "false")\n return false;\n return hasExplicitAriaDisabled(parentElementOrShadowHost(element), true);\n }\n return false;\n}\nfunction getAccessibleNameFromAssociatedLabels(labels, options) {\n return [...labels].map((label) => getTextAlternativeInternal(label, {\n ...options,\n embeddedInLabel: { element: label, hidden: isElementHiddenForAria(label) },\n embeddedInNativeTextAlternative: void 0,\n embeddedInLabelledBy: void 0,\n embeddedInDescribedBy: void 0,\n embeddedInTargetElement: void 0\n })).filter((accessibleName) => !!accessibleName).join(" ");\n}\nfunction receivesPointerEvents(element) {\n const cache = cachePointerEvents;\n let e = element;\n let result;\n const parents = [];\n for (; e; e = parentElementOrShadowHost(e)) {\n const cached = cache.get(e);\n if (cached !== void 0) {\n result = cached;\n break;\n }\n parents.push(e);\n const style = getElementComputedStyle(e);\n if (!style) {\n result = true;\n break;\n }\n const value = style.pointerEvents;\n if (value) {\n result = value !== "none";\n break;\n }\n }\n if (result === void 0)\n result = true;\n for (const parent of parents)\n cache.set(parent, result);\n return result;\n}\nvar cacheAccessibleName;\nvar cacheAccessibleNameHidden;\nvar cacheAccessibleDescription;\nvar cacheAccessibleDescriptionHidden;\nvar cacheAccessibleErrorMessage;\nvar cacheIsHidden;\nvar cachePseudoContent;\nvar cachePseudoContentBefore;\nvar cachePseudoContentAfter;\nvar cachePointerEvents;\nvar cachesCounter2 = 0;\nfunction beginAriaCaches() {\n beginDOMCaches();\n ++cachesCounter2;\n cacheAccessibleName != null ? cacheAccessibleName : cacheAccessibleName = /* @__PURE__ */ new Map();\n cacheAccessibleNameHidden != null ? cacheAccessibleNameHidden : cacheAccessibleNameHidden = /* @__PURE__ */ new Map();\n cacheAccessibleDescription != null ? cacheAccessibleDescription : cacheAccessibleDescription = /* @__PURE__ */ new Map();\n cacheAccessibleDescriptionHidden != null ? cacheAccessibleDescriptionHidden : cacheAccessibleDescriptionHidden = /* @__PURE__ */ new Map();\n cacheAccessibleErrorMessage != null ? cacheAccessibleErrorMessage : cacheAccessibleErrorMessage = /* @__PURE__ */ new Map();\n cacheIsHidden != null ? cacheIsHidden : cacheIsHidden = /* @__PURE__ */ new Map();\n cachePseudoContent != null ? cachePseudoContent : cachePseudoContent = /* @__PURE__ */ new Map();\n cachePseudoContentBefore != null ? cachePseudoContentBefore : cachePseudoContentBefore = /* @__PURE__ */ new Map();\n cachePseudoContentAfter != null ? cachePseudoContentAfter : cachePseudoContentAfter = /* @__PURE__ */ new Map();\n cachePointerEvents != null ? cachePointerEvents : cachePointerEvents = /* @__PURE__ */ new Map();\n}\nfunction endAriaCaches() {\n if (!--cachesCounter2) {\n cacheAccessibleName = void 0;\n cacheAccessibleNameHidden = void 0;\n cacheAccessibleDescription = void 0;\n cacheAccessibleDescriptionHidden = void 0;\n cacheAccessibleErrorMessage = void 0;\n cacheIsHidden = void 0;\n cachePseudoContent = void 0;\n cachePseudoContentBefore = void 0;\n cachePseudoContentAfter = void 0;\n cachePointerEvents = void 0;\n }\n endDOMCaches();\n}\nvar inputTypeToRole = {\n "button": "button",\n "checkbox": "checkbox",\n "image": "button",\n "number": "spinbutton",\n "radio": "radio",\n "range": "slider",\n "reset": "button",\n "submit": "button"\n};\n\n// packages/injected/src/ariaSnapshot.ts\nvar lastRef = 0;\nfunction toInternalOptions(options) {\n const renderBoxes = options.boxes;\n if (options.mode === "ai") {\n return {\n visibility: "ariaOrVisible",\n refs: "interactable",\n refPrefix: options.refPrefix,\n includeGenericRole: true,\n renderActive: !options.doNotRenderActive,\n renderCursorPointer: true,\n renderBoxes\n };\n }\n if (options.mode === "autoexpect") {\n return { visibility: "ariaAndVisible", refs: "none", renderBoxes };\n }\n if (options.mode === "codegen") {\n return { visibility: "aria", refs: "none", renderStringsAsRegex: true, renderBoxes };\n }\n return { visibility: "aria", refs: "none", renderBoxes };\n}\nfunction generateAriaTree(rootElement, publicOptions) {\n const options = toInternalOptions(publicOptions);\n const visited = /* @__PURE__ */ new Set();\n const snapshot = {\n root: { role: "fragment", name: "", children: [], props: {}, box: computeBox(rootElement), receivesPointerEvents: true },\n elements: /* @__PURE__ */ new Map(),\n refs: /* @__PURE__ */ new Map(),\n iframeRefs: []\n };\n setAriaNodeElement(snapshot.root, rootElement);\n const visit = (ariaNode, node, parentElementVisible) => {\n if (visited.has(node))\n return;\n visited.add(node);\n if (node.nodeType === Node.TEXT_NODE && node.nodeValue) {\n if (!parentElementVisible)\n return;\n const text = node.nodeValue;\n if (ariaNode.role !== "textbox" && text)\n ariaNode.children.push(node.nodeValue || "");\n return;\n }\n if (node.nodeType !== Node.ELEMENT_NODE)\n return;\n const element = node;\n const isElementVisibleForAria = !isElementHiddenForAria(element);\n let visible = isElementVisibleForAria;\n if (options.visibility === "ariaOrVisible")\n visible = isElementVisibleForAria || isElementVisible(element);\n if (options.visibility === "ariaAndVisible")\n visible = isElementVisibleForAria && isElementVisible(element);\n if (options.visibility === "aria" && !visible)\n return;\n const ariaChildren = [];\n if (element.hasAttribute("aria-owns")) {\n const ids = element.getAttribute("aria-owns").split(/\\s+/);\n for (const id of ids) {\n const ownedElement = rootElement.ownerDocument.getElementById(id);\n if (ownedElement)\n ariaChildren.push(ownedElement);\n }\n }\n const childAriaNode = visible ? toAriaNode(element, options) : null;\n if (childAriaNode) {\n if (childAriaNode.ref) {\n snapshot.elements.set(childAriaNode.ref, element);\n snapshot.refs.set(element, childAriaNode.ref);\n if (childAriaNode.role === "iframe")\n snapshot.iframeRefs.push(childAriaNode.ref);\n }\n ariaNode.children.push(childAriaNode);\n }\n processElement(childAriaNode || ariaNode, element, ariaChildren, visible);\n };\n function processElement(ariaNode, element, ariaChildren, parentElementVisible) {\n var _a;\n const display = ((_a = getElementComputedStyle(element)) == null ? void 0 : _a.display) || "inline";\n const treatAsBlock = display !== "inline" || element.nodeName === "BR" ? " " : "";\n if (treatAsBlock)\n ariaNode.children.push(treatAsBlock);\n ariaNode.children.push(getCSSContent(element, "::before") || "");\n const assignedNodes = element.nodeName === "SLOT" ? element.assignedNodes() : [];\n if (assignedNodes.length) {\n for (const child of assignedNodes)\n visit(ariaNode, child, parentElementVisible);\n } else {\n for (let child = element.firstChild; child; child = child.nextSibling) {\n if (!child.assignedSlot)\n visit(ariaNode, child, parentElementVisible);\n }\n if (element.shadowRoot) {\n for (let child = element.shadowRoot.firstChild; child; child = child.nextSibling)\n visit(ariaNode, child, parentElementVisible);\n }\n }\n for (const child of ariaChildren)\n visit(ariaNode, child, parentElementVisible);\n ariaNode.children.push(getCSSContent(element, "::after") || "");\n if (treatAsBlock)\n ariaNode.children.push(treatAsBlock);\n if (ariaNode.children.length === 1 && ariaNode.name === ariaNode.children[0])\n ariaNode.children = [];\n if (ariaNode.role === "link" && element.hasAttribute("href")) {\n const href = element.getAttribute("href");\n ariaNode.props["url"] = href;\n }\n if (ariaNode.role === "textbox" && element.hasAttribute("placeholder") && element.getAttribute("placeholder") !== ariaNode.name) {\n const placeholder = element.getAttribute("placeholder");\n ariaNode.props["placeholder"] = placeholder;\n }\n }\n beginAriaCaches();\n try {\n visit(snapshot.root, rootElement, true);\n } finally {\n endAriaCaches();\n }\n normalizeStringChildren(snapshot.root);\n normalizeGenericRoles(snapshot.root);\n return snapshot;\n}\nfunction computeAriaRef(ariaNode, options) {\n var _a;\n if (options.refs === "none")\n return;\n if (options.refs === "interactable" && (!ariaNode.box.visible || !ariaNode.receivesPointerEvents))\n return;\n const element = ariaNodeElement(ariaNode);\n let ariaRef = element._ariaRef;\n if (!ariaRef || ariaRef.role !== ariaNode.role || ariaRef.name !== ariaNode.name) {\n ariaRef = { role: ariaNode.role, name: ariaNode.name, ref: ((_a = options.refPrefix) != null ? _a : "") + "e" + ++lastRef };\n element._ariaRef = ariaRef;\n }\n ariaNode.ref = ariaRef.ref;\n}\nfunction toAriaNode(element, options) {\n var _a;\n const active = element.ownerDocument.activeElement === element;\n if (element.nodeName === "IFRAME") {\n const ariaNode = {\n role: "iframe",\n name: "",\n children: [],\n props: {},\n box: computeBox(element),\n receivesPointerEvents: true,\n active\n };\n setAriaNodeElement(ariaNode, element);\n computeAriaRef(ariaNode, options);\n return ariaNode;\n }\n const defaultRole = options.includeGenericRole ? "generic" : null;\n const role = (_a = getAriaRole(element)) != null ? _a : defaultRole;\n if (!role || role === "presentation" || role === "none")\n return null;\n const name = normalizeWhiteSpace(getElementAccessibleName(element, false) || "");\n const receivesPointerEvents2 = receivesPointerEvents(element);\n const box = computeBox(element);\n if (role === "generic" && box.inline && element.childNodes.length === 1 && element.childNodes[0].nodeType === Node.TEXT_NODE)\n return null;\n const result = {\n role,\n name,\n children: [],\n props: {},\n box,\n receivesPointerEvents: receivesPointerEvents2,\n active\n };\n setAriaNodeElement(result, element);\n computeAriaRef(result, options);\n if (kAriaCheckedRoles.includes(role))\n result.checked = getAriaChecked(element);\n if (kAriaDisabledRoles.includes(role))\n result.disabled = getAriaDisabled(element);\n if (kAriaExpandedRoles.includes(role))\n result.expanded = getAriaExpanded(element);\n if (kAriaInvalidRoles.includes(role)) {\n const invalid = getAriaInvalid(element);\n result.invalid = invalid === "false" ? false : invalid === "true" ? true : invalid;\n }\n if (kAriaLevelRoles.includes(role))\n result.level = getAriaLevel(element);\n if (kAriaPressedRoles.includes(role))\n result.pressed = getAriaPressed(element);\n if (kAriaSelectedRoles.includes(role))\n result.selected = getAriaSelected(element);\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n if (element.type !== "checkbox" && element.type !== "radio" && element.type !== "file")\n result.children = [element.value];\n }\n return result;\n}\nfunction normalizeGenericRoles(node) {\n const normalizeChildren = (node2) => {\n const result = [];\n for (const child of node2.children || []) {\n if (typeof child === "string") {\n result.push(child);\n continue;\n }\n const normalized = normalizeChildren(child);\n result.push(...normalized);\n }\n const removeSelf = node2.role === "generic" && !node2.name && result.length <= 1 && result.every((c) => typeof c !== "string" && !!c.ref);\n if (removeSelf)\n return result;\n node2.children = result;\n return [node2];\n };\n normalizeChildren(node);\n}\nfunction normalizeStringChildren(rootA11yNode) {\n const flushChildren = (buffer, normalizedChildren) => {\n if (!buffer.length)\n return;\n const text = normalizeWhiteSpace(buffer.join(""));\n if (text)\n normalizedChildren.push(text);\n buffer.length = 0;\n };\n const visit = (ariaNode) => {\n const normalizedChildren = [];\n const buffer = [];\n for (const child of ariaNode.children || []) {\n if (typeof child === "string") {\n buffer.push(child);\n } else {\n flushChildren(buffer, normalizedChildren);\n visit(child);\n normalizedChildren.push(child);\n }\n }\n flushChildren(buffer, normalizedChildren);\n ariaNode.children = normalizedChildren.length ? normalizedChildren : [];\n if (ariaNode.children.length === 1 && ariaNode.children[0] === ariaNode.name)\n ariaNode.children = [];\n };\n visit(rootA11yNode);\n}\nfunction matchesStringOrRegex(text, template) {\n if (!template)\n return true;\n if (!text)\n return false;\n if (typeof template === "string")\n return text === template;\n return !!text.match(new RegExp(template.pattern));\n}\nfunction matchesTextValue(text, template) {\n if (!(template == null ? void 0 : template.normalized))\n return true;\n if (!text)\n return false;\n if (text === template.normalized)\n return true;\n if (text === template.raw)\n return true;\n const regex = cachedRegex(template);\n if (regex)\n return !!text.match(regex);\n return false;\n}\nvar cachedRegexSymbol = Symbol("cachedRegex");\nfunction cachedRegex(template) {\n if (template[cachedRegexSymbol] !== void 0)\n return template[cachedRegexSymbol];\n const { raw } = template;\n const canBeRegex = raw.startsWith("/") && raw.endsWith("/") && raw.length > 1;\n let regex;\n try {\n regex = canBeRegex ? new RegExp(raw.slice(1, -1)) : null;\n } catch (e) {\n regex = null;\n }\n template[cachedRegexSymbol] = regex;\n return regex;\n}\nfunction matchesExpectAriaTemplate(rootElement, template) {\n const snapshot = generateAriaTree(rootElement, { mode: "default" });\n const matches = matchesNodeDeep(snapshot.root, template, false, false);\n return {\n matches,\n received: {\n raw: renderAriaTree(snapshot, { mode: "default" }).text,\n regex: renderAriaTree(snapshot, { mode: "codegen" }).text\n }\n };\n}\nfunction getAllElementsMatchingExpectAriaTemplate(rootElement, template) {\n const root = generateAriaTree(rootElement, { mode: "default" }).root;\n const matches = matchesNodeDeep(root, template, true, false);\n return matches.map((n) => ariaNodeElement(n));\n}\nfunction matchesNode(node, template, isDeepEqual) {\n var _a;\n if (typeof node === "string" && template.kind === "text")\n return matchesTextValue(node, template.text);\n if (node === null || typeof node !== "object" || template.kind !== "role")\n return false;\n if (template.role !== "fragment" && template.role !== node.role)\n return false;\n if (template.checked !== void 0 && template.checked !== node.checked)\n return false;\n if (template.disabled !== void 0 && template.disabled !== node.disabled)\n return false;\n if (template.expanded !== void 0 && template.expanded !== node.expanded)\n return false;\n if (template.invalid !== void 0 && template.invalid !== node.invalid)\n return false;\n if (template.level !== void 0 && template.level !== node.level)\n return false;\n if (template.pressed !== void 0 && template.pressed !== node.pressed)\n return false;\n if (template.selected !== void 0 && template.selected !== node.selected)\n return false;\n if (!matchesStringOrRegex(node.name, template.name))\n return false;\n if (!matchesTextValue(node.props.url, (_a = template.props) == null ? void 0 : _a.url))\n return false;\n if (template.containerMode === "contain")\n return containsList(node.children || [], template.children || []);\n if (template.containerMode === "equal")\n return listEqual(node.children || [], template.children || [], false);\n if (template.containerMode === "deep-equal" || isDeepEqual)\n return listEqual(node.children || [], template.children || [], true);\n return containsList(node.children || [], template.children || []);\n}\nfunction listEqual(children, template, isDeepEqual) {\n if (template.length !== children.length)\n return false;\n for (let i = 0; i < template.length; ++i) {\n if (!matchesNode(children[i], template[i], isDeepEqual))\n return false;\n }\n return true;\n}\nfunction containsList(children, template) {\n if (template.length > children.length)\n return false;\n const cc = children.slice();\n const tt = template.slice();\n for (const t of tt) {\n let c = cc.shift();\n while (c) {\n if (matchesNode(c, t, false))\n break;\n c = cc.shift();\n }\n if (!c)\n return false;\n }\n return true;\n}\nfunction matchesNodeDeep(root, template, collectAll, isDeepEqual) {\n const results = [];\n const visit = (node, parent) => {\n if (matchesNode(node, template, isDeepEqual)) {\n const result = typeof node === "string" ? parent : node;\n if (result)\n results.push(result);\n return !collectAll;\n }\n if (typeof node === "string")\n return false;\n for (const child of node.children || []) {\n if (visit(child, node))\n return true;\n }\n return false;\n };\n visit(root, null);\n return results;\n}\nfunction buildByRefMap(root, map = /* @__PURE__ */ new Map()) {\n if (root == null ? void 0 : root.ref)\n map.set(root.ref, root);\n for (const child of (root == null ? void 0 : root.children) || []) {\n if (typeof child !== "string")\n buildByRefMap(child, map);\n }\n return map;\n}\nfunction compareSnapshots(ariaSnapshot, previousSnapshot) {\n var _a;\n const previousByRef = buildByRefMap(previousSnapshot == null ? void 0 : previousSnapshot.root);\n const result = /* @__PURE__ */ new Map();\n const visit = (ariaNode, previousNode) => {\n let same = ariaNode.children.length === (previousNode == null ? void 0 : previousNode.children.length) && ariaNodesEqual(ariaNode, previousNode);\n let canBeSkipped = same;\n for (let childIndex = 0; childIndex < ariaNode.children.length; childIndex++) {\n const child = ariaNode.children[childIndex];\n const previousChild = previousNode == null ? void 0 : previousNode.children[childIndex];\n if (typeof child === "string") {\n same && (same = child === previousChild);\n canBeSkipped && (canBeSkipped = child === previousChild);\n } else {\n let previous = typeof previousChild !== "string" ? previousChild : void 0;\n if (child.ref)\n previous = previousByRef.get(child.ref);\n const sameChild = visit(child, previous);\n if (!previous || !sameChild && !child.ref || previous !== previousChild)\n canBeSkipped = false;\n same && (same = sameChild && previous === previousChild);\n }\n }\n result.set(ariaNode, same ? "same" : canBeSkipped ? "skip" : "changed");\n return same;\n };\n visit(ariaSnapshot.root, previousByRef.get((_a = previousSnapshot == null ? void 0 : previousSnapshot.root) == null ? void 0 : _a.ref));\n return result;\n}\nfunction filterSnapshotDiff(nodes, statusMap) {\n const result = [];\n const visit = (ariaNode) => {\n const status = statusMap.get(ariaNode);\n if (status === "same") {\n } else if (status === "skip") {\n for (const child of ariaNode.children) {\n if (typeof child !== "string")\n visit(child);\n }\n } else {\n result.push(ariaNode);\n }\n };\n for (const node of nodes) {\n if (typeof node === "string")\n result.push(node);\n else\n visit(node);\n }\n return result;\n}\nfunction indent(depth) {\n return " ".repeat(depth);\n}\nfunction renderAriaTree(ariaSnapshot, publicOptions, previousSnapshot) {\n const options = toInternalOptions(publicOptions);\n const lines = [];\n const iframeDepths = {};\n const includeText = options.renderStringsAsRegex ? textContributesInfo : () => true;\n const renderString = options.renderStringsAsRegex ? convertToBestGuessRegex : (str) => str;\n let nodesToRender = ariaSnapshot.root.role === "fragment" ? ariaSnapshot.root.children : [ariaSnapshot.root];\n const statusMap = compareSnapshots(ariaSnapshot, previousSnapshot);\n if (previousSnapshot)\n nodesToRender = filterSnapshotDiff(nodesToRender, statusMap);\n const visitText = (text, depth) => {\n if (publicOptions.depth && depth > publicOptions.depth)\n return;\n const escaped = yamlEscapeValueIfNeeded(renderString(text));\n if (escaped)\n lines.push(indent(depth) + "- text: " + escaped);\n };\n const createKey = (ariaNode, renderCursorPointer) => {\n let key = ariaNode.role;\n if (ariaNode.name && ariaNode.name.length <= 900) {\n const name = renderString(ariaNode.name);\n if (name) {\n const stringifiedName = name.startsWith("/") && name.endsWith("/") ? name : JSON.stringify(name);\n key += " " + stringifiedName;\n }\n }\n if (ariaNode.checked === "mixed")\n key += ` [checked=mixed]`;\n if (ariaNode.checked === true)\n key += ` [checked]`;\n if (ariaNode.disabled)\n key += ` [disabled]`;\n if (ariaNode.expanded)\n key += ` [expanded]`;\n if (ariaNode.active && options.renderActive)\n key += ` [active]`;\n if (ariaNode.invalid === "grammar" || ariaNode.invalid === "spelling")\n key += ` [invalid=${ariaNode.invalid}]`;\n if (ariaNode.invalid === true)\n key += ` [invalid]`;\n if (ariaNode.level)\n key += ` [level=${ariaNode.level}]`;\n if (ariaNode.pressed === "mixed")\n key += ` [pressed=mixed]`;\n if (ariaNode.pressed === true)\n key += ` [pressed]`;\n if (ariaNode.selected === true)\n key += ` [selected]`;\n if (ariaNode.ref) {\n key += ` [ref=${ariaNode.ref}]`;\n if (renderCursorPointer && hasPointerCursor(ariaNode))\n key += " [cursor=pointer]";\n }\n if (options.renderBoxes) {\n const element = ariaNodeElement(ariaNode);\n if (element) {\n const r = element.getBoundingClientRect();\n key += ` [box=${Math.round(r.x)},${Math.round(r.y)},${Math.round(r.width)},${Math.round(r.height)}]`;\n }\n }\n return key;\n };\n const getSingleInlinedTextChild = (ariaNode) => {\n return (ariaNode == null ? void 0 : ariaNode.children.length) === 1 && typeof ariaNode.children[0] === "string" && !Object.keys(ariaNode.props).length ? ariaNode.children[0] : void 0;\n };\n const visit = (ariaNode, depth, renderCursorPointer) => {\n if (publicOptions.depth && depth > publicOptions.depth)\n return;\n if (ariaNode.role === "iframe" && ariaNode.ref)\n iframeDepths[ariaNode.ref] = depth;\n if (statusMap.get(ariaNode) === "same" && ariaNode.ref) {\n lines.push(indent(depth) + `- ref=${ariaNode.ref} [unchanged]`);\n return;\n }\n const isDiffRoot = !!previousSnapshot && !depth;\n const escapedKey = indent(depth) + "- " + (isDiffRoot ? " " : "") + yamlEscapeKeyIfNeeded(createKey(ariaNode, renderCursorPointer));\n const singleInlinedTextChild = getSingleInlinedTextChild(ariaNode);\n const isAtDepthLimit = !!publicOptions.depth && depth === publicOptions.depth;\n const hasNoChildren = !singleInlinedTextChild && (!ariaNode.children.length || isAtDepthLimit);\n if (hasNoChildren && !Object.keys(ariaNode.props).length) {\n lines.push(escapedKey);\n } else if (singleInlinedTextChild !== void 0) {\n const shouldInclude = includeText(ariaNode, singleInlinedTextChild);\n if (shouldInclude)\n lines.push(escapedKey + ": " + yamlEscapeValueIfNeeded(renderString(singleInlinedTextChild)));\n else\n lines.push(escapedKey);\n } else {\n lines.push(escapedKey + ":");\n for (const [name, value] of Object.entries(ariaNode.props))\n lines.push(indent(depth + 1) + "- /" + name + ": " + yamlEscapeValueIfNeeded(value));\n const inCursorPointer = !!ariaNode.ref && renderCursorPointer && hasPointerCursor(ariaNode);\n for (const child of ariaNode.children) {\n if (typeof child === "string")\n visitText(includeText(ariaNode, child) ? child : "", depth + 1);\n else\n visit(child, depth + 1, renderCursorPointer && !inCursorPointer);\n }\n }\n };\n for (const nodeToRender of nodesToRender) {\n if (typeof nodeToRender === "string")\n visitText(nodeToRender, 0);\n else\n visit(nodeToRender, 0, !!options.renderCursorPointer);\n }\n return { text: lines.join("\\n"), iframeDepths };\n}\nfunction convertToBestGuessRegex(text) {\n const dynamicContent = [\n // 550e8400-e29b-41d4-a716-446655440000\n { regex: /\\b[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\\b/, replacement: "[0-9a-fA-F-]+" },\n // 2mb\n { regex: /\\b[\\d,.]+[bkmBKM]+\\b/, replacement: "[\\\\d,.]+[bkmBKM]+" },\n // 2ms, 20s\n { regex: /\\b\\d+[hmsp]+\\b/, replacement: "\\\\d+[hmsp]+" },\n { regex: /\\b[\\d,.]+[hmsp]+\\b/, replacement: "[\\\\d,.]+[hmsp]+" },\n // Do not replace single digits with regex by default.\n // 2+ digits: [Issue 22, 22.3, 2.33, 2,333]\n { regex: /\\b\\d+,\\d+\\b/, replacement: "\\\\d+,\\\\d+" },\n { regex: /\\b\\d+\\.\\d{2,}\\b/, replacement: "\\\\d+\\\\.\\\\d+" },\n { regex: /\\b\\d{2,}\\.\\d+\\b/, replacement: "\\\\d+\\\\.\\\\d+" },\n { regex: /\\b\\d{2,}\\b/, replacement: "\\\\d+" }\n ];\n let pattern = "";\n let lastIndex = 0;\n const combinedRegex = new RegExp(dynamicContent.map((r) => "(" + r.regex.source + ")").join("|"), "g");\n text.replace(combinedRegex, (match, ...args) => {\n const offset = args[args.length - 2];\n const groups = args.slice(0, -2);\n pattern += escapeRegExp(text.slice(lastIndex, offset));\n for (let i = 0; i < groups.length; i++) {\n if (groups[i]) {\n const { replacement } = dynamicContent[i];\n pattern += replacement;\n break;\n }\n }\n lastIndex = offset + match.length;\n return match;\n });\n if (!pattern)\n return text;\n pattern += escapeRegExp(text.slice(lastIndex));\n return String(new RegExp(pattern));\n}\nfunction textContributesInfo(node, text) {\n if (!text.length)\n return false;\n if (!node.name)\n return true;\n const substr = text.length <= 200 && node.name.length <= 200 ? longestCommonSubstring(text, node.name) : "";\n let filtered = text;\n while (substr && filtered.includes(substr))\n filtered = filtered.replace(substr, "");\n return filtered.trim().length / text.length > 0.1;\n}\nvar elementSymbol = Symbol("element");\nfunction ariaNodeElement(ariaNode) {\n return ariaNode[elementSymbol];\n}\nfunction setAriaNodeElement(ariaNode, element) {\n ariaNode[elementSymbol] = element;\n}\nfunction findNewElement(from, to) {\n const node = findNewNode(from, to);\n return node ? ariaNodeElement(node) : void 0;\n}\n\n// packages/injected/src/highlight.css?inline\nvar highlight_default = ":host{font-size:13px;font-family:system-ui,Ubuntu,Droid Sans,sans-serif;color:#333;color-scheme:light}svg{position:absolute;height:0}x-pw-tooltip{backdrop-filter:blur(5px);background-color:#fff;border-radius:6px;box-shadow:0 .5rem 1.2rem #0000004d;display:none;font-size:12.8px;font-weight:400;left:0;line-height:1.5;max-width:600px;position:absolute;top:0;padding:0;flex-direction:column;overflow:hidden}x-pw-tooltip-line{display:flex;max-width:600px;padding:6px;user-select:none;cursor:pointer}x-pw-tooltip-footer{display:flex;max-width:600px;padding:6px;user-select:none;color:#777}x-pw-dialog{background-color:#fff;pointer-events:auto;border-radius:6px;box-shadow:0 .5rem 1.2rem #0000004d;display:flex;flex-direction:column;position:absolute;z-index:10;font-size:13px}x-pw-dialog:not(.autosize){width:400px;height:150px}x-pw-dialog-body{display:flex;flex-direction:column;flex:auto}x-pw-dialog-body label{margin:5px 8px;display:flex;flex-direction:row;align-items:center}x-pw-highlight{position:absolute;top:0;left:0;width:0;height:0}x-pw-action-point{position:absolute;width:20px;height:20px;background:red;border-radius:10px;margin:-10px 0 0 -10px;z-index:2}x-pw-action-cursor{position:absolute;width:18px;height:22px;pointer-events:none;z-index:4;filter:drop-shadow(0 1px 2px rgba(0,0,0,.4))}x-pw-action-cursor svg{width:100%;height:100%;position:static}x-pw-title{position:absolute;backdrop-filter:blur(5px);background-color:#00000080;color:#fff;border-radius:6px;padding:6px;font-size:24px;line-height:1.4;white-space:nowrap;user-select:none;z-index:3}x-pw-user-overlays,x-pw-user-overlay{position:absolute;inset:0}@keyframes pw-fade-out{0%{opacity:1}to{opacity:0}}x-pw-separator{height:1px;margin:6px 9px;background:#949494e5}x-pw-tool-gripper{height:28px;width:24px;margin:2px 0;cursor:grab}x-pw-tool-gripper:active{cursor:grabbing}x-pw-tool-gripper>x-div{width:16px;height:16px;margin:6px 4px;clip-path:url(#icon-gripper);background-color:#555}x-pw-tools-list>label{display:flex;align-items:center;margin:0 10px;user-select:none}x-pw-tools-list{display:flex;width:100%;border-bottom:1px solid #dddddd}x-pw-tool-item{pointer-events:auto;height:28px;width:28px;border-radius:3px}x-pw-tool-item:not(.disabled){cursor:pointer}x-pw-tool-item:not(.disabled):hover{background-color:#dbdbdb}x-pw-tool-item.toggled{background-color:#8acae480}x-pw-tool-item.toggled:not(.disabled):hover{background-color:#8acae4c4}x-pw-tool-item>x-div{width:16px;height:16px;margin:6px;background-color:#3a3a3a}x-pw-tool-item.disabled>x-div{background-color:#61616180;cursor:default}x-pw-tool-item.record.toggled{background-color:transparent}x-pw-tool-item.record.toggled:not(.disabled):hover{background-color:#dbdbdb}x-pw-tool-item.record.toggled>x-div{background-color:#a1260d}x-pw-tool-item.record.disabled.toggled>x-div{opacity:.8}x-pw-tool-item.accept>x-div{background-color:#388a34}x-pw-tool-item.record>x-div{clip-path:url(#icon-circle-large-filled)}x-pw-tool-item.record.toggled>x-div{clip-path:url(#icon-stop-circle)}x-pw-tool-item.pick-locator>x-div{clip-path:url(#icon-inspect)}x-pw-tool-item.text>x-div{clip-path:url(#icon-whole-word)}x-pw-tool-item.visibility>x-div{clip-path:url(#icon-eye)}x-pw-tool-item.value>x-div{clip-path:url(#icon-symbol-constant)}x-pw-tool-item.snapshot>x-div{clip-path:url(#icon-gist)}x-pw-tool-item.accept>x-div{clip-path:url(#icon-check)}x-pw-tool-item.cancel>x-div{clip-path:url(#icon-close)}x-pw-tool-item.succeeded>x-div{clip-path:url(#icon-pass);background-color:#388a34!important}x-pw-overlay{position:absolute;top:0;max-width:min-content;z-index:2147483647;background:transparent;pointer-events:auto}x-pw-overlay x-pw-tools-list{background-color:#fffd;box-shadow:#0000001a 0 5px 5px;border-radius:3px;border-bottom:none}x-pw-overlay x-pw-tool-item{margin:2px}textarea.text-editor{font-family:system-ui,Ubuntu,Droid Sans,sans-serif;flex:auto;border:none;margin:6px 10px;color:#333;outline:1px solid transparent!important;resize:none;padding:0;font-size:13px}textarea.text-editor.does-not-match{outline:1px solid red!important}x-div{display:block}x-spacer{flex:auto}*{box-sizing:border-box}*[hidden]{display:none!important}x-locator-editor{flex:none;width:100%;height:60px;padding:4px;border-bottom:1px solid #dddddd;outline:1px solid transparent}x-locator-editor.does-not-match{outline:1px solid red}.CodeMirror{width:100%!important;height:100%!important}x-pw-action-list{flex:auto;display:flex;flex-direction:column;user-select:none}x-pw-action-item{padding:6px 10px;cursor:pointer;overflow:hidden}x-pw-action-item:hover{background-color:#f2f2f2}x-pw-action-item:last-child{border-bottom-left-radius:6px;border-bottom-right-radius:6px}\\n";\n\n// packages/injected/src/highlight.ts\nvar Highlight = class {\n constructor(injectedScript) {\n this._renderedEntries = [];\n this._userOverlays = /* @__PURE__ */ new Map();\n this._userOverlayHidden = false;\n this._language = "javascript";\n this._elementHighlightSelectors = /* @__PURE__ */ new Map();\n this._injectedScript = injectedScript;\n const document = injectedScript.document;\n this._isUnderTest = injectedScript.isUnderTest;\n this._glassPaneElement = document.createElement("x-pw-glass");\n this._glassPaneElement.setAttribute("popover", "manual");\n this._glassPaneElement.style.inset = "0";\n this._glassPaneElement.style.width = "100%";\n this._glassPaneElement.style.height = "100%";\n this._glassPaneElement.style.maxWidth = "none";\n this._glassPaneElement.style.maxHeight = "none";\n this._glassPaneElement.style.padding = "0";\n this._glassPaneElement.style.margin = "0";\n this._glassPaneElement.style.border = "none";\n this._glassPaneElement.style.overflow = "visible";\n this._glassPaneElement.style.pointerEvents = "none";\n this._glassPaneElement.style.display = "flex";\n this._glassPaneElement.style.backgroundColor = "transparent";\n this._actionPointElement = document.createElement("x-pw-action-point");\n this._actionPointElement.setAttribute("hidden", "true");\n this._actionCursorElement = document.createElement("x-pw-action-cursor");\n this._actionCursorElement.style.visibility = "hidden";\n this._actionCursorElement.appendChild(this._createCursorSvg(document));\n this._titleElement = document.createElement("x-pw-title");\n this._titleElement.setAttribute("hidden", "true");\n this._userOverlayContainer = document.createElement("x-pw-user-overlays");\n this._userOverlayContainer.setAttribute("hidden", "true");\n this._glassPaneShadow = this._glassPaneElement.attachShadow({ mode: this._isUnderTest ? "open" : "closed" });\n if (typeof this._glassPaneShadow.adoptedStyleSheets.push === "function") {\n const sheet = new this._injectedScript.window.CSSStyleSheet();\n sheet.replaceSync(highlight_default);\n this._glassPaneShadow.adoptedStyleSheets.push(sheet);\n } else {\n const styleElement = this._injectedScript.document.createElement("style");\n styleElement.textContent = highlight_default;\n this._glassPaneShadow.appendChild(styleElement);\n }\n this._glassPaneShadow.appendChild(this._actionPointElement);\n this._glassPaneShadow.appendChild(this._actionCursorElement);\n this._glassPaneShadow.appendChild(this._titleElement);\n this._glassPaneShadow.appendChild(this._userOverlayContainer);\n }\n install() {\n if (!this._injectedScript.document.documentElement)\n return;\n if (!this._injectedScript.document.documentElement.contains(this._glassPaneElement) || this._glassPaneElement.nextElementSibling)\n this._injectedScript.document.documentElement.appendChild(this._glassPaneElement);\n this._bringToFront();\n }\n _bringToFront() {\n this._glassPaneElement.hidePopover();\n this._glassPaneElement.showPopover();\n }\n setLanguage(language) {\n this._language = language;\n }\n addElementHighlight(selector, cssStyle) {\n const key = stringifySelector(selector);\n this._elementHighlightSelectors.set(key, { selector, cssStyle });\n this._ensureElementHighlightRaf();\n }\n removeElementHighlight(selector) {\n const key = stringifySelector(selector);\n if (!this._elementHighlightSelectors.delete(key))\n return;\n if (this._elementHighlightSelectors.size === 0) {\n if (this._rafRequest) {\n this._injectedScript.utils.builtins.cancelAnimationFrame(this._rafRequest);\n this._rafRequest = void 0;\n }\n this.clearHighlight();\n }\n }\n _ensureElementHighlightRaf() {\n if (this._rafRequest)\n return;\n const tick = () => {\n const entries = [];\n for (const { selector, cssStyle } of this._elementHighlightSelectors.values()) {\n const elements = this._injectedScript.querySelectorAll(selector, this._injectedScript.document.documentElement);\n const locator = asLocator(this._language, stringifySelector(selector));\n const color = elements.length > 1 ? "#f6b26b7f" : "#6fa8dc7f";\n for (let i = 0; i < elements.length; ++i) {\n const suffix = elements.length > 1 ? ` [${i + 1} of ${elements.length}]` : "";\n entries.push({ element: elements[i], color, tooltipText: locator + suffix, cssStyle });\n }\n }\n this.updateHighlight(entries);\n this._rafRequest = this._injectedScript.utils.builtins.requestAnimationFrame(tick);\n };\n this._rafRequest = this._injectedScript.utils.builtins.requestAnimationFrame(tick);\n }\n uninstall() {\n if (this._rafRequest) {\n this._injectedScript.utils.builtins.cancelAnimationFrame(this._rafRequest);\n this._rafRequest = void 0;\n }\n this._elementHighlightSelectors.clear();\n this._glassPaneElement.remove();\n }\n showActionPoint(x, y, fadeDuration) {\n this._actionPointElement.style.top = y + "px";\n this._actionPointElement.style.left = x + "px";\n this._actionPointElement.hidden = false;\n if (fadeDuration)\n this._actionPointElement.style.animation = `pw-fade-out ${fadeDuration}ms ease-out forwards`;\n else\n this._actionPointElement.style.animation = "";\n }\n hideActionPoint() {\n this._actionPointElement.hidden = true;\n }\n moveActionCursor(x, y, fadeDuration) {\n const moveDuration = fadeDuration ? Math.max(80, Math.min(fadeDuration * 0.6, 400)) : 0;\n this._actionCursorElement.style.transition = `top ${moveDuration}ms ease, left ${moveDuration}ms ease`;\n this._actionCursorElement.style.left = x + "px";\n this._actionCursorElement.style.top = y + "px";\n this._actionCursorElement.style.visibility = "visible";\n }\n hideActionCursor() {\n this._actionCursorElement.style.visibility = "hidden";\n }\n _createCursorSvg(document) {\n const svgNs = "http://www.w3.org/2000/svg";\n const svg = document.createElementNS(svgNs, "svg");\n svg.setAttribute("viewBox", "0 0 18 22");\n const path = document.createElementNS(svgNs, "path");\n path.setAttribute("d", "M1 1 L1 17 L5.5 13 L8 20.5 L11 19.5 L8.5 12 L15 12 Z");\n path.setAttribute("fill", "white");\n path.setAttribute("stroke", "black");\n path.setAttribute("stroke-width", "1.5");\n path.setAttribute("stroke-linejoin", "round");\n svg.appendChild(path);\n return svg;\n }\n showActionTitle(text, fadeDuration, position, fontSize) {\n this._titleElement.textContent = text;\n this._titleElement.hidden = false;\n if (fadeDuration) {\n const fadeTime = fadeDuration / 4;\n this._titleElement.style.animation = `pw-fade-out ${fadeTime}ms ease-out ${fadeDuration - fadeTime}ms forwards`;\n } else {\n this._titleElement.style.animation = "";\n }\n this._titleElement.style.top = "";\n this._titleElement.style.bottom = "";\n this._titleElement.style.left = "";\n this._titleElement.style.right = "";\n this._titleElement.style.transform = "";\n switch (position) {\n case "top-left":\n this._titleElement.style.top = "6px";\n this._titleElement.style.left = "6px";\n break;\n case "top":\n this._titleElement.style.top = "6px";\n this._titleElement.style.left = "50%";\n this._titleElement.style.transform = "translateX(-50%)";\n break;\n case "bottom-left":\n this._titleElement.style.bottom = "6px";\n this._titleElement.style.left = "6px";\n break;\n case "bottom":\n this._titleElement.style.bottom = "6px";\n this._titleElement.style.left = "50%";\n this._titleElement.style.transform = "translateX(-50%)";\n break;\n case "bottom-right":\n this._titleElement.style.bottom = "6px";\n this._titleElement.style.right = "6px";\n break;\n case "top-right":\n default:\n this._titleElement.style.top = "6px";\n this._titleElement.style.right = "6px";\n break;\n }\n if (fontSize)\n this._titleElement.style.fontSize = fontSize + "px";\n }\n hideActionTitle() {\n this._titleElement.hidden = true;\n }\n addUserOverlay(id, html) {\n const element = this._injectedScript.document.createElement("div");\n element.className = "x-pw-user-overlay";\n element.innerHTML = html;\n for (const script of element.querySelectorAll("script"))\n script.remove();\n for (const el of element.querySelectorAll("*")) {\n for (const attr of [...el.attributes]) {\n if (attr.name.startsWith("on"))\n el.removeAttribute(attr.name);\n }\n }\n this._userOverlays.set(id, element);\n this._userOverlayContainer.appendChild(element);\n this._userOverlayContainer.hidden = this._userOverlayHidden;\n return id;\n }\n getUserOverlay(id) {\n return this._userOverlays.get(id);\n }\n removeUserOverlay(id) {\n const element = this._userOverlays.get(id);\n if (element) {\n element.remove();\n this._userOverlays.delete(id);\n }\n if (this._userOverlays.size === 0)\n this._userOverlayContainer.hidden = true;\n }\n setUserOverlaysVisible(visible) {\n this._userOverlayHidden = !visible;\n this._userOverlayContainer.hidden = !visible || this._userOverlays.size === 0;\n }\n clearHighlight() {\n var _a, _b;\n for (const entry of this._renderedEntries) {\n (_a = entry.highlightElement) == null ? void 0 : _a.remove();\n (_b = entry.tooltipElement) == null ? void 0 : _b.remove();\n }\n this._renderedEntries = [];\n }\n maskElements(elements, color) {\n this.updateHighlight(elements.map((element) => ({ element, color })));\n }\n updateHighlight(entries) {\n if (this._highlightIsUpToDate(entries))\n return;\n this.clearHighlight();\n for (const entry of entries) {\n const highlightElement = this._createHighlightElement();\n this._glassPaneShadow.appendChild(highlightElement);\n let tooltipElement;\n if (entry.tooltipText) {\n tooltipElement = this._injectedScript.document.createElement("x-pw-tooltip");\n this._glassPaneShadow.appendChild(tooltipElement);\n tooltipElement.style.top = "0";\n tooltipElement.style.left = "0";\n tooltipElement.style.display = "flex";\n const lineElement = this._injectedScript.document.createElement("x-pw-tooltip-line");\n lineElement.textContent = entry.tooltipText;\n tooltipElement.appendChild(lineElement);\n }\n this._renderedEntries.push({ targetElement: entry.element, box: toDOMRect(entry.box), color: entry.color, borderColor: entry.borderColor, fadeDuration: entry.fadeDuration, cssStyle: entry.cssStyle, tooltipElement, highlightElement });\n }\n for (const entry of this._renderedEntries) {\n if (!entry.box && !entry.targetElement)\n continue;\n entry.box = entry.box || entry.targetElement.getBoundingClientRect();\n if (!entry.tooltipElement)\n continue;\n const { anchorLeft, anchorTop } = this.tooltipPosition(entry.box, entry.tooltipElement);\n entry.tooltipTop = anchorTop;\n entry.tooltipLeft = anchorLeft;\n }\n for (const entry of this._renderedEntries) {\n if (entry.tooltipElement) {\n entry.tooltipElement.style.top = entry.tooltipTop + "px";\n entry.tooltipElement.style.left = entry.tooltipLeft + "px";\n }\n const box = entry.box;\n entry.highlightElement.style.backgroundColor = entry.color;\n entry.highlightElement.style.left = box.x + "px";\n entry.highlightElement.style.top = box.y + "px";\n entry.highlightElement.style.width = box.width + "px";\n entry.highlightElement.style.height = box.height + "px";\n entry.highlightElement.style.display = "block";\n if (entry.borderColor)\n entry.highlightElement.style.border = "2px solid " + entry.borderColor;\n if (entry.fadeDuration)\n entry.highlightElement.style.animation = `pw-fade-out ${entry.fadeDuration}ms ease-out forwards`;\n if (entry.cssStyle)\n entry.highlightElement.style.cssText += ";" + entry.cssStyle;\n if (this._isUnderTest)\n console.error("Highlight box for test: " + JSON.stringify({ x: box.x, y: box.y, width: box.width, height: box.height }));\n }\n }\n firstBox() {\n var _a;\n return (_a = this._renderedEntries[0]) == null ? void 0 : _a.box;\n }\n firstTooltipBox() {\n const entry = this._renderedEntries[0];\n if (!entry || !entry.tooltipElement || entry.tooltipLeft === void 0 || entry.tooltipTop === void 0)\n return;\n return {\n x: entry.tooltipLeft,\n y: entry.tooltipTop,\n left: entry.tooltipLeft,\n top: entry.tooltipTop,\n width: entry.tooltipElement.offsetWidth,\n height: entry.tooltipElement.offsetHeight,\n bottom: entry.tooltipTop + entry.tooltipElement.offsetHeight,\n right: entry.tooltipLeft + entry.tooltipElement.offsetWidth,\n toJSON: () => {\n }\n };\n }\n // Note: there is a copy of this method in dialog.tsx. Please fix bugs in both places.\n tooltipPosition(box, tooltipElement) {\n const tooltipWidth = tooltipElement.offsetWidth;\n const tooltipHeight = tooltipElement.offsetHeight;\n const totalWidth = this._glassPaneElement.offsetWidth;\n const totalHeight = this._glassPaneElement.offsetHeight;\n let anchorLeft = Math.max(5, box.left);\n if (anchorLeft + tooltipWidth > totalWidth - 5)\n anchorLeft = totalWidth - tooltipWidth - 5;\n let anchorTop = Math.max(0, box.bottom) + 5;\n if (anchorTop + tooltipHeight > totalHeight - 5) {\n if (Math.max(0, box.top) > tooltipHeight + 5) {\n anchorTop = Math.max(0, box.top) - tooltipHeight - 5;\n } else {\n anchorTop = totalHeight - 5 - tooltipHeight;\n }\n }\n return { anchorLeft, anchorTop };\n }\n _highlightIsUpToDate(entries) {\n if (entries.length !== this._renderedEntries.length)\n return false;\n for (let i = 0; i < this._renderedEntries.length; ++i) {\n if (entries[i].element !== this._renderedEntries[i].targetElement)\n return false;\n if (entries[i].color !== this._renderedEntries[i].color)\n return false;\n if (entries[i].cssStyle !== this._renderedEntries[i].cssStyle)\n return false;\n const oldBox = this._renderedEntries[i].box;\n if (!oldBox)\n return false;\n const box = entries[i].box ? toDOMRect(entries[i].box) : entries[i].element.getBoundingClientRect();\n if (box.top !== oldBox.top || box.right !== oldBox.right || box.bottom !== oldBox.bottom || box.left !== oldBox.left)\n return false;\n }\n return true;\n }\n _createHighlightElement() {\n return this._injectedScript.document.createElement("x-pw-highlight");\n }\n appendChild(element) {\n this._glassPaneShadow.appendChild(element);\n }\n onGlassPaneClick(handler) {\n this._glassPaneElement.style.pointerEvents = "auto";\n this._glassPaneElement.style.backgroundColor = "rgba(0, 0, 0, 0.3)";\n this._glassPaneElement.addEventListener("click", handler);\n }\n offGlassPaneClick(handler) {\n this._glassPaneElement.style.pointerEvents = "none";\n this._glassPaneElement.style.backgroundColor = "transparent";\n this._glassPaneElement.removeEventListener("click", handler);\n }\n};\nfunction toDOMRect(box) {\n if (!box)\n return void 0;\n return new DOMRect(box.x, box.y, box.width, box.height);\n}\n\n// packages/injected/src/layoutSelectorUtils.ts\nfunction boxRightOf(box1, box2, maxDistance) {\n const distance = box1.left - box2.right;\n if (distance < 0 || maxDistance !== void 0 && distance > maxDistance)\n return;\n return distance + Math.max(box2.bottom - box1.bottom, 0) + Math.max(box1.top - box2.top, 0);\n}\nfunction boxLeftOf(box1, box2, maxDistance) {\n const distance = box2.left - box1.right;\n if (distance < 0 || maxDistance !== void 0 && distance > maxDistance)\n return;\n return distance + Math.max(box2.bottom - box1.bottom, 0) + Math.max(box1.top - box2.top, 0);\n}\nfunction boxAbove(box1, box2, maxDistance) {\n const distance = box2.top - box1.bottom;\n if (distance < 0 || maxDistance !== void 0 && distance > maxDistance)\n return;\n return distance + Math.max(box1.left - box2.left, 0) + Math.max(box2.right - box1.right, 0);\n}\nfunction boxBelow(box1, box2, maxDistance) {\n const distance = box1.top - box2.bottom;\n if (distance < 0 || maxDistance !== void 0 && distance > maxDistance)\n return;\n return distance + Math.max(box1.left - box2.left, 0) + Math.max(box2.right - box1.right, 0);\n}\nfunction boxNear(box1, box2, maxDistance) {\n const kThreshold = maxDistance === void 0 ? 50 : maxDistance;\n let score = 0;\n if (box1.left - box2.right >= 0)\n score += box1.left - box2.right;\n if (box2.left - box1.right >= 0)\n score += box2.left - box1.right;\n if (box2.top - box1.bottom >= 0)\n score += box2.top - box1.bottom;\n if (box1.top - box2.bottom >= 0)\n score += box1.top - box2.bottom;\n return score > kThreshold ? void 0 : score;\n}\nvar kLayoutSelectorNames = ["left-of", "right-of", "above", "below", "near"];\nfunction layoutSelectorScore(name, element, inner, maxDistance) {\n const box = element.getBoundingClientRect();\n const scorer = { "left-of": boxLeftOf, "right-of": boxRightOf, "above": boxAbove, "below": boxBelow, "near": boxNear }[name];\n let bestScore;\n for (const e of inner) {\n if (e === element)\n continue;\n const score = scorer(box, e.getBoundingClientRect(), maxDistance);\n if (score === void 0)\n continue;\n if (bestScore === void 0 || score < bestScore)\n bestScore = score;\n }\n return bestScore;\n}\n\n// packages/injected/src/selectorUtils.ts\nfunction matchesAttributePart(value, attr) {\n const objValue = typeof value === "string" && !attr.caseSensitive ? value.toUpperCase() : value;\n const attrValue = typeof attr.value === "string" && !attr.caseSensitive ? attr.value.toUpperCase() : attr.value;\n if (attr.op === "")\n return !!objValue;\n if (attr.op === "=") {\n if (attrValue instanceof RegExp)\n return typeof objValue === "string" && !!objValue.match(attrValue);\n return objValue === attrValue;\n }\n if (typeof objValue !== "string" || typeof attrValue !== "string")\n return false;\n if (attr.op === "*=")\n return objValue.includes(attrValue);\n if (attr.op === "^=")\n return objValue.startsWith(attrValue);\n if (attr.op === "$=")\n return objValue.endsWith(attrValue);\n if (attr.op === "|=")\n return objValue === attrValue || objValue.startsWith(attrValue + "-");\n if (attr.op === "~=")\n return objValue.split(" ").includes(attrValue);\n return false;\n}\nfunction shouldSkipForTextMatching(element) {\n const document = element.ownerDocument;\n return element.nodeName === "SCRIPT" || element.nodeName === "NOSCRIPT" || element.nodeName === "STYLE" || document.head && document.head.contains(element);\n}\nfunction elementText(cache, root) {\n let value = cache.get(root);\n if (value === void 0) {\n value = { full: "", normalized: "", immediate: [] };\n if (!shouldSkipForTextMatching(root)) {\n let currentImmediate = "";\n if (root instanceof HTMLInputElement && (root.type === "submit" || root.type === "button")) {\n value = { full: root.value, normalized: normalizeWhiteSpace(root.value), immediate: [root.value] };\n } else {\n for (let child = root.firstChild; child; child = child.nextSibling) {\n if (child.nodeType === Node.TEXT_NODE) {\n value.full += child.nodeValue || "";\n currentImmediate += child.nodeValue || "";\n } else if (child.nodeType === Node.COMMENT_NODE) {\n continue;\n } else {\n if (currentImmediate)\n value.immediate.push(currentImmediate);\n currentImmediate = "";\n if (child.nodeType === Node.ELEMENT_NODE)\n value.full += elementText(cache, child).full;\n }\n }\n if (currentImmediate)\n value.immediate.push(currentImmediate);\n if (root.shadowRoot)\n value.full += elementText(cache, root.shadowRoot).full;\n if (value.full)\n value.normalized = normalizeWhiteSpace(value.full);\n }\n }\n cache.set(root, value);\n }\n return value;\n}\nfunction elementMatchesText(cache, element, matcher) {\n if (shouldSkipForTextMatching(element))\n return "none";\n if (!matcher(elementText(cache, element)))\n return "none";\n for (let child = element.firstChild; child; child = child.nextSibling) {\n if (child.nodeType === Node.ELEMENT_NODE && matcher(elementText(cache, child)))\n return "selfAndChildren";\n }\n if (element.shadowRoot && matcher(elementText(cache, element.shadowRoot)))\n return "selfAndChildren";\n return "self";\n}\nfunction getElementLabels(textCache, element) {\n const labels = getAriaLabelledByElements(element);\n if (labels)\n return labels.map((label) => elementText(textCache, label));\n const ariaLabel = element.getAttribute("aria-label");\n if (ariaLabel !== null && !!ariaLabel.trim())\n return [{ full: ariaLabel, normalized: normalizeWhiteSpace(ariaLabel), immediate: [ariaLabel] }];\n const isNonHiddenInput = element.nodeName === "INPUT" && element.type !== "hidden";\n if (["BUTTON", "METER", "OUTPUT", "PROGRESS", "SELECT", "TEXTAREA"].includes(element.nodeName) || isNonHiddenInput) {\n const labels2 = element.labels;\n if (labels2)\n return [...labels2].map((label) => elementText(textCache, label));\n }\n return [];\n}\n\n// packages/injected/src/roleSelectorEngine.ts\nvar kSupportedAttributes = ["selected", "checked", "pressed", "expanded", "level", "disabled", "name", "description", "include-hidden"];\nkSupportedAttributes.sort();\nfunction validateSupportedRole(attr, roles, role) {\n if (!roles.includes(role))\n throw new Error(`"${attr}" attribute is only supported for roles: ${roles.slice().sort().map((role2) => `"${role2}"`).join(", ")}`);\n}\nfunction validateSupportedValues(attr, values) {\n if (attr.op !== "" && !values.includes(attr.value))\n throw new Error(`"${attr.name}" must be one of ${values.map((v) => JSON.stringify(v)).join(", ")}`);\n}\nfunction validateSupportedOp(attr, ops) {\n if (!ops.includes(attr.op))\n throw new Error(`"${attr.name}" does not support "${attr.op}" matcher`);\n}\nfunction validateAttributes(attrs, role) {\n const options = { role };\n for (const attr of attrs) {\n switch (attr.name) {\n case "checked": {\n validateSupportedRole(attr.name, kAriaCheckedRoles, role);\n validateSupportedValues(attr, [true, false, "mixed"]);\n validateSupportedOp(attr, ["", "="]);\n options.checked = attr.op === "" ? true : attr.value;\n break;\n }\n case "pressed": {\n validateSupportedRole(attr.name, kAriaPressedRoles, role);\n validateSupportedValues(attr, [true, false, "mixed"]);\n validateSupportedOp(attr, ["", "="]);\n options.pressed = attr.op === "" ? true : attr.value;\n break;\n }\n case "selected": {\n validateSupportedRole(attr.name, kAriaSelectedRoles, role);\n validateSupportedValues(attr, [true, false]);\n validateSupportedOp(attr, ["", "="]);\n options.selected = attr.op === "" ? true : attr.value;\n break;\n }\n case "expanded": {\n validateSupportedRole(attr.name, kAriaExpandedRoles, role);\n validateSupportedValues(attr, [true, false]);\n validateSupportedOp(attr, ["", "="]);\n options.expanded = attr.op === "" ? true : attr.value;\n break;\n }\n case "level": {\n validateSupportedRole(attr.name, kAriaLevelRoles, role);\n if (typeof attr.value === "string")\n attr.value = +attr.value;\n if (attr.op !== "=" || typeof attr.value !== "number" || Number.isNaN(attr.value))\n throw new Error(`"level" attribute must be compared to a number`);\n options.level = attr.value;\n break;\n }\n case "disabled": {\n validateSupportedValues(attr, [true, false]);\n validateSupportedOp(attr, ["", "="]);\n options.disabled = attr.op === "" ? true : attr.value;\n break;\n }\n case "name": {\n if (attr.op === "")\n throw new Error(`"name" attribute must have a value`);\n if (typeof attr.value !== "string" && !(attr.value instanceof RegExp))\n throw new Error(`"name" attribute must be a string or a regular expression`);\n options.name = attr.value;\n options.nameOp = attr.op;\n options.nameExact = attr.caseSensitive;\n break;\n }\n case "description": {\n if (attr.op === "")\n throw new Error(`"description" attribute must have a value`);\n if (typeof attr.value !== "string" && !(attr.value instanceof RegExp))\n throw new Error(`"description" attribute must be a string or a regular expression`);\n options.description = attr.value;\n options.descriptionOp = attr.op;\n options.descriptionExact = attr.caseSensitive;\n break;\n }\n case "include-hidden": {\n validateSupportedValues(attr, [true, false]);\n validateSupportedOp(attr, ["", "="]);\n options.includeHidden = attr.op === "" ? true : attr.value;\n break;\n }\n default: {\n throw new Error(`Unknown attribute "${attr.name}", must be one of ${kSupportedAttributes.map((a) => `"${a}"`).join(", ")}.`);\n }\n }\n }\n return options;\n}\nfunction queryRole(scope, options, internal) {\n const result = [];\n const match = (element) => {\n if (getAriaRole(element) !== options.role)\n return;\n if (options.selected !== void 0 && getAriaSelected(element) !== options.selected)\n return;\n if (options.checked !== void 0 && getAriaChecked(element) !== options.checked)\n return;\n if (options.pressed !== void 0 && getAriaPressed(element) !== options.pressed)\n return;\n if (options.expanded !== void 0 && getAriaExpanded(element) !== options.expanded)\n return;\n if (options.level !== void 0 && getAriaLevel(element) !== options.level)\n return;\n if (options.disabled !== void 0 && getAriaDisabled(element) !== options.disabled)\n return;\n if (!options.includeHidden) {\n const isHidden = isElementHiddenForAria(element);\n if (isHidden)\n return;\n }\n if (options.name !== void 0) {\n const accessibleName = normalizeWhiteSpace(getElementAccessibleName(element, !!options.includeHidden));\n if (typeof options.name === "string")\n options.name = normalizeWhiteSpace(options.name);\n if (internal && !options.nameExact && options.nameOp === "=")\n options.nameOp = "*=";\n if (!matchesAttributePart(accessibleName, { name: "", jsonPath: [], op: options.nameOp || "=", value: options.name, caseSensitive: !!options.nameExact }))\n return;\n }\n if (options.description !== void 0) {\n const accessibleDescription = normalizeWhiteSpace(getElementAccessibleDescription(element, !!options.includeHidden));\n if (typeof options.description === "string")\n options.description = normalizeWhiteSpace(options.description);\n if (internal && !options.descriptionExact && options.descriptionOp === "=")\n options.descriptionOp = "*=";\n if (!matchesAttributePart(accessibleDescription, { name: "", jsonPath: [], op: options.descriptionOp || "=", value: options.description, caseSensitive: !!options.descriptionExact }))\n return;\n }\n result.push(element);\n };\n const query = (root) => {\n const shadows = [];\n if (root.shadowRoot)\n shadows.push(root.shadowRoot);\n for (const element of root.querySelectorAll("*")) {\n match(element);\n if (element.shadowRoot)\n shadows.push(element.shadowRoot);\n }\n shadows.forEach(query);\n };\n query(scope);\n return result;\n}\nfunction createRoleEngine(internal) {\n return {\n queryAll: (scope, selector) => {\n const parsed = parseAttributeSelector(selector, true);\n const role = parsed.name.toLowerCase();\n if (!role)\n throw new Error(`Role must not be empty`);\n const options = validateAttributes(parsed.attributes, role);\n beginAriaCaches();\n try {\n return queryRole(scope, options, internal);\n } finally {\n endAriaCaches();\n }\n }\n };\n}\n\n// packages/injected/src/selectorEvaluator.ts\nvar SelectorEvaluatorImpl = class {\n constructor() {\n this._retainCacheCounter = 0;\n this._cacheText = /* @__PURE__ */ new Map();\n this._cacheQueryCSS = /* @__PURE__ */ new Map();\n this._cacheMatches = /* @__PURE__ */ new Map();\n this._cacheQuery = /* @__PURE__ */ new Map();\n this._cacheMatchesSimple = /* @__PURE__ */ new Map();\n this._cacheMatchesParents = /* @__PURE__ */ new Map();\n this._cacheCallMatches = /* @__PURE__ */ new Map();\n this._cacheCallQuery = /* @__PURE__ */ new Map();\n this._cacheQuerySimple = /* @__PURE__ */ new Map();\n this._engines = /* @__PURE__ */ new Map();\n this._engines.set("not", notEngine);\n this._engines.set("is", isEngine);\n this._engines.set("where", isEngine);\n this._engines.set("has", hasEngine);\n this._engines.set("scope", scopeEngine);\n this._engines.set("light", lightEngine);\n this._engines.set("visible", visibleEngine);\n this._engines.set("text", textEngine);\n this._engines.set("text-is", textIsEngine);\n this._engines.set("text-matches", textMatchesEngine);\n this._engines.set("has-text", hasTextEngine);\n this._engines.set("right-of", createLayoutEngine("right-of"));\n this._engines.set("left-of", createLayoutEngine("left-of"));\n this._engines.set("above", createLayoutEngine("above"));\n this._engines.set("below", createLayoutEngine("below"));\n this._engines.set("near", createLayoutEngine("near"));\n this._engines.set("nth-match", nthMatchEngine);\n const allNames = [...this._engines.keys()];\n allNames.sort();\n const parserNames = [...customCSSNames];\n parserNames.sort();\n if (allNames.join("|") !== parserNames.join("|"))\n throw new Error(`Please keep customCSSNames in sync with evaluator engines: ${allNames.join("|")} vs ${parserNames.join("|")}`);\n }\n begin() {\n ++this._retainCacheCounter;\n }\n end() {\n --this._retainCacheCounter;\n if (!this._retainCacheCounter) {\n this._cacheQueryCSS.clear();\n this._cacheMatches.clear();\n this._cacheQuery.clear();\n this._cacheMatchesSimple.clear();\n this._cacheMatchesParents.clear();\n this._cacheCallMatches.clear();\n this._cacheCallQuery.clear();\n this._cacheQuerySimple.clear();\n this._cacheText.clear();\n }\n }\n _cached(cache, main, rest, cb) {\n if (!cache.has(main))\n cache.set(main, []);\n const entries = cache.get(main);\n const entry = entries.find((e) => rest.every((value, index) => e.rest[index] === value));\n if (entry)\n return entry.result;\n const result = cb();\n entries.push({ rest, result });\n return result;\n }\n _checkSelector(s) {\n const wellFormed = typeof s === "object" && s && (Array.isArray(s) || "simples" in s && s.simples.length);\n if (!wellFormed)\n throw new Error(`Malformed selector "${s}"`);\n return s;\n }\n matches(element, s, context) {\n const selector = this._checkSelector(s);\n this.begin();\n try {\n return this._cached(this._cacheMatches, element, [selector, context.scope, context.pierceShadow, context.originalScope], () => {\n if (Array.isArray(selector))\n return this._matchesEngine(isEngine, element, selector, context);\n if (this._hasScopeClause(selector))\n context = this._expandContextForScopeMatching(context);\n if (!this._matchesSimple(element, selector.simples[selector.simples.length - 1].selector, context))\n return false;\n return this._matchesParents(element, selector, selector.simples.length - 2, context);\n });\n } finally {\n this.end();\n }\n }\n query(context, s) {\n const selector = this._checkSelector(s);\n this.begin();\n try {\n return this._cached(this._cacheQuery, selector, [context.scope, context.pierceShadow, context.originalScope], () => {\n if (Array.isArray(selector))\n return this._queryEngine(isEngine, context, selector);\n if (this._hasScopeClause(selector))\n context = this._expandContextForScopeMatching(context);\n const previousScoreMap = this._scoreMap;\n this._scoreMap = /* @__PURE__ */ new Map();\n let elements = this._querySimple(context, selector.simples[selector.simples.length - 1].selector);\n elements = elements.filter((element) => this._matchesParents(element, selector, selector.simples.length - 2, context));\n if (this._scoreMap.size) {\n elements.sort((a, b) => {\n const aScore = this._scoreMap.get(a);\n const bScore = this._scoreMap.get(b);\n if (aScore === bScore)\n return 0;\n if (aScore === void 0)\n return 1;\n if (bScore === void 0)\n return -1;\n return aScore - bScore;\n });\n }\n this._scoreMap = previousScoreMap;\n return elements;\n });\n } finally {\n this.end();\n }\n }\n _markScore(element, score) {\n if (this._scoreMap)\n this._scoreMap.set(element, score);\n }\n _hasScopeClause(selector) {\n return selector.simples.some((simple) => simple.selector.functions.some((f) => f.name === "scope"));\n }\n _expandContextForScopeMatching(context) {\n if (context.scope.nodeType !== 1)\n return context;\n const scope = parentElementOrShadowHost(context.scope);\n if (!scope)\n return context;\n return { ...context, scope, originalScope: context.originalScope || context.scope };\n }\n _matchesSimple(element, simple, context) {\n return this._cached(this._cacheMatchesSimple, element, [simple, context.scope, context.pierceShadow, context.originalScope], () => {\n if (element === context.scope)\n return false;\n if (simple.css && !this._matchesCSS(element, simple.css))\n return false;\n for (const func of simple.functions) {\n if (!this._matchesEngine(this._getEngine(func.name), element, func.args, context))\n return false;\n }\n return true;\n });\n }\n _querySimple(context, simple) {\n if (!simple.functions.length)\n return this._queryCSS(context, simple.css || "*");\n return this._cached(this._cacheQuerySimple, simple, [context.scope, context.pierceShadow, context.originalScope], () => {\n let css = simple.css;\n const funcs = simple.functions;\n if (css === "*" && funcs.length)\n css = void 0;\n let elements;\n let firstIndex = -1;\n if (css !== void 0) {\n elements = this._queryCSS(context, css);\n } else {\n firstIndex = funcs.findIndex((func) => this._getEngine(func.name).query !== void 0);\n if (firstIndex === -1)\n firstIndex = 0;\n elements = this._queryEngine(this._getEngine(funcs[firstIndex].name), context, funcs[firstIndex].args);\n }\n for (let i = 0; i < funcs.length; i++) {\n if (i === firstIndex)\n continue;\n const engine = this._getEngine(funcs[i].name);\n if (engine.matches !== void 0)\n elements = elements.filter((e) => this._matchesEngine(engine, e, funcs[i].args, context));\n }\n for (let i = 0; i < funcs.length; i++) {\n if (i === firstIndex)\n continue;\n const engine = this._getEngine(funcs[i].name);\n if (engine.matches === void 0)\n elements = elements.filter((e) => this._matchesEngine(engine, e, funcs[i].args, context));\n }\n return elements;\n });\n }\n _matchesParents(element, complex, index, context) {\n if (index < 0)\n return true;\n return this._cached(this._cacheMatchesParents, element, [complex, index, context.scope, context.pierceShadow, context.originalScope], () => {\n const { selector: simple, combinator } = complex.simples[index];\n if (combinator === ">") {\n const parent = parentElementOrShadowHostInContext(element, context);\n if (!parent || !this._matchesSimple(parent, simple, context))\n return false;\n return this._matchesParents(parent, complex, index - 1, context);\n }\n if (combinator === "+") {\n const previousSibling = previousSiblingInContext(element, context);\n if (!previousSibling || !this._matchesSimple(previousSibling, simple, context))\n return false;\n return this._matchesParents(previousSibling, complex, index - 1, context);\n }\n if (combinator === "") {\n let parent = parentElementOrShadowHostInContext(element, context);\n while (parent) {\n if (this._matchesSimple(parent, simple, context)) {\n if (this._matchesParents(parent, complex, index - 1, context))\n return true;\n if (complex.simples[index - 1].combinator === "")\n break;\n }\n parent = parentElementOrShadowHostInContext(parent, context);\n }\n return false;\n }\n if (combinator === "~") {\n let previousSibling = previousSiblingInContext(element, context);\n while (previousSibling) {\n if (this._matchesSimple(previousSibling, simple, context)) {\n if (this._matchesParents(previousSibling, complex, index - 1, context))\n return true;\n if (complex.simples[index - 1].combinator === "~")\n break;\n }\n previousSibling = previousSiblingInContext(previousSibling, context);\n }\n return false;\n }\n if (combinator === ">=") {\n let parent = element;\n while (parent) {\n if (this._matchesSimple(parent, simple, context)) {\n if (this._matchesParents(parent, complex, index - 1, context))\n return true;\n if (complex.simples[index - 1].combinator === "")\n break;\n }\n parent = parentElementOrShadowHostInContext(parent, context);\n }\n return false;\n }\n throw new Error(`Unsupported combinator "${combinator}"`);\n });\n }\n _matchesEngine(engine, element, args, context) {\n if (engine.matches)\n return this._callMatches(engine, element, args, context);\n if (engine.query)\n return this._callQuery(engine, args, context).includes(element);\n throw new Error(`Selector engine should implement "matches" or "query"`);\n }\n _queryEngine(engine, context, args) {\n if (engine.query)\n return this._callQuery(engine, args, context);\n if (engine.matches)\n return this._queryCSS(context, "*").filter((element) => this._callMatches(engine, element, args, context));\n throw new Error(`Selector engine should implement "matches" or "query"`);\n }\n _callMatches(engine, element, args, context) {\n return this._cached(this._cacheCallMatches, element, [engine, context.scope, context.pierceShadow, context.originalScope, ...args], () => {\n return engine.matches(element, args, context, this);\n });\n }\n _callQuery(engine, args, context) {\n return this._cached(this._cacheCallQuery, engine, [context.scope, context.pierceShadow, context.originalScope, ...args], () => {\n return engine.query(context, args, this);\n });\n }\n _matchesCSS(element, css) {\n return element.matches(css);\n }\n _queryCSS(context, css) {\n return this._cached(this._cacheQueryCSS, css, [context.scope, context.pierceShadow, context.originalScope], () => {\n let result = [];\n function query(root) {\n result = result.concat([...root.querySelectorAll(css)]);\n if (!context.pierceShadow)\n return;\n if (root.shadowRoot)\n query(root.shadowRoot);\n for (const element of root.querySelectorAll("*")) {\n if (element.shadowRoot)\n query(element.shadowRoot);\n }\n }\n query(context.scope);\n return result;\n });\n }\n _getEngine(name) {\n const engine = this._engines.get(name);\n if (!engine)\n throw new Error(`Unknown selector engine "${name}"`);\n return engine;\n }\n};\nvar isEngine = {\n matches(element, args, context, evaluator) {\n if (args.length === 0)\n throw new Error(`"is" engine expects non-empty selector list`);\n return args.some((selector) => evaluator.matches(element, selector, context));\n },\n query(context, args, evaluator) {\n if (args.length === 0)\n throw new Error(`"is" engine expects non-empty selector list`);\n let elements = [];\n for (const arg of args)\n elements = elements.concat(evaluator.query(context, arg));\n return args.length === 1 ? elements : sortInDOMOrder(elements);\n }\n};\nvar hasEngine = {\n matches(element, args, context, evaluator) {\n if (args.length === 0)\n throw new Error(`"has" engine expects non-empty selector list`);\n return evaluator.query({ ...context, scope: element }, args).length > 0;\n }\n // TODO: we can implement efficient "query" by matching "args" and returning\n // all parents/descendants, just have to be careful with the ":scope" matching.\n};\nvar scopeEngine = {\n matches(element, args, context, evaluator) {\n if (args.length !== 0)\n throw new Error(`"scope" engine expects no arguments`);\n const actualScope = context.originalScope || context.scope;\n if (actualScope.nodeType === 9)\n return element === actualScope.documentElement;\n return element === actualScope;\n },\n query(context, args, evaluator) {\n if (args.length !== 0)\n throw new Error(`"scope" engine expects no arguments`);\n const actualScope = context.originalScope || context.scope;\n if (actualScope.nodeType === 9) {\n const root = actualScope.documentElement;\n return root ? [root] : [];\n }\n if (actualScope.nodeType === 1)\n return [actualScope];\n return [];\n }\n};\nvar notEngine = {\n matches(element, args, context, evaluator) {\n if (args.length === 0)\n throw new Error(`"not" engine expects non-empty selector list`);\n return !evaluator.matches(element, args, context);\n }\n};\nvar lightEngine = {\n query(context, args, evaluator) {\n return evaluator.query({ ...context, pierceShadow: false }, args);\n },\n matches(element, args, context, evaluator) {\n return evaluator.matches(element, args, { ...context, pierceShadow: false });\n }\n};\nvar visibleEngine = {\n matches(element, args, context, evaluator) {\n if (args.length)\n throw new Error(`"visible" engine expects no arguments`);\n return isElementVisible(element);\n }\n};\nvar textEngine = {\n matches(element, args, context, evaluator) {\n if (args.length !== 1 || typeof args[0] !== "string")\n throw new Error(`"text" engine expects a single string`);\n const text = normalizeWhiteSpace(args[0]).toLowerCase();\n const matcher = (elementText2) => elementText2.normalized.toLowerCase().includes(text);\n return elementMatchesText(evaluator._cacheText, element, matcher) === "self";\n }\n};\nvar textIsEngine = {\n matches(element, args, context, evaluator) {\n if (args.length !== 1 || typeof args[0] !== "string")\n throw new Error(`"text-is" engine expects a single string`);\n const text = normalizeWhiteSpace(args[0]);\n const matcher = (elementText2) => {\n if (!text && !elementText2.immediate.length)\n return true;\n return elementText2.immediate.some((s) => normalizeWhiteSpace(s) === text);\n };\n return elementMatchesText(evaluator._cacheText, element, matcher) !== "none";\n }\n};\nvar textMatchesEngine = {\n matches(element, args, context, evaluator) {\n if (args.length === 0 || typeof args[0] !== "string" || args.length > 2 || args.length === 2 && typeof args[1] !== "string")\n throw new Error(`"text-matches" engine expects a regexp body and optional regexp flags`);\n const re = new RegExp(args[0], args.length === 2 ? args[1] : void 0);\n const matcher = (elementText2) => re.test(elementText2.full);\n return elementMatchesText(evaluator._cacheText, element, matcher) === "self";\n }\n};\nvar hasTextEngine = {\n matches(element, args, context, evaluator) {\n if (args.length !== 1 || typeof args[0] !== "string")\n throw new Error(`"has-text" engine expects a single string`);\n if (shouldSkipForTextMatching(element))\n return false;\n const text = normalizeWhiteSpace(args[0]).toLowerCase();\n const matcher = (elementText2) => elementText2.normalized.toLowerCase().includes(text);\n return matcher(elementText(evaluator._cacheText, element));\n }\n};\nfunction createLayoutEngine(name) {\n return {\n matches(element, args, context, evaluator) {\n const maxDistance = args.length && typeof args[args.length - 1] === "number" ? args[args.length - 1] : void 0;\n const queryArgs = maxDistance === void 0 ? args : args.slice(0, args.length - 1);\n if (args.length < 1 + (maxDistance === void 0 ? 0 : 1))\n throw new Error(`"${name}" engine expects a selector list and optional maximum distance in pixels`);\n const inner = evaluator.query(context, queryArgs);\n const score = layoutSelectorScore(name, element, inner, maxDistance);\n if (score === void 0)\n return false;\n evaluator._markScore(element, score);\n return true;\n }\n };\n}\nvar nthMatchEngine = {\n query(context, args, evaluator) {\n let index = args[args.length - 1];\n if (args.length < 2)\n throw new Error(`"nth-match" engine expects non-empty selector list and an index argument`);\n if (typeof index !== "number" || index < 1)\n throw new Error(`"nth-match" engine expects a one-based index as the last argument`);\n const elements = isEngine.query(context, args.slice(0, args.length - 1), evaluator);\n index--;\n return index < elements.length ? [elements[index]] : [];\n }\n};\nfunction parentElementOrShadowHostInContext(element, context) {\n if (element === context.scope)\n return;\n if (!context.pierceShadow)\n return element.parentElement || void 0;\n return parentElementOrShadowHost(element);\n}\nfunction previousSiblingInContext(element, context) {\n if (element === context.scope)\n return;\n return element.previousElementSibling || void 0;\n}\nfunction sortInDOMOrder(elements) {\n const elementToEntry = /* @__PURE__ */ new Map();\n const roots = [];\n const result = [];\n function append(element) {\n let entry = elementToEntry.get(element);\n if (entry)\n return entry;\n const parent = parentElementOrShadowHost(element);\n if (parent) {\n const parentEntry = append(parent);\n parentEntry.children.push(element);\n } else {\n roots.push(element);\n }\n entry = { children: [], taken: false };\n elementToEntry.set(element, entry);\n return entry;\n }\n for (const e of elements)\n append(e).taken = true;\n function visit(element) {\n const entry = elementToEntry.get(element);\n if (entry.taken)\n result.push(element);\n if (entry.children.length > 1) {\n const set = new Set(entry.children);\n entry.children = [];\n let child = element.firstElementChild;\n while (child && entry.children.length < set.size) {\n if (set.has(child))\n entry.children.push(child);\n child = child.nextElementSibling;\n }\n child = element.shadowRoot ? element.shadowRoot.firstElementChild : null;\n while (child && entry.children.length < set.size) {\n if (set.has(child))\n entry.children.push(child);\n child = child.nextElementSibling;\n }\n }\n entry.children.forEach(visit);\n }\n roots.forEach(visit);\n return result;\n}\n\n// packages/injected/src/selectorGenerator.ts\nvar kTextScoreRange = 10;\nvar kExactPenalty = kTextScoreRange / 2;\nvar kTestIdScore = 1;\nvar kOtherTestIdScore = 2;\nvar kIframeByAttributeScore = 10;\nvar kBeginPenalizedScore = 50;\nvar kRoleWithNameScore = 100;\nvar kPlaceholderScore = 120;\nvar kLabelScore = 140;\nvar kAltTextScore = 160;\nvar kTextScore = 180;\nvar kTitleScore = 200;\nvar kTextScoreRegex = 250;\nvar kPlaceholderScoreExact = kPlaceholderScore + kExactPenalty;\nvar kLabelScoreExact = kLabelScore + kExactPenalty;\nvar kRoleWithNameScoreExact = kRoleWithNameScore + kExactPenalty;\nvar kAltTextScoreExact = kAltTextScore + kExactPenalty;\nvar kTextScoreExact = kTextScore + kExactPenalty;\nvar kTitleScoreExact = kTitleScore + kExactPenalty;\nvar kEndPenalizedScore = 300;\nvar kCSSIdScore = 500;\nvar kRoleWithoutNameScore = 510;\nvar kCSSInputTypeNameScore = 520;\nvar kCSSTagNameScore = 530;\nvar kNthScore = 1e4;\nvar kCSSFallbackScore = 1e7;\nvar kScoreThresholdForTextExpect = 1e3;\nfunction generateSelector(injectedScript, targetElement, options) {\n var _a;\n injectedScript._evaluator.begin();\n const cache = { allowText: /* @__PURE__ */ new Map(), disallowText: /* @__PURE__ */ new Map() };\n beginAriaCaches();\n beginDOMCaches();\n try {\n let selectors = [];\n if (options.forTextExpect) {\n let targetTokens = cssFallback(injectedScript, targetElement.ownerDocument.documentElement, options);\n for (let element = targetElement; element; element = parentElementOrShadowHost(element)) {\n const tokens = generateSelectorFor(cache, injectedScript, element, { ...options, noText: true });\n if (!tokens)\n continue;\n const score = combineScores(tokens);\n if (score <= kScoreThresholdForTextExpect) {\n targetTokens = tokens;\n break;\n }\n }\n selectors = [joinTokens(targetTokens)];\n } else {\n if (!targetElement.matches("input,textarea,select") && !targetElement.isContentEditable) {\n const interactiveParent = closestCrossShadow(targetElement, "button,select,input,[role=button],[role=checkbox],[role=radio],a,[role=link]", options.root);\n if (interactiveParent && isElementVisible(interactiveParent))\n targetElement = interactiveParent;\n }\n if (options.multiple) {\n const withText = generateSelectorFor(cache, injectedScript, targetElement, options);\n const withoutText = generateSelectorFor(cache, injectedScript, targetElement, { ...options, noText: true });\n let tokens = [withText, withoutText];\n cache.allowText.clear();\n cache.disallowText.clear();\n if (withText && hasCSSIdToken(withText))\n tokens.push(generateSelectorFor(cache, injectedScript, targetElement, { ...options, noCSSId: true }));\n if (withoutText && hasCSSIdToken(withoutText))\n tokens.push(generateSelectorFor(cache, injectedScript, targetElement, { ...options, noText: true, noCSSId: true }));\n tokens = tokens.filter(Boolean);\n if (!tokens.length) {\n const css = cssFallback(injectedScript, targetElement, options);\n tokens.push(css);\n if (hasCSSIdToken(css))\n tokens.push(cssFallback(injectedScript, targetElement, { ...options, noCSSId: true }));\n }\n selectors = [...new Set(tokens.map((t) => joinTokens(t)))];\n } else {\n const targetTokens = generateSelectorFor(cache, injectedScript, targetElement, options) || cssFallback(injectedScript, targetElement, options);\n selectors = [joinTokens(targetTokens)];\n }\n }\n const selector = selectors[0];\n const parsedSelector = injectedScript.parseSelector(selector);\n return {\n selector,\n selectors,\n elements: injectedScript.querySelectorAll(parsedSelector, (_a = options.root) != null ? _a : targetElement.ownerDocument)\n };\n } finally {\n endDOMCaches();\n endAriaCaches();\n injectedScript._evaluator.end();\n }\n}\nfunction generateSelectorFor(cache, injectedScript, targetElement, options) {\n var _a;\n if (options.root && !isInsideScope(options.root, targetElement))\n throw new Error(`Target element must belong to the root\'s subtree`);\n if (targetElement === options.root)\n return [{ engine: "css", selector: ":scope", score: 1 }];\n if (targetElement.ownerDocument.documentElement === targetElement)\n return [{ engine: "css", selector: "html", score: 1 }];\n let result = null;\n const updateResult = (candidate) => {\n if (!result || combineScores(candidate) < combineScores(result))\n result = candidate;\n };\n const candidates = [];\n if (!options.noText) {\n for (const candidate of buildTextCandidates(injectedScript, targetElement, !options.isRecursive))\n candidates.push({ candidate, isTextCandidate: true });\n }\n for (const token of buildNoTextCandidates(injectedScript, targetElement, options)) {\n if (options.omitInternalEngines && token.engine.startsWith("internal:"))\n continue;\n candidates.push({ candidate: [token], isTextCandidate: false });\n }\n candidates.sort((a, b) => combineScores(a.candidate) - combineScores(b.candidate));\n for (const { candidate, isTextCandidate } of candidates) {\n const elements = injectedScript.querySelectorAll(injectedScript.parseSelector(joinTokens(candidate)), (_a = options.root) != null ? _a : targetElement.ownerDocument);\n if (!elements.includes(targetElement)) {\n continue;\n }\n if (elements.length === 1) {\n updateResult(candidate);\n break;\n }\n const index = elements.indexOf(targetElement);\n if (index > 5) {\n continue;\n }\n updateResult([...candidate, { engine: "nth", selector: String(index), score: kNthScore }]);\n if (options.isRecursive) {\n continue;\n }\n for (let parent = parentElementOrShadowHost(targetElement); parent && parent !== options.root; parent = parentElementOrShadowHost(parent)) {\n const filtered = elements.filter((e) => isInsideScope(parent, e) && e !== parent);\n const newIndex = filtered.indexOf(targetElement);\n if (filtered.length > 5 || newIndex === -1 || newIndex === index && filtered.length > 1) {\n continue;\n }\n const inParent = filtered.length === 1 ? candidate : [...candidate, { engine: "nth", selector: String(newIndex), score: kNthScore }];\n const idealSelectorForParent = { engine: "", selector: "", score: 1 };\n if (result && combineScores([idealSelectorForParent, ...inParent]) >= combineScores(result)) {\n continue;\n }\n const noText = !!options.noText || isTextCandidate;\n const cacheMap = noText ? cache.disallowText : cache.allowText;\n let parentTokens = cacheMap.get(parent);\n if (parentTokens === void 0) {\n parentTokens = generateSelectorFor(cache, injectedScript, parent, { ...options, isRecursive: true, noText }) || cssFallback(injectedScript, parent, options);\n cacheMap.set(parent, parentTokens);\n }\n if (!parentTokens)\n continue;\n updateResult([...parentTokens, ...inParent]);\n }\n }\n return result;\n}\nfunction buildNoTextCandidates(injectedScript, element, options) {\n const candidates = [];\n const testIdAttributeNames = splitTestIdAttributeNames(options.testIdAttributeName);\n {\n for (const attr of ["data-testid", "data-test-id", "data-test"]) {\n if (!testIdAttributeNames.includes(attr) && element.getAttribute(attr))\n candidates.push({ engine: "css", selector: `[${attr}=${quoteCSSAttributeValue(element.getAttribute(attr))}]`, score: kOtherTestIdScore });\n }\n if (!options.noCSSId) {\n const idAttr = element.getAttribute("id");\n if (idAttr && !isGuidLike(idAttr))\n candidates.push({ engine: "css", selector: makeSelectorForId(idAttr), score: kCSSIdScore });\n }\n candidates.push({ engine: "css", selector: escapeNodeName(element), score: kCSSTagNameScore });\n }\n if (element.nodeName === "IFRAME") {\n for (const attribute of ["name", "title"]) {\n if (element.getAttribute(attribute))\n candidates.push({ engine: "css", selector: `${escapeNodeName(element)}[${attribute}=${quoteCSSAttributeValue(element.getAttribute(attribute))}]`, score: kIframeByAttributeScore });\n }\n for (const testIdAttr of testIdAttributeNames) {\n if (element.getAttribute(testIdAttr))\n candidates.push({ engine: "css", selector: `[${testIdAttr}=${quoteCSSAttributeValue(element.getAttribute(testIdAttr))}]`, score: kTestIdScore });\n }\n penalizeScoreForLength([candidates]);\n return candidates;\n }\n for (const testIdAttr of testIdAttributeNames) {\n if (element.getAttribute(testIdAttr))\n candidates.push({ engine: "internal:testid", selector: `[${testIdAttr}=${escapeForAttributeSelector(element.getAttribute(testIdAttr), true)}]`, score: kTestIdScore });\n }\n if (element.nodeName === "INPUT" || element.nodeName === "TEXTAREA") {\n const input = element;\n if (input.placeholder) {\n candidates.push({ engine: "internal:attr", selector: `[placeholder=${escapeForAttributeSelector(input.placeholder, true)}]`, score: kPlaceholderScoreExact });\n for (const alternative of suitableTextAlternatives(input.placeholder))\n candidates.push({ engine: "internal:attr", selector: `[placeholder=${escapeForAttributeSelector(alternative.text, false)}]`, score: kPlaceholderScore - alternative.scoreBonus });\n }\n }\n const labels = getElementLabels(injectedScript._evaluator._cacheText, element);\n for (const label of labels) {\n const labelText = label.normalized;\n candidates.push({ engine: "internal:label", selector: escapeForTextSelector(labelText, true), score: kLabelScoreExact });\n for (const alternative of suitableTextAlternatives(labelText))\n candidates.push({ engine: "internal:label", selector: escapeForTextSelector(alternative.text, false), score: kLabelScore - alternative.scoreBonus });\n }\n const ariaRole = getAriaRole(element);\n if (ariaRole && !["none", "presentation"].includes(ariaRole))\n candidates.push({ engine: "internal:role", selector: ariaRole, score: kRoleWithoutNameScore });\n if (element.getAttribute("name") && ["BUTTON", "FORM", "FIELDSET", "FRAME", "IFRAME", "INPUT", "KEYGEN", "OBJECT", "OUTPUT", "SELECT", "TEXTAREA", "MAP", "META", "PARAM"].includes(element.nodeName))\n candidates.push({ engine: "css", selector: `${escapeNodeName(element)}[name=${quoteCSSAttributeValue(element.getAttribute("name"))}]`, score: kCSSInputTypeNameScore });\n if (["INPUT", "TEXTAREA"].includes(element.nodeName) && element.getAttribute("type") !== "hidden") {\n if (element.getAttribute("type"))\n candidates.push({ engine: "css", selector: `${escapeNodeName(element)}[type=${quoteCSSAttributeValue(element.getAttribute("type"))}]`, score: kCSSInputTypeNameScore });\n }\n if (["INPUT", "TEXTAREA", "SELECT"].includes(element.nodeName) && element.getAttribute("type") !== "hidden")\n candidates.push({ engine: "css", selector: escapeNodeName(element), score: kCSSInputTypeNameScore + 1 });\n penalizeScoreForLength([candidates]);\n return candidates;\n}\nfunction buildTextCandidates(injectedScript, element, isTargetNode) {\n if (element.nodeName === "SELECT")\n return [];\n const candidates = [];\n const title = element.getAttribute("title");\n if (title) {\n candidates.push([{ engine: "internal:attr", selector: `[title=${escapeForAttributeSelector(title, true)}]`, score: kTitleScoreExact }]);\n for (const alternative of suitableTextAlternatives(title))\n candidates.push([{ engine: "internal:attr", selector: `[title=${escapeForAttributeSelector(alternative.text, false)}]`, score: kTitleScore - alternative.scoreBonus }]);\n }\n const alt = element.getAttribute("alt");\n if (alt && ["APPLET", "AREA", "IMG", "INPUT"].includes(element.nodeName)) {\n candidates.push([{ engine: "internal:attr", selector: `[alt=${escapeForAttributeSelector(alt, true)}]`, score: kAltTextScoreExact }]);\n for (const alternative of suitableTextAlternatives(alt))\n candidates.push([{ engine: "internal:attr", selector: `[alt=${escapeForAttributeSelector(alternative.text, false)}]`, score: kAltTextScore - alternative.scoreBonus }]);\n }\n const text = elementText(injectedScript._evaluator._cacheText, element).normalized;\n const textAlternatives = text ? suitableTextAlternatives(text) : [];\n if (text) {\n if (isTargetNode) {\n if (text.length <= 80)\n candidates.push([{ engine: "internal:text", selector: escapeForTextSelector(text, true), score: kTextScoreExact }]);\n for (const alternative of textAlternatives)\n candidates.push([{ engine: "internal:text", selector: escapeForTextSelector(alternative.text, false), score: kTextScore - alternative.scoreBonus }]);\n }\n const cssToken = { engine: "css", selector: escapeNodeName(element), score: kCSSTagNameScore };\n for (const alternative of textAlternatives)\n candidates.push([cssToken, { engine: "internal:has-text", selector: escapeForTextSelector(alternative.text, false), score: kTextScore - alternative.scoreBonus }]);\n if (isTargetNode && text.length <= 80) {\n const re = new RegExp("^" + escapeRegExp(text) + "$");\n candidates.push([cssToken, { engine: "internal:has-text", selector: escapeForTextSelector(re, false), score: kTextScoreRegex }]);\n }\n }\n const ariaRole = getAriaRole(element);\n if (ariaRole && !["none", "presentation"].includes(ariaRole)) {\n const ariaName = getElementAccessibleName(element, false);\n if (ariaName && !ariaName.match(/^\\p{Co}+$/u)) {\n const roleToken = { engine: "internal:role", selector: `${ariaRole}[name=${escapeForAttributeSelector(ariaName, true)}]`, score: kRoleWithNameScoreExact };\n candidates.push([roleToken]);\n for (const alternative of suitableTextAlternatives(ariaName))\n candidates.push([{ engine: "internal:role", selector: `${ariaRole}[name=${escapeForAttributeSelector(alternative.text, false)}]`, score: kRoleWithNameScore - alternative.scoreBonus }]);\n const ariaDescription = getElementAccessibleDescription(element, false);\n if (ariaDescription) {\n candidates.push([{ engine: "internal:role", selector: `${ariaRole}[name=${escapeForAttributeSelector(ariaName, true)}][description=${escapeForAttributeSelector(ariaDescription, true)}]`, score: kRoleWithNameScoreExact + 1 }]);\n for (const alternative of suitableTextAlternatives(ariaName))\n candidates.push([{ engine: "internal:role", selector: `${ariaRole}[name=${escapeForAttributeSelector(alternative.text, false)}][description=${escapeForAttributeSelector(ariaDescription, false)}]`, score: kRoleWithNameScore - alternative.scoreBonus + 1 }]);\n }\n } else {\n const roleToken = { engine: "internal:role", selector: `${ariaRole}`, score: kRoleWithoutNameScore };\n const ariaDescription = getElementAccessibleDescription(element, false);\n if (ariaDescription)\n candidates.push([{ engine: "internal:role", selector: `${ariaRole}[description=${escapeForAttributeSelector(ariaDescription, true)}]`, score: kRoleWithoutNameScore + 1 }]);\n for (const alternative of textAlternatives)\n candidates.push([roleToken, { engine: "internal:has-text", selector: escapeForTextSelector(alternative.text, false), score: kTextScore - alternative.scoreBonus }]);\n if (isTargetNode && text.length <= 80) {\n const re = new RegExp("^" + escapeRegExp(text) + "$");\n candidates.push([roleToken, { engine: "internal:has-text", selector: escapeForTextSelector(re, false), score: kTextScoreRegex }]);\n }\n }\n }\n penalizeScoreForLength(candidates);\n return candidates;\n}\nfunction makeSelectorForId(id) {\n return /^[a-zA-Z][a-zA-Z0-9\\-\\_]+$/.test(id) ? "#" + id : `[id=${quoteCSSAttributeValue(id)}]`;\n}\nfunction hasCSSIdToken(tokens) {\n return tokens.some((token) => token.engine === "css" && (token.selector.startsWith("#") || token.selector.startsWith(\'[id="\')));\n}\nfunction cssFallback(injectedScript, targetElement, options) {\n var _a;\n const root = (_a = options.root) != null ? _a : targetElement.ownerDocument;\n const tokens = [];\n function uniqueCSSSelector(prefix) {\n const path = tokens.slice();\n if (prefix)\n path.unshift(prefix);\n const selector = path.join(" > ");\n const parsedSelector = injectedScript.parseSelector(selector);\n const node = injectedScript.querySelector(parsedSelector, root, false);\n return node === targetElement ? selector : void 0;\n }\n function makeStrict(selector) {\n const token = { engine: "css", selector, score: kCSSFallbackScore };\n const parsedSelector = injectedScript.parseSelector(selector);\n const elements = injectedScript.querySelectorAll(parsedSelector, root);\n if (elements.length === 1)\n return [token];\n const nth = { engine: "nth", selector: String(elements.indexOf(targetElement)), score: kNthScore };\n return [token, nth];\n }\n for (let element = targetElement; element && element !== root; element = parentElementOrShadowHost(element)) {\n let bestTokenForLevel = "";\n if (element.id && !options.noCSSId) {\n const token = makeSelectorForId(element.id);\n const selector = uniqueCSSSelector(token);\n if (selector)\n return makeStrict(selector);\n bestTokenForLevel = token;\n }\n const parent = element.parentNode;\n const classes = [...element.classList].map(escapeClassName);\n for (let i = 0; i < classes.length; ++i) {\n const token = "." + classes.slice(0, i + 1).join(".");\n const selector = uniqueCSSSelector(token);\n if (selector)\n return makeStrict(selector);\n if (!bestTokenForLevel && parent) {\n const sameClassSiblings = parent.querySelectorAll(token);\n if (sameClassSiblings.length === 1)\n bestTokenForLevel = token;\n }\n }\n if (parent) {\n const siblings = [...parent.children];\n const nodeName = element.nodeName;\n const sameTagSiblings = siblings.filter((sibling) => sibling.nodeName === nodeName);\n const token = sameTagSiblings.indexOf(element) === 0 ? escapeNodeName(element) : `${escapeNodeName(element)}:nth-child(${1 + siblings.indexOf(element)})`;\n const selector = uniqueCSSSelector(token);\n if (selector)\n return makeStrict(selector);\n if (!bestTokenForLevel)\n bestTokenForLevel = token;\n } else if (!bestTokenForLevel) {\n bestTokenForLevel = escapeNodeName(element);\n }\n tokens.unshift(bestTokenForLevel);\n }\n return makeStrict(uniqueCSSSelector());\n}\nfunction penalizeScoreForLength(groups) {\n for (const group of groups) {\n for (const token of group) {\n if (token.score > kBeginPenalizedScore && token.score < kEndPenalizedScore)\n token.score += Math.min(kTextScoreRange, token.selector.length / 10 | 0);\n }\n }\n}\nfunction joinTokens(tokens) {\n const parts = [];\n let lastEngine = "";\n for (const { engine, selector } of tokens) {\n if (parts.length && (lastEngine !== "css" || engine !== "css" || selector.startsWith(":nth-match(")))\n parts.push(">>");\n lastEngine = engine;\n if (engine === "css")\n parts.push(selector);\n else\n parts.push(`${engine}=${selector}`);\n }\n return parts.join(" ");\n}\nfunction combineScores(tokens) {\n let score = 0;\n for (let i = 0; i < tokens.length; i++)\n score += tokens[i].score * (tokens.length - i);\n return score;\n}\nfunction isGuidLike(id) {\n let lastCharacterType;\n let transitionCount = 0;\n for (let i = 0; i < id.length; ++i) {\n const c = id[i];\n let characterType;\n if (c === "-" || c === "_")\n continue;\n if (c >= "a" && c <= "z")\n characterType = "lower";\n else if (c >= "A" && c <= "Z")\n characterType = "upper";\n else if (c >= "0" && c <= "9")\n characterType = "digit";\n else\n characterType = "other";\n if (characterType === "lower" && lastCharacterType === "upper") {\n lastCharacterType = characterType;\n continue;\n }\n if (lastCharacterType && lastCharacterType !== characterType)\n ++transitionCount;\n lastCharacterType = characterType;\n }\n return transitionCount >= id.length / 4;\n}\nfunction trimWordBoundary(text, maxLength) {\n if (text.length <= maxLength)\n return text;\n text = text.substring(0, maxLength);\n const match = text.match(/^(.*)\\b(.+?)$/);\n if (!match)\n return "";\n return match[1].trimEnd();\n}\nfunction suitableTextAlternatives(text) {\n let result = [];\n {\n const match = text.match(/^([\\d.,]+)[^.,\\w]/);\n const leadingNumberLength = match ? match[1].length : 0;\n if (leadingNumberLength) {\n const alt = trimWordBoundary(text.substring(leadingNumberLength).trimStart(), 80);\n result.push({ text: alt, scoreBonus: alt.length <= 30 ? 2 : 1 });\n }\n }\n {\n const match = text.match(/[^.,\\w]([\\d.,]+)$/);\n const trailingNumberLength = match ? match[1].length : 0;\n if (trailingNumberLength) {\n const alt = trimWordBoundary(text.substring(0, text.length - trailingNumberLength).trimEnd(), 80);\n result.push({ text: alt, scoreBonus: alt.length <= 30 ? 2 : 1 });\n }\n }\n if (text.length <= 30) {\n result.push({ text, scoreBonus: 0 });\n } else {\n result.push({ text: trimWordBoundary(text, 80), scoreBonus: 0 });\n result.push({ text: trimWordBoundary(text, 30), scoreBonus: 1 });\n }\n result = result.filter((r) => r.text);\n if (!result.length)\n result.push({ text: text.substring(0, 80), scoreBonus: 0 });\n return result;\n}\nfunction escapeNodeName(node) {\n return node.nodeName.toLocaleLowerCase().replace(/[:\\.]/g, (char) => "\\\\" + char);\n}\nfunction escapeClassName(className) {\n let result = "";\n for (let i = 0; i < className.length; i++)\n result += cssEscapeCharacter(className, i);\n return result;\n}\nfunction cssEscapeCharacter(s, i) {\n const c = s.charCodeAt(i);\n if (c === 0)\n return "\\uFFFD";\n if (c >= 1 && c <= 31 || c >= 48 && c <= 57 && (i === 0 || i === 1 && s.charCodeAt(0) === 45))\n return "\\\\" + c.toString(16) + " ";\n if (i === 0 && c === 45 && s.length === 1)\n return "\\\\" + s.charAt(i);\n if (c >= 128 || c === 45 || c === 95 || c >= 48 && c <= 57 || c >= 65 && c <= 90 || c >= 97 && c <= 122)\n return s.charAt(i);\n return "\\\\" + s.charAt(i);\n}\n\n// packages/injected/src/xpathSelectorEngine.ts\nvar XPathEngine = {\n queryAll(root, selector) {\n if (selector.startsWith("/") && root.nodeType !== Node.DOCUMENT_NODE)\n selector = "." + selector;\n const result = [];\n const document = root.ownerDocument || root;\n if (!document)\n return result;\n const it = document.evaluate(selector, root, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE);\n for (let node = it.iterateNext(); node; node = it.iterateNext()) {\n if (node.nodeType === Node.ELEMENT_NODE)\n result.push(node);\n }\n return result;\n }\n};\n\n// packages/injected/src/consoleApi.ts\nvar selectorSymbol = Symbol("selector");\nselectorSymbol;\nvar _Locator = class _Locator {\n constructor(injectedScript, selector, options) {\n if (options == null ? void 0 : options.hasText)\n selector += ` >> internal:has-text=${escapeForTextSelector(options.hasText, false)}`;\n if (options == null ? void 0 : options.hasNotText)\n selector += ` >> internal:has-not-text=${escapeForTextSelector(options.hasNotText, false)}`;\n if (options == null ? void 0 : options.has)\n selector += ` >> internal:has=` + JSON.stringify(options.has[selectorSymbol]);\n if (options == null ? void 0 : options.hasNot)\n selector += ` >> internal:has-not=` + JSON.stringify(options.hasNot[selectorSymbol]);\n if ((options == null ? void 0 : options.visible) !== void 0)\n selector += ` >> visible=${options.visible ? "true" : "false"}`;\n this[selectorSymbol] = selector;\n if (selector) {\n const parsed = injectedScript.parseSelector(selector);\n this.element = injectedScript.querySelector(parsed, injectedScript.document, false);\n this.elements = injectedScript.querySelectorAll(parsed, injectedScript.document);\n }\n const selectorBase = selector;\n const self = this;\n self.locator = (selector2, options2) => {\n return new _Locator(injectedScript, selectorBase ? selectorBase + " >> " + selector2 : selector2, options2);\n };\n self.getByTestId = (testId) => self.locator(getByTestIdSelector(injectedScript.testIdAttributeNameForStrictErrorAndConsoleCodegen(), testId));\n self.getByAltText = (text, options2) => self.locator(getByAltTextSelector(text, options2));\n self.getByLabel = (text, options2) => self.locator(getByLabelSelector(text, options2));\n self.getByPlaceholder = (text, options2) => self.locator(getByPlaceholderSelector(text, options2));\n self.getByText = (text, options2) => self.locator(getByTextSelector(text, options2));\n self.getByTitle = (text, options2) => self.locator(getByTitleSelector(text, options2));\n self.getByRole = (role, options2 = {}) => self.locator(getByRoleSelector(role, options2));\n self.filter = (options2) => new _Locator(injectedScript, selector, options2);\n self.first = () => self.locator("nth=0");\n self.last = () => self.locator("nth=-1");\n self.nth = (index) => self.locator(`nth=${index}`);\n self.and = (locator) => new _Locator(injectedScript, selectorBase + ` >> internal:and=` + JSON.stringify(locator[selectorSymbol]));\n self.or = (locator) => new _Locator(injectedScript, selectorBase + ` >> internal:or=` + JSON.stringify(locator[selectorSymbol]));\n }\n};\nvar Locator = _Locator;\nvar ConsoleAPI = class {\n constructor(injectedScript) {\n this._injectedScript = injectedScript;\n }\n install() {\n if (this._injectedScript.window.playwright)\n return;\n this._injectedScript.window.playwright = {\n $: (selector, strict) => this._querySelector(selector, !!strict),\n $$: (selector) => this._querySelectorAll(selector),\n inspect: (selector) => this._inspect(selector),\n selector: (element) => this._selector(element),\n generateLocator: (element, language) => this._generateLocator(element, language),\n ariaSnapshot: (element, options) => {\n return this._injectedScript.ariaSnapshot(element || this._injectedScript.document.body, options || { mode: "default" });\n },\n resume: () => this._resume(),\n ...new Locator(this._injectedScript, "")\n };\n delete this._injectedScript.window.playwright.filter;\n delete this._injectedScript.window.playwright.first;\n delete this._injectedScript.window.playwright.last;\n delete this._injectedScript.window.playwright.nth;\n delete this._injectedScript.window.playwright.and;\n delete this._injectedScript.window.playwright.or;\n }\n _querySelector(selector, strict) {\n if (typeof selector !== "string")\n throw new Error(`Usage: playwright.query(\'Playwright >> selector\').`);\n const parsed = this._injectedScript.parseSelector(selector);\n return this._injectedScript.querySelector(parsed, this._injectedScript.document, strict);\n }\n _querySelectorAll(selector) {\n if (typeof selector !== "string")\n throw new Error(`Usage: playwright.$$(\'Playwright >> selector\').`);\n const parsed = this._injectedScript.parseSelector(selector);\n return this._injectedScript.querySelectorAll(parsed, this._injectedScript.document);\n }\n _inspect(selector) {\n if (typeof selector !== "string")\n throw new Error(`Usage: playwright.inspect(\'Playwright >> selector\').`);\n this._injectedScript.window.inspect(this._querySelector(selector, false));\n }\n _selector(element) {\n if (!(element instanceof Element))\n throw new Error(`Usage: playwright.selector(element).`);\n return this._injectedScript.generateSelectorSimple(element);\n }\n _generateLocator(element, language) {\n if (!(element instanceof Element))\n throw new Error(`Usage: playwright.locator(element).`);\n const selector = this._injectedScript.generateSelectorSimple(element);\n return asLocator(language || "javascript", selector);\n }\n _resume() {\n if (!this._injectedScript.window.__pw_resume)\n return false;\n this._injectedScript.window.__pw_resume().catch(() => {\n });\n }\n};\n\n// packages/isomorphic/utilityScriptSerializers.ts\nfunction isRegExp2(obj) {\n try {\n return obj instanceof RegExp || Object.prototype.toString.call(obj) === "[object RegExp]";\n } catch (error) {\n return false;\n }\n}\nfunction isDate(obj) {\n try {\n return obj instanceof Date || Object.prototype.toString.call(obj) === "[object Date]";\n } catch (error) {\n return false;\n }\n}\nfunction isURL(obj) {\n try {\n return obj instanceof URL || Object.prototype.toString.call(obj) === "[object URL]";\n } catch (error) {\n return false;\n }\n}\nfunction isError(obj) {\n var _a;\n try {\n return obj instanceof Error || obj && ((_a = Object.getPrototypeOf(obj)) == null ? void 0 : _a.name) === "Error";\n } catch (error) {\n return false;\n }\n}\nfunction isTypedArray(obj, constructor) {\n try {\n return obj instanceof constructor || Object.prototype.toString.call(obj) === `[object ${constructor.name}]`;\n } catch (error) {\n return false;\n }\n}\nfunction isArrayBuffer(obj) {\n try {\n return obj instanceof ArrayBuffer || Object.prototype.toString.call(obj) === "[object ArrayBuffer]";\n } catch (error) {\n return false;\n }\n}\nvar typedArrayConstructors = {\n i8: Int8Array,\n ui8: Uint8Array,\n ui8c: Uint8ClampedArray,\n i16: Int16Array,\n ui16: Uint16Array,\n i32: Int32Array,\n ui32: Uint32Array,\n // TODO: add Float16Array once it\'s in baseline\n f32: Float32Array,\n f64: Float64Array,\n bi64: BigInt64Array,\n bui64: BigUint64Array\n};\nfunction typedArrayToBase64(array) {\n if ("toBase64" in array)\n return array.toBase64();\n const binary = Array.from(new Uint8Array(array.buffer, array.byteOffset, array.byteLength)).map((b) => String.fromCharCode(b)).join("");\n return btoa(binary);\n}\nfunction base64ToTypedArray(base64, TypedArrayConstructor) {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++)\n bytes[i] = binary.charCodeAt(i);\n return new TypedArrayConstructor(bytes.buffer);\n}\nfunction parseEvaluationResultValue(value, handles = [], refs = /* @__PURE__ */ new Map()) {\n if (Object.is(value, void 0))\n return void 0;\n if (typeof value === "object" && value) {\n if ("ref" in value)\n return refs.get(value.ref);\n if ("v" in value) {\n if (value.v === "undefined")\n return void 0;\n if (value.v === "null")\n return null;\n if (value.v === "NaN")\n return NaN;\n if (value.v === "Infinity")\n return Infinity;\n if (value.v === "-Infinity")\n return -Infinity;\n if (value.v === "-0")\n return -0;\n return void 0;\n }\n if ("d" in value) {\n return new Date(value.d);\n }\n if ("u" in value)\n return new URL(value.u);\n if ("bi" in value)\n return BigInt(value.bi);\n if ("e" in value) {\n const error = new Error(value.e.m);\n error.name = value.e.n;\n error.stack = value.e.s;\n return error;\n }\n if ("r" in value)\n return new RegExp(value.r.p, value.r.f);\n if ("a" in value) {\n const result = [];\n refs.set(value.id, result);\n for (const a of value.a)\n result.push(parseEvaluationResultValue(a, handles, refs));\n return result;\n }\n if ("o" in value) {\n const result = {};\n refs.set(value.id, result);\n for (const { k, v } of value.o) {\n if (k === "__proto__")\n continue;\n result[k] = parseEvaluationResultValue(v, handles, refs);\n }\n return result;\n }\n if ("h" in value)\n return handles[value.h];\n if ("ta" in value)\n return base64ToTypedArray(value.ta.b, typedArrayConstructors[value.ta.k]);\n if ("ab" in value)\n return base64ToTypedArray(value.ab.b, Uint8Array).buffer;\n }\n return value;\n}\nfunction serializeAsCallArgument(value, handleSerializer) {\n return serialize(value, handleSerializer, { visited: /* @__PURE__ */ new Map(), lastId: 0 });\n}\nfunction serialize(value, handleSerializer, visitorInfo) {\n if (value && typeof value === "object") {\n if (typeof globalThis.Window === "function" && value instanceof globalThis.Window)\n return "ref: ";\n if (typeof globalThis.Document === "function" && value instanceof globalThis.Document)\n return "ref: ";\n if (typeof globalThis.Node === "function" && value instanceof globalThis.Node)\n return "ref: ";\n }\n return innerSerialize(value, handleSerializer, visitorInfo);\n}\nfunction innerSerialize(value, handleSerializer, visitorInfo) {\n var _a;\n const result = handleSerializer(value);\n if ("fallThrough" in result)\n value = result.fallThrough;\n else\n return result;\n if (typeof value === "symbol")\n return { v: "undefined" };\n if (Object.is(value, void 0))\n return { v: "undefined" };\n if (Object.is(value, null))\n return { v: "null" };\n if (Object.is(value, NaN))\n return { v: "NaN" };\n if (Object.is(value, Infinity))\n return { v: "Infinity" };\n if (Object.is(value, -Infinity))\n return { v: "-Infinity" };\n if (Object.is(value, -0))\n return { v: "-0" };\n if (typeof value === "boolean")\n return value;\n if (typeof value === "number")\n return value;\n if (typeof value === "string")\n return value;\n if (typeof value === "bigint")\n return { bi: value.toString() };\n if (isError(value)) {\n let stack;\n if ((_a = value.stack) == null ? void 0 : _a.startsWith(value.name + ": " + value.message)) {\n stack = value.stack;\n } else {\n stack = `${value.name}: ${value.message}\n${value.stack}`;\n }\n return { e: { n: value.name, m: value.message, s: stack } };\n }\n if (isDate(value))\n return { d: value.toJSON() };\n if (isURL(value))\n return { u: value.toJSON() };\n if (isRegExp2(value))\n return { r: { p: value.source, f: value.flags } };\n for (const [k, ctor] of Object.entries(typedArrayConstructors)) {\n if (isTypedArray(value, ctor))\n return { ta: { b: typedArrayToBase64(value), k } };\n }\n if (isArrayBuffer(value))\n return { ab: { b: typedArrayToBase64(new Uint8Array(value)) } };\n const id = visitorInfo.visited.get(value);\n if (id)\n return { ref: id };\n if (Array.isArray(value)) {\n const a = [];\n const id2 = ++visitorInfo.lastId;\n visitorInfo.visited.set(value, id2);\n for (let i = 0; i < value.length; ++i)\n a.push(serialize(value[i], handleSerializer, visitorInfo));\n return { a, id: id2 };\n }\n if (typeof value === "object") {\n const o = [];\n const id2 = ++visitorInfo.lastId;\n visitorInfo.visited.set(value, id2);\n for (const name of Object.keys(value)) {\n let item;\n try {\n item = value[name];\n } catch (e) {\n continue;\n }\n if (name === "toJSON" && typeof item === "function")\n o.push({ k: name, v: { o: [], id: 0 } });\n else\n o.push({ k: name, v: serialize(item, handleSerializer, visitorInfo) });\n }\n let jsonWrapper;\n try {\n if (o.length === 0 && value.toJSON && typeof value.toJSON === "function")\n jsonWrapper = { value: value.toJSON() };\n } catch (e) {\n }\n if (jsonWrapper)\n return innerSerialize(jsonWrapper.value, handleSerializer, visitorInfo);\n return { o, id: id2 };\n }\n}\n\n// packages/injected/src/utilityScript.ts\nvar UtilityScript = class {\n constructor(global, isUnderTest) {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n this.global = global;\n this.isUnderTest = isUnderTest;\n if (global.__pwClock) {\n this.builtins = global.__pwClock.builtins;\n } else {\n this.builtins = {\n setTimeout: (_a = global.setTimeout) == null ? void 0 : _a.bind(global),\n clearTimeout: (_b = global.clearTimeout) == null ? void 0 : _b.bind(global),\n setInterval: (_c = global.setInterval) == null ? void 0 : _c.bind(global),\n clearInterval: (_d = global.clearInterval) == null ? void 0 : _d.bind(global),\n requestAnimationFrame: (_e = global.requestAnimationFrame) == null ? void 0 : _e.bind(global),\n cancelAnimationFrame: (_f = global.cancelAnimationFrame) == null ? void 0 : _f.bind(global),\n requestIdleCallback: (_g = global.requestIdleCallback) == null ? void 0 : _g.bind(global),\n cancelIdleCallback: (_h = global.cancelIdleCallback) == null ? void 0 : _h.bind(global),\n performance: global.performance,\n Intl: global.Intl,\n Date: global.Date,\n AbortSignal: global.AbortSignal\n };\n }\n if (this.isUnderTest)\n global.builtins = this.builtins;\n }\n evaluate(isFunction, returnByValue, expression, argCount, ...argsAndHandles) {\n const args = argsAndHandles.slice(0, argCount);\n const handles = argsAndHandles.slice(argCount);\n const parameters = [];\n for (let i = 0; i < args.length; i++)\n parameters[i] = parseEvaluationResultValue(args[i], handles);\n let result = this.global.eval(expression);\n if (isFunction === true) {\n result = result(...parameters);\n } else if (isFunction === false) {\n result = result;\n } else {\n if (typeof result === "function")\n result = result(...parameters);\n }\n return returnByValue ? this._promiseAwareJsonValueNoThrow(result) : result;\n }\n jsonValue(returnByValue, value) {\n if (value === void 0)\n return void 0;\n return serializeAsCallArgument(value, (value2) => ({ fallThrough: value2 }));\n }\n _promiseAwareJsonValueNoThrow(value) {\n const safeJson = (value2) => {\n try {\n return this.jsonValue(true, value2);\n } catch (e) {\n return void 0;\n }\n };\n if (value && typeof value === "object" && typeof value.then === "function") {\n return (async () => {\n const promiseValue = await value;\n return safeJson(promiseValue);\n })();\n }\n return safeJson(value);\n }\n};\n\n// packages/injected/src/injectedScript.ts\nvar InjectedScript = class {\n constructor(window, options) {\n this._testIdAttributeNameForStrictErrorAndConsoleCodegen = "data-testid";\n this._lastAriaSnapshotForTrack = /* @__PURE__ */ new Map();\n // Recorder must use any external dependencies through InjectedScript.\n // Otherwise it will end up with a copy of all modules it uses, and any\n // module-level globals will be duplicated, which leads to subtle bugs.\n this.utils = {\n asLocator,\n cacheNormalizedWhitespaces,\n elementText,\n getAriaRole,\n getElementAccessibleDescription,\n getElementAccessibleName,\n isElementVisible,\n isInsideScope,\n normalizeWhiteSpace,\n parseAriaSnapshot,\n generateAriaTree,\n findNewElement,\n // Builtins protect injected code from clock emulation.\n builtins: null\n };\n this.window = window;\n this.document = window.document;\n this.isUnderTest = options.isUnderTest;\n this.utils.builtins = new UtilityScript(window, options.isUnderTest).builtins;\n this._sdkLanguage = options.sdkLanguage;\n this._testIdAttributeNameForStrictErrorAndConsoleCodegen = options.testIdAttributeName;\n this._evaluator = new SelectorEvaluatorImpl();\n this.consoleApi = new ConsoleAPI(this);\n this.onGlobalListenersRemoved = /* @__PURE__ */ new Set();\n this._autoClosingTags = /* @__PURE__ */ new Set(["AREA", "BASE", "BR", "COL", "COMMAND", "EMBED", "HR", "IMG", "INPUT", "KEYGEN", "LINK", "MENUITEM", "META", "PARAM", "SOURCE", "TRACK", "WBR"]);\n this._booleanAttributes = /* @__PURE__ */ new Set(["checked", "selected", "disabled", "readonly", "multiple"]);\n this._eventTypes = /* @__PURE__ */ new Map([\n ["auxclick", "mouse"],\n ["click", "mouse"],\n ["dblclick", "mouse"],\n ["mousedown", "mouse"],\n ["mouseeenter", "mouse"],\n ["mouseleave", "mouse"],\n ["mousemove", "mouse"],\n ["mouseout", "mouse"],\n ["mouseover", "mouse"],\n ["mouseup", "mouse"],\n ["mouseleave", "mouse"],\n ["mousewheel", "mouse"],\n ["keydown", "keyboard"],\n ["keyup", "keyboard"],\n ["keypress", "keyboard"],\n ["textInput", "keyboard"],\n ["touchstart", "touch"],\n ["touchmove", "touch"],\n ["touchend", "touch"],\n ["touchcancel", "touch"],\n ["pointerover", "pointer"],\n ["pointerout", "pointer"],\n ["pointerenter", "pointer"],\n ["pointerleave", "pointer"],\n ["pointerdown", "pointer"],\n ["pointerup", "pointer"],\n ["pointermove", "pointer"],\n ["pointercancel", "pointer"],\n ["gotpointercapture", "pointer"],\n ["lostpointercapture", "pointer"],\n ["focus", "focus"],\n ["blur", "focus"],\n ["drag", "drag"],\n ["dragstart", "drag"],\n ["dragend", "drag"],\n ["dragover", "drag"],\n ["dragenter", "drag"],\n ["dragleave", "drag"],\n ["dragexit", "drag"],\n ["drop", "drag"],\n ["wheel", "wheel"],\n ["deviceorientation", "deviceorientation"],\n ["deviceorientationabsolute", "deviceorientation"],\n ["devicemotion", "devicemotion"]\n ]);\n this._hoverHitTargetInterceptorEvents = /* @__PURE__ */ new Set(["mousemove"]);\n this._tapHitTargetInterceptorEvents = /* @__PURE__ */ new Set(["pointerdown", "pointerup", "touchstart", "touchend", "touchcancel"]);\n this._mouseHitTargetInterceptorEvents = /* @__PURE__ */ new Set(["mousedown", "mouseup", "pointerdown", "pointerup", "click", "auxclick", "dblclick", "contextmenu"]);\n this._allHitTargetInterceptorEvents = /* @__PURE__ */ new Set([...this._hoverHitTargetInterceptorEvents, ...this._tapHitTargetInterceptorEvents, ...this._mouseHitTargetInterceptorEvents]);\n this._engines = /* @__PURE__ */ new Map();\n this._engines.set("xpath", XPathEngine);\n this._engines.set("xpath:light", XPathEngine);\n this._engines.set("role", createRoleEngine(false));\n this._engines.set("text", this._createTextEngine(true, false));\n this._engines.set("text:light", this._createTextEngine(false, false));\n this._engines.set("id", this._createAttributeEngine("id", true));\n this._engines.set("id:light", this._createAttributeEngine("id", false));\n this._engines.set("data-testid", this._createAttributeEngine("data-testid", true));\n this._engines.set("data-testid:light", this._createAttributeEngine("data-testid", false));\n this._engines.set("data-test-id", this._createAttributeEngine("data-test-id", true));\n this._engines.set("data-test-id:light", this._createAttributeEngine("data-test-id", false));\n this._engines.set("data-test", this._createAttributeEngine("data-test", true));\n this._engines.set("data-test:light", this._createAttributeEngine("data-test", false));\n this._engines.set("css", this._createCSSEngine());\n this._engines.set("nth", { queryAll: () => [] });\n this._engines.set("visible", this._createVisibleEngine());\n this._engines.set("internal:control", this._createControlEngine());\n this._engines.set("internal:has", this._createHasEngine());\n this._engines.set("internal:has-not", this._createHasNotEngine());\n this._engines.set("internal:and", { queryAll: () => [] });\n this._engines.set("internal:or", { queryAll: () => [] });\n this._engines.set("internal:chain", this._createInternalChainEngine());\n this._engines.set("internal:label", this._createInternalLabelEngine());\n this._engines.set("internal:text", this._createTextEngine(true, true));\n this._engines.set("internal:has-text", this._createInternalHasTextEngine());\n this._engines.set("internal:has-not-text", this._createInternalHasNotTextEngine());\n this._engines.set("internal:attr", this._createNamedAttributeEngine());\n this._engines.set("internal:testid", this._createTestIdEngine());\n this._engines.set("internal:role", createRoleEngine(true));\n this._engines.set("internal:describe", this._createDescribeEngine());\n this._engines.set("aria-ref", this._createAriaRefEngine());\n for (const { name, source } of options.customEngines)\n this._engines.set(name, this.eval(source));\n this._stableRafCount = options.stableRafCount;\n this._browserName = options.browserName;\n this._shouldPrependErrorPrefix = !!options.shouldPrependErrorPrefix;\n this._isUtilityWorld = !!options.isUtilityWorld;\n setGlobalOptions({ browserNameForWorkarounds: options.browserName });\n this._setupGlobalListenersRemovalDetection();\n this._setupHitTargetInterceptors();\n if (this.isUnderTest)\n this.window.__injectedScript = this;\n }\n eval(expression) {\n return this.window.eval(expression);\n }\n testIdAttributeNameForStrictErrorAndConsoleCodegen() {\n return this._testIdAttributeNameForStrictErrorAndConsoleCodegen;\n }\n parseSelector(selector) {\n const result = parseSelector(selector);\n visitAllSelectorParts(result, (part) => {\n if (!this._engines.has(part.name))\n throw this.createStacklessError(`Unknown engine "${part.name}" while parsing selector ${selector}`);\n });\n return result;\n }\n generateSelector(targetElement, options) {\n return generateSelector(this, targetElement, options);\n }\n generateSelectorSimple(targetElement, options) {\n return generateSelector(this, targetElement, { ...options, testIdAttributeName: this._testIdAttributeNameForStrictErrorAndConsoleCodegen }).selector;\n }\n querySelector(selector, root, strict) {\n const result = this.querySelectorAll(selector, root);\n if (strict && result.length > 1)\n throw this.strictModeViolationError(selector, result);\n this.checkDeprecatedSelectorUsage(selector, result);\n return result[0];\n }\n _queryNth(elements, part) {\n const list = [...elements];\n let nth = +part.body;\n if (nth === -1)\n nth = list.length - 1;\n return new Set(list.slice(nth, nth + 1));\n }\n _queryLayoutSelector(elements, part, originalRoot) {\n const name = part.name;\n const body = part.body;\n const result = [];\n const inner = this.querySelectorAll(body.parsed, originalRoot);\n for (const element of elements) {\n const score = layoutSelectorScore(name, element, inner, body.distance);\n if (score !== void 0)\n result.push({ element, score });\n }\n result.sort((a, b) => a.score - b.score);\n return new Set(result.map((r) => r.element));\n }\n ariaSnapshot(node, options) {\n return this.incrementalAriaSnapshot(node, options).full;\n }\n incrementalAriaSnapshot(node, options) {\n if (node.nodeType !== Node.ELEMENT_NODE)\n throw this.createStacklessError("Can only capture aria snapshot of Element nodes.");\n const ariaSnapshot = generateAriaTree(node, options);\n const rendered = renderAriaTree(ariaSnapshot, options);\n let incremental;\n if (options.track) {\n const previousSnapshot = this._lastAriaSnapshotForTrack.get(options.track);\n if (previousSnapshot)\n incremental = renderAriaTree(ariaSnapshot, options, previousSnapshot).text;\n this._lastAriaSnapshotForTrack.set(options.track, ariaSnapshot);\n }\n this._lastAriaSnapshotForQuery = ariaSnapshot;\n return { full: rendered.text, incremental, iframeRefs: ariaSnapshot.iframeRefs, iframeDepths: rendered.iframeDepths };\n }\n ariaSnapshotForRecorder() {\n const tree = generateAriaTree(this.document.body, { mode: "ai" });\n const { text: ariaSnapshot } = renderAriaTree(tree, { mode: "ai" });\n return { ariaSnapshot, refs: tree.refs };\n }\n getAllElementsMatchingExpectAriaTemplate(document, template) {\n return getAllElementsMatchingExpectAriaTemplate(document.documentElement, template);\n }\n querySelectorAll(selector, root) {\n if (selector.capture !== void 0) {\n if (selector.parts.some((part) => part.name === "nth"))\n throw this.createStacklessError(`Can\'t query n-th element in a request with the capture.`);\n const withHas = { parts: selector.parts.slice(0, selector.capture + 1) };\n if (selector.capture < selector.parts.length - 1) {\n const parsed = { parts: selector.parts.slice(selector.capture + 1) };\n const has = { name: "internal:has", body: { parsed }, source: stringifySelector(parsed) };\n withHas.parts.push(has);\n }\n return this.querySelectorAll(withHas, root);\n }\n if (!root["querySelectorAll"])\n throw this.createStacklessError("Node is not queryable.");\n if (selector.capture !== void 0) {\n throw this.createStacklessError("Internal error: there should not be a capture in the selector.");\n }\n if (root.nodeType === 11 && selector.parts.length === 1 && selector.parts[0].name === "css" && selector.parts[0].source === ":scope")\n return [root];\n this._evaluator.begin();\n try {\n let roots = /* @__PURE__ */ new Set([root]);\n for (const part of selector.parts) {\n if (part.name === "nth") {\n roots = this._queryNth(roots, part);\n } else if (part.name === "internal:and") {\n const andElements = this.querySelectorAll(part.body.parsed, root);\n roots = new Set(andElements.filter((e) => roots.has(e)));\n } else if (part.name === "internal:or") {\n const orElements = this.querySelectorAll(part.body.parsed, root);\n roots = new Set(sortInDOMOrder(/* @__PURE__ */ new Set([...roots, ...orElements])));\n } else if (kLayoutSelectorNames.includes(part.name)) {\n roots = this._queryLayoutSelector(roots, part, root);\n } else {\n const next = /* @__PURE__ */ new Set();\n for (const root2 of roots) {\n const all = this._queryEngineAll(part, root2);\n for (const one of all)\n next.add(one);\n }\n roots = next;\n }\n }\n return [...roots];\n } finally {\n this._evaluator.end();\n }\n }\n _queryEngineAll(part, root) {\n const result = this._engines.get(part.name).queryAll(root, part.body);\n for (const element of result) {\n if (!("nodeName" in element))\n throw this.createStacklessError(`Expected a Node but got ${Object.prototype.toString.call(element)}`);\n }\n return result;\n }\n _createAttributeEngine(attribute, shadow) {\n const toCSS = (selector) => {\n const css = `[${attribute}=${JSON.stringify(selector)}]`;\n return [{ simples: [{ selector: { css, functions: [] }, combinator: "" }] }];\n };\n return {\n queryAll: (root, selector) => {\n return this._evaluator.query({ scope: root, pierceShadow: shadow }, toCSS(selector));\n }\n };\n }\n _createCSSEngine() {\n return {\n queryAll: (root, body) => {\n return this._evaluator.query({ scope: root, pierceShadow: true }, body);\n }\n };\n }\n _createTextEngine(shadow, internal) {\n const queryAll = (root, selector) => {\n const { matcher, kind } = createTextMatcher(selector, internal);\n const result = [];\n let lastDidNotMatchSelf = null;\n const appendElement = (element) => {\n if (kind === "lax" && lastDidNotMatchSelf && lastDidNotMatchSelf.contains(element))\n return false;\n const matches = elementMatchesText(this._evaluator._cacheText, element, matcher);\n if (matches === "none")\n lastDidNotMatchSelf = element;\n if (matches === "self" || matches === "selfAndChildren" && kind === "strict" && !internal)\n result.push(element);\n };\n if (root.nodeType === Node.ELEMENT_NODE)\n appendElement(root);\n const elements = this._evaluator._queryCSS({ scope: root, pierceShadow: shadow }, "*");\n for (const element of elements)\n appendElement(element);\n return result;\n };\n return { queryAll };\n }\n _createInternalHasTextEngine() {\n return {\n queryAll: (root, selector) => {\n if (root.nodeType !== 1)\n return [];\n const element = root;\n const text = elementText(this._evaluator._cacheText, element);\n const { matcher } = createTextMatcher(selector, true);\n return matcher(text) ? [element] : [];\n }\n };\n }\n _createInternalHasNotTextEngine() {\n return {\n queryAll: (root, selector) => {\n if (root.nodeType !== 1)\n return [];\n const element = root;\n const text = elementText(this._evaluator._cacheText, element);\n const { matcher } = createTextMatcher(selector, true);\n return matcher(text) ? [] : [element];\n }\n };\n }\n _createInternalLabelEngine() {\n return {\n queryAll: (root, selector) => {\n const { matcher } = createTextMatcher(selector, true);\n const allElements = this._evaluator._queryCSS({ scope: root, pierceShadow: true }, "*");\n return allElements.filter((element) => {\n return getElementLabels(this._evaluator._cacheText, element).some((label) => matcher(label));\n });\n }\n };\n }\n _createNamedAttributeEngine() {\n const queryAll = (root, selector) => {\n const parsed = parseAttributeSelector(selector, true);\n if (parsed.name || parsed.attributes.length !== 1)\n throw new Error("Malformed attribute selector: " + selector);\n const { name } = parsed.attributes[0];\n const matcher = createAttributeMatcher(parsed.attributes[0]);\n const elements = this._evaluator._queryCSS({ scope: root, pierceShadow: true }, `[${name}]`);\n return elements.filter((e) => matcher(e.getAttribute(name)));\n };\n return { queryAll };\n }\n _createTestIdEngine() {\n const queryAll = (root, selector) => {\n const parsed = parseAttributeSelector(selector, true);\n if (parsed.name || parsed.attributes.length !== 1)\n throw new Error("Malformed test id selector: " + selector);\n const names = splitTestIdAttributeNames(parsed.attributes[0].name);\n const matcher = createAttributeMatcher(parsed.attributes[0]);\n const cssQuery = names.map((n) => `[${n}]`).join(",");\n const elements = this._evaluator._queryCSS({ scope: root, pierceShadow: true }, cssQuery);\n return elements.filter((e) => names.some((n) => {\n const actual = e.getAttribute(n);\n return actual !== null && matcher(actual);\n }));\n };\n return { queryAll };\n }\n _createDescribeEngine() {\n const queryAll = (root) => {\n if (root.nodeType !== 1)\n return [];\n return [root];\n };\n return { queryAll };\n }\n _createControlEngine() {\n return {\n queryAll(root, body) {\n if (body === "enter-frame")\n return [];\n if (body === "return-empty")\n return [];\n if (body === "component") {\n if (root.nodeType !== 1)\n return [];\n return [root.childElementCount === 1 ? root.firstElementChild : root];\n }\n throw new Error(`Internal error, unknown internal:control selector ${body}`);\n }\n };\n }\n _createHasEngine() {\n const queryAll = (root, body) => {\n if (root.nodeType !== 1)\n return [];\n const has = !!this.querySelector(body.parsed, root, false);\n return has ? [root] : [];\n };\n return { queryAll };\n }\n _createHasNotEngine() {\n const queryAll = (root, body) => {\n if (root.nodeType !== 1)\n return [];\n const has = !!this.querySelector(body.parsed, root, false);\n return has ? [] : [root];\n };\n return { queryAll };\n }\n _createVisibleEngine() {\n const queryAll = (root, body) => {\n if (root.nodeType !== 1)\n return [];\n const visible = body === "true";\n return isElementVisible(root) === visible ? [root] : [];\n };\n return { queryAll };\n }\n _createInternalChainEngine() {\n const queryAll = (root, body) => {\n return this.querySelectorAll(body.parsed, root);\n };\n return { queryAll };\n }\n extend(source, params) {\n const constrFunction = this.window.eval(`\n (() => {\n const module = {};\n ${source}\n return module.exports.default();\n })()`);\n return new constrFunction(this, params);\n }\n async viewportRatio(element) {\n return await new Promise((resolve) => {\n const observer = new IntersectionObserver((entries) => {\n resolve(entries[0].intersectionRatio);\n observer.disconnect();\n });\n observer.observe(element);\n this.utils.builtins.requestAnimationFrame(() => {\n });\n });\n }\n getElementBorderWidth(node) {\n if (node.nodeType !== Node.ELEMENT_NODE || !node.ownerDocument || !node.ownerDocument.defaultView)\n return { left: 0, top: 0 };\n const style = node.ownerDocument.defaultView.getComputedStyle(node);\n return { left: parseInt(style.borderLeftWidth || "", 10), top: parseInt(style.borderTopWidth || "", 10) };\n }\n describeIFrameStyle(iframe) {\n if (!iframe.ownerDocument || !iframe.ownerDocument.defaultView)\n return "error:notconnected";\n const defaultView = iframe.ownerDocument.defaultView;\n for (let e = iframe; e; e = parentElementOrShadowHost(e)) {\n if (defaultView.getComputedStyle(e).transform !== "none")\n return "transformed";\n }\n const iframeStyle = defaultView.getComputedStyle(iframe);\n return {\n left: parseInt(iframeStyle.borderLeftWidth || "", 10) + parseInt(iframeStyle.paddingLeft || "", 10),\n top: parseInt(iframeStyle.borderTopWidth || "", 10) + parseInt(iframeStyle.paddingTop || "", 10)\n };\n }\n retarget(node, behavior) {\n let element = node.nodeType === Node.ELEMENT_NODE ? node : node.parentElement;\n if (!element)\n return null;\n if (behavior === "none")\n return element;\n if (!element.matches("input, textarea, select") && !element.isContentEditable) {\n if (behavior === "button-link")\n element = element.closest("button, [role=button], a, [role=link]") || element;\n else\n element = element.closest("button, [role=button], [role=checkbox], [role=radio]") || element;\n }\n if (behavior === "follow-label") {\n if (!element.matches("a, input, textarea, button, select, [role=link], [role=button], [role=checkbox], [role=radio]") && !element.isContentEditable) {\n const enclosingLabel = element.closest("label");\n if (enclosingLabel && enclosingLabel.control)\n element = enclosingLabel.control;\n }\n }\n return element;\n }\n async checkElementStates(node, states) {\n if (states.includes("stable")) {\n const stableResult = await this._checkElementIsStable(node);\n if (stableResult === false)\n return { missingState: "stable" };\n if (stableResult === "error:notconnected")\n return "error:notconnected";\n }\n for (const state of states) {\n if (state !== "stable") {\n const result = this.elementState(node, state);\n if (result.received === "error:notconnected")\n return "error:notconnected";\n if (!result.matches)\n return { missingState: state };\n }\n }\n }\n async _checkElementIsStable(node) {\n const continuePolling = Symbol("continuePolling");\n let lastRect;\n let stableRafCounter = 0;\n let lastTime = 0;\n const check = () => {\n const element = this.retarget(node, "no-follow-label");\n if (!element)\n return "error:notconnected";\n const time = this.utils.builtins.performance.now();\n if (this._stableRafCount > 1 && time - lastTime < 15)\n return continuePolling;\n lastTime = time;\n const clientRect = element.getBoundingClientRect();\n const rect = { x: clientRect.top, y: clientRect.left, width: clientRect.width, height: clientRect.height };\n if (lastRect) {\n const samePosition = rect.x === lastRect.x && rect.y === lastRect.y && rect.width === lastRect.width && rect.height === lastRect.height;\n if (!samePosition)\n return false;\n if (++stableRafCounter >= this._stableRafCount)\n return true;\n }\n lastRect = rect;\n return continuePolling;\n };\n let fulfill;\n let reject;\n const result = new Promise((f, r) => {\n fulfill = f;\n reject = r;\n });\n const raf = () => {\n try {\n const success = check();\n if (success !== continuePolling)\n fulfill(success);\n else\n this.utils.builtins.requestAnimationFrame(raf);\n } catch (e) {\n reject(e);\n }\n };\n this.utils.builtins.requestAnimationFrame(raf);\n return result;\n }\n _createAriaRefEngine() {\n const queryAll = (root, selector) => {\n var _a, _b;\n const result = (_b = (_a = this._lastAriaSnapshotForQuery) == null ? void 0 : _a.elements) == null ? void 0 : _b.get(selector);\n return result && result.isConnected ? [result] : [];\n };\n return { queryAll };\n }\n elementState(node, state) {\n const element = this.retarget(node, ["visible", "hidden"].includes(state) ? "none" : "follow-label");\n if (!element || !element.isConnected) {\n if (state === "hidden")\n return { matches: true, received: "hidden" };\n return { matches: false, received: "error:notconnected" };\n }\n if (state === "visible" || state === "hidden") {\n const visible = isElementVisible(element);\n return {\n matches: state === "visible" ? visible : !visible,\n received: visible ? "visible" : "hidden"\n };\n }\n if (state === "disabled" || state === "enabled") {\n const disabled = getAriaDisabled(element);\n return {\n matches: state === "disabled" ? disabled : !disabled,\n received: disabled ? "disabled" : "enabled"\n };\n }\n if (state === "editable") {\n const disabled = getAriaDisabled(element);\n const readonly = getReadonly(element);\n if (readonly === "error")\n throw this.createStacklessError("Element is not an
      ${escapeHTML(options.description)}
      ` : ""; + const styleSheet = ` + @keyframes pw-chapter-fade-in { + from { opacity: 0; } + to { opacity: 1; } + } + @keyframes pw-chapter-fade-out { + from { opacity: 1; } + to { opacity: 0; } + } + #background { + position: absolute; + inset: 0; + display: flex; + align-items: center; + justify-content: center; + backdrop-filter: blur(2px); + animation: pw-chapter-fade-in ${fadeDuration}ms ease-out forwards; + } + #background.fade-out { + animation: pw-chapter-fade-out ${fadeDuration}ms ease-in forwards; + } + #content { + background: rgba(0, 0, 0, 0.7); + border: 1px solid rgba(255, 255, 255, 0.15); + border-radius: 16px; + padding: 40px 56px; + max-width: 560px; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4); + } + #title { + color: white; + font-family: system-ui, -apple-system, sans-serif; + font-size: 28px; + font-weight: 600; + line-height: 1.3; + text-align: center; + letter-spacing: -0.01em; + } + #description { + color: rgba(255, 255, 255, 0.7); + font-family: system-ui, -apple-system, sans-serif; + font-size: 15px; + line-height: 1.5; + margin-top: 12px; + text-align: center; + } + `; + const duration = options.duration ?? 2e3; + const html = `
      ${escapeHTML(options.title)}
      ${descriptionHtml}
      `; + const id = await this.show(html); + await new Promise((f) => setTimeout(f, duration)); + const utility = await this._page.mainFrame().utilityContext(); + await utility.evaluate(({ injected, id: id2, fadeDuration: fadeDuration2 }) => { + const overlay = injected.getUserOverlay(id2); + const bg = overlay?.querySelector("#background"); + if (bg) + bg.classList.add("fade-out"); + return new Promise((f) => injected.utils.builtins.setTimeout(f, fadeDuration2)); + }, { injected: await utility.injectedScript(), id, fadeDuration }).catch((e) => debugLogger.log("error", e)); + await this.remove(id); + } + async setVisible(visible) { + if (!this._overlays.size) + return; + const utility = await this._page.mainFrame().utilityContext(); + await utility.evaluate(({ injected, visible: visible2 }) => { + injected.setUserOverlaysVisible(visible2); + }, { injected: await utility.injectedScript(), visible }).catch((e) => debugLogger.log("error", e)); + } + }; + } +}); + +// packages/playwright-core/src/server/screencast.ts +var Screencast; +var init_screencast = __esm({ + "packages/playwright-core/src/server/screencast.ts"() { + "use strict"; + init_manualPromise(); + init_protocolFormatter(); + init_debugLogger(); + init_progress(); + init_dom(); + Screencast = class { + constructor(page) { + this._clients = /* @__PURE__ */ new Map(); + this.page = page; + this.page.instrumentation.addListener(this, this.page.browserContext); + } + async handlePageOrContextClose() { + const clients = [...this._clients.keys()]; + this._clients.clear(); + for (const client of clients) { + if (client.gracefulClose) + await client.gracefulClose(); + } + } + dispose() { + for (const client of this._clients.keys()) + client.dispose(); + this._clients.clear(); + this.page.instrumentation.removeListener(this); + } + showActions(options) { + this._actions = options; + } + hideActions() { + this._actions = void 0; + } + addClient(client) { + const isFirst = this._clients.size === 0; + this._clients.set(client, new ManualPromise()); + if (isFirst) { + this._startScreencast(client.size, client.quality); + } else if (this._lastFrame) { + const frame = this._lastFrame; + setTimeout(() => { + if (this._clients.has(client)) + void client.onFrame(frame); + }, 0); + } + return { size: this._size }; + } + removeClient(client) { + const disconnected = this._clients.get(client); + if (!disconnected) + return; + this._clients.delete(client); + disconnected.resolve(); + if (!this._clients.size) + this._stopScreencast(); + } + _startScreencast(size, quality) { + this._size = size; + if (!this._size) { + const viewport = this.page.browserContext._options.viewport || { width: 800, height: 600 }; + const scale = Math.min(1, 800 / Math.max(viewport.width, viewport.height)); + this._size = { + width: Math.floor(viewport.width * scale), + height: Math.floor(viewport.height * scale) + }; + } + this._size = { + width: this._size.width & ~1, + height: this._size.height & ~1 + }; + this.page.delegate.startScreencast({ + width: this._size.width, + height: this._size.height, + quality: quality ?? 90 + }); + } + _stopScreencast() { + this._lastFrame = void 0; + this.page.delegate.stopScreencast(); + } + onScreencastFrame(frame, ack) { + this._lastFrame = frame; + const asyncResults = []; + for (const [client, disconnected] of this._clients) { + const result2 = client.onFrame(frame); + if (!result2) + continue; + asyncResults.push(Promise.race([result2.catch(() => { + }), disconnected])); + } + if (ack) { + if (!asyncResults.length) + ack(); + else + Promise.race(asyncResults).then(ack); + } + } + async onBeforeInputAction(sdkObject, metadata, point, box) { + if (!this._actions) + return; + const page = sdkObject.attribution.page; + if (page !== this.page) + return; + if (!box && sdkObject instanceof ElementHandle) + box = await sdkObject.boundingBox(nullProgress) || void 0; + const actionTitle2 = renderTitleForCall(metadata); + const utility = await page.mainFrame().utilityContext(); + await utility.evaluate(async (options) => { + const { injected, duration } = options; + injected.setScreencastAnnotation(options); + await new Promise((f) => injected.utils.builtins.setTimeout(f, duration)); + injected.setScreencastAnnotation(null); + }, { + injected: await utility.injectedScript(), + duration: this._actions?.duration ?? 500, + point, + box, + actionTitle: actionTitle2, + position: this._actions?.position, + fontSize: this._actions?.fontSize, + cursor: this._actions?.cursor ?? "pointer" + }).catch((e) => debugLogger.log("error", e)); + } + }; + } +}); + +// packages/playwright-core/src/server/page.ts +async function ariaSnapshotForFrame(progress2, frame, options = {}) { + const snapshot3 = await frame.retryWithProgressAndTimeouts(progress2, [1e3, 2e3, 4e3, 8e3], async (progress3, continuePolling) => { + try { + const context2 = await progress3.race(frame.utilityContext()); + const injectedScript = await progress3.race(context2.injectedScript()); + const snapshotOrRetry = await progress3.race(injectedScript.evaluate((injected, options2) => { + if (options2.info) { + const element2 = injected.querySelector(options2.info.parsed, injected.document, options2.info.strict); + if (!element2) + return false; + return injected.incrementalAriaSnapshot(element2, options2); + } + const node = injected.document.body; + if (!node) + return true; + return injected.incrementalAriaSnapshot(node, options2); + }, { + mode: options.mode ?? "default", + refPrefix: frame.seq ? "f" + frame.seq : "", + track: options.track, + doNotRenderActive: options.doNotRenderActive, + info: options.info, + depth: options.depth, + boxes: options.boxes + })); + if (snapshotOrRetry === true) + return continuePolling; + if (snapshotOrRetry === false) + throw new NonRecoverableDOMError(`Selector "${stringifySelector(options.info.parsed)}" does not match any element`); + return snapshotOrRetry; + } catch (e) { + if (frame.isNonRetriableError(e)) + throw e; + return continuePolling; + } + }); + const renderedIframeRefs = snapshot3.iframeRefs.filter((ref) => ref in snapshot3.iframeDepths); + progress2.setAllowConcurrentOrNestedRaces(true); + const childSnapshotPromises = renderedIframeRefs.map((ref) => { + const iframeDepth = snapshot3.iframeDepths[ref]; + const childDepth = options.depth ? options.depth - iframeDepth - 1 : void 0; + return ariaSnapshotFrameRef(progress2, frame, ref, { ...options, depth: childDepth }); + }); + const childSnapshots = await Promise.all(childSnapshotPromises); + progress2.setAllowConcurrentOrNestedRaces(false); + const full = []; + let incremental; + if (snapshot3.incremental !== void 0) { + incremental = snapshot3.incremental.split("\n"); + for (let i = 0; i < renderedIframeRefs.length; i++) { + const childSnapshot = childSnapshots[i]; + if (childSnapshot.incremental) + incremental.push(...childSnapshot.incremental); + else if (childSnapshot.full.length) + incremental.push("- iframe [ref=" + renderedIframeRefs[i] + "]:", ...childSnapshot.full.map((l) => " " + l)); + } + } + for (const line of snapshot3.full.split("\n")) { + const match = line.match(/^(\s*)- iframe (?:\[active\] )?\[ref=([^\]]*)\]/); + if (!match) { + full.push(line); + continue; + } + const leadingSpace = match[1]; + const ref = match[2]; + const childSnapshot = childSnapshots[renderedIframeRefs.indexOf(ref)] ?? { full: [] }; + full.push(childSnapshot.full.length ? line + ":" : line); + full.push(...childSnapshot.full.map((l) => leadingSpace + " " + l)); + } + return { full, incremental }; +} +async function ariaSnapshotFrameRef(progress2, parentFrame, frameRef, options) { + const frameSelector = `aria-ref=${frameRef} >> internal:control=enter-frame`; + const frameBodySelector = `${frameSelector} >> body`; + const child = await progress2.race(parentFrame.selectors.resolveFrameForSelector(frameBodySelector, { strict: true })); + if (!child) + return { full: [] }; + try { + return await ariaSnapshotForFrame(progress2, child.frame, { ...options, info: void 0 }); + } catch { + return { full: [] }; + } +} +function ensureArrayLimit(array, limit) { + if (array.length > limit) + return array.splice(0, limit / 10); + return []; +} +var PageEvent, navigationMarkSymbol, Page, WorkerEvent, Worker, PageBinding, InitScript; +var init_page = __esm({ + "packages/playwright-core/src/server/page.ts"() { + "use strict"; + init_selectorParser(); + init_manualPromise(); + init_utilityScriptSerializers(); + init_comparators(); + init_debugLogger(); + init_manualPromise(); + init_assert(); + init_stringUtils(); + init_locatorGenerators(); + init_browserContext(); + init_disposable2(); + init_console(); + init_errors(); + init_fileChooser(); + init_frames(); + init_helper(); + init_input(); + init_instrumentation(); + init_javascript(); + init_screenshotter(); + init_callLog(); + init_bindingsControllerSource(); + init_overlay(); + init_dom(); + init_screencast(); + init_javascript(); + PageEvent = { + Close: "close", + Crash: "crash", + Download: "download", + EmulatedSizeChanged: "emulatedsizechanged", + FileChooser: "filechooser", + FrameAttached: "frameattached", + FrameDetached: "framedetached", + InternalFrameNavigatedToNewDocument: "internalframenavigatedtonewdocument", + LocatorHandlerTriggered: "locatorhandlertriggered", + WebSocket: "websocket", + Worker: "worker" + }; + navigationMarkSymbol = Symbol("navigationMark"); + Page = class _Page extends SdkObject { + constructor(delegate, browserContext) { + super(browserContext, "page"); + this._closedState = "open"; + this.closedPromise = new ManualPromise(); + this._initializedPromise = new ManualPromise(); + this._consoleMessages = []; + this._pageErrors = []; + this._crashed = false; + this.openScope = new LongStandingScope(); + this._emulatedMedia = {}; + this._fileChooserInterceptedBy = /* @__PURE__ */ new Set(); + this._pageBindings = /* @__PURE__ */ new Map(); + this.initScripts = []; + this._workers = /* @__PURE__ */ new Map(); + this.requestInterceptors = []; + this._locatorHandlers = /* @__PURE__ */ new Map(); + this._lastLocatorHandlerUid = 0; + this._locatorHandlerRunningCounter = 0; + this._networkRequests = []; + this.attribution.page = this; + this.delegate = delegate; + this.browserContext = browserContext; + this.keyboard = new Keyboard(delegate.rawKeyboard, this); + this.mouse = new Mouse(delegate.rawMouse, this); + this.touchscreen = new Touchscreen(delegate.rawTouchscreen, this); + this.screenshotter = new Screenshotter(this); + this.frameManager = new FrameManager(this); + this.overlay = new Overlay(this); + this.screencast = new Screencast(this); + if (delegate.pdf) + this.pdf = delegate.pdf.bind(delegate); + this.coverage = delegate.coverage ? delegate.coverage() : null; + this.isStorageStatePage = browserContext.isCreatingStorageStatePage(); + } + static { + this.Events = PageEvent; + } + async reportAsNew(opener, error) { + if (this.delegate.noUtilityWorld?.()) { + await this._addInitScript(saveGlobalsSnapshotSource); + await this.safeNonStallingEvaluateInAllFrames(saveGlobalsSnapshotSource, "main"); + } + if (opener) { + const openerPageOrError = await opener.waitForInitializedOrError(); + if (openerPageOrError instanceof _Page && !openerPageOrError.isClosed()) + this._opener = openerPageOrError; + } + this._markInitialized(error); + } + _markInitialized(error = void 0) { + if (error) { + if (this.browserContext.isClosingOrClosed()) + return; + this.frameManager.createDummyMainFrameIfNeeded(); + } + this._initialized = error || this; + this.emitOnContext(BrowserContext.Events.Page, this); + for (const pageError of this._pageErrors) + this.emitOnContext(BrowserContext.Events.PageError, pageError, this); + for (const message of this._consoleMessages) + this.emitOnContext(BrowserContext.Events.Console, message); + if (this.isClosed()) + this.emit(_Page.Events.Close); + else + this.instrumentation.onPageOpen(this); + this._initializedPromise.resolve(this._initialized); + } + initializedOrUndefined() { + return this._initialized ? this : void 0; + } + waitForInitializedOrError() { + return this._initializedPromise; + } + emitOnContext(event, ...args) { + if (this.isStorageStatePage) + return; + this.browserContext.emit(event, ...args); + } + async resetForReuse(progress2) { + await this.mainFrame().gotoImpl(progress2, "about:blank", {}); + this._emulatedSize = void 0; + this._emulatedMedia = {}; + this._extraHTTPHeaders = void 0; + await progress2.race(Promise.all([ + this.delegate.updateEmulatedViewportSize(), + this.delegate.updateEmulateMedia(), + this.delegate.updateExtraHTTPHeaders() + ])); + await this.delegate.resetForReuse(progress2); + } + _didClose() { + this.frameManager.dispose(); + this.screencast.dispose(); + this.overlay.dispose(); + assert(this._closedState !== "closed", "Page closed twice"); + this._closedState = "closed"; + this.emit(_Page.Events.Close); + this.browserContext.emit(BrowserContext.Events.PageClosed, this); + this.closedPromise.resolve(); + this.instrumentation.onPageClose(this); + this.openScope.close(new TargetClosedError(this.closeReason())); + } + _didCrash() { + this.frameManager.dispose(); + this.screencast.dispose(); + this.overlay.dispose(); + this.emit(_Page.Events.Crash); + this._crashed = true; + this.instrumentation.onPageClose(this); + this.openScope.close(new Error("Page crashed")); + } + async _onFileChooserOpened(handle) { + let multiple; + try { + multiple = await handle.evaluate((element2) => !!element2.multiple); + } catch (e) { + return; + } + if (!this.listenerCount(_Page.Events.FileChooser)) { + handle.dispose(); + return; + } + const fileChooser = new FileChooser(handle, multiple); + this.emit(_Page.Events.FileChooser, fileChooser); + } + opener() { + return this._opener; + } + mainFrame() { + return this.frameManager.mainFrame(); + } + frames() { + return this.frameManager.frames(); + } + async exposeBinding(progress2, name, playwrightBinding) { + if (this._pageBindings.has(name)) + throw new Error(`Function "${name}" has been already registered`); + if (this.browserContext._pageBindings.has(name)) + throw new Error(`Function "${name}" has been already registered in the browser context`); + await progress2.race(this.browserContext.exposePlaywrightBindingIfNeeded()); + const binding = new PageBinding(this, name, playwrightBinding); + this._pageBindings.set(name, binding); + try { + await progress2.race(this.delegate.addInitScript(binding.initScript)); + await progress2.race(this.safeNonStallingEvaluateInAllFrames(binding.initScript.source, "main")); + return binding; + } catch (error) { + this._pageBindings.delete(name); + throw error; + } + } + async removeExposedBinding(binding) { + if (this._pageBindings.get(binding.name) !== binding) + return; + this._pageBindings.delete(binding.name); + await this.delegate.removeInitScripts([binding.initScript]); + const cleanup = `{ ${binding.cleanupScript} };`; + await this.safeNonStallingEvaluateInAllFrames(cleanup, "main"); + } + async setExtraHTTPHeaders(progress2, headers) { + const oldHeaders = this._extraHTTPHeaders; + try { + this._extraHTTPHeaders = headers; + await progress2.race(this.delegate.updateExtraHTTPHeaders()); + } catch (error) { + this._extraHTTPHeaders = oldHeaders; + this.delegate.updateExtraHTTPHeaders().catch(() => { + }); + throw error; + } + } + extraHTTPHeaders() { + return this._extraHTTPHeaders; + } + addNetworkRequest(request2) { + this._networkRequests.push(request2); + ensureArrayLimit(this._networkRequests, 100); + } + networkRequests() { + return this._networkRequests; + } + async onBindingCalled(payload, context2) { + if (this._closedState === "closed") + return; + await PageBinding.dispatch(this, payload, context2); + } + addConsoleMessage(worker, type3, args, location2, text2, timestamp) { + const message = new ConsoleMessage(this, worker, type3, text2, args, location2, timestamp); + const intercepted = this.frameManager.interceptConsoleMessage(message); + if (intercepted) { + args.forEach((arg) => arg.dispose()); + return; + } + this._consoleMessages.push(message); + ensureArrayLimit(this._consoleMessages, 200); + if (this._initialized) + this.emitOnContext(BrowserContext.Events.Console, message); + } + clearConsoleMessages() { + this._consoleMessages.length = 0; + } + consoleMessages(filter) { + if (filter === "all") + return this._consoleMessages; + const marked = this._consoleMessages.findLastIndex((m) => m[navigationMarkSymbol]); + return marked === -1 ? this._consoleMessages : this._consoleMessages.slice(marked + 1); + } + addPageError(error, location2) { + const pageError = { error, location: location2 }; + this._pageErrors.push(pageError); + ensureArrayLimit(this._pageErrors, 200); + if (this._initialized) + this.emitOnContext(BrowserContext.Events.PageError, pageError, this); + } + clearPageErrors() { + this._pageErrors.length = 0; + } + pageErrors(filter) { + if (filter === "all") + return this._pageErrors.map((e) => e.error); + const marked = this._pageErrors.findLastIndex((e) => e[navigationMarkSymbol]); + return (marked === -1 ? this._pageErrors : this._pageErrors.slice(marked + 1)).map((e) => e.error); + } + async reload(progress2, options) { + return this.mainFrame().raceNavigationAction(progress2, async () => { + const [response2] = await Promise.all([ + // Reload must be a new document, and should not be confused with a stray pushState. + this.mainFrame().waitForNavigation(progress2, true, options), + progress2.race(this.delegate.reload()) + ]); + return response2; + }); + } + async goBack(progress2, options) { + return this.mainFrame().raceNavigationAction(progress2, async () => { + let error; + const waitPromise = this.mainFrame().waitForNavigation(progress2, false, options).catch((e) => { + error = e; + return null; + }); + const result2 = await progress2.race(this.delegate.goBack()); + if (!result2) { + waitPromise.catch(() => { + }); + return null; + } + const response2 = await waitPromise; + if (error) + throw error; + return response2; + }); + } + async goForward(progress2, options) { + return this.mainFrame().raceNavigationAction(progress2, async () => { + let error; + const waitPromise = this.mainFrame().waitForNavigation(progress2, false, options).catch((e) => { + error = e; + return null; + }); + const result2 = await progress2.race(this.delegate.goForward()); + if (!result2) { + waitPromise.catch(() => { + }); + return null; + } + const response2 = await waitPromise; + if (error) + throw error; + return response2; + }); + } + requestGC(progress2) { + return progress2.race(this.delegate.requestGC()); + } + registerLocatorHandler(selector, noWaitAfter) { + const uid = ++this._lastLocatorHandlerUid; + this._locatorHandlers.set(uid, { selector, noWaitAfter }); + return uid; + } + resolveLocatorHandler(uid, remove) { + const handler = this._locatorHandlers.get(uid); + if (remove) + this._locatorHandlers.delete(uid); + if (handler) { + handler.resolved?.resolve(); + handler.resolved = void 0; + } + } + unregisterLocatorHandler(uid) { + this._locatorHandlers.delete(uid); + } + async performActionPreChecks(progress2) { + await this._performWaitForNavigationCheck(progress2); + await this._performLocatorHandlersCheckpoint(progress2); + await this._performWaitForNavigationCheck(progress2); + } + async _performWaitForNavigationCheck(progress2) { + if (process.env.PLAYWRIGHT_SKIP_NAVIGATION_CHECK) + return; + const mainFrame = this.frameManager.mainFrame(); + if (!mainFrame || !mainFrame.pendingDocument()) + return; + const url2 = mainFrame.pendingDocument()?.request?.url(); + const toUrl = url2 ? `" ${trimStringWithEllipsis(url2, 200)}"` : ""; + progress2.log(` waiting for${toUrl} navigation to finish...`); + await helper.waitForEvent(progress2, mainFrame, Frame.Events.InternalNavigation, (e) => { + if (!e.isPublic) + return false; + if (!e.error) + progress2.log(` navigated to "${trimStringWithEllipsis(mainFrame.url(), 200)}"`); + return true; + }).promise; + } + async _performLocatorHandlersCheckpoint(progress2) { + if (this._locatorHandlerRunningCounter) + return; + for (const [uid, handler] of this._locatorHandlers) { + if (!handler.resolved) { + if (await this.mainFrame().isVisibleInternal(progress2, handler.selector, { strict: true })) { + handler.resolved = new ManualPromise(); + this.emit(_Page.Events.LocatorHandlerTriggered, uid); + } + } + if (handler.resolved) { + ++this._locatorHandlerRunningCounter; + progress2.log(` found ${asLocator(this.browserContext._browser.sdkLanguage(), handler.selector)}, intercepting action to run the handler`); + const promise = handler.resolved.then(async () => { + if (!handler.noWaitAfter) { + progress2.log(` locator handler has finished, waiting for ${asLocator(this.browserContext._browser.sdkLanguage(), handler.selector)} to be hidden`); + await this.mainFrame().waitForSelector(progress2, handler.selector, false, { state: "hidden" }); + } else { + progress2.log(` locator handler has finished`); + } + }); + try { + progress2.setAllowConcurrentOrNestedRaces(true); + await progress2.race(this.openScope.race(promise)); + } finally { + progress2.setAllowConcurrentOrNestedRaces(false); + --this._locatorHandlerRunningCounter; + } + progress2.log(` interception handler has finished, continuing`); + } + } + } + async emulateMedia(progress2, options) { + const oldEmulatedMedia = { ...this._emulatedMedia }; + if (options.media !== void 0) + this._emulatedMedia.media = options.media; + if (options.colorScheme !== void 0) + this._emulatedMedia.colorScheme = options.colorScheme; + if (options.reducedMotion !== void 0) + this._emulatedMedia.reducedMotion = options.reducedMotion; + if (options.forcedColors !== void 0) + this._emulatedMedia.forcedColors = options.forcedColors; + if (options.contrast !== void 0) + this._emulatedMedia.contrast = options.contrast; + try { + await progress2.race(this.delegate.updateEmulateMedia()); + } catch (error) { + this._emulatedMedia = oldEmulatedMedia; + this.delegate.updateEmulateMedia().catch(() => { + }); + throw error; + } + } + emulatedMedia() { + const contextOptions = this.browserContext._options; + return { + media: this._emulatedMedia.media || "no-override", + colorScheme: this._emulatedMedia.colorScheme !== void 0 ? this._emulatedMedia.colorScheme : contextOptions.colorScheme ?? "light", + reducedMotion: this._emulatedMedia.reducedMotion !== void 0 ? this._emulatedMedia.reducedMotion : contextOptions.reducedMotion ?? "no-preference", + forcedColors: this._emulatedMedia.forcedColors !== void 0 ? this._emulatedMedia.forcedColors : contextOptions.forcedColors ?? "none", + contrast: this._emulatedMedia.contrast !== void 0 ? this._emulatedMedia.contrast : contextOptions.contrast ?? "no-preference" + }; + } + async setViewportSize(progress2, viewportSize) { + const oldEmulatedSize = this._emulatedSize; + try { + this._setEmulatedSize({ viewport: { ...viewportSize }, screen: { ...viewportSize } }); + await progress2.race(this.delegate.updateEmulatedViewportSize()); + } catch (error) { + this._emulatedSize = oldEmulatedSize; + this.delegate.updateEmulatedViewportSize().catch(() => { + }); + throw error; + } + } + setEmulatedSizeFromWindowOpen(emulatedSize) { + this._setEmulatedSize(emulatedSize); + } + _setEmulatedSize(emulatedSize) { + this._emulatedSize = emulatedSize; + this.emit(_Page.Events.EmulatedSizeChanged); + } + emulatedSize() { + if (this._emulatedSize) + return this._emulatedSize; + const contextOptions = this.browserContext._options; + return contextOptions.viewport ? { viewport: contextOptions.viewport, screen: contextOptions.screen || contextOptions.viewport } : void 0; + } + async bringToFront(progress2) { + await progress2.race(this.delegate.bringToFront()); + } + async addInitScript(progress2, source11) { + return await progress2.race(this._addInitScript(source11)); + } + async _addInitScript(source11) { + const initScript = new InitScript(this, source11); + this.initScripts.push(initScript); + try { + await this.delegate.addInitScript(initScript); + } catch (error) { + initScript.dispose().catch(() => { + }); + throw error; + } + return initScript; + } + async removeInitScript(initScript) { + this.initScripts = this.initScripts.filter((script) => initScript !== script); + await this.delegate.removeInitScripts([initScript]); + } + needsRequestInterception() { + return this.requestInterceptors.length > 0 || this.browserContext.requestInterceptors.length > 0; + } + async addRequestInterceptor(progress2, handler, prepend) { + if (prepend) + this.requestInterceptors.unshift(handler); + else + this.requestInterceptors.push(handler); + await progress2.race(this.delegate.updateRequestInterception()); + } + async removeRequestInterceptor(handler) { + const index = this.requestInterceptors.indexOf(handler); + if (index === -1) + return; + this.requestInterceptors.splice(index, 1); + await this.browserContext.notifyRoutesInFlightAboutRemovedHandler(handler); + await this.delegate.updateRequestInterception(); + } + async expectScreenshot(progress2, options) { + const locator2 = options.locator; + const rafrafScreenshot = locator2 ? async (progress3, timeout) => { + return await locator2.frame.rafrafTimeoutScreenshotElementWithProgress(progress3, locator2.selector, timeout, options || {}); + } : async (progress3, timeout) => { + await this.performActionPreChecks(progress3); + await this.mainFrame().rafrafTimeout(progress3, timeout); + return await this.screenshotter.screenshotPage(progress3, options || {}); + }; + const comparator = getComparator("image/png"); + let intermediateResult; + const areEqualScreenshots = (actual, expected, previous) => { + const comparatorResult = actual && expected ? comparator(actual, expected, options) : void 0; + if (comparatorResult !== void 0 && !!comparatorResult === !!options.isNot) + return true; + if (comparatorResult) + intermediateResult = { errorMessage: comparatorResult.errorMessage, diff: comparatorResult.diff, actual, previous }; + return false; + }; + try { + if (!options.expected && options.isNot) + throw new Error('"not" matcher requires expected result'); + const format2 = validateScreenshotOptions(options || {}); + if (format2 !== "png") + throw new Error("Only PNG screenshots are supported"); + let actual; + let previous; + const pollIntervals = [0, 100, 250, 500]; + if (options.expected) + progress2.log(` verifying given screenshot expectation`); + else + progress2.log(` generating new stable screenshot expectation`); + let isFirstIteration = true; + while (true) { + if (this.isClosed()) + throw new Error("The page has closed"); + const screenshotTimeout = pollIntervals.shift() ?? 1e3; + if (screenshotTimeout) + progress2.log(`waiting ${screenshotTimeout}ms before taking screenshot`); + previous = actual; + actual = await rafrafScreenshot(progress2, screenshotTimeout).catch((e) => { + if (this.mainFrame().isNonRetriableError(e)) + throw e; + progress2.log(`failed to take screenshot - ` + e.message); + return void 0; + }); + if (!actual) + continue; + const expectation = options.expected && isFirstIteration ? options.expected : previous; + if (areEqualScreenshots(actual, expectation, previous)) + break; + if (intermediateResult) + progress2.log(intermediateResult.errorMessage); + isFirstIteration = false; + } + if (!isFirstIteration) + progress2.log(`captured a stable screenshot`); + if (!options.expected) + return { actual }; + if (isFirstIteration) { + progress2.log(`screenshot matched expectation`); + return {}; + } + if (areEqualScreenshots(actual, options.expected, void 0)) { + progress2.log(`screenshot matched expectation`); + return {}; + } + throw new Error(intermediateResult.errorMessage); + } catch (e) { + if (isJavaScriptErrorInEvaluate(e) || isInvalidSelectorError(e)) + throw e; + let errorMessage = e.message; + if (e instanceof TimeoutError && intermediateResult?.previous) + errorMessage = `Failed to take two consecutive stable screenshots.`; + const details = { + log: compressCallLog(e.message ? [...progress2.metadata.log, e.message] : progress2.metadata.log), + actual: intermediateResult?.actual, + previous: intermediateResult?.previous, + diff: intermediateResult?.diff, + timedOut: e instanceof TimeoutError, + customErrorMessage: errorMessage + }; + const error = new Error("Expect failed"); + error.details = details; + throw error; + } + } + async screenshot(progress2, options) { + return await this.screenshotter.screenshotPage(progress2, options); + } + async close(progress2, options = {}) { + await progress2.race(this._close(options)); + } + async _close(options = {}) { + if (this._closedState === "closed") + return; + if (options.reason) + this._closeReason = options.reason; + await this.screencast.handlePageOrContextClose(); + if (this._closedState !== "closing") { + this._closedState = "closing"; + await this.delegate.closePage(false).catch((e) => debugLogger.log("error", e)); + } + await this.closedPromise; + } + async runBeforeUnload(progress2) { + await progress2.race(this._runBeforeUnload()); + } + async _runBeforeUnload() { + await this.delegate.closePage(true).catch((e) => debugLogger.log("error", e)); + } + isClosed() { + return this._closedState === "closed"; + } + hasCrashed() { + return this._crashed; + } + isClosedOrClosingOrCrashed() { + return this._closedState !== "open" || this._crashed; + } + addWorker(workerId, worker) { + this._workers.set(workerId, worker); + this.emit(_Page.Events.Worker, worker); + } + removeWorker(workerId) { + const worker = this._workers.get(workerId); + if (!worker) + return; + worker.didClose(); + this._workers.delete(workerId); + } + clearWorkers() { + for (const [workerId, worker] of this._workers) { + worker.didClose(); + this._workers.delete(workerId); + } + } + async setFileChooserInterceptedBy(progress2, enabled, by) { + await progress2.race(this._setFileChooserInterceptedBy(enabled, by)); + } + async _setFileChooserInterceptedBy(enabled, by) { + const wasIntercepted = this.fileChooserIntercepted(); + if (enabled) + this._fileChooserInterceptedBy.add(by); + else + this._fileChooserInterceptedBy.delete(by); + if (wasIntercepted !== this.fileChooserIntercepted()) + await this.delegate.updateFileChooserInterception(); + } + fileChooserIntercepted() { + return this._fileChooserInterceptedBy.size > 0; + } + frameNavigatedToNewDocument(frame) { + this.emit(_Page.Events.InternalFrameNavigatedToNewDocument, frame); + this.browserContext.emit(BrowserContext.Events.InternalFrameNavigatedToNewDocument, frame); + const origin = frame.origin(); + if (origin) + this.browserContext.addVisitedOrigin(origin); + if (frame === this.mainFrame()) { + if (this._consoleMessages.length > 0) + this._consoleMessages[this._consoleMessages.length - 1][navigationMarkSymbol] = true; + if (this._pageErrors.length > 0) + this._pageErrors[this._pageErrors.length - 1][navigationMarkSymbol] = true; + } + } + allInitScripts() { + const bindings = [...this.browserContext._pageBindings.values(), ...this._pageBindings.values()].map((binding) => binding.initScript); + if (this.browserContext.bindingsInitScript) + bindings.unshift(this.browserContext.bindingsInitScript); + return [...bindings, ...this.browserContext.initScripts, ...this.initScripts]; + } + getBinding(name) { + return this._pageBindings.get(name) || this.browserContext._pageBindings.get(name); + } + async safeNonStallingEvaluateInAllFrames(expression2, world, options = {}) { + await Promise.all(this.frames().map(async (frame) => { + try { + await frame.nonStallingEvaluateInExistingContext(expression2, world); + } catch (e) { + if (options.throwOnJSErrors && isJavaScriptErrorInEvaluate(e)) + throw e; + } + })); + } + async hideHighlight() { + await Promise.all(this.frames().map((frame) => frame.hideHighlight().catch(() => { + }))); + } + async setDockTile(image) { + await this.delegate.setDockTile(image); + } + async webStorageItems(progress2, kind) { + const storage = `${kind}Storage`; + return await this.mainFrame().evaluateExpression(progress2, `(() => { + const result = []; + for (let i = 0; i < ${storage}.length; i++) { + const name = ${storage}.key(i); + if (name !== null) + result.push({ name, value: ${storage}.getItem(name) ?? '' }); + } + return result; + })()`, { world: "utility" }); + } + async webStorageGetItem(progress2, kind, name) { + const value2 = await this.mainFrame().evaluateExpression(progress2, `${kind}Storage.getItem(${JSON.stringify(name)})`, { world: "utility" }); + return value2 === null ? void 0 : value2; + } + async webStorageSetItem(progress2, kind, name, value2) { + await this.mainFrame().evaluateExpression(progress2, `${kind}Storage.setItem(${JSON.stringify(name)}, ${JSON.stringify(value2)})`, { world: "utility" }); + } + async webStorageRemoveItem(progress2, kind, name) { + await this.mainFrame().evaluateExpression(progress2, `${kind}Storage.removeItem(${JSON.stringify(name)})`, { world: "utility" }); + } + async webStorageClear(progress2, kind) { + await this.mainFrame().evaluateExpression(progress2, `${kind}Storage.clear()`, { world: "utility" }); + } + }; + WorkerEvent = { + Console: "console", + Close: "close" + }; + Worker = class _Worker extends SdkObject { + constructor(parent, url2, onDisconnect) { + super(parent, "worker"); + this._executionContextPromise = new ManualPromise(); + this._workerScriptLoaded = false; + this.existingExecutionContext = null; + this.openScope = new LongStandingScope(); + this.attribution.worker = this; + this.url = url2; + this._onDisconnect = onDisconnect; + } + static { + this.Events = WorkerEvent; + } + createExecutionContext(delegate) { + this.existingExecutionContext = new ExecutionContext(this, delegate, "worker"); + if (this._workerScriptLoaded) + this._executionContextPromise.resolve(this.existingExecutionContext); + return this.existingExecutionContext; + } + destroyExecutionContext(errorMessage) { + if (this.existingExecutionContext) + this.existingExecutionContext.contextDestroyed(errorMessage); + this.existingExecutionContext = null; + this._workerScriptLoaded = false; + this._executionContextPromise = new ManualPromise(); + } + workerScriptLoaded() { + this._workerScriptLoaded = true; + if (this.existingExecutionContext) + this._executionContextPromise.resolve(this.existingExecutionContext); + } + didClose() { + if (this.existingExecutionContext) + this.existingExecutionContext.contextDestroyed("Worker was closed"); + this.emit(_Worker.Events.Close, this); + this.openScope.close(new Error("Worker closed")); + } + async evaluateExpression(progress2, expression2, isFunction2, arg) { + return progress2.race(evaluateExpression(await this._executionContextPromise, expression2, { returnByValue: true, isFunction: isFunction2 }, arg)); + } + async evaluateExpressionHandle(progress2, expression2, isFunction2, arg) { + return progress2.race(evaluateExpression(await this._executionContextPromise, expression2, { returnByValue: false, isFunction: isFunction2 }, arg)); + } + async disconnect(progress2, options = {}) { + if (!this._onDisconnect) + throw new Error("Cannot disconnect from this worker"); + this._closeReason = options.reason; + await progress2.race(this._onDisconnect()); + } + }; + PageBinding = class _PageBinding extends DisposableObject { + static { + this.kController = "__playwright__binding__controller__"; + } + static { + this.kBindingName = "__playwright__binding__"; + } + static createInitScript(browserContext) { + return new InitScript(browserContext, ` + (() => { + const module = {}; + ${source5} + const property = '${_PageBinding.kController}'; + if (!globalThis[property]) + globalThis[property] = new (module.exports.BindingsController())(globalThis, '${_PageBinding.kBindingName}'); + })(); + `); + } + constructor(parent, name, playwrightFunction) { + super(parent); + this.name = name; + this.playwrightFunction = playwrightFunction; + this.initScript = new InitScript(parent, `globalThis['${_PageBinding.kController}'].addBinding(${JSON.stringify(name)})`); + this.cleanupScript = `globalThis['${_PageBinding.kController}'].removeBinding(${JSON.stringify(name)})`; + } + static async dispatch(page, payload, context2) { + const { name, seq, serializedArgs } = JSON.parse(payload); + try { + assert(context2.world); + const binding = page.getBinding(name); + if (!binding) + throw new Error(`Function "${name}" is not exposed`); + if (!Array.isArray(serializedArgs)) + throw new Error(`serializedArgs is not an array. This can happen when Array.prototype.toJSON is defined incorrectly`); + const args = serializedArgs.map((a) => parseEvaluationResultValue(a)); + const result2 = await binding.playwrightFunction({ frame: context2.frame, page, context: page.browserContext }, ...args); + context2.evaluateExpressionHandle(`arg => globalThis['${_PageBinding.kController}'].deliverBindingResult(arg)`, { isFunction: true }, { name, seq, result: result2 }).catch((e) => debugLogger.log("error", e)); + } catch (error) { + context2.evaluateExpressionHandle(`arg => globalThis['${_PageBinding.kController}'].deliverBindingResult(arg)`, { isFunction: true }, { name, seq, error }).catch((e) => debugLogger.log("error", e)); + } + } + async dispose() { + await this.parent.removeExposedBinding(this); + } + }; + InitScript = class extends DisposableObject { + constructor(owner, source11) { + super(owner); + this.source = `(() => { + ${source11} + })();`; + } + async dispose() { + await this.parent.removeInitScript(this); + } + }; + } +}); + +// packages/playwright-core/src/server/types.ts +var kLifecycleEvents; +var init_types = __esm({ + "packages/playwright-core/src/server/types.ts"() { + "use strict"; + kLifecycleEvents = /* @__PURE__ */ new Set(["load", "domcontentloaded", "networkidle", "commit"]); + } +}); + +// packages/playwright-core/src/server/frames.ts +function verifyLifecycle(name, waitUntil) { + if (waitUntil === "networkidle0") + waitUntil = "networkidle"; + if (!kLifecycleEvents.has(waitUntil)) + throw new Error(`${name}: expected one of (load|domcontentloaded|networkidle|commit)`); + return waitUntil; +} +function renderUnexpectedValue(expression2, received) { + if (expression2 === "to.match.aria") + return received ? received.raw : received; + return received; +} +var yaml, NavigationAbortedError, ExpectError, kDummyFrameId, FrameManager, FrameEvent, Frame, SignalBarrier; +var init_frames = __esm({ + "packages/playwright-core/src/server/frames.ts"() { + "use strict"; + init_ariaSnapshot(); + init_selectorParser(); + init_manualPromise(); + init_eventsHelper(); + init_manualPromise(); + init_locatorGenerators(); + init_assert(); + init_urlMatch(); + init_task(); + init_crypto(); + init_browserContext(); + init_dom(); + init_errors(); + init_fileUploadUtils(); + init_frameSelectors(); + init_helper(); + init_instrumentation(); + init_javascript(); + init_network2(); + init_page(); + init_progress(); + init_types(); + init_protocolError(); + yaml = require("./utilsBundle").yaml; + NavigationAbortedError = class extends Error { + constructor(documentId, message) { + super(message); + this.documentId = documentId; + } + }; + ExpectError = class extends Error { + constructor(details) { + super("Expect failed"); + this.name = "ExpectError"; + this.details = details; + } + }; + kDummyFrameId = ""; + FrameManager = class { + constructor(page) { + this._frames = /* @__PURE__ */ new Map(); + this._consoleMessageTags = /* @__PURE__ */ new Map(); + this._signalBarriers = /* @__PURE__ */ new Set(); + this._webSockets = /* @__PURE__ */ new Map(); + this._nextFrameSeq = 0; + this._page = page; + this._mainFrame = void 0; + } + _allocateFrameSeq() { + return this._nextFrameSeq++; + } + createDummyMainFrameIfNeeded() { + if (!this._mainFrame) + this.frameAttached(kDummyFrameId, null); + } + dispose() { + for (const frame of this._frames.values()) { + frame._stopNetworkIdleTimer(); + frame.invalidateNonStallingEvaluations("Target crashed"); + } + } + mainFrame() { + return this._mainFrame; + } + frames() { + const frames = []; + collect(this._mainFrame); + return frames; + function collect(frame) { + frames.push(frame); + for (const subframe of frame._getChildFrames()) + collect(subframe); + } + } + frame(frameId) { + return this._frames.get(frameId) || null; + } + frameAttached(frameId, parentFrameId) { + const parentFrame = parentFrameId ? this._frames.get(parentFrameId) : null; + if (!parentFrame) { + if (this._mainFrame) { + this._frames.delete(this._mainFrame._id); + this._mainFrame._id = frameId; + } else { + assert(!this._frames.has(frameId)); + this._mainFrame = new Frame(this._page, frameId, parentFrame); + } + this._frames.set(frameId, this._mainFrame); + return this._mainFrame; + } else { + assert(!this._frames.has(frameId)); + const frame = new Frame(this._page, frameId, parentFrame); + this._frames.set(frameId, frame); + this._page.emit(Page.Events.FrameAttached, frame); + this._page.browserContext.emit(BrowserContext.Events.FrameAttached, frame); + return frame; + } + } + async waitForSignalsCreatedBy(progress2, waitAfter, action) { + if (!waitAfter) + return action(progress2); + const barrier = new SignalBarrier(progress2); + this._signalBarriers.add(barrier); + try { + const result2 = await action(progress2); + await progress2.race(this._page.delegate.inputActionEpilogue()); + await barrier.waitFor(progress2); + await new Promise(makeWaitForNextTask()); + return result2; + } finally { + this._signalBarriers.delete(barrier); + } + } + frameWillPotentiallyRequestNavigation() { + for (const barrier of this._signalBarriers) + barrier.retain(); + } + frameDidPotentiallyRequestNavigation() { + for (const barrier of this._signalBarriers) + barrier.release(); + } + frameRequestedNavigation(frameId, documentId) { + const frame = this._frames.get(frameId); + if (!frame) + return; + for (const barrier of this._signalBarriers) + barrier.addFrameNavigation(frame); + if (frame.pendingDocument() && frame.pendingDocument().documentId === documentId) { + return; + } + const request2 = documentId ? Array.from(frame._inflightRequests).find((request3) => request3._documentId === documentId) : void 0; + frame._setPendingDocument({ documentId, request: request2 }); + } + frameCommittedNewDocumentNavigation(frameId, url2, name, documentId, initial) { + const frame = this._frames.get(frameId); + this.removeChildFramesRecursively(frame); + this._clearWebSockets(frame); + frame._url = url2; + frame._name = name; + let keepPending; + const pendingDocument = frame.pendingDocument(); + if (pendingDocument) { + if (pendingDocument.documentId === void 0) { + pendingDocument.documentId = documentId; + } + if (pendingDocument.documentId === documentId) { + frame._currentDocument = pendingDocument; + } else { + keepPending = pendingDocument; + frame._currentDocument = { documentId, request: void 0 }; + } + frame._setPendingDocument(void 0); + } else { + frame._currentDocument = { documentId, request: void 0 }; + } + frame._onClearLifecycle(); + const navigationEvent = { url: url2, name, newDocument: frame._currentDocument, isPublic: true }; + this._fireInternalFrameNavigation(frame, navigationEvent); + if (!initial) { + frame.apiLog(` navigated to "${url2}"`); + this._page.frameNavigatedToNewDocument(frame); + } + frame._setPendingDocument(keepPending); + } + frameCommittedSameDocumentNavigation(frameId, url2) { + const frame = this._frames.get(frameId); + if (!frame) + return; + const pending = frame.pendingDocument(); + if (pending && pending.documentId === void 0 && pending.request === void 0) { + frame._setPendingDocument(void 0); + } + frame._url = url2; + const navigationEvent = { url: url2, name: frame._name, isPublic: true }; + this._fireInternalFrameNavigation(frame, navigationEvent); + frame.apiLog(` navigated to "${url2}"`); + } + frameAbortedNavigation(frameId, errorText, documentId) { + const frame = this._frames.get(frameId); + if (!frame || !frame.pendingDocument()) + return; + if (documentId !== void 0 && frame.pendingDocument().documentId !== documentId) + return; + const navigationEvent = { + url: frame._url, + name: frame._name, + newDocument: frame.pendingDocument(), + error: new NavigationAbortedError(documentId, errorText), + isPublic: !(documentId && frame._redirectedNavigations.has(documentId)) + }; + frame._setPendingDocument(void 0); + this._fireInternalFrameNavigation(frame, navigationEvent); + } + frameDetached(frameId) { + const frame = this._frames.get(frameId); + if (frame) { + this._removeFramesRecursively(frame); + this._page.mainFrame()._recalculateNetworkIdle(); + } + } + frameLifecycleEvent(frameId, event) { + const frame = this._frames.get(frameId); + if (frame) + frame.onLifecycleEvent(event); + } + requestStarted(request2, route2) { + const frame = request2.frame(); + this._inflightRequestStarted(request2); + if (request2._documentId) + frame._setPendingDocument({ documentId: request2._documentId, request: request2 }); + if (request2._isFavicon) { + route2?.abort("aborted").catch(() => { + }); + return; + } + this._page.addNetworkRequest(request2); + this._page.emitOnContext(BrowserContext.Events.Request, request2); + if (route2) + new Route(request2, route2).handle([...this._page.requestInterceptors, ...this._page.browserContext.requestInterceptors]); + } + requestReceivedResponse(response2) { + if (response2.request()._isFavicon) + return; + this._page.emitOnContext(BrowserContext.Events.Response, response2); + } + reportRequestFinished(request2, response2) { + this._inflightRequestFinished(request2); + if (request2._isFavicon) + return; + this._page.emitOnContext(BrowserContext.Events.RequestFinished, { request: request2, response: response2 }); + } + requestFailed(request2, canceled) { + const frame = request2.frame(); + this._inflightRequestFinished(request2); + if (frame.pendingDocument() && frame.pendingDocument().request === request2) { + let errorText = request2.failure().errorText; + if (canceled) + errorText += "; maybe frame was detached?"; + this.frameAbortedNavigation(frame._id, errorText, frame.pendingDocument().documentId); + } + if (request2._isFavicon) + return; + this._page.emitOnContext(BrowserContext.Events.RequestFailed, request2); + } + removeChildFramesRecursively(frame) { + for (const child of frame._getChildFrames()) + this._removeFramesRecursively(child); + } + _removeFramesRecursively(frame) { + this.removeChildFramesRecursively(frame); + frame._onDetached(); + this._frames.delete(frame._id); + if (!this._page.isClosed()) + this._page.emit(Page.Events.FrameDetached, frame); + } + _inflightRequestFinished(request2) { + const frame = request2.frame(); + if (request2._isFavicon) + return; + if (!frame._inflightRequests.has(request2)) + return; + frame._inflightRequests.delete(request2); + if (frame._inflightRequests.size === 0) + frame._startNetworkIdleTimer(); + } + _inflightRequestStarted(request2) { + const frame = request2.frame(); + if (request2._isFavicon) + return; + frame._inflightRequests.add(request2); + if (frame._inflightRequests.size === 1) + frame._stopNetworkIdleTimer(); + } + interceptConsoleMessage(message) { + if (message.type() !== "debug") + return false; + const tag = message.text(); + const handler = this._consoleMessageTags.get(tag); + if (!handler) + return false; + this._consoleMessageTags.delete(tag); + handler(); + return true; + } + _clearWebSockets(frame) { + if (frame.parentFrame()) + return; + this._webSockets.clear(); + } + onWebSocketCreated(requestId, url2) { + const ws4 = new WebSocket(this._page, url2); + this._webSockets.set(requestId, ws4); + } + onWebSocketRequest(requestId, headers, wallTimeMs) { + const ws4 = this._webSockets.get(requestId); + if (!ws4) + return; + ws4.setWallTimeMs(wallTimeMs); + if (ws4.markAsNotified()) { + this._page.emit(Page.Events.WebSocket, ws4); + this._page.browserContext.emit(BrowserContext.Events.WebSocket, ws4, this._page); + } + ws4.requestSent(headers); + } + onWebSocketResponse(requestId, status, statusText2, headers) { + const ws4 = this._webSockets.get(requestId); + if (!ws4) + return; + ws4.responseReceived(status, statusText2, headers); + if (status >= 400) + ws4.error(`${statusText2}: ${status}`); + } + onWebSocketFrameSent(requestId, opcode, data, wallTimeMs) { + const ws4 = this._webSockets.get(requestId); + if (ws4) + ws4.frameSent(opcode, data, wallTimeMs); + } + webSocketFrameReceived(requestId, opcode, data, wallTimeMs) { + const ws4 = this._webSockets.get(requestId); + if (ws4) + ws4.frameReceived(opcode, data, wallTimeMs); + } + webSocketClosed(requestId) { + const ws4 = this._webSockets.get(requestId); + if (ws4) { + if (ws4.markAsNotified()) { + this._page.emit(Page.Events.WebSocket, ws4); + this._page.browserContext.emit(BrowserContext.Events.WebSocket, ws4, this._page); + } + ws4.closed(); + } + this._webSockets.delete(requestId); + } + webSocketError(requestId, errorMessage) { + const ws4 = this._webSockets.get(requestId); + if (ws4) { + if (ws4.markAsNotified()) { + this._page.emit(Page.Events.WebSocket, ws4); + this._page.browserContext.emit(BrowserContext.Events.WebSocket, ws4, this._page); + } + ws4.error(errorMessage); + } + } + _fireInternalFrameNavigation(frame, event) { + frame.emit(Frame.Events.InternalNavigation, event); + } + }; + FrameEvent = { + InternalNavigation: "internalnavigation", + AddLifecycle: "addlifecycle", + RemoveLifecycle: "removelifecycle" + }; + Frame = class _Frame extends SdkObject { + constructor(page, id, parentFrame) { + super(page, "frame"); + this._firedLifecycleEvents = /* @__PURE__ */ new Set(); + this._firedNetworkIdleSelf = false; + this._url = ""; + this._contextData = /* @__PURE__ */ new Map(); + this._childFrames = /* @__PURE__ */ new Set(); + this._name = ""; + this._inflightRequests = /* @__PURE__ */ new Set(); + this._detachedScope = new LongStandingScope(); + this._raceAgainstEvaluationStallingEventsPromises = /* @__PURE__ */ new Set(); + this._redirectedNavigations = /* @__PURE__ */ new Map(); + this.attribution.frame = this; + this.seq = page.frameManager._allocateFrameSeq(); + this._id = id; + this._page = page; + this._parentFrame = parentFrame; + this._currentDocument = { documentId: void 0, request: void 0 }; + this.selectors = new FrameSelectors(this); + this._contextData.set("main", { contextPromise: new ManualPromise(), context: null }); + this._contextData.set("utility", { contextPromise: new ManualPromise(), context: null }); + this._setContext("main", null); + this._setContext("utility", null); + if (this._parentFrame) + this._parentFrame._childFrames.add(this); + this._firedLifecycleEvents.add("commit"); + if (id !== kDummyFrameId) + this._startNetworkIdleTimer(); + } + static { + this.Events = FrameEvent; + } + _isDetached() { + return this._detachedScope.isClosed(); + } + onLifecycleEvent(event) { + if (this._firedLifecycleEvents.has(event)) + return; + this._firedLifecycleEvents.add(event); + this.emit(_Frame.Events.AddLifecycle, event); + if (this === this._page.mainFrame() && this._url !== "about:blank") + this.apiLog(` "${event}" event fired`); + this._page.mainFrame()._recalculateNetworkIdle(); + } + _onClearLifecycle() { + for (const event of this._firedLifecycleEvents) + this.emit(_Frame.Events.RemoveLifecycle, event); + this._firedLifecycleEvents.clear(); + this._inflightRequests = new Set(Array.from(this._inflightRequests).filter((request2) => request2 === this._currentDocument.request)); + this._stopNetworkIdleTimer(); + if (this._inflightRequests.size === 0) + this._startNetworkIdleTimer(); + this._page.mainFrame()._recalculateNetworkIdle(this); + this.onLifecycleEvent("commit"); + } + _setPendingDocument(documentInfo) { + this._pendingDocument = documentInfo; + if (documentInfo) + this.invalidateNonStallingEvaluations("Navigation interrupted the evaluation"); + } + pendingDocument() { + return this._pendingDocument; + } + invalidateNonStallingEvaluations(message) { + if (!this._raceAgainstEvaluationStallingEventsPromises.size) + return; + const error = new Error(message); + for (const promise of this._raceAgainstEvaluationStallingEventsPromises) + promise.reject(error); + } + async raceAgainstEvaluationStallingEvents(cb) { + if (this._pendingDocument) + throw new Error("Frame is currently attempting a navigation"); + if (this._page.browserContext.dialogManager.hasOpenDialogsForPage(this._page)) + throw new Error("Open JavaScript dialog prevents evaluation"); + const promise = new ManualPromise(); + this._raceAgainstEvaluationStallingEventsPromises.add(promise); + try { + return await Promise.race([ + cb(), + promise + ]); + } finally { + this._raceAgainstEvaluationStallingEventsPromises.delete(promise); + } + } + nonStallingRawEvaluateInExistingMainContext(expression2) { + return this.raceAgainstEvaluationStallingEvents(() => { + const context2 = this._existingMainContext(); + if (!context2) + throw new Error("Frame does not yet have a main execution context"); + return context2.rawEvaluateJSON(expression2); + }); + } + nonStallingEvaluateInExistingContext(expression2, world) { + return this.raceAgainstEvaluationStallingEvents(() => { + const context2 = this._contextData.get(world)?.context; + if (!context2) + throw new Error("Frame does not yet have the execution context"); + return context2.evaluateExpression(expression2, { isFunction: false }); + }); + } + _recalculateNetworkIdle(frameThatAllowsRemovingNetworkIdle) { + let isNetworkIdle = this._firedNetworkIdleSelf; + for (const child of this._childFrames) { + child._recalculateNetworkIdle(frameThatAllowsRemovingNetworkIdle); + if (!child._firedLifecycleEvents.has("networkidle")) + isNetworkIdle = false; + } + if (isNetworkIdle && !this._firedLifecycleEvents.has("networkidle")) { + this._firedLifecycleEvents.add("networkidle"); + this.emit(_Frame.Events.AddLifecycle, "networkidle"); + if (this === this._page.mainFrame() && this._url !== "about:blank") + this.apiLog(` "networkidle" event fired`); + } + if (frameThatAllowsRemovingNetworkIdle !== this && this._firedLifecycleEvents.has("networkidle") && !isNetworkIdle) { + this._firedLifecycleEvents.delete("networkidle"); + this.emit(_Frame.Events.RemoveLifecycle, "networkidle"); + } + } + async raceNavigationAction(progress2, action) { + progress2.setAllowConcurrentOrNestedRaces(true); + const result2 = await progress2.race(LongStandingScope.raceMultiple([ + this._detachedScope, + this._page.openScope + ], action().catch((e) => { + if (e instanceof NavigationAbortedError && e.documentId) { + const data = this._redirectedNavigations.get(e.documentId); + if (data) { + progress2.log(`waiting for redirected navigation to "${data.url}"`); + return progress2.race(data.gotoPromise); + } + } + throw e; + }))); + progress2.setAllowConcurrentOrNestedRaces(false); + return result2; + } + redirectNavigation(url2, documentId, referer) { + const controller = new ProgressController(); + const data = { + url: url2, + gotoPromise: controller.run((progress2) => this.gotoImpl(progress2, url2, { referer }), 0) + }; + this._redirectedNavigations.set(documentId, data); + data.gotoPromise.finally(() => this._redirectedNavigations.delete(documentId)); + } + async goto(progress2, url2, options = {}) { + const constructedNavigationURL = constructURLBasedOnBaseURL(this._page.browserContext._options.baseURL, url2); + return this.raceNavigationAction(progress2, async () => this.gotoImpl(progress2, constructedNavigationURL, options)); + } + async gotoImpl(progress2, url2, options) { + const waitUntil = verifyLifecycle("waitUntil", options.waitUntil === void 0 ? "load" : options.waitUntil); + progress2.log(`navigating to "${url2}", waiting until "${waitUntil}"`); + const headers = this._page.extraHTTPHeaders() || []; + const refererHeader = headers.find((h) => h.name.toLowerCase() === "referer"); + let referer = refererHeader ? refererHeader.value : void 0; + if (options.referer !== void 0) { + if (referer !== void 0 && referer !== options.referer) + throw new Error('"referer" is already specified as extra HTTP header'); + referer = options.referer; + } + url2 = helper.completeUserURL(url2); + const navigationEvents = []; + const collectNavigations = (arg) => navigationEvents.push(arg); + this.on(_Frame.Events.InternalNavigation, collectNavigations); + let navigateResult; + try { + navigateResult = await progress2.race(this._page.delegate.navigateFrame(this, url2, referer)); + } finally { + this.off(_Frame.Events.InternalNavigation, collectNavigations); + } + let event; + if (navigateResult.newDocumentId) { + const predicate = (event2) => { + return event2.newDocument && (event2.newDocument.documentId === navigateResult.newDocumentId || !event2.error); + }; + const events = navigationEvents.filter(predicate); + if (events.length) + event = events[0]; + else + event = await helper.waitForEvent(progress2, this, _Frame.Events.InternalNavigation, predicate).promise; + if (event.newDocument.documentId !== navigateResult.newDocumentId) { + throw new NavigationAbortedError(navigateResult.newDocumentId, `Navigation to "${url2}" is interrupted by another navigation to "${event.url}"`); + } + if (event.error) + throw event.error; + } else { + const predicate = (e) => !e.newDocument; + const events = navigationEvents.filter(predicate); + if (events.length) + event = events[0]; + else + event = await helper.waitForEvent(progress2, this, _Frame.Events.InternalNavigation, predicate).promise; + } + if (!this._firedLifecycleEvents.has(waitUntil)) + await helper.waitForEvent(progress2, this, _Frame.Events.AddLifecycle, (e) => e === waitUntil).promise; + const request2 = event.newDocument ? event.newDocument.request : void 0; + const response2 = request2 ? await request2._finalRequest().response(progress2) : null; + return response2; + } + async waitForNavigation(progress2, requiresNewDocument, options) { + const waitUntil = verifyLifecycle("waitUntil", options.waitUntil === void 0 ? "load" : options.waitUntil); + progress2.log(`waiting for navigation until "${waitUntil}"`); + const navigationEvent = await helper.waitForEvent(progress2, this, _Frame.Events.InternalNavigation, (event) => { + if (event.error) + return true; + if (requiresNewDocument && !event.newDocument) + return false; + progress2.log(` navigated to "${this._url}"`); + return true; + }).promise; + if (navigationEvent.error) + throw navigationEvent.error; + if (!this._firedLifecycleEvents.has(waitUntil)) + await helper.waitForEvent(progress2, this, _Frame.Events.AddLifecycle, (e) => e === waitUntil).promise; + const request2 = navigationEvent.newDocument ? navigationEvent.newDocument.request : void 0; + return request2 ? request2._finalRequest().response(progress2) : null; + } + async waitForLoadState(progress2, state) { + const waitUntil = verifyLifecycle("state", state); + if (!this._firedLifecycleEvents.has(waitUntil)) + await helper.waitForEvent(progress2, this, _Frame.Events.AddLifecycle, (e) => e === waitUntil).promise; + } + async frameElement(progress2) { + return await progress2.race(this._page.delegate.getFrameElement(this)); + } + context(world) { + if (this._page.delegate.noUtilityWorld?.()) + world = "main"; + return this._contextData.get(world).contextPromise.then((contextOrDestroyedReason) => { + if (contextOrDestroyedReason instanceof ExecutionContext) + return contextOrDestroyedReason; + throw new Error(contextOrDestroyedReason.destroyedReason); + }); + } + mainContext() { + return this.context("main"); + } + _existingMainContext() { + return this._contextData.get("main")?.context || null; + } + utilityContext() { + return this.context("utility"); + } + async evaluateExpression(progress2, expression2, options = {}, arg) { + return await progress2.race(this._evaluateExpression(expression2, options, arg)); + } + async _evaluateExpression(expression2, options = {}, arg) { + const context2 = await this.context(options.world ?? "main"); + const value2 = await context2.evaluateExpression(expression2, options, arg); + return value2; + } + async evaluateExpressionHandle(progress2, expression2, options = {}, arg) { + return await progress2.race(this._evaluateExpressionHandle(expression2, options, arg)); + } + async _evaluateExpressionHandle(expression2, options = {}, arg) { + const context2 = await this.context(options.world ?? "main"); + const value2 = await context2.evaluateExpressionHandle(expression2, options, arg); + return value2; + } + async querySelector(progress2, selector, options) { + this.apiLog(` finding element using the selector "${selector}"`); + return progress2.race(this.selectors.query(selector, options)); + } + async waitForSelector(progress2, selector, performActionPreChecksAndLog, options, scope) { + if (options.visibility) + throw new Error("options.visibility is not supported, did you mean options.state?"); + if (options.waitFor && options.waitFor !== "visible") + throw new Error("options.waitFor is not supported, did you mean options.state?"); + const { state = "visible" } = options; + if (!["attached", "detached", "visible", "hidden"].includes(state)) + throw new Error(`state: expected one of (attached|detached|visible|hidden)`); + if (performActionPreChecksAndLog) + progress2.log(`waiting for ${this._asLocator(selector)}${state === "attached" ? "" : " to be " + state}`); + const promise = this.retryWithProgressAndBackoff(progress2, async (progress3, continuePolling) => { + if (performActionPreChecksAndLog) + await this._page.performActionPreChecks(progress3); + const resolved = await progress3.race(this.selectors.resolveInjectedForSelector(selector, options, scope)); + if (!resolved) { + if (state === "hidden" || state === "detached") + return null; + return continuePolling; + } + const result2 = await progress3.race(resolved.injected.evaluateHandle((injected, { info, root }) => { + if (root && !root.isConnected) + throw injected.createStacklessError("Element is not attached to the DOM"); + const elements = injected.querySelectorAll(info.parsed, root || document); + const element3 = elements[0]; + const visible2 = element3 ? injected.utils.isElementVisible(element3) : false; + let log3 = ""; + if (elements.length > 1) { + if (info.strict) + throw injected.strictModeViolationError(info.parsed, elements); + log3 = ` locator resolved to ${elements.length} elements. Proceeding with the first one: ${injected.previewNode(elements[0])}`; + } else if (element3) { + log3 = ` locator resolved to ${visible2 ? "visible" : "hidden"} ${injected.previewNode(element3)}`; + } + injected.checkDeprecatedSelectorUsage(info.parsed, elements); + return { log: log3, element: element3, visible: visible2, attached: !!element3 }; + }, { info: resolved.info, root: resolved.frame === this ? scope : void 0 })); + const { log: log2, visible, attached } = await progress3.race(result2.evaluate((r) => ({ log: r.log, visible: r.visible, attached: r.attached }))); + if (log2) + progress3.log(log2); + const success = { attached, detached: !attached, visible, hidden: !visible }[state]; + if (!success) { + result2.dispose(); + return continuePolling; + } + if (options.omitReturnValue) { + result2.dispose(); + return null; + } + const element2 = state === "attached" || state === "visible" ? await progress3.race(result2.evaluateHandle((r) => r.element)) : null; + result2.dispose(); + if (!element2) + return null; + if (options.__testHookBeforeAdoptNode) + await progress3.race(options.__testHookBeforeAdoptNode()); + try { + const mainContext = await progress3.race(resolved.frame.mainContext()); + return await progress3.race(element2._adoptTo(mainContext)); + } catch (e) { + return continuePolling; + } + }); + return scope ? scope._context.raceAgainstContextDestroyed(promise) : promise; + } + async dispatchEvent(progress2, selector, type3, eventInit = {}, options, scope) { + await this._callOnElementOnceMatches(progress2, selector, (injectedScript, element2, data) => { + injectedScript.dispatchEvent(element2, data.type, data.eventInit); + }, { type: type3, eventInit }, { mainWorld: true, ...options }, scope); + } + async evalOnSelector(progress2, selector, strict, expression2, isFunction2, arg, scope) { + return progress2.race(this._evalOnSelector(selector, strict, expression2, isFunction2, arg, scope)); + } + async _evalOnSelector(selector, strict, expression2, isFunction2, arg, scope) { + const handle = await this.selectors.query(selector, { strict }, scope); + if (!handle) + throw new Error(`Failed to find element matching selector "${selector}"`); + const result2 = await handle.internalEvaluateExpression(expression2, { isFunction: isFunction2 }, arg); + handle.dispose(); + return result2; + } + async evalOnSelectorAll(progress2, selector, expression2, isFunction2, arg, scope) { + return progress2.race(this._evalOnSelectorAll(selector, expression2, isFunction2, arg, scope)); + } + async _evalOnSelectorAll(selector, expression2, isFunction2, arg, scope) { + const arrayHandle = await this.selectors.queryArrayInMainWorld(selector, scope); + const result2 = await arrayHandle.internalEvaluateExpression(expression2, { isFunction: isFunction2 }, arg); + arrayHandle.dispose(); + return result2; + } + async maskSelectors(selectors, color) { + const context2 = await this.utilityContext(); + const injectedScript = await context2.injectedScript(); + await injectedScript.evaluate((injected, { parsed, color: color2 }) => { + injected.maskSelectors(parsed, color2); + }, { parsed: selectors, color }); + } + async querySelectorAll(progress2, selector) { + return progress2.race(this.selectors.queryAll(selector)); + } + async queryCount(progress2, selector, options) { + try { + return await progress2.race(this.selectors.queryCount(selector, options)); + } catch (e) { + if (this.isNonRetriableError(e)) + throw e; + return 0; + } + } + async content(progress2) { + return progress2.race(this._content()); + } + async _content() { + try { + const context2 = await this.utilityContext(); + return await context2.evaluate(() => { + let retVal = ""; + if (document.doctype) + retVal = new XMLSerializer().serializeToString(document.doctype); + if (document.documentElement) + retVal += document.documentElement.outerHTML; + return retVal; + }); + } catch (e) { + if (this.isNonRetriableError(e)) + throw e; + throw new Error(`Unable to retrieve content because the page is navigating and changing the content.`); + } + } + async setContent(progress2, html, options) { + const tag = `--playwright--set--content--${createGuid()}--`; + await this.raceNavigationAction(progress2, async () => { + const waitUntil = options.waitUntil === void 0 ? "load" : options.waitUntil; + progress2.log(`setting frame content, waiting until "${waitUntil}"`); + const context2 = await progress2.race(this.utilityContext()); + const tagPromise = new ManualPromise(); + this._page.frameManager._consoleMessageTags.set(tag, () => { + this._onClearLifecycle(); + tagPromise.resolve(); + }); + progress2.setAllowConcurrentOrNestedRaces(true); + const lifecyclePromise = progress2.race(tagPromise).then(() => this.waitForLoadState(progress2, waitUntil)); + const contentPromise = progress2.race(context2.evaluate(({ html: html2, tag: tag2 }) => { + document.open(); + console.debug(tag2); + document.write(html2); + document.close(); + }, { html, tag })); + await Promise.all([contentPromise, lifecyclePromise]); + progress2.setAllowConcurrentOrNestedRaces(false); + return null; + }).finally(() => { + this._page.frameManager._consoleMessageTags.delete(tag); + }); + } + name() { + return this._name || ""; + } + url() { + return this._url; + } + origin() { + if (!this._url.startsWith("http")) + return; + return parseURL2(this._url)?.origin; + } + parentFrame() { + return this._parentFrame; + } + _getChildFrames() { + return Array.from(this._childFrames); + } + async addScriptTag(progress2, params2) { + return await progress2.race(this._addScriptTag(params2)); + } + async _addScriptTag(params2) { + const { + url: url2 = null, + content = null, + type: type3 = "" + } = params2; + if (!url2 && !content) + throw new Error("Provide an object with a `url`, `path` or `content` property"); + const context2 = await this.mainContext(); + return this._raceWithCSPError(async () => { + if (url2 !== null) + return (await context2.evaluateHandle(addScriptUrl, { url: url2, type: type3 })).asElement(); + const result2 = (await context2.evaluateHandle(addScriptContent, { content, type: type3 })).asElement(); + if (this._page.delegate.cspErrorsAsynchronousForInlineScripts) + await context2.evaluate(() => true); + return result2; + }); + async function addScriptUrl(params3) { + const script = document.createElement("script"); + script.src = params3.url; + if (params3.type) + script.type = params3.type; + const promise = new Promise((res, rej) => { + script.onload = res; + script.onerror = (e) => rej(typeof e === "string" ? new Error(e) : new Error(`Failed to load script at ${script.src}`)); + }); + document.head.appendChild(script); + await promise; + return script; + } + function addScriptContent(params3) { + const script = document.createElement("script"); + script.type = params3.type || "text/javascript"; + script.text = params3.content; + let error = null; + script.onerror = (e) => error = e; + document.head.appendChild(script); + if (error) + throw error; + return script; + } + } + async addStyleTag(progress2, params2) { + return await progress2.race(this._addStyleTag(params2)); + } + async _addStyleTag(params2) { + const { + url: url2 = null, + content = null + } = params2; + if (!url2 && !content) + throw new Error("Provide an object with a `url`, `path` or `content` property"); + const context2 = await this.mainContext(); + return this._raceWithCSPError(async () => { + if (url2 !== null) + return (await context2.evaluateHandle(addStyleUrl, url2)).asElement(); + return (await context2.evaluateHandle(addStyleContent, content)).asElement(); + }); + async function addStyleUrl(url3) { + const link = document.createElement("link"); + link.rel = "stylesheet"; + link.href = url3; + const promise = new Promise((res, rej) => { + link.onload = res; + link.onerror = rej; + }); + document.head.appendChild(link); + await promise; + return link; + } + async function addStyleContent(content2) { + const style = document.createElement("style"); + style.type = "text/css"; + style.appendChild(document.createTextNode(content2)); + const promise = new Promise((res, rej) => { + style.onload = res; + style.onerror = rej; + }); + document.head.appendChild(style); + await promise; + return style; + } + } + async _raceWithCSPError(func) { + const listeners = []; + let result2; + let error; + let cspMessage; + const actionPromise = func().then((r) => result2 = r).catch((e) => error = e); + const errorPromise = new Promise((resolve) => { + listeners.push(eventsHelper.addEventListener(this._page.browserContext, BrowserContext.Events.Console, (message) => { + if (message.page() !== this._page || message.type() !== "error") + return; + if (message.text().includes("Content-Security-Policy") || message.text().includes("Content Security Policy")) { + cspMessage = message; + resolve(); + } + })); + }); + await Promise.race([actionPromise, errorPromise]); + eventsHelper.removeEventListeners(listeners); + if (cspMessage) + throw new Error(cspMessage.text()); + if (error) + throw error; + return result2; + } + async retryWithProgressAndBackoff(progress2, action) { + const backoffScale = [20, 50, 100, 100, 500]; + if (progress2.timeout) { + while (backoffScale.length && backoffScale[backoffScale.length - 1] > progress2.timeout / 5) + backoffScale.pop(); + } + return await this.retryWithProgressAndTimeouts(progress2, backoffScale, action); + } + async retryWithProgressAndTimeouts(progress2, timeouts, action) { + const continuePolling = Symbol("continuePolling"); + timeouts = [0, ...timeouts]; + let timeoutIndex = 0; + while (true) { + const timeout = timeouts[Math.min(timeoutIndex++, timeouts.length - 1)]; + if (timeout) { + const actionPromise = new Promise((f) => setTimeout(f, timeout)); + await progress2.race(LongStandingScope.raceMultiple([ + this._page.openScope, + this._detachedScope + ], actionPromise)); + } + try { + const result2 = await action(progress2, continuePolling); + if (result2 === continuePolling) + continue; + return result2; + } catch (e) { + if (this.isNonRetriableError(e)) + throw e; + continue; + } + } + } + isNonRetriableError(e) { + if (isAbortError(e)) + return true; + if (isJavaScriptErrorInEvaluate(e) || isSessionClosedError(e)) + return true; + if (isNonRecoverableDOMError(e) || isInvalidSelectorError(e)) + return true; + if (this._isDetached()) + return true; + return false; + } + async _retryWithProgressIfNotConnected(progress2, selector, options, action) { + progress2.log(`waiting for ${this._asLocator(selector)}`); + const noAutoWaiting = options.__testHookNoAutoWaiting ?? options.noAutoWaiting; + const performActionPreChecks = (options.performActionPreChecks ?? !options.force) && !noAutoWaiting; + return this.retryWithProgressAndBackoff(progress2, async (progress3, continuePolling) => { + if (performActionPreChecks) + await this._page.performActionPreChecks(progress3); + const resolved = await progress3.race(this.selectors.resolveInjectedForSelector(selector, { strict: options.strict })); + if (!resolved) { + if (noAutoWaiting) + throw new NonRecoverableDOMError("Element(s) not found"); + return continuePolling; + } + const result2 = await progress3.race(resolved.injected.evaluateHandle((injected, { info }) => { + const elements = injected.querySelectorAll(info.parsed, document); + injected.markTargetElements(new Set(elements)); + const element3 = elements[0]; + let log3 = ""; + if (elements.length > 1) { + if (info.strict) + throw injected.strictModeViolationError(info.parsed, elements); + log3 = ` locator resolved to ${elements.length} elements. Proceeding with the first one: ${injected.previewNode(elements[0])}`; + } else if (element3) { + log3 = ` locator resolved to ${injected.previewNode(element3)}`; + } + injected.checkDeprecatedSelectorUsage(info.parsed, elements); + return { log: log3, success: !!element3, element: element3 }; + }, { info: resolved.info })); + const { log: log2, success } = await progress3.race(result2.evaluate((r) => ({ log: r.log, success: r.success }))); + if (log2) + progress3.log(log2); + if (!success) { + if (noAutoWaiting) + throw new NonRecoverableDOMError("Element(s) not found"); + result2.dispose(); + return continuePolling; + } + const element2 = await progress3.race(result2.evaluateHandle((r) => r.element)); + result2.dispose(); + try { + const result3 = await action(progress3, element2); + if (result3 === "error:notconnected") { + if (noAutoWaiting) + throw new NonRecoverableDOMError("Element is not attached to the DOM"); + progress3.log("element was detached from the DOM, retrying"); + return continuePolling; + } + return result3; + } finally { + element2?.dispose(); + } + }); + } + async rafrafTimeoutScreenshotElementWithProgress(progress2, selector, timeout, options) { + return await this._retryWithProgressIfNotConnected(progress2, selector, { strict: true, performActionPreChecks: true }, async (progress3, handle) => { + await handle._frame.rafrafTimeout(progress3, timeout); + return await this._page.screenshotter.screenshotElement(progress3, handle, options); + }); + } + async click(progress2, selector, options) { + return assertDone(await this._retryWithProgressIfNotConnected(progress2, selector, options, (progress3, handle) => handle._click(progress3, { ...options, waitAfter: !options.noWaitAfter }))); + } + async dblclick(progress2, selector, options) { + return assertDone(await this._retryWithProgressIfNotConnected(progress2, selector, options, (progress3, handle) => handle._dblclick(progress3, options))); + } + async dragAndDrop(progress2, source11, target, options) { + assertDone(await this._retryWithProgressIfNotConnected(progress2, source11, options, async (progress3, handle) => { + return handle._retryPointerAction(progress3, "move and down", false, async (progress4, point) => { + await this._page.mouse.move(progress4, point.x, point.y); + await this._page.mouse.down(progress4); + }, { + ...options, + waitAfter: "disabled", + position: options.sourcePosition + }); + })); + assertDone(await this._retryWithProgressIfNotConnected(progress2, target, { ...options, performActionPreChecks: false }, async (progress3, handle) => { + return handle._retryPointerAction(progress3, "move and up", false, async (progress4, point) => { + await this._page.mouse.move(progress4, point.x, point.y, { steps: options.steps }); + await this._page.mouse.up(progress4); + }, { + ...options, + waitAfter: "disabled", + position: options.targetPosition + }); + })); + } + async tap(progress2, selector, options) { + if (!this._page.browserContext._options.hasTouch) + throw new Error("The page does not support tap. Use hasTouch context option to enable touch support."); + return assertDone(await this._retryWithProgressIfNotConnected(progress2, selector, options, (progress3, handle) => handle._tap(progress3, options))); + } + async fill(progress2, selector, value2, options) { + return assertDone(await this._retryWithProgressIfNotConnected(progress2, selector, options, (progress3, handle) => handle._fill(progress3, value2, options))); + } + async focus(progress2, selector, options) { + assertDone(await this._retryWithProgressIfNotConnected(progress2, selector, options, (progress3, handle) => handle._focus(progress3))); + } + async blur(progress2, selector, options) { + assertDone(await this._retryWithProgressIfNotConnected(progress2, selector, options, (progress3, handle) => handle._blur(progress3))); + } + async resolveSelector(progress2, selector, options = {}) { + const element2 = await progress2.race(this.selectors.query(selector, options)); + if (!element2) + throw new Error(`No element matching ${selector}`); + const generated = await progress2.race(element2.evaluateInUtility(async ([injected, node]) => { + return injected.generateSelectorSimple(node); + }, {})); + if (!generated) + throw new Error(`Unable to generate locator for ${selector}`); + let frame = element2._frame; + const result2 = [generated]; + while (frame?.parentFrame()) { + const frameElement = await frame.frameElement(progress2); + if (frameElement) { + const generated2 = await progress2.race(frameElement.evaluateInUtility(async ([injected, node]) => { + return injected.generateSelectorSimple(node); + }, {})); + frameElement.dispose(); + if (generated2 === "error:notconnected" || !generated2) + throw new Error(`Unable to generate locator for ${selector}`); + result2.push(generated2); + } + frame = frame.parentFrame(); + } + const resolvedSelector = result2.reverse().join(" >> internal:control=enter-frame >> "); + return { resolvedSelector }; + } + async textContent(progress2, selector, options, scope) { + return this._callOnElementOnceMatches(progress2, selector, (injected, element2) => element2.textContent, void 0, options, scope); + } + async innerText(progress2, selector, options, scope) { + return this._callOnElementOnceMatches(progress2, selector, (injectedScript, element2) => { + if (element2.namespaceURI !== "http://www.w3.org/1999/xhtml") + throw injectedScript.createStacklessError("Node is not an HTMLElement"); + return element2.innerText; + }, void 0, options, scope); + } + async innerHTML(progress2, selector, options, scope) { + return this._callOnElementOnceMatches(progress2, selector, (injected, element2) => element2.innerHTML, void 0, options, scope); + } + async getAttribute(progress2, selector, name, options, scope) { + return this._callOnElementOnceMatches(progress2, selector, (injected, element2, data) => element2.getAttribute(data.name), { name }, options, scope); + } + async inputValue(progress2, selector, options, scope) { + return this._callOnElementOnceMatches(progress2, selector, (injectedScript, node) => { + const element2 = injectedScript.retarget(node, "follow-label"); + if (!element2 || element2.nodeName !== "INPUT" && element2.nodeName !== "TEXTAREA" && element2.nodeName !== "SELECT") + throw injectedScript.createStacklessError("Node is not an ,
      + + Get professional support for this package with a Tidelift subscription + +
      + + Tidelift helps make open source sustainable for maintainers while giving companies
      assurances about security, maintenance, and licensing for their dependencies. +
      +

      NEw-z(3iyNIwu?b%BEOd)U|?DWVSs@0P;l9 zmgA&?5izE#Qgj74K}a$V6wVedFG&J=kSCLR*-zP2Zc}0&fSj%_Qa#^oQWxXLd@E%y ztGD*Yz#TRGv0=gC4amfGpOLGAq99YoyMUu|_SV6wwDqfTjuZjcQf}i2{6PyV9J#Au z%JkY|PXXi|{dB0cuxzX(KYle)Ca$H7qLJKZ%**Sq)FZB%e!Nk^jij2YBbXF@b(GQkw~CMt zhAA`*C^)VJ3rL&S-Q%NG`5&yJ)iZiNm*U7k)2cC5{b=t5;zxsn%Fr&nn$fbN!r3{M zTggYyp|nL2>#&xIrIF9o=_-Xv&2p#JBmNnJ?hXL$En6e@P&H6wQBL8$-F5%8XcU?5b*Fg-gSNz9n&@s!A$n4mhM)GUAKQDv?rFW}i!TR#A*2rzkj z*2v|alpHGYTL>A8rHKqSXk#PK!*AVdxU|Gi{W0;kH~*o1fTJATn*zkmyIl(11tuYT@7e(0d~F5fE~N*m z^DJ8I{X@e_12&RWGzC|I;Ys{9dy&_?o!I@b#di^i%i;WAE&7zqvGxaBC(DG%OeO=N zum~j$CNn>V*o6v_GXYrXD8S&zhP3faD}l>2VH;7o*_^@}dAQHyo>l8MM&A!MnD;7) zV))%eIMs8FA$uBzZkKmPd{|R6^i8-AA2JJw*V13!Fy}O-(1ffNFKug^oAU|&o_3g2 z;v0_tT@fZ)T#%?-J-7gs8d|({96DUKVv;m>#X0%%LQ1#kgH{tscZsj?v%clnW7HYX zsG9kAajsp9^bQA ztDdzef>Rm6u!LKZ1QVj(0c`XiQv>5X&e112^dy+|e_~o&eStgyDX;gvzXKySBux<_ zNvh>cj@+uYt`a)WD;>KAwUozV^liAZ>hzcd6s}rQB~+3fr!ia2#<`Wne z;E>sx$-J5?RCR~{OP7Kd**c9beS6!#eGivJqu1=6BNPzQ0RgJcQ|t#bl^e%v{Rj`q zCR&r6y~Z=&lZlgz;&e}ZRm9D~nt7A$q7XpV*9daV`lQPdJYBs}Nv+omZpGfYXV+(Y z*I-bu7UgrQ?|o~X3(I^HXmTXj%np?`nJ zfQf^`DwoF*aI?^ns}dz)Dq*h+c!sgu;;^QUsP2nOJTKJHNhiI?@X3w(%%B+)9ST>( zME@F__Of+FZlsiDzbgLEpu;Dd@7x(RL{EBbxoNGd=e(?OzcM^##PHN~?TI+vUi4a+ zTq5eV>G~96T*$cKd3^BWmB8Ap3!xI;eQqh61$=E*#8<09n~CmQ%AY?K9ESqYoqaCK zB0|iXRji(rY6xA5ztI8JR#UV5G$?H1o3DYdLd`h2ooh}d%>&^^V%3XmL3lYWT|T5f5V5syyz#=Op2i&Zm4xLxih^4}m*!^zy4O^`Y-n6f_L%|1{>q;ssgN|Ax=OQmV+f1ryU%)hdM89= zrpz?Ieab@JXFo$!YN+^}w^dM1MQPaqg$Ev$9>ub3-d&hc?L{hXZf+z9*)A$^MApaP zp#1XC+P=1}(Ol(Vk3(5Uj@C!@D$PRI0maOw6WoJ+2{j?|X}no`Zd$EhRl8EShFSj0 zl6K=@bbgiwrt}1tY9_#%ZvRcO6tK;q)R6%SR6(ZioksH$O+n|s!EP<@JIT<#6*s@~ ztZRm3IqU2Q!2^3;*_O4?Mna-1t@>-sQE=gu2tMEe}8}*uEz=2x|^j0q1UlA%NcMWVa#LO&M z`}p{zkj+lWT30;f z(x)sq@GrJTVa^|n7w0sKw%oDIsdR*!Og%Zf=n~pI5b^f$C|Xk0dNI+0QChA3zg&RF z%~IjouaWdVGMhi$LZLTIQ zdaHIY5kmI&X5v7i%6tS|Y=uz|UZ)3522dL};|hf7z3oopjImWbc3Msio%{OL_SMe_ z%1SIJx~YUXD(J9n{i`O2+fj{)c#p<7MEaWt+=|7@Rn?AgSkj&{Ryvy%EAue1xpgVZ zTn~3Qm8m4zlJoggrQtQ4i6o`9-k%0y)KUsAy3SwZD-=tH+{#6cMg9QH-xj0d;@fRy zK*^=HNQ@g548{VPgh{LBORlLS;(6*nG=vWD(!{#o1GIZ$0zU5P!ZsN>f1+y(b)jr# zLLV~Y@EXGj(iy;LU&n+R&-$?AXO0CSJYuS$mcIXmjYcY!HgG_VR7@s*XZl>xE9HE~ z>a5vGDfmpjvMdF-nX}{LQHypLG}N z?a4nr14;yu-vYC`++)4A_COp8LG+>o}7g$ z)Xr3GMEPREZSEdw=Kc(6I|%>INE4Lq*Lmj@a76Gsi6!$59LlIyC2K)BX@KEy-H%;( zn0-)sNTk$pp-#WOvwFE1L&L$^S z3wl<*)-iN;PuNwlYgg*0532-m30Q%c?ol>{T9>L)-7Q=v}mKq&f;!gnZ;&a`f1ICMLKv1u56;}n8 z1WpB2a0^tu&Splbmotg%dOUwZ_?8!(AJ;|iTK)EiB~MEvz^)MxNMg3)OUmWeB_;u9 zEg$vs&J)_ms0de6j{}T&0-vKP4Hk0_cMCDGX01)hAjOH`J2KUD>07*YYA{_-GJR_% z2Ouq~t<(Fsm(Czf2pjQHwDz-~;JRPC=NVORs(@$s<~^lztLK5i^-7sgbIhq_jn$MK z)eT@~&3B~Tj{z?~oUn6Qvj>i_|t>_2y>n;RHk!m;@>`*;p_g>)_{8-M&byd;IhW&tF^m`}zHAs0w=nNj{AFNx?M?F2$96Dg|S>pnwvFBexO zZmLghqvMb(ajZmk!Str8uj0U?-g-TjL^e$G{TXrzzaMMSePJ|<)g;)2Zd-7&@P1U4td;VjT>M1PLhjV6|Jzcek)neR$>@0F~=&yk>ez4!>hrWj&I`%w&rIh>W zVCpRGdq`2dWf!niC{9exUGr=@bcYv0wdea?ZiS$Ba2q45ve~|uH9D2T-=93A9WT`p z5X{xD6ciZl^J%IvR4aB{P-_CGb9&bi((zu%2DlwttDZnolp4w)`+VktML2R1q ze(7(@i)jW&7gJ`-6M+p{_wWC)HzL8s(ir01yNW%L(L60O z&XLjQQ_zr_9xvQ&B_6rQh7h3gCK^Ws(}QJat1M9TkMHTzeM+Idr6*?^?*($4W>-02 zE_Z5HKiMo+wD@1#%^6)_YRbJYnJ^K+Xq1)ew<;+Ojhw8M>WQ%7d!4*Mx4cWiWp&MU zqB#qHSF(VKa=ID0xNJGf8(L!$cwAs+yrL?Tt2xi6)29__fS0P8?w%IdJ2vJxS*(F@ z&mriYjl-AAA}C+vOn;@5m#qyvx4nbkaO{sqCElt*wEL#VLX zrJPxFv7Mju3SiEAe+aWb{@eQ{nZ0?4)JjP3KzvuW;7!e~?uvo3`(Z9-{__22TaM-@ zs1ZDQ?eGuRWr6>%A`5JP%*VZ5qT+`*JF%eVnzw}?8~7Fzl>xnXWo0Eh;N{u-#jKDv zx>C?G2?Y8Zu2$obA5+Pmn!jwetiRZnkw3^OC>+naN&Y?fSY&?Zf{WTcO#y$h*$Y{B z|I0yV<{iQAGoSaYe=6J6ZtcM{!-w_U#3FW1{Bwc%%Kls;R3}~55TnblQZ=Y51YJM2 zEVLXb#vHoop#?>snqzRR)#b&MTYYX>@o;LMKyl4K3VNO?oJWjdJ#jF!^xP^IOUn_j z5aB8if(8b2Z&6%q!x1V@6(UX?oSNmvOXq0|rUp$Sdad5m9se^P{-OA|lMwctIRz>o zr$z|C%gnT()ly>)t`lmE6!HGI2F^8eZT#^ech%J|rS!XdCAYBY5b~CEGy10cVDTvH z-7U&(74L$<&btWTQctRK%J*m=E}B&_>m1Wr(qd_k?z3u-4g;0FB;0R0P(IlLl9znW zCyBshxFB-XOv-7l5Jf5U=BYmfOSjTALb|;>)oy>TzB3pfpPYN(LtP=xG!PC=07THP z`*U|{aYjfZJ>KAKh3txc@aZdmtO`sR_+T!qI;7%gOBAxc?UC3jgPP#`;VHEhX=E{Q zg~HVk3sxqP^xAc05769F-?S*7w(c+D|6rxjzg!GDhdTZm3oo4aar4oP-yKn69=Pyc zFG$OHk>znqaRO{VxvYSp5JpazjJL-KdwW2&;#u_WB6c~kZ_JvGbPSICR?-hM6zJXB zzCK8LufuMeClx2re6l>lg@g8#?dp-&Gq&mOTZg5=t&fHhp3P@pX>_V+V7{QVvBjE?s9;p;ayZNCJTZwk{C{LFx98GLZEU;-TqbyN-EXf@ zX2TgYvMHS2SEs;G*Pkv>Tgkyj{_pu8Qrb6ot=jbcDvx-4bbJg9gQGFjl45Boz{dKV zS<|>baS+&8d4Qju;I7ou{{|gBQn=n}{(R`;eSQ#n*w#xfi@$Yzuv`~=4-H$34`1!i zyp{&Fy5s1AsJ~Or(;GabHuCWIF-AjMz=J-Q5X8^}q;P(wPXn+CLcai-8C2x`zkH$p3NymUci(#3Fk4&qE0L&#){ra}oGDZ*OlS9!tf)Qv`0^-JUs=Z`Jkk%=KLq zu6mb4i0(VnZr=B7Vo>{g(WQ~qZkS{cEQFww-pqwMF%`J@7dXM6x69uI3>xlB-a{Zy zlDRlLL;w5~jd>$JH^(G0Ei5eD6GfFN=za{a0{X*;0ISY}Dax_~O_-NjBAnOjqU?wa z1BWE~y$(Ne5H4KX+jdsPU3xhe`HXp-#G3x0fIh}^p&c#Ve>sDN*vI>hD5Py`GO7An zq^Lhe0;Af{KpP=&QUgON9tFROFK++7^@G-%ZY>pS^}5pB`=m)8P)M{Tb?E?8Mv z|A3ufEBeXs@E>L7$I^Pk4v<|I7f`m80Eill_ze)$KR`#XUZxM0=1pS2Sgy=eiB|3J z7;0p99WP&S%K6J5dOus^2>Qre?Ac!OVP0Lg%CUgt#p93QVL=le^aC3&c%B_>L5s0G zuHx(G!cX+_??4sgypJH~$>6nLIaV0$Q7otw6im?x_9MC@DQ!bt7k@*KY=*v$1{lMx6E+&BfP5$o&-}{!khWdJ7 zQ(w!C0LE;?pbxq2Kobw1S08Z&!-b!pA1F+~pL{l!FVCo2tX^R(wMy~Nz6`9SK-M*E zdL4S&6G^eN*xG6!(9(|MHFmD67PXZO zqdmyj#dZuo;K-Db97^ddf7UG<&0pyKsnvI9NcP-n>%^>*YU_G@V|O2x@d8298_jN2 zE_ilw-ekA7yKkhJEjg&bDmj;v7^iuCdC@>6Y_v$5q80vEV|1>`ZLcM1?bX6(#W!?v zNrILGn-Uj-4cAL8Q}a2bN@NFL&!P8!c z`HXqwg}*C}VW*LK&M}9$P7lVnU1&_@bH@TTvdNJkq#f{!SL8zxO`9W`w#-5vGc&@F z7wP=YMPdh_Mv&1fy^WZuwOs^u`cpg5E4hT#bEOk1blCgU$d#_ofsQou{i(dX{8~3K zMUx{W12wKIr&{c#u|1aKZGkS3!eJ(dyy#D283y4AFoys+m(BG#gc}d0LRs_m>sR0u zy12ehdZ*Zdwvcy7x6Jdy?-m_hV(wx`>Z^Q0-My~kzTecm6ci)BH?FsLMg!Zi|5h`w zrW#9y(Lzo~!%>m8W&|~Kr^8B*L`$l7ZyqvHbS*?FN6MI?YVq>l@lG86a z#NWJXm)F79jBvXXvRRmV=0W=b$w>O70y#T8RJaCilY*r*V7YWOh##wR zD^jykI_x|9S3omGG6BsGT2w%tOip8?=fDp(=+vW$Zx*z`EXif-;pu7h8ZzlpGx`IJ z7RjEE;JJy)afV%?#CO4CD)Wly9#;&n@?}#eCnk=M>49U-M;q}y<2!ddSFbg~EWe9m zSc%s1@Z!iw$R77y1Uv^}@*QlE>`$+4e-|C~#?eiD!OzKcxHIdQ-#G+QD6rsR~&RPZ90vv82{ZPefiMZTM7zFg>`dEYW4hXt1Y1b(j=(5D;9khdM%~U|N}eGBtR>Q$9%LJ&+n9=@LrGXc~<< zsMzq8H0$>EX8nv(1dg0`8M`LU5@>RnDq?da%=u#2^vur}!B(p4`u?a~IS)sa)#Q~%2;Pnt3SCjhCBkk?%W-teEX#7{^V}}sKa*UGqR(Nv)!XK6!;ANg^l?b}l(LIp zN`nF8u9oJH&so02ZPKJa2Jx=Fkk2@(@0H?5+q%MDbiTJP(#_`%Ld|ycaTp9uC>g8X zDRNeb?5P4H?k;k7uKonkdZ&~)h6D0Ax&;bZDO^@5aYPY74|hJ_*I85Q5?Rw?)>`e3 zARhfU^LS@O}T#zC1P#kD9|G*OP9Mb8bc-klIdG^JYWPS&f zOmLMd;`3#cJf#W6ZV2LPn|XdA`asK*CCBEc9!9&f)iUMxpv7u3du;q2N=KqCq?N^$ z@$30qEC=%>_{j^`SNt8?=Tsz|2)mae865rFdvmeS>B(c;BS$oR`zP5rdF*eYg35BG zL;i-|C!TqPP|N+FmytwV$7-$4VF|3Id<*A=Q3o7U9C90oW2qWKD$?cEmF+9{DO&#` zC&3zfy-20YkJhk)CZ~(=6rmKjuJ`4%`zkZGpf8(#=W}We!u;XB;FI@OcoduJ^|SRm zQ)(1~hbALY5j^b^UAeaD9$lU{W$S<19o&zDrX>{X7n}G*xXg2W20LF+*ZrGK++;xy zdW1zZ-RO$ISRc+r3<_7$k^+M2d2;U_EK1nH-u{Va4Hh$?2QNWP1Z2Mo#Y!INk2fN0jN0TC4dMZfGY|0;v3kF5h6Xw@A^8wk*- z6Pt3$H&2=-1!VlpI0nQRXrKsJu|tNdND2X!R*27JT)MD#L$(h%D_lNcP}2M?gg|2~ zsR9CM5r>#!Jy679HN-oD6$V zrLd_#xBzasA`v*97>8b?OUY#Tl|Tn?9N*IiSu_SF`V)S74X$5!g${k$x4TDw%f&Rj zy_}n%FSZ?`wsLKx`EEpugzcQa>jU1RktX3*JwE%_;@tgy_eIfX$rO_8zG(s` zk*6VJ!uN)~+Ha@&*c^i(2ij#Gg`D*qxdRz;qO;su=l=QBlC`^Pgj^Dwj>4j!q9{1} zd+HG{MW{4!TwLrgeU84r8-dxlw3;?S@u?mST#S7u>dloxr_Nb~VajLh3VQdwl%r(v zDGGRUAn4_`9AviOwAHuX*SrofJX~-zGg3dV3nAsQ92&Ry#`FCdhiTzUzNk7q9A=D0 zUIE)(5mt}*f{hZ-^MCQ>uiw`?Q<(qpLJ0jO5uW6Zacb8Nw%erO-Q--oW{Aqkh_bNHO`Qz`k7}WkIG4JKPeKaB zA9rKM2GRodX^p9ggm%e06vaC~Al;1H#q^?#Au4Acr z>mn*NwD80pXn8-=R6)KU)O@Ykt4Z0}AW+qSKcHE=o+rg%o;nDqyS(#|8G)adJC7i$ zPmV$-+pLrbRrQpjW41j*?JyRumVVXev!uQEDcc1nKym0G% z=KO>2)efEe@PPnZ>p{TX+U&kw%LMm5nALR!?WFHZGg^rHl*rjuyFHFs$Kx)oVzNI) zSvEcLyT*T{dt65KjMdEVXesODMJD;tYM|STt|cL}p&$39ZdxuTn%2)z%Uq;1hEzK;6X%>Ip1g>)JKoO?BbLJWB16o|uu$P&q9 zrFtPz;qMp*2!obCfU&7hCYzFlJkRVhqNU1JXC$1*cT}8 zKR!L>#8(`Oe(euDh|=H4+(FNTU?+s_veX+R(KS{l@<0Qrk&=pis~9rjqI@)=YBTY* zMl;^lp9Kn(1ql0u7z2tv=3jbMrZlxEu*m-djV!fS$E98S3?8xSO_wU8V&Y*NYdi6xF~nxAQx-VI)qSDkO7fC#wcPdORa%e6USTBCKQnm+rafC$dm z0wo1yIwl~>D3a#=^uvGu9sGJ?l>Z|sWxsk$#Sq*-ssQkIBU;+l{7bvNO+hPviN0ET|RfWRZ1CUl&Tg^W0`3 zW7Pg)adjPX-|p~c?Z3jZEF+_M;62HX8d-bhk5TNfJ4%ebSm z{3o!Uvv*`cF0tC9aPd}dB6hkeOhA&N&6DX{sto{^rK%;fu{1I`I}k6>p)n^Mi0|W9 zh#nDl4pd5|s-&d}dAdZyygtI7{%G$jGtCFnYe9wvh*Ra#&f_TAN0xTnt?MqA)M%C zw+?X6SyGN!Ia+tNWLNj+_8M(@%cKj8jYoDOGEeNBoo9qy2RC$5e?SfCLX+UuucKBI zshxSgXryq{EwG^tmuQPm ze()@>&TGEI&iRRUP2YF&srvPe<;>1z$*A|9^V@m|KljQj=t1>zWIK!V1k$r-OLJeTL^xUP4g}!wV}nK-)>PJB?#4sCic8!9X5bT!=SNi4b-(Z zG+%zOrZwUs0ktPW6$LOGPC)6gZ%yA53;mLBp3iD%*uhS zruq4H5o?F&5rl72@b}D1SU#+^M#*m4iXKv=;!zJyHW+xMN+tk%xb3V`sNL%hyda_N z(v>xgpC4uQwUXLE8(ZLiN&$OI0sV-EV{UF-Uc+`aoUg7&{E(75B(ZeyP)%-&y=%WG=(?%!DC!=OU=t zq_t?-d8<3Gus?MCic|Wu0RLc4q<(ElGJ)v@j(i;B>ge*A)tR{s<&~%TMC3a*7|n3( zdTIW-4AoArzvRiatU@54_+%AW#(3s1M_2=RLxt=6yI=z9hL%>HlyRQyrVh$2D}1V} zw_0a!k~4k9d%hD^@BcPfUS#3NIj0iY=l8Z8d?W6dBL@hme~W2U<^}T8?kDS9*fllO zZZxI?KSB|GaE48gwlDGMU279R`5)Ncap0{1osm1yAvbIKv9oEjr({HT}yRl73C7N;p0J686H^C;iLd zCCFT<9L))Gjf13RyvPp7GoUzp?`{BD`C~`&fg=}BIwOW2BB?{9{#9>do6FTU5a_8eSOeqqP z`NlrAw;3v=ecN~A$%a&avg)G8CxI@oUOFOzYp%-I|GelzwuJThR=0Z;&BuJJrHuUZ zF-dt}TP}sp1c3>)QEuH-<)PgnTuaP>G%G>(6_qs(>Ml6NgK~f@{y*;CGAzor`xiED zQIRk}8Z1Ow8l)^hLXa3bLUdcFr01eWlEP!m) zW$7tXl(=dv{*}M=jE8|mAqz5_yXk?sg!pK44 zZSSI;)Sq$ZH-0DH3r}cUP2&n6?*Li7aJLmnLLb7G=bdV83L+c8+ABddzvkRvop(Ex z@r%dNbm+n68kF*>#)@x_4;us72KIcZ?SP=U5SD4Z@K}cl7&&9A*o{zjtKIB=@i*V>~$Av zrnRuRk&%%Nr82!aVDekrT25}TFP47jj?}OG$8o=o5Z7y1fyiJbtZam?HS*gv)+?q@(U=$kG80lMCu<$duoDIm8bCg6wZ;<=m`r64~Bg5yAL7?ZE3ae#+ScB?Y68T$0= zD&aS2PdH6Bc7C~Y9MKYfnf45+o+vEJb;R_hETz87!W~6~Ab41AK7O&%vGEqqCZ|{o zip?Y+3G05u>!?w5}G7NWJZ`2pTcD)v$44KY5pVMpIvbsC$n zp^Hhrh?p~Sv8oLAe7JFo>oic8Jw0WLyK0QM>lQ&M2Te31ZcEU-dA^Er>MiFhYCkn5 zl96Qx%yL#%)_SIm_Xe(44Hc%V1p694-sP^nuEK%~ovE~sU0pkR^2m{Mlg>N!BVq4N z%E%dyHgj-oM%Tgu)44*PlWN_6M69Wo$rL^Ddi?myMdJZU-~H_pA3;P?-^0C)WXA6p3D5OeQ>aSsBeZy%`4e6Ot8J{JT*&T`nhnNghSrO*5mw3JAVvFHu|<4#;U z^(3q(TJ+4Qiio(B%)z?mfk^1{XO^c$GhRg9YF!KbEcwe{oU>?>Il8aO{oKXc=67Gm zTCz8+SSgr&$y+mwU2o{Ca8HQLs-M??(<$F6wp~{K(qyTzp+Ujw5J)p6i1Zlp%KAWl z&nw)=-CNc>XMriNCVSuvmO=lVKHs0~Oi4N(N6Q0$_=}u|Zmf14#(QU#p(d*_LG}=U zqPLVxX^n}&pCEF~qEkHG0c0uTI#1;9xw-Fn5;^aWcC50IAQx&8-@0(4@S8)&MqB!$XE|TNZ8s!JjA8 zq*SFmY87ZuvjqyuQM~$JB@6$FFMn+4Ud)|vXen;~z%pe|*6ifH=0?M63HPiwe>ZGw0@e`4axG%><{rFIO|tc=0+ylEf(1F4T6SuO$purU?~ z(O9L1W{>rz)CCzgRx&9OW?hxYuZmae+8B6?dlhx@v2k(av^U%1sVkJd2U)!81nmt$LY_GP>uWa|3#D!-3ED53K`%T{vT&t_6K&2(O+w|BMoCT^z>j) zMY>A*e=q$1xXb;YbbI@S6)ozTpY2SBB)0{c$BB2}fDgpNW6^x9m*ouERrts&|FJykC&DN0>zf-(|F*LLIeZQlI-uR#wSwf zJ%At!ojepUy}>6Xgog8zgeizapitO`?iy?%+rK}$obWh;Z%0Pj63qY}sP|ow4RNYWd>hEZ&tu=$sU~Fs*$aN#|2H?O) zc7f{>_$P%!m&x9q0Km+3wfG9iX(9EeDi8*hr8MYTfB+7hmXsYpL^tPxq;30zqXmJzXBoqc2ItT&l7ol zb1uO6ziZ&Mg3oE8dH|i#GjLP_XaEJ~jbGL(fS?lr%mK5c7)q^=y(1uKU>378tm^~X zjzZu?Bp8r^+}(4m#t(Rn;3Tw=l~)Cj?}H4DR2ov#r5X?hP!UHtJ^F?JomdN5RCkJE z@;VW&3qT4C^hHai`p#3)-@F7Mu=P#w4wC*2{Tt|xKKc8pnEg{*4Zva}TrJ!P980Rf zYGkTu3=dXA5c0PGE`lV8^Bu{WjjL7Ey63@!h|3}IK-zQthF(F+-8m@!oi%GgDTH7y zZo4Bl2(5c+(0U-l5)dB5@waTYngB-R1gwx~&cOYdvgGxDVhv9NANfOyDWV|j*z;v} z673omVy;BCNwsl)8Dt06X?jtb8(;K)0yV&f2si8z_7>c7Qk^rwzSoiwMoiH%hVz;!n zw;y8GYKLsnHvdUoSj{Ub%DO>l-ea@%x?}HwT&mnpjyx0dFGd6<7|4qCNfy-I+X*H z&bow1Bx0;g)QGDs{J=#x|EK$r*FlbEdN495$q}}3coKp^l+6f5yDEkpd@9-qV!lD{ z%D*I?BX3vi^+aG(iDV0B-(7lr`a&A)s&Y5`)Na5FJlx%Hd>?ENH`jGai{gcJFTJ`Y z=Vhx=(|~BKxWkh@#c7w%Koog`^9B_gJa3Xd?`?^_MfKZ~9Bt-d2t?~*@I*JS3O#N7 zQVlqoHXZ|NP%eiK=o&-$3IHak5}bg(hKQyziznT*7l*8UXB%LbeSswf1R6$wZ~=3o zdFA8dgWvjClD?Zm6a|(zBs}u;A(QirgDJp360z+Ebai6XdkyXJa+b6!!1AKbV9#PY zqvGz<_zC@UgH;%t-cUg6Y;cQUg#>yKDpsl4rKQ|In*dOR1LJG2Ip95e!DkO>_#1U=1jMTtEqKB-o!Mnoogs@Z~!^Zv17+t1#mbVX|o{*hBfuyOp(mbq>Lgs zq0RC!`>&tri`s9@3t58MD_ zM=%HmU0$H{Jc%$p2{a}EGyx?gg)s={fbr-gB2Je<*)Xp64vY-B(IHG?s#g0zAtQY( zuwKh& ztq%_$-aJMV_KG0z2Y^EbkzgM7ai{VCPh z0u?=ac@CS^2d7Y24IS{=~WTvO5&!<9zhI}PV3rc1LCt{^b%0m29+c>OSy+RAhiPyS`>c~wve4}&p zOoQpcQk!QwJiC8|q`p;#LG7M6F~%fieCxLg0a)KX2q`PWId1{G8I*IM>P?WO-$ z+-MyrPu-NVmt9_?{_CE5WSig7!BvSyEG;W5_57kUzPFOTGx=Z6$Gib40-F+-g^w3KyGG*k?&9UX`LO+vuL{JRP&EOAy8u6p@h zJ6%)XhQ!NF9F2+x-4AJaH+H6x{EDlXM2}b)X^^T$-@-&zcCYnteNG77qc3Pb zABCxy@B!7kgQ$H3e2T5Y)Ree9p)X;O};_B zWxW;njpEb9XzQpg7V&IAN;+&lp|+{c{>F60NGvvx^GOkIRk90ri8_&%kn9*%Ri2jq z?DNi%WYfUl?(1l!uuHxlGUCPTMRw*TL%92%)H$B!x93QC4JFg>t9FJh zAA6f|vg^BZgXkD5jnqdq+kXJj0=>gGc(8D-Ki8bS4odh*3M=S-0u^2Fyl~;?jJc&S~Ao_%@2tv zO*Urr+QwEtlbZ@KC!^Y#>MlqK<34zg_oK0|n(N_y7##+*6L~QX)g7nB?Tjd)l(mW} zM5(rjfsnaxPU{pZuj3QvL0b%twk2}E`o{wOs{?@}36J9zc- zFhF*!oBiylfl&CLlN1M2CmNhwU6)33%-WgtO7Q*NWkWCUOc!JLwTt!J^hIoz z_1<(%#~^V(&8yMGjJsHW-e@e#-cZl>%AeuybKyc>)19@u^6$?N_%gWSC2m>`#iE&TfT#7bZ<$LfB2n(8u-febdJ ztNTn(zDzcpW)7mdv_Nyqrp@#=|q z4ztw-(yGwQ5?8}*z>7BfwS|A^N3-kCfJ|pzJB>eMfmVyY*10}#Mj_`cUcAubUtdjSqn&z> z70vaSZHAeIt*5m`C-51~%ci59TwK%{3hzZ$8MrO->Q#I@7)fu79ZfOiHQ?;;P&3B| z+C;Q>38IFI6EvLPs43^@3O__BAb*dVnPF{#ZK7d+-QnZ0 zOacU&AylO0=1T}7Jn=#TMuS>h*XHk_7)49mN~zwQ@hw6&7z>ec-;(i~H>(GFzpJ&z z=pLnWT&8d(DRIr zh#W1uKi@A;KMd`CKj_vu>hs@TfcHp&pWrvU_HC!ml?h92p7_i%PSyoKjWiWIT}dU+ z4W<>Vs3)Vv_Nk3qeXCe~+Q6BIT)LO?Oy?5C4O4zAz@nXJ#}$}`FuW?Y9Wu&pT%(b; zYEF>dz-tseKZ?z*{@Q1~RrTsld|q!5F{2|@t{X$X!&vydskxY`lXTi*v~+ zLRW^%vplOej_fTFeDUeeclcNgrdndU-5FB<6lG`ZNKtJyZ`zQ4(Fs^Ud>wq)-^!&!zEm6Q!=e{o?&I~@2pvy;L?s7>n|2R2u$?Z zT&d`l-)vmj6A##AJsoEoPdg>(V*SMOqVg!R$32U)_&*<%=iJsw(-J^9Be%E=GCvD` zBMW1#v>(mb*JCh$tX%j>4q!P`Nx#r1LGWK%rM6m!fe_42N|bi@FgVHbeHx9(<@VOs z2yca8$JBe^)e&DgJB7~~UmOt3GZ2t`KqlimpWUl5MQ)Do^+Qz-CMcj8<$iqs#qox= zrnMlw-rG?4kW#Is{VTaGlXjcH+NWzupD(!u^DIRsu*u|<@App(wMKOfG`B+`U%5-^ zwLI4O#aH&ThZpV-EjCMgyPt7J>z5fQn%$se?nbT6B` z*JAQ)W5x5qr!M7jUQF}b5?%Kh+=z^HRd=Ou>|ydShgyQq${Wx49W3W#rcho3dGp7V zla0}UQBMvOSO^LkKzdXBHC~K|@HJ?zdl6UA+FG;P)NrC$l+VbwirT4}rirm9$1cGS zJhn$MK3jt9fj-7%6%rQh`>8nwB3gny&ogP7xDeh|^F6eylXIcLNQ2L`zQujsz1c(A zS|*DVFNa)pZ=LH2f0V1Tk~6dg1oMT|(IOAal_wpAx%KdwE*V#dGYF+=8j2ZPbcIQ5 zRP7IY2PfG|p;nY~aNkV2m)AC{y3-Xn)}s73!4!cu-fd*mMzsDNLuH!|y4BM$u-*ka z=#V*#hv)saxo(Pm-F8jNY_)@Nr;CE;D5vK4SaGZJIh|C;+ff?1+}aH7e7>|TJ2GAt zCTBO*!UcoOx5vvxU&#k?Yp2Q2YjGA>w&~_5c?jt>70@nhE=tZiZ0trk(JdKtyw3iU z{xZQ7&1b<>`Z>asPvqoksa6@KzR2)*UB^k*g1(s7dC zruqSR!1#o5H0ZP~ptkN+t8w?KMG5NpJ7*~SXsoYsP2oe1#!H#IjtnLYHQasAcDQr3 zK430Q%YrY*{KxPUAgJyy_brHlw;m@ptHfhqBJ+vLw8~tYA|{YmAljEvbZP&MvgfX+ z@w8c)2}UD#v6_8ADbg9Kc4Xdz9~IQB zGTI1H5^2(b+fie^V0Zoe<_s)E3i)XT)E2aDP>`qju)6+Iv*;<8=gc5vD z3l@vDwa`_r;>yjG-zBU){J7XC(Bh>gq!M~7m9<4wF>9%yL4=a#@cWm5%FMW>;mX4n z#&AAkOo7{>sY}?e_Y-O5F=)hm=}0HGZl|+WLH_g7h}W3IRP_8;Kn{s%k&(Cbe!4%b z<+q8Tut=fa%YQk#l1jLhvs09z(T}U#J=O0f4U6OmTdq#<4}X_e?z@u-Or?t{|6sq@ zl~(!sk}GE}K8(95SVY0&$Eiv0D$p-$!WxON;Stb{joV+H_BE}Zy=nHmZZ(x=o<^s{ zcC^r{rM)^LFG|!QOk=h}u0;VI)t~LaLOY-pHFfRq(Y`^o>B45*9>nKdnvtZYHNoilsDL-J8wWq!(1U5}kZw!9*&XdX{e0h%c|E~Y<=7jh%@%Yrjh!2{YZS>7IEeay)c9g^?Jz0Pu9?&pYu{%Nu&)ca zxQLsIsdM5;RSoyv!oBjJ`i2w9oG7-{FMZ@!Az*f2_VI}N4#KEF((l{!7YYk*_vnJB zN_pR&mS?;Zar;qllA0}JeHV^auKV2Yi|xB@+t(e!xgrM4jc#^NS~=02!7G0pFCx@@ z3|wNpdUC6mLMTNoCu!lMS^8a@?41yXUNOg%2P{LypT%8DJfza+VLHO#VC;dV$qIDm zI57z_UN}*!?g$po=4sVw_5j+!Zw`A+n&7$BhWK_H7f8p?ufOZIl5_(7{LwTF{P;zO zl@&4`38?NfZ~t7?ur>PZXwgmb(#!E9gJEKBn~*f85+nUxY^c~oaNi;hF0iXS9(u3e zZsP4rg}2oc%)Dt=evQCuPk5yeY~KEq)1P~20V%ZG*ECRQp<$&}H~!GT&2Ffqfw-=p z$91Q|UGY3efi&jp(@O8usRC2einR82Rj%d1Bzs_3Xq_#MBkcZaD$Lu}J(s){)Z9{X zL17`3IA)HuCk5_TXIB=;Vnj@7{lf2xoRw$kr=gdvGD#(u7vDzg@Z9wM>ZJLAUUYs7 zckni*fo!zQYiqo=AtQ(5cEE)pB*E`04(CR5IU+~5)cXzl@rt6Sbie8!4(Sjp?~H4U zG^Mumkx@GqTWhP&8<(!^u*Y407?-TeDy^?YM;G}fP{()F?8~uNrX!=e%1`({o1))% zZLtOG^7O2AjUsHs7<(r-k$t|MX7|tFt>n;*A|=H>P%0K!w12JZ{>C-wwZ&qbZ(V81 zOUGYI_4!tb&Cbj|yFrNoRp3az4Pp3Ai$U>Md)3{^iI*{@`1VlA7%ogRR_@Hqo>yC1 zNZ_Q{&pT1ozWDibjr->%RTl#z`4VoKot|k>i)EFv%{FMIPpk|+ec_jo+c0u?EU<89 zM9gj=BPOoOO2BH~cCCNpoZq-y9? zX-9LoQuK|^v2)c?4G%(CWZM>*Nj*Io=W_#`gYr|O;elyysw+`t1$+v@66NJ@JFj0t z>K_WG{(N?pLv_(XmU?#B=P@Me!1?mnZ7s77Z;AZ2bZRhTM27{l&S#S2SMadl+WV8# zv)UUi7F$cBA&er4=jeGj;JhwpommJT<>Gr4`kBM78yCJcn zPCpLzsE10eJXhCu_V|~EnUd^>il6l)Y1Vp*XsxnHR}j={>s8|SEf-BYY3xAf5Ajec=JiABNHMuh~vJAQ_A!k^moUiBvXY>0E#~9-b zO7ZGBxOX4)MYsq!r`bTy96?K!t;vBxQ`wEhjfrnwTdc2r@^tM4Vni~fEry>;Cv$~2 z%lNLQV8vu_T;os;8_SyBNN+d%B1*odPyOmGI!hxtBd^+I-#z~=^}Lmrx)Ke)l=nJ8 zY0qB-5kX7=8FJm!l%$JI@vi`utG^V{3w_?3>sGHU@LEb}7D;V9e`b-j-JJQUJrTqy zHd(9b2=MPg+~_V+&j}tCKHP~^l%-^fyyDRnjEp(_?e&{m8kRv|KQ!8wMo~Ln_18Vu zpP9*T9ypABZ8i}`PtFhKBhQ5A{ms#8XGlzve!I>fxB9*gmmTsx7p9=GI%!MG(Sp`8yn@08@s&x_9u=HWjIjUoKq30`Df)%RnaY$q>ISvjs&s3K3>M*<%+q5 ziI~*{eYDpxx+u$^+&aRTt;g!NRc2VzqT1ul%~_^3pGU2_=?`^E=xr<1?XO+*y@7i$4YV9En`pWCYE-3i7I7j? zZ6QV`XNA}ldl~uZTHd#lF7DeqJ6?umxN5a~wE~Nys1(zY=%d+*z0|6Av~8E(jGuQ&b+-5(llu}TS?{QCb&@BhCe_1q2DbdYFJlL5WSKDS zOLov@wmC;KB&amm`0X3~ZnhwfS{9f}01WnJ>xBaOyucjC@&dR3|IQR_Az}Qk_(4#P z7KwZZZ6BaRr2Plv_&IdAb+wh&a$vwfQ0drW-H?FOeNo(T5}*q{w*dcKSNVLFTbl=M zh0VnFX`cZVEvO;>t`GO>%0TG|Z~_n`R5?#4xn+M=mudbetU0)?s(OdXcEoEZb`L3g z_~PmNkpQ{}v>e)6XjvEB!sZA^hxfs{TZ1n(9o@`bk595|E2F4&{rO3UPaF<~03b=^ zaj5x-I8kQhFX>)#bJU@m!5VZ(`z{(J-_qh@Ht?GSKOGQa4`Obr6Fs?= z<(4<%epbx2D4XH@>usKR8J}BE8_!a%FO3Yf)&O(i6JXYvm-aymgr*nxS#qj>$|b4XO{?jAAK5~Y{;H1T znRk>kd?TunTz2bUKL*E@MX?*bEHkTqN5?Vv?X+aCt#qDfIki#Fh@GE7P$Nfg$wt+h zZtcj>MSCOJYUK4-4fc|#xy_QDHsS0BYn;m*(cDDj&^N=;elE$1_SM0`aWC}nO|zAA zb+&EkgxNL*jfOp&yK((?>a7y3#D!V=!p)48qVa^c+xJWCN0+9i5M_?$soHxh0PF(t zTE$BrLlO=}kT=os8*BBlh}!BxiqonHz&uz0#EIBwlc*T=K@yK^UI5#IU-w&$=t=e& zSXdyhlGRL8@w^Xw7f>MY1GlCmsv}BBVJm=9#2QR9U~n4^%%lTNpE;0DV%WIQ- zZwJi*{ss1}nkQeJmK#3E|D;aQu9HezwO9g^z{<{#q7c?SU#ySbaKHK%pH-QMYA8Z; zf%}bdh2zYOtgF@h10elpT3KSU?Iwsz*(0MhF5V|Pms4VWMB0`+295iCF!hRX`^X#x4buVjHs1xX;u zi_|*j=R9Dstr-AbYLP7gWJ=;s0teWt`?{=bHT>fwvG9fw##ueb9p>I(_F$O-kv$){ zDF(sPK;!_j&ieDcO}wT%Y&tj4_-O@0O$G!#D$*^WT0+;2<#%s+4_H*;O;W#%+<7RPI;Mzli!c`7J&polMjs39pj8An-ow?iX$90O_r|H8Z!;9{5 zpJ>@xi@-Po1;u3dcR(@Fpt&_t-ucJH#%ghcENwH_DB>{+*sj2n0fe{+Vv)rJundUH zwbaoVV6~4Jf^!d9)y_228_PmJMjNW?L*gE6D;Lc&9hB_u>{X{sC4kPUmwIzzqLNHJ z-AEt!`Ez?7GD{Vf>gPC`5)|81(XTpK*0c7h8c~Y|77thmQ6Y!pp%IEJ6Y@5?(vf#F z{Aq(a4A*fk%S!9BA88EHeVXNtR0c&dzMBytd8pJbhF3h_i1Xt=CGKI}H~Q-8*rm|G zJFsI?jpU0X;>w&9PzdJDm6Z&b;NWAn)@Uj;$_i)z>Xq#Dc1>q7p)(b% zvMa?8U0i)fG;d8ce-dwe;>?6GK71)$?jl*?A*py?`OY3_iTRNkz(O- zXcE6s0ZoFJ-U*{m2BkcK^GkNR{0hw8CBUib8P!Nt%D_m%Y!#pb-?0143Y-a78s~Tfj49P#igK zI)T{U-95>0;i_lKr9c7GN8thNS9~8PLz8-r0Iar`YWg75E-Z9=nGfK8I5B?Ur=#eu@NGfSk0Jl2R? z;w)&jVKl086y+OM6Vq|@pVMZv94#~%|jy3(f2|e+vlNkyA_QM4!15e){ zRvug4^kJ3U^y)7SVYph*hi@o}IsHf8E%4lc)O^3N=X~zB5O%&j2h8{UWK|RA{?WtH z3-|Jdd@ozR8MR$=sP@ze@mh`5c_!rG;4lY_Hkf0!cp)z#Awh5%SQk~>f6iQGR*K{! zg%e;A?d}~KRN=q?R;djW zIfk>NXb)$1NT6cBn0rg&>HeloJaxMfX2hp|chr)QXT+&c^fh9{KX6hxqk5EDzkI7v zMD7nn6=$}pD!XvzqeuOAE!(g8%zux@SS)y8(RrgqzotLE>1Gyptwa*SvqTg2Tx;g@ zyEnbHxyz zmTr+aOSW*B7*xc`q99V@z#CBmF9xGUBW8>XQkK4cFNgmF zcM@RGaK-NJ?nbBAdCrZHGLo7fl_O@aQswX=e;Uv-R_#aS3`bNVxt3tzAvo9ehdZ$? z<}2%-;?Ea*k$ZgQ7;)}VRhG@2Y3U{Z4QBo6jCg}S{%@uYb<;+X*4yO~a<@czhqH`M zhb(MG=1S(EGATlqj2sU0Z5ldWyO4kV>7m)mv^TYUT9Qjxn_cu#-FPo0xwEx#zq=er zh&9h1fbl5s64L|h;QWJ86IdXtE_Wn8O1ukK&MM*f6j({ZCu!eS@6Km!;)jM9Nir2! z^(4wajKNEbfy0tT$U+79QLP!|xPM7GkFJYli_9N8LC#}@5r(ZXUM5M}aN^=5Rz{i% z^N{-ysIyQGqxsjbEoHRKQ==K*OOqCEv&}KH%lmu_eH>VLZ1187V|l3plfj$UqvvHGciU*`G=CiHJqu z9^@|NlCNdqSV&jEjD9;KEwo=%{vQI*VIVJAH9U=fGsV3Bt(C<8z`W`YhxaJrAprs& z7uxMB9FA~TL~%JJ3jvs8MY;h;D%5bv)?meD0@*tBTx=@1!5XRsFy6nn;5j|X!wtTk zUm{phKo5Tr_`a`#);BgtWMD9;2omGHbZHFCmv)(+?t|k6$=z^b;=(>35Z!>IM@>Ni zWOw*tqtcm>o|v1{0|OtR5*xwLAJ{;kzYuGHxfZ6NI$oJ*=u3fMOwDpj*!1UX#!--* zpirnl~?*lq9>duza_N_Yqyt>}9j4-U3Q`3*{VAen=cC>stU z$X^VNc(Z`$oD35w$tNKR?lFQxQY&4RuG6DoG!17L zEIlyzD21VRU}XcN0UcmJp$-q+{3#enXE%fwNV0(VsOvU|t1J(wA@6`=NSjhG6f*g= zH~-!yLgkiS`YdqxZUCYLxjhWF(f$5B(SHV{*eMUr2_07kSv8*#rU=AULzThcH3eG_ zti0>qUubZb`)e4|dmAWrknWO3$xt2wt2k4R1i4)Wqu+|BP3ObkA;@v?#?-R=UnsH_ zLEXs-Gi%B|kRB4~H@xUxA>J2L!uzd3uFMEkSJJU`WQEeN=?81m5CH~D?M*<03Z!Jl zyayYTK(LIe<>TW6reoh#U~I0#9RM0#u?ZLKMR>YGLX9UA0WLqUG%~=pCz_V7s9+=d(x8}RkLssUG9Y5Z7FA&exDW%g3DH?L3 zE&1ifJN-|WLbVi2cwsg;9NN-bxVkY|(F6XF_>#ElwU}4yu$Yh&;AEDblBu8X4+KI9 zSh_&i12AIb-C1xpKc7XD-O!b-MU;kN%{d@Ov4Mfr2_%(cpvxN2VKze-18e`iCj)!5 zuMiVPF!K)Fdqqh8ij?3mtX~U+>kTM>6@us!*S(1QJHTPo0pT^+QE{Df0~czz4^W|q zUAYEi=xN(Zj~T;K>~-A^6+XenEt{|fwy*XbJMv7RVT&+lMQDctSEhl zQq&<4q9z=8+2H8u5ed~*reSswGrLk449kOpvy1p03>@L)+H0L#MVJ4j$|b_bHTwSi zPLybnC>)4wP;Q5YYJOPZI?(_VUcqXhKI<8bWzK9+YD^S)WTc~~Gc|Q-0&zvgbx{|D zkn3OWTnA%=MYt>EH5Rs1K+ScEF8cx0x_^5CKSYAk30!&WbRBvx#FE2# zPpqRhPt*_hd%j==4-elQDn20U-nlLUix%P*c!d8aS{EGN6WN}|E0j|itzg#rD;VgX zE#7iZT~o7B>WMFK9eVS;eR58y`eFG=FKnfd4(A673pFuWr%wr#>#P0s;k%RN<=w2JfuD5_tb+^65A$M zi@msbyheOuuR0}F41^96p7_k*x9~zPQ>dpgj)`mc$7I$j{{s8?%JoID0?oi?VdAZQxkr9~NOB&XS ze$On?BVE&xAPf8E02C6tySur@mAgPeha(OR75E1W4xov;FONY0h1W*{*L`o8h%zBV zcM1aUn%!>rJH$%JE}da>f$xHaK?OuR8*9+I{5^c#-{K>giofB_<@=!`qG`3z-|X9y)||aOn{)XASo$H z>W-{z10@|^%Ludq(32)Pvs{&@pr$4%Y~XB`EZQNR=#J z2T6GYs*ogw5E*F4fU^NCLtYqlL1+>LW5`0FgG1exRsXENyL%08Iy5-;Kv*$UWMyWt z2&@`#qL~8KE4b7_bbblGnR6o~ z+u8{8Y|wv{4>P`Tb6@CmQP*v_I7BP6z?1v$+W5e!7ouUf2IL*HKf1=i^)f<6)*9*Z#TJ!Xrm*y&c2H7cEqT^ipMMR4$-vNSwF`E`~x%d+FeizDF%Z7hlK-1^}h z4;Q23Gkj(_U(gXOTOVX0T?w44P63G}FJF2NZ{>NcVL z1WEH7M6N@#NuLZ(>Y~3fn$Ud6OBND^DR(VDvD-I0RCkpFFXcApTCJKouhni^LE7;R z9mBgRkFED!`H95d@C_O{na6mp3mQJq7v5MJk!*B7@t9UiIqZh%&kAw;i;JBQkY?Wuh>UOPRoZXOl)*AamYhu9v0_fSQ;WX?Vg`de-&3=(7Y-97K zIg<#Ti}^}@e+X$dRQ3NVS0znL2 zmw#^IP*xNvHFeIj}hq$~3F`+~N za`a`4lu)49_eIrBBiF)16aEZ`!#!xX|on4(>~k%mc-_X>9&6y zlFRGfc`t8M8ocV%bQ@XsrTODC(SX*5txPG&Z~T3qpq|!eF9TAVKVdr^YDZll%ENwf zWx+hD2!J3A**wY12o%|*OTHS(Yp@Ab3h3`jMZjd{6L}&?-9&Nkq2g}{ptS*^78DLe z=zVxXBg4b3$xbX!|K5X3#~}0?;=6eqhLZ+0vch;`r)%;TkY0I)#XG~L$F)P^N@fZ* z5+e-WI`hVe$_>kp^5Q(knqMi%zyio!*)Wu?eqo(pAENp23U!<7nj#JKVVZOw zJKX#$z`6ZT1ziJ~a#$nZhD^uKLQti_rXgvUpy#l;uNyY@rr+mjF|dx5{~?<71t*j- z{22+o7F4!es(*kQ=vv%k&*V}-FX|`W_xBx*2w;-TT=6{5p*jq0DM+LT>!B=?H&>gI zMvFCgg8=A92j_t{0-`tMci?cW3|TYfLQ@t7`oej}(i1G6Y!QEVvvGL$6qB3gbzfAA z8$2TCYDY1H`qvPpUZ+3G9c@JEef4XW?_oS<_4YdIl^2`n@;lJx{pU#I~;QLl1 zI>#%wA2sRuL#k;(t7&|3QrP=Xu>EefciV>@?YOG3%7x$Ix3B(D-rjz1Ur2~tXDZwo zTVa}#RZNgD+AnJf;iO2An%PiVQxCA~vxMn^ZOg54_CswWZ^5C@sl{EVIgArxVLUVd z$QWdyIEOMEJek#Np*7hLvw#72v{4wVTZoRi@Z|sLX>Cc`8@9C$(6;6b?G@~WPC?Vyf{jyJT=>4CC z<=%K)?kk-NJK6S+66&}`#gQlbF%;Cy<*Y5dO8z}76-!daRpTlF*YagJKM$(JZwAM% zN_oytkL;;k;0Q|GNmnFFagJ2&P4;-?9V-ik24f!1b7{qFl##X|-laNc<<07~(uCRw z>BycgUW>4oWuMa3Sj5&jkcO2jV;!jq7wSSfq2D<4=~@t-k8Y_W!hpE5##S!B!IdY_ z;l01bRvB^2BX&}8*met1w%w#T8sc~jYi7j|zq30>2tHut<7)>utD?i%4f@Wj=86fo zYsD(r;+(4E_$>==d^9S-muH_c%6!H+Bt+TK+>`Zub(q(ZF8!y6#_P>R$Su+{No50! zsAeG_n5YYkWLJ)WRPFNwLRbc*-O!Rbe_iF7%|0{= zNtI=Vy8xJQfToxSJUt7Y8uw(F#h+i252A6nq3iCcit^FD>faE%r!WO6X#85ONo|n1Z*s-Xu5gp(PeN2YcJy%K|Ruc}d zw3&YO z(IH?m*&eN{2@q{>#X{FXOO-Y8pz9uoeHdS~wt)L^khD!ntZaTsj>KDq5TBtJylae0B&t0`E(B08*5jn+qVexYKlyh8+}C3)n1650}Nk1M2_w0)|JJ zgrD8C?f(WK?PomX;VaOy&iWby{R1cwxMTt6bouq}+~w=z@DAXIhKI-}W*_Y`21X@+ zPZ46E%nP$uvh4{PJIL8>Jkm2qw|Fjg_35&xQc#Xpj{9z_eQOA1kGQQ6ip5&(nE6$U+GTU{P5kEqsj~jLwJ^hI5l@i>0K37Kq4A1BWzJeO ztHDT`UQWeC8sWfcApduKaX{0qL7ML1SSax0@@7(ttSW*cewitxUpxH-%K1CTFI$YA zbz!McrM1Z6&QWm@+n4b=^k<=KQykZe8t;U0gV@Ia$4yL4VIf{Z5(J@Awx}L@rBRS0 zgS?-LO-2e7$RxK0OjiFQ9?w#-LOj@mj=sW_aq0qW9a|VX001*s9T*i_JaoUPf*pgB zM?RSOZx4CdWc}!`G050LX7!9y8_gFwyaD{)T%EA?5i* zl3jlNL1tv|qMor?$x?o-weC4#)$FfVbG*(e+m_y_#e|o;?5*^icx&q5L z5Gta$v8t!l2l=5wCr?Nj;ic1UY(0A%whRn#e3JBFx$kqtd^*`HmF# ziM28>;*wIIyr(#+U8G-%|4B^l8_63Uai}qy@#B8wJ9KNgTyR6SBZI6#bu{QAwz$`F z0O`iLsvh7X#AN<2_`D)iniwi*=QDECKYZERP5d@=>2z=Qtc=I5_sPYRA>LI?-}FCtDvjXMDP^nSvu61zvjKt?&Uny8K5p{2+}_gqdL#K%w|Daw3^chQdQ_F;zK| z2s43U->k0eY@JYw;E6g%QW6q{>jzKtpj z#)pJV9sAa1J%u02e@egR>~PxUa5-JZ7g7*$&s~eR*Wd7Pyi+~LA@@l)t2Fj7b5C&3 zLLfyp{WB|k7Cc+uefixfWE=-IQMKP6f65~)7_ar# zVL5-Tj2lLc&&*qUob=C^EXshEAfP;;D)IzC2)tV&0XKmLmN$&NxGZX%|3nVD9IG=O zve3YRn4aMS`hQ^0JbkSOD?Z~d_wCS>;6<^yvT>L_mrY^y2hH|KqA{gn;M2T4%|hL4 zjq8EMGs}p*!MO>Jsx@s^eiNyCtG^-`vm1)NtUO3n`7+4Y1*r{0y5~_idLL@m6l0 zTv#Q9ckpebsFX3vT>b?Y2Kp9U8Yzu{-yp9-yN5>KO9UF;yATqS<-Blp%j!=SNyfi*YSJM6I5-*{pQt-{ZSO7}Tekh~oE@#w z)8C`-oigrHGCO5mz!H#YSF?O z$RJQm0J?F{hA=nB03#j@$ReQ2mgQ;t8Vp9XJT$Hg_*-FO40+u|p) zmRg!cq6K_6t0*P;xR!d6)sO1BmXLulI%K(8T$(G#GUU|;L|n!b+sgSL>OFtJ8#t|O zwIm^xVlz<0`A2luZUq=TtWv9bm?dX)-puaK39UV0C-;kAZZAzLO;oE4O|HoGU7I8xWt^jWk5 z(>x}k-*({9{QoicR#92+QM9Ovf{KVpNh2to(jiJC-QA#sgmi;Sw@7z)w;&-(ry$+k z-OX9J_dYLYoN>o}IOkrT_E!A(`2N3GYtFgmEErJhMvW~>HSB5=ZF1p?=nQ4?&41hW z)94}o_sNQ*c7@m;7cT9CVIwCV>hNAy#TB`h0sg`fM@{6yR^yt4$bwGymck*k%B0>( z|3J29Kt%y4pa$j?!0Xl2*20GfB8XqWVLypD*ut*4wo(Nrh(YL$?Cg#JYx%Q1j%#T6g7{wP-K3XviG{%~ErS|)IO zQ34w~bIL8JFKth&R@h9wOc`a3N@Q++mbT!Atn4;M>)3`JBOJ z{?p0=t=A3T9fs0zAC|ngyIr%`9&p3JVCmZL-mq8qqXMXe@K}t~V&Ukhhv>cSLm+7t zY3(w?V`J3-(r^V3W2^3L6Hu?ejlK6@4Rx5W9v;yxP+L+DZB2bUU?3)Dup4~#G~w$i zunT~9V$zceTi&yHNZvi!9>JKL+d&=K;Bs+myl{NLmP(EG)cshRBX(OH)Mapl9G~`;W+N!iv$~y3z2)Q=fP*Pg{3b@i5VESLE_Y2 z3CtDBi#JV^P?)bwj+N4b^0M|buT=Ia{ z{&ILs1AlwtVJnvVt5#&Pn_dSG`r!JzmZ5?231UMe5U+pPM}&>q&RKEs@yM7|`pSj- zc$Xcw{(0Gd+4bYC(hZD@o9YaIDb0^;|N4piudu+~e_)XRkMhU<(*yrMzl(3UR~%31ZEp;^Z*kA$7MUFs(3!O5Umt_D> z3J#Jimwy1YE(IVNx-tRKb2cJ^1_vNy5Fbf`tn051U*Q}nx1n;2X9RS`foiCMs0|0P zsB9ayZu_l6_DYiAj&y!(fk2c5n{Wf{3ZdC<_RfI16|#u#yPd&hy&QddcIG`e4O9(; zK~&jp#9SYKH7QrxKv?A|PG)E=GTx{`0wparNLsERnLX;cf!+th1nvVa`*X+7_PtE$ zf#yLDt8;eK%Lmrkb7XI}otZ8gNE1z+=(WB%lY{6sJG6;Tg*~veG?c^Ws&{Q?PEahA zyStc)t#Y$A4yrD{=S%{DCMtoON}B}}wohfwpTMQy^LV7mw6O726q<@vzWOf#OnosLLSl|%7+uvLl^SC@#An%J#pg`o4_T@uaU z7$duL`}QWMy&ytW30V-%%Mvs)g+5lZ@h4oi>tNK|7)m=26y=`?GefS?$T#t6t+0;jn>2sF_Kyy#kLTmJ;= zoj!3B)EV&Hc?Xm+7$?;>1I$X@S^}yx!(5FZFX5%!3!l@;>Ny&T(X`!%?Suh}Mi zE6|++N;Th;I5jB52HsPk3_lmOs(6V_8;jL9Hs-X@9uB!ZU|XyF1rzhpqa@7qM_DRH z62K|+wzaj@!Mw}S!0RR{+Du#^?4BK`E~`9)m={<}%^g|knxb8zcdh{ce{Tj<9Geya z9N#E-tk1-wr1d`2%ma2^_Q0{WFGE5NkQ{(;M#xq)uj`;3=>r=eSgg;pou62b$D^ITt@`hB!2Z2)C=>ysKofd7L(S7&BOTBk zV*&~GGD4I7dOfIPfAmUL)?^g$=VY#t>d5p(17I%Ft!FYeLEU z_H%yGgvi2)j<0kL=UVjv=pB~gb4}EC#+7Q@OHna@u<$RPIym;8-d~ign;ueqnt=!v zh9)Unr?T@i6vB@)9m?FbDzqP9ElY=I(P_>e*i^zBwT z!HM;Rk_a7SLtW6TJz3KM<_y z2@>Ct2z@vdKv*f$&$yICJXEYFe5V6`5GZaG@0mhnp6GU2m45+#XJz(&wyO4BiU=T~ zmy<@l#1H=l3NsBb>FR30zqXnJN^5JRv<2%runK@73nnd3w{EhRk?>Bb5)M}WEJ4A9 zn>u^~PGG}*qaXkQwcNF00!m@Z*p)X5kd;B*!iprQ&hp!SLNG*D$`+P3K$pcVzjJ?s zxm)dh)f3z&tR_)t8P|b<1?nofsy)wvhjk3RPQijjd@T+INdu#9qqKCtUKdcRl5tBd zDY>N6;7llsICu>E;mIHyKS(}Ikdq>X^dN4%pe`6>8dQk&ur%=iK7po$xd>#4fZ9^T z5OP|Junim~m)F9@?AZtAa@j-t7o?7RS$a*jTD1-kRsv~INf4D`FCQv%sA6e$yJ34Vl^^(%q#(ni(3;O#O ze?8wuIQiFDbW<(2e9KLhB(v*Xc=v)Nkm)t8R=2vAOzftBAc2D#wZO1kPiN2X`3o8~ zH=$ycgL%NUMp^4sA`AVD6WaR@gR>Ct%?VGHXEoKOYYkj+XBz)RzZ@r;Eiuvw`*dbY zQ{`mg4;`?n*6+?9`lPp&>7PDDWY@XgMB${puA6%Y@*~BwtPB^fhQA|!quAwnFzr_T zD=ADC<2&A30F&nT?#)fk1Cyg#m6hi@LHO3#XfOjr`hJy9ZbxLrL&oZ z`1pjY2b0`;vC$j7)x0y8ZtJhCMx>k{2z&-c5I8lMHh>!+LgT@h@lmk=u3xA7HWSQ` z%@aL%>3YuIUfLS!+aCUU0|V`Dc>`1%$+|TV%9PdxM?vx{FB06Rs>DYmtI$0m{L!6< zI-HQ(o`IIyE7}_V2u`58zwS=nm2C9@QM!<+3hvE4A`Z)Et0{fwJ7^P8&xnbMSH}1E z_oaP=n$$MkZ&A96Ws6fxv3u@&TJYF*zfc!A1~~tV1|w#{ohMJ8WG$9~xGl-I!fe9N zR_F$QGuMadkNDUY>DQir%5VC~q0kKy3HZWc+)uHNZFF1Qe|Zef<-7-ncd(dYFdziC z6J-TkP==Z3em&@Q8XhxR$?NuF_-ra0`k5rf*iPAKB;InCh91l)U^>^6BmH5R~1C8i1ZWo`6`7HyHaDH#^!lX zEZ=VQ)f@-$A4zE)5*)XDdLdX+nWZL;t8Zk+T;aCRdqE{;hmk7HoFu1$@kL5wH=JDf zlijHKtF^Ti+~qaNiw%SQ6Q>2wSHeRAL;+Ko8b*5j7rB*MSp@+hA(LrO2TI1&hTpQp z?!Pbp>9Da#Q~wA%F{z@PUaR)Ps;%n&^LVZcS@G4mxGrP;DZjguNyx3f6k#W|3M1gy8<$=dsaobY|L|Q@RN-_CA_N2k zv`TJnZcgiE;=uL!c@MNl1!?wPji3AQPl?x3s(maejPsXCQ3QJ*^O^zT+2@`_QT|je zxt)BWM;=m6vEP5bpI}W?n4J9do#&0Y>1pD?j{$)%GSnxUX21NF{vwdgG=h`T7`RPZ z`}je*q6a@UHMKl(dUD^(8A#VV^WYGJV$9Q+Jm!{QH+ZtM8UDU;@+kHrugIlgC@{%M z^~^6+%Wc*MeLRzslaGDw)7su%jZj8%7Vr>i?TlrkAJxJoqW(CN!Wx8(a;#kE?114U zXzc9l%Du7e3OV0V zm2Q?8^w3RM1=+r~z$2Bk^RZb{9`yxr9L=)3@pQnlEqWrHq# zs)OEvfwsAb1&I$~tFx=}7Lnf>`I`E=*}6#Ex#3qxDH`8H3{>bu-R=MiSb5v_xEG)Dp9x_ zii?YbsiQ(mPdGKUD=9zJK05$2`jkWbZ-_V8p(3(y0*Tr*N=1psfab6WyD!Tj<*|=- zyw`!O{!@8j83Und-V(kqOsuRz9P+q+n7>v5jaNE|ma-lj9!@fgTYr!q>m-9sE1h(M z_0hdYA*eX0Z%~mr!G^ZtZt^nvB29zf?J%i@;EIY0zLVQ83T`EJ2bh&dfar%j!ZR!2 zh8KaU3b;h<1p%re?s{Xnz#w)g#fO$8MIUp)r>RX4)DQ4WXn_N zLQzxgWYXkE`XlwbKf;mKyMJJ1chk~-M;*dupcVZM=VU|y*E#5hKKsB|SsyB%du~`q z@{B|;#rDHB71!xwgoB)_CCj!vPQ$aOJ@t`V`wqAP0#ru=Pn9++N{*-f#ZgcW((rQL zBAz<-GFlMrpD=iEaZz;tEWTU*B!K7mrSmA-xew|aj`7i-$2}n|-r_vWwud|StfUsZ zL()YwzvnDi_2-0%IR~WC$ManZV4$`45xE8{%4#9K4LjJ|;~x&?50U2i?63da4M=bD z_TVVgpT6UAu9nJ7^XM4+ULdpVn}X{4QN7Fq0jwOER79_oMVhdl$L^yZ##JIVVj)a2 zm!M)}qw332BdOOx^J#>uTkz@{ZvC@J!~0X|!pD#{?5#m^Ui<7{%Eg*Wo#2a*{oZ1r z^~r0L7}c0JLHI<@T{a*%5HwB;Am@Lk=&}&rPtM7yx(X=JP20fLNsRVfLXa-)9Ua+O zTZf%y@f60c+NR4WD}$x(uP?u3N)!n9p!9kN%k|p> z(46w9*YRGcY;2faAJ}OqWt*5PC8P!zncYsoPA{Ezo4cNe_FD~wAi1<`QY)~Jh3O2) zU-ppHBfV=$k^E`1$$4 zJ9HvPfm(n#5A(jep+{C0#mYfPBCA1i&FwFJ#6}5yV`*}@H+5)?EJMe?+o9IGySpnm z86Oi)NVz+HSG|wf&K0qv#=@Pem?k$-Q1<$v`B=pUT>Mb=k=7D(!o3QkHh@h;t{NI6 z<%Ah6L^@^Xe_fpLPThef=^MsuzQ-Ez+0jr_IVjIA`$n&qnnnCt+=UI z+^ipdUK04Lif;L9lplCy`!>XkNJ!H~Gza(v@rNkpPlCCOrf`;P&6NlmwA^(_gWD5lua8I%S@|8&n+n~25`BqpWyLh z*?d)&&PR;Os%&AYO)Xz^w_zRC*3>`+?7kg5(dBa5mL7jML|D*hPyIc0XlSh-R}sykD;n?y)OY1(F=UTvom2fHz`+@z+O&>$B10 zjO8yy%Q|uouVgcCxO&-AyKMwr`Q>j-KG`Q>;0_Hhj{BrD*)A3$V==o&Y}rBI$k*bf zVW(cI)}f_NldH)?9#Lnx7I=JoBv|yzfDkjM{06n}=AB%6?3}6}OCx8XKk~HTwNrDy zs#9iv`gCU<^VPYBaHF9zQ6u5N5jj}!K7P)deeVC|4_^KbXRVB1QQXq|O=Kmx zytWdwlIin0-j!03x&C7QBr_4oVfLx$4bjio960R>j*VOEHN3+J}vn`+~Jki#c0!dd(+@zru;<{!c?OR`oSj zXQi8VvATCK3eR$8XHHpPWEk}X;vJ3i#x>`3tGLeeKc8|On0y&S?PAX0T9a5aSj5x% z0KDTTY8;rp0vjdLbNG5U_>QaJz^pkvO zX&oIMjqM~ln74S;)fn0RyPo}r1u!vPcfN4-FfcPSV=$?g8KMQvr&TJWL)q7hy5*hk zfzP$&PE?+dkBjl*MZd6@`k4|sHF8sG6(^_esZZkja;=y8yU8r2cvn2znMK>nm}+Lz zEq&uzt_R%yWJ7q{Ev^E(J2S03&S0*%423W@6O}Gs$6HbZkhH)+HvQp(qQVjxNt*p?Iz_x+{Nr$OyYG< zD>M?U#b8l8861a^rX;%SY#$Q7B(i|n51`qCPMjP?5QEndC<)}<$G7rBLS*1_g3*(w zD1sz>oyz$hj%14rFwF|HG-6WKxB4FDwBL2@npP zUL;j*Iy@TFIYyKIoORs1ZUM0iF+T=v>b4dJ3EKVr&tyTsO;MP!tA6$?u7`Za>(n2FKRKK6lo zzb2cxUC?6am0n2El0AENisUudGSGX9tGE90XYLrMdupxV}+)LVT zlO9i3D~mTU3jFKzafsP-k$X8USyL$qaeXssqI;YCO?bj&kISu{xM7W>8DZ9cd_;Nv z0?|z+hf(>u+ku78M$)2f>MV%$_y5q0XzQLIbhOVz8U31)m{5O#O!D`u{l*jbdKxA< zgy6@Le~V@xpBIRe7!ud#t$={42V>Orrwg_8T|I_>UkI&P`=5W?M-tHR&-bMXK5_T` z`+Xw*42aj;4*D%Dod;z9d?W48Cx4sv|KGe|z18aM#)w!&@~NwByTG^#^?yD}ndVUkiKZE!!^=g>})Dt|mEY*16G+5u&3< zu8OCm=wati*v(Dq@&5CP;5^pb=IS}u;@}*n;QCxLW)R|-QubZ{;?hlVYh|cdC&y}g z*MZ0Q)Dpp^Hjx?&{hxmo_H+d~ztVoAE{QE!DxvOy8=k}Zdf>+-Hm}pu&?VC+eW^x# ze7fQ$<3#lpr6mkvHawHTiER0D#U{lyYDe*C|Gf$$qJPeUf1Ulw=+;T`;sMp%oR(Mx z+k08Y&~nd&f`YmP$({rWvk&uvKys#YR1uIM{VLC21Y)J5Q)glz2xSOQZPjB66h}C3Gj^ zaj-bvXQ^NM6rE3Ni_eXHOeLVCgha3)wpiIFEAsEF1`CeqeaI%+JjU5Rdo`gtVB2kW zHq^J_xwnudTi`?d_x+_1q17|IsR{J)^YO85Cv#EjqmEp+HHu>(rm*kqR2Vx<#Qf)X z-;bZBE@>ov9bPh8?+hB_&dxoOm&+?FF|oL+F}U~s{+6b&Pxf72BL?~SFfzV)?Too{ z(*l-8fhkq{>UY}7 zd5Cy8I3B`6On>)ch@#E|MIZDXv0JF-_BLc_>BU#$0ox5d3DX_4rShxVa)MgRMp69Y zCN)dHh>zk_0#HWMwESQorntBml-j>VDJC=Y5F@m`c6NOKK3(OYP`9Ca z&it59Z|{*5~Ts_<`T2)@9<-z)Bgbd3n_aqPY_u8Z`>1!;WugOWx8= zo!J&Ba%d}`L4Z1O-vCTu0@?)$9EyMyfr{;LU0A~Pbl)g%0LmVg;Kj8ysA)BJ-og}l z84R5Kv&QOJBIufSlTs5xq*#LIa1Kn~{w@w;9q2z5Zfay%ubUk0vp)&&YTD%*uO?zJ zUhJ)KuPBK9)88uH!|{FKW6)dLPPch3NszSQqM>~X0tr5Vr2AV_L=%gPizF8&FggNV z8F0R!2(c6w?*wlPAkNror_)0{8m>q9@kATFn-t+vufT~>GR-@l$I z$cgv$CBi7%=@q72dG^E_=n(j@ot zANy>W(@m2KjbS<)eQ|Lau)r#)9j`ItB}Wpg3QnzE2w~Z_LJa*#yvq9VG3f%B<(8AVSd|7H;5hgI{A|=r)9aFhvDmIG{Cwr1Cf6;Wo z6&`)s6P*_=eu41If3Z@FHI=syDL4cV2?f_0LRX=GBK@=29q$C6E=*205bxu&7-I+( z6&C{r82{p}C}{gUcM<2HCnOT0)N%j+4;p1GR0u*1CKc@JKG5G9Z)R7#G6lkv+TA7NOFO`vaqpH z7$ecw%cB}Zq4gqbG6WoOx!$msB>U}Toy#>>3K*;o#i_86&_jH7==XjZ%64LZ*! zC&N2}{~fXPr=cN=(a>ucP^O`!EtcU+ZEelcNhRlaXZ69dJ%g2kjP=lWt90C~V7bn9 zPx2u)Id!gGi-EIqP3BOlxMIWz{`&2|6-7ngq49R;@{cgYz|O(W<{y@`dtFqd_3{Ky z*_o-U>g$k}|3Cz0Da5iE4i`ODd_#EcUbIYVqsI#rIn=wTU*};IAE>2| z3Gf&EZXV6Bjr0f}Q9?sU92m^(bamMnQ0asAcB7Ho(o%+PiK_jr18@`fMH zT}B%_`yMiCpun}lVbOvxz5m;aTenKh)^zdah0yvddwhN( zp56SZygwOT-`{nsFgtgKm2HV$UxX<{0TnINnT%~y(xX4BtsVAiu5ROR```QObedyL zopFHLWd2@EZ)L7{kB136G1T>8f@2mZS;~EqO(1{LgTDv!WJ$NYn>GOv=b(O7G_eHA{vi^|#eEOV9s3XP(_Rn?iS{*{0 znvw#80H6A@qzB*S=jA=BPRo{N4>vCIF@-Joix?FZ)!EwCmQJ}S$@&j{PAX=2+8Z#d z2;O#HXvYj;1$G1?xG_`6s%72^+JUkno%gPvG94#SwwlR&ck-C3m%3uTDFB?Zb+GVB zRhF_&jq_&_HWLup1R)h1(9)MK={4x~FrY)xmNM+m>~o*>YrTB(o!c51@1XC1K%+}P zbA6Kl$~z(+YPb0W47+08U;CR1o8l{2JL5BG-?(2-F%O0SgeX4c;X?d%O_u43d>puI zD?lfiVPj*TlYBW=;Fi2Q3t|95q65T+aro(s^FB5q%ol=H?xOm>*TCGoX)K#wRQ}!kgG$tLRgwv z+AN3=GRhoxIj3LTEMXI!;v)_C_|eqhXj4-c&iL%s05U-h4I8Vp1mL6ZuIA)Nf;I=V zg!kV5^78N?zR2k&n)BcP(ls+t`G!NklvbUAh;!YzEt$&N;QLQlWYUo;eM7EPaWI+^NmTr2w&yV$4a98&X|$?)qHH~cT}5?f_wwF#%qSZUB2?2 zU(R)TV`9lx91|T44s-XTA1yS(&=yH7SY}wj9${o;1bUFDQ$kD2wStwF0V&J?5(b|0 zC_s|0Obk2@?m<%k*)81$#w;WxBxJP0Cy6~ztw8hD|L*ITFCXtxc?;p;#e&Ks+4v>Q z$ZKg$EiW6&D~4)RF9tSow$7-iA|<0?r41%L?$1?Fx)E-mp`k&eI+~(HMPCT@Ya}Pb z-Ch@X4712z%tHpzIIB6Y4rEyEA1Y-M;6+ZlZ7+A8bRc+L@~j*szZJvA{#%2L3Xhrl z3C$>NUb1a(SFkO;SH-kqXk|WVs!+06J-HvPa*&$*X_DRs*<{>`e0}5W=*C&?-2(^Q zxb+g;q0Y*Uq@@Hs&2p-xubQ?Bzb6LQcHTR9cz84}s1@XP(<)>Fn(lVV?H3Agj8?Jk z9nlPm0+Lu54Q}n}k&-lnp-2JB$1BtuR&>%yAB_VsEHE6n(mSJRc zu0J!yZ+?{*Y`6%5fy zx_Zn@=i|+SgYE4PVFu|Xw6nR~)GW%<^73Klh(^qdkm&1ieU?oF88P209o>Te`&cDR zev18Kx&a{@0p)DI4Sk?e2kafV((U9jQz2SJqt=xx*r{7`!v1A_k%7YRop9ckZm(P=>p*K1W3_Ch9@jOMr~cqbsEJoN>57I)V0TgAHpZ(a z5ymD)K9KcJ^XkVoM+Y5q)=ojiNU~9HsnYo&zDp$Qm8z@GO7r^+O7R4m#%YjYCURH_ zo%-C$PE92x(FN8ClI=!d#HFzY5Kdx3QUi!Ae70c)KHs#rD)y^sqPXk|_Kg?HdT!>* zfE&<2q+VMo%&-#rfhhr@V1h|+%ANbAP#&pNm_%dL$gmUeIDgw$FV4^3fQro(41G>K z)hLQ#h_4?i1D7H4S>2}i}t3YS|_2Qp+V#TNXv*p^q2ma)V6@w z>DM3Kb%!azS74eYFa;AMDI%Ish=~tFsHeJa6o(aAAAQOJc;_+X;&WJP`@<39br3>0 zRtMOswJ@{xZ7ZuikiLl>=%`n`wvL?iMFEo`P*T0lS#w)y52UO0o?Tk#NCG?dQAsj;2&S2yb*H`ddBsx zB~L--x#F6UsZNcBX6cTVWEo)*3pYt~XMd7Y?pIrtPBVMNXYuZ)SfzgHapsPQ@|3as zt8zIXDg;B7SksC0k6OlmV!#9!;oM43DWfPKhr(oU-bBZ|q| zTzhlYzQTRm0w_C#goGe8^=^I0V=#$umk4b(A1Qf$Djvna>v$F!9gWjR@7Kw9@`Wko zI%F5RJiq)k7y^gu^iPTIa2EW4l%_A~AsXpQw&4_T#H;QLug#o(9(@Ma1}_)f%}Nwg z)6Z*LaTUNsQz9K$=QKH~cN`mo|%#Xf%_>pwgBu(>=(DB@sc(oh2 zD~z?m!-Nu0-9eh78s##p<}Xd`vO9n8{?}IdzTD)u5X^E{560>e@tvf5IwNRfJv}{- z?M1pFl~}pVFl4-?s|%&782a0&{J=nz-Ky1NiZ3bBabRy(p8o|AuE8X)0OA;HH3qh4 zZ}e3|aOJf^ie;(_U~ug*7NibG(M@naed~dJ^vs?8-Mx&k-E|M_&Gg* z6fR_pZBAK_T-5ZlhkG+}>W;thWko>xD;6J_Xa?NAf`Y1>^ex&ufvt?n&gTDOk38P^ z?&TL5hWAL!?8ag+X?8bIs}}JHj@cK}gMM4ElvyyAbx9|FQhD73rR?NAS1PKr^CNboZ@8?Q#Dp9`Im)zi+SH766-&UdE9U*AC==&^j$| zb(FzFHbHb3`c8=lsVRDB>VljNc?|rWihrAbBXqz~_g#vZnSO3Ar?P-in`9FxDW(Lo?^|bOh&~Vz0*QPT$|M-b)u)v$+GT*C@ zU}yg8HxlnBo!;JM!z$PGe*rgoAuVagq8F?|e*S{q<-We>YAK__gc5K01h2%&$gqTj zsyR6ao5}u#`|6%FPw#(X#v{P?en{Dplc6%evun8JO*LnsD92=!W$gM75}ab)@+6K& zdeH^jT_SC@Ae&pHJeWIX6;isq0IZW`%l#Km*22*HaQgZw8yS!0xm{?fv5eB+?~~5G zN-0c7`xlAsjZFWG%o#ji-s5)0#E5;AIMhtX$hfmiTIg3`=H=+vM|}M@c0CG7NeFM( z(yXofZBqA~mmn&C9R4Fd(9BsT^&lDZyN8i)Lxi>>s`@7frz|KnYoMlY->zgV8qbi&@ z1MSzLEMl=3G%qq#X$c4fiI7S4c1EgAR1&#zyNcQez7m{Dj3W6X2c14V6hYL_GuKWl zywbq$xjq#97};HJ*Sf4>VoM6OYrQ49*D}y^vj{Qs!pKhVs@-;@_ktTGjFR zG*F^kkZtI_)j!u*4+&^%f0BQ6K=%xA2AOK@2a-s?P}dVI&lxz|JFnzc|D=ka+(C&= z{-xJoBLC%~_3G2$a~kGGhxTtxfoj%ND(@}=b7_YPo!RxR&m`VUo^iK_P$C-(Omx_{ zl1gzo=x-e49wBIrswww(C~X&32U@3kOfte7VS6{ zXllB2o&OOr#+Kmi6=q{;DxdUW%Mx?`o}JTVwBu}R`I1x@N}wnQC%x%tUvsCrv%_7? ztbrum)KT=2=GCLA2o}?~#@Y;9=PRMXL@7Oim;A_M2I$$Q8Pe*zcZsYFw+fu>81|CG zb8M+MLLyjr$H%G9C3Y;EO73{fn7F&&T(5&adtsZueavF zW&F}B%k$OukxClh11yS)`%dxgr&ZpMyjngsy`no$Lf~54{4rx>lt_Qyn^(j-OjQa6 zkA!E=-u0Nua4>o<>SS)H5P5jyh*GJT-?y)i_zxrhy8$C+!=6Kvh=?_{imh@zbla{( z8{C;h(FcJ6f$^5J+jVD0o41ekJeu$L1r+YQ;;*%fj4Q&W9n5FnI=lV7!Px7G5Xm;0;5E_yfyktq*HdWn`o?&h`@+#PV*n%byxkt?84IdhN~ zwQ)IowVn5sDKhNSP2Od`!cRFTNJ|dvX98HY3s<_^2^*U#rr*P;{4YP5|FRhM{#adW zYM^F?OjA6Q<5ufR@VrZO@AScB>0D=M3)iS^!+Z;oQ{~vVQC^E2Rb`5vOuW4FO5RI8 z_PJz(8lnHN0O9oNKM^()m8RpP8FD#zvpiP1eYoG#Lo8aqQIeQS&++98<&%FVDqvrC z`+$lvStUR6X~B)}g4JM=rti0WZ0%J+zB`qokzC$<_xH-;r*Gpm7S8i-ri@Z13bT(1 zDQh^M@TDqvDYLU5JmfFzCI{;3+m-G=bea<8jFrvR ze62kE+l8yRLy^tg|Iz}^Q>@E{7|Oj~Iv1M2Kp}#0wM&?$Kp~)2IDBM=mhgV5ZHdWR z+=P$s1iK???kn(p3Qb;B^4}A*ay8t-p_3tx@|Rx z>K!~^F_$G+UsXvjMg+1Inwt;dxUuZ@BqmtwMiukMT&nyjN`-@2_V=XDl}is!X3*xw zZw;!g*mJw$*L$bavmw%xpDl*ZZqgaekOr|CJ)*mzQ&!!9T}i80;t-;{?4HYKWCAO^ zsZ%>uq&xwaRlvDmz1smZZ*Ha0AZd{t0u zGLtb#@X&FB$Zh{4hC8+vC)?$617?@%Ok#aMHaZ*`a=S>AhY2XrQ;9f&K7k&}>|ZZaTdB2?0-hzU_h z&WXOWQ*^pr=`f>ENr4IgieMD-;arnVvVlcz1@A4s5 z#PA0UJOwdjK9xDq@{#w|OQ9J#(_hhVYIl`Wd%n+n>@IUt&Env30h+u`M_{l!wIau5 zE8dBO9}0Rffq+$8xD;w6J}K(DEAC^Omg!@U#uJp76)NQLtoO;gln27m4p`e~F+MVPVNjwEnpuz2i+~s$Ss??w6z7ej=&gHK}Mn zcibzQlBmq8`g0ayhFY3CAC%ka*PpoyXI)IZWo2n{TwPh6-V#%tDXZ+k9w;?A$@->z zy~gIPf(+DM_;Q%kE8ZWJa{V8>YK`fZg)}Wm7vdVVIup#9RB7MOjTn%u(dKWAE8^rdR420%+{% z7MDi*$U@g8{=UXcY)U;%-0!2ktN>2L?)mMV_0SdyiKNH5oRW8j;$)E|IW10o_Fh># z)!)DGA5^fAphSo=(OQ}CiJpai$25S1Eyl2>>mW0(YTisriIU!uAlE&#H#$J5X zl3@d`X>uFPd_0XR_I;PiI2iu@FN#FeN{8BFwG!?b3j}K-`S!={9fV9OkR4GjtvfEZ zk!Is9jbLg_q4NDPHJ&I|W)-fIau~w5e9>wAju8LA%q{-VA*`oa(zPKxIf3vnl3OkL z+vLnMDZ_V$&!i~CvR&#Z)*I6*b;MkxkN!wlj$NrtwJc~%R!Z%d1R0*l@u2nw(mFmq zS7qrD`9!6Vcz%@b029xwJSle*H{^(#q$=PA(l*nE(wI$J4G4QEM!)yOQPj#2?64Da zixWPZs546|j2!3}r&#-?EN$%^CrvncESx$&9_^KisQ0scsIV2CM|zV5V;dynBh|U; zNc}bS%%Qddc7doo+FpMZC{qNA?)BdY-*Pt-y(~JqeA!4YuNX2r{)%Sc9iz*YBPKe6 z`*xI}wTQy+h&82IVH^E87E#RLuqYhdSvvufJTHrRq}6_6J|{%PX$-k?a>);WN_gbL zo3O%2mJ+x;(G9~ImIlmYRH}@kXdl0Dl_z(`!X>H8){kYR?MhHtsBOm*YNk;3?dMi- zZTY%NP{b}LTuSVlj8NYd7{Dx^(0A#Gi%YYyc~r{6?3kCQBWnF;`|qwM zvRcIQXxd~YbbqHV&3ce4!G5{S+aFEdpH-SJA&kA&Nx)VpI2nOh8zg^@lEWiynp5K5 zS5nW+@cU24dp&9>^OswGJ~?lC%gFLxqpUH--vI3++hk2$mW5S0T8i%6{ATO0vK#{c zjuvZza;hZG66)qSwQi!u-YiXEfXtHo8QE}dPa=tEx}$MWzn>3})`=zk08YkRmk%Y! z2Jv3Uyy=Ep7vGsA34d`E>?bgER%AEf+qMorR%aY;jsjtW>zAc1la9 zSEl0X<>#zV>ANRt^S4i$xP9&$GOn!Sza-VwZEWF}t9gK`w1JL=exdOy!!T@I^35oZ z;md(SM?dK*E1qrBZz3w{e4qPw+T65ahL$e8mamAf%E-PyO?2j->p2-FEp&@5GnC6q z>nDFkC7OnEdG8|q1LKL#v~>8rbUnf~Ql(xkVFCTKLcZ9Di|77gK1yruZX7msl^t*3 z5D24!&h}~e#McDAH>Z(>>gQWHSDKs#CP`BQCr^rU{G}2_=m&ptoJw3R#fwo9{t*;~ zedQGse*WNTH@15!$#1!|4BG_fSo4Xyfk9s%)99*=q2yYh5GrHM%WZqs)NgyNhQtN{t`nAai3L2*YjU|TUT~&M#UyUJ^cLgL|!!uSA2B` zs_s2*tjBuk=_69F9G<;&B)}tbyJ#w%B$}K}pvg|5d&xt4z_E7r&7M_wrD*3vx5ezv znHqEA?fT|RT(w$7(cs|rcFymcHFjqTjbk+JTq4D(g)iMkvjtRk^e8vxon_Nqq!Ah; zB5dUwmDaHZ3QMI3*{J2^DKtMNeA@#1Y;j5q&x@mn`YZ3t(l>if&iaaYjFL&M=b10# zAu$lAB}cmIw(aOrNIyBP^lo^4)qRe`Wq$h1t4W^e7|K%Vx)?FX&IY#Qu8X9|J6E}@ z? zA*4H@z21ipM{8elli^z2n!`VIC4RNXo#ed0Bt@vVraL!bd6}V~f=EU~bL3=ng!$w)qzHExJU{NzaX`1> z#Y3Sa$>C}ryfnd!>H75@SD7VC*ji=+`)9rBnnEdWiT6ZxuHg|!M`bOSeM9Euu9yYv z_VxFTD~%-Vt;LCg`}Iza-o8Fb{LRCEw9&}u-Z+T?HQM;=9-z_91#|o zhV+k4jXWmQ@miFtb?tE6d{x~{%V4j?3s0lqSBDXol0y^U95;P~uK_38AI2X}ix`;_ zl~W&DqDg-6EKwy%#1K`*p!Ax3Q!>SPHYPQoR-oov`li49(&*TK-}DVbi6}~1OdVI{ zd5LXRdGQ+@1MHK9+?bhwZTTZtWcmaG3+-S7?T_AKL8UK|T1y9Rh>Z*sP-m1RGUIx( zh`%U)7w>p-KdqX_vAWuc(;BbL;Cs`s&T$l}9G3or6EUwx>XEFb9CP!<#ok9a%PZlw z){~PJVqPxU0bX4JvXc*AmfO0-d7gRRPW7tajU4PtO-rEHQoORO;|?7dqMJh^KsWBk zQCTpsHZd7Uo+`+ubdQ%EFG^XrWEQn~n3q{5?iRE3tzZm|$CGUbswf{^5+QSzQn z-+0jo0>!GB>lKwUe|*P7WF~T8nx2}5^K|wPd8P{?!C{?S>Xr1r8qFyTz3s?_1FE9a z`aJ>~nxRUQE!}vPe`J5XY)$_Gvdb;xQy5)<^ZwQU{U4UK#_{-Fy(B%GFJ2zDIEv`r zz6o_$W|!_SR*r*PJqT1%7@(4r#Im6n`y z68)DV^64YEMqs0lG#;>q}@MZoA5bn;(Z5^ZEA20RdqGa>dG5; zd3YOb=ygFp_K)^U@=B?z3%U2KpsQu7d;~WEe1#R9-{MQ#?)Xnh{ECMIaS!yAf4}}W zs$))GiOB!3fdBs8|0PMY3$MVGh@pVBy@0s0^JfuMN5|^L46ld`p?{v5Y%?f5O^FeN z1sbEC;1JjO?SEts#PJi*F=~GHS1KJwa!nqXCOtF>bH!1n$Zd$yvDYvAi_NEm72}>y z#*0i{JRNe@`|O;eHJh3nlJB1^VY)VZ5B+CEjvL>GMVw(NGux5WY9Iv#&U zRZ**9x1U_4<@a2XPalB!HE_FUS#LmY1>WpKFl87gZ#+?baP447!1=6>0a66Oc}G=Q z`JY98I>~_OzrZW}k~Gnnu!U)Lq&-Qm?V%(3W1F4DQbrf*sr?7rPG~u-%v7A4>zMWA zJ$(JA-X4Nl^=m|gXr#=3fq}JP>i}9Skkkzz3JM5-K|K>0Sv1G-*_qb24>KU0+imHH zq$iI@IE7&|>Zeb`hcLW7J$1^CkL^*Y9e7vZR|QR`y6Arj%?#s<&?+GS0x!*Z@&Z7ds(o^Cx8Er zk2ewI^%xdyL16?cK@^nmoXj4r+jWl5|L%fivA#nCceIZ~HJs6X(n_RbDH$9U^;I7? z6$&Ngi&_)MhIvinYFldBv8?ixCN3(oy?ZBW74BubWuN+=*-TmMZ*{bc9(g* zi4cMwzo2`MrtM{qTTj(e>*Ghq75slvC}}|v;0{jsvC+}dFkdb^0zo8@cJ(w2#}d?z zK=)eO*||YdA;jK*Ph@ssVU*SXVD7EMs@}qV-(>+30@BhU9n#%h(%mK9p&%gw0+VhK z5SV}Ab@9aB1`ySwi|TxXx>-n*Z3_jAv_&*iVRTrMX3=9uqz$2&gX?-$&!0e?;b z5O{_xa+AVh2A(j=C-8e?MWH(X=)^@yx=U*7>;TddvGGk{QVF7hqV)m+SqE;|=>WG1 zt}$^7fgH(-oP_jrYl4-BXA)$7aB*oWDA)sM7V7vnENW@_)DW~zc@u_qfN zNaqBb5w^taR&H+T6jzGiw{Kz)r?uOf1uV~aqAowF+ z1d6f^;D;Wh53ayP*Tj96dciW>oon&|Ob1A)5d;xuDLemMpMrG{vLeO$?y_8gI2Gt$ z!9^)BJmXj)2|EPQcI3olH5r0$8i7df5&Sa>Jzro-LgHhr4&GsX@a_YIA+lklBMER% zfR(-D3WtgXf&u{NBkEJo3ZThigo1xY(dHF5ij3-1N&9MRYK$sz;iF2yMZdHLsuDNA zTux3-^7zYWyNCfRHv`}nz@&hr4D^g6Aek1yvxo}2J#D%LWED~JC;7F>ihPh@$M#em znca=e2E3ii=WXrnAQ@n4a`FXTnv48kDDa*ab~d8beJG?OeZ9T4!VT!}OejoMc8W+E5Yn&c?dE7QFyj(w*`d#3YdYj+b3+@`B8t@1rU5_`KL#4$kdAI zLa^joW}hYHZ}`owm5B5r8wMcbC^j?TfaA?@IkQfNT%nPX5w)G{BJl8mXP|7-LCQ9y zaL&?l7Y08OxPnC8JRhsKqiFAz&!T$B|II0T0=beP){vV_T~!rx z0YHT30E?m*M>sk?O^8l*Sp*7ZZA7!jaRS;}TBMImdcpEvFaeyrT0$HsHd%DPmzM)H z>3p^Tc@J|$;{rLye!n3uVf#@X*>xenCL9vYJ_-t6uhdp9F8Oy^)L)c!dR9H+uOw*H zE`lPtL6~M%h(tXQk|}PU16~Gv&vL7gZaF*}CFOW{Qr67l!TI&|V5G-VO?eo#b#=0Y zPmr+1zGx7#0sEN(We0~>GHbBDRjVb-2jnCsArVKiF&@(I$)?r6D|U>uGbj7aEWETH zqraW{A=G4Y+N_W21&tfU&D-pl}oX zL@?=L$dc9Wqf5YF)7YI?R#iDWI}5`}R2AB)59f#AFxZ${41e$W(DLLkj!})xI==UR zT8aJH2i^GqvP?ERIqS>VfA>>8>gkY*zKt6G#0*#R#?Rcf>cv&B(d!YHUsrEn1Ce&i z1A1N;lw!XU{#hNcJp{J&RoL$ZkY(J;LES6VEFmK$&5((s1$}^^(^61o<|44blLMUO zO~c#WFMKON@u~FS^#$Cw*!0QZIS|L?0QT9twuBHvOQ|+r>ti~d;4v*Y>#T^Cl!H<( z4#5=0j$3sGsurNC$&8!=`Mx#?-AzD*AZjXaSvMRXQd$U9KS%o@$wTn^D8_TF>dwxg zwzk%)%9-3LWEc}9kO2s7h!#t=&C=b`s#pmScg^;Xf$jS$h}6{f6o>JTpA}xty~K4P zH^axrXZXzPzA`*i<5bgcP;NB@WB(sd%j6YelhbLFZ(vmex52NxL_guL-JASz82 z>|=pN!LvTFIzyr<`Xsp}0oS~h(UGBvx6`t%&oAAm!*c7*(#U=`J`0~NJ=HJGB;A(# z%(f2l&EmcUi(eq3q7Fof?u#)W;Fc0Uq^JcuTO%;D0k+m5Y(2oTglr8MDP+so3km&0 zd3t;-&vS=|ML9)@l&k?QJ$%o>-ku`ig9`OFCsh|E1Mxi2t{}oHRFTAyK_bv85L9O| zGyAmZ#oDslB!EN=V_zD|vems%b#aIupX&XN5{x}uD1Z!+uV!8(dhvfI0x4cX3KR*BKvDR*1g z5Q}+#z00~XMHfg>%(x19Hvyc!fqNRBA3)ac;^VIOe-h_@1+>5G_9T0D5wA=a*p7id zMzz#bTGb3>{e9XoZ5o1~SIIjfE1eu4r#EQSy&xjNv&sVZ!R3IfZ!NGIE#L-eSU}rg zf(AVXoI9{kTiw|q0^BMZuj7JP-&FQpWN;z}X!=CXaSuUj3FhA*l?3$mB-g-AkdPSI z$Jd(td^W<#N7d8aZ3QasozcUWb#X#`H9K>2^Qg}t!36pk5NhU89Mx?O`wQZ7Q1|k| z;yvLenlA@lSL3^*gab2|;jz@(x#nY)FDSbfcPd?$Kc&{8zQDr|fD4pQ zJG+4AozQy9PKjq$oG0>oDjx$+EsRv?Gd- zfp#gg-1=mGGvF5^8QDYD1nAcl*S&*-77LmYStWR&E$&U_<)m%3@&g#@F=*~7OvU6! zoW6eo(%(M_-F5l&Zdi?x+&b2TWuRwx+*t8LgIEKhptykGGi2`p{j&iQIg{f*{Loy0WRX=aTg7NNEziaU6+XHa2M*;f(C!p>nSxJ6I zSV)xZ-xKGb6CL_B8m`|Qo#8?#vG9=^kT!x7=h}MqDj{As-a+M)KPy-MoeJAfm64q> zE*4?PZ(7*XHvxFYmG@Oaxx?xe_-~eP{O9JQnAhX{l{6*b;@`;r>Az@znE2uinpTqb zA4;x~<-e*?ZgZ@p`*#)~_FvH}b9rF`s^X-}WT*ttSOC%jhz=d9@-}${C4TjL{7(W1 zh{z$~5|TZ~boVD)bT8(Mk1)Tu5=T{CdY%G#xuv=1cT*8s4B88G7Uq&yEU=NG5)O{P zYTcuDaAl2}HL+IB?hCS~ERq-OqK7W=LRXb$8f4bSccZeO!ZXK=-nc7?V zdwNfmij9?RcxWi9Rtx1GvAclY4R{c1fWUO2DLF+gr1p;TQw`L<#_?hZ`&XvjNdFfx z6;4~7&rcusKLc~V;NW0MVs|wcSJvTQF>rroPE?+R==&sVW?JSNE(Y!^s}^Rq=60m_ zLl_6n>XLQ`>XBl8nhHs~jfj1srS5+MCP1^ji z5u8#ozU%gtIWXmZ5bUr%2BQ8HppxC6^ilYF^95>{|O@UF6n91`Wh#u-O)< ze&a_l!OqIe^t%Bp*$IZ^?)IS9W-30oWJ??AEpQ!*X1y5`GT@Bcd;xeFIC6ODnFHH$ zCP{g4TafV69gm1(XRooa%KlAN=?nE5?J48zC1ILE)KKnn`^7?Q91oNi0A4$(tMc@l zW9v1r(3$Fo4bFUd`}GT#)AqTFvuLJrc)x6NrK%njE`%v{%5$^hi6Ak?qgE@snw;T0 zu;3X`crFH!67a7i!zCTxk5u$|W6c6@XoxuYJ}-5GKDg|%+dSrep1mpw)LeCKEL$(=z? z{ogwyi5R)Fg!wD&>z7t}n~ci7TF0LU24ELEYmToau)Jo34SM>#{+>!@@PPMnmY2ii z);O=CZ^|el$1LN;iH54~)~@6;n;Nf0cMB;ksxgTth^LGiqzs4C4u{$yu5`17?nwto zFF0c0Nq<((7H+c4Z zb&ki28JUh!QeI$jLvF2F@&szU{t4`!+|*b};dejH_7T^pdMU3xuA?dA$3`$vys#mz z8_@g);AkP&0e+(`oz&}Bj*+oRf=GdFUruJS2=nH5djNj9g_Ln{`u(ElZikL?GX|t4 zmv9jPFS>siTAF&A|F%CEe6UQ%$)Ng}YFS>LNi7wTssIHEIQ}no1Eg-_8pmKvx9&hC zTvr+HX0g*3-0ocOJKOq)HJt8}y$u|4ew)_kwHs9gm2Y_5RUZ7+LkcWxLAGOTO$?`B`hD z7m=<;pKOwcgz|!azZLrz`{2kgrFFl0-?=6)IpmI!Kn{EjEXU5qdM!Fn-8*b;MAq|D zI6JfAmgH7nf_L=I8C_bFa^|#aYT;jA)p$)!j~)N(@j*wT(-uaYV?-1ox*_e#Lp!5_>(9 z%O-iF1yQ^MXPNLNd02YRD<#qmnqmG1f(Suwkj-*; zLT&v?gU=DGeO2~HHk+eG|mY8G zn;UA~u{aYvnh-@$+((#f2MN<6KXf}>E@Vq;6b47ERqrpHFD(YXPbmD5MWIHilpjm0 z3bfuTlU>Vay=_6CF1^1$?`r2*6>=A-yv1~r{tqr+7cj&bqIu`sb1rdT?F zmKjfoC~#iCOhgOVcV(C)P27~ z1bHmBmnG#y%&c*$uD03^BX7Fb3=~ltPA1VYqL6%=f8IK>s?bA+)RH*#E7EZI1Zjfq zxgNGknX&U%^5F~w`q(;pYBB`ac#{1RZc*mJWX(|COKO`1 zMD%Bt?uw@{BDEQ(9#qV&>bLk$wZfZUJbM&cwzi;^B_o|x zBO6KKuG;)y;yM#45{9vd>zmPq3VQrAfrX!a{!ZXzFyEqb3rp7-ir?u3T~4s z4!ttu+eF<>PO;BTQro-v04BTI%*x4+fz9#Wl^Seg zUNFlYmggpNYidFj$=iSXFr|vV#LG6x2yF}Ep=RkJ&%}2X8TgTK@V*kD7M-Gf$S8AS z65z7ODQ(y{t~t1ZZAx`a(&_;P-VDY09ss_mkGit8ZP=lNEz)_+xMd=)`E%bHR=v_l zq@?&op=8v!H^K! zO1JZc4u)t(W;H-n1d0A6a=*Miouu-KI~C0MmW_-ozEws#Hgn{|7$8l(y+$_2^g-3H z?cJ`K5a9k%LS$WiMmke*#9OMEnboG9I6E~IY0q+yP;oTAJsPp0xGg7+S94yGP$zJ8 zP&gzbo-PeZ`fagZY{@YBSX}ieYD&g}4_WbABBdiO4$}`kPHECMu_cZ?(wH0vC{v9x4;U^WYwleA54#p9%p3OAQ` zCkU8!Xmc9Uxe7HohBq&OwogMAV)+?ZB=`Q_-r#Tf3h?R=cbpXkDovBR(%g;qf+*R*rj5H@FdW)*1Tzm z4u4JeU0-gpxU10>S+>o-E;w`ef;=+o;;eiL?2jIF*va^KAX`A^d)>3~hQgFGYZyTs zZR{>B(*=HZJNUGbxts?Eax38F@QA!oQK`X~d=mb^5+nLq9Id}okc@QRrF9+)i1YDz zvs0s@X?)nyzA|E;SDUWzHUBV}X|~mhjYjkFCix5+DZbCq?=}ANv@g4s7>m1xcp#lO9(JHv)m z3rKi$5hx*`Qg^s99X6v(^{Xd|Sz#OS1rA}eTQSb~61<4(#ld-rKbc)!nj^|tkzrYH zRLg4evsk-E z@dt{w{uaypPo6&}icQV#p_2}jpgv^C`zn&DdWs`c;WKI(bf@f+*NwkEF7S{GmH_aQ)uA+_P2w3Zd^&%x&EW~HgiEYRJF%( zhgVd$UUx?#ONNf$E{aq9x3%~hifHk#-2@?kox#Kf`V8T4+J(r5GoM|D7A+ffR@UL8 zC0-6uDD-0{8SD&V*yr$&Fd6MuDaNz^f@Fjb6-BAx7_&khMM0%UUtEk!TdPZ9ey94q zPL@24WIIYLT&>4}h|&{wP8OJ~C=D)qRayeQkk(Dwr@mpLe*ll3Z&e4hs*S~dqPGWe z@+x&3z9`N1OU&!!$|aKsxu}3>;icL2YnZ9vF*4cls3|E=f+tlYP#t$EKa;goW;B zU;j>@%Kky%?d*8Lgn8wF`yAE5P3_uhh}d?tbjb}U00dZPnLoTWI6kIU1WNp>#ChI-?wb;f_ zDR47+nB(PU$5>^kF7!?_4}#==6;Z#f z_|Y{fc0Ji7x5;2~3t#>(Z_$_bhBVAX>5;>D?6m@0A5C#B{IJt;KHR98&H0=#Z`1_% zHWogDSvw{Xn5<*6X&yqhmI!wzj znZuCHtZL-RjE&O*;ACg4=Au&@i#a*xYQta9d}ni=tRJ1}=n$l*->&&?63l{X0B?l< zK6YPfkpeVjk&%f(-{5v8!mk4eAtj8detF!NG};vk*keZ506=UWw<#p)2Z0 z-e!WK@Fs8U-PO<|*ceGL+ZA|g`FR-aHiF5=RW5htbeyjtckeUIt^jcTnEK&v>t#y^ z=fRSw{7=30e)M~5Z+m$4&@?8!0l=wVW&N!_UP^tqVBXsJY^Af`EfKS=UcuvsI-bTN zQw!Ou=DejcVS8)1{u>6Pj8z;QG>co&@kL$IA>dF(bkaEI5=Mpz`19*J{g`sOt#CO80a*7eS_^qRCsih?|44EANjy z?uQYD>YKaHITA$Eemem9%D{u)o(R{xeCs8?IF(4JKcni>&-R#NDJ6Bg_Qlm{L$#uy zK}LE|6)dxVS* zB&36%_6_IDtH|_qbx(!GVGwPKGD>b_~qoO9LBA7=xbK`sT8soGN_d|z@ z+X#N${HVaCGg)+NmyIYma4roIDmL(0eBrj4>f4l|pSm%pvG_2+arhcAgo?9UGgZ3n zqvEoE<_!#A|HwK|hl(0rLXTJ+PAgMS?F0!}cqTI1Z@(zDk?Q2x6XwMJ?*8~I*0GgV zLsb2bb3<19Jsq@f7z}9Aj zG|V6t03KpulOO&CynqC>k>)ej^SeFpzg+_QOLD)-+%%03n~-;B7KSHaI3G}U&svrG z)>Rp;`KA8=%21bb-6rL~TpCU$6E(jk9=>FIJG6DOP3(q235+7YvSdJgC^0aQ$jS8x z39U^q{vvJ$$afgm=dkb)(ZE;}wO<7Q4J$ttjoatS|CYq2$}V^hwJFt_AipN2K5PtW zrc`zvQzgo})B3uKu!@Qj5)yt(9x?p$FrZ9#qRjM2d<nx$)fqce=&9qu02u>=J8xwRLrY|O^uJk9wm zKfo;ocPAz!;H*%_;s-rP2RNvwc9^+)c+A$lRmdv?&LXlqx8P#xs9BkeoIK`r zz%uZ?4UTPZYcsUFvk`n@sowy6<8+(6`PUKCm(dMM5c*gZYM)x+UzSXTGZPDVo&l>2 zQ=GteU)|$g)f5#mRjz^SQ7gZ}XX8-Qtiz_>c|Jq{$}!1Dw6D+N2cc7>4dLjcmXUJc#3)dSGv=SN_3<2V5VcwxOUL?fEnSwH<0DLcTwlj55^mJ+Bj`{%Sp>o@kt%;H^XZavaIVZ=c-$KWRW^{CD2z@i@ zNa6Y3DR}7GmN!yc0JDp^Sd4H4=B4WD>cCE_Ed?+}Ny^EFm9R998;n7+zijC(^l7-gmKqHmI>Pn%^^GET=TJ7{$jMS-H)R!%rV9((HQN+lu&K`C<$Oa z-YTKs)VuO~DYkcp8MU5hxpy8~RCGH2Q$a!F=fs54Mp4j(egun_)*I*IKOQOTGMfgM zM`S|B7%athGupwO1+^YLxB1_4|H(f9)Ty+jByc|U+`lMe>;SPtuz(+bxgB$076rz_YP~(NjF#M5T&a7nk zj(tzu;riVbz1vEc{x<;;I;V5ibLCQVZf1isRzI+N-CgEn^5{OWnxw=M^Sa4Fnz_s* z8>5Z)fU^)VpLHO+!$d%IDVf;(W5R3n`N)@O<6@ry4T*Y=VZNkEK&uBZ#Ex|?7P$BT zm!WjwNB*W61&JBzm4Ii;I(Gx^H=Ro$q7tk7g&|-RUIk`teo!6(cA9t2`5@gQy(4It z0(G*~45<`F##TZClF+trMfAWDe4@sA9uEU}n#?ZSOA8o?iZ6orFZ38$ui^v1iHV3x z2S4l!2!hqSJAcy-a=(knLdVg1HWea5=AGY<=8lSI0_@RY&dCUZ2-}@$)wEG3Uxl1R zmqf`ElatBm=OG_r6Cz`j=34b7TFE3q^v~GDgcd~v}Og_;PU*E#?Jb9{V^&gJ;z!IP0YH00-VZ9{+? zD!-GUXk7>=;3i`q1E7s#=e+X6aDM=h0`T%Fd|7btQ}ur=wIIzjgd@@s@Is1h{?$Q# zqxk?w)UE)uqgDQAo5e+_DDb;?C}zJ4sLTgWz@6pNCa>U(Zi1R|<*7rygFN1rn>?+u zub*ZhHum=RO}0}Ux-vgbPS$_H+h%i^mk-?DoC=z1=;r)*Li3GkbOSv4adbF1IAAu1 z&usiSoD;>COga2Z^Uh>X)(FCi&F zO1ayzBp`ON0aNs9e6RR67KvnisOb6XUl(q$=WFnIUtEi>>(54*4_uFpj6BuAWzwse zD0OcwTV+}_z{*&)&%pZ`=05yU^$7 zmcfn5G~k{I^gmi z60*FijjD_Myd*sC4=`a6_htoZH*mI(N?~J^1$SUzEjg*76hg3s@Z>LovxGoABFeGnryt(Pf*qMPw!KEb7*%c&SER})(2FyDg1s4E1A-QDvT z0qXPs4@U(}ad|~#FUC$!J*ooV) zOif~QKKl7FTR@{XQ~{R{<95`(Gu%8BYhVOB4KUmkVJ-ti7In;mKT*yZf>IuNU0oee zN*Kd{CtjF?CAbNn3$TJblv1h^S|2X=!xr@zK#M1bkd9 zEU@|0jc|i@;!&5R=Mtr7OJ(MPy|uNqxj9u4(MHt)#R2WSlu#1mM9x=`qZIMuQ|t2* z?4M6rUddG8;-QxSqVK>$D(5Whi?VYUXN>H!jIMi>0Ms#ZZjdr)f!I|wzw%2(g=^_u z$ubdf$;1tZ@?WHn(k7UW{N@<~RouZ8iUMrxK1W89JlTz133cnppv(4p>Xt8sUyjQ7 zPI_i72$%*&L;(9(g>Uj%&qkV5#4OH7e!ZvD#7>cdC5N1&@HNwV9Pc; zd1-swMpqZ}vLD!rOKMQ@P<~ZDhduff-f;WdDC6TfUw5pK&)s=H*1Mb^ZnK)}<*dgo zmSk-h{@QSEe6>l$0zR!0T6p+PI>}a^H!Ce-y*jo8PLUw+5x2KEJy=u8h%Ni_eJ2=6 zVKB%35_XU%A>kpNKtzZi!M$ZLD?uT7+iE`}cf!uY)g|G(dA7d@+~XpNc&-lz1Z88X zeUXEInbE+~9|lLKp5f;0^0TnAil&Z&7C&zG&I}YO=VBi^NCPp%W_cYyy`_7VZrQDzSjrKEnhKQnsU(mEx&2 zIGx2%$}1|gia#Fq-q-o!lhPfBu1dMAN-nBmD6*cR(#KZtrLpmXI5YNQFk_N_U%IiH zjv+Z+SO#N36NVNa8Wy&^6T71>e$=v@2wwhfa}Qh#LMKNn1U}7SgkjNN`CfdC1crIK z8wzp5l$L^dzgSjHfv#HE>*5FxWXymhA5b9u*1~5JT(os3Ek^RNx{tXihg?AO+;J19 zBal6Vn26@1tE@1Rd5ys#DVi+x_OX;YIoB{^tNa)N6Yzj%Ufy?^Q=GZQv zfPBVdK*J^b`53jR@gEis=NMbAnyh-tV0DL+FtFw6^v$#kTP)1wWbKNIJa7lehQybY zxa%kbfP|OS1V)<$iWv`;OO6a*y$NW+e7&3<`Kio3wk)g2P$`B+g|gQioL)#tNx3e; zxS(D)M+8~IC8~)LOKDlG07dAaS)uk z;Nrkp#%Lys$;<2df?XtbW8+SeQz0f-EiQefF?1L8!(q_<)Y1TZ0bU*JrOUbrIEjE) zqvt;l_U8aHg>`q;j9yaB?BBl)_viXrb8GYaP)1Y>hz_EU9KqZNpzH}ELpkgL$nPCM z?jTTu#V{g*cJXC4FO=Qpxu*O{FzRfDL}z-4LAJH;rU{OV4mu?kJ*N{*$II! zku->lNrAGh`GoS4K{vYmHajQ4_e-RJ;`#3(Rfg1B^;u%}E3}&+e>_+xB ziPRN&V@!U>-Lzeaus@!(4A#o;VR<+h@mxOBYvgaN04nvz$%@_241V_s9cC}oKt@-OP}Jq86WF!OmUtBLu7SGnCx^TozZQE>8xmWe!j}4`3#(EfbXbAe{lIz znTcvLKNjE%FHzc2JQCa#lnhKe*kLgM}Rw&fS!^&uGBB|_@-Ub37D7RJUgky z;uq^L7pRaD6GV=+%8^SVYao-QPHVbzGzMY{)uy!|<@+csJhVF#Q!kqTFqjpNK0EX8 zTuZdkY8q}OzndAi#+VdWHr=HR!BT62jZ|IeKjuqOC1Sk^nz$2kLkBum^@4+_Q?)+R zG`{BJW1(z_eudc6`2%KihsXY^wdp6^A4gQ^F3!IWt^XB*{{K~k*w=w$4()XGh584VZ%!bNtPh z!b36H8!MiV9`}&PbjD6*q&vu(!)GoG&i$;xOieH2qD4al2O-b`DO>LdDBiGPVL2o1 zCO{`dhN|*3J!QtVgVG&Js#Cf4g=`w~I=h}eT`0mPD{3%)CY2{z8HDfM!XAQvfWc22 z9G@*-JMN?=H^EdO=iiXM=f!}?3rXt3jKUQ@ttwmyt#T+&+u6}L=oRO4=Wxgqs@Zl!G5KNN0c0vOl|__o6R7y@5DsZymIi%D z32!^-ibjd&n+|14vI7UD#~%Kff}jtr{w`}akhX|Tgh@sDHk0Q-$LZF8le(R{CjhHR zoG9gw4pXzDxcJn@6fB3oIH8he;yy>;5@n-gn|CX?93+u%w7~z?D}^pRriYn^%5E-Z zP4noHOx=?*IvCTmH>J#~qN!nSwB(TEZU7WNV3UO#oWOH6#P|@Y3e$ zIcmoF#Yy1|__gO9LfUpNCF&8B+ML!ow)jpKuE_T(MNC=Lh679b+fy*F(LI=*njMLI zm%8YbVB+@|x@Ksh%?82xu-f;~g|W{_#-qT8S(FXaV zt3K_{=rl!JD`}&`N6J@R3l&QlxVg@3Iw!zn){l>*9@SUOT62k51BD8FrG)~&Ba_ju z3(*nKuMiPBGUmL31#(C;hk0K}csBNS7x7Mh(@je-g1mJ} z!fn(k!ClrMGeX0DyP0IX{F3^K!M++_K7EppZb8Et<6q+yGqeKm8m(3kee3ptGR&g4 zm1USd92h98bd8T_w%>5#h*kw5{=ypAF@AQP*XUC;vP!)|KN*jOaS~)^F8(fd%|L$I zn^7dzs4h2#Y>ucgXDvJgXVw=|m#N```BE2iQ_wA8A$!!Lb|Ht)SPTAmm-DZnrqadp z+AnnrwjL*=-Sux>6u?@@H~&z~jKhJw5F_43-8iY?5ula_YwV|H5p-ujOFn`Och zzFsqImu;dLa)kEJK}ETTzHZeCDIB{$yG#aFegCMTsQnh?hmIT% z%rP=IsEzkF4tFoo>8Eobdk%kd1@VYYUU`*cXJZQ9zu+ACe^oy9zm!Zt|9WwQt>^B` zTi5#msq&c_`+vFkuOVIVy(TK#o7&wH+Q05p+`QuFAo;U#c{OSN6*-ap?@N^Y>T!~|eEx$Ou{<$>@b$K>a?oYjtd-iTp=SY*`84Bhzb>n>+$Gz|4 z!+Jvo6_<4mtqO9yBzAmWrzLhq%#FUU2LFBR@L;oGt^DH9o3)03h|x0;JZs(Vd(+Y@ z#bu7IM~8?+zORQAjM*>>nRbIrfBC6TP)**kh50ntSo<%)@u!0G2b9qrWVH3EUzIBA z9%5iQ(HJ}2S}nZCc|nu6j6rUNWb&x}=j4-sQ`wTEP*6_(yvMOodlSFy$yp@!r#f`^ zFIQBQ98%ulGc;PiPHHDU1{LtBO!G7KzvV&Hi2ZD{=3K5m9Bu#U!UTTFW&E1bxtHTv zpzk{$y>pvAFQ1b6(!>e5zcq^*)U1Jy9*D7}G4vf;I(1BZAB{I(=lNlHu%s~LeHK0r z4tLqT+YA&rfcb1QY4Eq+InI-LzqjI5YQ}0*N+ii=QKnVc`Mh*IfK>Q}3i)~))W`3i z`qzHGo8-)9k25_d|D9iKU8<(5{#7mkYp|m$xXpFEYP{nZ$jG|6Ky+zXn;1GFog7L# zs>zAbkl8Z4mx~J~uqD3_RD_25af19UG(^7f@SZ#V-a0O{$ z3&961pT*xE=fOJC1*EnJTjIj_HPXJQj2vdnNw6yp)=VuAG&cY25XZ=j?C(Qzj;m>umTJDYYyeu69oa`{qUj<55>en z9jY)WKM^0HMqr~p64&Q7G9_UNAG2?dW?k6DhT6Pt|Cx3`z40S(m&Ul*_sib}N&=Qd zlFoqGEeaXOYc4Zv(kMt>5KcLEcv9OZS>sK1rCu$YTKW`Lq$W=AiC1FZt^4+M2WOKh zShtdlL{+t$;l?68@fA7f1IM-MdwvKMJyy@ljWND6@C08hm>s|E-^@!ZaRep~OAUpU zIwWTspKCGag)c0Y8Ai41rr?tGhP9<+8aD^OWyXDQHppL6SJY`&c*ftC1HD`E9I;Ke=rzSXq!eeizY_?q6R*CAJl(`KG@Y ztf>kwy;Yn>_d1)c6ZVh}ISPhQAeSYFY@Cb1Eg5E4-)eRLh$edtNq9$Edk?{x5!BOM z70fdKeUI{YDTM%!dqK@gPYPy);_)X5*gpnorX;H%NCEt7UN&_6c$1U8WKTnS@ z1@s?~@u)Ak{&gzD163a(b-G1BGK0qU3+`1O|pq^9kb@R)PHvAK={ zJUmc6?vj(1I*OFY^jsPk_HQ_P^cy-q$sz{$Bt3m3))^NPawNi?;^iY!*Y(uX31y75;G08sL|X{DNc&AP!~BW zq-8<{nP4T?e^1NJxL0ZvkVG!@G!kzcBPHWerk3e5FX9}z z|FQKW-*Au_`;W;QSr#BbE5Z_ZNL($}FO~-X5$s)RsSO0f(ymeA}a_pRWPg z(iIj>Y-`tZIs;NcsNOm*2X}UgWQtj2`1`f@(?vn3U zhyR@gY>D^47Sb?`hiIZ$^Qm{}wd1fEwT30%<1>uvV^*a-ZQ@*Tj0Bs=ld_P|f}qUt z37w^K_qiMcH6@=f)u$q$gScO9c#oSn&+u{21sy$d7eb;yMr#fQ1AQk+c5jA@B~Zd{yWTJgO2iqL};s)v^P|&>^Y}Oomt)Leu7?dl~Vlb`GX8&Ay*^o^JXsU+t(H(5;izF4Vddy zGDPjpmCg~tp~z~R(qV1G*Tx3|?ULkPN<~4q+M@qcUnzR>f3Wt}QB`$q+xLBmf+&d6 zjeycA-4`X&-3`*+xj_k$+|s@2ZYgOI>D)+ncX#i1iuZMo?;GFqz3(%|^YSNSu-0O& zInQ~V=RD`{kO3O%oUB0&+op%+Nuwb=(}2^^@TL?YWHSdd68U1&+w^&TZ!KA^x ziu}K+P5!?Z{F6Es|Cx+0;LzTC>+t`5co5ScT9-uoZ8Ehf(fLE<_p5>9wf%PK`2F)g z6ovCdGGZq=7khl}r_ciOIgC}o+-GMVyj4v6`DMT7W2RjI5N(;vt1}BP3JLHj^e*(1 z`Hy$L8&a?;-akq0cOU{!a>O1Xzn-4AI{jp&e24veFq|;5Apde(c1~->^C6-X#K{%l zGf23A&BAKU*X66#C)P9!mkHf3wX~=v^~(~qvYP7L$fBi%4iy#snqLgQroVqhkf$KA zNEuH;cij5oQxj86^QQ1S{rH!!e*0eC5Euzh#T2XjMpmbv;9SPq?h8I~&jUX9m8%iW zz^ha1Wv~5szWCx9$7~b2T3p#m^=rv$`CM<0DU_=bo^PT<@rw=n3ulg_wlc{j9#sin z{!n1&ALvJ(a^RcwD|sC1Tmmog$gX^ADeT_S%+2=5mhp*3LNcu7W#;h2FD+iwy(tz? zbhFn+Pm?K98=F0*OJ%x=!?&}he@<|RE3ewl>I{v$7)~U7#=E-@u5ai7mL6GGRP_4E z>Izx1QhUzbo!NjLg9h)B$-Jte`&7@a! zEE_6=e{CP*&Z}h4B>IT1_$f(MMv3uzeH7#}y@`#hW)xf+PcPz9fQy{_$8H;mh(1N% z$nn?=(yod(BgG>2Gs)3WMmIS`?;mE@YX-?EUkO#C#cm%wE{~nQwpMK)sFlyGMT!Ph;+nYFFws)~-- z!wxuqk-UMCoqE3SAiXg)`48PR&Z3EfR%Be9jO4!b`o)4NAtx%t4Kdu7dH*{I};g~FGSWgOef=vJivoa3~=|5QdM zTR3-eCrckC{>C^vIJG1K22)&<*$CE}4^=knl}$6>j8m2XC;iU{ptZYETls{hkKSss zjnC8!lxQxqm)hTvrecXN-Ceb4eB)lXos`)sFx*T_U-=e^vnCTi#%8vREIe*|H?DSf zl}nX)v?`2BVseZNQ!klulJ<9Yc0OoH2k{}is7x~?PI&NVKmgw{E)LOQ5%!zVX9NZY z7Kb+@1R3rLXEafUAN6$6*)-Q}XZfuTDJ(QulcUw zcV6Y@cFj#Nn}_75t1m_KYgCtZE%-c(?J;&ba<#;}rCPbHh+c|bG1sVFtEnDl+^(Bq z?|hB4iTSVl_?!~}N}=eMgUDIK^e!74TNF#Y<0Y}qn7R;w^(i6ae9J+5eW8`Np(&-q z64E9T-{ybyjj0iuzK)Tn%#xuSMq9?awqdbs;ixGUSCMwvTv~2whMXVPq{>5yeYekL zXy&J1ol2ba#|Z7$II8Myj}F{9sg4L$SPZ8Fpz=FJd}qU1_k5*v?t{y0SVe~6=Oqbk zH?>rcZ;mh;sP>wDq*oH3seGF!s;IPdf#`f6w(Rfdvsc?QtutPab7ep)?_FWmE+Nv& zGc5G?oSw=ZqfTnu4JMAlV{tnEb6(LI&i*Res|99e!XMt#J}NqH;A0aKJtBr zfAa1s4%ZU0L_rxHkxS^Mlr&0R-n07&*cH_cH=k6A*6_otp~@v&=<=k0S2ed7?cO4q z`H@%EuuJD>P8&JA=IVsoSP`BQX9;|KQlhtmx?R6&a@M18Jf^Dt4p)cMv%YA#t92{7 z`B_ajQYBvhPG*FS({_2CR#00<<;}SewV1DwYZJTc(zMy2A`w^r-t(o^rrE6e^st|O ztkctZgV7|f$VTtitJuTbjs0Mg0pk4EZ~48*A!vs_*&B&%9HXdUrrpY?MeD<3_N2$* z;-lfY~P;Q}M^9C2T+W_M!MU({Y__v6x$ zy-?kH<@q#b``|P0b91I2<-tv}+X%~y=T`@cMj{V*Wp=FFNChIViz1FI%6Gvkc%GQo8xTLE+}lp^v6HBM1F*mTy;q(AS-(gb4%Bz zNM0{LW@d9~{Ihs}WWDf;sx!C)pPI$$YO1g_CCt?{?~0al&@s^7YER zTcgQf*~HQ&vM3Z=ku=F>;Dd;KZ|~K!;*z>`sx|jCyUQG}-Os$fgkyPGa>l?kT#NNy zpHvJswfAP}x71ZG%s)o_>#(5sxPCg0*2ALj;pS~$t!Y2ssFy*Z@@8U^5u1PM+;gxu z5LM{MTVG$N&Dn6i|725OT7y;8s&_|~E?C|ug(K9NkG+(HU!(ag4dHHeI$B$uYxvuB zXb&@IwC`5h1aw*XADwc;k>5l?&p1yV6O|U%Cy}IO5$_ak^_KvaF;r9er+Uor@Kf|1 zo0QkbahNzYu|<~ZHB}MK&044`;jmyy_&jnd2@9I+;mP+%ORKn-NMPM2^gnVow^>(o zO_r!0jqs3j-L_IMt&)yHfkig;%3R(KZyYL>Gw@oc8&}g^6S1p%7Y&_E;;h}$20F2I zTH~w@9^JULU-7r=&3}unbbw?#9~RIt!-~w_H)i}@pgQS@qT8bAGjO6pExaV&KIpV5 zRXp*rqvQdze(V(>pLF|^_OISfU&hxtim=5 zXNfq!>R*zU3WLt;l}^QL^u$Hskl9V=c%*cFh@UV?yNn%3Ti9GQzTW20-c7-fZV_I%O3-SGZpMwR$f^0*1ec@ST=?_vNk17+13?G4Z==Nf+jfg~Ni6&(R z2ZcT|Y-4J?*-xU<%53VwqkgP}QBc)Ld$kGaT8aBj<0Nl-}N?PsbSw>_yy35 z;nK+DdUN-huGuN9HM_f{Wo_N|HdI_r{m@^8_To(cX$ab8Symo()!Qzl{fqp3ik36B zo+!=1iHVs}P47Z3H!$dyf4VU(%(RD6BJAzP3pZnxOHa3n_b1p6hE+#jeDNVGo_zVc ze6SJp9RyTv zSb)8Jzh-%z`=wWCeA><&#wcgnZbRVLqfeeAZQew$l66$l3Xeay_UsfRdS*d)mv?&nfEK*R9l<&pze#xx4`Y5jt z$}?kIl;oOVXqb$J=&PWl>ZTU!>cI#B4Q+-EAp9lApSRbZdV~b>A1HahlWDx_j6uJY zvZhs)+%=ue|DLWafKoiD?X4W?Xm*7jjEX8gczc?Z5vwB6=33(1b$WF+i$^_}j*jD| zuU=XWGK^x4;puk8C!FOhgYbOVS{zE>?)%zijjNiks&)e~>cPLfoT`mU+245D(%)j$ z!09FRe$ed}O`pu9&u2r;$sU$e^E}OXotDO3QX`lzS?W4a3uZveZBVua>mZlgUO~j! z(oc&W1!tW!P9ht>j?UttJ2yP07lelJgz1lO8L^g^?AfK<;6jt-2?9a?)B>v239sIt zH#b!iX1s7!FLQG{{CXZLZ8*KpaDmr}Vc9$EU4E&A_;4J5ph&t4ly!p6)|rr#k8$g8 z!pcndb`MC9{kEQ1>n$MT#jcP5SlC|r1SVspA zw^?2a{+>?zccYTO;L88M($e@#L}_V6^IeJNagSW`&`t-Bve)%-+gmF=_RQr)HIm() zc&kmw@j5!aUJAdL)tR@&m-G65X1TPIDs#E(c<8a~rhTKb{7>sqi!%A-)wwM^EI#ec zELcXy{+)ldt2GM?muT#_)=mG&yT1k_(xkw^!DW)e;Ie^~8_CvfVojr5#o(9R#ZYw! z@fl3WOXF$Ot#?Q~G#y;EqU*b@9GEMKykiz66N>B<8xi)tnuqmkNa=|EydBc=CRp5TwX~5YxzEk`~ONS3QAR*OG%z$c;byXs03UJa#VEFVL-kaKCNNBmdC*% z!^FDZ_k^s2Y6&-X)^j|zx^>R-au%2JGADZpScFZs@axX-VivRd<~p7?k^>#+Uw*9= zSWDqn+B>{08J){w;GGlnCCBKQtr4$Dqa&Pt&p6Sry{+w*sow%GKMB%yO_-d<+nPq2 zT`L`UbnP6U<|RhRIuJ#`iutINe^;BM!Gn}l8}@uuWu@o=q`qi?QF>9ND^7zfIaB;O zqK~*zyz%i+BRSQXYd%|iGApg}NAD0QBGB>?2}$uyuw0W=1d*YBbMXkqYlU%SM6X`S z8_x2JjSR=F$IbhvOCy@^Es9x6AFb@qT^`ox=G$nk^$_HSeTGS^ky-$y2Q=3E)i|VW z+L)Xv5u|H_1{SV{H#uN^E~)1^S1%Ez)nKg79XaBtEvB7l!80|9Y-`VO3{_|Xw$yxHs7%07IOE}m%Wl|FRf$h&de*4b)` z#cg}-bF-#2wp0Gbp~B@7Q_+kq(03x59gVz(NeXfEAhD5DUK9}>ph6#ttW)@_NQXy% zww_)P)v^%iA*Xy5(phuganI`8GZHD6X`#4af0Cp})3An7=8MoT5d{6x<1Z&uSKSWs z11pvPWIS1{mAK5AoH$dBYc(#k{l`7~$}+pwIaD}3SC{>XzVR@YxA)-$DxyDx_lf@# z+ff@MAMa=}tm#U=^z_cmz=9lIWW>ACX8jjs=lqobR?oOjw=#j2mK4dAY3^tFBgjYy z{AfLvw@()v>iqTsrEySKQcTc`)O|H+i!uE%sggv*TNg6hnXg$Q=qkf0mTIDVN~s5H zX->ygHiyENs>QKJ{S|^5MTkl_ydlLD8|)7)-=2Pa{M`REQtxqvnyc8w6*+~J z=HcDeX|CoQO2;4pZ|mevWf=LEyHZedhOp7ibe@LdNdt$MPa-NpS-Yr8>+Z6E&FA`= z0H2Ri{VJc``q|N|gi5Q~qym23l$aIYtDUA*tF65mntkU!mZQ2B)n{&-ln;{mJ-^jL zRT5<9I*9jP_zYr`)F~XE3BM+OfhWy;)%h>6TkBDJ>8!-U5k?0aidBK{T0gWdcjnxj z&b;d|A|{+`Zy~gM<}57sCHfNAIaXh`27a89Y!llaapxNs$p$`;NK-NUT!c0#4=b%U zd{lU@lqPLVy|z2`!uK&Nv)+9b_=>5V@P;SmW}an4t3Q?4u3z)pRMwaC(k2mtpa_@U z)R=^cjf>`I!ty~iC@hx~8#Z&I^S@=P)zvyA z>sAxJe*Nm5|8uJ}Qo&rcCvwvDL`FAMe-)xOA-*@evm$=2KNv{ybxT#Q+h^CieEu~F zh#DesjtS}=xUr}*R;{NCjFdM7Kg^n8*k7r<&R?{LC_y<8nP<}K<&%t(MkZq-Cr+zu zPCrA!X?*WX!mW_;T$%Xm4M~jn+?sGyIIATD(-<34?BuaP_hG)3QjyxE0^R`AXlA#@|3Dx5LV*R8lk z;JoN~FiLb;?|fgrKOr$hyIc9f_+nTgpFzOTIZGMk$nAO+Uf;g~UBcY*s++Ef>Zx3` z)5DG_ecY1QO)@9=Sk3;Ryu;vvv7Xj!EjMY-bn(b-L*-x%|2~q-KWH9?KAZAXYVBM zP{$2_2@y@^YNfcJWTle{C0iJiMRx}~6T##1X&K&y9&jaE4Iesg-Hdb6^px$%=4zFr zSW+RmG?-rN+-$ELDbZcm^+2+lU#{~iEw;rW21w#`CpxkggSQ@N3*q|sO+jp6tA3MbJaLl^W&PU3keax%$i3}`dr3?WY7E_hGfgc;YHbU>>VZe6HE?GABp%wO zoQm-3=14gGY60SSIZxq5I4Zhw(l+rOfA$dLAd3@ubpQixKkId+1voEfI}x zY~QSf={RJrf6#V{4z)Hz;5(QM3pp%?++1EwI`s|dBznykVc)P4QK*U?J6l>s3QS)v z8fW`VTB#k+)!`inKY859;+P^yrCrdX+j^rJf>Xz8{ER~2Xmq#k=`7)mxluf7!SEDi z=dul7jR`1OqjWBdlxsJ!@P$`uI=ivmy<;eQxtE2xEBnXTT zsN-pU=iWqjkZw*OJ<8E_Nq*JQfwOf?e?^p#h(q$`08F}}dAs?Hts-1<-cn`_-dTeB z(Xxgd@9@~tONACjR*}QkO!=Ks^BVq*;ZS{lk5qK4n-#j@H;r8 z6C$;qB-bC05YY_(X}6v<8iKgIzQf(knLTgwMVK-bUZ}llU+$Nb{PyHSpWWJuxwVy5 zGIed2`DCFglYr03szY@72@>O!SB+J;;HGVZXu;BD!>!+8JfBC(4javzmkL^oAx^ov z_^hrHr&kxL4KByoCwk>6W5Yrp0-ZP+W~~;#R(pgrHM&xoMW?NZ(lCOT5%TPbUVKaT ziCaJ#R?FFa7tBfO@bMvrgG1GelZ>bzZS7`N{8pt}L~7is4Ah@D_;Sol?%k$nvM!MW zq=3KPKig>J|G2$ni(WLf&L^A={=r8BP4fuy3?);zD zr_Ja8sU7@3uKN$Y{9O>szy0STpRr<}IGhy!v%?0V{7;MEe|-b6U#Y?Bfa>>ogXq1{ z`}>638RI`q?V|tH9sb*o>|@9B0?xI+A<&cT##i1AqO;x{mv; zlm#A#!1kx;HUQD5qfusIcBqTb;p4e4oD~%{*A0b|Uf=K8S#g2;!V?|7ze{{_Xl3ob za&=UEi|?0YX;)!$GOqQx*=g;BWYl4i%dhRewv+F?tN7f=LeLz~@3Mdu+ac^OwJ962 zO*Q$IH~;KsTKDL7E#KV?Lr}w0!L=j%U#4oGJ|S}l*qaEOm-r6K(T`huTrvEe90{HK zWp$O-+PJ)V!$wNV_?1iJ{w=;o7D|hQmdL;@?nhFQKFN_hix|$C1 z1+}$l>>GQxK`kf5Vd5h<1+)1rx$Pb8!5D$)m%D?98lE{?jGw|%uyIMrPkr~uCUVZd zC<(Fe!0jgdgXTO!$G?l@2=}VnmCojiR(smuGV2Rj%^ltOcfPyDAQgN)k6-Mm%ue_) z^!JEqi<>PRM-aq1c??Y+t0&cNtJYW=qX~E}S=U+04(l4STdeE(8cbJ60U}g;^Oviv z<+Q}7MO^0EjUo{Cfvir!4Fb}`dhR&S$r z!v2F}E5u^6&madgp;ajIWb^gQxQLu|6TL<>IKQNf%+ATAG-34)6F7L*isdmBKPvdx{Zj?HW~x7j;RrGZeu|%L^k%#f zT1jkW=ixIGuimQj{aeP``Ywti5;c&59l4IzOtjNCRE><=+i|fNHC}FyM!Q~Pe*P`6 zz_NmoKaj7njxc*>r^jtYA<`8g5R`qFK>p*^nnIOAb6bPDzCh(P9Ii*>Z#6#W8^@@M z7OKH-c9eLmey5Czxo`FTONB-cm^08FJuDm?0m~is0z_3}C`{<7PPMyM3oP~S%1cc| z#Lu~se(5!)`Z97gXGszf2}z~Jw4Oku_r7_!CC;8cpQHWtlWK8%0s<0l$FJ`zM5f33 z(|AlyMhKqf{0ktBF4hru1F%tt>ra6=y)h~LHn6GNs)8%yivY5oc)=RG*@`ABX1(SL z!(Q70#7rRl3x!T}vd^XkD$OIz0*LR=-f+J0Bq1;{vEZ>?v5U?dEYr<8`XHE!$EeLL zJB)y`;;(;?h`p{Y`+oYgIBZRv2%k`_(Wl8`8ir19TBgN+8$77YpmO}G0fV^x;ukga zo3~}2(^)aZmy8jE@Jd^reLMi(@^m*z+Q05shs*9rq0g>mLdF*VpzgO2D;gv(w~kh} za`|{#Hr$uKPfS#6+-lESFp@vSkUl>#`Z4d+@r*3ywG$QERSqQdl8t)8tRmVp*3m9^ z>!eQl@@U0Ti8SqNf6@9}o%3^&ZS}sWHBN7PI|~J^&c^WS9CoTHsm46VoX}KWFU@3D zq*&ibpdbEpJO~0#cr+qn^VaF*sW~<#?cH1+mqF^?H{C19_?BHuuHaO7p3#KbEqU^( zgzY$4l`x`@GLjsGJ;(aGE0l-&_1?dJ%-kG}CU0EwzZ~l4;B%bKG_gWC*<(okdABWgmkt0i`oeZ0uGHkEX{33m3jlQKOA#vAO=TzS?cj)Wl~x5D{b>)zc+q~3N*Yb}mE+0e9X;cc#6v8pziA#)pT&S&W8(fY`0 zRrZ48JDM-1q~jTuq6Dn|{`2YU9{_TYY$uU{mD9`mWwcve0Uy#7Z?f~zM zPDy4WYahn5c|H}aY13|ESFz^T9B!es%HK_y0%3@QjoE22R3sEFEq9}M_6}?$6H@u! zyeqYxgk7V23iwoQt>xQ$2I(@r*jQU5CVdf%R&d5UlQ%frFnYE$N+}_q1*2M(zm!xA zc!-2_J2gsQ5Dvw5JH6VS5ijh42wn*5w3yu`jE!ijlsMAXY{(*j(O6IP z!$&P*zIE22!jWZJ!@3G$}RgS$CW_M>YOycK! zRf=?)rP|+ATdBqAT?IxlFIAZB5f7Wcefz1DX);alI9^aoTT_Z;LWA8R<*0T1UkHO6 zCcTV1KJ=p#4^uwv{_QW!^0oz(UNyyk2@5AlJbU6<=hM5loHyV#E8U#KPsMb5{w{Ay zhwS^j(8c$R=%?|evDYePN_t!0;T#@2UyvCamK;0!3J_RiD0n2rB_&m4LM6s`#v0Qa zpClSP$S9v--Y@NG{{qdjHM>cAB2gPktlb)Q^mMDZWyVaXov4*UypDrbQl&t}wY3;^DJ$deq_1Yy)+sTL zr}OW1DVJ+e_^%8FR-tc0x*~nhmRaveRlOQoLBIu`UZ( z=Qu6$g3rs0#r%Kl^S_xX4#;$7c;lBWeYTJuUu!!r%2=h+P0?^p5~~*gm}aZyX_tFV zwYB;}K1-nq8HQ>YWY_7i;KHvljA<7aIkom9)|K;3hDTV zau|68Q!3!!UNL8GS=(9^weyJTb4`5UKi90k0hgHhl+-SF$YS}of&Ec2X^v1)K)^#g zJ0Waqi5s}tU|bH#H0ShJv-3TnI3XjXibN%@ zB=dzY4iKMRg}k?`hQ=dgA!=SPJnOBki`#xw2|N~BNEm;sVgAtcx;e*ydYc`^r1IWq zDLaJqLi$OFf{K{HoCgV%g%#U%?T3(xq9Iz?kW)FP>%Nb8X?WriwdhOTlqPo$eLV~S zWs7?Kgha?i?ye@A3VoYFrb%OG6-m|9}E4-wWZ;&gRku%Qb2ID>_x0978o2DUTE`J-g4= zPJ9_Qx}aNY;e3#Vs)2sBPqMGcpZ2KgG6xYD+U*Y%_D{}e*&dXA!pw4oi3`|vgOi~_g%4~R0f+CIH(kh_^D zYwM6n6!emu9B%iq9kt&&c_fm>UnejmC4d45RqH*Qano%i+qCFg^V{*L%4=$cqYo;c zI3@EzQi6k7x0(poI3Y(}2-%xj@6+6?E6;@YKM=^FC%}pgr*A))vHeVqLH#QvId>!Y zrEYG|be{IpxYF?XenJGd;mLkeea$w9{mL4JDl5X58cN9WUgp+Rx27bS3=?xMx zq;B|ihfK;Q+4JnPuNx{B+-uXW1onGBR4v$x*?bPxo$e;a9HPy-=g*uE4rn*|;v#nR zO0GmUEAdKIXtYHd^XOobs{B~@4W$;sgPlS@+au5WAm0+WOXLI)e7Sf8^vGl0>$tLM z@kTRDw}PXXPfdKyRw^1!W_HA`9VL&U+X84~$s=NleUZlYf9HSO$>OTB$ShIY=gh5z zxnGZh1g$Phd-qKN*|C3+YQRaD@7$G%%#H$<#iAV7z9TG3Y=b~DYUc?#*v^Xe8E1k zA)IOH+&Y~m&F6o6H@Todj5trRZK)cgLJH*?M5071y6qFns6F<)n%DW=ZjoIHb_-t_ ziz<%rY_1?dMs?^RcJ{QZTx%+QvDtal&pevgV#l3e3(Y}+#(CTo)MF9 zZS9gY`d_)!c`mzlO9^F&>ExNN@^bh-Co2?9&ZVO2=$aPqx&6%ki@vF$VY4WqLSnJ{zmY=I}jdZz;R)0p@}Z1Zrun@`ZKv& zL_Ei4Iyn_Hl@=C@A^%goO8o&&qjydyC?g|#(f>J>AVwB^KK2KH9r-^iqJiQZS?|xT z``%g5Sk}vjH1KkR@2DYX5gS zOygTM@!1W3_z1EJ!ULpf7M4Onu3CY@Cdmvs4ad0`?0{puxxP;Aat*?qyZeG$4_pq$ zA1n-Lnpgy~$vlYMn5~y&WNE;QGn9GJO8c03;yz~+;|;};d$HZXPX0ssm^=7|UPW_n zxGrD8Sqg8l+ItmZUaC8{;fXE-gLTJ^8Wt|xw21^(V?gg5$&)AR&#L?O&48Gmo<0)J z-bZkG1ME+MY56G2B|t&}gY+7s_9usv5F4wzN6Gi8#XGZ2PY&+G(7j)Dk3&MZMK4jcY+e54zNc7El7dzImP70@ZT^@9!@Gv|h&*X(=g@-9vyuV%BSX zPAD!RVZ4T~c?FnwfzU$bf_?&)6X5cl|CQ5x$e=%oqtM9Vm z)(WN&vv1#dX2xtO$aw9~2^^}H@?2bB8_QJdA^|`T&2kH{Duf~m^T|C4PwAuFB1@Vwwak503XfAL7e=O-|ztc8~AURYXbux zU1dGF0>-LtZf*grBmC4d2?hoR=`{m@QYhZ!44877U*CJ2Y$yT}j_3K_Y=JU0zy-dl zh#=v6M#8INGoXDS=`ZDxee2&o8`w}Yw^%aO-FRyEp-nhhs1YqfU4h)&! z9Zfv%BiqiZc?SG$i2%;`fe;mZd_0ZY!3ZFf;l2Q!2|(i3!`a<{2LnJ$;oU8T9G%3# zVOP*)YXqRlfSEe*W9DnQyW0Nn7gBZxaB5EDuu=o$tcv9)*fcC2NALSMXLG?{caZts zu-Z(q>nu#v+UbJ}S9HQ33=aW5@jI?Z=6Zi%F9q;ZOM8)++AWDuG_^yPhR2rN)4+Ir3_ z&ohvCz1CHrI-^pWGZ{y_w5b1ATN@INv{)*D6lY}tD76wIM>?KKzu6lwS1I3y{rw5; z=~LxodqB(sc)VukO-#R~I7aQ~9DwVWvSn#Z^8g2Pp-{DGtV|#JzWRN46yP^g)G_LO zV_6mLdIyEUU^F76yw3UHni?n`L*N=;hJkN=i`%{)w(biCIF^$Y;DTj{1eV_cdu!EX zqOltQqAml}E7Q-Y0BJV^_;PmpE2bFFo^>P{%zi-=f1>Z&|9avnV3&(gW+5p{@+|?P zHh@MEa@o!R+u(9;ZEbC9Y`VFrK6~)S!6a!Tc3kaw%`W8v|J`IL786z4xsXjGv@0PO zb_DlXc_aQ6@1RN|$jf!wyY8#bw^Db;UvW)(i!UmWc;jO`y0;@=H)M^*LAvFs_$IZ_ z_EpBd|BWHE8p1aZ!7g6?x;0(~m7?Ue94!p=H16^G1Rz~ajg1eGkl?!C>D2iJZf$O65Cuwwy_^rQwy+3(9Q2Hm zGOH(+9()GPY!r^cjg1X}_QHx@pd4-v5AO$qD<`9?t*Z*K7o{~j@0P5XHYY3dDl6G| zd*T>F(?gAz>j5teaGZDw#F)eV(OX}m+L(f>##t|O%X>h6n`Kqj{WG|7vXAXT#<+%k zbOZ#Db|ud2E2A51N@TN)m*5WT!V2%)og<_WJ$7-;4qOMp`k&dgNTGd4uRbAP8NOf@ z;mgOACIO7E8i~Nx0W9>HB6a3N_$Lgq zxq26?zL~KxTni@vgg$x+()vS~k+JdUQF2B`27ekxLIyHH!y0Dwn`-A0awf17%&+4@ z3@Uq!cp3F(s{~Ri`ayAHfBc+jUh9@26KSle-6r5)%7rr>o1L#kJ?UznBH>61@#jX>Q2BhUQmyJI)%u$pihw@& zIUayEpOc|m5a$d49Cj+N%M;e=-rlE&46_9QCFcs<$4ASaMFEm^Er=N)iidyx{QWWb z6a!JOL)Z3?Zl%U_{7D5o(_8c8QbTml4i?*Jm2*dm)a5M^=ShZOx&tIU;Gc!F+yI8Y zrk2*9Q<0v&^*+i~u;Azlt2~YUN1G8AD^rq#KNY=+wdsF_J89qWdgpoNY>Hg=w-K3g zx%Ju}>#@;l*X#fl0C3fDfHL@-pqDIZI*>Bi zj-Whxgu05iI|p!<7B)WuPziJC6f?zSWMp=ys=+u15WNE4#}E+3*^PdF{>=?H0O;Bv zM%4yZZqfG_NmdJ6TlIjaYOMl3RGN^lUV+l*ssU;cEMI<3uo^Xw4IrRS5vRDj~1sx-qGlWhwC{t@`UW@iOT z++LzQe3;H3`eLqDr8Gyrc8$r^BkATpDA3+)d2(n- z&KD1bY3z$T433dA<`P@RG~v*75O^WgHKo>FJf4i5v%*~I#z>H2Td9zMlG@DHpMufM z&ZTY*2MYywW5c>30L5Ej)XpBZuyIil=+-Ydn`HH}W$4=2G@-)l{xJ4C6wsiqCUQ}7 z@x3WnQBX1j&t!8mv0*#8j(}%uw6>3$hU0NGz?te-nugy{t%w9ZK?jTe)!kg#WNpLR zeb7HKT(M;Nhsgm!tl$@K+lBml7d!R;(k}LYdyo0QyDk1dx**ykld8Ns=9AM?;>!0w z?EamB=wo#(yr&+RZ**SvK@5aLV2@;B4TfVAutHI?>kD~UZHDr(R!-;|oF&@W%x;I< z{Y=&TVZBWWqnDfcm$p&K`vLg^uI|suow$Gea=lnHATy3Ar5`TmGL(8Pc&xS`5gtCy zA9UNvTr%&G>Cq$=D}@&p79!}lb``+0eRokE7^JQC&%>Yy5~b`EAfB!lpY=p6?8qhN zz$7IlL&x@R?N&>hQwc3#{Irt9{2tY|u~F6Z@hn_y-9~2q{3)-aPYXh8|4C6eG|+LM zs_mot;H>T9;UDsDb!}Sx)mj#Yj!xaDckTr>4Gxy9a5yyfv9dEZ$?%}^^vsmr=5^(a zD->X4>|0vG{Lh8({l%-Fh^L`6pFmu*P5gT2i3Ke6@%84g70*^ zZ!)W|f9OkKY>frXC*F@{u@hDJDgMpS^<`_cx_8>6$w@7nXh*yR^D5 z?!JRa`U6_^Bsgmyb%}@w@$Y@PKvg1oSKz4iA@3XBH*Y##C!g3zG82x_6s-pQ)k(vhuyfF^K!XSwc*e|qDHnb!-$v&4>2O7K`8Ww4w*8`__T(ykZmx&ceQq} z|DVrAa^ig>szWSvpsVob`eO4B|HP$#KQ%>a>p!rY|6YFzJ<(Y6KeYf*Ao<+`BQ_sa z-j(pVYa$>(Eb;{!+6iNScuBwP{WC-|ff;(m`4UOuZAVffK6!IU*az-#f{<5+Hm$Gj zSrp*57bV(?f?lF!7eA4Of>D1;xM87i8DH1ev>zw(=JDBB>-deg84RW*%7#y7r}cnT zPDWNXH6t%GejqvT@<26FZwTVQPw=>XCX1jrkp_^g>g>{nD&5OLY= zj1*ugIfN5(RHgWbhDrmVdvS5`u!d)>|@9-7k{^sDFlo3f3(UVmuz zj*#7GP6O00??$u8NK#$pLocq=TheCxTY``_{4Ln5tHQXW8g56D87Wb`{Ve^0s=0HI zFr4);kNMJ52z``4XklRiB#8W8XAHEPsXe5Ef{Ic+sK~mF?uS6Q2M2fWYyap3i(x^T zw)GBJ1wm%|dRQU*U8JK_;v18%m6g%;z<28vyC-<@fS$|hRDDO&LGiic=g<5zF-AO& z^<3Fx)9$E8t251zYv5_K0;&a;^t3q+96+9e^<&a3Srr5_BuK4# za4`yXR(=11YooDa+hD(__E!6JHs90Dx#2Hu%i9Hbsl#FkO5>+n2zQac$$J$YSBY)J zU11teG{IY%(_el*Eis8F^92lveYgG;A!}}0Z*mNKP@s`SD9?!9cP1);x~2TJHjwHC z5cHs+((&?y806`1%WG@L|C6W(9w9FS*9v?hB1(U97`ZkuU3q`7(E9kJu&^*N5&}jr zr78on;1za7QdXMwhXe%Q@K}v8SPV>=gJc(6__t@zCME9T>T2L{MNm-ZM1?UBqgyL0 z0mPqWrhj`HrJ!O_0d_V2Z)$QPuxGm7E^8^D+JJ%v!*)B6Hh9Q*2m@fS@Y9z|6rpMb zN+zJ_K_g|{uU@JXT*YrWl0Q{#*l2tqA>#8QO1bb@Yv_shUBrAg>TNmlIR7`nIO~+eQMh5Nb&3y}} zb6fqz6vm?8eQp#KyBnSy?p_;@M%O>8CTUt2aDjh6jwFo@J!&{1JLzzfF%wJ4J`6uzyAaj zWcpHgu*f3wi9lvmVJuN?S&0my!VkLcWspn~K(cKaHij}pLHH7hy1CwOIp3WQf&teo zVc&obke?WlJg4mpC!!9AvIBzw-B+sF`o&?Ea2!<=v3{VgjnE@^6=%iK;*c{$njMzk z_5n7xh2{3Ao8a8zCF-VKAYUEJX%QfxK~PCD=4W1P2uwZ*8KA&Dfyq zNs+mcHmg^}&{L&U-`rrB%+SR_^;euSD*6xHQsUfOdQvu^#XD&-cRTi^-z(lV1sRn0k`QCp2LApP@d zX4czqLSRA|qnFF!b!IJg2wa1DLq&<(Ju`_`b&7c$DMcLj=bCzBX#J0vO+O2RVeq#k zZo8g{CMtR2o9GOY{spyTZ#JfTX5Ph z3;*gMa!|hCce31}bA;eHC?X~Q76<+Jw9MQOE1k#Q#k-~$y+gN=Rxj`4qc^Cv+nGMt z#JZMy&cUVnN(PbsxY|P9wn=Xr1*#Rxuj0jd&5D>&#j~5o=t-OQ>CEsd*}@YW2yA+4u?fp9YotxWRrDDzC&tNWrhx4F9RE9;yG8p2RRp|m{U!;Ff z=GYsfk>B#{*;GhK$fz(02}y2u5V4?!hP`bD5FeACZRZun5DABX1NoVLo3F1g;cea^ z{z~Bal6G>YLomMV88Sj(EUm#a_PhxTwiL^lA>TW03L_IBmpm!K^?@Gc3tSc>^ja9)Aajfz1@p;s} z#PR8FX;>}AQ|$mOuBTrdNQgw?w|dl66#j45TZh@{@B=POcG#=RpZCj8QyIx;`+adUB$ zqk2EujGLRAj*c#;Agj)904LBstgXBPiI0d$@oRtx583Z8eS5v7CXX|ME%xfcqU%d)pPhIFuTuqtx2v~P>lmWmge z@+Qxnr(QRQ$;XUmI5bgRH#*?fYGvC{Z|N&N;lkbL@gNHgi;b8Nqo4EsORKuYp zLF+QGQG+RZ{5_~03ZKe>9&mYe)!RcwOZzgj`}|61_TdxwoCy&W;qdC8y@|PeOqiwj z!zoCs32S<9*U~Daxzz%{k+o9wmgf~qoE;y}G^mW+wY0Q+{W*HvMlW9_)6pS6MJWEh zdH1Rrb{C=5oB6BFug9@aSU@0!lOoC-MQcqZx8+M(diolRNIG3U7$M*Q#;GiV!(??t zI~`#ICw?Md3S_s{<&K zD^yte8Q#5noa+J9%~6*$L-3XqY1Bt=pX2FB`@o~!mq44Ymr#Aw9?*CQe(rj*=_&RC zR0o1rf)z>h`tSx(KzlYD0qqyh({Q{Q(AW58C(Nk*SWK)B)N~@JI_gy)>|*Bq5yAJp zFQzXZPgqV{Uv3X@Cb2<`7t+jfbyIav{&WaQwyq>bPR+#3+??5&$uzH6iL{jj`0T!k zu;ZqB=#~37$!H`jn{b&Iicbz%a65FCf(uy4*Pu#TmhJhh3_XKDQ_b9lph<#q!A#kr z$;O9y(E|jhWD2Y^H_s8_q*#abE+ij4;*$5D95M+(O05JlEmN(go7`OikdG>f(x1^~ zDs!Y(VKf3}AW2sUNLQ4XCxF^^JH2&_FFt|gvM@8C$&f<;=K!ZK#dCO=L!`%GkKtYj_7ueb{CCO)Qf_-QiN1j>8Doiyyo9P z@tX1-jDMksv^@N#`6-zE9JDt^2BRpHJnn9s!EBHW!`KHHxL{PRHPZu(w`HIpABbbI zOp@kiY6NpJ3-V4lt$@_5Sgc8<)Q1vVSXlT|0|tP_0ksBE((Rj;HX#XSdS;Wkg4Feo z0cd2bPE%TO3^N3!3GuP=MLFZA5C0sVp-G{TuYu{o!#ep|Z?s<8y`39zVI8wDR-!9R zEwz4Lz5fKQe z=&H;Nyzwx&?@RLwy_Be>ipBZ%j=oR?Ij^{TDrYvW7AVf(k3&74+uGVn`)nWz$lvlL zkh9%5aLK#jHo?l`<94*Mk=?<^#SJc@YTOhanUv|Abh;$dqd>=n*jwim#N&;g--e8@b~t(^!x%0M zv-OnloHhGvxf!U%dY#g%tCDBq!vrFxwi||a;}v(rAuQFuHa zQR?~efro%#-CR*PM96p%L)dar{T9qyU=>o?Z1h198?W(h|~AxH6BxEBVI?ti4IjQ^f1=|5MD z8HA4FTvE%Dz1RZK5 zikY}X`pU|%j;R4LEIQ{bTv#qndW0t;E-uR7zbPrHFgNbc4KPj0myT8M?LcRHS2}-h zX`ZoSWhm$LOlq%FV#h2Wc3yn)pPXsZHaa-N7m?0j)JdHD98=8G-2318eYkZ>8EjG8 z27lw@HzRak3}TY5b`rn)%EH2yk8ZDU-JPC`RO$TMy-?y`ScRL43m^6pLl}n_e`6_d zv8LU-;VcA*!hZO3#jE=|X4-ENW%r0eiKQ;+>7kld+A2zpc3LjmJ7#)2M#jHQZ6Nxa z|BtQhUrSmO#OB312J!tP0g}~!kG%Q!bN*lLYyY`UuUzfj)efFY^Dfjm6~|+t5qHLw zV_55xH+Wdu7EP%Hxkw$dwDMP2*4owGZ#xVnw<@eFFBrLN+;7_2XqTSw;2$M9IL~!@ zmk%YPE<7yQLq0Z84!wJ{W5&K*jS*hlL2^d77h$-q6%m5_>Y(^!7xD&%P2EH^Wjdfl zg_5jk=l14oazo{Q#H9XPeqOA0+ifihwF-*8W%8zn!gzD|b&ea2iz(ji?V@ZpAq9#X z6e^`d{S*B!K=OKApw!U7#J+Y+(xy=rG=YueE^&{jCqq50VzxL@N&3T2g}?-KO8PPv zTrMs_e2Uj{MPaL2s~;UjnnBMC6Q7=8@9bCBS1eGQ?vy$ioOA(hjyNMGM1<#A*u7rFM>A_%=< zq#Uzf-h3jVdMjJjKW!SLR;+P%c#eY0T)=+0Dib0eCquNYnbp7vU0v~0)M|8NAsz1N z&EswQ0-LZbAc@Lkyjn_ZAo_=YlcxuC?1iJoIsm$|seo`3VLV>-iON9+xvRldbL6)u@=dB8VMr5y+<~dIbcVNPWUdfFY`k z76jLZkL;F{gz|WN<(|Akq~48`$f%Cvv+g0%UG<#f*q?3fe+rW>RNI117d(%5`B79j zW3lk;>$9PVjwJ}w4s)-T2ws3armfLJM>e;CP-m2_Q&8b$x``}3Gp)MA5$c>zM>RDwf)gu%6edn51&BqG|N^)1%I!UDdqA=_;csEwDF`ePhD8V+!NGvtRw; zo&J>Yjz#54+4-&?Y>pS%FJNwaXLY!*aG4rCRy@$i^9SD?f4bjwHxt@06Ccz?QU)IH zYR)hZT1-)fHa@yyRU=7uI46U(4ecnt#p*qJwDelPEjcjyLv=2Fmcy?K^bLh{(=j&a zp+{)pPG3zO+CV(+tu>y1Nx*J^bmR5@o>sL*cNCl00+c7Cp4;`nSz#bftoO&~w{}Gv z|BT;w9djnS69Lb#146^AI1G(@8WVJVX+tb6<)=BA6vy)x0Fr;IvUubUBL3^JYF z;r6B-dasYF95iSzN4k)wi?!kutn*ZrNr$p=sI{hOAq0s>>9V(dSxj@)1q-uhF?KBX zn;Dtu?gVjGYB~x0UP`BrYOt!*V;*(uDc1ue>;~K1vPb0dytmBR8V1Hjbp!L3UF)7v zc~w-3HrIOzQ(RXE8bWILFY zXmj&5H(U``U_3P~3`=LTcHd_L8xArc>5gRdVW|6SI1?n7tg+)~lZmR@3(HPjQv zD<?RDmbMV&(3hF=2`zCYjH$xnEm)vDvXj(1xPqkggFj;y*dNmt7 zf_WM#(b1b>(h{o4Sriy6Lrb~`ycb>YF_;!luKHpE7!PO$tiCU&CDTOv45*JbAht5l zLjook^r*i7yLdV24au;;0Bef4IfXrx*=V0Y@cv%%M2YS~`!+bDNr}Eoi=uT3J%MMU zP=1UXWxLuMYg(k)`J5|&iuK8Xbi>J4lS;a0xRXgd305cC#bsz~z2P^muhdIK5fVcAL*QWGHq!HiKNaqL#bN3qNrx-#NPxbarG&RJGzH( zc}VkEKFCG&AK<08tCVO$|NOj^+f=o(OEEp;OsY{xq@()L?J)=I^WbO}*rmOCfvObI z?Rm{wO+&(Ubk%pcvmq1xU_{|knM&{XkxWH)35`{T+{SqU7Hla0C~DNo*I2OAVWO4j z$IvWd^D>3bUa;oKj;Dv>y>0$jx>QVbJ)&;2R^Ff%qI2zV<>T8;$4WqFEZMex)ywyO zTQ$c`^j0RTP2Y#1`7B2CYhZlUAiGEVYCO(;1(#u-hgaZ9*H}+>6B5$FB zPqC0jGBPr3o8~uM5yv3s(SAq5NN>rO$UjSK{)}75(D#p%qcy<7U^!`_-c+qiwBuku z!!CNj&E>f zMS(k5?#HjSzI-px;br1(p<5*3<*FCi-nm)`+&QpYx$I@gLqR+9w9= zvt=SB+AW`;Y(O?W4hdN~iL*isHJuslh!$L)JTcK+-cc5`VEpNnU>cQJyJ{gXuPOK* z;|n#n(X{&0ms^6iJ@uH`2$yD;9LWzy?d4AwA&6ly{{p zo}*QQx>CV;0vd(mAk>`E(-w$U{Nz(BvlXI%!(ZGdGB@%w8xefllFkyM;Q6f{1*J7^ zj5TLC<`LmN74Yu!%9xpyc!5|JtM*La9TOqo<5!H{HXN8yWFphJ)5Tlynyc;i&aJM! zjlK_?PEeTCq@s2{$DhX-jD~C$9ko2|54*3|!I5QhNHUo&ep%{wzSrdX^yqn%LI&%Q zqgZ9!z(SK|M}IddAu}AVELz3s^xB0CE|y`iYzGk)dS~YaE*3_%&YMe5cBZexn!FEK zJLLELU#pu>7=A08`XajuDiy1T!Solq$??C)SP;tv`8q?ly`|dtIxwP47)*ZdI*=bI zRMFE3wuokQNnPTK-wskA_lUdd||&)C{Vu z(iXXCdi3s6DO1{{I)(=kQDH&+_3IM>;SV*0&vKayYQq&DK)qm1jK!hi)T$mkvU6df zY)J_P%5E^hVejeFoec_YQ_ha5-B7y1U*RL}}kngTX8@Mf5+7CG{vzf*bFBey^ zAcNonqcv5bFr)iElRI@}gpcEbq(X2>7uxnihy1l@7w3dwfhkhq8NHsongHeWKyZ`Zpr1Txovw}5e&tHUnG#@KT@=xA5wEEMIRg~ zzUJ9cmpzK5meoZ^Ko~1nHGF2>g!u~BKZ%eFoai%7E2_%k6_MH~Gt-4?aTK=E=6m%< zNhJaf7~;ykzs9cy&eP`+kZj~U)PmMed0n(TF8OxSI_L=Ux-O28k?XJ5??!chB_{j$ ziNQ;bzDfjdEoVZx z-BhIGfc5Utj2dGjzosrEI8TP8uuE89Ut_KsoRNf3dxJIHjHwZ&q{~~`w1SJKNC#`K zqEYUg2fAWn92CnGX9#JN#s^&k2xw>lN+~3JwXVW=a`1vnmh+yJ?!i@Kw{#FK>ao566xx$rcTeINr4r*@BlDhbhGqigF^;MY}T7gTsJqi(46hzR>@!F zb!%^`AWGS<^k2v|EN&;i7N&bX7}WJ<+Ao67`(vsbZLwpmD1#LKg4GK7GP;manT^cP zD6tBaxDlr9MZ1c#Wmwg0UDL{7A=EaT$K#amiW+NR8iU3sWnSl&d<-+W!G&$7-=7dB zIS+wZ)a`hE>G}Go{^|ZKHVTdxtEV**cMS>8@oY2Sn%sP7seS45=iSDQ)s~bjj`7=% zJdH0e480a&)(6Dpxfi*1PW&I8ALy!;^swSus>#btwhBHqo?Ibe=6+B}Vo&tw*_zL1 zcnh|xgV`_Kq)L*UE>b*GYQ@a%ms}P~?4fx0BnL6$jo)C(XDsXt}q~=(8 z9A!V^{_zxlC`sjwmHBeBZT1(f=BC$}hh6iyNh-VHs+B6F*v>1#`LXaYk-IYM%IwBQ zh*OOn?*j(M@=BZ%TZFq`E#yp^rQI@Xc!&en2tV=MZ$4acXxQ#Su?|S?m2ta&@>{Ul z=3Ak~s;6OrR$nM0$6sA$NRQ@;(4k7n-iG`lP%x>`EPrDdkz;y0nd1YnGTH(Ys*HH< z8J0@r#<7X9f}s3_8>qs7m5@`K>w@!!6s*=V2FMT2)o-#Pdo)9ek0|wpuZv=Pjc=Zz zPSEyfRqil#E4`gNr5m1H7%!dqp`lhNbn6+)Mz1f_8P@#iS&O}O`Gi~uK9;>zXt*b@ zvEgLlUY%PdP1Hz9+(_?CD#`fmbHgQ|&Ezc6SRR$1kmf3BYX|$-uErHK*r4!iVk+g& zm*g>xlr~9pHE}Rcs~uknx0!9{A6 zX|2om!nI3*Jk^aw;k{$%F8&pLAy*bPZie?y!BoB439`zWrzzq;yR)^^9&w+~~v zSX(+XFTYqr)P*5+{gx?B)x3E)>`g@1@{b?-z2KhpVy^x^!F%Lf^0#&KXolnY^*W(%{a_iVU8PReOpx)fFm!yA$(G zAC{x8ao=>6F>!mumwDJ{a+r;V_u6)T=o-{J;6m0oVOjE5v!nqQ@t<`t!ko@lHkHBx zaPeL=FeUjbe+K@C9(!^dVHvQV@CVZW`o9klz3N{MV4p zdrb4cuF3u%KSoS=!YjU3LOnu4z1Oc^2?_z4vYL^likani9)Un4GZ6e~9$~T4(@*rb zKRZ(R^tj!)U;5p1Qv_n2-yJ7LI=E(gie5v@O|;~xMG`vCi%pB=MFTUf$tovqIYZva z5kh*#M+o{%Q|;}fgyg<|G;5JZo!UN5;U%P-i**>;-=sxdS6o(K-|WKIPO%>&2S z!$0EH%D-=R3kw4$o17bmbi=@p7nCh8UcdVG2awGSF7AHy{G-2n14fa%wJg)4zE{7| z%PUTm&m*JpZOf-h>b+74wYv>Y5SD`{y3=8YMn`+G0J8u*jet-By}l?w+B#g>0Zwqb zJx-yJClA_uqnTosGgT6J-bnzXd5N#H(Bv){h%WI9272#!czE4^64t*qF$J~g8XxKu zlkyC#I0^D-;JLjkOmz+ADk*1bv*g83b-RQDehX6kvC48`9`qfn%xCbFt}Zu{0d;o{ zu)VKR{T&^d0D1tt2_gR_mn+`Mvd`~jlP2|XQjhlGA)rWqVsBe450lDa<+^qR>Yb-2 zXTRA{Fgm&1krF=3b(^F3aqb*DJ-iuv@iWG)G1)io6d5tJ)@6o=kY3RU6$8T&z>*0p zmO_Gpxrl%&ZSc5tF*75#Jv=|>0hMvSQt@giz>UP&o}M%VuuE5$y_gIM8M({o`Sa(5 zdr_R(s~a0JktdRZT&%1YpqrT!pLZ%{U;omJ!+!f6r2QRm$hqC!)cT^~Fc^q~)+e2U zL*{++R-DUt^j#%g=|daSoI%*pN*6L-hR0DW=qm0JjV`XQPc%ayJeWSUby-bH3JGnQwJMY2)xWpGP~qMN&E9 zfM2Us6>IB-oy1R!E8uv}{66C@(?fOmAcj8Tjw9-QL@h*GVB|(pEQ^tmNs;m5zG z#i^4)c>QzAByIwlgz4Pb!2-{x?w7y>qNk^qQ3l$;pp7g_%CNfF;^nwIwY0T`g^4+p z!t15e=8J_*zOD}ZG5d4%L%`eV6~;p%nP_Bb8JY^fOWxJCH?;IZ{KRhGyY)B(IP;D`Ibv-t4gA0a?jeV=|N(hdBRrsCp3_4TeIB40f{L8l)-8$%Favjo;10EaQ!uJ>bCnF2fpV0_>9O+28hA4BoD!aPgYryiSydwF?H zrvWcd5F)RFVkL>H&?yn0G4L6O50&0codGUE>=t;WeENf;+HX)g0Od(OcN0_vjB;|) z(!-!19$rc(pM+M0;*3M(i`Mz%>+cqMmF|zv50v>CiCe2cR!CFR9WZ4LW5+(mjqO>0 zz~(YOzD^x!5Tu|{Z_>~if?|{B;(9%M4`{*IU>QH)iHVGp1=qNBCWZ-)r zF2bMr^clDsJg#RU&qYm#OUwrLf(u|SRWkakKO)ojxLukh*VH?O;Fu`ZW^H$ywo@Q6 zi3xOh`{7Kul4hHB*Sy32$K0FFXL$=_PYk2)<~A35&oCVAIIOmHR4Hh|oBXNaHHqXK zcDrXIrqI=%XN{YoiOztEZ3M*3eB<@zNcugp^%FM*27p6=OMcE_1DFuNG2gISX#-au zaLjhR$*{gVZ-x=z6V|5k7&JK@Ed&2nrn)Dg!`)xfJb;C1#RH}D|uG%&%{eMiS1&YdU=8Y7bhp}D$J+hWdIf=Q$m(u1K_Nr zq+}jfIcX0*0A_yyuoLVU#ahjHsVBe~$cJSV9t^oT>MA!J(*0TTT%+FM^z<}}xFsO9 zGsO26>?CWK?Ok2x+v9z}%14oGBQYFwkCEEykgGrZp!V?=7Z=xB=OKYg21!KW!0grv z6%{2Q4Gu;|R6#KY28J!7fPBzG z1(cUad3PLXXBy8J3c@$by1i&0H~|6f4B(mJU>j0BYj^uw~%36*Zk|hQI(%mC=xkb1Y09RfnRUo&SRn z>@=cLd~B+umU==GIOS-)W7v3jAaz~S#atP8ELl!h0g7mkm@h>VT>y6mj1j7bgO z9i^=Bb@|yDoTz?pB=23!)nu;RQ;vMuOi@BEs(5Bvdf8^CM@v;U9rTZ`9ZY`}w0sfF z-?+J+ENN*R7!W_;akDvZAqt|^+m0phaR@&bU`=O{6jrc1_jc7wy=sd& z*$}TEwI<`_kCie^gF+dp=QL&kj2T%_I_TiwAhMf-NmL|;{4=Xg!=z7;R)|dD>T4Jq z0FNUBg&L5bJ(J$K1aC5UNR`GvJNZ;p1V5_adG`lR@cYHYU{Jq&dz&W-@?^;DQ7M&Q zI&0bw19GTDlz@PMG*yfxIX^u6NzmsYDteJKvjElVh=_DQzl6vL+&5)!b1-OBr`o47 z++*&15Y{O)@{FSU9sU%d73n*4tTDzD7$`ldYsymt$qY(W%(N6{`*=~93`ds+mEl|x z<+-Q4n@kK$iB+2gCnI!$9Z7oUYnWy^XN4ubhG8qque2Im)TYEmt`QXwahMCVn(yup zM{tTR{&)~cFmhsu@D^6S=VVRv9Xx#f&(iraM@9@Y5?)| ztmoMV*lEJ|i-q7dN_C&KvMFAlZ2jym1x|e6sdiSKQ7HTLaeOV$LRgWPGH~nh~;QCfFrYVgcFzWTz`%N_EX(m@5JbK{h}!%@jD_ocXPn({Pwr3nQC-Ujv_vjH{v3+^P#)6QE&^NP@@m`sXf-V< z%b}5L?C7a%J!64230G9MGkuYZSMBvK(f{xkm1 z0_P*?!jlCmKZ~_^QY*oSBm5#6&-gL#1msd^+knWCNIj6|p&(kC+_=#G|av)t}4GAT=iN>>9YNKi0*>jag9qfFI!iAI@jM*x7Ob-?-hwF&G3 zc-(GIV7DB%kVo%L$n2ufnWM#*PZ}u&(I4SSAc+IGmnCCqd9Q4UR*ym9z*QJSrH7MA z5(X-6ZyT0xCBxIeXslLkQHTzegGUJ695to&ke=44vLRw$r&dmN{>GVv=NFn}GFgi+ zq*?7DoPZwu$6{zKJZTv)Xz*#0Ky3U8@6%Q8KriG>c7trnaq0Jpd*$a-UfXL6J(khy zol$*tsgML;9|3IWdVkr;0Vve)6U(6w>5n6IDz_aqzuPbZ2pp_BqL0z!3h--M?R}sG z0)N5RUckk2bkGb7!D4_Lm)Fu-01GMW)Lz&)j>&Z5hvy^k7W(Iz0n6C%_idJ|w{D_Q zngWU-aRZ=Sq6?4S@du;opv9d53r?&8fCrx#T~^2)C-Depd}Y*H>#qp8GoCuj#xa>% zU920Cxz}AU!r9mFIOfl{Y$328Aj2^(7V{5#I~wvI6rn$1?s>$eW7;iaklc@cdtWsS z_f!)4XXIIq_)m#mnc^X?Nsq}qdh`fobZlPNCv9gSfkkGz(&=2yp#lR7%Rf#`M(&t> zwi$w-o~b}1h&$ESM*()DoEQ0sE=S8g)zvJo=+m-H*p%8Fa$Wwgf6V8udKQ>+E`n8O zVMC=*Y{kV0DB`oqQu^0eRE(UWU9dlzhO7^R)s}o5oic&uyT5SVyVN@yB7p_PI12l+ zVgu3_k7YXl-sZ0o?+wu`f?_YN>p8}XjG`>>udA^sU8SBbd_!|n^8@XvMdn9tS%ZHS zhbA!N)e?=?wj=cI6(ul5g1a%|3wkJ%eJ_^5RN?jS3;e=+4Tv1$NQ|zr!5iGyev4pu zxq%OsZq=V(G1_TDI})Q~uJdI9MWz%h%3DTR2rk+{?Ds!4zV}t?zEp`*{Y{v0GyH}3 z{<}Hj|B4rc|F>LmRz1{Yw)fZGGMiHl*S_<^cgKU@qklte5r|W@Pxud>JoV{nPe}*; zrvDIJ08iD@ImXD&jf7ieU;wrBzo+h^o}=9Yc1k5Kc5`RzSA6{Qdj$YEZa)F?2o7Xi zxN)*)yvdI@xaZy)ar1(@RQjnhQu8k3{>W4GZ$MAtLmUemT*Ak34ck8?-}rN?py1P! zlMD+*uRpjQH`%?~!)IZ}_r=LJqTEDA>0W2qmQG+9nVkMNhJ6#D>VE^^t?`TVwMZ*g}#2fn^xTD~iHG3Qhmh1kH;k*GuiK75o2p=g)hs3h{9!@PIqz$w|D z-G=VLd_P?+40lqX&mBUFn7^oHiMQpClP_+*YkCMMAb>U`r7()~*cS|+d^8~P7~(N+ zP0>(m(@m2LDL(}A4=a((VLl6ZmK zLv3yCB+)$pt22*kZdPh3)=~?>ro4aRn~0r@FRW--bB+Q!SR;}&n|r2IdFBz33Yx6W z03SDQJ!`htIdM~(qNjL-#=3W`ERAjOoz0VTqDr~vJ8nIp<{+DEo?$>i;1{-sC52lt zLz1j%d9F?_2G-!yz)Z%>!-_w5zs>R$GA+`O1hG=*Y+46~OR3A{VGj={ODK501K8pB z5|z~<-AoVWY8V=vbpvubv2VbcnO1{*E!)pxZb&>wAQv|w&8_2pB;)$@1gmLleW}IOf%C%LNwU8Gg7xwubzF&N0TJG=tjr{=c(M5uX9pzQ zKt2f6{L~_HaNKRWoT&7{7&Is?xu`YjA>(0Y9Fy9p6LQl{8!7RWt#-pPUp%xvLyv~C zdZH|)Bk%umJ9crvN#G$@vQ#RFNKsX!VTDmaZym6`-y-?F~X~b&^cJ6(M-)x}HQw%0o?^A7+pe7G{FtO8=Wh!w#veM! z0fjYgP}NbU-@F97`QcR$ScDFw!bGCUyKBwSl$@Fx|1PBcTGtK5&k$zQ9pWbei@Fi_ zGA?6b+gnC<_L+-t@P1&cX8JZnDk#xZsx?E87ExH=WpIPmKu1D+NglEV{*TnMtL;pz z?9c_I6M*ZM<``3uP?#Er`L19^YjB6=(@ynss=O&_wi;HAi_J*nLHb5-o3#`+HJ+MK z!OwK#9+k|2d(D?~)0lrpaeoqIB!I2+AIaezr}Zd$TIGb;d2Ct%ylK#)Gw=ym%xKu^ z?Z}f`@~)Kev zXqgN*`{jB+Kf^1u!dSL~&Li++2Kx>crwZ+y2l7o)vK_%o&2zpdaDFj;nweyhS>nOL zOw?FGrur}&ipx?!y|TQY+kcEbVc{86`L7o6w8T!ngKk5ZMoarm;w*=<@<*?i^4P!e zwbYqMzTD2I&=?8RI!l%2+C3UVu5Q6O=Hlx@*~*rv{EqkUKw}1jcy_!rfl;2kFqESK zw&>+L*B99(?2PeGw9{qW0VG&e{`fG_WmzOg#y z7th1a{ab3Th8=DL2vy2y%;(|oF|;@*oz~JwyoBSh$j*q)3>J63qC9mVqFEA&b%1V4 z^Roe6sspjhmulPXpyTdVnQ7n~XaHg90C%gi@kJ&c>sXY0i){4Bvn>47{cpUGteVqBVF3;e! z3@Lx5^zn4sybr_m8wUs3U11$`w2}6VcgA;T=;+;&Vl>~IIX0yzHSGCT!-zunX^bbb z6vCG;SaU7BypZ>G%_pn3Navs0bVK_vq=ljba{vwZ-38iR+2nOPKPNO$l7!(3^L?0= zp1C~wk1i%Pow~=m60ge3&Y&AUe(4#S)eI54xB;qwfeV~eBth-eS^bu9lZW&p>1PNz=xBC1P3qm-Q@OUN%QWS&{pHddLFwO){B}Krs9z<*&CF2_lXV8l=TJe zAfQ>oU(vB~b0Z>foh;sChq)nM{0O<4b%z<-UNcYK`1uA;-;ipoY^qc(0|+rpqf`d0 z4e#*BM9!FC+^xe`VEk%Obq(+05?tQ%dF% zOqHS@*Ud-Sdnq{@+!BkHr{?Zx#=f%>{FdPKMR3SBi%%Wmv{LV=D-R#VBwa06ZzCj{ zxUOqBEfqN7*VM@v_CRtTNEZD3unjQrNw?EcK&@x0>(&wK>b~>~;dEJqtyfCjksm<# zi|Y4b;_wmD)4wE|wEoG3^FNZ*{$PxugcvC12pRAFjv?4OSz4;VWy8|1 zBu#!{_!VlgFZ(p_m&n~Te)PD_x{%_VCWulW;lXTKVBDh7R*eqR^kYH!lkgc)BhDAn zw?c`X$x*0YC{Z%g=8?@|(?+@LZK1}=_%=@6Se0K~k#=bS(9Jr{ggy0R0(LJjFO@w`atk2H|x6>@eE9;t9jow$Gf}h$=k~?eZ zPw6S(i9eo1I^chjlBQ<)>t^tMpLot(N=A8KS>J{nvss=cZriJ)nWN$*lUo##QFk|0 zn>LuUmp%feM35A0TCAx4Y@s$YG2gZKO%!$H0r^m}|LF2JgF=+L8=_VXk`P7Qmcd!| z{Z1KAy${pgk^GtPsc+IozwO_}XY`-h4kg9guRo5SDzhs6#ls}0G5qxBQox*(oqwA8&{Fnsh8XDbGB#VM&Gsk{WxxDanpv$)H#s{6zn9Xc~`i5f|L{)>z0>)$^!)WSYY$Pi? zs*+3sh#;NYLJ0{4jB~*F-S2|zf%m&$$cDDDKgjlwdH9W7%!Z0o{wI{I z5V-UK%URjFM{JbrQ8d(|Oci3*`bu3ECj6BRW>yS~&I5wBFXa`hO+s%e&b4e$ZIs1N zpnaD3&pSO}2eY{)BN2=XX$@-=_V1R;2jE0l7SjI7Vde{hCOv%q5V?17bS)~9pD5}Q zT|q8YrtTUca~k0FtwUJJB=raLNj5jnzNBqm7d3rN(x)(}ETfJdzygNZ4X}}@p;8ks zJSn`@`RDX_-LZ0@Vs)8KegwbK?a1^OJRb-CPwvv^mgh=FLAqLo%u1ZTVf#n3wVzaO z7E}1B97jvN%qOUuxwLaQ$2!M$&4wO;icS~?#*lS8-vPq!zO=VP*Rz7l*@=S;REm*4 z69b>8gCUR$K8T~yfp<(#ZF4P%Wd%L~y_)V?hpprH* znkjMn#hY+x2?_Q}V1O$5>t@=iUY$|J{2Dm{oR;fdf#&=}m4${%8317 z$4g)@`eW%`e5m0Yw2Sl~9!kt#(hK8M00Xsp`9ah5sk#s_tVlFLIz!niEbW5XWnp%( zro;0PBGG&LV+7}Be(?ounkrS|mSQ}MUW*R{U_W-s-G73kd2}Ej+_aFm8vK%9OW`f8 z6#fI*O1F#1$lyO31^Wtq4Wzofm*q+%`v3rB!l|s(1P>w@Rcdp#dfyWg)fkqwy<(Yb z@cmWP?6H<%Gsk!xd%C5S3MD(}VzmyH5UGLo7oVR6udPcWe0?V6$S3e6P|E#$zTPY1 z;<+%gsN+LdzXnmqR)A&YulLVEHljgI;42_pSnE*R`$a_$c~8u-6&S6Ma1?*3DKpc^ zpB$!Nj}Ep<<&;^S1HXYc;$_$D6lr}W75k{fq-@rAx80Yj+A)*nkJ;Q#WPZJ*(2E#M zm{>gg!F&e*9 zm)|i_Tg-}}(1)k-t3T1SJKELqLw53Opj_N!thMmsUPE0FF9)_0>V$cZ;un&dU3iLi zX6BQ%O9{f_5NgGTo>T;6r5Z=FdF8l@m5Ku5lzjGq<6`C#1HCnM#>Y%-)0pbD(=AUO z6AER$2>}QdhZt|dF#fa{d30sjpfLLl5B>Hco;nTb-fmr`28Q{z4Y=sI;NeZXjgRJB z)GR=99CE~pbs1pP%qs`MJdWSy^$T0#C-$!Qr_?R>?c~pFKJ}`0h*-#+G+0b-GCc88~>F6TQcH$#cbIyHQlGuVAI?__Gm*wp3!`$o)L)5JS#aWf&KHI|U%bC-tWjp9yl5vO%O+ z#s{4@_TWRm>`iFAj?6!?9eH)HD~b4RU0(Rrur{5WTKbcwznH4kzy6+p48afI9$se1 zM(v5GnyU_xQ?=4>(O=#KH-2Ho-y;n(+WxX%v?%V$Zv6cFa8K?W_fg?@NjLsvf4=9& z5f@m<1_qfib;ga6K8&3iyD?~B+5LVjf^nE-^jD3$>tPWr=i|FS_5T0S6aS~OWz|W_ zZ7X{AJbk!y?+mdq^>*Vs2Nm*f|LQ$K=?mCk_)vdd;hoC9e?tN3eZSCu3C=YJ?oD>H zf&SHnSNAd<`D^kkLwbgCdb*LxpXE$Uzi%!8_wJzu&fAP%u@_EuB5aCG19`xC>&hXI z6|9%mB7c@T1RqFB#HX+Pq+n$g5w6{+9moUISw#kYzs3{X5ywT{fr%>ygjw zl=tJKbz;Nuw4!@eb3B#VGOf7s`QP-+k?hQk75wF8Bcja}PB)Y{F|lEj^K@inTVP9z zn&k>Ye39`RZCib=B_ssCAmz?>$UZP+d^b14r7HZJ-KS6bJE)KT?*zz^bE%M)o7Q_U z8~lv^Z>B~5H}%9nD(Zh7`TLp*T4etV2+UXyjKfT$(e%j>{#Oh5e+R-uU+W#JRj0X~ z`Dz~dBYM1g{WWx-7|EjZ>|eLKz<&yaF)o(3+~@vj4mWYnBRKl1H{e~qqa=96vpI!g zlL|TzpsA?q9Vusj<4)nR3Zf~W<3$-3%s7kfmv3x(!4IIPr<+Cim^#j*o^XR;fwiS2 z6m0A~=L$gFTwPxJpQFBdWdk4_JK@04&@Oh+CnOk81=I$+(_zX*13HbSda-8XdAxwR zUghjr#l_WCn#7@+Thv&HpJ)`h`BVwPni0T8+7&_Mowyrro#O$wL4R!IZN#^40Q7l{ zj!x{}UZow_?)dos5e}FcOsD+r-TN~addOa2#7Dv?hHQcGitUclc`0;l#!B9`fZD{` z-I&-|&T*d|DUgp7l6)R5Tw`~vl1upOvAgIqWVI?Yl!NCwxuDn0$C6{dd)~OGiiZp` znL*#Dw5;sa!3qG@Kzr_0vJ40s0+ALV2UD@S*%`Da|b90^Q*b zoS}WrXLsGpLLlECuxz@zy6t}ONJvdKYw&r7fV?;;(ivR=Il`PyDbCQEni^ZtoUz;i zUPO2;WrYH(US5E92o9f(w86cF;+4Rca|P{4iQ0!o&h1K+e8>HA7GI`2n+~e< z`u#v79kjc~I|!1DHQ$TxudH}c-S?QL-&Q=TA{}3co}UX}cY7Tkfi!ip8G*eV$sMP# zlm`kiYk!EeO3XyX6+H%gE*HCtL!Eb{fO-fR(_U95wV}V0l|_=U9|S%5%}}=NQw&dg zA&zHj-%(=O2unGi%}qs-k&GS2gcxu_?iy6fGq&rJozj}>1>C-{o+}?6pF~NknOS+) zY*Qrp?2gM}jv_^byX(Tcy{|e6##Ir`Xrs#~Tb;_`mhAWB zu`pvnoTGemuPiL#{Gn^`Ebb9IbKrM2zEcoS7l>xX2jfmZWBpXh3fUw3R(_9pCCzU` z66!c+@`~^VF9I=Wnn0NKtM{UdD`5ouCnqPw;<0ZL^Q2QBwtAJ8(p~+H2YklxHy-fh zbesml=?u*PjbFgWbw^A558B=`tjhOa^EN>c=|({5MnJj*N$Fa2cXyXchje#$r?k?Y z0@B^xu&BAv-+yNI%Q<5)sCXt8%EcE8VJln0fxoeWPg9302Nh7 zOAEj_ogsWi8Eg5pr+%-_OPiXw$*e&t#LP3V{(%8& z`$x}zr+Pps*PvR+20lFuh9vVqI=C#|PNqBjz&<47FT|vf)&fiJalB9f7pez(Hl;8i zucK=aPhvy4^?QZqi}7PT1}GSrjfOuYIQM4a7DgRAA@{cbt~8X=(+&RI1D+7Ns91TB zBM`iRiHV7eOX!ILWK|t({zotB3n9f+pxE@%&V9FDxxc&MtuhA%vpnUpu>JL6Zm#yA zk*XQx#KhDT&QAQX6zbtcgUgwT@tw%-gA4__5^8e-f~3GRi17PoT$*vTRqR# zJq-@|Cd^WzIdC!>VsRZ)t^O{ZuWO+e$|dH3>u@s9IZnOG)>6Hb|0-F%Vyfu3jk@_O zYlGm(V`AZmzF%zmyjF{!e|-x%Uh7*Ca09m!Q2hz{PuJU1Q;CVZ=tf<32XH^wD>TDZ za4~>Vg#^s1jalolX9a0k{AG-BR_*>MFJg|{3JZYT!H*jEx2X|B5sM1UbA@zqM?k@Cwf6tkdQQX*lohfT zbVV=;D7He8I{tt=LMIi+rvN*Q2jGpk1(Le-vN`Vgo1&bJWJ=@d&Z- z!H0ZJKY*vVP5wn~+{a#HnTgK8w=gS6$aPqFLE&pHy;Tm>6-|+mXb=LtAYX29;(FOv zmY+a0C`#qDf&ivCySlX-AQ8K26bt0xT;)C{c2~9zw!SIC z9H~4s7RC~jx@C^y(kfoQ`lc3^dfeMvD$(Ij$2%!i`>*=-JFcCi(FRw-rzWPWY>aDl zH&W7uKm*x$@NuPdjUI*4rvV?x^tUF?E#H5dh zek(JwN&j9_{}saNp3DC)QE2zG)ipScY z-*}UdVN}h{&W4qDTwAunnsHXJvOFfWa1#Iw)$2?%>V*l_77zFQS#^LBB%yolLAeo3 z46FJjkhK0K7G1Czq|!jbj+i=zT2Yej&592E*Nj=U?`1@D5z-9~=2dWraDRoUNwO*) zrJ40WJ_hJmu_{OyXYvZtjjm^wx&c93V)5u4RNK@u^yvdp+lSmLDM6m#(o&x9E z<$5@}(=?|bn|f)2A)D*mm!5WcZMy0Fb(PXglQ|N@-4vXePq7Byd8kM+C?y8OWTWGg z`RYj13VyjLX<1$=n$U4uS+z!ZC4eEdRNQFF!3eqZgDZU`=!hv+UhapT_q#2Sis5xb z?so~?%7kGhnjMl+4D=hF{_X{n$xFWKjpL%~-;F~#^i&;w5cn%|Z8A{Wh` z`*WV?A20B^=CdSfn_xrFw|ULlV$}Z(b~zvNC^UD2A6rFkx>kL?bqs+!GfDthv>*@;7ad9%+qmkh`qiD`wq+A~)Mz0$%C zH(y8JDI^=FBq>L5a?Q^xm_CS7!+TFW*n|P9n`ZeZ5WS(aNw4w^z*;|_!d}Y{3qwYL ziiz46eE$4sD@h3tl+-pZnbOM2O28z;3XBI#?+LR-q_u6d@d8>$WsP6F9oyC{R#Eir$b{WFGJA^4=7} zsRR1&O)nK{)M}AeC1~k`!Nh3ho4~^n7f12@plUtXp);L2+a1oKa2RnK7OOGK!VU7ZU zP_IpGZ4|Ul1U}*MXY+s-`HddOfeB>FSOT=z&+NPE(~zvr!?^<#(KBWawjQA`J3vefqOc+f zIBtPI=Yi{o5HO}sIhyt)AR^g`u;76Efee^Dv9LfGJr8Jr#4pp&tKF__g1u~S@i`r` zIBNkomgv$Rh#-NC5m3!P1`8Oot{I8ED4>_+j|po)!I$CK0cul5_U%A0Oc6Mu9d8J! zR*S*?bqfgDlU2rYzs9Uk9#?DL#B79Sy$ucM%}O%SGlCbV;I=D>_Z???FMqEaB}>R5 zpD1|7Ejn%a6~ z1Q`)n2i9ag>$6x!?(!xK2J=~X?!E%mJGa^IG9Y0Eb_Vzn{0929s_#`JITCnLJJ#YE zTQ(bm-)^aE-BcPd-o3s1o|RG{d<|!|#)cVx#UvmNbFTx0VAnJa<)^7)S8P|Ko z#5;S(37aKmU2^=tx5%SkRZ{J{@#MJ$MEe9NjmkXp4%nM)pAyy?l(8OBrP)uze!nX` z(o+B1T`tLkf<;X>xU8k6j1hzIjVgpZpV*Ye4=5AU+eYSj-iaIu%alrfV?Z-Nr;4iu zd7f*%QGWvSfFmI>!#2P1cw74S*}B7;pPu<~%WiQd;I48hwp=Kj-6~Zald2)6I`5vn z!^Xcf(lL{+i91QaXI)-KJKm_k0<`9p!*+TSj&t+gX^%rXsQ(2>TC*3(2bVLNP8~N} z1wCN`$g}5E%z)oVCt>?l7=?oQd?WjsIPxB{pmatQ4^csn*Ms)|d{=qZJWD#NQ7DuE zsDN=uaFUK(U0n;CBOQR5hw`9RaB&J;a-c{Ls}4k`{7Qsv5=zAE?^6(2=pot%KW3j1}+vMZ8|Z7Kk3WD@w&Ei&iVkHr*d#mt15zTOPO`i5#3O{GxPl1yOj z4kFOlGNgIIxcwc=%|9tj((|ezZ3+Y@zyW2%u%)j)J?ti5NPt8LM;)+(-hIeq(9dSK zISjl?S*~&8i$gyrCmn&s0$~1y#Fpuo0jfV?gJwKX!E#q>hdTUFG2mIEg~-Gmy*d-R z>w??kB({5jBfRQaetn!A=1>VLiEht8)DgiKL*RT4O5BCu%i$C+TvbVwkSFq(?a!K3o9=hI7bZ8++&Z1B@K!67#<(y#g>CzMg*TYcWyEtyw8uUmo zxQv>>AHikedzcP$K#bsAkzZiUH(J~RhRq)? ze&x%RPfGtz1q9j<(!B%tiNE&_B@Yk5bJg7=&QC_!@-6tETnMXA<+*BJDh8FsG9N&Y zkV3)8I$booVFIOW3>VF{0HE%V2R{X!du}DXEee_cvctA)?5|`miQ;0*{sN6y+ayb* z)f$e7Oj3M4*NHZ!$~o^8ar%v9ljwrTh_X345)$uAl#jLkg5;6c*Ay*TJ#89#-$z#N z0zv{PWg4yS=hZmNDO{fw_tq|BEjt9t*5^zJg4yW;f zwn?h)3Gg@Y5qx0zp#9459*m@bfIa;ECfIJfvIj6NNgsm@R6F>QY%-Gko{x>o;RTz5Hp5}nl^2ocQB4#kicS&3sm4)-^{ztbsW>&WkYhb z!H5vkv~aB^6F%@Zh1F6c-ED33x>@&i1Dx2;lAo``-j;hkjNI5^nM_ejbJ`jat ze~B`xk38tNnI`&TL))k{hugM&kNcPTz{RTrw>l_DyCcN>e70DtHludpwHYHqS1Q z7W(*2es4f^lq`+Nq%@0Vb89SD2{y|*KRAD_LVBvr2*fkk*a;5{E{dPgYVuz>ECB1B zaml#uE0iRVEAu`$(_Jo)pBZB&Za-*XbQ(-(xtE#?pEJFGAJxKe*`#HuW3&6_8Pip< z3}e(+S{fRw#sH*<37KLCF1IoeLXr`H3|Zp=HRtEr+i}-p{k$FM<)s#$oW|YoBgMzV zj0s5C`351Q??d9Fq;LyI?&!I*J&`Caj5UsemT!loz6xrPr@L6fZvW7DOjP^vn5nHm zqZ!i3#=#&e!_6W;1Lhp}Rm;2fLIGqJTSe=-WsoS{ET~=N*xO8`}qG#k3 z6#|HNpj(;WTIXjM@dKL%RZ#YT{NzC3+88_cbNmiMEgf|E)Q?GWHE;`(PLYh;5&(aZi8L%9Gxu5KAjAdeVoYo(=zg&Apu zgR~l8qpBPi1UPB>R{Owt2n%!= z$fF8rEanpB)Nj{To90AG2jO!_Ufr>AuZ!VeDyp?Mk7_ zhGqHVKMPWuGaV-Hz{bJr|7T_WX}Lz1Kl6s5UeRA;8Wf5H4-MXjrC83$&3wn?k$Z2? zd&B|JD@SK%eEIR|nJAHtz+F*mJH?f*T_Z)9!e)!>bK*DR0OfHr1?D2VKfDcJ4rzJE zfL`JdI4*~QLA?+20?Bp6+(%~%!xqk#Q}F)#GwVrBHbc~!^}oh~P182)8}_1xH!PYc z9cmrEL4jOb*Pp~Ks0!8;5a2^G)nkJE_=totwbSScV1p-UbVK6Ivp=M2gpzzE0YbL=*--u}{UlBsl(LAQLEwkqnNfwkg54PoPuWK#*kp%o;1 z`8THS^h^ukPCUiezdvUA_d)BZKtCJJI)PZoPyd9xr>VF}YP-p0!Z)@bP`p6ol?;TN zQ6!wpwHVWj#h>GO`uzrgyLfojSjotYHyS^6-iC zQuy9d;9@Aa2{hF%nF%6xCEasp`R~BOz7UhMUM<jkcqqcQ}_E{P8(0NQ9E_`<}E$ z94@5}31j5~^+;w#1}{{;H@iD~@mhAbffSgx^t8&}$p{QHZ*+8h9Kab-0YuMHi=VrJ zr!QGk14r4>aj*;4W$b31OE!g;>ct0F5fEMl`nx_}jtKqdMsg{`y@_X2f-|jLwRq~@ z;oiY;)H7w@hhe=QPBhGe@X2EY9Y%Du%bKCs$NKnEOP?xZ86Cei`UTS3`ez}E?r z2$G~g;*hGi?3_mwBUY=uVU21?7@!zV6j_(S6Kqenp0OD^92EXC#KVwmo?bwd^`A== z{cwp8WGCh#(OV$NXk&aGYTjxG-o{#~0NQ3M*fmmev= z8(WVQnjCipNwvFDhDjV^jtRwmncVvoEo+bDT`87O0PocB3>MtJLdwzAObg+Qs9LmnszBxH-e z@FlBhi?(A?B4c?W(9n^=uX%jFd2(A9-40f0)7a`|jq9AJ7??F-Gzp2{(pTY;lK^VvXH5c%Ir#IRBqnDZf z3%mybKo5X_bPwfM|HPO68!y}c(4PDs8WZ2IJRxFN#+Q4pE}t(Q+!S_hXj$I;X>!~f z0M-7_UHEUUasQv23;y}%%>TOpo*abp?P{>B`<3{w>SIK)TY5OxaZajA`SM)XK~;vs z&j`YgZVhqcy83XcM2U!i3|73pqUqe5m!~&mw3uA5E+v%4HA<EKVu=m;YZP`gd$hI+e4h>|iS~{TxXkep3IMmcg|MK-&qGfv6!Jd@e9F93`BPI!zG%4?NVhKRd1b7sobZX8jp-b8`lWhsl)lPZLGb>$ zYZSDZFHh?39+vaq0+zR^%TIhaWv((=sM3C3VCZ`Io{&1a&#g*&Gsf z5sZ=cusjTaUDgg;PV{cUyQ&Nz&FzRw&d^2)@8bh=q-f_a$niQ@`TrariaYni0p9P4 z?7w41y{ZVDG8d4+I-1Li)?{-;@!Z4QqoZu5g0tZaR7h?q3}pR#QeeS%{8|T>*NuvO z9g4FqMW=2hKJYmyV4T-VPn`Zyfhe0lvN6z!BX1@O`t!*C zU*fy|%MZriTF3JDeEV-+|D|00%fIMS~ZJCz2HHc6I_}_m@*KTRX-7xo^3Z zUgaP#9eii=&=j|%97K>2aBoq}XhQ`v;(yP5GeHrIr|1zJ=q_ZmO+oZ3Ff2KBKzcIso)R`@`u`My`PZ)f#J=g6 zb)te6qgfxdc1U^)QSK9^{8<;DP)ANI_17uUX%k#BA$QXZ=#dbtZtRhhn5Lf4K(2c& z@FDKSGWOo4v)sC*mI~|vEJ&|tK5B(EI!5YF^F)-D;>BVtgG!aPk z_l6#s^cn)&_xG2Df%*7Urb8~Agj9P(M@Lr>#`l=L!|TWD-HDWcsu;PUR-UGk3~R_e z2SKx-9a0dg7i)lqLi<#DU~y0Y7B|G5wh)9)fforVGeOSy#E?`h)>JABSC7|4PQEo- z=c{~(kXGox%a~WE7+%PfnJWTXad9pmjxwp9_ix8i6S!1|s2H~Pt}}cspGMgTxw%K0la$=)*x|^@sJ44H2!l!m zoRMUvlwyl_C8P0Gcxe1q_-egNz6!1sJffxu`w{OEcO5sdFR#hH`$bX0JUhh~jr$2T#u9SYS zn;!n)7H2nkr7MEB7A~liV8VPyu8#A!i4ORu18}!0O-8$$1bu@>+~M`}Kul8;y_>9A zg|J5EZ^N7loBIF0RsY|sp}-%;Nu&6X9QN zCU0YXz5E5e?&O{pvY!ONJiqG}wwVt4Ut_;uzsi==`fA4UNQgJUJsi)&;dYTJ$dz9N_NJ&zsT4BU6YaA!9nBbn$Pl2d==rUH+N@t=(Yj2je4H-H8y|*Dw^=w^rK}Aq&}1Gjip%dc z(an~0&KsKbWipvAaa2K6XKk9IE{%Kww()rg7Pzk(E`FW1?>0WQINW)&cCYen&cNm3ctah5Wp0w&HC4ssSJh9{6-RYOjH*O*=I0&{J9FuFXm;2I zp=;Pe-00yP|Jv3&4{_#EoTJW{4_MeDUR#h^$osPM>q}wIsVYyy7W>Rr!}x}H!9?ax zo@Q+UgQ_^8d9ebm;&^S~-`#=-yJaO_Fo@)NU2bkXUX+*rV`rt*CRgsxt@ zgl=pmo!+^iC|~}oQ%+3jNx_hsx#F2Uf&EFi%h~iPfte}w-Yp1d<<S{l|wQ44&Zooj1=PX}(d#d)Q+wF8P1&;rhTsnLPa2WBx`G1{2BsS1@-B@qG;mEZ8$|K7>xJ9DxoOW%a(k zmRs1+!uyC|dQ<1kTM?X|Xw&`arD)H)yT=TgR?Ag&%sbVPdwK*s?mF92?YD0UIeGVI zZS(A+VWd)cz{7PZ*uJ+TsoFo?cRvU=-RO1C#aKexHwh^nBNAUB6oZVL&+@rZ@3&4$g(lp6UTi~mbiHCi_5v`$#Up*|jvdsz1*714y-dI}9y=;Yi=ya1)w!;S` zoHHum6(~V3Mx&W`Y7uwmdRklg-PJJqqPrtGuXnHdR z*Nm65dbapQ5ynvXIXe$d5=X6N$~!(cA8ZPlq7P%f3k67kbZL(vOs8p&gn%Gl{(h~N zH-WVzk)&}kG3jSKf-Lz99XezXZoiQ<j9YrS}drdZQUorb?@CS z+;er-cDiS|uS3yGrCFz6#eAHum*bssoXP@={k?U=)A~B#hQKgorj|Z7WoO%G<;oiA zx)5w$W;PhQuT(n|3W_b>8nMj!#eP3uqpB+4P_wY8`AMOG{@!Dk=kh%HTBcN`27=h_ zJ77`apd9o%UN|&WsL8*@^T+DK-DQooYw`WKDeIZCZs*W&h(a7#H(*l>zbfxq3~!N~ zsWOjcS^T`Ta;iKtd)|W*<0YLdbL}IhX!^~DUp;7&&2g#X+fd+}n?KaJ|r#pr1B57o?r zJviyt%1TNaRZ&%)^IY5_L_SnV?~QHYoPMKbUvnMiT89|RSt>Et%8&5tk`ILR+*aMfgi^|7bkCbppIfMV zEdQ!gFl9B}W7?n#|IA@xCB;sYErxC}UY?qi=ETB6uhCo~6=n2mcwU!$C|@PtER?Qz zgH|n{cC=~X#a5;6O2i%>rWk+Zw*Z%M$ONRBUZY5(MSpyGA!abuZEU5a=>4`J%fWBr zTk=qRo9#t1@~$fNYlKO|SDSM(h?8+k?(+SJis%NCxZ^eYnWcr0u*U;kTrM|NY9F_z z>Z;wGT^x*=Jhl%ac(b|1))A6tm=BnYg0t+TN`-Yh2e8?{D+aEL>O%_GU#*MdMKTI9 zn&%xFGV%L`r1ZygizN&nPuID$hiOnxnoY0QXeMGzIchAQ(xVyL zAIxt5N|#{D4aVg(jv;X{hv;pnD>jPUc?nDAV>@9(@5A@{o>7Am(hkFLNgQ82sk0p7 zpE)uXYck6cL_kd=d}}^sU$^GVq}`C*PzY08x!cldvkB9uQAmT-P{^jOuOChM5el0! zPcD@#75C<6{@6zLQS(L{!WKU1$8x@&`1xh^Bj#Mqb^E~)A#zwnQ)9if)7Z}@KRxILpjqL|yWzI&Ia7|RmRm=oIu3>PNkk|{y; zo&yDIu{S&;q+XHYApHT#e4#p`fhiOIy5yqFYRcs5*a)`9uBUaJIvOxH9GKNwNe z8L@XUPRi-x)^*8F?nkq;hBTNue|q$TImpM4cCTo`?dHQ4Q&z+M;?kJm5Z=VK z%bu_K@xtaY!$%l$!iCs~w=<6TM)OzuO`8_g+}17^DIaB}#*TCEvhuv2QB(I7V2Jr` z(Npf9PQ3)}{toTI?VJ5%S0ufu)2#)r@!g1d<(b9yb7gVY)0XqbI@`@4CuiOmhbA-X zN{wbGjJ?1Ja>wD^Y>`WjQ#uQr-m1}Ie+rw8-e&#ll)SERyI)X0UvrL&Lg^ZTI$6O& z2wh>*so1Ax)W{0`fjs-l@^Z<8U8jrrr+d0O*8eh1ODIIgK_Y2J*sM-hYBXsPwPlrkbnIeF zZ=<(xbyK3*BU%IR`P?$FteQBrtvYZ15Ib{ser*-`oQP@WQ{_Yw{1^4F6&f|(S)^k)9l!4OB{C%e`0*u`T6stN^kXz=0tVC#d&>bl_TiY~*lVe# zDM?fuP#Eg5w}I<;XMOEB!cs{oOy*Sx&Gvgw&cc1XPxmJ#++YnQu9Q=8&|fD}@O=fH zv3EmLoo`P{0~y_&#dEm=4;tmyWBZe}+QA%ehG!8oEO0Zzce+;?TX;J8>!qgx^#Nxn!X&*B6@KCOu%A;SGdo8uSS2E~ zRaS2&2WHMi#>J-bU+>E0ihEr3&diir&Nk9A5C^80EF6Z_$H+%l|F9Zck+h?ZO(v69^L5ltH!oKZZ8(-CncuR$4ZTkpLhp$rb>BQYzvbU2 zw8Aq9)XVXc;U;ux!Rh6OrhonV71$PupU=F#tv6F{NE57tnzEWlo@a@ol8bFyt$3Cq zM@FP|?KR*qu?aKC!(a(}-aon>k-Pu=i1K+M_IKM0iFc6|b@FVP`@8!d4MNd2#$$2w ze_AjoJ(vX&(%3#%ESVqX?M3XhFd4J)cR42xNfpIKXARi(LCn3_MhgbLOdmH;sv|cm0aK-^?l5B$h=C zvuz&+BJYI3d2e)+z!>R2XbcesV_!YEUtWeeHe(+(gXGVt0OMMMqn-6O2rYsxB#AAV zN!Wl=1A{8gaN%brw3KxGHfMTPkUD#wbPN^|zjUE!rE)_?|CgR<#AUM+rLl6nMrrlw zTA!j+s?dp0DOGfDBM{-X{;HF0kCY#CT^u^WDwRJVH9V(rw%tf#zL$aO{k_#r|d$2LsxyY2LRGs>T`S_T9j1%lrqb z$2kET<{r`HtmT9`bYdeDds<&x^Z%TC=ucz$@S`V$a9o0je)<>E8x#k%^ zuY0rFBX>qvCKV+@7a|fI)s~TrFLRJ+0(zU~(=}r8vU!G)kh#!QCnnQgOHUHf?cqF+ zVh#0~+3(JVTY>ga=>SyHFjH#KDJF3v;I)S|r;e1&O;LX9+H+l+X=)_2oN87iL&Rsd zUpx#z6%?1E6h2D6H=SG8cMWy)O8P=J9k6c9NU3K1UDi3v6crwGfR`lad_0jB1t)apY zhR(%LDMSv=oM`#6yp*l-(TwLOqTFL!o(HhoP+hV7QWo=Z^*dc|&v`Xn;a4IFBn26= z6EKnh$ldWARr}pSe$P2YSGdDp)@?#JjHIr2fh;T&%mq<|9BG9U#h{PE4gJ=y zTo!@O)%9(=#bAX6!$sIMrXL69bpLnF$)l-(n1SX(jk+X7qY7(EMBBdlm-_azx5_WbOh@Ldt2byG;?e2e1M^*F1Q=Qyiz znLG@(s9upkdW@LJLo2Gkk)O>|2qkhkY)Z9=Q_7U5WM})(Fs|n|Q*i(%UR_HsnJd+` zYJpSwy2Q3<=CiGgwfVbq%Y7n+HOpHL=1zozvHZP@WEVvB6%~!nR7MAolT6%PvS4r< z$S#!%y%}zfZT3IUx>#&Z_B2wFYKjHjZM9~bCcSK^&D%7s=Gi_h$;eJwQh21T1^t`V z1=myjcuHNU@0rP`AoyEax}Md<$(y%hHc_1+yOWLPr9g6R&=(=90=g0=BUR0AQY0Z9 zoY~2ox3K~^na)|wPT^mPJ>t)Qj8XUZWvuagJ=-dA_f=I@WzM^>2XcS;sD&$`GgDV? z7umC!b=lv8@x)^3Pn-+9dGH83oG0Q)f<&b z`Th~zG7yH|+oogIv`E6>Qp+%3@4O?qHoZVNS4pQlTDEZ2?A1x)P!@ZW!}GhK+LKYCNg`VWJ=B+Rie!wm+%iwEIZzrJ<-JF^|f!u z7XLv*h|14Y30B?I*XZY-UkwhJ=GM_731us)%Vj|U^tJvo4O2%6mHQN_q^z2s7&>o! ziX?xLqLL+|2j6e}S{!2~ZTLPRI>r9jr<+%C<2U!dk(H1L5>>4ndEU*@5EQ2nb{6O_>yGg8E&>5TB^sK`L4P%-A&s141)94|})gR1aCu)Va z7FJ8cn*Ef~r0uQzdyS`qva$Oogx|}h^W8+p_9nP}4eV)K^t)1I+UDnf&J?O9j&0DP zQ>m+dY9FVHEr!$uyJ+&h&o?y1lRB<3J;IGJ;1G0lWaUv+W=xB*2h%ct=K>6ku5KN@ zJa9{S>cL=bq4{F5i)BFPck0F$&@r7y0>PDeaSP~sdxhJWPIyjxMG84l+ea^%t^Klf zN5iI_Kkn}R5=E+B_SP?M{KN^Q(@hX<7Nawv45U z7VHScYCLP~fR5$ptIK*L6rgZBEP~MAI9-;8(2>c8Al%Z(b3K34HD+;lf z(OltAKC|&LgIRNIc%X%sPKCUxDJO&*BVB%@8+d{Qx1uFe5T}#W-WfgQ{F&BIPUF3d_#4o8Kr zi4u2o61Qiv1gp0?LeDkM8Z3EO7Zi;@q1(lHisCPmi=k>JIt;{5Hx6-2rIHWbv?Ac4 zX3TP@s5M=&-Qem^1lV5CX`F-{3dsTXc$**6_2s3AL1aKz=mO3X@Q6Hq{21DWfWv5a zFs~l!1|kk*UAX`n0>BI8qi$|)^sKgu+}+N$qut(XQuTN9ucvT2N){9WMLNiFh`%zT z*J%9ie3El_1Q`2{2lMU#!5wTof49%~q7H|uwXR|}np*LfVcps?@ClDH_2;7i!+Q+l zT_m}b4rf{zZIrvrNPyY6jM8_zGe-$dC&7zoaP*Jvco|%no!Tl_Q08CKE~|Fp?fu$y z9`3W33h5QzsyW&^N-;JmjDtgjH)hpZ*}ER%ZgOwQPtsMYtx&nXqDJC;HMe_B^hU7a znXGsUN0G~&nsHWBUm0z_ED4vxdI^ak9-f%k%OKv|U$)ktba--db2otRfV5JSKeB8R z_^E;S(s&Q}{zSsw{2VV-%!a5n)EEq+6J8gdBSgOt2>kD-?HIiV_0o(pK z1_(qu)nR|Sy6~46fK{Xt3Bo%%UL-J^I_%HZ>G#D1ppnOrOk@ZKJ$?$~jibzx0}QXI zec7RU>^SMbumk-JY%xl;7V6T{(f}iXMW<$DYRU-^1t982G$Iy1{7B!m)vOKBD*zXO z=8Gm~c~#ZTTC66xfQB4$cq}x^67TTGAP+ zg?whI<@17>mUt{v%E4Hwadn2rI8CXpVz^lzfNmy z^MOv?UTQmxO?~>;!;^H$h{FxDaC{MHHj!qxkXlAk2JP4umO=9*o@6gKwaT+)q%-w~_pIZo ziFTSzPJ2^t)qCSYfN#L40xpvNv;5^=HA~9_kl-XXnqPEeJ7e=L={YMaD>->C@ME|E zH&3x@Z48<zK%%N+z-tgPbhXIbhBx$Ut8z$lN?w*-@=j z$u5ZQ-DS5DuxxbM>s;Nk1v6#YM4mURQ=P9`xb0TGTUuJO)|$CJ8~67|sxQJ?pR2iR zH2NFrGC^}aY&Ov!3QslzNa1jNLez|Znn)t}iL95Q&vs_-k!90Jn;D0SpgKP3(?0JY z-H0S*+1I?LF0^CQ#j$Q~PhG0$a?X0f*?n|PuB&J0j0wlG#D6vEGf-2%yi#oZJf?pU zSF*oT+7g36g9dWa!d-MPU40*dMnJXnLy}ImET13%wS&mKCx8$FqM2M2aMbbd_(k^h_%G+hFZ*6R_S}lH1 z7U1!?m~#YP*@*e-I$(#3;4lG5iMGjd-m4f>5Z6Y*Cr?Hq=;!S%Qm&W-0w^?q8;ka- zsk@#qaNyxYJ|?}d1<^9o2(PCKGQ+6!;d_28&6F-2Zcb&JrxNfQh#c76wXRw7BH><~ zEYi-LcNabN3so$Zceq?k0sd43T+r|uHu7A0h^ zGHRS79#5otK4wuz21*CCO2CNH!jvccdxf<+6r5|d%r_qc`5 z7Qu%+3OypAO!EMe#j_UhaEjE8&&)g^1h&0i5pV(gNGGFH1c@k#`CvSgaH>8iPCArt z-nc$>1b z7V~4YMpAYRzt3x*#vOeVEvHh?;7t2iPpaCZixd>L1}Dpq8<^TYXWJ~q6RM&-(XW9D z-Ei>mDu53Fs?Uk{HgI79Y|O>M!u=A1(x?1nPRA5BYaI~Xwx$a`-O{ayGV`>uvhuFf zJGlcTO0;#_wiuX#Z-DjKWTGg4StZHR869|UL1V0Zo0*uHh(P3uJM%bOsrX*wv@ez( zpsG~Lbp+2)z)UrR*n05uI7pYJ9-92k1SbTtN<$qA8$D#Bjg$Mja$6 zzQmv+p`4qXROCP)fSQkFb+a1Jk__!_@k45YeT7Gj#_32H>=J%cQYRb|Kbxbw05Z#X z-On4%@-zN4QcrN2aFYhfrjRIm@As=eTE-tVF}0@9%E^nEqTMD2X2i75@0Z5E@_60Y zlYOd(0qtum^th(;%KTUaLkTJR4IFXQ@_AvPZ3UgnPQ7sBv7Bnl1r5xeaN;iTfa(1N z7^Hk8GVKbHa3avaA09I{SzUv~7*Ky=s#pLIj3S0gsVuFf1+ZfkRyu+lL8#M-@+c#y zjBh{sMgeRDd`(XTX(ab6TV1Op{}bBKuTcrHG|EJr3c!H}Fe8BKqq2PKil78=ULbI; zM>J{+03xC&Wcb}bw?0>2)4V*ts_ZmH<8Ela_1&E{g9@${DKp-kZS3|<&OUwm@#a*Hsj6Jw`h4M5BUBR#`-~%7 zv}nF>uE7!1BhWNr@_O80(-HlA0Bu#I$)mJDx2Z9(Vtl8|w7sg&5_c$N_ljh*fq_t! z=thEg?qp*qJ2xmuOz+^s`RQrYagp6+XvKtQ?V3#3b2I>o0{f4IBR!Z#vO%GNf$1}o zGW2>^7wQvGXUJ2EaM$t{+^m;G-JVFM_e&;-d)uvQ2dg@Pnf&0VrGkzDKh`^})+1cKa1M6{+e0aavbdRnL*)HuwgfrpK6xnJM+x*d_JG|=Xsvj+k0{E zE~UW!m;IGvoxUfe$CjTAt3B->EKCTpd13G_jc)xe;S)6YW5{fY|5?*?4PI~FP z!KIzeHGE}tx0vP9($jn+d6%fq56agPAI@WJh0mDI&UrQQ8$$JsW?Q73ZRO%`(zmU& zBi@J`I%>i(3jW4UUp{)eD$OC!^R6beo15stjR)kV9H<5O&&Dm^MeTn-f%Sh% z$bY9F;I~Nk{Z}vGe?3$7&%I%LM<<7hF)fWt(B-AzP|U?wJDIoh5kA;Bl`bvTIZkpaR2=HU8D$Oy@S73b3tOY=#N8i zx^1io{9q@uI|4R!D9FAaVtTm#VAO9N9UTNHqtd<4;Kay|HrOiL%9X(&6XsNT#E=S2 z?kJ_8(L@{~Y*yyD;;J%KJFpb=`lQ=OyQ&ZX#a?uQw*wa0#K;IAi|owY`2zz3Ha^Z3 zr@p`@i+Wi}4Pi7rJ)KwuLh>IUsSDq~f4{`LWv|vz5Xp+1%M{e`xL{y5#wCs%If5<# zytD%R{a5M*`GBagXDTRTi11WN|&8c#zOV zMZZHwVc)7%nTJT<=Rz(5Lcw|!q3G6LCQ%irn>TFm=zp2xcmcW_e}4YZyyw28BmaTX z%-9Ru?8n9J)rSizDk@;7R-SMIVoAQt(Odu2tXSXZk=LcSJzprzbi?g#aBz??qAh>i+NujN3BH)PxOg%2De4gfdhbxN z;uuO;30#a}g;#Ew%P(-`!3DPwsEXBca$^&6y37G&3*>gRM;hB?H+kIn{=kcR_>5>Y zc(oMz8a{1kXwVmSD`W0dD178HYKZDJe(Wm{6Q}pNyLyq?9cW=3KYsjAHK`;$)c1p0 zFTq7YJTG`k@c)uGd*8(qjb^8RL~jG=KUEAo26mjO`TbFAH!Lfv<=(z6GTUAS$j*ok zemzE)B{Eo4cH@TpXbF`jY2P>kIj`;4fl_aonxiSzA(_l0ngD=b3_E5+wfVfcH;&9P zwWsC#FFkd`{(%BbxtPUFH3&Z3aeQjbGe>AWdJ4!Y@N7nxKqnP+*%Meg`3`sb)zBhv zE%t~nFAu?_OSyKf=F)2K4mZ(C8D$#}82%Oyp}7Dk1fYdKPYx_19`W#NM(BY_oTlJ zjh3b;*d8pu#p4CSpHo#$jbZ#fye(ONQ1YDYX0HUOF}Tz|Ni}lgSD}8KeSa$z(9o8f zCJPEoU~irIsvTk#JOZlZam+cCbOjD~vNBp1F35+thLqS9vtr$g`J&RMNgKOhg^Z-$ z)7?D^Wen+ts_7O0h*TDd=-D1?fb*dv!kO0 z0Mw8hf(BmQ#y5)Bb8PdPlQa)0xRhiv(4w(O*~&xcp(xGbd&e(HF$_70zyL2~jg|Ld z&dUmy`TiXLM+)E;J#IvMK;5n4nvzZU>I}PquC918Z5ePYGBj?!4U4f|r0K7fy=C0+ zud~gkHEdM>Gnc-l?f(0*=6~lX{jVR+{`;pG(H1renIasdF`$b?MH^-PUYEw>%L6h? zMi!A6X3~*ULTe3;>(MpafJz=j4`uahMq#cJ-2i|}rv-FXokyE1$DXATA=ibMl!-6l zVtI+?B+yAjRXcqbZk(evm=wQ9FSmI73b+a^w+Yy)k5?F;3b&6BsZZ2M1p+flOv@2- zUP{S4dr1lw;%|?(!vs0IX1%& z%F7jHKSDW#&5Z9yw9nxGJleOXdC+)hOIGmsK_9we_`d2$xy6zD6KI#NlK~yd3boZ6u#(_K_dNdn_slFrCLrifcpy~EPE%t zsA<9RnJM1DeIMWO0HP)y>M-ziRQIawik&!X4A*YCek`cG#qB~X-@z{ux+pT}2Zt7f zM#c}ava-7Jnk!r1ym8^MM7~5wgECC4%ZI@y)(g`@^DNVA;Ey~0H4WaTHu?6NSK>GT zfKqd_5CU@TZy!XSt?s0#-SkEe2@gr^|AZzd8cS|6C!GQbtVeUcE^;$984>&CR+{$Z zWt7c};VKKX8Qg_Gjg7?|{ULyLmM$AK)S=ccPosLVa&P!#bP&$;+)~ll7h02uTN&?= zbHTS$eZO`3o51zj)Q-%P&L6;0E6i3I0LfNB(tN}tFYa=hH)#knPjcsR; z#|59h43>0`HRvJttT~7L;Q%C{Zw_>kK>OIo*A8|GI({AJ7A%hFOhU{ND71|MB!YrH zV~^knKa?tw@ZRX#q>1s{({twKA`;vS^qv_xf7fB~Cf`3F(9fC5K)A+>h`Ztw`oL=&rxN6RADg|Ad`uL@^* z`S|*x!cbc(6@mmKA8DG#3vYys{5C!Ml$Az)NqvWR(@_!P)JE9;Qq6PEqLk^{z3`4G zMaE1%(Uf9RS8Vt2<=uVfvs80ldu1B8&Iim;Bv5Nz@=SwHr%(G`wdrrPY|eL3taGy~_Ukl^bmjV*M2N>vK%n0BYU1Q07ZQep}=($T&p%!iA zRy})BT&$eosZwcuhB9iLb7?eghVD|Wd=r6yOjVBbJ@x8ifhh{m>e4aw_0 z^%1nSF3Q!Q26NiQG5Hyu&brc#+xY`b8I!%Sa$eMNWW2Z!(#o5*@uPYkg2Agey?OpR zPiKj7w07v#7)3>~ODi;u+W-k61@Rqw=yic}s3VxtteRTwZR$a$N7*sT!6j&GgR6^F zZ+hOa+vV2-+h?+-kgsVeosS>)wz!3{1uMBcCWkSPZbw(7O(w=;;!={8qXpObmpl>= z6JO$6g9j(%?YL>-m$4^Mhxu4W-p5vTuv*1iaE@WznD8hWb%*H%RD(a&v345!Om-Ez zRel^CEa<$`hVP!wR-s8X8}cWmhDl6}o0alCEiTE{cUxVPx#R^9AM^gx(_f$ZY^@V9Dk235BuOBUwTE}puj<7t*@n%`)KD3G zwU&MKt!QLR-9#mwn3;mTUyy3wg(XQ$^`=_?$jOeO7SMXB>$m(|BBULcD0)1OC_ zgp-Y)I|88=X@JV=r7QviWxlzZs}~VN?B(nb1XA$f;S}CHNP;u+DK45pI{e? z++-R?5jVTYN1RBKth(HP5X_bFvPK7O^Hdet{N8PK*R1;3a@kK=CyUl(*4HU?hI~%p zoOz6h!!zH&rncJTth>20SwoCoOM>b=^eU6SEZkszq^2RNgtN z%z6PGUuf*NWfrw{kJZHv^>;Mon*OlmdSDLTus13fcAG+25S76upHB{t=ON!qV$kZc5wgyKP@Dj3;MiemjNe zKm3WxyqeJq{dUE#GDuEhjXri!f@a2_qr7gsgO^#I^v(uBE|~8nB_)aa8p-Q-o2LyS z?0!Rr5}BR1K;q?;G}5fLC&ZN1GDNzsPg3+4)5DfWX)!UlQnrP-BVc5iwu6<5ewT7P z4*ALJ9q+DL^j?GJ`Fp_d+usmVZ6sF*m4~XIal>_^U(!PoN3I(LlTx2v)BTZK#yrlD zr6-~~Uj10uJZa-Pbj6v4)qd>Q*jVT8XNG)AY4GR5Wp~Jni6Cw?H$GOC5uhspdD-OD zvrxbg`z~sS1jj7689OMrD`ck3L3uQT)i_QBhhG$=CNfmt_xG>r@{S^n^{;CNDigY* zFJN|h)WRXL$CeUHh&HQK8xO`#RL?}ac2cq`E?YInTw@)E$Tp(UFP*((X1L45w=hGs zm1*$kV|$5(v13wyw&)%K%W?dgQZ%xxlb!@u&?l?W>tDy=^0+f2mPV@@w_wEq0N&Qx z>QZ`iyS5)-pjH-~sw_z13l}bk?m1#rz?NyswmgJ=Dg@;CeFa9Jz4zw+#u>W-ERK`P=}W_VT9{|+muA`A9AAEn z%Hezv<7#MKx~3{~vQD16DDIHL^0{L{W%=?{*Yh2@YU2Sjs-XQkr4`vF7~*n3XuLvH ze6MO!=P~*Ha`lzC`a$GPb4`2Wbeqxo=*!rAO`MzZE&4ZXUtB&-%AqPW|LR^%x@5)? zGiv_OQUucUt;%Kg++w;*!75ctVvEgch`q(j(-YWK)0OYArj<9HGBYp0-T*PQ8!3nS zjq36Ye1ku}){S(B5@%KMGV+T(Uw8%6uQy`$R>uWJ=AYdA!tE{T1-5P3%s;V#P4XmC zz36phZBDil*-m#Ko?-yVSTmS+fA;i{sJ2cy_3Tw#bHS$swdbzUY7F-90oueV6)6WV2SteYsqsjoryD z`sc%`6f;C0hu{;o(D=m(nFcJcZ(8mm*^-})~8R&r9^8fx?-7mBp^axwa*QMTEFLAE30{io5D!vO>nm^GEU={nDo>ln4Sv? zcTR}w5({8Qjqz8_S4pKogI9ZsH+eShc)pt-fenMW-2Bjzf|v6$$8I&5Hc+)5pv;8Mfd8&D|Hm!ifBpwX!tkzV lXH_-3Y50dQkwfMQ#e^)8jXh*+jaP)IJNND=G(K?lKLC=lP1FDY literal 0 HcmV?d00001 diff --git a/node_modules/@cucumber/html-formatter/test/__screenshots__/minimal.png b/node_modules/@cucumber/html-formatter/test/__screenshots__/minimal.png new file mode 100644 index 0000000000000000000000000000000000000000..dc7217f4ac17a305d19ab077bf27d9f9a659f6d2 GIT binary patch literal 31571 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Ⓢ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 aZx5eJLt>Irq84qdDJ!bq%D!>`+5ZCL)|C$c literal 0 HcmV?d00001 diff --git a/node_modules/@cucumber/html-formatter/test/__screenshots__/multiple-features-reversed.png b/node_modules/@cucumber/html-formatter/test/__screenshots__/multiple-features-reversed.png new file mode 100644 index 0000000000000000000000000000000000000000..2b0b73092d9d24ab661d0822e05977105624e116 GIT binary patch literal 48421 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 literal 0 HcmV?d00001 diff --git a/node_modules/@cucumber/html-formatter/test/__screenshots__/multiple-features.png b/node_modules/@cucumber/html-formatter/test/__screenshots__/multiple-features.png new file mode 100644 index 0000000000000000000000000000000000000000..67d0ab29b1367b24ffc748765935baaa7f023ab0 GIT binary patch literal 44123 zcmeFZ^;?u(+dqn8BBg>f+=_^lbV=O;f`T+dH_|b545fgAq$nZXH8Aur)BuWrbb~N7 z(hNN`%wG7s@3H@aeLVa49$$VCR0ghD*IMWKsq^}zsw_`JL`y_KKtS^Pm8?1e!S$;I z1XufSfjT|n40+Vv(v+$CYPVz-FbN9?`sWi z@ls#@!>n}Z_sh=&RMNyZEkwSji!IuD0;u;T1lHGxNzXmD*pD|9e)0~KU3y#YevfSM=;oROy!349_P3* zW9<@y0Z*-5g*cbxUTi>$RbN_9BEQvgZz>t1_^;0oWrA*yn6*bafK#?x!h1BXIMX<` zL|WH)G#Ac#(9$P?E)1}1AUkLjlIQhu`XX2RD4*|LK;PbSAH&C*+FA*}lVO5w$;le$ zh35B!6L`}3quci${{p|D#%Ye2K$$_@%W0)Qa|s(x#l7Z{@XV0UqVo^W#L>``8C_baFp&Zf(sU7 zT^m$}-B`)y=B9aD1TR4YEBn7BOp<4dT?yY|THW7xPY<`4L|xtz{yV$Wn_ASQmMzzl zEL=KmH$6Q~J5L@2ooRHioEZTaYPxQQ@sx(MfPjCS_nNzt&0V?pb~@Htfmh{lyFFq*3ZzpR9t#FP=OHV zXNGler>*-lUhMwqh-MJ;SRX}HTJ_Q5g>43NypOg`!TOO99FY;35+C>+&lhPlUE?Lh zRMqf2Hw>0dVUHktH- zM-aGhf?MyEfA#sF7axgfG&6T`I4<>^P>=B*$-+BS�ZQz@|p-7P>5g3vd$#3(TSr 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 literal 0 HcmV?d00001 diff --git a/node_modules/@cucumber/html-formatter/test/__screenshots__/pending-exception.png b/node_modules/@cucumber/html-formatter/test/__screenshots__/pending-exception.png new file mode 100644 index 0000000000000000000000000000000000000000..2960c4dfdad537638ecf7d914e4cc7a2ee3ad370 GIT binary patch literal 59792 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 G{l5TKndiL# literal 0 HcmV?d00001 diff --git a/node_modules/@cucumber/html-formatter/test/__screenshots__/pending.png b/node_modules/@cucumber/html-formatter/test/__screenshots__/pending.png new file mode 100644 index 0000000000000000000000000000000000000000..6dd43412889936526e2fd2fc7aca29206dc1caaf GIT binary patch literal 99974 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 W+0jNKTsGtZ+NJzKDBsp{=AV^3I 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